agent-device 0.17.6 → 0.17.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/android-multitouch-helper/dist/{agent-device-android-multitouch-helper-0.17.6.apk → agent-device-android-multitouch-helper-0.17.7.apk} +0 -0
- package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.17.7.apk.sha256 +1 -0
- package/android-multitouch-helper/dist/{agent-device-android-multitouch-helper-0.17.6.manifest.json → agent-device-android-multitouch-helper-0.17.7.manifest.json} +4 -4
- package/android-snapshot-helper/dist/{agent-device-android-snapshot-helper-0.17.6.apk → agent-device-android-snapshot-helper-0.17.7.apk} +0 -0
- package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.17.7.apk.sha256 +1 -0
- package/android-snapshot-helper/dist/{agent-device-android-snapshot-helper-0.17.6.manifest.json → agent-device-android-snapshot-helper-0.17.7.manifest.json} +6 -6
- package/dist/src/2133.js +1 -1
- package/dist/src/2948.js +1 -1
- package/dist/src/368.js +1 -0
- package/dist/src/4291.js +1 -2
- package/dist/src/4428.js +3 -3
- package/dist/src/4723.js +1 -1
- package/dist/src/5910.js +2 -0
- package/dist/src/6311.js +18 -18
- package/dist/src/7244.js +1 -1
- package/dist/src/9581.js +11 -1
- package/dist/src/9722.js +36 -36
- package/dist/src/9873.js +1 -1
- package/dist/src/android-adb.d.ts +1 -1
- package/dist/src/batch.d.ts +1 -1
- package/dist/src/cli-help.js +126 -27
- package/dist/src/cli-output.js +4 -4
- package/dist/src/cli.js +13 -12
- package/dist/src/contracts.d.ts +1 -1
- package/dist/src/index.d.ts +7 -4
- package/dist/src/interaction.js +1 -1
- package/dist/src/internal/bin.js +1 -1
- package/dist/src/provider.js +1 -0
- package/dist/src/record-trace-recording.js +3 -3
- package/dist/src/remote-config.d.ts +1 -1
- package/dist/src/selector-runtime.js +1 -1
- package/dist/src/selectors.d.ts +2 -2
- package/dist/src/session.js +8 -8
- package/dist/src/snapshot.js +1 -1
- package/dist/src/web.js +1 -0
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +6 -6
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +1 -1
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScreenRecorder.swift +9 -5
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +0 -2
- package/ios-runner/AgentDeviceRunner/RecordingScripts/recording-overlay.swift +44 -8
- package/ios-runner/AgentDeviceRunner/RecordingScripts/recording-resize.swift +59 -16
- package/ios-runner/RUNNER_PROTOCOL.md +1 -1
- package/package.json +5 -2
- package/server.json +2 -2
- package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.17.6.apk.sha256 +0 -1
- package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.17.6.apk.sha256 +0 -1
- package/dist/src/5299.js +0 -1
package/dist/src/9722.js
CHANGED
|
@@ -1,38 +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 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 v}from"node:timers/promises";import{resolveUserPath as y}from"./9612.js";import{SCREENSHOT_ACTION_FLAG_KEYS as S,SCROLL_DIRECTIONS as
|
|
2
|
-
`}(e);return a.writeFileSync(t,n),{written:!0,path:t}}catch(r){return
|
|
3
|
-
`)}function t8(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 rv(e){let t=await ry(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 ry(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 rv({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,rx=new h;async function rM(e,t){return await rb.run(e,t)}function rN(e){rb.getStore()?.(e)}async function rD(e,t){return await rx.run(e,t)}function rk(){return rx.getStore()}let rP=new Set(["replay","test"]),rE=new Set(["agent_device.command","agent-device.command"]),rC=new Set(["agent_device.install_from_source","agent-device.install_from_source"]),rR=new Set(["agent_device.release_materialized_paths","agent-device.release_materialized_paths"]),rO={"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"},rT=new Set([...rE,...rC,...rR,...Object.keys(rO)]);function rL(e,t,r,n){return{jsonrpc:"2.0",id:e,error:{code:t,message:r,data:n}}}function r$(e,t,r=200){e.statusCode=r,e.setHeader("content-type","application/json"),e.end(JSON.stringify(t))}function rF(e,t){e.destroyed||(e.write(eK(t)),e.end())}function rU(e){switch(e){case"INVALID_ARGS":return 400;case"UNAUTHORIZED":return 401;case"SESSION_NOT_FOUND":return 404;default:return 500}}function rG(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 rq(e,t){let r=e[t];return"string"==typeof r?r:void 0}function rj(e,t){let r=e[t];return Number.isInteger(r)?Number(r):void 0}function rV(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 rB(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 rH(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:rL(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:rL(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:rL(t.rpcRequest.id??null,-32e3,e.message,e)}}return{ok:!0,tenantId:e}}return{ok:!0}}async function rK(){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 rX(e){let t=await rK(),{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 rW(e,i,t,n);if("GET"===e.method&&e.url?.startsWith("/artifacts/"))return void rz(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||r$(i,rL(null,-32700,"Parse error"),400)}),e.on("end",async()=>{let n,o;try{n=JSON.parse(a)}catch{r$(i,rL(null,-32700,"Parse error"),400);return}if("2.0"!==n.jsonrpc||"string"!=typeof n.method)return void r$(i,rL(n.id??null,-32600,"Invalid Request"),400);if(!rT.has(n.method))return void r$(i,rL(n.id??null,-32601,`Method not found: ${n.method}`),404);if(!n.params||"object"!=typeof n.params)return void r$(i,rL(n.id??null,-32602,"Invalid params"),400);let s=!1;try{var l,d;let a=n.params,c=function(e,t,r){if(rE.has(e))return{token:rG(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(rC.has(e)){let e,n=rq(t,"platform");if("ios"!==n&&"android"!==n)throw new eD("INVALID_ARGS",'Invalid params: platform must be "ios" or "android"');return{token:rG(t,r),session:rq(t,"session")??"default",command:"install_source",positionals:[],flags:{platform:n},meta:{requestId:rq(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=rV(e,"owner"),n=rV(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:rB(e,"artifactId")}:(a&&(t=rB(e,"runId")),{kind:"github-actions-artifact",owner:r,repo:n,...a?{runId:t}:{},artifactName:rV(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:rj(t,"retentionMs")}}}if(rR.has(e)){let e=rq(t,"materializationId")?.trim();if(!e)throw new eD("INVALID_ARGS","Invalid params: materializationId is required");return{token:rG(t,r),session:rq(t,"session")??"default",command:"release_materialized_paths",positionals:[],meta:{requestId:rq(t,"requestId"),materializationId:e}}}let n=rO[e];if(n)return{token:rG(t,r),session:rq(t,"session")??"default",command:n,positionals:[],meta:{tenantId:rq(t,"tenantId")??rq(t,"tenant"),runId:rq(t,"runId"),leaseId:rq(t,"leaseId"),leaseTtlMs:rj(t,"ttlMs"),leaseBackend:rq(t,"backend")}};throw new eD("INVALID_ARGS",`Method not found: ${e}`)}(n.method,a,e.headers);if(l=n.method,rE.has(l)&&("string"!=typeof c.command||0===c.command.length))return void r$(i,rL(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 rH(t,{headers:e.headers,rpcRequest:n,daemonRequest:c});if(!u.ok)return void r$(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"||rP.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&&rJ(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 rM(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}:rL(n.id??null,-32e3,e.error.message,e.error);rF(i,t);return}let h=await r(c);if(s=!0,h.ok)return void r$(i,{jsonrpc:"2.0",id:n.id??null,result:h});r$(i,rL(n.id??null,-32e3,h.error.message,h.error),rU(h.error.code))}catch(t){s=!0;let e=eN(t);if(i.headersSent)return void rF(i,rL(n.id??null,-32e3,e.message,e));r$(i,rL(n.id??null,-32e3,e.message,e),rU(e.code))}finally{ro(o)}})})}async function rW(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){rY(t,eN(e))}}async function rz(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=rU(r.code),t.end(r.message)}}),t.on("close",()=>{t.writableFinished&&rm(i)}),l.pipe(t)}catch(e){rY(t,eN(e))}}async function rJ(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 eX(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=rG({},n.headers),d=(t=l,!(r=o)||t9(t,r)?null:eN(new eD("UNAUTHORIZED","Invalid token")));if(d)return rY(i,d),null;let c=await rH(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 rY(e,t){e.statusCode=rU(t.code),e.setHeader("content-type","application/json"),e.end(JSON.stringify({ok:!1,error:t.message,code:t.code}))}function rQ(e){if(!e)return;let t=e.trim();if(t&&/^[a-zA-Z0-9._-]{1,128}$/.test(t))return t}function r0(e){if(!e)return;let t=e.trim();if(t&&/^[a-f0-9]{16,128}$/i.test(t))return t.toLowerCase()}function r1(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 r2{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=r1(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=rQ(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=r0(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=r0(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=r1(e.backend),r=e$(e.tenantId);if(!r)throw new eD("INVALID_ARGS","tenant isolation requires tenant id.");let n=rQ(e.runId);if(!n)throw new eD("INVALID_ARGS","tenant isolation requires run id.");let i=r0(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=rQ(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 r3(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("./3340.js");return await t({serialAllowlist:e.androidSerialAllowlist?new Set(e.androidSerialAllowlist):void 0})}if(e.platform){let{listAppleDevices:t}=await import("./devices.js");return await t({simulatorSetPath:e.iosSimulatorSetPath,udid:e.udid})}let r=[];try{let{listAndroidDevices:t}=await import("./3340.js");r.push(...await t({serialAllowlist:e.androidSerialAllowlist?new Set(e.androidSerialAllowlist):void 0}))}catch{}try{let{listAppleDevices:t}=await import("./devices.js");r.push(...await t({simulatorSetPath:e.iosSimulatorSetPath,udid:e.udid}))}catch{}try{let{listLinuxDevices:e}=await import("./devices~1.js");r.push(...await e())}catch{}return r}let r4=new h,r5=new h;async function r6(e,t,r){var n,i;let a=await r8(e,t,r);if(n=t,i=a,!r9(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 r8(e,t,r){try{return await e2(e,t,r)}catch(e){var n;if(n=e,!r9(t)&&n instanceof eD&&"DEVICE_NOT_FOUND"===n.code)return;throw e}}function r9(e){return!!(e.udid||e.serial||e.deviceName)}async function r7(e){let t=e1(e.platform),r=eW({simulatorSetPath:e8(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=r4.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 ni({...s,iosSimulatorSetPath:r,androidSerialAllowlist:n?Array.from(n).sort():void 0});if(l)return na(s)?no(i,await r6(l,s,{simulatorSetPath:r})):no(i,await e2(l,s,{simulatorSetPath:r}));let d=await r3({...s,iosSimulatorSetPath:r,androidSerialAllowlist:n?Array.from(n).sort():void 0});return na(s)?no(i,await r6(d,s,{simulatorSetPath:r})):no(i,await e2(d,s,{simulatorSetPath:r}))},a)}async function ne(e){return r4.getStore()?await e():await r4.run(new Map,e)}async function nt(e,t){return e?await r5.run(e,t):await t()}async function nr(e,t){return await nt(e,async()=>await ne(t))}async function nn(e){return await ni(e)??await r3(e)}async function ni(e){let t=r5.getStore();if(!t)return null;let r=await t(e);return null==r?null:r.map(e=>({...e}))}function na(e){return!!e.platform&&"android"!==e.platform&&"linux"!==e.platform}function no(e,t){return r4.getStore()?.set(e,{...t}),t}let ns=["platform","target","device","udid","serial"],nl=[...ns,"iosSimulatorDeviceSet","androidDeviceAllowlist"];function nd(e){return"string"==typeof e&&e.trim().length>0}function nc(e,t){return!!e&&t.some(t=>nd(e[t]))}let nu={leaseAdmissionExempt:!0,sessionExecutionLockExempt:!0,selectorValidationExempt:!0},np=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}}([...nh("lease",{leaseAdmissionExempt:!0,sessionExecutionLockExempt:!0},tw.leaseAllocate,tw.leaseHeartbeat,tw.leaseRelease),nm(tw.sessionList,"session",{sessionKind:"inventory",...nu}),nm(th.devices,"session",{sessionKind:"inventory",lockPolicySelectorOverride:!0,...nu}),nm(th.apps,"session",{sessionKind:"inventory",lockPolicySelectorOverride:!0,preferExplicitDeviceOverExistingSession:!0}),...nh("session",{sessionKind:"state"},th.boot,th.shutdown,th.appState),...nh("session",{sessionKind:"observability"},th.perf,th.logs,th.network),...nh("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),nm(tw.runtime,"session"),nm(th.clipboard,"session",{replayScopedAction:!0}),nm(th.keyboard,"session",{replayScopedAction:!0,androidBlockingDialogGuard:!0}),...nh("session",{},th.install,th.reinstall,tw.installSource),nm(tw.releaseMaterializedPaths,"session",nu),...nh("session",{},th.push,th.triggerAppEvent),nm(th.open,"session",{allowSessionlessDefaultDevice:()=>!0}),...nh("session",{},th.prepare,th.batch),nm(th.close,"session",{allowInvalidRecording:!0}),...nh("snapshot",{replayScopedAction:!0},th.snapshot,th.diff,th.wait,th.alert,th.settings),nm(th.reactNative,"reactNative",{replayScopedAction:!0}),nm(th.record,"recordTrace",{replayScopedAction:!0,allowInvalidRecording:!0,allowSessionlessDefaultDevice:function(e){return"start"===(e.positionals?.[0]??"").toLowerCase()}}),nm(th.trace,"recordTrace"),nm(th.find,"find",{replayScopedAction:!0}),...nh("interaction",{replayScopedAction:!0,androidBlockingDialogGuard:!0},th.click,th.fill,th.longPress,th.press,th.type),...nh("interaction",{replayScopedAction:!0},th.get,th.is),...nh("generic",{replayScopedAction:!0,androidBlockingDialogGuard:!0},th.back,th.gesture,th.home,th.rotate,th.scroll,th.swipe,"pinch"),nm(th.focus,"generic",{androidBlockingDialogGuard:!0}),nm(th.screenshot,"generic",{replayScopedAction:!0}),...nh("generic",{androidBlockingDialogGuard:!0},"pan","fling","rotate-gesture","transform-gesture")]);function nf(e){return nw(e)?.sessionKind}function nm(e,t,r={}){return{command:e,route:t,...r}}function nh(e,t,...r){return r.map(r=>nm(r,e,t))}function nw(e){return np.descriptorsByCommand.get(e)}let ng=[{resolverKey:"androidAdbProvider",resolve(e,t){let r=e.androidAdbProvider;if(!r||"android"!==t.device.platform)return{};let n=r(t),i="function"==typeof n?n:n?.exec;return{androidAdb:{provider:n,executor:i,serial:t.device.id}}},async appendWrapper(e,t){if(!e.androidAdb?.provider)return;let{withAndroidAdbProvider:r}=await import("./2954.js");nA(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);nA(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);nA(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(tX);nA(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);nA(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");nA(t,e.recording,r)}}];async function nv(e,t){let r=await ny(e),n={androidAdbExecutor:r.androidAdb?.executor},i=await nI(r);return await n_(i,async()=>await t(n))}async function ny(e){var t,r,n;if(t=e.providers,!ng.some(e=>!!t[e.resolverKey]))return{};let i=await nS(e.req,e.existingSession);if(!i)return{};let a=(r=e,n=i,{req:r.req,device:n,session:r.existingSession});return ng.reduce((t,r)=>({...t,...r.resolve(e.providers,a)}),{})}async function nS(e,t){switch(function(e,t){var r;let n,i;if(t.hasExistingSession)return nw(e.command)?.preferExplicitDeviceOverExistingSession===!0&&t.hasExplicitDeviceSelector?"explicit-device":"existing-session";return(r=e,"function"==typeof(i=nw(r.command)?.skipSessionlessProviderDevice)&&i(r))?"skip":t.hasExplicitDeviceSelector?"explicit-device":"function"==typeof(n=nw(e.command)?.allowSessionlessDefaultDevice)&&n(e)?"sessionless-default-device":"skip"}(e,{hasExistingSession:!!t,hasExplicitDeviceSelector:nc(e.flags,ns)})){case"existing-session":return t?.device;case"explicit-device":case"sessionless-default-device":return await r7(e.flags??{});case"skip":return}}async function nI(e){let t=[];for(let r of ng)await r.appendWrapper(e,t);return t}function nA(e,t,r){let n=t?.provider;n&&e.push(async e=>await r(n,e))}async function n_(e,t){let r=t;for(let t of[...e].reverse()){let e=r;r=async()=>await t(e)}return await r()}async function nb(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 nx=/^[A-Za-z0-9_.:-]{1,64}$/,nM="--launch-console is supported only for iOS simulator app launches",nN="--launch-console requires a direct app launch and cannot be used with URL opens",nD=[[0,0],[1,0],[0,1],[-1,0],[0,-1],[1,1],[-1,1],[1,-1],[-1,-1]];function nk(e,t){if(t<=0)return[0,0];let[r,n]=nD[e%nD.length];return[r*t,n*t]}async function nP(e,t,r){for(let n=0;n<e;n+=1)await r(n),n<e-1&&t>0&&await eX(t)}let nE=["tap","doubleTap","longPress","drag"];function nC(e,t,r){return new eD("INVALID_ARGS",r,{stepIndex:e,kind:"string"==typeof t?t:void 0})}function nR(e,t,r,n,i,a){if(!Number.isFinite(e)||e<t||e>r)throw nC(n,i,`sequence step ${n} (${i}) ${a} must be between ${t} and ${r}`)}function nO(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)&&nE.includes(r)))throw nC(t,e.kind,`sequence step ${t} has unsupported kind "${String(e.kind)}"; allowed: ${nE.join(", ")}`);if(!Number.isFinite(e.x)||!Number.isFinite(e.y))throw nC(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 nC(t,e.kind,`sequence step ${t} (drag) requires finite x2 and y2`);void 0!==e.durationMs&&nR(e.durationMs,0,1e4,t,e.kind,"durationMs"),void 0!==e.pauseMs&&nR(e.pauseMs,0,1e4,t,e.kind,"pauseMs")})(e,t)),{command:"sequence",steps:e,appBundleId:t}}function nT(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 nL(e,t){let{x:r,y:n}=nV(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 n$(e,t){let{x:r,y:n}=nV(t,"focus requires x y");return await e.focus(r,n),{x:r,y:n,...G(`Focused (${r}, ${n})`)}}async function nF(e,t,r){let n=ev(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=W(r?.delayMs??0,"delay-ms",0,1e4);return await e.type(i,a),{text:i,delayMs:a,...G(it("Typed",i))}}async function nU(e,t,r){if(r?.directElementSelector)return await nG(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=W(r?.delayMs??0,"delay-ms",0,1e4);return await e.fill(n,i,a,o),{x:n,y:i,text:a,delayMs:o,...G(it("Filled",a))}}async function nG(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=W(n.delayMs??0,"delay-ms",0,1e4),o=await e.fillElementSelector(t,i,a);return{selector:t.raw,text:i,delayMs:a,...o??{},...G(it("Filled",i))}}async function nq(e,t,r,n){var i,a;if(n?.directElementSelector&&"ios"===e.platform)return await nj(t,n.directElementSelector);let{x:o,y:s}=nV(r,"press requires x y");if("macos"===e.platform&&n?.surface&&"app"!==n.surface)return await nB(o,s,n);let l=M(n);if("primary"!==l)return await nH(e,o,s,l,n);let d=(a=n,{count:nX(a?.count,1,"count",1,200),intervalMs:nX(a?.intervalMs,0,"interval-ms",0,1e4),holdMs:nX(a?.holdMs,0,"hold-ms",0,1e4),jitterPx:nX(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 nz(e,o,s,d,n):await nJ(t,o,s,d)}async function nj(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 nV(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 nB(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(n7({x:e,y:t}))}}async function nH(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 nK(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(n7({x:t,y:r,button:n}))}}async function nK(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(n7({x:e,y:t,button:r}))}}function nX(e,t,r,n,i){return W(void 0===e?t:e,r,n,i)}async function nW(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,nO(t,r?.appBundleId),nZ(r));n??=c,i=c;try{o=nT(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 nz(e,t,r,n,i){var a,o,s,l;let d,c,u=await nW(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]=nk(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(n7({x:t,y:r}))}}async function nJ(e,t,r,n){let i;return await nP(n.count,n.intervalMs,async a=>{let[o,s]=nk(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},n7({x:t,y:r}))}function nZ(e){return{verbose:e?.verbose,logPath:e?.logPath,traceLogPath:e?.traceLogPath,requestId:e?.requestId,iosXctestrunFile:e?.iosXctestrunFile,iosXctestDerivedDataPath:e?.iosXctestDerivedDataPath,iosXctestEnvDir:e?.iosXctestEnvDir}}async function nY(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 n0({device:e,interactor:t,context:n,x1:i,y1:a,x2:o,y2:s,requestedDurationMs:l})}async function nQ(e,t,r,n){let i=C(r[0]),a=r[1]?Number(r[1]):300,o=z((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 n0({device:e,interactor:t,context:n,x1:s.x1,y1:s.y1,x2:s.x2,y2:s.y2,requestedDurationMs:a,preset:i})}async function n0(e){let{device:t,interactor:r,context:n,x1:i,y1:a,x2:o,y2:s,requestedDurationMs:l,preset:d}=e,c=W(l,"durationMs",16,1e4),u=W(n?.count??1,"count",1,200),p=W(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 nW(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(ie(u,f))}}return await nP(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}`:ie(u,f))}async function n1(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=W(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 n2(e,t){let r=X(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=W(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 n3(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 n4(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 n4(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 n5(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 n6(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 n8(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:W(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 n9(e,t,r){let{x:n,y:i}=nV(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,iosXctestrunFile:r?.iosXctestrunFile,iosXctestDerivedDataPath:r?.iosXctestDerivedDataPath,iosXctestEnvDir:r?.iosXctestEnvDir});return{action:"read",text:"string"==typeof o.text?o.text:"string"==typeof o.message?o.message:""}}function n7(e){return e.button&&"primary"!==e.button?`Clicked ${e.button} (${e.x}, ${e.y})`:`Tapped (${e.x}, ${e.y})`}function ie(e,t){return e<=1?"Swiped":"ping-pong"===t?`Swiped ${e} times (ping-pong)`:`Swiped ${e} times`}function it(e,t){return`${e} ${Array.from(t).length} chars`}function ir(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 ii(e){let t=ir(e,{subject:"Push payload"}),r="inline"===t.kind?t.text:await ia(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 ia(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 io(e,t,r,n,i){let a={requestId:i?.requestId,appBundleId:i?.appBundleId,verbose:i?.verbose,logPath:i?.logPath,traceLogPath:i?.traceLogPath,iosXctestrunFile:i?.iosXctestrunFile,iosXctestDerivedDataPath:i?.iosXctestDerivedDataPath,iosXctestEnvDir:i?.iosXctestEnvDir},o=await nb(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 is(e,o,t,r,n,i,a),{command:t,platform:e.platform})}async function is(e,t,r,n,i,a,o){switch(r){case"open":return await il(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 nq(e,t,n,a);case"swipe":return await nY(e,t,n,a);case"swipe-preset":return await nQ(e,t,n,a);case"pan":return await n1(t,n);case"fling":return await n2(t,n);case"longpress":return await nL(t,n);case"focus":return await n$(t,n);case"type":return await nF(t,n,a);case"fill":return await nU(t,n,a);case"scroll":return await n3(t,n,a);case"pinch":return await n5(e,t,n,a);case"rotate-gesture":return await n6(e,t,n);case"transform-gesture":return await n8(e,t,n);case"trigger-app-event":return await id(e,t,n,a);case"screenshot":return await ic(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 iu(t,n);case"keyboard":return await ip(e,n,a,o);case"settings":return await iw(e,t,n,a);case"push":return await ig(e,n,a);case"snapshot":return await iv(t,a);case"read":return await n9(e,n,a);default:throw new eD("INVALID_ARGS",`Unknown command: ${r}`)}}async function il(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",nM);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",nN);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",nN);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 id(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(!nx.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 ic(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 iu(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 ip(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 im(e,i);if("ios"===e.platform)return await ih(e,i,r,n);throw new eD("UNSUPPORTED_OPERATION","keyboard is supported only on Android and iOS")}async function im(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("./9624.js"),r=await t(e);return{platform:"android",action:"dismiss",attempts:r.attempts,wasVisible:r.wasVisible,dismissed:r.dismissed,visible:r.visible,inputType:r.inputType,type:r.type,inputMethodPackage:r.inputMethodPackage,focusedPackage:r.focusedPackage,focusedResourceId:r.focusedResourceId,inputOwner:r.inputOwner}}let{getAndroidKeyboardState:r}=await import("./9624.js"),n=await r(e);return{platform:"android",action:"status",visible:n.visible,inputType:n.inputType,type:n.type,inputMethodPackage:n.inputMethodPackage,focusedPackage:n.focusedPackage,focusedResourceId:n.focusedResourceId,inputOwner:n.inputOwner}}async function ih(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 iw(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},iy(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},iy(u)??`Updated setting: ${i}`):{setting:i,state:a,...G(`Updated setting: ${i}`)}}async function ig(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 ii(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 iv(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 iy(e){return"string"==typeof e.message&&e.message.length>0?e.message:void 0}let iS=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,i_={device:!0},ib={},ix={apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:i_},iM={apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ib,supports:iS},iN={alert:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ib,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:ib,supports:e=>"android"===e.platform||iI(e),unsupportedHint:iA},"rotate-gesture":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ib,supports:e=>"android"===e.platform||iI(e),unsupportedHint:iA},"transform-gesture":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ib,supports:e=>"android"===e.platform||iI(e),unsupportedHint:iA},"app-switcher":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ib,supports:iS},open:ix,close:ix,reinstall:iM,install:iM,"install-from-source":iM,apps:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ib},back:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:i_},boot:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ib,supports:iS},shutdown:{apple:{simulator:!0},android:{emulator:!0},linux:ib},click:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:i_},clipboard:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:i_,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:ib,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:i_},fling:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ib},snapshot:ix,diff:ix,screenshot:ix,wait:ix,get:ix,find:ix,is:ix,focus:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:i_},home:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:i_,supports:iS},logs:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ib},network:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ib},longpress:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:i_},perf:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ib},pan:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:i_},press:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:i_},push:{apple:{simulator:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ib,supports:iS},record:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ib},"react-native":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ib},rotate:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ib,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:i_},swipe:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:i_},settings:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ib,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:ib},type:ix};function iD(e,t){let r=iN[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 ik(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 iP(e,t){return"user-installed"===t?e.filter(e=>!e.bundleId.startsWith("com.apple.")):e}function iE(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 iC(e,t,r)}}async function iC(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 iP((await Promise.all(Array.from(a).map(async e=>{let r=await iR(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 iR(e,t){for(let r of[i.join(e,"Contents","Info.plist"),i.join(e,"Info.plist")]){let e=await t(r),n=iO(e,"CFBundleIdentifier"),i=iO(e,"CFBundleDisplayName"),a=iO(e,"CFBundleName");if(n||i||a)return{bundleId:n,appName:i??a}}return{}}function iO(e,t){let r=e?.[t];return"string"==typeof r&&r.trim()?r.trim():void 0}let iT={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 iB(eE,e)},macosHost:iE(eE,async e=>await iB(eE,e)),whichCommand:eO},iL=ik(iT,function(e){return"function"==typeof e?i$({runCommand:e}):i$(e)});function i$(e={}){let t={...iT,...e},r=e.plist??{readJson:async e=>await iB(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??iE(t.runCommand,async e=>await r.readJson(e))}}function iF(e){return iL.resolve(e)}async function iU(e,t){return await iL.run(e,t)}function iG(){return iL.hasScope()}async function iq(e,t,r){return await iF().runCommand(e,t,r)}async function ij(e,t){let r=iF(),[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 iq("xcrun",e,t)}async function iV(e){return await iF().plist?.readJson(e)??null}async function iB(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 iH="agent-device-macos-helper",iK="AGENT_DEVICE_MACOS_HELPER_BIN",iX=i.join(u.homedir(),".agent-device","macos-helper","current"),iW=i.join(iX,"manifest.json"),iz=/^[A-Za-z0-9_-]+(?:\.[A-Za-z0-9_-]+)+$/;function iJ(e){let t=e.trim();if(!iz.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",iJ(t.bundleId)),t.surface&&e.push("--surface",t.surface)}function iY(){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 iQ(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 iQ(r):t.isFile()&&(t.name.endsWith(".swift")||"Package.swift"===t.name)?[r]:[]}))).flat().sort()}async function i0(e){let t=await iQ(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 iq("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 i1(){try{let e=JSON.parse(await s.readFile(iW,"utf8"));return"string"==typeof e.fingerprint?e.fingerprint:null}catch{return null}}async function i2(){let e=await eR(process.env[iK],iK);if(e)return e;let t=iY(),r=await i0(t),n=i.join(iX,iH);try{if(await i1()===r)return await s.access(n),n}catch{}let a=i.join(iY(),".build","release",iH);process.stderr.write("agent-device: building macOS helper (first run or helper update)\n"),await iq("swift",["build","-c","release","--package-path",t],{cwd:t,timeoutMs:12e4}),await s.mkdir(iX,{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(iW,`${JSON.stringify({fingerprint:r},null,2)}
|
|
4
|
-
`,"utf8"),n}async function i3(){let e=process.env[iK]?.trim();if(e){let t=await eR(e,iK);if(t)return t}if(iG())return iH;if("darwin"!==process.platform)throw new eD("UNSUPPORTED_PLATFORM","macOS helper is only available on macOS");return await i2()}async function i4(e){let t={allowFailure:!0,timeoutMs:3e4},r=iF().macosHelper,n=r?iH:await i3(),i=r?await r.run(e,t):await iq(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 i5(){return await i4(["app","frontmost"])}async function i6(e){return await i4(["app","quit","--bundle-id",iJ(e)])}async function i8(e,t){return await i4(["permission",e,t])}async function i9(e,t={}){let r=["alert",e];return iZ(r,t),await i4(r)}async function i7(e,t={}){let r=["snapshot","--surface",e];return iZ(r,t),await i4(r)}async function ae(e,t,r={}){let n=["read","--x",String(e),"--y",String(t)];return iZ(n,r),await i4(n)}async function at(e,t,r={}){let n=["press","--x",String(e),"--y",String(t)];return iZ(n,r),await i4(n)}async function ar(e,t={}){let r=["screenshot","--out",e];return iZ(r,t),t.fullscreen&&r.push("--fullscreen"),await i4(r)}let an={"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"},ai={runCommand:eE,whichCommand:eO,desktop:ad(eE,eO),clipboard:ac(eE,eO),screenshot:au(eE,eO)},aa=ik(ai,function(e={}){let t={...ai,...e};return{...t,desktop:e.desktop??ad(t.runCommand,t.whichCommand),clipboard:e.clipboard??ac(t.runCommand,t.whichCommand),screenshot:e.screenshot??au(t.runCommand,t.whichCommand)}});function ao(e){return aa.resolve(e)}async function as(e,t){return await aa.run(e,t)}async function al(e,t,r){return await ao().runCommand(e,t,r)}function ad(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 eX(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 ac(e,t){return{async readText(){let r=am[await ag(t,ap)];return(await e(r.cmd,r.args,r.options)).stdout},async writeText(r){let n=ah[await ag(t,ap)](r);await e(n.cmd,n.args,n.options)}}}function au(e,t){return{async capture(r){let n=aw[await ag(t,af)](r);await e(n.cmd,n.args,n.options)}}}let ap={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."},af={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."},am={"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}}},ah={"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}})},aw={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 ag(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 av="atspi-dump.py",ay=null;async function aS(e,t={}){let r,n=ao().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 ao().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(ay)return ay;let e=i.dirname(d(import.meta.url));for(let t=0;t<5;t++){let r=i.join(e,"src","platforms","linux",av);if(a.existsSync(r))return ay=r,r;if(0===t){let t=i.join(e,av);if(a.existsSync(t))return ay=t,t}e=i.dirname(e)}throw new eD("TOOL_MISSING",`Cannot find ${av}. Ensure the agent-device package is installed correctly.`)}(),"--surface",e,"--max-nodes",String(o),"--max-depth",String(s),"--max-apps",String(l)],u=await al("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=an[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 aI(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 aS(t);return{nodes:r.nodes,truncated:r.truncated}}async function aA(e,t,r){let{nodes:n}=await aI(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:a_(e.rect)-a_(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 a_(e){return(e?.width??0)*(e?.height??0)}let ab=[250,400,600];function ax(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?ak(n?.nodes??[]):void 0,routeComparable:i}}function aM(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 aN(e){e&&"android"===e.device.platform&&delete e.androidSnapshotFreshness}function aD(e){return"press"===e||"click"===e||"back"===e||"open"===e}function ak(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 aP(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,iosXctestrunFile:t?.iosXctestrunFile,iosXctestDerivedDataPath:t?.iosXctestDerivedDataPath,iosXctestEnvDir:t?.iosXctestEnvDir,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 aE(e){var t;let{session:r,command:n,positionals:i,flags:a,preSnapshot:o}=e;if(a?.interactionOutcome?.retryOnNoChange!==!0||!aF(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=aT(o?.nodes??[]);0!==l.length&&(r.pendingInteractionOutcome={action:n,command:s,positionals:i,flags:aO(a),markedAt:Date.now(),attemptsRemaining:2,preSignature:l})}function aC(e){e?.pendingInteractionOutcome&&(e.pendingInteractionOutcome=void 0)}async function aR(e){let{session:t,pending:r,snapshot:n}=e,i=aL(r.preSignature,aT(n.nodes));if("unchanged"!==i||r.attemptsRemaining<=0)return{retried:!1,change:i};let a=Date.now();return r.attemptsRemaining-=1,await io(t.device,r.command,r.positionals,r.flags?.out,{...aP(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 aO(e){if(!e?.interactionOutcome&&!e?.postGestureStabilization)return e;let{interactionOutcome:t,postGestureStabilization:r,...n}=e;return n}function aT(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 aL(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 aF(e){return"ios"===e.device.platform||"android"===e.device.platform}function aU(e,t,r=[],n){var i,a,o;aj(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 aG(e){e?.postGestureStabilization&&(e.postGestureStabilization=void 0)}async function aq(e){let{session:t,capture:r}=e,n=t?.postGestureStabilization;if(!t||!aj(t.device.platform)||!n)return e.initial??await r();let i=Date.now(),a=1,o=e.initial??await r(),s=aT(e.readSnapshot(o).nodes);for(;a<2||Date.now()-i<1500;){await eX(200),a+=1;let l=await r(),d=aT(e.readSnapshot(l).nodes);if(a$(s,d))return aG(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 aG(t),ei({level:"warn",phase:"post_gesture_snapshot_stabilization_timeout",data:{action:n.action,attempts:a,durationMs:Date.now()-i}}),o}function aj(e){return"ios"===e||"android"===e}function aV(e,t,r){return{ok:!1,error:{code:e,message:t,...r?{details:r}:{}}}}let aB=new WeakMap;function aH(e,t){if(!e[t])return[];let r=aW(e)[t]??t+1;return e.slice(t+1,r)}function aK(e,t,r){let n=aW(e)[t]??t+1;for(let i=t+1;i<n;i+=1){let t=e[i];if(t&&r(t))return t}}function aX(e,t,r){let n=aW(e)[t]??t+1;for(let i=t+1;i<n;i+=1){let t=e[i];t&&r(t)}}function aW(e){let t=aB.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 aB.set(e,r),r}function az(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 aJ(e,t){let r=ty(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"===ty(e.type??"")&&e.label?.trim()==="chevron"&&!1===e.enabled}function aY(e){let t=ty(e??"");return"collectionview"===t||"table"===t||"scrollview"===t||"scrollarea"===t}function aQ(e,t,r){e.set(t.index,{...t,...e.get(t.index),...r})}function a0(e){let t;for(let i of e){var r,n;let e=ty(i.type??"");("application"===e||"window"===e)&&(r=i.rect,n=t,r&&(!n||a1(r)>a1(n)))&&(t=i.rect)}return t}function a1(e){return e?e.width*e.height:0}function a2(e){let t=ty(e.type??"");return"scrollview"===t||"scrollarea"===t}function a3(e,t){return!0===e||!!t||void 0}function a4(e,t,r,n){aX(e,t,e=>{(function(e,t){let r=e.label?.trim();if(!r||r!==t)return!1;let n=ty(e.type??"");return"other"===n||"statictext"===n||"link"===n})(e,r)&&n.add(e.index)})}function a5(e,t,r,n){aX(e,t,e=>{var t;let i;e.index!==r&&"button"!==(i=ty((t=e).type??""))&&("image"===i||"Search"===t.label)&&n.add(e.index)})}function a6(e,t){for(let r=0;r<e.length;r+=1){let n=e[r],i=n?.label?.trim();n&&i&&"other"===ty(n.type??"")&&t(n,i,r)}}function a8(e,t,r,n){for(let i of e)(aJ(i,t)||n&&a7(i,n))&&r.add(i.index)}function a9(e,t,r){if("button"!==ty(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 a7(e,t){return"button"===ty(e.type??"")&&!e.label?.trim()&&!e.value?.trim()&&L(e.rect,t.rect)}let oe=[function(e,t){var r,n,i,a;let{suppressedIndexes:o}=t;(function(e,t){let r=a0(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"===ty(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),aX(e,r,e=>{t.add(e.index)}))}})(e,o),function(e,t){for(let r of e)!("other"!==ty(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;aY(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&&aY(e.type)?e:null)??az(e,t,e=>aY(e.type))}(e,t,{includeSelf:!0});l&&(n=r,i=l,a=e,o=s,aQ(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:a3(i.hiddenContentAbove,o.above),hiddenContentBelow:a3(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"!==ty(n.type??""))continue;if("Search"===n.label){a5(e,r,null,t);continue}if("Toolbar"!==n.label)continue;let i=aK(e,r,e=>"searchfield"===ty(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),a5(e,r,i.index,t))}})(e,o),r=e,n=o,a6(r,(e,t,i)=>{aK(r,i,r=>{let n;return("button"===(n=ty(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=ty(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,a6(i,(e,t,r)=>{let n;B(e)&&b(e,(n=[],aX(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=ty(r.type??"");if("statictext"===a||"link"===a)return a4(e,t,n,i);if("other"===a){if(function(e,t,r){return!!aK(e,t,e=>{let t=ty(e.type??"");return("link"===t||"searchfield"===t||aY(e.type))&&e.label?.trim()===r})}(e,t,n))return i.add(r.index);a4(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=a0(r.values());for(let i of e)(function(e,t,r){var n;return!("other"!==ty(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)||!az(e,t,a2)||!((n=e).rect&&n.rect.height>=44&&n.rect.height<=160&&n.rect.width>=120)||function(e,t,r=.8){let n=a1(e),i=a1(t);return n>0&&i>0&&n/i>=r}(e.rect,r))})(i,r,n)&&aQ(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=ty(r.type??"");if("button"===a)return a8(aH(e,t),n,i.suppressedIndexes,r);if("cell"!==a)return;let o=aH(e,t);!function(e,t,r,n){let i=e.find(e=>(function(e,t,r){if("switch"!==ty(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=>a9(e,t,r)),o=i.identifier?void 0:a?.identifier??t.identifier;return o&&aQ(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&&(a9(a,t,r)||a7(a,t)||function(e,t){if("switch"!==ty(e.type??"")||e.index===t.index)return!1;let r=e.label?.trim();return r===t.value?.trim()||"0"===r||"1"===r}(a,n)||aJ(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=>a9(e,t,r));if(!i){e.some(aZ)&&a8(e,r,n.suppressedIndexes,t);return}!t.identifier&&i.identifier&&aQ(n.replacements,t,{identifier:i.identifier}),n.suppressedIndexes.add(i.index),a8(e.filter(e=>e.index!==i.index),r,n.suppressedIndexes,t)}(o,r,n,i)}(e,r,n,i,t)}}];async function ot(e){let t=await or(e);if(t)return t;let r=await oc(e);return aN(e.session),{snapshot:r.snapshot,...r.annotations}}async function or(e){let t=function(e){let t=e?.pendingInteractionOutcome;if(e&&t)return!aF(e)||Date.now()-t.markedAt>3e4?void aC(e):t}(e.session);if(t&&e.session)return await on({...e,session:e.session},t);if(("ios"===e.device.platform||"android"===e.device.platform)&&e.session?.postGestureStabilization)return await ol({...e,session:e.session});let r=aM(e.session);if(r&&"android"===e.device.platform)return await oo(e,r)}async function on(e,t){var r,n;let i=e.session,a=Date.now(),o=0,s=await oi(e,t,await od(e)),l=await aR({session:i,pending:t,logPath:e.logPath,snapshot:s.snapshot});for(;l.retried;)o+=1,s=await oi(e,t,await od(e)),l=await aR({session:i,pending:t,logPath:e.logPath,snapshot:s.snapshot});return(aC(i),s=await aq({session:i,initial:s,capture:async()=>await od(e),readSnapshot:e=>e.snapshot}),"ambiguous"!==l.change&&s.annotations.freshness?.staleAfterRetries!==!0&&aN(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 oi(e,t,r){let n=r;return"unchanged"!==aL(t.preSignature,aT(n.snapshot.nodes))?n:(await eX(500),n=await od(e))}async function oa(e){let{device:t,session:r,flags:n,outPath:i,logPath:a,snapshotScope:o}=e;if("linux"===t.platform){let e=await aI(r?.surface);return of({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?of(await i7(r.surface,{bundleId:"menubar"===r.surface?r.appBundleId:void 0}),{snapshotDepth:n?.snapshotDepth,snapshotInteractiveOnly:n?.snapshotInteractiveOnly,snapshotScope:o}):await io(t,"snapshot",[],i,{...aP(a,{...n,snapshotScope:o},r?.appBundleId,r?.trace?.outPath)})}async function oo(e,t){let r=await os(e,t);return{snapshot:r.snapshot,...r.annotations}}async function os(e,t){let r=await oc(e),n=ou(r,t,e),i=0,a=t.markedAt+1500;for(let o of ab){if(!n)break;let s=a-Date.now();if(s<=0)break;await eX(Math.min(o,s)),r=await oc(e),i+=1,n=ou(r,t,e)}n||aN(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 ol(e){let t=await aq({session:e.session,capture:async()=>await od(e),readSnapshot:e=>e.snapshot});return{snapshot:t.snapshot,...t.annotations}}async function od(e){let t=aM(e.session);return t&&"android"===e.device.platform?await os(e,t):await oc(e)}async function oc(e){var t;let r=Date.now(),n=await oa(e);return eV(e.session,{durationMs:Date.now()-r,backend:n.backend,platform:e.device.platform}),{data:n,snapshot:op(n,void 0===(t=e).snapshotScope?t.flags:{...t.flags,snapshotScope:t.snapshotScope}),annotations:K(n)}}function ou(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&&aD(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=ak(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 op(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"?om(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 oe)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=e5(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 of(e,t){var r,n;let i=e.nodes??[];return t.snapshotScope&&(i=om(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:oh(e.filter(e=>r.has(e.index)))}(i)),"number"==typeof t.snapshotDepth&&(r=i,n=t.snapshotDepth,i=oh(r.filter(e=>(e.depth??0)<=n))),{...e,nodes:i}}function om(e,t){let r=tI(e5(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 oh(a,i)}function oh(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 ow(e,t){let r;if(!e||!e.trim().startsWith("@"))return{ok:!0,scope:e};if(!t?.snapshot)return aV("INVALID_ARGS","Ref scope requires an existing snapshot in session.");let n=ez(e.trim());if(!n)return aV("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}:aV("COMMAND_FAILED",`Ref ${e} not found or has no label`)}function og(e,t){e.snapshot=t,e.snapshotScopeSource=void 0,!0===t.comparisonSafe&&(e.lastComparisonSafeSnapshot=t)}function ov(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 oy(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?oS(await io(t.device,"screenshot",[],i,o)):oS(await io(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:ov({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 oS(e){if("object"==typeof e&&null!==e)return{..."string"==typeof e.path?{path:e.path}:{},...Array.isArray(e.overlayRefs)?{overlayRefs:e.overlayRefs}:{}}}function oI(e){if(0===e.length)return null;let t=[...e].sort((e,t)=>e-t);return t[Math.floor(t.length/2)]??null}function oA(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 o_(e,t){return{start:e.y-t.y,size:e.height,crossSize:e.width}}let ob=["device offline","device not found","transport error","connection reset","broken pipe","timed out","no such file or directory"];async function ox(e,t={}){let r=tM(e,t.helperAdb).exec;return(await oP(e,t,r)).xml}async function oM(e,t={}){let r=tM(e,t.helperAdb).exec,n=await oP(e,t,r),i=n.xml,a=!1!==t.includeHiddenContentHints;if(!t.interactiveOnly){let o=tD(i,void 0,t),s=oN(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 oG(e,o.nodes,i,r),o.nodes),{...o,...oD(s),androidSnapshot:n.metadata}}let o=tP(i),s=tT(o,void 0,t),l=oN(s.truncated,n.metadata);a&&await ok({device:e,options:t,tree:o,xml:i,adb:r,interactiveSnapshot:s});let{sourceNodes:d,...c}=s;return{...c,...oD(l),androidSnapshot:n.metadata}}function oN(e,t){return!0===e||!0===t.helperTruncated||e}function oD(e){return!0===e?{truncated:!0}:{}}async function ok(e){if(oj(e.interactiveSnapshot.nodes).size>0||oq(e.xml))return;let t=tT(e.tree,void 0,{...e.options,interactiveOnly:!1}),r=await oG(e.device,t.nodes,e.xml,e.adb);oW(r,t,e.interactiveSnapshot),0===r.size&&oW(x(e5(t.nodes)),t,e.interactiveSnapshot)}async function oP(e,t,r){let n=await er("android_snapshot_helper_artifact_resolution",async()=>await oF(t.helperArtifact));return n.artifact?await oE(e,t,r,n.artifact):(ei({level:n.fallbackReason?"warn":"info",phase:"android_snapshot_helper_unavailable",data:{reason:n.fallbackReason??"artifact_not_found"}}),await oU(e,n.fallbackReason,r))}async function oE(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 oC(t,r,d,n,l);return e.installed&&await tL(l),a=await oR(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 oO({error:t,helperDeviceKey:l,artifact:n,device:e,adb:r})}}async function oC(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 oR(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 oT(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 oO(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=o$(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=oL(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=oL(e.error);return ei({level:"warn",phase:"android_snapshot_helper_fallback",data:{reason:r}}),await tL(e.helperDeviceKey),await oT(e.adb,e.artifact.manifest.packageName),tO({deviceKey:e.helperDeviceKey,packageName:e.artifact.manifest.packageName,versionCode:e.artifact.manifest.versionCode}),await oU(e.device,r,e.adb)}async function oT(e,t){try{await e(["shell","am","force-stop",t],{allowFailure:!0,timeoutMs:2e3}),await eX(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 oL(e){let t=eN(e),r=o$(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 o$(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 oF(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 oU(e,t,r){let n;try{n=await er("android_snapshot_stock_capture",async()=>await oV(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 oG(e,t,r,n){if(!t.some(e=>t_(e.type)))return new Map;let i=oj(t);if(i.size>0||oq(r))return i;let a=await oX(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=>o_(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=>o_(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=oI(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(!oA(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(!oA(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?oI(o):a.length>0?oI(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 oq(e){return e.includes(" can-scroll-forward=")||e.includes(" can-scroll-backward=")}function oj(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 oV(e,t=tN(e)){try{return await e7(()=>oB(t),{shouldRetry:oK})}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 oB(e){var t,r;let n,i,a=await e(["exec-out","uiautomator","dump","/dev/tty"],{allowFailure:!0,timeoutMs:8e3}),o=oH(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
|
|
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 oW(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 oz=/\bis(?:n(?:'|'|')?t| not)\s+responding\b/i,oJ=/^close app$/i,oZ="Wait for Android to recover, close the dialog, restart the app, or reboot the emulator, then retry.";async function oY(e){let t,{session:r}=e;if("android"!==r.device.platform||!r.recording)return{status:"absent"};try{t=await o4(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=o6(t);if(!n?.rect)return{status:"absent"};try{let e=await o5(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 o8(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 o9(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 oQ(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 o0(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 o2({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 o2({session:n,command:i,focus:a,message:`Android app ANR blocked ${i}: ${o3(a)}. Automatic recovery failed.`,hint:oZ})}throw o2({session:n,command:i,focus:a,message:`Android system dialog is blocking ${i}: ${o3(a)}.`,hint:oZ})}async function o0(e){try{return await o1(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 o1(e){if(!e.appBundleId)return!1;let t=o6(await o4(e),{requireDialogSignal:!1});if(!t?.rect)return!1;let r=await o5(e,t);if(!r.ok)return!1;await tr(e.device,e.appBundleId);let n=await o9(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 o2(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 o3(e){return e.package?`${e.focusedWindow} (package ${e.package})`:e.focusedWindow}async function o4(e){return e5(tS((await oM(e.device,{interactiveOnly:!1})).nodes))}async function o5(e,t){if(!t.rect)return{ok:!1,exitCode:1,stdout:"",stderr:"button has no rect"};let{x:r,y:n}=e4(t.rect),i=await e6(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 o6(e,t={}){if(!1===t.requireDialogSignal||st(e))return e.find(e=>se(e).some(e=>oJ.test(e))&&e.rect)}async function o8(e){for(let t=0;t<12;t+=1){if(!st(await o4(e)))return!0;await eX(500)}return!st(await o4(e))}async function o9(e,t,r={}){for(let n=0;n<12;n+=1){if(await o7(e,t,r))return!0;await eX(500)}return await o7(e,t,r)}async function o7(e,t,r){return!(r.requireNoBlockingDialog&&await e9(e.device))&&(await td(e.device)).package===t}function se(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 st(e){return e.some(e=>{let t=se(e).join(" ").trim();return t.length>0&&oz.test(t)})}function sr(e){return!!(e&&e.width>0&&e.height>0)}function sn(e){return e.width*e.height}function si(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 sa=[255,59,48,255],so=[255,214,10,255],ss=[0,0,0,255],sl=["scroll","list","recyclerview","edittext","textfield"],sd=["button","link","menu","tab","textfield","searchfield","securetextfield","checkbox","radio","switch","cell"],sc={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 su(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)sm(r)&&sr(r.rect)&&(!t||sn(r.rect)>sn(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&&sr(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 sr(e.rect)&&!("image"===ty((t=e).type??"")&&!sw(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(sg)||sv(r.identifier);return!!function(e,t,r){if("android"!==e.backend||!r.hittable||!sr(r.rect)||sm(r))return!1;let n=ty(r.type??"");return!(sl.some(e=>n.includes(e))||t&&sn(r.rect)>.25*sn(t))}(e,t,r)||(sf(r)?n:n&&function(e){let t=ty(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 sf(e)&&!sm(e)}(s=n)?s:null,tv(o,s,e=>(function(e){return sf(e)&&!sm(e)})(e)),s.hittable?s:null,tv(o,s,e=>!0===e.hittable)].find(sh)??null);if(!l?.rect||!sr(l.rect))continue;let d=function(e,t,r){let n=sy(e);if(e.ref!==t.ref&&n)return n;let i=function(e,t){let r=null;for(let n of t){if(n.ref===e.ref||!function(e,t,r){let n=e;for(;void 0!==n.parentIndex;){let e=r[n.parentIndex];if(!e)break;if(e.ref===t.ref)return!0;n=e}return!1}(n,e,t))continue;let i=sy(n);if(!i)continue;let a=function(e){let t=0;return ty(e.type??"").includes("text")&&(t+=2),sg(e.label)&&(t+=2),sg(e.value)&&(t+=1),t}(n);(!r||a>r.score)&&(r={label:i,score:a})}return r?.label}(t,r);return i||sy(t)}(n,l,e.nodes),c=function(e,t,r){let n=0;return e.ref===t.ref&&(n+=4),t.hittable&&(n+=3),sf(t)&&(n+=3),sf(e)&&(n+=2),r&&(n+=2),sv(t.identifier)&&(n+=1),sw(t.value)&&(n+=1),n}(n,l,d),u=function(e,t,r){var n,i;return"android"!==e.backend?t.rect:(n=sf,i=e=>!!sy(e),(!t.rect||!0!==t.hittable||n(t)||i(t)?null:function(e,t,r){let n=e.rect,i=function(e,t,r){let n=e.rect,i=new Map(t.map(e=>[e.index,e])),a=t.filter(t=>t.ref!==e.ref&&function(e,t,r){let n=e;for(;void 0!==n.parentIndex;){let e=r.get(n.parentIndex);if(!e)break;if(e.ref===t.ref)return!0;n=e}return!1}(t,e,i)&&function(e,t){let r=ty(e.type??"");return r.includes("text")||r.includes("image")&&t(e)}(t,r)&&sr(t.rect)&&si(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=sp(e,i,u,t,r);if(!sr(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||!sr(a.rect))return;let o=sp(e,t,a.rect,n,i);if(!sr(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)=>sn(e.overlayRect)-sn(t.overlayRect))){let e=t.findIndex(e=>void 0!==e.label&&e.label===r.label&&(si(e.overlayRect,r.overlayRect)||si(r.overlayRect,e.overlayRect)));if(-1===e){t.push(r);continue}sn(r.overlayRect)<sn(t[e].overlayRect)&&(t[e]=r)}return t})([...a.values()]).sort(sM).slice(0,n.maxRefs??24).sort(sx).map(e=>({ref:e.ref,label:e.label,rect:e.rect,overlayRect:e.overlayRect,center:e4(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)sA(e,t.x,t.x+t.width-1,t.y+n,r),sA(e,t.x,t.x+t.width-1,t.y+t.height-1-n,r),s_(e,t.x+n,t.y,t.y+t.height-1,r),s_(e,t.x+t.width-1-n,t.y,t.y+t.height-1,r)})(i=r,(a=e).overlayRect,sa),function(e,t,r){let n=6+5*r.length+ +Math.max(0,r.length-1),i=sI(t.x,0,Math.max(0,e.width-n)),a=t.y-11-2,o=a>=0?a:sI(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)sb(e,t+o,r+a,i)})(e,i,o,n,so),function(e,t,r,n,i){let a=t;for(let t of n.toLowerCase()){let n=sc[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]&&sb(e,a+o,r+t,i);a+=6}}(e,i+3,o+2,r,ss)}(i,a.overlayRect,a.ref)}return await s.writeFile(e.screenshotPath,await eu(r)),n}function sp(e,t,r,n,i){if("android"===e.backend||!t)return sS(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 sS({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 sf(e){let t=[e.type,e.role,e.subrole].map(e=>ty(e??"")).join(" ");return sd.some(e=>t.includes(e))}function sm(e){let t=[e.type,e.role,e.subrole].map(e=>ty(e??"")).join(" ");return t.includes("application")||t.includes("window")}function sh(e){return!!(e?.rect&&sr(e.rect)&&!sm(e))}function sw(e){if("string"!=typeof e)return!1;let t=e.trim();return!(!t||/^(true|false)$/i.test(t))}function sg(e){var t;let r;return!!sw(e)&&(t=e,"toolbar"!==(r=t?.trim().toLowerCase())&&"window"!==r&&"application"!==r&&r?.startsWith("vertical scroll bar")!==!0)}function sv(e){var t;return"string"==typeof e&&!!sg(e)&&(t=e,!/^[a-z0-9_.]+:id\/[a-z0-9_.-]+$/i.test(t.trim()))}function sy(e){let t=[e.label,e.value].find(sg);return t?t.trim():sv(e.identifier)?e.identifier.trim():void 0}function sS(e,t,r){let n=sI(e.x,0,Math.max(0,t-1)),i=sI(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:sI(e.width,1,a),height:sI(e.height,1,o)}}function sI(e,t,r){return Number.isFinite(e)?Math.max(t,Math.min(r,e)):t}function sA(e,t,r,n,i){for(let a=t;a<=r;a+=1)sb(e,a,n,i)}function s_(e,t,r,n,i){for(let a=r;a<=n;a+=1)sb(e,t,a,i)}function sb(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 sx(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 sM(e,t){return t.score!==e.score?t.score-e.score:sx(e,t)}function sN(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 sD=new WeakMap;function sk(e){if(!e)return;let t=sD.get(e);if(t)return t;let r=sP(e.nodes??[]);if(r)return sD.set(e,r),r}let sP=z,sE={referenceWidth:1e3,referenceHeight:1e3};function sC(e,t,r,n,i={},a=Date.now(),o=Date.now()){var s,l,d,c,u,p,f,m,h;let w,g,v,y=e.recording;if(!y)return;let S={...i,...n??{}},I=sG(S.effectiveDurationMs)??sG(S.durationMs),A={recordingStartedAt:y.startedAt,gestureClockOriginAtMs:y.gestureClockOriginAtMs,gestureClockOriginUptimeMs:y.gestureClockOriginUptimeMs,runnerStartedAtUptimeMs:"ios-device-runner"===y.platform?y.runnerStartedAtUptimeMs:void 0,gestureStartUptimeMs:sG(S.gestureStartUptimeMs),gestureEndUptimeMs:sG(S.gestureEndUptimeMs),fallbackStartedAtMs:a,fallbackFinishedAtMs:o},_="number"==typeof(s={gestureStartUptimeMs:sG(S.gestureStartUptimeMs),gestureEndUptimeMs:sG(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===sG(S.gestureStartUptimeMs)&&function(e,t){switch(e){case"click":case"fill":case"focus":return!0;case"press":{let e=sq(sG(t.count),1)??1,r=!0===t.doubleTap,n=sq(sG(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 sN(e);let r=Math.min(Math.max(.15*t,120),260);return Math.max(0,e.fallbackFinishedAtMs-r-e.recordingStartedAt)}({...A,gestureDurationMs:_}):sN(A),x=(l=e.snapshot,w=sG((d=S).referenceWidth),g=sG(d.referenceHeight),void 0!==w&&w>0&&void 0!==g&&g>0?{referenceWidth:w,referenceHeight:g}:sk(l)),M=(c=t,u=r,p=S,f=b,m=_,h=x,v=sR[c],v?.(u,p,f,m,h)??[]);0!==M.length&&(y.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 sR={click:(e,t,r,n,i)=>sO(e,t,r,i),press:(e,t,r,n,i)=>sO(e,t,r,i),"react-native":(e,t,r,n,i)=>"dismiss-overlay"===e[0]?sO(e,t,r,i):[],fill:(e,t,r,n,i)=>sT(e,t,r,i),focus:(e,t,r,n,i)=>sT(e,t,r,i),longpress:function(e,t,r,n,i){let a=sj(t,e);if(!a)return[];let{x:o,y:s}=a;return[sF(r,o,s,sH(n,[sG(t.durationMs),sG(e[2])],800),i)]},scroll:function(e,t,r,n,i){let a=sV(t,e),o=sU(t.contentDirection)??sU(t.direction);if(!a||!o)return[];let{x1:s,y1:l,x2:d,y2:c}=a,u=sH(n,[],250),p=sG(t.amount)??sG(e[1]),f=sG(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:sL,fling:sL,swipe:sL,pinch:function(e,t,r,n,i){let a=sj(t,e,1),o=sG(t.scale)??sG(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:sH(n,[],280)}]}};function sO(e,t,r,n){let i=sj(t,e);if(!i)return[];let{x:a,y:o}=i,s=sq(sG(t.count),1)??1,l=sq(sG(t.intervalMs),0)??0,d=!0===t.doubleTap,c=sq(sG(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(sF(t,a,o,c,n));continue}u.push(s$(t,a,o,n)),d&&u.push(s$(t+90,a,o,n))}return u}function sT(e,t,r,n){let i=sj(t,e);if(!i)return[];let{x:a,y:o}=i;return[s$(r,a,o,n)]}function sL(e,t,r,n,i){let a=sV(t,e);if(!a)return[];let{x1:o,y1:s,x2:l,y2:d}=a,c=sH(n,[sG(t.effectiveDurationMs),sG(t.durationMs),sG(e[4])],250),u=sq(sG(t.count),1)??1,p=sq(sG(t.pauseMs),0)??0,f="ping-pong"===t.pattern?"ping-pong":"one-way";return Array.from({length:u},(e,t)=>{var n,a,u,m,h,w,g,v,y,S,I,A,_;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),v=x,y=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"}(v,y,S,I,_=i))?{kind:b,tMs:g,x:v,y,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"}(v,S,_)}:{kind:b,tMs:g,x:v,y,x2:S,y2:I,..._,durationMs:A}})}function s$(e,t,r,n){return{kind:"tap",tMs:e,x:t,y:r,...n}}function sF(e,t,r,n,i){return{kind:"longpress",tMs:e,x:t,y:r,...i,durationMs:n}}function sU(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 sG(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 sq(e,t){if(void 0===e)return;let r=Math.floor(e);return r>=t?r:void 0}function sj(e,t,r=0){let n=sG(e.x)??sG(t[r]),i=sG(e.y)??sG(t[r+1]);if(void 0!==n&&void 0!==i)return{x:n,y:i}}function sV(e,t){let r=sB(e.x1,e.x,t[0]),n=sB(e.y1,e.y,t[1]),i=sB(e.x2,t[2]),a=sB(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 sB(...e){return e.map(sG).find(e=>void 0!==e)}function sH(e,t,r){return sq(e,1)??t.map(e=>sq(e,1)).find(e=>void 0!==e)??r}let sK={pan:"pan",fling:"fling",swipe:"swipe-preset",pinch:"pinch",rotate:"rotate-gesture",transform:"transform-gesture"};async function sX(e){var t,r,n,i,a,o,s;let l,d,c,u,p,{req:f,session:m,logPath:h,sessionStore:w,contextFromFlags:g}=e,v=function(e){if("pan"===e.command||"fling"===e.command||"rotate-gesture"===e.command||"transform-gesture"===e.command)return{ok:!1,message:"Use gesture pan, gesture fling, gesture swipe, gesture rotate, or gesture transform."};if("gesture"!==e.command)return{ok:!0,platformCommand:e.command,dispatchRequest:e,recordedCommand:e.command};let[t,...r]=e.positionals??[],n=t?sK[t]:void 0;return n?{ok:!0,platformCommand:n,dispatchRequest:{...e,command:n,positionals:r},recordedCommand:e.command}:{ok:!1,message:tg}}(f);if(!v.ok)return{ok:!1,error:{code:"INVALID_ARGS",message:v.message}};let{platformCommand:y,dispatchRequest:S,recordedCommand:I}=v,A=await sz(m,y);if(A)return A;let _=await sW(m,y);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 sJ({session:m,sessionName:e.sessionName,logPath:h,command:y,request:S,positionals:b,out:x,dispatchContext:k}),E=await sW(m,y,"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===y?M:f.positionals??[],O=I===y?N:f.flags??{};return function(e){let{session:t,sessionStore:r,command:n,recordedCommand:i,resolvedPositionals:a,recordedPositionals:o,recordedFlags:s,data:l,actionStartedAt:d,actionFinishedAt:c,flags:u}=e,p=function(e,t,r,n){if("scroll"!==t)return n;let i=sk(e.snapshot),a={...n??{}},o=sU(a.direction)??sU(r[0]);if(!o)return n;let s=sG(a.amount)??sG(r[1]),l=sG(a.pixels),d=sV(a,[]),c=sG(a.referenceWidth),u=sG(a.referenceHeight),p=void 0!==c&&c>0&&void 0!==u&&u>0?{referenceWidth:c,referenceHeight:u}:i??sE;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);sC(t,n,a,p,u,d,c),r.recordAction(t,{command:i,positionals:o,flags:s,result:l??{}})}({session:m,sessionStore:w,command:y,recordedCommand:I,resolvedPositionals:b,recordedPositionals:R,recordedFlags:O,data:P,actionStartedAt:D,actionFinishedAt:C,flags:f.flags??{}}),aD(y)&&ax(m,y),aU(m,y,b,f.flags),{ok:!0,data:P??{}}}async function sW(e,t,r="before-command"){if("android"!==e.device.platform||nw(t)?.androidBlockingDialogGuard!==!0)return{status:"clear"};try{return await oQ({session:e,command:t,phase:r})}catch(e){return{response:{ok:!1,error:eN(e)}}}}async function sz(e,t){if(!iD(t,e.device)){var r;let n=(r=e.device,iN[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 oY({session:e})).status?{ok:!1,error:{code:"COMMAND_FAILED",message:"Android system dialog blocked the recording session"}}:null}async function sJ(e){var t;let{session:r,command:n,request:i,positionals:a,out:o,dispatchContext:s}=e;if("screenshot"!==n)return await io(r.device,n,a,o,{...s});let l=await oy({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=op(await oa({device:e.device,session:e,flags:n,logPath:r,snapshotScope:void 0}),n);og(e,i);let a=await su({screenshotPath:t.path,snapshot:i});t.overlayRefs=a}let sY=ln(()=>import("./lease.js")),sQ=ln(()=>import("./session.js").then(e=>e.session_namespaceObject)),s0=ln(()=>import("./snapshot.js").then(e=>e.snapshot_namespaceObject)),s1=ln(()=>import("./react-native.js")),s2=ln(()=>import("./record-trace.js")),s3=ln(()=>import("./find.js")),s4=ln(()=>import("./interaction.js").then(e=>e.interaction_namespaceObject));async function s5(e){var t;switch(t=e.req.command,nw(t)?.route??"generic"){case"lease":return await s6(e);case"session":return await s8(e);case"snapshot":return await s9(e);case"reactNative":return await s7(e);case"recordTrace":return await le(e);case"find":return await lt(e);case"interaction":return await lr(e);case"generic":return null}}async function s6(e){let{handleLeaseCommands:t}=await sY();return li(e.req.command,"lease",await t({req:e.req,leaseRegistry:e.leaseRegistry}))}async function s8(e){let{handleSessionCommands:t}=await sQ();return li(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 s9(e){let{handleSnapshotCommands:t}=await s0();return li(e.req.command,"snapshot",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore}))}async function s7(e){let{handleReactNativeCommands:t}=await s1();return li(e.req.command,"react-native",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,contextFromFlags:e.contextFromFlags}))}async function le(e){let{handleRecordTraceCommands:t}=await s2();return li(e.req.command,"record-trace",await t({req:e.req,sessionName:e.sessionName,sessionStore:e.sessionStore,logPath:e.logPath}))}async function lt(e){let{handleFindCommands:t}=await s3();return li(e.req.command,"find",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,invoke:e.invoke}))}async function lr(e){let{handleInteractionCommands:t}=await s4();return li(e.req.command,"interaction",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,contextFromFlags:e.contextFromFlags}))}function ln(e){let t;return()=>t??=e()}function li(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 la=new h;async function lo(e,t,r){let n=la.getStore()??[];if(n.some(r=>r.locks===e&&r.key===t))return await r();let i=(e.get(t)??Promise.resolve()).catch(()=>{}).then(()=>la.run([...n,{locks:e,key:t}],r));return e.set(t,i),i.finally(()=>{e.get(t)===i&&e.delete(t)})}function ls(e){let t=e.device.platform,r=e.device.name.trim(),n=e.device.id;return`${t} device "${r}" (${n})`}function ll(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 ld(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 lc(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 lu="default";function lp(e){return e.session||lu}function lf(e){if(e.meta?.sessionExplicit===!0||(e.session||lu)!==lu||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 lm(e,t){return!t||e.sessionScope?.kind===t.kind&&e.sessionScope.id===t.id}function lh(e,t){let r=lf(e);return!!r&&!!t.sessionScope&&!lm(t,r)}function lw(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 lg(e,t){var r,n,i,a,o,s,l,d,c,u,p;let f,m,h,w=e.meta?.lockPolicy;if(!w)return e;let g={...e.flags??{}},v=(r=e.command,nw(r)?.lockPolicySelectorOverride===!0),y=v?[]:t?ld(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 ly(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 ly(e)}}(r,t)){let r=t[n];nd(r)&&e.push({key:n,value:r})}}(f,n,m)),f),S=e.meta?.lockPlatform;if(0===y.length){return c=v,u=t,p=g,!S||u||void 0!==p.platform||c&&nc(p,nl)||(g.platform=S),{...e,flags:g}}if("strip"===w)return function(e,t,r,n){if(n){lv(e,t),e.platform=n.device.platform;return}lv(e,t),r&&void 0===e.platform&&(e.platform=r)}(g,y,S,t),{...e,flags:g};throw new eD("INVALID_ARGS",function(e,t,r){let n=t.map(lc).join(", ");if(r)return`${e.command} is already bound to session "${r.name}" on ${ls(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(lc),hint:function(e,t){if(t)return ll(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 lv(e,t){for(let r of t)delete e[r.key]}function ly(e){throw Error(`Unhandled lock platform: ${String(e)}`)}async function lS(e){var t,r;let{req:n,sessionName:i,sessionStore:a}=e,o=a.get(i);if(o)return[lI(o.device.id)];let s=new Set([(t=i,`session:${t}`)]),l=function(e){if(!e.meta?.lockPolicy)return e;try{return lg(e)}catch{return e}}(n);if("open"===(r=l).command||nc(r.flags,ns))try{let e=await r7(l.flags??{});s.add(lI(e.id))}catch{}return Array.from(s).sort((e,t)=>{let r=lA(e)-lA(t);return 0!==r?r:e.localeCompare(t)})}function lI(e){return`device:${e}`}function lA(e){return+!e.startsWith("session:")}function l_(e,t={}){let r=e8(t.simulatorSetPath);return r?["simctl","--set",r,...e]:["simctl",...e]}function lb(e,t){return"ios"!==e.platform||"simulator"!==e.kind?["simctl",...t]:l_(t,{simulatorSetPath:e.simulatorSetPath})}function lx(e,t,r){return ij(lb(e,t),r)}let lM="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 lN(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 lD(e){return!(e instanceof eD)||"COMMAND_FAILED"!==e.code||!String(e.message??"").toLowerCase().includes("xcodebuild exited early")}function lk(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 lP(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}
|
|
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 v}from"node:timers/promises";import{resolveUserPath as y}from"./9612.js";import{SCREENSHOT_ACTION_FLAG_KEYS as S,SCROLL_DIRECTIONS as b,parseScrollDirection as A,isStringMember as I,isReactNativeCollapsedWarningWrapperWithVisibleBanner as _,deriveMobileSnapshotHiddenContentHints as x,resolveClickButton as M,inferVerticalScrollIndicatorDirections as N,parsing_stripUndefined as D,withSuccessText as k,runScrollEdgePasses as P,splitNonEmptyTrimmedLines as E,annotateCoveredSnapshotNodes as C,parseSwipePreset as O,analyzeReactNativeOverlay as R,readLocationCoordinate as T,getClickButtonValidationError as L,areRectsApproximatelyEqual as $,isSystemScrollIndicatorLabel as F,formatScrollEdgeMessage as U,SWIPE_PATTERNS as G,successText as q,screenshotOptionsFromFlags as j,captureScrollEdgeState as V,normalizeSnapshotTree as B,isReactNativeCollapsedWarningWrapperCandidate as H,screenshotFlagsFromOptions as K,snapshotCaptureAnnotationsFrom as X,parseStringMember as W,requireIntInRange as z,inferGestureReferenceFrame as J,parseDeviceRotation as Z,buildScrollGesturePlan as Y,buildSwipePresetGesturePlan as Q}from"./9873.js";import{withDiagnosticsScope as ee,getDiagnosticsMeta as et,flushDiagnosticsToSessionFile as er,withDiagnosticTimer as en,updateDiagnosticsScope as ei,emitDiagnostic as ea}from"./432.js";import{findMistargetedTypeRefToken as eo,isKeyboardAction as es,formatScriptArg as el,encodePngAsync as ed,acquireProcessLock as ec,terminatePngWorker as eu,appendScriptSeriesFlags as ep,decodePngAsync as ef,formatScriptStringLiteral as em,formatPortableActionLine as eh,createAgentDevice as ew,localCommandPolicy as eg,isTouchTargetCommand as ev,mapManagedAgentBrowserError as ey,resolveAgentBrowserTool as eS,isClickLikeCommand as eb,prewarmPngWorker as eA}from"./368.js";import{readProcessStartTime as eI,readProcessCommand as e_,resolveRuntimeTransportHints as ex,isProcessGroupAlive as eM,isAgentDeviceDaemonProcess as eN,isProcessAlive as eD}from"./5628.js";import{toAppErrorCode as ek,asAppError as eP,normalizeError as eE,AppError as eC}from"./733.js";import{runCmdBackground as eO,runCmdStreaming as eR,runCmd as eT,runCmdSync as eL,resolveExecutableOverridePath as e$,whichCmd as eF}from"./8875.js";import{consumeTextLines as eU,serializeDaemonResponseEnvelope as eG,normalizeTenantId as eq,shouldStreamRequestProgress as ej,resolveDaemonPaths as eV,resolveSessionIsolationMode as eB,shellQuoteIfNeeded as eH,resolveDaemonServerMode as eK,recordSnapshotTiming as eX,resolveDaemonCodeSignature as eW,serializeDaemonProgressEnvelope as ez,serializeDaemonRpcResponseEnvelope as eJ}from"./2892.js";import{sleep as eZ}from"./5560.js";import{isApplePlatform as eY,resolveAppleSimulatorSetPathForSelector as eQ,normalizePlatformSelector as e0,resolveDevice as e1,resolveApplePlatformName as e2,matchesPlatformSelector as e3}from"./5910.js";import{runAndroidAdb as e5,resolveIosSimulatorDeviceSetPath as e4,getAndroidBlockingDialogFocus as e6,withRetry as e8,Deadline as e9,isEnvTruthy as e7,openAndroidApp as te,classifyBootFailure as tt,streamAndroidLogcatWithAdb as tr,bootFailureHint as tn,androidDeviceForSerial as ti,parseSerialAllowlist as ta,retryWithPolicy as to,getAndroidAppState as ts,classifyAndroidAppTarget as tl,captureAndroidLogcatWithAdb as td,resolveAndroidSerialAllowlist as tc,isDeepLinkTarget as tu,formatAndroidInstalledPackageRequiredMessage as tp}from"./3340.js";import{PUBLIC_COMMANDS as tf,INTERNAL_COMMANDS as tm,GESTURE_SUBCOMMAND_ERROR as th}from"./2133.js";import{findNearestAncestor as tw,normalizeType as tg,pruneGroupNodes as tv,findNodeByLabel as ty,resolveRefLabel as tS}from"./9836.js";import{snapshotPresentationOptionsFromFlags as tb,normalizeRef as tA,findNodeByRef as tI,buildSnapshotPresentationKey as t_,centerOfRect as tx,attachRefs as tM}from"./4291.js";import{isScrollableType as tN}from"./6024.js";import{readVersion as tD,findProjectRoot as tk}from"./7244.js";import{resolveAndroidAdbProvider as tP,resolveAndroidAdbExecutor as tE}from"./2954.js";import{parseUiHierarchy as tC,ensureAndroidSnapshotHelper as tO,parseUiHierarchyTree as tR,captureAndroidSnapshotWithHelper as tT,captureAndroidSnapshotWithHelperSession as tL,parseAndroidSnapshotHelperManifest as t$,forgetAndroidSnapshotHelperInstall as tF,buildUiHierarchySnapshot as tU,stopAndroidSnapshotHelperSession as tG}from"./7394.js";import{applyCommandDefaults as tq}from"./9581.js";var tj,tV,tB={};t.r(tB),t.d(tB,{IH:()=>pK,ug:()=>pX,sE:()=>p$,Bx:()=>pU,hQ:()=>pF,WX:()=>pH,Co:()=>pq,wg:()=>pB,withAppLogProvider:()=>pR});var tH={};t.r(tH),t.d(tH,{IO:()=>an,LB:()=>ar,xY:()=>aa,eN:()=>ai,runMacOsPressAction:()=>al,runMacOsReadTextAction:()=>as,rR:()=>ad,r5:()=>ao});var tK={};t.r(tK),t.d(tK,{bu:()=>dF,abortAllIosRunnerSessions:()=>c6,hv:()=>c2,Nr:()=>uO,gE:()=>uC,FS:()=>dL,runIosRunnerCommand:()=>uE,stopAllIosRunnerSessions:()=>c8,yA:()=>c4});var tX={};t.r(tX),t.d(tX,{v:()=>uc,M:()=>uu,withAppleRunnerProvider:()=>up});var tW={};t.r(tW),t.d(tW,{ensureBootedSimulator:()=>hl,SA:()=>hc,EB:()=>ho,N3:()=>hd});var tz={};t.r(tz),t.d(tz,{qx:()=>iX,Ly:()=>iJ,Gr:()=>iH,vT:()=>iW,Cc:()=>iz,withAppleToolProvider:()=>iK});var tJ={};t.r(tJ),t.d(tJ,{readLinuxTextAtPoint:()=>ak,r:()=>aD});var tZ={};function tY(e){return e.replace(/[^a-zA-Z0-9._-]/g,"_")}t.r(tZ),t.d(tZ,{uK:()=>af,nE:()=>ah,withLinuxToolProvider:()=>am});let tQ=["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 t0(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 t1(e){let t=new Set,r=[];for(let n of e)t.has(n)||(t.add(n),r.push(n));return r}class t2{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&&t3(e.command))return eb(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=t0(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(!t3(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=${em(t.device.name)}${i} theme=unknown`),r))e.flags?.noRecord||n.push(function(e){var t,r;let n=(t=[e.command],r=e,eb(r.command)?function(e,t){let r=t.positionals?.[0];if(r){if(r.startsWith("@"))return e.push(el(r)),t5(e,t),ep(e,t),e.join(" ");if(1===t.positionals.length)return e.push(el(r)),ep(e,t),e.join(" ")}}(t,r):"fill"===r.command?function(e,t){let r=t.positionals?.[0];if(!r?.startsWith("@"))return;e.push(el(r)),t5(e,t);let n=t.positionals.slice(1).join(" ");return t.positionals.length>1&&e.push(el(n)),ep(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(el(r)),e.push(el(n)),n.startsWith("@")&&t5(e,t),e.join(" ")}(t,r):void 0);return n||eh(e)}(e));return`${n.join("\n")}
|
|
2
|
+
`}(e);return a.writeFileSync(t,n),{written:!0,path:t}}catch(r){return ea({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 y(e.saveScriptPath,{cwd:void 0});a.existsSync(this.sessionsDir)||a.mkdirSync(this.sessionsDir,{recursive:!0});let t=tY(e.name),r=new Date(e.createdAt).toISOString().replace(/[:.]/g,"-");return i.join(this.sessionsDir,`${t}-${r}.ad`)}}function t3(e){return ev(e)||"fill"===e||"get"===e}function t5(e,t){let r=t.result?.refLabel;"string"==typeof r&&r.trim().length>0&&e.push(el(r))}class t4{sessions=new Map;runtimeHints=new Map;sessionsDir;scriptWriter;constructor(e){this.sessionsDir=e,this.scriptWriter=new t2(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=y(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 tQ)void 0!==e[r]&&(t[r]=e[r]);return t}(t.flags),result:t.result}),ea({level:"debug",phase:"record_action",data:{command:t.command,session:e.name}}))}writeSessionLog(e){let t=this.scriptWriter.write(e);t.written&&ea({level:"info",phase:"session_script_written",data:{session:e.name,path:t.path}})}defaultTracePath(e){let t=tY(e.name),r=new Date().toISOString().replace(/[:.]/g,"-");return i.join(this.sessionsDir,`${t}-${r}.trace.log`)}resolveSessionDir(e){return i.join(this.sessionsDir,tY(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 y(e,{cwd:t})}}function t6(e){return i.join(e,"runner.log")}function t8(e,t){let r=tY(t&&t.length>0?t:"unknown");return i.join(e,"requests",`${r}.ndjson`)}let t9="app-log.pid";function t7(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 re(e,t){if(!e)return;let r=i.dirname(e);a.existsSync(r)||a.mkdirSync(r,{recursive:!0});let n={pid:t,startTime:eI(t)??void 0,command:e_(t)??void 0};a.writeFileSync(e,`${JSON.stringify(n)}
|
|
3
|
+
`)}function rt(e){if(e&&a.existsSync(e))try{a.unlinkSync(e)}catch{}}function rr(e,t){let n=r.createHash("sha256").update(e).digest(),i=r.createHash("sha256").update(t).digest();return r.timingSafeEqual(n,i)}let rn=new Set,ri=new Map,ra="request_canceled",ro="request canceled";function rs(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 rl(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++}}(ri);let t=new AbortController;ri.set(e,t),rn.has(e)&&t.abort()}function rd(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++}}(rn),rn.add(e),ri.get(e)?.abort())}function rc(e){e&&(rn.delete(e),ri.delete(e))}function ru(e){return!!e&&rn.has(e)}function rp(e){if(e)return ri.get(e)?.signal}function rf(){return new eC("COMMAND_FAILED",ro,{reason:ra})}function rm(e){if(ru(e))throw rf()}function rh(e){return e instanceof eC&&"COMMAND_FAILED"===e.code&&(e.details?.reason===ra||e.message===ro)}let rw=new Map;function rg(e){let t=r.randomUUID(),n=setTimeout(()=>{rv(t)},9e5);return n.unref(),rw.set(t,{artifactPath:e.artifactPath,tenantId:e.tenantId,fileName:e.fileName,deleteAfterDownload:!1!==e.deleteAfterDownload,timer:n}),t}function rv(e){let t=rw.get(e);if(t&&(clearTimeout(t.timer),rw.delete(e),t.deleteAfterDownload))try{a.rmSync(t.artifactPath,{force:!0})}catch{}}let ry=new Map;function rS(e,t){let r=ry.get(e);if(!r)throw new eC("INVALID_ARGS",`Uploaded artifact not found: ${e}`);if(r.tenantId&&r.tenantId!==t)throw new eC("UNAUTHORIZED","Uploaded artifact belongs to a different tenant");return clearTimeout(r.timer),r.artifactPath}function rb(e){let t=ry.get(e);t&&(clearTimeout(t.timer),ry.delete(e),a.rmSync(t.tempDir,{recursive:!0,force:!0}))}async function rA(e){let t=await rI(e);await eT("tar",["xf",e.archivePath,"-C",e.tempDir]);let r=i.join(e.tempDir,t);if(!a.existsSync(r))throw new eC("INVALID_ARGS",`Expected extracted bundle "${t}" not found in archive`);return r}async function rI(e){let t=await eT("tar",["-tf",e.archivePath],{allowFailure:!0});if(0!==t.exitCode)throw new eC("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 eC("INVALID_ARGS","Uploaded app bundle archive is empty");let n=r.map(r_),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 eC("INVALID_ARGS","iOS app bundle archives must contain a single top-level .app directory");throw new eC("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 eC("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 eC("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 eC("INVALID_ARGS",`Archive entry must stay inside top-level "${o}" bundle: ${a}`)}for(let t of(await eT("tar",["-tvf",e.archivePath])).stdout.split(/\r?\n/).filter(Boolean))if("l"===t[0]||"h"===t[0])throw new eC("INVALID_ARGS","Uploaded app bundle archive cannot contain symlinks or hard links");return i}function r_(e){if(e.includes("\0"))throw new eC("INVALID_ARGS",`Invalid archive entry: ${e}`);if(i.posix.isAbsolute(e))throw new eC("INVALID_ARGS",`Archive entry must be relative: ${e}`);let t=i.posix.normalize(e).replace(/^(\.\/)+/,"");if(!t||"."===t||t.startsWith("../"))throw new eC("INVALID_ARGS",`Archive entry escapes bundle root: ${e}`);return t}function rx(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 rM(l,t).finally(()=>n(e));r()}},c=()=>{i&&clearTimeout(i),i=setTimeout(()=>{let t=new eC("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 eC("INVALID_ARGS","Upload exceeds maximum size of 2147483648 bytes")):r(null,e)}});e.on("aborted",()=>{d(new eC("COMMAND_FAILED","Artifact transfer was interrupted"))}),c(),m(e,u,l).then(()=>d(),e=>d(e))})}async function rM(e,t){if(e.destroy(),!e.closed)try{await p(e,"close")}catch{}await a.promises.rm(t,{force:!0}).catch(()=>{})}async function rN(e){let t,r=e.headers["x-artifact-type"],n=e.headers["x-artifact-filename"];if(!r||!n)throw new eC("INVALID_ARGS","Missing required headers: x-artifact-type and x-artifact-filename");if("file"!==r&&"app-bundle"!==r)throw new eC("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 eC("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 eC("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 rx(e,t),{artifactPath:t,tempDir:s}}let t=i.join(s,"artifact.tar");await rx(e,t);let n=await rA({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 rD=new h,rk=new h;async function rP(e,t){return await rD.run(e,t)}function rE(e){rD.getStore()?.(e)}async function rC(e,t){return await rk.run(e,t)}function rO(){return rk.getStore()}let rR=new Set(["replay","test"]),rT=new Set(["agent_device.command","agent-device.command"]),rL=new Set(["agent_device.install_from_source","agent-device.install_from_source"]),r$=new Set(["agent_device.release_materialized_paths","agent-device.release_materialized_paths"]),rF={"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"},rU=new Set([...rT,...rL,...r$,...Object.keys(rF)]);function rG(e,t,r,n){return{jsonrpc:"2.0",id:e,error:{code:t,message:r,data:n}}}function rq(e,t,r=200){e.statusCode=r,e.setHeader("content-type","application/json"),e.end(JSON.stringify(t))}function rj(e,t){e.destroyed||(e.write(eJ(t)),e.end())}function rV(e){switch(e){case"INVALID_ARGS":return 400;case"UNAUTHORIZED":return 401;case"SESSION_NOT_FOUND":return 404;default:return 500}}function rB(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 rH(e,t){let r=e[t];return"string"==typeof r?r:void 0}function rK(e,t){let r=e[t];return Number.isInteger(r)?Number(r):void 0}function rX(e,t){let r="string"==typeof e[t]?e[t].trim():"";if(!r)throw new eC("INVALID_ARGS",`Invalid params: source.${t} is required for github-actions-artifact sources`);return r}function rW(e,t){let r=e[t],n="number"==typeof r?r:"string"==typeof r?Number(r):NaN;if(!Number.isInteger(n))throw new eC("INVALID_ARGS",`Invalid params: source.${t} must be an integer`);return n}async function rz(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=eE(new eC("UNAUTHORIZED","Request rejected by auth hook"));return{ok:!1,statusCode:401,response:rG(t.rpcRequest.id??null,-32001,e.message,e)}}if(!1===r.ok){let e=eE(new eC(ek(r.code,"UNAUTHORIZED"),r.message??"Request rejected by auth hook",r.details));return{ok:!1,statusCode:401,response:rG(t.rpcRequest.id??null,-32001,e.message,e)}}if("string"==typeof r.tenantId&&r.tenantId.length>0){let e=eq(r.tenantId);if(!e){let e=eE(new eC("INVALID_ARGS","Auth hook returned invalid tenantId"));return{ok:!1,statusCode:500,response:rG(t.rpcRequest.id??null,-32e3,e.message,e)}}return{ok:!0,tenantId:e}}return{ok:!0}}async function rJ(){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 eC("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 eC("INVALID_ARGS",`Auth hook export ${r} is not a function`,{hookPath:n,exportName:r});return a}async function rZ(e){let t=await rJ(),{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 rY(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||rq(i,rG(null,-32700,"Parse error"),400)}),e.on("end",async()=>{let n,o;try{n=JSON.parse(a)}catch{rq(i,rG(null,-32700,"Parse error"),400);return}if("2.0"!==n.jsonrpc||"string"!=typeof n.method)return void rq(i,rG(n.id??null,-32600,"Invalid Request"),400);if(!rU.has(n.method))return void rq(i,rG(n.id??null,-32601,`Method not found: ${n.method}`),404);if(!n.params||"object"!=typeof n.params)return void rq(i,rG(n.id??null,-32602,"Invalid params"),400);let s=!1;try{var l,d;let a=n.params,c=function(e,t,r){if(rT.has(e))return{token:rB(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(rL.has(e)){let e,n=rH(t,"platform");if("ios"!==n&&"android"!==n)throw new eC("INVALID_ARGS",'Invalid params: platform must be "ios" or "android"');return{token:rB(t,r),session:rH(t,"session")??"default",command:"install_source",positionals:[],flags:{platform:n},meta:{requestId:rH(t,"requestId"),installSource:function(e){let t=e.source;if(!t||"object"!=typeof t)throw new eC("INVALID_ARGS","Invalid params: source is required");if("url"===t.kind){let e="string"==typeof t.url?t.url.trim():"";if(!e)throw new eC("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 eC("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 eC("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 eC("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=rX(e,"owner"),n=rX(e,"repo"),i=void 0!==e.artifactId,a=void 0!==e.runId,o=void 0!==e.artifactName;if(i&&(a||o))throw new eC("INVALID_ARGS","Invalid params: source must specify either artifactId or artifactName, not both");if(!i&&a&&!o)throw new eC("INVALID_ARGS","Invalid params: source.artifactName is required when source.runId is specified");if(!i&&!o)throw new eC("INVALID_ARGS","Invalid params: source must specify artifactId or artifactName");return i?{kind:"github-actions-artifact",owner:r,repo:n,artifactId:rW(e,"artifactId")}:(a&&(t=rW(e,"runId")),{kind:"github-actions-artifact",owner:r,repo:n,...a?{runId:t}:{},artifactName:rX(e,"artifactName")})}(t);throw new eC("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:rK(t,"retentionMs")}}}if(r$.has(e)){let e=rH(t,"materializationId")?.trim();if(!e)throw new eC("INVALID_ARGS","Invalid params: materializationId is required");return{token:rB(t,r),session:rH(t,"session")??"default",command:"release_materialized_paths",positionals:[],meta:{requestId:rH(t,"requestId"),materializationId:e}}}let n=rF[e];if(n)return{token:rB(t,r),session:rH(t,"session")??"default",command:n,positionals:[],meta:{tenantId:rH(t,"tenantId")??rH(t,"tenant"),runId:rH(t,"runId"),leaseId:rH(t,"leaseId"),leaseTtlMs:rK(t,"ttlMs"),leaseBackend:rH(t,"backend")}};throw new eC("INVALID_ARGS",`Method not found: ${e}`)}(n.method,a,e.headers);if(l=n.method,rT.has(l)&&("string"!=typeof c.command||0===c.command.length))return void rq(i,rG(n.id??null,-32602,"Invalid params: command is required"),400);o=rs(c.meta?.requestId,n.id),c.meta={...c.meta,requestId:o},rl(o);let u=await rz(t,{headers:e.headers,rpcRequest:n,daemonRequest:c});if(!u.ok)return void rq(i,u.response,u.statusCode);u.tenantId&&(c.meta={...c.meta,tenantId:u.tenantId,sessionIsolation:c.meta?.sessionIsolation??c.flags?.sessionIsolation??"tenant"});let p=(d=c,d.flags?.platform!=="android"&&(d.flags?.platform==="ios"||rR.has(d.command))),f=!1,m=()=>{s||i.writableFinished||f||(f=!0,rd(o),ea({level:"warn",phase:"request_client_disconnected",data:{requestId:o,abortIosRunnerSessions:p}}),p&&r0(o))};if(e.on("aborted",m),i.on("close",()=>{i.headersSent&&m()}),(e.aborted||i.destroyed&&i.headersSent)&&m(),ej(c)){i.statusCode=200,i.setHeader("content-type","application/x-ndjson");let e=await rP(e=>{!i.destroyed&&i.write(ez(e))},async()=>await r(c));s=!0;let t=e.ok?{jsonrpc:"2.0",id:n.id??null,result:e}:rG(n.id??null,-32e3,e.error.message,e.error);rj(i,t);return}let h=await r(c);if(s=!0,h.ok)return void rq(i,{jsonrpc:"2.0",id:n.id??null,result:h});rq(i,rG(n.id??null,-32e3,h.error.message,h.error),rV(h.error.code))}catch(t){s=!0;let e=eE(t);if(i.headersSent)return void rj(i,rG(n.id??null,-32e3,e.message,e));rq(i,rG(n.id??null,-32e3,e.message,e),rV(e.code))}finally{rc(o)}})})}async function rY(e,t,n,i){try{var a;let o,s,l=await r1({req:e,res:t,authHook:n,expectedToken:i,daemonRequest:{command:"upload",positionals:[]}});if(!l)return;let d=await rN(e),c=(a={artifactPath:d.artifactPath,tempDir:d.tempDir,tenantId:l.tenantId},o=r.randomUUID(),(s=setTimeout(()=>{rb(o)},3e5)).unref(),ry.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){r2(t,eE(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 r1({req:e,res:t,authHook:r,expectedToken:n,daemonRequest:{command:"download_artifact",positionals:[i]}});if(!o)return;let s=function(e,t){let r=rw.get(e);if(!r)throw new eC("INVALID_ARGS",`Artifact not found: ${e}`);if(r.tenantId&&r.tenantId!==t)throw new eC("UNAUTHORIZED","Artifact belongs to a different tenant");if(!a.existsSync(r.artifactPath))throw rv(e),new eC("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=eE(e);t.statusCode=rV(r.code),t.end(r.message)}}),t.on("close",()=>{t.writableFinished&&rv(i)}),l.pipe(t)}catch(e){r2(t,eE(e))}}async function r0(e){try{let t=Date.now()+15e3;for(;ru(e)&&Date.now()<t;){let{abortAllIosRunnerSessions:t}=await Promise.resolve(tK);if(await t(),!ru(e))break;await eZ(200)}}catch(e){ea({level:"error",phase:"request_client_disconnect_abort_failed",data:{message:e instanceof Error?e.message:String(e)}})}}async function r1(e){var t,r;let{req:n,res:i,authHook:a,expectedToken:o,daemonRequest:s}=e,l=rB({},n.headers),d=(t=l,!(r=o)||rr(t,r)?null:eE(new eC("UNAUTHORIZED","Invalid token")));if(d)return r2(i,d),null;let c=await rz(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 r2(e,t){e.statusCode=rV(t.code),e.setHeader("content-type","application/json"),e.end(JSON.stringify({ok:!1,error:t.message,code:t.code}))}function r3(e){if(!e)return;let t=e.trim();if(t&&/^[a-zA-Z0-9._-]{1,128}$/.test(t))return t}function r5(e){if(!e)return;let t=e.trim();if(t&&/^[a-f0-9]{16,128}$/i.test(t))return t.toLowerCase()}function r4(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 eC("INVALID_ARGS",`Unsupported lease backend: ${e??""}`)}class r6{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=r4(e.backend),n=eq(e.tenantId);if(!n)throw new eC("INVALID_ARGS","Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");let i=r3(e.runId);if(!i)throw new eC("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=r5(e.leaseId);if(!t)throw new eC("INVALID_ARGS","Invalid lease id.");this.cleanupExpiredLeases();let r=this.leases.get(t);if(!r)throw new eC("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=r5(e.leaseId);if(!t)throw new eC("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=r4(e.backend),r=eq(e.tenantId);if(!r)throw new eC("INVALID_ARGS","tenant isolation requires tenant id.");let n=r3(e.runId);if(!n)throw new eC("INVALID_ARGS","tenant isolation requires run id.");let i=r5(e.leaseId);if(!i)throw new eC("INVALID_ARGS","tenant isolation requires lease id.");this.cleanupExpiredLeases();let a=this.leases.get(i);if(!a)throw new eC("UNAUTHORIZED","Lease is not active",{reason:"LEASE_NOT_FOUND"});if(a.backend!==t||a.tenantId!==r||a.runId!==n)throw new eC("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 eC("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 eC("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=eq(t),i=r3(r);if(t&&!n)throw new eC("INVALID_ARGS","Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");if(r&&!i)throw new eC("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 eC("UNAUTHORIZED","Lease does not match tenant/run scope",{reason:"LEASE_SCOPE_MISMATCH"})}}let r8={platform:"web",id:"agent-browser-chrome",name:"Agent Browser Chrome",kind:"device",target:"desktop",booted:!0};async function r9(e){var t;if("web"===e.platform)return[r8];if("macos"===(t=e).platform||"apple"===t.platform&&"desktop"===t.target){let{listMacosDevices:e}=await import("./devices~2.js");return await e()}if("linux"===e.platform){let{listLinuxDevices:e}=await import("./devices~1.js");return await e()}if("android"===e.platform){let{listAndroidDevices:t}=await import("./3340.js");return await t({serialAllowlist:e.androidSerialAllowlist?new Set(e.androidSerialAllowlist):void 0})}if(e.platform){let{listAppleDevices:t}=await import("./devices.js");return await t({simulatorSetPath:e.iosSimulatorSetPath,udid:e.udid})}let r=[];try{let{listAndroidDevices:t}=await import("./3340.js");r.push(...await t({serialAllowlist:e.androidSerialAllowlist?new Set(e.androidSerialAllowlist):void 0}))}catch{}try{let{listAppleDevices:t}=await import("./devices.js");r.push(...await t({simulatorSetPath:e.iosSimulatorSetPath,udid:e.udid}))}catch{}try{let{listLinuxDevices:e}=await import("./devices~1.js");r.push(...await e())}catch{}return r}let r7=new h,ne=new h;async function nt(e,t,r){var n,i;let a=await nr(e,t,r);if(n=t,i=a,!nn(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 eC("DEVICE_NOT_FOUND","No devices found",{selector:t})}async function nr(e,t,r){try{return await e1(e,t,r)}catch(e){var n;if(n=e,!nn(t)&&n instanceof eC&&"DEVICE_NOT_FOUND"===n.code)return;throw e}}function nn(e){return!!(e.udid||e.serial||e.deviceName)}async function ni(e){let t=e0(e.platform),r=eQ({simulatorSetPath:e4(e.iosSimulatorDeviceSet),platform:t,target:e.target}),n=tc(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 en("resolve_target_device",async()=>{let o=function(e){let t=r7.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 eC("INVALID_ARGS","Device target selector requires --platform. Use --platform ios|macos|android|linux|apple with --target mobile|tv|desktop.");let l=await nd({...s,iosSimulatorSetPath:r,androidSerialAllowlist:n?Array.from(n).sort():void 0});if(l)return nc(s)?nu(i,await nt(l,s,{simulatorSetPath:r})):nu(i,await e1(l,s,{simulatorSetPath:r}));let d=await r9({...s,iosSimulatorSetPath:r,androidSerialAllowlist:n?Array.from(n).sort():void 0});return nc(s)?nu(i,await nt(d,s,{simulatorSetPath:r})):nu(i,await e1(d,s,{simulatorSetPath:r}))},a)}async function na(e){return r7.getStore()?await e():await r7.run(new Map,e)}async function no(e,t){return e?await ne.run(e,t):await t()}async function ns(e,t){return await no(e,async()=>await na(t))}async function nl(e){return await nd(e)??await r9(e)}async function nd(e){let t=ne.getStore();if(!t)return null;let r=await t(e);return null==r?null:r.map(e=>({...e}))}function nc(e){return eY(e.platform)}function nu(e,t){return r7.getStore()?.set(e,{...t}),t}let np=["platform","target","device","udid","serial"],nf=[...np,"iosSimulatorDeviceSet","androidDeviceAllowlist"];function nm(e){return"string"==typeof e&&e.trim().length>0}function nh(e,t){return!!e&&t.some(t=>nm(e[t]))}let nw={leaseAdmissionExempt:!0,sessionExecutionLockExempt:!0,selectorValidationExempt:!0},ng=function(e){let t=new Map;for(let r of e){if(t.has(r.command))throw Error(`Duplicate daemon command descriptor: ${r.command}`);t.set(r.command,r)}return{descriptorsByCommand:t}}([...nS("lease",{leaseAdmissionExempt:!0,sessionExecutionLockExempt:!0},tm.leaseAllocate,tm.leaseHeartbeat,tm.leaseRelease),ny(tm.sessionList,"session",{sessionKind:"inventory",...nw}),ny(tf.devices,"session",{sessionKind:"inventory",lockPolicySelectorOverride:!0,...nw}),ny(tf.apps,"session",{sessionKind:"inventory",lockPolicySelectorOverride:!0,preferExplicitDeviceOverExistingSession:!0}),...nS("session",{sessionKind:"state"},tf.boot,tf.shutdown,tf.appState),...nS("session",{sessionKind:"observability"},tf.perf,tf.logs,tf.network),...nS("session",{sessionKind:"replay",skipSessionlessProviderDevice:function(e){return e.command===tf.test&&("number"==typeof e.flags?.shardAll||"number"==typeof e.flags?.shardSplit)}},tf.replay,tf.test),ny(tm.runtime,"session"),ny(tf.clipboard,"session",{replayScopedAction:!0}),ny(tf.keyboard,"session",{replayScopedAction:!0,androidBlockingDialogGuard:!0}),...nS("session",{},tf.install,tf.reinstall,tm.installSource),ny(tm.releaseMaterializedPaths,"session",nw),...nS("session",{},tf.push,tf.triggerAppEvent),ny(tf.open,"session",{allowSessionlessDefaultDevice:()=>!0}),...nS("session",{},tf.prepare,tf.batch),ny(tf.close,"session",{allowInvalidRecording:!0}),...nS("snapshot",{replayScopedAction:!0},tf.snapshot,tf.diff,tf.wait,tf.alert,tf.settings),ny(tf.reactNative,"reactNative",{replayScopedAction:!0}),ny(tf.record,"recordTrace",{replayScopedAction:!0,allowInvalidRecording:!0,allowSessionlessDefaultDevice:function(e){return"start"===(e.positionals?.[0]??"").toLowerCase()}}),ny(tf.trace,"recordTrace"),ny(tf.find,"find",{replayScopedAction:!0}),...nS("interaction",{replayScopedAction:!0,androidBlockingDialogGuard:!0},tf.click,tf.fill,tf.longPress,tf.press,tf.type),...nS("interaction",{replayScopedAction:!0},tf.get,tf.is),...nS("generic",{replayScopedAction:!0,androidBlockingDialogGuard:!0},tf.back,tf.gesture,tf.home,tf.rotate,tf.scroll,tf.swipe,"pinch"),ny(tf.focus,"generic",{androidBlockingDialogGuard:!0}),ny(tf.screenshot,"generic",{replayScopedAction:!0}),...nS("generic",{androidBlockingDialogGuard:!0},"pan","fling","rotate-gesture","transform-gesture")]);function nv(e){return nb(e)?.sessionKind}function ny(e,t,r={}){return{command:e,route:t,...r}}function nS(e,t,...r){return r.map(r=>ny(r,e,t))}function nb(e){return ng.descriptorsByCommand.get(e)}let nA=[{resolverKey:"androidAdbProvider",resolve(e,t){let r=e.androidAdbProvider;if(!r||"android"!==t.device.platform)return{};let n=r(t),i="function"==typeof n?n:n?.exec;return{androidAdb:{provider:n,executor:i,serial:t.device.id}}},async appendWrapper(e,t){if(!e.androidAdb?.provider)return;let{withAndroidAdbProvider:r}=await import("./2954.js");nN(t,e.androidAdb,(t,n)=>r(t,{serial:e.androidAdb?.serial??""},n))}},{resolverKey:"appleRunnerProvider",resolve(e,t){let r=e.appleRunnerProvider;return r&&eY(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(tX);nN(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&&eY(t.device.platform)?{appleTool:{provider:r(t)}}:{}},async appendWrapper(e,t){if(!e.appleTool?.provider)return;let{withAppleToolProvider:r}=await Promise.resolve(tz);nN(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(tZ);nN(t,e.linuxTool,r)}},{resolverKey:"webProvider",resolve(e,t){let r=e.webProvider;return r&&"web"===t.device.platform?{web:{provider:r(t)}}:{}},async appendWrapper(e,t){if(!e.web?.provider)return;let{withWebProvider:r}=await import("./provider.js");nN(t,e.web,r)}},{resolverKey:"appLogProvider",resolve(e,t){let r=e.appLogProvider;return r?{appLog:{provider:r(t)}}:{}},async appendWrapper(e,t){if(!e.appLog?.provider)return;let{withAppLogProvider:r}=await Promise.resolve(tB);nN(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");nN(t,e.recording,r)}}];async function nI(e,t){let r=await n_(e),n={androidAdbExecutor:r.androidAdb?.executor},i=await nM(r);return await nD(i,async()=>await t(n))}async function n_(e){var t,r,n;if(t=e.providers,!nA.some(e=>!!t[e.resolverKey]))return{};let i=await nx(e.req,e.existingSession);if(!i)return{};let a=(r=e,n=i,{req:r.req,device:n,session:r.existingSession});return nA.reduce((t,r)=>({...t,...r.resolve(e.providers,a)}),{})}async function nx(e,t){switch(function(e,t){var r;let n,i;if(t.hasExistingSession)return nb(e.command)?.preferExplicitDeviceOverExistingSession===!0&&t.hasExplicitDeviceSelector?"explicit-device":"existing-session";return(r=e,"function"==typeof(i=nb(r.command)?.skipSessionlessProviderDevice)&&i(r))?"skip":t.hasExplicitDeviceSelector?"explicit-device":"function"==typeof(n=nb(e.command)?.allowSessionlessDefaultDevice)&&n(e)?"sessionless-default-device":"skip"}(e,{hasExistingSession:!!t,hasExplicitDeviceSelector:nh(e.flags,np)})){case"existing-session":return t?.device;case"explicit-device":case"sessionless-default-device":return await ni(e.flags??{});case"skip":return}}async function nM(e){let t=[];for(let r of nA)await r.appendWrapper(e,t);return t}function nN(e,t,r){let n=t?.provider;n&&e.push(async e=>await r(n,e))}async function nD(e,t){let r=t;for(let t of[...e].reverse()){let e=r;r=async()=>await t(e)}return await r()}async function nk(e,t){switch(e.platform){case"android":{let{createAndroidInteractor:t}=await import("./android.js");return t(e)}case"linux":{let{createLinuxInteractor:e}=await import("./linux.js");return e()}case"web":{let{createWebInteractor:e}=await import("./web.js");return e()}case"ios":case"macos":{let{createAppleInteractor:r}=await import("./apple.js");return r(e,t)}default:throw new eC("UNSUPPORTED_PLATFORM",`Unsupported platform: ${e.platform}`)}}let nP=/^[A-Za-z0-9_.:-]{1,64}$/,nE="--launch-console is supported only for iOS simulator app launches",nC="--launch-console requires a direct app launch and cannot be used with URL opens",nO=[[0,0],[1,0],[0,1],[-1,0],[0,-1],[1,1],[-1,1],[1,-1],[-1,-1]];function nR(e,t){if(t<=0)return[0,0];let[r,n]=nO[e%nO.length];return[r*t,n*t]}async function nT(e,t,r){for(let n=0;n<e;n+=1)await r(n),n<e-1&&t>0&&await eZ(t)}let nL=["tap","doubleTap","longPress","drag"];function n$(e,t,r){return new eC("INVALID_ARGS",r,{stepIndex:e,kind:"string"==typeof t?t:void 0})}function nF(e,t,r,n,i,a){if(!Number.isFinite(e)||e<t||e>r)throw n$(n,i,`sequence step ${n} (${i}) ${a} must be between ${t} and ${r}`)}function nU(e,t){if(!Array.isArray(e)||0===e.length)throw new eC("INVALID_ARGS","sequence requires at least one step",{stepCount:Array.isArray(e)?e.length:0});if(e.length>20)throw new eC("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)&&nL.includes(r)))throw n$(t,e.kind,`sequence step ${t} has unsupported kind "${String(e.kind)}"; allowed: ${nL.join(", ")}`);if(!Number.isFinite(e.x)||!Number.isFinite(e.y))throw n$(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 n$(t,e.kind,`sequence step ${t} (drag) requires finite x2 and y2`);void 0!==e.durationMs&&nF(e.durationMs,0,1e4,t,e.kind,"durationMs"),void 0!==e.pauseMs&&nF(e.pauseMs,0,1e4,t,e.kind,"pauseMs")})(e,t)),{command:"sequence",steps:e,appBundleId:t}}function nG(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 eC(ek(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 nq(e,t){let{x:r,y:n}=nW(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,...q(`Long pressed (${r}, ${n})`)}}async function nj(e,t){let{x:r,y:n}=nW(t,"focus requires x y");return await e.focus(r,n),{x:r,y:n,...q(`Focused (${r}, ${n})`)}}async function nV(e,t,r){let n=eo(t[0]);if(n)throw new eC("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 eC("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,...q(is("Typed",i))}}async function nB(e,t,r){if(r?.directElementSelector)return await nH(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 eC("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,...q(is("Filled",a))}}async function nH(e,t,r,n){if(!e.fillElementSelector)throw new eC("UNSUPPORTED_OPERATION","direct element selector fill is not supported");let i=r.join(" ");if(!i)throw new eC("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??{},...q(is("Filled",i))}}async function nK(e,t,r,n){var i,a;if(n?.directElementSelector&&"ios"===e.platform)return await nX(t,n.directElementSelector);let{x:o,y:s}=nW(r,"press requires x y");if("macos"===e.platform&&n?.surface&&"app"!==n.surface)return await nz(o,s,n);let l=M(n);if("primary"!==l)return await nJ(e,o,s,l,n);let d=(a=n,{count:nY(a?.count,1,"count",1,200),intervalMs:nY(a?.intervalMs,0,"interval-ms",0,1e4),holdMs:nY(a?.holdMs,0,"hold-ms",0,1e4),jitterPx:nY(a?.jitterPx,0,"jitter-px",0,100),doubleTap:!!a?.doubleTap});return(function({doubleTap:e,holdMs:t,jitterPx:r}){if(e&&t>0)throw new eC("INVALID_ARGS","double-tap cannot be combined with hold-ms");if(e&&r>0)throw new eC("INVALID_ARGS","double-tap cannot be combined with jitter-px")}(d),i=d.count,eY(e.platform)&&i>1)?await n0(e,o,s,d,n):await n1(t,o,s,d)}async function nX(e,t){if(!e.tapElementSelector)throw new eC("UNSUPPORTED_OPERATION","direct element selector tap is not supported");let r=await e.tapElementSelector(t);return{selector:t.raw,...r??{},...q(`Tapped ${t.raw}`)}}function nW(e,t,r){let n=Number(e[0]),i=Number(e[1]);if(Number.isNaN(n)||Number.isNaN(i))throw new eC("INVALID_ARGS",t,r);return{x:n,y:i}}async function nz(e,t,r){let n=M(r);if("primary"!==n)throw new eC("UNSUPPORTED_OPERATION",`${n} click is not supported on macOS ${r.surface} sessions.`);let{runMacOsPressAction:i}=await Promise.resolve(tH);return await i(e,t,{bundleId:r.appBundleId,surface:r.surface}),{x:e,y:t,...q(ia({x:e,y:t}))}}async function nJ(e,t,r,n,i){if(function(e,t,r){let n=L({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 nZ(t,r,n);let{runIosRunnerCommand:a}=await Promise.resolve(tK);return await a(e,{command:"mouseClick",x:t,y:r,button:n,appBundleId:i?.appBundleId},n2(i)),{x:t,y:r,button:n,...q(ia({x:t,y:r,button:n}))}}async function nZ(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,...q(ia({x:e,y:t,button:r}))}}function nY(e,t,r,n,i){return z(void 0===e?t:e,r,n,i)}async function nQ(e,t,r){let n,i,{runIosRunnerCommand:a}=await Promise.resolve(tK),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,nU(t,r?.appBundleId),n2(r));n??=c,i=c;try{o=nG(c)}catch(e){throw function(e,t){if(0===t||!(e instanceof eC)||!e.details)return e;let r=e.details.failedStepIndex;if("number"!=typeof r)return e;let n=e.details.completedSteps;return new eC(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 n0(e,t,r,n,i){var a,o,s,l;let d,c,u=await nQ(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]=nR(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,...q(ia({x:t,y:r}))}}async function n1(e,t,r,n){let i;return await nT(n.count,n.intervalMs,async a=>{let[o,s]=nR(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}}),k({x:t,y:r,count:n.count,intervalMs:n.intervalMs,holdMs:n.holdMs,jitterPx:n.jitterPx,doubleTap:n.doubleTap,...i},ia({x:t,y:r}))}function n2(e){return{verbose:e?.verbose,logPath:e?.logPath,traceLogPath:e?.traceLogPath,requestId:e?.requestId,iosXctestrunFile:e?.iosXctestrunFile,iosXctestDerivedDataPath:e?.iosXctestDerivedDataPath,iosXctestEnvDir:e?.iosXctestEnvDir}}async function n3(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 eC("INVALID_ARGS","swipe requires x1 y1 x2 y2 [durationMs]");let l=r[4]?Number(r[4]):250;return await n4({device:e,interactor:t,context:n,x1:i,y1:a,x2:o,y2:s,requestedDurationMs:l})}async function n5(e,t,r,n){let i=O(r[0]),a=r[1]?Number(r[1]):300,o=J((await t.snapshot({appBundleId:n?.appBundleId})).nodes??[]);if(!o)throw new eC("COMMAND_FAILED","Cannot infer viewport for gesture swipe preset");let s=Q(i,o,{platform:e.platform});return await n4({device:e,interactor:t,context:n,x1:s.x1,y1:s.y1,x2:s.x2,y2:s.y2,requestedDurationMs:a,preset:i})}async function n4(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(!I(G,f))throw new eC("INVALID_ARGS",`Invalid pattern: ${f}`);if(eY(t.platform)&&u>1){let e=await nQ(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,...q(io(u,f))}}return await nT(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)}),k({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}`:io(u,f))}async function n6(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 eC("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??{},...q(`Panned (${r}, ${n}) by (${i}, ${a})`)}}async function n8(e,t){let r=W(b,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 eC("INVALID_ARGS","gesture fling requires direction x y [distance] [durationMs]");let a=function(e,t){if(!Number.isFinite(e)||e<=0)throw new eC("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,...q(`Flung ${r}`)}}async function n9(e,t,r){var n;let i=t[0],a=t[1]?Number(t[1]):void 0,o=r?.pixels;if(!i)throw new eC("INVALID_ARGS","scroll requires direction");if(void 0!==a&&!Number.isFinite(a))throw new eC("INVALID_ARGS","scroll amount must be a number");if(void 0!==a&&void 0!==o)throw new eC("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 P({edge:t,captureState:async n=>await n7(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 k({direction:s.direction,...s.edge?{edge:s.edge,passes:d}:{},...void 0!==a?{amount:a}:{},...void 0!==o?{pixels:o}:{},...l},U(s.direction,s.edge,d,a,o))}async function n7(e,t,r,n){if("function"!=typeof e.snapshot)throw new eC("UNSUPPORTED_OPERATION",`scroll ${r} requires snapshot support to verify hidden content before scrolling`);let i=e.snapshot;return await V({edge:r,scope:n,captureNodes:async e=>(await i({appBundleId:t?.appBundleId,scope:e})).nodes??[]})}async function ie(e,t,r,n){if("tv"===e.target)throw new eC("UNSUPPORTED_OPERATION","gesture pinch is not supported on tvOS");if("macos"===e.platform&&n?.surface&&"app"!==n.surface)throw new eC("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 eC("INVALID_ARGS","gesture pinch requires scale > 0");let s=await t.pinch(i,a,o);return{scale:i,x:a,y:o,...s,...q(`Pinched to scale ${i}`)}}async function it(e,t,r){if("tv"===e.target)throw new eC("UNSUPPORTED_OPERATION","gesture rotate is not supported on tvOS");if("macos"===e.platform)throw new eC("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 eC("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 eC("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 eC("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 eC("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,...q(`Rotated gesture ${n} degrees`)}}async function ir(e,t,r){if("tv"===e.target)throw new eC("UNSUPPORTED_OPERATION","gesture transform is not supported on tvOS");let n="ios"===e.platform&&"simulator"===e.kind;if("android"!==e.platform&&!n)throw new eC("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 eC("INVALID_ARGS","gesture transform requires x y dx dy scale degrees [durationMs]");if(a<=0)throw new eC("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,...q(`Requested transform gesture by (${i.dx}, ${i.dy}), scale ${i.scale}, rotate ${i.degrees} degrees`)}}async function ii(e,t,r){let{x:n,y:i}=nW(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(tH);return{action:"read",text:(await e(n,i,{bundleId:r.appBundleId,surface:r.surface})).text}}let{runIosRunnerCommand:a}=await Promise.resolve(tK),o=await a(e,{command:"readText",x:n,y:i,appBundleId:r?.appBundleId},{verbose:r?.verbose,logPath:r?.logPath,traceLogPath:r?.traceLogPath,requestId:r?.requestId,iosXctestrunFile:r?.iosXctestrunFile,iosXctestDerivedDataPath:r?.iosXctestDerivedDataPath,iosXctestEnvDir:r?.iosXctestEnvDir});return{action:"read",text:"string"==typeof o.text?o.text:"string"==typeof o.message?o.message:""}}function ia(e){return e.button&&"primary"!==e.button?`Clicked ${e.button} (${e.x}, ${e.y})`:`Tapped (${e.x}, ${e.y})`}function io(e,t){return e<=1?"Swiped":"ping-pong"===t?`Swiped ${e} times (ping-pong)`:`Swiped ${e} times`}function is(e,t){return`${e} ${Array.from(t).length} chars`}function il(e,t){let r,n=t?.subject??"Payload",i=e.trim();if(!i)throw new eC("INVALID_ARGS",`${n} cannot be empty`);let o=t?.expandPath?t.expandPath(i,t.cwd):i;try{if(!a.statSync(o).isFile())throw new eC("INVALID_ARGS",`${n} path is not a file: ${o}`);return{kind:"file",path:o}}catch(t){if(t instanceof eC)throw t;let e=t.code;if("EACCES"===e||"EPERM"===e)throw new eC("INVALID_ARGS",`${n} file is not readable: ${o}`);if(e&&"ENOENT"!==e)throw new eC("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 eC("INVALID_ARGS",`${n} file not found: ${o}`)}async function id(e){let t=il(e,{subject:"Push payload"}),r="inline"===t.kind?t.text:await ic(t.path);try{let e=JSON.parse(r);if(!e||"object"!=typeof e||Array.isArray(e))throw new eC("INVALID_ARGS","push payload must be a JSON object");return e}catch(t){if(t instanceof eC)throw t;throw new eC("INVALID_ARGS",`Invalid push payload JSON: ${e}`)}}async function ic(e){try{return await s.readFile(e,"utf8")}catch(r){let t=r.code;if("ENOENT"===t)throw new eC("INVALID_ARGS",`Push payload file not found: ${e}`);if("EISDIR"===t)throw new eC("INVALID_ARGS",`Push payload path is not a file: ${e}`);if("EACCES"===t||"EPERM"===t)throw new eC("INVALID_ARGS",`Push payload file is not readable: ${e}`);throw new eC("COMMAND_FAILED",`Unable to read push payload file: ${e}`,{cause:String(r)})}}async function iu(e,t,r,n,i){let a={requestId:i?.requestId,appBundleId:i?.appBundleId,verbose:i?.verbose,logPath:i?.logPath,traceLogPath:i?.traceLogPath,iosXctestrunFile:i?.iosXctestrunFile,iosXctestDerivedDataPath:i?.iosXctestDerivedDataPath,iosXctestEnvDir:i?.iosXctestEnvDir},o=await nk(e,a);return ea({level:"debug",phase:"platform_command_prepare",data:{command:t,platform:e.platform,kind:e.kind}}),await en("platform_command",async()=>await ip(e,o,t,r,n,i,a),{command:t,platform:e.platform})}async function ip(e,t,r,n,i,a,o){switch(r){case"open":return await im(e,t,n,a);case"close":{let r=n[0];if(!r)return"web"===e.platform&&await t.close(""),{closed:"session",...q("Closed session")};return await t.close(r),{app:r,...q(`Closed: ${r}`)}}case"press":return await nK(e,t,n,a);case"swipe":return await n3(e,t,n,a);case"swipe-preset":return await n5(e,t,n,a);case"pan":return await n6(t,n);case"fling":return await n8(t,n);case"longpress":return await nq(t,n);case"focus":return await nj(t,n);case"type":return await nV(t,n,a);case"fill":return await nB(t,n,a);case"scroll":return await n9(t,n,a);case"pinch":return await ie(e,t,n,a);case"rotate-gesture":return await it(e,t,n);case"transform-gesture":return await ir(e,t,n);case"trigger-app-event":return await ih(e,t,n,a);case"screenshot":return await iw(t,n,i,a);case"back":return await t.back(a?.backMode),{action:"back",mode:a?.backMode??"in-app",...q("Back")};case"home":return await t.home(),{action:"home",...q("Home")};case"rotate":{let e=Z(n[0]);return await t.rotate(e),{action:"rotate",orientation:e,...q(`Rotated to ${e}`)}}case"app-switcher":return await t.appSwitcher(),{action:"app-switcher",...q("Opened app switcher")};case"clipboard":return await ig(t,n);case"keyboard":return await iv(e,n,a,o);case"settings":return await ib(e,t,n,a);case"push":return await iA(e,n,a);case"snapshot":return await iI(t,a);case"read":return await ii(e,n,a);default:throw new eC("INVALID_ARGS",`Unknown command: ${r}`)}}async function im(e,t,r,n){let i=r[0],a=r[1],o=n?.launchConsole,s=n?.launchArgs;if(r.length>2)throw new eC("INVALID_ARGS","open accepts at most two arguments: <app|url> [url]");if(!i){if(o)throw new eC("INVALID_ARGS","--launch-console requires an app target");if(s&&s.length>0)throw new eC("INVALID_ARGS","--launch-args requires an app target");return await t.openDevice(),{app:null,...q("Opened device")}}if(o&&("ios"!==e.platform||"simulator"!==e.kind))throw new eC("UNSUPPORTED_OPERATION",nE);if("linux"===e.platform&&s&&s.length>0)throw new eC("UNSUPPORTED_OPERATION","--launch-args is not supported on Linux.");if(void 0!==a){if(tu(i))throw new eC("INVALID_ARGS","open <app> <url> requires an app target as the first argument");if(!tu(a))throw new eC("INVALID_ARGS","open <app> <url> requires a valid URL target");if(o)throw new eC("INVALID_ARGS",nC);return await t.open(i,{activity:n?.activity,appBundleId:n?.appBundleId,launchArgs:s,url:a}),{app:i,url:a,...q(`Opened: ${i}`)}}if(o&&tu(i))throw new eC("INVALID_ARGS",nC);if(n?.clearAppState){if(tu(i))throw new eC("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}:{},...q(`Opened: ${i}`)}}async function ih(e,t,r,n){let{eventName:i,payload:a}=function(e){let t=e[0]?.trim(),r=e[1]?.trim();if(!t)throw new eC("INVALID_ARGS","trigger-app-event requires <event> [payloadJson]");if(!nP.test(t))throw new eC("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 eC("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 eC("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 eC("INVALID_ARGS",`trigger-app-event payload for "${t}" exceeds 8192 bytes`);return r}catch(t){if(t instanceof eC)throw t;throw new eC("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 eC("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 eC("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",...q(`Triggered app event: ${i}`)}}async function iw(e,t,r,n){let a=t[0]??r??`./screenshot-${Date.now()}.png`;await s.mkdir(i.dirname(a),{recursive:!0});let o=j(n);return await e.screenshot(a,{appBundleId:n?.appBundleId,fullscreen:o.fullscreen,stabilize:o.stabilize,surface:n?.surface}),{path:a,...q(`Saved screenshot: ${a}`)}}async function ig(e,t){let r=(t[0]??"").toLowerCase();if("read"!==r&&"write"!==r)throw new eC("INVALID_ARGS","clipboard requires a subcommand: read or write");if("read"===r){if(1!==t.length)throw new eC("INVALID_ARGS","clipboard read does not accept additional arguments");return{action:r,text:await e.readClipboard()}}if(t.length<2)throw new eC("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,...q("Clipboard updated")}}async function iv(e,t,r,n){let i=(t[0]??"status").toLowerCase();if(!es(i))throw new eC("INVALID_ARGS","keyboard requires a subcommand: status, get, dismiss, enter, or return");if(t.length>1)throw new eC("INVALID_ARGS","keyboard accepts at most one subcommand argument");if("android"===e.platform)return await iy(e,i);if("ios"===e.platform)return await iS(e,i,r,n);throw new eC("UNSUPPORTED_OPERATION","keyboard is supported only on Android and iOS")}async function iy(e,t){if("enter"===t||"return"===t){let{pressAndroidEnter:t}=await import("./input-actions.js");return await t(e),{platform:"android",action:"enter",...q("Keyboard enter pressed")}}if("dismiss"===t){let{dismissAndroidKeyboard:t}=await import("./9624.js"),r=await t(e);return{platform:"android",action:"dismiss",attempts:r.attempts,wasVisible:r.wasVisible,dismissed:r.dismissed,visible:r.visible,inputType:r.inputType,type:r.type,inputMethodPackage:r.inputMethodPackage,focusedPackage:r.focusedPackage,focusedResourceId:r.focusedResourceId,inputOwner:r.inputOwner}}let{getAndroidKeyboardState:r}=await import("./9624.js"),n=await r(e);return{platform:"android",action:"status",visible:n.visible,inputType:n.inputType,type:n.type,inputMethodPackage:n.inputMethodPackage,focusedPackage:n.focusedPackage,focusedResourceId:n.focusedResourceId,inputOwner:n.inputOwner}}async function iS(e,t,r,n){if("dismiss"!==t&&"enter"!==t&&"return"!==t)throw new eC("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(tK),i=await t(e,{command:"keyboardReturn",appBundleId:r?.appBundleId},n);return{platform:"ios",action:"enter",visible:i.visible,wasVisible:i.wasVisible,...q("Keyboard enter pressed")}}let{runIosRunnerCommand:i}=await Promise.resolve(tK),a=await i(e,{command:"keyboardDismiss",appBundleId:r?.appBundleId},n);return{platform:"ios",action:"dismiss",wasVisible:a.wasVisible,dismissed:a.dismissed,visible:a.visible,...q(a.dismissed?"Keyboard dismissed":"Keyboard already hidden")}}async function ib(e,t,r,n){let[i,a,o,s]=r;if(!i||!a&&"clear-app-state"!==i)throw new eC("INVALID_ARGS","settings requires setting state");if("clear-app-state"===i){let r=("clear"===a?o:a)??n?.appBundleId;if(!r)throw new eC("INVALID_ARGS","settings clear-app-state requires an app id or an active app session.");ea({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?k({setting:i,state:"clear",...s},i_(s)??`Cleared user data for ${r}`):{setting:i,state:"clear",...q(`Cleared user data for ${r}`)}}if(!a)throw new eC("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:T(o,"latitude"),longitude:T(s,"longitude")}:void 0;ea({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?k({setting:i,state:a,...u},i_(u)??`Updated setting: ${i}`):{setting:i,state:a,...q(`Updated setting: ${i}`)}}async function iA(e,t,r){let n=t[0]?.trim(),i=t[1]?.trim();if(!n||!i)throw new eC("INVALID_ARGS","push requires <bundle|package> <payload.json|inline-json>");let a=await id(i);if("ios"===e.platform){let{pushIosNotification:t}=await import("./apps.js");return await t(e,n,a),{platform:"ios",bundleId:n,...q(`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,...q(`Pushed notification to ${n}`)}}async function iI(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 i_(e){return"string"==typeof e.message&&e.message.length>0?e.message:void 0}let ix=e=>"macos"!==e.platform,iM=e=>"ios"===e.platform&&"simulator"===e.kind&&"tv"!==e.target,iN=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,iD={device:!0},ik={},iP={device:!0},iE=new Set(["open","close","find","get","is","network","screenshot","snapshot","wait","click","fill","focus","press","scroll","type"]),iC={apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iD},iO={apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ik,supports:ix},iR=function(e){let t={};for(let[r,n]of Object.entries(e))t[r]=iE.has(r)?{...n,web:iP}:n;for(let t of iE)if(!(t in e))throw Error(`Web command "${t}" missing from capability matrix`);return t}({alert:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ik,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:ik,supports:e=>"android"===e.platform||iM(e),unsupportedHint:iN},"rotate-gesture":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ik,supports:e=>"android"===e.platform||iM(e),unsupportedHint:iN},"transform-gesture":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ik,supports:e=>"android"===e.platform||iM(e),unsupportedHint:iN},"app-switcher":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ik,supports:ix},open:iC,close:iC,reinstall:iO,install:iO,"install-from-source":iO,apps:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ik},back:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iD},boot:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ik,supports:ix},shutdown:{apple:{simulator:!0},android:{emulator:!0},linux:ik},click:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iD},clipboard:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iD,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:ik,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:iD},fling:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ik},snapshot:iC,diff:iC,screenshot:iC,wait:iC,get:iC,find:iC,is:iC,focus:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iD},home:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iD,supports:ix},logs:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ik},network:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ik},longpress:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iD},perf:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ik},pan:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iD},press:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iD},push:{apple:{simulator:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ik,supports:ix},record:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ik},"react-native":{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ik},rotate:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ik,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:iD},swipe:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:iD},settings:{apple:{simulator:!0,device:!0},android:{emulator:!0,device:!0,unknown:!0},linux:ik,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:ik},type:iC});function iT(e,t){let r=iR[e];if(!r)return!0;let n=eY(t.platform)?r.apple:"android"===t.platform?r.android:"linux"===t.platform?r.linux:r.web;return!!n&&(!r.supports||!!r.supports(t))&&!0===n[t.kind??"unknown"]}function iL(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 i$(e,t){return"user-installed"===t?e.filter(e=>!e.bundleId.startsWith("com.apple.")):e}function iF(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 eC("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 eC("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 eC("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 eC("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 eC("COMMAND_FAILED","Failed to set macOS appearance",{stdout:n.stdout,stderr:n.stderr,exitCode:n.exitCode})},listApps:async r=>await iU(e,t,r)}}async function iU(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 i$((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=iq(e,"CFBundleIdentifier"),i=iq(e,"CFBundleDisplayName"),a=iq(e,"CFBundleName");if(n||i||a)return{bundleId:n,appName:i??a}}return{}}function iq(e,t){let r=e?.[t];return"string"==typeof r&&r.trim()?r.trim():void 0}let ij={runCommand:eT,simctl:{run:async(e,t)=>await eT("xcrun",["simctl",...e],t)},devicectl:{run:async(e,t)=>await eT("xcrun",["devicectl",...e],t)},plist:{readJson:async e=>await iZ(eT,e)},macosHost:iF(eT,async e=>await iZ(eT,e)),whichCommand:eF},iV=iL(ij,function(e){return"function"==typeof e?iB({runCommand:e}):iB(e)});function iB(e={}){let t={...ij,...e},r=e.plist??{readJson:async e=>await iZ(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??iF(t.runCommand,async e=>await r.readJson(e))}}function iH(e){return iV.resolve(e)}async function iK(e,t){return await iV.run(e,t)}function iX(){return iV.hasScope()}async function iW(e,t,r){return await iH().runCommand(e,t,r)}async function iz(e,t){let r=iH(),[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 iW("xcrun",e,t)}async function iJ(e){return await iH().plist?.readJson(e)??null}async function iZ(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 iY="agent-device-macos-helper",iQ="AGENT_DEVICE_MACOS_HELPER_BIN",i0=i.join(u.homedir(),".agent-device","macos-helper","current"),i1=i.join(i0,"manifest.json"),i2=/^[A-Za-z0-9_-]+(?:\.[A-Za-z0-9_-]+)+$/;function i3(e){let t=e.trim();if(!i2.test(t))throw new eC("INVALID_ARGS","macOS bundle id must use reverse-DNS form like com.example.App",{bundleId:e});return t}function i5(e,t){t.bundleId&&e.push("--bundle-id",i3(t.bundleId)),t.surface&&e.push("--surface",t.surface)}function i4(){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 eC("COMMAND_FAILED","Unable to locate macOS helper package root",{modulePath:e})}(d(import.meta.url))}async function i6(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 i6(r):t.isFile()&&(t.name.endsWith(".swift")||"Package.swift"===t.name)?[r]:[]}))).flat().sort()}async function i8(e){let t=await i6(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 iW("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 i9(){try{let e=JSON.parse(await s.readFile(i1,"utf8"));return"string"==typeof e.fingerprint?e.fingerprint:null}catch{return null}}async function i7(){let e=await e$(process.env[iQ],iQ);if(e)return e;let t=i4(),r=await i8(t),n=i.join(i0,iY);try{if(await i9()===r)return await s.access(n),n}catch{}let a=i.join(i4(),".build","release",iY);process.stderr.write("agent-device: building macOS helper (first run or helper update)\n"),await iW("swift",["build","-c","release","--package-path",t],{cwd:t,timeoutMs:12e4}),await s.mkdir(i0,{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(i1,`${JSON.stringify({fingerprint:r},null,2)}
|
|
4
|
+
`,"utf8"),n}async function ae(){let e=process.env[iQ]?.trim();if(e){let t=await e$(e,iQ);if(t)return t}if(iX())return iY;if("darwin"!==process.platform)throw new eC("UNSUPPORTED_PLATFORM","macOS helper is only available on macOS");return await i7()}async function at(e){let t={allowFailure:!0,timeoutMs:3e4},r=iH().macosHelper,n=r?iY:await ae(),i=r?await r.run(e,t):await iW(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 eC("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 ar(){return await at(["app","frontmost"])}async function an(e){return await at(["app","quit","--bundle-id",i3(e)])}async function ai(e,t){return await at(["permission",e,t])}async function aa(e,t={}){let r=["alert",e];return i5(r,t),await at(r)}async function ao(e,t={}){let r=["snapshot","--surface",e];return i5(r,t),await at(r)}async function as(e,t,r={}){let n=["read","--x",String(e),"--y",String(t)];return i5(n,r),await at(n)}async function al(e,t,r={}){let n=["press","--x",String(e),"--y",String(t)];return i5(n,r),await at(n)}async function ad(e,t={}){let r=["screenshot","--out",e];return i5(r,t),t.fullscreen&&r.push("--fullscreen"),await at(r)}let ac={"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"},au={runCommand:eT,whichCommand:eF,desktop:aw(eT,eF),clipboard:ag(eT,eF),screenshot:av(eT,eF)},ap=iL(au,function(e={}){let t={...au,...e};return{...t,desktop:e.desktop??aw(t.runCommand,t.whichCommand),clipboard:e.clipboard??ag(t.runCommand,t.whichCommand),screenshot:e.screenshot??av(t.runCommand,t.whichCommand)}});function af(e){return ap.resolve(e)}async function am(e,t){return await ap.run(e,t)}async function ah(e,t,r){return await af().runCommand(e,t,r)}function aw(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=>{ea({level:"warn",phase:"linux_app_launch",data:{app:r,error:String(e)}})}),await eZ(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 ag(e,t){return{async readText(){let r=ab[await a_(t,ay)];return(await e(r.cmd,r.args,r.options)).stdout},async writeText(r){let n=aA[await a_(t,ay)](r);await e(n.cmd,n.args,n.options)}}}function av(e,t){return{async capture(r){let n=aI[await a_(t,aS)](r);await e(n.cmd,n.args,n.options)}}}let ay={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."},aS={wayland:[{tool:"grim",command:"grim"},{tool:"gnome-screenshot",command:"gnome-screenshot"}],x11:[{tool:"scrot",command:"scrot"},{tool:"import",command:"import"},{tool:"gnome-screenshot",command:"gnome-screenshot"}],waylandError:"grim or gnome-screenshot is required for screenshots on Wayland. Install via your package manager.",x11Error:"scrot, import (ImageMagick), or gnome-screenshot is required for screenshots on X11. Install via your package manager."},ab={"wl-clipboard":{cmd:"wl-paste",args:["--no-newline"],options:{allowFailure:!0,timeoutMs:5e3}},xclip:{cmd:"xclip",args:["-selection","clipboard","-o"],options:{allowFailure:!0,timeoutMs:5e3}},xsel:{cmd:"xsel",args:["--clipboard","--output"],options:{allowFailure:!0,timeoutMs:5e3}}},aA={"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}})},aI={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 a_(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 eC("TOOL_MISSING","wayland"===r?t.waylandError:t.x11Error)}let ax="atspi-dump.py",aM=null;async function aN(e,t={}){let r,n=af().accessibility;if(n)return await n.captureTree(e,t);if("linux"!==process.platform)throw new eC("UNSUPPORTED_PLATFORM","AT-SPI2 bridge is only available on Linux");if(!await af().whichCommand("python3"))throw new eC("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(aM)return aM;let e=i.dirname(d(import.meta.url));for(let t=0;t<5;t++){let r=i.join(e,"src","platforms","linux",ax);if(a.existsSync(r))return aM=r,r;if(0===t){let t=i.join(e,ax);if(a.existsSync(t))return aM=t,t}e=i.dirname(e)}throw new eC("TOOL_MISSING",`Cannot find ${ax}. Ensure the agent-device package is installed correctly.`)}(),"--surface",e,"--max-nodes",String(o),"--max-depth",String(s),"--max-apps",String(l)],u=await ah("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 eC("TOOL_MISSING","AT-SPI2 Python bindings not found. Install python3-gi and gir1.2-atspi-2.0.",{cause:e});throw new eC("COMMAND_FAILED",`AT-SPI2 snapshot failed (exit ${u.exitCode}): ${e||u.stdout}`)}try{r=JSON.parse(u.stdout)}catch{throw new eC("COMMAND_FAILED",`AT-SPI2 snapshot returned invalid JSON: ${u.stdout.slice(0,200)}`)}if(r.error)throw new eC("COMMAND_FAILED",`AT-SPI2: ${r.error}`);return{nodes:(r.nodes??[]).map(e=>{let t,r;return{index:e.index,type:(r=ac[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 aD(e){let t="desktop"===e?"desktop":"frontmost-app"===e||"app"===e?"frontmost-app":("menubar"===e&&ea({level:"warn",phase:"linux_snapshot",data:{message:"menubar surface is not supported on Linux, falling back to desktop"}}),"desktop"),r=await aN(t);return{nodes:r.nodes,truncated:r.truncated}}async function ak(e,t,r){let{nodes:n}=await aD(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:aP(e.rect)-aP(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 aP(e){return(e?.width??0)*(e?.height??0)}let aE=[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?aL(n?.nodes??[]):void 0,routeComparable:i}}function aO(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 aR(e){e&&"android"===e.device.platform&&delete e.androidSnapshotFreshness}function aT(e){return"press"===e||"click"===e||"back"===e||"open"===e}function aL(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 a$(e,t,r,n,i){return{requestId:i??et().requestId,appBundleId:r,activity:t?.activity,launchConsole:t?.launchConsole,launchArgs:t?.launchArgs,clearAppState:t?.clearAppState,verbose:t?.verbose,logPath:e,traceLogPath:n,iosXctestrunFile:t?.iosXctestrunFile,iosXctestDerivedDataPath:t?.iosXctestDerivedDataPath,iosXctestEnvDir:t?.iosXctestEnvDir,snapshotInteractiveOnly:t?.snapshotInteractiveOnly,snapshotDepth:t?.snapshotDepth,snapshotScope:t?.snapshotScope,snapshotRaw:t?.snapshotRaw,...K(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 aF(e){var t;let{session:r,command:n,positionals:i,flags:a,preSnapshot:o}=e;if(a?.interactionOutcome?.retryOnNoChange!==!0||!aH(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=aj(o?.nodes??[]);0!==l.length&&(r.pendingInteractionOutcome={action:n,command:s,positionals:i,flags:aq(a),markedAt:Date.now(),attemptsRemaining:2,preSignature:l})}function aU(e){e?.pendingInteractionOutcome&&(e.pendingInteractionOutcome=void 0)}async function aG(e){let{session:t,pending:r,snapshot:n}=e,i=aV(r.preSignature,aj(n.nodes));if("unchanged"!==i||r.attemptsRemaining<=0)return{retried:!1,change:i};let a=Date.now();return r.attemptsRemaining-=1,await iu(t.device,r.command,r.positionals,r.flags?.out,{...a$(e.logPath,r.flags,t.appBundleId,t.trace?.outPath),surface:t.surface}),ea({level:"info",phase:"interaction_no_change_retry",data:{action:r.action,attemptsRemaining:r.attemptsRemaining,durationMs:Date.now()-a}}),{retried:!0,change:i}}function aq(e){if(!e?.interactionOutcome&&!e?.postGestureStabilization)return e;let{interactionOutcome:t,postGestureStabilization:r,...n}=e;return n}function aj(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 aV(e,t){return 0===e.length||0===t.length?"ambiguous":aB(e,t)?"unchanged":"changed"}function aB(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 aH(e){return"ios"===e.device.platform||"android"===e.device.platform}function aK(e,t,r=[],n){var i,a,o;az(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 aX(e){e?.postGestureStabilization&&(e.postGestureStabilization=void 0)}async function aW(e){let{session:t,capture:r}=e,n=t?.postGestureStabilization;if(!t||!az(t.device.platform)||!n)return e.initial??await r();let i=Date.now(),a=1,o=e.initial??await r(),s=aj(e.readSnapshot(o).nodes);for(;a<2||Date.now()-i<1500;){await eZ(200),a+=1;let l=await r(),d=aj(e.readSnapshot(l).nodes);if(aB(s,d))return aX(t),ea({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 aX(t),ea({level:"warn",phase:"post_gesture_snapshot_stabilization_timeout",data:{action:n.action,attempts:a,durationMs:Date.now()-i}}),o}function az(e){return"ios"===e||"android"===e}function aJ(e,t,r){return{ok:!1,error:{code:e,message:t,...r?{details:r}:{}}}}let aZ=new WeakMap;function aY(e,t){if(!e[t])return[];let r=a1(e)[t]??t+1;return e.slice(t+1,r)}function aQ(e,t,r){let n=a1(e)[t]??t+1;for(let i=t+1;i<n;i+=1){let t=e[i];if(t&&r(t))return t}}function a0(e,t,r){let n=a1(e)[t]??t+1;for(let i=t+1;i<n;i+=1){let t=e[i];t&&r(t)}}function a1(e){let t=aZ.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 aZ.set(e,r),r}function a2(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 a3(e,t){let r=tg(e.type??""),n=e.label?.trim();return!!(a5(e)||"other"===r&&!n&&!e.value||("other"===r||"statictext"===r)&&n&&t.includes(n))||"image"===r}function a5(e){return"button"===tg(e.type??"")&&e.label?.trim()==="chevron"&&!1===e.enabled}function a4(e){let t=tg(e??"");return"collectionview"===t||"table"===t||"scrollview"===t||"scrollarea"===t}function a6(e,t,r){e.set(t.index,{...t,...e.get(t.index),...r})}function a8(e){let t;for(let i of e){var r,n;let e=tg(i.type??"");("application"===e||"window"===e)&&(r=i.rect,n=t,r&&(!n||a9(r)>a9(n)))&&(t=i.rect)}return t}function a9(e){return e?e.width*e.height:0}function a7(e){let t=tg(e.type??"");return"scrollview"===t||"scrollarea"===t}function oe(e,t){return!0===e||!!t||void 0}function ot(e,t,r,n){a0(e,t,e=>{(function(e,t){let r=e.label?.trim();if(!r||r!==t)return!1;let n=tg(e.type??"");return"other"===n||"statictext"===n||"link"===n})(e,r)&&n.add(e.index)})}function or(e,t,r,n){a0(e,t,e=>{var t;let i;e.index!==r&&"button"!==(i=tg((t=e).type??""))&&("image"===i||"Search"===t.label)&&n.add(e.index)})}function on(e,t){for(let r=0;r<e.length;r+=1){let n=e[r],i=n?.label?.trim();n&&i&&"other"===tg(n.type??"")&&t(n,i,r)}}function oi(e,t,r,n){for(let i of e)(a3(i,t)||n&&oo(i,n))&&r.add(i.index)}function oa(e,t,r){if("button"!==tg(e.type??""))return!1;let n=t.identifier?.trim(),i=e.identifier?.trim();return!!n&&!!i&&n===i||e.label?.trim()===r&&$(e.rect,t.rect)}function oo(e,t){return"button"===tg(e.type??"")&&!e.label?.trim()&&!e.value?.trim()&&$(e.rect,t.rect)}let os=[function(e,t){var r,n,i,a;let{suppressedIndexes:o}=t;(function(e,t){let r=a8(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"===tg(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),a0(e,r,e=>{t.add(e.index)}))}})(e,o),function(e,t){for(let r of e)!("other"!==tg(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&&F(t))})(r)&&function(e,t,r){var n,i,a,o;a4(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&&a4(e.type)?e:null)??a2(e,t,e=>a4(e.type))}(e,t,{includeSelf:!0});l&&(n=r,i=l,a=e,o=s,a6(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:oe(i.hiddenContentAbove,o.above),hiddenContentBelow:oe(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"!==tg(n.type??""))continue;if("Search"===n.label){or(e,r,null,t);continue}if("Toolbar"!==n.label)continue;let i=aQ(e,r,e=>"searchfield"===tg(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),or(e,r,i.index,t))}})(e,o),r=e,n=o,on(r,(e,t,i)=>{aQ(r,i,r=>{let n;return("button"===(n=tg(r.type??""))||"link"===n||"switch"===n||"searchfield"===n||"textfield"===n)&&r.label?.trim()===t&&($(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=tg(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,on(i,(e,t,r)=>{let n;H(e)&&_(e,(n=[],a0(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=tg(r.type??"");if("statictext"===a||"link"===a)return ot(e,t,n,i);if("other"===a){if(function(e,t,r){return!!aQ(e,t,e=>{let t=tg(e.type??"");return("link"===t||"searchfield"===t||a4(e.type))&&e.label?.trim()===r})}(e,t,n))return i.add(r.index);ot(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=a8(r.values());for(let i of e)(function(e,t,r){var n;return!("other"!==tg(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)||!a2(e,t,a7)||!((n=e).rect&&n.rect.height>=44&&n.rect.height<=160&&n.rect.width>=120)||function(e,t,r=.8){let n=a9(e),i=a9(t);return n>0&&i>0&&n/i>=r}(e.rect,r))})(i,r,n)&&a6(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=tg(r.type??"");if("button"===a)return oi(aY(e,t),n,i.suppressedIndexes,r);if("cell"!==a)return;let o=aY(e,t);!function(e,t,r,n){let i=e.find(e=>(function(e,t,r){if("switch"!==tg(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=>oa(e,t,r)),o=i.identifier?void 0:a?.identifier??t.identifier;return o&&a6(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&&(oa(a,t,r)||oo(a,t)||function(e,t){if("switch"!==tg(e.type??"")||e.index===t.index)return!1;let r=e.label?.trim();return r===t.value?.trim()||"0"===r||"1"===r}(a,n)||a3(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=>oa(e,t,r));if(!i){e.some(a5)&&oi(e,r,n.suppressedIndexes,t);return}!t.identifier&&i.identifier&&a6(n.replacements,t,{identifier:i.identifier}),n.suppressedIndexes.add(i.index),oi(e.filter(e=>e.index!==i.index),r,n.suppressedIndexes,t)}(o,r,n,i)}(e,r,n,i,t)}}];async function ol(e){let t=await od(e);if(t)return t;let r=await og(e);return aR(e.session),{snapshot:r.snapshot,...r.annotations}}async function od(e){let t=function(e){let t=e?.pendingInteractionOutcome;if(e&&t)return!aH(e)||Date.now()-t.markedAt>3e4?void aU(e):t}(e.session);if(t&&e.session)return await oc({...e,session:e.session},t);if(("ios"===e.device.platform||"android"===e.device.platform)&&e.session?.postGestureStabilization)return await oh({...e,session:e.session});let r=aO(e.session);if(r&&"android"===e.device.platform)return await of(e,r)}async function oc(e,t){var r,n;let i=e.session,a=Date.now(),o=0,s=await ou(e,t,await ow(e)),l=await aG({session:i,pending:t,logPath:e.logPath,snapshot:s.snapshot});for(;l.retried;)o+=1,s=await ou(e,t,await ow(e)),l=await aG({session:i,pending:t,logPath:e.logPath,snapshot:s.snapshot});return(aU(i),s=await aW({session:i,initial:s,capture:async()=>await ow(e),readSnapshot:e=>e.snapshot}),"ambiguous"!==l.change&&s.annotations.freshness?.staleAfterRetries!==!0&&aR(i),"unchanged"===l.change)?ea({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}}):ea({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 ou(e,t,r){let n=r;return"unchanged"!==aV(t.preSignature,aj(n.snapshot.nodes))?n:(await eZ(500),n=await ow(e))}async function op(e){let{device:t,session:r,flags:n,outPath:i,logPath:a,snapshotScope:o}=e;if("linux"===t.platform){let e=await aD(r?.surface);return oS({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?oS(await ao(r.surface,{bundleId:"menubar"===r.surface?r.appBundleId:void 0}),{snapshotDepth:n?.snapshotDepth,snapshotInteractiveOnly:n?.snapshotInteractiveOnly,snapshotScope:o}):await iu(t,"snapshot",[],i,{...a$(a,{...n,snapshotScope:o},r?.appBundleId,r?.trace?.outPath)})}async function of(e,t){let r=await om(e,t);return{snapshot:r.snapshot,...r.annotations}}async function om(e,t){let r=await og(e),n=ov(r,t,e),i=0,a=t.markedAt+1500;for(let o of aE){if(!n)break;let s=a-Date.now();if(s<=0)break;await eZ(Math.min(o,s)),r=await og(e),i+=1,n=ov(r,t,e)}n||aR(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,...X({freshness:o})}}}async function oh(e){let t=await aW({session:e.session,capture:async()=>await ow(e),readSnapshot:e=>e.snapshot});return{snapshot:t.snapshot,...t.annotations}}async function ow(e){let t=aO(e.session);return t&&"android"===e.device.platform?await om(e,t):await og(e)}async function og(e){var t;let r=Date.now(),n=await op(e);return eX(e.session,{durationMs:Date.now()-r,backend:n.backend,platform:e.device.platform}),{data:n,snapshot:oy(n,void 0===(t=e).snapshotScope?t.flags:{...t.flags,snapshotScope:t.snapshotScope}),annotations:X(n)}}function ov(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&&aT(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=aL(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 oy(e,t){var r,n,i,a;let o=e?.nodes??[],s=t?.snapshotRaw,l=B(s?o:tv(o)),d=t?.snapshotScope&&e?.backend!=="macos-helper"?ob(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 os)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=tM(s?c:C(c)),p=X(e).quality;return{nodes:u,truncated:e?.truncated,createdAt:Date.now(),backend:e?.backend,...p?{snapshotQuality:p}:{},presentationKey:t_(tb(t)),comparisonSafe:(i=e?.backend,a=t,"android"===i&&a?.snapshotInteractiveOnly!==!0&&"number"!=typeof a?.snapshotDepth&&!a?.snapshotScope)}}function oS(e,t){var r,n;let i=e.nodes??[];return t.snapshotScope&&(i=ob(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:oA(e.filter(e=>r.has(e.index)))}(i)),"number"==typeof t.snapshotDepth&&(r=i,n=t.snapshotDepth,i=oA(r.filter(e=>(e.depth??0)<=n))),{...e,nodes:i}}function ob(e,t){let r=ty(tM(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 oA(a,i)}function oA(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 oI(e,t){let r;if(!e||!e.trim().startsWith("@"))return{ok:!0,scope:e};if(!t?.snapshot)return aJ("INVALID_ARGS","Ref scope requires an existing snapshot in session.");let n=tA(e.trim());if(!n)return aJ("INVALID_ARGS",`Invalid ref scope: ${e}`);for(let e of[t.snapshot,...t.snapshotScopeSource?[t.snapshotScopeSource]:[]]){let t=tI(e.nodes,n);if(r=t?tS(t,e.nodes):void 0)break}return r?{ok:!0,scope:r}:aJ("COMMAND_FAILED",`Ref ${e} not found or has no label`)}function o_(e,t){e.snapshot=t,e.snapshotScopeSource=void 0,!0===t.comparisonSafe&&(e.lastComparisonSafeSnapshot=t)}function ox(e){return{get:t=>t===e.sessionName?function(e,t,r={}){if(e)return{name:t,appBundleId:e.appBundleId,appName:e.appName,...!0===r.includeSnapshot?{snapshot:e.snapshot}:{},metadata:{surface:e.surface,...r.metadata??{}}}}(e.getSession(),e.sessionName,e.recordOptions):void 0,set:t=>{t.name!==e.sessionName?ea({level:"warn",phase:"runtime_session_write_skipped",data:{expected:e.sessionName,received:t.name}}):e.setRecord(t)}}}async function oM(e){let{session:t,sessionName:r,outPath:n,outputPlacement:a,dispatchContext:o}=e,l=ew({backend:function(e){let{session:t,outputPlacement:r,dispatchContext:n}=e;return{platform:t.device.platform,captureScreenshot:async(e,i,a)=>{let o={...n,...K(a),surface:a?.surface};return"out"===r?oN(await iu(t.device,"screenshot",[],i,o)):oN(await iu(t.device,"screenshot",[i],void 0,o))}}}({session:t,outputPlacement:a,dispatchContext:o}),artifacts:{resolveInput:async()=>{throw new eC("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:ox({sessionName:r,getSession:()=>t,recordOptions:{includeSnapshot:!1},setRecord:()=>{}}),policy:eg()});return await l.capture.screenshot({session:r,requestId:o.requestId,appBundleId:t.appBundleId,...j(o),surface:t.surface,...n?{out:{kind:"path",path:n}}:{}})}function oN(e){if("object"==typeof e&&null!==e)return{..."string"==typeof e.path?{path:e.path}:{},...Array.isArray(e.overlayRefs)?{overlayRefs:e.overlayRefs}:{}}}function oD(e){if(0===e.length)return null;let t=[...e].sort((e,t)=>e-t);return t[Math.floor(t.length/2)]??null}function ok(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 oP(e,t){return{start:e.y-t.y,size:e.height,crossSize:e.width}}let oE=["device offline","device not found","transport error","connection reset","broken pipe","timed out","no such file or directory"];async function oC(e,t={}){let r=tP(e,t.helperAdb).exec;return(await o$(e,t,r)).xml}async function oO(e,t={}){let r=tP(e,t.helperAdb).exec,n=await o$(e,t,r),i=n.xml,a=!1!==t.includeHiddenContentHints;if(!t.interactiveOnly){let o=tC(i,void 0,t),s=oR(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,...oT(s),androidSnapshot:n.metadata}}let o=tR(i),s=tU(o,void 0,t),l=oR(s.truncated,n.metadata);a&&await oL({device:e,options:t,tree:o,xml:i,adb:r,interactiveSnapshot:s});let{sourceNodes:d,...c}=s;return{...c,...oT(l),androidSnapshot:n.metadata}}function oR(e,t){return!0===e||!0===t.helperTruncated||e}function oT(e){return!0===e?{truncated:!0}:{}}async function oL(e){if(oz(e.interactiveSnapshot.nodes).size>0||oW(e.xml))return;let t=tU(e.tree,void 0,{...e.options,interactiveOnly:!1}),r=await oX(e.device,t.nodes,e.xml,e.adb);o1(r,t,e.interactiveSnapshot),0===r.size&&o1(x(tM(t.nodes)),t,e.interactiveSnapshot)}async function o$(e,t,r){let n=await en("android_snapshot_helper_artifact_resolution",async()=>await oH(t.helperArtifact));return n.artifact?await oF(e,t,r,n.artifact):(ea({level:n.fallbackReason?"warn":"info",phase:"android_snapshot_helper_unavailable",data:{reason:n.fallbackReason??"artifact_not_found"}}),await oK(e,n.fallbackReason,r))}async function oF(e,t,r,n){var i,a,o,s;let l=(i=e,`${i.platform}:${i.id}`),d=tP(e,t.helperAdb);try{let e=await oU(t,r,d,n,l);return e.installed&&await tG(l),a=await oG(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 oq({error:t,helperDeviceKey:l,artifact:n,device:e,adb:r})}}async function oU(e,t,r,n,i){let a=await en("android_snapshot_helper_install",async()=>await tO({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 ea({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 oG(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 en("android_snapshot_helper_session_capture",async()=>await tL(a),{packageName:n.manifest.packageName,version:n.manifest.version,timeoutMs:5e3});if(e)return e}catch(e){ea({level:"warn",phase:"android_snapshot_helper_session_fallback",data:{reason:eE(e).message}}),await oj(t,n.manifest.packageName)}return await en("android_snapshot_helper_capture",async()=>await tT(a),{packageName:n.manifest.packageName,version:n.manifest.version,timeoutMs:5e3,commandTimeoutMs:3e4})}async function oq(e){let t=function(e){var t;let r=eE(e);if(!function(e,t){if(!e||"object"!=typeof e)return!1;let r="errorType"in e?String(e.errorType):"",n=oB(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=oV(e);return new eC(ek(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=oV(e.error);return ea({level:"warn",phase:"android_snapshot_helper_fallback",data:{reason:r}}),await tG(e.helperDeviceKey),await oj(e.adb,e.artifact.manifest.packageName),tF({deviceKey:e.helperDeviceKey,packageName:e.artifact.manifest.packageName,versionCode:e.artifact.manifest.versionCode}),await oK(e.device,r,e.adb)}async function oj(e,t){try{await e(["shell","am","force-stop",t],{allowFailure:!0,timeoutMs:2e3}),await eZ(150),ea({level:"debug",phase:"android_snapshot_helper_runtime_reset",data:{packageName:t}})}catch(e){ea({level:"warn",phase:"android_snapshot_helper_runtime_reset_failed",data:{packageName:t,error:eE(e).message}})}}function oV(e){let t=eE(e),r=oB(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 oB(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 oH(e){if(e)return{artifact:e};let t=tD(),r=i.join(tk(),"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=t$(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:eE(e).message}}}async function oK(e,t,r){let n;try{n=await en("android_snapshot_stock_capture",async()=>await oJ(e,r),{fallbackReason:t,timeoutMs:8e3})}catch(e){if(t){var i,a;let r;throw i=e,a=t,new eC(ek((r=eE(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=>tN(e.type)))return new Map;let i=oz(t);if(i.size>0||oW(r))return i;let a=await o0(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(tN(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=>oP(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||!tN(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=>oP(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=oD(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(!ok(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(!ok(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?oD(o):a.length>0?oD(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 oW(e){return e.includes(" can-scroll-forward=")||e.includes(" can-scroll-backward=")}function oz(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 oJ(e,t=tE(e)){try{return await e8(()=>oZ(t),{shouldRetry:oQ})}catch(t){var r,n;let e;if((r=t)instanceof eC&&"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 eC("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 oZ(e){var t,r;let n,i,a=await e(["exec-out","uiautomator","dump","/dev/tty"],{allowFailure:!0,timeoutMs:8e3}),o=oY(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 eC("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=oY(c.stdout,c.stderr);if(!u)throw new eC("COMMAND_FAILED","uiautomator dump did not return XML",{stdout:c.stdout,stderr:c.stderr});return u}function oY(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 oQ(e){if(!(e instanceof eC)||"COMMAND_FAILED"!==e.code)return!1;let t=e.details?.stderr,r=("string"==typeof t?t:"").toLowerCase();return oE.some(e=>r.includes(e))}async function o0(e,t=tE(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 o1(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 o2=/\bis(?:n(?:'|'|')?t| not)\s+responding\b/i,o3=/^close app$/i,o5="Wait for Android to recover, close the dialog, restart the app, or reboot the emulator, then retry.";async function o4(e){let t,{session:r}=e;if("android"!==r.device.platform||!r.recording)return{status:"absent"};try{t=await st(r)}catch(e){return ea({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=sn(t);if(!n?.rect)return{status:"absent"};try{let e=await sr(r,n);if(!e.ok)return ea({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 si(r))return ea({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 te(r.device,r.appBundleId),!await sa(r,r.appBundleId)))return ea({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 ea({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 ea({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 o6(e){var t,r;let{session:n,command:i}=e;if("android"!==n.device.platform)return{status:"clear"};let a=await e6(n.device);if(!a)return{status:"clear"};if(t=n,r=a,t.appBundleId&&r.package===t.appBundleId){if(await o8(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 o7({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 o7({session:n,command:i,focus:a,message:`Android app ANR blocked ${i}: ${se(a)}. Automatic recovery failed.`,hint:o5})}throw o7({session:n,command:i,focus:a,message:`Android system dialog is blocking ${i}: ${se(a)}.`,hint:o5})}async function o8(e){try{return await o9(e)}catch(t){return ea({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 o9(e){if(!e.appBundleId)return!1;let t=sn(await st(e),{requireDialogSignal:!1});if(!t?.rect)return!1;let r=await sr(e,t);if(!r.ok)return!1;await te(e.device,e.appBundleId);let n=await sa(e,e.appBundleId,{requireNoBlockingDialog:!0});return n&&ea({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 o7(e){let{session:t,command:r,focus:n,message:i,hint:a}=e;return new eC("COMMAND_FAILED",i,{command:r,expectedPackage:t.appBundleId,focusedPackage:n.package,focusedWindow:n.focusedWindow,rawFocus:n.raw,hint:a})}function se(e){return e.package?`${e.focusedWindow} (package ${e.package})`:e.focusedWindow}async function st(e){return tM(tv((await oO(e.device,{interactiveOnly:!1})).nodes))}async function sr(e,t){if(!t.rect)return{ok:!1,exitCode:1,stdout:"",stderr:"button has no rect"};let{x:r,y:n}=tx(t.rect),i=await e5(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 sn(e,t={}){if(!1===t.requireDialogSignal||sl(e))return e.find(e=>ss(e).some(e=>o3.test(e))&&e.rect)}async function si(e){for(let t=0;t<12;t+=1){if(!sl(await st(e)))return!0;await eZ(500)}return!sl(await st(e))}async function sa(e,t,r={}){for(let n=0;n<12;n+=1){if(await so(e,t,r))return!0;await eZ(500)}return await so(e,t,r)}async function so(e,t,r){return!(r.requireNoBlockingDialog&&await e6(e.device))&&(await ts(e.device)).package===t}function ss(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 sl(e){return e.some(e=>{let t=ss(e).join(" ").trim();return t.length>0&&o2.test(t)})}function sd(e){return!!(e&&e.width>0&&e.height>0)}function sc(e){return e.width*e.height}function su(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 sp=[255,59,48,255],sf=[255,214,10,255],sm=[0,0,0,255],sh=["scroll","list","recyclerview","edittext","textfield"],sw=["button","link","menu","tab","textfield","searchfield","securetextfield","checkbox","radio","switch","cell"],sg={e:["01110","10000","11110","10000","10000","10001","01110"],0:["01110","10001","10011","10101","11001","10001","01110"],1:["00100","01100","00100","00100","00100","00100","01110"],2:["01110","10001","00001","00010","00100","01000","11111"],3:["11110","00001","00001","01110","00001","00001","11110"],4:["00010","00110","01010","10010","11111","00010","00010"],5:["11111","10000","10000","11110","00001","00001","11110"],6:["01110","10000","10000","11110","10001","10001","01110"],7:["11111","00001","00010","00100","01000","01000","01000"],8:["01110","10001","10001","01110","10001","10001","01110"],9:["01110","10001","10001","01111","00001","00001","01110"]};async function sv(e){let t=await s.readFile(e.screenshotPath),r=await ef(t,"screenshot"),n=function(e,t,r,n={}){let i=function(e){let t=null;for(let r of e)sb(r)&&sd(r.rect)&&(!t||sc(r.rect)>sc(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&&sd(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 sd(e.rect)&&!("image"===tg((t=e).type??"")&&!sI(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(s_)||sx(r.identifier);return!!function(e,t,r){if("android"!==e.backend||!r.hittable||!sd(r.rect)||sb(r))return!1;let n=tg(r.type??"");return!(sh.some(e=>n.includes(e))||t&&sc(r.rect)>.25*sc(t))}(e,t,r)||(sS(r)?n:n&&function(e){let t=tg(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 sS(e)&&!sb(e)}(s=n)?s:null,tw(o,s,e=>(function(e){return sS(e)&&!sb(e)})(e)),s.hittable?s:null,tw(o,s,e=>!0===e.hittable)].find(sA)??null);if(!l?.rect||!sd(l.rect))continue;let d=function(e,t,r){let n=sM(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=sM(n);if(!i)continue;let a=function(e){let t=0;return tg(e.type??"").includes("text")&&(t+=2),s_(e.label)&&(t+=2),s_(e.value)&&(t+=1),t}(n);(!r||a>r.score)&&(r={label:i,score:a})}return r?.label}(t,r);return i||sM(t)}(n,l,e.nodes),c=function(e,t,r){let n=0;return e.ref===t.ref&&(n+=4),t.hittable&&(n+=3),sS(t)&&(n+=3),sS(e)&&(n+=2),r&&(n+=2),sx(t.identifier)&&(n+=1),sI(t.value)&&(n+=1),n}(n,l,d),u=function(e,t,r){var n,i;return"android"!==e.backend?t.rect:(n=sS,i=e=>!!sM(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=tg(e.type??"");return r.includes("text")||r.includes("image")&&t(e)}(t,r)&&sd(t.rect)&&su(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=sy(e,i,u,t,r);if(!sd(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||!sd(a.rect))return;let o=sy(e,t,a.rect,n,i);if(!sd(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)=>sc(e.overlayRect)-sc(t.overlayRect))){let e=t.findIndex(e=>void 0!==e.label&&e.label===r.label&&(su(e.overlayRect,r.overlayRect)||su(r.overlayRect,e.overlayRect)));if(-1===e){t.push(r);continue}sc(r.overlayRect)<sc(t[e].overlayRect)&&(t[e]=r)}return t})([...a.values()]).sort(sO).slice(0,n.maxRefs??24).sort(sC).map(e=>({ref:e.ref,label:e.label,rect:e.rect,overlayRect:e.overlayRect,center:tx(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)sk(e,t.x,t.x+t.width-1,t.y+n,r),sk(e,t.x,t.x+t.width-1,t.y+t.height-1-n,r),sP(e,t.x+n,t.y,t.y+t.height-1,r),sP(e,t.x+t.width-1-n,t.y,t.y+t.height-1,r)})(i=r,(a=e).overlayRect,sp),function(e,t,r){let n=6+5*r.length+ +Math.max(0,r.length-1),i=sD(t.x,0,Math.max(0,e.width-n)),a=t.y-11-2,o=a>=0?a:sD(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)sE(e,t+o,r+a,i)})(e,i,o,n,sf),function(e,t,r,n,i){let a=t;for(let t of n.toLowerCase()){let n=sg[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]&&sE(e,a+o,r+t,i);a+=6}}(e,i+3,o+2,r,sm)}(i,a.overlayRect,a.ref)}return await s.writeFile(e.screenshotPath,await ed(r)),n}function sy(e,t,r,n,i){if("android"===e.backend||!t)return sN(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 sN({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 sS(e){let t=[e.type,e.role,e.subrole].map(e=>tg(e??"")).join(" ");return sw.some(e=>t.includes(e))}function sb(e){let t=[e.type,e.role,e.subrole].map(e=>tg(e??"")).join(" ");return t.includes("application")||t.includes("window")}function sA(e){return!!(e?.rect&&sd(e.rect)&&!sb(e))}function sI(e){if("string"!=typeof e)return!1;let t=e.trim();return!(!t||/^(true|false)$/i.test(t))}function s_(e){var t;let r;return!!sI(e)&&(t=e,"toolbar"!==(r=t?.trim().toLowerCase())&&"window"!==r&&"application"!==r&&r?.startsWith("vertical scroll bar")!==!0)}function sx(e){var t;return"string"==typeof e&&!!s_(e)&&(t=e,!/^[a-z0-9_.]+:id\/[a-z0-9_.-]+$/i.test(t.trim()))}function sM(e){let t=[e.label,e.value].find(s_);return t?t.trim():sx(e.identifier)?e.identifier.trim():void 0}function sN(e,t,r){let n=sD(e.x,0,Math.max(0,t-1)),i=sD(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:sD(e.width,1,a),height:sD(e.height,1,o)}}function sD(e,t,r){return Number.isFinite(e)?Math.max(t,Math.min(r,e)):t}function sk(e,t,r,n,i){for(let a=t;a<=r;a+=1)sE(e,a,n,i)}function sP(e,t,r,n,i){for(let a=r;a<=n;a+=1)sE(e,t,a,i)}function sE(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 sC(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 sO(e,t){return t.score!==e.score?t.score-e.score:sC(e,t)}function sR(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 sT=new WeakMap;function sL(e){if(!e)return;let t=sT.get(e);if(t)return t;let r=s$(e.nodes??[]);if(r)return sT.set(e,r),r}let s$=J,sF={referenceWidth:1e3,referenceHeight:1e3};function sU(e,t,r,n,i={},a=Date.now(),o=Date.now()){var s,l,d,c,u,p,f,m,h;let w,g,v,y=e.recording;if(!y)return;let S={...i,...n??{}},b=sX(S.effectiveDurationMs)??sX(S.durationMs),A={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},I="number"==typeof(s={gestureStartUptimeMs:sX(S.gestureStartUptimeMs),gestureEndUptimeMs:sX(S.gestureEndUptimeMs),reportedDurationMs:b,fallbackStartedAtMs:a,fallbackFinishedAtMs:o}).gestureStartUptimeMs&&"number"==typeof s.gestureEndUptimeMs?Math.max(0,s.gestureEndUptimeMs-s.gestureStartUptimeMs):"number"==typeof s.reportedDurationMs?Math.max(0,s.reportedDurationMs):Math.max(0,s.fallbackFinishedAtMs-s.fallbackStartedAtMs),_="ios"===e.device.platform&&void 0===sX(S.gestureStartUptimeMs)&&function(e,t){switch(e){case"click":case"fill":case"focus":return!0;case"press":{let e=sW(sX(t.count),1)??1,r=!0===t.doubleTap,n=sW(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 sR(e);let r=Math.min(Math.max(.15*t,120),260);return Math.max(0,e.fallbackFinishedAtMs-r-e.recordingStartedAt)}({...A,gestureDurationMs:I}):sR(A),x=(l=e.snapshot,w=sX((d=S).referenceWidth),g=sX(d.referenceHeight),void 0!==w&&w>0&&void 0!==g&&g>0?{referenceWidth:w,referenceHeight:g}:sL(l)),M=(c=t,u=r,p=S,f=_,m=I,h=x,v=sG[c],v?.(u,p,f,m,h)??[]);0!==M.length&&(y.gestureEvents.push(...M),ea({level:"debug",phase:"record_touch_visualization_event",data:{session:e.name,command:t,count:M.length,tMs:_,gestureDurationMs:I,kinds:M.map(e=>e.kind)}}))}let sG={click:(e,t,r,n,i)=>sq(e,t,r,i),press:(e,t,r,n,i)=>sq(e,t,r,i),"react-native":(e,t,r,n,i)=>"dismiss-overlay"===e[0]?sq(e,t,r,i):[],fill:(e,t,r,n,i)=>sj(e,t,r,i),focus:(e,t,r,n,i)=>sj(e,t,r,i),longpress:function(e,t,r,n,i){let a=sz(t,e);if(!a)return[];let{x:o,y:s}=a;return[sH(r,o,s,sY(n,[sX(t.durationMs),sX(e[2])],800),i)]},scroll:function(e,t,r,n,i){let a=sJ(t,e),o=sK(t.contentDirection)??sK(t.direction);if(!a||!o)return[];let{x1:s,y1:l,x2:d,y2:c}=a,u=sY(n,[],250),p=sX(t.amount)??sX(e[1]),f=sX(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:sV,fling:sV,swipe:sV,pinch:function(e,t,r,n,i){let a=sz(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:sY(n,[],280)}]}};function sq(e,t,r,n){let i=sz(t,e);if(!i)return[];let{x:a,y:o}=i,s=sW(sX(t.count),1)??1,l=sW(sX(t.intervalMs),0)??0,d=!0===t.doubleTap,c=sW(sX(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(sH(t,a,o,c,n));continue}u.push(sB(t,a,o,n)),d&&u.push(sB(t+90,a,o,n))}return u}function sj(e,t,r,n){let i=sz(t,e);if(!i)return[];let{x:a,y:o}=i;return[sB(r,a,o,n)]}function sV(e,t,r,n,i){let a=sJ(t,e);if(!a)return[];let{x1:o,y1:s,x2:l,y2:d}=a,c=sY(n,[sX(t.effectiveDurationMs),sX(t.durationMs),sX(e[4])],250),u=sW(sX(t.count),1)??1,p=sW(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,b,A,I;let _,{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),v=x,y=M,S=N,b=D,A=c,"back-swipe"===(_=function(e,t,r,n,i){if(!i||Math.abs(r-e)<=1.25*Math.abs(n-t))return"swipe";let a=.08*i.referenceWidth;return e<=a&&r>e||e>=i.referenceWidth-a&&r<e?"back-swipe":"swipe"}(v,y,S,b,I=i))?{kind:_,tMs:g,x:v,y,x2:S,y2:b,...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"}(v,S,I)}:{kind:_,tMs:g,x:v,y,x2:S,y2:b,...I,durationMs:A}})}function sB(e,t,r,n){return{kind:"tap",tMs:e,x:t,y:r,...n}}function sH(e,t,r,n,i){return{kind:"longpress",tMs:e,x:t,y:r,...i,durationMs:n}}function sK(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 sW(e,t){if(void 0===e)return;let r=Math.floor(e);return r>=t?r:void 0}function sz(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 sJ(e,t){let r=sZ(e.x1,e.x,t[0]),n=sZ(e.y1,e.y,t[1]),i=sZ(e.x2,t[2]),a=sZ(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 sZ(...e){return e.map(sX).find(e=>void 0!==e)}function sY(e,t,r){return sW(e,1)??t.map(e=>sW(e,1)).find(e=>void 0!==e)??r}let sQ={pan:"pan",fling:"fling",swipe:"swipe-preset",pinch:"pinch",rotate:"rotate-gesture",transform:"transform-gesture"};async function s0(e){var t,r,n,i,a,o,s;let l,d,c,u,p,{req:f,session:m,logPath:h,sessionStore:w,contextFromFlags:g}=e,v=function(e){if("pan"===e.command||"fling"===e.command||"rotate-gesture"===e.command||"transform-gesture"===e.command)return{ok:!1,message:"Use gesture pan, gesture fling, gesture swipe, gesture rotate, or gesture transform."};if("gesture"!==e.command)return{ok:!0,platformCommand:e.command,dispatchRequest:e,recordedCommand:e.command};let[t,...r]=e.positionals??[],n=t?sQ[t]:void 0;return n?{ok:!0,platformCommand:n,dispatchRequest:{...e,command:n,positionals:r},recordedCommand:e.command}:{ok:!1,message:th}}(f);if(!v.ok)return{ok:!1,error:{code:"INVALID_ARGS",message:v.message}};let{platformCommand:y,dispatchRequest:S,recordedCommand:b}=v,A=await s2(m,y);if(A)return A;let I=await s1(m,y);if("response"in I)return I.response;let{resolvedPositionals:_,resolvedOut:x,recordedPositionals:M,recordedFlags:N}="screenshot"===(t=S).command?(d=(n=(r=t).positionals??[],i=r.meta?.cwd,(l=n[0])?[t4.expandHome(l,i),...n.slice(1)]:n),u=(c=(a=r.flags?.out,o=r.meta?.cwd,a?t4.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 s3({session:m,sessionName:e.sessionName,logPath:h,command:y,request:S,positionals:_,out:x,dispatchContext:k}),E=await s1(m,y,"after-command");if("response"in E)return E.response;"status"in I&&"recovered"===I.status&&(!P||"object"==typeof P)&&((P??={}).warning=I.warning);let C=Date.now(),O=b===y?M:f.positionals??[],R=b===y?N:f.flags??{};return function(e){let{session:t,sessionStore:r,command:n,recordedCommand:i,resolvedPositionals:a,recordedPositionals:o,recordedFlags:s,data:l,actionStartedAt:d,actionFinishedAt:c,flags:u}=e,p=function(e,t,r,n){if("scroll"!==t)return n;let i=sL(e.snapshot),a={...n??{}},o=sK(a.direction)??sK(r[0]);if(!o)return n;let s=sX(a.amount)??sX(r[1]),l=sX(a.pixels),d=sJ(a,[]),c=sX(a.referenceWidth),u=sX(a.referenceHeight),p=void 0!==c&&c>0&&void 0!==u&&u>0?{referenceWidth:c,referenceHeight:u}:i??sF;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=Y({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);sU(t,n,a,p,u,d,c),r.recordAction(t,{command:i,positionals:o,flags:s,result:l??{}})}({session:m,sessionStore:w,command:y,recordedCommand:b,resolvedPositionals:_,recordedPositionals:O,recordedFlags:R,data:P,actionStartedAt:D,actionFinishedAt:C,flags:f.flags??{}}),aT(y)&&aC(m,y),aK(m,y,_,f.flags),{ok:!0,data:P??{}}}async function s1(e,t,r="before-command"){if("android"!==e.device.platform||nb(t)?.androidBlockingDialogGuard!==!0)return{status:"clear"};try{return await o6({session:e,command:t,phase:r})}catch(e){return{response:{ok:!1,error:eE(e)}}}}async function s2(e,t){if(!iT(t,e.device)){var r;let n=(r=e.device,iR[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 o4({session:e})).status?{ok:!1,error:{code:"COMMAND_FAILED",message:"Android system dialog blocked the recording session"}}:null}async function s3(e){var t;let{session:r,command:n,request:i,positionals:a,out:o,dispatchContext:s}=e;if("screenshot"!==n)return await iu(r.device,n,a,o,{...s});let l=await oM({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 s5(r,l,e.logPath),l}async function s5(e,t,r){let n={snapshotInteractiveOnly:!0},i=oy(await op({device:e.device,session:e,flags:n,logPath:r,snapshotScope:void 0}),n);o_(e,i);let a=await sv({screenshotPath:t.path,snapshot:i});t.overlayRefs=a}let s4=lc(()=>import("./lease.js")),s6=lc(()=>import("./session.js").then(e=>e.session_namespaceObject)),s8=lc(()=>import("./snapshot.js").then(e=>e.snapshot_namespaceObject)),s9=lc(()=>import("./react-native.js")),s7=lc(()=>import("./record-trace.js")),le=lc(()=>import("./find.js")),lt=lc(()=>import("./interaction.js").then(e=>e.interaction_namespaceObject));async function lr(e){var t;switch(t=e.req.command,nb(t)?.route??"generic"){case"lease":return await ln(e);case"session":return await li(e);case"snapshot":return await la(e);case"reactNative":return await lo(e);case"recordTrace":return await ls(e);case"find":return await ll(e);case"interaction":return await ld(e);case"generic":return null}}async function ln(e){let{handleLeaseCommands:t}=await s4();return lu(e.req.command,"lease",await t({req:e.req,leaseRegistry:e.leaseRegistry}))}async function li(e){let{handleSessionCommands:t}=await s6();return lu(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 la(e){let{handleSnapshotCommands:t}=await s8();return lu(e.req.command,"snapshot",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore}))}async function lo(e){let{handleReactNativeCommands:t}=await s9();return lu(e.req.command,"react-native",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,contextFromFlags:e.contextFromFlags}))}async function ls(e){let{handleRecordTraceCommands:t}=await s7();return lu(e.req.command,"record-trace",await t({req:e.req,sessionName:e.sessionName,sessionStore:e.sessionStore,logPath:e.logPath}))}async function ll(e){let{handleFindCommands:t}=await le();return lu(e.req.command,"find",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,invoke:e.invoke}))}async function ld(e){let{handleInteractionCommands:t}=await lt();return lu(e.req.command,"interaction",await t({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,contextFromFlags:e.contextFromFlags}))}function lc(e){let t;return()=>t??=e()}function lu(e,t,r){if(r)return r;throw new eC("INTERNAL_ERROR",`Daemon handler routing mismatch: ${t} handler matched command "${e}" but returned no response.`)}let lp=new h;async function lf(e,t,r){let n=lp.getStore()??[];if(n.some(r=>r.locks===e&&r.key===t))return await r();let i=(e.get(t)??Promise.resolve()).catch(()=>{}).then(()=>lp.run([...n,{locks:e,key:t}],r));return e.set(t,i),i.finally(()=>{e.get(t)===i&&e.delete(t)})}function lm(e){let t=e.device.platform,r=e.device.name.trim(),n=e.device.id;return`${t} device "${r}" (${n})`}function lh(e,t){var r,n,i,a;let o,s,l,d,c,u;return e.recording?(r=e,n=t,o=eH(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=eH(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 lw(e,t){if(!t)return[];let r=[],n=e.device,i=e0(t.platform);if(i&&!e3(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=ta(t.androidDeviceAllowlist);"android"===n.platform&&e.has(n.id)||r.push({key:"androidDeviceAllowlist",value:t.androidDeviceAllowlist})}return r}function lg(e){return`${function(e){switch(e){case"iosSimulatorDeviceSet":return"--ios-simulator-device-set";case"androidDeviceAllowlist":return"--android-device-allowlist";default:return`--${e}`}}(e.key)}=${e.value}`}let lv="default";function ly(e){return e.session||lv}function lS(e){if(e.meta?.sessionExplicit===!0||(e.session||lv)!==lv||e.meta?.sessionIsolation==="tenant"||e.flags?.sessionIsolation==="tenant")return;let t=function(e){if(!e||0===e.trim().length)return;let t=function(e){let t=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 lb(e,t){return!t||e.sessionScope?.kind===t.kind&&e.sessionScope.id===t.id}function lA(e,t){let r=lS(e);return!!r&&!!t.sessionScope&&!lb(t,r)}function lI(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 l_(e,t){var r,n,i,a,o,s,l,d,c,u,p;let f,m,h,w=e.meta?.lockPolicy;if(!w)return e;let g={...e.flags??{}},v=(r=e.command,nb(r)?.lockPolicySelectorOverride===!0),y=v?[]:t?lw(t,g):(n=g,i=e.meta?.lockPlatform,f=[],m=e0(i),void 0!==n.platform&&m&&(a=e0(n.platform),o=m,a&&o&&a!==o&&("apple"===a?!eY(o):"apple"!==o||!eY(a)))&&f.push({key:"platform",value:n.platform}),m&&(s=f,l=n,d=m,(h=l.target)&&function(e,t){switch(t){case"android":case"ios":return"desktop"===e;case"macos":case"linux":case"web":return"desktop"!==e;case"apple":return!1;default:return lM(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"===e0(r.platform)?["udid","serial","androidDeviceAllowlist","iosSimulatorDeviceSet"]:["serial","androidDeviceAllowlist"];case"macos":case"linux":case"web":return["udid","serial","iosSimulatorDeviceSet","androidDeviceAllowlist"];default:return lM(e)}}(r,t)){let r=t[n];nm(r)&&e.push({key:n,value:r})}}(f,n,m)),f),S=e.meta?.lockPlatform;if(0===y.length){return c=v,u=t,p=g,!S||u||void 0!==p.platform||c&&nh(p,nf)||(g.platform=S),{...e,flags:g}}if("strip"===w)return function(e,t,r,n){if(n){lx(e,t),e.platform=n.device.platform;return}lx(e,t),r&&void 0===e.platform&&(e.platform=r)}(g,y,S,t),{...e,flags:g};throw new eC("INVALID_ARGS",function(e,t,r){let n=t.map(lg).join(", ");if(r)return`${e.command} is already bound to session "${r.name}" on ${lm(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(lg),hint:function(e,t){if(t)return lh(t,"selector-conflict");let r=e.meta?.lockPlatform,n=e.session?` --session ${eH(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 lx(e,t){for(let r of t)delete e[r.key]}function lM(e){throw Error(`Unhandled lock platform: ${String(e)}`)}async function lN(e){var t,r;let{req:n,sessionName:i,sessionStore:a}=e,o=a.get(i);if(o)return[lD(o.device.id)];let s=new Set([(t=i,`session:${t}`)]),l=function(e){if(!e.meta?.lockPolicy)return e;try{return l_(e)}catch{return e}}(n);if("open"===(r=l).command||nh(r.flags,np))try{let e=await ni(l.flags??{});s.add(lD(e.id))}catch{}return Array.from(s).sort((e,t)=>{let r=lk(e)-lk(t);return 0!==r?r:e.localeCompare(t)})}function lD(e){return`device:${e}`}function lk(e){return+!e.startsWith("session:")}function lP(e,t={}){let r=e4(t.simulatorSetPath);return r?["simctl","--set",r,...e]:["simctl",...e]}function lE(e,t){return"ios"!==e.platform||"simulator"!==e.kind?["simctl",...t]:lP(t,{simulatorSetPath:e.simulatorSetPath})}function lC(e,t,r){return iz(lE(e,t),r)}let lO="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 lR(e){if(!(e instanceof eC)||"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 lT(e){return!(e instanceof eC)||"COMMAND_FAILED"!==e.code||!String(e.message??"").toLowerCase().includes("xcodebuild exited early")}function lL(e){let{port:t,endpoints:r,logPath:n,lastError:i}=e,a="Runner did not accept connection";return new eC("COMMAND_FAILED",a,{port:t,endpoints:r,logPath:n,lastError:i?String(i):void 0,reason:tt({error:i,message:a,context:{platform:"ios",phase:"connect"}}),hint:tn("IOS_RUNNER_CONNECT_TIMEOUT")})}async function l$(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=tt({message:l,stdout:s.stdout,stderr:s.stderr,context:{platform:"ios",phase:"connect"}});return new eC("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.":`${ta("IOS_RUNNER_CONNECT_TIMEOUT")} ${lM}`)})}function lE(e){return"snapshot"===e||"screenshot"===e||"findText"===e||"querySelector"===e||"readText"===e||"alert"===e||"status"===e||"uptime"===e}function lC(e){return"status"===e.command||e.commandId?.trim()?e:{...e,commandId:`runner-${r.randomUUID()}`}}function lR(e){if(rs(e))throw rd()}let lO=new Map;async function lT(e,t,r,n,i=45e3,a,o){let s=te.fromTimeoutMs(i),{getEndpoints:l}=lj(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 lL({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:lD},{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 lk({port:t,endpoints:d,logPath:n,lastError:c});let a=await lW(e,t,r,i,o);return new Response(a.body,{status:a.status})}throw lk({port:t,endpoints:d,logPath:n,lastError:c})}async function lL(e){await l$(e);let t=await lF(e);if(t.response)return t.response;let r=await lU(e);return r||await lG(e,t.usedCachedTunnelIp)}async function l$(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 lP({session:e.session,port:e.port,logPath:e.logPath})}async function lF(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 lV(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,lO.delete(i))}}),usedCachedTunnelIp:r}}async function lU(e){return"simulator"===e.device.kind&&e.session?.ready?await lB(e.device,e.port,e.command,{signal:e.signal,attemptDeadline:e.attemptDeadline,onError:e.setLastError}):null}async function lG(e,t){var r;if("device"!==e.device.kind||!t)return null;r=e.device.id,lO.delete(r);let n=await e.getEndpoints(e.attemptDeadline?.remainingMs(),!0);return e.setEndpoints(n.endpoints),await lV(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 lq(e,t,r,n=45e3,i){if(i?.aborted)throw rd();let a=te.fromTimeoutMs(n),{getEndpoints:o}=lj(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 lK(l,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)},d,i)}function lj(e,t){let r;return{getEndpoints:async(n,i=!1)=>{var a,o,s;let l,d=await lH({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 lV(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 lK(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 lB(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 lW(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 lH(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=lO.get(t))?e.expiresAt<=Date.now()?(lO.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 lX(i.id,a);return l(d),d&&(r=i.id,n=d,lO.set(r,{ip:n,expiresAt:Date.now()+3e4})),{ip:d,sharedCacheHit:!1}}async function lK(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 lX(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 ij(["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{lQ(n)}}async function lW(e,t,r,n,i){let a=JSON.stringify(r),o=lb(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 ij(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 lz(){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 lJ(e,t,r,n){t&&lY(t,e),r&&lY(r,e),n&&process.stderr.write(e)}let lZ=new Map;function lY(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 lQ(e){try{a.existsSync(e)&&a.unlinkSync(e)}catch{}}async function l0(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=l1(t);if(i){var o;return!(Number.isInteger((o=i).pid)&&!(o.pid<=0)&&eb(o.pid)&&(!o.startTime||ey(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 eX(s)}throw new eD("COMMAND_FAILED",`Timed out waiting for ${d}`,{lockDirPath:t,...function(e,t){let r,n=Date.now(),i=l1(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 l1(e){try{return JSON.parse(a.readFileSync(e,"utf8"))}catch{return null}}let l2=new Set(["RUNNER_PRODUCT_MISSING","RUNNER_PRODUCT_REPAIR_FAILED"]);async function l3(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 l4(e)){await iq("codesign",["--remove-signature",e],{allowFailure:!0});try{await iq("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 l4(e){return 0===(await iq("codesign",["--verify","--deep","--strict",e],{allowFailure:!0})).exitCode}let l5=new Set("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.:-"),l6=new Set([" "," ","\n","\r"]),l8=new Set(["__defineGetter__","__defineSetter__","__proto__","constructor","prototype"]);function l9(e,t={}){let r=t.maxDocumentChars??0x8000000;if(e.length>r)throw Error(`XML document exceeds maximum supported size of ${r} characters.`);return new de(e).parse()}function l7(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)}l7(r.children,t)}}class de{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(l8.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?dt(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])&&l5.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,dt(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])&&l6.has(e);)this.index+=1}startsWith(e){return this.xml.startsWith(e,this.index)}}function dt(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 dr=new Set(["ProductPaths","DependentProductPaths","TestHostPath","TestBundlePath","UITargetAppPath"]);async function dn(e){var t;let r=await di(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 di(e){let t=await iV(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(!da(e))continue;let t=e.TestTargets;Array.isArray(t)&&r.push(...t.filter(da))}return r}(i),...Object.values(i).filter(e=>da(e)&&"TestBundlePath"in e)])for(let r of function(e){let t=new Set;for(let[r,n]of Object.entries(e))if(dr.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=l9(r),t=new Set,l7(n,(e,r)=>{if(dr.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 da(e){return!!e&&"object"==typeof e}let ds=["CFBundleIcons","CFBundleIcons~ipad"];async function dl(e){let t=e.filter(df);if(0===t.length)return;let r=e.filter(e=>dh(e)&&!dm(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 dd(t,e)}}async function dd(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 dc(e,t);(o||s)&&(await dp(t),r=t,n=new Date,a.utimesSync(r,n,n))}async function dc(e,t){var r,n;let a=i.join(e,"Info.plist"),o=i.join(t,"Info.plist"),s=await iV(a),l=await iV(o);if(!s||!l)return!1;let d=(r=s,n=l,ds.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 du(o,e.key,e.value,e.shouldInsert);return!0}async function du(e,t,r,n){let i=await iq("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 dp(e){let t=await iq("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 df(e){return dh(e)&&dm(e)&&(e.includes("Debug-iphonesimulator")||e.includes("Release-iphonesimulator")||e.includes("Debug-appletvsimulator")||e.includes("Release-appletvsimulator"))}function dm(e){return i.basename(e).endsWith("-Runner.app")}function dh(e){return i.basename(e).endsWith(".app")}let dw={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 dg(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 dv(e){return"simulator"===e?"simulator":"device"}function dy(){return"arm64"===process.arch?"arm64":"x86_64"}let dS="XCTestDevices",dI=".agent-device-backup",dA=".agent-device-xctestdevices-backup-",d_=i.join(u.homedir(),".agent-device","ios-runner"),db=".agent-device-runner-cache.json",dx={PreferredScreenCaptureFormat:"screenshots",SystemAttachmentLifetime:"keepNever",UserAttachmentLifetime:"keepNever"},dM=new Map,dN=new Set,dD=new Map,dk=new Set;function dP(e){return e?.trim()??""}function dE(e=process.env){return dP(e.AGENT_DEVICE_IOS_BUNDLE_ID)||dP(e.AGENT_DEVICE_IOS_RUNNER_APP_BUNDLE_ID)||"com.callstack.agentdevice.runner"}function dC(e=process.env){let t=dP(e.AGENT_DEVICE_IOS_RUNNER_TEST_BUNDLE_ID);return t||`${dE(e)}.uitests`}let dR=function(e=process.env){let t=dE(e),r=dC(e);return Array.from(new Set([dP(e.AGENT_DEVICE_IOS_RUNNER_CONTAINER_BUNDLE_ID),`${r}.xctrunner`,t].filter(e=>e.length>0)))}(process.env);function dO(e=u.homedir()){return i.join(e,"Library","Developer","XCTestDevices")}async function dT(e,t={}){if("ios"!==e.platform||"simulator"!==e.kind)return null;let r=e8(e.simulatorSetPath);if(!r)return null;let n=i.resolve(r),o=i.resolve(t.xctestDeviceSetPath??dO()),s=i.resolve(t.backupPath??function(e=dO()){return`${e}${dI}`}(o)),l=i.resolve(t.lockDirPath??function(e=u.homedir()){return i.join(e,".agent-device","xctest-device-set.lock")}()),d=t.ownerStartTime??ey(process.pid),c=await dF({lockDirPath:l,owner:{pid:t.ownerPid??process.pid,startTime:d,acquiredAtMs:t.nowMs??Date.now()}});try{if(dL({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,`${dS}.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)&&d$(o),e}}({requestedSetPath:n,xctestDeviceSetPath:o})}catch(e){throw dL({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{dL({xctestDeviceSetPath:o,backupPath:s})}finally{await c()}}}}}function dL(e){let{xctestDeviceSetPath:t,backupPath:r}=e,n=[r,...function(e){let t=i.dirname(e),r=i.basename(e).replace(dI,""),n=r===dS?dA:`${r}${dA}`;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&&d$(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}}),d$(t))}function d$(e){!a.existsSync(e)||a.lstatSync(e).isSymbolicLink()&&a.unlinkSync(e)}async function dF(e){return await l0({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 dU(e){var t;return await dF({lockDirPath:(t=e,i.join(i.dirname(t),`${i.basename(t)}.lock`)),owner:{pid:process.pid,startTime:ey(process.pid),acquiredAtMs:Date.now()},timeoutMs:6e5,description:"iOS runner cache lock"})}async function dG(e,t){let n=function(e){var t;let n,o,s=e.iosXctestrunFile?.trim();if(!s)return null;let l=i.resolve(s);if(!a.existsSync(l))throw new eD("COMMAND_FAILED","Configured iOS XCTest runner .xctestrun file not found",{configKey:"iosXctestrunFile",xctestrunPath:l});let d=e.iosXctestDerivedDataPath?.trim(),c=d?i.resolve(d):(t=l,(n=r.createHash("sha1")).update(t),o=n.digest("hex").slice(0,12),i.join(u.tmpdir(),"agent-device-ios-xctest-derived",o));return cu("reuse","external_xctestrun",{derived:c,xctestrunPath:l}),{xctestrunPath:l,derived:c,cache:"external",artifact:"valid",buildMs:0,xctestrunPathSource:"external"}}(t);if(n)return n;let o=tx(),s=dX(e,o),l=ci(e,s);return await lo(dM,l,async()=>{let r=await dU(l);try{return await dq({device:e,options:t,projectRoot:o,expectedCacheMetadata:s,derived:l,forceRebuild:!0===t.forceRunnerXctestrunRebuild})}finally{await r()}})}async function dq(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||dN.has(t))&&(cu("clean",r?"forced_rebuild":"forced_clean",{derived:t}),cd(t),dH(t),dN.delete(t));let l=await cc({derived:s,projectRoot:a,expectedCacheMetadata:o,findXctestrun:e=>d5(e,n),xctestrunReferencesProjectRoot:d8,resolveExistingXctestrunProductPaths:dn}),d="reuse_ready"===l.reason?"exact":l.xctestrunPath?"restore-key":"miss";"reuse_ready"!==l.reason&&cu("rebuild",l.reason,{derived:s,xctestrunPath:l.xctestrunPath});let c=await dj({device:n,derived:s,expectedCacheMetadata:o,existing:l,cache:d});return c||(l.xctestrunPath&&(cd(s),dH(s)),await dV({device:n,options:i,projectRoot:a,expectedCacheMetadata:o,derived:s,cache:d,reason:l.reason}))}async function dj(e){let{device:t,derived:r,expectedCacheMetadata:n,existing:i,cache:a}=e;if("reuse_ready"!==i.reason)return null;let o=await dB(t,r,n,i);return o?{xctestrunPath:o,derived:r,cache:a,artifact:"valid",buildMs:0,xctestrunPathSource:i.source}:null}async function dV(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 cn(t,c,s,r);let p=Math.max(0,Date.now()-u),f=d5(s,t);if(!f)throw new eD("COMMAND_FAILED","Failed to locate .xctestrun after build");let m=await dn(f);if(!m)throw new eD("COMMAND_FAILED","Runner build is missing expected products",{xctestrunPath:f});return await l3(t,m,f),await dl(m),dz(s,dQ(o,f,m)),cu("build","built_new",{derived:s,xctestrunPath:f}),{xctestrunPath:f,derived:s,cache:l,artifact:"rebuilt",buildMs:p,xctestrunPathSource:"build",reason:d}}async function dB(e,t,r,n){try{var i,a,o,s;return await l3(e,n.productPaths,n.xctestrunPath),cu("reuse","reuse_ready",{derived:t,xctestrunPath:n.xctestrunPath}),i=t,a=r,o=n.xctestrunPath,s=n.productPaths,dz(i,dQ(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&&l2.has(t)}(e))throw e;return cu("rebuild","repair_failed",{derived:t,xctestrunPath:n.xctestrunPath}),null}}function dH(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,dK.has(t)&&a.rmSync(i.join(e,r.name),{recursive:!0,force:!0})}}catch{}}let dK=new Set([db,"Build","BuildCache.noindex","Index.noindex","Logs","ModuleCache.noindex","SDKStatCaches.noindex","SourcePackages","TextBasedInstallAPI","info.plist"]);function dX(e,t=tx()){let n,o=dg(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=d4.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 d4.set(t,{fileStatsFingerprint:o,sourceFingerprint:d}),d}(t),...function(e,t){var r;let n=(r=dW("xcodebuild",["-version"]),{version:r.match(/^Xcode\s+(.+)$/m)?.[1]?.trim()||"unknown",buildVersion:r.match(/^Build version\s+(.+)$/m)?.[1]?.trim()||"unknown"}),i=dw[e].sdkName[dv(t)];return{xcodeVersion:n.version,xcodeBuildVersion:n.buildVersion,sdkName:i,sdkVersion:dW("xcrun",["--sdk",i,"--show-sdk-version"]),sdkBuildVersion:dW("xcrun",["--sdk",i,"--show-sdk-build-version"])}}(o,e.kind),platformName:o,deviceKind:e.kind,target:e.target??"mobile",buildDestinationFamily:"macOS"===(n=dg(e))?`platform=macOS,arch=${dy()}`:"simulator"===e.kind?`generic/platform=${n} Simulator`:`generic/platform=${n}`,runnerBundleBuildSettings:cs(process.env),runnerSigningBuildSettings:co(process.env,"device"===e.kind,e.platform),runnerPerformanceBuildSettings:cl()}}function dW(e,t){let r=JSON.stringify([e,t]),n=dD.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 dD.set(r,i),i}catch{return dD.set(r,"unknown"),"unknown"}}function dz(e,t){a.mkdirSync(e,{recursive:!0}),a.writeFileSync(i.join(e,db),`${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)??lM);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 ci(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(dY(dZ(t))).digest("hex"),`cache-${n.slice(0,16)}`),s=function(e){return i.join(d_,"derived",dw[dg(e)].derivedBaseName[dv(e.kind)])}(e);return i.join(s,o)}function ca(e){return"macos"===e.platform||"device"===e.kind?"-maximum-concurrent-test-device-destinations":"-maximum-concurrent-test-simulator-destinations"}function co(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 cs(e=process.env){let t=dE(e),r=dC(e);return[`AGENT_DEVICE_IOS_RUNNER_APP_BUNDLE_ID=${t}`,`AGENT_DEVICE_IOS_RUNNER_TEST_BUNDLE_ID=${r}`]}function cl(){return["COMPILER_INDEX_STORE_ENABLE=NO","ENABLE_CODE_COVERAGE=NO"]}function cd(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 cc(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,db),"utf8"));if(!t||"object"!=typeof t||Array.isArray(t))return null;return t}catch{return null}}(t))?dY(dZ(n))!==dY(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(d0))||!d3(n.xctestrunPath,e)||!d2(n.xctestrunPath,{mtimeMs:n.xctestrunMtimeMs,size:n.xctestrunSize}))return null;let i=[];for(let t of n.productPaths){if(!d3(t.path,e)||!d2(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 cu(e,t,r){ei({level:"rebuild"===e?"warn":"info",phase:"runner_xctestrun_cache",data:{action:e,reason:t,...r}})}let cp=process.pid,cf=ey(process.pid),cm=(tF=cp,tU=cf,(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 ch(e,t){let r=await l0({lockDirPath:`${cI(e)}.lock`,owner:{pid:cp,startTime:cf,acquiredAtMs:Date.now()},timeoutMs:3e4,pollMs:100,ownerGraceMs:5e3,description:`iOS runner lease for ${e}`});try{return await t()}finally{await r()}}function cw(e){try{let t=JSON.parse(a.readFileSync(cI(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:cA(r.ownerToken),ownerPid:c_(r.ownerPid),sessionId:cA(r.sessionId),port:c_(r.port),xctestrunPath:cA(r.xctestrunPath),jsonPath:cA(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:c_(e.runnerPid)}:null}(t,e)}catch{return null}}function cg(e){var t;return e?e.ownerToken===cm?{type:"owned",lease:e}:eb((t=e).ownerPid)&&(!t.ownerStartTime||ey(t.ownerPid)===t.ownerStartTime)?{type:"busy",lease:e}:{type:"stale",lease:e}:{type:"empty"}}async function cv(e,t){let r=cg(cw(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 cb(r.lease,r.type,t)}async function cy(e,t){let r=cg(cw(e));"owned"===r.type&&await cb(r.lease,"owned",t)}function cS(e){e&&function(e){let t=cw(e.deviceId);if(t&&(!e.ownerToken||t.ownerToken===e.ownerToken)&&(!e.sessionId||t.sessionId===e.sessionId))try{a.unlinkSync(cI(e.deviceId))}catch{}}({deviceId:e.deviceId,ownerToken:e.ownerToken,sessionId:e.sessionId})}function cI(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 cA(e){return"string"==typeof e&&e.length>0?e:null}function c_(e){return"number"==typeof e&&Number.isInteger(e)&&e>0?e:null}async function cb(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),cS(e)}let cx={cleanupRunnerProcessTree:c$,cleanupRunnerXcodebuildProcesses:cF,cleanupTempFile:lQ};async function cM(e,t={}){var r;!1!==t.graceful?await cP(e):await c$(e.child.pid,"SIGTERM"),await cE(e,t.waitTimeoutMs??1e4),(r=e.child.pid)&&(cO(r)||eA(r))&&await c$(e.child.pid,"SIGKILL"),await cC(e)}async function cN(e){await cy(e,cx)}async function cD(e){let t=Array.from(dk);await cT(e,"SIGINT"),await cL(t,"SIGINT"),await cT(e,"SIGTERM"),await cL(t,"SIGTERM"),await cT(e,"SIGKILL"),await cL(t,"SIGKILL"),await Promise.allSettled(e.map(async e=>{await cC(e)}))}async function ck(){let e=Array.from(dk);await Promise.allSettled(e.map(async e=>{try{await c$(e.pid,"SIGTERM"),await c$(e.pid,"SIGKILL")}finally{dk.delete(e)}}))}async function cP(e){try{await lT(e.device,e.port,lC({command:"shutdown"}),void 0,15e3)}catch{await c$(e.child.pid,"SIGTERM")}}async function cE(e,t){try{await Promise.race([e.testPromise,new Promise(e=>setTimeout(e,t))])}catch{}}async function cC(e){await cR(e.device),lQ(e.xctestrunPath),lQ(e.jsonPath);try{await e.simulatorSetRedirect?.release()}finally{cS(e.lease)}}async function cR(e){"simulator"===e.kind&&await Promise.allSettled(dR.map(async t=>{try{await ij(lb(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 cO(e){return!!e&&eb(e)}async function cT(e,t){await Promise.allSettled(e.map(async e=>{await c$(e.child.pid,t)}))}async function cL(e,t){await Promise.allSettled(e.map(async e=>{await c$(e.pid,t),"SIGKILL"===t&&dk.delete(e)}))}async function c$(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 iq("pkill",[`-${r}`,"-P",String(e)],{allowFailure:!0})}catch{}}async function cF(e,t){let r=t?`xcodebuild.*test-without-building.*AgentDeviceRunner\\.env\\.session-${cU(e)}-${cU(t)}-`:`xcodebuild.*test-without-building.*AgentDeviceRunner\\.env\\.session-${cU(e)}-[0-9]`;for(let t of["TERM","KILL"])try{await iq("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 cU(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}async function cG(e){let t=await cq(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 cq(e){if(!e)return;let t=await cj(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 cj(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 cV=new Map,cB=new Map,cH=new Set(["tap","longPress","drag","swipe","scroll","sequence"]);async function cK(e,t){return await lo(cB,e.id,async()=>{let r=cV.get(e.id);if(r){let t=await cW(e,r);if(t)return t}return await ch(e.id,async()=>await cX(e,t))})}async function cX(e,t){var r,n;let o,s,l,d={};await un(d,"cleanup_stale_xcodebuild",async()=>{await cv(e.id,cx)}),await un(d,"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()):c3(t))}),await un(d,"verify_developer_mode",async()=>{await c4(e)}),t.cleanStaleBundles?await un(d,"cleanup_stale_bundles",async()=>{await cz(e)}):(d.cleanup_stale_bundles=0,ei({level:"debug",phase:"ios_runner_startup_cleanup_stale_bundles_skipped"}));let c=await un(d,"ensure_xctestrun",async()=>await dG(e,t));d.build_xctestrun=c.buildMs;let u=await un(d,"allocate_port",async()=>await lz()),{xctestrunPath:p,jsonPath:f}=await un(d,"prepare_xctestrun_env",async()=>await d9(c.xctestrunPath,{AGENT_DEVICE_RUNNER_PORT:String(u)},`session-${e.id}-${cm}-${u}`,{iosXctestEnvDir:t.iosXctestEnvDir})),m=await un(d,"simulator_set_redirect",async()=>await dT(e)),h=["test-without-building","-only-testing","AgentDeviceRunnerUITests/RunnerTests/testCommand","-parallel-testing-enabled","NO","-test-timeouts-enabled","NO","-collect-test-diagnostics","never",ca(e),"1","-destination-timeout",String(20),"-xctestrun",p,"-derivedDataPath",c.derived,"-destination","macOS"===(l=dg(e))?`platform=macOS,arch=${dy()}`:"simulator"===e.kind?`platform=${l} Simulator,id=${e.id}`:`platform=${l},id=${e.id}`];try{({child:o,wait:s}=await un(d,"launch_xcodebuild",()=>ek("xcodebuild",h,{allowFailure:!0,env:{...process.env,AGENT_DEVICE_RUNNER_PORT:String(u)},detached:!0})))}catch(e){throw await m?.release(),e}o.stdout?.on("data",e=>{lJ(e,t.logPath,t.traceLogPath,t.verbose)}),o.stderr?.on("data",e=>{lJ(e,t.logPath,t.traceLogPath,t.verbose)});let w=`${e.id}:${u}:${Date.now()}`,g={schemaVersion:1,deviceId:(r={deviceId:e.id,sessionId:w,runnerPid:o.pid,port:u,xctestrunPath:p,jsonPath:f}).deviceId,ownerToken:cm,ownerPid:cp,ownerStartTime:cf,sessionId:r.sessionId,runnerPid:r.runnerPid??null,port:r.port,xctestrunPath:r.xctestrunPath,jsonPath:r.jsonPath,createdAtMs:Date.now()},v={sessionId:w,device:e,deviceId:e.id,port:u,xctestrunPath:p,xctestrunArtifact:c,jsonPath:f,testPromise:s,child:o,ready:!1,startupTimeoutMs:"number"==typeof(n=t.startupTimeoutMs)&&Number.isFinite(n)&&n>0?Math.floor(n):void 0,startupTimings:d,simulatorSetRedirect:m??void 0,lease:g};try{let e,t;e=cI(g.deviceId),a.mkdirSync(i.dirname(e),{recursive:!0}),t=`${e}.${process.pid}.${Date.now()}.tmp`,a.writeFileSync(t,JSON.stringify(g,null,2),"utf8"),a.renameSync(t,e)}catch(t){throw await cQ(e.id,v,{graceful:!1,waitTimeoutMs:1e3}),t}return cV.set(e.id,v),v}async function cW(e,t){if(!cO(t.child.pid))return await un({},"stop_stale_session",async()=>{await cQ(e.id,t,{graceful:!1,waitTimeoutMs:1e3})}),null;let r=t.xctestrunArtifact;if(r?.cache==="external")return ei({level:"debug",phase:"ios_runner_session_reuse",data:{deviceId:e.id,sessionId:t.sessionId,ready:t.ready,cache:r.cache}}),t;let n=ci(e,dX(e));return r?.derived!==n?(ei({level:"debug",phase:"ios_runner_session_artifact_stale",data:{deviceId:e.id,sessionId:t.sessionId,currentDerived:r?.derived,expectedDerived:n}}),await un({},"stop_stale_artifact_session",async()=>{await cQ(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 cz(e){if("simulator"===e.kind)for(let t of dR){let r=await cJ(e,t);if(!r||function(e){if(0===e.exitCode)return!0;let t=`${e.stdout}
|
|
12
|
-
${e.stderr}`.toLowerCase();return t.includes("not installed")||t.includes("found nothing")||t.includes("no such file")||t.includes("invalid device")||t.includes("could not find")}(r))continue}}async function
|
|
13
|
-
${t.stderr}`;if(/developer mode is currently disabled/i.test(r))throw new 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 c5(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 c6(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=lC(r),m=lE(f.command),h=te.fromTimeoutMs(i),w=function(e,t){var r;let n=lE(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(!cH.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 c7({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 c9({device:e,session:t,runnerCommand:f,logPath:n,deadline:h,timeoutMs:i,signal:a,readOnlyCommand:m})}catch(e){throw c8(e,t,w)}try{let e=await ue(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 cY(t,r)):cH.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 cY(t,e),r;if((u=r)instanceof eD&&u.details?.runner!==void 0)throw r;throw c8(r,t,w)}}function c8(e,t,r){return"skip"!==r.action||"recent_healthy_mutation"!==r.reason?e:(t.lastHealthyMutation=void 0,ut(e,{runnerReadinessPreflightSkipped:!0,runnerReadinessPreflightSkipReason:r.reason,runnerReadinessPreflightSkippedAgeMs:r.lastHealthyMutationAgeMs}))}async function c9(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 lT(t,r.port,n,i,d,r,s):await lq(t,r.port,n,d,s),c)}async function c7(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(ur(r),a.remainingMs());try{let e=await er("ios_runner_readiness_preflight",async()=>await lT(t,r.port,lC({command:"uptime"}),i,l,r,o),{command:n.command,commandId:n.commandId,reason:s.reason,lastHealthyMutationAgeMs:s.lastHealthyMutationAgeMs,sessionReady:r.ready,timeoutMs:l});await ue(e,r,i)}catch(e){throw ut(e,{runnerReadinessPreflightFailed:!0})}}async function ue(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 cG({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 ut(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 ur(e){return e.startupTimeoutMs??45e3}async function un(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 ui=new h;function ua(e,t={}){return{runCommand:e,...t}}function uo(e,t,r,n={}){if(r)return ul(r);let i=function(e,t={}){let r=ui.getStore();return r&&r.deviceId===e.id&&(r.requestId?r.requestId===t.requestId:!t.requestId)?r:void 0}(e,n);return i?ul(i.provider):ul(t)}async function us(e,t,r){if(!e)return await r();let n={provider:ul(e),deviceId:t.deviceId,requestId:t.requestId};return await ui.run(n,r)}function ul(e){return"function"==typeof e?{runCommand:e}:e}async function ud(e){let{device:t,session:r,command:n,transportError:i,options:a,signal:o,invalidationReason:s}=e,l=await up(t,r,n,i,a,o);return await uc(l,{command:n,session:r,transportError:i,invalidationReason:s,invalidateSession:e.invalidateSession})}async function uc(e,t){var r,n,i,a;if(!e)return await uu(t,"status_recovery_unavailable");if("recovered"===e.type){return r=e,uh({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,uh({command:(a=t).command,session:a.session,transportError:a.transportError,decision:"skipped",reason:i.reason,lifecycleState:i.lifecycleState}),i.error}return await uu(t,e.reason,e.lifecycleState,e.error)}async function uu(e,t,r,n){throw uh({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 up(e,t,r,n,i,a){var o,s,l,d,c,u,p,f,m,h,w,g;let v,y,S,I,A;if("status"===r.command||!r.commandId?.trim())return;let _=um(n);try{v=await c6(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 v.lifecycleState?v.lifecycleState:"";return ei({level:"debug",phase:"ios_runner_command_status_recovery",data:{command:r.command,commandId:r.commandId,lifecycleState:b,..._}}),o=v,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(lE(t.command))return{type:"skipInvalidation",error:r,reason:"read_only_completed_without_retained_response",lifecycleState:"completed"};let s=um(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,`${uf(a)}The runner is still reachable and reports "${i}" already completed, so agent-device kept the session open and will not replay it. Run snapshot -i to inspect the current UI, then continue from that observed state.`),logPath:n.logPath,transportError:r.message},r)}}(o,l,d,c):"failed"===s?{type:"skipInvalidation",reason:"runner_reported_failure",lifecycleState:s,error:(u=o,p=l,f=d,m=c,y="string"==typeof u.lifecycleErrorCode?u.lifecycleErrorCode:void 0,S="string"==typeof u.lifecycleErrorMessage?u.lifecycleErrorMessage:"Runner command failed",I="string"==typeof u.lifecycleErrorHint?u.lifecycleErrorHint:void 0,A=um(f),new eD(ex(y),S,{command:p.command,commandId:p.commandId,lifecycleState:"failed",recovery:"runner_reported_failure",...A,hint:I??(h=p.command,w=A,`${uf(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(lE(t.command))return r;let s=um(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,`${uf(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 uf(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 um(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 uh(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 uw(e,t){let r;lR(t.requestId);let n=rl(t.requestId),i=lC({command:"uptime"});for(let a=1;a<=2;a+=1){let o=await ug({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 ug(e){let{device:t,command:r,options:n,signal:i,attempt:a,recoveryReason:o}=e,s=Date.now(),l=await cK(t,{...n,cleanStaleBundles:a>1||n.cleanStaleBundles}),d=Date.now()-s;try{var c,u;let e=await ub(t,l,r,n,i,d,{recoveryReason:o});return{kind:"prepared",result:(c=t,u=e,ux(c,u),u)}}catch(e){return await uv({device:t,session:l,command:r,options:n,signal:i,attempt:a,error:e})}}async function uv(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&&uI(t)))return{kind:"prepared",result:await uy({device:n,session:i,command:a,options:o,signal:s,error:c})};if(!uI(c))throw d;let u=c.message||"runner_health_failed";if(l>=2)throw await uS(i,"prepare_runner_health_failed"),d;return lR(o.requestId),await cY(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 uy(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 cY(s,"prepare_cached_runner_health_failed"),await dJ(s.xctestrunArtifact,p);let f=Date.now(),m=await cK(o,{...d,cleanStaleBundles:!0,forceRunnerXctestrunRebuild:!0}),h=Date.now()-f;try{let e=await ub(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,ux(t,r),r}catch(r){let e;await uS(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 ux(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 uS(e,t){try{await cY(e,t)}catch{}}function uI(e){let t;return!ru(e)&&(lN(e)||lD(e)||(t=e.message.toLowerCase()).includes("timeout")||t.includes("timed out")||t.includes("deadline"))}async function uA(e,t,r){let n;lR(r.requestId);let i=rl(r.requestId);try{let a=(n=await cK(e,r)).ready?45e3:ur(n);return await c6(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")&&lD(a)&&n)return lR(r.requestId),await u_({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&&(lN(e)||(t=e.message.toLowerCase()).includes("timeout")||t.includes("timed out"))}(a))return lR(r.requestId),await u_({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&&lN(a))return await ud({device:e,session:n,command:t,transportError:a,options:r,signal:i,invalidationReason:"transport_error_after_command_send",invalidateSession:cY});throw o}}async function u_(e){let{device:t,command:r,options:n,signal:i,restartReason:a}=e;await cY(e.session,a);let o=await cK(t,{...n,cleanStaleBundles:!0});try{let a=await c6(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(lN(e))return await ud({device:t,session:o,command:r,transportError:e,options:n,signal:i,invalidationReason:"transport_error_after_retry_command_send",invalidateSession:cY});throw a}}async function ub(e,t,r,n,i,a,o){var s,l,d,c,u;let p,f,m=Date.now();return s=await c6(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 ux(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 uM(e,t,r={}){c5(e),lR(r.requestId);let n=lC(t),i=uk(e,r);return lE(n.command)?e7(()=>(lR(r.requestId),i.runCommand(e,n,r)),{shouldRetry:e=>(lR(r.requestId),lN(e))}):i.runCommand(e,n,r)}function uN(e,t={}){if("ios"!==e.platform)return;let{propagateError:r=!1,...n}=t,i=uk(e,n);return i.prewarm?i.prewarm(e,n).then(()=>{}).catch(t=>{if(ei({level:"warn",phase:"ios_runner_session_prewarm_failed",data:{deviceId:e.id,error:t instanceof Error?t.message:String(t)}}),r)throw t}):void ei({level:"debug",phase:"ios_runner_session_prewarm_unavailable",data:{deviceId:e.id}})}async function uD(e,t){c5(e),lR(t.requestId);let r=lC({command:"uptime"}),n=uk(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 uk(e,t){return uo(e,uP,void 0,{requestId:t.requestId})}let uP=ua(uA,{prepare:uw,prewarm:async(e,t)=>{await uw(e,{...t,healthTimeoutMs:45e3})}}),uE=new WeakMap;async function uC(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||lu;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=lf(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,nw(r)?.leaseAdmissionExempt===!0||e.meta?.sessionIsolation!=="tenant")return;let n=lw(e);t.assertLeaseAdmission({tenantId:n.tenantId,runId:n.runId,leaseId:n.leaseId,backend:n.leaseBackend})}(s,o);let m=nw(l)?.sessionExecutionLockExempt!==!0?await lS({req:s,sessionName:d,sessionStore:a}):[],h=(r=o,(i=uE.get(r))||(i=new Map,uE.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 uR(h,m,async()=>(rc(s.meta?.requestId),await e()))}}async function uR(e,t,r){let[n,...i]=t;return n?await lo(e,n,async()=>await uR(e,i,r)):await r()}function uO(){return{ok:!1,error:eN(new eD("UNAUTHORIZED","Invalid token"))}}async function uT(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 sX({req:t.req,session:i,sessionName:t.sessionName,logPath:r,sessionStore:n,contextFromFlags:t.contextFromFlags});return t.finalize(a)}function uL(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 u$(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}
|
|
14
|
-
`)},flush:()=>{n&&(i(n),n="")}}}function
|
|
15
|
-
`,recoveredLineCount:l.length}}async function uK(e,t,r,n,i,a){let o=await uW({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 l_(["spawn",t,"log","stream","--style","compact","--level","info","--predicate",uB(r,n)],{simulatorSetPath:i})}({deviceId:e,appBundleId:t,executableName:o,simulatorSetPath:i}),stream:r,redactionPatterns:n,pidPath:a})}function uX(e){return e.replaceAll("\\","\\\\").replaceAll('"','\\"')}async function uW(e){let{deviceId:t,appBundleId:r,simulatorSetPath:n}=e,a=await ij(l_(["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 uz(e,t,r,n){return uZ({backend:"macos",cmd:"log",args:["stream","--style","compact","--predicate",uB(e)],stream:t,redactionPatterns:r,pidPath:n})}async function uJ(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=uF(e.stream,{redactionPatterns:e.redactionPatterns});"number"==typeof n.pid&&t6(e.pidPath,n.pid);let a=uU(n,e.stream,{endStreamOnClose:!0,writer:i}).then(r=>(0!==r.exitCode&&(t="failed"),t8(e.pidPath),r),r=>{throw t="failed",t8(e.pidPath),r});return{backend:e.backend,getState:()=>t,startedAt:Date.now(),wait:a,stop:async()=>{n.killed||n.kill("SIGINT"),await u$(a),n.killed||n.kill("SIGKILL"),await u$(a),t8(e.pidPath)}}}let uY=RegExp("\\b(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)\\b\\s+https?:\\/\\/","i"),uQ=/https?:\/\/[^\s"'<>\])]+/i,u0=[/\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 u1(e,t,r=e.limits.maxEntries){let n=[...e.entries],i=new Set(n.map(e=>u3(e)));for(let e of t.entries){let t=u3(e);if(!i.has(t)&&(i.add(t),n.push(e),n.length>=r))break}return{...e,matchedLines:n.length,entries:n}}function u2(e,t){let r=pn(t?.maxEntries,25,1,200),n=t?.backend,i=t?.include??"summary",a=pn(t?.maxPayloadChars,2048,64,16384),o=pn(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=u7(s,["method","httpMethod"]),d=u7(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=uY.exec(o),p=/\bmethod["'=: ]+([A-Z]+)\b/i.exec(o),f=(l??p?.[1]??u?.[1])?.toUpperCase(),m=uQ.exec(o),h=d??m?.[0];if(!h)return null;let w=c??u5(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:u6(o),packetId:u8(o)??void 0,durationMs:u9(o)??void 0,raw:pr(o,a),line:r};if("android"===n&&function(e,t,r){let n=u4(t,r,5),i=e.packetId??n.map(e=>u8(e)).find(e=>"string"==typeof e&&e.length>0);i&&(e.packetId=i);let a=i?u4(t,r,12).filter(e=>u8(e)===i):n;e.timestamp||(e.timestamp=a.map(e=>u6(e)).find(e=>"string"==typeof e&&e.length>0)),void 0===e.status&&(e.status=a.map(e=>u5(e)).find(e=>"number"==typeof e)),void 0===e.durationMs&&(e.durationMs=a.map(e=>u9(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 pt(e)}let r=/\bheaders?["'=: ]+(\{.*\})/i.exec(e);return r?.[1]?.trim()}(o,s);e&&(g.headers=pr(e,a))}if("body"===i||"all"===i){let e=pe(o,s,["requestBody","body","payload","request"]),t=pe(o,s,["responseBody","response"]);e&&(g.requestBody=pr(e,a)),t&&(g.responseBody=pr(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 u3(e){return`${e.timestamp??""}|${e.method??""}|${e.url}|${e.status??""}|${e.raw}`}function u4(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 u5(e){for(let t of u0){let r=t.exec(e);if(!r)continue;let n=Number.parseInt(r[1]??"",10);if(Number.isInteger(n))return n}return null}function u6(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 u8(e){let t=/\bpacket id (\d+)\b/i.exec(e);return t?.[1]??null}function u9(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 u7(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 pe(e,t,r){if(t){for(let e of r)if(void 0!==t[e])return pt(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 pt(e){if("string"==typeof e)return e;try{return JSON.stringify(e)}catch{return String(e)}}function pr(e,t){return e.length<=t?e:`${e.slice(0,t)}...<truncated>`}function pn(e,t,r,n){return void 0!==e&&Number.isInteger(e)?Math.max(r,Math.min(n,e)):t}let pi={start:async e=>await pm(e)},pa=ik(pi,function(e={}){return{...pi,...e}});async function po(e,t){return await pa.run(e,t)}function ps(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 pl(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:ps("AGENT_DEVICE_APP_LOG_MAX_BYTES",5242880),maxRotatedFiles:ps("AGENT_DEVICE_APP_LOG_MAX_FILES",1)})}function pd(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 pc(e){return"macos"===e.platform?"macos":"ios"===e.platform?"device"===e.kind?"ios-device":"ios-simulator":"android"}async function pu(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:v}=e,y=pc(c),S=(t={backend:y,maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:v},o=pn(t?.maxEntries,25,1,200),s=t?.include??"summary",l=pn(t?.maxPayloadChars,2048,64,16384),d=pn(t?.maxScanLines,4e3,100,2e4),a.existsSync(m)?u2(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 pp({device:c,appBundleId:u,appLogPath:m,appLogState:p});if(A){let e=await uj(c.id,u);if(e){let t=u2(e.text,{path:`${m} (adb logcat recovery)`,backend:"android",maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:v});t.entries.length>0&&(S=u1(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 ph({deviceId:c.id,appBundleId:u,startedAt:f,simulatorSetPath:c.simulatorSetPath,appLogPath:m,maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:v});e&&(e.dump.entries.length>0?(S=u1(e.dump,S,h),I.push(`Recovered ${e.dump.entries.length} iOS simulator HTTP entr${1===e.dump.entries.length?"y":"ies"} from simctl log show (${e.recoveredLineCount} app log lines scanned).`)):e.recoveredLineCount>0&&I.push(`Recovered ${e.recoveredLineCount} recent iOS simulator app log lines from simctl log show, but none looked like HTTP traffic. This app may not emit request URLs, status, or timing into Unified Logging for this repro window.`))}return void 0===p?I.push("Capture uses the session app log file. For fresh traffic, run logs clear --restart before reproducing requests."):"active"!==p&&0===I.length&&("ios"===c.platform&&"simulator"===c.kind?I.push("Session app log stream is inactive. The iOS simulator recovery path scanned recent simctl log history, but a fresh logs clear --restart window is still the most reliable repro loop."):I.push("Session app log stream is inactive. Run logs clear --restart, reproduce the request window again, then rerun network dump.")),0===S.entries.length&&I.push("ios"===(i=c).platform&&"simulator"===i.kind?"No HTTP(s) entries were found in recent iOS simulator app logs. If the app only emits non-HTTP diagnostics, inspect logs path or add app-side URLSession/network logging for per-request timing and payload details.":"ios"===i.platform?"No HTTP(s) entries were found in recent iOS device app logs. iOS network dump only sees what the app emits into Unified Logging for this process.":"No HTTP(s) entries were found in recent session app logs."),{backend:y,dump:S,notes:I}}async function pp(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 t5(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),t4));if(!s)return null;let l=await uq(t.id,r);return l&&l!==s?{reason:"stale-active",trackedPid:s}:null}async function pf(e,t,r,n){return await pa.resolve(void 0).start({device:e,appBundleId:t,outPath:r,pidPath:n})}async function pm({device:e,appBundleId:t,outPath:r,pidPath:n}){pl(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 uJ(e.id,i,o,n):await uK(e.id,t,i,o,e.simulatorSetPath,n);if("android"===e.platform)return uG(t),await uV(e.id,t,i,o,n);if("macos"===e.platform)return await uz(t,i,o,n);throw i.end(),new eD("UNSUPPORTED_PLATFORM",`unsupported platform: ${e.platform}`)}async function ph(e){let t=await uH({deviceId:e.deviceId,appBundleId:e.appBundleId,startedAt:e.startedAt,simulatorSetPath:e.simulatorSetPath});return t?{dump:u2(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 pw(e){await e.stop(),await u$(e.wait)}async function pg(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 e6(e,["shell","echo","ok"],{allowFailure:!0,timeoutMs:1e3});r.adbAvailable=0===t.exitCode}catch{r.adbAvailable=!1}if(t)try{r.androidPidVisible=(await e6(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 ij(["simctl","help"],{allowFailure:!0});r.simctlAvailable=0===e.exitCode}catch{r.simctlAvailable=!1}if("ios"===e.platform&&"device"===e.kind)try{let e=await ij(["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 pv(e,t){pl(e);let r=`[agent-device][mark][${new Date().toISOString()}] ${t.trim()||"marker"}
|
|
16
|
-
`;a.appendFileSync(e,r,"utf8")}function
|
|
17
|
-
${t}`.toLowerCase();return r.includes("device is busy")&&r.includes("connecting")?"iOS device is still connecting. Keep it unlocked and connected by cable until it is fully available in Xcode Devices, then retry.":r.includes("coredeviceservice")&&r.includes("timed out")?"CoreDevice service timed out. Reconnect the device and retry; if it persists restart Xcode and the iOS device.":null}async function pC(e,t){try{let r=await iV(e),n=r?.[t];if("string"==typeof n&&n.length>0)return n}catch{}try{let r=await iq("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,l7(l9(r),(e,t)=>{void 0===i&&e===n&&"string"===t.name&&(i=t.text??void 0)}),i}catch{return}}let pR="xctrace-animation-hitches";function pO(e,t){let r=l9(e),n=pA(r,t);return{rows:0===n.length?[]:pI(r,e=>"row"===e.name),schema:n}}function pT(e,t){for(let r of e)pT(r.children,t),r.attributes.id&&t.set(r.attributes.id,{numberValue:p_(r),process:pL(r)})}function pL(e){if(!e||e.children.some(e=>"sentinel"===e.name))return null;let t=p_(pS(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 p$="ps-process-snapshot",pF="ps-process-snapshot",pU="xctrace-activity-monitor",pG="xctrace-activity-monitor",pq="leaks-output-graph",pj="Memory graph captured with leaks --outputGraph for host-visible Apple app processes.";async function pV(e,t){if("ios"===e.platform&&"device"===e.kind)return await p9(e,t);let r=await p8(e,t),n=await fi(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 fc({usagePercent:n.reduce((e,t)=>e+t.cpuPercent,0),residentMemoryKb:n.reduce((e,t)=>e+t.rssKb,0),measuredAt:i,matchedProcesses:[r.executableName],cpuMethod:p$,memoryMethod:pF})}async function pB(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 fo(e,t,a);if(!1===o.available)return o;let{process:l}=o;await s.mkdir(i.dirname(r),{recursive:!0});let d=await pK(r);try{n=await pH(e,r,l.pid)}catch(n){throw await pX(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(fd(r.command)),path:n,hint:fs(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(fd(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 pX(r,d),new eD("COMMAND_FAILED",`Failed to capture Apple memgraph for ${t}`,{kind:"memgraph",appBundleId:t,pid:l.pid,processName:i.basename(fd(l.command)),path:r,exitCode:n.exitCode,stdout:n.stdout,stderr:n.stderr,hint:fs(e,n.stdout,n.stderr)});let c=await s.stat(r).catch(()=>null);if(!c?.isFile()||c.size<=0)throw await pX(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:pq,appBundleId:t,pid:l.pid,processName:i.basename(fd(l.command)),support:a}}async function pH(e,t,r){return"macos"===e.platform?await iq("leaks",[`--outputGraph=${t}`,String(r)],{allowFailure:!0,timeoutMs:12e4}):await ij(lb(e,["spawn",e.id,"leaks",`--outputGraph=${t}`,String(r)]),{allowFailure:!0,timeoutMs:12e4})}async function pK(e){return await s.stat(e).then(e=>e.isFile()).catch(()=>!1)}async function pX(e,t){t||await s.rm(e,{force:!0}).catch(()=>{})}async function pW(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 p7(e,t),p=await pY(e,t,u);return n=pO((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}=pO(e,"device-display-info"),n=r.indexOf("max-refresh-rate");if(n<0)return;let i=new Map;for(let e of t){pT(e.children,i);let t=pb(e.children[n],i);if(null!==t&&t>0)return t}}(r.displayInfoXml),s=(o=(function(e){let t,r,n=l9(e),i=Object.values(r={start:(t=pA(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 pI(n,e=>"row"===e.name).map(e=>(function(e,t,r){var n,i,a;let o;if(pT(e.children,r),!0===(n=e.children[t.isSystem],null===(o=pb(n,r))?null:0!==o))return null;let s=pb(e.children[t.start],r),l=pb(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:pL(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:px(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?px(s/n*100):0,droppedFrameCount:s,totalFrameCount:n,sampleWindowMs:l,windowStartedAt:r.windowStartedAt,windowEndedAt:r.windowEndedAt,measuredAt:r.measuredAt,method:pR,matchedProcesses:[...new Set(o.map(e=>e.processName).filter(e=>"string"==typeof e&&e.length>0))],frameDeadlineMs:void 0===a?void 0:px(1e3/a),refreshRateHz:a,worstWindows:c.length>0?c:void 0}}function pz(e){return"ios"===e.platform&&"device"===e.kind?{method:pR,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:pR,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 pJ(e){let t=pz(e);if("ios"===e.platform&&"device"===e.kind)return{fps:t,memory:{method:pG,description:"Resident memory snapshot from a short xctrace Activity Monitor sample on the connected iOS device.",unit:"kB"},cpu:{method:pU,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:pF,description:`Resident memory snapshot from ${r}`,unit:"kB"},cpu:{method:p$,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:pq,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:pq,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:pq,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:pq,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 pY(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 pQ({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 p4(e,t,a,"hitches",o),await p4(e,t,a,"hitches-frame-lifetimes",l);let i=await p5(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 pQ(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 p0(s,e.tracePath);if(0===l.result.exitCode)return e.validateTraceOutput&&await p3(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:fp(l.result.stdout,l.result.stderr)})}async function p0(e,t){let r;for(let n=1;n<=3;n+=1){await p2(t,n,1500);let i=new Date().toISOString(),a=await ij(e,{allowFailure:!0,timeoutMs:6e4});if(r={result:a,startedAt:i,endedAt:new Date().toISOString(),capturedAtMs:Date.now()},0===a.exitCode||!p1(a))break}return r}function p1(e){let t=`${e.stdout}
|
|
18
|
-
${e.stderr}`.toLowerCase();return t.includes("_lockkperf")||t.includes("could not lock kperf")||t.includes("likely another session just started")}async function
|
|
19
|
-
${i}`.toLowerCase();return n.includes("simctl spawn")&&n.includes(" ps ")&&a.includes("no such file")}(e,t))return{available:!1,kind:"memgraph",reason:"iOS simulator memgraph capture needs process tools inside simctl spawn, but this simulator runtime did not provide ps.",hint:"Use perf memory sample when available, or retry memgraph on a simulator runtime that includes process tools such as ps and leaks.",support:{...r,memgraph:!1}};throw t}}function
|
|
20
|
-
${r}`.toLowerCase();return n.includes("timed out")||n.includes("timeout")?"Apple memgraph capture can take longer than metric sampling. Keep the app running and retry; if it times out again, collect a smaller reproduction before capturing leaks --outputGraph.":n.includes("not found")||n.includes("no such file")?"Install Xcode command line tools and ensure leaks is available, then retry.":n.includes("permission")||n.includes("denied")||n.includes("not authorized")?"macos"===e.platform?"Grant the agent terminal process permission to inspect this macOS app, then retry.":"Keep the simulator booted and app running; if inspection is denied, retry with a debug simulator build.":"Keep the app process running and retry perf memory snapshot with --debug if the failure persists."}async function
|
|
21
|
-
${t}`.toLowerCase();return n.includes("no device matched")||n.includes("failed to find device")?
|
|
22
|
-
`,"utf8"),c}finally{await s.rm(t,{recursive:!0,force:!0}).catch(()=>{})}}async function fv(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 p7(e,t);return{pids:r.map(e=>e.pid),processNames:tZ(r.map(e=>i.basename(d(e.executable))))}}let r=await p8(e,t),n=await fi(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 fy(e,t,r){let n;for(let r=1;r<=3;r+=1){await p2(t,r,1500);let i=ek("xcrun",e,{allowFailure:!0}),a=await fS(i.wait);if(!a)return i;if(n=a,!p1(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:fp(i.stdout,i.stderr)})}async function fS(e){return await Promise.race([e,new Promise(e=>setTimeout(e,500))])}async function fI(e,t){e.child.kill("SIGINT");let r=await fA(e.wait,45e3);if(r)return r;e.child.kill("SIGKILL");let n=await fA(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 fA(e,t){return await Promise.race([e,new Promise(e=>setTimeout(e,t))])}async function f_(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 fb(e){let t=e.replaceAll(",","").match(/^-?\d+(?:\.\d+)?/);if(!t)return null;let r=Number(t[0]);return Number.isFinite(r)?r:null}function fx(e){return Math.round(10*e)/10}let fM="adb-shell-dumpsys-gfxinfo-framestats",fN="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 fD(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 fk(e){return 0===e.length?{}:{firstFrameNs:Math.min(...e.map(e=>e.intendedVsyncNs)),lastFrameNs:Math.max(...e.map(e=>e.frameCompletedNs))}}function fP(e,t){if(void 0!==e&&void 0!==t)return Math.max(0,Math.round((t-e)/1e6))}function fE(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:fb(i)??void 0}async function fC(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,v,y,S,I=(n=(await u(["shell","dumpsys","gfxinfo",t,"framestats"],{timeoutMs:15e3})).stdout,i=new Date().toISOString(),function(e,t){if(/no process found for:/i.test(e))throw new 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=fE(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=fb(i)??void 0,s=Number(a);if(void 0===o||!Number.isFinite(s)||r<0)return;let l=fE(t,"Uptime"),d=fE(t,"Stats since");return{droppedFramePercent:px(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=fD(e,t,"Flags"),n=fD(e,t,"IntendedVsync"),i=fD(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=fk(t),a=n?.statsSinceNs,o=a??i.firstFrameNs,s=fP(o,i.lastFrameNs),l=n?.sampleWindowMs??s;if(!Number.isFinite(r)||n?.uptimeMs===void 0||void 0===o)return{sampleWindowMs:l,windowStartNs:o};let d=r-n.uptimeMs;return{sampleWindowMs:l,windowStartNs:o,windowStartedAt:new Date(d+o/1e6).toISOString(),windowEndedAt:function(e){let{deviceBootWallClockMs:t,measuredAtMs:r,summaryStartNs:n,lastFrameNs:i}=e;return void 0!==n?new Date(r).toISOString():void 0===i?void 0:new Date(t+i/1e6).toISOString()}({deviceBootWallClockMs:d,measuredAtMs:r,summaryStartNs:a,lastFrameNs:i.lastFrameNs}),timestampSource:"estimated-from-device-uptime"}}({frames:f,measuredAtMs:h,summary:p}),g=function(e){let{frames:t,frameDeadlineNs:r,summaryDroppedFrameCount:n}=e;return void 0!==n?n<=0?[]:[...t].sort((e,t)=>t.durationNs-e.durationNs).slice(0,n).sort((e,t)=>e.intendedVsyncNs-t.intendedVsyncNs):void 0===r?[]:t.filter(e=>e.durationNs>r)}({frames:f,frameDeadlineNs:m,summaryDroppedFrameCount:p?.droppedFrameCount}),v=p?.sampleWindowMs??w.sampleWindowMs??function(e){if(0===e.length)return;let t=fk(e);return fP(t.firstFrameNs,t.lastFrameNs)}(f),a=p,o=f,s=g,d=a?.totalFrameCount??o.length,c=a?.droppedFrameCount??s.length,y={totalFrameCount:d,droppedFrameCount:c,droppedFramePercent:a?.droppedFramePercent??(d>0?px(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:fx(Math.max(...t.map(e=>e.durationNs))/1e6)}})({frames:e,windowStartNs:r,measuredAtMs:n,uptimeMs:i})).sort((e,t)=>t.missedDeadlineFrameCount-e.missedDeadlineFrameCount||t.worstFrameMs-e.worstFrameMs).slice(0,3).sort((e,t)=>e.startOffsetMs-t.startOffsetMs)}({frames:t,windowStartNs:r.windowStartNs,measuredAtMs:n,uptimeMs:i?.uptimeMs});return a.length>0?a:void 0}({droppedFrames:g,timing:w,measuredAtMs:h,summary:p}),{...y,sampleWindowMs:v,...(l=m,{frameDeadlineMs:void 0===l?void 0:fx(l/1e6),refreshRateHz:void 0===l?void 0:fx(1e9/l)}),windowStartedAt:w.windowStartedAt,windowEndedAt:w.windowEndedAt,timestampSource:w.timestampSource,measuredAt:i,method:fM,source:p?"android-gfxinfo-summary":"framestats-rows",worstWindows:S&&S.length>0?S:void 0});return await fR(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 fR(e,t,r={}){let n=tN(e,r.adb);try{await n(["shell","dumpsys","gfxinfo",t,"reset"],{allowFailure:!0,timeoutMs:3e3})}catch{}}function fO(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.":fT("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.":fT(i))},n)}return new eD("COMMAND_FAILED",`Failed to ${e} Android ${t} for ${r}`,{action:e,package:r,tool:t,hint:fT(t)},n)}function fT(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 fL(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 f$(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 f$(e,t,r){try{let n=await fC(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 fF="adb-shell-simpleperf",fU="adb-shell-perfetto",fG="/data/local/tmp";async function fq(e,t,r){let n=tN(e,r.adb);await fW(n,t),await fJ(n,t),await fz(n,t);let i=await fK(t.outPath);await fB(n,t.remotePath);let a=Date.now(),o=Math.max(0,a-t.startedAt),s=await fL(e,t,i,o,{adb:n});return{...t,action:"stop",platform:"android",state:"stopped",stoppedAt:a,durationMs:o,sizeBytes:i,method:"simpleperf"===t.kind?fF:fU,artifact:{path:t.outPath,sizeBytes:i},summary:s,message:`Stopped Android ${t.kind} ${t.type} for ${t.packageName}`}}async function fj(e,t,r={}){let n=tN(e,r.adb);try{"running"===t.state&&(await fW(n,t),await fJ(n,t).catch(()=>{}))}finally{await fB(n,t.remotePath)}}function fV(e,t,r=fG){let n=e.replace(/[^A-Za-z0-9_.-]/g,"_");return`${r}/agent-device-${n}-${Date.now()}-${t}`}async function fB(e,t){try{await e(["shell",`rm -f ${fX(t)}`],{allowFailure:!0,timeoutMs:15e3})}catch{}}async function fH(e,t){await s.mkdir(i.dirname(e),{recursive:!0}),await s.writeFile(e,`${JSON.stringify(t,null,2)}
|
|
23
|
-
`)}async function
|
|
24
|
-
${p}`.toLowerCase()).includes("profileable")||r.includes("debuggable")||r.includes("not allowed")?"Android heap dumps require a debuggable/profileable app process on many devices. Use a debug/profileable build, reopen the app, then retry.":r.includes("permission")||r.includes("denied")?"The device denied heap dump access. Use a debug/profileable build or a device image that permits app heap dumping.":"Reopen the app to refresh the process, then retry perf memory snapshot. If it still fails, run with --debug and inspect adb am dumpheap output.")})}let n=await o(["pull",d,r],{allowFailure:!0,timeoutMs:12e4});if(0!==n.exitCode)throw await
|
|
25
|
-
`:
|
|
26
|
-
</map>`)}function
|
|
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
|
|
28
|
-
${r.stderr}`.toLowerCase(),s=o.includes("already booted")||o.includes("current state: booted");if(0!==r.exitCode&&!s)throw new
|
|
29
|
-
${t}`.toLowerCase().includes("timed out waiting for all destinations")?"Xcode destination did not become available in time. Keep device unlocked and retry.":pP)}function m4(e,t,r){return t||nc(r,ns)?null:aV("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 m6(e,t){mX(e)&&!(t<=0)&&await new Promise(e=>setTimeout(e,t))}async function m8(e){let t=nc(e.flags,ns)||!e.session?await r7(e.flags??{}):await m9(e.session.device);return!1!==e.ensureReady&&await mQ(t),t}async function m9(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 r7(t)}catch(e){if(!(e instanceof eD)||"DEVICE_NOT_FOUND"!==e.code)throw e}return await r7({platform:"ios",target:e.target,device:e.name,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}})}function m7(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 he(e,t){return!!t&&0===ld(t,e).length}async function ht(e){let{device:t,shutdownRequested:r}=e;if(r&&(mX(t)||"android"===t.platform&&"emulator"===t.kind))return await mW(t)}async function hr(e){if(await c0(e.device.id),"macos"!==e.device.platform)return;let t="frontmost-app"===e.surface?{surface:"frontmost-app"}:e.appBundleId?{bundleId:e.appBundleId}:{};await i9("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 hn(e){e.applePerf?.active&&(await fw(e.applePerf.active),e.applePerf={...e.applePerf??{},active:void 0})}async function hi(e){let t=e.nativePerf?.android;t&&(await fj(e.device,t),e.nativePerf={...e.nativePerf??{},android:void 0})}async function ha(e,t){e.appLog&&await pw(e.appLog),await hn(e),await hi(e),eQ(e.device.platform)&&await hr(e),await mF(t).catch(()=>{})}async function ho(e){let{req:t,sessionName:r,logPath:n,sessionStore:i}=e,a=i.get(r);if(!a)return await hs(t,n);a.appLog&&await pw(a.appLog),await hn(a),await hi(a),t.positionals&&t.positionals.length>0&&(eQ(a.device.platform)&&!mX(a.device)&&await hr(a),await io(a.device,"close",t.positionals,t.flags?.out,{...aP(n,t.flags,a.appBundleId,a.trace?.outPath)}),await m6(a.device,300)),eQ(a.device.platform)&&(!mX(a.device)||t.flags?.shutdown||a.recording)?await hr(a):eQ(a.device.platform)&&ei({level:"debug",phase:"ios_runner_retained_after_close",data:{session:a.name,deviceId:a.device.id}}),mS(i.getRuntimeHints(r))&&a.appBundleId&&await mA({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 mF(r).catch(()=>{}),i.delete(r);let o=await ht({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 hs(e,t){if(!e.positionals||0===e.positionals.length)return aV("SESSION_NOT_FOUND","No active session");let r=await m8({session:void 0,flags:e.flags,ensureReady:!0});return await io(r,"close",e.positionals,e.flags?.out,{...aP(t,e.flags)}),await m6(r,300),{ok:!0,data:{app:e.positionals[0],...G(`Closed: ${e.positionals[0]}`)}}}async function hl(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 hd(e){a.existsSync(e)&&a.unlinkSync(e)}function hc(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 hu(e){let t=hc(e);if(!t||t.pid===process.pid)try{a.existsSync(e)&&a.unlinkSync(e)}catch{}}function hp(e){if(void 0===e)return;let t=Number(e);if(Number.isInteger(t))return t}function hf(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,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,t4);if(a.existsSync(t))try{let e=t5(a.readFileSync(t,"utf8"));if(e&&function(e){let t,r=ey(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{t8(t)}}let I=new t1(m),A=new r2({maxActiveSimulatorLeases:hp(o.AGENT_DEVICE_MAX_SIMULATOR_LEASES),defaultLeaseTtlMs:hp(o.AGENT_DEVICE_LEASE_TTL_MS),minLeaseTtlMs:hp(o.AGENT_DEVICE_LEASE_MIN_TTL_MS),maxLeaseTtlMs:hp(o.AGENT_DEVICE_LEASE_MAX_TTL_MS)}),_=tb(),b=r.randomBytes(24).toString("hex"),x=ey(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 uO();try{return await nr(c,async()=>{let t=await uC({req:e,sessionStore:p,leaseRegistry:f});return await h(t)})}catch(e){return uL(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:lg(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,nw(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,nw(n)?.selectorValidationExempt!==!0)&&function(e,t){let r=ld(e,t);if(0!==r.length)throw new eD("INVALID_ARGS",`Session "${e.name}" is already bound to ${ls(e)}, but this request selected ${r.map(lc).join(", ")}.`,{session:e.name,conflicts:r.map(lc),hint:ll(e,"selector-conflict")})}(c,p.flags);let m=(e,t,r)=>{let n;return{...aP(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 nv({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 s5({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,nw(o)?.replayScopedAction!==!0))return await m(e);if(!t9(e.token,r))return uO();try{let r=await uC({req:e,sessionStore:p,leaseRegistry:f});return r.sessionName===t.sessionName?await h(r,n):await m(e)}catch(e){return uL(e)}}):void 0,androidAdbExecutor:a.androidAdbExecutor,contextFromFlags:i.handlerContextFromFlags});return s?i.finalize(s):await uT({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=ha(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,
|
|
31
|
-
`)})]),
|
|
32
|
-
`)}})})).destroyConnections=()=>{for(let e of t)e.destroy();t.clear()},n);r.push(i),e=await
|
|
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.":`${tn("IOS_RUNNER_CONNECT_TIMEOUT")} ${lO}`)})}function lF(e){return"snapshot"===e||"screenshot"===e||"findText"===e||"querySelector"===e||"readText"===e||"alert"===e||"status"===e||"uptime"===e}function lU(e){return"status"===e.command||e.commandId?.trim()?e:{...e,commandId:`runner-${r.randomUUID()}`}}function lG(e){if(ru(e))throw rf()}let lq=new Map;async function lj(e,t,r,n,i=45e3,a,o){let s=e9.fromTimeoutMs(i),{getEndpoints:l}=lz(e,t),{endpoints:d}=await l(s.remainingMs()),c=null,u=Math.max(1,Math.ceil(i/250));try{return await to(async({deadline:s})=>{let u=await lV({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 rf();return new eC("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:lT},{deadline:s,phase:"ios_runner_connect",signal:o})}catch(e){if(o?.aborted||rh(e))throw rf();c||(c=e)}if(o?.aborted)throw rf();if("simulator"===e.kind){let i=s.remainingMs();if(i<=0)throw lL({port:t,endpoints:d,logPath:n,lastError:c});let a=await l1(e,t,r,i,o);return new Response(a.body,{status:a.status})}throw lL({port:t,endpoints:d,logPath:n,lastError:c})}async function lV(e){await lB(e);let t=await lH(e);if(t.response)return t.response;let r=await lK(e);return r||await lX(e,t.usedCachedTunnelIp)}async function lB(e){if(e.attemptDeadline?.isExpired())throw new eC("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 l$({session:e.session,port:e.port,logPath:e.logPath})}async function lH(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 lJ(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,lq.delete(i))}}),usedCachedTunnelIp:r}}async function lK(e){return"simulator"===e.device.kind&&e.session?.ready?await lZ(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,lq.delete(r);let n=await e.getEndpoints(e.attemptDeadline?.remainingMs(),!0);return e.setEndpoints(n.endpoints),await lJ(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 lW(e,t,r,n=45e3,i){if(i?.aborted)throw rf();let a=e9.fromTimeoutMs(n),{getEndpoints:o}=lz(e,t),{endpoints:s}=await o(a.remainingMs()),l=s[0];if(!l)throw new eC("COMMAND_FAILED","Runner command endpoint not available",{port:t,endpoints:s});let d=a.remainingMs();if(d<=0)throw new eC("COMMAND_FAILED","Runner command deadline exceeded",{timeoutMs:n});return await lQ(l,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)},d,i)}function lz(e,t){let r;return{getEndpoints:async(n,i=!1)=>{var a,o,s;let l,d=await lY({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 lJ(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 eC("COMMAND_FAILED","Runner connection deadline exceeded",{port:n,timeoutMs:i});return await lQ(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)},Math.min(2e4,e),a)}catch(e){if(a?.aborted||rh(e))throw rf();s(t,e)}return null}async function lZ(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 l1(e,t,r,s,i);return new Response(n.body,{status:n.status})}catch(e){if(i?.aborted||rh(e))throw rf();return o(e),null}}async function lY(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=lq.get(t))?e.expiresAt<=Date.now()?(lq.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 l0(i.id,a);return l(d),d&&(r=i.id,n=d,lq.set(r,{ip:n,expiresAt:Date.now()+3e4})),{ip:d,sharedCacheHit:!1}}async function lQ(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 l0(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 iz(["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{l6(n)}}async function l1(e,t,r,n,i){let a=JSON.stringify(r),o=lE(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 iz(o,{allowFailure:!0,timeoutMs:n,signal:i}),l=s.stdout;if(0!==s.exitCode){let e=tt({message:"Runner did not accept connection (simctl spawn)",stdout:s.stdout,stderr:s.stderr,context:{platform:"ios",phase:"connect"}});throw new eC("COMMAND_FAILED","Runner did not accept connection (simctl spawn)",{port:t,stdout:s.stdout,stderr:s.stderr,exitCode:s.exitCode,reason:e,hint:tn(e)})}return{status:200,body:l}}async function l2(){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 eC("COMMAND_FAILED","Failed to allocate port")))}),r.on("error",t)})}function l3(e,t,r,n){t&&l4(t,e),r&&l4(r,e),n&&process.stderr.write(e)}let l5=new Map;function l4(e,t){let r=(l5.get(e)??Promise.resolve()).catch(()=>{}).then(async()=>{await a.promises.mkdir(i.dirname(e),{recursive:!0}),await a.promises.appendFile(e,t)}).catch(()=>{}).finally(()=>{l5.get(e)===r&&l5.delete(e)});l5.set(e,r)}function l6(e){try{a.existsSync(e)&&a.unlinkSync(e)}catch{}}let l8=new Set(["RUNNER_PRODUCT_MISSING","RUNNER_PRODUCT_REPAIR_FAILED"]);async function l9(e,t,r){if("macos"!==e.platform)return;if(0===t.length)throw new eC("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 eC("COMMAND_FAILED","Missing macOS runner product",{reason:"RUNNER_PRODUCT_MISSING",productPath:e,xctestrunPath:r});for(let e of n)if(!await l7(e)){await iW("codesign",["--remove-signature",e],{allowFailure:!0});try{await iW("codesign",["--force","--sign","-",e])}catch(n){let t=n instanceof eC?n:new eC("COMMAND_FAILED",String(n));throw new eC("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 l7(e){return 0===(await iW("codesign",["--verify","--deep","--strict",e],{allowFailure:!0})).exitCode}let de=new Set("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.:-"),dt=new Set([" "," ","\n","\r"]),dr=new Set(["__defineGetter__","__defineSetter__","__proto__","constructor","prototype"]);function dn(e,t={}){let r=t.maxDocumentChars??0x8000000;if(e.length>r)throw Error(`XML document exceeds maximum supported size of ${r} characters.`);return new da(e).parse()}function di(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)}di(r.children,t)}}class da{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(dr.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?ds(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])&&de.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,ds(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])&&dt.has(e);)this.index+=1}startsWith(e){return this.xml.startsWith(e,this.index)}}function ds(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 dl=new Set(["ProductPaths","DependentProductPaths","TestHostPath","TestBundlePath","UITargetAppPath"]);async function dd(e){var t;let r=await dc(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 dc(e){let t=await iJ(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(!du(e))continue;let t=e.TestTargets;Array.isArray(t)&&r.push(...t.filter(du))}return r}(i),...Object.values(i).filter(e=>du(e)&&"TestBundlePath"in e)])for(let r of function(e){let t=new Set;for(let[r,n]of Object.entries(e))if(dl.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=dn(r),t=new Set,di(n,(e,r)=>{if(dl.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 du(e){return!!e&&"object"==typeof e}let dp=["CFBundleIcons","CFBundleIcons~ipad"];async function df(e){let t=e.filter(dv);if(0===t.length)return;let r=e.filter(e=>dS(e)&&!dy(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 dm(t,e)}}async function dm(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 dh(e,t);(o||s)&&(await dg(t),r=t,n=new Date,a.utimesSync(r,n,n))}async function dh(e,t){var r,n;let a=i.join(e,"Info.plist"),o=i.join(t,"Info.plist"),s=await iJ(a),l=await iJ(o);if(!s||!l)return!1;let d=(r=s,n=l,dp.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 dw(o,e.key,e.value,e.shouldInsert);return!0}async function dw(e,t,r,n){let i=await iW("plutil",[n?"-insert":"-replace",t,"-json",JSON.stringify(r),e],{allowFailure:!0});if(0!==i.exitCode)throw new eC("COMMAND_FAILED","Failed to update XCTest runner icon plist",{key:t,plistPath:e,stderr:i.stderr})}async function dg(e){let t=await iW("codesign",["--force","--sign","-","--timestamp=none","--generate-entitlement-der",e],{allowFailure:!0});if(0!==t.exitCode)throw new eC("COMMAND_FAILED","Failed to sign XCTest runner app after icon update",{runnerAppPath:e,stderr:t.stderr})}function dv(e){return dS(e)&&dy(e)&&(e.includes("Debug-iphonesimulator")||e.includes("Release-iphonesimulator")||e.includes("Debug-appletvsimulator")||e.includes("Release-appletvsimulator"))}function dy(e){return i.basename(e).endsWith("-Runner.app")}function dS(e){return i.basename(e).endsWith(".app")}let db={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 dA(e){if("ios"!==e.platform&&"macos"!==e.platform)throw new eC("UNSUPPORTED_PLATFORM",`Unsupported platform for Apple runner: ${e.platform}`);return"macos"===e.platform?"macOS":e2(e.target)}function dI(e){return"simulator"===e?"simulator":"device"}function d_(){return"arm64"===process.arch?"arm64":"x86_64"}let dx="XCTestDevices",dM=".agent-device-backup",dN=".agent-device-xctestdevices-backup-",dD=i.join(u.homedir(),".agent-device","ios-runner"),dk=".agent-device-runner-cache.json",dP={PreferredScreenCaptureFormat:"screenshots",SystemAttachmentLifetime:"keepNever",UserAttachmentLifetime:"keepNever"},dE=new Map,dC=new Set,dO=new Map,dR=new Set;function dT(e){return e?.trim()??""}function dL(e=process.env){return dT(e.AGENT_DEVICE_IOS_BUNDLE_ID)||dT(e.AGENT_DEVICE_IOS_RUNNER_APP_BUNDLE_ID)||"com.callstack.agentdevice.runner"}function d$(e=process.env){let t=dT(e.AGENT_DEVICE_IOS_RUNNER_TEST_BUNDLE_ID);return t||`${dL(e)}.uitests`}let dF=function(e=process.env){let t=dL(e),r=d$(e);return Array.from(new Set([dT(e.AGENT_DEVICE_IOS_RUNNER_CONTAINER_BUNDLE_ID),`${r}.xctrunner`,t].filter(e=>e.length>0)))}(process.env);function dU(e=u.homedir()){return i.join(e,"Library","Developer","XCTestDevices")}async function dG(e,t={}){if("ios"!==e.platform||"simulator"!==e.kind)return null;let r=e4(e.simulatorSetPath);if(!r)return null;let n=i.resolve(r),o=i.resolve(t.xctestDeviceSetPath??dU()),s=i.resolve(t.backupPath??function(e=dU()){return`${e}${dM}`}(o)),l=i.resolve(t.lockDirPath??function(e=u.homedir()){return i.join(e,".agent-device","xctest-device-set.lock")}()),d=t.ownerStartTime??eI(process.pid),c=await dV({lockDirPath:l,owner:{pid:t.ownerPid??process.pid,startTime:d,acquiredAtMs:t.nowMs??Date.now()}});try{if(dq({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,`${dx}.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)&&dj(o),e}}({requestedSetPath:n,xctestDeviceSetPath:o})}catch(e){throw dq({xctestDeviceSetPath:o,backupPath:s}),await c(),new eC("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{dq({xctestDeviceSetPath:o,backupPath:s})}finally{await c()}}}}}function dq(e){let{xctestDeviceSetPath:t,backupPath:r}=e,n=[r,...function(e){let t=i.dirname(e),r=i.basename(e).replace(dM,""),n=r===dx?dN:`${r}${dN}`;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&&dj(t),a.existsSync(t))if(!s)return void ea({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&&(ea({level:"warn",phase:"ios_runner_xctest_device_set_orphaned_symlink",data:{xctestDeviceSetPath:t}}),dj(t))}function dj(e){!a.existsSync(e)||a.lstatSync(e).isSymbolicLink()&&a.unlinkSync(e)}async function dV(e){return await ec({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 dB(e){var t;return await dV({lockDirPath:(t=e,i.join(i.dirname(t),`${i.basename(t)}.lock`)),owner:{pid:process.pid,startTime:eI(process.pid),acquiredAtMs:Date.now()},timeoutMs:6e5,description:"iOS runner cache lock"})}async function dH(e,t){let n=function(e){var t;let n,o,s=e.iosXctestrunFile?.trim();if(!s)return null;let l=i.resolve(s);if(!a.existsSync(l))throw new eC("COMMAND_FAILED","Configured iOS XCTest runner .xctestrun file not found",{configKey:"iosXctestrunFile",xctestrunPath:l});let d=e.iosXctestDerivedDataPath?.trim(),c=d?i.resolve(d):(t=l,(n=r.createHash("sha1")).update(t),o=n.digest("hex").slice(0,12),i.join(u.tmpdir(),"agent-device-ios-xctest-derived",o));return cw("reuse","external_xctestrun",{derived:c,xctestrunPath:l}),{xctestrunPath:l,derived:c,cache:"external",artifact:"valid",buildMs:0,xctestrunPathSource:"external"}}(t);if(n)return n;let o=tk(),s=dY(e,o),l=cd(e,s);return await lf(dE,l,async()=>{let r=await dB(l);try{return await dK({device:e,options:t,projectRoot:o,expectedCacheMetadata:s,derived:l,forceRebuild:!0===t.forceRunnerXctestrunRebuild})}finally{await r()}})}async function dK(e){var t,r;let{device:n,options:i,projectRoot:a,expectedCacheMetadata:o,derived:s}=e;t=s,r=e.forceRebuild,(e7(process.env.AGENT_DEVICE_IOS_CLEAN_DERIVED)||r||dC.has(t))&&(cw("clean",r?"forced_rebuild":"forced_clean",{derived:t}),cm(t),dJ(t),dC.delete(t));let l=await ch({derived:s,projectRoot:a,expectedCacheMetadata:o,findXctestrun:e=>ce(e,n),xctestrunReferencesProjectRoot:cr,resolveExistingXctestrunProductPaths:dd}),d="reuse_ready"===l.reason?"exact":l.xctestrunPath?"restore-key":"miss";"reuse_ready"!==l.reason&&cw("rebuild",l.reason,{derived:s,xctestrunPath:l.xctestrunPath});let c=await dX({device:n,derived:s,expectedCacheMetadata:o,existing:l,cache:d});return c||(l.xctestrunPath&&(cm(s),dJ(s)),await dW({device:n,options:i,projectRoot:a,expectedCacheMetadata:o,derived:s,cache:d,reason:l.reason}))}async function dX(e){let{device:t,derived:r,expectedCacheMetadata:n,existing:i,cache:a}=e;if("reuse_ready"!==i.reason)return null;let o=await dz(t,r,n,i);return o?{xctestrunPath:o,derived:r,cache:a,artifact:"valid",buildMs:0,xctestrunPathSource:i.source}:null}async function dW(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 eC("COMMAND_FAILED","iOS runner project not found",{projectPath:c});let u=Date.now();await cl(t,c,s,r);let p=Math.max(0,Date.now()-u),f=ce(s,t);if(!f)throw new eC("COMMAND_FAILED","Failed to locate .xctestrun after build");let m=await dd(f);if(!m)throw new eC("COMMAND_FAILED","Runner build is missing expected products",{xctestrunPath:f});return await l9(t,m,f),await df(m),d0(s,d5(o,f,m)),cw("build","built_new",{derived:s,xctestrunPath:f}),{xctestrunPath:f,derived:s,cache:l,artifact:"rebuilt",buildMs:p,xctestrunPathSource:"build",reason:d}}async function dz(e,t,r,n){try{var i,a,o,s;return await l9(e,n.productPaths,n.xctestrunPath),cw("reuse","reuse_ready",{derived:t,xctestrunPath:n.xctestrunPath}),i=t,a=r,o=n.xctestrunPath,s=n.productPaths,d0(i,d5(a,o,s)),n.xctestrunPath}catch(e){if(!function(e){if(!(e instanceof eC))return!1;let t=e.details&&"object"==typeof e.details?e.details.reason:void 0;return"string"==typeof t&&l8.has(t)}(e))throw e;return cw("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,dZ.has(t)&&a.rmSync(i.join(e,r.name),{recursive:!0,force:!0})}}catch{}}let dZ=new Set([dk,"Build","BuildCache.noindex","Index.noindex","Logs","ModuleCache.noindex","SDKStatCaches.noindex","SourcePackages","TextBasedInstallAPI","info.plist"]);function dY(e,t=tk()){let n,o=dA(e);return{schemaVersion:2,packageVersion:tD(),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=d7.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 d7.set(t,{fileStatsFingerprint:o,sourceFingerprint:d}),d}(t),...function(e,t){var r;let n=(r=dQ("xcodebuild",["-version"]),{version:r.match(/^Xcode\s+(.+)$/m)?.[1]?.trim()||"unknown",buildVersion:r.match(/^Build version\s+(.+)$/m)?.[1]?.trim()||"unknown"}),i=db[e].sdkName[dI(t)];return{xcodeVersion:n.version,xcodeBuildVersion:n.buildVersion,sdkName:i,sdkVersion:dQ("xcrun",["--sdk",i,"--show-sdk-version"]),sdkBuildVersion:dQ("xcrun",["--sdk",i,"--show-sdk-build-version"])}}(o,e.kind),platformName:o,deviceKind:e.kind,target:e.target??"mobile",buildDestinationFamily:"macOS"===(n=dA(e))?`platform=macOS,arch=${d_()}`:"simulator"===e.kind?`generic/platform=${n} Simulator`:`generic/platform=${n}`,runnerBundleBuildSettings:cp(process.env),runnerSigningBuildSettings:cu(process.env,"device"===e.kind,e.platform),runnerPerformanceBuildSettings:cf()}}function dQ(e,t){let r=JSON.stringify([e,t]),n=dO.get(r);if(void 0!==n)return n;try{let n=eL(e,t,{allowFailure:!0,timeoutMs:5e3,maxBuffer:131072}),i=0===n.exitCode&&n.stdout.trim()||"unknown";return dO.set(r,i),i}catch{return dO.set(r,"unknown"),"unknown"}}function d0(e,t){a.mkdirSync(e,{recursive:!0}),a.writeFileSync(i.join(e,dk),`${JSON.stringify(t,null,2)}
|
|
10
|
+
`)}async function d1(e,t){if("external"===e.cache)return void cw("preserve","external_bad_artifact",{derived:e.derived,xctestrunPath:e.xctestrunPath,reason:t});dC.add(e.derived);let r=await dB(e.derived);try{cw("clean","bad_artifact",{derived:e.derived,xctestrunPath:e.xctestrunPath,reason:t}),cm(e.derived),dJ(e.derived)}finally{await r()}}function d2(e){let{artifacts:t,...r}=e;return r}function d3(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 d5(e,t,r){let n=function(e,t){let r=d6(e);if(null===r||0===t.length)return null;let n=[];for(let e of t){let t=d6(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 d4(e){return!(!e||"object"!=typeof e||Array.isArray(e))&&"string"==typeof e.path&&Number.isInteger(e.mtimeMs)&&Number.isInteger(e.size)}function d6(e){try{let t=a.statSync(e);return{mtimeMs:Math.trunc(t.mtimeMs),size:t.size}}catch{return null}}function d8(e,t){let r=d6(e);return r?.mtimeMs===t.mtimeMs&&r.size===t.size}function d9(e,t){let r=i.relative(i.resolve(t),i.resolve(e));return""!==r&&!r.startsWith("..")&&!i.isAbsolute(r)}let d7=new Map;function ce(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=ct(r.path,t)-ct(e.path,t);if(0!==n)return n}return r.mtimeMs-e.mtimeMs||e.path.localeCompare(r.path)}),r[0]?.path??null)}function ct(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=db[dA(t)].xctestrunHints[dI(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 cr(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 cn(e,t,r,n={}){let o=n.iosXctestEnvDir?.trim(),s=o?i.resolve(o):i.dirname(e);a.mkdirSync(s,{recursive:!0});let l=r.replace(/[^a-zA-Z0-9._-]/g,"_"),d=i.join(s,`AgentDeviceRunner.env.${l}.json`),c=i.join(s,`AgentDeviceRunner.env.${l}.xctestrun`),u=await ci(e);return co(u,e=>{var r,n;return r=e,n=t,void(r.EnvironmentVariables={...r.EnvironmentVariables??{},...n},r.UITestEnvironmentVariables={...r.UITestEnvironmentVariables??{},...n},r.UITargetAppEnvironmentVariables={...r.UITargetAppEnvironmentVariables??{},...n},r.TestingEnvironmentVariables={...r.TestingEnvironmentVariables??{},...n})}),co(u,e=>Object.assign(e,dP),{requireTestBundlePath:!0}),await ca(u,d,c),{xctestrunPath:c,jsonPath:d}}async function ci(e){let t=await iW("plutil",["-convert","json","-o","-",e],{allowFailure:!0});if(0!==t.exitCode||!t.stdout.trim())throw new eC("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 eC("COMMAND_FAILED","Failed to parse xctestrun JSON",{xctestrunPath:e,error:String(t)})}}async function ca(e,t,r){a.writeFileSync(t,JSON.stringify(e,null,2));let n=await iW("plutil",["-convert","xml1","-o",r,t],{allowFailure:!0});if(0!==n.exitCode)throw new eC("COMMAND_FAILED","Failed to write xctestrun plist",{tmpXctestrunPath:r,stderr:n.stderr})}function co(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=cs(n,r);e&&t(e)}}(e.TestTargets,t,r);for(let r of Object.values(e)){let e=cs(r,{requireTestBundlePath:!0});e&&t(e)}}function cs(e,t){return!e||"object"!=typeof e||Array.isArray(e)||t.requireTestBundlePath&&!e.TestBundlePath?null:e}async function cl(e,t,r,n){let i=cp(process.env),a=cu(process.env,"device"===e.kind,e.platform),o="device"===e.kind?["-allowProvisioningUpdates"]:[],s=cf(),l=await dG(e);try{let l;await eR("xcodebuild",["build-for-testing","-project",t,"-scheme","AgentDeviceRunner","-parallel-testing-enabled","NO",cc(e),"1","-destination",(l=dA(e),"macOS"===l?`platform=macOS,arch=${d_()}`:"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=>{dR.add(e),e.on("close",()=>{dR.delete(e)})},onStdoutChunk:e=>{l3(e,n.logPath,n.traceLogPath,n.verbose)},onStderrChunk:e=>{l3(e,n.logPath,n.traceLogPath,n.verbose)}})}catch(a){let e,t,r=a instanceof eC?a:new eC("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)??lO);throw new eC("COMMAND_FAILED","xcodebuild build-for-testing failed",{error:r.message,details:r.details,logPath:n.logPath,hint:i})}finally{await l?.release()}}function cd(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(d3(d2(t))).digest("hex"),`cache-${n.slice(0,16)}`),s=function(e){return i.join(dD,"derived",db[dA(e)].derivedBaseName[dI(e.kind)])}(e);return i.join(s,o)}function cc(e){return"macos"===e.platform||"device"===e.kind?"-maximum-concurrent-test-device-destinations":"-maximum-concurrent-test-simulator-destinations"}function cu(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 cp(e=process.env){let t=dL(e),r=d$(e);return[`AGENT_DEVICE_IOS_RUNNER_APP_BUNDLE_ID=${t}`,`AGENT_DEVICE_IOS_RUNNER_TEST_BUNDLE_ID=${r}`]}function cf(){return["COMPILER_INDEX_STORE_ENABLE=NO","ENABLE_CODE_COVERAGE=NO"]}function cm(e,t=process.env){if(t.AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH?.trim()){var r;let t,n;if(r=e,t=i.resolve(tk(),".tmp"),""===(n=i.relative(t,i.resolve(r)))||n.startsWith("..")||i.isAbsolute(n))throw new eC("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(tk(),".tmp")}.`})}}async function ch(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,dk),"utf8"));if(!t||"object"!=typeof t||Array.isArray(t))return null;return t}catch{return null}}(t))?d3(d2(n))!==d3(d2(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(d4))||!d9(n.xctestrunPath,e)||!d8(n.xctestrunPath,{mtimeMs:n.xctestrunMtimeMs,size:n.xctestrunSize}))return null;let i=[];for(let t of n.productPaths){if(!d9(t.path,e)||!d8(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 cw(e,t,r){ea({level:"rebuild"===e?"warn":"info",phase:"runner_xctestrun_cache",data:{action:e,reason:t,...r}})}let cg=process.pid,cv=eI(process.pid),cy=(tj=cg,tV=cv,(e=r.createHash("sha256")).update(String(tj)),e.update("\0"),e.update(tV??"unknown-start"),`owner-${tj}-${e.digest("hex").slice(0,8)}`);async function cS(e,t){let r=await ec({lockDirPath:`${cM(e)}.lock`,owner:{pid:cg,startTime:cv,acquiredAtMs:Date.now()},timeoutMs:3e4,pollMs:100,ownerGraceMs:5e3,description:`iOS runner lease for ${e}`});try{return await t()}finally{await r()}}function cb(e){try{let t=JSON.parse(a.readFileSync(cM(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:cN(r.ownerToken),ownerPid:cD(r.ownerPid),sessionId:cN(r.sessionId),port:cD(r.port),xctestrunPath:cN(r.xctestrunPath),jsonPath:cN(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:cD(e.runnerPid)}:null}(t,e)}catch{return null}}function cA(e){var t;return e?e.ownerToken===cy?{type:"owned",lease:e}:eD((t=e).ownerPid)&&(!t.ownerStartTime||eI(t.ownerPid)===t.ownerStartTime)?{type:"busy",lease:e}:{type:"stale",lease:e}:{type:"empty"}}async function cI(e,t){let r=cA(cb(e));if("empty"===r.type)return void await t.cleanupRunnerXcodebuildProcesses(e,void 0);if("busy"===r.type)throw new eC("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 ck(r.lease,r.type,t)}async function c_(e,t){let r=cA(cb(e));"owned"===r.type&&await ck(r.lease,"owned",t)}function cx(e){e&&function(e){let t=cb(e.deviceId);if(t&&(!e.ownerToken||t.ownerToken===e.ownerToken)&&(!e.sessionId||t.sessionId===e.sessionId))try{a.unlinkSync(cM(e.deviceId))}catch{}}({deviceId:e.deviceId,ownerToken:e.ownerToken,sessionId:e.sessionId})}function cM(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 cN(e){return"string"==typeof e&&e.length>0?e:null}function cD(e){return"number"==typeof e&&Number.isInteger(e)&&e>0?e:null}async function ck(e,t,r){ea({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),cx(e)}let cP={cleanupRunnerProcessTree:cj,cleanupRunnerXcodebuildProcesses:cV,cleanupTempFile:l6};async function cE(e,t={}){var r;!1!==t.graceful?await cT(e):await cj(e.child.pid,"SIGTERM"),await cL(e,t.waitTimeoutMs??1e4),(r=e.child.pid)&&(cU(r)||eM(r))&&await cj(e.child.pid,"SIGKILL"),await c$(e)}async function cC(e){await c_(e,cP)}async function cO(e){let t=Array.from(dR);await cG(e,"SIGINT"),await cq(t,"SIGINT"),await cG(e,"SIGTERM"),await cq(t,"SIGTERM"),await cG(e,"SIGKILL"),await cq(t,"SIGKILL"),await Promise.allSettled(e.map(async e=>{await c$(e)}))}async function cR(){let e=Array.from(dR);await Promise.allSettled(e.map(async e=>{try{await cj(e.pid,"SIGTERM"),await cj(e.pid,"SIGKILL")}finally{dR.delete(e)}}))}async function cT(e){try{await lj(e.device,e.port,lU({command:"shutdown"}),void 0,15e3)}catch{await cj(e.child.pid,"SIGTERM")}}async function cL(e,t){try{await Promise.race([e.testPromise,new Promise(e=>setTimeout(e,t))])}catch{}}async function c$(e){await cF(e.device),l6(e.xctestrunPath),l6(e.jsonPath);try{await e.simulatorSetRedirect?.release()}finally{cx(e.lease)}}async function cF(e){"simulator"===e.kind&&await Promise.allSettled(dF.map(async t=>{try{await iz(lE(e,["terminate",e.id,t]),{allowFailure:!0,timeoutMs:2e3})}catch(r){ea({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 cU(e){return!!e&&eD(e)}async function cG(e,t){await Promise.allSettled(e.map(async e=>{await cj(e.child.pid,t)}))}async function cq(e,t){await Promise.allSettled(e.map(async e=>{await cj(e.pid,t),"SIGKILL"===t&&dR.delete(e)}))}async function cj(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 iW("pkill",[`-${r}`,"-P",String(e)],{allowFailure:!0})}catch{}}async function cV(e,t){let r=t?`xcodebuild.*test-without-building.*AgentDeviceRunner\\.env\\.session-${cB(e)}-${cB(t)}-`:`xcodebuild.*test-without-building.*AgentDeviceRunner\\.env\\.session-${cB(e)}-[0-9]`;for(let t of["TERM","KILL"])try{await iW("pkill",[`-${t}`,"-f",r],{allowFailure:!0,timeoutMs:2e3})}catch(r){ea({level:"warn",phase:"ios_runner_stale_xcodebuild_kill_failed",data:{deviceId:e,signal:t,error:r instanceof Error?r.message:String(r)}})}}function cB(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}async function cH(e){let t=await cK(e.logPath);return t?new eC(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 cK(e){if(!e)return;let t=await cX(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 cX(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 cW=new Map,cz=new Map,cJ=new Set(["tap","longPress","drag","swipe","scroll","sequence"]);async function cZ(e,t){return await lf(cz,e.id,async()=>{let r=cW.get(e.id);if(r){let t=await cQ(e,r);if(t)return t}return await cS(e.id,async()=>await cY(e,t))})}async function cY(e,t){var r,n;let o,s,l,d={};await ul(d,"cleanup_stale_xcodebuild",async()=>{await cI(e.id,cP)}),await ul(d,"ensure_booted",async()=>{var t;await ("simulator"!==(t=e).kind?Promise.resolve():t.booted?(ea({level:"debug",phase:"ios_runner_startup_ensure_booted_skipped",data:{deviceId:t.id}}),Promise.resolve()):c9(t))}),await ul(d,"verify_developer_mode",async()=>{await c7(e)}),t.cleanStaleBundles?await ul(d,"cleanup_stale_bundles",async()=>{await c0(e)}):(d.cleanup_stale_bundles=0,ea({level:"debug",phase:"ios_runner_startup_cleanup_stale_bundles_skipped"}));let c=await ul(d,"ensure_xctestrun",async()=>await dH(e,t));d.build_xctestrun=c.buildMs;let u=await ul(d,"allocate_port",async()=>await l2()),{xctestrunPath:p,jsonPath:f}=await ul(d,"prepare_xctestrun_env",async()=>await cn(c.xctestrunPath,{AGENT_DEVICE_RUNNER_PORT:String(u)},`session-${e.id}-${cy}-${u}`,{iosXctestEnvDir:t.iosXctestEnvDir})),m=await ul(d,"simulator_set_redirect",async()=>await dG(e)),h=["test-without-building","-only-testing","AgentDeviceRunnerUITests/RunnerTests/testCommand","-parallel-testing-enabled","NO","-test-timeouts-enabled","NO","-collect-test-diagnostics","never",cc(e),"1","-destination-timeout",String(20),"-xctestrun",p,"-derivedDataPath",c.derived,"-destination","macOS"===(l=dA(e))?`platform=macOS,arch=${d_()}`:"simulator"===e.kind?`platform=${l} Simulator,id=${e.id}`:`platform=${l},id=${e.id}`];try{({child:o,wait:s}=await ul(d,"launch_xcodebuild",()=>eO("xcodebuild",h,{allowFailure:!0,env:{...process.env,AGENT_DEVICE_RUNNER_PORT:String(u)},detached:!0})))}catch(e){throw await m?.release(),e}o.stdout?.on("data",e=>{l3(e,t.logPath,t.traceLogPath,t.verbose)}),o.stderr?.on("data",e=>{l3(e,t.logPath,t.traceLogPath,t.verbose)});let w=`${e.id}:${u}:${Date.now()}`,g={schemaVersion:1,deviceId:(r={deviceId:e.id,sessionId:w,runnerPid:o.pid,port:u,xctestrunPath:p,jsonPath:f}).deviceId,ownerToken:cy,ownerPid:cg,ownerStartTime:cv,sessionId:r.sessionId,runnerPid:r.runnerPid??null,port:r.port,xctestrunPath:r.xctestrunPath,jsonPath:r.jsonPath,createdAtMs:Date.now()},v={sessionId:w,device:e,deviceId:e.id,port:u,xctestrunPath:p,xctestrunArtifact:c,jsonPath:f,testPromise:s,child:o,ready:!1,startupTimeoutMs:"number"==typeof(n=t.startupTimeoutMs)&&Number.isFinite(n)&&n>0?Math.floor(n):void 0,startupTimings:d,simulatorSetRedirect:m??void 0,lease:g};try{let e,t;e=cM(g.deviceId),a.mkdirSync(i.dirname(e),{recursive:!0}),t=`${e}.${process.pid}.${Date.now()}.tmp`,a.writeFileSync(t,JSON.stringify(g,null,2),"utf8"),a.renameSync(t,e)}catch(t){throw await c5(e.id,v,{graceful:!1,waitTimeoutMs:1e3}),t}return cW.set(e.id,v),v}async function cQ(e,t){if(!cU(t.child.pid))return await ul({},"stop_stale_session",async()=>{await c5(e.id,t,{graceful:!1,waitTimeoutMs:1e3})}),null;let r=t.xctestrunArtifact;if(r?.cache==="external")return ea({level:"debug",phase:"ios_runner_session_reuse",data:{deviceId:e.id,sessionId:t.sessionId,ready:t.ready,cache:r.cache}}),t;let n=cd(e,dY(e));return r?.derived!==n?(ea({level:"debug",phase:"ios_runner_session_artifact_stale",data:{deviceId:e.id,sessionId:t.sessionId,currentDerived:r?.derived,expectedDerived:n}}),await ul({},"stop_stale_artifact_session",async()=>{await c5(e.id,t)}),null):(ea({level:"debug",phase:"ios_runner_session_reuse",data:{deviceId:e.id,sessionId:t.sessionId,ready:t.ready}}),t)}async function c0(e){if("simulator"===e.kind)for(let t of dF){let r=await c1(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 c1(e,t){try{return await iz(lE(e,["uninstall",e.id,t]),{allowFailure:!0,timeoutMs:1e4})}catch(r){ea({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 c2(e){let t=cW.get(e);return t?{sessionId:t.sessionId,alive:cU(t.child.pid)}:null}async function c3(e,t){await lf(cz,e.deviceId,async()=>{cW.get(e.deviceId)===e&&(ea({level:"warn",phase:"ios_runner_session_invalidated",data:{deviceId:e.deviceId,sessionId:e.sessionId,reason:t}}),await c5(e.deviceId,e,{graceful:!1,waitTimeoutMs:1e3}))})}async function c5(e,t,r={}){let n=t??cW.get(e);n&&(await cE(n,r),cW.get(e)===n&&cW.delete(e))}async function c4(e){await lf(cz,e,async()=>{await cS(e,async()=>{await c5(e),await cC(e)})})}async function c6(){let e=Array.from(cW.values());for(let t of(await cO(e),e))cW.get(t.deviceId)===t&&cW.delete(t.deviceId)}async function c8(){await c6();let e=Array.from(cW.keys());await Promise.allSettled(e.map(async e=>{await c4(e)})),await cR()}async function c9(e){await iz(lE(e,["bootstatus",e.id,"-b"]),{timeoutMs:45e3})}async function c7(e){if("ios"!==e.platform||"device"!==e.kind)return;let t=await iW("DevToolsSecurity",["-status"],{allowFailure:!0,timeoutMs:2e3}),r=`${t.stdout}
|
|
13
|
+
${t.stderr}`;if(/developer mode is currently disabled/i.test(r))throw new eC("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 ue(e){if("ios"!==e.platform&&"macos"!==e.platform)throw new eC("UNSUPPORTED_PLATFORM",`Unsupported platform for iOS runner: ${e.platform}`);if("simulator"!==e.kind&&"device"!==e.kind)throw new eC("UNSUPPORTED_OPERATION",`Unsupported iOS device kind for runner: ${e.kind}`)}async function ut(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,ea({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=lU(r),m=lF(f.command),h=e9.fromTimeoutMs(i),w=function(e,t){var r;let n=lF(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 ui({device:e,session:t,runnerCommand:f,logPath:n,deadline:h,signal:a,decision:w}):(l=f,d=t,c=w,ea({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 un({device:e,session:t,runnerCommand:f,logPath:n,deadline:h,timeoutMs:i,signal:a,readOnlyCommand:m})}catch(e){throw ur(e,t,w)}try{let e=await ua(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 c3(t,r)):cJ.has(f.command)&&(t.lastHealthyMutation={atMs:Date.now(),appBundleId:f.appBundleId}),e}catch(r){let e=function(e){if(e instanceof eC){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 c3(t,e),r;if((u=r)instanceof eC&&u.details?.runner!==void 0)throw r;throw ur(r,t,w)}}function ur(e,t,r){return"skip"!==r.action||"recent_healthy_mutation"!==r.reason?e:(t.lastHealthyMutation=void 0,uo(e,{runnerReadinessPreflightSkipped:!0,runnerReadinessPreflightSkipReason:r.reason,runnerReadinessPreflightSkippedAgeMs:r.lastHealthyMutationAgeMs}))}async function un(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 eC("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 en("ios_runner_command_send",async()=>l?await lj(t,r.port,n,i,d,r,s):await lW(t,r.port,n,d,s),c)}async function ui(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(us(r),a.remainingMs());try{let e=await en("ios_runner_readiness_preflight",async()=>await lj(t,r.port,lU({command:"uptime"}),i,l,r,o),{command:n.command,commandId:n.commandId,reason:s.reason,lastHealthyMutationAgeMs:s.lastHealthyMutationAgeMs,sessionReady:r.ready,timeoutMs:l});await ua(e,r,i)}catch(e){throw uo(e,{runnerReadinessPreflightFailed:!0})}}async function ua(e,t,r){let n,i=await e.text();try{let e=JSON.parse(i);n=e&&"object"==typeof e?e:{}}catch{throw new eC("COMMAND_FAILED","Invalid runner response",{text:i})}if(!n.ok){let e=n.error?.code,t="string"==typeof e&&e.trim().length>0?ek(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 cH({error:new eC(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&&ea({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 uo(e,t){let r=e instanceof eC?e:new eC("COMMAND_FAILED",e instanceof Error?e.message:String(e),void 0,e);return new eC(r.code,r.message,{...r.details??{},...t},r.cause??e)}function us(e){return e.startupTimeoutMs??45e3}async function ul(e,t,r){let n=Date.now();try{return await r()}finally{let r=Date.now()-n;e[t]=r,ea({level:"debug",phase:`ios_runner_startup_${t}`,durationMs:r})}}let ud=new h;function uc(e,t={}){return{runCommand:e,...t}}function uu(e,t,r,n={}){if(r)return uf(r);let i=function(e,t={}){let r=ud.getStore();return r&&r.deviceId===e.id&&(r.requestId?r.requestId===t.requestId:!t.requestId)?r:void 0}(e,n);return i?uf(i.provider):uf(t)}async function up(e,t,r){if(!e)return await r();let n={provider:uf(e),deviceId:t.deviceId,requestId:t.requestId};return await ud.run(n,r)}function uf(e){return"function"==typeof e?{runCommand:e}:e}async function um(e){let{device:t,session:r,command:n,transportError:i,options:a,signal:o,invalidationReason:s}=e,l=await ug(t,r,n,i,a,o);return await uh(l,{command:n,session:r,transportError:i,invalidationReason:s,invalidateSession:e.invalidateSession})}async function uh(e,t){var r,n,i,a;if(!e)return await uw(t,"status_recovery_unavailable");if("recovered"===e.type){return r=e,uS({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,uS({command:(a=t).command,session:a.session,transportError:a.transportError,decision:"skipped",reason:i.reason,lifecycleState:i.lifecycleState}),i.error}return await uw(t,e.reason,e.lifecycleState,e.error)}async function uw(e,t,r,n){throw uS({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 ug(e,t,r,n,i,a){var o,s,l,d,c,u,p,f,m,h,w,g;let v,y,S,b,A;if("status"===r.command||!r.commandId?.trim())return;let I=uy(n);try{v=await ut(e,t,{command:"status",statusCommandId:r.commandId},i.logPath,3e3,a)}catch(e){return ea({level:"debug",phase:"ios_runner_command_status_recovery_failed",data:{command:r.command,commandId:r.commandId,error:e instanceof Error?e.message:String(e),...I}}),{type:"retainInvalidation",reason:"status_probe_failed"}}let _="string"==typeof v.lifecycleState?v.lifecycleState:"";return ea({level:"debug",phase:"ios_runner_command_status_recovery",data:{command:r.command,commandId:r.commandId,lifecycleState:_,...I}}),o=v,s=_,l=r,d=n,c=i,"completed"===s?function(e,t,r,n){var i,a;let o=function(e){if("string"!=typeof e||0===e.trim().length)return;let t=function(e){try{let t=JSON.parse(e);if(t&&"object"==typeof t)return t}catch{}return{}}(e);if(t.ok)return t.data&&"object"==typeof t.data&&!Array.isArray(t.data)?t.data:{}}(e.lifecycleResponseJson);if(o)return{type:"recovered",data:o,reason:"completed_with_retained_response",lifecycleState:"completed"};if(lF(t.command))return{type:"skipInvalidation",error:r,reason:"read_only_completed_without_retained_response",lifecycleState:"completed"};let s=uy(r);return{type:"skipInvalidation",reason:"completed_without_retained_response",lifecycleState:"completed",error:new eC("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,`${uv(a)}The runner is still reachable and reports "${i}" already completed, so agent-device kept the session open and will not replay it. Run snapshot -i to inspect the current UI, then continue from that observed state.`),logPath:n.logPath,transportError:r.message},r)}}(o,l,d,c):"failed"===s?{type:"skipInvalidation",reason:"runner_reported_failure",lifecycleState:s,error:(u=o,p=l,f=d,m=c,y="string"==typeof u.lifecycleErrorCode?u.lifecycleErrorCode:void 0,S="string"==typeof u.lifecycleErrorMessage?u.lifecycleErrorMessage:"Runner command failed",b="string"==typeof u.lifecycleErrorHint?u.lifecycleErrorHint:void 0,A=uy(f),new eC(ek(y),S,{command:p.command,commandId:p.commandId,lifecycleState:"failed",recovery:"runner_reported_failure",...A,hint:b??(h=p.command,w=A,`${uv(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(lF(t.command))return r;let s=uy(r);return new eC("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,`${uv(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 eC("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 uv(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 uy(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 uS(e){let{command:t,session:r,transportError:n,decision:i,reason:a,lifecycleState:o}=e;ea({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 ub(e,t){let r;lG(t.requestId);let n=rp(t.requestId),i=lU({command:"uptime"});for(let a=1;a<=2;a+=1){let o=await uA({device:e,command:i,options:t,signal:n,attempt:a,recoveryReason:r});if("prepared"===o.kind)return o.result;r=o.recoveryReason}throw new eC("COMMAND_FAILED","iOS runner prepare failed")}async function uA(e){let{device:t,command:r,options:n,signal:i,attempt:a,recoveryReason:o}=e,s=Date.now(),l=await cZ(t,{...n,cleanStaleBundles:a>1||n.cleanStaleBundles}),d=Date.now()-s;try{var c,u;let e=await uk(t,l,r,n,i,d,{recoveryReason:o});return{kind:"prepared",result:(c=t,u=e,uP(c,u),u)}}catch(e){return await uI({device:t,session:l,command:r,options:n,signal:i,attempt:a,error:e})}}async function uI(e){var t;let r,{device:n,session:i,command:a,options:o,signal:s,attempt:l,error:d}=e,c=d instanceof eC?d:new eC("COMMAND_FAILED",String(d));if(1===l&&(t=c,(r=i.xctestrunArtifact)&&"miss"!==r.cache&&uM(t)))return{kind:"prepared",result:await u_({device:n,session:i,command:a,options:o,signal:s,error:c})};if(!uM(c))throw d;let u=c.message||"runner_health_failed";if(l>=2)throw await ux(i,"prepare_runner_health_failed"),d;return lG(o.requestId),await c3(i,"prepare_runner_health_retry"),ea({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 u_(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 c3(s,"prepare_cached_runner_health_failed"),await d1(s.xctestrunArtifact,p);let f=Date.now(),m=await cZ(o,{...d,cleanStaleBundles:!0,forceRunnerXctestrunRebuild:!0}),h=Date.now()-f;try{let e=await uk(o,m,l,d,c,h,{recoveryReason:p});return ea({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,uP(t,r),r}catch(r){let e;await ux(m,"prepare_rebuilt_runner_health_failed");let t=(n=r,i=m,a=p,e=n instanceof eC?n:new eC("COMMAND_FAILED",String(n)),new eC(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 uP(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 ux(e,t){try{await c3(e,t)}catch{}}function uM(e){let t;return!rh(e)&&(lR(e)||lT(e)||(t=e.message.toLowerCase()).includes("timeout")||t.includes("timed out")||t.includes("deadline"))}async function uN(e,t,r){let n;lG(r.requestId);let i=rp(r.requestId);try{let a=(n=await cZ(e,r)).ready?45e3:us(n);return await ut(e,n,t,r.logPath,a,i)}catch(o){let a=o instanceof eC?o:new eC("COMMAND_FAILED",String(o));if("COMMAND_FAILED"===a.code&&"string"==typeof a.message&&a.message.includes("Runner did not accept connection")&&lT(a)&&n)return lG(r.requestId),await uD({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&&(lR(e)||(t=e.message.toLowerCase()).includes("timeout")||t.includes("timed out"))}(a))return lG(r.requestId),await uD({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&&lR(a))return await um({device:e,session:n,command:t,transportError:a,options:r,signal:i,invalidationReason:"transport_error_after_command_send",invalidateSession:c3});throw o}}async function uD(e){let{device:t,command:r,options:n,signal:i,restartReason:a}=e;await c3(e.session,a);let o=await cZ(t,{...n,cleanStaleBundles:!0});try{let a=await ut(t,o,r,n.logPath,45e3,i);return e.recoveredDiagnosticPhase&&ea({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 eC?a:new eC("COMMAND_FAILED",String(a));if(lR(e))return await um({device:t,session:o,command:r,transportError:e,options:n,signal:i,invalidationReason:"transport_error_after_retry_command_send",invalidateSession:c3});throw a}}async function uk(e,t,r,n,i,a,o){var s,l,d,c,u;let p,f,m=Date.now();return s=await ut(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 uP(e,t){ea({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 uE(e,t,r={}){ue(e),lG(r.requestId);let n=lU(t),i=uR(e,r);return lF(n.command)?e8(()=>(lG(r.requestId),i.runCommand(e,n,r)),{shouldRetry:e=>(lG(r.requestId),lR(e))}):i.runCommand(e,n,r)}function uC(e,t={}){if("ios"!==e.platform)return;let{propagateError:r=!1,...n}=t,i=uR(e,n);return i.prewarm?i.prewarm(e,n).then(()=>{}).catch(t=>{if(ea({level:"warn",phase:"ios_runner_session_prewarm_failed",data:{deviceId:e.id,error:t instanceof Error?t.message:String(t)}}),r)throw t}):void ea({level:"debug",phase:"ios_runner_session_prewarm_unavailable",data:{deviceId:e.id}})}async function uO(e,t){ue(e),lG(t.requestId);let r=lU({command:"uptime"}),n=uR(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 uR(e,t){return uu(e,uT,void 0,{requestId:t.requestId})}let uT=uc(uN,{prepare:ub,prewarm:async(e,t)=>{await ub(e,{...t,healthTimeoutMs:45e3})}}),uL=new WeakMap;async function u$(e){var t,r;let n,i,{sessionStore:a,leaseRegistry:o}=e,s=(n={...(t=function(e){let t=eB(e.meta?.sessionIsolation??e.flags?.sessionIsolation),r=e.meta?.tenantId??e.flags?.tenant,n=eq(r);if(r&&!n)throw new eC("INVALID_ARGS","Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.");if("tenant"!==t)return e;if(!n)throw new eC("INVALID_ARGS","session isolation mode tenant requires --tenant (or meta.tenantId).");let i=e.session||"default";return i.startsWith(`${n}:`)?{...e,meta:{...e.meta,tenantId:n,sessionIsolation:t}}:{...e,session:`${n}:${i}`,meta:{...e.meta,tenantId:n,sessionIsolation:t}}}(e.req)).flags??{}},tq(t.command,n)?{...t,flags:n}:t),l=s.command,d=function(e){var t,r;let n=e.session||lv;if(function(e){if(e.meta?.sessionExplicit===!0)return!0;let t=e.flags?.session;return"string"==typeof t&&t.trim().length>0}(e))return n;let i=lS(e);return i?(t=i.id,r=n,`cwd:${t}:${r}`):n}(s),c=et(),u=a.resolveSessionDir(d),p=t8(u,s.meta?.requestId??c.requestId),f=t6(u);ei({session:d,logPath:p}),ea({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,nb(r)?.leaseAdmissionExempt===!0||e.meta?.sessionIsolation!=="tenant")return;let n=lI(e);t.assertLeaseAdmission({tenantId:n.tenantId,runId:n.runId,leaseId:n.leaseId,backend:n.leaseBackend})}(s,o);let m=nb(l)?.sessionExecutionLockExempt!==!0?await lN({req:s,sessionName:d,sessionStore:a}):[],h=(r=o,(i=uL.get(r))||(i=new Map,uL.set(r,i)),i);return{req:s,command:l,sessionName:d,requestLogPath:p,runnerLogPath:f,throwIfCanceled:()=>rm(s.meta?.requestId),runLocked:async e=>(rm(s.meta?.requestId),0===m.length)?await e():await uF(h,m,async()=>(rm(s.meta?.requestId),await e()))}}async function uF(e,t,r){let[n,...i]=t;return n?await lf(e,n,async()=>await uF(e,i,r)):await r()}function uU(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}function uG(e,t){return uU(e)?e[t]:void 0}function uq(e,t){let r=uG(e,t);return"string"==typeof r?r:void 0}function uj(e,t){let r=e[t];return"number"==typeof r&&Number.isFinite(r)?r:void 0}function uV(e){return uU(e)}function uB(e){if(!uU(e))return;let t={};for(let[r,n]of Object.entries(e))"string"==typeof n&&(t[r]=n);return Object.keys(t).length>0?t:void 0}async function uH(e,t){var r;let n,i=function(e,t){let r=new Map(t.map(e=>[e.ref,e])),n=[],i=new Set,a=new Map;for(let t of e.split(/\r?\n/)){var o,s;let e=(o=t,uX(o.match(/\bref=['"]?(@?e\d+)['"]?/i)?.[1]??o.match(/@?(e\d+)\b/i)?.[1]));if(!e)continue;i.add(e);let l=r.get(e)?.data,d=(s=t,Math.floor((s.match(/^\s*/)?.[0].length??0)/2)),c=function(e,t,r){var n;let i=function(e){let t=e.replace(/\[[^\]]*ref[^\]]*\]/gi,"").replace(/@?e\d+\b/gi,"").replace(/^[\s|├└─>*-]+/g,"").trim();return t.match(/^([A-Za-z][\w-]*)\b/)?.[1]}(e)??uW(t,["role","type"]);return{index:0,type:i,role:i,label:(n=e,n.match(/"([^"]+)"/)?.[1]??n.match(/'([^']+)'/)?.[1]??uW(t,["label","name","text"])),value:function(e){var t;return t=e,(t.match(/\]\s*:\s*(.+)$/)?.[1]?.trim()||void 0)??e.match(/\bvalue=(?:"([^"]*)"|'([^']*)'|([^\s\]]+))/i)?.slice(1).find(uJ)??e.match(/\bvalue:\s*(?:"([^"]*)"|'([^']*)'|([^\s\]]+))/i)?.slice(1).find(uJ)}(e)??uW(t,["value"]),depth:r,enabled:uz(t,["enabled"]),focused:uz(t,["focused"])}}(t,l,d),u=function(e,t){for(let r=t-1;r>=0;r-=1){let t=e.get(r);if(void 0!==t)return t}}(a,d);void 0!==u&&(c.parentIndex=u),n.push({ref:e,node:{...c,index:n.length}}),a.set(d,n.length-1)}for(let e of t)i.has(e.ref)||n.push({ref:e.ref,node:{...function(e){let t=uW(e,["role","type"]);return{index:0,type:t,role:t,label:uW(e,["label","name","text"]),value:uW(e,["value"]),enabled:uz(e,["enabled"]),focused:uz(e,["focused"])}}(e.data),index:n.length}});return n}(uq(e,"snapshot")??"",Array.isArray(r=uG(e,"refs"))?r.flatMap(e=>{let t=uU(e)?e:void 0,r=uX(uW(t,["ref","id"])??String(e));return r?[{ref:r,data:t}]:[]}):uU(r)?Object.entries(r).flatMap(([e,t])=>{let r=uX(e);return r?[{ref:r,data:uU(t)?t:void 0}]:[]}):[]);return await uK(i,t),{nodes:i.map((e,t)=>({...e.node,index:t})),truncated:"boolean"==typeof(n=uG(e,"truncated"))?n:void 0}}async function uK(e,t){for(let r=0;r<e.length;r+=8){let n=e.slice(r,r+8);for(let[e,r]of(await Promise.all(n.map(e=>t(e.ref)))).entries())r&&(n[e].node.rect=r)}}function uX(e){let t=e?.trim().replace(/^@/,"");return t&&/^e\d+$/i.test(t)?t.toLowerCase():null}function uW(e,t){if(e)for(let r of t){let t=e[r];if("string"==typeof t&&t.length>0)return t}}function uz(e,t){if(e)for(let r of t){let t=e[r];if("boolean"==typeof t)return t}}function uJ(e){return"string"==typeof e}let uZ="agent-browser",uY="Run `agent-device web setup` to install the managed web backend.";function uQ(e={}){let t=e.session?.trim(),r=async r=>await u3(r,{session:t,options:e});return{async open(e){await r(["open",e])},async close(){await r(["close"])},snapshot:async e=>await u1(r,e),async screenshot(e,t){await r(["screenshot",...t?.fullscreen?["--full"]:[],e])},async click(e,t){await u0(r,e,t)},async fill(e,t,n){await u0(r,e,t),await r(["press","darwin"===process.platform?"Meta+a":"Control+a"]),await r(["keyboard","type",n])},async typeText(e){await r(["keyboard","type",e])},async scroll(e,t){let n=t?.pixels??t?.amount;await r(["scroll",e,...void 0===n?[]:[String(n)]])},dumpNetwork:async e=>(function(e,t={}){var r,n;let i,a=Array.isArray(i=uU(r=e)&&Array.isArray(r.requests)?r.requests:r)?i.filter(uV).map(e=>({headers:uB(e.headers),method:uq(e,"method"),mimeType:uq(e,"mimeType"),requestId:uq(e,"requestId"),resourceType:uq(e,"resourceType"),responseHeaders:uB(e.responseHeaders),status:uj(e,"status"),timestamp:function(e){if("number"==typeof e||"string"==typeof e)return e}(e.timestamp),url:uq(e,"url")})):[],o="number"==typeof(n=t.limit)&&Number.isInteger(n)?Math.max(1,Math.min(n,200)):25,s="headers"===t.include||"all"===t.include,l=a.slice(-o).reverse().map(e=>{var t,r;let n,i;return t=e,r=s,n=void 0===t.timestamp?void 0:function e(t){if("string"==typeof t){let r=Number(t);return Number.isFinite(r)?e(r):t}let r=new Date(t>1e10?t:1e3*t);return Number.isNaN(r.getTime())?String(t):r.toISOString()}(t.timestamp),i=D({requestId:t.requestId,resourceType:t.resourceType,mimeType:t.mimeType}),D({timestamp:n,method:t.method,url:t.url,status:t.status,requestHeaders:r?t.headers:void 0,responseHeaders:r?t.responseHeaders:void 0,metadata:Object.keys(i).length>0?i:void 0})}),d="body"===t.include||"all"===t.include?["agent-browser network requests does not expose request or response bodies."]:void 0;return{entries:l,backend:"agent-browser",redacted:!1,...d?{notes:d}:{}}})(await r(["network","requests"]),e)}}async function u0(e,t,r){await e(["mouse","move",String(Math.round(t)),String(Math.round(r))]),await e(["mouse","down"]),await e(["mouse","up"])}async function u1(e,t){var r;let n=await e((r=t,["snapshot",...r?.interactiveOnly?["--interactive"]:[],...r?.raw?[]:["--compact"],..."number"==typeof r?.depth?["--depth",String(r.depth)]:[],...r?.scope?["--selector",r.scope]:[]]));return await uH(n,async t=>await u2(e,t))}async function u2(e,t){var r,n;try{return function(e){let t=uU(e)&&uU(e.box)?e.box:e;if(uU(t)){var r,n;let e,i,a,o,s,l,d;return r=t,e=uj(r,"x"),i=uj(r,"y"),a=uj(r,"width"),u6(e,i,a,uj(r,"height"))??(n=t,o=uj(n,"left"),s=uj(n,"top"),l=uj(n,"right"),d=uj(n,"bottom"),u6(o,s,u8(l,o),u8(d,s)))}}(await e(["get","box",(r=t,`@${r}`)]))}catch(t){let e;if(e=(n=t)instanceof Error?n.message:String(n),!/\bstale\b/i.test(e)&&/\bbox\b|not visible|not found|no element/i.test(e))return;throw t}}async function u3(e,t){let{session:r,options:n}=t,i=[...e,"--json",...r?["--session",r]:[]],a=await u5(i,n);var o,s=function(e,t,r,n){try{return JSON.parse(e)}catch(a){let i=0!==n;throw new eC("COMMAND_FAILED",i?"agent-browser command failed":"agent-browser returned invalid JSON",{cmd:uZ,args:r,...i?{exitCode:n}:{},stdout:e.slice(0,500),stderr:t.slice(0,500),hint:uY},a instanceof Error?a:void 0)}}(a.stdout,a.stderr,i,a.exitCode),l=a,d=i;if(!uU(s))return s;if(!1===(s.success??s.ok)){throw new eC("string"==typeof(o=s.code)&&o.length>0?o:"COMMAND_FAILED",function(e){let t=e.error;if("string"==typeof t&&t.trim())return t.trim();if(uU(t)){let e=uq(t,"message")??uq(t,"error");if(e)return e}return uq(e,"message")??"agent-browser command failed"}(s),{cmd:uZ,args:d,hint:uq(s,"hint")??uY,agentBrowserError:s.error})}if(0!==l.exitCode)throw new eC("COMMAND_FAILED","agent-browser command failed",{cmd:uZ,args:d,exitCode:l.exitCode,stdout:l.stdout.slice(0,500),stderr:l.stderr.slice(0,500),hint:uq(s,"hint")??uY});return Object.hasOwn(s,"data")?s.data:s}async function u5(e,t){let r="",n="",i=0;try{let a=await eS({stateDir:t.stateDir}),o=await eT(a.command,e,{allowFailure:!0,env:a.env,timeoutMs:3e4});r=o.stdout,n=o.stderr,i=o.exitCode}catch(r){var a,o;let t;throw a=r,o=e,"TOOL_MISSING"===(t=ey(a)).code?new eC("TOOL_MISSING",t.message,{...t.details??{},cmd:uZ,args:o,hint:u4(t)},t):"COMMAND_FAILED"===t.code?new eC("COMMAND_FAILED",t.message,{...t.details??{},cmd:uZ,args:o,hint:u4(t)},t):t}return{stdout:r,stderr:n,exitCode:i}}function u4(e){return"string"==typeof e.details?.hint?e.details.hint:uY}function u6(e,t,r,n){if(void 0!==e&&void 0!==t&&void 0!==r&&void 0!==n)return{x:e,y:t,width:r,height:n}}function u8(e,t){return void 0===e||void 0===t?void 0:e-t}function u9(){return{ok:!1,error:eE(new eC("UNAUTHORIZED","Invalid token"))}}async function u7(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 s0({req:t.req,session:i,sessionName:t.sessionName,logPath:r,sessionStore:n,contextFromFlags:t.contextFromFlags});return t.finalize(a)}function pe(e){ea({level:"error",phase:"request_failed",data:{error:e instanceof Error?e.message:String(e)}});let t=et(),r=er({force:!0})??void 0;return{ok:!1,error:eE(e,{diagnosticId:t.diagnosticId,logPath:r})}}async function pt(e,t=2e3){await Promise.race([e.then(()=>void 0).catch(()=>void 0),new Promise(e=>setTimeout(e,t))])}function pr(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 pn(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 pi(e){if(!/^[a-zA-Z0-9._:-]+$/.test(e))throw new eC("INVALID_ARGS",`Invalid Android package name for logs: ${e}`)}async function pa(e,t){let r=(await tE(ti(e))(["shell","pidof",t],{allowFailure:!0})).stdout.trim().split(/\s+/)[0];return r&&/^\d+$/.test(r)?r:null}async function po(e,t){var r,n;let i;pi(t);let a=await pa(e,t),o=tE(ti(e)),s=await td(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 ps(e,t,r,n,i){let a,o,s="recovering",l=!1,d=(async()=>{try{for(;!l;){let d=await pa(e,t);if(!d){s="recovering",await eZ(1e3);continue}let c=tP(ti(e)),u=tr(c,{pid:d});a=u;let p=pr(r,{redactionPatterns:n});if(o=pn(u,r,{endStreamOnClose:!1,writer:p}),"number"==typeof u.pid&&re(i,u.pid),s="active",await o,rt(i),a=void 0,o=void 0,l)break;s="recovering",await eZ(500)}return{stdout:"",stderr:"",exitCode:0}}finally{r.end(),rt(i)}})();return{backend:"android",getState:()=>s,startedAt:Date.now(),wait:d,stop:async()=>{l=!0,a&&!a.killed&&a.kill("SIGINT"),o&&await pt(o),a&&!a.killed&&a.kill("SIGKILL"),await pt(d),rt(i)}}}function pl(e,t){let r=pu(e),n=[`subsystem == "${r}"`,`subsystem CONTAINS "${r}"`,`processImagePath ENDSWITH[c] "/${r}"`,`senderImagePath ENDSWITH[c] "/${r}"`];if(t){let e=pu(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 pd(e){let{deviceId:t,appBundleId:r,executableName:n,startedAt:i,simulatorSetPath:a}=e,o=lP(["spawn",t,"log","show","--style","compact","--info","--predicate",pl(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 iz(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 pc(e,t,r,n,i,a){let o=await pp({deviceId:e,appBundleId:t,simulatorSetPath:i});return ph({backend:"ios-simulator",cmd:"xcrun",args:function(e){let{deviceId:t,appBundleId:r,executableName:n,simulatorSetPath:i}=e;return lP(["spawn",t,"log","stream","--style","compact","--level","info","--predicate",pl(r,n)],{simulatorSetPath:i})}({deviceId:e,appBundleId:t,executableName:o,simulatorSetPath:i}),stream:r,redactionPatterns:n,pidPath:a})}function pu(e){return e.replaceAll("\\","\\\\").replaceAll('"','\\"')}async function pp(e){let{deviceId:t,appBundleId:r,simulatorSetPath:n}=e,a=await iz(lP(["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 eT("plutil",["-extract","CFBundleExecutable","raw","-o","-",s],{allowFailure:!0,timeoutMs:4e3});if(0===l.exitCode)return l.stdout.trim()||void 0}async function pf(e,t,r,n){return ph({backend:"macos",cmd:"log",args:["stream","--style","compact","--predicate",pl(e)],stream:t,redactionPatterns:r,pidPath:n})}async function pm(e,t,r,n){return ph({backend:"ios-device",cmd:"xcrun",args:["devicectl","device","log","stream","--device",e],stream:t,redactionPatterns:r,pidPath:n})}function ph(e){let t="active",r=eO(e.cmd,e.args,{allowFailure:!0,captureOutput:!1});r.wait.catch(()=>{});let n=r.child,i=pr(e.stream,{redactionPatterns:e.redactionPatterns});"number"==typeof n.pid&&re(e.pidPath,n.pid);let a=pn(n,e.stream,{endStreamOnClose:!0,writer:i}).then(r=>(0!==r.exitCode&&(t="failed"),rt(e.pidPath),r),r=>{throw t="failed",rt(e.pidPath),r});return{backend:e.backend,getState:()=>t,startedAt:Date.now(),wait:a,stop:async()=>{n.killed||n.kill("SIGINT"),await pt(a),n.killed||n.kill("SIGKILL"),await pt(a),rt(e.pidPath)}}}let pw=RegExp("\\b(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)\\b\\s+https?:\\/\\/","i"),pg=/https?:\/\/[^\s"'<>\])]+/i,pv=[/\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 py(e,t,r=e.limits.maxEntries){let n=[...e.entries],i=new Set(n.map(e=>pb(e)));for(let e of t.entries){let t=pb(e);if(!i.has(t)&&(i.add(t),n.push(e),n.length>=r))break}return{...e,matchedLines:n.length,entries:n}}function pS(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=pN(s,["method","httpMethod"]),d=pN(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=pw.exec(o),p=/\bmethod["'=: ]+([A-Z]+)\b/i.exec(o),f=(l??p?.[1]??u?.[1])?.toUpperCase(),m=pg.exec(o),h=d??m?.[0];if(!h)return null;let w=c??pI(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:p_(o),packetId:px(o)??void 0,durationMs:pM(o)??void 0,raw:pP(o,a),line:r};if("android"===n&&function(e,t,r){let n=pA(t,r,5),i=e.packetId??n.map(e=>px(e)).find(e=>"string"==typeof e&&e.length>0);i&&(e.packetId=i);let a=i?pA(t,r,12).filter(e=>px(e)===i):n;e.timestamp||(e.timestamp=a.map(e=>p_(e)).find(e=>"string"==typeof e&&e.length>0)),void 0===e.status&&(e.status=a.map(e=>pI(e)).find(e=>"number"==typeof e)),void 0===e.durationMs&&(e.durationMs=a.map(e=>pM(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 pk(e)}let r=/\bheaders?["'=: ]+(\{.*\})/i.exec(e);return r?.[1]?.trim()}(o,s);e&&(g.headers=pP(e,a))}if("body"===i||"all"===i){let e=pD(o,s,["requestBody","body","payload","request"]),t=pD(o,s,["responseBody","response"]);e&&(g.requestBody=pP(e,a)),t&&(g.responseBody=pP(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 pb(e){return`${e.timestamp??""}|${e.method??""}|${e.url}|${e.status??""}|${e.raw}`}function pA(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 pI(e){for(let t of pv){let r=t.exec(e);if(!r)continue;let n=Number.parseInt(r[1]??"",10);if(Number.isInteger(n))return n}return null}function p_(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 px(e){let t=/\bpacket id (\d+)\b/i.exec(e);return t?.[1]??null}function pM(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 pN(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 pD(e,t,r){if(t){for(let e of r)if(void 0!==t[e])return pk(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 pk(e){if("string"==typeof e)return e;try{return JSON.stringify(e)}catch{return String(e)}}function pP(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 pC={start:async e=>await pj(e)},pO=iL(pC,function(e={}){return{...pC,...e}});async function pR(e,t){return await pO.run(e,t)}function pT(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 pL(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:pT("AGENT_DEVICE_APP_LOG_MAX_BYTES",5242880),maxRotatedFiles:pT("AGENT_DEVICE_APP_LOG_MAX_FILES",1)})}function p$(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 pF(e){return"macos"===e.platform?"macos":"ios"===e.platform?"device"===e.kind?"ios-device":"ios-simulator":"android"}async function pU(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:v}=e,y=pF(c),S=(t={backend:y,maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:v},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)?pS(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}}),b=[],A=await pG({device:c,appBundleId:u,appLogPath:m,appLogState:p});if(A){let e=await po(c.id,u);if(e){let t=pS(e.text,{path:`${m} (adb logcat recovery)`,backend:"android",maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:v});t.entries.length>0&&(S=py(t,S,h),b.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 pV({deviceId:c.id,appBundleId:u,startedAt:f,simulatorSetPath:c.simulatorSetPath,appLogPath:m,maxEntries:h,include:w,maxPayloadChars:g,maxScanLines:v});e&&(e.dump.entries.length>0?(S=py(e.dump,S,h),b.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&&b.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?b.push("Capture uses the session app log file. For fresh traffic, run logs clear --restart before reproducing requests."):"active"!==p&&0===b.length&&("ios"===c.platform&&"simulator"===c.kind?b.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."):b.push("Session app log stream is inactive. Run logs clear --restart, reproduce the request window again, then rerun network dump.")),0===S.entries.length&&b.push("ios"===(i=c).platform&&"simulator"===i.kind?"No HTTP(s) entries were found in recent iOS simulator app logs. If the app only emits non-HTTP diagnostics, inspect logs path or add app-side URLSession/network logging for per-request timing and payload details.":"ios"===i.platform?"No HTTP(s) entries were found in recent iOS device app logs. iOS network dump only sees what the app emits into Unified Logging for this process.":"No HTTP(s) entries were found in recent session app logs."),{backend:y,dump:S,notes:b}}async function pG(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 t7(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),t9));if(!s)return null;let l=await pa(t.id,r);return l&&l!==s?{reason:"stale-active",trackedPid:s}:null}async function pq(e,t,r,n){return await pO.resolve(void 0).start({device:e,appBundleId:t,outPath:r,pidPath:n})}async function pj({device:e,appBundleId:t,outPath:r,pidPath:n}){pL(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 pm(e.id,i,o,n):await pc(e.id,t,i,o,e.simulatorSetPath,n);if("android"===e.platform)return pi(t),await ps(e.id,t,i,o,n);if("macos"===e.platform)return await pf(t,i,o,n);throw i.end(),new eC("UNSUPPORTED_PLATFORM",`unsupported platform: ${e.platform}`)}async function pV(e){let t=await pd({deviceId:e.deviceId,appBundleId:e.appBundleId,startedAt:e.startedAt,simulatorSetPath:e.simulatorSetPath});return t?{dump:pS(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 pB(e){await e.stop(),await pt(e.wait)}async function pH(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 e5(e,["shell","echo","ok"],{allowFailure:!0,timeoutMs:1e3});r.adbAvailable=0===t.exitCode}catch{r.adbAvailable=!1}if(t)try{r.androidPidVisible=(await e5(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 iz(["simctl","help"],{allowFailure:!0});r.simctlAvailable=0===e.exitCode}catch{r.simctlAvailable=!1}if("ios"===e.platform&&"device"===e.kind)try{let e=await iz(["devicectl","--version"],{allowFailure:!0});r.devicectlAvailable=0===e.exitCode}catch{r.devicectlAvailable=!1}if("macos"===e.platform)try{let e=await eT("log",["help"],{allowFailure:!0});r.logAvailable=0===e.exitCode}catch{r.logAvailable=!1}return{checks:r,notes:n}}function pK(e,t){pL(e);let r=`[agent-device][mark][${new Date().toISOString()}] ${t.trim()||"marker"}
|
|
16
|
+
`;a.appendFileSync(e,r,"utf8")}function pX(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 pW(e,t){for(let r of e){if(t(r))return r;let e=pW(r.children,t);if(e)return e}}function pz(e,t){let r=[];for(let n of e)t(n)&&r.push(n),r.push(...pz(n.children,t));return r}function pJ(e,t){let r=pW(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 pZ(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 pY(e,t){return e?e.attributes.ref?t.get(e.attributes.ref)?.numberValue??null:pZ(e):null}function pQ(e){return Math.round(10*e)/10}async function p0(e,t){let r=["devicectl",...e],n=await iz(r,{allowFailure:!0,timeoutMs:2e4});if(0===n.exitCode)return;let i=String(n.stdout??""),a=String(n.stderr??"");throw new eC("COMMAND_FAILED",`Failed to ${t.action}`,{cmd:"xcrun",args:r,exitCode:n.exitCode,stdout:i,stderr:a,deviceId:t.deviceId,hint:p4(i,a)??p5})}async function p1(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 p3(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"})),i$(r,t)}async function p2(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 p3(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 p3(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 iz(n,{allowFailure:!0,timeoutMs:2e4});try{if(0!==a.exitCode){let r=String(a.stdout??""),i=String(a.stderr??"");throw new eC("COMMAND_FAILED",t.failureMessage,{cmd:"xcrun",args:n,exitCode:a.exitCode,stdout:r,stderr:i,deviceId:e.id,hint:p4(r,i)??p5})}return JSON.parse(await s.readFile(r,"utf8"))}catch(r){if(r instanceof eC)throw r;throw new eC("COMMAND_FAILED",t.parseFailureMessage,{deviceId:e.id,cause:String(r)})}finally{await s.unlink(r).catch(()=>{})}}let p5="Ensure the iOS device is unlocked, trusted, and available in Xcode > Devices, then retry.";function p4(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 p6(e,t){try{let r=await iJ(e),n=r?.[t];if("string"==typeof n&&n.length>0)return n}catch{}try{let r=await iW("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,di(dn(r),(e,t)=>{void 0===i&&e===n&&"string"===t.name&&(i=t.text??void 0)}),i}catch{return}}let p8="xctrace-animation-hitches";function p9(e,t){let r=dn(e),n=pJ(r,t);return{rows:0===n.length?[]:pz(r,e=>"row"===e.name),schema:n}}function p7(e,t){for(let r of e)p7(r.children,t),r.attributes.id&&t.set(r.attributes.id,{numberValue:pZ(r),process:fe(r)})}function fe(e){if(!e||e.children.some(e=>"sentinel"===e.name))return null;let t=pZ(pW(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 ft="ps-process-snapshot",fr="ps-process-snapshot",fn="xctrace-activity-monitor",fi="xctrace-activity-monitor",fa="leaks-output-graph",fo="Memory graph captured with leaks --outputGraph for host-visible Apple app processes.";async function fs(e,t){if("ios"===e.platform&&"device"===e.kind)return await fM(e,t);let r=await fx(e,t),n=await fC(e,r);if(0===n.length)throw new eC("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 fF({usagePercent:n.reduce((e,t)=>e+t.cpuPercent,0),residentMemoryKb:n.reduce((e,t)=>e+t.rssKb,0),measuredAt:i,matchedProcesses:[r.executableName],cpuMethod:ft,memoryMethod:fr})}async function fl(e,t,r){let n,a=fh(e);if(!a.memgraph)return{available:!1,kind:"memgraph",reason:a.reason,hint:a.hint,support:a};let o=await fR(e,t,a);if(!1===o.available)return o;let{process:l}=o;await s.mkdir(i.dirname(r),{recursive:!0});let d=await fc(r);try{n=await fd(e,r,l.pid)}catch(n){throw await fu(r,d),function(e,t,r,n,a){if(a instanceof eC){let o=a.details??{};return new eC(a.code,`Failed to capture Apple memgraph for ${t}`,{...o,kind:"memgraph",appBundleId:t,pid:r.pid,processName:i.basename(f$(r.command)),path:n,hint:fT(e,"string"==typeof o.stdout?o.stdout:"","string"==typeof o.stderr&&o.stderr.length>0?o.stderr:a.message)},a)}return new eC("COMMAND_FAILED",`Failed to capture Apple memgraph for ${t}`,{kind:"memgraph",appBundleId:t,pid:r.pid,processName:i.basename(f$(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 fu(r,d),new eC("COMMAND_FAILED",`Failed to capture Apple memgraph for ${t}`,{kind:"memgraph",appBundleId:t,pid:l.pid,processName:i.basename(f$(l.command)),path:r,exitCode:n.exitCode,stdout:n.stdout,stderr:n.stderr,hint:fT(e,n.stdout,n.stderr)});let c=await s.stat(r).catch(()=>null);if(!c?.isFile()||c.size<=0)throw await fu(r,d),new eC("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:fa,appBundleId:t,pid:l.pid,processName:i.basename(f$(l.command)),support:a}}async function fd(e,t,r){return"macos"===e.platform?await iW("leaks",[`--outputGraph=${t}`,String(r)],{allowFailure:!0,timeoutMs:12e4}):await iz(lE(e,["spawn",e.id,"leaks",`--outputGraph=${t}`,String(r)]),{allowFailure:!0,timeoutMs:12e4})}async function fc(e){return await s.stat(e).then(e=>e.isFile()).catch(()=>!1)}async function fu(e,t){t||await s.rm(e,{force:!0}).catch(()=>{})}async function fp(e,t){var r;let n,a,o,s,l,c;if("ios"!==e.platform||"device"!==e.kind)throw new eC("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 fN(e,t),p=await fw(e,t,u);return n=p9((r={hitchesXml:p.hitchesXml,frameLifetimesXml:p.frameLifetimesXml,displayInfoXml:p.displayInfoXml,processIds:u.map(e=>e.pid),processNames:t1(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}=p9(e,"device-display-info"),n=r.indexOf("max-refresh-rate");if(n<0)return;let i=new Map;for(let e of t){p7(e.children,i);let t=pY(e.children[n],i);if(null!==t&&t>0)return t}}(r.displayInfoXml),s=(o=(function(e){let t,r,n=dn(e),i=Object.values(r={start:(t=pJ(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 pz(n,e=>"row"===e.name).map(e=>(function(e,t,r){var n,i,a;let o;if(p7(e.children,r),!0===(n=e.children[t.isSystem],null===(o=pY(n,r))?null:0!==o))return null;let s=pY(e.children[t.start],r),l=pY(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:fe(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:pQ(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?pQ(s/n*100):0,droppedFrameCount:s,totalFrameCount:n,sampleWindowMs:l,windowStartedAt:r.windowStartedAt,windowEndedAt:r.windowEndedAt,measuredAt:r.measuredAt,method:p8,matchedProcesses:[...new Set(o.map(e=>e.processName).filter(e=>"string"==typeof e&&e.length>0))],frameDeadlineMs:void 0===a?void 0:pQ(1e3/a),refreshRateHz:a,worstWindows:c.length>0?c:void 0}}function ff(e){return"ios"===e.platform&&"device"===e.kind?{method:p8,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:p8,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 fm(e){let t=ff(e);if("ios"===e.platform&&"device"===e.kind)return{fps:t,memory:{method:fi,description:"Resident memory snapshot from a short xctrace Activity Monitor sample on the connected iOS device.",unit:"kB"},cpu:{method:fn,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:fr,description:`Resident memory snapshot from ${r}`,unit:"kB"},cpu:{method:ft,description:`Recent CPU usage snapshot from ${r}`,unit:"percent"}}}function fh(e){return"ios"===e.platform&&"device"===e.kind?{platform:e.platform,deviceKind:e.kind,memgraph:!1,method:fa,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:fa,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:fa,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:fa,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 fw(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 fg({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 fA(e,t,a,"hitches",o),await fA(e,t,a,"hitches-frame-lifetimes",l);let i=await fI(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 fg(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 fv(s,e.tracePath);if(0===l.result.exitCode)return e.validateTraceOutput&&await fb(e,l.result.stdout,l.result.stderr),{startedAt:l.startedAt,endedAt:l.endedAt,capturedAtMs:l.capturedAtMs};throw new eC("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:fG(l.result.stdout,l.result.stderr)})}async function fv(e,t){let r;for(let n=1;n<=3;n+=1){await fS(t,n,1500);let i=new Date().toISOString(),a=await iz(e,{allowFailure:!0,timeoutMs:6e4});if(r={result:a,startedAt:i,endedAt:new Date().toISOString(),capturedAtMs:Date.now()},0===a.exitCode||!fy(a))break}return r}function fy(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 fS(e,t,r){t<=1||(await s.rm(e,{recursive:!0,force:!0}).catch(()=>{}),await new Promise(e=>setTimeout(e,r)))}async function fb(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 eC("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 fA(e,t,r,n,i){let a=["xctrace","export","--input",r,"--xpath",`/trace-toc/run/data/table[@schema="${n}"]`,"--output",i],o=await iz(a,{allowFailure:!0,timeoutMs:15e3});if(0!==o.exitCode)throw new eC("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:fG(o.stdout,o.stderr)})}async function fI(e,t,r,n,i){try{return await fA(e,t,r,n,i),!0}catch{return!1}}async function f_(e){let t=dn(e),r=pJ(t,"activity-monitor-process-live");if(0===r.length)throw new eC("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 eC("COMMAND_FAILED","xctrace activity-monitor-process-live export is missing expected columns");let s=pz(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=pW(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:pZ(e),processName:fU(e)})}let r=pY(t[n],d),s=(c=t[i],u=d,c?c.attributes.ref?u.get(c.attributes.ref)?.processName??null:fU(c):null);null!==r&&Number.isFinite(r)&&s&&l.push({pid:r,processName:s,cpuTimeNs:pY(t[a],d),residentMemoryBytes:pY(t[o],d)})}return l}async function fx(e,t){let r="macos"===e.platform?await fP(t):await fE(e,t),n="macos"===e.platform?i.join(r,"Contents","Info.plist"):i.join(r,"Info.plist"),a=await p6(n,"CFBundleExecutable");if(!a)throw new eC("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 fM(e,t){let r=await fN(e,t),n=await fD(e,t),i=await fD(e,t),a=fk(await f_(n.xml),r,t,e),o=fk(await f_(i.xml),r,t,e),s=i.capturedAtMs-n.capturedAtMs;if(s<=0)throw new eC("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 eC("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 fF({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:fn,memoryMethod:fi})}async function fN(e,t){let r=(await p1(e,"all")).find(e=>e.bundleId===t);if(!r)throw new eC("APP_NOT_INSTALLED",`No iOS device app found for ${t}`,{appBundleId:t,deviceId:e.id});if(!r.url)throw new eC("COMMAND_FAILED",`Missing app bundle URL for ${t}`,{appBundleId:t,deviceId:e.id});let n=r.url.replace(/\/$/,""),i=d(n),a=(await p2(e)).filter(e=>e.executable.startsWith(`${n}/`));if(0===a.length)throw new eC("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 fD(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 fg({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 fA(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 fk(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 eC("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:fq(t.cpuTimeNs,e.cpuTimeNs),residentMemoryBytes:fq(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:t1(c.map(e=>e.processName))}}async function fP(e){let t=`kMDItemCFBundleIdentifier == "${e.replaceAll('"','\\"')}"`,r=await iW("mdfind",[t],{allowFailure:!0,timeoutMs:15e3});if(0!==r.exitCode)throw new eC("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 eC("APP_NOT_INSTALLED",`No macOS app found for ${e}`,{appBundleId:e});return n}async function fE(e,t){let r=lE(e,["get_app_container",e.id,t,"app"]),n=await iz(r,{allowFailure:!0,timeoutMs:15e3});if(0!==n.exitCode)throw new eC("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 eC("APP_NOT_INSTALLED",`No iOS simulator app container found for ${t}`,{appBundleId:t});return i}async function fC(e,t){let r="macos"===e.platform?["-axo","pid=,%cpu=,rss=,command="]:lE(e,["spawn",e.id,"ps","-axo","pid=,%cpu=,rss=,command="]);return(function(e){let t=[];for(let r of E(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 iW("ps",r,{timeoutMs:15e3}):await fL(r)).stdout).filter(e=>(function(e,t){let r=f$(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 fO(e,t,r){let n=(await fC(e,r)).sort((e,t)=>t.rssKb-e.rssKb)[0];if(n)return n;throw new eC("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 fR(e,t,r){try{let r=await fx(e,t);return{available:!0,process:await fO(e,t,r)}}catch(t){if(function(e,t){if("ios"!==e.platform||"simulator"!==e.kind||!(t instanceof eC))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 fT(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 fL(e){let t=await iz(e,{allowFailure:!0,timeoutMs:15e3});return 0===t.exitCode?t:await iW("ps",["-axo","pid=,%cpu=,rss=,command="],{timeoutMs:15e3})}function f$(e){let[t=""]=e.trim().split(/\s+/,1);return t}function fF(e){return{cpu:{usagePercent:pQ(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 fU(e){let t=e?.attributes.fmt?.trim()??"";return t?t.replace(/\s+\(\d+\)$/,"").trim():null}function fG(e,t){let r=p4(e,t);if(r)return r;let n=`${e}
|
|
21
|
+
${t}`.toLowerCase();return n.includes("no device matched")||n.includes("failed to find device")?p5: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 fq(e,t){return null===e?t:null===t?e:Math.max(e,t)}async function fj(e){var t;let r=await fK(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 fX(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 fV(e,t=e.outPath){t!==e.outPath&&await s.mkdir(i.dirname(t),{recursive:!0});let r=await fz(e,{failOnForcedKill:!0});if(0!==r.exitCode)throw new eC("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:fG(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 fZ(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 fB(e){return await fz(e,{failOnForcedKill:!1})}async function fH(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 iz(l,{allowFailure:!0,timeoutMs:15e3});if(0!==d.exitCode)throw new eC("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:fG(d.stdout,d.stderr)});let c=(n={...e,tocXml:await s.readFile(r,"utf8")},t=dn(n.tocXml),a=pz(t,e=>"run"===e.name),o=t1(pz(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 fK(e,t){if("ios"!==e.platform&&"macos"!==e.platform)throw new eC("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 fN(e,t);return{pids:r.map(e=>e.pid),processNames:t1(r.map(e=>i.basename(d(e.executable))))}}let r=await fx(e,t),n=await fC(e,r);if(0===n.length)throw new eC("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 fX(e,t,r){let n;for(let r=1;r<=3;r+=1){await fS(t,r,1500);let i=eO("xcrun",e,{allowFailure:!0}),a=await fW(i.wait);if(!a)return i;if(n=a,!fy(a))break}let i=n??{stdout:"",stderr:"",exitCode:1};throw new eC("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:fG(i.stdout,i.stderr)})}async function fW(e){return await Promise.race([e,new Promise(e=>setTimeout(e,500))])}async function fz(e,t){e.child.kill("SIGINT");let r=await fJ(e.wait,45e3);if(r)return r;e.child.kill("SIGKILL");let n=await fJ(e.wait,5e3);if(n&&!t.failOnForcedKill)return n;if(n)throw new eC("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 eC("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 fJ(e,t){return await Promise.race([e,new Promise(e=>setTimeout(e,t))])}async function fZ(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 eC("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 fY(e){let t=e.replaceAll(",","").match(/^-?\d+(?:\.\d+)?/);if(!t)return null;let r=Number(t[0]);return Number.isFinite(r)?r:null}function fQ(e){return Math.round(10*e)/10}let f0="adb-shell-dumpsys-gfxinfo-framestats",f1="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 f2(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 f3(e){return 0===e.length?{}:{firstFrameNs:Math.min(...e.map(e=>e.intendedVsyncNs)),lastFrameNs:Math.max(...e.map(e=>e.frameCompletedNs))}}function f5(e,t){if(void 0!==e&&void 0!==t)return Math.max(0,Math.round((t-e)/1e6))}function f4(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:fY(i)??void 0}async function f6(e,t,r={}){var n,i,a,o,s,l,d,c;let u=tE(e,r.adb);try{let d,c,p,f,m,h,w,g,v,y,S,b=(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 eC("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=f4(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=fY(i)??void 0,s=Number(a);if(void 0===o||!Number.isFinite(s)||r<0)return;let l=f4(t,"Uptime"),d=f4(t,"Stats since");return{droppedFramePercent:pQ(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=f2(e,t,"Flags"),n=f2(e,t,"IntendedVsync"),i=f2(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 eC("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 eC("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=f3(t),a=n?.statsSinceNs,o=a??i.firstFrameNs,s=f5(o,i.lastFrameNs),l=n?.sampleWindowMs??s;if(!Number.isFinite(r)||n?.uptimeMs===void 0||void 0===o)return{sampleWindowMs:l,windowStartNs:o};let d=r-n.uptimeMs;return{sampleWindowMs:l,windowStartNs:o,windowStartedAt:new Date(d+o/1e6).toISOString(),windowEndedAt:function(e){let{deviceBootWallClockMs:t,measuredAtMs:r,summaryStartNs:n,lastFrameNs:i}=e;return void 0!==n?new Date(r).toISOString():void 0===i?void 0:new Date(t+i/1e6).toISOString()}({deviceBootWallClockMs:d,measuredAtMs:r,summaryStartNs:a,lastFrameNs:i.lastFrameNs}),timestampSource:"estimated-from-device-uptime"}}({frames:f,measuredAtMs:h,summary:p}),g=function(e){let{frames:t,frameDeadlineNs:r,summaryDroppedFrameCount:n}=e;return void 0!==n?n<=0?[]:[...t].sort((e,t)=>t.durationNs-e.durationNs).slice(0,n).sort((e,t)=>e.intendedVsyncNs-t.intendedVsyncNs):void 0===r?[]:t.filter(e=>e.durationNs>r)}({frames:f,frameDeadlineNs:m,summaryDroppedFrameCount:p?.droppedFrameCount}),v=p?.sampleWindowMs??w.sampleWindowMs??function(e){if(0===e.length)return;let t=f3(e);return f5(t.firstFrameNs,t.lastFrameNs)}(f),a=p,o=f,s=g,d=a?.totalFrameCount??o.length,c=a?.droppedFrameCount??s.length,y={totalFrameCount:d,droppedFrameCount:c,droppedFramePercent:a?.droppedFramePercent??(d>0?pQ(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:fQ(Math.max(...t.map(e=>e.durationNs))/1e6)}})({frames:e,windowStartNs:r,measuredAtMs:n,uptimeMs:i})).sort((e,t)=>t.missedDeadlineFrameCount-e.missedDeadlineFrameCount||t.worstFrameMs-e.worstFrameMs).slice(0,3).sort((e,t)=>e.startOffsetMs-t.startOffsetMs)}({frames:t,windowStartNs:r.windowStartNs,measuredAtMs:n,uptimeMs:i?.uptimeMs});return a.length>0?a:void 0}({droppedFrames:g,timing:w,measuredAtMs:h,summary:p}),{...y,sampleWindowMs:v,...(l=m,{frameDeadlineMs:void 0===l?void 0:fQ(l/1e6),refreshRateHz:void 0===l?void 0:fQ(1e9/l)}),windowStartedAt:w.windowStartedAt,windowEndedAt:w.windowEndedAt,timestampSource:w.timestampSource,measuredAt:i,method:f0,source:p?"android-gfxinfo-summary":"framestats-rows",worstWindows:S&&S.length>0?S:void 0});return await f8(e,t,r),b}catch(e){throw d=t,(c=e)instanceof eC?new eC(c.code,c.message,{...c.details??{},metric:"fps",package:d},c):new eC("COMMAND_FAILED",`Failed to sample Android fps for ${d}`,{metric:"fps",package:d},c)}}async function f8(e,t,r={}){let n=tE(e,r.adb);try{await n(["shell","dumpsys","gfxinfo",t,"reset"],{allowFailure:!0,timeoutMs:3e3})}catch{}}function f9(e,t,r,n){if(n instanceof eC){var i,a,o,s,l;let d,c=n.details??{};return new eC(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.":f7("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.":f7(i))},n)}return new eC("COMMAND_FAILED",`Failed to ${e} Android ${t} for ${r}`,{action:e,package:r,tool:t,hint:f7(t)},n)}function f7(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 me(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 mt(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 mt(e,t,r){try{let n=await f6(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 mr="adb-shell-simpleperf",mn="adb-shell-perfetto",mi="/data/local/tmp";async function ma(e,t,r){let n=tE(e,r.adb);await mp(n,t),await mm(n,t),await mf(n,t);let i=await mc(t.outPath);await ml(n,t.remotePath);let a=Date.now(),o=Math.max(0,a-t.startedAt),s=await me(e,t,i,o,{adb:n});return{...t,action:"stop",platform:"android",state:"stopped",stoppedAt:a,durationMs:o,sizeBytes:i,method:"simpleperf"===t.kind?mr:mn,artifact:{path:t.outPath,sizeBytes:i},summary:s,message:`Stopped Android ${t.kind} ${t.type} for ${t.packageName}`}}async function mo(e,t,r={}){let n=tE(e,r.adb);try{"running"===t.state&&(await mp(n,t),await mm(n,t).catch(()=>{}))}finally{await ml(n,t.remotePath)}}function ms(e,t,r=mi){let n=e.replace(/[^A-Za-z0-9_.-]/g,"_");return`${r}/agent-device-${n}-${Date.now()}-${t}`}async function ml(e,t){try{await e(["shell",`rm -f ${mu(t)}`],{allowFailure:!0,timeoutMs:15e3})}catch{}}async function md(e,t){await s.mkdir(i.dirname(e),{recursive:!0}),await s.writeFile(e,`${JSON.stringify(t,null,2)}
|
|
23
|
+
`)}async function mc(e){try{return(await s.stat(e)).size}catch(t){throw new eC("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 mu(e){return`'${e.replace(/'/g,"'\\''")}'`}async function mp(e,t){try{var r;await e(["shell",(r=t.profilerPid,`pid=${mu(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 f9("stop",t.kind,t.packageName,e)}}async function mf(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 eC("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 mm(e,t){let r;for(let n=0;n<12;n+=1){let n=await mh(e,t.remotePath);if(void 0!==n&&n>0&&n===r)return;r=n,await v(250)}throw new eC("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 mh(e,t){let r=mu(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 mw(e,t){try{let r=await e(["shell","pidof",t],{allowFailure:!0,timeoutMs:15e3}),n=mv(r.stdout);if(0===r.exitCode&&n)return n}catch{}throw new eC("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 mg(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 eC("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 mv(e){return e.trim().split(/\s+/).find(e=>/^\d+$/.test(e))}async function my(e,t,r,n={}){let i,a=tE(e,n.adb),o=await mw(a,t);await mg(a,"perfetto",t);let s=ms(t,"app.perfetto-trace","/data/misc/perfetto-traces");try{await f8(e,t,{adb:a}),i=await mb(a,s,t)}catch(e){throw await ml(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:mn,message:`Started Android Perfetto trace for ${t}`}}async function mS(e,t,r,n={}){return await ma(e,{...t,outPath:r},n)}async function mb(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=mv(n.stdout);if(i)return i;throw new eC("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 f9("start","perfetto",r,e)}}async function mA(e,t,r,n={}){let i,a=tE(e,n.adb),o=await mw(a,t);await mg(a,"simpleperf",t);let s=ms(t,"cpu.perf.data");try{i=await mx(a,o,s,t)}catch(e){throw await ml(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:mr,message:`Started Android Simpleperf CPU profile for ${t}`}}async function mI(e,t,r,n={}){return await ma(e,{...t,outPath:r},n)}async function m_(e,t,r,n={}){let i=tE(e,n.adb);await mg(i,"simpleperf",t.packageName);let a=await mM(i,t),o=new Date().toISOString(),s=function(e){let t=[];for(let r of E(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:pQ(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 md(r,l);let d=await mc(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:mr,message:`Wrote Android Simpleperf report for ${t.packageName}`}}async function mx(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(mu).join(" "),d=`${mi}/agent-device-${s}-${Date.now()}.err`,`err=${mu(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=mv(c.stdout);if(u)return u;throw new eC("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 f9("start","simpleperf",n,e)}}async function mM(e,t){try{return await e(["shell","simpleperf","report","-i",t.remotePath,"--stdio","--sort","comm,dso,symbol"],{timeoutMs:3e4})}catch(e){throw f9("report","simpleperf",t.packageName,e)}}let mN="adb-shell-dumpsys-cpuinfo",mD="Aggregated CPU usage for app processes matched from adb shell dumpsys cpuinfo.",mk="adb-shell-dumpsys-meminfo",mP="Memory snapshot from adb shell dumpsys meminfo <package>. Values are reported in kilobytes.",mE="adb-shell-am-dumpheap",mC="Java heap dump captured with adb shell am dumpheap, pulled to a local artifact path.";async function mO(e,t,r={}){let n=tE(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 E(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:pQ(i),measuredAt:r,method:mN,matchedProcesses:[...n]}}(e.stdout,t,new Date().toISOString())}catch(e){throw mU("cpu",t,e)}}async function mR(e,t,r={}){let n=tE(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 eC("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=mG(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!==fY(e));if(!r)break;return fY(r)??void 0}}(e);if(void 0===i)throw new eC("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:mG(e,"TOTAL RSS"),measuredAt:r,method:mk,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?fY(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 mU("memory",t,e)}}async function mT(e,t,r,n={}){let a,o=tE(e,n.adb),l=await mF(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 mL(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 eC("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 m$(r,c),new eC("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 m$(r,c),new eC("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 mL(e){return await s.stat(e).then(e=>e.isFile()).catch(()=>!1)}async function m$(e,t){t||await s.rm(e,{force:!0}).catch(()=>{})}async function mF(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 eC("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 mU(e,t,r){return r instanceof eC?new eC(r.code,r.message,{...r.details??{},metric:e,package:t},r):new eC("COMMAND_FAILED",`Failed to sample Android ${e} for ${t}`,{metric:e,package:t},r)}function mG(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:fY(i)??void 0}let mq="shared_prefs/ReactNativeDevPrefs.xml",mj="debug_http_host",mV="dev_server_https",mB="RCT_jsLocation",mH="RCT_packager_scheme",mK="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.",mX='<?xml version="1.0" encoding="utf-8" standalone="yes" ?>\n<map>\n</map>\n';function mW(e){return void 0!==ex(e)}async function mz(e){let{device:t,appId:r,runtime:n}=e;if(!r)return;let i=ex(n);if(i){if("android"===t.platform)return void await mZ(t,r,i);"ios"===t.platform&&"simulator"===t.kind&&await m1(t,r,i)}}async function mJ(e){let{device:t,appId:r}=e;if(r){if("android"===t.platform)return void await mY(t,r);"ios"===t.platform&&"simulator"===t.kind&&await m2(t,r)}}async function mZ(e,t,r){var n,i,a,o,s,l;let d,c;m6(t);let u=(n=await mQ(e,t),i=mj,a=`${r.host}:${r.port}`,d=` <string name="${m8(i)}">${m8(a)}</string>`,m5(m4(n,i),d));o=u,s=mV,l="https"===r.scheme,c=` <boolean name="${m8(s)}" value="${l?"true":"false"}" />`,u=m5(m4(o,s),c),await m0(e,t,u)}async function mY(e,t){m6(t);let r=await mQ(e,t),n=m4(r,mj),i=m4(n,mV);i!==r&&await m0(e,t,i)}async function mQ(e,t){let r=await e5(e,["shell","run-as",t,"cat",mq],{allowFailure:!0});return 0!==r.exitCode?mX:m3(r.stdout)}async function m0(e,t,r){let n=["shell","run-as",t,"id"],i=await e5(e,n,{allowFailure:!0});if(0!==i.exitCode){let e=m9(i.stdout,i.stderr);throw new eC("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?mK:"adb shell run-as probe failed. Check adb connectivity and that the device is reachable. Inspect stderr/details for more information."})}try{await e5(e,["shell","run-as",t,"mkdir","-p","shared_prefs"]),await e5(e,["shell","run-as",t,"tee",mq],{stdin:r.trimEnd()})}catch(n){let e=eP(n);if("TOOL_MISSING"===e.code)throw e;let r=m9("string"==typeof e.details?.stdout?e.details.stdout:"","string"==typeof e.details?.stderr?e.details.stderr:"");throw new eC("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?mK:"adb run-as succeeded, but writing ReactNativeDevPrefs.xml failed. Inspect stderr/details for the failing shell command."},e)}}async function m1(e,t,r){await iz(lE(e,["spawn",e.id,"defaults","write",t,mB,"-string",`${r.host}:${r.port}`])),await iz(lE(e,["spawn",e.id,"defaults","write",t,mH,"-string",r.scheme]))}async function m2(e,t){await iz(lE(e,["spawn",e.id,"defaults","delete",t,mB]),{allowFailure:!0}),await iz(lE(e,["spawn",e.id,"defaults","delete",t,mH]),{allowFailure:!0})}function m3(e){let t=e.trim();return t.includes("<map")&&t.includes("</map>")?`${t}
|
|
25
|
+
`:mX}function m5(e,t){return m3(e).replace("</map>",`${t}
|
|
26
|
+
</map>`)}function m4(e,t){let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return m3(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 m6(e){if("binary"!==tl(e))return;let t=tp(e);throw new eC("INVALID_ARGS",t,{package:e,hint:t})}function m8(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function m9(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 m7=new Map;async function he(e){let t=await w.mkdtemp(i.join(u.tmpdir(),"agent-device-materialized-"));try{let n=await hn(e.installablePath,i.join(t,"installable")),a=e.archivePath?await hn(e.archivePath,i.join(t,"archive")):void 0,o=r.randomUUID(),s=e.ttlMs??9e5,l=Date.now()+s,d=setTimeout(()=>{ht(o)},s);return m7.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 ht(e,t){let r=m7.get(e);if(!r)throw new eC("INVALID_ARGS",`Materialized paths not found: ${e}`);if(r.tenantId&&r.tenantId!==t)throw new eC("UNAUTHORIZED","Materialized paths belong to a different tenant");clearTimeout(r.timer),m7.delete(e),await w.rm(r.rootPath,{recursive:!0,force:!0})}async function hr(e){let t=Array.from(m7.entries()).filter(([,t])=>t.sessionName===e).map(([e])=>e);await Promise.all(t.map(async e=>{await ht(e)}))}async function hn(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 hi=["Simulator"],ha=["Device Hub","Simulator"];function ho(e,t){if("simulator"!==e.kind)throw new eC("UNSUPPORTED_OPERATION",`${t} is only supported on iOS simulators`)}async function hs(e={}){let t=e.deviceHub?ha:hi,r=e.background?["-g","-a"]:["-a"];for(let e of t)if(0===(await iW("open",[...r,e],{allowFailure:!0,timeoutMs:1e4})).exitCode)return}async function hl(e,t={}){let r,n;if("simulator"!==e.kind)return;if("Booted"===await hc(e)){t.focusExisting&&await hs({background:t.deviceHub,deviceHub:t.deviceHub});return}let i=e9.fromTimeoutMs(18e4);try{await to(async({deadline:t})=>{if(t?.isExpired())throw new eC("COMMAND_FAILED","iOS simulator boot deadline exceeded",{timeoutMs:18e4});let i=Math.max(1e3,t?.remainingMs()??18e4),a=await iz(lE(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 eC("COMMAND_FAILED","simctl boot failed",{stdout:r.stdout,stderr:r.stderr,exitCode:r.exitCode});let l=await iz(lE(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 eC("COMMAND_FAILED","simctl bootstatus failed",{stdout:n.stdout,stderr:n.stderr,exitCode:n.exitCode});let d=await hc(e);if("Booted"!==d)throw new eC("COMMAND_FAILED","Simulator is still booting",{state:d})},{maxAttempts:3,baseDelayMs:500,maxDelayMs:2e3,jitter:.2,shouldRetry:e=>{let t=tt({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=>tt({error:e,stdout:n?.stdout??r?.stdout,stderr:n?.stderr??r?.stderr,context:{platform:"ios",phase:"boot"}})})}catch(a){let t=tt({error:a,stdout:n?.stdout??r?.stdout,stderr:n?.stderr??r?.stderr,context:{platform:"ios",phase:"boot"}});throw new eC("COMMAND_FAILED","iOS simulator failed to boot",{platform:"ios",deviceId:e.id,timeoutMs:18e4,elapsedMs:i.elapsedMs(),reason:t,hint:tn(t),boot:r,bootstatus:n})}await hs({deviceHub:t.deviceHub})}async function hd(e){let t=lE(e,["shutdown",e.id]),r=await iz(t,{allowFailure:!0,timeoutMs:15e3});return{success:0===r.exitCode,exitCode:r.exitCode,stdout:String(r.stdout??""),stderr:String(r.stderr??"")}}async function hc(e){let t="string"==typeof e?e:e.id,r="string"==typeof e?lP(["list","devices","-j"]):lE(e,["list","devices","-j"]),n=await iz(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 hu(e){return"ios"===e.platform&&"simulator"===e.kind}async function hp(e){if(!1===e.booted)return{success:!0,exitCode:0,stdout:"",stderr:""};try{return hu(e)?await hf(e):await hh(e)}catch(t){let e=eE(t);return{success:!1,exitCode:-1,stdout:"",stderr:e.message,error:e}}}async function hf(e){let t=await hd(e);return t.success?t:"Shutdown"===await hm(e)?{...t,success:!0,exitCode:0}:t}async function hm(e){try{return await hc(e)}catch{return null}}async function hh(e){let t=await e5(e,["emu","kill"],{allowFailure:!0,timeoutMs:15e3});return{success:0===t.exitCode,exitCode:t.exitCode,stdout:String(t.stdout??""),stderr:String(t.stderr??"")}}let hw=new Map;async function hg(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=hw.get(i);if(void 0!==a){if(a>Date.now()&&!t.focusExisting)return;hw.delete(i)}if("ios"===e.platform){if("simulator"===e.kind){let{ensureBootedSimulator:r}=await Promise.resolve(tW);await r(e,{deviceHub:t.deviceHub,focusExisting:t.focusExisting}),hv(i);return}if("device"===e.kind){await hy(e.id),hv(i);return}}if("android"===e.platform){let{waitForAndroidBoot:t}=await import("./3340.js");await t(e.id),hv(i)}}function hv(e){hw.set(e,Date.now()+5e3)}async function hy(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 iz(["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 hS(t);if(0===n.exitCode){if(!o.parsed)throw new eC("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 eC("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 eC("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:hb(i,a)})}catch(t){if(t instanceof eC&&"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 eC("COMMAND_FAILED","iOS device readiness probe failed",{deviceId:e,cause:t.message,timeoutMs:a,stdout:n,stderr:i,hint:n||i?hb(n,i):o},t)}throw new eC("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 hS(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 hb(e,t){let r=p4(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.":p5)}function hA(e,t,r){return t||nh(r,np)?null:aJ("INVALID_ARGS",`${e} requires an active session or an explicit device selector (e.g. --platform ios).`)}function hI(e){return"string"==typeof e?.session&&e.session.trim().length>0}async function h_(e,t){hu(e)&&!(t<=0)&&await new Promise(e=>setTimeout(e,t))}async function hx(e){let t=nh(e.flags,np)||!e.session?await ni(e.flags??{}):await hM(e.session.device);return!1!==e.ensureReady&&await hg(t),t}async function hM(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 ni(t)}catch(e){if(!(e instanceof eC)||"DEVICE_NOT_FOUND"!==e.code)throw e}return await ni({platform:"ios",target:e.target,device:e.name,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}})}function hN(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 hD(e,t){return!!t&&0===lw(t,e).length}async function hk(e){let{device:t,shutdownRequested:r}=e;if(r&&(hu(t)||"android"===t.platform&&"emulator"===t.kind))return await hp(t)}async function hP(e){if(await c4(e.device.id),"macos"!==e.device.platform)return;let t="frontmost-app"===e.surface?{surface:"frontmost-app"}:e.appBundleId?{bundleId:e.appBundleId}:{};await aa("dismiss",t).catch(t=>{ea({level:"debug",phase:"macos_close_alert_dismiss_failed",data:{session:e.name,error:t instanceof Error?t.message:String(t)}})})}async function hE(e){e.applePerf?.active&&(await fB(e.applePerf.active),e.applePerf={...e.applePerf??{},active:void 0})}async function hC(e){let t=e.nativePerf?.android;t&&(await mo(e.device,t),e.nativePerf={...e.nativePerf??{},android:void 0})}async function hO(e,t){e.appLog&&await pB(e.appLog),await hE(e),await hC(e),eY(e.device.platform)&&await hP(e),await hr(t).catch(()=>{})}async function hR(e){var t,r,n;let{req:i,sessionName:a,logPath:o,sessionStore:s}=e,l=s.get(a);if(!l)return await hT(i,o);(l.appLog&&await pB(l.appLog),await hE(l),await hC(l),t=i,r=l,n=t,(n.positionals?.length??0)>0||"web"===r.device.platform)&&(eY(l.device.platform)&&!hu(l.device)&&await hP(l),await iu(l.device,"close",i.positionals??[],i.flags?.out,{...a$(o,i.flags,l.appBundleId,l.trace?.outPath)}),await h_(l.device,300));eY(l.device.platform)&&(!hu(l.device)||i.flags?.shutdown||l.recording)?await hP(l):eY(l.device.platform)&&ea({level:"debug",phase:"ios_runner_retained_after_close",data:{session:l.name,deviceId:l.device.id}}),mW(s.getRuntimeHints(a))&&l.appBundleId&&await mJ({device:l.device,appId:l.appBundleId}).catch(()=>{}),s.recordAction(l,{command:"close",positionals:i.positionals??[],flags:i.flags??{},result:{session:l.name,...q(`Closed: ${l.name}`)}}),i.flags?.saveScript&&(l.recordSession=!0),s.writeSessionLog(l),await hr(a).catch(()=>{}),s.delete(a);let d=await hk({device:l.device,shutdownRequested:i.flags?.shutdown});return d?{ok:!0,data:k({session:l.name,shutdown:d},`Closed: ${l.name}`)}:{ok:!0,data:{session:l.name,...q(`Closed: ${l.name}`)}}}async function hT(e,t){if(!e.positionals||0===e.positionals.length)return aJ("SESSION_NOT_FOUND","No active session");let r=await hx({session:void 0,flags:e.flags,ensureReady:!0});return await iu(r,"close",e.positionals,e.flags?.out,{...a$(t,e.flags)}),await h_(r,300),{ok:!0,data:{app:e.positionals[0],...q(`Closed: ${e.positionals[0]}`)}}}async function hL(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 h$(e){a.existsSync(e)&&a.unlinkSync(e)}function hF(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 hU(e){let t=hF(e);if(!t||t.pid===process.pid)try{a.existsSync(e)&&a.unlinkSync(e)}catch{}}function hG(e){if(void 0===e)return;let t=Number(e);if(Number.isInteger(t))return t}function hq(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 eC("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}=eV(o.AGENT_DEVICE_STATE_DIR),h=eK(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,t9);if(a.existsSync(t))try{let e=t7(a.readFileSync(t,"utf8"));if(e&&function(e){let t,r=eI(e.pid);if(!r||e.startTime&&r!==e.startTime)return!1;let n=e_(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{rt(t)}}let b=new t4(m),A=new r6({maxActiveSimulatorLeases:hG(o.AGENT_DEVICE_MAX_SIMULATOR_LEASES),defaultLeaseTtlMs:hG(o.AGENT_DEVICE_LEASE_TTL_MS),minLeaseTtlMs:hG(o.AGENT_DEVICE_LEASE_MIN_TTL_MS),maxLeaseTtlMs:hG(o.AGENT_DEVICE_LEASE_MAX_TTL_MS)}),I=tD(),_=r.randomBytes(24).toString("hex"),x=eI(process.pid)??void 0,M=eW(),N=function(e){let{logPath:t,stateDir:r,token:n,androidAdbProvider:a,appleRunnerProvider:o,appleToolProvider:s,linuxToolProvider:l,webProvider:d,appLogProvider:c,recordingProvider:u,deviceInventoryProvider:p,trackDownloadableArtifact:f}=e,{sessionStore:m,leaseRegistry:h}=e;async function w(e){let r=!!(e.meta?.debug||e.flags?.verbose);return await ee({session:e.session,requestId:e.meta?.requestId,command:e.command,debug:r,logPath:t},async()=>{if(!rr(e.token,n))return u9();try{return await ns(p,async()=>{let t=await u$({req:e,sessionStore:m,leaseRegistry:h});return await g(t)})}catch(e){return pe(e)}})}async function g(e,t){let n=async()=>{var n;let p,h=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=c2(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:l_(t.req,a),existingSession:a}),p=u.req;c=u.existingSession;let f=e=>(function(e,t,r){let n=et();if(!t.ok){ea({level:"error",phase:"request_failed",data:{code:t.error.code,message:t.error.message}});let e=er({force:!0})??void 0;return{ok:!1,error:eE(new eC(ek(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 ea({level:"info",phase:"request_success"}),er(),{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,nb(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,nb(n)?.selectorValidationExempt!==!0)&&function(e,t){let r=lw(e,t);if(0!==r.length)throw new eC("INVALID_ARGS",`Session "${e.name}" is already bound to ${lm(e)}, but this request selected ${r.map(lg).join(", ")}.`,{session:e.name,conflicts:r.map(lg),hint:lh(e,"selector-conflict")})}(c,p.flags);let m=(e,t,r)=>{let n;return{...a$(d,e,t,r,n=et().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:m,trackDownloadableArtifact:f});if("response"===h.type)return h.response;let w=h.scope,g=async e=>await v({lockedScope:w,providerScope:e,allowReplayActions:void 0===t});return t?await g(t):await nI({req:w.req,existingSession:w.existingSession,providers:{androidAdbProvider:a,appleRunnerProvider:o,appleToolProvider:s,linuxToolProvider:l,webProvider:d??((n=w,n.existingSession?.device.platform==="web"||n.req.flags?.platform==="web")?(p=r,({req:e,session:t})=>uQ({session:t?.name??e.session,stateDir:p})):void 0),appLogProvider:c,recordingProvider:u}},g)};return t?await n():await e.runLocked(n)}async function v(e){var t,r;let{lockedScope:i,providerScope:a,allowReplayActions:o}=e,s=await lr({req:i.req,sessionName:i.sessionName,logPath:i.logPath,sessionStore:m,leaseRegistry:h,invoke:w,invokeReplayAction:o?(t=i,r=a,async e=>{var i,a,o;if(i=e,a=t,i.session!==a.sessionName||(o=i.command,nb(o)?.replayScopedAction!==!0))return await w(e);if(!rr(e.token,n))return u9();try{let n=await u$({req:e,sessionStore:m,leaseRegistry:h});return n.sessionName===t.sessionName?await g(n,r):await w(e)}catch(e){return pe(e)}}):void 0,androidAdbExecutor:a.androidAdbExecutor,contextFromFlags:i.handlerContextFromFlags});return s?i.finalize(s):await u7({lockedScope:i,logPath:i.logPath,sessionStore:m})}return w}({logPath:f,stateDir:c,token:_,sessionStore:b,leaseRegistry:A,trackDownloadableArtifact:rg}),D=async e=>{await ee({command:"daemon",session:"daemon",logPath:f,debug:!0},async()=>{ea({level:"error",phase:"daemon_fatal",data:{error:e instanceof Error?e.message:String(e)}}),er({force:!0})})},k=async e=>{let t=hO(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,eZ(5e3).then(()=>{l.write(`Daemon session teardown timed out (${e.name}).
|
|
31
|
+
`)})]),b.writeSessionLog(e),b.delete(e.name)},P=async()=>{let e=b.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))rd(e);ea({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(tK);if(await e(),n<=0)break;await eZ(200)}}catch(e){ea({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=eU(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=ej(n),a=rs(n.meta?.requestId,"socket"),n.meta={...n.meta,requestId:a},i.add(a),rl(a),ru(a))throw rf();r=await rP(o?t=>{e.destroyed||e.write(ez(t))}:void 0,async()=>await N(n))}catch(e){r={ok:!1,error:eE(e)}}finally{n-=1,a&&(i.delete(a),rc(a))}e.destroyed||e.write(o?eG(r):`${JSON.stringify(r)}
|
|
32
|
+
`)}})})).destroyConnections=()=>{for(let e of t)e.destroy();t.clear()},n);r.push(i),e=await hq(i,"Failed to bind socket server")}if("socket"!==h){let e=await rZ({handleRequest:N,token:_});r.push(e),t=await hq(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=hF(t);if(o?.pid&&o.pid!==process.pid&&eN(o.pid,o.processStartTime))return!1;try{a.unlinkSync(t)}catch{}return i()}(c,p,{pid:process.pid,version:I,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,v=n,y={socketPort:w,httpPort:v,token:_,version:I,codeSignature:M,processStartTime:x},a.existsSync(c)||a.mkdirSync(c,{recursive:!0}),a.writeFileSync(f,""),e=y.socketPort&&y.httpPort?"dual":y.httpPort?"http":"socket",a.writeFileSync(u,JSON.stringify({port:y.socketPort,httpPort:y.httpPort,transport:e,token:y.token,pid:process.pid,version:y.version,codeSignature:y.codeSignature,processStartTime:y.processStartTime,stateDir:c},null,2),{mode:384}),a.chmodSync(u,384),w&&s.write(`AGENT_DEVICE_DAEMON_PORT=${w}
|
|
33
33
|
`),v&&s.write(`AGENT_DEVICE_DAEMON_HTTP_PORT=${v}
|
|
34
|
-
`)}catch(t){let e=
|
|
35
|
-
`),C))try{t.close(()=>{})}catch{}return
|
|
36
|
-
`),
|
|
37
|
-
`),
|
|
38
|
-
`),process.exit(1)});export{
|
|
34
|
+
`)}catch(t){let e=eP(t);for(let t of(l.write(`Daemon error: ${e.message}
|
|
35
|
+
`),C))try{t.close(()=>{})}catch{}return h$(u),hU(p),d(1),null}eA();let O=!1,R=async(e={})=>{if(O)return;O=!0,e.cause&&await D(e.cause),await hL(C),await P();let{stopAllIosRunnerSessions:t}=await Promise.resolve(tK);await t(),await Promise.race([eu().catch(()=>{}),eZ(1e3)]),h$(u),hU(p),d(e.exitCode??0)};return!1!==e.registerProcessHandlers&&(process.on("SIGINT",()=>{R()}),process.on("SIGTERM",()=>{R()}),process.on("SIGHUP",()=>{R()}),process.on("uncaughtException",e=>{let t=e instanceof eC?e:eP(e);l.write(`Daemon error: ${t.message}
|
|
36
|
+
`),R({exitCode:1,cause:e})}),process.on("unhandledRejection",e=>{let t=e instanceof Error?e:Error(String(e)),r=t instanceof eC?t:eP(t);l.write(`Daemon error: ${r.message}
|
|
37
|
+
`),R({exitCode:1,cause:t})})),{httpPort:n,shutdown:R,socketPort:t,token:_}})().catch(e=>{let t=eP(e);process.stderr.write(`Daemon error: ${t.message}
|
|
38
|
+
`),process.exit(1)});export{mD as ANDROID_CPU_SAMPLE_DESCRIPTION,mN as ANDROID_CPU_SAMPLE_METHOD,f1 as ANDROID_FRAME_SAMPLE_DESCRIPTION,f0 as ANDROID_FRAME_SAMPLE_METHOD,mC as ANDROID_HPROF_SNAPSHOT_DESCRIPTION,mE as ANDROID_HPROF_SNAPSHOT_METHOD,mP as ANDROID_MEMORY_SAMPLE_DESCRIPTION,mk as ANDROID_MEMORY_SAMPLE_METHOD,fo as APPLE_MEMGRAPH_SNAPSHOT_DESCRIPTION,fa as APPLE_MEMGRAPH_SNAPSHOT_METHOD,p5 as IOS_DEVICECTL_DEFAULT_HINT,dF as IOS_RUNNER_CONTAINER_BUNDLE_IDS,nC as LAUNCH_CONSOLE_DIRECT_APP_ONLY_MESSAGE,nE as LAUNCH_CONSOLE_IOS_SIMULATOR_ONLY_MESSAGE,t4 as SessionStore,sv as annotateScreenshotWithRefs,pR as withAppLogProvider,pK as appendAppLogMarker,mz as applyRuntimeHintsToApp,ff as buildAppleFrameSamplingMetadata,fh as buildAppleMemorySnapshotSupport,fm as buildAppleSamplingMetadata,nU as buildRunnerSequenceCommand,lh as buildSessionRecoveryHint,lP as buildSimctlArgs,lE as buildSimctlArgsForDevice,oy as buildSnapshotState,mT as captureAndroidHeapSnapshot,oC as captureAndroidUiHierarchyXml,fl as captureAppleMemorySnapshot,ol as captureSnapshot,ht as cleanupRetainedMaterializedPaths,rb as cleanupUploadedArtifact,pX as clearAppLogFiles,rc as clearRequestCanceled,mJ as clearRuntimeHintsFromApp,a$ as context_contextFromFlags,uQ as createAgentBrowserWebProvider,ox as createDaemonRuntimeSessionStore,uc as createLocalAppleRunnerProvider,rf as createRequestCanceledError,iL as createScopedProvider,iu as dispatchCommand,rE as emitRequestProgress,o6 as ensureAndroidBlockingSystemDialogReady,hg as ensureDeviceReady,aJ as errorResponse,i$ as filterAppleAppsByBundlePrefix,aO as getActiveAndroidSnapshotFreshness,p$ as getAppLogPathMetadata,rp as getRequestSignal,c2 as getRunnerSessionSnapshot,nv as getSessionCommandKind,hc as getSimulatorState,sL as getSnapshotReferenceFrame,hR as handleCloseCommand,mW as hasRuntimeTransportHints,iX as hasScopedAppleToolProvider,t0 as inferFillText,iT as isCommandSupportedOnDevice,lA as isImplicitSessionScopeConflict,aT as isNavigationSensitiveAction,ru as isRequestCanceled,nl as listDeviceInventory,p1 as listIosDeviceApps,al as runMacOsPressAction,as as runMacOsReadTextAction,aC as markAndroidSnapshotFreshness,aF as markPendingInteractionOutcome,aK as markPostGestureStabilization,rd as markRequestCanceled,nG as parseRunnerSequenceResult,uO as prepareIosRunner,rS as prepareUploadedArtifact,uC as prewarmIosRunnerSession,an as quitMacOsApp,iJ as readApplePlistJson,p6 as readInfoPlistString,rO as readReplayTestActionProgress,pU as readSessionNetworkCapture,sU as recordTouchVisualizationEvent,o4 as recoverAndroidBlockingSystemDialog,hM as refreshSessionDeviceIfNeeded,rl as registerRequestAbort,hA as requireSessionOrExplicitSelector,ho as requireSimulatorDevice,f8 as resetAndroidFramePerfStats,hN as resolveAndroidEmulatorAvdName,uu as resolveAppleRunnerProvider,iH as resolveAppleToolProvider,hx as resolveCommandDevice,ar as resolveFrontmostMacOsApp,lS as resolveImplicitSessionScope,p4 as resolveIosDevicectlHint,lI as resolveLeaseScope,af as resolveLinuxToolProvider,pF as resolveLogBackend,il as resolvePayloadInput,ly as resolvePublicSessionName,rs as resolveRequestTrackingId,dL as resolveRunnerAppBundleId,t8 as resolveSessionRequestLogPath,t6 as resolveSessionRunnerLogPath,oI as resolveSnapshotScope,ni as resolveTargetDevice,he as retainMaterializedPaths,pH as runAppLogDoctor,iW as runAppleToolCommand,p0 as runIosDevicectl,ah as runLinuxToolCommand,aa as runMacOsAlertAction,ai as runMacOsPermissionAction,ad as runMacOsScreenshotAction,ao as runMacOsSnapshotAction,lC as runSimctlForDevice,iz as runXcrun,uE as runIosRunnerCommand,up as withAppleRunnerProvider,c6 as abortAllIosRunnerSessions,c8 as stopAllIosRunnerSessions,mO as sampleAndroidCpuPerf,f6 as sampleAndroidFramePerf,mR as sampleAndroidMemoryPerf,fp as sampleAppleFramePerf,fs as sampleApplePerfMetrics,hD as selectorTargetsSessionDevice,lb as sessionMatchesScope,hI as session_device_utils_hasExplicitSessionFlag,o_ as setSessionSnapshot,h_ as settleIosSimulator,hp as shutdownDeviceTarget,hd as shutdownSimulator,hl as ensureBootedSimulator,oO as snapshotAndroid,aD as snapshotLinux,ak as readLinuxTextAtPoint,my as startAndroidPerfettoTrace,mA as startAndroidSimpleperfProfile,pq as startAppLog,fj as startAppleXctracePerfCapture,mS as stopAndroidPerfettoTrace,mI as stopAndroidSimpleperfProfile,pB as stopAppLog,fV as stopAppleXctracePerfCapture,c4 as stopIosRunnerSession,aq as stripInternalInteractionFlags,iK as withAppleToolProvider,am as withLinuxToolProvider,t1 as uniqueStrings,lf as withKeyedLock,rC as withReplayTestActionProgress,m_ as writeAndroidSimpleperfReport,fH as writeAppleXctracePerfReport};
|