agent-device 0.21.22 → 0.21.24

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 (273) hide show
  1. package/README.md +6 -6
  2. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.22.apk → agent-device-android-ime-helper-0.21.24.apk} +0 -0
  3. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.24.apk.sha256 +1 -0
  4. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.22.manifest.json → agent-device-android-ime-helper-0.21.24.manifest.json} +4 -4
  5. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.24.apk +0 -0
  6. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.24.apk.sha256 +1 -0
  7. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.22.manifest.json → agent-device-android-snapshot-helper-0.21.24.manifest.json} +6 -6
  8. package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/SnapshotTraversal.swift +12 -6
  9. package/apple/macos-helper/Tests/AgentDeviceMacOSHelperTests/RectResponseTests.swift +21 -0
  10. package/apple/snapshot-bridge/README.md +9 -7
  11. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandDispatch.swift +56 -0
  12. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +14 -5
  13. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Lifecycle.swift +8 -0
  14. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +12 -0
  15. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCaptureTarget.swift +1 -1
  16. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotExecution.swift +29 -5
  17. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +34 -10
  18. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryFocus.swift +19 -5
  19. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextTyping.swift +3 -3
  20. package/dist/src/adapter.js +1 -1
  21. package/dist/src/adb.js +1 -1
  22. package/dist/src/agent-browser-lifecycle.js +1 -1
  23. package/dist/src/agent-browser-process-record.js +1 -1
  24. package/dist/src/agent-browser-provider.js +1 -1
  25. package/dist/src/agent-device-client.js +2 -2
  26. package/dist/src/alert-runtime.js +1 -1
  27. package/dist/src/alert.js +1 -1
  28. package/dist/src/android-adb.d.ts +3 -2
  29. package/dist/src/android-input-ownership.js +1 -1
  30. package/dist/src/app-backend.js +1 -1
  31. package/dist/src/app-inventory.d.ts +4 -0
  32. package/dist/src/app-launch.js +1 -1
  33. package/dist/src/app-lifecycle.js +1 -1
  34. package/dist/src/app-log-reconnect.js +1 -1
  35. package/dist/src/app-log-runtime2.js +3 -3
  36. package/dist/src/app-resolution.js +2 -2
  37. package/dist/src/app-state-runtime.d.ts +15 -0
  38. package/dist/src/apple-runner-platform.js +1 -1
  39. package/dist/src/application-lifecycle-interaction.js +1 -1
  40. package/dist/src/aws-device-farm-connection.js +1 -0
  41. package/dist/src/back-mode.js +1 -1
  42. package/dist/src/backend-snapshot-options.js +1 -1
  43. package/dist/src/browserstack-connection.js +1 -0
  44. package/dist/src/browserstack-device-features.js +1 -0
  45. package/dist/src/browserstack.js +1 -0
  46. package/dist/src/cache.js +1 -1
  47. package/dist/src/cli-config.js +1 -1
  48. package/dist/src/cli-help.js +35 -19
  49. package/dist/src/cli-runner.js +1 -1
  50. package/dist/src/cli.js +3 -4
  51. package/dist/src/client-companion-tunnel.js +1 -0
  52. package/dist/src/client-metro-companion.js +1 -1
  53. package/dist/src/client-metro.js +1 -1
  54. package/dist/src/client-options.js +3 -3
  55. package/dist/src/client-types.d.ts +7 -5
  56. package/dist/src/cloud-artifacts.d.ts +9 -2
  57. package/dist/src/code-signature-cache.js +1 -1
  58. package/dist/src/command-metadata.js +1 -1
  59. package/dist/src/command-schema.js +1 -1
  60. package/dist/src/command-tools.js +2 -2
  61. package/dist/src/connection-runtime.js +1 -1
  62. package/dist/src/connection-verification.js +1 -0
  63. package/dist/src/connection.js +5 -5
  64. package/dist/src/contracts.d.ts +1 -1
  65. package/dist/src/daemon-client-lease-beat.js +1 -1
  66. package/dist/src/daemon-client-lifecycle.js +1 -1
  67. package/dist/src/daemon-client-transport.js +1 -1
  68. package/dist/src/daemon-http.js +1 -1
  69. package/dist/src/daemon-policy-file.js +1 -1
  70. package/dist/src/daemon-registration-owner.js +1 -1
  71. package/dist/src/device-claim-inspection.js +1 -1
  72. package/dist/src/device-input-state.d.ts +2 -15
  73. package/dist/src/device-readiness-runtime.js +1 -1
  74. package/dist/src/device-selection-resolver.js +1 -1
  75. package/dist/src/device-session.js +3 -1
  76. package/dist/src/device.js +1 -1
  77. package/dist/src/device2.js +1 -1
  78. package/dist/src/device3.js +1 -1
  79. package/dist/src/dispatch-resolve.js +3 -3
  80. package/dist/src/doctor-facade.js +1 -1
  81. package/dist/src/durable-capture-resource.js +1 -1
  82. package/dist/src/durable-resource.js +1 -1
  83. package/dist/src/exec.js +1 -1
  84. package/dist/src/file.js +1 -1
  85. package/dist/src/find.js +1 -1
  86. package/dist/src/finders.js +1 -1
  87. package/dist/src/format.js +2 -1
  88. package/dist/src/gesture-admission.js +1 -1
  89. package/dist/src/gesture-plan-types.d.ts +2 -5
  90. package/dist/src/gesture-runtime.js +1 -1
  91. package/dist/src/helper.js +2 -2
  92. package/dist/src/human-control.js +1 -1
  93. package/dist/src/ime-rebind.js +1 -0
  94. package/dist/src/ime-settings-record.js +1 -0
  95. package/dist/src/ime-state.js +1 -0
  96. package/dist/src/index.d.ts +3 -3
  97. package/dist/src/input-actions.js +1 -1
  98. package/dist/src/input-actions2.js +1 -1
  99. package/dist/src/install-source2.js +1 -1
  100. package/dist/src/instance-client.js +1 -1
  101. package/dist/src/interaction-positionals.js +1 -1
  102. package/dist/src/interaction-ref-policy.js +1 -1
  103. package/dist/src/interaction.js +1 -1
  104. package/dist/src/interaction2.js +1 -1
  105. package/dist/src/interactor.js +5 -5
  106. package/dist/src/interactors.js +1 -1
  107. package/dist/src/internal/bin.js +1 -1
  108. package/dist/src/internal/daemon.js +1 -1
  109. package/dist/src/inventory2.js +1 -1
  110. package/dist/src/ios-client.js +4 -4
  111. package/dist/src/ios-snapshot-acquisition.js +1 -1
  112. package/dist/src/ios-snapshot-engine.js +1 -1
  113. package/dist/src/ios-snapshot-runtime.js +1 -1
  114. package/dist/src/launch-confirmation.js +1 -1
  115. package/dist/src/lease-scope.js +1 -1
  116. package/dist/src/lease.js +1 -1
  117. package/dist/src/limrun.d.ts +4 -555
  118. package/dist/src/load.js +1 -1
  119. package/dist/src/local-interactor-operation-set.js +1 -1
  120. package/dist/src/log-stream.js +33 -0
  121. package/dist/src/managed-device-scope.js +1 -1
  122. package/dist/src/manifest.js +1 -0
  123. package/dist/src/mechanics.js +16 -16
  124. package/dist/src/mobile-snapshot-semantics.js +1 -1
  125. package/dist/src/node-http.js +1 -0
  126. package/dist/src/observation.js +1 -2
  127. package/dist/src/overlay.js +3 -3
  128. package/dist/src/owner-identity.js +3 -3
  129. package/dist/src/perf-facade.js +1 -1
  130. package/dist/src/perf-runtime-plan.js +1 -1
  131. package/dist/src/perf-target.js +1 -1
  132. package/dist/src/physical-device-control.js +1 -1
  133. package/dist/src/platform-request-scope.js +1 -1
  134. package/dist/src/platform-runtime-app-log-process.js +1 -1
  135. package/dist/src/platform-runtime-open-target.js +1 -1
  136. package/dist/src/platform-runtime-operation-host.js +4 -4
  137. package/dist/src/platform-runtime-runtime-hints.js +1 -1
  138. package/dist/src/platform-runtime-screen-recording-finalizer-host.js +1 -1
  139. package/dist/src/platform-runtime-screen-recording-process-host.js +1 -1
  140. package/dist/src/platform-runtime-unavailable.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/plugin.js +1 -0
  144. package/dist/src/plugins/webdriver.d.ts +111 -0
  145. package/dist/src/plugins/webdriver.js +1 -0
  146. package/dist/src/plugins.d.ts +2 -1
  147. package/dist/src/plugins2.js +1 -1
  148. package/dist/src/process-exit.js +1 -1
  149. package/dist/src/process.js +1 -1
  150. package/dist/src/provider-credential-fingerprint.js +1 -1
  151. package/dist/src/provider-device-admission.js +1 -1
  152. package/dist/src/provider-device-runtime.d.ts +556 -0
  153. package/dist/src/provider-policy.js +1 -0
  154. package/dist/src/provider-profile-fields.js +1 -1
  155. package/dist/src/provider-webdriver.js +1 -2
  156. package/dist/src/providers.js +1 -1
  157. package/dist/src/proxy.js +2 -2
  158. package/dist/src/react-devtools.js +2 -0
  159. package/dist/src/react-native.js +1 -1
  160. package/dist/src/record-runtime.js +1 -1
  161. package/dist/src/record-trace.js +1 -1
  162. package/dist/src/recording.js +1 -1
  163. package/dist/src/registry.js +24 -24
  164. package/dist/src/remote-bridge.js +1 -0
  165. package/dist/src/remote-config-core.js +1 -0
  166. package/dist/src/remote-config.js +1 -1
  167. package/dist/src/remote-config2.js +1 -1
  168. package/dist/src/remote-connection-state.js +1 -0
  169. package/dist/src/replay.js +2 -2
  170. package/dist/src/request-admission.js +1 -1
  171. package/dist/src/request-runtime-binding.js +1 -1
  172. package/dist/src/result-serialization.js +1 -1
  173. package/dist/src/retry.js +1 -1
  174. package/dist/src/retry2.js +1 -0
  175. package/dist/src/runner-artifact-manifest.js +1 -1
  176. package/dist/src/runner-cache-metadata.js +2 -3
  177. package/dist/src/runner-cache-retention.js +1 -0
  178. package/dist/src/runner-cache-trim.js +1 -0
  179. package/dist/src/runner-client.js +1 -1
  180. package/dist/src/runner-dev-tools-security.js +1 -1
  181. package/dist/src/runner-device-readiness.js +1 -1
  182. package/dist/src/runner-device-set.js +1 -0
  183. package/dist/src/runner-disposal.js +1 -1
  184. package/dist/src/runner-error-classification.js +1 -1
  185. package/dist/src/runner-exchange.js +1 -1
  186. package/dist/src/runner-lease.js +1 -0
  187. package/dist/src/runner-operations-facade.js +1 -1
  188. package/dist/src/runner-session-types.js +1 -1
  189. package/dist/src/runner-start-budget.js +1 -1
  190. package/dist/src/runner-toolchain-probe.js +2 -0
  191. package/dist/src/runner.js +1 -1
  192. package/dist/src/runtime-deployment.js +1 -0
  193. package/dist/src/runtime.js +1 -1
  194. package/dist/src/runtime10.js +1 -2
  195. package/dist/src/runtime11.js +2 -0
  196. package/dist/src/runtime2.js +2 -5
  197. package/dist/src/runtime3.js +5 -1
  198. package/dist/src/runtime4.js +1 -5
  199. package/dist/src/runtime5.js +5 -1
  200. package/dist/src/runtime6.js +1 -1
  201. package/dist/src/runtime7.js +1 -1
  202. package/dist/src/runtime8.js +1 -1
  203. package/dist/src/runtime9.js +1 -1
  204. package/dist/src/screen-recording-transport.js +1 -1
  205. package/dist/src/screenshot-density.js +1 -1
  206. package/dist/src/screenshot-overlay-draw.js +1 -1
  207. package/dist/src/screenshot3.js +2 -2
  208. package/dist/src/script.js +1 -1
  209. package/dist/src/scroll-gesture.js +1 -1
  210. package/dist/src/sdk-batch.js +2 -2
  211. package/dist/src/sdk-contracts.d.ts +25 -33
  212. package/dist/src/sdk-contracts.js +2 -2
  213. package/dist/src/sdk-device.js +1 -1
  214. package/dist/src/sdk-finders.d.ts +1 -1
  215. package/dist/src/sdk-finders.js +1 -1
  216. package/dist/src/sdk-remote-config.d.ts +4 -0
  217. package/dist/src/sdk-remote-config.js +1 -1
  218. package/dist/src/sdk-selectors.d.ts +1 -1
  219. package/dist/src/sdk-selectors.js +1 -1
  220. package/dist/src/selection.js +0 -0
  221. package/dist/src/selector-pipeline-policy.js +1 -1
  222. package/dist/src/selector-runtime.js +1 -1
  223. package/dist/src/selectors.js +1 -1
  224. package/dist/src/server.js +2 -2
  225. package/dist/src/session-snapshot.js +1 -1
  226. package/dist/src/session2.js +5 -5
  227. package/dist/src/simctl.js +1 -1
  228. package/dist/src/simulator-boot.js +1 -1
  229. package/dist/src/simulator-state.js +1 -1
  230. package/dist/src/simulator.js +1 -1
  231. package/dist/src/snapshot-capture-annotations.js +1 -1
  232. package/dist/src/snapshot-desktop-projection.js +1 -1
  233. package/dist/src/snapshot-private-evidence.js +1 -0
  234. package/dist/src/snapshot-runtime-binding.js +1 -1
  235. package/dist/src/snapshot-runtime.js +1 -1
  236. package/dist/src/snapshot-state.js +1 -1
  237. package/dist/src/snapshot4.js +1 -1
  238. package/dist/src/src2.js +1 -1
  239. package/dist/src/src3.js +1 -1
  240. package/dist/src/src4.js +1 -1
  241. package/dist/src/src5.js +1 -1
  242. package/dist/src/src6.js +1 -1
  243. package/dist/src/src7.js +1 -1
  244. package/dist/src/src8.js +20 -20
  245. package/dist/src/store.js +1 -1
  246. package/dist/src/target-evidence.js +1 -1
  247. package/dist/src/text-entry-focus.js +1 -1
  248. package/dist/src/tool-provider2.js +1 -1
  249. package/dist/src/touch-runtime2.js +1 -1
  250. package/dist/src/tree.js +1 -1
  251. package/dist/src/type-text-runtime.js +1 -1
  252. package/dist/src/video.js +1 -1
  253. package/package.json +24 -16
  254. package/server.json +2 -2
  255. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.22.apk.sha256 +0 -1
  256. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.22.apk +0 -0
  257. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.22.apk.sha256 +0 -1
  258. package/dist/src/capabilities.js +0 -1
  259. package/dist/src/compatibility-policy.js +0 -1
  260. package/dist/src/daemon-artifacts.js +0 -1
  261. package/dist/src/device-claim-rule.js +0 -1
  262. package/dist/src/human-control-contract.js +0 -1
  263. package/dist/src/prepare-kind.js +0 -1
  264. package/dist/src/provider-device-runtimes.js +0 -1
  265. package/dist/src/screen-recording-admission-ledger.js +0 -1
  266. package/dist/src/screenshot-runtime.js +0 -1
  267. package/dist/src/session-routing.js +0 -1
  268. package/dist/src/session-runtime-admission.js +0 -1
  269. package/dist/src/session-stream.js +0 -27
  270. package/dist/src/timeouts.js +0 -1
  271. package/dist/src/touch-reference-frame.js +0 -1
  272. package/dist/src/vars.js +0 -2
  273. package/dist/src/viewport.js +0 -1
