agent-device 0.16.7 → 0.16.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/android-multitouch-helper/dist/{agent-device-android-multitouch-helper-0.16.7.apk → agent-device-android-multitouch-helper-0.16.8.apk} +0 -0
  2. package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.16.8.apk.sha256 +1 -0
  3. package/android-multitouch-helper/dist/{agent-device-android-multitouch-helper-0.16.7.manifest.json → agent-device-android-multitouch-helper-0.16.8.manifest.json} +4 -4
  4. package/android-snapshot-helper/dist/{agent-device-android-snapshot-helper-0.16.7.apk → agent-device-android-snapshot-helper-0.16.8.apk} +0 -0
  5. package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.16.8.apk.sha256 +1 -0
  6. package/android-snapshot-helper/dist/{agent-device-android-snapshot-helper-0.16.7.manifest.json → agent-device-android-snapshot-helper-0.16.8.manifest.json} +6 -6
  7. package/dist/src/1352.js +1 -1
  8. package/dist/src/2415.js +29 -29
  9. package/dist/src/2805.js +1 -1
  10. package/dist/src/6232.js +1 -0
  11. package/dist/src/7455.js +1 -0
  12. package/dist/src/8699.js +1 -1
  13. package/dist/src/940.js +1 -1
  14. package/dist/src/9471.js +1 -1
  15. package/dist/src/9533.js +1 -1
  16. package/dist/src/9542.js +1 -1
  17. package/dist/src/9818.js +1 -1
  18. package/dist/src/android-adb.d.ts +2 -0
  19. package/dist/src/android-snapshot-helper.d.ts +2 -0
  20. package/dist/src/args.js +5 -4
  21. package/dist/src/cli.js +6 -6
  22. package/dist/src/command-metadata.js +1 -1
  23. package/dist/src/find.js +1 -1
  24. package/dist/src/generic.js +10 -7
  25. package/dist/src/interaction.js +1 -1
  26. package/dist/src/react-native.js +1 -1
  27. package/dist/src/record-trace.js +3 -3
  28. package/dist/src/selector-runtime.js +1 -1
  29. package/dist/src/session.js +9 -9
  30. package/dist/src/snapshot.js +2 -2
  31. package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +20 -6
  32. package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +178 -74
  33. package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Lifecycle.swift +8 -33
  34. package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +71 -1
  35. package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Snapshot.swift +80 -10
  36. package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TvRemote.swift +34 -6
  37. package/package.json +4 -6
  38. package/server.json +2 -2
  39. package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.16.7.apk.sha256 +0 -1
  40. package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.16.7.apk.sha256 +0 -1
  41. package/dist/src/5186.js +0 -1
