agent-device 0.18.0 → 0.18.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (158) hide show
  1. package/README.md +3 -2
  2. package/android-multitouch-helper/dist/{agent-device-android-multitouch-helper-0.18.0.apk → agent-device-android-multitouch-helper-0.18.1.apk} +0 -0
  3. package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.18.1.apk.sha256 +1 -0
  4. package/android-multitouch-helper/dist/{agent-device-android-multitouch-helper-0.18.0.manifest.json → agent-device-android-multitouch-helper-0.18.1.manifest.json} +4 -4
  5. package/android-snapshot-helper/dist/{agent-device-android-snapshot-helper-0.18.0.apk → agent-device-android-snapshot-helper-0.18.1.apk} +0 -0
  6. package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.18.1.apk.sha256 +1 -0
  7. package/android-snapshot-helper/dist/{agent-device-android-snapshot-helper-0.18.0.manifest.json → agent-device-android-snapshot-helper-0.18.1.manifest.json} +6 -6
  8. package/apple-runner/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +156 -0
  9. package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunner.xcodeproj/project.pbxproj +10 -16
  10. package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AXSnapshotFallback.swift +2 -0
  11. package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +3 -1
  12. package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandJournal.swift +2 -0
  13. package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+FlatSnapshotFiltering.swift +2 -4
  14. package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +9 -36
  15. package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScrollGesture.swift +2 -0
  16. package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SequenceExecution.swift +2 -0
  17. package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Snapshot.swift +2 -0
  18. package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCapturePlan.swift +2 -0
  19. package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +0 -1
  20. package/dist/src/1986.js +1 -0
  21. package/dist/src/2748.js +1 -1
  22. package/dist/src/2948.js +21 -21
  23. package/dist/src/314.js +1 -1
  24. package/dist/src/3340.js +8 -7
  25. package/dist/src/432.js +4 -4
  26. package/dist/src/4418.js +1 -1
  27. package/dist/src/4428.js +3 -3
  28. package/dist/src/485.js +1 -0
  29. package/dist/src/495.js +5 -0
  30. package/dist/src/5484.js +1 -1
  31. package/dist/src/587.js +1 -1
  32. package/dist/src/5913.js +4 -0
  33. package/dist/src/6849.js +1 -0
  34. package/dist/src/6918.js +1 -1
  35. package/dist/src/6967.js +1 -0
  36. package/dist/src/760.js +1 -0
  37. package/dist/src/7871.js +1 -0
  38. package/dist/src/8225.js +1 -1
  39. package/dist/src/8391.js +1 -0
  40. package/dist/src/8404.js +2 -0
  41. package/dist/src/8414.js +2 -0
  42. package/dist/src/8875.js +1 -1
  43. package/dist/src/8936.js +1 -1
  44. package/dist/src/9581.js +3 -3
  45. package/dist/src/9624.js +1 -1
  46. package/dist/src/9722.js +37 -32
  47. package/dist/src/android-adb.d.ts +19 -54
  48. package/dist/src/android-adb.js +1 -1
  49. package/dist/src/android.js +5 -5
  50. package/dist/src/apps.js +9 -11
  51. package/dist/src/audio-probe.js +1 -0
  52. package/dist/src/batch.d.ts +33 -25
  53. package/dist/src/batch.js +1 -1
  54. package/dist/src/cli-help.js +66 -16
  55. package/dist/src/cli.js +33 -21
  56. package/dist/src/contracts.d.ts +32 -122
  57. package/dist/src/contracts.js +1 -1
  58. package/dist/src/debug-symbols.js +3 -0
  59. package/dist/src/devices.js +1 -1
  60. package/dist/src/devices~1.js +1 -1
  61. package/dist/src/devices~2.js +1 -1
  62. package/dist/src/find.js +1 -1
  63. package/dist/src/finders.d.ts +2 -6
  64. package/dist/src/finders.js +1 -1
  65. package/dist/src/generic.js +1 -9
  66. package/dist/src/handler-utils.js +1 -0
  67. package/dist/src/index.d.ts +438 -171
  68. package/dist/src/index.js +1 -1
  69. package/dist/src/input-actions.js +1 -1
  70. package/dist/src/input-actions~1.js +1 -1
  71. package/dist/src/install-source.d.ts +0 -26
  72. package/dist/src/install-source.js +1 -1
  73. package/dist/src/interaction.js +1 -1
  74. package/dist/src/interactor.js +1 -0
  75. package/dist/src/internal/bin.js +1 -1
  76. package/dist/src/internal/companion-tunnel.js +1 -1
  77. package/dist/src/internal/png-worker.js +1 -1
  78. package/dist/src/lease.js +1 -1
  79. package/dist/src/linux.js +1 -1
  80. package/dist/src/metro.d.ts +10 -134
  81. package/dist/src/metro.js +1 -1
  82. package/dist/src/notifications.js +1 -1
  83. package/dist/src/react-native.js +1 -1
  84. package/dist/src/record-trace-recording.js +3 -3
  85. package/dist/src/record-trace.js +1 -1
  86. package/dist/src/remote-config.d.ts +14 -16
  87. package/dist/src/remote-config.js +1 -1
  88. package/dist/src/runner-sequence.js +1 -0
  89. package/dist/src/selector-runtime.js +1 -1
  90. package/dist/src/selectors.d.ts +7 -3
  91. package/dist/src/selectors.js +1 -1
  92. package/dist/src/server.js +2 -2
  93. package/dist/src/session.js +11 -11
  94. package/dist/src/simulator.js +2 -2
  95. package/dist/src/snapshot.js +2 -2
  96. package/dist/src/web.js +1 -1
  97. package/macos-helper/Sources/AgentDeviceMacOSHelper/AudioProbe.swift +297 -0
  98. package/macos-helper/Sources/AgentDeviceMacOSHelper/main.swift +30 -0
  99. package/package.json +15 -11
  100. package/server.json +2 -2
  101. package/android-multitouch-helper/README.md +0 -41
  102. package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.18.0.apk.sha256 +0 -1
  103. package/android-snapshot-helper/README.md +0 -88
  104. package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.18.0.apk.sha256 +0 -1
  105. package/dist/src/1848.js +0 -4
  106. package/dist/src/2577.js +0 -1
  107. package/dist/src/2954.js +0 -2
  108. package/dist/src/4291.js +0 -1
  109. package/dist/src/4723.js +0 -1
  110. package/dist/src/5341.js +0 -1
  111. package/dist/src/5910.js +0 -2
  112. package/dist/src/6024.js +0 -1
  113. package/dist/src/733.js +0 -1
  114. package/dist/src/7394.js +0 -6
  115. package/dist/src/8275.js +0 -2
  116. package/dist/src/9919.js +0 -6
  117. package/dist/src/android-snapshot-helper.d.ts +0 -359
  118. package/dist/src/android-snapshot-helper.js +0 -1
  119. package/dist/src/apple.js +0 -1
  120. package/dist/src/device-ready.js +0 -2
  121. package/ios-runner/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.swift +0 -17
  122. package/ios-runner/AgentDeviceRunner/AgentDeviceRunner/Assets.xcassets/AccentColor.colorset/Contents.json +0 -11
  123. package/ios-runner/AgentDeviceRunner/AgentDeviceRunner/Assets.xcassets/AppIcon.appiconset/Contents.json +0 -36
  124. package/ios-runner/AgentDeviceRunner/AgentDeviceRunner/Assets.xcassets/AppIcon.appiconset/logo.jpg +0 -0
  125. package/ios-runner/AgentDeviceRunner/AgentDeviceRunner/Assets.xcassets/Contents.json +0 -6
  126. package/ios-runner/AgentDeviceRunner/AgentDeviceRunner/Assets.xcassets/Logo.imageset/Contents.json +0 -21
  127. package/ios-runner/AgentDeviceRunner/AgentDeviceRunner/Assets.xcassets/Logo.imageset/logo.jpg +0 -0
  128. package/ios-runner/AgentDeviceRunner/AgentDeviceRunner/Assets.xcassets/PoweredBy.imageset/Contents.json +0 -21
  129. package/ios-runner/AgentDeviceRunner/AgentDeviceRunner/Assets.xcassets/PoweredBy.imageset/powered-by.png +0 -0
  130. package/ios-runner/AgentDeviceRunner/AgentDeviceRunner/ContentView.swift +0 -34
  131. package/ios-runner/README.md +0 -53
  132. package/ios-runner/RUNNER_PROTOCOL.md +0 -76
  133. /package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -0
  134. /package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunner.xcodeproj/xcshareddata/xcschemes/AgentDeviceRunner.xcscheme +0 -0
  135. /package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/AgentDeviceRunnerUITests-Bridging-Header.h +0 -0
  136. /package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/AgentDeviceRunnerUITests.entitlements +0 -0
  137. /package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.h +0 -0
  138. /package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.m +0 -0
  139. /package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerObjCExceptionCatcher.h +0 -0
  140. /package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerObjCExceptionCatcher.m +0 -0
  141. /package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.h +0 -0
  142. /package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.m +0 -0
  143. /package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Alert.swift +0 -0
  144. /package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Environment.swift +0 -0
  145. /package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Exceptions.swift +0 -0
  146. /package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Lifecycle.swift +0 -0
  147. /package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +0 -0
  148. /package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScreenRecorder.swift +0 -0
  149. /package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SystemModal.swift +0 -0
  150. /package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Transport.swift +0 -0
  151. /package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TvRemote.swift +0 -0
  152. /package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +0 -0
  153. /package/{ios-runner → apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests.xctestplan +0 -0
  154. /package/{ios-runner → apple-runner}/AgentDeviceRunner/RecordingScripts/recording-overlay.swift +0 -0
  155. /package/{ios-runner → apple-runner}/AgentDeviceRunner/RecordingScripts/recording-resize.swift +0 -0
  156. /package/{ios-runner → apple-runner}/AgentDeviceRunner/RecordingScripts/recording-trim.swift +0 -0
  157. /package/dist/src/{4069.js → 4917.js} +0 -0
  158. /package/dist/src/{9836.js → 893.js} +0 -0
@@ -0,0 +1,5 @@
1
+ import e from"node:fs";import t from"node:http";import r from"node:https";import a from"node:path";import{pipeline as o}from"node:stream/promises";import{createHash as n,randomUUID as i}from"node:crypto";import s from"node:os";import{Transform as l,Writable as c}from"node:stream";import d from"node:net";import{toAppErrorCode as u,AppError as p}from"./485.js";import{runCmdDetachedMonitored as m,runCmd as f,runCmdSync as h,runCmdDetached as y}from"./8875.js";import{readNodeHttpResponseBody as g,readSnapshotDiagnosticsSummary as w,consumeTextLines as b,shellQuote as v,shouldStreamRequestProgress as I,isDaemonResponseEnvelope as _,resolveDaemonPaths as A,isDaemonProgressEnvelope as P,readScreenshotResultData as S,resolveDaemonServerMode as E,computeDaemonCodeSignature as k,resolveDaemonTransportPreference as M}from"./5913.js";import{recordingExtensionForPlatform as D,appendRecordingExtensionWhenMissing as N}from"./5643.js";import{createRequestId as T,withDiagnosticTimer as U,emitDiagnostic as C}from"./432.js";import{stopProcessForTakeover as R,waitForProcessExit as x,isAgentDeviceDaemonProcess as L}from"./9414.js";import{listCommandFamilyDaemonWriters as $,normalizeSession as O,normalizeInstallFromSourceResult as B,readSerializedSnapshotCaptureAnnotations as F,findCommandMetadata as j,normalizeMaterializationReleaseResult as H,normalizeOpenDevice as K,readSnapshotNodes as q,leaseScopeToLeaseRpcParams as V,normalizeDeployResult as G,markDoctorProgressRendered as z,buildMeta as J,resolveSessionName as W,buildRequestFlags as Y,createBatchDaemonWriter as Q,readMetadataCommandFlags as X,normalizeRuntimeHints as Z,normalizeDevice as ee,normalizeTargetShutdownResult as et,normalizeStartupSample as er,leaseScopeFromRequest as ea}from"./2948.js";import{readRequiredString as eo,INTERNAL_COMMANDS as en,PUBLIC_COMMANDS as ei,readOptionalString as es,isRecord as el}from"./1986.js";import{readVersion as ec,findProjectRoot as ed}from"./1404.js";import{sleep as eu}from"./5560.js";import{ensureMetroCompanion as ep}from"./8404.js";import{resolveUserPath as em}from"./9612.js";import{detectProjectRuntimeKindFromPackageJson as ef,readProjectPackageJson as eh}from"./760.js";import{resolveRuntimeTransportHints as ey}from"./8936.js";import{normalizeBaseUrl as eg,buildBundleUrl as ew}from"./4917.js";import{isNonDefaultResponseLevel as eb}from"./6849.js";let ev="/agent-device";function eI(e){return e_(e,ev)}function e_(e,t){let r=e.endsWith("/")?e:`${e}/`;return new URL(t.replace(/^\/+/,""),r).toString()}function eA(e){let t=e?.trim();return t?{authorization:`Bearer ${t}`,"x-agent-device-token":t}:{}}async function eP(t,r){var o,n,i;let s,l=e.statSync(t),c=a.basename(t),d=l.isDirectory(),u=("ios"===(o=r)||"android"===o?o:void 0)??(n=t,i=l,s=n.toLowerCase(),i.isDirectory()&&s.endsWith(".app")||s.endsWith(".ipa")?"ios":s.endsWith(".apk")||s.endsWith(".aab")?"android":void 0),p=[];try{let r=d?await eS(t,p):t,a=e.statSync(r);return{payloadPath:r,fileName:c,artifactType:d?"app-bundle":"file",platform:u,contentType:d?"application/gzip":"application/octet-stream",sha256:await ek(r),sizeBytes:a.size,cleanup:()=>eE(p)}}catch(e){throw eE(p),e}}async function eS(t,r){let o=e.mkdtempSync(a.join(s.tmpdir(),`agent-device-upload-${i()}-`));r.push(o);let n=a.join(o,`${a.basename(t)}.tar.gz`);return await f("tar",["czf",n,"-C",a.dirname(t),a.basename(t)],{env:{...process.env,COPYFILE_DISABLE:"1"}}),n}function eE(t){for(let r of t)e.rmSync(r,{recursive:!0,force:!0})}async function ek(t){let r=n("sha256"),a=new c({write(e,t,a){r.update(e),a()}});return await o(e.createReadStream(t),a).catch(e=>{throw new p("COMMAND_FAILED","Failed to read local artifact",{},e instanceof Error?e:void 0)}),r.digest("hex")}function eM(e){return"direct"===e?"direct":"legacy"}function eD(e){if(e<1024)return`${e} B`;let t=e/1024;if(t<1024)return`${t.toFixed(1)} KiB`;let r=t/1024;return r<1024?`${r.toFixed(1)} MiB`:`${(r/1024).toFixed(1)} GiB`}let eN="uploadStreamRetryable";async function eT(e){return await eU({...e,url:e.url,redirectCount:0,startOffset:0})}async function eU(n){var i,s,c,d,u,m;let f="https:"===n.url.protocol?r:t,h=e.statSync(n.payloadPath).size,y=(i=n.headers,s=n.startOffset,c=h,s<=0?i:{...i,"content-length":Math.max(c-s,0),"content-range":`bytes ${s}-${c-1}/${c}`});return d=n.progress,u=n.startOffset,m=h,d?.onProgress?.({type:u>0?"resume":"start",stage:d.stage,fileName:d.fileName,transferredBytes:u,totalBytes:m}),await new Promise((t,r)=>{let i=!1,s=f.request({protocol:n.url.protocol,host:n.url.hostname,port:n.url.port,method:n.method,path:n.url.pathname+n.url.search,headers:y},e=>{i=!0,g(e).then(a=>{clearTimeout(c);let o=e.statusCode??500,i=e.headers.location;if(i&&[301,302,303,307,308].includes(o)){if(n.redirectCount>=5)return void r(new p("COMMAND_FAILED","Artifact upload exceeded redirect limit",{maxRedirects:5,url:n.url.toString()}));let e=new URL(i,n.url);return void eU({...n,url:e,redirectCount:n.redirectCount+1}).then(t,r)}let s=308===o?function(e,t){let r=function(e){let t=eR(e);if(void 0===t)return;let r=Number(t);return Number.isSafeInteger(r)&&r>=0?r:void 0}(e["x-upload-offset"]??e["upload-offset"]);if(void 0!==r)return Math.min(r,t);let a=eR(e.range),o=a?.match(/^bytes=0-(\d+)$/);if(!o)return;let n=Number(o[1]);if(Number.isSafeInteger(n)&&!(n<0))return Math.min(n+1,t)}(e.headers,h):void 0;void 0!==s?s>=h?t({statusCode:200,statusMessage:"Upload already complete",body:""}):s<=n.startOffset?r(new p("COMMAND_FAILED","Artifact upload resume did not advance",{offset:s,previousOffset:n.startOffset,url:n.url.toString()})):eU({...n,startOffset:s}).then(t,r):t({statusCode:o,statusMessage:e.statusMessage,body:a})}).catch(r)}),c=setTimeout(()=>{s.destroy(),r(new p("COMMAND_FAILED",n.timeoutMessage,{timeoutMs:3e5,...n.timeoutHint?{hint:n.timeoutHint}:{},...eC(n)}))},3e5);s.on("error",e=>{i||(clearTimeout(c),r(new p("COMMAND_FAILED",n.errorMessage,{...n.errorHint?{hint:n.errorHint}:{},...eC(n)},e)))}),s.on("close",()=>clearTimeout(c)),o(e.createReadStream(n.payloadPath,{start:n.startOffset}),function(e){let{stage:t,fileName:r,startOffset:a,totalBytes:o,onProgress:n}=e,i=a,s=Math.max(8388608,Math.ceil(.05*o)),c=Math.min(o,a+s);return new l({transform(e,a,l){(i=Math.min(o,i+e.byteLength))>=c&&(n?.({type:"progress",stage:t,fileName:r,transferredBytes:i,totalBytes:o}),c=Math.min(o,i+s)),l(null,e)}})}({stage:n.progress?.stage??"legacy",fileName:n.progress?.fileName??a.basename(n.payloadPath),startOffset:n.startOffset,totalBytes:h,onProgress:n.progress?.onProgress}),s).catch(e=>{i||(s.destroy(),r(new p("COMMAND_FAILED","Failed to read local artifact",{},e instanceof Error?e:Error(String(e)))))})})}function eC(e){return!0===e.retryable?{[eN]:!0}:{}}function eR(e){return Array.isArray(e)?e[0]:e}async function ex(e){let t=await eP(e.localPath,e.platform),r=e.baseUrl.endsWith("/")?e.baseUrl:`${e.baseUrl}/`,a=i();try{let o=await eO({normalizedBase:r,token:e.token,artifact:t,uploadAttemptId:a});if(o?.kind==="cache-hit")return o.uploadId;if(o?.kind==="direct-upload"){let n=await eL({normalizedBase:r,token:e.token,artifact:t,preflight:o,uploadAttemptId:a,onProgress:e.onProgress});if(n)return n;e.onProgress?.({type:"fallback",from:"direct",to:"legacy",fileName:t.fileName})}return await e$({normalizedBase:r,token:e.token,artifact:t,onProgress:e.onProgress})}finally{t.cleanup()}}async function eL(e){let t=async t=>(await eB(e.artifact,t,e.onProgress),await eF({normalizedBase:e.normalizedBase,token:e.token,uploadId:t.uploadId}));try{return await t(e.preflight)}catch(a){if(!function(e){return!(e instanceof p)||e instanceof p&&e.details?.[eN]===!0}(a))return;let r=await eO({normalizedBase:e.normalizedBase,token:e.token,artifact:e.artifact,uploadAttemptId:e.uploadAttemptId});if(r?.kind==="cache-hit")return r.uploadId;if(r?.kind==="direct-upload")try{return await t(r)}catch{}return}}async function e$(e){let{normalizedBase:t,token:r,artifact:a}=e,o=new URL("upload",t),n={"content-type":a.contentType,"x-artifact-type":a.artifactType,"x-artifact-filename":a.fileName,"x-artifact-hash":a.sha256,"x-artifact-hash-algorithm":"sha256","transfer-encoding":"chunked"};Object.assign(n,eA(r));let i=await eT({url:o,method:"POST",headers:n,payloadPath:a.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.",progress:{stage:"legacy",fileName:a.fileName,onProgress:e.onProgress}});try{let e=JSON.parse(i.body);if(!e.ok||!e.uploadId)throw new p("COMMAND_FAILED",`Upload failed: ${i.body}`);return e.uploadId}catch(e){if(e instanceof p)throw e;throw new p("COMMAND_FAILED",`Invalid upload response: ${i.body}`)}}async function eO(e){let t=new URL("upload/preflight",e.normalizedBase),r={"content-type":"application/json"};Object.assign(r,eA(e.token));let a=await fetch(t,{method:"POST",headers:r,signal:AbortSignal.timeout(3e4),body:JSON.stringify({uploadAttemptId:e.uploadAttemptId,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(a?.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 r=e.upload;if(!r||"string"!=typeof r.url)return;let a=r.headers??{};if(!(!(t=a)||"object"!=typeof t||Array.isArray(t))&&Object.values(t).every(e=>"string"==typeof e))return{kind:"direct-upload",uploadId:e.uploadId,url:r.url,headers:a}}(await a.json().catch(()=>void 0))}async function eB(e,t,r){let a=await eT({url:new URL(t.url),method:"PUT",headers:t.headers,payloadPath:e.payloadPath,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",retryable:!0,progress:{stage:"direct",fileName:e.fileName,onProgress:r}});if(a.statusCode<200||a.statusCode>=300)throw new p("COMMAND_FAILED","Direct artifact upload failed",{statusCode:a.statusCode,statusMessage:a.statusMessage})}async function eF(e){let t=new URL("upload/finalize",e.normalizedBase),r={"content-type":"application/json"};Object.assign(r,eA(e.token));let a=await fetch(t,{method:"POST",headers:r,signal:AbortSignal.timeout(3e4),body:JSON.stringify({uploadId:e.uploadId})}).catch(e=>{throw new p("COMMAND_FAILED","Failed to finalize direct artifact upload",{},e)});if(!a.ok)throw new p("COMMAND_FAILED","Direct artifact upload finalize failed",{status:a.status,statusText:a.statusText});let o=await a.json().catch(()=>void 0);if(!o?.ok||!o.uploadId)throw new p("COMMAND_FAILED","Invalid upload finalize response");return o.uploadId}async function ej(e,t){var r;let o,n=[...e.positionals??[]],i=e.flags?{...e.flags}:void 0,s=e.meta?.installSource,l={},c=function(){if(!0===process.stderr.isTTY&&!process.env.CI)return e=>{process.stderr.write(`${function(e){switch(e.type){case"start":return`Uploading ${e.fileName} (${eD(e.totalBytes)}) via ${eM(e.stage)} upload`;case"resume":return`Resuming ${e.fileName} at ${eD(e.transferredBytes)} of ${eD(e.totalBytes)}`;case"progress":var t,r;return`Uploaded ${eD(e.transferredBytes)} of ${eD(e.totalBytes)} (${t=e.transferredBytes,(r=e.totalBytes)<=0?"100%":`${Math.min(100,Math.floor(t/r*100))}%`})`;case"fallback":return`Direct upload did not complete; retrying ${e.fileName} with ${eM(e.to)} upload`}}(e)}
2
+ `)}}();if(!("string"==typeof(r=t).baseUrl&&r.baseUrl.length>0))return eK({positionals:n,flags:i,installSource:s,uploadedArtifactId:o,clientArtifactPaths:l});i=function(e,t,r,o){var n,i;let s=function(e,t){if("screenshot"===e.command){let r=eG(e,"path",".png");return t[0]?{field:"path",localPath:r,positionalIndex:0,positionalPath:eJ("screenshot",".png")}:{field:"path",localPath:r,positionalIndex:0,flagPath:eJ("screenshot",".png")}}if("record"===e.command&&"start"===(t[0]??"").toLowerCase()){var r,o,n;if(r=e,!(ez(r.positionals?.[1])||ez(r.flags?.out))&&e.flags?.platform===void 0)return null;let t=eV(e),i=(o=eG(e,"outPath",t,1),n=e,n.flags?.platform!=="web"?o:N(o,eV(n)));return{field:"outPath",localPath:i,positionalIndex:1,positionalPath:eJ("recording",a.extname(i)||t)}}return null}(e,t);if(!s)return r;void 0!==s.positionalPath&&(t[s.positionalIndex]=s.positionalPath);let l=(n=r,void 0===(i=s.flagPath)?n:{...n??{},out:i});return o[s.field]=s.localPath,l}(e,n,i,l);let d=await eq(e,t,c);d&&(s=d.installSource,o=d.uploadedArtifactId??o);let u=()=>eK({positionals:n,flags:i,installSource:s,uploadedArtifactId:o,clientArtifactPaths:l});return"install"!==e.command&&"reinstall"!==e.command||(o=await eH(e,t,n,c)??o),u()}async function eH(t,r,o,n){var i,s;let l,c=+(1!==o.length),d=o[c];if(void 0===d)return;if(d.startsWith("remote:")){o[c]=d.slice(7);return}let u=(i=d,s=t.meta?.cwd,l=a.isAbsolute(i)?i:a.resolve(s??process.cwd(),i),e.existsSync(l)?l:void 0);if(u)return await ex({localPath:u,baseUrl:r.baseUrl,token:r.token,platform:t.flags?.platform,onProgress:n})}function eK(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 eq(t,r,o){let n=t.meta?.installSource;if("install_source"!==t.command||!n||"path"!==n.kind)return null;let i=n.path.trim();if(!i)return{installSource:n};if(i.startsWith("remote:"))return{installSource:{...n,path:i.slice(7)}};let s=a.isAbsolute(i)?i:a.resolve(t.meta?.cwd??process.cwd(),i);if(!e.existsSync(s))return{installSource:{...n,path:s}};let l=await ex({localPath:s,baseUrl:r.baseUrl,token:r.token,platform:t.flags?.platform,onProgress:o});return{installSource:{...n,path:s},uploadedArtifactId:l}}function eV(e){return D(e.flags?.platform)}function eG(e,t,r,o=0){let n=e.positionals?.[o]??e.flags?.out,i=`${"path"===t?"screenshot":"recording"}-${Date.now()}${r}`,s=ez(n)?n:i;return a.isAbsolute(s)?s:a.resolve(e.meta?.cwd??process.cwd(),s)}function ez(e){return"string"==typeof e&&e.trim().length>0}function eJ(e,t){let r=t.startsWith(".")?t:`.${t}`;return a.posix.join("/tmp",`agent-device-${e}-${Date.now()}-${Math.random().toString(36).slice(2,8)}${r}`)}async function eW(e,t,r){let o=Array.isArray(r.data?.artifacts)?r.data.artifacts:[];if(0===o.length||!e.baseUrl)return r;let n=r.data?{...r.data}:{},i=[];for(let r of o){if(!r||"object"!=typeof r||"string"!=typeof r.artifactId){i.push(r);continue}let o=function(e,t){if(e.localPath&&e.localPath.trim().length>0)return e.localPath;let r=t.meta?.clientArtifactPaths?.[e.field];if(r&&r.trim().length>0)return r;let o=e.fileName?.trim()||`${e.field}-${Date.now()}`;return a.resolve(t.meta?.cwd??process.cwd(),o)}(r,t);await eY({baseUrl:e.baseUrl,token:e.token,artifactId:r.artifactId,destinationPath:o,requestId:t.meta?.requestId}),n[r.field]=o,i.push({...r,localPath:o})}return n.artifacts=i,{ok:!0,data:n}}async function eY(n){var i,s;let l,c=new URL((i=n.baseUrl,s=n.artifactId,l=i.endsWith("/")?i:`${i}/`,new URL(`artifacts/${encodeURIComponent(s)}`,l).toString())),d="https:"===c.protocol?r:t;await e.promises.mkdir(a.dirname(n.destinationPath),{recursive:!0}),await new Promise((t,r)=>{let a=!1,i=n.timeoutMs??9e4,s=o=>{if(!a){if(a=!0,clearTimeout(u),o)return void e.promises.rm(n.destinationPath,{force:!0}).finally(()=>r(o));t()}},l=d.request({protocol:c.protocol,host:c.hostname,port:c.port,method:"GET",path:c.pathname+c.search,headers:eA(n.token)},t=>{if((t.statusCode??500)>=400){let e="";t.setEncoding("utf8"),t.on("data",t=>{e+=t}),t.on("end",()=>{s(new p("COMMAND_FAILED","Failed to download remote artifact",{artifactId:n.artifactId,statusCode:t.statusCode,requestId:n.requestId,body:e}))});return}t.on("aborted",()=>{s(new p("COMMAND_FAILED","Remote artifact download was interrupted",{artifactId:n.artifactId,requestId:n.requestId}))}),o(t,e.createWriteStream(n.destinationPath)).then(()=>s(),e=>s(e instanceof Error?e:Error(String(e))))}),u=setTimeout(()=>{let e=new p("COMMAND_FAILED","Remote artifact download timed out",{artifactId:n.artifactId,requestId:n.requestId,timeoutMs:i});s(e),l.destroy(e)},i);l.on("error",e=>{e instanceof p?s(e):s(new p("COMMAND_FAILED","Failed to download remote artifact",{artifactId:n.artifactId,requestId:n.requestId,timeoutMs:i},e instanceof Error?e:void 0))}),l.end()})}function eQ(e){var t,r,a;let o,n,i=e8(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=eZ((r=i).port),n=eZ(r.httpPort),void 0===o&&void 0===n?null:{port:o,httpPort:n});return l?{token:s,...l,transport:"socket"===(a=i.transport)||"http"===a||"dual"===a?a:void 0,pid:eZ(i.pid)??0,version:eX(i.version),codeSignature:eX(i.codeSignature),processStartTime:eX(i.processStartTime)}:null}function eX(e){return"string"==typeof e?e:void 0}function eZ(e){return Number.isInteger(e)&&Number(e)>0?Number(e):void 0}function e0(e){let t=e8(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}async function e1(t,r,a={}){let o=a.stopLiveProcesses??!0,n={reason:r,removedInfo:!1,removedLock:!1,stoppedInfoProcess:!1,stoppedLockProcess:!1};try{var i,s,l,c;let r=e.existsSync(t.infoPath),a=eQ(t.infoPath);if(a){let e=L(a.pid,a.processStartTime);e&&!o?n.retainedInfoProcess=!0:(e&&(await e2(a),n.stoppedInfoProcess=!0),i=t.infoPath,e6(i),n.removedInfo=!0)}else r&&(s=t.infoPath,e6(s),n.removedInfo=!0);let d=e.existsSync(t.lockPath),u=e0(t.lockPath);if(u){let e=L(u.pid,u.processStartTime);e&&!o?n.retainedLockProcess=!0:(e&&(await R(u.pid,{termTimeoutMs:3e3,killTimeoutMs:1e3,expectedStartTime:u.processStartTime}),n.stoppedLockProcess=!0),l=t.lockPath,e6(l),n.removedLock=!0)}else d&&(c=t.lockPath,e6(c),n.removedLock=!0)}catch(e){n.error=e instanceof Error?e.message:String(e)}return C({level:n.error?"warn":"info",phase:"daemon_startup_metadata_cleanup",data:n}),n}function e3(t){return{hasInfo:e.existsSync(t.infoPath),hasLock:e.existsSync(t.lockPath)}}async function e5(e){let t=e3(e);if(!t.hasLock||t.hasInfo)return!1;let r=e0(e.lockPath);return!(r&&L(r.pid,r.processStartTime))&&(e6(e.lockPath),!0)}async function e2(e){await R(e.pid,{termTimeoutMs:3e3,killTimeoutMs:1e3,expectedStartTime:e.processStartTime})}function e4(e){return"string"==typeof e.baseUrl&&e.baseUrl.length>0}function e8(t){if(!e.existsSync(t))return null;try{return JSON.parse(e.readFileSync(t,"utf8"))}catch{return null}}function e6(t){try{e.existsSync(t)&&e.unlinkSync(t)}catch{}}function e7(e,t,r){return new p("COMMAND_FAILED","Invalid daemon response",{requestId:e.meta?.requestId,line:t},r instanceof Error?r:void 0)}function e9(e){let t=t=>(e.onError(t),!0);return{handleLine(r){let a;try{a=JSON.parse(r)}catch(a){return t(e7(e.req,r,a))}if(P(a))try{var o,n;return o=a.event,(n={req:e.req,onProgress:e.onProgress}).onProgress?n.onProgress(o):"command"===o.type&&("doctor"===n.req.command&&z(),process.stderr.write(`${o.message}
3
+ `)),!1}catch(e){return t(e)}return _(a)?(e.onResponse(a.response),!0):"socket-legacy"===e.responseFormat?(e.onResponse(a),!0):t(e7(e.req,r,Error("Missing daemon progress response envelope")))}}}function te(e,t){let{info:r,req:a,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=a.meta?.requestId,e=s.data??{},new p(u(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 p("COMMAND_FAILED","Invalid daemon RPC response",{requestId:a.meta?.requestId}));tt(r,a,t.result,o,n)}catch(t){n(new p("COMMAND_FAILED","Invalid daemon response",{requestId:a.meta?.requestId,line:e},t instanceof Error?t:void 0))}}async function tt(e,t,r,a,o){try{a(e.baseUrl&&r.ok?await eW(e,t,r):r)}catch(e){o(e)}}let tr=["xcodebuild .*AgentDeviceRunnerUITests/RunnerTests/testCommand","xcodebuild .*AgentDeviceRunner\\.env\\.session-","xcodebuild build-for-testing .*apple-runner/AgentDeviceRunner/AgentDeviceRunner\\.xcodeproj"];function ta(e,t,r,a,o,n){let i=o?{terminated:0}:function(){let e=0;try{for(let t of tr){let r=h("pkill",["-f",t],{allowFailure:!0});0===r.exitCode&&(e+=1)}return{terminated:e}}catch(t){return{terminated:e,error:t instanceof Error?t.message:String(t)}}}(),s=!o&&"snapshot"!==a,l=s?function(e,t){let r=!1;try{L(e.pid,e.processStartTime)&&(process.kill(e.pid,"SIGKILL"),r=!0)}catch{e2(e)}finally{e6(t.infoPath),e6(t.lockPath)}return{forcedKill:r}}(e,t):{forcedKill:!1};return C({level:"error",phase:"daemon_request_timeout",data:{timeoutMs:n,requestId:r,command:a,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 p("COMMAND_FAILED","Daemon request timed out",{timeoutMs:n,requestId:r,hint:function(e){let{remote:t,resetDaemon:r,command:a}=e;if(t)return"Retry with --debug and verify the remote daemon URL, auth token, and remote host logs.";if(!r){let e=a===ei.snapshot?" If this was the first Apple-platform snapshot on the device, run agent-device prepare ios-runner with the same --platform before snapshot/test so runner startup is handled explicitly.":"";return`Retry with --debug and check daemon diagnostics logs. The timed-out ${a??"request"} request was canceled and Apple runner work was aborted when detected; the daemon was kept alive so the session can still be closed or inspected.${e}`}return"Retry with --debug and check daemon diagnostics logs. Timed-out Apple runner xcodebuild processes were terminated when detected."}({remote:o,resetDaemon:s,command:a})})}let to="Daemon HTTP endpoint is unavailable",tn="Daemon socket endpoint is unavailable";async function ti(e,t){let r=tp(e,t);if(await ts(e,r))return!0;let a=tf(e,t,r);return!!a&&await ts(e,a)}async function ts(e,t){var r;return"http"===t?await tc(e).then(e=>e.reachable):await ((r=e.port)?new Promise(e=>{let t=!1,a=d.createConnection({host:"127.0.0.1",port:r},()=>{o(!0)}),o=r=>{t||(t=!0,a.destroy(),e(r))};a.setTimeout(500),a.on("timeout",()=>{o(!1)}),a.on("error",()=>{o(!1)})}):Promise.resolve(!1))}async function tl(e){let t=await tc(e);if(!e.baseUrl||!t.reachable)return t;if("number"==typeof t.rpcProtocolVersion&&1!==t.rpcProtocolVersion)throw new p("COMMAND_FAILED","Remote daemon RPC protocol is incompatible",{daemonBaseUrl:e.baseUrl,clientVersion:ec(),remoteVersion:t.version,remoteService:t.service,supportedRpcProtocolVersion:1,remoteRpcProtocolVersion:t.rpcProtocolVersion,hint:"Upgrade agent-device on the client or remote host so both support the same daemon RPC protocol."});return t}function tc(e){let a=e.baseUrl?e_(e.baseUrl,"health"):e.httpPort?`http://127.0.0.1:${e.httpPort}/health`:null;if(!a)return Promise.resolve({reachable:!1});let o=new URL(a),n="https:"===o.protocol?r:t,i=e.baseUrl?3e3:500;return new Promise(t=>{let r=e.baseUrl?eA(e.token):{},a=n.request({protocol:o.protocol,host:o.hostname,port:o.port,path:o.pathname+o.search,method:"GET",timeout:i,headers:r},e=>{let r="";e.setEncoding("utf8"),e.on("data",e=>{r+=e}),e.on("end",()=>{let a=e.statusCode??500;t({reachable:a<500,statusCode:a,...function(e){try{let t=JSON.parse(e);return{service:"string"==typeof t.service?t.service:void 0,version:"string"==typeof t.version?t.version:void 0,rpcProtocolVersion:"number"==typeof t.rpcProtocolVersion?t.rpcProtocolVersion:void 0}}catch{return{}}}(r)})})});a.on("timeout",()=>{a.destroy(),t({reachable:!1})}),a.on("error",()=>{t({reachable:!1})}),a.end()})}async function td(e,t,r,a,o,n={}){let i=tp(e,r);try{return await tu(e,t,a,o,i,n)}catch(c){var s;let l=tf(e,r,i);if(!l||(s=c,"socket"!==i||!(s instanceof p)||"COMMAND_FAILED"!==s.code||"Failed to communicate with daemon"!==s.message||s.details?.daemonSocketRequestWritten!==!1))throw c;return await tu(e,t,a,o,l,n)}}async function tu(e,t,r,a,o,n){return"http"===o?await tg(e,t,r,a,n):await ty(e,t,r,a,n)}function tp(e,t){if(e.baseUrl){if("socket"===t)throw new p("COMMAND_FAILED","Remote daemon endpoint only supports HTTP transport",{daemonBaseUrl:e.baseUrl});return"http"}if("http"===t||"socket"===t){var r=e,a=t;if(tm(r,a))return a;throw new p("COMMAND_FAILED","http"===a?to:tn)}let o=("socket"===e.transport||"dual"===e.transport?["socket","http"]:["http","socket"]).find(t=>tm(e,t));if(o)return o;throw new p("COMMAND_FAILED","Daemon metadata has no reachable transport")}function tm(e,t){return"http"===t?!!e.httpPort:!!e.port}function tf(e,t,r){if("auto"!==t||e.baseUrl)return null;let a="socket"===r?"http":"socket";return tm(e,a)?a:null}function th(e,t,r,a={}){return C({level:"error",phase:"daemon_request_socket_error",data:{requestId:t,message:e instanceof Error?e.message:String(e)}}),new p("COMMAND_FAILED","Failed to communicate with daemon",{...a,requestId:t,hint:r?"Retry command. If this persists, verify the remote daemon URL, auth token, and remote host reachability.":"Retry command. If this persists, clean stale daemon metadata and start a fresh session."},e instanceof Error?e:void 0)}async function ty(e,t,r,a,o){let n=e.port;if(!n)throw new p("COMMAND_FAILED",tn);return new Promise((i,s)=>{let l=!1,c=d.createConnection({host:"127.0.0.1",port:n},()=>{l=!0,c.write(`${JSON.stringify(t)}
4
+ `)}),u=!1,p="number"==typeof a?setTimeout(()=>{u=!0,c.destroy(),s(ta(e,r,t.meta?.requestId,t.command,!1,a))},a):void 0;!function(e,t){let{req:r,isSettled:a,resolve:o,reject:n,clearTimeout:i}=t,s="",l=e9({req:r,onProgress:t.onProgress,responseFormat:"socket-legacy",onResponse(t){i(),o(t),e.end()},onError(e){i(),n(e)}});e.setEncoding("utf8"),e.on("data",e=>{if(a())return;let t=b(s,e);for(let e of(s=t.buffer,t.lines))if(l.handleLine(e))return})}(c,{req:t,onProgress:o.onProgress,isSettled:()=>u,clearTimeout:()=>{p&&clearTimeout(p)},resolve:e=>{u=!0,i(e)},reject:e=>{u=!0,s(e)}}),c.on("error",e=>{u||(u=!0,p&&clearTimeout(p),s(th(e,t.meta?.requestId,!1,{daemonSocketRequestWritten:l})))})})}async function tg(e,a,o,n,i){var s,l,c,d,u;let m,f=e.baseUrl?new URL(e_(e.baseUrl,"rpc")):e.httpPort?new URL(`http://127.0.0.1:${e.httpPort}/rpc`):null;if(!f)throw new p("COMMAND_FAILED",to);let h=JSON.stringify((s={includeTokenParam:!e.baseUrl},m=a.meta?.requestId??T(),"lease_allocate"!==(l=a.command)&&"lease_heartbeat"!==l&&"lease_release"!==l?{jsonrpc:"2.0",id:m,method:"agent_device.command",params:a}:{jsonrpc:"2.0",id:m,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"}}(a.command),params:(c=a,d=a.command,u=s,V(ea(c),d,{includeTokenParam:u.includeTokenParam,token:c.token,session:c.session}))})),y={"content-type":"application/json","content-length":Buffer.byteLength(h)};return e.baseUrl&&Object.assign(y,eA(e.token)),await new Promise((s,l)=>{let c=("https:"===f.protocol?r:t).request({protocol:f.protocol,host:f.hostname,port:f.port,method:"POST",path:f.pathname+f.search,headers:y},t=>{var r;(r=t.headers?.["content-type"],I(a)&&String(Array.isArray(r)?r.join(","):r??"").includes("application/x-ndjson"))?function(e,t){let{req:r,handleResponseBody:a,reject:o,clearTimeout:n}=t,i="",s=!1,l=e9({req:r,onProgress:t.onProgress,responseFormat:"ndjson-envelope",onResponse(e){s=!0,n(),a(JSON.stringify(e))},onError(e){s=!0,n(),o(e)}});e.setEncoding("utf8"),e.on("data",e=>{if(s)return;let t=b(i,e);for(let e of(i=t.buffer,t.lines))if(e&&l.handleLine(e))return}),e.on("end",()=>{if(s)return;let e=i.trim();e&&l.handleLine(e)||(s=!0,n(),o(e7(r,e)))}),e.on("error",e=>{s||(s=!0,n(),o(new p("COMMAND_FAILED","Failed to read daemon response",{requestId:r.meta?.requestId},e instanceof Error?e:void 0)))})}(t,{req:a,onProgress:i.onProgress,reject:l,clearTimeout:()=>{u&&clearTimeout(u)},handleResponseBody:t=>te(t,{info:e,req:a,resolve:s,reject:l})}):g(t).then(t=>{u&&clearTimeout(u),te(t,{info:e,req:a,resolve:s,reject:l})}).catch(e=>{u&&clearTimeout(u),l(new p("COMMAND_FAILED","Failed to read daemon response",{requestId:a.meta?.requestId},e instanceof Error?e:void 0))})}),d=e4(e),u="number"==typeof n?setTimeout(()=>{c.destroy(),l(ta(e,o,a.meta?.requestId,a.command,d,n))},n):void 0;c.on("error",e=>{u&&clearTimeout(u),l(th(e,a.meta?.requestId,d))}),c.write(h),c.end()})}let tw=new d.BlockList;function tb(t){var r,o,n,i,l;let c,u,m,f=(r=t,r.flags?.stateDir??process.env.AGENT_DEVICE_STATE_DIR),h=(o=t,u=function(e){let t;if(e){try{t=new URL(e)}catch(t){throw new p("INVALID_ARGS","Invalid daemon base URL",{daemonBaseUrl:e},t instanceof Error?t:void 0)}if("http:"!==t.protocol&&"https:"!==t.protocol)throw new p("INVALID_ARGS","Daemon base URL must use http or https",{daemonBaseUrl:e});return t.toString().replace(/\/+$/,"")}}(c=o.flags?.daemonBaseUrl??process.env.AGENT_DEVICE_DAEMON_BASE_URL),function(e,t){let r;if(!(!e||"localhost"===(r=new URL(e).hostname.trim().toLowerCase().replace(/^\[(.*)\]$/,"$1"))||(d.isIPv4(r)?tw.check(r,"ipv4"):!!d.isIPv6(r)&&tw.check(r,"ipv6")))&&("string"!=typeof t||!(t.trim().length>0)))throw new p("INVALID_ARGS","Remote daemon base URL for non-loopback hosts requires daemon authentication",{daemonBaseUrl:e,hint:"Provide --daemon-auth-token or AGENT_DEVICE_DAEMON_AUTH_TOKEN when using a non-loopback remote daemon URL."})}(u,m=o.flags?.daemonAuthToken??process.env.AGENT_DEVICE_DAEMON_AUTH_TOKEN),{rawBaseUrl:c,remoteBaseUrl:u,authToken:m}),y=function(e,t){let r=e.flags?.daemonTransport??process.env.AGENT_DEVICE_DAEMON_TRANSPORT,a=M(r);if(t&&"socket"===a)throw new p("INVALID_ARGS","Remote daemon base URL only supports HTTP transport. Remove --daemon-transport socket.",{daemonBaseUrl:t});return{preference:a,serverMode:E(e.flags?.daemonServerMode??process.env.AGENT_DEVICE_DAEMON_SERVER_MODE??("dual"===r?"dual":void 0))}}(t,h.remoteBaseUrl),g=(n=t,i=f,l=h.rawBaseUrl,tE(n.command)&&!i&&!l);return{paths:A(g?e.mkdtempSync(a.join(s.tmpdir(),"agent-device-replay-daemon-")):f),transportPreference:y.preference,serverMode:y.serverMode,ownedStateDir:g,remoteBaseUrl:h.remoteBaseUrl,remoteAuthToken:h.authToken}}async function tv(e){if(e.remoteBaseUrl)return await tI(e);let t=await t_(e);return t?{info:t,startedByClient:!1}:(!function(e){let t=e3(e);if(!t.hasLock||t.hasInfo)return;let r=e0(e.lockPath);if(!r)return e6(e.lockPath);L(r.pid,r.processStartTime)||e6(e.lockPath)}(e.paths),await tP(e))}async function tI(e){let t={transport:"http",token:e.remoteAuthToken??"",pid:0,baseUrl:e.remoteBaseUrl};if((await tl(t)).reachable)return{info:t,startedByClient:!1};throw new p("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. If this CLI was connected with connect proxy, run agent-device disconnect to return to the local daemon."})}async function t_(e){var t,r;let a=eQ(e.paths.infoPath);if(!a)return null;let o=await tA(a,e.transportPreference);return(t=a,r=o,t.version===ec()&&t.codeSignature===tD()&&r)?a:(function(e,t,r){try{var a,o;let n=e.version?`pid ${e.pid}, v${e.version}`:`pid ${e.pid}`,i=(a=e,o=t,a.version!==ec()?`version mismatch (client v${ec()})`:a.codeSignature!==tD()?"code-signature mismatch":o?"not reusable":"unreachable");process.stderr.write(`Replacing daemon (${n}) in ${r}: ${i}
5
+ `)}catch{}}(a,o,e.paths.baseDir),await e2(a),e6(e.paths.infoPath),null)}async function tA(e,t){try{return await ti(e,t)}catch(e){var r;if((r=e)instanceof p&&"COMMAND_FAILED"===r.code&&(r.message===to||r.message===tn))return!1;throw e}}async function tP(t){let r,a,o=0,n=[];for(let i=1;i<=2;i+=1){let s;try{a={pid:(s=function(t){let r=tM(),a=r.useSrc?["--experimental-strip-types",r.srcPath]:[r.distPath],o={...process.env,AGENT_DEVICE_STATE_DIR:t.paths.baseDir,AGENT_DEVICE_DAEMON_SERVER_MODE:t.serverMode};e.mkdirSync(t.paths.baseDir,{recursive:!0});let n=e.openSync(t.paths.logPath,"a"),i=e.openSync(t.paths.logPath,"a");try{return m(process.execPath,a,{env:o,stdio:["ignore",n,i]})}finally{e.closeSync(n),e.closeSync(i)}}(t)).pid}}catch(e){if(r=e instanceof Error?e.message:String(e),n.push(await e1(t.paths,"start_error")),i<2){await eu(150);continue}break}let l=await tk(15e3,t,s);if("ready"===l.kind)return{info:l.info,startedByClient:!0};if("early_exit"===l.kind){if(a=l.exit,r=tN(l.exit),n.push(await e1(t.paths,"start_error")),i<2){await eu(150);continue}break}if(await e5(t.paths)){o+=1;continue}let c=e3(t.paths),d=i<2,u=await e1(t.paths,"startup_timeout",{stopLiveProcesses:!1});if(n.push(u),u.retainedInfoProcess||u.retainedLockProcess){let e=await tk(15e3,t,s);if("ready"===e.kind)return{info:e.info,startedByClient:!0};"early_exit"===e.kind&&(a=e.exit,r=tN(e.exit));break}if(!d)break;c.hasInfo||c.hasLock||await eu(150)}let i=e3(t.paths),s=function(t){try{if(!e.existsSync(t))return;let r=e.statSync(t);if(r.size<=0)return;let a=Math.min(r.size,64e3),o=e.openSync(t,"r");try{let t=Buffer.alloc(a);e.readSync(o,t,0,a,r.size-a);let n=t.toString("utf8").trim();return n.length>0?n:void 0}finally{e.closeSync(o)}}catch{return}}(t.paths.logPath);throw new p("COMMAND_FAILED","Failed to start daemon",{kind:"daemon_startup_failed",stateDir:t.paths.baseDir,infoPath:t.paths.infoPath,lockPath:t.paths.lockPath,logPath:t.paths.logPath,startupTimeoutMs:15e3,startupAttempts:2,lockRecoveryCount:o,cleanupResults:n,startError:r,daemonProcess:a,...s?{daemonLogTail:s}:{},metadataState:i,hint:function(e,t=A(process.env.AGENT_DEVICE_STATE_DIR)){var r;let a=(r=t,`rm -f ${v(r.infoPath)} ${v(r.lockPath)}`);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 after confirming no agent-device daemon process is running, run: ${a}`: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 after confirming no agent-device daemon process is running, run: ${a}`:e.hasInfo?`agent-device did not observe reachable daemon metadata after retrying, and ${t.infoPath} still remains. Stale metadata was cleaned automatically when safe; retry with --debug. If this persists after confirming no agent-device daemon process is running, run: ${a}`:`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. If stale metadata returns after confirming no agent-device daemon process is running, run: ${a}`}(i,t.paths)})}async function tS(t,r,a){if(!tE(t.command)||!r.startedByClient&&!a.ownedStateDir||e4(r.info))return;let o={pid:r.info.pid,removedInfo:!1,removedLock:!1,removedStateDir:!1,error:void 0};try{await e2(r.info)}catch(e){o.error=e instanceof Error?e.message:String(e)}finally{let t=e.existsSync(a.paths.infoPath);e6(a.paths.infoPath),o.removedInfo=t&&!e.existsSync(a.paths.infoPath);let r=e.existsSync(a.paths.lockPath);e6(a.paths.lockPath),o.removedLock=r&&!e.existsSync(a.paths.lockPath),a.ownedStateDir&&(e.rmSync(a.paths.baseDir,{recursive:!0,force:!0}),o.removedStateDir=!e.existsSync(a.paths.baseDir))}C({level:o.error?"warn":"info",phase:"daemon_replay_cleanup",data:o})}function tE(e){return e===ei.replay||e===ei.test}async function tk(e,t,r){let a,o=Date.now();for(r.exited.then(e=>{a=e});Date.now()-o<e;){if(a)return{kind:"early_exit",exit:a};let e=eQ(t.paths.infoPath);if(e&&await ti(e,t.transportPreference))return{kind:"ready",info:e};if(a)return{kind:"early_exit",exit:a};await eu(100)}return{kind:"timeout"}}function tM(){let t=ed(),r=[a.join(t,"dist","src","internal","daemon.js"),a.join(t,"dist","src","daemon.js")],o=r[0];if(void 0===o)throw new p("COMMAND_FAILED","Daemon dist path list is empty");let n=r.find(t=>e.existsSync(t))??o,i=a.join(t,"src","daemon.ts"),s=r.some(t=>e.existsSync(t)),l=e.existsSync(i);if(!s&&!l)throw new p("COMMAND_FAILED","Daemon entry not found",{distPaths:r,srcPath:i});return{root:t,distPath:n,distPaths:r,srcPath:i,useSrc:process.execArgv.includes("--experimental-strip-types")?l:!s&&l}}function tD(){let e=tM();return k(e.useSrc?e.srcPath:e.distPath,e.root)}function tN(e){return e.error?`daemon process ${e.pid} failed to start: ${e.error}`:e.signal?`daemon process ${e.pid} exited before readiness with signal ${e.signal}`:`daemon process ${e.pid} exited before readiness with code ${e.exitCode??0}`}async function tT(e,t={}){var r;let a=e.meta?.requestId??T(),o=!!(e.meta?.debug||e.flags?.verbose),n=tb(e),i=function(e){if(e.command!==ei.test){var t;return"number"==typeof e.flags?.timeoutMs&&((t=e.command)===ei.prepare||t===ei.replay||t===ei.snapshot)?e.flags.timeoutMs:e.command===ei.prepare?24e4:tU(e.command)?18e4:9e4}}(e),s=await U("daemon_startup",async()=>await tv(n),{requestId:a,session:e.session}),l=s.info,c=await ej(e,l);tU(r=e.command)&&!0===process.stderr.isTTY&&!process.env.CI&&process.stderr.write(r===ei.reinstall?"Reinstalling...\n":"Installing...\n");let d={...e,positionals:c.positionals,flags:c.flags,token:l.token,meta:{...e.meta??{},requestId:a,debug:o,includeCost:e.meta?.includeCost,cwd:e.meta?.cwd,sessionExplicit:e.meta?.sessionExplicit,tenantId:e.meta?.tenantId??e.flags?.tenant,runId:e.meta?.runId??e.flags?.runId,leaseId:e.meta?.leaseId??e.flags?.leaseId,sessionIsolation:e.meta?.sessionIsolation??e.flags?.sessionIsolation,lockPolicy:e.meta?.lockPolicy,lockPlatform:e.meta?.lockPlatform,...c.uploadedArtifactId?{uploadedArtifactId:c.uploadedArtifactId}:{},...c.clientArtifactPaths?{clientArtifactPaths:c.clientArtifactPaths}:{},...c.installSource?{installSource:c.installSource}:{}}};C({level:"info",phase:"daemon_request_prepare",data:{requestId:a,command:e.command,session:e.session}});try{return await U("daemon_request",async()=>await td(l,d,n.transportPreference,n.paths,i,t),{requestId:a,command:e.command})}finally{await tS(e,s,n)}}function tU(e){return e===ei.install||e===ei.reinstall||e===en.installSource}function tC(e){return"string"==typeof e&&e.trim()?eg(e.trim()):""}function tR(e){return"string"==typeof e&&e.trim()?e.trim():void 0}function tx(e,t,r){return em(e,{env:t,cwd:r})}function tL(t){try{return e.accessSync(t,e.constants.F_OK),!0}catch{return!1}}function t$(e,t,r){if(null==e||""===e)return t;let a=Number.parseInt(String(e),10);return Number.isInteger(a)?Math.max(a,r):t}function tO(e,t){if(null==e||""===e)return t;let r=Number.parseInt(String(e),10);if(!Number.isInteger(r)||r<1||r>65535)throw new p("INVALID_ARGS",`Invalid Metro port: ${String(e)}. Use 1-65535.`);return r}function tB(e,t){return{platform:t,bundleUrl:ew(e,t)}}function tF(e,t){return{platform:t,metroHost:tR(e?.metro_host),metroPort:e?.metro_port,bundleUrl:tR(e?.metro_bundle_url),launchUrl:tR(e?.launch_url)}}async function tj(e){await eu(e)}async function tH(e,t,r={}){try{let a=await fetch(e,{headers:r,signal:AbortSignal.timeout(t)});return{ok:a.ok,status:a.status,body:await a.text()}}catch(r){if(r instanceof Error&&"TimeoutError"===r.name)throw Error(`Timed out fetching ${e} after ${t}ms`);throw r}}async function tK(e,t){try{let r=await tH(e,t);return r.ok&&r.body.includes("packager-status:running")}catch{return!1}}async function tq(e){if(Number.isInteger(e)&&!(e<=0)){try{process.kill(e,"SIGTERM")}catch(t){let e=t.code;if("ESRCH"===e||"EPERM"===e)return;throw t}if(!await x(e,1e3)){try{process.kill(e,"SIGKILL")}catch(t){let e=t.code;if("ESRCH"===e||"EPERM"===e)return;throw t}await x(e,1e3)}}}function tV(e,t){let r=Error(e);return r.retryable=t,r}function tG(e,t){return!!(e>=500||408===e||425===e||429===e||JSON.stringify(t).includes("Metro companion is not connected"))}function tz(e){return!!(e&&"object"==typeof e&&"retryable"in e&&!0===e.retryable)}async function tJ(e){let t;try{var r,a;t=await fetch(`${e.baseUrl}/api/metro/bridge`,{method:"POST",headers:(r=e.baseUrl,a=e.bearerToken,{Authorization:`Bearer ${a}`,"Content-Type":"application/json",...r.includes("ngrok")?{"ngrok-skip-browser-warning":"1"}:{}}),body:JSON.stringify({...e.scope,...e.runtime?{ios_runtime:e.runtime}:{},timeout_ms:e.timeoutMs}),signal:AbortSignal.timeout(e.timeoutMs)})}catch(t){if(t instanceof Error&&"TimeoutError"===t.name)throw tV(`/api/metro/bridge timed out after ${e.timeoutMs}ms calling ${e.baseUrl}/api/metro/bridge`,!0);throw tV(t instanceof Error?t.message:String(t),!0)}let o=function(e,t,r){if(!e)return{};try{let t=JSON.parse(e);if(!t||"object"!=typeof t||Array.isArray(t))throw Error("Expected a JSON object");return t}catch(n){let a=e.slice(0,200),o=n instanceof Error?n.message:String(n);throw tV(`/api/metro/bridge returned invalid JSON (${t}) from ${r}: ${o}. body=${JSON.stringify(a)}`,tG(t,e))}}(await t.text(),t.status,e.baseUrl);if(!t.ok)throw tV(`/api/metro/bridge failed (${t.status}): ${JSON.stringify(o)}`,tG(t.status,o));var n=o;let i=n.data??n;if(!i||"object"!=typeof i||Array.isArray(i))throw tV("/api/metro/bridge returned malformed descriptor: Expected a JSON object.",!1);try{return{enabled:i.enabled,baseUrl:i.base_url,statusUrl:i.status_url??"",bundleUrl:i.bundle_url??"",iosRuntime:tF(i.ios_runtime,"ios"),androidRuntime:tF(i.android_runtime,"android"),upstream:{bundleUrl:i.upstream.bundle_url??"",host:i.upstream.host??"",port:i.upstream.port??0,statusUrl:i.upstream.status_url??""},probe:{reachable:i.probe.reachable,statusCode:i.probe.status_code,latencyMs:i.probe.latency_ms,detail:i.probe.detail}}}catch(e){throw tV(`/api/metro/bridge returned malformed descriptor: ${e instanceof Error?e.message:String(e)}`,!1)}}function tW(e,t,r,a,o){let n=[`Metro bridge is required for this run but could not be configured via ${e}/api/metro/bridge.`];return t&&n.push(`bridgeError=${t}`),r?.probe.reachable===!1&&n.push(`bridgeProbe=${r.probe.detail||`unreachable (status ${r.probe.statusCode||0})`}`),a&&a!==t&&n.push(`initialBridgeError=${a}`),o&&n.push(`metroCompanionLog=${o}`),n.join(" ")}async function tY(e,t,r){let a=Date.now()+t;for(;Date.now()<a;){let t=Math.min(r,Math.max(a-Date.now(),1));if(await tK(e,t))return!0;let o=Math.min(500,Math.max(a-Date.now(),0));o>0&&await tj(o)}return!1}async function tQ(e){let t=Date.now()+e.startupTimeoutMs,r=null,a=null;for(;Date.now()<t;){try{let t=await tJ({baseUrl:e.baseUrl,bearerToken:e.bearerToken,scope:e.scope,runtime:e.runtime,timeoutMs:e.probeTimeoutMs});if(!1!==t.probe.reachable)return t;r=t,a=null}catch(e){if(a=e instanceof Error?e.message:String(e),!tz(e))break}let o=Math.min(1e3,Math.max(t-Date.now(),0));o>0&&await tj(o)}throw Error(tW(e.baseUrl,a,r,e.initialBridgeError,e.companionLogPath))}async function tX(t){let r=`http://${t.statusHost}:${t.metroPort}/status`;if(t.reuseExisting&&await tK(r,t.probeTimeoutMs))return{started:!1,reused:!0,pid:0,statusUrl:r};let o=function(t,r,o,n,i,s){let l="expo"===r?{command:"npx",installArgs:["expo","start","--host","lan","--port",String(o)]}:{command:"npx",installArgs:["react-native","start","--host",n,"--port",String(o)]};e.mkdirSync(a.dirname(i),{recursive:!0});let c=e.openSync(i,"a"),d=0;try{d=y(l.command,l.installArgs,{cwd:t,env:s,stdio:["ignore",c,c]})}finally{e.closeSync(c)}if(!Number.isInteger(d)||d<=0)throw Error("Failed to start Metro. Expected a detached child PID.");return{pid:d}}(t.projectRoot,t.kind,t.metroPort,t.listenHost,t.logPath,t.env);if(await tY(r,t.startupTimeoutMs,t.probeTimeoutMs))return{started:!0,reused:!1,pid:o.pid,statusUrl:r};throw await tq(o.pid).catch(()=>{}),Error(`Metro did not become ready at ${r} within ${t.startupTimeoutMs}ms. Check ${t.logPath}.`)}async function tZ(e,t){let r=t.bridgeScope;if(!r)return null;let a=null,o=null;try{a=await tJ({baseUrl:t.proxyBaseUrl,bearerToken:t.proxyBearerToken,scope:r,timeoutMs:t.probeTimeoutMs})}catch(e){if(!tz(e))throw e;o=e instanceof Error?e.message:String(e)}a&&!1!==a.probe.reachable||(a=await t0(e,t,r,a,o));var n=t.proxyBaseUrl,i=a;if(!i?.iosRuntime.bundleUrl)throw Error(tW(n,"bridge descriptor is missing ios_runtime.metro_bundle_url",i));return a}async function t0(e,t,r,a,o){let n;try{n=(await ep({projectRoot:t.projectRoot,serverBaseUrl:t.proxyBaseUrl,bearerToken:t.proxyBearerToken,bridgeScope:r,localBaseUrl:`http://${t.statusHost}:${t.metroPort}`,launchUrl:tR(e.launchUrl),profileKey:tR(e.companionProfileKey),consumerKey:tR(e.companionConsumerKey),env:t.env})).logPath}catch(e){throw Error(tW(t.proxyBaseUrl,e instanceof Error?e.message:String(e),a,o))}try{return await tQ({baseUrl:t.proxyBaseUrl,bearerToken:t.proxyBearerToken,scope:r,probeTimeoutMs:t.probeTimeoutMs,startupTimeoutMs:t.startupTimeoutMs,initialBridgeError:o,companionLogPath:n})}catch(e){throw e instanceof Error?e:Error(String(e))}}async function t1(t={}){var r,o;let n=function(e){var t;let r=e.env??process.env,o=process.cwd(),n=tx(e.projectRoot??o,r,o),i=tC(e.publicBaseUrl),s=tC(e.proxyBaseUrl);if(!i&&!s)throw new p("INVALID_ARGS","metro prepare requires --public-base-url <url> or --proxy-base-url <url>.");let{proxyEnabled:l,proxyBaseUrl:c,proxyBearerToken:d}=function(e,t,r){let a=t||tR(r.AGENT_DEVICE_METRO_BEARER_TOKEN)||"",o=a||e&&tR(r.AGENT_DEVICE_DAEMON_AUTH_TOKEN)||"";if(e&&!o)throw new p("INVALID_ARGS","metro prepare requires proxy auth when --proxy-base-url is provided. Pass --bearer-token or set AGENT_DEVICE_METRO_BEARER_TOKEN or AGENT_DEVICE_DAEMON_AUTH_TOKEN.");if(!e&&a)throw new p("INVALID_ARGS","metro prepare requires --proxy-base-url when proxy auth is provided.");return{proxyEnabled:!!(e&&o),proxyBaseUrl:e,proxyBearerToken:o}}(s,tR(e.proxyBearerToken)??"",r);return{env:r,projectRoot:n,kind:"auto"!==(t=e.kind??"auto")?t:"expo"===ef(function(e){let t=a.join(e,"package.json"),r=eh(e);if(!r)throw new p("INVALID_ARGS",`package.json not found at ${t}`);return r}(n))?"expo":"react-native",metroPort:tO(e.metroPort??8081,8081),listenHost:tR(e.listenHost)??"0.0.0.0",statusHost:tR(e.statusHost)??"127.0.0.1",publicBaseUrl:i,proxyBaseUrl:c,proxyBearerToken:d,bridgeScope:l?function(e){if(!e?.tenantId||!e.runId||!e.leaseId)throw new p("INVALID_ARGS","metro prepare with proxy requires tenantId, runId, and leaseId bridge scope.");return e}(e.bridgeScope):null,startupTimeoutMs:t$(e.startupTimeoutMs,18e4,3e4),probeTimeoutMs:t$(e.probeTimeoutMs,1e4,1e3),reuseExisting:e.reuseExisting??!0,installProjectDeps:e.installDependenciesIfNeeded??!0,runtimeFilePath:e.runtimeFilePath?tx(e.runtimeFilePath,r,o):null,logPath:tx(e.logPath??a.join(n,".agent-device","metro.log"),r,o)}}(t),i=n.installProjectDeps?function(t,r){if(function(t){try{return e.statSync(t).isDirectory()}catch{return!1}}(a.join(t,"node_modules")))return{installed:!1};let o=tL(a.join(t,"pnpm-lock.yaml"))?{command:"pnpm",installArgs:["install"]}:tL(a.join(t,"yarn.lock"))?{command:"yarn",installArgs:["install"]}:{command:"npm",installArgs:["install"]};return h(o.command,o.installArgs,{cwd:t,env:r}),{installed:!0,packageManager:o.command}}(n.projectRoot,n.env):{installed:!1},s=await tX(n),{baseIosRuntime:l,baseAndroidRuntime:c}={baseIosRuntime:(r=n.publicBaseUrl)?tB(r,"ios"):{platform:"ios"},baseAndroidRuntime:r?tB(r,"android"):{platform:"android"}},d=await tZ(t,n),u=d?.iosRuntime??l,m=d?.androidRuntime??c,f={projectRoot:n.projectRoot,kind:n.kind,dependenciesInstalled:i.installed,packageManager:i.packageManager??null,started:s.started,reused:s.reused,pid:s.pid,logPath:n.logPath,statusUrl:s.statusUrl,runtimeFilePath:n.runtimeFilePath,iosRuntime:u,androidRuntime:m,bridge:d};return o=n.runtimeFilePath,o&&(e.mkdirSync(a.dirname(o),{recursive:!0}),e.writeFileSync(o,JSON.stringify(f,null,2))),f}async function t3(e={}){let t=t$(e.timeoutMs,1e4,1e3),r=function(e){var t;let r,a=tR(e.bundleUrl),o=a??e.runtime?.bundleUrl,n=!!a,i=!!tR(o),s=ey({metroHost:tR(e.metroHost)??(n?void 0:tR(e.runtime?.metroHost))??(i?void 0:"localhost"),metroPort:void 0!==e.metroPort?tO(e.metroPort,8081):n?void 0:e.runtime?.metroPort??(i?void 0:8081),bundleUrl:o});if(!s)throw new p("INVALID_ARGS","Unable to resolve Metro host and port for reload.");return t=function(e){let t=tR(e);if(!t)return"/reload";let r=new URL(t).pathname.replace(/\/+$/,"");return r.endsWith("/index.bundle")?`${r.slice(0,-13)}/reload`:"/reload"}(o),(r=new URL(`${s.scheme}://localhost`)).hostname=s.host,r.port=String(s.port),r.pathname=t,r.toString()}(e),a=await tH(r,t);if(!a.ok)throw new p("COMMAND_FAILED",`Metro reload failed (${a.status}).`,{reloadUrl:r,status:a.status,body:a.body,hint:"Verify Metro is running and the target React Native app is connected to this Metro instance."});return{reloaded:!0,reloadUrl:r,status:a.status,body:a.body}}tw.addSubnet("127.0.0.0",8,"ipv4"),tw.addAddress("::1","ipv6"),tw.addSubnet("::ffff:127.0.0.0",104,"ipv6");let t5={...$(),batch:Q(function(e,t,r){let a=t5[e];if(!a)throw Error(`Missing daemon writer for batch command: ${e}`);let o=j(e);if(!o)throw Error(`Missing command metadata for batch command: ${e}`);try{return t2(a,o,o.readInput(t))}catch(a){let t=a instanceof Error?a.message:String(a);throw new p("INVALID_ARGS",`Batch step ${r} ${e} input is invalid: ${t}`,void 0,a)}})};function t2(e,t,r){let a=e(r);return{...a,...t?{metadataFlags:X(t,a.options)}:{}}}function t4(e={},t={}){let r=t.transport??tT,a=t=>eb(t.responseLevel??e.responseLevel),o=async(t,a=[],o={},n)=>{let i=t6(e,o),s=await r({session:W(i.session),command:t,positionals:a,flags:Y(i,n),runtime:i.runtime,meta:J(i)});return s.ok||function(e){throw new p(u(e.code),e.message,{...e.details??{},hint:e.hint,diagnosticId:e.diagnosticId,logPath:e.logPath})}(s.error),s.data??{}},n=async(e={})=>{let t=await o(en.sessionList,[],e);return(Array.isArray(t.sessions)?t.sessions:[]).map(O)},i=async(e,t={})=>{let r=function(e,t){let r=t5[e];if(!r)throw Error(`Missing daemon writer for command: ${e}`);return t2(r,j(e),t)}(e,t);return await o(r.command,r.positionals,r.options,r.metadataFlags)},s=(t={})=>W(t6(e,t).session);return{command:{wait:async e=>await i("wait",e),alert:async(e={})=>await i("alert",e),appState:async(e={})=>await i("appstate",e),back:async(e={})=>await i("back",e),home:async(e={})=>await i("home",e),rotate:async e=>await i("rotate",e),appSwitcher:async(e={})=>await i("app-switcher",e),keyboard:async(e={})=>await i("keyboard",e),clipboard:async e=>await i("clipboard",e),reactNative:async e=>await i("react-native",e),doctor:async(e={})=>await i("doctor",e),prepare:async e=>await i("prepare",e),viewport:async e=>await i("viewport",e)},devices:{list:async(e={})=>{let t=await i("devices",e);return(Array.isArray(t.devices)?t.devices:[]).map(ee)},boot:async(e={})=>await i("boot",e),shutdown:async(e={})=>await i("shutdown",e)},sessions:{list:async(e={})=>await n(e),stateDir:async(t={})=>A(t6(e,t).stateDir??process.env.AGENT_DEVICE_STATE_DIR).baseDir,close:async(e={})=>{let t=s(e),r=await i("close",e);return{session:t,shutdown:et(r.shutdown),provider:t8(r.provider),identifiers:{session:t}}},artifacts:async(e={})=>await i("artifacts",e)},apps:{install:async e=>G(await i("install",e),s(e)),reinstall:async e=>G(await i("reinstall",e),s(e)),installFromSource:async e=>B(await i("install-from-source",e),s(e)),list:async(e={})=>{let t=await i("apps",e);return Array.isArray(t.apps)?t.apps.filter(e=>"string"==typeof e):[]},open:async e=>{let t=s(e),r=await i("open",e),a=K(r),o=es(r,"appBundleId");return{session:t,sessionStateDir:es(r,"sessionStateDir"),appName:es(r,"appName"),appBundleId:o,appId:o,startup:er(r.startup),runtime:Z(r.runtime),device:a,identifiers:{session:t,deviceId:a?.id,deviceName:a?.name,udid:a?.ios?.udid,serial:a?.android?.serial,appId:o,appBundleId:o}}},close:async(e={})=>{let t=s(e),r=await i("close",e);return{session:t,closedApp:e.app,shutdown:et(r.shutdown),identifiers:{session:t}}},push:async e=>await i("push",e),triggerEvent:async e=>await i("trigger-app-event",e)},materializations:{release:async e=>H(await o(en.releaseMaterializedPaths,[],{...e,materializationId:e.materializationId}))},leases:{allocate:async e=>t7(await o(en.leaseAllocate,[],{...e,leaseId:void 0})),heartbeat:async e=>t7(await o(en.leaseHeartbeat,[],e)),release:async e=>{let t=await o(en.leaseRelease,[],e);return{released:!0===t.released,provider:t8(t.provider)}}},metro:{prepare:async t=>await t1({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 t3({metroHost:t.metroHost,metroPort:t.metroPort,bundleUrl:t.bundleUrl,runtime:e.runtime,timeoutMs:t.timeoutMs})},capture:{snapshot:async(e={})=>{var t,r,o;let n,l,c,d,u=s(e),p=await i("snapshot",e);return a(e)?p:(t=p,r=u,n=es(t,"appBundleId"),{nodes:q(t.nodes),truncated:!0===t.truncated,appName:es(t,"appName"),appBundleId:n,...(l=t8((o=t).visibility),c=t8(o.unchanged),d=w(o.snapshotDiagnostics),{...l?{visibility:l}:{},...F(o),...c?{unchanged:c}:{},...d?{snapshotDiagnostics:d}:{}}),identifiers:{session:r,appId:n,appBundleId:n}})},screenshot:async(e={})=>{let t=s(e),r=await i("screenshot",e);if(a(e))return r;let o=S(r);return{path:eo(r,"path"),overlayRefs:o?.overlayRefs,identifiers:{session:t}}},diff:async e=>await i("diff",e)},interactions:{click:async e=>await i("click",e),press:async e=>await i("press",e),longPress:async e=>await i("longpress",e),swipe:async e=>await i("swipe",e),pan:async e=>await i("gesture-pan",e),fling:async e=>await i("gesture-fling",e),swipeGesture:async e=>await i("gesture-swipe",e),focus:async e=>await i("focus",e),type:async e=>await i("type",e),fill:async e=>await i("fill",e),scroll:async e=>await i("scroll",e),pinch:async e=>await i("gesture-pinch",e),rotateGesture:async e=>await i("gesture-rotate",e),transformGesture:async e=>await i("gesture-transform",e),get:async e=>await i("get",e),is:async e=>await i("is",e),find:async e=>await i("find",e)},replay:{run:async e=>await i("replay",e),test:async e=>await i("test",e)},batch:{run:async e=>await i("batch",e)},observability:{perf:async(e={})=>await i("perf",e),logs:async(e={})=>await i("logs",e),network:async(e={})=>await i("network",e),audio:async(e={})=>await i("audio",e)},debug:{symbols:async t=>{let{symbolicateCrashArtifact:r}=await import("./debug-symbols.js");return r({cwd:t.cwd??e.cwd,...t})}},recording:{record:async e=>await i("record",e),trace:async e=>await i("trace",e)},settings:{update:async e=>await i("settings",e)}}}function t8(e){return el(e)?e:void 0}function t6(e,t){return{...e,...t}}function t7(e){let t=e.lease;if(!el(t))throw Error("Invalid lease response from daemon");return{leaseId:eo(t,"leaseId"),tenantId:eo(t,"tenantId"),runId:eo(t,"runId"),backend:eo(t,"backend"),leaseProvider:es(t,"leaseProvider"),clientId:es(t,"clientId"),deviceKey:es(t,"deviceKey"),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{ev as DAEMON_HTTP_BASE_PATH,eA as buildDaemonHttpAuthHeaders,eI as buildDaemonHttpBaseUrl,e_ as buildDaemonHttpUrl,t4 as createAgentDeviceClient,tv as ensureDaemon,tb as resolveClientSettings,tT as sendToDaemon};
package/dist/src/5484.js CHANGED
@@ -1 +1 @@
1
- import t from"node:dns/promises";import e from"node:net";import{createWriteStream as a,promises as r}from"node:fs";import o from"node:os";import i from"node:path";import{Readable as n}from"node:stream";import{pipeline as s}from"node:stream/promises";import{AppError as l}from"./733.js";import{runCmd as c}from"./8875.js";import{expandUserHomePath as h}from"./9612.js";let u=[".zip",".tar",".tar.gz",".tgz"],d=Object.freeze([...u]);async function p(t){let e=[];try{let a=await w(t.source,{signal:t.signal,downloadTimeoutMs:t.downloadTimeoutMs});e.push(a.cleanup);let r=await v(a.localPath,{archivePath:void 0,isInstallablePath:t.isInstallablePath,installableLabel:t.installableLabel,allowArchiveExtraction:!1!==t.allowArchiveExtraction,registerCleanup:t=>{e.push(t)}});return{archivePath:r.archivePath,installablePath:r.installablePath,cleanup:async()=>{await g(e)}}}catch(t){throw await g(e),t}}async function w(t,e){if("path"===t.kind)return{localPath:h(t.path),cleanup:async()=>{}};let a=await r.mkdtemp(i.join(o.tmpdir(),"agent-device-source-"));try{return{localPath:await f(a,t.url,t.headers,e),cleanup:async()=>{await r.rm(a,{recursive:!0,force:!0})}}}catch(t){throw await r.rm(a,{recursive:!0,force:!0}),t}}async function f(t,e,r,o){let c;try{c=new URL(e)}catch{throw new l("INVALID_ARGS",`Invalid source URL: ${e}`)}await m(c);let h=o?.signal;if(h?.aborted)throw new l("COMMAND_FAILED","request canceled",{reason:"request_canceled"});let u=o?.downloadTimeoutMs??12e4,d=AbortSignal.timeout(u),p=h?AbortSignal.any([h,d]):d;try{let e=await fetch(c,{headers:r,redirect:"follow",signal:p});if(!e.ok)throw new l("COMMAND_FAILED",`Failed to download app source: ${e.status} ${e.statusText}`,{status:e.status,statusText:e.statusText,url:c.toString()});let o=function(t,e){let a=t.headers.get("content-disposition"),r=a?.match(/filename\*?=(?:UTF-8'')?"?([^";]+)"?/i),o=r?.[1]?.trim();if(o)return i.basename(o);let n=i.basename(e.pathname);return n||"downloaded-artifact.bin"}(e,c),h=i.join(t,o),u=e.body;if(!u)throw new l("COMMAND_FAILED","Download response body was empty",{url:c.toString()});return await s(n.fromWeb(u),a(h)),h}catch(t){if(h?.aborted)throw new l("COMMAND_FAILED","request canceled",{reason:"request_canceled"},t);if(d.aborted)throw new l("COMMAND_FAILED",`App source download timed out after ${u}ms`,{timeoutMs:u,url:c.toString()},t);throw t}}async function m(e){if("http:"!==e.protocol&&"https:"!==e.protocol)throw new l("INVALID_ARGS",`Unsupported source URL protocol: ${e.protocol}`);if(A(e.hostname.toLowerCase()))throw new l("INVALID_ARGS",`Source URL host is not allowed: ${e.hostname}`,{hint:"Use a public artifact URL."});if((await t.lookup(e.hostname,{all:!0,verbatim:!0}).catch(()=>[])).some(t=>L(t.address)))throw new l("INVALID_ARGS",`Source URL host resolved to a private or loopback address: ${e.hostname}`,{hint:"Use a public artifact URL."})}function b(t){var e,a,r,o;let i=t instanceof URL?t:new URL(t),n=i.hostname.toLowerCase();if(!n)return!1;let s=i.pathname;return e=n,a=s,("api.github.com"===e?/^\/repos\/[^/]+\/[^/]+\/actions\/artifacts\/\d+\/zip$/i.test(a):"github.com"===e&&/^\/[^/]+\/[^/]+\/(?:actions\/runs\/\d+\/artifacts\/\d+|suites\/\d+\/artifacts\/\d+)$/i.test(a))||(r=n,o=s,("expo.dev"===r||!!r.endsWith(".expo.dev"))&&/^\/(?:artifacts\/eas\/|accounts\/[^/]+\/projects\/[^/]+\/builds\/)/i.test(o))}function A(t){return!!(!t||"localhost"===t||t.endsWith(".localhost"))||L(t)}function L(t){let a,r=e.isIP(t);return 4===r?function(t){let e=t.split(".").map(t=>Number.parseInt(t,10));if(4!==e.length||e.some(t=>Number.isNaN(t)||t<0||t>255))return!1;let a=e[0],r=e[1];return void 0!==a&&void 0!==r&&(10===a||127===a||169===a&&254===r||172===a&&!!(r>=16)&&!!(r<=31)||192===a&&168===r)}(t):6===r&&!!("::1"===(a=t.toLowerCase())||a.startsWith("fc")||a.startsWith("fd")||a.startsWith("fe80:"))}async function v(t,e){let a=await r.stat(t).catch(()=>null);if(!a)throw new l("INVALID_ARGS",`App source not found: ${t}`);if(e.isInstallablePath(t,a))return{archivePath:e.archivePath,installablePath:t};if(a.isFile()&&S(t)){if(!e.allowArchiveExtraction)throw new l("INVALID_ARGS",`URL sources must point directly to a ${e.installableLabel}; archive extraction is not allowed`,{path:t});let a=await _(t);return e.registerCleanup(a.cleanup),await v(a.outputPath,{...e,archivePath:e.archivePath??t})}if(a.isDirectory()){let a=await I(t,e.isInstallablePath),r=a[0];if(void 0!==r&&1===a.length)return{archivePath:e.archivePath,installablePath:r};if(a.length>1)throw new l("INVALID_ARGS",`Found multiple ${e.installableLabel} candidates under ${t}`,{matches:a});let o=await I(t,(t,e)=>e.isFile()&&S(t)),i=o[0];if(void 0!==i&&1===o.length){if(!e.allowArchiveExtraction)throw new l("INVALID_ARGS",`URL sources must point directly to a ${e.installableLabel}; nested archives are not allowed`,{path:i});let t=await _(i);return e.registerCleanup(t.cleanup),await v(t.outputPath,{...e,archivePath:e.archivePath??i})}if(o.length>1)throw new l("INVALID_ARGS",`Found multiple nested archives under ${t}; expected one ${e.installableLabel} source`,{matches:o})}throw new l("INVALID_ARGS",`Expected ${e.installableLabel} source, but got ${t}`)}async function I(t,e){let a=[],o=[{path:t,depth:0}];for(;o.length>0;){let t=o.shift();if(!t)continue;let n=await r.readdir(t.path,{withFileTypes:!0});for(let r of(n.sort((t,e)=>t.name.localeCompare(e.name)),n)){let n=i.join(t.path,r.name);if(e(n,r)){a.push(n);continue}r.isDirectory()&&t.depth<5&&o.push({path:n,depth:t.depth+1})}}return a}async function _(t){let e=await r.mkdtemp(i.join(o.tmpdir(),"agent-device-archive-"));try{return t.toLowerCase().endsWith(".zip")?await P(t,e):t.toLowerCase().endsWith(".tar.gz")||t.toLowerCase().endsWith(".tgz")?await c("tar",["-xzf",t,"-C",e]):await c("tar",["-xf",t,"-C",e]),{outputPath:e,cleanup:async()=>{await r.rm(e,{recursive:!0,force:!0})}}}catch(t){throw await r.rm(e,{recursive:!0,force:!0}),t}}async function P(t,e){await c("unzip",["-q",t,"-d",e])}function S(t){let e=t.toLowerCase();return u.some(t=>e.endsWith(t))}async function g(t){for(let e of[...t].reverse())await e()}export{d as ARCHIVE_EXTENSIONS,L as isBlockedIpAddress,A as isBlockedSourceHostname,b as isTrustedInstallSourceUrl,p as materializeInstallablePath,m as validateDownloadSourceUrl};
1
+ import t from"node:dns/promises";import e from"node:net";import{createWriteStream as a,promises as r}from"node:fs";import o from"node:os";import i from"node:path";import{Readable as n}from"node:stream";import{pipeline as s}from"node:stream/promises";import{AppError as l}from"./485.js";import{runCmd as c}from"./8875.js";import{expandUserHomePath as h}from"./9612.js";let u=[".zip",".tar",".tar.gz",".tgz"];async function d(t){let e=[];try{let a=await p(t.source,{signal:t.signal,downloadTimeoutMs:t.downloadTimeoutMs});e.push(a.cleanup);let r=await A(a.localPath,{archivePath:void 0,isInstallablePath:t.isInstallablePath,installableLabel:t.installableLabel,allowArchiveExtraction:!1!==t.allowArchiveExtraction,registerCleanup:t=>{e.push(t)}});return{archivePath:r.archivePath,installablePath:r.installablePath,cleanup:async()=>{await P(e)}}}catch(t){throw await P(e),t}}async function p(t,e){if("path"===t.kind)return{localPath:h(t.path),cleanup:async()=>{}};let a=await r.mkdtemp(i.join(o.tmpdir(),"agent-device-source-"));try{return{localPath:await w(a,t.url,t.headers,e),cleanup:async()=>{await r.rm(a,{recursive:!0,force:!0})}}}catch(t){throw await r.rm(a,{recursive:!0,force:!0}),t}}async function w(t,e,r,o){let c;try{c=new URL(e)}catch{throw new l("INVALID_ARGS",`Invalid source URL: ${e}`)}await f(c);let h=o?.signal;if(h?.aborted)throw new l("COMMAND_FAILED","request canceled",{reason:"request_canceled"});let u=o?.downloadTimeoutMs??12e4,d=AbortSignal.timeout(u),p=h?AbortSignal.any([h,d]):d;try{let e=await fetch(c,{headers:r,redirect:"follow",signal:p});if(!e.ok)throw new l("COMMAND_FAILED",`Failed to download app source: ${e.status} ${e.statusText}`,{status:e.status,statusText:e.statusText,url:c.toString()});let o=function(t,e){let a=t.headers.get("content-disposition"),r=a?.match(/filename\*?=(?:UTF-8'')?"?([^";]+)"?/i),o=r?.[1]?.trim();if(o)return i.basename(o);let n=i.basename(e.pathname);return n||"downloaded-artifact.bin"}(e,c),h=i.join(t,o),u=e.body;if(!u)throw new l("COMMAND_FAILED","Download response body was empty",{url:c.toString()});return await s(n.fromWeb(u),a(h)),h}catch(t){if(h?.aborted)throw new l("COMMAND_FAILED","request canceled",{reason:"request_canceled"},t);if(d.aborted)throw new l("COMMAND_FAILED",`App source download timed out after ${u}ms`,{timeoutMs:u,url:c.toString()},t);throw t}}async function f(e){var a;if("http:"!==e.protocol&&"https:"!==e.protocol)throw new l("INVALID_ARGS",`Unsupported source URL protocol: ${e.protocol}`);if(!(a=e.hostname.toLowerCase())||"localhost"===a||a.endsWith(".localhost")||b(a))throw new l("INVALID_ARGS",`Source URL host is not allowed: ${e.hostname}`,{hint:"Use a public artifact URL."});if((await t.lookup(e.hostname,{all:!0,verbatim:!0}).catch(()=>[])).some(t=>b(t.address)))throw new l("INVALID_ARGS",`Source URL host resolved to a private or loopback address: ${e.hostname}`,{hint:"Use a public artifact URL."})}function m(t){var e,a,r,o;let i=t instanceof URL?t:new URL(t),n=i.hostname.toLowerCase();if(!n)return!1;let s=i.pathname;return e=n,a=s,("api.github.com"===e?/^\/repos\/[^/]+\/[^/]+\/actions\/artifacts\/\d+\/zip$/i.test(a):"github.com"===e&&/^\/[^/]+\/[^/]+\/(?:actions\/runs\/\d+\/artifacts\/\d+|suites\/\d+\/artifacts\/\d+)$/i.test(a))||(r=n,o=s,("expo.dev"===r||!!r.endsWith(".expo.dev"))&&/^\/(?:artifacts\/eas\/|accounts\/[^/]+\/projects\/[^/]+\/builds\/)/i.test(o))}function b(t){let a,r=e.isIP(t);return 4===r?function(t){let e=t.split(".").map(t=>Number.parseInt(t,10));if(4!==e.length||e.some(t=>Number.isNaN(t)||t<0||t>255))return!1;let a=e[0],r=e[1];return void 0!==a&&void 0!==r&&(10===a||127===a||169===a&&254===r||172===a&&!!(r>=16)&&!!(r<=31)||192===a&&168===r)}(t):6===r&&!!("::1"===(a=t.toLowerCase())||a.startsWith("fc")||a.startsWith("fd")||a.startsWith("fe80:"))}async function A(t,e){let a=await r.stat(t).catch(()=>null);if(!a)throw new l("INVALID_ARGS",`App source not found: ${t}`);if(e.isInstallablePath(t,a))return{archivePath:e.archivePath,installablePath:t};if(a.isFile()&&_(t)){if(!e.allowArchiveExtraction)throw new l("INVALID_ARGS",`URL sources must point directly to a ${e.installableLabel}; archive extraction is not allowed`,{path:t});let a=await L(t);return e.registerCleanup(a.cleanup),await A(a.outputPath,{...e,archivePath:e.archivePath??t})}if(a.isDirectory()){let a=await v(t,e.isInstallablePath),r=a[0];if(void 0!==r&&1===a.length)return{archivePath:e.archivePath,installablePath:r};if(a.length>1)throw new l("INVALID_ARGS",`Found multiple ${e.installableLabel} candidates under ${t}`,{matches:a});let o=await v(t,(t,e)=>e.isFile()&&_(t)),i=o[0];if(void 0!==i&&1===o.length){if(!e.allowArchiveExtraction)throw new l("INVALID_ARGS",`URL sources must point directly to a ${e.installableLabel}; nested archives are not allowed`,{path:i});let t=await L(i);return e.registerCleanup(t.cleanup),await A(t.outputPath,{...e,archivePath:e.archivePath??i})}if(o.length>1)throw new l("INVALID_ARGS",`Found multiple nested archives under ${t}; expected one ${e.installableLabel} source`,{matches:o})}throw new l("INVALID_ARGS",`Expected ${e.installableLabel} source, but got ${t}`)}async function v(t,e){let a=[],o=[{path:t,depth:0}];for(;o.length>0;){let t=o.shift();if(!t)continue;let n=await r.readdir(t.path,{withFileTypes:!0});for(let r of(n.sort((t,e)=>t.name.localeCompare(e.name)),n)){let n=i.join(t.path,r.name);if(e(n,r)){a.push(n);continue}r.isDirectory()&&t.depth<5&&o.push({path:n,depth:t.depth+1})}}return a}async function L(t){let e=await r.mkdtemp(i.join(o.tmpdir(),"agent-device-archive-"));try{return t.toLowerCase().endsWith(".zip")?await I(t,e):t.toLowerCase().endsWith(".tar.gz")||t.toLowerCase().endsWith(".tgz")?await c("tar",["-xzf",t,"-C",e]):await c("tar",["-xf",t,"-C",e]),{outputPath:e,cleanup:async()=>{await r.rm(e,{recursive:!0,force:!0})}}}catch(t){throw await r.rm(e,{recursive:!0,force:!0}),t}}async function I(t,e){await c("unzip",["-q",t,"-d",e])}function _(t){let e=t.toLowerCase();return u.some(t=>e.endsWith(t))}async function P(t){for(let e of[...t].reverse())await e()}Object.freeze([...u]);export{m as isTrustedInstallSourceUrl,d as materializeInstallablePath,f as validateDownloadSourceUrl};
package/dist/src/587.js CHANGED
@@ -1 +1 @@
1
- import{AppError as e}from"./733.js";let t=new Set(["id","role","text","label","value","appname","windowtitle"]),n=new Set(["visible","hidden","editable","selected","enabled","hittable"]),r=new Set([...t,...n]),i=new Map([['"','"'],["'","'"],["\\","\\"],["/","/"],["b","\b"],["f","\f"],["n","\n"],["r","\r"],["t"," "]]);function l(t){let n=t.trim();if(!n)throw new e("INVALID_ARGS","Selector expression cannot be empty");let r=function(t){let n=[],r="",i=null;for(let l=0;l<t.length;l+=1){let o=t[l];if(('"'===o||"'"===o)&&!h(t,l)){i=a(i,o),r+=o;continue}if(!i&&"|"===o&&"|"===t[l+1]){let i=r.trim();if(!i)throw new e("INVALID_ARGS",`Invalid selector fallback expression: ${t}`);n.push(i),r="",l+=1;continue}r+=o}let l=r.trim();if(!l)throw new e("INVALID_ARGS",`Invalid selector fallback expression: ${t}`);return n.push(l),n}(n);if(0===r.length)throw new e("INVALID_ARGS","Selector expression cannot be empty");return{raw:n,selectors:r.map(t=>(function(t){let n=t.trim();if(!n)throw new e("INVALID_ARGS","Selector segment cannot be empty");let r=function(t){let n=[],r="",i=null;for(let e=0;e<t.length;e+=1){let l=t.charAt(e);if(('"'===l||"'"===l)&&!h(t,e)){i=a(i,l),r+=l;continue}if(!i&&/\s/.test(l)){r.trim()&&n.push(r.trim()),r="";continue}r+=l}if(i)throw new e("INVALID_ARGS",`Unclosed quote in selector: ${t}`);return r.trim()&&n.push(r.trim()),n}(n);if(0===r.length)throw new e("INVALID_ARGS",`Invalid selector segment: ${t}`);return{raw:n,terms:r.map(c)}})(t))}}function o(e){try{return l(e)}catch{return null}}function u(e){let t=e.trim();if(!t)return!1;if("||"===t)return!0;let n=t.indexOf("=");if(-1!==n){let e=t.slice(0,n).trim().toLowerCase();return r.has(e)}return r.has(t.toLowerCase())}function s(e,t={}){if(0===e.length)return null;let n=t.preferTrailingValue??!1,r=0,i=[];for(;r<e.length;){let t=e[r];if(void 0===t||!u(t))break;r+=1;let n=e.slice(0,r).join(" ").trim();n&&o(n)&&i.push(r)}if(0===i.length)return null;let l=i.at(-1);if(void 0===l)return null;let c=l;if(n)for(let t=i.length-1;t>=0;t-=1){let n=i[t];if(void 0!==n&&n<e.length){c=n;break}}let a=e.slice(0,c).join(" ").trim();return a?{selectorExpression:a,rest:e.slice(c)}:null}function c(t){let i=t.trim();if(!i)throw new e("INVALID_ARGS","Empty selector term");let l=i.indexOf("=");if(-1===l){let r=i.toLowerCase();if(!n.has(r))throw new e("INVALID_ARGS",`Invalid selector term "${t}", expected key=value`);return{key:r,value:!0}}let o=i.slice(0,l).trim().toLowerCase(),u=i.slice(l+1).trim();if(!r.has(o))throw new e("INVALID_ARGS",`Unknown selector key: ${o}`);if(!u)throw new e("INVALID_ARGS",`Missing selector value for key: ${o}`);if(n.has(o)){let t,n="true"===(t=f(u).toLowerCase())||"false"!==t&&null;if(null===n)throw new e("INVALID_ARGS",`Invalid boolean value for ${o}: ${u}`);return{key:o,value:n}}return{key:o,value:f(u)}}function a(e,t){return e?e===t?null:e:t}function f(e){let t=e.trim();return t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'")?function(e){let t="",n=0;for(;n<e.length;){var r;let l=e.charAt(n);if("\\"!==l){t+=l,n+=1;continue}let o=e.charAt(n+1);if(!o){t+=l,n+=1;continue}let u=(r=o,i.get(r)??null);if(null!==u){t+=u,n+=2;continue}if("u"===o){let r=e.slice(n+2,n+6);if(/^[0-9a-fA-F]{4}$/.test(r)){t+=String.fromCharCode(Number.parseInt(r,16)),n+=6;continue}}t+=l,n+=1}return t}(t.slice(1,-1)):t}function h(e,t){let n=0;for(let r=t-1;r>=0&&"\\"===e[r];r-=1)n+=1;return n%2==1}let w=["any","text","label","value","role","id"],m=["text","label","value","role","id"];function p(e,t,n,r={}){let i=A(n);if(!i)return{matches:[],score:0};let l=0,o=[];for(let n of e){if(r.requireRect&&!n.rect)continue;let e=function(e,t,n){switch(t){case"role":return function(e,t){let n=I(e??"");return n?n===t?2:+!!n.includes(t):0}(e.type,n);case"label":return d(e.label,n);case"value":return d(e.value,n);case"id":return d(e.identifier,n);default:return Math.max(d(e.label,n),d(e.value,n),d(e.identifier,n))}}(n,t,i);if(!(e<=0)){if(e>l){l=e,o.length=0,o.push(n);continue}e===l&&o.push(n)}}return{matches:o,score:l}}function d(e,t){let n=A(e??"");return n?n===t?2:+!!n.includes(t):0}function A(e){return e.trim().toLowerCase().replace(/\s+/g," ")}function I(e){let t=e.trim();return t?t=(t.split(".").pop()??t).replace(/XCUIElementType/gi,"").toLowerCase():""}function S(t){let n="any",r=0;m.includes(t[0])&&(n=t[0],r=1);let i=t[r]??"",l=t.slice(r+1);if(0===l.length)return{locator:n,query:i,action:"click"};let o=l[0]?.toLowerCase();if("get"===o){let t=l[1]?.toLowerCase();if("text"===t)return{locator:n,query:i,action:"get_text"};if("attrs"===t)return{locator:n,query:i,action:"get_attrs"};throw new e("INVALID_ARGS","find get only supports text or attrs")}if("wait"===o)return{locator:n,query:i,action:"wait",timeoutMs:function(e){if(!e)return null;let t=Number(e);return Number.isFinite(t)?t:null}(l[1])??void 0};if("exists"===o)return{locator:n,query:i,action:"exists"};if("click"===o)return{locator:n,query:i,action:"click"};if("focus"===o)return{locator:n,query:i,action:"focus"};if("fill"===o)return{locator:n,query:i,action:"fill",value:l.slice(1).join(" ")};if("type"===o)return{locator:n,query:i,action:"type",value:l.slice(1).join(" ")};throw new e("INVALID_ARGS",`Unsupported find action: ${l[0]}`)}function g(e,t){return"any"===e&&(t.includes("=")||t.includes("||"))?o(t):null}export{w as FIND_LOCATORS,p as findBestMatchesByLocator,u as isSelectorToken,I as normalizeRole,A as normalizeText,S as parseFindArgs,g as parseFindSelectorExpression,l as parseSelectorChain,s as splitSelectorFromArgs,o as tryParseSelectorChain};
1
+ import{AppError as e}from"./485.js";let t=new Set(["id","role","text","label","value","appname","windowtitle"]),n=new Set(["visible","hidden","editable","selected","enabled","hittable"]),r=new Set([...t,...n]),i=new Map([['"','"'],["'","'"],["\\","\\"],["/","/"],["b","\b"],["f","\f"],["n","\n"],["r","\r"],["t"," "]]);function l(t){let n=t.trim();if(!n)throw new e("INVALID_ARGS","Selector expression cannot be empty");let r=function(t){let n=[],r="",i=null;for(let l=0;l<t.length;l+=1){let o=t[l];if(('"'===o||"'"===o)&&!h(t,l)){i=a(i,o),r+=o;continue}if(!i&&"|"===o&&"|"===t[l+1]){let i=r.trim();if(!i)throw new e("INVALID_ARGS",`Invalid selector fallback expression: ${t}`);n.push(i),r="",l+=1;continue}r+=o}let l=r.trim();if(!l)throw new e("INVALID_ARGS",`Invalid selector fallback expression: ${t}`);return n.push(l),n}(n);if(0===r.length)throw new e("INVALID_ARGS","Selector expression cannot be empty");return{raw:n,selectors:r.map(t=>(function(t){let n=t.trim();if(!n)throw new e("INVALID_ARGS","Selector segment cannot be empty");let r=function(t){let n=[],r="",i=null;for(let e=0;e<t.length;e+=1){let l=t.charAt(e);if(('"'===l||"'"===l)&&!h(t,e)){i=a(i,l),r+=l;continue}if(!i&&/\s/.test(l)){r.trim()&&n.push(r.trim()),r="";continue}r+=l}if(i)throw new e("INVALID_ARGS",`Unclosed quote in selector: ${t}`);return r.trim()&&n.push(r.trim()),n}(n);if(0===r.length)throw new e("INVALID_ARGS",`Invalid selector segment: ${t}`);return{raw:n,terms:r.map(c)}})(t))}}function o(e){try{return l(e)}catch{return null}}function u(e){let t=e.trim();if(!t)return!1;if("||"===t)return!0;let n=t.indexOf("=");if(-1!==n){let e=t.slice(0,n).trim().toLowerCase();return r.has(e)}return r.has(t.toLowerCase())}function s(e,t={}){if(0===e.length)return null;let n=t.preferTrailingValue??!1,r=0,i=[];for(;r<e.length;){let t=e[r];if(void 0===t||!u(t))break;r+=1;let n=e.slice(0,r).join(" ").trim();n&&o(n)&&i.push(r)}if(0===i.length)return null;let l=i.at(-1);if(void 0===l)return null;let c=l;if(n)for(let t=i.length-1;t>=0;t-=1){let n=i[t];if(void 0!==n&&n<e.length){c=n;break}}let a=e.slice(0,c).join(" ").trim();return a?{selectorExpression:a,rest:e.slice(c)}:null}function c(t){let i=t.trim();if(!i)throw new e("INVALID_ARGS","Empty selector term");let l=i.indexOf("=");if(-1===l){let r=i.toLowerCase();if(!n.has(r))throw new e("INVALID_ARGS",`Invalid selector term "${t}", expected key=value`);return{key:r,value:!0}}let o=i.slice(0,l).trim().toLowerCase(),u=i.slice(l+1).trim();if(!r.has(o))throw new e("INVALID_ARGS",`Unknown selector key: ${o}`);if(!u)throw new e("INVALID_ARGS",`Missing selector value for key: ${o}`);if(n.has(o)){let t,n="true"===(t=f(u).toLowerCase())||"false"!==t&&null;if(null===n)throw new e("INVALID_ARGS",`Invalid boolean value for ${o}: ${u}`);return{key:o,value:n}}return{key:o,value:f(u)}}function a(e,t){return e?e===t?null:e:t}function f(e){let t=e.trim();return t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'")?function(e){let t="",n=0;for(;n<e.length;){var r;let l=e.charAt(n);if("\\"!==l){t+=l,n+=1;continue}let o=e.charAt(n+1);if(!o){t+=l,n+=1;continue}let u=(r=o,i.get(r)??null);if(null!==u){t+=u,n+=2;continue}if("u"===o){let r=e.slice(n+2,n+6);if(/^[0-9a-fA-F]{4}$/.test(r)){t+=String.fromCharCode(Number.parseInt(r,16)),n+=6;continue}}t+=l,n+=1}return t}(t.slice(1,-1)):t}function h(e,t){let n=0;for(let r=t-1;r>=0&&"\\"===e[r];r-=1)n+=1;return n%2==1}let w=["any","text","label","value","role","id"],p=["text","label","value","role","id"];function m(e,t,n,r={}){let i=A(n);if(!i)return{matches:[],score:0};let l=0,o=[];for(let n of e){if(r.requireRect&&!n.rect)continue;let e=function(e,t,n){switch(t){case"role":return function(e,t){let n=function(e){let t=e.trim();return t?t=(t.split(".").pop()??t).replace(/XCUIElementType/gi,"").toLowerCase():""}(e??"");return n?n===t?2:+!!n.includes(t):0}(e.type,n);case"label":return d(e.label,n);case"value":return d(e.value,n);case"id":return d(e.identifier,n);default:return Math.max(d(e.label,n),d(e.value,n),d(e.identifier,n))}}(n,t,i);if(!(e<=0)){if(e>l){l=e,o.length=0,o.push(n);continue}e===l&&o.push(n)}}return{matches:o,score:l}}function d(e,t){let n=A(e??"");return n?n===t?2:+!!n.includes(t):0}function A(e){return e.trim().toLowerCase().replace(/\s+/g," ")}function I(t){let n="any",r=0;p.includes(t[0])&&(n=t[0],r=1);let i=t[r]??"",l=t.slice(r+1);if(0===l.length)return{locator:n,query:i,action:"click"};let o=l[0]?.toLowerCase();if("get"===o){let t=l[1]?.toLowerCase();if("text"===t)return{locator:n,query:i,action:"get_text"};if("attrs"===t)return{locator:n,query:i,action:"get_attrs"};throw new e("INVALID_ARGS","find get only supports text or attrs")}if("wait"===o)return{locator:n,query:i,action:"wait",timeoutMs:function(e){if(!e)return null;let t=Number(e);return Number.isFinite(t)?t:null}(l[1])??void 0};if("exists"===o)return{locator:n,query:i,action:"exists"};if("click"===o)return{locator:n,query:i,action:"click"};if("focus"===o)return{locator:n,query:i,action:"focus"};if("fill"===o)return{locator:n,query:i,action:"fill",value:l.slice(1).join(" ")};if("type"===o)return{locator:n,query:i,action:"type",value:l.slice(1).join(" ")};throw new e("INVALID_ARGS",`Unsupported find action: ${l[0]}`)}function S(e,t){return"any"===e&&(t.includes("=")||t.includes("||"))?o(t):null}export{w as FIND_LOCATORS,m as findBestMatchesByLocator,u as isSelectorToken,A as normalizeText,I as parseFindArgs,S as parseFindSelectorExpression,l as parseSelectorChain,s as splitSelectorFromArgs,o as tryParseSelectorChain};
@@ -0,0 +1,4 @@
1
+ import e from"node:crypto";import t from"node:fs";import n from"node:path";import{AppError as r}from"./485.js";import{resolveUserPath as o,expandUserHomePath as s}from"./9612.js";import{readVersion as i,findProjectRoot as a}from"./1404.js";import{parseRect as u,parsePoint as l,isRecord as f}from"./1986.js";function c(e){return new Promise((t,n)=>{let r="";e.setEncoding("utf8"),e.on("data",e=>{r+=e}),e.on("end",()=>t(r)),e.on("error",n)})}async function p(e,t,n){let o=[],s=0;for await(let i of e){let e=Buffer.isBuffer(i)?i:Buffer.from(i);if((s+=e.length)>t)throw new r("INVALID_ARGS",n);o.push(e)}return Buffer.concat(o)}function m(r,i={}){var u,l;let f,c=(u=r,l=i,(f=(u??"").trim())?o(f,{env:l.env}):function(r={}){var o;let i,u,l,f=n.join(s("~",{env:r.env}),".agent-device"),c=r.projectRoot??a();return(o=c,t.existsSync(n.join(o,"package.json"))&&t.existsSync(n.join(o,"src","daemon.ts")))?n.join(f,"dev",(i=function(e){try{return t.realpathSync.native(e)}catch{return n.resolve(e)}}(c),u=n.basename(i).replaceAll(/[^a-zA-Z0-9._-]+/g,"-"),l=e.createHash("sha1").update(i).digest("hex").slice(0,12),`${u||"agent-device"}-${l}`)):f}(l));return{baseDir:c,infoPath:n.join(c,"daemon.json"),lockPath:n.join(c,"daemon.lock"),logPath:n.join(c,"daemon.log"),sessionsDir:n.join(c,"sessions")}}function d(e){let t=(e??"").trim().toLowerCase();return"http"===t?"http":"dual"===t?"dual":"socket"}function h(e){let t=(e??"").trim().toLowerCase();return"auto"===t?"auto":"socket"===t?"socket":"http"===t?"http":"auto"}function g(e){return"tenant"===(e??"").trim().toLowerCase()?"tenant":"none"}function M(e){if(!e)return;let t=e.trim();if(t&&/^[a-zA-Z0-9._-]{1,128}$/.test(t))return t}let v=/(?:^|[^\w$.])(?:import|export)\s+(?:type\s+)?(?:[^'"`]*?\s+from\s+)?['"]([^'"]+)['"]/gm,y=/import\(\s*['"]([^'"]+)['"]\s*\)/gm,S=[".ts",".tsx",".js",".jsx",".mjs",".cjs"];function _(){let e=process.argv[1];return e?j(e):"unknown"}function j(r,o=a()){try{let s=n.resolve(o),i=[n.resolve(r)],a=new Set,u=[];for(;i.length>0;){let e=i.pop();if(!e||a.has(e))continue;a.add(e);let r=t.statSync(e);if(!r.isFile())continue;let o=n.relative(s,e)||e;u.push(`${o}:${r.size}:${Math.trunc(r.mtimeMs)}`);let l=t.readFileSync(e,"utf8");for(let t of function(e){let t=new Set;return x(e,v,t),x(e,y,t),[...t]}(l)){let r=function(e,t){let r=n.resolve(n.dirname(e),t),o=b(r);if(o)return o;for(let e of S){let t=b(`${r}${e}`);if(t)return t}for(let e of S){let t=b(n.join(r,`index${e}`));if(t)return t}return null}(e,t);r&&i.push(r)}}let l=u.sort().join("|"),f=e.createHash("sha1").update(l).digest("hex");return`graph:${u.length}:${f}`}catch{return"unknown"}}function x(e,t,n){t.lastIndex=0;let r=null;for(;null!==(r=t.exec(e));){let e=r[1]?.trim();e?.startsWith(".")&&n.add(e)}}function b(e){try{return t.statSync(e).isFile()?e:null}catch{return null}}let w=/^[A-Za-z0-9_@%+=:,./-]+$/;function $(e){return`'${e.replaceAll("'","'\\''")}'`}function D(e){return w.test(e)?e:$(e)}function P(e,t){let n=[],r=e+t.toString(),o=r.indexOf("\n");for(;-1!==o;){let e=r.slice(0,o).trim();r=r.slice(o+1),e&&n.push(e),o=r.indexOf("\n")}return{lines:n,buffer:r}}function k(e){return e.meta?.requestProgress==="replay-test"||e.meta?.requestProgress==="command"}function R(e){return!!e&&"object"==typeof e&&"progress"===e.type&&!!e.event}function A(e){return!!e&&"object"==typeof e&&"response"===e.type&&!!e.response}function C(e){return`${JSON.stringify({type:"progress",event:e})}
2
+ `}function z(e){return`${JSON.stringify({type:"response",response:e})}
3
+ `}function E(e){return`${JSON.stringify({type:"response",response:e})}
4
+ `}function N(e,t={}){return{ok:!0,service:e,version:i(),rpcProtocolVersion:1,...void 0!==t.upstream?{upstream:t.upstream}:{}}}function H(e){if(!f(e))return;let t="string"==typeof e.path?e.path:void 0,n=Array.isArray(e.overlayRefs)?e.overlayRefs.filter(O).flatMap(e=>{let t=function(e){if("string"!=typeof e.ref||0===e.ref.length)return;let t=function(e){let t=u(e.rect);if(!t)return;let n=u(e.overlayRect);if(!n)return;let r=l(e.center);return r?{rect:t,overlayRect:n,center:r}:void 0}(e);if(t){var n;return{ref:e.ref,..."string"==typeof(n=e).label&&n.label.length>0?{label:n.label}:{},...t}}}(e);return t?[t]:[]}):void 0;return{...t?{path:t}:{},...n?{overlayRefs:n}:{}}}function O(e){return f(e)}function K(e,t){e&&(e.snapshotDiagnostics??={samples:[]}).samples.push({...t,durationMs:Math.max(0,Math.round(t.durationMs))})}function T(e){let t=e?.snapshotDiagnostics?.samples;if(t&&0!==t.length)return B(t)}function B(e){if(0===e.length)return;let t=q(e);return{stats:t,...t.p95Ms>=1500?{warning:F(t)}:{}}}function I(e){let t=e.flatMap(e=>(function(e){if(!e||e.count<=0)return[];let t=e.platform;return 1===e.count?[{durationMs:e.maxMs,platform:t}]:2===e.count?[{durationMs:e.p50Ms,platform:t},{durationMs:e.maxMs,platform:t}]:[...Array.from({length:e.count-3},()=>({durationMs:e.p50Ms,platform:t})),{durationMs:e.p50Ms,platform:t},{durationMs:e.p95Ms,platform:t},{durationMs:e.maxMs,platform:t}]})(e?.stats));if(0===t.length)return;let n=q(t);return{stats:n,...n.p95Ms>=1500?{warning:F(n)}:{}}}function L(e){if(!f(e))return;let t=function(e){if(!f(e))return;let t=function(e){let t={count:e.count,p50Ms:e.p50Ms,p95Ms:e.p95Ms,maxMs:e.maxMs,slowThresholdMs:e.slowThresholdMs};if(!Object.values(t).some(e=>"number"!=typeof e))return t}(e);if(t){var n;let r,o,s;return{...t,...(o="string"==typeof(n=e).platform?n.platform:void 0,s=f(n.backends)&&(r=Object.entries(n.backends).filter(e=>"number"==typeof e[1])).length>0?Object.fromEntries(r):void 0,{...o?{platform:o}:{},...s?{backends:s}:{}})}}}(e.stats);if(!t)return;let n="string"==typeof e.warning?e.warning:void 0;return{stats:t,...n?{warning:n}:{}}}function q(e){let t,n=e.map(e=>e.durationMs).sort((e,t)=>e-t);return{count:n.length,p50Ms:U(n,50),p95Ms:U(n,95),maxMs:n[n.length-1]??0,slowThresholdMs:1500,...1===new Set(t=e.map(e=>e.platform).filter(e=>!!e)).size?{platform:t[0]}:{},...function(e){let t={};for(let n of e)n.backend&&(t[n.backend]=(t[n.backend]??0)+1);return Object.keys(t).length>0?{backends:t}:{}}(e)}}function U(e,t){if(0===e.length)return 0;let n=Math.max(0,Math.ceil(t/100*e.length)-1);return e[Math.min(n,e.length-1)]??0}function F(e){let t=e.platform?`${e.platform} `:"";return`Warning: ${t}snapshots are slow in this run: p95 ${e.p95Ms}ms over ${e.count} captures. Possible causes: device load, app or dev server stuck, helper fallback, or stale daemon.`}export{N as buildDaemonHealthPayload,j as computeDaemonCodeSignature,P as consumeTextLines,R as isDaemonProgressEnvelope,A as isDaemonResponseEnvelope,I as mergeSnapshotDiagnostics,M as normalizeTenantId,p as readNodeHttpRequestBody,c as readNodeHttpResponseBody,H as readScreenshotResultData,L as readSnapshotDiagnosticsSummary,K as recordSnapshotTiming,_ as resolveDaemonCodeSignature,m as resolveDaemonPaths,d as resolveDaemonServerMode,h as resolveDaemonTransportPreference,g as resolveSessionIsolationMode,C as serializeDaemonProgressEnvelope,z as serializeDaemonResponseEnvelope,E as serializeDaemonRpcResponseEnvelope,$ as shellQuote,D as shellQuoteIfNeeded,k as shouldStreamRequestProgress,T as summarizeSnapshotDiagnostics,B as summarizeSnapshotTimingSamples};
@@ -0,0 +1 @@
1
+ import{AppError as e}from"./485.js";function t(e){return"xctest"===e||"android"===e||"macos-helper"===e||"linux-atspi"===e||"web"===e}function r(e){return void 0===e||"xctest"===e||"android"===e}function n(e){return e.map((e,t)=>({...e,ref:`e${t+1}`}))}function i(e){let t=e.trim();return t.startsWith("@")?t.slice(1)||null:t.startsWith("e")?t:null}function o(e,t){return e.find(e=>e.ref===t)??null}function a(e){return JSON.stringify({interactiveOnly:e?.interactiveOnly===!0,depth:"number"==typeof e?.depth?e.depth:null,scope:e?.scope?.trim()||null,raw:e?.raw===!0})}function l(e){if(e)return{depth:e.snapshotDepth,interactiveOnly:e.snapshotInteractiveOnly,raw:e.snapshotRaw,scope:e.snapshotScope}}function s(e){return{x:Math.round(e.x+e.width/2),y:Math.round(e.y+e.height/2)}}let d=["ios","macos","android","linux","web"],u=[...d,"apple"],c=["mobile","tv","desktop"];function m(e){return"apple"===e||"ios"===e||"macos"===e}function f(e){return"ios"===e||"android"===e}function p(e){return"ios"===e.platform&&"tv"===e.target}function v(e){return d.includes(e)}function h(e,t){return!t||("apple"===t?m(e):e===t)}function S(e,t){return t?function(e){switch(e){case"tvos":return"tvOS";case"macos":return"macOS";case"visionos":return"visionOS";default:return"iOS"}}(t):"macos"===e||"desktop"===e?"macOS":"tv"===e?"tvOS":"iOS"}function E(e){let{simulatorSetPath:t,platform:r,target:n}=e;if(t&&"macos"!==r&&"desktop"!==n)return t}function N(e){return e.map((e,t)=>({device:e,index:t})).sort((e,t)=>{var r,n;return r=e,n=t,$(r.device)-$(n.device)||Number(!0===n.device.booted)-Number(!0===r.device.booted)||r.device.name.localeCompare(n.device.name)||r.index-n.index}).map(({device:e})=>e)}async function O(t,r,n={}){let i=t.filter(e=>b(e,r));if(r.udid){let t=i.find(e=>e.id===r.udid&&m(e.platform));if(!t)throw new e("DEVICE_NOT_FOUND",`No Apple device with UDID ${r.udid}`);return t}if(r.serial){let t=i.find(e=>e.id===r.serial&&"android"===e.platform);if(!t)throw new e("DEVICE_NOT_FOUND",`No Android device with serial ${r.serial}`);return t}if(!0!==n.allowStoppedAndroidAvdPlaceholders&&(i=i.filter(e=>{var t;return!("android"===(t=e).platform&&"emulator"===t.kind&&!1===t.booted&&!/^emulator-\d+$/.test(t.id))})),r.deviceName){let t=y(r.deviceName),n=i.find(e=>y(e.name)===t);if(!n)throw new e("DEVICE_NOT_FOUND",`No device named ${r.deviceName}`);return n}_(i)&&(i=N(i));let o=i[0];if(void 0!==o&&1===i.length)return o;0===i.length&&g(r,n);let a=i.filter(e=>"device"!==e.kind),l=a.length>0?a:i,s=l.filter(e=>e.booted),d=s[0];if(d&&1===s.length&&!_(l))return d;let u=_(l)?l[0]:s[0]??l[0];return u||g(r,n),u}function b(e,t,r={}){var n,i;return h(e.platform,t.platform)&&(!t.target||(e.target??"mobile")===t.target)&&(!r.includeExplicitSelectors||(n=e,(!(i=t).udid||!!(n.id===i.udid&&m(n.platform)))&&(!i.serial||n.id===i.serial&&"android"===n.platform)&&(!i.deviceName||y(n.name)===y(i.deviceName))))}function g(t,r){var n;let i=r.simulatorSetPath;if(i&&(!(n=t.platform)||"apple"===n||"ios"===n))throw new e("DEVICE_NOT_FOUND","No devices found in the scoped simulator set",{simulatorSetPath:i,hint:`The simulator set at "${i}" appears to be empty. Create a compatible simulator first with xcrun simctl --set "${i}" create, or remove the scoped simulator set.`,selector:t});throw new e("DEVICE_NOT_FOUND","No devices found",{selector:t})}function y(e){return e.toLowerCase().replace(/_/g," ").replace(/\s+/g," ").trim()}function $(e){return"simulator"===e.kind?w(e,0,1,2,3):"device"===e.kind&&"ios"===e.platform?w(e,10,11,12,13):14}function w(e,t,r,n,i){var o;return({mobile:(o=e.name,/\bipad\b/i.test(o))?r:t,tv:n,desktop:i})[e.target??"mobile"]}function _(e){return e.length>0&&e.every(e=>m(e.platform))}let D=["summary","headers","body","all"],P=["digest","default","full"];function x(e){return void 0!==e&&"default"!==e}function R(e){return{parse:t=>e(t,"$")}}function A(e,t){throw Error(`${e}: ${t}`)}function C(e,t){return(!e||"object"!=typeof e||Array.isArray(e))&&A(t,"Expected an object"),e}function T(e,t){return"string"!=typeof e&&A(t,"Expected a string"),e}function U(e,t,r){let n=e[t];return void 0===n?void 0:T(n,`${r}.${t}`)}function k(e,t,r){let n=e[t];return void 0===n?void 0:C(n,`${r}.${t}`)}let F=R((e,t)=>{var r,n;let i,o=C(e,t);return{platform:function(e,t,r,n){let i=e[t];if(void 0!==i)return"string"==typeof i&&r.includes(i)||A(`${n}.${t}`,`Expected one of: ${r.join(", ")}`),i}(o,"platform",["ios","android"],t),metroHost:U(o,"metroHost",t),metroPort:void 0===(i=o[r="metroPort"])?void 0:(n=`${t}.${r}`,Number.isInteger(i)||A(n,"Expected an integer"),i),bundleUrl:U(o,"bundleUrl",t),launchUrl:U(o,"launchUrl",t)}}),I=R((e,t)=>{let r,n=C(e,t);return{jsonrpc:U(n,"jsonrpc",t),id:(null==(r=n.id)||"string"!=typeof r&&"number"!=typeof r&&A(`${t}.id`,"Expected a string, number, or null"),r),method:U(n,"method",t),params:n.params}}),L=R((e,t)=>{let r=C(e,t);return{token:U(r,"token",t),session:U(r,"session",t),command:U(r,"command",t),positionals:function(e,t,r){var n;let i=e[t];if(void 0!==i)return(n=`${r}.${t}`,!Array.isArray(i)&&A(n,"Expected an array"),i).map((e,n)=>T(e,`${r}.${t}[${String(n)}]`))}(r,"positionals",t),flags:k(r,"flags",t),runtime:k(r,"runtime",t),meta:k(r,"meta",t)}});export{c as DEVICE_TARGETS,D as NETWORK_INCLUDE_MODES,d as PLATFORMS,P as RESPONSE_LEVELS,n as attachRefs,a as buildSnapshotPresentationKey,s as centerOfRect,L as commandRpcParamsSchema,F as daemonRuntimeSchema,u as device_PLATFORM_SELECTORS,o as findNodeByRef,m as isApplePlatform,f as isMobilePlatform,x as isNonDefaultResponseLevel,v as isPlatform,t as isSnapshotBackend,p as isTvOsDevice,I as jsonRpcRequestSchema,b as matchesDeviceSelector,h as matchesPlatformSelector,i as normalizeRef,S as resolveApplePlatformName,E as resolveAppleSimulatorSetPathForSelector,O as resolveDevice,l as snapshotPresentationOptionsFromFlags,N as sortAppleDevicesForSelection,r as usesMobileSnapshotPresentation};
package/dist/src/6918.js CHANGED
@@ -1 +1 @@
1
- import{daemonRuntimeSchema as t}from"./4291.js";import{asAppError as e,AppError as r}from"./733.js";import{normalizeBatchCommandName as o,isRecord as a,INHERITED_PARENT_FLAG_KEYS as n,assertBatchRuntimeCommandAllowed as s,BATCH_DAEMON_STEP_KEYS as i}from"./5341.js";let l=new Set(i);async function c(t,r,o){let a=t.flags,n=a?.batchOnError??"stop";if("stop"!==n)return u("INVALID_ARGS",`Unsupported batch on-error mode: ${n}.`);let s=a?.batchMaxSteps??100;if(!Number.isInteger(s)||s<1||s>1e3)return u("INVALID_ARGS",`Invalid batch max-steps: ${String(a?.batchMaxSteps)}`);try{let e=m(a?.batchSteps,s),n=Date.now(),i=[];for(let[a,n]of e.entries()){let s=await d(t,r,n,o,a+1);if(!s.ok)return{ok:!1,error:{code:s.error.code,message:`Batch failed at step ${s.step} (${n.command}): ${s.error.message}`,hint:s.error.hint,diagnosticId:s.error.diagnosticId,logPath:s.error.logPath,details:{...s.error.details??{},step:s.step,command:n.command,positionals:n.positionals,executed:a,total:e.length,partialResults:i}}};i.push(s.result)}let l={total:e.length,executed:e.length,totalDurationMs:Date.now()-n,results:i};return{ok:!0,data:l}}catch(r){let t=e(r);return u(t.code,t.message,t.details)}}function m(e,n){if(!Array.isArray(e)||0===e.length)throw new r("INVALID_ARGS","batch requires a non-empty batchSteps array.");if(e.length>n)throw new r("INVALID_ARGS",`batch has ${e.length} steps; max allowed is ${n}.`);let i=[];for(let n=0;n<e.length;n+=1){let c=e[n];if(!a(c))throw new r("INVALID_ARGS",`Invalid batch step at index ${n}.`);let m=Object.keys(c).filter(t=>!l.has(t));if(m.length>0){let t=m.map(t=>`"${t}"`).join(", ");throw new r("INVALID_ARGS",`Batch step ${n+1} has unknown field(s): ${t}. Allowed fields: command, positionals, flags, runtime.`)}let h=o(c.command);if(!h)throw new r("INVALID_ARGS",`Batch step ${n+1} requires command.`);if(s(h,n+1),void 0!==c.positionals&&!Array.isArray(c.positionals))throw new r("INVALID_ARGS",`Batch step ${n+1} positionals must be an array.`);let p=c.positionals??[];if(p.some(t=>"string"!=typeof t))throw new r("INVALID_ARGS",`Batch step ${n+1} positionals must contain only strings.`);if(void 0!==c.flags&&!a(c.flags))throw new r("INVALID_ARGS",`Batch step ${n+1} flags must be an object.`);i.push({command:h,positionals:p,flags:c.flags??{},runtime:function(e,o){if(void 0!==e)try{return t.parse(e)}catch(t){throw new r("INVALID_ARGS",`Batch step ${o} runtime is invalid: ${t instanceof Error?t.message:String(t)}`)}}(c.runtime,n+1)})}return i}function h(t,e){let{batchSteps:r,batchOnError:o,batchMaxSteps:a,...n}=e??{};return p(t,n)}function p(t,e){let r=t??{};for(let t of n)void 0===e[t]&&void 0!==r[t]&&(e[t]=r[t]);return e}async function d(t,e,r,o,a){let n=Date.now(),s=h(t.flags,r.flags);void 0===s.session&&(s.session=e);let i=await o({token:t.token,session:e,command:r.command,positionals:r.positionals,flags:s,runtime:void 0===r.runtime?t.runtime:r.runtime,meta:t.meta}),l=Date.now()-n;return i.ok?{ok:!0,step:a,result:{step:a,command:r.command,ok:!0,data:i.data??{},durationMs:l}}:{ok:!1,step:a,error:i.error}}function u(t,e,r){return{ok:!1,error:{code:t,message:e,...r?{details:r}:{}}}}export{h as buildBatchStepFlags,p as mergeParentFlags,c as runBatch,m as validateAndNormalizeBatchSteps};
1
+ import{isNonDefaultResponseLevel as t}from"./6849.js";import{asAppError as e,AppError as o}from"./485.js";import{INHERITED_PARENT_FLAG_KEYS as r,BATCH_DAEMON_STEP_KEYS as a,parseBatchStepRuntime as n,normalizeBatchCommandName as s,assertBatchStepCount as i,assertBatchRuntimeCommandAllowed as l,isValidBatchMaxSteps as c,isRecord as m}from"./1986.js";let p=new Set(a);async function h(t,r,a){let h=t.flags,d=h?.batchOnError??"stop";if("stop"!==d)return u("INVALID_ARGS",`Unsupported batch on-error mode: ${d}.`);let g=h?.batchMaxSteps??100;if(!c(g))return u("INVALID_ARGS",`Invalid batch max-steps: ${String(h?.batchMaxSteps)}`);try{let e=function(t,e){if(!Array.isArray(t)||0===t.length)throw new o("INVALID_ARGS","batch requires a non-empty batchSteps array.");i(t.length,e);let r=[];for(let e=0;e<t.length;e+=1){let a=t[e];if(!m(a))throw new o("INVALID_ARGS",`Invalid batch step at index ${e}.`);let i=Object.keys(a).filter(t=>!p.has(t));if(i.length>0){let t=i.map(t=>`"${t}"`).join(", ");throw new o("INVALID_ARGS",`Batch step ${e+1} has unknown field(s): ${t}. Allowed fields: command, positionals, flags, runtime.`)}let c=s(a.command);if(!c)throw new o("INVALID_ARGS",`Batch step ${e+1} requires command.`);if(l(c,e+1),void 0!==a.positionals&&!Array.isArray(a.positionals))throw new o("INVALID_ARGS",`Batch step ${e+1} positionals must be an array.`);let h=a.positionals??[];if(h.some(t=>"string"!=typeof t))throw new o("INVALID_ARGS",`Batch step ${e+1} positionals must contain only strings.`);if(void 0!==a.flags&&!m(a.flags))throw new o("INVALID_ARGS",`Batch step ${e+1} flags must be an object.`);r.push({command:c,positionals:h,flags:a.flags??{},runtime:n(a.runtime,e+1)})}return r}(h?.batchSteps,g),c=Date.now(),d=[];for(let[o,n]of e.entries()){let s=await f(t,r,n,a,o+1,o===e.length-1);if(!s.ok)return{ok:!1,error:{code:s.error.code,message:`Batch failed at step ${s.step} (${n.command}): ${s.error.message}`,hint:s.error.hint,diagnosticId:s.error.diagnosticId,logPath:s.error.logPath,details:{...s.error.details??{},step:s.step,command:n.command,positionals:n.positionals,executed:o,total:e.length,partialResults:d}}};d.push(s.result)}let u={total:e.length,executed:e.length,totalDurationMs:Date.now()-c,results:d};return{ok:!0,data:u}}catch(o){let t=e(o);return u(t.code,t.message,t.details)}}function d(t,e){let o=t??{};for(let t of r)void 0===e[t]&&void 0!==o[t]&&(e[t]=o[t]);return e}async function f(e,o,r,a,n,s){var i;let l,c,m=Date.now(),p=function(t,e){let{batchSteps:o,batchOnError:r,batchMaxSteps:a,...n}=e??{};return d(t,n)}(e.flags,r.flags);void 0===p.session&&(p.session=o);let h=await a({token:e.token,session:o,command:r.command,positionals:r.positionals,flags:p,runtime:void 0===r.runtime?e.runtime:r.runtime,meta:(i=e.meta,l=i?.responseLevel,(c=t(l)?s?l:"digest":l)===l?i:{...i,responseLevel:c})}),f=Date.now()-m;return h.ok?{ok:!0,step:n,result:{step:n,command:r.command,ok:!0,data:h.data??{},durationMs:f}}:{ok:!1,step:n,error:h.error}}function u(t,e,o){return{ok:!1,error:{code:t,message:e,...o?{details:o}:{}}}}export{d as mergeParentFlags,h as runBatch};
@@ -0,0 +1 @@
1
+ import{stopMetroCompanion as o}from"./8404.js";import{resolveRuntimeTransportHints as r}from"./8936.js";function t(o){return r(o)}async function n(r){await o(r)}export{t as resolveRuntimeTransport,n as stopMetroTunnel};
@@ -0,0 +1 @@
1
+ import e from"node:fs";import t from"node:path";function n(e){let t=o(e);return t?r(t):"auto"}function r(e){let t={...e.dependencies??{},...e.devDependencies??{}};return"string"==typeof t.expo?"expo":"string"==typeof t["react-native"]?"react-native":"auto"}function o(n){if(!n)return;let r=t.join(n,"package.json");try{return JSON.parse(e.readFileSync(r,"utf8"))}catch{return}}export{n as detectProjectRuntimeKind,r as detectProjectRuntimeKindFromPackageJson,o as readProjectPackageJson};
@@ -0,0 +1 @@
1
+ import e from"node:crypto";import t,{promises as n}from"node:fs";import a from"node:path";import{Worker as r}from"node:worker_threads";import{fileURLToPath as i}from"node:url";import{intersectArea as s,isSparseSnapshotQualityVerdict as o,clamp as l,isNodeVisibleInEffectiveViewport as d,publicSnapshotCaptureAnnotations as u,now as c,sleep as p,scrollCommand as h,longPressCommand as f,appendScreenshotScriptFlags as m,focusCommand as w,recordingQualityInputToExportQuality as g,displayLabel as b,squaredDistance as y,buildMobileSnapshotPresentation as k,renderSnapshotQualityWarnings as v,buildSnapshotDisplayLines as x,rectCenter as A,formatRole as M,toBackendResult as I,successText as R,normalizedRect as P,swipeCommand as N,expandRect as S,resolveInteractionTarget as O,unionRects as _,toBackendContext as D,snapshotCaptureAnnotationsFrom as E,requireIntInRange as T,formatReactNativeOverlayWarning as C,pinchCommand as U,formatSnapshotLine as L}from"./2948.js";import{emitDiagnostic as $}from"./432.js";import{asAppError as B,toAppErrorCode as q,AppError as G}from"./485.js";import{computeScreenshotDiffPixels as X,PNG as Y,toBuffer as F,decodePng as K}from"./4418.js";import{whichCmd as V,runCmd as z}from"./8875.js";import{normalizeRef as j,findNodeByRef as H,buildSnapshotPresentationKey as W,usesMobileSnapshotPresentation as J}from"./6849.js";import{findSelectorChainMatch as Z,extractNodeText as Q,findSnapshotAncestor as ee,buildSelectorChainForNode as et,resolveSelectorChain as en,findNodeByLabel as ea,resolveRefLabel as er,isNodeVisible as ei,extractReadableText as es,buildSnapshotNodeByIndex as eo,formatSelectorFailure as el,normalizeType as ed,isNodeEditable as eu,isFillableType as ec}from"./893.js";import{parseFindSelectorExpression as ep,findBestMatchesByLocator as eh,parseSelectorChain as ef}from"./587.js";import{resolveAppsFilter as em,assertResolvedAppsFilter as ew}from"./2748.js";let eg=/^-?\d+(\.\d+)?$/,eb=/^[^\s"\\]+$/,ey=new Map([["--count","count"],["--interval-ms","intervalMs"],["--hold-ms","holdMs"],["--jitter-px","jitterPx"]]),ek=new Map([["--count","count"],["--pause-ms","pauseMs"]]),ev=new Map([["--delay-ms","delayMs"]]);function ex(e){return"click"===e||"press"===e}function eA(e){return ex(e)||"longpress"===e}function eM(e){return"type"===e||"fill"===e}function eI(e){return eP(e,eN)}function eR(e){return JSON.stringify(e)}function eP(e,t){return t(e)?e:eR(e)}function eN(e){return eS(e)&&e.startsWith("@")||eg.test(e)}function eS(e){return eb.test(e)}function eO(e){let t=(e.positionals??[]).map(e=>eI(e));return[e.command,...t].join(" ")}function e_(e,t){let n=t.flags??{};if(ex(t.command)){"number"==typeof n.count&&e.push("--count",String(n.count)),"number"==typeof n.intervalMs&&e.push("--interval-ms",String(n.intervalMs)),"number"==typeof n.holdMs&&e.push("--hold-ms",String(n.holdMs)),"number"==typeof n.jitterPx&&e.push("--jitter-px",String(n.jitterPx)),!0===n.doubleTap&&e.push("--double-tap");let t=n.clickButton;t&&"primary"!==t&&e.push("--button",t);return}if("swipe"===t.command){"number"==typeof n.count&&e.push("--count",String(n.count)),"number"==typeof n.pauseMs&&e.push("--pause-ms",String(n.pauseMs)),("one-way"===n.pattern||"ping-pong"===n.pattern)&&e.push("--pattern",n.pattern);return}eM(t.command)&&"number"==typeof n.delayMs&&e.push("--delay-ms",String(n.delayMs))}function eD(e,t){t&&(("ios"===t.platform||"android"===t.platform)&&e.push("--platform",t.platform),"string"==typeof t.metroHost&&t.metroHost.length>0&&e.push("--metro-host",eP(t.metroHost,eS)),"number"==typeof t.metroPort&&e.push("--metro-port",String(t.metroPort)),"string"==typeof t.bundleUrl&&t.bundleUrl.length>0&&e.push("--bundle-url",eP(t.bundleUrl,eS)),"string"==typeof t.launchUrl&&t.launchUrl.length>0&&e.push("--launch-url",eP(t.launchUrl,eS)))}function eE(e,t){let n=[],a={},r=ex(e)?ey:"swipe"===e?ek:eM(e)?ev:void 0;for(let i=0;i<t.length;i+=1){let s=t[i];if(ex(e)&&"--double-tap"===s){a.doubleTap=!0;continue}let o=t[i+1];if(ex(e)&&"--button"===s&&void 0!==o){("primary"===o||"secondary"===o||"middle"===o)&&(a.clickButton=o),i+=1;continue}let l=r?.get(s);if(l&&void 0!==o){let e=eC(o);if(null!==e){a[l]=e,i+=1;continue}}if("swipe"===e&&"--pattern"===s&&void 0!==o){("one-way"===o||"ping-pong"===o)&&(a.pattern=o),i+=1;continue}n.push(s)}return{positionals:n,flags:a}}function eT(e){let t=[],n={};for(let a=0;a<e.length;a+=1){let r=e[a],i=e[a+1];if("--platform"===r&&void 0!==i){("ios"===i||"android"===i)&&(n.platform=i),a+=1;continue}if("--metro-host"===r&&void 0!==i){n.metroHost=i,a+=1;continue}if("--metro-port"===r&&void 0!==i){let e=eC(i);null!==e&&(n.metroPort=e),a+=1;continue}if("--bundle-url"===r&&void 0!==i){n.bundleUrl=i,a+=1;continue}if("--launch-url"===r&&void 0!==i){n.launchUrl=i,a+=1;continue}t.push(r)}return{positionals:t,flags:n}}function eC(e){if(!e)return null;let t=Number(e);return!Number.isFinite(t)||t<0?null:Math.floor(t)}function eU(e){var t;let n=[],a={};for(let t of e){if("--relaunch"===t){a.relaunch=!0;continue}n.push(t)}let r=eT(n);return{positionals:r.positionals,flags:a,runtime:(t=r.flags).platform||t.metroHost||void 0!==t.metroPort||t.bundleUrl||t.launchUrl?r.flags:void 0}}function eL(e,t={}){let n=[e.command];if("snapshot"===e.command)e.flags?.snapshotInteractiveOnly&&n.push("-i"),"number"==typeof e.flags?.snapshotDepth&&n.push("-d",String(e.flags.snapshotDepth)),e.flags?.snapshotScope&&n.push("-s",eI(e.flags.snapshotScope)),e.flags?.snapshotRaw&&n.push("--raw");else if("open"===e.command){for(let t of e.positionals??[])n.push(eI(t));e.flags?.relaunch&&n.push("--relaunch"),eD(n,e.runtime)}else if("runtime"===e.command)!function(e,t,n={}){let a=t.positionals??[];for(let t of n.includeAllPositionals?a:a.slice(0,1))e.push(eP(t,eS));eD(e,t.flags)}(n,e,{includeAllPositionals:t.runtimeIncludeAllPositionals});else if("record"===e.command)!function(e,t){let[n,...a]=t.positionals??[];for(let t of(n&&e.push(eP(n,eS)),a))e.push(eI(t));"number"==typeof t.flags?.fps&&e.push("--fps",String(t.flags.fps)),"number"==typeof t.flags?.screenshotMaxSize&&e.push("--max-size",String(t.flags.screenshotMaxSize)),("number"==typeof t.flags?.quality||"string"==typeof t.flags?.quality)&&e.push("--quality",String(t.flags.quality)),t.flags?.hideTouches&&e.push("--hide-touches")}(n,e);else if("screenshot"===e.command){for(let t of e.positionals??[])n.push(eI(t));m(n,e.flags)}else{for(let t of e.positionals??[])n.push(eI(t));e_(n,e)}return n.join(" ")}function e$(t,n){let a=e.createHash("sha256").update(t).digest(),r=e.createHash("sha256").update(n).digest();return e.timingSafeEqual(a,r)}let eB={browserStack:"browserstack",awsDeviceFarm:"aws-device-farm"},eq=new Set(Object.values(eB));function eG(e){return void 0!==e&&eq.has(e)}let eX=["status","get","dismiss","enter","return"];function eY(e){return eX.includes(e)}function eF(e){let t=e?.trim().split(/\s+/,1)[0];if(!t||!t.startsWith("@")||t.length<3)return null;let n=t.slice(1);return/^[A-Za-z_-]*\d[\w-]*$/i.test(n)||/^(?:ref|node|element|el)[\w-]*$/i.test(n)?t:null}class eK extends Error{}let eV=null,ez=!1,ej=!1,eH=0,eW=new Map;function eJ(e){ez=!0,ej||(ej=!0,$({level:"warn",phase:"png_worker_unavailable",data:{reason:e}}),process.emitWarning(`PNG worker unavailable, falling back to in-process PNG processing: ${e}`))}function eZ(e){let t=eW.get(e.id);t&&(eW.delete(e.id),e1(),e.ok?t.resolve(e.result):t.reject(new G(q(e.error.code),e.error.message,e.error.details)))}function eQ(e,t){eV===e&&(eJ(t.message),eV=null,e.terminate().catch(()=>{}),e0(new eK(`PNG worker failed: ${t.message}`)))}function e0(e){let t=[...eW.values()];for(let n of(eW.clear(),t))n.reject(e)}function e1(){eV&&(eW.size>0?eV.ref():eV.unref())}function e2(){if(ez)return null;if(eV)return eV;let e=function(e,n){try{let r=i(e),s=a.extname(r)||".js";return[a.join(a.dirname(r),`${n}${s}`),a.join(a.dirname(r),"internal",`${n}${s}`)].find(e=>t.existsSync(e))??null}catch{return null}}(import.meta.url,"png-worker");if(!e)return eJ("worker entry module not found next to the current module"),null;try{let t=new r(e,{execArgv:e.endsWith(".ts")?["--experimental-strip-types"]:[]});return t.on("message",eZ),t.on("error",e=>{eQ(t,e)}),t.on("exit",e=>{eQ(t,Error(`PNG worker exited with code ${e}`))}),t.unref(),eV=t,t}catch(e){return eJ(`failed to spawn worker: ${e instanceof Error?e.message:String(e)}`),null}}async function e4(e,t){try{return await function(e){let t=e2();if(!t)return Promise.reject(new eK("PNG worker is unavailable"));let n=eH+=1;return new Promise((a,r)=>{eW.set(n,{resolve:a,reject:r}),e1();try{t.postMessage({...e,id:n})}catch(e){eW.delete(n),e1(),r(new eK(`failed to post job to PNG worker: ${e instanceof Error?e.message:String(e)}`))}})}(e)}catch(e){if(e instanceof eK)return t();throw e}}function e3(){e2()}async function e5(){let e=eV;eV=null,e0(new eK("PNG worker terminated")),e&&await e.terminate()}async function e8(e,t){let n=await e4({kind:"decode",png:e,label:t},()=>{let n=K(e,t);return{kind:"decode",width:n.width,height:n.height,data:n.data}});return new Y({width:n.width,height:n.height,data:F(n.data)})}async function e6(e){return F((await e4({kind:"encode",width:e.width,height:e.height,data:e.data},()=>({kind:"encode",png:Y.sync.write(e)}))).png)}async function e9(e){let{kind:t,...n}=await e4({kind:"diff-pixels",...e},()=>({kind:"diff-pixels",...X(e)}));return{...n,diffData:F(n.diffData)}}let e7=[0,187,255,255];function te(e,t,n,a){if(t<0||t>=e.width||n<0||n>=e.height)return;let r=(n*e.width+t)*4;e.data[r]=a[0],e.data[r+1]=a[1],e.data[r+2]=a[2],e.data[r+3]=a[3]}function tt(e,t,n){return Math.min(Math.max(e,t),n)}let tn=[{x:-1,y:-1},{x:0,y:-1},{x:1,y:-1},{x:-1,y:0},{x:1,y:0},{x:-1,y:1},{x:0,y:1},{x:1,y:1}];function ta(e){let{mask:t,width:n,height:a,hooks:r}=e,i=new Uint8Array(t.length),s=new Int32Array(t.length),o=[];for(let e=0;e<t.length;e+=1){var l,d;if(!tr(t,i,e))continue;let u=0,c=(l=s,i[d=e]=1,l[0]=d,1),p=r.create(e);for(;u<c;){let e=s[u];u+=1,r.visit(p,e),c=function(e){let{mask:t,visited:n,queue:a,width:r,height:i,pixelIndex:s}=e,o=s%r,l=Math.floor(s/r),d=e.queueEnd;for(let e of tn){var u,c,p,h;let s=o+e.x,f=l+e.y;if(u=s,c=f,p=r,h=i,!(u>=0)||!(u<p)||!(c>=0)||!(c<h))continue;let m=f*r+s;tr(t,n,m)&&(d=function(e,t,n,a){return t[a]=1,e[n]=a,n+1}(a,n,d,m))}return d}({mask:t,visited:i,queue:s,queueEnd:c,width:n,height:a,pixelIndex:e})}o.push(p)}return o}function tr(e,t,n){return 1===e[n]&&1!==t[n]}let ti={icon:90,toggle:90,chevron:75,separator:45,visual:35,background:10},ts={leading:20,trailing:20,separator:10,unknown:0,background:-30};function to(e){return"background"!==e.likelyKind}function tl(e,t){return e.width>=.25*t.width||e.height>=.06*t.height}function td(e,t){let n,a=0;for(let r of t){let t=tf(e,r.rect);t<=a||(a=t,n=r)}return n}function tu(e){let t=[];for(let n of[...e].sort((e,t)=>e.rect.y-t.rect.y)){let e=t.find(e=>{var t,a;return t=e.rect,tf(t,a=n.rect)>0||Math.abs(A(t).y-A(a).y)<=.5*Math.max(t.height,a.height)});if(!e){t.push({rect:n.rect,blocks:[n]});continue}e.blocks.push(n),e.blocks.sort((e,t)=>e.rect.x-t.rect.x),e.rect=_([e.rect,n.rect])}return t}function tc(e,t){let n,a=A(e);for(let e of t){let t=Math.sqrt(y(a,A(e.rect)));n&&t>=n.distance||(n={block:e,distance:t})}return n}function tp(e){let t=th(e);return e.differentPixels>=24&&t.width>=3&&t.height>=3}function th(e){return{x:e.minX,y:e.minY,width:e.maxX-e.minX+1,height:e.maxY-e.minY+1}}function tf(e,t){return Math.max(0,Math.min(e.y+e.height,t.y+t.height)-Math.max(e.y,t.y))}async function tm(e){if(await V("tesseract"))try{let[t,n]=await Promise.all([tg(e.baselinePath),tg(e.currentPath)]);if(0!==t.exitCode||0!==n.exitCode)return;let a=tw(t.stdout,e.width,e.height),r=tw(n.stdout,e.width,e.height),i=function(e,t){let n=new Set,a=[];for(let i of e){var r;let e=tA(i.text),s=function(e,t,n,a){let r=null,i=1/0;for(let s=0;s<n.length;s+=1){if(a.has(s))continue;let o=n[s];if(tA(o.text)!==t)continue;let l=A(e.normalizedRect),d=y(l,A(o.normalizedRect));d>=i||(r=s,i=d)}return r}(i,e,t,n);if(null===s)continue;n.add(s);let o=function(e,t){let n={x:t.rect.x-e.rect.x,y:t.rect.y-e.rect.y,width:t.rect.width-e.rect.width,height:t.rect.height-e.rect.height},a=tR(t.rect.width/e.rect.width),r=tR(t.rect.height/e.rect.height),i=Math.abs(a-1)>=.08||Math.abs(r-1)>=.12;return{text:e.text,baselineRect:e.rect,currentRect:t.rect,delta:n,confidence:Math.round(100*Math.min(e.confidence,t.confidence))/100,possibleTextMetricMismatch:i}}(i,t[s]);r=o,(Math.abs(r.delta.x)>=2||Math.abs(r.delta.y)>=2||Math.abs(r.delta.width)>=2||Math.abs(r.delta.height)>=2||r.possibleTextMetricMismatch)&&a.push(o)}return a.sort((e,t)=>tb(t)-tb(e)).slice(0,12)}(a,r),s=function(e){let t=[];for(let n of[...e].sort((e,t)=>e.currentRect.y-t.currentRect.y)){let e=t.find(e=>32>=Math.abs(n.delta.x-tM(e.map(e=>e.delta.x))));e?e.push(n):t.push([n])}return t.filter(e=>e.length>=2).map(ty).filter(e=>e.yRange.max-e.yRange.min<=60).sort((e,t)=>tk(t)-tk(e)).slice(0,4)}(i);if(0===a.length&&0===r.length)return;return{provider:"tesseract",baselineBlocks:a.length,currentBlocks:r.length,baselineBlocksRaw:a,currentBlocksRaw:r,matches:i,...s.length>0?{movementClusters:s}:{}}}catch{return}}function tw(e,t,n){let[a,...r]=e.split(/\r?\n/);if(!a)return[];let i=new Map(a.split(" ").map((e,t)=>[e,t])),s=[];for(let e of r){var o;if(!e.trim())continue;let t=e.split(" "),n=tx(t,i,"level"),a=tv(t,i,"text").trim(),r=tx(t,i,"conf");if(5!==n||(o=a,!/[\p{L}\p{N}]/u.test(o))||r<0)continue;let l=tx(t,i,"left"),d=tx(t,i,"top"),u=tx(t,i,"width"),c=tx(t,i,"height");u<=0||c<=0||s.push({key:[tv(t,i,"page_num"),tv(t,i,"block_num"),tv(t,i,"par_num"),tv(t,i,"line_num")].join(":"),text:a,confidence:r,rect:{x:l,y:d,width:u,height:c}})}let l=new Map;for(let e of s){let t=l.get(e.key);t?t.push(e):l.set(e.key,[e])}return Array.from(l.values()).flatMap(e=>(function(e){let t=[...e].sort((e,t)=>e.rect.x-t.rect.x),n=[],a=[];for(let e of t){let t=a.at(-1);if(!t){a.push(e);continue}if(e.rect.x-(t.rect.x+t.rect.width)>Math.max(48,2.5*Math.max(t.rect.height,e.rect.height))){n.push(a),a=[e];continue}a.push(e)}return a.length>0&&n.push(a),n})(e)).map(e=>(function(e,t,n){if(0===e.length)return null;let a=[...e].sort((e,t)=>e.rect.x-t.rect.x),r=_(a.map(e=>e.rect)),i=Math.round(100*tM(a.map(e=>e.confidence)))/100;return{text:a.map(e=>e.text).join(" "),confidence:i,rect:r,normalizedRect:P({x:tI(r.x/t),y:tI(r.y/n),width:tI(r.width/t),height:tI(r.height/n)})}})(e,t,n)).filter(e=>null!==e)}function tg(e){return z("tesseract",[e,"stdout","-l","eng","tsv"],{allowFailure:!0,timeoutMs:1e4})}function tb(e){return Math.abs(e.delta.x)+Math.abs(e.delta.y)+Math.abs(e.delta.width)+Math.abs(e.delta.height)+25*!!e.possibleTextMetricMismatch}function ty(e){let t=e.map(e=>e.delta.x),n=e.map(e=>e.delta.y);return{texts:e.map(e=>e.text),xRange:{min:Math.min(...t),max:Math.max(...t)},yRange:{min:Math.min(...n),max:Math.max(...n)}}}function tk(e){return 2*Math.abs((e.xRange.min+e.xRange.max)/2)+Math.abs((e.yRange.min+e.yRange.max)/2)}function tv(e,t,n){let a=t.get(n);return void 0===a?"":e[a]??""}function tx(e,t,n){let a=Number(tv(e,t,n));return Number.isFinite(a)?a:0}function tA(e){return e.trim().replace(/\s+/g," ").toLowerCase()}function tM(e){return e.reduce((e,t)=>e+t,0)/e.length}function tI(e){return Math.round(100*e*100)/100}function tR(e){return Math.round(1e3*e)/1e3}function tP(e,t,n,a){return{r:Math.round(e/a),g:Math.round(t/a),b:Math.round(n/a)}}function tN(e){return .2126*e.r+.7152*e.g+.0722*e.b}function tS(e){return`#${tO(e.r)}${tO(e.g)}${tO(e.b)}`}function tO(e){return e.toString(16).padStart(2,"0")}function t_(e){return Math.round(100*e*100)/100}let tD=255*Math.sqrt(3);async function tE(e,t,r={}){var i,o,d,u,c;let p,h,f,m;await tT(e,"Baseline image not found"),await tT(t,"Current screenshot not found");let w=r.outputPath,[g,b]=await Promise.all([n.readFile(e),n.readFile(t)]),[y,k]=await Promise.all([e8(g,"baseline screenshot"),e8(b,"current screenshot")]);tC(y.width,y.height,"baseline screenshot",r.maxPixels),tC(k.width,k.height,"current screenshot",r.maxPixels);let v=r.threshold??.1;if(y.width!==k.width||y.height!==k.height){let e=y.width*y.height;return await tU(r.outputPath),{match:!1,mismatchPercentage:100,totalPixels:e,differentPixels:e,dimensionMismatch:{expected:{width:y.width,height:y.height},actual:{width:k.width,height:k.height}}}}let x=y.width*y.height,{diffData:A,diffMask:M,differentPixels:I}=await e9({width:y.width,height:y.height,baselineData:y.data,currentData:k.data,maxColorDistance:v*tD}),R=I>0?(o=(p=function(e){let{diffMask:t,baseline:n,current:a}=e,{width:r,height:i}=n;return ta({mask:t,width:r,height:i,hooks:{create:e=>{var t,n;let a,i;return a=(t=e)%(n=r),{minX:a,minY:i=Math.floor(t/n),maxX:a,maxY:i,differentPixels:0,baselineRed:0,baselineGreen:0,baselineBlue:0,currentRed:0,currentGreen:0,currentBlue:0}},visit:(e,t)=>{var i,s,o,l,d;let u,c,p;return i=e,s=t,o=r,l=n,d=a,u=s%o,c=Math.floor(s/o),p=4*s,void(i.minX=Math.min(i.minX,u),i.minY=Math.min(i.minY,c),i.maxX=Math.max(i.maxX,u),i.maxY=Math.max(i.maxY,c),i.differentPixels+=1,i.baselineRed+=l.data[p],i.baselineGreen+=l.data[p+1],i.baselineBlue+=l.data[p+2],i.currentRed+=d.data[p],i.currentGreen+=d.data[p+1],i.currentBlue+=d.data[p+2])}}})}(i={diffMask:M,baseline:y,current:k,totalPixels:x,differentPixels:I,maxRegions:r.maxRegions})).length<=2e3?function(e){let t=[];for(let r of e.sort((e,t)=>{let n=e.minY-t.minY;return 0!==n?n:e.minX-t.minX})){var n,a;let e=t.find(e=>{var t,n,a;return t=e,n=r,a=12,t.minX-a<=n.maxX&&n.minX-a<=t.maxX&&t.minY-a<=n.maxY&&n.minY-a<=t.maxY});if(!e){t.push({...r});continue}n=e,a=r,n.minX=Math.min(n.minX,a.minX),n.minY=Math.min(n.minY,a.minY),n.maxX=Math.max(n.maxX,a.maxX),n.maxY=Math.max(n.maxY,a.maxY),n.differentPixels+=a.differentPixels,n.baselineRed+=a.baselineRed,n.baselineGreen+=a.baselineGreen,n.baselineBlue+=a.baselineBlue,n.currentRed+=a.currentRed,n.currentGreen+=a.currentGreen,n.currentBlue+=a.currentBlue}return t}(p):p,o.flatMap(e=>{var t,n,a;let r;return(t=e,n=i.baseline.width,a=i.baseline.height,r=t.maxX-t.minX+1,t.maxY-t.minY+1>=Math.max(48,Math.round(.07*a))&&r>=.35*n)?function(e,t,n){var a;let r=function(e,t){let n=[],a=null;for(let r=0;r<e.length;r+=1){if(e[r]<=t){a??=r;continue}null!==a&&(r-a>=6&&n.push([a,r-1]),a=null)}return null!==a&&e.length-a>=6&&n.push([a,e.length-1]),n}((a=function(e,t,n){let a=[];for(let r=e.minY;r<=e.maxY;r+=1){let i=0;for(let a=e.minX;a<=e.maxX;a+=1)1===t[r*n+a]&&(i+=1);a.push(i)}return a}(e,t.diffMask,t.baseline.width)).map((e,t)=>{let n=0,r=0,i=Math.max(0,t-3),s=Math.min(a.length-1,t+3);for(let e=i;e<=s;e+=1)n+=a[e],r+=1;return Math.round(n/r)}),Math.max(1,Math.round((e.maxX-e.minX+1)*.08))),i=function(e,t,n){let a=[],r=e.minY;for(let[i,s]of t){let t=e.minY+Math.round((i+s)/2);t-r+1<n||e.maxY-t<n||(a.push([r,t]),r=t+1)}return a.push([r,e.maxY]),a}(e,r,n);if(i.length<=1)return[e];let s=i.map(([n,a])=>(function(e,t,n,a){let r=null;for(let o=t;o<=n;o+=1)for(let t=e.minX;t<=e.maxX;t+=1){var i,s;let e=o*a.baseline.width+t;1===a.diffMask[e]&&function(e,t,n,a,r,i){let s=4*t;e.minX=Math.min(e.minX,n),e.minY=Math.min(e.minY,a),e.maxX=Math.max(e.maxX,n),e.maxY=Math.max(e.maxY,a),e.differentPixels+=1,e.baselineRed+=r.data[s],e.baselineGreen+=r.data[s+1],e.baselineBlue+=r.data[s+2],e.currentRed+=i.data[s],e.currentGreen+=i.data[s+1],e.currentBlue+=i.data[s+2]}(r??={minX:i=t,minY:s=o,maxX:i,maxY:s,differentPixels:0,baselineRed:0,baselineGreen:0,baselineBlue:0,currentRed:0,currentGreen:0,currentBlue:0},e,t,o,a.baseline,a.current)}return r})(e,n,a,t)).filter(e=>null!==e);return s.length>1?s:[e]}(e,i,Math.max(24,Math.round(.03*i.baseline.height))):[e]})).sort((e,t)=>{let n=t.differentPixels-e.differentPixels;if(0!==n)return n;let a=e.minY-t.minY;return 0!==a?a:e.minX-t.minX}).slice(0,Math.max(0,i.maxRegions??8)).map((e,t)=>{var n,a,r,s,o,l,d,u,c,p,h;let f,m,w,g,b,y,k,v,x,A,M,I,R,N,S,O,_;return n=e,a=t+1,r={width:i.baseline.width,height:i.baseline.height,totalPixels:i.totalPixels,differentPixels:i.differentPixels},y={x:n.minX,y:n.minY,width:n.maxX-n.minX+1,height:n.maxY-n.minY+1},k={x:Math.round(n.minX+y.width/2),y:Math.round(n.minY+y.height/2)},v=tP(n.baselineRed,n.baselineGreen,n.baselineBlue,n.differentPixels),x=tP(n.currentRed,n.currentGreen,n.currentBlue,n.differentPixels),A=y.width*y.height,M=t_(n.differentPixels/A),I=Math.round(tN(v)),R=Math.round(tN(x)),N=(s=y,o=r.width,l=r.height,s.width>=.55*o&&s.height>=.12*l?"large-area":s.width>=2.5*s.height?"horizontal-band":s.height>=2.5*s.width?"vertical-band":"compact"),S=(f=A/r.totalPixels)>=.04?"large":f>=.01?"medium":"small",O=(d=v,u=x,m=tN(d),Math.abs(w=tN(u)-m)>=12?w>0?"brighter":"darker":Math.max(Math.abs(u.r-d.r),Math.abs(u.g-d.g),Math.abs(u.b-d.b))>=12?"color-shift":"mixed"),_=(c=k,p=r.width,h=r.height,g=c.x<p/3?"left":c.x>2*p/3?"right":"center",b=c.y<h/3?"top":c.y>2*h/3?"bottom":"middle","center"===g&&"middle"===b?"center":`${b}-${g}`),{index:a,rect:y,normalizedRect:P({x:t_(y.x/r.width),y:t_(y.y/r.height),width:t_(y.width/r.width),height:t_(y.height/r.height)}),differentPixels:n.differentPixels,shareOfDiffPercentage:t_(n.differentPixels/r.differentPixels),densityPercentage:M,shape:N,size:S,location:_,averageBaselineColorHex:tS(v),averageCurrentColorHex:tS(x),baselineLuminance:I,currentLuminance:R,dominantChange:O}}):[];if(I>0&&w){let e=new Y({width:y.width,height:y.height,data:A});for(let t of R)t.rect.width<4||t.rect.height<4||function(e,t){let n=tt(t.x,0,e.width-1),a=tt(t.y,0,e.height-1),r=tt(t.x+t.width-1,0,e.width-1),i=tt(t.y+t.height-1,0,e.height-1);for(let t=0;t<2;t+=1){for(let s=n;s<=r;s+=1)te(e,s,a+t,e7),te(e,s,i-t,e7);for(let s=a;s<=i;s+=1)te(e,n+t,s,e7),te(e,r-t,s,e7)}}(e,t.rect);await n.mkdir(a.dirname(w),{recursive:!0}),await n.writeFile(w,await e6(e))}else await tU(r.outputPath);let N=I>0?await tm({baselinePath:e,currentPath:t,width:y.width,height:y.height}):void 0,O=N&&(N.matches.length>0||(N.movementClusters?.length??0)>0)?{provider:N.provider,baselineBlocks:N.baselineBlocks,currentBlocks:N.currentBlocks,matches:N.matches,...N.movementClusters?{movementClusters:N.movementClusters}:{}}:void 0,_=I>0&&N?(h=function(e){let t=[];for(let n of e.sort((e,t)=>e.minY-t.minY||e.minX-t.minX)){let e=t.find(e=>{var t,a,r;return t=e,a=n,r=10,t.minX-r<=a.maxX&&a.minX-r<=t.maxX&&t.minY-r<=a.maxY&&a.minY-r<=t.maxY});if(!e){t.push({...n});continue}e.minX=Math.min(e.minX,n.minX),e.minY=Math.min(e.minY,n.minY),e.maxX=Math.max(e.maxX,n.maxX),e.maxY=Math.max(e.maxY,n.maxY),e.differentPixels+=n.differentPixels}return t}((u=function(e,t,n,a){let r=new Uint8Array(e);if(!a)return r;for(let e of[...a.baselineBlocksRaw,...a.currentBlocksRaw])!function(e,t,n,a){let r=l(Math.floor(a.x),0,t-1),i=l(Math.floor(a.y),0,n-1),s=l(Math.ceil(a.x+a.width),0,t),o=l(Math.ceil(a.y+a.height),0,n);for(let n=i;n<o;n+=1)for(let a=r;a<s;a+=1)e[n*t+a]=0}(r,t,n,S(e.rect,8));return r}((d={diffMask:M,width:y.width,height:y.height,regions:R,ocr:N}).diffMask,d.width,d.height,d.ocr),c=d.width,ta({mask:u,width:c,height:d.height,hooks:{create:e=>{var t,n;let a,r;return a=(t=e)%(n=c),{minX:a,minY:r=Math.floor(t/n),maxX:a,maxY:r,differentPixels:0}},visit:(e,t)=>{var n,a,r;let i,s;return n=e,i=(a=t)%(r=c),s=Math.floor(a/r),void(n.minX=Math.min(n.minX,i),n.minY=Math.min(n.minY,s),n.maxX=Math.max(n.maxX,i),n.maxY=Math.max(n.maxY,s),n.differentPixels+=1)}}}))),f=tu(d.ocr?.currentBlocksRaw??[]),m=tu(d.ocr?.baselineBlocksRaw??[]),h.filter(tp).map(e=>{var t,n,a,r,i,o,l,u,c,p,h;let w,g,b,y,k,v,x,A,M,I;return t=e,n=d,a=f,r=m,y=function(e,t){let n,a=0;for(let r of t){let t=s(e,r.rect);t<=a||(a=t,n=r)}return n?.index}(b=th(t),n.regions),k=function(e,t,n){let a=td(e,t);if(a)return tc(e,a.blocks);let r=td(e,n);return r?tc(e,r.blocks):void 0}(b,a,r),v=function(e,t,n){if(e.height<=3&&e.width>=.12*n)return"separator";if(!t)return e.width>=.4*n?"background":"unknown";if(e.width>=.4*n)return"background";let a=e.x+e.width/2,r=t.x+t.width/2;return a<r-t.width/2?"leading":a>r+t.width/2?"trailing":e.width>=.35*n?"background":"unknown"}(b,k?.block.rect,n.width),x=(i=b,o=v,l=t.differentPixels,u=n,w=i.width/i.height,g=l/(i.width*i.height),"separator"===o?"separator":"background"===o?"background":"trailing"===o&&w>=1.5&&w<=3.8&&g>=.35?"toggle":"trailing"===o&&i.width<=.06*u.width&&i.height<=.04*u.height?"chevron":"leading"===o&&w>=.55&&w<=1.8?"icon":tl(i,u)?"background":"visual"),A={...y?{regionIndex:y}:{},slot:v,likelyKind:x,rect:b},{...y?{regionIndex:y}:{},slot:v,likelyKind:x,rect:b,...k?{nearestText:k.block.text.trim().replace(/^[^\p{L}\p{N}]+/u,"").replace(/^\p{L}\s+/u,"")}:{},score:(c=A,p=t.differentPixels,h=n,M=tl(c.rect,h)?-35:0,I=20*!!c.regionIndex,ti[c.likelyKind]+ts[c.slot]+I+M+Math.min(20,p/200))}}).filter(e=>e.rect.y>=.08*d.height).filter(to).sort((e,t)=>t.score-e.score).slice(0,Math.max(0,d.maxDeltas??12)).map((e,t)=>{var n;return n=e,{index:t+1,...n.regionIndex?{regionIndex:n.regionIndex}:{},slot:n.slot,likelyKind:n.likelyKind,rect:n.rect,...n.nearestText?{nearestText:n.nearestText}:{}}})):[],D=x>0?Math.round(I/x*1e4)/100:0;return{...I>0&&w?{diffPath:w}:{},...R.length>0?{regions:R}:{},...O?{ocr:O}:{},..._.length>0?{nonTextDeltas:_}:{},totalPixels:x,differentPixels:I,mismatchPercentage:D,match:0===I}}async function tT(e,t){try{await n.access(e)}catch{throw new G("INVALID_ARGS",`${t}: ${e}`)}}function tC(e,t,n,a){if(null==a||a<=0)return;let r=e*t;if(!(r<=a))throw new G("INVALID_ARGS",`${n} is ${r} pixels, which exceeds the configured maxImagePixels limit of ${a}`)}async function tU(e){if(e)try{await n.unlink(e)}catch(e){var t;if(!("object"==typeof(t=e)&&null!==t&&"code"in t&&"ENOENT"===t.code))throw e}}function tL(e){return e.width*e.height}function t$(e){return Math.round(100*e*100)/100}async function tB(e,t,n){if("path"===t.kind&&!e.policy.allowLocalInputPaths)throw new G("INVALID_ARGS",`Local ${n.field??"input"} paths are not allowed by command policy`);try{return await e.artifacts.resolveInput(t,n)}catch(e){throw B(e)}}async function tq(e,t,n){if(t?.kind==="path"&&!e.policy.allowLocalOutputPaths)throw new G("INVALID_ARGS","Local output paths are not allowed by command policy");try{return await e.artifacts.reserveOutput(t,{...n,visibility:n.visibility??"client-visible",requestedClientPath:t?.kind==="downloadableArtifact"?t.clientPath??n.requestedClientPath:n.requestedClientPath})}catch(e){throw B(e)}}async function tG(e,t){try{return await e.artifacts.createTempFile(t)}catch(e){throw B(e)}}let tX=async(e,t)=>{let n,a,r;if(!t.baseline)throw new G("INVALID_ARGS","diff screenshot requires a baseline image");let i=function(e){if(null==e||""===e)return .1;let t=Number(e);if(Number.isNaN(t)||t<0||t>1)throw new G("INVALID_ARGS","--threshold must be a number between 0 and 1");return t}(t.threshold),s=t.current??{kind:"live"};if(t.overlayRefs&&!tH(s))throw new G("INVALID_ARGS","diff screenshot <current.png> cannot use --overlay-refs because saved-image comparisons have no live accessibility refs");let o=await tB(e,t.baseline,{usage:"diff screenshot baseline",field:"baseline"}),l=[];try{let d;d=tH(s)?(a=await tY(e,t)).path:(n=await tB(e,s,{usage:"diff screenshot current",field:"current"})).path,r=t.out?await tq(e,t.out,{field:"diffPath",ext:".png"}):void 0;let u=await tE(o.path,d,{threshold:i,outputPath:r?.path,maxPixels:e.policy.maxImagePixels});tH(s)&&(u=await tF(e,t,r?.path,u,l));let c=u.diffPath?await r?.publish():void 0;return c&&l.push(c),u.diffPath||await r?.cleanup?.(),{...u,...l.length>0?{artifacts:l}:{}}}catch(e){throw await r?.cleanup?.(),e}finally{await o.cleanup?.(),await n?.cleanup?.(),await a?.cleanup?.()}};async function tY(e,t){let n=await tG(e,{prefix:"agent-device-diff-current",ext:".png"});try{await tK(e,t,n.path,tV(t))}catch(e){throw await n.cleanup(),e}return n}async function tF(e,t,n,a,r){var i,o,l,d;if(!t.overlayRefs)return a;if(a.match||a.dimensionMismatch)return n&&await tj(n),a;let u=(i=t,o=n,i.currentOverlayOut?i.currentOverlayOut:i.out?.kind==="path"?{kind:"path",path:tz(o??i.out.path)}:i.out?.kind==="downloadableArtifact"?{kind:"downloadableArtifact",...i.out.clientPath?{clientPath:tz(i.out.clientPath)}:{},...i.out.fileName?{fileName:tz(i.out.fileName)}:{}}:void 0),c=await tq(e,u,{field:"currentOverlayPath",ext:".png"});try{let n=await tK(e,t,c.path,{overlayRefs:!0,...tV(t)}),i=await c.publish();return i&&r.push(i),{...a,currentOverlayPath:n.path??c.path,...n.overlayRefs?{currentOverlayRefCount:n.overlayRefs.length}:{},...a.regions&&n.overlayRefs?{regions:(l=a.regions,d=n.overlayRefs,l.map(e=>{var t,n;let a,r=(t=e,n=d,a=tL(t.rect),n.map(e=>{let n=e.overlayRect,r=s(t.rect,n);return r<=0?null:{ref:e.ref,...e.label?{label:e.label}:{},rect:n,overlayCoveragePercentage:t$(r/tL(n)),regionCoveragePercentage:t$(r/a)}}).filter(e=>null!==e).sort((e,t)=>{let n=t.regionCoveragePercentage-e.regionCoveragePercentage;return 0!==n?n:t.overlayCoveragePercentage-e.overlayCoveragePercentage}).slice(0,3).map(e=>({ref:e.ref,...e.label?{label:e.label}:{},rect:e.rect,regionCoveragePercentage:e.regionCoveragePercentage})));return r.length>0?{...e,currentOverlayMatches:r}:e}))}:{}}}catch(e){throw await c.cleanup?.(),e}}async function tK(e,t,n,a={}){if(!e.backend.captureScreenshot)throw new G("UNSUPPORTED_OPERATION","screenshot is not supported by this backend");return await e.backend.captureScreenshot({session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata},n,a)??{}}function tV(e){return{normalizeStatusBar:e.normalizeStatusBar??!0,...e.surface?{surface:e.surface}:{}}}function tz(e){let t=a.extname(e),n=t?e.slice(0,-t.length):e;return`${n}.current-overlay${t||".png"}`}async function tj(e){try{await n.unlink(tz(e))}catch(e){var t;if(!("object"==typeof(t=e)&&null!==t&&"code"in t&&"ENOENT"===t.code))throw e}}function tH(e){return"live"===e.kind}async function tW(e,t){if(!Number.isInteger(t)||t<1)throw new G("INVALID_ARGS","Screenshot max size must be a positive integer");let a=await e8(await n.readFile(e),"screenshot"),r=Math.max(a.width,a.height);if(r<=t)return;let i=t/r,s=Math.max(1,Math.round(a.width*i)),o=Math.max(1,Math.round(a.height*i)),l=function(e,t,n){let a=new Y({width:t,height:n});for(let r=0;r<n;r+=1){let i=r*e.height/n,s=(r+1)*e.height/n;for(let n=0;n<t;n+=1){let o=n*e.width/t,l=(n+1)*e.width/t,d=0,u=0,c=0,p=0,h=0;for(let t=Math.floor(i);t<Math.ceil(s);t+=1){let n=Math.min(t+1,s)-Math.max(t,i);for(let a=Math.floor(o);a<Math.ceil(l);a+=1){let r=n*(Math.min(a+1,l)-Math.max(a,o)),i=(t*e.width+a)*4;d+=(e.data[i]??0)*r,u+=(e.data[i+1]??0)*r,c+=(e.data[i+2]??0)*r,p+=(e.data[i+3]??0)*r,h+=r}}let f=(r*a.width+n)*4;a.data[f]=Math.round(d/h),a.data[f+1]=Math.round(u/h),a.data[f+2]=Math.round(c/h),a.data[f+3]=Math.round(p/h)}}return a}(a,s,o);await n.writeFile(e,await e6(l))}let tJ=async(e,t)=>{let n;if(!e.backend.captureScreenshot)throw new G("UNSUPPORTED_OPERATION","screenshot is not supported by this backend");let a=await tq(e,t.out,{field:"path",ext:".png"});try{await e.backend.captureScreenshot({session:t.session,requestId:t.requestId,appId:t.appId,appBundleId:t.appBundleId,signal:t.signal??e.signal,metadata:t.metadata},a.path,{fullscreen:t.fullscreen,overlayRefs:t.overlayRefs,stabilize:t.stabilize,normalizeStatusBar:t.normalizeStatusBar,surface:t.surface}),void 0!==t.maxSize&&await tW(a.path,t.maxSize),n=await a.publish()}catch(e){throw await a.cleanup?.(),e}return{path:a.path,...n?{artifacts:[n]}:{},...R(`Saved screenshot: ${a.path}`)}};function tZ(e,t){let n=M(e.type??"Element"),a=b(e,n),r=!1===e.enabled?"disabled":"enabled",i=!0===e.selected?"selected":"unselected",s=!0===e.hittable?"hittable":"not-hittable";return[String(t??e.depth??0),n,a,r,i,s].join("|")}function tQ(e,t){return t.flatten?e.map(e=>({text:L(e,0,!1),comparable:tZ(e,0)})):x(e).map(e=>({text:e.text,comparable:tZ(e.node,e.depth)}))}function t0(e,t){return e.get(t)??0}function t1(e){return e.map(e=>({index:e.index,depth:e.depth,parentIndex:e.parentIndex,type:e.type,role:e.role,subrole:e.subrole,label:e.label,value:e.value,identifier:e.identifier,enabled:e.enabled,selected:e.selected,focused:e.focused,hittable:e.hittable,rect:e.rect,bundleId:e.bundleId,appName:e.appName,windowTitle:e.windowTitle,surface:e.surface,hiddenContentAbove:e.hiddenContentAbove,hiddenContentBelow:e.hiddenContentBelow,interactionBlocked:e.interactionBlocked,presentationHints:e.presentationHints}))}let t2=async(e,t)=>{var n;let a,r,i=await t3(e,t),s=function(e){var t,n,a,r,i;let{previous:s,current:o,options:l,identity:d}=e;if(!0===l.forceFull||!0===l.raw||!s||!1===s.comparisonSafe||!1===o.comparisonSafe||(t=s,n=o,a=d,t.backend&&n.backend&&t.backend!==n.backend||a?.previousAppBundleId&&a.currentAppBundleId&&a.previousAppBundleId!==a.currentAppBundleId)||!s.presentationKey||s.presentationKey!==o.presentationKey||(r=s,i=o,r.truncated!==i.truncated||JSON.stringify(t1(r.nodes))!==JSON.stringify(t1(i.nodes))))return;let u=l.scope?.trim();return{ageMs:Math.max(0,o.createdAt-s.createdAt),nodeCount:o.nodes.length,...!0===l.interactiveOnly?{interactiveOnly:!0}:{},...u?{scope:u}:{}}}({previous:i.session?.snapshot,current:i.snapshot,options:t,identity:{previousAppBundleId:i.session?.appBundleId,currentAppBundleId:i.result.appBundleId??i.session?.appBundleId}});return await e.sessions.set(t5(t.session,i)),{nodes:i.snapshot.nodes,truncated:i.snapshot.truncated??!1,visibility:function(e){let{nodes:t,backend:n,snapshotRaw:a}=e;if(a||!J(n))return{partial:!1,visibleNodeCount:t.length,totalNodeCount:t.length,reasons:[]};let r=k(t),i=new Set;return r.hiddenCount>0&&i.add("offscreen-nodes"),r.nodes.some(e=>e.hiddenContentAbove)&&i.add("scroll-hidden-above"),r.nodes.some(e=>e.hiddenContentBelow)&&i.add("scroll-hidden-below"),{partial:i.size>0,visibleNodeCount:r.nodes.length,totalNodeCount:t.length,reasons:[...i]}}({nodes:i.snapshot.nodes,backend:i.snapshot.backend,snapshotRaw:t.raw}),...u({...i.annotations,warnings:i.warnings}),...s?{unchanged:s}:{},...i.result.snapshotDiagnostics?{snapshotDiagnostics:i.result.snapshotDiagnostics}:{},...(a=(n=i).result.appName??n.session?.appName,r=n.result.appBundleId??n.session?.appBundleId,{...a||r?{appName:a??r}:{},...r?{appBundleId:r}:{}})}},t4=async(e,t)=>{let n=await t3(e,t),a=!0===t.interactiveOnly,r=n.session?.snapshot,i=t5(t.session,n);if(!r){let t=function(e,t={}){return tQ(e,t).length}(n.snapshot.nodes,{flatten:a});return await e.sessions.set(i),{mode:"snapshot",baselineInitialized:!0,summary:{additions:0,removals:0,unchanged:t},lines:[],...n.warnings.length>0?{warnings:n.warnings}:{}}}let s=function(e,t,n={}){let a=function(e,t){let n=e.length,a=t.length,r=n+a,i=new Map,s=[];i.set(1,0);for(let o=0;o<=r;o+=1){s.push(new Map(i));for(let r=-o;r<=o;r+=2){let l=r===-o||r!==o&&t0(i,r-1)<t0(i,r+1)?t0(i,r+1):t0(i,r-1)+1,d=l-r;for(;l<n&&d<a&&e[l].comparable===t[d].comparable;)l+=1,d+=1;if(i.set(r,l),l>=n&&d>=a)return function(e,t,n,a,r){let i=[],s=a,o=r;for(let a=e.length-1;a>=0;a-=1){let r=e[a],l=s-o,d=l===-a||l!==a&&t0(r,l-1)<t0(r,l+1)?l+1:l-1,u=t0(r,d),c=u-d;for(;s>u&&o>c;)i.push({kind:"unchanged",text:n[o-1].text}),s-=1,o-=1;if(0===a)break;s===u?(i.push({kind:"added",text:n[c].text}),o=c):(i.push({kind:"removed",text:t[u].text}),s=u)}return i.reverse(),i}(s,e,t,n,a)}}return[]}(tQ(e,n),tQ(t,n)),r={additions:0,removals:0,unchanged:0};for(let e of a)"added"===e.kind&&(r.additions+=1),"removed"===e.kind&&(r.removals+=1),"unchanged"===e.kind&&(r.unchanged+=1);return{summary:r,lines:a}}(r.nodes,n.snapshot.nodes,{flatten:a});return await e.sessions.set(i),{mode:"snapshot",baselineInitialized:!1,summary:s.summary,lines:s.lines,...n.warnings.length>0?{warnings:n.warnings}:{}}};async function t3(e,t){var n,a,r,i,s,o,l;let d,u,p,h,f;if(!e.backend.captureSnapshot)throw new G("UNSUPPORTED_OPERATION","snapshot is not supported by this backend");let m=t.session??"default",w=await e.sessions.get(m),g=await e.backend.captureSnapshot({session:m,requestId:t.requestId,appId:w?.appId,appBundleId:w?.appBundleId,signal:t.signal??e.signal,metadata:t.metadata},{interactiveOnly:t.interactiveOnly,depth:t.depth,scope:t.scope,raw:t.raw}),b=(a=g,r=e,n=a.snapshot?a.snapshot:{nodes:a.nodes??[],truncated:a.truncated,backend:a.backend,createdAt:c(r)},n.presentationKey?n:{...n,presentationKey:W(t)}),y=E(g),k=c(e);return{snapshot:b,result:g,session:w,annotations:y,warnings:(d=[...(i={result:g,annotations:y,snapshot:b,options:t,session:w,capturedAt:b.createdAt??k,runtimeNow:k}).annotations.warnings??[]],i.annotations.quality&&d.push(...v(i.annotations.quality,i.snapshot.nodes)),d.push(...function(e){let t=e.annotations.analysis;if("android"!==e.snapshot.backend||!0!==e.options.interactiveOnly||e.snapshot.nodes.length>0||!t||(t.rawNodeCount??0)<12)return[];let n=[`Interactive snapshot is empty after filtering ${t.rawNodeCount} raw Android nodes. Likely causes: the app content is not accessibility-visible yet, a transient route change, or depth/filter options hid the target.`];return"number"==typeof e.options.depth&&"number"==typeof t.maxDepth&&t.maxDepth>=e.options.depth+2&&n.push(`Interactive output is empty at depth ${e.options.depth}; retry without -d.`),n}(i)),i.annotations.quality||(d.push(...function(e){if("xctest"!==e.snapshot.backend||!0!==e.options.interactiveOnly||1!==e.snapshot.nodes.length)return[];let t=e.snapshot.nodes[0];return t?.type!=="Application"?[]:["iOS interactive snapshot exposed only the application root. XCTest accessibility queries can fail to enumerate some simulator UI trees even when screenshots and direct gestures still work. Use screenshot as visual truth, try a scoped/full snapshot for diagnostics, and prefer direct selectors when known."]}(i)),d.push(...(u=new Set((s=i.snapshot.nodes).map(e=>e.parentIndex).filter(e=>void 0!==e)),s.filter(e=>!(u.has(e.index)||(e.type?.toLowerCase()??"").includes("text"))&&(e.label??"").split(", ").length>10).map(e=>{let t=(e.label??"").split(", ").length,n=e.identifier?` (${e.identifier})`:"";return`@${e.ref} [${e.type??"element"}]${n} merges ~${t} labels into a single accessibility element. The app likely marks a container as accessible, which hides every descendant from assistive tech and automation — the children cannot be addressed individually. Fix the app's accessibility (mark the rows, not the container); until then use screenshot as visual truth and coordinate taps.`})))),(p=function(e){if(e?.backend!=="uiautomator-dump")return;let t=e.fallbackReason?` Reason: ${e.fallbackReason}`:"";return`Android snapshot helper unavailable; using stock UIAutomator dump, which can time out on busy React Native UIs.${t}`}(i.annotations.androidSnapshot))&&d.push(p),(h=C(i.snapshot.nodes))&&d.push(h),(f=function(e){var t,n,a,r,i,s;let o=e.session?.snapshot;if(!e.annotations.freshness&&o&&(t=o,n=e.snapshot,void 0===t.presentationKey||void 0===n.presentationKey||t.presentationKey===n.presentationKey)&&(a=o,r=e.capturedAt,[r,e.runtimeNow].some(e=>{let t=e-a.createdAt;return t>=0&&t<=2e3}))&&(i=o.nodes.length,s=e.snapshot.nodes.length,!(i<12)&&s<=Math.floor(.2*i)))return t8}(i))&&d.push(f),d.push(...(o=i.annotations.freshness,l=i.snapshot.backend,o?.staleAfterRetries&&"android"===l?"stuck-route"===o.reason?[`Recent ${o.action} was followed by a nearly identical snapshot after ${o.retryCount} automatic retr${1===o.retryCount?"y":"ies"}. If you expected navigation or submit, the tree may still be stale. Use screenshot as visual truth, wait briefly, then re-snapshot once.`]:"sharp-drop"===o.reason?[t8]:[]:[])),Array.from(new Set(d)))}}function t5(e,t){let n=t.session?.name??e??"default";return{...t.session??{name:n},name:n,snapshot:t.snapshot,appName:t.result.appName??t.session?.appName,appBundleId:t.result.appBundleId??t.session?.appBundleId}}let t8="Recent snapshots dropped sharply in node count, which suggests stale or mid-transition UI. Use screenshot as visual truth, wait briefly, then re-snapshot once.",t6=async(e,t)=>await nt(e,t,"press"),t9=async(e,t)=>await nt(e,t,"click"),t7=async(e,t)=>{var n;if(!t.text)throw new G("INVALID_ARGS","fill requires text");let a=await nr(e,t);if(a)return a;let r=await O(e,t,{action:"fill",requireInteractive:!0,promoteToHittableAncestor:!1});if(!e.backend.fill)throw new G("UNSUPPORTED_OPERATION","fill is not supported by this backend");let i=nn(r),s=I(await e.backend.fill(D(e,t),i,t.text,{delayMs:t.delayMs})),o="node"in r?r.node?.type??"":"",l=o&&!ec(o,e.backend.platform)?`fill target ${n=r,n.target?.kind==="ref"?n.target.ref:n.target?.kind==="selector"?n.target.selector:"point"} resolved to "${o}", attempting fill anyway.`:void 0;return{...r,text:t.text,...l?{warning:l}:{},...s?{backendResult:s}:{}}},ne=async(e,t)=>{let n=t.text;if(!n)throw new G("INVALID_ARGS","type requires text");let a=eF(n);if(a)throw new G("INVALID_ARGS",`type does not accept a target ref like "${a}"`,{hint:`Use fill ${a} "text" to target that field, or press ${a} then type "text" to append.`});if(!e.backend.typeText)throw new G("UNSUPPORTED_OPERATION","type is not supported by this backend");let r=T(t.delayMs??0,"delay-ms",0,1e4),i=I(await e.backend.typeText(D(e,t),n,{delayMs:r}));return{kind:"text",text:n,delayMs:r,...i?{backendResult:i}:{},...R(`Typed ${Array.from(n).length} chars`)}};async function nt(e,t,n){let a=await na(e,t,n);if(a)return a;let r=await O(e,t,{action:n,requireInteractive:!0,promoteToHittableAncestor:!0});if(!e.backend.tap)throw new G("UNSUPPORTED_OPERATION","tap is not supported by this backend");let i=nn(r),s=I(await e.backend.tap(D(e,t),i,{button:t.button,count:t.count,intervalMs:t.intervalMs,holdMs:t.holdMs,jitterPx:t.jitterPx,doubleTap:t.doubleTap}));return{...r,...s?{backendResult:s}:{}}}function nn(e){if(!e.point)throw new G("COMMAND_FAILED","Interaction target resolved without coordinates");return e.point}async function na(e,t,n){var a;if("click"!==n||"ref"!==t.target.kind||!e.backend.tapTarget||void 0!==(a=t).count||void 0!==a.intervalMs||void 0!==a.holdMs||void 0!==a.jitterPx||void 0!==a.doubleTap||void 0!==a.button&&"primary"!==a.button)return null;let r=I(await e.backend.tapTarget(D(e,t),{kind:"ref",ref:t.target.ref,...t.target.fallbackLabel?{fallbackLabel:t.target.fallbackLabel}:{}}));return{kind:"ref",target:{kind:"ref",ref:t.target.ref},...r?{backendResult:r}:{}}}async function nr(e,t){if("ref"!==t.target.kind||!e.backend.fillTarget)return null;let n=I(await e.backend.fillTarget(D(e,t),{kind:"ref",ref:t.target.ref,...t.target.fallbackLabel?{fallbackLabel:t.target.fallbackLabel}:{}},t.text,{delayMs:t.delayMs}));return{kind:"ref",target:{kind:"ref",ref:t.target.ref},text:t.text,...n?{backendResult:n}:{}}}function ni(e){return["visible","hidden","exists","editable","selected","text"].includes(e)}function ns(e){let{predicate:t,node:n,nodes:a,expectedText:r,platform:i}=e,s=Q(n),o=eu(n,i),l=!0===n.selected,u="text"===t?ei(n):function(e,t,n){var a,r,i;let s;if("android"===n&&!1===e.visibleToUser)return!1;if(no(e.rect))return function(e,t){return d(e,t)}(e,t);if(e.rect)return!1;if("android"!==n&&!0===e.hittable)return!0;let o=(a=e,r=t,i=n,s=eo(r),ee(r,a,s,e=>!function(e,t){if("android"===t&&!1===e.visibleToUser)return!1;let n=ed(e.type??"");return!(n.includes("application")||n.includes("window")||n.includes("scrollview")||n.includes("tableview")||n.includes("collectionview"))&&"table"!==n&&"list"!==n&&"listview"!==n&&("android"===t?!0===e.hittable&&no(e.rect):!0===e.hittable||no(e.rect))}(e,i)?null:e));return!!o&&(no(o.rect)?function(e,t){return d(e,t)}(o,t):"android"!==n&&!0===o.hittable)}(n,a,i),c=!1;switch(t){case"visible":c=u;break;case"hidden":c=!u;break;case"editable":c=o;break;case"selected":c=l;break;case"text":c=s===(r??"")}let p="text"===t?`expected="${r??""}" actual="${s}"`:`actual=${JSON.stringify({visible:u,editable:o,selected:l})}`;return{pass:c,actualText:s,details:p}}function no(e){return!!(e&&Number.isFinite(e.x)&&Number.isFinite(e.y)&&Number.isFinite(e.width)&&Number.isFinite(e.height)&&e.width>0&&e.height>0)}async function nl(e,t){let n=t??"default",a=await e.sessions.get(n);if(!a)throw new G("SESSION_NOT_FOUND","No active session. Run open first.");if(!a.snapshot)throw new G("INVALID_ARGS","No snapshot in session. Run snapshot first.");return{sessionName:n,session:a,snapshot:a.snapshot}}async function nd(e,t,n={updateSession:!0}){let a=e.backend.captureSnapshot;if(!a)throw new G("UNSUPPORTED_OPERATION","snapshot is not supported by this backend");let r=t.session??"default",i=await e.sessions.get(r),s=await a(D(e,t),{interactiveOnly:!1,depth:t.depth,scope:n.scope??t.scope,raw:t.raw,includeRects:n.includeRects}),l=s.snapshot??{nodes:s.nodes??[],truncated:s.truncated,backend:s.backend,...s.quality?{snapshotQuality:s.quality}:{},createdAt:c(e)};return n.updateSession&&i&&!o(l.snapshotQuality)&&await e.sessions.set({...i,snapshot:l}),{sessionName:r,session:i,snapshot:l}}async function nu(e,t,n){if(e.backend.readText){let a=await e.backend.readText(D(e,{session:t.sessionName}),n);if(a.text.trim())return a.text}return es(n)}let nc=async(e,t)=>{let n=t.locator??"any";if(!t.query)throw new G("INVALID_ARGS","find requires a value");if("wait"===t.action)return await nk(e,t,n);let{capture:a,match:r}=await nv(e,t,n);if(!r)throw new G("COMMAND_FAILED","find did not match any element");if("exists"===t.action)return{kind:"found",found:!0};let i=`@${r.ref}`;return"get_attrs"===t.action?{kind:"attrs",ref:i,node:r}:{kind:"text",ref:i,text:await nu(e,a,r),node:r}},np=async(e,t)=>{if("ref"===t.target.kind){let n=await nl(e,t.session),a=function(e,t,n){let a=j(t);if(!a)throw new G("INVALID_ARGS",n.invalidRefMessage);let r=H(e,a)??(n.fallbackLabel.length>0?ea(e,n.fallbackLabel):null);if(!r)throw new G("COMMAND_FAILED",n.notFoundMessage);return{ref:a,node:r}}(n.snapshot.nodes,t.target.ref,{fallbackLabel:t.target.fallbackLabel??"",invalidRefMessage:"get text requires a ref like @e2",notFoundMessage:`Ref ${t.target.ref} not found`}),r=et(a.node,e.backend.platform,{action:"get"}),i={kind:"ref",ref:`@${a.ref}`};return"attrs"===t.property?{kind:"attrs",target:i,node:a.node,selectorChain:r}:{kind:"text",target:i,text:await nu(e,n,a.node),node:a.node,selectorChain:r}}let n=await nI(e,t,t.session??"default",{selector:t.target.selector,disambiguateAmbiguous:"text"===t.property}),a=et(n.node,e.backend.platform,{action:"get"});if("attrs"===t.property)return{kind:"attrs",target:{kind:"selector",selector:n.selector},node:n.node,selectorChain:a};let r=await nu(e,n.capture,n.node);return{kind:"text",target:{kind:"selector",selector:n.selector},text:r,node:n.node,selectorChain:a}},nh=async(e,t)=>{let n=await np(e,{...t,property:"text",target:t.target});if("text"!==n.kind)throw new G("COMMAND_FAILED","getText returned non-text result");return n},nf=async(e,t)=>{let n=await np(e,{...t,property:"attrs",target:t.target});if("attrs"!==n.kind)throw new G("COMMAND_FAILED","getAttrs returned non-attrs result");return n},nm=async(e,t)=>{var n;if(!ni(t.predicate))throw new G("INVALID_ARGS","is requires predicate: visible|hidden|exists|editable|selected|text");if("text"===t.predicate&&!t.expectedText)throw new G("INVALID_ARGS","is text requires expected text value");let a="visible"===(n=t.predicate)||"hidden"===n,r=await nd(e,t,{updateSession:!0,includeRects:a}),i=ef(t.selector);if("exists"===t.predicate){let n=Z(r.snapshot.nodes,i,{platform:e.backend.platform});if(!n)throw new G("COMMAND_FAILED",el(i,[],{unique:!1}));return{predicate:t.predicate,pass:!0,selector:n.selector.raw,matches:n.matches,selectorChain:i.selectors.map(e=>e.raw)}}let s=en(r.snapshot.nodes,i,{platform:e.backend.platform,requireRect:!1,requireUnique:!0,disambiguateAmbiguous:!1});if(!s)throw new G("COMMAND_FAILED",el(i,[],{unique:!0}),{command:"is",reason:"selector_not_found",predicate:t.predicate,selector:i.raw});let o=ns({predicate:t.predicate,node:s.node,nodes:r.snapshot.nodes,expectedText:t.expectedText,platform:e.backend.platform});if(!o.pass)throw new G("COMMAND_FAILED",`is ${t.predicate} failed for selector ${s.selector.raw}: ${o.details}`,{command:"is",reason:"predicate_failed",predicate:t.predicate,selector:s.selector.raw,predicateDetails:o.details});return{predicate:t.predicate,pass:!0,selector:s.selector.raw,..."text"===t.predicate?{text:o.actualText}:{},selectorChain:i.selectors.map(e=>e.raw)}},nw=async(e,t)=>await nm(e,{...t,predicate:"visible",selector:t.target.selector}),ng=async(e,t)=>await nm(e,{...t,predicate:"hidden",selector:t.target.selector}),nb=async(e,t)=>{if("sleep"===t.target.kind)return await p(e,t.target.durationMs),{kind:"sleep",waitedMs:t.target.durationMs};if("ref"===t.target.kind){let n=await nl(e,t.session),a=j(t.target.ref);if(!a)throw new G("INVALID_ARGS",`Invalid ref: ${t.target.ref}`);let r=H(n.snapshot.nodes,a),i=r?er(r,n.snapshot.nodes):void 0;if(!i)throw new G("COMMAND_FAILED",`Ref ${t.target.ref} not found or has no label`);return await nA(e,t,i,t.target.timeoutMs)}if("selector"===t.target.kind)return await nx(e,t,t.target.selector,t.target.timeoutMs);if(!t.target.text)throw new G("INVALID_ARGS","wait requires text");return await nA(e,t,t.target.text,t.target.timeoutMs)},ny=async(e,t)=>{let n=await nb(e,{...t,target:{kind:"text",text:t.text,timeoutMs:t.timeoutMs}});if("text"!==n.kind)throw new G("COMMAND_FAILED","waitForText returned non-text result");return n};async function nk(e,t,n){let a=t.timeoutMs??1e4,r=c(e);for(;c(e)-r<a;){let{match:a}=await nv(e,t,n);if(a)return{kind:"found",found:!0,waitedMs:c(e)-r};await p(e,300)}throw new G("COMMAND_FAILED","find wait timed out")}async function nv(e,t,n){let a=ep(n,t.query),r=await nd(e,t,{updateSession:!0,scope:function(e,t,n,a){if(!a&&"web"!==e.backend.platform)return"text"===t||"label"===t||"any"===t?n:void 0}(e,n,t.query,a)});if(o(r.snapshot.snapshotQuality))throw new G("COMMAND_FAILED","find could not read the current accessibility tree",{reason:r.snapshot.snapshotQuality.reason,hint:"The snapshot quality verdict is sparse. Use screenshot as visual truth, navigate with coordinates if needed, then retry find after reaching a readable screen."});if(a){let t=en(r.snapshot.nodes,a,{platform:e.backend.platform,requireRect:!1,requireUnique:!1});return{capture:r,match:t?.node}}let i=eh(r.snapshot.nodes,n,t.query,{requireRect:!1}).matches[0];return{capture:r,match:i}}async function nx(e,t,n,a){let r=a??1e4,i=c(e),s=ef(n);for(;c(e)-i<r;){let n=Z((await nd(e,t,{updateSession:!0})).snapshot.nodes,s,{platform:e.backend.platform});if(n)return{kind:"selector",selector:n.selector.raw,waitedMs:c(e)-i};await p(e,300)}throw new G("COMMAND_FAILED",`wait timed out for selector: ${n}`)}async function nA(e,t,n,a){let r=a??1e4,i=c(e);for(;c(e)-i<r;){if(e.backend.findText?(await e.backend.findText(D(e,t),n)).found:await nM(e,t,n))return{kind:"text",text:n,waitedMs:c(e)-i};await p(e,300)}throw new G("COMMAND_FAILED",`wait timed out for text: ${n}`)}async function nM(e,t,n){return!!ea((await nd(e,t,{updateSession:!0})).snapshot.nodes,n)}async function nI(e,t,n,a){let r=await nd(e,{...t,session:n},{updateSession:!0}),i=ef(a.selector),s=en(r.snapshot.nodes,i,{platform:e.backend.platform,requireRect:!1,requireUnique:!0,disambiguateAmbiguous:a.disambiguateAmbiguous});if(!s)throw new G("COMMAND_FAILED",el(i,[],{unique:!0}));return{capture:r,node:s.node,selector:s.selector.raw,ref:`@${s.node.ref}`}}function nR(e,t){if(void 0!==e)return nP(e,t)}function nP(e,t){let n=e?.trim();if(!n)throw new G("INVALID_ARGS",`${t} must be a non-empty string`);return n}let nN=async(e,t={})=>{if(!e.backend.listDevices)throw new G("UNSUPPORTED_OPERATION","admin.devices is not supported by this backend");return{kind:"adminDevices",devices:await e.backend.listDevices(D(e,t),t.filter)}},nS=async(e,t={})=>{if(!e.backend.bootDevice)throw new G("UNSUPPORTED_OPERATION","admin.boot is not supported by this backend");let n=n$(t.target),a=I(await e.backend.bootDevice(D(e,t),n));return{kind:"deviceBooted",...n?{target:n}:{},...a?{backendResult:a}:{},...R("Booted device")}},nO=async(e,t={})=>{if(!e.backend.shutdownDevice)throw new G("UNSUPPORTED_OPERATION","admin.shutdown is not supported by this backend");let n=n$(t.target),a=I(await e.backend.shutdownDevice(D(e,t),n));return{kind:"deviceShutdown",...n?{target:n}:{},...a?{backendResult:a}:{},...R("Shutdown device")}},n_=async(e,t)=>await nT(e,t,"install"),nD=async(e,t)=>await nT(e,t,"reinstall"),nE=async(e,t)=>await nT(e,t,"installFromSource");async function nT(e,t,n){let a="reinstall"===n?"reinstallApp":"installApp",r=e.backend[a];if(!r)throw new G("UNSUPPORTED_OPERATION",`admin.${n} is not supported by this backend`);let i="app"in t&&void 0!==t.app?nP(t.app,"app"):void 0;if("installFromSource"!==n&&!i)throw new G("INVALID_ARGS",`admin.${n} requires app`);let s=D(e,t),o=await nC(e,s,t.source);try{var l,d,u,c,p;let t,a,h,f,m,w,g,b,y=await r.call(e.backend,s,{...i?{app:i}:{},source:o.source});return l=n,d=i,u=o.source,c=y,t=I(c),a=nB(c,"appName"),h=nB(c,"appId"),f=nB(c,"bundleId"),m=nB(c,"packageName"),w=nB(c,"launchTarget"),g=nB(c,"installablePath"),b=nB(c,"archivePath"),{kind:"reinstall"===l?"appReinstalled":"installFromSource"===l?"appInstalledFromSource":"appInstalled",...d?{app:d}:{},source:u,...h?{appId:h}:{},...a?{appName:a}:{},...f?{bundleId:f}:{},...m?{packageName:m}:{},...w?{launchTarget:w}:{},...g?{installablePath:g}:{},...b?{archivePath:b}:{},...t?{backendResult:t}:{},...R(`${"reinstall"===l?"Reinstalled":"Installed"}: ${a??w??d??(p=u,"path"===p.kind?p.path:"uploadedArtifact"===p.kind?p.id:p.url)}`)}}finally{await o.cleanup?.()}}async function nC(e,t,n){let a=nL(n),r=await nU(e,a);try{let n=e.backend.resolveInstallSource?await e.backend.resolveInstallSource(t,r.source):r.source;return{source:nL(n),...r.cleanup?{cleanup:r.cleanup}:{}}}catch(e){if(r.cleanup)try{await r.cleanup()}catch{}throw e}}async function nU(e,t){if("url"===t.kind)return{source:t};let n=await tB(e,t,{usage:"admin.install",field:"source"});return{source:{kind:"path",path:n.path},...n.cleanup?{cleanup:n.cleanup}:{}}}function nL(e){if(!e||"object"!=typeof e)throw new G("INVALID_ARGS","install source is required");if("path"===e.kind)return{kind:"path",path:nP(e.path,"source.path")};if("uploadedArtifact"===e.kind)return{kind:"uploadedArtifact",id:nP(e.id,"source.id")};if("url"===e.kind){let t=nP(e.url,"source.url");return function(e){let t;try{t=new URL(e)}catch{throw new G("INVALID_ARGS",`Invalid install source URL: ${e}`)}if("http:"!==t.protocol&&"https:"!==t.protocol)throw new G("INVALID_ARGS","Install source URL must use http or https")}(t),{kind:"url",url:t}}throw new G("INVALID_ARGS","install source kind must be path, uploadedArtifact, or url")}function n$(e){if(!e)return;let t=nR(e.id,"target.id"),n=nR(e.name,"target.name"),a={...t?{id:t}:{},...n?{name:n}:{},...e.platform?{platform:e.platform}:{},...e.target?{target:e.target}:{},...void 0!==e.headless?{headless:e.headless}:{}};return Object.keys(a).length>0?a:void 0}function nB(e,t){let n=e[t];return"string"==typeof n&&n.length>0?n:void 0}let nq=/^[A-Za-z0-9_.:-]{1,64}$/,nG=async(e,t)=>{var n;if(!e.backend.openApp)throw new G("UNSUPPORTED_OPERATION","apps.open is not supported by this backend");let a=function(e){var t;let n=nR(e.app,"app"),a=nR(e.appId,"appId"),r=nR(e.bundleId,"bundleId"),i=nR(e.packageName,"packageName"),s=nR(e.url,"url"),o=nR(e.activity,"activity"),l={...n?{app:n}:{},...a?{appId:a}:{},...r?{bundleId:r}:{},...i?{packageName:i}:{},...s?{url:s}:{},...o?{activity:o}:{}};if(!((t=l).app??t.appId??t.bundleId??t.packageName??t.url??t.activity))throw new G("INVALID_ARGS","apps.open requires app, appId, bundleId, packageName, url, or activity");return l}(t),r=I(await e.backend.openApp(nH(e,t),a,{launchArgs:t.launchArgs,relaunch:t.relaunch}));return{kind:"appOpened",target:a,relaunch:!0===t.relaunch,...r?{backendResult:r}:{},...R(`Opened: ${(n=a).app??n.appId??n.bundleId??n.packageName??n.url??n.activity??"app"}`)}},nX=async(e,t={})=>{if(!e.backend.closeApp)throw new G("UNSUPPORTED_OPERATION","apps.close is not supported by this backend");let n=nR(t.app,"app"),a=I(await e.backend.closeApp(nH(e,t),n));return{kind:"appClosed",...n?{app:n}:{},...a?{backendResult:a}:{},...R(n?`Closed: ${n}`:"Closed app")}},nY=async(e,t={})=>{if(!e.backend.listApps)throw new G("UNSUPPORTED_OPERATION","apps.list is not supported by this backend");return{kind:"appsList",apps:await e.backend.listApps(nH(e,t),ew(t.filter))}},nF=async(e,t)=>{if(!e.backend.getAppState)throw new G("UNSUPPORTED_OPERATION","apps.state is not supported by this backend");let n=nP(t.app,"app"),a=await e.backend.getAppState(nH(e,t),n);return{kind:"appState",app:n,state:a}},nK=async(e,t)=>{if(!e.backend.pushFile)throw new G("UNSUPPORTED_OPERATION","apps.push is not supported by this backend");let n=nP(t.app,"app"),a=await nz(e,t.input);try{let r=await e.backend.pushFile(nH(e,t),a.backendInput,n),i=I(r);return{kind:"appPushed",app:n,inputKind:a.inputKind,...i?{backendResult:i}:{},...R(`Pushed to ${n}`)}}finally{await a.cleanup?.()}},nV=async(e,t)=>{var n,a;if(!e.backend.triggerAppEvent)throw new G("UNSUPPORTED_OPERATION","apps.triggerEvent is not supported by this backend");let r=function(e){let t=nP(e,"name");if(!nq.test(t))throw new G("INVALID_ARGS",`Invalid apps.triggerEvent name: ${t}`,{hint:"Use 1-64 chars: letters, numbers, underscore, dot, colon, or dash."});return t}(t.name);n=t.payload,a=`apps.triggerEvent payload for "${r}"`,void 0!==n&&nj(n,a,8192);let i=I(await e.backend.triggerAppEvent(nH(e,t),{name:r,...t.payload?{payload:t.payload}:{}}));return{kind:"appEventTriggered",name:r,...t.payload?{payload:t.payload}:{},...i?{backendResult:i}:{},...R(`Triggered app event: ${r}`)}};async function nz(e,t){if(!t||"object"!=typeof t)throw new G("INVALID_ARGS","apps.push requires an input");if("json"===t.kind)return nj(t.payload,"apps.push JSON payload",8192),{backendInput:{kind:"json",payload:t.payload},inputKind:"json"};let n=await tB(e,t,{usage:"apps.push",field:"input"});return{backendInput:{kind:"file",path:n.path},inputKind:"file",...n.cleanup?{cleanup:n.cleanup}:{}}}function nj(e,t,n){if(function(e,t){if(!e||"object"!=typeof e||Array.isArray(e))throw new G("INVALID_ARGS",`${t} must be a JSON object`)}(e,t),Buffer.byteLength(function(e,t){try{let n=JSON.stringify(e);if("string"!=typeof n)throw new G("INVALID_ARGS",`${t} must be JSON-serializable`);return n}catch{throw new G("INVALID_ARGS",`${t} must be JSON-serializable`)}}(e,t),"utf8")>n)throw new G("INVALID_ARGS",`${t} exceeds ${n} bytes`)}function nH(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}let nW=/(?:authorization|cookie|token|secret|password|passwd|api[-_]?key)/i,nJ=/\b[A-Za-z0-9_-]{16,}\.[A-Za-z0-9_-]{16,}\.[A-Za-z0-9_-]{16,}\b/g;function nZ(e){var t,n;let a=!1,r=e;return{value:(t=r=(r=(r=(r=(r=r.replaceAll(/(authorization|token|secret|password|passwd|api[-_]?key)=([^&\s]+)/gi,(e,t)=>(a=!0,`${String(t)}=[REDACTED]`))).replaceAll(/("(?:authorization|cookie|token|secret|password|passwd|api[-_]?key)"\s*:\s*")([^"]*)(")/gi,(e,t,n,r)=>(a=!0,`${String(t)}[REDACTED]${String(r)}`))).replaceAll(/\b(Bearer\s+)([^\s",;]+)/gi,(e,t)=>(a=!0,`${String(t)}[REDACTED]`))).replaceAll(/((?:authorization|cookie|token|secret|password|passwd|api[-_]?key)\s*[:=]\s*)([^\s,;&]+)/gi,(e,t)=>(a=!0,`${String(t)}[REDACTED]`))).replaceAll(nJ,()=>(a=!0,"[REDACTED]")),n=()=>{a=!0},r=/(https?:\/\/|token|secret|password|authorization|cookie|api[-_]?key)/i.test(t)?t.replaceAll(/https?:\/\/[^\s"'<>)]+/gi,e=>{let t=nQ(e);return t?(t.redacted&&n(),t.value):e}):t),redacted:a}}function nQ(e){try{let t=new URL(e),n=function(e){let t=!1;for(let n of Array.from(e.searchParams.keys()))nW.test(n)&&(e.searchParams.set(n,"[REDACTED]"),t=!0);return t}(t);return(t.username||t.password)&&(t.username="REDACTED",t.password="REDACTED",n=!0),{value:t.toString(),redacted:n}}catch{return}}let n0=/(?:authorization|cookie|token|secret|password|passwd|api[-_]?key)/i;function n1(e){if(!e)return{redacted:!1};let t=!1,n={};for(let[a,r]of Object.entries(e))if(n0.test(a))n[a]="[REDACTED]",t=!0;else{let e=n5(r,2048);n[a]=e.value??"",t||=e.redacted}return{value:n,redacted:t}}function n2(e){return void 0===e?{redacted:!1}:function(e){try{let t=JSON.parse(e),n=n3(t,nZ);return n8(JSON.stringify(n.value),2048,n.redacted)}catch{return}}(e)??n5(e,2048)}function n4(e){return n3(e,e=>n5(e,2048))}function n3(e,t){if(void 0===e)return{redacted:!1};if("string"==typeof e)return t(e);if(!e||"object"!=typeof e)return{value:e,redacted:!1};if(Array.isArray(e)){let n=!1;return{value:e.map(e=>{let a=n3(e,t);return n||=a.redacted,a.value}),redacted:n}}let n=!1,a={};for(let[r,i]of Object.entries(e)){if(n0.test(r)){a[r]="[REDACTED]",n=!0;continue}let e=n3(i,t);a[r]=e.value,n||=e.redacted}return{value:a,redacted:n}}function n5(e,t){if(void 0===e)return{redacted:!1};let n=nZ(e);return n8(n.value,t,n.redacted)}function n8(e,t,n){if(void 0===e)return{redacted:n};let a=e;return a.length>t&&(a=`${a.slice(0,t)}...[truncated]`,n=!0),{value:a,redacted:n}}let n6=async(e,t={})=>{var n,a;let r;if(!e.backend.readLogs)throw new G("UNSUPPORTED_OPERATION","diagnostics.logs is not supported by this backend");return r=!0===(n=await e.backend.readLogs(await ae(e,t),{...at(a=t,100,500,"logs limit"),...void 0!==a.levels?{levels:aa(a.levels,"levels")}:{},...void 0!==a.search?{search:nP(a.search,"search")}:{},...void 0!==a.source?{source:nP(a.source,"source")}:{}})).redacted,{kind:"diagnosticsLogs",entries:n.entries.map(e=>{let t=n5(e.message,4096),n=n4(e.metadata);return r||=t.redacted||n.redacted,{...e.timestamp?{timestamp:e.timestamp}:{},...e.level?{level:e.level}:{},message:t.value??"",...e.source?{source:e.source}:{},...n.value?{metadata:n.value}:{}}}),...n.nextCursor?{nextCursor:n.nextCursor}:{},...n.timeWindow?{timeWindow:n.timeWindow}:{},...n.backend?{backend:n.backend}:{},redacted:r,...n.notes?{notes:n.notes}:{}}},n9=async(e,t={})=>{var n,a,r;let i;if(!e.backend.dumpNetwork)throw new G("UNSUPPORTED_OPERATION","diagnostics.network is not supported by this backend");let s={...at(r=t,25,200,"network limit"),include:function(e){if(void 0===e)return"summary";if("summary"===e||"headers"===e||"body"===e||"all"===e)return e;throw new G("INVALID_ARGS","network include must be summary, headers, body, or all")}(r.include)};return n=await e.backend.dumpNetwork(await ae(e,t),s),a=s.include??"summary",i=!0===n.redacted,{kind:"diagnosticsNetwork",entries:n.entries.map(e=>{var t;let n=e.url?nQ(t=e.url)??n5(t,2048):void 0,r="headers"===a||"all"===a?n1(e.requestHeaders):void 0,s="headers"===a||"all"===a?n1(e.responseHeaders):void 0,o="body"===a||"all"===a?n2(e.requestBody):void 0,l="body"===a||"all"===a?n2(e.responseBody):void 0,d=n4(e.metadata);return i||=(n?.redacted??!1)||(r?.redacted??!1)||(s?.redacted??!1)||(o?.redacted??!1)||(l?.redacted??!1)||d.redacted,{...e.timestamp?{timestamp:e.timestamp}:{},...e.method?{method:e.method}:{},...n?{url:n.value}:{},...void 0!==e.status?{status:e.status}:{},...void 0!==e.durationMs?{durationMs:e.durationMs}:{},...r?.value?{requestHeaders:r.value}:{},...s?.value?{responseHeaders:s.value}:{},...o?.value!==void 0?{requestBody:o.value}:{},...l?.value!==void 0?{responseBody:l.value}:{},...d.value?{metadata:d.value}:{}}}),...n.nextCursor?{nextCursor:n.nextCursor}:{},...n.timeWindow?{timeWindow:n.timeWindow}:{},...n.backend?{backend:n.backend}:{},redacted:i,...n.notes?{notes:n.notes}:{}}},n7=async(e,t={})=>{var n,a;let r;if(!e.backend.measurePerf)throw new G("UNSUPPORTED_OPERATION","diagnostics.perf is not supported by this backend");return r=!0===(n=await e.backend.measurePerf(await ae(e,t),{...an(a=t),...void 0!==a.sampleMs?{sampleMs:T(a.sampleMs,"sampleMs",100,6e4)}:{},...void 0!==a.metrics?{metrics:aa(a.metrics,"metrics",20)}:{}})).redacted,{kind:"diagnosticsPerf",metrics:n.metrics.map(e=>{let t=n5(e.message,4096),n=n4(e.metadata);return r||=t.redacted||n.redacted,{name:e.name,...void 0!==e.value?{value:e.value}:{},...e.unit?{unit:e.unit}:{},...e.status?{status:e.status}:{},...void 0!==t.value?{message:t.value}:{},...n.value?{metadata:n.value}:{}}}),...n.startedAt?{startedAt:n.startedAt}:{},...n.endedAt?{endedAt:n.endedAt}:{},...n.backend?{backend:n.backend}:{},redacted:r,...n.notes?{notes:n.notes}:{}}};async function ae(e,t){let n=D(e,t),a=t.session?await e.sessions.get(t.session):void 0;return{...n,...t.appId??a?.appId?{appId:t.appId??a?.appId}:{},...t.appBundleId??a?.appBundleId?{appBundleId:t.appBundleId??a?.appBundleId}:{}}}function at(e,t,n,a){return{...an(e),...void 0!==e.cursor?{cursor:nP(e.cursor,"cursor")}:{},limit:void 0===e.limit?t:T(e.limit,a,1,n)}}function an(e){return{...void 0!==e.since?{since:nP(e.since,"since")}:{},...void 0!==e.until?{until:nP(e.until,"until")}:{}}}function aa(e,t,n=50){if(!Array.isArray(e))throw new G("INVALID_ARGS",`${t} must be an array of strings`);if(e.length>n)throw new G("INVALID_ARGS",`${t} must contain at most ${n} entries`);return e.map((e,n)=>nP(e,`${t}[${n}]`))}let ar=async(e,t)=>{let n=as(t.action,"record"),a="start"===n?e.backend.startRecording:e.backend.stopRecording;if(!a)throw new G("UNSUPPORTED_OPERATION",`record ${n} is not supported by this backend`);let r=t.out?await tq(e,t.out,{field:"path",ext:".mp4"}):void 0;try{var i,s,o,l,d,u,c;let p,h,f,m,w=(i=t,s=r?.path,p={},s&&(p.outPath=s),h=(o=i.fps,void 0===o?void 0:T(o,"fps",1,60)),void 0!==h&&(p.fps=h),f=(l=i.maxSize,void 0===l?void 0:T(l,"maxSize",1,Number.MAX_SAFE_INTEGER)),void 0!==f&&(p.maxSize=f),m=function(e){if(void 0===e)return;let t=g(e);if(void 0===t)throw new G("INVALID_ARGS","quality must be one of: medium, high (legacy numeric values 5-10 are accepted)");return t}(i.quality),void 0!==m&&(p.quality=m),void 0!==i.hideTouches&&(p.showTouches=!0!==i.hideTouches),p),b=await a.call(e.backend,D(e,t),w),y=await r?.publish();return d=n,u=b,c=y,{..."string"==typeof u.path?{path:u.path}:{},..."string"==typeof u.telemetryPath?{telemetryPath:u.telemetryPath}:{},..."string"==typeof u.warning?{warning:u.warning}:{},...ao(d,u,c,{startKind:"recordingStarted",stopKind:"recordingStopped",startMessage:"Recording started",stopMessage:"Recording stopped"})}}catch(e){throw await r?.cleanup?.(),e}},ai=async(e,t)=>{let n=as(t.action,"trace"),a="start"===n?e.backend.startTrace:e.backend.stopTrace;if(!a)throw new G("UNSUPPORTED_OPERATION",`trace ${n} is not supported by this backend`);let r=t.out?await tq(e,t.out,{field:"outPath",ext:".trace"}):void 0;try{var i,s,o;let l={...r?.path?{outPath:r.path}:{}},d=await a.call(e.backend,D(e,t),l),u=await r?.publish();return i=n,s=d,o=u,{..."string"==typeof s.outPath?{outPath:s.outPath}:{},...ao(i,s,o,{startKind:"traceStarted",stopKind:"traceStopped",startMessage:"Trace started",stopMessage:"Trace stopped"})}}catch(e){throw await r?.cleanup?.(),e}};function as(e,t){if("start"===e||"stop"===e)return e;throw new G("INVALID_ARGS",`${t} action must be start or stop`)}function ao(e,t,n,a){return{kind:"start"===e?a.startKind:a.stopKind,action:e,...n?{artifact:n}:{},backendResult:t,...R("start"===e?a.startMessage:a.stopMessage)}}let al=async(e,t={})=>{if(!e.backend.pressBack)throw new G("UNSUPPORTED_OPERATION","system.back is not supported by this backend");let n=t.mode??"in-app";if("in-app"!==n&&"system"!==n)throw new G("INVALID_ARGS","system.back mode must be in-app or system");let a=I(await e.backend.pressBack(D(e,t),{mode:n}));return{kind:"systemBack",mode:n,...a?{backendResult:a}:{},...R("Back")}},ad=async(e,t={})=>{if(!e.backend.pressHome)throw new G("UNSUPPORTED_OPERATION","system.home is not supported by this backend");let n=I(await e.backend.pressHome(D(e,t)));return{kind:"systemHome",...n?{backendResult:n}:{},...R("Home")}},au=async(e,t)=>{if(!e.backend.rotate)throw new G("UNSUPPORTED_OPERATION","system.rotate is not supported by this backend");let n=function(e){switch(e){case"portrait":case"portrait-upside-down":case"landscape-left":case"landscape-right":return e;default:throw new G("INVALID_ARGS","system.rotate orientation must be portrait, portrait-upside-down, landscape-left, or landscape-right")}}(t.orientation),a=I(await e.backend.rotate(D(e,t),n));return{kind:"systemRotated",orientation:n,...a?{backendResult:a}:{},...R(`Rotated to ${n}`)}},ac=async(e,t={})=>{var n,a,r,i,s,o,l;if(!e.backend.setKeyboard)throw new G("UNSUPPORTED_OPERATION","system.keyboard is not supported by this backend");let d=t.action??"status";if(!eY(d))throw new G("INVALID_ARGS","system.keyboard action must be status, get, dismiss, enter, or return");let u=await e.backend.setKeyboard(D(e,t),{action:d}),c=I(u),p=(n=u)&&"object"==typeof n?u:{};return"enter"===d||"return"===d?{kind:"keyboardEnterPressed",action:"enter",state:p,...(a=c)?{backendResult:a}:{},...R("Keyboard enter pressed")}:"dismiss"===d?(r=d,{kind:"keyboardDismissed",action:r,state:i=p,...(s=c)?{backendResult:s}:{},...R(!1===i.dismissed?"Keyboard already hidden":"Keyboard dismissed")}):(o=d,{kind:"keyboardState",action:o,state:p,...(l=c)?{backendResult:l}:{}})},ap=async(e,t)=>{if("read"===t.action){if(!e.backend.getClipboard)throw new G("UNSUPPORTED_OPERATION","system.clipboard read is not supported by this backend");let n=await e.backend.getClipboard(D(e,t));return{kind:"clipboardText",action:"read",text:"string"==typeof n?n:n.text}}if("write"!==t.action)throw new G("INVALID_ARGS","system.clipboard action must be read or write");if(!e.backend.setClipboard)throw new G("UNSUPPORTED_OPERATION","system.clipboard write is not supported by this backend");if("string"!=typeof t.text)throw new G("INVALID_ARGS","system.clipboard write requires text");let n=I(await e.backend.setClipboard(D(e,t),t.text));return{kind:"clipboardUpdated",action:"write",textLength:Array.from(t.text).length,...n?{backendResult:n}:{},...R("Clipboard updated")}},ah=async(e,t={})=>{if(!e.backend.openSettings)throw new G("UNSUPPORTED_OPERATION","system.settings is not supported by this backend");let n=nR(t.target,"target"),a=I(await e.backend.openSettings(D(e,t),n));return{kind:"settingsOpened",...n?{target:n}:{},...a?{backendResult:a}:{},...R(n?`Opened settings: ${n}`:"Opened settings")}},af=async(e,t={})=>{var n,a;if(!e.backend.handleAlert)throw new G("UNSUPPORTED_OPERATION","system.alert is not supported by this backend");let r=t.action??"get";if("get"!==r&&"accept"!==r&&"dismiss"!==r&&"wait"!==r)throw new G("INVALID_ARGS","system.alert action must be get, accept, dismiss, or wait");let i=void 0===t.timeoutMs?void 0:T(t.timeoutMs,"timeoutMs",0,12e4),s=await e.backend.handleAlert(D(e,t),r,{timeoutMs:i});return n=r,a=s,"get"===n?function(e){if("alertStatus"!==e.kind)throw new G("COMMAND_FAILED","system.alert get returned an invalid backend result");return{kind:"alertStatus",action:"get",alert:e.alert}}(a):"wait"===n?function(e){if("alertWait"!==e.kind)throw new G("COMMAND_FAILED","system.alert wait returned an invalid backend result");return{kind:"alertWait",action:"wait",alert:e.alert,...void 0!==e.waitedMs?{waitedMs:e.waitedMs}:{},...void 0!==e.timedOut?{timedOut:e.timedOut}:{},...R(e.alert?"Alert visible":"Alert wait timed out")}}(a):function(e,t){if("alertHandled"!==t.kind)throw new G("COMMAND_FAILED",`system.alert ${e} returned an invalid backend result`);return{kind:"alertHandled",action:e,handled:t.handled,...t.alert?{alert:t.alert}:{},...t.button?{button:t.button}:{},...R(t.handled?`Alert ${e}ed`:"No alert handled")}}(n,a)},am=async(e,t={})=>{if(!e.backend.openAppSwitcher)throw new G("UNSUPPORTED_OPERATION","system.appSwitcher is not supported by this backend");let n=I(await e.backend.openAppSwitcher(D(e,t)));return{kind:"appSwitcherOpened",...n?{backendResult:n}:{},...R("Opened app switcher")}};function aw(e){let t={backend:e.backend,artifacts:e.artifacts,sessions:e.sessions??function(e=[]){let t=new Map(e.map(e=>[e.name,ag(e)]));return{get:e=>ag(t.get(e)),set:e=>{t.set(e.name,ag(e))},delete:e=>{t.delete(e)},list:()=>Array.from(t.values(),e=>ag(e))}}(),policy:e.policy??function(e={}){return{allowLocalInputPaths:!1,allowLocalOutputPaths:!1,maxImagePixels:2e7,allowNamedBackendCapabilities:[],...e}}(),diagnostics:e.diagnostics,clock:e.clock,signal:e.signal};return{...t,capture:{screenshot:e=>tJ(t,e),diffScreenshot:e=>tX(t,e),snapshot:e=>t2(t,e),diffSnapshot:e=>t4(t,e)},selectors:{find:e=>nc(t,e),get:e=>np(t,e),getText:(e,n={})=>nh(t,{...n,target:e}),getAttrs:(e,n={})=>nf(t,{...n,target:e}),is:e=>nm(t,e),isVisible:(e,n={})=>nw(t,{...n,target:e}),isHidden:(e,n={})=>ng(t,{...n,target:e}),wait:e=>nb(t,e),waitForText:(e,n={})=>ny(t,{...n,text:e})},interactions:{click:(e,n={})=>t9(t,{...n,target:e}),press:(e,n={})=>t6(t,{...n,target:e}),fill:(e,n,a={})=>t7(t,{...a,target:e,text:n}),typeText:(e,n={})=>ne(t,{...n,text:e}),focus:(e,n={})=>w(t,{...n,target:e}),longPress:(e,n={})=>f(t,{...n,target:e}),swipe:e=>N(t,e),scroll:e=>h(t,e),pinch:e=>U(t,e)},system:{back:e=>al(t,e),home:e=>ad(t,e),rotate:e=>au(t,e),keyboard:e=>ac(t,e),clipboard:e=>ap(t,e),settings:e=>ah(t,e),alert:e=>af(t,e),appSwitcher:e=>am(t,e)},apps:{open:e=>nG(t,e),close:e=>nX(t,e),list:(e={})=>nY(t,{...e,filter:em(e.filter)}),state:e=>nF(t,e),push:e=>nK(t,e),triggerEvent:e=>nV(t,e)},admin:{devices:e=>nN(t,e),boot:e=>nS(t,e),shutdown:e=>nO(t,e),install:e=>n_(t,e),reinstall:e=>nD(t,e),installFromSource:e=>nE(t,e)},recording:{record:e=>ar(t,e),trace:e=>ai(t,e)},observability:{logs:e=>n6(t,e),network:e=>n9(t,e),perf:e=>n7(t,e)}}}function ag(e){if(e)return{...e,...e.snapshot?{snapshot:structuredClone(e.snapshot)}:{},...e.metadata?{metadata:function(e){try{return structuredClone(e)}catch{return{...e}}}(e.metadata)}:{}}}function ab(e={}){return{allowLocalInputPaths:!0,allowLocalOutputPaths:!0,maxImagePixels:2e7,allowNamedBackendCapabilities:[],...e}}export{eB as CLOUD_WEBDRIVER_PROVIDERS,e_ as appendScriptSeriesFlags,aw as createAgentDevice,e8 as decodePngAsync,e6 as encodePngAsync,ns as evaluateIsPredicate,eF as findMistargetedTypeRefToken,eL as formatPortableActionLine,eO as formatScriptActionSummary,eI as formatScriptArg,eR as formatScriptStringLiteral,ex as isClickLikeCommand,eG as isCloudWebDriverProviderName,eY as isKeyboardAction,ni as isSupportedPredicate,eA as isTouchTargetCommand,ab as localCommandPolicy,eU as parseReplayOpenFlags,eT as parseReplayRuntimeFlags,eE as parseReplaySeriesFlags,e3 as prewarmPngWorker,e5 as terminatePngWorker,e$ as timingSafeStringEqual};
package/dist/src/8225.js CHANGED
@@ -1 +1 @@
1
- import{AppError as t}from"./733.js";let e=["camera","microphone","photos","contacts","contacts-limited","notifications","calendar","location","location-always","media-library","motion","reminders","siri"];function r(e){let r=e.trim().toLowerCase();if("grant"===r)return"grant";if("deny"===r)return"deny";if("reset"===r)return"reset";throw new t("INVALID_ARGS",`Invalid permission action: ${e}. Use grant|deny|reset.`)}function i(r){let i=r?.trim().toLowerCase();if("camera"===i||"microphone"===i||"photos"===i||"contacts"===i||"contacts-limited"===i||"notifications"===i||"calendar"===i||"location"===i||"location-always"===i||"media-library"===i||"motion"===i||"reminders"===i||"siri"===i)return i;throw new t("INVALID_ARGS",`permission setting requires a target: ${e.join("|")}`)}function n(e){let r=e.trim().toLowerCase();if("light"===r)return"light";if("dark"===r)return"dark";if("toggle"===r)return"toggle";throw new t("INVALID_ARGS",`Invalid appearance state: ${e}. Use light|dark|toggle.`)}function o(e){let r=e.toLowerCase();if("on"===r||"true"===r||"1"===r)return!0;if("off"===r||"false"===r||"0"===r)return!1;throw new t("INVALID_ARGS",`Invalid setting state: ${e}`)}function a(t){return t.map(t=>({args:t.args.join(" "),exitCode:t.exitCode,stderr:t.stderr.slice(0,400)}))}export{n as parseAppearanceAction,r as parsePermissionAction,i as parsePermissionTarget,o as parseSettingState,a as summarizeCommandAttemptFailures};
1
+ import{AppError as t}from"./485.js";function e(t){return t.map(t=>({args:t.args.join(" "),exitCode:t.exitCode,stderr:t.stderr.slice(0,400)}))}let r=["camera","microphone","photos","contacts","contacts-limited","notifications","calendar","location","location-always","media-library","motion","reminders","siri"];function i(e){let r=e.trim().toLowerCase();if("grant"===r)return"grant";if("deny"===r)return"deny";if("reset"===r)return"reset";throw new t("INVALID_ARGS",`Invalid permission action: ${e}. Use grant|deny|reset.`)}function n(e){let i=e?.trim().toLowerCase();if("camera"===i||"microphone"===i||"photos"===i||"contacts"===i||"contacts-limited"===i||"notifications"===i||"calendar"===i||"location"===i||"location-always"===i||"media-library"===i||"motion"===i||"reminders"===i||"siri"===i)return i;throw new t("INVALID_ARGS",`permission setting requires a target: ${r.join("|")}`)}function o(e){let r=e.trim().toLowerCase();if("light"===r)return"light";if("dark"===r)return"dark";if("toggle"===r)return"toggle";throw new t("INVALID_ARGS",`Invalid appearance state: ${e}. Use light|dark|toggle.`)}function a(e){let r=e.toLowerCase();if("on"===r||"true"===r||"1"===r)return!0;if("off"===r||"false"===r||"0"===r)return!1;throw new t("INVALID_ARGS",`Invalid setting state: ${e}`)}export{o as parseAppearanceAction,i as parsePermissionAction,n as parsePermissionTarget,a as parseSettingState,e as summarizeCommandAttemptFailures};
@@ -0,0 +1 @@
1
+ import e from"node:fs";import r from"node:path";import t from"node:crypto";import n from"node:os";import{asAppError as i,AppError as o}from"./485.js";import{isProcessAlive as a,readProcessStartTime as s}from"./9414.js";import{sleep as c}from"./5560.js";import{runCmd as u}from"./8875.js";async function l(t){let{lockDirPath:n,owner:i}=t,u=r.join(n,"owner.json"),l=Date.now()+(t.timeoutMs??3e4),d=t.pollMs??100,p=t.ownerGraceMs??5e3,w=t.description??"process lock";for(e.mkdirSync(r.dirname(n),{recursive:!0});Date.now()<l;)try{e.mkdirSync(n),function(r,t){let n=`${r}.${process.pid}.${Date.now()}.tmp`;e.writeFileSync(n,JSON.stringify(t),"utf8"),e.renameSync(n,r)}(u,i);let r=!1;return async()=>{r||(r=!0,e.rmSync(n,{recursive:!0,force:!0}))}}catch(r){if("EEXIST"!==r.code)throw r;if(function(r,t,n){let i=null;try{i=e.statSync(r)}catch{return!0}let o=m(t);if(o){var c;return!(Number.isInteger((c=o).pid)&&!(c.pid<=0)&&a(c.pid)&&(!c.startTime||s(c.pid)===c.startTime))&&(e.rmSync(r,{recursive:!0,force:!0}),!0)}return!(Date.now()-i.mtimeMs<n)&&(e.rmSync(r,{recursive:!0,force:!0}),!0)}(n,u,p))continue;await c(d)}throw new o("COMMAND_FAILED",`Timed out waiting for ${w}`,{lockDirPath:n,...function(r,t){let n,i=Date.now(),o=m(t);try{n=Math.max(0,Math.round(i-e.statSync(r).mtimeMs))}catch{}return{...void 0!==n?{lockAgeMs:n}:{},...o?{ownerPid:o.pid,ownerStartTime:o.startTime,ownerAgeMs:Math.max(0,Math.round(i-o.acquiredAtMs))}:{}}}(n,u)})}function m(r){try{return JSON.parse(e.readFileSync(r,"utf8"))}catch{return null}}let d="0.27.1",p="agent-browser";async function w(e){let r=S(e);if(r.installed){var t=r;if(!t.installed)throw g(t);return{command:t.binaryPath,env:D(t,process.env)}}throw g(r)}async function f(t){let n=S(t);var i,a=n.nodeMajor;if(!(a>=24))throw new o("UNSUPPORTED_OPERATION","Web automation requires Node 24 or newer.",{currentNode:process.version,requiredNodeMajor:24,hint:"Run agent-device with Node 24+ for web setup and web automation."});let c=await l({lockDirPath:r.join(n.installDir,"..",".agent-browser-install.lock"),owner:{pid:process.pid,startTime:s(process.pid),acquiredAtMs:Date.now()},timeoutMs:3e5,description:"managed agent-browser setup"});try{let n=S(t);if(n.installed)return n;return e.mkdirSync(n.installDir,{recursive:!0}),await h(n),await v(n,["install"],{timeoutMs:3e5}),await v(n,["doctor","--offline","--quick"],{timeoutMs:6e4}),i=n,e.writeFileSync(r.join(i.installDir,"manifest.json"),JSON.stringify({package:p,version:d,node:process.version,installedAt:new Date().toISOString()},null,2),"utf8"),S(t)}finally{await c()}}async function y(e){let r=S(e);if(!r.installed)throw g(r);let t=await v(r,["doctor","--offline","--quick"],{timeoutMs:6e4,allowFailure:!0});return{status:r,...t}}function S(i){var o,a,s;let c,u,l=i.stateDir??process.env.AGENT_DEVICE_STATE_DIR??r.join(process.env.HOME??process.cwd(),".agent-device"),m=r.join(l,"tools","agent-browser",d),p=(o=m,c=r.join(o,"package"),r.join(c,"node_modules",".bin","win32"===process.platform?"agent-browser.cmd":"agent-browser")),w=r.join(m,"home"),f=function(e){if("win32"===process.platform)return r.join(e,"home");let i=t.createHash("sha1").update(e).digest("hex").slice(0,12);return r.join(n.tmpdir(),"agent-device-web",i)}(m),y=(a=m,u=t.createHash("sha1").update(a).digest("hex").slice(0,12),r.join(n.tmpdir(),"adw",u)),S=function(r){try{return e.accessSync(r,e.constants.X_OK),!0}catch{return!1}}(p)&&(s=m,e.existsSync(r.join(s,"manifest.json"))),h=Number.parseInt(process.versions.node.split(".")[0]??"0",10);return{version:d,stateDir:l,installDir:m,binaryPath:p,homeDir:w,runtimeHomeDir:f,socketDir:y,installed:S,nodeMajor:h,nodeSupported:h>=24}}async function h(t){let n=r.join(t.installDir,"package");e.mkdirSync(n,{recursive:!0}),await u("npm",["install","--prefix",n,"--no-audit","--no-fund","--no-save",`${p}@${d}`],{env:process.env,timeoutMs:3e5})}async function v(e,r,t){return await u(e.binaryPath,r,{allowFailure:t.allowFailure,env:D(e,process.env),timeoutMs:t.timeoutMs})}function D(t,n){return e.mkdirSync(t.homeDir,{recursive:!0}),function(t){if(t.runtimeHomeDir!==t.homeDir){e.mkdirSync(r.dirname(t.runtimeHomeDir),{recursive:!0});try{let r=e.lstatSync(t.runtimeHomeDir);if(r.isSymbolicLink()&&e.readlinkSync(t.runtimeHomeDir)===t.homeDir||r.isDirectory())return;r.isSymbolicLink()&&e.unlinkSync(t.runtimeHomeDir)}catch(e){var n;if(!("object"==typeof(n=e)&&null!==n&&"code"in n&&"ENOENT"===n.code))throw e}try{e.symlinkSync(t.homeDir,t.runtimeHomeDir,"dir")}catch{e.mkdirSync(t.runtimeHomeDir,{recursive:!0})}}}(t),e.mkdirSync(t.socketDir,{recursive:!0}),{...n,HOME:t.runtimeHomeDir,AGENT_BROWSER_SOCKET_DIR:t.socketDir}}function g(e){return new o("TOOL_MISSING","Managed web browser backend is not installed.",{version:d,installDir:e.installDir,hint:!1===e.nodeSupported?`Web automation requires Node 24+; current Node is ${process.version}.`:"Run `agent-device web setup` to install the managed web backend."})}function M(e){let r=i(e);return"TOOL_MISSING"!==r.code?r:new o(r.code,r.message,{...r.details??{},hint:"string"==typeof r.details?.hint?r.details.hint:"Run `agent-device web setup` to install the managed web backend."})}export{l as acquireProcessLock,y as doctorManagedAgentBrowser,M as mapManagedAgentBrowserError,w as resolveAgentBrowserTool,f as setupManagedAgentBrowser};
@@ -0,0 +1,2 @@
1
+ import{createHash as e}from"node:crypto";import t from"node:fs";import r from"node:path";import{fileURLToPath as n}from"node:url";import{runCmdDetached as i}from"./8875.js";import{readProcessCommand as o,waitForProcessExit as a,isProcessAlive as s,readProcessStartTime as l}from"./9414.js";import{normalizeBaseUrl as c,METRO_COMPANION_RUN_ARG as d,ENV_COMPANION_TUNNEL_BEARER_TOKEN as u,ENV_COMPANION_TUNNEL_SERVER_BASE_URL as p,ENV_COMPANION_TUNNEL_STATE_PATH as h,ENV_COMPANION_TUNNEL_SCOPE_RUN_ID as m,ENV_COMPANION_TUNNEL_LAUNCH_URL as f,ENV_COMPANION_TUNNEL_REGISTER_PATH as g,ENV_COMPANION_TUNNEL_SCOPE_LEASE_ID as P,ENV_COMPANION_TUNNEL_SCOPE_TENANT_ID as y,ENV_COMPANION_TUNNEL_DEVICE_PORT as v,ENV_COMPANION_TUNNEL_SESSION as S,ENV_COMPANION_TUNNEL_LOCAL_BASE_URL as U,ENV_COMPANION_TUNNEL_UNREGISTER_PATH as I}from"./4917.js";let b="companion-tunnel";function k(t){return e("sha256").update(t).digest("hex")}function w(e){return e?.trim()?e.trim():void 0}function B(e,t,n,i){let o=i??r.join(e,".agent-device");if(!n)return{statePath:r.join(o,`${t.slug}.json`),logPath:r.join(o,`${t.slug}.log`)};let a=k(n).slice(0,12),s=r.join(o,t.slug);return{statePath:r.join(s,`${t.slug}-${a}.json`),logPath:r.join(s,`${t.slug}-${a}.log`)}}function j(e){try{let r=JSON.parse(t.readFileSync(e,"utf8"));if(!Number.isInteger(r.pid)||0>=Number(r.pid)||"string"!=typeof r.serverBaseUrl||"string"!=typeof r.localBaseUrl||"string"!=typeof r.tokenHash||0===r.tokenHash.length)return null;let n=Array.isArray(r.consumers)?r.consumers.filter(e=>"string"==typeof e&&e.length>0):[];return{pid:Number(r.pid),startTime:"string"==typeof r.startTime?r.startTime:void 0,command:"string"==typeof r.command?r.command:void 0,serverBaseUrl:r.serverBaseUrl,localBaseUrl:r.localBaseUrl,launchUrl:w("string"==typeof r.launchUrl?r.launchUrl:void 0),registerPath:w("string"==typeof r.registerPath?r.registerPath:void 0),unregisterPath:w("string"==typeof r.unregisterPath?r.unregisterPath:void 0),devicePort:Number.isInteger(r.devicePort)?Number(r.devicePort):void 0,session:w("string"==typeof r.session?r.session:void 0),bridgeScope:function(e){if(!(!e||"object"!=typeof e||Array.isArray(e))&&"string"==typeof e.tenantId&&"string"==typeof e.runId&&"string"==typeof e.leaseId)return{tenantId:e.tenantId,runId:e.runId,leaseId:e.leaseId}}(r.bridgeScope),tokenHash:r.tokenHash,consumers:n}}catch{return null}}function _(e,n){t.mkdirSync(r.dirname(e),{recursive:!0}),t.writeFileSync(e,`${JSON.stringify(n,null,2)}
2
+ `,"utf8")}function N(e){try{let r=t.readdirSync(e);0===r.length&&t.rmdirSync(e)}catch{}}function $(e,n){let i=r.dirname(e.statePath),o=r.dirname(e.logPath);var a=e.statePath;try{t.unlinkSync(a)}catch{}var s=e.logPath;try{t.unlinkSync(s)}catch{}N(i),o!==i&&N(o),r.basename(i)===n.slug&&N(r.dirname(i))}function C(e,t){return e.includes(t.runArg)}function E(e){return w(e.consumerKey)??w(e.profileKey)??null}function K(e,t){return!t||e.consumers.includes(t)?e:{...e,consumers:[...e.consumers,t]}}async function R(e,t){if(!s(e.pid))return;let r=o(e.pid);if(r&&C(r,t)){try{process.kill(e.pid,"SIGTERM")}catch(t){let e=t.code;if("ESRCH"===e||"EPERM"===e)return;throw t}if(!await a(e.pid,1e3)){try{process.kill(e.pid,"SIGKILL")}catch(t){let e=t.code;if("ESRCH"===e||"EPERM"===e)return;throw t}await a(e.pid,1e3)}}}async function T(e){var a;let d,N=E(e),T=B(e.projectRoot,e.definition,e.profileKey,e.stateDir),H=j(T.statePath);if(H&&function(e,t){var r,n;if(!s(e.pid))return!1;if(e.startTime){let t=l(e.pid);if(!t||t!==e.startTime)return!1}let i=o(e.pid);return!!i&&!!C(i,t.definition)&&!!e.bridgeScope&&e.serverBaseUrl===c(t.serverBaseUrl)&&e.localBaseUrl===c(t.localBaseUrl)&&e.launchUrl===w(t.launchUrl)&&e.registerPath===w(t.registerPath)&&e.unregisterPath===w(t.unregisterPath)&&e.devicePort===t.devicePort&&e.session===w(t.session)&&(r=e.bridgeScope,n=t.bridgeScope,r.tenantId===n.tenantId&&r.runId===n.runId&&r.leaseId===n.leaseId)&&e.tokenHash===k(t.bearerToken)}(H,e)){let e=K(H,N);return e!==H&&_(T.statePath,e),{pid:H.pid,spawned:!1,statePath:T.statePath,logPath:T.logPath}}H&&(await R(H,e.definition),$(T,e.definition)),a=T.statePath,t.mkdirSync(r.dirname(a),{recursive:!0}),t.closeSync(t.openSync(a,"a"));try{d=function(e,a){let s=function(e){let i=n(import.meta.url),o=r.extname(i)||".js",a=[r.join(r.dirname(i),`${b}${o}`),r.join(r.dirname(i),"internal",`${b}${o}`)].find(e=>t.existsSync(e));if(!a)throw Error(`${e.displayName} entrypoint not found. Rebuild the package to include the companion worker entry.`);return a}(e.definition),d=s.endsWith(".ts")?["--experimental-strip-types"]:[];t.mkdirSync(r.dirname(a),{recursive:!0});let j=t.openSync(a,"a"),_=0;try{let t;_=i(process.execPath,[...d,s,e.definition.runArg],{env:((t={...e.env??process.env})[p]=c(e.serverBaseUrl),t[u]=e.bearerToken,t[U]=c(e.localBaseUrl),t[h]=B(e.projectRoot,e.definition,e.profileKey,e.stateDir).statePath,t[y]=e.bridgeScope.tenantId,t[m]=e.bridgeScope.runId,t[P]=e.bridgeScope.leaseId,e.launchUrl?.trim()?t[f]=e.launchUrl.trim():delete t[f],e.registerPath?.trim()?t[g]=e.registerPath.trim():delete t[g],e.unregisterPath?.trim()?t[I]=e.unregisterPath.trim():delete t[I],void 0!==e.devicePort?t[v]=String(e.devicePort):delete t[v],e.session?.trim()?t[S]=e.session.trim():delete t[S],t),stdio:["ignore",j,j]})}finally{t.closeSync(j)}if(!Number.isInteger(_)||_<=0)throw Error(`Failed to start ${e.definition.displayName} process.`);return{pid:_,startTime:l(_)??void 0,command:o(_)??void 0,serverBaseUrl:c(e.serverBaseUrl),localBaseUrl:c(e.localBaseUrl),launchUrl:w(e.launchUrl),registerPath:w(e.registerPath),unregisterPath:w(e.unregisterPath),devicePort:e.devicePort,session:w(e.session),bridgeScope:e.bridgeScope,tokenHash:k(e.bearerToken),consumers:[]}}(e,T.logPath),_(T.statePath,K(d,N))}catch(t){throw d&&await R(d,e.definition).catch(()=>{}),$(T,e.definition),t}return{pid:d.pid,spawned:!0,statePath:T.statePath,logPath:T.logPath}}async function H(e){let t=E(e),r=B(e.projectRoot,e.definition,e.profileKey,e.stateDir),n=j(r.statePath);if(!n)return $(r,e.definition),{stopped:!1,statePath:r.statePath};let i=t?{...n,consumers:n.consumers.filter(e=>e!==t)}:{...n,consumers:[]};return i.consumers.length>0?(_(r.statePath,i),{stopped:!1,statePath:r.statePath}):(await R(n,e.definition),$(r,e.definition),{stopped:!0,statePath:r.statePath})}let A={slug:"metro-companion",runArg:d,displayName:"Metro companion"};async function M(e){return await T({...e,definition:A,registerPath:e.registerPath??"/api/metro/companion/register"})}async function x(e){return await H({...e,definition:A})}export{T as ensureCompanionTunnel,M as ensureMetroCompanion,H as stopCompanionTunnel,x as stopMetroCompanion};
@@ -0,0 +1,2 @@
1
+ import e from"node:os";import t from"node:path";import{promises as i}from"node:fs";import{runXcrun as n,IOS_DEVICECTL_DEFAULT_HINT as r,prewarmAppleRunnerCache as o,resolveIosDevicectlHint as a,isActiveProviderDevice as s,context_contextFromFlags as d}from"./9722.js";import{isDeepLinkTarget as c}from"./3340.js";import{AppError as l}from"./485.js";function u(e){let{req:t,logPath:i,traceLogPath:n}=e;return{verbose:t.flags?.verbose,logPath:i,traceLogPath:n,requestId:t.meta?.requestId,iosXctestrunFile:t.flags?.iosXctestrunFile,iosXctestDerivedDataPath:t.flags?.iosXctestDerivedDataPath,iosXctestEnvDir:t.flags?.iosXctestEnvDir}}function f(e){let{req:t,logPath:i,appBundleId:n,traceLogPath:r}=e;return{...u({req:t,logPath:i,traceLogPath:r}),runnerLeaseContext:d(i,t.flags,n,r,t.meta?.requestId,t.meta).runnerLeaseContext}}function p(e){let{req:t,logPath:i,device:n,traceLogPath:r,enabled:a}=e;if(a&&"ios"===n.platform&&"simulator"===n.kind)return e=>o(e,u({req:t,logPath:i,traceLogPath:r}))}function m(e){let{req:t,logPath:i,device:n,surface:r,openTarget:o,traceLogPath:a}=e;return p({req:t,logPath:i,device:n,traceLogPath:a,enabled:"app"===r&&!!o&&!c(o??"")})}let v=new Map;async function S(e,t={}){var i;let n;if(s(e))return;let r=(n="simulator"===(i=e).kind?i.simulatorSetPath??"":"",JSON.stringify([i.platform,i.kind,i.id,i.target??"",n])),o=v.get(r);if(void 0!==o){if(o>Date.now()&&!t.focusExisting)return;v.delete(r)}if("ios"===e.platform){if("simulator"===e.kind){let{ensureBootedSimulator:i}=await import("./simulator.js");await i(e,{deviceHub:t.deviceHub,focusExisting:t.focusExisting,onColdBootStart:t.onIosSimulatorColdBootStart}),_(r);return}if("device"===e.kind){await w(e.id),_(r);return}}if("android"===e.platform){let{waitForAndroidBoot:t}=await import("./3340.js");await t(e.id),_(r)}}function _(e){v.set(e,Date.now()+5e3)}async function w(r){let o=t.join(e.tmpdir(),`agent-device-ready-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}.json`),a=Math.max(1,Math.ceil(15));try{let e=await n(["devicectl","device","info","details","--device",r,"--json-output",o,"--timeout",String(a)],{allowFailure:!0,timeoutMs:18e3}),t=String(e.stdout??""),i=String(e.stderr??""),s=await h(o);if(0===e.exitCode){if(!s.parsed)throw new l("COMMAND_FAILED","iOS device readiness probe failed",{kind:"probe_inconclusive",deviceId:r,stdout:t,stderr:i,hint:"CoreDevice returned success but readiness JSON output was missing or invalid. Retry; if it persists restart Xcode and the iOS device."});let e=s?.tunnelState?.toLowerCase();if("connecting"===e)throw new l("COMMAND_FAILED","iOS device is not ready for automation",{kind:"not_ready",deviceId:r,tunnelState:e,hint:"Device tunnel is still connecting. Keep the device unlocked and connected by cable until it is fully available in Xcode Devices, then retry."});return}throw new l("COMMAND_FAILED","iOS device is not ready for automation",{kind:"not_ready",deviceId:r,stdout:t,stderr:i,exitCode:e.exitCode,tunnelState:s?.tunnelState,hint:C(t,i)})}catch(e){if(e instanceof l&&"COMMAND_FAILED"===e.code){if("not_ready"===("string"==typeof e.details?.kind?e.details.kind:""))throw e;let t=e.details??{},i=String(t.stdout??""),n=String(t.stderr??""),o=Number(t.timeoutMs??15e3),a=`CoreDevice did not respond within ${o}ms. Keep the device unlocked and trusted, then retry; if it persists restart Xcode and the iOS device.`;throw new l("COMMAND_FAILED","iOS device readiness probe failed",{deviceId:r,cause:e.message,timeoutMs:o,stdout:i,stderr:n,hint:i||n?C(i,n):a},e)}throw new l("COMMAND_FAILED","iOS device readiness probe failed",{deviceId:r,hint:"Reconnect the device, keep it unlocked, and retry."},e instanceof Error?e:void 0)}finally{await i.rm(o,{force:!0}).catch(()=>{})}}async function h(e){try{let t=await i.readFile(e,"utf8"),n=JSON.parse(t),r=function(e){let t=e?.result;if(!t||"object"!=typeof t)return{};let i=t.connectionProperties?.tunnelState,n=t.device?.connectionProperties?.tunnelState,r="string"==typeof i?i:"string"==typeof n?n:void 0;return r?{tunnelState:r}:{}}(n);return{parsed:!0,tunnelState:r.tunnelState}}catch{return{parsed:!1}}}function C(e,t){let i=a(e,t);return i||(`${e}
2
+ ${t}`.toLowerCase().includes("timed out waiting for all destinations")?"Xcode destination did not become available in time. Keep device unlocked and retry.":r)}export{u as buildAppleRunnerRequestOptions,f as buildAppleRunnerSessionOptions,m as createAppleRunnerCacheColdBootPrewarmForOpen,p as createAppleRunnerCachePrewarmOnColdBoot,S as ensureDeviceReady};