agent-device 0.21.13 → 0.21.14

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 (244) hide show
  1. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.13.apk → agent-device-android-ime-helper-0.21.14.apk} +0 -0
  2. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.14.apk.sha256 +1 -0
  3. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.13.manifest.json → agent-device-android-ime-helper-0.21.14.manifest.json} +4 -4
  4. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.14.apk +0 -0
  5. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.14.apk.sha256 +1 -0
  6. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.13.manifest.json → agent-device-android-snapshot-helper-0.21.14.manifest.json} +6 -6
  7. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +23 -0
  8. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AXSnapshotFallback.swift +12 -19
  9. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Alert.swift +19 -15
  10. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AlertObservation.swift +2 -3
  11. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +16 -20
  12. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+GestureExecution.swift +8 -13
  13. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Navigation.swift +16 -19
  14. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScrollDragExecution.swift +8 -24
  15. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SequenceExecution.swift +20 -42
  16. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Snapshot.swift +7 -14
  17. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotAcquisition.swift +17 -17
  18. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCapturePlan.swift +2 -3
  19. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedGesturePolicy.swift +48 -19
  20. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedInteraction.swift +0 -1
  21. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedTextEntry.swift +0 -7
  22. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TypeExecution.swift +7 -14
  23. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotCoordinateSpace.swift +16 -19
  24. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotGeometry.swift +21 -9
  25. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotModels.swift +59 -10
  26. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentationInvariant.swift +12 -10
  27. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotVisibilityFold.swift +13 -8
  28. package/dist/src/absence-observation-errors.js +1 -1
  29. package/dist/src/adapter.js +1 -1
  30. package/dist/src/adb-executor.js +1 -1
  31. package/dist/src/adb-failure.js +1 -1
  32. package/dist/src/adb-transport.js +1 -1
  33. package/dist/src/agent-browser-provider.js +1 -1
  34. package/dist/src/agent-browser-tool.js +1 -1
  35. package/dist/src/agent-device-client.js +2 -2
  36. package/dist/src/ai-sdk.js +1 -1
  37. package/dist/src/alert-runtime.js +1 -1
  38. package/dist/src/app-catalog.js +1 -1
  39. package/dist/src/app-deployment-resolution.js +1 -1
  40. package/dist/src/app-inventory.js +1 -1
  41. package/dist/src/app-launch.js +1 -1
  42. package/dist/src/app-lifecycle.js +1 -1
  43. package/dist/src/app-lifecycle2.js +1 -1
  44. package/dist/src/app-log-files.js +1 -1
  45. package/dist/src/app-log-runtime2.js +1 -1
  46. package/dist/src/app-resolution.js +2 -2
  47. package/dist/src/apple-runner-platform.js +1 -1
  48. package/dist/src/application-lifecycle-interaction.js +1 -1
  49. package/dist/src/archive.js +1 -1
  50. package/dist/src/artifact-download.js +1 -1
  51. package/dist/src/auth-session.js +1 -1
  52. package/dist/src/auth.js +1 -1
  53. package/dist/src/backend-snapshot-options.js +1 -1
  54. package/dist/src/boot-diagnostics.js +1 -1
  55. package/dist/src/capture-disclosure.js +1 -1
  56. package/dist/src/capture.js +1 -1
  57. package/dist/src/cli-config.js +1 -1
  58. package/dist/src/cli-help.js +2 -2
  59. package/dist/src/cli.js +4 -4
  60. package/dist/src/click-button.js +1 -1
  61. package/dist/src/client-metro.js +1 -1
  62. package/dist/src/clipboard-shell-response.js +1 -1
  63. package/dist/src/command-schema.js +1 -1
  64. package/dist/src/command-tools.js +2 -2
  65. package/dist/src/connection-runtime.js +1 -1
  66. package/dist/src/connection.js +1 -1
  67. package/dist/src/contracts.js +1 -1
  68. package/dist/src/daemon-client-lifecycle.js +1 -1
  69. package/dist/src/daemon.js +1 -1
  70. package/dist/src/debug-symbols-facade.js +1 -1
  71. package/dist/src/device-claim-rule.js +2 -2
  72. package/dist/src/device-inventory-context.js +1 -1
  73. package/dist/src/device-rotation.js +1 -1
  74. package/dist/src/device-selection-resolver.js +1 -1
  75. package/dist/src/device-session.js +1 -1
  76. package/dist/src/device-shell.js +1 -1
  77. package/dist/src/device2.js +1 -1
  78. package/dist/src/devicectl.js +1 -1
  79. package/dist/src/diagnostics.js +1 -1
  80. package/dist/src/dispatch-resolve.js +1 -1
  81. package/dist/src/doctor2.js +1 -1
  82. package/dist/src/engine-eval-script.js +1 -1
  83. package/dist/src/error.js +1 -1
  84. package/dist/src/exec.js +1 -1
  85. package/dist/src/file.js +1 -1
  86. package/dist/src/find.js +1 -1
  87. package/dist/src/format.js +1 -1
  88. package/dist/src/gesture-plan.js +1 -1
  89. package/dist/src/gesture-runtime.js +1 -1
  90. package/dist/src/harmonyos.js +1 -1
  91. package/dist/src/helper.js +1 -1
  92. package/dist/src/human-control-contract.js +1 -1
  93. package/dist/src/human-control.js +1 -1
  94. package/dist/src/index.js +1 -1
  95. package/dist/src/input-actions.js +1 -1
  96. package/dist/src/input-actions2.js +1 -1
  97. package/dist/src/install-artifact-facade.js +1 -1
  98. package/dist/src/install-source-network-transport.js +1 -1
  99. package/dist/src/install-source2.js +1 -1
  100. package/dist/src/interaction-positionals.js +1 -1
  101. package/dist/src/interaction-ref-policy.js +1 -1
  102. package/dist/src/interaction2.js +1 -1
  103. package/dist/src/interactor-operation-binding.js +1 -1
  104. package/dist/src/interactor.js +1 -1
  105. package/dist/src/interactor2.js +1 -1
  106. package/dist/src/interactors.js +1 -1
  107. package/dist/src/internal/bin.js +1 -1
  108. package/dist/src/internal/daemon.js +2 -2
  109. package/dist/src/internal/png-worker.js +1 -1
  110. package/dist/src/internal/run-script-http-child.js +1 -1
  111. package/dist/src/inventory.js +1 -1
  112. package/dist/src/inventory2.js +1 -1
  113. package/dist/src/inventory3.js +1 -1
  114. package/dist/src/inventory5.js +1 -1
  115. package/dist/src/ios-snapshot-runtime.js +1 -1
  116. package/dist/src/lease.js +1 -1
  117. package/dist/src/limrun-download-file.js +1 -1
  118. package/dist/src/limrun-runtime-dependencies.js +1 -1
  119. package/dist/src/linux.js +1 -1
  120. package/dist/src/location-coordinates.js +1 -1
  121. package/dist/src/managed-device-scope.js +1 -1
  122. package/dist/src/mechanics.js +5 -5
  123. package/dist/src/multitouch-support.js +1 -1
  124. package/dist/src/native-build-cache.js +1 -0
  125. package/dist/src/observation.js +1 -1
  126. package/dist/src/parameterized-recorded-fill.js +1 -1
  127. package/dist/src/perf-facade.js +1 -1
  128. package/dist/src/perf-runtime-operation-builder.js +1 -1
  129. package/dist/src/perf-runtime-plan.js +1 -1
  130. package/dist/src/perf-target.js +2 -2
  131. package/dist/src/perf.js +1 -1
  132. package/dist/src/physical-device-control.js +1 -1
  133. package/dist/src/platform-runtime-host.js +1 -1
  134. package/dist/src/platform-runtime-managed-owner.js +1 -1
  135. package/dist/src/platform-runtime-open-target.js +1 -1
  136. package/dist/src/platform-runtime-operation-host.js +2 -2
  137. package/dist/src/platform-runtime-runtime-hints.js +1 -1
  138. package/dist/src/platform-runtime-screen-recording-apple-simulator-host.js +1 -1
  139. package/dist/src/platform-runtime-screen-recording-finalizer-host.js +1 -1
  140. package/dist/src/platform-runtime-screen-recording-process-host.js +1 -1
  141. package/dist/src/platform-runtime.js +1 -1
  142. package/dist/src/platform-runtime2.js +1 -1
  143. package/dist/src/png-crop-bytes.js +1 -1
  144. package/dist/src/png-size.js +1 -1
  145. package/dist/src/png-worker-client.js +1 -1
  146. package/dist/src/png.js +1 -1
  147. package/dist/src/prepare-kind.js +1 -1
  148. package/dist/src/provider-session-ownership.js +1 -1
  149. package/dist/src/provider-webdriver.js +1 -1
  150. package/dist/src/proxy.js +1 -1
  151. package/dist/src/quality-warnings.js +1 -1
  152. package/dist/src/react-native.js +1 -1
  153. package/dist/src/record-runtime.js +1 -1
  154. package/dist/src/recording.js +1 -1
  155. package/dist/src/register-builtins.js +1 -1
  156. package/dist/src/registry.js +13 -13
  157. package/dist/src/remote-config2.js +1 -1
  158. package/dist/src/replay-divergence.js +1 -1
  159. package/dist/src/replay.js +1 -1
  160. package/dist/src/reporting.js +1 -1
  161. package/dist/src/request-admission.js +1 -1
  162. package/dist/src/request-cancel.js +1 -1
  163. package/dist/src/request-runtime-binding.js +1 -1
  164. package/dist/src/retry.js +1 -1
  165. package/dist/src/runner-cache-metadata.js +1 -1
  166. package/dist/src/runner-client.js +1 -1
  167. package/dist/src/runner-dev-tools-security.js +1 -1
  168. package/dist/src/runner-device-readiness.js +1 -1
  169. package/dist/src/runner-disposal.js +1 -1
  170. package/dist/src/runner-error-classification.js +2 -2
  171. package/dist/src/runner.js +1 -1
  172. package/dist/src/runtime-transport-hints.js +1 -1
  173. package/dist/src/runtime.js +3 -3
  174. package/dist/src/runtime10.js +2 -2
  175. package/dist/src/runtime2.js +1 -1
  176. package/dist/src/runtime3.js +1 -1
  177. package/dist/src/runtime4.js +5 -5
  178. package/dist/src/runtime5.js +1 -1
  179. package/dist/src/runtime6.js +1 -1
  180. package/dist/src/runtime7.js +1 -1
  181. package/dist/src/runtime8.js +1 -1
  182. package/dist/src/runtime9.js +1 -1
  183. package/dist/src/screen-recording-admission-ledger.js +1 -1
  184. package/dist/src/screen-recording-completion.js +1 -1
  185. package/dist/src/screen-recording-options.js +1 -1
  186. package/dist/src/screen-recording-resource-recovery.js +1 -1
  187. package/dist/src/screenshot-density.js +1 -1
  188. package/dist/src/screenshot-image.js +1 -1
  189. package/dist/src/screenshot-runtime.js +1 -1
  190. package/dist/src/screenshot.js +1 -1
  191. package/dist/src/screenshot3.js +1 -1
  192. package/dist/src/script.js +1 -1
  193. package/dist/src/scroll-command.js +1 -1
  194. package/dist/src/scroll-gesture.js +1 -1
  195. package/dist/src/sdk-batch-runner.js +2 -2
  196. package/dist/src/sdk-batch.js +2 -2
  197. package/dist/src/sdk-contracts.d.ts +21 -2
  198. package/dist/src/sdk-contracts.js +1 -1
  199. package/dist/src/sdk-device.js +1 -1
  200. package/dist/src/sdk-io.js +1 -1
  201. package/dist/src/sdk-remote-config.js +1 -1
  202. package/dist/src/selector-runtime.js +1 -1
  203. package/dist/src/server.js +1 -1
  204. package/dist/src/session-allocation.js +1 -1
  205. package/dist/src/session-routing.js +1 -1
  206. package/dist/src/session-runtime-admission.js +1 -1
  207. package/dist/src/session-snapshot.js +1 -1
  208. package/dist/src/session-store.js +2 -2
  209. package/dist/src/session2.js +3 -3
  210. package/dist/src/settings.js +1 -1
  211. package/dist/src/simctl.js +1 -1
  212. package/dist/src/simulator-state.js +1 -1
  213. package/dist/src/simulator.js +1 -1
  214. package/dist/src/snapshot-runtime-binding.js +1 -1
  215. package/dist/src/snapshot-runtime.js +1 -1
  216. package/dist/src/snapshot-state.js +1 -1
  217. package/dist/src/snapshot2.js +1 -1
  218. package/dist/src/snapshot3.js +1 -1
  219. package/dist/src/snapshot4.js +1 -1
  220. package/dist/src/src.js +1 -1
  221. package/dist/src/src7.js +1 -1
  222. package/dist/src/src8.js +2 -2
  223. package/dist/src/string-enum.js +1 -1
  224. package/dist/src/takeover.js +1 -1
  225. package/dist/src/text-entry-focus.js +1 -1
  226. package/dist/src/tool-provider-facade.js +1 -1
  227. package/dist/src/tool-provider.js +2 -2
  228. package/dist/src/tool-provider2.js +1 -1
  229. package/dist/src/touch-runtime.js +1 -1
  230. package/dist/src/transport.js +1 -1
  231. package/dist/src/tv-remote.js +1 -1
  232. package/dist/src/type-text-runtime.js +1 -1
  233. package/dist/src/verified-file.js +1 -1
  234. package/dist/src/video.js +1 -1
  235. package/dist/src/viewport.js +1 -1
  236. package/dist/src/web.js +1 -1
  237. package/dist/src/web2.js +1 -1
  238. package/dist/src/webdriver-source.js +1 -1
  239. package/package.json +1 -1
  240. package/server.json +2 -2
  241. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.13.apk.sha256 +0 -1
  242. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.13.apk +0 -0
  243. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.13.apk.sha256 +0 -1
  244. package/dist/src/snapshot-process.js +0 -1