package/dist/src/9542.js CHANGED
@@ -1,3 +1,3 @@
1
- import e from"node:net";import t from"node:http";import a from"node:https";import r from"node:fs";import o from"node:os";import n from"node:path";import{pipeline as i}from"node:stream/promises";import{createHash as s,randomUUID as l}from"node:crypto";import{Writable as c}from"node:stream";import{toAppErrorCode as d,AppError as u}from"./9152.js";import{runCmdSync as p,runCmd as m,runCmdDetached as f}from"./9818.js";import{formatRequestProgressEvent as h,consumeTextLines as y,shouldStreamRequestProgress as w,isDaemonResponseEnvelope as I,isDaemonProgressEnvelope as g,resolveDaemonPaths as v,resolveDaemonServerMode as A,computeDaemonCodeSignature as _,resolveDaemonTransportPreference as k}from"./8114.js";import{readVersion as P,findProjectRoot as S}from"./9671.js";import{createRequestId as b,withDiagnosticTimer as D,emitDiagnostic as E}from"./7599.js";import{isAgentDeviceDaemonProcess as M,stopProcessForTakeover as T}from"./8656.js";import{INTERNAL_COMMANDS as C,PUBLIC_COMMANDS as N}from"./5792.js";import{sleep as U}from"./4829.js";import{reloadMetro as L,prepareMetroRuntime as R}from"./1974.js";import{normalizeSession as O,resolveSessionName as x,buildFlags as F,normalizeStartupSample as q,normalizeInstallFromSourceResult as B,normalizeMaterializationReleaseResult as $,prepareDaemonCommandRequest as j,readSnapshotNodes as H,normalizeRuntimeHints as K,normalizeDeployResult as G,normalizeOpenDevice as z,readScreenshotOverlayRefs as V,buildMeta as W,normalizeDevice as J}from"./8699.js";import{readRequiredString as Y,readOptionalString as Q}from"./2805.js";function X(e){return new Promise((t,a)=>{let r="";e.setEncoding("utf8"),e.on("data",e=>{r+=e}),e.on("end",()=>t(r)),e.on("error",a)})}let Z="sha256";async function ee(e){let t=await et(e.localPath,e.platform),a=e.baseUrl.endsWith("/")?e.baseUrl:`${e.baseUrl}/`;try{let r=await en({normalizedBase:a,token:e.token,artifact:t});if(r?.kind==="cache-hit")return r.uploadId;if(r?.kind==="direct-upload")try{return await ei(t.payloadPath,r),await el({normalizedBase:a,token:e.token,uploadId:r.uploadId})}catch{}return await eo({normalizedBase:a,token:e.token,artifact:t})}finally{t.cleanup()}}async function et(e,t){var a,o,i;let s,l=r.statSync(e),c=n.basename(e),d=l.isDirectory(),u=("ios"===(a=t)||"android"===a?a:void 0)??(o=e,i=l,s=o.toLowerCase(),i.isDirectory()&&s.endsWith(".app")||s.endsWith(".ipa")?"ios":s.endsWith(".apk")||s.endsWith(".aab")?"android":void 0),p=[];try{let t=d?await ea(e,p):e,a=r.statSync(t);return{payloadPath:t,fileName:c,artifactType:d?"app-bundle":"file",platform:u,contentType:d?"application/gzip":"application/octet-stream",sha256:await ec(t),sizeBytes:a.size,cleanup:()=>er(p)}}catch(e){throw er(p),e}}async function ea(e,t){let a=r.mkdtempSync(n.join(o.tmpdir(),`agent-device-upload-${l()}-`));t.push(a);let i=n.join(a,`${n.basename(e)}.tar.gz`);return await m("tar",["czf",i,"-C",n.dirname(e),n.basename(e)],{env:{...process.env,COPYFILE_DISABLE:"1"}}),i}function er(e){for(let t of e)r.rmSync(t,{recursive:!0,force:!0})}async function eo(e){let{normalizedBase:t,token:a,artifact:r}=e,o=new URL("upload",t),n={"content-type":r.contentType,"x-artifact-type":r.artifactType,"x-artifact-filename":r.fileName,"x-artifact-hash":r.sha256,"x-artifact-hash-algorithm":Z,"transfer-encoding":"chunked"};a&&(n.authorization=`Bearer ${a}`,n["x-agent-device-token"]=a);let i=await es({url:o,method:"POST",headers:n,payloadPath:r.payloadPath,timeoutMessage:"Artifact upload timed out",timeoutHint:"The upload to the remote daemon exceeded the 5-minute timeout.",errorMessage:"Failed to upload artifact to remote daemon",errorHint:"Verify the remote daemon is reachable and supports artifact uploads."});try{let e=JSON.parse(i.body);if(!e.ok||!e.uploadId)throw new u("COMMAND_FAILED",`Upload failed: ${i.body}`);return e.uploadId}catch(e){if(e instanceof u)throw e;throw new u("COMMAND_FAILED",`Invalid upload response: ${i.body}`)}}async function en(e){let t=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 r=await fetch(t,{method:"POST",headers:a,signal:AbortSignal.timeout(3e4),body:JSON.stringify({sha256:e.artifact.sha256,fileName:e.artifact.fileName,sizeBytes:e.artifact.sizeBytes,artifactType:e.artifact.artifactType,...e.artifact.platform?{platform:e.artifact.platform}:{},contentType:e.artifact.contentType})}).catch(()=>void 0);if(r?.ok)return function(e){var t;if(!e||"object"!=typeof e||!0!==e.ok||"string"!=typeof e.uploadId)return;if(!0===e.cacheHit)return{kind:"cache-hit",uploadId:e.uploadId};let a=e.upload;if(!a||"string"!=typeof a.url)return;let r=a.headers??{};if(!(!(t=r)||"object"!=typeof t||Array.isArray(t))&&Object.values(t).every(e=>"string"==typeof e))return{kind:"direct-upload",uploadId:e.uploadId,url:a.url,headers:r}}(await r.json().catch(()=>void 0))}async function ei(e,t){let a=await es({url:new URL(t.url),method:"PUT",headers:t.headers,payloadPath:e,timeoutMessage:"Direct artifact upload timed out",timeoutHint:"The direct upload ticket did not accept the artifact within the timeout.",errorMessage:"Failed to upload artifact with direct upload ticket"});if(a.statusCode<200||a.statusCode>=300)throw new u("COMMAND_FAILED","Direct artifact upload failed",{statusCode:a.statusCode,statusMessage:a.statusMessage})}async function es(e){let o="https:"===e.url.protocol?a:t;return await new Promise((t,a)=>{let n=o.request({protocol:e.url.protocol,host:e.url.hostname,port:e.url.port,method:e.method,path:e.url.pathname+e.url.search,headers:e.headers},e=>{X(e).then(a=>{clearTimeout(s),t({statusCode:e.statusCode??500,statusMessage:e.statusMessage,body:a})}).catch(a)}),s=setTimeout(()=>{n.destroy(),a(new u("COMMAND_FAILED",e.timeoutMessage,{timeoutMs:3e5,...e.timeoutHint?{hint:e.timeoutHint}:{}}))},3e5);n.on("error",t=>{clearTimeout(s),a(new u("COMMAND_FAILED",e.errorMessage,e.errorHint?{hint:e.errorHint}:{},t))}),n.on("close",()=>clearTimeout(s)),i(r.createReadStream(e.payloadPath),n).catch(e=>{n.destroy(),a(new u("COMMAND_FAILED","Failed to read local artifact",{},e instanceof Error?e:Error(String(e))))})})}async function el(e){let t=new URL("upload/finalize",e.normalizedBase),a={"content-type":"application/json"};e.token&&(a.authorization=`Bearer ${e.token}`,a["x-agent-device-token"]=e.token);let r=await fetch(t,{method:"POST",headers:a,signal:AbortSignal.timeout(3e4),body:JSON.stringify({uploadId:e.uploadId})}).catch(e=>{throw new u("COMMAND_FAILED","Failed to finalize direct artifact upload",{},e)});if(!r.ok)throw new u("COMMAND_FAILED","Direct artifact upload finalize failed",{status:r.status,statusText:r.statusText});let o=await r.json().catch(()=>void 0);if(!o?.ok||!o.uploadId)throw new u("COMMAND_FAILED","Invalid upload finalize response");return o.uploadId}async function ec(e){let t=s(Z),a=new c({write(e,a,r){t.update(e),r()}});return await i(r.createReadStream(e),a).catch(e=>{throw new u("COMMAND_FAILED","Failed to read local artifact",{},e instanceof Error?e:void 0)}),t.digest("hex")}function ed(e){let t=h(e);t&&process.stderr.write(`${t}
1
+ import e from"node:net";import t from"node:http";import a from"node:https";import r from"node:fs";import o from"node:os";import n from"node:path";import{pipeline as i}from"node:stream/promises";import{createHash as s,randomUUID as l}from"node:crypto";import{Writable as c}from"node:stream";import{toAppErrorCode as d,AppError as u}from"./9152.js";import{runCmdSync as p,runCmd as m,runCmdDetached as f}from"./9818.js";import{formatRequestProgressEvent as h,consumeTextLines as y,shouldStreamRequestProgress as w,isDaemonResponseEnvelope as I,isDaemonProgressEnvelope as g,resolveDaemonPaths as v,resolveDaemonServerMode as A,computeDaemonCodeSignature as _,resolveDaemonTransportPreference as k}from"./8114.js";import{readVersion as P,findProjectRoot as S}from"./9671.js";import{createRequestId as b,withDiagnosticTimer as D,emitDiagnostic as E}from"./7599.js";import{isAgentDeviceDaemonProcess as M,stopProcessForTakeover as T}from"./8656.js";import{INTERNAL_COMMANDS as C,PUBLIC_COMMANDS as N}from"./5792.js";import{sleep as U}from"./4829.js";import{reloadMetro as L,prepareMetroRuntime as R}from"./1974.js";import{normalizeSession as O,resolveSessionName as x,buildFlags as F,normalizeStartupSample as q,normalizeInstallFromSourceResult as B,normalizeMaterializationReleaseResult as $,prepareDaemonCommandRequest as j,readSnapshotNodes as H,normalizeRuntimeHints as K,normalizeDeployResult as G,normalizeOpenDevice as z,readScreenshotOverlayRefs as V,buildMeta as W,normalizeDevice as J}from"./8699.js";import{readRequiredString as Y,readOptionalString as Q}from"./7455.js";function X(e){return new Promise((t,a)=>{let r="";e.setEncoding("utf8"),e.on("data",e=>{r+=e}),e.on("end",()=>t(r)),e.on("error",a)})}let Z="sha256";async function ee(e){let t=await et(e.localPath,e.platform),a=e.baseUrl.endsWith("/")?e.baseUrl:`${e.baseUrl}/`;try{let r=await en({normalizedBase:a,token:e.token,artifact:t});if(r?.kind==="cache-hit")return r.uploadId;if(r?.kind==="direct-upload")try{return await ei(t.payloadPath,r),await el({normalizedBase:a,token:e.token,uploadId:r.uploadId})}catch{}return await eo({normalizedBase:a,token:e.token,artifact:t})}finally{t.cleanup()}}async function et(e,t){var a,o,i;let s,l=r.statSync(e),c=n.basename(e),d=l.isDirectory(),u=("ios"===(a=t)||"android"===a?a:void 0)??(o=e,i=l,s=o.toLowerCase(),i.isDirectory()&&s.endsWith(".app")||s.endsWith(".ipa")?"ios":s.endsWith(".apk")||s.endsWith(".aab")?"android":void 0),p=[];try{let t=d?await ea(e,p):e,a=r.statSync(t);return{payloadPath:t,fileName:c,artifactType:d?"app-bundle":"file",platform:u,contentType:d?"application/gzip":"application/octet-stream",sha256:await ec(t),sizeBytes:a.size,cleanup:()=>er(p)}}catch(e){throw er(p),e}}async function ea(e,t){let a=r.mkdtempSync(n.join(o.tmpdir(),`agent-device-upload-${l()}-`));t.push(a);let i=n.join(a,`${n.basename(e)}.tar.gz`);return await m("tar",["czf",i,"-C",n.dirname(e),n.basename(e)],{env:{...process.env,COPYFILE_DISABLE:"1"}}),i}function er(e){for(let t of e)r.rmSync(t,{recursive:!0,force:!0})}async function eo(e){let{normalizedBase:t,token:a,artifact:r}=e,o=new URL("upload",t),n={"content-type":r.contentType,"x-artifact-type":r.artifactType,"x-artifact-filename":r.fileName,"x-artifact-hash":r.sha256,"x-artifact-hash-algorithm":Z,"transfer-encoding":"chunked"};a&&(n.authorization=`Bearer ${a}`,n["x-agent-device-token"]=a);let i=await es({url:o,method:"POST",headers:n,payloadPath:r.payloadPath,timeoutMessage:"Artifact upload timed out",timeoutHint:"The upload to the remote daemon exceeded the 5-minute timeout.",errorMessage:"Failed to upload artifact to remote daemon",errorHint:"Verify the remote daemon is reachable and supports artifact uploads."});try{let e=JSON.parse(i.body);if(!e.ok||!e.uploadId)throw new u("COMMAND_FAILED",`Upload failed: ${i.body}`);return e.uploadId}catch(e){if(e instanceof u)throw e;throw new u("COMMAND_FAILED",`Invalid upload response: ${i.body}`)}}async function en(e){let t=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 r=await fetch(t,{method:"POST",headers:a,signal:AbortSignal.timeout(3e4),body:JSON.stringify({sha256:e.artifact.sha256,fileName:e.artifact.fileName,sizeBytes:e.artifact.sizeBytes,artifactType:e.artifact.artifactType,...e.artifact.platform?{platform:e.artifact.platform}:{},contentType:e.artifact.contentType})}).catch(()=>void 0);if(r?.ok)return function(e){var t;if(!e||"object"!=typeof e||!0!==e.ok||"string"!=typeof e.uploadId)return;if(!0===e.cacheHit)return{kind:"cache-hit",uploadId:e.uploadId};let a=e.upload;if(!a||"string"!=typeof a.url)return;let r=a.headers??{};if(!(!(t=r)||"object"!=typeof t||Array.isArray(t))&&Object.values(t).every(e=>"string"==typeof e))return{kind:"direct-upload",uploadId:e.uploadId,url:a.url,headers:r}}(await r.json().catch(()=>void 0))}async function ei(e,t){let a=await es({url:new URL(t.url),method:"PUT",headers:t.headers,payloadPath:e,timeoutMessage:"Direct artifact upload timed out",timeoutHint:"The direct upload ticket did not accept the artifact within the timeout.",errorMessage:"Failed to upload artifact with direct upload ticket"});if(a.statusCode<200||a.statusCode>=300)throw new u("COMMAND_FAILED","Direct artifact upload failed",{statusCode:a.statusCode,statusMessage:a.statusMessage})}async function es(e){let o="https:"===e.url.protocol?a:t;return await new Promise((t,a)=>{let n=o.request({protocol:e.url.protocol,host:e.url.hostname,port:e.url.port,method:e.method,path:e.url.pathname+e.url.search,headers:e.headers},e=>{X(e).then(a=>{clearTimeout(s),t({statusCode:e.statusCode??500,statusMessage:e.statusMessage,body:a})}).catch(a)}),s=setTimeout(()=>{n.destroy(),a(new u("COMMAND_FAILED",e.timeoutMessage,{timeoutMs:3e5,...e.timeoutHint?{hint:e.timeoutHint}:{}}))},3e5);n.on("error",t=>{clearTimeout(s),a(new u("COMMAND_FAILED",e.errorMessage,e.errorHint?{hint:e.errorHint}:{},t))}),n.on("close",()=>clearTimeout(s)),i(r.createReadStream(e.payloadPath),n).catch(e=>{n.destroy(),a(new u("COMMAND_FAILED","Failed to read local artifact",{},e instanceof Error?e:Error(String(e))))})})}async function el(e){let t=new URL("upload/finalize",e.normalizedBase),a={"content-type":"application/json"};e.token&&(a.authorization=`Bearer ${e.token}`,a["x-agent-device-token"]=e.token);let r=await fetch(t,{method:"POST",headers:a,signal:AbortSignal.timeout(3e4),body:JSON.stringify({uploadId:e.uploadId})}).catch(e=>{throw new u("COMMAND_FAILED","Failed to finalize direct artifact upload",{},e)});if(!r.ok)throw new u("COMMAND_FAILED","Direct artifact upload finalize failed",{status:r.status,statusText:r.statusText});let o=await r.json().catch(()=>void 0);if(!o?.ok||!o.uploadId)throw new u("COMMAND_FAILED","Invalid upload finalize response");return o.uploadId}async function ec(e){let t=s(Z),a=new c({write(e,a,r){t.update(e),r()}});return await i(r.createReadStream(e),a).catch(e=>{throw new u("COMMAND_FAILED","Failed to read local artifact",{},e instanceof Error?e:void 0)}),t.digest("hex")}function ed(e){let t=h(e);t&&process.stderr.write(`${t}
2
2
  `)}let eu=["xcodebuild .*AgentDeviceRunnerUITests/RunnerTests/testCommand","xcodebuild .*AgentDeviceRunner\\.env\\.session-","xcodebuild build-for-testing .*ios-runner/AgentDeviceRunner/AgentDeviceRunner\\.xcodeproj"],ep=new e.BlockList;async function em(t){var a,i,s,l,c,d;let p,m,f,h,y,w,I,g=t.meta?.requestId??b(),_=!!(t.meta?.debug||t.flags?.verbose),P=(h=(i=a=t,i.flags?.stateDir??process.env.AGENT_DEVICE_STATE_DIR),y=(s=a,m=function(e){let t;if(e){try{t=new URL(e)}catch(t){throw new u("INVALID_ARGS","Invalid daemon base URL",{daemonBaseUrl:e},t instanceof Error?t:void 0)}if("http:"!==t.protocol&&"https:"!==t.protocol)throw new u("INVALID_ARGS","Daemon base URL must use http or https",{daemonBaseUrl:e});return t.toString().replace(/\/+$/,"")}}(p=s.flags?.daemonBaseUrl??process.env.AGENT_DEVICE_DAEMON_BASE_URL),function(t,a){let r;if(!(!t||"localhost"===(r=new URL(t).hostname.trim().toLowerCase().replace(/^\[(.*)\]$/,"$1"))||(e.isIPv4(r)?ep.check(r,"ipv4"):!!e.isIPv6(r)&&ep.check(r,"ipv6")))&&("string"!=typeof a||!(a.trim().length>0)))throw new u("INVALID_ARGS","Remote daemon base URL for non-loopback hosts requires daemon authentication",{daemonBaseUrl:t,hint:"Provide --daemon-auth-token or AGENT_DEVICE_DAEMON_AUTH_TOKEN when using a non-loopback remote daemon URL."})}(m,f=s.flags?.daemonAuthToken??process.env.AGENT_DEVICE_DAEMON_AUTH_TOKEN),{rawBaseUrl:p,remoteBaseUrl:m,authToken:f}),w=function(e,t){let a=e.flags?.daemonTransport??process.env.AGENT_DEVICE_DAEMON_TRANSPORT,r=k(a);if(t&&"socket"===r)throw new u("INVALID_ARGS","Remote daemon base URL only supports HTTP transport. Remove --daemon-transport socket.",{daemonBaseUrl:t});return{preference:r,serverMode:A(e.flags?.daemonServerMode??process.env.AGENT_DEVICE_DAEMON_SERVER_MODE??("dual"===a?"dual":void 0))}}(a,y.remoteBaseUrl),{paths:v((I=(l=a,c=h,d=y.rawBaseUrl,eS(l.command)&&!c&&!d))?r.mkdtempSync(n.join(o.tmpdir(),"agent-device-replay-daemon-")):h),transportPreference:w.preference,serverMode:w.serverMode,ownedStateDir:I,remoteBaseUrl:y.remoteBaseUrl,remoteAuthToken:y.authToken}),S=function(e){if(e.command!==N.test)return e.command===N.replay&&"number"==typeof e.flags?.timeoutMs?e.flags.timeoutMs:9e4}(t),M=await D("daemon_startup",async()=>await ev(P),{requestId:g,session:t.session}),T=M.info,C=await ef(t,T),U={...t,positionals:C.positionals,flags:C.flags,token:T.token,meta:{...t.meta??{},requestId:g,debug:_,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,...C.uploadedArtifactId?{uploadedArtifactId:C.uploadedArtifactId}:{},...C.clientArtifactPaths?{clientArtifactPaths:C.clientArtifactPaths}:{},...C.installSource?{installSource:C.installSource}:{}}};E({level:"info",phase:"daemon_request_prepare",data:{requestId:g,command:t.command,session:t.session}});try{return await D("daemon_request",async()=>await eB(T,U,P.transportPreference,S),{requestId:g,command:t.command})}finally{await eP(t,M,P)}}async function ef(e,t){let a,r=[...e.positionals??[]],o=e.flags?{...e.flags}:void 0,i=e.meta?.installSource,s={};if(!eJ(t))return ey({positionals:r,flags:o,installSource:i,uploadedArtifactId:a,clientArtifactPaths:s});o=function(e,t,a,r){var o,i;let s=function(e,t){if("screenshot"===e.command){let a=eI(e,"path",".png");return t[0]?{field:"path",localPath:a,positionalIndex:0,positionalPath:eg("screenshot",".png")}:{field:"path",localPath:a,positionalIndex:0,flagPath:eg("screenshot",".png")}}if("record"===e.command&&"start"===(t[0]??"").toLowerCase()){let t=eI(e,"outPath",".mp4",1);return{field:"outPath",localPath:t,positionalIndex:1,positionalPath:eg("recording",n.extname(t)||".mp4")}}return null}(e,t);if(!s)return a;void 0!==s.positionalPath&&(t[s.positionalIndex]=s.positionalPath);let l=(o=a,void 0===(i=s.flagPath)?o:{...o??{},out:i});return r[s.field]=s.localPath,l}(e,r,o,s);let l=await ew(e,t);l&&(i=l.installSource,a=l.uploadedArtifactId??a);let c=()=>ey({positionals:r,flags:o,installSource:i,uploadedArtifactId:a,clientArtifactPaths:s});return"install"!==e.command&&"reinstall"!==e.command||(a=await eh(e,t,r)??a),c()}async function eh(e,t,a){var o,i;let s,l=a[1];if(void 0===l)return;if(l.startsWith("remote:")){a[1]=l.slice(7);return}let c=(o=l,i=e.meta?.cwd,s=n.isAbsolute(o)?o:n.resolve(i??process.cwd(),o),r.existsSync(s)?s:void 0);if(c)return await ee({localPath:c,baseUrl:t.baseUrl,token:t.token,platform:e.flags?.platform})}function ey(e){return{positionals:e.positionals,flags:e.flags,installSource:e.installSource,uploadedArtifactId:e.uploadedArtifactId,...Object.keys(e.clientArtifactPaths).length>0?{clientArtifactPaths:e.clientArtifactPaths}:{}}}async function ew(e,t){let a=e.meta?.installSource;if("install_source"!==e.command||!a||"path"!==a.kind)return null;let o=a.path.trim();if(!o)return{installSource:a};if(o.startsWith("remote:"))return{installSource:{...a,path:o.slice(7)}};let i=n.isAbsolute(o)?o:n.resolve(e.meta?.cwd??process.cwd(),o);if(!r.existsSync(i))return{installSource:{...a,path:i}};let s=await ee({localPath:i,baseUrl:t.baseUrl,token:t.token,platform:e.flags?.platform});return{installSource:{...a,path:i},uploadedArtifactId:s}}function eI(e,t,a,r=0){let o=e.positionals?.[r]??e.flags?.out,i=`${"path"===t?"screenshot":"recording"}-${Date.now()}${a}`,s=o&&o.trim().length>0?o:i;return n.isAbsolute(s)?s:n.resolve(e.meta?.cwd??process.cwd(),s)}function eg(e,t){let a=t.startsWith(".")?t:`.${t}`;return n.posix.join("/tmp",`agent-device-${e}-${Date.now()}-${Math.random().toString(36).slice(2,8)}${a}`)}async function ev(e){if(e.remoteBaseUrl)return await eA(e);let t=await e_(e);return t?{info:t,startedByClient:!1}:(function(e){let t=eL(e);if(!t.hasLock||t.hasInfo)return;let a=eN(e.lockPath);if(!a)return eO(e.lockPath);M(a.pid,a.processStartTime)||eO(e.lockPath)}(e.paths),await ek(e))}async function eA(e){let t={transport:"http",token:e.remoteAuthToken??"",pid:0,baseUrl:e.remoteBaseUrl};if(await ex(t,"http"))return{info:t,startedByClient:!1};throw new u("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."})}async function e_(e){var t,a;let r,o=eM(e.paths.infoPath);if(!o)return null;let n=await ex(o,e.transportPreference);return(t=o,a=n,t.version===P()&&t.codeSignature===_((r=eq()).useSrc?r.srcPath:r.distPath,r.root)&&a)?o:(await eE(o),eO(e.paths.infoPath),null)}async function ek(e){let t,a=0,r=[];for(let o=1;o<=2;o+=1){try{await eF(e)}catch(a){if(t=a instanceof Error?a.message:String(a),r.push(await eU(e.paths,"start_error")),o<2){await U(150);continue}break}let n=await eb(15e3,e);if(n)return{info:n,startedByClient:!0};if(await eD(e.paths)){a+=1;continue}let i=eL(e.paths),s=o<2,l=await eU(e.paths,"startup_timeout",{stopLiveProcesses:!1});if(r.push(l),l.retainedInfoProcess||l.retainedLockProcess){let t=await eb(15e3,e);if(t)return{info:t,startedByClient:!0};break}if(!s)break;i.hasInfo||i.hasLock||await U(150)}let o=eL(e.paths);throw new u("COMMAND_FAILED","Failed to start daemon",{kind:"daemon_startup_failed",infoPath:e.paths.infoPath,lockPath:e.paths.lockPath,startupTimeoutMs:15e3,startupAttempts:2,lockRecoveryCount:a,cleanupResults:r,startError:t,metadataState:o,hint:function(e,t=v(process.env.AGENT_DEVICE_STATE_DIR)){return e.hasLock&&!e.hasInfo?`agent-device attempted to clean stale daemon metadata automatically, but ${t.lockPath} still exists without ${t.infoPath}. Retry with --debug; if this persists, remove ${t.lockPath} after confirming no agent-device daemon process is running.`:e.hasLock&&e.hasInfo?`agent-device attempted to clean stale daemon metadata automatically, but ${t.infoPath} and ${t.lockPath} still remain. Retry with --debug; if this persists, remove both files after confirming no agent-device daemon process is running.`:"agent-device did not observe reachable daemon metadata after retrying. Stale metadata was cleaned automatically when safe; retry with --debug and check daemon diagnostics logs."}(o,e.paths)})}async function eP(e,t,a){if(!eS(e.command)||!t.startedByClient&&!a.ownedStateDir||eJ(t.info))return;let o={pid:t.info.pid,removedInfo:!1,removedLock:!1,removedStateDir:!1,error:void 0};try{await eE(t.info)}catch(e){o.error=e instanceof Error?e.message:String(e)}finally{let e=r.existsSync(a.paths.infoPath);eO(a.paths.infoPath),o.removedInfo=e&&!r.existsSync(a.paths.infoPath);let t=r.existsSync(a.paths.lockPath);eO(a.paths.lockPath),o.removedLock=t&&!r.existsSync(a.paths.lockPath),a.ownedStateDir&&(r.rmSync(a.paths.baseDir,{recursive:!0,force:!0}),o.removedStateDir=!r.existsSync(a.paths.baseDir))}E({level:o.error?"warn":"info",phase:"daemon_replay_cleanup",data:o})}function eS(e){return e===N.replay||e===N.test}async function eb(e,t){let a=Date.now();for(;Date.now()-a<e;){let e=eM(t.paths.infoPath);if(e&&await ex(e,t.transportPreference))return e;await U(100)}return null}async function eD(e){let t=eL(e);if(!t.hasLock||t.hasInfo)return!1;let a=eN(e.lockPath);return!(a&&M(a.pid,a.processStartTime))&&(eO(e.lockPath),!0)}async function eE(e){await T(e.pid,{termTimeoutMs:3e3,killTimeoutMs:1e3,expectedStartTime:e.processStartTime})}function eM(e){var t,a,r;let o,n,i=eR(e);if(!i||"object"!=typeof i)return null;let s="string"==typeof(t=i).token&&t.token.length>0?t.token:null;if(!s)return null;let l=(o=eC((a=i).port),n=eC(a.httpPort),void 0===o&&void 0===n?null:{port:o,httpPort:n});return l?{token:s,...l,transport:"socket"===(r=i.transport)||"http"===r||"dual"===r?r:void 0,pid:eC(i.pid)??0,version:eT(i.version),codeSignature:eT(i.codeSignature),processStartTime:eT(i.processStartTime)}:null}function eT(e){return"string"==typeof e?e:void 0}function eC(e){return Number.isInteger(e)&&Number(e)>0?Number(e):void 0}function eN(e){let t=eR(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}ep.addSubnet("127.0.0.0",8,"ipv4"),ep.addAddress("::1","ipv6"),ep.addSubnet("::ffff:127.0.0.0",104,"ipv6");async function eU(e,t,a={}){let o=a.stopLiveProcesses??!0,n={reason:t,removedInfo:!1,removedLock:!1,stoppedInfoProcess:!1,stoppedLockProcess:!1};try{var i,s,l,c;let t=r.existsSync(e.infoPath),a=eM(e.infoPath);if(a){let t=M(a.pid,a.processStartTime);t&&!o?n.retainedInfoProcess=!0:(t&&(await eE(a),n.stoppedInfoProcess=!0),i=e.infoPath,eO(i),n.removedInfo=!0)}else t&&(s=e.infoPath,eO(s),n.removedInfo=!0);let d=r.existsSync(e.lockPath),u=eN(e.lockPath);if(u){let t=M(u.pid,u.processStartTime);t&&!o?n.retainedLockProcess=!0:(t&&(await T(u.pid,{termTimeoutMs:3e3,killTimeoutMs:1e3,expectedStartTime:u.processStartTime}),n.stoppedLockProcess=!0),l=e.lockPath,eO(l),n.removedLock=!0)}else d&&(c=e.lockPath,eO(c),n.removedLock=!0)}catch(e){n.error=e instanceof Error?e.message:String(e)}return E({level:n.error?"warn":"info",phase:"daemon_startup_metadata_cleanup",data:n}),n}function eL(e){return{hasInfo:r.existsSync(e.infoPath),hasLock:r.existsSync(e.lockPath)}}function eR(e){if(!r.existsSync(e))return null;try{return JSON.parse(r.readFileSync(e,"utf8"))}catch{return null}}function eO(e){try{r.existsSync(e)&&r.unlinkSync(e)}catch{}}async function ex(r,o){var n;return"http"===e$(r,o)?await function(e){let r=e.baseUrl?eY(e.baseUrl,"health"):e.httpPort?`http://127.0.0.1:${e.httpPort}/health`:null;if(!r)return Promise.resolve(!1);let o=new URL(r),n="https:"===o.protocol?a:t,i=e.baseUrl?3e3:500;return new Promise(e=>{let t=n.request({protocol:o.protocol,host:o.hostname,port:o.port,path:o.pathname+o.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()})}(r):await ((n=r.port)?new Promise(t=>{let a=!1,r=e.createConnection({host:"127.0.0.1",port:n},()=>{o(!0)}),o=e=>{a||(a=!0,r.destroy(),t(e))};r.setTimeout(500),r.on("timeout",()=>{o(!1)}),r.on("error",()=>{o(!1)})}):Promise.resolve(!1))}async function eF(e){let t=eq(),a=t.useSrc?["--experimental-strip-types",t.srcPath]:[t.distPath],r={...process.env,AGENT_DEVICE_STATE_DIR:e.paths.baseDir,AGENT_DEVICE_DAEMON_SERVER_MODE:e.serverMode};f(process.execPath,a,{env:r})}function eq(){let e=S(),t=[n.join(e,"dist","src","internal","daemon.js"),n.join(e,"dist","src","daemon.js")],a=t[0];if(void 0===a)throw new u("COMMAND_FAILED","Daemon dist path list is empty");let o=t.find(e=>r.existsSync(e))??a,i=n.join(e,"src","daemon.ts"),s=t.some(e=>r.existsSync(e)),l=r.existsSync(i);if(!s&&!l)throw new u("COMMAND_FAILED","Daemon entry not found",{distPaths:t,srcPath:i});return{root:e,distPath:o,distPaths:t,srcPath:i,useSrc:process.execArgv.includes("--experimental-strip-types")?l:!s&&l}}async function eB(e,t,a,r){return"http"===e$(e,a)?await ez(e,t,r):await eG(e,t,r)}function e$(e,t){if(e.baseUrl){if("socket"===t)throw new u("COMMAND_FAILED","Remote daemon endpoint only supports HTTP transport",{daemonBaseUrl:e.baseUrl});return"http"}if("http"===t||"socket"===t){var a=e,r=t;if(ej(a,r))return r;throw new u("COMMAND_FAILED","http"===r?"Daemon HTTP endpoint is unavailable":"Daemon socket endpoint is unavailable")}let o=("socket"===e.transport||"dual"===e.transport?["socket","http"]:["http","socket"]).find(t=>ej(e,t));if(o)return o;throw new u("COMMAND_FAILED","Daemon metadata has no reachable transport")}function ej(e,t){return"http"===t?!!e.httpPort:!!e.port}function eH(e,t,a,r,o,n){let i=o?{terminated:0}:function(){let e=0;try{for(let t of eu){let a=p("pkill",["-f",t],{allowFailure:!0});0===a.exitCode&&(e+=1)}return{terminated:e}}catch(t){return{terminated:e,error:t instanceof Error?t.message:String(t)}}}(),s=!o&&"snapshot"!==r,l=s?function(e,t){let a=!1;try{M(e.pid,e.processStartTime)&&(process.kill(e.pid,"SIGKILL"),a=!0)}catch{T(e.pid,{termTimeoutMs:3e3,killTimeoutMs:1e3,expectedStartTime:e.processStartTime})}finally{eO(t.infoPath),eO(t.lockPath)}return{forcedKill:a}}(e,t):{forcedKill:!1};return E({level:"error",phase:"daemon_request_timeout",data:{timeoutMs:n,requestId:a,command:r,timedOutRunnerPidsTerminated:i.terminated,timedOutRunnerCleanupError:i.error,daemonPidReset:s?e.pid:void 0,daemonPidForceKilled:s?l.forcedKill:void 0,daemonPreservedAfterTimeout:!o&&!s,daemonBaseUrl:e.baseUrl}}),new u("COMMAND_FAILED","Daemon request timed out",{timeoutMs:n,requestId:a,hint:function(e){let{remote:t,resetDaemon:a,command:r}=e;return t?"Retry with --debug and verify the remote daemon URL, auth token, and remote host logs.":a?"Retry with --debug and check daemon diagnostics logs. Timed-out iOS runner xcodebuild processes were terminated when detected.":`Retry with --debug and check daemon diagnostics logs. The timed-out ${r??"request"} request was canceled and iOS runner work was aborted when detected; the daemon was kept alive so the session can still be closed or inspected.`}({remote:o,resetDaemon:s,command:r})})}function eK(e,t,a){return E({level:"error",phase:"daemon_request_socket_error",data:{requestId:t,message:e instanceof Error?e.message:String(e)}}),new u("COMMAND_FAILED","Failed to communicate with daemon",{requestId:t,hint:a?"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 eG(t,a,r){let o=t.port;if(!o)throw new u("COMMAND_FAILED","Daemon socket endpoint is unavailable");return new Promise((n,i)=>{let s=e.createConnection({host:"127.0.0.1",port:o},()=>{s.write(`${JSON.stringify(a)}
3
3
  `)}),l=v(a.flags?.stateDir??process.env.AGENT_DEVICE_STATE_DIR),c=!1,d="number"==typeof r?setTimeout(()=>{c=!0,s.destroy(),i(eH(t,l,a.meta?.requestId,a.command,!1,r))},r):void 0,p="";s.setEncoding("utf8"),s.on("data",e=>{if(c)return;let t=y(p,e);for(let e of(p=t.buffer,t.lines))try{let t=JSON.parse(e);if(g(t)){ed(t.event);continue}let a=I(t)?t.response:t;c=!0,s.end(),d&&clearTimeout(d),n(a);return}catch(t){c=!0,d&&clearTimeout(d),i(new u("COMMAND_FAILED","Invalid daemon response",{requestId:a.meta?.requestId,line:e},t instanceof Error?t:void 0));return}}),s.on("error",e=>{c||(c=!0,d&&clearTimeout(d),i(eK(e,a.meta?.requestId,!1)))})})}async function ez(e,r,o){var n,i,s;let l,c=e.baseUrl?new URL(eY(e.baseUrl,"rpc")):e.httpPort?new URL(`http://127.0.0.1:${e.httpPort}/rpc`):null;if(!c)throw new u("COMMAND_FAILED","Daemon HTTP endpoint is unavailable");let d=JSON.stringify((n=r,i={includeTokenParam:!e.baseUrl},l=n.meta?.requestId??b(),"lease_allocate"!==(s=n.command)&&"lease_heartbeat"!==s&&"lease_release"!==s?{jsonrpc:"2.0",id:l,method:"agent_device.command",params:n}:{jsonrpc:"2.0",id:l,method:function(e){switch(e){case"lease_allocate":return"agent_device.lease.allocate";case"lease_heartbeat":return"agent_device.lease.heartbeat";case"lease_release":return"agent_device.lease.release"}}(n.command),params:function(e,t,a){let r={...a.includeTokenParam?{token:e.token}:{},session:e.session,tenantId:e.meta?.tenantId,runId:e.meta?.runId};switch(t){case"lease_allocate":return{...r,ttlMs:e.meta?.leaseTtlMs,backend:e.meta?.leaseBackend};case"lease_heartbeat":return{...r,leaseId:e.meta?.leaseId,ttlMs:e.meta?.leaseTtlMs};case"lease_release":return{...r,leaseId:e.meta?.leaseId}}}(n,n.command,i)})),p={"content-type":"application/json","content-length":Buffer.byteLength(d)};return e.baseUrl&&e.token&&(p.authorization=`Bearer ${e.token}`,p["x-agent-device-token"]=e.token),await new Promise((n,i)=>{let s=v(r.flags?.stateDir??process.env.AGENT_DEVICE_STATE_DIR),l=("https:"===c.protocol?a:t).request({protocol:c.protocol,host:c.hostname,port:c.port,method:"POST",path:c.pathname+c.search,headers:p},t=>{var a;(a=t.headers?.["content-type"],w(r)&&String(Array.isArray(a)?a.join(","):a??"").includes("application/x-ndjson"))?function(e,t){let{req:a,handleResponseBody:r,reject:o,clearTimeout:n}=t,i="",s=!1,l=e=>{try{let t=JSON.parse(e);if(g(t))return ed(t.event),!1;if(I(t))return s=!0,n(),r(JSON.stringify(t.response)),!0;throw Error("Missing daemon progress response envelope")}catch(t){return s=!0,n(),o(new u("COMMAND_FAILED","Invalid daemon response",{requestId:a.meta?.requestId,line:e},t instanceof Error?t:void 0)),!0}};e.setEncoding("utf8"),e.on("data",e=>{if(s)return;let t=y(i,e);for(let e of(i=t.buffer,t.lines))if(e&&l(e))return}),e.on("end",()=>{if(s)return;let e=i.trim();e&&l(e)||(s=!0,n(),o(new u("COMMAND_FAILED","Invalid daemon response",{requestId:a.meta?.requestId,line:e})))}),e.on("error",e=>{s||(s=!0,n(),o(new u("COMMAND_FAILED","Failed to read daemon response",{requestId:a.meta?.requestId},e instanceof Error?e:void 0)))})}(t,{req:r,reject:i,clearTimeout:()=>{f&&clearTimeout(f)},handleResponseBody:t=>eV(t,{info:e,req:r,resolve:n,reject:i})}):X(t).then(t=>{f&&clearTimeout(f),eV(t,{info:e,req:r,resolve:n,reject:i})}).catch(e=>{f&&clearTimeout(f),i(new u("COMMAND_FAILED","Failed to read daemon response",{requestId:r.meta?.requestId},e instanceof Error?e:void 0))})}),m=eJ(e),f="number"==typeof o?setTimeout(()=>{l.destroy(),i(eH(e,s,r.meta?.requestId,r.command,m,o))},o):void 0;l.on("error",e=>{f&&clearTimeout(f),i(eK(e,r.meta?.requestId,m))}),l.write(d),l.end()})}function eV(e,t){let{info:a,req:r,resolve:o,reject:n}=t;try{var i,s,l;let t=(i=e,JSON.parse(i));if(t.error){let e;return void n((s=t.error,l=r.meta?.requestId,e=s.data??{},new u(d(null!=e.code?String(e.code):void 0,"COMMAND_FAILED"),String(e.message??s.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:l})))}if(!t.result||"object"!=typeof t.result)return void n(new u("COMMAND_FAILED","Invalid daemon RPC response",{requestId:r.meta?.requestId}));eW(a,r,t.result,o,n)}catch(t){n(new u("COMMAND_FAILED","Invalid daemon response",{requestId:r.meta?.requestId,line:e},t instanceof Error?t:void 0))}}async function eW(e,t,a,r,o){try{r(e.baseUrl&&a.ok?await eQ(e,t,a):a)}catch(e){o(e)}}function eJ(e){return"string"==typeof e.baseUrl&&e.baseUrl.length>0}function eY(e,t){return new URL(t,e.endsWith("/")?e:`${e}/`).toString()}async function eQ(e,t,a){let r=Array.isArray(a.data?.artifacts)?a.data.artifacts:[];if(0===r.length||!e.baseUrl)return a;let o=a.data?{...a.data}:{},i=[];for(let a of r){if(!a||"object"!=typeof a||"string"!=typeof a.artifactId){i.push(a);continue}let r=function(e,t){if(e.localPath&&e.localPath.trim().length>0)return e.localPath;let a=t.meta?.clientArtifactPaths?.[e.field];if(a&&a.trim().length>0)return a;let r=e.fileName?.trim()||`${e.field}-${Date.now()}`;return n.resolve(t.meta?.cwd??process.cwd(),r)}(a,t);await eX({baseUrl:e.baseUrl,token:e.token,artifactId:a.artifactId,destinationPath:r,requestId:t.meta?.requestId}),o[a.field]=r,i.push({...a,localPath:r})}return o.artifacts=i,{ok:!0,data:o}}async function eX(e){var o,s;let l,c=new URL((o=e.baseUrl,s=e.artifactId,l=o.endsWith("/")?o:`${o}/`,new URL(`artifacts/${encodeURIComponent(s)}`,l).toString())),d="https:"===c.protocol?a:t;await r.promises.mkdir(n.dirname(e.destinationPath),{recursive:!0}),await new Promise((t,a)=>{let o=!1,n=e.timeoutMs??9e4,s=n=>{if(!o){if(o=!0,clearTimeout(p),n)return void r.promises.rm(e.destinationPath,{force:!0}).finally(()=>a(n));t()}},l=d.request({protocol:c.protocol,host:c.hostname,port:c.port,method:"GET",path:c.pathname+c.search,headers:e.token?{authorization:`Bearer ${e.token}`,"x-agent-device-token":e.token}:void 0},t=>{if((t.statusCode??500)>=400){let a="";t.setEncoding("utf8"),t.on("data",e=>{a+=e}),t.on("end",()=>{s(new u("COMMAND_FAILED","Failed to download remote artifact",{artifactId:e.artifactId,statusCode:t.statusCode,requestId:e.requestId,body:a}))});return}t.on("aborted",()=>{s(new u("COMMAND_FAILED","Remote artifact download was interrupted",{artifactId:e.artifactId,requestId:e.requestId}))}),i(t,r.createWriteStream(e.destinationPath)).then(()=>s(),e=>s(e instanceof Error?e:Error(String(e))))}),p=setTimeout(()=>{let t=new u("COMMAND_FAILED","Remote artifact download timed out",{artifactId:e.artifactId,requestId:e.requestId,timeoutMs:n});s(t),l.destroy(t)},n);l.on("error",t=>{t instanceof u?s(t):s(new u("COMMAND_FAILED","Failed to download remote artifact",{artifactId:e.artifactId,requestId:e.requestId,timeoutMs:n},t instanceof Error?t:void 0))}),l.end()})}function eZ(e={},t={}){let a=t.transport??em,r=async(t,r=[],o={})=>{var n,i;let s=(n=e,i=o,{...n,...i}),l=await a({session:x(s.session),command:t,positionals:r,flags:F(s),runtime:s.runtime,meta:W(s)});return l.ok||function(e){throw new u(d(e.code),e.message,{...e.details??{},hint:e.hint,diagnosticId:e.diagnosticId,logPath:e.logPath})}(l.error),l.data??{}},o=async(e={})=>{let t=await r(C.sessionList,[],e);return(Array.isArray(t.sessions)?t.sessions:[]).map(O)},n=async(e,t={})=>{let a=j(e,t);return await r(a.command,a.positionals,a.options)},i=(t={})=>{var a,r;return x((a=e,r=t,{...a,...r}).session)};return{command:{wait:async e=>await n("wait",e),alert:async(e={})=>await n("alert",e),appState:async(e={})=>await n("appstate",e),back:async(e={})=>await n("back",e),home:async(e={})=>await n("home",e),rotate:async e=>await n("rotate",e),appSwitcher:async(e={})=>await n("app-switcher",e),keyboard:async(e={})=>await n("keyboard",e),clipboard:async e=>await n("clipboard",e),reactNative:async e=>await n("react-native",e)},devices:{list:async(e={})=>{let t=await n("devices",e);return(Array.isArray(t.devices)?t.devices:[]).map(J)},boot:async(e={})=>await n("boot",e)},sessions:{list:async(e={})=>await o(e),close:async(e={})=>{let t=i(e),a=(await n("close",e)).shutdown;return{session:t,shutdown:"object"==typeof a&&null!==a?a:void 0,identifiers:{session:t}}}},apps:{install:async e=>G(await n("install",e),i(e)),reinstall:async e=>G(await n("reinstall",e),i(e)),installFromSource:async e=>B(await n("install-from-source",e),i(e)),list:async(e={})=>{let t=await n("apps",e);return Array.isArray(t.apps)?t.apps.filter(e=>"string"==typeof e):[]},open:async e=>{let t=i(e),a=await n("open",e),r=z(a),o=Q(a,"appBundleId");return{session:t,appName:Q(a,"appName"),appBundleId:o,appId:o,startup:q(a.startup),runtime:K(a.runtime),device:r,identifiers:{session:t,deviceId:r?.id,deviceName:r?.name,udid:r?.ios?.udid,serial:r?.android?.serial,appId:o,appBundleId:o}}},close:async(e={})=>{let t=i(e),a=(await n("close",e)).shutdown;return{session:t,closedApp:e.app,shutdown:"object"==typeof a&&null!==a?a:void 0,identifiers:{session:t}}},push:async e=>await n("push",e),triggerEvent:async e=>await n("trigger-app-event",e)},materializations:{release:async e=>$(await r(C.releaseMaterializedPaths,[],{...e,materializationId:e.materializationId}))},leases:{allocate:async e=>e1(await r(C.leaseAllocate,[],{...e,leaseId:void 0,leaseTtlMs:e.ttlMs})),heartbeat:async e=>e1(await r(C.leaseHeartbeat,[],{...e,leaseTtlMs:e.ttlMs})),release:async e=>({released:!0===(await r(C.leaseRelease,[],e)).released})},metro:{prepare:async t=>await R({projectRoot:t.projectRoot??e.cwd,kind:t.kind,publicBaseUrl:t.publicBaseUrl,proxyBaseUrl:t.proxyBaseUrl,proxyBearerToken:t.bearerToken,bridgeScope:t.bridgeScope,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}),reload:async(t={})=>await L({metroHost:t.metroHost,metroPort:t.metroPort,bundleUrl:t.bundleUrl,runtime:e.runtime,timeoutMs:t.timeoutMs})},capture:{snapshot:async(e={})=>{var t,a,r;let o,s,l,c,d,u=i(e);return t=await n("snapshot",e),a=u,o=Q(t,"appBundleId"),{nodes:H(t.nodes),truncated:!0===t.truncated,appName:Q(t,"appName"),appBundleId:o,...(s=e0((r=t).visibility),l=e0(r.androidSnapshot),c=e0(r.unchanged),d=Array.isArray(r.warnings)?r.warnings.filter(e=>"string"==typeof e):void 0,{...s?{visibility:s}:{},...l?{androidSnapshot:l}:{},...c?{unchanged:c}:{},...d?{warnings:d}:{}}),identifiers:{session:a,appId:o,appBundleId:o}}},screenshot:async(e={})=>{let t=i(e),a=await n("screenshot",e);return{path:Y(a,"path"),overlayRefs:V(a),identifiers:{session:t}}},diff:async e=>await n("diff",e)},interactions:{click:async e=>await n("click",e),press:async e=>await n("press",e),longPress:async e=>await n("longpress",e),swipe:async e=>await n("swipe",e),pan:async e=>await n("gesture-pan",e),fling:async e=>await n("gesture-fling",e),swipeGesture:async e=>await n("gesture-swipe",e),focus:async e=>await n("focus",e),type:async e=>await n("type",e),fill:async e=>await n("fill",e),scroll:async e=>await n("scroll",e),pinch:async e=>await n("gesture-pinch",e),rotateGesture:async e=>await n("gesture-rotate",e),transformGesture:async e=>await n("gesture-transform",e),get:async e=>await n("get",e),is:async e=>await n("is",e),find:async e=>await n("find",e)},replay:{run:async e=>await n("replay",e),test:async e=>await n("test",e)},batch:{run:async e=>await n("batch",e)},observability:{perf:async(e={})=>await n("perf",e),logs:async(e={})=>await n("logs",e),network:async(e={})=>await n("network",e)},recording:{record:async e=>await n("record",e),trace:async e=>await n("trace",e)},settings:{update:async e=>await n("settings",e)}}}function e0(e){return"object"==typeof e&&null!==e?e:void 0}function e1(e){let t=e.lease;if(!t||"object"!=typeof t||Array.isArray(t))throw Error("Invalid lease response from daemon");return{leaseId:Y(t,"leaseId"),tenantId:Y(t,"tenantId"),runId:Y(t,"runId"),backend:Y(t,"backend"),createdAt:"number"==typeof t.createdAt?t.createdAt:void 0,heartbeatAt:"number"==typeof t.heartbeatAt?t.heartbeatAt:void 0,expiresAt:"number"==typeof t.expiresAt?t.expiresAt:void 0}}export{eZ as createAgentDeviceClient,em as sendToDaemon};
package/dist/src/9818.js CHANGED
@@ -1 +1 @@
1
- import{AsyncLocalStorage as t}from"node:async_hooks";import{constants as e}from"node:fs";import{access as r,stat as n}from"node:fs/promises";import o from"node:path";import{spawn as i,spawnSync as d}from"node:child_process";import{Readable as u}from"node:stream";import{pipeline as s}from"node:stream/promises";import{AppError as a}from"./9152.js";let c=/^[A-Za-z0-9][A-Za-z0-9._+-]*$/,f=[".com",".exe",".bat",".cmd"],l=new t;async function m(t,e){return t?await l.run(t,e):await e()}async function p(t){return await l.run(void 0,t)}async function w(t,e,r={}){let n=l.getStore()?.(t,e,r);return n?await n:await A(t,e,r)}async function h(t,e,r={}){let n=l.getStore()?.(t,e,r);return n?await n:await A(t,e,r)}function A(t,e,r={}){let n=O(t);return new Promise((o,d)=>{let u=i(n,e,{cwd:r.cwd,env:r.env,stdio:["pipe","pipe","pipe"],detached:r.detached,windowsHide:!0,shell:!1});r.onSpawn?.(u);let s="",c=r.binaryStdout?[]:void 0,f="",l=!1,m=T(r.timeoutMs),p=m?setTimeout(()=>{l=!0,P(u,r.detached)},m):null,w=x(u,r);r.binaryStdout||u.stdout.setEncoding("utf8"),u.stderr.setEncoding("utf8"),B(u,r.stdin).catch(o=>{var i,s,c,f;w.didAbort||l||(i=o)instanceof Error&&"code"in i&&"EPIPE"===i.code||(d((s=n,c=t,new a("COMMAND_FAILED",`Failed to write stdin for ${s}`,{cmd:c,args:e},(f=o)instanceof Error?f:void 0))),P(u,r.detached))}),u.stdout.on("data",t=>{if(r.binaryStdout)return void c?.push(Buffer.isBuffer(t)?t:Buffer.from(t));let e=String(t);s+=e,r.onStdoutChunk?.(e)}),u.stderr.on("data",t=>{let e=String(t);f+=e,r.onStderrChunk?.(e)}),u.on("error",r=>{p&&clearTimeout(p),w.dispose(),d(w.didAbort?C(n,t,e):I(n,t,e,r))}),u.on("close",i=>{var u,h,A,v,S,b;p&&clearTimeout(p),w.dispose();let E=i??1;w.didAbort?d(C(n,t,e)):l&&m?d((u=n,h=t,A=e,v=m,S=E,b=s,new a("COMMAND_FAILED",`${u} timed out after ${v}ms`,{cmd:h,args:A,stdout:b,stderr:f,exitCode:S,timeoutMs:v}))):0===E||r.allowFailure?o({stdout:s,stderr:f,exitCode:E,stdoutBuffer:c?Buffer.concat(c):void 0}):d($(n,t,e,E,s,f))})})}async function v(t){let e=N(t);if(!e)return!1;if(o.isAbsolute(e))return D(e);let r=process.env.PATH;if(!r)return!1;let n=function(){if("win32"!==process.platform)return[""];let t=process.env.PATHEXT;if(!t)return f;let e=t.split(";").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0);return e.length>0?e:f}();for(let t of r.split(o.delimiter)){let r=t.trim();if(r){for(let t of function(t,e){if("win32"!==process.platform)return[t];let r=t.toLowerCase();return e.some(t=>r.endsWith(t))?[t]:e.map(e=>`${t}${e}`)}(e,n))if(await D(o.join(r,t)))return!0}}return!1}async function S(t,e){let r=L(t,e,"executable");if(r){if(!await D(r))throw new a("TOOL_MISSING",`${e} points to a missing or non-executable file: ${r}`,{envName:e,path:r});return r}}async function b(t,e){let r=L(t,e,"file");if(r){if(!await F(r))throw new a("TOOL_MISSING",`${e} points to a missing or non-file path: ${r}`,{envName:e,path:r});return r}}function E(t,e,r={}){let n=O(t),o=d(n,e,{cwd:r.cwd,env:r.env,stdio:["pipe","pipe","pipe"],encoding:r.binaryStdout?void 0:"utf8",input:r.stdin,timeout:T(r.timeoutMs),windowsHide:!0,shell:!1});if(o.error){let i=o.error.code;if("ETIMEDOUT"===i)throw new a("COMMAND_FAILED",`${n} timed out after ${T(r.timeoutMs)}ms`,{cmd:t,args:e,timeoutMs:T(r.timeoutMs)},o.error);if("ENOENT"===i)throw M(n,t,o.error);throw _(n,t,e,o.error)}let i=r.binaryStdout?Buffer.isBuffer(o.stdout)?o.stdout:Buffer.from(o.stdout??""):void 0,u=r.binaryStdout?"":"string"==typeof o.stdout?o.stdout:(o.stdout??"").toString(),s="string"==typeof o.stderr?o.stderr:(o.stderr??"").toString(),c=o.status??1;if(0!==c&&!r.allowFailure)throw $(n,t,e,c,u,s);return{stdout:u,stderr:s,exitCode:c,stdoutBuffer:i}}function g(t,e,r={}){let n=i(O(t),e,{cwd:r.cwd,env:r.env,stdio:r.stdio??"ignore",detached:!0,windowsHide:!0,shell:!1});return n.unref(),n.pid??0}function y(t,e,r={}){let n=O(t),o=i(n,e,{cwd:r.cwd,env:r.env,stdio:r.stdio??["ignore","pipe","pipe"],detached:r.detached,windowsHide:!0,shell:!1}),d="",u="",s=r.captureOutput??!0,a=x(o,r);s&&(o.stdout?.setEncoding("utf8"),o.stderr?.setEncoding("utf8"),o.stdout?.on("data",t=>{d+=t}),o.stderr?.on("data",t=>{u+=t}));let c=new Promise((i,s)=>{o.on("error",r=>{a.dispose(),s(a.didAbort?C(n,t,e):I(n,t,e,r))}),o.on("close",o=>{a.dispose();let c=o??1;a.didAbort?s(C(n,t,e)):0===c||r.allowFailure?i({stdout:d,stderr:u,exitCode:c}):s($(n,t,e,c,d,u))})});return{child:o,wait:c}}function O(t){let e=N(t);if(!e)throw new a("INVALID_ARGS",`Invalid executable command: ${JSON.stringify(t)}`,{cmd:t,hint:"Use a bare command name from PATH or an absolute executable path."});return e}function I(t,e,r,n){return"ENOENT"===n.code?M(t,e,n):_(t,e,r,n)}function M(t,e,r){return new a("TOOL_MISSING",`${t} not found in PATH`,{cmd:e},r)}function _(t,e,r,n){return new a("COMMAND_FAILED",`Failed to run ${t}`,{cmd:e,args:r},n)}function C(t,e,r){return new a("COMMAND_FAILED","request canceled",{cmd:e,args:r,executable:t,reason:"request_canceled"})}function $(t,e,r,n,o,i){return new a("COMMAND_FAILED",`${t} exited with code ${n}`,{cmd:e,args:r,stdout:o,stderr:i,exitCode:n,processExitError:!0})}function L(t,e,r){let n=t?.trim();if(n){if(!o.isAbsolute(n)||n.includes("\0"))throw new a("INVALID_ARGS",`${e} must be an absolute ${r} path, not ${JSON.stringify(t)}`,{envName:e,path:t});return n}}function N(t){let e=t.trim();return!e||e.includes("\0")?null:o.isAbsolute(e)?e:e.includes("/")||e.includes("\\")?null:c.test(e)?e:null}async function D(t){try{if(!await F(t))return!1;return await r(t,"win32"===process.platform?e.F_OK:e.X_OK),!0}catch{return!1}}async function F(t){try{return(await n(t)).isFile()}catch{return!1}}function T(t){if(!Number.isFinite(t))return;let e=Math.floor(t);if(!(e<=0))return e}function x(t,e){let r=!1,n=()=>{r=!0,P(t,e.detached)};return e.signal?.aborted?n():e.signal?.addEventListener("abort",n,{once:!0}),{get didAbort(){return r},dispose:()=>{e.signal?.removeEventListener("abort",n)}}}function P(t,e){if(e&&t.pid&&"win32"!==process.platform)try{process.kill(-t.pid,"SIGKILL");return}catch{}t.kill("SIGKILL")}async function B(t,e){if(t.stdin){if(void 0===e)return void t.stdin?.end();await s(u.from([e]),t.stdin)}}export{D as isExecutablePath,S as resolveExecutableOverridePath,b as resolveFileOverridePath,w as runCmd,y as runCmdBackground,g as runCmdDetached,h as runCmdStreaming,E as runCmdSync,v as whichCmd,m as withCommandExecutorOverride,p as withoutCommandExecutorOverride};
1
+ import{AsyncLocalStorage as t}from"node:async_hooks";import{constants as e}from"node:fs";import{access as r,stat as n}from"node:fs/promises";import i from"node:path";import{spawn as o,spawnSync as u}from"node:child_process";import{Readable as d}from"node:stream";import{pipeline as s}from"node:stream/promises";import{AppError as a}from"./9152.js";let f=/^[A-Za-z0-9][A-Za-z0-9._+-]*$/,c=[".com",".exe",".bat",".cmd"],l=new t;async function m(t,e){return t?await l.run(t,e):await e()}async function p(t){return await l.run(void 0,t)}async function w(t,e,r={}){let n=l.getStore()?.(t,e,r);return n?await n:await v(t,e,r)}async function h(t,e,r={}){let n=l.getStore()?.(t,e,r);return n?await n:await v(t,e,r)}function v(t,e,r={}){let n=O(t);return new Promise((i,u)=>{let d=o(n,e,{cwd:r.cwd,env:r.env,stdio:["pipe","pipe","pipe"],detached:r.detached,windowsHide:!0,shell:!1});r.onSpawn?.(d);let s="",f=r.binaryStdout?[]:void 0,c="",l=!1,m=T(r.timeoutMs),p=m?setTimeout(()=>{l=!0,P(d,r.detached)},m):null,w=B(d,r);r.binaryStdout||d.stdout.setEncoding("utf8"),d.stderr.setEncoding("utf8"),H(d,r.stdin).catch(i=>{var o,s,f,c;w.didAbort||l||(o=i)instanceof Error&&"code"in o&&"EPIPE"===o.code||(u((s=n,f=t,new a("COMMAND_FAILED",`Failed to write stdin for ${s}`,{cmd:f,args:e},(c=i)instanceof Error?c:void 0))),P(d,r.detached))}),d.stdout.on("data",t=>{if(r.binaryStdout)return void f?.push(Buffer.isBuffer(t)?t:Buffer.from(t));let e=String(t);s+=e,r.onStdoutChunk?.(e)}),d.stderr.on("data",t=>{let e=String(t);c+=e,r.onStderrChunk?.(e)}),d.on("error",r=>{p&&clearTimeout(p),w.dispose(),u($(w,n,t,e,r))}),d.on("close",o=>{p&&clearTimeout(p),w.dispose();let d=o??1;if(!w.didAbort&&l&&m){var h,v,A,S,E,b;return void u((h=n,v=t,A=e,S=m,E=d,b=s,new a("COMMAND_FAILED",`${h} timed out after ${S}ms`,{cmd:v,args:A,stdout:b,stderr:c,exitCode:E,timeoutMs:S})))}let g=L(w,n,t,e,d,r.allowFailure,s,c);g?u(g):i({stdout:s,stderr:c,exitCode:d,stdoutBuffer:f?Buffer.concat(f):void 0})})})}async function A(t){let e=D(t);if(!e)return!1;if(i.isAbsolute(e))return x(e);let r=process.env.PATH;if(!r)return!1;let n=function(){if("win32"!==process.platform)return[""];let t=process.env.PATHEXT;if(!t)return c;let e=t.split(";").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0);return e.length>0?e:c}();for(let t of r.split(i.delimiter)){let r=t.trim();if(r){for(let t of function(t,e){if("win32"!==process.platform)return[t];let r=t.toLowerCase();return e.some(t=>r.endsWith(t))?[t]:e.map(e=>`${t}${e}`)}(e,n))if(await x(i.join(r,t)))return!0}}return!1}async function S(t,e){let r=N(t,e,"executable");if(r){if(!await x(r))throw new a("TOOL_MISSING",`${e} points to a missing or non-executable file: ${r}`,{envName:e,path:r});return r}}async function E(t,e){let r=N(t,e,"file");if(r){if(!await F(r))throw new a("TOOL_MISSING",`${e} points to a missing or non-file path: ${r}`,{envName:e,path:r});return r}}function b(t,e,r={}){let n=O(t),i=u(n,e,{cwd:r.cwd,env:r.env,stdio:["pipe","pipe","pipe"],encoding:r.binaryStdout?void 0:"utf8",input:r.stdin,timeout:T(r.timeoutMs),windowsHide:!0,shell:!1,...void 0!==r.maxBuffer?{maxBuffer:r.maxBuffer}:{}});if(i.error){let o=i.error.code;if("ETIMEDOUT"===o)throw new a("COMMAND_FAILED",`${n} timed out after ${T(r.timeoutMs)}ms`,{cmd:t,args:e,timeoutMs:T(r.timeoutMs)},i.error);if("ENOENT"===o)throw I(n,t,i.error);throw M(n,t,e,i.error)}let o=r.binaryStdout?Buffer.isBuffer(i.stdout)?i.stdout:Buffer.from(i.stdout??""):void 0,d=r.binaryStdout?"":"string"==typeof i.stdout?i.stdout:(i.stdout??"").toString(),s="string"==typeof i.stderr?i.stderr:(i.stderr??"").toString(),f=i.status??1;if(0!==f&&!r.allowFailure)throw C(n,t,e,f,d,s);return{stdout:d,stderr:s,exitCode:f,stdoutBuffer:o}}function g(t,e,r={}){let n=o(O(t),e,{cwd:r.cwd,env:r.env,stdio:r.stdio??"ignore",detached:!0,windowsHide:!0,shell:!1});return n.unref(),n.pid??0}function y(t,e,r={}){let n=O(t),i=o(n,e,{cwd:r.cwd,env:r.env,stdio:r.stdio??["ignore","pipe","pipe"],detached:r.detached,windowsHide:!0,shell:!1}),u="",d="",s=r.captureOutput??!0,a=B(i,r);s&&(i.stdout?.setEncoding("utf8"),i.stderr?.setEncoding("utf8"),i.stdout?.on("data",t=>{u+=t}),i.stderr?.on("data",t=>{d+=t}));let f=new Promise((o,s)=>{i.on("error",r=>{a.dispose(),s($(a,n,t,e,r))}),i.on("close",i=>{a.dispose();let f=i??1,c=L(a,n,t,e,f,r.allowFailure,u,d);c?s(c):o({stdout:u,stderr:d,exitCode:f})})});return{child:i,wait:f}}function O(t){let e=D(t);if(!e)throw new a("INVALID_ARGS",`Invalid executable command: ${JSON.stringify(t)}`,{cmd:t,hint:"Use a bare command name from PATH or an absolute executable path."});return e}function I(t,e,r){return new a("TOOL_MISSING",`${t} not found in PATH`,{cmd:e},r)}function M(t,e,r,n){return new a("COMMAND_FAILED",`Failed to run ${t}`,{cmd:e,args:r},n)}function _(t,e,r){return new a("COMMAND_FAILED","request canceled",{cmd:e,args:r,executable:t,reason:"request_canceled"})}function C(t,e,r,n,i,o){return new a("COMMAND_FAILED",`${t} exited with code ${n}`,{cmd:e,args:r,stdout:i,stderr:o,exitCode:n,processExitError:!0})}function $(t,e,r,n,i){return t.didAbort?_(e,r,n):"ENOENT"===i.code?I(e,r,i):M(e,r,n,i)}function L(t,e,r,n,i,o,u,d){return t.didAbort?_(e,r,n):0===i||o?null:C(e,r,n,i,u,d)}function N(t,e,r){let n=t?.trim();if(n){if(!i.isAbsolute(n)||n.includes("\0"))throw new a("INVALID_ARGS",`${e} must be an absolute ${r} path, not ${JSON.stringify(t)}`,{envName:e,path:t});return n}}function D(t){let e=t.trim();return!e||e.includes("\0")?null:i.isAbsolute(e)?e:e.includes("/")||e.includes("\\")?null:f.test(e)?e:null}async function x(t){try{if(!await F(t))return!1;return await r(t,"win32"===process.platform?e.F_OK:e.X_OK),!0}catch{return!1}}async function F(t){try{return(await n(t)).isFile()}catch{return!1}}function T(t){if(!Number.isFinite(t))return;let e=Math.floor(t);if(!(e<=0))return e}function B(t,e){let r=!1,n=()=>{r=!0,P(t,e.detached)};return e.signal?.aborted?n():e.signal?.addEventListener("abort",n,{once:!0}),{get didAbort(){return r},dispose:()=>{e.signal?.removeEventListener("abort",n)}}}function P(t,e){if(e&&t.pid&&"win32"!==process.platform)try{process.kill(-t.pid,"SIGKILL");return}catch{}t.kill("SIGKILL")}async function H(t,e){if(t.stdin){if(void 0===e)return void t.stdin?.end();await s(d.from([e]),t.stdin)}}export{x as isExecutablePath,S as resolveExecutableOverridePath,E as resolveFileOverridePath,w as runCmd,y as runCmdBackground,g as runCmdDetached,h as runCmdStreaming,b as runCmdSync,A as whichCmd,m as withCommandExecutorOverride,p as withoutCommandExecutorOverride};
@@ -219,6 +219,8 @@ declare type ExecOptions = {
219
219
  timeoutMs?: number;
220
220
  detached?: boolean;
221
221
  signal?: AbortSignal;
222
+ /** Max stdout/stderr bytes for synchronous runs (default Node ~1MB). */
223
+ maxBuffer?: number;
222
224
  };
