agent-device 0.21.7 → 0.21.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (204) hide show
  1. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.7.apk → agent-device-android-ime-helper-0.21.9.apk} +0 -0
  2. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.9.apk.sha256 +1 -0
  3. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.7.manifest.json → agent-device-android-ime-helper-0.21.9.manifest.json} +4 -4
  4. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.7.apk → agent-device-android-snapshot-helper-0.21.9.apk} +0 -0
  5. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.9.apk.sha256 +1 -0
  6. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.7.manifest.json → agent-device-android-snapshot-helper-0.21.9.manifest.json} +6 -6
  7. package/apple/macos-helper/Package.swift +16 -1
  8. package/apple/macos-helper/Sources/AgentDeviceMacOSDeviceHub/DeviceHubPose.swift +47 -0
  9. package/apple/macos-helper/Sources/AgentDeviceMacOSDeviceHub/DeviceHubWindowInventory.swift +65 -0
  10. package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/DeviceHubPose.swift +225 -0
  11. package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/DeviceHubSidebar.swift +57 -0
  12. package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/DeviceHubWindowDiscovery.swift +108 -0
  13. package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/main.swift +66 -13
  14. package/apple/macos-helper/Sources/AgentDeviceMacOSInput/MouseClickDelivery.swift +116 -0
  15. package/apple/macos-helper/Sources/AgentDeviceMacOSInput/MouseClickSchedule.swift +61 -0
  16. package/apple/macos-helper/Tests/AgentDeviceMacOSDeviceHubTests/DeviceHubPoseTests.swift +30 -0
  17. package/apple/macos-helper/Tests/AgentDeviceMacOSDeviceHubTests/DeviceHubWindowInventoryTests.swift +65 -0
  18. package/apple/macos-helper/Tests/AgentDeviceMacOSInputTests/MouseClickScheduleTests.swift +58 -0
  19. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/AgentDeviceRunnerUITests-Bridging-Header.h +1 -0
  20. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAppScreenCapture.swift +175 -0
  21. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.h +10 -2
  22. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.m +42 -15
  23. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Alert.swift +8 -0
  24. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +45 -22
  25. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +39 -734
  26. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Keyboard.swift +20 -4
  27. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Lifecycle.swift +63 -1
  28. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +13 -0
  29. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Navigation.swift +25 -10
  30. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Snapshot.swift +5 -562
  31. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotAcquisition.swift +566 -0
  32. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedGesturePolicy.swift +5 -1
  33. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedInteraction.swift +594 -0
  34. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerXCTestEventBridge.h +35 -1
  35. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerXCTestEventBridge.m +160 -0
  36. package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/RecordingExportSupport.swift +3 -0
  37. package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/recording-frames.swift +203 -0
  38. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotCoordinateSpace.swift +5 -0
  39. package/dist/src/absence-observation-errors.js +1 -1
  40. package/dist/src/adapter.js +1 -1
  41. package/dist/src/agent-browser-lifecycle.js +1 -1
  42. package/dist/src/agent-browser-process-record.js +1 -1
  43. package/dist/src/agent-device-client.js +2 -2
  44. package/dist/src/alert-runtime.js +1 -1
  45. package/dist/src/android-adb.js +1 -1
  46. package/dist/src/android-input-ownership.js +1 -1
  47. package/dist/src/android.js +1 -1
  48. package/dist/src/app-launch.js +1 -1
  49. package/dist/src/app-log-runtime2.js +3 -3
  50. package/dist/src/app-resolution.js +2 -2
  51. package/dist/src/apple-runner-platform.js +1 -1
  52. package/dist/src/application-lifecycle-interaction.js +1 -1
  53. package/dist/src/artifact-paths.js +1 -0
  54. package/dist/src/back-mode.js +1 -1
  55. package/dist/src/cli-config.js +1 -1
  56. package/dist/src/cli-help.js +15 -11
  57. package/dist/src/cli.js +4 -4
  58. package/dist/src/client-types.d.ts +51 -1
  59. package/dist/src/command-tools.js +3 -3
  60. package/dist/src/config.js +1 -1
  61. package/dist/src/connection-runtime.js +1 -1
  62. package/dist/src/device-claim-inspection.js +1 -1
  63. package/dist/src/device-claim-rule.js +2 -2
  64. package/dist/src/device-input-state.d.ts +1 -1
  65. package/dist/src/device-rotation.js +1 -1
  66. package/dist/src/device-selection-resolver.js +1 -1
  67. package/dist/src/device-session.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/dispatch-resolve.js +1 -1
  72. package/dist/src/display-inventory.js +1 -1
  73. package/dist/src/doctor-facade.js +1 -1
  74. package/dist/src/durable-resource.js +1 -1
  75. package/dist/src/exec.js +1 -1
  76. package/dist/src/find.js +1 -1
  77. package/dist/src/finders.js +1 -1
  78. package/dist/src/fold-runtime.js +1 -0
  79. package/dist/src/gesture-admission.js +1 -1
  80. package/dist/src/gesture-runtime.js +1 -1
  81. package/dist/src/harmonyos.js +1 -1
  82. package/dist/src/helper.js +2 -2
  83. package/dist/src/host.js +1 -0
  84. package/dist/src/interaction-positionals.js +1 -1
  85. package/dist/src/interaction-ref-policy.js +1 -1
  86. package/dist/src/interaction.js +1 -1
  87. package/dist/src/interaction2.js +1 -1
  88. package/dist/src/interactor-operation-binding.js +1 -0
  89. package/dist/src/interactor-operation-catalog.js +1 -1
  90. package/dist/src/interactor.js +4 -5
  91. package/dist/src/interactor2.js +1 -1
  92. package/dist/src/interactors.js +1 -1
  93. package/dist/src/internal/bin.js +1 -1
  94. package/dist/src/internal/daemon.js +2 -2
  95. package/dist/src/internal/png-worker.d.ts +5 -0
  96. package/dist/src/internal/png-worker.js +1 -1
  97. package/dist/src/inventory2.js +1 -1
  98. package/dist/src/ios-snapshot-acquisition.js +1 -1
  99. package/dist/src/ios-snapshot-runtime.js +1 -1
  100. package/dist/src/lease.js +1 -1
  101. package/dist/src/linux.js +1 -1
  102. package/dist/src/local-interactor-operation-set.js +1 -1
  103. package/dist/src/location-coordinates.js +1 -1
  104. package/dist/src/macos-facade.js +1 -1
  105. package/dist/src/managed-device-scope.js +1 -1
  106. package/dist/src/mechanics.js +17 -16
  107. package/dist/src/mobile-snapshot-semantics.js +1 -1
  108. package/dist/src/mp4-duration.js +1 -0
  109. package/dist/src/multitouch-support.js +1 -1
  110. package/dist/src/owner-identity.js +1 -1
  111. package/dist/src/parameterized-recorded-fill.js +1 -1
  112. package/dist/src/perf-facade.js +2 -2
  113. package/dist/src/perf-runtime-plan.js +1 -1
  114. package/dist/src/physical-device-control.js +1 -1
  115. package/dist/src/platform-request-scope.js +1 -1
  116. package/dist/src/platform-runtime-managed-owner.js +1 -1
  117. package/dist/src/platform-runtime-open-target.js +1 -1
  118. package/dist/src/platform-runtime-operation-host.js +2 -2
  119. package/dist/src/platform-runtime-runtime-hints.js +1 -1
  120. package/dist/src/platform-runtime-screen-recording-finalizer-host.js +1 -1
  121. package/dist/src/platform-runtime-unavailable.js +1 -1
  122. package/dist/src/platform-runtime.js +1 -1
  123. package/dist/src/platform-runtime2.js +1 -1
  124. package/dist/src/png-crop-bytes.js +1 -1
  125. package/dist/src/png-encode.js +1 -0
  126. package/dist/src/png-size.js +1 -0
  127. package/dist/src/png-worker-client.js +1 -1
  128. package/dist/src/provider-webdriver.js +1 -1
  129. package/dist/src/quality-warnings.js +1 -1
  130. package/dist/src/react-native.js +1 -1
  131. package/dist/src/record-runtime.js +1 -1
  132. package/dist/src/recording-export-quality.js +1 -1
  133. package/dist/src/recording-scope.js +1 -0
  134. package/dist/src/recording.js +3 -0
  135. package/dist/src/registry.js +35 -35
  136. package/dist/src/replay.js +1 -1
  137. package/dist/src/request-admission.js +1 -1
  138. package/dist/src/request-runtime-binding.js +1 -1
  139. package/dist/src/result-serialization.js +1 -1
  140. package/dist/src/runner-cache-metadata.js +2 -2
  141. package/dist/src/runner-client.js +1 -1
  142. package/dist/src/runner-contract.js +3 -0
  143. package/dist/src/runner-dev-tools-security.js +1 -0
  144. package/dist/src/runner-device-readiness.js +1 -0
  145. package/dist/src/runner-disposal.js +1 -1
  146. package/dist/src/runner-operations-facade.js +1 -1
  147. package/dist/src/runner-presentation.js +1 -1
  148. package/dist/src/runner.js +1 -1
  149. package/dist/src/runtime.js +2 -2
  150. package/dist/src/runtime10.js +2 -1
  151. package/dist/src/runtime2.js +4 -4
  152. package/dist/src/runtime4.js +5 -5
  153. package/dist/src/runtime5.js +1 -1
  154. package/dist/src/runtime6.js +1 -1
  155. package/dist/src/runtime7.js +1 -1
  156. package/dist/src/runtime8.js +1 -1
  157. package/dist/src/runtime9.js +1 -1
  158. package/dist/src/screen-recording-admission-ledger.js +1 -1
  159. package/dist/src/screen-recording-resource-recovery.js +1 -1
  160. package/dist/src/screen-recording-transport.js +1 -1
  161. package/dist/src/screenshot-density.js +1 -1
  162. package/dist/src/screenshot-image.js +1 -0
  163. package/dist/src/screenshot-overlay-draw.js +1 -0
  164. package/dist/src/screenshot-runtime.js +1 -1
  165. package/dist/src/script.js +1 -1
  166. package/dist/src/scroll-gesture.js +1 -1
  167. package/dist/src/sdk-batch.js +2 -2
  168. package/dist/src/sdk-contracts.d.ts +7 -5
  169. package/dist/src/sdk-contracts.js +2 -2
  170. package/dist/src/sdk-device.js +1 -1
  171. package/dist/src/sdk-finders.js +1 -1
  172. package/dist/src/sdk-selectors.d.ts +58 -6
  173. package/dist/src/sdk-selectors.js +1 -1
  174. package/dist/src/selection.js +0 -0
  175. package/dist/src/selector-runtime.js +1 -1
  176. package/dist/src/selectors.js +1 -1
  177. package/dist/src/semantic-index.js +1 -1
  178. package/dist/src/session-routing.js +1 -1
  179. package/dist/src/session-snapshot.js +1 -1
  180. package/dist/src/session-store.js +3 -3
  181. package/dist/src/session2.js +3 -3
  182. package/dist/src/simctl.js +1 -1
  183. package/dist/src/simulator-boot.js +1 -1
  184. package/dist/src/simulator-facade.js +1 -1
  185. package/dist/src/simulator.js +1 -1
  186. package/dist/src/snapshot-runtime-binding.js +1 -1
  187. package/dist/src/snapshot-runtime.js +1 -1
  188. package/dist/src/snapshot-state.js +1 -1
  189. package/dist/src/snapshot4.js +1 -1
  190. package/dist/src/src.js +1 -1
  191. package/dist/src/src7.js +1 -1
  192. package/dist/src/src8.js +1 -1
  193. package/dist/src/stop-sequence.js +1 -1
  194. package/dist/src/text-entry-focus.js +1 -1
  195. package/dist/src/touch-runtime.js +1 -1
  196. package/dist/src/tree.js +1 -1
  197. package/dist/src/type-text-runtime.js +1 -1
  198. package/dist/src/video.js +2 -2
  199. package/dist/src/web2.js +1 -1
  200. package/package.json +3 -1
  201. package/server.json +2 -2
  202. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.7.apk.sha256 +0 -1
  203. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.7.apk.sha256 +0 -1
  204. package/dist/src/png-transcode.js +0 -1
