agent-device 0.21.13 → 0.21.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (244) hide show
  1. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.13.apk → agent-device-android-ime-helper-0.21.14.apk} +0 -0
  2. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.14.apk.sha256 +1 -0
  3. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.13.manifest.json → agent-device-android-ime-helper-0.21.14.manifest.json} +4 -4
  4. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.14.apk +0 -0
  5. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.14.apk.sha256 +1 -0
  6. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.13.manifest.json → agent-device-android-snapshot-helper-0.21.14.manifest.json} +6 -6
  7. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +23 -0
  8. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AXSnapshotFallback.swift +12 -19
  9. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Alert.swift +19 -15
  10. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AlertObservation.swift +2 -3
  11. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +16 -20
  12. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+GestureExecution.swift +8 -13
  13. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Navigation.swift +16 -19
  14. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScrollDragExecution.swift +8 -24
  15. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SequenceExecution.swift +20 -42
  16. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Snapshot.swift +7 -14
  17. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotAcquisition.swift +17 -17
  18. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCapturePlan.swift +2 -3
  19. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedGesturePolicy.swift +48 -19
  20. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedInteraction.swift +0 -1
  21. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedTextEntry.swift +0 -7
  22. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TypeExecution.swift +7 -14
  23. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotCoordinateSpace.swift +16 -19
  24. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotGeometry.swift +21 -9
  25. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotModels.swift +59 -10
  26. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentationInvariant.swift +12 -10
  27. package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotVisibilityFold.swift +13 -8
  28. package/dist/src/absence-observation-errors.js +1 -1
  29. package/dist/src/adapter.js +1 -1
  30. package/dist/src/adb-executor.js +1 -1
  31. package/dist/src/adb-failure.js +1 -1
  32. package/dist/src/adb-transport.js +1 -1
  33. package/dist/src/agent-browser-provider.js +1 -1
  34. package/dist/src/agent-browser-tool.js +1 -1
  35. package/dist/src/agent-device-client.js +2 -2
  36. package/dist/src/ai-sdk.js +1 -1
  37. package/dist/src/alert-runtime.js +1 -1
  38. package/dist/src/app-catalog.js +1 -1
  39. package/dist/src/app-deployment-resolution.js +1 -1
  40. package/dist/src/app-inventory.js +1 -1
  41. package/dist/src/app-launch.js +1 -1
  42. package/dist/src/app-lifecycle.js +1 -1
  43. package/dist/src/app-lifecycle2.js +1 -1
  44. package/dist/src/app-log-files.js +1 -1
  45. package/dist/src/app-log-runtime2.js +1 -1
  46. package/dist/src/app-resolution.js +2 -2
  47. package/dist/src/apple-runner-platform.js +1 -1
  48. package/dist/src/application-lifecycle-interaction.js +1 -1
  49. package/dist/src/archive.js +1 -1
  50. package/dist/src/artifact-download.js +1 -1
  51. package/dist/src/auth-session.js +1 -1
  52. package/dist/src/auth.js +1 -1
  53. package/dist/src/backend-snapshot-options.js +1 -1
  54. package/dist/src/boot-diagnostics.js +1 -1
  55. package/dist/src/capture-disclosure.js +1 -1
  56. package/dist/src/capture.js +1 -1
  57. package/dist/src/cli-config.js +1 -1
  58. package/dist/src/cli-help.js +2 -2
  59. package/dist/src/cli.js +4 -4
  60. package/dist/src/click-button.js +1 -1
  61. package/dist/src/client-metro.js +1 -1
  62. package/dist/src/clipboard-shell-response.js +1 -1
  63. package/dist/src/command-schema.js +1 -1
  64. package/dist/src/command-tools.js +2 -2
  65. package/dist/src/connection-runtime.js +1 -1
  66. package/dist/src/connection.js +1 -1
  67. package/dist/src/contracts.js +1 -1
  68. package/dist/src/daemon-client-lifecycle.js +1 -1
  69. package/dist/src/daemon.js +1 -1
  70. package/dist/src/debug-symbols-facade.js +1 -1
  71. package/dist/src/device-claim-rule.js +2 -2
  72. package/dist/src/device-inventory-context.js +1 -1
  73. package/dist/src/device-rotation.js +1 -1
  74. package/dist/src/device-selection-resolver.js +1 -1
  75. package/dist/src/device-session.js +1 -1
  76. package/dist/src/device-shell.js +1 -1
  77. package/dist/src/device2.js +1 -1
  78. package/dist/src/devicectl.js +1 -1
  79. package/dist/src/diagnostics.js +1 -1
  80. package/dist/src/dispatch-resolve.js +1 -1
  81. package/dist/src/doctor2.js +1 -1
  82. package/dist/src/engine-eval-script.js +1 -1
  83. package/dist/src/error.js +1 -1
  84. package/dist/src/exec.js +1 -1
  85. package/dist/src/file.js +1 -1
  86. package/dist/src/find.js +1 -1
  87. package/dist/src/format.js +1 -1
  88. package/dist/src/gesture-plan.js +1 -1
  89. package/dist/src/gesture-runtime.js +1 -1
  90. package/dist/src/harmonyos.js +1 -1
  91. package/dist/src/helper.js +1 -1
  92. package/dist/src/human-control-contract.js +1 -1
  93. package/dist/src/human-control.js +1 -1
  94. package/dist/src/index.js +1 -1
  95. package/dist/src/input-actions.js +1 -1
  96. package/dist/src/input-actions2.js +1 -1
  97. package/dist/src/install-artifact-facade.js +1 -1
  98. package/dist/src/install-source-network-transport.js +1 -1
  99. package/dist/src/install-source2.js +1 -1
  100. package/dist/src/interaction-positionals.js +1 -1
  101. package/dist/src/interaction-ref-policy.js +1 -1
  102. package/dist/src/interaction2.js +1 -1
  103. package/dist/src/interactor-operation-binding.js +1 -1
  104. package/dist/src/interactor.js +1 -1
  105. package/dist/src/interactor2.js +1 -1
  106. package/dist/src/interactors.js +1 -1
  107. package/dist/src/internal/bin.js +1 -1
  108. package/dist/src/internal/daemon.js +2 -2
  109. package/dist/src/internal/png-worker.js +1 -1
  110. package/dist/src/internal/run-script-http-child.js +1 -1
  111. package/dist/src/inventory.js +1 -1
  112. package/dist/src/inventory2.js +1 -1
  113. package/dist/src/inventory3.js +1 -1
  114. package/dist/src/inventory5.js +1 -1
  115. package/dist/src/ios-snapshot-runtime.js +1 -1
  116. package/dist/src/lease.js +1 -1
  117. package/dist/src/limrun-download-file.js +1 -1
  118. package/dist/src/limrun-runtime-dependencies.js +1 -1
  119. package/dist/src/linux.js +1 -1
  120. package/dist/src/location-coordinates.js +1 -1
  121. package/dist/src/managed-device-scope.js +1 -1
  122. package/dist/src/mechanics.js +5 -5
  123. package/dist/src/multitouch-support.js +1 -1
  124. package/dist/src/native-build-cache.js +1 -0
  125. package/dist/src/observation.js +1 -1
  126. package/dist/src/parameterized-recorded-fill.js +1 -1
  127. package/dist/src/perf-facade.js +1 -1
  128. package/dist/src/perf-runtime-operation-builder.js +1 -1
  129. package/dist/src/perf-runtime-plan.js +1 -1
  130. package/dist/src/perf-target.js +2 -2
  131. package/dist/src/perf.js +1 -1
  132. package/dist/src/physical-device-control.js +1 -1
  133. package/dist/src/platform-runtime-host.js +1 -1
  134. package/dist/src/platform-runtime-managed-owner.js +1 -1
  135. package/dist/src/platform-runtime-open-target.js +1 -1
  136. package/dist/src/platform-runtime-operation-host.js +2 -2
  137. package/dist/src/platform-runtime-runtime-hints.js +1 -1
  138. package/dist/src/platform-runtime-screen-recording-apple-simulator-host.js +1 -1
  139. package/dist/src/platform-runtime-screen-recording-finalizer-host.js +1 -1
  140. package/dist/src/platform-runtime-screen-recording-process-host.js +1 -1
  141. package/dist/src/platform-runtime.js +1 -1
  142. package/dist/src/platform-runtime2.js +1 -1
  143. package/dist/src/png-crop-bytes.js +1 -1
  144. package/dist/src/png-size.js +1 -1
  145. package/dist/src/png-worker-client.js +1 -1
  146. package/dist/src/png.js +1 -1
  147. package/dist/src/prepare-kind.js +1 -1
  148. package/dist/src/provider-session-ownership.js +1 -1
  149. package/dist/src/provider-webdriver.js +1 -1
  150. package/dist/src/proxy.js +1 -1
  151. package/dist/src/quality-warnings.js +1 -1
  152. package/dist/src/react-native.js +1 -1
  153. package/dist/src/record-runtime.js +1 -1
  154. package/dist/src/recording.js +1 -1
  155. package/dist/src/register-builtins.js +1 -1
  156. package/dist/src/registry.js +13 -13
  157. package/dist/src/remote-config2.js +1 -1
  158. package/dist/src/replay-divergence.js +1 -1
  159. package/dist/src/replay.js +1 -1
  160. package/dist/src/reporting.js +1 -1
  161. package/dist/src/request-admission.js +1 -1
  162. package/dist/src/request-cancel.js +1 -1
  163. package/dist/src/request-runtime-binding.js +1 -1
  164. package/dist/src/retry.js +1 -1
  165. package/dist/src/runner-cache-metadata.js +1 -1
  166. package/dist/src/runner-client.js +1 -1
  167. package/dist/src/runner-dev-tools-security.js +1 -1
  168. package/dist/src/runner-device-readiness.js +1 -1
  169. package/dist/src/runner-disposal.js +1 -1
  170. package/dist/src/runner-error-classification.js +2 -2
  171. package/dist/src/runner.js +1 -1
  172. package/dist/src/runtime-transport-hints.js +1 -1
  173. package/dist/src/runtime.js +3 -3
  174. package/dist/src/runtime10.js +2 -2
  175. package/dist/src/runtime2.js +1 -1
  176. package/dist/src/runtime3.js +1 -1
  177. package/dist/src/runtime4.js +5 -5
  178. package/dist/src/runtime5.js +1 -1
  179. package/dist/src/runtime6.js +1 -1
  180. package/dist/src/runtime7.js +1 -1
  181. package/dist/src/runtime8.js +1 -1
  182. package/dist/src/runtime9.js +1 -1
  183. package/dist/src/screen-recording-admission-ledger.js +1 -1
  184. package/dist/src/screen-recording-completion.js +1 -1
  185. package/dist/src/screen-recording-options.js +1 -1
  186. package/dist/src/screen-recording-resource-recovery.js +1 -1
  187. package/dist/src/screenshot-density.js +1 -1
  188. package/dist/src/screenshot-image.js +1 -1
  189. package/dist/src/screenshot-runtime.js +1 -1
  190. package/dist/src/screenshot.js +1 -1
  191. package/dist/src/screenshot3.js +1 -1
  192. package/dist/src/script.js +1 -1
  193. package/dist/src/scroll-command.js +1 -1
  194. package/dist/src/scroll-gesture.js +1 -1
  195. package/dist/src/sdk-batch-runner.js +2 -2
  196. package/dist/src/sdk-batch.js +2 -2
  197. package/dist/src/sdk-contracts.d.ts +21 -2
  198. package/dist/src/sdk-contracts.js +1 -1
  199. package/dist/src/sdk-device.js +1 -1
  200. package/dist/src/sdk-io.js +1 -1
  201. package/dist/src/sdk-remote-config.js +1 -1
  202. package/dist/src/selector-runtime.js +1 -1
  203. package/dist/src/server.js +1 -1
  204. package/dist/src/session-allocation.js +1 -1
  205. package/dist/src/session-routing.js +1 -1
  206. package/dist/src/session-runtime-admission.js +1 -1
  207. package/dist/src/session-snapshot.js +1 -1
  208. package/dist/src/session-store.js +2 -2
  209. package/dist/src/session2.js +3 -3
  210. package/dist/src/settings.js +1 -1
  211. package/dist/src/simctl.js +1 -1
  212. package/dist/src/simulator-state.js +1 -1
  213. package/dist/src/simulator.js +1 -1
  214. package/dist/src/snapshot-runtime-binding.js +1 -1
  215. package/dist/src/snapshot-runtime.js +1 -1
  216. package/dist/src/snapshot-state.js +1 -1
  217. package/dist/src/snapshot2.js +1 -1
  218. package/dist/src/snapshot3.js +1 -1
  219. package/dist/src/snapshot4.js +1 -1
  220. package/dist/src/src.js +1 -1
  221. package/dist/src/src7.js +1 -1
  222. package/dist/src/src8.js +2 -2
  223. package/dist/src/string-enum.js +1 -1
  224. package/dist/src/takeover.js +1 -1
  225. package/dist/src/text-entry-focus.js +1 -1
  226. package/dist/src/tool-provider-facade.js +1 -1
  227. package/dist/src/tool-provider.js +2 -2
  228. package/dist/src/tool-provider2.js +1 -1
  229. package/dist/src/touch-runtime.js +1 -1
  230. package/dist/src/transport.js +1 -1
  231. package/dist/src/tv-remote.js +1 -1
  232. package/dist/src/type-text-runtime.js +1 -1
  233. package/dist/src/verified-file.js +1 -1
  234. package/dist/src/video.js +1 -1
  235. package/dist/src/viewport.js +1 -1
  236. package/dist/src/web.js +1 -1
  237. package/dist/src/web2.js +1 -1
  238. package/dist/src/webdriver-source.js +1 -1
  239. package/package.json +1 -1
  240. package/server.json +2 -2
  241. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.13.apk.sha256 +0 -1
  242. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.13.apk +0 -0
  243. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.13.apk.sha256 +0 -1
  244. package/dist/src/snapshot-process.js +0 -1
