agent-device 0.11.13 → 0.11.15

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/dist/src/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import e from"node:net";import t from"node:http";import r from"node:https";import o from"node:fs";import n from"node:path";import{fileURLToPath as a}from"node:url";import{spawn as i}from"node:child_process";import s from"node:crypto";import{resolveUserPath as l,createRequestId as d,emitDiagnostic as u,withDiagnosticTimer as c,expandUserHomePath as p,AppError as m}from"./957.js";import{stopProcessForTakeover as f,prepareMetroRuntime as h,runCmdSync as I,isAgentDeviceDaemonProcess as v,runCmdDetached as y}from"./974.js";function w(){let e=n.dirname(a(import.meta.url)),t=e;for(let e=0;e<6;e+=1){let e=n.join(t,"package.json");if(o.existsSync(e))return t;t=n.dirname(t)}return e}function g(e){let t,r=(t=(e??"").trim())?l(t):n.join(p("~"),".agent-device");return{baseDir:r,infoPath:n.join(r,"daemon.json"),lockPath:n.join(r,"daemon.lock"),logPath:n.join(r,"daemon.log"),sessionsDir:n.join(r,"sessions")}}async function A(e){let{localPath:a,baseUrl:s,token:l}=e,d=o.statSync(a).isDirectory(),u=n.basename(a),c=new URL("upload",s.endsWith("/")?s:`${s}/`),p="https:"===c.protocol?r:t,f={"x-artifact-type":d?"app-bundle":"file","x-artifact-filename":u,"transfer-encoding":"chunked"};return l&&(f.authorization=`Bearer ${l}`,f["x-agent-device-token"]=l),new Promise((e,t)=>{let r=p.request({protocol:c.protocol,host:c.hostname,port:c.port,method:"POST",path:c.pathname+c.search,headers:f},r=>{let o="";r.setEncoding("utf8"),r.on("data",e=>{o+=e}),r.on("end",()=>{clearTimeout(s);try{let r=JSON.parse(o);if(!r.ok||!r.uploadId)return void t(new m("COMMAND_FAILED",`Upload failed: ${o}`));e(r.uploadId)}catch{t(new m("COMMAND_FAILED",`Invalid upload response: ${o}`))}})}),s=setTimeout(()=>{r.destroy(),t(new m("COMMAND_FAILED","Artifact upload timed out",{timeoutMs:3e5,hint:"The upload to the remote daemon exceeded the 5-minute timeout."}))},3e5);if(r.on("error",e=>{clearTimeout(s),t(new m("COMMAND_FAILED","Failed to upload artifact to remote daemon",{hint:"Verify the remote daemon is reachable and supports artifact uploads."},e))}),d){let e=i("tar",["cf","-","-C",n.dirname(a),n.basename(a)],{stdio:["ignore","pipe","pipe"]});e.stdout.pipe(r),e.on("error",e=>{r.destroy(),t(new m("COMMAND_FAILED","Failed to create tar archive for app bundle",{},e))}),e.on("close",e=>{0!==e&&(r.destroy(),t(new m("COMMAND_FAILED",`tar failed with exit code ${e}`)))})}else{let e=o.createReadStream(a);e.pipe(r),e.on("error",e=>{r.destroy(),t(new m("COMMAND_FAILED","Failed to read local artifact",{},e))})}})}let D=/(?:^|[^\w$.])(?:import|export)\s+(?:type\s+)?(?:[^'"`]*?\s+from\s+)?['"]([^'"]+)['"]/gm,b=/import\(\s*['"]([^'"]+)['"]\s*\)/gm,E=[".ts",".tsx",".js",".jsx",".mjs",".cjs"];function P(e,t,r){t.lastIndex=0;let o=null;for(;null!==(o=t.exec(e));){let e=o[1]?.trim();e?.startsWith(".")&&r.add(e)}}function _(e){try{return o.statSync(e).isFile()?e:null}catch{return null}}let S=es(),T=function(e=process.env.AGENT_DEVICE_DAEMON_STARTUP_TIMEOUT_MS){if(!e)return 15e3;let t=Number(e);return Number.isFinite(t)?Math.max(1e3,Math.floor(t)):15e3}(),M=function(e=process.env.AGENT_DEVICE_DAEMON_STARTUP_ATTEMPTS){if(!e)return 2;let t=Number(e);return Number.isFinite(t)?Math.min(5,Math.max(1,Math.floor(t))):2}(),k=["xcodebuild .*AgentDeviceRunnerUITests/RunnerTests/testCommand","xcodebuild .*AgentDeviceRunner\\.env\\.session-","xcodebuild build-for-testing .*ios-runner/AgentDeviceRunner/AgentDeviceRunner\\.xcodeproj"],N=new e.BlockList;async function U(t){let r=t.meta?.requestId??d(),o=!!(t.meta?.debug||t.flags?.verbose),n=function(t){let r,o,n,a=t.flags?.stateDir??process.env.AGENT_DEVICE_STATE_DIR,i=function(e){let t;if(e){try{t=new URL(e)}catch(t){throw new m("INVALID_ARGS","Invalid daemon base URL",{daemonBaseUrl:e},t instanceof Error?t:void 0)}if("http:"!==t.protocol&&"https:"!==t.protocol)throw new m("INVALID_ARGS","Daemon base URL must use http or https",{daemonBaseUrl:e});return t.toString().replace(/\/+$/,"")}}(t.flags?.daemonBaseUrl??process.env.AGENT_DEVICE_DAEMON_BASE_URL),s=t.flags?.daemonAuthToken??process.env.AGENT_DEVICE_DAEMON_AUTH_TOKEN;var l=i,d=s;if(!(!l||"localhost"===(r=new URL(l).hostname.trim().toLowerCase().replace(/^\[(.*)\]$/,"$1"))||(e.isIPv4(r)?N.check(r,"ipv4"):!!e.isIPv6(r)&&N.check(r,"ipv6")))&&("string"!=typeof d||!(d.trim().length>0)))throw new m("INVALID_ARGS","Remote daemon base URL for non-loopback hosts requires daemon authentication",{daemonBaseUrl:l,hint:"Provide --daemon-auth-token or AGENT_DEVICE_DAEMON_AUTH_TOKEN when using a non-loopback remote daemon URL."});let u=t.flags?.daemonTransport??process.env.AGENT_DEVICE_DAEMON_TRANSPORT,c="auto"===(o=(u??"").trim().toLowerCase())?"auto":"socket"===o?"socket":"http"===o?"http":"auto";if(i&&"socket"===c)throw new m("INVALID_ARGS","Remote daemon base URL only supports HTTP transport. Remove --daemon-transport socket.",{daemonBaseUrl:i});let p="http"===(n=(t.flags?.daemonServerMode??process.env.AGENT_DEVICE_DAEMON_SERVER_MODE??("dual"===u?"dual":void 0)??"").trim().toLowerCase())?"http":"dual"===n?"dual":"socket";return{paths:g(a),transportPreference:c,serverMode:p,remoteBaseUrl:i,remoteAuthToken:s}}(t),a=function(e,t=process.env.AGENT_DEVICE_DAEMON_TIMEOUT_MS){if("test"!==e)return es(t)}(t.command),i=await c("daemon_startup",async()=>await x(n),{requestId:r,session:t.session}),s=await R(t,i),l={...t,positionals:s.positionals,flags:s.flags,token:i.token,meta:{...t.meta??{},requestId:r,debug:o,cwd:t.meta?.cwd,tenantId:t.meta?.tenantId??t.flags?.tenant,runId:t.meta?.runId??t.flags?.runId,leaseId:t.meta?.leaseId??t.flags?.leaseId,sessionIsolation:t.meta?.sessionIsolation??t.flags?.sessionIsolation,lockPolicy:t.meta?.lockPolicy,lockPlatform:t.meta?.lockPlatform,...s.uploadedArtifactId?{uploadedArtifactId:s.uploadedArtifactId}:{},...s.clientArtifactPaths?{clientArtifactPaths:s.clientArtifactPaths}:{},...s.installSource?{installSource:s.installSource}:{}}};return u({level:"info",phase:"daemon_request_prepare",data:{requestId:r,command:t.command,session:t.session}}),await c("daemon_request",async()=>await Q(i,l,n.transportPreference,a),{requestId:r,command:t.command})}async function R(e,t){let r,a=[...e.positionals??[]],i=e.flags?{...e.flags}:void 0,s=e.meta?.installSource,l={};if(eo(t)){let o=function(e,t){if("screenshot"===e.command){let r=O(e,"path",".png");return t[0]?{field:"path",localPath:r,positionalIndex:0,positionalPath:L("screenshot",".png")}:{field:"path",localPath:r,positionalIndex:0,flagPath:L("screenshot",".png")}}if("record"===e.command&&"start"===(t[0]??"").toLowerCase()){let t=O(e,"outPath",".mp4",1);return{field:"outPath",localPath:t,positionalIndex:1,positionalPath:L("recording",n.extname(t)||".mp4")}}return null}(e,a);o&&(void 0!==o.positionalPath&&(a[o.positionalIndex]=o.positionalPath),void 0!==o.flagPath&&((i??={}).out=o.flagPath),l[o.field]=o.localPath);let d=await C(e,t);d&&(s=d.installSource,r=d.uploadedArtifactId??r)}if(!eo(t)||"install"!==e.command&&"reinstall"!==e.command||a.length<2)return{positionals:a,flags:i,installSource:s,uploadedArtifactId:r,...Object.keys(l).length>0?{clientArtifactPaths:l}:{}};let d=a[1];if(d.startsWith("remote:"))return a[1]=d.slice(7),{positionals:a,flags:i,...Object.keys(l).length>0?{clientArtifactPaths:l}:{}};let u=n.isAbsolute(d)?d:n.resolve(e.meta?.cwd??process.cwd(),d);return o.existsSync(u)?{positionals:a,flags:i,installSource:s,uploadedArtifactId:r=await A({localPath:u,baseUrl:t.baseUrl,token:t.token}),...Object.keys(l).length>0?{clientArtifactPaths:l}:{}}:{positionals:a,flags:i,...Object.keys(l).length>0?{clientArtifactPaths:l}:{}}}async function C(e,t){let r=e.meta?.installSource;if("install_source"!==e.command||!r||"path"!==r.kind)return null;let a=r.path.trim();if(!a)return{installSource:r};if(a.startsWith("remote:"))return{installSource:{...r,path:a.slice(7)}};let i=n.isAbsolute(a)?a:n.resolve(e.meta?.cwd??process.cwd(),a);if(!o.existsSync(i))return{installSource:{...r,path:i}};let s=await A({localPath:i,baseUrl:t.baseUrl,token:t.token});return{installSource:{...r,path:i},uploadedArtifactId:s}}function O(e,t,r,o=0){let a=e.positionals?.[o]??e.flags?.out,i=`${"path"===t?"screenshot":"recording"}-${Date.now()}${r}`,s=a&&a.trim().length>0?a:i;return n.isAbsolute(s)?s:n.resolve(e.meta?.cwd??process.cwd(),s)}function L(e,t){let r=t.startsWith(".")?t:`.${t}`;return n.posix.join("/tmp",`agent-device-${e}-${Date.now()}-${Math.random().toString(36).slice(2,8)}${r}`)}async function x(e){let t;if(e.remoteBaseUrl){let t={transport:"http",token:e.remoteAuthToken??"",pid:0,baseUrl:e.remoteBaseUrl};if(await K(t,"http"))return t;throw new m("COMMAND_FAILED","Remote daemon is unavailable",{daemonBaseUrl:e.remoteBaseUrl,hint:"Verify AGENT_DEVICE_DAEMON_BASE_URL points to a reachable daemon with GET /health and POST /rpc."})}let r=B(e.paths.infoPath),a=function(){try{let e=w();return JSON.parse(o.readFileSync(n.join(e,"package.json"),"utf8")).version??"0.0.0"}catch{return"0.0.0"}}(),i=function(e,t=w()){try{let r=n.resolve(t),a=[n.resolve(e)],i=new Set,l=[];for(;a.length>0;){let e=a.pop();if(!e||i.has(e))continue;i.add(e);let t=o.statSync(e);if(!t.isFile())continue;let s=n.relative(r,e)||e;l.push(`${s}:${t.size}:${Math.trunc(t.mtimeMs)}`);let d=o.readFileSync(e,"utf8");for(let t of function(e){let t=new Set;return P(e,D,t),P(e,b,t),[...t]}(d)){let r=function(e,t){let r=n.resolve(n.dirname(e),t),o=_(r);if(o)return o;for(let e of E){let t=_(`${r}${e}`);if(t)return t}for(let e of E){let t=_(n.join(r,`index${e}`));if(t)return t}return null}(e,t);r&&a.push(r)}}let d=l.sort().join("|"),u=s.createHash("sha1").update(d).digest("hex");return`graph:${l.length}:${u}`}catch{return"unknown"}}((t=J()).useSrc?t.srcPath:t.distPath,t.root),l=!!r&&await K(r,e.transportPreference);if(r&&r.version===a&&r.codeSignature===i&&l)return r;r&&(r.version!==a||r.codeSignature!==i||!l)&&(await q(r),H(e.paths.infoPath)),function(e){let t=V(e);if(!t.hasLock||t.hasInfo)return;let r=G(e.lockPath);if(!r)return H(e.lockPath);v(r.pid,r.processStartTime)||H(e.lockPath)}(e.paths);let d=0;for(let t=1;t<=M;t+=1){await W(e);let r=await F(T,e);if(r)return r;if(await j(e.paths)){d+=1;continue}let o=V(e.paths);if(!(t<M))break;if(!o.hasInfo&&!o.hasLock){await $(150);continue}}let u=V(e.paths);throw new m("COMMAND_FAILED","Failed to start daemon",{kind:"daemon_startup_failed",infoPath:e.paths.infoPath,lockPath:e.paths.lockPath,startupTimeoutMs:T,startupAttempts:M,lockRecoveryCount:d,metadataState:u,hint:function(e,t=g(process.env.AGENT_DEVICE_STATE_DIR)){return e.hasLock&&!e.hasInfo?`Detected ${t.lockPath} without ${t.infoPath}. If no agent-device daemon process is running, delete ${t.lockPath} and retry.`:e.hasLock&&e.hasInfo?`Daemon metadata may be stale. If no agent-device daemon process is running, delete ${t.infoPath} and ${t.lockPath}, then retry.`:`Daemon metadata is missing or stale. Delete ${t.infoPath} if present and retry.`}(u,e.paths)})}async function F(e,t){let r=Date.now();for(;Date.now()-r<e;){let e=B(t.paths.infoPath);if(e&&await K(e,t.transportPreference))return e;await new Promise(e=>setTimeout(e,100))}return null}async function $(e){await new Promise(t=>setTimeout(t,e))}async function j(e){let t=V(e);if(!t.hasLock||t.hasInfo)return!1;let r=G(e.lockPath);return r&&v(r.pid,r.processStartTime)&&await f(r.pid,{termTimeoutMs:3e3,killTimeoutMs:1e3,expectedStartTime:r.processStartTime}),H(e.lockPath),!0}async function q(e){await f(e.pid,{termTimeoutMs:3e3,killTimeoutMs:1e3,expectedStartTime:e.processStartTime})}function B(e){let t=z(e);if(!t||"object"!=typeof t)return null;let r="string"==typeof t.token&&t.token.length>0?t.token:null;if(!r)return null;let o=Number.isInteger(t.port)&&Number(t.port)>0,n=Number.isInteger(t.httpPort)&&Number(t.httpPort)>0;if(!o&&!n)return null;let a=t.transport,i="string"==typeof t.version?t.version:void 0,s="string"==typeof t.codeSignature?t.codeSignature:void 0,l="string"==typeof t.processStartTime?t.processStartTime:void 0,d=Number.isInteger(t.pid)&&Number(t.pid)>0;return{token:r,port:o?Number(t.port):void 0,httpPort:n?Number(t.httpPort):void 0,transport:"socket"===a||"http"===a||"dual"===a?a:void 0,pid:d?Number(t.pid):0,version:i,codeSignature:s,processStartTime:l}}function G(e){let t=z(e);return t&&"object"==typeof t&&Number.isInteger(t.pid)&&Number(t.pid)>0?{pid:Number(t.pid),processStartTime:"string"==typeof t.processStartTime?t.processStartTime:void 0,startedAt:"number"==typeof t.startedAt?t.startedAt:void 0}:null}N.addSubnet("127.0.0.0",8,"ipv4"),N.addAddress("::1","ipv6"),N.addSubnet("::ffff:127.0.0.0",104,"ipv6");function V(e){return{hasInfo:o.existsSync(e.infoPath),hasLock:o.existsSync(e.lockPath)}}function z(e){if(!o.existsSync(e))return null;try{return JSON.parse(o.readFileSync(e,"utf8"))}catch{return null}}function H(e){try{o.existsSync(e)&&o.unlinkSync(e)}catch{}}async function K(o,n){var a;return"http"===X(o,n)?await function(e){let o=e.baseUrl?en(e.baseUrl,"health"):e.httpPort?`http://127.0.0.1:${e.httpPort}/health`:null;if(!o)return Promise.resolve(!1);let n=new URL(o),a="https:"===n.protocol?r:t,i=e.baseUrl?3e3:500;return new Promise(e=>{let t=a.request({protocol:n.protocol,host:n.hostname,port:n.port,path:n.pathname+n.search,method:"GET",timeout:i},t=>{t.resume(),e((t.statusCode??500)<500)});t.on("timeout",()=>{t.destroy(),e(!1)}),t.on("error",()=>{e(!1)}),t.end()})}(o):await ((a=o.port)?new Promise(t=>{let r=e.createConnection({host:"127.0.0.1",port:a},()=>{r.destroy(),t(!0)});r.on("error",()=>{t(!1)})}):Promise.resolve(!1))}async function W(e){let t=J(),r=t.useSrc?["--experimental-strip-types",t.srcPath]:[t.distPath],o={...process.env,AGENT_DEVICE_STATE_DIR:e.paths.baseDir,AGENT_DEVICE_DAEMON_SERVER_MODE:e.serverMode};y(process.execPath,r,{env:o})}function J(){let e=w(),t=n.join(e,"dist","src","daemon.js"),r=n.join(e,"src","daemon.ts"),a=o.existsSync(t),i=o.existsSync(r);if(!a&&!i)throw new m("COMMAND_FAILED","Daemon entry not found",{distPath:t,srcPath:r});return{root:e,distPath:t,srcPath:r,useSrc:process.execArgv.includes("--experimental-strip-types")?i:!a&&i}}async function Q(e,t,r,o){return"http"===X(e,r)?await er(e,t,o):await et(e,t,o)}function X(e,t){if(e.baseUrl){if("socket"===t)throw new m("COMMAND_FAILED","Remote daemon endpoint only supports HTTP transport",{daemonBaseUrl:e.baseUrl});return"http"}if("http"===t||"socket"===t){var r=e,o=t;if(Y(r,o))return o;throw new m("COMMAND_FAILED","http"===o?"Daemon HTTP endpoint is unavailable":"Daemon socket endpoint is unavailable")}let n=("socket"===e.transport||"dual"===e.transport?["socket","http"]:["http","socket"]).find(t=>Y(e,t));if(n)return n;throw new m("COMMAND_FAILED","Daemon metadata has no reachable transport")}function Y(e,t){return"http"===t?!!e.httpPort:!!e.port}function Z(e,t,r,o,n,a){let i=n?{terminated:0}:function(){let e=0;try{for(let t of k){let r=I("pkill",["-f",t],{allowFailure:!0});0===r.exitCode&&(e+=1)}return{terminated:e}}catch(t){return{terminated:e,error:t instanceof Error?t.message:String(t)}}}(),s=n?{forcedKill:!1}:function(e,t){let r=!1;try{v(e.pid,e.processStartTime)&&(process.kill(e.pid,"SIGKILL"),r=!0)}catch{f(e.pid,{termTimeoutMs:3e3,killTimeoutMs:1e3,expectedStartTime:e.processStartTime})}finally{H(t.infoPath),H(t.lockPath)}return{forcedKill:r}}(e,t);return u({level:"error",phase:"daemon_request_timeout",data:{timeoutMs:a,requestId:r,command:o,timedOutRunnerPidsTerminated:i.terminated,timedOutRunnerCleanupError:i.error,daemonPidReset:n?void 0:e.pid,daemonPidForceKilled:n?void 0:s.forcedKill,daemonBaseUrl:e.baseUrl}}),new m("COMMAND_FAILED","Daemon request timed out",{timeoutMs:a,requestId:r,hint:n?"Retry with --debug and verify the remote daemon URL, auth token, and remote host logs.":"Retry with --debug and check daemon diagnostics logs. Timed-out iOS runner xcodebuild processes were terminated when detected."})}function ee(e,t,r){return u({level:"error",phase:"daemon_request_socket_error",data:{requestId:t,message:e instanceof Error?e.message:String(e)}}),new m("COMMAND_FAILED","Failed to communicate with daemon",{requestId:t,hint:r?"Retry command. If this persists, verify the remote daemon URL, auth token, and remote host reachability.":"Retry command. If this persists, clean stale daemon metadata and start a fresh session."},e instanceof Error?e:void 0)}async function et(t,r,o){let n=t.port;if(!n)throw new m("COMMAND_FAILED","Daemon socket endpoint is unavailable");return new Promise((a,i)=>{let s=e.createConnection({host:"127.0.0.1",port:n},()=>{s.write(`${JSON.stringify(r)}
2
- `)}),l=g(r.flags?.stateDir??process.env.AGENT_DEVICE_STATE_DIR),d="number"==typeof o?setTimeout(()=>{s.destroy(),i(Z(t,l,r.meta?.requestId,r.command,!1,o))},o):void 0,u="";s.setEncoding("utf8"),s.on("data",e=>{let t=(u+=e).indexOf("\n");if(-1===t)return;let o=u.slice(0,t).trim();if(o)try{let e=JSON.parse(o);s.end(),d&&clearTimeout(d),a(e)}catch(e){d&&clearTimeout(d),i(new m("COMMAND_FAILED","Invalid daemon response",{requestId:r.meta?.requestId,line:o},e instanceof Error?e:void 0))}}),s.on("error",e=>{d&&clearTimeout(d),i(ee(e,r.meta?.requestId,!1))})})}async function er(e,o,n){let a=e.baseUrl?new URL(en(e.baseUrl,"rpc")):e.httpPort?new URL(`http://127.0.0.1:${e.httpPort}/rpc`):null;if(!a)throw new m("COMMAND_FAILED","Daemon HTTP endpoint is unavailable");let i=JSON.stringify({jsonrpc:"2.0",id:o.meta?.requestId??d(),method:"agent_device.command",params:o}),s={"content-type":"application/json","content-length":Buffer.byteLength(i)};return e.baseUrl&&e.token&&(s.authorization=`Bearer ${e.token}`,s["x-agent-device-token"]=e.token),await new Promise((l,d)=>{let u=g(o.flags?.stateDir??process.env.AGENT_DEVICE_STATE_DIR),c=("https:"===a.protocol?r:t).request({protocol:a.protocol,host:a.hostname,port:a.port,method:"POST",path:a.pathname+a.search,headers:s},t=>{let r="";t.setEncoding("utf8"),t.on("data",e=>{r+=e}),t.on("end",()=>{f&&clearTimeout(f);try{let t=JSON.parse(r);if(t.error){let e=t.error.data??{};d(new m(String(e.code??"COMMAND_FAILED"),String(e.message??t.error.message??"Daemon RPC request failed"),{..."object"==typeof e.details&&e.details?e.details:{},hint:"string"==typeof e.hint?e.hint:void 0,diagnosticId:"string"==typeof e.diagnosticId?e.diagnosticId:void 0,logPath:"string"==typeof e.logPath?e.logPath:void 0,requestId:o.meta?.requestId}));return}if(!t.result||"object"!=typeof t.result)return void d(new m("COMMAND_FAILED","Invalid daemon RPC response",{requestId:o.meta?.requestId}));if(e.baseUrl&&t.result.ok)return void ea(e,o,t.result).then(l).catch(d);l(t.result)}catch(e){f&&clearTimeout(f),d(new m("COMMAND_FAILED","Invalid daemon response",{requestId:o.meta?.requestId,line:r},e instanceof Error?e:void 0))}})}),p=eo(e),f="number"==typeof n?setTimeout(()=>{c.destroy(),d(Z(e,u,o.meta?.requestId,o.command,p,n))},n):void 0;c.on("error",e=>{f&&clearTimeout(f),d(ee(e,o.meta?.requestId,p))}),c.write(i),c.end()})}function eo(e){return"string"==typeof e.baseUrl&&e.baseUrl.length>0}function en(e,t){return new URL(t,e.endsWith("/")?e:`${e}/`).toString()}async function ea(e,t,r){let o=Array.isArray(r.data?.artifacts)?r.data.artifacts:[];if(0===o.length||!e.baseUrl)return r;let a=r.data?{...r.data}:{},i=[];for(let r of o){if(!r||"object"!=typeof r||"string"!=typeof r.artifactId){i.push(r);continue}let o=function(e,t){if(e.localPath&&e.localPath.trim().length>0)return e.localPath;let r=e.fileName?.trim()||`${e.field}-${Date.now()}`;return n.resolve(t.meta?.cwd??process.cwd(),r)}(r,t);await ei({baseUrl:e.baseUrl,token:e.token,artifactId:r.artifactId,destinationPath:o,requestId:t.meta?.requestId}),a[r.field]=o,i.push({...r,localPath:o})}return a.artifacts=i,{ok:!0,data:a}}async function ei(e){var a,i;let s,l=new URL((a=e.baseUrl,i=e.artifactId,s=a.endsWith("/")?a:`${a}/`,new URL(`upload/${encodeURIComponent(i)}`,s).toString())),d="https:"===l.protocol?r:t;await o.promises.mkdir(n.dirname(e.destinationPath),{recursive:!0}),await new Promise((t,r)=>{let n=!1,a=e.timeoutMs??S,i=a=>{if(!n){if(n=!0,clearTimeout(u),a)return void o.promises.rm(e.destinationPath,{force:!0}).finally(()=>r(a));t()}},s=d.request({protocol:l.protocol,host:l.hostname,port:l.port,method:"GET",path:l.pathname+l.search,headers:e.token?{authorization:`Bearer ${e.token}`,"x-agent-device-token":e.token}:void 0},t=>{if((t.statusCode??500)>=400){let r="";t.setEncoding("utf8"),t.on("data",e=>{r+=e}),t.on("end",()=>{i(new m("COMMAND_FAILED","Failed to download remote artifact",{artifactId:e.artifactId,statusCode:t.statusCode,requestId:e.requestId,body:r}))});return}let r=o.createWriteStream(e.destinationPath);r.on("error",e=>{i(e instanceof Error?e:Error(String(e)))}),t.on("error",e=>{i(e instanceof Error?e:Error(String(e)))}),t.on("aborted",()=>{i(new m("COMMAND_FAILED","Remote artifact download was interrupted",{artifactId:e.artifactId,requestId:e.requestId}))}),r.on("finish",()=>{r.close(()=>i())}),t.pipe(r)}),u=setTimeout(()=>{s.destroy(new m("COMMAND_FAILED","Remote artifact download timed out",{artifactId:e.artifactId,requestId:e.requestId,timeoutMs:a}))},a);s.on("error",t=>{t instanceof m?i(t):i(new m("COMMAND_FAILED","Failed to download remote artifact",{artifactId:e.artifactId,requestId:e.requestId,timeoutMs:a},t instanceof Error?t:void 0))}),s.end()})}function es(e=process.env.AGENT_DEVICE_DAEMON_TIMEOUT_MS){if(!e)return 9e4;let t=Number(e);return Number.isFinite(t)?Math.max(1e3,Math.floor(t)):9e4}function el(e){let t=e.appId??e.bundleId??e.packageName;return{session:e.session,appId:t,appBundleId:e.bundleId,package:e.packageName}}function ed(e,t,r){return{deviceId:t,deviceName:r,..."android"===e?{serial:t}:"ios"===e?{udid:t}:{}}}function eu(e,t,r,o){let n=r(e[t]);if(void 0===n)throw new m("COMMAND_FAILED",o,{response:e});return n}function ec(e,t){return eu(e,t,ev,`Daemon response is missing "${t}".`)}function ep(e,t){return ev(e[t])}function em(e,t){var r;let o;return r=ev,null===(o=e[t])?null:r(o)}function ef(e,t){return eu(e,t,ew,`Daemon response has invalid "${t}".`)}function eh(e,t){return function(e){return"tv"===e||"mobile"===e||"desktop"===e?e:void 0}(e[t])??"mobile"}function eI(e,t){let r=e[t];if(!eD(r))return;let o="number"==typeof r.x?r.x:void 0,n="number"==typeof r.y?r.y:void 0,a="number"==typeof r.width?r.width:void 0,i="number"==typeof r.height?r.height:void 0;if(void 0!==o&&void 0!==n&&void 0!==a&&void 0!==i)return{x:o,y:n,width:a,height:i}}function ev(e){return"string"==typeof e&&e.length>0?e:void 0}function ey(e){return"number"==typeof e&&Number.isFinite(e)?e:void 0}function ew(e){return"ios"===e||"macos"===e||"android"===e?e:void 0}function eg(e){return"simulator"===e||"emulator"===e||"device"===e?e:void 0}function eA(e){if(!eD(e))throw new m("COMMAND_FAILED","Daemon returned an unexpected response shape.",{value:e});return e}function eD(e){return"object"==typeof e&&null!==e}function eb(e){let t={};for(let[r,o]of Object.entries(e))void 0!==o&&(t[r]=o);return t}function eE(e,t){let r=ep(e,"bundleId"),o=ep(e,"package");return{app:ec(e,"app"),appPath:ec(e,"appPath"),platform:ef(e,"platform"),appId:r??o,bundleId:r,package:o,identifiers:el({session:t,bundleId:r,packageName:o})}}function eP(e){let t=eA(e),r=ef(t,"platform"),o=ec(t,"id"),n=ec(t,"name");return{platform:r,target:eh(t,"target"),kind:eu(t,"kind",eg,'Daemon response has invalid "kind".'),id:o,name:n,booted:"boolean"==typeof t.booted?t.booted:void 0,identifiers:ed(r,o,n),ios:"ios"===r?{udid:o}:void 0,android:"android"===r?{serial:o}:void 0}}function e_(e){let t=eA(e),r=ef(t,"platform"),o=ec(t,"id"),n=ec(t,"name"),a=eh(t,"target"),i=ec(t,"device"),s={session:n,...ed(r,o,i)};return{name:n,createdAt:eu(t,"createdAt",ey,'Daemon response is missing numeric "createdAt".'),device:{platform:r,target:a,id:o,name:i,identifiers:s,ios:"ios"===r?{udid:o,simulatorSetPath:em(t,"ios_simulator_device_set")}:void 0,android:"android"===r?{serial:o}:void 0},identifiers:s}}function eS(e,t){return t??e??"default"}function eT(e={},t={}){let r=t.transport??U,o=async(t,o=[],n={})=>{let a={...e,...n},i=await r({session:eS(e.session,n.session),command:t,positionals:o,flags:eb({stateDir:a.stateDir,daemonBaseUrl:a.daemonBaseUrl,daemonAuthToken:a.daemonAuthToken,daemonTransport:a.daemonTransport,daemonServerMode:a.daemonServerMode,tenant:a.tenant,sessionIsolation:a.sessionIsolation,runId:a.runId,leaseId:a.leaseId,platform:a.platform,target:a.target,device:a.device,udid:a.udid,serial:a.serial,iosSimulatorDeviceSet:a.iosSimulatorDeviceSet,androidDeviceAllowlist:a.androidDeviceAllowlist,runtime:a.simulatorRuntimeId,boot:a.boot,reuseExisting:a.reuseExisting,surface:a.surface,activity:a.activity,relaunch:a.relaunch,shutdown:a.shutdown,saveScript:a.saveScript,noRecord:a.noRecord,metroHost:a.metroHost,metroPort:a.metroPort,bundleUrl:a.bundleUrl,launchUrl:a.launchUrl,snapshotInteractiveOnly:a.interactiveOnly,snapshotCompact:a.compact,snapshotDepth:a.depth,snapshotScope:a.scope,snapshotRaw:a.raw,overlayRefs:a.overlayRefs,verbose:a.debug}),runtime:a.runtime,meta:eb({requestId:a.requestId,cwd:a.cwd,debug:a.debug,lockPolicy:a.lockPolicy,lockPlatform:a.lockPlatform,tenantId:a.tenant,runId:a.runId,leaseId:a.leaseId,sessionIsolation:a.sessionIsolation,installSource:a.installSource,retainMaterializedPaths:a.retainMaterializedPaths,materializedPathRetentionMs:a.materializedPathRetentionMs,materializationId:a.materializationId})});if(!i.ok)throw new m(i.error.code,i.error.message,{...i.error.details??{},hint:i.error.hint,diagnosticId:i.error.diagnosticId,logPath:i.error.logPath});return i.data??{}},n=async(e={})=>{let t=await o("session_list",[],e);return(Array.isArray(t.sessions)?t.sessions:[]).map(e_)};return{devices:{list:async(e={})=>{let t=await o("devices",[],e);return(Array.isArray(t.devices)?t.devices:[]).map(eP)}},sessions:{list:async(e={})=>await n(e),close:async(t={})=>{let r=eS(e.session,t.session),n=(await o("close",[],t)).shutdown;return{session:r,shutdown:"object"==typeof n&&null!==n?n:void 0,identifiers:{session:r}}}},simulators:{ensure:async e=>{let{runtime:t,...r}=e,n=await o("ensure-simulator",[],{...r,simulatorRuntimeId:t}),a=ec(n,"udid"),i=ec(n,"device");return{udid:a,device:i,runtime:ec(n,"runtime"),created:!0===n.created,booted:!0===n.booted,iosSimulatorDeviceSet:em(n,"ios_simulator_device_set"),identifiers:{deviceId:a,deviceName:i,udid:a}}}},apps:{install:async t=>eE(await o("install",[t.app,t.appPath],t),eS(e.session,t.session)),reinstall:async t=>eE(await o("reinstall",[t.app,t.appPath],t),eS(e.session,t.session)),installFromSource:async t=>(function(e,t){let r=ep(e,"bundleId"),o=ep(e,"packageName"),n=r??o??ep(e,"appId"),a=ep(e,"launchTarget")??o??r??n;if(!a)throw new m("COMMAND_FAILED",'Daemon response is missing "launchTarget".',{response:e});return{appName:ep(e,"appName"),appId:n,bundleId:r,packageName:o,launchTarget:a,installablePath:ep(e,"installablePath"),archivePath:ep(e,"archivePath"),materializationId:ep(e,"materializationId"),materializationExpiresAt:ep(e,"materializationExpiresAt"),identifiers:el({session:t,bundleId:r,packageName:o,appId:n})}})(await o("install_source",[],{...t,installSource:t.source,retainMaterializedPaths:t.retainPaths,materializedPathRetentionMs:t.retentionMs}),eS(e.session,t.session)),open:async t=>{let r=eS(e.session,t.session),n=t.url?[t.app,t.url]:[t.app],a=await o("open",n,t),i=function(e){let t=e.platform,r=ep(e,"id"),o=ep(e,"device");if("ios"!==t&&"macos"!==t&&"android"!==t||!r||!o)return;let n=eh(e,"target"),a=ed(t,r,o);return{platform:t,target:n,id:r,name:o,identifiers:a,ios:"ios"===t?{udid:ep(e,"device_udid")??r,simulatorSetPath:em(e,"ios_simulator_device_set")}:void 0,android:"android"===t?{serial:ep(e,"serial")??r}:void 0}}(a),s=ep(a,"appBundleId");return{session:r,appName:ep(a,"appName"),appBundleId:s,appId:s,startup:function(e){if(eD(e)&&"number"==typeof e.durationMs&&"string"==typeof e.measuredAt&&"string"==typeof e.method)return{durationMs:e.durationMs,measuredAt:e.measuredAt,method:e.method,appTarget:ep(e,"appTarget"),appBundleId:ep(e,"appBundleId")}}(a.startup),runtime:function(e){if(!eD(e))return;let t=e.platform,r=ep(e,"metroHost"),o="number"==typeof e.metroPort?e.metroPort:void 0;return{platform:"ios"===t||"android"===t?t:void 0,metroHost:r,metroPort:o,bundleUrl:ep(e,"bundleUrl"),launchUrl:ep(e,"launchUrl")}}(a.runtime),device:i,identifiers:{session:r,deviceId:i?.id,deviceName:i?.name,udid:i?.ios?.udid,serial:i?.android?.serial,appId:s,appBundleId:s}}},close:async(t={})=>{let r=eS(e.session,t.session),n=(await o("close",t.app?[t.app]:[],t)).shutdown;return{session:r,closedApp:t.app,shutdown:"object"==typeof n&&null!==n?n:void 0,identifiers:{session:r}}}},materializations:{release:async e=>{var t;return{released:!0===(t=await o("release_materialized_paths",[],{...e,materializationId:e.materializationId})).released,materializationId:ec(t,"materializationId"),identifiers:{}}}},metro:{prepare:async t=>await h({projectRoot:t.projectRoot??e.cwd,kind:t.kind,publicBaseUrl:t.publicBaseUrl,proxyBaseUrl:t.proxyBaseUrl,proxyBearerToken:t.bearerToken,launchUrl:t.launchUrl,companionProfileKey:t.companionProfileKey,companionConsumerKey:t.companionConsumerKey,metroPort:t.port,listenHost:t.listenHost,statusHost:t.statusHost,startupTimeoutMs:t.startupTimeoutMs,probeTimeoutMs:t.probeTimeoutMs,reuseExisting:t.reuseExisting,installDependenciesIfNeeded:t.installDependenciesIfNeeded,runtimeFilePath:t.runtimeFilePath,logPath:t.logPath})},capture:{snapshot:async(t={})=>{var r;let n=eS(e.session,t.session),a=await o("snapshot",[],t),i=ep(a,"appBundleId"),s="object"==typeof a.visibility&&null!==a.visibility?a.visibility:void 0;return{nodes:Array.isArray(r=a.nodes)?r:[],truncated:!0===a.truncated,appName:ep(a,"appName"),appBundleId:i,...s?{visibility:s}:{},warnings:Array.isArray(a.warnings)?a.warnings.filter(e=>"string"==typeof e):void 0,identifiers:{session:n,appId:i,appBundleId:i}}},screenshot:async(t={})=>{let r=eS(e.session,t.session),n=await o("screenshot",t.path?[t.path]:[],t);return{path:ec(n,"path"),overlayRefs:function(e){let t=e.overlayRefs;if(!Array.isArray(t))return;let r=[];for(let e of t){if(!eD(e))continue;let t=ep(e,"ref"),o=eI(e,"rect"),n=eI(e,"overlayRect"),a=function(e,t){let r=e[t];if(!eD(r))return;let o="number"==typeof r.x?r.x:void 0,n="number"==typeof r.y?r.y:void 0;if(void 0!==o&&void 0!==n)return{x:o,y:n}}(e,"center");t&&o&&n&&a&&r.push({ref:t,label:ep(e,"label"),rect:o,overlayRect:n,center:a})}return r}(n),identifiers:{session:r}}}}}}export{AppError}from"./957.js";export{eT as createAgentDeviceClient};
1
+ import e from"node:net";import t from"node:http";import r from"node:https";import a from"node:fs";import n from"node:path";import{fileURLToPath as o}from"node:url";import{spawn as i}from"node:child_process";import s,{createHash as l}from"node:crypto";import{resolveUserPath as c,createRequestId as d,emitDiagnostic as u,withDiagnosticTimer as p,expandUserHomePath as m,AppError as f}from"./957.js";import{stopProcessForTakeover as h,prepareMetroRuntime as w,runCmdSync as y,isAgentDeviceDaemonProcess as v,runCmdDetached as I}from"./974.js";import{REMOTE_CONFIG_FIELD_SPECS as g,resolveRemoteConfigProfile as A,REMOTE_OPEN_PROFILE_KEYS as b}from"./924.js";function S(){let e=n.dirname(o(import.meta.url)),t=e;for(let e=0;e<6;e+=1){let e=n.join(t,"package.json");if(a.existsSync(e))return t;t=n.dirname(t)}return e}function D(e){let t,r=(t=(e??"").trim())?c(t):n.join(m("~"),".agent-device");return{baseDir:r,infoPath:n.join(r,"daemon.json"),lockPath:n.join(r,"daemon.lock"),logPath:n.join(r,"daemon.log"),sessionsDir:n.join(r,"sessions")}}let _="sha256";async function M(e){let{localPath:o,baseUrl:s,token:l}=e,c=a.statSync(o),d=c.isDirectory(),u=n.basename(o),p=d?"app-bundle":"file",m=s.endsWith("/")?s:`${s}/`,h=d?void 0:await E(o);if(h){let e=await k({normalizedBase:m,token:l,hash:h,filename:u,sizeBytes:c.size,artifactType:p});if(e)return e}let w=new URL("upload",m),y="https:"===w.protocol?r:t,v={"x-artifact-type":p,"x-artifact-filename":u,"transfer-encoding":"chunked"};return h&&(v["x-artifact-hash"]=h,v["x-artifact-hash-algorithm"]=_),l&&(v.authorization=`Bearer ${l}`,v["x-agent-device-token"]=l),new Promise((e,t)=>{let r=y.request({protocol:w.protocol,host:w.hostname,port:w.port,method:"POST",path:w.pathname+w.search,headers:v},r=>{let a="";r.setEncoding("utf8"),r.on("data",e=>{a+=e}),r.on("end",()=>{clearTimeout(s);try{let r=JSON.parse(a);if(!r.ok||!r.uploadId)return void t(new f("COMMAND_FAILED",`Upload failed: ${a}`));e(r.uploadId)}catch{t(new f("COMMAND_FAILED",`Invalid upload response: ${a}`))}})}),s=setTimeout(()=>{r.destroy(),t(new f("COMMAND_FAILED","Artifact upload timed out",{timeoutMs:3e5,hint:"The upload to the remote daemon exceeded the 5-minute timeout."}))},3e5);if(r.on("error",e=>{clearTimeout(s),t(new f("COMMAND_FAILED","Failed to upload artifact to remote daemon",{hint:"Verify the remote daemon is reachable and supports artifact uploads."},e))}),d){let e=i("tar",["cf","-","-C",n.dirname(o),n.basename(o)],{stdio:["ignore","pipe","pipe"]});e.stdout.pipe(r),e.on("error",e=>{r.destroy(),t(new f("COMMAND_FAILED","Failed to create tar archive for app bundle",{},e))}),e.on("close",e=>{0!==e&&(r.destroy(),t(new f("COMMAND_FAILED",`tar failed with exit code ${e}`)))})}else{let e=a.createReadStream(o);e.pipe(r),e.on("error",e=>{r.destroy(),t(new f("COMMAND_FAILED","Failed to read local artifact",{},e))})}})}async function k(e){var t;let r=new URL("upload/preflight",e.normalizedBase),a={"content-type":"application/json"};e.token&&(a.authorization=`Bearer ${e.token}`,a["x-agent-device-token"]=e.token);let n=await fetch(r,{method:"POST",headers:a,signal:AbortSignal.timeout(3e4),body:JSON.stringify({hash:e.hash,hashAlgorithm:_,fileName:e.filename,sizeBytes:e.sizeBytes,artifactType:e.artifactType})}).catch(()=>void 0);if(!n?.ok)return;let o=await n.json().catch(()=>void 0);return(t=o)&&"object"==typeof t&&!0===t.ok&&!0===t.cacheHit&&"string"==typeof t.uploadId?o.uploadId:void 0}async function E(e){let t=l(_);return await new Promise((r,n)=>{a.createReadStream(e).on("data",e=>t.update(e)).on("error",e=>{n(new f("COMMAND_FAILED","Failed to read local artifact",{},e))}).on("end",r)}),t.digest("hex")}let P=/(?:^|[^\w$.])(?:import|export)\s+(?:type\s+)?(?:[^'"`]*?\s+from\s+)?['"]([^'"]+)['"]/gm,N=/import\(\s*['"]([^'"]+)['"]\s*\)/gm,T=[".ts",".tsx",".js",".jsx",".mjs",".cjs"];function x(e,t,r){t.lastIndex=0;let a=null;for(;null!==(a=t.exec(e));){let e=a[1]?.trim();e?.startsWith(".")&&r.add(e)}}function R(e){try{return a.statSync(e).isFile()?e:null}catch{return null}}let C=ef(),U=function(e=process.env.AGENT_DEVICE_DAEMON_STARTUP_TIMEOUT_MS){if(!e)return 15e3;let t=Number(e);return Number.isFinite(t)?Math.max(1e3,Math.floor(t)):15e3}(),L=function(e=process.env.AGENT_DEVICE_DAEMON_STARTUP_ATTEMPTS){if(!e)return 2;let t=Number(e);return Number.isFinite(t)?Math.min(5,Math.max(1,Math.floor(t))):2}(),O=["xcodebuild .*AgentDeviceRunnerUITests/RunnerTests/testCommand","xcodebuild .*AgentDeviceRunner\\.env\\.session-","xcodebuild build-for-testing .*ios-runner/AgentDeviceRunner/AgentDeviceRunner\\.xcodeproj"],F=new e.BlockList;async function $(t){let r=t.meta?.requestId??d(),a=!!(t.meta?.debug||t.flags?.verbose),n=function(t){let r,a,n,o=t.flags?.stateDir??process.env.AGENT_DEVICE_STATE_DIR,i=function(e){let t;if(e){try{t=new URL(e)}catch(t){throw new f("INVALID_ARGS","Invalid daemon base URL",{daemonBaseUrl:e},t instanceof Error?t:void 0)}if("http:"!==t.protocol&&"https:"!==t.protocol)throw new f("INVALID_ARGS","Daemon base URL must use http or https",{daemonBaseUrl:e});return t.toString().replace(/\/+$/,"")}}(t.flags?.daemonBaseUrl??process.env.AGENT_DEVICE_DAEMON_BASE_URL),s=t.flags?.daemonAuthToken??process.env.AGENT_DEVICE_DAEMON_AUTH_TOKEN;var l=i,c=s;if(!(!l||"localhost"===(r=new URL(l).hostname.trim().toLowerCase().replace(/^\[(.*)\]$/,"$1"))||(e.isIPv4(r)?F.check(r,"ipv4"):!!e.isIPv6(r)&&F.check(r,"ipv6")))&&("string"!=typeof c||!(c.trim().length>0)))throw new f("INVALID_ARGS","Remote daemon base URL for non-loopback hosts requires daemon authentication",{daemonBaseUrl:l,hint:"Provide --daemon-auth-token or AGENT_DEVICE_DAEMON_AUTH_TOKEN when using a non-loopback remote daemon URL."});let d=t.flags?.daemonTransport??process.env.AGENT_DEVICE_DAEMON_TRANSPORT,u="auto"===(a=(d??"").trim().toLowerCase())?"auto":"socket"===a?"socket":"http"===a?"http":"auto";if(i&&"socket"===u)throw new f("INVALID_ARGS","Remote daemon base URL only supports HTTP transport. Remove --daemon-transport socket.",{daemonBaseUrl:i});let p="http"===(n=(t.flags?.daemonServerMode??process.env.AGENT_DEVICE_DAEMON_SERVER_MODE??("dual"===d?"dual":void 0)??"").trim().toLowerCase())?"http":"dual"===n?"dual":"socket";return{paths:D(o),transportPreference:u,serverMode:p,remoteBaseUrl:i,remoteAuthToken:s}}(t),o=function(e,t=process.env.AGENT_DEVICE_DAEMON_TIMEOUT_MS){if("test"!==e)return ef(t)}(t.command),i=await p("daemon_startup",async()=>await G(n),{requestId:r,session:t.session}),s=await j(t,i),l={...t,positionals:s.positionals,flags:s.flags,token:i.token,meta:{...t.meta??{},requestId:r,debug:a,cwd:t.meta?.cwd,tenantId:t.meta?.tenantId??t.flags?.tenant,runId:t.meta?.runId??t.flags?.runId,leaseId:t.meta?.leaseId??t.flags?.leaseId,sessionIsolation:t.meta?.sessionIsolation??t.flags?.sessionIsolation,lockPolicy:t.meta?.lockPolicy,lockPlatform:t.meta?.lockPlatform,...s.uploadedArtifactId?{uploadedArtifactId:s.uploadedArtifactId}:{},...s.clientArtifactPaths?{clientArtifactPaths:s.clientArtifactPaths}:{},...s.installSource?{installSource:s.installSource}:{}}};return u({level:"info",phase:"daemon_request_prepare",data:{requestId:r,command:t.command,session:t.session}}),await p("daemon_request",async()=>await ea(i,l,n.transportPreference,o),{requestId:r,command:t.command})}async function j(e,t){let r,o=[...e.positionals??[]],i=e.flags?{...e.flags}:void 0,s=e.meta?.installSource,l={};if(ed(t)){let a=function(e,t){if("screenshot"===e.command){let r=B(e,"path",".png");return t[0]?{field:"path",localPath:r,positionalIndex:0,positionalPath:V("screenshot",".png")}:{field:"path",localPath:r,positionalIndex:0,flagPath:V("screenshot",".png")}}if("record"===e.command&&"start"===(t[0]??"").toLowerCase()){let t=B(e,"outPath",".mp4",1);return{field:"outPath",localPath:t,positionalIndex:1,positionalPath:V("recording",n.extname(t)||".mp4")}}return null}(e,o);a&&(void 0!==a.positionalPath&&(o[a.positionalIndex]=a.positionalPath),void 0!==a.flagPath&&((i??={}).out=a.flagPath),l[a.field]=a.localPath);let c=await q(e,t);c&&(s=c.installSource,r=c.uploadedArtifactId??r)}if(!ed(t)||"install"!==e.command&&"reinstall"!==e.command||o.length<2)return{positionals:o,flags:i,installSource:s,uploadedArtifactId:r,...Object.keys(l).length>0?{clientArtifactPaths:l}:{}};let c=o[1];if(c.startsWith("remote:"))return o[1]=c.slice(7),{positionals:o,flags:i,...Object.keys(l).length>0?{clientArtifactPaths:l}:{}};let d=n.isAbsolute(c)?c:n.resolve(e.meta?.cwd??process.cwd(),c);return a.existsSync(d)?{positionals:o,flags:i,installSource:s,uploadedArtifactId:r=await M({localPath:d,baseUrl:t.baseUrl,token:t.token}),...Object.keys(l).length>0?{clientArtifactPaths:l}:{}}:{positionals:o,flags:i,...Object.keys(l).length>0?{clientArtifactPaths:l}:{}}}async function q(e,t){let r=e.meta?.installSource;if("install_source"!==e.command||!r||"path"!==r.kind)return null;let o=r.path.trim();if(!o)return{installSource:r};if(o.startsWith("remote:"))return{installSource:{...r,path:o.slice(7)}};let i=n.isAbsolute(o)?o:n.resolve(e.meta?.cwd??process.cwd(),o);if(!a.existsSync(i))return{installSource:{...r,path:i}};let s=await M({localPath:i,baseUrl:t.baseUrl,token:t.token});return{installSource:{...r,path:i},uploadedArtifactId:s}}function B(e,t,r,a=0){let o=e.positionals?.[a]??e.flags?.out,i=`${"path"===t?"screenshot":"recording"}-${Date.now()}${r}`,s=o&&o.trim().length>0?o:i;return n.isAbsolute(s)?s:n.resolve(e.meta?.cwd??process.cwd(),s)}function V(e,t){let r=t.startsWith(".")?t:`.${t}`;return n.posix.join("/tmp",`agent-device-${e}-${Date.now()}-${Math.random().toString(36).slice(2,8)}${r}`)}async function G(e){let t;if(e.remoteBaseUrl){let t={transport:"http",token:e.remoteAuthToken??"",pid:0,baseUrl:e.remoteBaseUrl};if(await ee(t,"http"))return t;throw new f("COMMAND_FAILED","Remote daemon is unavailable",{daemonBaseUrl:e.remoteBaseUrl,hint:"Verify AGENT_DEVICE_DAEMON_BASE_URL points to a reachable daemon with GET /health and POST /rpc."})}let r=W(e.paths.infoPath),o=function(){try{let e=S();return JSON.parse(a.readFileSync(n.join(e,"package.json"),"utf8")).version??"0.0.0"}catch{return"0.0.0"}}(),i=function(e,t=S()){try{let r=n.resolve(t),o=[n.resolve(e)],i=new Set,l=[];for(;o.length>0;){let e=o.pop();if(!e||i.has(e))continue;i.add(e);let t=a.statSync(e);if(!t.isFile())continue;let s=n.relative(r,e)||e;l.push(`${s}:${t.size}:${Math.trunc(t.mtimeMs)}`);let c=a.readFileSync(e,"utf8");for(let t of function(e){let t=new Set;return x(e,P,t),x(e,N,t),[...t]}(c)){let r=function(e,t){let r=n.resolve(n.dirname(e),t),a=R(r);if(a)return a;for(let e of T){let t=R(`${r}${e}`);if(t)return t}for(let e of T){let t=R(n.join(r,`index${e}`));if(t)return t}return null}(e,t);r&&o.push(r)}}let c=l.sort().join("|"),d=s.createHash("sha1").update(c).digest("hex");return`graph:${l.length}:${d}`}catch{return"unknown"}}((t=er()).useSrc?t.srcPath:t.distPath,t.root),l=!!r&&await ee(r,e.transportPreference);if(r&&r.version===o&&r.codeSignature===i&&l)return r;r&&(r.version!==o||r.codeSignature!==i||!l)&&(await J(r),Z(e.paths.infoPath)),function(e){let t=X(e);if(!t.hasLock||t.hasInfo)return;let r=Q(e.lockPath);if(!r)return Z(e.lockPath);v(r.pid,r.processStartTime)||Z(e.lockPath)}(e.paths);let c=0;for(let t=1;t<=L;t+=1){await et(e);let r=await z(U,e);if(r)return r;if(await K(e.paths)){c+=1;continue}let a=X(e.paths);if(!(t<L))break;if(!a.hasInfo&&!a.hasLock){await H(150);continue}}let d=X(e.paths);throw new f("COMMAND_FAILED","Failed to start daemon",{kind:"daemon_startup_failed",infoPath:e.paths.infoPath,lockPath:e.paths.lockPath,startupTimeoutMs:U,startupAttempts:L,lockRecoveryCount:c,metadataState:d,hint:function(e,t=D(process.env.AGENT_DEVICE_STATE_DIR)){return e.hasLock&&!e.hasInfo?`Detected ${t.lockPath} without ${t.infoPath}. If no agent-device daemon process is running, delete ${t.lockPath} and retry.`:e.hasLock&&e.hasInfo?`Daemon metadata may be stale. If no agent-device daemon process is running, delete ${t.infoPath} and ${t.lockPath}, then retry.`:`Daemon metadata is missing or stale. Delete ${t.infoPath} if present and retry.`}(d,e.paths)})}async function z(e,t){let r=Date.now();for(;Date.now()-r<e;){let e=W(t.paths.infoPath);if(e&&await ee(e,t.transportPreference))return e;await new Promise(e=>setTimeout(e,100))}return null}async function H(e){await new Promise(t=>setTimeout(t,e))}async function K(e){let t=X(e);if(!t.hasLock||t.hasInfo)return!1;let r=Q(e.lockPath);return r&&v(r.pid,r.processStartTime)&&await h(r.pid,{termTimeoutMs:3e3,killTimeoutMs:1e3,expectedStartTime:r.processStartTime}),Z(e.lockPath),!0}async function J(e){await h(e.pid,{termTimeoutMs:3e3,killTimeoutMs:1e3,expectedStartTime:e.processStartTime})}function W(e){let t=Y(e);if(!t||"object"!=typeof t)return null;let r="string"==typeof t.token&&t.token.length>0?t.token:null;if(!r)return null;let a=Number.isInteger(t.port)&&Number(t.port)>0,n=Number.isInteger(t.httpPort)&&Number(t.httpPort)>0;if(!a&&!n)return null;let o=t.transport,i="string"==typeof t.version?t.version:void 0,s="string"==typeof t.codeSignature?t.codeSignature:void 0,l="string"==typeof t.processStartTime?t.processStartTime:void 0,c=Number.isInteger(t.pid)&&Number(t.pid)>0;return{token:r,port:a?Number(t.port):void 0,httpPort:n?Number(t.httpPort):void 0,transport:"socket"===o||"http"===o||"dual"===o?o:void 0,pid:c?Number(t.pid):0,version:i,codeSignature:s,processStartTime:l}}function Q(e){let t=Y(e);return t&&"object"==typeof t&&Number.isInteger(t.pid)&&Number(t.pid)>0?{pid:Number(t.pid),processStartTime:"string"==typeof t.processStartTime?t.processStartTime:void 0,startedAt:"number"==typeof t.startedAt?t.startedAt:void 0}:null}F.addSubnet("127.0.0.0",8,"ipv4"),F.addAddress("::1","ipv6"),F.addSubnet("::ffff:127.0.0.0",104,"ipv6");function X(e){return{hasInfo:a.existsSync(e.infoPath),hasLock:a.existsSync(e.lockPath)}}function Y(e){if(!a.existsSync(e))return null;try{return JSON.parse(a.readFileSync(e,"utf8"))}catch{return null}}function Z(e){try{a.existsSync(e)&&a.unlinkSync(e)}catch{}}async function ee(a,n){var o;return"http"===en(a,n)?await function(e){let a=e.baseUrl?eu(e.baseUrl,"health"):e.httpPort?`http://127.0.0.1:${e.httpPort}/health`:null;if(!a)return Promise.resolve(!1);let n=new URL(a),o="https:"===n.protocol?r:t,i=e.baseUrl?3e3:500;return new Promise(e=>{let t=o.request({protocol:n.protocol,host:n.hostname,port:n.port,path:n.pathname+n.search,method:"GET",timeout:i},t=>{t.resume(),e((t.statusCode??500)<500)});t.on("timeout",()=>{t.destroy(),e(!1)}),t.on("error",()=>{e(!1)}),t.end()})}(a):await ((o=a.port)?new Promise(t=>{let r=e.createConnection({host:"127.0.0.1",port:o},()=>{r.destroy(),t(!0)});r.on("error",()=>{t(!1)})}):Promise.resolve(!1))}async function et(e){let t=er(),r=t.useSrc?["--experimental-strip-types",t.srcPath]:[t.distPath],a={...process.env,AGENT_DEVICE_STATE_DIR:e.paths.baseDir,AGENT_DEVICE_DAEMON_SERVER_MODE:e.serverMode};I(process.execPath,r,{env:a})}function er(){let e=S(),t=n.join(e,"dist","src","daemon.js"),r=n.join(e,"src","daemon.ts"),o=a.existsSync(t),i=a.existsSync(r);if(!o&&!i)throw new f("COMMAND_FAILED","Daemon entry not found",{distPath:t,srcPath:r});return{root:e,distPath:t,srcPath:r,useSrc:process.execArgv.includes("--experimental-strip-types")?i:!o&&i}}async function ea(e,t,r,a){return"http"===en(e,r)?await ec(e,t,a):await el(e,t,a)}function en(e,t){if(e.baseUrl){if("socket"===t)throw new f("COMMAND_FAILED","Remote daemon endpoint only supports HTTP transport",{daemonBaseUrl:e.baseUrl});return"http"}if("http"===t||"socket"===t){var r=e,a=t;if(eo(r,a))return a;throw new f("COMMAND_FAILED","http"===a?"Daemon HTTP endpoint is unavailable":"Daemon socket endpoint is unavailable")}let n=("socket"===e.transport||"dual"===e.transport?["socket","http"]:["http","socket"]).find(t=>eo(e,t));if(n)return n;throw new f("COMMAND_FAILED","Daemon metadata has no reachable transport")}function eo(e,t){return"http"===t?!!e.httpPort:!!e.port}function ei(e,t,r,a,n,o){let i=n?{terminated:0}:function(){let e=0;try{for(let t of O){let r=y("pkill",["-f",t],{allowFailure:!0});0===r.exitCode&&(e+=1)}return{terminated:e}}catch(t){return{terminated:e,error:t instanceof Error?t.message:String(t)}}}(),s=n?{forcedKill:!1}:function(e,t){let r=!1;try{v(e.pid,e.processStartTime)&&(process.kill(e.pid,"SIGKILL"),r=!0)}catch{h(e.pid,{termTimeoutMs:3e3,killTimeoutMs:1e3,expectedStartTime:e.processStartTime})}finally{Z(t.infoPath),Z(t.lockPath)}return{forcedKill:r}}(e,t);return u({level:"error",phase:"daemon_request_timeout",data:{timeoutMs:o,requestId:r,command:a,timedOutRunnerPidsTerminated:i.terminated,timedOutRunnerCleanupError:i.error,daemonPidReset:n?void 0:e.pid,daemonPidForceKilled:n?void 0:s.forcedKill,daemonBaseUrl:e.baseUrl}}),new f("COMMAND_FAILED","Daemon request timed out",{timeoutMs:o,requestId:r,hint:n?"Retry with --debug and verify the remote daemon URL, auth token, and remote host logs.":"Retry with --debug and check daemon diagnostics logs. Timed-out iOS runner xcodebuild processes were terminated when detected."})}function es(e,t,r){return u({level:"error",phase:"daemon_request_socket_error",data:{requestId:t,message:e instanceof Error?e.message:String(e)}}),new f("COMMAND_FAILED","Failed to communicate with daemon",{requestId:t,hint:r?"Retry command. If this persists, verify the remote daemon URL, auth token, and remote host reachability.":"Retry command. If this persists, clean stale daemon metadata and start a fresh session."},e instanceof Error?e:void 0)}async function el(t,r,a){let n=t.port;if(!n)throw new f("COMMAND_FAILED","Daemon socket endpoint is unavailable");return new Promise((o,i)=>{let s=e.createConnection({host:"127.0.0.1",port:n},()=>{s.write(`${JSON.stringify(r)}
2
+ `)}),l=D(r.flags?.stateDir??process.env.AGENT_DEVICE_STATE_DIR),c="number"==typeof a?setTimeout(()=>{s.destroy(),i(ei(t,l,r.meta?.requestId,r.command,!1,a))},a):void 0,d="";s.setEncoding("utf8"),s.on("data",e=>{let t=(d+=e).indexOf("\n");if(-1===t)return;let a=d.slice(0,t).trim();if(a)try{let e=JSON.parse(a);s.end(),c&&clearTimeout(c),o(e)}catch(e){c&&clearTimeout(c),i(new f("COMMAND_FAILED","Invalid daemon response",{requestId:r.meta?.requestId,line:a},e instanceof Error?e:void 0))}}),s.on("error",e=>{c&&clearTimeout(c),i(es(e,r.meta?.requestId,!1))})})}async function ec(e,a,n){let o=e.baseUrl?new URL(eu(e.baseUrl,"rpc")):e.httpPort?new URL(`http://127.0.0.1:${e.httpPort}/rpc`):null;if(!o)throw new f("COMMAND_FAILED","Daemon HTTP endpoint is unavailable");let i=JSON.stringify({jsonrpc:"2.0",id:a.meta?.requestId??d(),method:"agent_device.command",params:a}),s={"content-type":"application/json","content-length":Buffer.byteLength(i)};return e.baseUrl&&e.token&&(s.authorization=`Bearer ${e.token}`,s["x-agent-device-token"]=e.token),await new Promise((l,c)=>{let d=D(a.flags?.stateDir??process.env.AGENT_DEVICE_STATE_DIR),u=("https:"===o.protocol?r:t).request({protocol:o.protocol,host:o.hostname,port:o.port,method:"POST",path:o.pathname+o.search,headers:s},t=>{let r="";t.setEncoding("utf8"),t.on("data",e=>{r+=e}),t.on("end",()=>{m&&clearTimeout(m);try{let t=JSON.parse(r);if(t.error){let e=t.error.data??{};c(new f(String(e.code??"COMMAND_FAILED"),String(e.message??t.error.message??"Daemon RPC request failed"),{..."object"==typeof e.details&&e.details?e.details:{},hint:"string"==typeof e.hint?e.hint:void 0,diagnosticId:"string"==typeof e.diagnosticId?e.diagnosticId:void 0,logPath:"string"==typeof e.logPath?e.logPath:void 0,requestId:a.meta?.requestId}));return}if(!t.result||"object"!=typeof t.result)return void c(new f("COMMAND_FAILED","Invalid daemon RPC response",{requestId:a.meta?.requestId}));if(e.baseUrl&&t.result.ok)return void ep(e,a,t.result).then(l).catch(c);l(t.result)}catch(e){m&&clearTimeout(m),c(new f("COMMAND_FAILED","Invalid daemon response",{requestId:a.meta?.requestId,line:r},e instanceof Error?e:void 0))}})}),p=ed(e),m="number"==typeof n?setTimeout(()=>{u.destroy(),c(ei(e,d,a.meta?.requestId,a.command,p,n))},n):void 0;u.on("error",e=>{m&&clearTimeout(m),c(es(e,a.meta?.requestId,p))}),u.write(i),u.end()})}function ed(e){return"string"==typeof e.baseUrl&&e.baseUrl.length>0}function eu(e,t){return new URL(t,e.endsWith("/")?e:`${e}/`).toString()}async function ep(e,t,r){let a=Array.isArray(r.data?.artifacts)?r.data.artifacts:[];if(0===a.length||!e.baseUrl)return r;let o=r.data?{...r.data}:{},i=[];for(let r of a){if(!r||"object"!=typeof r||"string"!=typeof r.artifactId){i.push(r);continue}let a=function(e,t){if(e.localPath&&e.localPath.trim().length>0)return e.localPath;let r=e.fileName?.trim()||`${e.field}-${Date.now()}`;return n.resolve(t.meta?.cwd??process.cwd(),r)}(r,t);await em({baseUrl:e.baseUrl,token:e.token,artifactId:r.artifactId,destinationPath:a,requestId:t.meta?.requestId}),o[r.field]=a,i.push({...r,localPath:a})}return o.artifacts=i,{ok:!0,data:o}}async function em(e){var o,i;let s,l=new URL((o=e.baseUrl,i=e.artifactId,s=o.endsWith("/")?o:`${o}/`,new URL(`upload/${encodeURIComponent(i)}`,s).toString())),c="https:"===l.protocol?r:t;await a.promises.mkdir(n.dirname(e.destinationPath),{recursive:!0}),await new Promise((t,r)=>{let n=!1,o=e.timeoutMs??C,i=o=>{if(!n){if(n=!0,clearTimeout(d),o)return void a.promises.rm(e.destinationPath,{force:!0}).finally(()=>r(o));t()}},s=c.request({protocol:l.protocol,host:l.hostname,port:l.port,method:"GET",path:l.pathname+l.search,headers:e.token?{authorization:`Bearer ${e.token}`,"x-agent-device-token":e.token}:void 0},t=>{if((t.statusCode??500)>=400){let r="";t.setEncoding("utf8"),t.on("data",e=>{r+=e}),t.on("end",()=>{i(new f("COMMAND_FAILED","Failed to download remote artifact",{artifactId:e.artifactId,statusCode:t.statusCode,requestId:e.requestId,body:r}))});return}let r=a.createWriteStream(e.destinationPath);r.on("error",e=>{i(e instanceof Error?e:Error(String(e)))}),t.on("error",e=>{i(e instanceof Error?e:Error(String(e)))}),t.on("aborted",()=>{i(new f("COMMAND_FAILED","Remote artifact download was interrupted",{artifactId:e.artifactId,requestId:e.requestId}))}),r.on("finish",()=>{r.close(()=>i())}),t.pipe(r)}),d=setTimeout(()=>{s.destroy(new f("COMMAND_FAILED","Remote artifact download timed out",{artifactId:e.artifactId,requestId:e.requestId,timeoutMs:o}))},o);s.on("error",t=>{t instanceof f?i(t):i(new f("COMMAND_FAILED","Failed to download remote artifact",{artifactId:e.artifactId,requestId:e.requestId,timeoutMs:o},t instanceof Error?t:void 0))}),s.end()})}function ef(e=process.env.AGENT_DEVICE_DAEMON_TIMEOUT_MS){if(!e)return 9e4;let t=Number(e);return Number.isFinite(t)?Math.max(1e3,Math.floor(t)):9e4}let eh="clipboard",ew="wait",ey=new Set(["id","role","text","label","value","appname","windowtitle"]),ev=new Set(["visible","hidden","editable","selected","enabled","hittable"]),eI=new Set([...ey,...ev]);function eg(e){let t=e.trim();if(!t)throw new f("INVALID_ARGS","Empty selector term");let r=t.indexOf("=");if(-1===r){let r=t.toLowerCase();if(!ev.has(r))throw new f("INVALID_ARGS",`Invalid selector term "${e}", expected key=value`);return{key:r,value:!0}}let a=t.slice(0,r).trim().toLowerCase(),n=t.slice(r+1).trim();if(!eI.has(a))throw new f("INVALID_ARGS",`Unknown selector key: ${a}`);if(!n)throw new f("INVALID_ARGS",`Missing selector value for key: ${a}`);if(ev.has(a)){let e,t="true"===(e=eb(n).toLowerCase())||"false"!==e&&null;if(null===t)throw new f("INVALID_ARGS",`Invalid boolean value for ${a}: ${n}`);return{key:a,value:t}}return{key:a,value:eb(n)}}function eA(e,t){return e?e===t?null:e:t}function eb(e){let t=e.trim();return t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'")?t.slice(1,-1).replace(/\\(["'])/g,"$1"):t}function eS(e,t){let r=0;for(let a=t-1;a>=0&&"\\"===e[a];a-=1)r+=1;return r%2==1}let eD=g.map(e=>e.key);function e_(e){let t=e.appId??e.bundleId??e.packageName;return{session:e.session,appId:t,appBundleId:e.bundleId,package:e.packageName}}function eM(e,t,r){return{deviceId:t,deviceName:r,..."android"===e?{serial:t}:"ios"===e?{udid:t}:{}}}function ek(e,t,r,a){let n=r(e[t]);if(void 0===n)throw new f("COMMAND_FAILED",a,{response:e});return n}[...b];function eE(e,t){return ek(e,t,eC,`Daemon response is missing "${t}".`)}function eP(e,t){return eC(e[t])}function eN(e,t){var r;let a;return r=eC,null===(a=e[t])?null:r(a)}function eT(e,t){return ek(e,t,eL,`Daemon response has invalid "${t}".`)}function ex(e,t){return function(e){return"tv"===e||"mobile"===e||"desktop"===e?e:void 0}(e[t])??"mobile"}function eR(e,t){let r=e[t];if(!e$(r))return;let a="number"==typeof r.x?r.x:void 0,n="number"==typeof r.y?r.y:void 0,o="number"==typeof r.width?r.width:void 0,i="number"==typeof r.height?r.height:void 0;if(void 0!==a&&void 0!==n&&void 0!==o&&void 0!==i)return{x:a,y:n,width:o,height:i}}function eC(e){return"string"==typeof e&&e.length>0?e:void 0}function eU(e){return"number"==typeof e&&Number.isFinite(e)?e:void 0}function eL(e){return"ios"===e||"macos"===e||"android"===e?e:void 0}function eO(e){return"simulator"===e||"emulator"===e||"device"===e?e:void 0}function eF(e){if(!e$(e))throw new f("COMMAND_FAILED","Daemon returned an unexpected response shape.",{value:e});return e}function e$(e){return"object"==typeof e&&null!==e}function ej(e){let t={};for(let[r,a]of Object.entries(e))void 0!==a&&(t[r]=a);return t}function eq(e,t){let r=eP(e,"bundleId"),a=eP(e,"package");return{app:eE(e,"app"),appPath:eE(e,"appPath"),platform:eT(e,"platform"),appId:r??a,bundleId:r,package:a,identifiers:e_({session:t,bundleId:r,packageName:a})}}function eB(e){let t=eF(e),r=eT(t,"platform"),a=eE(t,"id"),n=eE(t,"name");return{platform:r,target:ex(t,"target"),kind:ek(t,"kind",eO,'Daemon response has invalid "kind".'),id:a,name:n,booted:"boolean"==typeof t.booted?t.booted:void 0,identifiers:eM(r,a,n),ios:"ios"===r?{udid:a}:void 0,android:"android"===r?{serial:a}:void 0}}function eV(e){let t=eF(e),r=eT(t,"platform"),a=eE(t,"id"),n=eE(t,"name"),o=ex(t,"target"),i=eE(t,"device"),s={session:n,...eM(r,a,i)};return{name:n,createdAt:ek(t,"createdAt",eU,'Daemon response is missing numeric "createdAt".'),device:{platform:r,target:o,id:a,name:i,identifiers:s,ios:"ios"===r?{udid:a,simulatorSetPath:eN(t,"ios_simulator_device_set")}:void 0,android:"android"===r?{serial:a}:void 0},identifiers:s}}function eG(e){return e??"default"}function ez(e={},t={}){var r;let a,n=t.transport??$,o=eQ(e),i=async(t,r=[],a={})=>{let i=eW(e,o,a),s=await n({session:eG(i.session),command:t,positionals:r,flags:ej({stateDir:i.stateDir,daemonBaseUrl:i.daemonBaseUrl,daemonAuthToken:i.daemonAuthToken,daemonTransport:i.daemonTransport,daemonServerMode:i.daemonServerMode,tenant:i.tenant,sessionIsolation:i.sessionIsolation,runId:i.runId,leaseId:i.leaseId,platform:i.platform,target:i.target,device:i.device,udid:i.udid,serial:i.serial,iosSimulatorDeviceSet:i.iosSimulatorDeviceSet,androidDeviceAllowlist:i.androidDeviceAllowlist,runtime:i.simulatorRuntimeId,boot:i.boot,reuseExisting:i.reuseExisting,surface:i.surface,activity:i.activity,relaunch:i.relaunch,shutdown:i.shutdown,saveScript:i.saveScript,noRecord:i.noRecord,backMode:i.backMode,metroHost:i.metroHost,metroPort:i.metroPort,bundleUrl:i.bundleUrl,launchUrl:i.launchUrl,snapshotInteractiveOnly:i.interactiveOnly,snapshotCompact:i.compact,snapshotDepth:i.depth,snapshotScope:i.scope,snapshotRaw:i.raw,screenshotFullscreen:i.screenshotFullscreen,overlayRefs:i.overlayRefs,appsFilter:i.appsFilter,out:i.out,count:i.count,fps:i.fps,hideTouches:i.hideTouches,intervalMs:i.intervalMs,delayMs:i.delayMs,holdMs:i.holdMs,jitterPx:i.jitterPx,pixels:i.pixels,doubleTap:i.doubleTap,clickButton:i.clickButton,pauseMs:i.pauseMs,pattern:i.pattern,maxScrolls:i.maxScrolls,headless:i.headless,restart:i.restart,replayUpdate:i.replayUpdate,failFast:i.failFast,timeoutMs:i.timeoutMs,retries:i.retries,artifactsDir:i.artifactsDir,reportJunit:i.reportJunit,findFirst:i.findFirst,findLast:i.findLast,networkInclude:i.networkInclude,batchOnError:i.batchOnError,batchMaxSteps:i.batchMaxSteps,batchSteps:i.batchSteps,verbose:i.debug}),runtime:i.runtime,meta:ej({requestId:i.requestId,cwd:i.cwd,debug:i.debug,lockPolicy:i.lockPolicy,lockPlatform:i.lockPlatform,tenantId:i.tenant,runId:i.runId,leaseId:i.leaseId,sessionIsolation:i.sessionIsolation,installSource:i.installSource,retainMaterializedPaths:i.retainMaterializedPaths,materializedPathRetentionMs:i.materializedPathRetentionMs,materializationId:i.materializationId})});return s.ok||function(e){throw new f(e.code,e.message,{...e.details??{},hint:e.hint,diagnosticId:e.diagnosticId,logPath:e.logPath})}(s.error),s.data??{}},s=async(e={})=>{let t=await i("session_list",[],e);return(Array.isArray(t.sessions)?t.sessions:[]).map(eV)},l=async(e,t=[],r={})=>await i(e,t,r),c=(t={})=>eG(eW(e,o,t).session);return{command:(r=async e=>await i(e.command,e.positionals,e.options),a=async e=>await r(e),{wait:async e=>await a(function(e){if(1!==[void 0!==e.durationMs?"durationMs":void 0,void 0!==e.text?"text":void 0,void 0!==e.ref?"ref":void 0,void 0!==e.selector?"selector":void 0].filter(Boolean).length)throw new f("INVALID_ARGS","wait command requires exactly one of durationMs, text, ref, or selector.");if(void 0!==e.durationMs)return{command:ew,positionals:[String(e.durationMs)],options:e};let t=void 0!==e.timeoutMs?[String(e.timeoutMs)]:[];if(void 0!==e.text)return{command:ew,positionals:["text",e.text,...t],options:e};if(void 0!==e.ref)return{command:ew,positionals:[e.ref,...t],options:e};let r=e.selector;return function(e){if(!function(e){try{let t=e.trim();if(!t)throw new f("INVALID_ARGS","Selector expression cannot be empty");let r=function(e){let t=[],r="",a=null;for(let n=0;n<e.length;n+=1){let o=e[n];if(('"'===o||"'"===o)&&!eS(e,n)){a=eA(a,o),r+=o;continue}if(!a&&"|"===o&&"|"===e[n+1]){let a=r.trim();if(!a)throw new f("INVALID_ARGS",`Invalid selector fallback expression: ${e}`);t.push(a),r="",n+=1;continue}r+=o}let n=r.trim();if(!n)throw new f("INVALID_ARGS",`Invalid selector fallback expression: ${e}`);return t.push(n),t}(t);if(0===r.length)throw new f("INVALID_ARGS","Selector expression cannot be empty");return{raw:t,selectors:r.map(e=>(function(e){let t=e.trim();if(!t)throw new f("INVALID_ARGS","Selector segment cannot be empty");let r=function(e){let t=[],r="",a=null;for(let n=0;n<e.length;n+=1){let o=e[n];if(('"'===o||"'"===o)&&!eS(e,n)){a=eA(a,o),r+=o;continue}if(!a&&/\s/.test(o)){r.trim()&&t.push(r.trim()),r="";continue}r+=o}if(a)throw new f("INVALID_ARGS",`Unclosed quote in selector: ${e}`);return r.trim()&&t.push(r.trim()),t}(t);if(0===r.length)throw new f("INVALID_ARGS",`Invalid selector segment: ${e}`);return{raw:t,terms:r.map(eg)}})(e))}}catch{return null}}(e))throw new f("INVALID_ARGS",`Invalid wait selector: ${e}`)}(r),{command:ew,positionals:[r,...t],options:e}}(e)),alert:async(e={})=>{var t;return await a({command:"alert",positionals:[(t=e).action??"get",...void 0!==t.timeoutMs?[String(t.timeoutMs)]:[]],options:t})},appState:async(e={})=>await a({command:"appstate",positionals:[],options:e}),back:async(e={})=>await a({command:"back",positionals:[],options:{...e,backMode:e.mode}}),home:async(e={})=>await a({command:"home",positionals:[],options:e}),rotate:async e=>await a({command:"rotate",positionals:[e.orientation],options:e}),appSwitcher:async(e={})=>await a({command:"app-switcher",positionals:[],options:e}),keyboard:async(e={})=>await a({command:"keyboard",positionals:e.action?[e.action]:[],options:e}),clipboard:async e=>{var t;return await a("read"===(t=e).action?{command:eh,positionals:["read"],options:t}:{command:eh,positionals:["write",t.text],options:t})}}),devices:{list:async(e={})=>{let t=await i("devices",[],e);return(Array.isArray(t.devices)?t.devices:[]).map(eB)},boot:async(e={})=>await l("boot",[],e)},sessions:{list:async(e={})=>await s(e),close:async(e={})=>{let t=c(e),r=(await i("close",[],e)).shutdown;return{session:t,shutdown:"object"==typeof r&&null!==r?r:void 0,identifiers:{session:t}}}},simulators:{ensure:async e=>{let{runtime:t,...r}=e,a=await i("ensure-simulator",[],{...r,simulatorRuntimeId:t}),n=eE(a,"udid"),o=eE(a,"device");return{udid:n,device:o,runtime:eE(a,"runtime"),created:!0===a.created,booted:!0===a.booted,iosSimulatorDeviceSet:eN(a,"ios_simulator_device_set"),identifiers:{deviceId:n,deviceName:o,udid:n}}}},apps:{install:async e=>eq(await i("install",[e.app,e.appPath],e),c(e)),reinstall:async e=>eq(await i("reinstall",[e.app,e.appPath],e),c(e)),installFromSource:async e=>(function(e,t){let r=eP(e,"bundleId"),a=eP(e,"packageName"),n=r??a??eP(e,"appId"),o=eP(e,"launchTarget")??a??r??n;if(!o)throw new f("COMMAND_FAILED",'Daemon response is missing "launchTarget".',{response:e});return{appName:eP(e,"appName"),appId:n,bundleId:r,packageName:a,launchTarget:o,installablePath:eP(e,"installablePath"),archivePath:eP(e,"archivePath"),materializationId:eP(e,"materializationId"),materializationExpiresAt:eP(e,"materializationExpiresAt"),identifiers:e_({session:t,bundleId:r,packageName:a,appId:n})}})(await i("install_source",[],{...e,installSource:e.source,retainMaterializedPaths:e.retainPaths,materializedPathRetentionMs:e.retentionMs}),c(e)),list:async(e={})=>{let t=await i("apps",[],e);return Array.isArray(t.apps)?t.apps.filter(e=>"string"==typeof e):[]},open:async e=>{let t=c(e),r=e.app?e.url?[e.app,e.url]:[e.app]:[],a=await i("open",r,e),n=function(e){let t=e.platform,r=eP(e,"id"),a=eP(e,"device");if("ios"!==t&&"macos"!==t&&"android"!==t||!r||!a)return;let n=ex(e,"target"),o=eM(t,r,a);return{platform:t,target:n,id:r,name:a,identifiers:o,ios:"ios"===t?{udid:eP(e,"device_udid")??r,simulatorSetPath:eN(e,"ios_simulator_device_set")}:void 0,android:"android"===t?{serial:eP(e,"serial")??r}:void 0}}(a),o=eP(a,"appBundleId");return{session:t,appName:eP(a,"appName"),appBundleId:o,appId:o,startup:function(e){if(e$(e)&&"number"==typeof e.durationMs&&"string"==typeof e.measuredAt&&"string"==typeof e.method)return{durationMs:e.durationMs,measuredAt:e.measuredAt,method:e.method,appTarget:eP(e,"appTarget"),appBundleId:eP(e,"appBundleId")}}(a.startup),runtime:function(e){if(!e$(e))return;let t=e.platform,r=eP(e,"metroHost"),a="number"==typeof e.metroPort?e.metroPort:void 0;return{platform:"ios"===t||"android"===t?t:void 0,metroHost:r,metroPort:a,bundleUrl:eP(e,"bundleUrl"),launchUrl:eP(e,"launchUrl")}}(a.runtime),device:n,identifiers:{session:t,deviceId:n?.id,deviceName:n?.name,udid:n?.ios?.udid,serial:n?.android?.serial,appId:o,appBundleId:o}}},close:async(e={})=>{let t=c(e),r=(await i("close",e.app?[e.app]:[],e)).shutdown;return{session:t,closedApp:e.app,shutdown:"object"==typeof r&&null!==r?r:void 0,identifiers:{session:t}}},push:async e=>{var t;return await l("push",[e.app,"string"==typeof(t=e.payload)?t:JSON.stringify(t)],e)},triggerEvent:async e=>{var t;return await l("trigger-app-event",[(t=e).event,...t.payload?[JSON.stringify(t.payload)]:[]],e)}},materializations:{release:async e=>{var t;return{released:!0===(t=await i("release_materialized_paths",[],{...e,materializationId:e.materializationId})).released,materializationId:eE(t,"materializationId"),identifiers:{}}}},metro:{prepare:async t=>await w({projectRoot:t.projectRoot??e.cwd,kind:t.kind,publicBaseUrl:t.publicBaseUrl,proxyBaseUrl:t.proxyBaseUrl,proxyBearerToken:t.bearerToken,launchUrl:t.launchUrl,companionProfileKey:t.companionProfileKey,companionConsumerKey:t.companionConsumerKey,metroPort:t.port,listenHost:t.listenHost,statusHost:t.statusHost,startupTimeoutMs:t.startupTimeoutMs,probeTimeoutMs:t.probeTimeoutMs,reuseExisting:t.reuseExisting,installDependenciesIfNeeded:t.installDependenciesIfNeeded,runtimeFilePath:t.runtimeFilePath,logPath:t.logPath})},capture:{snapshot:async(e={})=>{var t;let r=c(e),a=await i("snapshot",[],e),n=eP(a,"appBundleId"),o="object"==typeof a.visibility&&null!==a.visibility?a.visibility:void 0;return{nodes:Array.isArray(t=a.nodes)?t:[],truncated:!0===a.truncated,appName:eP(a,"appName"),appBundleId:n,...o?{visibility:o}:{},warnings:Array.isArray(a.warnings)?a.warnings.filter(e=>"string"==typeof e):void 0,identifiers:{session:r,appId:n,appBundleId:n}}},screenshot:async(e={})=>{let t=c(e),r=await i("screenshot",e.path?[e.path]:[],{...e,screenshotFullscreen:e.fullscreen});return{path:eE(r,"path"),overlayRefs:function(e){let t=e.overlayRefs;if(!Array.isArray(t))return;let r=[];for(let e of t){if(!e$(e))continue;let t=eP(e,"ref"),a=eR(e,"rect"),n=eR(e,"overlayRect"),o=function(e,t){let r=e[t];if(!e$(r))return;let a="number"==typeof r.x?r.x:void 0,n="number"==typeof r.y?r.y:void 0;if(void 0!==a&&void 0!==n)return{x:a,y:n}}(e,"center");t&&a&&n&&o&&r.push({ref:t,label:eP(e,"label"),rect:a,overlayRect:n,center:o})}return r}(r),identifiers:{session:t}}},diff:async e=>await l("diff",[e.kind],{...e,interactiveOnly:e.interactiveOnly,compact:e.compact,depth:e.depth,scope:e.scope,raw:e.raw})},interactions:{click:async e=>await l("click",eH(e),{...e,clickButton:e.button}),press:async e=>await l("press",eH(e),e),longPress:async e=>await l("longpress",[String(e.x),String(e.y),...eJ(e.durationMs)],e),swipe:async e=>await l("swipe",[String(e.from.x),String(e.from.y),String(e.to.x),String(e.to.y),...eJ(e.durationMs)],e),focus:async e=>await l("focus",[String(e.x),String(e.y)],e),type:async e=>await l("type",[e.text],e),fill:async e=>await l("fill",[...eH(e),e.text],e),scroll:async e=>await l("scroll",[e.direction,...eJ(e.amount)],e),scrollIntoView:async e=>{var t;return await l("scrollintoview",void 0!==(t=e).ref?[t.ref,...eK(t.label)]:[t.text??""],e)},pinch:async e=>await l("pinch",[String(e.scale),...eJ(e.x),...eJ(e.y)],e),get:async e=>{var t;return await l("get",[e.format,...void 0!==(t=e).ref?[t.ref,...eK(t.label)]:[t.selector]],e)},is:async e=>await l("is",[e.predicate,e.selector,..."text"===e.predicate?[e.value]:[]],e),find:async e=>await l("find",function(e){let t=e.locator&&"any"!==e.locator?[e.locator,e.query]:[e.query];switch(e.action){case void 0:case"click":case"focus":case"exists":return e.action?[...t,e.action]:t;case"getText":return[...t,"get","text"];case"getAttrs":return[...t,"get","attrs"];case"wait":return[...t,"wait",...eJ(e.timeoutMs)];case"fill":case"type":return[...t,e.action,e.value]}}(e),{...e,findFirst:e.first,findLast:e.last})},replay:{run:async e=>await l("replay",[e.path],{...e,replayUpdate:e.update}),test:async e=>await l("test",e.paths,{...e,replayUpdate:e.update})},batch:{run:async e=>await l("batch",[],{...e,batchSteps:e.steps,batchOnError:e.onError,batchMaxSteps:e.maxSteps})},observability:{perf:async(e={})=>await l("perf",[],e),logs:async(e={})=>{var t;return await l("logs",[(t=e).action??"path",...eK(t.message)],e)},network:async(e={})=>{var t;return await l("network",[...(t=e).action?[t.action]:[],...eJ(t.limit)],{...e,networkInclude:e.include})}},recording:{record:async e=>await l("record",[e.action,...eK(e.path)],e),trace:async e=>await l("trace",[e.action,...eK(e.path)],e)},settings:{update:async e=>await l("settings",[e.setting,e.state,..."permission"in e?[e.permission]:[],..."mode"in e&&e.mode?[e.mode]:[]],e)}}}function eH(e){return void 0!==e.ref?[e.ref,...eK(e.label)]:void 0!==e.selector?[e.selector]:[String(e.x),String(e.y)]}function eK(e){return void 0===e?[]:[e]}function eJ(e){return void 0===e?[]:[String(e)]}function eW(e,t,r){return r.remoteConfig&&r.remoteConfig!==e.remoteConfig?{...eQ({...e,...r}),...e,...r}:{...t,...e,...r}}function eQ(e){var t;if(!e.remoteConfig)return{};let{runtime:r,...a}=(t={remoteConfig:e.remoteConfig,cwd:e.cwd??process.cwd(),env:process.env}).remoteConfig?{...function(e){let t={};for(let r of eD){let a=e[r];void 0!==a&&(t[r]=a)}return t}(A({configPath:t.remoteConfig,cwd:t.cwd,env:t.env}).profile),remoteConfig:t.remoteConfig}:{};return a}export{AppError}from"./957.js";export{ez as createAgentDeviceClient};
@@ -74,6 +74,7 @@ export declare type MetroBridgeRuntimePayload = {
74
74
  launch_url?: string;
75
75
  };
76
76
 
77
+ /** Re-export of {@link SessionRuntimeHints} under the Metro-specific alias used by public API consumers. */
77
78
  export declare type MetroRuntimeHints = SessionRuntimeHints;
78
79
 
79
80
  export declare type MetroTunnelHttpErrorMessage = {
@@ -1 +1 @@
1
- import e from"node:fs";import t from"node:path";import{resolveUserPath as n,AppError as r}from"./957.js";let o=new Set(["1","true","yes","on"]),i=new Set(["0","false","no","off"]);function a(e,t,n,o){if(e.multiple)return(Array.isArray(t)?t:[t]).map(t=>a({...e,multiple:!1},t,n,o));if("boolean"===e.type){var i=t,s=n,f=o;if("boolean"==typeof i)return i;if("string"==typeof i){let e=l(i);if(void 0!==e)return e}throw new r("INVALID_ARGS",`Invalid value for "${f}" in ${s}. Expected boolean.`)}if("booleanOrString"===e.type){if("boolean"==typeof t)return t;if("string"==typeof t&&void 0!==l(t))return l(t);if("string"==typeof t&&t.trim().length>0)return t;throw new r("INVALID_ARGS",`Invalid value for "${o}" in ${n}. Expected boolean or non-empty string.`)}if("string"===e.type){if("string"==typeof t&&t.trim().length>0)return t;throw new r("INVALID_ARGS",`Invalid value for "${o}" in ${n}. Expected non-empty string.`)}if("enum"===e.type){if(void 0!==e.setValue){var u=e,y=t,p=n,m=o;let i=u.setValue;if(y===i)return i;if("string"==typeof y){let e=y.trim();if(""===e||"true"===e||"1"===e)return i;if("false"===e||"0"===e)return}if(!0===y)return i;if(!1!==y)throw new r("INVALID_ARGS",`Invalid value for "${m}" in ${p}. Expected boolean-like value for enum flag.`);return}if("string"!=typeof t||!e.enumValues?.includes(t))throw new r("INVALID_ARGS",`Invalid value for "${o}" in ${n}. Expected one of: ${e.enumValues?.join(", ")}.`);return t}let g="number"==typeof t?t:"string"==typeof t?Number(t):NaN;if(!Number.isFinite(g)||!Number.isInteger(g))throw new r("INVALID_ARGS",`Invalid value for "${o}" in ${n}. Expected integer.`);if("number"==typeof e.min&&g<e.min)throw new r("INVALID_ARGS",`Invalid value for "${o}" in ${n}. Must be >= ${e.min}.`);if("number"==typeof e.max&&g>e.max)throw new r("INVALID_ARGS",`Invalid value for "${o}" in ${n}. Must be <= ${e.max}.`);return g}function l(e){let t=e.trim().toLowerCase();return!!o.has(t)||!i.has(t)&&void 0}let s=[{key:"stateDir",type:"string",path:!0},{key:"daemonBaseUrl",type:"string"},{key:"daemonAuthToken",type:"string"},{key:"daemonTransport",type:"enum",enumValues:["auto","socket","http"]},{key:"daemonServerMode",type:"enum",enumValues:["socket","http","dual"]},{key:"tenant",type:"string"},{key:"sessionIsolation",type:"enum",enumValues:["none","tenant"]},{key:"runId",type:"string"},{key:"leaseId",type:"string"},{key:"platform",type:"enum",enumValues:["ios","macos","android","linux","apple"]},{key:"target",type:"enum",enumValues:["mobile","tv","desktop"]},{key:"device",type:"string"},{key:"udid",type:"string"},{key:"serial",type:"string"},{key:"iosSimulatorDeviceSet",type:"string",path:!0,legacyEnvNames:["IOS_SIMULATOR_DEVICE_SET"]},{key:"androidDeviceAllowlist",type:"string",legacyEnvNames:["ANDROID_DEVICE_ALLOWLIST"]},{key:"session",type:"string"},{key:"metroProjectRoot",type:"string",path:!0},{key:"metroKind",type:"enum",enumValues:["auto","react-native","expo"]},{key:"metroPublicBaseUrl",type:"string"},{key:"metroProxyBaseUrl",type:"string"},{key:"metroBearerToken",type:"string",legacyEnvNames:["AGENT_DEVICE_PROXY_TOKEN"]},{key:"metroPreparePort",type:"int",min:1,max:65535},{key:"metroListenHost",type:"string"},{key:"metroStatusHost",type:"string"},{key:"metroStartupTimeoutMs",type:"int",min:1},{key:"metroProbeTimeoutMs",type:"int",min:1},{key:"metroRuntimeFile",type:"string",path:!0},{key:"metroNoReuseExisting",type:"boolean"},{key:"metroNoInstallDeps",type:"boolean"}],f=new Map(s.map(e=>[e.key,e]));function u(e){let t=e.env??process.env;return n(e.configPath,{cwd:e.cwd,env:t})}function y(o){let i=function(o){let i,l,s=o.env??process.env,y=u(o);if(!e.existsSync(y))throw new r("INVALID_ARGS",`Remote config file not found: ${y}`);try{i=e.readFileSync(y,"utf8")}catch(e){throw new r("INVALID_ARGS",`Failed to read remote config file: ${y}`,{cause:e instanceof Error?e.message:String(e)})}try{l=JSON.parse(i)}catch(e){throw new r("INVALID_ARGS",`Invalid JSON in remote config file: ${y}`,{cause:e instanceof Error?e.message:String(e)})}if(!l||"object"!=typeof l||Array.isArray(l))throw new r("INVALID_ARGS",`Remote config file must contain a JSON object: ${y}`);let p={},m=l,g=t.dirname(y);for(let[e,t]of Object.entries(m)){let o=f.get(e);if(!o)throw new r("INVALID_ARGS",`Unsupported remote config key "${e}" in remote config file ${y}.`);let i=a(o,t,`remote config file ${y}`,e);p[o.key]="string"==typeof i&&"path"in o&&o.path?n(i,{cwd:g,env:s}):i}return{resolvedPath:y,profile:p}}(o);return{resolvedPath:i.resolvedPath,profile:function(...e){let t={};for(let n of e)if(n)for(let e of s){let r=n[e.key];void 0!==r&&(t[e.key]=r)}return t}(function(e=process.env){let t={};for(let n of s){let r=(function(e){let t=f.get(e);return[`AGENT_DEVICE_${e.replace(/([A-Z])/g,"_$1").replace(/[^A-Za-z0-9_]/g,"_").toUpperCase()}`,...t?.legacyEnvNames??[]]})(n.key).map(t=>({name:t,value:e[t]})).find(e=>"string"==typeof e.value&&e.value.trim().length>0);r&&(t[n.key]=a(n,r.value,`environment variable ${r.name}`,r.name))}return t}(o.env),i.profile)}}export{u as resolveRemoteConfigPath,y as resolveRemoteConfigProfile};
1
+ export{resolveRemoteConfigPath,resolveRemoteConfigProfile}from"./924.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-device",
3
- "version": "0.11.13",
3
+ "version": "0.11.15",
4
4
  "description": "Unified control plane for physical and virtual devices via an agent-driven CLI.",
5
5
  "license": "MIT",
6
6
  "author": "Callstack",
package/dist/src/995.js DELETED
@@ -1 +0,0 @@
1
- import e from"node:fs";import t from"node:path";import{fileURLToPath as n}from"node:url";import r from"node:os";import i from"node:crypto";import{PNG as a}from"pngjs";import{runCmdSync as o,AppError as l}from"./818.js";let s="<wifi|airplane|location> <on|off>",u="appearance <light|dark|toggle>",c="faceid <match|nonmatch|enroll|unenroll>",d="touchid <match|nonmatch|enroll|unenroll>",f="fingerprint <match|nonmatch>",p="permission <grant|deny|reset> <camera|microphone|photos|contacts|contacts-limited|notifications|calendar|location|location-always|media-library|motion|reminders|siri> [full|limited]",m="permission <grant|reset> <accessibility|screen-recording|input-monitoring>",h=`macOS supports only settings ${u} and settings ${m}. wifi|airplane|location remain unsupported on macOS.`,g=`settings ${s} | settings ${u} | settings ${c} | settings ${d} | settings ${f} | settings ${p} | settings ${m}`,w=`settings requires ${s}, ${u}, ${c}, ${d}, ${f}, ${p}, or ${m}`;function b(e){let t=e.trim().toLowerCase();return"appearance"===t||"permission"===t}function x(e){return`Unsupported macOS setting: ${e}. ${h}`}let v=["app","frontmost-app","desktop","menubar"];function y(e){let t=e?.trim().toLowerCase();if("app"===t||"frontmost-app"===t||"desktop"===t||"menubar"===t)return t;throw new l("INVALID_ARGS",`Invalid surface: ${e}. Use ${v.join("|")}.`)}function S(e){var t;let n,r=I(e.label),i=I(e.value),a=I(e.identifier),o=(t=a)&&!/^[\w.]+:id\/[\w.-]+$/i.test(t)&&!/^_?NS:\d+$/i.test(t)?a:"";return(n=$(e.type??"")).includes("textfield")||n.includes("securetextfield")||n.includes("searchfield")||n.includes("edittext")||n.includes("textview")||n.includes("textarea")?i||r||o:r||i||o}function I(e){return"string"==typeof e?e.trim():""}function $(e){let t=e.trim().replace(/XCUIElementType/gi,"").replace(/^AX/,"").toLowerCase(),n=Math.max(t.lastIndexOf("."),t.lastIndexOf("/"));return -1!==n&&(t=t.slice(n+1)),t}function A(e,t={}){let n=[],r=[];for(let i of e){let e=i.depth??0,a=i.label?.trim()||i.value?.trim()||i.identifier?.trim()||"",o=C(i.type??"Element");if("group"===o&&!a)continue;for(;n.length>0&&e<=n[n.length-1];)n.pop();let l=n.length;n.push(e),r.push({node:i,depth:l,type:o,text:N(i,l,!1,o,t)})}return r}function N(e,t,n,r,i={}){var a,o,l,s,u;let c,d,f=r??C(e.type??"Element"),p=(c=S(e),{text:c,isLargeSurface:d=function(e,t){if("text-view"===t||"text-field"===t||"search"===t)return!0;let n=$(e.type??""),r=`${e.role??""} ${e.subrole??""}`.toLowerCase();return n.includes("textview")||n.includes("textarea")||n.includes("textfield")||n.includes("securetextfield")||n.includes("searchfield")||n.includes("edittext")||r.includes("text area")||r.includes("text field")}(e,f),shouldSummarize:d&&!!(a=c)&&(a.length>80||/[\r\n]/.test(a))}),m=(o=e,l=f,s=i,u=p,s.summarizeTextSurfaces&&u.shouldSummarize&&function(e,t,n){let r=I(e.label);if(r&&r!==n)return r;let i=I(e.identifier);if(i&&!k(i)&&i!==n)return i;switch(t){case"text":case"text-view":return"Text view";case"text-field":return"Text field";case"search":return"Search field";default:return""}}(o,l,u.text)||L(o,l)),h=" ".repeat(t),g=e.ref?`@${e.ref}`:"",w=(function(e,t,n,r){let i,a=[];if(!1===e.enabled&&a.push("disabled"),!n.summarizeTextSurfaces||(!0===e.selected&&a.push("selected"),R(t)&&a.push("editable"),function(e,t){if("scroll-area"===t)return!0;let n=(e.type??"").toLowerCase(),r=`${e.role??""} ${e.subrole??""}`.toLowerCase();return n.includes("scroll")||r.includes("scroll")}(e,t)&&a.push("scrollable"),!r.shouldSummarize))return a;return a.push(`preview:"${((i=r.text.replace(/\s+/g," ").trim()).length<=48?i:`${i.slice(0,45)}...`).replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`),a.push("truncated"),[...new Set(a)]})(e,f,i,p).map(e=>` [${e}]`).join(""),b=m?` "${m}"`:"";return n?`${h}${g} [${f}]${w}`.trimEnd():`${h}${g} [${f}]${b}${w}`.trimEnd()}function L(e,t){var n,r;let i,a=e.label?.trim();if(a&&(n=t,r=a,("scroll-area"===n||"list"===n||"collection"===n||"table"===n)&&(i=r.trim().toLowerCase())&&/^(vertical|horizontal)\s+scroll\s+bar(?:,?\s*\d+\s+pages?)?$/.test(i)))return"";let o=e.value?.trim();if(R(t)){if(o)return o;if(a)return a}else if(a)return a;if(o)return o;let l=e.identifier?.trim();return!l||k(l)&&("group"===t||"image"===t||"list"===t||"collection"===t)?"":l}function C(e){let t=e.replace(/XCUIElementType/gi,"").toLowerCase(),n=e.includes(".")&&(e.startsWith("android.")||e.startsWith("androidx.")||e.startsWith("com."));switch(t.includes(".")&&(t=t.replace(/^android\.widget\./,"").replace(/^android\.view\./,"").replace(/^android\.webkit\./,"").replace(/^androidx\./,"").replace(/^com\.google\.android\./,"").replace(/^com\.android\./,""),n&&t.includes(".")&&(t=t.slice(t.lastIndexOf(".")+1))),t){case"application":return"application";case"navigationbar":return"navigation-bar";case"tabbar":return"tab-bar";case"button":case"imagebutton":return"button";case"link":return"link";case"cell":return"cell";case"statictext":case"checkedtextview":return"text";case"textfield":case"edittext":return"text-field";case"textview":return n?"text":"text-view";case"textarea":return"text-view";case"switch":return"switch";case"slider":return"slider";case"image":case"imageview":return"image";case"webview":return"webview";case"framelayout":case"linearlayout":case"relativelayout":case"constraintlayout":case"viewgroup":case"view":case"group":return"group";case"listview":case"recyclerview":return"list";case"collectionview":return"collection";case"searchfield":return"search";case"segmentedcontrol":return"segmented-control";case"window":return"window";case"checkbox":return"checkbox";case"radio":return"radio";case"menuitem":return"menu-item";case"toolbar":return"toolbar";case"scrollarea":case"scrollview":case"nestedscrollview":return"scroll-area";case"table":return"table";default:return t||"element"}}function R(e){return"text-field"===e||"text-view"===e||"search"===e}function k(e){return/^[\w.]+:id\/[\w.-]+$/i.test(e)}function M(e){return e.map((e,t)=>({...e,ref:`e${t+1}`}))}function _(e){let t=e.trim();return t.startsWith("@")?t.slice(1)||null:t.startsWith("e")?t:null}function E(e,t){return e.find(e=>e.ref===t)??null}function D(e){return{x:Math.round(e.x+e.width/2),y:Math.round(e.y+e.height/2)}}function P(e,t){let n=D(t),r=e.filter(e=>{var t;return!!(t=e.rect)&&Number.isFinite(t.x)&&Number.isFinite(t.y)&&Number.isFinite(t.width)&&Number.isFinite(t.height)}),i=r.filter(e=>{let t=(e.type??"").toLowerCase();return t.includes("application")||t.includes("window")}),a=j(i.map(e=>e.rect).filter(e=>z(e,n.x,n.y)));if(a)return a;let o=j(i.map(e=>e.rect));if(o)return o;let l=j(r.map(e=>e.rect).filter(e=>z(e,n.x,n.y)));return l||null}function T(e,t){let n=Math.max(1,t.height),r=t.y,i=t.y+n,a=r+.25*n,o=i-.25*n,l=e.y+e.height/2;return l<a?Math.ceil(a-l):l>o?Math.ceil(l-o):0}function z(e,t,n){return t>=e.x&&t<=e.x+e.width&&n>=e.y&&n<=e.y+e.height}function j(e){let t=null,n=-1;for(let r of e){let e=r.width*r.height;e>n&&(t=r,n=e)}return t}function B(e,t,n,r){return Math.max(e,n)<=Math.min(t,r)}function G(e){let t=new Map;for(let[n,r]of e.entries())t.set(r.index,n);let n=[],r=[];for(let[i,a]of e.entries()){let e=Math.max(0,a.depth??0);for(;r.length>0&&e<=r[r.length-1].depth;)r.pop();let o="number"==typeof a.parentIndex?t.get(a.parentIndex):void 0,l="number"==typeof o&&o<i?o:r[r.length-1]?.index;n.push({...a,index:i,depth:e,parentIndex:l}),r.push({depth:e,index:i})}return n}function O(e){return new Map(e.map(e=>[e.index,e]))}function V(e){let t=`${e??""}`.toLowerCase();return t.includes("scroll")||t.includes("recyclerview")||t.includes("listview")||t.includes("gridview")||t.includes("collectionview")||"table"===t}function F(e){return!!V(e.type)||`${e.role??""} ${e.subrole??""}`.toLowerCase().includes("scroll")}function U(e){if(0===e.length)return{nodes:e,hiddenCount:0,summaryLines:[]};let t=O(e),n=new Set,r=[];for(let i of e){if(W(i,e,t)){!function(e,t,n){let r=e,i=new Set;for(;r&&!i.has(r.index);)i.add(r.index),t.add(r.index),r="number"==typeof r.parentIndex?n.get(r.parentIndex):void 0}(i,n,t);continue}r.push(i)}let i=function(e,t,n,r){let i=new Map,a=new Set;for(let e of t){if(!e.rect)continue;let t=q(e,n,r);if(!t?.rect)continue;let o=J(e.rect,t.rect);if(!o)continue;let l=i.get(t.index)??new Set;l.add(o),i.set(t.index,l),a.add(e.index)}return function(e,t,n,r){for(let i of e){let e=function(e){let t=function(e,t){if(!(e?.trim().toLowerCase()??"").includes("vertical scroll bar"))return null;let n=function(e){if(!e)return null;let t=/^(\d{1,3})%$/.exec(e.trim());if(!t)return null;let n=Number(t[1]);return Number.isFinite(n)?Math.max(0,Math.min(100,n)):null}(t);return null===n?null:n<=1?{above:!1,below:!0}:n>=99?{above:!0,below:!1}:{above:!0,below:!0}}(e.label,e.value);if(!t)return null;let n=new Set;return t.above&&n.add("above"),t.below&&n.add("below"),n.size>0?n:null}(i);if(!e||0===e.size)continue;let a=q(i,t,n);if(!a)continue;let o=r.get(a.index)??new Set;for(let t of e)o.add(t);r.set(a.index,o)}}(e,n,r,i),{directionsByContainer:i,coveredNodeIndexes:a}}(e,r,n,t),a=0===n.size?e:e.filter(e=>n.has(e.index));return{nodes:a.map(e=>(function(e,t){let n=t.get(e.index);if(!n||0===n.size)return e;let r=!!(!0===e.hiddenContentAbove||n.has("above"))||void 0,i=!!(!0===e.hiddenContentBelow||n.has("below"))||void 0;return{...e,hiddenContentAbove:r,hiddenContentBelow:i}})(e,i.directionsByContainer)),hiddenCount:0===n.size?0:e.length-a.length,summaryLines:function(e,t,n){let r=new Map;for(let i of e){let e=function(e,t,n){if(!e.rect)return null;let r=H(e,t,n);return r?J(e.rect,r):null}(i,t,n);if(!e)continue;let a=r.get(e)??[];a.push(i),r.set(e,a)}return["above","below"].flatMap(e=>{let t=r.get(e);if(!t||0===t.length)return[];let n=(function(e){let t=new Set,n=[];for(let r of e){let e=X(r);!e||t.has(e)||(t.add(e),n.push(e))}return n})(t).slice(0,3).map(e=>`"${e}"`),i=1===t.length?"interactive item":"interactive items",a=n.length>0?`: ${n.join(", ")}`:"";return[`[off-screen ${e}] ${t.length} ${i}${a}`]})}(r.filter(e=>!i.coveredNodeIndexes.has(e.index)&&function(e){if(!0===e.hittable)return!0;let t=(e.type??"").toLowerCase();return t.includes("button")||t.includes("link")||t.includes("textfield")||t.includes("edittext")||t.includes("searchfield")||t.includes("checkbox")||t.includes("radio")||t.includes("switch")||t.includes("menuitem")||!!X(e)}(e)),e,t)}}function W(e,t,n=O(t)){var r;if(!e.rect)return!0;let i=H(e,t,n);return!i||(r=e.rect,B(r.x,r.x+r.width,i.x,i.x+i.width)&&B(r.y,r.y+r.height,i.y,i.y+i.height))}function H(e,t,n=O(t)){let r=function(e,t){let n="number"==typeof e.parentIndex?t.get(e.parentIndex):void 0,r=new Set;for(;n&&!r.has(n.index);){if(r.add(n.index),n.rect&&F(n))return n.rect;n="number"==typeof n.parentIndex?t.get(n.parentIndex):void 0}return null}(e,n);return r||P(t,e.rect??{x:0,y:0,width:0,height:0})}function J(e,t){return e.y+e.height<=t.y?"above":e.y>=t.y+t.height?"below":null}function X(e){return e.label?.trim()||e.value?.trim()||e.identifier?.trim()||""}function q(e,t,n){let r="number"==typeof e.parentIndex?n.get(e.parentIndex):void 0,i=new Set;for(;r&&!i.has(r.index);){if(i.add(r.index),t.has(r.index)&&F(r))return r;r="number"==typeof r.parentIndex?n.get(r.parentIndex):void 0}return null}function K(){try{let n=Z();return JSON.parse(e.readFileSync(t.join(n,"package.json"),"utf8")).version??"0.0.0"}catch{return"0.0.0"}}function Z(){let r=t.dirname(n(import.meta.url)),i=r;for(let n=0;n<6;n+=1){let n=t.join(i,"package.json");if(e.existsSync(n))return i;i=t.dirname(i)}return r}function Q(e){return e?{message:e}:{}}function Y(e,t){return t?{...e,message:t}:e}function ee(e){return"string"==typeof e?.message&&e.message.length>0?e.message:null}let et=[/(^|[/\s"'=])dist\/src\/daemon\.js($|[\s"'])/,/(^|[/\s"'=])src\/daemon\.ts($|[\s"'])/];function en(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(e){return"EPERM"===e.code}}function er(e){if(!Number.isInteger(e)||e<=0)return null;try{let t=o("ps",["-p",String(e),"-o","lstart="],{allowFailure:!0,timeoutMs:1e3});if(0!==t.exitCode)return null;let n=t.stdout.trim();return n.length>0?n:null}catch{return null}}function ei(e){if(!Number.isInteger(e)||e<=0)return null;try{let t=o("ps",["-p",String(e),"-o","command="],{allowFailure:!0,timeoutMs:1e3});if(0!==t.exitCode)return null;let n=t.stdout.trim();return n.length>0?n:null}catch{return null}}function ea(e,t){let n;if(!en(e))return!1;if(t){let n=er(e);if(!n||n!==t)return!1}let r=ei(e);return!!r&&!!(n=r.toLowerCase().replaceAll("\\","/")).includes("agent-device")&&et.some(e=>e.test(n))}function eo(e,t){try{return process.kill(e,t),!0}catch(t){let e=t.code;if("ESRCH"===e||"EPERM"===e)return!1;throw t}}async function el(e,t){if(!en(e))return!0;let n=Date.now();for(;Date.now()-n<t;)if(await new Promise(e=>setTimeout(e,50)),!en(e))return!0;return!en(e)}async function es(e,t){!ea(e,t.expectedStartTime)||!eo(e,"SIGTERM")||await el(e,t.termTimeoutMs)||eo(e,"SIGKILL")&&await el(e,t.killTimeoutMs)}function eu(e){return e?.HOME?.trim()||r.homedir()}function ec(e,n={}){return"~"===e?eu(n.env):e.startsWith("~/")?t.join(eu(n.env),e.slice(2)):e}function ed(e,n={}){let r=ec(e,n);return t.isAbsolute(r)?r:t.resolve(n.cwd??process.cwd(),r)}function ef(e){let n,r=(n=(e??"").trim())?ed(n):t.join(ec("~"),".agent-device");return{baseDir:r,infoPath:t.join(r,"daemon.json"),lockPath:t.join(r,"daemon.lock"),logPath:t.join(r,"daemon.log"),sessionsDir:t.join(r,"sessions")}}function ep(e){let t=(e??"").trim().toLowerCase();return"http"===t?"http":"dual"===t?"dual":"socket"}function em(e){let t=(e??"").trim().toLowerCase();return"auto"===t?"auto":"socket"===t?"socket":"http"===t?"http":"auto"}function eh(e){return"tenant"===(e??"").trim().toLowerCase()?"tenant":"none"}function eg(e){if(!e)return;let t=e.trim();if(t&&/^[a-zA-Z0-9._-]{1,128}$/.test(t))return t}let ew=/(?:^|[^\w$.])(?:import|export)\s+(?:type\s+)?(?:[^'"`]*?\s+from\s+)?['"]([^'"]+)['"]/gm,eb=/import\(\s*['"]([^'"]+)['"]\s*\)/gm,ex=[".ts",".tsx",".js",".jsx",".mjs",".cjs"];function ev(){let e=process.argv[1];return e?ey(e):"unknown"}function ey(n,r=Z()){try{let a=t.resolve(r),o=[t.resolve(n)],l=new Set,s=[];for(;o.length>0;){let n=o.pop();if(!n||l.has(n))continue;l.add(n);let r=e.statSync(n);if(!r.isFile())continue;let i=t.relative(a,n)||n;s.push(`${i}:${r.size}:${Math.trunc(r.mtimeMs)}`);let u=e.readFileSync(n,"utf8");for(let e of function(e){let t=new Set;return eS(e,ew,t),eS(e,eb,t),[...t]}(u)){let r=function(e,n){let r=t.resolve(t.dirname(e),n),i=eI(r);if(i)return i;for(let e of ex){let t=eI(`${r}${e}`);if(t)return t}for(let e of ex){let n=eI(t.join(r,`index${e}`));if(n)return n}return null}(n,e);r&&o.push(r)}}let u=s.sort().join("|"),c=i.createHash("sha1").update(u).digest("hex");return`graph:${s.length}:${c}`}catch{return"unknown"}}function eS(e,t,n){t.lastIndex=0;let r=null;for(;null!==(r=t.exec(e));){let e=r[1]?.trim();e?.startsWith(".")&&n.add(e)}}function eI(t){try{return e.statSync(t).isFile()?t:null}catch{return null}}let e$=100,eA=new Set(["batch","replay"]),eN=new Set(["command","positionals","flags","runtime"]);function eL(e){let t;try{t=JSON.parse(e)}catch{throw new l("INVALID_ARGS","Batch steps must be valid JSON.")}if(!Array.isArray(t)||0===t.length)throw new l("INVALID_ARGS","Batch steps must be a non-empty JSON array.");return t}function eC(e,t){if(!Array.isArray(e)||0===e.length)throw new l("INVALID_ARGS","batch requires a non-empty batchSteps array.");if(e.length>t)throw new l("INVALID_ARGS",`batch has ${e.length} steps; max allowed is ${t}.`);let n=[];for(let t=0;t<e.length;t+=1){let r=e[t];if(!r||"object"!=typeof r)throw new l("INVALID_ARGS",`Invalid batch step at index ${t}.`);let i=Object.keys(r).filter(e=>!eN.has(e));if(i.length>0){let e=i.map(e=>`"${e}"`).join(", ");throw new l("INVALID_ARGS",`Batch step ${t+1} has unknown field(s): ${e}. Allowed fields: command, positionals, flags, runtime.`)}let a="string"==typeof r.command?r.command.trim().toLowerCase():"";if(!a)throw new l("INVALID_ARGS",`Batch step ${t+1} requires command.`);if(eA.has(a))throw new l("INVALID_ARGS",`Batch step ${t+1} cannot run ${a}.`);if(void 0!==r.positionals&&!Array.isArray(r.positionals))throw new l("INVALID_ARGS",`Batch step ${t+1} positionals must be an array.`);let o=r.positionals??[];if(o.some(e=>"string"!=typeof e))throw new l("INVALID_ARGS",`Batch step ${t+1} positionals must contain only strings.`);if(void 0!==r.flags&&("object"!=typeof r.flags||Array.isArray(r.flags)||!r.flags))throw new l("INVALID_ARGS",`Batch step ${t+1} flags must be an object.`);if(void 0!==r.runtime&&("object"!=typeof r.runtime||Array.isArray(r.runtime)||!r.runtime))throw new l("INVALID_ARGS",`Batch step ${t+1} runtime must be an object.`);n.push({command:a,positionals:o,flags:r.flags??{},runtime:r.runtime})}return n}function eR(e){let t=e.appId??e.bundleId??e.packageName;return{session:e.session,appId:t,appBundleId:e.bundleId,package:e.packageName}}function ek(e,t,n){return{deviceId:t,deviceName:n,..."android"===e?{serial:t}:"ios"===e?{udid:t}:{}}}function eM(e,t={}){let n=t.includeAndroidSerial??!0;return{platform:e.platform,target:e.target,device:e.name,id:e.id,..."ios"===e.platform?{device_udid:e.ios?.udid??e.id,ios_simulator_device_set:e.ios?.simulatorSetPath??null}:{},..."android"===e.platform&&n?{serial:e.android?.serial??e.id}:{}}}function e_(e){return{name:e.name,...eM(e.device,{includeAndroidSerial:!1}),createdAt:e.createdAt}}function eE(e){return{platform:e.platform,id:e.id,name:e.name,kind:e.kind,target:e.target,..."boolean"==typeof e.booted?{booted:e.booted}:{}}}function eD(e){let t=e.created?"Created":"Reused",n=e.booted?" (booted)":"";return Y({udid:e.udid,device:e.device,runtime:e.runtime,ios_simulator_device_set:e.iosSimulatorDeviceSet??null,created:e.created,booted:e.booted},`${t}: ${e.device} ${e.udid}${n}`)}function eP(e){return e.bundleId??e.package??e.app}function eT(e){return Y({app:e.app,appPath:e.appPath,platform:e.platform,...e.appId?{appId:e.appId}:{},...e.bundleId?{bundleId:e.bundleId}:{},...e.package?{package:e.package}:{}},`Installed: ${eP(e)}`)}function ez(e){return e.appName??e.bundleId??e.packageName??e.launchTarget}function ej(e){return Y({launchTarget:e.launchTarget,...e.appName?{appName:e.appName}:{},...e.appId?{appId:e.appId}:{},...e.bundleId?{bundleId:e.bundleId}:{},...e.packageName?{package:e.packageName}:{},...e.installablePath?{installablePath:e.installablePath}:{},...e.archivePath?{archivePath:e.archivePath}:{},...e.materializationId?{materializationId:e.materializationId}:{},...e.materializationExpiresAt?{materializationExpiresAt:e.materializationExpiresAt}:{}},`Installed: ${ez(e)}`)}function eB(e){let t=e.appName??e.appBundleId??e.session;return Y({session:e.session,...e.appName?{appName:e.appName}:{},...e.appBundleId?{appBundleId:e.appBundleId}:{},...e.startup?{startup:e.startup}:{},...e.runtime?{runtime:e.runtime}:{},...e.device?eM(e.device):{}},t?`Opened: ${t}`:"Opened")}function eG(e){return{session:e.session,...e.shutdown?{shutdown:e.shutdown}:{},...Q(e.session?`Closed: ${e.session}`:"Closed")}}function eO(e){return{nodes:e.nodes,truncated:e.truncated,...e.appName?{appName:e.appName}:{},...e.appBundleId?{appBundleId:e.appBundleId}:{},...e.visibility?{visibility:e.visibility}:{},...e.warnings&&e.warnings.length>0?{warnings:e.warnings}:{}}}function eV(e,t){try{return a.sync.read(e)}catch(e){throw new l("COMMAND_FAILED",`Failed to decode ${t} as PNG`,{label:t,reason:e instanceof Error?e.message:String(e)})}}export{e$ as DEFAULT_BATCH_MAX_STEPS,v as SESSION_SURFACES,w as SETTINGS_INVALID_ARGS_MESSAGE,g as SETTINGS_USAGE_OVERRIDE,M as attachRefs,eR as buildAppIdentifiers,ek as buildDeviceIdentifiers,U as buildMobileSnapshotPresentation,A as buildSnapshotDisplayLines,D as centerOfRect,ey as computeDaemonCodeSignature,z as containsPoint,eV as decodePng,L as displayLabel,T as distanceFromSafeViewportBand,ec as expandUserHomePath,S as extractReadableText,E as findNodeByRef,Z as findProjectRoot,C as formatRole,N as formatSnapshotLine,x as getUnsupportedMacOsSettingMessage,ea as isAgentDeviceDaemonProcess,b as isMacOsSettingSupported,W as isNodeVisibleInEffectiveViewport,en as isProcessAlive,V as isScrollableType,_ as normalizeRef,G as normalizeSnapshotTree,eg as normalizeTenantId,eL as parseBatchStepsJson,y as parseSessionSurface,j as pickLargestRect,ee as readCommandMessage,ei as readProcessCommand,er as readProcessStartTime,K as readVersion,ev as resolveDaemonCodeSignature,ef as resolveDaemonPaths,ep as resolveDaemonServerMode,em as resolveDaemonTransportPreference,eP as resolveDeployResultTarget,H as resolveEffectiveViewportRect,ez as resolveInstallFromSourceResultTarget,eh as resolveSessionIsolationMode,ed as resolveUserPath,P as resolveViewportRect,eG as serializeCloseResult,eT as serializeDeployResult,eE as serializeDevice,eD as serializeEnsureSimulatorResult,ej as serializeInstallFromSourceResult,eB as serializeOpenResult,e_ as serializeSessionListEntry,eO as serializeSnapshotResult,es as stopProcessForTakeover,Q as successText,eC as validateAndNormalizeBatchSteps,el as waitForProcessExit,Y as withSuccessText};