@@ -1 +1 @@
1
- import{C as e,D as t,O as n,T as r,d as i,h as a,o,u as s}from"./sdk-contracts.js";import{b as c,d as l}from"./sdk-device.js";import{Lt as u,Mn as d,Pn as f,dr as p,fr as m,ur as h}from"./sdk-batch.js";import{s as ee}from"./session-store.js";import{B as te,C as ne,E as g,I as _,L as v,V as y,f as re,i as b,m as ie,n as ae,o as oe,p as x,r as se,s as ce}from"./session-snapshot.js";import{d as le}from"./parameterized-recorded-fill.js";import{a as ue,h as de,m as fe,s as pe,t as me}from"./absence-observation-errors.js";import{r as he}from"./diagnostics.js";import"./diagnostics2.js";import{i as ge}from"./rect-center.js";import{a as S}from"./android-system-chrome.js";import{r as C}from"./request-cancel.js";import"./request.js";import{i as w}from"./request-runtime-binding.js";import{n as T}from"./dispatch-resolve.js";import{s as E}from"./quality-warnings.js";import{t as D}from"./backend-snapshot-options.js";import{i as O,n as k,t as A}from"./capture-disclosure.js";import{t as j}from"./snapshot-runtime-binding.js";function M(e){let t=r(e);return t?{ok:!0,ref:t.base,generation:t.generation}:{ok:!1,response:o(`INVALID_ARGS`,`Invalid ref "${e}" — malformed generation suffix.`,{hint:i})}}function N(e,t){if(t===`exists`)return{found:!0};if(t===`wait`)return{found:!0,waitedMs:e.waitedMs};if(t===`list`)return{action:`list`,matches:Array.isArray(e.matches)?e.matches.length:0};let n=typeof e.ref==`string`?e.ref:void 0;return t===`get_attrs`?{ref:n,action:`get attrs`}:{ref:n,action:`get text`,text:typeof e.text==`string`?e.text:``}}function P(e){return e.kind===`found`?{found:!0,...typeof e.waitedMs==`number`?{waitedMs:e.waitedMs}:{}}:e.kind===`list`?{matches:e.matches.map(e=>({ref:e.ref,node:S(e.node)}))}:{ref:e.ref,...e.kind===`text`?{text:e.text}:{},node:S(e.node)}}function F(e,t){let n=Array.isArray(e.selectorChain)?e.selectorChain:void 0,r=be(e),i=r?.kind===`ref`?z(r.ref):void 0,a=r?.kind===`selector`?r.selector:void 0,o={...i?{ref:i}:{},...a?{selector:a}:{},...n?{selectorChain:n}:{}};if(t===`attrs`)return o;let s=typeof e.text==`string`?e.text:``;return{...o,text:s,refLabel:ye(s)}}function I(e){let{target:t}=e;return{...t.kind===`ref`?{ref:z(t.ref)}:{},...t.kind===`selector`?{selector:t.selector}:{},...typeof e.text==`string`?{text:e.text}:{},node:S(e.node)}}function L(e){let{node:t,preActionNodes:n,...r}=e;return r}function _e(e){return{waitedMs:e.waitedMs,...typeof e.text==`string`?{text:e.text}:{},...typeof e.selector==`string`?{selector:e.selector}:{},...typeof e.captures==`number`?{captures:e.captures}:{},...typeof e.nodeCount==`number`?{nodeCount:e.nodeCount}:{},...typeof e.hint==`string`?{hint:e.hint}:{}}}function ve(e){let{selectorChain:t,...n}=e;return n}function R(e,t,n,r,i,a){let o=e.get(t);if(!o)return;let s=le(o)&&i?ne(i,{mode:a}):void 0;e.recordAction(o,{command:n.command,positionals:n.positionals??[],flags:n.flags??{},result:r,interactiveObservation:ee(n),...s?{targetEvidence:s,targetEvidenceMode:a??`action`}:{}})}function ye(e){let t=e.trim();if(!(!t||t.length>80||/[\r\n]/.test(t)))return t}function be(e){let t=e.target;if(!t||typeof t!=`object`)return;let n=t;if(n.kind===`ref`&&typeof n.ref==`string`)return{kind:`ref`,ref:n.ref};if(n.kind===`selector`&&typeof n.selector==`string`)return{kind:`selector`,selector:n.selector}}function z(e){return e.startsWith(`@`)?e.slice(1):e}async function B(e){let t=await j({...e,plan:u({hasActiveApp:e.session?.appBundleId!==void 0,intent:xe(e.command)}),readiness:!e.session});return t.ok?{ok:!0,operations:{capture:t.capture,...t.readTextAtPoint?{readText:t.readTextAtPoint}:{},...t.findText?{findText:t.findText}:{}}}:t}function xe(e){switch(e){case`is`:return`capture-only`;case`find`:case`get`:return`element-text`;case`wait`:return`wait-observation`}}const Se=[[`snapshotDepth`,`--depth`],[`snapshotScope`,`--scope`],[`snapshotRaw`,`--raw`]];function V(e,t){let n=Se.filter(([e])=>t?.[e]!==void 0).map(([,e])=>e);return n.length===0?null:o(`INVALID_ARGS`,`${e} @ref does not support ${n.join(`, `)}.`)}async function H(e,n){if(e.device.platform!==`android`||!e.appBundleId||e.lease?.leaseProvider||w(e.device))return null;if(!n)throw new t(`INTERNAL_ERROR`,`Android observation was not supplied by root runtime composition`);let r=await n.readAppState(e.device),i=r.package?.trim();if(!i||i===e.appBundleId)return null;let a=await n.isPermissionPackage(i);return!Te(i)&&!a?null:{expectedPackage:e.appBundleId,foregroundPackage:i,activity:r.activity,hint:we(a),...a?{permissionDialog:!0}:{}}}function Ce(e){return e.permissionDialog?`Android permission dialog is blocking ${e.expectedPackage}`:`${e.foregroundPackage} is foreground instead of ${e.expectedPackage}`}function we(e){return e?`Use "alert get" to inspect it, then "alert accept" or "alert dismiss" to respond.`:`Use screenshot as visual truth, then take a fresh snapshot -i before retrying.`}function Te(e){return e===`com.android.settings`||e===`com.android.systemui`||e.includes(`launcher`)}async function Ee(e){let{device:t,node:n,flags:r,appBundleId:i,traceOutPath:a,surface:o,contextFromFlags:s}=e,c=fe(n),u=e.readTextAtPoint;if(!u)return c;let d=ge(n.rect);if(!d||l(t)&&c&&!de(n.type??``))return c;let f=s(r,i,a),p=await u({point:d,options:{appBundleId:i,surface:o},execution:ie(f)});return p.status===`read`?p.text:(he({level:`warn`,phase:`interaction_read_fallback`,data:{reason:De(p.reason),nodeRef:n.ref,surface:o,platform:t.platform}}),c)}function De(e){switch(e){case`no-text-at-point`:return`no_text_at_point`;default:return e}}function U(e){let{session:t,sessionStore:n,sessionName:r}=e,i=0,a,o,s=t=>(e.consumedSnapshot&&(e.consumedSnapshot.state=t.snapshot),t);return{capture:async c=>{let l=Date.now(),u=Fe(c,e.req.flags?.out),d=je({timestamp:l,lastSnapshotAt:i,lastSnapshotResult:a,lastSnapshotCacheKey:o,session:t,request:c,cacheKey:u});if(d)return s(d);let f=Me({session:t,timestamp:l,request:c});if(f)return i=f.createdAt,a={snapshot:f},o=u,s(a);let p=await Oe({params:e,request:c});c.signal?.throwIfAborted();let m={snapshot:p};return Le({session:t,sessionStore:n,sessionName:r,snapshot:p}),i=l,a=m,o=u,s(m)}}}async function Oe(e){let{params:t,request:n}=e,r=await W(t,n,n.snapshotScope);return n.recovery?.legacyIosSparse&&pe(r)?await ke({runtimeParams:t,request:n,policy:n.recovery.legacyIosSparse}):n.recovery?.sparseVerdictQueryScope?.shouldScope&&E(r.snapshotQuality)?await Ae({runtimeParams:t,request:n,policy:n.recovery.sparseVerdictQueryScope,snapshot:r}):r}async function ke(e){let{runtimeParams:t,request:n,policy:r}=e;try{return await W(t,n,void 0,!1)}catch(e){if(!r.shouldScope)throw e;return await W(t,n,r.query,!1)}}async function Ae(e){let{runtimeParams:t,request:n,policy:r,snapshot:i}=e;try{return await W(t,n,r.query,!1)}catch{return i}}async function W(e,t,n,r=t.flags?.snapshotInteractiveOnly){let i={...t.flags,snapshotInteractiveOnly:r},a=e.capture,o=await ce({device:e.device,session:e.session,flags:i,outPath:t.outPath??e.req.flags?.out,logPath:e.logPath??``,snapshotScope:n,includeRects:t.includeRects,signal:t.signal,captureData:async()=>await a(x({flags:i,logPath:e.logPath??``,meta:e.req.meta,session:e.session,snapshotScope:n,includeRects:t.includeRects,signal:t.signal}))});return A(e.activationProof,o.snapshot)}function je(e){let{timestamp:t,lastSnapshotAt:n,lastSnapshotResult:r,lastSnapshotCacheKey:i,session:a,request:o,cacheKey:s}=e;if(o.cache?.forceFresh!==!0&&r&&i===s&&!(t-n>=750)&&!v(a)&&!G(a,o))return r}function Me(e){let{session:t,timestamp:n,request:r}=e,i=t?.snapshot;if(!(!i||te(i))&&Ne(t,r)&&Pe(i,n)&&i.presentationKey===K(r))return i}function Ne(e,t){return t.cache?.forceFresh===!0||t.cache?.useSessionSnapshot!==!0||v(e)||G(e,t)?!1:e.snapshot?.unsettledGesture===void 0}function Pe(e,t){return t-e.createdAt<750}function G(e,t){return t.cache?.bypassForPostGestureStabilization===!0&&g(e)}function K(t){return a(e(Ie(t)))}function Fe(e,t){return JSON.stringify({presentationKey:K(e),includeRects:e.includeRects===!0,outPath:e.outPath??t??null})}function Ie(e){return e.snapshotScope===void 0?e.flags:{...e.flags,snapshotScope:e.snapshotScope}}function Le(e){let{session:t,sessionStore:n,sessionName:r,snapshot:i}=e;!t||E(i.snapshotQuality)||(b(t,i),n.set(r,t))}function q(e){return re({backend:Y(e),...O(`selector commands`,{plural:!0}),sessions:oe({sessionName:e.sessionName,getSession:()=>e.session,recordOptions:{includeSnapshot:!0},setRecord:t=>{!e.session||!t.snapshot||(b(e.session,t.snapshot),e.sessionStore.set(e.sessionName,e.session))}}),signal:e.signal??C(e.req.meta?.requestId)})}async function Re(e,t){e.consumedSnapshot??={},e.activationProof??={};let n=e.sessionStore.get(e.sessionName);return!n&&t?{ok:!1,response:s()}:{ok:!0,session:n,device:n?.device??await T(e.req.flags??{})}}async function J(e,t){let n=await Re(e,t.requireSession);if(!n.ok)return n;let r=await B({command:t.command,device:n.device,session:n.session,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});return r.ok?{ok:!0,runtime:q({...e,session:n.session,device:n.device,bound:r.operations})}:{ok:!1,response:r.response}}function Y(e){let{req:t,session:n,device:r,logPath:i,sessionName:a,sessionStore:o}=e,s=e.contextFromFlags??((e,t,n)=>_(i??``,e,t,n)),l=e.bound?.readText,u=e.bound?.findText,d=x({flags:t.flags,logPath:i??``,meta:t.meta,session:n,snapshotScope:void 0}).execution,f=e.bound,p=f===void 0?void 0:U({device:r,session:n,sessionStore:o,sessionName:a,req:t,consumedSnapshot:e.consumedSnapshot,activationProof:e.activationProof,logPath:i,capture:f.capture});return{platform:c(r),captureSnapshot:p&&(async(e,n)=>{let i={...t.flags,...D(n)},a=n?.includeRects===!0,o=n?.scope??t.flags?.snapshotScope,s=t.command===`wait`||t.command===`find`||ze(t)||a&&r.platform===`web`;return await p.capture({flags:i,signal:e.signal,snapshotScope:o,includeRects:a,cache:{forceFresh:s,useSessionSnapshot:!0,bypassForPostGestureStabilization:!0}})}),readText:async(e,i)=>({text:await Ee({readTextAtPoint:l,device:r,node:i,flags:t.flags,appBundleId:n?.appBundleId,traceOutPath:n?.trace?.outPath,surface:n?.surface,contextFromFlags:s})}),...u?{findText:async(e,t)=>{let{found:r}=await u({text:t,options:{appBundleId:n?.appBundleId,surface:n?.surface},execution:d,...e.signal?{signal:e.signal}:{}});return n&&y(n),{found:r}}}:{}}}function ze(e){if(e.command!==`is`)return!1;let t=m(e.positionals??[]);return t.ok&&t.predicate===`absent`}async function Be(e){let{req:t}=e;if(t.command!==`find`)return null;let n=t.positionals??[],r=d(n,t.flags);if(!r.ok)return o(r.code,r.message);let i=r.parsed,a=i.action;if(!f(a))return null;let s=await J(e,{requireSession:!1,command:`find`});if(!s.ok)return s.response;let c=await Q(async()=>{let n=await s.runtime.selectors.find({session:e.sessionName,requestId:t.meta?.requestId,locator:i.locator,query:i.query,action:a,timeoutMs:i.timeoutMs});R(e.sessionStore,e.sessionName,t,N(n,a));let r=P(n),o=typeof r.ref==`string`?[r.ref]:Array.isArray(r.matches)?r.matches.map(e=>e.ref).filter(e=>typeof e==`string`):[];if(o.length>0){let t=e.sessionStore.get(e.sessionName);if(t&&(ae(t,o),e.sessionStore.set(e.sessionName,t),t.snapshotGeneration!==void 0))return{...r,refsGeneration:t.snapshotGeneration}}return r});return k({response:c,consumedTree:X(e),activationProof:e.activationProof})}function X(e){return e.consumedSnapshot?.state??e.sessionStore.get(e.sessionName)?.snapshot}async function Ve(e){let{req:t}=e;if(t.command!==`get`)return null;let n=p(t.positionals?.[0]);if(!n.ok)return o(n.code,n.message);let r=n.format,i=Ue(t);if(!i.ok)return i.response;if(i.target.kind===`ref`){let e=V(`get`,t.flags);if(e)return e}let a=t.internal?.replayTargetGuard,s=await J(e,{requireSession:!0,command:`get`});if(!s.ok)return s.response;let c=s.runtime,l=i.target.kind===`ref`?se({session:e.sessionStore.get(e.sessionName),ref:i.target.ref,mintedGeneration:i.refGeneration}):void 0,u=await Q(async()=>{let n=await c.selectors.get({session:e.sessionName,requestId:t.meta?.requestId,property:r,target:i.target,expectedResolvedTarget:a});R(e.sessionStore,e.sessionName,t,F(n,r),{node:n.node,preActionNodes:n.preActionNodes});let o=I(n);return l?{...o,warning:l}:o});return k({response:u,consumedTree:X(e),activationProof:e.activationProof})}async function He(e){let{req:t}=e;if(t.command!==`is`)return null;let n=m(t.positionals??[]);if(!n.ok)return o(n.code,n.message,n.hint?{hint:n.hint}:void 0);let{predicate:r,selectorExpression:i,expectedText:a}=n;if(r===`absent`){let e=ue({depth:t.flags?.snapshotDepth,scope:t.flags?.snapshotScope});if(e){let t=me(e);return o(t.code,t.message,t.details)}}let s=t.internal?.replayTargetGuard,c=await J(e,{requireSession:!0,command:`is`});if(!c.ok)return c.response;let l=await Q(async()=>{let n=await c.runtime.selectors.is({session:e.sessionName,requestId:t.meta?.requestId,predicate:r,selector:i,expectedText:a,expectedResolvedTarget:s}),o=Z(n),l=L(n);return R(e.sessionStore,e.sessionName,t,l,o),ve(l)});return k({response:await $(e,l,`is ${r}`),consumedTree:X(e),activationProof:e.activationProof})}function Z(e){let t=e.node,n=e.preActionNodes;if(!(!t||typeof t!=`object`||!Array.isArray(n)))return{node:t,preActionNodes:n}}function Ue(e){let t=e.positionals?.[1]??``;if(t.startsWith(`@`)){let n=M(t);return n.ok?{ok:!0,target:{kind:`ref`,ref:n.ref,fallbackLabel:e.positionals.length>2?e.positionals.slice(2).join(` `).trim():``},refGeneration:n.generation}:{ok:!1,response:n.response}}let n=h(e.positionals?.slice(1)??[]);return n.ok?{ok:!0,target:{kind:`selector`,selector:`selector`in n?n.selector:``}}:{ok:!1,response:o(n.code,n.message)}}async function Q(e){try{return{ok:!0,data:await e()}}catch(e){let t=n(e);return o(t.code,t.message,t.details)}}async function $(e,t,n){if(t.ok)return t;let r=e.sessionStore.get(e.sessionName);if(!r)return t;let i;try{if(!e.androidObservation)return t;i=await H(r,e.androidObservation)}catch{return t}return i?o(t.error.code,`${n} failed because ${Ce(i)}.`,{...t.error.details??{},...i,blockedBy:`android_foreground_surface`,originalMessage:t.error.message}):t}export{$ as a,q as c,V as d,B as f,M as g,_e as h,He as i,U as l,L as m,Be as n,Z as o,R as p,Ve as r,Q as s,X as t,H as u};
1
+ import{E as e,O as t,d as n,h as r,k as i,o as a,u as o,v as s,w as c}from"./sdk-contracts.js";import{b as l,d as u}from"./sdk-device.js";import{Lt as d,Mn as f,Pn as p,dr as m,fr as h,ur as g}from"./sdk-batch.js";import{s as ee}from"./session-store.js";import{D as te,H as ne,L as _,R as v,V as y,f as re,i as b,m as ie,n as ae,o as oe,p as x,r as se,s as ce,w as le}from"./session-snapshot.js";import{d as ue}from"./parameterized-recorded-fill.js";import{a as de,h as fe,m as pe,s as me,t as he}from"./absence-observation-errors.js";import{r as ge}from"./diagnostics.js";import"./diagnostics2.js";import{i as _e}from"./rect-center.js";import{a as S}from"./android-system-chrome.js";import{r as C}from"./request-cancel.js";import"./request.js";import{i as w}from"./request-runtime-binding.js";import{n as T}from"./dispatch-resolve.js";import{s as E}from"./quality-warnings.js";import{t as D}from"./backend-snapshot-options.js";import{i as O,n as k,t as A}from"./capture-disclosure.js";import{t as j}from"./snapshot-runtime-binding.js";function M(t){let r=e(t);return r?{ok:!0,ref:r.base,generation:r.generation}:{ok:!1,response:a(`INVALID_ARGS`,`Invalid ref "${t}" — malformed generation suffix.`,{hint:n})}}function N(e,t){if(t===`exists`)return{found:!0};if(t===`wait`)return{found:!0,waitedMs:e.waitedMs};if(t===`list`)return{action:`list`,matches:Array.isArray(e.matches)?e.matches.length:0};let n=typeof e.ref==`string`?e.ref:void 0;return t===`get_attrs`?{ref:n,action:`get attrs`}:{ref:n,action:`get text`,text:typeof e.text==`string`?e.text:``}}function P(e){return e.kind===`found`?{found:!0,...typeof e.waitedMs==`number`?{waitedMs:e.waitedMs}:{}}:e.kind===`list`?{matches:e.matches.map(e=>({ref:e.ref,node:S(e.node)}))}:{ref:e.ref,...e.kind===`text`?{text:e.text}:{},node:S(e.node)}}function F(e,t){let n=Array.isArray(e.selectorChain)?e.selectorChain:void 0,r=xe(e),i=r?.kind===`ref`?z(r.ref):void 0,a=r?.kind===`selector`?r.selector:void 0,o={...i?{ref:i}:{},...a?{selector:a}:{},...n?{selectorChain:n}:{}};if(t===`attrs`)return o;let s=typeof e.text==`string`?e.text:``;return{...o,text:s,refLabel:be(s)}}function I(e){let{target:t}=e;return{...t.kind===`ref`?{ref:z(t.ref)}:{},...t.kind===`selector`?{selector:t.selector}:{},...typeof e.text==`string`?{text:e.text}:{},node:S(e.node)}}function L(e){let{node:t,preActionNodes:n,...r}=e;return r}function ve(e){return{waitedMs:e.waitedMs,...typeof e.text==`string`?{text:e.text}:{},...typeof e.selector==`string`?{selector:e.selector}:{},...typeof e.captures==`number`?{captures:e.captures}:{},...typeof e.nodeCount==`number`?{nodeCount:e.nodeCount}:{},...typeof e.hint==`string`?{hint:e.hint}:{}}}function ye(e){let{selectorChain:t,...n}=e;return n}function R(e,t,n,r,i,a){let o=e.get(t);if(!o)return;let s=ue(o)&&i?le(i,{mode:a}):void 0;e.recordAction(o,{command:n.command,positionals:n.positionals??[],flags:n.flags??{},result:r,interactiveObservation:ee(n),...s?{targetEvidence:s,targetEvidenceMode:a??`action`}:{}})}function be(e){let t=e.trim();if(!(!t||t.length>80||/[\r\n]/.test(t)))return t}function xe(e){let t=e.target;if(!t||typeof t!=`object`)return;let n=t;if(n.kind===`ref`&&typeof n.ref==`string`)return{kind:`ref`,ref:n.ref};if(n.kind===`selector`&&typeof n.selector==`string`)return{kind:`selector`,selector:n.selector}}function z(e){return e.startsWith(`@`)?e.slice(1):e}async function B(e){let t=await j({...e,plan:d({hasActiveApp:e.session?.appBundleId!==void 0,intent:Se(e.command)}),readiness:!e.session});return t.ok?{ok:!0,operations:{capture:t.capture,...t.readTextAtPoint?{readText:t.readTextAtPoint}:{},...t.findText?{findText:t.findText}:{}}}:t}function Se(e){switch(e){case`is`:return`capture-only`;case`find`:case`get`:return`element-text`;case`wait`:return`wait-observation`}}const Ce=[[`snapshotDepth`,`--depth`],[`snapshotScope`,`--scope`],[`snapshotRaw`,`--raw`]];function V(e,t){let n=Ce.filter(([e])=>t?.[e]!==void 0).map(([,e])=>e);return n.length===0?null:a(`INVALID_ARGS`,`${e} @ref does not support ${n.join(`, `)}.`)}async function H(e,n){if(e.device.platform!==`android`||!e.appBundleId||e.lease?.leaseProvider||w(e.device))return null;if(!n)throw new t(`INTERNAL_ERROR`,`Android observation was not supplied by root runtime composition`);let r=await n.readAppState(e.device),i=r.package?.trim();if(!i||i===e.appBundleId)return null;let a=await n.isPermissionPackage(i);return!Ee(i)&&!a?null:{expectedPackage:e.appBundleId,foregroundPackage:i,activity:r.activity,hint:Te(a),...a?{permissionDialog:!0}:{}}}function we(e){return e.permissionDialog?`Android permission dialog is blocking ${e.expectedPackage}`:`${e.foregroundPackage} is foreground instead of ${e.expectedPackage}`}function Te(e){return e?`Use "alert get" to inspect it, then "alert accept" or "alert dismiss" to respond.`:`Use screenshot as visual truth, then take a fresh snapshot -i before retrying.`}function Ee(e){return e===`com.android.settings`||e===`com.android.systemui`||e.includes(`launcher`)}async function De(e){let{device:t,node:n,flags:r,appBundleId:i,traceOutPath:a,surface:o,contextFromFlags:s}=e,c=pe(n),l=e.readTextAtPoint;if(!l)return c;let d=_e(n.rect);if(!d||u(t)&&c&&!fe(n.type??``))return c;let f=s(r,i,a),p=await l({point:d,options:{appBundleId:i,surface:o},execution:ie(f)});return p.status===`read`?p.text:(ge({level:`warn`,phase:`interaction_read_fallback`,data:{reason:Oe(p.reason),nodeRef:n.ref,surface:o,platform:t.platform}}),c)}function Oe(e){switch(e){case`no-text-at-point`:return`no_text_at_point`;default:return e}}function U(e){let{session:t,sessionStore:n,sessionName:r}=e,i=0,a,o,s=t=>(e.consumedSnapshot&&(e.consumedSnapshot.state=t.snapshot),t);return{capture:async c=>{let l=Date.now(),u=Ie(c,e.req.flags?.out),d=Me({timestamp:l,lastSnapshotAt:i,lastSnapshotResult:a,lastSnapshotCacheKey:o,session:t,request:c,cacheKey:u});if(d)return s(d);let f=Ne({session:t,timestamp:l,request:c});if(f)return i=f.createdAt,a={snapshot:f},o=u,s(a);let p=await ke({params:e,request:c});c.signal?.throwIfAborted();let m={snapshot:p};return Re({session:t,sessionStore:n,sessionName:r,snapshot:p}),i=l,a=m,o=u,s(m)}}}async function ke(e){let{params:t,request:n}=e,r=await W(t,n,n.snapshotScope);return n.recovery?.legacyIosSparse&&me(r)?s(r,await Ae({runtimeParams:t,request:n,policy:n.recovery.legacyIosSparse})):n.recovery?.sparseVerdictQueryScope?.shouldScope&&E(r.snapshotQuality)?s(r,await je({runtimeParams:t,request:n,policy:n.recovery.sparseVerdictQueryScope,snapshot:r})):r}async function Ae(e){let{runtimeParams:t,request:n,policy:r}=e;try{return await W(t,n,void 0,!1)}catch(e){if(!r.shouldScope)throw e;return await W(t,n,r.query,!1)}}async function je(e){let{runtimeParams:t,request:n,policy:r,snapshot:i}=e;try{return await W(t,n,r.query,!1)}catch{return i}}async function W(e,t,n,r=t.flags?.snapshotInteractiveOnly){let i={...t.flags,snapshotInteractiveOnly:r},a=e.capture,o=await ce({device:e.device,session:e.session,flags:i,outPath:t.outPath??e.req.flags?.out,logPath:e.logPath??``,snapshotScope:n,includeRects:t.includeRects,signal:t.signal,captureData:async()=>await a(x({flags:i,logPath:e.logPath??``,meta:e.req.meta,session:e.session,snapshotScope:n,includeRects:t.includeRects,signal:t.signal}))});return A(e.captureProof,o.snapshot)}function Me(e){let{timestamp:t,lastSnapshotAt:n,lastSnapshotResult:r,lastSnapshotCacheKey:i,session:a,request:o,cacheKey:s}=e;if(o.cache?.forceFresh!==!0&&r&&i===s&&!(t-n>=750)&&!v(a)&&!G(a,o))return r}function Ne(e){let{session:t,timestamp:n,request:r}=e,i=t?.snapshot;if(!(!i||y(i))&&Pe(t,r)&&Fe(i,n)&&i.presentationKey===K(r))return i}function Pe(e,t){return t.cache?.forceFresh===!0||t.cache?.useSessionSnapshot!==!0||v(e)||G(e,t)?!1:e.snapshot?.postGestureOutcome?.kind!==`unsettled`}function Fe(e,t){return t-e.createdAt<750}function G(e,t){return t.cache?.bypassForPostGestureStabilization===!0&&te(e)}function K(e){return r(c(Le(e)))}function Ie(e,t){return JSON.stringify({presentationKey:K(e),includeRects:e.includeRects===!0,outPath:e.outPath??t??null})}function Le(e){return e.snapshotScope===void 0?e.flags:{...e.flags,snapshotScope:e.snapshotScope}}function Re(e){let{session:t,sessionStore:n,sessionName:r,snapshot:i}=e;!t||E(i.snapshotQuality)||(b(t,i),n.set(r,t))}function q(e){return re({backend:Be(e),...O(`selector commands`,{plural:!0}),sessions:oe({sessionName:e.sessionName,getSession:()=>e.session,recordOptions:{includeSnapshot:!0},setRecord:t=>{!e.session||!t.snapshot||(b(e.session,t.snapshot),e.sessionStore.set(e.sessionName,e.session))}}),signal:e.signal??C(e.req.meta?.requestId)})}async function ze(e,t){e.consumedSnapshot??={},e.captureProof??={};let n=e.sessionStore.get(e.sessionName);return!n&&t?{ok:!1,response:o()}:{ok:!0,session:n,device:n?.device??await T(e.req.flags??{})}}async function J(e,t){let n=await ze(e,t.requireSession);if(!n.ok)return n;let r=await B({command:t.command,device:n.device,session:n.session,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});return r.ok?{ok:!0,runtime:q({...e,session:n.session,device:n.device,bound:r.operations})}:{ok:!1,response:r.response}}function Be(e){let{req:t,session:n,device:r,logPath:i,sessionName:a,sessionStore:o}=e,s=e.contextFromFlags??((e,t,n)=>_(i??``,e,t,n)),c=e.bound?.readText,u=e.bound?.findText,d=x({flags:t.flags,logPath:i??``,meta:t.meta,session:n,snapshotScope:void 0}).execution,f=e.bound,p=f===void 0?void 0:U({device:r,session:n,sessionStore:o,sessionName:a,req:t,consumedSnapshot:e.consumedSnapshot,captureProof:e.captureProof,logPath:i,capture:f.capture});return{platform:l(r),captureSnapshot:p&&(async(e,n)=>{let i={...t.flags,...D(n)},a=n?.includeRects===!0,o=n?.scope??t.flags?.snapshotScope,s=t.command===`wait`||t.command===`find`||Ve(t)||a&&r.platform===`web`;return await p.capture({flags:i,signal:e.signal,snapshotScope:o,includeRects:a,cache:{forceFresh:s,useSessionSnapshot:!0,bypassForPostGestureStabilization:!0}})}),readText:async(e,i)=>({text:await De({readTextAtPoint:c,device:r,node:i,flags:t.flags,appBundleId:n?.appBundleId,traceOutPath:n?.trace?.outPath,surface:n?.surface,contextFromFlags:s})}),...u?{findText:async(e,t)=>{let{found:r}=await u({text:t,options:{appBundleId:n?.appBundleId,surface:n?.surface},execution:d,...e.signal?{signal:e.signal}:{}});return n&&ne(n),{found:r}}}:{}}}function Ve(e){if(e.command!==`is`)return!1;let t=h(e.positionals??[]);return t.ok&&t.predicate===`absent`}async function Y(e){let{req:t}=e;if(t.command!==`find`)return null;let n=t.positionals??[],r=f(n,t.flags);if(!r.ok)return a(r.code,r.message);let i=r.parsed,o=i.action;if(!p(o))return null;let s=await J(e,{requireSession:!1,command:`find`});if(!s.ok)return s.response;let c=await Q(async()=>{let n=await s.runtime.selectors.find({session:e.sessionName,requestId:t.meta?.requestId,locator:i.locator,query:i.query,action:o,timeoutMs:i.timeoutMs});R(e.sessionStore,e.sessionName,t,N(n,o));let r=P(n),a=typeof r.ref==`string`?[r.ref]:Array.isArray(r.matches)?r.matches.map(e=>e.ref).filter(e=>typeof e==`string`):[];if(a.length>0){let t=e.sessionStore.get(e.sessionName);if(t&&(ae(t,a),e.sessionStore.set(e.sessionName,t),t.snapshotGeneration!==void 0))return{...r,refsGeneration:t.snapshotGeneration}}return r});return k({response:c,consumedTree:X(e),captureProof:e.captureProof})}function X(e){return e.consumedSnapshot?.state??e.sessionStore.get(e.sessionName)?.snapshot}async function He(e){let{req:t}=e;if(t.command!==`get`)return null;let n=m(t.positionals?.[0]);if(!n.ok)return a(n.code,n.message);let r=n.format,i=We(t);if(!i.ok)return i.response;if(i.target.kind===`ref`){let e=V(`get`,t.flags);if(e)return e}let o=t.internal?.replayTargetGuard,s=await J(e,{requireSession:!0,command:`get`});if(!s.ok)return s.response;let c=s.runtime,l=i.target.kind===`ref`?se({session:e.sessionStore.get(e.sessionName),ref:i.target.ref,mintedGeneration:i.refGeneration}):void 0,u=await Q(async()=>{let n=await c.selectors.get({session:e.sessionName,requestId:t.meta?.requestId,property:r,target:i.target,expectedResolvedTarget:o});R(e.sessionStore,e.sessionName,t,F(n,r),{node:n.node,preActionNodes:n.preActionNodes});let a=I(n);return l?{...a,warning:l}:a});return k({response:u,consumedTree:X(e),captureProof:e.captureProof})}async function Ue(e){let{req:t}=e;if(t.command!==`is`)return null;let n=h(t.positionals??[]);if(!n.ok)return a(n.code,n.message,n.hint?{hint:n.hint}:void 0);let{predicate:r,selectorExpression:i,expectedText:o}=n;if(r===`absent`){let e=de({depth:t.flags?.snapshotDepth,scope:t.flags?.snapshotScope});if(e){let t=he(e);return a(t.code,t.message,t.details)}}let s=t.internal?.replayTargetGuard,c=await J(e,{requireSession:!0,command:`is`});if(!c.ok)return c.response;let l=await Q(async()=>{let n=await c.runtime.selectors.is({session:e.sessionName,requestId:t.meta?.requestId,predicate:r,selector:i,expectedText:o,expectedResolvedTarget:s}),a=Z(n),l=L(n);return R(e.sessionStore,e.sessionName,t,l,a),ye(l)});return k({response:await $(e,l,`is ${r}`),consumedTree:X(e),captureProof:e.captureProof})}function Z(e){let t=e.node,n=e.preActionNodes;if(!(!t||typeof t!=`object`||!Array.isArray(n)))return{node:t,preActionNodes:n}}function We(e){let t=e.positionals?.[1]??``;if(t.startsWith(`@`)){let n=M(t);return n.ok?{ok:!0,target:{kind:`ref`,ref:n.ref,fallbackLabel:e.positionals.length>2?e.positionals.slice(2).join(` `).trim():``},refGeneration:n.generation}:{ok:!1,response:n.response}}let n=g(e.positionals?.slice(1)??[]);return n.ok?{ok:!0,target:{kind:`selector`,selector:`selector`in n?n.selector:``}}:{ok:!1,response:a(n.code,n.message)}}async function Q(e){try{return{ok:!0,data:await e()}}catch(e){let t=i(e);return a(t.code,t.message,t.details)}}async function $(e,t,n){if(t.ok)return t;let r=e.sessionStore.get(e.sessionName);if(!r)return t;let i;try{if(!e.androidObservation)return t;i=await H(r,e.androidObservation)}catch{return t}return i?a(t.error.code,`${n} failed because ${we(i)}.`,{...t.error.details??{},...i,blockedBy:`android_foreground_surface`,originalMessage:t.error.message}):t}export{$ as a,q as c,V as d,B as f,M as g,ve as h,Ue as i,U as l,L as m,Y as n,Z as o,R as p,He as r,Q as s,X as t,H as u};
@@ -1,4 +1,4 @@
1
- import{D as e,l as t}from"./sdk-contracts.js";import{_ as n}from"./sdk-batch.js";import{i as r}from"./catalog.js";import{a as i}from"./version.js";import{a,i as ee,r as o,t as te}from"./command-tools.js";import{i as s,r as c,t as l}from"./cli-help.js";const u=`agent-device drives iOS, Android, tvOS, Android TV, macOS, Linux, and web apps. Tools mirror CLI commands of the same name; CLI flags are camelCase properties (--settle -> settle: true).
1
+ import{O as e,l as t}from"./sdk-contracts.js";import{_ as n}from"./sdk-batch.js";import{i as r}from"./catalog.js";import{a as i}from"./version.js";import{a,i as ee,r as o,t as te}from"./command-tools.js";import{i as s,r as c,t as l}from"./cli-help.js";const u=`agent-device drives iOS, Android, tvOS, Android TV, macOS, Linux, and web apps. Tools mirror CLI commands of the same name; CLI flags are camelCase properties (--settle -> settle: true).
2
2
 
3
3
  Start: known app -> call open {app, foreground: true} at once; do not probe with devices, apps, appstate, snapshot, or screenshot first. open returns the initial interactive snapshot with @refs. Unknown app id: devices, then apps, then open the discovered id; never invent ids. Existing session: continue from its state, do not reopen.
4
4
 