package/dist/src/store.js CHANGED
@@ -1 +1 @@
1
- import{J as e,P as t}from"./sdk-contracts.js";import{v as n}from"./sdk-batch-runner.js";import{A as r,o as i}from"./owner-identity.js";import{l as a}from"./exec.js";import{t as o}from"./file.js";import"./command.js";import"./process.js";import{n as s}from"./cli-config.js";import c from"node:crypto";import l from"node:fs";import u from"node:path";function d(e,n){let r=new Set(n);for(let n of e){let e=n.agentDevicePlugin.provider;if(r.has(e))throw new t(`INVALID_ARGS`,`Duplicate provider plugin: ${e}`);r.add(e)}}function f(e){let n;try{let t=u.join(e,`package.json`);n=JSON.parse(l.readFileSync(t,`utf8`))}catch(n){throw new t(`INVALID_ARGS`,`Cannot read plugin manifest: ${e}`,{},n)}let r=n?.agentDevicePlugin;if(typeof n?.name!=`string`||typeof n?.version!=`string`||!r||r.apiVersion!==1||typeof r.provider!=`string`||!/^[a-z][a-z0-9-]*$/.test(r.provider)||typeof r.entry!=`string`||!r.entry.startsWith(`./`))throw new t(`INVALID_ARGS`,`Package does not declare a compatible provider plugin`,{reason:`incompatible_plugin`,apiVersion:1,hint:`Install a plugin release supporting agentDevicePlugin.apiVersion 1.`});return p(e,r.entry),n}function p(e,n){try{let t=l.realpathSync(e),r=l.realpathSync(u.resolve(e,n));if(r.startsWith(`${t}${u.sep}`)&&l.statSync(r).isFile())return r}catch{}throw new t(`INVALID_ARGS`,`Plugin entry must be a readable file inside its package`,{directory:e,entry:n})}function m(e){let r=s(e);try{let e=JSON.parse(l.readFileSync(r,`utf8`));if(!n(e)||e.plugins!==void 0&&!n(e.plugins))throw new t(`INVALID_ARGS`,`Plugin config must contain an object`);return e}catch(e){if(e.code===`ENOENT`)return{};throw e instanceof SyntaxError?new t(`INVALID_ARGS`,`Invalid plugin JSON: ${r}`,{},e):e}}function h(e,r){if(!S(e)||!n(r)||typeof r.installation!=`string`||!/^[a-f0-9-]{36}$/.test(r.installation)||r.version!==void 0&&!C(r.version)||r.options!==void 0&&!n(r.options))throw new t(`INVALID_ARGS`,`Invalid plugin selection: ${e}`)}function g(e){let t=u.dirname(s(e));return Object.entries(m(e).plugins??{}).map(([e,n])=>_(t,e,n))}function _(e,n,r){h(n,r);let i=u.join(e,`plugins`,r.installation,`node_modules`,n),a=f(i);if(a.name!==n)throw new t(`INVALID_ARGS`,`Plugin package identity mismatch: ${n}`);return{...a,directory:i,selection:r}}function v(t){let n=u.dirname(s(t));return Object.entries(m(t).plugins??{}).map(([t,r])=>{try{let e=_(n,t,r);return{name:t,version:e.version,provider:e.agentDevicePlugin.provider,compatible:!0}}catch(n){return{name:t,compatible:!1,error:e(n)}}})}function y(e,n){if(e===`remove`)return{name:n,version:void 0};let r=/^(@[a-z0-9][a-z0-9._-]*\/[a-z0-9][a-z0-9._-]*|[a-z0-9][a-z0-9._-]*)(?:@(.+))?$/.exec(n);if(!r||!r[1]||r[2]!==void 0&&!C(r[2]))throw new t(`INVALID_ARGS`,`Expected an npm package name, optionally followed by @version or @tag`);if(e===`update`&&r[2]!==void 0)throw new t(`INVALID_ARGS`,`update accepts a package name without a version`);return{name:r[1],version:r[2]}}async function b(e,n,r,i){let o=c.randomUUID(),s=u.join(e,`plugins`,o);l.mkdirSync(s,{recursive:!0,mode:448});try{l.writeFileSync(u.join(s,`package.json`),JSON.stringify({private:!0,dependencies:{[n]:r??`latest`}})),await a(`npm`,[`install`,`--ignore-scripts`,`--no-audit`,`--no-fund`,`--global=false`,`--prefix`,s,`--workspaces=false`,`--package-lock=true`],{cwd:s,env:i,timeoutMs:12e4});let e=f(u.join(s,`node_modules`,n));if(e.name!==n)throw new t(`INVALID_ARGS`,`Plugin package identity mismatch: ${n}`);return{installation:o,project:s,manifest:e}}catch(e){throw l.rmSync(s,{recursive:!0,force:!0}),e}}async function x(e,a,c=process.env,f=[]){let{name:p,version:h}=y(e,a),g=s(c),v=u.dirname(g);l.mkdirSync(v,{recursive:!0,mode:448});let x=await o({lockDirPath:u.join(v,`plugins.lock`),owner:{...i(),acquiredAtMs:Date.now()},description:`plugin installation`}),S;try{let i=m(c),a={...i.plugins},o=Object.hasOwn(a,p)?a[p]:void 0;if(e!==`add`&&!Object.hasOwn(a,p))throw new t(`INVALID_ARGS`,`Plugin is not installed: ${p}`);if(e===`remove`)delete a[p];else{let t=e===`update`&&C(o?.version)?o.version:h;S=await b(v,p,t,c),d([...Object.entries(a).filter(([e])=>e!==p).flatMap(([e,t])=>{try{return[_(v,e,t)]}catch{return[]}}),S.manifest],f),a[p]={installation:S.installation,version:t,...n(o?.options)?{options:o.options}:{}}}r({destination:g,contents:`${JSON.stringify({...i,plugins:a},null,2)}\n`,mode:384})}catch(e){throw S&&l.rmSync(S.project,{recursive:!0,force:!0}),e}finally{await x()}}function S(e){return/^(@[a-z0-9][a-z0-9._-]*\/)?[a-z0-9][a-z0-9._-]*$/.test(e)}function C(e){return typeof e==`string`&&/^[a-zA-Z0-9*^~<>=| .+-]+$/.test(e)&&e.trim().length>0}export{p as a,d as i,g as n,v as r,x as t};
1
+ import{J as e,P as t}from"./sdk-contracts.js";import{v as n}from"./sdk-batch-runner.js";import{j as r,o as i}from"./owner-identity.js";import{l as a}from"./exec.js";import{t as o}from"./file.js";import"./command.js";import"./process.js";import{n as s}from"./cli-config.js";import{i as c,n as l,t as u}from"./manifest.js";import d from"node:crypto";import f from"node:fs";import p from"node:path";function m(e){let r=s(e);try{let e=JSON.parse(f.readFileSync(r,`utf8`));if(!n(e)||e.plugins!==void 0&&!n(e.plugins))throw new t(`INVALID_ARGS`,`Plugin config must contain an object`);return e}catch(e){if(e.code===`ENOENT`)return{};throw e instanceof SyntaxError?new t(`INVALID_ARGS`,`Invalid plugin JSON: ${r}`,{},e):e}}function h(e,r){if(!S(e)||!n(r)||typeof r.installation!=`string`||!/^[a-f0-9-]{36}$/.test(r.installation)||r.version!==void 0&&!C(r.version)||r.options!==void 0&&!n(r.options))throw new t(`INVALID_ARGS`,`Invalid plugin selection: ${e}`)}function g(e){let t=p.dirname(s(e));return Object.entries(m(e).plugins??{}).map(([e,n])=>_(t,e,n))}function _(e,n,r){h(n,r);let i=p.join(e,`plugins`,r.installation,`node_modules`,n),a=c(i);if(a.name!==n)throw new t(`INVALID_ARGS`,`Plugin package identity mismatch: ${n}`);return{...a,directory:i,selection:r}}function v(t){let n=p.dirname(s(t));return Object.entries(m(t).plugins??{}).map(([t,r])=>{try{let e=_(n,t,r);return{name:t,version:e.version,provider:e.agentDevicePlugin.provider,compatible:!0}}catch(n){return{name:t,compatible:!1,error:e(n)}}})}function y(e,n){if(e===`remove`)return{name:n,version:void 0};let r=/^(@[a-z0-9][a-z0-9._-]*\/[a-z0-9][a-z0-9._-]*|[a-z0-9][a-z0-9._-]*)(?:@(.+))?$/.exec(n);if(!r||!r[1]||r[2]!==void 0&&!C(r[2]))throw new t(`INVALID_ARGS`,`Expected an npm package name, optionally followed by @version or @tag`);if(e===`update`&&r[2]!==void 0)throw new t(`INVALID_ARGS`,`update accepts a package name without a version`);return{name:r[1],version:r[2]}}async function b(e,n,r,i){let o=d.randomUUID(),s=p.join(e,`plugins`,o);f.mkdirSync(s,{recursive:!0,mode:448});try{f.writeFileSync(p.join(s,`package.json`),JSON.stringify({private:!0,dependencies:{[n]:r??`latest`}})),await a(`npm`,[`install`,`--ignore-scripts`,`--no-audit`,`--no-fund`,`--global=false`,`--prefix`,s,`--workspaces=false`,`--package-lock=true`],{cwd:s,env:i,timeoutMs:12e4});let e=c(p.join(s,`node_modules`,n));if(e.name!==n)throw new t(`INVALID_ARGS`,`Plugin package identity mismatch: ${n}`);return{installation:o,project:s,manifest:e}}catch(e){throw f.rmSync(s,{recursive:!0,force:!0}),e}}async function x(e,a,c=process.env,d=u){let{name:h,version:g}=y(e,a),v=s(c),x=p.dirname(v);f.mkdirSync(x,{recursive:!0,mode:448});let S=await o({lockDirPath:p.join(x,`plugins.lock`),owner:{...i(),acquiredAtMs:Date.now()},description:`plugin installation`}),w;try{let i=m(c),a={...i.plugins},o=Object.hasOwn(a,h)?a[h]:void 0;if(e!==`add`&&!Object.hasOwn(a,h))throw new t(`INVALID_ARGS`,`Plugin is not installed: ${h}`);if(e===`remove`)delete a[h];else{let t=e===`update`&&C(o?.version)?o.version:g;w=await b(x,h,t,c);let r=Object.entries(a).filter(([e])=>e!==h).flatMap(([e,t])=>{try{return[_(x,e,t)]}catch{return[]}});l([...r,w.manifest],d),a[h]={installation:w.installation,version:t,...n(o?.options)?{options:o.options}:{}}}r({destination:v,contents:`${JSON.stringify({...i,plugins:a},null,2)}\n`,mode:384})}catch(e){throw w&&f.rmSync(w.project,{recursive:!0,force:!0}),e}finally{await S()}}function S(e){return/^(@[a-z0-9][a-z0-9._-]*\/)?[a-z0-9][a-z0-9._-]*$/.test(e)}function C(e){return typeof e==`string`&&/^[a-zA-Z0-9*^~<>=| .+-]+$/.test(e)&&e.trim().length>0}export{g as n,v as r,x as t};
@@ -1 +1 @@
1
- import{P as e}from"./sdk-contracts.js";import{Hn as t,Jn as n,Qn as r,Xn as i,ar as a,qn as o,rr as s}from"./sdk-batch.js";import{F as c,N as l,P as u,T as d,k as f,n as p}from"./runtime.js";import{i as m}from"./rect-center.js";import{n as h}from"./ios-system-surface.js";import{s as g}from"./tree.js";import{t as _}from"./ios-target-activation.js";function v(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`}}function y(t,n={}){let r=n.plural===!0?`do`:`does`;return{resolveInput:async()=>{throw new e(`UNSUPPORTED_OPERATION`,`${t} ${r} not resolve input artifacts`)},reserveOutput:async()=>{throw new e(`UNSUPPORTED_OPERATION`,`${t} ${r} not reserve output artifacts`)},createTempFile:async()=>{throw new e(`UNSUPPORTED_OPERATION`,`${t} ${r} not create temporary files`)}}}function b(e,t={}){return{artifacts:y(e,t),policy:d()}}function x(e,t){return e===void 0?t:(e.targetActivation??=t.targetActivation,e.postGestureOutcome??=t.postGestureOutcome,t)}function S(e,t){let n=t?.iosSystemSurfaceBundleId?h(t.iosSystemSurfaceBundleId):p(t);return n?E(e,n,`warning`):e}function C(e,t,n,r){if(!n)return e;let i=E(e,r(n),`warnings`);return i.ok?{...i,data:{...i.data,[t]:n}}:{...i,error:{...i.error,details:{...i.error.details,[t]:n}}}}function w(e,t){return C(e,`targetActivation`,t?.targetActivation,_)}function T(e){let{response:t,consumedTree:n,captureProof:r}=e;return w(C(S(t,n),`postGestureOutcome`,n?.postGestureOutcome,f),r)}function E(e,t,n){if(D(e,t))return e;if(!e.ok){let n=e.error.hint??e.error.details?.hint;return{...e,error:{...e.error,hint:O(n,t)}}}return n===`warnings`?{...e,data:{...e.data,warnings:[...k(e.data?.warnings),t]}}:{...e,data:{...e.data,warning:O(e.data?.warning,t)}}}function D(e,t){return(e.ok?[e.data?.warning,...k(e.data?.warnings)]:[e.error.hint]).some(e=>typeof e==`string`&&e.includes(t))}function O(e,t){return typeof e==`string`&&e.trim()!==``?`${e}\n${t}`:t}function k(e){return Array.isArray(e)?e.filter(e=>e!==void 0):[]}function A(e,n={}){let r=n.mode??`action`,{node:i,preActionNodes:a}=e;if(typeof i.index!=`number`)return;let o=u(a),s=t(P(i),a);if(r===`landmark`&&s.id===void 0&&s.label===void 0)return;let c=l(i,o,8),d=c.chain,f=F(a,i),p=I(i,o),m=R(i),h=+(d.length>0),g=e=>{let t=d.slice(0,e),n=z({nodes:a,byIndex:o,node:i,identity:s,ancestry:t,sibling:f,scrollRegion:p});return{candidate:{...s,ancestry:t,sibling:f,viewportOrder:n.viewportOrder,...p?{scrollRegion:p}:{},...m?{rect:m}:{},verification:`verified`},domain:n}};for(let e=d.length;e>=h;--e){let{candidate:t,domain:n}=g(e);if(M(t))return t.verification=j({node:i,domain:n,mode:r,brokenWalk:c.broken}),t;if(e===h)return N(t)}}function j(e){return e.brokenWalk?`unverifiable`:e.mode===`landmark`?`verified`:V({node:e.node,domain:e.domain})}function M(e){return a(s({...e,verification:`unverifiable`}))<=r}function N(e){return e.verification=`unverifiable`,a(s(e))>4096&&delete e.rect,e}const P=n;function F(e,t){return i(e,t)}function I(e,t){let n=g(e,t);if(!n)return;let r=P(n);return{role:r.role,...r.id===void 0?r.label===void 0?{}:{label:r.label}:{id:r.id}}}function L(e,t){return!e&&!t?!0:!e||!t?!1:o(e,t)}function R(e){let t=e.rect;if(t)return{x:t.x,y:t.y,width:t.width,height:t.height}}function z(e){let{nodes:t,byIndex:n,node:r,identity:i,ancestry:a,sibling:o,scrollRegion:s}=e,l=c(t,n,i,a),u=l.filter(e=>F(t,e)===o),d=l.length>0?l.filter(e=>L(I(e,n),s)):void 0,f=d?B(d):[];return{identitySet:l,siblingMatches:u,regionMembers:d,orderedRegion:f,viewportOrder:Math.max(f.findIndex(e=>e.index===r.index),0)}}function B(e){return e.map((e,t)=>({node:e,documentOrder:t,center:m(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 V(e){let{node:t,domain:n}=e,r=t.ref,i=n.identitySet.map(e=>e.ref);return v({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}export{B as a,T as c,v as d,A as i,w as l,I as n,L as o,F as r,x as s,P as t,b as u};
1
+ import{P as e}from"./sdk-contracts.js";import{$n as t,Jn as n,Un as r,Yn as i,Zn as a,ir as o,or as s}from"./sdk-batch.js";import{H as c,T as l,U as u,V as d,k as f,n as p}from"./runtime.js";import{i as m}from"./rect-center.js";import{n as h}from"./ios-system-surface.js";import{s as g}from"./tree.js";import{t as _}from"./ios-target-activation.js";function v(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`}}function y(t,n={}){let r=n.plural===!0?`do`:`does`;return{resolveInput:async()=>{throw new e(`UNSUPPORTED_OPERATION`,`${t} ${r} not resolve input artifacts`)},reserveOutput:async()=>{throw new e(`UNSUPPORTED_OPERATION`,`${t} ${r} not reserve output artifacts`)},createTempFile:async()=>{throw new e(`UNSUPPORTED_OPERATION`,`${t} ${r} not create temporary files`)}}}function b(e,t={}){return{artifacts:y(e,t),policy:l()}}function x(e,t){return e===void 0?t:(e.targetActivation??=t.targetActivation,e.postGestureOutcome??=t.postGestureOutcome,t)}function S(e,t){let n=t?.iosSystemSurfaceBundleId?h(t.iosSystemSurfaceBundleId):p(t);return n?E(e,n,`warning`):e}function C(e,t,n,r){if(!n)return e;let i=E(e,r(n),`warnings`);return i.ok?{...i,data:{...i.data,[t]:n}}:{...i,error:{...i.error,details:{...i.error.details,[t]:n}}}}function w(e,t){return C(e,`targetActivation`,t?.targetActivation,_)}function T(e){let{response:t,consumedTree:n,captureProof:r}=e;return w(C(S(t,n),`postGestureOutcome`,n?.postGestureOutcome,f),r)}function E(e,t,n){if(D(e,t))return e;if(!e.ok){let n=e.error.hint??e.error.details?.hint;return{...e,error:{...e.error,hint:O(n,t)}}}return n===`warnings`?{...e,data:{...e.data,warnings:[...k(e.data?.warnings),t]}}:{...e,data:{...e.data,warning:O(e.data?.warning,t)}}}function D(e,t){return(e.ok?[e.data?.warning,...k(e.data?.warnings)]:[e.error.hint]).some(e=>typeof e==`string`&&e.includes(t))}function O(e,t){return typeof e==`string`&&e.trim()!==``?`${e}\n${t}`:t}function k(e){return Array.isArray(e)?e.filter(e=>e!==void 0):[]}function A(e,t={}){let n=t.mode??`action`,{node:i,preActionNodes:a}=e;if(typeof i.index!=`number`)return;let o=c(a),s=r(P(i),a);if(n===`landmark`&&s.id===void 0&&s.label===void 0)return;let l=d(i,o,8),u=l.chain,f=F(a,i),p=I(i,o),m=R(i),h=+(u.length>0),g=e=>{let t=u.slice(0,e),n=z({nodes:a,byIndex:o,node:i,identity:s,ancestry:t,sibling:f,scrollRegion:p});return{candidate:{...s,ancestry:t,sibling:f,viewportOrder:n.viewportOrder,...p?{scrollRegion:p}:{},...m?{rect:m}:{},verification:`verified`},domain:n}};for(let e=u.length;e>=h;--e){let{candidate:t,domain:r}=g(e);if(M(t))return t.verification=j({node:i,domain:r,mode:n,brokenWalk:l.broken}),t;if(e===h)return N(t)}}function j(e){return e.brokenWalk?`unverifiable`:e.mode===`landmark`?`verified`:V({node:e.node,domain:e.domain})}function M(e){return s(o({...e,verification:`unverifiable`}))<=t}function N(e){return e.verification=`unverifiable`,s(o(e))>4096&&delete e.rect,e}const P=i;function F(e,t){return a(e,t)}function I(e,t){let n=g(e,t);if(!n)return;let r=P(n);return{role:r.role,...r.id===void 0?r.label===void 0?{}:{label:r.label}:{id:r.id}}}function L(e,t){return!e&&!t?!0:!e||!t?!1:n(e,t)}function R(e){let t=e.rect;if(t)return{x:t.x,y:t.y,width:t.width,height:t.height}}function z(e){let{nodes:t,byIndex:n,node:r,identity:i,ancestry:a,sibling:o,scrollRegion:s}=e,c=u(t,n,i,a),l=c.filter(e=>F(t,e)===o),d=c.length>0?c.filter(e=>L(I(e,n),s)):void 0,f=d?B(d):[];return{identitySet:c,siblingMatches:l,regionMembers:d,orderedRegion:f,viewportOrder:Math.max(f.findIndex(e=>e.index===r.index),0)}}function B(e){return e.map((e,t)=>({node:e,documentOrder:t,center:m(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 V(e){let{node:t,domain:n}=e,r=t.ref,i=n.identitySet.map(e=>e.ref);return v({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}export{B as a,T as c,v as d,A as i,w as l,I as n,L as o,F as r,x as s,P as t,b as u};
@@ -1 +1 @@
1
- import{P as e}from"./sdk-contracts.js";import{$r as t,Yr as n,qr as r}from"./sdk-batch.js";import{n as i,r as a}from"./snapshot.js";function o(t,n,r,i){return new e(`COMMAND_FAILED`,`fill tapped (${t}, ${n}) but ${r}`,{reason:`text_entry_focus_not_observed`,x:t,y:n,...i,hint:`The tap most likely missed the field. Re-check the target with snapshot -i and fill the element it reports, rather than retrying the same coordinates.`})}function s(e){let t=[];for(let r of p(e)){let e=a(r);n(e)&&t.push({node:r,identity:m(r),rect:e})}return t}function c(e){let t=new Map;for(let n of e)t.set(n.identity,(t.get(n.identity)??0)+1);return t}function l(e){let n=s(e),r=c(n),i=null,a=1/0;for(let e of n){if(!e.node.traits?.includes(`IsEditing`))continue;let n=t(e.rect);n>=a||(i=r.get(e.identity)===1?{identity:e.identity,rect:e.rect}:{rect:e.rect},a=n)}return i}function u(e,t,n){let i=s(e),a=c(i),o=new Set;for(let e of i)a.get(e.identity)===1&&r(e.rect,t,n)&&o.add(e.identity);return o}async function d(e){let t=Date.now()+(e.timeoutMs??3e3),n=0,r=!1;for(;;){let i=await e.readFocus();if(n+=1,i&&(r=!0,f(i,e.targetsAtPoint,e.x,e.y)))return`focused-element`;if(Date.now()>=t)break;await e.sleep(150)}throw o(e.x,e.y,`nothing there took text-entry focus, so the text was not sent`,{samples:n,editingElementObserved:r})}function f(e,t,n,i){return r(e.rect,n,i)?!0:e.identity!==void 0&&t.has(e.identity)}function p(e){let t=[],n=e=>{t.push(e);for(let t of i(e))n(t)};for(let t of Array.isArray(e)?e:[e])n(t);return t}function m(e){return[e.pid??``,e.type??e.elementType??``,e.AXUniqueId??e.identifier??``,e.AXLabel??e.label??``].join(`\0`)}export{d as awaitLimrunTextEntryFocus,l as readLimrunTextEntryFocus,u as readLimrunUnambiguousTapTargets};
1
+ import{P as e}from"./sdk-contracts.js";import{Jr as t,Xr as n,ei as r}from"./sdk-batch.js";import{n as i,r as a}from"./snapshot.js";function o(t,n,r,i){return new e(`COMMAND_FAILED`,`fill tapped (${t}, ${n}) but ${r}`,{reason:`text_entry_focus_not_observed`,x:t,y:n,...i,hint:`The tap most likely missed the field. Re-check the target with snapshot -i and fill the element it reports, rather than retrying the same coordinates.`})}function s(e){let t=[];for(let r of p(e)){let e=a(r);n(e)&&t.push({node:r,identity:m(r),rect:e})}return t}function c(e){let t=new Map;for(let n of e)t.set(n.identity,(t.get(n.identity)??0)+1);return t}function l(e){let t=s(e),n=c(t),i=null,a=1/0;for(let e of t){if(!e.node.traits?.includes(`IsEditing`))continue;let t=r(e.rect);t>=a||(i=n.get(e.identity)===1?{identity:e.identity,rect:e.rect}:{rect:e.rect},a=t)}return i}function u(e,n,r){let i=s(e),a=c(i),o=new Set;for(let e of i)a.get(e.identity)===1&&t(e.rect,n,r)&&o.add(e.identity);return o}async function d(e){let t=Date.now()+(e.timeoutMs??3e3),n=0,r=!1;for(;;){let i=await e.readFocus();if(n+=1,i&&(r=!0,f(i,e.targetsAtPoint,e.x,e.y)))return`focused-element`;if(Date.now()>=t)break;await e.sleep(150)}throw o(e.x,e.y,`nothing there took text-entry focus, so the text was not sent`,{samples:n,editingElementObserved:r})}function f(e,n,r,i){return t(e.rect,r,i)?!0:e.identity!==void 0&&n.has(e.identity)}function p(e){let t=[],n=e=>{t.push(e);for(let t of i(e))n(t)};for(let t of Array.isArray(e)?e:[e])n(t);return t}function m(e){return[e.pid??``,e.type??e.elementType??``,e.AXUniqueId??e.identifier??``,e.AXLabel??e.label??``].join(`\0`)}export{d as awaitLimrunTextEntryFocus,l as readLimrunTextEntryFocus,u as readLimrunUnambiguousTapTargets};
@@ -1 +1 @@
1
- import{r as e}from"./rolldown-runtime.js";import{P as t}from"./sdk-contracts.js";import{r as n}from"./diagnostics.js";import"./diagnostics2.js";import{l as r}from"./owner-identity.js";import{g as i,l as a}from"./exec.js";import{t as o}from"./timeouts.js";import"./command.js";import"./process.js";import"./retry.js";import{t as s}from"./scoped-provider.js";var c=e({createLocalLinuxToolProvider:()=>d,resolveLinuxToolProvider:()=>f,runLinuxToolCommand:()=>m,withLinuxToolProvider:()=>p});const l={runCommand:a,whichCommand:i,desktop:h(a,i),clipboard:g(a,i),screenshot:_(a,i)},u=s(l,d);function d(e={}){let t={...l,...e};return{...t,desktop:e.desktop??h(t.runCommand,t.whichCommand),clipboard:e.clipboard??g(t.runCommand,t.whichCommand),screenshot:e.screenshot??_(t.runCommand,t.whichCommand)}}function f(e){return u.resolve(e)}async function p(e,t){return await u.run(e,t)}async function m(e,t,n){return await f().runCommand(e,t,n)}function h(e,t){return{async openTarget(r){if(r.includes(`://`)||r.startsWith(`/`)){await e(`xdg-open`,[r]);return}if(await t(r)){e(r,[],{allowFailure:!0}).catch(e=>{n({level:`warn`,phase:`linux_app_launch`,data:{app:r,error:String(e)}})}),await o(500);return}await e(`xdg-open`,[r],{allowFailure:!0})},async closeApp(n){if(await t(`wmctrl`)){await e(`wmctrl`,[`-c`,n],{allowFailure:!0});return}await e(`pkill`,[`-x`,n],{allowFailure:!0})}}}function g(e,t){return{async readText(){let n=await w(t,y),r=x[n];return(await e(r.cmd,r.args,r.options)).stdout},async writeText(n){let r=await w(t,y),i=S[r](n);await e(i.cmd,i.args,i.options)}}}function _(e,t){return{async capture(n){let r=await w(t,b),i=C[r](n);await e(i.cmd,i.args,i.options)}}}const v=5e3,y={wayland:[{tool:`wl-clipboard`,command:`wl-paste`}],x11:[{tool:`xclip`,command:`xclip`},{tool:`xsel`,command:`xsel`}],waylandError:`wl-paste (wl-clipboard) is required for clipboard access on Wayland. Install via your package manager.`,x11Error:`xclip or xsel is required for clipboard access on X11. Install via your package manager.`},b={wayland:[{tool:`grim`,command:`grim`},{tool:`gnome-screenshot`,command:`gnome-screenshot`}],x11:[{tool:`scrot`,command:`scrot`},{tool:`import`,command:`import`},{tool:`gnome-screenshot`,command:`gnome-screenshot`}],waylandError:`grim or gnome-screenshot is required for screenshots on Wayland. Install via your package manager.`,x11Error:`scrot, import (ImageMagick), or gnome-screenshot is required for screenshots on X11. Install via your package manager.`},x={"wl-clipboard":{cmd:`wl-paste`,args:[`--no-newline`],options:{allowFailure:!0,timeoutMs:v}},xclip:{cmd:`xclip`,args:[`-selection`,`clipboard`,`-o`],options:{allowFailure:!0,timeoutMs:v}},xsel:{cmd:`xsel`,args:[`--clipboard`,`--output`],options:{allowFailure:!0,timeoutMs:v}}},S={"wl-clipboard":e=>({cmd:`wl-copy`,args:[`--`,e],options:{allowFailure:!1,timeoutMs:v}}),xclip:e=>({cmd:`xclip`,args:[`-selection`,`clipboard`],options:{allowFailure:!1,timeoutMs:v,stdin:e}}),xsel:e=>({cmd:`xsel`,args:[`--clipboard`,`--input`],options:{allowFailure:!1,timeoutMs:v,stdin:e}})},C={grim:e=>({cmd:`grim`,args:[e]}),scrot:e=>({cmd:`scrot`,args:[e]}),import:e=>({cmd:`import`,args:[`-window`,`root`,e]}),"gnome-screenshot":e=>({cmd:`gnome-screenshot`,args:[`-f`,e]})};async function w(e,n){let r=T()?`wayland`:`x11`;for(let t of n[r])if(await e(t.command))return t.tool;throw new t(`TOOL_MISSING`,r===`wayland`?n.waylandError:n.x11Error)}function T(){let e=r();return!!e.WAYLAND_DISPLAY||e.XDG_SESSION_TYPE===`wayland`}export{m as n,c as r,f as t};
1
+ import{r as e}from"./rolldown-runtime.js";import{P as t}from"./sdk-contracts.js";import{r as n}from"./diagnostics.js";import"./diagnostics2.js";import{l as r}from"./owner-identity.js";import{g as i,l as a}from"./exec.js";import{i as o}from"./retry.js";import"./command.js";import"./process.js";import"./retry2.js";import{t as s}from"./scoped-provider.js";var c=e({createLocalLinuxToolProvider:()=>d,resolveLinuxToolProvider:()=>f,runLinuxToolCommand:()=>m,withLinuxToolProvider:()=>p});const l={runCommand:a,whichCommand:i,desktop:h(a,i),clipboard:g(a,i),screenshot:_(a,i)},u=s(l,d);function d(e={}){let t={...l,...e};return{...t,desktop:e.desktop??h(t.runCommand,t.whichCommand),clipboard:e.clipboard??g(t.runCommand,t.whichCommand),screenshot:e.screenshot??_(t.runCommand,t.whichCommand)}}function f(e){return u.resolve(e)}async function p(e,t){return await u.run(e,t)}async function m(e,t,n){return await f().runCommand(e,t,n)}function h(e,t){return{async openTarget(r){if(r.includes(`://`)||r.startsWith(`/`)){await e(`xdg-open`,[r]);return}if(await t(r)){e(r,[],{allowFailure:!0}).catch(e=>{n({level:`warn`,phase:`linux_app_launch`,data:{app:r,error:String(e)}})}),await o(500);return}await e(`xdg-open`,[r],{allowFailure:!0})},async closeApp(n){if(await t(`wmctrl`)){await e(`wmctrl`,[`-c`,n],{allowFailure:!0});return}await e(`pkill`,[`-x`,n],{allowFailure:!0})}}}function g(e,t){return{async readText(){let n=await w(t,y),r=x[n];return(await e(r.cmd,r.args,r.options)).stdout},async writeText(n){let r=await w(t,y),i=S[r](n);await e(i.cmd,i.args,i.options)}}}function _(e,t){return{async capture(n){let r=await w(t,b),i=C[r](n);await e(i.cmd,i.args,i.options)}}}const v=5e3,y={wayland:[{tool:`wl-clipboard`,command:`wl-paste`}],x11:[{tool:`xclip`,command:`xclip`},{tool:`xsel`,command:`xsel`}],waylandError:`wl-paste (wl-clipboard) is required for clipboard access on Wayland. Install via your package manager.`,x11Error:`xclip or xsel is required for clipboard access on X11. Install via your package manager.`},b={wayland:[{tool:`grim`,command:`grim`},{tool:`gnome-screenshot`,command:`gnome-screenshot`}],x11:[{tool:`scrot`,command:`scrot`},{tool:`import`,command:`import`},{tool:`gnome-screenshot`,command:`gnome-screenshot`}],waylandError:`grim or gnome-screenshot is required for screenshots on Wayland. Install via your package manager.`,x11Error:`scrot, import (ImageMagick), or gnome-screenshot is required for screenshots on X11. Install via your package manager.`},x={"wl-clipboard":{cmd:`wl-paste`,args:[`--no-newline`],options:{allowFailure:!0,timeoutMs:v}},xclip:{cmd:`xclip`,args:[`-selection`,`clipboard`,`-o`],options:{allowFailure:!0,timeoutMs:v}},xsel:{cmd:`xsel`,args:[`--clipboard`,`--output`],options:{allowFailure:!0,timeoutMs:v}}},S={"wl-clipboard":e=>({cmd:`wl-copy`,args:[`--`,e],options:{allowFailure:!1,timeoutMs:v}}),xclip:e=>({cmd:`xclip`,args:[`-selection`,`clipboard`],options:{allowFailure:!1,timeoutMs:v,stdin:e}}),xsel:e=>({cmd:`xsel`,args:[`--clipboard`,`--input`],options:{allowFailure:!1,timeoutMs:v,stdin:e}})},C={grim:e=>({cmd:`grim`,args:[e]}),scrot:e=>({cmd:`scrot`,args:[e]}),import:e=>({cmd:`import`,args:[`-window`,`root`,e]}),"gnome-screenshot":e=>({cmd:`gnome-screenshot`,args:[`-f`,e]})};async function w(e,n){let r=T()?`wayland`:`x11`;for(let t of n[r])if(await e(t.command))return t.tool;throw new t(`TOOL_MISSING`,r===`wayland`?n.waylandError:n.x11Error)}function T(){let e=r();return!!e.WAYLAND_DISPLAY||e.XDG_SESSION_TYPE===`wayland`}export{m as n,c as r,f as t};
@@ -1 +1 @@
1
- import{P as e}from"./sdk-contracts.js";import{Et as t,Gt as n,St as r,Vt as i,dt as a,ft as o,gt as s,lt as c,ut as l}from"./sdk-batch.js";import{O as u}from"./runtime.js";import{r as d}from"./success-text.js";import{i as f}from"./click-button.js";import{m as p}from"./session-snapshot.js";import{t as m}from"./runtime-admission.js";import{t as h}from"./interactor-types.js";function g(e){let t=e?e.textEntryReadiness:void 0,n=x(t)?{textEntryReadiness:t}:{},r=_(e);return r?{...n,...r}:n}function _(e){if(!v(e))return null;let t=y(e.target);return t?{verification:`unconfirmed`,requested:e.requested,before:e.before,after:e.after,target:t}:null}function v(e){return!!(e&&e.verification===`unconfirmed`&&typeof e.requested==`string`&&S(e.before)&&S(e.after))}function y(e){if(!w(e)||!b(e))return null;let t=C(e.rect);return t?{resourceId:e.resourceId,className:e.className,packageName:e.packageName,rect:t}:null}function b(e){return S(e.resourceId)&&S(e.className)&&S(e.packageName)}function x(e){return typeof e==`string`&&h.includes(e)}function S(e){return e===null||typeof e==`string`}function C(e){return!w(e)||![e.x,e.y,e.width,e.height].every(e=>typeof e==`number`)?null:e}function w(e){return!!e&&typeof e==`object`}async function T(e){let u={device:e.device,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice},d=i(e.command,e.requiresCapture),f=await m({command:e.command,required:d.use.required,...e.unavailableResponse?{unavailableResponse:e.unavailableResponse}:{},...u});if(f.type===`response`)return{ok:!1,response:f.response};let p=f.bind;switch(d.kind){case`tap-point`:return{ok:!0,runtime:{kind:`tap`,captured:!1,runtime:await p(e.device,n)}};case`captured-tap`:return{ok:!0,runtime:{kind:`tap`,captured:!0,runtime:await p(e.device,o)}};case`long-press-point`:return{ok:!0,runtime:{kind:`long-press`,captured:!1,runtime:await p(e.device,t)}};case`captured-long-press`:return{ok:!0,runtime:{kind:`long-press`,captured:!0,runtime:await p(e.device,a)}};case`hover-point`:return{ok:!0,runtime:{kind:`hover`,captured:!1,runtime:await p(e.device,r)}};case`captured-hover`:return{ok:!0,runtime:{kind:`hover`,captured:!0,runtime:await p(e.device,l)}};case`fill-point`:return{ok:!0,runtime:{kind:`fill`,captured:!1,runtime:await p(e.device,s)}};case`captured-fill`:return{ok:!0,runtime:{kind:`fill`,captured:!0,runtime:await p(e.device,c)}}}}function E(e,t){let n={execution:p(t),appBundleId:t.appBundleId},r=e.captured?M(e.runtime):void 0;switch(e.kind){case`tap`:return D(e,t,n,r);case`long-press`:return O(e,n,r);case`hover`:return k(e,n,r);case`fill`:return A(e,t,n,r)}}function D(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=N(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??{},...d(L(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??{},...d(i?`tapped via non-hittable coordinate fallback`:`Tapped ${t.raw}`)}}:void 0})}function O(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??{},...d(`Long pressed (${n.x}, ${n.y})`)}}})}function k(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??{},...d(`Hovered (${n.x}, ${n.y})`)}},hoverRef:r?async e=>await r({ref:e,...t}):void 0})}function A(e,t,n,r){let i=e.captured?e.runtime.operations.fillRef:void 0,a=e=>u(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,...j(s)?{maestroNonHittableCoordinateFallbackUsed:!0}:{},...g(s),...d(`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 j(e){return typeof e==`object`&&!!e&&`maestroNonHittableCoordinateFallbackUsed`in e&&e.maestroNonHittableCoordinateFallbackUsed===!0}function M(e){return async t=>await e.operations.captureSnapshot(t)}function N(e,t){let n=P(e,t);return I(n),{button:e.button??f(t),...n,surface:e.surface??t.surface}}function P(e,t){return{count:F(e.count,t.count,1,`count`,1,200),intervalMs:F(e.intervalMs,t.intervalMs,0,`interval-ms`,0,1e4),holdMs:F(e.holdMs,t.holdMs,0,`hold-ms`,0,1e4),jitterPx:F(e.jitterPx,t.jitterPx,0,`jitter-px`,0,100),doubleTap:e.doubleTap??t.doubleTap??!1}}function F(e,t,n,r,i,a){return u(e??t??n,r,i,a)}function I(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 L(e,t){return t===`primary`?`Pressed (${e.x}, ${e.y})`:`${t===`secondary`?`Right`:`Middle`} clicked (${e.x}, ${e.y})`}export{T as n,E as t};
1
+ import{P as e}from"./sdk-contracts.js";import{Et as t,Gt as n,St as r,Vt as i,dt as a,ft as o,gt as s,lt as c,ut as l}from"./sdk-batch.js";import{O as u}from"./runtime.js";import{r as d}from"./success-text.js";import{i as f}from"./click-button.js";import{h as p}from"./session-snapshot.js";import{t as m}from"./runtime-admission.js";import{t as h}from"./interactor-types.js";function g(e){let t=e?e.textEntryReadiness:void 0,n=x(t)?{textEntryReadiness:t}:{},r=_(e);return r?{...n,...r}:n}function _(e){if(!v(e))return null;let t=y(e.target);return t?{verification:`unconfirmed`,requested:e.requested,before:e.before,after:e.after,target:t}:null}function v(e){return!!(e&&e.verification===`unconfirmed`&&typeof e.requested==`string`&&S(e.before)&&S(e.after))}function y(e){if(!w(e)||!b(e))return null;let t=C(e.rect);return t?{resourceId:e.resourceId,className:e.className,packageName:e.packageName,rect:t}:null}function b(e){return S(e.resourceId)&&S(e.className)&&S(e.packageName)}function x(e){return typeof e==`string`&&h.includes(e)}function S(e){return e===null||typeof e==`string`}function C(e){return!w(e)||![e.x,e.y,e.width,e.height].every(e=>typeof e==`number`)?null:e}function w(e){return!!e&&typeof e==`object`}async function T(e){let u={device:e.device,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice},d=i(e.command,e.requiresCapture),f=await m({command:e.command,required:d.use.required,...e.unavailableResponse?{unavailableResponse:e.unavailableResponse}:{},...u});if(f.type===`response`)return{ok:!1,response:f.response};let p=f.bind;switch(d.kind){case`tap-point`:return{ok:!0,runtime:{kind:`tap`,captured:!1,runtime:await p(e.device,n)}};case`captured-tap`:return{ok:!0,runtime:{kind:`tap`,captured:!0,runtime:await p(e.device,o)}};case`long-press-point`:return{ok:!0,runtime:{kind:`long-press`,captured:!1,runtime:await p(e.device,t)}};case`captured-long-press`:return{ok:!0,runtime:{kind:`long-press`,captured:!0,runtime:await p(e.device,a)}};case`hover-point`:return{ok:!0,runtime:{kind:`hover`,captured:!1,runtime:await p(e.device,r)}};case`captured-hover`:return{ok:!0,runtime:{kind:`hover`,captured:!0,runtime:await p(e.device,l)}};case`fill-point`:return{ok:!0,runtime:{kind:`fill`,captured:!1,runtime:await p(e.device,s)}};case`captured-fill`:return{ok:!0,runtime:{kind:`fill`,captured:!0,runtime:await p(e.device,c)}}}}function E(e,t){let n={execution:p(t),appBundleId:t.appBundleId},r=e.captured?M(e.runtime):void 0;switch(e.kind){case`tap`:return D(e,t,n,r);case`long-press`:return O(e,n,r);case`hover`:return k(e,n,r);case`fill`:return A(e,t,n,r)}}function D(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=N(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??{},...d(L(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??{},...d(i?`tapped via non-hittable coordinate fallback`:`Tapped ${t.raw}`)}}:void 0})}function O(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??{},...d(`Long pressed (${n.x}, ${n.y})`)}}})}function k(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??{},...d(`Hovered (${n.x}, ${n.y})`)}},hoverRef:r?async e=>await r({ref:e,...t}):void 0})}function A(e,t,n,r){let i=e.captured?e.runtime.operations.fillRef:void 0,a=e=>u(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,...j(s)?{maestroNonHittableCoordinateFallbackUsed:!0}:{},...g(s),...d(`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 j(e){return typeof e==`object`&&!!e&&`maestroNonHittableCoordinateFallbackUsed`in e&&e.maestroNonHittableCoordinateFallbackUsed===!0}function M(e){return async t=>await e.operations.captureSnapshot(t)}function N(e,t){let n=P(e,t);return I(n),{button:e.button??f(t),...n,surface:e.surface??t.surface}}function P(e,t){return{count:F(e.count,t.count,1,`count`,1,200),intervalMs:F(e.intervalMs,t.intervalMs,0,`interval-ms`,0,1e4),holdMs:F(e.holdMs,t.holdMs,0,`hold-ms`,0,1e4),jitterPx:F(e.jitterPx,t.jitterPx,0,`jitter-px`,0,100),doubleTap:e.doubleTap??t.doubleTap??!1}}function F(e,t,n,r,i,a){return u(e??t??n,r,i,a)}function I(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 L(e,t){return t===`primary`?`Pressed (${e.x}, ${e.y})`:`${t===`secondary`?`Right`:`Middle`} clicked (${e.x}, ${e.y})`}export{T as n,E as t};
package/dist/src/tree.js CHANGED
@@ -1 +1 @@
1
- import{Lr as e}from"./sdk-batch.js";import"./rect-center.js";function t(e){let t=new Map;for(let n of e){if(typeof n.parentIndex!=`number`)continue;let e=t.get(n.parentIndex)??[];e.push(n),t.set(n.parentIndex,e)}return t}function n(e,t){let n=[],r=new Set([e.index]),i=[...t.get(e.index)??[]];for(;i.length>0;){let e=i.pop();if(!e||r.has(e.index))continue;r.add(e.index),n.push(e);let a=t.get(e.index);a&&i.push(...a)}return n}const r=new WeakMap;function i(e,t){if(!e[t])return[];let n=s(e)[t]??t+1;return e.slice(t+1,n)}function a(e,t,n){let r=s(e)[t]??t+1;for(let i=t+1;i<r;i+=1){let t=e[i];if(t&&n(t))return t}}function o(e,t,n){let r=s(e)[t]??t+1;for(let i=t+1;i<r;i+=1){let t=e[i];t&&n(t)}}function s(e){let t=r.get(e);if(t)return t;let n=Array(e.length),i=[];for(let[t,r]of e.entries()){let e=r?.depth??0;for(;i.length>0&&e<=i.at(-1).depth;){let e=i.pop();n[e.position]=t}i.push({depth:e,position:t})}for(let t of i)n[t.position]=e.length;return r.set(e,n),n}function c(e,t){let n=[],r=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0,i=new Set;for(;r&&!i.has(r.index);)i.add(r.index),n.push(r),r=typeof r.parentIndex==`number`?t.get(r.parentIndex):void 0;return n}function l(e,t,n){for(let r of c(e,t))if(n(r))return r;return null}function u(e,t,n={}){return(n.includeSelf===!0&&m(e.type)?e:null)??l(e,t,e=>m(e.type))}function d(t,n){let r=e(t.type??``),i=t.label?.trim();return!!(p(t)||r===`other`&&!i&&!t.value||(r===`other`||r===`statictext`)&&i&&n.includes(i)||r===`image`)}function f(t){let n=e(t.type??``);return n===`button`||n===`link`||n===`switch`||n===`searchfield`||n===`textfield`}function p(t){return e(t.type??``)===`button`&&t.label?.trim()===`chevron`&&t.enabled===!1}function m(t){let n=e(t??``);return n===`collectionview`||n===`table`||n===`scrollview`||n===`scrollarea`}function h(t,n){let r=t.label?.trim();if(!r||r!==n)return!1;let i=e(t.type??``);return i===`other`||i===`statictext`||i===`link`}function g(e,t,n){e.set(t.index,v(y(e,t),n))}function _(e,t,n){let r=y(e,t);e.set(t.index,v(r,n(r)))}function v(e,t){let n={...e,...t};for(let[e,r]of Object.entries(t))r===void 0&&delete n[e];return n}function y(e,t){return e.get(t.index)??t}function b(t){let n;for(let r of t){let t=e(r.type??``);(t===`application`||t===`window`)&&S(r.rect,n)&&(n=r.rect)}return n}function x(e,t,n=.8){let r=C(e),i=C(t);return r>0&&i>0&&r/i>=n}function S(e,t){return!!(e&&(!t||C(e)>C(t)))}function C(e){return e?e.width*e.height:0}function w(e,t,n){let r=new Map(n.map(e=>[e.index,e])),i=new Map;for(let[t,n]of e.entries())i.set(n.index,t);return e.map((e,n)=>{let a=typeof e.parentIndex==`number`?i.get(e.parentIndex):void 0;return a===void 0&&typeof e.parentIndex==`number`&&(a=T(e.parentIndex,t,r,i)),{...e,index:n,parentIndex:a}})}function T(e,t,n,r){let i=e,a=new Set;for(;typeof i==`number`&&!a.has(i);){if(a.add(i),!t.has(i))return r.get(i);i=n.get(i)?.parentIndex}}export{_,b as a,o as c,h as d,m as f,d as g,w as h,a as i,p as l,g as m,i as n,l as o,f as p,n as r,u as s,t,x as u};
1
+ import{Rr as e}from"./sdk-batch.js";import"./rect-center.js";function t(e){let t=new Map;for(let n of e){if(typeof n.parentIndex!=`number`)continue;let e=t.get(n.parentIndex)??[];e.push(n),t.set(n.parentIndex,e)}return t}function n(e,t){let n=[],r=new Set([e.index]),i=[...t.get(e.index)??[]];for(;i.length>0;){let e=i.pop();if(!e||r.has(e.index))continue;r.add(e.index),n.push(e);let a=t.get(e.index);a&&i.push(...a)}return n}const r=new WeakMap;function i(e,t){if(!e[t])return[];let n=s(e)[t]??t+1;return e.slice(t+1,n)}function a(e,t,n){let r=s(e)[t]??t+1;for(let i=t+1;i<r;i+=1){let t=e[i];if(t&&n(t))return t}}function o(e,t,n){let r=s(e)[t]??t+1;for(let i=t+1;i<r;i+=1){let t=e[i];t&&n(t)}}function s(e){let t=r.get(e);if(t)return t;let n=Array(e.length),i=[];for(let[t,r]of e.entries()){let e=r?.depth??0;for(;i.length>0&&e<=i.at(-1).depth;){let e=i.pop();n[e.position]=t}i.push({depth:e,position:t})}for(let t of i)n[t.position]=e.length;return r.set(e,n),n}function c(e,t){let n=[],r=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0,i=new Set;for(;r&&!i.has(r.index);)i.add(r.index),n.push(r),r=typeof r.parentIndex==`number`?t.get(r.parentIndex):void 0;return n}function l(e,t,n){for(let r of c(e,t))if(n(r))return r;return null}function u(e,t,n={}){return(n.includeSelf===!0&&m(e.type)?e:null)??l(e,t,e=>m(e.type))}function d(t,n){let r=e(t.type??``),i=t.label?.trim();return!!(p(t)||r===`other`&&!i&&!t.value||(r===`other`||r===`statictext`)&&i&&n.includes(i)||r===`image`)}function f(t){let n=e(t.type??``);return n===`button`||n===`link`||n===`switch`||n===`searchfield`||n===`textfield`}function p(t){return e(t.type??``)===`button`&&t.label?.trim()===`chevron`&&t.enabled===!1}function m(t){let n=e(t??``);return n===`collectionview`||n===`table`||n===`scrollview`||n===`scrollarea`}function h(t,n){let r=t.label?.trim();if(!r||r!==n)return!1;let i=e(t.type??``);return i===`other`||i===`statictext`||i===`link`}function g(e,t,n){e.set(t.index,v(y(e,t),n))}function _(e,t,n){let r=y(e,t);e.set(t.index,v(r,n(r)))}function v(e,t){let n={...e,...t};for(let[e,r]of Object.entries(t))r===void 0&&delete n[e];return n}function y(e,t){return e.get(t.index)??t}function b(t){let n;for(let r of t){let t=e(r.type??``);(t===`application`||t===`window`)&&S(r.rect,n)&&(n=r.rect)}return n}function x(e,t,n=.8){let r=C(e),i=C(t);return r>0&&i>0&&r/i>=n}function S(e,t){return!!(e&&(!t||C(e)>C(t)))}function C(e){return e?e.width*e.height:0}function w(e,t,n){let r=new Map(n.map(e=>[e.index,e])),i=new Map;for(let[t,n]of e.entries())i.set(n.index,t);return e.map((e,n)=>{let a=typeof e.parentIndex==`number`?i.get(e.parentIndex):void 0;return a===void 0&&typeof e.parentIndex==`number`&&(a=T(e.parentIndex,t,r,i)),{...e,index:n,parentIndex:a}})}function T(e,t,n,r){let i=e,a=new Set;for(;typeof i==`number`&&!a.has(i);){if(a.add(i),!t.has(i))return r.get(i);i=n.get(i)?.parentIndex}}export{_,b as a,o as c,h as d,m as f,d as g,w as h,a as i,p as l,g as m,i as n,l as o,f as p,n as r,u as s,t,x as u};
@@ -1 +1 @@
1
- import{P as e}from"./sdk-contracts.js";import{qt as t}from"./sdk-batch.js";import{O as n}from"./runtime.js";import{r}from"./success-text.js";import{m as i}from"./session-snapshot.js";import{n as a}from"./runtime-admission.js";function o(e){let t=e?.trim().split(/\s+/,1)[0];if(!t||!t.startsWith(`@`)||t.length<3)return null;let n=t.slice(1);return/^[A-Za-z_-]*\d[\w-]*$/i.test(n)||/^(?:ref|node|element|el)[\w-]*$/i.test(n)?t:null}async function s(e){let n=await a({command:`type`,device:e.device,use:t,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(n.type===`response`)return{ok:!1,response:n.response};let r=n.runtime;return{ok:!0,typeText:async(e,t)=>await c(r,e,t)}}async function c(t,i,a){let s=o(i[0]);if(s)throw new e(`INVALID_ARGS`,`type does not accept a target ref like "${s}"`,{hint:`Use fill ${s} "text" to target that field, or press ${s} then type "text" to append.`});let c=i.join(` `);if(!c)throw new e(`INVALID_ARGS`,`type requires text`);let u=n(a.delayMs??0,`delay-ms`,0,1e4),d=(await t.operations.typeText(l(c,u,a)))?.textEntryRoute;return{...d===void 0?{}:{textEntryRoute:d},text:c,delayMs:u,...r(`Typed ${Array.from(c).length} chars`)}}function l(e,t,n){return{text:e,delayMs:t,...n.appBundleId===void 0?{}:{options:{appBundleId:n.appBundleId}},execution:i(n)}}export{s as n,c as t};
1
+ import{P as e}from"./sdk-contracts.js";import{qt as t}from"./sdk-batch.js";import{O as n}from"./runtime.js";import{r}from"./success-text.js";import{h as i}from"./session-snapshot.js";import{n as a}from"./runtime-admission.js";function o(e){let t=e?.trim().split(/\s+/,1)[0];if(!t||!t.startsWith(`@`)||t.length<3)return null;let n=t.slice(1);return/^[A-Za-z_-]*\d[\w-]*$/i.test(n)||/^(?:ref|node|element|el)[\w-]*$/i.test(n)?t:null}async function s(e){let n=await a({command:`type`,device:e.device,use:t,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(n.type===`response`)return{ok:!1,response:n.response};let r=n.runtime;return{ok:!0,typeText:async(e,t)=>await c(r,e,t)}}async function c(t,i,a){let s=o(i[0]);if(s)throw new e(`INVALID_ARGS`,`type does not accept a target ref like "${s}"`,{hint:`Use fill ${s} "text" to target that field, or press ${s} then type "text" to append.`});let c=i.join(` `);if(!c)throw new e(`INVALID_ARGS`,`type requires text`);let u=n(a.delayMs??0,`delay-ms`,0,1e4),d=(await t.operations.typeText(l(c,u,a)))?.textEntryRoute;return{...d===void 0?{}:{textEntryRoute:d},text:c,delayMs:u,...r(`Typed ${Array.from(c).length} chars`)}}function l(e,t,n){return{text:e,delayMs:t,...n.appBundleId===void 0?{}:{options:{appBundleId:n.appBundleId}},execution:i(n)}}export{s as n,c as t};
package/dist/src/video.js CHANGED
@@ -1,4 +1,4 @@
1
- import{P as e}from"./sdk-contracts.js";import{sr as t}from"./sdk-batch.js";import{w as n}from"./owner-identity.js";import{l as r}from"./exec.js";import{t as i}from"./timeouts.js";import{a,t as o}from"./file.js";import"./command.js";import"./process.js";import"./retry.js";import{createHash as s}from"node:crypto";import c from"node:fs";import l from"node:os";import u from"node:path";import{fileURLToPath as d}from"node:url";const f=`apple/runner/AgentDeviceRunner/RecordingScripts`;function p(e,t,n,r){let i=`${f}/${e}`,a=`dist/${i}`;return[u.resolve(t,e),u.resolve(n,i),u.resolve(t,`../${i}`),u.resolve(t,`../../${i}`),u.resolve(t,`../../../${i}`),u.resolve(n,a),u.resolve(r,i)]}function m(t,n,r=u.dirname(d(import.meta.url)),i=process.cwd()){let a=p(t,r,n,i);for(let e of a)if(c.existsSync(e))return e;throw new e(`COMMAND_FAILED`,`Missing recording helper script: ${t}`,{hint:`Ensure ${f} is present in this checkout or bundled under dist/${f} in the package.`,scriptName:t,searchedPaths:a})}function h(e=process.env){let t=v(),n=u.join(t,`home`),r=u.join(t,`module-cache`);return c.mkdirSync(n,{recursive:!0}),c.mkdirSync(r,{recursive:!0}),{...e,HOME:n,CLANG_MODULE_CACHE_PATH:r}}async function g(e){let t=[e.sourcePath,...e.extraSourcePaths??[]],n=t.map(e=>({sourcePath:e,stat:c.statSync(e),source:c.readFileSync(e)})),r=S(e.cacheName??u.basename(e.sourcePath,u.extname(e.sourcePath))),i=C([`2`,process.platform,process.arch,...n.flatMap(({sourcePath:e,stat:t,source:n})=>[u.resolve(e),t.size,n])]),a=u.join(v(),`bin`,`${r}-${i}`);return await y({sourcePaths:t,executablePath:a,timeoutMs:e.timeoutMs}),a}async function _(e){let t=S(e.cacheName),n=C([`2`,process.platform,process.arch,e.source]),r=u.join(v(),`sources`,`${t}-${n}.swift`),i=u.join(v(),`bin`,`${t}-${n}`);return await y({sourcePaths:[r],executablePath:i,sourceText:e.source,timeoutMs:e.timeoutMs}),i}function v(){let e=process.env.AGENT_DEVICE_SWIFT_CACHE_DIR?.trim();return e?u.resolve(e):u.join(l.tmpdir(),`agent-device-swift-cache`)}async function y(e){if(x(e.executablePath))return;let t=u.dirname(e.executablePath);c.mkdirSync(t,{recursive:!0});let n=e.timeoutMs??12e4;await a({acquire:()=>b(`${e.executablePath}.lock`,n),task:async()=>{if(x(e.executablePath))return;let i=c.mkdtempSync(u.join(t,`.${u.basename(e.executablePath)}.${process.pid}.`)),a=u.join(i,u.basename(e.executablePath));try{let[t]=e.sourcePaths;e.sourceText!==void 0&&t&&!c.existsSync(t)&&(c.mkdirSync(u.dirname(t),{recursive:!0}),c.writeFileSync(t,e.sourceText)),await r(`xcrun`,[`swiftc`,...e.sourcePaths,`-o`,a],{timeoutMs:n,env:h()}),c.renameSync(a,e.executablePath)}finally{c.rmSync(i,{recursive:!0,force:!0})}}})}async function b(t,r){try{return await o({lockDirPath:t,owner:{pid:process.pid,startTime:n(process.pid),acquiredAtMs:Date.now()},timeoutMs:r,pollMs:25,description:`Swift cache lock: ${t} (${r}ms)`})}catch(n){throw n instanceof e&&n.details?.reason===`process_lock_timeout`?new e(`COMMAND_FAILED`,n.message,{...n.details,lockDir:t,timeoutMs:r}):n}}function x(e){try{return c.accessSync(e,c.constants.X_OK),c.statSync(e).isFile()}catch{return!1}}function S(e){return t(e.replaceAll(/[^A-Za-z0-9._-]/g,`-`))||`swift-helper`}function C(e){let t=s(`sha256`);for(let n of e)t.update(Buffer.isBuffer(n)?n:String(n)),t.update(`\0`);return t.digest(`hex`).slice(0,16)}const w={block:161,blockGroup:160,cluster:524531317,codecId:134,documentType:17026,ebml:440786851,segment:408125543,simpleBlock:163,trackEntry:174,trackNumber:215,tracks:374648427,trackType:131};function T(e){let t=E(e);if(!t)return!1;let{bytes:n,fileSize:r}=t,i=L(n,0,n.length,r);if(!i||i.id!==w.ebml||!i.complete||i.unknownSize||!D(n,i))return!1;let a=L(n,i.nextOffset,n.length,r);return!a||a.id!==w.segment||!V(a,r)?!1:O(n,a,r)}function E(e){try{let t=c.openSync(e,`r`);try{let e=c.fstatSync(t).size;if(e<=0)return;let n=Buffer.alloc(Math.min(e,1048576));return c.readSync(t,n,0,n.length,0)===n.length?{bytes:n,fileSize:e}:void 0}finally{c.closeSync(t)}}catch{return}}function D(e,t){let n=I(e,t)?.find(e=>e.id===w.documentType);return n!==void 0&&e.toString(`ascii`,n.dataStart,n.dataEnd)===`webm`}function O(e,t,n){let r=new Set,i=new Set;for(let a=t.dataStart;a<t.dataEnd;){let o=L(e,a,t.dataEnd,n);if(!o||!V(o,n))return!1;if(o.id===w.tracks&&k(e,o,r),o.id===w.cluster&&j(e,o,n,i),H(r,i))return!0;if(!o.complete||o.unknownSize)return!1;a=o.nextOffset}return!1}function k(e,t,n){let r=I(e,t);if(r){for(let t of r)if(t.id===w.trackEntry){let r=A(e,t);r!==void 0&&n.add(r)}}}function A(e,t){let n=I(e,t),r=F(e,n,w.trackNumber),i=F(e,n,w.trackType),a=n?.find(e=>e.id===w.codecId),o=a?e.toString(`ascii`,a.dataStart,a.dataEnd):void 0;return i===1&&o?.startsWith(`V_`)?r:void 0}function j(e,t,n,r){for(let i=t.dataStart;i<t.dataEnd;){let a=L(e,i,t.dataEnd,n);if(!a||!V(a,n)||(a.id===w.simpleBlock&&N(e,a,r),a.id===w.blockGroup&&M(e,a,r),!a.complete||a.unknownSize))return;i=a.nextOffset}}function M(e,t,n){let r=I(e,t)?.find(e=>e.id===w.block);r&&N(e,r,n)}function N(e,t,n){if(!t.complete||t.unknownSize)return;let r=z(e,t.dataStart);!r||r.unknown||t.dataEnd-t.dataStart<r.length+4||n.add(r.value)}function P(e,t){let n=t.dataEnd-t.dataStart;if(n<1||n>6)return;let r=0;for(let n=t.dataStart;n<t.dataEnd;n+=1)r=r*256+e[n];return Number.isSafeInteger(r)?r:void 0}function F(e,t,n){let r=t?.find(e=>e.id===n);return r?P(e,r):void 0}function I(e,t){if(!t.complete||t.unknownSize)return;let n=[];for(let r=t.dataStart;r<t.dataEnd;){let i=L(e,r,t.dataEnd,e.length);if(!i||!i.complete||i.unknownSize)return;n.push(i),r=i.nextOffset}return n}function L(e,t,n,r){let i=R(e,t);if(!i)return;let a=z(e,t+i.length);if(!a)return;let o=t+i.length+a.length;if(o>n)return;let s=a.unknown?r:o+a.value;if(!(!Number.isSafeInteger(s)||s<o))return{id:i.value,dataStart:o,dataEnd:Math.min(s,n),nextOffset:s,complete:s<=n,unknownSize:a.unknown}}function R(e,t){let n=B(e,t,4);if(!n)return;let r=0;for(let i=0;i<n;i+=1)r=r*256+e[t+i];return{length:n,value:r}}function z(e,t){let n=B(e,t,8);if(!n)return;let r=e[t],i=128>>n-1;if((r&i-1)==i-1&&e.subarray(t+1,t+n).every(e=>e===255))return{length:n,value:0,unknown:!0};let a=r&i-1;for(let r=1;r<n;r+=1)a=a*256+e[t+r];return Number.isSafeInteger(a)?{length:n,value:a,unknown:!1}:void 0}function B(e,t,n){let r=e[t];if(r===void 0||r===0)return;let i=128,a=1;for(;(r&i)===0;)i>>=1,a+=1;return a<=n&&t+a<=e.length?a:void 0}function V(e,t){return e.unknownSize||e.nextOffset<=t}function H(e,t){for(let n of e)if(t.has(n))return!0;return!1}let U;async function W(e,t={}){let n=t.pollMs??150,r=t.attempts??12,a,o=0;for(let t=0;t<r;t+=1){let t=0;try{t=c.statSync(e).size}catch{t=0}if(t>0&&t===a){if(o+=1,o>=2)return}else o=0;a=t,await i(n)}}async function G(e){let t=await Z(e);if(!t)return!1;if(t===`webm`)return!0;try{let t=await K(),n=await r(t,[e],{allowFailure:!0,timeoutMs:1e4,env:h()});return n.exitCode===0||Y(n.stderr,n.stdout)}catch(e){if(q(e))return!0;throw e}}async function K(){U??=_({source:`import Foundation
1
+ import{P as e}from"./sdk-contracts.js";import{cr as t}from"./sdk-batch.js";import{w as n}from"./owner-identity.js";import{l as r}from"./exec.js";import{i}from"./retry.js";import{a,t as o}from"./file.js";import"./command.js";import"./process.js";import"./retry2.js";import{createHash as s}from"node:crypto";import c from"node:fs";import l from"node:os";import u from"node:path";import{fileURLToPath as d}from"node:url";const f=`apple/runner/AgentDeviceRunner/RecordingScripts`;function p(e,t,n,r){let i=`${f}/${e}`,a=`dist/${i}`;return[u.resolve(t,e),u.resolve(n,i),u.resolve(t,`../${i}`),u.resolve(t,`../../${i}`),u.resolve(t,`../../../${i}`),u.resolve(n,a),u.resolve(r,i)]}function m(t,n,r=u.dirname(d(import.meta.url)),i=process.cwd()){let a=p(t,r,n,i);for(let e of a)if(c.existsSync(e))return e;throw new e(`COMMAND_FAILED`,`Missing recording helper script: ${t}`,{hint:`Ensure ${f} is present in this checkout or bundled under dist/${f} in the package.`,scriptName:t,searchedPaths:a})}function h(e=process.env){let t=v(),n=u.join(t,`home`),r=u.join(t,`module-cache`);return c.mkdirSync(n,{recursive:!0}),c.mkdirSync(r,{recursive:!0}),{...e,HOME:n,CLANG_MODULE_CACHE_PATH:r}}async function g(e){let t=[e.sourcePath,...e.extraSourcePaths??[]],n=t.map(e=>({sourcePath:e,stat:c.statSync(e),source:c.readFileSync(e)})),r=S(e.cacheName??u.basename(e.sourcePath,u.extname(e.sourcePath))),i=C([`2`,process.platform,process.arch,...n.flatMap(({sourcePath:e,stat:t,source:n})=>[u.resolve(e),t.size,n])]),a=u.join(v(),`bin`,`${r}-${i}`);return await y({sourcePaths:t,executablePath:a,timeoutMs:e.timeoutMs}),a}async function _(e){let t=S(e.cacheName),n=C([`2`,process.platform,process.arch,e.source]),r=u.join(v(),`sources`,`${t}-${n}.swift`),i=u.join(v(),`bin`,`${t}-${n}`);return await y({sourcePaths:[r],executablePath:i,sourceText:e.source,timeoutMs:e.timeoutMs}),i}function v(){let e=process.env.AGENT_DEVICE_SWIFT_CACHE_DIR?.trim();return e?u.resolve(e):u.join(l.tmpdir(),`agent-device-swift-cache`)}async function y(e){if(x(e.executablePath))return;let t=u.dirname(e.executablePath);c.mkdirSync(t,{recursive:!0});let n=e.timeoutMs??12e4;await a({acquire:()=>b(`${e.executablePath}.lock`,n),task:async()=>{if(x(e.executablePath))return;let i=c.mkdtempSync(u.join(t,`.${u.basename(e.executablePath)}.${process.pid}.`)),a=u.join(i,u.basename(e.executablePath));try{let[t]=e.sourcePaths;e.sourceText!==void 0&&t&&!c.existsSync(t)&&(c.mkdirSync(u.dirname(t),{recursive:!0}),c.writeFileSync(t,e.sourceText)),await r(`xcrun`,[`swiftc`,...e.sourcePaths,`-o`,a],{timeoutMs:n,env:h()}),c.renameSync(a,e.executablePath)}finally{c.rmSync(i,{recursive:!0,force:!0})}}})}async function b(t,r){try{return await o({lockDirPath:t,owner:{pid:process.pid,startTime:n(process.pid),acquiredAtMs:Date.now()},timeoutMs:r,pollMs:25,description:`Swift cache lock: ${t} (${r}ms)`})}catch(n){throw n instanceof e&&n.details?.reason===`process_lock_timeout`?new e(`COMMAND_FAILED`,n.message,{...n.details,lockDir:t,timeoutMs:r}):n}}function x(e){try{return c.accessSync(e,c.constants.X_OK),c.statSync(e).isFile()}catch{return!1}}function S(e){return t(e.replaceAll(/[^A-Za-z0-9._-]/g,`-`))||`swift-helper`}function C(e){let t=s(`sha256`);for(let n of e)t.update(Buffer.isBuffer(n)?n:String(n)),t.update(`\0`);return t.digest(`hex`).slice(0,16)}const w={block:161,blockGroup:160,cluster:524531317,codecId:134,documentType:17026,ebml:440786851,segment:408125543,simpleBlock:163,trackEntry:174,trackNumber:215,tracks:374648427,trackType:131};function T(e){let t=E(e);if(!t)return!1;let{bytes:n,fileSize:r}=t,i=L(n,0,n.length,r);if(!i||i.id!==w.ebml||!i.complete||i.unknownSize||!D(n,i))return!1;let a=L(n,i.nextOffset,n.length,r);return!a||a.id!==w.segment||!V(a,r)?!1:O(n,a,r)}function E(e){try{let t=c.openSync(e,`r`);try{let e=c.fstatSync(t).size;if(e<=0)return;let n=Buffer.alloc(Math.min(e,1048576));return c.readSync(t,n,0,n.length,0)===n.length?{bytes:n,fileSize:e}:void 0}finally{c.closeSync(t)}}catch{return}}function D(e,t){let n=I(e,t)?.find(e=>e.id===w.documentType);return n!==void 0&&e.toString(`ascii`,n.dataStart,n.dataEnd)===`webm`}function O(e,t,n){let r=new Set,i=new Set;for(let a=t.dataStart;a<t.dataEnd;){let o=L(e,a,t.dataEnd,n);if(!o||!V(o,n))return!1;if(o.id===w.tracks&&k(e,o,r),o.id===w.cluster&&j(e,o,n,i),H(r,i))return!0;if(!o.complete||o.unknownSize)return!1;a=o.nextOffset}return!1}function k(e,t,n){let r=I(e,t);if(r){for(let t of r)if(t.id===w.trackEntry){let r=A(e,t);r!==void 0&&n.add(r)}}}function A(e,t){let n=I(e,t),r=F(e,n,w.trackNumber),i=F(e,n,w.trackType),a=n?.find(e=>e.id===w.codecId),o=a?e.toString(`ascii`,a.dataStart,a.dataEnd):void 0;return i===1&&o?.startsWith(`V_`)?r:void 0}function j(e,t,n,r){for(let i=t.dataStart;i<t.dataEnd;){let a=L(e,i,t.dataEnd,n);if(!a||!V(a,n)||(a.id===w.simpleBlock&&N(e,a,r),a.id===w.blockGroup&&M(e,a,r),!a.complete||a.unknownSize))return;i=a.nextOffset}}function M(e,t,n){let r=I(e,t)?.find(e=>e.id===w.block);r&&N(e,r,n)}function N(e,t,n){if(!t.complete||t.unknownSize)return;let r=z(e,t.dataStart);!r||r.unknown||t.dataEnd-t.dataStart<r.length+4||n.add(r.value)}function P(e,t){let n=t.dataEnd-t.dataStart;if(n<1||n>6)return;let r=0;for(let n=t.dataStart;n<t.dataEnd;n+=1)r=r*256+e[n];return Number.isSafeInteger(r)?r:void 0}function F(e,t,n){let r=t?.find(e=>e.id===n);return r?P(e,r):void 0}function I(e,t){if(!t.complete||t.unknownSize)return;let n=[];for(let r=t.dataStart;r<t.dataEnd;){let i=L(e,r,t.dataEnd,e.length);if(!i||!i.complete||i.unknownSize)return;n.push(i),r=i.nextOffset}return n}function L(e,t,n,r){let i=R(e,t);if(!i)return;let a=z(e,t+i.length);if(!a)return;let o=t+i.length+a.length;if(o>n)return;let s=a.unknown?r:o+a.value;if(!(!Number.isSafeInteger(s)||s<o))return{id:i.value,dataStart:o,dataEnd:Math.min(s,n),nextOffset:s,complete:s<=n,unknownSize:a.unknown}}function R(e,t){let n=B(e,t,4);if(!n)return;let r=0;for(let i=0;i<n;i+=1)r=r*256+e[t+i];return{length:n,value:r}}function z(e,t){let n=B(e,t,8);if(!n)return;let r=e[t],i=128>>n-1;if((r&i-1)==i-1&&e.subarray(t+1,t+n).every(e=>e===255))return{length:n,value:0,unknown:!0};let a=r&i-1;for(let r=1;r<n;r+=1)a=a*256+e[t+r];return Number.isSafeInteger(a)?{length:n,value:a,unknown:!1}:void 0}function B(e,t,n){let r=e[t];if(r===void 0||r===0)return;let i=128,a=1;for(;(r&i)===0;)i>>=1,a+=1;return a<=n&&t+a<=e.length?a:void 0}function V(e,t){return e.unknownSize||e.nextOffset<=t}function H(e,t){for(let n of e)if(t.has(n))return!0;return!1}let U;async function W(e,t={}){let n=t.pollMs??150,r=t.attempts??12,a,o=0;for(let t=0;t<r;t+=1){let t=0;try{t=c.statSync(e).size}catch{t=0}if(t>0&&t===a){if(o+=1,o>=2)return}else o=0;a=t,await i(n)}}async function G(e){let t=await Z(e);if(!t)return!1;if(t===`webm`)return!0;try{let t=await K(),n=await r(t,[e],{allowFailure:!0,timeoutMs:1e4,env:h()});return n.exitCode===0||Y(n.stderr,n.stdout)}catch(e){if(q(e))return!0;throw e}}async function K(){U??=_({source:`import Foundation
2
2
  import AVFoundation
3
3
 
4
4
  let url = URL(fileURLWithPath: CommandLine.arguments[1])
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-device",
3
- "version": "0.21.22",
3
+ "version": "0.21.24",
4
4
  "description": "Mobile app automation and verification for AI coding agents. CLI, MCP server, and typed Node.js API for iOS, Android, HarmonyOS, TV, web, macOS, and Linux.",
5
5
  "mcpName": "io.github.callstack/agent-device",
6
6
  "license": "MIT",
@@ -73,6 +73,10 @@
73
73
  "./plugins": {
74
74
  "types": "./dist/src/plugins.d.ts",
75
75
  "import": "./dist/src/plugins.js"
76
+ },
77
+ "./plugins/webdriver": {
78
+ "types": "./dist/src/plugins/webdriver.d.ts",
79
+ "import": "./dist/src/plugins/webdriver.js"
76
80
  }
77
81
  },
78
82
  "engines": {
@@ -101,6 +105,7 @@
101
105
  "build:xcuitest:tvos:clean": "pnpm clean:xcuitest:tvos && pnpm build:xcuitest:tvos",
102
106
  "build:xcuitest:visionos": "AGENT_DEVICE_XCUITEST_PLATFORM=visionos sh ./scripts/build-xcuitest-apple.sh",
103
107
  "build:xcuitest:visionos:clean": "pnpm clean:xcuitest:visionos && pnpm build:xcuitest:visionos",
108
+ "package:xcuitest": "node scripts/build-package-xcuitest.mjs",
104
109
  "build:android-snapshot-helper": "AGENT_DEVICE_ANDROID_HELPER=snapshot sh ./scripts/build-android-helper.sh $(node -p \"require('./package.json').version\") .tmp/android-snapshot-helper",
105
110
  "package:android-snapshot-helper": "AGENT_DEVICE_ANDROID_HELPER=snapshot sh ./scripts/package-android-helper.sh $(node -p \"require('./package.json').version\") v$(node -p \"require('./package.json').version\") .tmp/android-snapshot-helper",
106
111
  "package:android-snapshot-helper:npm": "rm -rf android/snapshot-helper/dist && AGENT_DEVICE_ANDROID_HELPER=snapshot sh ./scripts/package-android-helper.sh $(node -p \"require('./package.json').version\") v$(node -p \"require('./package.json').version\") android/snapshot-helper/dist",
@@ -114,10 +119,10 @@
114
119
  "test:macos-helper": "node --experimental-strip-types scripts/swift-toolchain-tmpdir.ts swift test --package-path apple/macos-helper",
115
120
  "check:macos-helper": "pnpm build:macos-helper && pnpm test:macos-helper",
116
121
  "prepare:publish-assets": "node scripts/prepare-publish-assets.mjs",
117
- "build:package": "pnpm build && pnpm build:xcuitest:ios && pnpm build:xcuitest:macos && pnpm build:xcuitest:tvos && pnpm build:xcuitest:visionos && pnpm build:macos-helper:clean && pnpm prepare:publish-assets",
122
+ "build:package": "pnpm build && pnpm package:xcuitest && pnpm build:macos-helper:clean && pnpm prepare:publish-assets",
118
123
  "package:npm": "pnpm build:package && pnpm check:package",
119
- "release:prepare": "node scripts/release-mark-dev.mjs --check-release-version && rm -rf .tmp/release && pnpm check:mcp-metadata && pnpm build:package && pnpm check:package -- --pack-destination .tmp/release",
120
- "release:publish": "pnpm release:prepare && npm publish --ignore-scripts .tmp/release/*.tgz && pnpm release:mark-dev",
124
+ "release:prepare": "rm -rf .tmp/release && pnpm check:mcp-metadata && pnpm build:package && pnpm check:package -- --pack-destination .tmp/release && node scripts/release-workspace.mjs pack",
125
+ "release:publish": "node scripts/release-mark-dev.mjs --check-release-version && pnpm release:prepare && node scripts/release-workspace.mjs publish",
121
126
  "release:mark-dev": "node scripts/release-mark-dev.mjs",
122
127
  "ad": "node bin/agent-device.mjs",
123
128
  "bench:help-conformance": "node scripts/help-conformance-bench.mjs",
@@ -130,8 +135,6 @@
130
135
  "bench:ios-snapshot": "node --experimental-strip-types scripts/ios-snapshot-benchmark/run.ts",
131
136
  "bench:ios-snapshot:deep-button": "node --experimental-strip-types scripts/ios-snapshot-benchmark/deep-button.ts",
132
137
  "bench:ios-snapshot:evidence": "node --experimental-strip-types scripts/ios-snapshot-benchmark/evidence.ts",
133
- "bench:png-crop": "node --experimental-strip-types scripts/png-crop-benchmark/run.ts",
134
- "bench:ios-ax-bridge:targeted": "node --experimental-strip-types scripts/ios-ax-bridge-spike/targeted-run.ts",
135
138
  "mutation:run": "node --experimental-strip-types scripts/mutation/run.ts",
136
139
  "mutation:check": "node --experimental-strip-types scripts/mutation/run.ts --no-run",
137
140
  "mutation:affected": "node --experimental-strip-types scripts/mutation/run.ts --affected",
@@ -153,7 +156,7 @@
153
156
  "check:layering": "node --experimental-strip-types scripts/node-test-tmpdir.ts --experimental-strip-types --test scripts/layering/*.test.ts && node --experimental-strip-types scripts/layering/check.ts",
154
157
  "check:di-seams": "node --experimental-strip-types scripts/node-test-tmpdir.ts --experimental-strip-types --test scripts/di-seams/*.test.ts && node --experimental-strip-types scripts/di-seams/check.ts",
155
158
  "depgraph": "node --experimental-strip-types scripts/depgraph/build.ts",
156
- "depgraph:test": "node --experimental-strip-types scripts/node-test-tmpdir.ts --experimental-strip-types --test scripts/depgraph/model.test.ts scripts/depgraph/affected.test.ts",
159
+ "depgraph:test": "node --experimental-strip-types scripts/node-test-tmpdir.ts --experimental-strip-types --test scripts/depgraph/model.test.ts scripts/depgraph/import-graph.test.ts scripts/depgraph/affected.test.ts scripts/depgraph/structure-summary.test.ts",
157
160
  "check:production-exports": "fallow dead-code --config fallow-production-exports.json --production --unused-exports --fail-on-issues",
158
161
  "check:bundle-owner-files": "node --experimental-strip-types scripts/check-bundle-owner-files.ts",
159
162
  "check:package": "node --experimental-strip-types scripts/check-package.ts",
@@ -166,16 +169,16 @@
166
169
  "check:packaged-runner-swift": "node --experimental-strip-types scripts/check-packaged-runner-swift.ts",
167
170
  "check:tmpdir-leaks": "node --experimental-strip-types scripts/check-tmpdir-leaks.ts",
168
171
  "check:tmpdir-leaks:test": "node --experimental-strip-types scripts/node-test-tmpdir.ts --experimental-strip-types --test --test-concurrency=1 scripts/check-tmpdir-leaks-model.test.ts scripts/vitest-tmpdir-global-setup.test.ts scripts/node-test-tmpdir.test.ts scripts/swift-toolchain-tmpdir.test.ts",
169
- "check:freerange": "fr",
172
+ "check:freerange": "cd scripts/freerange && fr",
170
173
  "check:quick": "pnpm lint && pnpm typecheck",
171
174
  "sync:mcp-metadata": "node scripts/sync-mcp-metadata.mjs",
172
175
  "check:mcp-metadata": "node scripts/sync-mcp-metadata.mjs --check",
173
- "version": "pnpm sync:mcp-metadata && git add server.json",
176
+ "version": "node scripts/release-workspace.mjs sync --stage && pnpm sync:mcp-metadata && git add server.json",
174
177
  "check:tooling": "pnpm format:check && pnpm lint && pnpm typecheck && pnpm check:layering && pnpm depgraph:test && pnpm check:gate-manifest:test && pnpm check:gate-manifest && pnpm check:production-exports && pnpm check:tmpdir-leaks:test && pnpm check:xctest-selection && pnpm check:packaged-runner-swift && pnpm check:mcp-metadata && pnpm build && pnpm check:bundle-owner-files && pnpm check:package",
175
178
  "check:unit": "pnpm test:unit && pnpm check:tmpdir-leaks && pnpm test:smoke",
176
179
  "check": "pnpm check:tooling && pnpm check:fallow && pnpm check:unit",
177
- "prepack": "pnpm check:mcp-metadata && pnpm package:npm",
178
- "typecheck": "tsc -b packages/xml packages/kernel packages/contracts packages/device-selection packages/host-kit packages/capture-kit packages/managed-allocation packages/provision-kit packages/platform-apple packages/platform-android packages/platform-harmonyos packages/platform-vega packages/platform-linux packages/platform-web packages/ad-script packages/selectors packages/command-registry packages/session-journal packages/ad-replay packages/maestro packages/replay-port packages/replay-test packages/provider-webdriver packages/provider-limrun && tsc -p tsconfig.json && tsc -p examples/sdk/tsconfig.json",
180
+ "prepack": "npm_config_dry_run=false pnpm release:prepare",
181
+ "typecheck": "tsc -b tsconfig.json examples/sdk/tsconfig.json",
179
182
  "test-app:install": "pnpm install --dir examples/test-app",
180
183
  "test-app:start": "pnpm --dir examples/test-app start",
181
184
  "test-app:ios": "pnpm --dir examples/test-app ios",
@@ -195,7 +198,7 @@
195
198
  "test:fuzz-worker": "vitest run --project fuzz-worker",
196
199
  "test:integration:provider": "vitest run --project provider-integration",
197
200
  "test:integration:progress": "node --experimental-strip-types scripts/integration-progress.ts",
198
- "test:integration:progress:check": "node --experimental-strip-types scripts/integration-progress.ts --check",
201
+ "test:integration:progress:check": "node --experimental-strip-types scripts/node-test-tmpdir.ts --experimental-strip-types --test scripts/integration-progress-model.test.ts && node --experimental-strip-types scripts/integration-progress.ts --check",
199
202
  "test:fixture-cache": "node --experimental-strip-types scripts/node-test-tmpdir.ts --test test/ci/trusted-fixture-artifact.test.mjs",
200
203
  "test:fixture-fallback": "sh ./test/scripts/setup-fixture-app-fallback-smoke.sh",
201
204
  "test:output-economy": "vitest run --project output-economy",
@@ -210,7 +213,9 @@
210
213
  "test:replay:android": "node --experimental-strip-types src/bin.ts test test/integration/replays/android/emulator",
211
214
  "test:replay:macos": "node --experimental-strip-types src/bin.ts test test/integration/replays/macos",
212
215
  "test:replay:linux": "node --experimental-strip-types src/bin.ts test test/integration/replays/linux",
213
- "test:linux:command-evidence": "node --experimental-strip-types test/integration/linux-e2e/live-runner.ts"
216
+ "test:linux:command-evidence": "node --experimental-strip-types test/integration/linux-e2e/live-runner.ts",
217
+ "postpublish": "node scripts/release-workspace.mjs publish",
218
+ "prepublishOnly": "node scripts/release-mark-dev.mjs --check-release-version"
214
219
  },
215
220
  "files": [
216
221
  "bin",
@@ -291,8 +296,8 @@
291
296
  "@agent-device/device-selection": "workspace:*",
292
297
  "@agent-device/host-kit": "workspace:*",
293
298
  "@agent-device/kernel": "workspace:*",
294
- "@agent-device/managed-allocation": "workspace:*",
295
299
  "@agent-device/maestro": "workspace:*",
300
+ "@agent-device/managed-allocation": "workspace:*",
296
301
  "@agent-device/platform-android": "workspace:*",
297
302
  "@agent-device/platform-apple": "workspace:*",
298
303
  "@agent-device/platform-harmonyos": "workspace:*",
@@ -302,6 +307,7 @@
302
307
  "@agent-device/provider-limrun": "workspace:*",
303
308
  "@agent-device/provider-webdriver": "workspace:*",
304
309
  "@agent-device/provision-kit": "workspace:*",
310
+ "@agent-device/proxy": "workspace:*",
305
311
  "@agent-device/replay-port": "workspace:*",
306
312
  "@agent-device/replay-test": "workspace:*",
307
313
  "@agent-device/selectors": "workspace:*",
@@ -309,9 +315,10 @@
309
315
  "@agent-device/xml": "workspace:*",
310
316
  "@arethetypeswrong/cli": "^0.18.5",
311
317
  "@chenglou/freerange": "^0.0.4",
312
- "@limrun/api": "^0.49.3",
318
+ "@limrun/api": "^0.59.0",
313
319
  "@nkzw/eslint-plugin": "^2.0.0",
314
320
  "@nkzw/oxlint-config": "^1.3.0",
321
+ "@statelyai/graph": "2.4.0",
315
322
  "@stryker-mutator/core": "10.0.0",
316
323
  "@stryker-mutator/vitest-runner": "10.0.0",
317
324
  "@types/json-schema": "^7.0.15",
@@ -339,6 +346,7 @@
339
346
  "vite": "^8.2.1",
340
347
  "vitest": "^4.1.11",
341
348
  "yaml": "^2.9.0",
342
- "yauzl": "^3.4.0"
349
+ "yauzl": "^3.4.0",
350
+ "@agent-device/testmu": "workspace:*"
343
351
  }
344
352
  }
package/server.json CHANGED
@@ -7,12 +7,12 @@
7
7
  "url": "https://github.com/callstack/agent-device",
8
8
  "source": "github"
9
9
  },
10
- "version": "0.21.22",
10
+ "version": "0.21.24",
11
11
  "packages": [
12
12
  {
13
13
  "registryType": "npm",
14
14
  "identifier": "agent-device",
15
- "version": "0.21.22",
15
+ "version": "0.21.24",
16
16
  "transport": {
17
17
  "type": "stdio"
18
18
  },
@@ -1 +0,0 @@
1
- c271cf2448728e2b10c51e132ea9393d1fdc4696578febcd361f6a6470b74b89 agent-device-android-ime-helper-0.21.22.apk
@@ -1 +0,0 @@
1
- e39e73088e371a3cee63b403f12609eea53acd37c810b0a1241e9c5285ac2c07 agent-device-android-snapshot-helper-0.21.22.apk
@@ -1 +0,0 @@
1
- const e={support:`supported`},t={support:`unsupported`},n={lease:e,inventory:{support:`partial`,note:`Inventory exposes only the leased cloud device, not the provider catalog.`},install:{support:`partial`,note:`Requires provider-specific upload or a path visible to the remote Appium server.`},snapshot:{support:`partial`,note:`Uses Appium page source XML, not agent-device native snapshot backends.`},screenshot:e,tap:e,doubleTap:e,longPress:e,swipe:e,scroll:{support:`partial`,note:`Implemented as viewport-relative W3C pointer gestures.`},fill:e,type:e,keyboard:{support:`partial`,note:"Enter presses Android keycode 66 through `mobile: pressKey` and types a newline into the focused iOS field; dismiss uses the Appium hide-keyboard route, and Android status uses the Appium keyboard probe."},back:e,home:{support:`partial`,note:`Uses provider/Appium mobile pressButton support where available.`},orientation:{support:`partial`,note:`Uses the WebDriver rotation/orientation endpoints; four-way rotation collapses to portrait/landscape on drivers that only accept the two-way endpoint. Rotates the current display, so an activity that does not pin its orientation may need rotating again once it is foreground.`},appSwitcher:{support:`partial`,note:`Uses provider/Appium mobile pressButton support where available.`},tvRemote:t,"clipboard.read":{support:`partial`,note:`Uses provider/Appium clipboard extension support where available.`},"clipboard.write":{support:`partial`,note:`Uses provider/Appium clipboard extension support where available.`},settings:t,alert:t,pinch:t,rotateGesture:t,transformGesture:t,logs:t,record:t,artifacts:t,portReverse:t,nativeSnapshotBackend:{support:`unsupported`,note:`Cloud WebDriver cannot upload or run agent-device native runner/helper backends.`}};function r(e){return{provider:e.provider,platform:e.platform,snapshotBackend:e.platform===`ios`?`xctest`:`android`,snapshotSource:`appium-page-source`,operations:o(n,e.overrides)}}function i(e,t){return e.operations[t].support!==`unsupported`}function a(e,t){let n=e.operations[t],r=n.note?` ${n.note}`:``;return`${e.provider} WebDriver runtime does not support ${t}.${r}`}function o(e,t){let n={...e};for(let[r,i]of Object.entries(t??{}))n[r]=typeof i==`string`?{...e[r],support:i}:{...e[r],...i};return n}export{r as n,a as r,i as t};
@@ -1 +0,0 @@
1
- const e={control:{retryMaxRetries:3},command:{retryTapMaxAttempts:2,targetLookupTimeoutMs:17e3,optionalTargetLookupTimeoutMs:7e3,scrollUntilVisibleTimeoutMs:2e4,waitForAnimationToEndTimeoutMs:15e3,waitForAnimationToEndDifferencePercent:.005,longPressDurationMs:3e3,swipeDurationMs:400,repeatDelayMs:100,scrollUntilVisibleSpeed:40,scrollUntilVisiblePercentage:100,eraseTextMaxCharacters:50},observation:{pollIntervalMs:200,defaultSettleAttempts:10},targetSwipe:{nearEdgeFraction:.1,farEdgeFraction:.9},screenSwipe:{nearEdgeFraction:.1,farEdgeFraction:.9,centerFraction:.5,downStartFraction:.2,upStartFraction:{android:.5,ios:.9}},scrollUntilVisibleSwipe:{nearEdgeFraction:.1,farEdgeFraction:.9}};function t(e){return Math.trunc(1e3*(100-e)/100)+1}const n={assertVisibleTimeoutMs:e.command.targetLookupTimeoutMs,assertNotVisibleTimeoutMs:e.command.targetLookupTimeoutMs,extendedWaitUntilTimeoutMs:e.command.targetLookupTimeoutMs,runFlowConditionTimeoutMs:e.command.optionalTargetLookupTimeoutMs},r=e.observation.pollIntervalMs*e.observation.defaultSettleAttempts;export{t as i,e as n,r,n as t};
@@ -1 +0,0 @@
1
- import{P as e}from"./sdk-contracts.js";import{l as t}from"./exec.js";import{r as n,t as r}from"./output-path.js";import{l as i}from"./daemon-http.js";import"./command.js";import{i as a,n as o}from"./transport.js";import{createHash as s,randomUUID as c}from"node:crypto";import l from"node:fs";import u from"node:os";import d from"node:path";import{Transform as f,Writable as p}from"node:stream";import{pipeline as m}from"node:stream/promises";async function ee(e,t){let n=l.statSync(e),r=d.basename(e),i=n.isDirectory(),a=re(t)??ne(e,n),o=[];try{let t=i?await te(e,o):e,n=l.statSync(t);return{payloadPath:t,fileName:r,artifactType:i?`app-bundle`:`file`,platform:a,contentType:i?`application/gzip`:`application/octet-stream`,sha256:await ie(t),sizeBytes:n.size,cleanup:()=>h(o)}}catch(e){throw h(o),e}}async function te(e,n){let r=l.mkdtempSync(d.join(u.tmpdir(),`agent-device-upload-${c()}-`));n.push(r);let i=d.join(r,`${d.basename(e)}.tar.gz`);return await t(`tar`,[`czf`,i,`-C`,d.dirname(e),d.basename(e)],{env:{...process.env,COPYFILE_DISABLE:`1`}}),i}function ne(e,t){let n=e.toLowerCase();if(t.isDirectory()&&n.endsWith(`.app`)||n.endsWith(`.ipa`))return`ios`;if(n.endsWith(`.apk`)||n.endsWith(`.aab`))return`android`}function re(e){return e===`ios`||e===`android`?e:void 0}function h(e){for(let t of e)l.rmSync(t,{recursive:!0,force:!0})}async function ie(t){let n=s(`sha256`),r=new p({write(e,t,r){n.update(e),r()}});return await m(l.createReadStream(t),r).catch(t=>{throw new e(`COMMAND_FAILED`,`Failed to read local artifact`,{},t instanceof Error?t:void 0)}),n.digest(`hex`)}function g(e){let{stage:t,fileName:n,startOffset:r,totalBytes:i,onProgress:a}=e,o=r,s=y(i),c=Math.min(i,r+s);return new f({transform(e,r,l){o=Math.min(i,o+e.byteLength),o>=c&&(a?.({type:`progress`,stage:t,fileName:n,transferredBytes:o,totalBytes:i}),c=Math.min(i,o+s)),l(null,e)}})}function _(){if(!(process.stderr.isTTY!==!0||process.env.CI))return e=>{process.stderr.write(`${v(e)}\n`)}}function v(e){switch(e.type){case`start`:return`Uploading ${e.fileName} (${x(e.totalBytes)}) via ${b(e.stage)} upload`;case`resume`:return`Resuming ${e.fileName} at ${x(e.transferredBytes)} of ${x(e.totalBytes)}`;case`progress`:return`Uploaded ${x(e.transferredBytes)} of ${x(e.totalBytes)} (${ae(e.transferredBytes,e.totalBytes)})`;case`fallback`:return`Direct upload did not complete; retrying ${e.fileName} with ${b(e.to)} upload`}}function y(e){return Math.max(8388608,Math.ceil(e*.05))}function b(e){return e===`direct`?`direct`:`legacy`}function ae(e,t){return t<=0?`100%`:`${Math.min(100,Math.floor(e/t*100))}%`}function x(e){if(e<1024)return`${e} B`;let t=e/1024;if(t<1024)return`${t.toFixed(1)} KiB`;let n=t/1024;return n<1024?`${n.toFixed(1)} MiB`:`${(n/1024).toFixed(1)} GiB`}const S=3e5,C=`uploadStreamRetryable`;async function w(e){return await E({...e,url:e.url,redirectCount:0,startOffset:0})}function T(t){return t instanceof e&&t.details?.[C]===!0}async function E(t){let n=await o(t.url.protocol),r=l.statSync(t.payloadPath).size,i=se(t.headers,t.startOffset,r);return oe(t.progress,t.startOffset,r),await new Promise((o,s)=>{let c=!1,u=n.request({protocol:t.url.protocol,host:t.url.hostname,port:t.url.port,method:t.method,path:t.url.pathname+t.url.search,headers:i,...t.signal?{signal:t.signal}:{}},n=>{c=!0,a(n).then(i=>{clearTimeout(f);let a=n.statusCode??500,c=n.headers.location;if(c&&ce(a)){if(t.redirectCount>=5){s(new e(`COMMAND_FAILED`,`Artifact upload exceeded redirect limit`,{maxRedirects:5,url:t.url.toString()}));return}let n=new URL(c,t.url);E({...t,url:n,redirectCount:t.redirectCount+1}).then(o,s);return}let l=le(a)?O(n.headers,r):void 0;if(l!==void 0){if(l>=r){o({statusCode:200,statusMessage:`Upload already complete`,body:``});return}if(l<=t.startOffset){s(new e(`COMMAND_FAILED`,`Artifact upload resume did not advance`,{offset:l,previousOffset:t.startOffset,url:t.url.toString()}));return}E({...t,startOffset:l}).then(o,s);return}o({statusCode:a,statusMessage:n.statusMessage,body:i})}).catch(s)}),f=setTimeout(()=>{u.destroy(),s(new e(`COMMAND_FAILED`,t.timeoutMessage,{timeoutMs:S,...t.timeoutHint?{hint:t.timeoutHint}:{},...D(t)}))},S);u.on(`error`,n=>{if(!c){if(clearTimeout(f),t.signal?.aborted){s(t.signal.reason);return}s(new e(`COMMAND_FAILED`,t.errorMessage,{...t.errorHint?{hint:t.errorHint}:{},...D(t)},n))}}),u.on(`close`,()=>clearTimeout(f)),m(l.createReadStream(t.payloadPath,{start:t.startOffset}),g({stage:t.progress?.stage??`legacy`,fileName:t.progress?.fileName??d.basename(t.payloadPath),startOffset:t.startOffset,totalBytes:r,onProgress:t.progress?.onProgress}),u).catch(t=>{if(c)return;u.destroy();let n=t instanceof Error?t:Error(String(t));s(new e(`COMMAND_FAILED`,`Failed to read local artifact`,{},n))})})}function D(e){return e.retryable===!0?{[C]:!0}:{}}function oe(e,t,n){e?.onProgress?.({type:t>0?`resume`:`start`,stage:e.stage,fileName:e.fileName,transferredBytes:t,totalBytes:n})}function se(e,t,n){return t<=0?e:{...e,"content-length":Math.max(n-t,0),"content-range":`bytes ${t}-${n-1}/${n}`}}function ce(e){return[301,302,303,307,308].includes(e)}function le(e){return e===308}function O(e,t){let n=k(e[`x-upload-offset`]??e[`upload-offset`]);if(n!==void 0)return Math.min(n,t);let r=A(e.range)?.match(/^bytes=0-(\d+)$/);if(!r)return;let i=Number(r[1]);if(!(!Number.isSafeInteger(i)||i<0))return Math.min(i+1,t)}function k(e){let t=A(e);if(t===void 0)return;let n=Number(t);return Number.isSafeInteger(n)&&n>=0?n:void 0}function A(e){return Array.isArray(e)?e[0]:e}const j=3e4;async function M(e){let t=await ee(e.localPath,e.platform),n=e.baseUrl.endsWith(`/`)?e.baseUrl:`${e.baseUrl}/`,r=c();try{let i=await L({normalizedBase:n,token:e.token,artifact:t,uploadAttemptId:r,signal:e.signal});return i?.kind===`cache-hit`?i.uploadId:i?.kind===`direct-upload`?await N({normalizedBase:n,token:e.token,artifact:t,preflight:i,uploadAttemptId:r,onProgress:e.onProgress,signal:e.signal})||(e.onProgress?.({type:`fallback`,from:`direct`,to:`legacy`,fileName:t.fileName}),await I({normalizedBase:n,token:e.token,artifact:t,onProgress:e.onProgress,signal:e.signal})):await I({normalizedBase:n,token:e.token,artifact:t,onProgress:e.onProgress,signal:e.signal})}finally{t.cleanup()}}async function N(e){let t=async t=>(await V(e.artifact,t,e.onProgress,e.signal),await H({normalizedBase:e.normalizedBase,token:e.token,uploadId:t.uploadId,signal:e.signal}));try{return await t(e.preflight)}catch(n){if(e.signal?.aborted)throw n;return F(n)?await P(e,t):void 0}}async function P(e,t){let n=await L({normalizedBase:e.normalizedBase,token:e.token,artifact:e.artifact,uploadAttemptId:e.uploadAttemptId,signal:e.signal});if(n?.kind===`cache-hit`)return n.uploadId;if(n?.kind===`direct-upload`)try{return await t(n)}catch{return}}function F(t){return t instanceof e?T(t):!0}async function I(t){let{normalizedBase:n,token:r,artifact:a}=t,o=new URL(`upload`,n),s={"content-type":a.contentType,"x-artifact-type":a.artifactType,"x-artifact-filename":a.fileName,"x-artifact-hash":a.sha256,"x-artifact-hash-algorithm":`sha256`,"transfer-encoding":`chunked`};Object.assign(s,i(r));let c=await w({url:o,method:`POST`,headers:s,payloadPath:a.payloadPath,timeoutMessage:`Artifact upload timed out`,timeoutHint:`The upload to the remote daemon exceeded the 5-minute timeout.`,errorMessage:`Failed to upload artifact to remote daemon`,errorHint:`Verify the remote daemon is reachable and supports artifact uploads.`,signal:t.signal,progress:{stage:`legacy`,fileName:a.fileName,onProgress:t.onProgress}});try{let t=JSON.parse(c.body);if(!t.ok||!t.uploadId)throw new e(`COMMAND_FAILED`,`Upload failed: ${c.body}`);return t.uploadId}catch(t){throw t instanceof e?t:new e(`COMMAND_FAILED`,`Invalid upload response: ${c.body}`)}}async function L(e){let t=new URL(`upload/preflight`,e.normalizedBase),n={"content-type":`application/json`};Object.assign(n,i(e.token));let r=await fetch(t,{method:`POST`,headers:n,signal:R(e.signal,j),body:JSON.stringify({uploadAttemptId:e.uploadAttemptId,sha256:e.artifact.sha256,fileName:e.artifact.fileName,sizeBytes:e.artifact.sizeBytes,artifactType:e.artifact.artifactType,...e.artifact.platform?{platform:e.artifact.platform}:{},contentType:e.artifact.contentType})}).catch(t=>{if(e.signal?.aborted)throw t});if(r?.ok)return z(await r.json().catch(()=>void 0))}function R(e,t){let n=AbortSignal.timeout(t);return e?AbortSignal.any([e,n]):n}function z(e){if(!e||typeof e!=`object`)return;let t=e;if(t.ok!==!0||typeof t.uploadId!=`string`)return;if(t.cacheHit===!0)return{kind:`cache-hit`,uploadId:t.uploadId};let n=t.upload;if(!n||typeof n.url!=`string`)return;let r=n.headers??{};if(B(r))return{kind:`direct-upload`,uploadId:t.uploadId,url:n.url,headers:r}}function B(e){return!e||typeof e!=`object`||Array.isArray(e)?!1:Object.values(e).every(e=>typeof e==`string`)}async function V(t,n,r,i){let a=await w({url:new URL(n.url),method:`PUT`,headers:n.headers,payloadPath:t.payloadPath,timeoutMessage:`Direct artifact upload timed out`,timeoutHint:`The direct upload ticket did not accept the artifact within the timeout.`,errorMessage:`Failed to upload artifact with direct upload ticket`,retryable:!0,signal:i,progress:{stage:`direct`,fileName:t.fileName,onProgress:r}});if(a.statusCode<200||a.statusCode>=300)throw new e(`COMMAND_FAILED`,`Direct artifact upload failed`,{statusCode:a.statusCode,statusMessage:a.statusMessage})}async function H(t){let n=new URL(`upload/finalize`,t.normalizedBase),r={"content-type":`application/json`};Object.assign(r,i(t.token));let a=await fetch(n,{method:`POST`,headers:r,signal:R(t.signal,j),body:JSON.stringify({uploadId:t.uploadId})}).catch(n=>{throw t.signal?.aborted?n:new e(`COMMAND_FAILED`,`Failed to finalize direct artifact upload`,{},n)});if(!a.ok)throw new e(`COMMAND_FAILED`,`Direct artifact upload finalize failed`,{status:a.status,statusText:a.statusText});let o=await a.json().catch(()=>void 0);if(!o?.ok||!o.uploadId)throw new e(`COMMAND_FAILED`,`Invalid upload finalize response`);return o.uploadId}async function U(e,t,n){let r=[...e.positionals??[]],i=e.flags?{...e.flags}:void 0,a=e.meta?.installSource,o={},s,c=_();if(!we(t))return K({positionals:r,flags:i,installSource:a,uploadedArtifactId:s,clientArtifactPaths:o});W(e),i=G(e,r,i,o);let l=await pe(e,t,c,n);return l&&(a=l.installSource,s=l.uploadedArtifactId??s),e.command!==`install`&&e.command!==`reinstall`||(s=await ue(e,t,r,c,n)??s),K({positionals:r,flags:i,installSource:a,uploadedArtifactId:s,clientArtifactPaths:o})}function W(t){if(t.flags?.saveScript!==void 0)throw new e(`INVALID_ARGS`,`--save-script is not supported against a remote daemon: the healed script would be written on the daemon host, not on this machine.`,{hint:`Run the script against a local daemon to capture a healed .ad, or re-run without --save-script.`,command:t.command})}async function ue(e,t,n,r,i){let a=n.length===1?0:1,o=n[a];if(o===void 0)return;if(o.startsWith(`remote:`)){n[a]=o.slice(7);return}let s=fe(o,e.meta?.cwd);if(s)return await M({localPath:s,baseUrl:t.baseUrl,token:t.token,platform:e.flags?.platform,onProgress:r,signal:i})}function G(e,t,n,r){let i=me(e,t);if(!i)return n;i.positionalIndex!==void 0&&i.positionalPath!==void 0&&(t[i.positionalIndex]=i.positionalPath);let a=de(n,i.flagKey??`out`,i.flagPath);return r[i.field]=i.localPath,a}function de(e,t,n){return n===void 0?e:{...e??{},[t]:n}}function fe(e,t){let n=d.isAbsolute(e)?e:d.resolve(t??process.cwd(),e);return l.existsSync(n)?n:void 0}function K(e){return{positionals:e.positionals,flags:e.flags,installSource:e.installSource,uploadedArtifactId:e.uploadedArtifactId,...Object.keys(e.clientArtifactPaths).length>0?{clientArtifactPaths:e.clientArtifactPaths}:{}}}async function pe(e,t,n,r){let i=e.meta?.installSource;if(e.command!==`install_source`||!i||i.kind!==`path`)return null;let a=i.path.trim();if(!a)return{installSource:i};if(a.startsWith(`remote:`))return{installSource:{...i,path:a.slice(7)}};let o=d.isAbsolute(a)?a:d.resolve(e.meta?.cwd??process.cwd(),a);if(!l.existsSync(o))return{installSource:{...i,path:o}};let s=await M({localPath:o,baseUrl:t.baseUrl,token:t.token,platform:e.flags?.platform,onProgress:n,signal:r});return{installSource:{...i,path:o},uploadedArtifactId:s}}function me(e,t){if(e.command===`screenshot`){let n=J(e,`path`,`.png`);return t[0]?{field:`path`,localPath:n,positionalIndex:0,positionalPath:Q(`screenshot`,`.png`)}:{field:`path`,localPath:n,positionalIndex:0,flagPath:Q(`screenshot`,`.png`)}}if(e.command===`record`&&(t[0]??``).toLowerCase()===`start`){if(!ge(e)&&e.flags?.platform===void 0)return null;let t=q(e),n=_e(J(e,`outPath`,t,1),e);return{field:`outPath`,localPath:n,positionalIndex:1,positionalPath:Q(`recording`,d.extname(n)||t)}}return e.command===`test`?{field:`artifactsDir`,localPath:he(e),flagKey:`artifactsDir`,flagPath:ve(`test-artifacts`)}:null}function he(e){let t=e.flags?.artifactsDir;return Y(X(t)?t:`.agent-device/test-artifacts`,e.meta?.cwd)}function q(e){return n(e.flags?.platform)}function ge(e){return X(e.positionals?.[1])||X(e.flags?.out)}function _e(e,t){return t.flags?.platform===`web`?r(e,q(t)):e}function J(e,t,n,r=0){let i=e.positionals?.[r]??e.flags?.out,a=`${t===`path`?`screenshot`:`recording`}-${Date.now()}${n}`;return Y(X(i)?i:a,e.meta?.cwd)}function Y(e,t){return d.isAbsolute(e)?e:d.resolve(t??process.cwd(),e)}function X(e){return typeof e==`string`&&e.trim().length>0}const Z=`/tmp`;function Q(e,t){let n=t.startsWith(`.`)?t:`.${t}`;return d.posix.join(Z,`${$(e)}${n}`)}function ve(e){return d.posix.join(Z,$(e))}function ye(e,t,n){let r=d.posix.basename(e,n);return e===d.posix.join(Z,`${r}${n}`)&&r.startsWith(`agent-device-${t}-`)&&/^\d+-[a-z0-9]+$/.test(r.slice(`agent-device-${t}-`.length))}function $(e){return`agent-device-${e}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`}async function be(e,t,n){let r=Array.isArray(n.data?.artifacts)?n.data.artifacts:[];if(r.length===0||!e.baseUrl)return n;let i=n.data?{...n.data}:{},a=[];for(let n of r){if(!n||typeof n!=`object`||typeof n.artifactId!=`string`){a.push(n);continue}let r=xe(n,t),o=await Se({baseUrl:e.baseUrl,token:e.token,artifactId:n.artifactId,destinationPath:r,requestScope:t.meta,isDirectory:n.artifactType===`test-artifacts`});i[n.field]=o,a.push({...n,localPath:o})}return i.artifacts=a,{ok:!0,data:i}}function xe(e,t){if(e.localPath&&e.localPath.trim().length>0)return e.localPath;let n=t.meta?.clientArtifactPaths?.[e.field];if(n&&n.trim().length>0)return n;let r=e.fileName?.trim()||`${e.field}-${Date.now()}`;return d.resolve(t.meta?.cwd??process.cwd(),r)}async function Se(e){let{downloadRemoteArtifactFromUrl:t}=await import(`./artifact-download.js`);return await t({artifactUrl:new URL(Ce(e.baseUrl,e.artifactId)),token:e.token,artifactId:e.artifactId,destinationPath:e.destinationPath,requestScope:e.requestScope,...e.timeoutMs===void 0?{}:{timeoutMs:e.timeoutMs},...e.isDirectory===void 0?{}:{isDirectory:e.isDirectory}})}function Ce(e,t){let n=e.endsWith(`/`)?e:`${e}/`;return new URL(`artifacts/${encodeURIComponent(t)}`,n).toString()}function we(e){return typeof e.baseUrl==`string`&&e.baseUrl.length>0}export{be as n,U as r,ye as t};
@@ -1 +0,0 @@
1
- import{F as e,I as t,P as n,l as r,s as i}from"./sdk-contracts.js";import"./capture.js";import{i as a,m as o}from"./sdk-batch-runner.js";import{p as s}from"./android-input-ownership.js";import{r as c}from"./diagnostics.js";import"./diagnostics2.js";import{d as l,l as u,m as d,p as f,w as p}from"./sdk-device.js";import{f as m,n as h,u as ee}from"./lease-scope.js";import{Ar as te,Dr as ne,Lr as re,Yr as g,Yt as ie,en as _,o as ae,or as oe,tn as se}from"./sdk-batch.js";import{a as ce}from"./script.js";import"./dispatch-resolve.js";import{i as le}from"./back-mode.js";import{a as ue}from"./session.js";import{b as de,m as fe}from"./owner-identity.js";import{l as pe}from"./exec.js";import{t as me}from"./timeouts.js";import"./command.js";import{t as he}from"./daemon-artifacts.js";import"./process.js";import{n as ge}from"./retry.js";import{n as v}from"./runtime-transport-hints.js";import{s as _e}from"./device-shell.js";import{_ as y,a as ve,c as ye,d as be,h as xe,i as Se,n as b,o as Ce,p as we,r as Te,s as x,t as Ee,u as S,v as De,y as Oe}from"./lease-registry-scope.js";import{c as ke}from"./request-cancel.js";import{t as Ae}from"./request.js";import{n as je,t as Me,u as Ne}from"./provider-session-ownership.js";import{a as Pe,i as Fe,n as C,r as Ie}from"./human-control-contract.js";import{_ as Le,d as Re,f as ze,u as Be}from"./screenshot-runtime.js";import{r as Ve}from"./daemon-policy-file.js";import{r as He}from"./application-lifecycle-runtime.js";import{a as Ue,c as w,l as We,n as Ge,o as Ke,r as qe,t as Je}from"./device-claim-inspection.js";import{c as Ye,f as Xe,i as Ze,p as T}from"./perf-runtime-plan.js";import{n as Qe,r as E,t as $e}from"./lease-context.js";import{n as et}from"./screen-recording-admission-ledger.js";import{a as tt,c as nt,d as D,l as rt,n as it,o as at,r as ot,u as O}from"./src8.js";import{n as st,t as ct}from"./compatibility-policy.js";import{i as lt,o as ut,s as dt}from"./durable-capture-resource.js";import{o as ft}from"./screen-recording-resource-recovery.js";import pt,{createHash as mt}from"node:crypto";import"node:fs";import k from"node:os";import A from"node:path";import j from"node:fs/promises";function ht(e,t){return gt(e,t)?t:`${e}:${t}`}function gt(e,t){return t.startsWith(`${e}:`)}function _t(e,t){return!e.partitioned||gt(e.tenant,t)}const vt=/^[A-Za-z0-9_-]+(?:\.[A-Za-z0-9_-]+)+$/,yt=/^[1-9][0-9]{0,9}$/;function M(e){let t=e?.trim()??``,r=t.lastIndexOf(`@`),i=r<0?t:t.slice(0,r),a=r<0?void 0:t.slice(r+1);if(!vt.test(i)||a!==void 0&&!yt.test(a))throw new n(`INVALID_ARGS`,`A macos-app lease device key must be <bundleId> or <bundleId>@<pid>.`,{deviceKey:t});return a===void 0?{bundleId:i}:{bundleId:i,pid:Number(a)}}const bt=new Set([`open`,`batch`,`lease_heartbeat`,`lease_release`]),xt=[`out`,`saveScript`,`sessionSaveScript`,`baseline`,`launchConsole`,`launchArgs`,`launchUrl`,`bundleUrl`,`artifactsDir`,`stepsFile`,`searchPath`,`retainPaths`,`installSource`,`metroProjectRoot`,`metroRuntimeFile`,`iosXctestrunFile`,`iosXctestDerivedDataPath`,`iosXctestEnvDir`],St=[`device`,`udid`,`serial`,`target`,`iosSimulatorDeviceSet`,`androidDeviceAllowlist`];function N(e,t,r={}){return new n(`UNAUTHORIZED`,t,{...r,reason:`MACOS_APP_LEASE_DENIED`,rule:e,retriable:!1,hint:`This lease is limited to one macOS app; retrying will not help. Use an allowed command on the leased app.`})}function Ct(e,t,n){if(e.backend!==`macos-app`)return;let r=M(e.deviceKey);if(Tt(r,t.command,t.positionals??[],wt(t.runtime,{...t.input,...t.flags})),(t.command===`open`||t.command===`batch`)&&t.flags?.platform!==`macos`)throw N(`device`,`A macos-app lease needs platform macos on ${t.command}.`);if(t.command===`batch`)for(let e of t.flags?.batchSteps??[]){let t=Array.isArray(e.positionals)?e.positionals.map(String):[];Tt(r,ae(e.command),t,wt(e.runtime,{...e.input,...e.flags}))}if(n)Mt(r,n);else if(!bt.has(t.command))throw N(`session`,`A macos-app lease runs ${t.command} only in a session of ${r.bundleId}; open it first.`,{command:t.command,bundleId:r.bundleId})}function wt(e,t){return{...t,...e?.launchUrl?{launchUrl:e.launchUrl}:{},...e?.bundleUrl?{bundleUrl:e.bundleUrl}:{}}}function Tt(e,t,n,r){if(!Be(t))throw N(`command`,`A macos-app lease does not allow ${t}.`,{command:t});if(kt(r),Ot(r),t===`screenshot`?Et(n,r):Dt(r),t===`open`&&At(e,n),t===`close`&&n.length>0&&n[0]!==e.bundleId)throw N(`app`,`A macos-app lease only closes ${e.bundleId}.`,{bundleId:e.bundleId})}function Et(e,t){if(t.screenshotFullscreen===!0)throw N(`capture`,`A macos-app lease captures only the app window.`);let{out:n,...r}=t;Dt(r);for(let t of[e[0],n])if(!(t===void 0||typeof t==`string`&&he(t,`screenshot`,`.png`)))throw N(`host-path`,`A macos-app lease does not write files on the host.`)}function Dt(e){let t=xt.find(t=>e[t]!==void 0&&e[t]!==!1);if(t)throw N(`host-path`,`A macos-app lease does not accept ${t}, which names a host path or launch.`,{field:t})}function Ot(e){let t=St.find(t=>e[t]!==void 0&&e[t]!==``);if(t)throw N(`device`,`A macos-app lease does not accept the ${t} device selector.`,{field:t})}function kt(e){if(e.surface!==void 0&&e.surface!==`app`)throw N(`surface`,`A macos-app lease is limited to the app surface, not ${String(e.surface)}.`,{surface:e.surface});if(e.platform!==void 0&&e.platform!==`macos`)throw N(`app`,`A macos-app lease only drives a macOS app.`,{platform:e.platform})}function At(e,t){if(t.length!==1||t[0]!==e.bundleId)throw N(`app`,`A macos-app lease only opens ${e.bundleId}.`,{bundleId:e.bundleId});jt()}function jt(){if(ue(de)!==`native`)throw N(`backend`,`A macos-app lease needs the native macOS app backend (AGENT_DEVICE_MACOS_APP_BACKEND=native).`)}function Mt(e,t){if(!d(t.device)||(t.surface??`app`)!==`app`||t.appBundleId!==e.bundleId)throw N(`app`,`This session is not the leased app ${e.bundleId}.`,{bundleId:e.bundleId})}const Nt=/bundleID="([^"]+)"/,Pt=async e=>{if(!fe(e))return;let t=await pe(`/usr/bin/lsappinfo`,[`info`,`-only`,`bundleid`,String(e)],{allowFailure:!0,timeoutMs:5e3});return Nt.exec(t.stdout)?.[1]};async function Ft(e,t=Pt){if(e.backend!==`macos-app`)return;let n=M(e.deviceKey);if(n.pid!==void 0&&await t(n.pid)!==n.bundleId)throw N(`process`,`The leased app process ${n.bundleId}@${n.pid} is no longer running.`,{bundleId:n.bundleId,pid:n.pid})}const It=[`sessionStateDir`,`runnerLogPath`,`requestLogPath`,`eventLogPath`,`device`,`id`,`kind`,`serial`,`device_udid`,`ios_simulator_device_set`],Lt=/(?<![\p{L}\p{N}_./])\/(?:Users|home|private|var|tmp|Volumes|Library|Applications|opt|System|usr|etc|Network|cores)(?:\/[\p{L}\p{N}_.@%+~-]+)*\/?/gu;function Rt(){return{hostName:k.hostname(),homeDirectory:k.homedir()}}function zt(e,t,n=Rt()){return t.ok?{ok:!0,data:Bt(e,t.data,n)}:{ok:!1,error:Vt(t.error,n)}}function Bt(e,t,n){if(!t)return t;let{fallbackScreenshotPath:r,...i}=t;if(e!==`open`)return i;for(let e of It)delete i[e];let{snapshot:a,initialSnapshotError:o,warnings:s,...c}=i;return{...c,...a===void 0?{}:{snapshot:Bt(`snapshot`,a,n)},...o===void 0?{}:{initialSnapshotError:Vt(o,n)},...s===void 0?{}:{warnings:P(s,n)}}}function Vt(e,t){let{logPath:n,diagnosticsRecord:r,...i}=e;return P(i,t)}function P(e,t){return typeof e==`string`?Ht(e,t):Array.isArray(e)?e.map(e=>P(e,t)):typeof e!=`object`||!e?e:Object.fromEntries(Object.entries(e).map(([e,n])=>[e,P(n,t)]))}function Ht(e,t){let n=e;if(t.homeDirectory.length>1){let e=t.homeDirectory.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`);n=n.replaceAll(RegExp(`${e}[\\w.@%+~/-]*`,`g`),`<host-path>`)}for(let e of new Set([t.hostName,t.hostName.split(`.`)[0]]))e.length>=4&&(n=n.replaceAll(e,`<host>`));return n.replace(Lt,`<host-path>`)}function Ut(e,t){if(!(t===void 0||!e.hasHeldMacOsAppLease(t)))throw N(`diagnostics`,`A macos-app lease does not serve request diagnostics.`)}function Wt(e,t){if(Gt(e,t.command,t.flags??{}),t.command===`batch`)for(let n of t.flags?.batchSteps??[])Gt(e,ae(n.command),{...n.input,...n.flags})}function Gt(e,t,n){if(Zt(e,t),t===`close`&&n.shutdown===!0&&Jt(e,`device-shutdown`),e.deviceIds)for(let t of[n.udid,n.serial]){let n=typeof t==`string`?t.trim():``;if(!(!n||e.deviceIds.has(n)))throw F(e,`device`,`Device ${n} is outside this daemon's policy.`,{deviceId:n})}}function Kt(e,t){return!e.deviceIds||e.deviceIds.has(t.id)}function qt(e,t){if(!Kt(e,t))throw F(e,`device`,`Device ${t.id} is outside this daemon's policy.`,{deviceId:t.id})}function Jt(e,t){if(e.deniedCapabilities.has(t))throw F(e,`capability`,`This daemon's policy denies ${t}.`,{capability:t})}function Yt(e,t){let n=e.requiredLeaseBackend;if(!(!n||t?.backend===n))throw F(e,`lease`,`This daemon's policy requires a ${n} lease.`,{leaseBackend:n})}function Xt(e,t){if(!t.deviceIds)return e;let n=e=>e.filter(e=>Kt(t,e)),r=Object.freeze({discover:async(t,r)=>n(await e.localOnly.discover(t,r))}),i=async(t,i)=>{let a=await e.providerFirst.discoverWithSource(t,i),o=n(a.devices);return o.length>0||a.source===`local`?{...a,devices:o}:{devices:await r.discover(t,i),source:`local`}},a=Object.freeze({discover:async(e,t)=>(await i(e,t)).devices,discoverWithSource:i});return Object.freeze({...e,localOnly:r,providerFirst:a})}function Zt(e,t){let n=e.commands;if(!n)return;let r=Ve(t);if(r===void 0)return;let i=n.names.has(r);if(!(n.mode===`allow`?i:!i))throw F(e,`command`,`This daemon's policy denies the ${r} command.`,{command:r})}function F(e,t,r,i){return new n(`UNAUTHORIZED`,r,{...i,reason:`DAEMON_POLICY_DENIED`,rule:t,policyDigest:e.digest,retriable:!1,hint:`The daemon operator's policy denies this request; retrying will not help. Use an allowed command and device, or ask the operator to change the policy.`})}var Qt=class{active=new Map;waiters=new Map;async run(e,t){this.active.set(e,(this.active.get(e)??0)+1);try{return await t()}finally{let t=(this.active.get(e)??1)-1;if(t>0)this.active.set(e,t);else{this.active.delete(e);let t=this.waiters.get(e);this.waiters.delete(e);for(let e of t??[])e()}}}async wait(e,t){if(t?.throwIfAborted(),!this.active.has(e))return;let n=this.waiters.get(e)??new Set,r=()=>{},i=()=>{};try{await new Promise((a,o)=>{r=a,i=()=>o(t?.reason),n.add(r),this.waiters.set(e,n),t?.addEventListener(`abort`,i,{once:!0})})}finally{t?.removeEventListener(`abort`,i),n.delete(r),n.size===0&&this.waiters.get(e)===n&&this.waiters.delete(e)}}},$t=class{entriesByLeaseId=new Map;retain(e,t){let n={wanted:t,released:!1},r=this.entriesByLeaseId.get(e)??new Set;return r.add(n),this.entriesByLeaseId.set(e,r),{leaseId:e,release:()=>this.releasePass(e,r,n)}}forget(e){let t=this.entriesByLeaseId.get(e);if(t){for(let e of t)e.released=!0;this.entriesByLeaseId.delete(e)}}isDeferred(e){let t=this.entriesByLeaseId.get(e);if(!t)return!1;for(let e of t)e.wanted()||t.delete(e);return t.size>0||(this.entriesByLeaseId.delete(e),!1)}releasePass(e,t,n){return!n.released&&(n.released=!0,t.delete(n),t.size===0&&this.entriesByLeaseId.delete(e),n.wanted())}},en=class{holdsByDevice=new Map;mutations=new Qt;inFlightWork=new $t;leases=new Map;runBindings=new Map;deviceBindings=new Map;hostTtlMsByLeaseId=new Map;macOsAppTenantIds=new Set;maxActiveSimulatorLeases;resolveLeaseTtlMs;now;onLeaseExpired;providerSessionOwnership;constructor(e={}){this.maxActiveSimulatorLeases=Number.isInteger(e.maxActiveSimulatorLeases)?Math.max(0,Number(e.maxActiveSimulatorLeases)):0,this.resolveLeaseTtlMs=Se(e),this.now=e.now??(()=>Date.now()),this.onLeaseExpired=e.onLeaseExpired,this.providerSessionOwnership=new Me({now:this.now,retentionMs:e.providerSessionRetentionMs})}allocateLease(e){let t=be(e);this.cleanupExpiredLeases();let n=this.resolveLeaseTtlMs(t.ttlMs);this.assertHumanControlAdmission(t);let r=this.refreshExistingRunBinding(t,n);if(r)return r;this.assertDeviceAvailable(t),this.enforceCapacity(t.backend);let i=Te(t,n,this.now());return this.leases.set(i.leaseId,i),this.bindLease(i),{...i}}putHostLease(e,t){let r=y(e),i=be(t);this.cleanupExpiredLeases();let a=this.resolveLeaseTtlMs(i.ttlMs),o=this.leases.get(r);if(o){if(!Ce(o,i))throw new n(`INVALID_ARGS`,`Lease id already names a lease with another scope.`,{reason:`LEASE_SCOPE_MISMATCH`});return this.hostTtlMsByLeaseId.set(r,a),this.refreshLease(o,a)}if(this.assertHumanControlAdmission(i),this.assertDeviceAvailable(i),i.backend===`macos-app`&&this.macOsAppTenantIds.add(i.tenantId),this.runBindings.has(S(i)))throw new n(`DEVICE_IN_USE`,`This tenant run already holds a lease for the device.`,{reason:`DEVICE_LEASE_BUSY`});this.enforceCapacity(i.backend);let s={...Te(i,a,this.now()),leaseId:r};return this.leases.set(s.leaseId,s),this.hostTtlMsByLeaseId.set(r,a),this.bindLease(s),{...s}}refreshExistingRunBinding(e,t){let n=S(e),r=this.runBindings.get(n);if(!r)return;let i=this.leases.get(r);if(!i){this.runBindings.delete(n);return}if(i.clientId===e.clientId)return this.refreshLease(e.retainOnClose?{...i,retainOnClose:!0}:i,t);if(i.deviceKey)throw ve(i);return b(i,e),this.refreshLease(i,t)}heartbeatLease(e){let t=y(e.leaseId);this.cleanupExpiredLeases();let n=this.getActiveLease(t);Ee(n,e),b(n,e);let r=e.ttlMs===void 0?ye(n):this.resolveLeaseTtlMs(e.ttlMs),i=this.hostTtlMsByLeaseId.get(t);return this.refreshLease(n,i===void 0?r:Math.min(r,i))}retainLeaseWork(e,t){let n=this.inFlightWork.retain(e.leaseId,t);return{leaseId:n.leaseId,release:()=>{let t=n.release();return t&&this.refreshProtectedLease(e.leaseId,this.now()),t}}}releaseLease(e){let t=this.getLease(e);return t?(this.leases.delete(t.leaseId),this.unbindLease(t),this.inFlightWork.forget(t.leaseId),{released:!0,lease:t}):{released:!1}}getLease(e){let t=y(e.leaseId);this.cleanupExpiredLeases();let n=this.leases.get(t);if(n)return Ee(n,e),b(n,e),{...n}}assertLeaseAdmission(e){let t=we(e);this.cleanupExpiredLeases(),b(this.getActiveLease(t.leaseId),t)}hasHeldMacOsAppLease(e){return this.macOsAppTenantIds.has(e)}findActiveLeaseBackend(e){let t=xe(e);if(t)return this.cleanupExpiredLeases(),this.leases.get(t)?.backend}hasRetainedLeases(){let e=this.now();return this.listActiveLeases().some(t=>t.retainOnClose===!0&&t.expiresAt>e)}listActiveLeases(){return this.cleanupExpiredLeases(),Array.from(this.leases.values()).map(e=>({...e}))}recordProviderSession(e,t){this.cleanupExpiredLeases();let n=e.expiresAt<=this.now()?e.expiresAt:void 0;this.providerSessionOwnership.record(e,t),this.leases.has(e.leaseId)||this.providerSessionOwnership.markLeaseReleased(e,n)}resolveProviderSession(e){return this.cleanupExpiredLeases(),this.providerSessionOwnership.resolve(e)}listHumanControlHolds(e){this.cleanupExpiredLeases();let t=e.kind===`lease`?x(this.requireHumanControlLease(e.leaseId)):void 0;return[...this.holdsByDevice.entries()].filter(([e])=>t===void 0||t===e).flatMap(([,e])=>[...e.values()].map(({hold:e})=>C(e))).sort((e,t)=>e.id.localeCompare(t.id))}async putHumanControlHold(e,t,r,i){i?.throwIfAborted();let a=Fe(t),o=Pe(r);this.cleanupExpiredLeases();let s=this.resolveHumanControlScope(e,o),c=x(s),l=this.findHumanControlHold(a);if(l&&(this.assertHoldAuthority(e,l),x(l.hold.scope)!==c))throw new n(`INVALID_ARGS`,`Release a hold before changing its device scope.`);let u=this.now(),d={...e.kind===`lease`?{ownerLeaseId:e.leaseId}:{},hold:{id:a,scope:s,state:`activating`,...o.reason?{reason:o.reason}:{},createdAt:l?.hold.createdAt??u,updatedAt:u}},f=this.holdsByDevice.get(c)??new Map;return this.holdsByDevice.set(c,f),f.set(a,d),await this.activateHumanControlHold(c,d,o.ttlMs,i)}async activateHumanControlHold(e,t,r,i){let a=this.holdsByDevice.get(e),{id:o}=t.hold;try{if(await this.mutations.wait(e,i),i?.throwIfAborted(),a.get(o)!==t)throw new n(`COMMAND_FAILED`,`Human-control hold changed before activation completed.`,{holdId:o});let s=this.now();return t.hold={...t.hold,state:`active`,updatedAt:s,...r===void 0?{}:{expiresAt:s+r}},this.refreshHeldLease(e,s),C(t.hold)}catch(n){throw a.get(o)===t&&this.deleteHumanControlHold(e,o),n}}removeHumanControlHold(e,t){let n=Fe(t);this.cleanupExpiredLeases();let r=this.findHumanControlHold(n);if(!r)return;this.assertHoldAuthority(e,r);let i=x(r.hold.scope);return this.deleteHumanControlHold(i,n),C(r.hold)}deleteHumanControlHold(e,t){let n=this.holdsByDevice.get(e);n.delete(t),n.size===0&&(this.holdsByDevice.delete(e),this.refreshHeldLease(e,this.now()))}assertHumanControlAdmission(e){this.expireHumanControlHolds();let t=x(e),n=t===void 0?void 0:this.holdsByDevice.get(t)?.values().next().value;if(n)throw Ie(n.hold)}async runDeviceMutation(e,t){if(!e)return await t();this.cleanupExpiredLeases();let n=this.getActiveLease(e.leaseId);this.assertHumanControlAdmission(n);let r=x(n);return r===void 0?await t():await this.mutations.run(r,t)}requireHumanControlLease(e){let t=this.getActiveLease(e);if(!t.deviceKey)throw new n(`UNSUPPORTED_OPERATION`,`Human control requires a device-scoped remote lease.`);return{...t,deviceKey:t.deviceKey}}resolveHumanControlScope(e,t){if(e.kind===`host`){if(!t.scope)throw new n(`INVALID_ARGS`,`Host human control requires a lease device scope.`);return t.scope}if(t.scope)throw new n(`INVALID_ARGS`,`Lease-owner human control uses the admitted lease device; do not supply scope.`);let r=this.requireHumanControlLease(e.leaseId);return{backend:r.backend,leaseProvider:r.leaseProvider,deviceKey:r.deviceKey}}assertHoldAuthority(e,t){if(e.kind===`host`)return;let r=this.requireHumanControlLease(e.leaseId);if(t.ownerLeaseId!==r.leaseId||x(r)!==x(t.hold.scope))throw new n(`UNAUTHORIZED`,`Human-control hold does not belong to the admitted lease.`,{reason:`LEASE_SCOPE_MISMATCH`})}findHumanControlHold(e){for(let t of this.holdsByDevice.values()){let n=t.get(e);if(n)return n}}hasHumanControl(e){let t=x(e);return t!==void 0&&this.holdsByDevice.has(t)}isLeaseProtected(e,t){return e.expiresAt>t||this.hasHumanControl(e)||this.inFlightWork.isDeferred(e.leaseId)}expireHumanControlHolds(){let e=this.now();for(let[t,n]of this.holdsByDevice){let r=0;for(let[t,{hold:i}]of n)i.expiresAt===void 0||i.expiresAt>e||(r=Math.max(r,i.expiresAt),n.delete(t));n.size===0&&(this.holdsByDevice.delete(t),this.refreshHeldLease(t,r))}}refreshHeldLease(e,t){this.refreshProtectedLease(this.deviceBindings.get(e),t)}refreshProtectedLease(e,t){let n=e?this.leases.get(e):void 0;n&&this.refreshLease(n,ye(n),Math.max(t,n.heartbeatAt))}consumeExpiredLeases(){this.expireHumanControlHolds();let e=this.now(),t=[];for(let n of this.leases.values()){if(this.isLeaseProtected(n,e))continue;this.leases.delete(n.leaseId),this.unbindLease(n,n.expiresAt);let r={...n};t.push(r),this.onLeaseExpired?.(r)}return t}consumeExpiredLease(e){this.expireHumanControlHolds();let t=xe(e);if(!t)return;let n=this.leases.get(t);if(!n||this.isLeaseProtected(n,this.now()))return;this.leases.delete(n.leaseId),this.unbindLease(n,n.expiresAt);let r={...n};return this.onLeaseExpired?.(r),r}cleanupExpiredLeases(){this.consumeExpiredLeases()}enforceCapacity(e){if(e!==`ios-simulator`||this.maxActiveSimulatorLeases<=0)return;let t=Array.from(this.leases.values()).filter(e=>e.backend===`ios-simulator`).length;if(!(t<this.maxActiveSimulatorLeases))throw new n(`DEVICE_IN_USE`,`No simulator lease capacity available`,{reason:`LEASE_CAPACITY_EXCEEDED`,activeLeases:t,maxActiveLeases:this.maxActiveSimulatorLeases,backend:e,hint:`Retry after releasing another simulator lease.`})}getActiveLease(e){let t=this.leases.get(e);if(t)return t;throw new n(`UNAUTHORIZED`,`Lease is not active`,{reason:`LEASE_NOT_FOUND`})}refreshLease(e,t,n=this.now()){let r={...e,heartbeatAt:n,expiresAt:n+t};return this.leases.set(r.leaseId,r),this.bindLease(r),{...r}}bindLease(e){this.runBindings.set(S(e),e.leaseId);let t=x(e);t&&this.deviceBindings.set(t,e.leaseId)}unbindLease(e,t=this.now()){this.hostTtlMsByLeaseId.delete(e.leaseId),this.runBindings.delete(S(e));let n=x(e);n&&this.deviceBindings.delete(n),this.providerSessionOwnership.markLeaseReleased(e,t)}assertDeviceAvailable(e){let t=x({backend:e.backend,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey});if(!t)return;let n=this.deviceBindings.get(t);if(!n)return;let r=this.leases.get(n);if(!r){this.deviceBindings.delete(t);return}throw ve(r)}};function tn(e){let t=Oe(e.meta?.sessionIsolation??e.flags?.sessionIsolation),r=e.meta?.tenantId??e.flags?.tenant,i=De(r);if(r&&!i)throw new n(`INVALID_ARGS`,`Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.`);if(t!==`tenant`)return e;if(!i)throw new n(`INVALID_ARGS`,`session isolation mode tenant requires --tenant (or meta.tenantId).`);let a=e.session||`default`;return gt(i,a)?{...e,meta:{...e.meta,tenantId:i,sessionIsolation:t}}:{...e,session:ht(i,a),meta:{...e.meta,tenantId:i,sessionIsolation:t}}}function nn(e,t,r,i={}){if(an(e,t,r,i.daemonPolicy))return;let a=Qe(e);ln(e,a);let o=r?.lease;if(i.daemonPolicy?.requiredLeaseBackend){let n=E(e,r).leaseId?rn(e,t,r):void 0;return Yt(i.daemonPolicy,n),n}if(!(r===void 0&&!a.leaseId&&sn(e,i.providerAppCatalog))){if(e.command===`human_control`&&!o&&!a.leaseId)throw new n(`UNSUPPORTED_OPERATION`,`Takeover requires an active remote device lease. Local takeover is not supported.`);if(!(e.command!==`human_control`&&!o&&e.meta?.sessionIsolation!==`tenant`&&(!a.leaseId||!a.tenantId&&!a.runId)))return rn(e,t,r)}}function rn(e,t,n){un(Qe(e),n?.lease);let r=E(e,n);t.assertLeaseAdmission(ee(r));let i=t.heartbeatLease(ee(r));return Ct(i,e,n),Re(e)&&t.assertHumanControlAdmission(i),i}function an(e,t,n,r){return ze(e.command)?Be(e.command)?!0:!on(e,t,n,r):!1}function on(e,t,n,r){if(r?.requiredLeaseBackend)return!0;let i=E(e,n);return i.leaseBackend===`macos-app`||i.leaseId!==void 0&&t.findActiveLeaseBackend(i.leaseId)===`macos-app`}function sn(e,t){let n=Le(e);return n?.kind===`unconditional`||n?.kind===`provider-app-catalog`&&t?.supports(n.provider)===!0}function cn(e){ze(e.command)||ln(e,Qe(e))}function ln(e,t){if(e.command!==`open`)return;let r=h(t);if(r.length!==0)throw new n(`INVALID_ARGS`,`Proxy open requires leaseId, tenantId, runId, clientId, and deviceKey lease metadata.`,{missing:r})}function un(e,t){t&&(I(`leaseId`,e.leaseId,t.leaseId),I(`tenantId`,e.tenantId,t.tenantId),I(`runId`,e.runId,t.runId),I(`leaseProvider`,e.leaseProvider,t.leaseProvider),I(`clientId`,e.clientId,t.clientId),I(`deviceKey`,e.deviceKey,t.deviceKey))}function I(e,t,r){if(!(!t||!r||t===r))throw new n(`UNAUTHORIZED`,`Lease does not match session owner (${e})`,{reason:`LEASE_SESSION_MISMATCH`,field:e})}async function dn(e,t){if(!t.leaseProvider||!e)return!1;try{return await e(t),c({level:`info`,phase:`provider_lease_expired_released`,data:{leaseId:t.leaseId,provider:t.leaseProvider}}),!0}catch(e){return c({level:`error`,phase:`provider_lease_expiry_release_failed`,data:{leaseId:t.leaseId,provider:t.leaseProvider,error:e instanceof Error?e.message:String(e)}}),!1}}function fn(e){cn(e)}async function pn(e){let t=e.sessionStore.lookup(e.sessionName),n=t?.session,r=n?.lease;return!t||!n||!r||!e.leaseRegistry.consumeExpiredLease(r.leaseId)?!1:(c({level:`info`,phase:`leased_session_expired`,data:{reason:`LEASE_EXPIRED`,leaseId:r.leaseId,session:n.name,deviceKey:r.deviceKey}}),await e.teardownSession(t).catch(e=>{c({level:`debug`,phase:`leased_session_expiry_cleanup_failed`,data:{reason:`LEASE_EXPIRED`,leaseId:r.leaseId,session:n.name,error:e instanceof Error?e.message:String(e)}})}),await Xe(n.deviceClaim).catch(e=>{c({level:`warn`,phase:`leased_session_expiry_device_claim_clear_failed`,data:{session:n.name,deviceKey:n.deviceClaim?.deviceKey,error:e instanceof Error?e.message:String(e)}})}),e.sessionStore.retire(t),!0)}function mn(e){let{sessionName:t,sessionStore:n,leaseRegistry:r}=e,i=n.lookup(t),a=i?.session,o=nn(e.req,r,a,{providerAppCatalog:e.providerAppCatalog,daemonPolicy:e.daemonPolicy});if(!o)return e.req;let s={...e.req,internal:{...e.req.internal,admittedLease:o}};return i&&a?.lease&&n.update(i,e=>({lease:{...e.lease,leaseBackend:o.backend,expiresAt:o.expiresAt}})),s}function hn(e){return $e(e.req,e.req.internal?.admittedLease)??e.existingLease}async function gn(e){let t=e.session.lease;if(!t)return;let n=m({leaseId:t.leaseId,tenantId:t.tenantId,runId:t.runId,leaseBackend:t.leaseBackend,leaseProvider:t.leaseProvider,deviceKey:t.deviceKey,clientId:t.clientId}),r=e.leaseRegistry.getLease(n);if(r?.retainOnClose){c({level:`info`,phase:`session_lease_released`,data:{session:e.session.name,leaseId:t.leaseId,released:!1,retained:!0}});return}let i=r?await e.leaseLifecycleProvider?.release?.(r):void 0,a=je(i);r&&a&&e.leaseRegistry.recordProviderSession(r,a);let o=e.leaseRegistry.releaseLease(n);return c({level:`info`,phase:`session_lease_released`,data:{session:e.session.name,leaseId:t.leaseId,released:o.released}}),i}const _n=[`platform`,`target`],vn=[`iosSimulatorDeviceSet`,`androidDeviceAllowlist`];function yn(e){return u({deviceName:e?.device,udid:e?.udid,serial:e?.serial})}function bn(e){return yn(e)||Cn(e,_n)}function xn(e){return bn(e)||Cn(e,vn)}function Sn(e){return typeof e==`string`&&e.trim().length>0}function Cn(e,t){return e?t.some(t=>Sn(e[t])):!1}function wn(e){return{appleSimulatorAppTarget:Tn(e)}}function Tn(e){return e&&!a(e)?e:void 0}function En(){return et({displayName:`audio probe`})}function Dn(){return et({displayName:`perf capture`})}function On(e){let t={version:2,platform:e.platform??null,target:e.target??null,runtimeHints:e.runtimeHints??null,initialStaticEnv:e.initialStaticEnv,steps:e.steps};return mt(`sha256`).update(oe(t),`utf8`).digest(`hex`)}function kn(e,t){try{return new Rn(jn(An(e)),t).parse()}catch(e){if(e instanceof n&&e.code===`INVALID_ARGS`)return;throw e}}function An(e){let t=e.trim();return t.startsWith("${")&&t.endsWith(`}`)?t.slice(2,-1).trim():t}function jn(e){let t=[],r=0;for(;r<e.length;){let i=e.slice(r),a=/^\s+/.exec(i)?.[0].length??0;if(a>0){r+=a;continue}let o=Mn(i);if(!o)throw new n(`INVALID_ARGS`,`Unsupported runFlow.when.true expression near "${i.slice(0,24)}".`);t.push(o.value),r+=o.length}return t}function Mn(e){return Nn(e)??Pn(e)??Fn(e)??In(e)??Ln(e)}function Nn(e){return e.startsWith(`maestro.platform`)?{value:{type:`platform`},length:16}:null}function Pn(e){let t=/^(==|!=|&&|\|\|)/.exec(e)?.[1];return t?{value:{type:`operator`,value:t},length:t.length}:null}function Fn(e){let t=e[0];return t===`(`||t===`)`?{value:{type:`paren`,value:t},length:1}:null}function In(e){let t=/^(['"])(.*?)\1/.exec(e);return t?{value:{type:`string`,value:t[2]??``},length:t[0].length}:null}function Ln(e){let t=/^(true|false)\b/.exec(e)?.[1];return t?{value:{type:`boolean`,value:t===`true`},length:t.length}:null}var Rn=class{index=0;tokens;platform;constructor(e,t){this.tokens=e,this.platform=t}parse(){let e=this.parseOr();if(this.peek())throw new n(`INVALID_ARGS`,`Unsupported trailing runFlow.when.true expression.`);return e}parseOr(){let e=this.parseAnd();for(;this.consumeOperator(`||`);)e=this.parseAnd()||e;return e}parseAnd(){let e=this.parsePrimary();for(;this.consumeOperator(`&&`);)e=this.parsePrimary()&&e;return e}parsePrimary(){let e=this.peek();if(!e)throw new n(`INVALID_ARGS`,`Incomplete runFlow.when.true expression.`);if(e.type===`boolean`)return this.index+=1,e.value;if(e.type===`paren`&&e.value===`(`){this.index+=1;let e=this.parseOr();if(!this.consumeParen(`)`))throw new n(`INVALID_ARGS`,`Unclosed runFlow.when.true parenthesis.`);return e}return this.parsePlatformComparison()}parsePlatformComparison(){this.consumePlatformToken();let e=this.consumeComparisonOperator(),t=this.consumeStringLiteral(),n=this.platform===t.toLowerCase();return e.value===`==`?n:!n}consumePlatformToken(){if(this.peek()?.type!==`platform`)throw new n(`INVALID_ARGS`,`runFlow.when.true supports maestro.platform comparisons.`);this.index+=1}consumeComparisonOperator(){let e=this.peek();if(e?.type!==`operator`||e.value!==`==`&&e.value!==`!=`)throw new n(`INVALID_ARGS`,`runFlow.when.true comparison requires == or !=.`);return this.index+=1,e}consumeStringLiteral(){let e=this.peek();if(e?.type!==`string`)throw new n(`INVALID_ARGS`,`runFlow.when.true comparison requires a string literal.`);return this.index+=1,e.value}consumeOperator(e){let t=this.peek();return t?.type!==`operator`||t.value!==e?!1:(this.index+=1,!0)}consumeParen(e){let t=this.peek();return t?.type!==`paren`||t.value!==e?!1:(this.index+=1,!0)}peek(){return this.tokens[this.index]}};const zn=new Set([``,`false`,`0`,`null`,`undefined`]);function L(e){return typeof e==`boolean`?e:typeof e==`number`?e!==0&&!Number.isNaN(e):!zn.has(e)}function Bn(e){return typeof e==`boolean`||typeof e==`number`||typeof e==`string`?L(e):typeof e==`bigint`?e!==0n:e!=null}function Vn(e){switch(e.kind){case`runFlow`:return!(`include`in e);case`repeat`:case`retry`:return!(`commands`in e);default:return!1}}function Hn(e,t){return{...B(e,t),source:e.source}}function R(e,t,r){if(e===void 0)return;let i=r??tt[t]??{},a=at(i),o;if(typeof e==`number`)o=e;else{let r=e.trim();if(r===``)throw new n(`INVALID_ARGS`,`Maestro ${t} must be ${a}.`);o=Number(r)}if(!Number.isFinite(o)||Math.abs(o)>2**53-1||i.integer&&!Number.isSafeInteger(o)||i.nonNegative&&o<0||i.positive&&o<=0)throw new n(`INVALID_ARGS`,`Maestro ${t} must be ${a}.`);return o}function Un(e,t,n,r){return R(e===void 0?t:n.resolve(String(e)),r)}function z(e){if(e?.aborted)throw t()}async function Wn(e,t){if(e.include.kind===`commands`)return{kind:`program`,source:e.source,config:{},commands:e.include.commands};if(!t.loadProgram)throw new n(`INVALID_ARGS`,`Maestro file runFlow requires a program loader.`);return z(t.signal),t.signal?await t.loadProgram(e.include.path,e.source.path,t.signal):await t.loadProgram(e.include.path,e.source.path)}function Gn(e,t){if(e.include.kind===`file`)return A.resolve(t?A.dirname(t):process.cwd(),e.include.path)}function Kn(e){return e===void 0?void 0:A.resolve(e)}function qn(e,t){let r=Gn(e,e.source.path);if(r&&t.has(r))throw new n(`INVALID_ARGS`,`Maestro runFlow cycle detected at ${r}.`);return r}function Jn(e,t,r,i){let a=e.include.kind===`file`?Kn(t.source.path):void 0,o=new Set([r,a].filter(e=>e!==void 0)),s=[...o].find(e=>i.has(e));if(s)throw new n(`INVALID_ARGS`,`Maestro runFlow cycle detected at ${s}.`);return o.forEach(e=>i.add(e)),o}function Yn(e,t){if(e.trustedScripts===!1)throw new n(`UNAUTHORIZED`,`Maestro ${t} is not permitted for flows received over the remote daemon surface: node:vm is not a security sandbox, so an untrusted expression can escape to the host.`)}async function Xn(e,t,n,r){if(e===void 0)return!0;if(typeof e==`boolean`)return e;let i=Zn(e,n);if(i!==void 0){let e=kn(i,r.platform);if(e!==void 0)return e;if(!i.includes("${"))return L(i)}Yn(r,t);let{evaluateMaestroConditionScript:a}=await import(`./engine-eval-script.js`),o=await a(e,n.values,r.platform,t);return n.replaceOutput(o.outputEnv),Bn(o.value)}function Zn(e,t){try{return t.resolve(e)}catch(e){if(e instanceof n&&e.code===`INVALID_ARGS`)return;throw e}}function Qn(e,t){return[...e.visible?[{kind:`visible`,selector:B(e.visible,t)}]:[],...e.notVisible?[{kind:`notVisible`,selector:B(e.notVisible,t)}]:[]]}function B(e,t){return typeof e==`string`?t.resolve(e):Array.isArray(e)?e.map(e=>B(e,t)):e&&typeof e==`object`?Object.fromEntries(Object.entries(e).map(([e,n])=>[e,B(n,t)])):e}async function $n(e,t){z(t.signal);let n=Kn(e.source.path),r={options:t,context:nt(t.defaults,t.env),activeIncludePaths:new Set(n===void 0?[]:[n]),staticallyExecutedControls:0,staticallySkippedControls:0};return{steps:await er(e,[],void 0,e.source.path,r),staticallyExecutedControls:r.staticallyExecutedControls,staticallySkippedControls:r.staticallySkippedControls}}async function er(e,t,n,r,i){z(i.options.signal);let a=ur(t,e.config.env),o=e.config.appId??n,s=i.context.enter(e.config.env);try{let t=[...e.config.onFlowStart??[],...e.commands,...e.config.onFlowComplete??[]],n=[];for(let s of t)n.push(...await nr(s,a,o,e.source.path??r,i));return n}finally{s()}}async function tr(e,t,n,r,i){let a=[];for(let o of e)a.push(...await nr(o,t,n,r,i));return a}async function nr(e,t,n,r,i){z(i.options.signal);let a=dr(e,r);switch(a.kind){case`runFlow`:{let e=ir(a,i);if(e===`omit`)return i.staticallySkippedControls+=1,[];let o=await rr(a,t,n,r,i);return e===`flatten`?(i.staticallyExecutedControls+=1,o):[V(a,t,n,o)]}case`repeat`:return[V(a,t,n,await tr(a.commands,t,n,r,i))];case`retry`:return[V(a,t,n,await tr(a.commands,t,n,r,i))];default:return[cr(a,t,n)]}}async function rr(e,t,n,r,i){let a=or(e,i.context),o=qn(a,i.activeIncludePaths),s=await Wn(a,i.options);z(i.options.signal);let c=Jn(a,s,o,i.activeIncludePaths),l=ur(t,e.env),u=i.context.enter(e.env);try{return await er(s,l,n,s.source.path??e.source.path??r,i)}finally{u(),c.forEach(e=>i.activeIncludePaths.delete(e))}}function ir(e,t){let n=e.when;return n?n.platform!==void 0&&n.platform!==t.options.platform?`omit`:ar(n.true,t)||(n.visible||n.notVisible?`opaque`:`flatten`):`flatten`}function ar(e,t){if(e===!1)return`omit`;if(typeof e!=`string`)return;let n=t.context.resolveDeferred(e);if(sr(n))return`opaque`;let r=kn(n,t.options.platform);return r===void 0?`opaque`:r?void 0:`omit`}function or(e,t){return e.include.kind===`file`?{...e,include:{...e.include,path:t.resolve(e.include.path)}}:e}function sr(e){return/\$\{[A-Za-z_][A-Za-z0-9_.]*\}/.test(e)}function cr(e,t,n){return D({kind:`command`,command:e,source:e.source,scopes:t,appId:n})}function V(e,t,n,r){return D({kind:`opaque`,command:lr(e),source:e.source,scopes:t,body:r,appId:n})}function lr(e){switch(e.kind){case`runFlow`:return D({kind:e.kind,source:e.source,when:e.when,label:e.label,...e.include.kind===`file`?{includePath:e.include.path}:{}});case`repeat`:return D({kind:e.kind,source:e.source,times:e.times,while:e.while});case`retry`:return D({kind:e.kind,source:e.source,maxRetries:e.maxRetries})}}function ur(e,t){return t===void 0?e:[...e,t]}function dr(e,t){return e.source.path||!t?e:{...e,source:{...e.source,path:t}}}async function fr(e,t={}){let{steps:n,staticallyExecutedControls:r,staticallySkippedControls:i}=await $n(e,t),a=pr(t.runtimeHints),o=D({kind:`maestroReplayPlan`,platform:t.platform,target:t.target,runtimeHints:a,initialStaticEnv:structuredClone({...t.defaults??{},...e.config.env??{},...t.env??{}}),steps:structuredClone(n),total:n.length,compatibility:{staticallyExecutedControls:r,staticallySkippedControls:i}}),s=On(o);return mr({...o,digest:s})}function pr(e){if(!e)return;let t=Object.entries(e).filter(e=>e[1]!==void 0);return t.length===0?void 0:Object.fromEntries(t)}function mr(e){if(!e||typeof e!=`object`||Object.isFrozen(e))return e;for(let t of Object.values(e))mr(t);return Object.freeze(e)}function hr(e,t={}){let{from:n,planDigest:r}=t;if(n===void 0&&r===void 0)return{allowed:!0,startIndex:0};if(n===void 0||r===void 0)return{allowed:!1,reason:`replay --from requires --plan-digest (and --plan-digest requires --from).`};if(!Number.isInteger(n)||n<1||n>e.total)return{allowed:!1,reason:`replay --from ${n} is out of range for a ${e.total}-step plan.`};if(r!==e.digest)return{allowed:!1,reason:`replay --plan-digest does not match the current plan digest.`};if(n===1)return{allowed:!0,startIndex:0};for(let t=0;t<n-1;t+=1){let n=e.steps[t];if(n.kind===`opaque`)return{allowed:!1,reason:`step ${t+1} is opaque runtime control flow (${n.command.kind}) and cannot be skipped safely.`};if(n.command.kind===`runScript`||n.command.kind===`evalScript`)return{allowed:!1,reason:`step ${t+1} (${n.command.kind}) can produce outputEnv values and cannot be skipped safely.`}}let i=e.steps[n-1];return i.kind===`opaque`?{allowed:!1,reason:`step ${n} is opaque runtime control flow (${i.command.kind}) and cannot be resumed into.`}:{allowed:!0,startIndex:n-1}}function gr(e,t={}){let r=hr(e,t);if(!r.allowed)throw new n(`INVALID_ARGS`,r.reason);return r.startIndex}function _r(e,t){if(!Number.isInteger(t)||t<0||t>e.total)throw new n(`INVALID_ARGS`,`Maestro replay startIndex ${t} is out of range for a ${e.total}-step plan.`);return t}const vr=`maestro-test-failure`;function H(e,t={}){return new n(`COMMAND_FAILED`,e,{...t,reason:vr})}function yr(e){return e instanceof n&&e.code===`COMMAND_FAILED`&&e.details?.reason===vr}async function br(e,t){z(t.options.signal);try{return await Pr(e,t.context,async()=>await xr(e,t))}catch(t){throw G(t,e)}}async function xr(e,t){if(e.kind===`command`)return await Sr(e.command,e.appId,t);await Or(e,t)}async function Sr(e,t,n){if(e.kind===`evalScript`)return await Tr(e,n);let r=Hn(e,n.context);try{return await Er(r,t,n)}catch(e){if(z(n.options.signal),wr(r)&&yr(e)){n.warnings.push(Cr(r,e)),n.skipped+=1;return}throw Fr(e,r)}}function Cr(e,t){let r=`${e.source.path?`${e.source.path}:`:``}line ${e.source.line}`,i=t instanceof n?t.message:String(t);return`Optional Maestro ${e.kind} skipped at ${r}: ${i}`}function wr(e){return`optional`in e&&e.optional===!0}async function Tr(e,t){let{evaluateMaestroEvalScript:n}=await import(`./engine-eval-script.js`);Yn(t.options,`evalScript`);let r=await n(e.script,t.context.values);t.context.replaceOutput(r),t.executed+=1}async function Er(e,t,n){switch(e.kind){case`assertVisible`:await W({kind:`visible`,selector:e.target},n.timing.assertVisibleTimeoutMs,n),n.executed+=1;return;case`assertNotVisible`:await W({kind:`notVisible`,selector:e.target},n.timing.assertNotVisibleTimeoutMs,n),n.executed+=1;return;case`assertTrue`:if(!L(e.condition))throw H(`Maestro assertTrue condition was falsy: ${JSON.stringify(e.condition)}`);n.executed+=1;return;case`extendedWaitUntil`:await W(Nr(e),R(e.timeout,`extendedWaitUntil.timeout`)??n.timing.extendedWaitUntilTimeoutMs,n),n.executed+=1;return;default:return await Dr(e,t,n)}}async function Dr(e,t,n){let r=D({command:e,env:n.context.values,appId:t===void 0?void 0:n.context.resolve(t),generation:n.context.generation,invalidateObservation:n.context.invalidateObservation,cachedObservation:n.context.observation,signal:n.options.signal}),i=await n.port.execute(r);return z(n.options.signal),i.observation&&n.context.recordObservation(i.observation),i.outputEnv&&n.context.merge(i.outputEnv),i.artifactPaths?.forEach(e=>n.artifacts.add(e)),n.executed+=1,i}async function Or(e,t){let n=e.command;switch(n.kind){case`runFlow`:if(n.when&&!await jr(n.when,`runFlow.when`,t)){t.skipped+=1;return}t.executed+=1,await U(e.body,t);return;case`repeat`:t.executed+=1,await kr(e.body,n.times,n.while,t);return;case`retry`:{let r=Math.min(Un(n.maxRetries,1,t.context,`retry.maxRetries`),st.control.retryMaxRetries);t.executed+=1,await Ar(e.body,r,t);return}}}async function U(e,t){for(let n of e)await br(n,t)}async function kr(e,t,n,r){let i=t===void 0&&n?1/0:Un(t,0,r.context,`repeat.times`);for(let t=0;t<i;t+=1){if(await new Promise(e=>setImmediate(e)),z(r.options.signal),n&&!await jr(n,`repeat.while`,r))return;await U(e,r)}}async function Ar(e,t,r){let i;for(let n=0;n<=t;n+=1){z(r.options.signal);try{await U(e,r);return}catch(t){if(z(r.options.signal),!yr(Lr(t)))throw t;i=G(t,e[0])}}throw i||new n(`COMMAND_FAILED`,`Maestro retry commands failed.`)}async function jr(e,t,n){if(e.platform&&e.platform!==n.options.platform||!await Xn(e.true,`${t}.true`,n.context,n.options))return!1;for(let t of Qn(e,n.context))if(z(n.options.signal),!(await Mr(t,n.timing.runFlowConditionTimeoutMs,n)).matched)return!1;return!0}async function W(e,t,n){if(!(await Mr(e,t,n)).matched)throw H(`Maestro ${e.kind} condition did not match.`)}async function Mr(e,t,n){let r={condition:e,timeoutMs:t,generation:n.context.generation,env:n.context.values,...n.context.observation?{cachedObservation:n.context.observation}:{},...n.options.signal?{signal:n.options.signal}:{}},i=await n.port.observe(r);return z(n.options.signal),n.context.recordObservation(i),i}function Nr(e){if(e.visible)return{kind:`visible`,selector:e.visible};if(e.notVisible)return{kind:`notVisible`,selector:e.notVisible};throw new n(`INVALID_ARGS`,`Maestro extendedWaitUntil requires one condition.`)}async function Pr(e,t,n){let r=e.scopes.map(e=>t.enter({...e}));try{return await n()}finally{for(let e=r.length-1;e>=0;--e)r[e]()}}function G(e,t){if(Ir(e))return e;let n=t?.source??{line:1};return{kind:`maestroPlanStepFailure`,error:Rr(e,t?.command),source:n,...t?{command:t.command}:{}}}function Fr(e,t){return{kind:`maestroPlanStepFailure`,error:Rr(e,t),source:t.source,command:t}}function Ir(e){return!!(e&&typeof e==`object`&&e.kind===`maestroPlanStepFailure`)}function Lr(e){return Ir(e)?e.error:e}function Rr(e,t){if(!(e instanceof n)||!t||/\bline \d+\b/.test(e.message))return e;let r=t.source.path?`${t.source.path}:`:``;return new n(e.code,`${e.message} (${r}line ${t.source.line})`,e.details)}async function zr(e,t,r={}){z(r.signal);let i=r.startIndex??0;if(!Number.isInteger(i)||i<0||i>e.total)throw new n(`INVALID_ARGS`,`Maestro replay startIndex ${i} is out of range for a ${e.total}-step plan.`);let a={plan:e,port:t,options:r,context:nt(r.defaults,r.env?{...r.env}:{}),timing:ct,artifacts:new Set,warnings:[],executed:e.compatibility.staticallyExecutedControls,skipped:e.compatibility.staticallySkippedControls};for(let t=i;t<e.steps.length;t+=1)try{await Br(e.steps[t],t,a)}catch(e){throw Lr(e)}return{executed:a.executed,skipped:a.skipped,generation:a.context.generation,artifactPaths:[...a.artifacts],...a.warnings.length>0?{warnings:a.warnings}:{}}}async function Br(e,t,n){z(n.options.signal);let r=n.options.now??Date.now,i=r(),a=n.port.readMetrics?.(),o=n.context.generation,s={command:e.command,source:e.source,generation:o,stepIndex:t+1,stepTotal:n.plan.total};K(()=>n.options.observer?.commandStarted?.(s));try{let t=await br(e,n);z(n.options.signal),K(()=>n.options.observer?.commandCompleted?.({...s,durationMs:r()-i,...Vr(a,n.port.readMetrics?.()),...t?.data?{data:t.data}:{}}))}catch(t){let o=G(t,e);throw K(()=>n.options.observer?.commandFailed?.({...s,...o.command?{command:o.command}:{},source:o.source,durationMs:r()-i,...Vr(a,n.port.readMetrics?.()),error:o.error,artifactPaths:[...n.artifacts],warnings:[...n.warnings]})),o}}function Vr(e,t){return!e||!t?{}:{runtimeMetrics:{hierarchyCaptures:t.hierarchyCaptures-e.hierarchyCaptures,screenshotCaptures:t.screenshotCaptures-e.screenshotCaptures,tapRetries:t.tapRetries-e.tapRetries,settleLatches:t.settleLatches-e.settleLatches,settleTimeouts:t.settleTimeouts-e.settleTimeouts}}}function K(e){try{e?.()}catch{}}async function Hr(e,t,n={}){let r=Ur(e,n);return await zr(e,t,{...n,startIndex:r})}function Ur(e,t){return t.from!==void 0||t.planDigest!==void 0?gr(e,{from:t.from,planDigest:t.planDigest}):_r(e,t.startIndex??0)}function Wr(e){return Vn(e)?{command:e.kind,...e.kind===`runFlow`?J(e.label??e.includePath):{}}:{command:e.kind,...Gr(e)}}function Gr(e){return`label`in e&&e.label?J(e.label):Kr(e)?J($r(e.target)):qr(e)?Jr(e):e.kind===`inputText`?J(`<text>`):Yr(e)}function Kr(e){return e.kind===`tapOn`||e.kind===`doubleTapOn`||e.kind===`longPressOn`}function qr(e){return e.kind===`assertVisible`||e.kind===`assertNotVisible`||e.kind===`extendedWaitUntil`||e.kind===`scrollUntilVisible`}function Jr(e){switch(e.kind){case`assertVisible`:case`assertNotVisible`:return J(q(e.target));case`extendedWaitUntil`:return J(q(e.visible??e.notVisible));case`scrollUntilVisible`:return J(q(e.element))}}function Yr(e){return Xr(e)?Zr(e):e.kind===`swipe`?Qr(e):e.kind===`runFlow`?J(e.label??(e.include.kind===`file`?e.include.path:``)):e.kind===`assertTrue`?J(String(e.condition)):{}}function Xr(e){return e.kind===`openLink`||e.kind===`takeScreenshot`||e.kind===`runScript`||e.kind===`pressKey`}function Zr(e){switch(e.kind){case`openLink`:return J(e.link);case`takeScreenshot`:return J(e.path);case`runScript`:return J(e.file);case`pressKey`:return J(e.key)}}function Qr(e){return J(e.gesture.kind===`coordinates`?`${ei(e.gesture.start)} to ${ei(e.gesture.end)}`:e.gesture.direction)}function $r(e){return e.space===`target`?q(e.selector):`${e.x},${e.y}${e.space===`percent`?`%`:``}`}function q(e){return e?.id??e?.text}function ei(e){return`${e.x},${e.y}${e.space===`percent`?`%`:``}`}function J(e){return e?{value:e}:{}}const ti=new Set(String.raw`^$\.*+?()[]{}|`);function ni(e,t){try{return RegExp(`^(?:${t})$`,`ims`).test(e)}catch{return e.toLocaleLowerCase()===t.toLocaleLowerCase()}}function ri(e){try{new RegExp(e)}catch{return e}let t=``;for(let n=0;n<e.length;n+=1){let r=e[n];if(r!==`\\`){if(ti.has(r))return;t+=r;continue}let i=e[n+1];if(i===void 0||!ti.has(i))return;t+=i,n+=1}return t}function ii(e,t,n){if(n===`android`&&e.visibleToUser===!1)return!1;if(g(e.rect))return t.isVisibleInEffectiveViewport(e);if(e.rect)return!1;if(n!==`android`&&e.hittable===!0)return!0;let r=t.findAncestor(e,e=>te(e,n)?e:null);return r?g(r.rect)?t.isVisibleInEffectiveViewport(r):n!==`android`&&r.hittable===!0:!1}function ai(e,t,n){return!!n.findAncestor(e,e=>e.index===t.index?e:null)}function oi(e,t){let n=[t.id===void 0?void 0:ci(e.identifier,t.id),t.text===void 0?void 0:li(e,t.text)].filter(e=>e!==void 0);return!(n.length===0&&t.enabled===void 0&&t.selected===void 0||n.some(e=>!e)||t.enabled!==void 0&&e.enabled!==!1!==t.enabled||t.selected!==void 0&&e.selected===!0!==t.selected)}function si(e){return e.matches.filter(t=>ii(t,e.visibility,e.platform))}function ci(e,t){let n=e??``;return O(n)===O(t)||ni(n,t)}function li(e,t){return[e.label,rt(e),e.identifier].filter(e=>!!e).some(e=>ci(e,t))}function ui(e){return e.index!==void 0||e.childOf!==void 0||e.below!==void 0||e.above!==void 0||e.leftOf!==void 0||e.rightOf!==void 0||e.containsChild!==void 0||e.containsDescendants!==void 0}function di(e){return e.text!==void 0||e.id!==void 0||e.enabled!==void 0||e.selected!==void 0}function fi(e,t,n){let r=[],i=0;for(let a of e)for(let e of n){let n=mi(a.rect,e.rect);n===void 0||!pi(t,a.rect,e.rect)||r.push({node:a,distance:n,order:i++})}return r.sort((e,t)=>e.distance-t.distance||e.order-t.order),r.map(({node:e})=>e)}function pi(e,t,n){switch(e){case`below`:return t.y>n.y;case`above`:return t.y<n.y;case`leftOf`:return t.x<n.x;case`rightOf`:return t.x>n.x}}function mi(e,t){if(!(!hi(e)||!hi(t)))return Math.fround(Math.hypot(Y(e.x,e.width)-Y(t.x,t.width),Y(e.y,e.height)-Y(t.y,t.height)))}function hi(e){return!!(e&&[e.x,e.y,e.width,e.height].every(Number.isFinite))}function Y(e,t){return e+Math.trunc(t/2)}function gi(e,t={},r={}){let i=ne(e.nodes,t);t.onVisibilityContextCreated?.();let a=new WeakMap,o=new WeakSet,s=new WeakMap,c=new Map,l=t=>t.parentIndex===void 0?void 0:i.nodeByIndex.get(t.parentIndex)??e.nodes[t.parentIndex],u=e=>{let t=s.get(e);if(t)return t;let n=new Set,r=new Set,i=l(e);for(;i&&!r.has(i.index);)r.add(i.index),n.add(i.index),i=l(i);return s.set(e,n),n},d=(n,r)=>{let i=c.get(n);i||(i=new WeakMap,c.set(n,i));let a=i.get(r);if(a)return a;t.onPositionComputed?.(n,r);let o=fi(e.nodes,n,m(r).indexed),s={ordered:o,candidateIndexes:new Set(o.map(e=>e.index))};return i.set(r,s),s},f=(e,t)=>d(e,t).ordered,p=(e,t)=>d(e,t).candidateIndexes,m=i=>{let s=a.get(i);if(s)return s;if(o.has(i))throw new n(`INVALID_ARGS`,`Maestro selector relations cannot contain cycles.`);o.add(i),t.onSelectorComputed?.(i);try{let t=_i(e,i,l,u,m,p),n={matches:t,indexed:xi(t,i.index,r.orderUnindexed)};return a.set(i,n),n}finally{o.delete(i)}};return{visibility:i,resolve:m,resolvePosition:f}}function _i(e,t,n,r,i,a){let{index:o,childOf:s,below:c,above:l,leftOf:u,rightOf:d,containsChild:f,containsDescendants:p,...m}=t,h=di(m)?e.nodes.filter(e=>oi(e,m)):[...e.nodes];if(s){let e=new Set(i(s).indexed.map(e=>e.index));h=h.filter(t=>yi(r(t),e))}if(f){let e=new Set(i(f).indexed.map(n).filter(e=>e!==void 0).map(e=>e.index));h=h.filter(t=>e.has(t.index))}if(p){let e=p.map(e=>vi(i(e).indexed,r));h=h.filter(t=>e.every(e=>e.has(t.index)))}for(let[e,n]of bi(t)){let t=a(e,n);h=h.filter(e=>t.has(e.index))}return h}function vi(e,t){let n=new Set;for(let r of e)for(let e of t(r))n.add(e);return n}function yi(e,t){for(let n of e)if(t.has(n))return!0;return!1}function bi(e){return[[`below`,e.below],[`above`,e.above],[`leftOf`,e.leftOf],[`rightOf`,e.rightOf]].filter(e=>e[1]!==void 0)}function xi(e,t,n){if(t===void 0)return n?n(e):[...e];let r=Ci(e)[wi(t)];return r?[r]:[]}function Si(e,t){return t===void 0?e[0]:Ci(e)[wi(t)]}function Ci(e){return[...e].sort((e,t)=>{let n=X(e.rect?.y),r=X(t.rect?.y);return n===r?X(e.rect?.x)-X(t.rect?.x):n-r})}function X(e){return e!==void 0&&Number.isFinite(e)?e:2**53-1}function wi(e){let t=typeof e==`number`?e:Number(e.trim());if(!Number.isSafeInteger(t)||t<0)throw new n(`INVALID_ARGS`,`Maestro selector.index must be a non-negative integer.`);return t}const Ti={android:{kind:`exact`,provider:`android-helper`},ios:{kind:`divergence`,provider:`apple-xctest`,reason:`maestro-clickable-not-exposed-by-provider`}};function Ei(e,t){let n=Ti[t];if(n.kind===`divergence`)return n;let r=s(e);return r?r.kind!==`exact`||r.provider!==n.provider?{kind:`divergence`,provider:n.provider,reason:`unregistered-provider-evidence`}:r:{kind:`divergence`,provider:n.provider,reason:`exact-evidence-not-retained`}}function Z(e,t){return t.kind===`exact`?e.map((e,n)=>({node:e,order:n,rank:Di(t.clickableByNodeIndex.get(e.index))})).sort((e,t)=>t.rank-e.rank||e.order-t.order).map(({node:e})=>e):[...e]}function Di(e){return e===!0?2:+(e===!1)}function Oi(e,t,n,r={}){let i=Ei(e,n),a=Ai(e,i,r),o=ki(t,a),s=si({visibility:a.visibility,matches:o.matches,platform:n});return{...o,visible:s,clickability:i,ranked:ji(s,t,n,a.visibility,i)}}function ki(e,t){return{matches:t.resolve(e).matches,parentMatched:e.childOf===void 0||t.resolve(e.childOf).indexed.length>0}}function Ai(e,t,n={}){return gi(e,n,t?{orderUnindexed:e=>Z(e,t)}:{})}function ji(e,t,n,r,i){let a=n!==`ios`||!Fi(t)?e:e.filter(n=>{if(zi(n))return!0;let i=e.filter(e=>e!==n&&Ii(n,e,t));return!i.some(e=>zi(e)&&ai(n,e,r))&&!i.some(e=>ai(e,n,r))});return t.index===void 0&&i?Z(a,i):a}function Mi(e,t){let n=t===void 0?e.find(Q):Ni(e,t);return!n||!Q(n)?null:{node:n,rect:n.rect}}function Ni(e,t){return Si(e,t)}function Pi(e){return Q(e)?e.rect:void 0}function Q(e){return g(e.rect)}function Fi(e){return e.id!==void 0||e.text!==void 0}function Ii(e,t,n){if(n.id!==void 0&&Ri(e.identifier)!==Ri(t.identifier))return!1;if(n.text!==void 0){let n=Li(e),r=new Set(Li(t));if(!n.some(e=>r.has(e)))return!1}return!0}function Li(e){return[e.label,e.value,e.identifier].map(Ri).filter(e=>e!==void 0)}function Ri(e){if(e)return O(e)||void 0}function zi(e){let t=re(e.type??``);return t===`button`||t===`link`||t===`switch`||t===`searchfield`||t===`textfield`||t===`securetextfield`||t===`textview`}const Bi=Symbol(`maestroFlowProgram`),Vi=Symbol(`maestroFailureCommand`),Hi=Symbol(`maestroFailurePlan`);function Ui(e,t){let n=ot(e,{sourcePath:t});return{sourcePath:t,name:n.config.name,appTarget:Ji(n),[Bi]:n}}async function Wi(e,t,n){let r;try{let i=it(A.dirname(e.sourcePath),n.readSource),a=await fr(e[Bi],{defaults:n.defaults,env:n.env,platform:n.platform,target:n.target,runtimeHints:n.runtimeHints,loadProgram:i,signal:n.signal}),o=gr(a,{from:n.from,planDigest:n.planDigest}),s=await Hr(a,t,{defaults:n.defaults,env:n.env,platform:n.platform,target:n.target,loadProgram:i,signal:n.signal,startIndex:o,trustedScripts:n.trustedScripts,observer:Ki(a,n.observer,e=>{r=e})});return{ok:!0,replayed:a.total-o,planDigest:a.digest,startIndex:o,artifactPaths:s.artifactPaths,...s.warnings?{warnings:s.warnings}:{}}}catch(e){return{ok:!1,error:r?.error??e,...r?{failure:r}:{}}}}function Gi(e,t){let n=Xi(e[Vi]),r=e[Hi].platform;return!n||r!==`android`&&r!==`ios`?[]:Oi(t,n.selector,r).ranked.map(e=>({node:e,basis:Zi(n.selector,e)}))}function Ki(e,t,n){return{commandStarted:e=>t?.actionStarted?.(qi(e)),commandCompleted:e=>t?.actionCompleted?.({...qi(e),durationMs:e.durationMs,runtimeMetrics:e.runtimeMetrics,data:e.data}),commandFailed:r=>{let i=hr(e,{from:r.stepIndex,planDigest:e.digest}),a={...qi(r),durationMs:r.durationMs,error:r.error,artifactPaths:r.artifactPaths,warnings:[...r.warnings],isControl:Vn(r.command),redactions:r.command.kind===`inputText`&&r.command.text.length>0?[{name:`inputText.text`,value:r.command.text}]:[],resume:i.allowed?{allowed:!0,from:r.stepIndex,planDigest:e.digest}:{allowed:!1,from:r.stepIndex,planDigest:e.digest,reason:i.reason},[Vi]:r.command,[Hi]:e};n(a),t?.actionFailed?.(a)}}}function qi(e){let t=Wr(e.command);return{action:t.command,...t.value?{value:t.value}:{},source:e.source,generation:e.generation,stepIndex:e.stepIndex,stepTotal:e.stepTotal}}function Ji(e){return[e.config.appId,...[...e.config.onFlowStart??[],...e.commands].filter(e=>e.kind===`launchApp`).map(e=>e.kind===`launchApp`?e.appId:void 0)].find(Yi)}function Yi(e){return!!(e?.trim()&&!e.includes(`$`)&&!a(e))}function Xi(e){switch(e.kind){case`tapOn`:return e.target.space===`target`?{selector:e.target.selector}:void 0;case`doubleTapOn`:case`longPressOn`:return e.target.space===`target`?{selector:e.target.selector}:void 0;case`assertVisible`:case`assertNotVisible`:return{selector:e.target};case`extendedWaitUntil`:return e.visible?{selector:e.visible}:e.notVisible?{selector:e.notVisible}:void 0;case`scrollUntilVisible`:return{selector:e.element};case`swipe`:return e.gesture.kind===`target`?{selector:e.gesture.from}:void 0;default:return}}function Zi(e,t){return e.id!==void 0||e.text!==void 0&&oi({...t,label:void 0,value:void 0},{text:e.text})?`id`:e.text===void 0?`other`:`label`}const Qi=`This replay request carries no script sources. Replay scripts are read by the client and sent with the request; upgrade the agent-device client that issued it to a version that sends script sources.`;function $i(e,t){let r=e.files[t];if(r===void 0)throw new n(`INVALID_ARGS`,`replay script source is missing ${t}; it was not part of the script sources sent with this request.`,{path:t,entry:e.entry});return r}function ea(e){let t=ce(e);for(let n of e){if(n.command!==`open`)continue;let e=n.positionals?.[0];return ra(e)?{appTarget:e,platform:t}:{appTarget:void 0,platform:t}}return{appTarget:void 0,platform:t}}function ta(e,t){return t===`ios`?ia(e)??{}:{}}function na(e,t){let n=ea(t);return e?.platform!==void 0||!n.platform?e??{}:{...e,platform:n.platform}}function ra(e){return!!(e&&e.trim()&&!e.includes(`$`)&&!a(e))}function ia(e){let t=Tn(e);return t?{appleSimulatorAppTarget:t}:void 0}function aa(e){let t=e.flags??{};if(t.waitMs===void 0)return;let[r]=le(`waitMs`);if(!r)throw new n(`INTERNAL_ERROR`,`The waitMs option has no flag declaration whose bounds the daemon can enforce.`);return o(t,`waitMs`,{min:r.min,max:r.max})}function oa(e){let t=e.internal?.openDeviceWait?.waitedMs;return t===void 0?{}:{waitedMs:t}}function sa(e){return{...oa(e),offersDeviceWait:e.command===`open`&&typeof e.flags?.waitMs!=`number`}}function ca(e){let{req:t,budgetMs:n,sessionName:r,sessionStore:i,deviceId:a}=e;if(t.command===`open`&&n!==void 0&&!(a===void 0||i.get(r)))return ua({req:t,sessionName:r,sessionStore:i,deviceId:a,budgetMs:n})}function la(e,t,n){let r=e.findByDevice(t);if(!(!r||r.address===n))return r}function ua(e){let{req:t,sessionName:n,sessionStore:r,deviceId:i,budgetMs:a}=e,o=ge.fromTimeoutMs(a),s=()=>la(r,i,n),c=async()=>{for(;;){let e=s();if(!e||o.isExpired())return;Ae({type:`command`,status:`progress`,message:`Waiting for ${e.session.device.name}: held by session "${e.address}" (${Math.round(o.elapsedMs())}ms of the ${Math.round(a)}ms wait budget used)`}),await me(Math.min(250,o.remainingMs())),ke(t.meta?.requestId)}};return{waitForDeviceOutsideLocks:c,runWhenDeviceIsUnheld:async e=>{let{acquireLocks:n,task:r}=e;for(;;){let e=await n(async()=>{if(s()){if(!o.isExpired())return{ran:!1};da(t,o.elapsedMs())}return{ran:!0,outcome:await r()}});if(e.ran)return e.outcome;await c()}}}}function da(e,t){if(t<=0)return;let n=e.internal??={};n.openDeviceWait={waitedMs:t}}const fa={label:`Materialized paths`,plural:!0,expiredHint:`Materialized paths are released automatically when their TTL expires; re-run the command that materialized them if the paths are still needed.`},$=new Map;async function pa(e){let t=await j.mkdtemp(A.join(k.tmpdir(),`agent-device-materialized-`));try{let n=await va(e.installablePath,A.join(t,`installable`)),r=e.archivePath?await va(e.archivePath,A.join(t,`archive`)):void 0,i=pt.randomUUID(),a=e.ttlMs??9e5,o=Date.now()+a,s=setTimeout(()=>{ga(i)},a);return $.set(i,{rootPath:t,installablePath:n,archivePath:r,tenantId:e.tenantId,sessionName:e.sessionName,expiresAt:o,timer:s}),{materializationId:i,installablePath:n,...r?{archivePath:r}:{},expiresAt:new Date(o).toISOString()}}catch(e){throw await j.rm(t,{recursive:!0,force:!0}),e}}async function ma(e,t){await _a(e,Ne($,e,t,fa))}async function ha(e){let t=Array.from($.entries()).filter(([,t])=>t.sessionName===e);await Promise.all(t.map(async([e,t])=>{await _a(e,t)}))}async function ga(e){let t=$.get(e);if(t)try{await _a(e,t)}catch{}}async function _a(e,t){clearTimeout(t.timer),$.delete(e),await j.rm(t.rootPath,{recursive:!0,force:!0})}async function va(e,t){let n=await j.stat(e);await j.mkdir(t,{recursive:!0});let r=A.join(t,A.basename(e));return n.isDirectory()?(await j.cp(e,r,{recursive:!0}),r):(await j.copyFile(e,r),r)}function ya(e){return e.device.platform===`web`}function ba(e){return e.toArray().filter(e=>e.device.platform===`web`).map(e=>e.name)}async function xa(e){let t=e.sessionStore.refresh(e.ref);if(!t.session.appLog)return;let{forceCleanupSessionAppLog:n}=await import(`./app-log-session-resource.js`).then(e=>e.r);await n({...e,ref:t})}async function Sa(e){let t=ut(e.sessionStore,e.ref);t.read()&&await Ze({binding:t,intent:`disposal`})}async function Ca(e,t){await t.stopSnapshotHelper(e.device)}async function wa(e){let{ref:t,sessionStore:n,platformCleanup:r}=e,i=n.resolveCurrent(t)??t.session,a=t.address;await r.closeManagedBrowser({device:i.device,sessionName:a,stateDir:n.resolveDaemonStateDir(),openSessionNames:()=>ba(n)})}async function Ta(e){let t=[];for(let{step:n,run:r}of e)try{await r()}catch(e){t.push({step:n,error:e})}return t}function Ea(e){if(e.failures.length===0)return;let t=e.failures.map(({step:e})=>e),r=e.failures.map(({step:e,error:t})=>`${e}: ${t instanceof Error?t.message:String(t)}`);return c({level:`error`,phase:e.phase,data:{session:e.sessionName,failedSteps:t,errors:r}}),new n(`COMMAND_FAILED`,`Session cleanup left ${e.failures.length} resource(s) unreleased: ${r.join(`; `)}`,{reason:`session_cleanup_incomplete`,session:e.sessionName,failedSteps:t,hint:`Some session resources failed to release; inspect the session log for per-resource diagnostics. The session was still deleted, so retrying is safe.`})}async function Da(e){let{ref:t,sessionStore:r}=e,i=r.resolveCurrent(t)??t.session,a=t.address;if(!e.platformCleanup)throw new n(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`);let o=e.platformCleanup,s=[{step:`recording`,run:()=>Oa({ref:t,sessionStore:r})},...e.appLog===`run`?[{step:`app_log`,run:()=>xa({ref:t,sessionStore:r})}]:[],{step:`audio_probe`,run:()=>ka({ref:t,sessionStore:r})},{step:`perf_capture`,run:()=>Sa({ref:t,sessionStore:r})},{step:`platform_snapshot_helper`,run:()=>Ca(i,o)},{step:`web_browser`,run:()=>wa({ref:t,sessionStore:r,platformCleanup:o})}];s.push({step:`materialized_paths`,run:()=>ha(a)});let c=Ea({sessionName:a,phase:`session_teardown_cleanup_failed`,failures:await Ta(s)});if(c)throw c}async function Oa(e){let t=dt(e.sessionStore,e.ref);t.read()&&await ft({binding:t,intent:`disposal`})}async function ka(e){let t=lt(e.sessionStore,e.ref);t.read()&&await Ye({binding:t,intent:`disposal`})}function Aa(e){return f(e)&&e.kind===`simulator`}function ja(e){return e.platform===`android`&&e.kind===`emulator`}const Ma=[`platform`,`metroHost`,`metroPort`,`bundleUrl`,`launchUrl`];function Na(e){return e?[e.metroHost,e.metroPort,e.bundleUrl,e.launchUrl].filter(e=>e!==void 0&&e!==``).length:0}function Pa(e){if(!e)return{};let t={};return e.metroHost!==void 0&&(t.metroHost=e.metroHost),e.metroPort!==void 0&&(t.metroPort=String(e.metroPort)),e.bundleUrl!==void 0&&(t.bundleUrl=e.bundleUrl),e.launchUrl!==void 0&&(t.launchUrl=e.launchUrl),t}function Fa(e){return He(Pa(e))}function Ia(e,t){if(e!==void 0){if(typeof e!=`string`)throw new n(`INVALID_ARGS`,`Invalid open runtime ${t}: expected string.`);return v(e)}}function La(e){if(e!==void 0){if(!Number.isInteger(e)||e<1||e>65535)throw new n(`INVALID_ARGS`,`Invalid runtime metroPort: ${String(e)}. Use an integer between 1 and 65535.`);return e}}function Ra(e){if(e!==void 0){if(typeof e!=`number`)throw new n(`INVALID_ARGS`,`Invalid open runtime metroPort: expected integer.`);return La(e)}}function za(e,t,i){if(e===void 0)return i;if(!r(e))throw new n(`INVALID_ARGS`,`Invalid open runtime platform: ${String(e)}. Use "ios", "android", or "harmonyos".`);if(i&&e!==i)throw new n(`INVALID_ARGS`,`open runtime targets ${e}, but session "${t}" is bound to ${i}.`);return e}function Ba(e){if(r(e))return e}function Va(e,t){return{platform:t,metroHost:v(e?.metroHost),metroPort:La(e?.metroPort),bundleUrl:v(e?.bundleUrl),launchUrl:v(e?.launchUrl)}}function Ha(e,t){return{platform:t.platform??e?.platform,metroHost:t.metroHost??e?.metroHost,metroPort:t.metroPort??e?.metroPort,bundleUrl:t.bundleUrl??e?.bundleUrl,launchUrl:t.launchUrl??e?.launchUrl}}function Ua(e){if(ja(e))return`10.0.2.2`;if(Aa(e))return`127.0.0.1`}function Wa(e,t){if(!e||v(e.metroHost)||v(e.bundleUrl)||e.metroPort===void 0)return e;let n=Ua(t);return n?{...e,metroHost:n}:e}function Ga(e){let{runtime:t,sessionName:r,platform:i}=e;if(t===void 0)return;if(!t||typeof t!=`object`||Array.isArray(t))throw new n(`INVALID_ARGS`,`open runtime must be an object.`);let a=t,o=Object.keys(a).find(e=>!Ma.includes(e));if(o)throw new n(`INVALID_ARGS`,`Invalid open runtime field: ${o}. Supported fields are ${Ma.join(`, `)}.`);return{platform:za(a.platform,r,i),metroHost:Ia(a.metroHost,`metroHost`),metroPort:Ra(a.metroPort),bundleUrl:Ia(a.bundleUrl,`bundleUrl`),launchUrl:Ia(a.launchUrl,`launchUrl`)}}function Ka(e,t,n){if(n){if(Na(n)===0){e.setRuntimeHints(t,void 0);return}return e.setRuntimeHints(t,n),n}}function qa(e,t,r,i){let a=e.getRuntimeHints(t);if(!a)return;let o=r?p(r):void 0,s=Ba(o)??i;if(a.platform&&r&&!s)throw new n(`INVALID_ARGS`,`Session runtime hints are only supported on iOS, Android, and HarmonyOS sessions, but session "${t}" is bound to ${o}.`);if(a.platform&&s&&a.platform!==s)throw new n(`INVALID_ARGS`,`Session runtime hints target ${a.platform}, but session "${t}" is bound to ${o}. Clear the runtime hints or use a different session.`);return s&&a.platform!==s?{...a,platform:s}:a}function Ja(e){let{req:t,sessionStore:n,sessionName:r,device:i}=e,a=i?Ba(p(i)):e.platform,o=n.getRuntimeHints(r),s=Ga({runtime:t.runtime,sessionName:r,platform:a});if(t.runtime===void 0){let e=qa(n,r,i,a);return{runtime:i?Wa(e,i):e,previousRuntime:o,replacedStoredRuntime:!1}}let c=s&&Na(s)>0?s:void 0;return{runtime:i?Wa(c,i):c,previousRuntime:o,replacedStoredRuntime:!0}}function Ya(e){return Ja(e).runtime}function Xa(t){try{return{ok:!0,data:Ja(t)}}catch(t){let n=e(t);return i(n.code,n.message,n.details)}}async function Za(e){let{previousRuntime:t,clearRuntimeHints:n}=e;if(!Qa(e))return;let r=e.session;r?.appBundleId&&await n({appId:r.appBundleId,values:Pa(t)})}function Qa(e){return e.replacedStoredRuntime&&!!e.session?.appBundleId&&Fa(e.previousRuntime)&&!Fa(e.runtime)}function $a(e){let{device:t,owner:n,stateDir:r,intent:i}=e,a=i.kind===`exact-owner`&&se(i.owner,n)?ie(i.fence):null;if(!a)return{status:`binding-invalid`};let o=w(T(t)),s=qe(We(o));if(!s)return{status:`missing`};let c=s.allocatorClaim;return!c||!to(c.stateDir,r)||!se(Ke(c),n)?{status:`conflict`,conflict:s}:c.allocator.identityIncarnationId===a.identityIncarnationId?{status:`covered`}:{status:`incarnation-stale`,heldIncarnationId:c.allocator.identityIncarnationId}}function eo(e){let t=w(T(e));return Ue(We(t))}function to(e,t){return A.resolve(e)===A.resolve(t)}function no(e,t,n=`status`){let r=t.claim??t.allocatorClaim,i=p(r?{platform:r.device.family,appleOs:r.device.appleOs}:e),a=l(e.platform)?`--udid`:`--serial`;return[`agent-device device ${n}`,`--platform ${_e(i)}`,`${a} ${_e(e.id)}`,...n===`release`||Ge(t.classification)?[`--stale`]:[]].join(` `)}function ro(e,t){if(t.classification===`allocator-held`)return ao(e,t);let r=t.claim,i=no(e,t,Je(t.classification)?`release`:`status`),a=p(r?{platform:r.device.family,appleOs:r.device.appleOs}:e);return new n(`DEVICE_IN_USE`,r?`${a} device ${e.id} is owned by session "${r.session}" in workspace "${r.workspace}".`:`${e.name} has an ownership claim that could not be verified.`,{reason:po(t.classification),classification:t.classification,deviceKey:t.deviceKey,...r?{owner:{session:r.session,workspace:r.workspace,stateDir:r.stateDir}}:{},recovery:{command:i},hint:Je(t.classification)?`The recorded owner can no longer release this device; settle its resources and release the claim with: ${i}`:`Inspect the owner with: ${i}`,retriable:!1})}function io(e,t){return fo(ro(e,t))}function ao(e,t){let r=t.allocatorClaim,i=p({platform:r.device.family,appleOs:r.device.appleOs}),a=no(e,t);return new n(`DEVICE_IN_USE`,`${i} device ${e.id} is held by managed-device allocator "${r.allocator.instanceId}" for installation "${r.stateDir}".`,{reason:`DEVICE_CLAIM_ALLOCATOR_HELD`,classification:t.classification,deviceKey:t.deviceKey,owner:{kind:`allocator`,stateDir:r.stateDir,allocator:r.allocator},recovery:{command:a},hint:`This device belongs to a managed pool and is released only after its allocator proves the identity removed; inspect with: ${a}`,retriable:!1})}function oo(e,t){return new n(`COMMAND_FAILED`,`${p(e)} device ${e.id} is a managed identity with no allocator-held execution claim for this installation.`,{reason:`allocator-claim-missing`,owner:_(t),deviceKey:w(T(e)),retriable:!1,hint:`A managed identity becomes executable only after its allocator activates it and this installation holds its allocator-held claim.`})}function so(e,t,r){return new n(`COMMAND_FAILED`,`${p(e)} device ${e.id} is held for identity incarnation "${r}", which is not the incarnation this binding fences.`,{reason:`allocator-claim-incarnation-stale`,owner:_(t),deviceKey:w(T(e)),heldIncarnationId:r,retriable:!1,hint:`The managed identity was re-provisioned; obtain a new grant from the allocator.`})}function co(e,t){return new n(`COMMAND_FAILED`,`A managed local owner executes only under an exact-owner binding that carries a managed binding fence.`,{reason:`runtime-contract-invalid`,owner:_(t),deviceKey:w(T(e)),retriable:!1})}function lo(e,t,n){switch(n.status){case`binding-invalid`:return{admitted:!1,error:co(e,t)};case`missing`:return{admitted:!1,error:oo(e,t)};case`covered`:return{admitted:!0};case`incarnation-stale`:return{admitted:!1,error:so(e,t,n.heldIncarnationId)};case`conflict`:return{admitted:!1,error:ro(e,n.conflict)}}}function uo(e,t,n){let r=lo(e,t,n);return r.admitted?void 0:fo(r.error)}function fo(e){let{hint:t,retriable:n,...r}=e.details??{};return i(e.code,e.message,r,{hint:t,retriable:n})}function po(e){switch(e){case`live`:return`DEVICE_CLAIM_LIVE_OWNER`;case`owner-process-dead`:case`owner-daemon-superseded`:return`DEVICE_CLAIM_RECOVERY_PENDING`;case`owner-process-reused`:case`owner-state-dir-gone`:case`unknown`:case`inconsistent`:case`allocator-inconsistent`:return`DEVICE_CLAIM_OWNER_UNCERTAIN`}}function mo(e,t){if(t?.backend===`macos-app`)return`none`;switch(e.kind){case`local-family`:return`ordinary`;case`managed-local`:return`allocator-held`;case`provider-runtime`:return`none`}}export{ui as $,pa as A,Gi as B,Sa as C,Jt as Ct,ba as D,M as Dt,ya as E,Ut as Et,ta as F,Oi as G,Ui as H,na as I,Ni as J,ji as K,ea as L,sa as M,aa as N,ma as O,zt as Ot,ia as P,gi as Q,Qi as R,xa as S,Wt as St,Da as T,Ft as Tt,Ai as U,Wi as V,ki as W,Z as X,Pi as Y,Ei as Z,Ba as _,hn as _t,ro as a,Dn as at,Oa as b,en as bt,Va as c,bn as ct,Za as d,Sn as dt,si as et,Ha as f,mn as ft,Qa as g,gn as gt,Ka as h,dn as ht,lo as i,R as it,ca as j,ha as k,_t as kt,Na as l,yn as lt,Pa as m,pn as mt,uo as n,ri as nt,eo as o,En as ot,Ya as p,fn as pt,Mi as q,io as r,H as rt,$a as s,wn as st,mo as t,ii as tt,Fa as u,xn as ut,Xa as v,on as vt,Ca as w,Xt as wt,Ea as x,qt as xt,ka as y,tn as yt,$i as z};
@@ -1 +0,0 @@
1
- import{P as e}from"./sdk-contracts.js";import{f as t,g as n,m as r}from"./lease-registry-scope.js";const i=`/admin/human-control/holds`;function a(t){let n=s(t,`Human-control request body`),r=n.reason;if(r!==void 0&&(typeof r!=`string`||r.trim().length>512))throw new e(`INVALID_ARGS`,`Human-control reason must be at most 512 characters.`);let i=n.ttlMs;if(i!==void 0&&(typeof i!=`number`||!Number.isInteger(i)||i<1e3||i>864e5))throw new e(`INVALID_ARGS`,`Human-control ttlMs must be between 1000 and 86400000.`);return{...n.scope===void 0?{}:{scope:o(n.scope)},...typeof r==`string`&&r.trim()?{reason:r.trim()}:{},...typeof i==`number`?{ttlMs:i}:{}}}function o(i){let a=s(i,`Host human-control scope`);if(typeof a.backend!=`string`||!a.backend.trim()||typeof a.deviceKey!=`string`)throw new e(`INVALID_ARGS`,`Host human control requires scope.backend and scope.deviceKey.`);if(a.leaseProvider!==void 0&&typeof a.leaseProvider!=`string`)throw new e(`INVALID_ARGS`,`scope.leaseProvider must be a string.`);let o=n(a.leaseProvider);return{backend:r(a.backend),deviceKey:t(a.deviceKey),...o?{leaseProvider:o}:{}}}function s(t,n){if(!t||typeof t!=`object`||Array.isArray(t))throw new e(`INVALID_ARGS`,`${n} must be an object.`);return t}function c(t){let n=typeof t==`string`?t.trim():``;if(!/^[a-zA-Z0-9._-]{1,128}$/.test(n))throw new e(`INVALID_ARGS`,`Invalid human-control hold id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.`);return n}function l(e){return{...e,scope:{...e.scope}}}function u(t){return new e(`DEVICE_IN_USE`,`A human is interacting with this simulator or device; agent interactions are temporarily disabled.`,{reason:`human_control_active`,blockedBy:`human_control`,holdId:t.id,deviceKey:t.scope.deviceKey,pausedAt:new Date(t.createdAt).toISOString(),...t.expiresAt===void 0?{}:{expiresAt:new Date(t.expiresAt).toISOString()},...t.reason?{humanReason:t.reason}:{},hint:`Wait until the human-control hold is released before retrying.`})}export{a,c as i,l as n,u as r,i as t};
@@ -1 +0,0 @@
1
- import{P as e}from"./sdk-contracts.js";const t=[`auto`,`react-native`,`expo`,`repack`];function n(n){if(n!==void 0){if(t.includes(n))return n;throw new e(`INVALID_ARGS`,`metro prepare --kind must be auto, react-native, expo, or repack`)}}export{n as t};
@@ -1 +0,0 @@
1
- import{r as e}from"./rolldown-runtime.js";import{F as t}from"./sdk-contracts.js";import{t as n}from"./provider-webdriver.js";import{i as r}from"./provider-limrun-credentials.js";var i=e({DEFAULT_PROVIDER_RUNTIME_REQUIRED_IDS:()=>a,createDaemonProviderRuntimeComposition:()=>s,createDefaultProviderRuntimeComposition:()=>c,createProviderPlatformRuntimeRegistrations:()=>o});const a=[...n.providerIds,`limrun`];function o(e){return Object.freeze(e.flatMap(e=>l(e)?[{runtime:e,module:d(e)}]:[]))}async function s(e=process.env){let t=await c(e);try{let{loadProviderPlugins:n}=await import(`./load.js`),r=await n(e,a);return Object.freeze({...t,runtimes:Object.freeze([...t.runtimes,...r.map(({runtime:e})=>e)]),platformModules:Object.freeze([...t.platformModules,...r.map(({runtime:e,platformModule:t})=>({runtime:e,module:t}))])})}catch(e){throw await Promise.allSettled(t.runtimes.map(async e=>await e.shutdown())),e}}async function c(e=process.env){let i=n.createDefaultRuntimes(e),a=[...o(i)],s;try{s=r(e)}catch(e){return Object.freeze({runtimes:i,platformModules:Object.freeze(a),skipped:[{provider:`limrun`,error:t(e)}]})}if(!s)return Object.freeze({runtimes:i,platformModules:Object.freeze(a)});let[c,l]=await Promise.all([import(`./src.js`).then(e=>e.t),import(`./limrun-runtime-dependencies.js`).then(e=>e.n)]),u=c.createLimrunRuntime(s,l.createLimrunRuntimeDependencies(),{includePlatformModule:!0});return Object.freeze({runtimes:Object.freeze([...i,u.runtime]),platformModules:Object.freeze([...a,{runtime:u.runtime,module:u.platformModule}])})}function l(e){if(!(`owner`in e)||!(`loadRuntime`in e))return!1;let t=e.owner;return typeof e.loadRuntime==`function`&&u(t)&&t.provider===e.provider}function u(e){return typeof e==`object`&&!!e&&`kind`in e&&e.kind===`provider-runtime`&&`provider`in e&&typeof e.provider==`string`&&`instance`in e&&typeof e.instance==`string`}function d(e){return Object.freeze({owner:e.owner,loadRuntime:async t=>await e.loadRuntime(t)})}export{s as n,i as r,a as t};