agent-device 0.20.7 → 0.20.9

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 (209) hide show
  1. package/README.md +94 -31
  2. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.20.7.apk → agent-device-android-ime-helper-0.20.9.apk} +0 -0
  3. package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.9.apk.sha256 +1 -0
  4. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.20.7.manifest.json → agent-device-android-ime-helper-0.20.9.manifest.json} +4 -4
  5. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.20.7.apk → agent-device-android-snapshot-helper-0.20.9.apk} +0 -0
  6. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.9.apk.sha256 +1 -0
  7. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.20.7.manifest.json → agent-device-android-snapshot-helper-0.20.9.manifest.json} +6 -6
  8. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.h +3 -0
  9. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.m +13 -7
  10. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AXSnapshotFallback.swift +4 -112
  11. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +5 -1
  12. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+FlatSnapshotFiltering.swift +9 -1
  13. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+PrivateAXPresentation.swift +90 -0
  14. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+RecordingTests.swift +4 -0
  15. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Snapshot.swift +46 -10
  16. package/dist/src/agent-browser-tool.js +1 -1
  17. package/dist/src/agent-device-client.js +2 -2
  18. package/dist/src/android-adb.d.ts +5 -5
  19. package/dist/src/android-adb.js +1 -1
  20. package/dist/src/android.js +1 -1
  21. package/dist/src/app-helpers.js +1 -1
  22. package/dist/src/app-lifecycle.js +6 -7
  23. package/dist/src/app-lifecycle2.js +2 -2
  24. package/dist/src/app-log-reconnect.js +1 -1
  25. package/dist/src/app-log-runtime.js +3 -3
  26. package/dist/src/app-resolution.js +2 -2
  27. package/dist/src/app-state.js +2 -0
  28. package/dist/src/appearance.js +1 -0
  29. package/dist/src/apps.js +5 -5
  30. package/dist/src/artifacts.d.ts +1 -1
  31. package/dist/src/audio-probe.js +1 -1
  32. package/dist/src/backend-snapshot-options.js +1 -0
  33. package/dist/src/boot-diagnostics.js +2 -2
  34. package/dist/src/bounds.js +1 -0
  35. package/dist/src/byte-limit-stream.js +1 -0
  36. package/dist/src/cancel.js +1 -0
  37. package/dist/src/cli-config.js +1 -1
  38. package/dist/src/cli-help.js +25 -20
  39. package/dist/src/cli.js +6 -6
  40. package/dist/src/client-metro.js +1 -1
  41. package/dist/src/command-catalog.js +1 -0
  42. package/dist/src/command-metadata.js +1 -1
  43. package/dist/src/command-schema.js +1 -1
  44. package/dist/src/command-surface.js +1 -1
  45. package/dist/src/config.js +1 -0
  46. package/dist/src/connection-runtime.js +1 -1
  47. package/dist/src/connection.js +3 -3
  48. package/dist/src/contracts.js +1 -1
  49. package/dist/src/debug-symbols.js +1 -1
  50. package/dist/src/device-claim-inspection.js +1 -1
  51. package/dist/src/device-input-state.js +1 -1
  52. package/dist/src/device-ready.js +1 -0
  53. package/dist/src/device2.js +2 -2
  54. package/dist/src/dispatch.js +1 -0
  55. package/dist/src/entities.js +1 -1
  56. package/dist/src/find.js +1 -1
  57. package/dist/src/finders.js +1 -1
  58. package/dist/src/generic-settle.js +1 -1
  59. package/dist/src/generic.js +1 -1
  60. package/dist/src/handler-utils.js +1 -0
  61. package/dist/src/harmonyos.js +1 -1
  62. package/dist/src/hdc.js +1 -0
  63. package/dist/src/helper-package-install.js +1 -0
  64. package/dist/src/helper.js +2 -2
  65. package/dist/src/host-process.js +3 -2
  66. package/dist/src/ime-lifecycle.js +2 -9
  67. package/dist/src/ime-recovery-marker.js +1 -0
  68. package/dist/src/index.d.ts +35 -26
  69. package/dist/src/index.js +1 -1
  70. package/dist/src/input-actions.js +3 -3
  71. package/dist/src/input-actions2.js +1 -1
  72. package/dist/src/input-actions3.js +1 -1
  73. package/dist/src/install-artifact.js +1 -1
  74. package/dist/src/install-artifact2.js +1 -1
  75. package/dist/src/install-source2.js +1 -1
  76. package/dist/src/interaction-common.js +1 -0
  77. package/dist/src/interaction-runtime.js +1 -1
  78. package/dist/src/interaction-snapshot.js +1 -1
  79. package/dist/src/interaction.js +1 -1
  80. package/dist/src/interaction2.js +1 -0
  81. package/dist/src/interactor.js +2 -2
  82. package/dist/src/interactor2.js +1 -1
  83. package/dist/src/interactors.js +1 -0
  84. package/dist/src/internal/bin.js +1 -1
  85. package/dist/src/internal/daemon.js +4 -29
  86. package/dist/src/internal/png-worker.js +1 -1
  87. package/dist/src/inventory.js +1 -1
  88. package/dist/src/inventory2.js +1 -1
  89. package/dist/src/keyed-lock.js +1 -0
  90. package/dist/src/lease-context.js +1 -1
  91. package/dist/src/lease.js +1 -1
  92. package/dist/src/limrun-runtime-dependencies.js +1 -1
  93. package/dist/src/limrun.d.ts +3 -1
  94. package/dist/src/limrun.js +1 -1
  95. package/dist/src/linux.js +1 -1
  96. package/dist/src/location-coordinates.js +1 -0
  97. package/dist/src/logcat.js +1 -1
  98. package/dist/src/manifest.js +1 -1
  99. package/dist/src/observability.js +1 -0
  100. package/dist/src/output-path.js +1 -0
  101. package/dist/src/owner-identity.js +1 -1
  102. package/dist/src/perf.js +4 -0
  103. package/dist/src/physical-device-control.js +1 -1
  104. package/dist/src/platform-runtime-app-log-process.js +1 -1
  105. package/dist/src/platform-runtime-host.js +1 -1
  106. package/dist/src/platform-runtime-open-target.js +1 -0
  107. package/dist/src/platform-runtime-operation-host.js +4 -4
  108. package/dist/src/platform-runtime-runtime-hints.js +2 -0
  109. package/dist/src/platform-runtime-screen-recording-android-host.js +1 -0
  110. package/dist/src/platform-runtime-screen-recording-apple-host.js +1 -0
  111. package/dist/src/platform-runtime-screen-recording-apple-runner-host.js +1 -0
  112. package/dist/src/platform-runtime-screen-recording-apple-runner-transport.js +1 -0
  113. package/dist/src/platform-runtime-screen-recording-apple-simulator-host.js +1 -0
  114. package/dist/src/platform-runtime-screen-recording-apple-transport.js +1 -0
  115. package/dist/src/platform-runtime-screen-recording-finalizer-host.js +1 -0
  116. package/dist/src/platform-runtime-screen-recording-harmony-host.js +1 -0
  117. package/dist/src/platform-runtime-screen-recording-output-host.js +1 -0
  118. package/dist/src/platform-runtime-screen-recording-web-host.js +1 -0
  119. package/dist/src/platform-runtime.js +1 -1
  120. package/dist/src/platform-runtime2.js +1 -0
  121. package/dist/src/plist.js +1 -1
  122. package/dist/src/png-resize.js +1 -0
  123. package/dist/src/png-worker-contract.js +1 -1
  124. package/dist/src/prepare-kind.js +13 -13
  125. package/dist/src/process-lock.js +1 -1
  126. package/dist/src/project-runtime.js +1 -0
  127. package/dist/src/provider-webdriver.js +1 -1
  128. package/dist/src/provider.js +1 -1
  129. package/dist/src/proxy.js +1 -1
  130. package/dist/src/react-native.js +1 -1
  131. package/dist/src/record-runtime.js +1 -0
  132. package/dist/src/record-trace.js +1 -1
  133. package/dist/src/recording-export-quality.js +1 -0
  134. package/dist/src/recording-telemetry.js +1 -0
  135. package/dist/src/registry.js +29 -26
  136. package/dist/src/replay.js +2 -2
  137. package/dist/src/reporting.js +3 -3
  138. package/dist/src/rolldown-runtime.js +1 -0
  139. package/dist/src/runner-client.js +1 -1
  140. package/dist/src/runner-disposal.js +1 -1
  141. package/dist/src/runner-lease.js +1 -1
  142. package/dist/src/runner-sequence.js +1 -1
  143. package/dist/src/runtime-transport.js +1 -1
  144. package/dist/src/runtime.js +3 -3
  145. package/dist/src/runtime2.js +4 -3
  146. package/dist/src/runtime3.js +1 -3
  147. package/dist/src/runtime4.js +3 -1
  148. package/dist/src/runtime5.js +1 -1
  149. package/dist/src/runtime6.js +1 -1
  150. package/dist/src/runtime7.js +1 -1
  151. package/dist/src/runtime8.js +1 -0
  152. package/dist/src/runtime9.js +1 -0
  153. package/dist/src/scoped-provider.js +1 -0
  154. package/dist/src/screenshot-density.js +1 -0
  155. package/dist/src/screenshot-geometry.js +1 -0
  156. package/dist/src/screenshot-result.js +4 -4
  157. package/dist/src/screenshot.js +1 -1
  158. package/dist/src/sdk-android-adb.d.ts +20 -2
  159. package/dist/src/sdk-android-adb.js +4 -4
  160. package/dist/src/sdk-batch-runner.js +3 -3
  161. package/dist/src/sdk-contracts.d.ts +3 -3
  162. package/dist/src/sdk-contracts.js +2 -2
  163. package/dist/src/sdk-device.js +1 -1
  164. package/dist/src/sdk-finders.js +1 -1
  165. package/dist/src/sdk-io.js +1 -1
  166. package/dist/src/sdk-selectors.d.ts +24 -20
  167. package/dist/src/sdk-selectors.js +1 -1
  168. package/dist/src/sdk.js +1 -0
  169. package/dist/src/selector-runtime.js +1 -1
  170. package/dist/src/selectors.d.ts +1 -1
  171. package/dist/src/selectors.js +1 -1
  172. package/dist/src/server.js +2 -2
  173. package/dist/src/session-target-evidence.js +1 -1
  174. package/dist/src/session.js +1 -30
  175. package/dist/src/session2.js +28 -0
  176. package/dist/src/setting-state.js +1 -1
  177. package/dist/src/shared.js +1 -1
  178. package/dist/src/simctl.js +1 -0
  179. package/dist/src/simulator-state.js +1 -0
  180. package/dist/src/simulator.js +1 -1
  181. package/dist/src/snapshot-runtime.js +1 -1
  182. package/dist/src/snapshot-session.js +1 -1
  183. package/dist/src/snapshot.js +8 -1
  184. package/dist/src/snapshot2.js +1 -1
  185. package/dist/src/snapshot3.js +1 -0
  186. package/dist/src/src.js +1 -1
  187. package/dist/src/src2.js +1 -2
  188. package/dist/src/src3.js +2 -1
  189. package/dist/src/string-enum.js +1 -0
  190. package/dist/src/tool-provider.js +3 -3
  191. package/dist/src/tool-provider2.js +1 -1
  192. package/dist/src/update-check.js +1 -1
  193. package/dist/src/verdict.js +1 -0
  194. package/dist/src/verified-file.js +1 -0
  195. package/dist/src/version.js +1 -1
  196. package/dist/src/video.js +23 -0
  197. package/package.json +8 -6
  198. package/server.json +3 -3
  199. package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.7.apk.sha256 +0 -1
  200. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.7.apk.sha256 +0 -1
  201. package/dist/src/context.js +0 -1
  202. package/dist/src/interaction-touch-reference-frame.js +0 -1
  203. package/dist/src/notifications.js +0 -1
  204. package/dist/src/platform-runtime-toolchain-host.js +0 -1
  205. package/dist/src/runner-provider.js +0 -1
  206. package/dist/src/text-surface.js +0 -1
  207. package/dist/src/tool-provider3.js +0 -1
  208. package/skills/agent-device/SKILL.md +0 -20
  209. package/skills/dogfood/SKILL.md +0 -27
