agent-device 0.21.15 → 0.21.16

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 (248) hide show
  1. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.15.apk → agent-device-android-ime-helper-0.21.16.apk} +0 -0
  2. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.16.apk.sha256 +1 -0
  3. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.15.manifest.json → agent-device-android-ime-helper-0.21.16.manifest.json} +4 -4
  4. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.15.apk → agent-device-android-snapshot-helper-0.21.16.apk} +0 -0
  5. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.16.apk.sha256 +1 -0
  6. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.15.manifest.json → agent-device-android-snapshot-helper-0.21.16.manifest.json} +6 -6
  7. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +1 -4
  8. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedTextEntry.h +9 -9
  9. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedTextEntry.m +13 -22
  10. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSystemSurfaceHostPolicy.swift +0 -9
  11. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedTextEntry.swift +202 -73
  12. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +17 -2
  13. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextTyping.swift +109 -128
  14. package/dist/src/adapter.js +1 -1
  15. package/dist/src/adb-executor.js +1 -1
  16. package/dist/src/adb-failure.js +1 -1
  17. package/dist/src/adb-transport.js +1 -1
  18. package/dist/src/agent-browser-provider.js +1 -1
  19. package/dist/src/agent-browser-tool.js +1 -1
  20. package/dist/src/agent-device-client.js +2 -2
  21. package/dist/src/ai-sdk.js +1 -1
  22. package/dist/src/alert-runtime.js +1 -1
  23. package/dist/src/android-input-ownership.js +1 -1
  24. package/dist/src/app-catalog.js +1 -1
  25. package/dist/src/app-deployment-resolution.js +1 -1
  26. package/dist/src/app-inventory.js +1 -1
  27. package/dist/src/app-launch.js +1 -1
  28. package/dist/src/app-lifecycle.js +1 -1
  29. package/dist/src/app-lifecycle2.js +1 -1
  30. package/dist/src/app-log-files.js +1 -1
  31. package/dist/src/app-log-runtime2.js +1 -1
  32. package/dist/src/app-resolution.js +1 -1
  33. package/dist/src/apple-runner-platform.js +1 -1
  34. package/dist/src/application-lifecycle-interaction.js +1 -1
  35. package/dist/src/archive.js +1 -1
  36. package/dist/src/artifact-download.js +1 -1
  37. package/dist/src/auth-session.js +1 -1
  38. package/dist/src/auth.js +1 -1
  39. package/dist/src/backend-snapshot-options.js +1 -1
  40. package/dist/src/boot-diagnostics.js +1 -1
  41. package/dist/src/capture-disclosure.js +1 -1
  42. package/dist/src/capture.js +1 -1
  43. package/dist/src/cli-config.js +1 -1
  44. package/dist/src/cli-help.js +3 -2
  45. package/dist/src/cli.js +4 -4
  46. package/dist/src/click-button.js +1 -1
  47. package/dist/src/client-metro.js +1 -1
  48. package/dist/src/client-types.d.ts +1 -1
  49. package/dist/src/clipboard-shell-response.js +1 -1
  50. package/dist/src/command-schema.js +1 -1
  51. package/dist/src/command-tools.js +2 -2
  52. package/dist/src/connection-runtime.js +1 -1
  53. package/dist/src/connection.js +5 -5
  54. package/dist/src/contracts.js +1 -1
  55. package/dist/src/daemon-client-lease-beat.js +1 -0
  56. package/dist/src/daemon-client-lifecycle.js +1 -1
  57. package/dist/src/daemon-client-transport.js +1 -0
  58. package/dist/src/daemon-shutdown-report.js +1 -1
  59. package/dist/src/daemon.js +1 -1
  60. package/dist/src/debug-symbols-facade.js +1 -1
  61. package/dist/src/device-claim-inspection.js +1 -1
  62. package/dist/src/device-claim-rule.js +2 -2
  63. package/dist/src/device-inventory-context.js +1 -1
  64. package/dist/src/device-rotation.js +1 -1
  65. package/dist/src/device-selection-resolver.js +1 -1
  66. package/dist/src/device-session.js +1 -1
  67. package/dist/src/device-shell.js +1 -1
  68. package/dist/src/device.js +1 -1
  69. package/dist/src/device2.js +1 -1
  70. package/dist/src/devicectl.js +1 -1
  71. package/dist/src/diagnostics.js +1 -1
  72. package/dist/src/dispatch-resolve.js +1 -1
  73. package/dist/src/doctor-facade.js +1 -1
  74. package/dist/src/doctor2.js +1 -1
  75. package/dist/src/durable-resource.js +1 -1
  76. package/dist/src/engine-eval-script.js +1 -1
  77. package/dist/src/error.js +1 -1
  78. package/dist/src/exec.js +1 -1
  79. package/dist/src/file.js +1 -1
  80. package/dist/src/find.js +1 -1
  81. package/dist/src/format.js +1 -1
  82. package/dist/src/gesture-admission.js +1 -1
  83. package/dist/src/gesture-plan.js +1 -1
  84. package/dist/src/gesture-runtime.js +1 -1
  85. package/dist/src/harmonyos.js +1 -1
  86. package/dist/src/helper.js +1 -1
  87. package/dist/src/host.js +1 -1
  88. package/dist/src/human-control-contract.js +1 -1
  89. package/dist/src/human-control.js +1 -1
  90. package/dist/src/index.js +1 -1
  91. package/dist/src/input-actions.js +1 -1
  92. package/dist/src/input-actions2.js +1 -1
  93. package/dist/src/install-artifact-facade.js +1 -1
  94. package/dist/src/install-source-network-transport.js +1 -1
  95. package/dist/src/install-source2.js +1 -1
  96. package/dist/src/interaction-positionals.js +1 -1
  97. package/dist/src/interaction-ref-policy.js +1 -1
  98. package/dist/src/interaction2.js +1 -1
  99. package/dist/src/interactor-operation-binding.js +1 -1
  100. package/dist/src/interactor.js +5 -4
  101. package/dist/src/interactor2.js +1 -1
  102. package/dist/src/interactors.js +1 -1
  103. package/dist/src/internal/bin.js +1 -1
  104. package/dist/src/internal/daemon.js +2 -2
  105. package/dist/src/internal/png-worker.js +1 -1
  106. package/dist/src/internal/run-script-http-child.js +1 -1
  107. package/dist/src/inventory.js +1 -1
  108. package/dist/src/inventory2.js +1 -1
  109. package/dist/src/inventory3.js +1 -1
  110. package/dist/src/inventory5.js +1 -1
  111. package/dist/src/ios-snapshot-engine.js +1 -1
  112. package/dist/src/ios-snapshot-runtime.js +1 -1
  113. package/dist/src/lease-context.js +1 -1
  114. package/dist/src/lease-scope.js +1 -1
  115. package/dist/src/lease.js +1 -1
  116. package/dist/src/limrun-download-file.js +1 -1
  117. package/dist/src/limrun-runtime-dependencies.js +1 -1
  118. package/dist/src/linux.js +1 -1
  119. package/dist/src/location-coordinates.js +1 -1
  120. package/dist/src/managed-device-scope.js +1 -1
  121. package/dist/src/mechanics.js +15 -15
  122. package/dist/src/multitouch-support.js +1 -1
  123. package/dist/src/native-build-cache.js +1 -1
  124. package/dist/src/observation.js +1 -1
  125. package/dist/src/overlay.js +2 -2
  126. package/dist/src/parameterized-recorded-fill.js +1 -1
  127. package/dist/src/perf-facade.js +1 -1
  128. package/dist/src/perf-runtime-operation-builder.js +1 -1
  129. package/dist/src/perf-runtime-plan.js +1 -1
  130. package/dist/src/perf-target.js +1 -1
  131. package/dist/src/perf.js +1 -1
  132. package/dist/src/physical-device-control.js +1 -1
  133. package/dist/src/platform-request-scope.js +1 -1
  134. package/dist/src/platform-runtime-managed-owner.js +1 -1
  135. package/dist/src/platform-runtime-open-target.js +1 -1
  136. package/dist/src/platform-runtime-operation-host.js +2 -2
  137. package/dist/src/platform-runtime-runtime-hints.js +1 -1
  138. package/dist/src/platform-runtime-screen-recording-apple-simulator-host.js +1 -1
  139. package/dist/src/platform-runtime-screen-recording-finalizer-host.js +1 -1
  140. package/dist/src/platform-runtime-screen-recording-process-host.js +1 -1
  141. package/dist/src/platform-runtime-unavailable.js +1 -1
  142. package/dist/src/platform-runtime.js +1 -1
  143. package/dist/src/platform-runtime2.js +1 -1
  144. package/dist/src/png-crop-bytes.js +1 -1
  145. package/dist/src/png-size.js +1 -1
  146. package/dist/src/png-worker-client.js +1 -1
  147. package/dist/src/png.js +1 -1
  148. package/dist/src/prepare-kind.js +1 -1
  149. package/dist/src/provider-session-ownership.js +1 -1
  150. package/dist/src/provider-webdriver.js +1 -1
  151. package/dist/src/proxy.js +1 -1
  152. package/dist/src/quality-warnings.js +1 -1
  153. package/dist/src/react-native.js +1 -1
  154. package/dist/src/record-runtime.js +1 -1
  155. package/dist/src/recording.js +1 -1
  156. package/dist/src/rect-center.js +1 -1
  157. package/dist/src/register-builtins.js +1 -1
  158. package/dist/src/registry.js +13 -13
  159. package/dist/src/remote-config2.js +1 -1
  160. package/dist/src/replay-divergence.js +1 -1
  161. package/dist/src/replay.js +1 -1
  162. package/dist/src/reporting.js +1 -1
  163. package/dist/src/request-admission.js +1 -1
  164. package/dist/src/request-cancel.js +1 -1
  165. package/dist/src/request-runtime-binding.js +1 -1
  166. package/dist/src/result-serialization.js +1 -1
  167. package/dist/src/retry.js +1 -1
  168. package/dist/src/runner-artifact-manifest.js +1 -0
  169. package/dist/src/runner-cache-metadata.js +3 -2
  170. package/dist/src/runner-client.js +1 -1
  171. package/dist/src/runner-dev-tools-security.js +1 -1
  172. package/dist/src/runner-device-readiness.js +1 -1
  173. package/dist/src/runner-disposal.js +1 -1
  174. package/dist/src/runner-error-classification.js +3 -3
  175. package/dist/src/runner-operations-facade.js +1 -1
  176. package/dist/src/runner.js +1 -1
  177. package/dist/src/runtime-transport-hints.js +1 -1
  178. package/dist/src/runtime.js +1 -1
  179. package/dist/src/runtime10.js +2 -2
  180. package/dist/src/runtime2.js +3 -3
  181. package/dist/src/runtime3.js +1 -1
  182. package/dist/src/runtime4.js +4 -4
  183. package/dist/src/runtime5.js +1 -1
  184. package/dist/src/runtime6.js +1 -1
  185. package/dist/src/runtime7.js +1 -1
  186. package/dist/src/runtime8.js +1 -1
  187. package/dist/src/runtime9.js +1 -1
  188. package/dist/src/screen-recording-admission-ledger.js +1 -1
  189. package/dist/src/screen-recording-completion.js +1 -1
  190. package/dist/src/screen-recording-options.js +1 -1
  191. package/dist/src/screen-recording-resource-recovery.js +1 -1
  192. package/dist/src/screen-recording-transport.js +1 -1
  193. package/dist/src/screenshot-density.js +1 -1
  194. package/dist/src/screenshot-image.js +1 -1
  195. package/dist/src/screenshot-runtime.js +1 -1
  196. package/dist/src/screenshot.js +1 -1
  197. package/dist/src/screenshot3.js +1 -1
  198. package/dist/src/script.js +1 -1
  199. package/dist/src/scroll-command.js +1 -1
  200. package/dist/src/scroll-gesture.js +1 -1
  201. package/dist/src/sdk-batch-runner.js +2 -2
  202. package/dist/src/sdk-batch.js +1 -1
  203. package/dist/src/sdk-contracts.js +2 -2
  204. package/dist/src/sdk-device.js +1 -1
  205. package/dist/src/sdk-io.js +1 -1
  206. package/dist/src/sdk-remote-config.js +1 -1
  207. package/dist/src/selector-runtime.js +1 -1
  208. package/dist/src/server.js +1 -1
  209. package/dist/src/session-allocation.js +1 -1
  210. package/dist/src/session-routing.js +1 -1
  211. package/dist/src/session-runtime-admission.js +1 -1
  212. package/dist/src/session-snapshot.js +1 -1
  213. package/dist/src/session-store.js +3 -3
  214. package/dist/src/session2.js +3 -3
  215. package/dist/src/settings.js +1 -1
  216. package/dist/src/settings2.js +1 -1
  217. package/dist/src/simctl.js +1 -1
  218. package/dist/src/simulator-boot.js +1 -1
  219. package/dist/src/simulator.js +1 -1
  220. package/dist/src/snapshot-runtime-binding.js +1 -1
  221. package/dist/src/snapshot-runtime.js +1 -1
  222. package/dist/src/snapshot-state.js +1 -1
  223. package/dist/src/snapshot2.js +1 -1
  224. package/dist/src/snapshot3.js +1 -1
  225. package/dist/src/snapshot4.js +1 -1
  226. package/dist/src/src.js +1 -1
  227. package/dist/src/src7.js +1 -1
  228. package/dist/src/src8.js +1 -1
  229. package/dist/src/stop-sequence.js +1 -1
  230. package/dist/src/string-enum.js +1 -1
  231. package/dist/src/takeover.js +1 -1
  232. package/dist/src/text-entry-focus.js +1 -1
  233. package/dist/src/tool-provider.js +1 -1
  234. package/dist/src/tool-provider2.js +1 -1
  235. package/dist/src/touch-runtime.js +1 -1
  236. package/dist/src/transport.js +1 -1
  237. package/dist/src/tv-remote.js +1 -1
  238. package/dist/src/type-text-runtime.js +1 -1
  239. package/dist/src/verified-file.js +1 -1
  240. package/dist/src/video.js +1 -1
  241. package/dist/src/viewport.js +1 -1
  242. package/dist/src/web.js +1 -1
  243. package/dist/src/web2.js +1 -1
  244. package/dist/src/webdriver-source.js +1 -1
  245. package/package.json +2 -2
  246. package/server.json +2 -2
  247. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.15.apk.sha256 +0 -1
  248. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.15.apk.sha256 +0 -1
