agent-device 0.21.6 → 0.21.8

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 (317) hide show
  1. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.6.apk → agent-device-android-ime-helper-0.21.8.apk} +0 -0
  2. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.8.apk.sha256 +1 -0
  3. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.6.manifest.json → agent-device-android-ime-helper-0.21.8.manifest.json} +4 -4
  4. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.6.apk → agent-device-android-snapshot-helper-0.21.8.apk} +0 -0
  5. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.8.apk.sha256 +1 -0
  6. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.6.manifest.json → agent-device-android-snapshot-helper-0.21.8.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/AgentDeviceMacOSHelper/DeviceHubPose.swift +320 -0
  10. package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/main.swift +66 -13
  11. package/apple/macos-helper/Sources/AgentDeviceMacOSInput/MouseClickDelivery.swift +116 -0
  12. package/apple/macos-helper/Sources/AgentDeviceMacOSInput/MouseClickSchedule.swift +61 -0
  13. package/apple/macos-helper/Tests/AgentDeviceMacOSDeviceHubTests/DeviceHubPoseTests.swift +30 -0
  14. package/apple/macos-helper/Tests/AgentDeviceMacOSInputTests/MouseClickScheduleTests.swift +58 -0
  15. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.h +4 -0
  16. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.m +20 -0
  17. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerScrollViewportPolicy.swift +1 -2
  18. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AXSnapshotFallback.swift +25 -12
  19. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +56 -1
  20. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandJournal.swift +1 -1
  21. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +36 -108
  22. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Keyboard.swift +241 -0
  23. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Lifecycle.swift +29 -0
  24. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +46 -0
  25. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+PrivateAXPresentation.swift +85 -26
  26. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Snapshot.swift +134 -117
  27. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotBackendCapabilities.swift +1 -3
  28. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCapturePlan.swift +25 -4
  29. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SystemModal.swift +1 -1
  30. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +3 -0
  31. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotCoordinateSpace.swift +197 -0
  32. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotModels.swift +30 -4
  33. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentation.swift +0 -81
  34. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentationInvariant.swift +1 -9
  35. package/dist/src/absence-observation-errors.js +1 -1
  36. package/dist/src/adapter.js +1 -1
  37. package/dist/src/adb-executor.js +2 -2
  38. package/dist/src/adb-failure.js +1 -1
  39. package/dist/src/adb-transport.js +1 -1
  40. package/dist/src/adb.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-browser-provider.js +1 -1
  44. package/dist/src/agent-browser-tool.js +1 -1
  45. package/dist/src/agent-device-client.js +2 -2
  46. package/dist/src/ai-sdk.js +1 -1
  47. package/dist/src/alert-runtime.js +1 -1
  48. package/dist/src/android-adb.d.ts +29 -2
  49. package/dist/src/android-adb.js +1 -1
  50. package/dist/src/android-input-ownership.js +1 -1
  51. package/dist/src/android.js +1 -1
  52. package/dist/src/app-catalog.js +1 -1
  53. package/dist/src/app-deployment-resolution.js +1 -1
  54. package/dist/src/app-helpers.js +1 -1
  55. package/dist/src/app-inventory.js +1 -1
  56. package/dist/src/app-launch.js +2 -2
  57. package/dist/src/app-lifecycle.js +2 -2
  58. package/dist/src/app-lifecycle2.js +2 -2
  59. package/dist/src/app-log-files.js +1 -1
  60. package/dist/src/app-log-runtime2.js +3 -3
  61. package/dist/src/app-resolution.js +2 -2
  62. package/dist/src/app-state.js +1 -1
  63. package/dist/src/apple-runner-platform.js +1 -1
  64. package/dist/src/application-lifecycle-interaction.js +1 -1
  65. package/dist/src/archive.js +1 -1
  66. package/dist/src/artifact-download.js +1 -1
  67. package/dist/src/auth-session.js +1 -1
  68. package/dist/src/auth.js +1 -1
  69. package/dist/src/back-mode.js +1 -1
  70. package/dist/src/backend-snapshot-options.js +1 -1
  71. package/dist/src/boot-diagnostics.js +1 -1
  72. package/dist/src/capture-disclosure.js +1 -0
  73. package/dist/src/capture.js +1 -1
  74. package/dist/src/cli-config.js +1 -1
  75. package/dist/src/cli-help.js +18 -2
  76. package/dist/src/cli-output.js +1 -1
  77. package/dist/src/cli.js +4 -4
  78. package/dist/src/click-button.js +1 -1
  79. package/dist/src/client-metro.js +1 -1
  80. package/dist/src/client-types.d.ts +65 -3
  81. package/dist/src/clipboard-shell-response.js +1 -0
  82. package/dist/src/command-schema.js +1 -1
  83. package/dist/src/command-tools.js +4 -2
  84. package/dist/src/command.js +1 -1
  85. package/dist/src/config.js +1 -1
  86. package/dist/src/connection-runtime.js +1 -1
  87. package/dist/src/connection.js +1 -1
  88. package/dist/src/contracts.d.ts +1 -1
  89. package/dist/src/contracts.js +1 -1
  90. package/dist/src/daemon-client-lifecycle.js +1 -1
  91. package/dist/src/daemon.js +1 -1
  92. package/dist/src/debug-symbols-facade.js +1 -1
  93. package/dist/src/device-boot.js +1 -1
  94. package/dist/src/device-claim-inspection.js +1 -1
  95. package/dist/src/device-claim-rule.js +2 -1
  96. package/dist/src/device-input-state.d.ts +5 -5
  97. package/dist/src/device-inventory-context.js +1 -1
  98. package/dist/src/device-rotation.js +1 -1
  99. package/dist/src/device-selection-resolver.js +1 -1
  100. package/dist/src/device-session.js +1 -1
  101. package/dist/src/device-shell.js +1 -0
  102. package/dist/src/device.js +1 -1
  103. package/dist/src/device2.js +1 -1
  104. package/dist/src/devicectl.js +1 -0
  105. package/dist/src/diagnostics.js +1 -1
  106. package/dist/src/dispatch-resolve.js +1 -1
  107. package/dist/src/display-inventory.js +1 -0
  108. package/dist/src/doctor-facade.js +1 -1
  109. package/dist/src/doctor2.js +1 -1
  110. package/dist/src/durable-resource.js +1 -1
  111. package/dist/src/engine-eval-script.js +1 -1
  112. package/dist/src/error.js +1 -1
  113. package/dist/src/exec.js +1 -1
  114. package/dist/src/file.js +1 -1
  115. package/dist/src/find.js +1 -1
  116. package/dist/src/finders.js +1 -1
  117. package/dist/src/format.js +2 -1
  118. package/dist/src/generic.js +1 -1
  119. package/dist/src/gesture-admission.js +1 -1
  120. package/dist/src/gesture-plan.js +1 -1
  121. package/dist/src/gesture-runtime.js +1 -1
  122. package/dist/src/harmonyos.js +1 -1
  123. package/dist/src/hdc.js +1 -1
  124. package/dist/src/helper.js +2 -2
  125. package/dist/src/host.js +1 -0
  126. package/dist/src/human-control-contract.js +1 -1
  127. package/dist/src/human-control.js +1 -1
  128. package/dist/src/index.d.ts +1 -1
  129. package/dist/src/index.js +1 -1
  130. package/dist/src/input-actions.js +1 -1
  131. package/dist/src/input-actions2.js +1 -1
  132. package/dist/src/install-artifact-facade.js +1 -1
  133. package/dist/src/install-source-network-transport.js +1 -1
  134. package/dist/src/install-source2.js +1 -1
  135. package/dist/src/interaction-positionals.js +1 -1
  136. package/dist/src/interaction-ref-policy.js +1 -1
  137. package/dist/src/interaction.js +1 -1
  138. package/dist/src/interaction2.js +1 -1
  139. package/dist/src/interactor-operation-binding.js +1 -0
  140. package/dist/src/interactor-operation-catalog.js +1 -1
  141. package/dist/src/interactor.js +4 -5
  142. package/dist/src/interactor2.js +1 -1
  143. package/dist/src/interactors.js +1 -1
  144. package/dist/src/internal/bin.js +1 -1
  145. package/dist/src/internal/daemon.js +2 -2
  146. package/dist/src/internal/png-worker.d.ts +9 -1
  147. package/dist/src/internal/png-worker.js +1 -1
  148. package/dist/src/internal/run-script-http-child.js +1 -1
  149. package/dist/src/inventory.js +4 -4
  150. package/dist/src/inventory2.js +1 -1
  151. package/dist/src/inventory3.js +2 -2
  152. package/dist/src/inventory5.js +1 -1
  153. package/dist/src/ios-snapshot-acquisition.js +1 -1
  154. package/dist/src/ios-snapshot-runtime.js +1 -1
  155. package/dist/src/ios-target-activation.js +1 -0
  156. package/dist/src/lease-context.js +1 -1
  157. package/dist/src/lease-scope.js +1 -1
  158. package/dist/src/lease.js +1 -1
  159. package/dist/src/limrun-download-file.js +1 -0
  160. package/dist/src/limrun-runtime-dependencies.js +1 -1
  161. package/dist/src/limrun.d.ts +10 -4
  162. package/dist/src/linux.js +1 -1
  163. package/dist/src/local-interactor-operation-set.js +1 -1
  164. package/dist/src/location-coordinates.js +1 -1
  165. package/dist/src/macos-facade.js +1 -1
  166. package/dist/src/managed-device-scope.js +1 -1
  167. package/dist/src/mechanics.js +17 -16
  168. package/dist/src/mobile-snapshot-semantics.js +1 -1
  169. package/dist/src/multitouch-support.js +1 -1
  170. package/dist/src/observation.js +2 -2
  171. package/dist/src/output-common.js +5 -2
  172. package/dist/src/parameterized-recorded-fill.js +1 -1
  173. package/dist/src/perf-facade.js +2 -2
  174. package/dist/src/perf-runtime-operation-builder.js +1 -1
  175. package/dist/src/perf-runtime-plan.js +1 -1
  176. package/dist/src/perf.js +1 -1
  177. package/dist/src/physical-device-control.js +1 -1
  178. package/dist/src/platform-request-scope.js +1 -1
  179. package/dist/src/platform-runtime-android-adb-host.js +1 -1
  180. package/dist/src/platform-runtime-host.js +1 -1
  181. package/dist/src/platform-runtime-managed-owner.js +1 -1
  182. package/dist/src/platform-runtime-open-target.js +1 -1
  183. package/dist/src/platform-runtime-operation-host.js +4 -4
  184. package/dist/src/platform-runtime-runtime-hints.js +2 -2
  185. package/dist/src/platform-runtime-screen-recording-android-host.js +1 -1
  186. package/dist/src/platform-runtime-screen-recording-apple-runner-transport.js +1 -1
  187. package/dist/src/platform-runtime-screen-recording-apple-simulator-host.js +1 -1
  188. package/dist/src/platform-runtime-screen-recording-apple-transport.js +1 -1
  189. package/dist/src/platform-runtime-screen-recording-finalizer-host.js +1 -1
  190. package/dist/src/platform-runtime-screen-recording-harmony-host.js +1 -1
  191. package/dist/src/platform-runtime-screen-recording-process-host.js +1 -1
  192. package/dist/src/platform-runtime-unavailable.js +1 -1
  193. package/dist/src/platform-runtime.js +1 -1
  194. package/dist/src/platform-runtime2.js +1 -1
  195. package/dist/src/png-crop-bytes.js +1 -1
  196. package/dist/src/png-worker-client.js +1 -0
  197. package/dist/src/png.js +1 -1
  198. package/dist/src/prepare-kind.js +1 -1
  199. package/dist/src/provider-session-ownership.js +1 -1
  200. package/dist/src/provider-webdriver.js +1 -1
  201. package/dist/src/proxy.js +1 -1
  202. package/dist/src/quality-warnings.js +1 -1
  203. package/dist/src/react-native.js +1 -1
  204. package/dist/src/record-runtime.js +1 -1
  205. package/dist/src/record-trace.js +1 -1
  206. package/dist/src/rect-center.js +1 -1
  207. package/dist/src/register-builtins.js +1 -1
  208. package/dist/src/registry.js +35 -35
  209. package/dist/src/remote-config2.js +1 -1
  210. package/dist/src/replay-divergence.js +1 -1
  211. package/dist/src/replay.js +1 -1
  212. package/dist/src/reporting.js +1 -1
  213. package/dist/src/request-admission.js +1 -1
  214. package/dist/src/request-cancel.js +1 -1
  215. package/dist/src/request-runtime-binding.js +1 -1
  216. package/dist/src/result-serialization.js +1 -1
  217. package/dist/src/retry.js +1 -1
  218. package/dist/src/runner-cache-metadata.js +2 -2
  219. package/dist/src/runner-client.js +1 -1
  220. package/dist/src/runner-contract.js +3 -0
  221. package/dist/src/runner-dev-tools-security.js +1 -0
  222. package/dist/src/runner-device-readiness.js +1 -0
  223. package/dist/src/runner-disposal.js +1 -1
  224. package/dist/src/runner-operations-facade.js +1 -1
  225. package/dist/src/runner-presentation.js +1 -1
  226. package/dist/src/runner.js +1 -1
  227. package/dist/src/runtime-transport-hints.js +1 -1
  228. package/dist/src/runtime.js +3 -3
  229. package/dist/src/runtime10.js +1 -1
  230. package/dist/src/runtime2.js +4 -4
  231. package/dist/src/runtime3.js +1 -1
  232. package/dist/src/runtime4.js +5 -5
  233. package/dist/src/runtime5.js +1 -1
  234. package/dist/src/runtime6.js +1 -1
  235. package/dist/src/runtime7.js +1 -1
  236. package/dist/src/runtime8.js +1 -1
  237. package/dist/src/runtime9.js +1 -1
  238. package/dist/src/screen-recording-admission-ledger.js +1 -0
  239. package/dist/src/screen-recording-completion.js +1 -1
  240. package/dist/src/screen-recording-options.js +1 -1
  241. package/dist/src/screen-recording-resource-recovery.js +1 -1
  242. package/dist/src/screen-recording-transport.js +1 -0
  243. package/dist/src/screenshot-density.js +1 -1
  244. package/dist/src/screenshot-image.js +1 -0
  245. package/dist/src/screenshot-runtime.js +1 -1
  246. package/dist/src/screenshot.js +1 -1
  247. package/dist/src/screenshot3.js +1 -1
  248. package/dist/src/script.js +1 -1
  249. package/dist/src/scroll-command.js +1 -1
  250. package/dist/src/scroll-gesture.js +1 -1
  251. package/dist/src/sdk-batch-runner.js +2 -2
  252. package/dist/src/sdk-batch.js +2 -2
  253. package/dist/src/sdk-contracts.d.ts +76 -1
  254. package/dist/src/sdk-contracts.js +2 -2
  255. package/dist/src/sdk-device.js +1 -1
  256. package/dist/src/sdk-finders.d.ts +1 -1
  257. package/dist/src/sdk-finders.js +1 -1
  258. package/dist/src/sdk-io.js +1 -1
  259. package/dist/src/sdk-remote-config.js +1 -1
  260. package/dist/src/sdk-selectors.d.ts +29 -3
  261. package/dist/src/sdk-selectors.js +1 -1
  262. package/dist/src/selection.js +0 -0
  263. package/dist/src/selector-runtime.js +1 -1
  264. package/dist/src/selectors.js +1 -1
  265. package/dist/src/semantic-index.js +1 -1
  266. package/dist/src/server.js +1 -1
  267. package/dist/src/session-allocation.js +1 -1
  268. package/dist/src/session-observation.js +1 -1
  269. package/dist/src/session-routing.js +1 -1
  270. package/dist/src/session-runtime-admission.js +1 -1
  271. package/dist/src/session-snapshot.js +1 -1
  272. package/dist/src/session-store.js +3 -3
  273. package/dist/src/session2.js +4 -5
  274. package/dist/src/settings.js +1 -1
  275. package/dist/src/simctl-facade.js +1 -1
  276. package/dist/src/simctl.js +1 -1
  277. package/dist/src/simulator-boot.js +1 -1
  278. package/dist/src/simulator-facade.js +1 -1
  279. package/dist/src/simulator.js +1 -1
  280. package/dist/src/snapshot-capture-annotations.js +1 -1
  281. package/dist/src/snapshot-diagnostics.js +1 -1
  282. package/dist/src/snapshot-quality-backend-capabilities.js +1 -1
  283. package/dist/src/snapshot-runtime-binding.js +1 -1
  284. package/dist/src/snapshot-runtime.js +1 -1
  285. package/dist/src/snapshot-state.js +1 -1
  286. package/dist/src/snapshot.js +1 -1
  287. package/dist/src/snapshot2.js +1 -1
  288. package/dist/src/snapshot3.js +1 -1
  289. package/dist/src/snapshot4.js +1 -1
  290. package/dist/src/src.js +1 -1
  291. package/dist/src/src4.js +1 -1
  292. package/dist/src/src7.js +1 -1
  293. package/dist/src/src8.js +2 -2
  294. package/dist/src/stop-sequence.js +1 -1
  295. package/dist/src/string-enum.js +1 -1
  296. package/dist/src/takeover.js +1 -1
  297. package/dist/src/text-entry-focus.js +1 -1
  298. package/dist/src/tool-provider.js +1 -1
  299. package/dist/src/tool-provider2.js +1 -1
  300. package/dist/src/touch-runtime.js +1 -1
  301. package/dist/src/transport.js +1 -1
  302. package/dist/src/tree.js +1 -1
  303. package/dist/src/tv-remote.js +1 -1
  304. package/dist/src/type-text-runtime.js +1 -1
  305. package/dist/src/verified-file.js +1 -1
  306. package/dist/src/video.js +1 -1
  307. package/dist/src/viewport.js +1 -1
  308. package/dist/src/web.js +1 -1
  309. package/dist/src/web2.js +1 -1
  310. package/dist/src/webdriver-source.js +1 -1
  311. package/dist/src/window-state.js +1 -1
  312. package/package.json +4 -1
  313. package/server.json +2 -2
  314. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.6.apk.sha256 +0 -1
  315. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.6.apk.sha256 +0 -1
  316. package/dist/src/session-target-evidence.js +0 -1
  317. package/dist/src/vars.js +0 -2