@@ -1 +1 @@
1
- import{i as e}from"./src2.js";const t=Object.freeze({available:!1,reason:`unsupported-platform-leaf`});function n(){return e(`linux`,{appLog:t,network:t})}export{n as createLinuxPlatformRuntime};
1
+ import{C as e}from"./sdk-contracts.js";import{c as t}from"./sdk-device.js";import{n,t as r}from"./simulator-state.js";const i=15e3;function a(e){return Object.freeze({canShutdownTarget:o,shutdownTarget:async(t,n)=>await s(e.appleTools,t,n)})}function o(e){return t(e)&&e.appleOs!==`watchos`&&e.kind===`simulator`}async function s(t,r,a){if(r.booted===!1)return u();a.throwIfAborted();try{let e=await t.run({tool:`simctl`,args:n(r,[`shutdown`,r.id]),allowFailure:!0,timeoutMs:i},a);a.throwIfAborted();let o=l(e);return o.success?o:await c(t,r,a)===`Shutdown`?{...o,success:!0,exitCode:0}:o}catch(t){a.throwIfAborted();let n=e(t);return{success:!1,exitCode:-1,stdout:``,stderr:n.message,error:n}}}async function c(e,t,n){try{return await r(e,t,n,i)}catch{return n.throwIfAborted(),null}}function l(e){let t=e.exitCode??-1;return{success:t===0,exitCode:t,stdout:e.stdout,stderr:e.stderr}}function u(){return{success:!0,exitCode:0,stdout:``,stderr:``}}export{a as createAppleShutdownRuntime};
@@ -1 +1 @@
1
- import{i as e}from"./src2.js";const t=Object.freeze({available:!1,reason:`unsupported-platform-leaf`});function n(){return e(`vega`,{appLog:t,network:t})}export{n as createVegaPlatformRuntime};
1
+ import{_ as e}from"./sdk-contracts.js";import{R as t,at as n,bt as r,dt as i,et as a,ot as o,tt as s,z as c}from"./sdk-batch-runner.js";import{C as l}from"./sdk-device.js";import{a as u,d,f,o as p,p as m,v as h,x as g}from"./src3.js";import{randomUUID as _}from"node:crypto";import{setTimeout as ee}from"node:timers/promises";const v=Object.freeze({resourceKind:s,version:1,encode:e=>({...e}),decode:e=>e.transport!==`harmony-hilog`||!y(e.outputPath)||!y(e.pidPath)?{status:`invalid`,message:`Invalid HarmonyOS app-log descriptor`}:{status:`decoded`,descriptor:Object.freeze({transport:`harmony-hilog`,outputPath:e.outputPath,pidPath:e.pidPath})}});function te(e){return h({resourceKind:s,sessionId:e.sessionId,device:{id:e.device.id,family:`harmonyos`,kind:e.device.kind,...e.device.target===void 0?{}:{target:e.device.target}},owner:e.owner,fence:e.fence,lifecycle:`open`,descriptor:g(v,e.descriptor)})}function y(e){return typeof e==`string`&&e.trim().length>0}function b(e){return u(e,{family:`harmonyos`,backend:`harmonyos`,label:`HarmonyOS`,codec:v,startUnavailableHint:`The selected HarmonyOS transport cannot start a background hilog stream.`,cleanupFailureMessage:`HarmonyOS app-log cleanup did not settle every owned resource`,doctor:async(e,t)=>({backend:`harmonyos`,checks:{},notes:t?[]:[`No app bundle is tracked in this session. Run open <app> first for app-scoped logs.`]}),process:async({host:e,device:t,input:n,signal:r})=>{let i=await x(e,r);return{resolvePid:async r=>await p(e,{executable:i,args:[`-t`,t.id,`shell`,`pidof`,n.appBundleId],allowFailure:!0,timeoutMs:5e3},r),command:e=>({kind:`host`,request:{executable:i,args:[`-t`,t.id,`shell`,`hilog`,`-P`,e],allowFailure:!0}})}},descriptor:({artifacts:e})=>({transport:`harmony-hilog`,...e}),envelope:({input:e,device:t,owner:n,descriptor:r})=>te({sessionId:e.sessionId,device:t,owner:n,fence:e.fence,descriptor:r})})}async function x(t,n){n.throwIfAborted(),await S(async()=>await t.toolchains.prepare(`harmonyos`),n),n.throwIfAborted();let r=await S(async()=>await t.commands.which(`hdc`),n);if(n.throwIfAborted(),!r)throw new e(`TOOL_MISSING`,`hdc not found in PATH`,{hint:`Install HarmonyOS Command Line Tools, then add its sdk/default/openharmony/toolchains directory to PATH.`});return r}async function S(e,t){try{return await e()}catch(e){throw t.throwIfAborted(),e}}const C=Object.freeze({resourceKind:a,version:1,encode:e=>({...e}),decode:e=>e.backend===`harmony-screen-recorder`&&typeof e.fileName==`string`&&ne(e.fileName)&&e.remotePath===`/data/local/tmp/${e.fileName}`?{status:`decoded`,descriptor:Object.freeze({backend:`harmony-screen-recorder`,fileName:e.fileName,remotePath:e.remotePath})}:{status:`invalid`,message:`Invalid HarmonyOS screen-recording descriptor`}});function w(e){let{device:t,owner:n,input:r,descriptor:i}=e;return h({resourceKind:a,sessionId:r.sessionId,device:l(t),owner:n,fence:r.fence,lifecycle:`open`,descriptor:g(C,i)})}function T(e){return C.decode(e).status===`decoded`?{status:`cleanup-pending`,reason:`manual-recovery-required`,message:`HarmonyOS recorder ownership cannot be proven after daemon restart; no recorder was stopped.`}:{status:`cleanup-pending`,reason:`manual-recovery-required`}}function ne(e){return/^agent-device-recording-[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}\.mp4$/i.test(e)}function E(e){return e.kind===`device`?Object.freeze({available:!0}):Object.freeze({available:!1,reason:`unsupported-device-kind`,hint:`HarmonyOS recording is supported on physical devices only.`})}function re(e){let{host:t,device:n,owner:r,signal:i}=e;return Object.freeze({screenRecordingStart:async e=>await ie({host:t,device:n,owner:r,input:e,signal:i}),screenRecordingReattach:async()=>({status:`unreattachable`,reason:`transport-not-reattachable`,message:`HarmonyOS recordings cannot be reattached after daemon restart.`}),screenRecordingCleanup:async e=>T(e.envelope.descriptor.body)})}async function ie(t){let{host:n,device:r,owner:a,input:o,signal:s}=t;if(o.scope===`app`)throw new e(`INVALID_ARGS`,`HarmonyOS recording captures the whole physical-device screen; use --scope device or --scope system`);d(o,{scopes:[`device`,`system`],fps:!1,exportQuality:!1,hideTouches:!1},e=>`HarmonyOS recordings do not support ${e.join(`, `)}`),s.throwIfAborted(),await n.screenRecording.outputs.prepare(o.outputPath);let c=`agent-device-recording-${_()}.mp4`,l={backend:`harmony-screen-recorder`,fileName:c,remotePath:`/data/local/tmp/${c}`},u;try{u=await n.screenRecording.harmony.start(r,c,s),s.throwIfAborted()}catch(e){throw s.aborted?(await N(n,r,l).catch(()=>{}),s.reason):e}I(u,`start`);try{s.throwIfAborted()}catch(e){throw await N(n,r,l).catch(()=>{}),e}let f=D(o),p=!1,h=async()=>{p||=(I(await n.screenRecording.harmony.stop(r),`stop`),!0)},g=m(f,{finish:async e=>await O(n,r,e,l,h),forceCleanup:async()=>await N(n,r,l,h)});return Object.freeze({pendingHandle:new i(g),envelope:w({device:r,owner:a,input:o,descriptor:l})})}function D(e){return Object.freeze({backend:`HarmonyOS ScreenRecorder`,outPath:e.outputPath,...e.clientOutputPath===void 0?{}:{clientOutPath:e.clientOutputPath},startedAt:Date.now(),scope:e.scope,showTouches:!1,recordOnlySession:e.recordOnlySession,...e.activeSessionApp===void 0?{}:{activeSessionApp:e.activeSessionApp},gestureEvents:[]})}async function O(e,t,n,r,i){await i();let a=await e.screenRecording.harmony.findMedia(t,r.fileName);if(!a)throw Error(`failed to find finalized HarmonyOS recording '${r.fileName}'`);if(!await M(e,t,r,a))throw Error(`failed to finalize HarmonyOS recording: ${r.fileName} did not produce a non-empty media file`);try{if((await e.screenRecording.harmony.pull(t,{remotePath:r.remotePath,outputPath:n.outPath})).exitCode!==0)throw Error(`failed to retrieve HarmonyOS recording`);let i=await e.screenRecording.finalize.complete({outputPath:n.outPath,showTouches:!1,gestureEvents:n.gestureEvents,targetLabel:`HarmonyOS recording`}),o=await k(e,t,r,a);return f(n,{...i,...j(i.warning,o)},!1)}catch(n){throw await e.screenRecording.harmony.remove(t,r.remotePath).catch(()=>{}),n}}async function k(e,t,n,r){let i=[];return await A(()=>e.screenRecording.harmony.remove(t,n.remotePath))||i.push(`staging artifact`),await A(()=>e.screenRecording.harmony.removeMedia(t,r))||i.push(`media-library artifact`),i.length===0?void 0:`HarmonyOS recording completed, but cleanup was not confirmed for the ${i.join(` and `)}.`}async function A(e){try{return await e()}catch{return!1}}function j(e,t){let n=[e,t].filter(e=>e!==void 0).join(` `);return n.length===0?{}:{warning:n}}async function M(e,t,n,r){let i;for(let a=0;a<40;a+=1){if(await e.screenRecording.harmony.remove(t,n.remotePath).catch(()=>{}),await e.screenRecording.harmony.stageMedia(t,{mediaUri:r,remotePath:n.remotePath})){let r=await e.screenRecording.harmony.stagedFileSize(t,n.remotePath);if(r!==void 0&&r>0&&r===i)return!0;i=r!==void 0&&r>0?r:void 0}else i=void 0;a<39&&await e.clock.sleep(250)}return!1}async function N(e,t,n,r=async()=>{I(await e.screenRecording.harmony.stop(t),`stop`)}){let i=[await F(r),await F(async()=>{if(!await e.screenRecording.harmony.remove(t,n.remotePath))throw Error(`HarmonyOS recording staging artifact removal was not confirmed`)}),await F(async()=>await P(e,t,n.fileName))].find(e=>e!==void 0);return i===void 0?{status:`cleaned`}:{status:`cleanup-pending`,reason:`transport-failed`,message:i instanceof Error?i.message:`HarmonyOS recording cleanup failed`}}async function P(e,t,n){let r=await e.screenRecording.harmony.findMedia(t,n);if(r&&!await e.screenRecording.harmony.removeMedia(t,r))throw Error(`HarmonyOS recording media removal was not confirmed`)}async function F(e){try{await e();return}catch(e){return e}}function I(e,t){if(e.exitCode===0&&e.stdout.includes(`start ability successfully`))return;let n=e.stdout.trim()||e.stderr.trim()||`hdc exit ${e.exitCode}`;throw Error(`failed to ${t} HarmonyOS screen recording: ${n}`)}async function L(t,n,r){r.throwIfAborted();let i=await t.run(n,{args:[`shell`,`aa`,`dump`,`-l`],timeoutMs:15e3},r);r.throwIfAborted();let a=R(i.stdout);if(!a)throw new e(`COMMAND_FAILED`,`Could not determine the foreground HarmonyOS app`,{hint:`Open an app on the target, then retry appstate.`});return a}function R(e){let t=e.split(/(?=^\s*Mission ID #)/m);for(let e of t){if(!/\bstate #FOREGROUND\b/.test(e))continue;let t=e.match(/mission name #\[#([^:]+):[^:]*:([^\]]+)]/);if(!t)continue;let[,n,r]=t;if(!(!n||!r))return{package:n,activity:r}}}function z(e){return t({owner:`HarmonyOS`,openTargetIdentity:`bundle-id`,binding:c({device:e.device,signal:e.signal,resolveInteractor:e.host.resolve})})}const B=Object.freeze({available:!0}),V=Object.freeze({available:!1,reason:`unsupported-device-kind`}),H=Object.freeze({available:!1,reason:`unsupported-platform-leaf`});function U(e){let t=e.kind===`emulator`||e.kind===`device`?B:V;return Object.freeze({deployApp:t,materializeAppSource:H,deployMaterializedApp:H,sendPushNotification:H})}function W(e){return U(e.device).deployApp.available?Object.freeze({deployApp:async t=>await G(e.commands,e.device,t,e.signal)}):Object.freeze({})}async function G(t,n,r,i){let a=await K(t,r.appPath,i)??r.app.trim();if(!a)throw new e(`INVALID_ARGS`,`Could not determine the bundle name from the HAP archive`,{hint:`Pass the HarmonyOS bundle name before the HAP path, or provide a valid HAP containing module.json.`});return await Y(t,n,[`install`,`-r`,r.appPath],i,18e4),r.replaceExisting&&(await ee(1e3,void 0,{signal:i}),await q(t,n,a,i)),{packageName:a,launchTarget:a}}async function K(e,t,n){let r=await e.run({executable:`unzip`,args:[`-p`,t,`module.json`],allowFailure:!0,timeoutMs:15e3},n);if(!(r.exitCode!==0||r.stdout.trim().length===0))try{return JSON.parse(r.stdout).app?.bundleName?.trim()||void 0}catch{return}}async function q(t,n,r,i){let a=J((await Y(t,n,[`shell`,`bm`,`dump`,`-n`,r],i)).stdout);if(!a)throw new e(`COMMAND_FAILED`,`Could not determine a launchable ability for ${r}`,{hint:`Check that the HarmonyOS bundle exposes a main ability.`});await Y(t,n,[`shell`,`aa`,`start`,`-b`,r,...a.module?[`-m`,a.module]:[],`-a`,a.ability],i)}function J(e){let t=e.indexOf(`{`);if(t!==-1)try{let n=JSON.parse(e.slice(t)).hapModuleInfos?.find(e=>e.mainElementName);return n?.mainElementName?{ability:n.mainElementName,...n.moduleName?{module:n.moduleName}:{}}:void 0}catch{return}}async function Y(e,t,n,r,i=15e3){return await e.run({executable:`hdc`,args:[`-t`,t.id,...n],timeoutMs:i},r)}const X=r(`harmonyos`),Z=Object.freeze({available:!0}),Q=Object.freeze({available:!1,reason:`unsupported-platform-leaf`}),ae=Object.freeze({available:!1,reason:`unsupported-device-kind`,hint:`HarmonyOS appstate is supported only for HarmonyOS emulators and devices.`}),oe=Object.freeze({available:!1,reason:`unsupported-platform-leaf`,hint:`Apple runner preparation is supported only for Apple targets.`}),$=Object.freeze({available:!0}),se=Object.freeze({available:!1,reason:`unsupported-device-kind`,hint:`open is supported only for HarmonyOS emulators and devices.`}),ce=Object.freeze({available:!1,reason:`unsupported-device-kind`,hint:`close is supported only for HarmonyOS emulators and devices.`}),le=Object.freeze({available:!1,reason:`unsupported-provider-mode`,hint:`Port reverse is supported only by an owning provider runtime.`});function ue(e){let t=de(e),r=fe(e);return n({resolveOpenTarget:t,prepareApplicationOpen:t,openApplication:t,applyRuntimeHints:Q,clearRuntimeHints:Q,closeApplication:r,finalizeApplicationClose:r,prepareAppleRunner:oe,configureProviderPortReverse:le})}function de(e){return e.kind===`emulator`||e.kind===`device`?$:se}function fe(e){return e.kind===`emulator`||e.kind===`device`?$:ce}function pe(e){let t=b(e),n=async e=>{let n=await t.inspectFacts(e),r=U(e),i=E(e);return Object.freeze({device:n.device,operations:{...n.operations,...r,appState:e.kind===`simulator`?ae:Z,networkDump:Q,screenRecordingStart:i,screenRecordingReattach:i,screenRecordingCleanup:i,ensureReady:Z,bootTarget:Q,bootTargetHeadless:Q,listApps:Z,...ue(e),shutdownTarget:Q}})};return Object.freeze({owner:X,ownsDevice:e=>e.platform===`harmonyos`,inspectFacts:n,bind:async r=>{let i=await t.bind(r),a=await n(r.device),s=a.operations.screenRecordingStart;return Object.freeze({device:i.device,owner:X,facts:a,operations:Object.freeze({...i.operations,...W({commands:e.commands,device:r.device,signal:r.scope.signal}),...a.operations.appState.available?{appState:async()=>await L(e.appState.harmonyos,r.device,r.scope.signal)}:{},ensureReady:async()=>({...r.device,booted:!0}),...s.available?re({host:e,device:r.device,owner:X,signal:r.scope.signal}):{},listApps:async t=>await e.appInventory.harmonyos.listApps(t.device,t.filter,r.scope.signal),...o(z({host:e.localInteractors,device:r.device,signal:r.scope.signal}),a.operations)}),[Symbol.asyncDispose]:async()=>await i[Symbol.asyncDispose]()})},shutdown:async()=>await t.shutdown()})}export{pe as createHarmonyPlatformRuntime};
@@ -1 +1 @@
1
- import{_ as e}from"./sdk-contracts.js";import{N as t,R as n}from"./sdk-batch-runner.js";const r=t(`web`),i=Object.freeze({available:!0}),a=Object.freeze({available:!1,reason:`unsupported-platform-leaf`});function o(t){return Object.freeze({owner:r,ownsDevice:e=>e.platform===`web`,bind:async i=>{if(i.intent.kind===`exact-owner`&&!n(i.intent.owner,r))throw new e(`UNSUPPORTED_OPERATION`,`Web runtime owner identity does not match`);if(i.device.platform!==`web`)throw new e(`UNSUPPORTED_PLATFORM`,`Web runtime owner cannot bind ${i.device.platform}`);let a=await t.networkTransports.resolve(i.device);return s(i.device,i.scope.signal,a)},shutdown:async()=>void 0})}function s(e,t,n){let o=Object.freeze({available:!1,reason:`owner-capability-missing`,hint:`network is not supported by this web provider`}),s=n.dump,c=s?{networkDump:async e=>{let n=await s({maxEntries:e.maxEntries,include:e.include},t);return Object.freeze({source:`provider`,...n})}}:{},l=Object.freeze({device:{family:`web`,kind:e.kind,...e.target===void 0?{}:{target:e.target},providerMode:n.mode},operations:{appLogInspect:a,appLogDoctor:a,appLogStart:a,appLogReattach:a,appLogCleanup:a,networkDump:n.dump?i:o}});return Object.freeze({device:e,owner:r,facts:l,operations:Object.freeze(c),[Symbol.asyncDispose]:async()=>void 0})}export{o as createWebPlatformRuntime};
1
+ import{_ as e}from"./sdk-contracts.js";import{R as t,at as n,bt as r,it as i,ot as a,wt as o,z as s}from"./sdk-batch-runner.js";function c(e){return t({owner:`Linux`,openTargetIdentity:`app-name`,binding:s({device:e.device,signal:e.signal,resolveInteractor:e.host.resolve})})}const l=Object.freeze({available:!0}),u=r(`linux`),d=y(`unsupported-platform-leaf`),f=y(`unsupported-platform-leaf`,`Runtime hints are supported only for local iOS-family simulators and Android devices.`),p=y(`unsupported-platform-leaf`,`Apple runner preparation is supported only for Apple targets.`),m=y(`unsupported-provider-mode`,`Port reverse is supported only by an owning provider runtime.`),h=y(`unsupported-device-kind`,`open is supported only for the Linux desktop device.`),g=y(`unsupported-device-kind`,`close is supported only for the Linux desktop device.`);function _(t){return Object.freeze({owner:u,ownsDevice:e=>e.platform===`linux`,inspectFacts:async e=>v(e),bind:async n=>{if(n.intent.kind===`exact-owner`&&!o(n.intent.owner,u))throw new e(`UNSUPPORTED_OPERATION`,`Linux runtime owner identity does not match`);if(n.device.platform!==`linux`)throw new e(`UNSUPPORTED_PLATFORM`,`Linux runtime cannot bind this device`);let r=v(n.device),i=c({host:t.localInteractors,device:n.device,signal:n.scope.signal});return Object.freeze({device:n.device,owner:u,facts:r,operations:Object.freeze(a(i,r.operations)),[Symbol.asyncDispose]:async()=>void 0})},shutdown:async()=>void 0})}function v(e){let t=e.kind===`device`?l:h,r=e.kind===`device`?l:g;return i(e,u,{appLog:d,network:d,readiness:d,lifecycle:n({resolveOpenTarget:t,prepareApplicationOpen:t,openApplication:t,applyRuntimeHints:f,clearRuntimeHints:f,closeApplication:r,finalizeApplicationClose:r,prepareAppleRunner:p,configureProviderPortReverse:m})})}function y(e,t){return Object.freeze(t===void 0?{available:!1,reason:e}:{available:!1,reason:e,hint:t})}export{_ as createLinuxPlatformRuntime};
@@ -0,0 +1 @@
1
+ import{_ as e}from"./sdk-contracts.js";import{R as t,at as n,bt as r,it as i,ot as a,wt as o,z as s}from"./sdk-batch-runner.js";function c(e){return t({owner:`Vega`,openTargetIdentity:`app-name`,binding:s({device:e.device,signal:e.signal,resolveInteractor:e.host.resolve})})}const l=r(`vega`),u=Object.freeze({available:!0}),d=y(`unsupported-platform-leaf`),f=y(`unsupported-platform-leaf`,`Runtime hints are supported only for local iOS-family simulators and Android devices.`),p=y(`unsupported-platform-leaf`,`Apple runner preparation is supported only for Apple targets.`),m=y(`unsupported-provider-mode`,`Port reverse is supported only by an owning provider runtime.`),h=y(`unsupported-device-kind`,`open currently supports only Vega Virtual Devices.`),g=y(`unsupported-device-kind`,`close currently supports only Vega Virtual Devices.`);function _(t){return Object.freeze({owner:l,ownsDevice:e=>e.platform===`vega`,inspectFacts:async e=>v(e),bind:async n=>{if(n.intent.kind===`exact-owner`&&!o(n.intent.owner,l))throw new e(`UNSUPPORTED_OPERATION`,`Vega runtime owner identity does not match`);if(n.device.platform!==`vega`)throw new e(`UNSUPPORTED_PLATFORM`,`Vega runtime cannot bind this device`);let r=v(n.device),i=c({host:t.localInteractors,device:n.device,signal:n.scope.signal});return Object.freeze({device:n.device,owner:l,facts:r,operations:Object.freeze(a(i,r.operations)),[Symbol.asyncDispose]:async()=>void 0})},shutdown:async()=>void 0})}function v(e){let t=e.kind===`emulator`&&e.target===`tv`,r=t?u:h,a=t?u:g;return i(e,l,{appLog:d,network:d,readiness:d,lifecycle:n({resolveOpenTarget:r,prepareApplicationOpen:r,openApplication:r,applyRuntimeHints:f,clearRuntimeHints:f,closeApplication:a,finalizeApplicationClose:a,prepareAppleRunner:p,configureProviderPortReverse:m})})}function y(e,t){let n={available:!1,reason:e,...t===void 0?{}:{hint:t}};return Object.freeze(n)}export{_ as createVegaPlatformRuntime};
@@ -0,0 +1 @@
1
+ import{_ as e}from"./sdk-contracts.js";import{R as t,at as n,bt as r,dt as i,et as a,ot as o,wt as s,z as c}from"./sdk-batch-runner.js";import{C as l}from"./sdk-device.js";import{d as u,f as d,p as f,v as p,x as m}from"./src3.js";const h=Object.freeze({resourceKind:a,version:1,encode:e=>({...e}),decode:e=>e.backend===`agent-browser`&&typeof e.outputPath==`string`?{status:`decoded`,descriptor:Object.freeze({backend:`agent-browser`,outputPath:e.outputPath})}:{status:`invalid`,message:`Invalid web screen-recording descriptor`}});async function g(e){let{host:t,device:n,owner:r,signal:i}=e,a=await t.screenRecording.web.resolve(n);return a?{available:!0,operations:{screenRecordingStart:async e=>await _({host:t,transport:a,device:n,owner:r,input:e,signal:i}),screenRecordingReattach:async()=>({status:`unreattachable`,reason:`transport-not-reattachable`,message:`Web recordings cannot be reattached after daemon restart.`}),screenRecordingCleanup:async()=>v()}}:{available:!1,operations:{}}}async function _(t){let{host:n,transport:r,device:o,owner:s,input:c,signal:g}=t;if(c.recordOnlySession)throw new e(`INVALID_ARGS`,`record on web requires an active browser session; run open <url> --platform web first`);if(!c.outputPath.toLowerCase().endsWith(`.webm`))throw new e(`INVALID_ARGS`,`web recordings require a .webm output path; agent-browser records WebM directly`);u(c,{scopes:[`app`],fps:!1,exportQuality:!1,hideTouches:!1},e=>`web recordings do not support ${e.join(`, `)}; agent-browser records WebM directly`),g.throwIfAborted(),await n.screenRecording.outputs.prepare(c.outputPath);let _=!1;try{await r.start(c.outputPath,g),_=!0,g.throwIfAborted()}catch(e){throw _&&await r.stop().catch(()=>{}),g.throwIfAborted(),e}let v=!1,y=async()=>{v||=(await r.stop(),!0)},b=f({backend:`agent-browser`,outPath:c.outputPath,...c.clientOutputPath===void 0?{}:{clientOutPath:c.clientOutputPath},startedAt:Date.now(),scope:c.scope,showTouches:!1,recordOnlySession:c.recordOnlySession,...c.activeSessionApp===void 0?{}:{activeSessionApp:c.activeSessionApp},gestureEvents:[]},{finish:async e=>(await y(),d(e,await n.screenRecording.finalize.complete({outputPath:e.outPath,showTouches:!1,gestureEvents:e.gestureEvents,targetLabel:`web recording`}),!1)),forceCleanup:async()=>{try{return await y(),{status:`cleaned`}}catch(e){return{status:`cleanup-pending`,reason:`transport-failed`,message:e instanceof Error?e.message:`Web recording cleanup failed`}}}});return Object.freeze({pendingHandle:new i(b),envelope:p({resourceKind:a,sessionId:c.sessionId,device:l(o),owner:s,fence:c.fence,lifecycle:`open`,descriptor:m(h,{backend:`agent-browser`,outputPath:c.outputPath})})})}function v(){return{status:`cleanup-pending`,reason:`manual-recovery-required`,message:`Web recordings cannot be cleaned after daemon restart.`}}function y(e){return t({owner:`web`,openTargetIdentity:`app-name`,binding:c({device:e.device,signal:e.signal,resolveInteractor:e.host.resolve})})}const b=r(`web`),x=Object.freeze({available:!0}),S=Object.freeze({available:!1,reason:`unsupported-platform-leaf`}),C=Object.freeze({available:!1,reason:`owner-capability-missing`,hint:`record is not supported by this web provider`}),w=Object.freeze({available:!1,reason:`unsupported-platform-leaf`}),T=Object.freeze({available:!1,reason:`unsupported-platform-leaf`,hint:`apps is not supported on web targets.`}),E=Object.freeze({available:!1,reason:`unsupported-platform-leaf`}),D=Object.freeze({available:!1,reason:`unsupported-platform-leaf`,hint:`Apple runner preparation is supported only for Apple targets.`}),O=Object.freeze({available:!1,reason:`unsupported-device-kind`,hint:`open is supported only for web browser devices.`}),k=Object.freeze({available:!1,reason:`unsupported-device-kind`,hint:`close is supported only for web browser devices.`}),A=Object.freeze({available:!1,reason:`unsupported-provider-mode`,hint:`Port reverse is supported only by an owning provider runtime.`});function j(e){let t=M(e),r=N(e);return n({resolveOpenTarget:t,prepareApplicationOpen:t,openApplication:t,applyRuntimeHints:w,clearRuntimeHints:w,closeApplication:r,finalizeApplicationClose:r,prepareAppleRunner:D,configureProviderPortReverse:A})}function M(e){return e.kind===`device`?x:O}function N(e){return e.kind===`device`?x:k}function P(t){return Object.freeze({owner:b,ownsDevice:e=>e.platform===`web`,inspectFacts:async e=>I(e,await t.networkTransports.resolve(e),(await g({host:t,device:e,owner:b,signal:new AbortController().signal})).available),bind:async n=>{if(n.intent.kind===`exact-owner`&&!s(n.intent.owner,b))throw new e(`UNSUPPORTED_OPERATION`,`Web runtime owner identity does not match`);if(n.device.platform!==`web`)throw new e(`UNSUPPORTED_PLATFORM`,`Web runtime owner cannot bind ${n.device.platform}`);let r=await t.networkTransports.resolve(n.device),i=await g({host:t,device:n.device,owner:b,signal:n.scope.signal});return F(t,n.device,n.scope.signal,r,i,I(n.device,r,i.available))},shutdown:async()=>void 0})}function F(e,t,n,r,i,a){let s=r.dump,c={...s?{networkDump:async e=>{let t=await s({maxEntries:e.maxEntries,include:e.include},n);return Object.freeze({source:`provider`,...t})}}:{},...i.operations,...o(y({host:e.localInteractors,device:t,signal:n}),a.operations)};return Object.freeze({device:t,owner:b,facts:a,operations:Object.freeze(c),[Symbol.asyncDispose]:async()=>void 0})}function I(e,t,n){let r=Object.freeze({available:!1,reason:`owner-capability-missing`,hint:`network is not supported by this web provider`});return Object.freeze({device:{family:`web`,kind:e.kind,...e.target===void 0?{}:{target:e.target},providerMode:t.mode},operations:{appLogInspect:S,appLogDoctor:S,appLogStart:S,appLogReattach:S,appLogCleanup:S,appState:E,networkDump:t.dump?x:r,screenRecordingStart:n?x:C,screenRecordingReattach:n?x:C,screenRecordingCleanup:n?x:C,ensureReady:w,bootTarget:w,bootTargetHeadless:w,listApps:T,deployApp:w,materializeAppSource:w,deployMaterializedApp:w,sendPushNotification:w,shutdownTarget:w,...j(e)}})}export{P as createWebPlatformRuntime};
@@ -0,0 +1 @@
1
+ import{AsyncLocalStorage as e}from"node:async_hooks";function t(t,n=e=>e){let r=new e;return{resolve(e){return e?n(e):r.getStore()??t},async run(e,t){return e?await r.run(n(e),t):await t()},hasScope(){return!!r.getStore()}}}export{t};
@@ -0,0 +1 @@
1
+ import{_ as e}from"./sdk-contracts.js";import{c as t}from"./sdk-device.js";import{promises as n}from"node:fs";async function r(t){let r=await n.open(t,`r`);try{let t=Buffer.alloc(24),{bytesRead:n}=await r.read(t,0,t.length,0);if(n<t.length||t.toString(`ascii`,12,16)!==`IHDR`)throw new e(`COMMAND_FAILED`,`Screenshot file is not a valid PNG`);return{width:t.readUInt32BE(16),height:t.readUInt32BE(20)}}finally{await r.close()}}function i(t,n){if(!(n===void 0||c(t)))throw new e(`UNSUPPORTED_OPERATION`,`--pixel-density is currently supported only on iOS-family simulators`)}function a(e,t,n){let r=s(n);if(t!==r)return{width:Math.max(1,Math.round(e.width/t*r)),height:Math.max(1,Math.round(e.height/t*r))}}async function o(e){let t=c(e.device),n;try{n=await r(e.path)}catch(e){if(t)throw e;return{}}let i={width:n.width,height:n.height};if(!t||e.scale!==void 0&&e.scale!==1)return i;let a=s(e.requestedPixelDensity);return{...i,logicalWidth:Math.round(n.width/a),logicalHeight:Math.round(n.height/a),pixelDensity:a}}function s(e){return e??1}function c(e){return t(e)&&e.kind===`simulator`}export{r as i,a as n,o as r,i as t};
@@ -0,0 +1 @@
1
+ import{Cr as e,ar as t,dr as n,fr as r,gr as i,ir as a,sr as o,ur as s}from"./sdk-batch-runner.js";function c(e){let t=e.trim().toLowerCase();return t?/^(vertical|horizontal)\s+scroll\s+bar(?:,?\s*\d+\s+pages?)?$/.test(t):!1}function l(e,t){if(!(e?.trim().toLowerCase()??``).includes(`vertical scroll bar`))return null;let n=u(t);return n===null?null:n<=1?{above:!1,below:!0}:n>=99?{above:!0,below:!1}:{above:!0,below:!0}}function u(e){if(!e)return null;let t=/^(\d{1,3})%$/.exec(e.trim());if(!t)return null;let n=Number(t[1]);return Number.isFinite(n)?Math.max(0,Math.min(100,n)):null}function d(e){if(e.length===0)return{nodes:e,hiddenCount:0,summaryLines:[]};let{byIndex:t,visibleNodeIndexes:n,offscreenNodes:r,hintedContainers:i}=p(e),a=n.size===0?e:e.filter(e=>n.has(e.index));return{nodes:a.map(e=>y(e,i.directionsByContainer)),hiddenCount:n.size===0?0:e.length-a.length,summaryLines:b(r.filter(e=>!i.coveredNodeIndexes.has(e.index)&&C(e)),e,t)}}function f(e){if(e.length===0)return new Map;let{hintedContainers:t}=p(e);return v(t.directionsByContainer)}function p(e){let n=i(e),r=new Set,a=[];for(let i of e){if(t(i,e,n)){T(i,r,n);continue}a.push(i)}return{byIndex:n,visibleNodeIndexes:r,offscreenNodes:a,hintedContainers:_(e,a,r,n)}}function m(e,t){return e.hittable&&o(e.rect,t)}function h(t,r,a=i(r)){if(!t.rect)return null;let c=s(t,r,a);if(c&&!e(t.rect,c)){let e=g(t.rect,c);if(e)return e}let l=n(r,t.rect);if(l&&!o(t.rect,l)){let e=g(t.rect,l);if(e)return e}return null}function g(e,t){let n=e.x+e.width/2,r=e.y+e.height/2,i=[{direction:`down`,amount:r-(t.y+t.height)},{direction:`up`,amount:t.y-r},{direction:`right`,amount:n-(t.x+t.width)},{direction:`left`,amount:t.x-n}],a=null;for(let e of i)e.amount>0&&(!a||e.amount>a.amount)&&(a=e);return a?.direction??null}function _(e,t,n,r){let i=new Map,a=new Map,o=new Set;for(let e of t){if(!e.rect)continue;let t=E(e,n,r);if(!t?.rect)continue;let s=S(e.rect,t.rect);if(!s)continue;let c=i.get(t.index)??new Set;c.add(s),i.set(t.index,c);let l=a.get(t.index)??new Set;l.add(s),a.set(t.index,l),o.add(e.index)}return D(e,n,r,i,a),{directionsByContainer:i,coveredNodeIndexes:o}}function v(e){let t=new Map;for(let[n,r]of e){let e={};r.has(`above`)&&(e.hiddenContentAbove=!0),r.has(`below`)&&(e.hiddenContentBelow=!0),(e.hiddenContentAbove||e.hiddenContentBelow)&&t.set(n,e)}return t}function y(e,t){let n=t.get(e.index);if(!n||n.size===0)return e;let r=e.hiddenContentAbove===!0||n.has(`above`)?!0:void 0,i=e.hiddenContentBelow===!0||n.has(`below`)?!0:void 0;return{...e,hiddenContentAbove:r,hiddenContentBelow:i}}function b(e,t,n){let r=new Map;for(let i of e){let e=x(i,t,n);if(!e)continue;let a=r.get(e)??[];a.push(i),r.set(e,a)}return[`above`,`below`].flatMap(e=>{let t=r.get(e);if(!t||t.length===0)return[];let n=w(t).slice(0,3).map(e=>`"${e}"`),i=t.length===1?`interactive item`:`interactive items`,a=n.length>0?`: ${n.join(`, `)}`:``;return[`[off-screen ${e}] ${t.length} ${i}${a}`]})}function x(e,t,n){if(!e.rect)return null;let r=s(e,t,n);return r?S(e.rect,r):null}function S(e,t){return e.y+e.height<=t.y?`above`:e.y>=t.y+t.height?`below`:null}function C(e){if(e.hittable===!0)return!0;let t=(e.type??``).toLowerCase();return t.includes(`button`)||t.includes(`link`)||t.includes(`textfield`)||t.includes(`edittext`)||t.includes(`searchfield`)||t.includes(`checkbox`)||t.includes(`radio`)||t.includes(`switch`)||t.includes(`menuitem`)||!!r(e)}function w(e){let t=new Set,n=[];for(let i of e){let e=r(i);!e||t.has(e)||(t.add(e),n.push(e))}return n}function T(e,t,n){let r=e,i=new Set;for(;r&&!i.has(r.index);)i.add(r.index),t.add(r.index),r=typeof r.parentIndex==`number`?n.get(r.parentIndex):void 0}function E(e,t,n){return a(e,n,e=>t.has(e.index))}function D(e,t,n,r,i){for(let a of e){let e=O(a);if(!e||e.size===0)continue;let o=E(a,t,n);if(!o)continue;let s=r.get(o.index)??new Set,c=i.get(o.index);for(let t of e)c&&c.size>0&&!c.has(t)||s.add(t);r.set(o.index,s)}}function O(e){let t=l(e.label,e.value);if(!t)return null;let n=new Set;return t.above&&n.add(`above`),t.below&&n.add(`below`),n.size>0?n:null}function k(e){return e}function A(e,t){let n=Math.max(e.x,t.x),r=Math.max(e.y,t.y),i=Math.min(e.x+e.width,t.x+t.width),a=Math.min(e.y+e.height,t.y+t.height);return i<=n||a<=r?0:(i-n)*(a-r)}export{f as a,c,h as i,k as n,m as o,d as r,l as s,A as t};
@@ -1,6 +1,6 @@
1
- import{E as e,_ as t,h as n}from"./sdk-contracts.js";import{$ as r,At as i,Et as a,H as o,S as s,Tt as c,U as l,jt as u,lt as ee,n as te,pt as ne,t as re}from"./version.js";import{Gn as ie,It as ae,Kn as oe,Lt as se,Rt as ce,Wn as d,it as le,mt as ue,st as f,x as de,zt as fe}from"./sdk-batch-runner.js";import{_ as pe,i as me,r as he,t as ge}from"./sdk-device.js";import{$t as _e,Xt as p,Yt as ve,gn as ye,qt as be,rn as xe}from"./prepare-kind.js";import{t as Se}from"./device.js";import{A as m,M as h}from"./sdk-android-adb.js";import{n as Ce,t as we}from"./path-resolution.js";import{d as Te,n as Ee,o as De,s as Oe}from"./host-process.js";import g from"node:path";import ke from"node:crypto";import _ from"node:fs";import{StringDecoder as Ae}from"node:string_decoder";function v(e){return e.startsWith(`@`)?n(e)?.base??e:e}const y=/^-?\d+(\.\d+)?$/,je=/^[^\s"\\]+$/,Me=new Map([[`--count`,`count`],[`--interval-ms`,`intervalMs`],[`--hold-ms`,`holdMs`],[`--jitter-px`,`jitterPx`]]),Ne=new Map([[`--count`,`count`],[`--pause-ms`,`pauseMs`]]),Pe=new Map([[`--pointer-count`,`pointerCount`]]),Fe=new Map([[`--delay-ms`,`delayMs`]]);function b(e){return e===`click`||e===`press`}function Ie(e){return b(e)||e===`longpress`}function Le(e){return e===`type`||e===`fill`}function x(e){return ze(e,Be)}function Re(e){return JSON.stringify(e)}function S(e){return ze(e,Ve)}function ze(e,t){return t(e)?e:Re(e)}function Be(e){return Ve(e)&&e.startsWith(`@`)||y.test(e)}function Ve(e){return je.test(e)}const He=new Set([`fill`,`type`]);function Ue(e){if(!He.has(e.command)){let t=(e.positionals??[]).map(e=>x(e));return[e.command,...t].join(` `)}let t=We(e).map(e=>x(e)).join(` `);return[e.command,t,`<text>`].filter(e=>e.length>0).join(` `)}function We(e){if(e.command===`type`)return[];let t=e.positionals??[],n=t[0];return n===void 0?[]:n.startsWith(`@`)?[n]:t.length>=3&&y.test(n)&&y.test(t[1]??``)?[n,t[1]]:[n]}function C(e,t){let n=t.flags??{};if(b(t.command)){typeof n.count==`number`&&e.push(`--count`,String(n.count)),typeof n.intervalMs==`number`&&e.push(`--interval-ms`,String(n.intervalMs)),typeof n.holdMs==`number`&&e.push(`--hold-ms`,String(n.holdMs)),typeof n.jitterPx==`number`&&e.push(`--jitter-px`,String(n.jitterPx)),n.doubleTap===!0&&e.push(`--double-tap`);let t=n.clickButton;t&&t!==`primary`&&e.push(`--button`,t);return}if(t.command===`swipe`){typeof n.count==`number`&&e.push(`--count`,String(n.count)),typeof n.pauseMs==`number`&&e.push(`--pause-ms`,String(n.pauseMs)),(n.pattern===`one-way`||n.pattern===`ping-pong`)&&e.push(`--pattern`,n.pattern);return}if(t.command===`gesture`){typeof n.pointerCount==`number`&&e.push(`--pointer-count`,String(n.pointerCount));return}Le(t.command)&&typeof n.delayMs==`number`&&e.push(`--delay-ms`,String(n.delayMs))}function Ge(e,t){t&&((t.platform===`ios`||t.platform===`android`)&&e.push(`--platform`,t.platform),typeof t.metroHost==`string`&&t.metroHost.length>0&&e.push(`--metro-host`,S(t.metroHost)),typeof t.metroPort==`number`&&e.push(`--metro-port`,String(t.metroPort)),typeof t.bundleUrl==`string`&&t.bundleUrl.length>0&&e.push(`--bundle-url`,S(t.bundleUrl)),typeof t.launchUrl==`string`&&t.launchUrl.length>0&&e.push(`--launch-url`,S(t.launchUrl)))}function Ke(e,t){let[n,...r]=t.positionals??[];n&&e.push(S(n));for(let t of r)e.push(x(t));typeof t.flags?.fps==`number`&&e.push(`--fps`,String(t.flags.fps)),(typeof t.flags?.quality==`number`||typeof t.flags?.quality==`string`)&&e.push(`--quality`,String(t.flags.quality)),t.flags?.hideTouches&&e.push(`--hide-touches`)}function qe(e,t){t.flags?.snapshotInteractiveOnly&&e.push(`-i`),typeof t.flags?.snapshotDepth==`number`&&e.push(`-d`,String(t.flags.snapshotDepth)),t.flags?.snapshotScope&&e.push(`-s`,x(t.flags.snapshotScope)),t.flags?.snapshotRaw&&e.push(`--raw`)}function Je(e,t){for(let n of t.positionals??[])e.push(x(n));i(e,t.flags)}function Ye(e,t,n={}){let r=t.positionals??[],i=n.includeAllPositionals?r:r.slice(0,1);for(let t of i)e.push(S(t));Ge(e,t.flags)}function Xe(e,t){for(let n of t.positionals??[])e.push(x(t.command===`wait`?v(n):n));C(e,t)}function w(e,t){let n=[],r={},i=b(e)?Me:e===`swipe`?Ne:e===`gesture`?Pe:Le(e)?Fe:void 0;for(let a=0;a<t.length;a+=1){let o=t[a];if(b(e)&&o===`--double-tap`){r.doubleTap=!0;continue}let s=t[a+1];if(b(e)&&o===`--button`&&s!==void 0){let e=s;(e===`primary`||e===`secondary`||e===`middle`)&&(r.clickButton=e),a+=1;continue}let c=i?.get(o);if(c&&s!==void 0){let e=Qe(s);if(e!==null){r[c]=e,a+=1;continue}}if(e===`swipe`&&o===`--pattern`&&s!==void 0){let e=s;(e===`one-way`||e===`ping-pong`)&&(r.pattern=e),a+=1;continue}n.push(o)}return{positionals:n,flags:r}}function Ze(e){let t=[],n={};for(let r=0;r<e.length;r+=1){let i=e[r],a=e[r+1];if(i===`--platform`&&a!==void 0){let e=a;(e===`ios`||e===`android`)&&(n.platform=e),r+=1;continue}if(i===`--metro-host`&&a!==void 0){n.metroHost=a,r+=1;continue}if(i===`--metro-port`&&a!==void 0){let e=Qe(a);e!==null&&(n.metroPort=e),r+=1;continue}if(i===`--bundle-url`&&a!==void 0){n.bundleUrl=a,r+=1;continue}if(i===`--launch-url`&&a!==void 0){n.launchUrl=a,r+=1;continue}t.push(i)}return{positionals:t,flags:n}}function Qe(e){if(!e)return null;let t=Number(e);return!Number.isFinite(t)||t<0?null:Math.floor(t)}function $e(e){let t;for(let n of e){if(n.command===`runtime`&&typeof n.flags.platform==`string`){t=n.flags.platform;continue}if(n.command===`open`)return n.runtime?.platform??t}return t}function et(e,t){for(let n of t.positionals??[])e.push(x(n));t.flags?.relaunch&&e.push(`--relaunch`),Ge(e,t.runtime)}function tt(e){let t=[],n={};for(let r of e){if(r===`--relaunch`){n.relaunch=!0;continue}t.push(r)}let r=Ze(t);return{positionals:r.positionals,flags:n,runtime:nt(r.flags)?r.flags:void 0}}function nt(e){return!!(e.platform||e.metroHost||e.metroPort!==void 0||e.bundleUrl||e.launchUrl)}const rt=/^[A-Z_][A-Z0-9_]*$/,it=new Set(he.filter(e=>e!==`web`)),at=new Set([`mobile`,`tv`,`desktop`]);function ot(e){let n=[],r=[],i=e.split(/\r?\n/),a=!1,s,c=(e,n,r)=>{throw new t(`INVALID_ARGS`,`${e.kind===`multiple`?`targets-v1`:`target-v1`} annotation on line ${e.line} must be immediately followed by its action line (line ${n+1} ${r}).`)};for(let[e,l]of i.entries()){let i=l.trim();if(i.length===0){s&&c(s,e,`is blank`);continue}if(i.startsWith(`#`)){let t=ce(i);if(t.kind===`v1`){s&&c(s,e,`is another target annotation`),s={kind:`multiple`,evidence:t.evidence,line:e+1};continue}let n=fe(i);if(n.kind===`v1`){s&&c(s,e,`is another target annotation`),s={kind:`single`,evidence:n.evidence,line:e+1};continue}s&&c(s,e,`is a comment`);continue}if(ct(i)){if(s&&c(s,e,`is an env directive`),a)throw new t(`INVALID_ARGS`,`env directives must precede all actions (line ${e+1}).`);continue}let u=ft(l);if(!u){s&&c(s,e,`did not parse as an action`);continue}let ee=o(u.command,u.positionals??[],`line ${e+1}`);if(ee)throw new t(`INVALID_ARGS`,ee);s&&=(s.kind===`single`?u.targetEvidence=s.evidence:u.targetEvidences=s.evidence,void 0),n.push(u),r.push(e+1),a=!0}if(s)throw new t(`INVALID_ARGS`,`${s.kind===`multiple`?`targets-v1`:`target-v1`} annotation on line ${s.line} must be immediately followed by its action line (end of script reached).`);return{actions:n,actionLines:r}}function st(e){let t=e.split(/\r?\n/),n={};for(let[e,r]of t.entries()){let t=r.trim();if(t.length===0||t.startsWith(`#`))continue;if(ct(t)){dt(n,t,e+1);continue}if(!t.startsWith(`context `))break;let i=t.match(/(?:^|\s)platform=([^\s]+)/);if(i){let e=i[1];e&&it.has(e)&&T(n,`platform`,e)}let a=t.match(/(?:^|\s)target=([^\s]+)/);if(a){let e=a[1];e&&at.has(e)&&T(n,`target`,e)}let o=t.match(/(?:^|\s)timeout=(\d+)/);if(o){let e=Number(o[1]);Number.isFinite(e)&&e>=1&&T(n,`timeoutMs`,Math.floor(e))}let s=t.match(/(?:^|\s)retries=(\d+)/);if(s){let e=Number(s[1]);Number.isFinite(e)&&e>=0&&T(n,`retries`,Math.floor(e))}}return n}function ct(e){return e===`env`||e.startsWith(`env `)||e.startsWith(`env `)}function lt(e,n){let r=e.slice(3).replace(/^[\s]+/,``),i=r.indexOf(`=`);if(i<=0)throw new t(`INVALID_ARGS`,`Invalid env directive on line ${n}: expected "env KEY=VALUE".`);let a=r.slice(0,i);if(!rt.test(a))throw new t(`INVALID_ARGS`,`Invalid env key "${a}" on line ${n}: keys must be uppercase letters, digits, and underscores (e.g. APP_ID).`);if(a.startsWith(`AD_`))throw new t(`INVALID_ARGS`,`Invalid env key "${a}" on line ${n}: the AD_* namespace is reserved for built-in variables. Rename ${a} to avoid the AD_ prefix.`);return{key:a,value:ut(r.slice(i+1),n)}}function ut(e,n){if(e.length===0)return``;if(e.startsWith(`"`))try{let t=JSON.parse(e);if(typeof t!=`string`)throw Error(`not a string literal`);return t}catch{throw new t(`INVALID_ARGS`,`Invalid quoted env value on line ${n}.`)}return e}function dt(e,n,r){let{key:i,value:a}=lt(n,r),o=e.env??{};if(Object.prototype.hasOwnProperty.call(o,i))throw new t(`INVALID_ARGS`,`Duplicate env directive "${i}" on line ${r}.`);o[i]=a,e.env=o}function T(e,n,r){let i=e[n];if(i!==void 0)throw new t(`INVALID_ARGS`,i===r?`Duplicate replay test metadata "${n}" in context header.`:`Conflicting replay test metadata "${n}" in context header: ${String(i)} vs ${String(r)}.`);e[n]=r}function ft(e){let n=e.trim();if(n.length===0||n.startsWith(`#`))return null;let[r,...i]=mt(n);if(r===void 0||r===`context`)return null;let a={ts:Date.now(),command:r,positionals:[],flags:{}};if(r===`snapshot`){a.positionals=[];for(let e=0;e<i.length;e+=1){let t=i[e];if(t===`-i`){a.flags.snapshotInteractiveOnly=!0;continue}if(t!==`-c`){if(t===`--raw`){a.flags.snapshotRaw=!0;continue}if(t===`--force-full`){a.flags.snapshotForceFull=!0;continue}if((t===`-d`||t===`--depth`)&&e+1<i.length){let t=Number(i[e+1]);Number.isFinite(t)&&t>=0&&(a.flags.snapshotDepth=Math.floor(t)),e+=1;continue}if((t===`-s`||t===`--scope`)&&e+1<i.length){a.flags.snapshotScope=i[e+1],e+=1;continue}if(t===`--backend`&&e+1<i.length){e+=1;continue}}}return a}if(r===`open`){let e=tt(i);return a.positionals=e.positionals,Object.assign(a.flags,e.flags),a.runtime=e.runtime,a}if(r===`runtime`){let e=Ze(i);return a.positionals=e.positionals,Object.assign(a.flags,e.flags),a}if(b(r)){let e=w(r,i);Object.assign(a.flags,e.flags);let t=e.positionals[0];if(t===void 0)return a;if(t.startsWith(`@`))return a.positionals=[v(t)],e.positionals[1]&&(a.result={refLabel:e.positionals[1]}),a;let n=e.positionals[0],o=e.positionals[1];return E(n)&&E(o)&&e.positionals.length>=2?(a.positionals=[n,o],a):(a.positionals=[e.positionals.join(` `)],a)}if(r===`fill`){let e=w(r,i);if(Object.assign(a.flags,e.flags),!pt(e.positionals))return a.positionals=e.positionals,a;let[t,n,...o]=e.positionals;if(E(t)&&E(n))return a.positionals=[t,n,o.join(` `)],a;let[s,c,...l]=e.positionals;if(s.startsWith(`@`)){let e=v(s);return l.length>0?(a.positionals=[e,l.join(` `)],a.result={refLabel:c},a):(a.positionals=[e,c],a)}return a.positionals=[s,[c,...l].join(` `)],a}if(r===`get`){let e=i[0],t=i[1];return e===void 0||t===void 0?(a.positionals=i,a):t.startsWith(`@`)?(a.positionals=[e,v(t)],i[2]&&(a.result={refLabel:i[2]}),a):(a.positionals=[e,i.slice(1).join(` `)],a)}if(r===`swipe`||r===`type`||r===`gesture`){let e=w(r,i);return Object.assign(a.flags,e.flags),a.positionals=e.positionals,a}if(r===`record`){let e=[];for(let n=0;n<i.length;n+=1){let r=i[n];if(r===c.cliToken)throw new t(`INVALID_ARGS`,c.migration.record);if(r===`--hide-touches`){a.flags.hideTouches=!0;continue}if(r===`--fps`&&n+1<i.length){let e=Number(i[n+1]);Number.isFinite(e)&&(a.flags.fps=Math.floor(e)),n+=1;continue}if(r===`--quality`&&n+1<i.length){let e=i[n+1],t=xe(e);t!==void 0&&(a.flags.quality=t),n+=1;continue}e.push(r)}return a.positionals=e,a}if(r===`screenshot`){let e=[];for(let t=0;t<i.length;t+=1){let n=i[t],r=u({args:i,index:t,flags:a.flags});if(r.handled){t=r.nextIndex;continue}e.push(n)}return a.positionals=e,a}return a.positionals=r===`wait`||r===`longpress`?i.map(e=>v(e)):i,a}function pt(e){return e.length>=2}function E(e){return e?!Number.isNaN(Number(e)):!1}function mt(e){let t=[],n=0;for(;n<e.length&&(n=ht(e,n),!(n>=e.length));){let r=e[n]===`"`?gt(e,n):_t(e,n);t.push(r.value),n=r.nextCursor}return t}function ht(e,t){let n=t;for(;n<e.length&&/\s/.test(e.charAt(n));)n+=1;return n}function gt(e,n){let r=n+1,i=!1,a=r;for(;a<e.length;a+=1){let t=e.charAt(a);if(t===`"`&&!i)break;if(i){i=!1;continue}i=t===`\\`}if(a>=e.length)throw new t(`INVALID_ARGS`,`Invalid replay script line: ${e}`);let o=e.slice(n,a+1),s;try{s=JSON.parse(o)}catch{throw new t(`INVALID_ARGS`,`Invalid quoted value ${o} in replay script line: ${e}`,{hint:`Quoted replay values are JSON strings: escape backslashes, quotes, tabs, and newlines (\\\\, \\", \\t, \\n).`})}return{value:s,nextCursor:a+1}}function _t(e,t){let n=t;for(;n<e.length&&!/\s/.test(e.charAt(n));)n+=1;return{value:e.slice(t,n),nextCursor:n}}function vt(e,t={}){let n=[e.command];return e.command===`snapshot`?qe(n,e):e.command===`open`?et(n,e):e.command===`runtime`?Ye(n,e,{includeAllPositionals:t.runtimeIncludeAllPositionals}):e.command===`record`?Ke(n,e):e.command===`screenshot`?Je(n,e):Xe(n,e),n.join(` `)}function yt(e){return e.targetEvidences?[ae(e.targetEvidences)]:e.targetEvidence?[se(e.targetEvidence)]:[]}async function bt(e){return e===`https:`?(await import(`node:https`)).default:(await import(`node:http`)).default}function xt(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 St(e,n,r){let i=[],a=0;for await(let o of e){let e=Buffer.isBuffer(o)?o:Buffer.from(o);if(a+=e.length,a>n)throw new t(`INVALID_ARGS`,r);i.push(e)}return Buffer.concat(i)}const Ct=`/agent-device`,wt=`x-agent-device-tenant`;function Tt(e){return Et(e,Ct)}function Et(e,t){let n=e.endsWith(`/`)?e:`${e}/`;return new URL(t.replace(/^\/+/,``),n).toString()}function Dt(e){let t=e?.trim();return t?{authorization:`Bearer ${t}`,"x-agent-device-token":t}:{}}function Ot(e){let t=e?.trim();return t?{[wt]:t}:{}}const kt=`.webm`;function At(e){return e===`web`?kt:`.mp4`}function jt(e,t){return g.extname(e)?e:`${e}${t}`}function Mt(e){return`./recording-${Date.now()}${At(e)}`}const D={kind:`none`};function O(e,t){if(t.path===void 0){let n=e??{kind:`default`,force:!1};return t.force?{...n,force:!0}:n}let n=e?.force===!0&&(e.kind==="default"||e.path===t.path);return{kind:`explicit`,path:t.path,force:t.force||n}}function Nt(e){return e.kind===`repair`?{...e,status:`armed`}:e}function Pt(e){return e.kind===`none`?void 0:e.target}function Ft(e){return e.kind===`repair`&&(e.status===`complete`||e.status===`close-succeeded`)}function It(e){return e.kind===`authoring`&&e.status===`aborted`}function Lt(e){return e.kind===`repair`?e.status===`committed`:e.kind===`authoring`&&e.status===`published`}function Rt(e){return{kind:`authoring`,status:`armed`,target:O(void 0,e)}}function zt(e){return e.kind!==`authoring`||e.status!==`armed`?e:{...e,status:`aborted`}}function Bt(e,t){return e.kind===`authoring`?{kind:`authoring`,status:`published`,target:{kind:`explicit`,path:t,force:e.target.force}}:e}function Vt(e,t){let n=e.kind===`repair`?e:void 0,r=n?.sourcePath??t.sourcePath;return{kind:`repair`,status:n?.status??`armed`,target:O(n?.target,t.requested),boundary:n?.boundary??t.boundary,...r===void 0?{}:{sourcePath:r},...n?.closeReceipt===void 0?{}:{closeReceipt:n.closeReceipt}}}function Ht(e){return e.kind!==`repair`||e.status!==`armed`?e:{...e,status:`complete`}}function Ut(e,t){return e.kind===`repair`?{...e,status:e.status===`complete`?`close-succeeded`:e.status,closeReceipt:t}:e}function Wt(e){if(e.kind!==`repair`)return e;let{closeReceipt:t,...n}=e;return{...n,status:`committed`}}function Gt(e){if(e.kind!==`repair`)return e;let{closeReceipt:t,...n}=e;return{...n,status:`aborted`}}function Kt(e){return e.kind===`repair`?e.boundary:void 0}function qt(e){return e.kind===`repair`?e.sourcePath:void 0}function Jt(e){return e.kind===`repair`&&e.status!==`committed`}function Yt(e){let t=Pt(e);return t?.kind===`explicit`?t.path:void 0}function Xt(e){return Pt(e)?.force===!0}function k(e){return e.replace(/[^a-zA-Z0-9._-]/g,`_`)}function A(e,t){return Ce(e,{cwd:t})}function j(e){return e?.scriptPublication??D}function Zt(e){let t=j(e);return t.kind===`authoring`&&t.status===`armed`}function Qt(e,t){e.recordSession=!0,e.scriptPublication=Rt({path:t.path===void 0?void 0:A(t.path),force:t.force===!0})}function $t(e){e.recordSession=!1,e.scriptPublication=zt(j(e))}function en(e,t){return It(j(e))?!1:e.recordSession===!0||t}function tn(e,t){if(!t.saveScript||It(j(e)))return;e.recordSession=!0;let n={path:typeof t.saveScript==`string`?A(t.saveScript):void 0,force:t.force===!0},r=j(e);if(r.kind===`repair`){e.scriptPublication=Vt(r,{requested:n,boundary:r.boundary,sourcePath:r.sourcePath});return}if(r.kind===`authoring`){e.scriptPublication={...r,target:O(r.target,n)};return}e.scriptPublication=Rt(n)}function nn(e,t){let n=j(e);n.kind===`authoring`&&(e.scriptPublication={...n,target:O(n.target,{path:t.explicitPath===void 0?void 0:A(t.explicitPath),force:t.liveForce===!0})})}function rn(e,t){e.scriptPublication=Bt(j(e),t),e.recordSession=!1}function an(e,t){let n=j(e);n.kind===`authoring`&&(e.scriptPublication=Bt(n,t))}function on(e,t){return t===!0||Xt(j(e))}function sn(e){return Lt(j(e))}function M(e){return e?.scriptPublication??D}function cn(e,t){e.recordSession=!0;let n=M(e);e.scriptPublication=Vt(n,{requested:{path:typeof t.saveScript==`string`?A(t.saveScript):n.kind===`repair`?void 0:t.healedSiblingPath,force:t.force===!0},boundary:t.firstArm?e.actions.length:0,sourcePath:t.sourcePath})}function ln(e){e.scriptPublication=Nt(M(e))}function un(e){e.scriptPublication=Ht(M(e))}function dn(e,t){e.scriptPublication=Ut(M(e),t)}function fn(e){e.scriptPublication=Gt(M(e))}function pn(e,t){let n=M(e);return n.kind===`repair`&&n.closeReceipt===t}function mn(e){return M(e).kind===`repair`}function hn(e){return Jt(M(e))}function N(e){return Kt(M(e))}function gn(e){return qt(M(e))}function P(e){let t=e.result?.text;if(typeof t==`string`)return t;let n=e.positionals??[];return n.length===0?``:n[0]?.startsWith(`@`)?n.length>=3?n.slice(2).join(` `):n.slice(1).join(` `):n.length>=3&&!Number.isNaN(Number(n[0]))&&!Number.isNaN(Number(n[1]))?n.slice(2).join(` `):n.slice(1).join(` `)}const _n=/^\$\{([A-Z_][A-Z0-9_]*)\}$/;function vn(e){if(e!==e.trim()||!rt.test(e))throw new t(`INVALID_ARGS`,`Invalid --record-as variable "${e}": use uppercase letters, digits, and underscores (for example PASSWORD).`);if(e.startsWith(`AD_`))throw new t(`INVALID_ARGS`,`Invalid --record-as variable "${e}": the AD_* namespace is reserved for built-in replay variables.`);return e}function yn(e){return`\${${e}}`}function bn(e){let t=_n.exec(e);if(!(!t?.[1]||t[1].startsWith(`AD_`)))return t[1]}const xn=new Set(`action.backend.cost.delayMs.evidence.gesture.hint.kind.maestroFallbackReason.maestroNonHittableCoordinateFallbackAllowed.maestroNonHittableCoordinateFallbackUsed.message.platform.ref.referenceHeight.referenceWidth.refLabel.resolution.selector.selectorChain.settle.targetHittable.targetKind.text.warning.x.y`.split(`.`)),Sn=new Set([`action`,`backend`,`gesture`,`kind`,`platform`,`ref`,`selector`,`targetKind`]),Cn=new Set([`cost`,`evidence`,`resolution`,`settle`]),wn=new Map([[`cost`,new Set([`nodeCount`,`runnerRoundTrips`,`wallClockMs`])],[`evidence`,new Set([`changedFromBefore`,`digest`,`foregroundApp`,`interactiveNodeCount`,`nodeCount`])],[`resolution`,new Set([`alternatives`,`kind`,`matchCount`,`phase`,`source`,`tiebreak`,`winnerDiagnostic`])],[`resolution.alternatives`,new Set([`diagnosticRef`,`label`,`role`])],[`resolution.winnerDiagnostic`,new Set([`diagnosticRef`,`label`,`role`])],[`settle`,new Set([`captures`,`diff`,`hint`,`quietMs`,`refs`,`refsGeneration`,`settled`,`tail`,`tailTruncated`,`timeoutMs`,`waitedMs`])],[`settle.diff`,new Set([`lines`,`summary`,`truncated`])],[`settle.diff.lines`,new Set([`kind`,`ref`,`text`])],[`settle.diff.summary`,new Set([`additions`,`removals`,`unchanged`])],[`settle.refs`,new Set([`ref`])],[`settle.tail`,new Set([`label`,`ref`,`role`])]]),Tn=new Set([`evidence.digest`,`evidence.foregroundApp`,`resolution.alternatives.diagnosticRef`,`resolution.alternatives.role`,`resolution.kind`,`resolution.phase`,`resolution.source`,`resolution.tiebreak`,`resolution.winnerDiagnostic.diagnosticRef`,`resolution.winnerDiagnostic.role`,`settle.diff.lines.kind`,`settle.diff.lines.ref`,`settle.refs.ref`,`settle.tail.ref`,`settle.tail.role`]);function En(e,t,n){if(!e)return e;let r=Nn(e.selectorChain);return{...kn(e,t,n),...typeof e.text==`string`?{text:n}:{},...r?{selectorChain:r.filter(e=>!On(e,t))}:{}}}function Dn(e,t,n){return e&&{...e,...e.label===t?{label:n}:{},ancestry:e.ancestry.map(e=>({...e,...e.label===t?{label:n}:{}})),...e.scrollRegion?{scrollRegion:{...e.scrollRegion,...e.scrollRegion.label===t?{label:n}:{}}}:{}}}function On(e,t){return ue(e,t)}function kn(e,t,n){return Object.fromEntries(Object.entries(e).map(([e,r])=>[xn.has(e)?e:I(e,t,n),An(r,e,t,n)]))}function An(e,t,n,r){return typeof e==`string`&&Sn.has(t)?e:t===`selectorChain`&&Mn(e)?jn(e,n):F(e,n,r,Cn.has(t)?t:void 0)}function F(e,t,n,r){if(typeof e==`string`)return r&&Tn.has(r)?e:I(e,t,n);if(Array.isArray(e))return e.map(e=>F(e,t,n,r));if(!e||typeof e!=`object`)return e;let i=r?wn.get(r):void 0;return Object.fromEntries(Object.entries(e).map(([e,a])=>{let o=i?.has(e)===!0;return[o?e:I(e,t,n),F(a,t,n,o?`${r}.${e}`:void 0)]}))}function jn(e,t){return e.filter(e=>!On(e,t))}function I(e,t,n){if(!t)return e===t?n:e;let r=n?e.split(n):[e];return r.every(e=>!e.includes(t))?e:t.trim()?r.map(e=>e.replaceAll(t,n)).join(n):n}function Mn(e){return Array.isArray(e)&&e.every(e=>typeof e==`string`)}function Nn(e){return Mn(e)?e:void 0}function Pn(e,t){if(t.flags?.noRecord||zn(e,t))return;t.flags&&tn(e,t.flags);let n=Fn(t),r={ts:Date.now(),command:n.command,positionals:n.positionals,runtime:n.runtime,flags:Vn(n.flags),result:n.result,...n.targetEvidence?{targetEvidence:n.targetEvidence}:{},...n.targetEvidences?{targetEvidences:n.targetEvidences}:{}};return e.actions.push(r),m({level:`debug`,phase:`record_action`,data:{command:t.command,session:e.name}}),r}function Fn(e){if(e.command!==`fill`||typeof e.flags.recordAs!=`string`)return e;let t=yn(vn(e.flags.recordAs)),n=P({ts:0,command:e.command,positionals:e.positionals,flags:e.flags});return{...e,positionals:In(e.positionals,t),result:En(e.result,n,t),targetEvidence:Dn(e.targetEvidence,n,t)}}function In(e,t){let n=e[0];return n?.startsWith(`@`)?e.length>=3?[n,e[1],t]:[n,t]:e.length>=3&&Number.isFinite(Number(e[0]))&&Number.isFinite(Number(e[1]))?[e[0],e[1],t]:n===void 0?[t]:[n,t]}const Ln=new Set([`snapshot`,`get`,`is`,`find`]);function Rn(e){return e.internal?.replayPlanStep===!0?!1:Ln.has(e.command)}function zn(e,t){return!t.interactiveObservation||N(e)===void 0?!1:t.flags?.record!==!0}const Bn=[`platform`,`device`,`udid`,`serial`,`out`,`verbose`,`metroHost`,`metroPort`,`bundleUrl`,`launchUrl`,`snapshotInteractiveOnly`,`snapshotDepth`,`snapshotScope`,`snapshotRaw`,`snapshotCustomActions`,...a,`relaunch`,`saveScript`,`force`,`noRecord`,`record`,`fps`,`quality`,`hideTouches`,`count`,`pointerCount`,`intervalMs`,`delayMs`,`holdMs`,`jitterPx`,`doubleTap`,`clickButton`,`pauseMs`,`pattern`];function Vn(e){if(!e)return{};let t={};for(let n of Bn)e[n]!==void 0&&(t[n]=e[n]);return t}function Hn(e){let n=e.flatMap((e,t)=>e.command===`open`?[t]:[]);if(n.length!==1||n[0]!==0)throw new t(`COMMAND_FAILED`,`Cannot publish this session: an open-to-destination script requires exactly one initial recorded open.`,{retriable:!1,hint:`Close this session and start a fresh one with open <app> --save-script[=<path>].`});if(e.some(e=>e.command===`close`))throw new t(`COMMAND_FAILED`,`Cannot publish an active-session script containing close.`,{retriable:!1,hint:`Close this session and record the journey again from a fresh open --save-script session.`});let r=-1;for(let[t,n]of e.entries())de({command:n.command,positionals:n.positionals,flags:n.flags})===`mutates-app`&&(r=t);if(!e.slice(r+1).some(Jn))throw new t(`COMMAND_FAILED`,`Cannot publish this session without a portable destination guard after the final mutating action.`,{retriable:!0,hint:`Record a selector-targeted wait on a labeled or id-bearing landmark, for example wait 'role="heading" label="Screen X"', so its recorded identity is captured, then retry session save-script.`})}function Un(e){for(let n of e){if(Wn(n)){Gn(n);continue}let e=Yn(n),r=e??(n.command===`wait`?n.positionals[0]:void 0);if(r?.startsWith(`@`))throw new t(`COMMAND_FAILED`,`Cannot publish recorded step "${n.command} ${r}": the session-local ref was not converted to a portable selector.`,{retriable:!1,hint:`Close this session and record the journey again using selectors or resolvable refs.`});if(n.command===`find`&&de(n)===`mutates-app`)throw new t(`COMMAND_FAILED`,`Cannot publish a recorded mutating find step because its target identity is not replay-verifiable.`,{retriable:!1,hint:`Close this session and record the journey again with an explicit selector-targeted click, press, fill, or focus action.`});let i=e;if(!(!i||!f(i)||n.targetEvidence))throw new t(`COMMAND_FAILED`,`Cannot publish recorded step "${n.command} ${i}": recording-time target identity evidence is missing.`,{retriable:!1,hint:`Close this session and record the journey again from open --save-script so target-v1 evidence is captured before each interaction.`})}}function Wn(e){return Kn(e)!==void 0}function Gn(e){let n=Kn(e);if(!n)return;let r=[n.source,n.destination];for(let n of r){if(n?.startsWith(`@`))throw new t(`COMMAND_FAILED`,`Cannot publish recorded drag endpoint "${n}": the session-local ref was not converted to a portable selector.`,{retriable:!1});if(!(!n||!f(n))&&!e.targetEvidences)throw new t(`COMMAND_FAILED`,`Cannot publish recorded drag endpoint "${n}": recording-time target identity evidence is missing.`,{retriable:!1,hint:`Close this session and record the journey again so targets-v1 evidence is captured for both drag endpoints.`})}}function Kn(e){return e.command===`gesture`?l(e.positionals):void 0}function qn(e,n){if(e instanceof t){if(e.details?.reason===`script_target_exists`)return new t(e.code,`A file already exists at ${String(e.details.path)}.`,{...e.details,retriable:!0,hint:`Retry session save-script with another path, or pass --force to replace the existing file. The session remains armed.`});let n=e.details?.retriable===!0;return new t(e.code,e.message,{...e.details,retriable:n,hint:e.details?.hint??(n?`Fix the recorded journey or target, then retry session save-script. The session remains armed.`:`Close this session and start a fresh one with open <app> --save-script[=<path>].`)})}let r=e instanceof Error?e.message:String(e);return new t(`COMMAND_FAILED`,`Failed to publish the active session script${n?` to ${n}`:``}: ${r}`,{retriable:!0,hint:`Check the target path and permissions, then retry session save-script. The session remains armed.`})}function Jn(e){if(e.command!==`wait`)return!1;let t=le(e.positionals);return t?.kind!==`selector`||!f(t.selectorExpression)?!1:e.targetEvidence?.verification===`verified`}function Yn(e){if(e.command===`get`)return e.positionals[1];if(Ie(e.command)||e.command===`fill`){let[t,n]=e.positionals;return t!==void 0&&n!==void 0&&Xn(t)&&Xn(n)?void 0:t}}function Xn(e){return e.trim().length>0&&Number.isFinite(Number(e))}function Zn(e){let t=e.scriptPublication??D;return t.kind===`repair`?t.status===`committed`?!0:!Ft(t):!1}function Qn(e){return!e.recordSession||It(e.scriptPublication??D)?!0:Zn(e)}var $n=class{sessionsDir;constructor(e){this.sessionsDir=e}write(e,t){let n=mn(e),r=t?.publication===`active`,i;try{if(Qn(e))return{written:!1};let a=er(e,{appendCompleteSentinel:n,activePublication:r});i=this.resolveScriptPath(e);let o=g.dirname(i);return _.existsSync(o)||_.mkdirSync(o,{recursive:!0}),rr({scriptPath:i,script:a.script,force:t?.force}),n&&(e.scriptPublication=Wt(e.scriptPublication??D)),{written:!0,path:i,actionCount:a.actionCount}}catch(t){return tr({session:e,error:t,scriptPath:i,repairArmed:n,activePublication:r})}}resolveScriptPath(e){let t=Yt(e.scriptPublication??D);if(t)return A(t);let n=k(e.name),r=new Date(e.createdAt).toISOString().replace(/[:.]/g,`-`);return g.join(this.sessionsDir,`${n}-${r}.ad`)}};function er(e,t){let n=ir(e,{strictPortableRefs:t.activePublication});return t.activePublication&&Hn(n),{script:mr(e,n,t.appendCompleteSentinel),actionCount:n.length}}function tr(e){let{session:n,error:r,scriptPath:i,repairArmed:a,activePublication:o}=e;if(m({level:`warn`,phase:`session_script_write_failed`,data:{session:n.name,path:i,error:r instanceof Error?r.message:String(r)}}),a)return{written:!1,error:nr(r,i)};if(o)return{written:!1,error:qn(r,i)};if(r instanceof t)throw r;return{written:!1}}function nr(e,n){if(e instanceof t)return e;let r=e instanceof Error?e.message:String(e);return new t(`COMMAND_FAILED`,`Failed to write the healed script${n?` to ${n}`:``}: ${r}`,{hint:`The repair transaction completed but the healed .ad could not be published; check the target path and permissions, then retry close --save-script.`})}function rr(e){let{scriptPath:n,script:r,force:i}=e,a=g.dirname(n),o=g.join(a,`.${g.basename(n)}.${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}.tmp`);_.writeFileSync(o,r);try{if(i){_.renameSync(o,n);return}_.linkSync(o,n)}catch(e){throw e.code===`EEXIST`?new t(`COMMAND_FAILED`,`A file already exists at ${n}; remove it, pass replay --save-script=<other-path>, or pass --force/--overwrite to replace it.`,{reason:`script_target_exists`,path:n}):e}finally{_.rmSync(o,{force:!0})}}function ir(e,t={}){let n=N(e),r=n!==void 0,i=e.actions.slice(n??0),a=[];for(let n of i){if(n.command===`snapshot`)continue;let i=sr(n);if(i){a.push(i);continue}(r||t.strictPortableRefs)&&ar(n);let o=pr(e,n);o&&a.push(o),a.push(n)}return t.strictPortableRefs&&Un(a),a}function ar(e){let n=e.command===`gesture`?l(e.positionals??[]):void 0;if(n){or(n);return}if(!L(e.command))return;let r=e.command===`get`?e.positionals?.[1]:e.positionals?.[0];if(r?.startsWith(`@`))throw new t(`COMMAND_FAILED`,`Cannot write recorded step "${e.command} ${r}" to a script: it never resolved to a selector, so the ref would not resolve in a fresh replay session.`)}function or(e){let n=[e.source,e.destination].find(e=>e.startsWith(`@`));if(n)throw new t(`COMMAND_FAILED`,`Cannot write recorded drag endpoint "${n}" to a script: it never resolved to a selector, so the ref would not resolve in a fresh replay session.`)}function sr(e){let t=cr(e);if(!(!t||!L(e.command)))return b(e.command)?{...e,positionals:[t]}:e.command===`longpress`?ur(e,t):e.command===`fill`?lr(e,t):dr(e,t)}function cr(e){let t=Array.isArray(e.result?.selectorChain)&&e.result.selectorChain.every(e=>typeof e==`string`)?e.result.selectorChain:[];return t.length>0?t.join(` || `):void 0}function L(e){return Ie(e)||e===`fill`||e===`get`}function lr(e,t){let n=P(e);return n.length>0?{...e,positionals:[t,n]}:void 0}function ur(e,t){let n=typeof e.result?.durationMs==`number`?String(e.result.durationMs):fr(e.positionals??[]);return{...e,positionals:n?[t,n]:[t]}}function dr(e,t){let n=e.positionals?.[0];return n===`text`||n===`attrs`?{...e,positionals:[n,t]}:void 0}function fr(e){let t=e.at(-1);if(!(e.length<=1||t===void 0||t.trim()===``))return Number.isFinite(Number(t))?t:void 0}function pr(e,t){if(!L(t.command))return;let n=t.result?.refLabel;if(typeof n!=`string`||n.trim().length===0)return;let r=n.trim();return{ts:t.ts,command:`snapshot`,positionals:[],flags:{platform:e.device.platform,snapshotInteractiveOnly:!0,snapshotScope:r},result:{scope:r}}}function mr(e,t,n){let r=[],i=e.device.kind?` kind=${e.device.kind}`:``;r.push(`context platform=${pe(e.device)} device=${Re(e.device.name)}${i} theme=unknown`);for(let e of t)e.flags?.noRecord||(r.push(...yt(e)),r.push(hr(e)));return n&&r.push(`# agent-device:heal-complete`),`${r.join(`
2
- `)}\n`}function hr(e){return gr([e.command],e)||vt(e)}function gr(e,t){if(b(t.command))return _r(e,t);if(t.command===`fill`)return vr(e,t);if(t.command===`get`)return yr(e,t)}function _r(e,t){let n=t.positionals?.[0];if(n){if(n.startsWith(`@`))return e.push(x(v(n))),R(e,t),C(e,t),e.join(` `);if(t.positionals.length===1)return e.push(x(n)),C(e,t),e.join(` `)}}function vr(e,t){let n=t.positionals?.[0];if(!n?.startsWith(`@`))return;e.push(x(v(n))),R(e,t);let r=t.positionals.slice(1).join(` `);return t.positionals.length>1&&e.push(x(r)),C(e,t),e.join(` `)}function yr(e,t){let n=t.positionals?.[0],r=t.positionals?.[1];if(!(!n||!r))return e.push(x(n)),e.push(x(v(r))),r.startsWith(`@`)&&R(e,t),e.join(` `)}function R(e,t){let n=t.result?.refLabel;typeof n==`string`&&n.trim().length>0&&e.push(x(n))}const br=[`status`,`get`,`dismiss`,`enter`,`return`];function z(e){return br.includes(e)}const xr=[`id`,`deviceId`,`device_id`,`serial`,`udid`,`device_udid`,`identifier`],Sr={ios:`iOS`,ipados:`iPadOS`,tvos:`tvOS`,watchos:`watchOS`,visionos:`visionOS`,macos:`macOS`,apple:`Apple`,android:`Android`,linux:`Linux`,web:`Web`};function Cr(e,t){let n=t??{};switch(e.command){case p.devices:return wr(n.devices);case p.apps:return Tr(n.apps,e.flags?.appsFilter);case p.boot:return Er(`Booted`,n,!0);case p.shutdown:return Er(`Shut down`,n,!1);case p.install:return Dr(`Installed`,n);case p.reinstall:return Dr(`Reinstalled`,n);case p.screenshot:return Or(e,n);default:return{}}}function wr(e){if(!Array.isArray(e))return{};let t=e.flatMap(e=>{let t=Ar(e);return t?[t]:[]}),n=t.slice(0,5),r=Math.max(0,t.length-n.length),i=t.slice(0,3);return{summary:zr(`Found ${t.length} ${Br(`device`,t.length)}`,i.map(e=>Lr(e,!0)),Math.max(0,t.length-i.length)),details:{deviceCount:t.length,devices:n,...r>0?{omittedDeviceCount:r}:{}}}}function Tr(e,t){if(!Array.isArray(e))return{};let n=e.flatMap(e=>{let t=H(e);return t?[t]:[]}),r=n.slice(0,5),i=Math.max(0,n.length-r.length),a=n.slice(0,3);return{summary:zr(`Found ${n.length} ${Br(`app`,n.length)}`,a,Math.max(0,n.length-a.length)),details:{appCount:n.length,apps:r,...i>0?{omittedAppCount:i}:{},...t===`all`||t===`user-installed`?{filter:t}:{}}}}function Er(e,t,n){let r=jr(t);if(!r)return{};let i={device:r,...Ir(t),booted:n};return{summary:`${e} ${Lr(i,!1)}`,details:i}}function Dr(e,t){let n=H(t.appName),r=H(t.bundleId),i=B(t,[`packageName`,`package`]),a=H(t.platform),o=H(t.launchTarget),s=B(t,[`bundleId`,`packageName`,`package`,`appId`,`launchTarget`]),c=Rr(n,s);if(!c)return{};let l={};return V(l,`appName`,n),V(l,`bundleId`,r),V(l,`packageName`,i),V(l,`platform`,a),o!==s&&V(l,`launchTarget`,o),{summary:`${e} ${c}`,details:l}}function Or(e,t){let n=kr(e,t);return n?{details:{requestedFileName:n}}:{}}function kr(e,t){let n=J(e.meta?.clientArtifactPaths?.path)??J(t.path);if(n)return q(n)}function Ar(e){if(!d(e))return;let t=jr(e);if(t)return{name:t,...Ir(e)}}function jr(e){let t=B(e,[`name`,`deviceName`,`device`]);return!t||!Mr(e,t)?t:Pr(e)}function Mr(e,t){let n=Nr(t);return xr.some(t=>{let r=H(e[t]);return r!==void 0&&Nr(r)===n})}function Nr(e){return e.toLowerCase()}function Pr(e){let t=H(e.appleOs),n=H(e.platform),r=H(e.kind),i=Fr(t,n);return i&&(r===`simulator`||r===`emulator`)?`${i} ${r}`:i?`${i} device`:r===`simulator`?`Simulator`:r===`emulator`?`Emulator`:`Unnamed device`}function Fr(e,t){let n=e??t;if(!(!n||!Object.hasOwn(Sr,n)))return Sr[n]}function Ir(e){let t=H(e.platform),n=H(e.appleOs),r=H(e.kind),i=H(e.target);return{...t?{platform:t}:{},...n?{appleOs:n}:{},...r?{kind:r}:{},...i?{target:i}:{},...typeof e.booted==`boolean`?{booted:e.booted}:{}}}function Lr(e,t){let n=H(e.name)??H(e.device)??`device`,r=H(e.platform),i=H(e.appleOs),a=[r,i===r?void 0:i,H(e.kind),H(e.target),t&&typeof e.booted==`boolean`?e.booted?`booted`:`stopped`:void 0].filter(e=>!!e);return a.length>0?`${n} (${a.join(`, `)})`:n}function Rr(e,t){return e&&t&&e!==t?`${e} (${t})`:e??t}function B(e,t){for(let n of t){let t=H(e[n]);if(t)return t}}function V(e,t,n){n&&(e[t]=n)}function zr(e,t,n){let r=[...t,...n>0?[`+${n} more`]:[]];return r.length>0?`${e}: ${r.join(`, `)}`:e}function Br(e,t){return t===1?e:`${e}s`}function H(e){let t=J(e);if(!t)return;let n=t.trim(),r=Array.from(n);return r.length<=120?n:`${r.slice(0,119).join(``)}…`}function U(e){return H(e)}function W(e){return typeof e==`boolean`?e:void 0}function G(e,t){let n=U(e);return n&&t.includes(n)?n:void 0}function K(e){return Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0))}function q(e){let t=J(e);return t?H(t.split(/[\\/]/).at(-1)):void 0}function J(e){if(typeof e==`string`)return e.trim().length>0?e:void 0}function Y(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}const Vr=[`up`,`down`,`left`,`right`],Hr=[`top`,`bottom`];function Ur(e){return`${e.command===p.reinstall?`Reinstalled`:`Installed`} ${qr(e.result??{})??`app`}`}function Wr(e){let t=e.result??{};switch(e.command){case p.scroll:return Yr(t);case p.screenshot:return Qr(t);case p.home:return`Went home`;case p.back:return ei(t);case p.appSwitcher:return`Opened app switcher`;case p.orientation:return ti(t);case p.viewport:return ni(t);case p.clipboard:return ri(t);case p.keyboard:return ii(t);case p.tvRemote:return si(t);case p.gesture:return ci(t);case p.swipe:return li(t);case p.trace:return di(`trace`,e);case p.record:return di(`recording`,e);default:return}}function Gr(e){let t=e.result??{};switch(e.command){case p.scroll:return K({direction:G(t.direction,Vr),edge:G(t.edge,Hr),passes:Y(t.passes),amount:Y(t.amount),pixels:Y(t.pixels),durationMs:Y(t.durationMs),x1:Y(t.x1),y1:Y(t.y1),x2:Y(t.x2),y2:Y(t.y2)});case p.screenshot:return K({requestedFileName:$r(t)});case p.back:return K({mode:G(t.mode,ne)});case p.orientation:return K({orientation:G(t.orientation,Se)});case p.viewport:return K({width:Y(t.width),height:Y(t.height)});case p.clipboard:return K({action:G(t.action,[`read`,`write`])});case p.keyboard:return oi(t);case p.tvRemote:return K({button:G(t.button,s),durationMs:Y(t.durationMs)});case p.gesture:case p.swipe:return ui(t);case p.trace:case p.record:return K({action:G(t.action,[`start`,`stop`]),fileName:pi(e),showTouches:W(t.showTouches)});default:return{}}}function Kr(e,t){if(e.command!==p.screenshot)return t;let n=kr(e,t);return n?{...t,requestedFileName:n}:t}function qr(e){let t=U(e.appName),n=mi(e,[`bundleId`,`packageName`,`appBundleId`,`launchTarget`]);return t&&n&&t!==n?`${t} (${n})`:t??n??Jr(e)}function Jr(e){let t=U(e.app);return t&&!t.includes(`/`)&&!t.includes(`\\`)?t:void 0}function Yr(e){let t=G(e.direction,Vr),n=G(e.edge,Hr),r=Y(e.passes);return n?Xr(n,r):t?Zr(t,e):`Scrolled`}function Xr(e,t){return t===0?`Already at ${e}`:t===void 0?`Scrolled to ${e}`:`Scrolled to ${e} in ${t} ${t===1?`pass`:`passes`}`}function Zr(e,t){let n=Y(t.pixels);if(n!==void 0)return`Scrolled ${e} by ${n}px`;let r=Y(t.amount);return r===void 0?`Scrolled ${e}`:`Scrolled ${e} by ${r}`}function Qr(e){let t=$r(e);return t?`Captured screenshot ${t}`:`Captured screenshot`}function $r(e){return q(e.requestedFileName)??q(e.path)}function ei(e){return G(e.mode,ne)===`system`?`Went back using system navigation`:`Went back`}function ti(e){let t=G(e.orientation,Se);return t?`Rotated to ${t}`:`Changed orientation`}function ni(e){let t=Y(e.width),n=Y(e.height);return t!==void 0&&n!==void 0?`Set viewport to ${t}×${n}`:`Changed viewport`}function ri(e){let t=G(e.action,[`read`,`write`]);return t===`read`?`Read clipboard`:t===`write`?`Updated clipboard`:`Used clipboard`}function ii(e){let t=J(e.action);if(!t||!z(t))return`Used keyboard`;if(t===`dismiss`)return ai(e);if(t===`enter`||t===`return`)return`Pressed keyboard return`;let n=W(e.visible);return n===void 0?`Inspected keyboard`:n?`Keyboard is visible`:`Keyboard is hidden`}function ai(e){return W(e.dismissed)===!1?`Keyboard was already hidden`:`Dismissed keyboard`}function oi(e){let t=J(e.action);return K({action:t&&z(t)?t:void 0,platform:G(e.platform,[`ios`,`android`]),visible:W(e.visible),wasVisible:W(e.wasVisible),dismissed:W(e.dismissed),attempts:Y(e.attempts),mechanism:G(e.mechanism,[`dismissKey`])})}function si(e){let t=G(e.button,s);return t?`Pressed TV remote ${t}`:`Used TV remote`}function ci(e){let t=G(e.kind,[`fling`,`pan`,`pinch`,`rotate`,`transform`]);return t?`Ran ${t} gesture`:`Ran gesture`}function li(e){let t=Y(e.count);return t!==void 0&&t>1?`Swiped ${t} times`:`Swiped`}function ui(e){return K({kind:G(e.kind,[`fling`,`pan`,`pinch`,`rotate`,`transform`]),durationMs:Y(e.durationMs),pointerCount:Y(e.pointerCount),x1:Y(e.x1),y1:Y(e.y1),x2:Y(e.x2),y2:Y(e.y2),count:Y(e.count),pauseMs:Y(e.pauseMs),pattern:G(e.pattern,[`one-way`,`ping-pong`]),scale:Y(e.scale)})}function di(e,t){let n=fi(e,G(t.result?.action,[`start`,`stop`])),r=pi(t);return r?`${n} ${r}`:n}function fi(e,t){return t===`start`?e===`trace`?`Started trace`:`Started recording`:t===`stop`?e===`trace`?`Stopped trace`:`Stopped recording`:e===`trace`?`Updated trace`:`Updated recording`}function pi(e){let t=e.result??{};return q(t.requestedFileName)??q(t.outPath)??q(t.path)??q(e.positionals[1])}function mi(e,t){for(let n of t){let t=U(e[n]);if(t)return t}}function hi(e){switch(e.command){case p.open:return`Opened ${X(e)??`session`}`;case p.close:return`Closed ${U(e.result?.session)??`session`}`;case p.click:case p.press:return`Tapped ${X(e)??`target`}`;case p.longPress:return`Long pressed ${X(e)??`target`}`;case p.fill:return`Filled ${X(e)??`target`}`;case p.type:return`Typed text`;case p.install:case p.reinstall:case ve.installSource:return Ur(e);default:return Wr(e)??`Ran ${e.command}`}}function gi(e){return K({command:e.command,positionals:Ti(e),flags:Ii(e),..._i(e),...vi(e),...yi(e),...Gr(e)})}function _i(e){if(!bi(e.command))return{};let t=e.result??{};return K({ref:Wi(t),targetLabel:X(e),selectorChainLength:Ni(t.selectorChain)?.length,x:Y(t.x),y:Y(t.y),x2:Y(t.x2),y2:Y(t.y2),durationMs:Y(t.durationMs)})}function vi(e){if(!xi(e.command))return{};let t=e.result??{};return K({platform:G(t.platform,me),target:G(t.target,ge),appName:U(t.appName),appBundleId:U(t.appBundleId),bundleId:U(t.bundleId),packageName:U(t.packageName),launchTarget:U(t.launchTarget)})}function yi(e){let t=e.result??{};return e.command===p.snapshot?{...Array.isArray(t.nodes)?{nodeCount:t.nodes.length}:{}}:e.command!==p.wait&&e.command!==p.find&&e.command!==p.get&&e.command!==p.is?{}:K({waitedMs:Y(t.waitedMs),found:W(t.found)})}function bi(e){return e===p.click||e===p.press||e===p.longPress||e===p.focus||e===p.fill}function xi(e){return e===p.open||e===p.install||e===p.reinstall||e===ve.installSource}function X(e){let t=e.result??{};return Si(t)??Ci(t)??wi(t)??ji(e.positionals[0])}function Si(e){let t=Wi(e);if(t)return t.startsWith(`@`)?t:`@${t}`}function Ci(e){let t=Y(e.x),n=Y(e.y);if(t!==void 0&&n!==void 0)return`(${t}, ${n})`}function wi(e){return U(e.appName)??U(e.appBundleId)??U(e.bundleId)??U(e.packageName)}function Ti(e){if(e.positionals.length!==0)return e.command===p.type?[Q(`text`)]:e.command===p.fill?Ei(e):e.command===p.find?Di(e):e.command===p.clipboard?Oi(e):e.command===p.push?ki(e,`app`,`payload`):e.command===p.triggerAppEvent?ki(e,`event`,`payload`):e.positionals.map(Z)}function Ei(e){let t=Q(`text`),n=e.result??{},r=Wi(n);if(r)return[`@${r}`,t];if(U(n.selector))return[Q(`target`),t];let i=Y(n.x),a=Y(n.y);return i!==void 0&&a!==void 0?[String(i),String(a),t]:[t]}function Di(e){let t=+!!Mi(e.positionals[0]);if(e.positionals[t]===void 0)return;let n=t+1,r=[...t===1?[String(e.positionals[0])]:[],Q(`query`)],i=e.positionals[n];return i?i===`fill`||i===`type`?[...r,i,Q(`text`)]:[...r,...e.positionals.slice(n).map(Ai)]:r}function Oi(e){let t=e.positionals[0]?.toLowerCase();return t===`read`?[`read`]:t===`write`?[`write`,Q(`text`)]:e.positionals.map(Z)}function ki(e,t,n){let[r,i,...a]=e.positionals;return[...r?[Q(t)]:[],...i?[Q(n)]:[],...a.map(Z)]}function Ai(e){return e===`click`||e===`focus`||e===`exists`||e===`get`||e===`text`||e===`attrs`||e===`wait`?e:Z(e)}function Z(e){return ji(e)??Q(`arg`)}function ji(e){if(!e)return;let t=e.trim();if(/^@[a-zA-Z0-9:_-]+$/.test(t))return t}function Q(e){return`<${e}>`}function Mi(e){return e===`text`||e===`label`||e===`value`||e===`role`||e===`id`}function Ni(e){return Array.isArray(e)&&e.every(e=>typeof e==`string`)?e:void 0}const Pi={enums:[{source:`platform`,values:he},{source:`target`,values:ge}]},Fi={[p.open]:{booleans:[{source:`relaunch`},{source:`testIme`}],enums:[{source:`surface`,values:be}]},[p.click]:Li(),[p.press]:Li(),[p.longPress]:Li(),[p.fill]:Ri(),[p.type]:Ri(),[p.scroll]:{booleans:[{source:`settle`}],numbers:[{source:`pixels`},{source:`durationMs`},{source:`settleQuietMs`}]},[p.gesture]:zi(),[p.swipe]:zi(),[p.screenshot]:{booleans:[{source:`overlayRefs`},{source:`screenshotFullscreen`,output:`fullscreen`},{source:`screenshotNoStabilize`,output:`noStabilize`},{source:`screenshotNormalizeStatusBar`,output:`normalizeStatusBar`}],numbers:[{source:`screenshotPixelDensity`,output:`pixelDensity`},{source:`screenshotScale`,output:`scale`}]},[p.snapshot]:{booleans:[{source:`snapshotInteractiveOnly`,output:`interactiveOnly`},{source:`snapshotDiff`,output:`diff`},{source:`snapshotRaw`,output:`raw`},{source:`snapshotCustomActions`,output:`actions`},{source:`snapshotForceFull`,output:`forceFull`}],numbers:[{source:`snapshotDepth`,output:`depth`}]},[p.back]:{booleans:[{source:`settle`}],numbers:[{source:`settleQuietMs`}],enums:[{source:`backMode`,output:`mode`,values:ne}]},[p.record]:{booleans:[{source:`hideTouches`}],numbers:[{source:`fps`}],enums:[{source:`recordingScope`,output:`scope`,values:_e}]},[p.apps]:{enums:[{source:`appsFilter`,output:`filter`,values:[`user-installed`,`all`]}]},[p.boot]:{booleans:[{source:`headless`}]},[p.close]:{booleans:[{source:`shutdown`}]}};function Ii(e){let t=e.flags??{},n={},r=Object.hasOwn(Fi,e.command)?Fi[e.command]:void 0;return Bi(n,t,Pi),Bi(n,t,r),Object.keys(n).length>0?n:void 0}function Li(){return{booleans:[{source:`doubleTap`},{source:`settle`}],numbers:[{source:`count`},{source:`intervalMs`},{source:`holdMs`},{source:`jitterPx`},{source:`settleQuietMs`}],enums:[{source:`clickButton`,values:ee}]}}function Ri(){return{booleans:[{source:`settle`}],numbers:[{source:`delayMs`},{source:`settleQuietMs`}]}}function zi(){return{numbers:[{source:`pointerCount`},{source:`count`},{source:`pauseMs`}],enums:[{source:`pattern`,values:r}]}}function Bi(e,t,n){n&&(Vi(e,t,n.booleans??[]),Hi(e,t,n.numbers??[]),Ui(e,t,n.enums??[]))}function Vi(e,t,n){for(let r of n)Gi(e,r.output??r.source,t[r.source])}function Hi(e,t,n){for(let r of n)Ki(e,r.output??r.source,t[r.source])}function Ui(e,t,n){for(let r of n)qi(e,r.output??r.source,t[r.source],r.values)}function Wi(e){let t=U(e.ref);if(!t)return;let n=t.startsWith(`@`)?t.slice(1):t;return/^[a-zA-Z0-9:_-]+$/.test(n)?n:void 0}function Gi(e,t,n){typeof n==`boolean`&&(e[t]=n)}function Ki(e,t,n){let r=Y(n);r!==void 0&&(e[t]=r)}function qi(e,t,n,r){let i=G(n,r);i!==void 0&&(e[t]=i)}const $=new Map,Ji=new Set;function Yi(e){return g.join(e,`events.ndjson`)}function Xi(e){return e.command!==p.events}function Zi(t,n,r){let i=e({version:1,ts:r.ts??new Date().toISOString(),session:n,...r});$i(t,`${JSON.stringify(i)}\n`)}async function Qi(e){await(e?$.get(e):Promise.all($.values()))}function $i(e,t){let n=($.get(e)??Promise.resolve()).catch(()=>void 0).then(async()=>{await ea(e),await _.promises.appendFile(e,t,`utf8`)}).catch(t=>{m({level:`warn`,phase:`session_event_log_write_failed`,data:{path:e,error:t instanceof Error?t.message:String(t)}})}).finally(()=>{$.get(e)===n&&$.delete(e)});$.set(e,n)}async function ea(e){let t=g.dirname(e);if(!Ji.has(t))try{await _.promises.mkdir(t,{recursive:!0}),Ji.add(t)}catch(t){throw m({level:`warn`,phase:`session_event_log_dir_failed`,data:{path:e,error:t instanceof Error?t.message:String(t)}}),t}}function ta(e,t,n){Zi(e,t,{kind:`action.recorded`,requestId:h().requestId,command:n.command,summary:hi(n),details:gi(n)})}function na(e){let{req:t}=e;return{kind:`request.started`,requestId:t.meta?.requestId??h().requestId,command:t.command,summary:`Started ${t.command}`}}function ra(e){let{req:t,response:n,durationMs:r}=e;if(n.ok){let e=Cr(t,n.data);return{kind:`request.finished`,requestId:t.meta?.requestId??h().requestId,command:t.command,status:`ok`,summary:e.summary??`Finished ${t.command}`,details:{durationMs:r,...e.details}}}return{kind:`request.finished`,requestId:t.meta?.requestId??h().requestId,command:t.command,status:`error`,summary:`Failed ${t.command}: ${n.error.code}`,details:{durationMs:r,code:n.error.code,diagnosticId:n.error.diagnosticId}}}function ia(e,t={}){let n=la(t.cursor),r=ua(t.limit);if(!_.existsSync(e))return{path:e,cursor:String(n),limit:r,events:[]};let i=aa(e,n,r),a=i.lines.flatMap(e=>{let t=da(e);return t?[t]:[]});return{path:e,cursor:String(n),limit:r,events:a,...i.nextCursor===void 0?{}:{nextCursor:String(i.nextCursor)}}}function aa(e,t,n){let r=_.openSync(e,`r`);try{let e=new Ae(`utf8`),i=Buffer.allocUnsafe(65536),a=oa(t,n),o=``,s=0;do{s=_.readSync(r,i,0,i.length,null);let t=e.write(i.subarray(0,s));o=sa(`${o}${t}`,a)}while(s>0&&a.nextCursor===void 0);let c=`${o}${e.end()}`;return a.nextCursor===void 0&&c.length>0&&ca(c,a),{lines:a.lines,nextCursor:a.nextCursor}}finally{_.closeSync(r)}}function oa(e,t){return{cursor:e,limit:t,lineIndex:0,lines:[]}}function sa(e,t){let n=0;for(let r=e.indexOf(`
1
+ import{D as e,_ as t,h as n}from"./sdk-contracts.js";import{C as r,S as i,_ as a,v as o}from"./location-coordinates.js";import{Ar as s,Fn as c,Gt as l,Mn as u,Nn as d,Pn as ee,Ut as te,Yt as ne,jr as re,kr as f,v as ie}from"./sdk-batch-runner.js";import{_ as ae,i as oe,r as se,t as ce}from"./sdk-device.js";import{Dt as le,Vt as ue}from"./prepare-kind.js";import{r as de}from"./recording-export-quality.js";import{C as fe,H as pe,K as me,N as he,S as ge,n as _e}from"./interaction.js";import{n as p,t as ve}from"./command-catalog.js";import{t as ye}from"./session.js";import{t as be}from"./device.js";import{A as m,M as h}from"./sdk-android-adb.js";import{n as xe,t as Se}from"./path-resolution.js";import{n as Ce,t as we}from"./version.js";import{c as Te,d as Ee,n as De,s as Oe}from"./host-process.js";import g from"node:path";import ke from"node:crypto";import _ from"node:fs";import{StringDecoder as Ae}from"node:string_decoder";function v(e){return e.startsWith(`@`)?n(e)?.base??e:e}const je=/^-?\d+(\.\d+)?$/,Me=/^[^\s"\\]+$/,Ne=new Map([[`--count`,`count`],[`--interval-ms`,`intervalMs`],[`--hold-ms`,`holdMs`],[`--jitter-px`,`jitterPx`]]),Pe=new Map([[`--count`,`count`],[`--pause-ms`,`pauseMs`]]),Fe=new Map([[`--pointer-count`,`pointerCount`]]),Ie=new Map([[`--delay-ms`,`delayMs`]]);function y(e){return e===`click`||e===`press`}function Le(e){return y(e)||e===`longpress`}function Re(e){return e===`type`||e===`fill`}function b(e){return Be(e,Ve)}function ze(e){return JSON.stringify(e)}function x(e){return Be(e,He)}function Be(e,t){return t(e)?e:ze(e)}function Ve(e){return He(e)&&e.startsWith(`@`)||je.test(e)}function He(e){return Me.test(e)}const Ue=new Set([`fill`,`type`]);function We(e){if(!Ue.has(e.command)){let t=(e.positionals??[]).map(e=>b(e));return[e.command,...t].join(` `)}let t=Ge(e).map(e=>b(e)).join(` `);return[e.command,t,`<text>`].filter(e=>e.length>0).join(` `)}function Ge(e){if(e.command===`type`)return[];let t=e.positionals??[],n=t[0];return n===void 0?[]:n.startsWith(`@`)?[n]:t.length>=3&&je.test(n)&&je.test(t[1]??``)?[n,t[1]]:[n]}function S(e,t){let n=t.flags??{};if(y(t.command)){typeof n.count==`number`&&e.push(`--count`,String(n.count)),typeof n.intervalMs==`number`&&e.push(`--interval-ms`,String(n.intervalMs)),typeof n.holdMs==`number`&&e.push(`--hold-ms`,String(n.holdMs)),typeof n.jitterPx==`number`&&e.push(`--jitter-px`,String(n.jitterPx)),n.doubleTap===!0&&e.push(`--double-tap`);let t=n.clickButton;t&&t!==`primary`&&e.push(`--button`,t);return}if(t.command===`swipe`){typeof n.count==`number`&&e.push(`--count`,String(n.count)),typeof n.pauseMs==`number`&&e.push(`--pause-ms`,String(n.pauseMs)),(n.pattern===`one-way`||n.pattern===`ping-pong`)&&e.push(`--pattern`,n.pattern);return}if(t.command===`gesture`){typeof n.pointerCount==`number`&&e.push(`--pointer-count`,String(n.pointerCount));return}Re(t.command)&&typeof n.delayMs==`number`&&e.push(`--delay-ms`,String(n.delayMs))}function Ke(e,t){t&&((t.platform===`ios`||t.platform===`android`)&&e.push(`--platform`,t.platform),typeof t.metroHost==`string`&&t.metroHost.length>0&&e.push(`--metro-host`,x(t.metroHost)),typeof t.metroPort==`number`&&e.push(`--metro-port`,String(t.metroPort)),typeof t.bundleUrl==`string`&&t.bundleUrl.length>0&&e.push(`--bundle-url`,x(t.bundleUrl)),typeof t.launchUrl==`string`&&t.launchUrl.length>0&&e.push(`--launch-url`,x(t.launchUrl)))}function qe(e,t){let[n,...r]=t.positionals??[];n&&e.push(x(n));for(let t of r)e.push(b(t));typeof t.flags?.fps==`number`&&e.push(`--fps`,String(t.flags.fps)),(typeof t.flags?.quality==`number`||typeof t.flags?.quality==`string`)&&e.push(`--quality`,String(t.flags.quality)),t.flags?.hideTouches&&e.push(`--hide-touches`)}function Je(e,t){t.flags?.snapshotInteractiveOnly&&e.push(`-i`),typeof t.flags?.snapshotDepth==`number`&&e.push(`-d`,String(t.flags.snapshotDepth)),t.flags?.snapshotScope&&e.push(`-s`,b(t.flags.snapshotScope)),t.flags?.snapshotRaw&&e.push(`--raw`)}function Ye(e,t){for(let n of t.positionals??[])e.push(b(n));i(e,t.flags)}function Xe(e,t,n={}){let r=t.positionals??[],i=n.includeAllPositionals?r:r.slice(0,1);for(let t of i)e.push(x(t));Ke(e,t.flags)}function Ze(e,t){for(let n of t.positionals??[])e.push(b(t.command===`wait`?v(n):n));S(e,t)}function Qe(e,t){let n=[],r={},i=y(e)?Ne:e===`swipe`?Pe:e===`gesture`?Fe:Re(e)?Ie:void 0;for(let a=0;a<t.length;a+=1){let o=t[a];if(y(e)&&o===`--double-tap`){r.doubleTap=!0;continue}let s=t[a+1];if(y(e)&&o===`--button`&&s!==void 0){let e=s;(e===`primary`||e===`secondary`||e===`middle`)&&(r.clickButton=e),a+=1;continue}let c=i?.get(o);if(c&&s!==void 0){let e=et(s);if(e!==null){r[c]=e,a+=1;continue}}if(e===`swipe`&&o===`--pattern`&&s!==void 0){let e=s;(e===`one-way`||e===`ping-pong`)&&(r.pattern=e),a+=1;continue}n.push(o)}return{positionals:n,flags:r}}function $e(e){let t=[],n={};for(let r=0;r<e.length;r+=1){let i=e[r],a=e[r+1];if(i===`--platform`&&a!==void 0){let e=a;(e===`ios`||e===`android`)&&(n.platform=e),r+=1;continue}if(i===`--metro-host`&&a!==void 0){n.metroHost=a,r+=1;continue}if(i===`--metro-port`&&a!==void 0){let e=et(a);e!==null&&(n.metroPort=e),r+=1;continue}if(i===`--bundle-url`&&a!==void 0){n.bundleUrl=a,r+=1;continue}if(i===`--launch-url`&&a!==void 0){n.launchUrl=a,r+=1;continue}t.push(i)}return{positionals:t,flags:n}}function et(e){if(!e)return null;let t=Number(e);return!Number.isFinite(t)||t<0?null:Math.floor(t)}function tt(e){let t;for(let n of e){if(n.command===`runtime`&&typeof n.flags.platform==`string`){t=n.flags.platform;continue}if(n.command===`open`)return n.runtime?.platform??t}return t}function nt(e,t){for(let n of t.positionals??[])e.push(b(n));t.flags?.relaunch&&e.push(`--relaunch`),t.flags?.testIme===!0?e.push(`--test-ime`):t.flags?.testIme===!1&&e.push(`--no-test-ime`),Ke(e,t.runtime)}function rt(e){let t=[],n={};for(let r of e){if(r===`--relaunch`){n.relaunch=!0;continue}if(r===`--test-ime`){n.testIme=!0;continue}if(r===`--no-test-ime`){n.testIme=!1;continue}t.push(r)}let r=$e(t);return{positionals:r.positionals,flags:n,runtime:it(r.flags)?r.flags:void 0}}function it(e){return!!(e.platform||e.metroHost||e.metroPort!==void 0||e.bundleUrl||e.launchUrl)}const C=/^[A-Z_][A-Z0-9_]*$/,at=new Set(se.filter(e=>e!==`web`)),ot=new Set([`mobile`,`tv`,`desktop`]);function st(e){let n=[],r=[],i=e.split(/\r?\n/),a=!1,o,s=(e,n,r)=>{throw new t(`INVALID_ARGS`,`${e.kind===`multiple`?`targets-v1`:`target-v1`} annotation on line ${e.line} must be immediately followed by its action line (line ${n+1} ${r}).`)};for(let[e,l]of i.entries()){let i=l.trim();if(i.length===0){o&&s(o,e,`is blank`);continue}if(i.startsWith(`#`)){let t=ee(i);if(t.kind===`v1`){o&&s(o,e,`is another target annotation`),o={kind:`multiple`,evidence:t.evidence,line:e+1};continue}let n=c(i);if(n.kind===`v1`){o&&s(o,e,`is another target annotation`),o={kind:`single`,evidence:n.evidence,line:e+1};continue}o&&s(o,e,`is a comment`);continue}if(lt(i)){if(o&&s(o,e,`is an env directive`),a)throw new t(`INVALID_ARGS`,`env directives must precede all actions (line ${e+1}).`);continue}let u=pt(l);if(!u){o&&s(o,e,`did not parse as an action`);continue}let d=ge(u.command,u.positionals??[],`line ${e+1}`);if(d)throw new t(`INVALID_ARGS`,d);o&&=(o.kind===`single`?u.targetEvidence=o.evidence:u.targetEvidences=o.evidence,void 0),n.push(u),r.push(e+1),a=!0}if(o)throw new t(`INVALID_ARGS`,`${o.kind===`multiple`?`targets-v1`:`target-v1`} annotation on line ${o.line} must be immediately followed by its action line (end of script reached).`);return{actions:n,actionLines:r}}function ct(e){let t=e.split(/\r?\n/),n={};for(let[e,r]of t.entries()){let t=r.trim();if(t.length===0||t.startsWith(`#`))continue;if(lt(t)){ft(n,t,e+1);continue}if(!t.startsWith(`context `))break;let i=t.match(/(?:^|\s)platform=([^\s]+)/);if(i){let e=i[1];e&&at.has(e)&&w(n,`platform`,e)}let a=t.match(/(?:^|\s)target=([^\s]+)/);if(a){let e=a[1];e&&ot.has(e)&&w(n,`target`,e)}let o=t.match(/(?:^|\s)timeout=(\d+)/);if(o){let e=Number(o[1]);Number.isFinite(e)&&e>=1&&w(n,`timeoutMs`,Math.floor(e))}let s=t.match(/(?:^|\s)retries=(\d+)/);if(s){let e=Number(s[1]);Number.isFinite(e)&&e>=0&&w(n,`retries`,Math.floor(e))}}return n}function lt(e){return e===`env`||e.startsWith(`env `)||e.startsWith(`env `)}function ut(e,n){let r=e.slice(3).replace(/^[\s]+/,``),i=r.indexOf(`=`);if(i<=0)throw new t(`INVALID_ARGS`,`Invalid env directive on line ${n}: expected "env KEY=VALUE".`);let a=r.slice(0,i);if(!C.test(a))throw new t(`INVALID_ARGS`,`Invalid env key "${a}" on line ${n}: keys must be uppercase letters, digits, and underscores (e.g. APP_ID).`);if(a.startsWith(`AD_`))throw new t(`INVALID_ARGS`,`Invalid env key "${a}" on line ${n}: the AD_* namespace is reserved for built-in variables. Rename ${a} to avoid the AD_ prefix.`);return{key:a,value:dt(r.slice(i+1),n)}}function dt(e,n){if(e.length===0)return``;if(e.startsWith(`"`))try{let t=JSON.parse(e);if(typeof t!=`string`)throw Error(`not a string literal`);return t}catch{throw new t(`INVALID_ARGS`,`Invalid quoted env value on line ${n}.`)}return e}function ft(e,n,r){let{key:i,value:a}=ut(n,r),o=e.env??{};if(Object.prototype.hasOwnProperty.call(o,i))throw new t(`INVALID_ARGS`,`Duplicate env directive "${i}" on line ${r}.`);o[i]=a,e.env=o}function w(e,n,r){let i=e[n];if(i!==void 0)throw new t(`INVALID_ARGS`,i===r?`Duplicate replay test metadata "${n}" in context header.`:`Conflicting replay test metadata "${n}" in context header: ${String(i)} vs ${String(r)}.`);e[n]=r}function pt(e){let n=e.trim();if(n.length===0||n.startsWith(`#`))return null;let[i,...o]=ht(n);if(i===void 0||i===`context`)return null;let s={ts:Date.now(),command:i,positionals:[],flags:{}};if(i===`snapshot`){s.positionals=[];for(let e=0;e<o.length;e+=1){let t=o[e];if(t===`-i`){s.flags.snapshotInteractiveOnly=!0;continue}if(t!==`-c`){if(t===`--raw`){s.flags.snapshotRaw=!0;continue}if(t===`--force-full`){s.flags.snapshotForceFull=!0;continue}if((t===`-d`||t===`--depth`)&&e+1<o.length){let t=Number(o[e+1]);Number.isFinite(t)&&t>=0&&(s.flags.snapshotDepth=Math.floor(t)),e+=1;continue}if((t===`-s`||t===`--scope`)&&e+1<o.length){s.flags.snapshotScope=o[e+1],e+=1;continue}if(t===`--backend`&&e+1<o.length){e+=1;continue}}}return s}if(i===`open`){let e=rt(o);return s.positionals=e.positionals,Object.assign(s.flags,e.flags),s.runtime=e.runtime,s}if(i===`runtime`){let e=$e(o);return s.positionals=e.positionals,Object.assign(s.flags,e.flags),s}if(y(i)){let e=Qe(i,o);Object.assign(s.flags,e.flags);let t=e.positionals[0];if(t===void 0)return s;if(t.startsWith(`@`))return s.positionals=[v(t)],e.positionals[1]&&(s.result={refLabel:e.positionals[1]}),s;let n=e.positionals[0],r=e.positionals[1];return T(n)&&T(r)&&e.positionals.length>=2?(s.positionals=[n,r],s):(s.positionals=[e.positionals.join(` `)],s)}if(i===`fill`){let e=Qe(i,o);if(Object.assign(s.flags,e.flags),!mt(e.positionals))return s.positionals=e.positionals,s;let[t,n,...r]=e.positionals;if(T(t)&&T(n))return s.positionals=[t,n,r.join(` `)],s;let[a,c,...l]=e.positionals;if(a.startsWith(`@`)){let e=v(a);return l.length>0?(s.positionals=[e,l.join(` `)],s.result={refLabel:c},s):(s.positionals=[e,c],s)}return s.positionals=[a,[c,...l].join(` `)],s}if(i===`get`){let e=o[0],t=o[1];return e===void 0||t===void 0?(s.positionals=o,s):t.startsWith(`@`)?(s.positionals=[e,v(t)],o[2]&&(s.result={refLabel:o[2]}),s):(s.positionals=[e,o.slice(1).join(` `)],s)}if(i===`swipe`||i===`type`||i===`gesture`){let e=Qe(i,o);return Object.assign(s.flags,e.flags),s.positionals=e.positionals,s}if(i===`record`){let e=[];for(let n=0;n<o.length;n+=1){let r=o[n];if(r===a.cliToken)throw new t(`INVALID_ARGS`,a.migration.record);if(r===`--hide-touches`){s.flags.hideTouches=!0;continue}if(r===`--fps`&&n+1<o.length){let e=Number(o[n+1]);Number.isFinite(e)&&(s.flags.fps=Math.floor(e)),n+=1;continue}if(r===`--quality`&&n+1<o.length){let e=o[n+1],t=de(e);t!==void 0&&(s.flags.quality=t),n+=1;continue}e.push(r)}return s.positionals=e,s}if(i===`screenshot`){let e=[];for(let t=0;t<o.length;t+=1){let n=o[t],i=r({args:o,index:t,flags:s.flags});if(i.handled){t=i.nextIndex;continue}e.push(n)}return s.positionals=e,s}return s.positionals=i===`wait`||i===`longpress`?o.map(e=>v(e)):o,s}function mt(e){return e.length>=2}function T(e){return e?!Number.isNaN(Number(e)):!1}function ht(e){let t=[],n=0;for(;n<e.length&&(n=gt(e,n),!(n>=e.length));){let r=e[n]===`"`?_t(e,n):vt(e,n);t.push(r.value),n=r.nextCursor}return t}function gt(e,t){let n=t;for(;n<e.length&&/\s/.test(e.charAt(n));)n+=1;return n}function _t(e,n){let r=n+1,i=!1,a=r;for(;a<e.length;a+=1){let t=e.charAt(a);if(t===`"`&&!i)break;if(i){i=!1;continue}i=t===`\\`}if(a>=e.length)throw new t(`INVALID_ARGS`,`Invalid replay script line: ${e}`);let o=e.slice(n,a+1),s;try{s=JSON.parse(o)}catch{throw new t(`INVALID_ARGS`,`Invalid quoted value ${o} in replay script line: ${e}`,{hint:`Quoted replay values are JSON strings: escape backslashes, quotes, tabs, and newlines (\\\\, \\", \\t, \\n).`})}return{value:s,nextCursor:a+1}}function vt(e,t){let n=t;for(;n<e.length&&!/\s/.test(e.charAt(n));)n+=1;return{value:e.slice(t,n),nextCursor:n}}function yt(e,t={}){let n=[e.command];return e.command===`snapshot`?Je(n,e):e.command===`open`?nt(n,e):e.command===`runtime`?Xe(n,e,{includeAllPositionals:t.runtimeIncludeAllPositionals}):e.command===`record`?qe(n,e):e.command===`screenshot`?Ye(n,e):Ze(n,e),n.join(` `)}function bt(e){return e.targetEvidences?[u(e.targetEvidences)]:e.targetEvidence?[d(e.targetEvidence)]:[]}async function xt(e){return e===`https:`?(await import(`node:https`)).default:(await import(`node:http`)).default}function St(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 Ct(e,n,r){let i=[],a=0;for await(let o of e){let e=Buffer.isBuffer(o)?o:Buffer.from(o);if(a+=e.length,a>n)throw new t(`INVALID_ARGS`,r);i.push(e)}return Buffer.concat(i)}const wt=`/agent-device`,Tt=`x-agent-device-tenant`;function Et(e){return Dt(e,wt)}function Dt(e,t){let n=e.endsWith(`/`)?e:`${e}/`;return new URL(t.replace(/^\/+/,``),n).toString()}function Ot(e){let t=e?.trim();return t?{authorization:`Bearer ${t}`,"x-agent-device-token":t}:{}}function kt(e){let t=e?.trim();return t?{[Tt]:t}:{}}const E={kind:`none`};function D(e,t){if(t.path===void 0){let n=e??{kind:`default`,force:!1};return t.force?{...n,force:!0}:n}let n=e?.force===!0&&(e.kind==="default"||e.path===t.path);return{kind:`explicit`,path:t.path,force:t.force||n}}function At(e){return e.kind===`repair`?{...e,status:`armed`}:e}function jt(e){return e.kind===`none`?void 0:e.target}function Mt(e){return e.kind===`repair`&&(e.status===`complete`||e.status===`close-succeeded`)}function Nt(e){return e.kind===`authoring`&&e.status===`aborted`}function Pt(e){return e.kind===`authoring`?e.status===`armed`:e.kind===`repair`}function Ft(e){return e.kind===`repair`?e.status===`committed`:e.kind===`authoring`&&e.status===`published`}function It(e){return{kind:`authoring`,status:`armed`,target:D(void 0,e)}}function Lt(e){return e.kind!==`authoring`||e.status!==`armed`?e:{...e,status:`aborted`}}function Rt(e,t){return e.kind===`authoring`?{kind:`authoring`,status:`published`,target:{kind:`explicit`,path:t,force:e.target.force}}:e}function zt(e,t){let n=e.kind===`repair`?e:void 0,r=n?.sourcePath??t.sourcePath;return{kind:`repair`,status:n?.status??`armed`,target:D(n?.target,t.requested),boundary:n?.boundary??t.boundary,...r===void 0?{}:{sourcePath:r},...n?.closeReceipt===void 0?{}:{closeReceipt:n.closeReceipt}}}function Bt(e){return e.kind!==`repair`||e.status!==`armed`?e:{...e,status:`complete`}}function Vt(e,t){return e.kind===`repair`?{...e,status:e.status===`complete`?`close-succeeded`:e.status,closeReceipt:t}:e}function Ht(e){if(e.kind!==`repair`)return e;let{closeReceipt:t,...n}=e;return{...n,status:`committed`}}function Ut(e){if(e.kind!==`repair`)return e;let{closeReceipt:t,...n}=e;return{...n,status:`aborted`}}function Wt(e){return e.kind===`repair`?e.boundary:void 0}function Gt(e){return e.kind===`repair`?e.sourcePath:void 0}function Kt(e){return e.kind===`repair`&&e.status!==`committed`}function qt(e){let t=jt(e);return t?.kind===`explicit`?t.path:void 0}function Jt(e){return jt(e)?.force===!0}function O(e){return e.replace(/[^a-zA-Z0-9._-]/g,`_`)}function k(e,t){return xe(e,{cwd:t})}function A(e){return e?.scriptPublication??E}function Yt(e){let t=A(e);return t.kind===`authoring`&&t.status===`armed`}function Xt(e,t){e.scriptPublication=It({path:t.path===void 0?void 0:k(t.path),force:t.force===!0})}function Zt(e){e.scriptPublication=Lt(A(e))}function Qt(e){return Pt(A(e))}function $t(e,t){if(!t.saveScript||Nt(A(e)))return;let n={path:typeof t.saveScript==`string`?k(t.saveScript):void 0,force:t.force===!0},r=A(e);if(r.kind===`repair`){e.scriptPublication=zt(r,{requested:n,boundary:r.boundary,sourcePath:r.sourcePath});return}if(r.kind===`authoring`){e.scriptPublication={...r,target:D(r.target,n)};return}e.scriptPublication=It(n)}function en(e,t){let n=A(e);n.kind===`authoring`&&(e.scriptPublication={...n,target:D(n.target,{path:t.explicitPath===void 0?void 0:k(t.explicitPath),force:t.liveForce===!0})})}function tn(e,t){e.scriptPublication=Rt(A(e),t)}function nn(e,t){let n=A(e);n.kind===`authoring`&&(e.scriptPublication=Rt(n,t))}function rn(e,t){return t===!0||Jt(A(e))}function an(e){return Ft(A(e))}function j(e){return e?.scriptPublication??E}function on(e,t){let n=j(e);e.scriptPublication=zt(n,{requested:{path:typeof t.saveScript==`string`?k(t.saveScript):n.kind===`repair`?void 0:t.healedSiblingPath,force:t.force===!0},boundary:t.firstArm?e.actions.length:0,sourcePath:t.sourcePath})}function sn(e){e.scriptPublication=At(j(e))}function cn(e){e.scriptPublication=Bt(j(e))}function ln(e,t){e.scriptPublication=Vt(j(e),t)}function un(e){e.scriptPublication=Ut(j(e))}function dn(e,t){let n=j(e);return n.kind===`repair`&&n.closeReceipt===t}function fn(e){return j(e).kind===`repair`}function pn(e){return Kt(j(e))}function M(e){return Wt(j(e))}function mn(e){return Gt(j(e))}function N(e){let t=e.result?.text;if(typeof t==`string`)return t;let n=e.positionals??[];return n.length===0?``:n[0]?.startsWith(`@`)?n.length>=3?n.slice(2).join(` `):n.slice(1).join(` `):n.length>=3&&!Number.isNaN(Number(n[0]))&&!Number.isNaN(Number(n[1]))?n.slice(2).join(` `):n.slice(1).join(` `)}const hn=/^\$\{([A-Z_][A-Z0-9_]*)\}$/;function gn(e){if(e!==e.trim()||!C.test(e))throw new t(`INVALID_ARGS`,`Invalid --record-as variable "${e}": use uppercase letters, digits, and underscores (for example PASSWORD).`);if(e.startsWith(`AD_`))throw new t(`INVALID_ARGS`,`Invalid --record-as variable "${e}": the AD_* namespace is reserved for built-in replay variables.`);return e}function _n(e){return`\${${e}}`}function vn(e){let t=hn.exec(e);if(!(!t?.[1]||t[1].startsWith(`AD_`)))return t[1]}const yn=new Set(`action.backend.cost.delayMs.evidence.gesture.hint.kind.maestroFallbackReason.maestroNonHittableCoordinateFallbackAllowed.maestroNonHittableCoordinateFallbackUsed.message.platform.ref.referenceHeight.referenceWidth.refLabel.resolution.selector.selectorChain.settle.targetHittable.targetKind.text.warning.x.y`.split(`.`)),bn=new Set([`action`,`backend`,`gesture`,`kind`,`platform`,`ref`,`selector`,`targetKind`]),xn=new Set([`cost`,`evidence`,`resolution`,`settle`]),Sn=new Map([[`cost`,new Set([`nodeCount`,`runnerRoundTrips`,`wallClockMs`])],[`evidence`,new Set([`changedFromBefore`,`digest`,`foregroundApp`,`interactiveNodeCount`,`nodeCount`])],[`resolution`,new Set([`alternatives`,`kind`,`matchCount`,`phase`,`source`,`tiebreak`,`winnerDiagnostic`])],[`resolution.alternatives`,new Set([`diagnosticRef`,`label`,`role`])],[`resolution.winnerDiagnostic`,new Set([`diagnosticRef`,`label`,`role`])],[`settle`,new Set([`captures`,`diff`,`hint`,`quietMs`,`refs`,`refsGeneration`,`settled`,`tail`,`tailTruncated`,`timeoutMs`,`waitedMs`])],[`settle.diff`,new Set([`lines`,`summary`,`truncated`])],[`settle.diff.lines`,new Set([`kind`,`ref`,`text`])],[`settle.diff.summary`,new Set([`additions`,`removals`,`unchanged`])],[`settle.refs`,new Set([`ref`])],[`settle.tail`,new Set([`label`,`ref`,`role`])]]),Cn=new Set([`evidence.digest`,`evidence.foregroundApp`,`resolution.alternatives.diagnosticRef`,`resolution.alternatives.role`,`resolution.kind`,`resolution.phase`,`resolution.source`,`resolution.tiebreak`,`resolution.winnerDiagnostic.diagnosticRef`,`resolution.winnerDiagnostic.role`,`settle.diff.lines.kind`,`settle.diff.lines.ref`,`settle.refs.ref`,`settle.tail.ref`,`settle.tail.role`]);function wn(e,t,n){if(!e)return e;let r=jn(e.selectorChain);return{...Dn(e,t,n),...typeof e.text==`string`?{text:n}:{},...r?{selectorChain:r.filter(e=>!En(e,t))}:{}}}function Tn(e,t,n){return e&&{...e,...e.label===t?{label:n}:{},ancestry:e.ancestry.map(e=>({...e,...e.label===t?{label:n}:{}})),...e.scrollRegion?{scrollRegion:{...e.scrollRegion,...e.scrollRegion.label===t?{label:n}:{}}}:{}}}function En(e,t){return ne(e,t)}function Dn(e,t,n){return Object.fromEntries(Object.entries(e).map(([e,r])=>[yn.has(e)?e:F(e,t,n),On(r,e,t,n)]))}function On(e,t,n,r){return typeof e==`string`&&bn.has(t)?e:t===`selectorChain`&&An(e)?kn(e,n):P(e,n,r,xn.has(t)?t:void 0)}function P(e,t,n,r){if(typeof e==`string`)return r&&Cn.has(r)?e:F(e,t,n);if(Array.isArray(e))return e.map(e=>P(e,t,n,r));if(!e||typeof e!=`object`)return e;let i=r?Sn.get(r):void 0;return Object.fromEntries(Object.entries(e).map(([e,a])=>{let o=i?.has(e)===!0;return[o?e:F(e,t,n),P(a,t,n,o?`${r}.${e}`:void 0)]}))}function kn(e,t){return e.filter(e=>!En(e,t))}function F(e,t,n){if(!t)return e===t?n:e;let r=n?e.split(n):[e];return r.every(e=>!e.includes(t))?e:t.trim()?r.map(e=>e.replaceAll(t,n)).join(n):n}function An(e){return Array.isArray(e)&&e.every(e=>typeof e==`string`)}function jn(e){return An(e)?e:void 0}function Mn(e,t){if(t.flags?.noRecord||Ln(e,t))return;t.flags&&$t(e,t.flags);let n=Nn(t),r={ts:Date.now(),command:n.command,positionals:n.positionals,runtime:n.runtime,flags:zn(n.flags),result:n.result,...n.targetEvidence?{targetEvidence:n.targetEvidence}:{},...n.targetEvidences?{targetEvidences:n.targetEvidences}:{}};return e.actions.push(r),m({level:`debug`,phase:`record_action`,data:{command:t.command,session:e.name}}),r}function Nn(e){if(e.command!==`fill`||typeof e.flags.recordAs!=`string`)return e;let t=_n(gn(e.flags.recordAs)),n=N({ts:0,command:e.command,positionals:e.positionals,flags:e.flags});return{...e,positionals:Pn(e.positionals,t),result:wn(e.result,n,t),targetEvidence:Tn(e.targetEvidence,n,t)}}function Pn(e,t){let n=e[0];return n?.startsWith(`@`)?e.length>=3?[n,e[1],t]:[n,t]:e.length>=3&&Number.isFinite(Number(e[0]))&&Number.isFinite(Number(e[1]))?[e[0],e[1],t]:n===void 0?[t]:[n,t]}const Fn=new Set([`snapshot`,`get`,`is`,`find`]);function In(e){return e.internal?.replayPlanStep===!0?!1:Fn.has(e.command)}function Ln(e,t){return!t.interactiveObservation||M(e)===void 0?!1:t.flags?.record!==!0}const Rn=[`platform`,`device`,`udid`,`serial`,`out`,`verbose`,`metroHost`,`metroPort`,`bundleUrl`,`launchUrl`,`snapshotInteractiveOnly`,`snapshotDepth`,`snapshotScope`,`snapshotRaw`,`snapshotCustomActions`,...o,`relaunch`,`saveScript`,`force`,`noRecord`,`record`,`fps`,`quality`,`hideTouches`,`count`,`pointerCount`,`intervalMs`,`delayMs`,`holdMs`,`jitterPx`,`doubleTap`,`clickButton`,`pauseMs`,`pattern`];function zn(e){if(!e)return{};let t={};for(let n of Rn)e[n]!==void 0&&(t[n]=e[n]);return t}function Bn(e){let n=e.flatMap((e,t)=>e.command===`open`?[t]:[]);if(n.length!==1||n[0]!==0)throw new t(`COMMAND_FAILED`,`Cannot publish this session: an open-to-destination script requires exactly one initial recorded open.`,{retriable:!1,hint:`Close this session and start a fresh one with open <app> --save-script[=<path>].`});if(e.some(e=>e.command===`close`))throw new t(`COMMAND_FAILED`,`Cannot publish an active-session script containing close.`,{retriable:!1,hint:`Close this session and record the journey again from a fresh open --save-script session.`});let r=-1;for(let[t,n]of e.entries())ie({command:n.command,positionals:n.positionals,flags:n.flags})===`mutates-app`&&(r=t);if(!e.slice(r+1).some(Kn))throw new t(`COMMAND_FAILED`,`Cannot publish this session without a portable destination guard after the final mutating action.`,{retriable:!0,hint:`Record a selector-targeted wait on a labeled or id-bearing landmark, for example wait 'role="heading" label="Screen X"', so its recorded identity is captured, then retry session save-script.`})}function Vn(e){for(let n of e){if(Hn(n)){Un(n);continue}let e=qn(n),r=e??(n.command===`wait`?n.positionals[0]:void 0);if(r?.startsWith(`@`))throw new t(`COMMAND_FAILED`,`Cannot publish recorded step "${n.command} ${r}": the session-local ref was not converted to a portable selector.`,{retriable:!1,hint:`Close this session and record the journey again using selectors or resolvable refs.`});if(n.command===`find`&&ie(n)===`mutates-app`)throw new t(`COMMAND_FAILED`,`Cannot publish a recorded mutating find step because its target identity is not replay-verifiable.`,{retriable:!1,hint:`Close this session and record the journey again with an explicit selector-targeted click, press, fill, or focus action.`});let i=e;if(!(!i||!l(i)||n.targetEvidence))throw new t(`COMMAND_FAILED`,`Cannot publish recorded step "${n.command} ${i}": recording-time target identity evidence is missing.`,{retriable:!1,hint:`Close this session and record the journey again from open --save-script so target-v1 evidence is captured before each interaction.`})}}function Hn(e){return Wn(e)!==void 0}function Un(e){let n=Wn(e);if(!n)return;let r=[n.source,n.destination];for(let n of r){if(n?.startsWith(`@`))throw new t(`COMMAND_FAILED`,`Cannot publish recorded drag endpoint "${n}": the session-local ref was not converted to a portable selector.`,{retriable:!1});if(!(!n||!l(n))&&!e.targetEvidences)throw new t(`COMMAND_FAILED`,`Cannot publish recorded drag endpoint "${n}": recording-time target identity evidence is missing.`,{retriable:!1,hint:`Close this session and record the journey again so targets-v1 evidence is captured for both drag endpoints.`})}}function Wn(e){return e.command===`gesture`?fe(e.positionals):void 0}function Gn(e,n){if(e instanceof t){if(e.details?.reason===`script_target_exists`)return new t(e.code,`A file already exists at ${String(e.details.path)}.`,{...e.details,retriable:!0,hint:`Retry session save-script with another path, or pass --force to replace the existing file. The session remains armed.`});let n=e.details?.retriable===!0;return new t(e.code,e.message,{...e.details,retriable:n,hint:e.details?.hint??(n?`Fix the recorded journey or target, then retry session save-script. The session remains armed.`:`Close this session and start a fresh one with open <app> --save-script[=<path>].`)})}let r=e instanceof Error?e.message:String(e);return new t(`COMMAND_FAILED`,`Failed to publish the active session script${n?` to ${n}`:``}: ${r}`,{retriable:!0,hint:`Check the target path and permissions, then retry session save-script. The session remains armed.`})}function Kn(e){if(e.command!==`wait`)return!1;let t=te(e.positionals);return t?.kind!==`selector`||!l(t.selectorExpression)?!1:e.targetEvidence?.verification===`verified`}function qn(e){if(e.command===`get`)return e.positionals[1];if(Le(e.command)||e.command===`fill`){let[t,n]=e.positionals;return t!==void 0&&n!==void 0&&Jn(t)&&Jn(n)?void 0:t}}function Jn(e){return e.trim().length>0&&Number.isFinite(Number(e))}function Yn(e){let t=e.scriptPublication??E;return t.kind===`repair`?t.status===`committed`?!0:!Mt(t):!1}function Xn(e){return Pt(e.scriptPublication??E)?Yn(e):!0}var Zn=class{sessionsDir;constructor(e){this.sessionsDir=e}write(e,t){let n=fn(e),r=t?.publication===`active`,i;try{if(Xn(e))return{written:!1};let a=Qn(e,{appendCompleteSentinel:n,activePublication:r});i=this.resolveScriptPath(e);let o=g.dirname(i);return _.existsSync(o)||_.mkdirSync(o,{recursive:!0}),tr({scriptPath:i,script:a.script,force:t?.force}),n&&(e.scriptPublication=Ht(e.scriptPublication??E)),{written:!0,path:i,actionCount:a.actionCount}}catch(t){return $n({session:e,error:t,scriptPath:i,repairArmed:n,activePublication:r})}}resolveScriptPath(e){let t=qt(e.scriptPublication??E);if(t)return k(t);let n=O(e.name),r=new Date(e.createdAt).toISOString().replace(/[:.]/g,`-`);return g.join(this.sessionsDir,`${n}-${r}.ad`)}};function Qn(e,t){let n=nr(e,{strictPortableRefs:t.activePublication});return t.activePublication&&Bn(n),{script:fr(e,n,t.appendCompleteSentinel),actionCount:n.length}}function $n(e){let{session:n,error:r,scriptPath:i,repairArmed:a,activePublication:o}=e;if(m({level:`warn`,phase:`session_script_write_failed`,data:{session:n.name,path:i,error:r instanceof Error?r.message:String(r)}}),a)return{written:!1,error:er(r,i)};if(o)return{written:!1,error:Gn(r,i)};if(r instanceof t)throw r;return{written:!1}}function er(e,n){if(e instanceof t)return e;let r=e instanceof Error?e.message:String(e);return new t(`COMMAND_FAILED`,`Failed to write the healed script${n?` to ${n}`:``}: ${r}`,{hint:`The repair transaction completed but the healed .ad could not be published; check the target path and permissions, then retry close --save-script.`})}function tr(e){let{scriptPath:n,script:r,force:i}=e,a=g.dirname(n),o=g.join(a,`.${g.basename(n)}.${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}.tmp`);_.writeFileSync(o,r);try{if(i){_.renameSync(o,n);return}_.linkSync(o,n)}catch(e){throw e.code===`EEXIST`?new t(`COMMAND_FAILED`,`A file already exists at ${n}; remove it, pass replay --save-script=<other-path>, or pass --force/--overwrite to replace it.`,{reason:`script_target_exists`,path:n}):e}finally{_.rmSync(o,{force:!0})}}function nr(e,t={}){let n=M(e),r=n!==void 0,i=e.actions.slice(n??0),a=[];for(let n of i){if(n.command===`snapshot`)continue;let i=ar(n);if(i){a.push(i);continue}(r||t.strictPortableRefs)&&rr(n);let o=dr(e,n);o&&a.push(o),a.push(n)}return t.strictPortableRefs&&Vn(a),a}function rr(e){let n=e.command===`gesture`?fe(e.positionals??[]):void 0;if(n){ir(n);return}if(!I(e.command))return;let r=e.command===`get`?e.positionals?.[1]:e.positionals?.[0];if(r?.startsWith(`@`))throw new t(`COMMAND_FAILED`,`Cannot write recorded step "${e.command} ${r}" to a script: it never resolved to a selector, so the ref would not resolve in a fresh replay session.`)}function ir(e){let n=[e.source,e.destination].find(e=>e.startsWith(`@`));if(n)throw new t(`COMMAND_FAILED`,`Cannot write recorded drag endpoint "${n}" to a script: it never resolved to a selector, so the ref would not resolve in a fresh replay session.`)}function ar(e){let t=or(e);if(!(!t||!I(e.command)))return y(e.command)?{...e,positionals:[t]}:e.command===`longpress`?cr(e,t):e.command===`fill`?sr(e,t):lr(e,t)}function or(e){let t=Array.isArray(e.result?.selectorChain)&&e.result.selectorChain.every(e=>typeof e==`string`)?e.result.selectorChain:[];return t.length>0?t.join(` || `):void 0}function I(e){return Le(e)||e===`fill`||e===`get`}function sr(e,t){let n=N(e);return n.length>0?{...e,positionals:[t,n]}:void 0}function cr(e,t){let n=typeof e.result?.durationMs==`number`?String(e.result.durationMs):ur(e.positionals??[]);return{...e,positionals:n?[t,n]:[t]}}function lr(e,t){let n=e.positionals?.[0];return n===`text`||n===`attrs`?{...e,positionals:[n,t]}:void 0}function ur(e){let t=e.at(-1);if(!(e.length<=1||t===void 0||t.trim()===``))return Number.isFinite(Number(t))?t:void 0}function dr(e,t){if(!I(t.command))return;let n=t.result?.refLabel;if(typeof n!=`string`||n.trim().length===0)return;let r=n.trim();return{ts:t.ts,command:`snapshot`,positionals:[],flags:{platform:e.device.platform,snapshotInteractiveOnly:!0,snapshotScope:r},result:{scope:r}}}function fr(e,t,n){let r=[],i=e.device.kind?` kind=${e.device.kind}`:``;r.push(`context platform=${ae(e.device)} device=${ze(e.device.name)}${i} theme=unknown`);for(let e of t)e.flags?.noRecord||(r.push(...bt(e)),r.push(pr(e)));return n&&r.push(`# agent-device:heal-complete`),`${r.join(`
2
+ `)}\n`}function pr(e){return mr([e.command],e)||yt(e)}function mr(e,t){if(y(t.command))return hr(e,t);if(t.command===`fill`)return gr(e,t);if(t.command===`get`)return _r(e,t)}function hr(e,t){let n=t.positionals?.[0];if(n){if(n.startsWith(`@`))return e.push(b(v(n))),L(e,t),S(e,t),e.join(` `);if(t.positionals.length===1)return e.push(b(n)),S(e,t),e.join(` `)}}function gr(e,t){let n=t.positionals?.[0];if(!n?.startsWith(`@`))return;e.push(b(v(n))),L(e,t);let r=t.positionals.slice(1).join(` `);return t.positionals.length>1&&e.push(b(r)),S(e,t),e.join(` `)}function _r(e,t){let n=t.positionals?.[0],r=t.positionals?.[1];if(!(!n||!r))return e.push(b(n)),e.push(b(v(r))),r.startsWith(`@`)&&L(e,t),e.join(` `)}function L(e,t){let n=t.result?.refLabel;typeof n==`string`&&n.trim().length>0&&e.push(b(n))}const vr=[`status`,`get`,`dismiss`,`enter`,`return`];function R(e){return vr.includes(e)}const yr=[`id`,`deviceId`,`device_id`,`serial`,`udid`,`device_udid`,`identifier`],br={ios:`iOS`,ipados:`iPadOS`,tvos:`tvOS`,watchos:`watchOS`,visionos:`visionOS`,macos:`macOS`,apple:`Apple`,android:`Android`,linux:`Linux`,web:`Web`};function xr(e,t){let n=t??{};switch(e.command){case p.devices:return Sr(n.devices);case p.apps:return Cr(n.apps,e.flags?.appsFilter);case p.boot:return wr(`Booted`,n,!0);case p.shutdown:return wr(`Shut down`,n,!1);case p.install:return Tr(`Installed`,n);case p.reinstall:return Tr(`Reinstalled`,n);case p.screenshot:return Er(e,n);default:return{}}}function Sr(e){if(!Array.isArray(e))return{};let t=e.flatMap(e=>{let t=Or(e);return t?[t]:[]}),n=t.slice(0,5),r=Math.max(0,t.length-n.length),i=t.slice(0,3);return{summary:Lr(`Found ${t.length} ${Rr(`device`,t.length)}`,i.map(e=>Fr(e,!0)),Math.max(0,t.length-i.length)),details:{deviceCount:t.length,devices:n,...r>0?{omittedDeviceCount:r}:{}}}}function Cr(e,t){if(!Array.isArray(e))return{};let n=e.flatMap(e=>{let t=V(e);return t?[t]:[]}),r=n.slice(0,5),i=Math.max(0,n.length-r.length),a=n.slice(0,3);return{summary:Lr(`Found ${n.length} ${Rr(`app`,n.length)}`,a,Math.max(0,n.length-a.length)),details:{appCount:n.length,apps:r,...i>0?{omittedAppCount:i}:{},...t===`all`||t===`user-installed`?{filter:t}:{}}}}function wr(e,t,n){let r=kr(t);if(!r)return{};let i={device:r,...Pr(t),booted:n};return{summary:`${e} ${Fr(i,!1)}`,details:i}}function Tr(e,t){let n=V(t.appName),r=V(t.bundleId),i=z(t,[`packageName`,`package`]),a=V(t.platform),o=V(t.launchTarget),s=z(t,[`bundleId`,`packageName`,`package`,`appId`,`launchTarget`]),c=Ir(n,s);if(!c)return{};let l={};return B(l,`appName`,n),B(l,`bundleId`,r),B(l,`packageName`,i),B(l,`platform`,a),o!==s&&B(l,`launchTarget`,o),{summary:`${e} ${c}`,details:l}}function Er(e,t){let n=Dr(e,t);return n?{details:{requestedFileName:n}}:{}}function Dr(e,t){let n=q(e.meta?.clientArtifactPaths?.path)??q(t.path);if(n)return K(n)}function Or(e){if(!f(e))return;let t=kr(e);if(t)return{name:t,...Pr(e)}}function kr(e){let t=z(e,[`name`,`deviceName`,`device`]);return!t||!Ar(e,t)?t:Mr(e)}function Ar(e,t){let n=jr(t);return yr.some(t=>{let r=V(e[t]);return r!==void 0&&jr(r)===n})}function jr(e){return e.toLowerCase()}function Mr(e){let t=V(e.appleOs),n=V(e.platform),r=V(e.kind),i=Nr(t,n);return i&&(r===`simulator`||r===`emulator`)?`${i} ${r}`:i?`${i} device`:r===`simulator`?`Simulator`:r===`emulator`?`Emulator`:`Unnamed device`}function Nr(e,t){let n=e??t;if(!(!n||!Object.hasOwn(br,n)))return br[n]}function Pr(e){let t=V(e.platform),n=V(e.appleOs),r=V(e.kind),i=V(e.target);return{...t?{platform:t}:{},...n?{appleOs:n}:{},...r?{kind:r}:{},...i?{target:i}:{},...typeof e.booted==`boolean`?{booted:e.booted}:{}}}function Fr(e,t){let n=V(e.name)??V(e.device)??`device`,r=V(e.platform),i=V(e.appleOs),a=[r,i===r?void 0:i,V(e.kind),V(e.target),t&&typeof e.booted==`boolean`?e.booted?`booted`:`stopped`:void 0].filter(e=>!!e);return a.length>0?`${n} (${a.join(`, `)})`:n}function Ir(e,t){return e&&t&&e!==t?`${e} (${t})`:e??t}function z(e,t){for(let n of t){let t=V(e[n]);if(t)return t}}function B(e,t,n){n&&(e[t]=n)}function Lr(e,t,n){let r=[...t,...n>0?[`+${n} more`]:[]];return r.length>0?`${e}: ${r.join(`, `)}`:e}function Rr(e,t){return t===1?e:`${e}s`}function V(e){let t=q(e);if(!t)return;let n=t.trim(),r=Array.from(n);return r.length<=120?n:`${r.slice(0,119).join(``)}…`}function H(e){return V(e)}function U(e){return typeof e==`boolean`?e:void 0}function W(e,t){let n=H(e);return n&&t.includes(n)?n:void 0}function G(e){return Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0))}function K(e){let t=q(e);return t?V(t.split(/[\\/]/).at(-1)):void 0}function q(e){if(typeof e==`string`)return e.trim().length>0?e:void 0}function J(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}const zr=[`up`,`down`,`left`,`right`],Br=[`top`,`bottom`];function Vr(e){return`${e.command===p.reinstall?`Reinstalled`:`Installed`} ${Gr(e.result??{})??`app`}`}function Hr(e){let t=e.result??{};switch(e.command){case p.scroll:return qr(t);case p.screenshot:return Xr(t);case p.home:return`Went home`;case p.back:return Qr(t);case p.appSwitcher:return`Opened app switcher`;case p.orientation:return $r(t);case p.viewport:return ei(t);case p.clipboard:return ti(t);case p.keyboard:return ni(t);case p.tvRemote:return ai(t);case p.gesture:return oi(t);case p.swipe:return si(t);case p.trace:return li(`trace`,e);case p.record:return li(`recording`,e);default:return}}function Ur(e){let t=e.result??{};switch(e.command){case p.scroll:return G({direction:W(t.direction,zr),edge:W(t.edge,Br),passes:J(t.passes),amount:J(t.amount),pixels:J(t.pixels),durationMs:J(t.durationMs),x1:J(t.x1),y1:J(t.y1),x2:J(t.x2),y2:J(t.y2)});case p.screenshot:return G({requestedFileName:Zr(t)});case p.back:return G({mode:W(t.mode,me)});case p.orientation:return G({orientation:W(t.orientation,be)});case p.viewport:return G({width:J(t.width),height:J(t.height)});case p.clipboard:return G({action:W(t.action,[`read`,`write`])});case p.keyboard:return ii(t);case p.tvRemote:return G({button:W(t.button,_e),durationMs:J(t.durationMs)});case p.gesture:case p.swipe:return ci(t);case p.trace:case p.record:return G({action:W(t.action,[`start`,`stop`]),fileName:di(e),showTouches:U(t.showTouches)});default:return{}}}function Wr(e,t){if(e.command!==p.screenshot)return t;let n=Dr(e,t);return n?{...t,requestedFileName:n}:t}function Gr(e){let t=H(e.appName),n=fi(e,[`bundleId`,`packageName`,`appBundleId`,`launchTarget`]);return t&&n&&t!==n?`${t} (${n})`:t??n??Kr(e)}function Kr(e){let t=H(e.app);return t&&!t.includes(`/`)&&!t.includes(`\\`)?t:void 0}function qr(e){let t=W(e.direction,zr),n=W(e.edge,Br),r=J(e.passes);return n?Jr(n,r):t?Yr(t,e):`Scrolled`}function Jr(e,t){return t===0?`Already at ${e}`:t===void 0?`Scrolled to ${e}`:`Scrolled to ${e} in ${t} ${t===1?`pass`:`passes`}`}function Yr(e,t){let n=J(t.pixels);if(n!==void 0)return`Scrolled ${e} by ${n}px`;let r=J(t.amount);return r===void 0?`Scrolled ${e}`:`Scrolled ${e} by ${r}`}function Xr(e){let t=Zr(e);return t?`Captured screenshot ${t}`:`Captured screenshot`}function Zr(e){return K(e.requestedFileName)??K(e.path)}function Qr(e){return W(e.mode,me)===`system`?`Went back using system navigation`:`Went back`}function $r(e){let t=W(e.orientation,be);return t?`Rotated to ${t}`:`Changed orientation`}function ei(e){let t=J(e.width),n=J(e.height);return t!==void 0&&n!==void 0?`Set viewport to ${t}×${n}`:`Changed viewport`}function ti(e){let t=W(e.action,[`read`,`write`]);return t===`read`?`Read clipboard`:t===`write`?`Updated clipboard`:`Used clipboard`}function ni(e){let t=q(e.action);if(!t||!R(t))return`Used keyboard`;if(t===`dismiss`)return ri(e);if(t===`enter`||t===`return`)return`Pressed keyboard return`;let n=U(e.visible);return n===void 0?`Inspected keyboard`:n?`Keyboard is visible`:`Keyboard is hidden`}function ri(e){return U(e.dismissed)===!1?`Keyboard was already hidden`:`Dismissed keyboard`}function ii(e){let t=q(e.action);return G({action:t&&R(t)?t:void 0,platform:W(e.platform,[`ios`,`android`]),visible:U(e.visible),wasVisible:U(e.wasVisible),dismissed:U(e.dismissed),attempts:J(e.attempts),mechanism:W(e.mechanism,[`dismissKey`])})}function ai(e){let t=W(e.button,_e);return t?`Pressed TV remote ${t}`:`Used TV remote`}function oi(e){let t=W(e.kind,[`fling`,`pan`,`pinch`,`rotate`,`transform`]);return t?`Ran ${t} gesture`:`Ran gesture`}function si(e){let t=J(e.count);return t!==void 0&&t>1?`Swiped ${t} times`:`Swiped`}function ci(e){return G({kind:W(e.kind,[`fling`,`pan`,`pinch`,`rotate`,`transform`]),durationMs:J(e.durationMs),pointerCount:J(e.pointerCount),x1:J(e.x1),y1:J(e.y1),x2:J(e.x2),y2:J(e.y2),count:J(e.count),pauseMs:J(e.pauseMs),pattern:W(e.pattern,[`one-way`,`ping-pong`]),scale:J(e.scale)})}function li(e,t){let n=ui(e,W(t.result?.action,[`start`,`stop`])),r=di(t);return r?`${n} ${r}`:n}function ui(e,t){return t===`start`?e===`trace`?`Started trace`:`Started recording`:t===`stop`?e===`trace`?`Stopped trace`:`Stopped recording`:e===`trace`?`Updated trace`:`Updated recording`}function di(e){let t=e.result??{};return K(t.requestedFileName)??K(t.outPath)??K(t.path)??K(e.positionals[1])}function fi(e,t){for(let n of t){let t=H(e[n]);if(t)return t}}function pi(e){switch(e.command){case p.open:return`Opened ${Y(e)??`session`}`;case p.close:return`Closed ${H(e.result?.session)??`session`}`;case p.click:case p.press:return`Tapped ${Y(e)??`target`}`;case p.longPress:return`Long pressed ${Y(e)??`target`}`;case p.fill:return`Filled ${Y(e)??`target`}`;case p.type:return`Typed text`;case p.install:case p.reinstall:case ve.installSource:return Vr(e);default:return Hr(e)??`Ran ${e.command}`}}function mi(e){return G({command:e.command,positionals:Ci(e),flags:Pi(e),...hi(e),...gi(e),..._i(e),...Ur(e)})}function hi(e){if(!vi(e.command))return{};let t=e.result??{};return G({ref:Q(t),targetLabel:Y(e),selectorChainLength:ji(t.selectorChain)?.length,x:J(t.x),y:J(t.y),x2:J(t.x2),y2:J(t.y2),durationMs:J(t.durationMs)})}function gi(e){if(!yi(e.command))return{};let t=e.result??{};return G({platform:W(t.platform,oe),target:W(t.target,ce),appName:H(t.appName),appBundleId:H(t.appBundleId),bundleId:H(t.bundleId),packageName:H(t.packageName),launchTarget:H(t.launchTarget)})}function _i(e){let t=e.result??{};return e.command===p.snapshot?{...Array.isArray(t.nodes)?{nodeCount:t.nodes.length}:{}}:e.command!==p.wait&&e.command!==p.find&&e.command!==p.get&&e.command!==p.is?{}:G({waitedMs:J(t.waitedMs),found:U(t.found)})}function vi(e){return e===p.click||e===p.press||e===p.longPress||e===p.focus||e===p.fill}function yi(e){return e===p.open||e===p.install||e===p.reinstall||e===ve.installSource}function Y(e){let t=e.result??{};return bi(t)??xi(t)??Si(t)??ki(e.positionals[0])}function bi(e){let t=Q(e);if(t)return t.startsWith(`@`)?t:`@${t}`}function xi(e){let t=J(e.x),n=J(e.y);if(t!==void 0&&n!==void 0)return`(${t}, ${n})`}function Si(e){return H(e.appName)??H(e.appBundleId)??H(e.bundleId)??H(e.packageName)}function Ci(e){if(e.positionals.length!==0)return e.command===p.type?[Z(`text`)]:e.command===p.fill?wi(e):e.command===p.find?Ti(e):e.command===p.clipboard?Ei(e):e.command===p.push?Di(e,`app`,`payload`):e.command===p.triggerAppEvent?Di(e,`event`,`payload`):e.positionals.map(X)}function wi(e){let t=Z(`text`),n=e.result??{},r=Q(n);if(r)return[`@${r}`,t];if(H(n.selector))return[Z(`target`),t];let i=J(n.x),a=J(n.y);return i!==void 0&&a!==void 0?[String(i),String(a),t]:[t]}function Ti(e){let t=+!!Ai(e.positionals[0]);if(e.positionals[t]===void 0)return;let n=t+1,r=[...t===1?[String(e.positionals[0])]:[],Z(`query`)],i=e.positionals[n];return i?i===`fill`||i===`type`?[...r,i,Z(`text`)]:[...r,...e.positionals.slice(n).map(Oi)]:r}function Ei(e){let t=e.positionals[0]?.toLowerCase();return t===`read`?[`read`]:t===`write`?[`write`,Z(`text`)]:e.positionals.map(X)}function Di(e,t,n){let[r,i,...a]=e.positionals;return[...r?[Z(t)]:[],...i?[Z(n)]:[],...a.map(X)]}function Oi(e){return e===`click`||e===`focus`||e===`exists`||e===`get`||e===`text`||e===`attrs`||e===`wait`?e:X(e)}function X(e){return ki(e)??Z(`arg`)}function ki(e){if(!e)return;let t=e.trim();if(/^@[a-zA-Z0-9:_-]+$/.test(t))return t}function Z(e){return`<${e}>`}function Ai(e){return e===`text`||e===`label`||e===`value`||e===`role`||e===`id`}function ji(e){return Array.isArray(e)&&e.every(e=>typeof e==`string`)?e:void 0}const Mi={enums:[{source:`platform`,values:se},{source:`target`,values:ce}]},Ni={[p.open]:{booleans:[{source:`relaunch`},{source:`testIme`}],enums:[{source:`surface`,values:ye}]},[p.click]:Fi(),[p.press]:Fi(),[p.longPress]:Fi(),[p.fill]:Ii(),[p.type]:Ii(),[p.scroll]:{booleans:[{source:`settle`}],numbers:[{source:`pixels`},{source:`durationMs`},{source:`settleQuietMs`}]},[p.gesture]:Li(),[p.swipe]:Li(),[p.screenshot]:{booleans:[{source:`overlayRefs`},{source:`screenshotFullscreen`,output:`fullscreen`},{source:`screenshotNoStabilize`,output:`noStabilize`},{source:`screenshotNormalizeStatusBar`,output:`normalizeStatusBar`}],numbers:[{source:`screenshotPixelDensity`,output:`pixelDensity`},{source:`screenshotScale`,output:`scale`}]},[p.snapshot]:{booleans:[{source:`snapshotInteractiveOnly`,output:`interactiveOnly`},{source:`snapshotDiff`,output:`diff`},{source:`snapshotRaw`,output:`raw`},{source:`snapshotCustomActions`,output:`actions`},{source:`snapshotForceFull`,output:`forceFull`}],numbers:[{source:`snapshotDepth`,output:`depth`}]},[p.back]:{booleans:[{source:`settle`}],numbers:[{source:`settleQuietMs`}],enums:[{source:`backMode`,output:`mode`,values:me}]},[p.record]:{booleans:[{source:`hideTouches`}],numbers:[{source:`fps`}],enums:[{source:`recordingScope`,output:`scope`,values:le}]},[p.apps]:{enums:[{source:`appsFilter`,output:`filter`,values:[`user-installed`,`all`]}]},[p.boot]:{booleans:[{source:`headless`}]},[p.close]:{booleans:[{source:`shutdown`}]}};function Pi(e){let t=e.flags??{},n={},r=Object.hasOwn(Ni,e.command)?Ni[e.command]:void 0;return Ri(n,t,Mi),Ri(n,t,r),Object.keys(n).length>0?n:void 0}function Fi(){return{booleans:[{source:`doubleTap`},{source:`settle`}],numbers:[{source:`count`},{source:`intervalMs`},{source:`holdMs`},{source:`jitterPx`},{source:`settleQuietMs`}],enums:[{source:`clickButton`,values:pe}]}}function Ii(){return{booleans:[{source:`settle`}],numbers:[{source:`delayMs`},{source:`settleQuietMs`}]}}function Li(){return{numbers:[{source:`pointerCount`},{source:`count`},{source:`pauseMs`}],enums:[{source:`pattern`,values:he}]}}function Ri(e,t,n){n&&(zi(e,t,n.booleans??[]),Bi(e,t,n.numbers??[]),Vi(e,t,n.enums??[]))}function zi(e,t,n){for(let r of n)Hi(e,r.output??r.source,t[r.source])}function Bi(e,t,n){for(let r of n)Ui(e,r.output??r.source,t[r.source])}function Vi(e,t,n){for(let r of n)Wi(e,r.output??r.source,t[r.source],r.values)}function Q(e){let t=H(e.ref);if(!t)return;let n=t.startsWith(`@`)?t.slice(1):t;return/^[a-zA-Z0-9:_-]+$/.test(n)?n:void 0}function Hi(e,t,n){typeof n==`boolean`&&(e[t]=n)}function Ui(e,t,n){let r=J(n);r!==void 0&&(e[t]=r)}function Wi(e,t,n,r){let i=W(n,r);i!==void 0&&(e[t]=i)}const $=new Map,Gi=new Set;function Ki(e){return g.join(e,`events.ndjson`)}function qi(e){return e.command!==p.events}function Ji(t,n,r){let i=e({version:1,ts:r.ts??new Date().toISOString(),session:n,...r});Xi(t,`${JSON.stringify(i)}\n`)}async function Yi(e){await(e?$.get(e):Promise.all($.values()))}function Xi(e,t){let n=($.get(e)??Promise.resolve()).catch(()=>void 0).then(async()=>{await Zi(e),await _.promises.appendFile(e,t,`utf8`)}).catch(t=>{m({level:`warn`,phase:`session_event_log_write_failed`,data:{path:e,error:t instanceof Error?t.message:String(t)}})}).finally(()=>{$.get(e)===n&&$.delete(e)});$.set(e,n)}async function Zi(e){let t=g.dirname(e);if(!Gi.has(t))try{await _.promises.mkdir(t,{recursive:!0}),Gi.add(t)}catch(t){throw m({level:`warn`,phase:`session_event_log_dir_failed`,data:{path:e,error:t instanceof Error?t.message:String(t)}}),t}}function Qi(e,t,n){Ji(e,t,{kind:`action.recorded`,requestId:h().requestId,command:n.command,summary:pi(n),details:mi(n)})}function $i(e){let{req:t}=e;return{kind:`request.started`,requestId:t.meta?.requestId??h().requestId,command:t.command,summary:`Started ${t.command}`}}function ea(e){let{req:t,response:n,durationMs:r}=e;if(n.ok){let e=xr(t,n.data);return{kind:`request.finished`,requestId:t.meta?.requestId??h().requestId,command:t.command,status:`ok`,summary:e.summary??`Finished ${t.command}`,details:{durationMs:r,...e.details}}}return{kind:`request.finished`,requestId:t.meta?.requestId??h().requestId,command:t.command,status:`error`,summary:`Failed ${t.command}: ${n.error.code}`,details:{durationMs:r,code:n.error.code,diagnosticId:n.error.diagnosticId}}}function ta(e,t={}){let n=oa(t.cursor),r=sa(t.limit);if(!_.existsSync(e))return{path:e,cursor:String(n),limit:r,events:[]};let i=na(e,n,r),a=i.lines.flatMap(e=>{let t=ca(e);return t?[t]:[]});return{path:e,cursor:String(n),limit:r,events:a,...i.nextCursor===void 0?{}:{nextCursor:String(i.nextCursor)}}}function na(e,t,n){let r=_.openSync(e,`r`);try{let e=new Ae(`utf8`),i=Buffer.allocUnsafe(65536),a=ra(t,n),o=``,s=0;do{s=_.readSync(r,i,0,i.length,null);let t=e.write(i.subarray(0,s));o=ia(`${o}${t}`,a)}while(s>0&&a.nextCursor===void 0);let c=`${o}${e.end()}`;return a.nextCursor===void 0&&c.length>0&&aa(c,a),{lines:a.lines,nextCursor:a.nextCursor}}finally{_.closeSync(r)}}function ra(e,t){return{cursor:e,limit:t,lineIndex:0,lines:[]}}function ia(e,t){let n=0;for(let r=e.indexOf(`
3
3
  `);r!==-1;r=e.indexOf(`
4
- `,n))if(ca(e.slice(n,r),t),n=r+1,t.nextCursor!==void 0)return``;return e.slice(n)}function ca(e,t){let n=e.endsWith(`\r`)?e.slice(0,-1):e;if(n.trim().length!==0){if(t.lineIndex>=t.cursor+t.limit){t.nextCursor=t.cursor+t.limit;return}t.lineIndex>=t.cursor&&t.lines.push(n),t.lineIndex+=1}}function la(e){if(e===void 0||e.trim()===``)return 0;let n=Number(e);if(Number.isInteger(n)&&n>=0)return n;throw new t(`INVALID_ARGS`,`events cursor must be a non-negative integer string.`)}function ua(e){if(e===void 0||typeof e==`string`&&e.trim()===``)return 100;let n=typeof e==`string`?Number(e):e;if(Number.isInteger(n)&&n>=1&&n<=500)return n;throw new t(`INVALID_ARGS`,`events limit must be between 1 and 500.`)}function da(e){try{let t=fa(JSON.parse(e));return t?pa(t):void 0}catch{return}}function fa(e){if(d(e)&&e.version===1&&!(typeof e.ts!=`string`||typeof e.session!=`string`)&&ma(e.kind))return e}function pa(e){let t=d(e.details)?e.details:void 0;return{version:1,ts:e.ts,session:e.session,kind:e.kind,...typeof e.requestId==`string`?{requestId:e.requestId}:{},...typeof e.command==`string`?{command:e.command}:{},...ha(e.status)?{status:e.status}:{},...typeof e.summary==`string`?{summary:e.summary}:{},...t?{details:t}:{}}}function ma(e){return e===`request.started`||e===`request.finished`||e===`action.recorded`}function ha(e){return e===`ok`||e===`error`}const ga=60*6e4;var _a=class{sessions=new Map;runtimeHints=new Map;sessionsDir;scriptWriter;constructor(e){this.sessionsDir=e,this.scriptWriter=new $n(e)}get(e){return this.sessions.get(e)}set(e,t){this.sessions.set(e,t)}delete(e){return this.runtimeHints.delete(e),this.sessions.delete(e)}values(){return this.sessions.values()}toArray(){return Array.from(this.sessions.values())}getRuntimeHints(e){return this.runtimeHints.get(e)}setRuntimeHints(e,t){this.runtimeHints.set(e,t)}clearRuntimeHints(e){return this.runtimeHints.delete(e)}recordAction(e,t){let n=Pn(e,t);if(n){let t=this.resolveStoredSessionName(e);ta(this.resolveEventLogPath(t),t,n)}}recordEvent(e,t){Zi(this.resolveEventLogPath(e),e,t)}readEvents(e,t={}){return ia(this.resolveEventLogPath(e),t)}async flushEvents(e){await Qi(e?this.resolveEventLogPath(e):void 0)}writeSessionLog(e,t){let n=this.scriptWriter.write(e,t);return n.written&&m({level:`info`,phase:`session_script_written`,data:{session:e.name,path:n.path}}),n}finalizeRepairTeardown(e){this.recordRepairFinalizeCloseIfCommitting(e);let t=this.writeSessionLog(e,{force:on(e,void 0)});hn(e)&&(!t.written&&t.error?this.writeRepairTombstone(e,ga,{code:String(t.error.code),message:t.error.message}):this.writeRepairTombstone(e))}recordRepairFinalizeCloseIfCommitting(e){Ft(e.scriptPublication??D)&&this.recordAction(e,{command:`close`,positionals:[],flags:{},result:{session:e.name,...ye(`Closed: ${e.name}`)}})}writeRepairTombstone(e,t=ga,n){try{let r=this.resolveSessionDir(e.name);_.mkdirSync(r,{recursive:!0});let i={owner:e.name,reapedAt:Date.now(),expiresAt:Date.now()+t,...gn(e)?{sourcePath:gn(e)}:{},...n?{commitFailure:n}:{}};_.writeFileSync(this.repairTombstonePath(e.name),`${JSON.stringify(i)}\n`)}catch(t){m({level:`warn`,phase:`repair_tombstone_write_failed`,data:{session:e.name,error:t instanceof Error?t.message:String(t)}})}}readRepairTombstone(e){return va(this.repairTombstonePath(e))}clearRepairTombstone(e){try{_.rmSync(this.repairTombstonePath(e),{force:!0})}catch{}}repairTombstonePath(e){return g.join(this.resolveSessionDir(e),`repair-tombstone.json`)}defaultTracePath(e){let t=k(e.name),n=new Date().toISOString().replace(/[:.]/g,`-`);return g.join(this.sessionsDir,`${t}-${n}.trace.log`)}resolveSessionDir(e){return g.join(this.sessionsDir,k(e))}resolveDaemonStateDir(){return g.dirname(this.sessionsDir)}ensureSessionDir(e){let t=this.resolveSessionDir(e);return _.mkdirSync(t,{recursive:!0}),t}resolveAppLogPath(e){return g.join(this.resolveSessionDir(e),`app.log`)}resolveAppLogPidPath(e){return g.join(this.resolveSessionDir(e),`app-log.pid`)}resolveEventLogPath(e){return Yi(this.resolveSessionDir(e))}static expandHome(e,t){return A(e,t)}resolveStoredSessionName(e){for(let[t,n]of this.sessions)if(n===e)return t;return e.name}};function va(e){let t;try{t=_.readFileSync(e,`utf8`)}catch{return}let n;try{n=JSON.parse(t)}catch{return}if(!(typeof n?.expiresAt!=`number`||n.expiresAt<=Date.now()))return n}function ya(e){let t;try{t=_.readdirSync(e,{withFileTypes:!0})}catch{return}for(let n of t){if(!n.isDirectory())continue;let t=va(g.join(e,n.name,`repair-tombstone.json`));if(t?.commitFailure)return{sessionName:n.name,tombstone:{...t,commitFailure:t.commitFailure}}}}function ba(e){return g.join(e,`runner.log`)}function xa(e,t){let n=k(t&&t.length>0?t:`unknown`);return g.join(e,`requests`,`${n}.ndjson`)}function Sa(e,t={}){let n=Ca(e,t);return{baseDir:n,infoPath:g.join(n,`daemon.json`),lockPath:g.join(n,`daemon.lock`),logPath:g.join(n,`daemon.log`),sessionsDir:g.join(n,`sessions`)}}function Ca(e,t){let n=(e??``).trim();return n?Ce(n,{env:t.env}):wa(t)}function wa(e={}){let t=g.join(we(`~`,{env:e.env}),`.agent-device`),n=e.projectRoot??re();return Ta(n)?g.join(t,`dev`,Ea(n)):t}function Ta(e){return _.existsSync(g.join(e,`package.json`))&&_.existsSync(g.join(e,`src`,`daemon.ts`))}function Ea(e){let t=Da(e),n=g.basename(t).replaceAll(/[^a-zA-Z0-9._-]+/g,`-`),r=ke.createHash(`sha1`).update(t).digest(`hex`).slice(0,12);return`${n||`agent-device`}-${r}`}function Da(e){try{return _.realpathSync.native(e)}catch{return g.resolve(e)}}function Oa(e){let t=(e??``).trim().toLowerCase();return t===`http`?`http`:t===`dual`?`dual`:`socket`}function ka(e){let t=(e??``).trim().toLowerCase();return t===`auto`?`auto`:t===`socket`?`socket`:t===`http`?`http`:`auto`}function Aa(e){return(e??``).trim().toLowerCase()===`tenant`?`tenant`:`none`}function ja(e){if(!e)return;let t=e.trim();if(t&&/^[a-zA-Z0-9._-]{1,128}$/.test(t))return t}const Ma=/(?:^|[^\w$.])(?:import|export)\s+(?:type\s+)?(?:[^'"`]*?\s+from\s+)?['"]([^'"]+)['"]/gm,Na=/import\(\s*['"]([^'"]+)['"]\s*\)/gm,Pa=[`.ts`,`.tsx`,`.js`,`.jsx`,`.mjs`,`.cjs`];function Fa(){let e=process.argv[1];return e?Ia(e):`unknown`}function Ia(e,t=re()){try{let n=g.resolve(t),r=[g.resolve(e)],i=new Set,a=[];for(;r.length>0;){let e=r.pop();if(!e||i.has(e))continue;i.add(e);let t=_.statSync(e);if(!t.isFile())continue;let o=g.relative(n,e)||e;a.push(`${o}:${t.size}:${Math.trunc(t.mtimeMs)}`);let s=_.readFileSync(e,`utf8`);for(let t of La(s)){let n=za(e,t);n&&r.push(n)}}let o=a.sort().join(`|`),s=ke.createHash(`sha1`).update(o).digest(`hex`);return`graph:${a.length}:${s}`}catch{return`unknown`}}function La(e){let t=new Set;return Ra(e,Ma,t),Ra(e,Na,t),[...t]}function Ra(e,t,n){t.lastIndex=0;let r=null;for(;(r=t.exec(e))!==null;){let e=r[1]?.trim();e?.startsWith(`.`)&&n.add(e)}}function za(e,t){let n=g.resolve(g.dirname(e),t),r=Ba(n);if(r)return r;for(let e of Pa){let t=Ba(`${n}${e}`);if(t)return t}for(let e of Pa){let t=Ba(g.join(n,`index${e}`));if(t)return t}return null}function Ba(e){try{return _.statSync(e).isFile()?e:null}catch{return null}}const Va=[/(^|[/\s"'=])dist\/src\/daemon\.js($|[\s"'])/,/(^|[/\s"'=])dist\/src\/internal\/daemon\.js($|[\s"'])/,/(^|[/\s"'=])src\/daemon\.ts($|[\s"'])/];function Ha(e){let t=e.toLowerCase().replaceAll(`\\`,`/`);return t.includes(`agent-device`)?Va.some(e=>e.test(t)):!1}function Ua(e,t){if(!Ee(e))return!1;if(t){let n=Oe(e);if(!n||n!==t)return!1}let n=De(e);return n?Ha(n):!1}function Wa(e,t){try{return process.kill(e,t),!0}catch(e){let t=e.code;if(t===`ESRCH`||t===`EPERM`)return!1;throw e}}async function Ga(e,t){Ua(e,t.expectedStartTime)&&Wa(e,`SIGTERM`)&&(await Te(e,t.termTimeoutMs)||Wa(e,`SIGKILL`)&&await Te(e,t.killTimeoutMs))}function Ka(e,t){let n=[],r=e+t.toString(),i=r.indexOf(`
4
+ `,n))if(aa(e.slice(n,r),t),n=r+1,t.nextCursor!==void 0)return``;return e.slice(n)}function aa(e,t){let n=e.endsWith(`\r`)?e.slice(0,-1):e;if(n.trim().length!==0){if(t.lineIndex>=t.cursor+t.limit){t.nextCursor=t.cursor+t.limit;return}t.lineIndex>=t.cursor&&t.lines.push(n),t.lineIndex+=1}}function oa(e){if(e===void 0||e.trim()===``)return 0;let n=Number(e);if(Number.isInteger(n)&&n>=0)return n;throw new t(`INVALID_ARGS`,`events cursor must be a non-negative integer string.`)}function sa(e){if(e===void 0||typeof e==`string`&&e.trim()===``)return 100;let n=typeof e==`string`?Number(e):e;if(Number.isInteger(n)&&n>=1&&n<=500)return n;throw new t(`INVALID_ARGS`,`events limit must be between 1 and 500.`)}function ca(e){try{let t=la(JSON.parse(e));return t?ua(t):void 0}catch{return}}function la(e){if(f(e)&&e.version===1&&!(typeof e.ts!=`string`||typeof e.session!=`string`)&&da(e.kind))return e}function ua(e){let t=f(e.details)?e.details:void 0;return{version:1,ts:e.ts,session:e.session,kind:e.kind,...typeof e.requestId==`string`?{requestId:e.requestId}:{},...typeof e.command==`string`?{command:e.command}:{},...fa(e.status)?{status:e.status}:{},...typeof e.summary==`string`?{summary:e.summary}:{},...t?{details:t}:{}}}function da(e){return e===`request.started`||e===`request.finished`||e===`action.recorded`}function fa(e){return e===`ok`||e===`error`}const pa=60*6e4;var ma=class{sessions=new Map;runtimeHints=new Map;sessionsDir;scriptWriter;constructor(e){this.sessionsDir=e,this.scriptWriter=new Zn(e)}get(e){return this.sessions.get(e)}set(e,t){this.sessions.set(e,t)}delete(e){return this.runtimeHints.delete(e),this.sessions.delete(e)}values(){return this.sessions.values()}toArray(){return Array.from(this.sessions.values())}getRuntimeHints(e){return this.runtimeHints.get(e)}setRuntimeHints(e,t){this.runtimeHints.set(e,t)}clearRuntimeHints(e){return this.runtimeHints.delete(e)}recordAction(e,t){let n=Mn(e,t);if(n){let t=this.resolveStoredSessionName(e);Qi(this.resolveEventLogPath(t),t,n)}}recordEvent(e,t){Ji(this.resolveEventLogPath(e),e,t)}readEvents(e,t={}){return ta(this.resolveEventLogPath(e),t)}async flushEvents(e){await Yi(e?this.resolveEventLogPath(e):void 0)}writeSessionLog(e,t){let n=this.scriptWriter.write(e,t);return n.written&&m({level:`info`,phase:`session_script_written`,data:{session:e.name,path:n.path}}),n}finalizeRepairTeardown(e){this.recordRepairFinalizeCloseIfCommitting(e);let t=this.writeSessionLog(e,{force:rn(e,void 0)});pn(e)&&(!t.written&&t.error?this.writeRepairTombstone(e,pa,{code:String(t.error.code),message:t.error.message}):this.writeRepairTombstone(e))}recordRepairFinalizeCloseIfCommitting(e){Mt(e.scriptPublication??E)&&this.recordAction(e,{command:`close`,positionals:[],flags:{},result:{session:e.name,...ue(`Closed: ${e.name}`)}})}writeRepairTombstone(e,t=pa,n){try{let r=this.resolveSessionDir(e.name);_.mkdirSync(r,{recursive:!0});let i={owner:e.name,reapedAt:Date.now(),expiresAt:Date.now()+t,...mn(e)?{sourcePath:mn(e)}:{},...n?{commitFailure:n}:{}};_.writeFileSync(this.repairTombstonePath(e.name),`${JSON.stringify(i)}\n`)}catch(t){m({level:`warn`,phase:`repair_tombstone_write_failed`,data:{session:e.name,error:t instanceof Error?t.message:String(t)}})}}readRepairTombstone(e){return ha(this.repairTombstonePath(e))}clearRepairTombstone(e){try{_.rmSync(this.repairTombstonePath(e),{force:!0})}catch{}}repairTombstonePath(e){return g.join(this.resolveSessionDir(e),`repair-tombstone.json`)}defaultTracePath(e){let t=O(e.name),n=new Date().toISOString().replace(/[:.]/g,`-`);return g.join(this.sessionsDir,`${t}-${n}.trace.log`)}resolveSessionDir(e){return g.join(this.sessionsDir,O(e))}resolveDaemonStateDir(){return g.dirname(this.sessionsDir)}ensureSessionDir(e){let t=this.resolveSessionDir(e);return _.mkdirSync(t,{recursive:!0}),t}resolveAppLogPath(e){return g.join(this.resolveSessionDir(e),`app.log`)}resolveAppLogPidPath(e){return g.join(this.resolveSessionDir(e),`app-log.pid`)}resolveEventLogPath(e){return Ki(this.resolveSessionDir(e))}static expandHome(e,t){return k(e,t)}resolveStoredSessionName(e){for(let[t,n]of this.sessions)if(n===e)return t;return e.name}};function ha(e){let t;try{t=_.readFileSync(e,`utf8`)}catch{return}let n;try{n=JSON.parse(t)}catch{return}if(!(typeof n?.expiresAt!=`number`||n.expiresAt<=Date.now()))return n}function ga(e){let t;try{t=_.readdirSync(e,{withFileTypes:!0})}catch{return}for(let n of t){if(!n.isDirectory())continue;let t=ha(g.join(e,n.name,`repair-tombstone.json`));if(t?.commitFailure)return{sessionName:n.name,tombstone:{...t,commitFailure:t.commitFailure}}}}function _a(e){return g.join(e,`runner.log`)}function va(e,t){let n=O(t&&t.length>0?t:`unknown`);return g.join(e,`requests`,`${n}.ndjson`)}function ya(e,t={}){let n=ba(e,t);return{baseDir:n,infoPath:g.join(n,`daemon.json`),lockPath:g.join(n,`daemon.lock`),logPath:g.join(n,`daemon.log`),sessionsDir:g.join(n,`sessions`)}}function ba(e,t){let n=(e??``).trim();return n?xe(n,{env:t.env}):xa(t)}function xa(e={}){let t=g.join(Se(`~`,{env:e.env}),`.agent-device`),n=e.projectRoot??we();return Sa(n)?g.join(t,`dev`,Ca(n)):t}function Sa(e){return _.existsSync(g.join(e,`package.json`))&&_.existsSync(g.join(e,`src`,`daemon.ts`))}function Ca(e){let t=wa(e),n=g.basename(t).replaceAll(/[^a-zA-Z0-9._-]+/g,`-`),r=ke.createHash(`sha1`).update(t).digest(`hex`).slice(0,12);return`${n||`agent-device`}-${r}`}function wa(e){try{return _.realpathSync.native(e)}catch{return g.resolve(e)}}function Ta(e){let t=(e??``).trim().toLowerCase();return t===`http`?`http`:t===`dual`?`dual`:`socket`}function Ea(e){let t=(e??``).trim().toLowerCase();return t===`auto`?`auto`:t===`socket`?`socket`:t===`http`?`http`:`auto`}function Da(e){return(e??``).trim().toLowerCase()===`tenant`?`tenant`:`none`}function Oa(e){if(!e)return;let t=e.trim();if(t&&/^[a-zA-Z0-9._-]{1,128}$/.test(t))return t}const ka=/(['"])(\.\.?\/[^'"]*)\1/g,Aa=[`.ts`,`.tsx`,`.js`,`.jsx`,`.mjs`,`.cjs`];function ja(){let e=process.argv[1];return e?Ma(e):`unknown`}function Ma(e,t=we()){try{let n=g.resolve(t),r=[g.resolve(e)],i=new Set,a=[];for(;r.length>0;){let e=r.pop();if(!e||i.has(e))continue;i.add(e);let t=_.statSync(e);if(!t.isFile())continue;let o=g.relative(n,e)||e;a.push(`${o}:${t.size}:${Math.trunc(t.mtimeMs)}`);let s=_.readFileSync(e,`utf8`);for(let t of Na(s)){let n=Pa(e,t);n&&r.push(n)}}let o=a.sort().join(`|`),s=ke.createHash(`sha1`).update(o).digest(`hex`);return`graph:${a.length}:${s}`}catch{return`unknown`}}function Na(e){let t=new Set;ka.lastIndex=0;let n=null;for(;(n=ka.exec(e))!==null;)t.add(n[2]);return[...t]}function Pa(e,t){let n=g.resolve(g.dirname(e),t),r=Fa(n);if(r)return r;for(let e of Aa){let t=Fa(`${n}${e}`);if(t)return t}for(let e of Aa){let t=Fa(g.join(n,`index${e}`));if(t)return t}return null}function Fa(e){try{return _.statSync(e).isFile()?e:null}catch{return null}}const Ia=[/(^|[/\s"'=])dist\/src\/daemon\.js($|[\s"'])/,/(^|[/\s"'=])dist\/src\/internal\/daemon\.js($|[\s"'])/,/(^|[/\s"'=])src\/daemon\.ts($|[\s"'])/];function La(e){let t=e.toLowerCase().replaceAll(`\\`,`/`);return t.includes(`agent-device`)?Ia.some(e=>e.test(t)):!1}function Ra(e,t){if(!De(e))return!1;if(t){let n=Te(e);if(!n||n!==t)return!1}let n=Oe(e);return n?La(n):!1}function za(e,t){try{return process.kill(e,t),!0}catch(e){let t=e.code;if(t===`ESRCH`||t===`EPERM`)return!1;throw e}}async function Ba(e,t){Ra(e,t.expectedStartTime)&&za(e,`SIGTERM`)&&(await Ee(e,t.termTimeoutMs)||za(e,`SIGKILL`)&&await Ee(e,t.killTimeoutMs))}function Va(e,t){let n=[],r=e+t.toString(),i=r.indexOf(`
5
5
  `);for(;i!==-1;){let e=r.slice(0,i).trim();r=r.slice(i+1),e&&n.push(e),i=r.indexOf(`
6
- `)}return{lines:n,buffer:r}}function qa(e){return e.meta?.requestProgress===`replay-test`||e.meta?.requestProgress===`command`}function Ja(e){return!!e&&typeof e==`object`&&e.type===`progress`&&!!e.event}function Ya(e){return!!e&&typeof e==`object`&&e.type===`response`&&!!e.response}function Xa(e){return`${JSON.stringify({type:`progress`,event:e})}\n`}function Za(e){return`${JSON.stringify({type:`response`,response:e})}\n`}function Qa(e){return`${JSON.stringify({type:`response`,response:e})}\n`}function $a(e,t={}){return{ok:!0,service:e,version:te(),rpcProtocolVersion:2,...t.upstream===void 0?{}:{upstream:t.upstream}}}function eo(e){return{...typeof e.path==`string`?{path:e.path}:{},...typeof e.width==`number`?{width:e.width}:{},...typeof e.height==`number`?{height:e.height}:{},...typeof e.logicalWidth==`number`?{logicalWidth:e.logicalWidth}:{},...typeof e.logicalHeight==`number`?{logicalHeight:e.logicalHeight}:{},...typeof e.pixelDensity==`number`?{pixelDensity:e.pixelDensity}:{},...e.overlayRefs?{overlayRefs:e.overlayRefs}:{}}}function to(e){if(d(e))return eo({path:typeof e.path==`string`?e.path:void 0,width:typeof e.width==`number`?e.width:void 0,height:typeof e.height==`number`?e.height:void 0,logicalWidth:typeof e.logicalWidth==`number`?e.logicalWidth:void 0,logicalHeight:typeof e.logicalHeight==`number`?e.logicalHeight:void 0,pixelDensity:typeof e.pixelDensity==`number`?e.pixelDensity:void 0,overlayRefs:Array.isArray(e.overlayRefs)?e.overlayRefs.filter(ao).flatMap(e=>{let t=no(e);return t?[t]:[]}):void 0})}function no(e){if(typeof e.ref!=`string`||e.ref.length===0)return;let t=ro(e);if(t)return{ref:e.ref,...io(e),...t}}function ro(e){let t=oe(e.rect);if(!t)return;let n=oe(e.overlayRect);if(!n)return;let r=ie(e.center);return r?{rect:t,overlayRect:n,center:r}:void 0}function io(e){return typeof e.label==`string`&&e.label.length>0?{label:e.label}:{}}function ao(e){return d(e)}export{en as $,z as A,mn as B,xa as C,Ue as Ct,Xi as D,na as E,vn as F,ln as G,un as H,P as I,on as J,$t as K,fn as L,En as M,bn as N,Ti as O,yn as P,an as Q,cn as R,ya as S,$e as St,ra as T,Ie as Tt,dn as U,hn as V,N as W,sn as X,Zt as Y,rn as Z,Sa as _,St as _t,Ya as a,Yt as at,Aa as b,ot as bt,Qa as c,Mt as ct,Ua as d,wt as dt,nn as et,Ga as f,Dt as ft,ja as g,bt as gt,Fa as h,Et as ht,Ja as i,Xt as it,Rn as j,Kr as k,qa as l,At as lt,Ia as m,Ot as mt,to as n,k as nt,Xa as o,kt as ot,Wa as p,Tt as pt,Qt as q,$a as r,D as rt,Za as s,jt as st,eo as t,A as tt,Ka as u,Ct as ut,Oa as v,xt as vt,ba as w,x as wt,_a as x,st as xt,ka as y,rt as yt,pn as z};
6
+ `)}return{lines:n,buffer:r}}function Ha(e){return e.meta?.requestProgress===`replay-test`||e.meta?.requestProgress===`command`}function Ua(e){return!!e&&typeof e==`object`&&e.type===`progress`&&!!e.event}function Wa(e){return!!e&&typeof e==`object`&&e.type===`response`&&!!e.response}function Ga(e){return`${JSON.stringify({type:`progress`,event:e})}\n`}function Ka(e){return`${JSON.stringify({type:`response`,response:e})}\n`}function qa(e){return`${JSON.stringify({type:`response`,response:e})}\n`}function Ja(e,t={}){return{ok:!0,service:e,version:Ce(),rpcProtocolVersion:2,...t.upstream===void 0?{}:{upstream:t.upstream}}}function Ya(e){return{...typeof e.path==`string`?{path:e.path}:{},...typeof e.width==`number`?{width:e.width}:{},...typeof e.height==`number`?{height:e.height}:{},...typeof e.logicalWidth==`number`?{logicalWidth:e.logicalWidth}:{},...typeof e.logicalHeight==`number`?{logicalHeight:e.logicalHeight}:{},...typeof e.pixelDensity==`number`?{pixelDensity:e.pixelDensity}:{},...e.overlayRefs?{overlayRefs:e.overlayRefs}:{}}}function Xa(e){if(f(e))return Ya({path:typeof e.path==`string`?e.path:void 0,width:typeof e.width==`number`?e.width:void 0,height:typeof e.height==`number`?e.height:void 0,logicalWidth:typeof e.logicalWidth==`number`?e.logicalWidth:void 0,logicalHeight:typeof e.logicalHeight==`number`?e.logicalHeight:void 0,pixelDensity:typeof e.pixelDensity==`number`?e.pixelDensity:void 0,overlayRefs:Array.isArray(e.overlayRefs)?e.overlayRefs.filter(eo).flatMap(e=>{let t=Za(e);return t?[t]:[]}):void 0})}function Za(e){if(typeof e.ref!=`string`||e.ref.length===0)return;let t=Qa(e);if(t)return{ref:e.ref,...$a(e),...t}}function Qa(e){let t=re(e.rect);if(!t)return;let n=re(e.overlayRect);if(!n)return;let r=s(e.center);return r?{rect:t,overlayRect:n,center:r}:void 0}function $a(e){return typeof e.label==`string`&&e.label.length>0?{label:e.label}:{}}function eo(e){return f(e)}export{nn as $,R as A,fn as B,va as C,qi as D,$i as E,gn as F,sn as G,cn as H,N as I,rn as J,Zt as K,un as L,wn as M,vn as N,Ci as O,_n as P,tn as Q,on as R,ga as S,ea as T,ln as U,pn as V,M as W,Qt as X,Yt as Y,an as Z,ya as _,ct as _t,Wa as a,qt as at,Da as b,b as bt,qa as c,Ot as ct,Ra as d,Dt as dt,en as et,Ba as f,xt as ft,Oa as g,st as gt,ja as h,C as ht,Ua as i,Jt as it,In as j,Wr as k,Ha as l,Et as lt,Ma as m,St as mt,Xa as n,O as nt,Ga as o,wt as ot,za as p,Ct as pt,Xt as q,Ja as r,E as rt,Ka as s,Tt as st,Ya as t,k as tt,Va as u,kt as ut,Ta as v,tt as vt,_a as w,ma as x,Le as xt,Ea as y,We as yt,dn as z};
@@ -1 +1 @@
1
- import{_ as e,a as t}from"./sdk-contracts.js";import{gt as n,ht as r}from"./prepare-kind.js";import{t as i}from"./screenshot-result.js";import{n as a}from"./path-resolution.js";import{t as o}from"./shared.js";import{t as s}from"./cli-runner.js";const c=async({positionals:e,flags:n,client:r})=>{let a=await s({client:r,command:`screenshot`,positionals:e,flags:n});return t(n.responseLevel)?(o(n,a,()=>JSON.stringify(a,null,2)),!0):(o(n,i(a),()=>a.overlayRefs?`Annotated ${a.overlayRefs.length} refs onto ${a.path}`:d(a)),!0)},l=async({positionals:t,flags:i,client:c})=>{if(t[0]===`snapshot`){let e=await s({client:c,command:`diff`,positionals:t,flags:i});return o(i,e,()=>n(e)),!0}if(t[0]!==`screenshot`)return!1;let l=i.baseline;if(!l||typeof l!=`string`)throw new e(`INVALID_ARGS`,`diff screenshot requires --baseline <path>`);let d=a(l),f=typeof i.out==`string`?a(i.out):void 0,m=t[1];if(t.length>2)throw new e(`INVALID_ARGS`,`diff screenshot accepts at most one current screenshot path`);let[{createAgentDevice:h,localCommandPolicy:g},{createLocalArtifactAdapter:_}]=await Promise.all([import(`./runtime.js`).then(e=>e.r),import(`./sdk-io.js`).then(e=>e.n)]),v=await h({backend:u(c,i),artifacts:_(),sessions:{get:e=>({name:e}),set:()=>{}},policy:g()}).capture.diffScreenshot({session:i.session,baseline:{kind:`path`,path:d},current:m?{kind:`path`,path:a(m)}:{kind:`live`},...f?{out:{kind:`path`,path:f}}:{},threshold:p(i.threshold),overlayRefs:i.overlayRefs,normalizeStatusBar:i.screenshotNormalizeStatusBar,surface:i.surface});return o(i,v,()=>r(v)),!0};function u(e,t){return{platform:f(t),captureScreenshot:async(t,n,r)=>i(await e.capture.screenshot({path:n,session:t.session,overlayRefs:r?.overlayRefs,pixelDensity:r?.pixelDensity,fullscreen:r?.fullscreen,normalizeStatusBar:r?.normalizeStatusBar,stabilize:r?.stabilize,surface:r?.surface}))}}function d(e){if(typeof e.width!=`number`||typeof e.height!=`number`)return e.path;let t=typeof e.pixelDensity==`number`?` @${e.pixelDensity}x`:``;return`${e.path} (${e.width}x${e.height}${t})`}function f(e){switch(e.platform){case`android`:case`linux`:case`macos`:return e.platform;default:return`ios`}}function p(e){if(!(e==null||e===``))return Number(e)}export{l as diffCommand,c as screenshotCommand};
1
+ import{_ as e,a as t}from"./sdk-contracts.js";import{dt as n,ut as r}from"./prepare-kind.js";import{t as i}from"./screenshot-result.js";import{n as a}from"./path-resolution.js";import{t as o}from"./shared.js";import{t as s}from"./cli-runner.js";const c=async({positionals:e,flags:n,client:r})=>{let a=await s({client:r,command:`screenshot`,positionals:e,flags:n});return t(n.responseLevel)?(o(n,a,()=>JSON.stringify(a,null,2)),!0):(o(n,i(a),()=>a.overlayRefs?`Annotated ${a.overlayRefs.length} refs onto ${a.path}`:d(a)),!0)},l=async({positionals:t,flags:i,client:c})=>{if(t[0]===`snapshot`){let e=await s({client:c,command:`diff`,positionals:t,flags:i});return o(i,e,()=>n(e)),!0}if(t[0]!==`screenshot`)return!1;let l=i.baseline;if(!l||typeof l!=`string`)throw new e(`INVALID_ARGS`,`diff screenshot requires --baseline <path>`);let d=a(l),f=typeof i.out==`string`?a(i.out):void 0,m=t[1];if(t.length>2)throw new e(`INVALID_ARGS`,`diff screenshot accepts at most one current screenshot path`);let[{createAgentDevice:h,localCommandPolicy:g},{createLocalArtifactAdapter:_}]=await Promise.all([import(`./runtime.js`).then(e=>e.r),import(`./sdk-io.js`).then(e=>e.n)]),v=await h({backend:u(c,i),artifacts:_(),sessions:{get:e=>({name:e}),set:()=>{}},policy:g()}).capture.diffScreenshot({session:i.session,baseline:{kind:`path`,path:d},current:m?{kind:`path`,path:a(m)}:{kind:`live`},...f?{out:{kind:`path`,path:f}}:{},threshold:p(i.threshold),overlayRefs:i.overlayRefs,normalizeStatusBar:i.screenshotNormalizeStatusBar,surface:i.surface});return o(i,v,()=>r(v)),!0};function u(e,t){return{platform:f(t),captureScreenshot:async(t,n,r)=>i(await e.capture.screenshot({path:n,session:t.session,overlayRefs:r?.overlayRefs,pixelDensity:r?.pixelDensity,fullscreen:r?.fullscreen,normalizeStatusBar:r?.normalizeStatusBar,stabilize:r?.stabilize,surface:r?.surface}))}}function d(e){if(typeof e.width!=`number`||typeof e.height!=`number`)return e.path;let t=typeof e.pixelDensity==`number`?` @${e.pixelDensity}x`:``;return`${e.path} (${e.width}x${e.height}${t})`}function f(e){switch(e.platform){case`android`:case`linux`:case`macos`:return e.platform;default:return`ios`}}function p(e){if(!(e==null||e===``))return Number(e)}export{l as diffCommand,c as screenshotCommand};
@@ -1,6 +1,22 @@
1
1
  import { D as Rect, T as Point } from "./sdk-contracts.js";
