agent-device 0.19.3 → 0.20.0

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 (168) hide show
  1. package/README.md +61 -70
  2. package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.0.apk +0 -0
  3. package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.0.apk.sha256 +1 -0
  4. package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.0.manifest.json +10 -0
  5. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.0.apk +0 -0
  6. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.0.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.0.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 +272 -118
  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 +134 -101
  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 +44 -24
  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 +126 -11
  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.swift +14 -0
  28. package/dist/src/agent-browser-tool.js +1 -1
  29. package/dist/src/agent-device-client.js +3 -0
  30. package/dist/src/android-adb.d.ts +1 -1
  31. package/dist/src/android-adb.js +1 -1
  32. package/dist/src/android-input-method-overlays.js +1 -0
  33. package/dist/src/android-input-ownership.js +1 -6
  34. package/dist/src/android-system-chrome.js +1 -0
  35. package/dist/src/android.js +1 -1
  36. package/dist/src/app-lifecycle.js +5 -5
  37. package/dist/src/app-log-request-scope.js +1 -0
  38. package/dist/src/app-resolution.js +1 -0
  39. package/dist/src/apple-multitouch-support.js +1 -0
  40. package/dist/src/apps.js +5 -5
  41. package/dist/src/boot-diagnostics.js +2 -0
  42. package/dist/src/cli-config.js +1 -0
  43. package/dist/src/cli-help.js +61 -27
  44. package/dist/src/cli-runner.js +1 -1
  45. package/dist/src/cli.js +15 -11
  46. package/dist/src/command-schema.js +3 -3
  47. package/dist/src/config.js +1 -0
  48. package/dist/src/context.js +1 -0
  49. package/dist/src/contracts.d.ts +1 -1
  50. package/dist/src/daemon-shutdown-report.js +1 -0
  51. package/dist/src/debug-symbols.js +1 -1
  52. package/dist/src/device-input-state.js +1 -1
  53. package/dist/src/devices2.js +1 -1
  54. package/dist/src/find.js +1 -1
  55. package/dist/src/finders.js +1 -1
  56. package/dist/src/generic.js +1 -1
  57. package/dist/src/helper.js +1 -1
  58. package/dist/src/index.d.ts +412 -293
  59. package/dist/src/index.js +1 -1
  60. package/dist/src/input-actions.js +4 -3
  61. package/dist/src/install-artifact.js +1 -0
  62. package/dist/src/install-source.d.ts +5 -1
  63. package/dist/src/install-source.js +1 -1
  64. package/dist/src/install-source2.js +1 -1
  65. package/dist/src/interaction-snapshot.js +1 -1
  66. package/dist/src/interaction.d.ts +230 -0
  67. package/dist/src/interaction.js +1 -1
  68. package/dist/src/interactor.js +2 -2
  69. package/dist/src/internal/bin.js +1 -1
  70. package/dist/src/internal/daemon.js +42 -20
  71. package/dist/src/internal/png-worker.d.ts +22 -0
  72. package/dist/src/internal/png-worker.js +1 -1
  73. package/dist/src/launch-console.js +1 -0
  74. package/dist/src/lease-context.js +1 -0
  75. package/dist/src/lease.js +1 -1
  76. package/dist/src/linux.js +1 -1
  77. package/dist/src/logcat.js +5 -0
  78. package/dist/src/metro.d.ts +2 -2
  79. package/dist/src/notifications.js +1 -1
  80. package/dist/src/png-worker-contract.js +1 -1
  81. package/dist/src/process-lock.js +1 -0
  82. package/dist/src/react-native.js +1 -1
  83. package/dist/src/record-trace.js +1 -1
  84. package/dist/src/register-builtins.js +1 -0
  85. package/dist/src/registry.js +24 -24
  86. package/dist/src/reporting.js +8 -7
  87. package/dist/src/runner-client.js +1 -1
  88. package/dist/src/runner-disposal.js +2 -0
  89. package/dist/src/runner-lease.js +1 -0
  90. package/dist/src/runner-sequence.js +1 -1
  91. package/dist/src/runtime.js +3 -3
  92. package/dist/src/runtime2.js +1 -0
  93. package/dist/src/sdk-android-adb.d.ts +119 -33
  94. package/dist/src/sdk-android-adb.js +2 -2
  95. package/dist/src/sdk-batch-runner.d.ts +2 -1
  96. package/dist/src/sdk-batch-runner.js +2 -2
  97. package/dist/src/sdk-batch.js +2 -2
  98. package/dist/src/sdk-contracts.d.ts +105 -98
  99. package/dist/src/sdk-contracts.js +1 -1
  100. package/dist/src/sdk-device.js +1 -1
  101. package/dist/src/sdk-finders.d.ts +3 -3
  102. package/dist/src/sdk-finders.js +1 -1
  103. package/dist/src/sdk-io.d.ts +1 -1
  104. package/dist/src/sdk-remote-config.d.ts +9 -1
  105. package/dist/src/sdk-remote-config.js +1 -1
  106. package/dist/src/sdk-selectors.js +1 -1
  107. package/dist/src/selector-runtime.js +1 -1
  108. package/dist/src/selector-vocabulary.js +1 -0
  109. package/dist/src/selectors.d.ts +12 -3
  110. package/dist/src/selectors.js +1 -1
  111. package/dist/src/server.js +3 -3
  112. package/dist/src/session-target-evidence.js +1 -0
  113. package/dist/src/session.js +8 -10
  114. package/dist/src/simulator.js +1 -1
  115. package/dist/src/snapshot-diagnostics.js +5 -2
  116. package/dist/src/snapshot.js +1 -1
  117. package/dist/src/snapshot2.js +1 -2
  118. package/dist/src/tv-remote.js +13 -12
  119. package/dist/src/url.js +1 -1
  120. package/dist/src/web.js +1 -1
  121. package/package.json +28 -23
  122. package/server.json +2 -2
  123. package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.19.3.apk +0 -0
  124. package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.19.3.apk.sha256 +0 -1
  125. package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.19.3.manifest.json +0 -10
  126. package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.19.3.apk +0 -0
  127. package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.19.3.apk.sha256 +0 -1
  128. package/dist/src/apple-runner-options.js +0 -1
  129. package/dist/src/cli-output.js +0 -1
  130. package/dist/src/client.js +0 -3
  131. package/dist/src/handler-utils.js +0 -1
  132. package/dist/src/output-path.js +0 -1
  133. package/dist/src/points.js +0 -4
  134. package/dist/src/provider.js +0 -1
  135. package/dist/src/providers.js +0 -1
  136. package/dist/src/record-trace-recording.js +0 -23
  137. package/dist/src/recording-provider.js +0 -1
  138. package/dist/src/selectors2.js +0 -1
  139. package/dist/src/simctl.js +0 -1
  140. package/dist/src/ttl-memo.js +0 -1
  141. package/dist/src/xml.js +0 -2
  142. /package/{macos-helper → apple/macos-helper}/Package.swift +0 -0
  143. /package/{macos-helper → apple/macos-helper}/Sources/AgentDeviceMacOSHelper/AudioProbe.swift +0 -0
  144. /package/{macos-helper → apple/macos-helper}/Sources/AgentDeviceMacOSHelper/SnapshotTraversal.swift +0 -0
  145. /package/{macos-helper → apple/macos-helper}/Sources/AgentDeviceMacOSHelper/main.swift +0 -0
  146. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +0 -0
  147. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunner.xcodeproj/project.pbxproj +0 -0
  148. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -0
  149. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunner.xcodeproj/xcshareddata/xcschemes/AgentDeviceRunner.xcscheme +0 -0
  150. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/AgentDeviceRunnerUITests-Bridging-Header.h +0 -0
  151. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/AgentDeviceRunnerUITests.entitlements +0 -0
  152. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerObjCExceptionCatcher.h +0 -0
  153. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerObjCExceptionCatcher.m +0 -0
  154. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTapPointPolicy.swift +0 -0
  155. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AXSnapshotFallback.swift +0 -0
  156. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Environment.swift +0 -0
  157. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Exceptions.swift +0 -0
  158. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+FlatSnapshotFiltering.swift +0 -0
  159. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Navigation.swift +0 -0
  160. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScreenRecorder.swift +0 -0
  161. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +0 -0
  162. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Transport.swift +0 -0
  163. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TvRemote.swift +0 -0
  164. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/AgentDeviceRunnerUITests.xctestplan +0 -0
  165. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/RecordingScripts/recording-overlay.swift +0 -0
  166. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/RecordingScripts/recording-resize.swift +0 -0
  167. /package/dist/{apple-runner → apple/runner}/AgentDeviceRunner/RecordingScripts/recording-trim.swift +0 -0
  168. /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{N as r,P as i,S as a,b as o,d as s,o as c,r as ee,u as te}from"./sdk-batch.js";import{$t as ne,An as re,Ft as ie,In as ae,It as oe,Kn as se,Kt as ce,Lt as le,Nt as ue,Pt as de,Qt as fe,Rt as pe,S as me,Tt as he,Ut as ge,Xn as _e,Yt as ve,Zn as ye,_n as be,an as xe,b as Se,c as Ce,cn as we,dn as Te,dt as Ee,en as De,er as Oe,f as ke,fn as Ae,ft as je,g as Me,h as Ne,hn as Pe,jn as Fe,ln as Ie,lt as Le,m as Re,mn as ze,n as Be,nn as Ve,nr as He,o as Ue,on as We,p as Ge,r as Ke,rn as qe,rr as l,s as Je,sn as Ye,t as Xe,tn as Ze,tr as Qe,u as $e,ut as et,w as tt,wn as nt,x as rt,xn as it,xt as at,zt as ot}from"./tv-remote.js";import{n as st,t as ct}from"./sdk-device.js";import{S as lt,nt as ut,v as dt,y as ft}from"./sdk-selectors.js";import{a as pt,i as mt,o as ht,r as gt,s as _t,u,x as vt}from"./sdk-batch-runner.js";import{n as yt,t as bt}from"./sdk-app-inventory.js";let xt=!1;function St(){xt=!0}function Ct(){let e=xt;return xt=!1,e}const wt=[`ref`,`selector`,`point`];function Tt(e,t=[]){return{type:`object`,properties:{...dn(),...e},...t.length>0?{required:t}:{},additionalProperties:!1}}function Et(e){return{type:`object`,description:e,properties:{x:{type:`number`},y:{type:`number`}},required:[`x`,`y`],additionalProperties:!1}}function Dt(e,t){return{type:`string`,enum:e,...t?{description:t}:{}}}function d(e){return{type:`string`,...e?{description:e}:{}}}function Ot(e){return{type:`number`,...e?{description:e}:{}}}function kt(e){return{type:`integer`,...e?{description:e}:{}}}function At(e){return{type:`boolean`,...e?{description:e}:{}}}function jt(e){return{type:`array`,items:{type:`string`},...e?{description:e}:{}}}function Mt(e){return{type:`object`,additionalProperties:!0,...e?{description:e}:{}}}function f(e){return{...e,required:!0}}function p(e){return C(d(e),b)}function m(e){return C(Ot(e),Xt)}function h(e,t={}){return C(on(e,t),(e,n)=>be(e,n,t))}function g(e){return C(At(e),Zt)}function _(e,t){return C(Dt(e,t),(t,n)=>$t(t,n,e))}function Nt(e){return C(Mt(e),ln)}function Pt(e){return C(jt(e),un)}function v(e){return C(e,(e,t)=>e[t])}function Ft(e,t){return C(e,t)}function It(){return C(fn(),(e,t)=>e[t]===void 0?void 0:Gt(e,t))}function Lt(){return C(pn(),(e,t)=>e[t]===void 0?void 0:Kt(e,t))}function Rt(e){return C(Et(e),(e,t)=>e[t]===void 0?void 0:qt(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 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 Bt(e){return Tt(sn(e),cn(e))}function Vt(t,n){let r=Ht(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=Ut(r,{readTargetAlias:!Object.hasOwn(n,`target`)});return S({...a,...x(a),...i})}function Ht(t){if(t==null)return{};if(!t||typeof t!=`object`||Array.isArray(t))throw new e(`INVALID_ARGS`,`Expected object arguments.`);return t}function Ut(e,t={}){return{session:b(e,`session`),platform:$t(e,`platform`,st),deviceTarget:Wt(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`),noRecord:Zt(e,`noRecord`),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:Zt(e,`debug`)}}function Wt(t,n){let r=$t(t,`deviceTarget`,ct);if(n.readTargetAlias===!1||t.target===void 0)return r;let i=$t(t,`target`,ct);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 Gt(e,t){let n=hn(e,t),r=Qt(n,`kind`,wt);switch(r){case`ref`:return{kind:r,ref:Jt(n,`ref`),label:b(n,`label`)};case`selector`:return{kind:r,selector:Jt(n,`selector`)};case`point`:return{kind:r,x:Yt(n,`x`),y:Yt(n,`y`)}}}function Kt(e,t){let n=hn(e,t),r=Qt(n,`kind`,[`ref`,`selector`]);return r===`ref`?{kind:r,ref:Jt(n,`ref`),label:b(n,`label`)}:{kind:r,selector:Jt(n,`selector`)}}function qt(e,t){let n=hn(e,t);return{x:Yt(n,`x`),y:Yt(n,`y`)}}function Jt(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 Yt(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 Xt(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 Zt(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 Qt(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 $t(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 x(e){return S({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 en(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 tn(e){switch(e.kind){case`ref`:return{ref:e.ref,label:e.label};case`selector`:return{selector:e.selector}}}function nn(e){return{count:e.count,intervalMs:e.intervalMs,holdMs:e.holdMs,jitterPx:e.jitterPx,doubleTap:e.doubleTap}}function rn(e){return{depth:e.depth,scope:e.scope,raw:e.raw}}function an(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 S(e){return Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0))}function C(e,t){return{schema:e,required:!1,read:t}}function on(e,t){return{...kt(e),...t.min===void 0?{}:{minimum:t.min},...t.max===void 0?{}:{maximum:t.max}}}function sn(e){return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,t.schema]))}function cn(e){return Object.entries(e).flatMap(([e,t])=>t.required?[e]:[])}function ln(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 un(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 dn(){return{session:{type:`string`,description:`Agent-device session name.`},platform:{type:`string`,enum:st,description:`Platform selector used to resolve a device.`},deviceTarget:{type:`string`,enum:ct,description:`Device target form. Maps to the CLI --target flag.`},target:{type:`string`,enum:ct,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 fn(){return{oneOf:[...mn(),{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 pn(){return{oneOf:mn(),description:`UI element target by snapshot ref or selector expression.`}}function mn(){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 hn(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 w(e,t){return n=>T(e,t?t(n):[],n)}function T(e,t,n,r){return{command:e,positionals:t,...r?{input:r}:{},options:gn(n)}}function gn(e){let t=_n(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 _n(e){return e===`mobile`||e===`tv`||e===`desktop`?e:void 0}function E(e){return S({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 vn(e){return S({record:e.record})}function yn(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 bn(e){return S({depth:e.snapshotDepth,scope:e.snapshotScope,raw:e.snapshotRaw})}function xn(e){return{depth:e.snapshotDepth,scope:e.snapshotScope,raw:e.snapshotRaw}}function Sn(e){return S({settle:e.settle,settleQuietMs:e.settleQuietMs,timeoutMs:e.timeoutMs})}function Cn(e){return S({count:e.count,intervalMs:e.intervalMs,holdMs:e.holdMs,jitterPx:e.jitterPx,doubleTap:e.doubleTap})}function wn(e){if(`ref`in e&&e.ref!==void 0)return S({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 Tn(t){let n=Dn(t);if(typeof n.ref==`string`)return[n.ref,...kn(n.label)];if(typeof n.selector==`string`)return[n.selector];if(n.kind===`point`||n.x!==void 0||n.y!==void 0)return[String(On(n.x,`x`)),String(On(n.y,`y`))];throw new e(`INVALID_ARGS`,`interaction requires @ref, selector, or point target`)}function En(t){let n=Dn(t);if(typeof n.ref==`string`)return[n.ref,...kn(n.label)];if(typeof n.selector==`string`)return[n.selector];throw new e(`INVALID_ARGS`,`element command requires @ref or selector target`)}function Dn(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 On(t,n){if(typeof t!=`number`||!Number.isFinite(t))throw new e(`INVALID_ARGS`,`point target requires numeric ${n}.`);return t}function kn(e){return typeof e==`string`&&e.length>0?[e]:[]}function An(t){if(t[0]?.startsWith(`@`))return{ref:t[0],label:Pn(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 jn(t){if(t===`text`||t===`attrs`)return t;throw new e(`INVALID_ARGS`,`get only supports text or attrs`)}function Mn(t,n={}){let i=r(t,n);if(!i)throw new e(`INVALID_ARGS`,`is requires a selector expression`);return i}function Nn(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 Pn(e){return e.join(` `).trim()||void 0}function D(...e){return new Set(e)}function O(e,t){return e!==void 0&&t.has(e)}function Fn(e){return e===void 0||e.trim()===``?!1:Number.isFinite(Number(e))}function In(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 k(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;if(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.extraDaemonWriters)for(let[e,t]of Object.entries(o.extraDaemonWriters))I(i,`daemon writer`,e,t);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 Ln(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:se(e)}}function Rn(e){let t=[`Batch completed: ${e.executed}/${e.total} steps in ${e.totalDurationMs}ms`];for(let n of e.results)t.push(Bn(n));return{data:e,text:t.join(`
2
+ `)}}const zn={batch:z(Rn)};function Bn(e){let t=se(e.data)??e.command;return`${e.step}. OK ${t} (${e.durationMs}ms)`}function Vn(e=ee){let t=Hn(e);return L({name:`batch`,description:`Run multiple structured command steps in one daemon request.`,inputSchema:Bt(t),readInput:e=>Wn(e,t)})}function Hn(e){return{steps:f(Ft({type:`array`,description:`Structured batch steps. Each step uses a command name and the same input object as that command tool.`,items:Un(e)},(t,n)=>Gn(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 Un(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 Wn(t,n){let r=Vt(t,n),i=r.maxSteps??100;if(!mt(i))throw new e(`INVALID_ARGS`,`Invalid batch maxSteps: ${String(r.maxSteps)}`);return gt(r.steps.length,i),{...r}}function Gn(t,n){if(!Array.isArray(t))throw new e(`INVALID_ARGS`,`Expected steps to be an array.`);return t.map((e,t)=>Kn(e,t+1,n))}function Kn(e,t,n){let r=_t(e,t);return an(r,[`command`,`input`,`runtime`],`Batch step ${t}`),{command:qn(r,t,n),input:ht(r,t),...Jn(r,t)}}function qn(t,n,r){if(r===ee)return c(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 Jn(e,t){let n=pt(e.runtime,t);return n===void 0?{}:{runtime:n}}const Yn=[{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:Pe,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:`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)`}],Xn=[{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`},{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`}],Zn=[{key:`platform`,names:[`--platform`],type:`enum`,enumValues:st,usageLabel:`--platform ${st.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:Ae,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`,...qe],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`}],Qn=[{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:`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`},...ye,{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)`}],$n=[...Xn,...Zn,...Yn,...Qn],er=new Map;for(let e of $n)for(let t of e.names)er.set(t,e);function tr(e){return er.get(e)}function nr(){return $n}const rr=new Set(nr().map(e=>e.key));function ir(e){let t=it(e);return vt({stateDir:e.stateDir,daemonBaseUrl:e.daemonBaseUrl,daemonAuthToken:e.daemonAuthToken,daemonTransport:e.daemonTransport,daemonServerMode:e.daemonServerMode,...nt(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,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,...Oe(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 ar(e,t){return{...ir(e),...t}}function or(e,t){let n=e.inputSchema.properties;if(!n)return{};let r={},i=t;for(let e of Object.keys(n)){if(!rr.has(e))continue;let t=i[e];sr(t)&&(r[e]=t)}return r}function sr(e){return typeof e==`boolean`||typeof e==`number`||typeof e==`string`}function cr(e){return t=>T(l.batch,[],{...t,batchSteps:lr(t.steps,e),batchOnError:t.onError,batchMaxSteps:t.maxSteps})}function lr(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)=>ur(e,t+1,n))}function ur(e,t,n){let r=_t(e,t),i=dr(r,t),a=ht(r,t),o=pt(r.runtime,t),s=n(i,a,t);return{command:s.command,positionals:s.positionals,...s.input?{input:s.input}:{},flags:ar(s.options,s.metadataFlags),runtime:o??s.options.runtime}}function dr(e,t){return c(e.command,t)}const fr=Vn(),pr=F({name:`batch`,clientSurface:!1,commands:[P({name:`batch`,metadata:fr,definition:R(fr,(e,t)=>e.batch.run(mr(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)=>({...E(t),steps:t.batchSteps??[],onError:t.batchOnError,maxSteps:t.batchMaxSteps,out:t.out}),cliOutputFormatter:zn.batch})]});function mr(e){return{...x(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:Bt(n),readInput:e=>Vt(e,n)})}const hr=`alert`,gr=H(hr,`Inspect or handle platform alerts.`,{action:_(ve),timeoutMs:h()}),_r=P({name:hr,metadata:gr,definition:R(gr,(e,t)=>e.command.alert(t)),cliSchema:{usageOverride:`alert [get|accept|dismiss|wait] [timeout]`,positionalArgs:[`action?`,`timeout?`]},cliReader:(e,t)=>({...E(t),...yr(e)}),daemonWriter:w(l.alert,e=>vr(e)),cliOutputFormatter:B});function vr(e){return[e.action??`get`,...j(e.timeoutMs)]}function yr(t){if(t.length>2)throw new e(`INVALID_ARGS`,`alert accepts at most action and timeout arguments.`);return S({action:br(t[0]),timeoutMs:In(t[1],`alert timeout`)})}function br(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 xr=U(`snapshotInteractiveOnly`,`snapshotDepth`,`snapshotScope`,`snapshotRaw`),W=U(`snapshotDepth`,`snapshotScope`,`snapshotRaw`),Sr=U(`metroProjectRoot`,`kind`,`metroKind`,`metroPublicBaseUrl`,`metroProxyBaseUrl`,`metroBearerToken`,`metroPreparePort`,`metroListenHost`,`metroStatusHost`,`metroStartupTimeoutMs`,`metroProbeTimeoutMs`,`metroRuntimeFile`,`metroNoReuseExisting`,`metroNoInstallDeps`),Cr=U(`metroHost`,`metroPort`,`bundleUrl`),wr=U(`count`,`intervalMs`,`holdMs`,`jitterPx`,`doubleTap`),Tr=U(`settle`,`settleQuietMs`,`timeoutMs`),Er=U(`replayUpdate`,`replayEnv`),Dr=U(`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`),Or=new Set([`json`,`config`,`help`,`version`,`verbose`,`cost`,`responseLevel`]),kr=`diff`,Ar=H(kr,`Diff accessibility snapshots.`,{kind:f(v({type:`string`,const:`snapshot`})),out:p(),interactiveOnly:g(),depth:h(),scope:p(),raw:g()}),jr=P({name:kr,metadata:Ar,definition:R(Ar,(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:[...xr,`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{...E(n),kind:`snapshot`,out:n.out,interactiveOnly:n.snapshotInteractiveOnly,depth:n.snapshotDepth,scope:n.snapshotScope,raw:n.snapshotRaw}},daemonWriter:w(l.diff,e=>[N(e.kind,`diff requires kind`)])}),Mr=`screenshot`,Nr=H(Mr,`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:_(Ae)}),Pr=P({name:Mr,metadata:Nr,definition:R(Nr,(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:_e},cliReader:(e,t)=>({...E(t),path:e[0]??t.out,...Qe(t)}),daemonWriter:e=>T(l.screenshot,A(e.path),{...e,...Oe(e)})}),Fr=`settings`,Ir=H(Fr,`Change OS settings and app permissions.`,{setting:f(p()),state:f(p()),app:p(),latitude:m(),longitude:m(),permission:p(),mode:_([`full`,`limited`])}),Lr=P({name:Fr,metadata:Ir,definition:R(Ir,(e,t)=>e.settings.update(t)),cliSchema:{usageOverride:ce,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)=>Rr(e,t),daemonWriter:w(l.settings,e=>zr(e))});function Rr(t,n){let r=yn(n),i=t[0],a=t[1];if(O(i,Hr)&&O(a,Ur))return{...r,setting:i,state:a};if(i===`location`&&a===`set`)return{...r,setting:i,state:a,latitude:ge(t[2],`latitude`),longitude:ge(t[3],`longitude`)};if(i===`appearance`&&O(a,Wr)||O(i,Gr)&&O(a,Kr)||i===`fingerprint`&&O(a,qr))return{...r,setting:i,state:a};if(i===`permission`&&O(a,Jr))return{...r,setting:i,state:a,permission:Br(t[2]),mode:Vr(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 zr(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 Br(t){if(O(t,Yr))return t;throw new e(`INVALID_ARGS`,`settings permission requires a permission target.`)}function Vr(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 Hr=D(`wifi`,`airplane`,`location`,`animations`),Ur=D(`on`,`off`),Wr=D(`light`,`dark`,`toggle`),Gr=D(`faceid`,`touchid`),Kr=D(`match`,`nonmatch`,`enroll`,`unenroll`),qr=D(`match`,`nonmatch`),Jr=D(`grant`,`deny`,`reset`),Yr=D(`camera`,`microphone`,`photos`,`contacts`,`contacts-limited`,`notifications`,`calendar`,`location`,`location-always`,`media-library`,`motion`,`reminders`,`siri`,`accessibility`,`screen-recording`,`input-monitoring`);function Xr(e){if(!Array.isArray(e)||e.length===0)return e;let t=ut(e);return e.map(e=>{let n=Zr(e,t,e=>e.label),r=Zr(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 Zr(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 Qr(e){let t=ot(e.raw||!Array.isArray(e.result.nodes)?e.result:{...e.result,nodes:Xr(e.result.nodes)});return{data:t,jsonData:ei(t),stderr:e.result.snapshotDiagnostics?.warning?`${e.result.snapshotDiagnostics.warning}\n`:void 0,text:ae(t,{raw:e.raw,flatten:e.interactiveOnly,scoped:typeof e.scope==`string`&&e.scope.trim().length>0,depthLimited:typeof e.depth==`number`})}}const $r={snapshot:({input:e,result:t})=>Qr({result:t,raw:e.raw,interactiveOnly:e.interactiveOnly,scope:e.scope,depth:e.depth}),wait:B,alert:B};function ei(e){let{unchanged:t,...n}=e;return n}const ti=`snapshot`,ni=H(ti,`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.`)}),ri=P({name:ti,metadata:ni,definition:R(ni,(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`,...xr,`snapshotForceFull`,`timeoutMs`,`record`]},cliReader:(e,t)=>({...E(t),...vn(t),interactiveOnly:t.snapshotInteractiveOnly,depth:t.snapshotDepth,scope:t.snapshotScope,raw:t.snapshotRaw,forceFull:t.snapshotForceFull,timeoutMs:t.timeoutMs}),daemonWriter:w(l.snapshot),cliOutputFormatter:$r.snapshot}),ii=[`duration`,`text`,`ref`,`selector`,`stable`],ai=`wait`,oi=H(ai,`Wait for duration, text, ref, selector, or stable UI.`,{kind:_(ii),durationMs:h(),text:p(),ref:p(),selector:p(),stable:g(),quietMs:h(),timeoutMs:h(),depth:h(),scope:p(),raw:g()}),si=P({name:ai,metadata:oi,definition:R(oi,(e,t)=>e.command.wait(ci(t))),cliSchema:{usageOverride:`wait <ms>|text <text>|@ref|<selector>|stable [quietMs] [timeoutMs]`,positionalArgs:[`durationOrSelector`,`timeoutMs?`],allowsExtraPositionals:!0,allowedFlags:[...W]},cliReader:(e,t)=>li(e,t),daemonWriter:w(l.wait,e=>ui(e)),cliOutputFormatter:B});function ci(e){$t(e,`kind`,ii);let t={...e};return delete t.kind,t}function li(t,n){let r=o(t);if(!r)throw new e(`INVALID_ARGS`,`wait requires <ms>, text <text>, @ref, <selector> [timeoutMs], or stable [quietMs] [timeoutMs].`);let i={...yn(n),...xn(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,...di(r.timeoutMs)}}return r.kind===`ref`?{...i,ref:r.rawRef,...di(r.timeoutMs)}:r.kind===`stable`?{...i,stable:!0,...fi(r.quietMs),...di(r.timeoutMs)}:{...i,selector:r.selectorExpression,...di(r.timeoutMs)}}function ui(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(!i(r))throw new e(`INVALID_ARGS`,`Invalid wait selector: ${r}`);return[r,...n]}function di(e){return e===null?{}:{timeoutMs:e}}function fi(e){return e===null?{}:{quietMs:e}}const pi=F({name:`capture`,commands:[ri,Pr,jr,si,_r,Lr]});function mi(e){let t=[e.outPath,e.message];t.push(...gi(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 hi={debug:z(mi)};function gi(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 _i=`debug`,vi=H(_i,`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.`)}),yi=F({name:`debugging`,commands:[P({name:_i,metadata:vi,definition:R(vi,(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)=>({...E(t),action:bi(e[0]),artifact:t.artifact,dsym:t.dsym,searchPath:t.searchPath,out:t.out}),cliOutputFormatter:hi.debug})]});function bi(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 xi=[`click`,`focus`,`exists`,`getText`,`getAttrs`,`wait`,`fill`,`type`],Si={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.`},Ci=()=>g(`Capture cheap post-action evidence (AX digest, node counts, changedFromBefore) instead of a follow-up snapshot.`),wi=()=>({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 Ti(e){return{...s(e)?{verify:Ci()}:{},...te(e)?wi():{}}}const Ei={target:f(It()),button:_(he,`Pointer button for platforms that support mouse buttons.`),...y(),...zt(),...Ti(`click`)},Di={target:f(It()),...y(),...zt(),...Ti(`press`)},Oi={target:f(It()),text:f(p(`Text to enter into the target.`)),delayMs:h(`Delay between typed characters.`,{min:0}),...y(),...Ti(`fill`)},ki={target:f(It()),durationMs:h(`Long press duration in milliseconds.`,{min:0}),...y(),...Ti(`longpress`)},Ai={from:f(Rt(`Swipe start point.`)),to:f(Rt(`Swipe end point.`)),count:h(`Number of swipe repetitions.`,{min:1,max:200}),pauseMs:h(`Pause between repeated swipes.`,{min:0,max:Ee}),pattern:_(et)},ji={x:f(m(`X coordinate.`)),y:f(m(`Y coordinate.`))},Mi={text:f(p(`Text to type.`)),delayMs:h(`Delay between typed characters.`,{min:0})},Ni={direction:f(_(tt)),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:at})},Pi=()=>({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.`)}),Fi={format:f(_([`text`,`attrs`])),target:f(Lt()),...y(),...Pi()},Ii={predicate:f(_([`visible`,`hidden`,`exists`,`editable`,`selected`,`focused`,`text`])),selector:f(p()),value:p(),...y(),...Pi()},Li={locator:_(a),query:f(p()),action:_(xi),value:p(),timeoutMs:h(),first:g(),last:g(),depth:h(),raw:g(),...Pi()},Ri={kind:f(_(rt,`Gesture variant.`)),direction:_(Le,`Fling direction.`),preset:_(je,`Swipe preset.`),origin:Rt(`Gesture origin point.`),delta:Rt(`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})},zi=[L({name:`click`,description:Si.click,inputSchema:Bt(Ei),readInput:e=>Vt(e,Ei)}),L({name:`press`,description:Si.press,inputSchema:Bt(Di),readInput:e=>Vt(e,Di)}),L({name:`fill`,description:Si.fill,inputSchema:Bt(Oi),readInput:e=>Vt(e,Oi)}),G(`longpress`,ki),G(`swipe`,Ai),G(`focus`,ji),G(`type`,Mi),G(`scroll`,Ni),G(`get`,Fi),G(`is`,Ii),G(`find`,Li),L({name:`gesture`,description:Si.gesture,inputSchema:Bt(Ri),readInput:Bi})];function Bi(e){let t=Ht(e);return{...Ut(t),...me(t)}}function G(e,t){return H(e,Si[e],t)}const Vi={gesture:Ui},Hi={gesture:e=>{let t=Bi(e);return T(l.gesture,[],e,S(t))}};function Ui(e,t){return{...E(t),...Me(e,t.pointerCount)}}const K={click:(e,t)=>({...E(t),...bn(t),...Cn(t),...Sn(t),target:wn(Ne(e)),button:t.clickButton,verify:t.verify}),press:(e,t)=>({...E(t),...bn(t),...Cn(t),...Sn(t),target:wn(Ne(e)),verify:t.verify}),longpress:(e,t)=>{let n=Wi(e);return{...E(t),...bn(t),...Sn(t),target:wn(n),durationMs:n.durationMs}},swipe:(e,t)=>({...E(t),...Se(e,{count:t.count,pauseMs:t.pauseMs,pattern:t.pattern})}),focus:(e,t)=>({...E(t),x:Number(e[0]),y:Number(e[1])}),type:(e,t)=>({...E(t),text:e.join(` `),delayMs:t.delayMs}),fill:(e,t)=>{let n=Re(e);return{...E(t),...bn(t),...Sn(t),target:wn(n.target),text:n.text,delayMs:t.delayMs,verify:t.verify}},scroll:(e,t)=>({...E(t),direction:Ji(e[0]),amount:k(e[1]),pixels:t.pixels,durationMs:t.durationMs}),get:(e,t)=>({...E(t),...vn(t),...bn(t),format:jn(e[0]),target:wn(An(e.slice(1)))})},q={click:e=>T(l.click,Tn(e),{...e,clickButton:e.button}),press:w(l.press,e=>Tn(e)),longpress:w(l.longPress,e=>Gi(e)),swipe:e=>T(l.swipe,[],e,{from:e.from,to:e.to,count:e.count,pauseMs:e.pauseMs,pattern:e.pattern}),focus:w(l.focus,e=>[String(e.x),String(e.y)]),type:w(l.type,e=>Ki(e)),fill:w(l.fill,e=>qi(e)),scroll:w(l.scroll,e=>[N(e.direction,`scroll requires direction`),...j(e.amount)]),get:w(l.get,e=>[N(e.format,`get requires format`),...En(e)])};function Wi(e){let t=Yi(e);return{...Ne(t.target),...t.durationMs===void 0?{}:{durationMs:t.durationMs}}}function Gi(e){return[...Tn(e),...j(e.durationMs)]}function Ki(e){return[e.text]}function qi(e){return[...Tn(e),e.text]}function Ji(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 Yi(e){if(Fn(e[0])&&Fn(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&&Fn(t)?{target:e.slice(0,-1),durationMs:Number(t)}:{target:e}}function Xi(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)}:sa(t)}function Zi(e,t){if(!(typeof e!=`string`||e.length===0)&&typeof t==`number`)return`@${e.startsWith(`@`)?e.slice(1):e}~s${t}`}function Qi(e){let t=e,n=se(t);if(n)return{data:t,text:n};if(typeof t.text==`string`)return{data:t,text:t.text};let r=Zi(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)}:sa(t)}function $i(e){let t=e;return{data:t,text:`Passed: is ${t.predicate??`assertion`}`}}function ea(e){let t=e,n=t.ref??``,r=t.x,i=t.y;if(!n||typeof r!=`number`||typeof i!=`number`){let e=sa(t);return{data:e.data,text:na(e.text,t.settle)}}return{data:t,text:na(`Tapped @${n} (${r}, ${i})`,t.settle)}}function ta(e){let t=e,n=sa(t);return{data:n.data,text:na(n.text,t.settle)}}function na(e,t){return`${e??``}${ra(t)}`}function ra(e){if(!e||typeof e!=`object`)return``;let t=e,n=[oa(t),...ia(t.diff),...aa(t)];return t.hint&&n.push(`hint: ${t.hint}`),`\n${n.join(`
4
+ `)}`}function ia(e){let t=(e?.lines??[]).map(e=>`${e.kind===`removed`?`-`:`+`} ${e.text??``}`);return e?.truncated&&t.push(`… changed lines truncated`),t}function aa(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=Zi(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 oa(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(ea),press:z(ea),fill:z(ta),longpress:z(ta),get:({input:e,result:t})=>Xi({result:t,format:e.format}),is:z($i),find:z(Qi)};function sa(e){return V(e)}const ca={find:(e,t)=>fa(e,t),is:(e,t)=>pa(e,t)},la={is:w(l.is,e=>ua(e)),find:e=>T(l.find,da(e),{...e,findFirst:e.first,findLast:e.last})};function ua(e){return[e.predicate,e.selector,...e.predicate===`text`?[e.value]:[]]}function da(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 fa(t,n){let r={...ha(n),...yn(n),...vn(n),first:n.findFirst,last:n.findLast},i=ma(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:ga(o)};if(c===`get`){let n=t[s+1];if(n===`text`)return{...r,locator:i,query:ga(o),action:`getText`};if(n===`attrs`)return{...r,locator:i,query:ga(o),action:`getAttrs`};throw new e(`INVALID_ARGS`,`find get only supports text or attrs`)}if(c===`wait`)return{...r,locator:i,query:ga(o),action:`wait`,timeoutMs:k(t[s+1])};if(c===`fill`||c===`type`)return{...r,locator:i,query:ga(o),action:c,value:t.slice(s+1).join(` `)};if(c===`click`||c===`focus`||c===`exists`)return{...r,locator:i,query:ga(o),action:c};throw new e(`INVALID_ARGS`,`Unsupported find action: ${c}`)}function pa(t,n){let r={...xn(n),...yn(n),...vn(n)},i=lt(t),a=i[0];if(a!==`text`&&a!==`visible`&&a!==`hidden`&&a!==`exists`&&a!==`editable`&&a!==`selected`&&a!==`focused`)throw new e(`INVALID_ARGS`,dt,{hint:ft});let o=Mn(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 ma(e){if(e===`text`||e===`label`||e===`value`||e===`role`||e===`id`)return e}function ha(e){return{depth:e.snapshotDepth,raw:e.snapshotRaw}}function ga(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:[...wr,`clickButton`,..._a(`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:[...wr,..._a(`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:[..._a(`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`,..._a(`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 _a(e){let t=[];return s(e)&&t.push(`verify`),te(e)&&t.push(...Tr),t}const va=R(X(`click`),(e,t)=>e.interactions.click(ja(t))),ya=R(X(`press`),(e,t)=>e.interactions.press(Ma(t))),ba=R(X(`fill`),(e,t)=>e.interactions.fill(Na(t))),xa=R(X(`longpress`),(e,t)=>e.interactions.longPress(Pa(t))),Sa=R(X(`swipe`),(e,t)=>e.interactions.swipe(t)),Ca=R(X(`focus`),(e,t)=>e.interactions.focus(t)),wa=R(X(`type`),(e,t)=>e.interactions.type(t)),Ta=R(X(`scroll`),(e,t)=>e.interactions.scroll(t)),Ea=R(X(`get`),(e,t)=>e.interactions.get(Ia(t))),Da=R(X(`is`),(e,t)=>e.interactions.is(t)),Oa=R(X(`find`),(e,t)=>e.interactions.find(t)),ka=R(X(`gesture`),async(e,t)=>{switch(t.kind){case`pan`:return await e.interactions.pan(La(t));case`fling`:return await e.interactions.fling(Ra(t));case`swipe`:return await e.interactions.swipeGesture(za(t));case`pinch`:return await e.interactions.pinch(Ba(t));case`rotate`:return await e.interactions.rotateGesture(Va(t));case`transform`:return await e.interactions.transformGesture(Ha(t))}}),Aa=F({name:`interaction`,clientSurface:!1,commands:[P({name:`click`,metadata:X(`click`),definition:va,cliSchema:Y.click,cliReader:K.click,daemonWriter:q.click,cliOutputFormatter:J.click}),P({name:`press`,metadata:X(`press`),definition:ya,cliSchema:Y.press,cliReader:K.press,daemonWriter:q.press,cliOutputFormatter:J.press}),P({name:`fill`,metadata:X(`fill`),definition:ba,cliSchema:Y.fill,cliReader:K.fill,daemonWriter:q.fill,cliOutputFormatter:J.fill}),P({name:`longpress`,metadata:X(`longpress`),definition:xa,cliSchema:Y.longpress,cliReader:K.longpress,daemonWriter:q.longpress,cliOutputFormatter:J.longpress}),P({name:`swipe`,metadata:X(`swipe`),definition:Sa,cliSchema:Y.swipe,cliReader:K.swipe,daemonWriter:q.swipe}),P({name:`focus`,metadata:X(`focus`),definition:Ca,cliSchema:Y.focus,cliReader:K.focus,daemonWriter:q.focus}),P({name:`type`,metadata:X(`type`),definition:wa,cliSchema:Y.type,cliReader:K.type,daemonWriter:q.type}),P({name:`scroll`,metadata:X(`scroll`),definition:Ta,cliSchema:Y.scroll,cliReader:K.scroll,daemonWriter:q.scroll}),P({name:`get`,metadata:X(`get`),definition:Ea,cliSchema:Y.get,cliReader:K.get,daemonWriter:q.get,cliOutputFormatter:J.get}),P({name:`is`,metadata:X(`is`),definition:Da,cliSchema:Y.is,cliReader:ca.is,daemonWriter:la.is,cliOutputFormatter:J.is}),P({name:`find`,metadata:X(`find`),definition:Oa,cliSchema:Y.find,cliReader:ca.find,daemonWriter:la.find,cliOutputFormatter:J.find}),P({name:`gesture`,metadata:X(`gesture`),definition:ka,cliSchema:Y.gesture,cliReader:Vi.gesture,daemonWriter:Hi.gesture})]});function X(e){let t=zi.find(t=>t.name===e);if(!t)throw Error(`Missing interaction command metadata for ${e}`);return t}function ja(e){return{...x(e),...en(e.target),...rn(e),...nn(e),button:e.button,verify:e.verify,...Fa(e)}}function Ma(e){return{...x(e),...en(e.target),...rn(e),...nn(e),verify:e.verify,...Fa(e)}}function Na(e){return{...x(e),...en(e.target),...rn(e),text:e.text,delayMs:e.delayMs,verify:e.verify,...Fa(e)}}function Pa(e){return{...x(e),...en(e.target),...rn(e),durationMs:e.durationMs,...Fa(e)}}function Fa(e){return{settle:e.settle,settleQuietMs:e.settleQuietMs,timeoutMs:e.timeoutMs}}function Ia(e){return{...x(e),...tn(e.target),...rn(e),format:e.format,record:e.record}}function La(e){return{...x(e),x:e.origin.x,y:e.origin.y,dx:e.delta.x,dy:e.delta.y,pointerCount:e.pointerCount,durationMs:e.durationMs}}function Ra(e){return{...x(e),direction:e.direction,x:e.origin.x,y:e.origin.y,distance:e.distance}}function za(e){return{...x(e),preset:e.preset}}function Ba(e){return{...x(e),scale:e.scale,x:e.origin?.x,y:e.origin?.y}}function Va(e){return{...x(e),degrees:e.degrees,x:e.origin?.x,y:e.origin?.y}}function Ha(e){return{...x(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 Ua(e){return{data:{devices:e.map(ie)},text:e.map(no).join(`
5
+ `)}}function Wa(e){return{data:{device:ie(e.device),availableCommands:e.availableCommands},text:[`${no(e.device)} supports ${e.availableCommands.length} commands:`,e.availableCommands.join(` `)].join(`
6
+ `)}}function Ga(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 Ka(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(pe)};return{data:t,text:JSON.stringify(t,null,2)}}function qa(e){let t=le(e),n=[se(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 Ja(e){return V(ue(e))}function Ya(e){if(Xa(e))return{data:e,text:e.artifacts.length>0?e.artifacts.map(io).join(`
11
+ `):e.message??`No daemon artifacts available.`};let t=[e.message??`No cloud artifacts available for ${e.provider}.`],n=ao(e);return n&&t.push(`Retry: ${n}`),{data:e,text:e.cloudArtifacts.length>0?e.cloudArtifacts.map(ro).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 Xa(e){return`source`in e&&e.source===`daemon`}function Za(e){return V(de(e))}function Qa(e){return V(oe(e))}function $a(e){let t=e,n=t.platform??`unknown`;return{data:t,text:`Boot ready: ${t.device??t.id??`unknown`} (${n})`}}function eo(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 to(e){let t=e,n=[`Doctor: ${typeof t.status==`string`?t.status:`unknown`}`],r=oo(t.checks);if(Ct()){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(...re(e));return{data:t,text:n.join(`
14
+ `)}}const Z={boot:z($a),shutdown:z(eo),devices:z(Ua),capabilities:z(Wa),doctor:z(to),apps:({input:e,result:t})=>Ga({result:t,appsFilter:e.appsFilter}),session:z(Ka),artifacts:z(Ya),open:z(qa),close:z(Ja),install:z(Za),reinstall:z(Za),"install-from-source":z(Qa),prepare:B,viewport:B};function no(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 ro(e){let t=e.url?` ${e.url}`:``,n=e.availability?` ${e.availability}`:``;return`${e.kind}: ${e.name}${n}${t}`}function io(e){let t=e.artifactType?` (${e.artifactType})`:``;return`${e.filename}${t}: ${e.mimeType} ${e.sizeBytes} bytes id=${e.id}`}function ao(e){if(e.providerSessionId)return`agent-device artifacts ${e.providerSessionId} --provider ${e.provider} --json`}function oo(e){return Array.isArray(e)?e.filter(e=>!!e&&typeof e==`object`&&!Array.isArray(e)):[]}const so=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.`)}),co=P({name:`artifacts`,metadata:so,definition:R(so,(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)=>({...E(t),provider:t.provider,providerSessionId:e[0]??t.providerSessionId}),daemonWriter:w(l.artifacts),cliOutputFormatter:Z.artifacts});function lo(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 uo(e){let{metroHost:t,metroPort:n,bundleUrl:r,launchUrl:i,...a}=e,o=lo({metroHost:t,metroPort:n,bundleUrl:r,launchUrl:i});return o?{...a,runtime:o}:a}const fo=H(`apps`,`List installed apps.`,{appsFilter:_([`user-installed`,`all`])}),po=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:_(Ae),activity:p(`Android activity name.`),launchConsole:p(`Launch console mode.`),launchArgs:Pt(`Launch arguments forwarded verbatim to the platform launch command.`),relaunch:g(`Force relaunch.`),saveScript:v({oneOf:[At(),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.`)}),mo=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:[At(),d()]}),force:g(`Overwrite an existing --save-script target instead of refusing (alias: --overwrite).`)}),ho=R(fo,(e,t)=>e.apps.list(t)),go=R(po,(e,t)=>e.apps.open(_o(t)));function _o(e){return uo(e)}const vo=R(mo,(e,t)=>t.app?e.apps.close(t):e.sessions.close(jo(t))),yo={helpDescription:`List user-installed apps; use --all to include system/OEM apps`,summary:`List installed apps`,allowedFlags:[`appsFilter`],defaults:{appsFilter:bt}},bo={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`,...Cr,`launchUrl`]},xo={positionalArgs:[`app?`],allowedFlags:[`saveScript`,`force`,`shutdown`]},So=(e,t)=>({...E(t),appsFilter:yt(t.appsFilter)}),Co=(e,t)=>({...E(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}),wo=(e,t)=>({...E(t),app:e[0],shutdown:t.shutdown,saveScript:t.saveScript,force:t.force}),To=w(l.apps),Eo=w(l.open,Mo),Do=w(l.close,e=>A(e.app)),Oo=P({name:`apps`,metadata:fo,definition:ho,cliSchema:yo,cliReader:So,daemonWriter:To,cliOutputFormatter:Z.apps}),ko=P({name:`open`,metadata:po,definition:go,cliSchema:bo,cliReader:Co,daemonWriter:Eo,cliOutputFormatter:Z.open}),Ao=P({name:`close`,metadata:mo,definition:vo,cliSchema:xo,cliReader:wo,daemonWriter:Do,cliOutputFormatter:Z.close});function jo(e){let{app:t,...n}=e;return n}function Mo(e){return e.app?e.url?[e.app,e.url]:[e.app]:[]}const No=H(`devices`,`List available devices.`,{}),Po=H(`capabilities`,`List commands supported by the selected device.`,{}),Fo=H(`boot`,`Boot or prepare a selected device without using CLI positional arguments.`,{headless:g(`Boot without showing simulator UI when supported.`)}),Io=H(`shutdown`,`Shutdown a selected simulator or emulator.`,{}),Lo=R(No,(e,t)=>e.devices.list(t)),Ro=R(Po,(e,t)=>e.devices.capabilities(t)),zo=R(Fo,(e,t)=>e.devices.boot(t)),Bo=R(Io,(e,t)=>e.devices.shutdown(t)),Vo={summary:`Boot target device/simulator`,allowedFlags:[`headless`]},Ho={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.`},Uo={summary:`Shutdown target simulator/emulator`},Wo=(e,t)=>E(t),Go=(e,t)=>({...E(t),headless:t.headless}),Ko=w(l.devices),qo=w(l.capabilities),Jo=w(l.boot),Yo=w(l.shutdown),Xo=[P({name:`devices`,metadata:No,definition:Lo,cliReader:Wo,daemonWriter:Ko,cliOutputFormatter:Z.devices}),P({name:`capabilities`,metadata:Po,definition:Ro,cliSchema:Ho,cliReader:Wo,daemonWriter:qo,cliOutputFormatter:Z.capabilities}),P({name:`boot`,metadata:Fo,definition:zo,cliSchema:Vo,cliReader:Go,daemonWriter:Jo,cliOutputFormatter:Z.boot}),P({name:`shutdown`,metadata:Io,definition:Bo,cliSchema:Uo,cliReader:Wo,daemonWriter:Yo,cliOutputFormatter:Z.shutdown})],Zo=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.`)}),Qo=P({name:`doctor`,metadata:Zo,definition:R(Zo,(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)=>({...E(t),targetApp:t.targetApp,remote:t.remote}),daemonWriter:w(l.doctor),cliOutputFormatter:Z.doctor});function $o(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}=ns(t.slice(0,r),n);return ts(i,a,t.slice(r+1),`${n} artifact`)}function es(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(is(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}=ns(is(r.repo,`${n} installSource.repo`),`${n} installSource.repo`);return ts(i,a,r.artifact,`${n} installSource.artifact`)}function ts(e,t,n,r){return typeof n==`number`||os(n)?{kind:`github-actions-artifact`,owner:e,repo:t,artifactId:as(n,r)}:{kind:`github-actions-artifact`,owner:e,repo:t,artifactName:is(n,r)}}function ns(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 rs(e){return typeof e==`string`&&e.trim().length>0?e.trim():void 0}function is(t,n){let r=rs(t);if(!r)throw new e(`INVALID_ARGS`,`${n} must be a non-empty string.`);return r}function as(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 os(e){return typeof e==`string`&&/^\d+$/.test(e.trim())}const ss=H(`install`,`Install an app binary.`,{app:p(`Optional app identifier hint.`),appPath:f(p(`Path to app binary.`))}),cs=H(`reinstall`,`Reinstall an app binary.`,{app:f(p()),appPath:f(p(`Path to app binary.`))}),ls=H(`install-from-source`,`Install an app from a structured source.`,{source:f(v(Mt(`Install source object.`))),retainPaths:g(),retentionMs:h()}),us=R(ss,(e,t)=>e.apps.install(t)),ds=R(cs,(e,t)=>e.apps.reinstall(t)),fs=R(ls,(e,t)=>e.apps.installFromSource(t)),ps={usageOverride:`install <path> | install <app> <path>`,listUsageOverride:`install <path>`,positionalArgs:[`appOrPath`,`path?`]},ms={positionalArgs:[`app`,`path`]},hs={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)=>Ss(e,t),_s=(e,t)=>Cs(e,t),vs=(e,t)=>({...E(t),source:Es(e,t),retainPaths:t.retainPaths,retentionMs:t.retentionMs}),ys=w(l.install,e=>ws(e.app,e.appPath)),bs=w(l.reinstall,e=>Ts(e.app,e.appPath)),xs=[P({name:`install`,metadata:ss,definition:us,cliSchema:ps,cliReader:gs,daemonWriter:ys,cliOutputFormatter:Z.install}),P({name:`reinstall`,metadata:cs,definition:ds,cliSchema:ms,cliReader:_s,daemonWriter:bs,cliOutputFormatter:Z.reinstall}),P({name:`install-from-source`,metadata:ls,definition:fs,cliSchema:hs,cliReader:vs,daemonWriter:e=>T(He.installSource,[],{...e,installSource:e.source,retainMaterializedPaths:e.retainPaths,materializedPathRetentionMs:e.retentionMs}),cliOutputFormatter:Z[`install-from-source`]})];function Ss(e,t){let[n,r]=e,i=r!==void 0;return{...E(t),...i?{app:M(n,`install requires app`)}:{},appPath:M(i?r:n,`install requires path`)}}function Cs(e,t){return{...E(t),app:M(e[0],`reinstall requires app`),appPath:M(e[1],`reinstall requires path`)}}function ws(e,t){let n=N(t,`missing app path`);return typeof e==`string`&&e.length>0?[e,n]:[n]}function Ts(e,t){return[N(e,`missing first positional`),N(t,`missing second positional`)]}function Es(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?$o(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:Ds(n.header)}}function Ds(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 Os=H(`prepare`,`Prepare platform helper infrastructure.`,{action:f(_([`ios-runner`])),timeoutMs:h(`Maximum wall-clock time for the prepare command.`)}),ks=P({name:`prepare`,metadata:Os,definition:R(Os,(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)=>({...E(t),action:M(e[0],`prepare requires subcommand`),timeoutMs:t.timeoutMs}),daemonWriter:w(l.prepare,e=>[N(e.action,`prepare requires subcommand`)]),cliOutputFormatter:Z.prepare}),As=H(`push`,`Deliver a push payload.`,{app:f(p()),payload:f(v({oneOf:[d(),Mt()]}))}),js=H(`trigger-app-event`,`Trigger an app-defined event.`,{event:f(p()),payload:Us()}),Ms=R(As,(e,t)=>e.apps.push(t)),Ns=R(js,(e,t)=>e.apps.triggerEvent(t)),Ps={listUsageOverride:`push`,helpDescription:`Deliver push notification payloads to an installed app.`,summary:`Deliver push notification payloads to an installed app`,positionalArgs:[`bundleOrPackage`,`payloadOrJson`]},Fs={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?`]},Is=(e,t)=>({...E(t),app:M(e[0],`push requires bundleOrPackage`),payload:M(e[1],`push requires payloadOrJson`)}),Ls=(e,t)=>({...E(t),event:M(e[0],`trigger-app-event requires event`),payload:e[1]?Nn(e[1],`trigger-app-event payload`):void 0}),Rs=w(l.push,e=>Vs(e)),zs=w(l.triggerAppEvent,e=>Hs(e)),Bs=[P({name:`push`,metadata:As,definition:Ms,cliSchema:Ps,cliReader:Is,daemonWriter:Rs}),P({name:`trigger-app-event`,metadata:js,definition:Ns,cliSchema:Fs,cliReader:Ls,daemonWriter:zs})];function Vs(e){return[e.app,typeof e.payload==`string`?e.payload:JSON.stringify(e.payload)]}function Hs(e){return[e.event,...e.payload?[JSON.stringify(e.payload)]:[]]}function Us(){return Nt()}const Ws=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.`)}),Gs=P({name:`session`,metadata:Ws,definition:R(Ws,async(e,{action:t,path:n,force:r,...i})=>{let a=t??`list`;return qs(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)=>({...E(t),action:Ks(e[0]),path:e[1],force:t.force}),cliOutputFormatter:Z.session});function Ks(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 qs(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 Js=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}))}),Ys=P({name:`viewport`,metadata:Js,definition:R(Js,(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)=>({...E(t),width:Ge(e[0],`width`),height:Ge(e[1],`height`)}),daemonWriter:w(l.viewport,e=>{let{width:t,height:n}=e;return[String(t),String(n)]}),cliOutputFormatter:Z.viewport}),Xs=F({name:`management`,commands:[...Xo,co,Qo,ks,Oo,Gs,ko,Ao,Ys,...xs,...Bs]});function Zs(e){return{data:e.result,text:e.action===`reload`?`Reloaded React Native apps via ${e.result.reloadUrl}`:JSON.stringify(e.result,null,2)}}const Qs={metro:({input:e,result:t})=>Zs({result:t,action:e.action})},$s=[`auto`,`react-native`,`expo`,`repack`];function ec(t){if(t!==void 0){if($s.includes(t))return t;throw new e(`INVALID_ARGS`,`metro prepare --kind must be auto, react-native, expo, or repack`)}}const tc=`metro`,nc=H(tc,`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()}),rc=F({name:`metro`,commands:[P({name:tc,metadata:nc,definition:R(nc,async(e,t)=>t.action===`prepare`?await e.metro.prepare(ic(t)):await e.metro.reload(oc(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:[...Cr,...Sr]},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:ec(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:Qs.metro})]});function ic(e){return{projectRoot:e.projectRoot,kind:e.kind,publicBaseUrl:e.publicBaseUrl,proxyBaseUrl:e.proxyBaseUrl,bearerToken:e.bearerToken,bridgeScope:e.bridgeScope??ac(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 ac(e){return e.tenant&&e.runId&&e.leaseId?{tenantId:e.tenant,runId:e.runId,leaseId:e.leaseId}:void 0}function oc(e){return{metroHost:e.metroHost,metroPort:e.metroPort,bundleUrl:e.bundleUrl,timeoutMs:e.timeoutMs}}const sc=[`started`,`stopped`,`marked`,`cleared`,`restarted`,`removedRotatedFiles`];function cc(e){return{data:e,text:e.path,stderr:Ic([Pc(e,[`active`,`state`,`backend`,`sizeBytes`]),Ec(e),e.hint,Fc(e.notes)])}}function lc(e){let t=e.events??[];return{data:e,text:t.length>0?pc(t):`No session events found.`,stderr:Ic([Pc(e,[`path`,`cursor`,`nextCursor`,`limit`])])}}function uc(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(...jc(e));return{data:e,text:t.join(`
16
+ `),stderr:Ic([Pc(e,[`active`,`state`,`backend`,`include`,`scannedLines`,`matchedLines`]),Fc(e.notes)])}}function dc(e){return{data:e,text:[`Audio probe: ${String(e.state??`stopped`)} heard=${String(e.heard===!0)}`,Tc(`rmsDbfs`,e.rmsDbfs),Tc(`peakDbfs`,e.peakDbfs)].filter(e=>!!e).join(`
17
+ `),stderr:Ic([Pc(e,[`active`,`backend`,`source`,`durationMs`,`elapsedMs`,`bucketMs`,`sampleCount`,`sourceCount`,`mediaElementCount`]),Fc(e.notes)])}}const fc={logs:z(cc),events:z(lc),network:z(uc),audio:z(dc)};function pc(e){let t=e.map(mc),n=Math.min(Math.max(...t.map(e=>e.label.length),5),32);return t.map(e=>hc(e,n)).join(`
18
+ `)}function mc(e){return{timestamp:gc(e.ts),label:_c(e),summary:vc(e)}}function hc(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 gc(e){return e?e.replace(`T`,` `):``}function _c(e){let t=e.command??`command`;switch(e.kind){case`request.started`:return`start ${t}`;case`request.finished`:return Oc([e.status===`error`?`error`:`ok`,t,wc(Ac(e.details?.durationMs))]);case`action.recorded`:return`action ${t}`;default:return Oc([e.kind??`event`,e.command])}}function vc(e){let t=yc(e.summary,e);return`${t}${bc(e,t)}`.trim()}function yc(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 bc(e,t){if(e.kind!==`action.recorded`)return``;let n=e.details;if(!n)return``;let r=[xc(n,t),Cc(Ac(n.textLength))].filter(e=>!!e);return r.length>0?` (${r.join(`, `)})`:``}function xc(e,t){let n=kc(e.ref)??kc(e.selector)??Sc(e);if(!(!n||t.includes(n)))return`target=${n}`}function Sc(e){let t=Ac(e.x),n=Ac(e.y);return t===void 0||n===void 0?void 0:`(${t}, ${n})`}function Cc(e){return e===void 0?void 0:`text=${e} chars`}function wc(e){return e===void 0?void 0:`${Math.round(e)}ms`}function Tc(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 Ec(e){return sc.map(t=>Dc(t,e[t])).filter(Boolean).join(` `)||void 0}function Dc(e,t){return t==null?``:`${e}=${t}`}function Oc(e){return e.filter(e=>!!e).join(` `)}function kc(e){return typeof e==`string`&&e.trim().length>0?e:void 0}function Ac(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}function jc(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?Nc(i,`headers`,e.headers):(Mc(i,`request headers`,e.requestHeaders),Mc(i,`response headers`,e.responseHeaders)),Nc(i,`request`,e.requestBody),Nc(i,`response`,e.responseBody),i}function Mc(e,t,n){!n||Object.keys(n).length===0||e.push(` ${t}: ${JSON.stringify(n)}`)}function Nc(e,t,n){n!==void 0&&e.push(` ${t}: ${n}`)}function Pc(e,t){return t.map(t=>e[t]!==void 0&&e[t]!==null?`${t}=${e[t]}`:``).filter(Boolean).join(` `)||void 0}function Fc(e){let t=e?.filter(e=>e.length>0)??[];return t.length>0?t.join(`
19
+ `):void 0}function Ic(e){return e.filter(e=>!!e).join(`
20
+ `)||void 0}const Lc=`logs`,Rc=`events`,zc=`network`,Bc=`audio`,Vc=[`dump`,`log`],Hc=[`probe`],Uc=[`start`,`status`,`stop`],Wc=H(Lc,`Manage session app logs.`,{action:_(ke),message:p(),restart:g()}),Gc=H(Rc,`Read the session event timeline.`,{limit:h(),cursor:p()}),Kc=H(zc,`Show recent HTTP traffic.`,{action:_(Vc),limit:h(),include:_(n)}),qc=H(Bc,`Probe audio levels.`,{action:_(Hc),probeAction:_(Uc),durationMs:h(`Probe duration in milliseconds.`),bucketMs:h(`Audio level bucket size in milliseconds.`)}),Jc=R(Wc,(e,t)=>e.observability.logs(t)),Yc=R(Gc,(e,t)=>e.observability.events(t)),Xc=R(Kc,(e,t)=>e.observability.network(t)),Zc=R(qc,(e,t)=>e.observability.audio(t)),Qc=F({name:`observability`,commands:[P({name:Lc,metadata:Wc,definition:Jc,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)=>({...E(t),action:rl(e[0]),message:e.slice(1).join(` `)||void 0,restart:t.restart}),daemonWriter:w(Lc,e=>$c(e)),cliOutputFormatter:fc.logs}),P({name:Rc,metadata:Gc,definition:Yc,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)=>({...E(t),limit:e[0]?.trim()?k(e[0]):void 0,cursor:e[1]}),daemonWriter:e=>T(Rc,el(e),e),cliOutputFormatter:fc.events}),P({name:zc,metadata:Kc,definition:Xc,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)=>({...E(t),action:il(e[0]),limit:k(e[1]),include:t.networkInclude??al(e[2])}),daemonWriter:e=>T(zc,tl(e),{...e,networkInclude:e.include}),cliOutputFormatter:fc.network}),P({name:Bc,metadata:qc,definition:Zc,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)=>({...E(t),action:ol(e[0]),probeAction:sl(e[1]),durationMs:cl(e[2]),bucketMs:k(e[3])}),daemonWriter:e=>T(Bc,nl(e),e),cliOutputFormatter:fc.audio})]});function $c(e){return[e.action??`path`,...A(e.message)]}function el(e){return e.cursor===void 0?j(e.limit):[e.limit===void 0?``:String(e.limit),e.cursor]}function tl(e){return[...e.action?[e.action]:[],...j(e.limit)]}function nl(e){return[e.action??`probe`,e.probeAction??`status`,...j(e.durationMs),...j(e.bucketMs)]}function rl(e){if(e!==void 0)return ze(ke,e,{message:`logs requires path, start, stop, doctor, mark, or clear`})}function il(t){if(t!==void 0){if(t===`dump`||t===`log`)return t;throw new e(`INVALID_ARGS`,`network requires dump or log`)}}function al(e){if(e!==void 0)return ze(n,e,{message:`network include must be summary, headers, body, or all`})}function ol(e){if(e!==void 0)return ze(Hc,e,{message:`audio requires probe`})}function sl(e){if(e!==void 0)return ze(Uc,e,{message:`audio probe requires start, status, or stop`})}function cl(e){let t=k(e);return t===void 0?void 0:Math.round(t*1e3)}function ll(e){let t=e;return{data:t,text:dl(t)}}const ul={perf:z(ll)};function dl(e){let t=hl(e);if(t)return t;let n=u(e.artifact)?e.artifact:void 0;return n?ml(n):fl(u(e.metrics)?e.metrics:void 0)}function fl(e){let t=u(e?.fps)?e.fps:void 0,n=Ml(e);if(!t)return Tl(n,`missing frame metric`);if(t.available===!1)return Tl(n,El(t));let r=Dl(t);return r?pl(t,r):Tl(n,`missing dropped-frame summary`)}function pl(e,t){let n=[`Frame health: ${t}`],r=Al(e);return r.length>0&&n.push(`Worst windows:`,...r),n.join(`
21
+ `)}function ml(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?``:` (${Rl(r)})`;return n?`Memory artifact (${t}): ${n}${i}`:`Memory artifact (${t}): captured${i}`}function hl(e){return e.kind===`xctrace`?gl(e):yl(e)}function gl(e){let t=typeof e.perf==`string`?e.perf:void 0,n=_l(e);if(!(!t||!n||e.kind!==`xctrace`))return vl(n,typeof e.mode==`string`?e.mode:`capture`,t,e.template)}function _l(e){return typeof e.outPath==`string`?e.outPath:typeof e.reportPath==`string`?e.reportPath:void 0}function vl(e,t,n,r){let i=[e,`Perf ${t}: ${n}`];return typeof r==`string`&&i.push(`Template: ${r}`),i.join(`
22
+ `)}function yl(e){let t=bl(e);if(t)return`Perf ${t.action}: ${t.kind} ${t.type}${xl(e)}${Sl(e)}${wl(e)}`}function bl(e){let t=Cl(e.action),n=Cl(e.kind),r=Cl(e.type);return t&&n&&r?{action:t,kind:n,type:r}:void 0}function xl(e){let t=Cl(e.state);return t?` state=${t}`:``}function Sl(e){let t=Cl(e.outPath);if(!t)return``;let n=Q(e.sizeBytes);return`\n${t}${n===void 0?``:` (${Rl(n)})`}`}function Cl(e){return typeof e==`string`?e:void 0}function wl(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 ${Fl(r)} (${Math.round(i)}/${Math.round(a)} frames)`}function Tl(e,t){return e?`Performance: ${e}`:`Frame health: unavailable - ${t}`}function El(e){return typeof e.reason==`string`&&e.reason.length>0?e.reason:`not available`}function Dl(e){let t=Q(e.droppedFramePercent),n=Q(e.droppedFrameCount);if(!(t===void 0||n===void 0))return[`dropped ${Fl(t)}`,Ol(n,Q(e.totalFrameCount)),kl(Q(e.sampleWindowMs))].filter(Boolean).join(` `)}function Ol(e,t){return t===void 0?`(${Math.round(e)} dropped frames)`:`(${Math.round(e)}/${Math.round(t)} frames)`}function kl(e){return e===void 0?``:`window ${Il(e)}`}function Al(e){return Array.isArray(e.worstWindows)?e.worstWindows.flatMap(e=>{if(!u(e))return[];let t=jl(e);return t?[t]:[]}):[]}function jl(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 ${Il(i)}`;return`- +${Il(t)}-+${Il(n)}: ${Math.round(r)} missed-deadline frames${a}`}function Ml(e){let t=u(e?.cpu)?e.cpu:void 0,n=u(e?.memory)?e.memory:void 0,r=[Nl(t),Pl(n)].filter(e=>!!e);return r.length>0?r.join(`, `):void 0}function Nl(e){if(e?.available!==!0)return;let t=Q(e.usagePercent);return t===void 0?void 0:`CPU ${Fl(t)}`}function Pl(e){if(e?.available!==!0)return;let t=Q(e.residentMemoryKb)??Q(e.totalPssKb)??Q(e.totalRssKb);return t===void 0?void 0:`memory ${Ll(t)}`}function Q(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}function Fl(e){return`${Number.isInteger(e)?e:e.toFixed(1)}%`}function Il(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 Ll(e){let t=e/1024;return`${t>=10?Math.round(t):t.toFixed(1)}MB`}function Rl(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 zl=`perf`,Bl=H(zl,`Show session performance, frame health, and memory diagnostics.`,{area:_(Ze),subject:_(We),action:_(ne),kind:_(qe),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.`)}),Vl=F({name:`perf`,commands:[P({name:zl,metadata:Bl,definition:R(Bl,(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)=>({...E(t),...Wl(e,{kind:Yl(t.kind),template:t.perfTemplate,out:t.out})}),daemonWriter:w(zl,e=>Hl(e)),cliOutputFormatter:ul.perf})]});function Hl(e){let t=e.area??(e.action?`metrics`:void 0);return t===`cpu`?Ul([...A(t),...A(e.subject),...A(e.action),...A(e.kind)],e):t===`trace`?Ul([...A(t),...A(e.action),...A(e.kind)],e):[...A(t),...A(e.action)]}function Ul(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 Wl(e,t={}){if(e[0]!==void 0&&e[1]===void 0){let n=Kl(e[0],{allowUndefined:!0});if(n)return{action:n,kind:Jl(t.kind),out:t.out}}let n=Gl(e[0]);return n===`cpu`?{area:n,subject:ql(e[1]),action:Kl(e[2]),kind:Jl(t.kind),template:t.template,out:t.out}:n===`trace`?{area:n,action:Kl(e[1]),kind:Jl(t.kind),template:t.template,out:t.out}:{area:n,action:Kl(e[1]),kind:Jl(t.kind),out:t.out}}function Gl(t){if(t===void 0)return;let n=t.toLowerCase();if(we(n))return n;throw new e(`INVALID_ARGS`,De)}function Kl(t,n={}){if(t===void 0)return;let r=t.toLowerCase();if(Ye(r))return r;if(!n.allowUndefined)throw new e(`INVALID_ARGS`,fe)}function ql(t){let n=t?.toLowerCase();if(n!==void 0&&Te(n))return n;throw new e(`INVALID_ARGS`,xe)}function Jl(t){if(t===void 0)return;let n=t.toLowerCase();if(Ie(n))return n;throw new e(`INVALID_ARGS`,Ve)}function Yl(e){return typeof e==`string`?Jl(e):void 0}const Xl=`react-native`,Zl=H(Xl,`Run supported React Native app automation helpers.`,{action:f(_([`dismiss-overlay`]))}),Ql=F({name:`react-native`,commands:[P({name:Xl,metadata:Zl,definition:R(Zl,(e,t)=>e.command.reactNative(t)),cliSchema:{usageOverride:`react-native dismiss-overlay`,listUsageOverride:`react-native dismiss-overlay`,positionalArgs:[`dismiss-overlay`]},cliReader:(e,t)=>({...E(t),action:$l(e[0])}),daemonWriter:w(Xl,e=>[N(e.action,`react-native requires action`)])})]});function $l(t){if(t===`dismiss-overlay`)return t;throw new e(`INVALID_ARGS`,`react-native supports only: dismiss-overlay`)}function eu(e){let t=e,n=typeof t.outPath==`string`?t.outPath:``,r=ru(t);if(r.length<=1)return{data:t,text:nu(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 tu={record:z(eu)};function nu(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 ru(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 iu=`record`,au=`trace`,ou=[`start`,`stop`],su=H(iu,`Start or stop screen recording.`,{action:f(_(ou)),path:p(),fps:h(),maxSize:h(),quality:_($e),hideTouches:g(),recordingScope:_(Pe)}),cu=H(au,`Start or stop trace capture.`,{action:f(_(ou)),path:p()}),lu=R(su,(e,t)=>e.recording.record(t)),uu=R(cu,(e,t)=>e.recording.trace(t)),du={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`]},fu={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?`]},pu=(e,t)=>({...E(t),action:yu(e[0],iu),path:e[1],fps:t.fps,maxSize:t.screenshotMaxSize,quality:t.quality,hideTouches:t.hideTouches,recordingScope:t.recordingScope}),mu=(e,t)=>({...E(t),action:yu(e[0],au),path:e[1]}),hu=w(iu,e=>vu(e)),gu=w(au,e=>vu(e)),_u=F({name:`recording`,commands:[P({name:iu,metadata:su,definition:lu,cliSchema:du,cliReader:pu,daemonWriter:hu,cliOutputFormatter:tu.record}),P({name:au,metadata:cu,definition:uu,cliSchema:fu,cliReader:mu,daemonWriter:gu})]});function vu(e){return[e.action,...A(e.path)]}function yu(t,n){if(t===`start`||t===`stop`)return t;throw new e(`INVALID_ARGS`,`${n} requires start|stop`)}const bu=`replay`,xu=`test`,Su=`Replay a recorded session.`,Cu=H(bu,Su,{path:f(p()),update:g(),backend:p(),maestro:g(),env:Pt(),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:[At(),d()]}),force:g()}),wu=H(xu,`Run one or more replay scripts.`,{paths:f(Pt()),update:g(),backend:p(),maestro:g(),env:Pt(),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()}),Tu=R(Cu,(e,t)=>e.replay.run(uo(t))),Eu=R(wu,(e,t)=>e.replay.test(uo(t))),Du={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:Su,positionalArgs:[`path`],allowsExtraPositionals:!0,allowedFlags:[`replayMaestro`,`replayExportFormat`,...Er,...Cr,`replayFrom`,`replayPlanDigest`,`timeoutMs`,`out`,`saveScript`,`force`]},Ou={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`,...Er,...Cr,`failFast`,`timeoutMs`,`retries`,`recordVideo`,`artifactsDir`,`reporter`,`reportJunit`,`shardAll`,`shardSplit`]},ku=F({name:`replay`,commands:[P({name:bu,metadata:Cu,definition:Tu,cliSchema:Du,cliReader:(e,t)=>({...E(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=>T(bu,[N(e.path,`replay requires path`)],{...e,replayUpdate:e.update,replayBackend:Au(e),replayEnv:e.env,replayShellEnv:Mu(process.env),replayFrom:e.resumeFrom,replayPlanDigest:e.resumePlanDigest,saveScript:e.saveScript})}),P({name:xu,metadata:wu,definition:Eu,cliSchema:Ou,cliReader:(e,t)=>({...E(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=>T(xu,e.paths??[],{...ju(e),replayUpdate:e.update,replayBackend:Au(e),replayEnv:e.env,replayShellEnv:Mu(process.env)})})]});function Au(e){return e.backend??(e.maestro===!0?`maestro`:void 0)}function ju(e){let t={...e};return delete t.reporter,delete t.reportJunit,t}function Mu(e){let t={};for(let[n,r]of Object.entries(e))typeof r==`string`&&n.startsWith(`AD_VAR_`)&&(t[n]=r);return t}const Nu=[`in-app`,`system`];function Pu(e){return e}const Fu={back:Pu({clientMethod:`back`,outputSchema:{type:`object`,properties:{action:{type:`string`,const:`back`},mode:{type:`string`,enum:Nu},message:{type:`string`}},required:[`action`,`mode`,`message`]}}),home:Pu({clientMethod:`home`,outputSchema:{type:`object`,properties:{action:{type:`string`,const:`home`},message:{type:`string`}},required:[`action`,`message`]}}),orientation:Pu({clientMethod:`orientation`,outputSchema:{type:`object`,properties:{action:{type:`string`,const:`orientation`},orientation:{type:`string`,enum:Je},message:{type:`string`}},required:[`action`,`orientation`,`message`]}}),"app-switcher":Pu({clientMethod:`appSwitcher`,outputSchema:{type:`object`,properties:{action:{type:`string`,const:`app-switcher`},message:{type:`string`}},required:[`action`,`message`]}}),"tv-remote":Pu({clientMethod:`tvRemote`,outputSchema:{type:`object`,properties:{action:{type:`string`,const:`tv-remote`},button:{type:`string`,enum:Xe},durationMs:{type:`number`},message:{type:`string`}},required:[`action`,`button`,`message`]}})};function Iu(e){return{data:e,text:zu(e)}}function Lu(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: ${Bu(e.visible,e.inputOwner)}`),{data:e,text:t.join(`
36
+ `)}}return V(e)}function Ru(e){return e.action===`read`?{data:e,text:e.text}:V(e)}const $={appstate:z(Iu),back:B,home:B,orientation:B,"app-switcher":B,keyboard:z(Lu),clipboard:z(Ru),"tv-remote":B};function zu(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 Bu(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 Vu=`appstate`,Hu=`back`,Uu=`home`,Wu=`orientation`,Gu=`app-switcher`,Ku=`keyboard`,qu=`clipboard`,Ju=`tv-remote`,Yu=[`read`,`write`],Xu=[`status`,`dismiss`],Zu=H(Vu,`Show foreground app or activity.`,{}),Qu=H(Hu,`Navigate back.`,{mode:_(Nu)}),$u=H(Uu,`Go to the home screen.`,{}),ed=H(Wu,`Set device orientation.`,{orientation:f(_(Je))}),td=H(Gu,`Open the app switcher.`,{}),nd=H(Ku,`Inspect or dismiss the keyboard.`,{action:_(Xu)}),rd=H(qu,`Read or write clipboard text.`,{action:f(_(Yu)),text:p()}),id=H(Ju,`Press a TV remote/D-pad button.`,{button:f(_(Xe)),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})}),ad=R(Zu,(e,t)=>e.command.appState(t)),od=R(Qu,(e,t)=>e.command.back(t),Fu.back),sd=R($u,(e,t)=>e.command.home(t),Fu.home),cd=R(ed,(e,t)=>e.command.orientation(t),Fu.orientation),ld=R(td,(e,t)=>e.command.appSwitcher(t),Fu[`app-switcher`]),ud=R(nd,(e,t)=>e.command.keyboard(t)),dd=R(rd,(e,t)=>e.command.clipboard(t)),fd=R(id,(e,t)=>e.command.tvRemote(t),Fu[`tv-remote`]),pd={helpDescription:`Show foreground app/activity`},md={usageOverride:`back [--in-app|--system]`,allowedFlags:[`backMode`]},hd={usageOverride:`orientation <portrait|portrait-upside-down|landscape-left|landscape-right>`,helpDescription:`Set device orientation on iOS and Android`,positionalArgs:[`orientation`]},gd={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?`]},_d={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},vd={usageOverride:`tv-remote [press|longpress] ${Be} [--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`]},yd=(e,t)=>E(t),bd=(e,t)=>E(t),xd=(e,t)=>E(t),Sd=(e,t)=>({...E(t),mode:t.backMode}),Cd=(e,t)=>({...E(t),orientation:Ce(e[0])}),wd=(e,t)=>({...E(t),...zd(e)}),Td=(e,t)=>({...E(t),...Bd(e)}),Ed=(e,t)=>({...E(t),...Vd(e,t.durationMs)}),Dd=w(Vu),Od=e=>T(Hu,[],{...e,backMode:Ld(e.mode)}),kd=w(Uu),Ad=w(Wu,e=>[N(e.orientation,`orientation requires orientation`)]),jd=w(Gu),Md=w(Ku,e=>A(e.action)),Nd=w(qu,e=>Rd(e)),Pd=w(Ju,e=>[N(e.button,`tv-remote requires button`)]),Fd=F({name:`system`,commands:[P({name:Vu,metadata:Zu,definition:ad,clientMethod:`appState`,cliSchema:pd,cliReader:yd,daemonWriter:Dd,cliOutputFormatter:$.appstate}),P({name:Hu,metadata:Qu,definition:od,cliSchema:md,cliReader:Sd,daemonWriter:Od,cliOutputFormatter:$.back}),P({name:Uu,metadata:$u,definition:sd,cliReader:bd,daemonWriter:kd,cliOutputFormatter:$.home}),P({name:Wu,metadata:ed,definition:cd,cliSchema:hd,cliReader:Cd,daemonWriter:Ad,cliOutputFormatter:$.orientation}),P({name:Gu,metadata:td,definition:ld,cliReader:xd,daemonWriter:jd,cliOutputFormatter:$[`app-switcher`]}),P({name:Ku,metadata:nd,definition:ud,clientMethod:`keyboard`,cliSchema:gd,cliReader:wd,daemonWriter:Md,cliOutputFormatter:$.keyboard}),P({name:qu,metadata:rd,definition:dd,clientMethod:`clipboard`,cliSchema:_d,cliReader:Td,daemonWriter:Nd,cliOutputFormatter:$.clipboard}),P({name:Ju,metadata:id,definition:fd,cliSchema:vd,cliReader:Ed,daemonWriter:Pd,cliOutputFormatter:$[`tv-remote`]})]}),Id=Ln(Fd.definitions);function Ld(e){return e===`in-app`||e===`system`?e:void 0}function Rd(e){return e.action===`read`?[`read`]:[`write`,e.text]}function zd(t){if(t.length>1)throw new e(`INVALID_ARGS`,`keyboard accepts at most one action argument.`);return S({action:Hd(t[0])})}function Bd(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 Vd(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: ${Xe.join(`, `)}.`);let a=n??(r===`longpress`?500:void 0);return S({button:Ke(i[0]),durationMs:a})}function Hd(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 Ud=[Aa,Xs,pi,Fd,Ql,ku,Qc,Vl,yi,_u,rc,pr];function Wd(){return Ud.flatMap(e=>[...e.metadata])}function Gd(){return Ud.flatMap(e=>[...e.definitions])}function Kd(){return Xd(`cliSchemas`)}function qd(){return Xd(`cliReaders`)}function Jd(){return Xd(`daemonWriters`)}function Yd(){return Xd(`cliOutputFormatters`)}function Xd(e){let t={};for(let n of Ud){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{St as S,tr as _,Gd as a,Mt as b,Fd as c,Dr as d,Or as f,or as g,ar as h,Jd as i,ec as l,cr as m,qd as n,Wd as o,Sr as p,Kd as r,Id as s,Yd as t,es as u,nr as v,d as x,At as y};