223
225
 
224
226
  declare type ExecResult = {
@@ -275,6 +275,8 @@ declare type ExecOptions = {
275
275
  timeoutMs?: number;
276
276
  detached?: boolean;
277
277
  signal?: AbortSignal;
278
+ /** Max stdout/stderr bytes for synchronous runs (default Node ~1MB). */
279
+ maxBuffer?: number;
278
280
  };
279
281
 
280
282
  declare type ExecResult = {
package/dist/src/args.js CHANGED
@@ -284,7 +284,8 @@ React Native dev loop:
284
284
  Expo Go/dev clients are host shells. Use provided project URLs, verify with snapshot -i after opening, and ask instead of inventing app ids or URLs. Help workflow owns the full Expo URL command shapes.
285
285
 
286
286
  Overlays and busy RN UIs:
287
- If snapshot reports a React Native warning/error overlay, handle it before interacting with the app: run agent-device react-native dismiss-overlay, then agent-device snapshot -i -c. Use refs from the new snapshot.
287
+ If snapshot reports a React Native warning/error overlay, handle it before interacting with the app: run agent-device react-native dismiss-overlay. The command sends the safe LogBox/RedBox action and verifies the overlay is gone with a fresh post-dismiss snapshot.
288
+ If the command reports the overlay is still visible, use screenshot --overlay-refs for visual evidence and report the overlay instead of pressing warning/error text manually.
288
289
  Do not manually press warning/error text bodies, collapsed banner bodies, full-screen warning parents, or broad LogBox/RedBox refs. The dismiss-overlay command owns the narrow LogBox/RedBox targeting policy.
289
290
  Report the overlay in the final summary. Use screenshot --overlay-refs before dismissing only if visual evidence is required.
290
291
  If snapshot times out because the UI never becomes idle, Android accessibility may be blocked by busy or continuously changing app UI. After that timeout, use screenshot as visual truth instead of repeatedly retrying snapshots.
@@ -415,7 +416,7 @@ Rules:
415
416
  Never delete screenshots, videos, traces, or report artifacts during a session.
416
417
  Escalate to help debugging or help react-devtools when runtime symptoms require those tools.`}};function v(e){let t=e.endsWith("?"),o=t?e.slice(0,-1):e;return t?`[${o}]`:`<${o}>`}function w(e){return r().filter(t=>e.has(t.key)&&void 0!==t.usageLabel&&void 0!==t.usageDescription)}function b(e,t){return y(e,t.map(e=>({label:e.usageLabel??"",description:e.usageDescription??""})))}function y(e,t){if(0===t.length)return`${e}
417
418
  (none)`;let o=Math.max(...t.map(e=>e.label.length))+2,a=[e];for(let e of t)a.push(` ${e.label.padEnd(o)}${e.description}`);return a.join("\n")}function k(e,t){return 0===t.length?`${e}
418
- (none)`:[e,...t.map(e=>` ${e}`)].join("\n")}let x=new Set(["config","remoteConfig","help","version","batchSteps","githubActionsArtifact"]),R=new Set(["appsFilter","iosSimulatorDeviceSet","sessionLocked","sessionLockConflicts"]),A=function(){let o=new Map;for(let e of r()){let t=o.get(e.key);t?t.push(e):o.set(e.key,[e])}let a=new Map;for(let e of s)a.set(e,new Set(["*"]));for(let o of e())for(let e of t(o).allowedFlags??[]){let t=a.get(e);t&&t.has("*")||(t?t.add(o):a.set(e,new Set([o])))}return[...o.entries()].map(([e,t])=>({key:e,flagDefinitions:t,config:{enabled:!x.has(e),key:e},env:{names:R.has(e)?[]:[l(e)]},supportsCommand(t){let o=a.get(e);return!!o&&(!!o.has("*")||!!t&&o.has(t))}})).sort((e,t)=>e.key.localeCompare(t.key))}(),I=new Map(A.map(e=>[e.key,e]));function S(e){return I.get(e)}function U(e){return A.filter(t=>t.config.enabled&&t.supportsCommand(e))}function N(e,t){return S(e)?.supportsCommand(t)??!1}function D(e,t,o,a){return i(function(e){let t=e.flagDefinitions.find(e=>void 0===e.setValue);if(t)return t;let o=function(e){let t=e.flagDefinitions[0];if(!t)throw Error(`Missing flag definition for option ${e.key}`);return t}(e);if("enum"===o.type){let t=o.enumValues??e.flagDefinitions.map(e=>e.setValue).filter(e=>void 0!==e);return{...o,setValue:void 0,enumValues:t}}return o}(e),t,o,a)}function E(e){let t={json:!1,help:!1,version:!1},a=null,s=[],r=[],i=!0;for(let p=0;p<e.length;p+=1){var l,d;let u=e[p];if(i&&"--"===u){i=!1;continue}if(!i){a?s.push(u):a=T(u);continue}let f=u.startsWith("--"),h=u.startsWith("-")&&u.length>1;if(!f&&!h){a?s.push(u):a=T(u);continue}let[g,m]=f?O(u):[u,void 0],v=n(g);if(l=a,d=v,"react-devtools"===l&&(!d||!N(d.key,l))){s.push(u);continue}if(!v){if(function(e,t,a){var s;if(s=a,!/^-\d+(\.\d+)?$/.test(s)||!e)return!1;let n=o(e);if(!n||n.allowsExtraPositionals)return!0;let r=n.positionalArgs??[];return 0!==r.length&&(t.length<r.length||r.some(e=>e.includes("?")))}(a,s,u)){a?s.push(u):a=u;continue}throw new c("INVALID_ARGS",`Unknown flag: ${g}`)}let w=function(e,t,o,a){if(void 0!==e.setValue){if(void 0!==o)throw new c("INVALID_ARGS",`Flag ${t} does not take a value.`);return{value:e.setValue,consumeNext:!1}}if("boolean"===e.type){if(void 0!==o)throw new c("INVALID_ARGS",`Flag ${t} does not take a value.`);return{value:!0,consumeNext:!1}}if("booleanOrString"===e.type){if(void 0!==o){if(0===o.trim().length)throw new c("INVALID_ARGS",`Flag ${t} requires a non-empty value when provided.`);return{value:o,consumeNext:!1}}return void 0===a||_(a)||!function(e){let t=e.trim();return!(!t||/^[a-zA-Z][a-zA-Z0-9+.-]*:\/\//.test(t))&&!!(t.startsWith("./")||t.startsWith("../")||t.startsWith("~/")||t.startsWith("/")||t.includes("/")||t.includes("\\"))}(a)?{value:!0,consumeNext:!1}:{value:a,consumeNext:!0}}let s=o??a;if(void 0===s||void 0===o&&_(s))throw new c("INVALID_ARGS",`Flag ${t} requires a value.`);if("string"===e.type)return{value:s,consumeNext:void 0===o};if("enum"===e.type){if(!e.enumValues?.includes(s))throw new c("INVALID_ARGS",`Invalid ${L(t)}: ${s}`);return{value:s,consumeNext:void 0===o}}let n=Number(s);if(!Number.isFinite(n)||"number"==typeof e.min&&n<e.min||"number"==typeof e.max&&n>e.max)throw new c("INVALID_ARGS",`Invalid ${L(t)}: ${s}`);return{value:Math.floor(n),consumeNext:void 0===o}}(v,g,m,e[p+1]);w.consumeNext&&(p+=1);let b=t[v.key];if(v.multiple){let e=Array.isArray(b)?[...b,w.value]:void 0===b?[w.value]:[b,w.value];t[v.key]=e}else t[v.key]=w.value;r.push({key:v.key,token:g})}return{command:a,positionals:s,flags:t,warnings:[],providedFlags:r}}function C(e,t){let o=t?.strictFlags??!0,s=[...e.warnings],n=d({json:!1,help:!1,version:!1},t?.defaultFlags??{});d(n,e.flags);let r=e.providedFlags.filter(t=>!N(t.key,e.command));if(r.length>0){var i,l;let t=r.map(e=>e.token),a=(i=e.command,l=t,i?1===l.length?`Flag ${l[0]} is not supported for command ${i}.`:`Flags ${l.join(", ")} are not supported for command ${i}.`:1===l.length?`Flag ${l[0]} requires a command that supports it.`:`Flags ${l.join(", ")} require a command that supports them.`);if(o)throw new c("INVALID_ARGS",a);for(let e of(s.push(a),r))delete n[e.key]}for(let t of Object.keys(n))void 0!==n[t]&&(N(t,e.command)||delete n[t]);if(function(e){if("back"===e.command&&!(new Set(e.providedFlags.filter(e=>"backMode"===e.key).map(e=>e.token)).size<=1))throw new c("INVALID_ARGS","back accepts only one explicit mode flag: use either --in-app or --system.")}(e),a(e.command,n),"batch"===e.command&&1!=+!!n.steps+ +!!n.stepsFile)throw new c("INVALID_ARGS","batch requires exactly one step source: --steps or --steps-file.");return function(e){if(e.flags.help)return e;if("snapshot"===e.command&&e.flags.snapshotDiff){let{snapshotDiff:t,...o}=e.flags;return{command:"diff",positionals:["snapshot",...e.positionals],flags:o,warnings:e.warnings}}return e}({command:e.command,positionals:e.positionals,flags:n,warnings:s})}function O(e){let t=e.indexOf("=");return -1===t?[e,void 0]:[e.slice(0,t),e.slice(t+1)]}function L(e){return e.replace(/^-+/,"")}function _(e){if(!e.startsWith("-")||"-"===e)return!1;let[t]=e.startsWith("--")?O(e):[e,void 0];return void 0!==n(t)}function M(){let o,a,n,r,i,l,c,d;return o=`agent-device <command> [args] [--json]
419
+ (none)`:[e,...t.map(e=>` ${e}`)].join("\n")}let x=new Set(["config","remoteConfig","help","version","batchSteps","githubActionsArtifact"]),R=new Set(["appsFilter","iosSimulatorDeviceSet","sessionLocked","sessionLockConflicts"]),A=function(){let o=new Map;for(let e of r()){let t=o.get(e.key);t?t.push(e):o.set(e.key,[e])}let a=new Map;for(let e of s)a.set(e,new Set(["*"]));for(let o of e())for(let e of t(o).allowedFlags??[]){let t=a.get(e);t&&t.has("*")||(t?t.add(o):a.set(e,new Set([o])))}return[...o.entries()].map(([e,t])=>({key:e,flagDefinitions:t,config:{enabled:!x.has(e),key:e},env:{names:R.has(e)?[]:[l(e)]},supportsCommand(t){let o=a.get(e);return!!o&&(!!o.has("*")||!!t&&o.has(t))}})).sort((e,t)=>e.key.localeCompare(t.key))}(),I=new Map(A.map(e=>[e.key,e]));function S(e){return I.get(e)}function U(e){return A.filter(t=>t.config.enabled&&t.supportsCommand(e))}function N(e,t){return S(e)?.supportsCommand(t)??!1}function D(e,t,o,a){return i(function(e){let t=e.flagDefinitions.find(e=>void 0===e.setValue);if(t)return t;let o=function(e){let t=e.flagDefinitions[0];if(!t)throw Error(`Missing flag definition for option ${e.key}`);return t}(e);if("enum"===o.type){let t=o.enumValues??e.flagDefinitions.map(e=>e.setValue).filter(e=>void 0!==e);return{...o,setValue:void 0,enumValues:t}}return o}(e),t,o,a)}function E(e){let t={json:!1,help:!1,version:!1},a=null,s=[],r=[],i=!0;for(let p=0;p<e.length;p+=1){var l,d;let u=e[p];if(i&&"--"===u){i=!1;continue}if(!i){a?s.push(u):a=F(u);continue}let f=u.startsWith("--"),h=u.startsWith("-")&&u.length>1;if(!f&&!h){a?s.push(u):a=F(u);continue}let[g,m]=f?O(u):[u,void 0],v=n(g);if(l=a,d=v,"react-devtools"===l&&(!d||!N(d.key,l))){s.push(u);continue}if(!v){if(function(e,t,a){var s;if(s=a,!/^-\d+(\.\d+)?$/.test(s)||!e)return!1;let n=o(e);if(!n||n.allowsExtraPositionals)return!0;let r=n.positionalArgs??[];return 0!==r.length&&(t.length<r.length||r.some(e=>e.includes("?")))}(a,s,u)){a?s.push(u):a=u;continue}throw new c("INVALID_ARGS",`Unknown flag: ${g}`)}let w=function(e,t,o,a){if(void 0!==e.setValue){if(void 0!==o)throw new c("INVALID_ARGS",`Flag ${t} does not take a value.`);return{value:e.setValue,consumeNext:!1}}if("boolean"===e.type){if(void 0!==o)throw new c("INVALID_ARGS",`Flag ${t} does not take a value.`);return{value:!0,consumeNext:!1}}if("booleanOrString"===e.type){if(void 0!==o){if(0===o.trim().length)throw new c("INVALID_ARGS",`Flag ${t} requires a non-empty value when provided.`);return{value:o,consumeNext:!1}}return void 0===a||_(a)||!function(e){let t=e.trim();return!(!t||/^[a-zA-Z][a-zA-Z0-9+.-]*:\/\//.test(t))&&!!(t.startsWith("./")||t.startsWith("../")||t.startsWith("~/")||t.startsWith("/")||t.includes("/")||t.includes("\\"))}(a)?{value:!0,consumeNext:!1}:{value:a,consumeNext:!0}}let s=o??a;if(void 0===s||void 0===o&&_(s))throw new c("INVALID_ARGS",`Flag ${t} requires a value.`);if("string"===e.type)return{value:s,consumeNext:void 0===o};if("enum"===e.type){if(!e.enumValues?.includes(s))throw new c("INVALID_ARGS",`Invalid ${L(t)}: ${s}`);return{value:s,consumeNext:void 0===o}}let n=Number(s);if(!Number.isFinite(n)||"number"==typeof e.min&&n<e.min||"number"==typeof e.max&&n>e.max)throw new c("INVALID_ARGS",`Invalid ${L(t)}: ${s}`);return{value:Math.floor(n),consumeNext:void 0===o}}(v,g,m,e[p+1]);w.consumeNext&&(p+=1);let b=t[v.key];if(v.multiple){let e=Array.isArray(b)?[...b,w.value]:void 0===b?[w.value]:[b,w.value];t[v.key]=e}else t[v.key]=w.value;r.push({key:v.key,token:g})}return{command:a,positionals:s,flags:t,warnings:[],providedFlags:r}}function C(e,t){let o=t?.strictFlags??!0,s=[...e.warnings],n=d({json:!1,help:!1,version:!1},t?.defaultFlags??{});d(n,e.flags);let r=e.providedFlags.filter(t=>!N(t.key,e.command));if(r.length>0){var i,l;let t=r.map(e=>e.token),a=(i=e.command,l=t,i?1===l.length?`Flag ${l[0]} is not supported for command ${i}.`:`Flags ${l.join(", ")} are not supported for command ${i}.`:1===l.length?`Flag ${l[0]} requires a command that supports it.`:`Flags ${l.join(", ")} require a command that supports them.`);if(o)throw new c("INVALID_ARGS",a);for(let e of(s.push(a),r))delete n[e.key]}for(let t of Object.keys(n))void 0!==n[t]&&(N(t,e.command)||delete n[t]);if(function(e){if("back"===e.command&&!(new Set(e.providedFlags.filter(e=>"backMode"===e.key).map(e=>e.token)).size<=1))throw new c("INVALID_ARGS","back accepts only one explicit mode flag: use either --in-app or --system.")}(e),a(e.command,n),"batch"===e.command&&1!=+!!n.steps+ +!!n.stepsFile)throw new c("INVALID_ARGS","batch requires exactly one step source: --steps or --steps-file.");return function(e){if(e.flags.help)return e;if("snapshot"===e.command&&e.flags.snapshotDiff){let{snapshotDiff:t,...o}=e.flags;return{command:"diff",positionals:["snapshot",...e.positionals],flags:o,warnings:e.warnings}}return e}({command:e.command,positionals:e.positionals,flags:n,warnings:s})}function O(e){let t=e.indexOf("=");return -1===t?[e,void 0]:[e.slice(0,t),e.slice(t+1)]}function L(e){return e.replace(/^-+/,"")}function _(e){if(!e.startsWith("-")||"-"===e)return!1;let[t]=e.startsWith("--")?O(e):[e,void 0];return void 0!==n(t)}function M(){let o,a,n,r,i,l,c,d;return o=`agent-device <command> [args] [--json]
419
420
 
420
421
  CLI to control iOS and Android devices for AI agents.
421
422
  `,a=y("Commands:",e().map(e=>{let o=t(e);return{name:e,schema:o,usage:function(e,t){if(t.listUsageOverride)return t.listUsageOverride;let o=(t.positionalArgs??[]).map(o=>{var a,s,n;let r,i,l,c;return a=e,s=t,i=(r=(n=o).endsWith("?"))?n.slice(0,-1):n,c=(l=/^[a-z-]+(?:\|[a-z-]+)+$/i.test(i))||void 0!==s.usageOverride&&s.usageOverride.startsWith(`${a} ${i}`),r?l?`[${i}]`:c?i:`[${i}]`:c?i:`<${i}>`});return[e,...o].join(" ")}(e,o)}}).map(e=>({label:e.usage,description:e.schema.summary??e.schema.helpDescription}))),n=b("Flags:",w(s)),r=k("Agent Quickstart:",u),i=y("Agent Workflows:",p),l=k("Configuration:",f),c=y("Environment:",h),d=k("Examples:",g),`${o}
@@ -432,7 +433,7 @@ ${l}
432
433
  ${c}
433
434
 
434
435
  ${d}
435
- `}function F(e){return function(e){var t,a;let n,i=(n=m[e])?`${n.body}
436
+ `}function T(e){return function(e){var t,a;let n,i=(n=m[e])?`${n.body}
436
437
 
437
438
  Related:
438
439
  agent-device help command list and global flags
@@ -446,4 +447,4 @@ Usage:
446
447
  agent-device ${c}
447
448
 
448
449
  ${u.join("\n\n")}
449
- `}(T(e))}function T(e){return"long-press"===e?"longpress":"metrics"===e?"perf":e}export{M as usage,C as finalizeParsedArgs,U as getConfigurableOptionSpecs,S as getOptionSpec,d as mergeDefinedFlags,D as parseOptionValueFromSource,E as parseRawArgs,F as usageForCommand};
450
+ `}(F(e))}function F(e){return"long-press"===e?"longpress":"metrics"===e?"perf":e}export{M as usage,C as finalizeParsedArgs,U as getConfigurableOptionSpecs,S as getOptionSpec,d as mergeDefinedFlags,D as parseOptionValueFromSource,E as parseRawArgs,T as usageForCommand};
package/dist/src/cli.js CHANGED
@@ -1,4 +1,4 @@
1
- import e from"node:path";import{styleText as t}from"node:util";import{pathToFileURL as n}from"node:url";import r from"node:fs";import o from"node:crypto";import{buildMobileSnapshotPresentation as i,displayNodeLabel as a,buildSnapshotDisplayLines as s,localCommandPolicy as l,createAgentDevice as c,formatSnapshotLine as d}from"./9533.js";import{asAppError as u,normalizeError as f,AppError as p}from"./9152.js";import{ensureCompanionTunnel as m,stopCompanionTunnel as h}from"./1974.js";import{REACT_DEVTOOLS_COMPANION_RUN_ARG as g}from"./2301.js";import{REMOTE_CONFIG_FIELD_SPECS as v,resolveRemoteConfigProfile as w,resolveRemoteConfigPath as y}from"./208.js";import{createRequestId as I,withDiagnosticsScope as $,getDiagnosticsMeta as A,flushDiagnosticsToSessionFile as C,emitDiagnostic as S}from"./7599.js";import{resolveDaemonPaths as x}from"./8114.js";import{stopMetroTunnel as b}from"./metro.js";import{runCmdStreaming as _,runCmd as D}from"./9818.js";import{serializeCloseResult as N,serializeOpenResult as P,serializeInstallFromSourceResult as k,serializeDevice as R,serializeSessionListEntry as U,serializeDeployResult as E,serializeSnapshotResult as T}from"./2805.js";import{readCommandMessage as B}from"./1998.js";import{gestureCliReaders as M,selectorCliReaders as L,parseInstallSourceConfig as O,replayCliReaders as j,systemCliReaders as K,observabilityCliReaders as H,appCliReaders as F}from"./8699.js";import{captureCliReaders as G,commonInputFromFlags as V}from"./6085.js";import{interactionCliReaders as q}from"./8502.js";import{runCommand as J}from"./command-surface.js";import{resolveUserPath as z,expandUserHomePath as W}from"./3267.js";import{createLocalArtifactAdapter as Z}from"./7719.js";import{isClientBackedCliCommandName as Y}from"./5792.js";import{isCommandName as X}from"./command-metadata.js";import{mergeDefinedFlags as Q,parseOptionValueFromSource as ee,getConfigurableOptionSpecs as et,getOptionSpec as en,usage as er,parseRawArgs as eo,usageForCommand as ei,finalizeParsedArgs as ea}from"./args.js";import{readVersion as es}from"./9671.js";import{createAgentDeviceClient as el,sendToDaemon as ec}from"./9542.js";import{maybeRunUpgradeNotifier as ed}from"./113.js";function eu(e){return e.width>0&&e.height>0}function ef(e,t){return!!e&&!!t&&e.x>=t.x-2&&e.y>=t.y-2&&e.x+e.width<=t.x+t.width+2&&e.y+e.height<=t.y+t.height+2}function ep(e){return"number"!=typeof e.parentIndex}function em(e){let t=(e.type??"").toLowerCase(),n=(e.identifier??"").trim().toLowerCase();return t.includes("edittext")||t.includes("textfield")||"composer"===n}function eh(e){let t=(e.type??"").toLowerCase();return t.includes("scroll")||t.includes("list")||t.includes("recyclerview")}function eg(e){var t;let n=a(e);if(!n||n!==e.identifier?.trim()||(t=n,!/^[\w.]+:id\/[\w.-]+$/i.test(t)))return n;let r=(e.type??"").toLowerCase();return r.includes("view")||r.includes("layout")||r.includes("image")||r.includes("list")||r.includes("recyclerview")||r.includes("collection")?"":n}function ev(e){let t=e.trim().replace(/\s+/g," ").toLowerCase();return!t||/^(true|false|\d+)$/.test(t)?null:t}function ew(e,t){let n=[],r=[t];for(;r.length>0;){let t=r.pop();for(let o of e)o.parentIndex===t&&(n.push(o),r.push(o.index))}return n}function ey(e,t,n){let r=[t];for(;r.length>0;){let t=r.pop();if(!n.has(t))for(let o of(n.add(t),e))o.parentIndex!==t||n.has(o.index)||r.push(o.index)}}let eI=["button","switch","checkbox","radio"],e$=["button","image","textview","view"];function eA(e){if(!0===e.hittable||em(e))return!1;let t=(e.type??"").toLowerCase();return t.includes("text")||t.includes("image")||t.includes("icon")}function eC(e){if(!e.rect||!eu(e.rect)||ep(e)||em(e))return!1;let t=(e.type??"").toLowerCase();return"text"===t||eb(t,e$)}function eS(e,t){let n=ex(e);return ex(t)>n?t:e}function ex(e){let t=(e.type??"").toLowerCase(),n=0;return eb(t,eI)?n+=100:t.includes("image")?n+=30:t.includes("textview")||"text"===t?n+=20:t.includes("view")&&(n+=10),!0===e.hittable&&(n+=20),!1!==e.enabled&&(n+=5),n}function eb(e,t){return t.some(t=>e.includes(t))}function e_(e){process.stdout.write(`${JSON.stringify(e,null,2)}
1
+ import e from"node:path";import{styleText as t}from"node:util";import{pathToFileURL as n}from"node:url";import r from"node:fs";import o from"node:crypto";import{buildMobileSnapshotPresentation as i,displayNodeLabel as a,buildSnapshotDisplayLines as s,localCommandPolicy as l,createAgentDevice as c,formatSnapshotLine as d}from"./9533.js";import{asAppError as u,normalizeError as f,AppError as p}from"./9152.js";import{ensureCompanionTunnel as m,stopCompanionTunnel as h}from"./1974.js";import{REACT_DEVTOOLS_COMPANION_RUN_ARG as g}from"./2301.js";import{REMOTE_CONFIG_FIELD_SPECS as v,resolveRemoteConfigProfile as w,resolveRemoteConfigPath as y}from"./208.js";import{createRequestId as I,withDiagnosticsScope as $,getDiagnosticsMeta as A,flushDiagnosticsToSessionFile as C,emitDiagnostic as S}from"./7599.js";import{resolveDaemonPaths as x}from"./8114.js";import{stopMetroTunnel as b}from"./metro.js";import{runCmdStreaming as _,runCmd as D}from"./9818.js";import{serializeCloseResult as N,serializeOpenResult as P,serializeInstallFromSourceResult as k,serializeDevice as R,serializeSessionListEntry as U,serializeDeployResult as E,serializeSnapshotResult as T}from"./6232.js";import{readCommandMessage as B}from"./1998.js";import{gestureCliReaders as M,selectorCliReaders as L,parseInstallSourceConfig as O,replayCliReaders as j,systemCliReaders as K,observabilityCliReaders as H,appCliReaders as F}from"./8699.js";import{captureCliReaders as G,commonInputFromFlags as V}from"./6085.js";import{interactionCliReaders as q}from"./8502.js";import{runCommand as J}from"./command-surface.js";import{resolveUserPath as z,expandUserHomePath as W}from"./3267.js";import{createLocalArtifactAdapter as Z}from"./7719.js";import{isClientBackedCliCommandName as Y}from"./5792.js";import{isCommandName as X}from"./command-metadata.js";import{mergeDefinedFlags as Q,parseOptionValueFromSource as ee,getConfigurableOptionSpecs as et,getOptionSpec as en,usage as er,parseRawArgs as eo,usageForCommand as ei,finalizeParsedArgs as ea}from"./args.js";import{readVersion as es}from"./9671.js";import{createAgentDeviceClient as el,sendToDaemon as ec}from"./9542.js";import{maybeRunUpgradeNotifier as ed}from"./113.js";function eu(e){return e.width>0&&e.height>0}function ef(e,t){return!!e&&!!t&&e.x>=t.x-2&&e.y>=t.y-2&&e.x+e.width<=t.x+t.width+2&&e.y+e.height<=t.y+t.height+2}function ep(e){return"number"!=typeof e.parentIndex}function em(e){let t=(e.type??"").toLowerCase(),n=(e.identifier??"").trim().toLowerCase();return t.includes("edittext")||t.includes("textfield")||"composer"===n}function eh(e){let t=(e.type??"").toLowerCase();return t.includes("scroll")||t.includes("list")||t.includes("recyclerview")}function eg(e){var t;let n=a(e);if(!n||n!==e.identifier?.trim()||(t=n,!/^[\w.]+:id\/[\w.-]+$/i.test(t)))return n;let r=(e.type??"").toLowerCase();return r.includes("view")||r.includes("layout")||r.includes("image")||r.includes("list")||r.includes("recyclerview")||r.includes("collection")?"":n}function ev(e){let t=e.trim().replace(/\s+/g," ").toLowerCase();return!t||/^(true|false|\d+)$/.test(t)?null:t}function ew(e,t){let n=[],r=[t];for(;r.length>0;){let t=r.pop();for(let o of e)o.parentIndex===t&&(n.push(o),r.push(o.index))}return n}function ey(e,t,n){let r=[t];for(;r.length>0;){let t=r.pop();if(!n.has(t))for(let o of(n.add(t),e))o.parentIndex!==t||n.has(o.index)||r.push(o.index)}}let eI=["button","switch","checkbox","radio"],e$=["button","image","textview","view"];function eA(e){if(!0===e.hittable||em(e))return!1;let t=(e.type??"").toLowerCase();return t.includes("text")||t.includes("image")||t.includes("icon")}function eC(e){if(!e.rect||!eu(e.rect)||ep(e)||em(e))return!1;let t=(e.type??"").toLowerCase();return"text"===t||eb(t,e$)}function eS(e,t){let n=ex(e);return ex(t)>n?t:e}function ex(e){let t=(e.type??"").toLowerCase(),n=0;return eb(t,eI)?n+=100:t.includes("image")?n+=30:t.includes("textview")||"text"===t?n+=20:t.includes("view")&&(n+=10),!0===e.hittable&&(n+=20),!1!==e.enabled&&(n+=5),n}function eb(e,t){return t.some(t=>e.includes(t))}function e_(e){process.stdout.write(`${JSON.stringify(e,null,2)}
2
2
  `)}function eD(e,t={}){let n=e instanceof p?f(e):e;process.stderr.write(`Error (${n.code}): ${n.message}
3
3
  `),n.hint&&process.stderr.write(`Hint: ${n.hint}
4
4
  `),n.diagnosticId&&process.stderr.write(`Diagnostic ID: ${n.diagnosticId}
@@ -6,7 +6,7 @@ import e from"node:path";import{styleText as t}from"node:util";import{pathToFile
6
6
  `),t.showDetails&&n.details&&process.stderr.write(`${JSON.stringify(n.details,null,2)}
7
7
  `)}function eN(e){return e&&e.summaryLines.length>0?`
8
8
  ${e.summaryLines.join("\n")}`:""}function eP(e){return`x=${e.x},y=${e.y},w=${e.width},h=${e.height}`}function ek(e){return e>0?`+${e}`:String(e)}function eR(e){let t=e.nearestText?` near ${JSON.stringify(e.nearestText)}`:"",n=e.regionIndex?` r${e.regionIndex}`:"";return`${e.likelyKind}${t}${n}`}function eU(e){return e.min===e.max?ek(e.min):`${ek(e.min)}..${ek(e.max)}`}function eE(t){let n=process.cwd(),r=e.relative(n,t);return""!==r&&(r.startsWith("..")||e.isAbsolute(r))?t:""===r?".":`.${e.sep}${r}`}function eT(e){return"number"==typeof e&&Number.isFinite(e)?e:0}function eB(){let e=process.env.FORCE_COLOR;return"string"==typeof e?"0"!==e:"string"!=typeof process.env.NO_COLOR&&!!process.stdout.isTTY}function eM(e,n){return n?t("dim",e):e}function eL(e){let t=e.warnings;return Array.isArray(t)?t.filter(e=>"string"==typeof e&&e.length>0):[]}function eO(e,t){var n;let r="scroll-area"===(n=e.type)||"list"===n||"collection"===n||"table"===n?n:null;if(!r)return[];let o=[];if(e.node.hiddenContentAbove&&"below"!==t&&o.push(`[content above ${r} hidden]`),e.node.hiddenContentBelow&&"above"!==t&&o.push(`[content below ${r} hidden]`),0===o.length)return[];let i=" ".repeat(e.depth+1);return o.map(e=>`${i}${e}`)}let ej={slug:"react-devtools-companion",runArg:g,displayName:"React DevTools companion"};async function eK(e){return await m({...e,definition:ej,localBaseUrl:e.localBaseUrl??"http://127.0.0.1:8097",registerPath:"/api/react-devtools/companion/register",unregisterPath:"/api/react-devtools/companion/unregister",devicePort:e.devicePort??8097})}async function eH(e){return await h({...e,definition:ej})}function eF(e){var t;let n,o=ez(e);if(!r.existsSync(o))return null;try{n=JSON.parse(r.readFileSync(o,"utf8"))}catch(t){return eQ(e,t),null}return!(!(t=n)||"object"!=typeof t||Array.isArray(t))&&1===t.version&&"string"==typeof t.session&&"string"==typeof t.remoteConfigPath&&"string"==typeof t.remoteConfigHash&&(void 0===t.daemon||"object"==typeof t.daemon&&null!==t.daemon&&!Array.isArray(t.daemon))&&"string"==typeof t.tenant&&"string"==typeof t.runId&&(void 0===t.leaseId||"string"==typeof t.leaseId)&&(void 0===t.leaseBackend||"string"==typeof t.leaseBackend)&&"string"==typeof t.connectedAt&&"string"==typeof t.updatedAt?n:(eQ(e),null)}function eG(t){let n=ez({stateDir:t.stateDir,session:t.state.session});r.mkdirSync(e.dirname(n),{recursive:!0}),eX(n,t.state),eX(eW(t.stateDir),{session:t.state.session})}function eV(e){return{baseUrl:function(e){if(!e)return;let t=new URL(e);for(let e of(t.username="",t.password="",[...t.searchParams.keys()]))/(auth|key|password|secret|token)/i.test(e)&&t.searchParams.delete(e);return t.toString().replace(/\/+$/,"")}(e.daemonBaseUrl),transport:e.daemonTransport,serverMode:e.daemonServerMode}}function eq(e){r.rmSync(ez(e),{force:!0});let t=eW(e.stateDir);eY(e.stateDir)===e.session&&r.rmSync(t,{force:!0})}function eJ(e){try{return o.createHash("sha256").update(r.readFileSync(e)).digest("hex")}catch(t){throw new p("INVALID_ARGS",`Remote config file not found: ${e}`,{cause:t instanceof Error?t.message:String(t)})}}function ez(t){return e.join(t.stateDir,"remote-connections",`${function(e){let t=e.replaceAll(/[^a-zA-Z0-9._-]/g,"_");if(!t)return"default";if(t===e)return t;let n=o.createHash("sha256").update(e).digest("hex").slice(0,8);return`${t}-${n}`}(t.session)}.json`)}function eW(t){return e.join(t,"remote-connections",".active-session.json")}function eZ(e){let t=eY(e.stateDir);return t?eF({stateDir:e.stateDir,session:t}):null}function eY(e){let t=eW(e);if(r.existsSync(t))try{let e=JSON.parse(r.readFileSync(t,"utf8"));return"string"==typeof e.session?e.session:void 0}catch{return}}function eX(e,t){r.writeFileSync(e,`${JSON.stringify(t,null,2)}
9
- `,{encoding:"utf8",mode:384}),r.chmodSync(e,384)}function eQ(e,t){S({level:"warn",phase:"remote_connection_state_invalid",data:{session:e.session,cause:t instanceof Error?t.message:t?String(t):void 0}}),eq(e)}let e0=v.map(e=>e.key);function e1(e){let t={};for(let n of e0){let r=e[n];void 0!==r&&(t[n]=r)}return t}let e2=new Set(["connect","connection","close","disconnect","metro","session"]),e3=new Set(["open"]);async function e8(e){let t,n,{command:r,flags:o,client:i}=e;if(!o.remoteConfig)return{flags:o,runtime:e.runtime};let a=x(o.stateDir).baseDir,s=w({configPath:o.remoteConfig,cwd:process.cwd(),env:process.env}),l={...e1(s.profile),...o,remoteConfig:s.resolvedPath},c=eF({stateDir:a,session:l.session??"default"});if(c&&c.remoteConfigPath!==s.resolvedPath)throw new p("INVALID_ARGS","A different remote connection is already active for this session. Run connect --force or disconnect before using a different --remote-config.",{session:c.session,activeRemoteConfig:c.remoteConfigPath,requestedRemoteConfig:s.resolvedPath});let d=c??function(e,t){if(!e.tenant)throw new p("INVALID_ARGS","remote command requires tenant in remote config or via --tenant <id>.");if(!e.runId)throw new p("INVALID_ARGS","remote command requires runId in remote config or via --run-id <id>.");if(!e.daemonBaseUrl)throw new p("INVALID_ARGS","remote command requires daemonBaseUrl in remote config, config, env, or --daemon-base-url.");let n=new Date().toISOString();return{version:1,session:e.session??"default",remoteConfigPath:t,remoteConfigHash:eJ(t),daemon:eV(e),tenant:e.tenant,runId:e.runId,leaseId:e.leaseId,leaseBackend:e.leaseBackend??e7(e),platform:e.platform,target:e.target,connectedAt:n,updatedAt:n}}(l,s.resolvedPath),u={...l,session:d.session},f=function(e,t){if(e)return tt(e,t)?e:void 0}(d.runtime,u.platform)??e.runtime,m=d,h=!c;if(g=r,!e2.has(g)){let e=d.leaseBackend??function(e,t){let n=e7(e);if(n)return n;throw new p("INVALID_ARGS",`${t} requires --platform ios|android or --lease-backend when the remote connection has not resolved a lease yet.`)}(o,r);var g,v,y,I,$,A=d,C=o,S=e;if(A.leaseBackend&&A.leaseBackend!==S)throw new p("INVALID_ARGS","Active remote connection is already bound to a different lease backend. Re-run connect --force to replace it.",{session:A.session,leaseBackend:A.leaseBackend});if(A.platform&&C.platform&&A.platform!==C.platform)throw new p("INVALID_ARGS","Active remote connection is already bound to a different platform. Re-run connect --force to replace it.",{session:A.session,platform:A.platform});if(A.target&&C.target&&A.target!==C.target)throw new p("INVALID_ARGS","Active remote connection is already bound to a different target. Re-run connect --force to replace it.",{session:A.session,target:A.target});let t=await tn(i,m,e);u.leaseId=t.leaseId,u.leaseBackend=e,u.platform=m.platform??u.platform,u.target=m.target??u.target,(m.leaseId!==t.leaseId||m.leaseBackend!==e)&&(m={...m,leaseId:t.leaseId,leaseBackend:e,platform:m.platform??o.platform,target:m.target??o.target,updatedAt:new Date().toISOString()},h=!0)}if(v=r,y=e.batchSteps,(e3.has(v)||"batch"===v&&y&&y.some(e=>{let t=e.command.trim().toLowerCase();return e3.has(t)&&void 0===e.runtime}))&&te(u)&&(!m.leaseId&&u.leaseId&&(m={...m,leaseId:u.leaseId,leaseBackend:u.leaseBackend}),e.forceRuntimePrepare||!f||!tt(f,u.platform))){if(!m.leaseId)throw new p("INVALID_ARGS",`${r} requires a resolved remote lease before Metro runtime can be prepared.`);let e=await e5(u,i,d.remoteConfigPath,d.session,{tenantId:d.tenant,runId:d.runId,leaseId:m.leaseId});f=e.runtime;let o=(I=m.metro,$=e.cleanup,I?.projectRoot!==$?.projectRoot||I?.profileKey!==$?.profileKey||I?.consumerKey!==$?.consumerKey);t=o?m.metro:void 0,n=o?e.cleanup:void 0,m={...m,runtime:e.runtime,metro:e.cleanup,updatedAt:new Date().toISOString()},h=!0}if(h)try{eG({stateDir:a,state:m})}catch(e){throw await e9(n),e}return await e9(t),{flags:{...u,session:m.session,leaseId:m.leaseId,leaseBackend:m.leaseBackend,platform:m.platform??u.platform,target:m.target??u.target},runtime:f}}async function e5(e,t,n,r,o){if(!e.metroProjectRoot&&!e.metroPublicBaseUrl&&!e.metroProxyBaseUrl)return{};if("ios"!==e.platform&&"android"!==e.platform)throw new p("INVALID_ARGS",'Deferred Metro preparation requires platform "ios" or "android".');if(!e.metroPublicBaseUrl&&!e.metroProxyBaseUrl)throw new p("INVALID_ARGS","Deferred Metro preparation requires metroPublicBaseUrl or metroProxyBaseUrl when Metro settings are provided.");let i=await t.metro.prepare({projectRoot:e.metroProjectRoot,kind:e.metroKind,publicBaseUrl:e.metroPublicBaseUrl,proxyBaseUrl:e.metroProxyBaseUrl,bearerToken:e.metroBearerToken,bridgeScope:o,launchUrl:e.launchUrl,companionProfileKey:n,companionConsumerKey:r,port:e.metroPreparePort,listenHost:e.metroListenHost,statusHost:e.metroStatusHost,startupTimeoutMs:e.metroStartupTimeoutMs,probeTimeoutMs:e.metroProbeTimeoutMs,reuseExisting:!e.metroNoReuseExisting&&void 0,installDependenciesIfNeeded:!e.metroNoInstallDeps&&void 0,runtimeFilePath:e.metroRuntimeFile});return{runtime:"ios"===e.platform?i.iosRuntime:i.androidRuntime,cleanup:e.metroProxyBaseUrl?{projectRoot:i.projectRoot,profileKey:n,consumerKey:r}:void 0}}async function e9(e){if(e)try{await b(e)}catch{}}async function e6(e){try{await eH({projectRoot:process.cwd(),stateDir:e.stateDir,profileKey:e.state.remoteConfigPath,consumerKey:e.state.session})}catch{}}async function e4(e,t){if(t.leaseId)try{await e.leases.release({tenant:t.tenant,runId:t.runId,leaseId:t.leaseId,daemonBaseUrl:t.daemon?.baseUrl,daemonTransport:t.daemon?.transport,daemonServerMode:t.daemon?.serverMode})}catch{}}function e7(e){return e.leaseBackend?e.leaseBackend:"android"===e.platform?"android-instance":"ios"===e.platform?"ios-instance":void 0}function te(e){return!!(e.metroPublicBaseUrl||e.metroProxyBaseUrl||e.metroProjectRoot||e.metroKind)}function tt(e,t){return!e.platform||!t||"ios"!==t&&"android"!==t||e.platform===t}async function tn(e,t,n){if(t.leaseId&&t.leaseBackend===n){let r=await tr(e,t.leaseId,{tenant:t.tenant,runId:t.runId,leaseBackend:n});if(r)return r}return await e.leases.allocate({tenant:t.tenant,runId:t.runId,leaseBackend:n})}async function tr(e,t,n){try{return await e.leases.heartbeat({tenant:n.tenant,runId:n.runId,leaseId:t,leaseBackend:n.leaseBackend})}catch(e){var r;if((r=e)instanceof p&&"UNAUTHORIZED"===r.code&&(r.details?.reason==="LEASE_NOT_FOUND"||r.details?.reason==="LEASE_EXPIRED"||r.details?.reason==="LEASE_REVOKED"))return;throw e}}async function to(e){return await ti({command:e.command,flags:e.flags,stateDir:e.stateDir,allowInteractiveLogin:"connect"===e.command&&!e.flags.noLogin,env:e.env})}async function ti(e){let t=e.env??e.io?.env??process.env;if(!e.flags.daemonBaseUrl)return{flags:e.flags,source:"none"};if(ty(e.flags.daemonAuthToken))return{flags:e.flags,source:"flag"};if(ty(t.AGENT_DEVICE_DAEMON_AUTH_TOKEN))return{flags:e.flags,source:"env"};if(!function(e,t){if("1"===t.AGENT_DEVICE_CLOUD_AUTH||"true"===t.AGENT_DEVICE_CLOUD_AUTH||ty(t.AGENT_DEVICE_CLOUD_BASE_URL))return!0;try{let t=new URL(e).hostname.toLowerCase();return"agent-device.dev"===t||t.endsWith(".agent-device.dev")}catch{return!1}}(e.flags.daemonBaseUrl,t))return{flags:e.flags,source:"none"};let n=await td({stateDir:e.stateDir,flags:e.flags,env:t,io:e.io});if(n)return{flags:{...e.flags,daemonAuthToken:n.accessToken},source:"cli-session"};if(!e.allowInteractiveLogin){if(e.flags.noLogin)throw new p("UNAUTHORIZED","Remote daemon authentication is required.",{hint:"Run agent-device auth login, unset --no-login, or set AGENT_DEVICE_DAEMON_AUTH_TOKEN."});throw tm(e.command,t)}let r=await ts({stateDir:e.stateDir,flags:e.flags,env:t,io:e.io});return{flags:{...e.flags,daemonAuthToken:r.accessToken},source:"login"}}async function ta(e){let t=e.env??e.io?.env??process.env;if(ty(e.flags.daemonAuthToken))return{accessToken:e.flags.daemonAuthToken,cloudBaseUrl:th(t)};if(ty(t.AGENT_DEVICE_DAEMON_AUTH_TOKEN))return{accessToken:t.AGENT_DEVICE_DAEMON_AUTH_TOKEN,cloudBaseUrl:th(t)};let n=await td({stateDir:e.stateDir,flags:e.flags,env:t,io:e.io});if(n)return{accessToken:n.accessToken,cloudBaseUrl:n.cloudBaseUrl};if(e.flags.noLogin)throw new p("UNAUTHORIZED","Cloud connection profile authentication is required.",{hint:"Run agent-device auth login, unset --no-login, or set AGENT_DEVICE_DAEMON_AUTH_TOKEN."});let r=await ts({stateDir:e.stateDir,flags:e.flags,env:t,io:e.io,commandLabel:"agent-device connect"});return{accessToken:r.accessToken,cloudBaseUrl:r.session.cloudBaseUrl}}async function ts(t){let n,o,i,a=t.env??t.io?.env??process.env,s=(d=a,u=t.io,n=u?.stdinIsTTY??process.stdin.isTTY,o=u?.stdoutIsTTY??process.stdout.isTTY,"true"!==(f=d).CI&&"true"!==f.GITHUB_ACTIONS&&"true"!==f.BUILDKITE&&n&&o?(m=d).SSH_TTY||m.SSH_CONNECTION||"true"===m.CODESPACES||m.GITPOD_WORKSPACE_ID||"true"===m.REMOTE_CONTAINERS?"device-code":"local-browser":"non-interactive");if("non-interactive"===s)throw tm(t.commandLabel??"agent-device connect",a);let l=th(a),c=await tp({baseUrl:l,pathName:"/api/control-plane/device-auth/start",body:{client:"agent-device",tenant:t.flags.tenant,runId:t.flags.runId,daemonBaseUrl:t.flags.daemonBaseUrl,session:t.flags.session},fetchImpl:t.io?.fetch});var d,u,f,m,h,g,v=c;if(!ty(v.deviceCode)||!ty(v.userCode)||!ty(v.verificationUri))throw new p("COMMAND_FAILED","Cloud auth start returned an unusable response.");let w=c.verificationUriComplete??c.verificationUri,y="local-browser"===s?c.verificationUri:(h=c.verificationUri,g=c.userCode,(i=new URL(h)).searchParams.set("user_code",g),i.toString());"local-browser"===s?(tv(t.io,`Opening ${c.verificationUri}...
9
+ `,{encoding:"utf8",mode:384}),r.chmodSync(e,384)}function eQ(e,t){S({level:"warn",phase:"remote_connection_state_invalid",data:{session:e.session,cause:t instanceof Error?t.message:t?String(t):void 0}}),eq(e)}let e0=v.map(e=>e.key);function e1(e){let t={};for(let n of e0){let r=e[n];void 0!==r&&(t[n]=r)}return t}let e2=new Set(["connect","connection","close","disconnect","metro","session"]),e3=new Set(["open"]);async function e8(e){let t,n,{command:r,flags:o,client:i}=e;if(!o.remoteConfig)return{flags:o,runtime:e.runtime};let a=x(o.stateDir).baseDir,s=w({configPath:o.remoteConfig,cwd:process.cwd(),env:process.env}),l={...e1(s.profile),...o,remoteConfig:s.resolvedPath},c=eF({stateDir:a,session:l.session??"default"});if(c&&c.remoteConfigPath!==s.resolvedPath)throw new p("INVALID_ARGS","A different remote connection is already active for this session. Run connect --force or disconnect before using a different --remote-config.",{session:c.session,activeRemoteConfig:c.remoteConfigPath,requestedRemoteConfig:s.resolvedPath});let d=c??function(e,t){if(!e.tenant)throw new p("INVALID_ARGS","remote command requires tenant in remote config or via --tenant <id>.");if(!e.runId)throw new p("INVALID_ARGS","remote command requires runId in remote config or via --run-id <id>.");if(!e.daemonBaseUrl)throw new p("INVALID_ARGS","remote command requires daemonBaseUrl in remote config, config, env, or --daemon-base-url.");let n=new Date().toISOString();return{version:1,session:e.session??"default",remoteConfigPath:t,remoteConfigHash:eJ(t),daemon:eV(e),tenant:e.tenant,runId:e.runId,leaseId:e.leaseId,leaseBackend:e.leaseBackend??e7(e),platform:e.platform,target:e.target,connectedAt:n,updatedAt:n}}(l,s.resolvedPath),u={...l,session:d.session},f=function(e,t){if(e)return tt(e,t)?e:void 0}(d.runtime,u.platform)??e.runtime,m=d,h=!c;if(g=r,!e2.has(g)){let e=d.leaseBackend??function(e,t){let n=e7(e);if(n)return n;throw new p("INVALID_ARGS",`${t} requires --platform ios|android or --lease-backend when the remote connection has not resolved a lease yet.`)}(o,r);var g,v,y,I,$,A=d,C=o,S=e;if(A.leaseBackend&&A.leaseBackend!==S)throw new p("INVALID_ARGS","Active remote connection is already bound to a different lease backend. Re-run connect --force to replace it.",{session:A.session,leaseBackend:A.leaseBackend});if(A.platform&&C.platform&&A.platform!==C.platform)throw new p("INVALID_ARGS","Active remote connection is already bound to a different platform. Re-run connect --force to replace it.",{session:A.session,platform:A.platform});if(A.target&&C.target&&A.target!==C.target)throw new p("INVALID_ARGS","Active remote connection is already bound to a different target. Re-run connect --force to replace it.",{session:A.session,target:A.target});let t=await tn(i,m,e);u.leaseId=t.leaseId,u.leaseBackend=e,u.platform=m.platform??u.platform,u.target=m.target??u.target,(m.leaseId!==t.leaseId||m.leaseBackend!==e)&&(m={...m,leaseId:t.leaseId,leaseBackend:e,platform:m.platform??o.platform,target:m.target??o.target,updatedAt:new Date().toISOString()},h=!0)}if(v=r,y=e.batchSteps,(e3.has(v)||"batch"===v&&y&&y.some(e=>{let t=e.command.trim().toLowerCase();return e3.has(t)&&void 0===e.runtime}))&&te(u)&&(!m.leaseId&&u.leaseId&&(m={...m,leaseId:u.leaseId,leaseBackend:u.leaseBackend}),e.forceRuntimePrepare||!f||!tt(f,u.platform))){if(!m.leaseId)throw new p("INVALID_ARGS",`${r} requires a resolved remote lease before Metro runtime can be prepared.`);let e=await e5(u,i,d.remoteConfigPath,d.session,{tenantId:d.tenant,runId:d.runId,leaseId:m.leaseId});f=e.runtime;let o=(I=m.metro,$=e.cleanup,I?.projectRoot!==$?.projectRoot||I?.profileKey!==$?.profileKey||I?.consumerKey!==$?.consumerKey);t=o?m.metro:void 0,n=o?e.cleanup:void 0,m={...m,runtime:e.runtime,metro:e.cleanup,updatedAt:new Date().toISOString()},h=!0}if(h)try{eG({stateDir:a,state:m})}catch(e){throw await e6(n),e}return await e6(t),{flags:{...u,session:m.session,leaseId:m.leaseId,leaseBackend:m.leaseBackend,platform:m.platform??u.platform,target:m.target??u.target},runtime:f}}async function e5(e,t,n,r,o){if(!e.metroProjectRoot&&!e.metroPublicBaseUrl&&!e.metroProxyBaseUrl)return{};if("ios"!==e.platform&&"android"!==e.platform)throw new p("INVALID_ARGS",'Deferred Metro preparation requires platform "ios" or "android".');if(!e.metroPublicBaseUrl&&!e.metroProxyBaseUrl)throw new p("INVALID_ARGS","Deferred Metro preparation requires metroPublicBaseUrl or metroProxyBaseUrl when Metro settings are provided.");let i=await t.metro.prepare({projectRoot:e.metroProjectRoot,kind:e.metroKind,publicBaseUrl:e.metroPublicBaseUrl,proxyBaseUrl:e.metroProxyBaseUrl,bearerToken:e.metroBearerToken,bridgeScope:o,launchUrl:e.launchUrl,companionProfileKey:n,companionConsumerKey:r,port:e.metroPreparePort,listenHost:e.metroListenHost,statusHost:e.metroStatusHost,startupTimeoutMs:e.metroStartupTimeoutMs,probeTimeoutMs:e.metroProbeTimeoutMs,reuseExisting:!e.metroNoReuseExisting&&void 0,installDependenciesIfNeeded:!e.metroNoInstallDeps&&void 0,runtimeFilePath:e.metroRuntimeFile});return{runtime:"ios"===e.platform?i.iosRuntime:i.androidRuntime,cleanup:e.metroProxyBaseUrl?{projectRoot:i.projectRoot,profileKey:n,consumerKey:r}:void 0}}async function e6(e){if(e)try{await b(e)}catch{}}async function e9(e){try{await eH({projectRoot:process.cwd(),stateDir:e.stateDir,profileKey:e.state.remoteConfigPath,consumerKey:e.state.session})}catch{}}async function e4(e,t){if(t.leaseId)try{await e.leases.release({tenant:t.tenant,runId:t.runId,leaseId:t.leaseId,daemonBaseUrl:t.daemon?.baseUrl,daemonTransport:t.daemon?.transport,daemonServerMode:t.daemon?.serverMode})}catch{}}function e7(e){return e.leaseBackend?e.leaseBackend:"android"===e.platform?"android-instance":"ios"===e.platform?"ios-instance":void 0}function te(e){return!!(e.metroPublicBaseUrl||e.metroProxyBaseUrl||e.metroProjectRoot||e.metroKind)}function tt(e,t){return!e.platform||!t||"ios"!==t&&"android"!==t||e.platform===t}async function tn(e,t,n){if(t.leaseId&&t.leaseBackend===n){let r=await tr(e,t.leaseId,{tenant:t.tenant,runId:t.runId,leaseBackend:n});if(r)return r}return await e.leases.allocate({tenant:t.tenant,runId:t.runId,leaseBackend:n})}async function tr(e,t,n){try{return await e.leases.heartbeat({tenant:n.tenant,runId:n.runId,leaseId:t,leaseBackend:n.leaseBackend})}catch(e){var r;if((r=e)instanceof p&&"UNAUTHORIZED"===r.code&&(r.details?.reason==="LEASE_NOT_FOUND"||r.details?.reason==="LEASE_EXPIRED"||r.details?.reason==="LEASE_REVOKED"))return;throw e}}async function to(e){return await ti({command:e.command,flags:e.flags,stateDir:e.stateDir,allowInteractiveLogin:"connect"===e.command&&!e.flags.noLogin,env:e.env})}async function ti(e){let t=e.env??e.io?.env??process.env;if(!e.flags.daemonBaseUrl)return{flags:e.flags,source:"none"};if(ty(e.flags.daemonAuthToken))return{flags:e.flags,source:"flag"};if(ty(t.AGENT_DEVICE_DAEMON_AUTH_TOKEN))return{flags:e.flags,source:"env"};if(!function(e,t){if("1"===t.AGENT_DEVICE_CLOUD_AUTH||"true"===t.AGENT_DEVICE_CLOUD_AUTH||ty(t.AGENT_DEVICE_CLOUD_BASE_URL))return!0;try{let t=new URL(e).hostname.toLowerCase();return"agent-device.dev"===t||t.endsWith(".agent-device.dev")}catch{return!1}}(e.flags.daemonBaseUrl,t))return{flags:e.flags,source:"none"};let n=await td({stateDir:e.stateDir,flags:e.flags,env:t,io:e.io});if(n)return{flags:{...e.flags,daemonAuthToken:n.accessToken},source:"cli-session"};if(!e.allowInteractiveLogin){if(e.flags.noLogin)throw new p("UNAUTHORIZED","Remote daemon authentication is required.",{hint:"Run agent-device auth login, unset --no-login, or set AGENT_DEVICE_DAEMON_AUTH_TOKEN."});throw tm(e.command,t)}let r=await ts({stateDir:e.stateDir,flags:e.flags,env:t,io:e.io});return{flags:{...e.flags,daemonAuthToken:r.accessToken},source:"login"}}async function ta(e){let t=e.env??e.io?.env??process.env;if(ty(e.flags.daemonAuthToken))return{accessToken:e.flags.daemonAuthToken,cloudBaseUrl:th(t)};if(ty(t.AGENT_DEVICE_DAEMON_AUTH_TOKEN))return{accessToken:t.AGENT_DEVICE_DAEMON_AUTH_TOKEN,cloudBaseUrl:th(t)};let n=await td({stateDir:e.stateDir,flags:e.flags,env:t,io:e.io});if(n)return{accessToken:n.accessToken,cloudBaseUrl:n.cloudBaseUrl};if(e.flags.noLogin)throw new p("UNAUTHORIZED","Cloud connection profile authentication is required.",{hint:"Run agent-device auth login, unset --no-login, or set AGENT_DEVICE_DAEMON_AUTH_TOKEN."});let r=await ts({stateDir:e.stateDir,flags:e.flags,env:t,io:e.io,commandLabel:"agent-device connect"});return{accessToken:r.accessToken,cloudBaseUrl:r.session.cloudBaseUrl}}async function ts(t){let n,o,i,a=t.env??t.io?.env??process.env,s=(d=a,u=t.io,n=u?.stdinIsTTY??process.stdin.isTTY,o=u?.stdoutIsTTY??process.stdout.isTTY,"true"!==(f=d).CI&&"true"!==f.GITHUB_ACTIONS&&"true"!==f.BUILDKITE&&n&&o?(m=d).SSH_TTY||m.SSH_CONNECTION||"true"===m.CODESPACES||m.GITPOD_WORKSPACE_ID||"true"===m.REMOTE_CONTAINERS?"device-code":"local-browser":"non-interactive");if("non-interactive"===s)throw tm(t.commandLabel??"agent-device connect",a);let l=th(a),c=await tp({baseUrl:l,pathName:"/api/control-plane/device-auth/start",body:{client:"agent-device",tenant:t.flags.tenant,runId:t.flags.runId,daemonBaseUrl:t.flags.daemonBaseUrl,session:t.flags.session},fetchImpl:t.io?.fetch});var d,u,f,m,h,g,v=c;if(!ty(v.deviceCode)||!ty(v.userCode)||!ty(v.verificationUri))throw new p("COMMAND_FAILED","Cloud auth start returned an unusable response.");let w=c.verificationUriComplete??c.verificationUri,y="local-browser"===s?c.verificationUri:(h=c.verificationUri,g=c.userCode,(i=new URL(h)).searchParams.set("user_code",g),i.toString());"local-browser"===s?(tv(t.io,`Opening ${c.verificationUri}...
10
10
  `),await tg(w,t.io)):tv(t.io,`Open this URL on your machine:
11
11
  ${y}
12
12
 
@@ -16,7 +16,7 @@ Waiting for approval for 10 minutes...
16
16
  ${e}
17
17
  `)}}function tv(e,t){(e?.stderr??process.stderr).write(t)}function tw(e,t){if(!e)return!1;let n=Date.parse(e);return!Number.isFinite(n)||n<=(t?.()??Date.now())}function ty(e){return"string"==typeof e&&e.trim().length>0}async function tI(e){await new Promise(t=>setTimeout(t,e))}async function t$(t){let n=await ta({stateDir:t.stateDir,flags:t.flags,env:t.env,io:{env:t.env,fetch:t.fetchImpl}}),i=await tA({cloudBaseUrl:n.cloudBaseUrl,accessToken:n.accessToken,fetchImpl:t.fetchImpl}),a=function(e){try{return w(e)}catch(n){let t=u(n);throw new p("COMMAND_FAILED","Cloud connection profile returned invalid remote config.",{generatedConfigPath:e.configPath,cause:t.message},t)}}({configPath:function(t){var n;let i=function e(t){return Array.isArray(t)?t.map(e):t&&"object"==typeof t?Object.fromEntries(Object.entries(t).filter(([,e])=>void 0!==e).sort(([e],[t])=>e.localeCompare(t)).map(([t,n])=>[t,e(n)])):t}(t.profile),a=e.join(t.stateDir,"remote-connections","generated");r.mkdirSync(a,{recursive:!0,mode:448});let s=e.join(a,`cloud-${(n=i,o.createHash("sha256").update(JSON.stringify(n)).digest("hex").slice(0,16))}.json`);r.writeFileSync(s,`${JSON.stringify(i,null,2)}
18
18
  `,{mode:384});try{r.chmodSync(s,384)}catch{}return s}({stateDir:t.stateDir,profile:i}),cwd:t.cwd,env:t.env});return{flags:{...e1(a.profile),...t.flags,remoteConfig:a.resolvedPath,daemonAuthToken:n.accessToken},remoteConfigPath:a.resolvedPath}}async function tA(e){let t=e.fetchImpl??fetch,n=await t(new URL("/api/control-plane/connection-profile",e.cloudBaseUrl),{method:"GET",headers:{authorization:`Bearer ${e.accessToken}`},signal:AbortSignal.timeout(15e3)}),r=await n.text(),o={};if(r.trim())try{o=JSON.parse(r)}catch(e){throw new p("COMMAND_FAILED",`Cloud connection profile endpoint returned invalid JSON (${n.status}).`,{status:n.status},e instanceof Error?e:void 0)}if(!n.ok)throw new p("UNAUTHORIZED","Cloud connection profile endpoint rejected the request.",{status:n.status,response:o});var i=o;if(!i||"object"!=typeof i||Array.isArray(i))throw new p("COMMAND_FAILED","Cloud connection profile response is invalid.");let a=i.connection;if(!a||"object"!=typeof a)throw new p("COMMAND_FAILED","Cloud connection profile response is missing profile.");if(void 0!==a.remoteConfigProfile){var s=a.remoteConfigProfile;if(!s||"object"!=typeof s||Array.isArray(s))throw new p("COMMAND_FAILED","Cloud connection profile remoteConfigProfile is invalid.");if(0===Object.keys(s).length)throw new p("COMMAND_FAILED","Cloud connection profile remoteConfigProfile is empty.");return s}throw new p("COMMAND_FAILED","Cloud connection profile did not include remoteConfigProfile.")}function tC(e,t,n){var r;if(e.json)return void e_({success:!0,data:t});let o=n?.();o&&(r=o,process.stdout.write(r.endsWith("\n")?r:`${r}
19
- `))}let tS=async({flags:e,client:t})=>{var n,r,i,a;let s=x(e.stateDir).baseDir,l=e.remoteConfig?function(e){if(!e.remoteConfig)throw new p("INVALID_ARGS","connect requires --remote-config <path>.");let t=w({configPath:e.remoteConfig,cwd:process.cwd(),env:process.env});return{flags:e,remoteConfigPath:t.resolvedPath}}(e):await t$({flags:e,stateDir:s,cwd:process.cwd(),env:process.env}),c=l.flags,d=c.tenant,u=c.runId;if(!d)throw new p("INVALID_ARGS","connect requires tenant in remote config or via --tenant <id>.");if(!u)throw new p("INVALID_ARGS","connect requires runId in remote config or via --run-id <id>.");if(!c.daemonBaseUrl)throw new p("INVALID_ARGS","connect requires daemonBaseUrl in remote config, config, env, or --daemon-base-url.");let f=c.session?null:eZ({stateDir:s}),m=c.session??f?.session??function(e){for(let t=0;t<8;t+=1){let t=`adc-${o.randomBytes(3).toString("hex")}`;if(!eF({stateDir:e,session:t}))return t}return`adc-${Date.now().toString(36)}-${o.randomBytes(2).toString("hex")}`}(s),h=eJ(l.remoteConfigPath),g=eV(c),v=f?.session===m?f:eF({stateDir:s,session:m});if(v&&(n=v,r={flags:c,session:m,remoteConfigPath:l.remoteConfigPath,remoteConfigHash:h,desiredLeaseBackend:e7(c),daemon:g},n.remoteConfigPath!==r.remoteConfigPath||n.remoteConfigHash!==r.remoteConfigHash||n.session!==r.session||n.tenant!==r.flags.tenant||n.runId!==r.flags.runId||void 0!==r.desiredLeaseBackend&&n.leaseBackend!==r.desiredLeaseBackend||void 0!==r.flags.platform&&n.platform!==r.flags.platform||void 0!==r.flags.target&&n.target!==r.flags.target||(i=n.daemon,a=r.daemon,(i?.baseUrl??void 0)!==(a?.baseUrl??void 0)||(i?.transport??void 0)!==(a?.transport??void 0)||(i?.serverMode??void 0)!==(a?.serverMode??void 0)))&&!c.force)throw new p("INVALID_ARGS","A different remote connection is already active for this session. Re-run connect with --force to replace it.",{session:m,remoteConfig:v.remoteConfigPath});let y=new Date().toISOString(),I={version:1,session:m,remoteConfigPath:l.remoteConfigPath,remoteConfigHash:h,daemon:g,tenant:d,runId:u,leaseId:v&&!c.force?v.leaseId:void 0,leaseBackend:v&&!c.force?v.leaseBackend:e7(c),platform:c.platform??(v&&!c.force?v.platform:void 0),target:c.target??(v&&!c.force?v.target:void 0),runtime:v&&!c.force?v.runtime:void 0,metro:v&&!c.force?v.metro:void 0,connectedAt:v&&!c.force?v.connectedAt:y,updatedAt:y};eG({stateDir:s,state:I}),v&&c.force&&(await e9(v.metro),await e6({stateDir:s,state:v}),await e4(t,v));let $=tN(I),A=function(e,t){if(!t.runtime&&(te(e)||tk(t.remoteConfigPath)))return tP(t.remoteConfigPath)}(c,I);return tC(c,tR(I,A),()=>[`Connected remote session "${m}" tenant "${d}" run "${u}" ${I.leaseId?`lease ${I.leaseId}`:"lease pending"}`,$?.message,A?.message].filter(e=>!!e).join("\n")),!0},tx=async({flags:e,client:t})=>{let{session:n,stateDir:r,state:o}=t_(e);if(!o)return tD(e,n),!0;let i=o.session;try{await t.sessions.close({shutdown:e.shutdown})}catch{}await e9(o.metro),await e6({stateDir:r,state:o});let a=!1;if(o.leaseId)try{a=(await t.leases.release({tenant:o.tenant,runId:o.runId,leaseId:o.leaseId})).released}catch{}return eq({stateDir:r,session:i}),tC(e,{connected:!1,session:i,released:a},()=>`Disconnected remote session "${i}".`),!0},tb=async({positionals:e,flags:t})=>{if("status"!==e[0])throw new p("INVALID_ARGS","connection accepts only: status");let{session:n,state:r}=t_(t);if(!r)return tD(t,n),!0;let o=tN(r),i=function(e){if(!e.runtime&&tk(e.remoteConfigPath))return tP(e.remoteConfigPath)}(r);return tC(t,tR(r,i),()=>[`Connected remote session "${r.session}".`,`tenant=${r.tenant} runId=${r.runId} leaseId=${r.leaseId??"pending"} backend=${r.leaseBackend??"pending"}`,`remoteConfig=${r.remoteConfigPath}`,r.runtime?"metro=prepared":"metro=not-prepared",o?.message,i?.message].filter(e=>!!e).join("\n")),!0};function t_(e){let t=e.session??"default",n=x(e.stateDir).baseDir;return{session:t,stateDir:n,state:eF({stateDir:n,session:t})??(e.session?null:eZ({stateDir:n}))}}function tD(e,t){tC(e,{connected:!1,session:t},()=>`No remote connection for "${t}".`)}function tN(e){if(!e.leaseId)return{status:"deferred",nextSteps:["agent-device install-from-source <artifact-url> --platform ios|android","agent-device open <app-id> --relaunch","agent-device snapshot -i","agent-device devices"],message:"Lease allocation is pending; run install-from-source, open, snapshot, or devices when ready to allocate or refresh the lease."+(void 0===e.platform&&void 0===e.leaseBackend?" Add --platform ios|android if the profile does not set a platform.":"")}}function tP(e){let t=`agent-device metro prepare --remote-config ${e}`;return{status:"deferred",nextStep:t,message:`Metro runtime is not prepared yet; it will be prepared automatically on first open, or run "${t}" to inspect it before launch.`}}function tk(e){try{let t=w({configPath:e,cwd:process.cwd(),env:process.env}).profile;return!!(t.metroPublicBaseUrl||t.metroProxyBaseUrl||t.metroProjectRoot||t.metroKind)}catch{return!1}}function tR(e,t){let n=tN(e);return{connected:!0,session:e.session,tenant:e.tenant,runId:e.runId,leaseAllocated:!!e.leaseId,leaseId:e.leaseId,leaseBackend:e.leaseBackend,platform:e.platform,target:e.target,remoteConfig:e.remoteConfigPath,remoteConfigHash:e.remoteConfigHash,daemonBaseUrlFingerprint:function(e){if(e)return o.createHash("sha256").update(e).digest("hex").slice(0,12)}(e.daemon?.baseUrl),metro:e.metro?{prepared:!0,projectRoot:e.metro.projectRoot}:{prepared:!1},...n?{leasePreparation:n}:{},...t?{runtimePreparation:t}:{},connectedAt:e.connectedAt,updatedAt:e.updatedAt}}let tU=async({positionals:e,flags:t})=>{let n=e[0]??"status",o=x(t.stateDir).baseDir;if("status"===n){var i;let e,n=(e=tl({stateDir:(i={stateDir:o}).stateDir}))?{authenticated:!0,source:"cli-session",sessionId:e.id,cloudBaseUrl:e.cloudBaseUrl,workspaceId:e.workspaceId,accountId:e.accountId,name:e.name,createdAt:e.createdAt,expiresAt:e.expiresAt,expired:tw(e.expiresAt,i.now)}:{authenticated:!1,source:"none"};return tC(t,n,()=>{var e;return(e=n).authenticated?["Authenticated with cloud CLI session.",`cloud=${e.cloudBaseUrl}`,`session=${e.sessionId}`,e.workspaceId?`workspace=${e.workspaceId}`:null,e.accountId?`account=${e.accountId}`:null,e.expiresAt?`expiresAt=${e.expiresAt}`:null,e.expired?"status=expired":null].filter(e=>!!e).join("\n"):"Not authenticated."}),!0}if("login"===n){let e=await ts({stateDir:o,flags:t,commandLabel:"agent-device auth login"});return tC(t,{authenticated:!0,source:"cli-session",sessionId:e.session.id,cloudBaseUrl:e.session.cloudBaseUrl,workspaceId:e.session.workspaceId,accountId:e.session.accountId,expiresAt:e.session.expiresAt,agentTokenExpiresAt:e.expiresAt},()=>"Authenticated with cloud CLI session."),!0}if("logout"===n){let e,n=(e=tc({stateDir:o}.stateDir),!!r.existsSync(e)&&(r.rmSync(e,{force:!0}),!0));return tC(t,{authenticated:!1,removed:n},()=>n?"Removed stored cloud CLI session.":"No stored cloud CLI session."),!0}throw new p("INVALID_ARGS","auth accepts only: status, login, logout")};function tE(e){return tB(E(e))}function tT(e){let t=e.ref??"",n=e.x,r=e.y;return t&&"number"==typeof n&&"number"==typeof r?{data:e,text:`Tapped @${t} (${n}, ${r})`}:tB(e)}function tB(e){return{data:e,text:B(e)}}function tM(e){let t=e.kind?` ${e.kind}`:"",n=e.target?` target=${e.target}`:"",r="boolean"==typeof e.booted?` booted=${e.booted}`:"";return`${e.name} (${e.platform}${t}${n})${r}`}function tL(e,t,n){"string"==typeof n&&e.push(` ${t}: ${n}`)}function tO(e,t){return t.map(t=>void 0!==e[t]&&null!==e[t]?`${t}=${e[t]}`:"").filter(Boolean).join(" ")||void 0}function tj(e){if(!Array.isArray(e))return;let t=e.filter(e=>"string"==typeof e&&e.length>0);return t.length>0?t.join("\n"):void 0}function tK(e){return e.filter(e=>!!e).join("\n")||void 0}function tH(e,t){return e?`Performance: ${e}`:`Frame health: unavailable - ${t}`}function tF(e){return e&&"object"==typeof e&&!Array.isArray(e)?e:void 0}function tG(e){return"number"==typeof e&&Number.isFinite(e)?e:void 0}function tV(e){return`${Number.isInteger(e)?e:e.toFixed(1)}%`}function tq(e){let t=Math.max(0,Math.round(e));if(t<1e3)return`${t}ms`;let n=Math.round(t/1e3);if(n<60)return`${n}s`;let r=Math.floor(n/60),o=n%60;return o>0?`${r}m ${o}s`:`${r}m`}function tJ(e){return({result:t})=>e(t)}let tz=tJ(function(e){return tB(e)}),tW={boot:tJ(function(e){let t=e.platform??"unknown",n=e.device??e.id??"unknown";return{data:e,text:`Boot ready: ${n} (${t})`}}),click:tJ(tT),press:tJ(tT),batch:tJ(function(e){let t="number"==typeof e.total?e.total:0,n="number"==typeof e.executed?e.executed:0,r="number"==typeof e.totalDurationMs?e.totalDurationMs:void 0,o=[`Batch completed: ${n}/${t} steps${void 0!==r?` in ${r}ms`:""}`];for(let t of Array.isArray(e.results)?e.results:[]){let e=function(e){let t=tF(e);if(!t)return;let n="number"==typeof t.step?t.step:void 0,r="string"==typeof t.command?t.command:"step",o=!1!==t.ok,i=function(e,t,n){var r;return t?B(tF(e.data))??n:(r=tF(e.error),("string"==typeof r?.message&&r.message.length>0?r.message:null)??n)}(t,o,r),a=void 0!==n?`${n}. `:"- ",s="number"==typeof t.durationMs?t.durationMs:void 0,l=void 0!==s?` (${s}ms)`:"";return`${a}${o?"OK":"FAILED"} ${i}${l}`}(t);e&&o.push(e)}return{data:e,text:o.join("\n")}}),devices:tJ(function(e){return{data:{devices:e.map(R)},text:e.map(tM).join("\n")}}),apps:({input:e,result:t})=>{var n;return{data:{apps:(n={result:t,appsFilter:e.appsFilter}).result},stderr:"all"===n.appsFilter?"Showing all apps, including system apps.\n":"Showing user-installed apps. Use --all to include system apps.\n",text:n.result.length>0?n.result.join("\n"):"all"===n.appsFilter?"No apps found.":"No user-installed apps found."}},session:tJ(function(e){let t={sessions:e.sessions.map(U)};return{data:t,text:JSON.stringify(t,null,2)}}),open:tJ(function(e){return tB(P(e))}),close:tJ(function(e){return tB(N(e))}),install:tJ(tE),reinstall:tJ(tE),"install-from-source":tJ(function(e){return tB(k(e))}),snapshot:({input:e,result:t})=>{var n;let r;return{data:r=T((n={result:t,raw:e.raw,interactiveOnly:e.interactiveOnly,scope:e.scope,depth:e.depth}).result),jsonData:function(e){let{unchanged:t,...n}=e;return n}(r),text:function(e,t={}){var n,r,o,l;let c,u,f,p,m,h=e.nodes,g=Array.isArray(h)?h:[],v="string"==typeof e.backend?e.backend:void 0,w=function(e,t,n){let r;if(n.raw||!((r=e.androidSnapshot)&&"object"==typeof r&&"android-helper"===r.backend))return{nodes:t,filteredCount:0};let o=function(e){var t,n;if(0===e.length)return e;let r=new Set,o=new Map,i=new Map(e.map(e=>[e.index,e]));(function(e,t){for(let n of e)!n.rect||eu(n.rect)||ep(n)||ey(e,n.index,t)})(e,r),function(e,t,n,r){for(let o of e){if(n.has(o.index)||o.rect||ep(o))continue;let i=function(e,t,n){let r=e;for(;"number"==typeof r.parentIndex;){let e=t.get(r.parentIndex);if(!e)break;if(n(e))return e;r=e}return null}(o,t,eh);i&&function(e,t,n){if(!n)return;let r=e.get(t.index)??t;e.set(t.index,{...r,hiddenContentAbove:!0===r.hiddenContentAbove||"above"===n||void 0,hiddenContentBelow:!0===r.hiddenContentBelow||"below"===n||void 0})}(r,i,function(e,t){let n=t.filter(t=>t.parentIndex===e.parentIndex&&t.rect&&eu(t.rect)).map(e=>e.index);return 0===n.length?null:e.index<Math.min(...n)?"above":e.index>Math.max(...n)?"below":null}(o,e)),ey(e,o.index,n)}}(e,i,r,o);for(let n of e){if(r.has(n.index)||!(!0===(t=n).hittable&&!em(t)&&t.rect&&eu(t.rect)&&0===eg(t).trim().length))continue;let i=function(e,t,n){let r=[],o=[],i=new Set;for(let a of e){if(n.has(a.index)||!eA(a)||!ef(a.rect,t.rect))continue;let e=eg(a).trim().replace(/\s+/g," "),s=ev(e);o.push(a.index),!e||!s||i.has(s)||(i.add(s),r.push(e))}return{label:r.join(", "),removableIndexes:o}}(ew(e,n.index),n,r);if(i.label)for(let t of(o.set(n.index,{...n,...o.get(n.index),label:i.label}),i.removableIndexes))ey(e,t,r)}for(let t of e){if(r.has(t.index)||!(!0===(n=t).hittable&&!em(n)&&n.rect&&eu(n.rect)&&ev(eg(n))))continue;let o=ev(eg(t));if(!o)continue;let i=ew(e,t.index).filter(e=>!r.has(e.index)&&function(e,t,n){if(!eC(t)||!ef(t.rect,e.rect))return!1;let r=ev(eg(t));return!!(r&&n!==r&&n.includes(r))}(t,e,o));for(let t of i.filter(eA))ey(e,t.index,r);let a=i.filter(e=>!eA(e)),s=new Set(a.map(e=>ev(eg(e))).filter(e=>!!e));if(!(a.length<2)&&!(s.size<2))for(let t of a)ey(e,t.index,r)}let a=new Map;for(let t of e){if(r.has(t.index)||!eC(t))continue;let n=ev(eg(t));if(!n)continue;let i=a.get(n);if(i&&function(e,t,n){var r,o,i,a;return!n.has(e.index)&&(r=e.rect,o=t.rect,!r||!o||Math.abs(r.y+r.height/2-(o.y+o.height/2))<=Math.max(r.height,o.height,1))&&(i=e,a=t,(i.parentIndex===a.parentIndex?3>=Math.abs(i.index-a.index):i.parentIndex!==a.index&&a.parentIndex!==i.index&&1>=Math.abs((i.depth??0)-(a.depth??0))&&2>=Math.abs(i.index-a.index))||function(e,t){let n=e.parentIndex===t.index?t:t.parentIndex===e.index?e:null,r=n?.index===e.index?t:n?.index===t.index?e:null;return!!n&&!!r&&eS(n,r).index===n.index}(e,t))}(i,t,r)){let s=function(e,t,n,r,o){var i,a,s;let l=eS(t,n),c=l.index===t.index?n:t,d=(c.type??"").toLowerCase().includes("image")?"has image":null,u=o.get(l.index)??l,f=o.get(c.index)?.presentationHints??c.presentationHints;return o.set(l.index,{...u,presentationHints:(i=u.presentationHints,a=f,s=d,[...new Set([...Array.isArray(i)?i:[],...Array.isArray(a)?a:[],...s?[s]:[]])])}),ey(e,c.index,r),o.get(l.index)??l}(e,i,t,r,o);a.set(n,s);continue}a.set(n,t)}return e.filter(e=>!r.has(e.index)).map(e=>o.get(e.index)??e)}(t);return{nodes:o,filteredCount:t.length-o.length}}(e,g,t),y=(c="string"==typeof(n=e).appName?n.appName:void 0,u="string"==typeof n.appBundleId?n.appBundleId:void 0,f=[],c&&f.push(`Page: ${c}`),u&&f.push(`App: ${u}`),f.length>0?`${f.join("\n")}
19
+ `))}let tS=async({flags:e,client:t})=>{var n,r,i,a;let s=x(e.stateDir).baseDir,l=e.remoteConfig?function(e){if(!e.remoteConfig)throw new p("INVALID_ARGS","connect requires --remote-config <path>.");let t=w({configPath:e.remoteConfig,cwd:process.cwd(),env:process.env});return{flags:e,remoteConfigPath:t.resolvedPath}}(e):await t$({flags:e,stateDir:s,cwd:process.cwd(),env:process.env}),c=l.flags,d=c.tenant,u=c.runId;if(!d)throw new p("INVALID_ARGS","connect requires tenant in remote config or via --tenant <id>.");if(!u)throw new p("INVALID_ARGS","connect requires runId in remote config or via --run-id <id>.");if(!c.daemonBaseUrl)throw new p("INVALID_ARGS","connect requires daemonBaseUrl in remote config, config, env, or --daemon-base-url.");let f=c.session?null:eZ({stateDir:s}),m=c.session??f?.session??function(e){for(let t=0;t<8;t+=1){let t=`adc-${o.randomBytes(3).toString("hex")}`;if(!eF({stateDir:e,session:t}))return t}return`adc-${Date.now().toString(36)}-${o.randomBytes(2).toString("hex")}`}(s),h=eJ(l.remoteConfigPath),g=eV(c),v=f?.session===m?f:eF({stateDir:s,session:m});if(v&&(n=v,r={flags:c,session:m,remoteConfigPath:l.remoteConfigPath,remoteConfigHash:h,desiredLeaseBackend:e7(c),daemon:g},n.remoteConfigPath!==r.remoteConfigPath||n.remoteConfigHash!==r.remoteConfigHash||n.session!==r.session||n.tenant!==r.flags.tenant||n.runId!==r.flags.runId||void 0!==r.desiredLeaseBackend&&n.leaseBackend!==r.desiredLeaseBackend||void 0!==r.flags.platform&&n.platform!==r.flags.platform||void 0!==r.flags.target&&n.target!==r.flags.target||(i=n.daemon,a=r.daemon,(i?.baseUrl??void 0)!==(a?.baseUrl??void 0)||(i?.transport??void 0)!==(a?.transport??void 0)||(i?.serverMode??void 0)!==(a?.serverMode??void 0)))&&!c.force)throw new p("INVALID_ARGS","A different remote connection is already active for this session. Re-run connect with --force to replace it.",{session:m,remoteConfig:v.remoteConfigPath});let y=new Date().toISOString(),I={version:1,session:m,remoteConfigPath:l.remoteConfigPath,remoteConfigHash:h,daemon:g,tenant:d,runId:u,leaseId:v&&!c.force?v.leaseId:void 0,leaseBackend:v&&!c.force?v.leaseBackend:e7(c),platform:c.platform??(v&&!c.force?v.platform:void 0),target:c.target??(v&&!c.force?v.target:void 0),runtime:v&&!c.force?v.runtime:void 0,metro:v&&!c.force?v.metro:void 0,connectedAt:v&&!c.force?v.connectedAt:y,updatedAt:y};eG({stateDir:s,state:I}),v&&c.force&&(await e6(v.metro),await e9({stateDir:s,state:v}),await e4(t,v));let $=tN(I),A=function(e,t){if(!t.runtime&&(te(e)||tk(t.remoteConfigPath)))return tP(t.remoteConfigPath)}(c,I);return tC(c,tR(I,A),()=>[`Connected remote session "${m}" tenant "${d}" run "${u}" ${I.leaseId?`lease ${I.leaseId}`:"lease pending"}`,$?.message,A?.message].filter(e=>!!e).join("\n")),!0},tx=async({flags:e,client:t})=>{let{session:n,stateDir:r,state:o}=t_(e);if(!o)return tD(e,n),!0;let i=o.session;try{await t.sessions.close({shutdown:e.shutdown})}catch{}await e6(o.metro),await e9({stateDir:r,state:o});let a=!1;if(o.leaseId)try{a=(await t.leases.release({tenant:o.tenant,runId:o.runId,leaseId:o.leaseId})).released}catch{}return eq({stateDir:r,session:i}),tC(e,{connected:!1,session:i,released:a},()=>`Disconnected remote session "${i}".`),!0},tb=async({positionals:e,flags:t})=>{if("status"!==e[0])throw new p("INVALID_ARGS","connection accepts only: status");let{session:n,state:r}=t_(t);if(!r)return tD(t,n),!0;let o=tN(r),i=function(e){if(!e.runtime&&tk(e.remoteConfigPath))return tP(e.remoteConfigPath)}(r);return tC(t,tR(r,i),()=>[`Connected remote session "${r.session}".`,`tenant=${r.tenant} runId=${r.runId} leaseId=${r.leaseId??"pending"} backend=${r.leaseBackend??"pending"}`,`remoteConfig=${r.remoteConfigPath}`,r.runtime?"metro=prepared":"metro=not-prepared",o?.message,i?.message].filter(e=>!!e).join("\n")),!0};function t_(e){let t=e.session??"default",n=x(e.stateDir).baseDir;return{session:t,stateDir:n,state:eF({stateDir:n,session:t})??(e.session?null:eZ({stateDir:n}))}}function tD(e,t){tC(e,{connected:!1,session:t},()=>`No remote connection for "${t}".`)}function tN(e){if(!e.leaseId)return{status:"deferred",nextSteps:["agent-device install-from-source <artifact-url> --platform ios|android","agent-device open <app-id> --relaunch","agent-device snapshot -i","agent-device devices"],message:"Lease allocation is pending; run install-from-source, open, snapshot, or devices when ready to allocate or refresh the lease."+(void 0===e.platform&&void 0===e.leaseBackend?" Add --platform ios|android if the profile does not set a platform.":"")}}function tP(e){let t=`agent-device metro prepare --remote-config ${e}`;return{status:"deferred",nextStep:t,message:`Metro runtime is not prepared yet; it will be prepared automatically on first open, or run "${t}" to inspect it before launch.`}}function tk(e){try{let t=w({configPath:e,cwd:process.cwd(),env:process.env}).profile;return!!(t.metroPublicBaseUrl||t.metroProxyBaseUrl||t.metroProjectRoot||t.metroKind)}catch{return!1}}function tR(e,t){let n=tN(e);return{connected:!0,session:e.session,tenant:e.tenant,runId:e.runId,leaseAllocated:!!e.leaseId,leaseId:e.leaseId,leaseBackend:e.leaseBackend,platform:e.platform,target:e.target,remoteConfig:e.remoteConfigPath,remoteConfigHash:e.remoteConfigHash,daemonBaseUrlFingerprint:function(e){if(e)return o.createHash("sha256").update(e).digest("hex").slice(0,12)}(e.daemon?.baseUrl),metro:e.metro?{prepared:!0,projectRoot:e.metro.projectRoot}:{prepared:!1},...n?{leasePreparation:n}:{},...t?{runtimePreparation:t}:{},connectedAt:e.connectedAt,updatedAt:e.updatedAt}}let tU=async({positionals:e,flags:t})=>{let n=e[0]??"status",o=x(t.stateDir).baseDir;if("status"===n){var i;let e,n=(e=tl({stateDir:(i={stateDir:o}).stateDir}))?{authenticated:!0,source:"cli-session",sessionId:e.id,cloudBaseUrl:e.cloudBaseUrl,workspaceId:e.workspaceId,accountId:e.accountId,name:e.name,createdAt:e.createdAt,expiresAt:e.expiresAt,expired:tw(e.expiresAt,i.now)}:{authenticated:!1,source:"none"};return tC(t,n,()=>{var e;return(e=n).authenticated?["Authenticated with cloud CLI session.",`cloud=${e.cloudBaseUrl}`,`session=${e.sessionId}`,e.workspaceId?`workspace=${e.workspaceId}`:null,e.accountId?`account=${e.accountId}`:null,e.expiresAt?`expiresAt=${e.expiresAt}`:null,e.expired?"status=expired":null].filter(e=>!!e).join("\n"):"Not authenticated."}),!0}if("login"===n){let e=await ts({stateDir:o,flags:t,commandLabel:"agent-device auth login"});return tC(t,{authenticated:!0,source:"cli-session",sessionId:e.session.id,cloudBaseUrl:e.session.cloudBaseUrl,workspaceId:e.session.workspaceId,accountId:e.session.accountId,expiresAt:e.session.expiresAt,agentTokenExpiresAt:e.expiresAt},()=>"Authenticated with cloud CLI session."),!0}if("logout"===n){let e,n=(e=tc({stateDir:o}.stateDir),!!r.existsSync(e)&&(r.rmSync(e,{force:!0}),!0));return tC(t,{authenticated:!1,removed:n},()=>n?"Removed stored cloud CLI session.":"No stored cloud CLI session."),!0}throw new p("INVALID_ARGS","auth accepts only: status, login, logout")};function tE(e){return tB(E(e))}function tT(e){let t=e.ref??"",n=e.x,r=e.y;return t&&"number"==typeof n&&"number"==typeof r?{data:e,text:`Tapped @${t} (${n}, ${r})`}:tB(e)}function tB(e){return{data:e,text:B(e)}}function tM(e){let t=e.kind?` ${e.kind}`:"",n=e.target?` target=${e.target}`:"",r="boolean"==typeof e.booted?` booted=${e.booted}`:"";return`${e.name} (${e.platform}${t}${n})${r}`}function tL(e,t,n){"string"==typeof n&&e.push(` ${t}: ${n}`)}function tO(e,t){return t.map(t=>void 0!==e[t]&&null!==e[t]?`${t}=${e[t]}`:"").filter(Boolean).join(" ")||void 0}function tj(e){if(!Array.isArray(e))return;let t=e.filter(e=>"string"==typeof e&&e.length>0);return t.length>0?t.join("\n"):void 0}function tK(e){return e.filter(e=>!!e).join("\n")||void 0}function tH(e,t){return e?`Performance: ${e}`:`Frame health: unavailable - ${t}`}function tF(e){return e&&"object"==typeof e&&!Array.isArray(e)?e:void 0}function tG(e){return"number"==typeof e&&Number.isFinite(e)?e:void 0}function tV(e){return`${Number.isInteger(e)?e:e.toFixed(1)}%`}function tq(e){let t=Math.max(0,Math.round(e));if(t<1e3)return`${t}ms`;let n=Math.round(t/1e3);if(n<60)return`${n}s`;let r=Math.floor(n/60),o=n%60;return o>0?`${r}m ${o}s`:`${r}m`}function tJ(e){return({result:t})=>e(t)}let tz=tJ(function(e){return tB(e)}),tW={boot:tJ(function(e){let t=e.platform??"unknown",n=e.device??e.id??"unknown";return{data:e,text:`Boot ready: ${n} (${t})`}}),click:tJ(tT),press:tJ(tT),batch:tJ(function(e){let t="number"==typeof e.total?e.total:0,n="number"==typeof e.executed?e.executed:0,r="number"==typeof e.totalDurationMs?e.totalDurationMs:void 0,o=[`Batch completed: ${n}/${t} steps${void 0!==r?` in ${r}ms`:""}`];for(let t of Array.isArray(e.results)?e.results:[]){let e=function(e){let t=tF(e);if(!t)return;let n="number"==typeof t.step?t.step:void 0,r="string"==typeof t.command?t.command:"step",o=!1!==t.ok,i=function(e,t,n){var r;return t?B(tF(e.data))??n:(r=tF(e.error),("string"==typeof r?.message&&r.message.length>0?r.message:null)??n)}(t,o,r),a=void 0!==n?`${n}. `:"- ",s="number"==typeof t.durationMs?t.durationMs:void 0,l=void 0!==s?` (${s}ms)`:"";return`${a}${o?"OK":"FAILED"} ${i}${l}`}(t);e&&o.push(e)}return{data:e,text:o.join("\n")}}),devices:tJ(function(e){return{data:{devices:e.map(R)},text:e.map(tM).join("\n")}}),apps:({input:e,result:t})=>{var n;return{data:{apps:(n={result:t,appsFilter:e.appsFilter}).result},stderr:"all"===n.appsFilter?"Showing all apps, including system apps.\n":"Showing user-installed apps. Use --all to include system apps.\n",text:n.result.length>0?n.result.join("\n"):"all"===n.appsFilter?"No apps found.":"No user-installed apps found."}},session:tJ(function(e){let t={sessions:e.sessions.map(U)};return{data:t,text:JSON.stringify(t,null,2)}}),open:tJ(function(e){return tB(P(e))}),close:tJ(function(e){return tB(N(e))}),install:tJ(tE),reinstall:tJ(tE),"install-from-source":tJ(function(e){return tB(k(e))}),snapshot:({input:e,result:t})=>{var n;let r;return{data:r=T((n={result:t,raw:e.raw,interactiveOnly:e.interactiveOnly,scope:e.scope,depth:e.depth}).result),jsonData:function(e){let{unchanged:t,...n}=e;return n}(r),text:function(e,t={}){var n,r,o,l;let c,u,f,p,m,h=e.nodes,g=Array.isArray(h)?h:[],v="string"==typeof e.backend?e.backend:void 0,w=function(e,t,n){let r;if(n.raw||!((r=e.androidSnapshot)&&"object"==typeof r&&"android-helper"===r.backend))return{nodes:t,filteredCount:0};let o=function(e){var t,n;if(0===e.length)return e;let r=new Set,o=new Map,i=new Map(e.map(e=>[e.index,e]));(function(e,t){for(let n of e)!n.rect||eu(n.rect)||ep(n)||ey(e,n.index,t)})(e,r),function(e,t,n,r){for(let o of e){if(n.has(o.index)||o.rect||ep(o))continue;let i=function(e,t,n){let r=e;for(;"number"==typeof r.parentIndex;){let e=t.get(r.parentIndex);if(!e)break;if(n(e))return e;r=e}return null}(o,t,eh);i&&function(e,t,n){if(!n)return;let r=e.get(t.index)??t;e.set(t.index,{...r,hiddenContentAbove:!0===r.hiddenContentAbove||"above"===n||void 0,hiddenContentBelow:!0===r.hiddenContentBelow||"below"===n||void 0})}(r,i,function(e,t){let n=t.filter(t=>t.parentIndex===e.parentIndex&&t.rect&&eu(t.rect)).map(e=>e.index);return 0===n.length?null:e.index<Math.min(...n)?"above":e.index>Math.max(...n)?"below":null}(o,e)),ey(e,o.index,n)}}(e,i,r,o);for(let n of e){if(r.has(n.index)||!(!0===(t=n).hittable&&!em(t)&&t.rect&&eu(t.rect)&&0===eg(t).trim().length))continue;let i=function(e,t,n){let r=[],o=[],i=new Set;for(let a of e){if(n.has(a.index)||!eA(a)||!ef(a.rect,t.rect))continue;let e=eg(a).trim().replace(/\s+/g," "),s=ev(e);o.push(a.index),!e||!s||i.has(s)||(i.add(s),r.push(e))}return{label:r.join(", "),removableIndexes:o}}(ew(e,n.index),n,r);if(i.label)for(let t of(o.set(n.index,{...n,...o.get(n.index),label:i.label}),i.removableIndexes))ey(e,t,r)}for(let t of e){if(r.has(t.index)||!(!0===(n=t).hittable&&!em(n)&&n.rect&&eu(n.rect)&&ev(eg(n))))continue;let o=ev(eg(t));if(!o)continue;let i=ew(e,t.index).filter(e=>!r.has(e.index)&&function(e,t,n){if(!eC(t)||!ef(t.rect,e.rect))return!1;let r=ev(eg(t));return!!(r&&n!==r&&n.includes(r))}(t,e,o));for(let t of i.filter(eA))ey(e,t.index,r);let a=i.filter(e=>!eA(e)),s=new Set(a.map(e=>ev(eg(e))).filter(e=>!!e));if(!(a.length<2)&&!(s.size<2))for(let t of a)ey(e,t.index,r)}let a=new Map;for(let t of e){if(r.has(t.index)||!eC(t))continue;let n=ev(eg(t));if(!n)continue;let i=a.get(n);if(i&&function(e,t,n){var r,o,i,a;return!n.has(e.index)&&(r=e.rect,o=t.rect,!r||!o||Math.abs(r.y+r.height/2-(o.y+o.height/2))<=Math.max(r.height,o.height,1))&&(i=e,a=t,(i.parentIndex===a.parentIndex?3>=Math.abs(i.index-a.index):i.parentIndex!==a.index&&a.parentIndex!==i.index&&1>=Math.abs((i.depth??0)-(a.depth??0))&&2>=Math.abs(i.index-a.index))||function(e,t){let n=e.parentIndex===t.index?t:t.parentIndex===e.index?e:null,r=n?.index===e.index?t:n?.index===t.index?e:null;return!!n&&!!r&&eS(n,r).index===n.index}(e,t))}(i,t,r)){let s=function(e,t,n,r,o){var i,a,s;let l=eS(t,n),c=l.index===t.index?n:t,d=(c.type??"").toLowerCase().includes("image")?"has image":null,u=o.get(l.index)??l,f=o.get(c.index)?.presentationHints??c.presentationHints;return o.set(l.index,{...u,presentationHints:(i=u.presentationHints,a=f,s=d,[...new Set([...Array.isArray(i)?i:[],...Array.isArray(a)?a:[],...s?[s]:[]])])}),ey(e,c.index,r),o.get(l.index)??l}(e,i,t,r,o);a.set(n,s);continue}a.set(n,t)}return e.filter(e=>!r.has(e.index)).map(e=>o.get(e.index)??e)}(t);return{nodes:o,filteredCount:t.length-o.length}}(e,g,t),y=(c="string"==typeof(n=e).appName?n.appName:void 0,u="string"==typeof n.appBundleId?n.appBundleId:void 0,f=[],c&&f.push(`Page: ${c}`),u&&f.push(`App: ${u}`),f.length>0?`${f.join("\n")}
20
20
  `:""),I=function(e,t,n,r={nodes:t,filteredCount:0}){let o=eL(e),i=function(e,t){if(!0===t.scoped||!0===t.depthLimited||e.length>3)return null;let n=1===e.length?"node":"nodes";return`Hint: sparse accessibility snapshot returned ${e.length} ${n}. The app may expose limited accessibility metadata; run screenshot --overlay-refs for visual context.`}(t,n);i&&o.push(i),!n.raw&&r.filteredCount>0&&o.push(`Collapsed ${r.filteredCount} Android helper node${1===r.filteredCount?"":"s"} from the agent-facing text snapshot; use --raw or --json for the full hierarchy.`);let s=r.filteredCount>0?r.nodes:t;return!n.raw&&function(e){if(e.length<20)return!1;let t=new Map;for(let n of e){let e=(n.type??"").toLowerCase(),r=function(e){var t;let n=e.trim().replace(/\s+/g," ").toLowerCase();return!n||(t=n,/\S+@\S+\.\S+/.test(t))?null:n}(a(n));if(!r)continue;let o=`${e}|${r}`,i=t.get(o)??[];i.push(n),t.set(o,i)}let n=0;for(let e of t.values())!(e.length<=1)&&function(e){for(let r=0;r<e.length;r+=1)for(let o=r+1;o<e.length;o+=1){var t,n;if(t=e[r]?.rect,n=e[o]?.rect,!t||!n||!(t.x+t.width<=n.x+.5||n.x+n.width<=t.x+.5||t.y+t.height<=n.y+.5||n.y+n.height<=t.y+.5))return!0}return!1}(e)&&(n+=e.length);return n>=8}(s)&&o.push("Warning: possible repeated nav subtree detected."),o}(e,g,t,w),$=I.length>0?`${I.join("\n")}
21
21
  `:"",A=t.raw?null:(p=e.unchanged)&&"object"==typeof p?"number"!=typeof p.ageMs||"number"!=typeof p.nodeCount?null:{ageMs:p.ageMs,nodeCount:p.nodeCount,interactiveOnly:!0===p.interactiveOnly||void 0,scope:"string"==typeof p.scope?p.scope:void 0}:null;if(A){let e;return`${y}${$}${e=function(e){if(e<1e3)return`${Math.round(e)}ms`;if(e<6e4)return`${(Math.round(e/100)/10).toFixed(1)}s`;let t=e/6e4;return t<60?`${(Math.round(10*t)/10).toFixed(1)}m`:`${(Math.round(t/60*10)/10).toFixed(1)}h`}((r=A).ageMs),r.scope?`Scoped snapshot unchanged for scope "${r.scope}" since previous read ${e} ago.
22
22
  Previous refs in this scope remain valid. Use find/get/is for a targeted query, or --force-full to re-emit.`:r.interactiveOnly?`Interactive snapshot unchanged since previous read ${e} ago.
@@ -35,12 +35,12 @@ ${$}${(function(e){let t=[],n=[],r=new Map(e.map(e=>[e.node.index,e.node])),o=e=
35
35
  `:"";if(!l)return`${d}${f}${i} additions, ${a} removals, ${s} unchanged
36
36
  `;let p=`${(n=String(i),t("green",n))} additions, ${t("red",String(a))} removals, ${t("dim",String(s))} unchanged`;return`${d}${f}${p}
37
37
  `})(o)),!0}if("screenshot"!==e[0])return!1;let i=n.baseline;if(!i||"string"!=typeof i)throw new p("INVALID_ARGS","diff screenshot requires --baseline <path>");let a=z(i),s="string"==typeof n.out?z(n.out):void 0,d=e[1];if(e.length>2)throw new p("INVALID_ARGS","diff screenshot accepts at most one current screenshot path");let u=c({backend:(o=r,{platform:function(e){switch(e.platform){case"android":case"linux":case"macos":return e.platform;default:return"ios"}}(n),captureScreenshot:async(e,t,n)=>{let r=await o.capture.screenshot({path:t,session:e.session,overlayRefs:n?.overlayRefs,fullscreen:n?.fullscreen,stabilize:n?.stabilize,surface:n?.surface});return{path:r.path,...r.overlayRefs?{overlayRefs:r.overlayRefs}:{}}}}),artifacts:Z(),sessions:{get:e=>({name:e}),set:()=>{}},policy:l()}),f=await u.capture.diffScreenshot({session:n.session,baseline:{kind:"path",path:a},current:d?{kind:"path",path:z(d)}:{kind:"live"},...s?{out:{kind:"path",path:s}}:{},threshold:function(e){if(null!=e&&""!==e)return Number(e)}(n.threshold),overlayRefs:n.overlayRefs,surface:n.surface});return tC(n,f,()=>{var e,n,r,o;let i,a,s,l,c,d,u,p;return i=eB(),a=!0===f.match,s=f.dimensionMismatch,(l=[]).push(...function(e,n){if(!0===e.match){let e=n?t("green","✓"):"✓";return[`${e} Screenshots match.`]}let r=e.dimensionMismatch,o=n?t("red","✗"):"✗";if(r){let e=r.expected,t=r.actual;return[`${o} Screenshots have different dimensions: expected ${e?.width}x${e?.height}, got ${t?.width}x${t?.height}`]}let i=eT(e.differentPixels),a=eT(e.mismatchPercentage),s=0===a&&i>0?"<0.01":String(a),l=`${s}% pixels differ`;return[`${o} ${n?t("red",l):l}`]}(f,i)),l.push(...function(e,n,r){if(n)return[];let o=[];if(e.diffPath){let n=eE(e.diffPath),i=r?t("dim","Diff image:"):"Diff image:",a=r?t("green",n):n;o.push(` ${i} ${a}`)}if(e.currentOverlayPath){let n=eE(e.currentOverlayPath),i=r?t("dim","Current overlay:"):"Current overlay:",a=r?t("green",n):n,s=eT(e.currentOverlayRefCount),l=s>0?` (${s} refs)`:"";o.push(` ${i} ${a}${l}`)}return o}(f,a,i)),a||s||(l.push(...(e=f,n=i,c=eT(e.differentPixels),d=eT(e.totalPixels),u=n?t("red",String(c)):String(c),[` ${u} different / ${d} total pixels`])),l.push(...(r=f,o=i,0===(p=function(e){let t=[];for(let n of(e.ocr?.movementClusters??[]).slice(0,2))t.push(`text movement cluster: ${function(e){let t=e.slice(0,4).map(e=>JSON.stringify(e)),n=e.length>t.length?` +${e.length-t.length} more`:"";return`${t.join(", ")}${n}`}(n.texts)} dx=${eU(n.xRange)}px dy=${eU(n.yRange)}px`);let n=(e.nonTextDeltas??[]).filter(e=>["icon","toggle","chevron"].includes(e.likelyKind)).slice(0,3);n.length>0&&t.push(`non-text controls: ${n.map(eR).join("; ")}`);let r=(e.nonTextDeltas??[]).filter(e=>"separator"===e.likelyKind).slice(0,2);return r.length>0&&t.push(`non-text boundaries: ${r.map(eR).join("; ")}`),t.slice(0,6)}(r)).length?[]:[` ${eM("Hints:",o)}`,...p.map(e=>` - ${e}`)])),l.push(...function(e,t){let n=Array.isArray(e.regions)?e.regions:[];if(0===n.length)return[];let r=[` ${eM("Changed regions:",t)}`];for(let e of n.slice(0,5))r.push(...function(e){let t=0===e.shareOfDiffPercentage&&e.differentPixels>0?"<0.01":String(e.shareOfDiffPercentage),n=e.rect,r=[` ${e.index}. ${e.location} x=${n.x} y=${n.y} ${n.width}x${n.height}, ${t}% of diff, change=${e.dominantChange}`],o=function(e){let t=[e.size?`size=${e.size}`:null,e.shape?`shape=${e.shape}`:null,"number"==typeof e.densityPercentage?`density=${e.densityPercentage}%`:null,e.averageBaselineColorHex&&e.averageCurrentColorHex?`avgColor=${e.averageBaselineColorHex}->${e.averageCurrentColorHex}`:null,"number"==typeof e.baselineLuminance&&"number"==typeof e.currentLuminance?`luminance=${e.baselineLuminance}->${e.currentLuminance}`:null].filter(e=>null!==e);return t.length>0?t.join(" "):null}(e);o&&r.push(` ${o}`);let i=e.currentOverlayMatches?.[0];if(i){let e=i.label?` "${i.label}"`:"";r.push(` overlaps @${i.ref}${e}, ${i.regionCoveragePercentage}% of region`)}return r}(e));return r}(f,i)),l.push(...function(e,t){let n=e.ocr?.matches??[];if(0===n.length)return[];let r=n.slice(0,8),o=[` ${eM(`OCR text deltas (${e.ocr?.provider}; baselineBlocks=${e.ocr?.baselineBlocks} currentBlocks=${e.ocr?.currentBlocks}; showing ${r.length}/${n.length}; px):`,t)}`,` ${eM("item | text | movePx | sizeDeltaPx | bboxBaseline | bboxCurrent | confidence | issueHint",t)}`];for(let[e,t]of r.entries()){let n=t.delta;o.push(` ${e+1} | ${JSON.stringify(t.text)} | ${ek(n.x)},${ek(n.y)} | ${ek(n.width)},${ek(n.height)} | ${eP(t.baselineRect)} | ${eP(t.currentRect)} | ${t.confidence} | ${t.possibleTextMetricMismatch?"ocr-bbox-size-change":"-"}`)}return o}(f,i)),l.push(...function(e,t){let n=e.nonTextDeltas??[];if(0===n.length)return[];let r=n.slice(0,8),o=[` ${eM(`Non-text visual deltas (showing ${r.length}/${n.length}; px):`,t)}`,` ${eM("item | region | slot | kind | bboxCurrent | nearestText",t)}`];for(let e of r)o.push(` ${e.index} | ${e.regionIndex?`r${e.regionIndex}`:"-"} | ${e.slot} | ${e.likelyKind} | ${eP(e.rect)} | ${e.nearestText?JSON.stringify(e.nearestText):"-"}`);return o}(f,i))),`${l.join("\n")}
38
- `}),!0}};async function t0(e){let t={...e.flags},n=tQ[e.command];return n?await n({...e,flags:t}):!!Y(e.command)&&await t1({...e,command:e.command,flags:t})}async function t1(e){let{runGenericClientBackedCommand:t}=await import("./generic.js");return await t(e)}function t2(e,t,n){return n||(e.push(t),"")}async function t3(e,t,n){let{flags:r}=t,o=function(e){var t;if(!e?.metroProxyBaseUrl||"android-instance"!==(t=e.leaseBackend)&&"ios-instance"!==t)return null;let n=[],r={serverBaseUrl:t2(n,"metroProxyBaseUrl",e.metroProxyBaseUrl),bearerToken:t2(n,"metroBearerToken",e.metroBearerToken),tenantId:t2(n,"tenant",e.tenant),runId:t2(n,"runId",e.runId),leaseId:t2(n,"leaseId",e.leaseId)};if(n.length>0)throw new p("INVALID_ARGS",`react-devtools remote bridge requires ${n.join(", ")}.`,{missing:n});return r}(r);if(!o)return n();let i=t.stateDir??process.cwd(),a=t.session??r?.session??"default",s=r?.remoteConfig??`${o.tenantId}:${o.runId}:${o.leaseId}`;if("stop"===e[0])try{return await n()}finally{await eH({projectRoot:t.cwd??process.cwd(),stateDir:i,profileKey:s,consumerKey:a})}return await eK({projectRoot:t.cwd??process.cwd(),stateDir:i,serverBaseUrl:o.serverBaseUrl,bearerToken:o.bearerToken,bridgeScope:{tenantId:o.tenantId,runId:o.runId,leaseId:o.leaseId},session:a,profileKey:s,consumerKey:a,env:t.env??process.env}),await n()}async function t8(e,t={}){let n=t.cwd??process.cwd(),r=t.env??process.env,o=await t3(e,t,async()=>(await _("npm",["exec","--yes","--package","agent-react-devtools@0.4.0","--","agent-react-devtools",...e],{cwd:n,env:r,allowFailure:!0,onStdoutChunk:e=>{process.stdout.write(e)},onStderrChunk:e=>{process.stderr.write(e)}})).exitCode);var i,a=t.flags;return 0!==o&&"wait"===(i=e)[0]&&i.includes("--connected")&&"ios-instance"===a?.leaseBackend&&process.stderr.write("Hint: Remote iOS React DevTools connects during JavaScript startup.\nIf the app was already open before `agent-device react-devtools start`, relaunch it with `agent-device open <bundle-id> --platform ios --relaunch`, then retry `agent-device react-devtools wait --connected`.\n"),o}function t5(e,t={}){let n=t9(t),r={...e};return n.defaultPlatform&&void 0===r.platform&&(r.platform=n.defaultPlatform),r}function t9(e){var t,n,r,o;let i,a=e.env??process.env,s=e.inheritedPlatform??e.configuredPlatform??function(e){if(void 0===e)return;let t=e.trim().toLowerCase();if(t){if("ios"===t||"android"===t||"apple"===t)return t;throw new p("INVALID_ARGS",`Invalid AGENT_DEVICE_PLATFORM: ${e}. Use ios, android, or apple.`)}}(a.AGENT_DEVICE_PLATFORM),l="string"==typeof(t=e.configuredSession??a.AGENT_DEVICE_SESSION)&&t.trim().length>0;return{defaultPlatform:s,lockPolicy:(n=e.policyOverrides,r=a,o=l,(i=n?.sessionLock??n?.sessionLockConflicts??function(e){if(void 0===e)return;let t=e.trim().toLowerCase();if(t){if("reject"===t||"strip"===t)return t;throw new p("INVALID_ARGS",`Invalid session lock mode: ${e}. Use reject or strip.`)}}(r.AGENT_DEVICE_SESSION_LOCK))||(n?.sessionLocked===!0||o?"reject":void 0))}}let t6={sendToDaemon:ec},t4=new Set(["launchUrl","metroBearerToken","metroKind","metroListenHost","metroNoInstallDeps","metroNoReuseExisting","metroPreparePort","metroProbeTimeoutMs","metroProjectRoot","metroProxyBaseUrl","metroPublicBaseUrl","metroRuntimeFile","metroStartupTimeoutMs","metroStatusHost"]),t7=new Set(["connect","connection","close","disconnect","metro","session"]);async function ne(t,n=t6){let o=I(),i=es(),a=t.includes("--debug")||t.includes("--verbose")||t.includes("-v"),s=t.includes("--json"),l=function(e){for(let t=0;t<e.length;t+=1){let n=e[t];if(n.startsWith("--session=")){let e=n.slice(10).trim();return e.length>0?e:null}if("--session"===n){let n=e[t+1]?.trim();if(n&&!n.startsWith("-"))return n;break}}return null}(t)??process.env.AGENT_DEVICE_SESSION??"default";await $({session:l,requestId:o,command:t[0],debug:a},async()=>{var l,c,d,m,h,g,v,I,$,b,_,D,N,P,k,R,U;let E,T,B,M,L,j,K;try{let n,o,i,a,s,u,f,y;l={cwd:process.cwd(),env:process.env},n=eo(t),o=l?.env??process.env,i=l?.cwd??process.cwd(),m=n.command,a=null!==m&&(c={remoteConfig:n.flags.remoteConfig,cwd:i,env:o}).remoteConfig?{...e1(w({configPath:c.remoteConfig,cwd:c.cwd,env:c.env}).profile),remoteConfig:c.remoteConfig}:{},f=Q((s=(d={command:n.command,cwd:i,cliFlags:n.flags,env:o}).env??process.env,u=Q({},function(e){let t={};for(let n of e)Q(t,function(e,t){let n,o;if(!r.existsSync(e)){if(t)throw new p("INVALID_ARGS",`Config file not found: ${e}`);return{}}try{n=r.readFileSync(e,"utf8")}catch(t){throw new p("INVALID_ARGS",`Failed to read config file: ${e}`,{cause:t instanceof Error?t.message:String(t)})}try{o=JSON.parse(n)}catch(t){throw new p("INVALID_ARGS",`Invalid JSON in config file: ${e}`,{cause:t instanceof Error?t.message:String(t)})}if(!o||"object"!=typeof o||Array.isArray(o))throw new p("INVALID_ARGS",`Config file must contain a JSON object: ${e}`);return function(e,t){let n={};for(let[r,o]of Object.entries(e)){if("installSource"===r){n.installSource=O(o,t);continue}let e=en(r);if(!e)throw new p("INVALID_ARGS",`Unknown config key "${r}" in ${t}.`);if(!e.config.enabled)throw new p("INVALID_ARGS",`Unsupported config key "${r}" in ${t}.`);n[r]=ee(e,o,t,r)}return n}(o,`config file ${e}`)}(n.path,n.required));return t}((h=d.cwd,g=d.cliFlags.config,v=s,(y=g??v.AGENT_DEVICE_CONFIG)?[{path:(I=y,$=h,b=v,z(I,{cwd:$,env:b})),required:!0}]:[{path:(_=v,e.join(W("~",{env:_}),".agent-device","config.json")),required:!1},{path:e.resolve(h,"agent-device.json"),required:!1}]))),Q(u,function(e,t){let n={};for(let r of et(t)){if("installSource"===r.key)continue;let t=r.env.names.map(t=>({name:t,value:e[t]})).find(e=>"string"==typeof e.value&&e.value.trim().length>0);t&&(n[r.key]=ee(r,t.value,`environment variable ${t.name}`,t.name))}return n}(s,d.command))),a),E={...ea(n,{strictFlags:l?.strictFlags,defaultFlags:f}),providedFlags:n.providedFlags}}catch(t){S({level:"error",phase:"cli_parse_failed",data:{error:t instanceof Error?t.message:String(t)}});let e=f(t,{diagnosticId:A().diagnosticId,logPath:C({force:!0})??void 0});s?e_({success:!1,error:e}):eD(e,{showDetails:a}),process.exit(1);return}for(let e of E.warnings)process.stderr.write(`Warning: ${e}
38
+ `}),!0}};async function t0(e){let t={...e.flags},n=tQ[e.command];return n?await n({...e,flags:t}):!!Y(e.command)&&await t1({...e,command:e.command,flags:t})}async function t1(e){let{runGenericClientBackedCommand:t}=await import("./generic.js");return await t(e)}function t2(e,t,n){return n||(e.push(t),"")}async function t3(e,t,n){let{flags:r}=t,o=function(e){var t;if(!e?.metroProxyBaseUrl||"android-instance"!==(t=e.leaseBackend)&&"ios-instance"!==t)return null;let n=[],r={serverBaseUrl:t2(n,"metroProxyBaseUrl",e.metroProxyBaseUrl),bearerToken:t2(n,"metroBearerToken",e.metroBearerToken),tenantId:t2(n,"tenant",e.tenant),runId:t2(n,"runId",e.runId),leaseId:t2(n,"leaseId",e.leaseId)};if(n.length>0)throw new p("INVALID_ARGS",`react-devtools remote bridge requires ${n.join(", ")}.`,{missing:n});return r}(r);if(!o)return n();let i=t.stateDir??process.cwd(),a=t.session??r?.session??"default",s=r?.remoteConfig??`${o.tenantId}:${o.runId}:${o.leaseId}`;if("stop"===e[0])try{return await n()}finally{await eH({projectRoot:t.cwd??process.cwd(),stateDir:i,profileKey:s,consumerKey:a})}return await eK({projectRoot:t.cwd??process.cwd(),stateDir:i,serverBaseUrl:o.serverBaseUrl,bearerToken:o.bearerToken,bridgeScope:{tenantId:o.tenantId,runId:o.runId,leaseId:o.leaseId},session:a,profileKey:s,consumerKey:a,env:t.env??process.env}),await n()}async function t8(e,t={}){let n=t.cwd??process.cwd(),r=t.env??process.env,o=await t3(e,t,async()=>(await _("npm",["exec","--yes","--package","agent-react-devtools@0.4.0","--","agent-react-devtools",...e],{cwd:n,env:r,allowFailure:!0,onStdoutChunk:e=>{process.stdout.write(e)},onStderrChunk:e=>{process.stderr.write(e)}})).exitCode);var i,a=t.flags;return 0!==o&&"wait"===(i=e)[0]&&i.includes("--connected")&&"ios-instance"===a?.leaseBackend&&process.stderr.write("Hint: Remote iOS React DevTools connects during JavaScript startup.\nIf the app was already open before `agent-device react-devtools start`, relaunch it with `agent-device open <bundle-id> --platform ios --relaunch`, then retry `agent-device react-devtools wait --connected`.\n"),o}function t5(e,t={}){let n=t6(t),r={...e};return n.defaultPlatform&&void 0===r.platform&&(r.platform=n.defaultPlatform),r}function t6(e){var t,n,r,o;let i,a=e.env??process.env,s=e.inheritedPlatform??e.configuredPlatform??function(e){if(void 0===e)return;let t=e.trim().toLowerCase();if(t){if("ios"===t||"android"===t||"apple"===t)return t;throw new p("INVALID_ARGS",`Invalid AGENT_DEVICE_PLATFORM: ${e}. Use ios, android, or apple.`)}}(a.AGENT_DEVICE_PLATFORM),l="string"==typeof(t=e.configuredSession??a.AGENT_DEVICE_SESSION)&&t.trim().length>0;return{defaultPlatform:s,lockPolicy:(n=e.policyOverrides,r=a,o=l,(i=n?.sessionLock??n?.sessionLockConflicts??function(e){if(void 0===e)return;let t=e.trim().toLowerCase();if(t){if("reject"===t||"strip"===t)return t;throw new p("INVALID_ARGS",`Invalid session lock mode: ${e}. Use reject or strip.`)}}(r.AGENT_DEVICE_SESSION_LOCK))||(n?.sessionLocked===!0||o?"reject":void 0))}}let t9={sendToDaemon:ec},t4=new Set(["launchUrl","metroBearerToken","metroKind","metroListenHost","metroNoInstallDeps","metroNoReuseExisting","metroPreparePort","metroProbeTimeoutMs","metroProjectRoot","metroProxyBaseUrl","metroPublicBaseUrl","metroRuntimeFile","metroStartupTimeoutMs","metroStatusHost"]),t7=new Set(["connect","connection","close","disconnect","metro","session"]);async function ne(t,n=t9){let o=I(),i=es(),a=function(e){try{let t=eo(e);return nt(t.command??"",t.providedFlags)}catch{return e.includes("--debug")||e.includes("-v")||e.includes("--verbose")}}(t),s=t.includes("--json"),l=function(e){for(let t=0;t<e.length;t+=1){let n=e[t];if(n.startsWith("--session=")){let e=n.slice(10).trim();return e.length>0?e:null}if("--session"===n){let n=e[t+1]?.trim();if(n&&!n.startsWith("-"))return n;break}}return null}(t)??process.env.AGENT_DEVICE_SESSION??"default";await $({session:l,requestId:o,command:t[0],debug:a},async()=>{var l,c,d,m,h,g,v,I,$,b,_,D,N,P,k,R,U;let E,T,B,M,L,j,K;try{let n,o,i,a,s,u,f,y;l={cwd:process.cwd(),env:process.env},n=eo(t),o=l?.env??process.env,i=l?.cwd??process.cwd(),m=n.command,a=null!==m&&(c={remoteConfig:n.flags.remoteConfig,cwd:i,env:o}).remoteConfig?{...e1(w({configPath:c.remoteConfig,cwd:c.cwd,env:c.env}).profile),remoteConfig:c.remoteConfig}:{},f=Q((s=(d={command:n.command,cwd:i,cliFlags:n.flags,env:o}).env??process.env,u=Q({},function(e){let t={};for(let n of e)Q(t,function(e,t){let n,o;if(!r.existsSync(e)){if(t)throw new p("INVALID_ARGS",`Config file not found: ${e}`);return{}}try{n=r.readFileSync(e,"utf8")}catch(t){throw new p("INVALID_ARGS",`Failed to read config file: ${e}`,{cause:t instanceof Error?t.message:String(t)})}try{o=JSON.parse(n)}catch(t){throw new p("INVALID_ARGS",`Invalid JSON in config file: ${e}`,{cause:t instanceof Error?t.message:String(t)})}if(!o||"object"!=typeof o||Array.isArray(o))throw new p("INVALID_ARGS",`Config file must contain a JSON object: ${e}`);return function(e,t){let n={};for(let[r,o]of Object.entries(e)){if("installSource"===r){n.installSource=O(o,t);continue}let e=en(r);if(!e)throw new p("INVALID_ARGS",`Unknown config key "${r}" in ${t}.`);if(!e.config.enabled)throw new p("INVALID_ARGS",`Unsupported config key "${r}" in ${t}.`);n[r]=ee(e,o,t,r)}return n}(o,`config file ${e}`)}(n.path,n.required));return t}((h=d.cwd,g=d.cliFlags.config,v=s,(y=g??v.AGENT_DEVICE_CONFIG)?[{path:(I=y,$=h,b=v,z(I,{cwd:$,env:b})),required:!0}]:[{path:(_=v,e.join(W("~",{env:_}),".agent-device","config.json")),required:!1},{path:e.resolve(h,"agent-device.json"),required:!1}]))),Q(u,function(e,t){let n={};for(let r of et(t)){if("installSource"===r.key)continue;let t=r.env.names.map(t=>({name:t,value:e[t]})).find(e=>"string"==typeof e.value&&e.value.trim().length>0);t&&(n[r.key]=ee(r,t.value,`environment variable ${t.name}`,t.name))}return n}(s,d.command))),a),E={...ea(n,{strictFlags:l?.strictFlags,defaultFlags:f}),providedFlags:n.providedFlags}}catch(t){S({level:"error",phase:"cli_parse_failed",data:{error:t instanceof Error?t.message:String(t)}});let e=f(t,{diagnosticId:A().diagnosticId,logPath:C({force:!0})??void 0});s?e_({success:!1,error:e}):eD(e,{showDetails:a}),process.exit(1);return}for(let e of E.warnings)process.stderr.write(`Warning: ${e}
39
39
  `);E.flags.version&&(process.stdout.write(`${i}
40
40
  `),process.exit(0));let H="help"===E.command,F=E.flags.help;if(H||F){H&&E.positionals.length>1&&(eD(new p("INVALID_ARGS","help accepts at most one command.")),process.exit(1));let e=H?E.positionals[0]:E.command;e||(process.stdout.write(`${er()}
41
41
  `),process.exit(0));let t=ei(e);t&&(process.stdout.write(t),process.exit(0)),eD(new p("INVALID_ARGS",`Unknown command: ${e}`)),process.stdout.write(`${er()}
42
42
  `),process.exit(1)}E.command||(process.stdout.write(`${er()}
43
- `),process.exit(1));let{command:G,positionals:V}=E,q=new Set(E.providedFlags.map(e=>e.key));try{B=(T=t9({policyOverrides:E.flags,configuredPlatform:E.flags.platform,configuredSession:E.flags.session})).lockPolicy?{...E.flags}:t5(E.flags,{policyOverrides:E.flags,configuredPlatform:E.flags.platform,configuredSession:E.flags.session}),M=x(B.stateDir),L=B.session??"default",D={command:G,explicitFlagKeys:q,stateDir:M.baseDir,session:L,remoteConfig:B.remoteConfig,hasResolvedSession:void 0!==B.session},K=(j="connect"===D.command||"connection"===D.command?null:function(e){let t=e.validateRemoteConfigHash??!0,n=e.remoteConfig?y({configPath:e.remoteConfig,cwd:e.cwd,env:e.env}):void 0,r=eF(e)??(e.allowActiveFallback?eZ({stateDir:e.stateDir}):null);if(!r||n&&r.remoteConfigPath!==n)return null;if(t&&eJ(r.remoteConfigPath)!==r.remoteConfigHash)throw new p("INVALID_ARGS","Active remote connection config changed. Run agent-device connect --force to refresh it.",{remoteConfig:r.remoteConfigPath});let o=function(e,t){try{return w({configPath:e.remoteConfigPath,cwd:t.cwd,env:t.env}).profile}catch(e){if(!1===t.validateRemoteConfigHash)return{};throw e}}(r,e);return{runtime:r.runtime,flags:{...o,remoteConfig:r.remoteConfigPath,daemonBaseUrl:r.daemon?.baseUrl??o.daemonBaseUrl,daemonTransport:r.daemon?.transport??o.daemonTransport,daemonServerMode:r.daemon?.serverMode??o.daemonServerMode,tenant:r.tenant,sessionIsolation:"tenant",runId:r.runId,leaseId:r.leaseId,leaseBackend:r.leaseBackend,session:r.session,platform:r.platform??o.platform,target:r.target??o.target}}}({stateDir:D.stateDir,session:D.session,remoteConfig:D.remoteConfig,cwd:process.cwd(),env:process.env,allowActiveFallback:!D.explicitFlagKeys.has("session")&&(!D.remoteConfig||"disconnect"===D.command||!D.hasResolvedSession),validateRemoteConfigHash:"disconnect"!==D.command}))?function(e,t,n){let r={...e};for(let[e,o]of Object.entries(t))void 0!==o&&(n.has(e)||(r[e]=o));return r}(B,j.flags,q):B}catch(t){let e=f(u(t),{diagnosticId:A().diagnosticId,logPath:C({force:!0})??void 0});E.flags.json?e_({success:!1,error:e}):eD(e,{showDetails:E.flags.verbose}),process.exit(1);return}let J=null;try{let e;if("react-devtools"===G){let e=await t8(V,{flags:K,stateDir:M.baseDir,session:K.session??L,cwd:process.cwd(),env:process.env});process.exit(e);return}ed({command:G,currentVersion:i,stateDir:M.baseDir,flags:K});let t=j?.runtime,a=(e,t)=>({session:e.session??L,requestId:o,stateDir:e.stateDir,daemonBaseUrl:e.daemonBaseUrl,daemonAuthToken:e.daemonAuthToken,daemonTransport:e.daemonTransport,daemonServerMode:e.daemonServerMode,tenant:e.tenant,sessionIsolation:e.sessionIsolation,runId:e.runId,leaseId:e.leaseId,leaseBackend:e.leaseBackend,runtime:t,lockPolicy:T.lockPolicy,lockPlatform:T.defaultPlatform,cwd:process.cwd(),debug:!!e.verbose});if("batch"===G){if(V.length>0)throw new p("INVALID_ARGS","batch does not accept positional arguments.");e=function(e){let t,n,o,i="";if(e.steps)i=e.steps;else if(e.stepsFile)try{i=r.readFileSync(e.stepsFile,"utf8")}catch(n){let t=n instanceof Error?n.message:String(n);throw new p("INVALID_ARGS",`Failed to read --steps-file ${e.stepsFile}: ${t}`)}var a,s=i;try{o=JSON.parse(s)}catch{throw new p("INVALID_ARGS","Batch steps must be valid JSON.")}if(!Array.isArray(o)||0===o.length)throw new p("INVALID_ARGS","Batch steps must be a non-empty JSON array.");return a=o,t=!1,n=a.map((e,n)=>{var r,o,i,a,s,l;let c;if(r=e,null!==r&&"object"==typeof r&&!Array.isArray(r)&&"input"in r&&!("positionals"in r)&&!("flags"in r))return e;let d=function(e,t){if(!e||"object"!=typeof e||Array.isArray(e))throw new p("INVALID_ARGS",`Invalid batch step ${t}.`);var n=e,r=t;let o=Object.keys(n).filter(e=>!["command","positionals","flags","runtime"].includes(e));if(o.length>0)throw new p("INVALID_ARGS",`Batch step ${r} has unknown legacy field(s): ${o.join(", ")}.`);let i=function(e,t){let n="string"==typeof e?e.trim().toLowerCase():"";if(!n)throw new p("INVALID_ARGS",`Batch step ${t} requires command.`);if(X(n))return n;throw new p("INVALID_ARGS",`Batch step ${t} command is not available through command batch: ${String(e)}`)}(e.command,t),a=function(e,t){if(void 0!==e){if(!Array.isArray(e)||e.some(e=>"string"!=typeof e))throw new p("INVALID_ARGS",`Batch step ${t} positionals must contain only strings.`);return e}}(e.positionals,t),s=function(e,t){if(void 0!==e){if(!e||"object"!=typeof e||Array.isArray(e))throw new p("INVALID_ARGS",`Batch step ${t} flags must be an object.`);return e}}(e.flags,t);return{command:i,...void 0===a?{}:{positionals:a},...void 0===s?{}:{flags:s},...void 0===e.runtime?{}:{runtime:e.runtime}}}(e,n+1);return t=!0,c=(i=(o=d).command,a=o.positionals??[],l=o.flags,s={json:!1,help:!1,version:!1,...l},tZ[i](a,s)),{command:o.command,input:c,...void 0===o.runtime?{}:{runtime:o.runtime}}}),t&&process.stderr.write('Warning: batch steps using positionals/flags are deprecated and will be removed in the next major version. Use {"command":"...","input":{...}} steps instead.\n'),n}(B)}if(N=G,"auth"!==N&&"connection"!==N&&(K=(await to({command:G,flags:K,stateDir:M.baseDir,env:process.env})).flags),K.remoteConfig&&(P=G,!t7.has(P))){let r=el(a(K,t),{transport:n.sendToDaemon}),o=await e8({command:G,flags:K,client:r,runtime:t,batchSteps:e,forceRuntimePrepare:function(e){for(let t of t4)if(e.has(t))return!0;return!1}(q)});K=o.flags,t=o.runtime}k={command:G,flags:K,runtime:t,explicitFlagKeys:q,hadConnectionDefaults:!!j},!("open"===k.command&&!k.runtime&&!k.flags.bundleUrl&&!k.flags.metroHost&&!k.flags.metroPort&&!k.flags.remoteConfig&&!k.hadConnectionDefaults&&((R=k.explicitFlagKeys).has("daemonBaseUrl")||R.has("daemonTransport")||R.has("tenant")||R.has("sessionIsolation")||R.has("runId")||R.has("leaseId")||R.has("leaseBackend")))||process.stderr.write("Warning: open is using explicit remote daemon or tenant flags without saved Metro runtime hints. React Native apps may launch without bundle/runtime hints; prefer connect --remote-config <path> first or pass --remote-config <path> on this command.\n");let s=K.daemonBaseUrl;J=!K.verbose||K.json||s?null:function(e){try{let t=r.existsSync(e)?r.statSync(e).size:0,n=!1,o=setInterval(()=>{if(!n&&r.existsSync(e))try{let n=r.statSync(e);if(n.size<t&&(t=0),n.size<=t)return;let o=r.openSync(e,"r");try{let e=Buffer.alloc(n.size-t);r.readSync(o,e,0,e.length,t),t=n.size,e.length>0&&process.stdout.write(e.toString("utf8"))}finally{r.closeSync(o)}}catch{}},200);return()=>{n=!0,clearInterval(o)}}catch{return null}}(M.logPath);let l=el(a(K,t),{transport:function(e){let{command:t,flags:n,transport:r}=e;return"test"!==t||n.json?r:async e=>await r({...e,meta:{...e.meta,requestProgress:"replay-test"}})}({command:G,flags:K,transport:n.sendToDaemon})});if("batch"===G){if(!e)throw new p("INVALID_ARGS","batch requires --steps or --steps-file.");let t=e.map((e,t)=>({...e,input:T.lockPolicy&&void 0===B.platform?{...e.input}:t5(e.input,{policyOverrides:K,configuredPlatform:K.platform,configuredSession:K.session,inheritedPlatform:K.platform})}));if(await t0({command:G,positionals:V,flags:{...K,batchSteps:t},client:l}))return}else if("runtime"===G)throw new p("INVALID_ARGS","runtime command was removed. Use connect --remote-config <path> for remote runs, or metro prepare --remote-config <path> for inspection.");else if(await t0({command:G,positionals:V,flags:K,client:l}))return;throw new p("INVALID_ARGS",`Unknown command: ${G}`)}catch(n){let e=u(n),t=f(e,{diagnosticId:A().diagnosticId,logPath:C({force:!0})??void 0});if("close"===G&&"COMMAND_FAILED"===(U=e).code&&(U.details?.kind==="daemon_startup_failed"||U.message.toLowerCase().includes("failed to start daemon")&&("string"==typeof U.details?.infoPath||"string"==typeof U.details?.lockPath))){K.json&&e_({success:!0,data:{closed:"session",source:"no-daemon"}});return}if(K.json)e_({success:!1,error:t});else if(eD(t,{showDetails:K.verbose}),K.verbose)try{let e=M.logPath;if(r.existsSync(e)){let t=r.readFileSync(e,"utf8").split("\n"),n=t.slice(Math.max(0,t.length-200)).join("\n");n.trim().length>0&&process.stderr.write(`
43
+ `),process.exit(1));let{command:G,positionals:V}=E,q=nt(G,E.providedFlags),J=new Set(E.providedFlags.map(e=>e.key));try{B=(T=t6({policyOverrides:E.flags,configuredPlatform:E.flags.platform,configuredSession:E.flags.session})).lockPolicy?{...E.flags}:t5(E.flags,{policyOverrides:E.flags,configuredPlatform:E.flags.platform,configuredSession:E.flags.session}),M=x(B.stateDir),L=B.session??"default",D={command:G,explicitFlagKeys:J,stateDir:M.baseDir,session:L,remoteConfig:B.remoteConfig,hasResolvedSession:void 0!==B.session},K=(j="connect"===D.command||"connection"===D.command?null:function(e){let t=e.validateRemoteConfigHash??!0,n=e.remoteConfig?y({configPath:e.remoteConfig,cwd:e.cwd,env:e.env}):void 0,r=eF(e)??(e.allowActiveFallback?eZ({stateDir:e.stateDir}):null);if(!r||n&&r.remoteConfigPath!==n)return null;if(t&&eJ(r.remoteConfigPath)!==r.remoteConfigHash)throw new p("INVALID_ARGS","Active remote connection config changed. Run agent-device connect --force to refresh it.",{remoteConfig:r.remoteConfigPath});let o=function(e,t){try{return w({configPath:e.remoteConfigPath,cwd:t.cwd,env:t.env}).profile}catch(e){if(!1===t.validateRemoteConfigHash)return{};throw e}}(r,e);return{runtime:r.runtime,flags:{...o,remoteConfig:r.remoteConfigPath,daemonBaseUrl:r.daemon?.baseUrl??o.daemonBaseUrl,daemonTransport:r.daemon?.transport??o.daemonTransport,daemonServerMode:r.daemon?.serverMode??o.daemonServerMode,tenant:r.tenant,sessionIsolation:"tenant",runId:r.runId,leaseId:r.leaseId,leaseBackend:r.leaseBackend,session:r.session,platform:r.platform??o.platform,target:r.target??o.target}}}({stateDir:D.stateDir,session:D.session,remoteConfig:D.remoteConfig,cwd:process.cwd(),env:process.env,allowActiveFallback:!D.explicitFlagKeys.has("session")&&(!D.remoteConfig||"disconnect"===D.command||!D.hasResolvedSession),validateRemoteConfigHash:"disconnect"!==D.command}))?function(e,t,n){let r={...e};for(let[e,o]of Object.entries(t))void 0!==o&&(n.has(e)||(r[e]=o));return r}(B,j.flags,J):B}catch(t){let e=f(u(t),{diagnosticId:A().diagnosticId,logPath:C({force:!0})??void 0});E.flags.json?e_({success:!1,error:e}):eD(e,{showDetails:q}),process.exit(1);return}let Z=null;try{let e;if("react-devtools"===G){let e=await t8(V,{flags:K,stateDir:M.baseDir,session:K.session??L,cwd:process.cwd(),env:process.env});process.exit(e);return}ed({command:G,currentVersion:i,stateDir:M.baseDir,flags:K});let t=j?.runtime,a=(e,t)=>({session:e.session??L,requestId:o,stateDir:e.stateDir,daemonBaseUrl:e.daemonBaseUrl,daemonAuthToken:e.daemonAuthToken,daemonTransport:e.daemonTransport,daemonServerMode:e.daemonServerMode,tenant:e.tenant,sessionIsolation:e.sessionIsolation,runId:e.runId,leaseId:e.leaseId,leaseBackend:e.leaseBackend,runtime:t,lockPolicy:T.lockPolicy,lockPlatform:T.defaultPlatform,cwd:process.cwd(),debug:q});if("batch"===G){if(V.length>0)throw new p("INVALID_ARGS","batch does not accept positional arguments.");e=function(e){let t,n,o,i="";if(e.steps)i=e.steps;else if(e.stepsFile)try{i=r.readFileSync(e.stepsFile,"utf8")}catch(n){let t=n instanceof Error?n.message:String(n);throw new p("INVALID_ARGS",`Failed to read --steps-file ${e.stepsFile}: ${t}`)}var a,s=i;try{o=JSON.parse(s)}catch{throw new p("INVALID_ARGS","Batch steps must be valid JSON.")}if(!Array.isArray(o)||0===o.length)throw new p("INVALID_ARGS","Batch steps must be a non-empty JSON array.");return a=o,t=!1,n=a.map((e,n)=>{var r,o,i,a,s,l;let c;if(r=e,null!==r&&"object"==typeof r&&!Array.isArray(r)&&"input"in r&&!("positionals"in r)&&!("flags"in r))return e;let d=function(e,t){if(!e||"object"!=typeof e||Array.isArray(e))throw new p("INVALID_ARGS",`Invalid batch step ${t}.`);var n=e,r=t;let o=Object.keys(n).filter(e=>!["command","positionals","flags","runtime"].includes(e));if(o.length>0)throw new p("INVALID_ARGS",`Batch step ${r} has unknown legacy field(s): ${o.join(", ")}.`);let i=function(e,t){let n="string"==typeof e?e.trim().toLowerCase():"";if(!n)throw new p("INVALID_ARGS",`Batch step ${t} requires command.`);if(X(n))return n;throw new p("INVALID_ARGS",`Batch step ${t} command is not available through command batch: ${String(e)}`)}(e.command,t),a=function(e,t){if(void 0!==e){if(!Array.isArray(e)||e.some(e=>"string"!=typeof e))throw new p("INVALID_ARGS",`Batch step ${t} positionals must contain only strings.`);return e}}(e.positionals,t),s=function(e,t){if(void 0!==e){if(!e||"object"!=typeof e||Array.isArray(e))throw new p("INVALID_ARGS",`Batch step ${t} flags must be an object.`);return e}}(e.flags,t);return{command:i,...void 0===a?{}:{positionals:a},...void 0===s?{}:{flags:s},...void 0===e.runtime?{}:{runtime:e.runtime}}}(e,n+1);return t=!0,c=(i=(o=d).command,a=o.positionals??[],l=o.flags,s={json:!1,help:!1,version:!1,...l},tZ[i](a,s)),{command:o.command,input:c,...void 0===o.runtime?{}:{runtime:o.runtime}}}),t&&process.stderr.write('Warning: batch steps using positionals/flags are deprecated and will be removed in the next major version. Use {"command":"...","input":{...}} steps instead.\n'),n}(B)}if(N=G,"auth"!==N&&"connection"!==N&&(K=(await to({command:G,flags:K,stateDir:M.baseDir,env:process.env})).flags),K.remoteConfig&&(P=G,!t7.has(P))){let r=el(a(K,t),{transport:n.sendToDaemon}),o=await e8({command:G,flags:K,client:r,runtime:t,batchSteps:e,forceRuntimePrepare:function(e){for(let t of t4)if(e.has(t))return!0;return!1}(J)});K=o.flags,t=o.runtime}k={command:G,flags:K,runtime:t,explicitFlagKeys:J,hadConnectionDefaults:!!j},!("open"===k.command&&!k.runtime&&!k.flags.bundleUrl&&!k.flags.metroHost&&!k.flags.metroPort&&!k.flags.remoteConfig&&!k.hadConnectionDefaults&&((R=k.explicitFlagKeys).has("daemonBaseUrl")||R.has("daemonTransport")||R.has("tenant")||R.has("sessionIsolation")||R.has("runId")||R.has("leaseId")||R.has("leaseBackend")))||process.stderr.write("Warning: open is using explicit remote daemon or tenant flags without saved Metro runtime hints. React Native apps may launch without bundle/runtime hints; prefer connect --remote-config <path> first or pass --remote-config <path> on this command.\n");let s=K.daemonBaseUrl;Z=!q||K.json||s?null:function(e){try{let t=r.existsSync(e)?r.statSync(e).size:0,n=!1,o=setInterval(()=>{if(!n&&r.existsSync(e))try{let n=r.statSync(e);if(n.size<t&&(t=0),n.size<=t)return;let o=r.openSync(e,"r");try{let e=Buffer.alloc(n.size-t);r.readSync(o,e,0,e.length,t),t=n.size,e.length>0&&process.stdout.write(e.toString("utf8"))}finally{r.closeSync(o)}}catch{}},200);return()=>{n=!0,clearInterval(o)}}catch{return null}}(M.logPath);let l=el(a(K,t),{transport:function(e){let{command:t,flags:n,transport:r}=e;return"test"!==t||n.json?r:async e=>await r({...e,meta:{...e.meta,requestProgress:"replay-test"}})}({command:G,flags:K,transport:n.sendToDaemon})});if("batch"===G){if(!e)throw new p("INVALID_ARGS","batch requires --steps or --steps-file.");let t=e.map((e,t)=>({...e,input:T.lockPolicy&&void 0===B.platform?{...e.input}:t5(e.input,{policyOverrides:K,configuredPlatform:K.platform,configuredSession:K.session,inheritedPlatform:K.platform})}));if(await t0({command:G,positionals:V,flags:{...K,batchSteps:t},client:l}))return}else if("runtime"===G)throw new p("INVALID_ARGS","runtime command was removed. Use connect --remote-config <path> for remote runs, or metro prepare --remote-config <path> for inspection.");else if(await t0({command:G,positionals:V,flags:K,client:l}))return;throw new p("INVALID_ARGS",`Unknown command: ${G}`)}catch(n){let e=u(n),t=f(e,{diagnosticId:A().diagnosticId,logPath:C({force:!0})??void 0});if("close"===G&&"COMMAND_FAILED"===(U=e).code&&(U.details?.kind==="daemon_startup_failed"||U.message.toLowerCase().includes("failed to start daemon")&&("string"==typeof U.details?.infoPath||"string"==typeof U.details?.lockPath))){K.json&&e_({success:!0,data:{closed:"session",source:"no-daemon"}});return}if(K.json)e_({success:!1,error:t});else if(eD(t,{showDetails:q}),q)try{let e=M.logPath;if(r.existsSync(e)){let t=r.readFileSync(e,"utf8").split("\n"),n=t.slice(Math.max(0,t.length-200)).join("\n");n.trim().length>0&&process.stderr.write(`
44
44
  [daemon log]
45
45
  ${n}
46
- `)}}catch{}J&&J(),process.exit(1)}finally{J&&J()}})}n(process.argv[1]??"").href===import.meta.url&&ne(process.argv.slice(2)).catch(e=>{eD(f(u(e)),{showDetails:!0}),process.exit(1)});export{e_ as printJson,ne as runCli,tX as runCliCommandWithOutput,tC as writeCommandOutput};
46
+ `)}}catch{}Z&&Z(),process.exit(1)}finally{Z&&Z()}})}function nt(e,t){return t.some(t=>"verbose"===t.key&&("--debug"===t.token||"-v"===t.token||"test"!==e))}n(process.argv[1]??"").href===import.meta.url&&ne(process.argv.slice(2)).catch(e=>{eD(f(u(e)),{showDetails:!0}),process.exit(1)});export{e_ as printJson,ne as runCli,tX as runCliCommandWithOutput,tC as writeCommandOutput};
@@ -1 +1 @@
1
- import{listMcpExposedCommandNames as t,BATCH_COMMAND_NAMES as e}from"./5792.js";import{readInputRecord as a,selectorSnapshotFields as r,elementTargetField as i,stringSchema as n,stringArrayField as o,jsonSchemaField as s,booleanSchema as p,integerSchema as c,integerField as d,customField as u,assertAllowedKeys as l,booleanField as m,enumField as h,requiredEnum as f,looseObjectField as g,readPoint as y,requiredField as b,pointField as w,readFieldInput as M,stringField as v,interactionTargetField as x,fieldsInputSchema as S,requiredNumber as P,readCommonInput as k,repeatedFields as C,looseObjectSchema as A,numberField as E,optionalInteger as _}from"./9404.js";import{requireCommandDescription as j}from"./5186.js";function I(t,e){return{...t,run:e,invoke:async(a,r)=>await e(a,t.readInput(r))}}function R(t=e){var a;let r={steps:b(u({type:"array",description:"Structured batch steps. Each step uses a command name and the same input object as that command tool.",items:{type:"object",properties:{command:{type:"string",enum:a=t,description:"Command name to run with structured input."},input:{type:"object",additionalProperties:!0,description:"Structured command input for the nested command. Use the matching MCP tool schema for this object."},runtime:{type:"object",additionalProperties:!0,description:"Optional per-step runtime payload."}},required:["command","input"],additionalProperties:!1}},(t,e)=>(function(t,e){if(!Array.isArray(t))throw Error("Expected steps to be an array.");return t.map((t,a)=>{var r,i,n;let o;return r=t,i=a+1,n=e,l(o=function(t,e){if(!t||"object"!=typeof t||Array.isArray(t))throw Error(`Invalid batch step ${e}.`);return t}(r,i),["command","input","runtime"],`Batch step ${i}`),{command:f(o,"command",n),input:function(t,e){let a=t.input;if(!a||"object"!=typeof a||Array.isArray(a))throw Error(`Batch step ${e} input must be an object.`);return a}(o,i),...function(t,e){let a=t.runtime;if(void 0!==a&&(!a||"object"!=typeof a||Array.isArray(a)))throw Error(`Batch step ${e} runtime must be an object.`);return void 0===a?{}:{runtime:a}}(o,i)}})})(t[e],a))),onError:h(["stop"],"Batch failure policy."),maxSteps:d("Maximum number of steps accepted for this batch.",{min:1,max:1e3}),out:v("Optional output path for command artifacts.")};return{name:"batch",description:"Run multiple structured command steps in one daemon request.",inputSchema:S(r),readInput:t=>(function(t,e){let a=M(t,e),r=a.maxSteps??100;if(!Number.isInteger(r)||r<1||r>1e3)throw Error(`Invalid batch maxSteps: ${String(a.maxSteps)}`);if(a.steps.length>r)throw Error(`batch has ${a.steps.length} steps; max allowed is ${r}.`);return{...a}})(t,r)}}function U(t,e,a){return{name:t,description:e,inputSchema:S(a),readInput:t=>M(t,a)}}let O=["app","frontmost-app","desktop","menubar"],B=["start","stop"],$=[F("devices",{}),F("boot",{headless:m("Boot without showing simulator UI when supported.")}),F("apps",{appsFilter:h(["user-installed","all"])}),F("session",{action:h(["list"])}),F("open",{app:v("App name, bundle id, package, or URL."),url:v("Optional URL passed with an app shell."),surface:h(O),activity:v("Android activity name."),launchConsole:v("Launch console mode."),launchArgs:o("Launch arguments forwarded verbatim to the platform launch command."),relaunch:m("Force relaunch."),saveScript:s({oneOf:[p(),n()]}),noRecord:m("Do not record this action.")}),F("close",{app:v("Optional app to close."),shutdown:m("Shutdown the session/device where supported."),saveScript:s({oneOf:[p(),n()]})}),F("install",{app:b(v()),appPath:b(v("Path to app binary."))}),F("reinstall",{app:b(v()),appPath:b(v("Path to app binary."))}),F("install-from-source",{source:b(s(A("Install source object."))),retainPaths:m(),retentionMs:d()}),F("push",{app:b(v()),payload:b(s({oneOf:[n(),A()]}))}),F("trigger-app-event",{event:b(v()),payload:g()}),F("snapshot",{interactiveOnly:m(),compact:m(),depth:d(),scope:v(),raw:m(),forceFull:m()}),F("screenshot",{path:v("Output path."),overlayRefs:m(),fullscreen:m(),maxSize:d(),stabilize:m(),surface:h(O)}),F("diff",{kind:b(s({type:"string",const:"snapshot"})),out:v(),interactiveOnly:m(),compact:m(),depth:d(),scope:v(),raw:m()}),F("wait",{kind:h(["duration","text","ref","selector"]),durationMs:d(),text:v(),ref:v(),selector:v(),timeoutMs:d(),depth:d(),scope:v(),raw:m()}),F("alert",{action:h(["get","accept","dismiss","wait"]),timeoutMs:d()}),F("appstate",{}),F("back",{mode:h(["in-app","system"])}),F("home",{}),F("rotate",{orientation:b(h(["portrait","portrait-upside-down","landscape-left","landscape-right"]))}),F("app-switcher",{}),F("keyboard",{action:h(["status","dismiss"])}),F("clipboard",{action:b(h(["read","write"])),text:v()}),F("react-native",{action:b(h(["dismiss-overlay"]))}),F("replay",{path:b(v()),update:m(),backend:v(),maestro:m(),env:o()}),F("test",{paths:b(o()),update:m(),backend:v(),maestro:m(),env:o(),failFast:m(),timeoutMs:d(),retries:d(),artifactsDir:v(),reportJunit:v()}),F("perf",{}),F("logs",{action:h(["path","start","stop","doctor","mark","clear"]),message:v(),restart:m()}),F("network",{action:h(["dump","log"]),limit:d(),include:h(["summary","headers","body","all"])}),F("record",{action:b(h(B)),path:v(),fps:d(),quality:s(c()),hideTouches:m()}),F("trace",{action:b(h(B)),path:v()}),F("settings",{setting:b(v()),state:b(v()),latitude:E(),longitude:E(),permission:v(),mode:h(["full","limited"])}),F("metro",{action:b(h(["prepare","reload"])),projectRoot:v(),kind:s(n()),publicBaseUrl:v(),proxyBaseUrl:v(),bearerToken:v(),bridgeScope:s({type:"object",additionalProperties:!0}),launchUrl:v(),port:d(),listenHost:v(),statusHost:v(),startupTimeoutMs:d(),probeTimeoutMs:d(),reuseExisting:m(),installDependenciesIfNeeded:m(),runtimeFilePath:v(),logPath:v(),metroHost:v(),metroPort:d(),bundleUrl:v(),timeoutMs:d()})];function F(t,e){return U(t,j(t),e)}let N=["pan","fling","swipe","pinch","rotate","transform"],T=["up","down","left","right"],H=["left","right","left-edge","right-edge"],K={target:b(x()),button:h(["primary","secondary","middle"],"Pointer button for platforms that support mouse buttons."),...r(),...C()},D={target:b(x()),...r(),...C()},L={target:b(x()),text:b(v("Text to enter into the target.")),delayMs:d("Delay between typed characters.",{min:0}),...r()},q={target:b(x()),durationMs:d("Long press duration in milliseconds.",{min:0}),...r()},G={from:b(w("Swipe start point.")),to:b(w("Swipe end point.")),durationMs:d("Swipe duration in milliseconds.",{min:0}),count:d("Number of swipe repetitions.",{min:1}),pauseMs:d("Pause between repeated swipes.",{min:0}),pattern:h(["one-way","ping-pong"])},z={x:b(E("X coordinate.")),y:b(E("Y coordinate."))},J={text:b(v("Text to type.")),delayMs:d("Delay between typed characters.",{min:0})},X={direction:b(h(["up","down","left","right","top","bottom"])),amount:E("Platform scroll amount."),pixels:d("Pixel scroll amount.",{min:0})},Y={format:b(h(["text","attrs"])),target:b(i()),...r()},Q={predicate:b(h(["visible","hidden","exists","editable","selected","text"])),selector:b(v()),value:v(),...r()},V={locator:h(["any","text","label","value","role","id"]),query:b(v()),action:h(["click","focus","exists","getText","getAttrs","wait","fill","type"]),value:v(),timeoutMs:d(),first:m(),last:m(),depth:d(),raw:m()},W={kind:b(h(N,"Gesture variant.")),direction:h(T,"Fling direction."),preset:h(H,"Swipe preset."),origin:w("Gesture origin point."),delta:w("Movement delta for pan or transform gestures."),distance:d("Fling distance.",{min:0}),scale:E("Pinch or transform scale."),degrees:E("Rotation in degrees."),velocity:d("Rotate gesture velocity.",{min:0}),durationMs:d("Gesture duration in milliseconds.",{min:0})},Z=[{name:"click",description:j("click"),inputSchema:S(K),readInput:t=>M(t,K)},{name:"press",description:j("press"),inputSchema:S(D),readInput:t=>M(t,D)},{name:"fill",description:j("fill"),inputSchema:S(L),readInput:t=>M(t,L)},tt("longpress",q),tt("swipe",G),tt("focus",z),tt("type",J),tt("scroll",X),tt("get",Y),tt("is",Q),tt("find",V),{name:"gesture",description:j("gesture"),inputSchema:S(W),readInput:function(t){let e=a(t),r=k(e),i=f(e,"kind",N);return"pan"===i?{...r,kind:i,origin:y(e,"origin"),delta:y(e,"delta"),durationMs:_(e,"durationMs",{min:0})}:"fling"===i?{...r,kind:i,direction:f(e,"direction",T),origin:y(e,"origin"),distance:_(e,"distance",{min:0}),durationMs:_(e,"durationMs",{min:0})}:"swipe"===i?{...r,kind:i,preset:f(e,"preset",H),durationMs:_(e,"durationMs",{min:0})}:"pinch"===i?{...r,kind:i,scale:P(e,"scale"),origin:te(e,"origin")}:"rotate"===i?{...r,kind:i,degrees:P(e,"degrees"),origin:te(e,"origin"),velocity:_(e,"velocity",{min:0})}:{...r,kind:i,origin:y(e,"origin"),delta:y(e,"delta"),scale:P(e,"scale"),degrees:P(e,"degrees"),durationMs:_(e,"durationMs",{min:0})}}}];function tt(t,e){return U(t,j(t),e)}function te(t,e){return void 0===t[e]?void 0:y(t,e)}let ta=new Map([...Z,...$,R(e)].map(t=>[t.name,t]));function tr(){return t().map(t=>{var e;if(!ti(t))throw Error(`Missing command metadata for MCP-exposed command: ${t}`);return e=t,ta.get(e)})}function ti(t){return ta.has(t)}export{$ as clientCommandMetadata,R as createBatchCommandMetadata,I as defineExecutableCommand,Z as interactionCommandMetadata,ti as isCommandName,tr as listMcpCommandMetadata};
1
+ import{listMcpExposedCommandNames as t,BATCH_COMMAND_NAMES as e}from"./5792.js";import{readInputRecord as a,selectorSnapshotFields as r,elementTargetField as i,stringSchema as n,stringArrayField as o,jsonSchemaField as s,booleanSchema as p,integerSchema as c,integerField as d,customField as u,assertAllowedKeys as l,booleanField as m,enumField as h,requiredEnum as f,looseObjectField as g,readPoint as y,requiredField as b,pointField as w,readFieldInput as M,stringField as v,interactionTargetField as x,fieldsInputSchema as S,requiredNumber as P,readCommonInput as k,repeatedFields as C,looseObjectSchema as A,numberField as E,optionalInteger as _}from"./9404.js";import{requireCommandDescription as j}from"./2805.js";function I(t,e){return{...t,run:e,invoke:async(a,r)=>await e(a,t.readInput(r))}}function R(t=e){var a;let r={steps:b(u({type:"array",description:"Structured batch steps. Each step uses a command name and the same input object as that command tool.",items:{type:"object",properties:{command:{type:"string",enum:a=t,description:"Command name to run with structured input."},input:{type:"object",additionalProperties:!0,description:"Structured command input for the nested command. Use the matching MCP tool schema for this object."},runtime:{type:"object",additionalProperties:!0,description:"Optional per-step runtime payload."}},required:["command","input"],additionalProperties:!1}},(t,e)=>(function(t,e){if(!Array.isArray(t))throw Error("Expected steps to be an array.");return t.map((t,a)=>{var r,i,n;let o;return r=t,i=a+1,n=e,l(o=function(t,e){if(!t||"object"!=typeof t||Array.isArray(t))throw Error(`Invalid batch step ${e}.`);return t}(r,i),["command","input","runtime"],`Batch step ${i}`),{command:f(o,"command",n),input:function(t,e){let a=t.input;if(!a||"object"!=typeof a||Array.isArray(a))throw Error(`Batch step ${e} input must be an object.`);return a}(o,i),...function(t,e){let a=t.runtime;if(void 0!==a&&(!a||"object"!=typeof a||Array.isArray(a)))throw Error(`Batch step ${e} runtime must be an object.`);return void 0===a?{}:{runtime:a}}(o,i)}})})(t[e],a))),onError:h(["stop"],"Batch failure policy."),maxSteps:d("Maximum number of steps accepted for this batch.",{min:1,max:1e3}),out:v("Optional output path for command artifacts.")};return{name:"batch",description:"Run multiple structured command steps in one daemon request.",inputSchema:S(r),readInput:t=>(function(t,e){let a=M(t,e),r=a.maxSteps??100;if(!Number.isInteger(r)||r<1||r>1e3)throw Error(`Invalid batch maxSteps: ${String(a.maxSteps)}`);if(a.steps.length>r)throw Error(`batch has ${a.steps.length} steps; max allowed is ${r}.`);return{...a}})(t,r)}}function U(t,e,a){return{name:t,description:e,inputSchema:S(a),readInput:t=>M(t,a)}}let O=["app","frontmost-app","desktop","menubar"],B=["start","stop"],$=[F("devices",{}),F("boot",{headless:m("Boot without showing simulator UI when supported.")}),F("apps",{appsFilter:h(["user-installed","all"])}),F("session",{action:h(["list"])}),F("open",{app:v("App name, bundle id, package, or URL."),url:v("Optional URL passed with an app shell."),surface:h(O),activity:v("Android activity name."),launchConsole:v("Launch console mode."),launchArgs:o("Launch arguments forwarded verbatim to the platform launch command."),relaunch:m("Force relaunch."),saveScript:s({oneOf:[p(),n()]}),noRecord:m("Do not record this action.")}),F("close",{app:v("Optional app to close."),shutdown:m("Shutdown the session/device where supported."),saveScript:s({oneOf:[p(),n()]})}),F("install",{app:b(v()),appPath:b(v("Path to app binary."))}),F("reinstall",{app:b(v()),appPath:b(v("Path to app binary."))}),F("install-from-source",{source:b(s(A("Install source object."))),retainPaths:m(),retentionMs:d()}),F("push",{app:b(v()),payload:b(s({oneOf:[n(),A()]}))}),F("trigger-app-event",{event:b(v()),payload:g()}),F("snapshot",{interactiveOnly:m(),compact:m(),depth:d(),scope:v(),raw:m(),forceFull:m()}),F("screenshot",{path:v("Output path."),overlayRefs:m(),fullscreen:m(),maxSize:d(),stabilize:m(),surface:h(O)}),F("diff",{kind:b(s({type:"string",const:"snapshot"})),out:v(),interactiveOnly:m(),compact:m(),depth:d(),scope:v(),raw:m()}),F("wait",{kind:h(["duration","text","ref","selector"]),durationMs:d(),text:v(),ref:v(),selector:v(),timeoutMs:d(),depth:d(),scope:v(),raw:m()}),F("alert",{action:h(["get","accept","dismiss","wait"]),timeoutMs:d()}),F("appstate",{}),F("back",{mode:h(["in-app","system"])}),F("home",{}),F("rotate",{orientation:b(h(["portrait","portrait-upside-down","landscape-left","landscape-right"]))}),F("app-switcher",{}),F("keyboard",{action:h(["status","dismiss"])}),F("clipboard",{action:b(h(["read","write"])),text:v()}),F("react-native",{action:b(h(["dismiss-overlay"]))}),F("replay",{path:b(v()),update:m(),backend:v(),maestro:m(),env:o()}),F("test",{paths:b(o()),update:m(),backend:v(),maestro:m(),env:o(),failFast:m(),timeoutMs:d(),retries:d(),artifactsDir:v(),reportJunit:v()}),F("perf",{}),F("logs",{action:h(["path","start","stop","doctor","mark","clear"]),message:v(),restart:m()}),F("network",{action:h(["dump","log"]),limit:d(),include:h(["summary","headers","body","all"])}),F("record",{action:b(h(B)),path:v(),fps:d(),quality:s(c()),hideTouches:m()}),F("trace",{action:b(h(B)),path:v()}),F("settings",{setting:b(v()),state:b(v()),app:v(),latitude:E(),longitude:E(),permission:v(),mode:h(["full","limited"])}),F("metro",{action:b(h(["prepare","reload"])),projectRoot:v(),kind:s(n()),publicBaseUrl:v(),proxyBaseUrl:v(),bearerToken:v(),bridgeScope:s({type:"object",additionalProperties:!0}),launchUrl:v(),port:d(),listenHost:v(),statusHost:v(),startupTimeoutMs:d(),probeTimeoutMs:d(),reuseExisting:m(),installDependenciesIfNeeded:m(),runtimeFilePath:v(),logPath:v(),metroHost:v(),metroPort:d(),bundleUrl:v(),timeoutMs:d()})];function F(t,e){return U(t,j(t),e)}let N=["pan","fling","swipe","pinch","rotate","transform"],T=["up","down","left","right"],H=["left","right","left-edge","right-edge"],K={target:b(x()),button:h(["primary","secondary","middle"],"Pointer button for platforms that support mouse buttons."),...r(),...C()},D={target:b(x()),...r(),...C()},L={target:b(x()),text:b(v("Text to enter into the target.")),delayMs:d("Delay between typed characters.",{min:0}),...r()},q={target:b(x()),durationMs:d("Long press duration in milliseconds.",{min:0}),...r()},G={from:b(w("Swipe start point.")),to:b(w("Swipe end point.")),durationMs:d("Swipe duration in milliseconds.",{min:0}),count:d("Number of swipe repetitions.",{min:1}),pauseMs:d("Pause between repeated swipes.",{min:0}),pattern:h(["one-way","ping-pong"])},z={x:b(E("X coordinate.")),y:b(E("Y coordinate."))},J={text:b(v("Text to type.")),delayMs:d("Delay between typed characters.",{min:0})},X={direction:b(h(["up","down","left","right","top","bottom"])),amount:E("Platform scroll amount."),pixels:d("Pixel scroll amount.",{min:0})},Y={format:b(h(["text","attrs"])),target:b(i()),...r()},Q={predicate:b(h(["visible","hidden","exists","editable","selected","text"])),selector:b(v()),value:v(),...r()},V={locator:h(["any","text","label","value","role","id"]),query:b(v()),action:h(["click","focus","exists","getText","getAttrs","wait","fill","type"]),value:v(),timeoutMs:d(),first:m(),last:m(),depth:d(),raw:m()},W={kind:b(h(N,"Gesture variant.")),direction:h(T,"Fling direction."),preset:h(H,"Swipe preset."),origin:w("Gesture origin point."),delta:w("Movement delta for pan or transform gestures."),distance:d("Fling distance.",{min:0}),scale:E("Pinch or transform scale."),degrees:E("Rotation in degrees."),velocity:d("Rotate gesture velocity.",{min:0}),durationMs:d("Gesture duration in milliseconds.",{min:0})},Z=[{name:"click",description:j("click"),inputSchema:S(K),readInput:t=>M(t,K)},{name:"press",description:j("press"),inputSchema:S(D),readInput:t=>M(t,D)},{name:"fill",description:j("fill"),inputSchema:S(L),readInput:t=>M(t,L)},tt("longpress",q),tt("swipe",G),tt("focus",z),tt("type",J),tt("scroll",X),tt("get",Y),tt("is",Q),tt("find",V),{name:"gesture",description:j("gesture"),inputSchema:S(W),readInput:function(t){let e=a(t),r=k(e),i=f(e,"kind",N);return"pan"===i?{...r,kind:i,origin:y(e,"origin"),delta:y(e,"delta"),durationMs:_(e,"durationMs",{min:0})}:"fling"===i?{...r,kind:i,direction:f(e,"direction",T),origin:y(e,"origin"),distance:_(e,"distance",{min:0}),durationMs:_(e,"durationMs",{min:0})}:"swipe"===i?{...r,kind:i,preset:f(e,"preset",H),durationMs:_(e,"durationMs",{min:0})}:"pinch"===i?{...r,kind:i,scale:P(e,"scale"),origin:te(e,"origin")}:"rotate"===i?{...r,kind:i,degrees:P(e,"degrees"),origin:te(e,"origin"),velocity:_(e,"velocity",{min:0})}:{...r,kind:i,origin:y(e,"origin"),delta:y(e,"delta"),scale:P(e,"scale"),degrees:P(e,"degrees"),durationMs:_(e,"durationMs",{min:0})}}}];function tt(t,e){return U(t,j(t),e)}function te(t,e){return void 0===t[e]?void 0:y(t,e)}let ta=new Map([...Z,...$,R(e)].map(t=>[t.name,t]));function tr(){return t().map(t=>{var e;if(!ti(t))throw Error(`Missing command metadata for MCP-exposed command: ${t}`);return e=t,ta.get(e)})}function ti(t){return ta.has(t)}export{$ as clientCommandMetadata,R as createBatchCommandMetadata,I as defineExecutableCommand,Z as interactionCommandMetadata,ti as isCommandName,tr as listMcpCommandMetadata};