2
2
  import { Readable, Writable } from "node:stream";
3
3
  import { StdioOptions, spawn } from "node:child_process";
4
+ //#region src/platforms/android/ime-helper-types.d.ts
5
+ type AndroidImeHelperManifest = {
6
+ name: 'android-ime-helper';
7
+ version: string;
8
+ assetName: string;
9
+ sha256: string;
10
+ packageName: string;
11
+ versionCode: number;
12
+ serviceComponent: string;
13
+ broadcastProtocol: 'android-ime-helper-v1';
14
+ };
15
+ type AndroidImeHelperArtifact = {
16
+ apkPath: string;
17
+ manifest: AndroidImeHelperManifest;
18
+ };
19
+ //#endregion
4
20
  //#region src/platforms/android/snapshot-helper-types.d.ts
5
21
  type AndroidSnapshotHelperManifest = {
6
22
  name: 'android-snapshot-helper';
@@ -180,9 +196,10 @@ type AndroidAdbPuller = (remotePath: string, localPath: string, options?: Androi
180
196
  * install options such as replace/test/downgrade/grant-permissions.
181
197
  */
182
198
  type AndroidAdbInstaller = (apkPath: string, options?: AndroidAdbInstallOptions) => Promise<AndroidAdbExecutorResult>;
183
- type AndroidBundleInstaller = (bundlePath: string, options: {
199
+ type AndroidBundleInstaller = (bundlePath: string, options: Readonly<{
184
200
  mode: string;
185
- }) => Promise<void>;
201
+ signal?: AbortSignal;
202
+ }>) => Promise<void>;
186
203
  type AndroidTextInputAction = 'type' | 'fill';
187
204
  type AndroidTextInjectionRequest = {
188
205
  action: AndroidTextInputAction;
@@ -213,6 +230,7 @@ type AndroidAdbProviderBase = {
213
230
  installBundle?: AndroidBundleInstaller;
214
231
  text?: AndroidTextInjector;
215
232
  snapshotHelperArtifact?: AndroidSnapshotHelperArtifact;
233
+ imeHelperArtifact?: AndroidImeHelperArtifact;
216
234
  };
217
235
  type AndroidTouchCapabilities = {
218
236
  touch?: never;
@@ -1,4 +1,4 @@
1
- import{o as e}from"./png-worker-contract.js";import{E as t,_ as n}from"./sdk-contracts.js";import r from"node:path";import i from"node:crypto";import{AsyncLocalStorage as a}from"node:async_hooks";import o,{constants as s}from"node:fs";import c from"node:os";import{pipeline as l}from"node:stream/promises";import{Readable as u}from"node:stream";import{access as d,stat as f}from"node:fs/promises";import{spawn as p,spawnSync as m}from"node:child_process";const h=new a;function g(){return i.randomBytes(8).toString(`hex`)}function ee(){return`${Date.now().toString(36)}-${i.randomBytes(4).toString(`hex`)}`}async function te(e,t){let n={...e,diagnosticId:ee(),events:[],liveWrittenEventCount:0,phaseCounts:new Map,sensitiveValues:new Set};return await h.run(n,t)}function _(e){let t=h.getStore();t&&Object.assign(t,e)}function ne(){let e=h.getStore();return e?{diagnosticId:e.diagnosticId,requestId:e.requestId,session:e.session,command:e.command,debug:e.debug,flushOnSuccess:e.flushOnSuccess}:{}}function re(e){e&&h.getStore()?.sensitiveValues.add(e)}function ie(e){let t=h.getStore();if(!t)return 0;let n=0;for(let r of e)n+=t.phaseCounts.get(r)??0;return n}function v(e){let t=h.getStore();if(!t)return;let n={ts:new Date().toISOString(),level:e.level??`info`,phase:e.phase,session:t.session,requestId:t.requestId,command:t.command,durationMs:e.durationMs,data:e.data?y(t,e.data):void 0};if(t.events.push(n),t.phaseCounts.set(e.phase,(t.phaseCounts.get(e.phase)??0)+1),!t.debug&&!t.traceLogPath)return;let r=`${JSON.stringify(n)}\n`;try{t.debug&&t.logPath&&(x(t.logPath,r),t.liveWrittenEventCount=t.events.length),t.traceLogPath&&x(t.traceLogPath,r),t.debug&&!t.logPath&&!t.traceLogPath&&process.stderr.write(`[agent-device][diag] ${r}`)}catch{}}async function ae(e,t,n){let r=Date.now();try{let i=await t();return v({level:`info`,phase:e,durationMs:Date.now()-r,data:n}),i}catch(t){throw v({level:`error`,phase:e,durationMs:Date.now()-r,data:{...n??{},error:t instanceof Error?t.message:String(t)}}),t}}function oe(e={}){let t=h.getStore();if(!t||!e.force&&!t.debug&&!t.flushOnSuccess||t.events.length===0)return null;try{if(t.logPath){let e=t.events.slice(t.liveWrittenEventCount);if(e.length>0){let n=e.map(e=>JSON.stringify(y(t,e)));x(t.logPath,`${n.join(`
2
- `)}\n`)}let n=t.logPath;return t.events=[],t.liveWrittenEventCount=0,n}let e=se(t.session??`default`),n=new Date().toISOString().slice(0,10),i=r.join(c.homedir(),`.agent-device`,`logs`,e,n);o.mkdirSync(i,{recursive:!0});let a=new Date().toISOString().replace(/[:.]/g,`-`),s=r.join(i,`${a}-${t.diagnosticId}.ndjson`),l=t.events.map(e=>JSON.stringify(y(t,e)));return o.writeFileSync(s,`${l.join(`
3
- `)}\n`),t.events=[],s}catch{return null}}function y(e,n){return b(t(n),[...e.sensitiveValues].sort((e,t)=>t.length-e.length))}function b(e,t){return typeof e==`string`?t.reduce((e,t)=>e.replaceAll(t,`[REDACTED]`),e):Array.isArray(e)?e.map(e=>b(e,t)):!e||typeof e!=`object`?e:Object.fromEntries(Object.entries(e).map(([e,n])=>[e,b(n,t)]))}function se(e){return e.replace(/[^a-zA-Z0-9._-]/g,`_`)}function x(e,t){o.mkdirSync(r.dirname(e),{recursive:!0}),o.appendFileSync(e,t,`utf8`)}const ce=new Set([`1`,`true`,`yes`,`on`]),le=new Set([`0`,`false`,`no`,`off`]);function ue(e){return`AGENT_DEVICE_${e.replace(/([A-Z])/g,`_$1`).replace(/[^A-Za-z0-9_]/g,`_`).toUpperCase()}`}function de(e,t,r,i){if(e.multiple)return(Array.isArray(t)?t:[t]).map(t=>de({...e,multiple:!1},t,r,i));if(e.type===`boolean`)return fe(t,r,i);if(e.type===`booleanOrString`){if(typeof t==`boolean`)return t;if(typeof t==`string`&&S(t)!==void 0)return S(t);if(typeof t==`string`&&t.trim().length>0)return t;throw new n(`INVALID_ARGS`,`Invalid value for "${i}" in ${r}. Expected boolean or non-empty string.`)}if(e.type===`string`){if(typeof t==`string`&&t.trim().length>0)return t;throw new n(`INVALID_ARGS`,`Invalid value for "${i}" in ${r}. Expected non-empty string.`)}if(e.type===`enum`){if(e.setValue!==void 0)return pe(e,t,r,i);if(typeof t!=`string`||!e.enumValues?.includes(t))throw new n(`INVALID_ARGS`,`Invalid value for "${i}" in ${r}. Expected one of: ${e.enumValues?.join(`, `)}.`);return t}let a=typeof t==`number`?t:typeof t==`string`?Number(t):NaN;if(!Number.isFinite(a)||e.type===`int`&&!Number.isInteger(a))throw new n(`INVALID_ARGS`,`Invalid value for "${i}" in ${r}. Expected ${e.type===`int`?`integer`:`number`}.`);if(typeof e.min==`number`&&a<e.min)throw new n(`INVALID_ARGS`,`Invalid value for "${i}" in ${r}. Must be >= ${e.min}.`);if(typeof e.max==`number`&&a>e.max)throw new n(`INVALID_ARGS`,`Invalid value for "${i}" in ${r}. Must be <= ${e.max}.`);return a}function fe(e,t,r){if(typeof e==`boolean`)return e;if(typeof e==`string`){let t=S(e);if(t!==void 0)return t}throw new n(`INVALID_ARGS`,`Invalid value for "${r}" in ${t}. Expected boolean.`)}function S(e){let t=e.trim().toLowerCase();if(ce.has(t))return!0;if(le.has(t))return!1}function pe(e,t,r,i){let a=e.setValue;if(t===a)return a;if(typeof t==`string`){let e=t.trim();if(e===``||e===`true`||e===`1`)return a;if(e===`false`||e===`0`)return}if(t===!0)return a;if(t!==!1)throw new n(`INVALID_ARGS`,`Invalid value for "${i}" in ${r}. Expected boolean-like value for enum flag.`)}const me=/^[A-Za-z0-9][A-Za-z0-9._+-]*$/,he=[`.com`,`.exe`,`.bat`,`.cmd`],C=new a;async function ge(e,t){return e?await C.run(e,t):await t()}async function w(e){return await C.run(void 0,e)}async function T(e,t,n={}){let r=C.getStore()?.(e,t,n);return r?E(await r):await D(e,t,n)}async function _e(e,t,n={}){let r=C.getStore()?.(e,t,n);return r?E(await r):await D(e,t,n)}function E(e){let t=typeof e.stdout==`string`?e.stdout:String(e.stdout??``),n=typeof e.stderr==`string`?e.stderr:String(e.stderr??``),r=typeof e.exitCode==`number`?e.exitCode:1;return t===e.stdout&&n===e.stderr&&r===e.exitCode?e:{...e,stdout:t,stderr:n,exitCode:r}}function D(e,t,n={}){let r=M(e),i=A();return new Promise((a,o)=>{let s=p(r,t,{cwd:n.cwd,env:n.env,stdio:[`pipe`,`pipe`,`pipe`],detached:n.detached,windowsHide:!0,shell:!1});n.onSpawn?.(s);let c=``,l=n.binaryStdout?[]:void 0,u=``,d=!1,f=H(n.timeoutMs),m=f?setTimeout(()=>{d=!0,U(s,n.detached)},f):null,h=Me(s,n);n.binaryStdout||s.stdout.setEncoding(`utf8`),s.stderr.setEncoding(`utf8`),Ne(s,n.stdin).catch(i=>{h.didAbort||d||Pe(i)||(o(Te(r,e,t,i)),U(s,n.detached))}),s.stdout.on(`data`,e=>{if(n.binaryStdout){l?.push(Buffer.isBuffer(e)?e:Buffer.from(e));return}let t=String(e);c+=t,n.onStdoutChunk?.(t)}),s.stderr.on(`data`,e=>{let t=String(e);u+=t,n.onStderrChunk?.(t)}),s.on(`error`,n=>{m&&clearTimeout(m),h.dispose(),i.emitForegroundCompletion(e,t),o(R(h,r,e,t,n))}),s.on(`close`,s=>{m&&clearTimeout(m),h.dispose(),i.emitForegroundCompletion(e,t);let p=s??1;if(!h.didAbort&&d&&f){o(Ee(r,e,t,f,p,c,u));return}let g=z(h,r,e,t,p,n.allowFailure,c,u);if(g){o(g);return}a({stdout:c,stderr:u,exitCode:p,stdoutBuffer:l?Buffer.concat(l):void 0})})})}async function ve(e){let t=Oe(e);if(!t)return!1;if(r.isAbsolute(t))return V(t);let n=process.env.PATH;if(!n)return!1;let i=ke();for(let e of n.split(r.delimiter)){let n=e.trim();if(n){for(let e of Ae(t,i))if(await V(r.join(n,e)))return!0}}return!1}async function ye(e,t){let r=B(e,t,`executable`);if(r){if(!await V(r))throw new n(`TOOL_MISSING`,`${t} points to a missing or non-executable file: ${r}`,{envName:t,path:r});return r}}async function be(e,t){let r=B(e,t,`file`);if(r){if(!await je(r))throw new n(`TOOL_MISSING`,`${t} points to a missing or non-file path: ${r}`,{envName:t,path:r});return r}}function xe(e,t,r={}){let i=M(e),a=m(i,t,{cwd:r.cwd,env:r.env,stdio:[`pipe`,`pipe`,`pipe`],encoding:r.binaryStdout?void 0:`utf8`,input:r.stdin,timeout:H(r.timeoutMs),windowsHide:!0,shell:!1,...r.maxBuffer===void 0?{}:{maxBuffer:r.maxBuffer}});if(a.error){let o=a.error.code;throw o===`ETIMEDOUT`?new n(`COMMAND_FAILED`,`${i} timed out after ${H(r.timeoutMs)}ms`,{cmd:e,args:t,timeoutMs:H(r.timeoutMs)},a.error):o===`ENOENT`?N(i,e,a.error):P(i,e,t,a.error)}let o=r.binaryStdout?Buffer.isBuffer(a.stdout)?a.stdout:Buffer.from(a.stdout??``):void 0,s=r.binaryStdout?``:typeof a.stdout==`string`?a.stdout:(a.stdout??``).toString(),c=typeof a.stderr==`string`?a.stderr:(a.stderr??``).toString(),l=a.status??1;if(l!==0&&!r.allowFailure)throw I(i,e,t,l,s,c);return{stdout:s,stderr:c,exitCode:l,stdoutBuffer:o}}function Se(e,t,n={}){return O(e,t,n).pid}function O(e,t,n={}){let r=p(M(e),t,{cwd:n.cwd,env:n.env,stdio:n.stdio??`ignore`,detached:!0,windowsHide:!0,shell:!1}),i=r.pid??0,a=new Promise(e=>{r.once(`error`,t=>{e({pid:i,error:t.message})}),r.once(`exit`,(t,n)=>{e({pid:i,...typeof t==`number`?{exitCode:t}:{},...n?{signal:n}:{}})})});return r.unref(),{pid:i,exited:a}}function k(e,t,n={}){let r=M(e),i=A(),a=p(r,t,{cwd:n.cwd,env:n.env,stdio:n.stdio??[`ignore`,`pipe`,`pipe`],detached:n.detached,windowsHide:!0,shell:!1});i.emitBackgroundSpawn(e,t);let o=``,s=``,c=n.captureOutput??!0,l=Me(a,n);return c&&(a.stdout?.setEncoding(`utf8`),a.stderr?.setEncoding(`utf8`),a.stdout?.on(`data`,e=>{o+=e}),a.stderr?.on(`data`,e=>{s+=e})),{child:a,wait:new Promise((c,u)=>{a.on(`error`,n=>{l.dispose(),i.emitBackgroundCompletion(e,t,`error`),u(R(l,r,e,t,n))}),a.on(`close`,a=>{l.dispose(),i.emitBackgroundCompletion(e,t,`exit`);let d=a??1,f=z(l,r,e,t,d,n.allowFailure,o,s);if(f){u(f);return}c({stdout:o,stderr:s,exitCode:d})})})}}function A(){let e=ne(),t=e.debug===!0,n=S(process.env.AGENT_DEVICE_EXEC_TRACE??``)===!0;if(!t&&!n)return Ce();n&&e.flushOnSuccess!==!0&&_({flushOnSuccess:!0});let r=Date.now(),i=!1;return{emitForegroundCompletion:(e,t)=>{i||(i=!0,j({cmd:e,args:t,startedAtMs:r}))},emitBackgroundSpawn:(e,t)=>{j({cmd:e,args:t,data:{event:`spawn`}})},emitBackgroundCompletion:(e,t,n)=>{i||(i=!0,j({cmd:e,args:t,startedAtMs:r,data:{event:n}}))}}}function Ce(){return{emitForegroundCompletion:()=>{},emitBackgroundSpawn:()=>{},emitBackgroundCompletion:()=>{}}}function j(e){let t=e.args.slice(0,6);v({level:`debug`,phase:`exec_command`,durationMs:e.startedAtMs===void 0?void 0:Math.max(0,Date.now()-e.startedAtMs),data:{command:e.cmd,argsPrefix:t,...e.args.length>t.length?{omittedArgCount:e.args.length-t.length}:{},...e.data??{}}})}function M(e){let t=Oe(e);if(!t)throw new n(`INVALID_ARGS`,`Invalid executable command: ${JSON.stringify(e)}`,{cmd:e,hint:`Use a bare command name from PATH or an absolute executable path.`});return t}function we(e,t,n,r){return r.code===`ENOENT`?N(e,t,r):P(e,t,n,r)}function N(e,t,r){return new n(`TOOL_MISSING`,`${e} not found in PATH`,{cmd:t},r)}function P(e,t,r,i){return new n(`COMMAND_FAILED`,`Failed to run ${e}`,{cmd:t,args:r},i)}function Te(e,t,r,i){return new n(`COMMAND_FAILED`,`Failed to write stdin for ${e}`,{cmd:t,args:r},i instanceof Error?i:void 0)}function F(e,t,r){return new n(`COMMAND_FAILED`,`request canceled`,{cmd:t,args:r,executable:e,reason:`request_canceled`})}function Ee(e,t,r,i,a,o,s){return new n(`COMMAND_FAILED`,`${e} timed out after ${i}ms`,{cmd:t,args:r,stdout:o,stderr:s,exitCode:a,timeoutMs:i})}function I(e,t,r,i,a,o){return new n(`COMMAND_FAILED`,`${e} exited with code ${i}`,L({stdout:a,stderr:o,exitCode:i},{cmd:t,args:r}))}function De(e,t,r){if(e.exitCode===0)return e;throw new n(`COMMAND_FAILED`,t,L(e,typeof r==`function`?r(e):r))}function L(e,t){return{stdout:e.stdout,stderr:e.stderr,exitCode:e.exitCode,processExitError:!0,...t}}function R(e,t,n,r,i){return e.didAbort?F(t,n,r):we(t,n,r,i)}function z(e,t,n,r,i,a,o,s){return e.didAbort?F(t,n,r):i!==0&&!a?I(t,n,r,i,o,s):null}function B(e,t,i){let a=e?.trim();if(a){if(!r.isAbsolute(a)||a.includes(`\0`))throw new n(`INVALID_ARGS`,`${t} must be an absolute ${i} path, not ${JSON.stringify(e)}`,{envName:t,path:e});return a}}function Oe(e){let t=e.trim();return!t||t.includes(`\0`)?null:r.isAbsolute(t)?t:t.includes(`/`)||t.includes(`\\`)?null:me.test(t)?t:null}function ke(){if(process.platform!==`win32`)return[``];let e=process.env.PATHEXT;if(!e)return he;let t=e.split(`;`).map(e=>e.trim().toLowerCase()).filter(e=>e.length>0);return t.length>0?t:he}function Ae(e,t){if(process.platform!==`win32`)return[e];let n=e.toLowerCase();return t.some(e=>n.endsWith(e))?[e]:t.map(t=>`${e}${t}`)}async function V(e){try{return await je(e)?(await d(e,process.platform===`win32`?s.F_OK:s.X_OK),!0):!1}catch{return!1}}async function je(e){try{return(await f(e)).isFile()}catch{return!1}}function H(e){if(!Number.isFinite(e))return;let t=Math.floor(e);if(!(t<=0))return t}function Me(e,t){let n=!1,r=()=>{n=!0,U(e,t.detached)};return t.signal?.aborted?r():t.signal?.addEventListener(`abort`,r,{once:!0}),{get didAbort(){return n},dispose:()=>{t.signal?.removeEventListener(`abort`,r)}}}function U(e,t){if(t&&e.pid&&process.platform!==`win32`)try{process.kill(-e.pid,`SIGKILL`);return}catch{}e.kill(`SIGKILL`)}async function Ne(e,t){if(e.stdin){if(t===void 0){e.stdin?.end();return}await l(u.from([t]),e.stdin)}}function Pe(e){return e instanceof Error&&`code`in e&&e.code===`EPIPE`}var Fe=e({androidAdbResultError:()=>K,attachAdbFailureHint:()=>G,classifyAdbFailure:()=>Re,createAndroidPortReverseManager:()=>Ye,createDeviceAdbExecutor:()=>Y,createLocalAndroidAdbProvider:()=>We,installAndroidAdbPackage:()=>Xe,pullAndroidAdbFile:()=>Q,resolveAndroidAdbExecutor:()=>Ge,resolveAndroidAdbProvider:()=>X,resolveAndroidTextInjector:()=>qe,resolveAndroidTouchProvider:()=>Je,resolveScopedAndroidAdbBackgroundTransport:()=>Ke,withAndroidAdbProvider:()=>Qe});const Ie=[{reason:`device_unauthorized`,pattern:/device unauthorized|device still authorizing/,hint:`USB debugging is not authorized — accept the authorization prompt on the device screen (re-plug the cable if none appears), then retry.`},{reason:`device_offline`,pattern:/device offline/,hint:`The device is connected but offline — wait for it to finish booting or run adb reconnect, then retry.`,retriable:!0},{reason:`multiple_devices`,pattern:/more than one (?:device\/emulator|device and emulator)/,hint:`Multiple Android devices are connected — pass --serial <serial> (see adb devices) to select one.`},{reason:`no_devices`,pattern:/no devices\/emulators found|no devices found/,hint:`No Android devices detected — boot an emulator or connect a device and verify it appears in adb devices.`},{reason:`device_not_found`,pattern:/device (?:'[^']*' )?not found/,hint:`The device disconnected or is restarting — verify it is listed in adb devices, then retry.`,retriable:!0},{reason:`server_version_mismatch`,pattern:/adb server version \(\d+\) doesn't match this client/,hint:`Multiple adb installs conflict — adb restarts its server automatically, so retry; align PATH to a single adb to stop recurrences.`,retriable:!0},{reason:`connection_dropped`,pattern:/transport error|connection reset|broken pipe|protocol fault/,hint:`The adb connection dropped — retry; if it persists, run adb kill-server and reconnect the device.`,retriable:!0},{reason:`install_insufficient_storage`,pattern:/install_failed_insufficient_storage/,hint:`The device is out of storage — free up space or uninstall unused apps, then retry the install.`,matchStdout:!0},{reason:`install_update_incompatible`,pattern:/install_failed_update_incompatible/,hint:`The installed app has an incompatible signature — uninstall the existing app first, then retry the install.`,matchStdout:!0},{reason:`install_version_downgrade`,pattern:/install_failed_version_downgrade/,hint:`The APK is older than the installed app — uninstall the app first (or install with downgrade allowed), then retry.`,matchStdout:!0},{reason:`install_failed`,pattern:/install_failed_\w+|install_parse_failed_\w+/,hint:`The Android package installer rejected the APK — see the INSTALL_FAILED code in the error output for the exact cause.`,matchStdout:!0}],Le=Object.freeze({reason:`timeout`,hint:`adb timed out — the adb server may be wedged. Run adb kill-server && adb start-server, check adb devices, then retry.`});function Re(e,t=``){let n=e.toLowerCase(),r=t.toLowerCase();for(let{pattern:e,matchStdout:t,...i}of Ie)if(e.test(n)||t&&e.test(r))return i}const W=new a;function G(e){if(!(e instanceof n)||e.code!==`COMMAND_FAILED`)return e;let t=ze(e);return t&&(e.details={...e.details,adbFailure:t.reason,...typeof e.details?.hint==`string`?{}:{hint:t.hint},...t.retriable!==void 0&&e.details?.retriable===void 0?{retriable:t.retriable}:{}}),e}function ze(e){return typeof e.details?.timeoutMs==`number`?Le:Re(typeof e.details?.stderr==`string`?e.details.stderr:``,typeof e.details?.stdout==`string`?e.details.stdout:``)}function K(e,t,r){return G(new n(`COMMAND_FAILED`,e,t.exitCode===0?{stdout:t.stdout,stderr:t.stderr,exitCode:t.exitCode,...r}:L(t,r)))}function q(e){return async(...t)=>{try{return await e(...t)}catch(e){throw G(e)}}}const Be=new WeakSet;function Ve(e){if(Be.has(e))return e;let t={...e,exec:q(J(e.exec)),...e.pull?{pull:q(J(e.pull))}:{},...e.install?{install:q(J(e.install))}:{},...e.installBundle?{installBundle:q(e.installBundle)}:{}};return Be.add(t),t}function J(e){return async(...t)=>E(await e(...t))}function Y(e){return He(e.id)}function He(e){return q(async(t,n)=>await w(async()=>await T(`adb`,[`-s`,e,...t],{...n,detached:process.platform!==`win32`})))}function Ue(e){return(t,n)=>{let r=k(`adb`,[`-s`,e,...t],{...n,allowFailure:!0,captureOutput:!1});return r.wait.catch(()=>{}),r.child}}function We(e){let t=Y(e);return{exec:t,spawn:Ue(e.id),reverse:nt(t),pull:async(e,n,r)=>await t([`pull`,e,n],r),install:async(e,n)=>{let{installArgs:r,execOptions:i}=$(n);return await t([`install`,...r,e],i)}}}function Ge(e,t){let n=W.getStore();return t||(n?.serial===e.id?n.provider.exec:Y(e))}function X(e,t){if(t)return Z(t);let n=W.getStore();return n?.serial===e.id?Z(n.provider):We(e)}function Ke(e){let t=W.getStore();return t?.serial===e.id?{mode:`transport-composed`,...t.provider.spawn?{spawn:t.provider.spawn}:{}}:{mode:`local`}}function qe(e){let t=W.getStore();return t?.serial===e.id?t.provider.text:void 0}function Je(e){let t=W.getStore();return t?.serial===e.id&&t.provider.touch?t.provider:void 0}function Ye(e){let t=Z(e);if(t.reverse&&tt.has(t.reverse))return t.reverse;let r=t.reverse??nt(t.exec),i=new Map,a={async ensure(e,t){let a=i.get(e.local);if(a&&a.ownerId!==e.ownerId)throw new n(`COMMAND_FAILED`,`Android port reverse ${e.local} is already owned by ${a.ownerId??`another session`}`,{current:a,requested:e});a?.remote!==e.remote&&(await r.ensure(e,t),i.set(e.local,{...e}))},async remove(e,t){if(!i.has(e)){await r.remove(e,t);return}await r.remove(e,t),i.delete(e)},async removeAllOwned(e,t){let n=[...i.values()].filter(t=>t.ownerId===e).map(e=>e.local);if(n.length===0){await r.removeAllOwned(e,t);return}for(let e of n)await r.remove(e,t),i.delete(e)},async list(e){return r.list?await r.list(e):[...i.values()]}};return tt.add(a),a}function Z(e){return Ve(typeof e==`function`?{exec:e}:e)}async function Q(e,t,r){let{device:i,provider:a,...o}=r??{},s=Ze(i,a),c=s?.pull;if(c)return await w(async()=>await c(e,t,o));let l=s?.exec;if(!l)throw new n(`COMMAND_FAILED`,`Android adb pull requires an adb provider`);return await w(async()=>await l([`pull`,e,t],o))}async function Xe(e,t){let{device:r,provider:i,...a}=t??{},o=Ze(r,i),s=o?.install;if(s)return await w(async()=>await s(e,a));let c=o?.exec;if(!c)throw new n(`COMMAND_FAILED`,`Android adb install requires an adb provider`);let{installArgs:l,execOptions:u}=$(a);return await w(async()=>await c([`install`,...l,e],u))}function Ze(e,t){if(t)return Z(t);if(e)return X(e);let n=W.getStore();if(n)return Z(n.provider)}async function Qe(e,t,n){if(!e)return await n();let r={provider:Z(e),serial:t.serial},i=$e(r);return await W.run(r,async()=>await ge(i,n))}function $e(e){return(t,n,r)=>{if(t!==`adb`)return;let i=et(n,e.serial);if(i)return w(async()=>await e.provider.exec(i,r))}}function et(e,t){if(!(e[0]!==`-s`||!e[1])&&e[1]===t)return e.slice(2)}const tt=new WeakSet;function nt(e){let t=new Map;return{async ensure(n,r){if(await e([`reverse`,n.local,n.remote],{allowFailure:!1,signal:r?.signal,timeoutMs:r?.timeoutMs}),n.ownerId){let e=t.get(n.ownerId)??new Set;e.add(n.local),t.set(n.ownerId,e)}},async remove(n,r){let i=await e([`reverse`,`--remove`,n],{allowFailure:!0,signal:r?.signal,timeoutMs:r?.timeoutMs});if(i.exitCode!==0&&!it(i.stdout,i.stderr))throw K(`Failed to remove Android port reverse ${n}`,i,{local:n});for(let e of t.values())e.delete(n)},async removeAllOwned(e,n){let r=[...t.get(e)??[]];for(let e of r)await this.remove(e,n);t.delete(e)},async list(n){let r=await e([`reverse`,`--list`],{allowFailure:!0,signal:n?.signal,timeoutMs:n?.timeoutMs});return r.exitCode===0?rt(r.stdout,t):[]}}}function rt(e,t){let n=new Map;for(let[e,r]of t)for(let t of r)n.set(t,e);return e.split(`
4
- `).map(e=>e.trim().split(/\s+/)).filter(e=>e.length>=3).map(([,e,t])=>{let r=e;return{local:r,remote:t,ownerId:n.get(r)}})}function it(e,t){let n=`${e}\n${t}`.toLowerCase();return n.includes(`listener`)&&n.includes(`not found`)}function $(e){let{replace:t,allowTestPackages:n,allowDowngrade:r,grantPermissions:i,...a}=e??{},o=[];return t&&o.push(`-r`),n&&o.push(`-t`),r&&o.push(`-d`),i&&o.push(`-g`),{installArgs:o,execOptions:a}}export{v as A,ve as C,de as D,S as E,ae as F,te as I,ne as M,re as N,ie as O,_ as P,xe as S,ue as T,T as _,Q as a,O as b,qe as c,E as d,L as f,be as g,ye as h,Xe as i,oe as j,g as k,Je as l,De as m,K as n,Ge as o,V as p,Ye as r,X as s,Fe as t,Qe as u,k as v,w,_e as x,Se as y};
1
+ import{n as e}from"./rolldown-runtime.js";import{D as t,_ as n}from"./sdk-contracts.js";import r from"node:path";import i from"node:crypto";import{AsyncLocalStorage as a}from"node:async_hooks";import o,{constants as s}from"node:fs";import c from"node:os";import{pipeline as l}from"node:stream/promises";import{Readable as u}from"node:stream";import{access as d,stat as f}from"node:fs/promises";import{spawn as p,spawnSync as m}from"node:child_process";const h=new a;function g(){return i.randomBytes(8).toString(`hex`)}function ee(){return`${Date.now().toString(36)}-${i.randomBytes(4).toString(`hex`)}`}async function te(e,t){let n={...e,diagnosticId:ee(),events:[],liveWrittenEventCount:0,phaseCounts:new Map,sensitiveValues:new Set};return await h.run(n,t)}function _(e){let t=h.getStore();t&&Object.assign(t,e)}function v(){let e=h.getStore();return e?{diagnosticId:e.diagnosticId,requestId:e.requestId,session:e.session,command:e.command,debug:e.debug,flushOnSuccess:e.flushOnSuccess}:{}}function ne(e){e&&h.getStore()?.sensitiveValues.add(e)}function re(e){let t=h.getStore();if(!t)return 0;let n=0;for(let r of e)n+=t.phaseCounts.get(r)??0;return n}function y(e){let t=h.getStore();if(!t)return;let n={ts:new Date().toISOString(),level:e.level??`info`,phase:e.phase,session:t.session,requestId:t.requestId,command:t.command,durationMs:e.durationMs,data:e.data?b(t,e.data):void 0};if(t.events.push(n),t.phaseCounts.set(e.phase,(t.phaseCounts.get(e.phase)??0)+1),!t.debug&&!t.traceLogPath)return;let r=`${JSON.stringify(n)}\n`;try{t.debug&&t.logPath&&(S(t.logPath,r),t.liveWrittenEventCount=t.events.length),t.traceLogPath&&S(t.traceLogPath,r),t.debug&&!t.logPath&&!t.traceLogPath&&process.stderr.write(`[agent-device][diag] ${r}`)}catch{}}async function ie(e,t,n){let r=Date.now();try{let i=await t();return y({level:`info`,phase:e,durationMs:Date.now()-r,data:n}),i}catch(t){throw y({level:`error`,phase:e,durationMs:Date.now()-r,data:{...n??{},error:t instanceof Error?t.message:String(t)}}),t}}function ae(e={}){let t=h.getStore();if(!t||!e.force&&!t.debug&&!t.flushOnSuccess||t.events.length===0)return null;try{if(t.logPath){let e=t.events.slice(t.liveWrittenEventCount);if(e.length>0){let n=e.map(e=>JSON.stringify(b(t,e)));S(t.logPath,`${n.join(`
2
+ `)}\n`)}let n=t.logPath;return t.events=[],t.liveWrittenEventCount=0,n}let e=oe(t.session??`default`),n=new Date().toISOString().slice(0,10),i=r.join(c.homedir(),`.agent-device`,`logs`,e,n);o.mkdirSync(i,{recursive:!0});let a=new Date().toISOString().replace(/[:.]/g,`-`),s=r.join(i,`${a}-${t.diagnosticId}.ndjson`),l=t.events.map(e=>JSON.stringify(b(t,e)));return o.writeFileSync(s,`${l.join(`
3
+ `)}\n`),t.events=[],s}catch{return null}}function b(e,n){return x(t(n),[...e.sensitiveValues].sort((e,t)=>t.length-e.length))}function x(e,t){return typeof e==`string`?t.reduce((e,t)=>e.replaceAll(t,`[REDACTED]`),e):Array.isArray(e)?e.map(e=>x(e,t)):!e||typeof e!=`object`?e:Object.fromEntries(Object.entries(e).map(([e,n])=>[e,x(n,t)]))}function oe(e){return e.replace(/[^a-zA-Z0-9._-]/g,`_`)}function S(e,t){o.mkdirSync(r.dirname(e),{recursive:!0}),o.appendFileSync(e,t,`utf8`)}const se=new Set([`1`,`true`,`yes`,`on`]),ce=new Set([`0`,`false`,`no`,`off`]);function le(e){return`AGENT_DEVICE_${e.replace(/([A-Z])/g,`_$1`).replace(/[^A-Za-z0-9_]/g,`_`).toUpperCase()}`}function ue(e,t,r,i){if(e.multiple)return(Array.isArray(t)?t:[t]).map(t=>ue({...e,multiple:!1},t,r,i));if(e.type===`boolean`)return de(t,r,i);if(e.type===`booleanOrString`){if(typeof t==`boolean`)return t;if(typeof t==`string`&&C(t)!==void 0)return C(t);if(typeof t==`string`&&t.trim().length>0)return t;throw new n(`INVALID_ARGS`,`Invalid value for "${i}" in ${r}. Expected boolean or non-empty string.`)}if(e.type===`string`){if(typeof t==`string`&&t.trim().length>0)return t;throw new n(`INVALID_ARGS`,`Invalid value for "${i}" in ${r}. Expected non-empty string.`)}if(e.type===`enum`){if(e.setValue!==void 0)return fe(e,t,r,i);if(typeof t!=`string`||!e.enumValues?.includes(t))throw new n(`INVALID_ARGS`,`Invalid value for "${i}" in ${r}. Expected one of: ${e.enumValues?.join(`, `)}.`);return t}let a=typeof t==`number`?t:typeof t==`string`?Number(t):NaN;if(!Number.isFinite(a)||e.type===`int`&&!Number.isInteger(a))throw new n(`INVALID_ARGS`,`Invalid value for "${i}" in ${r}. Expected ${e.type===`int`?`integer`:`number`}.`);if(typeof e.min==`number`&&a<e.min)throw new n(`INVALID_ARGS`,`Invalid value for "${i}" in ${r}. Must be >= ${e.min}.`);if(typeof e.max==`number`&&a>e.max)throw new n(`INVALID_ARGS`,`Invalid value for "${i}" in ${r}. Must be <= ${e.max}.`);return a}function de(e,t,r){if(typeof e==`boolean`)return e;if(typeof e==`string`){let t=C(e);if(t!==void 0)return t}throw new n(`INVALID_ARGS`,`Invalid value for "${r}" in ${t}. Expected boolean.`)}function C(e){let t=e.trim().toLowerCase();if(se.has(t))return!0;if(ce.has(t))return!1}function fe(e,t,r,i){let a=e.setValue;if(t===a)return a;if(typeof t==`string`){let e=t.trim();if(e===``||e===`true`||e===`1`)return a;if(e===`false`||e===`0`)return}if(t===!0)return a;if(t!==!1)throw new n(`INVALID_ARGS`,`Invalid value for "${i}" in ${r}. Expected boolean-like value for enum flag.`)}var pe=e({coerceExecResult:()=>O,execFailureDetails:()=>V,isExecutablePath:()=>H,requireExecSuccess:()=>we,resolveExecutableOverridePath:()=>A,resolveFileOverridePath:()=>ve,runCmd:()=>E,runCmdBackground:()=>P,runCmdDetached:()=>M,runCmdDetachedMonitored:()=>N,runCmdStreaming:()=>D,runCmdSync:()=>j,whichCmd:()=>_e,withCommandExecutorOverride:()=>ge,withoutCommandExecutorOverride:()=>T});const me=/^[A-Za-z0-9][A-Za-z0-9._+-]*$/,he=[`.com`,`.exe`,`.bat`,`.cmd`],w=new a;async function ge(e,t){return e?await w.run(e,t):await t()}async function T(e){return await w.run(void 0,e)}async function E(e,t,n={}){let r=w.getStore()?.(e,t,n);return r?O(await r):await k(e,t,n)}async function D(e,t,n={}){let r=w.getStore()?.(e,t,n);return r?O(await r):await k(e,t,n)}function O(e){let t=typeof e.stdout==`string`?e.stdout:String(e.stdout??``),n=typeof e.stderr==`string`?e.stderr:String(e.stderr??``),r=typeof e.exitCode==`number`?e.exitCode:1;return t===e.stdout&&n===e.stderr&&r===e.exitCode?e:{...e,stdout:t,stderr:n,exitCode:r}}function k(e,t,n={}){let r=L(e),i=F();return new Promise((a,o)=>{let s=p(r,t,{cwd:n.cwd,env:n.env,stdio:[`pipe`,`pipe`,`pipe`],detached:n.detached,windowsHide:!0,shell:!1});n.onSpawn?.(s);let c=``,l=n.binaryStdout?[]:void 0,u=``,d=!1,f=U(n.timeoutMs),m=f?setTimeout(()=>{d=!0,W(s,n.detached)},f):null,h=Me(s,n);n.binaryStdout||s.stdout.setEncoding(`utf8`),s.stderr.setEncoding(`utf8`),Ne(s,n.stdin).catch(i=>{h.didAbort||d||Pe(i)||(o(xe(r,e,t,i)),W(s,n.detached))}),s.stdout.on(`data`,e=>{if(n.binaryStdout){l?.push(Buffer.isBuffer(e)?e:Buffer.from(e));return}let t=String(e);c+=t,n.onStdoutChunk?.(t)}),s.stderr.on(`data`,e=>{let t=String(e);u+=t,n.onStderrChunk?.(t)}),s.on(`error`,n=>{m&&clearTimeout(m),h.dispose(),i.emitForegroundCompletion(e,t),o(Te(h,r,e,t,n))}),s.on(`close`,s=>{m&&clearTimeout(m),h.dispose(),i.emitForegroundCompletion(e,t);let p=s??1;if(!h.didAbort&&d&&f){o(Se(r,e,t,f,p,c,u));return}let g=Ee(h,r,e,t,p,n.allowFailure,c,u);if(g){o(g);return}a({stdout:c,stderr:u,exitCode:p,stdoutBuffer:l?Buffer.concat(l):void 0})})})}async function _e(e){let t=Oe(e);if(!t)return!1;if(r.isAbsolute(t))return H(t);let n=process.env.PATH;if(!n)return!1;let i=ke();for(let e of n.split(r.delimiter)){let n=e.trim();if(n){for(let e of Ae(t,i))if(await H(r.join(n,e)))return!0}}return!1}async function A(e,t){let r=De(e,t,`executable`);if(r){if(!await H(r))throw new n(`TOOL_MISSING`,`${t} points to a missing or non-executable file: ${r}`,{envName:t,path:r});return r}}async function ve(e,t){let r=De(e,t,`file`);if(r){if(!await je(r))throw new n(`TOOL_MISSING`,`${t} points to a missing or non-file path: ${r}`,{envName:t,path:r});return r}}function j(e,t,r={}){let i=L(e),a=m(i,t,{cwd:r.cwd,env:r.env,stdio:[`pipe`,`pipe`,`pipe`],encoding:r.binaryStdout?void 0:`utf8`,input:r.stdin,timeout:U(r.timeoutMs),windowsHide:!0,shell:!1,...r.maxBuffer===void 0?{}:{maxBuffer:r.maxBuffer}});if(a.error){let o=a.error.code;throw o===`ETIMEDOUT`?new n(`COMMAND_FAILED`,`${i} timed out after ${U(r.timeoutMs)}ms`,{cmd:e,args:t,timeoutMs:U(r.timeoutMs)},a.error):o===`ENOENT`?R(i,e,a.error):z(i,e,t,a.error)}let o=r.binaryStdout?Buffer.isBuffer(a.stdout)?a.stdout:Buffer.from(a.stdout??``):void 0,s=r.binaryStdout?``:typeof a.stdout==`string`?a.stdout:(a.stdout??``).toString(),c=typeof a.stderr==`string`?a.stderr:(a.stderr??``).toString(),l=a.status??1;if(l!==0&&!r.allowFailure)throw Ce(i,e,t,l,s,c);return{stdout:s,stderr:c,exitCode:l,stdoutBuffer:o}}function M(e,t,n={}){return N(e,t,n).pid}function N(e,t,n={}){let r=p(L(e),t,{cwd:n.cwd,env:n.env,stdio:n.stdio??`ignore`,detached:!0,windowsHide:!0,shell:!1}),i=r.pid??0,a=new Promise(e=>{r.once(`error`,t=>{e({pid:i,error:t.message})}),r.once(`exit`,(t,n)=>{e({pid:i,...typeof t==`number`?{exitCode:t}:{},...n?{signal:n}:{}})})});return r.unref(),{pid:i,exited:a}}function P(e,t,n={}){let r=L(e),i=F(),a=p(r,t,{cwd:n.cwd,env:n.env,stdio:n.stdio??[`ignore`,`pipe`,`pipe`],detached:n.detached,windowsHide:!0,shell:!1});i.emitBackgroundSpawn(e,t);let o=``,s=``,c=n.captureOutput??!0,l=Me(a,n);return c&&(a.stdout?.setEncoding(`utf8`),a.stderr?.setEncoding(`utf8`),a.stdout?.on(`data`,e=>{o+=e}),a.stderr?.on(`data`,e=>{s+=e})),{child:a,wait:new Promise((c,u)=>{a.on(`error`,n=>{l.dispose(),i.emitBackgroundCompletion(e,t,`error`),u(Te(l,r,e,t,n))}),a.on(`close`,a=>{l.dispose(),i.emitBackgroundCompletion(e,t,`exit`);let d=a??1,f=Ee(l,r,e,t,d,n.allowFailure,o,s);if(f){u(f);return}c({stdout:o,stderr:s,exitCode:d})})})}}function F(){let e=v(),t=e.debug===!0,n=C(process.env.AGENT_DEVICE_EXEC_TRACE??``)===!0;if(!t&&!n)return ye();n&&e.flushOnSuccess!==!0&&_({flushOnSuccess:!0});let r=Date.now(),i=!1;return{emitForegroundCompletion:(e,t)=>{i||(i=!0,I({cmd:e,args:t,startedAtMs:r}))},emitBackgroundSpawn:(e,t)=>{I({cmd:e,args:t,data:{event:`spawn`}})},emitBackgroundCompletion:(e,t,n)=>{i||(i=!0,I({cmd:e,args:t,startedAtMs:r,data:{event:n}}))}}}function ye(){return{emitForegroundCompletion:()=>{},emitBackgroundSpawn:()=>{},emitBackgroundCompletion:()=>{}}}function I(e){let t=e.args.slice(0,6);y({level:`debug`,phase:`exec_command`,durationMs:e.startedAtMs===void 0?void 0:Math.max(0,Date.now()-e.startedAtMs),data:{command:e.cmd,argsPrefix:t,...e.args.length>t.length?{omittedArgCount:e.args.length-t.length}:{},...e.data??{}}})}function L(e){let t=Oe(e);if(!t)throw new n(`INVALID_ARGS`,`Invalid executable command: ${JSON.stringify(e)}`,{cmd:e,hint:`Use a bare command name from PATH or an absolute executable path.`});return t}function be(e,t,n,r){return r.code===`ENOENT`?R(e,t,r):z(e,t,n,r)}function R(e,t,r){return new n(`TOOL_MISSING`,`${e} not found in PATH`,{cmd:t},r)}function z(e,t,r,i){return new n(`COMMAND_FAILED`,`Failed to run ${e}`,{cmd:t,args:r},i)}function xe(e,t,r,i){return new n(`COMMAND_FAILED`,`Failed to write stdin for ${e}`,{cmd:t,args:r},i instanceof Error?i:void 0)}function B(e,t,r){return new n(`COMMAND_FAILED`,`request canceled`,{cmd:t,args:r,executable:e,reason:`request_canceled`})}function Se(e,t,r,i,a,o,s){return new n(`COMMAND_FAILED`,`${e} timed out after ${i}ms`,{cmd:t,args:r,stdout:o,stderr:s,exitCode:a,timeoutMs:i})}function Ce(e,t,r,i,a,o){return new n(`COMMAND_FAILED`,`${e} exited with code ${i}`,V({stdout:a,stderr:o,exitCode:i},{cmd:t,args:r}))}function we(e,t,r){if(e.exitCode===0)return e;throw new n(`COMMAND_FAILED`,t,V(e,typeof r==`function`?r(e):r))}function V(e,t){return{stdout:e.stdout,stderr:e.stderr,exitCode:e.exitCode,processExitError:!0,...t}}function Te(e,t,n,r,i){return e.didAbort?B(t,n,r):be(t,n,r,i)}function Ee(e,t,n,r,i,a,o,s){return e.didAbort?B(t,n,r):i!==0&&!a?Ce(t,n,r,i,o,s):null}function De(e,t,i){let a=e?.trim();if(a){if(!r.isAbsolute(a)||a.includes(`\0`))throw new n(`INVALID_ARGS`,`${t} must be an absolute ${i} path, not ${JSON.stringify(e)}`,{envName:t,path:e});return a}}function Oe(e){let t=e.trim();return!t||t.includes(`\0`)?null:r.isAbsolute(t)?t:t.includes(`/`)||t.includes(`\\`)?null:me.test(t)?t:null}function ke(){if(process.platform!==`win32`)return[``];let e=process.env.PATHEXT;if(!e)return he;let t=e.split(`;`).map(e=>e.trim().toLowerCase()).filter(e=>e.length>0);return t.length>0?t:he}function Ae(e,t){if(process.platform!==`win32`)return[e];let n=e.toLowerCase();return t.some(e=>n.endsWith(e))?[e]:t.map(t=>`${e}${t}`)}async function H(e){try{return await je(e)?(await d(e,process.platform===`win32`?s.F_OK:s.X_OK),!0):!1}catch{return!1}}async function je(e){try{return(await f(e)).isFile()}catch{return!1}}function U(e){if(!Number.isFinite(e))return;let t=Math.floor(e);if(!(t<=0))return t}function Me(e,t){let n=!1,r=()=>{n=!0,W(e,t.detached)};return t.signal?.aborted?r():t.signal?.addEventListener(`abort`,r,{once:!0}),{get didAbort(){return n},dispose:()=>{t.signal?.removeEventListener(`abort`,r)}}}function W(e,t){if(t&&e.pid&&process.platform!==`win32`)try{process.kill(-e.pid,`SIGKILL`);return}catch{}e.kill(`SIGKILL`)}async function Ne(e,t){if(e.stdin){if(t===void 0){e.stdin?.end();return}await l(u.from([t]),e.stdin)}}function Pe(e){return e instanceof Error&&`code`in e&&e.code===`EPIPE`}var Fe=e({androidAdbResultError:()=>q,attachAdbFailureHint:()=>K,classifyAdbFailure:()=>Re,createAndroidPortReverseManager:()=>Ye,createDeviceAdbExecutor:()=>X,createLocalAndroidAdbProvider:()=>We,installAndroidAdbPackage:()=>Ze,pullAndroidAdbFile:()=>Xe,resolveAndroidAdbExecutor:()=>Ge,resolveAndroidAdbProvider:()=>Z,resolveAndroidTextInjector:()=>qe,resolveAndroidTouchProvider:()=>Je,resolveScopedAndroidAdbBackgroundTransport:()=>Ke,withAndroidAdbProvider:()=>Qe});const Ie=[{reason:`device_unauthorized`,pattern:/device unauthorized|device still authorizing/,hint:`USB debugging is not authorized — accept the authorization prompt on the device screen (re-plug the cable if none appears), then retry.`},{reason:`device_offline`,pattern:/device offline/,hint:`The device is connected but offline — wait for it to finish booting or run adb reconnect, then retry.`,retriable:!0},{reason:`multiple_devices`,pattern:/more than one (?:device\/emulator|device and emulator)/,hint:`Multiple Android devices are connected — pass --serial <serial> (see adb devices) to select one.`},{reason:`no_devices`,pattern:/no devices\/emulators found|no devices found/,hint:`No Android devices detected — boot an emulator or connect a device and verify it appears in adb devices.`},{reason:`device_not_found`,pattern:/device (?:'[^']*' )?not found/,hint:`The device disconnected or is restarting — verify it is listed in adb devices, then retry.`,retriable:!0},{reason:`server_version_mismatch`,pattern:/adb server version \(\d+\) doesn't match this client/,hint:`Multiple adb installs conflict — adb restarts its server automatically, so retry; align PATH to a single adb to stop recurrences.`,retriable:!0},{reason:`connection_dropped`,pattern:/transport error|connection reset|broken pipe|protocol fault/,hint:`The adb connection dropped — retry; if it persists, run adb kill-server and reconnect the device.`,retriable:!0},{reason:`install_insufficient_storage`,pattern:/install_failed_insufficient_storage/,hint:`The device is out of storage — free up space or uninstall unused apps, then retry the install.`,matchStdout:!0},{reason:`install_update_incompatible`,pattern:/install_failed_update_incompatible/,hint:`The installed app has an incompatible signature — uninstall the existing app first, then retry the install.`,matchStdout:!0},{reason:`install_version_downgrade`,pattern:/install_failed_version_downgrade/,hint:`The APK is older than the installed app — uninstall the app first (or install with downgrade allowed), then retry.`,matchStdout:!0},{reason:`install_failed`,pattern:/install_failed_\w+|install_parse_failed_\w+/,hint:`The Android package installer rejected the APK — see the INSTALL_FAILED code in the error output for the exact cause.`,matchStdout:!0}],Le=Object.freeze({reason:`timeout`,hint:`adb timed out — the adb server may be wedged. Run adb kill-server && adb start-server, check adb devices, then retry.`});function Re(e,t=``){let n=e.toLowerCase(),r=t.toLowerCase();for(let{pattern:e,matchStdout:t,...i}of Ie)if(e.test(n)||t&&e.test(r))return i}const G=new a;function K(e){if(!(e instanceof n)||e.code!==`COMMAND_FAILED`)return e;let t=ze(e);return t&&(e.details={...e.details,adbFailure:t.reason,...typeof e.details?.hint==`string`?{}:{hint:t.hint},...t.retriable!==void 0&&e.details?.retriable===void 0?{retriable:t.retriable}:{}}),e}function ze(e){return typeof e.details?.timeoutMs==`number`?Le:Re(typeof e.details?.stderr==`string`?e.details.stderr:``,typeof e.details?.stdout==`string`?e.details.stdout:``)}function q(e,t,r){return K(new n(`COMMAND_FAILED`,e,t.exitCode===0?{stdout:t.stdout,stderr:t.stderr,exitCode:t.exitCode,...r}:V(t,r)))}function J(e){return async(...t)=>{try{return await e(...t)}catch(e){throw K(e)}}}const Be=new WeakSet;function Ve(e){if(Be.has(e))return e;let t={...e,exec:J(Y(e.exec)),...e.pull?{pull:J(Y(e.pull))}:{},...e.install?{install:J(Y(e.install))}:{},...e.installBundle?{installBundle:J(e.installBundle)}:{}};return Be.add(t),t}function Y(e){return async(...t)=>O(await e(...t))}function X(e){return He(e.id)}function He(e){return J(async(t,n)=>await T(async()=>await E(`adb`,[`-s`,e,...t],{...n,detached:process.platform!==`win32`})))}function Ue(e){return(t,n)=>{let r=P(`adb`,[`-s`,e,...t],{...n,allowFailure:!0,captureOutput:!1});return r.wait.catch(()=>{}),r.child}}function We(e){let t=X(e);return{exec:t,spawn:Ue(e.id),reverse:nt(t),pull:async(e,n,r)=>await t([`pull`,e,n],r),install:async(e,n)=>{let{installArgs:r,execOptions:i}=at(n);return await t([`install`,...r,e],i)}}}function Ge(e,t){let n=G.getStore();return t||(n?.serial===e.id?n.provider.exec:X(e))}function Z(e,t){if(t)return Q(t);let n=G.getStore();return n?.serial===e.id?Q(n.provider):We(e)}function Ke(e){let t=G.getStore();return t?.serial===e.id?{mode:`transport-composed`,...t.provider.spawn?{spawn:t.provider.spawn}:{}}:{mode:`local`}}function qe(e){let t=G.getStore();return t?.serial===e.id?t.provider.text:void 0}function Je(e){let t=G.getStore();return t?.serial===e.id&&t.provider.touch?t.provider:void 0}function Ye(e){let t=Q(e);if(t.reverse&&tt.has(t.reverse))return t.reverse;let r=t.reverse??nt(t.exec),i=new Map,a={async ensure(e,t){let a=i.get(e.local);if(a&&a.ownerId!==e.ownerId)throw new n(`COMMAND_FAILED`,`Android port reverse ${e.local} is already owned by ${a.ownerId??`another session`}`,{current:a,requested:e});a?.remote!==e.remote&&(await r.ensure(e,t),i.set(e.local,{...e}))},async remove(e,t){if(!i.has(e)){await r.remove(e,t);return}await r.remove(e,t),i.delete(e)},async removeAllOwned(e,t){let n=[...i.values()].filter(t=>t.ownerId===e).map(e=>e.local);if(n.length===0){await r.removeAllOwned(e,t);return}for(let e of n)await r.remove(e,t),i.delete(e)},async list(e){return r.list?await r.list(e):[...i.values()]}};return tt.add(a),a}function Q(e){return Ve(typeof e==`function`?{exec:e}:e)}async function Xe(e,t,r){let{device:i,provider:a,...o}=r??{},s=$(i,a),c=s?.pull;if(c)return await T(async()=>await c(e,t,o));let l=s?.exec;if(!l)throw new n(`COMMAND_FAILED`,`Android adb pull requires an adb provider`);return await T(async()=>await l([`pull`,e,t],o))}async function Ze(e,t){let{device:r,provider:i,...a}=t??{},o=$(r,i),s=o?.install;if(s)return await T(async()=>await s(e,a));let c=o?.exec;if(!c)throw new n(`COMMAND_FAILED`,`Android adb install requires an adb provider`);let{installArgs:l,execOptions:u}=at(a);return await T(async()=>await c([`install`,...l,e],u))}function $(e,t){if(t)return Q(t);if(e)return Z(e);let n=G.getStore();if(n)return Q(n.provider)}async function Qe(e,t,n){if(!e)return await n();let r={provider:Q(e),serial:t.serial},i=$e(r);return await G.run(r,async()=>await ge(i,n))}function $e(e){return(t,n,r)=>{if(t!==`adb`)return;let i=et(n,e.serial);if(i)return T(async()=>await e.provider.exec(i,r))}}function et(e,t){if(!(e[0]!==`-s`||!e[1])&&e[1]===t)return e.slice(2)}const tt=new WeakSet;function nt(e){let t=new Map;return{async ensure(n,r){if(await e([`reverse`,n.local,n.remote],{allowFailure:!1,signal:r?.signal,timeoutMs:r?.timeoutMs}),n.ownerId){let e=t.get(n.ownerId)??new Set;e.add(n.local),t.set(n.ownerId,e)}},async remove(n,r){let i=await e([`reverse`,`--remove`,n],{allowFailure:!0,signal:r?.signal,timeoutMs:r?.timeoutMs});if(i.exitCode!==0&&!it(i.stdout,i.stderr))throw q(`Failed to remove Android port reverse ${n}`,i,{local:n});for(let e of t.values())e.delete(n)},async removeAllOwned(e,n){let r=[...t.get(e)??[]];for(let e of r)await this.remove(e,n);t.delete(e)},async list(n){let r=await e([`reverse`,`--list`],{allowFailure:!0,signal:n?.signal,timeoutMs:n?.timeoutMs});return r.exitCode===0?rt(r.stdout,t):[]}}}function rt(e,t){let n=new Map;for(let[e,r]of t)for(let t of r)n.set(t,e);return e.split(`
4
+ `).map(e=>e.trim().split(/\s+/)).filter(e=>e.length>=3).map(([,e,t])=>{let r=e;return{local:r,remote:t,ownerId:n.get(r)}})}function it(e,t){let n=`${e}\n${t}`.toLowerCase();return n.includes(`listener`)&&n.includes(`not found`)}function at(e){let{replace:t,allowTestPackages:n,allowDowngrade:r,grantPermissions:i,...a}=e??{},o=[];return t&&o.push(`-r`),n&&o.push(`-t`),r&&o.push(`-d`),i&&o.push(`-g`),{installArgs:o,execOptions:a}}export{y as A,_e as C,ue as D,C as E,ie as F,te as I,v as M,ne as N,re as O,_ as P,j as S,le as T,E as _,Xe as a,N as b,qe as c,O as d,V as f,A as g,we as h,Ze as i,ae as j,g as k,Je as l,H as m,q as n,Ge as o,pe as p,Ye as r,Z as s,Fe as t,Qe as u,P as v,T as w,D as x,M as y};