@@ -1 +1 @@
1
- import{C as e}from"./sdk-contracts.js";import{D as t,T as n,w as r}from"./sdk-device.js";import{O as i,Yt as a,qt as o}from"./sdk-batch.js";import{r as s}from"./diagnostics.js";import{E as c}from"./owner-identity.js";import{i as l}from"./verified-file.js";import"./file.js";import"./diagnostics2.js";import{r as u}from"./session-paths.js";import{i as d,n as f,t as p}from"./durable-resource.js";import{n as m}from"./screen-recording-runtime.js";import h from"node:path";import g from"node:fs";import ee from"node:crypto";function _(e){return e.length===0?e:e[0].toUpperCase()+e.slice(1)}function v(e){return e.replaceAll(`-`,`_`)}async function te(e,t,n){let r={kind:`pending`};try{let i=ce(ie(e,t),`active`);e.store.write(n,i),r={kind:`persisted`},t.throwIfCanceled();let a=t.pendingHandle.transfer();r={kind:`transferred`,handle:a},t.sessionStore.set(t.sessionName,e.sessionSlot.replace(t.session,{handle:a,envelope:i}))}catch(i){throw await ne(e,t,n,r,i),i}}async function ne(e,t,n,r,i){let a=r.kind!==`pending`||b(e,t,n),o=re(e,t,n,await y(t,r));t.reportUndurableCleanup(t.device,!a&&o.cleanupError===void 0||o.confirmed?{confirmed:!0}:{confirmed:!1,reason:o.cleanupError instanceof Error?o.cleanupError.message:`The durable cleanup transition could not be confirmed`}),o.cleanupError!==void 0&&se(e,t,i,o.cleanupError)}function re(e,t,n,r){try{return{confirmed:oe(e,n,t.fence,r),cleanupError:r}}catch(n){return s({level:`error`,phase:`${v(e.resourceKind)}_pending_adoption_transition_failed`,data:{session:t.sessionName,transitionError:n instanceof Error?n.message:String(n)}}),{confirmed:!1,cleanupError:r??n}}}async function y(e,t){try{t.kind===`transferred`?await t.handle[Symbol.asyncDispose]():await e.pendingHandle[Symbol.asyncDispose]();return}catch(e){return e}}function b(e,t,n){try{return e.store.write(n,x(e,t,t.envelope.descriptor)),!0}catch(r){try{return e.store.write(n,x(e,t,{version:0,body:{reason:`runtime-contract-invalid`}})),!0}catch(n){return s({level:`error`,phase:`${v(e.resourceKind)}_runtime_contract_tombstone_failed`,data:{session:t.sessionName,descriptorError:r instanceof Error?r.message:String(r),persistenceError:n instanceof Error?n.message:String(n)}}),!1}}}function x(e,t,n){return f({resourceKind:e.resourceKind,sessionId:t.sessionName,device:r(t.device),owner:t.owner,fence:t.fence,lifecycle:`open`,descriptor:n,metadata:{phase:`runtime-contract-invalid`,runtimeContractInvalid:!0}})}function ie(t,n){let r=d(n.envelope);if(r.status===`decoded`&&ae(r.envelope,n,t.resourceKind))return r.envelope;throw new e(`COMMAND_FAILED`,`${_(t.displayName)} runtime returned an incoherent durable envelope`,{reason:`runtime-contract-invalid`,hint:`Retain the runtime diagnostics and report the selected device and owner.`})}function ae(e,n,i){return e.resourceKind===i&&e.sessionId===n.sessionName&&t(e.device,r(n.device))&&a(e.owner)===a(n.owner)&&e.fence.token===n.fence.token&&e.fence.generation===n.fence.generation&&e.lifecycle===`open`}function oe(e,t,n,r){let i=e.store.read(t);return i.status!==`decoded`||i.envelope.fence.token!==n.token||i.envelope.fence.generation!==n.generation?!1:(e.store.write(t,{...i.envelope,lifecycle:r===void 0?`completed`:`open`,metadata:{...i.envelope.metadata??{},phase:r===void 0?`completed`:`cleanup-pending`,cleanupStatus:r===void 0?`cleaned`:`cleanup-pending`}}),!0)}function se(e,t,n,r){s({level:`error`,phase:`${v(e.resourceKind)}_pending_adoption_cleanup_failed`,data:{session:t.sessionName,primaryError:n instanceof Error?n.message:String(n),cleanupError:r instanceof Error?r.message:String(r)}})}function ce(e,t){return Object.freeze({...e,lifecycle:`open`,metadata:{...e.metadata??{},phase:t}})}async function S(e){e.scope.signal.throwIfAborted();let t=new AbortController,n={...e.scope,signal:AbortSignal.any([e.scope.signal,t.signal])},r=()=>{},i=new Promise((e,t)=>{r=t}),a=()=>{},o=new Promise((t,n)=>{let r=()=>{try{e.scope.signal.throwIfAborted()}catch(e){n(e)}};if(e.scope.signal.aborted){r();return}e.scope.signal.addEventListener(`abort`,r,{once:!0}),a=()=>e.scope.signal.removeEventListener(`abort`,r)}),s=setTimeout(()=>{let n=new w(e.displayName,e.deadlineMs);t.abort(n),r(n)},e.deadlineMs);s.unref?.();let c=ue(e,n),l,u=c.then(e=>(l??={kind:`acquisition`},e),e=>{throw l??={kind:`acquisition-error`},e}),d=i.catch(e=>{throw l??={kind:`deadline`,error:e},e}),f=o.catch(e=>{throw l??={kind:`cancellation`,error:e},e});try{return await Promise.race([u,d,f])}finally{if(clearTimeout(s),a(),l?.kind===`deadline`||l?.kind===`cancellation`){let t=l.error;c.then(n=>le(e,n,t),()=>{}).catch(()=>{})}else c.catch(()=>{})}}async function le(e,t,n){try{t.reattached.status===`active`&&await C(e,t.reattached.handle,`late_handle_cleanup_failed`,n)}finally{await C(e,t.control,`late_control_cleanup_failed`,n)}}async function ue(e,t){let n,r;try{return n=await e.acquireControl(e.envelope,t),t.signal.throwIfAborted(),r=await n.reattach(e.envelope),t.signal.throwIfAborted(),{control:n,reattached:r}}catch(t){try{r?.status===`active`&&await C(e,r.handle,`late_handle_cleanup_failed`,t)}finally{n&&await C(e,n,`late_control_cleanup_failed`,t)}throw t}}async function C(e,t,n,r){try{await t[Symbol.asyncDispose]()}catch(t){e.onLateCleanupFailure(n,t,r)}}var w=class extends Error{deadlineMs;constructor(e,t){super(`${_(e)} recovery exceeded its ${t}ms deadline`),this.name=`DurableCaptureRecoveryDeadlineError`,this.deadlineMs=t}};const T=new Map;async function E(e){return await fe(e.resourcePath,async()=>{let t=e.store.read(e.resourcePath);if(t.status!==`decoded`)throw D(e.store,t.status===`missing`?`${e.store.displayName} resource record is missing`:`${e.store.displayName} resource record is unreattachable: ${t.message}`);if(!de(t.envelope.fence,e.expected))throw D(e.store,`${e.store.displayName} resource ownership fence was lost`);let n=t.envelope;return await e.run({get envelope(){return n},transition(t,r={}){return n=Object.freeze({...n,lifecycle:t,...r.descriptor===void 0?{}:{descriptor:r.descriptor},...r.metadata===void 0?{}:{metadata:r.metadata}}),e.store.write(e.resourcePath,n),n}})})}function de(e,t){return e.token===t.token&&e.generation===t.generation}async function fe(e,t){let n=T.get(e)??Promise.resolve(),r,i=new Promise(e=>{r=e}),a=n.catch(()=>{}).then(()=>i);T.set(e,a),await n.catch(()=>{});try{return await t()}finally{r(),T.get(e)===a&&T.delete(e)}}function D(t,n){return new e(`COMMAND_FAILED`,n,{reason:`ownership-fence-lost`,retriable:!1,hint:`Use the current ${t.displayName.toLowerCase()} resource owner or retain the recovery record for manual recovery.`})}async function pe(t,n,r){let i=t.sessionSlot.read(n.session);if(!i)throw new e(`INVALID_ARGS`,t.messages.noActive);try{let e=await O(t,{handle:i.handle,fence:i.envelope.fence,resourcePath:r,intent:n.intent});return j(t,n),e}catch(e){let i=t.store.read(r);throw i.status===`decoded`&&i.envelope.lifecycle===`completed`&&j(t,n),e}}async function O(e,t){return await E({store:e.store,resourcePath:t.resourcePath,expected:t.fence,run:async n=>{R(n);let r=L(n),i;try{i=await t.handle.finish(r)}catch(r){throw await k(e,n,t,r,t.intent),r}if(i.status===`completed`)return I(e,n,i),i.result;I(e,n,i);let a=F(e,i);throw await k(e,n,t,a,t.intent),a}})}async function k(e,t,n,r,i){if(i===`capture`&&e.failedFinishPolicy===`preserve-retry-material`){he(e,n,r);return}let a;try{a=await n.handle.forceCleanup()}catch(i){A(e,n,r,i,me(t,i));return}try{N(t,a)}catch(t){A(e,n,r,a.status===`cleanup-pending`?a.message??a.reason:`cleanup returned ${a.status}`,t);return}p(a)||A(e,n,r,a.message)}function me(e,t){try{N(e,{status:`cleanup-pending`,reason:`cleanup-unconfirmed`,message:M(t)});return}catch(e){return e}}function he(e,t,n){s({level:`error`,phase:`${v(e.resourceKind)}_finish_evidence_preserved`,data:{resourcePath:t.resourcePath,finishError:M(n),failedFinishPolicy:e.failedFinishPolicy}})}function A(e,t,n,r,i){s({level:`error`,phase:`${v(e.resourceKind)}_finish_cleanup_failed`,data:{resourcePath:t.resourcePath,finishError:M(n),cleanupError:r===void 0?`cleanup could not be confirmed`:M(r),...i===void 0?{}:{transitionError:M(i)}}})}function j(e,t){t.sessionStore.set(t.sessionName,e.sessionSlot.replace(t.session,void 0))}function M(e){return e instanceof Error?e.message:String(e)}async function ge(e,t){let n=e.sessionSlot.read(t.session);n&&(P(e,await E({store:e.store,resourcePath:t.resourcePath,expected:n.envelope.fence,run:async e=>{R(e);let t=await n.handle.forceCleanup();return N(e,t),t}})),t.sessionStore&&t.sessionName&&t.sessionStore.set(t.sessionName,e.sessionSlot.replace(t.session,void 0)))}function N(e,t){e.transition(p(t)?`completed`:`open`,{metadata:{...e.envelope.metadata??{},phase:p(t)?`completed`:`cleanup-pending`,cleanupStatus:t.status,...t.status===`cleanup-pending`?{cleanupPendingReason:t.reason,...t.message?{cleanupPendingMessage:t.message}:{}}:{}}})}function P(e,t){if(!p(t))throw F(e,t)}function F(t,n){return new e(`COMMAND_FAILED`,n.message??`${_(t.displayName)} cleanup could not be confirmed`,{reason:n.reason,retriable:n.reason!==`ownership-fence-lost`,hint:t.messages.cleanupPendingHint})}function I(e,t,n){if(n.status===`completed`){t.transition(`completed`,{metadata:{...t.envelope.metadata??{},...e.completionMetadata(n.result),phase:`completed`}});return}N(t,n)}function L(e){return Object.freeze({learned:e.envelope.metadata,record:t=>{e.transition(`open`,{metadata:{...e.envelope.metadata??{},...t}})}})}function R(e){e.transition(`open`,{metadata:{...e.envelope.metadata??{},phase:`completing`}})}async function _e(e){let t=e.definition.store.list(e.sessionsDir),n=[];for(let r of t)n.push(await z(e,r));return{scanned:t.length,recovered:n.filter(e=>e===`recovered`).length,retained:n.filter(e=>e===`retained`).length}}async function z(e,t){let n=ve(e,t);if(n.status!==`recoverable`)return n.status;try{return await ye(e,t,n.envelope,e.perRecordDeadlineMs??5e3)?`recovered`:`retained`}catch(n){return H(e,n instanceof w?`timed_out`:`failed`,t,{error:n instanceof Error?n.message:String(n),...n instanceof w?{deadlineMs:n.deadlineMs}:{}}),`retained`}}function ve(e,t){let n=e.definition.store.read(t);if(n.status===`unreattachable`)return H(e,`record_unreattachable`,t,{reason:n.reason,message:n.message,version:n.version}),{status:`retained`};if(n.status===`missing`||n.envelope.lifecycle===`completed`)return{status:`ignored`};let r=e.definition.store.resolvePath(e.resolveSessionDir(n.envelope.sessionId));return h.resolve(t)===h.resolve(r)?{status:`recoverable`,envelope:n.envelope}:(H(e,`session_path_mismatch`,t,{envelopeSessionId:n.envelope.sessionId,canonicalPath:r}),{status:`retained`})}async function ye(e,t,n,r){return await be(e,t,n,await S({displayName:e.definition.displayName,envelope:n,scope:e.scope,deadlineMs:r,acquireControl:e.acquireControl,onLateCleanupFailure:(n,r,i)=>H(e,n,t,{error:r instanceof Error?r.message:String(r),primaryError:i instanceof Error?i.message:String(i)})}))}async function be(e,t,n,r){try{switch(r.reattached.status){case`active`:{let i=r.reattached.handle,a=await E({store:e.definition.store,resourcePath:t,expected:n.fence,run:async e=>{xe(e);let t=await i.forceCleanup();return N(e,t),t}});return p(a)}case`completed`:return await B(e,t,n,{...e.definition.completionMetadata(r.reattached.result)}),!0;case`missing`:return await B(e,t,n,{recoveryStatus:`already-missing`}),!0;case`unreattachable`:{if(!V(r.reattached.reason))return H(e,`retained`,t,{reason:r.reattached.reason,message:r.reattached.message}),!1;let i=await r.control.cleanup(n);return await E({store:e.definition.store,resourcePath:t,expected:n.fence,run:async e=>N(e,i)}),p(i)}}}finally{await r.control[Symbol.asyncDispose]()}}async function B(e,t,n,r){await E({store:e.definition.store,resourcePath:t,expected:n.fence,run:async e=>{e.transition(`completed`,{metadata:{...e.envelope.metadata??{},phase:`completed`,...r}})}})}function xe(e){e.transition(`open`,{metadata:{...e.envelope.metadata??{},phase:`completing`}})}function V(e){switch(e){case`descriptor-invalid`:case`descriptor-version-unsupported`:case`ownership-fence-lost`:return!1;case`owner-unavailable`:case`transport-not-reattachable`:return!0}}function H(e,t,n,r){let i={phase:`${v(e.definition.resourceKind)}_recovery_${t}`,resourcePath:n,data:r};e.onDiagnostic?e.onDiagnostic(i):s({level:`warn`,phase:i.phase,data:{resourcePath:n,...r}})}async function Se(t,n){let r=t.store.read(n.resourcePath);if(r.status!==`decoded`||r.envelope.lifecycle!==`open`)throw Ce(t,r.status);let i=r.envelope,a=await S({displayName:t.displayName,envelope:i,scope:n.scope,deadlineMs:n.deadlineMs??5e3,acquireControl:n.acquireControl,onLateCleanupFailure:(e,r,i)=>n.scope.diagnostics.emit({level:`error`,phase:`${v(t.resourceKind)}_recovery_${e}`,data:{resourcePath:n.resourcePath,error:U(r),primaryError:U(i)}})});try{switch(a.reattached.status){case`active`:return await O(t,{handle:a.reattached.handle,fence:i.fence,resourcePath:n.resourcePath,intent:`capture`});case`completed`:{let e=a.reattached.result;return await E({store:t.store,resourcePath:n.resourcePath,expected:i.fence,run:async n=>{I(t,n,{status:`completed`,result:e,alreadyCompleted:!0})}}),e}case`missing`:throw new e(`COMMAND_FAILED`,`${_(t.displayName)} is missing`,{reason:`resource-missing`,hint:t.messages.cleanupPendingHint});case`unreattachable`:if(V(a.reattached.reason)){let e=await a.control.cleanup(i);await E({store:t.store,resourcePath:n.resourcePath,expected:i.fence,run:async t=>N(t,e)}),P(t,e)}throw new e(`COMMAND_FAILED`,a.reattached.message??`${_(t.displayName)} cannot be reattached`,{reason:a.reattached.reason,hint:t.messages.cleanupPendingHint})}}finally{await a.control[Symbol.asyncDispose]()}}function Ce(t,n){return new e(`INVALID_ARGS`,n===`missing`?t.messages.noActive:`${_(t.displayName)} recovery record is not open`)}function U(e){return e instanceof Error?e.message:String(e)}function W(e){Te(e.fileName);let t=t=>h.join(t,e.fileName);return Object.freeze({resourceKind:e.resourceKind,displayName:e.displayName,resolvePath:t,read(t){let n,r;try{if(n=l(t),n===void 0)return{status:`missing`};r=JSON.parse(g.readFileSync(n,`utf8`))}catch(t){return K(t)?{status:`missing`}:G(De(t,e.displayName))}finally{n!==void 0&&g.closeSync(n)}return we(d(r),e.resourceKind)},write(e,t){let n=h.dirname(e);g.mkdirSync(n,{recursive:!0}),c({destination:e,contents:`${JSON.stringify(t)}\n`})},list(e){let n;try{n=g.readdirSync(e,{withFileTypes:!0})}catch{return[]}return n.filter(e=>e.isDirectory()).map(n=>t(h.join(e,n.name))).filter(Ee).sort()}})}function we(e,t){return e.status===`decoded`?e.envelope.resourceKind===t?{status:`decoded`,envelope:e.envelope}:G(`Expected ${t} resource record, received ${e.envelope.resourceKind}`):e}function Te(e){if(e.length===0||h.basename(e)!==e)throw TypeError(`Durable capture resource fileName must be one file name`)}function Ee(e){try{return g.lstatSync(e),!0}catch(e){return!K(e)}}function G(e){return{status:`unreattachable`,reason:`descriptor-invalid`,message:e}}function K(e){return typeof e==`object`&&!!e&&`code`in e&&e.code===`ENOENT`}function De(e,t){return e instanceof Error?e.message:`${t} resource record is invalid`}function Oe(e,t){t.admissionLedger.assertStartAllowed(t.device),ke(e,t.resourcePath,t.device);let n=e.store.read(t.resourcePath);return Object.freeze({token:ee.randomUUID(),generation:n.status===`decoded`?n.envelope.fence.generation+1:1})}function ke(t,i,a){let o=n(r(a));for(let r of t.store.list(h.dirname(h.dirname(i)))){let a=t.store.read(r);if(a.status===`unreattachable`)throw new e(`COMMAND_FAILED`,`${_(q(t.displayName))} ${t.displayName} recovery record is unreattachable: ${a.message}`,{reason:a.reason,retriable:!1,hint:`Retain the corrupt or future-version ${t.displayName} manifest for manual recovery; no replacement capture is safe.`});if(a.status===`decoded`&&a.envelope.lifecycle!==`completed`&&(r===i||n(a.envelope.device)===o))throw new e(`COMMAND_FAILED`,`${_(q(t.displayName))} ${t.displayName} resource for this device has not reached a confirmed terminal state`,{reason:`cleanup-unconfirmed`,hint:`Retry exact-owner cleanup using the existing ${t.displayName} manifest before starting a replacement.`})}}function q(e){return/^[aeiou]/i.test(e)?`an`:`a`}function J(e){let t=(t,n)=>e.store.resolvePath(t.resolveSessionDir(n)),n=t=>({definition:e,resolveSessionDir:e=>h.join(t.sessionsDir,u(e)),...t});return Object.freeze({store:e.store,resourcePath:t,createNextFence(t){return Oe(e,t)},adoptStarted(n){return te(e,{...n,reportUndurableCleanup:(e,t)=>{t.confirmed?n.admissionLedger.clearUndurableCleanup(e):n.admissionLedger.blockUndurableCleanup(e,t.reason)}},t(n.sessionStore,n.sessionName))},finishLive(n){return pe(e,n,t(n.sessionStore,n.sessionName))},finishRecovered(t){return Se(e,t)},forceCleanupLive(t){return ge(e,t)},recoverAll(e){return _e(n(e))},recoverOne(e,t){return z(n(e),t)}})}const Y=J({resourceKind:`screen-recording`,displayName:`screen recording`,store:W({resourceKind:m,fileName:`screen-recording.resource.json`,displayName:`screen recording`}),sessionSlot:{read:e=>e.screenRecording,replace:(e,t)=>({...e,screenRecording:t})},completionMetadata:Me,failedFinishPolicy:`preserve-retry-material`,messages:{noActive:`no active recording`,cleanupPendingHint:`Keep screen-recording.resource.json and retry stop through its exact runtime owner.`}});function Ae(e){return Y.adoptStarted(e)}function je(e){return Y.finishLive(e)}const X=`completion`;function Me(e){return{[X]:{backend:e.backend,outPath:e.outPath,startedAt:e.startedAt,completedAt:e.completedAt,...e.capturedDurationMs===void 0?{}:{capturedDurationMs:e.capturedDurationMs},...e.stopObservation===void 0?{}:{stopObservation:Pe(e.stopObservation)},...e.nativePathDisposition===void 0?{}:{nativePathDisposition:e.nativePathDisposition},scope:e.scope,showTouches:e.showTouches,recordOnlySession:e.recordOnlySession,...e.clientOutPath===void 0?{}:{clientOutPath:e.clientOutPath},...e.telemetryPath===void 0?{}:{telemetryPath:e.telemetryPath},...e.warning===void 0?{}:{warning:e.warning},...e.overlayWarning===void 0?{}:{overlayWarning:e.overlayWarning},...e.activeSessionApp===void 0?{}:{activeSessionApp:Ne(e.activeSessionApp)},...e.chunks===void 0?{}:{chunks:e.chunks.map(Fe)}}}}function Ne(e){return{bundleId:e.bundleId,...e.name===void 0?{}:{name:e.name}}}function Pe(e){return e.recorder===`confirmed`?{recorder:e.recorder}:{recorder:e.recorder,why:e.why}}function Fe(e){return{index:e.index,path:e.path,...e.clientOutPath===void 0?{}:{clientOutPath:e.clientOutPath}}}function Z(e){return Y.finishRecovered(e)}async function Q(e){let t;try{return t=await e.gateway.bind({device:Ie(e.envelope),intent:{kind:`exact-owner`,owner:e.envelope.owner,fence:e.envelope.fence},scope:e.scope}),e.scope.signal.throwIfAborted(),e.create(t)}catch(e){throw t&&await t[Symbol.asyncDispose](),e}}function Ie(e){return{platform:e.device.family,id:e.device.id,name:e.device.id,kind:e.device.kind,...e.device.target===void 0?{}:{target:e.device.target},...e.device.appleOs===void 0?{}:{appleOs:e.device.appleOs},...e.device.iosPhysicalDeviceBackend===void 0?{}:{iosPhysicalDeviceBackend:e.device.iosPhysicalDeviceBackend}}}function Le(e){return Y.recoverOne({sessionsDir:e.sessionsDir,scope:e.scope,perRecordDeadlineMs:e.perRecordDeadlineMs,onDiagnostic:e.onDiagnostic,acquireControl:async(t,n)=>await Re(e.gateway,t,n)},e.resourcePath)}async function Re(e,t,n){return await Q({gateway:e,envelope:t,scope:n,create:e=>$({runtime:o(e,i),dispose:async()=>await e[Symbol.asyncDispose]()})})}function $(e){return Object.freeze({reattach:async t=>await e.runtime.operations.screenRecordingReattach({envelope:t}),cleanup:async t=>await e.runtime.operations.screenRecordingCleanup({envelope:t}),[Symbol.asyncDispose]:e.dispose})}export{Ae as a,Y as c,X as i,J as l,Le as n,je as o,Q as r,Z as s,$ as t,W as u};
1
+ import{D as e}from"./sdk-contracts.js";import{E as t,O as n,T as r}from"./sdk-device.js";import{O as i,Yt as a,Zt as o}from"./sdk-batch.js";import{r as s}from"./diagnostics.js";import{E as c}from"./owner-identity.js";import{i as l}from"./verified-file.js";import"./file.js";import"./diagnostics2.js";import{r as u}from"./session-paths.js";import{i as d,n as f,t as p}from"./durable-resource.js";import{n as m}from"./screen-recording-runtime.js";import h from"node:path";import g from"node:fs";import ee from"node:crypto";function _(e){return e.length===0?e:e[0].toUpperCase()+e.slice(1)}function v(e){return e.replaceAll(`-`,`_`)}async function te(e,t,n){let r={kind:`pending`};try{let i=ce(ie(e,t),`active`);e.store.write(n,i),r={kind:`persisted`},t.throwIfCanceled();let a=t.pendingHandle.transfer();r={kind:`transferred`,handle:a},t.sessionStore.set(t.sessionName,e.sessionSlot.replace(t.session,{handle:a,envelope:i}))}catch(i){throw await ne(e,t,n,r,i),i}}async function ne(e,t,n,r,i){let a=r.kind!==`pending`||b(e,t,n),o=re(e,t,n,await y(t,r));t.reportUndurableCleanup(t.device,!a&&o.cleanupError===void 0||o.confirmed?{confirmed:!0}:{confirmed:!1,reason:o.cleanupError instanceof Error?o.cleanupError.message:`The durable cleanup transition could not be confirmed`}),o.cleanupError!==void 0&&se(e,t,i,o.cleanupError)}function re(e,t,n,r){try{return{confirmed:oe(e,n,t.fence,r),cleanupError:r}}catch(n){return s({level:`error`,phase:`${v(e.resourceKind)}_pending_adoption_transition_failed`,data:{session:t.sessionName,transitionError:n instanceof Error?n.message:String(n)}}),{confirmed:!1,cleanupError:r??n}}}async function y(e,t){try{t.kind===`transferred`?await t.handle[Symbol.asyncDispose]():await e.pendingHandle[Symbol.asyncDispose]();return}catch(e){return e}}function b(e,t,n){try{return e.store.write(n,x(e,t,t.envelope.descriptor)),!0}catch(r){try{return e.store.write(n,x(e,t,{version:0,body:{reason:`runtime-contract-invalid`}})),!0}catch(n){return s({level:`error`,phase:`${v(e.resourceKind)}_runtime_contract_tombstone_failed`,data:{session:t.sessionName,descriptorError:r instanceof Error?r.message:String(r),persistenceError:n instanceof Error?n.message:String(n)}}),!1}}}function x(e,t,n){return f({resourceKind:e.resourceKind,sessionId:t.sessionName,device:r(t.device),owner:t.owner,fence:t.fence,lifecycle:`open`,descriptor:n,metadata:{phase:`runtime-contract-invalid`,runtimeContractInvalid:!0}})}function ie(t,n){let r=d(n.envelope);if(r.status===`decoded`&&ae(r.envelope,n,t.resourceKind))return r.envelope;throw new e(`COMMAND_FAILED`,`${_(t.displayName)} runtime returned an incoherent durable envelope`,{reason:`runtime-contract-invalid`,hint:`Retain the runtime diagnostics and report the selected device and owner.`})}function ae(e,t,i){return e.resourceKind===i&&e.sessionId===t.sessionName&&n(e.device,r(t.device))&&o(e.owner)===o(t.owner)&&e.fence.token===t.fence.token&&e.fence.generation===t.fence.generation&&e.lifecycle===`open`}function oe(e,t,n,r){let i=e.store.read(t);return i.status!==`decoded`||i.envelope.fence.token!==n.token||i.envelope.fence.generation!==n.generation?!1:(e.store.write(t,{...i.envelope,lifecycle:r===void 0?`completed`:`open`,metadata:{...i.envelope.metadata??{},phase:r===void 0?`completed`:`cleanup-pending`,cleanupStatus:r===void 0?`cleaned`:`cleanup-pending`}}),!0)}function se(e,t,n,r){s({level:`error`,phase:`${v(e.resourceKind)}_pending_adoption_cleanup_failed`,data:{session:t.sessionName,primaryError:n instanceof Error?n.message:String(n),cleanupError:r instanceof Error?r.message:String(r)}})}function ce(e,t){return Object.freeze({...e,lifecycle:`open`,metadata:{...e.metadata??{},phase:t}})}async function S(e){e.scope.signal.throwIfAborted();let t=new AbortController,n={...e.scope,signal:AbortSignal.any([e.scope.signal,t.signal])},r=()=>{},i=new Promise((e,t)=>{r=t}),a=()=>{},o=new Promise((t,n)=>{let r=()=>{try{e.scope.signal.throwIfAborted()}catch(e){n(e)}};if(e.scope.signal.aborted){r();return}e.scope.signal.addEventListener(`abort`,r,{once:!0}),a=()=>e.scope.signal.removeEventListener(`abort`,r)}),s=setTimeout(()=>{let n=new w(e.displayName,e.deadlineMs);t.abort(n),r(n)},e.deadlineMs);s.unref?.();let c=ue(e,n),l,u=c.then(e=>(l??={kind:`acquisition`},e),e=>{throw l??={kind:`acquisition-error`},e}),d=i.catch(e=>{throw l??={kind:`deadline`,error:e},e}),f=o.catch(e=>{throw l??={kind:`cancellation`,error:e},e});try{return await Promise.race([u,d,f])}finally{if(clearTimeout(s),a(),l?.kind===`deadline`||l?.kind===`cancellation`){let t=l.error;c.then(n=>le(e,n,t),()=>{}).catch(()=>{})}else c.catch(()=>{})}}async function le(e,t,n){try{t.reattached.status===`active`&&await C(e,t.reattached.handle,`late_handle_cleanup_failed`,n)}finally{await C(e,t.control,`late_control_cleanup_failed`,n)}}async function ue(e,t){let n,r;try{return n=await e.acquireControl(e.envelope,t),t.signal.throwIfAborted(),r=await n.reattach(e.envelope),t.signal.throwIfAborted(),{control:n,reattached:r}}catch(t){try{r?.status===`active`&&await C(e,r.handle,`late_handle_cleanup_failed`,t)}finally{n&&await C(e,n,`late_control_cleanup_failed`,t)}throw t}}async function C(e,t,n,r){try{await t[Symbol.asyncDispose]()}catch(t){e.onLateCleanupFailure(n,t,r)}}var w=class extends Error{deadlineMs;constructor(e,t){super(`${_(e)} recovery exceeded its ${t}ms deadline`),this.name=`DurableCaptureRecoveryDeadlineError`,this.deadlineMs=t}};const T=new Map;async function E(e){return await fe(e.resourcePath,async()=>{let t=e.store.read(e.resourcePath);if(t.status!==`decoded`)throw D(e.store,t.status===`missing`?`${e.store.displayName} resource record is missing`:`${e.store.displayName} resource record is unreattachable: ${t.message}`);if(!de(t.envelope.fence,e.expected))throw D(e.store,`${e.store.displayName} resource ownership fence was lost`);let n=t.envelope;return await e.run({get envelope(){return n},transition(t,r={}){return n=Object.freeze({...n,lifecycle:t,...r.descriptor===void 0?{}:{descriptor:r.descriptor},...r.metadata===void 0?{}:{metadata:r.metadata}}),e.store.write(e.resourcePath,n),n}})})}function de(e,t){return e.token===t.token&&e.generation===t.generation}async function fe(e,t){let n=T.get(e)??Promise.resolve(),r,i=new Promise(e=>{r=e}),a=n.catch(()=>{}).then(()=>i);T.set(e,a),await n.catch(()=>{});try{return await t()}finally{r(),T.get(e)===a&&T.delete(e)}}function D(t,n){return new e(`COMMAND_FAILED`,n,{reason:`ownership-fence-lost`,retriable:!1,hint:`Use the current ${t.displayName.toLowerCase()} resource owner or retain the recovery record for manual recovery.`})}async function pe(t,n,r){let i=t.sessionSlot.read(n.session);if(!i)throw new e(`INVALID_ARGS`,t.messages.noActive);try{let e=await O(t,{handle:i.handle,fence:i.envelope.fence,resourcePath:r,intent:n.intent});return j(t,n),e}catch(e){let i=t.store.read(r);throw i.status===`decoded`&&i.envelope.lifecycle===`completed`&&j(t,n),e}}async function O(e,t){return await E({store:e.store,resourcePath:t.resourcePath,expected:t.fence,run:async n=>{R(n);let r=L(n),i;try{i=await t.handle.finish(r)}catch(r){throw await k(e,n,t,r,t.intent),r}if(i.status===`completed`)return I(e,n,i),i.result;I(e,n,i);let a=F(e,i);throw await k(e,n,t,a,t.intent),a}})}async function k(e,t,n,r,i){if(i===`capture`&&e.failedFinishPolicy===`preserve-retry-material`){he(e,n,r);return}let a;try{a=await n.handle.forceCleanup()}catch(i){A(e,n,r,i,me(t,i));return}try{N(t,a)}catch(t){A(e,n,r,a.status===`cleanup-pending`?a.message??a.reason:`cleanup returned ${a.status}`,t);return}p(a)||A(e,n,r,a.message)}function me(e,t){try{N(e,{status:`cleanup-pending`,reason:`cleanup-unconfirmed`,message:M(t)});return}catch(e){return e}}function he(e,t,n){s({level:`error`,phase:`${v(e.resourceKind)}_finish_evidence_preserved`,data:{resourcePath:t.resourcePath,finishError:M(n),failedFinishPolicy:e.failedFinishPolicy}})}function A(e,t,n,r,i){s({level:`error`,phase:`${v(e.resourceKind)}_finish_cleanup_failed`,data:{resourcePath:t.resourcePath,finishError:M(n),cleanupError:r===void 0?`cleanup could not be confirmed`:M(r),...i===void 0?{}:{transitionError:M(i)}}})}function j(e,t){t.sessionStore.set(t.sessionName,e.sessionSlot.replace(t.session,void 0))}function M(e){return e instanceof Error?e.message:String(e)}async function ge(e,t){let n=e.sessionSlot.read(t.session);n&&(P(e,await E({store:e.store,resourcePath:t.resourcePath,expected:n.envelope.fence,run:async e=>{R(e);let t=await n.handle.forceCleanup();return N(e,t),t}})),t.sessionStore&&t.sessionName&&t.sessionStore.set(t.sessionName,e.sessionSlot.replace(t.session,void 0)))}function N(e,t){e.transition(p(t)?`completed`:`open`,{metadata:{...e.envelope.metadata??{},phase:p(t)?`completed`:`cleanup-pending`,cleanupStatus:t.status,...t.status===`cleanup-pending`?{cleanupPendingReason:t.reason,...t.message?{cleanupPendingMessage:t.message}:{}}:{}}})}function P(e,t){if(!p(t))throw F(e,t)}function F(t,n){return new e(`COMMAND_FAILED`,n.message??`${_(t.displayName)} cleanup could not be confirmed`,{reason:n.reason,retriable:n.reason!==`ownership-fence-lost`,hint:t.messages.cleanupPendingHint})}function I(e,t,n){if(n.status===`completed`){t.transition(`completed`,{metadata:{...t.envelope.metadata??{},...e.completionMetadata(n.result),phase:`completed`}});return}N(t,n)}function L(e){return Object.freeze({learned:e.envelope.metadata,record:t=>{e.transition(`open`,{metadata:{...e.envelope.metadata??{},...t}})}})}function R(e){e.transition(`open`,{metadata:{...e.envelope.metadata??{},phase:`completing`}})}async function _e(e){let t=e.definition.store.list(e.sessionsDir),n=[];for(let r of t)n.push(await z(e,r));return{scanned:t.length,recovered:n.filter(e=>e===`recovered`).length,retained:n.filter(e=>e===`retained`).length}}async function z(e,t){let n=ve(e,t);if(n.status!==`recoverable`)return n.status;try{return await ye(e,t,n.envelope,e.perRecordDeadlineMs??5e3)?`recovered`:`retained`}catch(n){return H(e,n instanceof w?`timed_out`:`failed`,t,{error:n instanceof Error?n.message:String(n),...n instanceof w?{deadlineMs:n.deadlineMs}:{}}),`retained`}}function ve(e,t){let n=e.definition.store.read(t);if(n.status===`unreattachable`)return H(e,`record_unreattachable`,t,{reason:n.reason,message:n.message,version:n.version}),{status:`retained`};if(n.status===`missing`||n.envelope.lifecycle===`completed`)return{status:`ignored`};let r=e.definition.store.resolvePath(e.resolveSessionDir(n.envelope.sessionId));return h.resolve(t)===h.resolve(r)?{status:`recoverable`,envelope:n.envelope}:(H(e,`session_path_mismatch`,t,{envelopeSessionId:n.envelope.sessionId,canonicalPath:r}),{status:`retained`})}async function ye(e,t,n,r){return await be(e,t,n,await S({displayName:e.definition.displayName,envelope:n,scope:e.scope,deadlineMs:r,acquireControl:e.acquireControl,onLateCleanupFailure:(n,r,i)=>H(e,n,t,{error:r instanceof Error?r.message:String(r),primaryError:i instanceof Error?i.message:String(i)})}))}async function be(e,t,n,r){try{switch(r.reattached.status){case`active`:{let i=r.reattached.handle,a=await E({store:e.definition.store,resourcePath:t,expected:n.fence,run:async e=>{xe(e);let t=await i.forceCleanup();return N(e,t),t}});return p(a)}case`completed`:return await B(e,t,n,{...e.definition.completionMetadata(r.reattached.result)}),!0;case`missing`:return await B(e,t,n,{recoveryStatus:`already-missing`}),!0;case`unreattachable`:{if(!V(r.reattached.reason))return H(e,`retained`,t,{reason:r.reattached.reason,message:r.reattached.message}),!1;let i=await r.control.cleanup(n);return await E({store:e.definition.store,resourcePath:t,expected:n.fence,run:async e=>N(e,i)}),p(i)}}}finally{await r.control[Symbol.asyncDispose]()}}async function B(e,t,n,r){await E({store:e.definition.store,resourcePath:t,expected:n.fence,run:async e=>{e.transition(`completed`,{metadata:{...e.envelope.metadata??{},phase:`completed`,...r}})}})}function xe(e){e.transition(`open`,{metadata:{...e.envelope.metadata??{},phase:`completing`}})}function V(e){switch(e){case`descriptor-invalid`:case`descriptor-version-unsupported`:case`ownership-fence-lost`:return!1;case`owner-unavailable`:case`transport-not-reattachable`:return!0}}function H(e,t,n,r){let i={phase:`${v(e.definition.resourceKind)}_recovery_${t}`,resourcePath:n,data:r};e.onDiagnostic?e.onDiagnostic(i):s({level:`warn`,phase:i.phase,data:{resourcePath:n,...r}})}async function Se(t,n){let r=t.store.read(n.resourcePath);if(r.status!==`decoded`||r.envelope.lifecycle!==`open`)throw Ce(t,r.status);let i=r.envelope,a=await S({displayName:t.displayName,envelope:i,scope:n.scope,deadlineMs:n.deadlineMs??5e3,acquireControl:n.acquireControl,onLateCleanupFailure:(e,r,i)=>n.scope.diagnostics.emit({level:`error`,phase:`${v(t.resourceKind)}_recovery_${e}`,data:{resourcePath:n.resourcePath,error:U(r),primaryError:U(i)}})});try{switch(a.reattached.status){case`active`:return await O(t,{handle:a.reattached.handle,fence:i.fence,resourcePath:n.resourcePath,intent:`capture`});case`completed`:{let e=a.reattached.result;return await E({store:t.store,resourcePath:n.resourcePath,expected:i.fence,run:async n=>{I(t,n,{status:`completed`,result:e,alreadyCompleted:!0})}}),e}case`missing`:throw new e(`COMMAND_FAILED`,`${_(t.displayName)} is missing`,{reason:`resource-missing`,hint:t.messages.cleanupPendingHint});case`unreattachable`:if(V(a.reattached.reason)){let e=await a.control.cleanup(i);await E({store:t.store,resourcePath:n.resourcePath,expected:i.fence,run:async t=>N(t,e)}),P(t,e)}throw new e(`COMMAND_FAILED`,a.reattached.message??`${_(t.displayName)} cannot be reattached`,{reason:a.reattached.reason,hint:t.messages.cleanupPendingHint})}}finally{await a.control[Symbol.asyncDispose]()}}function Ce(t,n){return new e(`INVALID_ARGS`,n===`missing`?t.messages.noActive:`${_(t.displayName)} recovery record is not open`)}function U(e){return e instanceof Error?e.message:String(e)}function W(e){Te(e.fileName);let t=t=>h.join(t,e.fileName);return Object.freeze({resourceKind:e.resourceKind,displayName:e.displayName,resolvePath:t,read(t){let n,r;try{if(n=l(t),n===void 0)return{status:`missing`};r=JSON.parse(g.readFileSync(n,`utf8`))}catch(t){return K(t)?{status:`missing`}:G(De(t,e.displayName))}finally{n!==void 0&&g.closeSync(n)}return we(d(r),e.resourceKind)},write(e,t){let n=h.dirname(e);g.mkdirSync(n,{recursive:!0}),c({destination:e,contents:`${JSON.stringify(t)}\n`})},list(e){let n;try{n=g.readdirSync(e,{withFileTypes:!0})}catch{return[]}return n.filter(e=>e.isDirectory()).map(n=>t(h.join(e,n.name))).filter(Ee).sort()}})}function we(e,t){return e.status===`decoded`?e.envelope.resourceKind===t?{status:`decoded`,envelope:e.envelope}:G(`Expected ${t} resource record, received ${e.envelope.resourceKind}`):e}function Te(e){if(e.length===0||h.basename(e)!==e)throw TypeError(`Durable capture resource fileName must be one file name`)}function Ee(e){try{return g.lstatSync(e),!0}catch(e){return!K(e)}}function G(e){return{status:`unreattachable`,reason:`descriptor-invalid`,message:e}}function K(e){return typeof e==`object`&&!!e&&`code`in e&&e.code===`ENOENT`}function De(e,t){return e instanceof Error?e.message:`${t} resource record is invalid`}function Oe(e,t){t.admissionLedger.assertStartAllowed(t.device),ke(e,t.resourcePath,t.device);let n=e.store.read(t.resourcePath);return Object.freeze({token:ee.randomUUID(),generation:n.status===`decoded`?n.envelope.fence.generation+1:1})}function ke(n,i,a){let o=t(r(a));for(let r of n.store.list(h.dirname(h.dirname(i)))){let a=n.store.read(r);if(a.status===`unreattachable`)throw new e(`COMMAND_FAILED`,`${_(q(n.displayName))} ${n.displayName} recovery record is unreattachable: ${a.message}`,{reason:a.reason,retriable:!1,hint:`Retain the corrupt or future-version ${n.displayName} manifest for manual recovery; no replacement capture is safe.`});if(a.status===`decoded`&&a.envelope.lifecycle!==`completed`&&(r===i||t(a.envelope.device)===o))throw new e(`COMMAND_FAILED`,`${_(q(n.displayName))} ${n.displayName} resource for this device has not reached a confirmed terminal state`,{reason:`cleanup-unconfirmed`,hint:`Retry exact-owner cleanup using the existing ${n.displayName} manifest before starting a replacement.`})}}function q(e){return/^[aeiou]/i.test(e)?`an`:`a`}function J(e){let t=(t,n)=>e.store.resolvePath(t.resolveSessionDir(n)),n=t=>({definition:e,resolveSessionDir:e=>h.join(t.sessionsDir,u(e)),...t});return Object.freeze({store:e.store,resourcePath:t,createNextFence(t){return Oe(e,t)},adoptStarted(n){return te(e,{...n,reportUndurableCleanup:(e,t)=>{t.confirmed?n.admissionLedger.clearUndurableCleanup(e):n.admissionLedger.blockUndurableCleanup(e,t.reason)}},t(n.sessionStore,n.sessionName))},finishLive(n){return pe(e,n,t(n.sessionStore,n.sessionName))},finishRecovered(t){return Se(e,t)},forceCleanupLive(t){return ge(e,t)},recoverAll(e){return _e(n(e))},recoverOne(e,t){return z(n(e),t)}})}const Y=J({resourceKind:`screen-recording`,displayName:`screen recording`,store:W({resourceKind:m,fileName:`screen-recording.resource.json`,displayName:`screen recording`}),sessionSlot:{read:e=>e.screenRecording,replace:(e,t)=>({...e,screenRecording:t})},completionMetadata:Me,failedFinishPolicy:`preserve-retry-material`,messages:{noActive:`no active recording`,cleanupPendingHint:`Keep screen-recording.resource.json and retry stop through its exact runtime owner.`}});function Ae(e){return Y.adoptStarted(e)}function je(e){return Y.finishLive(e)}const X=`completion`;function Me(e){return{[X]:{backend:e.backend,outPath:e.outPath,startedAt:e.startedAt,completedAt:e.completedAt,...e.capturedDurationMs===void 0?{}:{capturedDurationMs:e.capturedDurationMs},...e.stopObservation===void 0?{}:{stopObservation:Pe(e.stopObservation)},...e.nativePathDisposition===void 0?{}:{nativePathDisposition:e.nativePathDisposition},scope:e.scope,showTouches:e.showTouches,recordOnlySession:e.recordOnlySession,...e.clientOutPath===void 0?{}:{clientOutPath:e.clientOutPath},...e.telemetryPath===void 0?{}:{telemetryPath:e.telemetryPath},...e.warning===void 0?{}:{warning:e.warning},...e.overlayWarning===void 0?{}:{overlayWarning:e.overlayWarning},...e.activeSessionApp===void 0?{}:{activeSessionApp:Ne(e.activeSessionApp)},...e.chunks===void 0?{}:{chunks:e.chunks.map(Fe)}}}}function Ne(e){return{bundleId:e.bundleId,...e.name===void 0?{}:{name:e.name}}}function Pe(e){return e.recorder===`confirmed`?{recorder:e.recorder}:{recorder:e.recorder,why:e.why}}function Fe(e){return{index:e.index,path:e.path,...e.clientOutPath===void 0?{}:{clientOutPath:e.clientOutPath}}}function Z(e){return Y.finishRecovered(e)}async function Q(e){let t;try{return t=await e.gateway.bind({device:Ie(e.envelope),intent:{kind:`exact-owner`,owner:e.envelope.owner,fence:e.envelope.fence},scope:e.scope}),e.scope.signal.throwIfAborted(),e.create(t)}catch(e){throw t&&await t[Symbol.asyncDispose](),e}}function Ie(e){return{platform:e.device.family,id:e.device.id,name:e.device.id,kind:e.device.kind,...e.device.target===void 0?{}:{target:e.device.target},...e.device.appleOs===void 0?{}:{appleOs:e.device.appleOs},...e.device.iosPhysicalDeviceBackend===void 0?{}:{iosPhysicalDeviceBackend:e.device.iosPhysicalDeviceBackend}}}function Le(e){return Y.recoverOne({sessionsDir:e.sessionsDir,scope:e.scope,perRecordDeadlineMs:e.perRecordDeadlineMs,onDiagnostic:e.onDiagnostic,acquireControl:async(t,n)=>await Re(e.gateway,t,n)},e.resourcePath)}async function Re(e,t,n){return await Q({gateway:e,envelope:t,scope:n,create:e=>$({runtime:a(e,i),dispose:async()=>await e[Symbol.asyncDispose]()})})}function $(e){return Object.freeze({reattach:async t=>await e.runtime.operations.screenRecordingReattach({envelope:t}),cleanup:async t=>await e.runtime.operations.screenRecordingCleanup({envelope:t}),[Symbol.asyncDispose]:e.dispose})}export{Ae as a,Y as c,X as i,J as l,Le as n,je as o,Q as r,Z as s,$ as t,W as u};
@@ -0,0 +1 @@
1
+ import{T as e}from"./sdk-device.js";import{a as t,n}from"./durable-resource.js";import{n as r}from"./async-lifecycle.js";import{n as i,t as a}from"./screen-recording-completion.js";import{t as o}from"./screen-recording-options.js";import{n as s}from"./screen-recording-runtime.js";function c(e){return Object.freeze({resourceKind:s,version:1,encode:e=>({...e}),decode:t=>t.backend===e&&typeof t.outputPath==`string`?{status:`decoded`,descriptor:Object.freeze({backend:e,outputPath:t.outputPath})}:{status:`invalid`,message:`Invalid ${e} screen-recording descriptor`}})}function l(e){return{status:`unreattachable`,reason:`transport-not-reattachable`,message:e}}function u(e){return{status:`cleanup-pending`,reason:`manual-recovery-required`,message:e}}async function d(l){let{host:u,device:d,owner:m,input:h,signal:g,transport:_}=l;o(h,l.support,l.unsupported),g.throwIfAborted(),await u.screenRecording.outputs.prepare(h.outputPath);let v=f(_),y=!1;try{await _.start(g),y=!0,g.throwIfAborted()}catch(e){throw y&&await v().catch(()=>{}),g.throwIfAborted(),e}let b=i(p(_.backend,h),{finish:async e=>{let t=await v();_.collect&&await _.collect(t,e.outPath);let n=await u.screenRecording.finalize.complete({outputPath:e.outPath,showTouches:!1,gestureEvents:e.gestureEvents,...e.exportQuality===void 0?{}:{exportQuality:e.exportQuality},targetLabel:_.targetLabel});return a(e,n,{stopObservation:{recorder:`confirmed`},showTouches:!1})},forceCleanup:async()=>{try{return await v(),{status:`cleaned`}}catch(e){return{status:`cleanup-pending`,reason:`transport-failed`,message:e instanceof Error?e.message:`${_.backend} recording cleanup failed`}}}});return Object.freeze({pendingHandle:new r(b),envelope:n({resourceKind:s,sessionId:h.sessionId,device:e(d),owner:m,fence:h.fence,lifecycle:`open`,descriptor:t(c(_.backend),{backend:_.backend,outputPath:h.outputPath})})})}function f(e){let t;return()=>t??=e.stop().catch(e=>{throw t=void 0,e})}function p(e,t){return Object.freeze({backend:e,outPath:t.outputPath,...t.clientOutputPath===void 0?{}:{clientOutPath:t.clientOutputPath},startedAt:Date.now(),scope:t.scope,showTouches:!1,recordOnlySession:t.recordOnlySession,...t.activeSessionApp===void 0?{}:{activeSessionApp:t.activeSessionApp},...t.exportQuality===void 0?{}:{exportQuality:t.exportQuality},gestureEvents:[]})}export{u as n,l as r,d as t};
@@ -1 +1 @@
1
- import{C as e}from"./sdk-contracts.js";import{l as t}from"./sdk-device.js";import{promises as n}from"node:fs";async function r(t){let r=await n.open(t,`r`);try{let t=Buffer.alloc(24),{bytesRead:n}=await r.read(t,0,t.length,0);if(n<t.length||t.toString(`ascii`,12,16)!==`IHDR`)throw new e(`COMMAND_FAILED`,`Screenshot file is not a valid PNG`);return{width:t.readUInt32BE(16),height:t.readUInt32BE(20)}}finally{await r.close()}}function i(t,n){if(!(n===void 0||c(t)))throw new e(`UNSUPPORTED_OPERATION`,`--pixel-density is currently supported only on iOS-family simulators`)}function a(e,t,n){let r=s(n);if(t!==r)return{width:Math.max(1,Math.round(e.width/t*r)),height:Math.max(1,Math.round(e.height/t*r))}}async function o(e){let t=c(e.device),n;try{n=await r(e.path)}catch(e){if(t)throw e;return{}}let i={width:n.width,height:n.height};if(!t||e.scale!==void 0&&e.scale!==1)return i;let a=s(e.requestedPixelDensity);return{...i,logicalWidth:Math.round(n.width/a),logicalHeight:Math.round(n.height/a),pixelDensity:a}}function s(e){return e??1}function c(e){return t(e)&&e.kind===`simulator`}export{r as i,a as n,o as r,i as t};
1
+ import{D as e}from"./sdk-contracts.js";import{u as t}from"./sdk-device.js";import{promises as n}from"node:fs";async function r(t){let r=await n.open(t,`r`);try{let t=Buffer.alloc(24),{bytesRead:n}=await r.read(t,0,t.length,0);if(n<t.length||t.toString(`ascii`,12,16)!==`IHDR`)throw new e(`COMMAND_FAILED`,`Screenshot file is not a valid PNG`);return{width:t.readUInt32BE(16),height:t.readUInt32BE(20)}}finally{await r.close()}}function i(t,n){if(!(n===void 0||c(t)))throw new e(`UNSUPPORTED_OPERATION`,`--pixel-density is currently supported only on iOS-family simulators`)}function a(e,t,n){let r=s(n);if(t!==r)return{width:Math.max(1,Math.round(e.width/t*r)),height:Math.max(1,Math.round(e.height/t*r))}}async function o(e){let t=c(e.device),n;try{n=await r(e.path)}catch(e){if(t)throw e;return{}}let i={width:n.width,height:n.height};if(!t||e.scale!==void 0&&e.scale!==1)return i;let a=s(e.requestedPixelDensity);return{...i,logicalWidth:Math.round(n.width/a),logicalHeight:Math.round(n.height/a),pixelDensity:a}}function s(e){return e??1}function c(e){return t(e)&&e.kind===`simulator`}export{r as i,a as n,o as r,i as t};
@@ -0,0 +1 @@
1
+ import{t as e}from"./rolldown-runtime.js";import{D as t}from"./sdk-contracts.js";import{n,r,t as i}from"./png.js";var a=e(((e,t)=>{function n(e){var n=Math.floor,r=Array(64),i=Array(64),a=Array(64),o=Array(64),s,c,l,u,d=Array(65535),f=Array(65535),p=Array(64),m=Array(64),h=[],g=0,_=7,v=Array(64),y=Array(64),b=Array(64),x=Array(256),S=Array(2048),C,w=[0,1,5,6,14,15,27,28,2,4,7,13,16,26,29,42,3,8,12,17,25,30,41,43,9,11,18,24,31,40,44,53,10,19,23,32,39,45,52,54,20,22,33,38,46,51,55,60,21,34,37,47,50,56,59,61,35,36,48,49,57,58,62,63],T=[0,0,1,5,1,1,1,1,1,1,0,0,0,0,0,0,0],E=[0,1,2,3,4,5,6,7,8,9,10,11],D=[0,0,2,1,3,3,2,4,3,5,5,4,4,0,0,1,125],O=[1,2,3,0,4,17,5,18,33,49,65,6,19,81,97,7,34,113,20,50,129,145,161,8,35,66,177,193,21,82,209,240,36,51,98,114,130,9,10,22,23,24,25,26,37,38,39,40,41,42,52,53,54,55,56,57,58,67,68,69,70,71,72,73,74,83,84,85,86,87,88,89,90,99,100,101,102,103,104,105,106,115,116,117,118,119,120,121,122,131,132,133,134,135,136,137,138,146,147,148,149,150,151,152,153,154,162,163,164,165,166,167,168,169,170,178,179,180,181,182,183,184,185,186,194,195,196,197,198,199,200,201,202,210,211,212,213,214,215,216,217,218,225,226,227,228,229,230,231,232,233,234,241,242,243,244,245,246,247,248,249,250],k=[0,0,3,1,1,1,1,1,1,1,1,1,0,0,0,0,0],A=[0,1,2,3,4,5,6,7,8,9,10,11],j=[0,0,2,1,2,4,4,3,4,7,5,4,4,0,1,2,119],M=[0,1,2,3,17,4,5,33,49,6,18,65,81,7,97,113,19,34,50,129,8,20,66,145,161,177,193,9,35,51,82,240,21,98,114,209,10,22,36,52,225,37,241,23,24,25,26,38,39,40,41,42,53,54,55,56,57,58,67,68,69,70,71,72,73,74,83,84,85,86,87,88,89,90,99,100,101,102,103,104,105,106,115,116,117,118,119,120,121,122,130,131,132,133,134,135,136,137,138,146,147,148,149,150,151,152,153,154,162,163,164,165,166,167,168,169,170,178,179,180,181,182,183,184,185,186,194,195,196,197,198,199,200,201,202,210,211,212,213,214,215,216,217,218,226,227,228,229,230,231,232,233,234,242,243,244,245,246,247,248,249,250];function N(e){for(var t=[16,11,10,16,24,40,51,61,12,12,14,19,26,58,60,55,14,13,16,24,40,57,69,56,14,17,22,29,51,87,80,62,18,22,37,56,68,109,103,77,24,35,55,64,81,104,113,92,49,64,78,87,103,121,120,101,72,92,95,98,112,100,103,99],s=0;s<64;s++){var c=n((t[s]*e+50)/100);c<1?c=1:c>255&&(c=255),r[w[s]]=c}for(var l=[17,18,24,47,99,99,99,99,18,21,26,66,99,99,99,99,24,26,56,99,99,99,99,99,47,66,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99],u=0;u<64;u++){var d=n((l[u]*e+50)/100);d<1?d=1:d>255&&(d=255),i[w[u]]=d}for(var f=[1,1.387039845,1.306562965,1.175875602,1,.785694958,.5411961,.275899379],p=0,m=0;m<8;m++)for(var h=0;h<8;h++)a[p]=1/(r[w[p]]*f[m]*f[h]*8),o[p]=1/(i[w[p]]*f[m]*f[h]*8),p++}function P(e,t){for(var n=0,r=0,i=[],a=1;a<=16;a++){for(var o=1;o<=e[a];o++)i[t[r]]=[],i[t[r]][0]=n,i[t[r]][1]=a,r++,n++;n*=2}return i}function F(){s=P(T,E),c=P(k,A),l=P(D,O),u=P(j,M)}function I(){for(var e=1,t=2,n=1;n<=15;n++){for(var r=e;r<t;r++)f[32767+r]=n,d[32767+r]=[],d[32767+r][1]=n,d[32767+r][0]=r;for(var i=-(t-1);i<=-e;i++)f[32767+i]=n,d[32767+i]=[],d[32767+i][1]=n,d[32767+i][0]=t-1+i;e<<=1,t<<=1}}function L(){for(var e=0;e<256;e++)S[e]=19595*e,S[e+256>>0]=38470*e,S[e+512>>0]=7471*e+32768,S[e+768>>0]=-11059*e,S[e+1024>>0]=-21709*e,S[e+1280>>0]=32768*e+8421375,S[e+1536>>0]=-27439*e,S[e+1792>>0]=-5329*e}function R(e){for(var t=e[0],n=e[1]-1;n>=0;)t&1<<n&&(g|=1<<_),n--,_--,_<0&&(g==255?(z(255),z(0)):z(g),_=7,g=0)}function z(e){h.push(e)}function B(e){z(e>>8&255),z(e&255)}function V(e,t){var n,r,i,a,o,s,c,l,u=0,d,f=8,m=64;for(d=0;d<f;++d){n=e[u],r=e[u+1],i=e[u+2],a=e[u+3],o=e[u+4],s=e[u+5],c=e[u+6],l=e[u+7];var h=n+l,g=n-l,_=r+c,v=r-c,y=i+s,b=i-s,x=a+o,S=a-o,C=h+x,w=h-x,T=_+y,E=_-y;e[u]=C+T,e[u+4]=C-T;var D=(E+w)*.707106781;e[u+2]=w+D,e[u+6]=w-D,C=S+b,T=b+v,E=v+g;var O=(C-E)*.382683433,k=.5411961*C+O,A=1.306562965*E+O,j=T*.707106781,M=g+j,N=g-j;e[u+5]=N+k,e[u+3]=N-k,e[u+1]=M+A,e[u+7]=M-A,u+=8}for(u=0,d=0;d<f;++d){n=e[u],r=e[u+8],i=e[u+16],a=e[u+24],o=e[u+32],s=e[u+40],c=e[u+48],l=e[u+56];var P=n+l,F=n-l,I=r+c,L=r-c,R=i+s,z=i-s,B=a+o,V=a-o,H=P+B,U=P-B,W=I+R,G=I-R;e[u]=H+W,e[u+32]=H-W;var K=(G+U)*.707106781;e[u+16]=U+K,e[u+48]=U-K,H=V+z,W=z+L,G=L+F;var q=(H-G)*.382683433,J=.5411961*H+q,Y=1.306562965*G+q,X=W*.707106781,Z=F+X,Q=F-X;e[u+40]=Q+J,e[u+24]=Q-J,e[u+8]=Z+Y,e[u+56]=Z-Y,u++}var $;for(d=0;d<m;++d)$=e[d]*t[d],p[d]=$>0?$+.5|0:$-.5|0;return p}function H(){B(65504),B(16),z(74),z(70),z(73),z(70),z(0),z(1),z(1),z(0),B(1),B(1),z(0),z(0)}function U(e){if(e){B(65505),e[0]===69&&e[1]===120&&e[2]===105&&e[3]===102?B(e.length+2):(B(e.length+5+2),z(69),z(120),z(105),z(102),z(0));for(var t=0;t<e.length;t++)z(e[t])}}function W(e,t){B(65472),B(17),z(8),B(t),B(e),z(3),z(1),z(17),z(0),z(2),z(17),z(1),z(3),z(17),z(1)}function G(){B(65499),B(132),z(0);for(var e=0;e<64;e++)z(r[e]);z(1);for(var t=0;t<64;t++)z(i[t])}function K(){B(65476),B(418),z(0);for(var e=0;e<16;e++)z(T[e+1]);for(var t=0;t<=11;t++)z(E[t]);z(16);for(var n=0;n<16;n++)z(D[n+1]);for(var r=0;r<=161;r++)z(O[r]);z(1);for(var i=0;i<16;i++)z(k[i+1]);for(var a=0;a<=11;a++)z(A[a]);z(17);for(var o=0;o<16;o++)z(j[o+1]);for(var s=0;s<=161;s++)z(M[s])}function q(e){e!==void 0&&e.constructor===Array&&e.forEach(e=>{if(typeof e==`string`){B(65534);var t=e.length;B(t+2);var n;for(n=0;n<t;n++)z(e.charCodeAt(n))}})}function J(){B(65498),B(12),z(3),z(1),z(0),z(2),z(17),z(3),z(17),z(0),z(63),z(0)}function Y(e,t,n,r,i){for(var a=i[0],o=i[240],s,c=16,l=63,u=64,p=V(e,t),h=0;h<u;++h)m[w[h]]=p[h];var g=m[0]-n;n=m[0],g==0?R(r[0]):(s=32767+g,R(r[f[s]]),R(d[s]));for(var _=63;_>0&&m[_]==0;_--);if(_==0)return R(a),n;for(var v=1,y;v<=_;){for(var b=v;m[v]==0&&v<=_;++v);var x=v-b;if(x>=c){y=x>>4;for(var S=1;S<=y;++S)R(o);x&=15}s=32767+m[v],R(i[(x<<4)+f[s]]),R(d[s]),v++}return _!=l&&R(a),n}function X(){for(var e=String.fromCharCode,t=0;t<256;t++)x[t]=e(t)}this.encode=function(e,n){new Date().getTime(),n&&Z(n),h=[],g=0,_=7,B(65496),H(),q(e.comments),U(e.exifBuffer),G(),W(e.width,e.height),K(),J();var r=0,i=0,d=0;g=0,_=7,this.encode.displayName=`_encode_`;var f=e.data,p=e.width,m=e.height,x=p*4;p*3;for(var C,w=0,T,E,D,O,k,A,j,M;w<m;){for(C=0;C<x;){for(O=x*w+C,k=O,A=-1,j=0,M=0;M<64;M++)j=M>>3,A=(M&7)*4,k=O+j*x+A,w+j>=m&&(k-=x*(w+1+j-m)),C+A>=x&&(k-=C+A-x+4),T=f[k++],E=f[k++],D=f[k++],v[M]=(S[T]+S[E+256>>0]+S[D+512>>0]>>16)-128,y[M]=(S[T+768>>0]+S[E+1024>>0]+S[D+1280>>0]>>16)-128,b[M]=(S[T+1280>>0]+S[E+1536>>0]+S[D+1792>>0]>>16)-128;r=Y(v,a,r,s,l),i=Y(y,o,i,c,u),d=Y(b,o,d,c,u),C+=32}w+=8}if(_>=0){var N=[];N[1]=_+1,N[0]=(1<<_+1)-1,R(N)}return B(65497),t===void 0?new Uint8Array(h):Buffer.from(h)};function Z(e){if(e<=0&&(e=1),e>100&&(e=100),C!=e){var t=0;t=Math.floor(e<50?5e3/e:200-e*2),N(t),C=e}}function Q(){var t=new Date().getTime();e||=50,X(),F(),I(),L(),Z(e),new Date().getTime()-t}Q()}t===void 0?typeof window<`u`&&(window[`jpeg-js`]=window[`jpeg-js`]||{},window[`jpeg-js`].encode=r):t.exports=r;function r(e,t){return t===void 0&&(t=50),{data:new n(t).encode(e,t),width:e.width,height:e.height}}})),o=e(((e,t)=>{var n=(function(){var e=new Int32Array([0,1,8,16,9,2,3,10,17,24,32,25,18,11,4,5,12,19,26,33,40,48,41,34,27,20,13,6,7,14,21,28,35,42,49,56,57,50,43,36,29,22,15,23,30,37,44,51,58,59,52,45,38,31,39,46,53,60,61,54,47,55,62,63]),t=4017,n=799,r=3406,i=2276,a=1567,o=3784,s=5793,c=2896;function l(){}function u(e,t){for(var n=0,r=[],i,a,o=16;o>0&&!e[o-1];)o--;r.push({children:[],index:0});var s=r[0],c;for(i=0;i<o;i++){for(a=0;a<e[i];a++){for(s=r.pop(),s.children[s.index]=t[n];s.index>0;){if(r.length===0)throw Error(`Could not recreate Huffman Table`);s=r.pop()}for(s.index++,r.push(s);r.length<=i;)r.push(c={children:[],index:0}),s.children[s.index]=c.children,s=c;n++}i+1<o&&(r.push(c={children:[],index:0}),s.children[s.index]=c.children,s=c)}return r[0].children}function d(t,n,r,i,a,o,s,c,l,u){r.precision,r.samplesPerLine,r.scanLines;var d=r.mcusPerLine,f=r.progressive;r.maxH,r.maxV;var p=n,m=0,h=0;function g(){if(h>0)return h--,m>>h&1;if(m=t[n++],m==255){var e=t[n++];if(e)throw Error(`unexpected marker: `+(m<<8|e).toString(16))}return h=7,m>>>7}function _(e){for(var t=e,n;(n=g())!==null;){if(t=t[n],typeof t==`number`)return t;if(typeof t!=`object`)throw Error(`invalid huffman sequence`)}return null}function v(e){for(var t=0;e>0;){var n=g();if(n===null)return;t=t<<1|n,e--}return t}function y(e){var t=v(e);return t>=1<<e-1?t:t+(-1<<e)+1}function b(t,n){var r=_(t.huffmanTableDC),i=r===0?0:y(r);n[0]=t.pred+=i;for(var a=1;a<64;){var o=_(t.huffmanTableAC),s=o&15,c=o>>4;if(s===0){if(c<15)break;a+=16;continue}a+=c;var l=e[a];n[l]=y(s),a++}}function x(e,t){var n=_(e.huffmanTableDC),r=n===0?0:y(n)<<l;t[0]=e.pred+=r}function S(e,t){t[0]|=g()<<l}var C=0;function w(t,n){if(C>0){C--;return}for(var r=o,i=s;r<=i;){var a=_(t.huffmanTableAC),c=a&15,u=a>>4;if(c===0){if(u<15){C=v(u)+(1<<u)-1;break}r+=16;continue}r+=u;var d=e[r];n[d]=y(c)*(1<<l),r++}}var T=0,E;function D(t,n){for(var r=o,i=s,a=0;r<=i;){var c=e[r],u=n[c]<0?-1:1;switch(T){case 0:var d=_(t.huffmanTableAC),f=d&15,a=d>>4;if(f===0)a<15?(C=v(a)+(1<<a),T=4):(a=16,T=1);else{if(f!==1)throw Error(`invalid ACn encoding`);E=y(f),T=a?2:3}continue;case 1:case 2:n[c]?n[c]+=(g()<<l)*u:(a--,a===0&&(T=T==2?3:0));break;case 3:n[c]?n[c]+=(g()<<l)*u:(n[c]=E<<l,T=0);break;case 4:n[c]&&(n[c]+=(g()<<l)*u)}r++}T===4&&(C--,C===0&&(T=0))}function O(e,t,n,r,i){var a=n/d|0,o=n%d,s=a*e.v+r,c=o*e.h+i;e.blocks[s]===void 0&&u.tolerantDecoding||t(e,e.blocks[s][c])}function k(e,t,n){var r=n/e.blocksPerLine|0,i=n%e.blocksPerLine;e.blocks[r]===void 0&&u.tolerantDecoding||t(e,e.blocks[r][i])}var A=i.length,j,M,N,P,F,I=f?o===0?c===0?x:S:c===0?w:D:b,L=0,R,z=A==1?i[0].blocksPerLine*i[0].blocksPerColumn:d*r.mcusPerColumn;a||=z;for(var B,V;L<z;){for(M=0;M<A;M++)i[M].pred=0;if(C=0,A==1)for(j=i[0],F=0;F<a;F++)k(j,I,L),L++;else for(F=0;F<a;F++){for(M=0;M<A;M++)for(j=i[M],B=j.h,V=j.v,N=0;N<V;N++)for(P=0;P<B;P++)O(j,I,L,N,P);if(L++,L===z)break}if(L===z)do{if(t[n]===255&&t[n+1]!==0)break;n+=1}while(n<t.length-2);if(h=0,R=t[n]<<8|t[n+1],R<65280)throw Error(`marker was not found`);if(R>=65488&&R<=65495)n+=2;else break}return n-p}function f(e,l){var u=[],d=l.blocksPerLine,f=l.blocksPerColumn,p=d<<3,m=new Int32Array(64),h=new Uint8Array(64);function _(e,u,d){var f=l.quantizationTable,p,m,h,g,_,v,y,b,x,S=d,C;for(C=0;C<64;C++)S[C]=e[C]*f[C];for(C=0;C<8;++C){var w=8*C;if(S[1+w]==0&&S[2+w]==0&&S[3+w]==0&&S[4+w]==0&&S[5+w]==0&&S[6+w]==0&&S[7+w]==0){x=s*S[0+w]+512>>10,S[0+w]=x,S[1+w]=x,S[2+w]=x,S[3+w]=x,S[4+w]=x,S[5+w]=x,S[6+w]=x,S[7+w]=x;continue}p=s*S[0+w]+128>>8,m=s*S[4+w]+128>>8,h=S[2+w],g=S[6+w],_=c*(S[1+w]-S[7+w])+128>>8,b=c*(S[1+w]+S[7+w])+128>>8,v=S[3+w]<<4,y=S[5+w]<<4,x=p-m+1>>1,p=p+m+1>>1,m=x,x=h*o+g*a+128>>8,h=h*a-g*o+128>>8,g=x,x=_-y+1>>1,_=_+y+1>>1,y=x,x=b+v+1>>1,v=b-v+1>>1,b=x,x=p-g+1>>1,p=p+g+1>>1,g=x,x=m-h+1>>1,m=m+h+1>>1,h=x,x=_*i+b*r+2048>>12,_=_*r-b*i+2048>>12,b=x,x=v*n+y*t+2048>>12,v=v*t-y*n+2048>>12,y=x,S[0+w]=p+b,S[7+w]=p-b,S[1+w]=m+y,S[6+w]=m-y,S[2+w]=h+v,S[5+w]=h-v,S[3+w]=g+_,S[4+w]=g-_}for(C=0;C<8;++C){var T=C;if(S[8+T]==0&&S[16+T]==0&&S[24+T]==0&&S[32+T]==0&&S[40+T]==0&&S[48+T]==0&&S[56+T]==0){x=s*d[C+0]+8192>>14,S[0+T]=x,S[8+T]=x,S[16+T]=x,S[24+T]=x,S[32+T]=x,S[40+T]=x,S[48+T]=x,S[56+T]=x;continue}p=s*S[0+T]+2048>>12,m=s*S[32+T]+2048>>12,h=S[16+T],g=S[48+T],_=c*(S[8+T]-S[56+T])+2048>>12,b=c*(S[8+T]+S[56+T])+2048>>12,v=S[24+T],y=S[40+T],x=p-m+1>>1,p=p+m+1>>1,m=x,x=h*o+g*a+2048>>12,h=h*a-g*o+2048>>12,g=x,x=_-y+1>>1,_=_+y+1>>1,y=x,x=b+v+1>>1,v=b-v+1>>1,b=x,x=p-g+1>>1,p=p+g+1>>1,g=x,x=m-h+1>>1,m=m+h+1>>1,h=x,x=_*i+b*r+2048>>12,_=_*r-b*i+2048>>12,b=x,x=v*n+y*t+2048>>12,v=v*t-y*n+2048>>12,y=x,S[0+T]=p+b,S[56+T]=p-b,S[8+T]=m+y,S[48+T]=m-y,S[16+T]=h+v,S[40+T]=h-v,S[24+T]=g+_,S[32+T]=g-_}for(C=0;C<64;++C){var E=128+(S[C]+8>>4);u[C]=E<0?0:E>255?255:E}}g(p*f*8);for(var v,y,b=0;b<f;b++){var x=b<<3;for(v=0;v<8;v++)u.push(new Uint8Array(p));for(var S=0;S<d;S++){_(l.blocks[b][S],h,m);var C=0,w=S<<3;for(y=0;y<8;y++){var T=u[x+y];for(v=0;v<8;v++)T[w+v]=h[C++]}}}return u}function p(e){return e<0?0:e>255?255:e}l.prototype={load:function(e){var t=new XMLHttpRequest;t.open(`GET`,e,!0),t.responseType=`arraybuffer`,t.onload=(function(){var e=new Uint8Array(t.response||t.mozResponseArrayBuffer);this.parse(e),this.onload&&this.onload()}).bind(this),t.send(null)},parse:function(t){var n=this.opts.maxResolutionInMP*1e3*1e3,r=0;t.length;function i(){var e=t[r]<<8|t[r+1];return r+=2,e}function a(){var e=i(),n=t.subarray(r,r+e-2);return r+=n.length,n}function o(e){var t=1,n=1,r,i;for(i in e.components)e.components.hasOwnProperty(i)&&(r=e.components[i],t<r.h&&(t=r.h),n<r.v&&(n=r.v));var a=Math.ceil(e.samplesPerLine/8/t),o=Math.ceil(e.scanLines/8/n);for(i in e.components)if(e.components.hasOwnProperty(i)){r=e.components[i];var s=Math.ceil(Math.ceil(e.samplesPerLine/8)*r.h/t),c=Math.ceil(Math.ceil(e.scanLines/8)*r.v/n),l=a*r.h,u=o*r.v,d=u*l,f=[];g(d*256);for(var p=0;p<u;p++){for(var m=[],h=0;h<l;h++)m.push(new Int32Array(64));f.push(m)}r.blocksPerLine=s,r.blocksPerColumn=c,r.blocks=f}e.maxH=t,e.maxV=n,e.mcusPerLine=a,e.mcusPerColumn=o}var s=null,c=null,l,p,m=[],h=[],_=[],v=[],y=i(),b=-1;if(this.comments=[],y!=65496)throw Error(`SOI not found`);for(y=i();y!=65497;){var x,S;switch(y){case 65280:break;case 65504:case 65505:case 65506:case 65507:case 65508:case 65509:case 65510:case 65511:case 65512:case 65513:case 65514:case 65515:case 65516:case 65517:case 65518:case 65519:case 65534:var C=a();if(y===65534){var w=String.fromCharCode.apply(null,C);this.comments.push(w)}y===65504&&C[0]===74&&C[1]===70&&C[2]===73&&C[3]===70&&C[4]===0&&(s={version:{major:C[5],minor:C[6]},densityUnits:C[7],xDensity:C[8]<<8|C[9],yDensity:C[10]<<8|C[11],thumbWidth:C[12],thumbHeight:C[13],thumbData:C.subarray(14,14+3*C[12]*C[13])}),y===65505&&C[0]===69&&C[1]===120&&C[2]===105&&C[3]===102&&C[4]===0&&(this.exifBuffer=C.subarray(5,C.length)),y===65518&&C[0]===65&&C[1]===100&&C[2]===111&&C[3]===98&&C[4]===101&&C[5]===0&&(c={version:C[6],flags0:C[7]<<8|C[8],flags1:C[9]<<8|C[10],transformCode:C[11]});break;case 65499:for(var T=i()+r-2;r<T;){var E=t[r++];g(256);var D=new Int32Array(64);if(!(E>>4))for(S=0;S<64;S++){var O=e[S];D[O]=t[r++]}else if(E>>4==1)for(S=0;S<64;S++){var O=e[S];D[O]=i()}else throw Error(`DQT: invalid table spec`);m[E&15]=D}break;case 65472:case 65473:case 65474:i(),l={},l.extended=y===65473,l.progressive=y===65474,l.precision=t[r++],l.scanLines=i(),l.samplesPerLine=i(),l.components={},l.componentsOrder=[];var k=l.scanLines*l.samplesPerLine;if(k>n){var A=Math.ceil((k-n)/1e6);throw Error(`maxResolutionInMP limit exceeded by ${A}MP`)}var j=t[r++],M;for(x=0;x<j;x++){M=t[r];var N=t[r+1]>>4,P=t[r+1]&15,F=t[r+2];if(N<=0||P<=0)throw Error(`Invalid sampling factor, expected values above 0`);l.componentsOrder.push(M),l.components[M]={h:N,v:P,quantizationIdx:F},r+=3}o(l),h.push(l);break;case 65476:var I=i();for(x=2;x<I;){var L=t[r++],R=new Uint8Array(16),z=0;for(S=0;S<16;S++,r++)z+=R[S]=t[r];g(16+z);var B=new Uint8Array(z);for(S=0;S<z;S++,r++)B[S]=t[r];x+=17+z,(L>>4?_:v)[L&15]=u(R,B)}break;case 65501:i(),p=i();break;case 65500:i(),i();break;case 65498:i();var V=t[r++],H=[],U;for(x=0;x<V;x++){U=l.components[t[r++]];var W=t[r++];U.huffmanTableDC=v[W>>4],U.huffmanTableAC=_[W&15],H.push(U)}var G=t[r++],K=t[r++],q=t[r++],J=d(t,r,l,H,p,G,K,q>>4,q&15,this.opts);r+=J;break;case 65535:t[r]!==255&&r--;break;default:if(t[r-3]==255&&t[r-2]>=192&&t[r-2]<=254){r-=3;break}if(y===224||y==225){if(b!==-1)throw Error(`first unknown JPEG marker at offset ${b.toString(16)}, second unknown JPEG marker ${y.toString(16)} at offset ${(r-1).toString(16)}`);b=r-1;let e=i();if(t[r+e-2]===255){r+=e-2;break}}throw Error(`unknown JPEG marker `+y.toString(16))}y=i()}if(h.length!=1)throw Error(`only single frame JPEGs supported`);for(var x=0;x<h.length;x++){var Y=h[x].components;for(var S in Y)Y[S].quantizationTable=m[Y[S].quantizationIdx],delete Y[S].quantizationIdx}this.width=l.samplesPerLine,this.height=l.scanLines,this.jfif=s,this.adobe=c,this.components=[];for(var x=0;x<l.componentsOrder.length;x++){var U=l.components[l.componentsOrder[x]];this.components.push({lines:f(l,U),scaleX:U.h/l.maxH,scaleY:U.v/l.maxV})}},getData:function(e,t){var n=this.width/e,r=this.height/t,i,a,o,s,c,l,u,d,f,m,h=0,_,v,y,b,x,S,C,w,T,E,D,O=e*t*this.components.length;g(O);var k=new Uint8Array(O);switch(this.components.length){case 1:for(i=this.components[0],m=0;m<t;m++)for(c=i.lines[0|m*i.scaleY*r],f=0;f<e;f++)_=c[0|f*i.scaleX*n],k[h++]=_;break;case 2:for(i=this.components[0],a=this.components[1],m=0;m<t;m++)for(c=i.lines[0|m*i.scaleY*r],l=a.lines[0|m*a.scaleY*r],f=0;f<e;f++)_=c[0|f*i.scaleX*n],k[h++]=_,_=l[0|f*a.scaleX*n],k[h++]=_;break;case 3:for(D=!0,this.adobe&&this.adobe.transformCode?D=!0:this.opts.colorTransform!==void 0&&(D=!!this.opts.colorTransform),i=this.components[0],a=this.components[1],o=this.components[2],m=0;m<t;m++)for(c=i.lines[0|m*i.scaleY*r],l=a.lines[0|m*a.scaleY*r],u=o.lines[0|m*o.scaleY*r],f=0;f<e;f++)D?(_=c[0|f*i.scaleX*n],v=l[0|f*a.scaleX*n],y=u[0|f*o.scaleX*n],w=p(_+1.402*(y-128)),T=p(_-.3441363*(v-128)-.71413636*(y-128)),E=p(_+1.772*(v-128))):(w=c[0|f*i.scaleX*n],T=l[0|f*a.scaleX*n],E=u[0|f*o.scaleX*n]),k[h++]=w,k[h++]=T,k[h++]=E;break;case 4:if(!this.adobe)throw Error(`Unsupported color mode (4 components)`);for(D=!1,this.adobe&&this.adobe.transformCode?D=!0:this.opts.colorTransform!==void 0&&(D=!!this.opts.colorTransform),i=this.components[0],a=this.components[1],o=this.components[2],s=this.components[3],m=0;m<t;m++)for(c=i.lines[0|m*i.scaleY*r],l=a.lines[0|m*a.scaleY*r],u=o.lines[0|m*o.scaleY*r],d=s.lines[0|m*s.scaleY*r],f=0;f<e;f++)D?(_=c[0|f*i.scaleX*n],v=l[0|f*a.scaleX*n],y=u[0|f*o.scaleX*n],b=d[0|f*s.scaleX*n],x=255-p(_+1.402*(y-128)),S=255-p(_-.3441363*(v-128)-.71413636*(y-128)),C=255-p(_+1.772*(v-128))):(x=c[0|f*i.scaleX*n],S=l[0|f*a.scaleX*n],C=u[0|f*o.scaleX*n],b=d[0|f*s.scaleX*n]),k[h++]=255-x,k[h++]=255-S,k[h++]=255-C,k[h++]=255-b;break;default:throw Error(`Unsupported color mode`)}return k},copyToImageData:function(e,t){var n=e.width,r=e.height,i=e.data,a=this.getData(n,r),o=0,s=0,c,l,u,d,f,m,h,g,_;switch(this.components.length){case 1:for(l=0;l<r;l++)for(c=0;c<n;c++)u=a[o++],i[s++]=u,i[s++]=u,i[s++]=u,t&&(i[s++]=255);break;case 3:for(l=0;l<r;l++)for(c=0;c<n;c++)h=a[o++],g=a[o++],_=a[o++],i[s++]=h,i[s++]=g,i[s++]=_,t&&(i[s++]=255);break;case 4:for(l=0;l<r;l++)for(c=0;c<n;c++)f=a[o++],m=a[o++],u=a[o++],d=a[o++],h=255-p(f*(1-d/255)+d),g=255-p(m*(1-d/255)+d),_=255-p(u*(1-d/255)+d),i[s++]=h,i[s++]=g,i[s++]=_,t&&(i[s++]=255);break;default:throw Error(`Unsupported color mode`)}}};var m=0,h=0;function g(e=0){var t=m+e;if(t>h){var n=Math.ceil((t-h)/1024/1024);throw Error(`maxMemoryUsageInMB limit exceeded by at least ${n}MB`)}m=t}return l.resetMaxMemoryUsage=function(e){m=0,h=e},l.getBytesAllocated=function(){return m},l.requestMemoryAllocation=g,l})();t===void 0?typeof window<`u`&&(window[`jpeg-js`]=window[`jpeg-js`]||{},window[`jpeg-js`].decode=r):t.exports=r;function r(e,t={}){var r={colorTransform:void 0,useTArray:!1,formatAsRGBA:!0,tolerantDecoding:!0,maxResolutionInMP:100,maxMemoryUsageInMB:512,...t},i=new Uint8Array(e),a=new n;a.opts=r,n.resetMaxMemoryUsage(r.maxMemoryUsageInMB*1024*1024),a.parse(i);var o=r.formatAsRGBA?4:3,s=a.width*a.height*o;try{n.requestMemoryAllocation(s);var c={width:a.width,height:a.height,exifBuffer:a.exifBuffer,data:r.useTArray?new Uint8Array(s):Buffer.alloc(s)};a.comments.length>0&&(c.comments=a.comments)}catch(e){throw e instanceof RangeError?Error(`Could not allocate enough memory for the image. Required: `+s):e instanceof ReferenceError&&e.message===`Buffer is not defined`?Error(`Buffer is not globally defined in this environment. Consider setting useTArray to true`):e}return a.copyToImageData(c,r.formatAsRGBA),c}})),s=e(((e,t)=>{t.exports={encode:a(),decode:o()}}))();const c=Buffer.from([255,216,255]);function l(e){if(n(e))return`png`;if(e.subarray(0,c.length).equals(c))return`jpeg`}function u(e,t){let n=l(e);if(n===`png`)return i(e,t);if(n===`jpeg`)return f(e,t);throw p(t,e)}function d(e,t){let n=l(e);if(n===`png`)return e;if(n===`jpeg`)return r.PNG.sync.write(f(e,t));throw p(t,e)}function f(e,n){try{let t=(0,s.decode)(e,{useTArray:!0,formatAsRGBA:!0}),n=new r.PNG({width:t.width,height:t.height});return n.data=Buffer.from(t.data.buffer,t.data.byteOffset,t.data.byteLength),n}catch(e){throw new t(`COMMAND_FAILED`,`Failed to decode ${n} as JPEG`,{label:n,reason:e instanceof Error?e.message:String(e)})}}function p(e,n){return new t(`COMMAND_FAILED`,`${e} is neither PNG nor JPEG`,{label:e,leadingBytes:n.subarray(0,4).toString(`hex`)})}export{u as decodeScreenshotImage,d as transcodeScreenshotToPng};
@@ -1 +1 @@
1
- import{C as e,p as t}from"./sdk-contracts.js";import{c as n,d as r,l as i,r as a}from"./capture.js";import{S as o,l as s,v as c}from"./sdk-device.js";import{Er as l,Hr as u,Mr as d,Nt as f,Pr as p,Ur as m,d as h,jr as g,l as _,un as ee,x as te,y as ne,zr as v}from"./sdk-batch.js";import{t as re}from"./session-store.js";import{C as ie,E as ae,M as oe,m as se}from"./runtime.js";import{t as y}from"./snapshot-state.js";import{i as b}from"./request-runtime-binding.js";import{c as x,f as ce,i as le,m as S,o as ue}from"./session-snapshot.js";import{c as de,l as fe,u as pe}from"./quality-warnings.js";import{i as me,r as he,t as ge}from"./screenshot-density.js";import{a as _e,i as ve,n as ye,t as be}from"./session-runtime-admission.js";import C from"node:path";import{promises as w}from"node:fs";import T from"node:os";const E=_(h),xe=Ie(E);function Se(e){return A(e)?.route??`generic`}function D(e){return A(e)?.sessionKind}function Ce(e){return A(e)?.leaseAdmissionExempt===!0}function we(e){return A(e)?.selectorValidationExempt!==!0}function O(e){return A(e)?.sessionExecutionLockExempt!==!0}function k(e){return A(e)?.replayScopedAction===!0}function Te(e){return A(e)?.allowInvalidRecording!==!0}function Ee(e){return A(e)?.saveScriptFlagOwner===!0}function De(){return E.filter(e=>e.saveScriptFlagOwner===!0).map(e=>e.command).sort()}function Oe(e){return A(e)?.lockPolicySelectorOverride===!0}function ke(e){return A(e)?.androidBlockingDialogGuard===!0}function Ae(e){if(e.command===`human_control`||e.command===`lease_heartbeat`)return!1;let t=te(e);return t===void 0?D(e.command)!==`observability`&&ne(e.command)!==`observe`:t!==`observes-app`}function je(e){return A(e.command)?.preferExplicitDeviceOverExistingSession===!0}function Me(e){let t=A(e.command)?.allowSessionlessDefaultDevice;return typeof t==`function`&&t(e)}function Ne(e){return A(e.command)?.sessionlessLeaseAdmissionExemption?.(e)}function Pe(e){let t=A(e.command)?.refFrameEffect;return typeof t==`function`?t(e):t}function Fe(e,t){return t.hasExistingSession?je(e)&&t.hasExplicitDeviceIdentity?`explicit-device`:`existing-session`:Le(e)?`skip`:t.hasDeviceSelectionInput?`explicit-device`:Me(e)?`sessionless-default-device`:`skip`}function A(e){return xe.descriptorsByCommand.get(e)}function Ie(e){let t=new Map;for(let n of e){if(t.has(n.command))throw Error(`Duplicate daemon command descriptor: ${n.command}`);t.set(n.command,n)}return{descriptorsByCommand:t}}function Le(e){let t=A(e.command);if(t?.route===`lease`)return!0;let n=t?.skipSessionlessProviderDevice;return typeof n==`function`&&n(e)}const j=a.pendingPixelIdentityEvidence,Re=[{target:`ios-simulator`,status:`accepted`},{target:`android-emulator`,status:`accepted`},{target:`android-device`,status:`rejected`,rejectionReason:j},{target:`macos-app-window`,status:`rejected`,rejectionReason:j},{target:`ios-physical`,status:`rejected`,rejectionReason:j},{target:`macos-helper`,status:`rejected`,rejectionReason:j},{target:`web`,status:`rejected`,rejectionReason:j},{target:`linux`,status:`rejected`,rejectionReason:j},{target:`tvos`,status:`rejected`,rejectionReason:j},{target:`harmonyos`,status:`rejected`,rejectionReason:j},{target:`vega`,status:`rejected`,rejectionReason:j}];function ze(e,t){switch(e.platform){case`apple`:return Be(e,t);case`android`:return e.kind===`device`?`android-device`:`android-emulator`;case`harmonyos`:return`harmonyos`;case`vega`:return`vega`;case`linux`:return`linux`;case`web`:return`web`}}function Be(e,t){let n=o(e);switch(n){case`ios`:case`ipados`:return e.kind===`device`?`ios-physical`:`ios-simulator`;case`tvos`:return`tvos`;case`macos`:return Ve(t);case`watchos`:case`visionos`:throw M(n)}}function Ve(e){return e===`app`||e===`frontmost-app`?`macos-app-window`:`macos-helper`}function M(t,n){return new e(`UNSUPPORTED_OPERATION`,`screenshot --crop-on is not accepted on ${t} targets`,{reason:a.targetNotAccepted,...n?{rejectionReason:n}:{}})}function He(t){if(t.overlayRefs||t.fullscreen)throw new e(`INVALID_ARGS`,`--crop-on cannot be combined with --overlay-refs or --fullscreen: both move the captured frame away from the snapshot viewport the crop is measured against`,{reason:a.frameMismatch});try{ee(t.cropOn)}catch{throw new e(`INVALID_ARGS`,`screenshot --crop-on requires a valid selector expression`,{reason:a.selectorInvalid})}let n=ze(t.device,t.surface),r=Re.find(e=>e.target===n);if(!r||r.status===`rejected`)throw M(n,r?.status===`rejected`?r.rejectionReason:void 0)}async function Ue(t,n){if(!We(n))throw new e(`INVALID_ARGS`,`Screenshot crop box must be positive integer pixel offsets`);let r=await de(await w.readFile(t),n,`screenshot`);r!==null&&await w.writeFile(t,r)}function We(e){return Number.isInteger(e.x)&&e.x>=0&&Number.isInteger(e.y)&&e.y>=0&&Number.isInteger(e.width)&&e.width>0&&Number.isInteger(e.height)&&e.height>0}function Ge(t){switch(t){case`android`:return`device-pixels`;case`xctest`:case`macos-helper`:return`viewport-points`;default:throw new e(`UNSUPPORTED_OPERATION`,`screenshot --crop-on does not accept snapshot backend "${t??`unknown`}"`,{reason:a.targetNotAccepted})}}function N(e,t,n,r,i){if(e===`device-pixels`||t===null)return Ye(n);let a=r/t.width,o=i/t.height;return{x:Math.round((n.x-t.x)*a),y:Math.round((n.y-t.y)*o),width:Math.round(n.width*a),height:Math.round(n.height*o)}}function Ke(e,t,n){let r=Math.max(e.x,0),i=Math.max(e.y,0),a=Math.min(e.x+e.width,t),o=Math.min(e.y+e.height,n);return a<=r||o<=i?null:{x:r,y:i,width:a-r,height:o-i}}function P(e){let t=null;for(let n of e)!l(n)||!v(n.rect)||(!t||u(n.rect)>u(t))&&(t=n.rect);return t||qe(e.filter(e=>v(e.rect)&&!Je(e)))}function qe(e){let t=1/0,n=1/0,r=-1/0,i=-1/0;for(let a of e)v(a.rect)&&(t=Math.min(t,a.rect.x),n=Math.min(n,a.rect.y),r=Math.max(r,a.rect.x+a.rect.width),i=Math.max(i,a.rect.y+a.rect.height));return!Number.isFinite(t)||!Number.isFinite(n)||r<=t||i<=n?null:{x:t,y:n,width:r-t,height:i-n}}function Je(e){return d(e.type??``)===`image`&&!g(e.label)}function Ye(e){return{x:Math.round(e.x),y:Math.round(e.y),width:Math.round(e.width),height:Math.round(e.height)}}const Xe=`${a.partialIntersection}: the selector frame extends past the captured image; the crop was clipped to the image frame`;function Ze(e){return e?.partialIntersection?[Xe]:[]}async function Qe(t){let{device:n,session:r,surface:i,cropOn:o,screenshotPath:s,logPath:c,dispatchContext:l}=t,u={snapshotInteractiveOnly:!1},d=await x({device:n,session:r,flags:u,logPath:c,snapshotScope:void 0,captureData:async()=>await t.captureSnapshot({options:{appBundleId:l.appBundleId,interactiveOnly:!1,includeRects:!0,surface:i},execution:S(l)})}),f=y(d,u);if(f.snapshotQuality?.state===`sparse`)throw new e(`COMMAND_FAILED`,`the snapshot taken for --crop-on was sparse and cannot be read as the screen`,{reason:a.captureUnreadable});let p=await $e(f.nodes,o,f.truncated,n),m=await me(s),h=N(Ge(f.backend),P(f.nodes),p.rect,m.width,m.height),g=Ke(h,m.width,m.height);if(g===null)throw new e(`COMMAND_FAILED`,`the frame resolved by --crop-on occupies no pixel of the capture`,{reason:a.emptyIntersection});let _=g.x!==h.x||g.y!==h.y||g.width<h.width||g.height<h.height;return await Ue(s,g),{partialIntersection:_}}async function $e(t,n,r,i){let o=await se(ie.cropTarget,t,n,{platform:c(i)});if(o.kind===`ambiguous`)throw new e(`COMMAND_FAILED`,`--crop-on matched ${o.matchedNodes.length} nodes and must resolve to one`,{reason:a.targetAmbiguous,candidates:o.matchedNodes.map(e=>e.label??e.ref),matches:o.matchedNodes.length});if(o.kind===`none`)throw r?new e(`COMMAND_FAILED`,`the snapshot taken for --crop-on was truncated, so a missing match is not proven`,{reason:a.captureIncomplete}):new e(`COMMAND_FAILED`,`--crop-on matched no node: ${n}`,{reason:a.targetNotFound,hint:`find ${n} list`});return o.node}function F(e){return!!(e&&e.width>0&&e.height>0)}function I(e,t,n){return Number.isFinite(e)?Math.max(t,Math.min(n,e)):t}function L(e){return e.width*e.height}function et(e){let t=e[0];if(t===void 0)throw Error(`unionRects requires at least one rect`);let n=t.x,r=t.y,i=t.x+t.width,a=t.y+t.height;for(let t of e.slice(1))n=Math.min(n,t.x),r=Math.min(r,t.y),i=Math.max(i,t.x+t.width),a=Math.max(a,t.y+t.height);return{x:n,y:r,width:i-n,height:a-r}}const tt=[`scroll`,`list`,`recyclerview`,`edittext`,`textfield`];function nt(e,t,n){if(e.backend!==`android`||!n.hittable||!F(n.rect)||l(n))return!1;let r=d(n.type??``);return!(tt.some(e=>r.includes(e))||t&&L(n.rect)>L(t)*.25)}function rt(e,t,n,r){return!e.rect||e.hittable!==!0||n(e)||r(e)?null:it(e,t,r)}function it(e,t,n){let r=e.rect,i=at(e,t,n);if(!i)return null;let a=i.y-r.y,o=r.y+r.height-(i.y+i.height);if(a<0||o<0||Math.abs(o-a)<16)return null;let s=Math.min(a,o),c=Math.round(i.y-s),l=Math.round(i.height+s*2);return l<=0||l>=r.height?null:{x:r.x,y:c,width:r.width,height:l}}function at(e,t,n){let r=e.rect,i=new Map(t.map(e=>[e.index,e])),a=t.filter(t=>t.ref!==e.ref&&st(t,e,i)&&ot(t,n)&&F(t.rect)&&m(r,t.rect)).map(e=>e.rect);return a.length<2?null:et(a)}function ot(e,t){let n=d(e.type??``);return n.includes(`text`)||n.includes(`image`)&&t(e)}function st(e,t,n){let r=e;for(;r.parentIndex!==void 0;){let e=n.get(r.parentIndex);if(!e)return!1;if(e.ref===t.ref)return!0;r=e}return!1}const ct=[255,59,48,255],lt=[255,214,10,255],ut=[0,0,0,255],dt={e:[`01110`,`10000`,`11110`,`10000`,`10000`,`10001`,`01110`],0:[`01110`,`10001`,`10011`,`10101`,`11001`,`10001`,`01110`],1:[`00100`,`01100`,`00100`,`00100`,`00100`,`00100`,`01110`],2:[`01110`,`10001`,`00001`,`00010`,`00100`,`01000`,`11111`],3:[`11110`,`00001`,`00001`,`01110`,`00001`,`00001`,`11110`],4:[`00010`,`00110`,`01010`,`10010`,`11111`,`00010`,`00010`],5:[`11111`,`10000`,`10000`,`11110`,`00001`,`00001`,`11110`],6:[`01110`,`10000`,`10000`,`11110`,`10001`,`10001`,`01110`],7:[`11111`,`00001`,`00010`,`00100`,`01000`,`01000`,`01000`],8:[`01110`,`10001`,`10001`,`01110`,`10001`,`10001`,`01110`],9:[`01110`,`10001`,`10001`,`01111`,`00001`,`00001`,`01110`]};function ft(e,t){pt(e,t.overlayRect,ct,2),mt(e,t.overlayRect,t.ref)}function pt(e,t,n,r){for(let i=0;i<r;i+=1)R(e,t.x,t.x+t.width-1,t.y+i,n),R(e,t.x,t.x+t.width-1,t.y+t.height-1-i,n),z(e,t.x+i,t.y,t.y+t.height-1,n),z(e,t.x+t.width-1-i,t.y,t.y+t.height-1,n)}function mt(e,t,n){let r=6+n.length*5+Math.max(0,n.length-1)*1,i=I(t.x,0,Math.max(0,e.width-r)),a=t.y-11-2,o=a>=0?a:I(t.y+2,0,Math.max(0,e.height-11));gt(e,i,o,r,11,lt),ht(e,i+3,o+2,n,ut)}function ht(e,t,n,r,i){let a=t;for(let t of r.toLowerCase()){let r=dt[t];if(r)for(let t=0;t<r.length;t+=1)for(let o=0;o<r[t].length;o+=1)r[t][o]===`1`&&B(e,a+o,n+t,i);a+=6}}function gt(e,t,n,r,i,a){for(let o=0;o<i;o+=1)for(let i=0;i<r;i+=1)B(e,t+i,n+o,a)}function R(e,t,n,r,i){for(let a=t;a<=n;a+=1)B(e,a,r,i)}function z(e,t,n,r,i){for(let a=n;a<=r;a+=1)B(e,t,a,i)}function B(e,t,n,r){if(t<0||n<0||t>=e.width||n>=e.height)return;let i=(e.width*n+t)*4;e.data[i]=r[0],e.data[i+1]=r[1],e.data[i+2]=r[2],e.data[i+3]=r[3]}const _t=[`button`,`link`,`menu`,`tab`,`textfield`,`searchfield`,`securetextfield`,`checkbox`,`radio`,`switch`,`cell`];async function V(e){let t=await w.readFile(e.screenshotPath),n=await fe(t,`screenshot`),r=vt(e.snapshot,n.width,n.height,{maxRefs:e.maxRefs});for(let e of r)ft(n,e);return await w.writeFile(e.screenshotPath,await pe(n)),r}function vt(e,n,r,i={}){let a=P(e.nodes),o=new Map;for(let t of e.nodes){if(!xt(e,a,t))continue;let i=St(e.nodes,t);if(!i?.rect||!F(i.rect))continue;let s=Ct(t,i,e.nodes),c=wt(t,i,s),l=H(e,a,bt(e,i,e.nodes),n,r);if(!F(l))continue;let u=o.get(i.ref);(!u||c>u.score)&&o.set(i.ref,{ref:i.ref,label:s,rect:i.rect,overlayRect:l,score:c})}return yt(e,a,o,n,r),Tt([...o.values()]).sort(Ft).slice(0,i.maxRefs??24).sort(J).map(e=>({ref:e.ref,label:e.label,rect:e.rect,overlayRect:e.overlayRect,center:t(e.overlayRect)}))}function yt(e,t,n,r,i){let a=oe(e.nodes).primaryAction;if(!a?.ref||!a.rect||!F(a.rect))return;let o=H(e,t,a.rect,r,i);if(!F(o))return;let s={ref:a.ref,label:a.label,rect:a.rect,overlayRect:o,score:100},c=n.get(a.ref);n.set(a.ref,c?{...c,score:Math.max(c.score,s.score)}:s)}function bt(e,t,n){return e.backend===`android`?rt(t,n,U,e=>!!q(e))??t.rect:t.rect}function xt(e,t,n){let r=[n.label,n.value].some(G)||K(n.identifier);return nt(e,t,n)?!0:U(n)?r:r&&Et(n)}function St(e,t){return[W(t)?t:null,p(e,t,W),t.hittable?t:null,p(e,t,e=>e.hittable===!0)].find(Dt)??null}function Ct(e,t,n){let r=q(e);return e.ref!==t.ref&&r?r:Ot(t,n)||q(t)}function wt(e,t,n){let r=0;return e.ref===t.ref&&(r+=4),t.hittable&&(r+=3),U(t)&&(r+=3),U(e)&&(r+=2),n&&(r+=2),K(t.identifier)&&(r+=1),g(t.value)&&(r+=1),r}function Tt(e){let t=[];for(let n of e.sort((e,t)=>L(e.overlayRect)-L(t.overlayRect))){let e=t.findIndex(e=>e.label!==void 0&&e.label===n.label&&(m(e.overlayRect,n.overlayRect)||m(n.overlayRect,e.overlayRect)));if(e===-1){t.push(n);continue}L(n.overlayRect)<L(t[e].overlayRect)&&(t[e]=n)}return t}function H(e,t,n,r,i){return Pt(N(e.backend===`android`?`device-pixels`:`viewport-points`,t,n,r,i),r,i)}function U(e){let t=[e.type,e.role,e.subrole].map(e=>d(e??``)).join(` `);return _t.some(e=>t.includes(e))}function W(e){return U(e)&&!l(e)}function Et(e){let t=d(e.type??``);return t.includes(`statictext`)||t.includes(`image`)||t.includes(`text`)||t.includes(`other`)}function Dt(e){return!!(e?.rect&&F(e.rect)&&!l(e))}function G(e){return g(e)?!jt(e):!1}function K(e){return typeof e!=`string`||!G(e)?!1:!Mt(e)}function q(e){let t=[e.label,e.value].find(G);if(t)return t.trim();if(K(e.identifier))return e.identifier.trim()}function Ot(e,t){let n=null;for(let r of t){if(r.ref===e.ref||!kt(r,e,t))continue;let i=q(r);if(!i)continue;let a=At(r);(!n||a>n.score)&&(n={label:i,score:a})}return n?.label}function kt(e,t,n){let r=e;for(;r.parentIndex!==void 0;){let e=n[r.parentIndex];if(!e)return!1;if(e.ref===t.ref)return!0;r=e}return!1}function At(e){let t=0;return d(e.type??``).includes(`text`)&&(t+=2),G(e.label)&&(t+=2),G(e.value)&&(t+=1),t}function jt(e){let t=e?.trim().toLowerCase();return t===`toolbar`||t===`window`||t===`application`||t?.startsWith(`vertical scroll bar`)===!0}function Mt(e){return/^[a-z0-9_.]+:id\/[a-z0-9_.-]+$/i.test(e.trim())}function Nt(e,t){return Number.parseInt(e.replace(/^\D+/,``),10)-Number.parseInt(t.replace(/^\D+/,``),10)}function Pt(e,t,n){let r=I(e.x,0,Math.max(0,t-1)),i=I(e.y,0,Math.max(0,n-1)),a=Math.max(1,t-r),o=Math.max(1,n-i);return{x:r,y:i,width:I(e.width,1,a),height:I(e.height,1,o)}}function J(e,t){let n=e.overlayRect.y-t.overlayRect.y;if(n!==0)return n;let r=e.overlayRect.x-t.overlayRect.x;return r===0?Nt(e.ref,t.ref):r}function Ft(e,t){return t.score===e.score?J(e,t):t.score-e.score}async function Y(e){let t=f({overlayRefs:e.overlayRefs,cropOn:e.cropOn!==void 0}),n=await be({device:e.device,plan:t,inspectFacts:e.inspectFacts});return n.admitted?{ok:!0,runtime:await It(e.bindDevice,n)}:{ok:!1,response:Rt(t.kind,n.operation,n.fact)}}async function It(e,t){let n=ye(e),{device:r,plan:i}=_e(t);switch(i.kind){case`capture`:{let e=await n(r,i.use);return Object.freeze({captureScreenshot:X(e)})}case`capture-with-overlay-refs`:case`capture-with-crop-on`:{let e=await n(r,i.use);return Object.freeze({captureScreenshot:X(e),captureSnapshot:Lt(e)})}}}function X(e){return async t=>await e.operations.captureScreenshot(t)}function Lt(e){return async t=>await e.operations.captureSnapshot(t)}function Rt(e,t,n){return t===`captureScreenshot`?ve(`screenshot`,n):e===`capture-with-crop-on`?b(`UNSUPPORTED_OPERATION`,`--crop-on crops the capture to a selector frame using a snapshot taken on the same screen, which this target cannot capture.`,{reason:n.available?void 0:n.reason},{hint:(n.available?void 0:n.hint)??`Re-run screenshot without --crop-on.`}):b(`UNSUPPORTED_OPERATION`,`--overlay-refs annotates a capture with the refs of a snapshot taken on the same screen, which this target cannot capture.`,{reason:n.available?void 0:n.reason},{hint:(n.available?void 0:n.hint)??`Re-run screenshot without --overlay-refs.`})}async function zt(t){let{req:r,session:i}=t,a=n(`screenshot`,r.flags);if(a)throw new e(`INVALID_ARGS`,a);ge(i.device,r.flags?.screenshotPixelDensity);let o=Ut(r),s=typeof r.flags?.screenshotCropOn==`string`&&r.flags.screenshotCropOn.length>0?r.flags.screenshotCropOn:void 0;s!==void 0&&He({device:i.device,surface:i.surface,cropOn:s,overlayRefs:r.flags?.overlayRefs===!0,fullscreen:r.flags?.screenshotFullscreen===!0});let c=await Y({device:i.device,overlayRefs:r.flags?.overlayRefs===!0,cropOn:s,inspectFacts:t.inspectFacts,bindDevice:t.bindDevice});if(!c.ok)return c;let l=c.runtime,u={warnings:[]};return{ok:!0,recorded:o.recorded,execute:async e=>await $({session:e.session,sessionName:e.sessionName,logPath:e.logPath,dispatchContext:e.dispatchContext,flags:e.request.flags,outPath:o.outPath,runtime:l,cropOn:s,cropRun:u})}}async function Z(e){let{session:t,sessionName:n,outPath:i,dispatchContext:a}=e;return await ce({backend:Wt(e),artifacts:Gt(),sessions:ue({sessionName:n,getSession:()=>t,recordOptions:{includeSnapshot:!1},setRecord:()=>{}}),policy:ae()}).capture.screenshot({session:n,requestId:a.requestId,appBundleId:t.appBundleId,...r(a),surface:t.surface,...i?{out:{kind:`path`,path:i}}:{}})}function Q(e){return S(e)}async function $(e){let{session:t,runtime:n,flags:r}=e,i=Bt({cropOn:e.cropOn,captureSnapshot:n.captureSnapshot,cropRun:e.cropRun,logPath:e.logPath}),a=await Z({session:t,sessionName:e.sessionName,outPath:e.outPath,dispatchContext:e.dispatchContext,captureScreenshot:n.captureScreenshot,...i?{crop:i}:{}}),o=[...a.warnings??[],...i?.run?.warnings??[]];return{...a,...o.length>0?{warnings:o}:{},...await Vt({session:t,cropOn:e.cropOn,captureSnapshot:n.captureSnapshot,screenshotPath:a.path,logPath:e.logPath,dispatchContext:e.dispatchContext}),...await he({device:t.device,path:a.path,requestedPixelDensity:r?.screenshotPixelDensity,scale:r?.screenshotScale})}}function Bt(e){let{cropOn:t,captureSnapshot:n,cropRun:r}=e;if(t!==void 0&&n!==void 0&&r!==void 0)return{cropOn:t,captureSnapshot:n,run:r,logPath:e.logPath}}async function Vt(e){let{session:t,cropOn:n,captureSnapshot:r}=e;return n!==void 0||r===void 0?{}:{overlayRefs:await Ht({session:t,logPath:e.logPath,screenshotPath:e.screenshotPath,dispatchContext:e.dispatchContext,captureSnapshot:r})}}async function Ht(e){let{session:t,dispatchContext:n}=e,r={snapshotInteractiveOnly:!0},i=await x({device:t.device,session:t,flags:r,logPath:e.logPath,snapshotScope:void 0,captureData:async()=>await e.captureSnapshot({options:{appBundleId:t.appBundleId,interactiveOnly:!0,surface:t.surface},execution:Q(n)})}),a=y(i,r);return le(t,a),await V({screenshotPath:e.screenshotPath,snapshot:a})}function Ut(e){let t=e.positionals??[],n=e.flags??{},r=t=>t===void 0?void 0:re.expandHome(t,e.meta?.cwd),i=r(t[0]),a=r(n.out);return{outPath:i??a,recorded:{positionals:i?[i,...t.slice(1)]:t,flags:a?{...n,out:a}:n}}}function Wt(e){let{session:t,dispatchContext:n,captureScreenshot:a,crop:o}=e;return{platform:c(t.device),captureScreenshot:async(e,c,l)=>{let u=r({...n,...i(l)});if(await a({outPath:c,options:{appBundleId:n.appBundleId,pixelDensity:u.pixelDensity,fullscreen:u.fullscreen,normalizeStatusBar:u.normalizeStatusBar,stabilize:u.stabilize,surface:l?.surface,skipIosSimulatorBootCheck:n.skipIosSimulatorBootCheck??(s(t.device)&&t.device.kind===`simulator`),captureBackend:n.screenshotCaptureBackend},execution:Q(n)}),o){let e=await Qe({device:t.device,session:t,surface:t.surface,cropOn:o.cropOn,screenshotPath:c,logPath:o.logPath,dispatchContext:n,captureSnapshot:o.captureSnapshot});o.run.warnings.push(...Ze(e))}}}}function Gt(){return{resolveInput:async()=>{throw new e(`UNSUPPORTED_OPERATION`,`screenshot does not resolve input artifacts`)},reserveOutput:async e=>{let t,n;return e?.kind===`path`?n=e.path:(t=await w.mkdtemp(C.join(T.tmpdir(),`agent-device-screenshot-`)),n=C.join(t,`screenshot.png`)),await w.mkdir(C.dirname(n),{recursive:!0}),{path:n,visibility:`client-visible`,publish:async()=>void 0,...t?{cleanup:async()=>{await w.rm(t,{recursive:!0,force:!0})}}:{}}},createTempFile:async e=>{let t=await w.mkdtemp(C.join(T.tmpdir(),`${e.prefix}-`));return{path:C.join(t,`file${e.ext}`),visibility:`internal`,cleanup:async()=>{await w.rm(t,{recursive:!0,force:!0})}}}}}export{Te as _,V as a,we as b,Se as c,Ce as d,De as f,Ne as g,Pe as h,Y as i,D as l,Fe as m,zt as n,Oe as o,Ee as p,Q as r,k as s,Z as t,Ae as u,ke as v,O as y};
1
+ import{D as e,g as t,o as n}from"./sdk-contracts.js";import{c as r,d as i,l as a,r as o}from"./capture.js";import{C as s,u as c,y as l}from"./sdk-device.js";import{Ft as u,Gr as d,Ir as f,Nr as p,Or as m,Pr as h,Vr as g,Wr as _,d as ee,fn as te,l as ne,x as re,y as ie}from"./sdk-batch.js";import{t as ae}from"./session-store.js";import{c as v,f as oe,i as se,m as y,o as ce}from"./session-snapshot.js";import{M as le,h as ue,l as de,v as fe}from"./runtime.js";import{t as b}from"./snapshot-state.js";import{i as pe,o as me,r as he}from"./png-worker-client.js";import{i as ge,r as _e,t as ve}from"./screenshot-density.js";import{a as ye,i as be,n as xe,t as Se}from"./session-runtime-admission.js";import x from"node:path";import{promises as S}from"node:fs";import C from"node:os";const w=ne(ee),Ce=Ie(w);function we(e){return A(e)?.route??`generic`}function T(e){return A(e)?.sessionKind}function E(e){return A(e)?.leaseAdmissionExempt===!0}function D(e){return A(e)?.selectorValidationExempt!==!0}function O(e){return A(e)?.sessionExecutionLockExempt!==!0}function k(e){return A(e)?.replayScopedAction===!0}function Te(e){return A(e)?.allowInvalidRecording!==!0}function Ee(e){return A(e)?.saveScriptFlagOwner===!0}function De(){return w.filter(e=>e.saveScriptFlagOwner===!0).map(e=>e.command).sort()}function Oe(e){return A(e)?.lockPolicySelectorOverride===!0}function ke(e){return A(e)?.androidBlockingDialogGuard===!0}function Ae(e){if(e.command===`human_control`||e.command===`lease_heartbeat`)return!1;let t=re(e);return t===void 0?T(e.command)!==`observability`&&ie(e.command)!==`observe`:t!==`observes-app`}function je(e){return A(e.command)?.preferExplicitDeviceOverExistingSession===!0}function Me(e){let t=A(e.command)?.allowSessionlessDefaultDevice;return typeof t==`function`&&t(e)}function Ne(e){return A(e.command)?.sessionlessLeaseAdmissionExemption?.(e)}function Pe(e){let t=A(e.command)?.refFrameEffect;return typeof t==`function`?t(e):t}function Fe(e,t){return t.hasExistingSession?je(e)&&t.hasExplicitDeviceIdentity?`explicit-device`:`existing-session`:Le(e)?`skip`:t.hasDeviceSelectionInput?`explicit-device`:Me(e)?`sessionless-default-device`:`skip`}function A(e){return Ce.descriptorsByCommand.get(e)}function Ie(e){let t=new Map;for(let n of e){if(t.has(n.command))throw Error(`Duplicate daemon command descriptor: ${n.command}`);t.set(n.command,n)}return{descriptorsByCommand:t}}function Le(e){let t=A(e.command);if(t?.route===`lease`)return!0;let n=t?.skipSessionlessProviderDevice;return typeof n==`function`&&n(e)}const j=o.pendingPixelIdentityEvidence,Re=[{target:`ios-simulator`,status:`accepted`},{target:`android-emulator`,status:`accepted`},{target:`android-device`,status:`rejected`,rejectionReason:j},{target:`macos-app-window`,status:`rejected`,rejectionReason:j},{target:`ios-physical`,status:`rejected`,rejectionReason:j},{target:`macos-helper`,status:`rejected`,rejectionReason:j},{target:`web`,status:`rejected`,rejectionReason:j},{target:`linux`,status:`rejected`,rejectionReason:j},{target:`tvos`,status:`rejected`,rejectionReason:j},{target:`harmonyos`,status:`rejected`,rejectionReason:j},{target:`vega`,status:`rejected`,rejectionReason:j}];function ze(e,t){switch(e.platform){case`apple`:return Be(e,t);case`android`:return e.kind===`device`?`android-device`:`android-emulator`;case`harmonyos`:return`harmonyos`;case`vega`:return`vega`;case`linux`:return`linux`;case`web`:return`web`}}function Be(e,t){let n=s(e);switch(n){case`ios`:case`ipados`:return e.kind===`device`?`ios-physical`:`ios-simulator`;case`tvos`:return`tvos`;case`macos`:return Ve(t);case`watchos`:case`visionos`:throw M(n)}}function Ve(e){return e===`app`||e===`frontmost-app`?`macos-app-window`:`macos-helper`}function M(t,n){return new e(`UNSUPPORTED_OPERATION`,`screenshot --crop-on is not accepted on ${t} targets`,{reason:o.targetNotAccepted,...n?{rejectionReason:n}:{}})}function He(t){if(t.overlayRefs||t.fullscreen)throw new e(`INVALID_ARGS`,`--crop-on cannot be combined with --overlay-refs or --fullscreen: both move the captured frame away from the snapshot viewport the crop is measured against`,{reason:o.frameMismatch});try{te(t.cropOn)}catch{throw new e(`INVALID_ARGS`,`screenshot --crop-on requires a valid selector expression`,{reason:o.selectorInvalid})}let n=ze(t.device,t.surface),r=Re.find(e=>e.target===n);if(!r||r.status===`rejected`)throw M(n,r?.status===`rejected`?r.rejectionReason:void 0)}async function Ue(t,n){if(!We(n))throw new e(`INVALID_ARGS`,`Screenshot crop box must be positive integer pixel offsets`);let r=await he(await S.readFile(t),n,`screenshot`);r!==null&&await S.writeFile(t,r)}function We(e){return Number.isInteger(e.x)&&e.x>=0&&Number.isInteger(e.y)&&e.y>=0&&Number.isInteger(e.width)&&e.width>0&&Number.isInteger(e.height)&&e.height>0}function Ge(t){switch(t){case`android`:return`device-pixels`;case`xctest`:case`macos-helper`:return`viewport-points`;default:throw new e(`UNSUPPORTED_OPERATION`,`screenshot --crop-on does not accept snapshot backend "${t??`unknown`}"`,{reason:o.targetNotAccepted})}}function N(e,t,n,r,i){if(e===`device-pixels`||t===null)return Ye(n);let a=r/t.width,o=i/t.height;return{x:Math.round((n.x-t.x)*a),y:Math.round((n.y-t.y)*o),width:Math.round(n.width*a),height:Math.round(n.height*o)}}function Ke(e,t,n){let r=Math.max(e.x,0),i=Math.max(e.y,0),a=Math.min(e.x+e.width,t),o=Math.min(e.y+e.height,n);return a<=r||o<=i?null:{x:r,y:i,width:a-r,height:o-i}}function P(e){let t=null;for(let n of e)!m(n)||!g(n.rect)||(!t||_(n.rect)>_(t))&&(t=n.rect);return t||qe(e.filter(e=>g(e.rect)&&!Je(e)))}function qe(e){let t=1/0,n=1/0,r=-1/0,i=-1/0;for(let a of e)g(a.rect)&&(t=Math.min(t,a.rect.x),n=Math.min(n,a.rect.y),r=Math.max(r,a.rect.x+a.rect.width),i=Math.max(i,a.rect.y+a.rect.height));return!Number.isFinite(t)||!Number.isFinite(n)||r<=t||i<=n?null:{x:t,y:n,width:r-t,height:i-n}}function Je(e){return h(e.type??``)===`image`&&!p(e.label)}function Ye(e){return{x:Math.round(e.x),y:Math.round(e.y),width:Math.round(e.width),height:Math.round(e.height)}}const Xe=`${o.partialIntersection}: the selector frame extends past the captured image; the crop was clipped to the image frame`;function Ze(e){return e?.partialIntersection?[Xe]:[]}async function Qe(t){let{device:n,session:r,surface:i,cropOn:a,screenshotPath:s,logPath:c,dispatchContext:l}=t,u={snapshotInteractiveOnly:!1},d=await v({device:n,session:r,flags:u,logPath:c,snapshotScope:void 0,captureData:async()=>await t.captureSnapshot({options:{appBundleId:l.appBundleId,interactiveOnly:!1,includeRects:!0,surface:i},execution:y(l)})}),f=b(d,u);if(f.snapshotQuality?.state===`sparse`)throw new e(`COMMAND_FAILED`,`the snapshot taken for --crop-on was sparse and cannot be read as the screen`,{reason:o.captureUnreadable});let p=await $e(f.nodes,a,f.truncated,n),m=await ge(s),h=N(Ge(f.backend),P(f.nodes),p.rect,m.width,m.height),g=Ke(h,m.width,m.height);if(g===null)throw new e(`COMMAND_FAILED`,`the frame resolved by --crop-on occupies no pixel of the capture`,{reason:o.emptyIntersection});let _=g.x!==h.x||g.y!==h.y||g.width<h.width||g.height<h.height;return await Ue(s,g),{partialIntersection:_}}async function $e(t,n,r,i){let a=await de(ue.cropTarget,t,n,{platform:l(i)});if(a.kind===`ambiguous`)throw new e(`COMMAND_FAILED`,`--crop-on matched ${a.matchedNodes.length} nodes and must resolve to one`,{reason:o.targetAmbiguous,candidates:a.matchedNodes.map(e=>e.label??e.ref),matches:a.matchedNodes.length});if(a.kind===`none`)throw r?new e(`COMMAND_FAILED`,`the snapshot taken for --crop-on was truncated, so a missing match is not proven`,{reason:o.captureIncomplete}):new e(`COMMAND_FAILED`,`--crop-on matched no node: ${n}`,{reason:o.targetNotFound,hint:`find ${n} list`});return a.node}function F(e){return!!(e&&e.width>0&&e.height>0)}function I(e,t,n){return Number.isFinite(e)?Math.max(t,Math.min(n,e)):t}function L(e){return e.width*e.height}function et(e){let t=e[0];if(t===void 0)throw Error(`unionRects requires at least one rect`);let n=t.x,r=t.y,i=t.x+t.width,a=t.y+t.height;for(let t of e.slice(1))n=Math.min(n,t.x),r=Math.min(r,t.y),i=Math.max(i,t.x+t.width),a=Math.max(a,t.y+t.height);return{x:n,y:r,width:i-n,height:a-r}}const tt=[`scroll`,`list`,`recyclerview`,`edittext`,`textfield`];function nt(e,t,n){if(e.backend!==`android`||!n.hittable||!F(n.rect)||m(n))return!1;let r=h(n.type??``);return!(tt.some(e=>r.includes(e))||t&&L(n.rect)>L(t)*.25)}function rt(e,t,n,r){return!e.rect||e.hittable!==!0||n(e)||r(e)?null:it(e,t,r)}function it(e,t,n){let r=e.rect,i=at(e,t,n);if(!i)return null;let a=i.y-r.y,o=r.y+r.height-(i.y+i.height);if(a<0||o<0||Math.abs(o-a)<16)return null;let s=Math.min(a,o),c=Math.round(i.y-s),l=Math.round(i.height+s*2);return l<=0||l>=r.height?null:{x:r.x,y:c,width:r.width,height:l}}function at(e,t,n){let r=e.rect,i=new Map(t.map(e=>[e.index,e])),a=t.filter(t=>t.ref!==e.ref&&st(t,e,i)&&ot(t,n)&&F(t.rect)&&d(r,t.rect)).map(e=>e.rect);return a.length<2?null:et(a)}function ot(e,t){let n=h(e.type??``);return n.includes(`text`)||n.includes(`image`)&&t(e)}function st(e,t,n){let r=e;for(;r.parentIndex!==void 0;){let e=n.get(r.parentIndex);if(!e)return!1;if(e.ref===t.ref)return!0;r=e}return!1}const ct=[255,59,48,255],lt=[255,214,10,255],ut=[0,0,0,255],dt={e:[`01110`,`10000`,`11110`,`10000`,`10000`,`10001`,`01110`],0:[`01110`,`10001`,`10011`,`10101`,`11001`,`10001`,`01110`],1:[`00100`,`01100`,`00100`,`00100`,`00100`,`00100`,`01110`],2:[`01110`,`10001`,`00001`,`00010`,`00100`,`01000`,`11111`],3:[`11110`,`00001`,`00001`,`01110`,`00001`,`00001`,`11110`],4:[`00010`,`00110`,`01010`,`10010`,`11111`,`00010`,`00010`],5:[`11111`,`10000`,`10000`,`11110`,`00001`,`00001`,`11110`],6:[`01110`,`10000`,`10000`,`11110`,`10001`,`10001`,`01110`],7:[`11111`,`00001`,`00010`,`00100`,`01000`,`01000`,`01000`],8:[`01110`,`10001`,`10001`,`01110`,`10001`,`10001`,`01110`],9:[`01110`,`10001`,`10001`,`01111`,`00001`,`00001`,`01110`]};function ft(e,t){pt(e,t.overlayRect,ct,2),mt(e,t.overlayRect,t.ref)}function pt(e,t,n,r){for(let i=0;i<r;i+=1)R(e,t.x,t.x+t.width-1,t.y+i,n),R(e,t.x,t.x+t.width-1,t.y+t.height-1-i,n),z(e,t.x+i,t.y,t.y+t.height-1,n),z(e,t.x+t.width-1-i,t.y,t.y+t.height-1,n)}function mt(e,t,n){let r=6+n.length*5+Math.max(0,n.length-1)*1,i=I(t.x,0,Math.max(0,e.width-r)),a=t.y-11-2,o=a>=0?a:I(t.y+2,0,Math.max(0,e.height-11));gt(e,i,o,r,11,lt),ht(e,i+3,o+2,n,ut)}function ht(e,t,n,r,i){let a=t;for(let t of r.toLowerCase()){let r=dt[t];if(r)for(let t=0;t<r.length;t+=1)for(let o=0;o<r[t].length;o+=1)r[t][o]===`1`&&B(e,a+o,n+t,i);a+=6}}function gt(e,t,n,r,i,a){for(let o=0;o<i;o+=1)for(let i=0;i<r;i+=1)B(e,t+i,n+o,a)}function R(e,t,n,r,i){for(let a=t;a<=n;a+=1)B(e,a,r,i)}function z(e,t,n,r,i){for(let a=n;a<=r;a+=1)B(e,t,a,i)}function B(e,t,n,r){if(t<0||n<0||t>=e.width||n>=e.height)return;let i=(e.width*n+t)*4;e.data[i]=r[0],e.data[i+1]=r[1],e.data[i+2]=r[2],e.data[i+3]=r[3]}const _t=[`button`,`link`,`menu`,`tab`,`textfield`,`searchfield`,`securetextfield`,`checkbox`,`radio`,`switch`,`cell`];async function V(e){let t=await S.readFile(e.screenshotPath),n=await pe(t,`screenshot`),r=vt(e.snapshot,n.width,n.height,{maxRefs:e.maxRefs});for(let e of r)ft(n,e);return await S.writeFile(e.screenshotPath,await me(n)),r}function vt(e,n,r,i={}){let a=P(e.nodes),o=new Map;for(let t of e.nodes){if(!xt(e,a,t))continue;let i=St(e.nodes,t);if(!i?.rect||!F(i.rect))continue;let s=Ct(t,i,e.nodes),c=wt(t,i,s),l=H(e,a,bt(e,i,e.nodes),n,r);if(!F(l))continue;let u=o.get(i.ref);(!u||c>u.score)&&o.set(i.ref,{ref:i.ref,label:s,rect:i.rect,overlayRect:l,score:c})}return yt(e,a,o,n,r),Tt([...o.values()]).sort(Ft).slice(0,i.maxRefs??24).sort(J).map(e=>({ref:e.ref,label:e.label,rect:e.rect,overlayRect:e.overlayRect,center:t(e.overlayRect)}))}function yt(e,t,n,r,i){let a=le(e.nodes).primaryAction;if(!a?.ref||!a.rect||!F(a.rect))return;let o=H(e,t,a.rect,r,i);if(!F(o))return;let s={ref:a.ref,label:a.label,rect:a.rect,overlayRect:o,score:100},c=n.get(a.ref);n.set(a.ref,c?{...c,score:Math.max(c.score,s.score)}:s)}function bt(e,t,n){return e.backend===`android`?rt(t,n,U,e=>!!q(e))??t.rect:t.rect}function xt(e,t,n){let r=[n.label,n.value].some(G)||K(n.identifier);return nt(e,t,n)?!0:U(n)?r:r&&Et(n)}function St(e,t){return[W(t)?t:null,f(e,t,W),t.hittable?t:null,f(e,t,e=>e.hittable===!0)].find(Dt)??null}function Ct(e,t,n){let r=q(e);return e.ref!==t.ref&&r?r:Ot(t,n)||q(t)}function wt(e,t,n){let r=0;return e.ref===t.ref&&(r+=4),t.hittable&&(r+=3),U(t)&&(r+=3),U(e)&&(r+=2),n&&(r+=2),K(t.identifier)&&(r+=1),p(t.value)&&(r+=1),r}function Tt(e){let t=[];for(let n of e.sort((e,t)=>L(e.overlayRect)-L(t.overlayRect))){let e=t.findIndex(e=>e.label!==void 0&&e.label===n.label&&(d(e.overlayRect,n.overlayRect)||d(n.overlayRect,e.overlayRect)));if(e===-1){t.push(n);continue}L(n.overlayRect)<L(t[e].overlayRect)&&(t[e]=n)}return t}function H(e,t,n,r,i){return Pt(N(e.backend===`android`?`device-pixels`:`viewport-points`,t,n,r,i),r,i)}function U(e){let t=[e.type,e.role,e.subrole].map(e=>h(e??``)).join(` `);return _t.some(e=>t.includes(e))}function W(e){return U(e)&&!m(e)}function Et(e){let t=h(e.type??``);return t.includes(`statictext`)||t.includes(`image`)||t.includes(`text`)||t.includes(`other`)}function Dt(e){return!!(e?.rect&&F(e.rect)&&!m(e))}function G(e){return p(e)?!jt(e):!1}function K(e){return typeof e!=`string`||!G(e)?!1:!Mt(e)}function q(e){let t=[e.label,e.value].find(G);if(t)return t.trim();if(K(e.identifier))return e.identifier.trim()}function Ot(e,t){let n=null;for(let r of t){if(r.ref===e.ref||!kt(r,e,t))continue;let i=q(r);if(!i)continue;let a=At(r);(!n||a>n.score)&&(n={label:i,score:a})}return n?.label}function kt(e,t,n){let r=e;for(;r.parentIndex!==void 0;){let e=n[r.parentIndex];if(!e)return!1;if(e.ref===t.ref)return!0;r=e}return!1}function At(e){let t=0;return h(e.type??``).includes(`text`)&&(t+=2),G(e.label)&&(t+=2),G(e.value)&&(t+=1),t}function jt(e){let t=e?.trim().toLowerCase();return t===`toolbar`||t===`window`||t===`application`||t?.startsWith(`vertical scroll bar`)===!0}function Mt(e){return/^[a-z0-9_.]+:id\/[a-z0-9_.-]+$/i.test(e.trim())}function Nt(e,t){return Number.parseInt(e.replace(/^\D+/,``),10)-Number.parseInt(t.replace(/^\D+/,``),10)}function Pt(e,t,n){let r=I(e.x,0,Math.max(0,t-1)),i=I(e.y,0,Math.max(0,n-1)),a=Math.max(1,t-r),o=Math.max(1,n-i);return{x:r,y:i,width:I(e.width,1,a),height:I(e.height,1,o)}}function J(e,t){let n=e.overlayRect.y-t.overlayRect.y;if(n!==0)return n;let r=e.overlayRect.x-t.overlayRect.x;return r===0?Nt(e.ref,t.ref):r}function Ft(e,t){return t.score===e.score?J(e,t):t.score-e.score}async function Y(e){let t=u({overlayRefs:e.overlayRefs,cropOn:e.cropOn!==void 0}),n=await Se({device:e.device,plan:t,inspectFacts:e.inspectFacts});return n.admitted?{ok:!0,runtime:await It(e.bindDevice,n)}:{ok:!1,response:Rt(t.kind,n.operation,n.fact)}}async function It(e,t){let n=xe(e),{device:r,plan:i}=ye(t);switch(i.kind){case`capture`:{let e=await n(r,i.use);return Object.freeze({captureScreenshot:X(e)})}case`capture-with-overlay-refs`:case`capture-with-crop-on`:{let e=await n(r,i.use);return Object.freeze({captureScreenshot:X(e),captureSnapshot:Lt(e)})}}}function X(e){return async t=>await e.operations.captureScreenshot(t)}function Lt(e){return async t=>await e.operations.captureSnapshot(t)}function Rt(e,t,r){return t===`captureScreenshot`?be(`screenshot`,r):e===`capture-with-crop-on`?n(`UNSUPPORTED_OPERATION`,`--crop-on crops the capture to a selector frame using a snapshot taken on the same screen, which this target cannot capture.`,{reason:r.available?void 0:r.reason},{hint:(r.available?void 0:r.hint)??`Re-run screenshot without --crop-on.`}):n(`UNSUPPORTED_OPERATION`,`--overlay-refs annotates a capture with the refs of a snapshot taken on the same screen, which this target cannot capture.`,{reason:r.available?void 0:r.reason},{hint:(r.available?void 0:r.hint)??`Re-run screenshot without --overlay-refs.`})}async function zt(t){let{req:n,session:i}=t,a=r(`screenshot`,n.flags);if(a)throw new e(`INVALID_ARGS`,a);ve(i.device,n.flags?.screenshotPixelDensity);let o=Ut(n),s=typeof n.flags?.screenshotCropOn==`string`&&n.flags.screenshotCropOn.length>0?n.flags.screenshotCropOn:void 0;s!==void 0&&He({device:i.device,surface:i.surface,cropOn:s,overlayRefs:n.flags?.overlayRefs===!0,fullscreen:n.flags?.screenshotFullscreen===!0});let c=await Y({device:i.device,overlayRefs:n.flags?.overlayRefs===!0,cropOn:s,inspectFacts:t.inspectFacts,bindDevice:t.bindDevice});if(!c.ok)return c;let l=c.runtime,u={warnings:[]};return{ok:!0,recorded:o.recorded,execute:async e=>await $({session:e.session,sessionName:e.sessionName,logPath:e.logPath,dispatchContext:e.dispatchContext,flags:e.request.flags,outPath:o.outPath,runtime:l,cropOn:s,cropRun:u})}}async function Z(e){let{session:t,sessionName:n,outPath:r,dispatchContext:a}=e;return await oe({backend:Wt(e),artifacts:Gt(),sessions:ce({sessionName:n,getSession:()=>t,recordOptions:{includeSnapshot:!1},setRecord:()=>{}}),policy:fe()}).capture.screenshot({session:n,requestId:a.requestId,appBundleId:t.appBundleId,...i(a),surface:t.surface,...r?{out:{kind:`path`,path:r}}:{}})}function Q(e){return y(e)}async function $(e){let{session:t,runtime:n,flags:r}=e,i=Bt({cropOn:e.cropOn,captureSnapshot:n.captureSnapshot,cropRun:e.cropRun,logPath:e.logPath}),a=await Z({session:t,sessionName:e.sessionName,outPath:e.outPath,dispatchContext:e.dispatchContext,captureScreenshot:n.captureScreenshot,...i?{crop:i}:{}}),o=[...a.warnings??[],...i?.run?.warnings??[]];return{...a,...o.length>0?{warnings:o}:{},...await Vt({session:t,cropOn:e.cropOn,captureSnapshot:n.captureSnapshot,screenshotPath:a.path,logPath:e.logPath,dispatchContext:e.dispatchContext}),...await _e({device:t.device,path:a.path,requestedPixelDensity:r?.screenshotPixelDensity,scale:r?.screenshotScale})}}function Bt(e){let{cropOn:t,captureSnapshot:n,cropRun:r}=e;if(t!==void 0&&n!==void 0&&r!==void 0)return{cropOn:t,captureSnapshot:n,run:r,logPath:e.logPath}}async function Vt(e){let{session:t,cropOn:n,captureSnapshot:r}=e;return n!==void 0||r===void 0?{}:{overlayRefs:await Ht({session:t,logPath:e.logPath,screenshotPath:e.screenshotPath,dispatchContext:e.dispatchContext,captureSnapshot:r})}}async function Ht(e){let{session:t,dispatchContext:n}=e,r={snapshotInteractiveOnly:!0},i=await v({device:t.device,session:t,flags:r,logPath:e.logPath,snapshotScope:void 0,captureData:async()=>await e.captureSnapshot({options:{appBundleId:t.appBundleId,interactiveOnly:!0,surface:t.surface},execution:Q(n)})}),a=b(i,r);return se(t,a),await V({screenshotPath:e.screenshotPath,snapshot:a})}function Ut(e){let t=e.positionals??[],n=e.flags??{},r=t=>t===void 0?void 0:ae.expandHome(t,e.meta?.cwd),i=r(t[0]),a=r(n.out);return{outPath:i??a,recorded:{positionals:i?[i,...t.slice(1)]:t,flags:a?{...n,out:a}:n}}}function Wt(e){let{session:t,dispatchContext:n,captureScreenshot:r,crop:o}=e;return{platform:l(t.device),captureScreenshot:async(e,s,l)=>{let u=i({...n,...a(l)});if(await r({outPath:s,options:{appBundleId:n.appBundleId,pixelDensity:u.pixelDensity,fullscreen:u.fullscreen,normalizeStatusBar:u.normalizeStatusBar,stabilize:u.stabilize,surface:l?.surface,skipIosSimulatorBootCheck:n.skipIosSimulatorBootCheck??(c(t.device)&&t.device.kind===`simulator`),captureBackend:n.screenshotCaptureBackend},execution:Q(n)}),o){let e=await Qe({device:t.device,session:t,surface:t.surface,cropOn:o.cropOn,screenshotPath:s,logPath:o.logPath,dispatchContext:n,captureSnapshot:o.captureSnapshot});o.run.warnings.push(...Ze(e))}}}}function Gt(){return{resolveInput:async()=>{throw new e(`UNSUPPORTED_OPERATION`,`screenshot does not resolve input artifacts`)},reserveOutput:async e=>{let t,n;return e?.kind===`path`?n=e.path:(t=await S.mkdtemp(x.join(C.tmpdir(),`agent-device-screenshot-`)),n=x.join(t,`screenshot.png`)),await S.mkdir(x.dirname(n),{recursive:!0}),{path:n,visibility:`client-visible`,publish:async()=>void 0,...t?{cleanup:async()=>{await S.rm(t,{recursive:!0,force:!0})}}:{}}},createTempFile:async e=>{let t=await S.mkdtemp(x.join(C.tmpdir(),`${e.prefix}-`));return{path:x.join(t,`file${e.ext}`),visibility:`internal`,cleanup:async()=>{await S.rm(t,{recursive:!0,force:!0})}}}}}export{Te as _,V as a,D as b,we as c,E as d,De as f,Ne as g,Pe as h,Y as i,T as l,Fe as m,zt as n,Oe as o,Ee as p,Q as r,k as s,Z as t,Ae as u,ke as v,O as y};
@@ -1 +1 @@
1
- import{C as e}from"./sdk-contracts.js";import{h as t}from"./host-file.js";import{runHarmonyHdc as n}from"./hdc.js";import{randomUUID as r}from"node:crypto";async function i(i,a){let o=`/data/local/tmp/agent-device-screen-${r()}.jpeg`;try{await n(i,[`shell`,`snapshot_display`,`-f`,o],{timeoutMs:15e3}),await n(i,[`file`,`recv`,o,a],{timeoutMs:15e3});let r=await t(a);if(r.length<3||r[0]!==255||r[1]!==216||r[2]!==255)throw new e(`COMMAND_FAILED`,`HarmonyOS screenshot is not a JPEG file`)}finally{await n(i,[`shell`,`rm`,`-f`,o],{allowFailure:!0}).catch(()=>{})}}export{i as screenshotHarmony};
1
+ import{D as e}from"./sdk-contracts.js";import{h as t}from"./host-file.js";import{runHarmonyHdc as n,runHarmonyShell as r}from"./hdc.js";import{randomUUID as i}from"node:crypto";async function a(a,o){let s=`/data/local/tmp/agent-device-screen-${i()}.jpeg`;try{await r(a,[`snapshot_display`,`-f`,s],{timeoutMs:15e3}),await n(a,[`file`,`recv`,s,o],{timeoutMs:15e3});let i=await t(o);if(i.length<3||i[0]!==255||i[1]!==216||i[2]!==255)throw new e(`COMMAND_FAILED`,`HarmonyOS screenshot is not a JPEG file`)}finally{await r(a,[`rm`,`-f`,s],{allowFailure:!0}).catch(()=>{})}}export{a as screenshotHarmony};
@@ -1,4 +1,4 @@
1
- import{C as e,a as t}from"./sdk-contracts.js";import{l as n}from"./registry.js";import{n as r}from"./path-resolution.js";import"./file.js";import{n as i}from"./screenshot-result.js";import{t as a}from"./shared.js";import{t as o}from"./cli-runner.js";import{n as s,t as c}from"./color.js";import l from"node:path";function u(e){let t=e.baselineInitialized===!0,r=e.summary??{},i=v(r.additions),a=v(r.removals),o=v(r.unchanged),l=s(),u=n(e),d=u.length>0?`${u.join(`
1
+ import{D as e,s as t}from"./sdk-contracts.js";import{l as n}from"./registry.js";import{n as r}from"./path-resolution.js";import"./file.js";import{n as i}from"./screenshot-result.js";import{t as a}from"./shared.js";import{t as o}from"./cli-runner.js";import{n as s,t as c}from"./color.js";import l from"node:path";function u(e){let t=e.baselineInitialized===!0,r=e.summary??{},i=v(r.additions),a=v(r.removals),o=v(r.unchanged),l=s(),u=n(e),d=u.length>0?`${u.join(`
2
2
  `)}\n`:``;if(t)return`${d}Baseline initialized (${o} lines).\n`;let f=y(Array.isArray(e.lines)?e.lines:[],1).map(e=>{let t=typeof e.text==`string`?e.text:``;if(e.kind===`added`){let e=t.startsWith(` `)?`+${t}`:`+ ${t}`;return l?c(e,`green`):e}if(e.kind===`removed`){let e=t.startsWith(` `)?`-${t}`:`- ${t}`;return l?c(e,`red`):e}return l?c(t,`dim`):t}),p=f.length>0?`${f.join(`
3
3
  `)}\n`:``;return l?`${d}${p}${[`${c(String(i),`green`)} additions`,`${c(String(a),`red`)} removals`,`${c(String(o),`dim`)} unchanged`].join(`, `)}\n`:`${d}${p}${i} additions, ${a} removals, ${o} unchanged\n`}function d(e){let t=s(),n=e.match===!0,r=e.dimensionMismatch,i=[];return i.push(...f(e,t)),i.push(...p(e,n,t)),!n&&!r&&(i.push(...m(e,t)),i.push(...h(e,t))),`${i.join(`
4
4
  `)}\n`}function f(e,t){if(e.match===!0)return[`${t?c(`✓`,`green`):`✓`} Screenshots match.`];let n=e.dimensionMismatch,r=t?c(`✗`,`red`):`✗`;if(n){let e=n.expected,t=n.actual;return[`${r} Screenshots have different dimensions: expected ${e?.width}x${e?.height}, got ${t?.width}x${t?.height}`]}let i=v(e.differentPixels),a=v(e.mismatchPercentage),o=`${a===0&&i>0?`<0.01`:String(a)}% pixels differ`;return[`${r} ${t?c(o,`red`):o}`]}function p(e,t,n){if(t)return[];let r=[];if(e.diffPath){let t=_(e.diffPath),i=n?c(`Diff image:`,`dim`):`Diff image:`,a=n?c(t,`green`):t;r.push(` ${i} ${a}`)}if(e.currentOverlayPath){let t=_(e.currentOverlayPath),i=n?c(`Current overlay:`,`dim`):`Current overlay:`,a=n?c(t,`green`):t,o=v(e.currentOverlayRefCount),s=o>0?` (${o} refs)`:``;r.push(` ${i} ${a}${s}`)}return r}function m(e,t){let n=v(e.differentPixels),r=v(e.totalPixels);return[` ${t?c(String(n),`red`):String(n)} different / ${r} total pixels`]}function h(e,t){let n=Array.isArray(e.regions)?e.regions:[];if(n.length===0)return[];let r=[` ${b(`Changed regions:`,t)}`];for(let e of n.slice(0,5))r.push(...g(e));return r}function g(e){let t=e.shareOfDiffPercentage===0&&e.differentPixels>0?`<0.01`:String(e.shareOfDiffPercentage),n=e.rect,r=[` ${e.index}. x=${n.x} y=${n.y} ${n.width}x${n.height}, ${t}% of diff`],i=e.currentOverlayMatches?.[0];if(i){let e=i.label?` "${i.label}"`:``;r.push(` overlaps @${i.ref}${e}, ${i.regionCoveragePercentage}% of region`)}return r}function _(e){let t=process.cwd(),n=l.relative(t,e);return n===``||!n.startsWith(`..`)&&!l.isAbsolute(n)?n===``?`.`:`.${l.sep}${n}`:e}function v(e){return typeof e==`number`&&Number.isFinite(e)?e:0}function y(e,t){if(e.length===0)return e;let n=e.map((e,t)=>({index:t,kind:e.kind})).filter(e=>e.kind===`added`||e.kind===`removed`).map(e=>e.index);if(n.length===0)return e;let r=Array(e.length).fill(!1);for(let i of n){let n=Math.max(0,i-t),a=Math.min(e.length-1,i+t);for(let e=n;e<=a;e+=1)r[e]=!0}return e.filter((e,t)=>r[t])}function b(e,t){return t?c(e,`dim`):e}const x=async({positionals:e,flags:n,client:r})=>{let s=await o({client:r,command:`screenshot`,positionals:e,flags:n});if(t(n.responseLevel))return await a(n,s,()=>JSON.stringify(s,null,2)),!0;let c=i(s);return await a(n,c,()=>{let e=s.overlayRefs?`Annotated ${s.overlayRefs.length} refs onto ${s.path}`:w(s),t=s.warnings??[];return t.length>0?[e,...t].join(`
@@ -1 +1 @@
1
- import{C as e,x as t}from"./sdk-contracts.js";import{o as n,s as r,t as i}from"./capture.js";import{f as a}from"./sdk-batch-runner.js";import{r as o}from"./sdk-device.js";import{Xn as s,Zn as c}from"./sdk-batch.js";import{r as l}from"./recording-export-quality.js";import{n as u,s as d}from"./scroll-gesture.js";import{t as f}from"./gesture-plan-types.js";const p=[`pan`,`fling`,`swipe`,`pinch`,`rotate`,`transform`,`drag`];function m(t){let n=g(t),r=x(n,`kind`,p);if(r===`pan`)return{kind:r,origin:_(n,`origin`),delta:_(n,`delta`),pointerCount:a(n,`pointerCount`,{min:1,max:2}),durationMs:h(n)};if(r===`drag`)return ee(n);if(n.pointerCount!==void 0)throw new e(`INVALID_ARGS`,`pointerCount is supported only for gesture pan`);if(r===`fling`){if(n.durationMs!==void 0)throw new e(`INVALID_ARGS`,`gesture fling does not accept durationMs; use gesture pan for timed movement`);return{kind:r,direction:x(n,`direction`,u),origin:_(n,`origin`),distance:a(n,`distance`,{min:0})}}if(r===`swipe`){if(n.durationMs!==void 0)throw new e(`INVALID_ARGS`,`gesture swipe does not accept durationMs; use gesture pan for timed movement`);return{kind:r,preset:x(n,`preset`,d)}}if(r===`pinch`)return{kind:r,scale:y(n,`scale`),origin:v(n,`origin`)};if(r===`rotate`){if(n.velocity!==void 0)throw new e(`INVALID_ARGS`,`gesture rotate does not accept velocity; rotation pacing derives from degrees`);return{kind:r,degrees:y(n,`degrees`),origin:v(n,`origin`)}}return{kind:r,origin:_(n,`origin`),delta:_(n,`delta`),scale:y(n,`scale`),degrees:y(n,`degrees`),durationMs:h(n)}}function ee(t){let n=a(t,`sourceHoldMs`,{min:1,max:1e4}),r=a(t,`moveMs`,{min:16,max:1e4}),i=a(t,`destinationHoldMs`,{min:0,max:1e4});if((n??800)+(r??500)+(i??0)>1e4)throw new e(`INVALID_ARGS`,`gesture drag total duration must be at most ${f}`);return{kind:`drag`,source:b(t,`source`),destination:b(t,`destination`),sourceHoldMs:n,moveMs:r,destinationHoldMs:i}}function h(t){let n=a(t,`durationMs`);if(n!==void 0){if(n<16||n>1e4)throw new e(`INVALID_ARGS`,`Expected durationMs to be an integer between 16 and ${f}.`);return n}}function g(t){if(!t||typeof t!=`object`||Array.isArray(t))throw new e(`INVALID_ARGS`,`gesture requires structured object input`);return t}function _(e,t){let n=g(e[t]);return{x:y(n,`x`),y:y(n,`y`)}}function v(e,t){return e[t]===void 0?void 0:_(e,t)}function y(t,n){let r=t[n];if(typeof r!=`number`||!Number.isFinite(r))throw new e(`INVALID_ARGS`,`Expected ${n} to be a finite number.`);return r}function b(t,n){let r=t[n];if(typeof r!=`string`||r.trim().length===0)throw new e(`INVALID_ARGS`,`Expected ${n} to be a non-empty string.`);return r.trim()}function x(t,n,r){let i=t[n];if(typeof i!=`string`||!r.includes(i))throw new e(`INVALID_ARGS`,`Expected ${n} to be one of: ${r.join(`, `)}.`);return i}const S={swipe:{max:4,usage:`swipe accepts 4 arguments: x1 y1 x2 y2`,retired:{positional:`durationMs`,migrate:te}},"gesture pan":{max:5,usage:`gesture pan accepts at most 5 arguments: x y dx dy [durationMs]`},"gesture fling":{max:4,usage:`gesture fling accepts at most 4 arguments: direction x y [distance]`,retired:{positional:`durationMs`,migrate:(e,t)=>`use "${t}", or gesture pan for timed movement.`}},"gesture swipe":{max:1,usage:`gesture swipe accepts 1 argument: preset`,retired:{positional:`durationMs`,migrate:(e,t)=>`use "${t}", or gesture pan for timed movement.`}},"gesture pinch":{max:3,usage:`gesture pinch accepts at most 3 arguments: scale [x] [y]`},"gesture rotate":{max:3,usage:`gesture rotate accepts at most 3 arguments: degrees [x] [y]`,retired:{positional:`velocity`,migrate:(e,t)=>`use "${t}"; rotation pacing derives from degrees.`}},"gesture transform":{max:7,usage:`gesture transform accepts at most 7 arguments: x y dx dy scale degrees [durationMs]`},"gesture drag":{max:5,usage:`gesture drag accepts at most 5 arguments: source destination [sourceHoldMs] [moveMs] [destinationHoldMs]`}};function te(e,t){let[n,r,i,a,o]=e,s=C(n,i),c=C(r,a);return s===void 0||c===void 0?`use "gesture pan x1 y1 dx dy durationMs" for the same timed drag, or "${t}" for a default-duration swipe.`:`use "gesture pan ${n} ${r} ${s} ${c} ${o}" for the same timed drag, or "${t}" for a default-duration swipe.`}function C(e,t){let n=Number(t)-Number(e);return Number.isFinite(n)?n:void 0}function w(e,t){let n=S[e];if(t.length<=n.max)return;let r=n.retired;if(!r||t.length!==n.max+1||!T(t[n.max]))return{usage:n.usage};let i=`${e} ${t.slice(0,n.max).join(` `)}`;return{usage:n.usage,migration:`The trailing ${r.positional} positional was removed: ${r.migrate(t,i)}`}}function T(e){return e===void 0||e.trim().length===0?!1:e.startsWith("${")||Number.isFinite(Number(e))}function ne(t){if(!(!t||typeof t!=`object`||Array.isArray(t))&&t.durationMs!==void 0)throw new e(`INVALID_ARGS`,`swipe does not accept durationMs; use gesture pan for timed movement`)}function E(e,t){let n=t?`${e.usage} (${t})`:e.usage;return e.migration?`${n}. ${e.migration}`:`${n}.`}function D(t,n){let r=w(t,n);if(r)throw new e(`INVALID_ARGS`,E(r))}function re(e,t,n){let r=ie(e,t);return r?E(r,n):void 0}function ie(e,t){if(e===`swipe`)return w(`swipe`,t);if(e!==`gesture`)return;let n=`gesture ${t[0]}`;if(Object.hasOwn(S,n))return w(n,t.slice(1))}function O(e){return{origin:{x:Number(e[0]),y:Number(e[1])},delta:{x:Number(e[2]),y:Number(e[3])}}}function k(e,t){let n=e[0],r=e.slice(1);switch(n){case`pan`:{D(`gesture pan`,r);let{origin:e,delta:i}=O(r);return m({kind:n,origin:e,delta:i,pointerCount:t,durationMs:A(r[4])})}case`fling`:return D(`gesture fling`,r),m({kind:n,direction:r[0],origin:{x:Number(r[1]),y:Number(r[2])},distance:A(r[3])});case`swipe`:return D(`gesture swipe`,r),m({kind:n,preset:r[0]});case`pinch`:return D(`gesture pinch`,r),m({kind:n,scale:Number(r[0]),origin:j(r[1],r[2])});case`rotate`:return D(`gesture rotate`,r),m({kind:n,degrees:Number(r[0]),origin:j(r[1],r[2])});case`transform`:{D(`gesture transform`,r);let{origin:e,delta:t}=O(r);return m({kind:n,origin:e,delta:t,scale:Number(r[4]),degrees:Number(r[5]),durationMs:A(r[6])})}case`drag`:return D(`gesture drag`,r),m({kind:n,source:r[0],destination:r[1],sourceHoldMs:A(r[2]),moveMs:A(r[3]),destinationHoldMs:A(r[4])});default:return m({kind:n})}}function ae(e){if(e[0]!==`drag`)return;let t=k(e);return t.kind===`drag`?t:void 0}function oe(e){switch(e.kind){case`pan`:return M([e.kind,e.origin.x,e.origin.y,e.delta.x,e.delta.y,e.durationMs]);case`fling`:return M([e.kind,e.direction,e.origin.x,e.origin.y,e.distance]);case`swipe`:return[e.kind,e.preset];case`pinch`:return M([e.kind,e.scale,e.origin?.x,e.origin?.y]);case`rotate`:return e.origin?M([e.kind,e.degrees,e.origin.x,e.origin.y]):[e.kind,String(e.degrees)];case`transform`:return M([e.kind,e.origin.x,e.origin.y,e.delta.x,e.delta.y,e.scale,e.degrees,e.durationMs]);case`drag`:return[e.kind,e.source,e.destination,String(e.sourceHoldMs??800),String(e.moveMs??500),String(e.destinationHoldMs??0)]}}function se(e,t={}){return D(`swipe`,e),{from:{x:Number(e[0]),y:Number(e[1])},to:{x:Number(e[2]),y:Number(e[3])},...t.count===void 0?{}:{count:t.count},...t.pauseMs===void 0?{}:{pauseMs:t.pauseMs},...t.pattern===void 0?{}:{pattern:t.pattern}}}function ce(t){switch(t.kind){case`pan`:return{gesture:{intent:`pan`,origin:t.origin,delta:t.delta,pointerCount:t.pointerCount,durationMs:t.durationMs}};case`fling`:return{gesture:{intent:`fling`,direction:t.direction,origin:t.origin,distance:t.distance}};case`swipe`:return{gesture:{intent:`fling`,preset:t.preset}};case`pinch`:return{gesture:{intent:`pinch`,origin:t.origin,scale:t.scale}};case`rotate`:return{gesture:{intent:`rotate`,origin:t.origin,degrees:t.degrees}};case`transform`:return{gesture:{intent:`transform`,origin:t.origin,delta:t.delta,scale:t.scale,degrees:t.degrees,durationMs:t.durationMs}};case`drag`:throw new e(`INVALID_ARGS`,`gesture drag targets must be resolved before coordinate normalization`)}}function le(e){return e.kind===`drag`?{intent:`drag`,source:e.source,destination:e.destination,sourceHoldMs:e.sourceHoldMs,moveMs:e.moveMs,destinationHoldMs:e.destinationHoldMs}:ce(e).gesture}function ue(e){return{gesture:{intent:`fling`,from:e.from,to:e.to}}}function A(e){return e===void 0?void 0:Number(e)}function j(t,n){if(t===void 0!=(n===void 0))throw new e(`INVALID_ARGS`,`gesture origin requires both x and y coordinates`);return t===void 0?void 0:{x:Number(t),y:Number(n)}}function M(e){return e.filter(e=>e!==void 0).map(String)}const de={ios:!0,android:!0,harmonyos:!0};function N(e){return typeof e==`string`&&Object.hasOwn(de,e)}function P(e){return e.startsWith(`@`)?t(e)?.base??e:e}const F=/^-?\d+(\.\d+)?$/,fe=/^[^\s"\\]+$/,pe=new Map([[`--count`,`count`],[`--interval-ms`,`intervalMs`],[`--hold-ms`,`holdMs`],[`--jitter-px`,`jitterPx`]]),me=new Map([[`--count`,`count`],[`--pause-ms`,`pauseMs`]]),he=new Map([[`--pointer-count`,`pointerCount`]]),ge=new Map([[`--delay-ms`,`delayMs`]]);function I(e){return e===`click`||e===`press`}function L(e){return I(e)||e===`longpress`||e===`hover`}function R(e){return e===`type`||e===`fill`}function z(e){return H(e,_e)}function B(e){return JSON.stringify(e)}function V(e){return H(e,U)}function H(e,t){return t(e)?e:B(e)}function _e(e){return U(e)&&e.startsWith(`@`)||F.test(e)}function U(e){return fe.test(e)}const ve=new Set([`fill`,`type`]);function ye(e){if(!ve.has(e.command)){let t=(e.positionals??[]).map(e=>z(e));return[e.command,...t].join(` `)}let t=be(e).map(e=>z(e)).join(` `);return[e.command,t,`<text>`].filter(e=>e.length>0).join(` `)}function be(e){if(e.command===`type`)return[];let t=e.positionals??[],n=t[0];return n===void 0?[]:n.startsWith(`@`)?[n]:t.length>=3&&F.test(n)&&F.test(t[1]??``)?[n,t[1]]:[n]}function W(e,t){let n=t.flags??{};if(I(t.command)){typeof n.count==`number`&&e.push(`--count`,String(n.count)),typeof n.intervalMs==`number`&&e.push(`--interval-ms`,String(n.intervalMs)),typeof n.holdMs==`number`&&e.push(`--hold-ms`,String(n.holdMs)),typeof n.jitterPx==`number`&&e.push(`--jitter-px`,String(n.jitterPx)),n.doubleTap===!0&&e.push(`--double-tap`);let t=n.clickButton;t&&t!==`primary`&&e.push(`--button`,t);return}if(t.command===`swipe`){typeof n.count==`number`&&e.push(`--count`,String(n.count)),typeof n.pauseMs==`number`&&e.push(`--pause-ms`,String(n.pauseMs)),(n.pattern===`one-way`||n.pattern===`ping-pong`)&&e.push(`--pattern`,n.pattern);return}if(t.command===`gesture`){typeof n.pointerCount==`number`&&e.push(`--pointer-count`,String(n.pointerCount));return}R(t.command)&&typeof n.delayMs==`number`&&e.push(`--delay-ms`,String(n.delayMs))}function G(e,t){t&&(N(t.platform)&&e.push(`--platform`,t.platform),typeof t.metroHost==`string`&&t.metroHost.length>0&&e.push(`--metro-host`,V(t.metroHost)),typeof t.metroPort==`number`&&e.push(`--metro-port`,String(t.metroPort)),typeof t.bundleUrl==`string`&&t.bundleUrl.length>0&&e.push(`--bundle-url`,V(t.bundleUrl)),typeof t.launchUrl==`string`&&t.launchUrl.length>0&&e.push(`--launch-url`,V(t.launchUrl)))}function xe(e,t){let[n,...r]=t.positionals??[];n&&e.push(V(n));for(let t of r)e.push(z(t));typeof t.flags?.fps==`number`&&e.push(`--fps`,String(t.flags.fps)),(typeof t.flags?.quality==`number`||typeof t.flags?.quality==`string`)&&e.push(`--quality`,String(t.flags.quality)),t.flags?.hideTouches&&e.push(`--hide-touches`)}function Se(e,t){t.flags?.snapshotInteractiveOnly&&e.push(`-i`),typeof t.flags?.snapshotDepth==`number`&&e.push(`-d`,String(t.flags.snapshotDepth)),t.flags?.snapshotScope&&e.push(`-s`,z(t.flags.snapshotScope)),t.flags?.snapshotRaw&&e.push(`--raw`)}function Ce(e,t){for(let n of t.positionals??[])e.push(z(n));let r=t.flags?.screenshotCropOn;typeof r==`string`&&r.length>0&&e.push(`--crop-on`,V(r)),n(e,t.flags)}function we(e,t,n={}){let r=t.positionals??[],i=n.includeAllPositionals?r:r.slice(0,1);for(let t of i)e.push(V(t));G(e,t.flags)}function Te(e,t){for(let n of t.positionals??[])e.push(z(t.command===`wait`?P(n):n));W(e,t)}function K(e,t){let n=[],r={},i=I(e)?pe:e===`swipe`?me:e===`gesture`?he:R(e)?ge:void 0;for(let a=0;a<t.length;a+=1){let o=t[a];if(I(e)&&o===`--double-tap`){r.doubleTap=!0;continue}let s=t[a+1];if(I(e)&&o===`--button`&&s!==void 0){let e=s;(e===`primary`||e===`secondary`||e===`middle`)&&(r.clickButton=e),a+=1;continue}let c=i?.get(o);if(c&&s!==void 0){let e=J(s);if(e!==null){r[c]=e,a+=1;continue}}if(e===`swipe`&&o===`--pattern`&&s!==void 0){let e=s;(e===`one-way`||e===`ping-pong`)&&(r.pattern=e),a+=1;continue}n.push(o)}return{positionals:n,flags:r}}function q(e){let t=[],n={};for(let r=0;r<e.length;r+=1){let i=e[r],a=e[r+1];if(i===`--platform`&&a!==void 0){let e=a;N(e)&&(n.platform=e),r+=1;continue}if(i===`--metro-host`&&a!==void 0){n.metroHost=a,r+=1;continue}if(i===`--metro-port`&&a!==void 0){let e=J(a);e!==null&&(n.metroPort=e),r+=1;continue}if(i===`--bundle-url`&&a!==void 0){n.bundleUrl=a,r+=1;continue}if(i===`--launch-url`&&a!==void 0){n.launchUrl=a,r+=1;continue}t.push(i)}return{positionals:t,flags:n}}function J(e){if(!e)return null;let t=Number(e);return!Number.isFinite(t)||t<0?null:Math.floor(t)}function Ee(e){let t;for(let n of e){if(n.command===`runtime`&&typeof n.flags.platform==`string`){t=n.flags.platform;continue}if(n.command===`open`)return n.runtime?.platform??t}return t}function De(e,t){for(let n of t.positionals??[])e.push(z(n));t.flags?.relaunch&&e.push(`--relaunch`),t.flags?.testIme===!0?e.push(`--test-ime`):t.flags?.testIme===!1&&e.push(`--no-test-ime`),G(e,t.runtime)}function Oe(e){let t=[],n={};for(let r of e){if(r===`--relaunch`){n.relaunch=!0;continue}if(r===`--test-ime`){n.testIme=!0;continue}if(r===`--no-test-ime`){n.testIme=!1;continue}t.push(r)}let r=q(t);return{positionals:r.positionals,flags:n,runtime:ke(r.flags)?r.flags:void 0}}function ke(e){return!!(e.platform||e.metroHost||e.metroPort!==void 0||e.bundleUrl||e.launchUrl)}const Y=/^[A-Z_][A-Z0-9_]*$/,Ae=new Set(o.filter(e=>e!==`web`)),je=new Set([`mobile`,`tv`,`desktop`]);function Me(t){let n=[],r=[],i=t.split(/\r?\n/),a=!1,o,l=(t,n,r)=>{let i=t.kind===`multiple`?`targets-v1`:`target-v1`;throw new e(`INVALID_ARGS`,`${i} annotation on line ${t.line} must be immediately followed by its action line (line ${n+1} ${r}).`)};for(let[t,u]of i.entries()){let i=u.trim();if(i.length===0){o&&l(o,t,`is blank`);continue}if(i.startsWith(`#`)){let e=s(i);if(e.kind===`v1`){o&&l(o,t,`is another target annotation`),o={kind:`multiple`,evidence:e.evidence,line:t+1};continue}let n=c(i);if(n.kind===`v1`){o&&l(o,t,`is another target annotation`),o={kind:`single`,evidence:n.evidence,line:t+1};continue}o&&l(o,t,`is a comment`);continue}if(X(i)){if(o&&l(o,t,`is an env directive`),a)throw new e(`INVALID_ARGS`,`env directives must precede all actions (line ${t+1}).`);continue}let d=Le(u);if(!d){o&&l(o,t,`did not parse as an action`);continue}let f=re(d.command,d.positionals??[],`line ${t+1}`);if(f)throw new e(`INVALID_ARGS`,f);o&&=(o.kind===`single`?d.targetEvidence=o.evidence:d.targetEvidences=o.evidence,void 0),n.push(d),r.push(t+1),a=!0}if(o){let t=o.kind===`multiple`?`targets-v1`:`target-v1`;throw new e(`INVALID_ARGS`,`${t} annotation on line ${o.line} must be immediately followed by its action line (end of script reached).`)}return{actions:n,actionLines:r}}function Ne(e){let t=e.split(/\r?\n/),n={};for(let[e,r]of t.entries()){let t=r.trim();if(t.length===0||t.startsWith(`#`))continue;if(X(t)){Ie(n,t,e+1);continue}if(!t.startsWith(`context `))break;let i=t.match(/(?:^|\s)platform=([^\s]+)/);if(i){let e=i[1];e&&Ae.has(e)&&Z(n,`platform`,e)}let a=t.match(/(?:^|\s)target=([^\s]+)/);if(a){let e=a[1];e&&je.has(e)&&Z(n,`target`,e)}let o=t.match(/(?:^|\s)timeout=(\d+)/);if(o){let e=Number(o[1]);Number.isFinite(e)&&e>=1&&Z(n,`timeoutMs`,Math.floor(e))}let s=t.match(/(?:^|\s)retries=(\d+)/);if(s){let e=Number(s[1]);Number.isFinite(e)&&e>=0&&Z(n,`retries`,Math.floor(e))}}return n}function X(e){return e===`env`||e.startsWith(`env `)||e.startsWith(`env `)}function Pe(t,n){let r=t.slice(3).replace(/^[\s]+/,``),i=r.indexOf(`=`);if(i<=0)throw new e(`INVALID_ARGS`,`Invalid env directive on line ${n}: expected "env KEY=VALUE".`);let a=r.slice(0,i);if(!Y.test(a))throw new e(`INVALID_ARGS`,`Invalid env key "${a}" on line ${n}: keys must be uppercase letters, digits, and underscores (e.g. APP_ID).`);if(a.startsWith(`AD_`))throw new e(`INVALID_ARGS`,`Invalid env key "${a}" on line ${n}: the AD_* namespace is reserved for built-in variables. Rename ${a} to avoid the AD_ prefix.`);return{key:a,value:Fe(r.slice(i+1),n)}}function Fe(t,n){if(t.length===0)return``;if(t.startsWith(`"`))try{let e=JSON.parse(t);if(typeof e!=`string`)throw Error(`not a string literal`);return e}catch{throw new e(`INVALID_ARGS`,`Invalid quoted env value on line ${n}.`)}return t}function Ie(t,n,r){let{key:i,value:a}=Pe(n,r),o=t.env??{};if(Object.prototype.hasOwnProperty.call(o,i))throw new e(`INVALID_ARGS`,`Duplicate env directive "${i}" on line ${r}.`);o[i]=a,t.env=o}function Z(t,n,r){let i=t[n];if(i!==void 0){let t=i===r?`Duplicate replay test metadata "${n}" in context header.`:`Conflicting replay test metadata "${n}" in context header: ${String(i)} vs ${String(r)}.`;throw new e(`INVALID_ARGS`,t)}t[n]=r}function Le(t){let n=t.trim();if(n.length===0||n.startsWith(`#`))return null;let[a,...o]=Re(n);if(a===void 0||a===`context`)return null;let s={ts:Date.now(),command:a,positionals:[],flags:{}};if(a===`snapshot`){s.positionals=[];for(let e=0;e<o.length;e+=1){let t=o[e];if(t===`-i`){s.flags.snapshotInteractiveOnly=!0;continue}if(t!==`-c`){if(t===`--raw`){s.flags.snapshotRaw=!0;continue}if(t===`--force-full`){s.flags.snapshotForceFull=!0;continue}if((t===`-d`||t===`--depth`)&&e+1<o.length){let t=Number(o[e+1]);Number.isFinite(t)&&t>=0&&(s.flags.snapshotDepth=Math.floor(t)),e+=1;continue}if((t===`-s`||t===`--scope`)&&e+1<o.length){s.flags.snapshotScope=o[e+1],e+=1;continue}if(t===`--backend`&&e+1<o.length){e+=1;continue}}}return s}if(a===`open`){let e=Oe(o);return s.positionals=e.positionals,Object.assign(s.flags,e.flags),s.runtime=e.runtime,s}if(a===`runtime`){let e=q(o);return s.positionals=e.positionals,Object.assign(s.flags,e.flags),s}if(I(a)){let e=K(a,o);Object.assign(s.flags,e.flags);let t=e.positionals[0];if(t===void 0)return s;if(t.startsWith(`@`))return s.positionals=[P(t)],e.positionals[1]&&(s.result={refLabel:e.positionals[1]}),s;let n=e.positionals[0],r=e.positionals[1];return $(n)&&$(r)&&e.positionals.length>=2?(s.positionals=[n,r],s):(s.positionals=[e.positionals.join(` `)],s)}if(a===`fill`){let e=K(a,o);if(Object.assign(s.flags,e.flags),!Q(e.positionals))return s.positionals=e.positionals,s;let[t,n,...r]=e.positionals;if($(t)&&$(n))return s.positionals=[t,n,r.join(` `)],s;let[i,c,...l]=e.positionals;if(i.startsWith(`@`)){let e=P(i);return l.length>0?(s.positionals=[e,l.join(` `)],s.result={refLabel:c},s):(s.positionals=[e,c],s)}return s.positionals=[i,[c,...l].join(` `)],s}if(a===`get`){let e=o[0],t=o[1];return e===void 0||t===void 0?(s.positionals=o,s):t.startsWith(`@`)?(s.positionals=[e,P(t)],o[2]&&(s.result={refLabel:o[2]}),s):(s.positionals=[e,o.slice(1).join(` `)],s)}if(a===`swipe`||a===`type`||a===`gesture`){let e=K(a,o);return Object.assign(s.flags,e.flags),s.positionals=e.positionals,s}if(a===`record`){let t=[];for(let n=0;n<o.length;n+=1){let r=o[n];if(r===i.cliToken)throw new e(`INVALID_ARGS`,i.migration.record);if(r===`--hide-touches`){s.flags.hideTouches=!0;continue}if(r===`--fps`&&n+1<o.length){let e=Number(o[n+1]);Number.isFinite(e)&&(s.flags.fps=Math.floor(e)),n+=1;continue}if(r===`--quality`&&n+1<o.length){let e=o[n+1],t=l(e);t!==void 0&&(s.flags.quality=t),n+=1;continue}t.push(r)}return s.positionals=t,s}if(a===`screenshot`){let e=[];for(let t=0;t<o.length;t+=1){let n=o[t],i=r({args:o,index:t,flags:s.flags});if(i.handled){t=i.nextIndex;continue}e.push(n)}return s.positionals=e,s}return s.positionals=a===`wait`||a===`longpress`||a===`hover`?o.map(e=>P(e)):o,s}function Q(e){return e.length>=2}function $(e){return e?!Number.isNaN(Number(e)):!1}function Re(e){let t=[],n=0;for(;n<e.length&&(n=ze(e,n),!(n>=e.length));){let r=e[n]===`"`?Be(e,n):Ve(e,n);t.push(r.value),n=r.nextCursor}return t}function ze(e,t){let n=t;for(;n<e.length&&/\s/.test(e.charAt(n));)n+=1;return n}function Be(t,n){let r=n+1,i=!1,a=r;for(;a<t.length;a+=1){let e=t.charAt(a);if(e===`"`&&!i)break;if(i){i=!1;continue}i=e===`\\`}if(a>=t.length)throw new e(`INVALID_ARGS`,`Invalid replay script line: ${t}`);let o=t.slice(n,a+1),s;try{s=JSON.parse(o)}catch{throw new e(`INVALID_ARGS`,`Invalid quoted value ${o} in replay script line: ${t}`,{hint:`Quoted replay values are JSON strings: escape backslashes, quotes, tabs, and newlines (\\\\, \\", \\t, \\n).`})}return{value:s,nextCursor:a+1}}function Ve(e,t){let n=t;for(;n<e.length&&!/\s/.test(e.charAt(n));)n+=1;return{value:e.slice(t,n),nextCursor:n}}export{ue as C,m as E,le as S,p as T,P as _,Ee as a,k as b,we as c,Se as d,ye as f,L as g,I as h,De as i,Ce as l,B as m,Me as n,Te as o,z as p,Ne as r,xe as s,Y as t,W as u,ne as v,se as w,oe as x,ae as y};
1
+ import{D as e,T as t}from"./sdk-contracts.js";import{o as n,s as r,t as i}from"./capture.js";import{f as a}from"./sdk-batch-runner.js";import{r as o}from"./sdk-device.js";import{$n as s,Qn as c}from"./sdk-batch.js";import{r as l}from"./recording-export-quality.js";import{n as u,s as d}from"./scroll-gesture.js";import{t as f}from"./gesture-plan-types.js";const p=[`pan`,`fling`,`swipe`,`pinch`,`rotate`,`transform`,`drag`];function m(t){let n=g(t),r=x(n,`kind`,p);if(r===`pan`)return{kind:r,origin:_(n,`origin`),delta:_(n,`delta`),pointerCount:a(n,`pointerCount`,{min:1,max:2}),durationMs:h(n)};if(r===`drag`)return ee(n);if(n.pointerCount!==void 0)throw new e(`INVALID_ARGS`,`pointerCount is supported only for gesture pan`);if(r===`fling`){if(n.durationMs!==void 0)throw new e(`INVALID_ARGS`,`gesture fling does not accept durationMs; use gesture pan for timed movement`);return{kind:r,direction:x(n,`direction`,u),origin:_(n,`origin`),distance:a(n,`distance`,{min:0})}}if(r===`swipe`){if(n.durationMs!==void 0)throw new e(`INVALID_ARGS`,`gesture swipe does not accept durationMs; use gesture pan for timed movement`);return{kind:r,preset:x(n,`preset`,d)}}if(r===`pinch`)return{kind:r,scale:y(n,`scale`),origin:v(n,`origin`)};if(r===`rotate`){if(n.velocity!==void 0)throw new e(`INVALID_ARGS`,`gesture rotate does not accept velocity; rotation pacing derives from degrees`);return{kind:r,degrees:y(n,`degrees`),origin:v(n,`origin`)}}return{kind:r,origin:_(n,`origin`),delta:_(n,`delta`),scale:y(n,`scale`),degrees:y(n,`degrees`),durationMs:h(n)}}function ee(t){let n=a(t,`sourceHoldMs`,{min:1,max:1e4}),r=a(t,`moveMs`,{min:16,max:1e4}),i=a(t,`destinationHoldMs`,{min:0,max:1e4});if((n??800)+(r??500)+(i??0)>1e4)throw new e(`INVALID_ARGS`,`gesture drag total duration must be at most ${f}`);return{kind:`drag`,source:b(t,`source`),destination:b(t,`destination`),sourceHoldMs:n,moveMs:r,destinationHoldMs:i}}function h(t){let n=a(t,`durationMs`);if(n!==void 0){if(n<16||n>1e4)throw new e(`INVALID_ARGS`,`Expected durationMs to be an integer between 16 and ${f}.`);return n}}function g(t){if(!t||typeof t!=`object`||Array.isArray(t))throw new e(`INVALID_ARGS`,`gesture requires structured object input`);return t}function _(e,t){let n=g(e[t]);return{x:y(n,`x`),y:y(n,`y`)}}function v(e,t){return e[t]===void 0?void 0:_(e,t)}function y(t,n){let r=t[n];if(typeof r!=`number`||!Number.isFinite(r))throw new e(`INVALID_ARGS`,`Expected ${n} to be a finite number.`);return r}function b(t,n){let r=t[n];if(typeof r!=`string`||r.trim().length===0)throw new e(`INVALID_ARGS`,`Expected ${n} to be a non-empty string.`);return r.trim()}function x(t,n,r){let i=t[n];if(typeof i!=`string`||!r.includes(i))throw new e(`INVALID_ARGS`,`Expected ${n} to be one of: ${r.join(`, `)}.`);return i}const S={swipe:{max:4,usage:`swipe accepts 4 arguments: x1 y1 x2 y2`,retired:{positional:`durationMs`,migrate:te}},"gesture pan":{max:5,usage:`gesture pan accepts at most 5 arguments: x y dx dy [durationMs]`},"gesture fling":{max:4,usage:`gesture fling accepts at most 4 arguments: direction x y [distance]`,retired:{positional:`durationMs`,migrate:(e,t)=>`use "${t}", or gesture pan for timed movement.`}},"gesture swipe":{max:1,usage:`gesture swipe accepts 1 argument: preset`,retired:{positional:`durationMs`,migrate:(e,t)=>`use "${t}", or gesture pan for timed movement.`}},"gesture pinch":{max:3,usage:`gesture pinch accepts at most 3 arguments: scale [x] [y]`},"gesture rotate":{max:3,usage:`gesture rotate accepts at most 3 arguments: degrees [x] [y]`,retired:{positional:`velocity`,migrate:(e,t)=>`use "${t}"; rotation pacing derives from degrees.`}},"gesture transform":{max:7,usage:`gesture transform accepts at most 7 arguments: x y dx dy scale degrees [durationMs]`},"gesture drag":{max:5,usage:`gesture drag accepts at most 5 arguments: source destination [sourceHoldMs] [moveMs] [destinationHoldMs]`}};function te(e,t){let[n,r,i,a,o]=e,s=C(n,i),c=C(r,a);return s===void 0||c===void 0?`use "gesture pan x1 y1 dx dy durationMs" for the same timed drag, or "${t}" for a default-duration swipe.`:`use "gesture pan ${n} ${r} ${s} ${c} ${o}" for the same timed drag, or "${t}" for a default-duration swipe.`}function C(e,t){let n=Number(t)-Number(e);return Number.isFinite(n)?n:void 0}function w(e,t){let n=S[e];if(t.length<=n.max)return;let r=n.retired;if(!r||t.length!==n.max+1||!T(t[n.max]))return{usage:n.usage};let i=`${e} ${t.slice(0,n.max).join(` `)}`;return{usage:n.usage,migration:`The trailing ${r.positional} positional was removed: ${r.migrate(t,i)}`}}function T(e){return e===void 0||e.trim().length===0?!1:e.startsWith("${")||Number.isFinite(Number(e))}function ne(t){if(!(!t||typeof t!=`object`||Array.isArray(t))&&t.durationMs!==void 0)throw new e(`INVALID_ARGS`,`swipe does not accept durationMs; use gesture pan for timed movement`)}function E(e,t){let n=t?`${e.usage} (${t})`:e.usage;return e.migration?`${n}. ${e.migration}`:`${n}.`}function D(t,n){let r=w(t,n);if(r)throw new e(`INVALID_ARGS`,E(r))}function re(e,t,n){let r=ie(e,t);return r?E(r,n):void 0}function ie(e,t){if(e===`swipe`)return w(`swipe`,t);if(e!==`gesture`)return;let n=`gesture ${t[0]}`;if(Object.hasOwn(S,n))return w(n,t.slice(1))}function O(e){return{origin:{x:Number(e[0]),y:Number(e[1])},delta:{x:Number(e[2]),y:Number(e[3])}}}function k(e,t){let n=e[0],r=e.slice(1);switch(n){case`pan`:{D(`gesture pan`,r);let{origin:e,delta:i}=O(r);return m({kind:n,origin:e,delta:i,pointerCount:t,durationMs:A(r[4])})}case`fling`:return D(`gesture fling`,r),m({kind:n,direction:r[0],origin:{x:Number(r[1]),y:Number(r[2])},distance:A(r[3])});case`swipe`:return D(`gesture swipe`,r),m({kind:n,preset:r[0]});case`pinch`:return D(`gesture pinch`,r),m({kind:n,scale:Number(r[0]),origin:j(r[1],r[2])});case`rotate`:return D(`gesture rotate`,r),m({kind:n,degrees:Number(r[0]),origin:j(r[1],r[2])});case`transform`:{D(`gesture transform`,r);let{origin:e,delta:t}=O(r);return m({kind:n,origin:e,delta:t,scale:Number(r[4]),degrees:Number(r[5]),durationMs:A(r[6])})}case`drag`:return D(`gesture drag`,r),m({kind:n,source:r[0],destination:r[1],sourceHoldMs:A(r[2]),moveMs:A(r[3]),destinationHoldMs:A(r[4])});default:return m({kind:n})}}function ae(e){if(e[0]!==`drag`)return;let t=k(e);return t.kind===`drag`?t:void 0}function oe(e){switch(e.kind){case`pan`:return M([e.kind,e.origin.x,e.origin.y,e.delta.x,e.delta.y,e.durationMs]);case`fling`:return M([e.kind,e.direction,e.origin.x,e.origin.y,e.distance]);case`swipe`:return[e.kind,e.preset];case`pinch`:return M([e.kind,e.scale,e.origin?.x,e.origin?.y]);case`rotate`:return e.origin?M([e.kind,e.degrees,e.origin.x,e.origin.y]):[e.kind,String(e.degrees)];case`transform`:return M([e.kind,e.origin.x,e.origin.y,e.delta.x,e.delta.y,e.scale,e.degrees,e.durationMs]);case`drag`:return[e.kind,e.source,e.destination,String(e.sourceHoldMs??800),String(e.moveMs??500),String(e.destinationHoldMs??0)]}}function se(e,t={}){return D(`swipe`,e),{from:{x:Number(e[0]),y:Number(e[1])},to:{x:Number(e[2]),y:Number(e[3])},...t.count===void 0?{}:{count:t.count},...t.pauseMs===void 0?{}:{pauseMs:t.pauseMs},...t.pattern===void 0?{}:{pattern:t.pattern}}}function ce(t){switch(t.kind){case`pan`:return{gesture:{intent:`pan`,origin:t.origin,delta:t.delta,pointerCount:t.pointerCount,durationMs:t.durationMs}};case`fling`:return{gesture:{intent:`fling`,direction:t.direction,origin:t.origin,distance:t.distance}};case`swipe`:return{gesture:{intent:`fling`,preset:t.preset}};case`pinch`:return{gesture:{intent:`pinch`,origin:t.origin,scale:t.scale}};case`rotate`:return{gesture:{intent:`rotate`,origin:t.origin,degrees:t.degrees}};case`transform`:return{gesture:{intent:`transform`,origin:t.origin,delta:t.delta,scale:t.scale,degrees:t.degrees,durationMs:t.durationMs}};case`drag`:throw new e(`INVALID_ARGS`,`gesture drag targets must be resolved before coordinate normalization`)}}function le(e){return e.kind===`drag`?{intent:`drag`,source:e.source,destination:e.destination,sourceHoldMs:e.sourceHoldMs,moveMs:e.moveMs,destinationHoldMs:e.destinationHoldMs}:ce(e).gesture}function ue(e){return{gesture:{intent:`fling`,from:e.from,to:e.to}}}function A(e){return e===void 0?void 0:Number(e)}function j(t,n){if(t===void 0!=(n===void 0))throw new e(`INVALID_ARGS`,`gesture origin requires both x and y coordinates`);return t===void 0?void 0:{x:Number(t),y:Number(n)}}function M(e){return e.filter(e=>e!==void 0).map(String)}const de={ios:!0,android:!0,harmonyos:!0};function N(e){return typeof e==`string`&&Object.hasOwn(de,e)}function P(e){return e.startsWith(`@`)?t(e)?.base??e:e}const F=/^-?\d+(\.\d+)?$/,fe=/^[^\s"\\]+$/,pe=new Map([[`--count`,`count`],[`--interval-ms`,`intervalMs`],[`--hold-ms`,`holdMs`],[`--jitter-px`,`jitterPx`]]),me=new Map([[`--count`,`count`],[`--pause-ms`,`pauseMs`]]),he=new Map([[`--pointer-count`,`pointerCount`]]),ge=new Map([[`--delay-ms`,`delayMs`]]);function I(e){return e===`click`||e===`press`}function L(e){return I(e)||e===`longpress`||e===`hover`}function R(e){return e===`type`||e===`fill`}function z(e){return H(e,_e)}function B(e){return JSON.stringify(e)}function V(e){return H(e,U)}function H(e,t){return t(e)?e:B(e)}function _e(e){return U(e)&&e.startsWith(`@`)||F.test(e)}function U(e){return fe.test(e)}const ve=new Set([`fill`,`type`]);function ye(e){if(!ve.has(e.command)){let t=(e.positionals??[]).map(e=>z(e));return[e.command,...t].join(` `)}let t=be(e).map(e=>z(e)).join(` `);return[e.command,t,`<text>`].filter(e=>e.length>0).join(` `)}function be(e){if(e.command===`type`)return[];let t=e.positionals??[],n=t[0];return n===void 0?[]:n.startsWith(`@`)?[n]:t.length>=3&&F.test(n)&&F.test(t[1]??``)?[n,t[1]]:[n]}function W(e,t){let n=t.flags??{};if(I(t.command)){typeof n.count==`number`&&e.push(`--count`,String(n.count)),typeof n.intervalMs==`number`&&e.push(`--interval-ms`,String(n.intervalMs)),typeof n.holdMs==`number`&&e.push(`--hold-ms`,String(n.holdMs)),typeof n.jitterPx==`number`&&e.push(`--jitter-px`,String(n.jitterPx)),n.doubleTap===!0&&e.push(`--double-tap`);let t=n.clickButton;t&&t!==`primary`&&e.push(`--button`,t);return}if(t.command===`swipe`){typeof n.count==`number`&&e.push(`--count`,String(n.count)),typeof n.pauseMs==`number`&&e.push(`--pause-ms`,String(n.pauseMs)),(n.pattern===`one-way`||n.pattern===`ping-pong`)&&e.push(`--pattern`,n.pattern);return}if(t.command===`gesture`){typeof n.pointerCount==`number`&&e.push(`--pointer-count`,String(n.pointerCount));return}R(t.command)&&typeof n.delayMs==`number`&&e.push(`--delay-ms`,String(n.delayMs))}function G(e,t){t&&(N(t.platform)&&e.push(`--platform`,t.platform),typeof t.metroHost==`string`&&t.metroHost.length>0&&e.push(`--metro-host`,V(t.metroHost)),typeof t.metroPort==`number`&&e.push(`--metro-port`,String(t.metroPort)),typeof t.bundleUrl==`string`&&t.bundleUrl.length>0&&e.push(`--bundle-url`,V(t.bundleUrl)),typeof t.launchUrl==`string`&&t.launchUrl.length>0&&e.push(`--launch-url`,V(t.launchUrl)))}function xe(e,t){let[n,...r]=t.positionals??[];n&&e.push(V(n));for(let t of r)e.push(z(t));typeof t.flags?.fps==`number`&&e.push(`--fps`,String(t.flags.fps)),(typeof t.flags?.quality==`number`||typeof t.flags?.quality==`string`)&&e.push(`--quality`,String(t.flags.quality)),t.flags?.hideTouches&&e.push(`--hide-touches`)}function Se(e,t){t.flags?.snapshotInteractiveOnly&&e.push(`-i`),typeof t.flags?.snapshotDepth==`number`&&e.push(`-d`,String(t.flags.snapshotDepth)),t.flags?.snapshotScope&&e.push(`-s`,z(t.flags.snapshotScope)),t.flags?.snapshotRaw&&e.push(`--raw`)}function Ce(e,t){for(let n of t.positionals??[])e.push(z(n));let r=t.flags?.screenshotCropOn;typeof r==`string`&&r.length>0&&e.push(`--crop-on`,V(r)),n(e,t.flags)}function we(e,t,n={}){let r=t.positionals??[],i=n.includeAllPositionals?r:r.slice(0,1);for(let t of i)e.push(V(t));G(e,t.flags)}function Te(e,t){for(let n of t.positionals??[])e.push(z(t.command===`wait`?P(n):n));W(e,t)}function K(e,t){let n=[],r={},i=I(e)?pe:e===`swipe`?me:e===`gesture`?he:R(e)?ge:void 0;for(let a=0;a<t.length;a+=1){let o=t[a];if(I(e)&&o===`--double-tap`){r.doubleTap=!0;continue}let s=t[a+1];if(I(e)&&o===`--button`&&s!==void 0){let e=s;(e===`primary`||e===`secondary`||e===`middle`)&&(r.clickButton=e),a+=1;continue}let c=i?.get(o);if(c&&s!==void 0){let e=J(s);if(e!==null){r[c]=e,a+=1;continue}}if(e===`swipe`&&o===`--pattern`&&s!==void 0){let e=s;(e===`one-way`||e===`ping-pong`)&&(r.pattern=e),a+=1;continue}n.push(o)}return{positionals:n,flags:r}}function q(e){let t=[],n={};for(let r=0;r<e.length;r+=1){let i=e[r],a=e[r+1];if(i===`--platform`&&a!==void 0){let e=a;N(e)&&(n.platform=e),r+=1;continue}if(i===`--metro-host`&&a!==void 0){n.metroHost=a,r+=1;continue}if(i===`--metro-port`&&a!==void 0){let e=J(a);e!==null&&(n.metroPort=e),r+=1;continue}if(i===`--bundle-url`&&a!==void 0){n.bundleUrl=a,r+=1;continue}if(i===`--launch-url`&&a!==void 0){n.launchUrl=a,r+=1;continue}t.push(i)}return{positionals:t,flags:n}}function J(e){if(!e)return null;let t=Number(e);return!Number.isFinite(t)||t<0?null:Math.floor(t)}function Ee(e){let t;for(let n of e){if(n.command===`runtime`&&typeof n.flags.platform==`string`){t=n.flags.platform;continue}if(n.command===`open`)return n.runtime?.platform??t}return t}function De(e,t){for(let n of t.positionals??[])e.push(z(n));t.flags?.relaunch&&e.push(`--relaunch`),t.flags?.testIme===!0?e.push(`--test-ime`):t.flags?.testIme===!1&&e.push(`--no-test-ime`),G(e,t.runtime)}function Oe(e){let t=[],n={};for(let r of e){if(r===`--relaunch`){n.relaunch=!0;continue}if(r===`--test-ime`){n.testIme=!0;continue}if(r===`--no-test-ime`){n.testIme=!1;continue}t.push(r)}let r=q(t);return{positionals:r.positionals,flags:n,runtime:ke(r.flags)?r.flags:void 0}}function ke(e){return!!(e.platform||e.metroHost||e.metroPort!==void 0||e.bundleUrl||e.launchUrl)}const Y=/^[A-Z_][A-Z0-9_]*$/,Ae=new Set(o.filter(e=>e!==`web`)),je=new Set([`mobile`,`tv`,`desktop`]);function Me(t){let n=[],r=[],i=t.split(/\r?\n/),a=!1,o,l=(t,n,r)=>{let i=t.kind===`multiple`?`targets-v1`:`target-v1`;throw new e(`INVALID_ARGS`,`${i} annotation on line ${t.line} must be immediately followed by its action line (line ${n+1} ${r}).`)};for(let[t,u]of i.entries()){let i=u.trim();if(i.length===0){o&&l(o,t,`is blank`);continue}if(i.startsWith(`#`)){let e=c(i);if(e.kind===`v1`){o&&l(o,t,`is another target annotation`),o={kind:`multiple`,evidence:e.evidence,line:t+1};continue}let n=s(i);if(n.kind===`v1`){o&&l(o,t,`is another target annotation`),o={kind:`single`,evidence:n.evidence,line:t+1};continue}o&&l(o,t,`is a comment`);continue}if(X(i)){if(o&&l(o,t,`is an env directive`),a)throw new e(`INVALID_ARGS`,`env directives must precede all actions (line ${t+1}).`);continue}let d=Le(u);if(!d){o&&l(o,t,`did not parse as an action`);continue}let f=re(d.command,d.positionals??[],`line ${t+1}`);if(f)throw new e(`INVALID_ARGS`,f);o&&=(o.kind===`single`?d.targetEvidence=o.evidence:d.targetEvidences=o.evidence,void 0),n.push(d),r.push(t+1),a=!0}if(o){let t=o.kind===`multiple`?`targets-v1`:`target-v1`;throw new e(`INVALID_ARGS`,`${t} annotation on line ${o.line} must be immediately followed by its action line (end of script reached).`)}return{actions:n,actionLines:r}}function Ne(e){let t=e.split(/\r?\n/),n={};for(let[e,r]of t.entries()){let t=r.trim();if(t.length===0||t.startsWith(`#`))continue;if(X(t)){Ie(n,t,e+1);continue}if(!t.startsWith(`context `))break;let i=t.match(/(?:^|\s)platform=([^\s]+)/);if(i){let e=i[1];e&&Ae.has(e)&&Z(n,`platform`,e)}let a=t.match(/(?:^|\s)target=([^\s]+)/);if(a){let e=a[1];e&&je.has(e)&&Z(n,`target`,e)}let o=t.match(/(?:^|\s)timeout=(\d+)/);if(o){let e=Number(o[1]);Number.isFinite(e)&&e>=1&&Z(n,`timeoutMs`,Math.floor(e))}let s=t.match(/(?:^|\s)retries=(\d+)/);if(s){let e=Number(s[1]);Number.isFinite(e)&&e>=0&&Z(n,`retries`,Math.floor(e))}}return n}function X(e){return e===`env`||e.startsWith(`env `)||e.startsWith(`env `)}function Pe(t,n){let r=t.slice(3).replace(/^[\s]+/,``),i=r.indexOf(`=`);if(i<=0)throw new e(`INVALID_ARGS`,`Invalid env directive on line ${n}: expected "env KEY=VALUE".`);let a=r.slice(0,i);if(!Y.test(a))throw new e(`INVALID_ARGS`,`Invalid env key "${a}" on line ${n}: keys must be uppercase letters, digits, and underscores (e.g. APP_ID).`);if(a.startsWith(`AD_`))throw new e(`INVALID_ARGS`,`Invalid env key "${a}" on line ${n}: the AD_* namespace is reserved for built-in variables. Rename ${a} to avoid the AD_ prefix.`);return{key:a,value:Fe(r.slice(i+1),n)}}function Fe(t,n){if(t.length===0)return``;if(t.startsWith(`"`))try{let e=JSON.parse(t);if(typeof e!=`string`)throw Error(`not a string literal`);return e}catch{throw new e(`INVALID_ARGS`,`Invalid quoted env value on line ${n}.`)}return t}function Ie(t,n,r){let{key:i,value:a}=Pe(n,r),o=t.env??{};if(Object.prototype.hasOwnProperty.call(o,i))throw new e(`INVALID_ARGS`,`Duplicate env directive "${i}" on line ${r}.`);o[i]=a,t.env=o}function Z(t,n,r){let i=t[n];if(i!==void 0){let t=i===r?`Duplicate replay test metadata "${n}" in context header.`:`Conflicting replay test metadata "${n}" in context header: ${String(i)} vs ${String(r)}.`;throw new e(`INVALID_ARGS`,t)}t[n]=r}function Le(t){let n=t.trim();if(n.length===0||n.startsWith(`#`))return null;let[a,...o]=Re(n);if(a===void 0||a===`context`)return null;let s={ts:Date.now(),command:a,positionals:[],flags:{}};if(a===`snapshot`){s.positionals=[];for(let e=0;e<o.length;e+=1){let t=o[e];if(t===`-i`){s.flags.snapshotInteractiveOnly=!0;continue}if(t!==`-c`){if(t===`--raw`){s.flags.snapshotRaw=!0;continue}if(t===`--force-full`){s.flags.snapshotForceFull=!0;continue}if((t===`-d`||t===`--depth`)&&e+1<o.length){let t=Number(o[e+1]);Number.isFinite(t)&&t>=0&&(s.flags.snapshotDepth=Math.floor(t)),e+=1;continue}if((t===`-s`||t===`--scope`)&&e+1<o.length){s.flags.snapshotScope=o[e+1],e+=1;continue}if(t===`--backend`&&e+1<o.length){e+=1;continue}}}return s}if(a===`open`){let e=Oe(o);return s.positionals=e.positionals,Object.assign(s.flags,e.flags),s.runtime=e.runtime,s}if(a===`runtime`){let e=q(o);return s.positionals=e.positionals,Object.assign(s.flags,e.flags),s}if(I(a)){let e=K(a,o);Object.assign(s.flags,e.flags);let t=e.positionals[0];if(t===void 0)return s;if(t.startsWith(`@`))return s.positionals=[P(t)],e.positionals[1]&&(s.result={refLabel:e.positionals[1]}),s;let n=e.positionals[0],r=e.positionals[1];return $(n)&&$(r)&&e.positionals.length>=2?(s.positionals=[n,r],s):(s.positionals=[e.positionals.join(` `)],s)}if(a===`fill`){let e=K(a,o);if(Object.assign(s.flags,e.flags),!Q(e.positionals))return s.positionals=e.positionals,s;let[t,n,...r]=e.positionals;if($(t)&&$(n))return s.positionals=[t,n,r.join(` `)],s;let[i,c,...l]=e.positionals;if(i.startsWith(`@`)){let e=P(i);return l.length>0?(s.positionals=[e,l.join(` `)],s.result={refLabel:c},s):(s.positionals=[e,c],s)}return s.positionals=[i,[c,...l].join(` `)],s}if(a===`get`){let e=o[0],t=o[1];return e===void 0||t===void 0?(s.positionals=o,s):t.startsWith(`@`)?(s.positionals=[e,P(t)],o[2]&&(s.result={refLabel:o[2]}),s):(s.positionals=[e,o.slice(1).join(` `)],s)}if(a===`swipe`||a===`type`||a===`gesture`){let e=K(a,o);return Object.assign(s.flags,e.flags),s.positionals=e.positionals,s}if(a===`record`){let t=[];for(let n=0;n<o.length;n+=1){let r=o[n];if(r===i.cliToken)throw new e(`INVALID_ARGS`,i.migration.record);if(r===`--hide-touches`){s.flags.hideTouches=!0;continue}if(r===`--fps`&&n+1<o.length){let e=Number(o[n+1]);Number.isFinite(e)&&(s.flags.fps=Math.floor(e)),n+=1;continue}if(r===`--quality`&&n+1<o.length){let e=o[n+1],t=l(e);t!==void 0&&(s.flags.quality=t),n+=1;continue}t.push(r)}return s.positionals=t,s}if(a===`screenshot`){let e=[];for(let t=0;t<o.length;t+=1){let n=o[t],i=r({args:o,index:t,flags:s.flags});if(i.handled){t=i.nextIndex;continue}e.push(n)}return s.positionals=e,s}return s.positionals=a===`wait`||a===`longpress`||a===`hover`?o.map(e=>P(e)):o,s}function Q(e){return e.length>=2}function $(e){return e?!Number.isNaN(Number(e)):!1}function Re(e){let t=[],n=0;for(;n<e.length&&(n=ze(e,n),!(n>=e.length));){let r=e[n]===`"`?Be(e,n):Ve(e,n);t.push(r.value),n=r.nextCursor}return t}function ze(e,t){let n=t;for(;n<e.length&&/\s/.test(e.charAt(n));)n+=1;return n}function Be(t,n){let r=n+1,i=!1,a=r;for(;a<t.length;a+=1){let e=t.charAt(a);if(e===`"`&&!i)break;if(i){i=!1;continue}i=e===`\\`}if(a>=t.length)throw new e(`INVALID_ARGS`,`Invalid replay script line: ${t}`);let o=t.slice(n,a+1),s;try{s=JSON.parse(o)}catch{throw new e(`INVALID_ARGS`,`Invalid quoted value ${o} in replay script line: ${t}`,{hint:`Quoted replay values are JSON strings: escape backslashes, quotes, tabs, and newlines (\\\\, \\", \\t, \\n).`})}return{value:s,nextCursor:a+1}}function Ve(e,t){let n=t;for(;n<e.length&&!/\s/.test(e.charAt(n));)n+=1;return{value:e.slice(t,n),nextCursor:n}}export{ue as C,m as E,le as S,p as T,P as _,Ee as a,k as b,we as c,Se as d,ye as f,L as g,I as h,De as i,Ce as l,B as m,Me as n,Te as o,z as p,Ne as r,xe as s,Y as t,W as u,ne as v,se as w,oe as x,ae as y};
@@ -1 +1 @@
1
- import{C as e}from"./sdk-contracts.js";const t=1e4,n=.65;function r(e,t){return{...e,releaseBehavior:t===void 0?`controlled`:`inertial`}}function i(t,n=`scroll accepts either a relative amount or --pixels, not both`){if(t.amount!==void 0&&t.pixels!==void 0)throw new e(`INVALID_ARGS`,n)}function a(t){if(t.until!==void 0&&t.edge!==void 0)throw new e(`INVALID_ARGS`,`scroll ${t.edge} already scrolls to the ${t.edge} edge and cannot take --until`,{hint:`Use scroll ${t.edge===`bottom`?`down`:`up`} --until <selector> to stop at the target, or scroll ${t.edge} to reach the edge.`})}function o(t,n={}){if(t===void 0)return;let r=n.field??`scroll durationMs`,i=n.max??1e4,a=n.invalidMessage??`${r} must be a non-negative integer`;if(!Number.isFinite(t)||!Number.isInteger(t)||t<0)throw new e(`INVALID_ARGS`,a);if(t>i)throw new e(`INVALID_ARGS`,`${r} must be a non-negative integer at most ${i}`);return t}function s(e){return typeof e?.pixels==`number`?e.pixels:void 0}function c(e){return typeof e?.durationMs==`number`?e.durationMs:void 0}export{c as a,r as c,a as i,t as n,s as o,i as r,o as s,n as t};
1
+ import{D as e}from"./sdk-contracts.js";const t=1e4,n=.65;function r(e,t){return{...e,releaseBehavior:t===void 0?`controlled`:`inertial`}}function i(t,n=`scroll accepts either a relative amount or --pixels, not both`){if(t.amount!==void 0&&t.pixels!==void 0)throw new e(`INVALID_ARGS`,n)}function a(t){if(t.until!==void 0&&t.edge!==void 0)throw new e(`INVALID_ARGS`,`scroll ${t.edge} already scrolls to the ${t.edge} edge and cannot take --until`,{hint:`Use scroll ${t.edge===`bottom`?`down`:`up`} --until <selector> to stop at the target, or scroll ${t.edge} to reach the edge.`})}function o(t,n={}){if(t===void 0)return;let r=n.field??`scroll durationMs`,i=n.max??1e4,a=n.invalidMessage??`${r} must be a non-negative integer`;if(!Number.isFinite(t)||!Number.isInteger(t)||t<0)throw new e(`INVALID_ARGS`,a);if(t>i)throw new e(`INVALID_ARGS`,`${r} must be a non-negative integer at most ${i}`);return t}function s(e){return typeof e?.pixels==`number`?e.pixels:void 0}function c(e){return typeof e?.durationMs==`number`?e.durationMs:void 0}export{c as a,r as c,a as i,t as n,s as o,i as r,o as s,n as t};
@@ -1 +1 @@
1
- import{C as e}from"./sdk-contracts.js";import{Er as t}from"./sdk-batch.js";import{t as n}from"./string-enum.js";const r=[`up`,`down`,`left`,`right`,`top`,`bottom`],i=[`up`,`down`,`left`,`right`],a=[`left`,`right`,`left-edge`,`right-edge`],o=[`one-way`,`ping-pong`],s=1e4,c=6e4,l=n(i,{message:e=>`Unknown direction: ${e}`}),u=.6;function d(e){let t=e.direction,n=t===`up`||t===`down`?e.referenceHeight:e.referenceWidth,r=S(e.amount),i=e.pixels===void 0?Math.round(n*r):C(e.pixels),a=Math.max(1,Math.round(n*.1)),o=Math.max(1,n-a*2),s=Math.max(1,Math.min(i,o)),c=Math.round(s/2),l=Math.round(e.referenceWidth/2),u=Math.round(e.referenceHeight/2),d=(n,r,i,a)=>({direction:t,x1:n,y1:r,x2:i,y2:a,referenceWidth:e.referenceWidth,referenceHeight:e.referenceHeight,amount:e.amount,pixels:s});switch(t){case`up`:return d(l,u-c,l,u+c);case`down`:return d(l,u+c,l,u-c);case`left`:return d(l-c,u,l+c,u);case`right`:return d(l+c,u,l-c,u)}}function f(e){S(e.amount),e.pixels!==void 0&&C(e.pixels)}function p(e,t){if(e===`left`||e===`right`){let n=h(e,t);return{preset:e,x1:n.x1,y1:n.y1,x2:n.x2,y2:n.y2,referenceWidth:n.referenceWidth,referenceHeight:n.referenceHeight}}let[n,r]=e===`left-edge`?[99,15]:[1,85],i=v(_(t,n,50),t,8),a=v(_(t,r,50),t,8);return{preset:e,x1:i.x,y1:i.y,x2:a.x,y2:a.y,referenceWidth:t.referenceWidth,referenceHeight:t.referenceHeight}}function m(e,t){switch(e){case`up`:return{x:0,y:-t};case`down`:return{x:0,y:t};case`left`:return{x:-t,y:0};case`right`:return{x:t,y:0}}}function h(e,t){let n=e===`left`||e===`up`,r=n?85:15,i=n?15:85,a=e===`up`||e===`down`,o=v(_(t,a?50:r,a?r:50),t,8),s=v(_(t,a?50:i,a?i:50),t,8);return{direction:e,x1:o.x,y1:o.y,x2:s.x,y2:s.y,referenceWidth:t.referenceWidth,referenceHeight:t.referenceHeight}}function g(e){let t=b(e);if(t)return{referenceWidth:t.width,referenceHeight:t.height}}function _(e,t,n){let r=Math.trunc(e.referenceWidth*t/100),i=Math.trunc(e.referenceHeight*n/100);return{x:Number.isFinite(r)?r:0,y:Number.isFinite(i)?i:0}}function v(e,t,n){return{x:w(e.x,n,t.referenceWidth),y:w(e.y,n,t.referenceHeight)}}function y(e){return l.parse(e)}function b(e){let n=e.filter(e=>t(e)&&x(e.rect)).map(e=>e.rect).sort((e,t)=>(t?.width??0)*(t?.height??0)-(e?.width??0)*(e?.height??0))[0];if(n)return n;let r=e.map(e=>e.rect).filter(x);if(r.length===0)return;let i=Math.max(...r.map(e=>e.x+e.width)),a=Math.max(...r.map(e=>e.y+e.height));if(!(i<=0||a<=0))return{x:0,y:0,width:i,height:a}}function x(e){return!!e&&e.width>0&&e.height>0}function S(t){if(t===void 0)return u;if(!Number.isFinite(t)||t<=0)throw new e(`INVALID_ARGS`,`scroll amount must be a positive number`);return t}function C(t){if(!Number.isFinite(t)||t<=0)throw new e(`INVALID_ARGS`,`scroll pixels must be a positive integer`);return Math.max(1,Math.round(t))}function w(e,t,n){let r=Math.round(t);if(!Number.isFinite(r))return 0;let i=Math.max(r,Math.round(n-t));return!Number.isFinite(i)||!Number.isFinite(e)?r:Math.min(i,Math.max(r,Math.round(e)))}const T=Object.freeze({reason:`scroll_keyboard_occludes_surface`,hint:"The on-screen keyboard covers the surface this scroll would swipe, so it cannot reach it. Run `keyboard dismiss` and retry, accepting that it drops focus (re-tap the field to keep typing), or scroll before focusing the field."});function E(e,t){if(!O(e)||!O(t))return{kind:`unobstructed`};let n=e.x+e.width/2;if(n<t.x||n>=t.x+t.width)return{kind:`unobstructed`};let r=t.y;if(r>=e.y+e.height||t.y+t.height<=e.y)return{kind:`unobstructed`};let i=Math.max(0,r-12-e.y);return i<.15*e.height?{kind:`occluded`,keyboardMinY:r,visibleHeight:i}:{kind:`avoided`,viewport:{...e,height:i},keyboardMinY:r}}function D(t,n){return new e(`COMMAND_FAILED`,`scroll ${t} refused: the keyboard leaves ${n.visibleHeight}px of ${n.viewportHeight}px visible, below the 15% needed for a swipe`,{keyboardMinY:n.keyboardMinY,visibleHeight:n.visibleHeight,viewportHeight:n.viewportHeight,minVisibleFraction:.15,...T})}function O(e){return[e.x,e.y,e.width,e.height].every(e=>Number.isFinite(e))&&e.width>0&&e.height>0}export{D as _,o as a,c,d,p as f,y as g,g as h,T as i,f as l,m,i as n,s as o,E as p,r,a as s,u as t,h as u};
1
+ import{D as e}from"./sdk-contracts.js";import{Or as t}from"./sdk-batch.js";import{t as n}from"./string-enum.js";const r=[`up`,`down`,`left`,`right`,`top`,`bottom`],i=[`up`,`down`,`left`,`right`],a=[`left`,`right`,`left-edge`,`right-edge`],o=[`one-way`,`ping-pong`],s=1e4,c=6e4,l=n(i,{message:e=>`Unknown direction: ${e}`}),u=.6;function d(e){let t=e.direction,n=t===`up`||t===`down`?e.referenceHeight:e.referenceWidth,r=S(e.amount),i=e.pixels===void 0?Math.round(n*r):C(e.pixels),a=Math.max(1,Math.round(n*.1)),o=Math.max(1,n-a*2),s=Math.max(1,Math.min(i,o)),c=Math.round(s/2),l=Math.round(e.referenceWidth/2),u=Math.round(e.referenceHeight/2),d=(n,r,i,a)=>({direction:t,x1:n,y1:r,x2:i,y2:a,referenceWidth:e.referenceWidth,referenceHeight:e.referenceHeight,amount:e.amount,pixels:s});switch(t){case`up`:return d(l,u-c,l,u+c);case`down`:return d(l,u+c,l,u-c);case`left`:return d(l-c,u,l+c,u);case`right`:return d(l+c,u,l-c,u)}}function f(e){S(e.amount),e.pixels!==void 0&&C(e.pixels)}function p(e,t){if(e===`left`||e===`right`){let n=h(e,t);return{preset:e,x1:n.x1,y1:n.y1,x2:n.x2,y2:n.y2,referenceWidth:n.referenceWidth,referenceHeight:n.referenceHeight}}let[n,r]=e===`left-edge`?[99,15]:[1,85],i=v(_(t,n,50),t,8),a=v(_(t,r,50),t,8);return{preset:e,x1:i.x,y1:i.y,x2:a.x,y2:a.y,referenceWidth:t.referenceWidth,referenceHeight:t.referenceHeight}}function m(e,t){switch(e){case`up`:return{x:0,y:-t};case`down`:return{x:0,y:t};case`left`:return{x:-t,y:0};case`right`:return{x:t,y:0}}}function h(e,t){let n=e===`left`||e===`up`,r=n?85:15,i=n?15:85,a=e===`up`||e===`down`,o=v(_(t,a?50:r,a?r:50),t,8),s=v(_(t,a?50:i,a?i:50),t,8);return{direction:e,x1:o.x,y1:o.y,x2:s.x,y2:s.y,referenceWidth:t.referenceWidth,referenceHeight:t.referenceHeight}}function g(e){let t=b(e);if(t)return{referenceWidth:t.width,referenceHeight:t.height}}function _(e,t,n){let r=Math.trunc(e.referenceWidth*t/100),i=Math.trunc(e.referenceHeight*n/100);return{x:Number.isFinite(r)?r:0,y:Number.isFinite(i)?i:0}}function v(e,t,n){return{x:w(e.x,n,t.referenceWidth),y:w(e.y,n,t.referenceHeight)}}function y(e){return l.parse(e)}function b(e){let n=e.filter(e=>t(e)&&x(e.rect)).map(e=>e.rect).sort((e,t)=>(t?.width??0)*(t?.height??0)-(e?.width??0)*(e?.height??0))[0];if(n)return n;let r=e.map(e=>e.rect).filter(x);if(r.length===0)return;let i=Math.max(...r.map(e=>e.x+e.width)),a=Math.max(...r.map(e=>e.y+e.height));if(!(i<=0||a<=0))return{x:0,y:0,width:i,height:a}}function x(e){return!!e&&e.width>0&&e.height>0}function S(t){if(t===void 0)return u;if(!Number.isFinite(t)||t<=0)throw new e(`INVALID_ARGS`,`scroll amount must be a positive number`);return t}function C(t){if(!Number.isFinite(t)||t<=0)throw new e(`INVALID_ARGS`,`scroll pixels must be a positive integer`);return Math.max(1,Math.round(t))}function w(e,t,n){let r=Math.round(t);if(!Number.isFinite(r))return 0;let i=Math.max(r,Math.round(n-t));return!Number.isFinite(i)||!Number.isFinite(e)?r:Math.min(i,Math.max(r,Math.round(e)))}const T=Object.freeze({reason:`scroll_keyboard_occludes_surface`,hint:"The on-screen keyboard covers the surface this scroll would swipe, so it cannot reach it. Run `keyboard dismiss` and retry, accepting that it drops focus (re-tap the field to keep typing), or scroll before focusing the field."});function E(e,t){if(!O(e)||!O(t))return{kind:`unobstructed`};let n=e.x+e.width/2;if(n<t.x||n>=t.x+t.width)return{kind:`unobstructed`};let r=t.y;if(r>=e.y+e.height||t.y+t.height<=e.y)return{kind:`unobstructed`};let i=Math.max(0,r-12-e.y);return i<.15*e.height?{kind:`occluded`,keyboardMinY:r,visibleHeight:i}:{kind:`avoided`,viewport:{...e,height:i},keyboardMinY:r}}function D(t,n){return new e(`COMMAND_FAILED`,`scroll ${t} refused: the keyboard leaves ${n.visibleHeight}px of ${n.viewportHeight}px visible, below the 15% needed for a swipe`,{keyboardMinY:n.keyboardMinY,visibleHeight:n.visibleHeight,viewportHeight:n.viewportHeight,minVisibleFraction:.15,...T})}function O(e){return[e.x,e.y,e.width,e.height].every(e=>Number.isFinite(e))&&e.width>0&&e.height>0}export{D as _,o as a,c,d,p as f,y as g,g as h,T as i,f as l,m,i as n,s as o,E as p,r,a as s,u as t,h as u};
@@ -1,2 +1,2 @@
1
- import{C as e,a as t,i as n,w as r}from"./sdk-contracts.js";import{a as i,n as a,o,r as s}from"./sdk-batch.js";function c(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function l(t,n,r,i){let a=r(t[n]);if(a===void 0)throw new e(`COMMAND_FAILED`,i,{response:t});return a}function u(e,t,n){return n(e[t])}function d(e,t,n){let r=e[t];return r===null?null:n(r)}function f(e,t){return l(e,t,S,`Daemon response is missing "${t}".`)}function p(e,t){return u(e,t,S)}function m(e,t){return d(e,t,S)}function h(e,t){return l(e,t,C,`Daemon response is missing numeric "${t}".`)}function g(e,t){return l(e,t,w,`Daemon response has invalid "${t}".`)}function _(e,t){return l(e,t,T,`Daemon response has invalid "${t}".`)}function v(e,t){return u(e,t,E)??`mobile`}function y(e){if(!O(e))return;let t=x(e,`x`),n=x(e,`y`),r=x(e,`width`),i=x(e,`height`);if(t!==void 0&&n!==void 0&&r!==void 0&&i!==void 0)return{x:t,y:n,width:r,height:i}}function b(e){if(!O(e))return;let t=x(e,`x`),n=x(e,`y`);if(t!==void 0&&n!==void 0)return{x:t,y:n}}function x(e,t){let n=e[t];return typeof n==`number`?n:void 0}function S(e){return typeof e==`string`&&e.length>0?e:void 0}function C(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}function w(e){return e===`apple`?`ios`:e===`ios`||e===`macos`||e===`android`||e===`harmonyos`||e===`vega`||e===`linux`||e===`web`?e:void 0}function T(e){return e===`simulator`||e===`emulator`||e===`device`?e:void 0}function E(e){return e===`tv`||e===`mobile`||e===`desktop`?e:void 0}function D(t){if(!O(t))throw new e(`COMMAND_FAILED`,`Daemon returned an unexpected response shape.`,{value:t});return t}function O(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function k(e){return O(e)?e:void 0}function A(e){let t={};for(let[n,r]of Object.entries(e))r!==void 0&&(t[n]=r);return t}function j(e){return e.split(`
2
- `).map(e=>e.trim()).filter(e=>e.length>0)}function M(t,n,r={}){let i=t[n];if(i===void 0)return;if(!Number.isInteger(i))throw new e(`INVALID_ARGS`,`Expected ${n} to be an integer.`);let a=i;if(r.min!==void 0&&a<r.min)throw new e(`INVALID_ARGS`,`Expected ${n} to be at least ${r.min}.`);if(r.max!==void 0&&a>r.max)throw new e(`INVALID_ARGS`,`Expected ${n} to be at most ${r.max}.`);return a}function N(t,n,r={}){let i=t[n];if(i!==void 0){if(typeof i!=`number`||!Number.isFinite(i))throw new e(`INVALID_ARGS`,`Expected ${n} to be a finite number.`);if(r.min!==void 0&&i<r.min)throw new e(`INVALID_ARGS`,`Expected ${n} to be at least ${r.min}.`);if(r.max!==void 0&&i>r.max)throw new e(`INVALID_ARGS`,`Expected ${n} to be at most ${r.max}.`);return i}}function P(e){return Number.isInteger(e)&&e>=1&&e<=1e3}function F(t,n){if(t>n)throw new e(`INVALID_ARGS`,`batch has ${t} steps; max allowed is ${n}.`)}const I=`Each batch step is {"command":"<name>","input":{...}}, where input is that command's own structured input object, keyed by field name. There is no positional step form: args, argv, positionals, and flags are not step fields.`;function L(t,n,r=I){if(!c(t))throw new e(`INVALID_ARGS`,`Invalid batch step ${n}.`,{hint:r});return t}function R(t,n,r=I){let i=t.input;if(!c(i))throw new e(`INVALID_ARGS`,`Batch step ${n} input must be an object.`,{hint:r});return i}function z(t,r){if(t!==void 0)try{return n.parse(t)}catch(t){throw new e(`INVALID_ARGS`,`Batch step ${r} runtime is invalid: ${t instanceof Error?t.message:String(t)}`)}}function B(e){let t=e.trim();if(!t||/\s/.test(t))return!1;let n=/^([A-Za-z][A-Za-z0-9+.-]*):(.+)$/.exec(t);if(!n)return!1;let r=n[1]?.toLowerCase(),i=n[2]??``;return r===`http`||r===`https`||r===`ws`||r===`wss`||r===`ftp`||r===`ftps`?i.startsWith(`//`):!0}function V(e){let t=e.trim().split(`:`)[0]?.toLowerCase();return t===`http`||t===`https`}function H(e,t){let n=e?.trim();if(n)return n;if(V(t))return`com.apple.mobilesafari`}const U=new Set(a);async function W(e,t,n){let i=Z(e.flags),a=i?.batchOnError??`stop`;if(a!==`stop`)return Q(`INVALID_ARGS`,`Unsupported batch on-error mode: ${a}.`);let o=i?.batchMaxSteps??100;if(!P(o))return Q(`INVALID_ARGS`,`Invalid batch max-steps: ${String(i?.batchMaxSteps)}`);try{let r=G(i?.batchSteps,o),a=Date.now(),s=[];for(let[i,a]of r.entries()){let o=await X(e,t,a,n,{stepNumber:i+1,totalSteps:r.length,remainingSteps:r.slice(i+1).map(e=>({command:e.command,positionals:e.positionals,flags:e.flags,...e.input===void 0?{}:{input:e.input}}))});if(!o.ok)return{ok:!1,error:{code:o.error.code,message:`Batch failed at step ${o.step} (${a.command}): ${o.error.message}`,hint:o.error.hint,diagnosticId:o.error.diagnosticId,logPath:o.error.logPath,...o.error.retriable===void 0?{}:{retriable:o.error.retriable},...o.error.supportedOn===void 0?{}:{supportedOn:o.error.supportedOn},details:{...o.error.details??{},step:o.step,command:a.command,positionals:a.positionals,executed:i,total:r.length,partialResults:s}}};s.push(o.result)}return{ok:!0,data:{total:r.length,executed:r.length,totalDurationMs:Date.now()-a,results:s}}}catch(e){let t=r(e);return Q(t.code,t.message,t.details)}}function G(t,n){if(!Array.isArray(t)||t.length===0)throw new e(`INVALID_ARGS`,`batch requires a non-empty batchSteps array.`);F(t.length,n);let r=[];for(let n=0;n<t.length;n+=1){let a=t[n];if(!O(a))throw new e(`INVALID_ARGS`,`Invalid batch step at index ${n}.`);let s=Object.keys(a).filter(e=>!U.has(e));if(s.length>0){let t=s.map(e=>`"${e}"`).join(`, `);throw new e(`INVALID_ARGS`,`Batch step ${n+1} has unknown field(s): ${t}. Allowed fields: command, positionals, input, flags, runtime.`)}let c=o(a.command);if(!c)throw new e(`INVALID_ARGS`,`Batch step ${n+1} requires command.`);if(i(c,n+1),a.positionals!==void 0&&!Array.isArray(a.positionals))throw new e(`INVALID_ARGS`,`Batch step ${n+1} positionals must be an array.`);let l=a.positionals??[];if(l.some(e=>typeof e!=`string`))throw new e(`INVALID_ARGS`,`Batch step ${n+1} positionals must contain only strings.`);if(a.flags!==void 0&&!O(a.flags))throw new e(`INVALID_ARGS`,`Batch step ${n+1} flags must be an object.`);if(a.input!==void 0&&!O(a.input))throw new e(`INVALID_ARGS`,`Batch step ${n+1} input must be an object.`);r.push({command:c,positionals:l,input:a.input,flags:a.flags??{},runtime:z(a.runtime,n+1)})}return r}function K(e,t){let{batchSteps:n,batchOnError:r,batchMaxSteps:i,...a}=t??{};return q(Z(e),a)}function q(e,t){let n=Z(e)??{},r=t;for(let e of s)r[e]===void 0&&n[e]!==void 0&&(r[e]=n[e]);return t}function J(e,n){return t(e)?n?e:`digest`:e}function Y(e,t){let n=e?.responseLevel,r=J(n,t);return r===n?e:{...e,responseLevel:r}}async function X(e,t,n,r,i){let{stepNumber:a,totalSteps:o}=i,s=a===o,c=Date.now(),l=K(e.flags,n.flags);l.session===void 0&&(l.session=t);let u=await r({token:e.token,session:t,command:n.command,positionals:n.positionals,input:n.input,flags:l,runtime:n.runtime===void 0?e.runtime:n.runtime,meta:Y(e.meta,s)},i),d=Date.now()-c;return u.ok?{ok:!0,step:a,result:{step:a,command:n.command,ok:!0,data:u.data??{},durationMs:d}}:{ok:!1,step:a,error:u.error}}function Z(e){return e}function Q(e,t,n){return{ok:!1,error:{code:e,message:t,...n?{details:n}:{}}}}export{h as C,A as D,j as E,c as O,_ as S,f as T,b as _,H as a,m as b,P as c,L as d,M as f,O as g,D as h,V as i,z as l,k as m,W as n,I as o,N as p,B as r,F as s,q as t,R as u,y as v,g as w,p as x,v as y};
1
+ import{D as e,O as t,a as n,s as r}from"./sdk-contracts.js";import{a as i,n as a,o,r as s}from"./sdk-batch.js";function c(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function l(t,n,r,i){let a=r(t[n]);if(a===void 0)throw new e(`COMMAND_FAILED`,i,{response:t});return a}function u(e,t,n){return n(e[t])}function d(e,t,n){let r=e[t];return r===null?null:n(r)}function f(e,t){return l(e,t,C,`Daemon response is missing "${t}".`)}function p(e,t){return u(e,t,C)}function m(e,t){return d(e,t,C)}function h(e,t){return l(e,t,w,`Daemon response is missing numeric "${t}".`)}function g(e,t){return l(e,t,T,`Daemon response has invalid "${t}".`)}function _(e,t){return l(e,t,E,`Daemon response has invalid "${t}".`)}function v(e,t){return u(e,t,D)??`mobile`}function y(e){if(!k(e))return;let t=S(e,`x`),n=S(e,`y`),r=S(e,`width`),i=S(e,`height`);if(t!==void 0&&n!==void 0&&r!==void 0&&i!==void 0)return{x:t,y:n,width:r,height:i}}function b(e){if(e!==void 0){if(!k(e))return{kind:`unmeasurable`,reason:`malformed-fact`};if(e.kind===`absent`)return{kind:`absent`};if(e.kind===`unmeasurable`)return typeof e.reason==`string`&&e.reason.trim().length>0?{kind:`unmeasurable`,reason:e.reason}:{kind:`unmeasurable`,reason:`unreported-reason`};if(e.kind===`visible`){let t=y(e.frame);return t!==void 0&&[t.x,t.y,t.width,t.height].every(Number.isFinite)&&t.width>0&&t.height>0?{kind:`visible`,frame:t}:{kind:`unmeasurable`,reason:`invalid-visible-frame`}}return{kind:`unmeasurable`,reason:`unrecognized-kind`}}}function x(e){if(!k(e))return;let t=S(e,`x`),n=S(e,`y`);if(t!==void 0&&n!==void 0)return{x:t,y:n}}function S(e,t){let n=e[t];return typeof n==`number`?n:void 0}function C(e){return typeof e==`string`&&e.length>0?e:void 0}function w(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}function T(e){return e===`apple`?`ios`:e===`ios`||e===`macos`||e===`android`||e===`harmonyos`||e===`vega`||e===`linux`||e===`web`?e:void 0}function E(e){return e===`simulator`||e===`emulator`||e===`device`?e:void 0}function D(e){return e===`tv`||e===`mobile`||e===`desktop`?e:void 0}function O(t){if(!k(t))throw new e(`COMMAND_FAILED`,`Daemon returned an unexpected response shape.`,{value:t});return t}function k(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function A(e){return k(e)?e:void 0}function j(e){let t={};for(let[n,r]of Object.entries(e))r!==void 0&&(t[n]=r);return t}function M(e){return e.split(`
2
+ `).map(e=>e.trim()).filter(e=>e.length>0)}function N(t,n,r={}){let i=t[n];if(i===void 0)return;if(!Number.isInteger(i))throw new e(`INVALID_ARGS`,`Expected ${n} to be an integer.`);let a=i;if(r.min!==void 0&&a<r.min)throw new e(`INVALID_ARGS`,`Expected ${n} to be at least ${r.min}.`);if(r.max!==void 0&&a>r.max)throw new e(`INVALID_ARGS`,`Expected ${n} to be at most ${r.max}.`);return a}function P(t,n,r={}){let i=t[n];if(i!==void 0){if(typeof i!=`number`||!Number.isFinite(i))throw new e(`INVALID_ARGS`,`Expected ${n} to be a finite number.`);if(r.min!==void 0&&i<r.min)throw new e(`INVALID_ARGS`,`Expected ${n} to be at least ${r.min}.`);if(r.max!==void 0&&i>r.max)throw new e(`INVALID_ARGS`,`Expected ${n} to be at most ${r.max}.`);return i}}function F(e){return Number.isInteger(e)&&e>=1&&e<=1e3}function I(t,n){if(t>n)throw new e(`INVALID_ARGS`,`batch has ${t} steps; max allowed is ${n}.`)}const L=`Each batch step is {"command":"<name>","input":{...}}, where input is that command's own structured input object, keyed by field name. There is no positional step form: args, argv, positionals, and flags are not step fields.`;function R(t,n,r=L){if(!c(t))throw new e(`INVALID_ARGS`,`Invalid batch step ${n}.`,{hint:r});return t}function z(t,n,r=L){let i=t.input;if(!c(i))throw new e(`INVALID_ARGS`,`Batch step ${n} input must be an object.`,{hint:r});return i}function B(t,r){if(t!==void 0)try{return n.parse(t)}catch(t){throw new e(`INVALID_ARGS`,`Batch step ${r} runtime is invalid: ${t instanceof Error?t.message:String(t)}`)}}function V(e){let t=e.trim();if(!t||/\s/.test(t))return!1;let n=/^([A-Za-z][A-Za-z0-9+.-]*):(.+)$/.exec(t);if(!n)return!1;let r=n[1]?.toLowerCase(),i=n[2]??``;return r===`http`||r===`https`||r===`ws`||r===`wss`||r===`ftp`||r===`ftps`?i.startsWith(`//`):!0}function H(e){let t=e.trim().split(`:`)[0]?.toLowerCase();return t===`http`||t===`https`}function U(e,t){let n=e?.trim();if(n)return n;if(H(t))return`com.apple.mobilesafari`}const W=new Set(a);async function G(e,n,r){let i=Q(e.flags),a=i?.batchOnError??`stop`;if(a!==`stop`)return $(`INVALID_ARGS`,`Unsupported batch on-error mode: ${a}.`);let o=i?.batchMaxSteps??100;if(!F(o))return $(`INVALID_ARGS`,`Invalid batch max-steps: ${String(i?.batchMaxSteps)}`);try{let t=K(i?.batchSteps,o),a=Date.now(),s=[];for(let[i,a]of t.entries()){let o=await Z(e,n,a,r,{stepNumber:i+1,totalSteps:t.length,remainingSteps:t.slice(i+1).map(e=>({command:e.command,positionals:e.positionals,flags:e.flags,...e.input===void 0?{}:{input:e.input}}))});if(!o.ok)return{ok:!1,error:{code:o.error.code,message:`Batch failed at step ${o.step} (${a.command}): ${o.error.message}`,hint:o.error.hint,diagnosticId:o.error.diagnosticId,logPath:o.error.logPath,...o.error.retriable===void 0?{}:{retriable:o.error.retriable},...o.error.supportedOn===void 0?{}:{supportedOn:o.error.supportedOn},details:{...o.error.details??{},step:o.step,command:a.command,positionals:a.positionals,executed:i,total:t.length,partialResults:s}}};s.push(o.result)}return{ok:!0,data:{total:t.length,executed:t.length,totalDurationMs:Date.now()-a,results:s}}}catch(e){let n=t(e);return $(n.code,n.message,n.details)}}function K(t,n){if(!Array.isArray(t)||t.length===0)throw new e(`INVALID_ARGS`,`batch requires a non-empty batchSteps array.`);I(t.length,n);let r=[];for(let n=0;n<t.length;n+=1){let a=t[n];if(!k(a))throw new e(`INVALID_ARGS`,`Invalid batch step at index ${n}.`);let s=Object.keys(a).filter(e=>!W.has(e));if(s.length>0){let t=s.map(e=>`"${e}"`).join(`, `);throw new e(`INVALID_ARGS`,`Batch step ${n+1} has unknown field(s): ${t}. Allowed fields: command, positionals, input, flags, runtime.`)}let c=o(a.command);if(!c)throw new e(`INVALID_ARGS`,`Batch step ${n+1} requires command.`);if(i(c,n+1),a.positionals!==void 0&&!Array.isArray(a.positionals))throw new e(`INVALID_ARGS`,`Batch step ${n+1} positionals must be an array.`);let l=a.positionals??[];if(l.some(e=>typeof e!=`string`))throw new e(`INVALID_ARGS`,`Batch step ${n+1} positionals must contain only strings.`);if(a.flags!==void 0&&!k(a.flags))throw new e(`INVALID_ARGS`,`Batch step ${n+1} flags must be an object.`);if(a.input!==void 0&&!k(a.input))throw new e(`INVALID_ARGS`,`Batch step ${n+1} input must be an object.`);r.push({command:c,positionals:l,input:a.input,flags:a.flags??{},runtime:B(a.runtime,n+1)})}return r}function q(e,t){let{batchSteps:n,batchOnError:r,batchMaxSteps:i,...a}=t??{};return J(Q(e),a)}function J(e,t){let n=Q(e)??{},r=t;for(let e of s)r[e]===void 0&&n[e]!==void 0&&(r[e]=n[e]);return t}function Y(e,t){return r(e)?t?e:`digest`:e}function X(e,t){let n=e?.responseLevel,r=Y(n,t);return r===n?e:{...e,responseLevel:r}}async function Z(e,t,n,r,i){let{stepNumber:a,totalSteps:o}=i,s=a===o,c=Date.now(),l=q(e.flags,n.flags);l.session===void 0&&(l.session=t);let u=await r({token:e.token,session:t,command:n.command,positionals:n.positionals,input:n.input,flags:l,runtime:n.runtime===void 0?e.runtime:n.runtime,meta:X(e.meta,s)},i),d=Date.now()-c;return u.ok?{ok:!0,step:a,result:{step:a,command:n.command,ok:!0,data:u.data??{},durationMs:d}}:{ok:!1,step:a,error:u.error}}function Q(e){return e}function $(e,t,n){return{ok:!1,error:{code:e,message:t,...n?{details:n}:{}}}}export{h as C,M as D,b as E,j as O,_ as S,f as T,x as _,U as a,m as b,F as c,R as d,N as f,k as g,O as h,H as i,c as k,B as l,A as m,G as n,L as o,P as p,V as r,I as s,J as t,z as u,y as v,g as w,p as x,v as y};