@@ -1,4 +1,4 @@
1
- import{D as e,L as t,O as n,k as r,o as i,t as a}from"./sdk-contracts.js";import{O as o,n as s,r as c}from"./sdk-batch-runner.js";import{_ as l,d as u,h as d,l as f,u as p,v as m,x as h,y as g}from"./sdk-device.js";import{A as _,B as v,Bt as y,Ct as b,F as x,G as S,I as C,J as w,K as ee,L as te,Mt as T,N as ne,P as re,R as E,St as D,U as ie,W as O,X as ae,Y as oe,Z as se,d as ce,f as le,ft as ue,ir as de,it as fe,j as pe,ot as me,pt as he,q as ge,rt as _e,tn as ve,v as ye,xt as be,z as xe}from"./sdk-batch.js";import{_ as Se,c as k,d as Ce,f as we,g as Te,h as Ee,l as De,m as Oe,p as ke,t as A,u as Ae}from"./session-store.js";import{D as je,F as Me,M as j,P as Ne,g as M,h as Pe,i as Fe,k as Ie,m as Le,n as Re,s as ze,v as Be}from"./session-snapshot.js";import{O as Ve,c as He,f as Ue,g as We,h as Ge,k as Ke,l as qe,m as Je,o as Ye,p as Xe,u as Ze}from"./parameterized-recorded-fill.js";import{n as N,t as Qe}from"./catalog.js";import{g as $e,i as et}from"./observability.js";import{i as P,n as tt,r as F}from"./success-text.js";import{t as nt}from"./app-inventory.js";import{r as rt,t as it}from"./device.js";import{a as at,r as I}from"./diagnostics.js";import{a as ot,i as st,r as ct}from"./verified-file.js";import{c as lt}from"./exec.js";import"./file.js";import"./diagnostics2.js";import"./command.js";import{i as ut}from"./replay-divergence.js";import{r as dt}from"./version.js";import{i as ft,r as pt}from"./session-artifact-paths.js";import{t as mt}from"./project-runtime.js";import{t as ht}from"./keyed-lock.js";import{n as gt,t as _t}from"./deploy-result-target.js";import{t as vt}from"./keyboard-actions.js";import{i as yt,r as bt}from"./request-cancel.js";import{t as xt}from"./request.js";import{i as St,s as Ct}from"./provider-session-ownership.js";import{A as wt,B as Tt,C as Et,E as Dt,F as Ot,G as kt,K as At,M as jt,O as Mt,P as Nt,S as Pt,_ as Ft,b as It,c as Lt,d as Rt,et as zt,f as Bt,g as Vt,h as Ht,k as Ut,l as Wt,m as Gt,n as Kt,p as qt,q as Jt,r as Yt,rt as Xt,s as Zt,t as Qt,tt as $t,u as L,v as en,w as tn,x as nn,y as rn}from"./device-claim-rule.js";import{i as an}from"./request-runtime-binding.js";import{c as on,i as sn,t as cn}from"./device-claim-inspection.js";import{t as ln}from"./audio-probe-result.js";import{T as un,_ as dn,a as fn,b as pn,c as mn,d as hn,f as gn,g as _n,h as vn,i as yn,l as bn,m as xn,n as Sn,o as Cn,r as wn,s as Tn,t as En,u as Dn,v as On,x as kn}from"./perf-runtime-plan.js";import{i as An,n as jn}from"./lease-context.js";import{h as Mn}from"./screenshot-runtime.js";import{n as R,r as Nn}from"./device-isolation.js";import{a as Pn,n as z,r as Fn}from"./device-inventory-context.js";import{n as In,r as Ln,t as Rn}from"./dispatch-resolve.js";import"./screen-recording-admission-ledger.js";import{a as zn,d as Bn,i as Vn,l as Hn,n as Un,o as Wn,s as Gn,u as Kn}from"./session-routing.js";import{a as qn,i as B,n as V,r as H,t as Jn}from"./session-runtime-admission.js";import{n as Yn,r as Xn}from"./device-selection-resolver.js";import{n as Zn,r as Qn}from"./doctor-output.js";import{t as $n}from"./record-runtime.js";import{n as er}from"./gesture-runtime.js";import{i as tr,n as nr,r as rr}from"./platform-runtime-open-target.js";import{t as ir}from"./snapshot-runtime.js";import{t as ar}from"./app-log-files.js";import U from"node:path";import W,{promises as or}from"node:fs";function sr(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 cr(e){let{internal:t,...n}=e;return{request:n,...t?.publicNetworkOnly?{publicNetworkOnly:!0}:{},...t?.resolvedSessionScope?{resolvedSessionScope:t.resolvedSessionScope}:{}}}function lr(e,t){let n=o({...e,...t});return Object.keys(n).length>0?n:void 0}function ur(e,t){return async({dispatch:n,...r})=>{let i=lr(t.internal,n);return await e(i?{...r,internal:i}:r)}}function dr(t){throw new e(`UNSUPPORTED_OPERATION`,`install_from_source ${String(t.kind)} sources require a compatible remote daemon`)}function fr(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:dr(n)}}function pr(e){let t=fr(e),n=e.meta?.uploadedArtifactId;return!n||t.kind!==`path`?{source:t,cleanup:()=>{}}:{source:{kind:`path`,path:Ct(n,e.meta?.tenantId)},cleanup:()=>{St(n)}}}function G(e,t,n){return t||At(n)?null:i(`INVALID_ARGS`,`${e} requires an active session or an explicit device selector (e.g. --platform ios).`)}function mr(e){return typeof e?.session==`string`&&e.session.trim().length>0}async function K(e){return Jt(e.flags)||!e.session?await In(e.flags??{},{androidAvdSelection:e.androidAvdSelection}):await hr(e.session.device)}async function hr(t){if(an(t)||!p(t)||t.kind!==`simulator`||process.platform!==`darwin`)return t;if((await Be.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 In(n)}catch(t){if(!(t instanceof e)||t.code!==`DEVICE_NOT_FOUND`)throw t}return await In({platform:`ios`,target:t.target,device:t.name,...t.simulatorSetPath?{iosSimulatorDeviceSet:t.simulatorSetPath}:{}})}function gr(e,t){return t?Hn(t,e).length===0:!1}async function _r(e){let{req:n,sessionName:r,sessionStore:i}=e,a=i.get(r),o,s,c;try{o=pr(n);let t=xr(n),l=await yr(a,n.flags),u=await H(e.inspectFacts)(l),d=B(`install_from_source`,u.operations.ensureReady)??B(`install_from_source`,u.operations.materializeAppSource)??B(`install_from_source`,u.operations.deployMaterializedApp);if(d)return d;let f=await V(e.bindDevice)(l,ae);await f.operations.ensureReady({}),s=await f.operations.materializeAppSource({source:o.source}),c=await Sr({artifact:s,retention:t,req:n,session:a,sessionName:r}),a&&j(a);let p=await f.operations.deployMaterializedApp({artifact:s}),m=Cr(l,s,p,c),h=P(m,`Installed: ${gt(m)}`);return k(i,a,n,`install_source`,h,{positionals:[]}),{ok:!0,data:h}}catch(e){return c&&await Mt(c.materializationId,n.meta?.tenantId).catch(()=>{}),{ok:!1,error:t(e)}}finally{await s?.cleanup(),o?.cleanup()}}async function vr(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 Mt(t,r.meta?.tenantId),{ok:!0,data:{released:!0,materializationId:t}}}catch(e){return{ok:!1,error:t(e)}}}async function yr(t,n){let r=br(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 K({session:t,flags:n})}function br(e){return e===`ios`||e===`android`?e:void 0}function xr(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 Sr(e){if(e.retention.enabled)return await wt({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 Cr(e,t,n,r){return p(e)?wr(t,n,r):Tr(t,n,r)}function wr(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{...Dr(r),bundleId:i,...Er(n,t),launchTarget:n.launchTarget??i}}function Tr(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{...Dr(r),packageName:i,...Er(n,t),launchTarget:n.launchTarget??i}}function Er(e,t){let n=e.appName??t.appName;return n?{appName:n}:{}}function Dr(e){return e?{...e.archivePath?{archivePath:e.archivePath}:{},installablePath:e.installablePath,materializationId:e.materializationId,materializationExpiresAt:e.expiresAt}:{}}async function Or(e){let{req:t,session:n,inspectFacts:r,bindDevice:a}=e,o=kr(t);if(!o.ok)return o.response;let s=G(`runtime port-reverse`,n,t.flags);if(s)return s;let c=await K({session:n,flags:t.flags}),l=await M({device:c,inspectFacts:r,bindDevice:a,command:`runtime port-reverse`,use:v});if(l.type===`response`)return l.response;if(l.runtime.owner.kind!==`provider-runtime`||l.runtime.owner.provider!==o.options.provider)return i(`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}}:i(`UNSUPPORTED_OPERATION`,`The selected provider device runtime does not support port reverse for this lease.`)}function kr(e){let t=Ar(e);if(!t.ok)return t;let n=jr(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 Ar(e){let t=e.flags?.leaseId,n=e.flags?.leaseProvider;return t?n?{ok:!0,leaseId:t,provider:n}:{ok:!1,response:i(`INVALID_ARGS`,`runtime port-reverse requires a lease provider.`)}:{ok:!1,response:i(`INVALID_ARGS`,`runtime port-reverse requires a resolved remote lease.`)}}function jr(e){let t=Mr(e.flags?.devicePort),n=Mr(e.flags?.hostPort??e.flags?.devicePort);return!t||!n?{ok:!1,response:i(`INVALID_ARGS`,`runtime port-reverse requires numeric devicePort and hostPort values from 1 to 65535.`)}:{ok:!0,devicePort:t,hostPort:n}}function Mr(e){if(!(typeof e!=`number`||!Number.isInteger(e)||e<1||e>65535))return e}async function Nr(e){return await M({...e,command:`runtime clear`,use:te})}async function Pr(e){let{req:t,sessionName:n,sessionStore:r}=e,a=(t.positionals?.[0]??`show`).toLowerCase();if(a===`port-reverse`)return await Or({req:t,session:r.get(n),inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(a===`gesture-viewport`)return await Fr({...e,session:r.get(n)});if(!Ir(a))return i(`INVALID_ARGS`,`runtime requires set, show, clear, port-reverse, or gesture-viewport`);let o=r.get(n),s=r.getRuntimeHints(n);return a===`clear`?await Lr({sessionName:n,sessionStore:r,session:o,current:s,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice}):a===`show`?Rr(n,s):Br({req:t,sessionName:n,sessionStore:r,session:o,current:s})}async function Fr(e){if(!e.session)return i(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let t=await er({device:e.session.device,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(!t.ok)return t.response;let n=Ie(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 Ir(e){return e===`set`||e===`show`||e===`clear`}async function Lr(e){let{sessionName:t,sessionStore:n,session:r,current:i,inspectFacts:a,bindDevice:o}=e;if(L(i)&&r?.appBundleId){let e=await Nr({device:r.device,inspectFacts:a,bindDevice:o});if(e.type===`response`)return e.response;j(r),await e.runtime.operations.clearRuntimeHints({appId:r.appBundleId,values:Gt(i)})}return{ok:!0,data:{session:t,cleared:n.clearRuntimeHints(t)}}}function Rr(e,t){return{ok:!0,data:{session:e,configured:!!t,runtime:t}}}function zr(e){return e?g(e.device):void 0}function Br(e){let{req:t,sessionName:n,sessionStore:r,session:a,current:o}=e,s=zr(a),c=Ft(t.flags?.platform??o?.platform??s);if(!c)return i(`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 i(`INVALID_ARGS`,`runtime set targets ${c}, but session "${n}" is already bound to ${s}.`);let l=Bt(o,Lt(t.flags,c));return Wt(l)===0?i(`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 Vr=/^[A-Za-z0-9_.:-]{1,64}$/,Hr=8192,Ur=4096;function Wr(t){let n=t[0]?.trim(),r=t[1]?.trim();if(!n)throw new e(`INVALID_ARGS`,`trigger-app-event requires <event> [payloadJson]`);if(!Vr.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:Kr(r,n)}}function Gr(t,n,r){let i=g(t),a=qr(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>Ur)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:Ur});return s}function Kr(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`)>Hr)throw new e(`INVALID_ARGS`,`trigger-app-event payload for "${n}" exceeds ${Hr} bytes`);return r}catch(n){throw n instanceof e?n:new e(`INVALID_ARGS`,`Invalid trigger-app-event payload JSON: ${t}`)}}function qr(e){return((p(e)?process.env.AGENT_DEVICE_IOS_APP_EVENT_URL_TEMPLATE:u(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 Jr(e,t,n,r){let{eventName:i,payload:a}=Wr([...r]),o=Gr(t,i,a),s={eventUrl:o,...n.appBundleId===void 0?{}:{options:{appBundleId:n.appBundleId}},execution:Le(n)};return await e.operations.triggerAppEvent(s),{event:i,eventUrl:o,transport:`deep-link`,...F(`Triggered app event: ${i}`)}}async function Yr(e){let{device:t,positionals:n,inspectFacts:r,bindDevice:i,readiness:a}=e,o=await M({command:`trigger-app-event`,device:t,use:_e,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=>Jr(s,t,e,n)}}function Xr(t){let n=(t[0]??`status`).toLowerCase();if(!vt(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 Zr(n)}function Zr(e){return e===`get`?`status`:e===`return`?`enter`:e}const Qr={"ime-probe":`android`},$r={"ime-probe":`android`,mechanism:`ios`,acknowledged:`harmonyos`},ei={"visibility-echo":`ios`,"android-acknowledged":`android`,"harmonyos-acknowledged":`harmonyos`};function ti(e){return{...e.appBundleId===void 0?{}:{options:{appBundleId:e.appBundleId}},execution:Le(e)}}async function ni(e,t){let n=await M(e);if(n.type===`response`)return{ok:!1,response:n.response};let r=n.runtime;return{ok:!0,execute:e=>t(r,e)}}function ri(e,t){return e.operations.keyboardStatus(ti(t)).then(e=>({platform:Qr[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 ii(e,t){let n=await e.operations.keyboardDismiss(ti(t)),r=$r[n.kind];return n.kind===`mechanism`?{platform:r,action:`dismiss`,wasVisible:n.wasVisible,dismissed:n.dismissed,visible:n.visible,mechanism:n.mechanism,...F(si(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 ai(e,t){let n=await e.operations.keyboardEnter(ti(t)),r=ei[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 oi(e){let t=Xr(e.positionals),{device:n,inspectFacts:r,bindDevice:i,readiness:a}=e;return t===`status`?await ni({command:`keyboard status`,device:n,use:b,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>ri(e,t)):t===`dismiss`?await ni({command:`keyboard dismiss`,device:n,use:be,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>ii(e,t)):await ni({command:`keyboard enter`,device:n,use:D,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>ai(e,t))}function si(e,t){return e?t===`dismissKey`?`Keyboard dismissed via its dismiss key`:`Keyboard dismissed`:`Keyboard already hidden`}async function ci(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=G(i,l,u);if(d)return d;let f=await K({session:l,flags:u}),p=await c(f,l);if(!p.ok)return p.response;l&&Mn(t)===`may-invalidate`&&j(l);let m=await p.execute();if(l){let e=s?await s(l,m,f):l;k(r,e,t,i,m??{},{positionals:o??a}),e!==l&&r.set(n,e)}return{ok:!0,data:m??{}}}function li(e,t,n){if(!(e||t!==`dismiss`&&t!==`enter`&&t!==`return`||n?.platform!==`ios`))return i(`SESSION_NOT_FOUND`,`iOS keyboard action requires an active session so the target app stays foregrounded. Run open first.`)}async function ui(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,inspectFacts:a,bindDevice:o}=e,s=t.positionals??[];return await ci({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:{},inspectFacts:a,bindDevice:o});if(!c.ok)return{ok:!1,response:c.response};let l={...Ie(r,t.flags,i?.appBundleId,i?.trace?.outPath),surface:i?.surface};return{ok:!0,execute:()=>c.execute(l)}}})}async function di(e){return li(e.sessionStore.get(e.sessionName),e.req.positionals?.[0]?.trim().toLowerCase(),e.req.flags??{})||await ui({...e,command:N.keyboard,resolveRuntime:e=>oi(e)})}async function fi(e){return await ui({...e,command:N.triggerAppEvent,resolveRuntime:e=>Yr(e),deriveNextSession:async(e,t)=>{let n=typeof t?.eventUrl==`string`?t.eventUrl:void 0,r=n?await rr(e.device,n,e.appBundleId)??e.appBundleId:e.appBundleId;return{...e,appBundleId:r}}})}function pi(e){let t=e.trim();return t.startsWith(`{`)&&t.endsWith(`}`)||t.startsWith(`[`)&&t.endsWith(`]`)}function mi(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(!W.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(pi(i))return{kind:`inline`,text:i};throw new e(`INVALID_ARGS`,`${r} file not found: ${a}`)}async function hi(t){let n=mi(t,{subject:`Push payload`}),r=n.kind===`inline`?n.text:await gi(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 gi(t){try{return await or.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 _i(e){let{req:t,command:n,sessionName:r,sessionStore:a}=e,o=a.get(r),s=t.flags??{},c=G(n,o,s);if(c)return c;let l=Ci(n,t.positionals??[]);if(!l.ok)return l.response;let u=t.meta?.uploadedArtifactId;try{let c=u?Ct(u,t.meta?.tenantId):A.expandHome(l.appPathInput);if(!W.existsSync(c))return i(`INVALID_ARGS`,`App binary not found: ${c}`);let d=await K({session:o,flags:s}),f=await H(e.inspectFacts)(d),p=B(n,f.operations.deployApp);if(p)return p;let m=await V(e.bindDevice)(d,oe);o&&j(o);let h=await m.operations.deployApp({app:l.app,appPath:c,replaceExisting:n===`reinstall`}),g=yi(d,l.app,c,h),_=P(g,`Installed: ${g.appName??_t(g)}`),v=Si(o,g);return v&&v!==o&&a.set(r,v),k(a,v,t,n,_),{ok:!0,data:_}}finally{u&&St(u)}}async function vi(e){let{req:t,sessionName:n,sessionStore:r}=e,a=r.get(n),o=t.flags??{},s=G(`push`,a,o);if(s)return s;let c=t.positionals?.[0]?.trim(),l=t.positionals?.[1]?.trim();if(!c||!l)return i(`INVALID_ARGS`,`push requires <bundle|package> <payload.json|inline-json>`);let u=await hi(wi(l,t.meta?.cwd)),d=await K({session:a,flags:o}),f=await H(e.inspectFacts)(d),m=B(`push`,f.operations.ensureReady)??B(`push`,f.operations.sendPushNotification);if(m)return m;let h=await V(e.bindDevice)(d,se);await h.operations.ensureReady({}),a&&j(a);let _=await h.operations.sendPushNotification({appId:c,payload:u}),v=p(d)?P({platform:`ios`,bundleId:c},`Pushed notification to ${c}`):P({platform:g(d),package:c,action:_.action,extrasCount:_.extrasCount},`Pushed notification to ${c}`);return k(r,a,t,`push`,v,{positionals:[c,l]}),{ok:!0,data:v}}function yi(e,t,n,r){return p(e)?bi(t,n,r):xi(e,t,n,r)}function bi(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 xi(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 Si(e,t){return!e||t.platform!==`harmonyos`||!t.appId?e:{...e,appBundleId:t.appId,appName:t.appName??t.app}}function Ci(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:i(`INVALID_ARGS`,`install requires: install <path-to-app-binary>`)}}return!n||!r?{ok:!1,response:i(`INVALID_ARGS`,`reinstall requires: reinstall <app> <path-to-app-binary>`)}:{ok:!0,app:n,appPathInput:r}}function wi(e,t){let n=mi(e,{subject:`Push payload`,cwd:t,expandPath:(e,t)=>A.expandHome(e,t)});return n.kind===`file`?n.path:n.text}async function q(e){let{req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}=e;return t.command===`install`||t.command===`reinstall`?await _i({req:t,command:t.command,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):t.command===`install_source`?await _r({req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):t.command===`push`?await vi({req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):null}async function Ti(e,t,n){return await s(e,t,async(e,t)=>{let r=e;return await n({...r,internal:{...r.internal,executionPlan:{remainingSteps:t.remainingSteps}}})})}const Ei=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.readTextAtPoint.resolveOpenTarget.screenRecordingCleanup.screenRecordingReattach.screenRecordingStart.scrollDirection.sendPushNotification.setOrientation.setSetting.setViewport.shutdownTarget.tapElementSelector.tapPoint.tapRef.triggerAppEvent.tvRemote.typeText.writeClipboard`.split(`.`));function Di(e){return Ei.has(e)}const Oi=new Map(ce.map(e=>[e.name,e]));function ki(e){let t=new Set;for(let n of e){let e=Ai(n);if(e===void 0)return;for(let n of e)t.add(n)}return Object.freeze([...t].sort())}function Ai(e){let t=Oi.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(Di)?n:void 0}function ji(e){if(e!==void 0&&e.remainingSteps.length!==0)return ki(e.remainingSteps)}function Mi(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:An(e),plannedOperations:ji(e.internal?.executionPlan)}}function Ni(e,t,n){e.recordAction(t,{command:`close`,positionals:n.positionals??[],flags:n.flags??{},result:{session:t.name,...F(`Closed: ${t.name}`)}})}function Pi(e,t,n){if(!we(t))return{kind:`not-armed`};let r=t.actions.length;Ni(e,t,n);let i=Ue(t),a=e.writeSessionLog(t,{force:qe(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`}:(De(t),{kind:`aborted`})}function Fi(e,n){let r=t(n),i=Ke(e.scriptPublication??We);return{ok:!1,error:{...r,details:{...r.details,session:e.name,...i?{savedScript:i}:{}},retriable:!0}}}function Ii(e){let{req:t,session:n,sessionStore:r,platformCloseError:i}=e;i||Ni(r,n,t);try{let e=r.writeSessionLog(n,{force:qe(n,t.flags?.force)});e.written&&Je(n,e.path);return}catch(e){return Li(e)}}function Li(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 Ri(e){let t=e.clearRuntimeHints?xe:E,n=await Pe({...e,command:`close`,required:t.required});if(n.type===`response`)return n;if(!e.clearRuntimeHints)return{type:`runtime`,runtime:await n.bind(e.device,E)};let r=await n.bind(e.device,xe);return{type:`runtime`,runtime:r,clearRuntimeHints:r.operations.clearRuntimeHints}}async function zi(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 Bi({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:Gt(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`,()=>Ut(r)),{platformCloseError:h,saveScriptError:_,shutdownResult:g?.shutdown}}async function Bi(e,t,n,r){let{address:i,session:a}=e;await n(`recording`,()=>It({session:a,sessionName:i,sessionStore:t})),await n(`app_log`,()=>Pt({session:a,sessionName:i,sessionStore:t})),await n(`audio_probe`,()=>rn({session:a,sessionName:i,sessionStore:t})),await n(`perf_capture`,()=>Et({session:a,sessionName:i,sessionStore:t})),await n(`platform_snapshot_helper`,()=>tn(a,r))}function Vi(e,t){return nn({sessionName:e,phase:`session_close_cleanup_failed`,failures:t})}function Hi(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 Ui=(e,t)=>(e.positionals?.length??0)>0||Dt(t);async function Wi(e){let{req:t,session:n,logPath:r,sessionStore:i,lifecycle:a}=e,o=we(n),s=JSON.stringify(t.positionals??[]);if(o&&!Ce(n,s)){let e=await Ki({req:t,session:n,logPath:r,lifecycle:a});if(e)return{response:Fi(n,Hi(e))};Ee(n,s)}let c=Pi(i,n,t);return c.kind===`failed`?{response:Fi(n,c.error)}:{repairArmed:o,...c.kind===`committed`&&c.path?{healedScriptPath:c.path}:{},...c.kind===`aborted`?{aborted:!0}:{}}}async function Gi(e){try{return{providerData:await zt(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 Ki(e){let{req:t,session:n,logPath:r,lifecycle:i}=e;if(Ui(t,n))try{await i.operations.closeApplication({positionals:t.positionals??[],outPath:t.flags?.out,appBundleId:n.appBundleId,surface:n.surface??`app`,execution:Mi(t,r,n.trace?.outPath)});return}catch(e){return e}}function qi(t,n){if(!t.flags?.saveScript||Ze(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 Ji(t){let{req:n,sessionName:r,logPath:a,sessionStore:o,leaseRegistry:s,leaseLifecycleProvider:c}=t,l=o.get(r);if(!l)return await Qi({req:n,logPath:a,inspectFacts:t.inspectFacts,bindDevice:t.bindDevice});qi(n,l);let u=n.positionals?.[0];if(n.internal?.closeAppOnly===!0&&!u)return i(`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 Ri({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(j(l),n.internal?.closeAppOnly===!0&&u)return await Zi({req:n,session:l,logPath:a,lifecycle:f.runtime,app:u});let p=await Wi({req:n,session:l,logPath:a,sessionStore:o,lifecycle:f.runtime});if(`response`in p)return p.response;let m=await Yi({req:n,session:l,sessionName:r,logPath:a,sessionStore:o,leaseRegistry:s,leaseLifecycleProvider:c,lifecycle:f.runtime,clearRuntimeHints:f.clearRuntimeHints,repairArmed:p.repairArmed,platformResourceCleanup:d});return m.kind===`response`?m.response:Xi({session:l,repair:p,requestedSaveScript:!!n.flags?.saveScript,shutdownResult:m.shutdownResult,providerData:m.providerData})}async function Yi(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 zi({req:t,session:n,sessionName:r,logPath:i,sessionStore:a,lifecycle:c,clearRuntimeHints:l,cleanupFailures:u,repairArmed:e.repairArmed,dispatchTargetedPlatformClose:Ki,finalizeOrdinaryCloseScript:Ii,platformResourceCleanup:e.platformResourceCleanup}),m=await Gi({session:n,leaseRegistry:o,leaseLifecycleProvider:s});if(m.response)return{kind:`response`,response:m.response};let h=Vi(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 pn(n.deviceClaim),a.delete(r),g)throw g;if(f)throw f;return{kind:`closed`,providerData:m.providerData,shutdownResult:p}}function Xi(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 Zi(e){let{req:t,session:n,logPath:r,lifecycle:i,app:a}=e,o=await Ki({req:t,session:n,logPath:r,lifecycle:i});if(o)throw o;return{ok:!0,data:{app:a,...F(`Closed: ${a}`)}}}async function Qi(e){let{req:t,logPath:n,inspectFacts:r,bindDevice:a}=e;if(!t.positionals||t.positionals.length===0)return i(`SESSION_NOT_FOUND`,`No active session`);let o=await Ri({device:await K({session:void 0,flags:t.flags}),clearRuntimeHints:!1,inspectFacts:r,bindDevice:a});return o.type===`response`?o.response:(await o.runtime.operations.closeApplication({positionals:t.positionals,outPath:t.flags?.out,surface:`app`,ensureReady:!0,execution:Mi(t,n)}),{ok:!0,data:{app:t.positionals[0],...F(`Closed: ${t.positionals[0]}`)}})}function $i(e,t){return e.operations.ensureReady(t)}function ea(e,t,n){return e.operations.listApps({device:t,filter:n})}async function ta(e){let{req:t,sessionName:n,sessionStore:r}=e;switch(t.command){case`session_list`:return na(t,r);case`devices`:return await ia(t);case`capabilities`:return await fa({req:t,sessionName:n,sessionStore:r,inspectFacts:e.inspectFacts});case`apps`:return await va({req:t,sessionName:n,sessionStore:r,bindDevice:e.bindDevice,inspectFacts:e.inspectFacts,providerAppCatalog:e.providerAppCatalog});default:return null}}function na(e,t){let n=zn(e);return{ok:!0,data:{sessions:t.listRefs().filter(e=>Wn(e.session,n)).map(e=>ra(e,t))}}}function ra({address:e,session:t},n){let r=n.resolveSessionDir(e);return{name:t.name,address:e,sessionStateDir:r,runnerLogPath:ft(r),platform:g(t.device),...f(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,...f(t.device.platform)&&!u(t.device)&&{device_udid:t.device.id,ios_simulator_device_set:t.device.simulatorSetPath??null}}}async function ia(e){try{let t=aa();return{ok:!0,data:{devices:(await sa(e)).map(e=>({...Ta(e),...oa(e,t)}))}}}catch(e){let t=n(e);return{ok:!1,error:{code:t.code,message:t.message,...t.details?{details:t.details}:{}}}}}function aa(){let e=new Map;for(let t of sn({})){let n=t.claim;!n||cn(t.classification)||e.set(n.deviceKey,{session:n.session,workspace:n.workspace})}return e}function oa(e,t){let n=t.get(on(kn(e)));return n?{claimedBy:n}:{}}async function sa(e){let t=e.flags?.platform;return da(await z(ca(e,t)),e.flags?.platform,e.flags?.target)}function ca(e,t){let n=e.flags;return{platform:t,target:n?.target,deviceName:n?.device,udid:n?.udid,serial:n?.serial,iosSimulatorSetPath:la(n?.iosSimulatorDeviceSet,t,n?.target),androidSerialAllowlist:ua(n?.androidDeviceAllowlist)}}function la(e,t,n){return h({simulatorSetPath:Nn(e),platform:t,target:n})}function ua(e){let t=R(e);return t?Array.from(t).sort():void 0}function da(e,t,n){let r=t?e.filter(e=>Ea(e,t)):e;return n?r.filter(e=>(e.target??`mobile`)===n):r}async function fa(e){let t=await wa({...e,androidAvdSelection:`include-stopped`});if(`response`in t)return t.response;let{device:n}=t,r=pa(n,e.sessionStore.get(e.sessionName),e.req.flags),i=await xa(n,e.inspectFacts);return{ok:!0,data:{device:Ta(n),availableCommands:ye().filter(e=>e===`appstate`&&r?!0:ga(e,i))}}}function pa(e,t,n){return!t||!p(e)&&!u(e)||!gr(n,t)?!1:ma(t)||ha(e,t)}function ma(e){return!!(e.appName||e.appBundleId)}function ha(e,t){return!!(u(e)&&t.surface!==void 0&&t.surface!==`app`&&t.surface!==`frontmost-app`)}function ga(e,t){let n=le(e);return!n||!t?!1:n.some(e=>e.length>0&&e.every(e=>_a(t,e)))}function _a(e,t){return Object.hasOwn(e.operations,t)?e.operations[t]?.available===!0:!1}async function va(e){let{req:t,sessionName:n,sessionStore:r,bindDevice:i,inspectFacts:a}=e,o=await ya(t,e.providerAppCatalog);if(o)return o;let s=await wa({req:t,sessionName:n,sessionStore:r,androidAvdSelection:`include-stopped`});if(`response`in s)return s.response;let{device:c}=s,l=nt(t.flags?.appsFilter),u=R(t.flags?.androidDeviceAllowlist),d=await Sa({device:c,inspectFacts:a,bindDevice:i});if(`response`in d)return d.response;let f=d.runtime;return Ca(await ea(f,await $i(f,{serial:t.flags?.serial,androidSerialAllowlist:u?[...u].sort():void 0}),l))}async function ya(e,t){let n=ba(e);if(!(!t||!n||!t.supports(n.provider)))return{ok:!0,data:{apps:[...await t.list(n,bt(e.meta?.requestId))]}}}function ba(e){let t=jn(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 xa(e,t){if(t)try{return await t(e)}catch{return}}async function Sa(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,me)}}function Ca(e){return{ok:!0,data:{apps:e.map(e=>e.name&&e.name!==e.id?`${e.name} (${e.id})`:e.id)}}}async function wa(e){let{req:t,sessionName:n,sessionStore:r,androidAvdSelection:i}=e,a=r.get(n),o=t.flags??{},s=G(t.command,a,o);return s?{response:s}:{device:await K({session:a,flags:o,androidAvdSelection:i})}}function Ta({simulatorSetPath:e,iosPhysicalDeviceBackend:t,appleOs:n,...r}){return{...r,platform:g({platform:r.platform,appleOs:n}),...f(r.platform)&&n?{appleOs:n}:{}}}function Ea(e,t){return m(e,t)}function J(e){return i(`INVALID_ARGS`,e)}function Da(t,n,r,a){try{return nr({device:t,surfaceFlag:n,openTarget:r,existingSurface:a})}catch(t){return i(t instanceof e?t.code:`INVALID_ARGS`,String(t.message))}}async function Oa(e){let{shouldRelaunch:t,openTarget:n,surface:r,device:i}=e;if(!t)return null;let a=await tr({target:n,platform:i.platform,surface:r});return a?J(a):null}async function ka(e){let{shouldRelaunch:t,openTarget:n,platform:r}=e;if(!t)return null;let i=await tr({target:n,platform:r});return i?J(i):null}function Aa(e){let t=en(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:Vt({replacedStoredRuntime:i,previousRuntime:r,runtime:n,session:e.existingSession})}}}async function ja(t){let{req:n,logPath:r,surface:i,openTarget:a,existingSession:o,runtime:s,runtimeHintPlan:l,clearRuntimeHints:u,foreground:d}=t;await s.operations.prepareApplicationOpen({target:a,currentAppBundleId:o?.appBundleId,hasExistingSession:o!==void 0,surface:i,deviceHub:n.flags?.deviceHub===!0,prewarmRunnerOnColdBoot:i===`app`&&!!a&&!c(a??``),execution:{startupDeadlineAtMs:Na(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:An(n)}});let{appBundleId:f,appName:p}=await Ma({runtime:s,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 Rt({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 Ma(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 Na(e){let t=e.flags?.timeoutMs;return typeof t==`number`&&Number.isFinite(t)&&t>0?Date.now()+t:void 0}async function Pa(e){let{req:t,hasExistingSession:n}=e;return t.flags?.foreground===!0?t.positionals?.[0]?{type:`resolved`,req:t}:n?{type:`response`,response:i(`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:i(`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:i(`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 Fa(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 ir({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}}:Ia(o.data,t.error)}catch(e){return Ia(o.data,t(e))}}function Ia(e,t){return{ok:!0,data:{...e,warnings:[...tt(e),`The session is open, but the initial interactive snapshot failed (${t.code}: ${t.message}). Run: agent-device snapshot -i`],initialSnapshotError:t}}}function La(e){let{sessionName:t,sessionStateDir:n,runnerLogPath:r,requestLogPath:i,eventLogPath:a,appName:o,appBundleId:s,surface:c,startup:l,timing:u,device:f,runtime:m,runtimeHintCount:h,sessionReused:_,selection:v}=e,y={session:t,surface:c,sessionStateDir:n,runnerLogPath:r,requestLogPath:i,eventLogPath:a,sessionReused:_,...Ra(v)};return o&&(y.appName=o),s&&(y.appBundleId=s),l&&(y.startup=l),u&&(y.timing=u),m&&h(m)>0&&(y.runtime=m),f&&(y.platform=g(f),y.target=f.target??`mobile`,y.device=f.name,y.id=f.id,y.kind=f.kind,d(f.platform)&&(y.serial=f.id)),f&&p(f)&&(y.device_udid=f.id,y.ios_simulator_device_set=f.simulatorSetPath??null),{...y,...F(`Opened: ${o??s??t}`)}}function Ra(e){if(!e)return{};let{device:t,...n}=e;return{selection:n}}function za(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 Ba=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 Va(e,t){e.warnings=[...tt(e),t]}function Ha(e){return e.internal?.resolvedSessionScope??zn(e)}function Ua(e){let{session:t,existingSession:n,saveScriptRequested:r,responseData:i}=e;if(!n&&r){He(t,{});return}Ze(n)&&(Ye(t),Va(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 Wa(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 Ga(e,t){if(e.platform!==`android`)return!1;let n=t.flags?.testIme;return n===void 0?e.kind===`emulator`:n}function Ka(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 qa(e,t){if(!t)return;let n=await un(t);if(n.status!==`renewed`)return n.conflict?Yt(e,n.conflict):i(`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 Ja(e){let{req:t,sessionName:n,sessionStore:a,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,S=Date.now(),C=await Ya({req:t,sessionName:n,sessionStore:a,device:s,surface:d,sessionAppBundleId:x,appName:u,existingSession:g});if(C.type===`response`)return C.response;let w=C.session??g,ee=Date.now(),te=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:Ga(s,t),stateDir:a.resolveDaemonStateDir(),runtimeHints:Gt(p),applyRuntimeHints:h,execution:Mi(t,o,g?.trace?.outPath)});x=te.appBundleId??x;let T={...te.timing},ne=Yn(y),re=c?Ka(ee,c,x):void 0;if(yt(t.meta?.requestId)){let e=r();return i(e.code,e.message,e.details)}g&&je({session:g,command:`open`,positionals:[],flags:void 0});let E=za({existingSession:w,sessionName:g?.name??Vn(t),sessionScope:g?.sessionScope??Ha(t),device:s,surface:d,appBundleId:x,appName:u});E.lease=$t({req:t,existingLease:g?.lease}),_&&(E.deviceClaim=_),t.runtime!==void 0&&Ht(a,n,p);let D=a.ensureSessionDir(n),ie=pt(D,t.meta?.requestId??at().requestId);T.totalDurationMs=Math.max(0,Date.now()-S),I({level:`info`,phase:`open_timing`,durationMs:T.totalDurationMs,data:T});let O=La({sessionName:E.name,sessionStateDir:D,runnerLogPath:ft(D),requestLogPath:ie,eventLogPath:a.resolveEventLogPath(n),appName:u,appBundleId:x,surface:d,startup:re,timing:T,device:s,runtime:p,runtimeHintCount:Wt,sessionReused:g!==void 0,selection:ne});return v&&Va(O,Wa(v)),Ua({session:E,existingSession:g,saveScriptRequested:!!t.flags?.saveScript,responseData:O}),a.set(n,E),a.recordAction(E,{command:`open`,positionals:l,flags:t.flags??{},runtime:t.runtime===void 0?void 0:p,result:O}),{ok:!0,data:O}}async function Ya(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=Xa(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 Xa(e){let{req:t,device:n,surface:r,sessionAppBundleId:i,appName:a,existingSession:o}=e,s=za({existingSession:o,sessionName:o?.name??Vn(t),sessionScope:o?.sessionScope??Ha(t),device:n,surface:r,appBundleId:i,appName:a});return s.lease=$t({req:t,existingLease:o?.lease}),s}function Za(e){let{req:t,device:n,sessionStore:r}=e,i=r.findByDevice(n.id);if(!i)return;let a=jt(t);return Un(t,i.session)?Bn(i,n,a):Kn(i,n,a)}async function Qa(e){let{req:t,device:n,owner:r,sessionName:i,sessionStore:a,reconcileOrphanedDeviceClaim:o}=e;switch(Qt(r)){case`none`:return{status:`not-required`};case`allocator-held`:{let e=Kt(n,r,Zt({device:n,owner:r,stateDir:a.resolveDaemonStateDir(),intent:{kind:`ordinary`}}));return e?{status:`refused`,response:e}:{status:`not-required`}}case`ordinary`:return await On({device:n,session:i,workspace:t.meta?.cwd??process.cwd(),stateDir:a.resolveDaemonStateDir(),reconcileOrphanedDeviceClaim:o,observeDeviceBoot:Ba})}}async function $a(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=Za({req:t,device:a,sessionStore:i});if(m)return m;let h=await Qa({req:t,device:a,owner:c.owner,sessionName:n,sessionStore:i,reconcileOrphanedDeviceClaim:f});if(h.status===`conflict`)return Yt(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 eo({ownership:g,effects:v,sessionName:n,sessionStore:i});try{let e=await ja({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 qa(a,g);if(f)return f;v.mayHaveStarted=!0;let m=t.positionals??[],h=s??e.details.appBundleId,b=await Ja({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 eo(e){let{ownership:t,effects:n,sessionName:r,sessionStore:i}=e;if(!t)return;if(!n.mayHaveStarted){await pn(t);return}if(i.get(r)?.deviceClaim?.ownerToken===t.ownerToken)return;let a=await dn(t);I({level:`warn`,phase:`device_claim_open_effects_unconfirmed`,data:{deviceKey:t.deviceKey,outcome:a}})}const to=new Map;async function no(e){let t=w({applyRuntimeHints:e.runtimeHintPlan.applyRuntimeHints,clearRemovedRuntimeHints:e.runtimeHintPlan.clearRemovedRuntimeHints}),n=await Pe({...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,ie)};case`open-apply-runtime-hints`:{let t=await r(e.device,S);return{type:`runtime`,runtime:t,applyRuntimeHints:t.operations.applyRuntimeHints}}case`open-clear-runtime-hints`:{let t=await r(e.device,ee);return{type:`runtime`,runtime:t,clearRuntimeHints:t.operations.clearRuntimeHints}}case`open-apply-and-clear-runtime-hints`:{let t=await r(e.device,O);return{type:`runtime`,runtime:t,applyRuntimeHints:t.operations.applyRuntimeHints,clearRuntimeHints:t.operations.clearRuntimeHints}}}}async function ro(e){let t=Aa(e);if(t.type===`response`)return t;let n=await no({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 io(e){let{sessionName:t,logPath:n,sessionStore:r}=e,a=r.get(t),o=await Pa({req:e.req,hasExistingSession:!!a});if(o.type===`response`)return o.response;let s=o.type===`resolved`?o.req:e.req;if(a){if(s.flags?.saveScript)return i(`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?a.appName:void 0),u=Da(a.device,s.flags?.surface,l,a.surface);if(typeof u!=`string`)return u;if(!l&&u===`app`)return J(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 Oa({shouldRelaunch:o,openTarget:l,surface:u,device:a.device});if(d)return d;let f=await qa(a.device,a.deviceClaim);if(f)return f;let p=await hr(a.device),m=Xn(p);await s.internal?.retainDeviceExecutionLock?.(p.id);let h=await ro({req:s,sessionStore:r,sessionName:t,device:p,existingSession:a,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(h.type===`response`)return h.response;let{admission:g,runtimeHintPlan:_}=h;j(a);let v=await ja({req:s,logPath:n,surface:u,openTarget:l,existingSession:a,runtime:g.runtime,runtimeHintPlan:_,clearRuntimeHints:g.clearRuntimeHints,foreground:!1});return v.type===`response`?v.response:await qa(p,a.deviceClaim)||await Ja({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:a,selection:m})}let c=s.flags?.relaunch===!0,l=s.positionals?.[0];if(c&&!l)return J(`open --relaunch requires an app argument.`);let u=await ka({shouldRelaunch:c,openTarget:l,platform:s.flags?.platform===`android`?`android`:void 0});if(u)return u;let d=await Ln(s.flags??{},kt(l)),f=d.device;await s.internal?.retainDeviceExecutionLock?.(f.id);let p=Da(f,s.flags?.surface,l);if(typeof p!=`string`)return p;let m=await Oa({shouldRelaunch:c,openTarget:l,surface:p,device:f});if(m)return m;let h=await ro({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 ht(to,f.id,async()=>await $a({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 ao(e){let t=await io(e);return!t.ok||e.req.flags?.foreground!==!0?t:await Fa({...e,inspectFacts:H(e.inspectFacts),bindDevice:V(e.bindDevice),openResponse:t})}const oo=`iOS appstate requires an active session on the target device. Run open first (for example: open --session sim --platform ios --device "<name>" <app>).`,so=`macOS appstate requires an active session on the target device. Run open first (for example: open --session macos --platform macos "System Settings").`;function co(e){return t=>i(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 lo(t){if(t)return t;throw new e(`COMMAND_FAILED`,`Device runtime facts inspection is unavailable.`,{reason:`runtime-gateway-missing`})}function uo(t){if(t)return t;throw new e(`COMMAND_FAILED`,`Device runtime binding is unavailable.`,{reason:`runtime-gateway-missing`})}function fo(e){return e.available?null:i(`UNSUPPORTED_OPERATION`,`shutdown is supported only for Apple simulators and Android emulators.`,void 0,e.hint?{hint:e.hint}:void 0)}function po(e,t){return!!(e?.trim()||t?.platform===`android`&&t.kind===`emulator`)}async function mo(e){let{req:t,sessionName:n,sessionStore:r}=e,a=r.get(n),o=t.flags??{},s=o.platform;if(!a&&mr(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 i(`SESSION_NOT_FOUND`,e)}let c=G(`appstate`,a,o);if(c)return c;let l=f(a?.device.platform)&&gr(o,a),d=s===`ios`,m=s===`macos`;if(d&&!l)return i(`SESSION_NOT_FOUND`,oo);if(m&&!l)return i(`SESSION_NOT_FOUND`,so);if(l&&a){let e=a.appName??a.appBundleId;if(!a.appName&&!a.appBundleId){if(u(a.device)&&a.surface&&a.surface!==`app`&&a.surface!==`frontmost-app`)return{ok:!0,data:{platform:g(a.device),appName:a.surface,appBundleId:a.appBundleId,source:`session`,surface:a.surface}};let e=u(a.device)?`macOS`:`iOS`;return i(`COMMAND_FAILED`,`No foreground app is tracked for this ${e} session. Open an app in the session, then retry appstate.`)}return{ok:!0,data:{platform:g(a.device),appName:e??`unknown`,appBundleId:a.appBundleId,source:`session`,surface:a.surface??`app`,...p(a.device)?{device_udid:a.device.id,ios_simulator_device_set:a.device.simulatorSetPath??null}:{}}}}let h=await K({session:a,flags:o});if(p(h))return i(`SESSION_NOT_FOUND`,oo);if(u(h))return i(`SESSION_NOT_FOUND`,so);let _=await M({command:`appstate`,device:h,use:fe,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,unavailableResponse:e=>i(`UNSUPPORTED_OPERATION`,h.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:go(o.androidDeviceAllowlist)});let y=await v.operations.appState();return{ok:!0,data:{platform:g(h),package:y.package,activity:y.activity}}}async function ho(e){let{req:t,sessionName:r,sessionStore:a}=e;if(t.command===`boot`){let o=a.get(r),s=t.flags??{},c=G(t.command,o,s);if(c)return c;let l=R(s.androidDeviceAllowlist),u=l?[...l].sort():void 0,d=T({headless:s.headless===!0}),p;try{p=await K({session:o,flags:s,androidAvdSelection:`include-stopped`})}catch(e){let t=n(e);if(d.kind===`boot-target-headless`&&!po(s.device,o?.device)&&t.code===`DEVICE_NOT_FOUND`)return i(`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 i(`DEVICE_NOT_FOUND`,`No ${p.platform} device found matching --target ${s.target}.`);let m=await Pe({command:`boot`,device:p,required:d.use.required,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,unavailableResponse:co(d.kind===`boot-target-headless`)});if(m.type===`response`)return m.response;let h={serial:s.serial,androidSerialAllowlist:u};return p=d.kind===`boot-target-headless`?await(await m.bind(p,d.use)).operations.bootTargetHeadless(h):await(await m.bind(p,d.use)).operations.bootTarget(h),{ok:!0,data:{platform:g(p),target:p.target??`mobile`,device:p.name,id:p.id,kind:p.kind,booted:!0,...f(p.platform)&&p.appleOs?{appleOs:p.appleOs}:{}}}}if(t.command===`shutdown`){let n=a.get(r),o=t.flags??{},s=G(t.command,n,o);if(s)return s;let c=await K({flags:o,session:n,androidAvdSelection:`include-stopped`}),l=fo((await lo(e.inspectFacts)(c)).operations.shutdownTarget);if(l)return l;if(n&&n.device.platform===c.platform&&n.device.id===c.id)return i(`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 ${r}`,session:r,platform:g(c),target:c.target??`mobile`,device:c.name,id:c.id,kind:c.kind});let u=await(await uo(e.bindDevice)(c,y)).operations.shutdownTarget();return u.success?{ok:!0,data:{platform:g(c),target:c.target??`mobile`,device:c.name,id:c.id,kind:c.kind,shutdown:u,...f(c.platform)&&c.appleOs?{appleOs:c.appleOs}:{}}}:i(u.error?.code??`COMMAND_FAILED`,_o(u),{platform:g(c),target:c.target??`mobile`,device:c.name,id:c.id,kind:c.kind,shutdown:u})}return t.command===`appstate`?await mo({req:t,sessionName:r,sessionStore:a,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice}):null}function go(e){let t=R(e);return t?[...t].sort():void 0}function _o(e){let t=e.error?.message??e.stderr.trim();return t.length>0?t:`Shutdown failed`}function vo(e){let t=st(e);if(t===void 0)return{exists:!1,sizeBytes:0};try{let e=W.fstatSync(t);return{exists:!0,sizeBytes:e.size,modifiedAt:e.mtime.toISOString()}}finally{W.closeSync(t)}}function yo(e,t){ar(e);let n=`[agent-device][mark][${new Date().toISOString()}] ${t.trim()||`marker`}\n`,r=ct(e);try{W.writeFileSync(r,n,`utf8`)}finally{W.closeSync(r)}}function bo(e){let t=U.dirname(e),n=U.basename(e);W.existsSync(t)||W.mkdirSync(t,{recursive:!0});let r=ot(e);try{W.fsyncSync(r)}finally{W.closeSync(r)}let i=0;for(let e of W.readdirSync(t)){if(!e.startsWith(`${n}.`))continue;let r=e.slice(n.length+1);if(/^\d+$/.test(r))try{W.unlinkSync(U.join(t,e)),i+=1}catch{}}return{path:e,cleared:!0,removedRotatedFiles:i}}function xo(e){return Dn.createNextFence({admissionLedger:e.ledger,resourcePath:e.resourcePath,device:e.device})}async function So(e){try{return await Co(e)}catch(e){return{ok:!1,error:t(e)}}}async function Co(e){let t=wo(e);if(!t.ok)return t;let n=t.session,r=ne(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 To(a,o);let c=re({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 Eo(e,n,r,c.use);case`capture-status`:return await Do(e,n);case`capture-stop`:return await Oo(e,n)}}function wo(e){let t=e.sessionStore.get(e.sessionName);return t?{ok:!0,session:t}:i(`SESSION_NOT_FOUND`,`audio requires an active session`)}function To(e,t){let n=(e.available?void 0:e.hint)??(t.available?void 0:t.hint);return i(`UNSUPPORTED_OPERATION`,n??`audio is supported for web browser sessions, macOS sessions, iOS simulators, and Android emulators on macOS hosts`)}async function Eo(e,t,n,r){if(t.audioProbe){await mn({intent:`disposal`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore});let n=e.sessionStore.get(e.sessionName);if(!n)return i(`SESSION_NOT_FOUND`,`audio requires an active session`);t=n}let a=await e.bindDevice(t.device,r),o=Tn.store.resolvePath(e.sessionStore.resolveSessionDir(e.sessionName)),s=Tn.createNextFence({admissionLedger:e.audioProbeAdmissionLedger,resourcePath:o,device:t.device}),c=U.join(e.sessionStore.ensureSessionDir(e.sessionName),`audio-probe.json`),l=await a.operations.audioProbeStart({sessionId:e.sessionName,statusPath:c,durationMs:n.durationMs,bucketMs:n.bucketMs,fence:s});await Cn({admissionLedger:e.audioProbeAdmissionLedger,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore,device:t.device,owner:a.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 Do(e,t){let n=t.audioProbe;if(!n)return{ok:!0,data:ko()};let r=await n.handle.status();return r.state===`stopped`&&await mn({intent:`disposal`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore}),{ok:!0,data:r}}async function Oo(e,t){return t.audioProbe?{ok:!0,data:await mn({intent:`capture`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore})}:{ok:!0,data:ko()}}function ko(){return ln({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 Ao(n){let r=n.sessionStore.get(n.sessionName);if(!r)return i(`SESSION_NOT_FOUND`,`perf requires an active session. Run open first.`);try{if($e(n.req.positionals?.[0]))throw new e(`INVALID_ARGS`,et);Zo(n.req);let t=En({positionals:n.req.positionals,kind:$o(n.req.flags?.kind),outPath:$o(n.req.flags?.out)}),a=Sn(t);if(a.kind===`capture-stop`)return jo(n,await Fo(n,r,a.request));let o=await Jn({device:r.device,plan:a,inspectFacts:n.inspectFacts});return o.admitted?jo(n,await Mo(n,r,o)):B(`perf`,o.fact)??i(`UNSUPPORTED_OPERATION`,`perf is not supported on this device`)}catch(e){return{ok:!1,error:t(e)}}}function jo(e,t){if(!t.ok)return t;let n=e.sessionStore.get(e.sessionName);return k(e.sessionStore,n,e.req,`perf`,Ko(t.data)?{...t.data}:{}),t}async function Mo(t,n,r){let{device:i,plan:a}=qn(r),o=V(t.bindDevice);switch(a.kind){case`frames`:return{ok:!0,data:Vo(n,await(await o(i,a.use)).operations.perfFrames({appId:n.appBundleId}))};case`memory-sample`:return{ok:!0,data:qo(n,await(await o(i,a.use)).operations.perfMemorySample({appId:n.appBundleId}))};case`memory-snapshot`:return{ok:!0,data:Jo(n,await(await o(i,a.use)).operations.perfMemorySnapshot({appId:n.appBundleId,kind:a.request.kind,outPath:a.request.outPath?A.expandHome(a.request.outPath,t.req.meta?.cwd):void 0,artifactsDir:U.join(t.sessionStore.ensureSessionDir(t.sessionName),`artifacts`)}))};case`capture-start`:return await No(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=Xo(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:A.expandHome(c,t.req.meta?.cwd),outPath:l,template:a.request.template??(s?.kind===`xctrace`?s.template:void 0),profile:s})}}}}}async function No(e,t,n,r){if(t.perfCapture)return i(`INVALID_ARGS`,`native perf capture already in progress`);if(!t.appBundleId)return i(`COMMAND_FAILED`,`No app is associated with this session.`,{hint:`Run open <app> first so perf can resolve the app process identity.`});let a=r.kind===`xctrace`?`perf-${r.area===`cpu`?`cpu-profile`:`trace`}.trace`:r.kind===`perfetto`?`app.perfetto-trace`:`cpu.perf.data`,o=Xo(e,r.outPath,a),s=fn.store.resolvePath(e.sessionStore.resolveSessionDir(e.sessionName)),c=fn.createNextFence({admissionLedger:Po(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 wn({admissionLedger:Po(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 Po(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 Fo(e,t,n){let r=t.perfCapture;if(!r)return i(`INVALID_ARGS`,`no active native perf capture`);let a=Bo(r.handle.inspect(),n);if(a)return i(`INVALID_ARGS`,a);n.outPath&&r.handle.setOutputPath(A.expandHome(n.outPath,e.req.meta?.cwd));let o=await yn({intent:`capture`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore});if(n.area===`cpu`){let n=Io(o),r=e.sessionStore.get(e.sessionName)??t;e.sessionStore.set(e.sessionName,{...r,lastPerfProfile:n})}return{ok:!0,data:o}}function Io(t){if(Lo(t)||Ro(t))return t;throw new e(`COMMAND_FAILED`,`Stopped CPU profile metadata is malformed.`)}function Lo(e){return e.kind===`xctrace`&&e.mode===`cpu-profile`&&typeof e.outPath==`string`&&typeof e.template==`string`}function Ro(e){return e.kind===`simpleperf`&&e.mode===`cpu-profile`&&zo(e,[`outPath`,`packageName`,`appPid`,`profilerPid`,`remotePath`])}function zo(e,t){return t.every(t=>typeof e[t]==`string`)}function Bo(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 Vo(e,t){return{...Yo(e),metrics:{fps:Ho(t.metric,e)},sampling:{fps:t.sampling}}}function Ho(e,t){if(!Ko(e)||e.available!==!0)return e;let n=Uo(t.actions,e);return n.length===0?e:{...e,relatedActions:n}}function Uo(e,t){let n=Wo(t.windowStartedAt),r=Wo(t.windowEndedAt)??Wo(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:Go(e)})).slice(-12)}function Wo(e){if(typeof e!=`string`)return;let t=Date.parse(e);return Number.isFinite(t)?t:void 0}function Go(e){for(let t of[`refLabel`,`ref`,`appName`,`appBundleId`]){let n=e.result?.[t];if(typeof n==`string`&&n.length>0)return n}}function Ko(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function qo(e,t){return{...Yo(e),metrics:{memory:t.metric},sampling:{memory:t.sampling}}}function Jo(e,t){return{...Yo(e),artifact:t.artifact,sampling:{snapshot:t.sampling},support:t.support}}function Yo(e){return{session:e.name,platform:g(e.device),device:e.device.name,deviceId:e.device.id}}function Xo(e,t,n){return t?A.expandHome(t,e.req.meta?.cwd):U.join(e.sessionStore.ensureSessionDir(e.sessionName),`${Qo()}-${n}`)}function Zo(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 Qo(){return new Date().toISOString().replaceAll(/[:.]/g,`-`)}function $o(e){return typeof e==`string`&&e.length>0?e:void 0}const es=[`dump`,`log`],ts=`network requires ${es.join(` or `)}`,ns=`network include mode must be one of: ${a.join(`, `)}`,rs=2048;async function is(e){let n=e.sessionStore.get(e.sessionName);if(!n)return i(`SESSION_NOT_FOUND`,`network requires an active session`);try{let t=as(e.bindDevice),r=(await t(n.device,_)).facts.networkDump;if(!r.available)return us(r.hint);let i=os(e.req);if(!i.ok)return i;let a=pe({action:i.action,include:i.include}),o=await t(n.device,a.use),s=n.appLog?.handle.inspect();return ds(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:rs,maxScanLines:4e3}),i,!!n.appLog,s?.state)}catch(e){return{ok:!1,error:t(e)}}}function as(t){if(t)return t;throw new e(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`})}function os(e){let t=ss(e);if(!t.ok)return t;let n=cs(e);if(!n.ok)return n;let r=ls(e);return r.ok?{ok:!0,action:t.action,include:r.include,maxEntries:n.maxEntries}:r}function ss(e){let t=(e.positionals?.[0]??`dump`).toLowerCase();return es.includes(t)?{ok:!0,action:t}:i(`INVALID_ARGS`,ts)}function cs(e){let t=e.positionals?.[1]?Number.parseInt(e.positionals[1],10):25;return!Number.isInteger(t)||t<1||t>200?i(`INVALID_ARGS`,`network dump limit must be an integer in range 1..200`):{ok:!0,maxEntries:t}}function ls(e){let t=e.positionals?.[2]?.toLowerCase(),n=e.flags?.networkInclude;if(t&&n&&t!==n)return i(`INVALID_ARGS`,`network include mode was provided both positionally and via --include with different values`);let r=(n??t??`summary`).toLowerCase();return a.includes(r)?{ok:!0,include:r}:i(`INVALID_ARGS`,ns)}function us(e){return{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`network is not supported on this device`,hint:e}}}function ds(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:rs,maxScanLines:e.entries.length},notes:e.notes}}}function fs(e,t){let n=xn(e);return{...n,backend:n.backend??t,notes:n.state===`failed`&&e.appLogFailure?[ps(e.appLogFailure)]:ms(n.state)}}function ps(e){return e.hint?`${e.message} ${e.hint}`:e.message}function ms(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 hs(e,t){return de([...e,...t.notes??[]])}async function gs(e){let{req:t}=e;return t.command===`perf`?await Ao({...e,throwIfCanceled:e.throwIfCanceled??(()=>{})}):t.command===`logs`?vs(e):t.command===`events`?await _s(e):t.command===`network`?await is(e):t.command===`audio`?await So(As(e)):null}async function _s(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 vs(e){let{req:n,sessionName:r,sessionStore:a}=e,o=a.get(r);if(!o)return i(`SESSION_NOT_FOUND`,`logs requires an active session`);try{let t=js({...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=xs(C({action:n.positionals?.[0],restart:!!n.flags?.restart,marker:n.positionals?.slice(1).join(` `)}),o);return`ok`in i?i:await ys(t,i)}catch(e){return{ok:!1,error:t(e)}}}async function ys(e,t){switch(t.kind){case`path`:return Ss(e,(await(await e.bindDevice(e.session.device,t.use)).operations.appLogInspect()).backend);case`doctor`:return Cs(e,await(await e.bindDevice(e.session.device,t.use)).operations.appLogDoctor({appBundleId:e.session.appBundleId}));case`start`:case`clear-restart`:return await bs(e,t);case`stop`:return await e.bindDevice(e.session.device,t.use),await Os(e);case`mark`:return await e.bindDevice(e.session.device,t.use),ws(t.marker,e.sessionName,e.sessionStore);case`clear`:return await e.bindDevice(e.session.device,t.use),Ts(e)}}async function bs(e,t){let n=await e.bindDevice(e.session.device,t.use);return t.kind===`start`?await Ds(e,t.appBundleId,n.owner,n.operations.appLogStart):await Es(e,t.appBundleId,n.owner,n.operations.appLogStart)}function xs(e,t){return e.requiresAppSession?t.appBundleId?Object.freeze({...e,appBundleId:t.appBundleId}):i(`INVALID_ARGS`,`logs ${e.kind===`start`?`start`:`clear --restart`} requires an app session; run open <app> first`):e}function Ss(e,t){let{session:n,sessionName:r,sessionStore:i}=e,a=i.resolveAppLogPath(r),o=vo(a),s=fs(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 Cs(e,t){let{session:n,sessionName:r,sessionStore:i}=e,a=i.resolveAppLogPath(r),o=fs(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:hs(t.notes,o)}}}function ws(e,t,n){let r=n.resolveAppLogPath(t);return yo(r,e),{ok:!0,data:{path:r,marked:!0}}}function Ts(e){let{session:t,sessionName:n,sessionStore:r}=e;if(t.appLog)return i(`INVALID_ARGS`,`logs clear requires logs to be stopped first; run logs stop`);let a=bo(r.resolveAppLogPath(n));return hn({session:t,sessionName:n,sessionStore:r}),{ok:!0,data:a}}async function Es(e,t,n,r){let{session:i,sessionName:a,sessionStore:o}=e;i.appLog&&await gn({intent:`disposal`,session:i,sessionName:a,sessionStore:o,resourcePath:_n.resolvePath(o.resolveSessionDir(a))});let s=bo(o.resolveAppLogPath(a)),c=await ks(e,t,r,n);return c.ok?{ok:!0,data:{...s,restarted:!0}}:c}async function Ds(e,t,n,r){let{session:a}=e;return a.appLog?i(`INVALID_ARGS`,`app log already streaming; run logs stop first`):await ks(e,t,r,n)}async function Os(e){let{session:t,sessionName:n,sessionStore:r}=e;if(!t.appLog)return i(`INVALID_ARGS`,`no app log stream active`);let a=r.resolveAppLogPath(n);return await gn({intent:`capture`,session:t,sessionName:n,sessionStore:r,resourcePath:_n.resolvePath(r.resolveSessionDir(n))}),{ok:!0,data:{path:a,stopped:!0}}}async function ks(e,t,n,r){let{session:i,sessionName:a,sessionStore:o}=e,s=o.resolveAppLogPath(a),c=_n.resolvePath(o.resolveSessionDir(a));try{let l=xo({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 bn({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:vn({session:i,sessionName:a,sessionStore:o,error:e})}}}function As(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 js(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 Ms=new WeakMap;function Ns(e){return{store:t=>Ps(e,t),finalize:(t,n)=>Fs({...e,evidence:t,projection:n})}}function Ps(e,t){let{sessionStore:n,sessionName:r}=e,i;if(!n.update(e=>{Fe(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 Ms.set(s,{sessionName:r,session:a,sessionCreatedAt:a.createdAt,snapshot:t,snapshotGeneration:o,runtimeRevision:Ne(a),refFrame:Me(a)}),{evidence:s,refsGeneration:o}}function Fs(e){let t=Ms.get(e.evidence);Ms.delete(e.evidence);let n=Ls(e.projection.refs);return n.size===0?{published:!1,reason:`empty`}:e.signal?.aborted===!0?{published:!1,reason:`cancelled`}:!t||!Is(e,t)?{published:!1,reason:`stale-capture`}:e.projection.refsGeneration!==t.snapshotGeneration||!Rs(n,t.snapshot)?{published:!1,reason:`invalid-projection`}:(Re(t.session,n),{published:!0,refsGeneration:t.snapshotGeneration,refCount:n.size})}function Is(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&&Ne(n)===t.runtimeRevision&&Me(n)===t.refFrame}function Ls(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 Rs(e,t){let n=new Set(t.nodes.flatMap(e=>typeof e.ref==`string`?[e.ref]:[]));return[...e].every(e=>n.has(e))}function zs(e){let{sessionStore:t,mutationStore:n}=e,r=()=>t.get();return{view(){let e=r();if(e)return{repairBoundary:Te(e),pendingRecordAndHeal:e.pendingRecordAndHeal,scriptPublication:Bs(e.scriptPublication??We)}},armStep(e){n.update(t=>{Ae(t,{saveScript:e.saveScript,force:e.force,sourcePath:e.sourcePath,healedSiblingPath:Tt(e.sourcePath),firstArm:e.firstArm})})},demoteForRerunIfArmed(){Te(r())!==void 0&&n.update(Se)},markCompleteIfArmed(){Te(r())!==void 0&&n.update(Oe)},markSessionHeldIfArmed(e){if(e.ok||!ke(r()))return e;let t=ut(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&&Hs(t)})},resumeStamper:{sessionExists:()=>r()!==void 0,stampCorrectiveWatermark(e){n.update(t=>{Vs({session:t,...e})})}}}}function Bs(e){return{kind:e.kind,status:e.kind===`none`?void 0:e.status,targetPath:Ke(e),targetForce:Ve(e)}}function Vs(e){let{session:t,resume:n,repairHint:r,failedIndex:i,actions:a}=e;t.pendingRecordAndHeal=Us({resume:n,repairHint:r,failedIndex:i,actions:a,actionsCountAtDivergence:t.actions.length})}function Hs(e){e.pendingRecordAndHeal=void 0}function Us(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 Ws(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 $n({req:Gs(e),sessionName:e.sessionName,sessionStore:t,bindDevice:n,bindExactDevice:r,admissionLedger:i,requestScope:a,retainDeviceExecutionLock:o,throwIfCanceled:s})}}function Gs(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 Ks={resolveSessionScope:zn},qs=async({req:e,sessionName:t,logPath:n,sessionStore:r,invoke:i,invokeReplayAction:a})=>await Ot({...cr(e),session:Ys(t,n,r),invoke:ur(a??i,e),dependencies:Ks}),Js=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=Ws({sessionStore:i,bindDevice:c,bindExactDevice:u,screenRecordingAdmissionLedger:d,requestScope:f,retainDeviceExecutionLock:p,throwIfCanceled:m});return await Nt({...cr(t),session:Ys(n,r,i),createSession:(e,t)=>Ys(e,t,i),invoke:ur(s??o,t),dependencies:Ks,cleanupSession:async e=>await Xs({req:t,sessionName:e,logPath:r,sessionStore:i,leaseRegistry:a,inspectFacts:l,bindDevice:c,platformResourceCleanup:h}),...g?{video:g}:{}})};function Ys(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 sr(t,n,a,{createCoordinator:()=>zs({sessionStore:a,mutationStore:{update:i,clearRepairTombstone:()=>r.clearRepairTombstone(t)}}),assertSelectorMatches:e=>{let n=r.lookup(t);n&&Gn(n,e)},resolveOpenRuntimeHints:({request:e,device:n,platform:i})=>qt({req:e,sessionStore:{getRuntimeHints:e=>e===t?r.getRuntimeHints(t):void 0},sessionName:t,device:n,platform:i}),bindAuthority:e=>Ns({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 ze({device:a.device,session:a,flags:n,logPath:i})}})}async function Xs(t){let{req:n,sessionName:r,logPath:i,sessionStore:a}=t;if(!a.get(r))return;let o=await Ji({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 Zs(t){let{req:n,sessionName:r,sessionStore:i}=t;if(n.command!==Qe.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=ec(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.`));Ge(a,{explicitPath:s,liveForce:n.flags?.force});let c=i.writeSessionLog(a,{force:qe(a,n.flags?.force),publication:`active`});return c.written?(Xe(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 Qs(e){if(we(e))return`repair`;let t=e.scriptPublication;return t?.kind===`authoring`&&t.status!==`armed`?t.status:Ze(e)?void 0:`not-armed`}const $s={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 ec(e){let t=Qs(e);return t?$s[t]():void 0}function Y(e){return{ok:!1,error:t(e)}}function tc(e){let t=(e[0]??``).toLowerCase();return t===`read`||t===`write`?t:void 0}function nc(e){return{...e.appBundleId===void 0?{}:{options:{appBundleId:e.appBundleId}},execution:Le(e)}}async function rc(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(nc(n))}}async function ic(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={...nc(n),text:i};return await t.operations.writeClipboard(a),{action:`write`,textLength:Array.from(i).length,...F(`Clipboard updated`)}}async function ac(e){let{device:t,action:n,positionals:r,inspectFacts:i,bindDevice:a}=e;if(n===`read`){let e=await M({command:`clipboard`,device:t,use:ue,inspectFacts:i,bindDevice:a,readiness:{}});if(e.type===`response`)return{ok:!1,response:e.response};let n=e.runtime;return{ok:!0,execute:e=>rc(n,e,r)}}let o=await M({command:`clipboard`,device:t,use:he,inspectFacts:i,bindDevice:a,readiness:{}});if(o.type===`response`)return{ok:!1,response:o.response};let s=o.runtime;return{ok:!0,execute:e=>ic(s,e,r)}}async function oc(e){let{req:t,sessionName:n,logPath:r,sessionStore:a,inspectFacts:o,bindDevice:s}=e,c=a.get(n),l=t.flags??{},u=G(N.clipboard,c,l);if(u)return u;let d=t.positionals??[],f=tc(d);if(!f)return i(`INVALID_ARGS`,`clipboard requires a subcommand: read or write`);let p=await K({session:c,flags:l}),m=await ac({device:p,action:f,positionals:d,inspectFacts:o,bindDevice:s});if(!m.ok)return m.response;let h=await m.execute(Ie(r,t.flags,c?.appBundleId,c?.trace?.outPath));return k(a,c,t,t.command,h),{ok:!0,data:{platform:g(p),...h}}}function sc(e){return e.some(e=>e.status===`fail`)?`fail`:e.some(e=>e.status===`warn`)?`warn`:`pass`}function cc(e){return e===`fail`?`Blockers found before the run.`:e===`warn`?`No hard blockers found, but warnings need attention.`:`No blockers found.`}function lc(e){let t={fail:0,warn:1,pass:2,info:3};return[...e].sort((e,n)=>t[e.status]-t[n.status])}function uc(e,...t){for(let n of t)X(e,n)}function X(e,t){e.push(t),xt({type:`command`,status:`progress`,message:dc(t)})}function dc(e){return[Qn(e),...Zn(e)].join(`
2
- `)}async function fc(e,n){let{device:r,targetApp:i,session:a,listInstalledApps:o}=n;if(i)try{let t=o?pc(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 ${g(r)}.`,evidence:{requested:i,platform:g(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 ${g(r)} --all`,evidence:{code:i.code,message:i.message}})}}function pc(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 mc(e,n,r){let i=gc(n,r);try{let t=await vc(i),n=_c(t.devices,i);return X(e,{id:`device`,status:n.length===0?`fail`:`pass`,summary:Sc(n,i,t.failures),hint:n.length===0?Tc(t.failures):void 0,command:n.length===0?kc(i):void 0,evidence:Ac(n,t.failures)}),n.length>0&&yc(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 hc(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:g(e),id:e.id,name:e.name}))}})}function gc(e,t){let n=e.flags??{};return Rn({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 _c(e,t){return e.filter(e=>l(e,t,{includeExplicitSelectors:!0}))}async function vc(e){if(e.platform)return{devices:await z(e),failures:[]};let t=[],n=[];for(let r of it)try{t.push(...await z({...e,platform:r}))}catch(e){n.push(xc(r,e))}return{devices:t,failures:n}}function yc(e,t){for(let n of t)X(e,bc(n))}function bc(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 xc(e,n){let r=t(n);return{platform:e,message:r.message,hint:r.hint,code:r.code}}function Sc(e,t,n){if(e.length===0)return n.length>0?`No ${Cc(t)} devices found; ${wc(n)}.`:`No ${Cc(t)} devices found.`;let r=e.filter(e=>e.booted===!0).length,i=`${e.length} ${Cc(t)} ${Oc(e.length,`device`)} available; ${r} booted`,a=Ec(e,t);return a?`${i} (${a}).`:`${i}.`}function Cc(e){let t=e.platform?Z(e.platform):`local`;return e.target?`${t} ${e.target}`:t}function wc(e){return e.slice(0,2).map(e=>`${Z(e.platform)} inventory failed: ${e.message}`).join(`; `)}function Tc(e){return e.find(e=>e.hint)?.hint??`Start or create a simulator/emulator, connect a device, or adjust --platform/--target/--device selectors.`}function Ec(e,t){if(t.platform||t.target)return;let n=rt(e),r=Dc();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 Dc(){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 Oc(e,t){return e===1?t:`${t}s`}function kc(e){return e.platform?`agent-device devices --platform ${e.platform}`:`agent-device devices`}function Ac(e,t){let n=new Map;for(let t of e){let e=g(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 jc=1500;async function Mc(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 Nc(e,t,r):void 0;return{id:`metro`,status:s?`pass`:`warn`,summary:s?Pc(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 Nc(e,t,n){try{return await(n.resolveProcessInfo??Fc)(e,t)}catch{return}}function Pc(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 Fc(e,t){if(!Ic(e))return;let n=await Lc(t);if(n!==void 0)return{pid:n,cwd:await Rc(n)}}function Ic(e){return e===`127.0.0.1`||e===`localhost`||e===`::1`||e===`0.0.0.0`}async function Lc(e){let t=await lt(`lsof`,[`-nP`,`-iTCP:${e}`,`-sTCP:LISTEN`,`-Fp`],{allowFailure:!0,timeoutMs:jc});if(t.exitCode===0)return t.stdout.split(`
1
+ import{D as e,L as t,O as n,k as r,o as i,t as a}from"./sdk-contracts.js";import{O as o,n as s,r as c}from"./sdk-batch-runner.js";import{S as l,b as u,d,f,g as p,l as m,v as h,y as g}from"./sdk-device.js";import{A as _,B as v,Ct as y,F as b,G as x,I as S,J as C,K as w,L as ee,N as te,Nt as T,P as ne,R as re,St as E,U as D,Ut as ie,W as O,X as ae,Y as oe,Z as se,d as ce,f as le,ft as ue,in as de,it as fe,j as pe,ot as me,pt as he,q as ge,rt as _e,sr as ve,v as ye,wt as be,z as xe}from"./sdk-batch.js";import{_ as Se,c as k,d as Ce,f as we,g as Te,h as Ee,l as De,m as Oe,p as ke,t as A,u as Ae}from"./session-store.js";import{D as je,F as Me,M as j,P as Ne,g as M,h as Pe,i as Fe,k as Ie,m as Le,n as Re,s as ze,v as Be}from"./session-snapshot.js";import{O as Ve,c as He,f as Ue,g as We,h as Ge,k as Ke,l as qe,m as Je,o as Ye,p as Xe,u as Ze}from"./parameterized-recorded-fill.js";import{n as N,t as Qe}from"./catalog.js";import{g as $e,i as et}from"./observability.js";import{i as P,n as tt,r as F}from"./success-text.js";import{t as nt}from"./app-inventory.js";import{r as rt,t as it}from"./device.js";import{a as at,r as I}from"./diagnostics.js";import{a as ot,i as st,r as ct}from"./verified-file.js";import{c as lt}from"./exec.js";import"./file.js";import"./diagnostics2.js";import"./command.js";import{i as ut}from"./replay-divergence.js";import{r as dt}from"./version.js";import{i as ft,r as pt}from"./session-artifact-paths.js";import{t as mt}from"./project-runtime.js";import{t as ht}from"./keyed-lock.js";import{n as gt,t as _t}from"./deploy-result-target.js";import{t as vt}from"./keyboard-actions.js";import{i as yt,r as bt}from"./request-cancel.js";import{t as xt}from"./request.js";import{i as St,s as Ct}from"./provider-session-ownership.js";import{A as wt,B as Tt,C as Et,E as Dt,F as Ot,G as kt,K as At,M as jt,O as Mt,P as Nt,S as Pt,_ as Ft,b as It,c as Lt,d as Rt,et as zt,f as Bt,g as Vt,h as Ht,k as Ut,l as Wt,m as Gt,n as Kt,p as qt,q as Jt,r as Yt,rt as Xt,s as Zt,t as Qt,tt as $t,u as L,v as en,w as tn,x as nn,y as rn}from"./device-claim-rule.js";import{i as an}from"./request-runtime-binding.js";import{c as on,i as sn,t as cn}from"./device-claim-inspection.js";import{t as ln}from"./audio-probe-result.js";import{T as un,_ as dn,a as fn,b as pn,c as mn,d as hn,f as gn,g as _n,h as vn,i as yn,l as bn,m as xn,n as Sn,o as Cn,r as wn,s as Tn,t as En,u as Dn,v as On,x as kn}from"./perf-runtime-plan.js";import{i as An,n as jn}from"./lease-context.js";import{h as Mn}from"./screenshot-runtime.js";import{n as R,r as Nn}from"./device-isolation.js";import{a as Pn,n as z,r as Fn}from"./device-inventory-context.js";import{n as In,r as Ln,t as Rn}from"./dispatch-resolve.js";import"./screen-recording-admission-ledger.js";import{a as zn,d as Bn,i as Vn,l as Hn,n as Un,o as Wn,s as Gn,u as Kn}from"./session-routing.js";import{a as qn,i as B,n as V,r as H,t as Jn}from"./session-runtime-admission.js";import{n as Yn,r as Xn}from"./device-selection-resolver.js";import{n as Zn,r as Qn}from"./doctor-output.js";import{t as $n}from"./record-runtime.js";import{n as er}from"./gesture-runtime.js";import{i as tr,n as nr,r as rr}from"./platform-runtime-open-target.js";import{t as ir}from"./snapshot-runtime.js";import{t as ar}from"./app-log-files.js";import U from"node:path";import W,{promises as or}from"node:fs";function sr(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 cr(e){let{internal:t,...n}=e;return{request:n,...t?.publicNetworkOnly?{publicNetworkOnly:!0}:{},...t?.resolvedSessionScope?{resolvedSessionScope:t.resolvedSessionScope}:{}}}function lr(e,t){let n=o({...e,...t});return Object.keys(n).length>0?n:void 0}function ur(e,t){return async({dispatch:n,...r})=>{let i=lr(t.internal,n);return await e(i?{...r,internal:i}:r)}}function dr(t){throw new e(`UNSUPPORTED_OPERATION`,`install_from_source ${String(t.kind)} sources require a compatible remote daemon`)}function fr(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:dr(n)}}function pr(e){let t=fr(e),n=e.meta?.uploadedArtifactId;return!n||t.kind!==`path`?{source:t,cleanup:()=>{}}:{source:{kind:`path`,path:Ct(n,e.meta?.tenantId)},cleanup:()=>{St(n)}}}function G(e,t,n){return t||At(n)?null:i(`INVALID_ARGS`,`${e} requires an active session or an explicit device selector (e.g. --platform ios).`)}function mr(e){return typeof e?.session==`string`&&e.session.trim().length>0}async function K(e){return Jt(e.flags)||!e.session?await In(e.flags??{},{androidAvdSelection:e.androidAvdSelection}):await hr(e.session.device)}async function hr(t){if(an(t)||!d(t)||t.kind!==`simulator`||process.platform!==`darwin`)return t;if((await Be.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 In(n)}catch(t){if(!(t instanceof e)||t.code!==`DEVICE_NOT_FOUND`)throw t}return await In({platform:`ios`,target:t.target,device:t.name,...t.simulatorSetPath?{iosSimulatorDeviceSet:t.simulatorSetPath}:{}})}function gr(e,t){return t?Hn(t,e).length===0:!1}async function _r(e){let{req:n,sessionName:r,sessionStore:i}=e,a=i.get(r),o,s,c;try{o=pr(n);let t=xr(n),l=await yr(a,n.flags),u=await H(e.inspectFacts)(l),d=B(`install_from_source`,u.operations.ensureReady)??B(`install_from_source`,u.operations.materializeAppSource)??B(`install_from_source`,u.operations.deployMaterializedApp);if(d)return d;let f=await V(e.bindDevice)(l,ae);await f.operations.ensureReady({}),s=await f.operations.materializeAppSource({source:o.source}),c=await Sr({artifact:s,retention:t,req:n,session:a,sessionName:r}),a&&j(a);let p=await f.operations.deployMaterializedApp({artifact:s}),m=Cr(l,s,p,c),h=P(m,`Installed: ${gt(m)}`);return k(i,a,n,`install_source`,h,{positionals:[]}),{ok:!0,data:h}}catch(e){return c&&await Mt(c.materializationId,n.meta?.tenantId).catch(()=>{}),{ok:!1,error:t(e)}}finally{await s?.cleanup(),o?.cleanup()}}async function vr(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 Mt(t,r.meta?.tenantId),{ok:!0,data:{released:!0,materializationId:t}}}catch(e){return{ok:!1,error:t(e)}}}async function yr(t,n){let r=br(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 K({session:t,flags:n})}function br(e){return e===`ios`||e===`android`?e:void 0}function xr(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 Sr(e){if(e.retention.enabled)return await wt({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 Cr(e,t,n,r){return d(e)?wr(t,n,r):Tr(t,n,r)}function wr(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{...Dr(r),bundleId:i,...Er(n,t),launchTarget:n.launchTarget??i}}function Tr(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{...Dr(r),packageName:i,...Er(n,t),launchTarget:n.launchTarget??i}}function Er(e,t){let n=e.appName??t.appName;return n?{appName:n}:{}}function Dr(e){return e?{...e.archivePath?{archivePath:e.archivePath}:{},installablePath:e.installablePath,materializationId:e.materializationId,materializationExpiresAt:e.expiresAt}:{}}async function Or(e){let{req:t,session:n,inspectFacts:r,bindDevice:a}=e,o=kr(t);if(!o.ok)return o.response;let s=G(`runtime port-reverse`,n,t.flags);if(s)return s;let c=await K({session:n,flags:t.flags}),l=await M({device:c,inspectFacts:r,bindDevice:a,command:`runtime port-reverse`,use:v});if(l.type===`response`)return l.response;if(l.runtime.owner.kind!==`provider-runtime`||l.runtime.owner.provider!==o.options.provider)return i(`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}}:i(`UNSUPPORTED_OPERATION`,`The selected provider device runtime does not support port reverse for this lease.`)}function kr(e){let t=Ar(e);if(!t.ok)return t;let n=jr(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 Ar(e){let t=e.flags?.leaseId,n=e.flags?.leaseProvider;return t?n?{ok:!0,leaseId:t,provider:n}:{ok:!1,response:i(`INVALID_ARGS`,`runtime port-reverse requires a lease provider.`)}:{ok:!1,response:i(`INVALID_ARGS`,`runtime port-reverse requires a resolved remote lease.`)}}function jr(e){let t=Mr(e.flags?.devicePort),n=Mr(e.flags?.hostPort??e.flags?.devicePort);return!t||!n?{ok:!1,response:i(`INVALID_ARGS`,`runtime port-reverse requires numeric devicePort and hostPort values from 1 to 65535.`)}:{ok:!0,devicePort:t,hostPort:n}}function Mr(e){if(!(typeof e!=`number`||!Number.isInteger(e)||e<1||e>65535))return e}async function Nr(e){return await M({...e,command:`runtime clear`,use:ee})}async function Pr(e){let{req:t,sessionName:n,sessionStore:r}=e,a=(t.positionals?.[0]??`show`).toLowerCase();if(a===`port-reverse`)return await Or({req:t,session:r.get(n),inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(a===`gesture-viewport`)return await Fr({...e,session:r.get(n)});if(!Ir(a))return i(`INVALID_ARGS`,`runtime requires set, show, clear, port-reverse, or gesture-viewport`);let o=r.get(n),s=r.getRuntimeHints(n);return a===`clear`?await Lr({sessionName:n,sessionStore:r,session:o,current:s,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice}):a===`show`?Rr(n,s):Br({req:t,sessionName:n,sessionStore:r,session:o,current:s})}async function Fr(e){if(!e.session)return i(`SESSION_NOT_FOUND`,`No active session. Run open first.`);let t=await er({device:e.session.device,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(!t.ok)return t.response;let n=Ie(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 Ir(e){return e===`set`||e===`show`||e===`clear`}async function Lr(e){let{sessionName:t,sessionStore:n,session:r,current:i,inspectFacts:a,bindDevice:o}=e;if(L(i)&&r?.appBundleId){let e=await Nr({device:r.device,inspectFacts:a,bindDevice:o});if(e.type===`response`)return e.response;j(r),await e.runtime.operations.clearRuntimeHints({appId:r.appBundleId,values:Gt(i)})}return{ok:!0,data:{session:t,cleared:n.clearRuntimeHints(t)}}}function Rr(e,t){return{ok:!0,data:{session:e,configured:!!t,runtime:t}}}function zr(e){return e?u(e.device):void 0}function Br(e){let{req:t,sessionName:n,sessionStore:r,session:a,current:o}=e,s=zr(a),c=Ft(t.flags?.platform??o?.platform??s);if(!c)return i(`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 i(`INVALID_ARGS`,`runtime set targets ${c}, but session "${n}" is already bound to ${s}.`);let l=Bt(o,Lt(t.flags,c));return Wt(l)===0?i(`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 Vr=/^[A-Za-z0-9_.:-]{1,64}$/,Hr=8192,Ur=4096;function Wr(t){let n=t[0]?.trim(),r=t[1]?.trim();if(!n)throw new e(`INVALID_ARGS`,`trigger-app-event requires <event> [payloadJson]`);if(!Vr.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:Kr(r,n)}}function Gr(t,n,r){let i=u(t),a=qr(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>Ur)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:Ur});return s}function Kr(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`)>Hr)throw new e(`INVALID_ARGS`,`trigger-app-event payload for "${n}" exceeds ${Hr} bytes`);return r}catch(n){throw n instanceof e?n:new e(`INVALID_ARGS`,`Invalid trigger-app-event payload JSON: ${t}`)}}function qr(e){return((d(e)?process.env.AGENT_DEVICE_IOS_APP_EVENT_URL_TEMPLATE:f(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 Jr(e,t,n,r){let{eventName:i,payload:a}=Wr([...r]),o=Gr(t,i,a),s={eventUrl:o,...n.appBundleId===void 0?{}:{options:{appBundleId:n.appBundleId}},execution:Le(n)};return await e.operations.triggerAppEvent(s),{event:i,eventUrl:o,transport:`deep-link`,...F(`Triggered app event: ${i}`)}}async function Yr(e){let{device:t,positionals:n,inspectFacts:r,bindDevice:i,readiness:a}=e,o=await M({command:`trigger-app-event`,device:t,use:_e,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=>Jr(s,t,e,n)}}function Xr(t){let n=(t[0]??`status`).toLowerCase();if(!vt(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 Zr(n)}function Zr(e){return e===`get`?`status`:e===`return`?`enter`:e}const Qr={"ime-probe":`android`},$r={"ime-probe":`android`,mechanism:`ios`,acknowledged:`harmonyos`},ei={"visibility-echo":`ios`,"android-acknowledged":`android`,"harmonyos-acknowledged":`harmonyos`};function ti(e){return{...e.appBundleId===void 0?{}:{options:{appBundleId:e.appBundleId}},execution:Le(e)}}async function ni(e,t){let n=await M(e);if(n.type===`response`)return{ok:!1,response:n.response};let r=n.runtime;return{ok:!0,execute:e=>t(r,e)}}function ri(e,t){return e.operations.keyboardStatus(ti(t)).then(e=>({platform:Qr[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 ii(e,t){let n=await e.operations.keyboardDismiss(ti(t)),r=$r[n.kind];return n.kind===`mechanism`?{platform:r,action:`dismiss`,wasVisible:n.wasVisible,dismissed:n.dismissed,visible:n.visible,mechanism:n.mechanism,...F(si(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 ai(e,t){let n=await e.operations.keyboardEnter(ti(t)),r=ei[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 oi(e){let t=Xr(e.positionals),{device:n,inspectFacts:r,bindDevice:i,readiness:a}=e;return t===`status`?await ni({command:`keyboard status`,device:n,use:be,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>ri(e,t)):t===`dismiss`?await ni({command:`keyboard dismiss`,device:n,use:E,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>ii(e,t)):await ni({command:`keyboard enter`,device:n,use:y,inspectFacts:r,bindDevice:i,readiness:a},(e,t)=>ai(e,t))}function si(e,t){return e?t===`dismissKey`?`Keyboard dismissed via its dismiss key`:`Keyboard dismissed`:`Keyboard already hidden`}async function ci(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=G(i,l,u);if(d)return d;let f=await K({session:l,flags:u}),p=await c(f,l);if(!p.ok)return p.response;l&&Mn(t)===`may-invalidate`&&j(l);let m=await p.execute();if(l){let e=s?await s(l,m,f):l;k(r,e,t,i,m??{},{positionals:o??a}),e!==l&&r.set(n,e)}return{ok:!0,data:m??{}}}function li(e,t,n){if(!(e||t!==`dismiss`&&t!==`enter`&&t!==`return`||n?.platform!==`ios`))return i(`SESSION_NOT_FOUND`,`iOS keyboard action requires an active session so the target app stays foregrounded. Run open first.`)}async function ui(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,inspectFacts:a,bindDevice:o}=e,s=t.positionals??[];return await ci({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:{},inspectFacts:a,bindDevice:o});if(!c.ok)return{ok:!1,response:c.response};let l={...Ie(r,t.flags,i?.appBundleId,i?.trace?.outPath),surface:i?.surface};return{ok:!0,execute:()=>c.execute(l)}}})}async function di(e){return li(e.sessionStore.get(e.sessionName),e.req.positionals?.[0]?.trim().toLowerCase(),e.req.flags??{})||await ui({...e,command:N.keyboard,resolveRuntime:e=>oi(e)})}async function fi(e){return await ui({...e,command:N.triggerAppEvent,resolveRuntime:e=>Yr(e),deriveNextSession:async(e,t)=>{let n=typeof t?.eventUrl==`string`?t.eventUrl:void 0,r=n?await rr(e.device,n,e.appBundleId)??e.appBundleId:e.appBundleId;return{...e,appBundleId:r}}})}function pi(e){let t=e.trim();return t.startsWith(`{`)&&t.endsWith(`}`)||t.startsWith(`[`)&&t.endsWith(`]`)}function mi(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(!W.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(pi(i))return{kind:`inline`,text:i};throw new e(`INVALID_ARGS`,`${r} file not found: ${a}`)}async function hi(t){let n=mi(t,{subject:`Push payload`}),r=n.kind===`inline`?n.text:await gi(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 gi(t){try{return await or.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 _i(e){let{req:t,command:n,sessionName:r,sessionStore:a}=e,o=a.get(r),s=t.flags??{},c=G(n,o,s);if(c)return c;let l=Ci(n,t.positionals??[]);if(!l.ok)return l.response;let u=t.meta?.uploadedArtifactId;try{let c=u?Ct(u,t.meta?.tenantId):A.expandHome(l.appPathInput);if(!W.existsSync(c))return i(`INVALID_ARGS`,`App binary not found: ${c}`);let d=await K({session:o,flags:s}),f=await H(e.inspectFacts)(d),p=B(n,f.operations.deployApp);if(p)return p;let m=await V(e.bindDevice)(d,oe);o&&j(o);let h=await m.operations.deployApp({app:l.app,appPath:c,replaceExisting:n===`reinstall`}),g=yi(d,l.app,c,h),_=P(g,`Installed: ${g.appName??_t(g)}`),v=Si(o,g);return v&&v!==o&&a.set(r,v),k(a,v,t,n,_),{ok:!0,data:_}}finally{u&&St(u)}}async function vi(e){let{req:t,sessionName:n,sessionStore:r}=e,a=r.get(n),o=t.flags??{},s=G(`push`,a,o);if(s)return s;let c=t.positionals?.[0]?.trim(),l=t.positionals?.[1]?.trim();if(!c||!l)return i(`INVALID_ARGS`,`push requires <bundle|package> <payload.json|inline-json>`);let f=await hi(wi(l,t.meta?.cwd)),p=await K({session:a,flags:o}),m=await H(e.inspectFacts)(p),h=B(`push`,m.operations.ensureReady)??B(`push`,m.operations.sendPushNotification);if(h)return h;let g=await V(e.bindDevice)(p,se);await g.operations.ensureReady({}),a&&j(a);let _=await g.operations.sendPushNotification({appId:c,payload:f}),v=d(p)?P({platform:`ios`,bundleId:c},`Pushed notification to ${c}`):P({platform:u(p),package:c,action:_.action,extrasCount:_.extrasCount},`Pushed notification to ${c}`);return k(r,a,t,`push`,v,{positionals:[c,l]}),{ok:!0,data:v}}function yi(e,t,n,r){return d(e)?bi(t,n,r):xi(e,t,n,r)}function bi(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 xi(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 Si(e,t){return!e||t.platform!==`harmonyos`||!t.appId?e:{...e,appBundleId:t.appId,appName:t.appName??t.app}}function Ci(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:i(`INVALID_ARGS`,`install requires: install <path-to-app-binary>`)}}return!n||!r?{ok:!1,response:i(`INVALID_ARGS`,`reinstall requires: reinstall <app> <path-to-app-binary>`)}:{ok:!0,app:n,appPathInput:r}}function wi(e,t){let n=mi(e,{subject:`Push payload`,cwd:t,expandPath:(e,t)=>A.expandHome(e,t)});return n.kind===`file`?n.path:n.text}async function q(e){let{req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}=e;return t.command===`install`||t.command===`reinstall`?await _i({req:t,command:t.command,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):t.command===`install_source`?await _r({req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):t.command===`push`?await vi({req:t,sessionName:n,sessionStore:r,inspectFacts:i,bindDevice:a}):null}async function Ti(e,t,n){return await s(e,t,async(e,t)=>{let r=e;return await n({...r,internal:{...r.internal,executionPlan:{remainingSteps:t.remainingSteps}}})})}const Ei=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 Di(e){return Ei.has(e)}const Oi=new Map(ce.map(e=>[e.name,e]));function ki(e){let t=new Set;for(let n of e){let e=Ai(n);if(e===void 0)return;for(let n of e)t.add(n)}return Object.freeze([...t].sort())}function Ai(e){let t=Oi.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(Di)?n:void 0}function ji(e){if(e!==void 0&&e.remainingSteps.length!==0)return ki(e.remainingSteps)}function Mi(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:An(e),plannedOperations:ji(e.internal?.executionPlan)}}function Ni(e,t,n){e.recordAction(t,{command:`close`,positionals:n.positionals??[],flags:n.flags??{},result:{session:t.name,...F(`Closed: ${t.name}`)}})}function Pi(e,t,n){if(!we(t))return{kind:`not-armed`};let r=t.actions.length;Ni(e,t,n);let i=Ue(t),a=e.writeSessionLog(t,{force:qe(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`}:(De(t),{kind:`aborted`})}function Fi(e,n){let r=t(n),i=Ke(e.scriptPublication??We);return{ok:!1,error:{...r,details:{...r.details,session:e.name,...i?{savedScript:i}:{}},retriable:!0}}}function Ii(e){let{req:t,session:n,sessionStore:r,platformCloseError:i}=e;i||Ni(r,n,t);try{let e=r.writeSessionLog(n,{force:qe(n,t.flags?.force)});e.written&&Je(n,e.path);return}catch(e){return Li(e)}}function Li(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 Ri(e){let t=e.clearRuntimeHints?xe:re,n=await Pe({...e,command:`close`,required:t.required});if(n.type===`response`)return n;if(!e.clearRuntimeHints)return{type:`runtime`,runtime:await n.bind(e.device,re)};let r=await n.bind(e.device,xe);return{type:`runtime`,runtime:r,clearRuntimeHints:r.operations.clearRuntimeHints}}async function zi(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 Bi({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:Gt(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`,()=>Ut(r)),{platformCloseError:h,saveScriptError:_,shutdownResult:g?.shutdown}}async function Bi(e,t,n,r){let{address:i,session:a}=e;await n(`recording`,()=>It({session:a,sessionName:i,sessionStore:t})),await n(`app_log`,()=>Pt({session:a,sessionName:i,sessionStore:t})),await n(`audio_probe`,()=>rn({session:a,sessionName:i,sessionStore:t})),await n(`perf_capture`,()=>Et({session:a,sessionName:i,sessionStore:t})),await n(`platform_snapshot_helper`,()=>tn(a,r))}function Vi(e,t){return nn({sessionName:e,phase:`session_close_cleanup_failed`,failures:t})}function Hi(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 Ui=(e,t)=>(e.positionals?.length??0)>0||Dt(t);async function Wi(e){let{req:t,session:n,logPath:r,sessionStore:i,lifecycle:a}=e,o=we(n),s=JSON.stringify(t.positionals??[]);if(o&&!Ce(n,s)){let e=await Ki({req:t,session:n,logPath:r,lifecycle:a});if(e)return{response:Fi(n,Hi(e))};Ee(n,s)}let c=Pi(i,n,t);return c.kind===`failed`?{response:Fi(n,c.error)}:{repairArmed:o,...c.kind===`committed`&&c.path?{healedScriptPath:c.path}:{},...c.kind===`aborted`?{aborted:!0}:{}}}async function Gi(e){try{return{providerData:await zt(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 Ki(e){let{req:t,session:n,logPath:r,lifecycle:i}=e;if(Ui(t,n))try{await i.operations.closeApplication({positionals:t.positionals??[],outPath:t.flags?.out,appBundleId:n.appBundleId,surface:n.surface??`app`,execution:Mi(t,r,n.trace?.outPath)});return}catch(e){return e}}function qi(t,n){if(!t.flags?.saveScript||Ze(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 Ji(t){let{req:n,sessionName:r,logPath:a,sessionStore:o,leaseRegistry:s,leaseLifecycleProvider:c}=t,l=o.get(r);if(!l)return await Qi({req:n,logPath:a,inspectFacts:t.inspectFacts,bindDevice:t.bindDevice});qi(n,l);let u=n.positionals?.[0];if(n.internal?.closeAppOnly===!0&&!u)return i(`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 Ri({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(j(l),n.internal?.closeAppOnly===!0&&u)return await Zi({req:n,session:l,logPath:a,lifecycle:f.runtime,app:u});let p=await Wi({req:n,session:l,logPath:a,sessionStore:o,lifecycle:f.runtime});if(`response`in p)return p.response;let m=await Yi({req:n,session:l,sessionName:r,logPath:a,sessionStore:o,leaseRegistry:s,leaseLifecycleProvider:c,lifecycle:f.runtime,clearRuntimeHints:f.clearRuntimeHints,repairArmed:p.repairArmed,platformResourceCleanup:d});return m.kind===`response`?m.response:Xi({session:l,repair:p,requestedSaveScript:!!n.flags?.saveScript,shutdownResult:m.shutdownResult,providerData:m.providerData})}async function Yi(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 zi({req:t,session:n,sessionName:r,logPath:i,sessionStore:a,lifecycle:c,clearRuntimeHints:l,cleanupFailures:u,repairArmed:e.repairArmed,dispatchTargetedPlatformClose:Ki,finalizeOrdinaryCloseScript:Ii,platformResourceCleanup:e.platformResourceCleanup}),m=await Gi({session:n,leaseRegistry:o,leaseLifecycleProvider:s});if(m.response)return{kind:`response`,response:m.response};let h=Vi(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 pn(n.deviceClaim),a.delete(r),g)throw g;if(f)throw f;return{kind:`closed`,providerData:m.providerData,shutdownResult:p}}function Xi(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 Zi(e){let{req:t,session:n,logPath:r,lifecycle:i,app:a}=e,o=await Ki({req:t,session:n,logPath:r,lifecycle:i});if(o)throw o;return{ok:!0,data:{app:a,...F(`Closed: ${a}`)}}}async function Qi(e){let{req:t,logPath:n,inspectFacts:r,bindDevice:a}=e;if(!t.positionals||t.positionals.length===0)return i(`SESSION_NOT_FOUND`,`No active session`);let o=await Ri({device:await K({session:void 0,flags:t.flags}),clearRuntimeHints:!1,inspectFacts:r,bindDevice:a});return o.type===`response`?o.response:(await o.runtime.operations.closeApplication({positionals:t.positionals,outPath:t.flags?.out,surface:`app`,ensureReady:!0,execution:Mi(t,n)}),{ok:!0,data:{app:t.positionals[0],...F(`Closed: ${t.positionals[0]}`)}})}function $i(e,t){return e.operations.ensureReady(t)}function ea(e,t,n){return e.operations.listApps({device:t,filter:n})}async function ta(e){let{req:t,sessionName:n,sessionStore:r}=e;switch(t.command){case`session_list`:return na(t,r);case`devices`:return await ia(t);case`capabilities`:return await fa({req:t,sessionName:n,sessionStore:r,inspectFacts:e.inspectFacts});case`apps`:return await va({req:t,sessionName:n,sessionStore:r,bindDevice:e.bindDevice,inspectFacts:e.inspectFacts,providerAppCatalog:e.providerAppCatalog});default:return null}}function na(e,t){let n=zn(e);return{ok:!0,data:{sessions:t.listRefs().filter(e=>Wn(e.session,n)).map(e=>ra(e,t))}}}function ra({address:e,session:t},n){let r=n.resolveSessionDir(e);return{name:t.name,address:e,sessionStateDir:r,runnerLogPath:ft(r),platform:u(t.device),...m(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,...m(t.device.platform)&&!f(t.device)&&{device_udid:t.device.id,ios_simulator_device_set:t.device.simulatorSetPath??null}}}async function ia(e){try{let t=aa();return{ok:!0,data:{devices:(await sa(e)).map(e=>({...Ta(e),...oa(e,t)}))}}}catch(e){let t=n(e);return{ok:!1,error:{code:t.code,message:t.message,...t.details?{details:t.details}:{}}}}}function aa(){let e=new Map;for(let t of sn({})){let n=t.claim;!n||cn(t.classification)||e.set(n.deviceKey,{session:n.session,workspace:n.workspace})}return e}function oa(e,t){let n=t.get(on(kn(e)));return n?{claimedBy:n}:{}}async function sa(e){let t=e.flags?.platform;return da(await z(ca(e,t)),e.flags?.platform,e.flags?.target)}function ca(e,t){let n=e.flags;return{platform:t,target:n?.target,deviceName:n?.device,udid:n?.udid,serial:n?.serial,iosSimulatorSetPath:la(n?.iosSimulatorDeviceSet,t,n?.target),androidSerialAllowlist:ua(n?.androidDeviceAllowlist)}}function la(e,t,n){return l({simulatorSetPath:Nn(e),platform:t,target:n})}function ua(e){let t=R(e);return t?Array.from(t).sort():void 0}function da(e,t,n){let r=t?e.filter(e=>Ea(e,t)):e;return n?r.filter(e=>(e.target??`mobile`)===n):r}async function fa(e){let t=await wa({...e,androidAvdSelection:`include-stopped`});if(`response`in t)return t.response;let{device:n}=t,r=pa(n,e.sessionStore.get(e.sessionName),e.req.flags),i=await xa(n,e.inspectFacts);return{ok:!0,data:{device:Ta(n),availableCommands:ye().filter(e=>e===`appstate`&&r?!0:ga(e,i))}}}function pa(e,t,n){return!t||!d(e)&&!f(e)||!gr(n,t)?!1:ma(t)||ha(e,t)}function ma(e){return!!(e.appName||e.appBundleId)}function ha(e,t){return!!(f(e)&&t.surface!==void 0&&t.surface!==`app`&&t.surface!==`frontmost-app`)}function ga(e,t){let n=le(e);return!n||!t?!1:n.some(e=>e.length>0&&e.every(e=>_a(t,e)))}function _a(e,t){return Object.hasOwn(e.operations,t)?e.operations[t]?.available===!0:!1}async function va(e){let{req:t,sessionName:n,sessionStore:r,bindDevice:i,inspectFacts:a}=e,o=await ya(t,e.providerAppCatalog);if(o)return o;let s=await wa({req:t,sessionName:n,sessionStore:r,androidAvdSelection:`include-stopped`});if(`response`in s)return s.response;let{device:c}=s,l=nt(t.flags?.appsFilter),u=R(t.flags?.androidDeviceAllowlist),d=await Sa({device:c,inspectFacts:a,bindDevice:i});if(`response`in d)return d.response;let f=d.runtime;return Ca(await ea(f,await $i(f,{serial:t.flags?.serial,androidSerialAllowlist:u?[...u].sort():void 0}),l))}async function ya(e,t){let n=ba(e);if(!(!t||!n||!t.supports(n.provider)))return{ok:!0,data:{apps:[...await t.list(n,bt(e.meta?.requestId))]}}}function ba(e){let t=jn(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 xa(e,t){if(t)try{return await t(e)}catch{return}}async function Sa(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,me)}}function Ca(e){return{ok:!0,data:{apps:e.map(e=>e.name&&e.name!==e.id?`${e.name} (${e.id})`:e.id)}}}async function wa(e){let{req:t,sessionName:n,sessionStore:r,androidAvdSelection:i}=e,a=r.get(n),o=t.flags??{},s=G(t.command,a,o);return s?{response:s}:{device:await K({session:a,flags:o,androidAvdSelection:i})}}function Ta({simulatorSetPath:e,iosPhysicalDeviceBackend:t,appleOs:n,...r}){return{...r,platform:u({platform:r.platform,appleOs:n}),...m(r.platform)&&n?{appleOs:n}:{}}}function Ea(e,t){return g(e,t)}function J(e){return i(`INVALID_ARGS`,e)}function Da(t,n,r,a){try{return nr({device:t,surfaceFlag:n,openTarget:r,existingSurface:a})}catch(t){return i(t instanceof e?t.code:`INVALID_ARGS`,String(t.message))}}async function Oa(e){let{shouldRelaunch:t,openTarget:n,surface:r,device:i}=e;if(!t)return null;let a=await tr({target:n,platform:i.platform,surface:r});return a?J(a):null}async function ka(e){let{shouldRelaunch:t,openTarget:n,platform:r}=e;if(!t)return null;let i=await tr({target:n,platform:r});return i?J(i):null}function Aa(e){let t=en(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:Vt({replacedStoredRuntime:i,previousRuntime:r,runtime:n,session:e.existingSession})}}}async function ja(t){let{req:n,logPath:r,surface:i,openTarget:a,existingSession:o,runtime:s,runtimeHintPlan:l,clearRuntimeHints:u,foreground:d}=t;await s.operations.prepareApplicationOpen({target:a,currentAppBundleId:o?.appBundleId,hasExistingSession:o!==void 0,surface:i,deviceHub:n.flags?.deviceHub===!0,prewarmRunnerOnColdBoot:i===`app`&&!!a&&!c(a??``),execution:{startupDeadlineAtMs:Na(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:An(n)}});let{appBundleId:f,appName:p}=await Ma({runtime:s,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 Rt({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 Ma(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 Na(e){let t=e.flags?.timeoutMs;return typeof t==`number`&&Number.isFinite(t)&&t>0?Date.now()+t:void 0}async function Pa(e){let{req:t,hasExistingSession:n}=e;return t.flags?.foreground===!0?t.positionals?.[0]?{type:`resolved`,req:t}:n?{type:`response`,response:i(`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:i(`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:i(`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 Fa(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 ir({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}}:Ia(o.data,t.error)}catch(e){return Ia(o.data,t(e))}}function Ia(e,t){return{ok:!0,data:{...e,warnings:[...tt(e),`The session is open, but the initial interactive snapshot failed (${t.code}: ${t.message}). Run: agent-device snapshot -i`],initialSnapshotError:t}}}function La(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:_,...Ra(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,p(m.platform)&&(y.serial=m.id)),m&&d(m)&&(y.device_udid=m.id,y.ios_simulator_device_set=m.simulatorSetPath??null),{...y,...F(`Opened: ${o??s??t}`)}}function Ra(e){if(!e)return{};let{device:t,...n}=e;return{selection:n}}function za(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 Ba=Object.freeze({async observeBootTimeMs(e){if(d(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 Va(e,t){e.warnings=[...tt(e),t]}function Ha(e){return e.internal?.resolvedSessionScope??zn(e)}function Ua(e){let{session:t,existingSession:n,saveScriptRequested:r,responseData:i}=e;if(!n&&r){He(t,{});return}Ze(n)&&(Ye(t),Va(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 Wa(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 Ga(e,t){if(e.platform!==`android`)return!1;let n=t.flags?.testIme;return n===void 0?e.kind===`emulator`:n}function Ka(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 qa(e,t){if(!t)return;let n=await un(t);if(n.status!==`renewed`)return n.conflict?Yt(e,n.conflict):i(`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 Ja(e){let{req:t,sessionName:n,sessionStore:a,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,S=Date.now(),C=await Ya({req:t,sessionName:n,sessionStore:a,device:s,surface:d,sessionAppBundleId:x,appName:u,existingSession:g});if(C.type===`response`)return C.response;let w=C.session??g,ee=Date.now(),te=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:Ga(s,t),stateDir:a.resolveDaemonStateDir(),runtimeHints:Gt(p),applyRuntimeHints:h,execution:Mi(t,o,g?.trace?.outPath)});x=te.appBundleId??x;let T={...te.timing},ne=Yn(y),re=c?Ka(ee,c,x):void 0;if(yt(t.meta?.requestId)){let e=r();return i(e.code,e.message,e.details)}g&&je({session:g,command:`open`,positionals:[],flags:void 0});let E=za({existingSession:w,sessionName:g?.name??Vn(t),sessionScope:g?.sessionScope??Ha(t),device:s,surface:d,appBundleId:x,appName:u});E.lease=$t({req:t,existingLease:g?.lease}),_&&(E.deviceClaim=_),t.runtime!==void 0&&Ht(a,n,p);let D=a.ensureSessionDir(n),ie=pt(D,t.meta?.requestId??at().requestId);T.totalDurationMs=Math.max(0,Date.now()-S),I({level:`info`,phase:`open_timing`,durationMs:T.totalDurationMs,data:T});let O=La({sessionName:E.name,sessionStateDir:D,runnerLogPath:ft(D),requestLogPath:ie,eventLogPath:a.resolveEventLogPath(n),appName:u,appBundleId:x,surface:d,startup:re,timing:T,device:s,runtime:p,runtimeHintCount:Wt,sessionReused:g!==void 0,selection:ne});return v&&Va(O,Wa(v)),Ua({session:E,existingSession:g,saveScriptRequested:!!t.flags?.saveScript,responseData:O}),a.set(n,E),a.recordAction(E,{command:`open`,positionals:l,flags:t.flags??{},runtime:t.runtime===void 0?void 0:p,result:O}),{ok:!0,data:O}}async function Ya(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=Xa(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 Xa(e){let{req:t,device:n,surface:r,sessionAppBundleId:i,appName:a,existingSession:o}=e,s=za({existingSession:o,sessionName:o?.name??Vn(t),sessionScope:o?.sessionScope??Ha(t),device:n,surface:r,appBundleId:i,appName:a});return s.lease=$t({req:t,existingLease:o?.lease}),s}function Za(e){let{req:t,device:n,sessionStore:r}=e,i=r.findByDevice(n.id);if(!i)return;let a=jt(t);return Un(t,i.session)?Bn(i,n,a):Kn(i,n,a)}async function Qa(e){let{req:t,device:n,owner:r,sessionName:i,sessionStore:a,reconcileOrphanedDeviceClaim:o}=e;switch(Qt(r)){case`none`:return{status:`not-required`};case`allocator-held`:{let e=Kt(n,r,Zt({device:n,owner:r,stateDir:a.resolveDaemonStateDir(),intent:{kind:`ordinary`}}));return e?{status:`refused`,response:e}:{status:`not-required`}}case`ordinary`:return await On({device:n,session:i,workspace:t.meta?.cwd??process.cwd(),stateDir:a.resolveDaemonStateDir(),reconcileOrphanedDeviceClaim:o,observeDeviceBoot:Ba})}}async function $a(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=Za({req:t,device:a,sessionStore:i});if(m)return m;let h=await Qa({req:t,device:a,owner:c.owner,sessionName:n,sessionStore:i,reconcileOrphanedDeviceClaim:f});if(h.status===`conflict`)return Yt(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 eo({ownership:g,effects:v,sessionName:n,sessionStore:i});try{let e=await ja({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 qa(a,g);if(f)return f;v.mayHaveStarted=!0;let m=t.positionals??[],h=s??e.details.appBundleId,b=await Ja({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 eo(e){let{ownership:t,effects:n,sessionName:r,sessionStore:i}=e;if(!t)return;if(!n.mayHaveStarted){await pn(t);return}if(i.get(r)?.deviceClaim?.ownerToken===t.ownerToken)return;let a=await dn(t);I({level:`warn`,phase:`device_claim_open_effects_unconfirmed`,data:{deviceKey:t.deviceKey,outcome:a}})}const to=new Map;async function no(e){let t=C({applyRuntimeHints:e.runtimeHintPlan.applyRuntimeHints,clearRemovedRuntimeHints:e.runtimeHintPlan.clearRemovedRuntimeHints}),n=await Pe({...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,D)};case`open-apply-runtime-hints`:{let t=await r(e.device,x);return{type:`runtime`,runtime:t,applyRuntimeHints:t.operations.applyRuntimeHints}}case`open-clear-runtime-hints`:{let t=await r(e.device,w);return{type:`runtime`,runtime:t,clearRuntimeHints:t.operations.clearRuntimeHints}}case`open-apply-and-clear-runtime-hints`:{let t=await r(e.device,O);return{type:`runtime`,runtime:t,applyRuntimeHints:t.operations.applyRuntimeHints,clearRuntimeHints:t.operations.clearRuntimeHints}}}}async function ro(e){let t=Aa(e);if(t.type===`response`)return t;let n=await no({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 io(e){let{sessionName:t,logPath:n,sessionStore:r}=e,a=r.get(t),o=await Pa({req:e.req,hasExistingSession:!!a});if(o.type===`response`)return o.response;let s=o.type===`resolved`?o.req:e.req;if(a){if(s.flags?.saveScript)return i(`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?a.appName:void 0),u=Da(a.device,s.flags?.surface,l,a.surface);if(typeof u!=`string`)return u;if(!l&&u===`app`)return J(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 Oa({shouldRelaunch:o,openTarget:l,surface:u,device:a.device});if(d)return d;let f=await qa(a.device,a.deviceClaim);if(f)return f;let p=await hr(a.device),m=Xn(p);await s.internal?.retainDeviceExecutionLock?.(p.id);let h=await ro({req:s,sessionStore:r,sessionName:t,device:p,existingSession:a,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(h.type===`response`)return h.response;let{admission:g,runtimeHintPlan:_}=h;j(a);let v=await ja({req:s,logPath:n,surface:u,openTarget:l,existingSession:a,runtime:g.runtime,runtimeHintPlan:_,clearRuntimeHints:g.clearRuntimeHints,foreground:!1});return v.type===`response`?v.response:await qa(p,a.deviceClaim)||await Ja({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:a,selection:m})}let c=s.flags?.relaunch===!0,l=s.positionals?.[0];if(c&&!l)return J(`open --relaunch requires an app argument.`);let u=await ka({shouldRelaunch:c,openTarget:l,platform:s.flags?.platform===`android`?`android`:void 0});if(u)return u;let d=await Ln(s.flags??{},kt(l)),f=d.device;await s.internal?.retainDeviceExecutionLock?.(f.id);let p=Da(f,s.flags?.surface,l);if(typeof p!=`string`)return p;let m=await Oa({shouldRelaunch:c,openTarget:l,surface:p,device:f});if(m)return m;let h=await ro({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 ht(to,f.id,async()=>await $a({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 ao(e){let t=await io(e);return!t.ok||e.req.flags?.foreground!==!0?t:await Fa({...e,inspectFacts:H(e.inspectFacts),bindDevice:V(e.bindDevice),openResponse:t})}const oo=`iOS appstate requires an active session on the target device. Run open first (for example: open --session sim --platform ios --device "<name>" <app>).`,so=`macOS appstate requires an active session on the target device. Run open first (for example: open --session macos --platform macos "System Settings").`;function co(e){return t=>i(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 lo(t){if(t)return t;throw new e(`COMMAND_FAILED`,`Device runtime facts inspection is unavailable.`,{reason:`runtime-gateway-missing`})}function uo(t){if(t)return t;throw new e(`COMMAND_FAILED`,`Device runtime binding is unavailable.`,{reason:`runtime-gateway-missing`})}function fo(e){return e.available?null:i(`UNSUPPORTED_OPERATION`,`shutdown is supported only for Apple simulators and Android emulators.`,void 0,e.hint?{hint:e.hint}:void 0)}function po(e,t){return!!(e?.trim()||t?.platform===`android`&&t.kind===`emulator`)}async function mo(e){let{req:t,sessionName:n,sessionStore:r}=e,a=r.get(n),o=t.flags??{},s=o.platform;if(!a&&mr(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 i(`SESSION_NOT_FOUND`,e)}let c=G(`appstate`,a,o);if(c)return c;let l=m(a?.device.platform)&&gr(o,a),p=s===`ios`,h=s===`macos`;if(p&&!l)return i(`SESSION_NOT_FOUND`,oo);if(h&&!l)return i(`SESSION_NOT_FOUND`,so);if(l&&a){let e=a.appName??a.appBundleId;if(!a.appName&&!a.appBundleId){if(f(a.device)&&a.surface&&a.surface!==`app`&&a.surface!==`frontmost-app`)return{ok:!0,data:{platform:u(a.device),appName:a.surface,appBundleId:a.appBundleId,source:`session`,surface:a.surface}};let e=f(a.device)?`macOS`:`iOS`;return i(`COMMAND_FAILED`,`No foreground app is tracked for this ${e} session. Open an app in the session, then retry appstate.`)}return{ok:!0,data:{platform:u(a.device),appName:e??`unknown`,appBundleId:a.appBundleId,source:`session`,surface:a.surface??`app`,...d(a.device)?{device_udid:a.device.id,ios_simulator_device_set:a.device.simulatorSetPath??null}:{}}}}let g=await K({session:a,flags:o});if(d(g))return i(`SESSION_NOT_FOUND`,oo);if(f(g))return i(`SESSION_NOT_FOUND`,so);let _=await M({command:`appstate`,device:g,use:fe,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,unavailableResponse:e=>i(`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:go(o.androidDeviceAllowlist)});let y=await v.operations.appState();return{ok:!0,data:{platform:u(g),package:y.package,activity:y.activity}}}async function ho(e){let{req:t,sessionName:r,sessionStore:a}=e;if(t.command===`boot`){let o=a.get(r),s=t.flags??{},c=G(t.command,o,s);if(c)return c;let l=R(s.androidDeviceAllowlist),d=l?[...l].sort():void 0,f=T({headless:s.headless===!0}),p;try{p=await K({session:o,flags:s,androidAvdSelection:`include-stopped`})}catch(e){let t=n(e);if(f.kind===`boot-target-headless`&&!po(s.device,o?.device)&&t.code===`DEVICE_NOT_FOUND`)return i(`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 i(`DEVICE_NOT_FOUND`,`No ${p.platform} device found matching --target ${s.target}.`);let h=await Pe({command:`boot`,device:p,required:f.use.required,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,unavailableResponse:co(f.kind===`boot-target-headless`)});if(h.type===`response`)return h.response;let g={serial:s.serial,androidSerialAllowlist:d};return p=f.kind===`boot-target-headless`?await(await h.bind(p,f.use)).operations.bootTargetHeadless(g):await(await h.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,...m(p.platform)&&p.appleOs?{appleOs:p.appleOs}:{}}}}if(t.command===`shutdown`){let n=a.get(r),o=t.flags??{},s=G(t.command,n,o);if(s)return s;let c=await K({flags:o,session:n,androidAvdSelection:`include-stopped`}),l=fo((await lo(e.inspectFacts)(c)).operations.shutdownTarget);if(l)return l;if(n&&n.device.platform===c.platform&&n.device.id===c.id)return i(`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 ${r}`,session:r,platform:u(c),target:c.target??`mobile`,device:c.name,id:c.id,kind:c.kind});let d=await(await uo(e.bindDevice)(c,ie)).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,...m(c.platform)&&c.appleOs?{appleOs:c.appleOs}:{}}}:i(d.error?.code??`COMMAND_FAILED`,_o(d),{platform:u(c),target:c.target??`mobile`,device:c.name,id:c.id,kind:c.kind,shutdown:d})}return t.command===`appstate`?await mo({req:t,sessionName:r,sessionStore:a,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice}):null}function go(e){let t=R(e);return t?[...t].sort():void 0}function _o(e){let t=e.error?.message??e.stderr.trim();return t.length>0?t:`Shutdown failed`}function vo(e){let t=st(e);if(t===void 0)return{exists:!1,sizeBytes:0};try{let e=W.fstatSync(t);return{exists:!0,sizeBytes:e.size,modifiedAt:e.mtime.toISOString()}}finally{W.closeSync(t)}}function yo(e,t){ar(e);let n=`[agent-device][mark][${new Date().toISOString()}] ${t.trim()||`marker`}\n`,r=ct(e);try{W.writeFileSync(r,n,`utf8`)}finally{W.closeSync(r)}}function bo(e){let t=U.dirname(e),n=U.basename(e);W.existsSync(t)||W.mkdirSync(t,{recursive:!0});let r=ot(e);try{W.fsyncSync(r)}finally{W.closeSync(r)}let i=0;for(let e of W.readdirSync(t)){if(!e.startsWith(`${n}.`))continue;let r=e.slice(n.length+1);if(/^\d+$/.test(r))try{W.unlinkSync(U.join(t,e)),i+=1}catch{}}return{path:e,cleared:!0,removedRotatedFiles:i}}function xo(e){return Dn.createNextFence({admissionLedger:e.ledger,resourcePath:e.resourcePath,device:e.device})}async function So(e){try{return await Co(e)}catch(e){return{ok:!1,error:t(e)}}}async function Co(e){let t=wo(e);if(!t.ok)return t;let n=t.session,r=te(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 To(a,o);let c=ne({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 Eo(e,n,r,c.use);case`capture-status`:return await Do(e,n);case`capture-stop`:return await Oo(e,n)}}function wo(e){let t=e.sessionStore.get(e.sessionName);return t?{ok:!0,session:t}:i(`SESSION_NOT_FOUND`,`audio requires an active session`)}function To(e,t){let n=(e.available?void 0:e.hint)??(t.available?void 0:t.hint);return i(`UNSUPPORTED_OPERATION`,n??`audio is supported for web browser sessions, macOS sessions, iOS simulators, and Android emulators on macOS hosts`)}async function Eo(e,t,n,r){if(t.audioProbe){await mn({intent:`disposal`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore});let n=e.sessionStore.get(e.sessionName);if(!n)return i(`SESSION_NOT_FOUND`,`audio requires an active session`);t=n}let a=await e.bindDevice(t.device,r),o=Tn.store.resolvePath(e.sessionStore.resolveSessionDir(e.sessionName)),s=Tn.createNextFence({admissionLedger:e.audioProbeAdmissionLedger,resourcePath:o,device:t.device}),c=U.join(e.sessionStore.ensureSessionDir(e.sessionName),`audio-probe.json`),l=await a.operations.audioProbeStart({sessionId:e.sessionName,statusPath:c,durationMs:n.durationMs,bucketMs:n.bucketMs,fence:s});await Cn({admissionLedger:e.audioProbeAdmissionLedger,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore,device:t.device,owner:a.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 Do(e,t){let n=t.audioProbe;if(!n)return{ok:!0,data:ko()};let r=await n.handle.status();return r.state===`stopped`&&await mn({intent:`disposal`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore}),{ok:!0,data:r}}async function Oo(e,t){return t.audioProbe?{ok:!0,data:await mn({intent:`capture`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore})}:{ok:!0,data:ko()}}function ko(){return ln({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 Ao(n){let r=n.sessionStore.get(n.sessionName);if(!r)return i(`SESSION_NOT_FOUND`,`perf requires an active session. Run open first.`);try{if($e(n.req.positionals?.[0]))throw new e(`INVALID_ARGS`,et);Zo(n.req);let t=En({positionals:n.req.positionals,kind:$o(n.req.flags?.kind),outPath:$o(n.req.flags?.out)}),a=Sn(t);if(a.kind===`capture-stop`)return jo(n,await Fo(n,r,a.request));let o=await Jn({device:r.device,plan:a,inspectFacts:n.inspectFacts});return o.admitted?jo(n,await Mo(n,r,o)):B(`perf`,o.fact)??i(`UNSUPPORTED_OPERATION`,`perf is not supported on this device`)}catch(e){return{ok:!1,error:t(e)}}}function jo(e,t){if(!t.ok)return t;let n=e.sessionStore.get(e.sessionName);return k(e.sessionStore,n,e.req,`perf`,Ko(t.data)?{...t.data}:{}),t}async function Mo(t,n,r){let{device:i,plan:a}=qn(r),o=V(t.bindDevice);switch(a.kind){case`frames`:return{ok:!0,data:Vo(n,await(await o(i,a.use)).operations.perfFrames({appId:n.appBundleId}))};case`memory-sample`:return{ok:!0,data:qo(n,await(await o(i,a.use)).operations.perfMemorySample({appId:n.appBundleId}))};case`memory-snapshot`:return{ok:!0,data:Jo(n,await(await o(i,a.use)).operations.perfMemorySnapshot({appId:n.appBundleId,kind:a.request.kind,outPath:a.request.outPath?A.expandHome(a.request.outPath,t.req.meta?.cwd):void 0,artifactsDir:U.join(t.sessionStore.ensureSessionDir(t.sessionName),`artifacts`)}))};case`capture-start`:return await No(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=Xo(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:A.expandHome(c,t.req.meta?.cwd),outPath:l,template:a.request.template??(s?.kind===`xctrace`?s.template:void 0),profile:s})}}}}}async function No(e,t,n,r){if(t.perfCapture)return i(`INVALID_ARGS`,`native perf capture already in progress`);if(!t.appBundleId)return i(`COMMAND_FAILED`,`No app is associated with this session.`,{hint:`Run open <app> first so perf can resolve the app process identity.`});let a=r.kind===`xctrace`?`perf-${r.area===`cpu`?`cpu-profile`:`trace`}.trace`:r.kind===`perfetto`?`app.perfetto-trace`:`cpu.perf.data`,o=Xo(e,r.outPath,a),s=fn.store.resolvePath(e.sessionStore.resolveSessionDir(e.sessionName)),c=fn.createNextFence({admissionLedger:Po(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 wn({admissionLedger:Po(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 Po(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 Fo(e,t,n){let r=t.perfCapture;if(!r)return i(`INVALID_ARGS`,`no active native perf capture`);let a=Bo(r.handle.inspect(),n);if(a)return i(`INVALID_ARGS`,a);n.outPath&&r.handle.setOutputPath(A.expandHome(n.outPath,e.req.meta?.cwd));let o=await yn({intent:`capture`,session:t,sessionName:e.sessionName,sessionStore:e.sessionStore});if(n.area===`cpu`){let n=Io(o),r=e.sessionStore.get(e.sessionName)??t;e.sessionStore.set(e.sessionName,{...r,lastPerfProfile:n})}return{ok:!0,data:o}}function Io(t){if(Lo(t)||Ro(t))return t;throw new e(`COMMAND_FAILED`,`Stopped CPU profile metadata is malformed.`)}function Lo(e){return e.kind===`xctrace`&&e.mode===`cpu-profile`&&typeof e.outPath==`string`&&typeof e.template==`string`}function Ro(e){return e.kind===`simpleperf`&&e.mode===`cpu-profile`&&zo(e,[`outPath`,`packageName`,`appPid`,`profilerPid`,`remotePath`])}function zo(e,t){return t.every(t=>typeof e[t]==`string`)}function Bo(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 Vo(e,t){return{...Yo(e),metrics:{fps:Ho(t.metric,e)},sampling:{fps:t.sampling}}}function Ho(e,t){if(!Ko(e)||e.available!==!0)return e;let n=Uo(t.actions,e);return n.length===0?e:{...e,relatedActions:n}}function Uo(e,t){let n=Wo(t.windowStartedAt),r=Wo(t.windowEndedAt)??Wo(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:Go(e)})).slice(-12)}function Wo(e){if(typeof e!=`string`)return;let t=Date.parse(e);return Number.isFinite(t)?t:void 0}function Go(e){for(let t of[`refLabel`,`ref`,`appName`,`appBundleId`]){let n=e.result?.[t];if(typeof n==`string`&&n.length>0)return n}}function Ko(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function qo(e,t){return{...Yo(e),metrics:{memory:t.metric},sampling:{memory:t.sampling}}}function Jo(e,t){return{...Yo(e),artifact:t.artifact,sampling:{snapshot:t.sampling},support:t.support}}function Yo(e){return{session:e.name,platform:u(e.device),device:e.device.name,deviceId:e.device.id}}function Xo(e,t,n){return t?A.expandHome(t,e.req.meta?.cwd):U.join(e.sessionStore.ensureSessionDir(e.sessionName),`${Qo()}-${n}`)}function Zo(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 Qo(){return new Date().toISOString().replaceAll(/[:.]/g,`-`)}function $o(e){return typeof e==`string`&&e.length>0?e:void 0}const es=[`dump`,`log`],ts=`network requires ${es.join(` or `)}`,ns=`network include mode must be one of: ${a.join(`, `)}`,rs=2048;async function is(e){let n=e.sessionStore.get(e.sessionName);if(!n)return i(`SESSION_NOT_FOUND`,`network requires an active session`);try{let t=as(e.bindDevice),r=(await t(n.device,_)).facts.networkDump;if(!r.available)return us(r.hint);let i=os(e.req);if(!i.ok)return i;let a=pe({action:i.action,include:i.include}),o=await t(n.device,a.use),s=n.appLog?.handle.inspect();return ds(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:rs,maxScanLines:4e3}),i,!!n.appLog,s?.state)}catch(e){return{ok:!1,error:t(e)}}}function as(t){if(t)return t;throw new e(`COMMAND_FAILED`,`Device runtime gateway is not configured`,{reason:`runtime-gateway-missing`})}function os(e){let t=ss(e);if(!t.ok)return t;let n=cs(e);if(!n.ok)return n;let r=ls(e);return r.ok?{ok:!0,action:t.action,include:r.include,maxEntries:n.maxEntries}:r}function ss(e){let t=(e.positionals?.[0]??`dump`).toLowerCase();return es.includes(t)?{ok:!0,action:t}:i(`INVALID_ARGS`,ts)}function cs(e){let t=e.positionals?.[1]?Number.parseInt(e.positionals[1],10):25;return!Number.isInteger(t)||t<1||t>200?i(`INVALID_ARGS`,`network dump limit must be an integer in range 1..200`):{ok:!0,maxEntries:t}}function ls(e){let t=e.positionals?.[2]?.toLowerCase(),n=e.flags?.networkInclude;if(t&&n&&t!==n)return i(`INVALID_ARGS`,`network include mode was provided both positionally and via --include with different values`);let r=(n??t??`summary`).toLowerCase();return a.includes(r)?{ok:!0,include:r}:i(`INVALID_ARGS`,ns)}function us(e){return{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`network is not supported on this device`,hint:e}}}function ds(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:rs,maxScanLines:e.entries.length},notes:e.notes}}}function fs(e,t){let n=xn(e);return{...n,backend:n.backend??t,notes:n.state===`failed`&&e.appLogFailure?[ps(e.appLogFailure)]:ms(n.state)}}function ps(e){return e.hint?`${e.message} ${e.hint}`:e.message}function ms(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 hs(e,t){return ve([...e,...t.notes??[]])}async function gs(e){let{req:t}=e;return t.command===`perf`?await Ao({...e,throwIfCanceled:e.throwIfCanceled??(()=>{})}):t.command===`logs`?vs(e):t.command===`events`?await _s(e):t.command===`network`?await is(e):t.command===`audio`?await So(As(e)):null}async function _s(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 vs(e){let{req:n,sessionName:r,sessionStore:a}=e,o=a.get(r);if(!o)return i(`SESSION_NOT_FOUND`,`logs requires an active session`);try{let t=js({...e,session:o}),r=(await t.bindDevice(o.device,b)).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=xs(S({action:n.positionals?.[0],restart:!!n.flags?.restart,marker:n.positionals?.slice(1).join(` `)}),o);return`ok`in i?i:await ys(t,i)}catch(e){return{ok:!1,error:t(e)}}}async function ys(e,t){switch(t.kind){case`path`:return Ss(e,(await(await e.bindDevice(e.session.device,t.use)).operations.appLogInspect()).backend);case`doctor`:return Cs(e,await(await e.bindDevice(e.session.device,t.use)).operations.appLogDoctor({appBundleId:e.session.appBundleId}));case`start`:case`clear-restart`:return await bs(e,t);case`stop`:return await e.bindDevice(e.session.device,t.use),await Os(e);case`mark`:return await e.bindDevice(e.session.device,t.use),ws(t.marker,e.sessionName,e.sessionStore);case`clear`:return await e.bindDevice(e.session.device,t.use),Ts(e)}}async function bs(e,t){let n=await e.bindDevice(e.session.device,t.use);return t.kind===`start`?await Ds(e,t.appBundleId,n.owner,n.operations.appLogStart):await Es(e,t.appBundleId,n.owner,n.operations.appLogStart)}function xs(e,t){return e.requiresAppSession?t.appBundleId?Object.freeze({...e,appBundleId:t.appBundleId}):i(`INVALID_ARGS`,`logs ${e.kind===`start`?`start`:`clear --restart`} requires an app session; run open <app> first`):e}function Ss(e,t){let{session:n,sessionName:r,sessionStore:i}=e,a=i.resolveAppLogPath(r),o=vo(a),s=fs(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 Cs(e,t){let{session:n,sessionName:r,sessionStore:i}=e,a=i.resolveAppLogPath(r),o=fs(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:hs(t.notes,o)}}}function ws(e,t,n){let r=n.resolveAppLogPath(t);return yo(r,e),{ok:!0,data:{path:r,marked:!0}}}function Ts(e){let{session:t,sessionName:n,sessionStore:r}=e;if(t.appLog)return i(`INVALID_ARGS`,`logs clear requires logs to be stopped first; run logs stop`);let a=bo(r.resolveAppLogPath(n));return hn({session:t,sessionName:n,sessionStore:r}),{ok:!0,data:a}}async function Es(e,t,n,r){let{session:i,sessionName:a,sessionStore:o}=e;i.appLog&&await gn({intent:`disposal`,session:i,sessionName:a,sessionStore:o,resourcePath:_n.resolvePath(o.resolveSessionDir(a))});let s=bo(o.resolveAppLogPath(a)),c=await ks(e,t,r,n);return c.ok?{ok:!0,data:{...s,restarted:!0}}:c}async function Ds(e,t,n,r){let{session:a}=e;return a.appLog?i(`INVALID_ARGS`,`app log already streaming; run logs stop first`):await ks(e,t,r,n)}async function Os(e){let{session:t,sessionName:n,sessionStore:r}=e;if(!t.appLog)return i(`INVALID_ARGS`,`no app log stream active`);let a=r.resolveAppLogPath(n);return await gn({intent:`capture`,session:t,sessionName:n,sessionStore:r,resourcePath:_n.resolvePath(r.resolveSessionDir(n))}),{ok:!0,data:{path:a,stopped:!0}}}async function ks(e,t,n,r){let{session:i,sessionName:a,sessionStore:o}=e,s=o.resolveAppLogPath(a),c=_n.resolvePath(o.resolveSessionDir(a));try{let l=xo({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 bn({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:vn({session:i,sessionName:a,sessionStore:o,error:e})}}}function As(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 js(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 Ms=new WeakMap;function Ns(e){return{store:t=>Ps(e,t),finalize:(t,n)=>Fs({...e,evidence:t,projection:n})}}function Ps(e,t){let{sessionStore:n,sessionName:r}=e,i;if(!n.update(e=>{Fe(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 Ms.set(s,{sessionName:r,session:a,sessionCreatedAt:a.createdAt,snapshot:t,snapshotGeneration:o,runtimeRevision:Ne(a),refFrame:Me(a)}),{evidence:s,refsGeneration:o}}function Fs(e){let t=Ms.get(e.evidence);Ms.delete(e.evidence);let n=Ls(e.projection.refs);return n.size===0?{published:!1,reason:`empty`}:e.signal?.aborted===!0?{published:!1,reason:`cancelled`}:!t||!Is(e,t)?{published:!1,reason:`stale-capture`}:e.projection.refsGeneration!==t.snapshotGeneration||!Rs(n,t.snapshot)?{published:!1,reason:`invalid-projection`}:(Re(t.session,n),{published:!0,refsGeneration:t.snapshotGeneration,refCount:n.size})}function Is(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&&Ne(n)===t.runtimeRevision&&Me(n)===t.refFrame}function Ls(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 Rs(e,t){let n=new Set(t.nodes.flatMap(e=>typeof e.ref==`string`?[e.ref]:[]));return[...e].every(e=>n.has(e))}function zs(e){let{sessionStore:t,mutationStore:n}=e,r=()=>t.get();return{view(){let e=r();if(e)return{repairBoundary:Te(e),pendingRecordAndHeal:e.pendingRecordAndHeal,scriptPublication:Bs(e.scriptPublication??We)}},armStep(e){n.update(t=>{Ae(t,{saveScript:e.saveScript,force:e.force,sourcePath:e.sourcePath,healedSiblingPath:Tt(e.sourcePath),firstArm:e.firstArm})})},demoteForRerunIfArmed(){Te(r())!==void 0&&n.update(Se)},markCompleteIfArmed(){Te(r())!==void 0&&n.update(Oe)},markSessionHeldIfArmed(e){if(e.ok||!ke(r()))return e;let t=ut(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&&Hs(t)})},resumeStamper:{sessionExists:()=>r()!==void 0,stampCorrectiveWatermark(e){n.update(t=>{Vs({session:t,...e})})}}}}function Bs(e){return{kind:e.kind,status:e.kind===`none`?void 0:e.status,targetPath:Ke(e),targetForce:Ve(e)}}function Vs(e){let{session:t,resume:n,repairHint:r,failedIndex:i,actions:a}=e;t.pendingRecordAndHeal=Us({resume:n,repairHint:r,failedIndex:i,actions:a,actionsCountAtDivergence:t.actions.length})}function Hs(e){e.pendingRecordAndHeal=void 0}function Us(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 Ws(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 $n({req:Gs(e),sessionName:e.sessionName,sessionStore:t,bindDevice:n,bindExactDevice:r,admissionLedger:i,requestScope:a,retainDeviceExecutionLock:o,throwIfCanceled:s})}}function Gs(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 Ks={resolveSessionScope:zn},qs=async({req:e,sessionName:t,logPath:n,sessionStore:r,invoke:i,invokeReplayAction:a})=>await Ot({...cr(e),session:Ys(t,n,r),invoke:ur(a??i,e),dependencies:Ks}),Js=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=Ws({sessionStore:i,bindDevice:c,bindExactDevice:u,screenRecordingAdmissionLedger:d,requestScope:f,retainDeviceExecutionLock:p,throwIfCanceled:m});return await Nt({...cr(t),session:Ys(n,r,i),createSession:(e,t)=>Ys(e,t,i),invoke:ur(s??o,t),dependencies:Ks,cleanupSession:async e=>await Xs({req:t,sessionName:e,logPath:r,sessionStore:i,leaseRegistry:a,inspectFacts:l,bindDevice:c,platformResourceCleanup:h}),...g?{video:g}:{}})};function Ys(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 sr(t,n,a,{createCoordinator:()=>zs({sessionStore:a,mutationStore:{update:i,clearRepairTombstone:()=>r.clearRepairTombstone(t)}}),assertSelectorMatches:e=>{let n=r.lookup(t);n&&Gn(n,e)},resolveOpenRuntimeHints:({request:e,device:n,platform:i})=>qt({req:e,sessionStore:{getRuntimeHints:e=>e===t?r.getRuntimeHints(t):void 0},sessionName:t,device:n,platform:i}),bindAuthority:e=>Ns({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 ze({device:a.device,session:a,flags:n,logPath:i})}})}async function Xs(t){let{req:n,sessionName:r,logPath:i,sessionStore:a}=t;if(!a.get(r))return;let o=await Ji({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 Zs(t){let{req:n,sessionName:r,sessionStore:i}=t;if(n.command!==Qe.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=ec(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.`));Ge(a,{explicitPath:s,liveForce:n.flags?.force});let c=i.writeSessionLog(a,{force:qe(a,n.flags?.force),publication:`active`});return c.written?(Xe(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 Qs(e){if(we(e))return`repair`;let t=e.scriptPublication;return t?.kind===`authoring`&&t.status!==`armed`?t.status:Ze(e)?void 0:`not-armed`}const $s={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 ec(e){let t=Qs(e);return t?$s[t]():void 0}function Y(e){return{ok:!1,error:t(e)}}function tc(e){let t=(e[0]??``).toLowerCase();return t===`read`||t===`write`?t:void 0}function nc(e){return{...e.appBundleId===void 0?{}:{options:{appBundleId:e.appBundleId}},execution:Le(e)}}async function rc(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(nc(n))}}async function ic(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={...nc(n),text:i};return await t.operations.writeClipboard(a),{action:`write`,textLength:Array.from(i).length,...F(`Clipboard updated`)}}async function ac(e){let{device:t,action:n,positionals:r,inspectFacts:i,bindDevice:a}=e;if(n===`read`){let e=await M({command:`clipboard`,device:t,use:ue,inspectFacts:i,bindDevice:a,readiness:{}});if(e.type===`response`)return{ok:!1,response:e.response};let n=e.runtime;return{ok:!0,execute:e=>rc(n,e,r)}}let o=await M({command:`clipboard`,device:t,use:he,inspectFacts:i,bindDevice:a,readiness:{}});if(o.type===`response`)return{ok:!1,response:o.response};let s=o.runtime;return{ok:!0,execute:e=>ic(s,e,r)}}async function oc(e){let{req:t,sessionName:n,logPath:r,sessionStore:a,inspectFacts:o,bindDevice:s}=e,c=a.get(n),l=t.flags??{},d=G(N.clipboard,c,l);if(d)return d;let f=t.positionals??[],p=tc(f);if(!p)return i(`INVALID_ARGS`,`clipboard requires a subcommand: read or write`);let m=await K({session:c,flags:l}),h=await ac({device:m,action:p,positionals:f,inspectFacts:o,bindDevice:s});if(!h.ok)return h.response;let g=await h.execute(Ie(r,t.flags,c?.appBundleId,c?.trace?.outPath));return k(a,c,t,t.command,g),{ok:!0,data:{platform:u(m),...g}}}function sc(e){return e.some(e=>e.status===`fail`)?`fail`:e.some(e=>e.status===`warn`)?`warn`:`pass`}function cc(e){return e===`fail`?`Blockers found before the run.`:e===`warn`?`No hard blockers found, but warnings need attention.`:`No blockers found.`}function lc(e){let t={fail:0,warn:1,pass:2,info:3};return[...e].sort((e,n)=>t[e.status]-t[n.status])}function uc(e,...t){for(let n of t)X(e,n)}function X(e,t){e.push(t),xt({type:`command`,status:`progress`,message:dc(t)})}function dc(e){return[Qn(e),...Zn(e)].join(`
2
+ `)}async function fc(e,n){let{device:r,targetApp:i,session:a,listInstalledApps:o}=n;if(i)try{let t=o?pc(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 pc(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 mc(e,n,r){let i=gc(n,r);try{let t=await vc(i),n=_c(t.devices,i);return X(e,{id:`device`,status:n.length===0?`fail`:`pass`,summary:Sc(n,i,t.failures),hint:n.length===0?Tc(t.failures):void 0,command:n.length===0?kc(i):void 0,evidence:Ac(n,t.failures)}),n.length>0&&yc(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 hc(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 gc(e,t){let n=e.flags??{};return Rn({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 _c(e,t){return e.filter(e=>h(e,t,{includeExplicitSelectors:!0}))}async function vc(e){if(e.platform)return{devices:await z(e),failures:[]};let t=[],n=[];for(let r of it)try{t.push(...await z({...e,platform:r}))}catch(e){n.push(xc(r,e))}return{devices:t,failures:n}}function yc(e,t){for(let n of t)X(e,bc(n))}function bc(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 xc(e,n){let r=t(n);return{platform:e,message:r.message,hint:r.hint,code:r.code}}function Sc(e,t,n){if(e.length===0)return n.length>0?`No ${Cc(t)} devices found; ${wc(n)}.`:`No ${Cc(t)} devices found.`;let r=e.filter(e=>e.booted===!0).length,i=`${e.length} ${Cc(t)} ${Oc(e.length,`device`)} available; ${r} booted`,a=Ec(e,t);return a?`${i} (${a}).`:`${i}.`}function Cc(e){let t=e.platform?Z(e.platform):`local`;return e.target?`${t} ${e.target}`:t}function wc(e){return e.slice(0,2).map(e=>`${Z(e.platform)} inventory failed: ${e.message}`).join(`; `)}function Tc(e){return e.find(e=>e.hint)?.hint??`Start or create a simulator/emulator, connect a device, or adjust --platform/--target/--device selectors.`}function Ec(e,t){if(t.platform||t.target)return;let n=rt(e),r=Dc();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 Dc(){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 Oc(e,t){return e===1?t:`${t}s`}function kc(e){return e.platform?`agent-device devices --platform ${e.platform}`:`agent-device devices`}function Ac(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 jc=1500;async function Mc(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 Nc(e,t,r):void 0;return{id:`metro`,status:s?`pass`:`warn`,summary:s?Pc(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 Nc(e,t,n){try{return await(n.resolveProcessInfo??Fc)(e,t)}catch{return}}function Pc(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 Fc(e,t){if(!Ic(e))return;let n=await Lc(t);if(n!==void 0)return{pid:n,cwd:await Rc(n)}}function Ic(e){return e===`127.0.0.1`||e===`localhost`||e===`::1`||e===`0.0.0.0`}async function Lc(e){let t=await lt(`lsof`,[`-nP`,`-iTCP:${e}`,`-sTCP:LISTEN`,`-Fp`],{allowFailure:!0,timeoutMs:jc});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 Rc(e){let t=await lt(`lsof`,[`-nP`,`-a`,`-p`,String(e),`-d`,`cwd`,`-Fn`],{allowFailure:!0,timeoutMs:jc});if(t.exitCode===0)return t.stdout.split(`
4
- `).find(e=>e.startsWith(`n`)&&e.length>1)?.slice(1)}const zc=[`daemonBaseUrl`,`tenant`,`runId`,`leaseId`,`leaseProvider`],Bc=[`provider`,`providerSessionId`,`providerApp`,`providerOsVersion`,`providerProject`,`providerBuild`,`providerSessionName`,`providerDeviceOrientation`,`providerGeoLocation`,`providerTimezone`,`providerAppiumVersion`,`providerLanguage`,`providerLocale`,`providerNetworkProfile`,`providerCustomNetwork`,`providerNoResignApp`,`awsProjectArn`,`awsDeviceArn`,`awsAppArn`,`awsRegion`,`awsInteractionMode`];function Vc(e,t){let n=mt(e.meta?.cwd);return{targetApp:Kc(e.flags?.targetApp)??t?.appBundleId,metroHost:Kc(e.runtime?.metroHost)??`127.0.0.1`,metroPort:qc(e.runtime?.metroPort)??8081,kind:n,remote:e.flags?.remote===!0,shouldProbeMetro:Wc(e,n)}}function Hc(e,t={}){let n=Gc(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 Uc(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 ${g(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 Wc(e,t){return t!==`auto`||typeof e.runtime?.metroPort==`number`||typeof e.runtime?.metroHost==`string`}function Gc(e){let t={...Object.fromEntries([...zc,...Bc].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 Kc(e){return typeof e==`string`&&e.trim().length>0?e.trim():void 0}function qc(e){return typeof e==`number`&&Number.isInteger(e)&&e>0?e:void 0}async function Jc(e){let{req:t,sessionName:n,sessionStore:r,androidAdbExecutor:i,inspectFacts:a,bindDevice:o}=e;if(t.command!==N.doctor)return null;let s=Yc(e.hostDiagnostics),c=r.get(n),l=Vc(t,c),u=Qc(r,n),d=[];if(uc(d,{id:`agent-device`,status:`pass`,summary:`agent-device ${dt()} using ${u}`,evidence:{version:dt(),stateDir:u}},...Hc(t,{required:l.remote}),...Uc(r,n,c,{remote:l.remote})),l.remote)return rl(d,l);let f=Xc(l,u,i),p=await mc(d,t,c),m=await s.toolchainCheck(c?.device.platform??p?.platform,f);m&&X(d,m);let h=await $c({checks:d,context:f,hostDiagnostics:s,inventory:p,options:l,session:c,inspectFacts:a,bindDevice:o,req:t}),g=h??Zc(p);if(g){let e=await s.warmupCheck(g,f);e&&X(d,e)}return rl(d,l,{device:h,includeMetro:!0,inventory:p})}function Yc(t){if(!t)throw new e(`COMMAND_FAILED`,`Host diagnostics gateway is not configured`,{reason:`runtime-gateway-missing`});return t}function Xc(e,t,n){return Object.freeze({stateDir:t,metroPort:e.metroPort,shouldProbeMetro:e.shouldProbeMetro,isProviderDevice:e=>an(e),emitProgress:e=>xt({type:`command`,status:`progress`,message:e}),listLocalDeviceInventory:async e=>await Fn(e),shouldPropagateInventoryProbeError:Pn,transportOverrides:Object.freeze({androidAdb:n})})}function Zc(e){let t=(e?.devices??[]).filter(e=>p(e)&&e.kind===`simulator`);return t.find(e=>e.booted===!0)??t[0]}function Qc(e,t){let n=U.dirname(e.resolveSessionDir(t));return U.basename(n)===`sessions`?U.dirname(n):n}async function $c(e){let{checks:t,context:n,hostDiagnostics:r,inventory:i,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}=e,u=o?.device??hc(t,i,a.targetApp);return u&&await el(t,{context:n,hostDiagnostics:r,device:u,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}),a.shouldProbeMetro&&X(t,await Mc(a.metroHost,a.metroPort,a.kind)),uc(t,...await r.ambientChecks(n)),u}async function el(e,t){let{context:n,hostDiagnostics:r,device:i,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}=t,u;try{u=await tl({device:i,req:l,targetApp:a.targetApp,inspectFacts:s,bindDevice:c})}catch(e){u=async()=>{throw e}}await fc(e,{device:i,session:o,targetApp:a.targetApp,listInstalledApps:u}),uc(e,...await r.deviceChecks(i,n))}async function tl(e){if(e.device.platform!==`harmonyos`)return nl(e)}async function nl(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,me),u=R(n.flags?.androidDeviceAllowlist),d=await $i(l,{serial:n.flags?.serial,androidSerialAllowlist:u?[...u].sort():void 0});return async e=>await ea(l,d,e)}function rl(e,t,n={}){let r=sc(e);return{ok:!0,data:{status:r,summary:cc(r),kind:t.kind,platform:n.device?g(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:lc(e)}}}async function il(e){return await M({...e,command:`prepare`,use:ge})}async function al(e){let{req:t,sessionName:n,logPath:r,sessionStore:a}=e,o=t.positionals?.[0]??``;if(o!==`ios-runner`)return i(`INVALID_ARGS`,`prepare requires a subcommand: ios-runner`);let s=a.get(n),c=t.flags??{},l=G(N.prepare,s,c);if(l)return l;let u=await K({session:s,flags:c}),d=await il({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:ol(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:An(t)}});return{ok:!0,data:sl(o,u,Math.max(0,Date.now()-f),p)}}function ol(e){let t=e.flags?.timeoutMs;return typeof t==`number`&&Number.isFinite(t)&&t>0?t:ve}function sl(e,t,n,r){return{action:e,platform:g(t),deviceId:t.id,deviceName:t.name,kind:t.kind,durationMs:n,...r,timing:cl(n,r),message:`Prepared Apple runner: ${t.name}`}}function cl(e,t){let n=ll(t.buildMs),r=ul(t.connectMs),i=ul(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 ll(e){return e===void 0?void 0:ul(e)}function ul(e){return Number.isFinite(e)?Math.max(0,Math.round(e)):0}const Q=e=>ta(e),dl=e=>ao({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,reconcileOrphanedDeviceClaim:e.reconcileOrphanedDeviceClaim}),fl=e=>Ji({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}),pl=async({req:e,sessionName:t,sessionStore:n,inspectFacts:r,bindDevice:i})=>await ho({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 gs({req:e,sessionName:t,sessionStore:n,bindDevice:r,inspectFacts:i,appLogAdmissionLedger:a,audioProbeAdmissionLedger:o,perfCaptureAdmissionLedger:s,throwIfCanceled:c}),ml={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 Jc({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r,hostDiagnostics:i,inspectFacts:a,bindDevice:o}),boot:pl,shutdown:pl,appstate:pl,session_save_script:async({req:e,sessionName:t,sessionStore:n})=>Zs({req:e,sessionName:t,sessionStore:n}),runtime:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a})=>await Pr({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 oc({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a}),keyboard:di,perf:$,logs:$,events:$,network:$,audio:$,prepare:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a})=>await al({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a}),install:q,reinstall:q,install_source:q,release_materialized_paths:async({req:e})=>await vr({req:e}),push:q,"trigger-app-event":fi,open:dl,replay:qs,test:Js,batch:async({req:e,sessionName:t,invoke:n})=>await Ti(e,t,n),close:fl};async function hl(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a=new Xt,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:S,platformResourceCleanup:C}=e,w=ml[t.command];return w?await w({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:S,platformResourceCleanup:C}):null}export{hl as handleSessionCommands};
4
+ `).find(e=>e.startsWith(`n`)&&e.length>1)?.slice(1)}const zc=[`daemonBaseUrl`,`tenant`,`runId`,`leaseId`,`leaseProvider`],Bc=[`provider`,`providerSessionId`,`providerApp`,`providerOsVersion`,`providerProject`,`providerBuild`,`providerSessionName`,`providerDeviceOrientation`,`providerGeoLocation`,`providerTimezone`,`providerAppiumVersion`,`providerLanguage`,`providerLocale`,`providerNetworkProfile`,`providerCustomNetwork`,`providerNoResignApp`,`awsProjectArn`,`awsDeviceArn`,`awsAppArn`,`awsRegion`,`awsInteractionMode`];function Vc(e,t){let n=mt(e.meta?.cwd);return{targetApp:Kc(e.flags?.targetApp)??t?.appBundleId,metroHost:Kc(e.runtime?.metroHost)??`127.0.0.1`,metroPort:qc(e.runtime?.metroPort)??8081,kind:n,remote:e.flags?.remote===!0,shouldProbeMetro:Wc(e,n)}}function Hc(e,t={}){let n=Gc(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 Uc(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 Wc(e,t){return t!==`auto`||typeof e.runtime?.metroPort==`number`||typeof e.runtime?.metroHost==`string`}function Gc(e){let t={...Object.fromEntries([...zc,...Bc].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 Kc(e){return typeof e==`string`&&e.trim().length>0?e.trim():void 0}function qc(e){return typeof e==`number`&&Number.isInteger(e)&&e>0?e:void 0}async function Jc(e){let{req:t,sessionName:n,sessionStore:r,androidAdbExecutor:i,inspectFacts:a,bindDevice:o}=e;if(t.command!==N.doctor)return null;let s=Yc(e.hostDiagnostics),c=r.get(n),l=Vc(t,c),u=Qc(r,n),d=[];if(uc(d,{id:`agent-device`,status:`pass`,summary:`agent-device ${dt()} using ${u}`,evidence:{version:dt(),stateDir:u}},...Hc(t,{required:l.remote}),...Uc(r,n,c,{remote:l.remote})),l.remote)return rl(d,l);let f=Xc(l,u,i),p=await mc(d,t,c),m=await s.toolchainCheck(c?.device.platform??p?.platform,f);m&&X(d,m);let h=await $c({checks:d,context:f,hostDiagnostics:s,inventory:p,options:l,session:c,inspectFacts:a,bindDevice:o,req:t}),g=h??Zc(p);if(g){let e=await s.warmupCheck(g,f);e&&X(d,e)}return rl(d,l,{device:h,includeMetro:!0,inventory:p})}function Yc(t){if(!t)throw new e(`COMMAND_FAILED`,`Host diagnostics gateway is not configured`,{reason:`runtime-gateway-missing`});return t}function Xc(e,t,n){return Object.freeze({stateDir:t,metroPort:e.metroPort,shouldProbeMetro:e.shouldProbeMetro,isProviderDevice:e=>an(e),emitProgress:e=>xt({type:`command`,status:`progress`,message:e}),listLocalDeviceInventory:async e=>await Fn(e),shouldPropagateInventoryProbeError:Pn,transportOverrides:Object.freeze({androidAdb:n})})}function Zc(e){let t=(e?.devices??[]).filter(e=>d(e)&&e.kind===`simulator`);return t.find(e=>e.booted===!0)??t[0]}function Qc(e,t){let n=U.dirname(e.resolveSessionDir(t));return U.basename(n)===`sessions`?U.dirname(n):n}async function $c(e){let{checks:t,context:n,hostDiagnostics:r,inventory:i,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}=e,u=o?.device??hc(t,i,a.targetApp);return u&&await el(t,{context:n,hostDiagnostics:r,device:u,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}),a.shouldProbeMetro&&X(t,await Mc(a.metroHost,a.metroPort,a.kind)),uc(t,...await r.ambientChecks(n)),u}async function el(e,t){let{context:n,hostDiagnostics:r,device:i,options:a,session:o,inspectFacts:s,bindDevice:c,req:l}=t,u;try{u=await tl({device:i,req:l,targetApp:a.targetApp,inspectFacts:s,bindDevice:c})}catch(e){u=async()=>{throw e}}await fc(e,{device:i,session:o,targetApp:a.targetApp,listInstalledApps:u}),uc(e,...await r.deviceChecks(i,n))}async function tl(e){if(e.device.platform!==`harmonyos`)return nl(e)}async function nl(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,me),u=R(n.flags?.androidDeviceAllowlist),d=await $i(l,{serial:n.flags?.serial,androidSerialAllowlist:u?[...u].sort():void 0});return async e=>await ea(l,d,e)}function rl(e,t,n={}){let r=sc(e);return{ok:!0,data:{status:r,summary:cc(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:lc(e)}}}async function il(e){return await M({...e,command:`prepare`,use:ge})}async function al(e){let{req:t,sessionName:n,logPath:r,sessionStore:a}=e,o=t.positionals?.[0]??``;if(o!==`ios-runner`)return i(`INVALID_ARGS`,`prepare requires a subcommand: ios-runner`);let s=a.get(n),c=t.flags??{},l=G(N.prepare,s,c);if(l)return l;let u=await K({session:s,flags:c}),d=await il({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:ol(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:An(t)}});return{ok:!0,data:sl(o,u,Math.max(0,Date.now()-f),p)}}function ol(e){let t=e.flags?.timeoutMs;return typeof t==`number`&&Number.isFinite(t)&&t>0?t:de}function sl(e,t,n,r){return{action:e,platform:u(t),deviceId:t.id,deviceName:t.name,kind:t.kind,durationMs:n,...r,timing:cl(n,r),message:`Prepared Apple runner: ${t.name}`}}function cl(e,t){let n=ll(t.buildMs),r=ul(t.connectMs),i=ul(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 ll(e){return e===void 0?void 0:ul(e)}function ul(e){return Number.isFinite(e)?Math.max(0,Math.round(e)):0}const Q=e=>ta(e),dl=e=>ao({req:e.req,sessionName:e.sessionName,logPath:e.logPath,sessionStore:e.sessionStore,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,reconcileOrphanedDeviceClaim:e.reconcileOrphanedDeviceClaim}),fl=e=>Ji({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}),pl=async({req:e,sessionName:t,sessionStore:n,inspectFacts:r,bindDevice:i})=>await ho({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 gs({req:e,sessionName:t,sessionStore:n,bindDevice:r,inspectFacts:i,appLogAdmissionLedger:a,audioProbeAdmissionLedger:o,perfCaptureAdmissionLedger:s,throwIfCanceled:c}),ml={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 Jc({req:e,sessionName:t,sessionStore:n,androidAdbExecutor:r,hostDiagnostics:i,inspectFacts:a,bindDevice:o}),boot:pl,shutdown:pl,appstate:pl,session_save_script:async({req:e,sessionName:t,sessionStore:n})=>Zs({req:e,sessionName:t,sessionStore:n}),runtime:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a})=>await Pr({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 oc({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a}),keyboard:di,perf:$,logs:$,events:$,network:$,audio:$,prepare:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a})=>await al({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a}),install:q,reinstall:q,install_source:q,release_materialized_paths:async({req:e})=>await vr({req:e}),push:q,"trigger-app-event":fi,open:dl,replay:qs,test:Js,batch:async({req:e,sessionName:t,invoke:n})=>await Ti(e,t,n),close:fl};async function hl(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,leaseRegistry:a=new Xt,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:S,platformResourceCleanup:C}=e,w=ml[t.command];return w?await w({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:S,platformResourceCleanup:C}):null}export{hl as handleSessionCommands};
@@ -1 +1 @@
1
- import{u as e}from"./sdk-device.js";import"./command.js";import{r as t}from"./device-isolation.js";import{o as n}from"./tool-provider.js";function r(e,n={}){let r=t(n.simulatorSetPath);return r?[`simctl`,`--set`,r,...e]:[`simctl`,...e]}function i(t,n){return!e(t)||t.kind!==`simulator`?[`simctl`,...n]:r(n,{simulatorSetPath:t.simulatorSetPath})}function a(e,t,r){return n(i(e,t),r)}export{a as n,i as t};
1
+ import{d as e}from"./sdk-device.js";import"./command.js";import{r as t}from"./device-isolation.js";import{o as n}from"./tool-provider.js";function r(e,n={}){let r=t(n.simulatorSetPath);return r?[`simctl`,`--set`,r,...e]:[`simctl`,...e]}function i(t,n){return!e(t)||t.kind!==`simulator`?[`simctl`,...n]:r(n,{simulatorSetPath:t.simulatorSetPath})}function a(e,t,r){return n(i(e,t),r)}export{a as n,i as t};
@@ -1,3 +1,3 @@
1
- import{u 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{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(`
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{i as e,n as t,t as n}from"./simulator.js";export{n as ensureBootedSimulator,t as markSimulatorBooted,e as wasSimulatorRecentlyObservedBooted};
1
+ import{a as e,n as t,t as n}from"./simulator.js";export{n as ensureBootedSimulator,t as markSimulatorBooted,e as wasSimulatorRecentlyObservedBooted};
@@ -1 +1 @@
1
- import{D 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{r as l,s as u}from"./config.js";import{a as d,o as f}from"./tool-provider.js";import{t as p}from"./simctl.js";const m=[`Simulator`],h=[`Device Hub`,`Simulator`],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={}){let t=e.deviceHub?h:m,n=e.background?[`-g`,`-a`]:[`-a`];for(let r of t)if((await d(`open`,[...n,r],{allowFailure:!0,signal:e.signal,timeoutMs:1e4})).exitCode===0)return}async function w(a,c={}){if(a.kind!==`simulator`)return;c.signal?.throwIfAborted();let u=g.resolve();if(u){await u(a),c.signal?.throwIfAborted();return}if((b(a)?`Booted`:await T(a,c.signal))===`Booted`){x(a),c.focusExisting&&await C({background:c.deviceHub,deviceHub:c.deviceHub,signal:c.signal});return}c.onColdBootStart?.(a);let d=i.fromTimeoutMs(l),m,h;try{await r(async({deadline:r})=>{if(r?.isExpired())throw new e(`COMMAND_FAILED`,`iOS simulator boot deadline exceeded`,{timeoutMs:l});let i=Math.max(1e3,r?.remainingMs()??18e4);m=await f(p(a,[`boot`,a.id]),{allowFailure:!0,signal:c.signal,timeoutMs:i});let o=`${m.stdout}\n${m.stderr}`.toLowerCase(),s=o.includes(`already booted`)||o.includes(`current state: booted`);if(m.exitCode!==0&&!s)throw new e(`COMMAND_FAILED`,`simctl boot failed`,n(m));h=await f(p(a,[`bootstatus`,a.id,`-b`]),{allowFailure:!0,signal:c.signal,timeoutMs:i}),t(h,`simctl bootstatus failed`);let u=await T(a,c.signal);if(u!==`Booted`)throw new e(`COMMAND_FAILED`,`Simulator is still booting`,{state:u})},{maxAttempts:3,baseDelayMs:500,maxDelayMs:2e3,jitter:.2,shouldRetry:e=>{let t=o({error:e,stdout:h?.stdout??m?.stdout,stderr:h?.stderr??m?.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??m?.stdout,stderr:h?.stderr??m?.stderr,context:{platform:`ios`,phase:`boot`}})})}catch(t){let n=o({error:t,stdout:h?.stdout??m?.stdout,stderr:h?.stderr??m?.stderr,context:{platform:`ios`,phase:`boot`}});throw new e(`COMMAND_FAILED`,`iOS simulator failed to boot`,{platform:`ios`,deviceId:a.id,timeoutMs:l,elapsedMs:d.elapsedMs(),reason:n,hint:s(n),boot:m,bootstatus:h})}x(a),await C({deviceHub:c.deviceHub,signal:c.signal})}async function T(e,t){let n=p(e,[`list`,`devices`,`-j`]),r=await f(n,{allowFailure:!0,signal:t,timeoutMs:u});if(r.exitCode!==0)return null;try{let t=JSON.parse(r.stdout);for(let n of Object.values(t.devices??{})){let t=n.find(t=>t.udid===e.id);if(t)return t.state}return null}catch{return null}}export{_ as a,b as i,x as n,S as r,w as t};
1
+ import{D 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}from"./config.js";import{a as d,o as f}from"./tool-provider.js";import{t as p}from"./simctl.js";const m=[`Simulator`],h=[`Device Hub`,`Simulator`],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={}){let t=e.deviceHub?h:m,n=e.background?[`-g`,`-a`]:[`-a`];for(let r of t)if((await d(`open`,[...n,r],{allowFailure:!0,signal:e.signal,timeoutMs:1e4})).exitCode===0)return}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),c.focusExisting&&await C({background:c.deviceHub,deviceHub:c.deviceHub,signal:c.signal});return}c.onColdBootStart?.(a);let d=i.fromTimeoutMs(u),m,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);m=await f(p(a,[`boot`,a.id]),{allowFailure:!0,signal:c.signal,timeoutMs:i});let o=`${m.stdout}\n${m.stderr}`.toLowerCase(),s=o.includes(`already booted`)||o.includes(`current state: booted`);if(m.exitCode!==0&&!s)throw new e(`COMMAND_FAILED`,`simctl boot failed`,n(m));h=await f(p(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??m?.stdout,stderr:h?.stderr??m?.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??m?.stdout,stderr:h?.stderr??m?.stderr,context:{platform:`ios`,phase:`boot`}})})}catch(t){let n=o({error:t,stdout:h?.stdout??m?.stdout,stderr:h?.stderr??m?.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:m,bootstatus:h})}x(a),await C({deviceHub:c.deviceHub,signal:c.signal})}async function T(e,t){let n=p(e,[`list`,`devices`,`-j`]),r=await f(n,{allowFailure:!0,signal:t,timeoutMs:l});if(r.exitCode!==0)return null;try{let t=JSON.parse(r.stdout);for(let n of Object.values(t.devices??{})){let t=n.find(t=>t.udid===e.id);if(t)return t.state}return null}catch{return null}}export{b as a,S as i,x as n,_ as o,C as r,w as t};
@@ -1 +1 @@
1
- import{o as e}from"./sdk-contracts.js";import{u as t}from"./sdk-device.js";import{Lt as n}from"./sdk-batch.js";import"./session-store.js";import{l as r,p as i,v as a}from"./session-snapshot.js";import{s as o}from"./device-shell.js";import{i as s,n as c}from"./request-runtime-binding.js";import{n as l}from"./dispatch-resolve.js";import{a as u,i as d,n as f,t as p}from"./session-runtime-admission.js";async function m(e,t,n){let r=e.get(t);return{session:r,device:r?.device??await l(n??{})}}async function h(e,t,n,r){if(!e&&!r)throw Error(`Platform resource cleanup was not injected`);try{return await n()}finally{!e&&!s(t)&&await r.cleanupSessionlessExecutionHost(t)}}function g(e,t,n,r){t&&e.recordAction(t,{command:n.command,positionals:n.positionals??[],flags:n.flags??{},result:r})}function _(e){let{session:t,sessionName:n,sessionScope:r,device:i,snapshot:a,appBundleId:o}=e;return t?{...t,snapshot:a,lastComparisonSafeSnapshot:a?.comparisonSafe===!0?a:t.lastComparisonSafeSnapshot}:{name:n,sessionScope:r,device:i,createdAt:Date.now(),appBundleId:o,snapshot:a,...a?.comparisonSafe===!0?{lastComparisonSafeSnapshot:a}:{},actions:[]}}async function v(e){if(!t(e)||e.kind!==`simulator`)return;let n=await a.resolveSoleForegroundApp({simulatorSetPath:e.simulatorSetPath});if(!n)return;let r=y(n.device,n.app.bundleId),i=`One booted device found ("${n.device.name}", udid ${n.device.id}) with ${n.app.bundleId} running. Run: ${r}`;return i.length<=350?i:void 0}function y(e,t){let n=e.simulatorSetPath?` --ios-simulator-device-set ${o(e.simulatorSetPath)}`:``;return`agent-device open ${t} --platform ios --udid ${e.id}${n}`}function b(e){let{readTextAtPoint:t}=e.operations,n=t?{operations:{readTextAtPoint:t}}:void 0;return Object.freeze(n?{readTextAtPoint:async e=>await n.operations.readTextAtPoint(e)}:{})}function x(e){let{findText:t}=e.operations;return Object.freeze(t?{findText:async e=>{e.signal?.throwIfAborted();try{let n=await t(e);return e.signal?.throwIfAborted(),n}catch{return e.signal?.throwIfAborted(),{found:!1}}}}:{})}function S(e){let{focusPoint:t,typeText:n}=e.operations;return Object.freeze({...t?{focusPoint:t}:{},...n?{typeText:n}:{}})}async function C(e){let{command:t,device:n,session:r,plan:i}=e,a=await p({device:n,plan:i,inspectFacts:e.inspectFacts});if(!a.admitted)return{ok:!1,response:await j({operation:a.operation,fact:a.fact,session:r,device:n,command:t})};let o=await T(e.bindDevice,a,e.readiness);return Object.freeze({ok:!0,capture:async e=>await o.captureSnapshot(e),...o.readTextAtPoint?{readTextAtPoint:o.readTextAtPoint}:{},...o.findText?{findText:o.findText}:{},...o.focusPoint?{focusPoint:o.focusPoint}:{},...o.typeText?{typeText:o.typeText}:{}})}async function w(e,t){let{req:a,sessionName:o,sessionStore:s}=e,{session:c,device:l}=await m(s,o,a.flags),u=r(a.flags?.snapshotScope,c);if(!u.ok)return{ok:!1,response:u};let d=await C({command:t,device:l,session:c,plan:n({customActions:a.flags?.snapshotCustomActions===!0,hasActiveApp:c?.appBundleId!==void 0}),inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,...c?{}:{readiness:{}}});if(!d.ok)return d;let f=i({flags:a.flags,logPath:e.logPath,meta:a.meta,session:c,snapshotScope:u.scope});return Object.freeze({ok:!0,session:c,device:l,snapshotScope:u.scope,captureSnapshot:async()=>await d.capture(f)})}async function T(e,t,n){let r=f(e),i=async(e,t)=>{let i=await r(e,t);return n!==void 0&&await c(i,n),i},{device:a,plan:o}=u(t);switch(o.kind){case`active-app`:return O(await i(a,o.use));case`selector-active-app`:return await E(i,a,o);case`custom-actions-active-app`:return k(await i(a,o.use));case`without-active-app`:return A(await i(a,o.use));case`selector-without-active-app`:return await D(i,a,o);case`custom-actions-without-active-app`:return k(await i(a,o.use))}}async function E(e,t,n){switch(n.intent){case`capture-only`:return O(await e(t,n.use));case`element-text`:{let r=await e(t,n.use);return{...O(r),...b(r)}}case`wait-observation`:{let r=await e(t,n.use);return{...O(r),...x(r)}}case`find-focus`:{let r=await e(t,n.use);return{...O(r),...S(r)}}case`find-type`:{let r=await e(t,n.use);return{...O(r),...S(r)}}}}async function D(e,t,n){switch(n.intent){case`capture-only`:return A(await e(t,n.use));case`element-text`:{let r=await e(t,n.use);return{...A(r),...b(r)}}case`wait-observation`:{let r=await e(t,n.use);return{...A(r),...x(r)}}case`find-focus`:{let r=await e(t,n.use);return{...A(r),...S(r)}}case`find-type`:{let r=await e(t,n.use);return{...A(r),...S(r)}}}}function O(e){return Object.freeze({captureSnapshot:async t=>await e.operations.captureSnapshot(t)})}function k(e){return Object.freeze({captureSnapshot:async t=>await e.operations.captureSnapshotWithCustomActions(t)})}function A(e){return Object.freeze({captureSnapshot:async t=>await e.operations.captureSnapshotWithoutActiveApp(t)})}async function j(t){if(t.operation===`captureSnapshot`||t.operation===`focusPoint`||t.operation===`typeText`)return d(t.command,t.fact);if(t.operation===`captureSnapshotWithCustomActions`)return M(t);let n=await v(t.device);return e(`SESSION_NOT_FOUND`,`iOS ${t.command} requires an active app session on the target device. Run open first (for example: open --session ${t.session?.name??`sim`} --platform ios --device "<name>" <app>).`,{reason:`ios_app_session_required`,...n?{hint:n}:{}})}function M(t){let n=t.command===`diff`?`--actions requires an iOS simulator: custom actions are read through the private accessibility snapshot backend, which ${t.device.platform}/${t.device.kind} targets do not have.`:`--actions requires an iOS simulator: custom actions are unavailable on this ${t.device.platform}/${t.device.kind} target.`;return e(`UNSUPPORTED_OPERATION`,n,{reason:t.fact.available?void 0:t.fact.reason},{hint:t.command===`diff`||t.fact.available||!t.fact.hint?`Re-run without --actions, or target an iOS simulator.`:t.fact.hint})}export{m as a,g as i,w as n,h as o,_ as r,C as t};
1
+ import{o as e}from"./sdk-contracts.js";import{d as t}from"./sdk-device.js";import{zt as n}from"./sdk-batch.js";import"./session-store.js";import{l as r,p as i,v as a}from"./session-snapshot.js";import{s as o}from"./device-shell.js";import{i as s,n as c}from"./request-runtime-binding.js";import{n as l}from"./dispatch-resolve.js";import{a as u,i as d,n as f,t as p}from"./session-runtime-admission.js";async function m(e,t,n){let r=e.get(t);return{session:r,device:r?.device??await l(n??{})}}async function h(e,t,n,r){if(!e&&!r)throw Error(`Platform resource cleanup was not injected`);try{return await n()}finally{!e&&!s(t)&&await r.cleanupSessionlessExecutionHost(t)}}function g(e,t,n,r){t&&e.recordAction(t,{command:n.command,positionals:n.positionals??[],flags:n.flags??{},result:r})}function _(e){let{session:t,sessionName:n,sessionScope:r,device:i,snapshot:a,appBundleId:o}=e;return t?{...t,snapshot:a,lastComparisonSafeSnapshot:a?.comparisonSafe===!0?a:t.lastComparisonSafeSnapshot}:{name:n,sessionScope:r,device:i,createdAt:Date.now(),appBundleId:o,snapshot:a,...a?.comparisonSafe===!0?{lastComparisonSafeSnapshot:a}:{},actions:[]}}async function v(e){if(!t(e)||e.kind!==`simulator`)return;let n=await a.resolveSoleForegroundApp({simulatorSetPath:e.simulatorSetPath});if(!n)return;let r=y(n.device,n.app.bundleId),i=`One booted device found ("${n.device.name}", udid ${n.device.id}) with ${n.app.bundleId} running. Run: ${r}`;return i.length<=350?i:void 0}function y(e,t){let n=e.simulatorSetPath?` --ios-simulator-device-set ${o(e.simulatorSetPath)}`:``;return`agent-device open ${t} --platform ios --udid ${e.id}${n}`}function b(e){let{readTextAtPoint:t}=e.operations,n=t?{operations:{readTextAtPoint:t}}:void 0;return Object.freeze(n?{readTextAtPoint:async e=>await n.operations.readTextAtPoint(e)}:{})}function x(e){let{findText:t}=e.operations;return Object.freeze(t?{findText:async e=>{e.signal?.throwIfAborted();try{let n=await t(e);return e.signal?.throwIfAborted(),n}catch{return e.signal?.throwIfAborted(),{found:!1}}}}:{})}function S(e){let{focusPoint:t,typeText:n}=e.operations;return Object.freeze({...t?{focusPoint:t}:{},...n?{typeText:n}:{}})}async function C(e){let{command:t,device:n,session:r,plan:i}=e,a=await p({device:n,plan:i,inspectFacts:e.inspectFacts});if(!a.admitted)return{ok:!1,response:await j({operation:a.operation,fact:a.fact,session:r,device:n,command:t})};let o=await T(e.bindDevice,a,e.readiness);return Object.freeze({ok:!0,capture:async e=>await o.captureSnapshot(e),...o.readTextAtPoint?{readTextAtPoint:o.readTextAtPoint}:{},...o.findText?{findText:o.findText}:{},...o.focusPoint?{focusPoint:o.focusPoint}:{},...o.typeText?{typeText:o.typeText}:{}})}async function w(e,t){let{req:a,sessionName:o,sessionStore:s}=e,{session:c,device:l}=await m(s,o,a.flags),u=r(a.flags?.snapshotScope,c);if(!u.ok)return{ok:!1,response:u};let d=await C({command:t,device:l,session:c,plan:n({customActions:a.flags?.snapshotCustomActions===!0,hasActiveApp:c?.appBundleId!==void 0}),inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,...c?{}:{readiness:{}}});if(!d.ok)return d;let f=i({flags:a.flags,logPath:e.logPath,meta:a.meta,session:c,snapshotScope:u.scope});return Object.freeze({ok:!0,session:c,device:l,snapshotScope:u.scope,captureSnapshot:async()=>await d.capture(f)})}async function T(e,t,n){let r=f(e),i=async(e,t)=>{let i=await r(e,t);return n!==void 0&&await c(i,n),i},{device:a,plan:o}=u(t);switch(o.kind){case`active-app`:return O(await i(a,o.use));case`selector-active-app`:return await E(i,a,o);case`custom-actions-active-app`:return k(await i(a,o.use));case`without-active-app`:return A(await i(a,o.use));case`selector-without-active-app`:return await D(i,a,o);case`custom-actions-without-active-app`:return k(await i(a,o.use))}}async function E(e,t,n){switch(n.intent){case`capture-only`:return O(await e(t,n.use));case`element-text`:{let r=await e(t,n.use);return{...O(r),...b(r)}}case`wait-observation`:{let r=await e(t,n.use);return{...O(r),...x(r)}}case`find-focus`:{let r=await e(t,n.use);return{...O(r),...S(r)}}case`find-type`:{let r=await e(t,n.use);return{...O(r),...S(r)}}}}async function D(e,t,n){switch(n.intent){case`capture-only`:return A(await e(t,n.use));case`element-text`:{let r=await e(t,n.use);return{...A(r),...b(r)}}case`wait-observation`:{let r=await e(t,n.use);return{...A(r),...x(r)}}case`find-focus`:{let r=await e(t,n.use);return{...A(r),...S(r)}}case`find-type`:{let r=await e(t,n.use);return{...A(r),...S(r)}}}}function O(e){return Object.freeze({captureSnapshot:async t=>await e.operations.captureSnapshot(t)})}function k(e){return Object.freeze({captureSnapshot:async t=>await e.operations.captureSnapshotWithCustomActions(t)})}function A(e){return Object.freeze({captureSnapshot:async t=>await e.operations.captureSnapshotWithoutActiveApp(t)})}async function j(t){if(t.operation===`captureSnapshot`||t.operation===`focusPoint`||t.operation===`typeText`)return d(t.command,t.fact);if(t.operation===`captureSnapshotWithCustomActions`)return M(t);let n=await v(t.device);return e(`SESSION_NOT_FOUND`,`iOS ${t.command} requires an active app session on the target device. Run open first (for example: open --session ${t.session?.name??`sim`} --platform ios --device "<name>" <app>).`,{reason:`ios_app_session_required`,...n?{hint:n}:{}})}function M(t){let n=t.command===`diff`?`--actions requires an iOS simulator: custom actions are read through the private accessibility snapshot backend, which ${t.device.platform}/${t.device.kind} targets do not have.`:`--actions requires an iOS simulator: custom actions are unavailable on this ${t.device.platform}/${t.device.kind} target.`;return e(`UNSUPPORTED_OPERATION`,n,{reason:t.fact.available?void 0:t.fact.reason},{hint:t.command===`diff`||t.fact.available||!t.fact.hint?`Re-run without --actions, or target an iOS simulator.`:t.fact.hint})}export{m as a,g as i,w as n,h as o,_ as r,C as t};