@@ -1 +1 @@
1
- import{D as e}from"./sdk-contracts.js";import{a as t}from"./request-cancellation.js";import{c as n,r,t as i}from"./device-session.js";import{assertLimrunUploadedAppAccess as a,resolveInstalledAppIdForAsset as o,resolveLimrunAppAsset as s}from"./app-catalog.js";async function c(e,t,n){let r=n?.initialApp,i=typeof r==`string`?r.trim():``;if(i)return a(n?.publicNetworkOnly),await s(e,t,i,n?.signal)}async function l(t,n){let r=await i(t).listApps(`user-installed`),a=o(n.name,r);if(a)return a;throw new e(`COMMAND_FAILED`,`Limrun installed ${n.name}, but its application identifier could not be resolved unambiguously.`,{asset:n.name,installedApps:r.map(e=>e.id)})}async function u(n){let i=await n.limrun.iosInstances.create({wait:!0,metadata:n.metadata,spec:{...n.region?{region:n.region}:{},...n.app?{initialAssets:[{kind:`App`,source:`AssetID`,assetId:n.app.id,launchMode:`RelaunchIfRunning`}]}:{}}});try{if(!i.status.apiUrl)throw new e(`COMMAND_FAILED`,`Limrun iOS instance did not expose apiUrl`);return await r({lease:n.lease,instanceId:i.metadata.id,device:t(`ios`,n.lease,i.metadata.id),apiUrl:i.status.apiUrl,token:i.status.token},n.dependencies)}catch(e){throw await n.limrun.iosInstances.delete(i.metadata.id).catch(()=>{}),e}}async function d(r){let i=await r.limrun.androidInstances.create({wait:!0,metadata:r.metadata,spec:{...r.region?{region:r.region}:{},...r.app?{initialAssets:[{kind:`App`,source:`AssetIDs`,assetIds:[r.app.id]}]}:{}}});try{if(!i.status.apiUrl||!i.status.adbWebSocketUrl)throw new e(`COMMAND_FAILED`,`Limrun Android instance did not expose API and ADB websocket endpoints`);return await n({lease:r.lease,instanceId:i.metadata.id,device:t(`android`,r.lease,i.metadata.id),apiUrl:i.status.apiUrl,token:i.status.token,adbUrl:i.status.adbWebSocketUrl},r.dependencies)}catch(e){throw await r.limrun.androidInstances.delete(i.metadata.id).catch(()=>{}),e}}export{d as allocateLimrunAndroidSession,u as allocateLimrunIosSession,l as resolvePreinstalledAppId,c as resolveRequestedLimrunAppAsset};
1
+ import{O as e}from"./sdk-contracts.js";import{a as t}from"./request-cancellation.js";import{c as n,r,t as i}from"./device-session.js";import{assertLimrunUploadedAppAccess as a,resolveInstalledAppIdForAsset as o,resolveLimrunAppAsset as s}from"./app-catalog.js";async function c(e,t,n){let r=n?.initialApp,i=typeof r==`string`?r.trim():``;if(i)return a(n?.publicNetworkOnly),await s(e,t,i,n?.signal)}async function l(t,n){let r=await i(t).listApps(`user-installed`),a=o(n.name,r);if(a)return a;throw new e(`COMMAND_FAILED`,`Limrun installed ${n.name}, but its application identifier could not be resolved unambiguously.`,{asset:n.name,installedApps:r.map(e=>e.id)})}async function u(n){let i=await n.limrun.iosInstances.create({wait:!0,metadata:n.metadata,spec:{...n.region?{region:n.region}:{},...n.app?{initialAssets:[{kind:`App`,source:`AssetID`,assetId:n.app.id,launchMode:`RelaunchIfRunning`}]}:{}}});try{if(!i.status.apiUrl)throw new e(`COMMAND_FAILED`,`Limrun iOS instance did not expose apiUrl`);return await r({lease:n.lease,instanceId:i.metadata.id,device:t(`ios`,n.lease,i.metadata.id),apiUrl:i.status.apiUrl,token:i.status.token},n.dependencies)}catch(e){throw await n.limrun.iosInstances.delete(i.metadata.id).catch(()=>{}),e}}async function d(r){let i=await r.limrun.androidInstances.create({wait:!0,metadata:r.metadata,spec:{...r.region?{region:r.region}:{},...r.app?{initialAssets:[{kind:`App`,source:`AssetIDs`,assetIds:[r.app.id]}]}:{}}});try{if(!i.status.apiUrl||!i.status.adbWebSocketUrl)throw new e(`COMMAND_FAILED`,`Limrun Android instance did not expose API and ADB websocket endpoints`);return await n({lease:r.lease,instanceId:i.metadata.id,device:t(`android`,r.lease,i.metadata.id),apiUrl:i.status.apiUrl,token:i.status.token,adbUrl:i.status.adbWebSocketUrl},r.dependencies)}catch(e){throw await r.limrun.androidInstances.delete(i.metadata.id).catch(()=>{}),e}}export{d as allocateLimrunAndroidSession,u as allocateLimrunIosSession,l as resolvePreinstalledAppId,c as resolveRequestedLimrunAppAsset};
@@ -1 +1 @@
1
- import{D as e,o as t}from"./sdk-contracts.js";import{b as n,d as r,g as i,r as a,y as o}from"./sdk-device.js";import"./session-store.js";import{s}from"./device-shell.js";import{t as c}from"./device-isolation.js";import l from"node:path";import u from"node:fs";import d from"node:crypto";function f(e){return`${e.device.platform} device "${e.device.name.trim()}" (${e.device.id})`}function p(e,t,n={}){return e.session.screenRecording?g(e.address,t):v(e,t,n)}function m(e,n,r={}){return t(`DEVICE_IN_USE`,`Device is already in use by session "${e.address}".`,{session:e.address,deviceId:n.id,deviceName:n.name,...r.waitedMs===void 0?{}:{waitedMs:r.waitedMs},hint:p(e,`device-in-use`,r)})}function h(e,n,r={}){return t(`DEVICE_IN_USE`,`Device is already in use by workspace session "${e.address}".`,{reason:`WORKSPACE_SESSION_SCOPE_CONFLICT`,session:e.address,deviceId:n.id,deviceName:n.name,...r.waitedMs===void 0?{}:{waitedMs:r.waitedMs},hint:_(e.address,r)})}function g(e,t){let n=s(e),r=`agent-device close --session ${n}`;return`Recording session "${e}" owns this device. Run ${`agent-device record stop --session ${n}`}; if the session still appears in agent-device session list, run ${r}. ${t===`selector-conflict`?`To keep using this device, rerun the command with --session ${n} and remove conflicting device selectors.`:`To keep using this device, reuse --session ${n} for commands that should attach to the recording session.`} Run agent-device session list to inspect active sessions.`}function _(e,t){let n=s(e);return`${y(t)}Session "${e}" belongs to another workspace. Run agent-device close --session ${n} to release this device from that workspace, agent-device devices to choose another device. ${b(t)}Run agent-device session list to inspect active sessions.`}function v(e,t,n){let r=e.address,i=s(r),a=`agent-device close --session ${i}`;return t===`selector-conflict`?`Run agent-device session list to inspect active sessions. To reuse this device, rerun the command with --session ${i} and remove conflicting device selectors. To switch devices, first run ${a}, then open the desired device with a different --session name.`+x(e,n):`${y(n)}Run agent-device session list to inspect active sessions. To reuse this device, rerun the command with --session ${i}. To open a new session on this device, first run ${a}. `+`${b(n)}`.trimEnd()}function y(e){return e.waitedMs===void 0?``:`Waited ${Math.round(e.waitedMs)}ms for this device and it stayed busy. `}function b(e){return e.offersDeviceWait&&e.waitedMs===void 0?`To wait for the device to free up, run the same open with --wait <ms>. `:``}function x(e,t){return t.offersPlatformSession===!0&&e.session.sessionScope?.kind===`cwd`?` Or name the other platform with --platform to open its own session for this workspace.`:``}function S(t,n){let{address:r,session:i}=t,a=C(i,n);if(a.length!==0)throw new e(`INVALID_ARGS`,`Session "${r}" is already bound to ${f(i)}, but this request selected ${a.map(w).join(`, `)}.`,{session:r,conflicts:a.map(w),hint:p(t,`selector-conflict`,{offersPlatformSession:a.some(e=>e.key===`platform`)})})}function C(e,t){if(!t)return[];let n=[],a=e.device,s=t.platform;if(s&&!o(a,s)&&n.push({key:`platform`,value:t.platform}),t.target&&t.target!==(a.target??`mobile`)&&n.push({key:`target`,value:t.target}),t.udid&&(!r(a)||t.udid!==a.id)&&n.push({key:`udid`,value:t.udid}),t.serial&&(!i(a.platform)||t.serial!==a.id)&&n.push({key:`serial`,value:t.serial}),t.device&&t.device.trim().toLowerCase()!==a.name.trim().toLowerCase()&&n.push({key:`device`,value:t.device}),t.iosSimulatorDeviceSet){let e=t.iosSimulatorDeviceSet.trim(),i=a.simulatorSetPath?.trim();(!r(a)||a.kind!==`simulator`||e!==i)&&n.push({key:`iosSimulatorDeviceSet`,value:t.iosSimulatorDeviceSet})}if(t.androidDeviceAllowlist){let e=c(t.androidDeviceAllowlist);(a.platform!==`android`||!e.has(a.id))&&n.push({key:`androidDeviceAllowlist`,value:t.androidDeviceAllowlist})}return n}function w(e){return`${T(e.key)}=${e.value}`}function T(e){switch(e){case`iosSimulatorDeviceSet`:return`--ios-simulator-device-set`;case`androidDeviceAllowlist`:return`--android-device-allowlist`;default:return`--${e}`}}const E=`default`,D=new Set(a);function O(e,t,n={}){let r=e.session||E;if(P(e))return r;let i=j(e);return i.kind===`cwd`?I(e,t,i.id,n):r}function k(e){return e.session||E}function A(e){let t=j(e);return t.kind===`cwd`?t:void 0}function j(t){if(t.meta?.sessionIsolation===`tenant`||t.flags?.sessionIsolation===`tenant`){let n=t.meta?.tenantId;if(!n)throw new e(`INTERNAL_ERROR`,`Tenant-scoped request reached session routing without an admitted tenant id`);return{kind:`tenant`,id:n}}if(P(t)||(t.session||E)!==E)return{kind:`named-local`};let n=J(t.meta?.cwd);return n?{kind:`cwd`,id:q(n)}:{kind:`global-default`}}function M(e,t){let n=e.sessionScope;return n?t.kind===`tenant`?n.kind===`tenant`&&n.id===t.id:n.kind===`tenant`?!1:t.kind!==`cwd`||n.kind===`named-local`||n.kind===`cwd`&&n.id===t.id:!1}function N(e,t){let n=A(e);return!n||t.sessionScope?.kind!==`cwd`?!1:t.sessionScope.id!==n.id}function P(e){if(e.meta?.sessionExplicit===!0)return!0;let t=e.flags?.session;return typeof t==`string`&&t.trim().length>0}function F(e,t){return`cwd:${e}:${t}`}function I(e,t,n,r){let i=H(t,n),a=U(e);return a?L(e,t,n,a,i,r):V(n,i,r)}function L(e,t,n,r,i,a){let o=F(n,r);if(t.get(o))return o;let s=B(e.flags,r),c=i.map(e=>({ref:e,conflicts:C(e.session,s)})),l=c.filter(e=>e.conflicts.length===0),[u]=l;return u&&l.length===1?u.ref.address:l.length>1?(G(a,l.map(e=>e.ref)),o):R(c)?.address??o}function R(e){return e.find(e=>!z(e.conflicts))?.ref}function z(e){return e.some(e=>e.key===`platform`)}function B(e,t){return{...e,platform:t}}function V(e,t,n){let[r]=t;return r&&t.length===1?r.address:(G(n,t),F(e,E))}function H(e,t){let n=new Set,r=[];for(let i of e.listRefs()){let e=i.session.sessionScope;e?.kind===`cwd`&&e.id===t&&(n.has(i.session)||(n.add(i.session),r.push(i)))}return r}function U(e){return W(e.flags?.platform)??W(e.meta?.lockPlatform)}function W(e){if(typeof e!=`string`)return;let t=e.trim().toLowerCase();return D.has(t)?t:void 0}function G(e,t){if(t.length>1&&e.attachesToSession===!0)throw K(t)}function K(t){let r=t.map(e=>e.address),i=t.map(e=>n(e.session.device)),a=i.map(e=>`--platform ${e}`).join(` or `);return new e(`AMBIGUOUS_MATCH`,`This workspace has ${t.length} implicit sessions (${r.join(`, `)}); select one explicitly.`,{sessions:r,platforms:i,hint:`Run agent-device session list to inspect them. Add ${a} to run in that platform's session, or pass --session <address> copied from that list.`})}function q(e){return d.createHash(`sha256`).update(e).digest(`hex`).slice(0,16)}function J(e){if(!e||e.trim().length===0)return;let t=Y(e);return X(t)??t}function Y(e){let t=l.resolve(e);try{return u.realpathSync.native(t)}catch{return t}}function X(e){let t=e;for(;;){if(u.existsSync(l.join(t,`.git`)))return t;let e=l.dirname(t);if(e===t)return;t=e}}export{j as a,w as c,h as d,p as f,k as i,C as l,N as n,M as o,f as p,O as r,S as s,P as t,m as u};
1
+ import{O as e,o as t}from"./sdk-contracts.js";import{b as n,d as r,g as i,r as a,y as o}from"./sdk-device.js";import"./session-store.js";import{s}from"./device-shell.js";import{t as c}from"./device-isolation.js";import l from"node:path";import u from"node:fs";import d from"node:crypto";function f(e){return`${e.device.platform} device "${e.device.name.trim()}" (${e.device.id})`}function p(e,t,n={}){return e.session.screenRecording?g(e.address,t):v(e,t,n)}function m(e,n,r={}){return t(`DEVICE_IN_USE`,`Device is already in use by session "${e.address}".`,{session:e.address,deviceId:n.id,deviceName:n.name,...r.waitedMs===void 0?{}:{waitedMs:r.waitedMs},hint:p(e,`device-in-use`,r)})}function h(e,n,r={}){return t(`DEVICE_IN_USE`,`Device is already in use by workspace session "${e.address}".`,{reason:`WORKSPACE_SESSION_SCOPE_CONFLICT`,session:e.address,deviceId:n.id,deviceName:n.name,...r.waitedMs===void 0?{}:{waitedMs:r.waitedMs},hint:_(e.address,r)})}function g(e,t){let n=s(e),r=`agent-device close --session ${n}`;return`Recording session "${e}" owns this device. Run ${`agent-device record stop --session ${n}`}; if the session still appears in agent-device session list, run ${r}. ${t===`selector-conflict`?`To keep using this device, rerun the command with --session ${n} and remove conflicting device selectors.`:`To keep using this device, reuse --session ${n} for commands that should attach to the recording session.`} Run agent-device session list to inspect active sessions.`}function _(e,t){let n=s(e);return`${y(t)}Session "${e}" belongs to another workspace. Run agent-device close --session ${n} to release this device from that workspace, agent-device devices to choose another device. ${b(t)}Run agent-device session list to inspect active sessions.`}function v(e,t,n){let r=e.address,i=s(r),a=`agent-device close --session ${i}`;return t===`selector-conflict`?`Run agent-device session list to inspect active sessions. To reuse this device, rerun the command with --session ${i} and remove conflicting device selectors. To switch devices, first run ${a}, then open the desired device with a different --session name.`+x(e,n):`${y(n)}Run agent-device session list to inspect active sessions. To reuse this device, rerun the command with --session ${i}. To open a new session on this device, first run ${a}. `+`${b(n)}`.trimEnd()}function y(e){return e.waitedMs===void 0?``:`Waited ${Math.round(e.waitedMs)}ms for this device and it stayed busy. `}function b(e){return e.offersDeviceWait&&e.waitedMs===void 0?`To wait for the device to free up, run the same open with --wait <ms>. `:``}function x(e,t){return t.offersPlatformSession===!0&&e.session.sessionScope?.kind===`cwd`?` Or name the other platform with --platform to open its own session for this workspace.`:``}function S(t,n){let{address:r,session:i}=t,a=C(i,n);if(a.length!==0)throw new e(`INVALID_ARGS`,`Session "${r}" is already bound to ${f(i)}, but this request selected ${a.map(w).join(`, `)}.`,{session:r,conflicts:a.map(w),hint:p(t,`selector-conflict`,{offersPlatformSession:a.some(e=>e.key===`platform`)})})}function C(e,t){if(!t)return[];let n=[],a=e.device,s=t.platform;if(s&&!o(a,s)&&n.push({key:`platform`,value:t.platform}),t.target&&t.target!==(a.target??`mobile`)&&n.push({key:`target`,value:t.target}),t.udid&&(!r(a)||t.udid!==a.id)&&n.push({key:`udid`,value:t.udid}),t.serial&&(!i(a.platform)||t.serial!==a.id)&&n.push({key:`serial`,value:t.serial}),t.device&&t.device.trim().toLowerCase()!==a.name.trim().toLowerCase()&&n.push({key:`device`,value:t.device}),t.iosSimulatorDeviceSet){let e=t.iosSimulatorDeviceSet.trim(),i=a.simulatorSetPath?.trim();(!r(a)||a.kind!==`simulator`||e!==i)&&n.push({key:`iosSimulatorDeviceSet`,value:t.iosSimulatorDeviceSet})}if(t.androidDeviceAllowlist){let e=c(t.androidDeviceAllowlist);(a.platform!==`android`||!e.has(a.id))&&n.push({key:`androidDeviceAllowlist`,value:t.androidDeviceAllowlist})}return n}function w(e){return`${T(e.key)}=${e.value}`}function T(e){switch(e){case`iosSimulatorDeviceSet`:return`--ios-simulator-device-set`;case`androidDeviceAllowlist`:return`--android-device-allowlist`;default:return`--${e}`}}const E=`default`,D=new Set(a);function O(e,t,n={}){let r=e.session||E;if(P(e))return r;let i=j(e);return i.kind===`cwd`?I(e,t,i.id,n):r}function k(e){return e.session||E}function A(e){let t=j(e);return t.kind===`cwd`?t:void 0}function j(t){if(t.meta?.sessionIsolation===`tenant`||t.flags?.sessionIsolation===`tenant`){let n=t.meta?.tenantId;if(!n)throw new e(`INTERNAL_ERROR`,`Tenant-scoped request reached session routing without an admitted tenant id`);return{kind:`tenant`,id:n}}if(P(t)||(t.session||E)!==E)return{kind:`named-local`};let n=J(t.meta?.cwd);return n?{kind:`cwd`,id:q(n)}:{kind:`global-default`}}function M(e,t){let n=e.sessionScope;return n?t.kind===`tenant`?n.kind===`tenant`&&n.id===t.id:n.kind===`tenant`?!1:t.kind!==`cwd`||n.kind===`named-local`||n.kind===`cwd`&&n.id===t.id:!1}function N(e,t){let n=A(e);return!n||t.sessionScope?.kind!==`cwd`?!1:t.sessionScope.id!==n.id}function P(e){if(e.meta?.sessionExplicit===!0)return!0;let t=e.flags?.session;return typeof t==`string`&&t.trim().length>0}function F(e,t){return`cwd:${e}:${t}`}function I(e,t,n,r){let i=H(t,n),a=U(e);return a?L(e,t,n,a,i,r):V(n,i,r)}function L(e,t,n,r,i,a){let o=F(n,r);if(t.get(o))return o;let s=B(e.flags,r),c=i.map(e=>({ref:e,conflicts:C(e.session,s)})),l=c.filter(e=>e.conflicts.length===0),[u]=l;return u&&l.length===1?u.ref.address:l.length>1?(G(a,l.map(e=>e.ref)),o):R(c)?.address??o}function R(e){return e.find(e=>!z(e.conflicts))?.ref}function z(e){return e.some(e=>e.key===`platform`)}function B(e,t){return{...e,platform:t}}function V(e,t,n){let[r]=t;return r&&t.length===1?r.address:(G(n,t),F(e,E))}function H(e,t){let n=new Set,r=[];for(let i of e.listRefs()){let e=i.session.sessionScope;e?.kind===`cwd`&&e.id===t&&(n.has(i.session)||(n.add(i.session),r.push(i)))}return r}function U(e){return W(e.flags?.platform)??W(e.meta?.lockPlatform)}function W(e){if(typeof e!=`string`)return;let t=e.trim().toLowerCase();return D.has(t)?t:void 0}function G(e,t){if(t.length>1&&e.attachesToSession===!0)throw K(t)}function K(t){let r=t.map(e=>e.address),i=t.map(e=>n(e.session.device)),a=i.map(e=>`--platform ${e}`).join(` or `);return new e(`AMBIGUOUS_MATCH`,`This workspace has ${t.length} implicit sessions (${r.join(`, `)}); select one explicitly.`,{sessions:r,platforms:i,hint:`Run agent-device session list to inspect them. Add ${a} to run in that platform's session, or pass --session <address> copied from that list.`})}function q(e){return d.createHash(`sha256`).update(e).digest(`hex`).slice(0,16)}function J(e){if(!e||e.trim().length===0)return;let t=Y(e);return X(t)??t}function Y(e){let t=l.resolve(e);try{return u.realpathSync.native(t)}catch{return t}}function X(e){let t=e;for(;;){if(u.existsSync(l.join(t,`.git`)))return t;let e=l.dirname(t);if(e===t)return;t=e}}export{j as a,w as c,h as d,p as f,k as i,C as l,N as n,M as o,f as p,O as r,S as s,P as t,m as u};
@@ -1 +1 @@
1
- import{D as e,o as t}from"./sdk-contracts.js";function n(e,n){if(!n.available)return t(`UNSUPPORTED_OPERATION`,`${e} is not supported on this device`,{reason:n.reason},n.hint?{hint:n.hint}:void 0)}function r(t){if(t)return t;throw new e(`COMMAND_FAILED`,`Device runtime facts inspection is unavailable.`)}const i=new WeakMap;let a;(class e{static{a=(t,n)=>{let r=new e;return i.set(r,{device:Object.freeze({...t}),plan:n}),Object.freeze(r),r}}#e;constructor(){this.#e=void 0}get admitted(){return this.#e,!0}});function o(t){let n=i.get(t);if(n===void 0)throw new e(`COMMAND_FAILED`,`Runtime plan admission is not one minted by admitRuntimePlan; refusing to bind.`);return n}async function s(e){let t=await r(e.inspectFacts)(e.device);for(let n of e.plan.use.required){let e=t.operations[n];if(!e.available)return{admitted:!1,operation:n,fact:e}}return a(e.device,e.plan)}function c(t){if(t)return t;throw new e(`COMMAND_FAILED`,`Device runtime binding is unavailable.`)}export{o as a,n as i,c as n,r,s as t};
1
+ import{O as e}from"./sdk-contracts.js";import{v as t}from"./session-snapshot.js";function n(e,n){return n.available?void 0:t(e,n)}function r(t){if(t)return t;throw new e(`COMMAND_FAILED`,`Device runtime facts inspection is unavailable.`)}const i=new WeakMap;let a;(class e{static{a=(t,n)=>{let r=new e;return i.set(r,{device:Object.freeze({...t}),plan:n}),Object.freeze(r),r}}#e;constructor(){this.#e=void 0}get admitted(){return this.#e,!0}});function o(t){let n=i.get(t);if(n===void 0)throw new e(`COMMAND_FAILED`,`Runtime plan admission is not one minted by admitRuntimePlan; refusing to bind.`);return n}async function s(e){let t=await r(e.inspectFacts)(e.device);for(let n of e.plan.use.required){let e=t.operations[n];if(!e.available)return{admitted:!1,operation:n,fact:e}}return a(e.device,e.plan)}function c(t){if(t)return t;throw new e(`COMMAND_FAILED`,`Device runtime binding is unavailable.`)}export{o as a,n as i,c as n,r,s as t};
@@ -1 +1 @@
1
- import{D as e,S as t,_ as n,b as r,f as i,o as a}from"./sdk-contracts.js";import{u as o}from"./capture.js";import{r as s}from"./snapshot-capture-annotations.js";import{r as c}from"./snapshot-diagnostics.js";import{f as l}from"./android-input-ownership.js";import{b as u,l as d,p as f}from"./sdk-device.js";import{Ar as p,Bt as ee,Kn as te,Tt as ne,Vn as re,Wt as ie,Yn as ae,Zn as oe,ct as se,dt as ce,ht as le,ir as ue,lt as de,nr as fe,qn as pe,ut as me,xt as he}from"./sdk-batch.js";import{A as ge,I as _e,L as ve,M as ye,P as be,R as xe,T as Se,a as Ce,g as we,o as Te,t as Ee,x as m}from"./runtime.js";import{r as h}from"./success-text.js";import{i as g}from"./click-button.js";import{a as De,r as _}from"./diagnostics.js";import{t as v}from"./timeouts.js";import"./diagnostics2.js";import"./retry.js";import{i as Oe}from"./rect-center.js";import{t as ke}from"./snapshot-state.js";import{n as Ae}from"./request-runtime-binding.js";import{i as je}from"./lease-context.js";import{s as Me}from"./tree.js";import{t as Ne}from"./interactor-types.js";import{randomInt as Pe}from"node:crypto";function y(e){return e.matchedRefs.length===0?{path:2,outcome:`unverifiable`,reason:`selector-miss`}:e.identitySetRefs.length===0?{path:3,outcome:`unverifiable`,reason:`identity-set-empty`}:e.identitySetRefs.length===1?e.identitySetRefs[0]===e.winnerRef?{path:4,outcome:`verified`}:{path:5,outcome:`unverifiable`,reason:`unique-but-wrong`}:e.siblingMatchRefs.length===1?e.siblingMatchRefs[0]===e.winnerRef?{path:6,outcome:`verified`}:{path:6,outcome:`unverifiable`,reason:`signal-isolated-wrong`}:e.regionMemberRefs!==void 0&&e.regionMemberRefs.length>0&&e.viewportCandidateRef!==void 0?e.viewportCandidateRef===e.winnerRef?{path:6,outcome:`verified`}:{path:6,outcome:`unverifiable`,reason:`signal-isolated-wrong`}:{path:6,outcome:`unverifiable`,reason:`no-signal-isolation`}}let b={resolve:async()=>{throw new e(`COMMAND_FAILED`,`Interactor resolution is not composed for this process.`,{reason:`interactor-resolution-missing`})}};function Fe(e){b=e}function Ie(){return b}var x=class e{#e;constructor(e){this.#e=e}get state(){return this.#e.state}get scope(){return this.#e.scope}get tree(){return this.#e.tree}get generation(){return this.#e.generation}static expire(t){return t.#e.state===`expired`?t:new e({...t.#e,state:`expired`})}};const Le=new x({state:`active`,scope:`all`,tree:void 0,generation:void 0});function Re(e){return new x({state:`active`,...e})}function ze(e){return x.expire(e)}const S=new WeakMap,C=new WeakSet;function w(e){return e.refFrame??Le}function T(e){return w(e).generation??e.snapshotGeneration}function Be(e){return w(e).tree}function Ve(e){Ue(e),E(e),e.refFrame=ze(w(e)),e.snapshotScopeSource=void 0}function E(e){e.snapshot&&C.add(e.snapshot)}function He(e){return C.has(e)}function Ue(e){let t=D(e)+1;return S.set(e,t),t}function D(e){return S.get(e)??0}function We(e){O(e,`all`)}function Ge(e,t){O(e,t)}function O(e,t){e.refFrame=Re({scope:t,tree:e.snapshot,generation:e.snapshotGeneration})}function k(e){return w(e).state}function A(e){return w(e).scope}function Ke(e){let t=e.ref.startsWith(`@`)?e.ref.slice(1):e.ref;return{admission:qe({session:e.session,refBody:t,mintedGeneration:e.mintedGeneration}),scope:A(e.session),currentGeneration:T(e.session)}}function qe(e){let{session:t,refBody:n,mintedGeneration:r}=e;if(k(t)===`expired`)return{admitted:!1,reason:`ref_frame_expired`};if(r!==void 0&&r!==T(t))return{admitted:!1,reason:`ref_generation_mismatch`};let i=A(t);if(i!==`all`){if(r===void 0)return{admitted:!1,reason:`plain_ref_requires_complete_frame`};if(!i.has(n))return{admitted:!1,reason:`ref_not_issued`}}return{admitted:!0}}const Je=[250,400,600];function j(e){return e===`press`||e===`click`||e===`back`||e===`open`}function M(e){return e.map(e=>[e.depth??0,e.type??``,e.label??``,e.value??``,e.identifier??``,e.enabled===!1?`disabled`:`enabled`,e.hittable===!0?`hittable`:`not-hittable`].join(`|`))}function Ye(e,t){return e<12?!1:t<=Math.floor(e*.2)}function Xe(e,t,n){return n.interactiveOnly&&e.snapshot.nodes.length===0&&e.rawNodeCount!==void 0&&e.rawNodeCount>=12?`empty-interactive`:n.mode===`ref-refresh`?null:Ye(t.baselineCount,e.snapshot.nodes.length)?Ze(e.snapshot)?null:`sharp-drop`:t.routeComparable&&j(t.action)&&Qe(t.baselineSignatures,e.snapshot.nodes)?`stuck-route`:null}function Ze(e){return e.nodes.some(e=>e.hittable===!0||!!e.label?.trim()||!!e.value?.trim()||!!e.identifier?.trim())}function Qe(e,t){if(!e||e.length===0)return!1;let n=Math.max(e.length,t.length);if(n<12)return!1;let r=M(t),i=Math.min(e.length,r.length),a=0;for(let t=0;t<i;t+=1)e[t]===r[t]&&(a+=1);let o=Math.max(0,r.length-e.length),s=Math.max(0,e.length-r.length),c=Math.max(3,Math.floor(n*.15));return a>=Math.floor(n*.9)&&o<=c&&s<=c}async function $e(e){let t=e.window.markedAt+e.retry.retryBudgetMs,n=await e.capture(),r=e.classify(n),i=0;for(let a of e.retry.delaysMs){if(!r)break;let o=t-Date.now();if(o<=0)break;await v(Math.min(a,o)),n=await e.capture(),i+=1,r=e.classify(n)}r||e.onTrustworthyCapture?.();let a=i>0||r?{action:e.window.action,retryCount:i,staleAfterRetries:!!r,reason:r??void 0}:void 0;return{...n,annotations:{...n.annotations,...s({freshness:a})}}}function et(e,t,n=e.snapshot){if(e.device.platform!==`android`)return;let r=tt(e,n),i=r?.comparisonSafe===!0;e.androidSnapshotFreshness={action:t,markedAt:Date.now(),baselineCount:(r??n)?.nodes.length??0,baselineSignatures:i?M(r?.nodes??[]):void 0,routeComparable:i}}function tt(e,t){if(t?.comparisonSafe===!0)return t;let n=e.lastComparisonSafeSnapshot;return!n||n.comparisonSafe!==!0?t:Date.now()-n.createdAt<=5e3?n:t}function N(e){if(!e||e.device.platform!==`android`)return;let t=e.androidSnapshotFreshness;if(t){if(Date.now()-t.markedAt>2500){delete e.androidSnapshotFreshness;return}return t}}function P(e){!e||e.device.platform!==`android`||delete e.androidSnapshotFreshness}async function F(e,t){return $e({capture:e.capture,classify:n=>Xe({snapshot:n.snapshot,rawNodeCount:n.annotations.analysis?.rawNodeCount},t,{interactiveOnly:e.interactiveOnly,mode:e.androidFreshnessMode}),window:t,retry:{retryBudgetMs:1500,delaysMs:Je},onTrustworthyCapture:()=>P(e.session)})}function nt(e,t){return t?{...e,warnings:[...e.warnings??[],ye(t.action,t.positionals)]}:e}const rt=`activity.launchConsole.launchArgs.clearAppState.verbose.iosXctestrunFile.iosXctestDerivedDataPath.iosXctestEnvDir.snapshotInteractiveOnly.snapshotPreferredBackend.snapshotDepth.snapshotScope.snapshotRaw.snapshotCustomActions.snapshotIncludeHiddenContentHints.count.intervalMs.delayMs.durationMs.holdMs.jitterPx.pixels.until.doubleTap.backMode.pauseMs.pattern`.split(`.`);function it(e){return Object.fromEntries(rt.map(t=>[t,e?.[t]]))}function I(e,t,n,r,i,a){return{requestId:i??De().requestId,appBundleId:n,runnerLeaseContext:je({meta:a}),logPath:e,traceLogPath:r,...it(t),screenshotCaptureBackend:t?.maestro?.screenshotCaptureBackend,...o(t),clickButton:g(t)}}function at(e){return e?.interactionOutcome?.retryOnNoChange===!0}function ot(e){let{session:t,command:n,positionals:r,flags:i,preSnapshot:a}=e;if(!at(i)||!vt(t))return;let o=bt(n);if(!o||!Tt(r))return;let s=V(a?.nodes??[]);s.length!==0&&(t.pendingInteractionOutcome={action:n,command:o,positionals:r,flags:B(i),markedAt:Date.now(),attemptsRemaining:2,preSignature:s})}function st(e){let t=e?.pendingInteractionOutcome;if(!(!e||!t)){if(!vt(e)){L(e);return}if(Date.now()-t.markedAt>3e4){L(e);return}return t}}function L(e){e?.pendingInteractionOutcome&&(e.pendingInteractionOutcome=void 0)}async function R(e){let{pending:t,snapshot:n}=e,r=dt(t.preSignature,V(n.nodes));if(r!==`unchanged`||t.attemptsRemaining<=0)return{retried:!1,change:r};let i=e.retryTap,a=i?yt(t.positionals):void 0;if(!i||!a)return z(t,i?`unreadable-retry-point`:`device-runtime-unavailable`),{retried:!1,change:r};let o=Date.now();return--t.attemptsRemaining,await ct(i,e)?(_({level:`info`,phase:`interaction_no_change_retry`,data:{action:t.action,attemptsRemaining:t.attemptsRemaining,durationMs:Date.now()-o}}),{retried:!0,change:r}):(z(t,`retry-tap-unavailable`),{retried:!1,change:r})}async function ct(e,t){let{session:n,pending:r}=t,i=yt(r.positionals);if(!i)return!1;try{return await e({device:n.device,point:i,context:{...I(t.logPath,r.flags,n.appBundleId,n.trace?.outPath),surface:n.surface}})}catch{return!1}}function z(e,t){_({level:`info`,phase:`interaction_no_change_retry_skipped`,data:{action:e.action,attemptsRemaining:e.attemptsRemaining,reason:t}})}function lt(e){_({level:e.attempts>0?`info`:`debug`,phase:`interaction_settled`,data:{action:e.pending.action,change:e.change,attempts:e.attempts,durationMs:Date.now()-e.startedAt}})}function ut(e){_({level:`warn`,phase:`interaction_settle_timeout`,data:{action:e.pending.action,attempts:e.attempts,durationMs:Date.now()-e.startedAt}})}function B(e){if(!e?.interactionOutcome&&!e?.postGestureStabilization)return e;let{interactionOutcome:t,postGestureStabilization:n,...r}=e;return r}function V(e){let t=new Map,n=[],r=ge(e);for(let i of e){let e=xt(i,t,r);e&&n.push(e)}return n}function H(e){return e?.comparisonKey??e?.snapshotQuality?.backend}function dt(e,t){return e.length===0||t.length===0?`ambiguous`:W(e,t)?`unchanged`:`changed`}function U(e,t){return Math.abs(e.x-t.x)<=1&&Math.abs(e.y-t.y)<=1&&Math.abs(e.width-t.width)<=1&&Math.abs(e.height-t.height)<=1}function W(e,t){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n+=1){let r=e[n],i=t[n];if(!r||!i||r.key!==i.key||!U(r,i))return!1}return!0}function ft(e,t){let n=pt(e),r=pt(t);if(n.size===0||r.size===0)return`ambiguous`;let i=0,a=!1;for(let[e,t]of n){let n=r.get(e);if(!n){a=!0;continue}if(i+=1,!U(t,n))return`changed`}if(i===0)return`ambiguous`;let o=r.size>i;return a&&o?`changed`:`unchanged`}function pt(e){let t=new Map;for(let n of e)!n.identity||!n.discriminating||t.has(n.identity)||t.set(n.identity,n);return t}function mt(e,t){let n=e.filter(e=>e.discriminating),r=t.filter(e=>e.discriminating);if(n.length===0||n.length!==r.length)return!1;let i=new Map(r.map(e=>[e.key,e]));for(let e of n){let t=i.get(e.key);if(!t||!U(e,t))return!1}return!0}function ht(e,t){let n=new Map(t.filter(e=>e.discriminating).map(e=>[e.key,e])),r=0,i=0,a=0;for(let t of e){if(!t.discriminating)continue;let e=n.get(t.key);if(!e){r+=1;continue}n.delete(t.key),a+=1,U(t,e)||(i+=1)}return{onlyInBaseline:r,onlyInCurrent:n.size,rectMismatched:i,shared:a}}function gt(e,t,n){let r=_t(e,n),i=new Map(_t(t,n).map(e=>[e.key,e]));for(let e of r){let t=i.get(e.key);if(!t||!U(e,t))return!0;i.delete(e.key)}return i.size>0}function _t(e,t){return e.filter(e=>e.discriminating&&e.x<t.x+t.width&&t.x<e.x+e.width&&e.y<t.y+t.height&&t.y<e.y+e.height)}function vt(e){return f(e.device)}function yt(e){let t=Number(e[0]),n=Number(e[1]);return Number.isFinite(t)&&Number.isFinite(n)?{x:t,y:n}:void 0}function bt(e){if(e===`click`||e===`press`)return`press`}function xt(e,t,n){if(!e.rect||!Et(e.rect)||Dt(e))return;let r=wt(e);if(!r)return;let i=t.get(r)??0;t.set(r,i+1);let a=St(e);return{key:`${r}|#${i}`,...a?{identity:a}:{},x:Math.round(e.rect.x),y:Math.round(e.rect.y),width:Math.round(e.rect.width),height:Math.round(e.rect.height),discriminating:!Ct(e,n)}}function St(e){let t=[e.identifier,e.label,e.value].map(e=>typeof e==`string`?e.trim():``).join(`|`);if(t.replaceAll(`|`,``))return`${t}|${e.type??``}`}function Ct(e,t){return p(e)||e.ref!==void 0&&t.has(e.ref)}function wt(e){let t=[e.identifier,e.label,e.value,e.type,e.role,e.enabled===!1?`disabled`:`enabled`,e.selected===!0?`selected`:`unselected`,e.hittable===!0?`hittable`:`not-hittable`].map(e=>typeof e==`string`?e.trim():``).join(`|`);return t.replaceAll(`|`,``)?t:void 0}function Tt(e){return e.length===2&&e.every(e=>Number.isFinite(Number(e)))}function Et(e){return[e.x,e.y,e.width,e.height].every(e=>Number.isFinite(e))&&e.width>0&&e.height>0}function Dt(e){return`${e.label??``} ${e.identifier??``}`.toLowerCase().includes(`scroll bar`)}function Ot(e){let{session:t,command:n,action:r=n,positionals:i,flags:a,scheduleOutcomeRetry:o=!1,androidFreshnessBaseline:s}=e;o&&ot({session:t,command:n,positionals:i,flags:a,preSnapshot:t.snapshot}),j(r)&&et(t,r,s??t.snapshot),kt(t,r,i,a)}function kt(e,t,n=[],r){if(!zt(e.device)||!Rt(t,n,r))return;let i=Bt(e.device)?V(e.snapshot?.nodes??[]):void 0;e.postGestureStabilization={action:t,positionals:n,markedAt:Date.now(),...i?.length?{baselineSignature:i,baselineBackend:H(e.snapshot)}:{}}}function At(e){e?.postGestureStabilization&&(e.postGestureStabilization=void 0)}function jt(e){return!!e?.postGestureStabilization}async function Mt(e){let t=st(e.session);if(t&&e.session)return await Nt({...e,session:e.session},t);if(f(e.device)&&e.session&&jt(e.session))return await Ft({...e,session:e.session});let n=N(e.session);if(n&&e.device.platform===`android`){let t=await F(e,n);return{snapshot:t.snapshot,...t.annotations}}}async function Nt(e,t){let n=e.session,r=Date.now(),i=0,a=await Pt(e,t,await G(e)),o=await R({session:n,pending:t,logPath:e.logPath,snapshot:a.snapshot,retryTap:e.retryTap});for(;o.retried;)i+=1,a=await Pt(e,t,await G(e)),o=await R({session:n,pending:t,logPath:e.logPath,snapshot:a.snapshot,retryTap:e.retryTap});L(n);let s=await It({session:n,initial:a,capture:async()=>await G(e),readSnapshot:e=>e.snapshot});return a=s.value,o.change!==`ambiguous`&&a.annotations.freshness?.staleAfterRetries!==!0&&P(n),o.change===`unchanged`?ut({pending:t,attempts:i,startedAt:r}):lt({pending:t,change:o.change,attempts:i,startedAt:r}),Lt(s)}async function Pt(e,t,n){let r=n;return dt(t.preSignature,V(r.snapshot.nodes))===`unchanged`?(await v(500),r=await G(e),r):r}async function Ft(e){return Lt(await It({session:e.session,capture:async()=>await G(e),readSnapshot:e=>e.snapshot}))}async function G(e){let t=N(e.session);return t&&e.device.platform===`android`?await F(e,t):await e.capture()}async function It(e){let{session:t,capture:n,readSnapshot:r}=e,i=t?.postGestureStabilization;if(!t||!zt(t.device)||!i)return{value:e.initial??await n()};let a=await be({pending:{action:i.action,positionals:i.positionals??[],baselineSignature:i.baselineSignature,baselineBackend:i.baselineBackend},needsBaselineDistrust:Bt(t.device),initial:e.initial,hooks:{capture:n,readSurface:e=>{let t=r(e);return{signature:V(t.nodes),backend:H(t)}},signaturesStable:W,classifyBaselineEvidence:ft,surfacesIdentical:mt,summarizeDivergence:ht}});return At(t),a}function Lt(e){let{snapshot:t,annotations:n}=e.value;return e.unsettledGesture&&(t.unsettledGesture=e.unsettledGesture),{snapshot:t,...nt(n,e.gestureNoEffect)}}function Rt(e,t,n){return n?.postGestureStabilization===!1?!1:n?.postGestureStabilization===!0||e===`swipe`||e===`scroll`||e===`gesture`&&t[0]===`swipe`}function zt(e){return f(e)}function Bt(e){return d(e.platform)}function Vt(e,t={}){let n=t.mode??`action`,{node:r,preActionNodes:i}=e;if(typeof r.index!=`number`)return;let a=ve(i),o=re(K(r),i);if(n===`landmark`&&o.id===void 0&&o.label===void 0)return;let s=_e(r,a,8),c=s.chain,l=q(i,r),u=J(r,a),d=Kt(r),f=+(c.length>0),p=e=>{let t=c.slice(0,e),n=qt({nodes:i,byIndex:a,node:r,identity:o,ancestry:t,sibling:l,scrollRegion:u});return{candidate:{...o,ancestry:t,sibling:l,viewportOrder:n.viewportOrder,...u?{scrollRegion:u}:{},...d?{rect:d}:{},verification:`verified`},domain:n}};for(let e=c.length;e>=f;--e){let{candidate:t,domain:i}=p(e);if(Ut(t))return t.verification=Ht({node:r,domain:i,mode:n,brokenWalk:s.broken}),t;if(e===f)return Wt(t)}}function Ht(e){return e.brokenWalk?`unverifiable`:e.mode===`landmark`?`verified`:Yt({node:e.node,domain:e.domain})}function Ut(e){return ue(fe({...e,verification:`unverifiable`}))<=oe}function Wt(e){return e.verification=`unverifiable`,ue(fe(e))>4096&&delete e.rect,e}const K=pe;function q(e,t){return ae(e,t)}function J(e,t){let n=Me(e,t);if(!n)return;let r=K(n);return{role:r.role,...r.id===void 0?r.label===void 0?{}:{label:r.label}:{id:r.id}}}function Gt(e,t){return!e&&!t?!0:!e||!t?!1:te(e,t)}function Kt(e){let t=e.rect;if(t)return{x:t.x,y:t.y,width:t.width,height:t.height}}function qt(e){let{nodes:t,byIndex:n,node:r,identity:i,ancestry:a,sibling:o,scrollRegion:s}=e,c=xe(t,n,i,a),l=c.filter(e=>q(t,e)===o),u=c.length>0?c.filter(e=>Gt(J(e,n),s)):void 0,d=u?Jt(u):[];return{identitySet:c,siblingMatches:l,regionMembers:u,orderedRegion:d,viewportOrder:Math.max(d.findIndex(e=>e.index===r.index),0)}}function Jt(e){return e.map((e,t)=>({node:e,documentOrder:t,center:Oe(e.rect)})).sort((e,t)=>!e.center&&!t.center?e.documentOrder-t.documentOrder:e.center?t.center?e.center.y===t.center.y?e.center.x===t.center.x?e.documentOrder-t.documentOrder:e.center.x-t.center.x:e.center.y-t.center.y:-1:1).map(e=>e.node)}function Yt(e){let{node:t,domain:n}=e,r=t.ref,i=n.identitySet.map(e=>e.ref);return y({winnerRef:r,matchedRefs:i,identitySetRefs:i,siblingMatchRefs:n.siblingMatches.map(e=>e.ref),regionMemberRefs:n.regionMembers?.map(e=>e.ref),viewportCandidateRef:n.orderedRegion[n.viewportOrder]?.ref}).outcome}let Y;async function Xt(){if(Y)return Y;let{createAppleSessionObservation:e}=await import(`./session-observation.js`),{listLocalDeviceInventory:t,shouldPropagateDeviceInventoryProbeError:n}=await import(`./device-inventory-context.js`).then(e=>e.t);return Y??=e({listLocalDevices:t,shouldPropagateProbeError:n}),Y}const Zt=Object.freeze({async observeRunnerSession(e){return(await Xt()).observeRunnerSession(e)},async resolveSoleForegroundApp(e){return(await Xt()).resolveSoleForegroundApp(e)}});async function Qt(e,t,n,r){let{queryAppleRunnerSelector:i}=await import(`./runner-operations-facade.js`);return await i(e,t,n,r)}async function X(e){let t=await tn(e.inspectFacts)(e.device);for(let n of e.required){let r=t.operations[n];if(!r.available)return{type:`response`,response:e.unavailableResponse?e.unavailableResponse(r):a(`UNSUPPORTED_OPERATION`,`${e.command} is not supported on this device`,void 0,r.hint?{hint:r.hint}:void 0)}}return{type:`admitted`,bind:nn(e.bindDevice)}}async function $t(e){let t=await X({...e,required:e.use.required});if(t.type===`response`)return t;let n=await t.bind(e.device,e.use);return e.readiness&&await Ae(n),{type:`runtime`,runtime:n}}async function en(e,t){let n=await $t(e);if(n.type===`response`)return{ok:!1,response:n.response};let r=n.runtime;return{ok:!0,execute:async({dispatchContext:e})=>await t(r,e)}}function tn(t){if(t)return t;throw new e(`COMMAND_FAILED`,`Device runtime facts inspection is unavailable.`,{reason:`runtime-gateway-missing`})}function nn(t){if(t)return t;throw new e(`COMMAND_FAILED`,`Device runtime binding is unavailable.`,{reason:`runtime-gateway-missing`})}function rn(e){let{flags:n,logPath:r,meta:a,session:o,snapshotScope:s}=e,{appBundleId:c,trace:l,surface:u}=o??{},d=e.context??I(r??``,n,c,l?.outPath,a?.requestId,a);return{options:{appBundleId:c,...t(n,i),scope:s,includeRects:e.includeRects,surface:u},execution:Z(d),...e.signal===void 0?{}:{signal:e.signal}}}function Z(e){return{requestId:e.requestId,verbose:e.verbose,logPath:e.logPath,traceLogPath:e.traceLogPath,iosXctestrunFile:e.iosXctestrunFile,iosXctestDerivedDataPath:e.iosXctestDerivedDataPath,iosXctestEnvDir:e.iosXctestEnvDir,runnerLeaseContext:e.runnerLeaseContext}}function an(e){let t=we(e);return{...t,capture:Ee(t),selectors:Te(t),interactions:Ce(t)}}async function on(e){let t=await(await Ie().resolve(e.device,e.runnerContext)).snapshot(e.options);if(!(`stage`in t))return t;let{presentIosSnapshotAcquisition:n}=await import(`./ios-snapshot-runtime.js`);return await n(t,e.options)}function sn(e){let t=e?e.textEntryReadiness:void 0,n=fn(t)?{textEntryReadiness:t}:{},r=cn(e);return r?{...n,...r}:n}function cn(e){if(!ln(e))return null;let t=un(e.target);return t?{verification:`unconfirmed`,requested:e.requested,before:e.before,after:e.after,target:t}:null}function ln(e){return!!(e&&e.verification===`unconfirmed`&&typeof e.requested==`string`&&Q(e.before)&&Q(e.after))}function un(e){if(!mn(e)||!dn(e))return null;let t=pn(e.rect);return t?{resourceId:e.resourceId,className:e.className,packageName:e.packageName,rect:t}:null}function dn(e){return Q(e.resourceId)&&Q(e.className)&&Q(e.packageName)}function fn(e){return typeof e==`string`&&Ne.includes(e)}function Q(e){return e===null||typeof e==`string`}function pn(e){return!mn(e)||![e.x,e.y,e.width,e.height].every(e=>typeof e==`number`)?null:e}function mn(e){return!!e&&typeof e==`object`}async function hn(e){let t={device:e.device,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice},n=ee(e.command,e.requiresCapture),r=await X({command:e.command,required:n.use.required,...e.unavailableResponse?{unavailableResponse:e.unavailableResponse}:{},...t});if(r.type===`response`)return{ok:!1,response:r.response};let i=r.bind;switch(n.kind){case`tap-point`:return{ok:!0,runtime:{kind:`tap`,captured:!1,runtime:await i(e.device,ie)}};case`captured-tap`:return{ok:!0,runtime:{kind:`tap`,captured:!0,runtime:await i(e.device,ce)}};case`long-press-point`:return{ok:!0,runtime:{kind:`long-press`,captured:!1,runtime:await i(e.device,ne)}};case`captured-long-press`:return{ok:!0,runtime:{kind:`long-press`,captured:!0,runtime:await i(e.device,me)}};case`hover-point`:return{ok:!0,runtime:{kind:`hover`,captured:!1,runtime:await i(e.device,he)}};case`captured-hover`:return{ok:!0,runtime:{kind:`hover`,captured:!0,runtime:await i(e.device,de)}};case`fill-point`:return{ok:!0,runtime:{kind:`fill`,captured:!1,runtime:await i(e.device,le)}};case`captured-fill`:return{ok:!0,runtime:{kind:`fill`,captured:!0,runtime:await i(e.device,se)}}}}function gn(e,t){let n={execution:Z(t),appBundleId:t.appBundleId},r=e.captured?Sn(e.runtime):void 0;switch(e.kind){case`tap`:return _n(e,t,n,r);case`long-press`:return vn(e,n,r);case`hover`:return yn(e,n,r);case`fill`:return bn(e,t,n,r)}}function _n(e,t,n,r){let i=e.captured?e.runtime.operations.tapRef:void 0,a=e.captured?e.runtime.operations.tapElementSelector:void 0;return Object.freeze({captureSnapshot:r,tapPoint:async(r,i={})=>{let a=Cn(i,t),o=await e.runtime.operations.tapPoint({point:r,options:a,...n});return{x:r.x,y:r.y,count:a.count,intervalMs:a.intervalMs,holdMs:a.holdMs,jitterPx:a.jitterPx,doubleTap:a.doubleTap,...a.button===`primary`?{}:{button:a.button},...o??{},...h(En(r,a.button))}},tapRef:i?async e=>await i({ref:e,...n}):void 0,tapElementSelector:e.captured&&a?async t=>{let r=await e.runtime.operations.tapElementSelector?.({selector:t,...n}),i=r?.maestroNonHittableCoordinateFallbackUsed===!0;return{selector:t.raw,...r??{},...h(i?`tapped via non-hittable coordinate fallback`:`Tapped ${t.raw}`)}}:void 0})}function vn(e,t,n){return Object.freeze({captureSnapshot:n,longPressPoint:async(n,r)=>{let i=await e.runtime.operations.longPressPoint({point:n,durationMs:r,...t});return{x:n.x,y:n.y,durationMs:r,...i??{},...h(`Long pressed (${n.x}, ${n.y})`)}}})}function yn(e,t,n){let r=e.captured?e.runtime.operations.hoverRef:void 0;return Object.freeze({captureSnapshot:n,hoverPoint:async n=>{let r=await e.runtime.operations.hoverPoint({point:n,...t});return{x:n.x,y:n.y,...r??{},...h(`Hovered (${n.x}, ${n.y})`)}},hoverRef:r?async e=>await r({ref:e,...t}):void 0})}function bn(e,t,n,r){let i=e.captured?e.runtime.operations.fillRef:void 0,a=e=>m(e??t.delayMs??0,`delay-ms`,0,1e4);return Object.freeze({captureSnapshot:r,fillPoint:async(t,r,i={})=>{let o=a(i.delayMs),s=await e.runtime.operations.fillPoint({point:t,text:r,delayMs:o,allowNonHittableCoordinateFallback:i.allowNonHittableCoordinateFallback===!0,...n});return{x:t.x,y:t.y,text:r,delayMs:o,...xn(s)?{maestroNonHittableCoordinateFallbackUsed:!0}:{},...sn(s),...h(`Filled ${Array.from(r).length} chars`)}},fillRef:i?async(e,t,r={})=>await i({ref:e,text:t,delayMs:a(r.delayMs),...n}):void 0})}function xn(e){return typeof e==`object`&&!!e&&`maestroNonHittableCoordinateFallbackUsed`in e&&e.maestroNonHittableCoordinateFallbackUsed===!0}function Sn(e){return async t=>await e.operations.captureSnapshot(t)}function Cn(e,t){let n=wn(e,t);return Tn(n),{button:e.button??g(t),...n,surface:e.surface??t.surface}}function wn(e,t){return{count:$(e.count,t.count,1,`count`,1,200),intervalMs:$(e.intervalMs,t.intervalMs,0,`interval-ms`,0,1e4),holdMs:$(e.holdMs,t.holdMs,0,`hold-ms`,0,1e4),jitterPx:$(e.jitterPx,t.jitterPx,0,`jitter-px`,0,100),doubleTap:e.doubleTap??t.doubleTap??!1}}function $(e,t,n,r,i,a){return m(e??t??n,r,i,a)}function Tn(t){if(t.doubleTap&&t.holdMs>0)throw new e(`INVALID_ARGS`,`double-tap cannot be combined with hold-ms`);if(t.doubleTap&&t.jitterPx>0)throw new e(`INVALID_ARGS`,`double-tap cannot be combined with jitter-px`)}function En(e,t){return t===`primary`?`Pressed (${e.x}, ${e.y})`:`${t===`secondary`?`Right`:`Middle`} clicked (${e.x}, ${e.y})`}function Dn(e){let{inspectFacts:t,bindDevice:n}=e;if(!t||!n)return;let r=new Map;return async({device:e,point:i,context:a})=>{let o=r.get(e.id);o||(o=hn({device:e,command:`press`,requiresCapture:!1,inspectFacts:t,bindDevice:n}),r.set(e.id,o));let s=await o;if(!s.ok)return!1;let c=gn(s.runtime,a);return c.tapPoint?(await c.tapPoint(i),!0):!1}}async function On(e){let t=await Mt({session:e.session,device:e.device,logPath:e.logPath,interactiveOnly:e.flags?.snapshotInteractiveOnly===!0,androidFreshnessMode:e.androidFreshnessMode,capture:()=>An(e),retryTap:Dn(e)});if(t)return t;let n=await An(e);return P(e.session),{snapshot:n.snapshot,...n.annotations}}async function kn(e){if(e.captureData)return await e.captureData();let{device:n,session:r,logPath:a}=e,o=I(a,jn(e),r?.appBundleId,r?.trace?.outPath);return await on({device:n,runnerContext:{requestId:o.requestId,signal:e.signal,appBundleId:o.appBundleId,verbose:o.verbose,logPath:o.logPath,traceLogPath:o.traceLogPath,iosXctestrunFile:o.iosXctestrunFile,iosXctestDerivedDataPath:o.iosXctestDerivedDataPath,iosXctestEnvDir:o.iosXctestEnvDir,runnerLeaseContext:o.runnerLeaseContext},options:{appBundleId:o.appBundleId,signal:e.signal,...t(o,i),includeRects:e.includeRects,surface:r?.surface}})}async function An(e){let t=Date.now(),n=await kn(e);c(e.session,{durationMs:Date.now()-t,backend:n.backend,platform:u(e.device)});let r=s(n),i=l(n,ke(n,jn(e)));return r.androidSnapshot?.systemSurfaceOnly===!0&&(i.systemSurfaceOnly=!0),{data:n,snapshot:i,annotations:r}}function jn(e){return e.snapshotScope===void 0?e.flags:{...e.flags,snapshotScope:e.snapshotScope}}function Mn(e,t){if(!e||!e.trim().startsWith(`@`))return{ok:!0,scope:e};if(!t?.snapshot)return a(`INVALID_ARGS`,`Ref scope requires an existing snapshot in session.`);let i=r(e.trim());if(!i)return a(`INVALID_ARGS`,`Invalid ref scope: ${e}`);let o=[t.snapshot,...t.snapshotScopeSource?[t.snapshotScopeSource]:[]],s;for(let e of o){let t=n(e.nodes,i);if(s=t?Se(t,e.nodes):void 0,s)break}return s?{ok:!0,scope:s}:a(`COMMAND_FAILED`,`Ref ${e} not found or has no label`)}function Nn(e,t,n={}){if(!e)return;let r=Be(e);return{name:t,appBundleId:e.appBundleId,appName:e.appName,...n.includeSnapshot===!0?{snapshot:e.snapshot,...r&&n.omitRefFrameSnapshot!==!0?{refFrameSnapshot:r}:{}}:{},metadata:{surface:e.surface,...n.metadata??{}}}}function Pn(e){return{get:t=>t===e.sessionName?Nn(e.getSession(),e.sessionName,e.recordOptions):void 0,set:t=>{if(t.name!==e.sessionName){_({level:`warn`,phase:`runtime_session_write_skipped`,data:{expected:e.sessionName,received:t.name}});return}e.setRecord(t)}}}function Fn(e,t){e.snapshot!==t&&(e.snapshotGeneration=Ln(e.snapshotGeneration)),e.snapshot=t,e.snapshotScopeSource=void 0,t.comparisonSafe===!0&&(e.lastComparisonSafeSnapshot=t)}function In(e,t){e.snapshotScopeSource=t.scopeSource,e.snapshotGeneration=t.keptCurrentSnapshot?t.previousGeneration:Ln(t.previousGeneration)}function Ln(e){return e===void 0?Pe(1e5,1e6):e+1}function Rn(e){let t=e.startsWith(`@`)?e.slice(1):e,n=t.indexOf(`~`);return n===-1?t:t.slice(0,n)}function zn(e,t){let n=new Set;for(let e of t){let t=Rn(e);t.length>0&&n.add(t)}n.size!==0&&Ge(e,n)}function Bn(e,t){if(t?.diff)return zn(e,Vn(t)),e.snapshotGeneration}function Vn(e){let t=[];for(let n of e.diff?.lines??[])n.ref&&t.push(n.ref);for(let n of e.refs??[])t.push(n.ref);for(let n of e.tail??[])t.push(n.ref);return t}function Hn(e){return`Ref @${e.ref.startsWith(`@`)?e.ref.slice(1):e.ref} was minted from snapshot s${e.mintedGeneration} but the session's ref frame is now s${e.currentFrameEpoch} — re-run snapshot -i.`}function Un(e){let{session:t,ref:n,mintedGeneration:r}=e;if(t&&k(t)===`expired`)return`The UI may have changed since these refs were issued, so they no longer represent current device state. Take a new snapshot before relying on or interacting with them.`;if(r!==void 0){let e=t?T(t)??0:0;if(r!==e)return Hn({ref:n,mintedGeneration:r,currentFrameEpoch:e})}}export{ft as A,He as B,Vt as C,Ot as D,jt as E,ht as F,k as G,Ke as H,I,Fe as K,N as L,mt as M,H as N,W as O,B as P,We as R,q as S,Gt as T,D as U,E as V,w as W,en as _,In as a,K as b,kn as c,hn as d,an as f,$t as g,X as h,Fn as i,gt as j,V as k,Mn as l,Z as m,zn as n,Pn as o,rn as p,y as q,Un as r,On as s,Bn as t,gn as u,Zt as v,Jt as w,J as x,Qt as y,Ve as z};
1
+ import{C as e,O as t,_ as n,f as r,o as i,x as a}from"./sdk-contracts.js";import{u as o}from"./capture.js";import{r as s}from"./snapshot-capture-annotations.js";import{r as c}from"./snapshot-diagnostics.js";import{f as l}from"./android-input-ownership.js";import{b as u,l as d,p as f}from"./sdk-device.js";import{Ar as p,Bt as ee,Kn as te,Tt as ne,Vn as re,Wt as ie,Yn as ae,Zn as oe,ct as se,dt as ce,ht as le,ir as ue,lt as de,nr as fe,qn as pe,ut as me,xt as he}from"./sdk-batch.js";import{F as ge,I as _e,L as ve,M as ye,T as be,a as xe,g as Se,j as Ce,o as we,t as Te,x as m}from"./runtime.js";import{r as h}from"./success-text.js";import{i as g}from"./click-button.js";import{a as Ee,r as _}from"./diagnostics.js";import{t as v}from"./timeouts.js";import"./diagnostics2.js";import"./retry.js";import{i as De}from"./rect-center.js";import{t as Oe}from"./snapshot-state.js";import{n as ke}from"./request-runtime-binding.js";import{i as Ae}from"./lease-context.js";import{s as je}from"./tree.js";import{t as Me}from"./interactor-types.js";import{randomInt as Ne}from"node:crypto";function y(e){return e.matchedRefs.length===0?{path:2,outcome:`unverifiable`,reason:`selector-miss`}:e.identitySetRefs.length===0?{path:3,outcome:`unverifiable`,reason:`identity-set-empty`}:e.identitySetRefs.length===1?e.identitySetRefs[0]===e.winnerRef?{path:4,outcome:`verified`}:{path:5,outcome:`unverifiable`,reason:`unique-but-wrong`}:e.siblingMatchRefs.length===1?e.siblingMatchRefs[0]===e.winnerRef?{path:6,outcome:`verified`}:{path:6,outcome:`unverifiable`,reason:`signal-isolated-wrong`}:e.regionMemberRefs!==void 0&&e.regionMemberRefs.length>0&&e.viewportCandidateRef!==void 0?e.viewportCandidateRef===e.winnerRef?{path:6,outcome:`verified`}:{path:6,outcome:`unverifiable`,reason:`signal-isolated-wrong`}:{path:6,outcome:`unverifiable`,reason:`no-signal-isolation`}}let b={resolve:async()=>{throw new t(`COMMAND_FAILED`,`Interactor resolution is not composed for this process.`,{reason:`interactor-resolution-missing`})}};function Pe(e){b=e}function Fe(){return b}var x=class e{#e;constructor(e){this.#e=e}get state(){return this.#e.state}get scope(){return this.#e.scope}get tree(){return this.#e.tree}get generation(){return this.#e.generation}static expire(t){return t.#e.state===`expired`?t:new e({...t.#e,state:`expired`})}};const Ie=new x({state:`active`,scope:`all`,tree:void 0,generation:void 0});function Le(e){return new x({state:`active`,...e})}function Re(e){return x.expire(e)}const S=new WeakMap,C=new WeakSet;function w(e){return e.refFrame??Ie}function T(e){return w(e).generation??e.snapshotGeneration}function ze(e){return w(e).tree}function Be(e){He(e),E(e),e.refFrame=Re(w(e)),e.snapshotScopeSource=void 0}function E(e){e.snapshot&&C.add(e.snapshot)}function Ve(e){return C.has(e)}function He(e){let t=D(e)+1;return S.set(e,t),t}function D(e){return S.get(e)??0}function Ue(e){O(e,`all`)}function We(e,t){O(e,t)}function O(e,t){e.refFrame=Le({scope:t,tree:e.snapshot,generation:e.snapshotGeneration})}function k(e){return w(e).state}function A(e){return w(e).scope}function Ge(e){let t=e.ref.startsWith(`@`)?e.ref.slice(1):e.ref;return{admission:Ke({session:e.session,refBody:t,mintedGeneration:e.mintedGeneration}),scope:A(e.session),currentGeneration:T(e.session)}}function Ke(e){let{session:t,refBody:n,mintedGeneration:r}=e;if(k(t)===`expired`)return{admitted:!1,reason:`ref_frame_expired`};if(r!==void 0&&r!==T(t))return{admitted:!1,reason:`ref_generation_mismatch`};let i=A(t);if(i!==`all`){if(r===void 0)return{admitted:!1,reason:`plain_ref_requires_complete_frame`};if(!i.has(n))return{admitted:!1,reason:`ref_not_issued`}}return{admitted:!0}}const qe=[250,400,600];function j(e){return e===`press`||e===`click`||e===`back`||e===`open`}function M(e){return e.map(e=>[e.depth??0,e.type??``,e.label??``,e.value??``,e.identifier??``,e.enabled===!1?`disabled`:`enabled`,e.hittable===!0?`hittable`:`not-hittable`].join(`|`))}function Je(e,t){return e<12?!1:t<=Math.floor(e*.2)}function Ye(e,t,n){return n.interactiveOnly&&e.snapshot.nodes.length===0&&e.rawNodeCount!==void 0&&e.rawNodeCount>=12?`empty-interactive`:n.mode===`ref-refresh`?null:Je(t.baselineCount,e.snapshot.nodes.length)?Xe(e.snapshot)?null:`sharp-drop`:t.routeComparable&&j(t.action)&&Ze(t.baselineSignatures,e.snapshot.nodes)?`stuck-route`:null}function Xe(e){return e.nodes.some(e=>e.hittable===!0||!!e.label?.trim()||!!e.value?.trim()||!!e.identifier?.trim())}function Ze(e,t){if(!e||e.length===0)return!1;let n=Math.max(e.length,t.length);if(n<12)return!1;let r=M(t),i=Math.min(e.length,r.length),a=0;for(let t=0;t<i;t+=1)e[t]===r[t]&&(a+=1);let o=Math.max(0,r.length-e.length),s=Math.max(0,e.length-r.length),c=Math.max(3,Math.floor(n*.15));return a>=Math.floor(n*.9)&&o<=c&&s<=c}async function Qe(e){let t=e.window.markedAt+e.retry.retryBudgetMs,n=await e.capture(),r=e.classify(n),i=0;for(let a of e.retry.delaysMs){if(!r)break;let o=t-Date.now();if(o<=0)break;await v(Math.min(a,o)),n=await e.capture(),i+=1,r=e.classify(n)}r||e.onTrustworthyCapture?.();let a=i>0||r?{action:e.window.action,retryCount:i,staleAfterRetries:!!r,reason:r??void 0}:void 0;return{...n,annotations:{...n.annotations,...s({freshness:a})}}}function $e(e,t,n=e.snapshot){if(e.device.platform!==`android`)return;let r=et(e,n),i=r?.comparisonSafe===!0;e.androidSnapshotFreshness={action:t,markedAt:Date.now(),baselineCount:(r??n)?.nodes.length??0,baselineSignatures:i?M(r?.nodes??[]):void 0,routeComparable:i}}function et(e,t){if(t?.comparisonSafe===!0)return t;let n=e.lastComparisonSafeSnapshot;return!n||n.comparisonSafe!==!0?t:Date.now()-n.createdAt<=5e3?n:t}function N(e){if(!e||e.device.platform!==`android`)return;let t=e.androidSnapshotFreshness;if(t){if(Date.now()-t.markedAt>2500){delete e.androidSnapshotFreshness;return}return t}}function P(e){!e||e.device.platform!==`android`||delete e.androidSnapshotFreshness}async function F(e,t){return Qe({capture:e.capture,classify:n=>Ye({snapshot:n.snapshot,rawNodeCount:n.annotations.analysis?.rawNodeCount},t,{interactiveOnly:e.interactiveOnly,mode:e.androidFreshnessMode}),window:t,retry:{retryBudgetMs:1500,delaysMs:qe},onTrustworthyCapture:()=>P(e.session)})}const tt=`activity.launchConsole.launchArgs.clearAppState.verbose.iosXctestrunFile.iosXctestDerivedDataPath.iosXctestEnvDir.snapshotInteractiveOnly.snapshotPreferredBackend.snapshotDepth.snapshotScope.snapshotRaw.snapshotCustomActions.snapshotIncludeHiddenContentHints.count.intervalMs.delayMs.durationMs.holdMs.jitterPx.pixels.until.doubleTap.backMode.pauseMs.pattern`.split(`.`);function nt(e){return Object.fromEntries(tt.map(t=>[t,e?.[t]]))}function I(e,t,n,r,i,a){return{requestId:i??Ee().requestId,appBundleId:n,runnerLeaseContext:Ae({meta:a}),logPath:e,traceLogPath:r,...nt(t),screenshotCaptureBackend:t?.maestro?.screenshotCaptureBackend,...o(t),clickButton:g(t)}}function rt(e){return e?.interactionOutcome?.retryOnNoChange===!0}function it(e){let{session:t,command:n,positionals:r,flags:i,preSnapshot:a}=e;if(!rt(i)||!gt(t))return;let o=vt(n);if(!o||!Ct(r))return;let s=V(a?.nodes??[]);s.length!==0&&(t.pendingInteractionOutcome={action:n,command:o,positionals:r,flags:B(i),markedAt:Date.now(),attemptsRemaining:2,preSignature:s})}function at(e){let t=e?.pendingInteractionOutcome;if(!(!e||!t)){if(!gt(e)){L(e);return}if(Date.now()-t.markedAt>3e4){L(e);return}return t}}function L(e){e?.pendingInteractionOutcome&&(e.pendingInteractionOutcome=void 0)}async function R(e){let{pending:t,snapshot:n}=e,r=lt(t.preSignature,V(n.nodes));if(r!==`unchanged`||t.attemptsRemaining<=0)return{retried:!1,change:r};let i=e.retryTap,a=i?_t(t.positionals):void 0;if(!i||!a)return z(t,i?`unreadable-retry-point`:`device-runtime-unavailable`),{retried:!1,change:r};let o=Date.now();return--t.attemptsRemaining,await ot(i,e)?(_({level:`info`,phase:`interaction_no_change_retry`,data:{action:t.action,attemptsRemaining:t.attemptsRemaining,durationMs:Date.now()-o}}),{retried:!0,change:r}):(z(t,`retry-tap-unavailable`),{retried:!1,change:r})}async function ot(e,t){let{session:n,pending:r}=t,i=_t(r.positionals);if(!i)return!1;try{return await e({device:n.device,point:i,context:{...I(t.logPath,r.flags,n.appBundleId,n.trace?.outPath),surface:n.surface}})}catch{return!1}}function z(e,t){_({level:`info`,phase:`interaction_no_change_retry_skipped`,data:{action:e.action,attemptsRemaining:e.attemptsRemaining,reason:t}})}function st(e){_({level:e.attempts>0?`info`:`debug`,phase:`interaction_settled`,data:{action:e.pending.action,change:e.change,attempts:e.attempts,durationMs:Date.now()-e.startedAt}})}function ct(e){_({level:`warn`,phase:`interaction_settle_timeout`,data:{action:e.pending.action,attempts:e.attempts,durationMs:Date.now()-e.startedAt}})}function B(e){if(!e?.interactionOutcome&&!e?.postGestureStabilization)return e;let{interactionOutcome:t,postGestureStabilization:n,...r}=e;return r}function V(e){let t=new Map,n=[],r=ye(e);for(let i of e){let e=yt(i,t,r);e&&n.push(e)}return n}function H(e){return e?.comparisonKey??e?.snapshotQuality?.backend}function lt(e,t){return e.length===0||t.length===0?`ambiguous`:W(e,t)?`unchanged`:`changed`}function U(e,t){return Math.abs(e.x-t.x)<=1&&Math.abs(e.y-t.y)<=1&&Math.abs(e.width-t.width)<=1&&Math.abs(e.height-t.height)<=1}function W(e,t){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n+=1){let r=e[n],i=t[n];if(!r||!i||r.key!==i.key||!U(r,i))return!1}return!0}function ut(e,t){let n=dt(e),r=dt(t);if(n.size===0||r.size===0)return`ambiguous`;let i=0,a=!1;for(let[e,t]of n){let n=r.get(e);if(!n){a=!0;continue}if(i+=1,!U(t,n))return`changed`}if(i===0)return`ambiguous`;let o=r.size>i;return a&&o?`changed`:`unchanged`}function dt(e){let t=new Map;for(let n of e)!n.identity||!n.discriminating||t.has(n.identity)||t.set(n.identity,n);return t}function ft(e,t){let n=e.filter(e=>e.discriminating),r=t.filter(e=>e.discriminating);if(n.length===0||n.length!==r.length)return!1;let i=new Map(r.map(e=>[e.key,e]));for(let e of n){let t=i.get(e.key);if(!t||!U(e,t))return!1}return!0}function pt(e,t){let n=new Map(t.filter(e=>e.discriminating).map(e=>[e.key,e])),r=0,i=0,a=0;for(let t of e){if(!t.discriminating)continue;let e=n.get(t.key);if(!e){r+=1;continue}n.delete(t.key),a+=1,U(t,e)||(i+=1)}return{onlyInBaseline:r,onlyInCurrent:n.size,rectMismatched:i,shared:a}}function mt(e,t,n){let r=ht(e,n),i=new Map(ht(t,n).map(e=>[e.key,e]));for(let e of r){let t=i.get(e.key);if(!t||!U(e,t))return!0;i.delete(e.key)}return i.size>0}function ht(e,t){return e.filter(e=>e.discriminating&&e.x<t.x+t.width&&t.x<e.x+e.width&&e.y<t.y+t.height&&t.y<e.y+e.height)}function gt(e){return f(e.device)}function _t(e){let t=Number(e[0]),n=Number(e[1]);return Number.isFinite(t)&&Number.isFinite(n)?{x:t,y:n}:void 0}function vt(e){if(e===`click`||e===`press`)return`press`}function yt(e,t,n){if(!e.rect||!wt(e.rect)||Tt(e))return;let r=St(e);if(!r)return;let i=t.get(r)??0;t.set(r,i+1);let a=bt(e);return{key:`${r}|#${i}`,...a?{identity:a}:{},x:Math.round(e.rect.x),y:Math.round(e.rect.y),width:Math.round(e.rect.width),height:Math.round(e.rect.height),discriminating:!xt(e,n)}}function bt(e){let t=[e.identifier,e.label,e.value].map(e=>typeof e==`string`?e.trim():``).join(`|`);if(t.replaceAll(`|`,``))return`${t}|${e.type??``}`}function xt(e,t){return p(e)||e.ref!==void 0&&t.has(e.ref)}function St(e){let t=[e.identifier,e.label,e.value,e.type,e.role,e.enabled===!1?`disabled`:`enabled`,e.selected===!0?`selected`:`unselected`,e.hittable===!0?`hittable`:`not-hittable`].map(e=>typeof e==`string`?e.trim():``).join(`|`);return t.replaceAll(`|`,``)?t:void 0}function Ct(e){return e.length===2&&e.every(e=>Number.isFinite(Number(e)))}function wt(e){return[e.x,e.y,e.width,e.height].every(e=>Number.isFinite(e))&&e.width>0&&e.height>0}function Tt(e){return`${e.label??``} ${e.identifier??``}`.toLowerCase().includes(`scroll bar`)}function Et(e){let{session:t,command:n,action:r=n,positionals:i,flags:a,scheduleOutcomeRetry:o=!1,androidFreshnessBaseline:s}=e;o&&it({session:t,command:n,positionals:i,flags:a,preSnapshot:t.snapshot}),j(r)&&$e(t,r,s??t.snapshot),Dt(t,r,i,a)}function Dt(e,t,n=[],r){if(!Lt(e.device)||!It(t,n,r))return;let i=Rt(e.device)?V(e.snapshot?.nodes??[]):void 0;e.postGestureStabilization={action:t,positionals:n,markedAt:Date.now(),...i?.length?{baselineSignature:i,baselineBackend:H(e.snapshot)}:{}}}function Ot(e){e?.postGestureStabilization&&(e.postGestureStabilization=void 0)}function kt(e){return!!e?.postGestureStabilization}async function At(e){let t=at(e.session);if(t&&e.session)return await jt({...e,session:e.session},t);if(f(e.device)&&e.session&&kt(e.session))return await Nt({...e,session:e.session});let n=N(e.session);if(n&&e.device.platform===`android`){let t=await F(e,n);return{snapshot:t.snapshot,...t.annotations}}}async function jt(e,t){let n=e.session,r=Date.now(),i=0,a=await Mt(e,t,await G(e)),o=await R({session:n,pending:t,logPath:e.logPath,snapshot:a.snapshot,retryTap:e.retryTap});for(;o.retried;)i+=1,a=await Mt(e,t,await G(e)),o=await R({session:n,pending:t,logPath:e.logPath,snapshot:a.snapshot,retryTap:e.retryTap});L(n);let s=await Pt({session:n,initial:a,capture:async()=>await G(e),readSnapshot:e=>e.snapshot});return a=s.value,o.change!==`ambiguous`&&a.annotations.freshness?.staleAfterRetries!==!0&&P(n),o.change===`unchanged`?ct({pending:t,attempts:i,startedAt:r}):st({pending:t,change:o.change,attempts:i,startedAt:r}),Ft(s)}async function Mt(e,t,n){let r=n;return lt(t.preSignature,V(r.snapshot.nodes))===`unchanged`?(await v(500),r=await G(e),r):r}async function Nt(e){return Ft(await Pt({session:e.session,capture:async()=>await G(e),readSnapshot:e=>e.snapshot}))}async function G(e){let t=N(e.session);return t&&e.device.platform===`android`?await F(e,t):await e.capture()}async function Pt(e){let{session:t,capture:n,readSnapshot:r}=e,i=t?.postGestureStabilization;if(!t||!Lt(t.device)||!i)return{value:e.initial??await n()};let a=await Ce({pending:{action:i.action,positionals:i.positionals??[],baselineSignature:i.baselineSignature,baselineBackend:i.baselineBackend},needsBaselineDistrust:Rt(t.device),initial:e.initial,hooks:{capture:n,readSurface:e=>{let t=r(e);return{signature:V(t.nodes),backend:H(t)}},signaturesStable:W,classifyBaselineEvidence:ut,surfacesIdentical:ft,summarizeDivergence:pt}});return Ot(t),a}function Ft(e){let{snapshot:t,annotations:n}=e.value;return e.postGestureOutcome&&(t.postGestureOutcome=e.postGestureOutcome),{snapshot:t,...n}}function It(e,t,n){return n?.postGestureStabilization===!1?!1:n?.postGestureStabilization===!0||e===`swipe`||e===`scroll`||e===`gesture`&&t[0]===`swipe`}function Lt(e){return f(e)}function Rt(e){return d(e.platform)}function zt(e,t={}){let n=t.mode??`action`,{node:r,preActionNodes:i}=e;if(typeof r.index!=`number`)return;let a=_e(i),o=re(K(r),i);if(n===`landmark`&&o.id===void 0&&o.label===void 0)return;let s=ge(r,a,8),c=s.chain,l=q(i,r),u=J(r,a),d=Wt(r),f=+(c.length>0),p=e=>{let t=c.slice(0,e),n=Gt({nodes:i,byIndex:a,node:r,identity:o,ancestry:t,sibling:l,scrollRegion:u});return{candidate:{...o,ancestry:t,sibling:l,viewportOrder:n.viewportOrder,...u?{scrollRegion:u}:{},...d?{rect:d}:{},verification:`verified`},domain:n}};for(let e=c.length;e>=f;--e){let{candidate:t,domain:i}=p(e);if(Vt(t))return t.verification=Bt({node:r,domain:i,mode:n,brokenWalk:s.broken}),t;if(e===f)return Ht(t)}}function Bt(e){return e.brokenWalk?`unverifiable`:e.mode===`landmark`?`verified`:qt({node:e.node,domain:e.domain})}function Vt(e){return ue(fe({...e,verification:`unverifiable`}))<=oe}function Ht(e){return e.verification=`unverifiable`,ue(fe(e))>4096&&delete e.rect,e}const K=pe;function q(e,t){return ae(e,t)}function J(e,t){let n=je(e,t);if(!n)return;let r=K(n);return{role:r.role,...r.id===void 0?r.label===void 0?{}:{label:r.label}:{id:r.id}}}function Ut(e,t){return!e&&!t?!0:!e||!t?!1:te(e,t)}function Wt(e){let t=e.rect;if(t)return{x:t.x,y:t.y,width:t.width,height:t.height}}function Gt(e){let{nodes:t,byIndex:n,node:r,identity:i,ancestry:a,sibling:o,scrollRegion:s}=e,c=ve(t,n,i,a),l=c.filter(e=>q(t,e)===o),u=c.length>0?c.filter(e=>Ut(J(e,n),s)):void 0,d=u?Kt(u):[];return{identitySet:c,siblingMatches:l,regionMembers:u,orderedRegion:d,viewportOrder:Math.max(d.findIndex(e=>e.index===r.index),0)}}function Kt(e){return e.map((e,t)=>({node:e,documentOrder:t,center:De(e.rect)})).sort((e,t)=>!e.center&&!t.center?e.documentOrder-t.documentOrder:e.center?t.center?e.center.y===t.center.y?e.center.x===t.center.x?e.documentOrder-t.documentOrder:e.center.x-t.center.x:e.center.y-t.center.y:-1:1).map(e=>e.node)}function qt(e){let{node:t,domain:n}=e,r=t.ref,i=n.identitySet.map(e=>e.ref);return y({winnerRef:r,matchedRefs:i,identitySetRefs:i,siblingMatchRefs:n.siblingMatches.map(e=>e.ref),regionMemberRefs:n.regionMembers?.map(e=>e.ref),viewportCandidateRef:n.orderedRegion[n.viewportOrder]?.ref}).outcome}let Y;async function Jt(){if(Y)return Y;let{createAppleSessionObservation:e}=await import(`./session-observation.js`),{listLocalDeviceInventory:t,shouldPropagateDeviceInventoryProbeError:n}=await import(`./device-inventory-context.js`).then(e=>e.t);return Y??=e({listLocalDevices:t,shouldPropagateProbeError:n}),Y}const Yt=Object.freeze({async observeRunnerSession(e){return(await Jt()).observeRunnerSession(e)},async resolveSoleForegroundApp(e){return(await Jt()).resolveSoleForegroundApp(e)}});async function Xt(e,t,n,r){let{queryAppleRunnerSelector:i}=await import(`./runner-operations-facade.js`);return await i(e,t,n,r)}function Zt(e,t){return i(`UNSUPPORTED_OPERATION`,`${e} is not supported on this device`,{reason:t.reason},t.hint?{hint:t.hint}:void 0)}async function X(e){let t=await en(e.inspectFacts)(e.device);for(let n of e.required){let r=t.operations[n];if(!r.available)return{type:`response`,response:e.unavailableResponse?e.unavailableResponse(r):Zt(e.command,r)}}return{type:`admitted`,bind:tn(e.bindDevice)}}async function Qt(e){let t=await X({...e,required:e.use.required});if(t.type===`response`)return t;let n=await t.bind(e.device,e.use);return e.readiness&&await ke(n),{type:`runtime`,runtime:n}}async function $t(e,t){let n=await Qt(e);if(n.type===`response`)return{ok:!1,response:n.response};let r=n.runtime;return{ok:!0,execute:async({dispatchContext:e})=>await t(r,e)}}function en(e){if(e)return e;throw new t(`COMMAND_FAILED`,`Device runtime facts inspection is unavailable.`,{reason:`runtime-gateway-missing`})}function tn(e){if(e)return e;throw new t(`COMMAND_FAILED`,`Device runtime binding is unavailable.`,{reason:`runtime-gateway-missing`})}function nn(t){let{flags:n,logPath:i,meta:a,session:o,snapshotScope:s}=t,{appBundleId:c,trace:l,surface:u}=o??{},d=t.context??I(i??``,n,c,l?.outPath,a?.requestId,a);return{options:{appBundleId:c,...e(n,r),scope:s,includeRects:t.includeRects,surface:u},execution:Z(d),...t.signal===void 0?{}:{signal:t.signal}}}function Z(e){return{requestId:e.requestId,verbose:e.verbose,logPath:e.logPath,traceLogPath:e.traceLogPath,iosXctestrunFile:e.iosXctestrunFile,iosXctestDerivedDataPath:e.iosXctestDerivedDataPath,iosXctestEnvDir:e.iosXctestEnvDir,runnerLeaseContext:e.runnerLeaseContext}}function rn(e){let t=Se(e);return{...t,capture:Te(t),selectors:we(t),interactions:xe(t)}}async function an(e){let t=await(await Fe().resolve(e.device,e.runnerContext)).snapshot(e.options);if(!(`stage`in t))return t;let{presentIosSnapshotAcquisition:n}=await import(`./ios-snapshot-runtime.js`);return await n(t,e.options)}function on(e){let t=e?e.textEntryReadiness:void 0,n=dn(t)?{textEntryReadiness:t}:{},r=sn(e);return r?{...n,...r}:n}function sn(e){if(!cn(e))return null;let t=ln(e.target);return t?{verification:`unconfirmed`,requested:e.requested,before:e.before,after:e.after,target:t}:null}function cn(e){return!!(e&&e.verification===`unconfirmed`&&typeof e.requested==`string`&&Q(e.before)&&Q(e.after))}function ln(e){if(!pn(e)||!un(e))return null;let t=fn(e.rect);return t?{resourceId:e.resourceId,className:e.className,packageName:e.packageName,rect:t}:null}function un(e){return Q(e.resourceId)&&Q(e.className)&&Q(e.packageName)}function dn(e){return typeof e==`string`&&Me.includes(e)}function Q(e){return e===null||typeof e==`string`}function fn(e){return!pn(e)||![e.x,e.y,e.width,e.height].every(e=>typeof e==`number`)?null:e}function pn(e){return!!e&&typeof e==`object`}async function mn(e){let t={device:e.device,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice},n=ee(e.command,e.requiresCapture),r=await X({command:e.command,required:n.use.required,...e.unavailableResponse?{unavailableResponse:e.unavailableResponse}:{},...t});if(r.type===`response`)return{ok:!1,response:r.response};let i=r.bind;switch(n.kind){case`tap-point`:return{ok:!0,runtime:{kind:`tap`,captured:!1,runtime:await i(e.device,ie)}};case`captured-tap`:return{ok:!0,runtime:{kind:`tap`,captured:!0,runtime:await i(e.device,ce)}};case`long-press-point`:return{ok:!0,runtime:{kind:`long-press`,captured:!1,runtime:await i(e.device,ne)}};case`captured-long-press`:return{ok:!0,runtime:{kind:`long-press`,captured:!0,runtime:await i(e.device,me)}};case`hover-point`:return{ok:!0,runtime:{kind:`hover`,captured:!1,runtime:await i(e.device,he)}};case`captured-hover`:return{ok:!0,runtime:{kind:`hover`,captured:!0,runtime:await i(e.device,de)}};case`fill-point`:return{ok:!0,runtime:{kind:`fill`,captured:!1,runtime:await i(e.device,le)}};case`captured-fill`:return{ok:!0,runtime:{kind:`fill`,captured:!0,runtime:await i(e.device,se)}}}}function hn(e,t){let n={execution:Z(t),appBundleId:t.appBundleId},r=e.captured?xn(e.runtime):void 0;switch(e.kind){case`tap`:return gn(e,t,n,r);case`long-press`:return _n(e,n,r);case`hover`:return vn(e,n,r);case`fill`:return yn(e,t,n,r)}}function gn(e,t,n,r){let i=e.captured?e.runtime.operations.tapRef:void 0,a=e.captured?e.runtime.operations.tapElementSelector:void 0;return Object.freeze({captureSnapshot:r,tapPoint:async(r,i={})=>{let a=Sn(i,t),o=await e.runtime.operations.tapPoint({point:r,options:a,...n});return{x:r.x,y:r.y,count:a.count,intervalMs:a.intervalMs,holdMs:a.holdMs,jitterPx:a.jitterPx,doubleTap:a.doubleTap,...a.button===`primary`?{}:{button:a.button},...o??{},...h(Tn(r,a.button))}},tapRef:i?async e=>await i({ref:e,...n}):void 0,tapElementSelector:e.captured&&a?async t=>{let r=await e.runtime.operations.tapElementSelector?.({selector:t,...n}),i=r?.maestroNonHittableCoordinateFallbackUsed===!0;return{selector:t.raw,...r??{},...h(i?`tapped via non-hittable coordinate fallback`:`Tapped ${t.raw}`)}}:void 0})}function _n(e,t,n){return Object.freeze({captureSnapshot:n,longPressPoint:async(n,r)=>{let i=await e.runtime.operations.longPressPoint({point:n,durationMs:r,...t});return{x:n.x,y:n.y,durationMs:r,...i??{},...h(`Long pressed (${n.x}, ${n.y})`)}}})}function vn(e,t,n){let r=e.captured?e.runtime.operations.hoverRef:void 0;return Object.freeze({captureSnapshot:n,hoverPoint:async n=>{let r=await e.runtime.operations.hoverPoint({point:n,...t});return{x:n.x,y:n.y,...r??{},...h(`Hovered (${n.x}, ${n.y})`)}},hoverRef:r?async e=>await r({ref:e,...t}):void 0})}function yn(e,t,n,r){let i=e.captured?e.runtime.operations.fillRef:void 0,a=e=>m(e??t.delayMs??0,`delay-ms`,0,1e4);return Object.freeze({captureSnapshot:r,fillPoint:async(t,r,i={})=>{let o=a(i.delayMs),s=await e.runtime.operations.fillPoint({point:t,text:r,delayMs:o,allowNonHittableCoordinateFallback:i.allowNonHittableCoordinateFallback===!0,...n});return{x:t.x,y:t.y,text:r,delayMs:o,...bn(s)?{maestroNonHittableCoordinateFallbackUsed:!0}:{},...on(s),...h(`Filled ${Array.from(r).length} chars`)}},fillRef:i?async(e,t,r={})=>await i({ref:e,text:t,delayMs:a(r.delayMs),...n}):void 0})}function bn(e){return typeof e==`object`&&!!e&&`maestroNonHittableCoordinateFallbackUsed`in e&&e.maestroNonHittableCoordinateFallbackUsed===!0}function xn(e){return async t=>await e.operations.captureSnapshot(t)}function Sn(e,t){let n=Cn(e,t);return wn(n),{button:e.button??g(t),...n,surface:e.surface??t.surface}}function Cn(e,t){return{count:$(e.count,t.count,1,`count`,1,200),intervalMs:$(e.intervalMs,t.intervalMs,0,`interval-ms`,0,1e4),holdMs:$(e.holdMs,t.holdMs,0,`hold-ms`,0,1e4),jitterPx:$(e.jitterPx,t.jitterPx,0,`jitter-px`,0,100),doubleTap:e.doubleTap??t.doubleTap??!1}}function $(e,t,n,r,i,a){return m(e??t??n,r,i,a)}function wn(e){if(e.doubleTap&&e.holdMs>0)throw new t(`INVALID_ARGS`,`double-tap cannot be combined with hold-ms`);if(e.doubleTap&&e.jitterPx>0)throw new t(`INVALID_ARGS`,`double-tap cannot be combined with jitter-px`)}function Tn(e,t){return t===`primary`?`Pressed (${e.x}, ${e.y})`:`${t===`secondary`?`Right`:`Middle`} clicked (${e.x}, ${e.y})`}function En(e){let{inspectFacts:t,bindDevice:n}=e;if(!t||!n)return;let r=new Map;return async({device:e,point:i,context:a})=>{let o=r.get(e.id);o||(o=mn({device:e,command:`press`,requiresCapture:!1,inspectFacts:t,bindDevice:n}),r.set(e.id,o));let s=await o;if(!s.ok)return!1;let c=hn(s.runtime,a);return c.tapPoint?(await c.tapPoint(i),!0):!1}}async function Dn(e){let t=await At({session:e.session,device:e.device,logPath:e.logPath,interactiveOnly:e.flags?.snapshotInteractiveOnly===!0,androidFreshnessMode:e.androidFreshnessMode,capture:()=>kn(e),retryTap:En(e)});if(t)return t;let n=await kn(e);return P(e.session),{snapshot:n.snapshot,...n.annotations}}async function On(t){if(t.captureData)return await t.captureData();let{device:n,session:i,logPath:a}=t,o=I(a,An(t),i?.appBundleId,i?.trace?.outPath);return await an({device:n,runnerContext:{requestId:o.requestId,signal:t.signal,appBundleId:o.appBundleId,verbose:o.verbose,logPath:o.logPath,traceLogPath:o.traceLogPath,iosXctestrunFile:o.iosXctestrunFile,iosXctestDerivedDataPath:o.iosXctestDerivedDataPath,iosXctestEnvDir:o.iosXctestEnvDir,runnerLeaseContext:o.runnerLeaseContext},options:{appBundleId:o.appBundleId,signal:t.signal,...e(o,r),includeRects:t.includeRects,surface:i?.surface}})}async function kn(e){let t=Date.now(),n=await On(e);c(e.session,{durationMs:Date.now()-t,backend:n.backend,platform:u(e.device)});let r=s(n),i=l(n,Oe(n,An(e)));return r.androidSnapshot?.systemSurfaceOnly===!0&&(i.systemSurfaceOnly=!0),{data:n,snapshot:i,annotations:r}}function An(e){return e.snapshotScope===void 0?e.flags:{...e.flags,snapshotScope:e.snapshotScope}}function jn(e,t){if(!e||!e.trim().startsWith(`@`))return{ok:!0,scope:e};if(!t?.snapshot)return i(`INVALID_ARGS`,`Ref scope requires an existing snapshot in session.`);let r=a(e.trim());if(!r)return i(`INVALID_ARGS`,`Invalid ref scope: ${e}`);let o=[t.snapshot,...t.snapshotScopeSource?[t.snapshotScopeSource]:[]],s;for(let e of o){let t=n(e.nodes,r);if(s=t?be(t,e.nodes):void 0,s)break}return s?{ok:!0,scope:s}:i(`COMMAND_FAILED`,`Ref ${e} not found or has no label`)}function Mn(e,t,n={}){if(!e)return;let r=ze(e);return{name:t,appBundleId:e.appBundleId,appName:e.appName,...n.includeSnapshot===!0?{snapshot:e.snapshot,...r&&n.omitRefFrameSnapshot!==!0?{refFrameSnapshot:r}:{}}:{},metadata:{surface:e.surface,...n.metadata??{}}}}function Nn(e){return{get:t=>t===e.sessionName?Mn(e.getSession(),e.sessionName,e.recordOptions):void 0,set:t=>{if(t.name!==e.sessionName){_({level:`warn`,phase:`runtime_session_write_skipped`,data:{expected:e.sessionName,received:t.name}});return}e.setRecord(t)}}}function Pn(e,t){e.snapshot!==t&&(e.snapshotGeneration=In(e.snapshotGeneration)),e.snapshot=t,e.snapshotScopeSource=void 0,t.comparisonSafe===!0&&(e.lastComparisonSafeSnapshot=t)}function Fn(e,t){e.snapshotScopeSource=t.scopeSource,e.snapshotGeneration=t.keptCurrentSnapshot?t.previousGeneration:In(t.previousGeneration)}function In(e){return e===void 0?Ne(1e5,1e6):e+1}function Ln(e){let t=e.startsWith(`@`)?e.slice(1):e,n=t.indexOf(`~`);return n===-1?t:t.slice(0,n)}function Rn(e,t){let n=new Set;for(let e of t){let t=Ln(e);t.length>0&&n.add(t)}n.size!==0&&We(e,n)}function zn(e,t){if(t?.diff)return Rn(e,Bn(t)),e.snapshotGeneration}function Bn(e){let t=[];for(let n of e.diff?.lines??[])n.ref&&t.push(n.ref);for(let n of e.refs??[])t.push(n.ref);for(let n of e.tail??[])t.push(n.ref);return t}function Vn(e){return`Ref @${e.ref.startsWith(`@`)?e.ref.slice(1):e.ref} was minted from snapshot s${e.mintedGeneration} but the session's ref frame is now s${e.currentFrameEpoch} — re-run snapshot -i.`}function Hn(e){let{session:t,ref:n,mintedGeneration:r}=e;if(t&&k(t)===`expired`)return`The UI may have changed since these refs were issued, so they no longer represent current device state. Take a new snapshot before relying on or interacting with them.`;if(r!==void 0){let e=t?T(t)??0:0;if(r!==e)return Vn({ref:n,mintedGeneration:r,currentFrameEpoch:e})}}export{V as A,Be as B,q as C,kt as D,Ut as E,B as F,w as G,E as H,pt as I,y as J,k as K,I as L,mt as M,ft as N,Et as O,H as P,N as R,J as S,Kt as T,Ge as U,Ve as V,D as W,$t as _,Fn as a,Xt as b,On as c,mn as d,rn as f,Qt as g,X as h,Pn as i,ut as j,W as k,jn as l,Z as m,Rn as n,Nn as o,nn as p,Pe as q,Hn as r,Dn as s,zn as t,hn as u,Zt as v,zt as w,K as x,Yt as y,Ue as z};
@@ -1,4 +1,4 @@
1
- import{D as e,W as t}from"./sdk-contracts.js";import{_ as n}from"./sdk-batch-runner.js";import{b as r,i,r as a,t as o}from"./sdk-device.js";import{$n as s,Qn as c,cn as l,on as ee,p as te,x as ne}from"./sdk-batch.js";import{t as re}from"./recording-scope.js";import{a as ie}from"./scroll-gesture.js";import{_ as u,c as ae,d as oe,g as se,h as ce,i as le,l as ue,m as de,o as fe,p as d,s as pe,u as f,y as me}from"./script.js";import{A as p,C as he,D as ge,E as _e,M as ve,N as ye,S as be,T as xe,_ as Se,a as Ce,b as we,g as m,i as Te,k as Ee,l as De,n as Oe,r as ke,s as Ae,t as je,v as Me,w as Ne,x as Pe,y as Fe}from"./parameterized-recorded-fill.js";import{n as h,t as Ie}from"./catalog.js";import{o as Le,t as g}from"./back-mode.js";import{t as Re}from"./session.js";import{r as ze}from"./success-text.js";import{t as Be}from"./click-button.js";import"./device.js";import{r as _,t as v}from"./device-rotation.js";import{a as y,r as b}from"./diagnostics.js";import{D as Ve}from"./owner-identity.js";import"./file.js";import{t as He}from"./tv-remote.js";import"./diagnostics2.js";import{n as Ue,r as We}from"./session-repair-tombstone.js";import{n as Ge,r as x,t as S}from"./session-paths.js";import{t as Ke}from"./keyboard-actions.js";import C from"node:path";import w from"node:fs";import{createHash as qe}from"node:crypto";import{StringDecoder as Je}from"node:string_decoder";function Ye(e,t={}){let n=[e.command];return e.command===`snapshot`?oe(n,e):e.command===`open`?le(n,e):e.command===`runtime`?ae(n,e,{includeAllPositionals:t.runtimeIncludeAllPositionals}):e.command===`record`?pe(n,e):e.command===`screenshot`?ue(n,e):fe(n,e),n.join(` `)}function Xe(e){return e.targetEvidences?[c(e.targetEvidences)]:e.targetEvidence?[s(e.targetEvidence)]:[]}function T(e){return e?.scriptPublication??m}function Ze(e,t){let n=T(e),r=typeof t.saveScript==`string`?S(t.saveScript):n.kind===`repair`?void 0:t.healedSiblingPath;e.scriptPublication=Me(n,{requested:{path:r,force:t.force===!0},boundary:t.firstArm?e.actions.length:0,sourcePath:t.sourcePath})}function Qe(e){e.scriptPublication=we(T(e))}function $e(e){e.scriptPublication=Ne(T(e))}function et(e,t){e.scriptPublication=xe(T(e),t)}function tt(e){e.scriptPublication=Se(T(e))}function nt(e,t){let n=T(e);return n.kind===`repair`&&n.closeReceipt===t}function rt(e){return T(e).kind===`repair`}function it(e){return he(T(e))}function E(e){return _e(T(e))}function at(e){return ge(T(e))}function ot(e,t){if(t.flags?.noRecord||gt(e,t))return;t.flags&&Ae(e,t.flags);let n=ct(t),r=dt(e,lt(t,n));n&&ut(e,n);let i={ts:Date.now(),command:r.command,positionals:r.positionals,runtime:r.runtime,flags:vt(r.flags),result:r.result,...r.targetEvidence?{targetEvidence:r.targetEvidence}:{},...r.targetEvidences?{targetEvidences:r.targetEvidences}:{}};return e.actions.push(i),b({level:`debug`,phase:`record_action`,data:{command:t.command,session:e.name}}),i}function st(e,t,n,r,i,a){t&&e.recordAction(t,{command:r,positionals:a?.positionals??n.positionals??[],flags:a?.flags??n.flags??{},result:i??{}})}function ct(e){if(e.command!==`fill`||typeof e.flags.recordAs!=`string`)return;let t=ye(e.flags.recordAs),n=ve(t);return{literal:p({ts:0,command:e.command,positionals:e.positionals,flags:e.flags}),placeholder:n}}function lt(e,t){if(!t)return e;let{literal:n,placeholder:r}=t;return{...e,positionals:pt(e.positionals,r),result:je(e.result,n,r),targetEvidence:Oe(e.targetEvidence,n,r)}}function ut(e,t){t.literal.trim()&&(e.recordedFillLiterals??=new Map,!e.recordedFillLiterals.has(t.literal)&&e.recordedFillLiterals.set(t.literal,t.placeholder))}function dt(e,t){let n=e.recordedFillLiterals;if(!n||n.size===0)return t;let r=ke(t.result,n),i=(t.targetEvidenceMode??`action`)===`landmark`?ft(t.targetEvidence,n):D(t.targetEvidence,n),a=t.targetEvidences?{source:D(t.targetEvidences.source,n),destination:D(t.targetEvidences.destination,n)}:t.targetEvidences;return{...t,result:r,targetEvidence:i,targetEvidences:a}}function ft(e,t){return e&&(Ce(e,t)?void 0:e)}function D(e,t){return!e||!Ce(e,t)?e:{...Te(e,t),verification:`unverifiable`}}function pt(e,t){let n=e[0];return n?.startsWith(`@`)?e.length>=3?[n,e[1],t]:[n,t]:e.length>=3&&Number.isFinite(Number(e[0]))&&Number.isFinite(Number(e[1]))?[e[0],e[1],t]:n===void 0?[t]:[n,t]}const mt=new Set([`snapshot`,`get`,`is`,`find`]);function ht(e){return e.internal?.replayPlanStep!==!0&&mt.has(e.command)}function gt(e,t){return!t.interactiveObservation||E(e)===void 0?!1:t.flags?.record!==!0}const _t=Le();function vt(e){if(!e)return{};let t={};for(let n of _t){let r=e[n];r!==void 0&&(t[n]=r)}return t}function yt(t){let n=t.flatMap((e,t)=>e.command===`open`?[t]:[]);if(n.length!==1||n[0]!==0)throw new e(`COMMAND_FAILED`,`Cannot publish this session: an open-to-destination script requires exactly one initial recorded open.`,{retriable:!1,hint:`Close this session and start a fresh one with open <app> --save-script[=<path>].`});if(t.some(e=>e.command===`close`))throw new e(`COMMAND_FAILED`,`Cannot publish an active-session script containing close.`,{retriable:!1,hint:`Close this session and record the journey again from a fresh open --save-script session.`});let r=-1;for(let[e,n]of t.entries())ne({command:n.command,positionals:n.positionals,flags:n.flags})===`mutates-app`&&(r=e);if(!t.slice(r+1).some(Tt))throw new e(`COMMAND_FAILED`,`Cannot publish this session without a portable destination guard after the final mutating action.`,{retriable:!0,hint:`Record a selector-targeted wait on a labeled or id-bearing landmark, for example wait 'role="heading" label="Screen X"', so its recorded identity is captured, then retry session save-script.`})}function bt(t){for(let n of t){if(xt(n)){St(n);continue}let t=Et(n),r=t??(n.command===`wait`?n.positionals[0]:void 0);if(r?.startsWith(`@`))throw new e(`COMMAND_FAILED`,`Cannot publish recorded step "${n.command} ${r}": the session-local ref was not converted to a portable selector.`,{retriable:!1,hint:`Close this session and record the journey again using selectors or resolvable refs.`});if(n.command===`find`&&ne(n)===`mutates-app`)throw new e(`COMMAND_FAILED`,`Cannot publish a recorded mutating find step because its target identity is not replay-verifiable.`,{retriable:!1,hint:`Close this session and record the journey again with an explicit selector-targeted click, press, fill, or focus action.`});let i=t;if(!(!i||!l(i)||n.targetEvidence))throw new e(`COMMAND_FAILED`,`Cannot publish recorded step "${n.command} ${i}": recording-time target identity evidence is missing.`,{retriable:!1,hint:`Close this session and record the journey again from open --save-script so target-v1 evidence is captured before each interaction.`})}}function xt(e){return Ct(e)!==void 0}function St(t){let n=Ct(t);if(!n)return;let r=[n.source,n.destination];for(let n of r){if(n?.startsWith(`@`))throw new e(`COMMAND_FAILED`,`Cannot publish recorded drag endpoint "${n}": the session-local ref was not converted to a portable selector.`,{retriable:!1});if(!(!n||!l(n))&&!t.targetEvidences)throw new e(`COMMAND_FAILED`,`Cannot publish recorded drag endpoint "${n}": recording-time target identity evidence is missing.`,{retriable:!1,hint:`Close this session and record the journey again so targets-v1 evidence is captured for both drag endpoints.`})}}function Ct(e){return e.command===`gesture`?me(e.positionals):void 0}function wt(t,n){if(t instanceof e){if(t.details?.reason===`script_target_exists`)return new e(t.code,`A file already exists at ${String(t.details.path)}.`,{...t.details,retriable:!0,hint:`Retry session save-script with another path, or pass --force to replace the existing file. The session remains armed.`});let n=t.details?.retriable===!0;return new e(t.code,t.message,{...t.details,retriable:n,hint:t.details?.hint??(n?`Fix the recorded journey or target, then retry session save-script. The session remains armed.`:`Close this session and start a fresh one with open <app> --save-script[=<path>].`)})}let r=t instanceof Error?t.message:String(t);return new e(`COMMAND_FAILED`,`Failed to publish the active session script${n?` to ${n}`:``}: ${r}`,{retriable:!0,hint:`Check the target path and permissions, then retry session save-script. The session remains armed.`})}function Tt(e){if(e.command!==`wait`)return!1;let t=ee(e.positionals);return t?.kind!==`selector`||!l(t.selectorExpression)?!1:e.targetEvidence?.verification===`verified`}function Et(e){if(e.command===`get`)return e.positionals[1];if(se(e.command)||e.command===`fill`){let[t,n]=e.positionals;return t!==void 0&&n!==void 0&&Dt(t)&&Dt(n)?void 0:t}}function Dt(e){return e.trim().length>0&&Number.isFinite(Number(e))}function Ot(e){let t=e.scriptPublication??m;return t.kind===`repair`?t.status===`committed`||!be(t):!1}function kt(e){return!Pe(e.scriptPublication??m)||Ot(e)}var At=class{sessionsDir;constructor(e){this.sessionsDir=e}write(e,t){let n=rt(e),r=t?.publication===`active`,i;try{if(kt(e))return{written:!1};let a=jt(e,{appendCompleteSentinel:n,activePublication:r});i=this.resolveScriptPath(e);let o=C.dirname(i);return w.existsSync(o)||w.mkdirSync(o,{recursive:!0}),Pt({scriptPath:i,script:a.script,force:t?.force}),n&&(e.scriptPublication=Fe(e.scriptPublication??m)),{written:!0,path:i,actionCount:a.actionCount}}catch(t){return Mt({session:e,error:t,scriptPath:i,repairArmed:n,activePublication:r})}}resolveScriptPath(e){let t=Ee(e.scriptPublication??m);if(t)return S(t);let n=x(e.name),r=new Date(e.createdAt).toISOString().replaceAll(/[:.]/g,`-`);return C.join(this.sessionsDir,`${n}-${r}.ad`)}};function jt(e,t){let n=Ft(e,{strictPortableRefs:t.activePublication});return t.activePublication&&yt(n),{script:Gt(e,n,t.appendCompleteSentinel),actionCount:n.length}}function Mt(t){let{session:n,error:r,scriptPath:i,repairArmed:a,activePublication:o}=t;if(b({level:`warn`,phase:`session_script_write_failed`,data:{session:n.name,path:i,error:r instanceof Error?r.message:String(r)}}),a)return{written:!1,error:Nt(r,i)};if(o)return{written:!1,error:wt(r,i)};if(r instanceof e)throw r;return{written:!1}}function Nt(t,n){if(t instanceof e)return t;let r=t instanceof Error?t.message:String(t);return new e(`COMMAND_FAILED`,`Failed to write the healed script${n?` to ${n}`:``}: ${r}`,{hint:`The repair transaction completed but the healed .ad could not be published; check the target path and permissions, then retry close --save-script.`})}function Pt(t){let{scriptPath:n,script:r,force:i}=t;try{Ve({destination:n,contents:r,publish:i?`replace`:`link-exclusive`})}catch(t){throw t.code===`EEXIST`?new e(`COMMAND_FAILED`,`A file already exists at ${n}; remove it, pass replay --save-script=<other-path>, or pass --force/--overwrite to replace it.`,{reason:`script_target_exists`,path:n}):t}}function Ft(e,t={}){let n=E(e),r=n!==void 0,i=e.actions.slice(n??0),a=[];for(let n of i){if(n.command===`snapshot`)continue;let i=Rt(n);if(i){a.push(i);continue}(r||t.strictPortableRefs)&&It(n);let o=Wt(e,n);o&&a.push(o),a.push(n)}return t.strictPortableRefs&&bt(a),a}function It(t){let n=t.command===`gesture`?me(t.positionals??[]):void 0;if(n){Lt(n);return}if(!O(t.command))return;let r=t.command===`get`?t.positionals?.[1]:t.positionals?.[0];if(r?.startsWith(`@`))throw new e(`COMMAND_FAILED`,`Cannot write recorded step "${t.command} ${r}" to a script: it never resolved to a selector, so the ref would not resolve in a fresh replay session.`)}function Lt(t){let n=[t.source,t.destination].find(e=>e.startsWith(`@`));if(n)throw new e(`COMMAND_FAILED`,`Cannot write recorded drag endpoint "${n}" to a script: it never resolved to a selector, so the ref would not resolve in a fresh replay session.`)}function Rt(e){let t=zt(e);if(!(!t||!O(e.command)))return ce(e.command)||e.command===`hover`?{...e,positionals:[t]}:e.command===`longpress`?Vt(e,t):e.command===`fill`?Bt(e,t):Ht(e,t)}function zt(e){let t=Array.isArray(e.result?.selectorChain)&&e.result.selectorChain.every(e=>typeof e==`string`)?e.result.selectorChain:[];return t.length>0?t.join(` || `):void 0}function O(e){return se(e)||e===`fill`||e===`get`}function Bt(e,t){let n=p(e);return n.length>0?{...e,positionals:[t,n]}:void 0}function Vt(e,t){let n=typeof e.result?.durationMs==`number`?String(e.result.durationMs):Ut(e.positionals??[]);return{...e,positionals:n?[t,n]:[t]}}function Ht(e,t){let n=e.positionals?.[0];return n===`text`||n===`attrs`?{...e,positionals:[n,t]}:void 0}function Ut(e){let t=e.at(-1);if(!(e.length<=1||t===void 0||t.trim()===``))return Number.isFinite(Number(t))?t:void 0}function Wt(e,t){if(!O(t.command))return;let n=t.result?.refLabel;if(typeof n!=`string`||n.trim().length===0)return;let r=n.trim();return{ts:t.ts,command:`snapshot`,positionals:[],flags:{platform:e.device.platform,snapshotInteractiveOnly:!0,snapshotScope:r},result:{scope:r}}}function Gt(e,t,n){let i=[],a=e.device.kind?` kind=${e.device.kind}`:``;i.push(`context platform=${r(e.device)} device=${de(e.device.name)}${a} theme=unknown`);for(let e of t)e.flags?.noRecord||(i.push(...Xe(e)),i.push(Kt(e)));return n&&i.push(`# agent-device:heal-complete`),`${i.join(`
1
+ import{G as e,O as t}from"./sdk-contracts.js";import{_ as n}from"./sdk-batch-runner.js";import{b as r,i,r as a,t as o}from"./sdk-device.js";import{$n as s,Qn as c,cn as l,on as ee,p as te,x as ne}from"./sdk-batch.js";import{t as re}from"./recording-scope.js";import{a as ie}from"./scroll-gesture.js";import{_ as u,c as ae,d as oe,g as se,h as ce,i as le,l as ue,m as de,o as fe,p as d,s as pe,u as f,y as me}from"./script.js";import{A as p,C as he,D as ge,E as _e,M as ve,N as ye,S as be,T as xe,_ as Se,a as Ce,b as we,g as m,i as Te,k as Ee,l as De,n as Oe,r as ke,s as Ae,t as je,v as Me,w as Ne,x as Pe,y as Fe}from"./parameterized-recorded-fill.js";import{n as h,t as Ie}from"./catalog.js";import{o as Le,t as g}from"./back-mode.js";import{t as Re}from"./session.js";import{r as ze}from"./success-text.js";import{t as Be}from"./click-button.js";import"./device.js";import{r as _,t as v}from"./device-rotation.js";import{a as y,r as b}from"./diagnostics.js";import{D as Ve}from"./owner-identity.js";import"./file.js";import{t as He}from"./tv-remote.js";import"./diagnostics2.js";import{n as Ue,r as We}from"./session-repair-tombstone.js";import{n as Ge,r as x,t as S}from"./session-paths.js";import{t as Ke}from"./keyboard-actions.js";import C from"node:path";import w from"node:fs";import{createHash as qe}from"node:crypto";import{StringDecoder as Je}from"node:string_decoder";function Ye(e,t={}){let n=[e.command];return e.command===`snapshot`?oe(n,e):e.command===`open`?le(n,e):e.command===`runtime`?ae(n,e,{includeAllPositionals:t.runtimeIncludeAllPositionals}):e.command===`record`?pe(n,e):e.command===`screenshot`?ue(n,e):fe(n,e),n.join(` `)}function Xe(e){return e.targetEvidences?[c(e.targetEvidences)]:e.targetEvidence?[s(e.targetEvidence)]:[]}function T(e){return e?.scriptPublication??m}function Ze(e,t){let n=T(e),r=typeof t.saveScript==`string`?S(t.saveScript):n.kind===`repair`?void 0:t.healedSiblingPath;e.scriptPublication=Me(n,{requested:{path:r,force:t.force===!0},boundary:t.firstArm?e.actions.length:0,sourcePath:t.sourcePath})}function Qe(e){e.scriptPublication=we(T(e))}function $e(e){e.scriptPublication=Ne(T(e))}function et(e,t){e.scriptPublication=xe(T(e),t)}function tt(e){e.scriptPublication=Se(T(e))}function nt(e,t){let n=T(e);return n.kind===`repair`&&n.closeReceipt===t}function rt(e){return T(e).kind===`repair`}function it(e){return he(T(e))}function E(e){return _e(T(e))}function at(e){return ge(T(e))}function ot(e,t){if(t.flags?.noRecord||gt(e,t))return;t.flags&&Ae(e,t.flags);let n=ct(t),r=dt(e,lt(t,n));n&&ut(e,n);let i={ts:Date.now(),command:r.command,positionals:r.positionals,runtime:r.runtime,flags:vt(r.flags),result:r.result,...r.targetEvidence?{targetEvidence:r.targetEvidence}:{},...r.targetEvidences?{targetEvidences:r.targetEvidences}:{}};return e.actions.push(i),b({level:`debug`,phase:`record_action`,data:{command:t.command,session:e.name}}),i}function st(e,t,n,r,i,a){t&&e.recordAction(t,{command:r,positionals:a?.positionals??n.positionals??[],flags:a?.flags??n.flags??{},result:i??{}})}function ct(e){if(e.command!==`fill`||typeof e.flags.recordAs!=`string`)return;let t=ye(e.flags.recordAs),n=ve(t);return{literal:p({ts:0,command:e.command,positionals:e.positionals,flags:e.flags}),placeholder:n}}function lt(e,t){if(!t)return e;let{literal:n,placeholder:r}=t;return{...e,positionals:pt(e.positionals,r),result:je(e.result,n,r),targetEvidence:Oe(e.targetEvidence,n,r)}}function ut(e,t){t.literal.trim()&&(e.recordedFillLiterals??=new Map,!e.recordedFillLiterals.has(t.literal)&&e.recordedFillLiterals.set(t.literal,t.placeholder))}function dt(e,t){let n=e.recordedFillLiterals;if(!n||n.size===0)return t;let r=ke(t.result,n),i=(t.targetEvidenceMode??`action`)===`landmark`?ft(t.targetEvidence,n):D(t.targetEvidence,n),a=t.targetEvidences?{source:D(t.targetEvidences.source,n),destination:D(t.targetEvidences.destination,n)}:t.targetEvidences;return{...t,result:r,targetEvidence:i,targetEvidences:a}}function ft(e,t){return e&&(Ce(e,t)?void 0:e)}function D(e,t){return!e||!Ce(e,t)?e:{...Te(e,t),verification:`unverifiable`}}function pt(e,t){let n=e[0];return n?.startsWith(`@`)?e.length>=3?[n,e[1],t]:[n,t]:e.length>=3&&Number.isFinite(Number(e[0]))&&Number.isFinite(Number(e[1]))?[e[0],e[1],t]:n===void 0?[t]:[n,t]}const mt=new Set([`snapshot`,`get`,`is`,`find`]);function ht(e){return e.internal?.replayPlanStep!==!0&&mt.has(e.command)}function gt(e,t){return!t.interactiveObservation||E(e)===void 0?!1:t.flags?.record!==!0}const _t=Le();function vt(e){if(!e)return{};let t={};for(let n of _t){let r=e[n];r!==void 0&&(t[n]=r)}return t}function yt(e){let n=e.flatMap((e,t)=>e.command===`open`?[t]:[]);if(n.length!==1||n[0]!==0)throw new t(`COMMAND_FAILED`,`Cannot publish this session: an open-to-destination script requires exactly one initial recorded open.`,{retriable:!1,hint:`Close this session and start a fresh one with open <app> --save-script[=<path>].`});if(e.some(e=>e.command===`close`))throw new t(`COMMAND_FAILED`,`Cannot publish an active-session script containing close.`,{retriable:!1,hint:`Close this session and record the journey again from a fresh open --save-script session.`});let r=-1;for(let[t,n]of e.entries())ne({command:n.command,positionals:n.positionals,flags:n.flags})===`mutates-app`&&(r=t);if(!e.slice(r+1).some(Tt))throw new t(`COMMAND_FAILED`,`Cannot publish this session without a portable destination guard after the final mutating action.`,{retriable:!0,hint:`Record a selector-targeted wait on a labeled or id-bearing landmark, for example wait 'role="heading" label="Screen X"', so its recorded identity is captured, then retry session save-script.`})}function bt(e){for(let n of e){if(xt(n)){St(n);continue}let e=Et(n),r=e??(n.command===`wait`?n.positionals[0]:void 0);if(r?.startsWith(`@`))throw new t(`COMMAND_FAILED`,`Cannot publish recorded step "${n.command} ${r}": the session-local ref was not converted to a portable selector.`,{retriable:!1,hint:`Close this session and record the journey again using selectors or resolvable refs.`});if(n.command===`find`&&ne(n)===`mutates-app`)throw new t(`COMMAND_FAILED`,`Cannot publish a recorded mutating find step because its target identity is not replay-verifiable.`,{retriable:!1,hint:`Close this session and record the journey again with an explicit selector-targeted click, press, fill, or focus action.`});let i=e;if(!(!i||!l(i)||n.targetEvidence))throw new t(`COMMAND_FAILED`,`Cannot publish recorded step "${n.command} ${i}": recording-time target identity evidence is missing.`,{retriable:!1,hint:`Close this session and record the journey again from open --save-script so target-v1 evidence is captured before each interaction.`})}}function xt(e){return Ct(e)!==void 0}function St(e){let n=Ct(e);if(!n)return;let r=[n.source,n.destination];for(let n of r){if(n?.startsWith(`@`))throw new t(`COMMAND_FAILED`,`Cannot publish recorded drag endpoint "${n}": the session-local ref was not converted to a portable selector.`,{retriable:!1});if(!(!n||!l(n))&&!e.targetEvidences)throw new t(`COMMAND_FAILED`,`Cannot publish recorded drag endpoint "${n}": recording-time target identity evidence is missing.`,{retriable:!1,hint:`Close this session and record the journey again so targets-v1 evidence is captured for both drag endpoints.`})}}function Ct(e){return e.command===`gesture`?me(e.positionals):void 0}function wt(e,n){if(e instanceof t){if(e.details?.reason===`script_target_exists`)return new t(e.code,`A file already exists at ${String(e.details.path)}.`,{...e.details,retriable:!0,hint:`Retry session save-script with another path, or pass --force to replace the existing file. The session remains armed.`});let n=e.details?.retriable===!0;return new t(e.code,e.message,{...e.details,retriable:n,hint:e.details?.hint??(n?`Fix the recorded journey or target, then retry session save-script. The session remains armed.`:`Close this session and start a fresh one with open <app> --save-script[=<path>].`)})}let r=e instanceof Error?e.message:String(e);return new t(`COMMAND_FAILED`,`Failed to publish the active session script${n?` to ${n}`:``}: ${r}`,{retriable:!0,hint:`Check the target path and permissions, then retry session save-script. The session remains armed.`})}function Tt(e){if(e.command!==`wait`)return!1;let t=ee(e.positionals);return t?.kind!==`selector`||!l(t.selectorExpression)?!1:e.targetEvidence?.verification===`verified`}function Et(e){if(e.command===`get`)return e.positionals[1];if(se(e.command)||e.command===`fill`){let[t,n]=e.positionals;return t!==void 0&&n!==void 0&&Dt(t)&&Dt(n)?void 0:t}}function Dt(e){return e.trim().length>0&&Number.isFinite(Number(e))}function Ot(e){let t=e.scriptPublication??m;return t.kind===`repair`?t.status===`committed`||!be(t):!1}function kt(e){return!Pe(e.scriptPublication??m)||Ot(e)}var At=class{sessionsDir;constructor(e){this.sessionsDir=e}write(e,t){let n=rt(e),r=t?.publication===`active`,i;try{if(kt(e))return{written:!1};let a=jt(e,{appendCompleteSentinel:n,activePublication:r});i=this.resolveScriptPath(e);let o=C.dirname(i);return w.existsSync(o)||w.mkdirSync(o,{recursive:!0}),Pt({scriptPath:i,script:a.script,force:t?.force}),n&&(e.scriptPublication=Fe(e.scriptPublication??m)),{written:!0,path:i,actionCount:a.actionCount}}catch(t){return Mt({session:e,error:t,scriptPath:i,repairArmed:n,activePublication:r})}}resolveScriptPath(e){let t=Ee(e.scriptPublication??m);if(t)return S(t);let n=x(e.name),r=new Date(e.createdAt).toISOString().replaceAll(/[:.]/g,`-`);return C.join(this.sessionsDir,`${n}-${r}.ad`)}};function jt(e,t){let n=Ft(e,{strictPortableRefs:t.activePublication});return t.activePublication&&yt(n),{script:Gt(e,n,t.appendCompleteSentinel),actionCount:n.length}}function Mt(e){let{session:n,error:r,scriptPath:i,repairArmed:a,activePublication:o}=e;if(b({level:`warn`,phase:`session_script_write_failed`,data:{session:n.name,path:i,error:r instanceof Error?r.message:String(r)}}),a)return{written:!1,error:Nt(r,i)};if(o)return{written:!1,error:wt(r,i)};if(r instanceof t)throw r;return{written:!1}}function Nt(e,n){if(e instanceof t)return e;let r=e instanceof Error?e.message:String(e);return new t(`COMMAND_FAILED`,`Failed to write the healed script${n?` to ${n}`:``}: ${r}`,{hint:`The repair transaction completed but the healed .ad could not be published; check the target path and permissions, then retry close --save-script.`})}function Pt(e){let{scriptPath:n,script:r,force:i}=e;try{Ve({destination:n,contents:r,publish:i?`replace`:`link-exclusive`})}catch(e){throw e.code===`EEXIST`?new t(`COMMAND_FAILED`,`A file already exists at ${n}; remove it, pass replay --save-script=<other-path>, or pass --force/--overwrite to replace it.`,{reason:`script_target_exists`,path:n}):e}}function Ft(e,t={}){let n=E(e),r=n!==void 0,i=e.actions.slice(n??0),a=[];for(let n of i){if(n.command===`snapshot`)continue;let i=Rt(n);if(i){a.push(i);continue}(r||t.strictPortableRefs)&&It(n);let o=Wt(e,n);o&&a.push(o),a.push(n)}return t.strictPortableRefs&&bt(a),a}function It(e){let n=e.command===`gesture`?me(e.positionals??[]):void 0;if(n){Lt(n);return}if(!O(e.command))return;let r=e.command===`get`?e.positionals?.[1]:e.positionals?.[0];if(r?.startsWith(`@`))throw new t(`COMMAND_FAILED`,`Cannot write recorded step "${e.command} ${r}" to a script: it never resolved to a selector, so the ref would not resolve in a fresh replay session.`)}function Lt(e){let n=[e.source,e.destination].find(e=>e.startsWith(`@`));if(n)throw new t(`COMMAND_FAILED`,`Cannot write recorded drag endpoint "${n}" to a script: it never resolved to a selector, so the ref would not resolve in a fresh replay session.`)}function Rt(e){let t=zt(e);if(!(!t||!O(e.command)))return ce(e.command)||e.command===`hover`?{...e,positionals:[t]}:e.command===`longpress`?Vt(e,t):e.command===`fill`?Bt(e,t):Ht(e,t)}function zt(e){let t=Array.isArray(e.result?.selectorChain)&&e.result.selectorChain.every(e=>typeof e==`string`)?e.result.selectorChain:[];return t.length>0?t.join(` || `):void 0}function O(e){return se(e)||e===`fill`||e===`get`}function Bt(e,t){let n=p(e);return n.length>0?{...e,positionals:[t,n]}:void 0}function Vt(e,t){let n=typeof e.result?.durationMs==`number`?String(e.result.durationMs):Ut(e.positionals??[]);return{...e,positionals:n?[t,n]:[t]}}function Ht(e,t){let n=e.positionals?.[0];return n===`text`||n===`attrs`?{...e,positionals:[n,t]}:void 0}function Ut(e){let t=e.at(-1);if(!(e.length<=1||t===void 0||t.trim()===``))return Number.isFinite(Number(t))?t:void 0}function Wt(e,t){if(!O(t.command))return;let n=t.result?.refLabel;if(typeof n!=`string`||n.trim().length===0)return;let r=n.trim();return{ts:t.ts,command:`snapshot`,positionals:[],flags:{platform:e.device.platform,snapshotInteractiveOnly:!0,snapshotScope:r},result:{scope:r}}}function Gt(e,t,n){let i=[],a=e.device.kind?` kind=${e.device.kind}`:``;i.push(`context platform=${r(e.device)} device=${de(e.device.name)}${a} theme=unknown`);for(let e of t)e.flags?.noRecord||(i.push(...Xe(e)),i.push(Kt(e)));return n&&i.push(`# agent-device:heal-complete`),`${i.join(`
2
2
  `)}\n`}function Kt(e){return qt([e.command],e)||Ye(e)}function qt(e,t){if(ce(t.command))return Jt(e,t);if(t.command===`fill`)return Yt(e,t);if(t.command===`get`)return Xt(e,t)}function Jt(e,t){let n=t.positionals?.[0];if(n){if(n.startsWith(`@`))return e.push(d(u(n))),k(e,t),f(e,t),e.join(` `);if(t.positionals.length===1)return e.push(d(n)),f(e,t),e.join(` `)}}function Yt(e,t){let n=t.positionals?.[0];if(!n?.startsWith(`@`))return;e.push(d(u(n))),k(e,t);let r=t.positionals.slice(1).join(` `);return t.positionals.length>1&&e.push(d(r)),f(e,t),e.join(` `)}function Xt(e,t){let n=t.positionals?.[0],r=t.positionals?.[1];if(!(!n||!r))return e.push(d(n)),e.push(d(u(r))),r.startsWith(`@`)&&k(e,t),e.join(` `)}function k(e,t){let n=t.result?.refLabel;typeof n==`string`&&n.trim().length>0&&e.push(d(n))}const Zt=[`id`,`deviceId`,`device_id`,`serial`,`udid`,`device_udid`,`identifier`],Qt={ios:`iOS`,ipados:`iPadOS`,tvos:`tvOS`,watchos:`watchOS`,visionos:`visionOS`,macos:`macOS`,apple:`Apple`,android:`Android`,linux:`Linux`,web:`Web`};function $t(e,t){let n=t??{};switch(e.command){case h.devices:return en(n.devices);case h.apps:return tn(n.apps,e.flags?.appsFilter);case h.boot:return nn(`Booted`,n,!0);case h.shutdown:return nn(`Shut down`,n,!1);case h.install:return rn(`Installed`,n);case h.reinstall:return rn(`Reinstalled`,n);case h.screenshot:return an(e,n);default:return{}}}function en(e){if(!Array.isArray(e))return{};let t=e.flatMap(e=>{let t=sn(e);return t?[t]:[]}),n=t.slice(0,5),r=Math.max(0,t.length-n.length),i=t.slice(0,3);return{summary:gn(`Found ${t.length} ${_n(`device`,t.length)}`,i.map(e=>mn(e,!0)),Math.max(0,t.length-i.length)),details:{deviceCount:t.length,devices:n,...r>0?{omittedDeviceCount:r}:{}}}}function tn(e,t){if(!Array.isArray(e))return{};let n=e.flatMap(e=>{let t=M(e);return t?[t]:[]}),r=n.slice(0,5),i=Math.max(0,n.length-r.length),a=n.slice(0,3);return{summary:gn(`Found ${n.length} ${_n(`app`,n.length)}`,a,Math.max(0,n.length-a.length)),details:{appCount:n.length,apps:r,...i>0?{omittedAppCount:i}:{},...t===`all`||t===`user-installed`?{filter:t}:{}}}}function nn(e,t,n){let r=cn(t);if(!r)return{};let i={device:r,...pn(t),booted:n};return{summary:`${e} ${mn(i,!1)}`,details:i}}function rn(e,t){let n=M(t.appName),r=M(t.bundleId),i=A(t,[`packageName`,`package`]),a=M(t.platform),o=M(t.launchTarget),s=A(t,[`bundleId`,`packageName`,`package`,`appId`,`launchTarget`]),c=hn(n,s);if(!c)return{};let l={};return j(l,`appName`,n),j(l,`bundleId`,r),j(l,`packageName`,i),j(l,`platform`,a),o!==s&&j(l,`launchTarget`,o),{summary:`${e} ${c}`,details:l}}function an(e,t){let n=on(e,t);return n?{details:{requestedFileName:n}}:{}}function on(e,t){let n=R(e.meta?.clientArtifactPaths?.path)??R(t.path);if(n)return L(n)}function sn(e){if(!n(e))return;let t=cn(e);if(t)return{name:t,...pn(e)}}function cn(e){let t=A(e,[`name`,`deviceName`,`device`]);return!t||!ln(e,t)?t:dn(e)}function ln(e,t){let n=un(t);return Zt.some(t=>{let r=M(e[t]);return r!==void 0&&un(r)===n})}function un(e){return e.toLowerCase()}function dn(e){let t=M(e.appleOs),n=M(e.platform),r=M(e.kind),i=fn(t,n);return i&&(r===`simulator`||r===`emulator`)?`${i} ${r}`:i?`${i} device`:r===`simulator`?`Simulator`:r===`emulator`?`Emulator`:`Unnamed device`}function fn(e,t){let n=e??t;if(!(!n||!Object.hasOwn(Qt,n)))return Qt[n]}function pn(e){let t=M(e.platform),n=M(e.appleOs),r=M(e.kind),i=M(e.target);return{...t?{platform:t}:{},...n?{appleOs:n}:{},...r?{kind:r}:{},...i?{target:i}:{},...typeof e.booted==`boolean`?{booted:e.booted}:{}}}function mn(e,t){let n=M(e.name)??M(e.device)??`device`,r=M(e.platform),i=M(e.appleOs),a=[r,i===r?void 0:i,M(e.kind),M(e.target),t&&typeof e.booted==`boolean`?e.booted?`booted`:`stopped`:void 0].filter(e=>!!e);return a.length>0?`${n} (${a.join(`, `)})`:n}function hn(e,t){return e&&t&&e!==t?`${e} (${t})`:e??t}function A(e,t){for(let n of t){let t=M(e[n]);if(t)return t}}function j(e,t,n){n&&(e[t]=n)}function gn(e,t,n){let r=[...t,...n>0?[`+${n} more`]:[]];return r.length>0?`${e}: ${r.join(`, `)}`:e}function _n(e,t){return t===1?e:`${e}s`}function M(e){let t=R(e);if(!t)return;let n=t.trim(),r=Array.from(n);return r.length<=120?n:`${r.slice(0,119).join(``)}…`}function N(e){return M(e)}function P(e){return typeof e==`boolean`?e:void 0}function F(e,t){let n=N(e);return n&&t.includes(n)?n:void 0}function I(e){return Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0))}function L(e){let t=R(e);return t?M(t.split(/[\\/]/).at(-1)):void 0}function R(e){if(typeof e==`string`)return e.trim().length>0?e:void 0}function z(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}const vn=[`up`,`down`,`left`,`right`],yn=[`top`,`bottom`];function bn(e){return`${e.command===h.reinstall?`Reinstalled`:`Installed`} ${wn(e.result??{})??`app`}`}function xn(e){let t=e.result??{};switch(e.command){case h.scroll:return En(t);case h.screenshot:return kn(t);case h.home:return`Went home`;case h.back:return jn(t);case h.appSwitcher:return`Opened app switcher`;case h.actionButton:return`Pressed Action Button`;case h.orientation:return Nn(t);case h.fold:return Mn(t);case h.viewport:return Pn(t);case h.clipboard:return Fn(t);case h.keyboard:return In(t);case h.tvRemote:return zn(t);case h.gesture:return Bn(t);case h.swipe:return Vn(t);case h.trace:return Un(`trace`,e);case h.record:return Un(`recording`,e);default:return}}function Sn(e){let t=e.result??{};switch(e.command){case h.scroll:return I({direction:F(t.direction,vn),edge:F(t.edge,yn),passes:z(t.passes),amount:z(t.amount),pixels:z(t.pixels),durationMs:z(t.durationMs),x1:z(t.x1),y1:z(t.y1),x2:z(t.x2),y2:z(t.y2)});case h.screenshot:return I({requestedFileName:An(t)});case h.back:return I({mode:F(t.mode,g)});case h.orientation:return I({orientation:F(t.orientation,v)});case h.fold:return I({pose:F(t.pose,_)});case h.viewport:return I({width:z(t.width),height:z(t.height)});case h.clipboard:return I({action:F(t.action,[`read`,`write`])});case h.keyboard:return Rn(t);case h.tvRemote:return I({button:F(t.button,He),durationMs:z(t.durationMs)});case h.gesture:case h.swipe:return Hn(t);case h.trace:case h.record:return I({action:F(t.action,[`start`,`stop`]),fileName:Gn(e),showTouches:P(t.showTouches)});default:return{}}}function Cn(e,t){if(e.command!==h.screenshot)return t;let n=on(e,t);return n?{...t,requestedFileName:n}:t}function wn(e){let t=N(e.appName),n=Kn(e,[`bundleId`,`packageName`,`appBundleId`,`launchTarget`]);return t&&n&&t!==n?`${t} (${n})`:t??n??Tn(e)}function Tn(e){let t=N(e.app);return t&&!t.includes(`/`)&&!t.includes(`\\`)?t:void 0}function En(e){let t=F(e.direction,vn),n=F(e.edge,yn),r=z(e.passes);return n?Dn(n,r):t?On(t,e):`Scrolled`}function Dn(e,t){return t===0?`Already at ${e}`:t===void 0?`Scrolled to ${e}`:`Scrolled to ${e} in ${t} ${t===1?`pass`:`passes`}`}function On(e,t){let n=z(t.pixels);if(n!==void 0)return`Scrolled ${e} by ${n}px`;let r=z(t.amount);return r===void 0?`Scrolled ${e}`:`Scrolled ${e} by ${r}`}function kn(e){let t=An(e);return t?`Captured screenshot ${t}`:`Captured screenshot`}function An(e){return L(e.requestedFileName)??L(e.path)}function jn(e){return F(e.mode,g)===`system`?`Went back using system navigation`:`Went back`}function Mn(e){let t=F(e.pose,_);return t?`Folded to ${t}`:`Changed fold pose`}function Nn(e){let t=F(e.orientation,v);return t?P(e.confirmed)===!1?`Requested ${t} (unconfirmed)`:`Rotated to ${t}`:`Changed orientation`}function Pn(e){let t=z(e.width),n=z(e.height);return t!==void 0&&n!==void 0?`Set viewport to ${t}×${n}`:`Changed viewport`}function Fn(e){let t=F(e.action,[`read`,`write`]);return t===`read`?`Read clipboard`:t===`write`?`Updated clipboard`:`Used clipboard`}function In(e){let t=R(e.action);if(!t||!Ke(t))return`Used keyboard`;if(t===`dismiss`)return Ln(e);if(t===`enter`||t===`return`)return`Pressed keyboard return`;let n=P(e.visible);return n===void 0?`Inspected keyboard`:n?`Keyboard is visible`:`Keyboard is hidden`}function Ln(e){return P(e.dismissed)===!1?`Keyboard was already hidden`:`Dismissed keyboard`}function Rn(e){let t=R(e.action);return I({action:t&&Ke(t)?t:void 0,platform:F(e.platform,[`ios`,`android`]),visible:P(e.visible),wasVisible:P(e.wasVisible),dismissed:P(e.dismissed),attempts:z(e.attempts),mechanism:F(e.mechanism,[`dismissKey`])})}function zn(e){let t=F(e.button,He);return t?`Pressed TV remote ${t}`:`Used TV remote`}function Bn(e){let t=F(e.kind,[`fling`,`pan`,`pinch`,`rotate`,`transform`]);return t?`Ran ${t} gesture`:`Ran gesture`}function Vn(e){let t=z(e.count);return t!==void 0&&t>1?`Swiped ${t} times`:`Swiped`}function Hn(e){return I({kind:F(e.kind,[`fling`,`pan`,`pinch`,`rotate`,`transform`]),durationMs:z(e.durationMs),pointerCount:z(e.pointerCount),x1:z(e.x1),y1:z(e.y1),x2:z(e.x2),y2:z(e.y2),count:z(e.count),pauseMs:z(e.pauseMs),pattern:F(e.pattern,[`one-way`,`ping-pong`]),scale:z(e.scale)})}function Un(e,t){let n=Wn(e,F(t.result?.action,[`start`,`stop`])),r=Gn(t);return r?`${n} ${r}`:n}function Wn(e,t){return t===`start`?e===`trace`?`Started trace`:`Started recording`:t===`stop`?e===`trace`?`Stopped trace`:`Stopped recording`:e===`trace`?`Updated trace`:`Updated recording`}function Gn(e){let t=e.result??{};return L(t.requestedFileName)??L(t.outPath)??L(t.path)??L(e.positionals[1])}function Kn(e,t){for(let n of t){let t=N(e[n]);if(t)return t}}function qn(e){switch(e.command){case h.open:return`Opened ${B(e)??`session`}`;case h.close:return`Closed ${N(e.result?.session)??`session`}`;case h.click:case h.press:return`Tapped ${B(e)??`target`}`;case h.longPress:return`Long pressed ${B(e)??`target`}`;case h.hover:return`Hovered ${B(e)??`target`}`;case h.fill:return`Filled ${B(e)??`target`}`;case h.type:return`Typed text`;case h.install:case h.reinstall:case Ie.installSource:return bn(e);default:return xn(e)??`Ran ${e.command}`}}function Jn(e){return I({command:e.command,positionals:rr(e),flags:hr(e),...Yn(e),...Xn(e),...Zn(e),...Sn(e)})}function Yn(e){if(!Qn(e.command))return{};let t=e.result??{};return I({ref:G(t),targetLabel:B(e),selectorChainLength:dr(t.selectorChain)?.length,x:z(t.x),y:z(t.y),x2:z(t.x2),y2:z(t.y2),durationMs:z(t.durationMs)})}function Xn(e){if(!$n(e.command))return{};let t=e.result??{};return I({platform:F(t.platform,i),target:F(t.target,o),appName:N(t.appName),appBundleId:N(t.appBundleId),bundleId:N(t.bundleId),packageName:N(t.packageName),launchTarget:N(t.launchTarget)})}function Zn(e){let t=e.result??{};return e.command===h.snapshot?Array.isArray(t.nodes)?{nodeCount:t.nodes.length}:{}:e.command!==h.wait&&e.command!==h.find&&e.command!==h.get&&e.command!==h.is?{}:I({waitedMs:z(t.waitedMs),found:P(t.found)})}function Qn(e){return e===h.click||e===h.press||e===h.longPress||e===h.hover||e===h.focus||e===h.fill}function $n(e){return e===h.open||e===h.install||e===h.reinstall||e===Ie.installSource}function B(e){let t=e.result??{};return er(t)??tr(t)??nr(t)??lr(e.positionals[0])}function er(e){let t=G(e);if(t)return t.startsWith(`@`)?t:`@${t}`}function tr(e){let t=z(e.x),n=z(e.y);if(t!==void 0&&n!==void 0)return`(${t}, ${n})`}function nr(e){return N(e.appName)??N(e.appBundleId)??N(e.bundleId)??N(e.packageName)}function rr(e){if(e.positionals.length!==0)return e.command===h.type?[H(`text`)]:e.command===h.fill?ir(e):e.command===h.find?ar(e):e.command===h.clipboard?or(e):e.command===h.push?sr(e,`app`,`payload`):e.command===h.triggerAppEvent?sr(e,`event`,`payload`):e.positionals.map(V)}function ir(e){let t=H(`text`),n=e.result??{},r=G(n);if(r)return[`@${r}`,t];if(N(n.selector))return[H(`target`),t];let i=z(n.x),a=z(n.y);return i!==void 0&&a!==void 0?[String(i),String(a),t]:[t]}function ar(e){let t=+!!ur(e.positionals[0]);if(e.positionals[t]===void 0)return;let n=t+1,r=[...t===1?[String(e.positionals[0])]:[],H(`query`)],i=e.positionals[n];return i?i===`fill`||i===`type`?[...r,i,H(`text`)]:[...r,...e.positionals.slice(n).map(cr)]:r}function or(e){let t=e.positionals[0]?.toLowerCase();return t===`read`?[`read`]:t===`write`?[`write`,H(`text`)]:e.positionals.map(V)}function sr(e,t,n){let[r,i,...a]=e.positionals;return[...r?[H(t)]:[],...i?[H(n)]:[],...a.map(V)]}function cr(e){return e===`click`||e===`focus`||e===`exists`||e===`get`||e===`text`||e===`attrs`||e===`wait`?e:V(e)}function V(e){return lr(e)??H(`arg`)}function lr(e){if(!e)return;let t=e.trim();if(/^@[a-zA-Z0-9:_-]+$/.test(t))return t}function H(e){return`<${e}>`}function ur(e){return e===`text`||e===`label`||e===`value`||e===`role`||e===`id`}function dr(e){return Array.isArray(e)&&e.every(e=>typeof e==`string`)?e:void 0}const fr={enums:[{source:`platform`,values:a},{source:`target`,values:o}]},pr={booleans:[{source:`settle`}],numbers:[{source:`settleQuietMs`}]},mr={[h.open]:{booleans:[{source:`relaunch`},{source:`testIme`}],enums:[{source:`surface`,values:Re}]},[h.click]:U(),[h.press]:U(),[h.longPress]:U(),[h.hover]:U(),[h.fill]:_r(),[h.type]:_r(),[h.scroll]:{numbers:[{source:`pixels`},{source:`durationMs`}]},[h.gesture]:vr(),[h.swipe]:vr(),[h.screenshot]:{booleans:[{source:`overlayRefs`},{source:`screenshotFullscreen`,output:`fullscreen`},{source:`screenshotNoStabilize`,output:`noStabilize`},{source:`screenshotNormalizeStatusBar`,output:`normalizeStatusBar`}],numbers:[{source:`screenshotPixelDensity`,output:`pixelDensity`},{source:`screenshotScale`,output:`scale`}]},[h.snapshot]:{booleans:[{source:`snapshotInteractiveOnly`,output:`interactiveOnly`},{source:`snapshotDiff`,output:`diff`},{source:`snapshotRaw`,output:`raw`},{source:`snapshotCustomActions`,output:`actions`},{source:`snapshotForceFull`,output:`forceFull`}],numbers:[{source:`snapshotDepth`,output:`depth`}]},[h.back]:{enums:[{source:`backMode`,output:`mode`,values:g}]},[h.record]:{booleans:[{source:`hideTouches`}],numbers:[{source:`fps`}],enums:[{source:`recordingScope`,output:`scope`,values:re}]},[h.apps]:{enums:[{source:`appsFilter`,output:`filter`,values:[`user-installed`,`all`]}]},[h.boot]:{booleans:[{source:`headless`}]},[h.close]:{booleans:[{source:`shutdown`}]}};function hr(e){let t=e.flags??{},n={},r=Object.hasOwn(mr,e.command)?mr[e.command]:void 0;return W(n,t,fr),W(n,t,r),W(n,t,gr(e.command)),Object.keys(n).length>0?n:void 0}function gr(e){return te(e)?pr:void 0}function U(){return{booleans:[{source:`doubleTap`}],numbers:[{source:`count`},{source:`intervalMs`},{source:`holdMs`},{source:`jitterPx`}],enums:[{source:`clickButton`,values:Be}]}}function _r(){return{numbers:[{source:`delayMs`}]}}function vr(){return{numbers:[{source:`pointerCount`},{source:`count`},{source:`pauseMs`}],enums:[{source:`pattern`,values:ie}]}}function W(e,t,n){n&&(yr(e,t,n.booleans??[]),br(e,t,n.numbers??[]),xr(e,t,n.enums??[]))}function yr(e,t,n){for(let r of n)Sr(e,r.output??r.source,t[r.source])}function br(e,t,n){for(let r of n)Cr(e,r.output??r.source,t[r.source])}function xr(e,t,n){for(let r of n)wr(e,r.output??r.source,t[r.source],r.values)}function G(e){let t=N(e.ref);if(!t)return;let n=t.startsWith(`@`)?t.slice(1):t;return/^[a-zA-Z0-9:_-]+$/.test(n)?n:void 0}function Sr(e,t,n){typeof n==`boolean`&&(e[t]=n)}function Cr(e,t,n){let r=z(n);r!==void 0&&(e[t]=r)}function wr(e,t,n,r){let i=F(n,r);i!==void 0&&(e[t]=i)}const Tr=65536;function Er(e){return qe(`sha256`).update(e,`utf8`).digest(`hex`).slice(0,32)}function K(e,t){let n=Ar(e);if(n===void 0)return!1;try{let e=Or(t),r=Buffer.allocUnsafe(Tr),i=0;do if(i=w.readSync(n,r,0,r.length,null),!e.push(r.subarray(0,i)))return!0;while(i>0);return e.end(),!0}finally{w.closeSync(n)}}async function Dr(e){let t=await jr(e);if(t===void 0)return{lineCount:0,firstLineDigest:void 0};let n={lineCount:0,firstLineDigest:void 0};try{let e=Or(e=>{n.lineCount===0&&(n.firstLineDigest=Er(e)),n.lineCount+=1}),r=Buffer.allocUnsafe(Tr);for(;;){let{bytesRead:n}=await t.read(r,0,r.length,null);if(e.push(r.subarray(0,n)),n===0)break}return e.end(),n}finally{await t.close()}}function q(e){let t;return K(e,e=>(t=Er(e),!1)),t}function Or(e){let t=new Je(`utf8`),n=``,r=!1;return{push(i){if(r)return!1;let a=`${n}${t.write(i)}`,o=0;for(let t=a.indexOf(`
3
3
  `);t!==-1;t=a.indexOf(`
4
- `,o)){if(kr(a.slice(o,t),e)===!1)return r=!0,!1;o=t+1}return n=a.slice(o),!0},end(){r||kr(`${n}${t.end()}`,e)}}}function kr(e,t){let n=e.endsWith(`\r`)?e.slice(0,-1):e;if(n.trim().length!==0)return t(n)}function Ar(e){try{return w.openSync(e,`r`)}catch(e){if(e.code===`ENOENT`)return;throw e}}async function jr(e){try{return await w.promises.open(e,`r`)}catch(e){if(e.code===`ENOENT`)return;throw e}}const Mr=5242880;function Nr(e=process.env){let t=e.AGENT_DEVICE_EVENT_LOG_MAX_BYTES?.trim();if(t===void 0||!/^\d+$/.test(t))return Mr;let n=Number(t);return Number.isSafeInteger(n)&&n>0?n:Mr}function J(e){return`${e}.1`}function Y(e){return`${e}.window.json`}function Pr(e){let t;for(let n=0;n<3;n+=1){let n=Z(e);try{let t=Fr(e);if(Z(e)===n)return t}catch(r){if(t=r,Z(e)===n)throw r}}throw t??X(e,`the window did not settle while reading`)}function Fr(e){let t=J(e),n=Hr(e);if(n===`unverifiable`)throw X(e,`window file is invalid`);if(n===void 0)return Ir(e,t);let r=n.at(-1);if(!r)throw X(e,`window file records no generation`);let i=Gr(e),a=Lr(e,r),o=[],s=Rr({eventLogPath:e,rotatedPath:t,sidecar:n,activeStart:a,activeExists:i});return s!==void 0&&o.push({path:t,firstLineIndex:s}),i&&o.push({path:e,firstLineIndex:a}),{files:o,earliestCursor:o[0]?.firstLineIndex??a}}function Ir(e,t){if(q(t)!==void 0)throw X(e,`a rotated event log exists with no window record`);return{files:Gr(e)?[{path:e,firstLineIndex:0}]:[],earliestCursor:0}}function Lr(e,t){let n=q(e);return n!==void 0&&n===t.firstLineDigest?t.firstLineIndex:t.firstLineIndex+t.lineCount}function Rr(e){let{eventLogPath:t,rotatedPath:n,sidecar:r,activeStart:i,activeExists:a}=e,o=q(n);if(o===void 0)return;let s=r.find(e=>e.firstLineDigest===o);if(!s)throw X(t,`the rotated event log matches no window record`);let c=Vr(n);if(c!==s.lineCount)throw X(t,`the rotated event log holds ${c} lines, the window recorded ${s.lineCount}`);if(a&&s.firstLineIndex+s.lineCount!==i)throw X(t,`retained event log generations are not contiguous`);return s.firstLineIndex}async function zr(e,t){let n=Kr(e);if(!n||n.size<t)return!1;let r=Hr(e);if(r===`unverifiable`)return await w.promises.rename(e,J(e)),!0;let i=await Dr(e);if(i.firstLineDigest!==void 0){let t=r??[],n=t.at(-1),a=n&&n.firstLineDigest===i.firstLineDigest?n:{firstLineIndex:n?n.firstLineIndex+n.lineCount:0,lineCount:i.lineCount,firstLineDigest:i.firstLineDigest};await Wr(e,(a===n?t:[...t,a]).slice(-2))}return await w.promises.rename(e,J(e)),!0}function Br(t,n){if(!(t>=n))throw new e(`COMMAND_FAILED`,`events cursor ${t} precedes the retained event log window; events before cursor ${n} were rotated out.`,{reason:`EVENT_LOG_CURSOR_EXPIRED`,cursor:t,earliestCursor:n,hint:`Resume with cursor ${n}, the oldest retained event; earlier events are no longer available.`})}function X(t,n){return new e(`COMMAND_FAILED`,`Session event log window cannot be verified: ${n}.`,{reason:`EVENT_LOG_WINDOW_UNVERIFIED`,path:t,hint:`Cursor positions for this session cannot be resolved. Delete ${t}, ${J(t)}, and ${Y(t)} to restart the timeline, or read the files directly.`})}function Vr(e){let t=0;return K(e,()=>{t+=1}),t}function Z(e){return[Q(Y(e)),Q(e),Q(J(e))].join(`|`)}function Q(e){try{let t=w.lstatSync(e);return`${t.ino}:${t.size}:${t.mtimeMs}`}catch{return`absent`}}function Hr(e){let t;try{t=w.readFileSync(Y(e),`utf8`)}catch(e){return e.code===`ENOENT`?void 0:`unverifiable`}try{let e=JSON.parse(t);if(!n(e)||e.version!==2)return`unverifiable`;let{generations:r}=e;if(!Array.isArray(r)||r.length===0)return`unverifiable`;let i=r.map(Ur);return i.every(e=>e!==void 0)?i:`unverifiable`}catch{return`unverifiable`}}function Ur(e){if(!n(e))return;let{firstLineIndex:t,lineCount:r,firstLineDigest:i}=e;if(!(!Number.isSafeInteger(t)||t<0)&&!(!Number.isSafeInteger(r)||r<0)&&typeof i==`string`&&i.length!==0)return{firstLineIndex:t,lineCount:r,firstLineDigest:i}}async function Wr(e,t){let n=Y(e),r=`${n}.${process.pid}.tmp`;await w.promises.writeFile(r,JSON.stringify({version:2,generations:t}),`utf8`),await w.promises.rename(r,n)}function Gr(e){return Kr(e)!==void 0}function Kr(t){try{let n=w.lstatSync(t);if(n.isSymbolicLink())throw new e(`COMMAND_FAILED`,`Session event log must not be a symbolic link: ${t}`);return n}catch(e){if(e.code===`ENOENT`)return;throw e}}const $=new Map,qr=new Set;function Jr(e){return C.join(e,`events.ndjson`)}function Yr(e){return e.command!==h.events}function Xr(e,n,r){let i=t({version:1,ts:r.ts??new Date().toISOString(),session:n,...r});Qr(e,`${JSON.stringify(i)}\n`)}async function Zr(e){await(e?$.get(e):Promise.all($.values()))}function Qr(e,t){let n=($.get(e)??Promise.resolve()).catch(()=>void 0).then(async()=>{await $r(e),await zr(e,Nr()),await w.promises.appendFile(e,t,`utf8`)}).catch(t=>{b({level:`warn`,phase:`session_event_log_write_failed`,data:{path:e,error:t instanceof Error?t.message:String(t)}})}).finally(()=>{$.get(e)===n&&$.delete(e)});$.set(e,n)}async function $r(e){let t=C.dirname(e);if(!qr.has(t))try{await w.promises.mkdir(t,{recursive:!0}),qr.add(t)}catch(t){throw b({level:`warn`,phase:`session_event_log_dir_failed`,data:{path:e,error:t instanceof Error?t.message:String(t)}}),t}}function ei(e,t,n){Xr(e,t,{kind:`action.recorded`,requestId:y().requestId,command:n.command,summary:qn(n),details:Jn(n)})}function ti(e){let{req:t}=e;return{kind:`request.started`,requestId:t.meta?.requestId??y().requestId,command:t.command,summary:`Started ${t.command}`}}function ni(e){let{req:t,response:n,durationMs:r}=e;if(n.ok){let e=$t(t,n.data);return{kind:`request.finished`,requestId:t.meta?.requestId??y().requestId,command:t.command,status:`ok`,summary:e.summary??`Finished ${t.command}`,details:{durationMs:r,...e.details}}}return{kind:`request.finished`,requestId:t.meta?.requestId??y().requestId,command:t.command,status:`error`,summary:`Failed ${t.command}: ${n.error.code}`,details:{durationMs:r,code:n.error.code,diagnosticId:n.error.diagnosticId}}}function ri(e,t={}){let n=ai(t.cursor),r=oi(t.limit),i=Pr(e);Br(n,i.earliestCursor);let a=ii(i.files,n,r),o=a.lines.flatMap(e=>{let t=si(e);return t?[t]:[]});return{path:e,cursor:String(n),limit:r,events:o,...a.nextCursor===void 0?{}:{nextCursor:String(a.nextCursor)}}}function ii(e,t,n){let r=[],i;for(let a of e){let e=a.firstLineIndex;if(K(a.path,a=>{if(e>=t+n)return i=t+n,!1;e>=t&&r.push(a),e+=1}),i!==void 0)break}return{lines:r,...i===void 0?{}:{nextCursor:i}}}function ai(t){if(t===void 0||t.trim()===``)return 0;let n=Number(t);if(Number.isInteger(n)&&n>=0)return n;throw new e(`INVALID_ARGS`,`events cursor must be a non-negative integer string.`)}function oi(t){if(t===void 0||typeof t==`string`&&t.trim()===``)return 100;let n=typeof t==`string`?Number(t):t;if(Number.isInteger(n)&&n>=1&&n<=500)return n;throw new e(`INVALID_ARGS`,`events limit must be between 1 and 500.`)}function si(e){try{let t=ci(JSON.parse(e));return t?li(t):void 0}catch{return}}function ci(e){if(n(e)&&e.version===1&&typeof e.ts==`string`&&typeof e.session==`string`&&ui(e.kind))return e}function li(e){let t=n(e.details)?e.details:void 0;return{version:1,ts:e.ts,session:e.session,kind:e.kind,...typeof e.requestId==`string`?{requestId:e.requestId}:{},...typeof e.command==`string`?{command:e.command}:{},...di(e.status)?{status:e.status}:{},...typeof e.summary==`string`?{summary:e.summary}:{},...t?{details:t}:{}}}function ui(e){return e===`request.started`||e===`request.finished`||e===`action.recorded`}function di(e){return e===`ok`||e===`error`}const fi=36e5;var pi=class{sessions=new Map;runtimeHints=new Map;sessionsDir;scriptWriter;constructor(e){this.sessionsDir=e,this.scriptWriter=new At(e)}get(e){return this.sessions.get(e)}set(e,t){this.sessions.set(e,t)}delete(e){return this.runtimeHints.delete(e),this.sessions.delete(e)}values(){return this.sessions.values()}toArray(){return Array.from(this.sessions.values())}lookup(e){let t=this.sessions.get(e);return t?{address:e,session:t}:void 0}findByDevice(e){for(let[t,n]of this.sessions)if(n.device.id===e)return{address:t,session:n}}listRefs(){return Array.from(this.sessions,([e,t])=>({address:e,session:t}))}getRuntimeHints(e){return this.runtimeHints.get(e)}setRuntimeHints(e,t){this.runtimeHints.set(e,t)}clearRuntimeHints(e){return this.runtimeHints.delete(e)}recordAction(e,t){let n=ot(e,t);if(n){let t=this.resolveStoredSessionName(e);ei(this.resolveEventLogPath(t),t,n)}}recordEvent(e,t){Xr(this.resolveEventLogPath(e),e,t)}readEvents(e,t={}){return ri(this.resolveEventLogPath(e),t)}async flushEvents(e){await Zr(e?this.resolveEventLogPath(e):void 0)}writeSessionLog(e,t){let n=this.scriptWriter.write(e,t);return n.written&&b({level:`info`,phase:`session_script_written`,data:{session:e.name,path:n.path}}),n}finalizeRepairTeardown(e){this.recordRepairFinalizeCloseIfCommitting(e);let t=this.writeSessionLog(e,{force:De(e,void 0)});it(e)&&(!t.written&&t.error?this.writeRepairTombstone(e,fi,{code:String(t.error.code),message:t.error.message}):this.writeRepairTombstone(e))}recordRepairFinalizeCloseIfCommitting(e){let t=e.scriptPublication??m;be(t)&&this.recordAction(e,{command:`close`,positionals:[],flags:{},result:{session:e.name,...ze(`Closed: ${e.name}`)}})}writeRepairTombstone(e,t=fi,n){try{let r=this.resolveSessionDir(e.name);w.mkdirSync(r,{recursive:!0});let i={owner:e.name,reapedAt:Date.now(),expiresAt:Date.now()+t,...at(e)?{sourcePath:at(e)}:{},...n?{commitFailure:n}:{}};w.writeFileSync(this.repairTombstonePath(e.name),`${JSON.stringify(i)}\n`)}catch(t){b({level:`warn`,phase:`repair_tombstone_write_failed`,data:{session:e.name,error:t instanceof Error?t.message:String(t)}})}}readRepairTombstone(e){return Ue(this.repairTombstonePath(e))}clearRepairTombstone(e){try{w.rmSync(this.repairTombstonePath(e),{force:!0})}catch{}}repairTombstonePath(e){return We(this.resolveSessionDir(e))}defaultTracePath(e){let t=x(e.name),n=new Date().toISOString().replaceAll(/[:.]/g,`-`);return C.join(this.sessionsDir,`${t}-${n}.trace.log`)}resolveSessionDir(t){if(!Ge(t))throw new e(`INVALID_ARGS`,`Invalid session name ${JSON.stringify(t)}: a session name cannot be empty, ".", or "..".`);return C.join(this.sessionsDir,x(t))}resolveDaemonStateDir(){return C.dirname(this.sessionsDir)}ensureSessionDir(e){let t=this.resolveSessionDir(e);return w.mkdirSync(t,{recursive:!0}),t}resolveAppLogPath(e){return C.join(this.resolveSessionDir(e),`app.log`)}resolveAppLogPidPath(e){return C.join(this.resolveSessionDir(e),`app-log.pid`)}resolveEventLogPath(e){return Jr(this.resolveSessionDir(e))}static expandHome(e,t){return S(e,t)}resolveStoredSessionName(e){for(let[t,n]of this.sessions)if(n===e)return t;return e.name}};export{Qe as _,rr as a,st as c,nt as d,rt as f,E as g,et as h,Yr as i,tt as l,$e as m,ni as n,Cn as o,it as p,ti as r,ht as s,pi as t,Ze as u};
4
+ `,o)){if(kr(a.slice(o,t),e)===!1)return r=!0,!1;o=t+1}return n=a.slice(o),!0},end(){r||kr(`${n}${t.end()}`,e)}}}function kr(e,t){let n=e.endsWith(`\r`)?e.slice(0,-1):e;if(n.trim().length!==0)return t(n)}function Ar(e){try{return w.openSync(e,`r`)}catch(e){if(e.code===`ENOENT`)return;throw e}}async function jr(e){try{return await w.promises.open(e,`r`)}catch(e){if(e.code===`ENOENT`)return;throw e}}const Mr=5242880;function Nr(e=process.env){let t=e.AGENT_DEVICE_EVENT_LOG_MAX_BYTES?.trim();if(t===void 0||!/^\d+$/.test(t))return Mr;let n=Number(t);return Number.isSafeInteger(n)&&n>0?n:Mr}function J(e){return`${e}.1`}function Y(e){return`${e}.window.json`}function Pr(e){let t;for(let n=0;n<3;n+=1){let n=Z(e);try{let t=Fr(e);if(Z(e)===n)return t}catch(r){if(t=r,Z(e)===n)throw r}}throw t??X(e,`the window did not settle while reading`)}function Fr(e){let t=J(e),n=Hr(e);if(n===`unverifiable`)throw X(e,`window file is invalid`);if(n===void 0)return Ir(e,t);let r=n.at(-1);if(!r)throw X(e,`window file records no generation`);let i=Gr(e),a=Lr(e,r),o=[],s=Rr({eventLogPath:e,rotatedPath:t,sidecar:n,activeStart:a,activeExists:i});return s!==void 0&&o.push({path:t,firstLineIndex:s}),i&&o.push({path:e,firstLineIndex:a}),{files:o,earliestCursor:o[0]?.firstLineIndex??a}}function Ir(e,t){if(q(t)!==void 0)throw X(e,`a rotated event log exists with no window record`);return{files:Gr(e)?[{path:e,firstLineIndex:0}]:[],earliestCursor:0}}function Lr(e,t){let n=q(e);return n!==void 0&&n===t.firstLineDigest?t.firstLineIndex:t.firstLineIndex+t.lineCount}function Rr(e){let{eventLogPath:t,rotatedPath:n,sidecar:r,activeStart:i,activeExists:a}=e,o=q(n);if(o===void 0)return;let s=r.find(e=>e.firstLineDigest===o);if(!s)throw X(t,`the rotated event log matches no window record`);let c=Vr(n);if(c!==s.lineCount)throw X(t,`the rotated event log holds ${c} lines, the window recorded ${s.lineCount}`);if(a&&s.firstLineIndex+s.lineCount!==i)throw X(t,`retained event log generations are not contiguous`);return s.firstLineIndex}async function zr(e,t){let n=Kr(e);if(!n||n.size<t)return!1;let r=Hr(e);if(r===`unverifiable`)return await w.promises.rename(e,J(e)),!0;let i=await Dr(e);if(i.firstLineDigest!==void 0){let t=r??[],n=t.at(-1),a=n&&n.firstLineDigest===i.firstLineDigest?n:{firstLineIndex:n?n.firstLineIndex+n.lineCount:0,lineCount:i.lineCount,firstLineDigest:i.firstLineDigest};await Wr(e,(a===n?t:[...t,a]).slice(-2))}return await w.promises.rename(e,J(e)),!0}function Br(e,n){if(!(e>=n))throw new t(`COMMAND_FAILED`,`events cursor ${e} precedes the retained event log window; events before cursor ${n} were rotated out.`,{reason:`EVENT_LOG_CURSOR_EXPIRED`,cursor:e,earliestCursor:n,hint:`Resume with cursor ${n}, the oldest retained event; earlier events are no longer available.`})}function X(e,n){return new t(`COMMAND_FAILED`,`Session event log window cannot be verified: ${n}.`,{reason:`EVENT_LOG_WINDOW_UNVERIFIED`,path:e,hint:`Cursor positions for this session cannot be resolved. Delete ${e}, ${J(e)}, and ${Y(e)} to restart the timeline, or read the files directly.`})}function Vr(e){let t=0;return K(e,()=>{t+=1}),t}function Z(e){return[Q(Y(e)),Q(e),Q(J(e))].join(`|`)}function Q(e){try{let t=w.lstatSync(e);return`${t.ino}:${t.size}:${t.mtimeMs}`}catch{return`absent`}}function Hr(e){let t;try{t=w.readFileSync(Y(e),`utf8`)}catch(e){return e.code===`ENOENT`?void 0:`unverifiable`}try{let e=JSON.parse(t);if(!n(e)||e.version!==2)return`unverifiable`;let{generations:r}=e;if(!Array.isArray(r)||r.length===0)return`unverifiable`;let i=r.map(Ur);return i.every(e=>e!==void 0)?i:`unverifiable`}catch{return`unverifiable`}}function Ur(e){if(!n(e))return;let{firstLineIndex:t,lineCount:r,firstLineDigest:i}=e;if(!(!Number.isSafeInteger(t)||t<0)&&!(!Number.isSafeInteger(r)||r<0)&&typeof i==`string`&&i.length!==0)return{firstLineIndex:t,lineCount:r,firstLineDigest:i}}async function Wr(e,t){let n=Y(e),r=`${n}.${process.pid}.tmp`;await w.promises.writeFile(r,JSON.stringify({version:2,generations:t}),`utf8`),await w.promises.rename(r,n)}function Gr(e){return Kr(e)!==void 0}function Kr(e){try{let n=w.lstatSync(e);if(n.isSymbolicLink())throw new t(`COMMAND_FAILED`,`Session event log must not be a symbolic link: ${e}`);return n}catch(e){if(e.code===`ENOENT`)return;throw e}}const $=new Map,qr=new Set;function Jr(e){return C.join(e,`events.ndjson`)}function Yr(e){return e.command!==h.events}function Xr(t,n,r){let i=e({version:1,ts:r.ts??new Date().toISOString(),session:n,...r});Qr(t,`${JSON.stringify(i)}\n`)}async function Zr(e){await(e?$.get(e):Promise.all($.values()))}function Qr(e,t){let n=($.get(e)??Promise.resolve()).catch(()=>void 0).then(async()=>{await $r(e),await zr(e,Nr()),await w.promises.appendFile(e,t,`utf8`)}).catch(t=>{b({level:`warn`,phase:`session_event_log_write_failed`,data:{path:e,error:t instanceof Error?t.message:String(t)}})}).finally(()=>{$.get(e)===n&&$.delete(e)});$.set(e,n)}async function $r(e){let t=C.dirname(e);if(!qr.has(t))try{await w.promises.mkdir(t,{recursive:!0}),qr.add(t)}catch(t){throw b({level:`warn`,phase:`session_event_log_dir_failed`,data:{path:e,error:t instanceof Error?t.message:String(t)}}),t}}function ei(e,t,n){Xr(e,t,{kind:`action.recorded`,requestId:y().requestId,command:n.command,summary:qn(n),details:Jn(n)})}function ti(e){let{req:t}=e;return{kind:`request.started`,requestId:t.meta?.requestId??y().requestId,command:t.command,summary:`Started ${t.command}`}}function ni(e){let{req:t,response:n,durationMs:r}=e;if(n.ok){let e=$t(t,n.data);return{kind:`request.finished`,requestId:t.meta?.requestId??y().requestId,command:t.command,status:`ok`,summary:e.summary??`Finished ${t.command}`,details:{durationMs:r,...e.details}}}return{kind:`request.finished`,requestId:t.meta?.requestId??y().requestId,command:t.command,status:`error`,summary:`Failed ${t.command}: ${n.error.code}`,details:{durationMs:r,code:n.error.code,diagnosticId:n.error.diagnosticId}}}function ri(e,t={}){let n=ai(t.cursor),r=oi(t.limit),i=Pr(e);Br(n,i.earliestCursor);let a=ii(i.files,n,r),o=a.lines.flatMap(e=>{let t=si(e);return t?[t]:[]});return{path:e,cursor:String(n),limit:r,events:o,...a.nextCursor===void 0?{}:{nextCursor:String(a.nextCursor)}}}function ii(e,t,n){let r=[],i;for(let a of e){let e=a.firstLineIndex;if(K(a.path,a=>{if(e>=t+n)return i=t+n,!1;e>=t&&r.push(a),e+=1}),i!==void 0)break}return{lines:r,...i===void 0?{}:{nextCursor:i}}}function ai(e){if(e===void 0||e.trim()===``)return 0;let n=Number(e);if(Number.isInteger(n)&&n>=0)return n;throw new t(`INVALID_ARGS`,`events cursor must be a non-negative integer string.`)}function oi(e){if(e===void 0||typeof e==`string`&&e.trim()===``)return 100;let n=typeof e==`string`?Number(e):e;if(Number.isInteger(n)&&n>=1&&n<=500)return n;throw new t(`INVALID_ARGS`,`events limit must be between 1 and 500.`)}function si(e){try{let t=ci(JSON.parse(e));return t?li(t):void 0}catch{return}}function ci(e){if(n(e)&&e.version===1&&typeof e.ts==`string`&&typeof e.session==`string`&&ui(e.kind))return e}function li(e){let t=n(e.details)?e.details:void 0;return{version:1,ts:e.ts,session:e.session,kind:e.kind,...typeof e.requestId==`string`?{requestId:e.requestId}:{},...typeof e.command==`string`?{command:e.command}:{},...di(e.status)?{status:e.status}:{},...typeof e.summary==`string`?{summary:e.summary}:{},...t?{details:t}:{}}}function ui(e){return e===`request.started`||e===`request.finished`||e===`action.recorded`}function di(e){return e===`ok`||e===`error`}const fi=36e5;var pi=class{sessions=new Map;runtimeHints=new Map;sessionsDir;scriptWriter;constructor(e){this.sessionsDir=e,this.scriptWriter=new At(e)}get(e){return this.sessions.get(e)}set(e,t){this.sessions.set(e,t)}delete(e){return this.runtimeHints.delete(e),this.sessions.delete(e)}values(){return this.sessions.values()}toArray(){return Array.from(this.sessions.values())}lookup(e){let t=this.sessions.get(e);return t?{address:e,session:t}:void 0}findByDevice(e){for(let[t,n]of this.sessions)if(n.device.id===e)return{address:t,session:n}}listRefs(){return Array.from(this.sessions,([e,t])=>({address:e,session:t}))}getRuntimeHints(e){return this.runtimeHints.get(e)}setRuntimeHints(e,t){this.runtimeHints.set(e,t)}clearRuntimeHints(e){return this.runtimeHints.delete(e)}recordAction(e,t){let n=ot(e,t);if(n){let t=this.resolveStoredSessionName(e);ei(this.resolveEventLogPath(t),t,n)}}recordEvent(e,t){Xr(this.resolveEventLogPath(e),e,t)}readEvents(e,t={}){return ri(this.resolveEventLogPath(e),t)}async flushEvents(e){await Zr(e?this.resolveEventLogPath(e):void 0)}writeSessionLog(e,t){let n=this.scriptWriter.write(e,t);return n.written&&b({level:`info`,phase:`session_script_written`,data:{session:e.name,path:n.path}}),n}finalizeRepairTeardown(e){this.recordRepairFinalizeCloseIfCommitting(e);let t=this.writeSessionLog(e,{force:De(e,void 0)});it(e)&&(!t.written&&t.error?this.writeRepairTombstone(e,fi,{code:String(t.error.code),message:t.error.message}):this.writeRepairTombstone(e))}recordRepairFinalizeCloseIfCommitting(e){let t=e.scriptPublication??m;be(t)&&this.recordAction(e,{command:`close`,positionals:[],flags:{},result:{session:e.name,...ze(`Closed: ${e.name}`)}})}writeRepairTombstone(e,t=fi,n){try{let r=this.resolveSessionDir(e.name);w.mkdirSync(r,{recursive:!0});let i={owner:e.name,reapedAt:Date.now(),expiresAt:Date.now()+t,...at(e)?{sourcePath:at(e)}:{},...n?{commitFailure:n}:{}};w.writeFileSync(this.repairTombstonePath(e.name),`${JSON.stringify(i)}\n`)}catch(t){b({level:`warn`,phase:`repair_tombstone_write_failed`,data:{session:e.name,error:t instanceof Error?t.message:String(t)}})}}readRepairTombstone(e){return Ue(this.repairTombstonePath(e))}clearRepairTombstone(e){try{w.rmSync(this.repairTombstonePath(e),{force:!0})}catch{}}repairTombstonePath(e){return We(this.resolveSessionDir(e))}defaultTracePath(e){let t=x(e.name),n=new Date().toISOString().replaceAll(/[:.]/g,`-`);return C.join(this.sessionsDir,`${t}-${n}.trace.log`)}resolveSessionDir(e){if(!Ge(e))throw new t(`INVALID_ARGS`,`Invalid session name ${JSON.stringify(e)}: a session name cannot be empty, ".", or "..".`);return C.join(this.sessionsDir,x(e))}resolveDaemonStateDir(){return C.dirname(this.sessionsDir)}ensureSessionDir(e){let t=this.resolveSessionDir(e);return w.mkdirSync(t,{recursive:!0}),t}resolveAppLogPath(e){return C.join(this.resolveSessionDir(e),`app.log`)}resolveAppLogPidPath(e){return C.join(this.resolveSessionDir(e),`app-log.pid`)}resolveEventLogPath(e){return Jr(this.resolveSessionDir(e))}static expandHome(e,t){return S(e,t)}resolveStoredSessionName(e){for(let[t,n]of this.sessions)if(n===e)return t;return e.name}};export{Qe as _,rr as a,st as c,nt as d,rt as f,E as g,et as h,Yr as i,tt as l,$e as m,ni as n,Cn as o,it as p,ti as r,ht as s,pi as t,Ze as u};