@@ -1 +1 @@
1
- import{r as e}from"./rolldown-runtime.js";import{D as t,F as n}from"./sdk-contracts.js";import{AsyncLocalStorage as r}from"node:async_hooks";var i=e({listDeviceInventory:()=>l,listLocalDeviceInventory:()=>d,readDeviceInventory:()=>u,readInstalledAppProbe:()=>c,shouldPropagateDeviceInventoryProbeError:()=>m,withDeviceInventoryContext:()=>s});const a=`device_inventory_context_unavailable`,o=new r;async function s(e,t){return await o.run(e,t)}function c(){return o.getStore()?.findInstalledApp}async function l(e){return await f(`providerFirst`,e)}async function u(e){let t=p(),n=await t.providerFirst.discoverWithSource(e,t.requestScope);return{devices:n.devices.map(e=>({...e})),source:n.source}}async function d(e){return await f(`localOnly`,e)}async function f(e,t){let n=p();return(await n[e].discover(t,n.requestScope)).map(e=>({...e}))}function p(){let e=o.getStore();if(!e)throw new t(`COMMAND_FAILED`,`Device inventory gateway is unavailable outside request execution`,{reason:a});return e}function m(e){return n(e)||e instanceof t&&e.code===`COMMAND_FAILED`&&e.details?.reason===a?!0:e instanceof Error&&e.name===`AbortError`}export{m as a,u as i,l as n,s as o,d as r,i as t};
1
+ import{r as e}from"./rolldown-runtime.js";import{I as t,O as n}from"./sdk-contracts.js";import{AsyncLocalStorage as r}from"node:async_hooks";var i=e({listDeviceInventory:()=>l,listLocalDeviceInventory:()=>d,readDeviceInventory:()=>u,readInstalledAppProbe:()=>c,shouldPropagateDeviceInventoryProbeError:()=>m,withDeviceInventoryContext:()=>s});const a=`device_inventory_context_unavailable`,o=new r;async function s(e,t){return await o.run(e,t)}function c(){return o.getStore()?.findInstalledApp}async function l(e){return await f(`providerFirst`,e)}async function u(e){let t=p(),n=await t.providerFirst.discoverWithSource(e,t.requestScope);return{devices:n.devices.map(e=>({...e})),source:n.source}}async function d(e){return await f(`localOnly`,e)}async function f(e,t){let n=p();return(await n[e].discover(t,n.requestScope)).map(e=>({...e}))}function p(){let e=o.getStore();if(!e)throw new n(`COMMAND_FAILED`,`Device inventory gateway is unavailable outside request execution`,{reason:a});return e}function m(e){return t(e)||e instanceof n&&e.code===`COMMAND_FAILED`&&e.details?.reason===a?!0:e instanceof Error&&e.name===`AbortError`}export{m as a,u as i,l as n,s as o,d as r,i as t};
@@ -1 +1 @@
1
- import{D as e}from"./sdk-contracts.js";const t=[`portrait`,`portrait-upside-down`,`landscape-left`,`landscape-right`],n={portrait:0,"landscape-left":1,"portrait-upside-down":2,"landscape-right":3};function r(e){return n[e]*90}function i(e){return n[e]%2==0?`PORTRAIT`:`LANDSCAPE`}function a(t){if(t===void 0)throw new e(`INVALID_ARGS`,`orientation requires an orientation argument. Use portrait|portrait-upside-down|landscape-left|landscape-right.`);switch(t?.trim().toLowerCase()){case`portrait`:return`portrait`;case`portrait-upside-down`:case`upside-down`:return`portrait-upside-down`;case`landscape-left`:case`left`:return`landscape-left`;case`landscape-right`:case`right`:return`landscape-right`;default:throw new e(`INVALID_ARGS`,`Invalid rotation: ${t}. Use portrait|portrait-upside-down|landscape-left|landscape-right.`)}}const o=[`closed`,`half-open`,`open`],s=`closed|half-open|open`;function c(e){if(Number.isFinite(e))return e<=l?`closed`:e>=u?`open`:`half-open`}const l=1,u=179;function d(t){if(t===void 0)throw new e(`INVALID_ARGS`,`fold requires a pose argument. Use ${s}.`);switch(t.trim().toLowerCase()){case`closed`:case`close`:case`fold`:case`folded`:return`closed`;case`half-open`:case`half`:case`half-unfolded`:case`partially-open`:case`book`:return`half-open`;case`open`:case`unfold`:case`unfolded`:case`fully-open`:case`flat`:return`open`;default:throw new e(`INVALID_ARGS`,`Invalid fold pose: ${t}. Use ${s}.`)}}const f=6e4;function p(t){if(t.keyframes===void 0){if(t.pose===void 0)throw new e(`INVALID_ARGS`,`fold requires a pose or keyframes`);if(typeof t.pose!=`string`)throw new e(`INVALID_ARGS`,`fold pose must be a string`);return{pose:d(t.pose)}}if(t.pose!==void 0)throw new e(`INVALID_ARGS`,`fold accepts either pose or keyframes`);return{keyframes:m(t.keyframes)}}function m(t){if(!Array.isArray(t)||t.length<2||t.length>64)throw new e(`INVALID_ARGS`,`fold requires 2–64 keyframes`);let n=t.map(g);if(n[0].atMs!==0||n.some((e,t)=>t>0&&e.atMs<=n[t-1].atMs))throw new e(`INVALID_ARGS`,`Fold keyframes must start at 0ms and increase strictly`);return n}function h(e,t){return typeof e==`number`&&Number.isFinite(e)&&e>=0&&e<=t}function g(t){if(!t||typeof t!=`object`||Array.isArray(t))throw new e(`INVALID_ARGS`,`Each fold keyframe requires atMs and angle`);let{atMs:n,angle:r}=t;if(Object.keys(t).some(e=>e!==`atMs`&&e!==`angle`))throw new e(`INVALID_ARGS`,`Fold keyframes only accept atMs and angle`);if(!h(n,6e4)||!Number.isSafeInteger(n))throw new e(`INVALID_ARGS`,`Fold keyframe times must be integers from 0 to ${f}ms`);if(!h(r,180))throw new e(`INVALID_ARGS`,`Fold keyframe angles must be finite numbers from 0 to 180`);return{atMs:n,angle:r}}function _(t){let n;try{n=JSON.parse(t)}catch{throw new e(`INVALID_ARGS`,`--keyframes requires a JSON array of {atMs, angle} objects`)}return m(n)}export{f as a,c,_ as d,d as f,s as i,a as l,n,i as o,o as r,r as s,t,p as u};
1
+ import{O as e}from"./sdk-contracts.js";const t=[`portrait`,`portrait-upside-down`,`landscape-left`,`landscape-right`],n={portrait:0,"landscape-left":1,"portrait-upside-down":2,"landscape-right":3};function r(e){return n[e]*90}function i(e){return n[e]%2==0?`PORTRAIT`:`LANDSCAPE`}function a(t){if(t===void 0)throw new e(`INVALID_ARGS`,`orientation requires an orientation argument. Use portrait|portrait-upside-down|landscape-left|landscape-right.`);switch(t?.trim().toLowerCase()){case`portrait`:return`portrait`;case`portrait-upside-down`:case`upside-down`:return`portrait-upside-down`;case`landscape-left`:case`left`:return`landscape-left`;case`landscape-right`:case`right`:return`landscape-right`;default:throw new e(`INVALID_ARGS`,`Invalid rotation: ${t}. Use portrait|portrait-upside-down|landscape-left|landscape-right.`)}}const o=[`closed`,`half-open`,`open`],s=`closed|half-open|open`;function c(e){if(Number.isFinite(e))return e<=l?`closed`:e>=u?`open`:`half-open`}const l=1,u=179;function d(t){if(t===void 0)throw new e(`INVALID_ARGS`,`fold requires a pose argument. Use ${s}.`);switch(t.trim().toLowerCase()){case`closed`:case`close`:case`fold`:case`folded`:return`closed`;case`half-open`:case`half`:case`half-unfolded`:case`partially-open`:case`book`:return`half-open`;case`open`:case`unfold`:case`unfolded`:case`fully-open`:case`flat`:return`open`;default:throw new e(`INVALID_ARGS`,`Invalid fold pose: ${t}. Use ${s}.`)}}const f=6e4;function p(t){if(t.keyframes===void 0){if(t.pose===void 0)throw new e(`INVALID_ARGS`,`fold requires a pose or keyframes`);if(typeof t.pose!=`string`)throw new e(`INVALID_ARGS`,`fold pose must be a string`);return{pose:d(t.pose)}}if(t.pose!==void 0)throw new e(`INVALID_ARGS`,`fold accepts either pose or keyframes`);return{keyframes:m(t.keyframes)}}function m(t){if(!Array.isArray(t)||t.length<2||t.length>64)throw new e(`INVALID_ARGS`,`fold requires 2–64 keyframes`);let n=t.map(g);if(n[0].atMs!==0||n.some((e,t)=>t>0&&e.atMs<=n[t-1].atMs))throw new e(`INVALID_ARGS`,`Fold keyframes must start at 0ms and increase strictly`);return n}function h(e,t){return typeof e==`number`&&Number.isFinite(e)&&e>=0&&e<=t}function g(t){if(!t||typeof t!=`object`||Array.isArray(t))throw new e(`INVALID_ARGS`,`Each fold keyframe requires atMs and angle`);let{atMs:n,angle:r}=t;if(Object.keys(t).some(e=>e!==`atMs`&&e!==`angle`))throw new e(`INVALID_ARGS`,`Fold keyframes only accept atMs and angle`);if(!h(n,6e4)||!Number.isSafeInteger(n))throw new e(`INVALID_ARGS`,`Fold keyframe times must be integers from 0 to ${f}ms`);if(!h(r,180))throw new e(`INVALID_ARGS`,`Fold keyframe angles must be finite numbers from 0 to 180`);return{atMs:n,angle:r}}function _(t){let n;try{n=JSON.parse(t)}catch{throw new e(`INVALID_ARGS`,`--keyframes requires a JSON array of {atMs, angle} objects`)}return m(n)}export{f as a,c,_ as d,d as f,s as i,a as l,n,i as o,o as r,r as s,t,p as u};
@@ -1 +1 @@
1
- import{r as e}from"./rolldown-runtime.js";import{D as t}from"./sdk-contracts.js";import{C as n,d as r,g as i,s as a,v as o}from"./sdk-device.js";var s=e({markSelectionBootOccurred:()=>u,resolveExistingSessionDeviceSelection:()=>l,resolveInventoryDeviceSelection:()=>c});async function c(e){let{devices:t,selector:r,source:i}=e,s=a(r);if(i===`provider`&&!s)return p(t,r);if(i===`local`&&!s){let n=await m(t,r,e.appleSimulatorAppTarget);if(n)return n}let c=t.filter(e=>o(e,r,{includeExplicitSelectors:s}));try{return d(await n([...t],r),c,{explicitSelector:s,source:i})}catch(e){throw h(e,c)}}function l(e){return{device:e,reason:`existing-session`,source:`session`,candidateCount:1,bootOccurred:!1}}function u(e){if(!e||e.source!==`local`)return e;let{device:t}=e;return t.booted!==!0&&(t.kind===`simulator`||t.kind===`emulator`)?{...e,bootOccurred:!0}:e}function d(e,t,n){return{device:e,reason:n.explicitSelector?`explicit-selector`:n.source===`provider`?`single-provider-device`:f(e,t),source:n.source,candidateCount:t.length,bootOccurred:!1}}function f(e,t){return e.booted===!0&&t.filter(e=>e.booted===!0).length===1?`single-booted-local`:!e.booted&&t.length===1?`single-bootable-local`:`preferred-local`}async function p(e,r){let i=e.filter(e=>o(e,r)),a=i[0];if(a!==void 0&&i.length===1)return d(a,i,{explicitSelector:!1,source:`provider`});try{await n([...e],r)}catch(e){throw h(e,i)}throw new t(`AMBIGUOUS_MATCH`,`Multiple provider devices match this request.`,{...g(i),matches:i.length,hint:`Select the leased provider device explicitly with --device, --udid, or --serial.`,retrySelectors:_(i)})}async function m(e,n,i){let a=i?.trim();if(!a)return;let{readInstalledAppProbe:s}=await import(`./device-inventory-context.js`).then(e=>e.t),c=s();if(!c)return;let l=e.filter(e=>o(e,n)&&r(e)&&e.kind===`simulator`&&e.booted===!0);if(l.length<2)return;let u=(await Promise.all(l.map(async e=>await c(e,a)?e:void 0))).filter(e=>e!==void 0),d=u[0];if(d!==void 0&&u.length===1)return{device:d,reason:`single-app-installed-local`,source:`local`,candidateCount:1,bootOccurred:!1};throw u.length===0?new t(`APP_NOT_INSTALLED`,`No booted iOS simulator has ${a} installed`,{appTarget:a,...g(l),hint:`Install the app on a booted simulator, or pass --udid to select the intended device explicitly.`,retrySelectors:_(l)}):new t(`AMBIGUOUS_MATCH`,`Multiple booted iOS simulators have ${a} installed`,{appTarget:a,...g(u),hint:`Pass --udid to select the intended simulator explicitly.`,retrySelectors:_(u)})}function h(e,n){return!(e instanceof t)||e.code!==`AMBIGUOUS_MATCH`?e:new t(e.code,e.message,{...e.details??{},...g(n),retrySelectors:_(n)},e)}function g(e){return{devices:e.slice(0,10).map(e=>({id:e.id,name:e.name}))}}function _(e){return e.slice(0,10).flatMap(e=>[{flag:i(e.platform)?`--serial`:`--udid`,value:e.id},{flag:`--device`,value:e.name}])}export{u as n,l as r,s as t};
1
+ import{r as e}from"./rolldown-runtime.js";import{O as t}from"./sdk-contracts.js";import{C as n,d as r,g as i,s as a,v as o}from"./sdk-device.js";var s=e({markSelectionBootOccurred:()=>u,resolveExistingSessionDeviceSelection:()=>l,resolveInventoryDeviceSelection:()=>c});async function c(e){let{devices:t,selector:r,source:i}=e,s=a(r);if(i===`provider`&&!s)return p(t,r);if(i===`local`&&!s){let n=await m(t,r,e.appleSimulatorAppTarget);if(n)return n}let c=t.filter(e=>o(e,r,{includeExplicitSelectors:s}));try{return d(await n([...t],r),c,{explicitSelector:s,source:i})}catch(e){throw h(e,c)}}function l(e){return{device:e,reason:`existing-session`,source:`session`,candidateCount:1,bootOccurred:!1}}function u(e){if(!e||e.source!==`local`)return e;let{device:t}=e;return t.booted!==!0&&(t.kind===`simulator`||t.kind===`emulator`)?{...e,bootOccurred:!0}:e}function d(e,t,n){return{device:e,reason:n.explicitSelector?`explicit-selector`:n.source===`provider`?`single-provider-device`:f(e,t),source:n.source,candidateCount:t.length,bootOccurred:!1}}function f(e,t){return e.booted===!0&&t.filter(e=>e.booted===!0).length===1?`single-booted-local`:!e.booted&&t.length===1?`single-bootable-local`:`preferred-local`}async function p(e,r){let i=e.filter(e=>o(e,r)),a=i[0];if(a!==void 0&&i.length===1)return d(a,i,{explicitSelector:!1,source:`provider`});try{await n([...e],r)}catch(e){throw h(e,i)}throw new t(`AMBIGUOUS_MATCH`,`Multiple provider devices match this request.`,{...g(i),matches:i.length,hint:`Select the leased provider device explicitly with --device, --udid, or --serial.`,retrySelectors:_(i)})}async function m(e,n,i){let a=i?.trim();if(!a)return;let{readInstalledAppProbe:s}=await import(`./device-inventory-context.js`).then(e=>e.t),c=s();if(!c)return;let l=e.filter(e=>o(e,n)&&r(e)&&e.kind===`simulator`&&e.booted===!0);if(l.length<2)return;let u=(await Promise.all(l.map(async e=>await c(e,a)?e:void 0))).filter(e=>e!==void 0),d=u[0];if(d!==void 0&&u.length===1)return{device:d,reason:`single-app-installed-local`,source:`local`,candidateCount:1,bootOccurred:!1};throw u.length===0?new t(`APP_NOT_INSTALLED`,`No booted iOS simulator has ${a} installed`,{appTarget:a,...g(l),hint:`Install the app on a booted simulator, or pass --udid to select the intended device explicitly.`,retrySelectors:_(l)}):new t(`AMBIGUOUS_MATCH`,`Multiple booted iOS simulators have ${a} installed`,{appTarget:a,...g(u),hint:`Pass --udid to select the intended simulator explicitly.`,retrySelectors:_(u)})}function h(e,n){return!(e instanceof t)||e.code!==`AMBIGUOUS_MATCH`?e:new t(e.code,e.message,{...e.details??{},...g(n),retrySelectors:_(n)},e)}function g(e){return{devices:e.slice(0,10).map(e=>({id:e.id,name:e.name}))}}function _(e){return e.slice(0,10).flatMap(e=>[{flag:i(e.platform)?`--serial`:`--udid`,value:e.id},{flag:`--device`,value:e.name}])}export{u as n,l as r,s as t};
@@ -1 +1 @@
1
- import{D as e}from"./sdk-contracts.js";import{i as t}from"./sdk-batch-runner.js";import{n}from"./app-inventory.js";import"./device.js";import{t as r}from"./request-cancellation.js";import{n as i,t as a}from"./ios-client.js";import{i as o}from"./snapshot.js";import s from"node:path";import c from"node:fs";import l from"node:os";import{setTimeout as u}from"node:timers/promises";function d(e){return e?.trim()||void 0}async function f(e,t){let n=await i({apiUrl:e.apiUrl,adbUrl:e.adbUrl,token:e.token,logLevel:`warn`}),r={platform:`android`,lease:e.lease,instanceId:e.instanceId,device:e.device,client:n,token:e.token,dependencies:t},a={exec:async(e,t)=>await v(r,e,t),text:async e=>{await n.setText(e.target,e.text)}};return a.reverse=await t.android.createPortReverse(a.exec),Object.assign(r,{adbProvider:a})}function p(e){return e.dependencies.android.createInteractor(e.device,e.adbProvider)}async function m(e,t,n,i,a,o){a?.throwIfAborted();let s=d(i?.packageNameHint);i?.relaunch&&s&&await t.dependencies.android.forceStopApp(async(e,n)=>await v(t,e,n),s,a);let c=await r(o,e.assets.getOrUpload({path:n,name:w(s,n)},{signal:a}),a);await r(o,t.client.sendAsset(c.signedDownloadUrl),a),a?.throwIfAborted();let l=s?await t.dependencies.android.inferAppName(s):void 0;return{...s?{packageName:s,launchTarget:s}:{},...l?{appName:l}:{}}}async function h(e,t){await e.adbProvider.reverse?.ensure({local:C(t.devicePort),remote:C(t.hostPort),ownerId:t.name})}async function g(e){await e.adbTunnelPromise?.catch(()=>{});let t=e.adbSerial;t&&(await _(e),await e.dependencies.host.runAdb(e.dependencies.android.hostAdbInvocation([`disconnect`,t]),{allowFailure:!0,timeoutMs:1e4}).catch(()=>{})),e.adbTunnel?.close(),e.adbTunnel=void 0,e.adbSerial=void 0,e.adbTunnelPromise=void 0}async function _(e){let t=e.adbProvider.reverse;if(!t?.list)return;let n=await t.list().catch(()=>[]),r=new Set,i=[];for(let e of n)e.ownerId?r.add(e.ownerId):i.push(e.local);await Promise.allSettled([...[...r].map(async e=>await t.removeAllOwned(e)),...i.map(async e=>await t.remove(e))])}async function v(e,t,n){let{invocation:r,result:i}=await y(e,t,n);return await b(r,i,n?.allowFailure,e.dependencies)}async function y(e,t,n){let r=await x(e),i=e.dependencies.android.deviceAdbInvocation(r,t);return{invocation:i,result:await e.dependencies.host.runAdb(i,{allowFailure:n?.allowFailure,binaryStdout:n?.binaryStdout,stdin:n?.stdin,timeoutMs:n?.timeoutMs??3e4,signal:n?.signal})}}async function b(e,t,n,r){if(t.exitCode!==0&&n!==!0)throw await r.android.adbError(`Limrun Android ADB command failed`,t,e);return t}async function x(e){if(e.adbSerial)return e.adbSerial;let t=e.adbTunnelPromise??S(e);e.adbTunnelPromise=t;try{return await t}catch(n){throw e.adbTunnelPromise===t&&(e.adbTunnelPromise=void 0),n}}async function S(e){let t=await e.client.startAdbTunnel(),n=`${t.address.address}:${t.address.port}`;return e.adbTunnel=t,e.adbSerial=n,n}function C(t){if(!Number.isInteger(t)||t<1||t>65535)throw new e(`INVALID_ARGS`,`Invalid Android tcp reverse port: ${t}`);return`tcp:${t}`}function w(e,t){let n=s.extname(t)||`.apk`;return`${e?.replaceAll(/[^a-zA-Z0-9_.-]+/g,`-`)||`android-app`}${n}`}async function T(e,t){let n=await a({apiUrl:e.apiUrl,token:e.token,logLevel:`warn`});return{platform:`ios`,lease:e.lease,instanceId:e.instanceId,device:e.device,client:n,token:e.token,dependencies:t}}async function E(e,t,n,i,a,o){a?.throwIfAborted();let s=await A(n,t.dependencies);try{a?.throwIfAborted();let n=await r(o,e.assets.getOrUpload({path:s.uploadPath,name:s.assetName},{signal:a}),a),c=(await D(t,n.signedDownloadUrl,{md5:n.md5,relaunch:i?.relaunch,appIdentifierHint:i?.appIdentifierHint},a,o)).appId;return{...c?{bundleId:c,launchTarget:c}:{},...s.appName?{appName:s.appName}:{}}}finally{await s.cleanup()}}async function D(t,n,i,a,o){a?.throwIfAborted();let s=await r(o,t.client.listApps(),a).catch(e=>{if(a?.aborted)throw e}),c=d((await r(o,t.client.installApp(n,{md5:i?.md5,launchMode:i?.relaunch?`RelaunchIfRunning`:`ForegroundIfRunning`}),a)).bundleId),l=d(i?.appIdentifierHint),f=[];for(let e of M){e>0&&await u(e,void 0,{signal:a}),f=await r(o,t.client.listApps(),a);let n=F({resultBundleId:c,requestedBundleId:l,beforeInstallApps:s,afterInstallApps:f});if(n)return{appId:n}}throw new e(`COMMAND_FAILED`,`Limrun iOS app installation could not be verified.`,{resultBundleId:c,requestedBundleId:l,installedUserApps:f.filter(L).map(e=>e.bundleId).sort()})}function O(e){return new k(e)}var k=class{session;constructor(e){this.session=e}async open(e,n){if(n?.url){await this.session.client.launchApp(await this.session.dependencies.ios.resolveAppAlias(e)),await this.session.client.openUrl(n.url);return}if(t(e)){await this.session.client.openUrl(e);return}await this.session.client.launchApp(await this.session.dependencies.ios.resolveAppAlias(e))}async openDevice(){}async close(e){e&&await this.session.client.terminateApp(await this.session.dependencies.ios.resolveAppAlias(e)).catch(()=>{})}async tap(e,t){await this.session.client.tap(e,t)}async tapElementSelector(e){await this.session.client.tapElement(o(e))}async doubleTap(e,t){await this.session.client.performActions([{type:`tap`,x:e,y:t},{type:`wait`,durationMs:P},{type:`tap`,x:e,y:t}])}async longPress(e,t,n=N){await this.session.client.performActions([{type:`touchDown`,x:e,y:t},{type:`wait`,durationMs:n},{type:`touchUp`,x:e,y:t}])}async focus(e,t){await this.tap(e,t)}async type(e,t){await this.enterText(e,t)}async fill(e,t,n,r){let{awaitLimrunTextEntryFocus:i,readLimrunUnambiguousTapTargets:a,readLimrunTextEntryFocus:o}=await import(`./text-entry-focus.js`),s=a(await this.session.client.elementTree(),e,t);await this.tap(e,t);let c=await i({targetsAtPoint:s,readFocus:async()=>o(await this.session.client.elementTree()),sleep:e=>u(e),x:e,y:t});return await this.session.client.pressKey(`a`,[`command`]),n.length===0?(await this.session.client.pressKey(`delete`),{textEntryReadiness:c}):(await this.enterText(n,r),{textEntryReadiness:c})}async enterText(e,t){if(t&&t>0){for(let n of Array.from(e))await this.session.client.typeText(n,!1,{requireFocus:!1}),await u(t);return}await this.session.client.typeText(e,!1,{requireFocus:!1})}async scroll(e,t){await this.session.client.scroll(e,t?.pixels??300)}async screenshot(e){let{transcodeScreenshotToPngAsync:t}=await import(`./png-worker-client.js`).then(e=>e.s),n=await this.session.client.screenshot(),r=await t(Buffer.from(n.base64,`base64`),`Limrun iOS screenshot`);c.mkdirSync(s.dirname(e),{recursive:!0}),await c.promises.writeFile(e,r)}async snapshot(){let{captureLimrunIosSnapshot:e}=await import(`./ios-snapshot-adapter.js`);return await e(this.session)}async back(){await this.session.client.pressKey(`escape`)}async setOrientation(e){if(e===`portrait-upside-down`)throw R(`orientation`,`Limrun iOS direct sessions support portrait and landscape orientation, not portrait upside-down.`);await this.session.client.setOrientation(e===`portrait`?`Portrait`:`Landscape`)}async setSetting(){throw R(`settings`,`Limrun iOS direct sessions do not expose settings changes yet.`)}};async function A(e,t){if(!(await c.promises.stat(e)).isDirectory())return{uploadPath:e,assetName:s.basename(e),appName:j(e),cleanup:async()=>{}};let n=await c.promises.mkdtemp(s.join(l.tmpdir(),`agent-device-limrun-ios-app-`)),r=s.join(n,`${s.basename(e)}.zip`);try{await t.host.archiveDirectory({sourceDirectory:s.dirname(e),entryName:s.basename(e),archivePath:r})}catch(e){throw await c.promises.rm(n,{recursive:!0,force:!0}),e}return{uploadPath:r,assetName:s.basename(r),appName:await t.ios.readBundleAppName(e)??j(e),cleanup:async()=>{await c.promises.rm(n,{recursive:!0,force:!0})}}}function j(e){return s.basename(e).replace(/\.(?:app|ipa|apk|aab|zip)$/i,``)||void 0}const M=[0,250],N=800,P=80;function F(e){let t=new Set(e.afterInstallApps.map(e=>e.bundleId));return(e.resultBundleId&&t.has(e.resultBundleId)?e.resultBundleId:void 0)??(e.requestedBundleId&&t.has(e.requestedBundleId)?e.requestedBundleId:void 0)??I(e.beforeInstallApps,e.afterInstallApps)}function I(e,t){if(!e)return;let n=new Set(e.map(e=>e.bundleId)),r=t.filter(e=>L(e)&&!n.has(e.bundleId));return r.length===1?r[0]?.bundleId:void 0}function L(e){return!e.bundleId.startsWith(`com.apple.`)&&!e.installType.toLowerCase().includes(`system`)}function R(t,n){throw new e(`UNSUPPORTED_OPERATION`,n,{command:t})}function z(e){return e.platform===`android`?B(e):V(e)}function B(e){let t=e.adbProvider.exec;return{platform:`android`,device:e.device,interactor:p(e),adb:e.adbProvider,listApps:async r=>await e.dependencies.android.listApps(t,n(r)),getForegroundApp:async n=>await e.dependencies.android.getForegroundApp(e.device,t,n),pressKey:async(t,n)=>{await e.client.pressKey(t,n)},getKeyboardState:async()=>await e.dependencies.android.getKeyboardState(t),dismissKeyboard:async()=>await e.dependencies.android.dismissKeyboard(t),readLogs:async n=>await e.dependencies.android.readLogs(t,n),...H(e.client,e.token,e.dependencies.host),installRemoteApp:async t=>{await e.client.sendAsset(t)}}}function V(e){return{platform:`ios`,device:e.device,interactor:O(e),viewport:{width:e.client.deviceInfo.screenWidth,height:e.client.deviceInfo.screenHeight},listApps:async t=>(await e.client.listApps()).filter(e=>n(t)===`all`||L(e)).map(e=>({id:e.bundleId,name:e.name,installType:e.installType})).sort((e,t)=>e.id.localeCompare(t.id)),pressKey:async(t,n)=>{await e.client.pressKey(t,n)},readLogs:async(t,n)=>await e.client.appLogTail(t,n),...H(e.client,e.token,e.dependencies.host),installRemoteApp:async(t,n)=>await D(e,t,n),runSimctl:t=>e.client.simctl(t)}}function H(e,t,n){return{startRecording:async t=>{await e.startRecording(t)},stopRecording:async()=>({downloadUrl:await e.stopRecording({})}),downloadRecording:async e=>{await n.downloadFile({url:e.downloadUrl,headers:{Authorization:`Bearer ${t}`},destinationPath:e.outPath,timeoutMs:6e4})}}}export{g as a,f as c,E as i,m as l,O as n,h as o,T as r,p as s,z as t};
1
+ import{O as e}from"./sdk-contracts.js";import{i as t}from"./sdk-batch-runner.js";import{n}from"./app-inventory.js";import"./device.js";import{t as r}from"./request-cancellation.js";import{n as i,t as a}from"./ios-client.js";import{i as o}from"./snapshot.js";import s from"node:path";import c from"node:fs";import l from"node:os";import{setTimeout as u}from"node:timers/promises";function d(e){return e?.trim()||void 0}async function f(e,t){let n=await i({apiUrl:e.apiUrl,adbUrl:e.adbUrl,token:e.token,logLevel:`warn`}),r={platform:`android`,lease:e.lease,instanceId:e.instanceId,device:e.device,client:n,token:e.token,dependencies:t},a={exec:async(e,t)=>await v(r,e,t),text:async e=>{await n.setText(e.target,e.text)}};return a.reverse=await t.android.createPortReverse(a.exec),Object.assign(r,{adbProvider:a})}function p(e){return e.dependencies.android.createInteractor(e.device,e.adbProvider)}async function m(e,t,n,i,a,o){a?.throwIfAborted();let s=d(i?.packageNameHint);i?.relaunch&&s&&await t.dependencies.android.forceStopApp(async(e,n)=>await v(t,e,n),s,a);let c=await r(o,e.assets.getOrUpload({path:n,name:w(s,n)},{signal:a}),a);await r(o,t.client.sendAsset(c.signedDownloadUrl),a),a?.throwIfAborted();let l=s?await t.dependencies.android.inferAppName(s):void 0;return{...s?{packageName:s,launchTarget:s}:{},...l?{appName:l}:{}}}async function h(e,t){await e.adbProvider.reverse?.ensure({local:C(t.devicePort),remote:C(t.hostPort),ownerId:t.name})}async function g(e){await e.adbTunnelPromise?.catch(()=>{});let t=e.adbSerial;t&&(await _(e),await e.dependencies.host.runAdb(e.dependencies.android.hostAdbInvocation([`disconnect`,t]),{allowFailure:!0,timeoutMs:1e4}).catch(()=>{})),e.adbTunnel?.close(),e.adbTunnel=void 0,e.adbSerial=void 0,e.adbTunnelPromise=void 0}async function _(e){let t=e.adbProvider.reverse;if(!t?.list)return;let n=await t.list().catch(()=>[]),r=new Set,i=[];for(let e of n)e.ownerId?r.add(e.ownerId):i.push(e.local);await Promise.allSettled([...[...r].map(async e=>await t.removeAllOwned(e)),...i.map(async e=>await t.remove(e))])}async function v(e,t,n){let{invocation:r,result:i}=await y(e,t,n);return await b(r,i,n?.allowFailure,e.dependencies)}async function y(e,t,n){let r=await x(e),i=e.dependencies.android.deviceAdbInvocation(r,t);return{invocation:i,result:await e.dependencies.host.runAdb(i,{allowFailure:n?.allowFailure,binaryStdout:n?.binaryStdout,stdin:n?.stdin,timeoutMs:n?.timeoutMs??3e4,signal:n?.signal})}}async function b(e,t,n,r){if(t.exitCode!==0&&n!==!0)throw await r.android.adbError(`Limrun Android ADB command failed`,t,e);return t}async function x(e){if(e.adbSerial)return e.adbSerial;let t=e.adbTunnelPromise??S(e);e.adbTunnelPromise=t;try{return await t}catch(n){throw e.adbTunnelPromise===t&&(e.adbTunnelPromise=void 0),n}}async function S(e){let t=await e.client.startAdbTunnel(),n=`${t.address.address}:${t.address.port}`;return e.adbTunnel=t,e.adbSerial=n,n}function C(t){if(!Number.isInteger(t)||t<1||t>65535)throw new e(`INVALID_ARGS`,`Invalid Android tcp reverse port: ${t}`);return`tcp:${t}`}function w(e,t){let n=s.extname(t)||`.apk`;return`${e?.replaceAll(/[^a-zA-Z0-9_.-]+/g,`-`)||`android-app`}${n}`}async function T(e,t){let n=await a({apiUrl:e.apiUrl,token:e.token,logLevel:`warn`});return{platform:`ios`,lease:e.lease,instanceId:e.instanceId,device:e.device,client:n,token:e.token,dependencies:t}}async function E(e,t,n,i,a,o){a?.throwIfAborted();let s=await A(n,t.dependencies);try{a?.throwIfAborted();let n=await r(o,e.assets.getOrUpload({path:s.uploadPath,name:s.assetName},{signal:a}),a),c=(await D(t,n.signedDownloadUrl,{md5:n.md5,relaunch:i?.relaunch,appIdentifierHint:i?.appIdentifierHint},a,o)).appId;return{...c?{bundleId:c,launchTarget:c}:{},...s.appName?{appName:s.appName}:{}}}finally{await s.cleanup()}}async function D(t,n,i,a,o){a?.throwIfAborted();let s=await r(o,t.client.listApps(),a).catch(e=>{if(a?.aborted)throw e}),c=d((await r(o,t.client.installApp(n,{md5:i?.md5,launchMode:i?.relaunch?`RelaunchIfRunning`:`ForegroundIfRunning`}),a)).bundleId),l=d(i?.appIdentifierHint),f=[];for(let e of M){e>0&&await u(e,void 0,{signal:a}),f=await r(o,t.client.listApps(),a);let n=F({resultBundleId:c,requestedBundleId:l,beforeInstallApps:s,afterInstallApps:f});if(n)return{appId:n}}throw new e(`COMMAND_FAILED`,`Limrun iOS app installation could not be verified.`,{resultBundleId:c,requestedBundleId:l,installedUserApps:f.filter(L).map(e=>e.bundleId).sort()})}function O(e){return new k(e)}var k=class{session;constructor(e){this.session=e}async open(e,n){if(n?.url){await this.session.client.launchApp(await this.session.dependencies.ios.resolveAppAlias(e)),await this.session.client.openUrl(n.url);return}if(t(e)){await this.session.client.openUrl(e);return}await this.session.client.launchApp(await this.session.dependencies.ios.resolveAppAlias(e))}async openDevice(){}async close(e){e&&await this.session.client.terminateApp(await this.session.dependencies.ios.resolveAppAlias(e)).catch(()=>{})}async tap(e,t){await this.session.client.tap(e,t)}async tapElementSelector(e){await this.session.client.tapElement(o(e))}async doubleTap(e,t){await this.session.client.performActions([{type:`tap`,x:e,y:t},{type:`wait`,durationMs:P},{type:`tap`,x:e,y:t}])}async longPress(e,t,n=N){await this.session.client.performActions([{type:`touchDown`,x:e,y:t},{type:`wait`,durationMs:n},{type:`touchUp`,x:e,y:t}])}async focus(e,t){await this.tap(e,t)}async type(e,t){await this.enterText(e,t)}async fill(e,t,n,r){let{awaitLimrunTextEntryFocus:i,readLimrunUnambiguousTapTargets:a,readLimrunTextEntryFocus:o}=await import(`./text-entry-focus.js`),s=a(await this.session.client.elementTree(),e,t);await this.tap(e,t);let c=await i({targetsAtPoint:s,readFocus:async()=>o(await this.session.client.elementTree()),sleep:e=>u(e),x:e,y:t});return await this.session.client.pressKey(`a`,[`command`]),n.length===0?(await this.session.client.pressKey(`delete`),{textEntryReadiness:c}):(await this.enterText(n,r),{textEntryReadiness:c})}async enterText(e,t){if(t&&t>0){for(let n of Array.from(e))await this.session.client.typeText(n,!1,{requireFocus:!1}),await u(t);return}await this.session.client.typeText(e,!1,{requireFocus:!1})}async scroll(e,t){await this.session.client.scroll(e,t?.pixels??300)}async screenshot(e){let{transcodeScreenshotToPngAsync:t}=await import(`./png-worker-client.js`).then(e=>e.s),n=await this.session.client.screenshot(),r=await t(Buffer.from(n.base64,`base64`),`Limrun iOS screenshot`);c.mkdirSync(s.dirname(e),{recursive:!0}),await c.promises.writeFile(e,r)}async snapshot(){let{captureLimrunIosSnapshot:e}=await import(`./ios-snapshot-adapter.js`);return await e(this.session)}async back(){await this.session.client.pressKey(`escape`)}async setOrientation(e){if(e===`portrait-upside-down`)throw R(`orientation`,`Limrun iOS direct sessions support portrait and landscape orientation, not portrait upside-down.`);await this.session.client.setOrientation(e===`portrait`?`Portrait`:`Landscape`)}async setSetting(){throw R(`settings`,`Limrun iOS direct sessions do not expose settings changes yet.`)}};async function A(e,t){if(!(await c.promises.stat(e)).isDirectory())return{uploadPath:e,assetName:s.basename(e),appName:j(e),cleanup:async()=>{}};let n=await c.promises.mkdtemp(s.join(l.tmpdir(),`agent-device-limrun-ios-app-`)),r=s.join(n,`${s.basename(e)}.zip`);try{await t.host.archiveDirectory({sourceDirectory:s.dirname(e),entryName:s.basename(e),archivePath:r})}catch(e){throw await c.promises.rm(n,{recursive:!0,force:!0}),e}return{uploadPath:r,assetName:s.basename(r),appName:await t.ios.readBundleAppName(e)??j(e),cleanup:async()=>{await c.promises.rm(n,{recursive:!0,force:!0})}}}function j(e){return s.basename(e).replace(/\.(?:app|ipa|apk|aab|zip)$/i,``)||void 0}const M=[0,250],N=800,P=80;function F(e){let t=new Set(e.afterInstallApps.map(e=>e.bundleId));return(e.resultBundleId&&t.has(e.resultBundleId)?e.resultBundleId:void 0)??(e.requestedBundleId&&t.has(e.requestedBundleId)?e.requestedBundleId:void 0)??I(e.beforeInstallApps,e.afterInstallApps)}function I(e,t){if(!e)return;let n=new Set(e.map(e=>e.bundleId)),r=t.filter(e=>L(e)&&!n.has(e.bundleId));return r.length===1?r[0]?.bundleId:void 0}function L(e){return!e.bundleId.startsWith(`com.apple.`)&&!e.installType.toLowerCase().includes(`system`)}function R(t,n){throw new e(`UNSUPPORTED_OPERATION`,n,{command:t})}function z(e){return e.platform===`android`?B(e):V(e)}function B(e){let t=e.adbProvider.exec;return{platform:`android`,device:e.device,interactor:p(e),adb:e.adbProvider,listApps:async r=>await e.dependencies.android.listApps(t,n(r)),getForegroundApp:async n=>await e.dependencies.android.getForegroundApp(e.device,t,n),pressKey:async(t,n)=>{await e.client.pressKey(t,n)},getKeyboardState:async()=>await e.dependencies.android.getKeyboardState(t),dismissKeyboard:async()=>await e.dependencies.android.dismissKeyboard(t),readLogs:async n=>await e.dependencies.android.readLogs(t,n),...H(e.client,e.token,e.dependencies.host),installRemoteApp:async t=>{await e.client.sendAsset(t)}}}function V(e){return{platform:`ios`,device:e.device,interactor:O(e),viewport:{width:e.client.deviceInfo.screenWidth,height:e.client.deviceInfo.screenHeight},listApps:async t=>(await e.client.listApps()).filter(e=>n(t)===`all`||L(e)).map(e=>({id:e.bundleId,name:e.name,installType:e.installType})).sort((e,t)=>e.id.localeCompare(t.id)),pressKey:async(t,n)=>{await e.client.pressKey(t,n)},readLogs:async(t,n)=>await e.client.appLogTail(t,n),...H(e.client,e.token,e.dependencies.host),installRemoteApp:async(t,n)=>await D(e,t,n),runSimctl:t=>e.client.simctl(t)}}function H(e,t,n){return{startRecording:async t=>{await e.startRecording(t)},stopRecording:async()=>({downloadUrl:await e.stopRecording({})}),downloadRecording:async e=>{await n.downloadFile({url:e.downloadUrl,headers:{Authorization:`Bearer ${t}`},destinationPath:e.outPath,timeoutMs:6e4})}}}export{g as a,f as c,E as i,m as l,O as n,h as o,T as r,p as s,z as t};
@@ -1 +1 @@
1
- import{D as e}from"./sdk-contracts.js";const t=/^[A-Za-z0-9_@%+=:,./-]+$/;function n(e){return`'${e.replaceAll(`'`,String.raw`'\''`)}'`}function r(e){return t.test(e)?e:n(e)}function i(e){return Object.freeze({script:e})}const a=new WeakMap,o=/[\\$"`]/g;function s(e){return e.replaceAll(o,e=>`\\${e}`)}function c(t,n){if(typeof t==`number`)return String(t);if(typeof t==`string`){if(n===`hdc`){if(t===``)throw new e(`INVALID_ARGS`,`hdc drops an empty element instead of carrying it, so the device command would lose an operand.`,{reason:`hdc-empty-word-unsupported`,hint:`Pass a value the transport can carry, or use a device action that needs no operand.`});return s(t)}return r(t)}if(n===`hdc`)throw new e(`INVALID_ARGS`,`hdc wraps every element in double quotes, so a shell fragment would reach the device as literal text instead of a script.`,{reason:`hdc-shell-fragment-unsupported`});return t.script}function l(e,t,n,r=[]){let i=Object.freeze([...r,t,...n.map(t=>c(t,e))]);return a.set(i,r.length),i}function u(e,t,n){if(n===0)return e;let r=a.get(e),i=[...e.slice(0,t),...e.slice(t+n)];if(r===void 0||t+n>r)return i;let o=r-n,s=Object.freeze(i);return a.set(s,o),s}function d(t,n){if(!(!t.includes(`shell`)&&!t.includes(`exec-out`))&&!a.has(t))throw new e(`INVALID_ARGS`,`${n}: device-shell argv must be built with deviceShellArgv (got ${JSON.stringify(t)}).`,{reason:`unguarded-device-shell-argv`})}function f(e){let t=e.slice(Math.max(e.lastIndexOf(`/`),e.lastIndexOf(`\\`))+1).replace(/\.(?:com|exe|bat|cmd)$/i,``);return t===`adb`||t===`hdc`?t:void 0}export{i as a,u as i,l as n,n as o,f as r,r as s,d as t};
1
+ import{O as e}from"./sdk-contracts.js";const t=/^[A-Za-z0-9_@%+=:,./-]+$/;function n(e){return`'${e.replaceAll(`'`,String.raw`'\''`)}'`}function r(e){return t.test(e)?e:n(e)}function i(e){return Object.freeze({script:e})}const a=new WeakMap,o=/[\\$"`]/g;function s(e){return e.replaceAll(o,e=>`\\${e}`)}function c(t,n){if(typeof t==`number`)return String(t);if(typeof t==`string`){if(n===`hdc`){if(t===``)throw new e(`INVALID_ARGS`,`hdc drops an empty element instead of carrying it, so the device command would lose an operand.`,{reason:`hdc-empty-word-unsupported`,hint:`Pass a value the transport can carry, or use a device action that needs no operand.`});return s(t)}return r(t)}if(n===`hdc`)throw new e(`INVALID_ARGS`,`hdc wraps every element in double quotes, so a shell fragment would reach the device as literal text instead of a script.`,{reason:`hdc-shell-fragment-unsupported`});return t.script}function l(e,t,n,r=[]){let i=Object.freeze([...r,t,...n.map(t=>c(t,e))]);return a.set(i,r.length),i}function u(e,t,n){if(n===0)return e;let r=a.get(e),i=[...e.slice(0,t),...e.slice(t+n)];if(r===void 0||t+n>r)return i;let o=r-n,s=Object.freeze(i);return a.set(s,o),s}function d(t,n){if(!(!t.includes(`shell`)&&!t.includes(`exec-out`))&&!a.has(t))throw new e(`INVALID_ARGS`,`${n}: device-shell argv must be built with deviceShellArgv (got ${JSON.stringify(t)}).`,{reason:`unguarded-device-shell-argv`})}function f(e){let t=e.slice(Math.max(e.lastIndexOf(`/`),e.lastIndexOf(`\\`))+1).replace(/\.(?:com|exe|bat|cmd)$/i,``);return t===`adb`||t===`hdc`?t:void 0}export{i as a,u as i,l as n,n as o,f as r,r as s,d as t};
@@ -1,3 +1,3 @@
1
- import{D as e}from"./sdk-contracts.js";import{b as t}from"./sdk-device.js";import{s as n}from"./device-shell.js";import{i as r,n as i,t as a}from"./device-claim-inspection.js";import{t as o}from"./shared.js";const s=async({positionals:t,flags:n})=>{if(t.length!==1||t[0]!==`status`&&t[0]!==`release`)throw new e(`INVALID_ARGS`,`device accepts only: status, release`);if(t[0]===`release`)return await c(n);let s=r({platform:n.platform,device:n.device,udid:n.udid,serial:n.serial}),l=s.filter(e=>i(e.classification)),u=(n.stale?l:s.filter(e=>!i(e.classification))).map(m),d={claims:u,...n.stale?{}:{hiddenStaleClaims:l.length}};return await o(n,d,()=>g(u,{staleOnly:n.stale===!0,hiddenStaleClaims:l.length,staleCommand:x(n,`status`),releasableClaims:l.filter(e=>a(e.classification)).length,releaseCommand:x(n,`release`)})),!0};async function c(t){if(t.stale!==!0)throw new e(`INVALID_ARGS`,`device release only releases provably stale claims; pass --stale to confirm.`,{hint:`A live owner is released by closing its session from its own workspace, or by stopping its daemon: agent-device daemon stop --state-dir <owner state dir>.`});let{runStaleDeviceClaimRelease:n}=await import(`./device-release.js`),r=await n({platform:t.platform,device:t.device,udid:t.udid,serial:t.serial}),i={released:r.filter(e=>e.status===`released`).map(l),retained:r.filter(e=>e.status===`retained`).map(l),refused:r.filter(e=>e.status===`refused`).map(l),changed:r.filter(e=>e.status===`changed`).map(l)};return await o(t,i,()=>u(r)),!0}function l(e){let{device:t,...n}=e;return{...n,...t?{device:h(t)}:{}}}function u(e){return e.length===0?`No local device claims matched.`:e.map(d).join(`
1
+ import{O as e}from"./sdk-contracts.js";import{b as t}from"./sdk-device.js";import{s as n}from"./device-shell.js";import{i as r,n as i,t as a}from"./device-claim-inspection.js";import{t as o}from"./shared.js";const s=async({positionals:t,flags:n})=>{if(t.length!==1||t[0]!==`status`&&t[0]!==`release`)throw new e(`INVALID_ARGS`,`device accepts only: status, release`);if(t[0]===`release`)return await c(n);let s=r({platform:n.platform,device:n.device,udid:n.udid,serial:n.serial}),l=s.filter(e=>i(e.classification)),u=(n.stale?l:s.filter(e=>!i(e.classification))).map(m),d={claims:u,...n.stale?{}:{hiddenStaleClaims:l.length}};return await o(n,d,()=>g(u,{staleOnly:n.stale===!0,hiddenStaleClaims:l.length,staleCommand:x(n,`status`),releasableClaims:l.filter(e=>a(e.classification)).length,releaseCommand:x(n,`release`)})),!0};async function c(t){if(t.stale!==!0)throw new e(`INVALID_ARGS`,`device release only releases provably stale claims; pass --stale to confirm.`,{hint:`A live owner is released by closing its session from its own workspace, or by stopping its daemon: agent-device daemon stop --state-dir <owner state dir>.`});let{runStaleDeviceClaimRelease:n}=await import(`./device-release.js`),r=await n({platform:t.platform,device:t.device,udid:t.udid,serial:t.serial}),i={released:r.filter(e=>e.status===`released`).map(l),retained:r.filter(e=>e.status===`retained`).map(l),refused:r.filter(e=>e.status===`refused`).map(l),changed:r.filter(e=>e.status===`changed`).map(l)};return await o(t,i,()=>u(r)),!0}function l(e){let{device:t,...n}=e;return{...n,...t?{device:h(t)}:{}}}function u(e){return e.length===0?`No local device claims matched.`:e.map(d).join(`
2
2
  `)}function d(e){let n=e.device?`${t({platform:e.device.family,appleOs:e.device.appleOs})} ${e.device.name}`:e.deviceKey??e.fileName,r=f(e);switch(e.status){case`released`:return`released ${n}${r}`;case`retained`:return`retained ${n}${r} — resources not settled (${e.reason}); the claim stays until they are.`;case`refused`:return`refused ${n}${r} — ${e.reason} (${e.classification}); ${p(e)}`;case`changed`:return`changed ${n} — the claim changed while releasing; re-run device status.`}}function f(e){return e.allocator?` allocator=${e.allocator.instanceId} incarnation=${e.allocator.identityIncarnationId}`:e.session?` session=${e.session} workspace=${e.workspace}`:``}function p(e){return e.classification===`allocator-held`?`held by its managed-device allocator; it is cleared only after the allocator proves the identity removed.`:e.classification===`live`||e.classification===`owner-state-dir-gone`?e.stateDir?`close the owning session from its workspace, or stop its daemon: agent-device daemon stop --state-dir ${n(e.stateDir)}`:`close the owning session from its workspace first.`:`only provably dead owners are released; nothing was changed.`}function m(e){let t=e.claim??e.allocatorClaim;return{...e.deviceKey?{deviceKey:e.deviceKey}:{},...t?{}:{fileName:e.fileName},classification:e.classification,...t?{device:h(t.device)}:{},...e.claim?{owner:{session:e.claim.session,workspace:e.claim.workspace,stateDir:e.claim.stateDir,pid:e.claim.ownerPid,startTime:e.claim.ownerStartTime}}:{},...e.allocatorClaim?{owner:{kind:`allocator`,stateDir:e.allocatorClaim.stateDir,allocator:e.allocatorClaim.allocator}}:{},...e.error?{error:e.error}:{}}}function h(e){let{family:n,...r}=e;return{...r,platform:t({platform:n,appleOs:e.appleOs})}}function g(e,t){let n=e.map(v);if(n.length===0){if(t.staleOnly)return`No stale local device claims found.`;if(t.hiddenStaleClaims===0)return`No local device claims found.`}return[...n.length===0?[`No live local device claims found.`]:n,..._(t)].join(`
3
3
  `)}function _(e){if(e.staleOnly)return e.releasableClaims>0?[`Release provably dead owners with: ${e.releaseCommand}`]:[];if(e.hiddenStaleClaims===0)return[];let t=e.hiddenStaleClaims===1?`claim`:`claims`;return[`${e.hiddenStaleClaims} stale ${t} hidden; inspect with: ${e.staleCommand}`]}function v(e){return`${y(e)}: ${e.classification}${b(e.owner)}`}function y(e){let t=e.device;return t?`${t.platform??`unknown`} ${t.name??t.id??`claim`}`:String(e.deviceKey??e.fileName??`claim`)}function b(e){if(!e||typeof e!=`object`)return``;let t=e;return t.allocator?` allocator=${t.allocator.instanceId} incarnation=${t.allocator.identityIncarnationId} installation=${t.stateDir}`:` session=${t.session} workspace=${t.workspace}`}function x(e,t){let r=[e.platform?`--platform ${n(e.platform)}`:null,e.device?`--device ${n(e.device)}`:null,e.udid?`--udid ${n(e.udid)}`:null,e.serial?`--serial ${n(e.serial)}`:null].filter(e=>!!e);return[`agent-device device ${t}`,...r,`--stale`].join(` `)}export{s as deviceCommand};
@@ -1 +1 @@
1
- import{D as e}from"./sdk-contracts.js";import{f as t}from"./owner-identity.js";import{n}from"./exec.js";import"./command.js";import"./process.js";import{T as r,p as i,y as a}from"./host-file.js";import"./config.js";import{c as o,o as s}from"./tool-provider.js";import c from"node:path";async function l(t,r,i={}){let a=[`devicectl`,...t],o=await s(a,{allowFailure:!0,signal:i.signal,timeoutMs:i.timeoutMs??2e4});if(o.exitCode===0)return;let{stdout:c,stderr:l}=o;if(!i.tolerateOutput?.(c,l))throw new e(`COMMAND_FAILED`,`Failed to ${r.action}`,n(o,{cmd:`xcrun`,args:a,stdout:c,stderr:l,deviceId:r.deviceId,hint:O(c,l)??`Ensure the iOS device is unlocked, trusted, and available in Xcode > Devices, then retry.`}))}async function u(e,t){return C(x(await g(e,{jsonPrefix:`agent-device-ios-apps`,args:[`devicectl`,`device`,`info`,`apps`,`--device`,e.id,`--include-all-apps`],failureMessage:`Failed to list iOS apps`,parseFailureMessage:`Failed to parse iOS apps list`})),t)}async function d(t){let n=await g(t,{jsonPrefix:`agent-device-ios-processes`,args:[`devicectl`,`device`,`info`,`processes`,`--device`,t.id],failureMessage:`Failed to list iOS processes`,parseFailureMessage:`Failed to parse iOS process list`,fallbackHint:T});if(!y(n))throw new e(`COMMAND_FAILED`,`Unsupported iOS process list response`,{deviceId:t.id,hint:T});return S(n)}async function f(e,t){let{appBundleUrl:n,processes:r}=await p(e,t),i=r.sort((e,t)=>v(e,n)-v(t,n))[0];i&&await g(e,{jsonPrefix:`agent-device-ios-process-terminate`,args:[`devicectl`,`device`,`process`,`terminate`,`--device`,e.id,`--pid`,String(i.pid),`--kill`],failureMessage:`Failed to terminate iOS app`,parseFailureMessage:`Failed to parse iOS process termination response`,tolerateFailurePayload:b})}async function p(t,n){let r=(await u(t,`all`)).find(e=>e.bundleId===n);if(!r)throw new e(`APP_NOT_INSTALLED`,`No iOS device app found for ${n}`,{appBundleId:n,deviceId:t.id});if(!r.url)throw new e(`COMMAND_FAILED`,`Missing app bundle URL for ${n}`,{appBundleId:n,deviceId:t.id,hint:`Installed-app metadata from devicectl did not include the bundle URL required to match running processes. Use an Xcode/CoreDevice toolchain that reports app URLs.`});let i=r.url.replace(/\/+$/,``);return{appBundleUrl:i,processes:(await d(t)).filter(e=>e.executable.startsWith(`${i}/`))}}async function m(e){let n=c.join(i(),`${e.jsonPrefix}-${t()}-${Date.now()}-${Math.random().toString(36).slice(2)}.json`),a=[...e.args,`--json-output`,n];try{let t=await s(a,{allowFailure:!0,signal:e.signal,timeoutMs:e.timeoutMs??2e4});if(t.exitCode!==0){let r=await _(n).catch(()=>void 0);return r!==void 0&&e.tolerateFailurePayload?.(r)?{ok:!0,payload:r}:{ok:!1,reason:`command-failed`,args:a,result:t,payload:r}}return await h(n,a,t)}finally{await r(n).catch(()=>{})}}async function h(t,n,r){try{return{ok:!0,payload:await _(t)}}catch(t){if(t instanceof e)throw t;return{ok:!1,reason:`unreadable-json`,args:n,result:r,cause:String(t)}}}async function g(t,r){let i=await m(r);if(i.ok)return i.payload;if(i.reason===`command-failed`){let{stdout:a,stderr:o}=i.result;throw new e(`COMMAND_FAILED`,r.failureMessage,n(i.result,{cmd:`xcrun`,args:i.args,stdout:a,stderr:o,deviceId:t.id,hint:O(a,o)??r.fallbackHint??`Ensure the iOS device is unlocked, trusted, and available in Xcode > Devices, then retry.`}))}throw new e(`COMMAND_FAILED`,r.parseFailureMessage,{deviceId:t.id,cause:i.cause})}async function _(e){return JSON.parse(await a(e))}function v(e,t){return e.executable.slice(t.length+1).split(`/`).length}function y(e){return Array.isArray(e?.result?.runningProcesses)}function b(e){let t=e?.error?.userInfo?.NSUnderlyingError?.error;return t?.domain===`NSPOSIXErrorDomain`&&t.code===3}function x(e){let t=e?.result?.apps;if(!Array.isArray(t))return[];let n=[];for(let e of t){if(!e||typeof e!=`object`)continue;let t=typeof e.bundleIdentifier==`string`?e.bundleIdentifier.trim():``;if(!t)continue;let r=typeof e.name==`string`&&e.name.trim().length>0?e.name.trim():t,i=typeof e.url==`string`&&e.url.trim().length>0?e.url.trim():void 0;n.push({bundleId:t,name:r,url:i})}return n}function S(e){let t=e?.result?.runningProcesses;if(!Array.isArray(t))return[];let n=[];for(let e of t){if(!e||typeof e!=`object`)continue;let t=typeof e.executable==`string`?e.executable.trim():``,r=typeof e.processIdentifier==`number`&&Number.isFinite(e.processIdentifier)?e.processIdentifier:NaN;!t||!Number.isFinite(r)||n.push({executable:t,pid:r})}return n}function C(e,t){return o(e,t)}const w=`Ensure the iOS device is unlocked, trusted, and available in Xcode > Devices, then retry.`,T=`This Xcode/CoreDevice toolchain must support 'devicectl device info processes' with JSON runningProcesses so agent-device can resolve app process IDs. Inspect diagnostics for the exact devicectl API failure.`,E=`Enable Developer Mode on the iOS device (Settings > Privacy & Security > Developer Mode), restart it when prompted, unlock it, then retry.`,D=`Let Xcode finish preparing this device: keep it unlocked and connected by cable, open Xcode > Settings > Platforms (or Window > Devices and Simulators), wait for device support to install, then retry.`;function O(e,t){let n=`${e}\n${t}`.toLowerCase();return n.includes(`device is busy`)&&n.includes(`connecting`)?`iOS device is still connecting. Keep it unlocked and connected by cable until it is fully available in Xcode Devices, then retry.`:n.includes(`coredeviceservice`)&&n.includes(`timed out`)?`CoreDevice service timed out. Reconnect the device and retry; if it persists restart Xcode and the iOS device.`:n.includes(`developer mode is disabled`)?E:n.includes(`developer disk image`)?D:n.includes(`must be paired`)?`Pair the iOS device with this Mac: connect it by cable, unlock it, accept the Trust prompt, and enter the device passcode, then retry.`:null}export{p as a,m as c,u as i,f as l,D as n,O as o,E as r,l as s,w as t};
1
+ import{O as e}from"./sdk-contracts.js";import{f as t}from"./owner-identity.js";import{n}from"./exec.js";import"./command.js";import"./process.js";import{T as r,p as i,y as a}from"./host-file.js";import"./config.js";import{l as o,o as s}from"./tool-provider.js";import c from"node:path";async function l(t,r,i={}){let a=[`devicectl`,...t],o=await s(a,{allowFailure:!0,signal:i.signal,timeoutMs:i.timeoutMs??2e4});if(o.exitCode===0)return;let{stdout:c,stderr:l}=o;if(!i.tolerateOutput?.(c,l))throw new e(`COMMAND_FAILED`,`Failed to ${r.action}`,n(o,{cmd:`xcrun`,args:a,stdout:c,stderr:l,deviceId:r.deviceId,hint:O(c,l)??`Ensure the iOS device is unlocked, trusted, and available in Xcode > Devices, then retry.`}))}async function u(e,t){return C(x(await g(e,{jsonPrefix:`agent-device-ios-apps`,args:[`devicectl`,`device`,`info`,`apps`,`--device`,e.id,`--include-all-apps`],failureMessage:`Failed to list iOS apps`,parseFailureMessage:`Failed to parse iOS apps list`})),t)}async function d(t){let n=await g(t,{jsonPrefix:`agent-device-ios-processes`,args:[`devicectl`,`device`,`info`,`processes`,`--device`,t.id],failureMessage:`Failed to list iOS processes`,parseFailureMessage:`Failed to parse iOS process list`,fallbackHint:T});if(!y(n))throw new e(`COMMAND_FAILED`,`Unsupported iOS process list response`,{deviceId:t.id,hint:T});return S(n)}async function f(e,t){let{appBundleUrl:n,processes:r}=await p(e,t),i=r.sort((e,t)=>v(e,n)-v(t,n))[0];i&&await g(e,{jsonPrefix:`agent-device-ios-process-terminate`,args:[`devicectl`,`device`,`process`,`terminate`,`--device`,e.id,`--pid`,String(i.pid),`--kill`],failureMessage:`Failed to terminate iOS app`,parseFailureMessage:`Failed to parse iOS process termination response`,tolerateFailurePayload:b})}async function p(t,n){let r=(await u(t,`all`)).find(e=>e.bundleId===n);if(!r)throw new e(`APP_NOT_INSTALLED`,`No iOS device app found for ${n}`,{appBundleId:n,deviceId:t.id});if(!r.url)throw new e(`COMMAND_FAILED`,`Missing app bundle URL for ${n}`,{appBundleId:n,deviceId:t.id,hint:`Installed-app metadata from devicectl did not include the bundle URL required to match running processes. Use an Xcode/CoreDevice toolchain that reports app URLs.`});let i=r.url.replace(/\/+$/,``);return{appBundleUrl:i,processes:(await d(t)).filter(e=>e.executable.startsWith(`${i}/`))}}async function m(e){let n=c.join(i(),`${e.jsonPrefix}-${t()}-${Date.now()}-${Math.random().toString(36).slice(2)}.json`),a=[...e.args,`--json-output`,n];try{let t=await s(a,{allowFailure:!0,signal:e.signal,timeoutMs:e.timeoutMs??2e4});if(t.exitCode!==0){let r=await _(n).catch(()=>void 0);return r!==void 0&&e.tolerateFailurePayload?.(r)?{ok:!0,payload:r}:{ok:!1,reason:`command-failed`,args:a,result:t,payload:r}}return await h(n,a,t)}finally{await r(n).catch(()=>{})}}async function h(t,n,r){try{return{ok:!0,payload:await _(t)}}catch(t){if(t instanceof e)throw t;return{ok:!1,reason:`unreadable-json`,args:n,result:r,cause:String(t)}}}async function g(t,r){let i=await m(r);if(i.ok)return i.payload;if(i.reason===`command-failed`){let{stdout:a,stderr:o}=i.result;throw new e(`COMMAND_FAILED`,r.failureMessage,n(i.result,{cmd:`xcrun`,args:i.args,stdout:a,stderr:o,deviceId:t.id,hint:O(a,o)??r.fallbackHint??`Ensure the iOS device is unlocked, trusted, and available in Xcode > Devices, then retry.`}))}throw new e(`COMMAND_FAILED`,r.parseFailureMessage,{deviceId:t.id,cause:i.cause})}async function _(e){return JSON.parse(await a(e))}function v(e,t){return e.executable.slice(t.length+1).split(`/`).length}function y(e){return Array.isArray(e?.result?.runningProcesses)}function b(e){let t=e?.error?.userInfo?.NSUnderlyingError?.error;return t?.domain===`NSPOSIXErrorDomain`&&t.code===3}function x(e){let t=e?.result?.apps;if(!Array.isArray(t))return[];let n=[];for(let e of t){if(!e||typeof e!=`object`)continue;let t=typeof e.bundleIdentifier==`string`?e.bundleIdentifier.trim():``;if(!t)continue;let r=typeof e.name==`string`&&e.name.trim().length>0?e.name.trim():t,i=typeof e.url==`string`&&e.url.trim().length>0?e.url.trim():void 0;n.push({bundleId:t,name:r,url:i})}return n}function S(e){let t=e?.result?.runningProcesses;if(!Array.isArray(t))return[];let n=[];for(let e of t){if(!e||typeof e!=`object`)continue;let t=typeof e.executable==`string`?e.executable.trim():``,r=typeof e.processIdentifier==`number`&&Number.isFinite(e.processIdentifier)?e.processIdentifier:NaN;!t||!Number.isFinite(r)||n.push({executable:t,pid:r})}return n}function C(e,t){return o(e,t)}const w=`Ensure the iOS device is unlocked, trusted, and available in Xcode > Devices, then retry.`,T=`This Xcode/CoreDevice toolchain must support 'devicectl device info processes' with JSON runningProcesses so agent-device can resolve app process IDs. Inspect diagnostics for the exact devicectl API failure.`,E=`Enable Developer Mode on the iOS device (Settings > Privacy & Security > Developer Mode), restart it when prompted, unlock it, then retry.`,D=`Let Xcode finish preparing this device: keep it unlocked and connected by cable, open Xcode > Settings > Platforms (or Window > Devices and Simulators), wait for device support to install, then retry.`;function O(e,t){let n=`${e}\n${t}`.toLowerCase();return n.includes(`device is busy`)&&n.includes(`connecting`)?`iOS device is still connecting. Keep it unlocked and connected by cable until it is fully available in Xcode Devices, then retry.`:n.includes(`coredeviceservice`)&&n.includes(`timed out`)?`CoreDevice service timed out. Reconnect the device and retry; if it persists restart Xcode and the iOS device.`:n.includes(`developer mode is disabled`)?E:n.includes(`developer disk image`)?D:n.includes(`must be paired`)?`Pair the iOS device with this Mac: connect it by cable, unlock it, accept the Trust prompt, and enter the device passcode, then retry.`:null}export{p as a,m as c,u as i,f as l,D as n,O as o,E as r,l as s,w as t};
@@ -1,3 +1,3 @@
1
- import{W as e}from"./sdk-contracts.js";import t from"node:path";import n from"node:fs";import r from"node:crypto";import{AsyncLocalStorage as i}from"node:async_hooks";import a from"node:os";const o=new i;function s(){return r.randomBytes(8).toString(`hex`)}function c(){return`${Date.now().toString(36)}-${r.randomBytes(4).toString(`hex`)}`}async function l(e,t){let n={...e,diagnosticId:c(),events:[],liveWrittenEventCount:0,phaseCounts:new Map,sensitiveValues:new Set,ensuredDirectories:new Set};return await o.run(n,t)}function u(e){let t=o.getStore();t&&Object.assign(t,e)}function d(){let e=o.getStore();if(!e)return{};let{diagnosticId:t,requestId:n,session:r,command:i,debug:a,flushOnSuccess:s}=e;return{diagnosticId:t,requestId:n,session:r,command:i,debug:a,flushOnSuccess:s}}function f(e){if(!e)return;let t=o.getStore();t&&(t.sensitiveValues.add(e),t.sortedSensitiveValues=void 0)}function p(e){let t=o.getStore();if(!t)return 0;let n=0;for(let r of e)n+=t.phaseCounts.get(r)??0;return n}function m(e){let t=o.getStore();if(!t)return;let n={ts:new Date().toISOString(),level:e.level??`info`,phase:e.phase,session:t.session,requestId:t.requestId,command:t.command,durationMs:e.durationMs,data:e.data?v(t,e.data):void 0};if(t.events.push(n),t.phaseCounts.set(e.phase,(t.phaseCounts.get(e.phase)??0)+1),!t.debug&&!t.traceLogPath)return;let r=`${JSON.stringify(n)}\n`;try{t.debug&&t.logPath&&(x(t,t.logPath,r),t.liveWrittenEventCount=t.events.length),t.traceLogPath&&x(t,t.traceLogPath,r),t.debug&&!t.logPath&&!t.traceLogPath&&process.stderr.write(`[agent-device][diag] ${r}`)}catch{}}async function h(e,t,n){let r=Date.now();try{let i=await t();return m({level:`info`,phase:e,durationMs:Date.now()-r,data:n}),i}catch(t){throw m({level:`error`,phase:e,durationMs:Date.now()-r,data:{...n??{},error:t instanceof Error?t.message:String(t)}}),t}}function g(e={}){let r=o.getStore();if(!r||!e.force&&!r.debug&&!r.flushOnSuccess||r.events.length===0)return null;let i=_(r);try{if(r.logPath){let e=r.events.slice(r.liveWrittenEventCount);if(e.length>0){let t=e.map(e=>JSON.stringify(y(e,i)));x(r,r.logPath,`${t.join(`
1
+ import{G as e}from"./sdk-contracts.js";import t from"node:path";import n from"node:fs";import r from"node:crypto";import{AsyncLocalStorage as i}from"node:async_hooks";import a from"node:os";const o=new i;function s(){return r.randomBytes(8).toString(`hex`)}function c(){return`${Date.now().toString(36)}-${r.randomBytes(4).toString(`hex`)}`}async function l(e,t){let n={...e,diagnosticId:c(),events:[],liveWrittenEventCount:0,phaseCounts:new Map,sensitiveValues:new Set,ensuredDirectories:new Set};return await o.run(n,t)}function u(e){let t=o.getStore();t&&Object.assign(t,e)}function d(){let e=o.getStore();if(!e)return{};let{diagnosticId:t,requestId:n,session:r,command:i,debug:a,flushOnSuccess:s}=e;return{diagnosticId:t,requestId:n,session:r,command:i,debug:a,flushOnSuccess:s}}function f(e){if(!e)return;let t=o.getStore();t&&(t.sensitiveValues.add(e),t.sortedSensitiveValues=void 0)}function p(e){let t=o.getStore();if(!t)return 0;let n=0;for(let r of e)n+=t.phaseCounts.get(r)??0;return n}function m(e){let t=o.getStore();if(!t)return;let n={ts:new Date().toISOString(),level:e.level??`info`,phase:e.phase,session:t.session,requestId:t.requestId,command:t.command,durationMs:e.durationMs,data:e.data?v(t,e.data):void 0};if(t.events.push(n),t.phaseCounts.set(e.phase,(t.phaseCounts.get(e.phase)??0)+1),!t.debug&&!t.traceLogPath)return;let r=`${JSON.stringify(n)}\n`;try{t.debug&&t.logPath&&(x(t,t.logPath,r),t.liveWrittenEventCount=t.events.length),t.traceLogPath&&x(t,t.traceLogPath,r),t.debug&&!t.logPath&&!t.traceLogPath&&process.stderr.write(`[agent-device][diag] ${r}`)}catch{}}async function h(e,t,n){let r=Date.now();try{let i=await t();return m({level:`info`,phase:e,durationMs:Date.now()-r,data:n}),i}catch(t){throw m({level:`error`,phase:e,durationMs:Date.now()-r,data:{...n??{},error:t instanceof Error?t.message:String(t)}}),t}}function g(e={}){let r=o.getStore();if(!r||!e.force&&!r.debug&&!r.flushOnSuccess||r.events.length===0)return null;let i=_(r);try{if(r.logPath){let e=r.events.slice(r.liveWrittenEventCount);if(e.length>0){let t=e.map(e=>JSON.stringify(y(e,i)));x(r,r.logPath,`${t.join(`
2
2
  `)}\n`)}let t=r.logRecord;return r.events=[],r.liveWrittenEventCount=0,{path:r.logPath,...t?{ref:t}:{}}}let e=b(r.session??`default`),o=new Date().toISOString().slice(0,10),s=t.join(a.homedir(),`.agent-device`,`logs`,e,o);n.mkdirSync(s,{recursive:!0});let c=new Date().toISOString().replaceAll(/[:.]/g,`-`),l=t.join(s,`${c}-${r.diagnosticId}.ndjson`),u=r.events.map(e=>JSON.stringify(y(e,i)));return n.writeFileSync(l,`${u.join(`
3
3
  `)}\n`),r.events=[],{path:l}}catch{return null}}function _(e){return e.sortedSensitiveValues??=[...e.sensitiveValues].sort((e,t)=>t.length-e.length),e.sortedSensitiveValues}function v(t,n){return y(e(n),_(t))}function y(e,t){return typeof e==`string`?t.reduce((e,t)=>e.replaceAll(t,`[REDACTED]`),e):Array.isArray(e)?e.map(e=>y(e,t)):!e||typeof e!=`object`?e:Object.fromEntries(Object.entries(e).map(([e,n])=>[e,y(n,t)]))}function b(e){return e.replaceAll(/[^a-zA-Z0-9._-]/g,`_`)}function x(e,r,i){let a=t.dirname(r);e.ensuredDirectories.has(a)||(n.mkdirSync(a,{recursive:!0}),e.ensuredDirectories.add(a)),n.appendFileSync(r,i,`utf8`)}export{d as a,h as c,g as i,l,s as n,f as o,m as r,u as s,p as t};
@@ -1 +1 @@
1
- import{D as e}from"./sdk-contracts.js";import{S as t,l as n,s as r}from"./sdk-device.js";import{c as i}from"./diagnostics.js";import"./diagnostics2.js";import{n as a,r as o}from"./device-isolation.js";import{a as s,i as c,r as l}from"./device-inventory-context.js";import{AsyncLocalStorage as u}from"node:async_hooks";async function d(e){let{resolveInventoryDeviceSelection:t}=await import(`./device-selection-resolver.js`).then(e=>e.t);return await t(e)}const f=new u;function p(t,n){return!r(n)&&t instanceof e&&t.code===`DEVICE_NOT_FOUND`}function m(e,t){return!r(e)&&(!e.platform||e.platform===`apple`||e.platform===`ios`)&&e.target!==`desktop`&&(!t||t.kind===`device`)}async function h(e,t={}){return(await g(e,t)).device}async function g(e,t={}){let r={...y(e),androidAvdSelection:t.androidAvdSelection??`running-only`},{iosSimulatorSetPath:a,...o}=r,s=C(r,t),l={platform:r.platform,target:e.target,cacheHit:!1};return await i(`resolve_target_device`,async()=>{let e=x(s);if(e)return l.cacheHit=!0,e;let i=await c(r),u=[...i.devices];if(n(o.platform)&&i.source===`local`){let e=await _(u,o,{simulatorSetPath:a,appleSimulatorAppTarget:t.appleSimulatorAppTarget});return S(s,e)}return S(s,await d({devices:u,selector:o,source:i.source}))},l)}async function _(t,n,r){let i;try{i=await d({devices:t,selector:n,source:`local`,appleSimulatorAppTarget:r.appleSimulatorAppTarget})}catch(e){if(!p(e,n))throw e}let a=await v(n,r,i?.device);if(a)return a;if(i)return i;throw new e(`DEVICE_NOT_FOUND`,`No devices found`,{selector:n})}async function v(e,t,n){if(m(e,n))try{return await d({devices:await l({platform:e.platform??`ios`,target:e.target,iosSimulatorSetPath:t.simulatorSetPath,kind:`simulator`}),selector:e,source:`local`})}catch(e){if(s(e))throw e;return}}function y(n){let r=n.platform;if(n.target&&!r)throw new e(`INVALID_ARGS`,`Device target selector requires --platform. Use --platform ios|macos|android|vega|linux|apple with --target mobile|tv|desktop.`);let i=t({simulatorSetPath:o(n.iosSimulatorDeviceSet),platform:r,target:n.target}),s=a(n.androidDeviceAllowlist);return{platform:r,target:n.target,deviceName:n.device,udid:n.udid,serial:n.serial,leaseId:n.leaseId,leaseProvider:n.leaseProvider,deviceKey:n.deviceKey,clientId:n.clientId,iosSimulatorSetPath:i,androidSerialAllowlist:s?Array.from(s).sort():void 0}}async function b(e){return f.getStore()?await e():await f.run(new Map,e)}function x(e){let t=f.getStore()?.get(e);if(t)return{...t,device:{...t.device}}}function S(e,t){return f.getStore()?.set(e,{...t,device:{...t.device}}),t}function C(e,t){let{appleSimulatorAppTarget:n,...r}=t;return JSON.stringify({request:e,options:r})}export{b as i,h as n,g as r,y as t};
1
+ import{O as e}from"./sdk-contracts.js";import{S as t,l as n,s as r}from"./sdk-device.js";import{c as i}from"./diagnostics.js";import"./diagnostics2.js";import{n as a,r as o}from"./device-isolation.js";import{a as s,i as c,r as l}from"./device-inventory-context.js";import{AsyncLocalStorage as u}from"node:async_hooks";async function d(e){let{resolveInventoryDeviceSelection:t}=await import(`./device-selection-resolver.js`).then(e=>e.t);return await t(e)}const f=new u;function p(t,n){return!r(n)&&t instanceof e&&t.code===`DEVICE_NOT_FOUND`}function m(e,t){return!r(e)&&(!e.platform||e.platform===`apple`||e.platform===`ios`)&&e.target!==`desktop`&&(!t||t.kind===`device`)}async function h(e,t={}){return(await g(e,t)).device}async function g(e,t={}){let r={...y(e),androidAvdSelection:t.androidAvdSelection??`running-only`},{iosSimulatorSetPath:a,...o}=r,s=C(r,t),l={platform:r.platform,target:e.target,cacheHit:!1};return await i(`resolve_target_device`,async()=>{let e=x(s);if(e)return l.cacheHit=!0,e;let i=await c(r),u=[...i.devices];if(n(o.platform)&&i.source===`local`){let e=await _(u,o,{simulatorSetPath:a,appleSimulatorAppTarget:t.appleSimulatorAppTarget});return S(s,e)}return S(s,await d({devices:u,selector:o,source:i.source}))},l)}async function _(t,n,r){let i;try{i=await d({devices:t,selector:n,source:`local`,appleSimulatorAppTarget:r.appleSimulatorAppTarget})}catch(e){if(!p(e,n))throw e}let a=await v(n,r,i?.device);if(a)return a;if(i)return i;throw new e(`DEVICE_NOT_FOUND`,`No devices found`,{selector:n})}async function v(e,t,n){if(m(e,n))try{return await d({devices:await l({platform:e.platform??`ios`,target:e.target,iosSimulatorSetPath:t.simulatorSetPath,kind:`simulator`}),selector:e,source:`local`})}catch(e){if(s(e))throw e;return}}function y(n){let r=n.platform;if(n.target&&!r)throw new e(`INVALID_ARGS`,`Device target selector requires --platform. Use --platform ios|macos|android|vega|linux|apple with --target mobile|tv|desktop.`);let i=t({simulatorSetPath:o(n.iosSimulatorDeviceSet),platform:r,target:n.target}),s=a(n.androidDeviceAllowlist);return{platform:r,target:n.target,deviceName:n.device,udid:n.udid,serial:n.serial,leaseId:n.leaseId,leaseProvider:n.leaseProvider,deviceKey:n.deviceKey,clientId:n.clientId,iosSimulatorSetPath:i,androidSerialAllowlist:s?Array.from(s).sort():void 0}}async function b(e){return f.getStore()?await e():await f.run(new Map,e)}function x(e){let t=f.getStore()?.get(e);if(t)return{...t,device:{...t.device}}}function S(e,t){return f.getStore()?.set(e,{...t,device:{...t.device}}),t}function C(e,t){let{appleSimulatorAppTarget:n,...r}=t;return JSON.stringify({request:e,options:r})}export{b as i,h as n,g as r,y as t};
@@ -1 +1 @@
1
- import{D as e}from"./sdk-contracts.js";import{r as t,t as n}from"./toolchain-probe.js";import{t as r}from"./tool-provider3.js";async function i(e){let i=r();if(!await i.isAvailable())return{id:`toolchain`,status:`info`,summary:`Vega toolchain: Vega CLI not found.`,hint:`Install Vega Developer Tools or ensure ~/vega/bin/vega is executable.`,command:`vega --version`};let o=await i.version({allowFailure:!0,timeoutMs:n}),s=await a(e),l=t(o.stdout),u=s.devices.some(e=>e.platform===`vega`&&e.kind===`emulator`&&e.target===`tv`&&e.booted===!0);return{id:`toolchain`,status:o.exitCode===0?`pass`:`info`,summary:l?`Vega toolchain: ${l}; ${u?`VVD running`:`no running VVD`}.`:`Vega toolchain: CLI found but version check failed.`,hint:u?void 0:`Start the Vega Virtual Device and retry doctor.`,evidence:{vegaVersion:l??null,deviceList:c(s)}}}async function a(e){try{return{devices:await e.listLocalDeviceInventory({platform:`vega`,target:`tv`}),listedSerials:[]}}catch(t){if(e.shouldPropagateInventoryProbeError(t))throw t;return{devices:[],listedSerials:o(t)}}}function o(t){if(!(t instanceof e)||t.code!==`DEVICE_NOT_FOUND`)return[];let n=t.details?.listedSerials;return s(n)?n:[]}function s(e){return Array.isArray(e)&&e.every(e=>typeof e==`string`)}function c(e){return(e.devices.length>0?e.devices.map(e=>e.id):e.listedSerials).join(`, `)||null}export{i as vegaToolchainCheck};
1
+ import{O as e}from"./sdk-contracts.js";import{r as t,t as n}from"./toolchain-probe.js";import{t as r}from"./tool-provider3.js";async function i(e){let i=r();if(!await i.isAvailable())return{id:`toolchain`,status:`info`,summary:`Vega toolchain: Vega CLI not found.`,hint:`Install Vega Developer Tools or ensure ~/vega/bin/vega is executable.`,command:`vega --version`};let o=await i.version({allowFailure:!0,timeoutMs:n}),s=await a(e),l=t(o.stdout),u=s.devices.some(e=>e.platform===`vega`&&e.kind===`emulator`&&e.target===`tv`&&e.booted===!0);return{id:`toolchain`,status:o.exitCode===0?`pass`:`info`,summary:l?`Vega toolchain: ${l}; ${u?`VVD running`:`no running VVD`}.`:`Vega toolchain: CLI found but version check failed.`,hint:u?void 0:`Start the Vega Virtual Device and retry doctor.`,evidence:{vegaVersion:l??null,deviceList:c(s)}}}async function a(e){try{return{devices:await e.listLocalDeviceInventory({platform:`vega`,target:`tv`}),listedSerials:[]}}catch(t){if(e.shouldPropagateInventoryProbeError(t))throw t;return{devices:[],listedSerials:o(t)}}}function o(t){if(!(t instanceof e)||t.code!==`DEVICE_NOT_FOUND`)return[];let n=t.details?.listedSerials;return s(n)?n:[]}function s(e){return Array.isArray(e)&&e.every(e=>typeof e==`string`)}function c(e){return(e.devices.length>0?e.devices.map(e=>e.id):e.listedSerials).join(`, `)||null}export{i as vegaToolchainCheck};
@@ -1 +1 @@
1
- import{D as e,j as t}from"./sdk-contracts.js";const n=new Set([`__proto__`,`constructor`,`prototype`]);async function r(n,r){let o=a(r),c=i(n),{default:l}=await import(`node:vm`),u={...r,output:o};try{l.runInNewContext(c,u,{filename:`evalScript`,timeout:1e4})}catch(n){throw new e(`COMMAND_FAILED`,`Maestro evalScript failed: ${t(n)}`,void 0,n instanceof Error?n:void 0)}return s(u.output)}function i(e){let t=e.trim();return t.startsWith("${")&&t.endsWith(`}`)?t.slice(2,-1):t}function a(e){let t=Object.create(null);for(let[n,r]of Object.entries(e))!n.startsWith(`output.`)||n===`output`||o(t,n.slice(7),r);return t}function o(e,t,n){let r=t.split(`.`).filter(l);if(r.length===0)return;let i=e;for(let e of r.slice(0,-1)){let t=i[e];(typeof t!=`object`||!t)&&(i[e]=Object.create(null)),i=i[e]}i[r.at(-1)]=n}function s(e){let t={};return c(e,[],t,new Set),t}function c(e,t,n,r){if(e!==void 0){if(typeof e!=`object`||!e){n[`output${t.map(e=>`.${e}`).join(``)}`]=u(e);return}if(!r.has(e)){r.add(e);try{let i=Array.isArray(e)?[...e.keys(),`length`]:Object.keys(e).filter(l);for(let a of i){let i=String(a);c(Array.isArray(e)&&i===`length`?e.length:e[i],[...t,i],n,r)}}finally{r.delete(e)}}}}function l(e){return!n.has(e)}function u(e){return typeof e==`string`?e:typeof e==`number`||typeof e==`boolean`?String(e):JSON.stringify(e)}export{r as evaluateMaestroEvalScript};
1
+ import{M as e,O as t}from"./sdk-contracts.js";const n=new Set([`__proto__`,`constructor`,`prototype`]);async function r(n,r){let o=a(r),c=i(n),{default:l}=await import(`node:vm`),u={...r,output:o};try{l.runInNewContext(c,u,{filename:`evalScript`,timeout:1e4})}catch(n){throw new t(`COMMAND_FAILED`,`Maestro evalScript failed: ${e(n)}`,void 0,n instanceof Error?n:void 0)}return s(u.output)}function i(e){let t=e.trim();return t.startsWith("${")&&t.endsWith(`}`)?t.slice(2,-1):t}function a(e){let t=Object.create(null);for(let[n,r]of Object.entries(e))!n.startsWith(`output.`)||n===`output`||o(t,n.slice(7),r);return t}function o(e,t,n){let r=t.split(`.`).filter(l);if(r.length===0)return;let i=e;for(let e of r.slice(0,-1)){let t=i[e];(typeof t!=`object`||!t)&&(i[e]=Object.create(null)),i=i[e]}i[r.at(-1)]=n}function s(e){let t={};return c(e,[],t,new Set),t}function c(e,t,n,r){if(e!==void 0){if(typeof e!=`object`||!e){n[`output${t.map(e=>`.${e}`).join(``)}`]=u(e);return}if(!r.has(e)){r.add(e);try{let i=Array.isArray(e)?[...e.keys(),`length`]:Object.keys(e).filter(l);for(let a of i){let i=String(a);c(Array.isArray(e)&&i===`length`?e.length:e[i],[...t,i],n,r)}}finally{r.delete(e)}}}}function l(e){return!n.has(e)}function u(e){return typeof e==`string`?e:typeof e==`number`||typeof e==`boolean`?String(e):JSON.stringify(e)}export{r as evaluateMaestroEvalScript};
package/dist/src/error.js CHANGED
@@ -1,2 +1,2 @@
1
- import{r as e}from"./rolldown-runtime.js";import{B as t,D as n,L as r}from"./sdk-contracts.js";import{n as i}from"./success-text.js";import{t as a}from"./output-common.js";import{r as o}from"./replay-divergence.js";var s=e({formatErrorCandidateViews:()=>l,printHumanError:()=>c});function c(e,s={}){let c=e instanceof n?r(e):e;if(process.stderr.write(`Error (${c.code}): ${c.message}\n`),c.cause){let e=c.cause.code?`${c.cause.code} `:``;process.stderr.write(`Cause: ${e}${c.cause.message}\n`)}c.hint&&process.stderr.write(`Hint: ${c.hint}\n`);for(let e of i(c.details))process.stderr.write(`Warning: ${a(e)}\n`);let u=l(t(c.details));u.length>0&&process.stderr.write(`${u.join(`
1
+ import{r as e}from"./rolldown-runtime.js";import{O as t,R as n,V as r}from"./sdk-contracts.js";import{n as i}from"./success-text.js";import{t as a}from"./output-common.js";import{r as o}from"./replay-divergence.js";var s=e({formatErrorCandidateViews:()=>l,printHumanError:()=>c});function c(e,s={}){let c=e instanceof t?n(e):e;if(process.stderr.write(`Error (${c.code}): ${c.message}\n`),c.cause){let e=c.cause.code?`${c.cause.code} `:``;process.stderr.write(`Cause: ${e}${c.cause.message}\n`)}c.hint&&process.stderr.write(`Hint: ${c.hint}\n`);for(let e of i(c.details))process.stderr.write(`Warning: ${a(e)}\n`);let u=l(r(c.details));u.length>0&&process.stderr.write(`${u.join(`
2
2
  `)}\n`),c.diagnosticId&&process.stderr.write(`Diagnostic ID: ${c.diagnosticId}\n`),c.logPath&&process.stderr.write(`Diagnostics Log: ${c.logPath}\n`),c.logPathUnavailable&&process.stderr.write(`Remote Diagnostics: unavailable (${c.logPathUnavailable})\n`);let d=o(c.details);d&&process.stderr.write(`${d}\n`),s.showDetails&&c.details&&process.stderr.write(`${JSON.stringify(c.details,null,2)}\n`)}function l(e){return e.flatMap(e=>{if(e.kind===`element-match`){let t=e.matches-e.candidates.length;return[`Candidates:`,...e.candidates.map(t=>` ${u(t,e.refsGeneration)}`),...t>0?[` +${t} more`]:[]]}return[`Devices:`,...e.devices.map(e=>` ${e.id} ${e.name}`)]})}function u(e,t){return t===void 0?e:e.replace(/^@(e\d+)(?=\s|$)/,`@$1~s${t}`)}export{l as n,s as t};
package/dist/src/exec.js CHANGED
@@ -1 +1 @@
1
- import{D as e,k as t}from"./sdk-contracts.js";import{o as n}from"./sdk-remote-config.js";import{a as r,r as i,s as a}from"./diagnostics.js";import o from"node:path";import{constants as s}from"node:fs";import{AsyncLocalStorage as c}from"node:async_hooks";import{access as l,stat as u}from"node:fs/promises";import{spawn as d,spawnSync as f}from"node:child_process";import{Readable as p}from"node:stream";import{pipeline as m}from"node:stream/promises";const h=/^[A-Za-z0-9][A-Za-z0-9._+-]*$/,g=[`.com`,`.exe`,`.bat`,`.cmd`],_=new c;async function v(e,t){return e?await _.run(e,t):await t()}async function y(e){return await _.run(void 0,e)}async function b(e,t,n={}){let r=_.getStore()?.(e,t,n);return r?S(await r):await C(e,t,n)}async function x(e,t,n={}){let r=_.getStore()?.(e,t,n);return r?S(await r):await C(e,t,n)}function S(e){let t=typeof e.stdout==`string`?e.stdout:String(e.stdout??``),n=typeof e.stderr==`string`?e.stderr:String(e.stderr??``),r=typeof e.exitCode==`number`?e.exitCode:1;return t===e.stdout&&n===e.stderr&&r===e.exitCode?e:{...e,stdout:t,stderr:n,exitCode:r}}function C(e,t,n={}){let r=j(e),i=k();return new Promise((a,o)=>{let s=d(r,t,{cwd:n.cwd,env:n.env,stdio:[`pipe`,`pipe`,`pipe`],detached:n.detached,windowsHide:!0,shell:!1});n.onSpawn?.(s);let c=``,l=n.binaryStdout?[]:void 0,u=``,f=!1,p=q(n.timeoutMs),m=null,h=!1;function g(){return!h&&(h=!0,m&&clearTimeout(m),b.dispose(),$(s),i.emitForegroundCompletion(e,t),!0)}function _(e){g()&&o(e)}function v(i){if(!g())return;let s=i??1;if(!b.didAbort&&f&&p){o(re(r,e,t,p,s,c,u));return}let d=B(b,r,e,t,s,n.allowFailure,c,u);if(d){o(d);return}a({stdout:c,stderr:u,exitCode:s,stdoutBuffer:l?Buffer.concat(l):void 0})}let y=J({killProcessTree:()=>Z(s,n),settle:v}),b=Y(n,y.requestKill);m=p?setTimeout(()=>{f=!0,y.requestKill()},p):null,n.binaryStdout||s.stdout.setEncoding(`utf8`),s.stderr.setEncoding(`utf8`),oe(s,n.stdin).catch(i=>{b.didAbort||f||se(i)||(_(F(r,e,t,i)),Z(s,n))}),s.stdout.on(`data`,e=>{if(n.binaryStdout){l?.push(Buffer.isBuffer(e)?e:Buffer.from(e));return}let t=String(e);c+=t,n.onStdoutChunk?.(t)}),s.stderr.on(`data`,e=>{let t=String(e);u+=t,n.onStderrChunk?.(t)}),s.on(`error`,n=>{_(z(b,r,e,t,n))}),s.once(`exit`,y.recordExit),s.once(`close`,v)})}async function ee(e){let t=H(e);if(!t)return!1;if(o.isAbsolute(t))return G(t);let n=process.env.PATH;if(!n)return!1;let r=U();for(let e of n.split(o.delimiter)){let n=e.trim();if(n){for(let e of W(t,r))if(await G(o.join(n,e)))return!0}}return!1}async function w(t,n){let r=V(t,n,`executable`);if(r){if(!await G(r))throw new e(`TOOL_MISSING`,`${n} points to a missing or non-executable file: ${r}`,{envName:n,path:r});return r}}async function T(t,n){let r=V(t,n,`file`);if(r){if(!await K(r))throw new e(`TOOL_MISSING`,`${n} points to a missing or non-file path: ${r}`,{envName:n,path:r});return r}}function E(t,n,r={}){let i=j(t),a=f(i,n,{cwd:r.cwd,env:r.env,stdio:[`pipe`,`pipe`,`pipe`],encoding:r.binaryStdout?void 0:`utf8`,input:r.stdin,timeout:q(r.timeoutMs),windowsHide:!0,shell:!1,...r.maxBuffer===void 0?{}:{maxBuffer:r.maxBuffer}});if(a.error){let o=a.error.code;throw o===`ETIMEDOUT`?new e(`COMMAND_FAILED`,`${i} timed out after ${q(r.timeoutMs)}ms`,{cmd:t,args:n,timeoutMs:q(r.timeoutMs)},a.error):o===`ENOENT`?N(i,t,a.error):P(i,t,n,a.error)}let o=r.binaryStdout?Buffer.isBuffer(a.stdout)?a.stdout:Buffer.from(a.stdout??``):void 0,s=r.binaryStdout?``:typeof a.stdout==`string`?a.stdout:(a.stdout??``).toString(),c=typeof a.stderr==`string`?a.stderr:(a.stderr??``).toString(),l=a.status??1;if(l!==0&&!r.allowFailure)throw L(i,t,n,l,s,c);return{stdout:s,stderr:c,exitCode:l,stdoutBuffer:o}}function D(e,t,n={}){return O(e,t,n).pid}function O(e,t,n={}){let r=j(e),i=d(r,t,{cwd:n.cwd,env:n.env,stdio:n.stdio??`ignore`,detached:!0,windowsHide:!0,shell:!1}),a=i.pid??0,o=new Promise(e=>{i.once(`error`,t=>{e({pid:a,error:t.message})}),i.once(`exit`,(t,n)=>{e({pid:a,...typeof t==`number`?{exitCode:t}:{},...n?{signal:n}:{}})})});return i.unref(),{pid:a,exited:o}}function te(e,t,n={}){let r=j(e),i=k(),a=d(r,t,{cwd:n.cwd,env:n.env,stdio:n.stdio??[`ignore`,`pipe`,`pipe`],detached:n.detached,windowsHide:!0,shell:!1});i.emitBackgroundSpawn(e,t);let o=``,s=``;return(n.captureOutput??!0)&&(a.stdout?.setEncoding(`utf8`),a.stderr?.setEncoding(`utf8`),a.stdout?.on(`data`,e=>{o+=e}),a.stderr?.on(`data`,e=>{s+=e})),{child:a,wait:new Promise((c,l)=>{let u=!1;function d(n){return!u&&(u=!0,m.dispose(),$(a),i.emitBackgroundCompletion(e,t,n),!0)}function f(i){if(!d(`exit`))return;let a=i??1,u=B(m,r,e,t,a,n.allowFailure,o,s);if(u){l(u);return}c({stdout:o,stderr:s,exitCode:a})}let p=J({killProcessTree:()=>Z(a,n),settle:f}),m=Y(n,p.requestKill);a.on(`error`,n=>{d(`error`)&&l(z(m,r,e,t,n))}),a.once(`exit`,p.recordExit),a.once(`close`,f)})}}function k(){let e=r(),t=e.debug===!0,i=n(process.env.AGENT_DEVICE_EXEC_TRACE??``)===!0;if(!t&&!i)return ne();i&&e.flushOnSuccess!==!0&&a({flushOnSuccess:!0});let o=Date.now(),s=!1;return{emitForegroundCompletion:(e,t)=>{s||(s=!0,A({cmd:e,args:t,startedAtMs:o}))},emitBackgroundSpawn:(e,t)=>{A({cmd:e,args:t,data:{event:`spawn`}})},emitBackgroundCompletion:(e,t,n)=>{s||(s=!0,A({cmd:e,args:t,startedAtMs:o,data:{event:n}}))}}}function ne(){return{emitForegroundCompletion:()=>{},emitBackgroundSpawn:()=>{},emitBackgroundCompletion:()=>{}}}function A(e){let t=e.args.slice(0,6);i({level:`debug`,phase:`exec_command`,durationMs:e.startedAtMs===void 0?void 0:Math.max(0,Date.now()-e.startedAtMs),data:{command:e.cmd,argsPrefix:t,...e.args.length>t.length?{omittedArgCount:e.args.length-t.length}:{},...e.data??{}}})}function j(t){let n=H(t);if(!n)throw new e(`INVALID_ARGS`,`Invalid executable command: ${JSON.stringify(t)}`,{cmd:t,hint:`Use a bare command name from PATH or an absolute executable path.`});return n}function M(e,t,n,r){return r.code===`ENOENT`?N(e,t,r):P(e,t,n,r)}function N(t,n,r){return new e(`TOOL_MISSING`,`${t} not found in PATH`,{cmd:n},r)}function P(t,n,r,i){return new e(`COMMAND_FAILED`,`Failed to run ${t}`,{cmd:n,args:r},i)}function F(t,n,r,i){return new e(`COMMAND_FAILED`,`Failed to write stdin for ${t}`,{cmd:n,args:r},i instanceof Error?i:void 0)}function I(e,n,r){return t({cmd:n,args:r,executable:e})}function re(t,n,r,i,a,o,s){return new e(`COMMAND_FAILED`,`${t} timed out after ${i}ms`,{cmd:n,args:r,stdout:o,stderr:s,exitCode:a,timeoutMs:i})}function ie(t){return t instanceof e&&t.code===`COMMAND_FAILED`&&typeof t.details?.timeoutMs==`number`}function L(t,n,r,i,a,o){return new e(`COMMAND_FAILED`,`${t} exited with code ${i}`,R({stdout:a,stderr:o,exitCode:i},{cmd:n,args:r}))}function ae(t,n,r){if(t.exitCode===0)return t;throw new e(`COMMAND_FAILED`,n,R(t,typeof r==`function`?r(t):r))}function R(e,t){return{stdout:e.stdout,stderr:e.stderr,exitCode:e.exitCode,processExitError:!0,...t}}function z(e,t,n,r,i){return e.didAbort?I(t,n,r):M(t,n,r,i)}function B(e,t,n,r,i,a,o,s){return e.didAbort?I(t,n,r):i!==0&&!a?L(t,n,r,i,o,s):null}function V(t,n,r){let i=t?.trim();if(i){if(!o.isAbsolute(i)||i.includes(`\0`))throw new e(`INVALID_ARGS`,`${n} must be an absolute ${r} path, not ${JSON.stringify(t)}`,{envName:n,path:t});return i}}function H(e){let t=e.trim();return!t||t.includes(`\0`)?null:o.isAbsolute(t)?t:t.includes(`/`)||t.includes(`\\`)?null:h.test(t)?t:null}function U(){if(process.platform!==`win32`)return[``];let e=process.env.PATHEXT;if(!e)return g;let t=e.split(`;`).map(e=>e.trim().toLowerCase()).filter(e=>e.length>0);return t.length>0?t:g}function W(e,t){if(process.platform!==`win32`)return[e];let n=e.toLowerCase();return t.some(e=>n.endsWith(e))?[e]:t.map(t=>`${e}${t}`)}async function G(e){try{return await K(e)?(await l(e,process.platform===`win32`?s.F_OK:s.X_OK),!0):!1}catch{return!1}}async function K(e){try{return(await u(e)).isFile()}catch{return!1}}function q(e){if(!Number.isFinite(e))return;let t=Math.floor(e);if(!(t<=0))return t}function J(e){let t=!1,n=!1,r=null,i=()=>{t&&n&&e.settle(r)};return{requestKill:()=>{t=!0,e.killProcessTree(),i()},recordExit:e=>{n=!0,r=e??1,i()}}}function Y(e,t){let n=!1,r=()=>{n=!0,t()};return e.signal?.aborted?r():e.signal?.addEventListener(`abort`,r,{once:!0}),{get didAbort(){return n},dispose:()=>{e.signal?.removeEventListener(`abort`,r)}}}function X(e,t){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(-e,t),!0}catch{return!1}}function Z(e,t){if(!t.kill){Q(e,t.detached,`SIGKILL`);return}Q(e,t.detached,t.kill.signal);let n=setTimeout(()=>Q(e,t.detached,`SIGKILL`),t.kill.graceMs);n.unref(),e.once(`exit`,()=>clearTimeout(n))}function Q(e,t,n){if(t&&e.pid&&process.platform!==`win32`){X(e.pid,n);return}e.exitCode===null&&e.signalCode===null&&e.kill(n)}function $(e){e.stdin?.destroy(),e.stdout?.destroy(),e.stderr?.destroy()}async function oe(e,t){if(e.stdin){if(t===void 0){e.stdin?.end();return}await m(p.from([t]),e.stdin)}}function se(e){return e instanceof Error&&`code`in e&&e.code===`EPIPE`}export{y as _,ae as a,b as c,O as d,x as f,v as g,ee as h,G as i,te as l,X as m,R as n,w as o,E as p,ie as r,T as s,S as t,D as u};
1
+ import{A as e,O as t}from"./sdk-contracts.js";import{o as n}from"./sdk-remote-config.js";import{a as r,r as i,s as a}from"./diagnostics.js";import o from"node:path";import{constants as s}from"node:fs";import{AsyncLocalStorage as c}from"node:async_hooks";import{access as l,stat as u}from"node:fs/promises";import{spawn as d,spawnSync as f}from"node:child_process";import{Readable as p}from"node:stream";import{pipeline as m}from"node:stream/promises";const h=/^[A-Za-z0-9][A-Za-z0-9._+-]*$/,g=[`.com`,`.exe`,`.bat`,`.cmd`],_=new c;async function v(e,t){return e?await _.run(e,t):await t()}async function y(e){return await _.run(void 0,e)}async function b(e,t,n={}){let r=_.getStore()?.(e,t,n);return r?S(await r):await C(e,t,n)}async function x(e,t,n={}){let r=_.getStore()?.(e,t,n);return r?S(await r):await C(e,t,n)}function S(e){let t=typeof e.stdout==`string`?e.stdout:String(e.stdout??``),n=typeof e.stderr==`string`?e.stderr:String(e.stderr??``),r=typeof e.exitCode==`number`?e.exitCode:1;return t===e.stdout&&n===e.stderr&&r===e.exitCode?e:{...e,stdout:t,stderr:n,exitCode:r}}function C(e,t,n={}){let r=j(e),i=k();return new Promise((a,o)=>{let s=d(r,t,{cwd:n.cwd,env:n.env,stdio:[`pipe`,`pipe`,`pipe`],detached:n.detached,windowsHide:!0,shell:!1});n.onSpawn?.(s);let c=``,l=n.binaryStdout?[]:void 0,u=``,f=!1,p=q(n.timeoutMs),m=null,h=!1;function g(){return!h&&(h=!0,m&&clearTimeout(m),b.dispose(),$(s),i.emitForegroundCompletion(e,t),!0)}function _(e){g()&&o(e)}function v(i){if(!g())return;let s=i??1;if(!b.didAbort&&f&&p){o(re(r,e,t,p,s,c,u));return}let d=B(b,r,e,t,s,n.allowFailure,c,u);if(d){o(d);return}a({stdout:c,stderr:u,exitCode:s,stdoutBuffer:l?Buffer.concat(l):void 0})}let y=J({killProcessTree:()=>Z(s,n),settle:v}),b=Y(n,y.requestKill);m=p?setTimeout(()=>{f=!0,y.requestKill()},p):null,n.binaryStdout||s.stdout.setEncoding(`utf8`),s.stderr.setEncoding(`utf8`),oe(s,n.stdin).catch(i=>{b.didAbort||f||se(i)||(_(F(r,e,t,i)),Z(s,n))}),s.stdout.on(`data`,e=>{if(n.binaryStdout){l?.push(Buffer.isBuffer(e)?e:Buffer.from(e));return}let t=String(e);c+=t,n.onStdoutChunk?.(t)}),s.stderr.on(`data`,e=>{let t=String(e);u+=t,n.onStderrChunk?.(t)}),s.on(`error`,n=>{_(z(b,r,e,t,n))}),s.once(`exit`,y.recordExit),s.once(`close`,v)})}async function ee(e){let t=H(e);if(!t)return!1;if(o.isAbsolute(t))return G(t);let n=process.env.PATH;if(!n)return!1;let r=U();for(let e of n.split(o.delimiter)){let n=e.trim();if(n){for(let e of W(t,r))if(await G(o.join(n,e)))return!0}}return!1}async function w(e,n){let r=V(e,n,`executable`);if(r){if(!await G(r))throw new t(`TOOL_MISSING`,`${n} points to a missing or non-executable file: ${r}`,{envName:n,path:r});return r}}async function T(e,n){let r=V(e,n,`file`);if(r){if(!await K(r))throw new t(`TOOL_MISSING`,`${n} points to a missing or non-file path: ${r}`,{envName:n,path:r});return r}}function E(e,n,r={}){let i=j(e),a=f(i,n,{cwd:r.cwd,env:r.env,stdio:[`pipe`,`pipe`,`pipe`],encoding:r.binaryStdout?void 0:`utf8`,input:r.stdin,timeout:q(r.timeoutMs),windowsHide:!0,shell:!1,...r.maxBuffer===void 0?{}:{maxBuffer:r.maxBuffer}});if(a.error){let o=a.error.code;throw o===`ETIMEDOUT`?new t(`COMMAND_FAILED`,`${i} timed out after ${q(r.timeoutMs)}ms`,{cmd:e,args:n,timeoutMs:q(r.timeoutMs)},a.error):o===`ENOENT`?N(i,e,a.error):P(i,e,n,a.error)}let o=r.binaryStdout?Buffer.isBuffer(a.stdout)?a.stdout:Buffer.from(a.stdout??``):void 0,s=r.binaryStdout?``:typeof a.stdout==`string`?a.stdout:(a.stdout??``).toString(),c=typeof a.stderr==`string`?a.stderr:(a.stderr??``).toString(),l=a.status??1;if(l!==0&&!r.allowFailure)throw L(i,e,n,l,s,c);return{stdout:s,stderr:c,exitCode:l,stdoutBuffer:o}}function D(e,t,n={}){return O(e,t,n).pid}function O(e,t,n={}){let r=j(e),i=d(r,t,{cwd:n.cwd,env:n.env,stdio:n.stdio??`ignore`,detached:!0,windowsHide:!0,shell:!1}),a=i.pid??0,o=new Promise(e=>{i.once(`error`,t=>{e({pid:a,error:t.message})}),i.once(`exit`,(t,n)=>{e({pid:a,...typeof t==`number`?{exitCode:t}:{},...n?{signal:n}:{}})})});return i.unref(),{pid:a,exited:o}}function te(e,t,n={}){let r=j(e),i=k(),a=d(r,t,{cwd:n.cwd,env:n.env,stdio:n.stdio??[`ignore`,`pipe`,`pipe`],detached:n.detached,windowsHide:!0,shell:!1});i.emitBackgroundSpawn(e,t);let o=``,s=``;return(n.captureOutput??!0)&&(a.stdout?.setEncoding(`utf8`),a.stderr?.setEncoding(`utf8`),a.stdout?.on(`data`,e=>{o+=e}),a.stderr?.on(`data`,e=>{s+=e})),{child:a,wait:new Promise((c,l)=>{let u=!1;function d(n){return!u&&(u=!0,m.dispose(),$(a),i.emitBackgroundCompletion(e,t,n),!0)}function f(i){if(!d(`exit`))return;let a=i??1,u=B(m,r,e,t,a,n.allowFailure,o,s);if(u){l(u);return}c({stdout:o,stderr:s,exitCode:a})}let p=J({killProcessTree:()=>Z(a,n),settle:f}),m=Y(n,p.requestKill);a.on(`error`,n=>{d(`error`)&&l(z(m,r,e,t,n))}),a.once(`exit`,p.recordExit),a.once(`close`,f)})}}function k(){let e=r(),t=e.debug===!0,i=n(process.env.AGENT_DEVICE_EXEC_TRACE??``)===!0;if(!t&&!i)return ne();i&&e.flushOnSuccess!==!0&&a({flushOnSuccess:!0});let o=Date.now(),s=!1;return{emitForegroundCompletion:(e,t)=>{s||(s=!0,A({cmd:e,args:t,startedAtMs:o}))},emitBackgroundSpawn:(e,t)=>{A({cmd:e,args:t,data:{event:`spawn`}})},emitBackgroundCompletion:(e,t,n)=>{s||(s=!0,A({cmd:e,args:t,startedAtMs:o,data:{event:n}}))}}}function ne(){return{emitForegroundCompletion:()=>{},emitBackgroundSpawn:()=>{},emitBackgroundCompletion:()=>{}}}function A(e){let t=e.args.slice(0,6);i({level:`debug`,phase:`exec_command`,durationMs:e.startedAtMs===void 0?void 0:Math.max(0,Date.now()-e.startedAtMs),data:{command:e.cmd,argsPrefix:t,...e.args.length>t.length?{omittedArgCount:e.args.length-t.length}:{},...e.data??{}}})}function j(e){let n=H(e);if(!n)throw new t(`INVALID_ARGS`,`Invalid executable command: ${JSON.stringify(e)}`,{cmd:e,hint:`Use a bare command name from PATH or an absolute executable path.`});return n}function M(e,t,n,r){return r.code===`ENOENT`?N(e,t,r):P(e,t,n,r)}function N(e,n,r){return new t(`TOOL_MISSING`,`${e} not found in PATH`,{cmd:n},r)}function P(e,n,r,i){return new t(`COMMAND_FAILED`,`Failed to run ${e}`,{cmd:n,args:r},i)}function F(e,n,r,i){return new t(`COMMAND_FAILED`,`Failed to write stdin for ${e}`,{cmd:n,args:r},i instanceof Error?i:void 0)}function I(t,n,r){return e({cmd:n,args:r,executable:t})}function re(e,n,r,i,a,o,s){return new t(`COMMAND_FAILED`,`${e} timed out after ${i}ms`,{cmd:n,args:r,stdout:o,stderr:s,exitCode:a,timeoutMs:i})}function ie(e){return e instanceof t&&e.code===`COMMAND_FAILED`&&typeof e.details?.timeoutMs==`number`}function L(e,n,r,i,a,o){return new t(`COMMAND_FAILED`,`${e} exited with code ${i}`,R({stdout:a,stderr:o,exitCode:i},{cmd:n,args:r}))}function ae(e,n,r){if(e.exitCode===0)return e;throw new t(`COMMAND_FAILED`,n,R(e,typeof r==`function`?r(e):r))}function R(e,t){return{stdout:e.stdout,stderr:e.stderr,exitCode:e.exitCode,processExitError:!0,...t}}function z(e,t,n,r,i){return e.didAbort?I(t,n,r):M(t,n,r,i)}function B(e,t,n,r,i,a,o,s){return e.didAbort?I(t,n,r):i!==0&&!a?L(t,n,r,i,o,s):null}function V(e,n,r){let i=e?.trim();if(i){if(!o.isAbsolute(i)||i.includes(`\0`))throw new t(`INVALID_ARGS`,`${n} must be an absolute ${r} path, not ${JSON.stringify(e)}`,{envName:n,path:e});return i}}function H(e){let t=e.trim();return!t||t.includes(`\0`)?null:o.isAbsolute(t)?t:t.includes(`/`)||t.includes(`\\`)?null:h.test(t)?t:null}function U(){if(process.platform!==`win32`)return[``];let e=process.env.PATHEXT;if(!e)return g;let t=e.split(`;`).map(e=>e.trim().toLowerCase()).filter(e=>e.length>0);return t.length>0?t:g}function W(e,t){if(process.platform!==`win32`)return[e];let n=e.toLowerCase();return t.some(e=>n.endsWith(e))?[e]:t.map(t=>`${e}${t}`)}async function G(e){try{return await K(e)?(await l(e,process.platform===`win32`?s.F_OK:s.X_OK),!0):!1}catch{return!1}}async function K(e){try{return(await u(e)).isFile()}catch{return!1}}function q(e){if(!Number.isFinite(e))return;let t=Math.floor(e);if(!(t<=0))return t}function J(e){let t=!1,n=!1,r=null,i=()=>{t&&n&&e.settle(r)};return{requestKill:()=>{t=!0,e.killProcessTree(),i()},recordExit:e=>{n=!0,r=e??1,i()}}}function Y(e,t){let n=!1,r=()=>{n=!0,t()};return e.signal?.aborted?r():e.signal?.addEventListener(`abort`,r,{once:!0}),{get didAbort(){return n},dispose:()=>{e.signal?.removeEventListener(`abort`,r)}}}function X(e,t){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(-e,t),!0}catch{return!1}}function Z(e,t){if(!t.kill){Q(e,t.detached,`SIGKILL`);return}Q(e,t.detached,t.kill.signal);let n=setTimeout(()=>Q(e,t.detached,`SIGKILL`),t.kill.graceMs);n.unref(),e.once(`exit`,()=>clearTimeout(n))}function Q(e,t,n){if(t&&e.pid&&process.platform!==`win32`){X(e.pid,n);return}e.exitCode===null&&e.signalCode===null&&e.kill(n)}function $(e){e.stdin?.destroy(),e.stdout?.destroy(),e.stderr?.destroy()}async function oe(e,t){if(e.stdin){if(t===void 0){e.stdin?.end();return}await m(p.from([t]),e.stdin)}}function se(e){return e instanceof Error&&`code`in e&&e.code===`EPIPE`}export{y as _,ae as a,b as c,O as d,x as f,v as g,ee as h,G as i,te as l,X as m,R as n,w as o,E as p,ie as r,T as s,S as t,D as u};
package/dist/src/file.js CHANGED
@@ -1 +1 @@
1
- import{D as e}from"./sdk-contracts.js";import{r as t}from"./diagnostics.js";import{D as n,i as r,t as i}from"./owner-identity.js";import{t as a}from"./timeouts.js";import o from"node:path";import s from"node:fs";import c from"node:crypto";const l=`.lock`;async function u(e){let t=await e.acquire();try{let n=await e.task();return await t(),n}catch(e){throw await t().catch(()=>void 0),e}}const d=new Set,f=c.randomUUID();async function p(n){let{lockDirPath:r,owner:i}=n,l=o.join(r,`owner.json`),u=Date.now()+(n.timeoutMs??3e4),p=n.pollMs??100,_=n.ownerGraceMs??5e3,y=n.description??`process lock`;s.mkdirSync(o.dirname(r),{recursive:!0});let b=c.randomUUID(),x={...i,claimToken:b,claimIssuerId:f};for(;Date.now()<u;)try{s.mkdirSync(r),h(l,x),d.add(b);let n=!1;return async()=>{if(!n){if(d.delete(b),g(r,l,x)!==`unverified`){n=!0;return}throw t({level:`warn`,phase:`process_lock_release_unverified`,data:{lockDirPath:r,description:y,ownerReleaseUnverified:!0}}),new e(`COMMAND_FAILED`,`Cannot verify ownership of ${y}`,{lockDirPath:r,ownerReleaseUnverified:!0,hint:m(r)})}}}catch(e){let t=e;if(t.code!==`EEXIST`)throw t;if(v(r,l,_))continue;await a(p)}let S=k(l);throw new e(`COMMAND_FAILED`,`Timed out waiting for ${y}`,{lockDirPath:r,...M(r,S),...S.kind===`unreadable`?{hint:m(r)}:{}})}function m(e){return`Remove ${e} once you have confirmed no live process holds it, then retry.`}function h(e,t){n({destination:e,contents:JSON.stringify(t)})}function g(e,t,n){let i=k(t);return i.kind===`unreadable`?`unverified`:i.kind===`unwritten`||!r(i.owner,n)||i.owner.claimToken!==n.claimToken?`not-owner`:_(e,t)}function _(e,t){try{s.unlinkSync(t)}catch(e){if(O(e)!==`ENOENT`)return`unverified`}try{return s.rmdirSync(e),`removed`}catch(e){return O(e)===`ENOENT`?`removed`:`unverified`}}function v(e,t,n){let r;try{r=s.statSync(e)}catch{return!0}if(!r.isDirectory())return y(r,n)&&b(e,t,n,{kind:`stray`});let i=k(t);return i.kind===`owner`?(!N(i.owner)||P(i.owner))&&b(e,t,n,{kind:`dead-claim`,claimToken:i.owner.claimToken}):i.kind!==`unreadable`&&y(r,n)&&b(e,t,n,{kind:`empty`})}function y(e,t){return Date.now()-e.mtimeMs>=t}function b(e,t,n,r){if(!T(e,n))return!1;try{switch(r.kind){case`dead-claim`:return x(e,t,r.claimToken);case`empty`:return S(e,n);case`stray`:return C(e)}}finally{D(e)}}function x(e,t,n){let r=k(t);if(r.kind!==`owner`||r.owner.claimToken!==n)return!1;try{return s.rmSync(e,{recursive:!0,force:!0}),!0}catch{return!1}}function S(e,t){let n;try{n=s.statSync(e)}catch{return!1}if(!n.isDirectory()||!y(n,t))return!1;try{return s.rmdirSync(e),!0}catch{return!1}}function C(e){try{return s.unlinkSync(e),!0}catch{return!1}}function w(e){return`${e.endsWith(l)?e.slice(0,-5):e}.reclaim${l}`}function T(e,t){let n=w(e);for(let e=0;e<2;e+=1)try{return s.mkdirSync(n),!0}catch(e){if(O(e)!==`EEXIST`)throw e;if(!E(n,t))return!1}return!1}function E(e,t){let n;try{n=s.statSync(e)}catch{return!0}if(Date.now()-n.mtimeMs<t)return!1;try{s.rmdirSync(e)}catch{}return!0}function D(e){try{s.rmdirSync(w(e))}catch{}}function O(e){return e?.code}function k(e){let t;try{t=s.readFileSync(e,`utf8`)}catch(e){return e?.code===`ENOENT`?{kind:`unwritten`}:{kind:`unreadable`}}let n=A(t);return n?{kind:`owner`,owner:n}:{kind:`unreadable`}}function A(e){let t;try{t=JSON.parse(e)}catch{return null}if(typeof t!=`object`||!t)return null;let n=t;for(let[e,t]of Object.entries(j))if(!t(n[e]))return null;return{pid:n.pid,startTime:typeof n.startTime==`string`?n.startTime:null,acquiredAtMs:n.acquiredAtMs,claimToken:typeof n.claimToken==`string`?n.claimToken:null,claimIssuerId:typeof n.claimIssuerId==`string`?n.claimIssuerId:void 0}}const j={pid:e=>typeof e==`number`&&Number.isInteger(e)&&e>0,acquiredAtMs:e=>typeof e==`number`&&Number.isFinite(e),startTime:e=>e==null||typeof e==`string`};function M(e,t){let n=Date.now(),r;try{r=Math.max(0,Math.round(n-s.statSync(e).mtimeMs))}catch{}return{...r===void 0?{}:{lockAgeMs:r},...t.kind===`owner`?{ownerPid:t.owner.pid,ownerStartTime:t.owner.startTime,ownerAgeMs:Math.max(0,Math.round(n-t.owner.acquiredAtMs)),ownerLiveness:i({owner:t.owner})}:t.kind===`unreadable`?{ownerRecordUnreadable:!0}:{}}}function N(e){let t=i({owner:e});return t!==`owner-process-dead`&&t!==`owner-process-reused`}function P(e){return e.pid!==process.pid||e.claimToken===null||e.claimIssuerId!==f?!1:!d.has(e.claimToken)}export{u as n,p as t};
1
+ import{O as e}from"./sdk-contracts.js";import{r as t}from"./diagnostics.js";import{D as n,i as r,t as i}from"./owner-identity.js";import{t as a}from"./timeouts.js";import o from"node:path";import s from"node:fs";import c from"node:crypto";const l=`.lock`;async function u(e){let t=await e.acquire();try{let n=await e.task();return await t(),n}catch(e){throw await t().catch(()=>void 0),e}}const d=new Set,f=c.randomUUID();async function p(n){let{lockDirPath:r,owner:i}=n,l=o.join(r,`owner.json`),u=Date.now()+(n.timeoutMs??3e4),p=n.pollMs??100,_=n.ownerGraceMs??5e3,y=n.description??`process lock`;s.mkdirSync(o.dirname(r),{recursive:!0});let b=c.randomUUID(),x={...i,claimToken:b,claimIssuerId:f};for(;Date.now()<u;)try{s.mkdirSync(r),h(l,x),d.add(b);let n=!1;return async()=>{if(!n){if(d.delete(b),g(r,l,x)!==`unverified`){n=!0;return}throw t({level:`warn`,phase:`process_lock_release_unverified`,data:{lockDirPath:r,description:y,ownerReleaseUnverified:!0}}),new e(`COMMAND_FAILED`,`Cannot verify ownership of ${y}`,{lockDirPath:r,ownerReleaseUnverified:!0,hint:m(r)})}}}catch(e){let t=e;if(t.code!==`EEXIST`)throw t;if(v(r,l,_))continue;await a(p)}let S=k(l);throw new e(`COMMAND_FAILED`,`Timed out waiting for ${y}`,{lockDirPath:r,...M(r,S),...S.kind===`unreadable`?{hint:m(r)}:{}})}function m(e){return`Remove ${e} once you have confirmed no live process holds it, then retry.`}function h(e,t){n({destination:e,contents:JSON.stringify(t)})}function g(e,t,n){let i=k(t);return i.kind===`unreadable`?`unverified`:i.kind===`unwritten`||!r(i.owner,n)||i.owner.claimToken!==n.claimToken?`not-owner`:_(e,t)}function _(e,t){try{s.unlinkSync(t)}catch(e){if(O(e)!==`ENOENT`)return`unverified`}try{return s.rmdirSync(e),`removed`}catch(e){return O(e)===`ENOENT`?`removed`:`unverified`}}function v(e,t,n){let r;try{r=s.statSync(e)}catch{return!0}if(!r.isDirectory())return y(r,n)&&b(e,t,n,{kind:`stray`});let i=k(t);return i.kind===`owner`?(!N(i.owner)||P(i.owner))&&b(e,t,n,{kind:`dead-claim`,claimToken:i.owner.claimToken}):i.kind!==`unreadable`&&y(r,n)&&b(e,t,n,{kind:`empty`})}function y(e,t){return Date.now()-e.mtimeMs>=t}function b(e,t,n,r){if(!T(e,n))return!1;try{switch(r.kind){case`dead-claim`:return x(e,t,r.claimToken);case`empty`:return S(e,n);case`stray`:return C(e)}}finally{D(e)}}function x(e,t,n){let r=k(t);if(r.kind!==`owner`||r.owner.claimToken!==n)return!1;try{return s.rmSync(e,{recursive:!0,force:!0}),!0}catch{return!1}}function S(e,t){let n;try{n=s.statSync(e)}catch{return!1}if(!n.isDirectory()||!y(n,t))return!1;try{return s.rmdirSync(e),!0}catch{return!1}}function C(e){try{return s.unlinkSync(e),!0}catch{return!1}}function w(e){return`${e.endsWith(l)?e.slice(0,-5):e}.reclaim${l}`}function T(e,t){let n=w(e);for(let e=0;e<2;e+=1)try{return s.mkdirSync(n),!0}catch(e){if(O(e)!==`EEXIST`)throw e;if(!E(n,t))return!1}return!1}function E(e,t){let n;try{n=s.statSync(e)}catch{return!0}if(Date.now()-n.mtimeMs<t)return!1;try{s.rmdirSync(e)}catch{}return!0}function D(e){try{s.rmdirSync(w(e))}catch{}}function O(e){return e?.code}function k(e){let t;try{t=s.readFileSync(e,`utf8`)}catch(e){return e?.code===`ENOENT`?{kind:`unwritten`}:{kind:`unreadable`}}let n=A(t);return n?{kind:`owner`,owner:n}:{kind:`unreadable`}}function A(e){let t;try{t=JSON.parse(e)}catch{return null}if(typeof t!=`object`||!t)return null;let n=t;for(let[e,t]of Object.entries(j))if(!t(n[e]))return null;return{pid:n.pid,startTime:typeof n.startTime==`string`?n.startTime:null,acquiredAtMs:n.acquiredAtMs,claimToken:typeof n.claimToken==`string`?n.claimToken:null,claimIssuerId:typeof n.claimIssuerId==`string`?n.claimIssuerId:void 0}}const j={pid:e=>typeof e==`number`&&Number.isInteger(e)&&e>0,acquiredAtMs:e=>typeof e==`number`&&Number.isFinite(e),startTime:e=>e==null||typeof e==`string`};function M(e,t){let n=Date.now(),r;try{r=Math.max(0,Math.round(n-s.statSync(e).mtimeMs))}catch{}return{...r===void 0?{}:{lockAgeMs:r},...t.kind===`owner`?{ownerPid:t.owner.pid,ownerStartTime:t.owner.startTime,ownerAgeMs:Math.max(0,Math.round(n-t.owner.acquiredAtMs)),ownerLiveness:i({owner:t.owner})}:t.kind===`unreadable`?{ownerRecordUnreadable:!0}:{}}}function N(e){let t=i({owner:e});return t!==`owner-process-dead`&&t!==`owner-process-reused`}function P(e){return e.pid!==process.pid||e.claimToken===null||e.claimIssuerId!==f?!1:!d.has(e.claimToken)}export{u as n,p as t};
package/dist/src/find.js CHANGED
@@ -1 +1 @@
1
- import{g as e,o as t,u as n}from"./sdk-contracts.js";import{Ln as r,Lt as i,Mn as a,Nn as o,Pn as s,gt as c}from"./sdk-batch.js";import{c as l}from"./session-store.js";import{I as u,P as d,z as f}from"./session-snapshot.js";import{C as p,S as m,c as h,h as g,u as _}from"./runtime.js";import{r as v,t as y}from"./success-text.js";import{p as b}from"./absence-observation-errors.js";import{s as x}from"./quality-warnings.js";import{t as S}from"./internal/daemon.js";import{n as C}from"./capture-disclosure.js";import{t as w}from"./snapshot-runtime-binding.js";import{l as T,n as E}from"./selector-runtime.js";import{t as D}from"./type-text-runtime.js";function O(t,n){let r=n[0]?.rect;if(!r)return t;let i=t.filter(t=>{if(!t.rect)return!1;let n=e(t.rect);return n.x>=r.x&&n.x<=r.x+r.width&&n.y>=r.y&&n.y<=r.y+r.height}),a=i.length>0?i:t;return a.length<2?a:k(a,n,m(n))}function k(e,t,n){return e.map((e,r)=>({node:e,index:r,score:A(e,t,n)})).sort((e,t)=>t.score===e.score?M(e.node)-M(t.node)||e.index-t.index:t.score-e.score).map(e=>e.node)}function A(e,t,n){let r=n(e);if(r.reason===`covered`)return 0;let i=j(r,t[0]);return i>0?i:e.hittable&&e.rect&&!p(e,t[0])?3:+!!e.rect}function j(e,t){return e.node.rect?e.reason===`semantic-target`||e.reason===`same-rect-descendant`?4:e.reason===`hittable-ancestor`&&!p(e.node,t)?2:0:0}function M(e){return e.rect?e.rect.width*e.rect.height:1/0}function N(e,n,r){let i={matches:e.length,candidates:e.slice(0,5).map(e=>b(e,0,!1))};return t(`AMBIGUOUS_MATCH`,`find matched ${e.length} elements for ${n} "${r}". Use a more specific locator or selector.`,{locator:n,query:r,...i})}function P(e){if(e.ambiguity!==`reject-candidates`)throw Error(`find's resolution policy must reject candidates, got "${e.ambiguity}"`)}function F(e){let{nodes:n,locator:r,query:i,selectorExpression:a,flags:s,platform:c}=e,l=g.findAct,u=n.filter(e=>!p(e,n[0])),d=l.resolution,f;if(f=a?h(l,u,a,{platform:c}).list?.matchedNodes??[]:o(u,r,i,{requireRect:d.requireRect}).matches,f=O(f,n),f.length>1){P(d);let e=I(f,s);if(!e)return{ok:!1,response:N(f,r,i)};f=e}let m=f[0]??null;return m?{ok:!0,node:m}:{ok:!1,response:t(`COMMAND_FAILED`,`find did not match any element`)}}function I(e,t){return t?.findFirst?[e[0]]:t?.findLast?[e.at(-1)]:null}function L(e){let{device:t,session:n,req:r,logPath:i,locator:a,query:o,sessionStore:s,sessionName:c}=e,l=T({device:t,session:n,sessionStore:s,sessionName:c,req:r,logPath:i,capture:e.capture,activationProof:e.activationProof});return async()=>{let{snapshot:e}=await l.capture({flags:{...r.flags,snapshotInteractiveOnly:!0},recovery:{legacyIosSparse:{query:o,shouldScope:z(a)},sparseVerdictQueryScope:{query:o,shouldScope:z(a)}}});return e}}function R(e){return t(`COMMAND_FAILED`,`find could not read the current accessibility tree`,{reason:e.reason,hint:`The snapshot quality verdict is sparse. Use screenshot as visual truth, navigate with coordinates if needed, then retry find after reaching a readable screen.`})}function z(e){return e!==`role`}async function B(e){let{req:o,sessionName:l,logPath:u,sessionStore:d,invoke:f}=e,p=o.command;if(p!==`find`)return null;let m=o.positionals??[],h=a(m,o.flags);if(!h.ok)return t(h.code,h.message);let{locator:v,query:y,action:b,value:S}=h.parsed;if(o.flags?.record&&!s(b))return t(`INVALID_ARGS`,`find ${b} is a mutating action and is always recorded; --record only applies to a read-only find (exists, wait, list, get text, get attrs).`);let T=await E({req:o,sessionName:l,logPath:u,sessionStore:d,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(T)return T;let D=d.get(l);if(!D)return n();let O=D.device,k=await w({command:`find`,device:O,session:D,plan:i({hasActiveApp:D.appBundleId!==void 0,intent:c(b)}),inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(!k.ok)return k.response;let A=r(v,y),j={},M=L({device:O,session:D,req:o,logPath:u,locator:v,query:y,sessionStore:d,sessionName:l,capture:k.capture,activationProof:j}),N={req:o,sessionName:l,logPath:u,sessionStore:d,invoke:f,session:D,device:O,command:p,locator:v,query:y,publicFlags:X(o.flags),boundFocusPoint:k.focusPoint,boundTypeText:k.typeText},P=await M();if(x(P.snapshotQuality))return C({response:R(P.snapshotQuality),consumedTree:P,activationProof:j});let{nodes:I}=P,z=F({nodes:I,locator:v,query:y,selectorExpression:A,flags:o.flags,platform:O.platform});if(!z.ok)return C({response:z.response,consumedTree:P,activationProof:j});let B=z.node,H=await _(g.findAct,I,B),U=H.node,W=`@${U.ref}`,G={...o.flags??{},noRecord:!0},K=await V(N,{node:B,resolvedNode:U,ref:W,nodes:I,...P.iosSystemSurfaceBundleId?{iosSystemSurfaceBundleId:P.iosSystemSurfaceBundleId}:{},...P.keyboard?{keyboard:P.keyboard}:{},actionFlags:G,...H.kind===`occluded`?{occludedNode:H.node}:{}},b,S);return K&&C({response:K,consumedTree:P,activationProof:j})}async function V(e,t,n,r){let i={click:()=>U(e,t),fill:()=>W(e,t,r),focus:()=>G(e,t),type:()=>K(e,t,r)}[n];return i?await i():null}function H(e){return{ref:e.ref,node:e.resolvedNode,nodes:e.nodes,...e.iosSystemSurfaceBundleId?{iosSystemSurfaceBundleId:e.iosSystemSurfaceBundleId}:{},...e.keyboard?{keyboard:e.keyboard}:{}}}async function U(t,n){let{req:r,sessionName:i,sessionStore:a,session:o,invoke:s,command:c,locator:u,query:d,publicFlags:f}=t,p=await s({token:r.token,session:i,command:`click`,positionals:[n.ref],flags:n.actionFlags,internal:{findResolvedTarget:H(n)}});if(!p.ok)return p;let m=n.resolvedNode.rect?e(n.resolvedNode.rect):n.node.rect?e(n.node.rect):null,h={ref:n.ref,locator:u,query:d};m&&(h.x=m.x,h.y=m.y);let g=y(p.data)??`Tapped ${n.ref}${m?` (${m.x}, ${m.y})`:``}`;return Object.assign(h,v(g)),l(a,o,r,c,{ref:n.ref,action:`click`,locator:u,query:d},{flags:f}),{ok:!0,data:h}}async function W(e,n,r){let{req:i,sessionName:a,sessionStore:o,session:s,invoke:c,command:u,publicFlags:d}=e;if(r===void 0)return t(`INVALID_ARGS`,`find fill requires text (use "" to clear the field)`);let f=await c({token:i.token,session:a,command:`fill`,positionals:[n.ref,r],flags:n.actionFlags,internal:{findResolvedTarget:H(n)}});return f.ok&&l(o,s,i,u,{ref:n.ref,action:`fill`},{flags:d}),f}async function G(e,t){let n=await q(e,t);return n.ok&&Y(e,t,`focus`),n}async function K(e,n,r){let{req:i,logPath:a,session:o}=e;if(!r)return t(`INVALID_ARGS`,`find type requires text`);let s=await q(e,n);if(!s.ok)return s;f(o);let c=e.boundTypeText;if(!c)return t(`COMMAND_FAILED`,`find type was admitted without a text-entry operation`);let l=await D({operations:{typeText:c}},[r],u(a,i.flags,o.appBundleId,o.trace?.outPath));return Y(e,n,`type`),{ok:!0,data:l??{ref:n.ref}}}async function q(n,r){let{req:i,logPath:a,session:o}=n,s=J(r,`be focused`);if(s)return s;let c=r.resolvedNode.rect?e(r.resolvedNode.rect):null;if(!c)return t(`COMMAND_FAILED`,`matched element has no bounds`);f(o);let l=n.boundFocusPoint;return l?{ok:!0,data:await S({operations:{focusPoint:l}},c,u(a,i.flags,o.appBundleId,o.trace?.outPath))??{ref:r.ref}}:t(`COMMAND_FAILED`,`find focus was admitted without a focus operation`)}function J(e,n){let r=e.occludedNode;return r?t(`COMMAND_FAILED`,`Matched element ${e.ref} is covered by another visible element and cannot ${n} safely`,{ref:`@${r.ref}`,interactionBlocked:r.interactionBlocked,hint:`Use a different visible target, scroll it clear of the overlay, or inspect with snapshot/screenshot before retrying.`}):null}function Y(e,t,n){let{req:r,sessionStore:i,session:a,command:o,publicFlags:s}=e;l(i,a,r,o,{ref:t.ref,action:n},{flags:s})}function X(e){return{...d(e)??{}}}export{B as handleFindCommands};
1
+ import{g as e,o as t,u as n}from"./sdk-contracts.js";import{Ln as r,Lt as i,Mn as a,Nn as o,Pn as s,gt as c}from"./sdk-batch.js";import{c as l}from"./session-store.js";import{B as u,F as d,L as f}from"./session-snapshot.js";import{C as p,S as m,c as h,h as g,u as _}from"./runtime.js";import{r as v,t as y}from"./success-text.js";import{p as b}from"./absence-observation-errors.js";import{s as x}from"./quality-warnings.js";import{t as S}from"./internal/daemon.js";import{n as C}from"./capture-disclosure.js";import{t as w}from"./snapshot-runtime-binding.js";import{l as T,n as E}from"./selector-runtime.js";import{t as D}from"./type-text-runtime.js";function O(t,n){let r=n[0]?.rect;if(!r)return t;let i=t.filter(t=>{if(!t.rect)return!1;let n=e(t.rect);return n.x>=r.x&&n.x<=r.x+r.width&&n.y>=r.y&&n.y<=r.y+r.height}),a=i.length>0?i:t;return a.length<2?a:k(a,n,m(n))}function k(e,t,n){return e.map((e,r)=>({node:e,index:r,score:A(e,t,n)})).sort((e,t)=>t.score===e.score?M(e.node)-M(t.node)||e.index-t.index:t.score-e.score).map(e=>e.node)}function A(e,t,n){let r=n(e);if(r.reason===`covered`)return 0;let i=j(r,t[0]);return i>0?i:e.hittable&&e.rect&&!p(e,t[0])?3:+!!e.rect}function j(e,t){return e.node.rect?e.reason===`semantic-target`||e.reason===`same-rect-descendant`?4:e.reason===`hittable-ancestor`&&!p(e.node,t)?2:0:0}function M(e){return e.rect?e.rect.width*e.rect.height:1/0}function N(e,n,r){let i={matches:e.length,candidates:e.slice(0,5).map(e=>b(e,0,!1))};return t(`AMBIGUOUS_MATCH`,`find matched ${e.length} elements for ${n} "${r}". Use a more specific locator or selector.`,{locator:n,query:r,...i})}function P(e){if(e.ambiguity!==`reject-candidates`)throw Error(`find's resolution policy must reject candidates, got "${e.ambiguity}"`)}function F(e){let{nodes:n,locator:r,query:i,selectorExpression:a,flags:s,platform:c}=e,l=g.findAct,u=n.filter(e=>!p(e,n[0])),d=l.resolution,f;if(f=a?h(l,u,a,{platform:c}).list?.matchedNodes??[]:o(u,r,i,{requireRect:d.requireRect}).matches,f=O(f,n),f.length>1){P(d);let e=I(f,s);if(!e)return{ok:!1,response:N(f,r,i)};f=e}let m=f[0]??null;return m?{ok:!0,node:m}:{ok:!1,response:t(`COMMAND_FAILED`,`find did not match any element`)}}function I(e,t){return t?.findFirst?[e[0]]:t?.findLast?[e.at(-1)]:null}function L(e){let{device:t,session:n,req:r,logPath:i,locator:a,query:o,sessionStore:s,sessionName:c}=e,l=T({device:t,session:n,sessionStore:s,sessionName:c,req:r,logPath:i,capture:e.capture,captureProof:e.captureProof});return async()=>{let{snapshot:e}=await l.capture({flags:{...r.flags,snapshotInteractiveOnly:!0},recovery:{legacyIosSparse:{query:o,shouldScope:z(a)},sparseVerdictQueryScope:{query:o,shouldScope:z(a)}}});return e}}function R(e){return t(`COMMAND_FAILED`,`find could not read the current accessibility tree`,{reason:e.reason,hint:`The snapshot quality verdict is sparse. Use screenshot as visual truth, navigate with coordinates if needed, then retry find after reaching a readable screen.`})}function z(e){return e!==`role`}async function B(e){let{req:o,sessionName:l,logPath:u,sessionStore:d,invoke:f}=e,p=o.command;if(p!==`find`)return null;let m=o.positionals??[],h=a(m,o.flags);if(!h.ok)return t(h.code,h.message);let{locator:v,query:y,action:b,value:S}=h.parsed;if(o.flags?.record&&!s(b))return t(`INVALID_ARGS`,`find ${b} is a mutating action and is always recorded; --record only applies to a read-only find (exists, wait, list, get text, get attrs).`);let T=await E({req:o,sessionName:l,logPath:u,sessionStore:d,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(T)return T;let D=d.get(l);if(!D)return n();let O=D.device,k=await w({command:`find`,device:O,session:D,plan:i({hasActiveApp:D.appBundleId!==void 0,intent:c(b)}),inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(!k.ok)return k.response;let A=r(v,y),j={},M=L({device:O,session:D,req:o,logPath:u,locator:v,query:y,sessionStore:d,sessionName:l,capture:k.capture,captureProof:j}),N={req:o,sessionName:l,logPath:u,sessionStore:d,invoke:f,session:D,device:O,command:p,locator:v,query:y,publicFlags:X(o.flags),boundFocusPoint:k.focusPoint,boundTypeText:k.typeText},P=await M();if(x(P.snapshotQuality))return C({response:R(P.snapshotQuality),consumedTree:P,captureProof:j});let{nodes:I}=P,z=F({nodes:I,locator:v,query:y,selectorExpression:A,flags:o.flags,platform:O.platform});if(!z.ok)return C({response:z.response,consumedTree:P,captureProof:j});let B=z.node,H=await _(g.findAct,I,B),U=H.node,W=`@${U.ref}`,G={...o.flags??{},noRecord:!0},K=await V(N,{node:B,resolvedNode:U,ref:W,nodes:I,...P.iosSystemSurfaceBundleId?{iosSystemSurfaceBundleId:P.iosSystemSurfaceBundleId}:{},...P.keyboard?{keyboard:P.keyboard}:{},actionFlags:G,...H.kind===`occluded`?{occludedNode:H.node}:{}},b,S);return K&&C({response:K,consumedTree:P,captureProof:j})}async function V(e,t,n,r){let i={click:()=>U(e,t),fill:()=>W(e,t,r),focus:()=>G(e,t),type:()=>K(e,t,r)}[n];return i?await i():null}function H(e){return{ref:e.ref,node:e.resolvedNode,nodes:e.nodes,...e.iosSystemSurfaceBundleId?{iosSystemSurfaceBundleId:e.iosSystemSurfaceBundleId}:{},...e.keyboard?{keyboard:e.keyboard}:{}}}async function U(t,n){let{req:r,sessionName:i,sessionStore:a,session:o,invoke:s,command:c,locator:u,query:d,publicFlags:f}=t,p=await s({token:r.token,session:i,command:`click`,positionals:[n.ref],flags:n.actionFlags,internal:{findResolvedTarget:H(n)}});if(!p.ok)return p;let m=n.resolvedNode.rect?e(n.resolvedNode.rect):n.node.rect?e(n.node.rect):null,h={ref:n.ref,locator:u,query:d};m&&(h.x=m.x,h.y=m.y);let g=y(p.data)??`Tapped ${n.ref}${m?` (${m.x}, ${m.y})`:``}`;return Object.assign(h,v(g)),l(a,o,r,c,{ref:n.ref,action:`click`,locator:u,query:d},{flags:f}),{ok:!0,data:h}}async function W(e,n,r){let{req:i,sessionName:a,sessionStore:o,session:s,invoke:c,command:u,publicFlags:d}=e;if(r===void 0)return t(`INVALID_ARGS`,`find fill requires text (use "" to clear the field)`);let f=await c({token:i.token,session:a,command:`fill`,positionals:[n.ref,r],flags:n.actionFlags,internal:{findResolvedTarget:H(n)}});return f.ok&&l(o,s,i,u,{ref:n.ref,action:`fill`},{flags:d}),f}async function G(e,t){let n=await q(e,t);return n.ok&&Y(e,t,`focus`),n}async function K(e,n,r){let{req:i,logPath:a,session:o}=e;if(!r)return t(`INVALID_ARGS`,`find type requires text`);let s=await q(e,n);if(!s.ok)return s;u(o);let c=e.boundTypeText;if(!c)return t(`COMMAND_FAILED`,`find type was admitted without a text-entry operation`);let l=await D({operations:{typeText:c}},[r],f(a,i.flags,o.appBundleId,o.trace?.outPath));return Y(e,n,`type`),{ok:!0,data:l??{ref:n.ref}}}async function q(n,r){let{req:i,logPath:a,session:o}=n,s=J(r,`be focused`);if(s)return s;let c=r.resolvedNode.rect?e(r.resolvedNode.rect):null;if(!c)return t(`COMMAND_FAILED`,`matched element has no bounds`);u(o);let l=n.boundFocusPoint;return l?{ok:!0,data:await S({operations:{focusPoint:l}},c,f(a,i.flags,o.appBundleId,o.trace?.outPath))??{ref:r.ref}}:t(`COMMAND_FAILED`,`find focus was admitted without a focus operation`)}function J(e,n){let r=e.occludedNode;return r?t(`COMMAND_FAILED`,`Matched element ${e.ref} is covered by another visible element and cannot ${n} safely`,{ref:`@${r.ref}`,interactionBlocked:r.interactionBlocked,hint:`Use a different visible target, scroll it clear of the overlay, or inspect with snapshot/screenshot before retrying.`}):null}function Y(e,t,n){let{req:r,sessionStore:i,session:a,command:o,publicFlags:s}=e;l(i,a,r,o,{ref:t.ref,action:n},{flags:s})}function X(e){return{...d(e)??{}}}export{B as handleFindCommands};
@@ -1,2 +1,2 @@
1
- import{D as e}from"./sdk-contracts.js";import{t}from"./script.js";import n from"node:path";function r(e){return e.startsWith(`AD_`)}function i(t){return new e(`INVALID_ARGS`,`The AD_* namespace is reserved for built-in variables. Rename ${t} to avoid the AD_ prefix.`)}function a(e){let t={};if(e.builtins)for(let[n,r]of Object.entries(e.builtins))t[n]=r;let n=[e.fileEnv,e.shellEnv,e.cliEnv];for(let e of n)if(e)for(let[n,a]of Object.entries(e)){if(r(n))throw i(n);t[n]=a}return{values:t,expandedBuiltinNames:new Set}}function o(e){let n={};for(let[i,a]of Object.entries(e)){if(typeof a!=`string`||!i.startsWith(`AD_VAR_`))continue;let e=i.slice(7);e.length!==0&&t.test(e)&&(r(e)||(n[e]=a))}return n}function s(n){let a={};for(let o of n){let n=o.indexOf(`=`);if(n<=0)throw new e(`INVALID_ARGS`,`Invalid -e entry "${o}": expected KEY=VALUE.`);let s=o.slice(0,n);if(!t.test(s))throw new e(`INVALID_ARGS`,`Invalid -e key "${s}": keys must be uppercase letters, digits, and underscores (e.g. APP_ID).`);if(r(s))throw i(s);a[s]=o.slice(n+1)}return a}function c(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function l(e){if(e&&typeof e==`object`&&!Array.isArray(e)){let t={};for(let[n,r]of Object.entries(e))typeof r==`string`&&(t[n]=r);return t}return process.env}function u(e){return e>=`A`&&e<=`Z`||e>=`a`&&e<=`z`||e===`_`}function d(e){return u(e)||e>=`0`&&e<=`9`||e===`.`}function f(e){return e===`
1
+ import{O as e}from"./sdk-contracts.js";import{t}from"./script.js";import n from"node:path";function r(e){return e.startsWith(`AD_`)}function i(t){return new e(`INVALID_ARGS`,`The AD_* namespace is reserved for built-in variables. Rename ${t} to avoid the AD_ prefix.`)}function a(e){let t={};if(e.builtins)for(let[n,r]of Object.entries(e.builtins))t[n]=r;let n=[e.fileEnv,e.shellEnv,e.cliEnv];for(let e of n)if(e)for(let[n,a]of Object.entries(e)){if(r(n))throw i(n);t[n]=a}return{values:t,expandedBuiltinNames:new Set}}function o(e){let n={};for(let[i,a]of Object.entries(e)){if(typeof a!=`string`||!i.startsWith(`AD_VAR_`))continue;let e=i.slice(7);e.length!==0&&t.test(e)&&(r(e)||(n[e]=a))}return n}function s(n){let a={};for(let o of n){let n=o.indexOf(`=`);if(n<=0)throw new e(`INVALID_ARGS`,`Invalid -e entry "${o}": expected KEY=VALUE.`);let s=o.slice(0,n);if(!t.test(s))throw new e(`INVALID_ARGS`,`Invalid -e key "${s}": keys must be uppercase letters, digits, and underscores (e.g. APP_ID).`);if(r(s))throw i(s);a[s]=o.slice(n+1)}return a}function c(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function l(e){if(e&&typeof e==`object`&&!Array.isArray(e)){let t={};for(let[n,r]of Object.entries(e))typeof r==`string`&&(t[n]=r);return t}return process.env}function u(e){return e>=`A`&&e<=`Z`||e>=`a`&&e<=`z`||e===`_`}function d(e){return u(e)||e>=`0`&&e<=`9`||e===`.`}function f(e){return e===`
2
2
  `||e===`\r`||e===`\u2028`||e===`\u2029`}function p(e,t){let n=t+2;if(n>=e.length||!u(e[n]))return null;for(n+=1;n<e.length&&d(e[n]);)n+=1;let r=e.slice(t+2,n);if(e[n]===`}`)return{key:r,fallback:void 0,end:n+1};if(e[n]!==`:`||e[n+1]!==`-`)return null;n+=2;let i=``;for(;n<e.length;){let t=e[n];if(t===`}`)return{key:r,fallback:i,end:n+1};if(t===`\\`){let t=e[n+1];if(t===void 0)return{abortEnd:e.length};if(f(t))return{abortEnd:n+2};i+=t,n+=2;continue}i+=t,n+=1}return{abortEnd:e.length}}function m(t,n,i){let a=``,o=0;for(;o<t.length;){let s=t[o];if(s===`\\`&&t.startsWith("${",o+1)){a+="${",o+=3;continue}if(s===`$`&&t[o+1]===`{`){let s=p(t,o);if(s!==null&&`abortEnd`in s){a+=t.slice(o,s.abortEnd),o=s.abortEnd;continue}if(s!==null){let{key:t,fallback:c}=s;if(Object.prototype.hasOwnProperty.call(n.values,t))r(t)&&(n.expandedBuiltinNames??=new Set).add(t),a+=String(n.values[t]);else if(c!==void 0)a+=c;else throw new e(`INVALID_ARGS`,`Unresolved variable \${${t}} at ${i.file}:${i.line}.`);o=s.end;continue}}a+=s,o+=1}return a}function h(e,t,n){return{...e,positionals:(e.positionals??[]).map(e=>m(e,t,n)),flags:g(e.flags,t,n)??{},runtime:g(e.runtime,t,n)}}function g(e,t,n){return e&&_(e,t,n)}function _(e,t,n){return typeof e==`string`?m(e,t,n):Array.isArray(e)?e.map(e=>_(e,t,n)):e&&typeof e==`object`?Object.fromEntries(Object.entries(e).map(([e,r])=>[e,_(r,t,n)])):e}function v(e){return Object.entries(e.values).filter(([t,n])=>n.length>0&&(!r(t)||e.expandedBuiltinNames?.has(t))).map(([e,t])=>({name:e,value:t})).sort((e,t)=>t.value.length-e.value.length)}function y(e){let t=n.extname(e).toLowerCase();return t===`.yaml`||t===`.yml`}function b(e,t){return`Maestro YAML requires explicit --maestro routing: ${e} ${t} --maestro`}function x(e,t){return t===`maestro`&&y(e)?`maestro`:`ad`}export{v as a,c,a as i,l,b as n,o,x as r,s,y as t,h as u};
@@ -1 +1 @@
1
- import{D as e}from"./sdk-contracts.js";import{f as t,m as n}from"./scroll-gesture.js";import{t as r}from"./gesture-plan-types.js";const i={pinchAxisDegrees:-90,samplingProfile:`default`},a={ios:i,macos:i,android:{pinchAxisDegrees:0,samplingProfile:`android`},harmonyos:i,vega:i,linux:i,web:i};function o(e,t,n){let r=b(t),i=N(n);switch(e.intent){case`fling`:return u(e,r);case`pan`:return d(e,r,i);case`pinch`:return p({intent:`pinch`,origin:e.origin??k(r),delta:{x:0,y:0},scale:D(e.scale,`gesture pinch scale`),rotationDegrees:0,durationMs:300},r,i);case`rotate`:{let t=E(e.degrees,`gesture rotate degrees`);return p({intent:`rotate`,origin:e.origin??k(r),delta:{x:0,y:0},scale:1,rotationDegrees:t,durationMs:w(t)},r,i)}case`transform`:{let t=E(e.degrees,`gesture transform degrees`);return p({intent:`transform`,origin:e.origin,delta:e.delta,scale:D(e.scale,`gesture transform scale`),rotationDegrees:t,durationMs:x(e.durationMs,w(t),`gesture transform durationMs`)},r,i)}}}function s(e){let[{samples:t}]=e.pointers,n=t[0],r=t.at(-1);return{start:n.point,end:r.point}}function c(t,n){let i=b(n),a=S(t.sourceHoldMs,800,`gesture drag sourceHoldMs`),o=x(t.moveMs,500,`gesture drag moveMs`),s=C(t.destinationHoldMs,0,`gesture drag destinationHoldMs`);if(a+o+s>1e4)throw new e(`INVALID_ARGS`,`gesture drag total duration must be at most ${r}`);return l(f(`pan`,t.from,t.to,o,i,`timed-pan`),a,s)}function l(e,t,n){let r=e.pointers[0],[i,a]=r.samples,o=t+e.durationMs+n,s=[{offsetMs:0,point:i.point},{...i,offsetMs:i.offsetMs+t},{...a,offsetMs:a.offsetMs+t},...n>0?[{offsetMs:o,point:a.point}]:[]];return{...e,durationMs:o,pointers:[{...r,samples:s}]}}function u(e,t){if(`preset`in e){let{from:n,to:r}=M(e.preset,t);return f(`fling`,n,r,100,t,`endpoint-hold`)}if(`from`in e)return f(`fling`,e.from,e.to,100,t,`endpoint-hold`);let r=T(e.origin,`gesture fling origin`),i=O(e.distance??180,`gesture fling distance`);return f(`fling`,r,A(r,n(e.direction,i)),100,t,`endpoint-hold`)}function d(t,n,r){let i=x(t.durationMs,500,`gesture pan durationMs`);if((t.pointerCount??1)===1){let e=T(t.origin,`gesture pan origin`);return f(`pan`,e,A(e,T(t.delta,`gesture pan delta`)),i,n,t.executionProfile??`timed-pan`)}if(t.pointerCount!==2)throw new e(`INVALID_ARGS`,`gesture pan pointerCount must be 1 or 2`);return p({intent:`pan`,origin:t.origin,delta:t.delta,scale:1,rotationDegrees:0,durationMs:i},n,r)}function f(e,t,n,r,i,a){let o=T(t,`gesture ${e} start`),s=T(n,`gesture ${e} end`),c=[{offsetMs:0,point:o},{offsetMs:r,point:s}];return v(c,i,{intent:e,pointerId:0}),{topology:`single`,intent:e,executionProfile:a,durationMs:r,viewport:i,pointers:[{pointerId:0,samples:c}]}}function p(e,t,n){let r=T(e.origin,`gesture ${e.intent} origin`),i=A(r,T(e.delta,`gesture ${e.intent} delta`)),a=Math.min(t.width,t.height)*g(e.intent),o=e.scale>1?a/e.scale:a,s=o*e.scale;if(Math.min(o,s)<48)throw y({intent:e.intent,viewport:t,initialSpan:o,finalSpan:s,minimumReliableSpan:48});let c=o/2,l=_(e.durationMs,n.samplingProfile),u=(a,o)=>{let s=l.map(t=>({offsetMs:t,point:m({...e,start:r,end:i,initialRadius:c,offsetMs:t,side:o,profile:n})}));return v(s,t,{intent:e.intent,pointerId:a}),{pointerId:a,samples:s}};return{topology:`two`,intent:e.intent,durationMs:e.durationMs,viewport:t,pointers:[u(0,1),u(1,-1)]}}function m(e){let t=e.offsetMs/e.durationMs,n=j(e.start,e.end,t),r=e.initialRadius*(1+(e.scale-1)*t),i=P(h(e.intent,e.profile)+e.rotationDegrees*t);return{x:n.x+Math.cos(i)*r*e.side,y:n.y+Math.sin(i)*r*e.side}}function h(e,t){return e===`pinch`?t.pinchAxisDegrees:-90}function g(e){return e===`pinch`?.4:.25}function _(t,n){if(!Number.isFinite(t)||t<=0)throw new e(`INVALID_ARGS`,`gesture sample duration must be a positive finite number`);let r=t/16,i=Math.max(3,n===`android`?Math.round(r):Math.floor(r));return Array.from({length:i+1},(e,n)=>Math.round(t*n/i))}function v(t,n,r){let i=n.x+n.width-1,a=n.y+n.height-1;for(let o of t){let{x:t,y:s}=o.point;if(!Number.isFinite(t)||!Number.isFinite(s))throw new e(`INVALID_ARGS`,`Gesture motion produces non-finite pointer coordinates`,{...r,reason:`GESTURE_TRAJECTORY_NON_FINITE`,hint:`Reduce the requested rotation, translation, or scale.`});if(t<n.x+1||t>i||s<n.y+1||s>a)throw y({...r,viewport:n,sample:o})}}function y(t){return new e(`INVALID_ARGS`,`Gesture trajectory does not fit inside the viewport`,{...t,reason:`GESTURE_TRAJECTORY_OUT_OF_BOUNDS`,hint:`Move the gesture away from the edge or reduce its translation, scale, or rotation.`})}function b(t){let n={x:E(t.x,`gesture viewport x`),y:E(t.y,`gesture viewport y`),width:E(t.width,`gesture viewport width`),height:E(t.height,`gesture viewport height`)};if(n.width<=0||n.height<=0)throw new e(`INVALID_ARGS`,`gesture viewport width and height must be positive`);return n}function x(t,n,i){let a=t??n;if(!Number.isInteger(a)||a<16||a>1e4)throw new e(`INVALID_ARGS`,`${i} must be an integer between 16 and ${r}`);return a}function S(t,n,i){let a=t??n;if(!Number.isInteger(a)||a<1||a>1e4)throw new e(`INVALID_ARGS`,`${i} must be an integer between 1 and ${r}`);return a}function C(t,n,i){let a=t??n;if(!Number.isInteger(a)||a<0||a>1e4)throw new e(`INVALID_ARGS`,`${i} must be an integer between 0 and ${r}`);return a}function w(e){let t=Math.ceil(Math.abs(e)/3)*16;return Math.min(Math.max(300,t),2400)}function T(e,t){return{x:E(e.x,`${t} x`),y:E(e.y,`${t} y`)}}function E(t,n){if(!Number.isFinite(t))throw new e(`INVALID_ARGS`,`${n} must be a finite number`);return t}function D(t,n){let r=E(t,n);if(r<=0)throw new e(`INVALID_ARGS`,`${n} must be greater than 0`);return r}function O(t,n){let r=E(t,n);if(r<=0)throw new e(`INVALID_ARGS`,`${n} must be a positive number`);return r}function k(e){return{x:e.x+e.width/2,y:e.y+e.height/2}}function A(e,t){return{x:e.x+t.x,y:e.y+t.y}}function j(e,t,n){return{x:e.x+(t.x-e.x)*n,y:e.y+(t.y-e.y)*n}}function M(e,n){let r=t(e,{referenceWidth:n.width,referenceHeight:n.height});return{from:{x:n.x+r.x1,y:n.y+r.y1},to:{x:n.x+r.x2,y:n.y+r.y2}}}function N(e){return e===void 0?i:a[e]}function P(e){return e*Math.PI/180}export{s as a,_ as i,o as n,j as r,c as t};
1
+ import{O as e}from"./sdk-contracts.js";import{f as t,m as n}from"./scroll-gesture.js";import{t as r}from"./gesture-plan-types.js";const i={pinchAxisDegrees:-90,samplingProfile:`default`},a={ios:i,macos:i,android:{pinchAxisDegrees:0,samplingProfile:`android`},harmonyos:i,vega:i,linux:i,web:i};function o(e,t,n){let r=b(t),i=N(n);switch(e.intent){case`fling`:return u(e,r);case`pan`:return d(e,r,i);case`pinch`:return p({intent:`pinch`,origin:e.origin??k(r),delta:{x:0,y:0},scale:D(e.scale,`gesture pinch scale`),rotationDegrees:0,durationMs:300},r,i);case`rotate`:{let t=E(e.degrees,`gesture rotate degrees`);return p({intent:`rotate`,origin:e.origin??k(r),delta:{x:0,y:0},scale:1,rotationDegrees:t,durationMs:w(t)},r,i)}case`transform`:{let t=E(e.degrees,`gesture transform degrees`);return p({intent:`transform`,origin:e.origin,delta:e.delta,scale:D(e.scale,`gesture transform scale`),rotationDegrees:t,durationMs:x(e.durationMs,w(t),`gesture transform durationMs`)},r,i)}}}function s(e){let[{samples:t}]=e.pointers,n=t[0],r=t.at(-1);return{start:n.point,end:r.point}}function c(t,n){let i=b(n),a=S(t.sourceHoldMs,800,`gesture drag sourceHoldMs`),o=x(t.moveMs,500,`gesture drag moveMs`),s=C(t.destinationHoldMs,0,`gesture drag destinationHoldMs`);if(a+o+s>1e4)throw new e(`INVALID_ARGS`,`gesture drag total duration must be at most ${r}`);return l(f(`pan`,t.from,t.to,o,i,`timed-pan`),a,s)}function l(e,t,n){let r=e.pointers[0],[i,a]=r.samples,o=t+e.durationMs+n,s=[{offsetMs:0,point:i.point},{...i,offsetMs:i.offsetMs+t},{...a,offsetMs:a.offsetMs+t},...n>0?[{offsetMs:o,point:a.point}]:[]];return{...e,durationMs:o,pointers:[{...r,samples:s}]}}function u(e,t){if(`preset`in e){let{from:n,to:r}=M(e.preset,t);return f(`fling`,n,r,100,t,`endpoint-hold`)}if(`from`in e)return f(`fling`,e.from,e.to,100,t,`endpoint-hold`);let r=T(e.origin,`gesture fling origin`),i=O(e.distance??180,`gesture fling distance`);return f(`fling`,r,A(r,n(e.direction,i)),100,t,`endpoint-hold`)}function d(t,n,r){let i=x(t.durationMs,500,`gesture pan durationMs`);if((t.pointerCount??1)===1){let e=T(t.origin,`gesture pan origin`);return f(`pan`,e,A(e,T(t.delta,`gesture pan delta`)),i,n,t.executionProfile??`timed-pan`)}if(t.pointerCount!==2)throw new e(`INVALID_ARGS`,`gesture pan pointerCount must be 1 or 2`);return p({intent:`pan`,origin:t.origin,delta:t.delta,scale:1,rotationDegrees:0,durationMs:i},n,r)}function f(e,t,n,r,i,a){let o=T(t,`gesture ${e} start`),s=T(n,`gesture ${e} end`),c=[{offsetMs:0,point:o},{offsetMs:r,point:s}];return v(c,i,{intent:e,pointerId:0}),{topology:`single`,intent:e,executionProfile:a,durationMs:r,viewport:i,pointers:[{pointerId:0,samples:c}]}}function p(e,t,n){let r=T(e.origin,`gesture ${e.intent} origin`),i=A(r,T(e.delta,`gesture ${e.intent} delta`)),a=Math.min(t.width,t.height)*g(e.intent),o=e.scale>1?a/e.scale:a,s=o*e.scale;if(Math.min(o,s)<48)throw y({intent:e.intent,viewport:t,initialSpan:o,finalSpan:s,minimumReliableSpan:48});let c=o/2,l=_(e.durationMs,n.samplingProfile),u=(a,o)=>{let s=l.map(t=>({offsetMs:t,point:m({...e,start:r,end:i,initialRadius:c,offsetMs:t,side:o,profile:n})}));return v(s,t,{intent:e.intent,pointerId:a}),{pointerId:a,samples:s}};return{topology:`two`,intent:e.intent,durationMs:e.durationMs,viewport:t,pointers:[u(0,1),u(1,-1)]}}function m(e){let t=e.offsetMs/e.durationMs,n=j(e.start,e.end,t),r=e.initialRadius*(1+(e.scale-1)*t),i=P(h(e.intent,e.profile)+e.rotationDegrees*t);return{x:n.x+Math.cos(i)*r*e.side,y:n.y+Math.sin(i)*r*e.side}}function h(e,t){return e===`pinch`?t.pinchAxisDegrees:-90}function g(e){return e===`pinch`?.4:.25}function _(t,n){if(!Number.isFinite(t)||t<=0)throw new e(`INVALID_ARGS`,`gesture sample duration must be a positive finite number`);let r=t/16,i=Math.max(3,n===`android`?Math.round(r):Math.floor(r));return Array.from({length:i+1},(e,n)=>Math.round(t*n/i))}function v(t,n,r){let i=n.x+n.width-1,a=n.y+n.height-1;for(let o of t){let{x:t,y:s}=o.point;if(!Number.isFinite(t)||!Number.isFinite(s))throw new e(`INVALID_ARGS`,`Gesture motion produces non-finite pointer coordinates`,{...r,reason:`GESTURE_TRAJECTORY_NON_FINITE`,hint:`Reduce the requested rotation, translation, or scale.`});if(t<n.x+1||t>i||s<n.y+1||s>a)throw y({...r,viewport:n,sample:o})}}function y(t){return new e(`INVALID_ARGS`,`Gesture trajectory does not fit inside the viewport`,{...t,reason:`GESTURE_TRAJECTORY_OUT_OF_BOUNDS`,hint:`Move the gesture away from the edge or reduce its translation, scale, or rotation.`})}function b(t){let n={x:E(t.x,`gesture viewport x`),y:E(t.y,`gesture viewport y`),width:E(t.width,`gesture viewport width`),height:E(t.height,`gesture viewport height`)};if(n.width<=0||n.height<=0)throw new e(`INVALID_ARGS`,`gesture viewport width and height must be positive`);return n}function x(t,n,i){let a=t??n;if(!Number.isInteger(a)||a<16||a>1e4)throw new e(`INVALID_ARGS`,`${i} must be an integer between 16 and ${r}`);return a}function S(t,n,i){let a=t??n;if(!Number.isInteger(a)||a<1||a>1e4)throw new e(`INVALID_ARGS`,`${i} must be an integer between 1 and ${r}`);return a}function C(t,n,i){let a=t??n;if(!Number.isInteger(a)||a<0||a>1e4)throw new e(`INVALID_ARGS`,`${i} must be an integer between 0 and ${r}`);return a}function w(e){let t=Math.ceil(Math.abs(e)/3)*16;return Math.min(Math.max(300,t),2400)}function T(e,t){return{x:E(e.x,`${t} x`),y:E(e.y,`${t} y`)}}function E(t,n){if(!Number.isFinite(t))throw new e(`INVALID_ARGS`,`${n} must be a finite number`);return t}function D(t,n){let r=E(t,n);if(r<=0)throw new e(`INVALID_ARGS`,`${n} must be greater than 0`);return r}function O(t,n){let r=E(t,n);if(r<=0)throw new e(`INVALID_ARGS`,`${n} must be a positive number`);return r}function k(e){return{x:e.x+e.width/2,y:e.y+e.height/2}}function A(e,t){return{x:e.x+t.x,y:e.y+t.y}}function j(e,t,n){return{x:e.x+(t.x-e.x)*n,y:e.y+(t.y-e.y)*n}}function M(e,n){let r=t(e,{referenceWidth:n.width,referenceHeight:n.height});return{from:{x:n.x+r.x1,y:n.y+r.y1},to:{x:n.x+r.x2,y:n.y+r.y2}}}function N(e){return e===void 0?i:a[e]}function P(e){return e*Math.PI/180}export{s as a,_ as i,o as n,j as r,c as t};
@@ -1 +1 @@
1
- import{D as e,L as t}from"./sdk-contracts.js";import{Pt as n,yt as r}from"./sdk-batch.js";import{g as i,h as a,m as o}from"./session-snapshot.js";import{a as s}from"./gesture-admission.js";async function c(e){let t=await i({command:`runtime gesture-viewport`,device:e.device,use:r,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});return t.type===`response`?{ok:!1,response:t.response}:{ok:!0,read:d(t.runtime).gestureViewport}}async function l(r){let i=n(r.input),o=await a({command:`gesture`,device:r.device,required:i.use.required,inspectFacts:r.inspectFacts,bindDevice:r.bindDevice,unavailableResponse:n=>({ok:!1,error:t(new e(`UNSUPPORTED_OPERATION`,s(r.device,i.tier,r.input.intent),{gesture:r.input.intent,...n.hint===void 0?{}:{hint:n.hint}}))})});return o.type===`response`?{ok:!1,response:o.response}:{ok:!0,gestures:await u(o.bind,r.device,i)}}async function u(e,t,n){switch(n.tier){case`plan`:{let r=await e(t,n.use);return{performPlan:async(e,t)=>await r.operations.performGesturePlan(f(e,t)),...d(r)}}case`directional-fling`:{let r=await e(t,n.use);return{performPlan:async(e,t)=>await r.operations.performDirectionalFlingPlan(f(e,t)),...d(r)}}case`multi-touch`:{let r=await e(t,n.use);return{performPlan:async(e,t)=>await r.operations.performMultiTouchGesturePlan(f(e,t)),...d(r)}}case`target-authored-drag`:{let r=await e(t,n.use);return{performPlan:async(e,t)=>await r.operations.performTargetAuthoredDrag(f(e,t)),...d(r)}}}}function d(e){let{gestureViewport:t}=e.operations,n=e.operations.captureSnapshot?{operations:{captureSnapshot:e.operations.captureSnapshot}}:void 0,r=t?{operations:{gestureViewport:t}}:void 0;return Object.freeze({...n?{captureSnapshot:async e=>await n.operations.captureSnapshot(e)}:{},...r?{gestureViewport:async e=>await r.operations.gestureViewport(p(e))}:{}})}function f(e,t){return{plan:e,...t.appBundleId===void 0?{}:{options:{appBundleId:t.appBundleId}},execution:o(t)}}function p(e){return{...e.appBundleId===void 0?{}:{options:{appBundleId:e.appBundleId}},execution:o(e)}}export{c as n,l as t};
1
+ import{O as e,R as t}from"./sdk-contracts.js";import{Pt as n,yt as r}from"./sdk-batch.js";import{g as i,h as a,m as o}from"./session-snapshot.js";import{a as s}from"./gesture-admission.js";async function c(e){let t=await i({command:`runtime gesture-viewport`,device:e.device,use:r,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});return t.type===`response`?{ok:!1,response:t.response}:{ok:!0,read:d(t.runtime).gestureViewport}}async function l(r){let i=n(r.input),o=await a({command:`gesture`,device:r.device,required:i.use.required,inspectFacts:r.inspectFacts,bindDevice:r.bindDevice,unavailableResponse:n=>({ok:!1,error:t(new e(`UNSUPPORTED_OPERATION`,s(r.device,i.tier,r.input.intent),{gesture:r.input.intent,...n.hint===void 0?{}:{hint:n.hint}}))})});return o.type===`response`?{ok:!1,response:o.response}:{ok:!0,gestures:await u(o.bind,r.device,i)}}async function u(e,t,n){switch(n.tier){case`plan`:{let r=await e(t,n.use);return{performPlan:async(e,t)=>await r.operations.performGesturePlan(f(e,t)),...d(r)}}case`directional-fling`:{let r=await e(t,n.use);return{performPlan:async(e,t)=>await r.operations.performDirectionalFlingPlan(f(e,t)),...d(r)}}case`multi-touch`:{let r=await e(t,n.use);return{performPlan:async(e,t)=>await r.operations.performMultiTouchGesturePlan(f(e,t)),...d(r)}}case`target-authored-drag`:{let r=await e(t,n.use);return{performPlan:async(e,t)=>await r.operations.performTargetAuthoredDrag(f(e,t)),...d(r)}}}}function d(e){let{gestureViewport:t}=e.operations,n=e.operations.captureSnapshot?{operations:{captureSnapshot:e.operations.captureSnapshot}}:void 0,r=t?{operations:{gestureViewport:t}}:void 0;return Object.freeze({...n?{captureSnapshot:async e=>await n.operations.captureSnapshot(e)}:{},...r?{gestureViewport:async e=>await r.operations.gestureViewport(p(e))}:{}})}function f(e,t){return{plan:e,...t.appBundleId===void 0?{}:{options:{appBundleId:t.appBundleId}},execution:o(t)}}function p(e){return{...e.appBundleId===void 0?{}:{options:{appBundleId:e.appBundleId}},execution:o(e)}}export{c as n,l as t};
@@ -1 +1 @@
1
- import{D as e}from"./sdk-contracts.js";import{c as t}from"./diagnostics.js";import"./diagnostics2.js";import{_ as n,a as r,c as i,d as a,f as o,g as s,h as c,l,n as u,o as d,p as f,r as p,s as m,t as h,u as g,v as _,x as v,y}from"./src4.js";function b(b,x){let S=t=>async()=>{throw new e(`UNSUPPORTED_OPERATION`,`${t} is not supported on HarmonyOS`)};return{open:(e,t)=>l(b,e,{activity:t?.activity}),openDevice:()=>m(b),close:e=>p(b,e),tap:(e,t)=>a(b,e,t),doubleTap:(e,t)=>r(b,e,t),longPress:(e,t,n)=>i(b,e,t,n),focus:(e,t)=>a(b,e,t),type:(e,t)=>v(b,e,t),fill:(e,t,n,r)=>d(b,e,t,n,r),scroll:(e,t)=>s(b,e,t),performGesture:e=>g(b,e),gestureViewport:()=>f(b),screenshot:e=>c(b,e),snapshot:async e=>({...await t(`snapshot_capture`,async()=>await y(b,e),{backend:`harmonyos-arkui`}),backend:`harmonyos-arkui`,producer:`harmonyos-uitest`}),back:()=>u(b),home:()=>m(b),setOrientation:e=>n(b,e),appSwitcher:()=>h(b),tvRemote:S(`tv-remote`),keyboardDismiss:async()=>(await o(b,`Back`),{kind:`acknowledged`}),keyboardEnter:async()=>(await o(b,`Enter`),{kind:`harmonyos-acknowledged`}),readClipboard:S(`clipboard`),writeClipboard:S(`clipboard`),setSetting:(e,t,n)=>_(b,e,t,n)}}export{b as createHarmonyInteractor};
1
+ import{O as e}from"./sdk-contracts.js";import{c as t}from"./diagnostics.js";import"./diagnostics2.js";import{_ as n,a as r,c as i,d as a,f as o,g as s,h as c,l,n as u,o as d,p as f,r as p,s as m,t as h,u as g,v as _,x as v,y}from"./src4.js";function b(b,x){let S=t=>async()=>{throw new e(`UNSUPPORTED_OPERATION`,`${t} is not supported on HarmonyOS`)};return{open:(e,t)=>l(b,e,{activity:t?.activity}),openDevice:()=>m(b),close:e=>p(b,e),tap:(e,t)=>a(b,e,t),doubleTap:(e,t)=>r(b,e,t),longPress:(e,t,n)=>i(b,e,t,n),focus:(e,t)=>a(b,e,t),type:(e,t)=>v(b,e,t),fill:(e,t,n,r)=>d(b,e,t,n,r),scroll:(e,t)=>s(b,e,t),performGesture:e=>g(b,e),gestureViewport:()=>f(b),screenshot:e=>c(b,e),snapshot:async e=>({...await t(`snapshot_capture`,async()=>await y(b,e),{backend:`harmonyos-arkui`}),backend:`harmonyos-arkui`,producer:`harmonyos-uitest`}),back:()=>u(b),home:()=>m(b),setOrientation:e=>n(b,e),appSwitcher:()=>h(b),tvRemote:S(`tv-remote`),keyboardDismiss:async()=>(await o(b,`Back`),{kind:`acknowledged`}),keyboardEnter:async()=>(await o(b,`Enter`),{kind:`harmonyos-acknowledged`}),readClipboard:S(`clipboard`),writeClipboard:S(`clipboard`),setSetting:(e,t,n)=>_(b,e,t,n)}}export{b as createHarmonyInteractor};
@@ -1,2 +1,2 @@
1
- import{r as e}from"./rolldown-runtime.js";import{D as t}from"./sdk-contracts.js";import{T as n,_ as r,d as i}from"./owner-identity.js";import{l as a,o}from"./exec.js";import"./command.js";import"./process.js";import{D as s,c,f as l,g as u,h as d,n as f,o as p,r as m,t as h,w as g,y as _}from"./host-file.js";import{a as v,i as y,n as b}from"./tool-provider.js";import x from"node:path";import{createHash as S}from"node:crypto";import{fileURLToPath as C}from"node:url";var w=e({macOsClickScheduleMs:()=>X,quitMacOsApp:()=>G,resolveFrontmostMacOsApp:()=>W,resolveMacOsHelperPackageRootFrom:()=>M,runMacOsAlertAction:()=>q,runMacOsPermissionAction:()=>K,runMacOsPressAction:()=>Z,runMacOsReadTextAction:()=>Y,runMacOsScreenshotAction:()=>Q,runMacOsSnapshotAction:()=>J,startMacOsAudioProbeProcess:()=>V});const T=`agent-device-macos-helper`,E=`AGENT_DEVICE_MACOS_HELPER_BIN`,D=x.join(l(),`.agent-device`,`macos-helper`,`current`),O=x.join(D,`manifest.json`),k=/^[A-Za-z0-9_-]+(?:\.[A-Za-z0-9_-]+)+$/;function A(e){let n=e.trim();if(!k.test(n))throw new t(`INVALID_ARGS`,`macOS bundle id must use reverse-DNS form like com.example.App`,{bundleId:e});return n}function j(e,t){t.bundleId&&e.push(`--bundle-id`,A(t.bundleId)),t.surface&&e.push(`--surface`,t.surface)}function M(e){let n=x.dirname(e);for(;;){let e=x.join(n,`apple`,`macos-helper`);if(c(x.join(e,`Package.swift`)))return e;let t=x.dirname(n);if(t===n)break;n=t}throw new t(`COMMAND_FAILED`,`Unable to locate macOS helper package root`,{modulePath:e})}function N(){return M(C(import.meta.url))}function P(){return x.join(N(),`.build`,`release`,T)}function F(){return x.join(D,T)}async function I(e){let t=await u(e,{withFileTypes:!0});return(await Promise.all(t.map(async t=>{let n=x.join(e,t.name);return t.isDirectory()?t.name===`.build`?[]:await I(n):!t.isFile()||!t.name.endsWith(`.swift`)&&t.name!==`Package.swift`?[]:[n]}))).flat().sort()}async function L(e){let t=await I(e),n=S(`sha256`);for(let r of t)n.update(x.relative(e,r)),n.update(`\0`),n.update(await d(r)),n.update(`\0`);let r=await v(`swift`,[`--version`],{allowFailure:!0,cwd:e,timeoutMs:1e4});return n.update(`swift-version`),n.update(`\0`),n.update(r.stdout||r.stderr||`exit:${r.exitCode}`),n.update(`\0`),n.digest(`hex`)}async function R(){try{let e=JSON.parse(await _(O));return typeof e.fingerprint==`string`?e.fingerprint:null}catch{return null}}async function z(){let e=await o(r(E),E);if(e)return e;let t=N(),i=await L(t),a=F();try{if(await R()===i)return await h(a),a}catch{}let c=P();n(`agent-device: building macOS helper (first run or helper update)
1
+ import{r as e}from"./rolldown-runtime.js";import{O as t}from"./sdk-contracts.js";import{T as n,_ as r,d as i}from"./owner-identity.js";import{l as a,o}from"./exec.js";import"./command.js";import"./process.js";import{D as s,c,f as l,g as u,h as d,n as f,o as p,r as m,t as h,w as g,y as _}from"./host-file.js";import{a as v,i as y,n as b}from"./tool-provider.js";import x from"node:path";import{createHash as S}from"node:crypto";import{fileURLToPath as C}from"node:url";var w=e({macOsClickScheduleMs:()=>X,quitMacOsApp:()=>G,resolveFrontmostMacOsApp:()=>W,resolveMacOsHelperPackageRootFrom:()=>M,runMacOsAlertAction:()=>q,runMacOsPermissionAction:()=>K,runMacOsPressAction:()=>Z,runMacOsReadTextAction:()=>Y,runMacOsScreenshotAction:()=>Q,runMacOsSnapshotAction:()=>J,startMacOsAudioProbeProcess:()=>V});const T=`agent-device-macos-helper`,E=`AGENT_DEVICE_MACOS_HELPER_BIN`,D=x.join(l(),`.agent-device`,`macos-helper`,`current`),O=x.join(D,`manifest.json`),k=/^[A-Za-z0-9_-]+(?:\.[A-Za-z0-9_-]+)+$/;function A(e){let n=e.trim();if(!k.test(n))throw new t(`INVALID_ARGS`,`macOS bundle id must use reverse-DNS form like com.example.App`,{bundleId:e});return n}function j(e,t){t.bundleId&&e.push(`--bundle-id`,A(t.bundleId)),t.surface&&e.push(`--surface`,t.surface)}function M(e){let n=x.dirname(e);for(;;){let e=x.join(n,`apple`,`macos-helper`);if(c(x.join(e,`Package.swift`)))return e;let t=x.dirname(n);if(t===n)break;n=t}throw new t(`COMMAND_FAILED`,`Unable to locate macOS helper package root`,{modulePath:e})}function N(){return M(C(import.meta.url))}function P(){return x.join(N(),`.build`,`release`,T)}function F(){return x.join(D,T)}async function I(e){let t=await u(e,{withFileTypes:!0});return(await Promise.all(t.map(async t=>{let n=x.join(e,t.name);return t.isDirectory()?t.name===`.build`?[]:await I(n):!t.isFile()||!t.name.endsWith(`.swift`)&&t.name!==`Package.swift`?[]:[n]}))).flat().sort()}async function L(e){let t=await I(e),n=S(`sha256`);for(let r of t)n.update(x.relative(e,r)),n.update(`\0`),n.update(await d(r)),n.update(`\0`);let r=await v(`swift`,[`--version`],{allowFailure:!0,cwd:e,timeoutMs:1e4});return n.update(`swift-version`),n.update(`\0`),n.update(r.stdout||r.stderr||`exit:${r.exitCode}`),n.update(`\0`),n.digest(`hex`)}async function R(){try{let e=JSON.parse(await _(O));return typeof e.fingerprint==`string`?e.fingerprint:null}catch{return null}}async function z(){let e=await o(r(E),E);if(e)return e;let t=N(),i=await L(t),a=F();try{if(await R()===i)return await h(a),a}catch{}let c=P();n(`agent-device: building macOS helper (first run or helper update)
2
2
  `),await v(`swift`,[`build`,`-c`,`release`,`--package-path`,t],{cwd:t,timeoutMs:12e4}),await p(D);let l=`${a}.tmp`;return await m(c,l),await g(l,a),await f(a,493),await s(O,`${JSON.stringify({fingerprint:i},null,2)}\n`),a}async function B(){let e=r(E)?.trim();if(e){let t=await o(e,E);if(t)return t}if(b())return T;if(i()!==`darwin`)throw new t(`UNSUPPORTED_PLATFORM`,`macOS helper is only available on macOS`);return await z()}async function V(e){let t=await B();return a(t,[`audio-probe`,`--duration-ms`,String(e.durationMs),`--bucket-ms`,String(e.bucketMs),`--out`,e.statusPath],{allowFailure:!0,captureOutput:!0})}const H=3e4;async function U(e,n={}){let r={allowFailure:!0,timeoutMs:n.timeoutMs??H,signal:n.signal,kill:{signal:`SIGTERM`,graceMs:1e3}},i=y().macosHelper,a=i?T:await B(),o=i?await i.run(e,r):await v(a,e,r),s=o.stdout.trim(),c=null;if(s)try{c=JSON.parse(s)}catch{c=null}if(o.exitCode===0&&c?.ok)return c.data;let l=c&&!c.ok?c.error?.message??`macOS helper exited with code ${o.exitCode}`:s||o.stderr.trim()||`macOS helper exited with code ${o.exitCode}`;throw new t(`COMMAND_FAILED`,l,{helperPath:a,args:e,stdout:o.stdout,stderr:o.stderr,exitCode:o.exitCode,...c&&!c.ok?c.error?.details:{}})}async function W(){return await U([`app`,`frontmost`])}async function G(e){return await U([`app`,`quit`,`--bundle-id`,A(e)])}async function K(e,t){return await U([`permission`,e,t])}async function q(e,t={}){let n=[`alert`,e];return j(n,t),await U(n)}async function J(e,t={}){let n=[`snapshot`,`--surface`,e];return j(n,t),await U(n,{signal:t.signal})}async function Y(e,t,n={}){let r=[`read`,`--x`,String(e),`--y`,String(t)];return j(r,n),await U(r)}function X(e){let t=e.holdMs&&e.holdMs>0?Math.max(e.holdMs,40):60,n=Math.max(e.clicks??1,1),r=Math.max(e.intervalMs??120,0);return n*(e.doubleClick?2*t+80:t)+(n-1)*r}async function Z(e,t,n={}){let r=[`press`,`--x`,String(e),`--y`,String(t)];n.holdMs&&n.holdMs>0&&r.push(`--hold-ms`,String(n.holdMs));let i=n.clicks??1;return i>1&&(r.push(`--clicks`,String(i)),n.intervalMs!==void 0&&r.push(`--interval-ms`,String(Math.max(n.intervalMs,0)))),n.doubleClick&&r.push(`--double-click`),j(r,n),await U(r,{signal:n.signal,timeoutMs:X(n)+H})}async function Q(e,t={}){let n=[`screenshot`,`--out`,e];return j(n,t),await U(n)}export{K as a,q as i,G as n,Q as o,W as r,V as s,w as t};
@@ -1 +1 @@
1
- import{D as e}from"./sdk-contracts.js";import t from"node:crypto";function n(e){return(e??``).trim().toLowerCase()===`tenant`?`tenant`:`none`}function r(e){if(!e)return;let t=e.trim();if(t&&/^[a-zA-Z0-9._-]{1,128}$/.test(t))return t}const i=`default`;function a(t){let n=Number.isInteger(t.defaultLeaseTtlMs)?Math.max(1,Number(t.defaultLeaseTtlMs)):6e4,r=Number.isInteger(t.minLeaseTtlMs)?Math.max(1,Number(t.minLeaseTtlMs)):5e3,i=Number.isInteger(t.maxLeaseTtlMs)?Math.max(r,Number(t.maxLeaseTtlMs)):6e5;return t=>{if(!Number.isInteger(t))return n;let a=Number(t);if(a<r||a>i)throw new e(`INVALID_ARGS`,`Lease ttlMs must be between ${r} and ${i}.`);return a}}function o(e){if(!e)return;let t=e.trim();if(t&&/^[a-zA-Z0-9._-]{1,128}$/.test(t))return t}function s(e){if(!e)return;let t=e.trim();if(t&&/^[a-f0-9]{16,128}$/i.test(t))return t.toLowerCase()}function c(t){let n=s(t);if(!n)throw new e(`INVALID_ARGS`,`Invalid lease id.`);return n}function l(t){let n=(t??``).trim().toLowerCase();if(!n||n===`ios-simulator`)return`ios-simulator`;if(n===`ios-instance`||n===`android-instance`||n===`harmonyos-instance`)return n;throw new e(`INVALID_ARGS`,`Unsupported lease backend: ${t??``}`)}function u(t){if(t===void 0)return;let n=t.trim();if(!n||n.length>256||!/^[\u0020-\u007E]+$/.test(n))throw new e(`INVALID_ARGS`,`Invalid device key. Use 1-256 printable characters.`);return n}function d(e){return p(e,`client id`,128)}function f(e){return p(e,`lease provider`,64)}function p(t,n,r){if(t===void 0)return;let i=t.trim();if(!i||i.length>r||!/^[a-zA-Z0-9._-]+$/.test(i))throw new e(`INVALID_ARGS`,`Invalid ${n}. Use 1-${String(r)} chars: letters, numbers, dot, underscore, hyphen.`);return i}function m(t){let n=r(t);if(!n)throw new e(`INVALID_ARGS`,`Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.`);return n}function h(t){let n=o(t);if(!n)throw new e(`INVALID_ARGS`,`Invalid run id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.`);return n}function g(e){return{backend:l(e.leaseBackend),leaseProvider:f(e.leaseProvider),deviceKey:u(e.deviceKey),clientId:d(e.clientId),tenantId:m(e.tenantId),runId:h(e.runId),ttlMs:e.ttlMs}}function _(e){return!!(e.leaseProvider??e.deviceKey??e.clientId)}function v(e,t){return!t.tenantId||!t.runId?!1:[[e.leaseProvider,t.leaseProvider],[e.deviceKey,t.deviceKey],[e.clientId,t.clientId]].every(([e,t])=>!e||!!t)}function y(t,n){let r=x(n);if(r.tenantId&&t.tenantId!==r.tenantId||r.runId&&t.runId!==r.runId||r.leaseBackend&&t.backend!==r.leaseBackend||r.leaseProvider&&t.leaseProvider!==r.leaseProvider||r.deviceKey&&t.deviceKey!==r.deviceKey||r.clientId&&t.clientId!==r.clientId)throw new e(`UNAUTHORIZED`,`Lease does not match tenant/run scope`,{reason:`LEASE_SCOPE_MISMATCH`})}function b(t){let n=l(t.leaseBackend),i=r(t.tenantId);if(!i)throw new e(`INVALID_ARGS`,`tenant isolation requires tenant id.`);let a=o(t.runId);if(!a)throw new e(`INVALID_ARGS`,`tenant isolation requires run id.`);let c=s(t.leaseId);if(!c)throw new e(`INVALID_ARGS`,`tenant isolation requires lease id.`);return{...t,tenantId:i,runId:a,leaseId:c,leaseBackend:n}}function x(t){let n=r(t.tenantId),i=o(t.runId);if(t.tenantId&&!n)throw new e(`INVALID_ARGS`,`Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.`);if(t.runId&&!i)throw new e(`INVALID_ARGS`,`Invalid run id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.`);return{tenantId:n,runId:i,leaseBackend:t.leaseBackend?l(t.leaseBackend):void 0,leaseProvider:f(t.leaseProvider),deviceKey:u(t.deviceKey),clientId:d(t.clientId)}}function S(t,n){if(_(t)&&!v(t,n))throw new e(`UNAUTHORIZED`,`Lease owner scope is required`,{reason:`LEASE_SCOPE_REQUIRED`})}function C(e){if(e.deviceKey)return JSON.stringify([e.backend,e.leaseProvider??i,e.deviceKey])}function w(e){return JSON.stringify([e.tenantId,e.runId,e.backend,e.leaseProvider??i,e.deviceKey??`*`])}function T(e,n,r){return{leaseId:t.randomBytes(16).toString(`hex`),tenantId:e.tenantId,runId:e.runId,backend:e.backend,...e.leaseProvider?{leaseProvider:e.leaseProvider}:{},...e.deviceKey?{deviceKey:e.deviceKey}:{},...e.clientId?{clientId:e.clientId}:{},createdAt:r,heartbeatAt:r,expiresAt:r+n}}function E(t){return new e(`DEVICE_IN_USE`,`Device is already leased`,{reason:`DEVICE_LEASE_BUSY`,deviceKey:t.deviceKey,backend:t.backend,leaseProvider:t.leaseProvider,expiresAt:t.expiresAt,hint:`Retry after the lease expires or close the owning session.`})}const D=`/admin/human-control/holds`;function O(t){let n=A(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:k(n.scope)},...typeof r==`string`&&r.trim()?{reason:r.trim()}:{},...typeof i==`number`?{ttlMs:i}:{}}}function k(t){let n=A(t,`Host human-control scope`);if(typeof n.backend!=`string`||!n.backend.trim()||typeof n.deviceKey!=`string`)throw new e(`INVALID_ARGS`,`Host human control requires scope.backend and scope.deviceKey.`);if(n.leaseProvider!==void 0&&typeof n.leaseProvider!=`string`)throw new e(`INVALID_ARGS`,`scope.leaseProvider must be a string.`);let r=f(n.leaseProvider);return{backend:l(n.backend),deviceKey:u(n.deviceKey),...r?{leaseProvider:r}:{}}}function A(t,n){if(!t||typeof t!=`object`||Array.isArray(t))throw new e(`INVALID_ARGS`,`${n} must be an object.`);return t}function j(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 M(e){return{...e,scope:{...e.scope}}}function N(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{r as _,O as a,T as c,C as d,w as f,c as g,s as h,j as i,a as l,b as m,M as n,S as o,g as p,N as r,y as s,D as t,E as u,n as v};
1
+ import{O as e}from"./sdk-contracts.js";import t from"node:crypto";function n(e){return(e??``).trim().toLowerCase()===`tenant`?`tenant`:`none`}function r(e){if(!e)return;let t=e.trim();if(t&&/^[a-zA-Z0-9._-]{1,128}$/.test(t))return t}const i=`default`;function a(t){let n=Number.isInteger(t.defaultLeaseTtlMs)?Math.max(1,Number(t.defaultLeaseTtlMs)):6e4,r=Number.isInteger(t.minLeaseTtlMs)?Math.max(1,Number(t.minLeaseTtlMs)):5e3,i=Number.isInteger(t.maxLeaseTtlMs)?Math.max(r,Number(t.maxLeaseTtlMs)):6e5;return t=>{if(!Number.isInteger(t))return n;let a=Number(t);if(a<r||a>i)throw new e(`INVALID_ARGS`,`Lease ttlMs must be between ${r} and ${i}.`);return a}}function o(e){if(!e)return;let t=e.trim();if(t&&/^[a-zA-Z0-9._-]{1,128}$/.test(t))return t}function s(e){if(!e)return;let t=e.trim();if(t&&/^[a-f0-9]{16,128}$/i.test(t))return t.toLowerCase()}function c(t){let n=s(t);if(!n)throw new e(`INVALID_ARGS`,`Invalid lease id.`);return n}function l(t){let n=(t??``).trim().toLowerCase();if(!n||n===`ios-simulator`)return`ios-simulator`;if(n===`ios-instance`||n===`android-instance`||n===`harmonyos-instance`)return n;throw new e(`INVALID_ARGS`,`Unsupported lease backend: ${t??``}`)}function u(t){if(t===void 0)return;let n=t.trim();if(!n||n.length>256||!/^[\u0020-\u007E]+$/.test(n))throw new e(`INVALID_ARGS`,`Invalid device key. Use 1-256 printable characters.`);return n}function d(e){return p(e,`client id`,128)}function f(e){return p(e,`lease provider`,64)}function p(t,n,r){if(t===void 0)return;let i=t.trim();if(!i||i.length>r||!/^[a-zA-Z0-9._-]+$/.test(i))throw new e(`INVALID_ARGS`,`Invalid ${n}. Use 1-${String(r)} chars: letters, numbers, dot, underscore, hyphen.`);return i}function m(t){let n=r(t);if(!n)throw new e(`INVALID_ARGS`,`Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.`);return n}function h(t){let n=o(t);if(!n)throw new e(`INVALID_ARGS`,`Invalid run id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.`);return n}function g(e){return{backend:l(e.leaseBackend),leaseProvider:f(e.leaseProvider),deviceKey:u(e.deviceKey),clientId:d(e.clientId),tenantId:m(e.tenantId),runId:h(e.runId),ttlMs:e.ttlMs}}function _(e){return!!(e.leaseProvider??e.deviceKey??e.clientId)}function v(e,t){return!t.tenantId||!t.runId?!1:[[e.leaseProvider,t.leaseProvider],[e.deviceKey,t.deviceKey],[e.clientId,t.clientId]].every(([e,t])=>!e||!!t)}function y(t,n){let r=x(n);if(r.tenantId&&t.tenantId!==r.tenantId||r.runId&&t.runId!==r.runId||r.leaseBackend&&t.backend!==r.leaseBackend||r.leaseProvider&&t.leaseProvider!==r.leaseProvider||r.deviceKey&&t.deviceKey!==r.deviceKey||r.clientId&&t.clientId!==r.clientId)throw new e(`UNAUTHORIZED`,`Lease does not match tenant/run scope`,{reason:`LEASE_SCOPE_MISMATCH`})}function b(t){let n=l(t.leaseBackend),i=r(t.tenantId);if(!i)throw new e(`INVALID_ARGS`,`tenant isolation requires tenant id.`);let a=o(t.runId);if(!a)throw new e(`INVALID_ARGS`,`tenant isolation requires run id.`);let c=s(t.leaseId);if(!c)throw new e(`INVALID_ARGS`,`tenant isolation requires lease id.`);return{...t,tenantId:i,runId:a,leaseId:c,leaseBackend:n}}function x(t){let n=r(t.tenantId),i=o(t.runId);if(t.tenantId&&!n)throw new e(`INVALID_ARGS`,`Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.`);if(t.runId&&!i)throw new e(`INVALID_ARGS`,`Invalid run id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.`);return{tenantId:n,runId:i,leaseBackend:t.leaseBackend?l(t.leaseBackend):void 0,leaseProvider:f(t.leaseProvider),deviceKey:u(t.deviceKey),clientId:d(t.clientId)}}function S(t,n){if(_(t)&&!v(t,n))throw new e(`UNAUTHORIZED`,`Lease owner scope is required`,{reason:`LEASE_SCOPE_REQUIRED`})}function C(e){if(e.deviceKey)return JSON.stringify([e.backend,e.leaseProvider??i,e.deviceKey])}function w(e){return JSON.stringify([e.tenantId,e.runId,e.backend,e.leaseProvider??i,e.deviceKey??`*`])}function T(e,n,r){return{leaseId:t.randomBytes(16).toString(`hex`),tenantId:e.tenantId,runId:e.runId,backend:e.backend,...e.leaseProvider?{leaseProvider:e.leaseProvider}:{},...e.deviceKey?{deviceKey:e.deviceKey}:{},...e.clientId?{clientId:e.clientId}:{},createdAt:r,heartbeatAt:r,expiresAt:r+n}}function E(t){return new e(`DEVICE_IN_USE`,`Device is already leased`,{reason:`DEVICE_LEASE_BUSY`,deviceKey:t.deviceKey,backend:t.backend,leaseProvider:t.leaseProvider,expiresAt:t.expiresAt,hint:`Retry after the lease expires or close the owning session.`})}const D=`/admin/human-control/holds`;function O(t){let n=A(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:k(n.scope)},...typeof r==`string`&&r.trim()?{reason:r.trim()}:{},...typeof i==`number`?{ttlMs:i}:{}}}function k(t){let n=A(t,`Host human-control scope`);if(typeof n.backend!=`string`||!n.backend.trim()||typeof n.deviceKey!=`string`)throw new e(`INVALID_ARGS`,`Host human control requires scope.backend and scope.deviceKey.`);if(n.leaseProvider!==void 0&&typeof n.leaseProvider!=`string`)throw new e(`INVALID_ARGS`,`scope.leaseProvider must be a string.`);let r=f(n.leaseProvider);return{backend:l(n.backend),deviceKey:u(n.deviceKey),...r?{leaseProvider:r}:{}}}function A(t,n){if(!t||typeof t!=`object`||Array.isArray(t))throw new e(`INVALID_ARGS`,`${n} must be an object.`);return t}function j(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 M(e){return{...e,scope:{...e.scope}}}function N(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{r as _,O as a,T as c,C as d,w as f,c as g,s as h,j as i,a as l,b as m,M as n,S as o,g as p,N as r,y as s,D as t,E as u,n as v};
@@ -1 +1 @@
1
- import{D as e}from"./sdk-contracts.js";import{a as t}from"./human-control-contract.js";import{r as n}from"./request-cancel.js";import"./request.js";async function r(t){let{req:r,registry:s}=t,c=r.internal?.admittedLease;if(!c)throw new e(`UNAUTHORIZED`,`Human control requires an admitted remote lease.`);let l={kind:`lease`,leaseId:c.leaseId},u=r.positionals??[],[d,f=``,p=``]=u;switch(d){case`list`:return a(u,1),{ok:!0,data:{holds:s.listHumanControlHolds(l)}};case`put`:return a(u,3),{ok:!0,data:{hold:await s.putHumanControlHold(l,f,i(p),n(r.meta?.requestId)),state:`active`}};case`remove`:{a(u,2);let e=s.removeHumanControlHold(l,f);return{ok:!0,data:{released:!!e,...e?{hold:e}:{}}}}default:throw o()}}function i(n){let r;try{r=JSON.parse(n)}catch(t){throw new e(`INVALID_ARGS`,`Human-control payload must be valid JSON.`,void 0,t)}return t(r)}function a(e,t){if(e.length!==t)throw o()}function o(){return new e(`INVALID_ARGS`,`human_control requires list, put <id> <payload>, or remove <id>.`)}export{r as handleHumanControlCommand};
1
+ import{O as e}from"./sdk-contracts.js";import{a as t}from"./human-control-contract.js";import{r as n}from"./request-cancel.js";import"./request.js";async function r(t){let{req:r,registry:s}=t,c=r.internal?.admittedLease;if(!c)throw new e(`UNAUTHORIZED`,`Human control requires an admitted remote lease.`);let l={kind:`lease`,leaseId:c.leaseId},u=r.positionals??[],[d,f=``,p=``]=u;switch(d){case`list`:return a(u,1),{ok:!0,data:{holds:s.listHumanControlHolds(l)}};case`put`:return a(u,3),{ok:!0,data:{hold:await s.putHumanControlHold(l,f,i(p),n(r.meta?.requestId)),state:`active`}};case`remove`:{a(u,2);let e=s.removeHumanControlHold(l,f);return{ok:!0,data:{released:!!e,...e?{hold:e}:{}}}}default:throw o()}}function i(n){let r;try{r=JSON.parse(n)}catch(t){throw new e(`INVALID_ARGS`,`Human-control payload must be valid JSON.`,void 0,t)}return t(r)}function a(e,t){if(e.length!==t)throw o()}function o(){return new e(`INVALID_ARGS`,`human_control requires list, put <id> <payload>, or remove <id>.`)}export{r as handleHumanControlCommand};
package/dist/src/index.js CHANGED
@@ -1 +1 @@
1
- import{D as e,I as t,N as n,g as r}from"./sdk-contracts.js";import{n as i}from"./agent-device-client.js";import{t as a}from"./sdk-io.js";export{e as AppError,r as centerOfRect,i as createAgentDeviceClient,a as createLocalArtifactAdapter,n as isAgentDeviceError,t as normalizeAgentDeviceError};
1
+ import{L as e,O as t,P as n,g as r}from"./sdk-contracts.js";import{n as i}from"./agent-device-client.js";import{t as a}from"./sdk-io.js";export{t as AppError,r as centerOfRect,i as createAgentDeviceClient,a as createLocalArtifactAdapter,n as isAgentDeviceError,e as normalizeAgentDeviceError};
@@ -1 +1 @@
1
- import{D as e}from"./sdk-contracts.js";import{d as t}from"./scroll-gesture.js";import{t as n}from"./timeouts.js";import"./retry.js";import{runHarmonyShell as r}from"./hdc.js";import{invalidateHarmonyGestureViewport as i,readHarmonyGestureViewport as a}from"./snapshot2.js";async function o(e,t,n){await r(e,[`uitest`,`uiInput`,`click`,t,n])}async function s(e,t,n){await r(e,[`uitest`,`uiInput`,`doubleClick`,t,n])}async function c(e,t,n,i=800){await r(e,[`uitest`,`uiInput`,`longClick`,t,n])}async function l(e,t,i=0){await r(e,[`uitest`,`uiInput`,`text`,t]),i>0&&await n(i)}async function u(e,t,i,a,o=0){await r(e,[`uitest`,`uiInput`,`inputText`,t,i,a]),o>0&&await n(o)}async function d(e,n,i){let o=await a(e),s=t({direction:n,amount:i?.amount,pixels:i?.pixels,referenceWidth:o.width,referenceHeight:o.height});return await r(e,[`uitest`,`uiInput`,`swipe`,s.x1,s.y1,s.x2,s.y2,i?.durationMs??300]),s}async function f(t,n){if(n.topology!==`single`)throw new e(`UNSUPPORTED_OPERATION`,`HarmonyOS HDC does not support multi-touch gestures`);let i=n.pointers[0].samples,a=i[0],o=i.at(-1);if(!a||!o)throw new e(`COMMAND_FAILED`,`HarmonyOS gesture plan has no pointer endpoints`);let s=Math.hypot(o.point.x-a.point.x,o.point.y-a.point.y),c=Math.max(200,Math.min(4e4,Math.round(s/n.durationMs*1e3))),l=n.intent===`fling`?`fling`:`swipe`;return await r(t,[`uitest`,`uiInput`,l,Math.round(a.point.x),Math.round(a.point.y),Math.round(o.point.x),Math.round(o.point.y),c]),{backend:`harmonyos-hdc-uiinput`,command:l,velocity:c,viewport:n.viewport}}async function p(e){await r(e,[`uitest`,`uiInput`,`keyEvent`,`Back`]),i(e)}async function m(e){await r(e,[`uitest`,`uiInput`,`keyEvent`,`Home`]),i(e)}async function h(e){await r(e,[`uitest`,`uiInput`,`keyEvent`,`Recent`]),i(e)}async function g(e,t){if(t===`Back`){await p(e);return}await r(e,[`uitest`,`uiInput`,`keyEvent`,t])}async function _(t,n){throw new e(`UNSUPPORTED_OPERATION`,`HarmonyOS orientation control is not available through the public HDC API.`)}export{h as appSwitcherHarmony,p as backHarmony,s as doubleClickHarmony,u as fillHarmony,m as homeHarmony,c as longPressHarmony,f as performHarmonyGesture,o as pressHarmony,g as pressHarmonyKeyboardKey,d as scrollHarmony,_ as setHarmonyOrientation,l as typeHarmony};
1
+ import{O as e}from"./sdk-contracts.js";import{d as t}from"./scroll-gesture.js";import{t as n}from"./timeouts.js";import"./retry.js";import{runHarmonyShell as r}from"./hdc.js";import{invalidateHarmonyGestureViewport as i,readHarmonyGestureViewport as a}from"./snapshot2.js";async function o(e,t,n){await r(e,[`uitest`,`uiInput`,`click`,t,n])}async function s(e,t,n){await r(e,[`uitest`,`uiInput`,`doubleClick`,t,n])}async function c(e,t,n,i=800){await r(e,[`uitest`,`uiInput`,`longClick`,t,n])}async function l(e,t,i=0){await r(e,[`uitest`,`uiInput`,`text`,t]),i>0&&await n(i)}async function u(e,t,i,a,o=0){await r(e,[`uitest`,`uiInput`,`inputText`,t,i,a]),o>0&&await n(o)}async function d(e,n,i){let o=await a(e),s=t({direction:n,amount:i?.amount,pixels:i?.pixels,referenceWidth:o.width,referenceHeight:o.height});return await r(e,[`uitest`,`uiInput`,`swipe`,s.x1,s.y1,s.x2,s.y2,i?.durationMs??300]),s}async function f(t,n){if(n.topology!==`single`)throw new e(`UNSUPPORTED_OPERATION`,`HarmonyOS HDC does not support multi-touch gestures`);let i=n.pointers[0].samples,a=i[0],o=i.at(-1);if(!a||!o)throw new e(`COMMAND_FAILED`,`HarmonyOS gesture plan has no pointer endpoints`);let s=Math.hypot(o.point.x-a.point.x,o.point.y-a.point.y),c=Math.max(200,Math.min(4e4,Math.round(s/n.durationMs*1e3))),l=n.intent===`fling`?`fling`:`swipe`;return await r(t,[`uitest`,`uiInput`,l,Math.round(a.point.x),Math.round(a.point.y),Math.round(o.point.x),Math.round(o.point.y),c]),{backend:`harmonyos-hdc-uiinput`,command:l,velocity:c,viewport:n.viewport}}async function p(e){await r(e,[`uitest`,`uiInput`,`keyEvent`,`Back`]),i(e)}async function m(e){await r(e,[`uitest`,`uiInput`,`keyEvent`,`Home`]),i(e)}async function h(e){await r(e,[`uitest`,`uiInput`,`keyEvent`,`Recent`]),i(e)}async function g(e,t){if(t===`Back`){await p(e);return}await r(e,[`uitest`,`uiInput`,`keyEvent`,t])}async function _(t,n){throw new e(`UNSUPPORTED_OPERATION`,`HarmonyOS orientation control is not available through the public HDC API.`)}export{h as appSwitcherHarmony,p as backHarmony,s as doubleClickHarmony,u as fillHarmony,m as homeHarmony,c as longPressHarmony,f as performHarmonyGesture,o as pressHarmony,g as pressHarmonyKeyboardKey,d as scrollHarmony,_ as setHarmonyOrientation,l as typeHarmony};
@@ -1,2 +1,2 @@
1
- import{D as e}from"./sdk-contracts.js";import{t}from"./scroll-gesture.js";import{c as n}from"./owner-identity.js";import{t as r}from"./timeouts.js";import"./retry.js";import"./process.js";import{t as i}from"./tool-provider2.js";function a(){let e=n();return e.WAYLAND_DISPLAY||e.XDG_SESSION_TYPE===`wayland`?`wayland`:`x11`}let o=null;async function s(){let t=i();if(o?.provider===t)return o;let n=a();if(n===`wayland`){if(await t.whichCommand(`ydotool`))return o={tool:`ydotool`,display:n,provider:t},o;throw new e(`TOOL_MISSING`,`ydotool is required for input synthesis on Wayland (xdotool does not work on Wayland). Install it via your package manager.`)}if(await t.whichCommand(`xdotool`))return o={tool:`xdotool`,display:n,provider:t},o;throw new e(`TOOL_MISSING`,`xdotool is required for input synthesis on X11. Install it via your package manager.`)}const c=1e4;async function l(...e){await i().runCommand(`xdotool`,e,{allowFailure:!1,timeoutMs:c})}async function u(...e){await i().runCommand(`ydotool`,e,{allowFailure:!1,timeoutMs:c})}function d(){return i().input}async function f(e,t){let{tool:n}=await s();if(n===`xdotool`){if(await p(e,t))return;await l(`mousemove`,`--sync`,String(e),String(t))}else await u(`mousemove`,`--absolute`,`-x`,String(e),`-y`,String(t))}async function p(e,t){try{let n=await i().runCommand(`xdotool`,[`getmouselocation`,`--shell`],{allowFailure:!0,timeoutMs:c}),r=new Map(n.stdout.split(`
1
+ import{O as e}from"./sdk-contracts.js";import{t}from"./scroll-gesture.js";import{c as n}from"./owner-identity.js";import{t as r}from"./timeouts.js";import"./retry.js";import"./process.js";import{t as i}from"./tool-provider2.js";function a(){let e=n();return e.WAYLAND_DISPLAY||e.XDG_SESSION_TYPE===`wayland`?`wayland`:`x11`}let o=null;async function s(){let t=i();if(o?.provider===t)return o;let n=a();if(n===`wayland`){if(await t.whichCommand(`ydotool`))return o={tool:`ydotool`,display:n,provider:t},o;throw new e(`TOOL_MISSING`,`ydotool is required for input synthesis on Wayland (xdotool does not work on Wayland). Install it via your package manager.`)}if(await t.whichCommand(`xdotool`))return o={tool:`xdotool`,display:n,provider:t},o;throw new e(`TOOL_MISSING`,`xdotool is required for input synthesis on X11. Install it via your package manager.`)}const c=1e4;async function l(...e){await i().runCommand(`xdotool`,e,{allowFailure:!1,timeoutMs:c})}async function u(...e){await i().runCommand(`ydotool`,e,{allowFailure:!1,timeoutMs:c})}function d(){return i().input}async function f(e,t){let{tool:n}=await s();if(n===`xdotool`){if(await p(e,t))return;await l(`mousemove`,`--sync`,String(e),String(t))}else await u(`mousemove`,`--absolute`,`-x`,String(e),`-y`,String(t))}async function p(e,t){try{let n=await i().runCommand(`xdotool`,[`getmouselocation`,`--shell`],{allowFailure:!0,timeoutMs:c}),r=new Map(n.stdout.split(`
2
2
  `).map(e=>e.trim().split(`=`)).filter(e=>e.length===2).map(([e,t])=>[e,Number(t)]));return r.get(`X`)===Math.round(e)&&r.get(`Y`)===Math.round(t)}catch{return!1}}async function m(e,t){let n=d();if(n){await n.key(e,t);return}let{tool:r}=await s();r===`xdotool`?await l(`key`,`--clearmodifiers`,e):await u(`key`,...t)}async function h(e,t,n,r){await f(e,t);let{tool:i}=await s();i===`xdotool`?await l(`click`,n):await u(`click`,r)}async function g(e,t,n,r,i){let a=d();if(a){await a.click(e,t,n);return}await h(e,t,r,i)}async function _(e,t){await g(e,t,`primary`,`1`,`0xC0`)}async function v(e,t){await g(e,t,`secondary`,`3`,`0xC1`)}async function y(e,t){await g(e,t,`middle`,`2`,`0xC2`)}async function b(e,t){let n=d();if(n){await n.doubleClick(e,t);return}let{tool:r}=await s();await f(e,t),r===`xdotool`?await l(`click`,`--repeat`,`2`,`1`):(await u(`click`,`0xC0`),await u(`click`,`0xC0`))}async function x(e,t,n=800){let i=d();if(i){await i.longPress(e,t,n);return}let{tool:a}=await s();await f(e,t),a===`xdotool`?(await l(`mousedown`,`1`),await r(n),await l(`mouseup`,`1`)):(await u(`click`,`--down`,`0xC0`),await r(n),await u(`click`,`--up`,`0xC0`))}async function S(e,t){await _(e,t)}async function C(e,t,n,i,a=300){let o=d();if(o){await o.drag(e,t,n,i,a);return}let{tool:c}=await s();await f(e,t),c===`xdotool`?(await l(`mousedown`,`1`),await l(`mousemove`,`--sync`,String(n),String(i)),await r(a),await l(`mouseup`,`1`)):(await u(`click`,`--down`,`0xC0`),await u(`mousemove`,`--absolute`,`-x`,String(n),`-y`,String(i)),await r(a),await u(`click`,`--up`,`0xC0`))}async function w(e,n){let r=d();if(r)return await r.scroll(e,n),E(n);let{tool:i}=await s(),a=5;if(n?.pixels==null?n?.amount!=null&&(a=Math.max(1,Math.round(5*(n.amount/t)))):a=i===`xdotool`?Math.max(1,Math.round(n.pixels/15)):Math.max(1,Math.round(n.pixels/40)),i===`xdotool`){let t=e===`up`?`4`:e===`down`?`5`:e===`left`?`6`:`7`;await T(a,n?.durationMs,async e=>{await l(`click`,`--repeat`,String(e),t)})}else e===`up`||e===`down`?await T(a,n?.durationMs,async t=>{await u(`mousemove`,`--wheel`,`-y`,String(e===`up`?-t:t))}):await T(a,n?.durationMs,async t=>{await u(`mousemove`,`--wheel`,`-x`,String(e===`left`?-t:t))});return E(n)}async function T(e,t,n){if(t===void 0||t<=0||e<=1){await n(e);return}let i=t/Math.max(1,e-1);for(let t=0;t<e;t+=1)await n(1),t<e-1&&await r(i)}function E(e){return e?.durationMs===void 0?{}:{durationMs:e.durationMs}}async function D(e,t=0){let n=d();if(n){await n.typeText(e,{delayMs:t});return}let{tool:r}=await s();if(r===`xdotool`){let n=[`type`];t>0&&n.push(`--delay`,String(t)),n.push(`--clearmodifiers`,`--`,e),await l(...n)}else await u(`type`,`--`,e)}async function O(e,t,n,i=0){if(await _(e,t),await r(100),await m(`ctrl+a`,[`29:1`,`30:1`,`30:0`,`29:0`]),await r(50),n.length===0){await m(`BackSpace`,[`14:1`,`14:0`]);return}await D(n,i)}export{b as doubleClickLinux,O as fillLinux,S as focusLinux,x as longPressLinux,y as middleClickLinux,_ as pressLinux,v as rightClickLinux,w as scrollLinux,m as sendKey,C as swipeLinux,D as typeLinux};
@@ -1 +1 @@
1
- import{D as e}from"./sdk-contracts.js";import{r as t}from"./archive.js";import{a as n,c as r,n as i,o as a,r as o,s}from"./install-source2.js";import{C as c,g as l,m as u}from"./host-file.js";import{t as d}from"./plist.js";import f from"node:path";async function p(e,t){let n=f.join(e,`Info.plist`),[r,i,a]=await Promise.all([d(n,`CFBundleIdentifier`,t),d(n,`CFBundleDisplayName`,t),d(n,`CFBundleName`,t)]);return{bundleId:r,appName:i??a}}async function m(e,t){return await r(async()=>await h(e,t))}async function h(t,n){if(t.kind===`url`&&!i(t.url))throw new e(`INVALID_ARGS`,`iOS install_from_source URL sources are only supported for trusted artifact services such as GitHub Actions and EAS. Use a path source for other hosts.`);let r=await o({source:t,isInstallablePath:(e,t)=>t.isDirectory()&&e.toLowerCase().endsWith(`.app`)||t.isFile()&&e.toLowerCase().endsWith(`.ipa`),installableLabel:`iOS installable (.app or .ipa)`,allowArchiveExtraction:t.kind!==`url`||i(t.url),signal:n?.signal}),a;try{a=await g(r.installablePath,n);let e=a,t=await p(e.installPath,n?.signal);return{archivePath:r.archivePath??(r.installablePath.toLowerCase().endsWith(`.ipa`)?r.installablePath:void 0),installablePath:e.installPath,bundleId:t.bundleId,appName:t.appName,cleanup:async()=>{await e.cleanup(),await r.cleanup()}}}catch(e){try{await a?.cleanup()}finally{await r.cleanup()}throw e}}async function g(e,t){return e.toLowerCase().endsWith(`.ipa`)?await _(e,t):{installPath:e,cleanup:async()=>{}}}async function _(r,i){let o=await u(`agent-device-ios-ipa-`),d=async()=>{await c(o)};try{let c=f.join(o,`extracted`),u=a()+1,p=n();await t({archivePath:r,outputRoot:c,type:`zip`,budget:p,depth:u,signal:i?.signal}),s(u);let m=f.join(c,`Payload`),h=(await l(m,{withFileTypes:!0}).catch(()=>{throw new e(`INVALID_ARGS`,`Invalid IPA: missing Payload directory`)})).filter(e=>e.isDirectory()&&e.name.toLowerCase().endsWith(`.app`)).map(e=>({installPath:f.join(m,e.name),bundleName:e.name.replace(/\.app$/i,``)})),g=h[0];if(g!==void 0&&h.length===1)return{installPath:g.installPath,cleanup:d};if(h.length===0)throw new e(`INVALID_ARGS`,`Invalid IPA: expected at least one .app under Payload, found 0`);await v(h,i?.signal);let _=i?.appIdentifierHint?.trim();if(_){let t=y(h,_);if(t)return{installPath:t.installPath,cleanup:d};throw new e(`INVALID_ARGS`,`Invalid IPA: found ${h.length} .app bundles under Payload and none matched "${_}". Available bundles: ${h.map(b).join(`, `)}`)}throw new e(`INVALID_ARGS`,`Invalid IPA: found ${h.length} .app bundles under Payload. Pass an app identifier or bundle name matching one of: ${h.map(b).join(`, `)}`)}catch(e){throw await d(),e}}async function v(e,t){await Promise.all(e.map(async e=>{if(e.bundleId&&e.appName)return;let n=await p(e.installPath,t);e.bundleId=e.bundleId??n.bundleId,e.appName=e.appName??n.appName}))}function y(t,n){let r=n.toLowerCase(),i=t.filter(e=>e.bundleName.toLowerCase()===r);if(i.length===1)return i[0];if(i.length>1)throw new e(`INVALID_ARGS`,`Invalid IPA: multiple app bundles matched "${n}" by name. Use a bundle id hint instead.`);if(n.includes(`.`)){let e=t.filter(e=>e.bundleId?.toLowerCase()===r);if(e.length===1)return e[0]}}function b(e){let t=e.bundleId??e.appName;return t?`${e.bundleName}.app (${t})`:`${e.bundleName}.app`}export{m as prepareIosInstallArtifact,p as readIosBundleInfo};
1
+ import{O as e}from"./sdk-contracts.js";import{r as t}from"./archive.js";import{a as n,c as r,n as i,o as a,r as o,s}from"./install-source2.js";import{C as c,g as l,m as u}from"./host-file.js";import{t as d}from"./plist.js";import f from"node:path";async function p(e,t){let n=f.join(e,`Info.plist`),[r,i,a]=await Promise.all([d(n,`CFBundleIdentifier`,t),d(n,`CFBundleDisplayName`,t),d(n,`CFBundleName`,t)]);return{bundleId:r,appName:i??a}}async function m(e,t){return await r(async()=>await h(e,t))}async function h(t,n){if(t.kind===`url`&&!i(t.url))throw new e(`INVALID_ARGS`,`iOS install_from_source URL sources are only supported for trusted artifact services such as GitHub Actions and EAS. Use a path source for other hosts.`);let r=await o({source:t,isInstallablePath:(e,t)=>t.isDirectory()&&e.toLowerCase().endsWith(`.app`)||t.isFile()&&e.toLowerCase().endsWith(`.ipa`),installableLabel:`iOS installable (.app or .ipa)`,allowArchiveExtraction:t.kind!==`url`||i(t.url),signal:n?.signal}),a;try{a=await g(r.installablePath,n);let e=a,t=await p(e.installPath,n?.signal);return{archivePath:r.archivePath??(r.installablePath.toLowerCase().endsWith(`.ipa`)?r.installablePath:void 0),installablePath:e.installPath,bundleId:t.bundleId,appName:t.appName,cleanup:async()=>{await e.cleanup(),await r.cleanup()}}}catch(e){try{await a?.cleanup()}finally{await r.cleanup()}throw e}}async function g(e,t){return e.toLowerCase().endsWith(`.ipa`)?await _(e,t):{installPath:e,cleanup:async()=>{}}}async function _(r,i){let o=await u(`agent-device-ios-ipa-`),d=async()=>{await c(o)};try{let c=f.join(o,`extracted`),u=a()+1,p=n();await t({archivePath:r,outputRoot:c,type:`zip`,budget:p,depth:u,signal:i?.signal}),s(u);let m=f.join(c,`Payload`),h=(await l(m,{withFileTypes:!0}).catch(()=>{throw new e(`INVALID_ARGS`,`Invalid IPA: missing Payload directory`)})).filter(e=>e.isDirectory()&&e.name.toLowerCase().endsWith(`.app`)).map(e=>({installPath:f.join(m,e.name),bundleName:e.name.replace(/\.app$/i,``)})),g=h[0];if(g!==void 0&&h.length===1)return{installPath:g.installPath,cleanup:d};if(h.length===0)throw new e(`INVALID_ARGS`,`Invalid IPA: expected at least one .app under Payload, found 0`);await v(h,i?.signal);let _=i?.appIdentifierHint?.trim();if(_){let t=y(h,_);if(t)return{installPath:t.installPath,cleanup:d};throw new e(`INVALID_ARGS`,`Invalid IPA: found ${h.length} .app bundles under Payload and none matched "${_}". Available bundles: ${h.map(b).join(`, `)}`)}throw new e(`INVALID_ARGS`,`Invalid IPA: found ${h.length} .app bundles under Payload. Pass an app identifier or bundle name matching one of: ${h.map(b).join(`, `)}`)}catch(e){throw await d(),e}}async function v(e,t){await Promise.all(e.map(async e=>{if(e.bundleId&&e.appName)return;let n=await p(e.installPath,t);e.bundleId=e.bundleId??n.bundleId,e.appName=e.appName??n.appName}))}function y(t,n){let r=n.toLowerCase(),i=t.filter(e=>e.bundleName.toLowerCase()===r);if(i.length===1)return i[0];if(i.length>1)throw new e(`INVALID_ARGS`,`Invalid IPA: multiple app bundles matched "${n}" by name. Use a bundle id hint instead.`);if(n.includes(`.`)){let e=t.filter(e=>e.bundleId?.toLowerCase()===r);if(e.length===1)return e[0]}}function b(e){let t=e.bundleId??e.appName;return t?`${e.bundleName}.app (${t})`:`${e.bundleName}.app`}export{m as prepareIosInstallArtifact,p as readIosBundleInfo};