agent-device 0.19.3 → 0.20.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (179) hide show
  1. package/README.md +62 -70
  2. package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.1.apk +0 -0
  3. package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.1.apk.sha256 +1 -0
  4. package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.1.manifest.json +10 -0
  5. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.1.apk +0 -0
  6. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.1.apk.sha256 +1 -0
  7. package/{android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.19.3.manifest.json → android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.1.manifest.json} +6 -6
  8. package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.h +2 -0
  9. package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.m +5 -0
  10. package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.h +5 -10
  11. package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.m +74 -174
  12. package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Alert.swift +113 -19
  13. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+BlockingSystemModalResolution.swift +82 -0
  14. package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +325 -123
  15. package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandJournal.swift +2 -2
  16. package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +149 -105
  17. package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Lifecycle.swift +56 -2
  18. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+LifecycleCacheTests.swift +73 -0
  19. package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +51 -26
  20. package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScrollGesture.swift +2 -2
  21. package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SequenceExecution.swift +2 -107
  22. package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Snapshot.swift +130 -13
  23. package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCapturePlan.swift +51 -8
  24. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotTraversalIdentityTests.swift +24 -0
  25. package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedGesturePolicy.swift +1 -1
  26. package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SystemModal.swift +43 -35
  27. package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +1 -1
  28. package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +16 -1
  29. package/dist/src/agent-browser-tool.js +1 -1
  30. package/dist/src/agent-device-client.js +3 -0
  31. package/dist/src/android-adb.d.ts +1 -1
  32. package/dist/src/android-adb.js +1 -1
  33. package/dist/src/android-input-method-overlays.js +1 -0
  34. package/dist/src/android-input-ownership.js +1 -6
  35. package/dist/src/android-system-chrome.js +1 -0
  36. package/dist/src/android.js +1 -1
  37. package/dist/src/app-lifecycle.js +5 -5
  38. package/dist/src/app-log-request-scope.js +1 -0
  39. package/dist/src/app-resolution.js +1 -0
  40. package/dist/src/apple-multitouch-support.js +1 -0
  41. package/dist/src/apps.js +5 -5
  42. package/dist/src/boot-diagnostics.js +2 -0
  43. package/dist/src/cli-config.js +1 -0
  44. package/dist/src/cli-help.js +131 -40
  45. package/dist/src/cli-runner.js +1 -1
  46. package/dist/src/cli.js +15 -11
  47. package/dist/src/command-metadata.js +1 -1
  48. package/dist/src/command-schema.js +3 -3
  49. package/dist/src/compatibility-policy.js +1 -0
  50. package/dist/src/context.js +1 -0
  51. package/dist/src/contracts.d.ts +2 -2
  52. package/dist/src/debug-symbols.js +1 -1
  53. package/dist/src/device-input-state.js +1 -1
  54. package/dist/src/devices2.js +1 -1
  55. package/dist/src/devices4.js +1 -0
  56. package/dist/src/find.js +1 -1
  57. package/dist/src/finders.js +1 -1
  58. package/dist/src/generic.js +1 -1
  59. package/dist/src/helper.js +1 -1
  60. package/dist/src/index.d.ts +533 -279
  61. package/dist/src/index.js +1 -1
  62. package/dist/src/input-actions.js +4 -3
  63. package/dist/src/install-artifact.js +1 -0
  64. package/dist/src/install-source.d.ts +5 -1
  65. package/dist/src/install-source.js +1 -1
  66. package/dist/src/install-source2.js +1 -1
  67. package/dist/src/interaction-snapshot.js +1 -1
  68. package/dist/src/interaction.d.ts +230 -0
  69. package/dist/src/interaction.js +1 -1
  70. package/dist/src/interactor.js +2 -2
  71. package/dist/src/interactor2.js +1 -0
  72. package/dist/src/internal/bin.js +1 -1
  73. package/dist/src/internal/daemon.js +42 -20
  74. package/dist/src/internal/png-worker.d.ts +22 -0
  75. package/dist/src/internal/png-worker.js +1 -1
  76. package/dist/src/launch-console.js +1 -0
  77. package/dist/src/lease-context.js +1 -0
  78. package/dist/src/lease.js +1 -1
  79. package/dist/src/linux.js +1 -1
  80. package/dist/src/logcat.js +5 -0
  81. package/dist/src/method-scope.js +1 -0
  82. package/dist/src/metro-types.d.ts +52 -0
  83. package/dist/src/metro.d.ts +3 -3
  84. package/dist/src/notifications.js +1 -1
  85. package/dist/src/png-worker-contract.js +1 -1
  86. package/dist/src/process-lock.js +1 -0
  87. package/dist/src/react-native.js +1 -1
  88. package/dist/src/record-trace.js +1 -1
  89. package/dist/src/recording-export-quality.js +15 -0
  90. package/dist/src/register-builtins.js +1 -0
  91. package/dist/src/registry.js +24 -24
  92. package/dist/src/remote-config.d.ts +1 -1
  93. package/dist/src/reporting.js +8 -7
  94. package/dist/src/runner-client.js +1 -1
  95. package/dist/src/runner-disposal.js +2 -0
  96. package/dist/src/runner-lease.js +1 -0
  97. package/dist/src/runner-provider.js +1 -1
  98. package/dist/src/runner-sequence.js +1 -1
  99. package/dist/src/runtime.js +3 -3
  100. package/dist/src/runtime2.js +1 -0
  101. package/dist/src/sdk-android-adb.d.ts +97 -33
  102. package/dist/src/sdk-android-adb.js +4 -4
  103. package/dist/src/sdk-batch-runner.d.ts +2 -1
  104. package/dist/src/sdk-batch-runner.js +3 -2
  105. package/dist/src/sdk-contracts.d.ts +70 -149
  106. package/dist/src/sdk-contracts.js +1 -1
  107. package/dist/src/sdk-device.js +1 -1
  108. package/dist/src/sdk-finders.d.ts +5 -4
  109. package/dist/src/sdk-finders.js +1 -1
  110. package/dist/src/sdk-io.d.ts +1 -1
  111. package/dist/src/sdk-remote-config.d.ts +19 -96
  112. package/dist/src/sdk-remote-config.js +1 -1
  113. package/dist/src/sdk-selectors.js +1 -1
  114. package/dist/src/selector-runtime.js +1 -1
  115. package/dist/src/selector-vocabulary.js +1 -0
  116. package/dist/src/selectors.d.ts +12 -3
  117. package/dist/src/selectors.js +1 -1
  118. package/dist/src/server.js +3 -3
  119. package/dist/src/session-target-evidence.js +1 -0
  120. package/dist/src/session.js +8 -10
  121. package/dist/src/simctl.js +1 -1
  122. package/dist/src/simulator.js +1 -1
  123. package/dist/src/snapshot-diagnostics.js +5 -2
  124. package/dist/src/snapshot-quality.js +1 -1
  125. package/dist/src/snapshot.js +1 -1
  126. package/dist/src/snapshot2.js +1 -2
  127. package/dist/src/tool-provider3.js +1 -0
  128. package/dist/src/unsupported-interactor.js +1 -0
  129. package/dist/src/url.js +1 -1
  130. package/dist/src/web.js +1 -1
  131. package/package.json +34 -27
  132. package/server.json +2 -2
  133. package/skills/agent-device/SKILL.md +5 -3
  134. package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.19.3.apk +0 -0
  135. package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.19.3.apk.sha256 +0 -1
  136. package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.19.3.manifest.json +0 -10
  137. package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.19.3.apk +0 -0
  138. package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.19.3.apk.sha256 +0 -1
  139. package/dist/src/apple-runner-options.js +0 -1
  140. package/dist/src/cli-output.js +0 -1
  141. package/dist/src/client.js +0 -3
  142. package/dist/src/handler-utils.js +0 -1
  143. package/dist/src/output-path.js +0 -1
  144. package/dist/src/points.js +0 -4
  145. package/dist/src/provider.js +0 -1
  146. package/dist/src/providers.js +0 -1
  147. package/dist/src/record-trace-recording.js +0 -23
  148. package/dist/src/recording-provider.js +0 -1
  149. package/dist/src/sdk-batch.js +0 -2
  150. package/dist/src/selectors2.js +0 -1
  151. package/dist/src/ttl-memo.js +0 -1
  152. package/dist/src/tv-remote.js +0 -14
  153. package/dist/src/xml.js +0 -2
  154. /package/{macos-helper → apple/macos-helper}/Package.swift +0 -0
  155. /package/{macos-helper → apple/macos-helper}/Sources/AgentDeviceMacOSHelper/AudioProbe.swift +0 -0
  156. /package/{macos-helper → apple/macos-helper}/Sources/AgentDeviceMacOSHelper/SnapshotTraversal.swift +0 -0
  157. /package/{macos-helper → apple/macos-helper}/Sources/AgentDeviceMacOSHelper/main.swift +0 -0
  158. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +0 -0
  159. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunner.xcodeproj/project.pbxproj +0 -0
  160. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -0
  161. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunner.xcodeproj/xcshareddata/xcschemes/AgentDeviceRunner.xcscheme +0 -0
  162. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/AgentDeviceRunnerUITests-Bridging-Header.h +0 -0
  163. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/AgentDeviceRunnerUITests.entitlements +0 -0
  164. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerObjCExceptionCatcher.h +0 -0
  165. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerObjCExceptionCatcher.m +0 -0
  166. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTapPointPolicy.swift +0 -0
  167. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AXSnapshotFallback.swift +0 -0
  168. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Environment.swift +0 -0
  169. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Exceptions.swift +0 -0
  170. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+FlatSnapshotFiltering.swift +0 -0
  171. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Navigation.swift +0 -0
  172. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScreenRecorder.swift +0 -0
  173. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Transport.swift +0 -0
  174. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TvRemote.swift +0 -0
  175. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests.xctestplan +0 -0
  176. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/RecordingScripts/recording-overlay.swift +0 -0
  177. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/RecordingScripts/recording-resize.swift +0 -0
  178. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/RecordingScripts/recording-trim.swift +0 -0
  179. /package/{src/platforms/linux → linux}/atspi-dump.py +0 -0
@@ -1,25 +1,25 @@
1
- import{_ as e,n as t,t as n}from"./sdk-contracts.js";import{T as r,d as i,o as a,r as o,u as s,v as c,w as ee}from"./sdk-batch.js";import{$t as te,An as ne,Dn as re,Fn as ie,Ft as ae,Gt as oe,Hn as se,Ht as ce,In as le,It as ue,Jt as de,Ln as fe,Lt as pe,Nt as me,Ot as he,Pt as ge,Rt as _e,St as ve,Tt as ye,Ut as be,Vt as xe,Wt as Se,Xn as l,Xt as Ce,Yn as we,an as Te,at as Ee,bn as De,c as Oe,cn as ke,en as Ae,f as je,g as Me,gn as Ne,h as Pe,hn as Fe,in as Ie,it as Le,jt as Re,ln as ze,m as Be,mt as Ve,n as He,o as Ue,on as We,p as Ge,qn as Ke,qt as qe,r as Je,rt as Ye,s as Xe,sn as Ze,t as Qe,tn as $e,u as et,un as tt,vt as nt,xn as rt,yn as it,zt as at}from"./tv-remote.js";import{R as ot,n as st,o as ct,r as lt}from"./sdk-selectors.js";import{_ as ut,a as dt,b as ft,c as pt,f as mt,g as ht,h as gt,i as _t,l as u,m as d,o as vt,p as yt,r as bt,s as xt,v as St}from"./sdk-batch-runner.js";import{a as Ct,o as wt,r as Tt,t as Et,u as Dt}from"./sdk-device.js";import{n as Ot}from"./sdk-finders.js";import{n as kt,t as At}from"./sdk-app-inventory.js";let jt=!1;function Mt(){jt=!0}function Nt(){let e=jt;return jt=!1,e}const Pt=[`ref`,`selector`,`point`];function Ft(e,t=[]){return{type:`object`,properties:{...xn(),...e},...t.length>0?{required:t}:{},additionalProperties:!1}}function It(e){return{type:`object`,description:e,properties:{x:{type:`number`},y:{type:`number`}},required:[`x`,`y`],additionalProperties:!1}}function Lt(e,t){return{type:`string`,enum:e,...t?{description:t}:{}}}function Rt(e){return{type:`string`,...e?{description:e}:{}}}function zt(e){return{type:`number`,...e?{description:e}:{}}}function Bt(e){return{type:`integer`,...e?{description:e}:{}}}function Vt(e){return{type:`boolean`,...e?{description:e}:{}}}function Ht(e){return{type:`array`,items:{type:`string`},...e?{description:e}:{}}}function Ut(e){return{type:`object`,additionalProperties:!0,...e?{description:e}:{}}}function f(e){return{...e,required:!0}}function p(e){return T(Rt(e),b)}function m(e){return T(zt(e),sn)}function h(e,t={}){return T(gn(e,t),(e,n)=>S(e,n,t))}function g(e){return T(Vt(e),cn)}function _(e,t){return T(Lt(e,t),(t,n)=>un(t,n,e))}function Wt(e){return T(Ut(e),yn)}function Gt(e){return T(Ht(e),bn)}function v(e){return T(e,(e,t)=>e[t])}function Kt(e,t){return T(e,t)}function qt(){return T(Sn(),(e,t)=>e[t]===void 0?void 0:rn(e,t))}function Jt(){return T(Cn(),(e,t)=>e[t]===void 0?void 0:an(e,t))}function Yt(e){return T(It(e),(e,t)=>e[t]===void 0?void 0:y(e,t))}function Xt(){return{depth:h(`Snapshot traversal depth.`,{min:0}),scope:p(`Snapshot scope selector used before resolution.`),raw:g(`Use raw snapshot data during selector resolution.`)}}function Zt(){return{count:h(`Number of press/click repetitions.`,{min:1}),intervalMs:h(`Delay between repeated press/click actions.`,{min:0}),holdMs:h(`Hold duration for each action.`,{min:0}),jitterPx:h(`Randomization radius in pixels.`,{min:0}),doubleTap:g(`Request a double-tap action.`)}}function Qt(e){return Ft(_n(e),vn(e))}function $t(t,n){let r=en(t),i=Object.fromEntries(Object.entries(n).flatMap(([t,n])=>{let i=n.read(r,t);if(n.required&&i===void 0)throw new e(`INVALID_ARGS`,`Expected ${t} to be set.`);return i===void 0?[]:[[t,i]]})),a=tn(r,{readTargetAlias:!Object.hasOwn(n,`target`)});return w({...a,...C(a),...i})}function en(t){if(t==null)return{};if(!t||typeof t!=`object`||Array.isArray(t))throw new e(`INVALID_ARGS`,`Expected object arguments.`);return t}function tn(e,t={}){return{session:b(e,`session`),platform:un(e,`platform`,Tt),deviceTarget:nn(e,t),device:b(e,`device`),udid:b(e,`udid`),serial:b(e,`serial`),iosSimulatorDeviceSet:b(e,`iosSimulatorDeviceSet`),iosXctestrunFile:b(e,`iosXctestrunFile`),iosXctestDerivedDataPath:b(e,`iosXctestDerivedDataPath`),iosXctestEnvDir:b(e,`iosXctestEnvDir`),androidDeviceAllowlist:b(e,`androidDeviceAllowlist`),daemonBaseUrl:b(e,`daemonBaseUrl`),daemonAuthToken:b(e,`daemonAuthToken`),tenant:b(e,`tenant`),runId:b(e,`runId`),leaseId:b(e,`leaseId`),cwd:b(e,`cwd`),debug:cn(e,`debug`)}}function nn(t,n){let r=un(t,`deviceTarget`,Et);if(n.readTargetAlias===!1||t.target===void 0)return r;let i=un(t,`target`,Et);if(r!==void 0&&i!==r)throw new e(`INVALID_ARGS`,`Expected target alias to match deviceTarget when both are set.`);return r??i}function rn(e,t){let n=Tn(e,t),r=ln(n,`kind`,Pt);switch(r){case`ref`:return{kind:r,ref:on(n,`ref`),label:b(n,`label`)};case`selector`:return{kind:r,selector:on(n,`selector`)};case`point`:return{kind:r,x:x(n,`x`),y:x(n,`y`)}}}function an(e,t){let n=Tn(e,t),r=ln(n,`kind`,[`ref`,`selector`]);return r===`ref`?{kind:r,ref:on(n,`ref`),label:b(n,`label`)}:{kind:r,selector:on(n,`selector`)}}function y(e,t){let n=Tn(e,t);return{x:x(n,`x`),y:x(n,`y`)}}function on(t,n){let r=t[n];if(typeof r!=`string`||r.length===0)throw new e(`INVALID_ARGS`,`Expected ${n} to be a non-empty string.`);return r}function b(t,n){let r=t[n];if(r!==void 0){if(typeof r!=`string`||r.length===0)throw new e(`INVALID_ARGS`,`Expected ${n} to be a non-empty string.`);return r}}function x(t,n){let r=t[n];if(typeof r!=`number`||!Number.isFinite(r))throw new e(`INVALID_ARGS`,`Expected ${n} to be a finite number.`);return r}function sn(t,n){let r=t[n];if(r!==void 0){if(typeof r!=`number`||!Number.isFinite(r))throw new e(`INVALID_ARGS`,`Expected ${n} to be a finite number.`);return r}}function S(t,n,r={}){let i=t[n];if(i===void 0)return;if(!Number.isInteger(i))throw new e(`INVALID_ARGS`,`Expected ${n} to be an integer.`);let a=i;if(r.min!==void 0&&a<r.min)throw new e(`INVALID_ARGS`,`Expected ${n} to be at least ${r.min}.`);if(r.max!==void 0&&a>r.max)throw new e(`INVALID_ARGS`,`Expected ${n} to be at most ${r.max}.`);return a}function cn(t,n){let r=t[n];if(r!==void 0){if(typeof r!=`boolean`)throw new e(`INVALID_ARGS`,`Expected ${n} to be a boolean.`);return r}}function ln(t,n,r){let i=t[n];if(typeof i!=`string`||!r.includes(i))throw new e(`INVALID_ARGS`,`Expected ${n} to be one of: ${r.join(`, `)}.`);return i}function un(t,n,r){let i=t[n];if(i!==void 0){if(typeof i!=`string`||!r.includes(i))throw new e(`INVALID_ARGS`,`Expected ${n} to be one of: ${r.join(`, `)}.`);return i}}function C(e){return w({session:e.session,platform:e.platform,target:e.deviceTarget,device:e.device,udid:e.udid,serial:e.serial,iosSimulatorDeviceSet:e.iosSimulatorDeviceSet,iosXctestrunFile:e.iosXctestrunFile,iosXctestDerivedDataPath:e.iosXctestDerivedDataPath,iosXctestEnvDir:e.iosXctestEnvDir,androidDeviceAllowlist:e.androidDeviceAllowlist,daemonBaseUrl:e.daemonBaseUrl,daemonAuthToken:e.daemonAuthToken,tenant:e.tenant,runId:e.runId,leaseId:e.leaseId,cwd:e.cwd,debug:e.debug})}function dn(e){switch(e.kind){case`ref`:return{ref:e.ref,label:e.label};case`selector`:return{selector:e.selector};case`point`:return{x:e.x,y:e.y}}}function fn(e){switch(e.kind){case`ref`:return{ref:e.ref,label:e.label};case`selector`:return{selector:e.selector}}}function pn(e){return{count:e.count,intervalMs:e.intervalMs,holdMs:e.holdMs,jitterPx:e.jitterPx,doubleTap:e.doubleTap}}function mn(e){return{depth:e.depth,scope:e.scope,raw:e.raw}}function hn(t,n,r){let i=new Set(n),a=Object.keys(t).filter(e=>!i.has(e));if(a.length>0)throw new e(`INVALID_ARGS`,`${r} has unknown field(s): ${a.join(`, `)}.`)}function w(e){return Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0))}function T(e,t){return{schema:e,required:!1,read:t}}function gn(e,t){return{...Bt(e),...t.min===void 0?{}:{minimum:t.min},...t.max===void 0?{}:{maximum:t.max}}}function _n(e){return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,t.schema]))}function vn(e){return Object.entries(e).flatMap(([e,t])=>t.required?[e]:[])}function yn(t,n){let r=t[n];if(r!==void 0){if(!r||typeof r!=`object`||Array.isArray(r))throw new e(`INVALID_ARGS`,`Expected ${n} to be an object.`);return r}}function bn(t,n){let r=t[n];if(r!==void 0){if(!Array.isArray(r)||r.some(e=>typeof e!=`string`))throw new e(`INVALID_ARGS`,`Expected ${n} to be an array of strings.`);return r}}function xn(){return{session:{type:`string`,description:`Agent-device session name.`},platform:{type:`string`,enum:Tt,description:`Platform selector used to resolve a device.`},deviceTarget:{type:`string`,enum:Et,description:`Device target form. Maps to the CLI --target flag.`},target:{type:`string`,enum:Et,description:`Alias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.`},device:{type:`string`,description:`Device name selector.`},udid:{type:`string`,description:`iOS device UDID selector.`},serial:{type:`string`,description:`Android serial selector.`},iosSimulatorDeviceSet:{type:`string`,description:`iOS simulator device-set path used for device resolution.`},iosXctestrunFile:{type:`string`,description:`Externally built iOS XCTest runner .xctestrun artifact path.`},iosXctestDerivedDataPath:{type:`string`,description:`Derived data path for external iOS XCTest runner execution.`},iosXctestEnvDir:{type:`string`,description:`Writable directory for iOS XCTest runner env overlays.`},androidDeviceAllowlist:{type:`string`,description:`Android serial allowlist used for device resolution.`},daemonBaseUrl:{type:`string`,description:`Remote daemon base URL.`},daemonAuthToken:{type:`string`,description:`Remote daemon auth token.`},tenant:{type:`string`,description:`Remote tenant identifier.`},runId:{type:`string`,description:`Lease run identifier.`},leaseId:{type:`string`,description:`Existing lease identifier.`},cwd:{type:`string`,description:`Working directory for command execution.`},debug:{type:`boolean`,description:`Enable debug diagnostics.`}}}function Sn(){return{oneOf:[...wn(),{type:`object`,properties:{kind:{type:`string`,const:`point`},x:{type:`number`},y:{type:`number`}},required:[`kind`,`x`,`y`],additionalProperties:!1}],description:`UI target. This is separate from deviceTarget, which selects the device form.`}}function Cn(){return{oneOf:wn(),description:`UI element target by snapshot ref or selector expression.`}}function wn(){return[{type:`object`,properties:{kind:{type:`string`,const:`ref`},ref:{type:`string`,description:`Snapshot element ref such as @e12.`},label:{type:`string`,description:`Optional human label for the ref.`}},required:[`kind`,`ref`],additionalProperties:!1},{type:`object`,properties:{kind:{type:`string`,const:`selector`},selector:{type:`string`,description:`Agent-device selector expression.`}},required:[`kind`,`selector`],additionalProperties:!1}]}function Tn(t,n){let r=t[n];if(!r||typeof r!=`object`||Array.isArray(r))throw new e(`INVALID_ARGS`,`Expected ${n} to be an object.`);return r}function E(e,t){return n=>D(e,t?t(n):[],n)}function D(e,t,n){return{command:e,positionals:t,options:En(n)}}function En(e){let t=Dn(e.deviceTarget??e.target);if(t===void 0&&e.target===void 0)return e;let{target:n,...r}=e;return t===void 0?r:{...r,target:t}}function Dn(e){return e===`mobile`||e===`tv`||e===`desktop`?e:void 0}function O(e){return w({session:e.session,platform:e.platform,deviceTarget:e.target,device:e.device,udid:e.udid,serial:e.serial,iosSimulatorDeviceSet:e.iosSimulatorDeviceSet,iosXctestrunFile:e.iosXctestrunFile,iosXctestDerivedDataPath:e.iosXctestDerivedDataPath,iosXctestEnvDir:e.iosXctestEnvDir,androidDeviceAllowlist:e.androidDeviceAllowlist})}function On(e){return{platform:e.platform,target:e.target,device:e.device,udid:e.udid,serial:e.serial,iosSimulatorDeviceSet:e.iosSimulatorDeviceSet,androidDeviceAllowlist:e.androidDeviceAllowlist}}function kn(e){return w({depth:e.snapshotDepth,scope:e.snapshotScope,raw:e.snapshotRaw})}function An(e){return{depth:e.snapshotDepth,scope:e.snapshotScope,raw:e.snapshotRaw}}function jn(e){return w({settle:e.settle,settleQuietMs:e.settleQuietMs,timeoutMs:e.timeoutMs})}function Mn(e){return w({count:e.count,intervalMs:e.intervalMs,holdMs:e.holdMs,jitterPx:e.jitterPx,doubleTap:e.doubleTap})}function Nn(e){if(`ref`in e&&e.ref!==void 0)return w({kind:`ref`,ref:e.ref,label:e.label});if(`selector`in e&&e.selector!==void 0)return{kind:`selector`,selector:e.selector};let t=e;return{kind:`point`,x:t.x,y:t.y}}function Pn(t){let n=In(t);if(typeof n.ref==`string`)return[n.ref,...Rn(n.label)];if(typeof n.selector==`string`)return[n.selector];if(n.kind===`point`||n.x!==void 0||n.y!==void 0)return[String(Ln(n.x,`x`)),String(Ln(n.y,`y`))];throw new e(`INVALID_ARGS`,`interaction requires @ref, selector, or point target`)}function Fn(t){let n=In(t);if(typeof n.ref==`string`)return[n.ref,...Rn(n.label)];if(typeof n.selector==`string`)return[n.selector];throw new e(`INVALID_ARGS`,`element command requires @ref or selector target`)}function In(t){if(!t||typeof t!=`object`||Array.isArray(t))throw new e(`INVALID_ARGS`,`Expected target object.`);let n=t,r=n.target;return r&&typeof r==`object`&&!Array.isArray(r)?r:n}function Ln(t,n){if(typeof t!=`number`||!Number.isFinite(t))throw new e(`INVALID_ARGS`,`point target requires numeric ${n}.`);return t}function Rn(e){return typeof e==`string`&&e.length>0?[e]:[]}function zn(t){if(t[0]?.startsWith(`@`))return{ref:t[0],label:Un(t.slice(1))};let n=t.join(` `).trim();if(!n)throw new e(`INVALID_ARGS`,`get requires @ref or selector expression`);return{selector:n}}function Bn(t){if(t===`text`||t===`attrs`)return t;throw new e(`INVALID_ARGS`,`get only supports text or attrs`)}function Vn(t,n={}){let r=ee(t,n);if(!r)throw new e(`INVALID_ARGS`,`is requires a selector expression`);return r}function Hn(t,n){try{let e=JSON.parse(t);if(e&&typeof e==`object`&&!Array.isArray(e))return e}catch{}throw new e(`INVALID_ARGS`,`${n} must be a JSON object`)}function Un(e){return e.join(` `).trim()||void 0}function k(...e){return new Set(e)}function A(e,t){return e!==void 0&&t.has(e)}function Wn(e){return e===void 0||e.trim()===``?!1:Number.isFinite(Number(e))}function Gn(t,n){if(t===void 0)return;let r=Number(t);if(Number.isFinite(r))return r;throw new e(`INVALID_ARGS`,`${n} must be a finite number.`)}function j(e){return e===void 0?void 0:Number(e)}function M(e){return e===void 0?[]:[e]}function N(e){return e===void 0?[]:[String(e)]}function P(t,n){if(t===void 0||t===``)throw new e(`INVALID_ARGS`,n);return t}function F(t,n){if(typeof t!=`string`||t.length===0)throw new e(`INVALID_ARGS`,n);return t}function I(e){return e}function L(e){let t={},n={},r={},i={},a={};for(let o of e.commands){if(o.cliSchema&&Kn(t,`CLI schema`,o.name,o.cliSchema),o.clientMethod&&Kn(n,`client command method`,o.clientMethod,o.name),Kn(r,`CLI reader`,o.name,o.cliReader),o.daemonWriter&&Kn(i,`daemon writer`,o.name,o.daemonWriter),o.extraDaemonWriters)for(let[e,t]of Object.entries(o.extraDaemonWriters))Kn(i,`daemon writer`,e,t);o.cliOutputFormatter&&Kn(a,`CLI output formatter`,o.name,o.cliOutputFormatter)}return{name:e.name,clientSurface:e.clientSurface,metadata:e.commands.map(e=>e.metadata),definitions:e.commands.map(e=>e.definition),clientCommandMethods:n,cliSchemas:t,cliReaders:r,daemonWriters:i,cliOutputFormatters:a}}function Kn(e,t,n,r){if(Object.hasOwn(e,n))throw Error(`Duplicate command family ${t}: ${n}`);e[n]=r}function qn(e){return e}function R(e,t){return{...e,run:t,invoke:async(n,r)=>await t(n,e.readInput(r))}}function z(e){return({result:t})=>e(t)}const B=z(V);function V(e){return{data:e,text:rt(e)}}function Jn(e){let t=[`Batch completed: ${e.executed}/${e.total} steps in ${e.totalDurationMs}ms`];for(let n of e.results)t.push(Xn(n));return{data:e,text:t.join(`
2
- `)}}const Yn={batch:z(Jn)};function Xn(e){let t=rt(e.data)??e.command;return`${e.step}. OK ${t} (${e.durationMs}ms)`}function Zn(e=o){let t=Qn(e);return qn({name:`batch`,description:`Run multiple structured command steps in one daemon request.`,inputSchema:Qt(t),readInput:e=>er(e,t)})}function Qn(e){return{steps:f(Kt({type:`array`,description:`Structured batch steps. Each step uses a command name and the same input object as that command tool.`,items:$n(e)},(t,n)=>tr(t[n],e))),onError:_([`stop`],`Batch failure policy.`),maxSteps:h(`Maximum number of steps accepted for this batch.`,{min:1,max:1e3}),out:p(`Optional output path for command artifacts.`)}}function $n(e){return{type:`object`,properties:{command:{type:`string`,enum:e,description:`Command name to run with structured input.`},input:{type:`object`,additionalProperties:!0,description:`Structured command input for the nested command. Use the matching MCP tool schema for this object.`},runtime:{type:`object`,additionalProperties:!0,description:`Optional per-step runtime payload.`}},required:[`command`,`input`],additionalProperties:!1}}function er(t,n){let r=$t(t,n),i=r.maxSteps??100;if(!_t(i))throw new e(`INVALID_ARGS`,`Invalid batch maxSteps: ${String(r.maxSteps)}`);return bt(r.steps.length,i),{...r}}function tr(t,n){if(!Array.isArray(t))throw new e(`INVALID_ARGS`,`Expected steps to be an array.`);return t.map((e,t)=>nr(e,t+1,n))}function nr(e,t,n){let r=xt(e,t);return hn(r,[`command`,`input`,`runtime`],`Batch step ${t}`),{command:rr(r,t,n),input:vt(r,t),...ir(r,t)}}function rr(t,n,r){if(r===o)return a(t.command,n);let i=t.command;if(typeof i!=`string`||!r.includes(i))throw new e(`INVALID_ARGS`,`Expected command to be one of: ${r.join(`, `)}.`);return i}function ir(e,t){let n=dt(e.runtime,t);return n===void 0?{}:{runtime:n}}function ar(e,t){let n=d(e,`bundleId`),r=d(e,`package`);return{app:St(e,`app`),appPath:St(e,`appPath`),platform:ut(e,`platform`),appId:n??r,bundleId:n,package:r,identifiers:Ae({session:t,bundleId:n,packageName:r})}}function or(t,n){let r=d(t,`bundleId`),i=d(t,`packageName`),a=r??i??d(t,`appId`),o=d(t,`launchTarget`)??i??r??a;if(!o)throw new e(`COMMAND_FAILED`,`Daemon response is missing "launchTarget".`,{response:t});return{appName:d(t,`appName`),appId:a,bundleId:r,packageName:i,launchTarget:o,installablePath:d(t,`installablePath`),archivePath:d(t,`archivePath`),materializationId:d(t,`materializationId`),materializationExpiresAt:d(t,`materializationExpiresAt`),identifiers:Ae({session:n,bundleId:r,packageName:i,appId:a})}}function sr(e){return{released:e.released===!0,materializationId:St(e,`materializationId`),identifiers:{}}}function cr(e){let{record:t,platform:n,id:r,name:i,target:a}=dr(e,`name`),o=ur(t);return{platform:n,target:a,kind:gt(t,`kind`),id:r,name:i,booted:typeof t.booted==`boolean`?t.booted:void 0,...wt(n)&&o?{appleOs:o}:{},identifiers:$e(n,r,i),...fr(n,r)}}function lr(e){let{record:t,platform:n,id:r,name:i,target:a}=dr(e,`name`),o=St(t,`device`),s=ur(t),c={session:i,...$e(n,r,o)};return{name:i,createdAt:ht(t,`createdAt`),sessionStateDir:d(t,`sessionStateDir`),runnerLogPath:d(t,`runnerLogPath`),device:{platform:n,target:a,id:r,name:o,...s?{appleOs:s}:{},identifiers:c,...fr(n,r,yt(t,`ios_simulator_device_set`))},identifiers:c}}function ur(e){let t=e.appleOs;return Ct(t)?t:void 0}function dr(e,t){let n=pt(e);return{record:n,platform:ut(n,`platform`),id:St(n,`id`),name:St(n,t),target:mt(n,`target`)}}function fr(e,t,n){return{ios:e===`ios`?{udid:t,...n===void 0?{}:{simulatorSetPath:n}}:void 0,android:e===`android`?{serial:t}:void 0}}function pr(e){if(!u(e))return;let t=e.platform,n=d(e,`metroHost`),r=typeof e.metroPort==`number`?e.metroPort:void 0,i=d(e,`bundleUrl`),a=d(e,`launchUrl`);return{platform:t===`ios`||t===`android`?t:void 0,metroHost:n,metroPort:r,bundleUrl:i,launchUrl:a}}function mr(e){let t=e.platform,n=d(e,`id`),r=d(e,`device`);if(!(!Dt(t)||!n||!r))return{platform:t,target:mt(e,`target`),id:n,name:r,identifiers:$e(t,n,r),ios:t===`ios`?{udid:d(e,`device_udid`)??n,simulatorSetPath:yt(e,`ios_simulator_device_set`)}:void 0,android:t===`android`?{serial:d(e,`serial`)??n}:void 0}}function hr(e){if(u(e)&&!(typeof e.durationMs!=`number`||typeof e.measuredAt!=`string`||typeof e.method!=`string`))return{durationMs:e.durationMs,measuredAt:e.measuredAt,method:e.method,appTarget:d(e,`appTarget`),appBundleId:d(e,`appBundleId`)}}function gr(e){if(!u(e)||typeof e.success!=`boolean`||typeof e.exitCode!=`number`||typeof e.stdout!=`string`||typeof e.stderr!=`string`)return;let t=_r(e.error);return{success:e.success,exitCode:e.exitCode,stdout:e.stdout,stderr:e.stderr,...t?{error:t}:{}}}function _r(e){if(u(e)&&!(typeof e.code!=`string`||typeof e.message!=`string`))return{code:e.code,message:e.message,...typeof e.hint==`string`?{hint:e.hint}:{},...typeof e.diagnosticId==`string`?{diagnosticId:e.diagnosticId}:{},...typeof e.logPath==`string`?{logPath:e.logPath}:{},...u(e.details)?{details:e.details}:{}}}function vr(e){return Array.isArray(e)?e:[]}function yr(e){let t=re(e);return ft({stateDir:e.stateDir,daemonBaseUrl:e.daemonBaseUrl,daemonAuthToken:e.daemonAuthToken,daemonTransport:e.daemonTransport,daemonServerMode:e.daemonServerMode,...ne(t),provider:e.provider,providerSessionId:e.providerSessionId,providerApp:e.providerApp,providerOsVersion:e.providerOsVersion,providerProject:e.providerProject,providerBuild:e.providerBuild,providerSessionName:e.providerSessionName,awsProjectArn:e.awsProjectArn,awsDeviceArn:e.awsDeviceArn,awsAppArn:e.awsAppArn,awsRegion:e.awsRegion,awsInteractionMode:e.awsInteractionMode,sessionIsolation:e.sessionIsolation,platform:e.platform,target:e.target,device:e.device,udid:e.udid,serial:e.serial,iosSimulatorDeviceSet:e.iosSimulatorDeviceSet,iosXctestrunFile:e.iosXctestrunFile,iosXctestDerivedDataPath:e.iosXctestDerivedDataPath,iosXctestEnvDir:e.iosXctestEnvDir,androidDeviceAllowlist:e.androidDeviceAllowlist,surface:e.surface,activity:e.activity,launchConsole:e.launchConsole,launchArgs:e.launchArgs,relaunch:e.relaunch,shutdown:e.shutdown,saveScript:e.saveScript,deviceHub:e.deviceHub,noRecord:e.noRecord,backMode:e.backMode,metroHost:e.metroHost,metroPort:e.metroPort,bundleUrl:e.bundleUrl,launchUrl:e.launchUrl,snapshotInteractiveOnly:e.interactiveOnly,snapshotDepth:e.depth,snapshotScope:e.scope,snapshotRaw:e.raw,snapshotForceFull:e.forceFull,...it(e),appsFilter:e.appsFilter,kind:e.kind,out:e.out,count:e.count,fps:e.fps,screenshotMaxSize:e.maxSize,quality:e.quality,hideTouches:e.hideTouches,recordingScope:e.recordingScope,intervalMs:e.intervalMs,delayMs:e.delayMs,durationMs:e.durationMs,holdMs:e.holdMs,jitterPx:e.jitterPx,pixels:e.pixels,doubleTap:e.doubleTap,verify:e.verify,settle:e.settle,settleQuietMs:e.settleQuietMs,clickButton:e.clickButton,pauseMs:e.pauseMs,pattern:e.pattern,headless:e.headless,restart:e.restart,replayUpdate:e.replayUpdate,replayBackend:e.replayBackend,replayEnv:e.replayEnv,replayShellEnv:e.replayShellEnv,failFast:e.failFast,timeoutMs:e.timeoutMs,retries:e.retries,recordVideo:e.recordVideo,artifactsDir:e.artifactsDir,shardAll:e.shardAll,shardSplit:e.shardSplit,findFirst:e.findFirst,findLast:e.findLast,networkInclude:e.networkInclude,batchOnError:e.batchOnError,batchMaxSteps:e.batchMaxSteps,batchSteps:e.batchSteps,verbose:e.debug})}function br(e){let t=re(e);return ft({requestId:e.requestId,cwd:e.cwd,sessionExplicit:e.session!==void 0,debug:e.debug,includeCost:e.cost,responseLevel:e.responseLevel,lockPolicy:e.lockPolicy,lockPlatform:e.lockPlatform,...ie(t),sessionIsolation:e.sessionIsolation,installSource:e.installSource,retainMaterializedPaths:e.retainMaterializedPaths,materializedPathRetentionMs:e.materializedPathRetentionMs,materializationId:e.materializationId})}function xr(e){return e??`default`}function H(...e){return e}const Sr=H(`snapshotInteractiveOnly`,`snapshotDepth`,`snapshotScope`,`snapshotRaw`),U=H(`snapshotDepth`,`snapshotScope`,`snapshotRaw`),Cr=H(`metroProjectRoot`,`kind`,`metroKind`,`metroPublicBaseUrl`,`metroProxyBaseUrl`,`metroBearerToken`,`metroPreparePort`,`metroListenHost`,`metroStatusHost`,`metroStartupTimeoutMs`,`metroProbeTimeoutMs`,`metroRuntimeFile`,`metroNoReuseExisting`,`metroNoInstallDeps`),wr=H(`metroHost`,`metroPort`,`bundleUrl`),Tr=H(`count`,`intervalMs`,`holdMs`,`jitterPx`,`doubleTap`),Er=H(`settle`,`settleQuietMs`,`timeoutMs`),Dr=H(`replayUpdate`,`replayEnv`),Or=[{key:`config`,names:[`--config`],type:`string`,usageLabel:`--config <path>`,usageDescription:`Load CLI defaults from a specific config file`},{key:`remoteConfig`,names:[`--remote-config`],type:`string`,usageLabel:`--remote-config <path>`,usageDescription:`Load remote host + Metro workflow settings from a specific profile file`},{key:`stateDir`,names:[`--state-dir`],type:`string`,usageLabel:`--state-dir <path>`,usageDescription:`Daemon state directory (defaults to ~/.agent-device for packages, or a worktree-scoped dev dir from source)`},{key:`daemonBaseUrl`,names:[`--daemon-base-url`],type:`string`,usageLabel:`--daemon-base-url <url>`,usageDescription:`Explicit remote HTTP daemon base URL (skip local daemon discovery/startup)`},{key:`daemonAuthToken`,names:[`--daemon-auth-token`],type:`string`,usageLabel:`--daemon-auth-token <token>`,usageDescription:`Remote HTTP daemon or proxy auth token (sent as request token and bearer header)`},{key:`daemonTransport`,names:[`--daemon-transport`],type:`enum`,enumValues:[`auto`,`socket`,`http`],usageLabel:`--daemon-transport auto|socket|http`,usageDescription:`Daemon client transport preference`},{key:`daemonServerMode`,names:[`--daemon-server-mode`],type:`enum`,enumValues:[`socket`,`http`,`dual`],usageLabel:`--daemon-server-mode socket|http|dual`,usageDescription:`Daemon server mode used when spawning daemon`},{key:`proxyHost`,names:[`--host`],type:`string`,usageLabel:`--host <host>`,usageDescription:`Proxy: host interface to bind (default: 127.0.0.1)`},{key:`proxyPort`,names:[`--port`],type:`int`,min:1,max:65535,usageLabel:`--port <port>`,usageDescription:`Proxy: TCP port to bind (default: 0, choose a free port)`},{key:`tenant`,names:[`--tenant`],type:`string`,usageLabel:`--tenant <id>`,usageDescription:`Tenant scope identifier for isolated daemon sessions`},{key:`sessionIsolation`,names:[`--session-isolation`],type:`enum`,enumValues:[`none`,`tenant`],usageLabel:`--session-isolation none|tenant`,usageDescription:`Session isolation strategy (tenant prefixes session namespace)`},{key:`runId`,names:[`--run-id`],type:`string`,usageLabel:`--run-id <id>`,usageDescription:`Run identifier used for tenant lease admission checks`},{key:`leaseId`,names:[`--lease-id`],type:`string`,usageLabel:`--lease-id <id>`,usageDescription:`Lease identifier bound to tenant/run admission scope`},{key:`leaseBackend`,names:[`--lease-backend`],type:`enum`,enumValues:[`ios-simulator`,`ios-instance`,`android-instance`],usageLabel:`--lease-backend ios-simulator|ios-instance|android-instance`,usageDescription:`Lease backend for remote tenant connection admission`},{key:`provider`,names:[`--provider`],type:`string`,usageLabel:`--provider <name>`,usageDescription:`Cloud provider name for provider-scoped commands`},{key:`providerSessionId`,names:[`--provider-session`],type:`string`,usageLabel:`--provider-session <id>`,usageDescription:`Cloud provider session id or ARN`},{key:`providerApp`,names:[`--provider-app`],type:`string`,usageLabel:`--provider-app <ref-or-path>`,usageDescription:`Cloud provider app reference or local app path used when creating hosted WebDriver sessions`},{key:`providerOsVersion`,names:[`--provider-os-version`,`--os-version`],type:`string`,usageLabel:`--provider-os-version <version>`,usageDescription:`Hosted cloud provider OS version, for example 17 or 14.0`},{key:`providerProject`,names:[`--provider-project`],type:`string`,usageLabel:`--provider-project <name>`,usageDescription:`Hosted cloud provider project label`},{key:`providerBuild`,names:[`--provider-build`],type:`string`,usageLabel:`--provider-build <name>`,usageDescription:`Hosted cloud provider build label`},{key:`providerSessionName`,names:[`--provider-session-name`],type:`string`,usageLabel:`--provider-session-name <name>`,usageDescription:`Hosted cloud provider session label`},{key:`awsProjectArn`,names:[`--aws-project-arn`],type:`string`,usageLabel:`--aws-project-arn <arn>`,usageDescription:`AWS Device Farm project ARN for hosted WebDriver sessions`},{key:`awsDeviceArn`,names:[`--aws-device-arn`],type:`string`,usageLabel:`--aws-device-arn <arn>`,usageDescription:`AWS Device Farm device ARN for hosted WebDriver sessions`},{key:`awsAppArn`,names:[`--aws-app-arn`],type:`string`,usageLabel:`--aws-app-arn <arn>`,usageDescription:`AWS Device Farm app ARN attached to hosted remote access sessions`},{key:`awsRegion`,names:[`--aws-region`],type:`string`,usageLabel:`--aws-region <region>`,usageDescription:`AWS region for Device Farm API calls`},{key:`awsInteractionMode`,names:[`--aws-interaction-mode`],type:`enum`,enumValues:[`INTERACTIVE`,`NO_VIDEO`,`VIDEO_ONLY`],usageLabel:`--aws-interaction-mode INTERACTIVE|NO_VIDEO|VIDEO_ONLY`,usageDescription:`AWS Device Farm remote access interaction mode`},{key:`force`,names:[`--force`],type:`boolean`,usageLabel:`--force`,usageDescription:`Force connection state replacement when reconnecting`},{key:`noLogin`,names:[`--no-login`],type:`boolean`,usageLabel:`--no-login`,usageDescription:`Connect: fail instead of starting implicit cloud login`},{key:`sessionLock`,names:[`--session-lock`],type:`enum`,enumValues:[`reject`,`strip`],usageLabel:`--session-lock reject|strip`,usageDescription:`Lock bound-session device routing for this CLI invocation and nested batch steps`},{key:`sessionLocked`,names:[`--session-locked`],type:`boolean`,usageLabel:`--session-locked`,usageDescription:`Deprecated alias for --session-lock reject`},{key:`sessionLockConflicts`,names:[`--session-lock-conflicts`],type:`enum`,enumValues:[`reject`,`strip`],usageLabel:`--session-lock-conflicts reject|strip`,usageDescription:`Deprecated alias for --session-lock`},{key:`platform`,names:[`--platform`],type:`enum`,enumValues:Tt,usageLabel:`--platform ${Tt.join(`|`)}`,usageDescription:"Platform to target (`apple` aliases the Apple automation backend)"},{key:`target`,names:[`--target`],type:`enum`,enumValues:[`mobile`,`tv`,`desktop`],usageLabel:`--target mobile|tv|desktop`,usageDescription:`Device target class to match`},{key:`device`,names:[`--device`],type:`string`,usageLabel:`--device <name>`,usageDescription:`Device name to target`},{key:`udid`,names:[`--udid`],type:`string`,usageLabel:`--udid <udid>`,usageDescription:`iOS device UDID`},{key:`serial`,names:[`--serial`],type:`string`,usageLabel:`--serial <serial>`,usageDescription:`Android device serial`},{key:`surface`,names:[`--surface`],type:`enum`,enumValues:Ce,usageLabel:`--surface app|frontmost-app|desktop|menubar`,usageDescription:`macOS session surface for open (defaults to app)`},{key:`headless`,names:[`--headless`],type:`boolean`,usageLabel:`--headless`,usageDescription:`Boot: launch Android emulator without a GUI window`},{key:`targetApp`,names:[`--app`,`--target-app`],type:`string`,usageLabel:`--app <id-or-name>`,usageDescription:`Doctor: verify an installed target app without opening a session`},{key:`metroHost`,names:[`--metro-host`],type:`string`,usageLabel:`--metro-host <host>`,usageDescription:`Session-scoped Metro/debug host hint`},{key:`metroPort`,names:[`--metro-port`],type:`int`,min:1,max:65535,usageLabel:`--metro-port <port>`,usageDescription:`Session-scoped Metro/debug port hint`},{key:`metroProjectRoot`,names:[`--project-root`],type:`string`,usageLabel:`--project-root <path>`,usageDescription:`metro prepare: React Native project root (default: cwd)`},{key:`kind`,names:[`--kind`],type:`enum`,enumValues:[`auto`,`react-native`,`expo`,`repack`,...at],usageLabel:`--kind <kind>`,usageDescription:`Kind selector for commands that support it, such as metro prepare or perf artifact collectors`},{key:`perfTemplate`,names:[`--template`],type:`string`,usageLabel:`--template <name>`,usageDescription:`Perf xctrace template name, for example Time Profiler`},{key:`metroKind`,names:[`--metro-kind`],type:`enum`,enumValues:[`auto`,`react-native`,`expo`,`repack`],usageLabel:`--metro-kind auto|react-native|expo|repack`,usageDescription:`metro prepare: detect or force the React Native dev-server launcher kind`},{key:`metroPublicBaseUrl`,names:[`--public-base-url`],type:`string`,usageLabel:`--public-base-url <url>`,usageDescription:`metro prepare: public base URL used for direct dev-server bundle hints`},{key:`metroProxyBaseUrl`,names:[`--proxy-base-url`],type:`string`,usageLabel:`--proxy-base-url <url>`,usageDescription:`metro prepare: optional bridge origin for remote dev-server access`},{key:`metroBearerToken`,names:[`--bearer-token`],type:`string`,usageLabel:`--bearer-token <token>`,usageDescription:`metro prepare: host bridge bearer token (or AGENT_DEVICE_METRO_BEARER_TOKEN; falls back to AGENT_DEVICE_DAEMON_AUTH_TOKEN)`},{key:`metroPreparePort`,names:[`--port`],type:`int`,min:1,max:65535,usageLabel:`--port <port>`,usageDescription:`metro prepare: local dev-server port (default: 8081)`},{key:`metroListenHost`,names:[`--listen-host`],type:`string`,usageLabel:`--listen-host <host>`,usageDescription:`metro prepare: host dev server listens on (default: 0.0.0.0)`},{key:`metroStatusHost`,names:[`--status-host`],type:`string`,usageLabel:`--status-host <host>`,usageDescription:`metro prepare: host used for local dev-server /status polling (default: 127.0.0.1)`},{key:`metroStartupTimeoutMs`,names:[`--startup-timeout-ms`],type:`int`,min:1,usageLabel:`--startup-timeout-ms <ms>`,usageDescription:`metro prepare: timeout while waiting for the dev server to become ready`},{key:`metroProbeTimeoutMs`,names:[`--probe-timeout-ms`],type:`int`,min:1,usageLabel:`--probe-timeout-ms <ms>`,usageDescription:`metro prepare: timeout for /status and proxy bridge calls`},{key:`metroRuntimeFile`,names:[`--runtime-file`],type:`string`,usageLabel:`--runtime-file <path>`,usageDescription:`metro prepare: optional file path to persist the JSON result`},{key:`metroNoReuseExisting`,names:[`--no-reuse-existing`],type:`boolean`,usageLabel:`--no-reuse-existing`,usageDescription:`metro prepare: always start a fresh Metro process`},{key:`metroNoInstallDeps`,names:[`--no-install-deps`],type:`boolean`,usageLabel:`--no-install-deps`,usageDescription:`metro prepare: skip package-manager install when node_modules is missing`},{key:`bundleUrl`,names:[`--bundle-url`],type:`string`,usageLabel:`--bundle-url <url>`,usageDescription:`Session-scoped bundle URL hint`},{key:`launchUrl`,names:[`--launch-url`],type:`string`,usageLabel:`--launch-url <url>`,usageDescription:`Session-scoped deep link / launch URL hint`},{key:`iosSimulatorDeviceSet`,names:[`--ios-simulator-device-set`],type:`string`,usageLabel:`--ios-simulator-device-set <path>`,usageDescription:`Scope iOS simulator discovery/commands to this simulator device set`},{key:`iosXctestrunFile`,names:[`--ios-xctestrun-file`],type:`string`,usageLabel:`--ios-xctestrun-file <path>`,usageDescription:`Use an externally built iOS XCTest runner .xctestrun artifact`},{key:`iosXctestDerivedDataPath`,names:[`--ios-xctest-derived-data-path`],type:`string`,usageLabel:`--ios-xctest-derived-data-path <path>`,usageDescription:`Derived data path for external iOS XCTest runner execution`},{key:`iosXctestEnvDir`,names:[`--ios-xctest-env-dir`],type:`string`,usageLabel:`--ios-xctest-env-dir <path>`,usageDescription:`Writable directory for per-session iOS XCTest runner env overlays`},{key:`deviceHub`,names:[`--device-hub`],type:`boolean`,usageLabel:`--device-hub`,usageDescription:`open: use Xcode Device Hub when surfacing Apple simulators`},{key:`androidDeviceAllowlist`,names:[`--android-device-allowlist`],type:`string`,usageLabel:`--android-device-allowlist <serials>`,usageDescription:`Comma/space separated Android serial allowlist for discovery/selection`},{key:`remote`,names:[`--remote`],type:`boolean`,usageLabel:`--remote`,usageDescription:`Doctor: check remote connection setup instead of local device inventory`},{key:`activity`,names:[`--activity`],type:`string`,usageLabel:`--activity <component>`,usageDescription:`Android app launch activity (package/Activity); not for URL opens`},{key:`launchConsole`,names:[`--launch-console`],type:`string`,usageLabel:`--launch-console <path>`,usageDescription:`open: capture the initial iOS simulator launch console window to a file`},{key:`launchArgs`,names:[`--launch-args`],type:`string`,multiple:!0,usageLabel:`--launch-args <arg>`,usageDescription:`open: repeatable launch argument forwarded verbatim to the platform launch command (iOS app process args; Android adb shell am start args). Linux and macOS reject the flag.`},{key:`header`,names:[`--header`],type:`string`,multiple:!0,usageLabel:`--header <name:value>`,usageDescription:`install-from-source: repeatable HTTP header for URL downloads`},{key:`githubActionsArtifact`,names:[`--github-actions-artifact`],type:`string`,usageLabel:`--github-actions-artifact <owner/repo:artifact>`,usageDescription:`install-from-source: GitHub Actions artifact resolved by a remote daemon`},{key:`installSource`,names:[],type:`string`},{key:`session`,names:[`--session`],type:`string`,usageLabel:`--session <name>`,usageDescription:`Named session`},{key:`count`,names:[`--count`],type:`int`,min:1,max:200,usageLabel:`--count <n>`,usageDescription:`Repeat count for press/swipe series`},{key:`fps`,names:[`--fps`],type:`int`,min:1,max:120,usageLabel:`--fps <n>`,usageDescription:`Record: target frames per second (iOS physical device runner)`},{key:`quality`,names:[`--quality`],type:`string`,usageLabel:`--quality <medium|high>`,usageDescription:`Record: output quality preset; Android maps this to screenrecord bitrate, Apple targets use it for export/encoding. Legacy numeric values 5-7 map to medium; 8-10 map to high`},{key:`hideTouches`,names:[`--hide-touches`],type:`boolean`,usageLabel:`--hide-touches`,usageDescription:`Record: skip touch-overlay post-processing for faster raw benchmark videos`},{key:`recordingScope`,names:[`--scope`],type:`enum`,enumValues:de,usageLabel:`--scope <app|device|system>`,usageDescription:`Record: app requires an active app session; device/system records the whole screen`},{key:`intervalMs`,names:[`--interval-ms`],type:`int`,min:0,max:1e4,usageLabel:`--interval-ms <ms>`,usageDescription:`Delay between press iterations`},{key:`delayMs`,names:[`--delay-ms`],type:`int`,min:0,max:1e4,usageLabel:`--delay-ms <ms>`,usageDescription:`Delay between typed characters`},{key:`durationMs`,names:[`--duration-ms`],type:`int`,min:0,max:1e4,usageLabel:`--duration-ms <ms>`,usageDescription:`Scroll: pace the gesture over this duration when supported`},{key:`holdMs`,names:[`--hold-ms`],type:`int`,min:0,max:1e4,usageLabel:`--hold-ms <ms>`,usageDescription:`Press hold duration for each iteration`},{key:`jitterPx`,names:[`--jitter-px`],type:`int`,min:0,max:100,usageLabel:`--jitter-px <n>`,usageDescription:`Deterministic coordinate jitter radius for press`},{key:`pixels`,names:[`--pixels`],type:`int`,min:1,max:1e5,usageLabel:`--pixels <n>`,usageDescription:`Scroll: explicit gesture distance in pixels`},{key:`doubleTap`,names:[`--double-tap`],type:`boolean`,usageLabel:`--double-tap`,usageDescription:`Use double-tap gesture per press iteration`},{key:`verify`,names:[`--verify`],type:`boolean`,usageLabel:`--verify`,usageDescription:`Capture cheap post-action evidence (AX digest, node counts, changedFromBefore) instead of a follow-up snapshot`},{key:`settle`,names:[`--settle`],type:`boolean`,usageLabel:`--settle`,usageDescription:`After the action, wait for the UI to go quiet and return the settled diff vs the pre-action tree in the same response (best-effort; never fails the action)`},{key:`settleQuietMs`,names:[`--settle-quiet`],type:`int`,min:0,usageLabel:`--settle-quiet <ms>`,usageDescription:`Settle: quiet window the UI must hold to count as settled (default 500ms)`},{key:`clickButton`,names:[`--button`],type:`enum`,enumValues:[`primary`,`secondary`,`middle`],usageLabel:`--button primary|secondary|middle`,usageDescription:`Click: choose mouse button (middle reserved for future macOS support)`},{key:`backMode`,names:[`--in-app`],type:`enum`,enumValues:[`in-app`,`system`],setValue:`in-app`,usageLabel:`--in-app`,usageDescription:`Back: use app-provided back UI when available`},{key:`backMode`,names:[`--system`],type:`enum`,enumValues:[`in-app`,`system`],setValue:`system`,usageLabel:`--system`,usageDescription:`Back: use system back input or gesture when available`},{key:`pauseMs`,names:[`--pause-ms`],type:`int`,min:0,max:1e4,usageLabel:`--pause-ms <ms>`,usageDescription:`Delay between swipe iterations`},{key:`pattern`,names:[`--pattern`],type:`enum`,enumValues:[`one-way`,`ping-pong`],usageLabel:`--pattern one-way|ping-pong`,usageDescription:`Swipe repeat pattern`},{key:`verbose`,names:[`--debug`,`--verbose`,`-v`],type:`boolean`,usageLabel:`--debug, --verbose, -v`,usageDescription:`Enable debug diagnostics; test --verbose prints per-test step timings without debug logs`},{key:`cost`,names:[`--cost`],type:`boolean`,usageLabel:`--cost`,usageDescription:`Include per-command wall-clock latency (cost.wallClockMs) in the response`},{key:`responseLevel`,names:[`--level`],type:`enum`,enumValues:t,usageLabel:`--level digest|default|full`,usageDescription:`Response detail level: digest (token-cheap), default (today), or full. Default keeps the wire shape unchanged.`},{key:`json`,names:[`--json`],type:`boolean`,usageLabel:`--json`,usageDescription:`JSON output`},{key:`help`,names:[`--help`,`-h`],type:`boolean`,usageLabel:`--help, -h`,usageDescription:`Print help and exit`},{key:`version`,names:[`--version`,`-V`],type:`boolean`,usageLabel:`--version, -V`,usageDescription:`Print version and exit`},{key:`snapshotDiff`,names:[`--diff`],type:`boolean`,usageLabel:`--diff`,usageDescription:`Snapshot: show structural diff against the previous session baseline`},{key:`saveScript`,names:[`--save-script`],type:`booleanOrString`,usageLabel:`--save-script [path]`,usageDescription:`Save session script (.ad) on close; optional custom output path`},{key:`networkInclude`,names:[`--include`],type:`enum`,enumValues:[`summary`,`headers`,`body`,`all`],usageLabel:`--include summary|headers|body|all`,usageDescription:`Network: include headers, bodies, or both in output`},{key:`shutdown`,names:[`--shutdown`],type:`boolean`,usageLabel:`--shutdown`,usageDescription:`close: shutdown associated simulator/emulator after ending session`},{key:`relaunch`,names:[`--relaunch`],type:`boolean`,usageLabel:`--relaunch`,usageDescription:`open: terminate app process before launching it`},{key:`restart`,names:[`--restart`],type:`boolean`,usageLabel:`--restart`,usageDescription:`logs clear: stop active stream, clear logs, then start streaming again`},{key:`retainPaths`,names:[`--retain-paths`],type:`boolean`,usageLabel:`--retain-paths`,usageDescription:`install-from-source: keep materialized artifact paths after install`},{key:`retentionMs`,names:[`--retention-ms`],type:`int`,min:1,usageLabel:`--retention-ms <ms>`,usageDescription:`install-from-source: retention TTL for materialized artifact paths`},{key:`noRecord`,names:[`--no-record`],type:`boolean`,usageLabel:`--no-record`,usageDescription:`Do not record this action`},{key:`replayUpdate`,names:[`--update`,`-u`],type:`boolean`,usageLabel:`--update, -u`,usageDescription:`Replay: update selectors and rewrite replay file in place`},{key:`replayMaestro`,names:[`--maestro`],type:`boolean`,usageLabel:`--maestro`,usageDescription:`Replay: treat input as a Maestro YAML compatibility flow. ${me()} Unsupported syntax fails loudly with a link to ${Re}`},{key:`replayExportFormat`,names:[`--format`],type:`enum`,enumValues:[`maestro`],usageLabel:`--format maestro`,usageDescription:`Replay export: output format`},{key:`replayEnv`,names:[`-e`,`--env`],type:`string`,multiple:!0,usageLabel:`-e KEY=VALUE, --env KEY=VALUE`,usageDescription:"Replay/Test: inject or override a ${KEY} variable for the script (repeatable)"},{key:`failFast`,names:[`--fail-fast`],type:`boolean`,usageLabel:`--fail-fast`,usageDescription:`Test: stop the suite after the first failing script; with sharding, each shard stops independently`},{key:`timeoutMs`,names:[`--timeout`],type:`int`,min:1,usageLabel:`--timeout <ms>`,usageDescription:`Prepare/Replay/Snapshot/Test: maximum wall-clock time for the command or attempt. With --settle: the settle-wait deadline (default 10s)`},{key:`retries`,names:[`--retries`],type:`int`,min:0,max:3,usageLabel:`--retries <n>`,usageDescription:`Test: retry each failed script up to n additional times`},{key:`recordVideo`,names:[`--record-video`],type:`boolean`,usageLabel:`--record-video`,usageDescription:`Test: record each replay attempt to recording.mp4 in its attempt artifacts`},{key:`artifactsDir`,names:[`--artifacts-dir`],type:`string`,usageLabel:`--artifacts-dir <path>`,usageDescription:`Test: root directory for suite artifacts`},{key:`reporter`,names:[`--reporter`],type:`string`,multiple:!0,usageLabel:`--reporter <name-or-path>`,usageDescription:`Test: add a replay suite reporter; use default, junit:<path>, or a custom reporter path (repeatable)`},{key:`reportJunit`,names:[`--report-junit`],type:`string`,usageLabel:`--report-junit <path>`,usageDescription:`Test: compatibility alias for --reporter junit:<path>`},{key:`shardAll`,names:[`--shard-all`],type:`int`,min:1,usageLabel:`--shard-all <n>`,usageDescription:`Test: run the full suite on each of n devices; combine with --device id1,id2 for explicit connected devices; AD_SHARD_INDEX is zero-based`},{key:`shardSplit`,names:[`--shard-split`],type:`int`,min:1,usageLabel:`--shard-split <n>`,usageDescription:`Test: split runnable suite entries across n devices; AD_SHARD_INDEX is zero-based`},{key:`steps`,names:[`--steps`],type:`string`,usageLabel:`--steps <json>`,usageDescription:`Batch: JSON array of steps`},{key:`stepsFile`,names:[`--steps-file`],type:`string`,usageLabel:`--steps-file <path>`,usageDescription:`Batch: read steps JSON from file`},{key:`batchOnError`,names:[`--on-error`],type:`enum`,enumValues:[`stop`],usageLabel:`--on-error stop`,usageDescription:`Batch: stop when a step fails`},{key:`batchMaxSteps`,names:[`--max-steps`],type:`int`,min:1,max:1e3,usageLabel:`--max-steps <n>`,usageDescription:`Batch: maximum number of allowed steps`},{key:`appsFilter`,names:[`--all`],type:`enum`,enumValues:[`user-installed`,`all`],setValue:`all`,usageLabel:`--all`,usageDescription:`Apps: include system/OEM apps`},{key:`snapshotInteractiveOnly`,names:[`-i`],type:`boolean`,usageLabel:`-i`,usageDescription:`Snapshot: interactive elements only`},{key:`snapshotDepth`,names:[`--depth`,`-d`],type:`int`,min:0,usageLabel:`--depth, -d <depth>`,usageDescription:`Snapshot: limit snapshot depth`},{key:`snapshotScope`,names:[`--scope`,`-s`],type:`string`,usageLabel:`--scope, -s <scope>`,usageDescription:`Snapshot: scope snapshot to label/identifier`},{key:`snapshotRaw`,names:[`--raw`],type:`boolean`,usageLabel:`--raw`,usageDescription:`Snapshot: raw node output`},{key:`snapshotForceFull`,names:[`--force-full`],type:`boolean`,usageLabel:`--force-full`,usageDescription:`Snapshot: re-emit the full tree even when unchanged`},{key:`findFirst`,names:[`--first`],type:`boolean`,usageLabel:`--first`,usageDescription:`Find: pick the first match when ambiguous`},{key:`findLast`,names:[`--last`],type:`boolean`,usageLabel:`--last`,usageDescription:`Find: pick the last match when ambiguous`},{key:`out`,names:[`--out`],type:`string`,usageLabel:`--out <path>`,usageDescription:`Output path`},{key:`artifact`,names:[`--artifact`],type:`string`,usageLabel:`--artifact <path>`,usageDescription:`Debug symbols: Apple crash artifact path (.ips, .crash, or .log)`},{key:`dsym`,names:[`--dsym`],type:`string`,usageLabel:`--dsym <path>`,usageDescription:`Debug symbols: matching .dSYM bundle path`},{key:`searchPath`,names:[`--search-path`],type:`string`,usageLabel:`--search-path <dir>`,usageDescription:`Debug symbols: directory to scan for matching .dSYM bundles`},{key:`overlayRefs`,names:[`--overlay-refs`],type:`boolean`,usageLabel:`--overlay-refs`,usageDescription:`Screenshot: draw current snapshot refs and target rectangles onto the saved PNG; diff screenshot: also write a separate current-screen overlay guide`},...Ne,{key:`baseline`,names:[`--baseline`,`-b`],type:`string`,usageLabel:`--baseline, -b <path>`,usageDescription:`Diff screenshot: path to baseline image file`},{key:`threshold`,names:[`--threshold`],type:`string`,usageLabel:`--threshold <0-1>`,usageDescription:`Diff screenshot: color distance threshold (default 0.1)`}],kr=H(`remoteConfig`,`stateDir`,`daemonBaseUrl`,`daemonAuthToken`,`daemonTransport`,`daemonServerMode`,`tenant`,`sessionIsolation`,`runId`,`leaseId`,`leaseBackend`,`sessionLock`,`sessionLocked`,`sessionLockConflicts`,`platform`,`target`,`device`,`providerApp`,`providerOsVersion`,`providerProject`,`providerBuild`,`providerSessionName`,`awsProjectArn`,`awsDeviceArn`,`awsAppArn`,`awsRegion`,`awsInteractionMode`,`udid`,`serial`,`iosSimulatorDeviceSet`,`iosXctestrunFile`,`iosXctestDerivedDataPath`,`iosXctestEnvDir`,`androidDeviceAllowlist`,`session`,`noRecord`),Ar=new Set([`json`,`config`,`help`,`version`,`verbose`,`cost`,`responseLevel`]),jr=new Map;for(let e of Or)for(let t of e.names)jr.set(t,e);function Mr(e){return jr.get(e)}function Nr(){return Or}const Pr=new Set(Nr().map(e=>e.key));function Fr(e,t){return{...yr(e),...t}}function Ir(e,t){let n=e.inputSchema.properties;if(!n)return{};let r={},i=t;for(let e of Object.keys(n)){if(!Pr.has(e))continue;let t=i[e];Lr(t)&&(r[e]=t)}return r}function Lr(e){return typeof e==`boolean`||typeof e==`number`||typeof e==`string`}function Rr(e){return t=>D(l.batch,[],{...t,batchSteps:zr(t.steps,e),batchOnError:t.onError,batchMaxSteps:t.maxSteps})}function zr(t,n){if(!Array.isArray(t)||t.length===0)throw new e(`INVALID_ARGS`,`batch requires a non-empty steps array.`);return t.map((e,t)=>Br(e,t+1,n))}function Br(e,t,n){let r=xt(e,t),i=Vr(r,t),a=vt(r,t),o=dt(r.runtime,t),s=n(i,a,t);return{command:s.command,positionals:s.positionals,flags:Fr(s.options,s.metadataFlags),runtime:o??s.options.runtime}}function Vr(e,t){return a(e.command,t)}const Hr=Zn(),Ur=L({name:`batch`,clientSurface:!1,commands:[I({name:`batch`,metadata:Hr,definition:R(Hr,(e,t)=>e.batch.run(Wr(t))),cliSchema:{usageOverride:`batch [--steps <json> | --steps-file <path>]`,listUsageOverride:`batch --steps <json> | --steps-file <path>`,helpDescription:`Execute multiple commands in one daemon request`,summary:`Run multiple commands`,allowedFlags:[`steps`,`stepsFile`,`batchOnError`,`batchMaxSteps`,`out`]},cliReader:(e,t)=>({...O(t),steps:t.batchSteps??[],onError:t.batchOnError,maxSteps:t.batchMaxSteps,out:t.out}),cliOutputFormatter:Yn.batch})]});function Wr(e){return{...C(e),steps:e.steps,onError:e.onError,maxSteps:e.maxSteps,out:e.out}}function W(e,t,n){return qn({name:e,description:t,inputSchema:Qt(n),readInput:e=>$t(e,n)})}const Gr=`alert`,Kr=W(Gr,`Inspect or handle platform alerts.`,{action:_(he),timeoutMs:h()}),qr=I({name:Gr,metadata:Kr,definition:R(Kr,(e,t)=>e.command.alert(t)),cliSchema:{usageOverride:`alert [get|accept|dismiss|wait] [timeout]`,positionalArgs:[`action?`,`timeout?`]},cliReader:(e,t)=>({...O(t),...Yr(e)}),daemonWriter:E(l.alert,e=>Jr(e)),cliOutputFormatter:B});function Jr(e){return[e.action??`get`,...N(e.timeoutMs)]}function Yr(t){if(t.length>2)throw new e(`INVALID_ARGS`,`alert accepts at most action and timeout arguments.`);return w({action:Xr(t[0]),timeoutMs:Gn(t[1],`alert timeout`)})}function Xr(t){let n=t?.toLowerCase();if(n===void 0||n===`get`||n===`accept`||n===`dismiss`||n===`wait`)return n;throw new e(`INVALID_ARGS`,`alert action must be get, accept, dismiss, or wait.`)}const Zr=`diff`,Qr=W(Zr,`Diff accessibility snapshots.`,{kind:f(v({type:`string`,const:`snapshot`})),out:p(),interactiveOnly:g(),depth:h(),scope:p(),raw:g()}),$r=I({name:Zr,metadata:Qr,definition:R(Qr,(e,t)=>e.capture.diff(t)),cliSchema:{usageOverride:`diff snapshot | diff screenshot --baseline <path> [current.png] [--out <diff.png>] [--threshold <0-1>] [--overlay-refs]`,helpDescription:`Diff accessibility snapshot or compare screenshots pixel-by-pixel. Live iOS simulator screenshot diffs normalize status-bar chrome by default; use screenshot --normalize-status-bar when capturing reusable baselines.`,summary:`Diff snapshot or screenshot`,positionalArgs:[`kind`,`current?`],allowedFlags:[...Sr,`baseline`,`threshold`,`out`,`overlayRefs`]},cliReader:(t,n)=>{if(t[0]!==`snapshot`)throw new e(`INVALID_ARGS`,`Only diff snapshot is available through this parser.`);return{...O(n),kind:`snapshot`,out:n.out,interactiveOnly:n.snapshotInteractiveOnly,depth:n.snapshotDepth,scope:n.snapshotScope,raw:n.snapshotRaw}},daemonWriter:E(l.diff,e=>[F(e.kind,`diff requires kind`)])}),ei=`screenshot`,ti=W(ei,`Capture a screenshot.`,{path:p(`Output path.`),overlayRefs:g(),pixelDensity:h(`Output screenshot pixel density in pixels per logical point.`,{min:1}),fullscreen:g(),maxSize:h(),stabilize:g(),normalizeStatusBar:g(),surface:_(Ce)}),ni=I({name:ei,metadata:ti,definition:R(ti,(e,t)=>e.capture.screenshot(t)),cliSchema:{helpDescription:`Capture screenshot (web defaults to the viewport; use --fullscreen, --full, or -f for the entire page. iOS simulators default to 1x logical-point output; use --pixel-density to request a different screenshot density. macOS app sessions default to the app window; use --fullscreen for full desktop, --max-size to downscale, --overlay-refs to annotate current refs, --normalize-status-bar for deterministic iOS simulator chrome, or --no-stabilize for low-latency Android capture loops)`,summary:`Capture screenshot with optional density, full-page, desktop, downscale, or ref overlay modes`,positionalArgs:[`path?`],allowedFlags:Fe},cliReader:(e,t)=>({...O(t),path:e[0]??t.out,...De(t)}),daemonWriter:e=>D(l.screenshot,M(e.path),{...e,...it(e)})}),ri=`settings`,ii=W(ri,`Change OS settings and app permissions.`,{setting:f(p()),state:f(p()),app:p(),latitude:m(),longitude:m(),permission:p(),mode:_([`full`,`limited`])}),ai=I({name:ri,metadata:ii,definition:R(ii,(e,t)=>e.settings.update(t)),cliSchema:{usageOverride:ye,listUsageOverride:`settings [area] [options]`,helpDescription:`Toggle OS settings, animation scales, appearance, and app permissions (macOS supports only settings appearance <light|dark|toggle> and settings permission <grant|reset> <accessibility|screen-recording|input-monitoring>; wifi|airplane|location|animations remain unsupported on macOS; mobile permission actions use the active session app)`,summary:`Change OS settings and app permissions`,positionalArgs:[`setting`,`state`,`target?`,`mode?`]},cliReader:(e,t)=>oi(e,t),daemonWriter:E(l.settings,e=>si(e))});function oi(t,n){let r=On(n),i=t[0],a=t[1];if(A(i,ui)&&A(a,di))return{...r,setting:i,state:a};if(i===`location`&&a===`set`)return{...r,setting:i,state:a,latitude:ve(t[2],`latitude`),longitude:ve(t[3],`longitude`)};if(i===`appearance`&&A(a,fi)||A(i,pi)&&A(a,mi)||i===`fingerprint`&&A(a,hi))return{...r,setting:i,state:a};if(i===`permission`&&A(a,gi))return{...r,setting:i,state:a,permission:ci(t[2]),mode:li(t[3])};if(i===`clear-app-state`){let e=a===`clear`?t[2]:a;return{...r,setting:i,state:`clear`,app:e}}throw new e(`INVALID_ARGS`,`Invalid settings arguments.`)}function si(e){return e.setting===`clear-app-state`?[e.setting,...M(e.app)]:e.setting===`location`&&e.state===`set`?[e.setting,e.state,String(e.latitude),String(e.longitude)]:e.setting===`permission`?[e.setting,e.state,e.permission,...M(e.mode)]:[e.setting,e.state]}function ci(t){if(A(t,_i))return t;throw new e(`INVALID_ARGS`,`settings permission requires a permission target.`)}function li(t){if(t===void 0||t===`full`||t===`limited`)return t;throw new e(`INVALID_ARGS`,`settings permission mode must be full or limited.`)}const ui=k(`wifi`,`airplane`,`location`,`animations`),di=k(`on`,`off`),fi=k(`light`,`dark`,`toggle`),pi=k(`faceid`,`touchid`),mi=k(`match`,`nonmatch`,`enroll`,`unenroll`),hi=k(`match`,`nonmatch`),gi=k(`grant`,`deny`,`reset`),_i=k(`camera`,`microphone`,`photos`,`contacts`,`contacts-limited`,`notifications`,`calendar`,`location`,`location-always`,`media-library`,`motion`,`reminders`,`siri`,`accessibility`,`screen-recording`,`input-monitoring`);function vi(e){if(!Array.isArray(e)||e.length===0)return e;let t=ot(e);return e.map(e=>{let n=yi(e,t,e=>e.label),r=yi(e,t,e=>e.identifier),i=typeof e.label==`string`&&e.label.length>=24&&e.label===n,a=typeof e.identifier==`string`&&e.identifier.length>=24&&e.identifier===r;if(!i&&!a)return e;let o={...e};return i&&(delete o.label,o.inheritsLabel=!0),a&&(delete o.identifier,o.inheritsIdentifier=!0),o})}function yi(e,t,n){let r=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0;for(;r;){let e=n(r);if(typeof e==`string`&&e.length>0)return e;r=typeof r.parentIndex==`number`?t.get(r.parentIndex):void 0}}function bi(e){let t=tt(e.raw||!Array.isArray(e.result.nodes)?e.result:{...e.result,nodes:vi(e.result.nodes)});return{data:t,jsonData:Si(t),stderr:e.result.snapshotDiagnostics?.warning?`${e.result.snapshotDiagnostics.warning}\n`:void 0,text:se(t,{raw:e.raw,flatten:e.interactiveOnly,scoped:typeof e.scope==`string`&&e.scope.trim().length>0,depthLimited:typeof e.depth==`number`})}}const xi={snapshot:({input:e,result:t})=>bi({result:t,raw:e.raw,interactiveOnly:e.interactiveOnly,scope:e.scope,depth:e.depth}),wait:B,alert:B};function Si(e){let{unchanged:t,...n}=e;return n}const Ci=`snapshot`,wi=W(Ci,`Capture an accessibility snapshot.`,{interactiveOnly:g(),depth:h(),scope:p(),raw:g(),forceFull:g(),timeoutMs:h(`Maximum wall-clock time for the snapshot command.`)}),Ti=I({name:Ci,metadata:wi,definition:R(wi,(e,t)=>e.capture.snapshot(t)),cliSchema:{usageOverride:`snapshot [--diff] [-i] [-d <depth>] [-s <scope>] [--raw] [--force-full] [--timeout <ms>]`,helpDescription:`Capture accessibility tree or diff against the previous session baseline. For iOS raw-coordinate fallback after a no-op ref press, inspect rects with snapshot -i --json, press the rect center, then verify with diff snapshot -i or snapshot --diff.`,summary:`Capture accessibility tree or diff against the previous session baseline`,allowedFlags:[`snapshotDiff`,...Sr,`snapshotForceFull`,`timeoutMs`]},cliReader:(e,t)=>({...O(t),interactiveOnly:t.snapshotInteractiveOnly,depth:t.snapshotDepth,scope:t.snapshotScope,raw:t.snapshotRaw,forceFull:t.snapshotForceFull,timeoutMs:t.timeoutMs}),daemonWriter:E(l.snapshot),cliOutputFormatter:xi.snapshot}),Ei=[`duration`,`text`,`ref`,`selector`,`stable`],Di=`wait`,Oi=W(Di,`Wait for duration, text, ref, selector, or stable UI.`,{kind:_(Ei),durationMs:h(),text:p(),ref:p(),selector:p(),stable:g(),quietMs:h(),timeoutMs:h(),depth:h(),scope:p(),raw:g()}),ki=I({name:Di,metadata:Oi,definition:R(Oi,(e,t)=>e.command.wait(Ai(t))),cliSchema:{usageOverride:`wait <ms>|text <text>|@ref|<selector>|stable [quietMs] [timeoutMs]`,positionalArgs:[`durationOrSelector`,`timeoutMs?`],allowsExtraPositionals:!0,allowedFlags:[...U]},cliReader:(e,t)=>ji(e,t),daemonWriter:E(l.wait,e=>Mi(e)),cliOutputFormatter:B});function Ai(e){un(e,`kind`,Ei);let t={...e};return delete t.kind,t}function ji(t,n){let r=c(t);if(!r)throw new e(`INVALID_ARGS`,`wait requires <ms>, text <text>, @ref, <selector> [timeoutMs], or stable [quietMs] [timeoutMs].`);let i={...On(n),...An(n)};if(r.kind===`sleep`)return{...i,durationMs:r.durationMs};if(r.kind===`text`){if(!r.text)throw new e(`INVALID_ARGS`,`wait requires text.`);return{...i,text:r.text,...Ni(r.timeoutMs)}}return r.kind===`ref`?{...i,ref:r.rawRef,...Ni(r.timeoutMs)}:r.kind===`stable`?{...i,stable:!0,...Pi(r.quietMs),...Ni(r.timeoutMs)}:{...i,selector:r.selectorExpression,...Ni(r.timeoutMs)}}function Mi(t){if([t.durationMs===void 0?void 0:`durationMs`,t.text===void 0?void 0:`text`,t.ref===void 0?void 0:`ref`,t.selector===void 0?void 0:`selector`,t.stable===void 0?void 0:`stable`].filter(Boolean).length!==1)throw new e(`INVALID_ARGS`,`wait command requires exactly one of durationMs, text, ref, selector, or stable.`);if(t.durationMs!==void 0)return[String(t.durationMs)];let n=N(t.timeoutMs);if(t.text!==void 0)return[`text`,t.text,...n];if(t.ref!==void 0)return[t.ref,...n];if(t.stable!==void 0){let r=N(t.quietMs);if(r.length===0&&n.length>0)throw new e(`INVALID_ARGS`,`wait stable requires quietMs before timeoutMs.`);return[`stable`,...r,...n]}let i=t.selector;if(!r(i))throw new e(`INVALID_ARGS`,`Invalid wait selector: ${i}`);return[i,...n]}function Ni(e){return e===null?{}:{timeoutMs:e}}function Pi(e){return e===null?{}:{quietMs:e}}const Fi=L({name:`capture`,commands:[Ti,ni,$r,ki,qr,ai]});function Ii(e){let t=[e.outPath,e.message];t.push(...Ri(e));for(let n of e.matchedImages)t.push(`Matched: ${n.name} ${n.uuid}${n.arch?` ${n.arch}`:``}`);for(let n of e.warnings??[])t.push(`Warning: ${n}`);return{data:e,text:t.join(`
3
- `)}}const Li={debug:z(Ii)};function Ri(e){let t=e.crash,n=[`Crash: ${t.appName??`unknown app`}${t.crashedThread===void 0?``:` thread ${t.crashedThread}`}`];t.bundleId&&n.push(`Bundle: ${t.bundleId}`),t.exceptionType&&n.push(`Exception: ${t.exceptionType}`),t.terminationReason&&n.push(`Termination: ${t.terminationReason}`);for(let e of t.topFrames)n.push(`Frame ${e.index}: ${e.image} ${e.symbol??e.address}`);for(let e of t.findings)n.push(`Finding: ${e}`);return n}const zi=`debug`,Bi=W(zi,`Symbolicate crash artifacts with matching debug symbols.`,{action:f(_([`symbols`])),artifact:f(p(`Apple crash artifact path (.ips, .crash, or .log).`)),dsym:p(`Path to a matching .dSYM bundle.`),searchPath:p(`Directory to scan for matching .dSYM bundles.`),out:p(`Output path for the symbolicated artifact.`)}),Vi=L({name:`debugging`,commands:[I({name:zi,metadata:Bi,definition:R(Bi,(e,t)=>e.debug.symbols(t)),cliSchema:{usageOverride:`debug symbols --artifact <crash.ips|crash.log> (--dsym <App.dSYM> | --search-path <dir>) [--out <symbolicated>]`,listUsageOverride:`debug`,helpDescription:`Symbolicate Apple crash artifacts with matching dSYM UUIDs. This debug namespace is intentionally narrow: use logs for app logs, network for HTTP evidence, perf for performance samples, record/trace for media and traces, and react-devtools for React Native profiles.`,summary:`Symbolicate Apple crash artifacts with dSYMs; use logs/network/perf for other diagnostics`,positionalArgs:[`symbols`],allowedFlags:[`artifact`,`dsym`,`searchPath`,`out`]},cliReader:(e,t)=>({...O(t),action:Hi(e[0]),artifact:t.artifact,dsym:t.dsym,searchPath:t.searchPath,out:t.out}),cliOutputFormatter:Li.debug})]});function Hi(t){if(t===`symbols`)return t;throw new e(`INVALID_ARGS`,`debug supports only symbols; use logs, network, perf, record, trace, or react-devtools for other diagnostics`)}const Ui=[`click`,`focus`,`exists`,`getText`,`getAttrs`,`wait`,`fill`,`type`],Wi={click:`Click or tap a semantic UI target by ref, selector, or point.`,press:`Press a semantic UI target by ref, selector, or point.`,fill:`Replace text in a semantic UI target by ref, selector, or point.`,longpress:`Long press by ref, selector, or point.`,swipe:`Swipe between two points.`,focus:`Focus input at coordinates.`,type:`Append text to the focused field.`,scroll:`Scroll in a direction or to an edge.`,get:`Get element text or attributes.`,is:`Assert UI state.`,find:`Find an element and optionally act on it.`,gesture:`Run a structured gesture.`},Gi=()=>g(`Capture cheap post-action evidence (AX digest, node counts, changedFromBefore) instead of a follow-up snapshot.`),Ki=()=>({settle:g(`After the action, wait for the UI to go quiet and return the settled diff vs the pre-action tree in the same response. Best-effort; never fails the action.`),settleQuietMs:h(`Settle: quiet window in milliseconds (default 500).`,{min:0}),timeoutMs:h(`Settle: wait deadline in milliseconds (default 10000).`,{min:1})});function qi(e){return{...i(e)?{verify:Gi()}:{},...s(e)?Ki():{}}}const Ji={target:f(qt()),button:_(nt,`Pointer button for platforms that support mouse buttons.`),...Xt(),...Zt(),...qi(`click`)},Yi={target:f(qt()),...Xt(),...Zt(),...qi(`press`)},Xi={target:f(qt()),text:f(p(`Text to enter into the target.`)),delayMs:h(`Delay between typed characters.`,{min:0}),...Xt(),...qi(`fill`)},Zi={target:f(qt()),durationMs:h(`Long press duration in milliseconds.`,{min:0}),...Xt(),...qi(`longpress`)},Qi={from:f(Yt(`Swipe start point.`)),to:f(Yt(`Swipe end point.`)),durationMs:h(`Swipe duration in milliseconds.`,{min:0}),count:h(`Number of swipe repetitions.`,{min:1}),pauseMs:h(`Pause between repeated swipes.`,{min:0}),pattern:_(Le)},$i={x:f(m(`X coordinate.`)),y:f(m(`Y coordinate.`))},ea={text:f(p(`Text to type.`)),delayMs:h(`Delay between typed characters.`,{min:0})},ta={direction:f(_(Me)),amount:m(`Platform scroll amount.`),pixels:h(`Pixel scroll amount.`,{min:0}),durationMs:h(`Scroll duration in milliseconds when the backend supports pacing.`,{min:0,max:Ve})},na={format:f(_([`text`,`attrs`])),target:f(Jt()),...Xt()},ra={predicate:f(_([`visible`,`hidden`,`exists`,`editable`,`selected`,`focused`,`text`])),selector:f(p()),value:p(),...Xt()},ia={locator:_(Ot),query:f(p()),action:_(Ui),value:p(),timeoutMs:h(),first:g(),last:g(),depth:h(),raw:g()},aa={kind:f(_(Ke,`Gesture variant.`)),direction:_(Ye,`Fling direction.`),preset:_(Ee,`Swipe preset.`),origin:Yt(`Gesture origin point.`),delta:Yt(`Movement delta for pan or transform gestures.`),distance:h(`Fling distance.`,{min:0}),scale:m(`Pinch or transform scale.`),degrees:m(`Rotation in degrees.`),velocity:h(`Rotate gesture velocity.`,{min:0}),durationMs:h(`Gesture duration in milliseconds.`,{min:0})},oa=[qn({name:`click`,description:Wi.click,inputSchema:Qt(Ji),readInput:e=>$t(e,Ji)}),qn({name:`press`,description:Wi.press,inputSchema:Qt(Yi),readInput:e=>$t(e,Yi)}),qn({name:`fill`,description:Wi.fill,inputSchema:Qt(Xi),readInput:e=>$t(e,Xi)}),G(`longpress`,Zi),G(`swipe`,Qi),G(`focus`,$i),G(`type`,ea),G(`scroll`,ta),G(`get`,na),G(`is`,ra),G(`find`,ia),qn({name:`gesture`,description:Wi.gesture,inputSchema:Qt(aa),readInput:sa})];function sa(e){let t=en(e),n=tn(t),r=ln(t,`kind`,Ke);return r===`pan`?{...n,kind:r,origin:y(t,`origin`),delta:y(t,`delta`),durationMs:S(t,`durationMs`,{min:0})}:r===`fling`?{...n,kind:r,direction:ln(t,`direction`,Ye),origin:y(t,`origin`),distance:S(t,`distance`,{min:0}),durationMs:S(t,`durationMs`,{min:0})}:r===`swipe`?{...n,kind:r,preset:ln(t,`preset`,Ee),durationMs:S(t,`durationMs`,{min:0})}:r===`pinch`?{...n,kind:r,scale:x(t,`scale`),origin:ca(t,`origin`)}:r===`rotate`?{...n,kind:r,degrees:x(t,`degrees`),origin:ca(t,`origin`),velocity:S(t,`velocity`,{min:0})}:{...n,kind:r,origin:y(t,`origin`),delta:y(t,`delta`),scale:x(t,`scale`),degrees:x(t,`degrees`),durationMs:S(t,`durationMs`,{min:0})}}function G(e,t){return W(e,Wi[e],t)}function ca(e,t){return e[t]===void 0?void 0:y(e,t)}const la={gesture:va},ua={gesture:E(l.gesture,da),"gesture-pan":E(l.gesture,pa),"gesture-fling":E(l.gesture,e=>ma(e)),"gesture-swipe":E(l.gesture,fa),"gesture-pinch":E(l.gesture,ha),"gesture-rotate":E(l.gesture,e=>ga(e)),"gesture-transform":E(l.gesture,_a)};function da(t){switch(t.kind){case`pan`:return[`pan`,String(t.origin?.x),String(t.origin?.y),String(t.delta?.x),String(t.delta?.y),...N(t.durationMs)];case`fling`:return[`fling`,F(t.direction,`gesture fling requires direction`),String(t.origin?.x),String(t.origin?.y),...N(t.distance),...N(t.durationMs)];case`swipe`:return fa(t);case`pinch`:return[`pinch`,String(t.scale),...N(t.origin?.x),...N(t.origin?.y)];case`rotate`:return[`rotate`,String(t.degrees),...N(t.origin?.x),...N(t.origin?.y),...N(t.velocity)];case`transform`:return[`transform`,String(t.origin?.x),String(t.origin?.y),String(t.delta?.x),String(t.delta?.y),String(t.scale),String(t.degrees),...N(t.durationMs)];default:throw new e(`INVALID_ARGS`,`gesture requires pan, fling, swipe, pinch, rotate, or transform`)}}function fa(e){return[`swipe`,F(e.preset,`gesture swipe requires preset`),...N(e.durationMs)]}function pa(e){return[`pan`,String(e.x),String(e.y),String(e.dx),String(e.dy),...N(e.durationMs)]}function ma(e){let t=e.durationMs===void 0?e.distance:e.distance??180;return[`fling`,e.direction,String(e.x),String(e.y),...N(t),...N(e.durationMs)]}function ha(e){return[`pinch`,String(e.scale),...N(e.x),...N(e.y)]}function ga(e){ya(e);let t=e.x===void 0||e.y===void 0?[]:[String(e.x),String(e.y)];return[`rotate`,String(e.degrees),...t,...N(e.velocity)]}function _a(e){return[`transform`,String(e.x),String(e.y),String(e.dx),String(e.dy),String(e.scale),String(e.degrees),...N(e.durationMs)]}function va(t,n){let r=t[0],i=t.slice(1),a=O(n);switch(r){case`pan`:return{...a,kind:r,origin:{x:Number(i[0]),y:Number(i[1])},delta:{x:Number(i[2]),y:Number(i[3])},durationMs:j(i[4])};case`fling`:return{...a,kind:r,direction:i[0],origin:{x:Number(i[1]),y:Number(i[2])},distance:j(i[3]),durationMs:j(i[4])};case`swipe`:return{...a,kind:r,preset:i[0],durationMs:j(i[1])};case`pinch`:return{...a,kind:r,scale:Number(i[0]),origin:i[1]===void 0||i[2]===void 0?void 0:{x:Number(i[1]),y:Number(i[2])}};case`rotate`:return{...a,kind:r,degrees:Number(i[0]),origin:i[1]===void 0||i[2]===void 0?void 0:{x:Number(i[1]),y:Number(i[2])},velocity:j(i[3])};case`transform`:return{...a,kind:r,origin:{x:Number(i[0]),y:Number(i[1])},delta:{x:Number(i[2]),y:Number(i[3])},scale:Number(i[4]),degrees:Number(i[5]),durationMs:j(i[6])};default:throw new e(`INVALID_ARGS`,`gesture requires pan, fling, swipe, pinch, rotate, or transform`)}}function ya(t){if(t.x===void 0&&t.y!==void 0||t.x!==void 0&&t.y===void 0)throw new e(`INVALID_ARGS`,`gesture rotate center requires both x and y`)}const K={click:(e,t)=>({...O(t),...kn(t),...Mn(t),...jn(t),target:Nn(Pe(e)),button:t.clickButton,verify:t.verify}),press:(e,t)=>({...O(t),...kn(t),...Mn(t),...jn(t),target:Nn(Pe(e)),verify:t.verify}),longpress:(e,t)=>{let n=ba(e);return{...O(t),...kn(t),...jn(t),target:Nn(n),durationMs:n.durationMs}},swipe:(e,t)=>({...O(t),from:{x:Number(e[0]),y:Number(e[1])},to:{x:Number(e[2]),y:Number(e[3])},durationMs:j(e[4]),count:t.count,pauseMs:t.pauseMs,pattern:t.pattern}),focus:(e,t)=>({...O(t),x:Number(e[0]),y:Number(e[1])}),type:(e,t)=>({...O(t),text:e.join(` `),delayMs:t.delayMs}),fill:(e,t)=>{let n=Be(e);return{...O(t),...kn(t),...jn(t),target:Nn(n.target),text:n.text,delayMs:t.delayMs,verify:t.verify}},scroll:(e,t)=>({...O(t),direction:Ta(e[0]),amount:j(e[1]),pixels:t.pixels,durationMs:t.durationMs}),get:(e,t)=>({...O(t),...kn(t),format:Bn(e[0]),target:Nn(zn(e.slice(1)))})},q={click:e=>D(l.click,Pn(e),{...e,clickButton:e.button}),press:E(l.press,e=>Pn(e)),longpress:E(l.longPress,e=>xa(e)),swipe:E(l.swipe,wa),focus:E(l.focus,e=>[String(e.x),String(e.y)]),type:E(l.type,e=>Sa(e)),fill:E(l.fill,e=>Ca(e)),scroll:E(l.scroll,e=>[F(e.direction,`scroll requires direction`),...N(e.amount)]),get:E(l.get,e=>[F(e.format,`get requires format`),...Fn(e)])};function ba(e){let t=Ea(e);return{...Pe(t.target),...t.durationMs===void 0?{}:{durationMs:t.durationMs}}}function xa(e){return[...Pn(e),...N(e.durationMs)]}function Sa(e){return[e.text]}function Ca(e){return[...Pn(e),e.text]}function wa(e){return[String(e.from?.x),String(e.from?.y),String(e.to?.x),String(e.to?.y),...N(e.durationMs)]}function Ta(t){if(t===`up`||t===`down`||t===`left`||t===`right`||t===`top`||t===`bottom`)return t;throw new e(`INVALID_ARGS`,`Unknown direction: ${String(t)}`)}function Ea(e){if(Wn(e[0])&&Wn(e[1]))return{target:e.slice(0,2),...e[2]===void 0?{}:{durationMs:Number(e[2])}};let t=e.at(-1);return e.length>1&&Wn(t)?{target:e.slice(0,-1),durationMs:Number(t)}:{target:e}}function Da(e){let t=e.result;return e.format===`text`?{data:t,text:typeof t.text==`string`?t.text:``}:e.format===`attrs`?{data:t,text:JSON.stringify(t.node??{},null,2)}:La(t)}function Oa(e){let t=e,n=rt(t);return n?{data:t,text:n}:typeof t.text==`string`?{data:t,text:t.text}:typeof t.found==`boolean`?{data:t,text:`Found: ${t.found}`}:t.node?{data:t,text:JSON.stringify(t.node,null,2)}:La(t)}function ka(e){let t=e;return{data:t,text:`Passed: is ${t.predicate??`assertion`}`}}function Aa(e){let t=e,n=t.ref??``,r=t.x,i=t.y;if(!n||typeof r!=`number`||typeof i!=`number`){let e=La(t);return{data:e.data,text:Ma(e.text,t.settle)}}return{data:t,text:Ma(`Tapped @${n} (${r}, ${i})`,t.settle)}}function ja(e){let t=e,n=La(t);return{data:n.data,text:Ma(n.text,t.settle)}}function Ma(e,t){return`${e??``}${Na(t)}`}function Na(e){if(!e||typeof e!=`object`)return``;let t=e,n=[Ia(t),...Pa(t.diff),...Fa(t)];return t.hint&&n.push(`hint: ${t.hint}`),`\n${n.join(`
4
- `)}`}function Pa(e){let t=(e?.lines??[]).map(e=>`${e.kind===`removed`?`-`:`+`} ${e.text??``}`);return e?.truncated&&t.push(`… changed lines truncated`),t}function Fa(e){let t=e.tail??[];if(t.length===0)return[];let n=[`unchanged interactive (${t.length}):`];for(let e of t){let t=e.label?` "${e.label}"`:``;n.push(`= @${e.ref??``} [${e.role??``}]${t}`)}return e.tailTruncated&&n.push(`… more interactive elements not shown, use snapshot -i`),n}function Ia(e){let t=e.settled===!0?`settled`:`not settled`,n=e.diff?.summary;return n?`${t} after ${e.waitedMs??0}ms: +${n.additions??0} -${n.removals??0} (~${n.unchanged??0} unchanged)`:`${t} after ${e.waitedMs??0}ms`}const J={click:z(Aa),press:z(Aa),fill:z(ja),longpress:z(ja),get:({input:e,result:t})=>Da({result:t,format:e.format}),is:z(ka),find:z(Oa)};function La(e){return V(e)}const Ra={find:(e,t)=>Ha(e,t),is:(e,t)=>Ua(e,t)},za={is:E(l.is,e=>Ba(e)),find:e=>D(l.find,Va(e),{...e,findFirst:e.first,findLast:e.last})};function Ba(e){return[e.predicate,e.selector,...e.predicate===`text`?[e.value]:[]]}function Va(e){let t=e.locator&&e.locator!==`any`?[e.locator,e.query]:[e.query];switch(e.action){case void 0:case`click`:case`focus`:case`exists`:return e.action?[...t,e.action]:t;case`getText`:return[...t,`get`,`text`];case`getAttrs`:return[...t,`get`,`attrs`];case`wait`:return[...t,`wait`,...N(e.timeoutMs)];case`fill`:case`type`:return[...t,e.action,e.value]}}function Ha(t,n){let r={...Ga(n),...On(n),first:n.findFirst,last:n.findLast},i=Wa(t[0]),a=i!==void 0,o=a?t[1]:t[0],s=a?2:1,c=t[s];if(c===void 0)return{...r,locator:i,query:Ka(o)};if(c===`get`){let n=t[s+1];if(n===`text`)return{...r,locator:i,query:Ka(o),action:`getText`};if(n===`attrs`)return{...r,locator:i,query:Ka(o),action:`getAttrs`};throw new e(`INVALID_ARGS`,`find get only supports text or attrs`)}if(c===`wait`)return{...r,locator:i,query:Ka(o),action:`wait`,timeoutMs:j(t[s+1])};if(c===`fill`||c===`type`)return{...r,locator:i,query:Ka(o),action:c,value:t.slice(s+1).join(` `)};if(c===`click`||c===`focus`||c===`exists`)return{...r,locator:i,query:Ka(o),action:c};throw new e(`INVALID_ARGS`,`Unsupported find action: ${c}`)}function Ua(t,n){let r={...An(n),...On(n)},i=ct(t),a=i[0];if(a!==`text`&&a!==`visible`&&a!==`hidden`&&a!==`exists`&&a!==`editable`&&a!==`selected`&&a!==`focused`)throw new e(`INVALID_ARGS`,st,{hint:lt});let o=Vn(i.slice(1),{preferTrailingValue:a===`text`});return a===`text`?{...r,predicate:a,selector:o.selectorExpression,value:o.rest.join(` `)}:{...r,predicate:a,selector:o.selectorExpression}}function Wa(e){if(e===`text`||e===`label`||e===`value`||e===`role`||e===`id`)return e}function Ga(e){return{depth:e.snapshotDepth,raw:e.snapshotRaw}}function Ka(t){if(t===void 0||t===``)throw new e(`INVALID_ARGS`,`find requires query`);return t}const Y={get:{usageOverride:`get text|attrs <@ref|selector>`,positionalArgs:[`subcommand`,`target`],allowedFlags:[...U]},find:{usageOverride:`find <locator|text> <action> [value] [--first|--last]`,helpDescription:`Find by text/label/value/role/id and run action`,summary:`Find an element and act`,positionalArgs:[`query`,`action`,`value?`],allowsExtraPositionals:!0,allowedFlags:[`snapshotDepth`,`snapshotRaw`,`findFirst`,`findLast`]},is:{positionalArgs:[`predicate`,`selector`,`value?`],allowsExtraPositionals:!0,allowedFlags:[...U]},click:{usageOverride:`click <x y|@ref|selector>`,positionalArgs:[`target`],allowsExtraPositionals:!0,allowedFlags:[...Tr,`clickButton`,...Ya(`click`),...U]},press:{usageOverride:`press <x y|@ref|selector>`,helpDescription:`Short press a semantic UI target by ref, selector, or point. For native context menus or hold gestures, use longpress <target> <durationMs> instead of press --hold-ms.`,positionalArgs:[`targetOrX`,`y?`],allowsExtraPositionals:!0,allowedFlags:[...Tr,...Ya(`press`),...U]},longpress:{usageOverride:`longpress <x y|@ref|selector> [durationMs]`,helpDescription:`Open native context menus or long-press targets by ref, selector, or point. Duration is positional, for example longpress @e12 800 or longpress 300 500 800.`,positionalArgs:[`targetOrX`,`yOrDurationMs?`,`durationMs?`],allowsExtraPositionals:!0,allowedFlags:[...Ya(`longpress`),...U]},swipe:{helpDescription:`Swipe coordinates with optional repeat pattern`,positionalArgs:[`x1`,`y1`,`x2`,`y2`,`durationMs?`],allowedFlags:[`count`,`pauseMs`,`pattern`]},gesture:{usageOverride:`gesture <pan|fling|swipe|pinch|rotate|transform> ...`,listUsageOverride:`gesture <pan|fling|swipe|pinch|rotate|transform> ...`,helpDescription:`Run touch gestures: pan <x> <y> <dx> <dy> [durationMs], fling <up|down|left|right> <x> <y> [distance] [durationMs], swipe <left|right|left-edge|right-edge> [durationMs], pinch <scale> [x] [y], rotate <degrees> [x] [y] [velocity], or transform <x> <y> <dx> <dy> <scale> <degrees> [durationMs]. For command plans, output only command lines. Android transform verification should use all app-observable effects, for example wait text "pan changed yes", wait text "pinch changed yes", and wait text "rotate changed yes", not exact transform values.`,summary:`Run pan, fling, swipe, pinch, rotate, or transform gestures`,positionalArgs:[`pan|fling|swipe|pinch|rotate|transform`,`args?`],allowsExtraPositionals:!0},focus:{positionalArgs:[`x`,`y`]},type:{positionalArgs:[`text`],allowsExtraPositionals:!0,allowedFlags:[`delayMs`]},fill:{usageOverride:`fill <x> <y> <text> | fill <@ref|selector> <text>`,positionalArgs:[`targetOrX`,`yOrText`,`text?`],allowsExtraPositionals:!0,allowedFlags:[...U,`delayMs`,...Ya(`fill`)]},scroll:{usageOverride:`scroll <direction|top|bottom> [amount] [--pixels <n>] [--duration-ms <ms>]`,helpDescription:`Scroll in a direction, or toward the top/bottom edge of scrollable content.`,summary:`Scroll in a direction or to an edge`,positionalArgs:[`directionOrEdge`,`amount?`],allowedFlags:[`pixels`,`durationMs`]}},{gesture:qa,...Ja}=ua;function Ya(e){let t=[];return i(e)&&t.push(`verify`),s(e)&&t.push(...Er),t}const Xa=R(X(`click`),(e,t)=>e.interactions.click(lo(t))),Za=R(X(`press`),(e,t)=>e.interactions.press(uo(t))),Qa=R(X(`fill`),(e,t)=>e.interactions.fill(fo(t))),$a=R(X(`longpress`),(e,t)=>e.interactions.longPress(po(t))),eo=R(X(`swipe`),(e,t)=>e.interactions.swipe(t)),to=R(X(`focus`),(e,t)=>e.interactions.focus(t)),no=R(X(`type`),(e,t)=>e.interactions.type(t)),ro=R(X(`scroll`),(e,t)=>e.interactions.scroll(t)),io=R(X(`get`),(e,t)=>e.interactions.get(ho(t))),ao=R(X(`is`),(e,t)=>e.interactions.is(t)),oo=R(X(`find`),(e,t)=>e.interactions.find(t)),so=R(X(`gesture`),async(e,t)=>{switch(t.kind){case`pan`:return await e.interactions.pan(go(t));case`fling`:return await e.interactions.fling(_o(t));case`swipe`:return await e.interactions.swipeGesture(vo(t));case`pinch`:return await e.interactions.pinch(yo(t));case`rotate`:return await e.interactions.rotateGesture(bo(t));case`transform`:return await e.interactions.transformGesture(xo(t))}}),co=L({name:`interaction`,clientSurface:!1,commands:[I({name:`click`,metadata:X(`click`),definition:Xa,cliSchema:Y.click,cliReader:K.click,daemonWriter:q.click,cliOutputFormatter:J.click}),I({name:`press`,metadata:X(`press`),definition:Za,cliSchema:Y.press,cliReader:K.press,daemonWriter:q.press,cliOutputFormatter:J.press}),I({name:`fill`,metadata:X(`fill`),definition:Qa,cliSchema:Y.fill,cliReader:K.fill,daemonWriter:q.fill,cliOutputFormatter:J.fill}),I({name:`longpress`,metadata:X(`longpress`),definition:$a,cliSchema:Y.longpress,cliReader:K.longpress,daemonWriter:q.longpress,cliOutputFormatter:J.longpress}),I({name:`swipe`,metadata:X(`swipe`),definition:eo,cliSchema:Y.swipe,cliReader:K.swipe,daemonWriter:q.swipe}),I({name:`focus`,metadata:X(`focus`),definition:to,cliSchema:Y.focus,cliReader:K.focus,daemonWriter:q.focus}),I({name:`type`,metadata:X(`type`),definition:no,cliSchema:Y.type,cliReader:K.type,daemonWriter:q.type}),I({name:`scroll`,metadata:X(`scroll`),definition:ro,cliSchema:Y.scroll,cliReader:K.scroll,daemonWriter:q.scroll}),I({name:`get`,metadata:X(`get`),definition:io,cliSchema:Y.get,cliReader:K.get,daemonWriter:q.get,cliOutputFormatter:J.get}),I({name:`is`,metadata:X(`is`),definition:ao,cliSchema:Y.is,cliReader:Ra.is,daemonWriter:za.is,cliOutputFormatter:J.is}),I({name:`find`,metadata:X(`find`),definition:oo,cliSchema:Y.find,cliReader:Ra.find,daemonWriter:za.find,cliOutputFormatter:J.find}),I({name:`gesture`,metadata:X(`gesture`),definition:so,cliSchema:Y.gesture,cliReader:la.gesture,daemonWriter:ua.gesture,extraDaemonWriters:Ja})]});function X(e){let t=oa.find(t=>t.name===e);if(!t)throw Error(`Missing interaction command metadata for ${e}`);return t}function lo(e){return{...C(e),...dn(e.target),...mn(e),...pn(e),button:e.button,verify:e.verify,...mo(e)}}function uo(e){return{...C(e),...dn(e.target),...mn(e),...pn(e),verify:e.verify,...mo(e)}}function fo(e){return{...C(e),...dn(e.target),...mn(e),text:e.text,delayMs:e.delayMs,verify:e.verify,...mo(e)}}function po(e){return{...C(e),...dn(e.target),...mn(e),durationMs:e.durationMs,...mo(e)}}function mo(e){return{settle:e.settle,settleQuietMs:e.settleQuietMs,timeoutMs:e.timeoutMs}}function ho(e){return{...C(e),...fn(e.target),...mn(e),format:e.format}}function go(e){return{...C(e),x:e.origin.x,y:e.origin.y,dx:e.delta.x,dy:e.delta.y,durationMs:e.durationMs}}function _o(e){return{...C(e),direction:e.direction,x:e.origin.x,y:e.origin.y,distance:e.distance,durationMs:e.durationMs}}function vo(e){return{...C(e),preset:e.preset,durationMs:e.durationMs}}function yo(e){return{...C(e),scale:e.scale,x:e.origin?.x,y:e.origin?.y}}function bo(e){return{...C(e),degrees:e.degrees,x:e.origin?.x,y:e.origin?.y,velocity:e.velocity}}function xo(e){return{...C(e),x:e.origin.x,y:e.origin.y,dx:e.delta.x,dy:e.delta.y,scale:e.scale,degrees:e.degrees,durationMs:e.durationMs}}function So(e){return{data:{devices:e.map(We)},text:e.map(Fo).join(`
5
- `)}}function Co(e){return{data:{device:We(e.device),availableCommands:e.availableCommands},text:[`${Fo(e.device)} supports ${e.availableCommands.length} commands:`,e.availableCommands.join(` `)].join(`
6
- `)}}function wo(e){return{data:{apps:e.result},stderr:e.appsFilter===`all`?`Showing all apps, including system apps.
1
+ import{_ as e,n as t,t as n}from"./sdk-contracts.js";import{$ as r,B as i,D as a,O as o,R as s,T as c,c as ee,d as te,et as ne,i as re,l as ie,m as l,r as ae,s as oe,u as se}from"./sdk-batch-runner.js";import{Bt as ce,Dn as le,En as ue,Fn as de,Ft as fe,Gn as pe,Gt as me,Ht as he,In as ge,It as _e,Jn as ve,Mt as ye,Nn as be,Nt as xe,On as Se,Ot as Ce,Pn as we,Pt as Te,Qt as Ee,Rt as De,Sn as Oe,St as ke,Tt as Ae,Vt as je,Wt as Me,Xn as Ne,Yt as Pe,Zn as Fe,_t as Ie,a as Le,an as Re,ar as ze,bn as Be,c as Ve,cr as u,ft as He,g as Ue,gt as We,h as Ge,ht as Ke,i as qe,in as Je,it as Ye,jt as Xe,kn as Ze,m as Qe,mt as $e,n as et,nr as tt,o as nt,or as rt,pt as it,qn as at,s as ot,sr as st,tr as ct,u as lt,un as ut,v as dt,vt as ft,xn as pt,zt as mt}from"./recording-export-quality.js";import{n as ht,t as gt}from"./sdk-device.js";import{D as _t,T as vt,b as yt,ct as bt,x as xt,y as St}from"./sdk-selectors.js";import{n as Ct,t as wt}from"./sdk-app-inventory.js";let Tt=!1;function Et(){Tt=!0}function Dt(){let e=Tt;return Tt=!1,e}const Ot=[`ref`,`selector`,`point`];function kt(e,t=[]){return{type:`object`,properties:{...mn(),...e},...t.length>0?{required:t}:{},additionalProperties:!1}}function At(e){return{type:`object`,description:e,properties:{x:{type:`number`},y:{type:`number`}},required:[`x`,`y`],additionalProperties:!1}}function jt(e,t){return{type:`string`,enum:e,...t?{description:t}:{}}}function d(e){return{type:`string`,...e?{description:e}:{}}}function Mt(e){return{type:`number`,...e?{description:e}:{}}}function Nt(e){return{type:`integer`,...e?{description:e}:{}}}function Pt(e){return{type:`boolean`,...e?{description:e}:{}}}function Ft(e){return{type:`array`,items:{type:`string`},...e?{description:e}:{}}}function It(e){return{type:`object`,additionalProperties:!0,...e?{description:e}:{}}}function f(e){return{...e,required:!0}}function p(e){return w(d(e),x)}function m(e){return w(Mt(e),$t)}function h(e,t={}){return w(ln(e,t),(e,n)=>me(e,n,t))}function g(e){return w(Pt(e),en)}function _(e,t){return w(jt(e,t),(t,n)=>nn(t,n,e))}function Lt(e){return w(It(e),fn)}function Rt(e){return w(Ft(e),pn)}function v(e){return w(e,(e,t)=>e[t])}function zt(e,t){return w(e,t)}function Bt(){return w(hn(),(e,t)=>e[t]===void 0?void 0:Jt(e,t))}function Vt(){return w(gn(),(e,t)=>e[t]===void 0?void 0:Yt(e,t))}function Ht(e){return w(At(e),(e,t)=>e[t]===void 0?void 0:Xt(e,t))}function y(){return{depth:h(`Snapshot traversal depth.`,{min:0}),scope:p(`Snapshot scope selector used before resolution.`),raw:g(`Use raw snapshot data during selector resolution.`)}}function Ut(){return{count:h(`Number of press/click repetitions.`,{min:1}),intervalMs:h(`Delay between repeated press/click actions.`,{min:0}),holdMs:h(`Hold duration for each action.`,{min:0}),jitterPx:h(`Randomization radius in pixels.`,{min:0}),doubleTap:g(`Request a double-tap action.`)}}function b(e){return kt(un(e),dn(e))}function Wt(t,n){let r=Gt(t),i=Object.fromEntries(Object.entries(n).flatMap(([t,n])=>{let i=n.read(r,t);if(n.required&&i===void 0)throw new e(`INVALID_ARGS`,`Expected ${t} to be set.`);return i===void 0?[]:[[t,i]]})),a=Kt(r,{readTargetAlias:!Object.hasOwn(n,`target`)});return C({...a,...S(a),...i})}function Gt(t){if(t==null)return{};if(!t||typeof t!=`object`||Array.isArray(t))throw new e(`INVALID_ARGS`,`Expected object arguments.`);return t}function Kt(e,t={}){return{session:x(e,`session`),platform:nn(e,`platform`,ht),deviceTarget:qt(e,t),device:x(e,`device`),udid:x(e,`udid`),serial:x(e,`serial`),iosSimulatorDeviceSet:x(e,`iosSimulatorDeviceSet`),iosXctestrunFile:x(e,`iosXctestrunFile`),iosXctestDerivedDataPath:x(e,`iosXctestDerivedDataPath`),iosXctestEnvDir:x(e,`iosXctestEnvDir`),androidDeviceAllowlist:x(e,`androidDeviceAllowlist`),noRecord:en(e,`noRecord`),daemonBaseUrl:x(e,`daemonBaseUrl`),daemonAuthToken:x(e,`daemonAuthToken`),tenant:x(e,`tenant`),runId:x(e,`runId`),leaseId:x(e,`leaseId`),cwd:x(e,`cwd`),debug:en(e,`debug`)}}function qt(t,n){let r=nn(t,`deviceTarget`,gt);if(n.readTargetAlias===!1||t.target===void 0)return r;let i=nn(t,`target`,gt);if(r!==void 0&&i!==r)throw new e(`INVALID_ARGS`,`Expected target alias to match deviceTarget when both are set.`);return r??i}function Jt(e,t){let n=vn(e,t),r=tn(n,`kind`,Ot);switch(r){case`ref`:return{kind:r,ref:Zt(n,`ref`),label:x(n,`label`)};case`selector`:return{kind:r,selector:Zt(n,`selector`)};case`point`:return{kind:r,x:Qt(n,`x`),y:Qt(n,`y`)}}}function Yt(e,t){let n=vn(e,t),r=tn(n,`kind`,[`ref`,`selector`]);return r===`ref`?{kind:r,ref:Zt(n,`ref`),label:x(n,`label`)}:{kind:r,selector:Zt(n,`selector`)}}function Xt(e,t){let n=vn(e,t);return{x:Qt(n,`x`),y:Qt(n,`y`)}}function Zt(t,n){let r=t[n];if(typeof r!=`string`||r.length===0)throw new e(`INVALID_ARGS`,`Expected ${n} to be a non-empty string.`);return r}function x(t,n){let r=t[n];if(r!==void 0){if(typeof r!=`string`||r.length===0)throw new e(`INVALID_ARGS`,`Expected ${n} to be a non-empty string.`);return r}}function Qt(t,n){let r=t[n];if(typeof r!=`number`||!Number.isFinite(r))throw new e(`INVALID_ARGS`,`Expected ${n} to be a finite number.`);return r}function $t(t,n){let r=t[n];if(r!==void 0){if(typeof r!=`number`||!Number.isFinite(r))throw new e(`INVALID_ARGS`,`Expected ${n} to be a finite number.`);return r}}function en(t,n){let r=t[n];if(r!==void 0){if(typeof r!=`boolean`)throw new e(`INVALID_ARGS`,`Expected ${n} to be a boolean.`);return r}}function tn(t,n,r){let i=t[n];if(typeof i!=`string`||!r.includes(i))throw new e(`INVALID_ARGS`,`Expected ${n} to be one of: ${r.join(`, `)}.`);return i}function nn(t,n,r){let i=t[n];if(i!==void 0){if(typeof i!=`string`||!r.includes(i))throw new e(`INVALID_ARGS`,`Expected ${n} to be one of: ${r.join(`, `)}.`);return i}}function S(e){return C({noRecord:e.noRecord,session:e.session,platform:e.platform,target:e.deviceTarget,device:e.device,udid:e.udid,serial:e.serial,iosSimulatorDeviceSet:e.iosSimulatorDeviceSet,iosXctestrunFile:e.iosXctestrunFile,iosXctestDerivedDataPath:e.iosXctestDerivedDataPath,iosXctestEnvDir:e.iosXctestEnvDir,androidDeviceAllowlist:e.androidDeviceAllowlist,daemonBaseUrl:e.daemonBaseUrl,daemonAuthToken:e.daemonAuthToken,tenant:e.tenant,runId:e.runId,leaseId:e.leaseId,cwd:e.cwd,debug:e.debug})}function rn(e){switch(e.kind){case`ref`:return{ref:e.ref,label:e.label};case`selector`:return{selector:e.selector};case`point`:return{x:e.x,y:e.y}}}function an(e){switch(e.kind){case`ref`:return{ref:e.ref,label:e.label};case`selector`:return{selector:e.selector}}}function on(e){return{count:e.count,intervalMs:e.intervalMs,holdMs:e.holdMs,jitterPx:e.jitterPx,doubleTap:e.doubleTap}}function sn(e){return{depth:e.depth,scope:e.scope,raw:e.raw}}function cn(t,n,r){let i=new Set(n),a=Object.keys(t).filter(e=>!i.has(e));if(a.length>0)throw new e(`INVALID_ARGS`,`${r} has unknown field(s): ${a.join(`, `)}.`)}function C(e){return Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0))}function w(e,t){return{schema:e,required:!1,read:t}}function ln(e,t){return{...Nt(e),...t.min===void 0?{}:{minimum:t.min},...t.max===void 0?{}:{maximum:t.max}}}function un(e){return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,t.schema]))}function dn(e){return Object.entries(e).flatMap(([e,t])=>t.required?[e]:[])}function fn(t,n){let r=t[n];if(r!==void 0){if(!r||typeof r!=`object`||Array.isArray(r))throw new e(`INVALID_ARGS`,`Expected ${n} to be an object.`);return r}}function pn(t,n){let r=t[n];if(r!==void 0){if(!Array.isArray(r)||r.some(e=>typeof e!=`string`))throw new e(`INVALID_ARGS`,`Expected ${n} to be an array of strings.`);return r}}function mn(){return{session:{type:`string`,description:`Agent-device session name.`},platform:{type:`string`,enum:ht,description:`Platform selector used to resolve a device.`},deviceTarget:{type:`string`,enum:gt,description:`Device target form. Maps to the CLI --target flag.`},target:{type:`string`,enum:gt,description:`Alias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.`},device:{type:`string`,description:`Device name selector.`},udid:{type:`string`,description:`iOS device UDID selector.`},serial:{type:`string`,description:`Android device or Vega VVD serial selector.`},iosSimulatorDeviceSet:{type:`string`,description:`iOS simulator device-set path used for device resolution.`},iosXctestrunFile:{type:`string`,description:`Externally built iOS XCTest runner .xctestrun artifact path.`},iosXctestDerivedDataPath:{type:`string`,description:`Derived data path for external iOS XCTest runner execution.`},iosXctestEnvDir:{type:`string`,description:`Writable directory for iOS XCTest runner env overlays.`},androidDeviceAllowlist:{type:`string`,description:`Android serial allowlist used for device resolution.`},daemonBaseUrl:{type:`string`,description:`Remote daemon base URL.`},daemonAuthToken:{type:`string`,description:`Remote daemon auth token.`},tenant:{type:`string`,description:`Remote tenant identifier.`},runId:{type:`string`,description:`Lease run identifier.`},leaseId:{type:`string`,description:`Existing lease identifier.`},cwd:{type:`string`,description:`Working directory for command execution.`},debug:{type:`boolean`,description:`Enable debug diagnostics.`}}}function hn(){return{oneOf:[..._n(),{type:`object`,properties:{kind:{type:`string`,const:`point`},x:{type:`number`},y:{type:`number`}},required:[`kind`,`x`,`y`],additionalProperties:!1}],description:`UI target. This is separate from deviceTarget, which selects the device form.`}}function gn(){return{oneOf:_n(),description:`UI element target by snapshot ref or selector expression.`}}function _n(){return[{type:`object`,properties:{kind:{type:`string`,const:`ref`},ref:{type:`string`,description:`Snapshot element ref such as @e12.`},label:{type:`string`,description:`Optional human label for the ref.`}},required:[`kind`,`ref`],additionalProperties:!1},{type:`object`,properties:{kind:{type:`string`,const:`selector`},selector:{type:`string`,description:`Agent-device selector expression.`}},required:[`kind`,`selector`],additionalProperties:!1}]}function vn(t,n){let r=t[n];if(!r||typeof r!=`object`||Array.isArray(r))throw new e(`INVALID_ARGS`,`Expected ${n} to be an object.`);return r}function T(e,t){return n=>E(e,t?t(n):[],n)}function E(e,t,n,r){return{command:e,positionals:t,...r?{input:r}:{},options:yn(n)}}function yn(e){let t=bn(e.deviceTarget??e.target);if(t===void 0&&e.target===void 0)return e;let{target:n,...r}=e;return t===void 0?r:{...r,target:t}}function bn(e){return e===`mobile`||e===`tv`||e===`desktop`?e:void 0}function D(e){return C({noRecord:e.noRecord,session:e.session,platform:e.platform,deviceTarget:e.target,device:e.device,udid:e.udid,serial:e.serial,iosSimulatorDeviceSet:e.iosSimulatorDeviceSet,iosXctestrunFile:e.iosXctestrunFile,iosXctestDerivedDataPath:e.iosXctestDerivedDataPath,iosXctestEnvDir:e.iosXctestEnvDir,androidDeviceAllowlist:e.androidDeviceAllowlist})}function xn(e){return C({record:e.record})}function Sn(e){return{noRecord:e.noRecord,platform:e.platform,target:e.target,device:e.device,udid:e.udid,serial:e.serial,iosSimulatorDeviceSet:e.iosSimulatorDeviceSet,androidDeviceAllowlist:e.androidDeviceAllowlist}}function Cn(e){return C({depth:e.snapshotDepth,scope:e.snapshotScope,raw:e.snapshotRaw})}function wn(e){return{depth:e.snapshotDepth,scope:e.snapshotScope,raw:e.snapshotRaw}}function Tn(e){return C({settle:e.settle,settleQuietMs:e.settleQuietMs,timeoutMs:e.timeoutMs})}function En(e){return C({count:e.count,intervalMs:e.intervalMs,holdMs:e.holdMs,jitterPx:e.jitterPx,doubleTap:e.doubleTap})}function Dn(e){if(`ref`in e&&e.ref!==void 0)return C({kind:`ref`,ref:e.ref,label:e.label});if(`selector`in e&&e.selector!==void 0)return{kind:`selector`,selector:e.selector};let t=e;return{kind:`point`,x:t.x,y:t.y}}function On(t){let n=An(t);if(typeof n.ref==`string`)return[n.ref,...Mn(n.label)];if(typeof n.selector==`string`)return[n.selector];if(n.kind===`point`||n.x!==void 0||n.y!==void 0)return[String(jn(n.x,`x`)),String(jn(n.y,`y`))];throw new e(`INVALID_ARGS`,`interaction requires @ref, selector, or point target`)}function kn(t){let n=An(t);if(typeof n.ref==`string`)return[n.ref,...Mn(n.label)];if(typeof n.selector==`string`)return[n.selector];throw new e(`INVALID_ARGS`,`element command requires @ref or selector target`)}function An(t){if(!t||typeof t!=`object`||Array.isArray(t))throw new e(`INVALID_ARGS`,`Expected target object.`);let n=t,r=n.target;return r&&typeof r==`object`&&!Array.isArray(r)?r:n}function jn(t,n){if(typeof t!=`number`||!Number.isFinite(t))throw new e(`INVALID_ARGS`,`point target requires numeric ${n}.`);return t}function Mn(e){return typeof e==`string`&&e.length>0?[e]:[]}function Nn(t){let n=yt(t);if(!n.ok)throw new e(n.code,n.message);return`ref`in n?{ref:n.ref,label:Ln(t.slice(1))}:{selector:n.selector}}function Pn(t){let n=xt(t);if(!n.ok)throw new e(n.code,n.message);return n.format}function Fn(t,n={}){let i=r(t,n);if(!i)throw new e(`INVALID_ARGS`,St);return i}function In(t,n){try{let e=JSON.parse(t);if(e&&typeof e==`object`&&!Array.isArray(e))return e}catch{}throw new e(`INVALID_ARGS`,`${n} must be a JSON object`)}function Ln(e){return e.join(` `).trim()||void 0}function O(...e){return new Set(e)}function k(e,t){return e!==void 0&&t.has(e)}function Rn(e){return e===void 0||e.trim()===``?!1:Number.isFinite(Number(e))}function zn(t,n){if(t===void 0)return;let r=Number(t);if(Number.isFinite(r))return r;throw new e(`INVALID_ARGS`,`${n} must be a finite number.`)}function Bn(e){return e===void 0?void 0:Number(e)}function A(e){return e===void 0?[]:[e]}function j(e){return e===void 0?[]:[String(e)]}function M(t,n){if(t===void 0||t===``)throw new e(`INVALID_ARGS`,n);return t}function N(t,n){if(typeof t!=`string`||t.length===0)throw new e(`INVALID_ARGS`,n);return t}function P(e){return e}function F(e){let t={},n={},r={},i={},a={};for(let o of e.commands){o.cliSchema&&I(t,`CLI schema`,o.name,o.cliSchema);let e=o.definition.projection?.clientMethod??o.clientMethod;e&&I(n,`client command method`,e,o.name),I(r,`CLI reader`,o.name,o.cliReader),o.daemonWriter&&I(i,`daemon writer`,o.name,o.daemonWriter),o.cliOutputFormatter&&I(a,`CLI output formatter`,o.name,o.cliOutputFormatter)}return{name:e.name,clientSurface:e.clientSurface,metadata:e.commands.map(e=>e.metadata),definitions:e.commands.map(e=>e.definition),clientCommandMethods:n,cliSchemas:t,cliReaders:r,daemonWriters:i,cliOutputFormatters:a}}function Vn(e){let t={};for(let n of e)n.projection&&I(t,`command output schema`,n.name,n.projection.outputSchema);return t}function I(e,t,n,r){if(Object.hasOwn(e,n))throw Error(`Duplicate command family ${t}: ${n}`);e[n]=r}function L(e){return e}function R(e,t,n){return{...e,run:t,invoke:async(n,r)=>await t(n,e.readInput(r)),...n?{projection:n}:{}}}function z(e){return({result:t})=>e(t)}const B=z(V);function V(e){return{data:e,text:Fe(e)}}function Hn(e){let t=[`Batch completed: ${e.executed}/${e.total} steps in ${e.totalDurationMs}ms`];for(let n of e.results)t.push(Wn(n));return{data:e,text:t.join(`
2
+ `)}}const Un={batch:z(Hn)};function Wn(e){let t=Fe(e.data)??e.command;return`${e.step}. OK ${t} (${e.durationMs}ms)`}function Gn(e=ae){let t=Kn(e);return L({name:`batch`,description:`Run multiple structured command steps in one daemon request.`,inputSchema:b(t),readInput:e=>Jn(e,t)})}function Kn(e){return{steps:f(zt({type:`array`,description:`Structured batch steps. Each step uses a command name and the same input object as that command tool.`,items:qn(e)},(t,n)=>Yn(t[n],e))),onError:_([`stop`],`Batch failure policy.`),maxSteps:h(`Maximum number of steps accepted for this batch.`,{min:1,max:1e3}),out:p(`Optional output path for command artifacts.`)}}function qn(e){return{type:`object`,properties:{command:{type:`string`,enum:e,description:`Command name to run with structured input.`},input:{type:`object`,additionalProperties:!0,description:`Structured command input for the nested command. Use the matching MCP tool schema for this object.`},runtime:{type:`object`,additionalProperties:!0,description:`Optional per-step runtime payload.`}},required:[`command`,`input`],additionalProperties:!1}}function Jn(t,n){let r=Wt(t,n),i=r.maxSteps??100;if(!ee(i))throw new e(`INVALID_ARGS`,`Invalid batch maxSteps: ${String(r.maxSteps)}`);return oe(r.steps.length,i),{...r}}function Yn(t,n){if(!Array.isArray(t))throw new e(`INVALID_ARGS`,`Expected steps to be an array.`);return t.map((e,t)=>Xn(e,t+1,n))}function Xn(e,t,n){let r=te(e,t);return cn(r,[`command`,`input`,`runtime`],`Batch step ${t}`),{command:Zn(r,t,n),input:se(r,t),...Qn(r,t)}}function Zn(t,n,r){if(r===ae)return re(t.command,n);let i=t.command;if(typeof i!=`string`||!r.includes(i))throw new e(`INVALID_ARGS`,`Expected command to be one of: ${r.join(`, `)}.`);return i}function Qn(e,t){let n=ie(e.runtime,t);return n===void 0?{}:{runtime:n}}const $n=[{key:`count`,names:[`--count`],type:`int`,min:1,max:200,usageLabel:`--count <n>`,usageDescription:`Repeat count for press/swipe series`},{key:`pointerCount`,names:[`--pointer-count`],type:`int`,min:1,max:2,usageLabel:`--pointer-count <1|2>`,usageDescription:`Gesture pan: number of touch pointers (default 1)`},{key:`fps`,names:[`--fps`],type:`int`,min:1,max:120,usageLabel:`--fps <n>`,usageDescription:`Record: target frames per second (iOS physical device runner)`},{key:`quality`,names:[`--quality`],type:`string`,usageLabel:`--quality <medium|high>`,usageDescription:`Record: output quality preset; Android maps this to screenrecord bitrate, Apple targets use it for export/encoding. Legacy numeric values 5-7 map to medium; 8-10 map to high`},{key:`hideTouches`,names:[`--hide-touches`],type:`boolean`,usageLabel:`--hide-touches`,usageDescription:`Record: skip touch-overlay post-processing for faster raw benchmark videos`},{key:`recordingScope`,names:[`--scope`],type:`enum`,enumValues:ve,usageLabel:`--scope <app|device|system>`,usageDescription:`Record: app requires an active app session; device/system records the whole screen`},{key:`intervalMs`,names:[`--interval-ms`],type:`int`,min:0,max:1e4,usageLabel:`--interval-ms <ms>`,usageDescription:`Delay between press iterations`},{key:`delayMs`,names:[`--delay-ms`],type:`int`,min:0,max:1e4,usageLabel:`--delay-ms <ms>`,usageDescription:`Delay between typed characters`},{key:`recordAs`,names:[`--record-as`],type:`string`,usageLabel:`--record-as <VAR>`,usageDescription:"Fill: send the live text but publish ${VAR} in an armed .ad recording"},{key:`durationMs`,names:[`--duration-ms`],type:`int`,min:0,max:1e4,usageLabel:`--duration-ms <ms>`,usageDescription:`Scroll: pace the gesture over this duration when supported`},{key:`holdMs`,names:[`--hold-ms`],type:`int`,min:0,max:1e4,usageLabel:`--hold-ms <ms>`,usageDescription:`Press hold duration for each iteration`},{key:`jitterPx`,names:[`--jitter-px`],type:`int`,min:0,max:100,usageLabel:`--jitter-px <n>`,usageDescription:`Deterministic coordinate jitter radius for press`},{key:`pixels`,names:[`--pixels`],type:`int`,min:1,max:1e5,usageLabel:`--pixels <n>`,usageDescription:`Scroll: explicit gesture distance in pixels`},{key:`doubleTap`,names:[`--double-tap`],type:`boolean`,usageLabel:`--double-tap`,usageDescription:`Use double-tap gesture per press iteration`},{key:`verify`,names:[`--verify`],type:`boolean`,usageLabel:`--verify`,usageDescription:`Capture cheap post-action evidence (AX digest, node counts, changedFromBefore) instead of a follow-up snapshot`},{key:`settle`,names:[`--settle`],type:`boolean`,usageLabel:`--settle`,usageDescription:`After the action, wait for the UI to go quiet and return the settled diff vs the pre-action tree in the same response (best-effort; never fails the action)`},{key:`settleQuietMs`,names:[`--settle-quiet`],type:`int`,min:0,usageLabel:`--settle-quiet <ms>`,usageDescription:`Settle: quiet window the UI must hold to count as settled (default 500ms)`},{key:`clickButton`,names:[`--button`],type:`enum`,enumValues:[`primary`,`secondary`,`middle`],usageLabel:`--button primary|secondary|middle`,usageDescription:`Click: choose mouse button (middle reserved for future macOS support)`},{key:`backMode`,names:[`--in-app`],type:`enum`,enumValues:[`in-app`,`system`],setValue:`in-app`,usageLabel:`--in-app`,usageDescription:`Back: use app-provided back UI when available`},{key:`backMode`,names:[`--system`],type:`enum`,enumValues:[`in-app`,`system`],setValue:`system`,usageLabel:`--system`,usageDescription:`Back: use system back input or gesture when available`},{key:`pauseMs`,names:[`--pause-ms`],type:`int`,min:0,max:1e4,usageLabel:`--pause-ms <ms>`,usageDescription:`Delay between swipe iterations`},{key:`pattern`,names:[`--pattern`],type:`enum`,enumValues:[`one-way`,`ping-pong`],usageLabel:`--pattern one-way|ping-pong`,usageDescription:`Swipe repeat pattern`},{key:`verbose`,names:[`--debug`,`--verbose`,`-v`],type:`boolean`,usageLabel:`--debug, --verbose, -v`,usageDescription:`Enable debug diagnostics; test --verbose prints per-test step timings without debug logs`},{key:`cost`,names:[`--cost`],type:`boolean`,usageLabel:`--cost`,usageDescription:`Include per-command wall-clock latency (cost.wallClockMs) in the response`},{key:`responseLevel`,names:[`--level`],type:`enum`,enumValues:t,usageLabel:`--level digest|default|full`,usageDescription:`Response detail level: digest (token-cheap), default (today), or full. Default keeps the wire shape unchanged.`},{key:`json`,names:[`--json`],type:`boolean`,usageLabel:`--json`,usageDescription:`JSON output`},{key:`help`,names:[`--help`,`-h`],type:`boolean`,usageLabel:`--help, -h`,usageDescription:`Print help and exit`},{key:`version`,names:[`--version`,`-V`],type:`boolean`,usageLabel:`--version, -V`,usageDescription:`Print version and exit`},{key:`snapshotDiff`,names:[`--diff`],type:`boolean`,usageLabel:`--diff`,usageDescription:`Snapshot: show structural diff against the previous session baseline`},{key:`saveScript`,names:[`--save-script`],type:`booleanOrString`,usageLabel:`--save-script [path]`,usageDescription:`Save session script (.ad) on close; optional custom output path`},{key:`networkInclude`,names:[`--include`],type:`enum`,enumValues:[`summary`,`headers`,`body`,`all`],usageLabel:`--include summary|headers|body|all`,usageDescription:`Network: include headers, bodies, or both in output`},{key:`shutdown`,names:[`--shutdown`],type:`boolean`,usageLabel:`--shutdown`,usageDescription:`close: shutdown associated simulator/emulator after ending session`},{key:`relaunch`,names:[`--relaunch`],type:`boolean`,usageLabel:`--relaunch`,usageDescription:`open: terminate app process before launching it`},{key:`restart`,names:[`--restart`],type:`boolean`,usageLabel:`--restart`,usageDescription:`logs clear: stop active stream, clear logs, then start streaming again`},{key:`retainPaths`,names:[`--retain-paths`],type:`boolean`,usageLabel:`--retain-paths`,usageDescription:`install-from-source: keep materialized artifact paths after install`},{key:`retentionMs`,names:[`--retention-ms`],type:`int`,min:1,usageLabel:`--retention-ms <ms>`,usageDescription:`install-from-source: retention TTL for materialized artifact paths`},{key:`noRecord`,names:[`--no-record`],type:`boolean`,usageLabel:`--no-record`,usageDescription:`Do not record this action`},{key:`record`,names:[`--record`],type:`boolean`,usageLabel:`--record`,usageDescription:`Force-record this action even though its command is observation-only and would otherwise be excluded from a repair-armed heal by default (mutually exclusive with --no-record)`}],er=[{key:`config`,names:[`--config`],type:`string`,usageLabel:`--config <path>`,usageDescription:`Load CLI defaults from a specific config file`},{key:`remoteConfig`,names:[`--remote-config`],type:`string`,usageLabel:`--remote-config <path>`,usageDescription:`Load remote host + Metro workflow settings from a specific profile file`},{key:`stateDir`,names:[`--state-dir`],type:`string`,usageLabel:`--state-dir <path>`,usageDescription:`Daemon state directory (defaults to ~/.agent-device for packages, or a worktree-scoped dev dir from source)`},{key:`daemonBaseUrl`,names:[`--daemon-base-url`],type:`string`,usageLabel:`--daemon-base-url <url>`,usageDescription:`Explicit remote HTTP daemon base URL (skip local daemon discovery/startup)`},{key:`daemonAuthToken`,names:[`--daemon-auth-token`],type:`string`,usageLabel:`--daemon-auth-token <token>`,usageDescription:`Remote HTTP daemon or proxy auth token (sent as request token and bearer header)`},{key:`daemonTransport`,names:[`--daemon-transport`],type:`enum`,enumValues:[`auto`,`socket`,`http`],usageLabel:`--daemon-transport auto|socket|http`,usageDescription:`Daemon client transport preference`},{key:`daemonServerMode`,names:[`--daemon-server-mode`],type:`enum`,enumValues:[`socket`,`http`,`dual`],usageLabel:`--daemon-server-mode socket|http|dual`,usageDescription:`Daemon server mode used when spawning daemon`},{key:`proxyHost`,names:[`--host`],type:`string`,usageLabel:`--host <host>`,usageDescription:`Proxy: host interface to bind (default: 127.0.0.1)`},{key:`proxyPort`,names:[`--port`],type:`int`,min:1,max:65535,usageLabel:`--port <port>`,usageDescription:`Proxy: TCP port to bind (default: 0, choose a free port)`},{key:`tenant`,names:[`--tenant`],type:`string`,usageLabel:`--tenant <id>`,usageDescription:`Tenant scope identifier for isolated daemon sessions`},{key:`sessionIsolation`,names:[`--session-isolation`],type:`enum`,enumValues:[`none`,`tenant`],usageLabel:`--session-isolation none|tenant`,usageDescription:`Session isolation strategy (tenant prefixes session namespace)`},{key:`runId`,names:[`--run-id`],type:`string`,usageLabel:`--run-id <id>`,usageDescription:`Run identifier used for tenant lease admission checks`},{key:`leaseId`,names:[`--lease-id`],type:`string`,usageLabel:`--lease-id <id>`,usageDescription:`Lease identifier bound to tenant/run admission scope`},{key:`leaseBackend`,names:[`--lease-backend`],type:`enum`,enumValues:[`ios-simulator`,`ios-instance`,`android-instance`],usageLabel:`--lease-backend ios-simulator|ios-instance|android-instance`,usageDescription:`Lease backend for remote tenant connection admission`},{key:`provider`,names:[`--provider`],type:`string`,usageLabel:`--provider <name>`,usageDescription:`Cloud provider name for provider-scoped commands`},{key:`providerSessionId`,names:[`--provider-session`],type:`string`,usageLabel:`--provider-session <id>`,usageDescription:`Cloud provider session id or ARN`},{key:`providerApp`,names:[`--provider-app`],type:`string`,usageLabel:`--provider-app <ref-or-path>`,usageDescription:`Cloud provider app reference or local app path used when creating hosted WebDriver sessions`},{key:`providerOsVersion`,names:[`--provider-os-version`,`--os-version`],type:`string`,usageLabel:`--provider-os-version <version>`,usageDescription:`Hosted cloud provider OS version, for example 17 or 14.0`},{key:`providerProject`,names:[`--provider-project`],type:`string`,usageLabel:`--provider-project <name>`,usageDescription:`Hosted cloud provider project label`},{key:`providerBuild`,names:[`--provider-build`],type:`string`,usageLabel:`--provider-build <name>`,usageDescription:`Hosted cloud provider build label`},{key:`providerSessionName`,names:[`--provider-session-name`],type:`string`,usageLabel:`--provider-session-name <name>`,usageDescription:`Hosted cloud provider session label`},{key:`awsProjectArn`,names:[`--aws-project-arn`],type:`string`,usageLabel:`--aws-project-arn <arn>`,usageDescription:`AWS Device Farm project ARN for hosted WebDriver sessions`},{key:`awsDeviceArn`,names:[`--aws-device-arn`],type:`string`,usageLabel:`--aws-device-arn <arn>`,usageDescription:`AWS Device Farm device ARN for hosted WebDriver sessions`},{key:`awsAppArn`,names:[`--aws-app-arn`],type:`string`,usageLabel:`--aws-app-arn <arn>`,usageDescription:`AWS Device Farm app ARN attached to hosted remote access sessions`},{key:`awsRegion`,names:[`--aws-region`],type:`string`,usageLabel:`--aws-region <region>`,usageDescription:`AWS region for Device Farm API calls`},{key:`awsInteractionMode`,names:[`--aws-interaction-mode`],type:`enum`,enumValues:[`INTERACTIVE`,`NO_VIDEO`,`VIDEO_ONLY`],usageLabel:`--aws-interaction-mode INTERACTIVE|NO_VIDEO|VIDEO_ONLY`,usageDescription:`AWS Device Farm remote access interaction mode`},{key:`force`,names:[`--force`,`--overwrite`],type:`boolean`,usageLabel:`--force, --overwrite`,usageDescription:`Force replacement of existing state (connect: replace an active connection; --save-script: overwrite an existing target instead of refusing)`},{key:`clean`,names:[`--clean`],type:`boolean`,usageLabel:`--clean`,usageDescription:`Daemon stop: remove retained runner processes and leases after stopping`},{key:`noLogin`,names:[`--no-login`],type:`boolean`,usageLabel:`--no-login`,usageDescription:`Connect: fail instead of starting implicit cloud login`},{key:`sessionLock`,names:[`--session-lock`],type:`enum`,enumValues:[`reject`,`strip`],usageLabel:`--session-lock reject|strip`,usageDescription:`Lock bound-session device routing for this CLI invocation and nested batch steps`}],tr=[{key:`platform`,names:[`--platform`],type:`enum`,enumValues:ht,usageLabel:`--platform ${ht.join(`|`)}`,usageDescription:"Platform to target (`apple` aliases the Apple automation backend)"},{key:`target`,names:[`--target`],type:`enum`,enumValues:[`mobile`,`tv`,`desktop`],usageLabel:`--target mobile|tv|desktop`,usageDescription:`Device target class to match`},{key:`device`,names:[`--device`],type:`string`,usageLabel:`--device <name>`,usageDescription:`Device name to target`},{key:`udid`,names:[`--udid`],type:`string`,usageLabel:`--udid <udid>`,usageDescription:`iOS device UDID`},{key:`serial`,names:[`--serial`],type:`string`,usageLabel:`--serial <serial>`,usageDescription:`Android device or Vega VVD serial`},{key:`stale`,names:[`--stale`],type:`boolean`,usageLabel:`--stale`,usageDescription:`Device status: show only claims with a provably stale owner`},{key:`surface`,names:[`--surface`],type:`enum`,enumValues:pe,usageLabel:`--surface app|frontmost-app|desktop|menubar`,usageDescription:`macOS session surface for open (defaults to app)`},{key:`headless`,names:[`--headless`],type:`boolean`,usageLabel:`--headless`,usageDescription:`Boot: launch Android emulator without a GUI window`},{key:`targetApp`,names:[`--app`,`--target-app`],type:`string`,usageLabel:`--app <id-or-name>`,usageDescription:`Doctor: verify an installed target app without opening a session`},{key:`metroHost`,names:[`--metro-host`],type:`string`,usageLabel:`--metro-host <host>`,usageDescription:`Session-scoped Metro/debug host hint`},{key:`metroPort`,names:[`--metro-port`],type:`int`,min:1,max:65535,usageLabel:`--metro-port <port>`,usageDescription:`Session-scoped Metro/debug port hint; on an emulator/simulator the host defaults to the loopback alias, physical devices still need --metro-host`},{key:`metroProjectRoot`,names:[`--project-root`],type:`string`,usageLabel:`--project-root <path>`,usageDescription:`metro prepare: React Native project root (default: cwd)`},{key:`kind`,names:[`--kind`],type:`enum`,enumValues:[`auto`,`react-native`,`expo`,`repack`,..._e],usageLabel:`--kind <kind>`,usageDescription:`Kind selector for commands that support it, such as metro prepare or perf artifact collectors`},{key:`perfTemplate`,names:[`--template`],type:`string`,usageLabel:`--template <name>`,usageDescription:`Perf xctrace template name, for example Time Profiler`},{key:`metroKind`,names:[`--metro-kind`],type:`enum`,enumValues:[`auto`,`react-native`,`expo`,`repack`],usageLabel:`--metro-kind auto|react-native|expo|repack`,usageDescription:`metro prepare: detect or force the React Native dev-server launcher kind`},{key:`metroPublicBaseUrl`,names:[`--public-base-url`],type:`string`,usageLabel:`--public-base-url <url>`,usageDescription:`metro prepare: public base URL used for direct dev-server bundle hints`},{key:`metroProxyBaseUrl`,names:[`--proxy-base-url`],type:`string`,usageLabel:`--proxy-base-url <url>`,usageDescription:`metro prepare: optional bridge origin for remote dev-server access`},{key:`metroBearerToken`,names:[`--bearer-token`],type:`string`,usageLabel:`--bearer-token <token>`,usageDescription:`metro prepare: host bridge bearer token (or AGENT_DEVICE_METRO_BEARER_TOKEN; falls back to AGENT_DEVICE_DAEMON_AUTH_TOKEN)`},{key:`metroPreparePort`,names:[`--port`],type:`int`,min:1,max:65535,usageLabel:`--port <port>`,usageDescription:`metro prepare: local dev-server port (default: 8081)`},{key:`metroListenHost`,names:[`--listen-host`],type:`string`,usageLabel:`--listen-host <host>`,usageDescription:`metro prepare: host dev server listens on (default: 0.0.0.0)`},{key:`metroStatusHost`,names:[`--status-host`],type:`string`,usageLabel:`--status-host <host>`,usageDescription:`metro prepare: host used for local dev-server /status polling (default: 127.0.0.1)`},{key:`metroStartupTimeoutMs`,names:[`--startup-timeout-ms`],type:`int`,min:1,usageLabel:`--startup-timeout-ms <ms>`,usageDescription:`metro prepare: timeout while waiting for the dev server to become ready`},{key:`metroProbeTimeoutMs`,names:[`--probe-timeout-ms`],type:`int`,min:1,usageLabel:`--probe-timeout-ms <ms>`,usageDescription:`metro prepare: timeout for /status and proxy bridge calls`},{key:`metroRuntimeFile`,names:[`--runtime-file`],type:`string`,usageLabel:`--runtime-file <path>`,usageDescription:`metro prepare: optional file path to persist the JSON result`},{key:`metroNoReuseExisting`,names:[`--no-reuse-existing`],type:`boolean`,usageLabel:`--no-reuse-existing`,usageDescription:`metro prepare: always start a fresh Metro process`},{key:`metroNoInstallDeps`,names:[`--no-install-deps`],type:`boolean`,usageLabel:`--no-install-deps`,usageDescription:`metro prepare: skip package-manager install when node_modules is missing`},{key:`bundleUrl`,names:[`--bundle-url`],type:`string`,usageLabel:`--bundle-url <url>`,usageDescription:`Session-scoped bundle URL hint`},{key:`launchUrl`,names:[`--launch-url`],type:`string`,usageLabel:`--launch-url <url>`,usageDescription:`Session-scoped deep link / launch URL hint`},{key:`iosSimulatorDeviceSet`,names:[`--ios-simulator-device-set`],type:`string`,usageLabel:`--ios-simulator-device-set <path>`,usageDescription:`Scope iOS simulator discovery/commands to this simulator device set`},{key:`iosXctestrunFile`,names:[`--ios-xctestrun-file`],type:`string`,usageLabel:`--ios-xctestrun-file <path>`,usageDescription:`Use an externally built iOS XCTest runner .xctestrun artifact`},{key:`iosXctestDerivedDataPath`,names:[`--ios-xctest-derived-data-path`],type:`string`,usageLabel:`--ios-xctest-derived-data-path <path>`,usageDescription:`Derived data path for external iOS XCTest runner execution`},{key:`iosXctestEnvDir`,names:[`--ios-xctest-env-dir`],type:`string`,usageLabel:`--ios-xctest-env-dir <path>`,usageDescription:`Writable directory for per-session iOS XCTest runner env overlays`},{key:`deviceHub`,names:[`--device-hub`],type:`boolean`,usageLabel:`--device-hub`,usageDescription:`open: use Xcode Device Hub when surfacing Apple simulators`},{key:`testIme`,names:[`--test-ime`],type:`boolean`,usageLabel:`--test-ime`,usageDescription:`open: activate the headless Android test IME for deterministic Unicode text entry (default on for emulators; opt-in on real devices)`},{key:`testIme`,names:[`--no-test-ime`],type:`boolean`,setValue:!1,usageLabel:`--no-test-ime`,usageDescription:`open: keep the real Android keyboard even on emulators (opt out of the headless test IME)`},{key:`androidDeviceAllowlist`,names:[`--android-device-allowlist`],type:`string`,usageLabel:`--android-device-allowlist <serials>`,usageDescription:`Comma/space separated Android serial allowlist for discovery/selection`},{key:`remote`,names:[`--remote`],type:`boolean`,usageLabel:`--remote`,usageDescription:`Doctor: check remote connection setup instead of local device inventory`},{key:`activity`,names:[`--activity`],type:`string`,usageLabel:`--activity <component>`,usageDescription:`Android app launch activity (package/Activity); not for URL opens`},{key:`launchConsole`,names:[`--launch-console`],type:`string`,usageLabel:`--launch-console <path>`,usageDescription:`open: capture the initial iOS simulator launch console window to a file`},{key:`launchArgs`,names:[`--launch-args`],type:`string`,multiple:!0,usageLabel:`--launch-args <arg>`,usageDescription:`open: repeatable launch argument forwarded verbatim to the platform launch command (iOS app process args; Android adb shell am start args). Linux and macOS reject the flag.`},{key:`header`,names:[`--header`],type:`string`,multiple:!0,usageLabel:`--header <name:value>`,usageDescription:`install-from-source: repeatable HTTP header for URL downloads`},{key:`githubActionsArtifact`,names:[`--github-actions-artifact`],type:`string`,usageLabel:`--github-actions-artifact <owner/repo:artifact>`,usageDescription:`install-from-source: GitHub Actions artifact resolved by a remote daemon`},{key:`installSource`,names:[],type:`string`},{key:`session`,names:[`--session`],type:`string`,usageLabel:`--session <name>`,usageDescription:`Named session`}],nr=[{key:`replayUpdate`,names:[`--update`,`-u`],type:`boolean`,usageLabel:`--update, -u`,usageDescription:`Replay: retired as a rewrite (ADR 0012) — never edits the .ad file; every divergence already carries ranked selector suggestions, --update or not`},{key:`replayFrom`,names:[`--from`],type:`int`,min:1,usageLabel:`--from <n>`,usageDescription:`Replay: resume at 1-based plan step n, skipping 1..n-1 without executing them (requires --plan-digest; see a divergence report's resume field). replay only, not test`},{key:`replayPlanDigest`,names:[`--plan-digest`],type:`string`,usageLabel:`--plan-digest <sha256>`,usageDescription:`Replay: the plan digest a --from resume must match (from a prior divergence report); mismatch, edits, or include/platform-expansion changes fail INVALID_ARGS before any action`},{key:`replayMaestro`,names:[`--maestro`],type:`boolean`,usageLabel:`--maestro`,usageDescription:`Replay: treat input as a supported Maestro YAML subset; unsupported syntax fails loudly. See agent-device help maestro for commands and boundaries`},{key:`replayEnv`,names:[`-e`,`--env`],type:`string`,multiple:!0,usageLabel:`-e KEY=VALUE, --env KEY=VALUE`,usageDescription:"Replay/Test: inject or override a ${KEY} variable for the script (repeatable)"},{key:`failFast`,names:[`--fail-fast`],type:`boolean`,usageLabel:`--fail-fast`,usageDescription:`Test: stop the suite after the first failing script; with sharding, each shard stops independently`},{key:`timeoutMs`,names:[`--timeout`],type:`int`,min:1,usageLabel:`--timeout <ms>`,usageDescription:`Prepare/Replay/Snapshot/Test: maximum wall-clock time for the command or attempt. With --settle: the settle-wait deadline (default 10s)`},{key:`retries`,names:[`--retries`],type:`int`,min:0,max:3,usageLabel:`--retries <n>`,usageDescription:`Test: retry each failed script up to n additional times`},{key:`recordVideo`,names:[`--record-video`],type:`boolean`,usageLabel:`--record-video`,usageDescription:`Test: record each replay attempt to recording.mp4 in its attempt artifacts`},{key:`artifactsDir`,names:[`--artifacts-dir`],type:`string`,usageLabel:`--artifacts-dir <path>`,usageDescription:`Test: root directory for suite artifacts`},{key:`reporter`,names:[`--reporter`],type:`string`,multiple:!0,usageLabel:`--reporter <name-or-path>`,usageDescription:`Test: add a replay suite reporter; use default, junit:<path>, or a custom reporter path (repeatable)`},{key:`reportJunit`,names:[`--report-junit`],type:`string`,usageLabel:`--report-junit <path>`,usageDescription:`Test: compatibility alias for --reporter junit:<path>`},{key:`shardAll`,names:[`--shard-all`],type:`int`,min:1,usageLabel:`--shard-all <n>`,usageDescription:`Test: run the full suite on each of n devices; combine with --device id1,id2 for explicit connected devices; AD_SHARD_INDEX is zero-based`},{key:`shardSplit`,names:[`--shard-split`],type:`int`,min:1,usageLabel:`--shard-split <n>`,usageDescription:`Test: split runnable suite entries across n devices; AD_SHARD_INDEX is zero-based`},{key:`steps`,names:[`--steps`],type:`string`,usageLabel:`--steps <json>`,usageDescription:`Batch: JSON array of steps`},{key:`stepsFile`,names:[`--steps-file`],type:`string`,usageLabel:`--steps-file <path>`,usageDescription:`Batch: read steps JSON from file`},{key:`batchOnError`,names:[`--on-error`],type:`enum`,enumValues:[`stop`],usageLabel:`--on-error stop`,usageDescription:`Batch: stop when a step fails`},{key:`batchMaxSteps`,names:[`--max-steps`],type:`int`,min:1,max:1e3,usageLabel:`--max-steps <n>`,usageDescription:`Batch: maximum number of allowed steps`},{key:`appsFilter`,names:[`--all`],type:`enum`,enumValues:[`user-installed`,`all`],setValue:`all`,usageLabel:`--all`,usageDescription:`Apps: include system/OEM apps`},{key:`snapshotInteractiveOnly`,names:[`-i`],type:`boolean`,usageLabel:`-i`,usageDescription:`Snapshot: interactive elements only`},{key:`snapshotDepth`,names:[`--depth`,`-d`],type:`int`,min:0,usageLabel:`--depth, -d <depth>`,usageDescription:`Snapshot: limit snapshot depth`},{key:`snapshotScope`,names:[`--scope`,`-s`],type:`string`,usageLabel:`--scope, -s <scope>`,usageDescription:`Snapshot: scope snapshot to label/identifier`},{key:`snapshotRaw`,names:[`--raw`],type:`boolean`,usageLabel:`--raw`,usageDescription:`Snapshot: raw node output`},{key:`snapshotForceFull`,names:[`--force-full`],type:`boolean`,usageLabel:`--force-full`,usageDescription:`Snapshot: re-emit the full tree even when unchanged`},{key:`findFirst`,names:[`--first`],type:`boolean`,usageLabel:`--first`,usageDescription:`Find: pick the first match when ambiguous`},{key:`findLast`,names:[`--last`],type:`boolean`,usageLabel:`--last`,usageDescription:`Find: pick the last match when ambiguous`},{key:`out`,names:[`--out`],type:`string`,usageLabel:`--out <path>`,usageDescription:`Output path`},{key:`artifact`,names:[`--artifact`],type:`string`,usageLabel:`--artifact <path>`,usageDescription:`Debug symbols: Apple crash artifact path (.ips, .crash, or .log)`},{key:`dsym`,names:[`--dsym`],type:`string`,usageLabel:`--dsym <path>`,usageDescription:`Debug symbols: matching .dSYM bundle path`},{key:`searchPath`,names:[`--search-path`],type:`string`,usageLabel:`--search-path <dir>`,usageDescription:`Debug symbols: directory to scan for matching .dSYM bundles`},{key:`overlayRefs`,names:[`--overlay-refs`],type:`boolean`,usageLabel:`--overlay-refs`,usageDescription:`Screenshot: draw current snapshot refs and target rectangles onto the saved PNG; diff screenshot: also write a separate current-screen overlay guide`},...tt,{key:`baseline`,names:[`--baseline`,`-b`],type:`string`,usageLabel:`--baseline, -b <path>`,usageDescription:`Diff screenshot: path to baseline image file`},{key:`threshold`,names:[`--threshold`],type:`string`,usageLabel:`--threshold <0-1>`,usageDescription:`Diff screenshot: color distance threshold (default 0.1)`}],rr=[...er,...tr,...$n,...nr],ir=new Map;for(let e of rr)for(let t of e.names)ir.set(t,e);function ar(e){return ir.get(e)}function or(){return rr}const sr=new Set(or().map(e=>e.key));function cr(e){let t=Pe(e);return c({stateDir:e.stateDir,daemonBaseUrl:e.daemonBaseUrl,daemonAuthToken:e.daemonAuthToken,daemonTransport:e.daemonTransport,daemonServerMode:e.daemonServerMode,...Ee(t),provider:e.provider,providerSessionId:e.providerSessionId,providerApp:e.providerApp,providerOsVersion:e.providerOsVersion,providerProject:e.providerProject,providerBuild:e.providerBuild,providerSessionName:e.providerSessionName,awsProjectArn:e.awsProjectArn,awsDeviceArn:e.awsDeviceArn,awsAppArn:e.awsAppArn,awsRegion:e.awsRegion,awsInteractionMode:e.awsInteractionMode,sessionIsolation:e.sessionIsolation,platform:e.platform,target:e.target,device:e.device,udid:e.udid,serial:e.serial,iosSimulatorDeviceSet:e.iosSimulatorDeviceSet,iosXctestrunFile:e.iosXctestrunFile,iosXctestDerivedDataPath:e.iosXctestDerivedDataPath,iosXctestEnvDir:e.iosXctestEnvDir,androidDeviceAllowlist:e.androidDeviceAllowlist,surface:e.surface,activity:e.activity,launchConsole:e.launchConsole,launchArgs:e.launchArgs,relaunch:e.relaunch,shutdown:e.shutdown,saveScript:e.saveScript,deviceHub:e.deviceHub,testIme:e.testIme,noRecord:e.noRecord,recordAs:e.recordAs,record:e.record,backMode:e.backMode,metroHost:e.metroHost,metroPort:e.metroPort,bundleUrl:e.bundleUrl,launchUrl:e.launchUrl,snapshotInteractiveOnly:e.interactiveOnly,snapshotDepth:e.depth,snapshotScope:e.scope,snapshotRaw:e.raw,snapshotForceFull:e.forceFull,...ze(e),appsFilter:e.appsFilter,kind:e.kind,out:e.out,count:e.count,fps:e.fps,screenshotMaxSize:e.maxSize,quality:e.quality,hideTouches:e.hideTouches,recordingScope:e.recordingScope,intervalMs:e.intervalMs,delayMs:e.delayMs,durationMs:e.durationMs,holdMs:e.holdMs,jitterPx:e.jitterPx,pixels:e.pixels,doubleTap:e.doubleTap,verify:e.verify,settle:e.settle,settleQuietMs:e.settleQuietMs,clickButton:e.clickButton,pauseMs:e.pauseMs,pattern:e.pattern,headless:e.headless,restart:e.restart,replayUpdate:e.replayUpdate,replayBackend:e.replayBackend,replayEnv:e.replayEnv,replayShellEnv:e.replayShellEnv,replayFrom:e.replayFrom,replayPlanDigest:e.replayPlanDigest,failFast:e.failFast,timeoutMs:e.timeoutMs,retries:e.retries,recordVideo:e.recordVideo,artifactsDir:e.artifactsDir,shardAll:e.shardAll,shardSplit:e.shardSplit,findFirst:e.findFirst,findLast:e.findLast,networkInclude:e.networkInclude,batchOnError:e.batchOnError,batchMaxSteps:e.batchMaxSteps,batchSteps:e.batchSteps,verbose:e.debug})}function lr(e,t){return{...cr(e),...t}}function ur(e,t){let n=e.inputSchema.properties;if(!n)return{};let r={},i=t;for(let e of Object.keys(n)){if(!sr.has(e))continue;let t=i[e];dr(t)&&(r[e]=t)}return r}function dr(e){return typeof e==`boolean`||typeof e==`number`||typeof e==`string`}function fr(e){return t=>E(u.batch,[],{...t,batchSteps:pr(t.steps,e),batchOnError:t.onError,batchMaxSteps:t.maxSteps})}function pr(t,n){if(!Array.isArray(t)||t.length===0)throw new e(`INVALID_ARGS`,`batch requires a non-empty steps array.`);return t.map((e,t)=>mr(e,t+1,n))}function mr(e,t,n){let r=te(e,t),i=hr(r,t),a=se(r,t),o=ie(r.runtime,t),s=n(i,a,t);return{command:s.command,positionals:s.positionals,...s.input?{input:s.input}:{},flags:lr(s.options,s.metadataFlags),runtime:o??s.options.runtime}}function hr(e,t){return re(e.command,t)}const gr=Gn(),_r=F({name:`batch`,clientSurface:!1,commands:[P({name:`batch`,metadata:gr,definition:R(gr,(e,t)=>e.batch.run(vr(t))),cliSchema:{usageOverride:`batch [--steps <json> | --steps-file <path>]`,listUsageOverride:`batch --steps <json> | --steps-file <path>`,helpDescription:`Execute multiple commands in one daemon request`,summary:`Run multiple commands`,allowedFlags:[`steps`,`stepsFile`,`batchOnError`,`batchMaxSteps`,`out`]},cliReader:(e,t)=>({...D(t),steps:t.batchSteps??[],onError:t.batchOnError,maxSteps:t.batchMaxSteps,out:t.out}),cliOutputFormatter:Un.batch})]});function vr(e){return{...S(e),steps:e.steps,onError:e.onError,maxSteps:e.maxSteps,out:e.out}}function H(e,t,n){return L({name:e,description:t,inputSchema:b(n),readInput:e=>Wt(e,n)})}const yr=`alert`,br=H(yr,`Inspect or handle platform alerts.`,{action:_(Ce),timeoutMs:h()}),xr=P({name:yr,metadata:br,definition:R(br,(e,t)=>e.command.alert(t)),cliSchema:{usageOverride:`alert [get|accept|dismiss|wait] [timeout]`,positionalArgs:[`action?`,`timeout?`]},cliReader:(e,t)=>({...D(t),...Cr(e)}),daemonWriter:T(u.alert,e=>Sr(e)),cliOutputFormatter:B});function Sr(e){return[e.action??`get`,...j(e.timeoutMs)]}function Cr(t){if(t.length>2)throw new e(`INVALID_ARGS`,`alert accepts at most action and timeout arguments.`);return C({action:wr(t[0]),timeoutMs:zn(t[1],`alert timeout`)})}function wr(t){let n=t?.toLowerCase();if(n===void 0||n===`get`||n===`accept`||n===`dismiss`||n===`wait`)return n;throw new e(`INVALID_ARGS`,`alert action must be get, accept, dismiss, or wait.`)}function U(...e){return e}const Tr=U(`snapshotInteractiveOnly`,`snapshotDepth`,`snapshotScope`,`snapshotRaw`),W=U(`snapshotDepth`,`snapshotScope`,`snapshotRaw`),Er=U(`metroProjectRoot`,`kind`,`metroKind`,`metroPublicBaseUrl`,`metroProxyBaseUrl`,`metroBearerToken`,`metroPreparePort`,`metroListenHost`,`metroStatusHost`,`metroStartupTimeoutMs`,`metroProbeTimeoutMs`,`metroRuntimeFile`,`metroNoReuseExisting`,`metroNoInstallDeps`),Dr=U(`metroHost`,`metroPort`,`bundleUrl`),Or=U(`count`,`intervalMs`,`holdMs`,`jitterPx`,`doubleTap`),kr=U(`settle`,`settleQuietMs`,`timeoutMs`),Ar=U(`replayUpdate`,`replayEnv`),jr=U(`remoteConfig`,`stateDir`,`daemonBaseUrl`,`daemonAuthToken`,`daemonTransport`,`daemonServerMode`,`tenant`,`sessionIsolation`,`runId`,`leaseId`,`leaseBackend`,`sessionLock`,`platform`,`target`,`device`,`providerApp`,`providerOsVersion`,`providerProject`,`providerBuild`,`providerSessionName`,`awsProjectArn`,`awsDeviceArn`,`awsAppArn`,`awsRegion`,`awsInteractionMode`,`udid`,`serial`,`iosSimulatorDeviceSet`,`iosXctestrunFile`,`iosXctestDerivedDataPath`,`iosXctestEnvDir`,`androidDeviceAllowlist`,`session`,`noRecord`),Mr=new Set([`json`,`config`,`help`,`version`,`verbose`,`cost`,`responseLevel`]),Nr=`diff`,Pr=H(Nr,`Diff accessibility snapshots.`,{kind:f(v({type:`string`,const:`snapshot`})),out:p(),interactiveOnly:g(),depth:h(),scope:p(),raw:g()}),Fr=P({name:Nr,metadata:Pr,definition:R(Pr,(e,t)=>e.capture.diff(t)),cliSchema:{usageOverride:`diff snapshot | diff screenshot --baseline <path> [current.png] [--out <diff.png>] [--threshold <0-1>] [--overlay-refs]`,helpDescription:`Diff accessibility snapshot or compare screenshots pixel-by-pixel. Live iOS simulator screenshot diffs normalize status-bar chrome by default; use screenshot --normalize-status-bar when capturing reusable baselines.`,summary:`Diff snapshot or screenshot`,positionalArgs:[`kind`,`current?`],allowedFlags:[...Tr,`baseline`,`threshold`,`out`,`overlayRefs`]},cliReader:(t,n)=>{if(t[0]!==`snapshot`)throw new e(`INVALID_ARGS`,`Only diff snapshot is available through this parser.`);return{...D(n),kind:`snapshot`,out:n.out,interactiveOnly:n.snapshotInteractiveOnly,depth:n.snapshotDepth,scope:n.snapshotScope,raw:n.snapshotRaw}},daemonWriter:T(u.diff,e=>[N(e.kind,`diff requires kind`)])}),Ir=`screenshot`,Lr=H(Ir,`Capture a screenshot.`,{path:p(`Output path.`),overlayRefs:g(),pixelDensity:h(`Output screenshot pixel density in pixels per logical point.`,{min:1}),fullscreen:g(),maxSize:h(),stabilize:g(),normalizeStatusBar:g(),surface:_(pe)}),Rr=P({name:Ir,metadata:Lr,definition:R(Lr,(e,t)=>e.capture.screenshot(t)),cliSchema:{helpDescription:`Capture screenshot (web defaults to the viewport; use --fullscreen, --full, or -f for the entire page. iOS simulators default to 1x logical-point output; use --pixel-density to request a different screenshot density. macOS app sessions default to the app window; use --fullscreen for full desktop, --max-size to downscale, --overlay-refs to annotate current refs, --normalize-status-bar for deterministic iOS simulator chrome, or --no-stabilize for low-latency Android capture loops)`,summary:`Capture screenshot with optional density, full-page, desktop, downscale, or ref overlay modes`,positionalArgs:[`path?`],allowedFlags:ct},cliReader:(e,t)=>({...D(t),path:e[0]??t.out,...rt(t)}),daemonWriter:e=>E(u.screenshot,A(e.path),{...e,...ze(e)})}),zr=`settings`,Br=H(zr,`Change OS settings and app permissions.`,{setting:f(p()),state:f(p()),app:p(),latitude:m(),longitude:m(),permission:p(),mode:_([`full`,`limited`])}),Vr=P({name:zr,metadata:Br,definition:R(Br,(e,t)=>e.settings.update(t)),cliSchema:{usageOverride:Ae,listUsageOverride:`settings [area] [options]`,helpDescription:`Toggle OS settings, animation scales, appearance, and app permissions (macOS supports only settings appearance <light|dark|toggle> and settings permission <grant|reset> <accessibility|screen-recording|input-monitoring>; wifi|airplane|location|animations remain unsupported on macOS; mobile permission actions use the active session app)`,summary:`Change OS settings and app permissions`,positionalArgs:[`setting`,`state`,`target?`,`mode?`]},cliReader:(e,t)=>Hr(e,t),daemonWriter:T(u.settings,e=>Ur(e))});function Hr(t,n){let r=Sn(n),i=t[0],a=t[1];if(k(i,Kr)&&k(a,qr))return{...r,setting:i,state:a};if(i===`location`&&a===`set`)return{...r,setting:i,state:a,latitude:ke(t[2],`latitude`),longitude:ke(t[3],`longitude`)};if(i===`appearance`&&k(a,Jr)||k(i,Yr)&&k(a,Xr)||i===`fingerprint`&&k(a,Zr))return{...r,setting:i,state:a};if(i===`permission`&&k(a,Qr))return{...r,setting:i,state:a,permission:Wr(t[2]),mode:Gr(t[3])};if(i===`clear-app-state`){let e=a===`clear`?t[2]:a;return{...r,setting:i,state:`clear`,app:e}}throw new e(`INVALID_ARGS`,`Invalid settings arguments.`)}function Ur(e){return e.setting===`clear-app-state`?[e.setting,...A(e.app)]:e.setting===`location`&&e.state===`set`?[e.setting,e.state,String(e.latitude),String(e.longitude)]:e.setting===`permission`?[e.setting,e.state,e.permission,...A(e.mode)]:[e.setting,e.state]}function Wr(t){if(k(t,$r))return t;throw new e(`INVALID_ARGS`,`settings permission requires a permission target.`)}function Gr(t){if(t===void 0||t===`full`||t===`limited`)return t;throw new e(`INVALID_ARGS`,`settings permission mode must be full or limited.`)}const Kr=O(`wifi`,`airplane`,`location`,`animations`),qr=O(`on`,`off`),Jr=O(`light`,`dark`,`toggle`),Yr=O(`faceid`,`touchid`),Xr=O(`match`,`nonmatch`,`enroll`,`unenroll`),Zr=O(`match`,`nonmatch`),Qr=O(`grant`,`deny`,`reset`),$r=O(`camera`,`microphone`,`photos`,`contacts`,`contacts-limited`,`notifications`,`calendar`,`location`,`location-always`,`media-library`,`motion`,`reminders`,`siri`,`accessibility`,`screen-recording`,`input-monitoring`);function ei(e){if(!Array.isArray(e)||e.length===0)return e;let t=bt(e);return e.map(e=>{let n=ti(e,t,e=>e.label),r=ti(e,t,e=>e.identifier),i=typeof e.label==`string`&&e.label.length>=24&&e.label===n,a=typeof e.identifier==`string`&&e.identifier.length>=24&&e.identifier===r;if(!i&&!a)return e;let o={...e};return i&&(delete o.label,o.inheritsLabel=!0),a&&(delete o.identifier,o.inheritsIdentifier=!0),o})}function ti(e,t,n){let r=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0;for(;r;){let e=n(r);if(typeof e==`string`&&e.length>0)return e;r=typeof r.parentIndex==`number`?t.get(r.parentIndex):void 0}}function ni(e){let t=ft(e.raw||!Array.isArray(e.result.nodes)?e.result:{...e.result,nodes:ei(e.result.nodes)});return{data:t,jsonData:ii(t),stderr:e.result.snapshotDiagnostics?.warning?`${e.result.snapshotDiagnostics.warning}\n`:void 0,text:ut(t,{raw:e.raw,flatten:e.interactiveOnly,scoped:typeof e.scope==`string`&&e.scope.trim().length>0,depthLimited:typeof e.depth==`number`})}}const ri={snapshot:({input:e,result:t})=>ni({result:t,raw:e.raw,interactiveOnly:e.interactiveOnly,scope:e.scope,depth:e.depth}),wait:B,alert:B};function ii(e){let{unchanged:t,...n}=e;return n}const ai=`snapshot`,oi=H(ai,`Capture an accessibility snapshot.`,{interactiveOnly:g(),depth:h(),scope:p(),raw:g(),forceFull:g(),timeoutMs:h(`Maximum wall-clock time for the snapshot command.`),noRecord:g(`Do not record this action.`),record:g(`Force-record this out-of-band observation into a repair-armed heal (mutually exclusive with noRecord). Authored replay steps are recorded automatically and never need this.`)}),si=P({name:ai,metadata:oi,definition:R(oi,(e,t)=>e.capture.snapshot(t)),cliSchema:{usageOverride:`snapshot [--diff] [-i] [-d <depth>] [-s <scope>] [--raw] [--force-full] [--timeout <ms>]`,helpDescription:`Capture accessibility tree or diff against the previous session baseline. For iOS raw-coordinate fallback after a no-op ref press, inspect rects with snapshot -i --json, press the rect center, then verify with diff snapshot -i or snapshot --diff.`,summary:`Capture accessibility tree or diff against the previous session baseline`,allowedFlags:[`snapshotDiff`,...Tr,`snapshotForceFull`,`timeoutMs`,`record`]},cliReader:(e,t)=>({...D(t),...xn(t),interactiveOnly:t.snapshotInteractiveOnly,depth:t.snapshotDepth,scope:t.snapshotScope,raw:t.snapshotRaw,forceFull:t.snapshotForceFull,timeoutMs:t.timeoutMs}),daemonWriter:T(u.snapshot),cliOutputFormatter:ri.snapshot}),ci=[`duration`,`text`,`ref`,`selector`,`stable`],li=`wait`,ui=H(li,`Wait for duration, text, ref, selector, or stable UI.`,{kind:_(ci),durationMs:h(),text:p(),ref:p(),selector:p(),stable:g(),quietMs:h(),timeoutMs:h(),depth:h(),scope:p(),raw:g()}),di=P({name:li,metadata:ui,definition:R(ui,(e,t)=>e.command.wait(fi(t))),cliSchema:{usageOverride:`wait <ms>|text <text>|@ref|<selector>|stable [quietMs] [timeoutMs]`,positionalArgs:[`durationOrSelector`,`timeoutMs?`],allowsExtraPositionals:!0,allowedFlags:[...W]},cliReader:(e,t)=>pi(e,t),daemonWriter:T(u.wait,e=>mi(e)),cliOutputFormatter:B});function fi(e){nn(e,`kind`,ci);let t={...e};return delete t.kind,t}function pi(t,n){let r=s(t);if(!r)throw new e(`INVALID_ARGS`,`wait requires <ms>, text <text>, @ref, <selector> [timeoutMs], or stable [quietMs] [timeoutMs].`);let i={...Sn(n),...wn(n)};if(r.kind===`sleep`)return{...i,durationMs:r.durationMs};if(r.kind===`text`){if(!r.text)throw new e(`INVALID_ARGS`,`wait requires text.`);return{...i,text:r.text,...hi(r.timeoutMs)}}return r.kind===`ref`?{...i,ref:r.rawRef,...hi(r.timeoutMs)}:r.kind===`stable`?{...i,stable:!0,...gi(r.quietMs),...hi(r.timeoutMs)}:{...i,selector:r.selectorExpression,...hi(r.timeoutMs)}}function mi(t){if([t.durationMs===void 0?void 0:`durationMs`,t.text===void 0?void 0:`text`,t.ref===void 0?void 0:`ref`,t.selector===void 0?void 0:`selector`,t.stable===void 0?void 0:`stable`].filter(Boolean).length!==1)throw new e(`INVALID_ARGS`,`wait command requires exactly one of durationMs, text, ref, selector, or stable.`);if(t.durationMs!==void 0)return[String(t.durationMs)];let n=j(t.timeoutMs);if(t.text!==void 0)return[`text`,t.text,...n];if(t.ref!==void 0)return[t.ref,...n];if(t.stable!==void 0){let r=j(t.quietMs);if(r.length===0&&n.length>0)throw new e(`INVALID_ARGS`,`wait stable requires quietMs before timeoutMs.`);return[`stable`,...r,...n]}let r=t.selector;if(!ne(r))throw new e(`INVALID_ARGS`,`Invalid wait selector: ${r}`);return[r,...n]}function hi(e){return e===null?{}:{timeoutMs:e}}function gi(e){return e===null?{}:{quietMs:e}}const _i=F({name:`capture`,commands:[si,Rr,Fr,di,xr,Vr]});function vi(e){let t=[e.outPath,e.message];t.push(...bi(e));for(let n of e.matchedImages)t.push(`Matched: ${n.name} ${n.uuid}${n.arch?` ${n.arch}`:``}`);for(let n of e.warnings??[])t.push(`Warning: ${n}`);return{data:e,text:t.join(`
3
+ `)}}const yi={debug:z(vi)};function bi(e){let t=e.crash,n=[`Crash: ${t.appName??`unknown app`}${t.crashedThread===void 0?``:` thread ${t.crashedThread}`}`];t.bundleId&&n.push(`Bundle: ${t.bundleId}`),t.exceptionType&&n.push(`Exception: ${t.exceptionType}`),t.terminationReason&&n.push(`Termination: ${t.terminationReason}`);for(let e of t.topFrames)n.push(`Frame ${e.index}: ${e.image} ${e.symbol??e.address}`);for(let e of t.findings)n.push(`Finding: ${e}`);return n}const xi=`debug`,Si=H(xi,`Symbolicate crash artifacts with matching debug symbols.`,{action:f(_([`symbols`])),artifact:f(p(`Apple crash artifact path (.ips, .crash, or .log).`)),dsym:p(`Path to a matching .dSYM bundle.`),searchPath:p(`Directory to scan for matching .dSYM bundles.`),out:p(`Output path for the symbolicated artifact.`)}),Ci=F({name:`debugging`,commands:[P({name:xi,metadata:Si,definition:R(Si,(e,t)=>e.debug.symbols(t)),cliSchema:{usageOverride:`debug symbols --artifact <crash.ips|crash.log> (--dsym <App.dSYM> | --search-path <dir>) [--out <symbolicated>]`,listUsageOverride:`debug`,helpDescription:`Symbolicate Apple crash artifacts with matching dSYM UUIDs. This debug namespace is intentionally narrow: use logs for app logs, network for HTTP evidence, perf for performance samples, record/trace for media and traces, and react-devtools for React Native profiles.`,summary:`Symbolicate Apple crash artifacts with dSYMs; use logs/network/perf for other diagnostics`,positionalArgs:[`symbols`],allowedFlags:[`artifact`,`dsym`,`searchPath`,`out`]},cliReader:(e,t)=>({...D(t),action:wi(e[0]),artifact:t.artifact,dsym:t.dsym,searchPath:t.searchPath,out:t.out}),cliOutputFormatter:yi.debug})]});function wi(t){if(t===`symbols`)return t;throw new e(`INVALID_ARGS`,`debug supports only symbols; use logs, network, perf, record, trace, or react-devtools for other diagnostics`)}const Ti=[`click`,`focus`,`exists`,`getText`,`getAttrs`,`wait`,`fill`,`type`],Ei={click:`Click or tap a semantic UI target by ref, selector, or point.`,press:`Press a semantic UI target by ref, selector, or point.`,fill:`Replace text in a semantic UI target by ref, selector, or point.`,longpress:`Long press by ref, selector, or point.`,swipe:`Swipe between two points.`,focus:`Focus input at coordinates.`,type:`Append text to the focused field.`,scroll:`Scroll in a direction or to an edge.`,get:`Get element text or attributes.`,is:`Assert UI state.`,find:`Find an element and optionally act on it.`,gesture:`Run a structured gesture.`},Di=()=>g(`Capture cheap post-action evidence (AX digest, node counts, changedFromBefore) instead of a follow-up snapshot.`),Oi=()=>({settle:g(`After the action, wait for the UI to go quiet and return the settled diff vs the pre-action tree in the same response. Best-effort; never fails the action.`),settleQuietMs:h(`Settle: quiet window in milliseconds (default 500).`,{min:0}),timeoutMs:h(`Settle: wait deadline in milliseconds (default 10000).`,{min:1})});function ki(e){return{...o(e)?{verify:Di()}:{},...a(e)?Oi():{}}}const Ai={target:f(Bt()),button:_(Ze,`Pointer button for platforms that support mouse buttons.`),...y(),...Ut(),...ki(`click`)},ji={target:f(Bt()),...y(),...Ut(),...ki(`press`)},Mi={target:f(Bt()),text:f(p(`Text to enter into the target.`)),delayMs:h(`Delay between typed characters.`,{min:0}),recordAs:p("When script recording is armed, send text to the live app but publish it as ${VAR}. Use an uppercase replay variable name such as PASSWORD."),...y(),...ki(`fill`)},Ni={target:f(Bt()),durationMs:h(`Long press duration in milliseconds.`,{min:0}),...y(),...ki(`longpress`)},Pi={from:f(Ht(`Swipe start point.`)),to:f(Ht(`Swipe end point.`)),count:h(`Number of swipe repetitions.`,{min:1,max:200}),pauseMs:h(`Pause between repeated swipes.`,{min:0,max:de}),pattern:_(we)},Fi={x:f(m(`X coordinate.`)),y:f(m(`Y coordinate.`))},Ii={text:f(p(`Text to type.`)),delayMs:h(`Delay between typed characters.`,{min:0})},Li={direction:f(_(dt)),amount:m(`Platform scroll amount.`),pixels:h(`Pixel scroll amount.`,{min:0}),durationMs:h(`Scroll duration in milliseconds when the backend supports pacing.`,{min:0,max:Ye})},Ri=()=>({noRecord:g(`Do not record this action.`),record:g(`Force-record this out-of-band observation into a repair-armed heal (mutually exclusive with noRecord). Authored replay steps are recorded automatically and never need this. On find, valid only for a read-only action.`)}),zi={format:f(_([`text`,`attrs`])),target:f(Vt()),...y(),...Ri()},Bi={predicate:f(_([`visible`,`hidden`,`exists`,`editable`,`selected`,`focused`,`text`])),selector:f(p()),value:p(),...y(),...Ri()},Vi={locator:_(i),query:f(p()),action:_(Ti),value:p(),timeoutMs:h(),first:g(),last:g(),depth:h(),raw:g(),...Ri()},Hi={kind:f(_(Ge,`Gesture variant.`)),direction:_(be,`Fling direction.`),preset:_(ge,`Swipe preset.`),origin:Ht(`Gesture origin point.`),delta:Ht(`Movement delta for pan or transform gestures.`),distance:h(`Fling distance.`,{min:0}),scale:m(`Pinch or transform scale.`),degrees:m(`Rotation in degrees.`),durationMs:h(`Pan/transform duration.`,{min:16,max:1e4}),pointerCount:h(`Pan touch pointer count (1 or 2).`,{min:1,max:2})},Ui=[L({name:`click`,description:Ei.click,inputSchema:b(Ai),readInput:e=>Wt(e,Ai)}),L({name:`press`,description:Ei.press,inputSchema:b(ji),readInput:e=>Wt(e,ji)}),L({name:`fill`,description:Ei.fill,inputSchema:b(Mi),readInput:e=>Wt(e,Mi)}),G(`longpress`,Ni),G(`swipe`,Pi),G(`focus`,Fi),G(`type`,Ii),G(`scroll`,Li),G(`get`,zi),G(`is`,Bi),G(`find`,Vi),L({name:`gesture`,description:Ei.gesture,inputSchema:b(Hi),readInput:Wi})];function Wi(e){let t=Gt(e);return{...Kt(t),...Ue(t)}}function G(e,t){return H(e,Ei[e],t)}const Gi={gesture:qi},Ki={gesture:e=>{let t=Wi(e);return E(u.gesture,[],e,C(t))}};function qi(e,t){return{...D(t),...lt(e,t.pointerCount)}}const K={click:(e,t)=>({...D(t),...Cn(t),...En(t),...Tn(t),target:Dn(ot(e)),button:t.clickButton,verify:t.verify}),press:(e,t)=>({...D(t),...Cn(t),...En(t),...Tn(t),target:Dn(ot(e)),verify:t.verify}),longpress:(e,t)=>{let n=Ji(e);return{...D(t),...Cn(t),...Tn(t),target:Dn(n),durationMs:n.durationMs}},swipe:(e,t)=>({...D(t),...Qe(e,{count:t.count,pauseMs:t.pauseMs,pattern:t.pattern})}),focus:(e,t)=>({...D(t),x:Number(e[0]),y:Number(e[1])}),type:(e,t)=>({...D(t),text:e.join(` `),delayMs:t.delayMs}),fill:(e,t)=>{let n=nt(e);return{...D(t),...Cn(t),...Tn(t),target:Dn(n.target),text:n.text,delayMs:t.delayMs,recordAs:t.recordAs,verify:t.verify}},scroll:(e,t)=>({...D(t),direction:Qi(e[0]),amount:Bn(e[1]),pixels:t.pixels,durationMs:t.durationMs}),get:(e,t)=>({...D(t),...xn(t),...Cn(t),format:Pn(e[0]),target:Dn(Nn(e.slice(1)))})},q={click:e=>E(u.click,On(e),{...e,clickButton:e.button}),press:T(u.press,e=>On(e)),longpress:T(u.longPress,e=>Yi(e)),swipe:e=>(Ve(e),E(u.swipe,[],e,{from:e.from,to:e.to,count:e.count,pauseMs:e.pauseMs,pattern:e.pattern})),focus:T(u.focus,e=>[String(e.x),String(e.y)]),type:T(u.type,e=>Xi(e)),fill:T(u.fill,e=>Zi(e)),scroll:T(u.scroll,e=>[N(e.direction,`scroll requires direction`),...j(e.amount)]),get:T(u.get,e=>[N(e.format,`get requires format`),...kn(e)])};function Ji(e){let t=$i(e);return{...ot(t.target),...t.durationMs===void 0?{}:{durationMs:t.durationMs}}}function Yi(e){return[...On(e),...j(e.durationMs)]}function Xi(e){return[e.text]}function Zi(e){return[...On(e),e.text]}function Qi(t){if(t===`up`||t===`down`||t===`left`||t===`right`||t===`top`||t===`bottom`)return t;throw new e(`INVALID_ARGS`,`Unknown direction: ${String(t)}`,{hint:`scroll takes a direction first, then an optional amount: scroll <up|down|left|right|top|bottom> [amount]. It takes no @ref or selector — scroll the whole viewport, then retry the target with a selector.`})}function $i(e){if(Rn(e[0])&&Rn(e[1]))return{target:e.slice(0,2),...e[2]===void 0?{}:{durationMs:Number(e[2])}};let t=e.at(-1);return e.length>1&&Rn(t)?{target:e.slice(0,-1),durationMs:Number(t)}:{target:e}}function ea(e){let t=e.result;return e.format===`text`?{data:t,text:typeof t.text==`string`?t.text:``}:e.format===`attrs`?{data:t,text:JSON.stringify(t.node??{},null,2)}:da(t)}function ta(e,t){if(!(typeof e!=`string`||e.length===0)&&typeof t==`number`)return`@${e.startsWith(`@`)?e.slice(1):e}~s${t}`}function na(e){let t=e,n=Fe(t);if(n)return{data:t,text:n};if(typeof t.text==`string`)return{data:t,text:t.text};let r=ta(t.ref,t.refsGeneration);return r?{data:t,text:`Found: ${r}`}:typeof t.found==`boolean`?{data:t,text:`Found: ${t.found}`}:t.node?{data:t,text:JSON.stringify(t.node,null,2)}:da(t)}function ra(e){let t=e;return{data:t,text:`Passed: is ${t.predicate??`assertion`}`}}function ia(e){let t=e,n=t.ref??``,r=t.x,i=t.y;if(!n||typeof r!=`number`||typeof i!=`number`){let e=da(t);return{data:e.data,text:oa(e.text,t.settle)}}return{data:t,text:oa(`Tapped @${n} (${r}, ${i})`,t.settle)}}function aa(e){let t=e,n=da(t);return{data:n.data,text:oa(n.text,t.settle)}}function oa(e,t){return`${e??``}${sa(t)}`}function sa(e){if(!e||typeof e!=`object`)return``;let t=e,n=[ua(t),...ca(t.diff),...la(t)];return t.hint&&n.push(`hint: ${t.hint}`),`\n${n.join(`
4
+ `)}`}function ca(e){let t=(e?.lines??[]).map(e=>`${e.kind===`removed`?`-`:`+`} ${e.text??``}`);return e?.truncated&&t.push(`… changed lines truncated`),t}function la(e){let t=e.tail??[];if(t.length===0)return[];let n=[`unchanged interactive (${t.length}):`];for(let r of t){let t=r.label?` "${r.label}"`:``,i=ta(r.ref,e.refsGeneration)??`@${r.ref??``}`;n.push(`= ${i} [${r.role??``}]${t}`)}return e.tailTruncated&&n.push(`… more interactive elements not shown, use snapshot -i`),n}function ua(e){let t=e.settled===!0?`settled`:`not settled`,n=e.diff?.summary;return n?`${t} after ${e.waitedMs??0}ms: +${n.additions??0} -${n.removals??0} (~${n.unchanged??0} unchanged)`:`${t} after ${e.waitedMs??0}ms`}const J={click:z(ia),press:z(ia),fill:z(aa),longpress:z(aa),get:({input:e,result:t})=>ea({result:t,format:e.format}),is:z(ra),find:z(na)};function da(e){return V(e)}const fa={find:(e,t)=>ga(e,t),is:(e,t)=>_a(e,t)},pa={is:T(u.is,e=>ma(e)),find:e=>E(u.find,ha(e),{...e,findFirst:e.first,findLast:e.last})};function ma(e){return[e.predicate,e.selector,...e.predicate===`text`?[e.value]:[]]}function ha(e){let t=e.locator&&e.locator!==`any`?[e.locator,e.query]:[e.query];switch(e.action){case void 0:case`click`:case`focus`:case`exists`:return e.action?[...t,e.action]:t;case`getText`:return[...t,`get`,`text`];case`getAttrs`:return[...t,`get`,`attrs`];case`wait`:return[...t,`wait`,...j(e.timeoutMs)];case`fill`:case`type`:return[...t,e.action,e.value]}}function ga(t,n){let r={...ya(n),...Sn(n),...xn(n),first:n.findFirst,last:n.findLast},i=va(t[0]),a=i!==void 0,o=a?t[1]:t[0],s=a?2:1,c=t[s];if(c===void 0)return{...r,locator:i,query:ba(o)};if(c===`get`){let n=t[s+1];if(n===`text`)return{...r,locator:i,query:ba(o),action:`getText`};if(n===`attrs`)return{...r,locator:i,query:ba(o),action:`getAttrs`};throw new e(`INVALID_ARGS`,`find get only supports text or attrs`)}if(c===`wait`)return{...r,locator:i,query:ba(o),action:`wait`,timeoutMs:Bn(t[s+1])};if(c===`fill`||c===`type`)return{...r,locator:i,query:ba(o),action:c,value:t.slice(s+1).join(` `)};if(c===`click`||c===`focus`||c===`exists`)return{...r,locator:i,query:ba(o),action:c};throw new e(`INVALID_ARGS`,`Unsupported find action: ${c}`)}function _a(t,n){let r={...wn(n),...Sn(n),...xn(n)},i=_t(t),a=vt(i[0]??``);if(!a.ok)throw new e(a.code,a.message,{hint:a.hint});let o=a.predicate,s=Fn(i.slice(1),{preferTrailingValue:o===`text`});return o===`text`?{...r,predicate:o,selector:s.selectorExpression,value:s.rest.join(` `)}:{...r,predicate:o,selector:s.selectorExpression}}function va(e){if(e===`text`||e===`label`||e===`value`||e===`role`||e===`id`)return e}function ya(e){return{depth:e.snapshotDepth,raw:e.snapshotRaw}}function ba(t){if(t===void 0||t===``)throw new e(`INVALID_ARGS`,`find requires query`);return t}const Y={get:{usageOverride:`get text|attrs <@ref|selector>`,positionalArgs:[`subcommand`,`target`],allowedFlags:[...W,`record`]},find:{usageOverride:`find <locator|text> <action> [value] [--first|--last]`,helpDescription:`Find by text/label/value/role/id and run action`,summary:`Find an element and act`,positionalArgs:[`query`,`action`,`value?`],allowsExtraPositionals:!0,allowedFlags:[`snapshotDepth`,`snapshotRaw`,`findFirst`,`findLast`,`record`]},is:{positionalArgs:[`predicate`,`selector`,`value?`],allowsExtraPositionals:!0,allowedFlags:[...W,`record`]},click:{usageOverride:`click <x y|@ref|selector>`,positionalArgs:[`target`],allowsExtraPositionals:!0,allowedFlags:[...Or,`clickButton`,...xa(`click`),...W]},press:{usageOverride:`press <x y|@ref|selector>`,helpDescription:`Short press a semantic UI target by ref, selector, or point. For native context menus or hold gestures, use longpress <target> <durationMs> instead of press --hold-ms.`,positionalArgs:[`targetOrX`,`y?`],allowsExtraPositionals:!0,allowedFlags:[...Or,...xa(`press`),...W]},longpress:{usageOverride:`longpress <x y|@ref|selector> [durationMs]`,helpDescription:`Open native context menus or long-press targets by ref, selector, or point. Duration is positional, for example longpress @e12 800 or longpress 300 500 800.`,positionalArgs:[`targetOrX`,`yOrDurationMs?`,`durationMs?`],allowsExtraPositionals:!0,allowedFlags:[...xa(`longpress`),...W]},swipe:{helpDescription:`Quick coordinate fling with optional repeat pattern.`,positionalArgs:[`x1`,`y1`,`x2`,`y2`],allowedFlags:[`count`,`pauseMs`,`pattern`]},gesture:{usageOverride:`gesture <pan|fling|swipe|pinch|rotate|transform> ...`,listUsageOverride:`gesture <pan|fling|swipe|pinch|rotate|transform> ...`,helpDescription:`Run touch gestures: pan <x> <y> <dx> <dy> [durationMs], fling <up|down|left|right> <x> <y> [distance], swipe <left|right|left-edge|right-edge>, pinch <scale> [x] [y], rotate <degrees> [x] [y], or transform <x> <y> <dx> <dy> <scale> <degrees> [durationMs]. For command plans, output only command lines. Android transform verification should use all app-observable effects, for example wait text "pan changed yes", wait text "pinch changed yes", and wait text "rotate changed yes", not exact transform values.`,summary:`Run pan, fling, swipe, pinch, rotate, or transform gestures`,positionalArgs:[`pan|fling|swipe|pinch|rotate|transform`,`args?`],allowsExtraPositionals:!0,allowedFlags:[`pointerCount`]},focus:{positionalArgs:[`x`,`y`]},type:{positionalArgs:[`text`],allowsExtraPositionals:!0,allowedFlags:[`delayMs`]},fill:{usageOverride:`fill <x> <y> <text> | fill <@ref|selector> <text>`,positionalArgs:[`targetOrX`,`yOrText`,`text?`],allowsExtraPositionals:!0,allowedFlags:[...W,`delayMs`,`recordAs`,...xa(`fill`)]},scroll:{usageOverride:`scroll <direction|top|bottom> [amount] [--pixels <n>] [--duration-ms <ms>]`,helpDescription:`Scroll in a direction, or toward the top/bottom edge of scrollable content.`,summary:`Scroll in a direction or to an edge`,positionalArgs:[`directionOrEdge`,`amount?`],allowedFlags:[`pixels`,`durationMs`]}};function xa(e){let t=[];return o(e)&&t.push(`verify`),a(e)&&t.push(...kr),t}const Sa=R(X(`click`),(e,t)=>e.interactions.click(Fa(t))),Ca=R(X(`press`),(e,t)=>e.interactions.press(Ia(t))),wa=R(X(`fill`),(e,t)=>e.interactions.fill(La(t))),Ta=R(X(`longpress`),(e,t)=>e.interactions.longPress(Ra(t))),Ea=R(X(`swipe`),(e,t)=>e.interactions.swipe(t)),Da=R(X(`focus`),(e,t)=>e.interactions.focus(t)),Oa=R(X(`type`),(e,t)=>e.interactions.type(t)),ka=R(X(`scroll`),(e,t)=>e.interactions.scroll(t)),Aa=R(X(`get`),(e,t)=>e.interactions.get(Ba(t))),ja=R(X(`is`),(e,t)=>e.interactions.is(t)),Ma=R(X(`find`),(e,t)=>e.interactions.find(t)),Na=R(X(`gesture`),async(e,t)=>{switch(t.kind){case`pan`:return await e.interactions.pan(Va(t));case`fling`:return await e.interactions.fling(Ha(t));case`swipe`:return await e.interactions.swipeGesture(Ua(t));case`pinch`:return await e.interactions.pinch(Wa(t));case`rotate`:return await e.interactions.rotateGesture(Ga(t));case`transform`:return await e.interactions.transformGesture(Ka(t))}}),Pa=F({name:`interaction`,clientSurface:!1,commands:[P({name:`click`,metadata:X(`click`),definition:Sa,cliSchema:Y.click,cliReader:K.click,daemonWriter:q.click,cliOutputFormatter:J.click}),P({name:`press`,metadata:X(`press`),definition:Ca,cliSchema:Y.press,cliReader:K.press,daemonWriter:q.press,cliOutputFormatter:J.press}),P({name:`fill`,metadata:X(`fill`),definition:wa,cliSchema:Y.fill,cliReader:K.fill,daemonWriter:q.fill,cliOutputFormatter:J.fill}),P({name:`longpress`,metadata:X(`longpress`),definition:Ta,cliSchema:Y.longpress,cliReader:K.longpress,daemonWriter:q.longpress,cliOutputFormatter:J.longpress}),P({name:`swipe`,metadata:X(`swipe`),definition:Ea,cliSchema:Y.swipe,cliReader:K.swipe,daemonWriter:q.swipe}),P({name:`focus`,metadata:X(`focus`),definition:Da,cliSchema:Y.focus,cliReader:K.focus,daemonWriter:q.focus}),P({name:`type`,metadata:X(`type`),definition:Oa,cliSchema:Y.type,cliReader:K.type,daemonWriter:q.type}),P({name:`scroll`,metadata:X(`scroll`),definition:ka,cliSchema:Y.scroll,cliReader:K.scroll,daemonWriter:q.scroll}),P({name:`get`,metadata:X(`get`),definition:Aa,cliSchema:Y.get,cliReader:K.get,daemonWriter:q.get,cliOutputFormatter:J.get}),P({name:`is`,metadata:X(`is`),definition:ja,cliSchema:Y.is,cliReader:fa.is,daemonWriter:pa.is,cliOutputFormatter:J.is}),P({name:`find`,metadata:X(`find`),definition:Ma,cliSchema:Y.find,cliReader:fa.find,daemonWriter:pa.find,cliOutputFormatter:J.find}),P({name:`gesture`,metadata:X(`gesture`),definition:Na,cliSchema:Y.gesture,cliReader:Gi.gesture,daemonWriter:Ki.gesture})]});function X(e){let t=Ui.find(t=>t.name===e);if(!t)throw Error(`Missing interaction command metadata for ${e}`);return t}function Fa(e){return{...S(e),...rn(e.target),...sn(e),...on(e),button:e.button,verify:e.verify,...za(e)}}function Ia(e){return{...S(e),...rn(e.target),...sn(e),...on(e),verify:e.verify,...za(e)}}function La(e){return{...S(e),...rn(e.target),...sn(e),text:e.text,delayMs:e.delayMs,recordAs:e.recordAs,verify:e.verify,...za(e)}}function Ra(e){return{...S(e),...rn(e.target),...sn(e),durationMs:e.durationMs,...za(e)}}function za(e){return{settle:e.settle,settleQuietMs:e.settleQuietMs,timeoutMs:e.timeoutMs}}function Ba(e){return{...S(e),...an(e.target),...sn(e),format:e.format,record:e.record}}function Va(e){return{...S(e),x:e.origin.x,y:e.origin.y,dx:e.delta.x,dy:e.delta.y,pointerCount:e.pointerCount,durationMs:e.durationMs}}function Ha(e){return{...S(e),direction:e.direction,x:e.origin.x,y:e.origin.y,distance:e.distance}}function Ua(e){return{...S(e),preset:e.preset}}function Wa(e){return{...S(e),scale:e.scale,x:e.origin?.x,y:e.origin?.y}}function Ga(e){return{...S(e),degrees:e.degrees,x:e.origin?.x,y:e.origin?.y}}function Ka(e){return{...S(e),x:e.origin.x,y:e.origin.y,dx:e.delta.x,dy:e.delta.y,scale:e.scale,degrees:e.degrees,durationMs:e.durationMs}}function qa(e){return{data:{devices:e.map($e)},text:e.map(oo).join(`
5
+ `)}}function Ja(e){return{data:{device:$e(e.device),availableCommands:e.availableCommands},text:[`${oo(e.device)} supports ${e.availableCommands.length} commands:`,e.availableCommands.join(` `)].join(`
6
+ `)}}function Ya(e){return{data:{apps:e.result},stderr:e.appsFilter===`all`?`Showing all apps, including system apps.
7
7
  `:`Showing user-installed apps. Use --all to include system apps.
8
8
  `,text:e.result.length>0?e.result.join(`
9
- `):e.appsFilter===`all`?`No apps found.`:`No user-installed apps found.`}}function To(e){if(`stateDir`in e)return{data:e,text:e.stateDir};let t={sessions:e.sessions.map(ze)};return{data:t,text:JSON.stringify(t,null,2)}}function Eo(e){let t=ke(e),n=[rt(t)].filter(e=>!!e);return typeof t.sessionStateDir==`string`&&n.push(`Session state: ${t.sessionStateDir}`),{data:t,text:n.join(`
10
- `)||null}}function Do(e){return V(Ie(e))}function Oo(e){if(ko(e))return{data:e,text:e.artifacts.length>0?e.artifacts.map(Lo).join(`
11
- `):e.message??`No daemon artifacts available.`};let t=[e.message??`No cloud artifacts available for ${e.provider}.`],n=Ro(e);return n&&t.push(`Retry: ${n}`),{data:e,text:e.cloudArtifacts.length>0?e.cloudArtifacts.map(Io).join(`
9
+ `):e.appsFilter===`all`?`No apps found.`:`No user-installed apps found.`}}function Xa(e){if(`savedScript`in e)return{data:e,text:`Published script: ${e.savedScript}\nSession remains active: ${e.session}\nActions: ${e.actionCount}`};if(`stateDir`in e)return{data:e,text:e.stateDir};let t={sessions:e.sessions.map(Ie)};return{data:t,text:JSON.stringify(t,null,2)}}function Za(e){let t=We(e),n=[Fe(t)].filter(e=>!!e);typeof t.sessionStateDir==`string`&&n.push(`Session state: ${t.sessionStateDir}`);for(let t of e.warnings??[])n.push(`Warning: ${t}`);return{data:t,text:n.join(`
10
+ `)||null}}function Qa(e){return V(He(e))}function $a(e){if(eo(e))return{data:e,text:e.artifacts.length>0?e.artifacts.map(co).join(`
11
+ `):e.message??`No daemon artifacts available.`};let t=[e.message??`No cloud artifacts available for ${e.provider}.`],n=lo(e);return n&&t.push(`Retry: ${n}`),{data:e,text:e.cloudArtifacts.length>0?e.cloudArtifacts.map(so).join(`
12
12
  `):t.join(`
13
- `)}}function ko(e){return`source`in e&&e.source===`daemon`}function Ao(e){return V(Te(e))}function jo(e){return V(Ze(e))}function Mo(e){let t=e,n=t.platform??`unknown`;return{data:t,text:`Boot ready: ${t.device??t.id??`unknown`} (${n})`}}function No(e){let t=e,n=t.platform??`unknown`,r=t.device??t.id??`unknown`,i=t.shutdown;return{data:t,text:`${i&&typeof i==`object`&&`success`in i&&i.success===!0?`Shutdown`:`Shutdown failed`}: ${r} (${n})`}}function Po(e){let t=e,n=[`Doctor: ${typeof t.status==`string`?t.status:`unknown`}`],r=zo(t.checks);if(Nt()){let e=typeof t.summary==`string`?t.summary:void 0;e&&n.push(e)}else if(r.length===0){let e=typeof t.summary==`string`?t.summary:`No blockers found.`;n.push(e)}else for(let e of r)n.push(fe(e)),n.push(...le(e));return{data:t,text:n.join(`
14
- `)}}const Z={boot:z(Mo),shutdown:z(No),devices:z(So),capabilities:z(Co),doctor:z(Po),apps:({input:e,result:t})=>wo({result:t,appsFilter:e.appsFilter}),session:z(To),artifacts:z(Oo),open:z(Eo),close:z(Do),install:z(Ao),reinstall:z(Ao),"install-from-source":z(jo),prepare:B,viewport:B};function Fo(e){let t=e.kind?` ${e.kind}`:``,n=e.target?` target=${e.target}`:``,r=typeof e.booted==`boolean`?` booted=${e.booted}`:``;return`${e.name} (${e.platform}${t}${n})${r}`}function Io(e){let t=e.url?` ${e.url}`:``,n=e.availability?` ${e.availability}`:``;return`${e.kind}: ${e.name}${n}${t}`}function Lo(e){let t=e.artifactType?` (${e.artifactType})`:``;return`${e.filename}${t}: ${e.mimeType} ${e.sizeBytes} bytes id=${e.id}`}function Ro(e){if(e.providerSessionId)return`agent-device artifacts ${e.providerSessionId} --provider ${e.provider} --json`}function zo(e){return Array.isArray(e)?e.filter(e=>!!e&&typeof e==`object`&&!Array.isArray(e)):[]}const Bo=W(`artifacts`,`List daemon or cloud provider artifacts for an active or completed session.`,{provider:p(`Cloud provider name, for example browserstack or aws-device-farm.`),providerSessionId:p(`Cloud provider session id or ARN.`)}),Vo=I({name:`artifacts`,metadata:Bo,definition:R(Bo,(e,t)=>e.sessions.artifacts(t)),cliSchema:{summary:`List daemon or cloud provider session artifacts`,usageOverride:`artifacts [provider-session-id] [--provider <name>]`,positionalArgs:[`provider-session-id?`],allowedFlags:[`provider`,`providerSessionId`]},cliReader:(e,t)=>({...O(t),provider:t.provider,providerSessionId:e[0]??t.providerSessionId}),daemonWriter:E(l.artifacts),cliOutputFormatter:Z.artifacts}),Ho=W(`apps`,`List installed apps.`,{appsFilter:_([`user-installed`,`all`])}),Uo=W(`open`,`Open an app, deep link, URL, or platform surface.`,{app:p(`App name, bundle id, package, or URL.`),url:p(`Optional URL passed with an app shell.`),surface:_(Ce),activity:p(`Android activity name.`),launchConsole:p(`Launch console mode.`),launchArgs:Gt(`Launch arguments forwarded verbatim to the platform launch command.`),relaunch:g(`Force relaunch.`),saveScript:v({oneOf:[Vt(),Rt()]}),deviceHub:g(`Use Xcode Device Hub when surfacing Apple simulators.`),noRecord:g(`Do not record this action.`)}),Wo=W(`close`,`Close an app or end the active session.`,{app:p(`Optional app to close.`),shutdown:g(`Shutdown the session/device where supported.`),saveScript:v({oneOf:[Vt(),Rt()]})}),Go=R(Ho,(e,t)=>e.apps.list(t)),Ko=R(Uo,(e,t)=>e.apps.open(t)),qo=R(Wo,(e,t)=>t.app?e.apps.close(t):e.sessions.close(os(t))),Jo={helpDescription:`List user-installed apps; use --all to include system/OEM apps`,summary:`List installed apps`,allowedFlags:[`appsFilter`],defaults:{appsFilter:At}},Yo={helpDescription:`Boot device/simulator; optionally launch app or deep link URL. Use --platform to bind URL/deep-link opens to the target platform. For iOS simulator initial stdout/stderr, put --launch-console <path> on this open command, for example agent-device open "Agent Device Tester" --platform ios --launch-console artifacts/launch-console.log. Expo Go/dev-client shells accept host + URL, for example agent-device open "Expo Go" exp://127.0.0.1:8081 --platform ios. macOS also supports --surface app|frontmost-app|desktop|menubar.`,summary:`Open an app, deep link or URL, save replays`,positionalArgs:[`appOrUrl?`,`url?`],allowedFlags:[`activity`,`launchConsole`,`launchArgs`,`deviceHub`,`saveScript`,`noRecord`,`relaunch`,`surface`]},Xo={positionalArgs:[`app?`],allowedFlags:[`saveScript`,`shutdown`]},Zo=(e,t)=>({...O(t),appsFilter:kt(t.appsFilter)}),Qo=(e,t)=>({...O(t),app:e[0],url:e[1],surface:t.surface,activity:t.activity,launchConsole:t.launchConsole,launchArgs:t.launchArgs,relaunch:t.relaunch,saveScript:t.saveScript,deviceHub:t.deviceHub,noRecord:t.noRecord}),$o=(e,t)=>({...O(t),app:e[0],shutdown:t.shutdown,saveScript:t.saveScript}),es=E(l.apps),ts=E(l.open,ss),ns=E(l.close,e=>M(e.app)),rs=I({name:`apps`,metadata:Ho,definition:Go,cliSchema:Jo,cliReader:Zo,daemonWriter:es,cliOutputFormatter:Z.apps}),is=I({name:`open`,metadata:Uo,definition:Ko,cliSchema:Yo,cliReader:Qo,daemonWriter:ts,cliOutputFormatter:Z.open}),as=I({name:`close`,metadata:Wo,definition:qo,cliSchema:Xo,cliReader:$o,daemonWriter:ns,cliOutputFormatter:Z.close});function os(e){let{app:t,...n}=e;return n}function ss(e){return e.app?e.url?[e.app,e.url]:[e.app]:[]}const cs=W(`devices`,`List available devices.`,{}),ls=W(`capabilities`,`List commands supported by the selected device.`,{}),us=W(`boot`,`Boot or prepare a selected device without using CLI positional arguments.`,{headless:g(`Boot without showing simulator UI when supported.`)}),ds=W(`shutdown`,`Shutdown a selected simulator or emulator.`,{}),fs=R(cs,(e,t)=>e.devices.list(t)),ps=R(ls,(e,t)=>e.devices.capabilities(t)),ms=R(us,(e,t)=>e.devices.boot(t)),hs=R(ds,(e,t)=>e.devices.shutdown(t)),gs={summary:`Boot target device/simulator`,allowedFlags:[`headless`]},_s={summary:`List supported commands for the selected device`,helpDescription:`List command names supported by the selected session device or explicit --platform/--device/--udid/--serial target.`},vs={summary:`Shutdown target simulator/emulator`},ys=(e,t)=>O(t),bs=(e,t)=>({...O(t),headless:t.headless}),xs=E(l.devices),Ss=E(l.capabilities),Cs=E(l.boot),ws=E(l.shutdown),Ts=[I({name:`devices`,metadata:cs,definition:fs,cliReader:ys,daemonWriter:xs,cliOutputFormatter:Z.devices}),I({name:`capabilities`,metadata:ls,definition:ps,cliSchema:_s,cliReader:ys,daemonWriter:Ss,cliOutputFormatter:Z.capabilities}),I({name:`boot`,metadata:us,definition:ms,cliSchema:gs,cliReader:bs,daemonWriter:Cs,cliOutputFormatter:Z.boot}),I({name:`shutdown`,metadata:ds,definition:hs,cliSchema:vs,cliReader:ys,daemonWriter:ws,cliOutputFormatter:Z.shutdown})],Es=W(`doctor`,`Diagnose device, app, Metro, and React Native setup/readiness issues.`,{targetApp:p(`Installed app package/bundle id or app name to verify without opening a session.`),remote:g(`Check remote connection setup instead of local device inventory.`)}),Ds=I({name:`doctor`,metadata:Es,definition:R(Es,(e,t)=>e.command.doctor(t)),cliSchema:{usageOverride:`doctor [--platform ios|android|macos|linux|web|apple] [--app <id-or-name>] [--remote]`,helpDescription:`Setup and recovery diagnostic for device, app, dev-server, and RN/Expo readiness issues. Reports local device inventory, active sessions, optional app discovery, scoped toolchain info, and Metro reachability inferred from cwd/runtime. On iOS simulators it also warms the XCTest runner build cache in the background when missing. Pass --app to verify a target app on the one matching booted device without opening a session. Use --remote to check remote connection setup without probing local devices. Default output is compact; use --json for full checks and evidence.`,summary:`Diagnose device, app, dev-server, and RN/Expo readiness`,allowedFlags:[`targetApp`,`remote`]},cliReader:(e,t)=>({...O(t),targetApp:t.targetApp,remote:t.remote}),daemonWriter:E(l.doctor),cliOutputFormatter:Z.doctor});function Os(t,n=`--github-actions-artifact`){let r=t.indexOf(`:`);if(r<=0||r===t.length-1)throw new e(`INVALID_ARGS`,`${n} must use owner/repo:artifact, for example thymikee/RNCLI83:6635342232`);let{owner:i,repo:a}=js(t.slice(0,r),n);return As(i,a,t.slice(r+1),`${n} artifact`)}function ks(t,n){if(!t||typeof t!=`object`||Array.isArray(t))throw new e(`INVALID_ARGS`,`${n} installSource must be an object.`);let r=t;if(Ns(r.type,`${n} installSource.type`)!==`github-actions-artifact`)throw new e(`INVALID_ARGS`,`${n} installSource.type must be "github-actions-artifact".`);let{owner:i,repo:a}=js(Ns(r.repo,`${n} installSource.repo`),`${n} installSource.repo`);return As(i,a,r.artifact,`${n} installSource.artifact`)}function As(e,t,n,r){return typeof n==`number`||Fs(n)?{kind:`github-actions-artifact`,owner:e,repo:t,artifactId:Ps(n,r)}:{kind:`github-actions-artifact`,owner:e,repo:t,artifactName:Ns(n,r)}}function js(t,n){let r=t.indexOf(`/`);if(r<=0||r===t.length-1||t.indexOf(`/`,r+1)!==-1)throw new e(`INVALID_ARGS`,`${n} must use owner/repo.`);let i={owner:t.slice(0,r).trim(),repo:t.slice(r+1).trim()};if(!i.owner||!i.repo)throw new e(`INVALID_ARGS`,`${n} must use owner/repo.`);return i}function Ms(e){return typeof e==`string`&&e.trim().length>0?e.trim():void 0}function Ns(t,n){let r=Ms(t);if(!r)throw new e(`INVALID_ARGS`,`${n} must be a non-empty string.`);return r}function Ps(t,n){let r=typeof t==`number`?t:typeof t==`string`?Number(t):NaN;if(!Number.isInteger(r))throw new e(`INVALID_ARGS`,`${n} must be an integer.`);return r}function Fs(e){return typeof e==`string`&&/^\d+$/.test(e.trim())}const Is=W(`install`,`Install an app binary.`,{app:p(`Optional app identifier hint.`),appPath:f(p(`Path to app binary.`))}),Ls=W(`reinstall`,`Reinstall an app binary.`,{app:f(p()),appPath:f(p(`Path to app binary.`))}),Rs=W(`install-from-source`,`Install an app from a structured source.`,{source:f(v(Ut(`Install source object.`))),retainPaths:g(),retentionMs:h()}),zs=R(Is,(e,t)=>e.apps.install(t)),Bs=R(Ls,(e,t)=>e.apps.reinstall(t)),Vs=R(Rs,(e,t)=>e.apps.installFromSource(t)),Hs={usageOverride:`install <path> | install <app> <path>`,listUsageOverride:`install <path>`,positionalArgs:[`appOrPath`,`path?`]},Us={positionalArgs:[`app`,`path`]},Ws={usageOverride:`install-from-source <url> | install-from-source --github-actions-artifact <owner/repo:artifact>`,listUsageOverride:`install-from-source`,helpDescription:`Install app builds from URLs, remote source specs, or CI artifacts resolved by a remote daemon.`,summary:`Install app builds from URLs, remote source specs, or CI artifacts`,positionalArgs:[`url?`],allowedFlags:[`header`,`githubActionsArtifact`,`installSource`,`retainPaths`,`retentionMs`]},Gs=(e,t)=>Zs(e,t),Ks=(e,t)=>Qs(e,t),qs=(e,t)=>({...O(t),source:tc(e,t),retainPaths:t.retainPaths,retentionMs:t.retentionMs}),Js=E(l.install,e=>$s(e.app,e.appPath)),Ys=E(l.reinstall,e=>ec(e.app,e.appPath)),Xs=[I({name:`install`,metadata:Is,definition:zs,cliSchema:Hs,cliReader:Gs,daemonWriter:Js,cliOutputFormatter:Z.install}),I({name:`reinstall`,metadata:Ls,definition:Bs,cliSchema:Us,cliReader:Ks,daemonWriter:Ys,cliOutputFormatter:Z.reinstall}),I({name:`install-from-source`,metadata:Rs,definition:Vs,cliSchema:Ws,cliReader:qs,daemonWriter:e=>D(we.installSource,[],{...e,installSource:e.source,retainMaterializedPaths:e.retainPaths,materializedPathRetentionMs:e.retentionMs}),cliOutputFormatter:Z[`install-from-source`]})];function Zs(e,t){let[n,r]=e,i=r!==void 0;return{...O(t),...i?{app:P(n,`install requires app`)}:{},appPath:P(i?r:n,`install requires path`)}}function Qs(e,t){return{...O(t),app:P(e[0],`reinstall requires app`),appPath:P(e[1],`reinstall requires path`)}}function $s(e,t){let n=F(t,`missing app path`);return typeof e==`string`&&e.length>0?[e,n]:[n]}function ec(e,t){return[F(e,`missing first positional`),F(t,`missing second positional`)]}function tc(t,n){let r=t[0]?.trim();if(t.length>1)throw new e(`INVALID_ARGS`,`install-from-source accepts either one <url> positional or --github-actions-artifact`);let i=n.githubActionsArtifact?Os(n.githubActionsArtifact):void 0,a=n.installSource;if(+!!r+ +!!i+ +!!a!=1)throw new e(`INVALID_ARGS`,`install-from-source requires exactly one source: <url>, --github-actions-artifact, or config installSource`);if(!r&&n.header&&n.header.length>0)throw new e(`INVALID_ARGS`,`install-from-source --header is only supported for URL sources`);return i||a||{kind:`url`,url:r,headers:nc(n.header)}}function nc(t){if(!t||t.length===0)return;let n={};for(let r of t){let t=r.indexOf(`:`);if(t<=0)throw new e(`INVALID_ARGS`,`Invalid --header value "${r}". Expected "name:value".`);let i=r.slice(0,t).trim(),a=r.slice(t+1).trim();if(!i)throw new e(`INVALID_ARGS`,`Invalid --header value "${r}". Header name cannot be empty.`);n[i]=a}return n}const rc=W(`prepare`,`Prepare platform helper infrastructure.`,{action:f(_([`ios-runner`])),timeoutMs:h(`Maximum wall-clock time for the prepare command.`)}),ic=I({name:`prepare`,metadata:rc,definition:R(rc,(e,t)=>e.command.prepare(t)),cliSchema:{usageOverride:`prepare ios-runner --platform ios|macos [--timeout <ms>]`,listUsageOverride:`prepare`,helpDescription:`Prepare platform helper infrastructure. ios-runner builds/reuses, starts, and health-checks the XCTest runner so later Apple snapshots and interactions do not pay first-use startup cost. In JSON output, top-level buildMs/connectMs/healthCheckMs are diagnostic fields and may overlap; use timing.additiveParts for additive wall-clock phase totals. In CI, run it after boot/install and before replay/test; if replay/test starts a separate daemon, stop the prepare daemon before replay/test so it does not keep the prepared runner lease. It is not a recovery step for "runner already owned by another agent-device daemon"; stop the owning daemon on the Mac with simulator access instead. Runner build/start output is written to the session runner.log; daemon.log is for daemon lifecycle/startup issues.`,summary:`Pre-warm platform helpers, especially the iOS/macOS XCTest runner before Apple automation`,positionalArgs:[`ios-runner`],allowedFlags:[`timeoutMs`]},cliReader:(e,t)=>({...O(t),action:P(e[0],`prepare requires subcommand`),timeoutMs:t.timeoutMs}),daemonWriter:E(l.prepare,e=>[F(e.action,`prepare requires subcommand`)]),cliOutputFormatter:Z.prepare}),ac=W(`push`,`Deliver a push payload.`,{app:f(p()),payload:f(v({oneOf:[Rt(),Ut()]}))}),oc=W(`trigger-app-event`,`Trigger an app-defined event.`,{event:f(p()),payload:vc()}),sc=R(ac,(e,t)=>e.apps.push(t)),cc=R(oc,(e,t)=>e.apps.triggerEvent(t)),lc={listUsageOverride:`push`,helpDescription:`Deliver push notification payloads to an installed app.`,summary:`Deliver push notification payloads to an installed app`,positionalArgs:[`bundleOrPackage`,`payloadOrJson`]},uc={usageOverride:`trigger-app-event <event> [payloadJson]`,listUsageOverride:`trigger-app-event`,helpDescription:`Invoke app-defined automation or test events with an optional structured payload.`,summary:`Invoke app-defined automation/test events with optional structured payloads`,positionalArgs:[`event`,`payloadJson?`]},dc=(e,t)=>({...O(t),app:P(e[0],`push requires bundleOrPackage`),payload:P(e[1],`push requires payloadOrJson`)}),fc=(e,t)=>({...O(t),event:P(e[0],`trigger-app-event requires event`),payload:e[1]?Hn(e[1],`trigger-app-event payload`):void 0}),pc=E(l.push,e=>gc(e)),mc=E(l.triggerAppEvent,e=>_c(e)),hc=[I({name:`push`,metadata:ac,definition:sc,cliSchema:lc,cliReader:dc,daemonWriter:pc}),I({name:`trigger-app-event`,metadata:oc,definition:cc,cliSchema:uc,cliReader:fc,daemonWriter:mc})];function gc(e){return[e.app,typeof e.payload==`string`?e.payload:JSON.stringify(e.payload)]}function _c(e){return[e.event,...e.payload?[JSON.stringify(e.payload)]:[]]}function vc(){return Wt()}const yc=W(`session`,`List active sessions or print daemon state directory.`,{action:_([`list`,`state-dir`],`list shows active sessions; state-dir prints the resolved daemon state directory without contacting the daemon.`)}),bc=I({name:`session`,metadata:yc,definition:R(yc,async(e,{action:t,...n})=>t===`state-dir`?{stateDir:await e.sessions.stateDir(n)}:{sessions:await e.sessions.list(n)}),cliSchema:{usageOverride:`session list | session state-dir`,listUsageOverride:`session`,helpDescription:`List active sessions or print the effective daemon state directory`,positionalArgs:[`list|state-dir?`]},cliReader:(e,t)=>({...O(t),action:xc(e[0])}),cliOutputFormatter:Z.session});function xc(t){let n=t??`list`;if(n===`list`||n===`state-dir`)return n;throw new e(`INVALID_ARGS`,`session only supports list or state-dir`)}const Sc=W(`viewport`,`Resize the active web viewport.`,{width:f(h(`Viewport width in CSS pixels.`,{min:1})),height:f(h(`Viewport height in CSS pixels.`,{min:1}))}),Cc=I({name:`viewport`,metadata:Sc,definition:R(Sc,(e,t)=>e.command.viewport(t)),cliSchema:{helpDescription:`Resize the active web viewport before taking snapshots or screenshots. Useful for fixed-layout or 100vh apps where changing the viewport reveals different content.`,summary:`Resize the active web viewport for the current session`,positionalArgs:[`width`,`height`]},cliReader:(e,t)=>({...O(t),width:Ge(e[0],`width`),height:Ge(e[1],`height`)}),daemonWriter:E(l.viewport,e=>{let{width:t,height:n}=e;return[String(t),String(n)]}),cliOutputFormatter:Z.viewport}),wc=L({name:`management`,commands:[...Ts,Vo,Ds,ic,rs,bc,is,as,Cc,...Xs,...hc]});function Tc(e){return{data:e.result,text:e.action===`reload`?`Reloaded React Native apps via ${e.result.reloadUrl}`:JSON.stringify(e.result,null,2)}}const Ec={metro:({input:e,result:t})=>Tc({result:t,action:e.action})},Dc=[`auto`,`react-native`,`expo`,`repack`];function Oc(t){if(t!==void 0){if(Dc.includes(t))return t;throw new e(`INVALID_ARGS`,`metro prepare --kind must be auto, react-native, expo, or repack`)}}const kc=`metro`,Ac=W(kc,`Prepare React Native dev-server runtime or reload apps.`,{action:f(_([`prepare`,`reload`])),projectRoot:p(),kind:v(Rt()),publicBaseUrl:p(),proxyBaseUrl:p(),bearerToken:p(),bridgeScope:v({type:`object`,additionalProperties:!0}),launchUrl:p(),port:h(),listenHost:p(),statusHost:p(),startupTimeoutMs:h(),probeTimeoutMs:h(),reuseExisting:g(),installDependenciesIfNeeded:g(),runtimeFilePath:p(),logPath:p(),metroHost:p(),metroPort:h(),bundleUrl:p(),timeoutMs:h()}),jc=L({name:`metro`,commands:[I({name:kc,metadata:Ac,definition:R(Ac,async(e,t)=>t.action===`prepare`?await e.metro.prepare(Mc(t)):await e.metro.reload(Pc(t))),cliSchema:{usageOverride:`metro prepare (--public-base-url <url> | --proxy-base-url <url>) [--project-root <path>] [--port <port>] [--kind auto|react-native|expo|repack]
15
- agent-device metro reload [--metro-host <host>] [--metro-port <port>] [--bundle-url <url>]`,listUsageOverride:`metro`,helpDescription:`Prepare a local React Native dev-server runtime or ask connected apps to reload`,summary:`Prepare Metro/Re.Pack reachability for React Native/Expo apps or trigger app reloads`,positionalArgs:[`prepare|reload`],allowedFlags:[...wr,...Cr]},cliReader:(t,n)=>{let r=(t[0]??``).toLowerCase();if(r!==`prepare`&&r!==`reload`)throw new e(`INVALID_ARGS`,`metro requires a subcommand: prepare or reload`);if(r===`reload`)return{action:r,metroHost:n.metroHost,metroPort:n.metroPort,bundleUrl:n.bundleUrl,timeoutMs:n.metroProbeTimeoutMs};if(!n.metroPublicBaseUrl&&!n.metroProxyBaseUrl)throw new e(`INVALID_ARGS`,`metro prepare requires --public-base-url <url> or --proxy-base-url <url>.`);return{action:r,projectRoot:n.metroProjectRoot,kind:Oc(n.kind??n.metroKind),port:n.metroPreparePort,listenHost:n.metroListenHost,statusHost:n.metroStatusHost,publicBaseUrl:n.metroPublicBaseUrl,proxyBaseUrl:n.metroProxyBaseUrl,bearerToken:n.metroBearerToken,bridgeScope:n.tenant&&n.runId&&n.leaseId?{tenantId:n.tenant,runId:n.runId,leaseId:n.leaseId}:void 0,startupTimeoutMs:n.metroStartupTimeoutMs,probeTimeoutMs:n.metroProbeTimeoutMs,reuseExisting:n.metroNoReuseExisting?!1:void 0,installDependenciesIfNeeded:n.metroNoInstallDeps?!1:void 0,runtimeFilePath:n.metroRuntimeFile}},cliOutputFormatter:Ec.metro})]});function Mc(e){return{projectRoot:e.projectRoot,kind:e.kind,publicBaseUrl:e.publicBaseUrl,proxyBaseUrl:e.proxyBaseUrl,bearerToken:e.bearerToken,bridgeScope:e.bridgeScope??Nc(e),port:e.port,listenHost:e.listenHost,statusHost:e.statusHost,startupTimeoutMs:e.startupTimeoutMs,probeTimeoutMs:e.probeTimeoutMs,reuseExisting:e.reuseExisting,installDependenciesIfNeeded:e.installDependenciesIfNeeded,runtimeFilePath:e.runtimeFilePath}}function Nc(e){return e.tenant&&e.runId&&e.leaseId?{tenantId:e.tenant,runId:e.runId,leaseId:e.leaseId}:void 0}function Pc(e){return{metroHost:e.metroHost,metroPort:e.metroPort,bundleUrl:e.bundleUrl,timeoutMs:e.timeoutMs}}const Fc=[`started`,`stopped`,`marked`,`cleared`,`restarted`,`removedRotatedFiles`];function Ic(e){return{data:e,text:e.path,stderr:ul([cl(e,[`active`,`state`,`backend`,`sizeBytes`]),el(e),e.hint,ll(e.notes)])}}function Lc(e){let t=e.events??[];return{data:e,text:t.length>0?Vc(t):`No session events found.`,stderr:ul([cl(e,[`path`,`cursor`,`nextCursor`,`limit`])])}}function Rc(e){let t=[],n=e.entries??[];if(e.path&&t.push(e.path),n.length===0)t.push(`No recent HTTP(s) entries found.`);else for(let e of n)t.push(...al(e));return{data:e,text:t.join(`
16
- `),stderr:ul([cl(e,[`active`,`state`,`backend`,`include`,`scannedLines`,`matchedLines`]),ll(e.notes)])}}function zc(e){return{data:e,text:[`Audio probe: ${String(e.state??`stopped`)} heard=${String(e.heard===!0)}`,$c(`rmsDbfs`,e.rmsDbfs),$c(`peakDbfs`,e.peakDbfs)].filter(e=>!!e).join(`
17
- `),stderr:ul([cl(e,[`active`,`backend`,`source`,`durationMs`,`elapsedMs`,`bucketMs`,`sampleCount`,`sourceCount`,`mediaElementCount`]),ll(e.notes)])}}const Bc={logs:z(Ic),events:z(Lc),network:z(Rc),audio:z(zc)};function Vc(e){let t=e.map(Hc),n=Math.min(Math.max(...t.map(e=>e.label.length),5),32);return t.map(e=>Uc(e,n)).join(`
18
- `)}function Hc(e){return{timestamp:Wc(e.ts),label:Gc(e),summary:Kc(e)}}function Uc(e,t){let n=e.label.padEnd(t),r=e.timestamp?`${e.timestamp} ${n}`:n.trimEnd();return e.summary?`${r} ${e.summary}`:r.trimEnd()}function Wc(e){return e?e.replace(`T`,` `):``}function Gc(e){let t=e.command??`command`;switch(e.kind){case`request.started`:return`start ${t}`;case`request.finished`:return nl([e.status===`error`?`error`:`ok`,t,Qc(il(e.details?.durationMs))]);case`action.recorded`:return`action ${t}`;default:return nl([e.kind??`event`,e.command])}}function Kc(e){let t=qc(e.summary,e);return`${t}${Jc(e,t)}`.trim()}function qc(e,t){let n=e?.trim()??``,r=t.command??``;return t.kind===`request.started`&&n===`Started ${r}`||t.kind===`request.finished`&&n===`Finished ${r}`?``:n}function Jc(e,t){if(e.kind!==`action.recorded`)return``;let n=e.details;if(!n)return``;let r=[Yc(n,t),Zc(il(n.textLength))].filter(e=>!!e);return r.length>0?` (${r.join(`, `)})`:``}function Yc(e,t){let n=rl(e.ref)??rl(e.selector)??Xc(e);if(!(!n||t.includes(n)))return`target=${n}`}function Xc(e){let t=il(e.x),n=il(e.y);return t===void 0||n===void 0?void 0:`(${t}, ${n})`}function Zc(e){return e===void 0?void 0:`text=${e} chars`}function Qc(e){return e===void 0?void 0:`${Math.round(e)}ms`}function $c(e,t){if(!Array.isArray(t))return;let n=t.filter(e=>typeof e==`number`&&Number.isFinite(e));return n.length>0?`${e}: [${n.join(`, `)}]`:void 0}function el(e){return Fc.map(t=>tl(t,e[t])).filter(Boolean).join(` `)||void 0}function tl(e,t){return t==null?``:`${e}=${t}`}function nl(e){return e.filter(e=>!!e).join(` `)}function rl(e){return typeof e==`string`&&e.trim().length>0?e:void 0}function il(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}function al(e){let t=e.method??`HTTP`,n=e.url??`<unknown-url>`,r=e.status===void 0?``:` status=${e.status}`,i=[`${e.timestamp?`${e.timestamp} `:``}${t} ${n}${r}${e.durationMs===void 0?``:` durationMs=${e.durationMs}`}`];return e.headers?sl(i,`headers`,e.headers):(ol(i,`request headers`,e.requestHeaders),ol(i,`response headers`,e.responseHeaders)),sl(i,`request`,e.requestBody),sl(i,`response`,e.responseBody),i}function ol(e,t,n){!n||Object.keys(n).length===0||e.push(` ${t}: ${JSON.stringify(n)}`)}function sl(e,t,n){n!==void 0&&e.push(` ${t}: ${n}`)}function cl(e,t){return t.map(t=>e[t]!==void 0&&e[t]!==null?`${t}=${e[t]}`:``).filter(Boolean).join(` `)||void 0}function ll(e){let t=e?.filter(e=>e.length>0)??[];return t.length>0?t.join(`
19
- `):void 0}function ul(e){return e.filter(e=>!!e).join(`
20
- `)||void 0}const dl=`logs`,fl=`events`,pl=`network`,ml=`audio`,hl=[`dump`,`log`],gl=[`probe`],_l=[`start`,`status`,`stop`],vl=W(dl,`Manage session app logs.`,{action:_(je),message:p(),restart:g()}),yl=W(fl,`Read the session event timeline.`,{limit:h(),cursor:p()}),bl=W(pl,`Show recent HTTP traffic.`,{action:_(hl),limit:h(),include:_(n)}),xl=W(ml,`Probe audio levels.`,{action:_(gl),probeAction:_(_l),durationMs:h(`Probe duration in milliseconds.`),bucketMs:h(`Audio level bucket size in milliseconds.`)}),Sl=R(vl,(e,t)=>e.observability.logs(t)),Cl=R(yl,(e,t)=>e.observability.events(t)),wl=R(bl,(e,t)=>e.observability.network(t)),Tl=R(xl,(e,t)=>e.observability.audio(t)),El=L({name:`observability`,commands:[I({name:dl,metadata:vl,definition:Sl,cliSchema:{usageOverride:`logs path | logs start | logs stop | logs clear [--restart] | logs doctor | logs mark [message...]`,helpDescription:`Session app log info, start/stop streaming, diagnostics, and markers`,summary:`Manage session app logs`,positionalArgs:[`path|start|stop|clear|doctor|mark`,`message?`],allowsExtraPositionals:!0,allowedFlags:[`restart`]},cliReader:(e,t)=>({...O(t),action:jl(e[0]),message:e.slice(1).join(` `)||void 0,restart:t.restart}),daemonWriter:E(dl,e=>Dl(e)),cliOutputFormatter:Bc.logs}),I({name:fl,metadata:yl,definition:Cl,cliSchema:{usageOverride:`events [limit] [cursor]`,listUsageOverride:`events`,helpDescription:`Read the daemon-owned session event timeline as paged JSON-friendly entries`,summary:`Read session event timeline`,positionalArgs:[`limit?`,`cursor?`]},cliReader:(e,t)=>({...O(t),limit:e[0]?.trim()?j(e[0]):void 0,cursor:e[1]}),daemonWriter:e=>D(fl,Ol(e),e),cliOutputFormatter:Bc.events}),I({name:pl,metadata:bl,definition:wl,cliSchema:{usageOverride:`network dump [limit] [summary|headers|body|all] [--include summary|headers|body|all] | network log [limit] [summary|headers|body|all] [--include summary|headers|body|all]`,listUsageOverride:`network`,helpDescription:`Dump recent HTTP(s) traffic parsed from the session app log`,summary:`Inspect HTTP(S) traffic parsed from session app logs, including summaries, headers, and bodies`,positionalArgs:[`dump|log`,`limit?`,`include?`],allowedFlags:[`networkInclude`]},cliReader:(e,t)=>({...O(t),action:Ml(e[0]),limit:j(e[1]),include:t.networkInclude??Nl(e[2])}),daemonWriter:e=>D(pl,kl(e),{...e,networkInclude:e.include}),cliOutputFormatter:Bc.network}),I({name:ml,metadata:xl,definition:Tl,cliSchema:{usageOverride:`audio probe start [durationSeconds] [bucketMs] | audio probe status | audio probe stop`,listUsageOverride:`audio`,helpDescription:`Probe browser or host-rendered simulator/emulator audio as compact dBFS buckets`,summary:`Probe audio levels`,positionalArgs:[`probe`,`start|status|stop`,`durationSeconds?`,`bucketMs?`]},cliReader:(e,t)=>({...O(t),action:Pl(e[0]),probeAction:Fl(e[1]),durationMs:Il(e[2]),bucketMs:j(e[3])}),daemonWriter:e=>D(ml,Al(e),e),cliOutputFormatter:Bc.audio})]});function Dl(e){return[e.action??`path`,...M(e.message)]}function Ol(e){return e.cursor===void 0?N(e.limit):[e.limit===void 0?``:String(e.limit),e.cursor]}function kl(e){return[...e.action?[e.action]:[],...N(e.limit)]}function Al(e){return[e.action??`probe`,e.probeAction??`status`,...N(e.durationMs),...N(e.bucketMs)]}function jl(e){if(e!==void 0)return te(je,e,{message:`logs requires path, start, stop, doctor, mark, or clear`})}function Ml(t){if(t!==void 0){if(t===`dump`||t===`log`)return t;throw new e(`INVALID_ARGS`,`network requires dump or log`)}}function Nl(e){if(e!==void 0)return te(n,e,{message:`network include must be summary, headers, body, or all`})}function Pl(e){if(e!==void 0)return te(gl,e,{message:`audio requires probe`})}function Fl(e){if(e!==void 0)return te(_l,e,{message:`audio probe requires start, status, or stop`})}function Il(e){let t=j(e);return t===void 0?void 0:Math.round(t*1e3)}function Ll(e){let t=e;return{data:t,text:zl(t)}}const Rl={perf:z(Ll)};function zl(e){let t=Ul(e);if(t)return t;let n=u(e.artifact)?e.artifact:void 0;return n?Hl(n):Bl(u(e.metrics)?e.metrics:void 0)}function Bl(e){let t=u(e?.fps)?e.fps:void 0,n=ou(e);if(!t)return $l(n,`missing frame metric`);if(t.available===!1)return $l(n,eu(t));let r=tu(t);return r?Vl(t,r):$l(n,`missing dropped-frame summary`)}function Vl(e,t){let n=[`Frame health: ${t}`],r=iu(e);return r.length>0&&n.push(`Worst windows:`,...r),n.join(`
21
- `)}function Hl(e){let t=typeof e.kind==`string`?e.kind:`memory`;if(e.available===!1)return`Memory artifact (${t}): unavailable - ${typeof e.reason==`string`&&e.reason.length>0?e.reason:`not available`}`;let n=typeof e.path==`string`?e.path:void 0,r=Q(e.sizeBytes),i=r===void 0?``:` (${fu(r)})`;return n?`Memory artifact (${t}): ${n}${i}`:`Memory artifact (${t}): captured${i}`}function Ul(e){return e.kind===`xctrace`?Wl(e):ql(e)}function Wl(e){let t=typeof e.perf==`string`?e.perf:void 0,n=Gl(e);if(!(!t||!n||e.kind!==`xctrace`))return Kl(n,typeof e.mode==`string`?e.mode:`capture`,t,e.template)}function Gl(e){return typeof e.outPath==`string`?e.outPath:typeof e.reportPath==`string`?e.reportPath:void 0}function Kl(e,t,n,r){let i=[e,`Perf ${t}: ${n}`];return typeof r==`string`&&i.push(`Template: ${r}`),i.join(`
22
- `)}function ql(e){let t=Jl(e);if(t)return`Perf ${t.action}: ${t.kind} ${t.type}${Yl(e)}${Xl(e)}${Ql(e)}`}function Jl(e){let t=Zl(e.action),n=Zl(e.kind),r=Zl(e.type);return t&&n&&r?{action:t,kind:n,type:r}:void 0}function Yl(e){let t=Zl(e.state);return t?` state=${t}`:``}function Xl(e){let t=Zl(e.outPath);if(!t)return``;let n=Q(e.sizeBytes);return`\n${t}${n===void 0?``:` (${fu(n)})`}`}function Zl(e){return typeof e==`string`?e:void 0}function Ql(e){let t=u(e.summary)?e.summary:void 0,n=u(t?.frameHealth)?t.frameHealth:void 0;if(!n||n.available!==!0)return``;let r=Q(n.droppedFramePercent),i=Q(n.droppedFrameCount),a=Q(n.totalFrameCount);return r===void 0||i===void 0||a===void 0?``:`\nTrace frame health: dropped ${lu(r)} (${Math.round(i)}/${Math.round(a)} frames)`}function $l(e,t){return e?`Performance: ${e}`:`Frame health: unavailable - ${t}`}function eu(e){return typeof e.reason==`string`&&e.reason.length>0?e.reason:`not available`}function tu(e){let t=Q(e.droppedFramePercent),n=Q(e.droppedFrameCount);if(!(t===void 0||n===void 0))return[`dropped ${lu(t)}`,nu(n,Q(e.totalFrameCount)),ru(Q(e.sampleWindowMs))].filter(Boolean).join(` `)}function nu(e,t){return t===void 0?`(${Math.round(e)} dropped frames)`:`(${Math.round(e)}/${Math.round(t)} frames)`}function ru(e){return e===void 0?``:`window ${uu(e)}`}function iu(e){return Array.isArray(e.worstWindows)?e.worstWindows.flatMap(e=>{if(!u(e))return[];let t=au(e);return t?[t]:[]}):[]}function au(e){let t=Q(e.startOffsetMs),n=Q(e.endOffsetMs),r=Q(e.missedDeadlineFrameCount);if(t===void 0||n===void 0||r===void 0)return;let i=Q(e.worstFrameMs),a=i===void 0?``:`, worst ${uu(i)}`;return`- +${uu(t)}-+${uu(n)}: ${Math.round(r)} missed-deadline frames${a}`}function ou(e){let t=u(e?.cpu)?e.cpu:void 0,n=u(e?.memory)?e.memory:void 0,r=[su(t),cu(n)].filter(e=>!!e);return r.length>0?r.join(`, `):void 0}function su(e){if(e?.available!==!0)return;let t=Q(e.usagePercent);return t===void 0?void 0:`CPU ${lu(t)}`}function cu(e){if(e?.available!==!0)return;let t=Q(e.residentMemoryKb)??Q(e.totalPssKb)??Q(e.totalRssKb);return t===void 0?void 0:`memory ${du(t)}`}function Q(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}function lu(e){return`${Number.isInteger(e)?e:e.toFixed(1)}%`}function uu(e){let t=Math.max(0,Math.round(e));if(t<1e3)return`${t}ms`;let n=Math.round(t/1e3);if(n<60)return`${n}s`;let r=Math.floor(n/60),i=n%60;return i>0?`${r}m ${i}s`:`${r}m`}function du(e){let t=e/1024;return`${t>=10?Math.round(t):t.toFixed(1)}MB`}function fu(e){if(e<1024)return`${Math.round(e)}B`;let t=e/1024;if(t<1024)return`${t>=10?Math.round(t):t.toFixed(1)}KB`;let n=t/1024;return`${n>=10?Math.round(n):n.toFixed(1)}MB`}const pu=`perf`,mu=W(pu,`Show session performance, frame health, and memory diagnostics.`,{area:_(pe),subject:_(ce),action:_(ae),kind:_(at),template:p(`xctrace template name, for example Time Profiler.`),out:p(`Output artifact path.`),tracePath:p(`Existing .trace path to report, defaults to the latest session trace.`)}),hu=L({name:`perf`,commands:[I({name:pu,metadata:mu,definition:R(mu,(e,t)=>e.observability.perf(t)),cliSchema:{usageOverride:`perf metrics --json
13
+ `)}}function eo(e){return`source`in e&&e.source===`daemon`}function to(e){return V(it(e))}function no(e){return V(Ke(e))}function ro(e){let t=e,n=t.platform??`unknown`;return{data:t,text:`Boot ready: ${t.device??t.id??`unknown`} (${n})`}}function io(e){let t=e,n=t.platform??`unknown`,r=t.device??t.id??`unknown`,i=t.shutdown;return{data:t,text:`${i&&typeof i==`object`&&`success`in i&&i.success===!0?`Shutdown`:`Shutdown failed`}: ${r} (${n})`}}function ao(e){let t=e,n=[`Doctor: ${typeof t.status==`string`?t.status:`unknown`}`],r=uo(t.checks);if(Dt()){let e=typeof t.summary==`string`?t.summary:void 0;e&&n.push(e)}else if(r.length===0){let e=typeof t.summary==`string`?t.summary:`No blockers found.`;n.push(e)}else for(let e of r)n.push(Re(e)),n.push(...Je(e));return{data:t,text:n.join(`
14
+ `)}}const Z={boot:z(ro),shutdown:z(io),devices:z(qa),capabilities:z(Ja),doctor:z(ao),apps:({input:e,result:t})=>Ya({result:t,appsFilter:e.appsFilter}),session:z(Xa),artifacts:z($a),open:z(Za),close:z(Qa),install:z(to),reinstall:z(to),"install-from-source":z(no),prepare:B,viewport:B};function oo(e){let t=e.kind?` ${e.kind}`:``,n=e.target?` target=${e.target}`:``,r=typeof e.booted==`boolean`?` booted=${e.booted}`:``;return`${e.name} (${e.platform}${t}${n})${r}`}function so(e){let t=e.url?` ${e.url}`:``,n=e.availability?` ${e.availability}`:``;return`${e.kind}: ${e.name}${n}${t}`}function co(e){let t=e.artifactType?` (${e.artifactType})`:``;return`${e.filename}${t}: ${e.mimeType} ${e.sizeBytes} bytes id=${e.id}`}function lo(e){if(e.providerSessionId)return`agent-device artifacts ${e.providerSessionId} --provider ${e.provider} --json`}function uo(e){return Array.isArray(e)?e.filter(e=>!!e&&typeof e==`object`&&!Array.isArray(e)):[]}const fo=H(`artifacts`,`List daemon or cloud provider artifacts for an active or completed session.`,{provider:p(`Cloud provider name, for example browserstack or aws-device-farm.`),providerSessionId:p(`Cloud provider session id or ARN.`)}),po=P({name:`artifacts`,metadata:fo,definition:R(fo,(e,t)=>e.sessions.artifacts(t)),cliSchema:{summary:`List daemon or cloud provider session artifacts`,usageOverride:`artifacts [provider-session-id] [--provider <name>]`,positionalArgs:[`provider-session-id?`],allowedFlags:[`provider`,`providerSessionId`]},cliReader:(e,t)=>({...D(t),provider:t.provider,providerSessionId:e[0]??t.providerSessionId}),daemonWriter:T(u.artifacts),cliOutputFormatter:Z.artifacts});function mo(e){let{metroHost:t,metroPort:n,bundleUrl:r,launchUrl:i}=e;if(!(t===void 0&&n===void 0&&r===void 0&&i===void 0))return{metroHost:t,metroPort:n,bundleUrl:r,launchUrl:i}}function ho(e){let{metroHost:t,metroPort:n,bundleUrl:r,launchUrl:i,...a}=e,o=mo({metroHost:t,metroPort:n,bundleUrl:r,launchUrl:i});return o?{...a,runtime:o}:a}const go=H(`apps`,`List installed apps.`,{appsFilter:_([`user-installed`,`all`])}),_o=H(`open`,`Open an app, deep link, URL, or platform surface.`,{app:p(`App name, bundle id, package, or URL.`),url:p(`Optional URL passed with an app shell.`),surface:_(pe),activity:p(`Android activity name.`),launchConsole:p(`Launch console mode.`),launchArgs:Rt(`Launch arguments forwarded verbatim to the platform launch command.`),relaunch:g(`Force relaunch.`),saveScript:v({oneOf:[Pt(),d()]}),force:g(`Overwrite an existing --save-script target instead of refusing (alias: --overwrite).`),deviceHub:g(`Use Xcode Device Hub when surfacing Apple simulators.`),testIme:g(`Activate the headless Android test IME for deterministic Unicode text entry (default on for emulators; opt-in on real devices).`),noRecord:g(`Do not record this action.`),metroHost:p(`Session-scoped Metro/debug host hint applied to the opened app.`),metroPort:h(`Session-scoped Metro/debug port hint applied to the opened app. On an emulator/simulator the host defaults to the loopback alias (Android 10.0.2.2, iOS 127.0.0.1) when --metro-host is omitted; physical devices still require an explicit --metro-host.`,{min:1,max:65535}),bundleUrl:p(`Session-scoped bundle URL hint applied to the opened app.`),launchUrl:p(`Session-scoped launch URL hint applied to the opened app.`)}),vo=H(`close`,`Close an app or end the active session.`,{app:p(`Optional app to close.`),shutdown:g(`Shutdown the session/device where supported.`),saveScript:v({oneOf:[Pt(),d()]}),force:g(`Overwrite an existing --save-script target instead of refusing (alias: --overwrite).`)}),yo=R(go,(e,t)=>e.apps.list(t)),bo=R(_o,(e,t)=>e.apps.open(xo(t)));function xo(e){return ho(e)}const So=R(vo,(e,t)=>t.app?e.apps.close(t):e.sessions.close(Fo(t))),Co={helpDescription:`List user-installed apps; use --all to include system/OEM apps`,summary:`List installed apps`,allowedFlags:[`appsFilter`],defaults:{appsFilter:wt}},wo={helpDescription:`Boot device/simulator; optionally launch app or deep link URL. Use --platform to bind URL/deep-link opens to the target platform. For iOS simulator initial stdout/stderr, put --launch-console <path> on this open command, for example agent-device open "Agent Device Tester" --platform ios --launch-console artifacts/launch-console.log. Expo Go/dev-client shells accept host + URL, for example agent-device open "Expo Go" exp://127.0.0.1:8081 --platform ios. macOS also supports --surface app|frontmost-app|desktop|menubar. --metro-host/--metro-port/--bundle-url/--launch-url set this session's Metro/debug runtime hints as part of open itself (applied to the app's dev-server prefs and recorded as the session's dev-server binding), so a fresh session has them before its first reload instead of needing a throwaway reload-first call just to seed hints; a later plain metro reload in the same session reuses whichever of these were set. A fresh open without these flags clears any leftover binding from a previous same-name session; close also clears it.`,summary:`Open an app, deep link or URL, save replays`,positionalArgs:[`appOrUrl?`,`url?`],allowedFlags:[`activity`,`launchConsole`,`launchArgs`,`deviceHub`,`testIme`,`saveScript`,`force`,`noRecord`,`relaunch`,`surface`,...Dr,`launchUrl`]},To={positionalArgs:[`app?`],allowedFlags:[`saveScript`,`force`,`shutdown`]},Eo=(e,t)=>({...D(t),appsFilter:Ct(t.appsFilter)}),Do=(e,t)=>({...D(t),app:e[0],url:e[1],surface:t.surface,activity:t.activity,launchConsole:t.launchConsole,launchArgs:t.launchArgs,relaunch:t.relaunch,saveScript:t.saveScript,force:t.force,deviceHub:t.deviceHub,testIme:t.testIme,noRecord:t.noRecord,metroHost:t.metroHost,metroPort:t.metroPort,bundleUrl:t.bundleUrl,launchUrl:t.launchUrl}),Oo=(e,t)=>({...D(t),app:e[0],shutdown:t.shutdown,saveScript:t.saveScript,force:t.force}),ko=T(u.apps),Ao=T(u.open,Io),jo=T(u.close,e=>A(e.app)),Mo=P({name:`apps`,metadata:go,definition:yo,cliSchema:Co,cliReader:Eo,daemonWriter:ko,cliOutputFormatter:Z.apps}),No=P({name:`open`,metadata:_o,definition:bo,cliSchema:wo,cliReader:Do,daemonWriter:Ao,cliOutputFormatter:Z.open}),Po=P({name:`close`,metadata:vo,definition:So,cliSchema:To,cliReader:Oo,daemonWriter:jo,cliOutputFormatter:Z.close});function Fo(e){let{app:t,...n}=e;return n}function Io(e){return e.app?e.url?[e.app,e.url]:[e.app]:[]}const Lo=H(`devices`,`List available devices.`,{}),Ro=H(`capabilities`,`List commands supported by the selected device.`,{}),zo=H(`boot`,`Boot or prepare a selected device without using CLI positional arguments.`,{headless:g(`Boot without showing simulator UI when supported.`)}),Bo=H(`shutdown`,`Shutdown a selected simulator or emulator.`,{}),Vo=R(Lo,(e,t)=>e.devices.list(t)),Ho=R(Ro,(e,t)=>e.devices.capabilities(t)),Uo=R(zo,(e,t)=>e.devices.boot(t)),Wo=R(Bo,(e,t)=>e.devices.shutdown(t)),Go={summary:`Boot target device/simulator`,allowedFlags:[`headless`]},Ko={summary:`List supported commands for the selected device`,helpDescription:`List command names supported by the selected session device or explicit --platform/--device/--udid/--serial target.`},qo={summary:`Shutdown target simulator/emulator`},Jo=(e,t)=>D(t),Yo=(e,t)=>({...D(t),headless:t.headless}),Xo=T(u.devices),Zo=T(u.capabilities),Qo=T(u.boot),$o=T(u.shutdown),es=[P({name:`devices`,metadata:Lo,definition:Vo,cliReader:Jo,daemonWriter:Xo,cliOutputFormatter:Z.devices}),P({name:`capabilities`,metadata:Ro,definition:Ho,cliSchema:Ko,cliReader:Jo,daemonWriter:Zo,cliOutputFormatter:Z.capabilities}),P({name:`boot`,metadata:zo,definition:Uo,cliSchema:Go,cliReader:Yo,daemonWriter:Qo,cliOutputFormatter:Z.boot}),P({name:`shutdown`,metadata:Bo,definition:Wo,cliSchema:qo,cliReader:Jo,daemonWriter:$o,cliOutputFormatter:Z.shutdown})],ts=H(`doctor`,`Diagnose device, app, Metro, and React Native setup/readiness issues.`,{targetApp:p(`Installed app package/bundle id or app name to verify without opening a session.`),remote:g(`Check remote connection setup instead of local device inventory.`)}),ns=P({name:`doctor`,metadata:ts,definition:R(ts,(e,t)=>e.command.doctor(t)),cliSchema:{usageOverride:`doctor [--platform ios|android|vega|macos|linux|web|apple] [--app <id-or-name>] [--remote]`,helpDescription:`Setup and recovery diagnostic for device, app, dev-server, and RN/Expo readiness issues. Reports local device inventory, active sessions, optional app discovery, scoped toolchain info, and Metro reachability inferred from cwd/runtime. On iOS simulators it also warms the XCTest runner build cache in the background when missing. Pass --app to verify a target app on the one matching booted device without opening a session. Use --remote to check remote connection setup without probing local devices. Default output is compact; use --json for full checks and evidence.`,summary:`Diagnose device, app, dev-server, and RN/Expo readiness`,allowedFlags:[`targetApp`,`remote`]},cliReader:(e,t)=>({...D(t),targetApp:t.targetApp,remote:t.remote}),daemonWriter:T(u.doctor),cliOutputFormatter:Z.doctor});function rs(t,n=`--github-actions-artifact`){let r=t.indexOf(`:`);if(r<=0||r===t.length-1)throw new e(`INVALID_ARGS`,`${n} must use owner/repo:artifact, for example thymikee/RNCLI83:6635342232`);let{owner:i,repo:a}=os(t.slice(0,r),n);return as(i,a,t.slice(r+1),`${n} artifact`)}function is(t,n){if(!t||typeof t!=`object`||Array.isArray(t))throw new e(`INVALID_ARGS`,`${n} installSource must be an object.`);let r=t;if(cs(r.type,`${n} installSource.type`)!==`github-actions-artifact`)throw new e(`INVALID_ARGS`,`${n} installSource.type must be "github-actions-artifact".`);let{owner:i,repo:a}=os(cs(r.repo,`${n} installSource.repo`),`${n} installSource.repo`);return as(i,a,r.artifact,`${n} installSource.artifact`)}function as(e,t,n,r){return typeof n==`number`||us(n)?{kind:`github-actions-artifact`,owner:e,repo:t,artifactId:ls(n,r)}:{kind:`github-actions-artifact`,owner:e,repo:t,artifactName:cs(n,r)}}function os(t,n){let r=t.indexOf(`/`);if(r<=0||r===t.length-1||t.indexOf(`/`,r+1)!==-1)throw new e(`INVALID_ARGS`,`${n} must use owner/repo.`);let i={owner:t.slice(0,r).trim(),repo:t.slice(r+1).trim()};if(!i.owner||!i.repo)throw new e(`INVALID_ARGS`,`${n} must use owner/repo.`);return i}function ss(e){return typeof e==`string`&&e.trim().length>0?e.trim():void 0}function cs(t,n){let r=ss(t);if(!r)throw new e(`INVALID_ARGS`,`${n} must be a non-empty string.`);return r}function ls(t,n){let r=typeof t==`number`?t:typeof t==`string`?Number(t):NaN;if(!Number.isInteger(r))throw new e(`INVALID_ARGS`,`${n} must be an integer.`);return r}function us(e){return typeof e==`string`&&/^\d+$/.test(e.trim())}const ds=H(`install`,`Install an app binary.`,{app:p(`Optional app identifier hint.`),appPath:f(p(`Path to app binary.`))}),fs=H(`reinstall`,`Reinstall an app binary.`,{app:f(p()),appPath:f(p(`Path to app binary.`))}),ps=H(`install-from-source`,`Install an app from a structured source.`,{source:f(v(It(`Install source object.`))),retainPaths:g(),retentionMs:h()}),ms=R(ds,(e,t)=>e.apps.install(t)),hs=R(fs,(e,t)=>e.apps.reinstall(t)),gs=R(ps,(e,t)=>e.apps.installFromSource(t)),_s={usageOverride:`install <path> | install <app> <path>`,listUsageOverride:`install <path>`,positionalArgs:[`appOrPath`,`path?`]},vs={positionalArgs:[`app`,`path`]},ys={usageOverride:`install-from-source <url> | install-from-source --github-actions-artifact <owner/repo:artifact>`,listUsageOverride:`install-from-source`,helpDescription:`Install app builds from URLs, remote source specs, or CI artifacts resolved by a remote daemon.`,summary:`Install app builds from URLs, remote source specs, or CI artifacts`,positionalArgs:[`url?`],allowedFlags:[`header`,`githubActionsArtifact`,`installSource`,`retainPaths`,`retentionMs`]},bs=(e,t)=>Es(e,t),xs=(e,t)=>Ds(e,t),Ss=(e,t)=>({...D(t),source:As(e,t),retainPaths:t.retainPaths,retentionMs:t.retentionMs}),Cs=T(u.install,e=>Os(e.app,e.appPath)),ws=T(u.reinstall,e=>ks(e.app,e.appPath)),Ts=[P({name:`install`,metadata:ds,definition:ms,cliSchema:_s,cliReader:bs,daemonWriter:Cs,cliOutputFormatter:Z.install}),P({name:`reinstall`,metadata:fs,definition:hs,cliSchema:vs,cliReader:xs,daemonWriter:ws,cliOutputFormatter:Z.reinstall}),P({name:`install-from-source`,metadata:ps,definition:gs,cliSchema:ys,cliReader:Ss,daemonWriter:e=>E(st.installSource,[],{...e,installSource:e.source,retainMaterializedPaths:e.retainPaths,materializedPathRetentionMs:e.retentionMs}),cliOutputFormatter:Z[`install-from-source`]})];function Es(e,t){let[n,r]=e,i=r!==void 0;return{...D(t),...i?{app:M(n,`install requires app`)}:{},appPath:M(i?r:n,`install requires path`)}}function Ds(e,t){return{...D(t),app:M(e[0],`reinstall requires app`),appPath:M(e[1],`reinstall requires path`)}}function Os(e,t){let n=N(t,`missing app path`);return typeof e==`string`&&e.length>0?[e,n]:[n]}function ks(e,t){return[N(e,`missing first positional`),N(t,`missing second positional`)]}function As(t,n){let r=t[0]?.trim();if(t.length>1)throw new e(`INVALID_ARGS`,`install-from-source accepts either one <url> positional or --github-actions-artifact`);let i=n.githubActionsArtifact?rs(n.githubActionsArtifact):void 0,a=n.installSource;if(+!!r+ +!!i+ +!!a!=1)throw new e(`INVALID_ARGS`,`install-from-source requires exactly one source: <url>, --github-actions-artifact, or config installSource`);if(!r&&n.header&&n.header.length>0)throw new e(`INVALID_ARGS`,`install-from-source --header is only supported for URL sources`);return i||a||{kind:`url`,url:r,headers:js(n.header)}}function js(t){if(!t||t.length===0)return;let n={};for(let r of t){let t=r.indexOf(`:`);if(t<=0)throw new e(`INVALID_ARGS`,`Invalid --header value "${r}". Expected "name:value".`);let i=r.slice(0,t).trim(),a=r.slice(t+1).trim();if(!i)throw new e(`INVALID_ARGS`,`Invalid --header value "${r}". Header name cannot be empty.`);n[i]=a}return n}const Ms=H(`prepare`,`Prepare platform helper infrastructure.`,{action:f(_([`ios-runner`])),timeoutMs:h(`Maximum wall-clock time for the prepare command.`)}),Ns=P({name:`prepare`,metadata:Ms,definition:R(Ms,(e,t)=>e.command.prepare(t)),cliSchema:{usageOverride:`prepare ios-runner --platform ios|macos [--timeout <ms>]`,listUsageOverride:`prepare`,helpDescription:`Prepare platform helper infrastructure. ios-runner builds/reuses, starts, and health-checks the XCTest runner so later Apple snapshots and interactions do not pay first-use startup cost. In JSON output, top-level buildMs/connectMs/healthCheckMs are diagnostic fields and may overlap; use timing.additiveParts for additive wall-clock phase totals. In CI, run it after boot/install and before replay/test; if replay/test starts a separate daemon, stop the prepare daemon before replay/test so it does not keep the prepared runner lease. It is not a recovery step for "runner already owned by another agent-device daemon"; stop the owning daemon on the Mac with simulator access instead. Runner build/start output is written to the session runner.log; daemon.log is for daemon lifecycle/startup issues.`,summary:`Pre-warm platform helpers, especially the iOS/macOS XCTest runner before Apple automation`,positionalArgs:[`ios-runner`],allowedFlags:[`timeoutMs`]},cliReader:(e,t)=>({...D(t),action:M(e[0],`prepare requires subcommand`),timeoutMs:t.timeoutMs}),daemonWriter:T(u.prepare,e=>[N(e.action,`prepare requires subcommand`)]),cliOutputFormatter:Z.prepare}),Ps=H(`push`,`Deliver a push payload.`,{app:f(p()),payload:f(v({oneOf:[d(),It()]}))}),Fs=H(`trigger-app-event`,`Trigger an app-defined event.`,{event:f(p()),payload:qs()}),Is=R(Ps,(e,t)=>e.apps.push(t)),Ls=R(Fs,(e,t)=>e.apps.triggerEvent(t)),Rs={listUsageOverride:`push`,helpDescription:`Deliver push notification payloads to an installed app.`,summary:`Deliver push notification payloads to an installed app`,positionalArgs:[`bundleOrPackage`,`payloadOrJson`]},zs={usageOverride:`trigger-app-event <event> [payloadJson]`,listUsageOverride:`trigger-app-event`,helpDescription:`Invoke app-defined automation or test events with an optional structured payload.`,summary:`Invoke app-defined automation/test events with optional structured payloads`,positionalArgs:[`event`,`payloadJson?`]},Bs=(e,t)=>({...D(t),app:M(e[0],`push requires bundleOrPackage`),payload:M(e[1],`push requires payloadOrJson`)}),Vs=(e,t)=>({...D(t),event:M(e[0],`trigger-app-event requires event`),payload:e[1]?In(e[1],`trigger-app-event payload`):void 0}),Hs=T(u.push,e=>Gs(e)),Us=T(u.triggerAppEvent,e=>Ks(e)),Ws=[P({name:`push`,metadata:Ps,definition:Is,cliSchema:Rs,cliReader:Bs,daemonWriter:Hs}),P({name:`trigger-app-event`,metadata:Fs,definition:Ls,cliSchema:zs,cliReader:Vs,daemonWriter:Us})];function Gs(e){return[e.app,typeof e.payload==`string`?e.payload:JSON.stringify(e.payload)]}function Ks(e){return[e.event,...e.payload?[JSON.stringify(e.payload)]:[]]}function qs(){return Lt()}const Js=H(`session`,`List active sessions or print daemon state directory.`,{action:_([`list`,`state-dir`,`save-script`],`list shows active sessions; state-dir prints the daemon state directory; save-script publishes an armed recording without teardown.`),path:p(`Optional .ad output path for save-script.`),force:g(`Atomically replace an existing save-script target.`)}),Ys=P({name:`session`,metadata:Js,definition:R(Js,async(e,{action:t,path:n,force:r,...i})=>{let a=t??`list`;return Zs(a,n,r),a===`state-dir`?{stateDir:await e.sessions.stateDir(i)}:a===`save-script`?await e.sessions.saveScript({...i,path:n,force:r}):{sessions:await e.sessions.list(i)}}),cliSchema:{usageOverride:`session list | session state-dir | session save-script [path] [--force]`,listUsageOverride:`session`,helpDescription:`List active sessions, print the effective daemon state directory, or publish an armed open-to-destination script without closing its session`,positionalArgs:[`list|state-dir|save-script?`,`path?`],allowedFlags:[`force`]},cliReader:(e,t)=>({...D(t),action:Xs(e[0]),path:e[1],force:t.force}),cliOutputFormatter:Z.session});function Xs(t){let n=t??`list`;if(n===`list`||n===`state-dir`||n===`save-script`)return n;throw new e(`INVALID_ARGS`,`session only supports list, state-dir, or save-script`)}function Zs(t,n,r){if(t!==`save-script`&&!(n===void 0&&r!==!0))throw new e(`INVALID_ARGS`,`session ${t} does not accept a path or --force; use session save-script [path] [--force] to publish a recording.`)}const Qs=H(`viewport`,`Resize the active web viewport.`,{width:f(h(`Viewport width in CSS pixels.`,{min:1})),height:f(h(`Viewport height in CSS pixels.`,{min:1}))}),$s=P({name:`viewport`,metadata:Qs,definition:R(Qs,(e,t)=>e.command.viewport(t)),cliSchema:{helpDescription:`Resize the active web viewport before taking snapshots or screenshots. Useful for fixed-layout or 100vh apps where changing the viewport reveals different content.`,summary:`Resize the active web viewport for the current session`,positionalArgs:[`width`,`height`]},cliReader:(e,t)=>({...D(t),width:Le(e[0],`width`),height:Le(e[1],`height`)}),daemonWriter:T(u.viewport,e=>{let{width:t,height:n}=e;return[String(t),String(n)]}),cliOutputFormatter:Z.viewport}),ec=F({name:`management`,commands:[...es,po,ns,Ns,Mo,Ys,No,Po,$s,...Ts,...Ws]});function tc(e){return{data:e.result,text:e.action===`reload`?`Reloaded React Native apps via ${e.result.reloadUrl}`:JSON.stringify(e.result,null,2)}}const nc={metro:({input:e,result:t})=>tc({result:t,action:e.action})},rc=[`auto`,`react-native`,`expo`,`repack`];function ic(t){if(t!==void 0){if(rc.includes(t))return t;throw new e(`INVALID_ARGS`,`metro prepare --kind must be auto, react-native, expo, or repack`)}}const ac=`metro`,oc=H(ac,`Prepare React Native dev-server runtime or reload apps.`,{action:f(_([`prepare`,`reload`])),projectRoot:p(),kind:v(d()),publicBaseUrl:p(),proxyBaseUrl:p(),bearerToken:p(),bridgeScope:v({type:`object`,additionalProperties:!0}),launchUrl:p(),port:h(),listenHost:p(),statusHost:p(),startupTimeoutMs:h(),probeTimeoutMs:h(),reuseExisting:g(),installDependenciesIfNeeded:g(),runtimeFilePath:p(),logPath:p(),metroHost:p(),metroPort:h(),bundleUrl:p(),timeoutMs:h()}),sc=F({name:`metro`,commands:[P({name:ac,metadata:oc,definition:R(oc,async(e,t)=>t.action===`prepare`?await e.metro.prepare(cc(t)):await e.metro.reload(uc(t))),cliSchema:{usageOverride:`metro prepare (--public-base-url <url> | --proxy-base-url <url>) [--project-root <path>] [--port <port>] [--kind auto|react-native|expo|repack]
15
+ agent-device metro reload [--metro-host <host>] [--metro-port <port>] [--bundle-url <url>]`,listUsageOverride:`metro`,helpDescription:`Prepare a local React Native dev-server runtime or ask connected apps to reload. reload with no --metro-host/--metro-port/--bundle-url resolves against the dev server this session last bound via metro prepare or open's metro hint flags (falling back to localhost:8081 only when the session never bound one), so it never silently reloads a different project's server on the default port; pass an explicit flag to override the session hint for one call. The reload URL keeps the bound bundle URL mount prefix instead of collapsing to the host root, and when the server has no HTTP /reload route (Expo) the reload is broadcast over its /message websocket instead of trusting the app-page fallback. The binding is cleared when the session closes, and a fresh open without hint flags also clears any leftover binding from a previous same-name session. --kind expo (detected or forced) requests the virtual-entry bundle URL (.expo/.virtual-metro-entry.bundle) instead of index.bundle, since index.bundle 404s/500s against Expo dev servers in monorepos. Dependency install auto-detects the package manager from the nearest yarn.lock/pnpm-lock.yaml/bun.lock/bun.lockb/package-lock.json walking up from --project-root (bounded at the repo root), so Yarn/pnpm workspace monorepos with the lockfile at the repo root do not wrongly fall back to npm install (which fails on workspace: dependency specifiers); if install still fails, pass --no-install-deps when dependencies are already installed (for example via a monorepo root install).`,summary:`Prepare Metro/Re.Pack reachability for React Native/Expo apps or trigger app reloads`,positionalArgs:[`prepare|reload`],allowedFlags:[...Dr,...Er]},cliReader:(t,n)=>{let r=(t[0]??``).toLowerCase();if(r!==`prepare`&&r!==`reload`)throw new e(`INVALID_ARGS`,`metro requires a subcommand: prepare or reload`);if(r===`reload`)return{action:r,metroHost:n.metroHost,metroPort:n.metroPort,bundleUrl:n.bundleUrl,timeoutMs:n.metroProbeTimeoutMs};if(!n.metroPublicBaseUrl&&!n.metroProxyBaseUrl)throw new e(`INVALID_ARGS`,`metro prepare requires --public-base-url <url> or --proxy-base-url <url>.`);return{action:r,projectRoot:n.metroProjectRoot,kind:ic(n.kind??n.metroKind),port:n.metroPreparePort,listenHost:n.metroListenHost,statusHost:n.metroStatusHost,publicBaseUrl:n.metroPublicBaseUrl,proxyBaseUrl:n.metroProxyBaseUrl,bearerToken:n.metroBearerToken,bridgeScope:n.tenant&&n.runId&&n.leaseId?{tenantId:n.tenant,runId:n.runId,leaseId:n.leaseId}:void 0,startupTimeoutMs:n.metroStartupTimeoutMs,probeTimeoutMs:n.metroProbeTimeoutMs,reuseExisting:n.metroNoReuseExisting?!1:void 0,installDependenciesIfNeeded:n.metroNoInstallDeps?!1:void 0,runtimeFilePath:n.metroRuntimeFile}},cliOutputFormatter:nc.metro})]});function cc(e){return{projectRoot:e.projectRoot,kind:e.kind,publicBaseUrl:e.publicBaseUrl,proxyBaseUrl:e.proxyBaseUrl,bearerToken:e.bearerToken,bridgeScope:e.bridgeScope??lc(e),port:e.port,listenHost:e.listenHost,statusHost:e.statusHost,startupTimeoutMs:e.startupTimeoutMs,probeTimeoutMs:e.probeTimeoutMs,reuseExisting:e.reuseExisting,installDependenciesIfNeeded:e.installDependenciesIfNeeded,runtimeFilePath:e.runtimeFilePath}}function lc(e){return e.tenant&&e.runId&&e.leaseId?{tenantId:e.tenant,runId:e.runId,leaseId:e.leaseId}:void 0}function uc(e){return{metroHost:e.metroHost,metroPort:e.metroPort,bundleUrl:e.bundleUrl,timeoutMs:e.timeoutMs}}const dc=[`started`,`stopped`,`marked`,`cleared`,`restarted`,`removedRotatedFiles`];function fc(e){return{data:e,text:e.path,stderr:Bc([Rc(e,[`active`,`state`,`backend`,`sizeBytes`]),Ac(e),e.hint,zc(e.notes)])}}function pc(e){let t=e.events??[];return{data:e,text:t.length>0?_c(t):`No session events found.`,stderr:Bc([Rc(e,[`path`,`cursor`,`nextCursor`,`limit`])])}}function mc(e){let t=[],n=e.entries??[];if(e.path&&t.push(e.path),n.length===0)t.push(`No recent HTTP(s) entries found.`);else for(let e of n)t.push(...Fc(e));return{data:e,text:t.join(`
16
+ `),stderr:Bc([Rc(e,[`active`,`state`,`backend`,`include`,`scannedLines`,`matchedLines`]),zc(e.notes)])}}function hc(e){return{data:e,text:[`Audio probe: ${String(e.state??`stopped`)} heard=${String(e.heard===!0)}`,kc(`rmsDbfs`,e.rmsDbfs),kc(`peakDbfs`,e.peakDbfs)].filter(e=>!!e).join(`
17
+ `),stderr:Bc([Rc(e,[`active`,`backend`,`source`,`durationMs`,`elapsedMs`,`bucketMs`,`sampleCount`,`sourceCount`,`mediaElementCount`]),zc(e.notes)])}}const gc={logs:z(fc),events:z(pc),network:z(mc),audio:z(hc)};function _c(e){let t=e.map(vc),n=Math.min(Math.max(...t.map(e=>e.label.length),5),32);return t.map(e=>yc(e,n)).join(`
18
+ `)}function vc(e){return{timestamp:bc(e.ts),label:xc(e),summary:Sc(e)}}function yc(e,t){let n=e.label.padEnd(t),r=e.timestamp?`${e.timestamp} ${n}`:n.trimEnd();return e.summary?`${r} ${e.summary}`:r.trimEnd()}function bc(e){return e?e.replace(`T`,` `):``}function xc(e){let t=e.command??`command`;switch(e.kind){case`request.started`:return`start ${t}`;case`request.finished`:return Mc([e.status===`error`?`error`:`ok`,t,Oc(Pc(e.details?.durationMs))]);case`action.recorded`:return`action ${t}`;default:return Mc([e.kind??`event`,e.command])}}function Sc(e){let t=Cc(e.summary,e);return`${t}${wc(e,t)}`.trim()}function Cc(e,t){let n=e?.trim()??``,r=t.command??``;return t.kind===`request.started`&&n===`Started ${r}`||t.kind===`request.finished`&&n===`Finished ${r}`?``:n}function wc(e,t){if(e.kind!==`action.recorded`)return``;let n=e.details;if(!n)return``;let r=[Tc(n,t),Dc(Pc(n.textLength))].filter(e=>!!e);return r.length>0?` (${r.join(`, `)})`:``}function Tc(e,t){let n=Nc(e.ref)??Nc(e.selector)??Ec(e);if(!(!n||t.includes(n)))return`target=${n}`}function Ec(e){let t=Pc(e.x),n=Pc(e.y);return t===void 0||n===void 0?void 0:`(${t}, ${n})`}function Dc(e){return e===void 0?void 0:`text=${e} chars`}function Oc(e){return e===void 0?void 0:`${Math.round(e)}ms`}function kc(e,t){if(!Array.isArray(t))return;let n=t.filter(e=>typeof e==`number`&&Number.isFinite(e));return n.length>0?`${e}: [${n.join(`, `)}]`:void 0}function Ac(e){return dc.map(t=>jc(t,e[t])).filter(Boolean).join(` `)||void 0}function jc(e,t){return t==null?``:`${e}=${t}`}function Mc(e){return e.filter(e=>!!e).join(` `)}function Nc(e){return typeof e==`string`&&e.trim().length>0?e:void 0}function Pc(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}function Fc(e){let t=e.method??`HTTP`,n=e.url??`<unknown-url>`,r=e.status===void 0?``:` status=${e.status}`,i=[`${e.timestamp?`${e.timestamp} `:``}${t} ${n}${r}${e.durationMs===void 0?``:` durationMs=${e.durationMs}`}`];return e.headers?Lc(i,`headers`,e.headers):(Ic(i,`request headers`,e.requestHeaders),Ic(i,`response headers`,e.responseHeaders)),Lc(i,`request`,e.requestBody),Lc(i,`response`,e.responseBody),i}function Ic(e,t,n){!n||Object.keys(n).length===0||e.push(` ${t}: ${JSON.stringify(n)}`)}function Lc(e,t,n){n!==void 0&&e.push(` ${t}: ${n}`)}function Rc(e,t){return t.map(t=>e[t]!==void 0&&e[t]!==null?`${t}=${e[t]}`:``).filter(Boolean).join(` `)||void 0}function zc(e){let t=e?.filter(e=>e.length>0)??[];return t.length>0?t.join(`
19
+ `):void 0}function Bc(e){return e.filter(e=>!!e).join(`
20
+ `)||void 0}const Vc=`logs`,Hc=`events`,Uc=`network`,Wc=`audio`,Gc=[`dump`,`log`],Kc=[`probe`],qc=[`start`,`status`,`stop`],Jc=H(Vc,`Manage session app logs.`,{action:_(qe),message:p(),restart:g()}),Yc=H(Hc,`Read the session event timeline.`,{limit:h(),cursor:p()}),Xc=H(Uc,`Show recent HTTP traffic.`,{action:_(Gc),limit:h(),include:_(n)}),Zc=H(Wc,`Probe audio levels.`,{action:_(Kc),probeAction:_(qc),durationMs:h(`Probe duration in milliseconds.`),bucketMs:h(`Audio level bucket size in milliseconds.`)}),Qc=R(Jc,(e,t)=>e.observability.logs(t)),$c=R(Yc,(e,t)=>e.observability.events(t)),el=R(Xc,(e,t)=>e.observability.network(t)),tl=R(Zc,(e,t)=>e.observability.audio(t)),nl=F({name:`observability`,commands:[P({name:Vc,metadata:Jc,definition:Qc,cliSchema:{usageOverride:`logs path | logs start | logs stop | logs clear [--restart] | logs doctor | logs mark [message...]`,helpDescription:`Session app log info, start/stop streaming, diagnostics, and markers`,summary:`Manage session app logs`,positionalArgs:[`path|start|stop|clear|doctor|mark`,`message?`],allowsExtraPositionals:!0,allowedFlags:[`restart`]},cliReader:(e,t)=>({...D(t),action:sl(e[0]),message:e.slice(1).join(` `)||void 0,restart:t.restart}),daemonWriter:T(Vc,e=>rl(e)),cliOutputFormatter:gc.logs}),P({name:Hc,metadata:Yc,definition:$c,cliSchema:{usageOverride:`events [limit] [cursor]`,listUsageOverride:`events`,helpDescription:`Read the daemon-owned session event timeline as paged JSON-friendly entries`,summary:`Read session event timeline`,positionalArgs:[`limit?`,`cursor?`]},cliReader:(e,t)=>({...D(t),limit:e[0]?.trim()?Bn(e[0]):void 0,cursor:e[1]}),daemonWriter:e=>E(Hc,il(e),e),cliOutputFormatter:gc.events}),P({name:Uc,metadata:Xc,definition:el,cliSchema:{usageOverride:`network dump [limit] [summary|headers|body|all] [--include summary|headers|body|all] | network log [limit] [summary|headers|body|all] [--include summary|headers|body|all]`,listUsageOverride:`network`,helpDescription:`Dump recent HTTP(s) traffic parsed from the session app log`,summary:`Inspect HTTP(S) traffic parsed from session app logs, including summaries, headers, and bodies`,positionalArgs:[`dump|log`,`limit?`,`include?`],allowedFlags:[`networkInclude`]},cliReader:(e,t)=>({...D(t),action:cl(e[0]),limit:Bn(e[1]),include:t.networkInclude??ll(e[2])}),daemonWriter:e=>E(Uc,al(e),{...e,networkInclude:e.include}),cliOutputFormatter:gc.network}),P({name:Wc,metadata:Zc,definition:tl,cliSchema:{usageOverride:`audio probe start [durationSeconds] [bucketMs] | audio probe status | audio probe stop`,listUsageOverride:`audio`,helpDescription:`Probe browser or host-rendered simulator/emulator audio as compact dBFS buckets`,summary:`Probe audio levels`,positionalArgs:[`probe`,`start|status|stop`,`durationSeconds?`,`bucketMs?`]},cliReader:(e,t)=>({...D(t),action:ul(e[0]),probeAction:dl(e[1]),durationMs:fl(e[2]),bucketMs:Bn(e[3])}),daemonWriter:e=>E(Wc,ol(e),e),cliOutputFormatter:gc.audio})]});function rl(e){return[e.action??`path`,...A(e.message)]}function il(e){return e.cursor===void 0?j(e.limit):[e.limit===void 0?``:String(e.limit),e.cursor]}function al(e){return[...e.action?[e.action]:[],...j(e.limit)]}function ol(e){return[e.action??`probe`,e.probeAction??`status`,...j(e.durationMs),...j(e.bucketMs)]}function sl(e){if(e!==void 0)return at(qe,e,{message:`logs requires path, start, stop, doctor, mark, or clear`})}function cl(t){if(t!==void 0){if(t===`dump`||t===`log`)return t;throw new e(`INVALID_ARGS`,`network requires dump or log`)}}function ll(e){if(e!==void 0)return at(n,e,{message:`network include must be summary, headers, body, or all`})}function ul(e){if(e!==void 0)return at(Kc,e,{message:`audio requires probe`})}function dl(e){if(e!==void 0)return at(qc,e,{message:`audio probe requires start, status, or stop`})}function fl(e){let t=Bn(e);return t===void 0?void 0:Math.round(t*1e3)}function pl(e){let t=e;return{data:t,text:hl(t)}}const ml={perf:z(pl)};function hl(e){let t=yl(e);if(t)return t;let n=l(e.artifact)?e.artifact:void 0;return n?vl(n):gl(l(e.metrics)?e.metrics:void 0)}function gl(e){let t=l(e?.fps)?e.fps:void 0,n=Il(e);if(!t)return kl(n,`missing frame metric`);if(t.available===!1)return kl(n,Al(t));let r=jl(t);return r?_l(t,r):kl(n,`missing dropped-frame summary`)}function _l(e,t){let n=[`Frame health: ${t}`],r=Pl(e);return r.length>0&&n.push(`Worst windows:`,...r),n.join(`
21
+ `)}function vl(e){let t=typeof e.kind==`string`?e.kind:`memory`;if(e.available===!1)return`Memory artifact (${t}): unavailable - ${typeof e.reason==`string`&&e.reason.length>0?e.reason:`not available`}`;let n=typeof e.path==`string`?e.path:void 0,r=Q(e.sizeBytes),i=r===void 0?``:` (${Hl(r)})`;return n?`Memory artifact (${t}): ${n}${i}`:`Memory artifact (${t}): captured${i}`}function yl(e){return e.kind===`xctrace`?bl(e):Cl(e)}function bl(e){let t=typeof e.perf==`string`?e.perf:void 0,n=xl(e);if(!(!t||!n||e.kind!==`xctrace`))return Sl(n,typeof e.mode==`string`?e.mode:`capture`,t,e.template)}function xl(e){return typeof e.outPath==`string`?e.outPath:typeof e.reportPath==`string`?e.reportPath:void 0}function Sl(e,t,n,r){let i=[e,`Perf ${t}: ${n}`];return typeof r==`string`&&i.push(`Template: ${r}`),i.join(`
22
+ `)}function Cl(e){let t=wl(e);if(t)return`Perf ${t.action}: ${t.kind} ${t.type}${Tl(e)}${El(e)}${Ol(e)}`}function wl(e){let t=Dl(e.action),n=Dl(e.kind),r=Dl(e.type);return t&&n&&r?{action:t,kind:n,type:r}:void 0}function Tl(e){let t=Dl(e.state);return t?` state=${t}`:``}function El(e){let t=Dl(e.outPath);if(!t)return``;let n=Q(e.sizeBytes);return`\n${t}${n===void 0?``:` (${Hl(n)})`}`}function Dl(e){return typeof e==`string`?e:void 0}function Ol(e){let t=l(e.summary)?e.summary:void 0,n=l(t?.frameHealth)?t.frameHealth:void 0;if(!n||n.available!==!0)return``;let r=Q(n.droppedFramePercent),i=Q(n.droppedFrameCount),a=Q(n.totalFrameCount);return r===void 0||i===void 0||a===void 0?``:`\nTrace frame health: dropped ${zl(r)} (${Math.round(i)}/${Math.round(a)} frames)`}function kl(e,t){return e?`Performance: ${e}`:`Frame health: unavailable - ${t}`}function Al(e){return typeof e.reason==`string`&&e.reason.length>0?e.reason:`not available`}function jl(e){let t=Q(e.droppedFramePercent),n=Q(e.droppedFrameCount);if(!(t===void 0||n===void 0))return[`dropped ${zl(t)}`,Ml(n,Q(e.totalFrameCount)),Nl(Q(e.sampleWindowMs))].filter(Boolean).join(` `)}function Ml(e,t){return t===void 0?`(${Math.round(e)} dropped frames)`:`(${Math.round(e)}/${Math.round(t)} frames)`}function Nl(e){return e===void 0?``:`window ${Bl(e)}`}function Pl(e){return Array.isArray(e.worstWindows)?e.worstWindows.flatMap(e=>{if(!l(e))return[];let t=Fl(e);return t?[t]:[]}):[]}function Fl(e){let t=Q(e.startOffsetMs),n=Q(e.endOffsetMs),r=Q(e.missedDeadlineFrameCount);if(t===void 0||n===void 0||r===void 0)return;let i=Q(e.worstFrameMs),a=i===void 0?``:`, worst ${Bl(i)}`;return`- +${Bl(t)}-+${Bl(n)}: ${Math.round(r)} missed-deadline frames${a}`}function Il(e){let t=l(e?.cpu)?e.cpu:void 0,n=l(e?.memory)?e.memory:void 0,r=[Ll(t),Rl(n)].filter(e=>!!e);return r.length>0?r.join(`, `):void 0}function Ll(e){if(e?.available!==!0)return;let t=Q(e.usagePercent);return t===void 0?void 0:`CPU ${zl(t)}`}function Rl(e){if(e?.available!==!0)return;let t=Q(e.residentMemoryKb)??Q(e.totalPssKb)??Q(e.totalRssKb);return t===void 0?void 0:`memory ${Vl(t)}`}function Q(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}function zl(e){return`${Number.isInteger(e)?e:e.toFixed(1)}%`}function Bl(e){let t=Math.max(0,Math.round(e));if(t<1e3)return`${t}ms`;let n=Math.round(t/1e3);if(n<60)return`${n}s`;let r=Math.floor(n/60),i=n%60;return i>0?`${r}m ${i}s`:`${r}m`}function Vl(e){let t=e/1024;return`${t>=10?Math.round(t):t.toFixed(1)}MB`}function Hl(e){if(e<1024)return`${Math.round(e)}B`;let t=e/1024;if(t<1024)return`${t>=10?Math.round(t):t.toFixed(1)}KB`;let n=t/1024;return`${n>=10?Math.round(n):n.toFixed(1)}MB`}const Ul=`perf`,Wl=H(Ul,`Show session performance, frame health, and memory diagnostics.`,{area:_(Te),subject:_(mt),action:_(ye),kind:_(_e),template:p(`xctrace template name, for example Time Profiler.`),out:p(`Output artifact path.`),tracePath:p(`Existing .trace path to report, defaults to the latest session trace.`)}),Gl=F({name:`perf`,commands:[P({name:Ul,metadata:Wl,definition:R(Wl,(e,t)=>e.observability.perf(t)),cliSchema:{usageOverride:`perf metrics --json
23
23
  agent-device perf frames --json
24
24
  agent-device perf memory sample --json
25
25
  agent-device perf memory snapshot [--kind android-hprof|memgraph] [--out <path>]
@@ -30,9 +30,9 @@ import{_ as e,n as t,t as n}from"./sdk-contracts.js";import{T as r,d as i,o as a
30
30
  agent-device perf cpu profile start --kind simpleperf --out <cpu.perf.data>
31
31
  agent-device perf cpu profile stop --kind simpleperf
32
32
  agent-device perf cpu profile report --kind simpleperf --out <cpu-report.json>
33
- agent-device perf trace start|stop --kind perfetto [--out <path>]`,listUsageOverride:`perf`,helpDescription:`Show session performance metrics, focused frame/jank health, memory diagnostics artifacts, Apple xctrace artifacts, or Android native Simpleperf/Perfetto artifacts. Prefer explicit perf metrics --json for first-pass startup/CPU/memory data. For CPU profiles, start/stop write the raw artifact and report writes a compact .json summary; include report after simpleperf stop when the task needs agent-readable native CPU evidence. Bare perf and metrics remain aliases. Native perf output is agent evidence: compact state, artifact path, and size only; raw profiles/traces stay on disk.`,summary:`Check runtime metrics, frames, memory, CPU profiles, or native trace artifacts`,positionalArgs:[`area?`,`subjectOrAction?`,`action?`],allowedFlags:[`kind`,`perfTemplate`,`out`]},cliReader:(e,t)=>({...O(t),...vu(e,{kind:Cu(t.kind),template:t.perfTemplate,out:t.out})}),daemonWriter:E(pu,e=>gu(e)),cliOutputFormatter:Rl.perf})]});function gu(e){let t=e.area??(e.action?`metrics`:void 0);return t===`cpu`?_u([...M(t),...M(e.subject),...M(e.action),...M(e.kind)],e):t===`trace`?_u([...M(t),...M(e.action),...M(e.kind)],e):[...M(t),...M(e.action)]}function _u(e,t){let n=[...e];return(t.template||t.out||t.tracePath)&&n.push(t.template??``),(t.out||t.tracePath)&&n.push(t.out??``),t.tracePath&&n.push(t.tracePath),n}function vu(e,t={}){if(e[0]!==void 0&&e[1]===void 0){let n=bu(e[0],{allowUndefined:!0});if(n)return{action:n,kind:Su(t.kind),out:t.out}}let n=yu(e[0]);return n===`cpu`?{area:n,subject:xu(e[1]),action:bu(e[2]),kind:Su(t.kind),template:t.template,out:t.out}:n===`trace`?{area:n,action:bu(e[1]),kind:Su(t.kind),template:t.template,out:t.out}:{area:n,action:bu(e[1]),kind:Su(t.kind),out:t.out}}function yu(t){if(t===void 0)return;let n=t.toLowerCase();if(Se(n))return n;throw new e(`INVALID_ARGS`,ue)}function bu(t,n={}){if(t===void 0)return;let r=t.toLowerCase();if(be(r))return r;if(!n.allowUndefined)throw new e(`INVALID_ARGS`,ge)}function xu(t){let n=t?.toLowerCase();if(n!==void 0&&qe(n))return n;throw new e(`INVALID_ARGS`,xe)}function Su(t){if(t===void 0)return;let n=t.toLowerCase();if(oe(n))return n;throw new e(`INVALID_ARGS`,_e)}function Cu(e){return typeof e==`string`?Su(e):void 0}const wu=`react-native`,Tu=W(wu,`Run supported React Native app automation helpers.`,{action:f(_([`dismiss-overlay`]))}),Eu=L({name:`react-native`,commands:[I({name:wu,metadata:Tu,definition:R(Tu,(e,t)=>e.command.reactNative(t)),cliSchema:{usageOverride:`react-native dismiss-overlay`,listUsageOverride:`react-native dismiss-overlay`,positionalArgs:[`dismiss-overlay`]},cliReader:(e,t)=>({...O(t),action:Du(e[0])}),daemonWriter:E(wu,e=>[F(e.action,`react-native requires action`)])})]});function Du(t){if(t===`dismiss-overlay`)return t;throw new e(`INVALID_ARGS`,`react-native supports only: dismiss-overlay`)}function Ou(e){let t=e,n=typeof t.outPath==`string`?t.outPath:``,r=ju(t);if(r.length<=1)return{data:t,text:Au(t,n)};let i=[`Recording chunks:`];for(let e of r)i.push(` ${e.index}: ${e.path}`);return typeof t.telemetryPath==`string`&&i.push(`Telemetry: ${t.telemetryPath}`),typeof t.warning==`string`&&i.push(`Warning: ${t.warning}`),typeof t.overlayWarning==`string`&&i.push(`Overlay warning: ${t.overlayWarning}`),{data:t,text:i.join(`
34
- `)}}const ku={record:z(Ou)};function Au(e,t){let n=[];return t&&n.push(t),typeof e.sessionStateDir==`string`&&n.push(`Session state: ${e.sessionStateDir}`),typeof e.warning==`string`&&n.push(`Warning: ${e.warning}`),typeof e.overlayWarning==`string`&&n.push(`Overlay warning: ${e.overlayWarning}`),n.join(`
35
- `)}function ju(e){let t=e.chunks;return Array.isArray(t)?t.flatMap(e=>{if(!e||typeof e!=`object`)return[];let t=e;return typeof t.index!=`number`||typeof t.path!=`string`?[]:[{index:t.index,path:t.path}]}):[]}const Mu=`record`,Nu=`trace`,Pu=[`start`,`stop`],Fu=W(Mu,`Start or stop screen recording.`,{action:f(_(Pu)),path:p(),fps:h(),maxSize:h(),quality:_(et),hideTouches:g(),recordingScope:_(de)}),Iu=W(Nu,`Start or stop trace capture.`,{action:f(_(Pu)),path:p()}),Lu=R(Fu,(e,t)=>e.recording.record(t)),Ru=R(Iu,(e,t)=>e.recording.trace(t)),zu={usageOverride:`record start [path] [--scope <app|device|system>] [--fps <n>] [--max-size <px>] [--quality <medium|high>] [--hide-touches] | record stop`,listUsageOverride:`record start [path] | record stop`,helpDescription:`Start/stop screen recording. The default --scope app requires an active app session from open <app>; use --scope device/system to explicitly request whole-screen recording where the selected backend supports it. Android record start publishes a durable device manifest, recordings longer than the 180s adb screenrecord limit are returned as multiple MP4 chunks while the daemon stays alive, and daemon-restart recovery uses only manifest-owned chunks. Use --max-size to limit dimensions and --quality to choose medium or high export quality`,summary:`Start or stop screen recording`,positionalArgs:[`start|stop`,`path?`],allowedFlags:[`recordingScope`,`fps`,`screenshotMaxSize`,`quality`,`hideTouches`]},Bu={usageOverride:`trace start <path> | trace stop <path>`,listUsageOverride:`trace start <path> | trace stop <path>`,helpDescription:`Start/stop trace log capture; when an artifact path is requested, pass the same positional path to start and stop`,summary:`Start or stop trace capture`,positionalArgs:[`start|stop`,`path?`]},Vu=(e,t)=>({...O(t),action:qu(e[0],Mu),path:e[1],fps:t.fps,maxSize:t.screenshotMaxSize,quality:t.quality,hideTouches:t.hideTouches,recordingScope:t.recordingScope}),Hu=(e,t)=>({...O(t),action:qu(e[0],Nu),path:e[1]}),Uu=E(Mu,e=>Ku(e)),Wu=E(Nu,e=>Ku(e)),Gu=L({name:`recording`,commands:[I({name:Mu,metadata:Fu,definition:Lu,cliSchema:zu,cliReader:Vu,daemonWriter:Uu,cliOutputFormatter:ku.record}),I({name:Nu,metadata:Iu,definition:Ru,cliSchema:Bu,cliReader:Hu,daemonWriter:Wu})]});function Ku(e){return[e.action,...M(e.path)]}function qu(t,n){if(t===`start`||t===`stop`)return t;throw new e(`INVALID_ARGS`,`${n} requires start|stop`)}const Ju=`replay`,Yu=`test`,Xu=`Replay a recorded session.`,Zu=W(Ju,Xu,{path:f(p()),update:g(),backend:p(),maestro:g(),env:Gt()}),Qu=W(Yu,`Run one or more replay scripts.`,{paths:f(Gt()),update:g(),backend:p(),maestro:g(),env:Gt(),failFast:g(),timeoutMs:h(),retries:h(),recordVideo:g(),artifactsDir:p(),shardAll:h(),shardSplit:h()}),$u=R(Zu,(e,t)=>e.replay.run(t)),ed=R(Qu,(e,t)=>e.replay.test(t)),td={usageOverride:`replay <path> | replay export <file.ad> [--format maestro] [--out <path>]`,helpDescription:`Replay a recorded session. For Maestro YAML compatibility flows, use replay <flow.yaml> --maestro and keep the target binding such as --platform ios on the replay command.`,summary:Xu,positionalArgs:[`path`],allowsExtraPositionals:!0,allowedFlags:[`replayMaestro`,`replayExportFormat`,...Dr,`timeoutMs`,`out`]},nd={usageOverride:`test <path-or-glob>...`,listUsageOverride:`test <path-or-glob>...`,helpDescription:`Run one or more replay scripts as a serial test suite`,summary:`Run replay test suites`,positionalArgs:[`pathOrGlob`],allowsExtraPositionals:!0,allowedFlags:[`replayMaestro`,...Dr,`failFast`,`timeoutMs`,`retries`,`recordVideo`,`artifactsDir`,`reporter`,`reportJunit`,`shardAll`,`shardSplit`]},rd=L({name:`replay`,commands:[I({name:Ju,metadata:Zu,definition:$u,cliSchema:td,cliReader:(e,t)=>({...O(t),path:P(e[0],`replay requires path`),update:t.replayUpdate,backend:t.replayMaestro?`maestro`:void 0,env:t.replayEnv}),daemonWriter:e=>D(Ju,[F(e.path,`replay requires path`)],{...e,replayUpdate:e.update,replayBackend:id(e),replayEnv:e.env,replayShellEnv:od(process.env)})}),I({name:Yu,metadata:Qu,definition:ed,cliSchema:nd,cliReader:(e,t)=>({...O(t),paths:e,update:t.replayUpdate,backend:t.replayMaestro?`maestro`:void 0,env:t.replayEnv,failFast:t.failFast,timeoutMs:t.timeoutMs,retries:t.retries,recordVideo:t.recordVideo,artifactsDir:t.artifactsDir,shardAll:t.shardAll,shardSplit:t.shardSplit}),daemonWriter:e=>D(Yu,e.paths??[],{...ad(e),replayUpdate:e.update,replayBackend:id(e),replayEnv:e.env,replayShellEnv:od(process.env)})})]});function id(e){return e.backend??(e.maestro===!0?`maestro`:void 0)}function ad(e){let t={...e};return delete t.reporter,delete t.reportJunit,t}function od(e){let t={};for(let[n,r]of Object.entries(e))typeof r==`string`&&n.startsWith(`AD_VAR_`)&&(t[n]=r);return t}const sd=[`in-app`,`system`];function cd(e){return{data:e,text:dd(e)}}function ld(e){if(e.platform===`android`&&e.action===`status`){let t=[`Keyboard visible: ${e.visible===!0?`yes`:`no`}`,`Input type: ${e.type??e.inputType??`unknown`}`,`Input owner: ${e.inputOwner??`unknown`}`];return e.inputMethodPackage&&t.push(`Input method: ${e.inputMethodPackage}`),e.focusedPackage&&t.push(`Focused package: ${e.focusedPackage}`),e.focusedResourceId&&t.push(`Focused resource: ${e.focusedResourceId}`),t.push(`Next action: ${fd(e.visible,e.inputOwner)}`),{data:e,text:t.join(`
36
- `)}}return V(e)}function ud(e){return e.action===`read`?{data:e,text:e.text}:V(e)}const $={appstate:z(cd),back:B,home:B,rotate:B,"app-switcher":B,keyboard:z(ld),clipboard:z(ud),"tv-remote":B};function dd(e){if(e.platform===`ios`){let t=[`Foreground app: ${e.appName??e.appBundleId??`unknown`}`];return e.appBundleId&&t.push(`Bundle: ${e.appBundleId}`),e.source&&t.push(`Source: ${e.source}`),t.join(`
33
+ agent-device perf trace start|stop --kind perfetto [--out <path>]`,listUsageOverride:`perf`,helpDescription:`Show session performance metrics, focused frame/jank health, memory diagnostics artifacts, Apple xctrace artifacts, or Android native Simpleperf/Perfetto artifacts. Prefer explicit perf metrics --json for first-pass startup/CPU/memory data. For CPU profiles, start/stop write the raw artifact and report writes a compact .json summary; include report after simpleperf stop when the task needs agent-readable native CPU evidence. Bare perf and metrics remain aliases. Native perf output is agent evidence: compact state, artifact path, and size only; raw profiles/traces stay on disk.`,summary:`Check runtime metrics, frames, memory, CPU profiles, or native trace artifacts`,positionalArgs:[`area?`,`subjectOrAction?`,`action?`],allowedFlags:[`kind`,`perfTemplate`,`out`]},cliReader:(e,t)=>({...D(t),...Jl(e,{kind:$l(t.kind),template:t.perfTemplate,out:t.out})}),daemonWriter:T(Ul,e=>Kl(e)),cliOutputFormatter:ml.perf})]});function Kl(e){let t=e.area??(e.action?`metrics`:void 0);return t===`cpu`?ql([...A(t),...A(e.subject),...A(e.action),...A(e.kind)],e):t===`trace`?ql([...A(t),...A(e.action),...A(e.kind)],e):[...A(t),...A(e.action)]}function ql(e,t){let n=[...e];return(t.template||t.out||t.tracePath)&&n.push(t.template??``),(t.out||t.tracePath)&&n.push(t.out??``),t.tracePath&&n.push(t.tracePath),n}function Jl(e,t={}){if(e[0]!==void 0&&e[1]===void 0){let n=Xl(e[0],{allowUndefined:!0});if(n)return{action:n,kind:Ql(t.kind),out:t.out}}let n=Yl(e[0]);return n===`cpu`?{area:n,subject:Zl(e[1]),action:Xl(e[2]),kind:Ql(t.kind),template:t.template,out:t.out}:n===`trace`?{area:n,action:Xl(e[1]),kind:Ql(t.kind),template:t.template,out:t.out}:{area:n,action:Xl(e[1]),kind:Ql(t.kind),out:t.out}}function Yl(t){if(t===void 0)return;let n=t.toLowerCase();if(je(n))return n;throw new e(`INVALID_ARGS`,xe)}function Xl(t,n={}){if(t===void 0)return;let r=t.toLowerCase();if(ce(r))return r;if(!n.allowUndefined)throw new e(`INVALID_ARGS`,Xe)}function Zl(t){let n=t?.toLowerCase();if(n!==void 0&&Me(n))return n;throw new e(`INVALID_ARGS`,De)}function Ql(t){if(t===void 0)return;let n=t.toLowerCase();if(he(n))return n;throw new e(`INVALID_ARGS`,fe)}function $l(e){return typeof e==`string`?Ql(e):void 0}const eu=`react-native`,tu=H(eu,`Run supported React Native app automation helpers.`,{action:f(_([`dismiss-overlay`]))}),nu=F({name:`react-native`,commands:[P({name:eu,metadata:tu,definition:R(tu,(e,t)=>e.command.reactNative(t)),cliSchema:{usageOverride:`react-native dismiss-overlay`,listUsageOverride:`react-native dismiss-overlay`,positionalArgs:[`dismiss-overlay`]},cliReader:(e,t)=>({...D(t),action:ru(e[0])}),daemonWriter:T(eu,e=>[N(e.action,`react-native requires action`)])})]});function ru(t){if(t===`dismiss-overlay`)return t;throw new e(`INVALID_ARGS`,`react-native supports only: dismiss-overlay`)}function iu(e){let t=e,n=typeof t.outPath==`string`?t.outPath:``,r=su(t);if(r.length<=1)return{data:t,text:ou(t,n)};let i=[`Recording chunks:`];for(let e of r)i.push(` ${e.index}: ${e.path}`);return typeof t.telemetryPath==`string`&&i.push(`Telemetry: ${t.telemetryPath}`),typeof t.warning==`string`&&i.push(`Warning: ${t.warning}`),typeof t.overlayWarning==`string`&&i.push(`Overlay warning: ${t.overlayWarning}`),{data:t,text:i.join(`
34
+ `)}}const au={record:z(iu)};function ou(e,t){let n=[];return t&&n.push(t),typeof e.sessionStateDir==`string`&&n.push(`Session state: ${e.sessionStateDir}`),typeof e.warning==`string`&&n.push(`Warning: ${e.warning}`),typeof e.overlayWarning==`string`&&n.push(`Overlay warning: ${e.overlayWarning}`),n.join(`
35
+ `)}function su(e){let t=e.chunks;return Array.isArray(t)?t.flatMap(e=>{if(!e||typeof e!=`object`)return[];let t=e;return typeof t.index!=`number`||typeof t.path!=`string`?[]:[{index:t.index,path:t.path}]}):[]}const cu=`record`,lu=`trace`,uu=[`start`,`stop`],du=H(cu,`Start or stop screen recording.`,{action:f(_(uu)),path:p(),fps:h(),maxSize:h(),quality:_(et),hideTouches:g(),recordingScope:_(ve)}),fu=H(lu,`Start or stop trace capture.`,{action:f(_(uu)),path:p()}),pu=R(du,(e,t)=>e.recording.record(t)),mu=R(fu,(e,t)=>e.recording.trace(t)),hu={usageOverride:`record start [path] [--scope <app|device|system>] [--fps <n>] [--max-size <px>] [--quality <medium|high>] [--hide-touches] | record stop`,listUsageOverride:`record start [path] | record stop`,helpDescription:`Start/stop screen recording. The default --scope app requires an active app session from open <app>; use --scope device/system to explicitly request whole-screen recording where the selected backend supports it. Android record start publishes a durable device manifest, recordings longer than the 180s adb screenrecord limit are returned as multiple MP4 chunks while the daemon stays alive, and daemon-restart recovery uses only manifest-owned chunks. Use --max-size to limit dimensions and --quality to choose medium or high export quality`,summary:`Start or stop screen recording`,positionalArgs:[`start|stop`,`path?`],allowedFlags:[`recordingScope`,`fps`,`screenshotMaxSize`,`quality`,`hideTouches`]},gu={usageOverride:`trace start <path> | trace stop <path>`,listUsageOverride:`trace start <path> | trace stop <path>`,helpDescription:`Start/stop trace log capture; when an artifact path is requested, pass the same positional path to start and stop`,summary:`Start or stop trace capture`,positionalArgs:[`start|stop`,`path?`]},_u=(e,t)=>({...D(t),action:Cu(e[0],cu),path:e[1],fps:t.fps,maxSize:t.screenshotMaxSize,quality:t.quality,hideTouches:t.hideTouches,recordingScope:t.recordingScope}),vu=(e,t)=>({...D(t),action:Cu(e[0],lu),path:e[1]}),yu=T(cu,e=>Su(e)),bu=T(lu,e=>Su(e)),xu=F({name:`recording`,commands:[P({name:cu,metadata:du,definition:pu,cliSchema:hu,cliReader:_u,daemonWriter:yu,cliOutputFormatter:au.record}),P({name:lu,metadata:fu,definition:mu,cliSchema:gu,cliReader:vu,daemonWriter:bu})]});function Su(e){return[e.action,...A(e.path)]}function Cu(t,n){if(t===`start`||t===`stop`)return t;throw new e(`INVALID_ARGS`,`${n} requires start|stop`)}const wu=`replay`,Tu=`test`,Eu=`Replay a recorded session.`,Du=H(wu,Eu,{path:f(p()),update:g(),backend:p(),maestro:g(),env:Rt(),metroHost:p(`Metro/debug host hint inherited by replay-opened sessions.`),metroPort:h(`Metro/debug port hint inherited by replay-opened sessions.`),bundleUrl:p(`Bundle URL hint inherited by replay-opened sessions.`),resumeFrom:h(),resumePlanDigest:p(),saveScript:v({oneOf:[Pt(),d()]}),force:g()}),Ou=H(Tu,`Run one or more replay scripts.`,{paths:f(Rt()),update:g(),backend:p(),maestro:g(),env:Rt(),metroHost:p(`Metro/debug host hint inherited by each test session.`),metroPort:h(`Metro/debug port hint inherited by each test session.`),bundleUrl:p(`Bundle URL hint inherited by each test session.`),failFast:g(),timeoutMs:h(),retries:h(),recordVideo:g(),artifactsDir:p(),shardAll:h(),shardSplit:h()}),ku=R(Du,(e,t)=>e.replay.run(ho(t))),Au=R(Ou,(e,t)=>e.replay.test(ho(t))),ju={usageOverride:`replay <path> | replay export <file.ad> [--out <path>]`,helpDescription:`Replay a recorded session. For Maestro YAML compatibility flows, use replay <flow.yaml> --maestro and keep the target binding such as --platform ios on the replay command. A script with no terminal close leaves its session (and daemon) running until you close it or it idle-reaps — no different from a session opened interactively.`,summary:Eu,positionalArgs:[`path`],allowsExtraPositionals:!0,allowedFlags:[`replayMaestro`,...Ar,...Dr,`replayFrom`,`replayPlanDigest`,`timeoutMs`,`out`,`saveScript`,`force`]},Mu={usageOverride:`test <path-or-glob>...`,listUsageOverride:`test <path-or-glob>...`,helpDescription:`Run one or more replay scripts as a serial test suite`,summary:`Run replay test suites`,positionalArgs:[`pathOrGlob`],allowsExtraPositionals:!0,allowedFlags:[`replayMaestro`,...Ar,...Dr,`failFast`,`timeoutMs`,`retries`,`recordVideo`,`artifactsDir`,`reporter`,`reportJunit`,`shardAll`,`shardSplit`]},Nu=F({name:`replay`,commands:[P({name:wu,metadata:Du,definition:ku,cliSchema:ju,cliReader:(e,t)=>({...D(t),path:M(e[0],`replay requires path`),update:t.replayUpdate,backend:t.replayMaestro?`maestro`:void 0,env:t.replayEnv,metroHost:t.metroHost,metroPort:t.metroPort,bundleUrl:t.bundleUrl,resumeFrom:t.replayFrom,resumePlanDigest:t.replayPlanDigest,saveScript:t.saveScript,force:t.force}),daemonWriter:e=>E(wu,[N(e.path,`replay requires path`)],{...e,replayUpdate:e.update,replayBackend:Pu(e),replayEnv:e.env,replayShellEnv:Iu(process.env),replayFrom:e.resumeFrom,replayPlanDigest:e.resumePlanDigest,saveScript:e.saveScript})}),P({name:Tu,metadata:Ou,definition:Au,cliSchema:Mu,cliReader:(e,t)=>({...D(t),paths:e,update:t.replayUpdate,backend:t.replayMaestro?`maestro`:void 0,env:t.replayEnv,metroHost:t.metroHost,metroPort:t.metroPort,bundleUrl:t.bundleUrl,failFast:t.failFast,timeoutMs:t.timeoutMs,retries:t.retries,recordVideo:t.recordVideo,artifactsDir:t.artifactsDir,shardAll:t.shardAll,shardSplit:t.shardSplit}),daemonWriter:e=>E(Tu,e.paths??[],{...Fu(e),replayUpdate:e.update,replayBackend:Pu(e),replayEnv:e.env,replayShellEnv:Iu(process.env)})})]});function Pu(e){return e.backend??(e.maestro===!0?`maestro`:void 0)}function Fu(e){let t={...e};return delete t.reporter,delete t.reportJunit,t}function Iu(e){let t={};for(let[n,r]of Object.entries(e))typeof r==`string`&&n.startsWith(`AD_VAR_`)&&(t[n]=r);return t}function Lu(e){return e}const Ru={back:Lu({clientMethod:`back`,outputSchema:{type:`object`,properties:{action:{type:`string`,const:`back`},mode:{type:`string`,enum:Ne},message:{type:`string`}},required:[`action`,`mode`,`message`]}}),home:Lu({clientMethod:`home`,outputSchema:{type:`object`,properties:{action:{type:`string`,const:`home`},message:{type:`string`}},required:[`action`,`message`]}}),orientation:Lu({clientMethod:`orientation`,outputSchema:{type:`object`,properties:{action:{type:`string`,const:`orientation`},orientation:{type:`string`,enum:le},message:{type:`string`}},required:[`action`,`orientation`,`message`]}}),"app-switcher":Lu({clientMethod:`appSwitcher`,outputSchema:{type:`object`,properties:{action:{type:`string`,const:`app-switcher`},message:{type:`string`}},required:[`action`,`message`]}}),"tv-remote":Lu({clientMethod:`tvRemote`,outputSchema:{type:`object`,properties:{action:{type:`string`,const:`tv-remote`},button:{type:`string`,enum:Be},durationMs:{type:`number`},message:{type:`string`}},required:[`action`,`button`,`message`]}})};function zu(e){return{data:e,text:Hu(e)}}function Bu(e){if(e.platform===`android`&&e.action===`status`){let t=[`Keyboard visible: ${e.visible===!0?`yes`:`no`}`,`Input type: ${e.type??e.inputType??`unknown`}`,`Input owner: ${e.inputOwner??`unknown`}`];return e.inputMethodPackage&&t.push(`Input method: ${e.inputMethodPackage}`),e.focusedPackage&&t.push(`Focused package: ${e.focusedPackage}`),e.focusedResourceId&&t.push(`Focused resource: ${e.focusedResourceId}`),t.push(`Next action: ${Uu(e.visible,e.inputOwner)}`),{data:e,text:t.join(`
36
+ `)}}return V(e)}function Vu(e){return e.action===`read`?{data:e,text:e.text}:V(e)}const $={appstate:z(zu),back:B,home:B,orientation:B,"app-switcher":B,keyboard:z(Bu),clipboard:z(Vu),"tv-remote":B};function Hu(e){if(e.platform===`ios`){let t=[`Foreground app: ${e.appName??e.appBundleId??`unknown`}`];return e.appBundleId&&t.push(`Bundle: ${e.appBundleId}`),e.source&&t.push(`Source: ${e.source}`),t.join(`
37
37
  `)}if(e.platform===`android`){let t=[`Foreground app: ${e.package??`unknown`}`];return e.activity&&t.push(`Activity: ${e.activity}`),t.join(`
38
- `)}return null}function fd(e,t){return t===`ime`?`Focused input appears to be owned by the keyboard/IME; dismiss or change the IME before retrying text entry.`:e===!0?`Keyboard is visible and focused input appears app-owned; fill/type can proceed.`:`Keyboard is hidden; focus an app field before type, or use fill with a concrete target.`}const pd=`appstate`,md=`back`,hd=`home`,gd=`rotate`,_d=`app-switcher`,vd=`keyboard`,yd=`clipboard`,bd=`tv-remote`,xd=[`read`,`write`],Sd=[`status`,`dismiss`],Cd=W(pd,`Show foreground app or activity.`,{}),wd=W(md,`Navigate back.`,{mode:_(sd)}),Td=W(hd,`Go to the home screen.`,{}),Ed=W(gd,`Rotate device orientation.`,{orientation:f(_(Xe))}),Dd=W(_d,`Open the app switcher.`,{}),Od=W(vd,`Inspect or dismiss the keyboard.`,{action:_(Sd)}),kd=W(yd,`Read or write clipboard text.`,{action:f(_(xd)),text:p()}),Ad=W(bd,`Press a TV remote/D-pad button.`,{button:f(_(Qe)),durationMs:h(`Press duration in milliseconds. tvOS uses the exact hold duration; Android TV maps any positive value to an ADB longpress (${Ue(`android`)}).`,{min:0})}),jd=R(Cd,(e,t)=>e.command.appState(t)),Md=R(wd,(e,t)=>e.command.back(t)),Nd=R(Td,(e,t)=>e.command.home(t)),Pd=R(Ed,(e,t)=>e.command.rotate(t)),Fd=R(Dd,(e,t)=>e.command.appSwitcher(t)),Id=R(Od,(e,t)=>e.command.keyboard(t)),Ld=R(kd,(e,t)=>e.command.clipboard(t)),Rd=R(Ad,(e,t)=>e.command.tvRemote(t)),zd={helpDescription:`Show foreground app/activity`},Bd={usageOverride:`back [--in-app|--system]`,allowedFlags:[`backMode`]},Vd={usageOverride:`rotate <portrait|portrait-upside-down|landscape-left|landscape-right>`,helpDescription:`Rotate device orientation on iOS and Android`,positionalArgs:[`orientation`]},Hd={usageOverride:`keyboard [status|get|dismiss|enter|return]`,helpDescription:`Inspect Android keyboard visibility/type or press/dismiss the device keyboard. To hide the keyboard, use keyboard dismiss. It taps safe controls like Done when available, verifies the keyboard closed, and reports UNSUPPORTED_OPERATION when no safe control is available.`,summary:`Inspect, press, or dismiss the device keyboard`,positionalArgs:[`action?`]},Ud={usageOverride:`clipboard read | clipboard write <text>`,listUsageOverride:`clipboard read | clipboard write <text>`,helpDescription:`Read or write device clipboard text`,positionalArgs:[`read|write`,`text?`],allowsExtraPositionals:!0},Wd={usageOverride:`tv-remote [press|longpress] ${He} [--duration-ms <ms>]`,listUsageOverride:`tv-remote press|longpress <button> [--duration-ms <ms>]`,helpDescription:`Press a TV remote/D-pad button on Android TV or tvOS. Use longpress for a 500ms held remote button; --duration-ms overrides the preset. Aliases ok, center, and enter map to select.`,summary:`Press a TV remote/D-pad button`,positionalArgs:[`press|longpress?`,`button`],allowedFlags:[`durationMs`]},Gd=(e,t)=>O(t),Kd=(e,t)=>O(t),qd=(e,t)=>O(t),Jd=(e,t)=>({...O(t),mode:t.backMode}),Yd=(e,t)=>({...O(t),orientation:Oe(e[0])}),Xd=(e,t)=>({...O(t),...df(e)}),Zd=(e,t)=>({...O(t),...ff(e)}),Qd=(e,t)=>({...O(t),...pf(e,t.durationMs)}),$d=E(pd),ef=e=>D(md,[],{...e,backMode:lf(e.mode)}),tf=E(hd),nf=E(gd,e=>[F(e.orientation,`rotate requires orientation`)]),rf=E(_d),af=E(vd,e=>M(e.action)),of=E(yd,e=>uf(e)),sf=E(bd,e=>[F(e.button,`tv-remote requires button`)]),cf=L({name:`system`,commands:[I({name:pd,metadata:Cd,definition:jd,clientMethod:`appState`,cliSchema:zd,cliReader:Gd,daemonWriter:$d,cliOutputFormatter:$.appstate}),I({name:md,metadata:wd,definition:Md,clientMethod:`back`,cliSchema:Bd,cliReader:Jd,daemonWriter:ef,cliOutputFormatter:$.back}),I({name:hd,metadata:Td,definition:Nd,clientMethod:`home`,cliReader:Kd,daemonWriter:tf,cliOutputFormatter:$.home}),I({name:gd,metadata:Ed,definition:Pd,clientMethod:`rotate`,cliSchema:Vd,cliReader:Yd,daemonWriter:nf,cliOutputFormatter:$.rotate}),I({name:_d,metadata:Dd,definition:Fd,clientMethod:`appSwitcher`,cliReader:qd,daemonWriter:rf,cliOutputFormatter:$[`app-switcher`]}),I({name:vd,metadata:Od,definition:Id,clientMethod:`keyboard`,cliSchema:Hd,cliReader:Xd,daemonWriter:af,cliOutputFormatter:$.keyboard}),I({name:yd,metadata:kd,definition:Ld,clientMethod:`clipboard`,cliSchema:Ud,cliReader:Zd,daemonWriter:of,cliOutputFormatter:$.clipboard}),I({name:bd,metadata:Ad,definition:Rd,clientMethod:`tvRemote`,cliSchema:Wd,cliReader:Qd,daemonWriter:sf,cliOutputFormatter:$[`tv-remote`]})]});function lf(e){return e===`in-app`||e===`system`?e:void 0}function uf(e){return e.action===`read`?[`read`]:[`write`,e.text]}function df(t){if(t.length>1)throw new e(`INVALID_ARGS`,`keyboard accepts at most one action argument.`);return w({action:mf(t[0])})}function ff(t){let n=t[0]?.toLowerCase();if(n!==`read`&&n!==`write`)throw new e(`INVALID_ARGS`,`clipboard requires a subcommand: read or write.`);if(n===`read`){if(t.length!==1)throw new e(`INVALID_ARGS`,`clipboard read does not accept additional arguments.`);return{action:n}}if(t.length<2)throw new e(`INVALID_ARGS`,`clipboard write requires text.`);return{action:n,text:t.slice(1).join(` `)}}function pf(t,n){let r=t[0]?.toLowerCase(),i=r===`press`||r===`longpress`?t.slice(1):t;if(i.length!==1)throw new e(`INVALID_ARGS`,`tv-remote requires exactly one button: ${Qe.join(`, `)}.`);let a=n??(r===`longpress`?500:void 0);return w({button:Je(i[0]),durationMs:a})}function mf(t){let n=t?.toLowerCase();if(n===`get`)return`status`;if(n===void 0||n===`status`||n===`dismiss`||n===`enter`||n===`return`)return n;throw new e(`INVALID_ARGS`,`keyboard action must be status, get, dismiss, enter, or return.`)}const hf=[co,wc,Fi,cf,Eu,rd,El,hu,Vi,Gu,jc,Ur];function gf(){return hf.flatMap(e=>[...e.metadata])}function _f(){return hf.flatMap(e=>[...e.definitions])}function vf(){return Sf(`cliSchemas`)}function yf(){return Sf(`cliReaders`)}function bf(){return Sf(`daemonWriters`)}function xf(){return Sf(`cliOutputFormatters`)}function Sf(e){let t={};for(let n of hf){let r=n[e];if(r)for(let[n,i]of Object.entries(r)){if(Object.hasOwn(t,n))throw Error(`Duplicate ${String(e)} command family entry: ${n}`);t[n]=i}}return t}export{xr as A,sr as C,hr as D,lr as E,Ut as M,Rt as N,gr as O,Mt as P,or as S,pr as T,Mr as _,_f as a,ar as b,sd as c,Rr as d,Fr as f,Cr as g,Ar as h,bf as i,Vt as j,vr as k,Oc as l,kr as m,yf as n,gf as o,Ir as p,vf as r,cf as s,xf as t,ks as u,Nr as v,mr as w,cr as x,br as y};
38
+ `)}return null}function Uu(e,t){return t===`ime`?`Focused input appears to be owned by the keyboard/IME; dismiss or change the IME before retrying text entry.`:e===!0?`Keyboard is visible and focused input appears app-owned; fill/type can proceed.`:`Keyboard is hidden; focus an app field before type, or use fill with a concrete target.`}const Wu=`appstate`,Gu=`back`,Ku=`home`,qu=`orientation`,Ju=`app-switcher`,Yu=`keyboard`,Xu=`clipboard`,Zu=`tv-remote`,Qu=[`read`,`write`],$u=[`status`,`dismiss`],ed=H(Wu,`Show foreground app or activity.`,{}),td=H(Gu,`Navigate back.`,{mode:_(Ne)}),nd=H(Ku,`Go to the home screen.`,{}),rd=H(qu,`Set device orientation.`,{orientation:f(_(le))}),id=H(Ju,`Open the app switcher.`,{}),ad=H(Yu,`Inspect or dismiss the keyboard.`,{action:_($u)}),od=H(Xu,`Read or write clipboard text.`,{action:f(_(Qu)),text:p()}),sd=H(Zu,`Press a TV remote/D-pad button.`,{button:f(_(Be)),durationMs:h(`Press duration in milliseconds. tvOS and Vega OS use the exact hold duration; Android TV maps any positive value to an ADB longpress (${ue(`android`)}).`,{min:0})}),cd=R(ed,(e,t)=>e.command.appState(t)),ld=R(td,(e,t)=>e.command.back(t),Ru.back),ud=R(nd,(e,t)=>e.command.home(t),Ru.home),dd=R(rd,(e,t)=>e.command.orientation(t),Ru.orientation),fd=R(id,(e,t)=>e.command.appSwitcher(t),Ru[`app-switcher`]),pd=R(ad,(e,t)=>e.command.keyboard(t)),md=R(od,(e,t)=>e.command.clipboard(t)),hd=R(sd,(e,t)=>e.command.tvRemote(t),Ru[`tv-remote`]),gd={helpDescription:`Show foreground app/activity`},_d={usageOverride:`back [--in-app|--system]`,allowedFlags:[`backMode`]},vd={usageOverride:`orientation <portrait|portrait-upside-down|landscape-left|landscape-right>`,helpDescription:`Set device orientation on iOS and Android`,positionalArgs:[`orientation`]},yd={usageOverride:`keyboard [status|get|dismiss|enter|return]`,helpDescription:`Inspect Android keyboard visibility/type or press/dismiss the device keyboard. To hide the keyboard, use keyboard dismiss. It taps safe controls like Done when available, verifies the keyboard closed, and reports UNSUPPORTED_OPERATION when no safe control is available.`,summary:`Inspect, press, or dismiss the device keyboard`,positionalArgs:[`action?`]},bd={usageOverride:`clipboard read | clipboard write <text>`,listUsageOverride:`clipboard read | clipboard write <text>`,helpDescription:`Read or write device clipboard text`,positionalArgs:[`read|write`,`text?`],allowsExtraPositionals:!0},xd={usageOverride:`tv-remote [press|longpress] ${pt} [--duration-ms <ms>]`,listUsageOverride:`tv-remote press|longpress <button> [--duration-ms <ms>]`,helpDescription:`Press a TV remote/D-pad button on Android TV, tvOS, or Vega OS. Use longpress for a 500ms held remote button; --duration-ms overrides the preset. Aliases ok, center, and enter map to select.`,summary:`Press a TV remote/D-pad button`,positionalArgs:[`press|longpress?`,`button`],allowedFlags:[`durationMs`]},Sd=(e,t)=>D(t),Cd=(e,t)=>D(t),wd=(e,t)=>D(t),Td=(e,t)=>({...D(t),mode:t.backMode}),Ed=(e,t)=>({...D(t),orientation:Se(e[0])}),Dd=(e,t)=>({...D(t),...Hd(e)}),Od=(e,t)=>({...D(t),...Ud(e)}),kd=(e,t)=>({...D(t),...Wd(e,t.durationMs)}),Ad=T(Wu),jd=e=>E(Gu,[],{...e,backMode:Bd(e.mode)}),Md=T(Ku),Nd=T(qu,e=>[N(e.orientation,`orientation requires orientation`)]),Pd=T(Ju),Fd=T(Yu,e=>A(e.action)),Id=T(Xu,e=>Vd(e)),Ld=T(Zu,e=>[N(e.button,`tv-remote requires button`)]),Rd=F({name:`system`,commands:[P({name:Wu,metadata:ed,definition:cd,clientMethod:`appState`,cliSchema:gd,cliReader:Sd,daemonWriter:Ad,cliOutputFormatter:$.appstate}),P({name:Gu,metadata:td,definition:ld,cliSchema:_d,cliReader:Td,daemonWriter:jd,cliOutputFormatter:$.back}),P({name:Ku,metadata:nd,definition:ud,cliReader:Cd,daemonWriter:Md,cliOutputFormatter:$.home}),P({name:qu,metadata:rd,definition:dd,cliSchema:vd,cliReader:Ed,daemonWriter:Nd,cliOutputFormatter:$.orientation}),P({name:Ju,metadata:id,definition:fd,cliReader:wd,daemonWriter:Pd,cliOutputFormatter:$[`app-switcher`]}),P({name:Yu,metadata:ad,definition:pd,clientMethod:`keyboard`,cliSchema:yd,cliReader:Dd,daemonWriter:Fd,cliOutputFormatter:$.keyboard}),P({name:Xu,metadata:od,definition:md,clientMethod:`clipboard`,cliSchema:bd,cliReader:Od,daemonWriter:Id,cliOutputFormatter:$.clipboard}),P({name:Zu,metadata:sd,definition:hd,cliSchema:xd,cliReader:kd,daemonWriter:Ld,cliOutputFormatter:$[`tv-remote`]})]}),zd=Vn(Rd.definitions);function Bd(e){return e===`in-app`||e===`system`?e:void 0}function Vd(e){return e.action===`read`?[`read`]:[`write`,e.text]}function Hd(t){if(t.length>1)throw new e(`INVALID_ARGS`,`keyboard accepts at most one action argument.`);return C({action:Gd(t[0])})}function Ud(t){let n=t[0]?.toLowerCase();if(n!==`read`&&n!==`write`)throw new e(`INVALID_ARGS`,`clipboard requires a subcommand: read or write.`);if(n===`read`){if(t.length!==1)throw new e(`INVALID_ARGS`,`clipboard read does not accept additional arguments.`);return{action:n}}if(t.length<2)throw new e(`INVALID_ARGS`,`clipboard write requires text.`);return{action:n,text:t.slice(1).join(` `)}}function Wd(t,n){let r=t[0]?.toLowerCase(),i=r===`press`||r===`longpress`?t.slice(1):t;if(i.length!==1)throw new e(`INVALID_ARGS`,`tv-remote requires exactly one button: ${Be.join(`, `)}.`);let a=n??(r===`longpress`?500:void 0);return C({button:Oe(i[0]),durationMs:a})}function Gd(t){let n=t?.toLowerCase();if(n===`get`)return`status`;if(n===void 0||n===`status`||n===`dismiss`||n===`enter`||n===`return`)return n;throw new e(`INVALID_ARGS`,`keyboard action must be status, get, dismiss, enter, or return.`)}const Kd=[Pa,ec,_i,Rd,nu,Nu,nl,Gl,Ci,xu,sc,_r];function qd(){return Kd.flatMap(e=>[...e.metadata])}function Jd(){return Kd.flatMap(e=>[...e.definitions])}function Yd(){return $d(`cliSchemas`)}function Xd(){return $d(`cliReaders`)}function Zd(){return $d(`daemonWriters`)}function Qd(){return $d(`cliOutputFormatters`)}function $d(e){let t={};for(let n of Kd){let r=n[e];if(r)for(let[n,i]of Object.entries(r)){if(Object.hasOwn(t,n))throw Error(`Duplicate ${String(e)} command family entry: ${n}`);t[n]=i}}return t}export{Et as S,ar as _,Jd as a,It as b,Rd as c,jr as d,Mr as f,ur as g,lr as h,Zd as i,ic as l,fr as m,Xd as n,qd as o,Er as p,Yd as r,zd as s,Qd as t,is as u,or as v,d as x,Pt as y};