@@ -1,4 +1,4 @@
1
- import{A as e,B as t,M as n,R as r,j as i,o as a,t as o}from"./sdk-contracts.js";import{i as s,k as c,n as l}from"./sdk-batch-runner.js";import{S as u,b as d,d as f,f as p,g as m,l as h,v as g,y as _}from"./sdk-device.js";import{A as v,B as y,Ct as b,F as x,G as ee,I as S,J as C,K as te,L as ne,N as w,Nt as re,P as ie,R as T,St as E,U as ae,Ut as D,W as oe,X as se,Y as ce,Z as le,d as ue,f as de,ft as fe,in as pe,it as me,j as he,ot as ge,pt as _e,q as ve,rt as ye,sr as be,v as xe,wt as Se,z as Ce}from"./sdk-batch.js";import{_ as we,c as O,d as Te,f as Ee,g as De,h as Oe,l as ke,m as Ae,p as je,t as k,u as Me}from"./session-store.js";import{B as A,G as Ne,L as Pe,O as Fe,W as Ie,g as j,h as Le,i as Re,m as ze,n as Be,s as Ve,y as He}from"./session-snapshot.js";import{O as Ue,c as We,f as Ge,g as Ke,h as qe,k as Je,l as Ye,m as Xe,o as Ze,p as Qe,u as M}from"./parameterized-recorded-fill.js";import{n as N,t as $e}from"./catalog.js";import{g as et,i as tt}from"./observability.js";import{i as P,n as nt,r as F}from"./success-text.js";import{t as rt}from"./app-inventory.js";import{r as it,t as at}from"./device.js";import{a as ot,r as I}from"./diagnostics.js";import{a as st,i as ct,r as lt}from"./verified-file.js";import{c as ut}from"./exec.js";import"./file.js";import"./diagnostics2.js";import"./command.js";import{i as dt}from"./replay-divergence.js";import{a as ft}from"./version.js";import{i as pt,r as mt}from"./session-artifact-paths.js";import{t as ht}from"./project-runtime.js";import{t as gt}from"./keyed-lock.js";import{n as _t,t as vt}from"./deploy-result-target.js";import{t as yt}from"./keyboard-actions.js";import{i as bt,r as xt}from"./request-cancel.js";import{t as St}from"./request.js";import{i as Ct,s as wt}from"./provider-session-ownership.js";import{A as Tt,B as Et,C as Dt,E as Ot,F as kt,G as At,K as jt,M as Mt,O as Nt,P as Pt,S as Ft,_ as It,b as Lt,c as Rt,d as zt,et as Bt,f as Vt,g as Ht,h as Ut,k as Wt,l as Gt,m as Kt,n as qt,p as Jt,q as Yt,r as Xt,rt as Zt,s as Qt,t as $t,tt as en,u as L,v as tn,w as nn,x as rn,y as an}from"./device-claim-rule.js";import{i as on}from"./request-runtime-binding.js";import{c as sn,i as cn,t as ln}from"./device-claim-inspection.js";import{t as un}from"./audio-probe-result.js";import{T as dn,_ as fn,a as pn,b as mn,c as hn,d as gn,f as _n,g as vn,h as yn,i as bn,l as xn,m as Sn,n as Cn,o as wn,r as Tn,s as En,t as Dn,u as On,v as kn,x as An}from"./perf-runtime-plan.js";import{i as jn,n as Mn}from"./lease-context.js";import{h as Nn}from"./screenshot-runtime.js";import{n as R,r as Pn}from"./device-isolation.js";import{a as Fn,n as In,r as Ln}from"./device-inventory-context.js";import{n as Rn,r as zn,t as Bn}from"./dispatch-resolve.js";import"./screen-recording-admission-ledger.js";import{a as Vn,d as Hn,i as Un,l as Wn,n as Gn,o as Kn,s as qn,u as Jn}from"./session-routing.js";import{a as Yn,i as z,n as B,r as V,t as Xn}from"./session-runtime-admission.js";import{n as Zn,r as Qn}from"./device-selection-resolver.js";import{n as $n,r as er}from"./doctor-output.js";import{t as tr}from"./record-runtime.js";import{n as nr}from"./gesture-runtime.js";import{i as rr,n as ir,r as ar}from"./platform-runtime-open-target.js";import{t as or}from"./snapshot-runtime.js";import{t as sr}from"./app-log-files.js";import H from"node:path";import U,{promises as cr}from"node:fs";function lr(e,t,n,r){return{name:e,logPath:t,store:{...n,assertSelectorMatches:r.assertSelectorMatches,resolveOpenRuntimeHints:r.resolveOpenRuntimeHints},observationStore:{get:n.get,bindAuthority:r.bindAuthority,capture:r.capture},coordinator:r.createCoordinator()}}function ur(e){let{internal:t,...n}=e;return{request:n,...t?.publicNetworkOnly?{publicNetworkOnly:!0}:{},...t?.resolvedSessionScope?{resolvedSessionScope:t.resolvedSessionScope}:{}}}function dr(e,t){let n=c({...e,...t});return Object.keys(n).length>0?n:void 0}function fr(e,t){return async({dispatch:n,...r})=>{let i=dr(t.internal,n);return await e(i?{...r,internal:i}:r)}}function pr(t){throw new e(`UNSUPPORTED_OPERATION`,`install_from_source ${String(t.kind)} sources require a compatible remote daemon`)}function mr(t){let n=t.meta?.installSource;if(!n)throw new e(`INVALID_ARGS`,`install_from_source requires a source payload`);switch(n.kind){case`url`:if(!n.url||n.url.trim().length===0)throw new e(`INVALID_ARGS`,`install_from_source url source requires a non-empty url`);return n;case`path`:if(!n.path||n.path.trim().length===0)throw new e(`INVALID_ARGS`,`install_from_source path source requires a non-empty path`);return n;case`github-actions-artifact`:throw new e(`UNSUPPORTED_OPERATION`,`install_from_source github-actions-artifact sources require a compatible remote daemon`);default:pr(n)}}function hr(e){let t=mr(e),n=e.meta?.uploadedArtifactId;return!n||t.kind!==`path`?{source:t,cleanup:()=>{}}:{source:{kind:`path`,path:wt(n,e.meta?.tenantId)},cleanup:()=>{Ct(n)}}}function W(e,t,n){return t||jt(n)?null:a(`INVALID_ARGS`,`${e} requires an active session or an explicit device selector (e.g. --platform ios).`)}function gr(e){return typeof e?.session==`string`&&e.session.trim().length>0}async function G(e){return Yt(e.flags)||!e.session?await Rn(e.flags??{},{androidAvdSelection:e.androidAvdSelection}):await _r(e.session.device)}async function _r(t){if(on(t)||!f(t)||t.kind!==`simulator`||process.platform!==`darwin`)return t;if((await He.observeRunnerSession(t.id))?.alive)return{...t,booted:!0};let n={platform:`ios`,target:t.target,udid:t.id,...t.simulatorSetPath?{iosSimulatorDeviceSet:t.simulatorSetPath}:{}};try{return await Rn(n)}catch(t){if(!(t instanceof e)||t.code!==`DEVICE_NOT_FOUND`)throw t}return await Rn({platform:`ios`,target:t.target,device:t.name,...t.simulatorSetPath?{iosSimulatorDeviceSet:t.simulatorSetPath}:{}})}function vr(e,t){return t?Wn(t,e).length===0:!1}async function yr(e){let{req:n,sessionName:r,sessionStore:i}=e,a=i.get(r),o,s,c;try{o=hr(n);let t=Cr(n),l=await xr(a,n.flags),u=await V(e.inspectFacts)(l),d=z(`install_from_source`,u.operations.ensureReady)??z(`install_from_source`,u.operations.materializeAppSource)??z(`install_from_source`,u.operations.deployMaterializedApp);if(d)return d;let f=await B(e.bindDevice)(l,se);await f.operations.ensureReady({}),s=await f.operations.materializeAppSource({source:o.source}),c=await wr({artifact:s,retention:t,req:n,session:a,sessionName:r}),a&&A(a);let p=await f.operations.deployMaterializedApp({artifact:s}),m=Tr(l,s,p,c),h=P(m,`Installed: ${_t(m)}`);return O(i,a,n,`install_source`,h,{positionals:[]}),{ok:!0,data:h}}catch(e){return c&&await Nt(c.materializationId,n.meta?.tenantId).catch(()=>{}),{ok:!1,error:t(e)}}finally{await s?.cleanup(),o?.cleanup()}}async function br(n){let{req:r}=n;try{let t=r.meta?.materializationId?.trim();if(!t)throw new e(`INVALID_ARGS`,`release_materialized_paths requires a materializationId`);return await Nt(t,r.meta?.tenantId),{ok:!0,data:{released:!0,materializationId:t}}}catch(e){return{ok:!1,error:t(e)}}}async function xr(t,n){let r=Sr(n?.platform);if(t&&r&&t.device.platform!==r)throw new e(`INVALID_ARGS`,`install_from_source requested platform ${r}, but session is bound to ${t.device.platform}`);if(!t&&!r)throw new e(`INVALID_ARGS`,`install_from_source requires platform "ios" or "android" when no session is provided`);return t?t.device:await G({session:t,flags:n})}function Sr(e){return e===`ios`||e===`android`?e:void 0}function Cr(t){let n=t.meta?.retainMaterializedPaths===!0,r=t.meta?.materializedPathRetentionMs;if(!n)return{enabled:!1};if(r!==void 0&&r<=0)throw new e(`INVALID_ARGS`,`install_from_source retentionMs must be a positive integer`);return{enabled:!0,...r===void 0?{}:{ttlMs:r}}}async function wr(e){if(e.retention.enabled)return await Tt({archivePath:e.artifact.archivePath,installablePath:e.artifact.installablePath,tenantId:e.req.meta?.tenantId,sessionName:e.session?e.sessionName:void 0,ttlMs:e.retention.ttlMs})}function Tr(e,t,n,r){return f(e)?Er(t,n,r):Dr(t,n,r)}function Er(t,n,r){let i=n.bundleId??t.bundleId;if(!i)throw new e(`COMMAND_FAILED`,`Installed iOS app identity could not be resolved from the artifact`);return{...kr(r),bundleId:i,...Or(n,t),launchTarget:n.launchTarget??i}}function Dr(t,n,r){let i=n.packageName??n.launchTarget??t.packageName;if(!i)throw new e(`COMMAND_FAILED`,`Installed Android app identity could not be resolved from the artifact or device state`);return{...kr(r),packageName:i,...Or(n,t),launchTarget:n.launchTarget??i}}function Or(e,t){let n=e.appName??t.appName;return n?{appName:n}:{}}function kr(e){return e?{...e.archivePath?{archivePath:e.archivePath}:{},installablePath:e.installablePath,materializationId:e.materializationId,materializationExpiresAt:e.expiresAt}:{}}async function Ar(e){let{req:t,session:n,inspectFacts:r,bindDevice:i}=e,o=jr(t);if(!o.ok)return o.response;let s=W(`runtime port-reverse`,n,t.flags);if(s)return s;let c=await G({session:n,flags:t.flags}),l=await j({device:c,inspectFacts:r,bindDevice:i,command:`runtime port-reverse`,use:y});if(l.type===`response`)return l.response;if(l.runtime.owner.kind!==`provider-runtime`||l.runtime.owner.provider!==o.options.provider)return a(`UNSUPPORTED_OPERATION`,`The selected device is not owned by the requested port-reverse provider.`,{provider:o.options.provider});let u=await l.runtime.operations.configureProviderPortReverse(o.options);return u?{ok:!0,data:{action:`port-reverse`,...u}}:a(`UNSUPPORTED_OPERATION`,`The selected provider device runtime does not support port reverse for this lease.`)}function jr(e){let t=Mr(e);if(!t.ok)return t;let n=Nr(e);return n.ok?{ok:!0,options:{leaseId:t.leaseId,provider:t.provider,devicePort:n.devicePort,hostPort:n.hostPort,name:e.flags?.portReverseName?.trim()||`runtime`}}:n}function Mr(e){let t=e.flags?.leaseId,n=e.flags?.leaseProvider;return t?n?{ok:!0,leaseId:t,provider:n}:{ok:!1,response:a(`INVALID_ARGS`,`runtime port-reverse requires a lease provider.`)}:{ok:!1,response:a(`INVALID_ARGS`,`runtime port-reverse requires a resolved remote lease.`)}}function Nr(e){let t=Pr(e.flags?.devicePort),n=Pr(e.flags?.hostPort??e.flags?.devicePort);return!t||!n?{ok:!1,response:a(`INVALID_ARGS`,`runtime port-reverse requires numeric devicePort and hostPort values from 1 to 65535.`)}:{ok:!0,devicePort:t,hostPort:n}}function Pr(e){if(!(typeof e!=`number`||!Number.isInteger(e)||e<1||e>65535))return e}async function Fr(e){return await j({...e,command:`runtime clear`,use:ne})}async function Ir(e){let{req:t,sessionName:n,sessionStore:r}=e,i=(t.positionals?.[0]??`show`).toLowerCase();if(i===`port-reverse`)return await Ar({req:t,session:r.get(n),inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(i===`gesture-viewport`)return await Lr({...e,session:r.get(n)});if(!Rr(i))return a(`INVALID_ARGS`,`runtime requires set, show, clear, port-reverse, or gesture-viewport`);let o=r.get(n),s=r.getRuntimeHints(n);return i===`clear`?await zr({sessionName:n,sessionStore:r,session:o,current:s,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice}):i===`show`?Br(n,s):Hr({req:t,sessionName:n,sessionStore:r,session:o,current:s})}async function Lr(e){if(!e.session)return a(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let t=await nr({device:e.session.device,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(!t.ok)return t.response;let n=Pe(e.logPath,e.req.flags,e.session.appBundleId,e.session.trace?.outPath,e.req.meta?.requestId,e.req.meta);return{ok:!0,data:{viewport:await t.read(n)}}}function Rr(e){return e===`set`||e===`show`||e===`clear`}async function zr(e){let{sessionName:t,sessionStore:n,session:r,current:i,inspectFacts:a,bindDevice:o}=e;if(L(i)&&r?.appBundleId){let e=await Fr({device:r.device,inspectFacts:a,bindDevice:o});if(e.type===`response`)return e.response;A(r),await e.runtime.operations.clearRuntimeHints({appId:r.appBundleId,values:Kt(i)})}return{ok:!0,data:{session:t,cleared:n.clearRuntimeHints(t)}}}function Br(e,t){return{ok:!0,data:{session:e,configured:!!t,runtime:t}}}function Vr(e){return e?d(e.device):void 0}function Hr(e){let{req:t,sessionName:n,sessionStore:r,session:i,current:o}=e,s=Vr(i),c=It(t.flags?.platform??o?.platform??s);if(!c)return a(`INVALID_ARGS`,`runtime set only supports iOS, Android, and HarmonyOS sessions. Pass --platform ios|android|harmonyos or open a supported session first.`);if(s!==void 0&&s!==c)return a(`INVALID_ARGS`,`runtime set targets ${c}, but session "${n}" is already bound to ${s}.`);let l=Vt(o,Rt(t.flags,c));return Gt(l)===0?a(`INVALID_ARGS`,`runtime set requires at least one hint such as --metro-host, --metro-port, --bundle-url, or --launch-url.`):(r.setRuntimeHints(n,l),{ok:!0,data:{session:n,configured:!0,runtime:l}})}const Ur=/^[A-Za-z0-9_.:-]{1,64}$/,Wr=8192,Gr=4096;function Kr(t){let n=t[0]?.trim(),r=t[1]?.trim();if(!n)throw new e(`INVALID_ARGS`,`trigger-app-event requires <event> [payloadJson]`);if(!Ur.test(n))throw new e(`INVALID_ARGS`,`Invalid trigger-app-event event name: ${n}`,{hint:`Use 1-64 chars: letters, numbers, underscore, dot, colon, or dash.`});if(t.length>2)throw new e(`INVALID_ARGS`,`trigger-app-event accepts at most two arguments: <event> [payloadJson]`);return{eventName:n,payload:Jr(r,n)}}function qr(t,n,r){let i=d(t),a=Yr(t);if(!a)throw new e(`UNSUPPORTED_OPERATION`,`No app event URL template configured for ${i}.`,{hint:`Set AGENT_DEVICE_${i.toUpperCase()}_APP_EVENT_URL_TEMPLATE or AGENT_DEVICE_APP_EVENT_URL_TEMPLATE, for example "myapp://agent-device/event?name={event}&payload={payload}".`});let o=r?JSON.stringify(r):``,s=a.replaceAll(`{event}`,encodeURIComponent(n)).replaceAll(`{payload}`,encodeURIComponent(o)).replaceAll(`{platform}`,encodeURIComponent(i));if(s.length>Gr)throw new e(`INVALID_ARGS`,`trigger-app-event URL exceeds maximum supported length`,{hint:`Reduce payload size or shorten AGENT_DEVICE_*_APP_EVENT_URL_TEMPLATE.`,length:s.length,maxLength:Gr});return s}function Jr(t,n){if(t)try{let r=JSON.parse(t);if(!r||typeof r!=`object`||Array.isArray(r))throw new e(`INVALID_ARGS`,`trigger-app-event payload for "${n}" must be a JSON object`);let i=JSON.stringify(r);if(Buffer.byteLength(i,`utf8`)>Wr)throw new e(`INVALID_ARGS`,`trigger-app-event payload for "${n}" exceeds ${Wr} bytes`);return r}catch(n){throw n instanceof e?n:new e(`INVALID_ARGS`,`Invalid trigger-app-event payload JSON: ${t}`)}}function Yr(e){return((f(e)?process.env.AGENT_DEVICE_IOS_APP_EVENT_URL_TEMPLATE:p(e)?process.env.AGENT_DEVICE_MACOS_APP_EVENT_URL_TEMPLATE:process.env.AGENT_DEVICE_ANDROID_APP_EVENT_URL_TEMPLATE)??process.env.AGENT_DEVICE_APP_EVENT_URL_TEMPLATE)?.trim()||void 0}async function Xr(e,t,n,r){let{eventName:i,payload:a}=Kr([...r]),o=qr(t,i,a),s={eventUrl:o,...n.appBundleId===void 0?{}:{options:{appBundleId:n.appBundleId}},execution:ze(n)};return await e.operations.triggerAppEvent(s),{event:i,eventUrl:o,transport:`deep-link`,...F(`Triggered app event: ${i}`)}}async function Zr(e){let{device:t,positionals:n,inspectFacts:r,bindDevice:i,readiness:a}=e,o=await j({command:`trigger-app-event`,device:t,use:ye,inspectFacts:r,bindDevice:i,readiness:a});if(o.type===`response`)return{ok:!1,response:o.response};let s=o.runtime;return{ok:!0,execute:e=>Xr(s,t,e,n)}}function Qr(t){let n=(t[0]??`status`).toLowerCase();if(!yt(n))throw new e(`INVALID_ARGS`,`keyboard requires a subcommand: status, get, dismiss, enter, or return`);if(t.length>1)throw new e(`INVALID_ARGS`,`keyboard accepts at most one subcommand argument`);return $r(n)}function $r(e){return e===`get`?`status`:e===`return`?`enter`:e}const ei={"ime-probe":`android`},ti={"ime-probe":`android`,mechanism:`ios`,acknowledged:`harmonyos`},ni={"visibility-echo":`ios`,"android-acknowledged":`android`,"harmonyos-acknowledged":`harmonyos`};function ri(e){return{...e.appBundleId===void 0?{}:{options:{appBundleId:e.appBundleId}},execution:ze(e)}}async function ii(e,t){let n=await j(e);if(n.type===`response`)return{ok:!1,response:n.response};let r=n.runtime;return{ok:!0,execute:e=>t(r,e)}}function ai(e,t){return e.operations.keyboardStatus(ri(t)).then(e=>({platform:ei[e.kind],action:`status`,visible:e.visible,inputType:e.inputType,type:e.type,inputMethodPackage:e.inputMethodPackage,focusedPackage:e.focusedPackage,focusedResourceId:e.focusedResourceId,inputOwner:e.inputOwner}))}async function oi(e,t){let n=await e.operations.keyboardDismiss(ri(t)),r=ti[n.kind];return n.kind===`mechanism`?{platform:r,action:`dismiss`,wasVisible:n.wasVisible,dismissed:n.dismissed,visible:n.visible,mechanism:n.mechanism,...F(li(n.dismissed===!0,n.mechanism))}:n.kind===`acknowledged`?{platform:r,action:`dismiss`,...F(`Keyboard dismissed`)}:{platform:r,action:`dismiss`,attempts:n.attempts,wasVisible:n.wasVisible,dismissed:n.dismissed,visible:n.visible,inputType:n.inputType,type:n.type,inputMethodPackage:n.inputMethodPackage,focusedPackage:n.focusedPackage,focusedResourceId:n.focusedResourceId,inputOwner:n.inputOwner}}async function si(e,t){let n=await e.operations.keyboardEnter(ri(t)),r=ni[n.kind];return n.kind===`visibility-echo`?{platform:r,action:`enter`,visible:n.visible,wasVisible:n.wasVisible,...F(`Keyboard enter pressed`)}:{platform:r,action:`enter`,...F(`Keyboard enter pressed`)}}async function ci(e){let t=Qr(e.positionals),{device:n,inspectFacts:r,bindDevice:i,readiness:a}=e;return t===`status`?await ii({command:`keyboard status`,device:n,use:Se,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>ai(e,t)):t===`dismiss`?await ii({command:`keyboard dismiss`,device:n,use:E,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>oi(e,t)):await ii({command:`keyboard enter`,device:n,use:b,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>si(e,t))}function li(e,t){return e?t===`dismissKey`?`Keyboard dismissed via its dismiss key`:`Keyboard dismissed`:`Keyboard already hidden`}async function ui(e){let{req:t,sessionName:n,sessionStore:r,command:i,positionals:a,recordPositionals:o,deriveNextSession:s,prepare:c}=e,l=r.get(n),u=t.flags??{},d=W(i,l,u);if(d)return d;let f=await G({session:l,flags:u}),p=await c(f,l);if(!p.ok)return p.response;l&&Nn(t)===`may-invalidate`&&A(l);let m=await p.execute();if(l){let e=s?await s(l,m,f):l;O(r,e,t,i,m??{},{positionals:o??a}),e!==l&&r.set(n,e)}return{ok:!0,data:m??{}}}function di(e,t,n){if(!(e||t!==`dismiss`&&t!==`enter`&&t!==`return`||n?.platform!==`ios`))return a(`SESSION_NOT_FOUND`,`iOS keyboard action requires an active session so the target app stays foregrounded. Run open first.`)}async function fi(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,inspectFacts:a,bindDevice:o}=e,s=t.positionals??[];return await ui({req:t,sessionName:n,sessionStore:i,command:e.command,positionals:s,...e.deriveNextSession?{deriveNextSession:e.deriveNextSession}:{},prepare:async(n,i)=>{let c=await e.resolveRuntime({device:n,positionals:s,readiness:!0,inspectFacts:a,bindDevice:o});if(!c.ok)return{ok:!1,response:c.response};let l={...Pe(r,t.flags,i?.appBundleId,i?.trace?.outPath),surface:i?.surface};return{ok:!0,execute:()=>c.execute(l)}}})}async function pi(e){return di(e.sessionStore.get(e.sessionName),e.req.positionals?.[0]?.trim().toLowerCase(),e.req.flags??{})||await fi({...e,command:N.keyboard,resolveRuntime:e=>ci(e)})}async function mi(e){return await fi({...e,command:N.triggerAppEvent,resolveRuntime:e=>Zr(e),deriveNextSession:async(e,t)=>{let n=typeof t?.eventUrl==`string`?t.eventUrl:void 0,r=n?await ar(e.device,n,e.appBundleId)??e.appBundleId:e.appBundleId;return{...e,appBundleId:r}}})}function hi(e){let t=e.trim();return t.startsWith(`{`)&&t.endsWith(`}`)||t.startsWith(`[`)&&t.endsWith(`]`)}function gi(t,n){let r=n?.subject??`Payload`,i=t.trim();if(!i)throw new e(`INVALID_ARGS`,`${r} cannot be empty`);let a=n?.expandPath?n.expandPath(i,n.cwd):i;try{if(!U.statSync(a).isFile())throw new e(`INVALID_ARGS`,`${r} path is not a file: ${a}`);return{kind:`file`,path:a}}catch(t){if(t instanceof e)throw t;let n=t.code;if(n===`EACCES`||n===`EPERM`)throw new e(`INVALID_ARGS`,`${r} file is not readable: ${a}`);if(n&&n!==`ENOENT`)throw new e(`COMMAND_FAILED`,`Unable to read ${r} file: ${a}`,{cause:String(t)})}if(hi(i))return{kind:`inline`,text:i};throw new e(`INVALID_ARGS`,`${r} file not found: ${a}`)}async function _i(t){let n=gi(t,{subject:`Push payload`}),r=n.kind===`inline`?n.text:await vi(n.path);try{let t=JSON.parse(r);if(!t||typeof t!=`object`||Array.isArray(t))throw new e(`INVALID_ARGS`,`push payload must be a JSON object`);return t}catch(n){throw n instanceof e?n:new e(`INVALID_ARGS`,`Invalid push payload JSON: ${t}`)}}async function vi(t){try{return await cr.readFile(t,`utf8`)}catch(n){let r=n.code;throw r===`ENOENT`?new e(`INVALID_ARGS`,`Push payload file not found: ${t}`):r===`EISDIR`?new e(`INVALID_ARGS`,`Push payload path is not a file: ${t}`):r===`EACCES`||r===`EPERM`?new e(`INVALID_ARGS`,`Push payload file is not readable: ${t}`):new e(`COMMAND_FAILED`,`Unable to read push payload file: ${t}`,{cause:String(n)})}}async function yi(e){let{req:t,command:n,sessionName:r,sessionStore:i}=e,o=i.get(r),s=t.flags??{},c=W(n,o,s);if(c)return c;let l=Ti(n,t.positionals??[]);if(!l.ok)return l.response;let u=t.meta?.uploadedArtifactId;try{let c=u?wt(u,t.meta?.tenantId):k.expandHome(l.appPathInput);if(!U.existsSync(c))return a(`INVALID_ARGS`,`App binary not found: ${c}`);let d=await G({session:o,flags:s}),f=await V(e.inspectFacts)(d),p=z(n,f.operations.deployApp);if(p)return p;let m=await B(e.bindDevice)(d,ce);o&&A(o);let h=await m.operations.deployApp({app:l.app,appPath:c,replaceExisting:n===`reinstall`}),g=xi(d,l.app,c,h),_=P(g,`Installed: ${g.appName??vt(g)}`),v=wi(o,g);return v&&v!==o&&i.set(r,v),O(i,v,t,n,_),{ok:!0,data:_}}finally{u&&Ct(u)}}async function bi(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n),o=t.flags??{},s=W(`push`,i,o);if(s)return s;let c=t.positionals?.[0]?.trim(),l=t.positionals?.[1]?.trim();if(!c||!l)return a(`INVALID_ARGS`,`push requires <bundle|package> <payload.json|inline-json>`);let u=await _i(Ei(l,t.meta?.cwd)),p=await G({session:i,flags:o}),m=await V(e.inspectFacts)(p),h=z(`push`,m.operations.ensureReady)??z(`push`,m.operations.sendPushNotification);if(h)return h;let g=await B(e.bindDevice)(p,le);await g.operations.ensureReady({}),i&&A(i);let _=await g.operations.sendPushNotification({appId:c,payload:u}),v=f(p)?P({platform:`ios`,bundleId:c},`Pushed notification to ${c}`):P({platform:d(p),package:c,action:_.action,extrasCount:_.extrasCount},`Pushed notification to ${c}`);return O(r,i,t,`push`,v,{positionals:[c,l]}),{ok:!0,data:v}}function xi(e,t,n,r){return f(e)?Si(t,n,r):Ci(e,t,n,r)}function Si(e,t,n){let r=n.bundleId;return{app:e||r||n.launchTarget||t,appPath:t,platform:`ios`,...r?{appId:r,bundleId:r}:{},appName:n.appName,launchTarget:n.launchTarget}}function Ci(e,t,n,r){let i=r.packageName,a=e.platform===`harmonyos`?`harmonyos`:`android`;return{app:t||i||r.launchTarget||n,appPath:n,platform:a,...i?{appId:i,package:i,packageName:i}:{},appName:r.appName,launchTarget:r.launchTarget}}function wi(e,t){return!e||t.platform!==`harmonyos`||!t.appId?e:{...e,appBundleId:t.appId,appName:t.appName??t.app}}function Ti(e,t){let n=t[0]?.trim(),r=t[1]?.trim();if(e===`install`){let e=r??n;return e?{ok:!0,app:r?n??``:``,appPathInput:e}:{ok:!1,response:a(`INVALID_ARGS`,`install requires: install <path-to-app-binary>`)}}return!n||!r?{ok:!1,response:a(`INVALID_ARGS`,`reinstall requires: reinstall <app> <path-to-app-binary>`)}:{ok:!0,app:n,appPathInput:r}}function Ei(e,t){let n=gi(e,{subject:`Push payload`,cwd:t,expandPath:(e,t)=>k.expandHome(e,t)});return n.kind===`file`?n.path:n.text}async function K(e){let{req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}=e;return t.command===`install`||t.command===`reinstall`?await yi({req:t,command:t.command,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):t.command===`install_source`?await yr({req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):t.command===`push`?await bi({req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):null}async function Di(e,t,n){return await l(e,t,async(e,t)=>{let r=e;return await n({...r,internal:{...r.internal,executionPlan:{remainingSteps:t.remainingSteps}}})})}const Oi=new Set(`acceptAlert.actionButton.appLogCleanup.appLogDoctor.appLogInspect.appLogReattach.appLogStart.appState.appSwitcher.applyRuntimeHints.audioProbeCleanup.audioProbeQuery.audioProbeReattach.audioProbeStart.awaitAlert.back.bootTarget.bootTargetHeadless.captureScreenshot.captureSnapshot.captureSnapshotWithCustomActions.captureSnapshotWithoutActiveApp.clearRuntimeHints.closeApplication.configureProviderPortReverse.deployApp.deployMaterializedApp.dismissAlert.ensureReady.fillPoint.fillRef.finalizeApplicationClose.findText.focusPoint.gestureViewport.home.hoverPoint.hoverRef.keyboardDismiss.keyboardEnter.keyboardStatus.listApps.longPressPoint.materializeAppSource.networkDump.openApplication.perfFrames.perfMemorySample.perfMemorySnapshot.perfNativeCaptureCleanup.perfNativeCaptureReattach.perfNativeCaptureStart.perfProfileReport.performDirectionalFlingPlan.performGesturePlan.performMultiTouchGesturePlan.performTargetAuthoredDrag.prepareAppleRunner.prepareApplicationOpen.readAlert.readClipboard.readSetting.readTextAtPoint.resolveOpenTarget.screenRecordingCleanup.screenRecordingReattach.screenRecordingStart.scrollDirection.sendPushNotification.setFoldPose.setOrientation.setSetting.setViewport.shutdownTarget.tapElementSelector.tapPoint.tapRef.triggerAppEvent.tvRemote.typeText.writeClipboard`.split(`.`));function ki(e){return Oi.has(e)}const Ai=new Map(ue.map(e=>[e.name,e]));function ji(e){let t=new Set;for(let n of e){let e=Mi(n);if(e===void 0)return;for(let n of e)t.add(n)}return Object.freeze([...t].sort())}function Mi(e){let t=Ai.get(e.command)?.platformExecution;if(t===void 0)return;if(t.kind!==`device-runtime`)return[];let n=(`uses`in t?t.selectUses?.(e)??t.uses:[t.use]).flatMap(e=>e.required);return n.every(ki)?n:void 0}function Ni(e){if(e!==void 0&&e.remainingSteps.length!==0)return ji(e.remainingSteps)}function Pi(e,t,n){return{requestId:e.meta?.requestId,logPath:t,traceLogPath:n,verbose:e.flags?.verbose,activity:e.flags?.activity,launchConsole:e.flags?.launchConsole,launchArgs:e.flags?.launchArgs,clearAppState:e.flags?.clearAppState,iosXctestrunFile:e.flags?.iosXctestrunFile,iosXctestDerivedDataPath:e.flags?.iosXctestDerivedDataPath,iosXctestEnvDir:e.flags?.iosXctestEnvDir,runnerLeaseContext:jn(e),plannedOperations:Ni(e.internal?.executionPlan)}}function Fi(e,t,n){e.recordAction(t,{command:`close`,positionals:n.positionals??[],flags:n.flags??{},result:{session:t.name,...F(`Closed: ${t.name}`)}})}function Ii(e,t,n){if(!Ee(t))return{kind:`not-armed`};let r=t.actions.length;Fi(e,t,n);let i=Ge(t),a=e.writeSessionLog(t,{force:Ye(t,n.flags?.force)});return a.written?{kind:`committed`,path:a.path}:a.error?(t.actions.length=r,{kind:`failed`,error:a.error}):i?{kind:`committed`}:(ke(t),{kind:`aborted`})}function Li(e,n){let r=t(n),i=Je(e.scriptPublication??Ke);return{ok:!1,error:{...r,details:{...r.details,session:e.name,...i?{savedScript:i}:{}},retriable:!0}}}function Ri(e){let{req:t,session:n,sessionStore:r,platformCloseError:i}=e;i||Fi(r,n,t);try{let e=r.writeSessionLog(n,{force:Ye(n,t.flags?.force)});e.written&&Xe(n,e.path);return}catch(e){return zi(e)}}function zi(n){let r={hint:`Remove the existing target (or pass --force/--overwrite), then re-record with open --save-script.`,retriable:!1};return n instanceof e?new e(`COMMAND_FAILED`,`The session was closed, but its script was not saved: ${n.message}`,{...n.details,...r},n.cause):new e(`COMMAND_FAILED`,`The session was closed, but its script was not saved: ${t(n).message}`,r)}async function Bi(e){let t=e.clearRuntimeHints?Ce:T,n=await Le({...e,command:`close`,required:t.required});if(n.type===`response`)return n;if(!e.clearRuntimeHints)return{type:`runtime`,runtime:await n.bind(e.device,T)};let r=await n.bind(e.device,Ce);return{type:`runtime`,runtime:r,clearRuntimeHints:r.operations.clearRuntimeHints}}async function Vi(e){let{req:t,session:n,sessionName:r,logPath:i,sessionStore:a,lifecycle:o,clearRuntimeHints:s,cleanupFailures:c,repairArmed:l,dispatchTargetedPlatformClose:u,finalizeOrdinaryCloseScript:d}=e,f=async(e,t)=>{try{return await t()}catch(t){c.push({step:e,error:t});return}},p=e.platformResourceCleanup.retainExecutionHostAfterClose({device:n.device,shutdownRequested:t.flags?.shutdown===!0,hasScreenRecording:!!n.screenRecording,hasLease:!!n.lease}),m=a.getRuntimeHints(r);await Hi({address:r,session:n},a,f,e.platformResourceCleanup);let h=l?void 0:await u({req:t,session:n,logPath:i,lifecycle:o});s&&n.appBundleId&&L(m)&&await f(`runtime_hints`,async()=>{await s({appId:n.appBundleId,values:Kt(m)})});let g=await f(`application_lifecycle`,async()=>await o.operations.finalizeApplicationClose({appBundleId:n.appBundleId,surface:n.surface??`app`,retainRunner:p,stateDir:a.resolveDaemonStateDir(),shutdownTarget:t.flags?.shutdown===!0})??{}),_=l?void 0:d({req:t,session:n,sessionStore:a,platformCloseError:h});return await f(`materialized_paths`,()=>Wt(r)),{platformCloseError:h,saveScriptError:_,shutdownResult:g?.shutdown}}async function Hi(e,t,n,r){let{address:i,session:a}=e;await n(`recording`,()=>Lt({session:a,sessionName:i,sessionStore:t})),await n(`app_log`,()=>Ft({session:a,sessionName:i,sessionStore:t})),await n(`audio_probe`,()=>an({session:a,sessionName:i,sessionStore:t})),await n(`perf_capture`,()=>Dt({session:a,sessionName:i,sessionStore:t})),await n(`platform_snapshot_helper`,()=>nn(a,r))}function Ui(e,t){return rn({sessionName:e,phase:`session_close_cleanup_failed`,failures:t})}function Wi(t){if(t instanceof e)return t;let n=t instanceof Error?t.message:String(t);return new e(`COMMAND_FAILED`,`The platform close failed: ${n}`,{hint:`The repair transaction was not committed because the platform close failed; fix the underlying issue and retry close --save-script.`})}const Gi=(e,t)=>(e.positionals?.length??0)>0||Ot(t);async function Ki(e){let{req:t,session:n,logPath:r,sessionStore:i,lifecycle:a}=e,o=Ee(n),s=JSON.stringify(t.positionals??[]);if(o&&!Te(n,s)){let e=await Ji({req:t,session:n,logPath:r,lifecycle:a});if(e)return{response:Li(n,Wi(e))};Oe(n,s)}let c=Ii(i,n,t);return c.kind===`failed`?{response:Li(n,c.error)}:{repairArmed:o,...c.kind===`committed`&&c.path?{healedScriptPath:c.path}:{},...c.kind===`aborted`?{aborted:!0}:{}}}async function qi(e){try{return{providerData:await Bt(e)}}catch(n){let r=t(n);return{response:{ok:!1,error:{...r,hint:`The provider device could not be released. Retry close after the provider is reachable.`,details:{...r.details,session:e.session.name},retriable:!0}}}}}async function Ji(e){let{req:t,session:n,logPath:r,lifecycle:i}=e;if(Gi(t,n))try{await i.operations.closeApplication({positionals:t.positionals??[],outPath:t.flags?.out,appBundleId:n.appBundleId,surface:n.surface??`app`,execution:Pi(t,r,n.trace?.outPath)});return}catch(e){return e}}function Yi(t,n){if(!t.flags?.saveScript||M(n))return;let r=n.scriptPublication;if(r?.kind!==`repair`)throw r===void 0||r.kind===`none`?new e(`INVALID_ARGS`,`close --save-script cannot publish this session: recording was not armed before this journey began, so there is no recording-time target evidence to publish.`,{hint:`Retry with plain close (it tears down without writing). To capture a publishable recording, start a fresh session with open <app> --save-script[=<path>].`}):new e(`INVALID_ARGS`,`close --save-script cannot ${r.status===`published`?`re-publish`:`publish`} this terminal recording. Retry with plain close; it will tear down the session without writing.`)}async function Xi(t){let{req:n,sessionName:r,logPath:i,sessionStore:o,leaseRegistry:s,leaseLifecycleProvider:c}=t,l=o.get(r);if(!l)return await ea({req:n,logPath:i,inspectFacts:t.inspectFacts,bindDevice:t.bindDevice});Yi(n,l);let u=n.positionals?.[0];if(n.internal?.closeAppOnly===!0&&!u)return a(`INVALID_ARGS`,`App-only close requires an app target`);if(!t.platformResourceCleanup)throw new e(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`);let d=t.platformResourceCleanup,f=await Bi({device:l.device,clearRuntimeHints:n.internal?.closeAppOnly!==!0&&!!l.appBundleId&&L(o.getRuntimeHints(r)),inspectFacts:t.inspectFacts,bindDevice:t.bindDevice});if(f.type===`response`)return f.response;if(A(l),n.internal?.closeAppOnly===!0&&u)return await $i({req:n,session:l,logPath:i,lifecycle:f.runtime,app:u});let p=await Ki({req:n,session:l,logPath:i,sessionStore:o,lifecycle:f.runtime});if(`response`in p)return p.response;let m=await Zi({req:n,session:l,sessionName:r,logPath:i,sessionStore:o,leaseRegistry:s,leaseLifecycleProvider:c,lifecycle:f.runtime,clearRuntimeHints:f.clearRuntimeHints,repairArmed:p.repairArmed,platformResourceCleanup:d});return m.kind===`response`?m.response:Qi({session:l,repair:p,requestedSaveScript:!!n.flags?.saveScript,shutdownResult:m.shutdownResult,providerData:m.providerData})}async function Zi(e){let{req:t,session:n,sessionName:r,logPath:i,sessionStore:a,leaseRegistry:o,leaseLifecycleProvider:s,lifecycle:c,clearRuntimeHints:l}=e,u=[],{platformCloseError:d,saveScriptError:f,shutdownResult:p}=await Vi({req:t,session:n,sessionName:r,logPath:i,sessionStore:a,lifecycle:c,clearRuntimeHints:l,cleanupFailures:u,repairArmed:e.repairArmed,dispatchTargetedPlatformClose:Ji,finalizeOrdinaryCloseScript:Ri,platformResourceCleanup:e.platformResourceCleanup}),m=await qi({session:n,leaseRegistry:o,leaseLifecycleProvider:s});if(m.response)return{kind:`response`,response:m.response};let h=Ui(r,u),g=d??h;if(g?n.deviceClaim&&I({level:`warn`,phase:`device_claim_close_effects_unconfirmed`,data:{deviceKey:n.deviceClaim.deviceKey,session:r}}):await mn(n.deviceClaim),a.delete(r),g)throw g;if(f)throw f;return{kind:`closed`,providerData:m.providerData,shutdownResult:p}}function Qi(e){let{session:t,repair:n,requestedSaveScript:r,shutdownResult:i,providerData:a}=e;if(n.aborted&&r)return{ok:!1,error:{code:`COMMAND_FAILED`,message:`The repair was aborted and no script was written.`,hint:`Recovery: replay --from <n> --plan-digest <digest> before closing.`,details:{session:t.name}}};let o=n.healedScriptPath?{savedScript:n.healedScriptPath}:{},s=a?{provider:a}:{},c=`Closed: ${t.name}`;return i?{ok:!0,data:P({session:t.name,shutdown:i,...o,...s},c)}:{ok:!0,data:{session:t.name,...F(c),...o,...s}}}async function $i(e){let{req:t,session:n,logPath:r,lifecycle:i,app:a}=e,o=await Ji({req:t,session:n,logPath:r,lifecycle:i});if(o)throw o;return{ok:!0,data:{app:a,...F(`Closed: ${a}`)}}}async function ea(e){let{req:t,logPath:n,inspectFacts:r,bindDevice:i}=e;if(!t.positionals||t.positionals.length===0)return a(`SESSION_NOT_FOUND`,`No active session`);let o=await Bi({device:await G({session:void 0,flags:t.flags}),clearRuntimeHints:!1,inspectFacts:r,bindDevice:i});return o.type===`response`?o.response:(await o.runtime.operations.closeApplication({positionals:t.positionals,outPath:t.flags?.out,surface:`app`,ensureReady:!0,execution:Pi(t,n)}),{ok:!0,data:{app:t.positionals[0],...F(`Closed: ${t.positionals[0]}`)}})}function ta(e,t){return e.operations.ensureReady(t)}function na(e,t,n){return e.operations.listApps({device:t,filter:n})}async function ra(e){let{req:t,sessionName:n,sessionStore:r}=e;switch(t.command){case`session_list`:return ia(t,r);case`devices`:return await oa(t);case`capabilities`:return await ma({req:t,sessionName:n,sessionStore:r,inspectFacts:e.inspectFacts});case`apps`:return await ba({req:t,sessionName:n,sessionStore:r,bindDevice:e.bindDevice,inspectFacts:e.inspectFacts,providerAppCatalog:e.providerAppCatalog});default:return null}}function ia(e,t){let n=Vn(e);return{ok:!0,data:{sessions:t.listRefs().filter(e=>Kn(e.session,n)).map(e=>aa(e,t))}}}function aa({address:e,session:t},n){let r=n.resolveSessionDir(e);return{name:t.name,address:e,sessionStateDir:r,runnerLogPath:pt(r),platform:d(t.device),...h(t.device.platform)&&t.device.appleOs?{appleOs:t.device.appleOs}:{},target:t.device.target??`mobile`,surface:t.surface??`app`,device:t.device.name,id:t.device.id,device_id:t.device.id,createdAt:t.createdAt,...h(t.device.platform)&&!p(t.device)&&{device_udid:t.device.id,ios_simulator_device_set:t.device.simulatorSetPath??null}}}async function oa(e){try{let t=sa();return{ok:!0,data:{devices:(await la(e)).map(e=>({...Da(e),...ca(e,t)}))}}}catch(e){let t=i(e);return{ok:!1,error:{code:t.code,message:t.message,...t.details?{details:t.details}:{}}}}}function sa(){let e=new Map;for(let t of cn({})){let n=t.claim;!n||ln(t.classification)||e.set(n.deviceKey,{session:n.session,workspace:n.workspace})}return e}function ca(e,t){let n=t.get(sn(An(e)));return n?{claimedBy:n}:{}}async function la(e){let t=e.flags?.platform;return pa(await In(ua(e,t)),e.flags?.platform,e.flags?.target)}function ua(e,t){let n=e.flags;return{platform:t,target:n?.target,deviceName:n?.device,udid:n?.udid,serial:n?.serial,iosSimulatorSetPath:da(n?.iosSimulatorDeviceSet,t,n?.target),androidSerialAllowlist:fa(n?.androidDeviceAllowlist)}}function da(e,t,n){return u({simulatorSetPath:Pn(e),platform:t,target:n})}function fa(e){let t=R(e);return t?Array.from(t).sort():void 0}function pa(e,t,n){let r=t?e.filter(e=>Oa(e,t)):e;return n?r.filter(e=>(e.target??`mobile`)===n):r}async function ma(e){let t=await Ea({...e,androidAvdSelection:`include-stopped`});if(`response`in t)return t.response;let{device:n}=t,r=ha(n,e.sessionStore.get(e.sessionName),e.req.flags),i=await Ca(n,e.inspectFacts);return{ok:!0,data:{device:Da(n),availableCommands:xe().filter(e=>e===`appstate`&&r?!0:va(e,i))}}}function ha(e,t,n){return!t||!f(e)&&!p(e)||!vr(n,t)?!1:ga(t)||_a(e,t)}function ga(e){return!!(e.appName||e.appBundleId)}function _a(e,t){return!!(p(e)&&t.surface!==void 0&&t.surface!==`app`&&t.surface!==`frontmost-app`)}function va(e,t){let n=de(e);return!n||!t?!1:n.some(e=>e.length>0&&e.every(e=>ya(t,e)))}function ya(e,t){return Object.hasOwn(e.operations,t)?e.operations[t]?.available===!0:!1}async function ba(e){let{req:t,sessionName:n,sessionStore:r,bindDevice:i,inspectFacts:a}=e,o=await xa(t,e.providerAppCatalog);if(o)return o;let s=await Ea({req:t,sessionName:n,sessionStore:r,androidAvdSelection:`include-stopped`});if(`response`in s)return s.response;let{device:c}=s,l=rt(t.flags?.appsFilter),u=R(t.flags?.androidDeviceAllowlist),d=await wa({device:c,inspectFacts:a,bindDevice:i});if(`response`in d)return d.response;let f=d.runtime;return Ta(await na(f,await ta(f,{serial:t.flags?.serial,androidSerialAllowlist:u?[...u].sort():void 0}),l))}async function xa(e,t){let n=Sa(e);if(!(!t||!n||!t.supports(n.provider)))return{ok:!0,data:{apps:[...await t.list(n,xt(e.meta?.requestId))]}}}function Sa(e){let t=Mn(e);if(t.leaseId)return;let n=t.leaseProvider;if(!n)return;let r=e.flags?.platform;if(r===`android`||r===`ios`)return{provider:n,platform:r,...e.internal?.publicNetworkOnly?{publicNetworkOnly:!0}:{}}}async function Ca(e,t){if(t)try{return await t(e)}catch{return}}async function wa(t){if(!t.inspectFacts)throw new e(`COMMAND_FAILED`,`Device runtime facts inspection is unavailable.`,{reason:`runtime-gateway-missing`});let n=await t.inspectFacts(t.device),r=[n.operations.ensureReady,n.operations.listApps].find(e=>!e.available);if(r&&!r.available)return{response:{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`apps is not supported on this device`,...r.hint?{hint:r.hint}:{}}}};if(!t.bindDevice)throw new e(`COMMAND_FAILED`,`Device runtime binding is unavailable.`,{reason:`runtime-gateway-missing`});return{runtime:await t.bindDevice(t.device,ge)}}function Ta(e){return{ok:!0,data:{apps:e.map(e=>e.name&&e.name!==e.id?`${e.name} (${e.id})`:e.id)}}}async function Ea(e){let{req:t,sessionName:n,sessionStore:r,androidAvdSelection:i}=e,a=r.get(n),o=t.flags??{},s=W(t.command,a,o);return s?{response:s}:{device:await G({session:a,flags:o,androidAvdSelection:i})}}function Da({simulatorSetPath:e,iosPhysicalDeviceBackend:t,appleOs:n,...r}){return{...r,platform:d({platform:r.platform,appleOs:n}),...h(r.platform)&&n?{appleOs:n}:{}}}function Oa(e,t){return _(e,t)}function q(e){return a(`INVALID_ARGS`,e)}function ka(t,n,r,i){try{return ir({device:t,surfaceFlag:n,openTarget:r,existingSurface:i})}catch(t){return a(t instanceof e?t.code:`INVALID_ARGS`,String(t.message))}}async function Aa(e){let{shouldRelaunch:t,openTarget:n,surface:r,device:i}=e;if(!t)return null;let a=await rr({target:n,platform:i.platform,surface:r});return a?q(a):null}async function ja(e){let{shouldRelaunch:t,openTarget:n,platform:r}=e;if(!t)return null;let i=await rr({target:n,platform:r});return i?q(i):null}function Ma(e){let t=tn(e);if(!t.ok)return{type:`response`,response:t};let{runtime:n,previousRuntime:r,replacedStoredRuntime:i}=t.data;return{type:`plan`,plan:{runtime:n,previousRuntime:r,replacedStoredRuntime:i,applyRuntimeHints:L(n),clearRemovedRuntimeHints:Ht({replacedStoredRuntime:i,previousRuntime:r,runtime:n,session:e.existingSession})}}}async function Na(t){let{req:n,logPath:r,surface:i,openTarget:a,existingSession:o,runtime:c,runtimeHintPlan:l,clearRuntimeHints:u,foreground:d}=t;await c.operations.prepareApplicationOpen({target:a,currentAppBundleId:o?.appBundleId,hasExistingSession:o!==void 0,surface:i,prewarmRunnerOnColdBoot:i===`app`&&!!a&&!s(a??``),execution:{startupDeadlineAtMs:Fa(n),requestId:n.meta?.requestId,logPath:r,traceLogPath:o?.trace?.outPath,verbose:n.flags?.verbose,iosXctestrunFile:n.flags?.iosXctestrunFile,iosXctestDerivedDataPath:n.flags?.iosXctestDerivedDataPath,iosXctestEnvDir:n.flags?.iosXctestEnvDir,runnerLeaseContext:jn(n)}});let{appBundleId:f,appName:p}=await Pa({runtime:c,surface:i,openTarget:a,existingAppBundleId:o?.appBundleId,foreground:d});if(l.clearRemovedRuntimeHints){if(!u)throw new e(`COMMAND_FAILED`,`Runtime hint clear operation was not admitted for this open.`,{reason:`runtime-hints-operation-missing`});await zt({replacedStoredRuntime:l.replacedStoredRuntime,previousRuntime:l.previousRuntime,runtime:l.runtime,session:o,clearRuntimeHints:u})}return{type:`details`,details:{appBundleId:f,appName:p,runtime:l.runtime}}}async function Pa(e){let{runtime:t,surface:n,openTarget:r,existingAppBundleId:i,foreground:a}=e,o=await t.operations.resolveOpenTarget({target:r,currentAppBundleId:i,surface:n,foreground:a});return{appBundleId:o.appBundleId,appName:o.appName}}function Fa(e){let t=e.flags?.timeoutMs;return typeof t==`number`&&Number.isFinite(t)&&t>0?Date.now()+t:void 0}async function Ia(e){let{req:t,hasExistingSession:n}=e;return t.flags?.foreground===!0?t.positionals?.[0]?{type:`resolved`,req:t}:n?{type:`response`,response:a(`INVALID_ARGS`,`open --foreground only applies to a fresh session. Close the current session first, or omit --foreground.`)}:t.flags?.udid!==void 0||t.flags?.device!==void 0?{type:`response`,response:a(`INVALID_ARGS`,`open --foreground resolves the device itself; drop --udid/--device or open explicitly: agent-device open <app> --udid <udid>.`)}:t.flags?.platform!==void 0&&t.flags.platform!==`ios`?{type:`response`,response:a(`INVALID_ARGS`,`open --foreground only supports --platform ios; drop the flag or pass --platform ios.`)}:{type:`resolved`,req:{...t,flags:{...t.flags,platform:`ios`}}}:{type:`not-requested`}}async function La(e){let{req:n,sessionName:r,logPath:i,sessionStore:a,openResponse:o}=e;if(!o.ok||n.flags?.foreground!==!0)return o;try{let t=await or({req:{...n,command:`snapshot`,positionals:[],flags:{...n.flags,snapshotInteractiveOnly:!0}},sessionName:r,logPath:i,sessionStore:a,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});return t.ok?{ok:!0,data:{...o.data,snapshot:t.data}}:Ra(o.data,t.error)}catch(e){return Ra(o.data,t(e))}}function Ra(e,t){return{ok:!0,data:{...e,warnings:[...nt(e),`The session is open, but the initial interactive snapshot failed (${t.code}: ${t.message}). Run: agent-device snapshot -i`],initialSnapshotError:t}}}function za(e){let{sessionName:t,sessionStateDir:n,runnerLogPath:r,requestLogPath:i,eventLogPath:a,appName:o,appBundleId:s,surface:c,startup:l,timing:u,device:p,runtime:h,runtimeHintCount:g,sessionReused:_,selection:v}=e,y={session:t,surface:c,sessionStateDir:n,runnerLogPath:r,requestLogPath:i,eventLogPath:a,sessionReused:_,...Ba(v)};return o&&(y.appName=o),s&&(y.appBundleId=s),l&&(y.startup=l),u&&(y.timing=u),h&&g(h)>0&&(y.runtime=h),p&&(y.platform=d(p),y.target=p.target??`mobile`,y.device=p.name,y.id=p.id,y.kind=p.kind,m(p.platform)&&(y.serial=p.id)),p&&f(p)&&(y.device_udid=p.id,y.ios_simulator_device_set=p.simulatorSetPath??null),{...y,...F(`Opened: ${o??s??t}`)}}function Ba(e){if(!e)return{};let{device:t,...n}=e;return{selection:n}}function Va(e){let{existingSession:t,sessionName:n,sessionScope:r,device:i,surface:a,appBundleId:o,appName:s}=e;return t?{...t,device:i,surface:a,appBundleId:o,appName:s,snapshot:void 0}:{name:n,sessionScope:r,device:i,createdAt:Date.now(),surface:a,appBundleId:o,appName:s,actions:[]}}const Ha=Object.freeze({async observeBootTimeMs(e){if(f(e)&&e.kind===`simulator`){let{observeSimulatorBootTimeMs:t}=await import(`./simulator-boot.js`);return await t(e)}if(e.platform===`android`){let{observeAndroidBootTimeMs:t}=await import(`./device-boot.js`);return await t(e)}return{observed:!1,reason:`unsupported-device`}}});function Ua(e,t){e.warnings=[...nt(e),t]}function Wa(e){return e.internal?.resolvedSessionScope??Vn(e)}function Ga(e){let{session:t,existingSession:n,saveScriptRequested:r,responseData:i}=e;if(!n&&r){We(t,{});return}M(n)&&(Ze(t),Ua(i,`Script publication was aborted because this session completed a second open. Start a fresh session with open --save-script to author another script.`))}function Ka(e){return`Took the device from session "${e.session}" in workspace "${e.workspace}": that device rebooted after its claim was taken, so its app and runner were already gone.`}function qa(e,t){if(e.platform!==`android`)return!1;let n=t.flags?.testIme;return n===void 0?e.kind===`emulator`:n}function Ja(e,t,n){return{durationMs:Math.max(0,Date.now()-e),measuredAt:new Date().toISOString(),method:`open-command-roundtrip`,appTarget:t,appBundleId:n}}async function Ya(e,t){if(!t)return;let n=await dn(t);if(n.status!==`renewed`)return n.conflict?Xt(e,n.conflict):a(`DEVICE_IN_USE`,`${e.name} no longer holds the claim this open was made with.`,{reason:`claim-lost-during-open`,deviceKey:t.deviceKey,hint:`Close this session and open the device again to claim it.`})}async function Xa(e){let{req:t,sessionName:r,sessionStore:i,logPath:o,device:s,openTarget:c,openPositionals:l,appName:u,surface:d,appBundleId:f,runtimeHints:p,lifecycle:m,applyRuntimeHints:h,existingSession:g,deviceClaim:_,tookOverDeviceClaim:v,selection:y}=e,b=t.flags?.relaunch===!0,x=f,ee=Date.now(),S=await Za({req:t,sessionName:r,sessionStore:i,device:s,surface:d,sessionAppBundleId:x,appName:u,existingSession:g});if(S.type===`response`)return S.response;let C=S.session??g,te=Date.now(),ne=await m.operations.openApplication({target:c,positionals:l,outPath:t.flags?.out,runtimeLaunchUrl:p?.launchUrl,appBundleId:x,surface:d,hasExistingSession:g!==void 0,relaunch:b,prewarmRunnerBeforeOpen:t.flags?.maestro?.prewarmRunnerBeforeOpen===!0,enableTestIme:qa(s,t),stateDir:i.resolveDaemonStateDir(),runtimeHints:Kt(p),applyRuntimeHints:h,execution:Pi(t,o,g?.trace?.outPath)});x=ne.appBundleId??x;let w={...ne.timing},re=Zn(y),ie=c?Ja(te,c,x):void 0;if(bt(t.meta?.requestId)){let e=n();return a(e.code,e.message,e.details)}g&&Fe({session:g,command:`open`,positionals:[],flags:void 0});let T=Va({existingSession:C,sessionName:g?.name??Un(t),sessionScope:g?.sessionScope??Wa(t),device:s,surface:d,appBundleId:x,appName:u});T.lease=en({req:t,existingLease:g?.lease}),_&&(T.deviceClaim=_),t.runtime!==void 0&&Ut(i,r,p);let E=i.ensureSessionDir(r),ae=mt(E,t.meta?.requestId??ot().requestId);w.totalDurationMs=Math.max(0,Date.now()-ee),I({level:`info`,phase:`open_timing`,durationMs:w.totalDurationMs,data:w});let D=za({sessionName:T.name,sessionStateDir:E,runnerLogPath:pt(E),requestLogPath:ae,eventLogPath:i.resolveEventLogPath(r),appName:u,appBundleId:x,surface:d,startup:ie,timing:w,device:s,runtime:p,runtimeHintCount:Gt,sessionReused:g!==void 0,selection:re});return v&&Ua(D,Ka(v)),Ga({session:T,existingSession:g,saveScriptRequested:!!t.flags?.saveScript,responseData:D}),i.set(r,T),i.recordAction(T,{command:`open`,positionals:l,flags:t.flags??{},runtime:t.runtime===void 0?void 0:p,result:D}),{ok:!0,data:D}}async function Za(e){let{req:t,sessionName:n,sessionStore:r,existingSession:i}=e,a=t.internal?.openLifecycle?.beforeDispatch;if(!a)return{type:`session`,session:i};let o=Qa(e);r.set(n,o);let s=await a();return s&&!s.ok?{type:`response`,response:s}:{type:`session`,session:r.get(n)??o}}function Qa(e){let{req:t,device:n,surface:r,sessionAppBundleId:i,appName:a,existingSession:o}=e,s=Va({existingSession:o,sessionName:o?.name??Un(t),sessionScope:o?.sessionScope??Wa(t),device:n,surface:r,appBundleId:i,appName:a});return s.lease=en({req:t,existingLease:o?.lease}),s}function $a(e){let{req:t,device:n,sessionStore:r}=e,i=r.findByDevice(n.id);if(!i)return;let a=Mt(t);return Gn(t,i.session)?Hn(i,n,a):Jn(i,n,a)}async function eo(e){let{req:t,device:n,owner:r,sessionName:i,sessionStore:a,reconcileOrphanedDeviceClaim:o}=e;switch($t(r)){case`none`:return{status:`not-required`};case`allocator-held`:{let e=qt(n,r,Qt({device:n,owner:r,stateDir:a.resolveDaemonStateDir(),intent:{kind:`ordinary`}}));return e?{status:`refused`,response:e}:{status:`not-required`}}case`ordinary`:return await kn({device:n,session:i,workspace:t.meta?.cwd??process.cwd(),stateDir:a.resolveDaemonStateDir(),reconcileOrphanedDeviceClaim:o,observeDeviceBoot:Ha})}}async function to(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,device:a,surface:o,openTarget:s,lifecycle:c,runtimeHintPlan:l,applyRuntimeHints:u,clearRuntimeHints:d,reconcileOrphanedDeviceClaim:f,selection:p}=e,m=$a({req:t,device:a,sessionStore:i});if(m)return m;let h=await eo({req:t,device:a,owner:c.owner,sessionName:n,sessionStore:i,reconcileOrphanedDeviceClaim:f});if(h.status===`conflict`)return Xt(a,h.conflict);if(h.status===`refused`)return h.response;let g=h.status===`acquired`?h.ownership:void 0,_=h.status===`acquired`?h.tookOver:void 0,v={mayHaveStarted:!1},y=async()=>await no({ownership:g,effects:v,sessionName:n,sessionStore:i});try{let e=await Na({req:t,logPath:r,surface:o,openTarget:s,runtime:c,runtimeHintPlan:l,clearRuntimeHints:d,foreground:t.flags?.foreground===!0&&s===void 0});if(e.type===`response`)return await y(),e.response;let f=await Ya(a,g);if(f)return f;v.mayHaveStarted=!0;let m=t.positionals??[],h=s??e.details.appBundleId,b=await Xa({req:t,sessionName:n,sessionStore:i,logPath:r,device:a,openTarget:h,openPositionals:m.length>0?m:h?[h]:[],appBundleId:e.details.appBundleId,appName:e.details.appName,runtimeHints:e.details.runtime,lifecycle:c,applyRuntimeHints:u,surface:o,deviceClaim:g,tookOverDeviceClaim:_,selection:p});return b.ok||await y(),b}catch(e){throw await y(),e}}async function no(e){let{ownership:t,effects:n,sessionName:r,sessionStore:i}=e;if(!t)return;if(!n.mayHaveStarted){await mn(t);return}if(i.get(r)?.deviceClaim?.ownerToken===t.ownerToken)return;let a=await fn(t);I({level:`warn`,phase:`device_claim_open_effects_unconfirmed`,data:{deviceKey:t.deviceKey,outcome:a}})}const ro=new Map;async function io(e){let t=C({applyRuntimeHints:e.runtimeHintPlan.applyRuntimeHints,clearRemovedRuntimeHints:e.runtimeHintPlan.clearRemovedRuntimeHints}),n=await Le({...e,command:`open`,required:t.use.required});if(n.type===`response`)return n;let r=n.bind;switch(t.kind){case`open`:return{type:`runtime`,runtime:await r(e.device,ae)};case`open-apply-runtime-hints`:{let t=await r(e.device,ee);return{type:`runtime`,runtime:t,applyRuntimeHints:t.operations.applyRuntimeHints}}case`open-clear-runtime-hints`:{let t=await r(e.device,te);return{type:`runtime`,runtime:t,clearRuntimeHints:t.operations.clearRuntimeHints}}case`open-apply-and-clear-runtime-hints`:{let t=await r(e.device,oe);return{type:`runtime`,runtime:t,applyRuntimeHints:t.operations.applyRuntimeHints,clearRuntimeHints:t.operations.clearRuntimeHints}}}}async function ao(e){let t=Ma(e);if(t.type===`response`)return t;let n=await io({device:e.device,runtimeHintPlan:t.plan,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});return n.type===`response`?n:{type:`runtime`,runtimeHintPlan:t.plan,admission:n}}async function oo(e){let{sessionName:t,logPath:n,sessionStore:r}=e,i=r.get(t),o=await Ia({req:e.req,hasExistingSession:!!i});if(o.type===`response`)return o.response;let s=o.type===`resolved`?o.req:e.req;if(i){if(s.flags?.saveScript)return a(`INVALID_ARGS`,`open --save-script can only arm a fresh session. Use the current session without --save-script, or close it and start a fresh session.`);let o=s.flags?.relaunch===!0,c=s.positionals?.[0],l=c??(o?i.appName:void 0),u=ka(i.device,s.flags?.surface,l,i.surface);if(typeof u!=`string`)return u;if(!l&&u===`app`)return q(o?`open --relaunch requires an app name or an active session app.`:`Session already active. Close it first or pass a new --session name.`);let d=await Aa({shouldRelaunch:o,openTarget:l,surface:u,device:i.device});if(d)return d;let f=await Ya(i.device,i.deviceClaim);if(f)return f;let p=await _r(i.device),m=Qn(p);await s.internal?.retainDeviceExecutionLock?.(p.id);let h=await ao({req:s,sessionStore:r,sessionName:t,device:p,existingSession:i,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(h.type===`response`)return h.response;let{admission:g,runtimeHintPlan:_}=h;A(i);let v=await Na({req:s,logPath:n,surface:u,openTarget:l,existingSession:i,runtime:g.runtime,runtimeHintPlan:_,clearRuntimeHints:g.clearRuntimeHints,foreground:!1});return v.type===`response`?v.response:await Ya(p,i.deviceClaim)||await Xa({req:s,sessionName:t,sessionStore:r,logPath:n,device:p,openTarget:l,openPositionals:c?s.positionals??[]:l?[l]:[],appBundleId:v.details.appBundleId,appName:v.details.appName,runtimeHints:v.details.runtime,lifecycle:g.runtime,applyRuntimeHints:g.applyRuntimeHints,surface:u,existingSession:i,selection:m})}let c=s.flags?.relaunch===!0,l=s.positionals?.[0];if(c&&!l)return q(`open --relaunch requires an app argument.`);let u=await ja({shouldRelaunch:c,openTarget:l,platform:s.flags?.platform===`android`?`android`:void 0});if(u)return u;let d=await zn(s.flags??{},At(l)),f=d.device;await s.internal?.retainDeviceExecutionLock?.(f.id);let p=ka(f,s.flags?.surface,l);if(typeof p!=`string`)return p;let m=await Aa({shouldRelaunch:c,openTarget:l,surface:p,device:f});if(m)return m;let h=await ao({req:s,sessionStore:r,sessionName:t,device:f,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(h.type===`response`)return h.response;let{admission:g,runtimeHintPlan:_}=h;return await gt(ro,f.id,async()=>await to({req:s,sessionName:t,logPath:n,sessionStore:r,device:f,surface:p,openTarget:l,lifecycle:g.runtime,runtimeHintPlan:_,applyRuntimeHints:g.applyRuntimeHints,clearRuntimeHints:g.clearRuntimeHints,reconcileOrphanedDeviceClaim:e.reconcileOrphanedDeviceClaim,selection:d}))}async function so(e){let t=await oo(e);return!t.ok||e.req.flags?.foreground!==!0?t:await La({...e,inspectFacts:V(e.inspectFacts),bindDevice:B(e.bindDevice),openResponse:t})}const co=`iOS appstate requires an active session on the target device. Run open first (for example: open --session sim --platform ios --device "<name>" <app>).`,lo=`macOS appstate requires an active session on the target device. Run open first (for example: open --session macos --platform macos "System Settings").`;function uo(e){return t=>a(e?`INVALID_ARGS`:`UNSUPPORTED_OPERATION`,e?`boot --headless is supported only for Android emulators.`:`boot is not supported on this device`,void 0,t.hint?{hint:t.hint}:void 0)}function fo(t){if(t)return t;throw new e(`COMMAND_FAILED`,`Device runtime facts inspection is unavailable.`,{reason:`runtime-gateway-missing`})}function po(t){if(t)return t;throw new e(`COMMAND_FAILED`,`Device runtime binding is unavailable.`,{reason:`runtime-gateway-missing`})}function mo(e){return e.available?null:a(`UNSUPPORTED_OPERATION`,`shutdown is supported only for Apple simulators and Android emulators.`,void 0,e.hint?{hint:e.hint}:void 0)}function ho(e,t){return!!(e?.trim()||t?.platform===`android`&&t.kind===`emulator`)}async function go(e,t){if(!t.appBundleId)return;let n=await j({command:`appstate`,device:t.device,use:me,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(n.type!==`response`)try{return(await n.runtime.operations.appState({appBundleId:t.appBundleId})).applicationState}catch(e){if(r(e))throw e;I({level:`warn`,phase:`apple_appstate_runner_read_failed`,data:{code:i(e).code,message:i(e).message}});return}}async function _o(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n),o=t.flags??{},s=o.platform;if(!i&&gr(o)){let e=s===`ios`?`No active session "${n}". Run open with --session ${n} first.`:`No active session "${n}". Run open with --session ${n} first, or omit --session to query by device selector.`;return a(`SESSION_NOT_FOUND`,e)}let c=W(`appstate`,i,o);if(c)return c;let l=h(i?.device.platform)&&vr(o,i),u=s===`ios`,m=s===`macos`;if(u&&!l)return a(`SESSION_NOT_FOUND`,co);if(m&&!l)return a(`SESSION_NOT_FOUND`,lo);if(l&&i){let t=i.appName??i.appBundleId;if(!i.appName&&!i.appBundleId){if(p(i.device)&&i.surface&&i.surface!==`app`&&i.surface!==`frontmost-app`)return{ok:!0,data:{platform:d(i.device),appName:i.surface,appBundleId:i.appBundleId,source:`session`,surface:i.surface}};let e=p(i.device)?`macOS`:`iOS`;return a(`COMMAND_FAILED`,`No foreground app is tracked for this ${e} session. Open an app in the session, then retry appstate.`)}let n=await go(e,i);return{ok:!0,data:{platform:d(i.device),appName:t??`unknown`,appBundleId:i.appBundleId,source:n?`runner`:`session`,...n?{state:n}:{},surface:i.surface??`app`,...f(i.device)?{device_udid:i.device.id,ios_simulator_device_set:i.device.simulatorSetPath??null}:{}}}}let g=await G({session:i,flags:o});if(f(g))return a(`SESSION_NOT_FOUND`,co);if(p(g))return a(`SESSION_NOT_FOUND`,lo);let _=await j({command:`appstate`,device:g,use:me,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,unavailableResponse:e=>a(`UNSUPPORTED_OPERATION`,g.platform===`web`?`appstate is not supported on web.`:`appstate is not supported on this device`,void 0,e.hint?{hint:e.hint}:void 0)});if(_.type===`response`)return _.response;let v=_.runtime;await v.operations.ensureReady({serial:o.serial,androidSerialAllowlist:yo(o.androidDeviceAllowlist)});let y=await v.operations.appState();return{ok:!0,data:{platform:d(g),package:y.package,activity:y.activity}}}async function vo(e){let{req:t,sessionName:n,sessionStore:r}=e;if(t.command===`boot`){let o=r.get(n),s=t.flags??{},c=W(t.command,o,s);if(c)return c;let l=R(s.androidDeviceAllowlist),u=l?[...l].sort():void 0,f=re({headless:s.headless===!0}),p;try{p=await G({session:o,flags:s,androidAvdSelection:`include-stopped`})}catch(e){let t=i(e);if(f.kind===`boot-target-headless`&&!ho(s.device,o?.device)&&t.code===`DEVICE_NOT_FOUND`)return a(`INVALID_ARGS`,`boot --headless requires --device <avd-name> (or an Android emulator session target).`);throw e}if(s.target&&(p.target??`mobile`)!==s.target)return a(`DEVICE_NOT_FOUND`,`No ${p.platform} device found matching --target ${s.target}.`);let m=await Le({command:`boot`,device:p,required:f.use.required,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,unavailableResponse:uo(f.kind===`boot-target-headless`)});if(m.type===`response`)return m.response;let g={serial:s.serial,androidSerialAllowlist:u};return p=f.kind===`boot-target-headless`?await(await m.bind(p,f.use)).operations.bootTargetHeadless(g):await(await m.bind(p,f.use)).operations.bootTarget(g),{ok:!0,data:{platform:d(p),target:p.target??`mobile`,device:p.name,id:p.id,kind:p.kind,booted:!0,...h(p.platform)&&p.appleOs?{appleOs:p.appleOs}:{}}}}if(t.command===`shutdown`){let i=r.get(n),o=t.flags??{},s=W(t.command,i,o);if(s)return s;let c=await G({flags:o,session:i,androidAvdSelection:`include-stopped`}),l=mo((await fo(e.inspectFacts)(c)).operations.shutdownTarget);if(l)return l;if(i&&i.device.platform===c.platform&&i.device.id===c.id)return a(`DEVICE_IN_USE`,`Cannot shut down an active session device directly. Use close --shutdown to end the session and turn off the simulator/emulator.`,{hint:`Run agent-device close --shutdown --session ${n}`,session:n,platform:d(c),target:c.target??`mobile`,device:c.name,id:c.id,kind:c.kind});let u=await(await po(e.bindDevice)(c,D)).operations.shutdownTarget();return u.success?{ok:!0,data:{platform:d(c),target:c.target??`mobile`,device:c.name,id:c.id,kind:c.kind,shutdown:u,...h(c.platform)&&c.appleOs?{appleOs:c.appleOs}:{}}}:a(u.error?.code??`COMMAND_FAILED`,bo(u),{platform:d(c),target:c.target??`mobile`,device:c.name,id:c.id,kind:c.kind,shutdown:u})}return t.command===`appstate`?await _o({req:t,sessionName:n,sessionStore:r,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice}):null}function yo(e){let t=R(e);return t?[...t].sort():void 0}function bo(e){let t=e.error?.message??e.stderr.trim();return t.length>0?t:`Shutdown failed`}function xo(e){let t=ct(e);if(t===void 0)return{exists:!1,sizeBytes:0};try{let e=U.fstatSync(t);return{exists:!0,sizeBytes:e.size,modifiedAt:e.mtime.toISOString()}}finally{U.closeSync(t)}}function So(e,t){sr(e);let n=`[agent-device][mark][${new Date().toISOString()}] ${t.trim()||`marker`}\n`,r=lt(e);try{U.writeFileSync(r,n,`utf8`)}finally{U.closeSync(r)}}function Co(e){let t=H.dirname(e),n=H.basename(e);U.existsSync(t)||U.mkdirSync(t,{recursive:!0});let r=st(e);try{U.fsyncSync(r)}finally{U.closeSync(r)}let i=0;for(let e of U.readdirSync(t)){if(!e.startsWith(`${n}.`))continue;let r=e.slice(n.length+1);if(/^\d+$/.test(r))try{U.unlinkSync(H.join(t,e)),i+=1}catch{}}return{path:e,cleared:!0,removedRotatedFiles:i}}function wo(e){return On.createNextFence({admissionLedger:e.ledger,resourcePath:e.resourcePath,device:e.device})}async function To(e){try{return await Eo(e)}catch(e){return{ok:!1,error:t(e)}}}async function Eo(e){let t=Do(e);if(!t.ok)return t;let n=t.session,r=w(e.req.positionals),i=await e.inspectFacts(n.device),a=i.operations.audioProbeStart,o=i.operations.audioProbeQuery,s=a.available?`capture`:o.available?`query`:void 0;if(s===void 0)return Oo(a,o);let c=ie({probeAction:r.probeAction,mode:s});switch(c.kind){case`query`:return{ok:!0,data:await(await e.bindDevice(n.device,c.use)).operations.audioProbeQuery({action:c.action,durationMs:r.durationMs,bucketMs:r.bucketMs})};case`capture-start`:return await ko(e,n,r,c.use);case`capture-status`:return await Ao(e,n);case`capture-stop`:return await jo(e,n)}}function Do(e){let t=e.sessionStore.get(e.sessionName);return t?{ok:!0,session:t}:a(`SESSION_NOT_FOUND`,`audio requires an active session`)}function Oo(e,t){let n=(e.available?void 0:e.hint)??(t.available?void 0:t.hint);return a(`UNSUPPORTED_OPERATION`,n??`audio is supported for web browser sessions, macOS sessions, iOS simulators, and Android emulators on macOS hosts`)}async function ko(e,t,n,r){if(t.audioProbe){await hn({intent:`disposal`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore});let n=e.sessionStore.get(e.sessionName);if(!n)return a(`SESSION_NOT_FOUND`,`audio requires an active session`);t=n}let i=await e.bindDevice(t.device,r),o=En.store.resolvePath(e.sessionStore.resolveSessionDir(e.sessionName)),s=En.createNextFence({admissionLedger:e.audioProbeAdmissionLedger,resourcePath:o,device:t.device}),c=H.join(e.sessionStore.ensureSessionDir(e.sessionName),`audio-probe.json`),l=await i.operations.audioProbeStart({sessionId:e.sessionName,statusPath:c,durationMs:n.durationMs,bucketMs:n.bucketMs,fence:s});await wn({admissionLedger:e.audioProbeAdmissionLedger,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore,device:t.device,owner:i.owner,fence:s,...l,throwIfCanceled:e.throwIfCanceled});let u=e.sessionStore.get(e.sessionName)?.audioProbe;if(!u)throw TypeError(`Audio probe adoption did not publish a live handle`);return{ok:!0,data:await u.handle.status()}}async function Ao(e,t){let n=t.audioProbe;if(!n)return{ok:!0,data:Mo()};let r=await n.handle.status();return r.state===`stopped`&&await hn({intent:`disposal`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore}),{ok:!0,data:r}}async function jo(e,t){return t.audioProbe?{ok:!0,data:await hn({intent:`capture`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore})}:{ok:!0,data:Mo()}}function Mo(){return un({state:`stopped`,source:`system-audio`,backend:`host-system-audio`,durationMs:0,bucketMs:0,sourceCount:0,reason:`not-started`,notes:[`No active host audio probe is running.`]})}async function No(n){let r=n.sessionStore.get(n.sessionName);if(!r)return a(`SESSION_NOT_FOUND`,`perf requires an active session. Run open first.`);try{if(et(n.req.positionals?.[0]))throw new e(`INVALID_ARGS`,tt);es(n.req);let t=Dn({positionals:n.req.positionals,kind:ns(n.req.flags?.kind),outPath:ns(n.req.flags?.out)}),i=Cn(t);if(i.kind===`capture-stop`)return Po(n,await Ro(n,r,i.request));let o=await Xn({device:r.device,plan:i,inspectFacts:n.inspectFacts});return o.admitted?Po(n,await Fo(n,r,o)):z(`perf`,o.fact)??a(`UNSUPPORTED_OPERATION`,`perf is not supported on this device`)}catch(e){return{ok:!1,error:t(e)}}}function Po(e,t){if(!t.ok)return t;let n=e.sessionStore.get(e.sessionName);return O(e.sessionStore,n,e.req,`perf`,Yo(t.data)?{...t.data}:{}),t}async function Fo(t,n,r){let{device:i,plan:a}=Yn(r),o=B(t.bindDevice);switch(a.kind){case`frames`:return{ok:!0,data:Wo(n,await(await o(i,a.use)).operations.perfFrames({appId:n.appBundleId}))};case`memory-sample`:return{ok:!0,data:Xo(n,await(await o(i,a.use)).operations.perfMemorySample({appId:n.appBundleId}))};case`memory-snapshot`:return{ok:!0,data:Zo(n,await(await o(i,a.use)).operations.perfMemorySnapshot({appId:n.appBundleId,kind:a.request.kind,outPath:a.request.outPath?k.expandHome(a.request.outPath,t.req.meta?.cwd):void 0,artifactsDir:H.join(t.sessionStore.ensureSessionDir(t.sessionName),`artifacts`)}))};case`capture-start`:return await Io(t,n,await o(i,a.use),a.request);case`profile-report`:{let r=await o(i,a.use),s=n.lastPerfProfile,c=a.request.tracePath??s?.outPath;if(!c)throw new e(`INVALID_ARGS`,`perf cpu profile report requires a stopped profile trace or tracePath option`);if(n.perfCapture)throw new e(`INVALID_ARGS`,`perf cpu profile report requires a stopped profile trace; stop the active capture first.`);let l=$o(t,a.request.outPath,`cpu-report.json`);return{ok:!0,data:{perf:`reported`,...await r.operations.perfProfileReport({appId:n.appBundleId,kind:a.request.kind,tracePath:k.expandHome(c,t.req.meta?.cwd),outPath:l,template:a.request.template??(s?.kind===`xctrace`?s.template:void 0),profile:s})}}}}}async function Io(e,t,n,r){if(t.perfCapture)return a(`INVALID_ARGS`,`native perf capture already in progress`);if(!t.appBundleId)return a(`COMMAND_FAILED`,`No app is associated with this session.`,{hint:`Run open <app> first so perf can resolve the app process identity.`});let i=r.kind===`xctrace`?`perf-${r.area===`cpu`?`cpu-profile`:`trace`}.trace`:r.kind===`perfetto`?`app.perfetto-trace`:`cpu.perf.data`,o=$o(e,r.outPath,i),s=pn.store.resolvePath(e.sessionStore.resolveSessionDir(e.sessionName)),c=pn.createNextFence({admissionLedger:Lo(e),resourcePath:s,device:t.device}),l=await n.operations.perfNativeCaptureStart({sessionId:e.sessionName,appId:t.appBundleId,mode:r.area===`cpu`?`cpu-profile`:`trace`,kind:r.kind,template:r.template,outPath:o,fence:c});return await Tn({admissionLedger:Lo(e),session:t,sessionName:e.sessionName,sessionStore:e.sessionStore,device:t.device,owner:n.owner,fence:c,pendingHandle:l.pendingHandle,envelope:l.envelope,throwIfCanceled:e.throwIfCanceled}),{ok:!0,data:l.response}}function Lo(t){if(t.perfCaptureAdmissionLedger)return t.perfCaptureAdmissionLedger;throw new e(`COMMAND_FAILED`,`Perf capture admission ledger is not configured`,{reason:`runtime-gateway-missing`})}async function Ro(e,t,n){let r=t.perfCapture;if(!r)return a(`INVALID_ARGS`,`no active native perf capture`);let i=Uo(r.handle.inspect(),n);if(i)return a(`INVALID_ARGS`,i);n.outPath&&r.handle.setOutputPath(k.expandHome(n.outPath,e.req.meta?.cwd));let o=await bn({intent:`capture`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore});if(n.area===`cpu`){let n=zo(o),r=e.sessionStore.get(e.sessionName)??t;e.sessionStore.set(e.sessionName,{...r,lastPerfProfile:n})}return{ok:!0,data:o}}function zo(t){if(Bo(t)||Vo(t))return t;throw new e(`COMMAND_FAILED`,`Stopped CPU profile metadata is malformed.`)}function Bo(e){return e.kind===`xctrace`&&e.mode===`cpu-profile`&&typeof e.outPath==`string`&&typeof e.template==`string`}function Vo(e){return e.kind===`simpleperf`&&e.mode===`cpu-profile`&&Ho(e,[`outPath`,`packageName`,`appPid`,`profilerPid`,`remotePath`])}function Ho(e,t){return t.every(t=>typeof e[t]==`string`)}function Uo(e,t){let n=t.area===`cpu`?`cpu-profile`:`trace`;if(e.kind!==t.kind||e.mode!==n)return`No ${t.kind} ${n} is active for this session.`}function Wo(e,t){return{...Qo(e),metrics:{fps:Go(t.metric,e)},sampling:{fps:t.sampling}}}function Go(e,t){if(!Yo(e)||e.available!==!0)return e;let n=Ko(t.actions,e);return n.length===0?e:{...e,relatedActions:n}}function Ko(e,t){let n=qo(t.windowStartedAt),r=qo(t.windowEndedAt)??qo(t.measuredAt);return n===void 0||r===void 0?[]:e.filter(({ts:e})=>e>=n&&e<=r).map(e=>({command:e.command,at:new Date(e.ts).toISOString(),offsetMs:Math.max(0,Math.round(e.ts-n)),target:Jo(e)})).slice(-12)}function qo(e){if(typeof e!=`string`)return;let t=Date.parse(e);return Number.isFinite(t)?t:void 0}function Jo(e){for(let t of[`refLabel`,`ref`,`appName`,`appBundleId`]){let n=e.result?.[t];if(typeof n==`string`&&n.length>0)return n}}function Yo(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Xo(e,t){return{...Qo(e),metrics:{memory:t.metric},sampling:{memory:t.sampling}}}function Zo(e,t){return{...Qo(e),artifact:t.artifact,sampling:{snapshot:t.sampling},support:t.support}}function Qo(e){return{session:e.name,platform:d(e.device),device:e.device.name,deviceId:e.device.id}}function $o(e,t,n){return t?k.expandHome(t,e.req.meta?.cwd):H.join(e.sessionStore.ensureSessionDir(e.sessionName),`${ts()}-${n}`)}function es(t){let n=t.positionals?.[0]?.toLowerCase(),r=t.positionals?.[1]?.toLowerCase();if(t.flags?.out&&n!==`cpu`&&n!==`trace`&&(n!==`memory`||r!==`snapshot`))throw new e(`INVALID_ARGS`,`--out is only supported with perf memory snapshot, perf cpu profile, or perf trace`)}function ts(){return new Date().toISOString().replaceAll(/[:.]/g,`-`)}function ns(e){return typeof e==`string`&&e.length>0?e:void 0}const rs=[`dump`,`log`],is=`network requires ${rs.join(` or `)}`,as=`network include mode must be one of: ${o.join(`, `)}`,os=2048;async function ss(e){let n=e.sessionStore.get(e.sessionName);if(!n)return a(`SESSION_NOT_FOUND`,`network requires an active session`);try{let t=cs(e.bindDevice),r=(await t(n.device,v)).facts.networkDump;if(!r.available)return ps(r.hint);let i=ls(e.req);if(!i.ok)return i;let a=he({action:i.action,include:i.include}),o=await t(n.device,a.use),s=n.appLog?.handle.inspect();return ms(await o.operations.networkDump({sessionId:e.sessionName,appBundleId:n.appBundleId,...s?{appLogSnapshot:{state:s.state,startedAt:s.startedAt}}:{},maxEntries:i.maxEntries,include:a.include,maxPayloadChars:os,maxScanLines:4e3}),i,!!n.appLog,s?.state)}catch(e){return{ok:!1,error:t(e)}}}function cs(t){if(t)return t;throw new e(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`})}function ls(e){let t=us(e);if(!t.ok)return t;let n=ds(e);if(!n.ok)return n;let r=fs(e);return r.ok?{ok:!0,action:t.action,include:r.include,maxEntries:n.maxEntries}:r}function us(e){let t=(e.positionals?.[0]??`dump`).toLowerCase();return rs.includes(t)?{ok:!0,action:t}:a(`INVALID_ARGS`,is)}function ds(e){let t=e.positionals?.[1]?Number.parseInt(e.positionals[1],10):25;return!Number.isInteger(t)||t<1||t>200?a(`INVALID_ARGS`,`network dump limit must be an integer in range 1..200`):{ok:!0,maxEntries:t}}function fs(e){let t=e.positionals?.[2]?.toLowerCase(),n=e.flags?.networkInclude;if(t&&n&&t!==n)return a(`INVALID_ARGS`,`network include mode was provided both positionally and via --include with different values`);let r=(n??t??`summary`).toLowerCase();return o.includes(r)?{ok:!0,include:r}:a(`INVALID_ARGS`,as)}function ps(e){return{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`network is not supported on this device`,hint:e}}}function ms(e,t,n,r){return e.source===`app-log`?{ok:!0,data:{...e.dump,active:n,state:r??`inactive`,backend:e.backend,notes:e.notes}}:{ok:!0,data:{entries:e.entries,active:!0,state:`active`,backend:e.backend,include:t.include,matchedLines:e.entries.length,scannedLines:e.entries.length,limits:{maxEntries:t.maxEntries,maxPayloadChars:os,maxScanLines:e.entries.length},notes:e.notes}}}function hs(e,t){let n=Sn(e);return{...n,backend:n.backend??t,notes:n.state===`failed`&&e.appLogFailure?[gs(e.appLogFailure)]:_s(n.state)}}function gs(e){return e.hint?`${e.message} ${e.hint}`:e.message}function _s(e){return e===`failed`?[`The app log stream process exited with an error. Run logs doctor for backend diagnostics.`]:e===`ended`?[`The app log stream process ended. Run logs clear --restart before the next capture window.`]:void 0}function vs(e,t){return be([...e,...t.notes??[]])}async function ys(e){let{req:t}=e;return t.command===`perf`?await No({...e,throwIfCanceled:e.throwIfCanceled??(()=>{})}):t.command===`logs`?xs(e):t.command===`events`?await bs(e):t.command===`network`?await ss(e):t.command===`audio`?await To(Ns(e)):null}async function bs(e){let{req:n,sessionName:r,sessionStore:i}=e;try{return await i.flushEvents(r),{ok:!0,data:i.readEvents(r,{limit:n.positionals?.[0],cursor:n.positionals?.[1]})}}catch(e){return{ok:!1,error:t(e)}}}async function xs(e){let{req:n,sessionName:r,sessionStore:i}=e,o=i.get(r);if(!o)return a(`SESSION_NOT_FOUND`,`logs requires an active session`);try{let t=Ps({...e,session:o}),r=(await t.bindDevice(o.device,x)).facts.appLogInspect;if(!r.available)return{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`logs is not supported on this device`,hint:r.hint}};let i=ws(S({action:n.positionals?.[0],restart:!!n.flags?.restart,marker:n.positionals?.slice(1).join(` `)}),o);return`ok`in i?i:await Ss(t,i)}catch(e){return{ok:!1,error:t(e)}}}async function Ss(e,t){switch(t.kind){case`path`:return Ts(e,(await(await e.bindDevice(e.session.device,t.use)).operations.appLogInspect()).backend);case`doctor`:return Es(e,await(await e.bindDevice(e.session.device,t.use)).operations.appLogDoctor({appBundleId:e.session.appBundleId}));case`start`:case`clear-restart`:return await Cs(e,t);case`stop`:return await e.bindDevice(e.session.device,t.use),await js(e);case`mark`:return await e.bindDevice(e.session.device,t.use),Ds(t.marker,e.sessionName,e.sessionStore);case`clear`:return await e.bindDevice(e.session.device,t.use),Os(e)}}async function Cs(e,t){let n=await e.bindDevice(e.session.device,t.use);return t.kind===`start`?await As(e,t.appBundleId,n.owner,n.operations.appLogStart):await ks(e,t.appBundleId,n.owner,n.operations.appLogStart)}function ws(e,t){return e.requiresAppSession?t.appBundleId?Object.freeze({...e,appBundleId:t.appBundleId}):a(`INVALID_ARGS`,`logs ${e.kind===`start`?`start`:`clear --restart`} requires an app session; run open <app> first`):e}function Ts(e,t){let{session:n,sessionName:r,sessionStore:i}=e,a=i.resolveAppLogPath(r),o=xo(a),s=hs(n,t);return{ok:!0,data:{path:a,active:s.active,state:s.state,backend:s.backend,sizeBytes:o.sizeBytes,modifiedAt:o.modifiedAt,startedAt:s.startedAt?new Date(s.startedAt).toISOString():void 0,failureCode:s.failureCode,failureMessage:s.failureMessage,hint:s.hint??String.raw`Grep the file for token-efficient debugging, e.g. grep -n "Error\|Exception" <path>`,notes:s.notes}}}async function Es(e,t){let{session:n,sessionName:r,sessionStore:i}=e,a=i.resolveAppLogPath(r),o=hs(n,t.backend);return{ok:!0,data:{path:a,active:o.active,state:o.state,backend:o.backend,checks:t.checks,failureCode:o.failureCode,failureMessage:o.failureMessage,hint:o.hint,notes:vs(t.notes,o)}}}function Ds(e,t,n){let r=n.resolveAppLogPath(t);return So(r,e),{ok:!0,data:{path:r,marked:!0}}}function Os(e){let{session:t,sessionName:n,sessionStore:r}=e;if(t.appLog)return a(`INVALID_ARGS`,`logs clear requires logs to be stopped first; run logs stop`);let i=Co(r.resolveAppLogPath(n));return gn({session:t,sessionName:n,sessionStore:r}),{ok:!0,data:i}}async function ks(e,t,n,r){let{session:i,sessionName:a,sessionStore:o}=e;i.appLog&&await _n({intent:`disposal`,session:i,sessionName:a,sessionStore:o,resourcePath:vn.resolvePath(o.resolveSessionDir(a))});let s=Co(o.resolveAppLogPath(a)),c=await Ms(e,t,r,n);return c.ok?{ok:!0,data:{...s,restarted:!0}}:c}async function As(e,t,n,r){let{session:i}=e;return i.appLog?a(`INVALID_ARGS`,`app log already streaming; run logs stop first`):await Ms(e,t,r,n)}async function js(e){let{session:t,sessionName:n,sessionStore:r}=e;if(!t.appLog)return a(`INVALID_ARGS`,`no app log stream active`);let i=r.resolveAppLogPath(n);return await _n({intent:`capture`,session:t,sessionName:n,sessionStore:r,resourcePath:vn.resolvePath(r.resolveSessionDir(n))}),{ok:!0,data:{path:i,stopped:!0}}}async function Ms(e,t,n,r){let{session:i,sessionName:a,sessionStore:o}=e,s=o.resolveAppLogPath(a),c=vn.resolvePath(o.resolveSessionDir(a));try{let l=wo({ledger:e.appLogAdmissionLedger,resourcePath:c,device:i.device}),u=await n({sessionId:a,appBundleId:t,outputPath:s,pidPath:o.resolveAppLogPidPath(a),fence:l});return await xn({admissionLedger:e.appLogAdmissionLedger,session:i,sessionName:a,sessionStore:o,resourcePath:c,device:i.device,owner:r,fence:l,pendingHandle:u.pendingHandle,envelope:u.envelope,throwIfCanceled:e.throwIfCanceled??(()=>{})}),{ok:!0,data:{path:s,started:!0}}}catch(e){return{ok:!1,error:yn({session:i,sessionName:a,sessionStore:o,error:e})}}}function Ns(t){if(!t.bindDevice||!t.inspectFacts)throw new e(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`});if(!t.audioProbeAdmissionLedger)throw new e(`COMMAND_FAILED`,`Audio probe admission ledger is not configured`,{reason:`runtime-gateway-missing`});return{req:t.req,sessionName:t.sessionName,sessionStore:t.sessionStore,inspectFacts:t.inspectFacts,bindDevice:t.bindDevice,audioProbeAdmissionLedger:t.audioProbeAdmissionLedger,throwIfCanceled:t.throwIfCanceled??(()=>{})}}function Ps(t){if(!t.bindDevice)throw new e(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`});if(!t.appLogAdmissionLedger)throw new e(`COMMAND_FAILED`,`App-log admission ledger is not configured`,{reason:`runtime-gateway-missing`});return{...t,bindDevice:t.bindDevice,appLogAdmissionLedger:t.appLogAdmissionLedger}}const J=new WeakMap;function Fs(e){return{store:t=>Is(e,t),finalize:(t,n)=>Ls({...e,evidence:t,projection:n})}}function Is(e,t){let{sessionStore:n,sessionName:r}=e,i;if(!n.update(e=>{Re(e,t),i=e})||!i)throw Error(`Internal observation session is no longer available.`);let a=i,o=a.snapshotGeneration;if(o===void 0)throw Error(`Internal observation did not establish a snapshot generation.`);let s={};return J.set(s,{sessionName:r,session:a,sessionCreatedAt:a.createdAt,snapshot:t,snapshotGeneration:o,runtimeRevision:Ie(a),refFrame:Ne(a)}),{evidence:s,refsGeneration:o}}function Ls(e){let t=J.get(e.evidence);J.delete(e.evidence);let n=zs(e.projection.refs);return n.size===0?{published:!1,reason:`empty`}:e.signal?.aborted===!0?{published:!1,reason:`cancelled`}:!t||!Rs(e,t)?{published:!1,reason:`stale-capture`}:e.projection.refsGeneration!==t.snapshotGeneration||!Bs(n,t.snapshot)?{published:!1,reason:`invalid-projection`}:(Be(t.session,n),{published:!0,refsGeneration:t.snapshotGeneration,refCount:n.size})}function Rs(e,t){let n=e.sessionStore.get();return e.sessionName===t.sessionName&&n===t.session&&n.createdAt===t.sessionCreatedAt&&n.snapshot===t.snapshot&&n.snapshotGeneration===t.snapshotGeneration&&Ie(n)===t.runtimeRevision&&Ne(n)===t.refFrame}function zs(e){let t=new Set;for(let n of e){let e=n.startsWith(`@`)?n.slice(1):n,r=e.indexOf(`~`),i=r===-1?e:e.slice(0,r);i.length>0&&t.add(i)}return t}function Bs(e,t){let n=new Set(t.nodes.flatMap(e=>typeof e.ref==`string`?[e.ref]:[]));return[...e].every(e=>n.has(e))}function Vs(e){let{sessionStore:t,mutationStore:n}=e,r=()=>t.get();return{view(){let e=r();if(e)return{repairBoundary:De(e),pendingRecordAndHeal:e.pendingRecordAndHeal,scriptPublication:Hs(e.scriptPublication??Ke)}},armStep(e){n.update(t=>{Me(t,{saveScript:e.saveScript,force:e.force,sourcePath:e.sourcePath,healedSiblingPath:Et(e.sourcePath),firstArm:e.firstArm})})},demoteForRerunIfArmed(){De(r())!==void 0&&n.update(we)},markCompleteIfArmed(){De(r())!==void 0&&n.update(Ae)},markSessionHeldIfArmed(e){if(e.ok||!je(r()))return e;let t=dt(e.error.details?.divergence);return t&&(t.repairSessionHeld=!0),e},clearTombstone(){n.clearRepairTombstone()},clearCorrectiveWatermarkIfExpected(e){r()?.pendingRecordAndHeal?.expectedFrom===e&&n.update(t=>{t.pendingRecordAndHeal?.expectedFrom===e&&Ws(t)})},resumeStamper:{sessionExists:()=>r()!==void 0,stampCorrectiveWatermark(e){n.update(t=>{Us({session:t,...e})})}}}}function Hs(e){return{kind:e.kind,status:e.kind===`none`?void 0:e.status,targetPath:Je(e),targetForce:Ue(e)}}function Us(e){let{session:t,resume:n,repairHint:r,failedIndex:i,actions:a}=e;t.pendingRecordAndHeal=Gs({resume:n,repairHint:r,failedIndex:i,actions:a,actionsCountAtDivergence:t.actions.length})}function Ws(e){e.pendingRecordAndHeal=void 0}function Gs(e){let{resume:t,repairHint:n,failedIndex:r,actions:i,actionsCountAtDivergence:a}=e;if(n===`record-and-heal`)return t.allowed?{expectedFrom:t.from,actionsCountAtDivergence:a}:void 0;if((n===`caution`||n===`manual`)&&r===i.length)return{expectedFrom:r+1,actionsCountAtDivergence:a}}function Ks(e){let{sessionStore:t,bindDevice:n,bindExactDevice:r,screenRecordingAdmissionLedger:i,requestScope:a,retainDeviceExecutionLock:o,throwIfCanceled:s}=e;return!n||!r||!i||!a||!o||!s?void 0:{throwIfCanceled:s,record:async e=>await tr({req:qs(e),sessionName:e.sessionName,sessionStore:t,bindDevice:n,bindExactDevice:r,admissionLedger:i,requestScope:a,retainDeviceExecutionLock:o,throwIfCanceled:s})}}function qs(e){return{token:e.request.token,session:e.sessionName,command:`record`,positionals:e.phase===`start`?[`start`,e.outputPath]:[`stop`],flags:{},meta:e.request.meta}}const Js={resolveSessionScope:Vn},Ys=async({req:e,sessionName:t,logPath:n,sessionStore:r,invoke:i,invokeReplayAction:a})=>await kt({...ur(e),session:Zs(t,n,r),invoke:fr(a??i,e),dependencies:Js}),Xs=async({req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,invoke:o,invokeReplayAction:s,bindDevice:c,inspectFacts:l,bindExactDevice:u,screenRecordingAdmissionLedger:d,requestScope:f,retainDeviceExecutionLock:p,throwIfCanceled:m,platformResourceCleanup:h})=>{if(!h)throw new e(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`);let g=Ks({sessionStore:i,bindDevice:c,bindExactDevice:u,screenRecordingAdmissionLedger:d,requestScope:f,retainDeviceExecutionLock:p,throwIfCanceled:m});return await Pt({...ur(t),session:Zs(n,r,i),createSession:(e,t)=>Zs(e,t,i),invoke:fr(s??o,t),dependencies:Js,cleanupSession:async e=>await Qs({req:t,sessionName:e,logPath:r,sessionStore:i,leaseRegistry:a,inspectFacts:l,bindDevice:c,platformResourceCleanup:h}),...g?{video:g}:{}})};function Zs(t,n,r){let i=e=>{let n=r.get(t);return n?(e(n),r.set(t,n),!0):!1},a={get:()=>r.get(t),lookup:()=>r.lookup(t),getRuntimeHints:()=>r.getRuntimeHints(t),ensureSessionDir:()=>r.ensureSessionDir(t)};return lr(t,n,a,{createCoordinator:()=>Vs({sessionStore:a,mutationStore:{update:i,clearRepairTombstone:()=>r.clearRepairTombstone(t)}}),assertSelectorMatches:e=>{let n=r.lookup(t);n&&qn(n,e)},resolveOpenRuntimeHints:({request:e,device:n,platform:i})=>Jt({req:e,sessionStore:{getRuntimeHints:e=>e===t?r.getRuntimeHints(t):void 0},sessionName:t,device:n,platform:i}),bindAuthority:e=>Fs({sessionStore:{get:()=>r.get(t),update:i},sessionName:t,...e?{signal:e}:{}}),capture:async({flags:n,logPath:i})=>{let a=r.get(t);if(!a)throw new e(`NO_ACTIVE_SESSION`,`Session "${t}" is no longer active.`);return await Ve({device:a.device,session:a,flags:n,logPath:i})}})}async function Qs(t){let{req:n,sessionName:r,logPath:i,sessionStore:a}=t;if(!a.get(r))return;let o=await Xi({req:{token:n.token,session:r,command:`close`,positionals:[],flags:{},meta:n.meta},sessionName:r,logPath:i,sessionStore:a,leaseRegistry:t.leaseRegistry,inspectFacts:t.inspectFacts,bindDevice:t.bindDevice,platformResourceCleanup:t.platformResourceCleanup});if(!o.ok)throw new e(o.error.code,o.error.message,{...o.error.details??{},...o.error.hint?{hint:o.error.hint}:{}})}function $s(t){let{req:n,sessionName:r,sessionStore:i}=t;if(n.command!==$e.sessionSaveScript)return null;if((n.positionals?.length??0)>1)return Y(new e(`INVALID_ARGS`,`session save-script accepts at most one output path.`));let a=i.get(r);if(!a)return Y(new e(`SESSION_NOT_FOUND`,`No active session "${r}".`,{hint:`Start a fresh journey with open <app> --save-script[=<path>], then retry.`}));let o=nc(a);if(o)return Y(o);let s=n.positionals?.[0]?.trim();if(n.positionals?.[0]!==void 0&&!s)return Y(new e(`INVALID_ARGS`,`session save-script path cannot be empty.`));qe(a,{explicitPath:s,liveForce:n.flags?.force});let c=i.writeSessionLog(a,{force:Ye(a,n.flags?.force),publication:`active`});return c.written?(Qe(a,c.path),{ok:!0,data:{session:a.name,savedScript:c.path,actionCount:c.actionCount,...F(`Published script: ${c.path}`)}}):Y(c.error??new e(`COMMAND_FAILED`,`The active session script was not published.`,{retriable:!0,hint:`The session remains armed; retry session save-script.`}))}function ec(e){if(Ee(e))return`repair`;let t=e.scriptPublication;return t?.kind===`authoring`&&t.status!==`armed`?t.status:M(e)?void 0:`not-armed`}const tc={repair:()=>new e(`COMMAND_FAILED`,`This session has an active .ad repair transaction and cannot use ordinary active-session publication.`,{hint:`Finish or abort the repair through replay --from and its existing close/teardown protocol.`}),aborted:()=>new e(`COMMAND_FAILED`,`This script recording was aborted by a second successful open and cannot be published.`,{hint:`Close this session and start a fresh one with open <app> --save-script[=<path>].`}),published:()=>new e(`COMMAND_FAILED`,`This script recording has already been published.`,{hint:`Continue using the live session, or close it and start a fresh authoring session.`}),"not-armed":()=>new e(`COMMAND_FAILED`,`Script recording was not armed before this journey began; session history cannot be published without recording-time target evidence.`,{hint:`Close this session and start a fresh one with open <app> --save-script[=<path>].`})};function nc(e){let t=ec(e);return t?tc[t]():void 0}function Y(e){return{ok:!1,error:t(e)}}function rc(e){let t=(e[0]??``).toLowerCase();return t===`read`||t===`write`?t:void 0}function ic(e){return{...e.appBundleId===void 0?{}:{options:{appBundleId:e.appBundleId}},execution:ze(e)}}async function ac(t,n,r){if(r.length!==1)throw new e(`INVALID_ARGS`,`clipboard read does not accept additional arguments`);return{action:`read`,text:await t.operations.readClipboard(ic(n))}}async function oc(t,n,r){if(r.length<2)throw new e(`INVALID_ARGS`,`clipboard write requires text (use "" to clear clipboard)`);let i=r.slice(1).join(` `),a={...ic(n),text:i};return await t.operations.writeClipboard(a),{action:`write`,textLength:Array.from(i).length,...F(`Clipboard updated`)}}async function sc(e){let{device:t,action:n,positionals:r,inspectFacts:i,bindDevice:a}=e;if(n===`read`){let e=await j({command:`clipboard`,device:t,use:fe,inspectFacts:i,bindDevice:a,readiness:!0});if(e.type===`response`)return{ok:!1,response:e.response};let n=e.runtime;return{ok:!0,execute:e=>ac(n,e,r)}}let o=await j({command:`clipboard`,device:t,use:_e,inspectFacts:i,bindDevice:a,readiness:!0});if(o.type===`response`)return{ok:!1,response:o.response};let s=o.runtime;return{ok:!0,execute:e=>oc(s,e,r)}}async function cc(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,inspectFacts:o,bindDevice:s}=e,c=i.get(n),l=t.flags??{},u=W(N.clipboard,c,l);if(u)return u;let f=t.positionals??[],p=rc(f);if(!p)return a(`INVALID_ARGS`,`clipboard requires a subcommand: read or write`);let m=await G({session:c,flags:l}),h=await sc({device:m,action:p,positionals:f,inspectFacts:o,bindDevice:s});if(!h.ok)return h.response;let g=await h.execute(Pe(r,t.flags,c?.appBundleId,c?.trace?.outPath));return O(i,c,t,t.command,g),{ok:!0,data:{platform:d(m),...g}}}function lc(e){return e.some(e=>e.status===`fail`)?`fail`:e.some(e=>e.status===`warn`)?`warn`:`pass`}function uc(e){return e===`fail`?`Blockers found before the run.`:e===`warn`?`No hard blockers found, but warnings need attention.`:`No blockers found.`}function dc(e){let t={fail:0,warn:1,pass:2,info:3};return[...e].sort((e,n)=>t[e.status]-t[n.status])}function fc(e,...t){for(let n of t)X(e,n)}function X(e,t){e.push(t),St({type:`command`,status:`progress`,message:pc(t)})}function pc(e){return[er(e),...$n(e)].join(`
2
- `)}async function mc(e,n){let{device:r,targetApp:i,session:a,listInstalledApps:o}=n;if(i)try{let t=o?hc(i,await o(`all`))?.id:void 0;if(!t){X(e,{id:`target-app`,status:`info`,summary:`Target app installation checks are not supported for ${d(r)}.`,evidence:{requested:i,platform:d(r)}});return}X(e,{id:`target-app`,status:`pass`,summary:`Target app is launchable: ${t}`,evidence:{requested:i,resolved:t,sessionApp:a?.appBundleId}})}catch(n){let i=t(n);X(e,{id:`target-app`,status:`fail`,summary:`Target app check failed: ${i.message}`,hint:i.hint??`Install the app or pass an exact package/bundle id or app name.`,command:`agent-device apps --platform ${d(r)} --all`,evidence:{code:i.code,message:i.message}})}}function hc(t,n){let r=t.trim().toLowerCase(),i=n.find(e=>e.id.toLowerCase()===r||e.name.toLowerCase()===r);if(i)return i;let a=n.filter(e=>e.id.toLowerCase().includes(r)||e.name.toLowerCase().includes(r));if(a.length===1)return a[0];throw a.length>1?new e(`AMBIGUOUS_MATCH`,`Multiple launchable apps matched "${t}"`,{matches:a.map(e=>e.id),hint:`Pass an exact package/bundle id from agent-device apps --all.`}):new e(`APP_NOT_INSTALLED`,`No launchable installed app matched "${t}"`)}async function gc(e,n,r){let i=vc(n,r);try{let t=await bc(i),n=yc(t.devices,i);return X(e,{id:`device`,status:n.length===0?`fail`:`pass`,summary:wc(n,i,t.failures),hint:n.length===0?Dc(t.failures):void 0,command:n.length===0?jc(i):void 0,evidence:Mc(n,t.failures)}),n.length>0&&xc(e,t.failures),{devices:n,platform:i.platform,target:i.target}}catch(n){let r=t(n);return X(e,{id:`device`,status:`fail`,summary:r.message,hint:r.hint,command:`agent-device devices`,evidence:{code:r.code,details:r.details}}),{devices:[],platform:i.platform,target:i.target}}}function _c(e,t,n){if(!n||!t)return;let r=t.devices.filter(e=>e.booted===!0);if(r.length===1)return r[0];X(e,{id:`target-app-device`,status:`fail`,summary:r.length===0?`Target app check needs one booted device; none matched.`:`Target app check needs one booted device; ${r.length} matched.`,hint:r.length===0?`Boot a device, or adjust --platform/--target/--device/--udid/--serial.`:`Pass --platform/--target/--device/--udid/--serial so doctor checks the intended device.`,command:t.platform?`agent-device devices --platform ${t.platform}`:`agent-device devices`,evidence:{targetApp:n,booted:r.map(e=>({platform:d(e),id:e.id,name:e.name}))}})}function vc(e,t){let n=e.flags??{};return Bn({platform:n.platform??t?.device.platform,target:n.target??t?.device.target,device:n.device,udid:n.udid,serial:n.serial,iosSimulatorDeviceSet:n.iosSimulatorDeviceSet,androidDeviceAllowlist:n.androidDeviceAllowlist})}function yc(e,t){return e.filter(e=>g(e,t,{includeExplicitSelectors:!0}))}async function bc(e){if(e.platform)return{devices:await In(e),failures:[]};let t=[],n=[];for(let r of at)try{t.push(...await In({...e,platform:r}))}catch(e){n.push(Cc(r,e))}return{devices:t,failures:n}}function xc(e,t){for(let n of t)X(e,Sc(n))}function Sc(e){return{id:`device-${e.platform}`,status:`warn`,summary:`${Z(e.platform)} device inventory could not be read: ${e.message}`,hint:e.hint??`Check the ${Z(e.platform)} toolchain, or scope with --platform to skip it.`,evidence:{platform:e.platform,code:e.code}}}function Cc(e,n){let r=t(n);return{platform:e,message:r.message,hint:r.hint,code:r.code}}function wc(e,t,n){if(e.length===0)return n.length>0?`No ${Tc(t)} devices found; ${Ec(n)}.`:`No ${Tc(t)} devices found.`;let r=e.filter(e=>e.booted===!0).length,i=`${e.length} ${Tc(t)} ${Ac(e.length,`device`)} available; ${r} booted`,a=Oc(e,t);return a?`${i} (${a}).`:`${i}.`}function Tc(e){let t=e.platform?Z(e.platform):`local`;return e.target?`${t} ${e.target}`:t}function Ec(e){return e.slice(0,2).map(e=>`${Z(e.platform)} inventory failed: ${e.message}`).join(`; `)}function Dc(e){return e.find(e=>e.hint)?.hint??`Start or create a simulator/emulator, connect a device, or adjust --platform/--target/--device selectors.`}function Oc(e,t){if(t.platform||t.target)return;let n=it(e),r=kc();return[`android`,`harmonyos`,`apple`,`vega`,`linux`,`web`].flatMap(e=>{let t=n[e];return t.available>0?[`${r[e]} ${t.available} available, ${t.booted} booted`]:[]}).join(`; `)}function kc(){return{android:`Android`,harmonyos:`HarmonyOS`,apple:`Apple`,vega:`Vega`,linux:`Linux`,web:`web`}}function Z(e){return e===`ios`?`iOS`:e===`macos`?`macOS`:e===`android`?`Android`:e===`harmonyos`?`HarmonyOS`:e===`vega`?`Vega`:e===`linux`?`Linux`:e===`web`?`web`:`Apple`}function Ac(e,t){return e===1?t:`${t}s`}function jc(e){return e.platform?`agent-device devices --platform ${e.platform}`:`agent-device devices`}function Mc(e,t){let n=new Map;for(let t of e){let e=d(t),r=n.get(e)??{available:0,booted:0};r.available+=1,t.booted===!0&&(r.booted+=1),n.set(e,r)}return{available:e.length,booted:e.filter(e=>e.booted===!0).length,byPlatform:Object.fromEntries([...n.entries()].sort(([e],[t])=>e.localeCompare(t))),...t.length>0?{failures:t}:{}}}const Nc=1500;async function Pc(e,t,n,r={}){let i=`http://${e}:${t}/status`;try{let a=await fetch(i,{signal:AbortSignal.timeout(1500)}),o=await a.text(),s=a.ok&&o.toLowerCase().includes(`packager-status:running`),c=s?await Fc(e,t,r):void 0;return{id:`metro`,status:s?`pass`:`warn`,summary:s?Ic(i,c):`React Native dev server responded at ${i}, but did not report packager-status:running.`,hint:s?void 0:`Verify this is the Metro/Re.Pack instance for the target app, or restart the dev server.`,evidence:{url:i,statusCode:a.status,body:o.slice(0,120),kind:n,...c?{process:c}:{}}}}catch(e){return{id:`metro`,status:n===`auto`?`warn`:`fail`,summary:`React Native dev server is not reachable at ${i}.`,hint:`Start Metro or Re.Pack for this project. For non-default endpoints, launch with open --metro-host/--metro-port, or run metro prepare with --public-base-url/--proxy-base-url before retrying doctor.`,command:`curl -fsS ${i}`,evidence:{url:i,error:e instanceof Error?e.message:String(e),kind:n}}}}async function Fc(e,t,n){try{return await(n.resolveProcessInfo??Lc)(e,t)}catch{return}}function Ic(e,t){return t?.cwd?`React Native dev server is reachable at ${e} (cwd: ${t.cwd}).`:`React Native dev server is reachable at ${e}.`}async function Lc(e,t){if(!Rc(e))return;let n=await zc(t);if(n!==void 0)return{pid:n,cwd:await Bc(n)}}function Rc(e){return e===`127.0.0.1`||e===`localhost`||e===`::1`||e===`0.0.0.0`}async function zc(e){let t=await ut(`lsof`,[`-nP`,`-iTCP:${e}`,`-sTCP:LISTEN`,`-Fp`],{allowFailure:!0,timeoutMs:Nc});if(t.exitCode===0)return t.stdout.split(`
1
+ import{B as e,H as t,M as n,N as r,P as i,o as a,t as o}from"./sdk-contracts.js";import{i as s,k as c,n as l}from"./sdk-batch-runner.js";import{S as u,_ as d,b as f,f as p,p as m,u as h,w as g,y as _}from"./sdk-device.js";import{A as v,B as y,Ct as b,F as x,G as ee,I as S,J as C,K as te,L as ne,N as w,Nt as re,P as ie,R as T,St as E,U as ae,Ut as D,W as oe,X as se,Y as ce,Z as le,d as ue,f as de,ft as fe,in as pe,it as me,j as he,ot as ge,pt as _e,q as ve,rt as ye,sr as be,v as xe,wt as Se,z as Ce}from"./sdk-batch.js";import{_ as we,c as O,d as Te,f as Ee,g as De,h as Oe,l as ke,m as Ae,p as je,t as k,u as Me}from"./session-store.js";import{B as A,G as Ne,L as Pe,O as Fe,W as Ie,g as j,h as Le,i as Re,m as ze,n as Be,s as Ve,y as He}from"./session-snapshot.js";import{O as Ue,c as We,f as Ge,g as Ke,h as qe,k as Je,l as Ye,m as Xe,o as Ze,p as Qe,u as M}from"./parameterized-recorded-fill.js";import{n as N,t as $e}from"./catalog.js";import{g as et,i as tt}from"./observability.js";import{i as P,n as nt,r as F}from"./success-text.js";import{t as rt}from"./app-inventory.js";import{r as it,t as at}from"./device.js";import{a as ot,r as I}from"./diagnostics.js";import{a as st,i as ct,r as lt}from"./verified-file.js";import{c as ut}from"./exec.js";import"./file.js";import"./diagnostics2.js";import"./command.js";import{i as dt}from"./replay-divergence.js";import{a as ft}from"./version.js";import{i as pt,r as mt}from"./session-artifact-paths.js";import{t as ht}from"./project-runtime.js";import{t as gt}from"./keyed-lock.js";import{n as _t,t as vt}from"./deploy-result-target.js";import{t as yt}from"./keyboard-actions.js";import{i as bt,r as xt}from"./request-cancel.js";import{t as St}from"./request.js";import{i as Ct,s as wt}from"./provider-session-ownership.js";import{A as Tt,B as Et,C as Dt,E as Ot,F as kt,G as At,K as jt,M as Mt,O as Nt,P as Pt,S as Ft,_ as It,b as Lt,c as Rt,d as zt,et as Bt,f as Vt,g as Ht,h as Ut,k as Wt,l as Gt,m as Kt,n as qt,p as Jt,q as Yt,r as Xt,rt as Zt,s as Qt,t as $t,tt as en,u as L,v as tn,w as nn,x as rn,y as an}from"./device-claim-rule.js";import{i as on}from"./request-runtime-binding.js";import{c as sn,i as cn,t as ln}from"./device-claim-inspection.js";import{t as un}from"./audio-probe-result.js";import{T as dn,_ as fn,a as pn,b as mn,c as hn,d as gn,f as _n,g as vn,h as yn,i as bn,l as xn,m as Sn,n as Cn,o as wn,r as Tn,s as En,t as Dn,u as On,v as kn,x as An}from"./perf-runtime-plan.js";import{i as jn,n as Mn}from"./lease-context.js";import{h as Nn}from"./screenshot-runtime.js";import{n as R,r as Pn}from"./device-isolation.js";import{a as Fn,n as In,r as Ln}from"./device-inventory-context.js";import{n as Rn,r as zn,t as Bn}from"./dispatch-resolve.js";import"./screen-recording-admission-ledger.js";import{a as Vn,d as Hn,i as Un,l as Wn,n as Gn,o as Kn,s as qn,u as Jn}from"./session-routing.js";import{a as Yn,i as z,n as B,r as V,t as Xn}from"./session-runtime-admission.js";import{n as Zn,r as Qn}from"./device-selection-resolver.js";import{n as $n,r as er}from"./doctor-output.js";import{t as tr}from"./record-runtime.js";import{n as nr}from"./gesture-runtime.js";import{i as rr,n as ir,r as ar}from"./platform-runtime-open-target.js";import{t as or}from"./snapshot-runtime.js";import{t as sr}from"./app-log-files.js";import H from"node:path";import U,{promises as cr}from"node:fs";function lr(e,t,n,r){return{name:e,logPath:t,store:{...n,assertSelectorMatches:r.assertSelectorMatches,resolveOpenRuntimeHints:r.resolveOpenRuntimeHints},observationStore:{get:n.get,bindAuthority:r.bindAuthority,capture:r.capture},coordinator:r.createCoordinator()}}function ur(e){let{internal:t,...n}=e;return{request:n,...t?.publicNetworkOnly?{publicNetworkOnly:!0}:{},...t?.resolvedSessionScope?{resolvedSessionScope:t.resolvedSessionScope}:{}}}function dr(e,t){let n=c({...e,...t});return Object.keys(n).length>0?n:void 0}function fr(e,t){return async({dispatch:n,...r})=>{let i=dr(t.internal,n);return await e(i?{...r,internal:i}:r)}}function pr(e){throw new n(`UNSUPPORTED_OPERATION`,`install_from_source ${String(e.kind)} sources require a compatible remote daemon`)}function mr(e){let t=e.meta?.installSource;if(!t)throw new n(`INVALID_ARGS`,`install_from_source requires a source payload`);switch(t.kind){case`url`:if(!t.url||t.url.trim().length===0)throw new n(`INVALID_ARGS`,`install_from_source url source requires a non-empty url`);return t;case`path`:if(!t.path||t.path.trim().length===0)throw new n(`INVALID_ARGS`,`install_from_source path source requires a non-empty path`);return t;case`github-actions-artifact`:throw new n(`UNSUPPORTED_OPERATION`,`install_from_source github-actions-artifact sources require a compatible remote daemon`);default:pr(t)}}function hr(e){let t=mr(e),n=e.meta?.uploadedArtifactId;return!n||t.kind!==`path`?{source:t,cleanup:()=>{}}:{source:{kind:`path`,path:wt(n,e.meta?.tenantId)},cleanup:()=>{Ct(n)}}}function W(e,t,n){return t||jt(n)?null:a(`INVALID_ARGS`,`${e} requires an active session or an explicit device selector (e.g. --platform ios).`)}function gr(e){return typeof e?.session==`string`&&e.session.trim().length>0}async function G(e){return Yt(e.flags)||!e.session?await Rn(e.flags??{},{androidAvdSelection:e.androidAvdSelection}):await _r(e.session.device)}async function _r(e){if(on(e)||!p(e)||e.kind!==`simulator`||process.platform!==`darwin`)return e;if((await He.observeRunnerSession(e.id))?.alive)return{...e,booted:!0};let t={platform:`ios`,target:e.target,udid:e.id,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}};try{return await Rn(t)}catch(e){if(!(e instanceof n)||e.code!==`DEVICE_NOT_FOUND`)throw e}return await Rn({platform:`ios`,target:e.target,device:e.name,...e.simulatorSetPath?{iosSimulatorDeviceSet:e.simulatorSetPath}:{}})}function vr(e,t){return t?Wn(t,e).length===0:!1}async function yr(e){let{req:n,sessionName:r,sessionStore:i}=e,a=i.get(r),o,s,c;try{o=hr(n);let t=Cr(n),l=await xr(a,n.flags),u=await V(e.inspectFacts)(l),d=z(`install_from_source`,u.operations.ensureReady)??z(`install_from_source`,u.operations.materializeAppSource)??z(`install_from_source`,u.operations.deployMaterializedApp);if(d)return d;let f=await B(e.bindDevice)(l,se);await f.operations.ensureReady({}),s=await f.operations.materializeAppSource({source:o.source}),c=await wr({artifact:s,retention:t,req:n,session:a,sessionName:r}),a&&A(a);let p=await f.operations.deployMaterializedApp({artifact:s}),m=Tr(l,s,p,c),h=P(m,`Installed: ${_t(m)}`);return O(i,a,n,`install_source`,h,{positionals:[]}),{ok:!0,data:h}}catch(e){return c&&await Nt(c.materializationId,n.meta?.tenantId).catch(()=>{}),{ok:!1,error:t(e)}}finally{await s?.cleanup(),o?.cleanup()}}async function br(e){let{req:r}=e;try{let e=r.meta?.materializationId?.trim();if(!e)throw new n(`INVALID_ARGS`,`release_materialized_paths requires a materializationId`);return await Nt(e,r.meta?.tenantId),{ok:!0,data:{released:!0,materializationId:e}}}catch(e){return{ok:!1,error:t(e)}}}async function xr(e,t){let r=Sr(t?.platform);if(e&&r&&!f(e.device,r))throw new n(`INVALID_ARGS`,`install_from_source requested platform ${r}, but session is bound to ${u(e.device)}`);if(!e&&!r)throw new n(`INVALID_ARGS`,`install_from_source requires platform "ios" or "android" when no session is provided`);return e?e.device:await G({session:e,flags:t})}function Sr(e){return e===`ios`||e===`android`?e:void 0}function Cr(e){let t=e.meta?.retainMaterializedPaths===!0,r=e.meta?.materializedPathRetentionMs;if(!t)return{enabled:!1};if(r!==void 0&&r<=0)throw new n(`INVALID_ARGS`,`install_from_source retentionMs must be a positive integer`);return{enabled:!0,...r===void 0?{}:{ttlMs:r}}}async function wr(e){if(e.retention.enabled)return await Tt({archivePath:e.artifact.archivePath,installablePath:e.artifact.installablePath,tenantId:e.req.meta?.tenantId,sessionName:e.session?e.sessionName:void 0,ttlMs:e.retention.ttlMs})}function Tr(e,t,n,r){return p(e)?Er(t,n,r):Dr(t,n,r)}function Er(e,t,r){let i=t.bundleId??e.bundleId;if(!i)throw new n(`COMMAND_FAILED`,`Installed iOS app identity could not be resolved from the artifact`);return{...kr(r),bundleId:i,...Or(t,e),launchTarget:t.launchTarget??i}}function Dr(e,t,r){let i=t.packageName??t.launchTarget??e.packageName;if(!i)throw new n(`COMMAND_FAILED`,`Installed Android app identity could not be resolved from the artifact or device state`);return{...kr(r),packageName:i,...Or(t,e),launchTarget:t.launchTarget??i}}function Or(e,t){let n=e.appName??t.appName;return n?{appName:n}:{}}function kr(e){return e?{...e.archivePath?{archivePath:e.archivePath}:{},installablePath:e.installablePath,materializationId:e.materializationId,materializationExpiresAt:e.expiresAt}:{}}async function Ar(e){let{req:t,session:n,inspectFacts:r,bindDevice:i}=e,o=jr(t);if(!o.ok)return o.response;let s=W(`runtime port-reverse`,n,t.flags);if(s)return s;let c=await G({session:n,flags:t.flags}),l=await j({device:c,inspectFacts:r,bindDevice:i,command:`runtime port-reverse`,use:y});if(l.type===`response`)return l.response;if(l.runtime.owner.kind!==`provider-runtime`||l.runtime.owner.provider!==o.options.provider)return a(`UNSUPPORTED_OPERATION`,`The selected device is not owned by the requested port-reverse provider.`,{provider:o.options.provider});let u=await l.runtime.operations.configureProviderPortReverse(o.options);return u?{ok:!0,data:{action:`port-reverse`,...u}}:a(`UNSUPPORTED_OPERATION`,`The selected provider device runtime does not support port reverse for this lease.`)}function jr(e){let t=Mr(e);if(!t.ok)return t;let n=Nr(e);return n.ok?{ok:!0,options:{leaseId:t.leaseId,provider:t.provider,devicePort:n.devicePort,hostPort:n.hostPort,name:e.flags?.portReverseName?.trim()||`runtime`}}:n}function Mr(e){let t=e.flags?.leaseId,n=e.flags?.leaseProvider;return t?n?{ok:!0,leaseId:t,provider:n}:{ok:!1,response:a(`INVALID_ARGS`,`runtime port-reverse requires a lease provider.`)}:{ok:!1,response:a(`INVALID_ARGS`,`runtime port-reverse requires a resolved remote lease.`)}}function Nr(e){let t=Pr(e.flags?.devicePort),n=Pr(e.flags?.hostPort??e.flags?.devicePort);return!t||!n?{ok:!1,response:a(`INVALID_ARGS`,`runtime port-reverse requires numeric devicePort and hostPort values from 1 to 65535.`)}:{ok:!0,devicePort:t,hostPort:n}}function Pr(e){if(!(typeof e!=`number`||!Number.isInteger(e)||e<1||e>65535))return e}async function Fr(e){return await j({...e,command:`runtime clear`,use:ne})}async function Ir(e){let{req:t,sessionName:n,sessionStore:r}=e,i=(t.positionals?.[0]??`show`).toLowerCase();if(i===`port-reverse`)return await Ar({req:t,session:r.get(n),inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(i===`gesture-viewport`)return await Lr({...e,session:r.get(n)});if(!Rr(i))return a(`INVALID_ARGS`,`runtime requires set, show, clear, port-reverse, or gesture-viewport`);let o=r.get(n),s=r.getRuntimeHints(n);return i===`clear`?await zr({sessionName:n,sessionStore:r,session:o,current:s,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice}):i===`show`?Br(n,s):Hr({req:t,sessionName:n,sessionStore:r,session:o,current:s})}async function Lr(e){if(!e.session)return a(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let t=await nr({device:e.session.device,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(!t.ok)return t.response;let n=Pe(e.logPath,e.req.flags,e.session.appBundleId,e.session.trace?.outPath,e.req.meta?.requestId,e.req.meta);return{ok:!0,data:{viewport:await t.read(n)}}}function Rr(e){return e===`set`||e===`show`||e===`clear`}async function zr(e){let{sessionName:t,sessionStore:n,session:r,current:i,inspectFacts:a,bindDevice:o}=e;if(L(i)&&r?.appBundleId){let e=await Fr({device:r.device,inspectFacts:a,bindDevice:o});if(e.type===`response`)return e.response;A(r),await e.runtime.operations.clearRuntimeHints({appId:r.appBundleId,values:Kt(i)})}return{ok:!0,data:{session:t,cleared:n.clearRuntimeHints(t)}}}function Br(e,t){return{ok:!0,data:{session:e,configured:!!t,runtime:t}}}function Vr(e){return e?u(e.device):void 0}function Hr(e){let{req:t,sessionName:n,sessionStore:r,session:i,current:o}=e,s=Vr(i),c=It(t.flags?.platform??o?.platform??s);if(!c)return a(`INVALID_ARGS`,`runtime set only supports iOS, Android, and HarmonyOS sessions. Pass --platform ios|android|harmonyos or open a supported session first.`);if(s!==void 0&&s!==c)return a(`INVALID_ARGS`,`runtime set targets ${c}, but session "${n}" is already bound to ${s}.`);let l=Vt(o,Rt(t.flags,c));return Gt(l)===0?a(`INVALID_ARGS`,`runtime set requires at least one hint such as --metro-host, --metro-port, --bundle-url, or --launch-url.`):(r.setRuntimeHints(n,l),{ok:!0,data:{session:n,configured:!0,runtime:l}})}const Ur=/^[A-Za-z0-9_.:-]{1,64}$/,Wr=8192,Gr=4096;function Kr(e){let t=e[0]?.trim(),r=e[1]?.trim();if(!t)throw new n(`INVALID_ARGS`,`trigger-app-event requires <event> [payloadJson]`);if(!Ur.test(t))throw new n(`INVALID_ARGS`,`Invalid trigger-app-event event name: ${t}`,{hint:`Use 1-64 chars: letters, numbers, underscore, dot, colon, or dash.`});if(e.length>2)throw new n(`INVALID_ARGS`,`trigger-app-event accepts at most two arguments: <event> [payloadJson]`);return{eventName:t,payload:Jr(r,t)}}function qr(e,t,r){let i=u(e),a=Yr(e);if(!a)throw new n(`UNSUPPORTED_OPERATION`,`No app event URL template configured for ${i}.`,{hint:`Set AGENT_DEVICE_${i.toUpperCase()}_APP_EVENT_URL_TEMPLATE or AGENT_DEVICE_APP_EVENT_URL_TEMPLATE, for example "myapp://agent-device/event?name={event}&payload={payload}".`});let o=r?JSON.stringify(r):``,s=a.replaceAll(`{event}`,encodeURIComponent(t)).replaceAll(`{payload}`,encodeURIComponent(o)).replaceAll(`{platform}`,encodeURIComponent(i));if(s.length>Gr)throw new n(`INVALID_ARGS`,`trigger-app-event URL exceeds maximum supported length`,{hint:`Reduce payload size or shorten AGENT_DEVICE_*_APP_EVENT_URL_TEMPLATE.`,length:s.length,maxLength:Gr});return s}function Jr(e,t){if(e)try{let r=JSON.parse(e);if(!r||typeof r!=`object`||Array.isArray(r))throw new n(`INVALID_ARGS`,`trigger-app-event payload for "${t}" must be a JSON object`);let i=JSON.stringify(r);if(Buffer.byteLength(i,`utf8`)>Wr)throw new n(`INVALID_ARGS`,`trigger-app-event payload for "${t}" exceeds ${Wr} bytes`);return r}catch(t){throw t instanceof n?t:new n(`INVALID_ARGS`,`Invalid trigger-app-event payload JSON: ${e}`)}}function Yr(e){return((p(e)?process.env.AGENT_DEVICE_IOS_APP_EVENT_URL_TEMPLATE:m(e)?process.env.AGENT_DEVICE_MACOS_APP_EVENT_URL_TEMPLATE:process.env.AGENT_DEVICE_ANDROID_APP_EVENT_URL_TEMPLATE)??process.env.AGENT_DEVICE_APP_EVENT_URL_TEMPLATE)?.trim()||void 0}async function Xr(e,t,n,r){let{eventName:i,payload:a}=Kr([...r]),o=qr(t,i,a),s={eventUrl:o,...n.appBundleId===void 0?{}:{options:{appBundleId:n.appBundleId}},execution:ze(n)};return await e.operations.triggerAppEvent(s),{event:i,eventUrl:o,transport:`deep-link`,...F(`Triggered app event: ${i}`)}}async function Zr(e){let{device:t,positionals:n,inspectFacts:r,bindDevice:i,readiness:a}=e,o=await j({command:`trigger-app-event`,device:t,use:ye,inspectFacts:r,bindDevice:i,readiness:a});if(o.type===`response`)return{ok:!1,response:o.response};let s=o.runtime;return{ok:!0,execute:e=>Xr(s,t,e,n)}}function Qr(e){let t=(e[0]??`status`).toLowerCase();if(!yt(t))throw new n(`INVALID_ARGS`,`keyboard requires a subcommand: status, get, dismiss, enter, or return`);if(e.length>1)throw new n(`INVALID_ARGS`,`keyboard accepts at most one subcommand argument`);return $r(t)}function $r(e){return e===`get`?`status`:e===`return`?`enter`:e}const ei={"ime-probe":`android`},ti={"ime-probe":`android`,mechanism:`ios`,acknowledged:`harmonyos`},ni={"visibility-echo":`ios`,"android-acknowledged":`android`,"harmonyos-acknowledged":`harmonyos`};function ri(e){return{...e.appBundleId===void 0?{}:{options:{appBundleId:e.appBundleId}},execution:ze(e)}}async function ii(e,t){let n=await j(e);if(n.type===`response`)return{ok:!1,response:n.response};let r=n.runtime;return{ok:!0,execute:e=>t(r,e)}}function ai(e,t){return e.operations.keyboardStatus(ri(t)).then(e=>({platform:ei[e.kind],action:`status`,visible:e.visible,inputType:e.inputType,type:e.type,inputMethodPackage:e.inputMethodPackage,focusedPackage:e.focusedPackage,focusedResourceId:e.focusedResourceId,inputOwner:e.inputOwner}))}async function oi(e,t){let n=await e.operations.keyboardDismiss(ri(t)),r=ti[n.kind];return n.kind===`mechanism`?{platform:r,action:`dismiss`,wasVisible:n.wasVisible,dismissed:n.dismissed,visible:n.visible,mechanism:n.mechanism,...F(li(n.dismissed===!0,n.mechanism))}:n.kind===`acknowledged`?{platform:r,action:`dismiss`,...F(`Keyboard dismissed`)}:{platform:r,action:`dismiss`,attempts:n.attempts,wasVisible:n.wasVisible,dismissed:n.dismissed,visible:n.visible,inputType:n.inputType,type:n.type,inputMethodPackage:n.inputMethodPackage,focusedPackage:n.focusedPackage,focusedResourceId:n.focusedResourceId,inputOwner:n.inputOwner}}async function si(e,t){let n=await e.operations.keyboardEnter(ri(t)),r=ni[n.kind];return n.kind===`visibility-echo`?{platform:r,action:`enter`,visible:n.visible,wasVisible:n.wasVisible,...F(`Keyboard enter pressed`)}:{platform:r,action:`enter`,...F(`Keyboard enter pressed`)}}async function ci(e){let t=Qr(e.positionals),{device:n,inspectFacts:r,bindDevice:i,readiness:a}=e;return t===`status`?await ii({command:`keyboard status`,device:n,use:Se,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>ai(e,t)):t===`dismiss`?await ii({command:`keyboard dismiss`,device:n,use:E,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>oi(e,t)):await ii({command:`keyboard enter`,device:n,use:b,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>si(e,t))}function li(e,t){return e?t===`dismissKey`?`Keyboard dismissed via its dismiss key`:`Keyboard dismissed`:`Keyboard already hidden`}async function ui(e){let{req:t,sessionName:n,sessionStore:r,command:i,positionals:a,recordPositionals:o,deriveNextSession:s,prepare:c}=e,l=r.get(n),u=t.flags??{},d=W(i,l,u);if(d)return d;let f=await G({session:l,flags:u}),p=await c(f,l);if(!p.ok)return p.response;l&&Nn(t)===`may-invalidate`&&A(l);let m=await p.execute();if(l){let e=s?await s(l,m,f):l;O(r,e,t,i,m??{},{positionals:o??a}),e!==l&&r.set(n,e)}return{ok:!0,data:m??{}}}function di(e,t,n){if(!(e||t!==`dismiss`&&t!==`enter`&&t!==`return`||n?.platform!==`ios`))return a(`SESSION_NOT_FOUND`,`iOS keyboard action requires an active session so the target app stays foregrounded. Run open first.`)}async function fi(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,inspectFacts:a,bindDevice:o}=e,s=t.positionals??[];return await ui({req:t,sessionName:n,sessionStore:i,command:e.command,positionals:s,...e.deriveNextSession?{deriveNextSession:e.deriveNextSession}:{},prepare:async(n,i)=>{let c=await e.resolveRuntime({device:n,positionals:s,readiness:!0,inspectFacts:a,bindDevice:o});if(!c.ok)return{ok:!1,response:c.response};let l={...Pe(r,t.flags,i?.appBundleId,i?.trace?.outPath),surface:i?.surface};return{ok:!0,execute:()=>c.execute(l)}}})}async function pi(e){return di(e.sessionStore.get(e.sessionName),e.req.positionals?.[0]?.trim().toLowerCase(),e.req.flags??{})||await fi({...e,command:N.keyboard,resolveRuntime:e=>ci(e)})}async function mi(e){return await fi({...e,command:N.triggerAppEvent,resolveRuntime:e=>Zr(e),deriveNextSession:async(e,t)=>{let n=typeof t?.eventUrl==`string`?t.eventUrl:void 0,r=n?await ar(e.device,n,e.appBundleId)??e.appBundleId:e.appBundleId;return{...e,appBundleId:r}}})}function hi(e){let t=e.trim();return t.startsWith(`{`)&&t.endsWith(`}`)||t.startsWith(`[`)&&t.endsWith(`]`)}function gi(e,t){let r=t?.subject??`Payload`,i=e.trim();if(!i)throw new n(`INVALID_ARGS`,`${r} cannot be empty`);let a=t?.expandPath?t.expandPath(i,t.cwd):i;try{if(!U.statSync(a).isFile())throw new n(`INVALID_ARGS`,`${r} path is not a file: ${a}`);return{kind:`file`,path:a}}catch(e){if(e instanceof n)throw e;let t=e.code;if(t===`EACCES`||t===`EPERM`)throw new n(`INVALID_ARGS`,`${r} file is not readable: ${a}`);if(t&&t!==`ENOENT`)throw new n(`COMMAND_FAILED`,`Unable to read ${r} file: ${a}`,{cause:String(e)})}if(hi(i))return{kind:`inline`,text:i};throw new n(`INVALID_ARGS`,`${r} file not found: ${a}`)}async function _i(e){let t=gi(e,{subject:`Push payload`}),r=t.kind===`inline`?t.text:await vi(t.path);try{let e=JSON.parse(r);if(!e||typeof e!=`object`||Array.isArray(e))throw new n(`INVALID_ARGS`,`push payload must be a JSON object`);return e}catch(t){throw t instanceof n?t:new n(`INVALID_ARGS`,`Invalid push payload JSON: ${e}`)}}async function vi(e){try{return await cr.readFile(e,`utf8`)}catch(t){let r=t.code;throw r===`ENOENT`?new n(`INVALID_ARGS`,`Push payload file not found: ${e}`):r===`EISDIR`?new n(`INVALID_ARGS`,`Push payload path is not a file: ${e}`):r===`EACCES`||r===`EPERM`?new n(`INVALID_ARGS`,`Push payload file is not readable: ${e}`):new n(`COMMAND_FAILED`,`Unable to read push payload file: ${e}`,{cause:String(t)})}}async function yi(e){let{req:t,command:n,sessionName:r,sessionStore:i}=e,o=i.get(r),s=t.flags??{},c=W(n,o,s);if(c)return c;let l=Ti(n,t.positionals??[]);if(!l.ok)return l.response;let u=t.meta?.uploadedArtifactId;try{let c=u?wt(u,t.meta?.tenantId):k.expandHome(l.appPathInput);if(!U.existsSync(c))return a(`INVALID_ARGS`,`App binary not found: ${c}`);let d=await G({session:o,flags:s}),f=await V(e.inspectFacts)(d),p=z(n,f.operations.deployApp);if(p)return p;let m=await B(e.bindDevice)(d,ce);o&&A(o);let h=await m.operations.deployApp({app:l.app,appPath:c,replaceExisting:n===`reinstall`}),g=xi(d,l.app,c,h),_=P(g,`Installed: ${g.appName??vt(g)}`),v=wi(o,g);return v&&v!==o&&i.set(r,v),O(i,v,t,n,_),{ok:!0,data:_}}finally{u&&Ct(u)}}async function bi(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n),o=t.flags??{},s=W(`push`,i,o);if(s)return s;let c=t.positionals?.[0]?.trim(),l=t.positionals?.[1]?.trim();if(!c||!l)return a(`INVALID_ARGS`,`push requires <bundle|package> <payload.json|inline-json>`);let d=await _i(Ei(l,t.meta?.cwd)),f=await G({session:i,flags:o}),m=await V(e.inspectFacts)(f),h=z(`push`,m.operations.ensureReady)??z(`push`,m.operations.sendPushNotification);if(h)return h;let g=await B(e.bindDevice)(f,le);await g.operations.ensureReady({}),i&&A(i);let _=await g.operations.sendPushNotification({appId:c,payload:d}),v=p(f)?P({platform:`ios`,bundleId:c},`Pushed notification to ${c}`):P({platform:u(f),package:c,action:_.action,extrasCount:_.extrasCount},`Pushed notification to ${c}`);return O(r,i,t,`push`,v,{positionals:[c,l]}),{ok:!0,data:v}}function xi(e,t,n,r){return p(e)?Si(t,n,r):Ci(e,t,n,r)}function Si(e,t,n){let r=n.bundleId;return{app:e||r||n.launchTarget||t,appPath:t,platform:`ios`,...r?{appId:r,bundleId:r}:{},appName:n.appName,launchTarget:n.launchTarget}}function Ci(e,t,n,r){let i=r.packageName,a=e.platform===`harmonyos`?`harmonyos`:`android`;return{app:t||i||r.launchTarget||n,appPath:n,platform:a,...i?{appId:i,package:i,packageName:i}:{},appName:r.appName,launchTarget:r.launchTarget}}function wi(e,t){return!e||t.platform!==`harmonyos`||!t.appId?e:{...e,appBundleId:t.appId,appName:t.appName??t.app}}function Ti(e,t){let n=t[0]?.trim(),r=t[1]?.trim();if(e===`install`){let e=r??n;return e?{ok:!0,app:r?n??``:``,appPathInput:e}:{ok:!1,response:a(`INVALID_ARGS`,`install requires: install <path-to-app-binary>`)}}return!n||!r?{ok:!1,response:a(`INVALID_ARGS`,`reinstall requires: reinstall <app> <path-to-app-binary>`)}:{ok:!0,app:n,appPathInput:r}}function Ei(e,t){let n=gi(e,{subject:`Push payload`,cwd:t,expandPath:(e,t)=>k.expandHome(e,t)});return n.kind===`file`?n.path:n.text}async function K(e){let{req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}=e;return t.command===`install`||t.command===`reinstall`?await yi({req:t,command:t.command,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):t.command===`install_source`?await yr({req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):t.command===`push`?await bi({req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):null}async function Di(e,t,n){return await l(e,t,async(e,t)=>{let r=e;return await n({...r,internal:{...r.internal,executionPlan:{remainingSteps:t.remainingSteps}}})})}const Oi=new Set(`acceptAlert.actionButton.appLogCleanup.appLogDoctor.appLogInspect.appLogReattach.appLogStart.appState.appSwitcher.applyRuntimeHints.audioProbeCleanup.audioProbeQuery.audioProbeReattach.audioProbeStart.awaitAlert.back.bootTarget.bootTargetHeadless.captureScreenshot.captureSnapshot.captureSnapshotWithCustomActions.captureSnapshotWithoutActiveApp.clearRuntimeHints.closeApplication.configureProviderPortReverse.deployApp.deployMaterializedApp.dismissAlert.ensureReady.fillPoint.fillRef.finalizeApplicationClose.findText.focusPoint.gestureViewport.home.hoverPoint.hoverRef.keyboardDismiss.keyboardEnter.keyboardStatus.listApps.longPressPoint.materializeAppSource.networkDump.openApplication.perfFrames.perfMemorySample.perfMemorySnapshot.perfNativeCaptureCleanup.perfNativeCaptureReattach.perfNativeCaptureStart.perfProfileReport.performDirectionalFlingPlan.performGesturePlan.performMultiTouchGesturePlan.performTargetAuthoredDrag.prepareAppleRunner.prepareApplicationOpen.readAlert.readClipboard.readSetting.readTextAtPoint.resolveOpenTarget.screenRecordingCleanup.screenRecordingReattach.screenRecordingStart.scrollDirection.sendPushNotification.setFoldPose.setOrientation.setSetting.setViewport.shutdownTarget.tapElementSelector.tapPoint.tapRef.triggerAppEvent.tvRemote.typeText.writeClipboard`.split(`.`));function ki(e){return Oi.has(e)}const Ai=new Map(ue.map(e=>[e.name,e]));function ji(e){let t=new Set;for(let n of e){let e=Mi(n);if(e===void 0)return;for(let n of e)t.add(n)}return Object.freeze([...t].sort())}function Mi(e){let t=Ai.get(e.command)?.platformExecution;if(t===void 0)return;if(t.kind!==`device-runtime`)return[];let n=(`uses`in t?t.selectUses?.(e)??t.uses:[t.use]).flatMap(e=>e.required);return n.every(ki)?n:void 0}function Ni(e){if(e!==void 0&&e.remainingSteps.length!==0)return ji(e.remainingSteps)}function Pi(e,t,n){return{requestId:e.meta?.requestId,logPath:t,traceLogPath:n,verbose:e.flags?.verbose,activity:e.flags?.activity,launchConsole:e.flags?.launchConsole,launchArgs:e.flags?.launchArgs,clearAppState:e.flags?.clearAppState,iosXctestrunFile:e.flags?.iosXctestrunFile,iosXctestDerivedDataPath:e.flags?.iosXctestDerivedDataPath,iosXctestEnvDir:e.flags?.iosXctestEnvDir,runnerLeaseContext:jn(e),plannedOperations:Ni(e.internal?.executionPlan)}}function Fi(e,t,n){e.recordAction(t,{command:`close`,positionals:n.positionals??[],flags:n.flags??{},result:{session:t.name,...F(`Closed: ${t.name}`)}})}function Ii(e,t,n){if(!Ee(t))return{kind:`not-armed`};let r=t.actions.length;Fi(e,t,n);let i=Ge(t),a=e.writeSessionLog(t,{force:Ye(t,n.flags?.force)});return a.written?{kind:`committed`,path:a.path}:a.error?(t.actions.length=r,{kind:`failed`,error:a.error}):i?{kind:`committed`}:(ke(t),{kind:`aborted`})}function Li(e,n){let r=t(n),i=Je(e.scriptPublication??Ke);return{ok:!1,error:{...r,details:{...r.details,session:e.name,...i?{savedScript:i}:{}},retriable:!0}}}function Ri(e){let{req:t,session:n,sessionStore:r,platformCloseError:i}=e;i||Fi(r,n,t);try{let e=r.writeSessionLog(n,{force:Ye(n,t.flags?.force)});e.written&&Xe(n,e.path);return}catch(e){return zi(e)}}function zi(e){let r={hint:`Remove the existing target (or pass --force/--overwrite), then re-record with open --save-script.`,retriable:!1};return e instanceof n?new n(`COMMAND_FAILED`,`The session was closed, but its script was not saved: ${e.message}`,{...e.details,...r},e.cause):new n(`COMMAND_FAILED`,`The session was closed, but its script was not saved: ${t(e).message}`,r)}async function Bi(e){let t=e.clearRuntimeHints?Ce:T,n=await Le({...e,command:`close`,required:t.required});if(n.type===`response`)return n;if(!e.clearRuntimeHints)return{type:`runtime`,runtime:await n.bind(e.device,T)};let r=await n.bind(e.device,Ce);return{type:`runtime`,runtime:r,clearRuntimeHints:r.operations.clearRuntimeHints}}async function Vi(e){let{req:t,session:n,sessionName:r,logPath:i,sessionStore:a,lifecycle:o,clearRuntimeHints:s,cleanupFailures:c,repairArmed:l,dispatchTargetedPlatformClose:u,finalizeOrdinaryCloseScript:d}=e,f=async(e,t)=>{try{return await t()}catch(t){c.push({step:e,error:t});return}},p=e.platformResourceCleanup.retainExecutionHostAfterClose({device:n.device,shutdownRequested:t.flags?.shutdown===!0,hasScreenRecording:!!n.screenRecording,hasLease:!!n.lease}),m=a.getRuntimeHints(r);await Hi({address:r,session:n},a,f,e.platformResourceCleanup);let h=l?void 0:await u({req:t,session:n,logPath:i,lifecycle:o});s&&n.appBundleId&&L(m)&&await f(`runtime_hints`,async()=>{await s({appId:n.appBundleId,values:Kt(m)})});let g=await f(`application_lifecycle`,async()=>await o.operations.finalizeApplicationClose({appBundleId:n.appBundleId,surface:n.surface??`app`,retainRunner:p,stateDir:a.resolveDaemonStateDir(),shutdownTarget:t.flags?.shutdown===!0})??{}),_=l?void 0:d({req:t,session:n,sessionStore:a,platformCloseError:h});return await f(`materialized_paths`,()=>Wt(r)),{platformCloseError:h,saveScriptError:_,shutdownResult:g?.shutdown}}async function Hi(e,t,n,r){let{address:i,session:a}=e;await n(`recording`,()=>Lt({session:a,sessionName:i,sessionStore:t})),await n(`app_log`,()=>Ft({session:a,sessionName:i,sessionStore:t})),await n(`audio_probe`,()=>an({session:a,sessionName:i,sessionStore:t})),await n(`perf_capture`,()=>Dt({session:a,sessionName:i,sessionStore:t})),await n(`platform_snapshot_helper`,()=>nn(a,r))}function Ui(e,t){return rn({sessionName:e,phase:`session_close_cleanup_failed`,failures:t})}function Wi(e){if(e instanceof n)return e;let t=e instanceof Error?e.message:String(e);return new n(`COMMAND_FAILED`,`The platform close failed: ${t}`,{hint:`The repair transaction was not committed because the platform close failed; fix the underlying issue and retry close --save-script.`})}const Gi=(e,t)=>(e.positionals?.length??0)>0||Ot(t);async function Ki(e){let{req:t,session:n,logPath:r,sessionStore:i,lifecycle:a}=e,o=Ee(n),s=JSON.stringify(t.positionals??[]);if(o&&!Te(n,s)){let e=await Ji({req:t,session:n,logPath:r,lifecycle:a});if(e)return{response:Li(n,Wi(e))};Oe(n,s)}let c=Ii(i,n,t);return c.kind===`failed`?{response:Li(n,c.error)}:{repairArmed:o,...c.kind===`committed`&&c.path?{healedScriptPath:c.path}:{},...c.kind===`aborted`?{aborted:!0}:{}}}async function qi(e){try{return{providerData:await Bt(e)}}catch(n){let r=t(n);return{response:{ok:!1,error:{...r,hint:`The provider device could not be released. Retry close after the provider is reachable.`,details:{...r.details,session:e.session.name},retriable:!0}}}}}async function Ji(e){let{req:t,session:n,logPath:r,lifecycle:i}=e;if(Gi(t,n))try{await i.operations.closeApplication({positionals:t.positionals??[],outPath:t.flags?.out,appBundleId:n.appBundleId,surface:n.surface??`app`,execution:Pi(t,r,n.trace?.outPath)});return}catch(e){return e}}function Yi(e,t){if(!e.flags?.saveScript||M(t))return;let r=t.scriptPublication;if(r?.kind!==`repair`)throw r===void 0||r.kind===`none`?new n(`INVALID_ARGS`,`close --save-script cannot publish this session: recording was not armed before this journey began, so there is no recording-time target evidence to publish.`,{hint:`Retry with plain close (it tears down without writing). To capture a publishable recording, start a fresh session with open <app> --save-script[=<path>].`}):new n(`INVALID_ARGS`,`close --save-script cannot ${r.status===`published`?`re-publish`:`publish`} this terminal recording. Retry with plain close; it will tear down the session without writing.`)}async function Xi(e){let{req:t,sessionName:r,logPath:i,sessionStore:o,leaseRegistry:s,leaseLifecycleProvider:c}=e,l=o.get(r);if(!l)return await ea({req:t,logPath:i,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});Yi(t,l);let u=t.positionals?.[0];if(t.internal?.closeAppOnly===!0&&!u)return a(`INVALID_ARGS`,`App-only close requires an app target`);if(!e.platformResourceCleanup)throw new n(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`);let d=e.platformResourceCleanup,f=await Bi({device:l.device,clearRuntimeHints:t.internal?.closeAppOnly!==!0&&!!l.appBundleId&&L(o.getRuntimeHints(r)),inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(f.type===`response`)return f.response;if(A(l),t.internal?.closeAppOnly===!0&&u)return await $i({req:t,session:l,logPath:i,lifecycle:f.runtime,app:u});let p=await Ki({req:t,session:l,logPath:i,sessionStore:o,lifecycle:f.runtime});if(`response`in p)return p.response;let m=await Zi({req:t,session:l,sessionName:r,logPath:i,sessionStore:o,leaseRegistry:s,leaseLifecycleProvider:c,lifecycle:f.runtime,clearRuntimeHints:f.clearRuntimeHints,repairArmed:p.repairArmed,platformResourceCleanup:d});return m.kind===`response`?m.response:Qi({session:l,repair:p,requestedSaveScript:!!t.flags?.saveScript,shutdownResult:m.shutdownResult,providerData:m.providerData})}async function Zi(e){let{req:t,session:n,sessionName:r,logPath:i,sessionStore:a,leaseRegistry:o,leaseLifecycleProvider:s,lifecycle:c,clearRuntimeHints:l}=e,u=[],{platformCloseError:d,saveScriptError:f,shutdownResult:p}=await Vi({req:t,session:n,sessionName:r,logPath:i,sessionStore:a,lifecycle:c,clearRuntimeHints:l,cleanupFailures:u,repairArmed:e.repairArmed,dispatchTargetedPlatformClose:Ji,finalizeOrdinaryCloseScript:Ri,platformResourceCleanup:e.platformResourceCleanup}),m=await qi({session:n,leaseRegistry:o,leaseLifecycleProvider:s});if(m.response)return{kind:`response`,response:m.response};let h=Ui(r,u),g=d??h;if(g?n.deviceClaim&&I({level:`warn`,phase:`device_claim_close_effects_unconfirmed`,data:{deviceKey:n.deviceClaim.deviceKey,session:r}}):await mn(n.deviceClaim),a.delete(r),g)throw g;if(f)throw f;return{kind:`closed`,providerData:m.providerData,shutdownResult:p}}function Qi(e){let{session:t,repair:n,requestedSaveScript:r,shutdownResult:i,providerData:a}=e;if(n.aborted&&r)return{ok:!1,error:{code:`COMMAND_FAILED`,message:`The repair was aborted and no script was written.`,hint:`Recovery: replay --from <n> --plan-digest <digest> before closing.`,details:{session:t.name}}};let o=n.healedScriptPath?{savedScript:n.healedScriptPath}:{},s=a?{provider:a}:{},c=`Closed: ${t.name}`;return i?{ok:!0,data:P({session:t.name,shutdown:i,...o,...s},c)}:{ok:!0,data:{session:t.name,...F(c),...o,...s}}}async function $i(e){let{req:t,session:n,logPath:r,lifecycle:i,app:a}=e,o=await Ji({req:t,session:n,logPath:r,lifecycle:i});if(o)throw o;return{ok:!0,data:{app:a,...F(`Closed: ${a}`)}}}async function ea(e){let{req:t,logPath:n,inspectFacts:r,bindDevice:i}=e;if(!t.positionals||t.positionals.length===0)return a(`SESSION_NOT_FOUND`,`No active session`);let o=await Bi({device:await G({session:void 0,flags:t.flags}),clearRuntimeHints:!1,inspectFacts:r,bindDevice:i});return o.type===`response`?o.response:(await o.runtime.operations.closeApplication({positionals:t.positionals,outPath:t.flags?.out,surface:`app`,ensureReady:!0,execution:Pi(t,n)}),{ok:!0,data:{app:t.positionals[0],...F(`Closed: ${t.positionals[0]}`)}})}function ta(e,t){return e.operations.ensureReady(t)}function na(e,t,n){return e.operations.listApps({device:t,filter:n})}async function ra(e){let{req:t,sessionName:n,sessionStore:r}=e;switch(t.command){case`session_list`:return ia(t,r);case`devices`:return await oa(t);case`capabilities`:return await ma({req:t,sessionName:n,sessionStore:r,inspectFacts:e.inspectFacts});case`apps`:return await ba({req:t,sessionName:n,sessionStore:r,bindDevice:e.bindDevice,inspectFacts:e.inspectFacts,providerAppCatalog:e.providerAppCatalog});default:return null}}function ia(e,t){let n=Vn(e);return{ok:!0,data:{sessions:t.listRefs().filter(e=>Kn(e.session,n)).map(e=>aa(e,t))}}}function aa({address:e,session:t},n){let r=n.resolveSessionDir(e);return{name:t.name,address:e,sessionStateDir:r,runnerLogPath:pt(r),platform:u(t.device),...h(t.device.platform)&&t.device.appleOs?{appleOs:t.device.appleOs}:{},target:t.device.target??`mobile`,surface:t.surface??`app`,device:t.device.name,id:t.device.id,device_id:t.device.id,createdAt:t.createdAt,...h(t.device.platform)&&!m(t.device)&&{device_udid:t.device.id,ios_simulator_device_set:t.device.simulatorSetPath??null}}}async function oa(e){try{let t=sa();return{ok:!0,data:{devices:(await la(e)).map(e=>({...Da(e),...ca(e,t)}))}}}catch(e){let t=r(e);return{ok:!1,error:{code:t.code,message:t.message,...t.details?{details:t.details}:{}}}}}function sa(){let e=new Map;for(let t of cn({})){let n=t.claim;!n||ln(t.classification)||e.set(n.deviceKey,{session:n.session,workspace:n.workspace})}return e}function ca(e,t){let n=t.get(sn(An(e)));return n?{claimedBy:n}:{}}async function la(e){let t=e.flags?.platform;return pa(await In(ua(e,t)),e.flags?.platform,e.flags?.target)}function ua(e,t){let n=e.flags;return{platform:t,target:n?.target,deviceName:n?.device,udid:n?.udid,serial:n?.serial,iosSimulatorSetPath:da(n?.iosSimulatorDeviceSet,t,n?.target),androidSerialAllowlist:fa(n?.androidDeviceAllowlist)}}function da(e,t,n){return g({simulatorSetPath:Pn(e),platform:t,target:n})}function fa(e){let t=R(e);return t?Array.from(t).sort():void 0}function pa(e,t,n){let r=t?e.filter(e=>Oa(e,t)):e;return n?r.filter(e=>(e.target??`mobile`)===n):r}async function ma(e){let t=await Ea({...e,androidAvdSelection:`include-stopped`});if(`response`in t)return t.response;let{device:n}=t,r=ha(n,e.sessionStore.get(e.sessionName),e.req.flags),i=await Ca(n,e.inspectFacts);return{ok:!0,data:{device:Da(n),availableCommands:xe().filter(e=>e===`appstate`&&r?!0:va(e,i))}}}function ha(e,t,n){return!t||!p(e)&&!m(e)||!vr(n,t)?!1:ga(t)||_a(e,t)}function ga(e){return!!(e.appName||e.appBundleId)}function _a(e,t){return!!(m(e)&&t.surface!==void 0&&t.surface!==`app`&&t.surface!==`frontmost-app`)}function va(e,t){let n=de(e);return!n||!t?!1:n.some(e=>e.length>0&&e.every(e=>ya(t,e)))}function ya(e,t){return Object.hasOwn(e.operations,t)?e.operations[t]?.available===!0:!1}async function ba(e){let{req:t,sessionName:n,sessionStore:r,bindDevice:i,inspectFacts:a}=e,o=await xa(t,e.providerAppCatalog);if(o)return o;let s=await Ea({req:t,sessionName:n,sessionStore:r,androidAvdSelection:`include-stopped`});if(`response`in s)return s.response;let{device:c}=s,l=rt(t.flags?.appsFilter),u=R(t.flags?.androidDeviceAllowlist),d=await wa({device:c,inspectFacts:a,bindDevice:i});if(`response`in d)return d.response;let f=d.runtime;return Ta(await na(f,await ta(f,{serial:t.flags?.serial,androidSerialAllowlist:u?[...u].sort():void 0}),l))}async function xa(e,t){let n=Sa(e);if(!(!t||!n||!t.supports(n.provider)))return{ok:!0,data:{apps:[...await t.list(n,xt(e.meta?.requestId))]}}}function Sa(e){let t=Mn(e);if(t.leaseId)return;let n=t.leaseProvider;if(!n)return;let r=e.flags?.platform;if(r===`android`||r===`ios`)return{provider:n,platform:r,...e.internal?.publicNetworkOnly?{publicNetworkOnly:!0}:{}}}async function Ca(e,t){if(t)try{return await t(e)}catch{return}}async function wa(e){if(!e.inspectFacts)throw new n(`COMMAND_FAILED`,`Device runtime facts inspection is unavailable.`,{reason:`runtime-gateway-missing`});let t=await e.inspectFacts(e.device),r=[t.operations.ensureReady,t.operations.listApps].find(e=>!e.available);if(r&&!r.available)return{response:{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`apps is not supported on this device`,...r.hint?{hint:r.hint}:{}}}};if(!e.bindDevice)throw new n(`COMMAND_FAILED`,`Device runtime binding is unavailable.`,{reason:`runtime-gateway-missing`});return{runtime:await e.bindDevice(e.device,ge)}}function Ta(e){return{ok:!0,data:{apps:e.map(e=>e.name&&e.name!==e.id?`${e.name} (${e.id})`:e.id)}}}async function Ea(e){let{req:t,sessionName:n,sessionStore:r,androidAvdSelection:i}=e,a=r.get(n),o=t.flags??{},s=W(t.command,a,o);return s?{response:s}:{device:await G({session:a,flags:o,androidAvdSelection:i})}}function Da({simulatorSetPath:e,iosPhysicalDeviceBackend:t,appleOs:n,...r}){return{...r,platform:u({platform:r.platform,appleOs:n}),...h(r.platform)&&n?{appleOs:n}:{}}}function Oa(e,t){return f(e,t)}function q(e){return a(`INVALID_ARGS`,e)}function ka(e,t,r,i){try{return ir({device:e,surfaceFlag:t,openTarget:r,existingSurface:i})}catch(e){return a(e instanceof n?e.code:`INVALID_ARGS`,String(e.message))}}async function Aa(e){let{shouldRelaunch:t,openTarget:n,surface:r,device:i}=e;if(!t)return null;let a=await rr({target:n,platform:i.platform,surface:r});return a?q(a):null}async function ja(e){let{shouldRelaunch:t,openTarget:n,platform:r}=e;if(!t)return null;let i=await rr({target:n,platform:r});return i?q(i):null}function Ma(e){let t=tn(e);if(!t.ok)return{type:`response`,response:t};let{runtime:n,previousRuntime:r,replacedStoredRuntime:i}=t.data;return{type:`plan`,plan:{runtime:n,previousRuntime:r,replacedStoredRuntime:i,applyRuntimeHints:L(n),clearRemovedRuntimeHints:Ht({replacedStoredRuntime:i,previousRuntime:r,runtime:n,session:e.existingSession})}}}async function Na(e){let{req:t,logPath:r,surface:i,openTarget:a,existingSession:o,runtime:c,runtimeHintPlan:l,clearRuntimeHints:u,foreground:d}=e;await c.operations.prepareApplicationOpen({target:a,currentAppBundleId:o?.appBundleId,hasExistingSession:o!==void 0,surface:i,prewarmRunnerOnColdBoot:i===`app`&&!!a&&!s(a??``),execution:{startupDeadlineAtMs:Fa(t),requestId:t.meta?.requestId,logPath:r,traceLogPath:o?.trace?.outPath,verbose:t.flags?.verbose,iosXctestrunFile:t.flags?.iosXctestrunFile,iosXctestDerivedDataPath:t.flags?.iosXctestDerivedDataPath,iosXctestEnvDir:t.flags?.iosXctestEnvDir,runnerLeaseContext:jn(t)}});let{appBundleId:f,appName:p}=await Pa({runtime:c,surface:i,openTarget:a,existingAppBundleId:o?.appBundleId,foreground:d});if(l.clearRemovedRuntimeHints){if(!u)throw new n(`COMMAND_FAILED`,`Runtime hint clear operation was not admitted for this open.`,{reason:`runtime-hints-operation-missing`});await zt({replacedStoredRuntime:l.replacedStoredRuntime,previousRuntime:l.previousRuntime,runtime:l.runtime,session:o,clearRuntimeHints:u})}return{type:`details`,details:{appBundleId:f,appName:p,runtime:l.runtime}}}async function Pa(e){let{runtime:t,surface:n,openTarget:r,existingAppBundleId:i,foreground:a}=e,o=await t.operations.resolveOpenTarget({target:r,currentAppBundleId:i,surface:n,foreground:a});return{appBundleId:o.appBundleId,appName:o.appName}}function Fa(e){let t=e.flags?.timeoutMs;return typeof t==`number`&&Number.isFinite(t)&&t>0?Date.now()+t:void 0}async function Ia(e){let{req:t,hasExistingSession:n}=e;return t.flags?.foreground===!0?t.positionals?.[0]?{type:`resolved`,req:t}:n?{type:`response`,response:a(`INVALID_ARGS`,`open --foreground only applies to a fresh session. Close the current session first, or omit --foreground.`)}:t.flags?.udid!==void 0||t.flags?.device!==void 0?{type:`response`,response:a(`INVALID_ARGS`,`open --foreground resolves the device itself; drop --udid/--device or open explicitly: agent-device open <app> --udid <udid>.`)}:t.flags?.platform!==void 0&&t.flags.platform!==`ios`?{type:`response`,response:a(`INVALID_ARGS`,`open --foreground only supports --platform ios; drop the flag or pass --platform ios.`)}:{type:`resolved`,req:{...t,flags:{...t.flags,platform:`ios`}}}:{type:`not-requested`}}async function La(e){let{req:n,sessionName:r,logPath:i,sessionStore:a,openResponse:o}=e;if(!o.ok||n.flags?.foreground!==!0)return o;try{let t=await or({req:{...n,command:`snapshot`,positionals:[],flags:{...n.flags,snapshotInteractiveOnly:!0}},sessionName:r,logPath:i,sessionStore:a,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});return t.ok?{ok:!0,data:{...o.data,snapshot:t.data}}:Ra(o.data,t.error)}catch(e){return Ra(o.data,t(e))}}function Ra(e,t){return{ok:!0,data:{...e,warnings:[...nt(e),`The session is open, but the initial interactive snapshot failed (${t.code}: ${t.message}). Run: agent-device snapshot -i`],initialSnapshotError:t}}}function za(e){let{sessionName:t,sessionStateDir:n,runnerLogPath:r,requestLogPath:i,eventLogPath:a,appName:o,appBundleId:s,surface:c,startup:l,timing:f,device:m,runtime:h,runtimeHintCount:g,sessionReused:_,selection:v}=e,y={session:t,surface:c,sessionStateDir:n,runnerLogPath:r,requestLogPath:i,eventLogPath:a,sessionReused:_,...Ba(v)};return o&&(y.appName=o),s&&(y.appBundleId=s),l&&(y.startup=l),f&&(y.timing=f),h&&g(h)>0&&(y.runtime=h),m&&(y.platform=u(m),y.target=m.target??`mobile`,y.device=m.name,y.id=m.id,y.kind=m.kind,d(m.platform)&&(y.serial=m.id)),m&&p(m)&&(y.device_udid=m.id,y.ios_simulator_device_set=m.simulatorSetPath??null),{...y,...F(`Opened: ${o??s??t}`)}}function Ba(e){if(!e)return{};let{device:t,...n}=e;return{selection:n}}function Va(e){let{existingSession:t,sessionName:n,sessionScope:r,device:i,surface:a,appBundleId:o,appName:s}=e;return t?{...t,device:i,surface:a,appBundleId:o,appName:s,snapshot:void 0}:{name:n,sessionScope:r,device:i,createdAt:Date.now(),surface:a,appBundleId:o,appName:s,actions:[]}}const Ha=Object.freeze({async observeBootTimeMs(e){if(p(e)&&e.kind===`simulator`){let{observeSimulatorBootTimeMs:t}=await import(`./simulator-boot.js`);return await t(e)}if(e.platform===`android`){let{observeAndroidBootTimeMs:t}=await import(`./device-boot.js`);return await t(e)}return{observed:!1,reason:`unsupported-device`}}});function Ua(e,t){e.warnings=[...nt(e),t]}function Wa(e){return e.internal?.resolvedSessionScope??Vn(e)}function Ga(e){let{session:t,existingSession:n,saveScriptRequested:r,responseData:i}=e;if(!n&&r){We(t,{});return}M(n)&&(Ze(t),Ua(i,`Script publication was aborted because this session completed a second open. Start a fresh session with open --save-script to author another script.`))}function Ka(e){return`Took the device from session "${e.session}" in workspace "${e.workspace}": that device rebooted after its claim was taken, so its app and runner were already gone.`}function qa(e,t){if(e.platform!==`android`)return!1;let n=t.flags?.testIme;return n===void 0?e.kind===`emulator`:n}function Ja(e,t,n){return{durationMs:Math.max(0,Date.now()-e),measuredAt:new Date().toISOString(),method:`open-command-roundtrip`,appTarget:t,appBundleId:n}}async function Ya(e,t){if(!t)return;let n=await dn(t);if(n.status!==`renewed`)return n.conflict?Xt(e,n.conflict):a(`DEVICE_IN_USE`,`${e.name} no longer holds the claim this open was made with.`,{reason:`claim-lost-during-open`,deviceKey:t.deviceKey,hint:`Close this session and open the device again to claim it.`})}async function Xa(e){let{req:t,sessionName:n,sessionStore:r,logPath:o,device:s,openTarget:c,openPositionals:l,appName:u,surface:d,appBundleId:f,runtimeHints:p,lifecycle:m,applyRuntimeHints:h,existingSession:g,deviceClaim:_,tookOverDeviceClaim:v,selection:y}=e,b=t.flags?.relaunch===!0,x=f,ee=Date.now(),S=await Za({req:t,sessionName:n,sessionStore:r,device:s,surface:d,sessionAppBundleId:x,appName:u,existingSession:g});if(S.type===`response`)return S.response;let C=S.session??g,te=Date.now(),ne=await m.operations.openApplication({target:c,positionals:l,outPath:t.flags?.out,runtimeLaunchUrl:p?.launchUrl,appBundleId:x,surface:d,hasExistingSession:g!==void 0,relaunch:b,prewarmRunnerBeforeOpen:t.flags?.maestro?.prewarmRunnerBeforeOpen===!0,enableTestIme:qa(s,t),stateDir:r.resolveDaemonStateDir(),runtimeHints:Kt(p),applyRuntimeHints:h,execution:Pi(t,o,g?.trace?.outPath)});x=ne.appBundleId??x;let w={...ne.timing},re=Zn(y),ie=c?Ja(te,c,x):void 0;if(bt(t.meta?.requestId)){let e=i();return a(e.code,e.message,e.details)}g&&Fe({session:g,command:`open`,positionals:[],flags:void 0});let T=Va({existingSession:C,sessionName:g?.name??Un(t),sessionScope:g?.sessionScope??Wa(t),device:s,surface:d,appBundleId:x,appName:u});T.lease=en({req:t,existingLease:g?.lease}),_&&(T.deviceClaim=_),t.runtime!==void 0&&Ut(r,n,p);let E=r.ensureSessionDir(n),ae=mt(E,t.meta?.requestId??ot().requestId);w.totalDurationMs=Math.max(0,Date.now()-ee),I({level:`info`,phase:`open_timing`,durationMs:w.totalDurationMs,data:w});let D=za({sessionName:T.name,sessionStateDir:E,runnerLogPath:pt(E),requestLogPath:ae,eventLogPath:r.resolveEventLogPath(n),appName:u,appBundleId:x,surface:d,startup:ie,timing:w,device:s,runtime:p,runtimeHintCount:Gt,sessionReused:g!==void 0,selection:re});return v&&Ua(D,Ka(v)),Ga({session:T,existingSession:g,saveScriptRequested:!!t.flags?.saveScript,responseData:D}),r.set(n,T),r.recordAction(T,{command:`open`,positionals:l,flags:t.flags??{},runtime:t.runtime===void 0?void 0:p,result:D}),{ok:!0,data:D}}async function Za(e){let{req:t,sessionName:n,sessionStore:r,existingSession:i}=e,a=t.internal?.openLifecycle?.beforeDispatch;if(!a)return{type:`session`,session:i};let o=Qa(e);r.set(n,o);let s=await a();return s&&!s.ok?{type:`response`,response:s}:{type:`session`,session:r.get(n)??o}}function Qa(e){let{req:t,device:n,surface:r,sessionAppBundleId:i,appName:a,existingSession:o}=e,s=Va({existingSession:o,sessionName:o?.name??Un(t),sessionScope:o?.sessionScope??Wa(t),device:n,surface:r,appBundleId:i,appName:a});return s.lease=en({req:t,existingLease:o?.lease}),s}function $a(e){let{req:t,device:n,sessionStore:r}=e,i=r.findByDevice(n.id);if(!i)return;let a=Mt(t);return Gn(t,i.session)?Hn(i,n,a):Jn(i,n,a)}async function eo(e){let{req:t,device:n,owner:r,sessionName:i,sessionStore:a,reconcileOrphanedDeviceClaim:o}=e;switch($t(r)){case`none`:return{status:`not-required`};case`allocator-held`:{let e=qt(n,r,Qt({device:n,owner:r,stateDir:a.resolveDaemonStateDir(),intent:{kind:`ordinary`}}));return e?{status:`refused`,response:e}:{status:`not-required`}}case`ordinary`:return await kn({device:n,session:i,workspace:t.meta?.cwd??process.cwd(),stateDir:a.resolveDaemonStateDir(),reconcileOrphanedDeviceClaim:o,observeDeviceBoot:Ha})}}async function to(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,device:a,surface:o,openTarget:s,lifecycle:c,runtimeHintPlan:l,applyRuntimeHints:u,clearRuntimeHints:d,reconcileOrphanedDeviceClaim:f,selection:p}=e,m=$a({req:t,device:a,sessionStore:i});if(m)return m;let h=await eo({req:t,device:a,owner:c.owner,sessionName:n,sessionStore:i,reconcileOrphanedDeviceClaim:f});if(h.status===`conflict`)return Xt(a,h.conflict);if(h.status===`refused`)return h.response;let g=h.status===`acquired`?h.ownership:void 0,_=h.status===`acquired`?h.tookOver:void 0,v={mayHaveStarted:!1},y=async()=>await no({ownership:g,effects:v,sessionName:n,sessionStore:i});try{let e=await Na({req:t,logPath:r,surface:o,openTarget:s,runtime:c,runtimeHintPlan:l,clearRuntimeHints:d,foreground:t.flags?.foreground===!0&&s===void 0});if(e.type===`response`)return await y(),e.response;let f=await Ya(a,g);if(f)return f;v.mayHaveStarted=!0;let m=t.positionals??[],h=s??e.details.appBundleId,b=await Xa({req:t,sessionName:n,sessionStore:i,logPath:r,device:a,openTarget:h,openPositionals:m.length>0?m:h?[h]:[],appBundleId:e.details.appBundleId,appName:e.details.appName,runtimeHints:e.details.runtime,lifecycle:c,applyRuntimeHints:u,surface:o,deviceClaim:g,tookOverDeviceClaim:_,selection:p});return b.ok||await y(),b}catch(e){throw await y(),e}}async function no(e){let{ownership:t,effects:n,sessionName:r,sessionStore:i}=e;if(!t)return;if(!n.mayHaveStarted){await mn(t);return}if(i.get(r)?.deviceClaim?.ownerToken===t.ownerToken)return;let a=await fn(t);I({level:`warn`,phase:`device_claim_open_effects_unconfirmed`,data:{deviceKey:t.deviceKey,outcome:a}})}const ro=new Map;async function io(e){let t=C({applyRuntimeHints:e.runtimeHintPlan.applyRuntimeHints,clearRemovedRuntimeHints:e.runtimeHintPlan.clearRemovedRuntimeHints}),n=await Le({...e,command:`open`,required:t.use.required});if(n.type===`response`)return n;let r=n.bind;switch(t.kind){case`open`:return{type:`runtime`,runtime:await r(e.device,ae)};case`open-apply-runtime-hints`:{let t=await r(e.device,ee);return{type:`runtime`,runtime:t,applyRuntimeHints:t.operations.applyRuntimeHints}}case`open-clear-runtime-hints`:{let t=await r(e.device,te);return{type:`runtime`,runtime:t,clearRuntimeHints:t.operations.clearRuntimeHints}}case`open-apply-and-clear-runtime-hints`:{let t=await r(e.device,oe);return{type:`runtime`,runtime:t,applyRuntimeHints:t.operations.applyRuntimeHints,clearRuntimeHints:t.operations.clearRuntimeHints}}}}async function ao(e){let t=Ma(e);if(t.type===`response`)return t;let n=await io({device:e.device,runtimeHintPlan:t.plan,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});return n.type===`response`?n:{type:`runtime`,runtimeHintPlan:t.plan,admission:n}}async function oo(e){let{sessionName:t,logPath:n,sessionStore:r}=e,i=r.get(t),o=await Ia({req:e.req,hasExistingSession:!!i});if(o.type===`response`)return o.response;let s=o.type===`resolved`?o.req:e.req;if(i){if(s.flags?.saveScript)return a(`INVALID_ARGS`,`open --save-script can only arm a fresh session. Use the current session without --save-script, or close it and start a fresh session.`);let o=s.flags?.relaunch===!0,c=s.positionals?.[0],l=c??(o?i.appName:void 0),u=ka(i.device,s.flags?.surface,l,i.surface);if(typeof u!=`string`)return u;if(!l&&u===`app`)return q(o?`open --relaunch requires an app name or an active session app.`:`Session already active. Close it first or pass a new --session name.`);let d=await Aa({shouldRelaunch:o,openTarget:l,surface:u,device:i.device});if(d)return d;let f=await Ya(i.device,i.deviceClaim);if(f)return f;let p=await _r(i.device),m=Qn(p);await s.internal?.retainDeviceExecutionLock?.(p.id);let h=await ao({req:s,sessionStore:r,sessionName:t,device:p,existingSession:i,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(h.type===`response`)return h.response;let{admission:g,runtimeHintPlan:_}=h;A(i);let v=await Na({req:s,logPath:n,surface:u,openTarget:l,existingSession:i,runtime:g.runtime,runtimeHintPlan:_,clearRuntimeHints:g.clearRuntimeHints,foreground:!1});return v.type===`response`?v.response:await Ya(p,i.deviceClaim)||await Xa({req:s,sessionName:t,sessionStore:r,logPath:n,device:p,openTarget:l,openPositionals:c?s.positionals??[]:l?[l]:[],appBundleId:v.details.appBundleId,appName:v.details.appName,runtimeHints:v.details.runtime,lifecycle:g.runtime,applyRuntimeHints:g.applyRuntimeHints,surface:u,existingSession:i,selection:m})}let c=s.flags?.relaunch===!0,l=s.positionals?.[0];if(c&&!l)return q(`open --relaunch requires an app argument.`);let u=await ja({shouldRelaunch:c,openTarget:l,platform:s.flags?.platform===`android`?`android`:void 0});if(u)return u;let d=await zn(s.flags??{},At(l)),f=d.device;await s.internal?.retainDeviceExecutionLock?.(f.id);let p=ka(f,s.flags?.surface,l);if(typeof p!=`string`)return p;let m=await Aa({shouldRelaunch:c,openTarget:l,surface:p,device:f});if(m)return m;let h=await ao({req:s,sessionStore:r,sessionName:t,device:f,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(h.type===`response`)return h.response;let{admission:g,runtimeHintPlan:_}=h;return await gt(ro,f.id,async()=>await to({req:s,sessionName:t,logPath:n,sessionStore:r,device:f,surface:p,openTarget:l,lifecycle:g.runtime,runtimeHintPlan:_,applyRuntimeHints:g.applyRuntimeHints,clearRuntimeHints:g.clearRuntimeHints,reconcileOrphanedDeviceClaim:e.reconcileOrphanedDeviceClaim,selection:d}))}async function so(e){let t=await oo(e);return!t.ok||e.req.flags?.foreground!==!0?t:await La({...e,inspectFacts:V(e.inspectFacts),bindDevice:B(e.bindDevice),openResponse:t})}const co=`iOS appstate requires an active session on the target device. Run open first (for example: open --session sim --platform ios --device "<name>" <app>).`,lo=`macOS appstate requires an active session on the target device. Run open first (for example: open --session macos --platform macos "System Settings").`;function uo(e){return t=>a(e?`INVALID_ARGS`:`UNSUPPORTED_OPERATION`,e?`boot --headless is supported only for Android emulators.`:`boot is not supported on this device`,void 0,t.hint?{hint:t.hint}:void 0)}function fo(e){if(e)return e;throw new n(`COMMAND_FAILED`,`Device runtime facts inspection is unavailable.`,{reason:`runtime-gateway-missing`})}function po(e){if(e)return e;throw new n(`COMMAND_FAILED`,`Device runtime binding is unavailable.`,{reason:`runtime-gateway-missing`})}function mo(e){return e.available?null:a(`UNSUPPORTED_OPERATION`,`shutdown is supported only for Apple simulators and Android emulators.`,void 0,e.hint?{hint:e.hint}:void 0)}function ho(e,t){return!!(e?.trim()||t?.platform===`android`&&t.kind===`emulator`)}async function go(t,n){if(!n.appBundleId)return;let i=await j({command:`appstate`,device:n.device,use:me,inspectFacts:t.inspectFacts,bindDevice:t.bindDevice});if(i.type!==`response`)try{return(await i.runtime.operations.appState({appBundleId:n.appBundleId})).applicationState}catch(t){if(e(t))throw t;I({level:`warn`,phase:`apple_appstate_runner_read_failed`,data:{code:r(t).code,message:r(t).message}});return}}async function _o(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n),o=t.flags??{},s=o.platform;if(!i&&gr(o)){let e=s===`ios`?`No active session "${n}". Run open with --session ${n} first.`:`No active session "${n}". Run open with --session ${n} first, or omit --session to query by device selector.`;return a(`SESSION_NOT_FOUND`,e)}let c=W(`appstate`,i,o);if(c)return c;let l=h(i?.device.platform)&&vr(o,i),d=s===`ios`,f=s===`macos`;if(d&&!l)return a(`SESSION_NOT_FOUND`,co);if(f&&!l)return a(`SESSION_NOT_FOUND`,lo);if(l&&i){let t=i.appName??i.appBundleId;if(!i.appName&&!i.appBundleId){if(m(i.device)&&i.surface&&i.surface!==`app`&&i.surface!==`frontmost-app`)return{ok:!0,data:{platform:u(i.device),appName:i.surface,appBundleId:i.appBundleId,source:`session`,surface:i.surface}};let e=m(i.device)?`macOS`:`iOS`;return a(`COMMAND_FAILED`,`No foreground app is tracked for this ${e} session. Open an app in the session, then retry appstate.`)}let n=await go(e,i);return{ok:!0,data:{platform:u(i.device),appName:t??`unknown`,appBundleId:i.appBundleId,source:n?`runner`:`session`,...n?{state:n}:{},surface:i.surface??`app`,...p(i.device)?{device_udid:i.device.id,ios_simulator_device_set:i.device.simulatorSetPath??null}:{}}}}let g=await G({session:i,flags:o});if(p(g))return a(`SESSION_NOT_FOUND`,co);if(m(g))return a(`SESSION_NOT_FOUND`,lo);let _=await j({command:`appstate`,device:g,use:me,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,unavailableResponse:e=>a(`UNSUPPORTED_OPERATION`,g.platform===`web`?`appstate is not supported on web.`:`appstate is not supported on this device`,void 0,e.hint?{hint:e.hint}:void 0)});if(_.type===`response`)return _.response;let v=_.runtime;await v.operations.ensureReady({serial:o.serial,androidSerialAllowlist:yo(o.androidDeviceAllowlist)});let y=await v.operations.appState();return{ok:!0,data:{platform:u(g),package:y.package,activity:y.activity}}}async function vo(e){let{req:t,sessionName:n,sessionStore:i}=e;if(t.command===`boot`){let o=i.get(n),s=t.flags??{},c=W(t.command,o,s);if(c)return c;let l=R(s.androidDeviceAllowlist),d=l?[...l].sort():void 0,f=re({headless:s.headless===!0}),p;try{p=await G({session:o,flags:s,androidAvdSelection:`include-stopped`})}catch(e){let t=r(e);if(f.kind===`boot-target-headless`&&!ho(s.device,o?.device)&&t.code===`DEVICE_NOT_FOUND`)return a(`INVALID_ARGS`,`boot --headless requires --device <avd-name> (or an Android emulator session target).`);throw e}if(s.target&&(p.target??`mobile`)!==s.target)return a(`DEVICE_NOT_FOUND`,`No ${p.platform} device found matching --target ${s.target}.`);let m=await Le({command:`boot`,device:p,required:f.use.required,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,unavailableResponse:uo(f.kind===`boot-target-headless`)});if(m.type===`response`)return m.response;let g={serial:s.serial,androidSerialAllowlist:d};return p=f.kind===`boot-target-headless`?await(await m.bind(p,f.use)).operations.bootTargetHeadless(g):await(await m.bind(p,f.use)).operations.bootTarget(g),{ok:!0,data:{platform:u(p),target:p.target??`mobile`,device:p.name,id:p.id,kind:p.kind,booted:!0,...h(p.platform)&&p.appleOs?{appleOs:p.appleOs}:{}}}}if(t.command===`shutdown`){let r=i.get(n),o=t.flags??{},s=W(t.command,r,o);if(s)return s;let c=await G({flags:o,session:r,androidAvdSelection:`include-stopped`}),l=mo((await fo(e.inspectFacts)(c)).operations.shutdownTarget);if(l)return l;if(r&&r.device.platform===c.platform&&r.device.id===c.id)return a(`DEVICE_IN_USE`,`Cannot shut down an active session device directly. Use close --shutdown to end the session and turn off the simulator/emulator.`,{hint:`Run agent-device close --shutdown --session ${n}`,session:n,platform:u(c),target:c.target??`mobile`,device:c.name,id:c.id,kind:c.kind});let d=await(await po(e.bindDevice)(c,D)).operations.shutdownTarget();return d.success?{ok:!0,data:{platform:u(c),target:c.target??`mobile`,device:c.name,id:c.id,kind:c.kind,shutdown:d,...h(c.platform)&&c.appleOs?{appleOs:c.appleOs}:{}}}:a(d.error?.code??`COMMAND_FAILED`,bo(d),{platform:u(c),target:c.target??`mobile`,device:c.name,id:c.id,kind:c.kind,shutdown:d})}return t.command===`appstate`?await _o({req:t,sessionName:n,sessionStore:i,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice}):null}function yo(e){let t=R(e);return t?[...t].sort():void 0}function bo(e){let t=e.error?.message??e.stderr.trim();return t.length>0?t:`Shutdown failed`}function xo(e){let t=ct(e);if(t===void 0)return{exists:!1,sizeBytes:0};try{let e=U.fstatSync(t);return{exists:!0,sizeBytes:e.size,modifiedAt:e.mtime.toISOString()}}finally{U.closeSync(t)}}function So(e,t){sr(e);let n=`[agent-device][mark][${new Date().toISOString()}] ${t.trim()||`marker`}\n`,r=lt(e);try{U.writeFileSync(r,n,`utf8`)}finally{U.closeSync(r)}}function Co(e){let t=H.dirname(e),n=H.basename(e);U.existsSync(t)||U.mkdirSync(t,{recursive:!0});let r=st(e);try{U.fsyncSync(r)}finally{U.closeSync(r)}let i=0;for(let e of U.readdirSync(t)){if(!e.startsWith(`${n}.`))continue;let r=e.slice(n.length+1);if(/^\d+$/.test(r))try{U.unlinkSync(H.join(t,e)),i+=1}catch{}}return{path:e,cleared:!0,removedRotatedFiles:i}}function wo(e){return On.createNextFence({admissionLedger:e.ledger,resourcePath:e.resourcePath,device:e.device})}async function To(e){try{return await Eo(e)}catch(e){return{ok:!1,error:t(e)}}}async function Eo(e){let t=Do(e);if(!t.ok)return t;let n=t.session,r=w(e.req.positionals),i=await e.inspectFacts(n.device),a=i.operations.audioProbeStart,o=i.operations.audioProbeQuery,s=a.available?`capture`:o.available?`query`:void 0;if(s===void 0)return Oo(a,o);let c=ie({probeAction:r.probeAction,mode:s});switch(c.kind){case`query`:return{ok:!0,data:await(await e.bindDevice(n.device,c.use)).operations.audioProbeQuery({action:c.action,durationMs:r.durationMs,bucketMs:r.bucketMs})};case`capture-start`:return await ko(e,n,r,c.use);case`capture-status`:return await Ao(e,n);case`capture-stop`:return await jo(e,n)}}function Do(e){let t=e.sessionStore.get(e.sessionName);return t?{ok:!0,session:t}:a(`SESSION_NOT_FOUND`,`audio requires an active session`)}function Oo(e,t){let n=(e.available?void 0:e.hint)??(t.available?void 0:t.hint);return a(`UNSUPPORTED_OPERATION`,n??`audio is supported for web browser sessions, macOS sessions, iOS simulators, and Android emulators on macOS hosts`)}async function ko(e,t,n,r){if(t.audioProbe){await hn({intent:`disposal`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore});let n=e.sessionStore.get(e.sessionName);if(!n)return a(`SESSION_NOT_FOUND`,`audio requires an active session`);t=n}let i=await e.bindDevice(t.device,r),o=En.store.resolvePath(e.sessionStore.resolveSessionDir(e.sessionName)),s=En.createNextFence({admissionLedger:e.audioProbeAdmissionLedger,resourcePath:o,device:t.device}),c=H.join(e.sessionStore.ensureSessionDir(e.sessionName),`audio-probe.json`),l=await i.operations.audioProbeStart({sessionId:e.sessionName,statusPath:c,durationMs:n.durationMs,bucketMs:n.bucketMs,fence:s});await wn({admissionLedger:e.audioProbeAdmissionLedger,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore,device:t.device,owner:i.owner,fence:s,...l,throwIfCanceled:e.throwIfCanceled});let u=e.sessionStore.get(e.sessionName)?.audioProbe;if(!u)throw TypeError(`Audio probe adoption did not publish a live handle`);return{ok:!0,data:await u.handle.status()}}async function Ao(e,t){let n=t.audioProbe;if(!n)return{ok:!0,data:Mo()};let r=await n.handle.status();return r.state===`stopped`&&await hn({intent:`disposal`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore}),{ok:!0,data:r}}async function jo(e,t){return t.audioProbe?{ok:!0,data:await hn({intent:`capture`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore})}:{ok:!0,data:Mo()}}function Mo(){return un({state:`stopped`,source:`system-audio`,backend:`host-system-audio`,durationMs:0,bucketMs:0,sourceCount:0,reason:`not-started`,notes:[`No active host audio probe is running.`]})}async function No(e){let r=e.sessionStore.get(e.sessionName);if(!r)return a(`SESSION_NOT_FOUND`,`perf requires an active session. Run open first.`);try{if(et(e.req.positionals?.[0]))throw new n(`INVALID_ARGS`,tt);es(e.req);let t=Dn({positionals:e.req.positionals,kind:ns(e.req.flags?.kind),outPath:ns(e.req.flags?.out)}),i=Cn(t);if(i.kind===`capture-stop`)return Po(e,await Ro(e,r,i.request));let o=await Xn({device:r.device,plan:i,inspectFacts:e.inspectFacts});return o.admitted?Po(e,await Fo(e,r,o)):z(`perf`,o.fact)??a(`UNSUPPORTED_OPERATION`,`perf is not supported on this device`)}catch(e){return{ok:!1,error:t(e)}}}function Po(e,t){if(!t.ok)return t;let n=e.sessionStore.get(e.sessionName);return O(e.sessionStore,n,e.req,`perf`,Yo(t.data)?{...t.data}:{}),t}async function Fo(e,t,r){let{device:i,plan:a}=Yn(r),o=B(e.bindDevice);switch(a.kind){case`frames`:return{ok:!0,data:Wo(t,await(await o(i,a.use)).operations.perfFrames({appId:t.appBundleId}))};case`memory-sample`:return{ok:!0,data:Xo(t,await(await o(i,a.use)).operations.perfMemorySample({appId:t.appBundleId}))};case`memory-snapshot`:return{ok:!0,data:Zo(t,await(await o(i,a.use)).operations.perfMemorySnapshot({appId:t.appBundleId,kind:a.request.kind,outPath:a.request.outPath?k.expandHome(a.request.outPath,e.req.meta?.cwd):void 0,artifactsDir:H.join(e.sessionStore.ensureSessionDir(e.sessionName),`artifacts`)}))};case`capture-start`:return await Io(e,t,await o(i,a.use),a.request);case`profile-report`:{let r=await o(i,a.use),s=t.lastPerfProfile,c=a.request.tracePath??s?.outPath;if(!c)throw new n(`INVALID_ARGS`,`perf cpu profile report requires a stopped profile trace or tracePath option`);if(t.perfCapture)throw new n(`INVALID_ARGS`,`perf cpu profile report requires a stopped profile trace; stop the active capture first.`);let l=$o(e,a.request.outPath,`cpu-report.json`);return{ok:!0,data:{perf:`reported`,...await r.operations.perfProfileReport({appId:t.appBundleId,kind:a.request.kind,tracePath:k.expandHome(c,e.req.meta?.cwd),outPath:l,template:a.request.template??(s?.kind===`xctrace`?s.template:void 0),profile:s})}}}}}async function Io(e,t,n,r){if(t.perfCapture)return a(`INVALID_ARGS`,`native perf capture already in progress`);if(!t.appBundleId)return a(`COMMAND_FAILED`,`No app is associated with this session.`,{hint:`Run open <app> first so perf can resolve the app process identity.`});let i=r.kind===`xctrace`?`perf-${r.area===`cpu`?`cpu-profile`:`trace`}.trace`:r.kind===`perfetto`?`app.perfetto-trace`:`cpu.perf.data`,o=$o(e,r.outPath,i),s=pn.store.resolvePath(e.sessionStore.resolveSessionDir(e.sessionName)),c=pn.createNextFence({admissionLedger:Lo(e),resourcePath:s,device:t.device}),l=await n.operations.perfNativeCaptureStart({sessionId:e.sessionName,appId:t.appBundleId,mode:r.area===`cpu`?`cpu-profile`:`trace`,kind:r.kind,template:r.template,outPath:o,fence:c});return await Tn({admissionLedger:Lo(e),session:t,sessionName:e.sessionName,sessionStore:e.sessionStore,device:t.device,owner:n.owner,fence:c,pendingHandle:l.pendingHandle,envelope:l.envelope,throwIfCanceled:e.throwIfCanceled}),{ok:!0,data:l.response}}function Lo(e){if(e.perfCaptureAdmissionLedger)return e.perfCaptureAdmissionLedger;throw new n(`COMMAND_FAILED`,`Perf capture admission ledger is not configured`,{reason:`runtime-gateway-missing`})}async function Ro(e,t,n){let r=t.perfCapture;if(!r)return a(`INVALID_ARGS`,`no active native perf capture`);let i=Uo(r.handle.inspect(),n);if(i)return a(`INVALID_ARGS`,i);n.outPath&&r.handle.setOutputPath(k.expandHome(n.outPath,e.req.meta?.cwd));let o=await bn({intent:`capture`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore});if(n.area===`cpu`){let n=zo(o),r=e.sessionStore.get(e.sessionName)??t;e.sessionStore.set(e.sessionName,{...r,lastPerfProfile:n})}return{ok:!0,data:o}}function zo(e){if(Bo(e)||Vo(e))return e;throw new n(`COMMAND_FAILED`,`Stopped CPU profile metadata is malformed.`)}function Bo(e){return e.kind===`xctrace`&&e.mode===`cpu-profile`&&typeof e.outPath==`string`&&typeof e.template==`string`}function Vo(e){return e.kind===`simpleperf`&&e.mode===`cpu-profile`&&Ho(e,[`outPath`,`packageName`,`appPid`,`profilerPid`,`remotePath`])}function Ho(e,t){return t.every(t=>typeof e[t]==`string`)}function Uo(e,t){let n=t.area===`cpu`?`cpu-profile`:`trace`;if(e.kind!==t.kind||e.mode!==n)return`No ${t.kind} ${n} is active for this session.`}function Wo(e,t){return{...Qo(e),metrics:{fps:Go(t.metric,e)},sampling:{fps:t.sampling}}}function Go(e,t){if(!Yo(e)||e.available!==!0)return e;let n=Ko(t.actions,e);return n.length===0?e:{...e,relatedActions:n}}function Ko(e,t){let n=qo(t.windowStartedAt),r=qo(t.windowEndedAt)??qo(t.measuredAt);return n===void 0||r===void 0?[]:e.filter(({ts:e})=>e>=n&&e<=r).map(e=>({command:e.command,at:new Date(e.ts).toISOString(),offsetMs:Math.max(0,Math.round(e.ts-n)),target:Jo(e)})).slice(-12)}function qo(e){if(typeof e!=`string`)return;let t=Date.parse(e);return Number.isFinite(t)?t:void 0}function Jo(e){for(let t of[`refLabel`,`ref`,`appName`,`appBundleId`]){let n=e.result?.[t];if(typeof n==`string`&&n.length>0)return n}}function Yo(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Xo(e,t){return{...Qo(e),metrics:{memory:t.metric},sampling:{memory:t.sampling}}}function Zo(e,t){return{...Qo(e),artifact:t.artifact,sampling:{snapshot:t.sampling},support:t.support}}function Qo(e){return{session:e.name,platform:u(e.device),device:e.device.name,deviceId:e.device.id}}function $o(e,t,n){return t?k.expandHome(t,e.req.meta?.cwd):H.join(e.sessionStore.ensureSessionDir(e.sessionName),`${ts()}-${n}`)}function es(e){let t=e.positionals?.[0]?.toLowerCase(),r=e.positionals?.[1]?.toLowerCase();if(e.flags?.out&&t!==`cpu`&&t!==`trace`&&(t!==`memory`||r!==`snapshot`))throw new n(`INVALID_ARGS`,`--out is only supported with perf memory snapshot, perf cpu profile, or perf trace`)}function ts(){return new Date().toISOString().replaceAll(/[:.]/g,`-`)}function ns(e){return typeof e==`string`&&e.length>0?e:void 0}const rs=[`dump`,`log`],is=`network requires ${rs.join(` or `)}`,as=`network include mode must be one of: ${o.join(`, `)}`,os=2048;async function ss(e){let n=e.sessionStore.get(e.sessionName);if(!n)return a(`SESSION_NOT_FOUND`,`network requires an active session`);try{let t=cs(e.bindDevice),r=(await t(n.device,v)).facts.networkDump;if(!r.available)return ps(r.hint);let i=ls(e.req);if(!i.ok)return i;let a=he({action:i.action,include:i.include}),o=await t(n.device,a.use),s=n.appLog?.handle.inspect();return ms(await o.operations.networkDump({sessionId:e.sessionName,appBundleId:n.appBundleId,...s?{appLogSnapshot:{state:s.state,startedAt:s.startedAt}}:{},maxEntries:i.maxEntries,include:a.include,maxPayloadChars:os,maxScanLines:4e3}),i,!!n.appLog,s?.state)}catch(e){return{ok:!1,error:t(e)}}}function cs(e){if(e)return e;throw new n(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`})}function ls(e){let t=us(e);if(!t.ok)return t;let n=ds(e);if(!n.ok)return n;let r=fs(e);return r.ok?{ok:!0,action:t.action,include:r.include,maxEntries:n.maxEntries}:r}function us(e){let t=(e.positionals?.[0]??`dump`).toLowerCase();return rs.includes(t)?{ok:!0,action:t}:a(`INVALID_ARGS`,is)}function ds(e){let t=e.positionals?.[1]?Number.parseInt(e.positionals[1],10):25;return!Number.isInteger(t)||t<1||t>200?a(`INVALID_ARGS`,`network dump limit must be an integer in range 1..200`):{ok:!0,maxEntries:t}}function fs(e){let t=e.positionals?.[2]?.toLowerCase(),n=e.flags?.networkInclude;if(t&&n&&t!==n)return a(`INVALID_ARGS`,`network include mode was provided both positionally and via --include with different values`);let r=(n??t??`summary`).toLowerCase();return o.includes(r)?{ok:!0,include:r}:a(`INVALID_ARGS`,as)}function ps(e){return{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`network is not supported on this device`,hint:e}}}function ms(e,t,n,r){return e.source===`app-log`?{ok:!0,data:{...e.dump,active:n,state:r??`inactive`,backend:e.backend,notes:e.notes}}:{ok:!0,data:{entries:e.entries,active:!0,state:`active`,backend:e.backend,include:t.include,matchedLines:e.entries.length,scannedLines:e.entries.length,limits:{maxEntries:t.maxEntries,maxPayloadChars:os,maxScanLines:e.entries.length},notes:e.notes}}}function hs(e,t){let n=Sn(e);return{...n,backend:n.backend??t,notes:n.state===`failed`&&e.appLogFailure?[gs(e.appLogFailure)]:_s(n.state)}}function gs(e){return e.hint?`${e.message} ${e.hint}`:e.message}function _s(e){return e===`failed`?[`The app log stream process exited with an error. Run logs doctor for backend diagnostics.`]:e===`ended`?[`The app log stream process ended. Run logs clear --restart before the next capture window.`]:void 0}function vs(e,t){return be([...e,...t.notes??[]])}async function ys(e){let{req:t}=e;return t.command===`perf`?await No({...e,throwIfCanceled:e.throwIfCanceled??(()=>{})}):t.command===`logs`?xs(e):t.command===`events`?await bs(e):t.command===`network`?await ss(e):t.command===`audio`?await To(Ns(e)):null}async function bs(e){let{req:n,sessionName:r,sessionStore:i}=e;try{return await i.flushEvents(r),{ok:!0,data:i.readEvents(r,{limit:n.positionals?.[0],cursor:n.positionals?.[1]})}}catch(e){return{ok:!1,error:t(e)}}}async function xs(e){let{req:n,sessionName:r,sessionStore:i}=e,o=i.get(r);if(!o)return a(`SESSION_NOT_FOUND`,`logs requires an active session`);try{let t=Ps({...e,session:o}),r=(await t.bindDevice(o.device,x)).facts.appLogInspect;if(!r.available)return{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`logs is not supported on this device`,hint:r.hint}};let i=ws(S({action:n.positionals?.[0],restart:!!n.flags?.restart,marker:n.positionals?.slice(1).join(` `)}),o);return`ok`in i?i:await Ss(t,i)}catch(e){return{ok:!1,error:t(e)}}}async function Ss(e,t){switch(t.kind){case`path`:return Ts(e,(await(await e.bindDevice(e.session.device,t.use)).operations.appLogInspect()).backend);case`doctor`:return Es(e,await(await e.bindDevice(e.session.device,t.use)).operations.appLogDoctor({appBundleId:e.session.appBundleId}));case`start`:case`clear-restart`:return await Cs(e,t);case`stop`:return await e.bindDevice(e.session.device,t.use),await js(e);case`mark`:return await e.bindDevice(e.session.device,t.use),Ds(t.marker,e.sessionName,e.sessionStore);case`clear`:return await e.bindDevice(e.session.device,t.use),Os(e)}}async function Cs(e,t){let n=await e.bindDevice(e.session.device,t.use);return t.kind===`start`?await As(e,t.appBundleId,n.owner,n.operations.appLogStart):await ks(e,t.appBundleId,n.owner,n.operations.appLogStart)}function ws(e,t){return e.requiresAppSession?t.appBundleId?Object.freeze({...e,appBundleId:t.appBundleId}):a(`INVALID_ARGS`,`logs ${e.kind===`start`?`start`:`clear --restart`} requires an app session; run open <app> first`):e}function Ts(e,t){let{session:n,sessionName:r,sessionStore:i}=e,a=i.resolveAppLogPath(r),o=xo(a),s=hs(n,t);return{ok:!0,data:{path:a,active:s.active,state:s.state,backend:s.backend,sizeBytes:o.sizeBytes,modifiedAt:o.modifiedAt,startedAt:s.startedAt?new Date(s.startedAt).toISOString():void 0,failureCode:s.failureCode,failureMessage:s.failureMessage,hint:s.hint??String.raw`Grep the file for token-efficient debugging, e.g. grep -n "Error\|Exception" <path>`,notes:s.notes}}}async function Es(e,t){let{session:n,sessionName:r,sessionStore:i}=e,a=i.resolveAppLogPath(r),o=hs(n,t.backend);return{ok:!0,data:{path:a,active:o.active,state:o.state,backend:o.backend,checks:t.checks,failureCode:o.failureCode,failureMessage:o.failureMessage,hint:o.hint,notes:vs(t.notes,o)}}}function Ds(e,t,n){let r=n.resolveAppLogPath(t);return So(r,e),{ok:!0,data:{path:r,marked:!0}}}function Os(e){let{session:t,sessionName:n,sessionStore:r}=e;if(t.appLog)return a(`INVALID_ARGS`,`logs clear requires logs to be stopped first; run logs stop`);let i=Co(r.resolveAppLogPath(n));return gn({session:t,sessionName:n,sessionStore:r}),{ok:!0,data:i}}async function ks(e,t,n,r){let{session:i,sessionName:a,sessionStore:o}=e;i.appLog&&await _n({intent:`disposal`,session:i,sessionName:a,sessionStore:o,resourcePath:vn.resolvePath(o.resolveSessionDir(a))});let s=Co(o.resolveAppLogPath(a)),c=await Ms(e,t,r,n);return c.ok?{ok:!0,data:{...s,restarted:!0}}:c}async function As(e,t,n,r){let{session:i}=e;return i.appLog?a(`INVALID_ARGS`,`app log already streaming; run logs stop first`):await Ms(e,t,r,n)}async function js(e){let{session:t,sessionName:n,sessionStore:r}=e;if(!t.appLog)return a(`INVALID_ARGS`,`no app log stream active`);let i=r.resolveAppLogPath(n);return await _n({intent:`capture`,session:t,sessionName:n,sessionStore:r,resourcePath:vn.resolvePath(r.resolveSessionDir(n))}),{ok:!0,data:{path:i,stopped:!0}}}async function Ms(e,t,n,r){let{session:i,sessionName:a,sessionStore:o}=e,s=o.resolveAppLogPath(a),c=vn.resolvePath(o.resolveSessionDir(a));try{let l=wo({ledger:e.appLogAdmissionLedger,resourcePath:c,device:i.device}),u=await n({sessionId:a,appBundleId:t,outputPath:s,pidPath:o.resolveAppLogPidPath(a),fence:l});return await xn({admissionLedger:e.appLogAdmissionLedger,session:i,sessionName:a,sessionStore:o,resourcePath:c,device:i.device,owner:r,fence:l,pendingHandle:u.pendingHandle,envelope:u.envelope,throwIfCanceled:e.throwIfCanceled??(()=>{})}),{ok:!0,data:{path:s,started:!0}}}catch(e){return{ok:!1,error:yn({session:i,sessionName:a,sessionStore:o,error:e})}}}function Ns(e){if(!e.bindDevice||!e.inspectFacts)throw new n(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`});if(!e.audioProbeAdmissionLedger)throw new n(`COMMAND_FAILED`,`Audio probe admission ledger is not configured`,{reason:`runtime-gateway-missing`});return{req:e.req,sessionName:e.sessionName,sessionStore:e.sessionStore,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,audioProbeAdmissionLedger:e.audioProbeAdmissionLedger,throwIfCanceled:e.throwIfCanceled??(()=>{})}}function Ps(e){if(!e.bindDevice)throw new n(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`});if(!e.appLogAdmissionLedger)throw new n(`COMMAND_FAILED`,`App-log admission ledger is not configured`,{reason:`runtime-gateway-missing`});return{...e,bindDevice:e.bindDevice,appLogAdmissionLedger:e.appLogAdmissionLedger}}const J=new WeakMap;function Fs(e){return{store:t=>Is(e,t),finalize:(t,n)=>Ls({...e,evidence:t,projection:n})}}function Is(e,t){let{sessionStore:n,sessionName:r}=e,i;if(!n.update(e=>{Re(e,t),i=e})||!i)throw Error(`Internal observation session is no longer available.`);let a=i,o=a.snapshotGeneration;if(o===void 0)throw Error(`Internal observation did not establish a snapshot generation.`);let s={};return J.set(s,{sessionName:r,session:a,sessionCreatedAt:a.createdAt,snapshot:t,snapshotGeneration:o,runtimeRevision:Ie(a),refFrame:Ne(a)}),{evidence:s,refsGeneration:o}}function Ls(e){let t=J.get(e.evidence);J.delete(e.evidence);let n=zs(e.projection.refs);return n.size===0?{published:!1,reason:`empty`}:e.signal?.aborted===!0?{published:!1,reason:`cancelled`}:!t||!Rs(e,t)?{published:!1,reason:`stale-capture`}:e.projection.refsGeneration!==t.snapshotGeneration||!Bs(n,t.snapshot)?{published:!1,reason:`invalid-projection`}:(Be(t.session,n),{published:!0,refsGeneration:t.snapshotGeneration,refCount:n.size})}function Rs(e,t){let n=e.sessionStore.get();return e.sessionName===t.sessionName&&n===t.session&&n.createdAt===t.sessionCreatedAt&&n.snapshot===t.snapshot&&n.snapshotGeneration===t.snapshotGeneration&&Ie(n)===t.runtimeRevision&&Ne(n)===t.refFrame}function zs(e){let t=new Set;for(let n of e){let e=n.startsWith(`@`)?n.slice(1):n,r=e.indexOf(`~`),i=r===-1?e:e.slice(0,r);i.length>0&&t.add(i)}return t}function Bs(e,t){let n=new Set(t.nodes.flatMap(e=>typeof e.ref==`string`?[e.ref]:[]));return[...e].every(e=>n.has(e))}function Vs(e){let{sessionStore:t,mutationStore:n}=e,r=()=>t.get();return{view(){let e=r();if(e)return{repairBoundary:De(e),pendingRecordAndHeal:e.pendingRecordAndHeal,scriptPublication:Hs(e.scriptPublication??Ke)}},armStep(e){n.update(t=>{Me(t,{saveScript:e.saveScript,force:e.force,sourcePath:e.sourcePath,healedSiblingPath:Et(e.sourcePath),firstArm:e.firstArm})})},demoteForRerunIfArmed(){De(r())!==void 0&&n.update(we)},markCompleteIfArmed(){De(r())!==void 0&&n.update(Ae)},markSessionHeldIfArmed(e){if(e.ok||!je(r()))return e;let t=dt(e.error.details?.divergence);return t&&(t.repairSessionHeld=!0),e},clearTombstone(){n.clearRepairTombstone()},clearCorrectiveWatermarkIfExpected(e){r()?.pendingRecordAndHeal?.expectedFrom===e&&n.update(t=>{t.pendingRecordAndHeal?.expectedFrom===e&&Ws(t)})},resumeStamper:{sessionExists:()=>r()!==void 0,stampCorrectiveWatermark(e){n.update(t=>{Us({session:t,...e})})}}}}function Hs(e){return{kind:e.kind,status:e.kind===`none`?void 0:e.status,targetPath:Je(e),targetForce:Ue(e)}}function Us(e){let{session:t,resume:n,repairHint:r,failedIndex:i,actions:a}=e;t.pendingRecordAndHeal=Gs({resume:n,repairHint:r,failedIndex:i,actions:a,actionsCountAtDivergence:t.actions.length})}function Ws(e){e.pendingRecordAndHeal=void 0}function Gs(e){let{resume:t,repairHint:n,failedIndex:r,actions:i,actionsCountAtDivergence:a}=e;if(n===`record-and-heal`)return t.allowed?{expectedFrom:t.from,actionsCountAtDivergence:a}:void 0;if((n===`caution`||n===`manual`)&&r===i.length)return{expectedFrom:r+1,actionsCountAtDivergence:a}}function Ks(e){let{sessionStore:t,bindDevice:n,bindExactDevice:r,screenRecordingAdmissionLedger:i,requestScope:a,retainDeviceExecutionLock:o,throwIfCanceled:s}=e;return!n||!r||!i||!a||!o||!s?void 0:{throwIfCanceled:s,record:async e=>await tr({req:qs(e),sessionName:e.sessionName,sessionStore:t,bindDevice:n,bindExactDevice:r,admissionLedger:i,requestScope:a,retainDeviceExecutionLock:o,throwIfCanceled:s})}}function qs(e){return{token:e.request.token,session:e.sessionName,command:`record`,positionals:e.phase===`start`?[`start`,e.outputPath]:[`stop`],flags:{},meta:e.request.meta}}const Js={resolveSessionScope:Vn},Ys=async({req:e,sessionName:t,logPath:n,sessionStore:r,invoke:i,invokeReplayAction:a})=>await kt({...ur(e),session:Zs(t,n,r),invoke:fr(a??i,e),dependencies:Js}),Xs=async({req:e,sessionName:t,logPath:r,sessionStore:i,leaseRegistry:a,invoke:o,invokeReplayAction:s,bindDevice:c,inspectFacts:l,bindExactDevice:u,screenRecordingAdmissionLedger:d,requestScope:f,retainDeviceExecutionLock:p,throwIfCanceled:m,platformResourceCleanup:h})=>{if(!h)throw new n(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`);let g=Ks({sessionStore:i,bindDevice:c,bindExactDevice:u,screenRecordingAdmissionLedger:d,requestScope:f,retainDeviceExecutionLock:p,throwIfCanceled:m});return await Pt({...ur(e),session:Zs(t,r,i),createSession:(e,t)=>Zs(e,t,i),invoke:fr(s??o,e),dependencies:Js,cleanupSession:async t=>await Qs({req:e,sessionName:t,logPath:r,sessionStore:i,leaseRegistry:a,inspectFacts:l,bindDevice:c,platformResourceCleanup:h}),...g?{video:g}:{}})};function Zs(e,t,r){let i=t=>{let n=r.get(e);return n?(t(n),r.set(e,n),!0):!1},a={get:()=>r.get(e),lookup:()=>r.lookup(e),getRuntimeHints:()=>r.getRuntimeHints(e),ensureSessionDir:()=>r.ensureSessionDir(e)};return lr(e,t,a,{createCoordinator:()=>Vs({sessionStore:a,mutationStore:{update:i,clearRepairTombstone:()=>r.clearRepairTombstone(e)}}),assertSelectorMatches:t=>{let n=r.lookup(e);n&&qn(n,t)},resolveOpenRuntimeHints:({request:t,device:n,platform:i})=>Jt({req:t,sessionStore:{getRuntimeHints:t=>t===e?r.getRuntimeHints(e):void 0},sessionName:e,device:n,platform:i}),bindAuthority:t=>Fs({sessionStore:{get:()=>r.get(e),update:i},sessionName:e,...t?{signal:t}:{}}),capture:async({flags:t,logPath:i})=>{let a=r.get(e);if(!a)throw new n(`NO_ACTIVE_SESSION`,`Session "${e}" is no longer active.`);return await Ve({device:a.device,session:a,flags:t,logPath:i})}})}async function Qs(e){let{req:t,sessionName:r,logPath:i,sessionStore:a}=e;if(!a.get(r))return;let o=await Xi({req:{token:t.token,session:r,command:`close`,positionals:[],flags:{},meta:t.meta},sessionName:r,logPath:i,sessionStore:a,leaseRegistry:e.leaseRegistry,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,platformResourceCleanup:e.platformResourceCleanup});if(!o.ok)throw new n(o.error.code,o.error.message,{...o.error.details??{},...o.error.hint?{hint:o.error.hint}:{}})}function $s(e){let{req:t,sessionName:r,sessionStore:i}=e;if(t.command!==$e.sessionSaveScript)return null;if((t.positionals?.length??0)>1)return Y(new n(`INVALID_ARGS`,`session save-script accepts at most one output path.`));let a=i.get(r);if(!a)return Y(new n(`SESSION_NOT_FOUND`,`No active session "${r}".`,{hint:`Start a fresh journey with open <app> --save-script[=<path>], then retry.`}));let o=nc(a);if(o)return Y(o);let s=t.positionals?.[0]?.trim();if(t.positionals?.[0]!==void 0&&!s)return Y(new n(`INVALID_ARGS`,`session save-script path cannot be empty.`));qe(a,{explicitPath:s,liveForce:t.flags?.force});let c=i.writeSessionLog(a,{force:Ye(a,t.flags?.force),publication:`active`});return c.written?(Qe(a,c.path),{ok:!0,data:{session:a.name,savedScript:c.path,actionCount:c.actionCount,...F(`Published script: ${c.path}`)}}):Y(c.error??new n(`COMMAND_FAILED`,`The active session script was not published.`,{retriable:!0,hint:`The session remains armed; retry session save-script.`}))}function ec(e){if(Ee(e))return`repair`;let t=e.scriptPublication;return t?.kind===`authoring`&&t.status!==`armed`?t.status:M(e)?void 0:`not-armed`}const tc={repair:()=>new n(`COMMAND_FAILED`,`This session has an active .ad repair transaction and cannot use ordinary active-session publication.`,{hint:`Finish or abort the repair through replay --from and its existing close/teardown protocol.`}),aborted:()=>new n(`COMMAND_FAILED`,`This script recording was aborted by a second successful open and cannot be published.`,{hint:`Close this session and start a fresh one with open <app> --save-script[=<path>].`}),published:()=>new n(`COMMAND_FAILED`,`This script recording has already been published.`,{hint:`Continue using the live session, or close it and start a fresh authoring session.`}),"not-armed":()=>new n(`COMMAND_FAILED`,`Script recording was not armed before this journey began; session history cannot be published without recording-time target evidence.`,{hint:`Close this session and start a fresh one with open <app> --save-script[=<path>].`})};function nc(e){let t=ec(e);return t?tc[t]():void 0}function Y(e){return{ok:!1,error:t(e)}}function rc(e){let t=(e[0]??``).toLowerCase();return t===`read`||t===`write`?t:void 0}function ic(e){return{...e.appBundleId===void 0?{}:{options:{appBundleId:e.appBundleId}},execution:ze(e)}}async function ac(e,t,r){if(r.length!==1)throw new n(`INVALID_ARGS`,`clipboard read does not accept additional arguments`);return{action:`read`,text:await e.operations.readClipboard(ic(t))}}async function oc(e,t,r){if(r.length<2)throw new n(`INVALID_ARGS`,`clipboard write requires text (use "" to clear clipboard)`);let i=r.slice(1).join(` `),a={...ic(t),text:i};return await e.operations.writeClipboard(a),{action:`write`,textLength:Array.from(i).length,...F(`Clipboard updated`)}}async function sc(e){let{device:t,action:n,positionals:r,inspectFacts:i,bindDevice:a}=e;if(n===`read`){let e=await j({command:`clipboard`,device:t,use:fe,inspectFacts:i,bindDevice:a,readiness:!0});if(e.type===`response`)return{ok:!1,response:e.response};let n=e.runtime;return{ok:!0,execute:e=>ac(n,e,r)}}let o=await j({command:`clipboard`,device:t,use:_e,inspectFacts:i,bindDevice:a,readiness:!0});if(o.type===`response`)return{ok:!1,response:o.response};let s=o.runtime;return{ok:!0,execute:e=>oc(s,e,r)}}async function cc(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,inspectFacts:o,bindDevice:s}=e,c=i.get(n),l=t.flags??{},d=W(N.clipboard,c,l);if(d)return d;let f=t.positionals??[],p=rc(f);if(!p)return a(`INVALID_ARGS`,`clipboard requires a subcommand: read or write`);let m=await G({session:c,flags:l}),h=await sc({device:m,action:p,positionals:f,inspectFacts:o,bindDevice:s});if(!h.ok)return h.response;let g=await h.execute(Pe(r,t.flags,c?.appBundleId,c?.trace?.outPath));return O(i,c,t,t.command,g),{ok:!0,data:{platform:u(m),...g}}}function lc(e){return e.some(e=>e.status===`fail`)?`fail`:e.some(e=>e.status===`warn`)?`warn`:`pass`}function uc(e){return e===`fail`?`Blockers found before the run.`:e===`warn`?`No hard blockers found, but warnings need attention.`:`No blockers found.`}function dc(e){let t={fail:0,warn:1,pass:2,info:3};return[...e].sort((e,n)=>t[e.status]-t[n.status])}function fc(e,...t){for(let n of t)X(e,n)}function X(e,t){e.push(t),St({type:`command`,status:`progress`,message:pc(t)})}function pc(e){return[er(e),...$n(e)].join(`
2
+ `)}async function mc(e,n){let{device:r,targetApp:i,session:a,listInstalledApps:o}=n;if(i)try{let t=o?hc(i,await o(`all`))?.id:void 0;if(!t){X(e,{id:`target-app`,status:`info`,summary:`Target app installation checks are not supported for ${u(r)}.`,evidence:{requested:i,platform:u(r)}});return}X(e,{id:`target-app`,status:`pass`,summary:`Target app is launchable: ${t}`,evidence:{requested:i,resolved:t,sessionApp:a?.appBundleId}})}catch(n){let i=t(n);X(e,{id:`target-app`,status:`fail`,summary:`Target app check failed: ${i.message}`,hint:i.hint??`Install the app or pass an exact package/bundle id or app name.`,command:`agent-device apps --platform ${u(r)} --all`,evidence:{code:i.code,message:i.message}})}}function hc(e,t){let r=e.trim().toLowerCase(),i=t.find(e=>e.id.toLowerCase()===r||e.name.toLowerCase()===r);if(i)return i;let a=t.filter(e=>e.id.toLowerCase().includes(r)||e.name.toLowerCase().includes(r));if(a.length===1)return a[0];throw a.length>1?new n(`AMBIGUOUS_MATCH`,`Multiple launchable apps matched "${e}"`,{matches:a.map(e=>e.id),hint:`Pass an exact package/bundle id from agent-device apps --all.`}):new n(`APP_NOT_INSTALLED`,`No launchable installed app matched "${e}"`)}async function gc(e,n,r){let i=vc(n,r);try{let t=await bc(i),n=yc(t.devices,i);return X(e,{id:`device`,status:n.length===0?`fail`:`pass`,summary:wc(n,i,t.failures),hint:n.length===0?Dc(t.failures):void 0,command:n.length===0?jc(i):void 0,evidence:Mc(n,t.failures)}),n.length>0&&xc(e,t.failures),{devices:n,platform:i.platform,target:i.target}}catch(n){let r=t(n);return X(e,{id:`device`,status:`fail`,summary:r.message,hint:r.hint,command:`agent-device devices`,evidence:{code:r.code,details:r.details}}),{devices:[],platform:i.platform,target:i.target}}}function _c(e,t,n){if(!n||!t)return;let r=t.devices.filter(e=>e.booted===!0);if(r.length===1)return r[0];X(e,{id:`target-app-device`,status:`fail`,summary:r.length===0?`Target app check needs one booted device; none matched.`:`Target app check needs one booted device; ${r.length} matched.`,hint:r.length===0?`Boot a device, or adjust --platform/--target/--device/--udid/--serial.`:`Pass --platform/--target/--device/--udid/--serial so doctor checks the intended device.`,command:t.platform?`agent-device devices --platform ${t.platform}`:`agent-device devices`,evidence:{targetApp:n,booted:r.map(e=>({platform:u(e),id:e.id,name:e.name}))}})}function vc(e,t){let n=e.flags??{};return Bn({platform:n.platform??t?.device.platform,target:n.target??t?.device.target,device:n.device,udid:n.udid,serial:n.serial,iosSimulatorDeviceSet:n.iosSimulatorDeviceSet,androidDeviceAllowlist:n.androidDeviceAllowlist})}function yc(e,t){return e.filter(e=>_(e,t,{includeExplicitSelectors:!0}))}async function bc(e){if(e.platform)return{devices:await In(e),failures:[]};let t=[],n=[];for(let r of at)try{t.push(...await In({...e,platform:r}))}catch(e){n.push(Cc(r,e))}return{devices:t,failures:n}}function xc(e,t){for(let n of t)X(e,Sc(n))}function Sc(e){return{id:`device-${e.platform}`,status:`warn`,summary:`${Z(e.platform)} device inventory could not be read: ${e.message}`,hint:e.hint??`Check the ${Z(e.platform)} toolchain, or scope with --platform to skip it.`,evidence:{platform:e.platform,code:e.code}}}function Cc(e,n){let r=t(n);return{platform:e,message:r.message,hint:r.hint,code:r.code}}function wc(e,t,n){if(e.length===0)return n.length>0?`No ${Tc(t)} devices found; ${Ec(n)}.`:`No ${Tc(t)} devices found.`;let r=e.filter(e=>e.booted===!0).length,i=`${e.length} ${Tc(t)} ${Ac(e.length,`device`)} available; ${r} booted`,a=Oc(e,t);return a?`${i} (${a}).`:`${i}.`}function Tc(e){let t=e.platform?Z(e.platform):`local`;return e.target?`${t} ${e.target}`:t}function Ec(e){return e.slice(0,2).map(e=>`${Z(e.platform)} inventory failed: ${e.message}`).join(`; `)}function Dc(e){return e.find(e=>e.hint)?.hint??`Start or create a simulator/emulator, connect a device, or adjust --platform/--target/--device selectors.`}function Oc(e,t){if(t.platform||t.target)return;let n=it(e),r=kc();return[`android`,`harmonyos`,`apple`,`vega`,`linux`,`web`].flatMap(e=>{let t=n[e];return t.available>0?[`${r[e]} ${t.available} available, ${t.booted} booted`]:[]}).join(`; `)}function kc(){return{android:`Android`,harmonyos:`HarmonyOS`,apple:`Apple`,vega:`Vega`,linux:`Linux`,web:`web`}}function Z(e){return e===`ios`?`iOS`:e===`macos`?`macOS`:e===`android`?`Android`:e===`harmonyos`?`HarmonyOS`:e===`vega`?`Vega`:e===`linux`?`Linux`:e===`web`?`web`:`Apple`}function Ac(e,t){return e===1?t:`${t}s`}function jc(e){return e.platform?`agent-device devices --platform ${e.platform}`:`agent-device devices`}function Mc(e,t){let n=new Map;for(let t of e){let e=u(t),r=n.get(e)??{available:0,booted:0};r.available+=1,t.booted===!0&&(r.booted+=1),n.set(e,r)}return{available:e.length,booted:e.filter(e=>e.booted===!0).length,byPlatform:Object.fromEntries([...n.entries()].sort(([e],[t])=>e.localeCompare(t))),...t.length>0?{failures:t}:{}}}const Nc=1500;async function Pc(e,t,n,r={}){let i=`http://${e}:${t}/status`;try{let a=await fetch(i,{signal:AbortSignal.timeout(1500)}),o=await a.text(),s=a.ok&&o.toLowerCase().includes(`packager-status:running`),c=s?await Fc(e,t,r):void 0;return{id:`metro`,status:s?`pass`:`warn`,summary:s?Ic(i,c):`React Native dev server responded at ${i}, but did not report packager-status:running.`,hint:s?void 0:`Verify this is the Metro/Re.Pack instance for the target app, or restart the dev server.`,evidence:{url:i,statusCode:a.status,body:o.slice(0,120),kind:n,...c?{process:c}:{}}}}catch(e){return{id:`metro`,status:n===`auto`?`warn`:`fail`,summary:`React Native dev server is not reachable at ${i}.`,hint:`Start Metro or Re.Pack for this project. For non-default endpoints, launch with open --metro-host/--metro-port, or run metro prepare with --public-base-url/--proxy-base-url before retrying doctor.`,command:`curl -fsS ${i}`,evidence:{url:i,error:e instanceof Error?e.message:String(e),kind:n}}}}async function Fc(e,t,n){try{return await(n.resolveProcessInfo??Lc)(e,t)}catch{return}}function Ic(e,t){return t?.cwd?`React Native dev server is reachable at ${e} (cwd: ${t.cwd}).`:`React Native dev server is reachable at ${e}.`}async function Lc(e,t){if(!Rc(e))return;let n=await zc(t);if(n!==void 0)return{pid:n,cwd:await Bc(n)}}function Rc(e){return e===`127.0.0.1`||e===`localhost`||e===`::1`||e===`0.0.0.0`}async function zc(e){let t=await ut(`lsof`,[`-nP`,`-iTCP:${e}`,`-sTCP:LISTEN`,`-Fp`],{allowFailure:!0,timeoutMs:Nc});if(t.exitCode===0)return t.stdout.split(`
3
3
  `).map(e=>e.startsWith(`p`)?Number.parseInt(e.slice(1),10):NaN).find(e=>Number.isInteger(e)&&e>0)}async function Bc(e){let t=await ut(`lsof`,[`-nP`,`-a`,`-p`,String(e),`-d`,`cwd`,`-Fn`],{allowFailure:!0,timeoutMs:Nc});if(t.exitCode===0)return t.stdout.split(`
4
- `).find(e=>e.startsWith(`n`)&&e.length>1)?.slice(1)}const Vc=[`daemonBaseUrl`,`tenant`,`runId`,`leaseId`,`leaseProvider`],Hc=[`provider`,`providerSessionId`,`providerApp`,`providerOsVersion`,`providerProject`,`providerBuild`,`providerSessionName`,`providerDeviceOrientation`,`providerGeoLocation`,`providerTimezone`,`providerAppiumVersion`,`providerLanguage`,`providerLocale`,`providerNetworkProfile`,`providerCustomNetwork`,`providerNoResignApp`,`awsProjectArn`,`awsDeviceArn`,`awsAppArn`,`awsRegion`,`awsInteractionMode`];function Uc(e,t){let n=ht(e.meta?.cwd);return{targetApp:Jc(e.flags?.targetApp)??t?.appBundleId,metroHost:Jc(e.runtime?.metroHost)??`127.0.0.1`,metroPort:Yc(e.runtime?.metroPort)??8081,kind:n,remote:e.flags?.remote===!0,shouldProbeMetro:Kc(e,n)}}function Wc(e,t={}){let n=qc(e);return n?[{id:`remote-connection`,status:t.required?`pass`:`info`,summary:`Remote daemon/session or provider scope is configured.`,evidence:n}]:t.required?[{id:`remote-connection`,status:`fail`,summary:`No remote daemon/session or provider scope is configured.`,hint:`Use connect, --remote-config <path>, or direct remote/provider flags for the command.`}]:[]}function Gc(e,t,n,r={}){let i=n?e.listRefs().filter(e=>e.address!==t&&e.session.device.platform===n.device.platform&&e.session.device.id===n.device.id).map(e=>e.address):[];return n?[{id:`session`,status:i.length>0?`warn`:`pass`,summary:i.length>0?`Other active sessions target the same device: ${i.join(`, `)}`:`Active session ${n.name} targets ${n.device.name}`,hint:i.length>0?`Close stale sessions before a QA run if they belong to old attempts.`:void 0,command:i.length>0?`agent-device close --session ${i[0]} --platform ${d(n.device)}`:void 0,evidence:{session:t,sameDeviceSessions:i,sessionStateDir:e.resolveSessionDir(t)}}]:[{id:`session`,status:`info`,summary:r.remote?`No active session named ${t}. Remote doctor will use configured remote scope.`:`No active session named ${t}. Doctor will use device inventory only.`,hint:`This is expected before a run. Use open when app foreground state matters.`}]}function Kc(e,t){return t!==`auto`||typeof e.runtime?.metroPort==`number`||typeof e.runtime?.metroHost==`string`}function qc(e){let t={...Object.fromEntries([...Vc,...Hc].flatMap(t=>typeof e.flags?.[t]==`string`?[[t,`<configured>`]]:[])),...e.flags?.sessionIsolation===`tenant`?{sessionIsolation:`tenant`}:{}};return Object.keys(t).length>0?t:void 0}function Jc(e){return typeof e==`string`&&e.trim().length>0?e.trim():void 0}function Yc(e){return typeof e==`number`&&Number.isInteger(e)&&e>0?e:void 0}async function Xc(e){let{req:t,sessionName:n,sessionStore:r,androidAdbExecutor:i,inspectFacts:a,bindDevice:o}=e;if(t.command!==N.doctor)return null;let s=Zc(e.hostDiagnostics),c=r.get(n),l=Uc(t,c),u=el(r,n),d=[];if(fc(d,{id:`agent-device`,status:`pass`,summary:`agent-device ${ft()} using ${u}`,evidence:{version:ft(),stateDir:u}},...Wc(t,{required:l.remote}),...Gc(r,n,c,{remote:l.remote})),l.remote)return al(d,l);let f=Qc(l,u,i),p=await gc(d,t,c),m=await s.toolchainCheck(c?.device.platform??p?.platform,f);m&&X(d,m);let h=await tl({checks:d,context:f,hostDiagnostics:s,inventory:p,options:l,session:c,inspectFacts:a,bindDevice:o,req:t}),g=h??$c(p);if(g){let e=await s.warmupCheck(g,f);e&&X(d,e)}return al(d,l,{device:h,includeMetro:!0,inventory:p})}function Zc(t){if(!t)throw new e(`COMMAND_FAILED`,`Host diagnostics gateway is not configured`,{reason:`runtime-gateway-missing`});return t}function Qc(e,t,n){return Object.freeze({stateDir:t,metroPort:e.metroPort,shouldProbeMetro:e.shouldProbeMetro,isProviderDevice:e=>on(e),emitProgress:e=>St({type:`command`,status:`progress`,message:e}),listLocalDeviceInventory:async e=>await Ln(e),shouldPropagateInventoryProbeError:Fn,transportOverrides:Object.freeze({androidAdb:n})})}function $c(e){let t=(e?.devices??[]).filter(e=>f(e)&&e.kind===`simulator`);return t.find(e=>e.booted===!0)??t[0]}function el(e,t){let n=H.dirname(e.resolveSessionDir(t));return H.basename(n)===`sessions`?H.dirname(n):n}async function tl(e){let{checks:t,context:n,hostDiagnostics:r,inventory:i,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}=e,u=o?.device??_c(t,i,a.targetApp);return u&&await nl(t,{context:n,hostDiagnostics:r,device:u,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}),a.shouldProbeMetro&&X(t,await Pc(a.metroHost,a.metroPort,a.kind)),fc(t,...await r.ambientChecks(n)),u}async function nl(e,t){let{context:n,hostDiagnostics:r,device:i,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}=t,u;try{u=await rl({device:i,req:l,targetApp:a.targetApp,inspectFacts:s,bindDevice:c})}catch(e){u=async()=>{throw e}}await mc(e,{device:i,session:o,targetApp:a.targetApp,listInstalledApps:u}),fc(e,...await r.deviceChecks(i,n))}async function rl(e){if(e.device.platform!==`harmonyos`)return il(e)}async function il(e){let{device:t,req:n,targetApp:r,inspectFacts:i,bindDevice:a}=e;if(!r||!i||!a)return;let o=await i(t),s=o.operations.listApps,c=o.operations.ensureReady;if(!s.available||!c.available)return;let l=await a(t,ge),u=R(n.flags?.androidDeviceAllowlist),d=await ta(l,{serial:n.flags?.serial,androidSerialAllowlist:u?[...u].sort():void 0});return async e=>await na(l,d,e)}function al(e,t,n={}){let r=lc(e);return{ok:!0,data:{status:r,summary:uc(r),kind:t.kind,platform:n.device?d(n.device):n.inventory?.platform,target:n.device?.target??n.inventory?.target,targetApp:t.targetApp,metro:n.includeMetro&&t.shouldProbeMetro?{host:t.metroHost,port:t.metroPort}:void 0,checks:dc(e)}}}async function ol(e){return await j({...e,command:`prepare`,use:ve})}async function sl(e){let{req:t,sessionName:n,logPath:r,sessionStore:i}=e,o=t.positionals?.[0]??``;if(o!==`ios-runner`)return a(`INVALID_ARGS`,`prepare requires a subcommand: ios-runner`);let s=i.get(n),c=t.flags??{},l=W(N.prepare,s,c);if(l)return l;let u=await G({session:s,flags:c}),d=await ol({device:u,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(d.type===`response`)return d.response;let f=Date.now(),p=await d.runtime.operations.prepareAppleRunner({timeoutMs:cl(t),execution:{requestId:t.meta?.requestId,logPath:r,traceLogPath:s?.trace?.outPath,verbose:t.flags?.verbose,iosXctestrunFile:t.flags?.iosXctestrunFile,iosXctestDerivedDataPath:t.flags?.iosXctestDerivedDataPath,iosXctestEnvDir:t.flags?.iosXctestEnvDir,runnerLeaseContext:jn(t)}});return{ok:!0,data:ll(o,u,Math.max(0,Date.now()-f),p)}}function cl(e){let t=e.flags?.timeoutMs;return typeof t==`number`&&Number.isFinite(t)&&t>0?t:pe}function ll(e,t,n,r){return{action:e,platform:d(t),deviceId:t.id,deviceName:t.name,kind:t.kind,durationMs:n,...r,timing:ul(n,r),message:`Prepared Apple runner: ${t.name}`}}function ul(e,t){let n=dl(t.buildMs),r=fl(t.connectMs),i=fl(t.healthCheckMs);return{totalMs:e,additiveParts:{...n===void 0?{}:{buildMs:n},connectAfterBuildMs:Math.max(0,r-(n??0)),healthCheckMs:i},containment:n===void 0?{healthCheckMs:[]}:{connectMs:[`buildMs`],healthCheckMs:[]},note:`Top-level prepare timing fields are diagnostic and may overlap; use timing.additiveParts for additive wall-clock phases.`}}function dl(e){return e===void 0?void 0:fl(e)}function fl(e){return Number.isFinite(e)?Math.max(0,Math.round(e)):0}const Q=e=>ra(e),pl=e=>so({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,reconcileOrphanedDeviceClaim:e.reconcileOrphanedDeviceClaim}),ml=e=>Xi({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,leaseRegistry:e.leaseRegistry,leaseLifecycleProvider:e.leaseLifecycleProvider,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,platformResourceCleanup:e.platformResourceCleanup}),hl=async({req:e,sessionName:t,sessionStore:n,inspectFacts:r,bindDevice:i})=>await vo({req:e,sessionName:t,sessionStore:n,inspectFacts:r,bindDevice:i}),$=async({req:e,sessionName:t,sessionStore:n,bindDevice:r,inspectFacts:i,appLogAdmissionLedger:a,audioProbeAdmissionLedger:o,perfCaptureAdmissionLedger:s,throwIfCanceled:c})=>await ys({req:e,sessionName:t,sessionStore:n,bindDevice:r,inspectFacts:i,appLogAdmissionLedger:a,audioProbeAdmissionLedger:o,perfCaptureAdmissionLedger:s,throwIfCanceled:c}),gl={session_list:Q,devices:Q,capabilities:Q,apps:Q,doctor:async({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r,hostDiagnostics:i,inspectFacts:a,bindDevice:o})=>await Xc({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r,hostDiagnostics:i,inspectFacts:a,bindDevice:o}),boot:hl,shutdown:hl,appstate:hl,session_save_script:async({req:e,sessionName:t,sessionStore:n})=>$s({req:e,sessionName:t,sessionStore:n}),runtime:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a})=>await Ir({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a}),clipboard:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a})=>await cc({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a}),keyboard:pi,perf:$,logs:$,events:$,network:$,audio:$,prepare:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a})=>await sl({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a}),install:K,reinstall:K,install_source:K,release_materialized_paths:async({req:e})=>await br({req:e}),push:K,"trigger-app-event":mi,open:pl,replay:Ys,test:Xs,batch:async({req:e,sessionName:t,invoke:n})=>await Di(e,t,n),close:ml};async function _l(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a=new Zt,leaseLifecycleProvider:o,providerAppCatalog:s,invoke:c,invokeReplayAction:l,androidAdbExecutor:u,inspectFacts:d,bindDevice:f,bindExactDevice:p,appLogAdmissionLedger:m,audioProbeAdmissionLedger:h,perfCaptureAdmissionLedger:g,screenRecordingAdmissionLedger:_,hostDiagnostics:v,requestScope:y,retainDeviceExecutionLock:b,throwIfCanceled:x,reconcileOrphanedDeviceClaim:ee,platformResourceCleanup:S}=e,C=gl[t.command];return C?await C({req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,leaseLifecycleProvider:o,providerAppCatalog:s,invoke:c,invokeReplayAction:l,androidAdbExecutor:u,inspectFacts:d,bindDevice:f,bindExactDevice:p,appLogAdmissionLedger:m,audioProbeAdmissionLedger:h,perfCaptureAdmissionLedger:g,screenRecordingAdmissionLedger:_,hostDiagnostics:v,requestScope:y,retainDeviceExecutionLock:b,throwIfCanceled:x,reconcileOrphanedDeviceClaim:ee,platformResourceCleanup:S}):null}export{_l as handleSessionCommands};
4
+ `).find(e=>e.startsWith(`n`)&&e.length>1)?.slice(1)}const Vc=[`daemonBaseUrl`,`tenant`,`runId`,`leaseId`,`leaseProvider`],Hc=[`provider`,`providerSessionId`,`providerApp`,`providerOsVersion`,`providerProject`,`providerBuild`,`providerSessionName`,`providerDeviceOrientation`,`providerGeoLocation`,`providerTimezone`,`providerAppiumVersion`,`providerLanguage`,`providerLocale`,`providerNetworkProfile`,`providerCustomNetwork`,`providerNoResignApp`,`awsProjectArn`,`awsDeviceArn`,`awsAppArn`,`awsRegion`,`awsInteractionMode`];function Uc(e,t){let n=ht(e.meta?.cwd);return{targetApp:Jc(e.flags?.targetApp)??t?.appBundleId,metroHost:Jc(e.runtime?.metroHost)??`127.0.0.1`,metroPort:Yc(e.runtime?.metroPort)??8081,kind:n,remote:e.flags?.remote===!0,shouldProbeMetro:Kc(e,n)}}function Wc(e,t={}){let n=qc(e);return n?[{id:`remote-connection`,status:t.required?`pass`:`info`,summary:`Remote daemon/session or provider scope is configured.`,evidence:n}]:t.required?[{id:`remote-connection`,status:`fail`,summary:`No remote daemon/session or provider scope is configured.`,hint:`Use connect, --remote-config <path>, or direct remote/provider flags for the command.`}]:[]}function Gc(e,t,n,r={}){let i=n?e.listRefs().filter(e=>e.address!==t&&e.session.device.platform===n.device.platform&&e.session.device.id===n.device.id).map(e=>e.address):[];return n?[{id:`session`,status:i.length>0?`warn`:`pass`,summary:i.length>0?`Other active sessions target the same device: ${i.join(`, `)}`:`Active session ${n.name} targets ${n.device.name}`,hint:i.length>0?`Close stale sessions before a QA run if they belong to old attempts.`:void 0,command:i.length>0?`agent-device close --session ${i[0]} --platform ${u(n.device)}`:void 0,evidence:{session:t,sameDeviceSessions:i,sessionStateDir:e.resolveSessionDir(t)}}]:[{id:`session`,status:`info`,summary:r.remote?`No active session named ${t}. Remote doctor will use configured remote scope.`:`No active session named ${t}. Doctor will use device inventory only.`,hint:`This is expected before a run. Use open when app foreground state matters.`}]}function Kc(e,t){return t!==`auto`||typeof e.runtime?.metroPort==`number`||typeof e.runtime?.metroHost==`string`}function qc(e){let t={...Object.fromEntries([...Vc,...Hc].flatMap(t=>typeof e.flags?.[t]==`string`?[[t,`<configured>`]]:[])),...e.flags?.sessionIsolation===`tenant`?{sessionIsolation:`tenant`}:{}};return Object.keys(t).length>0?t:void 0}function Jc(e){return typeof e==`string`&&e.trim().length>0?e.trim():void 0}function Yc(e){return typeof e==`number`&&Number.isInteger(e)&&e>0?e:void 0}async function Xc(e){let{req:t,sessionName:n,sessionStore:r,androidAdbExecutor:i,inspectFacts:a,bindDevice:o}=e;if(t.command!==N.doctor)return null;let s=Zc(e.hostDiagnostics),c=r.get(n),l=Uc(t,c),u=el(r,n),d=[];if(fc(d,{id:`agent-device`,status:`pass`,summary:`agent-device ${ft()} using ${u}`,evidence:{version:ft(),stateDir:u}},...Wc(t,{required:l.remote}),...Gc(r,n,c,{remote:l.remote})),l.remote)return al(d,l);let f=Qc(l,u,i),p=await gc(d,t,c),m=await s.toolchainCheck(c?.device.platform??p?.platform,f);m&&X(d,m);let h=await tl({checks:d,context:f,hostDiagnostics:s,inventory:p,options:l,session:c,inspectFacts:a,bindDevice:o,req:t}),g=h??$c(p);if(g){let e=await s.warmupCheck(g,f);e&&X(d,e)}return al(d,l,{device:h,includeMetro:!0,inventory:p})}function Zc(e){if(!e)throw new n(`COMMAND_FAILED`,`Host diagnostics gateway is not configured`,{reason:`runtime-gateway-missing`});return e}function Qc(e,t,n){return Object.freeze({stateDir:t,metroPort:e.metroPort,shouldProbeMetro:e.shouldProbeMetro,isProviderDevice:e=>on(e),emitProgress:e=>St({type:`command`,status:`progress`,message:e}),listLocalDeviceInventory:async e=>await Ln(e),shouldPropagateInventoryProbeError:Fn,transportOverrides:Object.freeze({androidAdb:n})})}function $c(e){let t=(e?.devices??[]).filter(e=>p(e)&&e.kind===`simulator`);return t.find(e=>e.booted===!0)??t[0]}function el(e,t){let n=H.dirname(e.resolveSessionDir(t));return H.basename(n)===`sessions`?H.dirname(n):n}async function tl(e){let{checks:t,context:n,hostDiagnostics:r,inventory:i,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}=e,u=o?.device??_c(t,i,a.targetApp);return u&&await nl(t,{context:n,hostDiagnostics:r,device:u,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}),a.shouldProbeMetro&&X(t,await Pc(a.metroHost,a.metroPort,a.kind)),fc(t,...await r.ambientChecks(n)),u}async function nl(e,t){let{context:n,hostDiagnostics:r,device:i,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}=t,u;try{u=await rl({device:i,req:l,targetApp:a.targetApp,inspectFacts:s,bindDevice:c})}catch(e){u=async()=>{throw e}}await mc(e,{device:i,session:o,targetApp:a.targetApp,listInstalledApps:u}),fc(e,...await r.deviceChecks(i,n))}async function rl(e){if(e.device.platform!==`harmonyos`)return il(e)}async function il(e){let{device:t,req:n,targetApp:r,inspectFacts:i,bindDevice:a}=e;if(!r||!i||!a)return;let o=await i(t),s=o.operations.listApps,c=o.operations.ensureReady;if(!s.available||!c.available)return;let l=await a(t,ge),u=R(n.flags?.androidDeviceAllowlist),d=await ta(l,{serial:n.flags?.serial,androidSerialAllowlist:u?[...u].sort():void 0});return async e=>await na(l,d,e)}function al(e,t,n={}){let r=lc(e);return{ok:!0,data:{status:r,summary:uc(r),kind:t.kind,platform:n.device?u(n.device):n.inventory?.platform,target:n.device?.target??n.inventory?.target,targetApp:t.targetApp,metro:n.includeMetro&&t.shouldProbeMetro?{host:t.metroHost,port:t.metroPort}:void 0,checks:dc(e)}}}async function ol(e){return await j({...e,command:`prepare`,use:ve})}async function sl(e){let{req:t,sessionName:n,logPath:r,sessionStore:i}=e,o=t.positionals?.[0]??``;if(o!==`ios-runner`)return a(`INVALID_ARGS`,`prepare requires a subcommand: ios-runner`);let s=i.get(n),c=t.flags??{},l=W(N.prepare,s,c);if(l)return l;let u=await G({session:s,flags:c}),d=await ol({device:u,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(d.type===`response`)return d.response;let f=Date.now(),p=await d.runtime.operations.prepareAppleRunner({timeoutMs:cl(t),execution:{requestId:t.meta?.requestId,logPath:r,traceLogPath:s?.trace?.outPath,verbose:t.flags?.verbose,iosXctestrunFile:t.flags?.iosXctestrunFile,iosXctestDerivedDataPath:t.flags?.iosXctestDerivedDataPath,iosXctestEnvDir:t.flags?.iosXctestEnvDir,runnerLeaseContext:jn(t)}});return{ok:!0,data:ll(o,u,Math.max(0,Date.now()-f),p)}}function cl(e){let t=e.flags?.timeoutMs;return typeof t==`number`&&Number.isFinite(t)&&t>0?t:pe}function ll(e,t,n,r){return{action:e,platform:u(t),deviceId:t.id,deviceName:t.name,kind:t.kind,durationMs:n,...r,timing:ul(n,r),message:`Prepared Apple runner: ${t.name}`}}function ul(e,t){let n=dl(t.buildMs),r=fl(t.connectMs),i=fl(t.healthCheckMs);return{totalMs:e,additiveParts:{...n===void 0?{}:{buildMs:n},connectAfterBuildMs:Math.max(0,r-(n??0)),healthCheckMs:i},containment:n===void 0?{healthCheckMs:[]}:{connectMs:[`buildMs`],healthCheckMs:[]},note:`Top-level prepare timing fields are diagnostic and may overlap; use timing.additiveParts for additive wall-clock phases.`}}function dl(e){return e===void 0?void 0:fl(e)}function fl(e){return Number.isFinite(e)?Math.max(0,Math.round(e)):0}const Q=e=>ra(e),pl=e=>so({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,reconcileOrphanedDeviceClaim:e.reconcileOrphanedDeviceClaim}),ml=e=>Xi({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,leaseRegistry:e.leaseRegistry,leaseLifecycleProvider:e.leaseLifecycleProvider,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,platformResourceCleanup:e.platformResourceCleanup}),hl=async({req:e,sessionName:t,sessionStore:n,inspectFacts:r,bindDevice:i})=>await vo({req:e,sessionName:t,sessionStore:n,inspectFacts:r,bindDevice:i}),$=async({req:e,sessionName:t,sessionStore:n,bindDevice:r,inspectFacts:i,appLogAdmissionLedger:a,audioProbeAdmissionLedger:o,perfCaptureAdmissionLedger:s,throwIfCanceled:c})=>await ys({req:e,sessionName:t,sessionStore:n,bindDevice:r,inspectFacts:i,appLogAdmissionLedger:a,audioProbeAdmissionLedger:o,perfCaptureAdmissionLedger:s,throwIfCanceled:c}),gl={session_list:Q,devices:Q,capabilities:Q,apps:Q,doctor:async({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r,hostDiagnostics:i,inspectFacts:a,bindDevice:o})=>await Xc({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r,hostDiagnostics:i,inspectFacts:a,bindDevice:o}),boot:hl,shutdown:hl,appstate:hl,session_save_script:async({req:e,sessionName:t,sessionStore:n})=>$s({req:e,sessionName:t,sessionStore:n}),runtime:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a})=>await Ir({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a}),clipboard:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a})=>await cc({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a}),keyboard:pi,perf:$,logs:$,events:$,network:$,audio:$,prepare:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a})=>await sl({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a}),install:K,reinstall:K,install_source:K,release_materialized_paths:async({req:e})=>await br({req:e}),push:K,"trigger-app-event":mi,open:pl,replay:Ys,test:Xs,batch:async({req:e,sessionName:t,invoke:n})=>await Di(e,t,n),close:ml};async function _l(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a=new Zt,leaseLifecycleProvider:o,providerAppCatalog:s,invoke:c,invokeReplayAction:l,androidAdbExecutor:u,inspectFacts:d,bindDevice:f,bindExactDevice:p,appLogAdmissionLedger:m,audioProbeAdmissionLedger:h,perfCaptureAdmissionLedger:g,screenRecordingAdmissionLedger:_,hostDiagnostics:v,requestScope:y,retainDeviceExecutionLock:b,throwIfCanceled:x,reconcileOrphanedDeviceClaim:ee,platformResourceCleanup:S}=e,C=gl[t.command];return C?await C({req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a,leaseLifecycleProvider:o,providerAppCatalog:s,invoke:c,invokeReplayAction:l,androidAdbExecutor:u,inspectFacts:d,bindDevice:f,bindExactDevice:p,appLogAdmissionLedger:m,audioProbeAdmissionLedger:h,perfCaptureAdmissionLedger:g,screenRecordingAdmissionLedger:_,hostDiagnostics:v,requestScope:y,retainDeviceExecutionLock:b,throwIfCanceled:x,reconcileOrphanedDeviceClaim:ee,platformResourceCleanup:S}):null}export{_l as handleSessionCommands};
@@ -1 +1 @@
1
- import{A as e}from"./sdk-contracts.js";const t=[`grant`,`deny`,`reset`],n=[`full`,`limited`],r=[`all`,`camera`,`microphone`,`photos`,`contacts`,`contacts-limited`,`notifications`,`calendar`,`location`,`location-always`,`media-library`,`motion`,`reminders`,`siri`],i=[`accessibility`,`screen-recording`,`input-monitoring`],a=[`extra-small`,`small`,`medium`,`large`,`extra-large`,`extra-extra-large`,`extra-extra-extra-large`,`accessibility-medium`,`accessibility-large`,`accessibility-extra-large`,`accessibility-extra-extra-large`,`accessibility-extra-extra-extra-large`],o=[`light`,`dark`,`toggle`],s=[`on`,`true`,`1`],c=[`off`,`false`,`0`];function l(e,t){return Object.freeze({setting:`text-size`,category:e,platformValue:t})}function u(e){return`Text size is ${e.category}`}function d(e,t,n){return e===`clear-app-state`?`Cleared user data for ${n}`:e===`text-size`?`Text size set to ${t}`:`Updated setting: ${e}`}const f=`<wifi|airplane|location> <on|off>`,p=`location set <lat> <lon>`,m=`animations <on|off>`,h=`appearance <${o.join(`|`)}>`,g=`faceid <match|nonmatch|enroll|unenroll>`,_=`touchid <match|nonmatch|enroll|unenroll>`,v=`fingerprint <match|nonmatch>`,y=`clear-app-state [app-id]`,b=`reset-keychain clear`,x=`text-size [${a.join(`|`)}]`,S=`permission <${t.join(`|`)}> <${r.join(`|`)}> [${n.join(`|`)}]`,C=`permission <grant|reset> <${i.join(`|`)}>`,w=`macOS supports only settings ${h} and settings ${C}. wifi|airplane|location|animations|text-size remain unsupported on macOS.`,T=[`settings ${f}`,`settings ${p}`,`settings ${m}`,`settings ${h}`,`settings ${x}`,`settings ${g}`,`settings ${_}`,`settings ${v}`,`settings ${y}`,`settings ${b}`,`settings ${S}`,`settings ${C}`].join(` | `),E=`settings requires ${f}, ${p}, ${m}, ${h}, ${x}, ${g}, ${_}, ${v}, ${y}, ${b}, ${S}, or ${C}`;function D(e){let t=e.trim().toLowerCase();return t===`appearance`||t===`permission`}function O(e){return`Unsupported macOS setting: ${e}. ${w}`}function k(t){let n=j(t);if(n!==void 0)return n;throw new e(`INVALID_ARGS`,A(t))}function A(e){return`Invalid text size: ${e??``}. Use ${a.join(`|`)}.`}function j(e){return N(a,e)}const M=Object.freeze({message:`Reading or setting a text size is supported on iOS and iPadOS simulators.`,hint:"Run `xcrun simctl ui <device> content_size` on a booted iPhone or iPad simulator.",reason:`setting-unsupported-on-leaf`});function N(e,t){let n=t?.trim().toLowerCase();return n===void 0?void 0:e.find(e=>e===n)}function P(n){let r=N(t,n);if(r!==void 0)return r;throw new e(`INVALID_ARGS`,`Invalid permission action: ${n}. Use ${t.join(`|`)}.`)}function F(t){let n=N(r,t);if(n!==void 0)return n;throw new e(`INVALID_ARGS`,`permission setting requires a target: ${r.join(`|`)}`)}function I(t){let n=N(o,t);if(n!==void 0)return n;throw new e(`INVALID_ARGS`,`Invalid appearance state: ${t}. Use ${o.join(`|`)}.`)}function L(t){let n=t.toLowerCase();if(s.includes(n))return!0;if(c.includes(n))return!1;throw new e(`INVALID_ARGS`,`Invalid setting state: ${t}`)}export{l as S,P as _,t as a,k as b,C as c,u as d,d as f,I as g,D as h,r as i,T as l,A as m,M as n,n as o,O as p,i as r,E as s,o as t,a as u,F as v,j as x,L as y};
1
+ import{M as e}from"./sdk-contracts.js";const t=[`grant`,`deny`,`reset`],n=[`full`,`limited`],r=[`all`,`camera`,`microphone`,`photos`,`contacts`,`contacts-limited`,`notifications`,`calendar`,`location`,`location-always`,`media-library`,`motion`,`reminders`,`siri`],i=[`accessibility`,`screen-recording`,`input-monitoring`],a=[`extra-small`,`small`,`medium`,`large`,`extra-large`,`extra-extra-large`,`extra-extra-extra-large`,`accessibility-medium`,`accessibility-large`,`accessibility-extra-large`,`accessibility-extra-extra-large`,`accessibility-extra-extra-extra-large`],o=[`light`,`dark`,`toggle`],s=[`on`,`true`,`1`],c=[`off`,`false`,`0`];function l(e,t){return Object.freeze({setting:`text-size`,category:e,platformValue:t})}function u(e){return`Text size is ${e.category}`}function d(e,t,n){return e===`clear-app-state`?`Cleared user data for ${n}`:e===`text-size`?`Text size set to ${t}`:`Updated setting: ${e}`}const f=`<wifi|airplane|location> <on|off>`,p=`location set <lat> <lon>`,m=`animations <on|off>`,h=`appearance <${o.join(`|`)}>`,g=`faceid <match|nonmatch|enroll|unenroll>`,_=`touchid <match|nonmatch|enroll|unenroll>`,v=`fingerprint <match|nonmatch>`,y=`clear-app-state [app-id]`,b=`reset-keychain clear`,x=`text-size [${a.join(`|`)}]`,S=`permission <${t.join(`|`)}> <${r.join(`|`)}> [${n.join(`|`)}]`,C=`permission <grant|reset> <${i.join(`|`)}>`,w=`macOS supports only settings ${h} and settings ${C}. wifi|airplane|location|animations|text-size remain unsupported on macOS.`,T=[`settings ${f}`,`settings ${p}`,`settings ${m}`,`settings ${h}`,`settings ${x}`,`settings ${g}`,`settings ${_}`,`settings ${v}`,`settings ${y}`,`settings ${b}`,`settings ${S}`,`settings ${C}`].join(` | `),E=`settings requires ${f}, ${p}, ${m}, ${h}, ${x}, ${g}, ${_}, ${v}, ${y}, ${b}, ${S}, or ${C}`;function D(e){let t=e.trim().toLowerCase();return t===`appearance`||t===`permission`}function O(e){return`Unsupported macOS setting: ${e}. ${w}`}function k(t){let n=j(t);if(n!==void 0)return n;throw new e(`INVALID_ARGS`,A(t))}function A(e){return`Invalid text size: ${e??``}. Use ${a.join(`|`)}.`}function j(e){return P(a,e)}const M=Object.freeze({message:`Reading or setting a text size is supported on iOS and iPadOS simulators.`,hint:"Run `xcrun simctl ui <device> content_size` on a booted iPhone or iPad simulator.",reason:`setting-unsupported-on-leaf`}),N=Object.freeze({message:`Face ID and Touch ID simulation is supported on iOS and iPadOS simulators.`,hint:"Select a booted iPhone or iPad simulator, then run `settings faceid <state>` or `settings touchid <state>`.",reason:`setting-unsupported-on-leaf`});function P(e,t){let n=t?.trim().toLowerCase();return n===void 0?void 0:e.find(e=>e===n)}function F(n){let r=P(t,n);if(r!==void 0)return r;throw new e(`INVALID_ARGS`,`Invalid permission action: ${n}. Use ${t.join(`|`)}.`)}function I(t){let n=P(r,t);if(n!==void 0)return n;throw new e(`INVALID_ARGS`,`permission setting requires a target: ${r.join(`|`)}`)}function L(t){let n=P(o,t);if(n!==void 0)return n;throw new e(`INVALID_ARGS`,`Invalid appearance state: ${t}. Use ${o.join(`|`)}.`)}function R(t){let n=t.toLowerCase();if(s.includes(n))return!0;if(c.includes(n))return!1;throw new e(`INVALID_ARGS`,`Invalid setting state: ${t}`)}export{l as C,j as S,L as _,r as a,R as b,E as c,a as d,u as f,D as g,A as h,i,C as l,O as m,N as n,t as o,d as p,M as r,n as s,o as t,T as u,F as v,k as x,I as y};
@@ -1 +1 @@
1
- import{A as e}from"./sdk-contracts.js";import{runHarmonyShell as t}from"./hdc.js";async function n(n,r,i,a){if(r!==`clear-app-state`)throw new e(`UNSUPPORTED_OPERATION`,`HarmonyOS setting "${r}" is not supported`,{hint:`HarmonyOS currently supports settings clear-app-state for an app bundle only.`});if(i!==`clear`)throw new e(`INVALID_ARGS`,`settings clear-app-state only supports clear.`);if(!a)throw new e(`INVALID_ARGS`,`settings clear-app-state requires an app id or an active app session.`);return await t(n,[`aa`,`force-stop`,a],{timeoutMs:15e3}),await t(n,[`bm`,`clean`,`-n`,a,`-d`,`-c`],{timeoutMs:15e3}),{bundleId:a,forceStopped:!0,clearedData:!0,clearedCache:!0}}export{n as setHarmonySetting};
1
+ import{M as e}from"./sdk-contracts.js";import{runHarmonyShell as t}from"./hdc.js";async function n(n,r,i,a){if(r!==`clear-app-state`)throw new e(`UNSUPPORTED_OPERATION`,`HarmonyOS setting "${r}" is not supported`,{hint:`HarmonyOS currently supports settings clear-app-state for an app bundle only.`});if(i!==`clear`)throw new e(`INVALID_ARGS`,`settings clear-app-state only supports clear.`);if(!a)throw new e(`INVALID_ARGS`,`settings clear-app-state requires an app id or an active app session.`);return await t(n,[`aa`,`force-stop`,a],{timeoutMs:15e3}),await t(n,[`bm`,`clean`,`-n`,a,`-d`,`-c`],{timeoutMs:15e3}),{bundleId:a,forceStopped:!0,clearedData:!0,clearedCache:!0}}export{n as setHarmonySetting};
@@ -1 +1 @@
1
- import{d as e}from"./sdk-device.js";import"./command.js";import{r as t}from"./device-isolation.js";import{o as n,s as r}from"./tool-provider.js";function i(t){let n=e(t)&&t.kind===`simulator`?t.simulatorSetPath:void 0;return Object.freeze({udid:t.id,simulatorSetPath:n})}function a(e,n){let r=t(e),i=r?[`--set`,r,...n]:[...n];return Object.freeze(i)}function o(){return a(void 0,[`help`])}function s(e){return a(e,[`list`,`devices`,`-j`])}function c(e,t){return a(i(e).simulatorSetPath,t)}function l(e,t){return r(a(e.simulatorSetPath,t))}function u(e,t){return l(i(e),t)}function d(e,t,r){return n(u(e,t),r)}function f(e){return JSON.parse(e).devices??{}}function p(e,t){try{for(let n of Object.values(f(e))){let e=n.find(e=>e.udid===t);if(e)return e.state??null}return null}catch{return null}}export{d as a,s as c,f as i,i as l,u as n,c as o,p as r,o as s,l as t};
1
+ import{f as e}from"./sdk-device.js";import"./command.js";import{r as t}from"./device-isolation.js";import{o as n,s as r}from"./tool-provider.js";function i(n){let r=e(n)&&n.kind===`simulator`?t(n.simulatorSetPath):void 0;return Object.freeze({udid:n.id,simulatorSetPath:r})}function a(e,n){let r=t(e),i=r?[`--set`,r,...n]:[...n];return Object.freeze(i)}function o(){return a(void 0,[`help`])}function s(e){return a(e,[`list`,`devices`,`-j`])}function c(e,t){return a(i(e).simulatorSetPath,t)}function l(e,t){return r(a(e.simulatorSetPath,t))}function u(e,t){return l(i(e),t)}function d(e,t,r){return n(u(e,t),r)}function f(e){return JSON.parse(e).devices??{}}function p(e,t){try{for(let n of Object.values(f(e))){let e=n.find(e=>e.udid===t);if(e)return e.state??null}return null}catch{return null}}export{d as a,s as c,f as i,i as l,u as n,c as o,p as r,o as s,l as t};
@@ -1,3 +1,3 @@
1
- import{d as e}from"./sdk-device.js";import{c as t}from"./exec.js";import"./command.js";const n=`launchd_sim`,r={LC_ALL:`C`},i=/^(\d+)\s+([A-Za-z]{3} [A-Za-z]{3} +\d{1,2} \d{2}:\d{2}:\d{2} \d{4})\s+(.+)$/,a=/^[A-Za-z]{3} ([A-Za-z]{3}) +(\d{1,2}) (\d{2}):(\d{2}):(\d{2}) (\d{4})$/,o=new Map([[`Jan`,0],[`Feb`,1],[`Mar`,2],[`Apr`,3],[`May`,4],[`Jun`,5],[`Jul`,6],[`Aug`,7],[`Sep`,8],[`Oct`,9],[`Nov`,10],[`Dec`,11]]);async function s(t){if(!e(t)||t.kind!==`simulator`)return{observed:!1,reason:`unsupported-device`};let n=await c();if(n.length===0)return{observed:!1,reason:`unobserved`};let r=d(await l(n),t.id);return r===void 0?{observed:!1,reason:`unobserved`}:{observed:!0,bootedAtMs:r}}async function c(){let e=await u(`/usr/bin/pgrep`,[`-x`,n]);return e===void 0?[]:e.split(`
1
+ import{f as e}from"./sdk-device.js";import{c as t}from"./exec.js";import"./command.js";const n=`launchd_sim`,r={LC_ALL:`C`},i=/^(\d+)\s+([A-Za-z]{3} [A-Za-z]{3} +\d{1,2} \d{2}:\d{2}:\d{2} \d{4})\s+(.+)$/,a=/^[A-Za-z]{3} ([A-Za-z]{3}) +(\d{1,2}) (\d{2}):(\d{2}):(\d{2}) (\d{4})$/,o=new Map([[`Jan`,0],[`Feb`,1],[`Mar`,2],[`Apr`,3],[`May`,4],[`Jun`,5],[`Jul`,6],[`Aug`,7],[`Sep`,8],[`Oct`,9],[`Nov`,10],[`Dec`,11]]);async function s(t){if(!e(t)||t.kind!==`simulator`)return{observed:!1,reason:`unsupported-device`};let n=await c();if(n.length===0)return{observed:!1,reason:`unobserved`};let r=d(await l(n),t.id);return r===void 0?{observed:!1,reason:`unobserved`}:{observed:!0,bootedAtMs:r}}async function c(){let e=await u(`/usr/bin/pgrep`,[`-x`,n]);return e===void 0?[]:e.split(`
2
2
  `).map(e=>Number.parseInt(e.trim(),10)).filter(e=>Number.isInteger(e)&&e>0)}async function l(e){return await u(`/bin/ps`,[`-p`,e.join(`,`),`-o`,`pid=,lstart=,command=`],r)??``}async function u(e,n,r){try{let i=await t(e,[...n],{allowFailure:!0,timeoutMs:2e3,...r?{env:r}:{}});return i.exitCode===0?i.stdout:void 0}catch{return}}function d(e,t){let n=Date.now(),r;for(let i of e.split(`
3
3
  `)){let e=f(i,t);e===void 0||e>n||(r===void 0||e>r)&&(r=e)}return r}function f(e,t){let[,n,r]=i.exec(e)?.slice(1)??[];if(n!==void 0&&r!==void 0&&p(r,t))return m(n)}function p(e,t){let[r,...i]=e.trim().split(/\s+/);return r!==void 0&&r.split(`/`).pop()===n&&i.some(e=>e.includes(t))}function m(e){let[,t,n,r,i,s,c]=a.exec(e.trim())??[],l=t===void 0?void 0:o.get(t);if(l===void 0)return;let u=new Date(Number(c),l,Number(n),Number(r),Number(i),Number(s)).getTime();return Number.isFinite(u)?u:void 0}export{s as observeSimulatorBootTimeMs};
@@ -1 +1 @@
1
- import{A as e}from"./sdk-contracts.js";import{a as t,n}from"./exec.js";import"./command.js";import{i as r,n as i}from"./retry.js";import{t as a}from"./ttl-memo.js";import{n as o,t as s}from"./boot-diagnostics.js";import{t as c}from"./scoped-provider.js";import{l,r as u,u as d}from"./config.js";import{a as f,o as p}from"./tool-provider.js";import{n as m,r as h}from"./simctl.js";const g=c(void 0);async function _(e,t){return await g.run(e,t)}const v=a({ttlMs:5e3});function y(e){return`${e.id}|${e.simulatorSetPath??``}`}function b(e){return v.get(y(e))===!0}function x(e){v.set(y(e),!0)}function S(t,n){if(t.kind!==`simulator`)throw new e(`UNSUPPORTED_OPERATION`,`${n} is only supported on iOS simulators`)}async function C(e={}){await f(`open`,[`-a`,`Simulator`],{allowFailure:!0,signal:e.signal,timeoutMs:d})}async function w(a,c={}){if(a.kind!==`simulator`)return;c.signal?.throwIfAborted();let l=g.resolve();if(l){await l(a),c.signal?.throwIfAborted();return}if((b(a)?`Booted`:await T(a,c.signal))===`Booted`){x(a);return}let d=i.fromTimeoutMs(u),f,h;try{await r(async({deadline:r})=>{if(r?.isExpired())throw new e(`COMMAND_FAILED`,`iOS simulator boot deadline exceeded`,{timeoutMs:u});let i=Math.max(1e3,r?.remainingMs()??18e4);f=await p(m(a,[`boot`,a.id]),{allowFailure:!0,signal:c.signal,timeoutMs:i});let o=`${f.stdout}\n${f.stderr}`.toLowerCase(),s=o.includes(`already booted`)||o.includes(`current state: booted`);if(f.exitCode!==0&&!s)throw new e(`COMMAND_FAILED`,`simctl boot failed`,n(f));h=await p(m(a,[`bootstatus`,a.id,`-b`]),{allowFailure:!0,signal:c.signal,timeoutMs:i}),t(h,`simctl bootstatus failed`);let l=await T(a,c.signal);if(l!==`Booted`)throw new e(`COMMAND_FAILED`,`Simulator is still booting`,{state:l})},{maxAttempts:3,baseDelayMs:500,maxDelayMs:2e3,jitter:.2,shouldRetry:e=>{let t=o({error:e,stdout:h?.stdout??f?.stdout,stderr:h?.stderr??f?.stderr,context:{platform:`ios`,phase:`boot`}});return t!==`IOS_BOOT_TIMEOUT`&&t!==`CI_RESOURCE_STARVATION_SUSPECTED`}},{deadline:d,phase:`boot`,signal:c.signal,classifyReason:e=>o({error:e,stdout:h?.stdout??f?.stdout,stderr:h?.stderr??f?.stderr,context:{platform:`ios`,phase:`boot`}})})}catch(t){let n=o({error:t,stdout:h?.stdout??f?.stdout,stderr:h?.stderr??f?.stderr,context:{platform:`ios`,phase:`boot`}});throw new e(`COMMAND_FAILED`,`iOS simulator failed to boot`,{platform:`ios`,deviceId:a.id,timeoutMs:u,elapsedMs:d.elapsedMs(),reason:n,hint:s(n),boot:f,bootstatus:h})}x(a),await C({signal:c.signal})}async function T(e,t){let n=m(e,[`list`,`devices`,`-j`]),r=await p(n,{allowFailure:!0,signal:t,timeoutMs:l});return r.exitCode===0?h(r.stdout,e.id):null}export{_ as a,b as i,x as n,S as r,w as t};
1
+ import{M as e}from"./sdk-contracts.js";import{a as t,n}from"./exec.js";import"./command.js";import{i as r,n as i}from"./retry.js";import{t as a}from"./ttl-memo.js";import{n as o,t as s}from"./boot-diagnostics.js";import{t as c}from"./scoped-provider.js";import{l,r as u,u as d}from"./config.js";import{a as f,o as p}from"./tool-provider.js";import{n as m,r as h}from"./simctl.js";const g=c(void 0);async function _(e,t){return await g.run(e,t)}const v=a({ttlMs:5e3});function y(e){return`${e.id}|${e.simulatorSetPath??``}`}function b(e){return v.get(y(e))===!0}function x(e){v.set(y(e),!0)}function S(t,n){if(t.kind!==`simulator`)throw new e(`UNSUPPORTED_OPERATION`,`${n} is only supported on iOS simulators`)}async function C(e={}){await f(`open`,[`-a`,`Simulator`],{allowFailure:!0,signal:e.signal,timeoutMs:d})}async function w(a,c={}){if(a.kind!==`simulator`)return;c.signal?.throwIfAborted();let l=g.resolve();if(l){await l(a),c.signal?.throwIfAborted();return}if((b(a)?`Booted`:await T(a,c.signal))===`Booted`){x(a);return}let d=i.fromTimeoutMs(u),f,h;try{await r(async({deadline:r})=>{if(r?.isExpired())throw new e(`COMMAND_FAILED`,`iOS simulator boot deadline exceeded`,{timeoutMs:u});let i=Math.max(1e3,r?.remainingMs()??18e4);f=await p(m(a,[`boot`,a.id]),{allowFailure:!0,signal:c.signal,timeoutMs:i});let o=`${f.stdout}\n${f.stderr}`.toLowerCase(),s=o.includes(`already booted`)||o.includes(`current state: booted`);if(f.exitCode!==0&&!s)throw new e(`COMMAND_FAILED`,`simctl boot failed`,n(f));h=await p(m(a,[`bootstatus`,a.id,`-b`]),{allowFailure:!0,signal:c.signal,timeoutMs:i}),t(h,`simctl bootstatus failed`);let l=await T(a,c.signal);if(l!==`Booted`)throw new e(`COMMAND_FAILED`,`Simulator is still booting`,{state:l})},{maxAttempts:3,baseDelayMs:500,maxDelayMs:2e3,jitter:.2,shouldRetry:e=>{let t=o({error:e,stdout:h?.stdout??f?.stdout,stderr:h?.stderr??f?.stderr,context:{platform:`ios`,phase:`boot`}});return t!==`IOS_BOOT_TIMEOUT`&&t!==`CI_RESOURCE_STARVATION_SUSPECTED`}},{deadline:d,phase:`boot`,signal:c.signal,classifyReason:e=>o({error:e,stdout:h?.stdout??f?.stdout,stderr:h?.stderr??f?.stderr,context:{platform:`ios`,phase:`boot`}})})}catch(t){let n=o({error:t,stdout:h?.stdout??f?.stdout,stderr:h?.stderr??f?.stderr,context:{platform:`ios`,phase:`boot`}});throw new e(`COMMAND_FAILED`,`iOS simulator failed to boot`,{platform:`ios`,deviceId:a.id,timeoutMs:u,elapsedMs:d.elapsedMs(),reason:n,hint:s(n),boot:f,bootstatus:h})}x(a),await C({signal:c.signal})}async function T(e,t){let n=m(e,[`list`,`devices`,`-j`]),r=await p(n,{allowFailure:!0,signal:t,timeoutMs:l});return r.exitCode===0?h(r.stdout,e.id):null}export{_ as a,b as i,x as n,S as r,w as t};