agent-device 0.21.23 → 0.21.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (258) hide show
  1. package/README.md +6 -6
  2. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.23.apk → agent-device-android-ime-helper-0.21.24.apk} +0 -0
  3. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.24.apk.sha256 +1 -0
  4. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.23.manifest.json → agent-device-android-ime-helper-0.21.24.manifest.json} +4 -4
  5. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.23.apk → agent-device-android-snapshot-helper-0.21.24.apk} +0 -0
  6. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.24.apk.sha256 +1 -0
  7. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.23.manifest.json → agent-device-android-snapshot-helper-0.21.24.manifest.json} +6 -6
  8. package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/SnapshotTraversal.swift +12 -6
  9. package/apple/macos-helper/Tests/AgentDeviceMacOSHelperTests/RectResponseTests.swift +21 -0
  10. package/apple/snapshot-bridge/README.md +9 -7
  11. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandDispatch.swift +56 -0
  12. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +14 -5
  13. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Lifecycle.swift +8 -0
  14. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +12 -0
  15. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCaptureTarget.swift +1 -1
  16. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotExecution.swift +29 -5
  17. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +34 -10
  18. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryFocus.swift +19 -5
  19. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextTyping.swift +3 -3
  20. package/dist/src/adapter.js +1 -1
  21. package/dist/src/adb.js +1 -1
  22. package/dist/src/agent-browser-lifecycle.js +1 -1
  23. package/dist/src/agent-browser-process-record.js +1 -1
  24. package/dist/src/agent-browser-provider.js +1 -1
  25. package/dist/src/agent-device-client.js +2 -2
  26. package/dist/src/alert-runtime.js +1 -1
  27. package/dist/src/alert.js +1 -1
  28. package/dist/src/android-adb.d.ts +3 -2
  29. package/dist/src/android-input-ownership.js +1 -1
  30. package/dist/src/app-backend.js +1 -1
  31. package/dist/src/app-inventory.d.ts +4 -0
  32. package/dist/src/app-launch.js +1 -1
  33. package/dist/src/app-lifecycle.js +1 -1
  34. package/dist/src/app-log-runtime2.js +3 -3
  35. package/dist/src/app-resolution.js +2 -2
  36. package/dist/src/app-state-runtime.d.ts +15 -0
  37. package/dist/src/apple-runner-platform.js +1 -1
  38. package/dist/src/application-lifecycle-interaction.js +1 -1
  39. package/dist/src/aws-device-farm-connection.js +1 -0
  40. package/dist/src/back-mode.js +1 -1
  41. package/dist/src/backend-snapshot-options.js +1 -1
  42. package/dist/src/browserstack-connection.js +1 -0
  43. package/dist/src/browserstack-device-features.js +1 -0
  44. package/dist/src/browserstack.js +1 -0
  45. package/dist/src/cache.js +1 -1
  46. package/dist/src/cli-config.js +1 -1
  47. package/dist/src/cli-help.js +35 -19
  48. package/dist/src/cli-runner.js +1 -1
  49. package/dist/src/cli.js +3 -4
  50. package/dist/src/client-companion-tunnel.js +1 -0
  51. package/dist/src/client-metro-companion.js +1 -1
  52. package/dist/src/client-metro.js +1 -1
  53. package/dist/src/client-types.d.ts +7 -5
  54. package/dist/src/cloud-artifacts.d.ts +3 -2
  55. package/dist/src/command-metadata.js +1 -1
  56. package/dist/src/command-schema.js +1 -1
  57. package/dist/src/command-tools.js +2 -2
  58. package/dist/src/connection-runtime.js +1 -1
  59. package/dist/src/connection-verification.js +1 -0
  60. package/dist/src/connection.js +5 -5
  61. package/dist/src/contracts.d.ts +1 -1
  62. package/dist/src/daemon-client-lease-beat.js +1 -1
  63. package/dist/src/daemon-client-lifecycle.js +1 -1
  64. package/dist/src/daemon-client-transport.js +1 -1
  65. package/dist/src/daemon-http.js +1 -1
  66. package/dist/src/daemon-policy-file.js +1 -1
  67. package/dist/src/daemon-registration-owner.js +1 -1
  68. package/dist/src/device-claim-inspection.js +1 -1
  69. package/dist/src/device-input-state.d.ts +2 -15
  70. package/dist/src/device-readiness-runtime.js +1 -1
  71. package/dist/src/device-selection-resolver.js +1 -1
  72. package/dist/src/device.js +1 -1
  73. package/dist/src/device2.js +1 -1
  74. package/dist/src/device3.js +1 -1
  75. package/dist/src/dispatch-resolve.js +3 -3
  76. package/dist/src/doctor-facade.js +1 -1
  77. package/dist/src/durable-capture-resource.js +1 -1
  78. package/dist/src/durable-resource.js +1 -1
  79. package/dist/src/exec.js +1 -1
  80. package/dist/src/file.js +1 -1
  81. package/dist/src/find.js +1 -1
  82. package/dist/src/finders.js +1 -1
  83. package/dist/src/format.js +2 -1
  84. package/dist/src/gesture-admission.js +1 -1
  85. package/dist/src/gesture-plan-types.d.ts +2 -5
  86. package/dist/src/gesture-runtime.js +1 -1
  87. package/dist/src/human-control.js +1 -1
  88. package/dist/src/ime-rebind.js +1 -1
  89. package/dist/src/ime-settings-record.js +1 -0
  90. package/dist/src/ime-state.js +1 -1
  91. package/dist/src/index.d.ts +3 -3
  92. package/dist/src/input-actions.js +1 -1
  93. package/dist/src/input-actions2.js +1 -1
  94. package/dist/src/install-source2.js +1 -1
  95. package/dist/src/interaction-positionals.js +1 -1
  96. package/dist/src/interaction-ref-policy.js +1 -1
  97. package/dist/src/interaction.js +1 -1
  98. package/dist/src/interaction2.js +1 -1
  99. package/dist/src/interactor.js +5 -5
  100. package/dist/src/interactors.js +1 -1
  101. package/dist/src/internal/bin.js +1 -1
  102. package/dist/src/internal/daemon.js +1 -1
  103. package/dist/src/inventory2.js +1 -1
  104. package/dist/src/ios-snapshot-acquisition.js +1 -1
  105. package/dist/src/ios-snapshot-engine.js +1 -1
  106. package/dist/src/ios-snapshot-runtime.js +1 -1
  107. package/dist/src/launch-confirmation.js +1 -1
  108. package/dist/src/lease-scope.js +1 -1
  109. package/dist/src/lease.js +1 -1
  110. package/dist/src/limrun.d.ts +4 -555
  111. package/dist/src/load.js +1 -1
  112. package/dist/src/local-interactor-operation-set.js +1 -1
  113. package/dist/src/managed-device-scope.js +1 -1
  114. package/dist/src/manifest.js +1 -0
  115. package/dist/src/mechanics.js +16 -16
  116. package/dist/src/mobile-snapshot-semantics.js +1 -1
  117. package/dist/src/observation.js +1 -2
  118. package/dist/src/overlay.js +3 -3
  119. package/dist/src/owner-identity.js +3 -3
  120. package/dist/src/perf-facade.js +1 -1
  121. package/dist/src/perf-runtime-plan.js +1 -1
  122. package/dist/src/perf-target.js +1 -1
  123. package/dist/src/physical-device-control.js +1 -1
  124. package/dist/src/platform-request-scope.js +1 -1
  125. package/dist/src/platform-runtime-open-target.js +1 -1
  126. package/dist/src/platform-runtime-operation-host.js +4 -4
  127. package/dist/src/platform-runtime-runtime-hints.js +1 -1
  128. package/dist/src/platform-runtime-screen-recording-finalizer-host.js +1 -1
  129. package/dist/src/platform-runtime-unavailable.js +1 -1
  130. package/dist/src/platform-runtime.js +1 -1
  131. package/dist/src/platform-runtime2.js +1 -1
  132. package/dist/src/plugin.js +1 -0
  133. package/dist/src/plugins/webdriver.d.ts +111 -0
  134. package/dist/src/plugins/webdriver.js +1 -0
  135. package/dist/src/plugins.d.ts +2 -1
  136. package/dist/src/plugins2.js +1 -1
  137. package/dist/src/process-exit.js +1 -1
  138. package/dist/src/process.js +1 -1
  139. package/dist/src/provider-credential-fingerprint.js +1 -1
  140. package/dist/src/provider-device-admission.js +1 -1
  141. package/dist/src/provider-device-runtime.d.ts +556 -0
  142. package/dist/src/provider-policy.js +1 -0
  143. package/dist/src/provider-profile-fields.js +1 -1
  144. package/dist/src/provider-webdriver.js +1 -2
  145. package/dist/src/providers.js +1 -1
  146. package/dist/src/react-devtools.js +2 -0
  147. package/dist/src/react-native.js +1 -1
  148. package/dist/src/record-runtime.js +1 -1
  149. package/dist/src/record-trace.js +1 -1
  150. package/dist/src/recording.js +1 -1
  151. package/dist/src/registry.js +24 -24
  152. package/dist/src/remote-bridge.js +1 -0
  153. package/dist/src/remote-config-core.js +1 -0
  154. package/dist/src/remote-config.js +1 -1
  155. package/dist/src/remote-config2.js +1 -1
  156. package/dist/src/remote-connection-state.js +1 -0
  157. package/dist/src/replay.js +2 -2
  158. package/dist/src/request-admission.js +1 -1
  159. package/dist/src/request-runtime-binding.js +1 -1
  160. package/dist/src/result-serialization.js +1 -1
  161. package/dist/src/retry.js +1 -1
  162. package/dist/src/retry2.js +1 -0
  163. package/dist/src/runner-artifact-manifest.js +1 -1
  164. package/dist/src/runner-cache-metadata.js +2 -3
  165. package/dist/src/runner-cache-retention.js +1 -0
  166. package/dist/src/runner-cache-trim.js +1 -0
  167. package/dist/src/runner-client.js +1 -1
  168. package/dist/src/runner-dev-tools-security.js +1 -1
  169. package/dist/src/runner-device-readiness.js +1 -1
  170. package/dist/src/runner-device-set.js +1 -0
  171. package/dist/src/runner-disposal.js +1 -1
  172. package/dist/src/runner-error-classification.js +1 -1
  173. package/dist/src/runner-exchange.js +1 -1
  174. package/dist/src/runner-lease.js +1 -0
  175. package/dist/src/runner-operations-facade.js +1 -1
  176. package/dist/src/runner-session-types.js +1 -1
  177. package/dist/src/runner-start-budget.js +1 -1
  178. package/dist/src/runner-toolchain-probe.js +2 -0
  179. package/dist/src/runner.js +1 -1
  180. package/dist/src/runtime-deployment.js +1 -0
  181. package/dist/src/runtime.js +1 -1
  182. package/dist/src/runtime10.js +1 -2
  183. package/dist/src/runtime11.js +2 -0
  184. package/dist/src/runtime2.js +2 -5
  185. package/dist/src/runtime3.js +5 -1
  186. package/dist/src/runtime4.js +1 -5
  187. package/dist/src/runtime5.js +5 -1
  188. package/dist/src/runtime6.js +1 -1
  189. package/dist/src/runtime7.js +1 -1
  190. package/dist/src/runtime8.js +1 -1
  191. package/dist/src/runtime9.js +1 -1
  192. package/dist/src/screen-recording-transport.js +1 -1
  193. package/dist/src/screenshot-density.js +1 -1
  194. package/dist/src/screenshot3.js +2 -2
  195. package/dist/src/script.js +1 -1
  196. package/dist/src/scroll-gesture.js +1 -1
  197. package/dist/src/sdk-batch.js +2 -2
  198. package/dist/src/sdk-contracts.d.ts +20 -29
  199. package/dist/src/sdk-contracts.js +2 -2
  200. package/dist/src/sdk-device.js +1 -1
  201. package/dist/src/sdk-finders.d.ts +1 -1
  202. package/dist/src/sdk-finders.js +1 -1
  203. package/dist/src/sdk-remote-config.d.ts +4 -0
  204. package/dist/src/sdk-remote-config.js +1 -1
  205. package/dist/src/sdk-selectors.d.ts +1 -1
  206. package/dist/src/sdk-selectors.js +1 -1
  207. package/dist/src/selection.js +0 -0
  208. package/dist/src/selector-pipeline-policy.js +1 -1
  209. package/dist/src/selector-runtime.js +1 -1
  210. package/dist/src/selectors.js +1 -1
  211. package/dist/src/server.js +2 -2
  212. package/dist/src/session-snapshot.js +1 -1
  213. package/dist/src/session2.js +5 -5
  214. package/dist/src/simctl.js +1 -1
  215. package/dist/src/simulator-boot.js +1 -1
  216. package/dist/src/simulator-state.js +1 -1
  217. package/dist/src/simulator.js +1 -1
  218. package/dist/src/snapshot-capture-annotations.js +1 -1
  219. package/dist/src/snapshot-desktop-projection.js +1 -1
  220. package/dist/src/snapshot-private-evidence.js +1 -0
  221. package/dist/src/snapshot-runtime-binding.js +1 -1
  222. package/dist/src/snapshot-runtime.js +1 -1
  223. package/dist/src/snapshot-state.js +1 -1
  224. package/dist/src/snapshot4.js +1 -1
  225. package/dist/src/src2.js +1 -1
  226. package/dist/src/src3.js +1 -1
  227. package/dist/src/src4.js +1 -1
  228. package/dist/src/src5.js +1 -1
  229. package/dist/src/src6.js +1 -1
  230. package/dist/src/src7.js +1 -1
  231. package/dist/src/src8.js +20 -20
  232. package/dist/src/store.js +1 -1
  233. package/dist/src/target-evidence.js +1 -1
  234. package/dist/src/text-entry-focus.js +1 -1
  235. package/dist/src/tool-provider2.js +1 -1
  236. package/dist/src/touch-runtime2.js +1 -1
  237. package/dist/src/tree.js +1 -1
  238. package/dist/src/type-text-runtime.js +1 -1
  239. package/dist/src/video.js +1 -1
  240. package/package.json +15 -10
  241. package/server.json +2 -2
  242. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.23.apk.sha256 +0 -1
  243. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.23.apk.sha256 +0 -1
  244. package/dist/src/capabilities.js +0 -1
  245. package/dist/src/compatibility-policy.js +0 -1
  246. package/dist/src/daemon-artifacts.js +0 -1
  247. package/dist/src/device-claim-rule.js +0 -1
  248. package/dist/src/human-control-contract.js +0 -1
  249. package/dist/src/prepare-kind.js +0 -1
  250. package/dist/src/provider-device-runtimes.js +0 -1
  251. package/dist/src/screen-recording-admission-ledger.js +0 -1
  252. package/dist/src/screenshot-runtime.js +0 -1
  253. package/dist/src/session-routing.js +0 -1
  254. package/dist/src/session-runtime-admission.js +0 -1
  255. package/dist/src/timeouts.js +0 -1
  256. package/dist/src/touch-reference-frame.js +0 -1
  257. package/dist/src/vars.js +0 -2
  258. package/dist/src/viewport.js +0 -1
package/dist/src/exec.js CHANGED
@@ -1 +1 @@
1
- import{I as e,P as t}from"./sdk-contracts.js";import{a as n,r,s as i}from"./diagnostics.js";import{o as a}from"./sdk-remote-config.js";import{AsyncLocalStorage as o}from"node:async_hooks";import{constants as s}from"node:fs";import c from"node:path";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 o;async function v(e,t){return e?await _.run(e,t):await t()}async function y(e){return await _.run(void 0,e)}const b=new o;async function ee(e,t){return e?await b.run(e,t):await t()}function x(){let e=b.getStore();return e&&Object.hasOwn(e,`DEVELOPER_DIR`)?e.DEVELOPER_DIR||void 0:process.env.DEVELOPER_DIR||void 0}function S(e){let t=b.getStore();return t?{...e??process.env,...t}:e}async function te(e,t,n={}){let r=_.getStore()?.(e,t,n);return r?w(await r):await T(e,t,n)}async function C(e,t,n={}){let r=_.getStore()?.(e,t,n);return r?w(await r):await T(e,t,n)}function w(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 T(e,t,n={}){let r=M(e),i=k();return new Promise((a,o)=>{let s=d(r,t,{cwd:n.cwd,env:S(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(se(r,e,t,p,s,c,u));return}let d=H(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`),fe(s,n.stdin).catch(i=>{b.didAbort||f||pe(i)||(_(oe(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=>{_(V(b,r,e,t,n))}),s.once(`exit`,y.recordExit),s.once(`close`,v)})}async function ne(e){let t=W(e);if(!t)return!1;if(c.isAbsolute(t))return G(t);let n=process.env.PATH;if(!n)return!1;let r=ue();for(let e of n.split(c.delimiter)){let n=e.trim();if(n){for(let e of de(t,r))if(await G(c.join(n,e)))return!0}}return!1}async function re(e,n){let r=U(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 ie(e,n){let r=U(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 ae(e,n,r={}){let i=M(e),a=f(i,n,{cwd:r.cwd,env:S(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`?P(i,e,a.error):F(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 E(e,t,n={}){return D(e,t,n).pid}function D(e,t,n={}){let r=M(e),i=d(r,t,{cwd:n.cwd,env:S(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 O(e,t,n={}){let r=M(e),i=k(),a=d(r,t,{cwd:n.cwd,env:S(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=H(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(V(m,r,e,t,n))}),a.once(`exit`,p.recordExit),a.once(`close`,f)})}}function k(){let e=n(),t=e.debug===!0,r=a(process.env.AGENT_DEVICE_EXEC_TRACE??``)===!0;if(!t&&!r)return A();r&&e.flushOnSuccess!==!0&&i({flushOnSuccess:!0});let o=Date.now(),s=!1;return{emitForegroundCompletion:(e,t)=>{s||(s=!0,j({cmd:e,args:t,startedAtMs:o}))},emitBackgroundSpawn:(e,t)=>{j({cmd:e,args:t,data:{event:`spawn`}})},emitBackgroundCompletion:(e,t,n)=>{s||(s=!0,j({cmd:e,args:t,startedAtMs:o,data:{event:n}}))}}}function A(){return{emitForegroundCompletion:()=>{},emitBackgroundSpawn:()=>{},emitBackgroundCompletion:()=>{}}}function j(e){let t=e.args.slice(0,6);r({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 M(e){let n=W(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 N(e,t,n,r){return r.code===`ENOENT`?P(e,t,r):F(e,t,n,r)}function P(e,n,r){return new t(`TOOL_MISSING`,`${e} not found in PATH`,{cmd:n},r)}function F(e,n,r,i){return new t(`COMMAND_FAILED`,`Failed to run ${e}`,{cmd:n,args:r},i)}function oe(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 se(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 ce(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}`,B({stdout:a,stderr:o,exitCode:i},{cmd:n,args:r}))}const R=/xcrun: error: unable to find utility "([^"]+)"/;function le(e){let t=R.exec(e)?.[1];if(!t)return{};let n=x(),r=n?`DEVELOPER_DIR ${n}`:`the developer dir selected by xcode-select (see xcode-select -p)`;return{reason:`xcrun-tool-not-found`,developerDir:n??null,hint:`xcrun could not find ${t} in ${r}. Export DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer (or your Xcode's path) before running agent-device, or run sudo xcode-select -s /Applications/Xcode.app.`}}function z(e,n,r){if(e.exitCode===0)return e;throw new t(`COMMAND_FAILED`,n,B(e,typeof r==`function`?r(e):r))}function B(e,t){return{stdout:e.stdout,stderr:e.stderr,exitCode:e.exitCode,processExitError:!0,...t,...le(e.stderr)}}function V(e,t,n,r,i){return e.didAbort?I(t,n,r):N(t,n,r,i)}function H(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 U(e,n,r){let i=e?.trim();if(i){if(!c.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 W(e){let t=e.trim();return!t||t.includes(`\0`)?null:c.isAbsolute(t)?t:t.includes(`/`)||t.includes(`\\`)?null:h.test(t)?t:null}function ue(){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 de(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 fe(e,t){if(e.stdin){if(t===void 0){e.stdin?.end();return}await m(p.from([t]),e.stdin)}}function pe(e){return e instanceof Error&&`code`in e&&e.code===`EPIPE`}export{v as _,G as a,ie as c,E as d,D as f,ne as g,X as h,ce as i,te as l,ae as m,x as n,z as o,C as p,B as r,re as s,w as t,O as u,ee as v,y};
1
+ import{I as e,P as t}from"./sdk-contracts.js";import{a as n,r,s as i}from"./diagnostics.js";import{o as a}from"./sdk-remote-config.js";import{AsyncLocalStorage as o}from"node:async_hooks";import{constants as s}from"node:fs";import c from"node:path";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 o;async function v(e,t){return e?await _.run(e,t):await t()}async function y(e){return await _.run(void 0,e)}const b=new o;async function x(e,t){return e?await b.run(e,t):await t()}function S(){let e=b.getStore();return e&&Object.hasOwn(e,`DEVELOPER_DIR`)?e.DEVELOPER_DIR||void 0:process.env.DEVELOPER_DIR||void 0}function C(e){let t=b.getStore();return t?{...e??process.env,...t}:e}async function w(e,t,n={}){let r=_.getStore()?.(e,t,n);return r?E(await r):await D(e,t,n)}async function T(e,t,n={}){let r=_.getStore()?.(e,t,n);return r?E(await r):await D(e,t,n)}function E(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 D(e,t,n={}){let r=N(e),i=j();return new Promise((a,o)=>{let s=d(r,t,{cwd:n.cwd,env:C(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(ce(r,e,t,p,s,c,u));return}let d=H(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`),fe(s,n.stdin).catch(i=>{b.didAbort||f||pe(i)||(_(se(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=>{_(V(b,r,e,t,n))}),s.once(`exit`,y.recordExit),s.once(`close`,v)})}async function ee(e){let t=W(e);if(!t)return!1;if(c.isAbsolute(t))return G(t);let n=process.env.PATH;if(!n)return!1;let r=ue();for(let e of n.split(c.delimiter)){let n=e.trim();if(n){for(let e of de(t,r))if(await G(c.join(n,e)))return!0}}return!1}async function te(e,t){return await O(e,t,`executable`,G)}async function ne(e,t){return await O(e,t,`file`,K)}async function O(e,n,r,i){let a=U(e,n,r);if(a){if(!await i(a))throw new t(`TOOL_MISSING`,`${n} points to a missing or non-${r} ${r===`file`?`path`:`file`}: ${a}`,{envName:n,path:a});return a}}function k(e,n,r={}){let i=N(e),a=f(i,n,{cwd:r.cwd,env:C(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`?P(i,e,a.error):F(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 I(i,e,n,l,s,c);return{stdout:s,stderr:c,exitCode:l,stdoutBuffer:o}}function re(e,t,n={}){return A(e,t,n).pid}function A(e,t,n={}){let r=N(e),i=d(r,t,{cwd:n.cwd,env:C(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 ie(e,t,n={}){let r=N(e),i=j(),a=d(r,t,{cwd:n.cwd,env:C(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=H(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(V(m,r,e,t,n))}),a.once(`exit`,p.recordExit),a.once(`close`,f)})}}function j(){let e=n(),t=e.debug===!0,r=a(process.env.AGENT_DEVICE_EXEC_TRACE??``)===!0;if(!t&&!r)return ae();r&&e.flushOnSuccess!==!0&&i({flushOnSuccess:!0});let o=Date.now(),s=!1;return{emitForegroundCompletion:(e,t)=>{s||(s=!0,M({cmd:e,args:t,startedAtMs:o}))},emitBackgroundSpawn:(e,t)=>{M({cmd:e,args:t,data:{event:`spawn`}})},emitBackgroundCompletion:(e,t,n)=>{s||(s=!0,M({cmd:e,args:t,startedAtMs:o,data:{event:n}}))}}}function ae(){return{emitForegroundCompletion:()=>{},emitBackgroundSpawn:()=>{},emitBackgroundCompletion:()=>{}}}function M(e){let t=e.args.slice(0,6);r({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 N(e){let n=W(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 oe(e,t,n,r){return r.code===`ENOENT`?P(e,t,r):F(e,t,n,r)}function P(e,n,r){return new t(`TOOL_MISSING`,`${e} not found in PATH`,{cmd:n},r)}function F(e,n,r,i){return new t(`COMMAND_FAILED`,`Failed to run ${e}`,{cmd:n,args:r},i)}function se(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 ce(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 le(e){return e instanceof t&&e.code===`COMMAND_FAILED`&&typeof e.details?.timeoutMs==`number`}function I(e,n,r,i,a,o){return new t(`COMMAND_FAILED`,`${e} exited with code ${i}`,B({stdout:a,stderr:o,exitCode:i},{cmd:n,args:r}))}const L=/xcrun: error: unable to find utility "([^"]+)"/;function R(e){let t=L.exec(e)?.[1];if(!t)return{};let n=S(),r=n?`DEVELOPER_DIR ${n}`:`the developer dir selected by xcode-select (see xcode-select -p)`;return{reason:`xcrun-tool-not-found`,developerDir:n??null,hint:`xcrun could not find ${t} in ${r}. Export DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer (or your Xcode's path) before running agent-device, or run sudo xcode-select -s /Applications/Xcode.app.`}}function z(e,n,r){if(e.exitCode===0)return e;throw new t(`COMMAND_FAILED`,n,B(e,typeof r==`function`?r(e):r))}function B(e,t){return{stdout:e.stdout,stderr:e.stderr,exitCode:e.exitCode,processExitError:!0,...t,...R(e.stderr)}}function V(t,n,r,i,a){return t.didAbort?e({cmd:r,args:i,executable:n}):oe(n,r,i,a)}function H(t,n,r,i,a,o,s,c){return t.didAbort?e({cmd:r,args:i,executable:n}):a!==0&&!o?I(n,r,i,a,s,c):null}function U(e,n,r){let i=e?.trim();if(i){if(!c.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 W(e){let t=e.trim();return!t||t.includes(`\0`)?null:c.isAbsolute(t)?t:t.includes(`/`)||t.includes(`\\`)?null:h.test(t)?t:null}function ue(){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 de(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 fe(e,t){if(e.stdin){if(t===void 0){e.stdin?.end();return}await m(p.from([t]),e.stdin)}}function pe(e){return e instanceof Error&&`code`in e&&e.code===`EPIPE`}export{v as _,G as a,ne as c,re as d,A as f,ee as g,X as h,le as i,w as l,k as m,S as n,z as o,T as p,B as r,te as s,E as t,ie as u,x as v,y};
package/dist/src/file.js CHANGED
@@ -1 +1 @@
1
- import{J as e,P as t}from"./sdk-contracts.js";import{r as n}from"./diagnostics.js";import{a as r,j as i,r as a,t as o}from"./owner-identity.js";import{t as s}from"./timeouts.js";import c from"node:crypto";import l from"node:fs";import u from"node:path";const d=`owner.json`,f=`.lock`;async function p(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 m=new Set,h=c.randomUUID();function g(e){let t;try{t=l.lstatSync(e)}catch(t){return I(t)===`ENOENT`?{state:l.existsSync(M(e))?`publishing`:`absent`}:{state:`unproven`,reason:`owner-unreadable`}}if(!t.isDirectory())return{state:`unproven`,reason:`non-directory`};let n=L(u.join(e,d));if(n.kind===`unreadable`)return{state:`unproven`,reason:`owner-unreadable`};if(n.kind===`unwritten`)return l.existsSync(M(e))?{state:`publishing`}:{state:`unproven`,reason:`owner-unwritten`};let{pid:r,startTime:i,acquiredAtMs:a}=n.owner;return{state:`held`,owner:{pid:r,startTime:i,acquiredAtMs:a},liveness:o({owner:n.owner})}}function _(e){let{lockDirPath:t}=e;l.mkdirSync(u.dirname(t),{recursive:!0});let n=x(u.join(t,d));if(n.kind===`live`)return{status:`busy`,inspection:n.inspection};if(!N(t))return{status:`busy`,inspection:g(t)};let r=v(t,()=>y(e,n),e=>{e.status===`acquired`&&m.delete(e.claimToken)});return r.status===`acquired`?{status:`acquired`,acquisition:r.acquisition}:{status:r.status,inspection:r.inspection??g(t)}}function v(t,r,i){let a;try{a=r()}catch(r){try{F(t)}catch(r){n({level:`warn`,phase:`process_lock_guard_release_failed`,data:{lockDirPath:t,error:e(r)}})}throw r}try{F(t)}catch(e){throw i(a),e}return a}function y(e,t){let{lockDirPath:n}=e,r=u.join(n,d),i=S(n,r);if(i.kind===`unproven`)return{status:`unproven`,inspection:i.inspection};if(i.kind===`owner`){if(t.kind!==`reclaimable`||!C(i.owner,t.owner))return{status:`busy`};if(k(n,r,i.owner)!==`removed`)return{status:`unproven`}}return b(e,r)}function b(e,t){let{lockDirPath:n,owner:r}=e;try{l.mkdirSync(n)}catch(e){if(I(e)!==`EEXIST`)throw e;return{status:`unproven`}}let i=c.randomUUID(),a={...r,claimToken:i,claimIssuerId:h};try{O(t,a)}catch(e){try{l.rmdirSync(n)}catch{}throw e}return m.add(i),{status:`acquired`,claimToken:i,acquisition:E(e,a)}}function x(e){let t=L(e);if(t.kind!==`owner`)return{kind:`none`};let n=o({owner:t.owner});if(V(n)&&!H(t.owner)){let{pid:e,startTime:r,acquiredAtMs:i}=t.owner;return{kind:`live`,inspection:{state:`held`,owner:{pid:e,startTime:r,acquiredAtMs:i},liveness:n}}}return{kind:`reclaimable`,owner:t.owner}}function S(e,t){let n;try{n=l.lstatSync(e)}catch(e){return I(e)===`ENOENT`?{kind:`absent`}:{kind:`unproven`,inspection:{state:`unproven`,reason:`owner-unreadable`}}}if(!n.isDirectory())return{kind:`unproven`,inspection:{state:`unproven`,reason:`non-directory`}};let r=L(t);return r.kind===`owner`?{kind:`owner`,owner:r.owner}:{kind:`unproven`,inspection:{state:`unproven`,reason:r.kind===`unwritten`?`owner-unwritten`:`owner-unreadable`}}}function C(e,t){return e.pid===t.pid&&e.startTime===t.startTime&&e.acquiredAtMs===t.acquiredAtMs&&e.claimToken===t.claimToken&&e.claimIssuerId===t.claimIssuerId}async function w(e){return(await T(e)).release}async function T(e){let n=Date.now()+(e.timeoutMs??3e4),r=e.pollMs??100;do{let t=_(e);if(t.status===`acquired`)return t.acquisition;let i=n-Date.now();if(i<=0)break;await s(Math.min(r,i))}while(Date.now()<n);let i=L(u.join(e.lockDirPath,d));throw new t(`COMMAND_FAILED`,`Timed out waiting for ${e.description??`process lock`}`,{lockDirPath:e.lockDirPath,reason:`process_lock_timeout`,...B(e.lockDirPath,i),inspection:g(e.lockDirPath),hint:D(e.lockDirPath)})}function E(e,r){let{lockDirPath:i}=e,a=u.join(i,d),o=!0,s=!1;return Object.freeze({assertHeld(){if(!o||A(i,r)!==`owned`)throw new t(`COMMAND_FAILED`,`Process lock acquisition is no longer held`,{lockDirPath:i,ownerOwnershipLost:!0})},async release(){if(s)return;o=!1,m.delete(r.claimToken);let c=A(i,r);if(c===`absent`||c===`not-owner`){s=!0;return}let l=`unverified`;if(await P(i))try{l=k(i,a,r)}finally{F(i)}if(l!==`unverified`){s=!0;return}throw n({level:`warn`,phase:`process_lock_release_unverified`,data:{lockDirPath:i,description:e.description,ownerReleaseUnverified:!0}}),new t(`COMMAND_FAILED`,`Cannot verify ownership of ${e.description??`process lock`}`,{lockDirPath:i,ownerReleaseUnverified:!0,hint:D(i)})}})}function D(e){return`Restore process inspection or stop the verified owner, then retry. Remove ${e} and ${M(e)} only after confirming all users of this state directory have stopped.`}function O(e,t){i({destination:e,contents:JSON.stringify(t)})}function k(e,t,n){let r=A(e,n);return r===`owned`?j(e,t,n):r===`absent`?`removed`:r}function A(e,t){let n=L(u.join(e,d));return n.kind===`unreadable`?`unverified`:n.kind===`unwritten`?l.existsSync(e)?`unverified`:`absent`:r(n.owner,t)&&n.owner.claimToken===t.claimToken?`owned`:`not-owner`}function j(e,t,n){try{if(l.readdirSync(e).some(e=>e!==d))return`unverified`}catch(e){return I(e)===`ENOENT`?`removed`:`unverified`}try{l.unlinkSync(t)}catch(e){if(I(e)!==`ENOENT`)return`unverified`}try{return l.rmdirSync(e),`removed`}catch(e){if(I(e)===`ENOENT`)return`removed`;try{i({destination:t,contents:JSON.stringify(n),publish:`link-exclusive`})}catch{}return`unverified`}}function M(e){return`${e.endsWith(f)?e.slice(0,-5):e}.reclaim${f}`}function N(e){let t;try{t=l.openSync(M(e),`wx`,384)}catch(e){if(I(e)!==`EEXIST`)throw e;return!1}return l.closeSync(t),!0}async function P(e){let t=Date.now()+5e3;for(;!N(e);){if(Date.now()>=t)return!1;await s(5)}return!0}function F(e){try{l.unlinkSync(M(e))}catch(n){throw new t(`COMMAND_FAILED`,`Process lock mutation guard release could not be confirmed.`,{reason:`process_lock_guard_release_failed`,lockDirPath:e,hint:D(e)},n)}}function I(e){return e?.code}function L(e){let t;try{t=l.readFileSync(e,`utf8`)}catch(e){return e?.code===`ENOENT`?{kind:`unwritten`}:{kind:`unreadable`}}let n=R(t);return n?{kind:`owner`,owner:n}:{kind:`unreadable`}}function R(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(z))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 z={pid:a,acquiredAtMs:e=>typeof e==`number`&&Number.isFinite(e),startTime:e=>e==null||typeof e==`string`};function B(e,t){let n=Date.now(),r;try{r=Math.max(0,Math.round(n-l.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:o({owner:t.owner})}:t.kind===`unreadable`?{ownerRecordUnreadable:!0}:{}}}function V(e){return e!==`owner-process-dead`&&e!==`owner-process-reused`}function H(e){return e.pid!==process.pid||e.claimToken===null||e.claimIssuerId!==h?!1:!m.has(e.claimToken)}export{p as a,_ as i,T as n,g as r,w as t};
1
+ import{J as e,P as t}from"./sdk-contracts.js";import{r as n}from"./diagnostics.js";import{a as r,j as i,r as a,t as o}from"./owner-identity.js";import{i as s}from"./retry.js";import c from"node:crypto";import l from"node:fs";import u from"node:path";const d=`owner.json`,f=`.lock`;async function p(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 m=new Set,h=c.randomUUID();function g(e){let t;try{t=l.lstatSync(e)}catch(t){return I(t)===`ENOENT`?{state:l.existsSync(M(e))?`publishing`:`absent`}:{state:`unproven`,reason:`owner-unreadable`}}if(!t.isDirectory())return{state:`unproven`,reason:`non-directory`};let n=L(u.join(e,d));if(n.kind===`unreadable`)return{state:`unproven`,reason:`owner-unreadable`};if(n.kind===`unwritten`)return l.existsSync(M(e))?{state:`publishing`}:{state:`unproven`,reason:`owner-unwritten`};let{pid:r,startTime:i,acquiredAtMs:a}=n.owner;return{state:`held`,owner:{pid:r,startTime:i,acquiredAtMs:a},liveness:o({owner:n.owner})}}function _(e){let{lockDirPath:t}=e;l.mkdirSync(u.dirname(t),{recursive:!0});let n=x(u.join(t,d));if(n.kind===`live`)return{status:`busy`,inspection:n.inspection};if(!N(t))return{status:`busy`,inspection:g(t)};let r=v(t,()=>y(e,n),e=>{e.status===`acquired`&&m.delete(e.claimToken)});return r.status===`acquired`?{status:`acquired`,acquisition:r.acquisition}:{status:r.status,inspection:r.inspection??g(t)}}function v(t,r,i){let a;try{a=r()}catch(r){try{F(t)}catch(r){n({level:`warn`,phase:`process_lock_guard_release_failed`,data:{lockDirPath:t,error:e(r)}})}throw r}try{F(t)}catch(e){throw i(a),e}return a}function y(e,t){let{lockDirPath:n}=e,r=u.join(n,d),i=S(n,r);if(i.kind===`unproven`)return{status:`unproven`,inspection:i.inspection};if(i.kind===`owner`){if(t.kind!==`reclaimable`||!C(i.owner,t.owner))return{status:`busy`};if(k(n,r,i.owner)!==`removed`)return{status:`unproven`}}return b(e,r)}function b(e,t){let{lockDirPath:n,owner:r}=e;try{l.mkdirSync(n)}catch(e){if(I(e)!==`EEXIST`)throw e;return{status:`unproven`}}let i=c.randomUUID(),a={...r,claimToken:i,claimIssuerId:h};try{O(t,a)}catch(e){try{l.rmdirSync(n)}catch{}throw e}return m.add(i),{status:`acquired`,claimToken:i,acquisition:E(e,a)}}function x(e){let t=L(e);if(t.kind!==`owner`)return{kind:`none`};let n=o({owner:t.owner});if(V(n)&&!H(t.owner)){let{pid:e,startTime:r,acquiredAtMs:i}=t.owner;return{kind:`live`,inspection:{state:`held`,owner:{pid:e,startTime:r,acquiredAtMs:i},liveness:n}}}return{kind:`reclaimable`,owner:t.owner}}function S(e,t){let n;try{n=l.lstatSync(e)}catch(e){return I(e)===`ENOENT`?{kind:`absent`}:{kind:`unproven`,inspection:{state:`unproven`,reason:`owner-unreadable`}}}if(!n.isDirectory())return{kind:`unproven`,inspection:{state:`unproven`,reason:`non-directory`}};let r=L(t);return r.kind===`owner`?{kind:`owner`,owner:r.owner}:{kind:`unproven`,inspection:{state:`unproven`,reason:r.kind===`unwritten`?`owner-unwritten`:`owner-unreadable`}}}function C(e,t){return e.pid===t.pid&&e.startTime===t.startTime&&e.acquiredAtMs===t.acquiredAtMs&&e.claimToken===t.claimToken&&e.claimIssuerId===t.claimIssuerId}async function w(e){return(await T(e)).release}async function T(e){let n=Date.now()+(e.timeoutMs??3e4),r=e.pollMs??100;do{let t=_(e);if(t.status===`acquired`)return t.acquisition;let i=n-Date.now();if(i<=0)break;await s(Math.min(r,i))}while(Date.now()<n);let i=L(u.join(e.lockDirPath,d));throw new t(`COMMAND_FAILED`,`Timed out waiting for ${e.description??`process lock`}`,{lockDirPath:e.lockDirPath,reason:`process_lock_timeout`,...B(e.lockDirPath,i),inspection:g(e.lockDirPath),hint:D(e.lockDirPath)})}function E(e,r){let{lockDirPath:i}=e,a=u.join(i,d),o=!0,s=!1;return Object.freeze({assertHeld(){if(!o||A(i,r)!==`owned`)throw new t(`COMMAND_FAILED`,`Process lock acquisition is no longer held`,{lockDirPath:i,ownerOwnershipLost:!0})},async release(){if(s)return;o=!1,m.delete(r.claimToken);let c=A(i,r);if(c===`absent`||c===`not-owner`){s=!0;return}let l=`unverified`;if(await P(i))try{l=k(i,a,r)}finally{F(i)}if(l!==`unverified`){s=!0;return}throw n({level:`warn`,phase:`process_lock_release_unverified`,data:{lockDirPath:i,description:e.description,ownerReleaseUnverified:!0}}),new t(`COMMAND_FAILED`,`Cannot verify ownership of ${e.description??`process lock`}`,{lockDirPath:i,ownerReleaseUnverified:!0,hint:D(i)})}})}function D(e){return`Restore process inspection or stop the verified owner, then retry. Remove ${e} and ${M(e)} only after confirming all users of this state directory have stopped.`}function O(e,t){i({destination:e,contents:JSON.stringify(t)})}function k(e,t,n){let r=A(e,n);return r===`owned`?j(e,t,n):r===`absent`?`removed`:r}function A(e,t){let n=L(u.join(e,d));return n.kind===`unreadable`?`unverified`:n.kind===`unwritten`?l.existsSync(e)?`unverified`:`absent`:r(n.owner,t)&&n.owner.claimToken===t.claimToken?`owned`:`not-owner`}function j(e,t,n){try{if(l.readdirSync(e).some(e=>e!==d))return`unverified`}catch(e){return I(e)===`ENOENT`?`removed`:`unverified`}try{l.unlinkSync(t)}catch(e){if(I(e)!==`ENOENT`)return`unverified`}try{return l.rmdirSync(e),`removed`}catch(e){if(I(e)===`ENOENT`)return`removed`;try{i({destination:t,contents:JSON.stringify(n),publish:`link-exclusive`})}catch{}return`unverified`}}function M(e){return`${e.endsWith(f)?e.slice(0,-5):e}.reclaim${f}`}function N(e){let t;try{t=l.openSync(M(e),`wx`,384)}catch(e){if(I(e)!==`EEXIST`)throw e;return!1}return l.closeSync(t),!0}async function P(e){let t=Date.now()+5e3;for(;!N(e);){if(Date.now()>=t)return!1;await s(5)}return!0}function F(e){try{l.unlinkSync(M(e))}catch(n){throw new t(`COMMAND_FAILED`,`Process lock mutation guard release could not be confirmed.`,{reason:`process_lock_guard_release_failed`,lockDirPath:e,hint:D(e)},n)}}function I(e){return e?.code}function L(e){let t;try{t=l.readFileSync(e,`utf8`)}catch(e){return e?.code===`ENOENT`?{kind:`unwritten`}:{kind:`unreadable`}}let n=R(t);return n?{kind:`owner`,owner:n}:{kind:`unreadable`}}function R(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(z))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 z={pid:a,acquiredAtMs:e=>typeof e==`number`&&Number.isFinite(e),startTime:e=>e==null||typeof e==`string`};function B(e,t){let n=Date.now(),r;try{r=Math.max(0,Math.round(n-l.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:o({owner:t.owner})}:t.kind===`unreadable`?{ownerRecordUnreadable:!0}:{}}}function V(e){return e!==`owner-process-dead`&&e!==`owner-process-reused`}function H(e){return e.pid!==process.pid||e.claimToken===null||e.claimIssuerId!==h?!1:!m.has(e.claimToken)}export{p as a,_ as i,T as n,g as r,w as t};
package/dist/src/find.js CHANGED
@@ -1 +1 @@
1
- import{b as e,f as t,s as n}from"./sdk-contracts.js";import{Fn as r,Nn as i,Pn as a,Rn as o,Rt as s,_t as c}from"./sdk-batch.js";import{f as l}from"./dispatch-resolve.js";import{c as u}from"./target-evidence.js";import{f as d,m as f,p,u as m}from"./runtime.js";import{r as h,t as g}from"./success-text.js";import{m as _}from"./overlay.js";import{A as v,_ as y,b}from"./session-snapshot.js";import{t as x}from"./selector-pipeline-policy.js";import{s as S}from"./quality-warnings.js";import{r as C}from"./internal/daemon.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,p(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&&!f(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`&&!f(e.node,t)?2:0:0}function M(e){return e.rect?e.rect.width*e.rect.height:1/0}function N(e,t,r){let i={matches:e.length,candidates:e.slice(0,5).map(e=>_(e,0,!1))};return n(`AMBIGUOUS_MATCH`,`find matched ${e.length} elements for ${t} "${r}". Use a more specific locator or selector.`,{locator:t,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:t,locator:r,query:i,selectorExpression:o,flags:s,platform:c}=e,l=x.findAct,u=t.filter(e=>!f(e,t[0])),d=l.resolution,p;if(p=o?m(l,u,o,{platform:c}).list?.matchedNodes??[]:a(u,r,i,{requireRect:d.requireRect}).matches,p=O(p,t),p.length>1){P(d);let e=I(p,s);if(!e)return{ok:!1,response:N(p,r,i)};p=e}let h=p[0]??null;return h?{ok:!0,node:h}:{ok:!1,response:n(`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,req:n,logPath:r,locator:i,query:a,sessionStore:o,sessionName:s}=e,c=T({ref:e.ref,device:t,sessionStore:o,sessionName:s,req:n,logPath:r,capture:e.capture,captureProof:e.captureProof});return async()=>{let{snapshot:e}=await c.capture({flags:{...n.flags,snapshotInteractiveOnly:!0},recovery:{legacyIosSparse:{query:a,shouldScope:z(i)},sparseVerdictQueryScope:{query:a,shouldScope:z(i)}}});return e}}function R(e){return n(`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:a,sessionName:l,logPath:f,sessionStore:p,invoke:m}=e,h=p.lookup(l),g=a.command;if(g!==`find`)return null;let _=a.positionals??[],v=i(_,a.flags);if(!v.ok)return n(v.code,v.message);let{locator:y,query:b,action:C,value:T}=v.parsed;if(a.flags?.record&&!r(C))return n(`INVALID_ARGS`,`find ${C} is a mutating action and is always recorded; --record only applies to a read-only find (exists, wait, list, get text, get attrs).`);let D=await E({req:a,sessionName:l,logPath:f,sessionStore:p,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(D)return D;let O=h?p.requireCurrent(h):void 0;if(!O||!h)return t();let k=O.device,A=await w({command:`find`,device:k,session:O,plan:s({hasActiveApp:O.appBundleId!==void 0,intent:c(C)}),inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(!A.ok)return A.response;let j=o(y,b),M={},N=L({ref:h,device:k,req:a,logPath:f,locator:y,query:b,sessionStore:p,sessionName:l,capture:A.capture,captureProof:M}),P={sessionRef:h,req:a,sessionName:l,logPath:f,sessionStore:p,invoke:m,device:k,command:g,locator:y,query:b,publicFlags:X(a.flags),boundFocusPoint:A.focusPoint,boundTypeText:A.typeText},I=await N();if(S(I.snapshotQuality))return u({response:R(I.snapshotQuality),consumedTree:I,captureProof:M});let{nodes:z}=I,B=F({nodes:z,locator:y,query:b,selectorExpression:j,flags:a.flags,platform:k.platform});if(!B.ok)return u({response:B.response,consumedTree:I,captureProof:M});let H=B.node,U=await d(x.findAct,z,H),W=U.node,G=`@${W.ref}`,K={...a.flags??{},noRecord:!0},q=await V(P,{node:H,resolvedNode:W,ref:G,nodes:z,...I.iosSystemSurfaceBundleId?{iosSystemSurfaceBundleId:I.iosSystemSurfaceBundleId}:{},...I.keyboard?{keyboard:I.keyboard}:{},actionFlags:K,...U.kind===`occluded`?{occludedNode:U.node}:{}},C,T);return q&&u({response:q,consumedTree:I,captureProof:M})}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,sessionRef: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,_={ref:n.ref,locator:u,query:d};m&&(_.x=m.x,_.y=m.y);let v=g(p.data)??`Tapped ${n.ref}${m?` (${m.x}, ${m.y})`:``}`;return Object.assign(_,h(v)),l(a,o,r,c,{ref:n.ref,action:`click`,locator:u,query:d},{flags:f}),{ok:!0,data:_}}async function W(e,t,r){let{req:i,sessionName:a,sessionStore:o,sessionRef:s,invoke:c,command:u,publicFlags:d}=e;if(r===void 0)return n(`INVALID_ARGS`,`find fill requires text (use "" to clear the field)`);let f=await c({token:i.token,session:a,command:`fill`,positionals:[t.ref,r],flags:t.actionFlags,internal:{findResolvedTarget:H(t)}});return f.ok&&l(o,s,i,u,{ref:t.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,t,r){let{req:i,logPath:a}=e;if(!r)return n(`INVALID_ARGS`,`find type requires text`);let o=await q(e,t);if(!o.ok)return o;let s=e.sessionStore.requireCurrent(e.sessionRef);v(s);let c=e.boundTypeText;if(!c)return n(`COMMAND_FAILED`,`find type was admitted without a text-entry operation`);let l=await D({operations:{typeText:c}},[r],y(a,i.flags,s.appBundleId,s.trace?.outPath));return Y(e,t,`type`),{ok:!0,data:l??{ref:t.ref}}}async function q(t,r){let{req:i,logPath:a}=t,o=J(r,`be focused`);if(o)return o;let s=r.resolvedNode.rect?e(r.resolvedNode.rect):null;if(!s)return n(`COMMAND_FAILED`,`matched element has no bounds`);let c=t.sessionStore.requireCurrent(t.sessionRef);v(c);let l=t.boundFocusPoint;return l?{ok:!0,data:await C({operations:{focusPoint:l}},s,y(a,i.flags,c.appBundleId,c.trace?.outPath))??{ref:r.ref}}:n(`COMMAND_FAILED`,`find focus was admitted without a focus operation`)}function J(e,t){let r=e.occludedNode;return r?n(`COMMAND_FAILED`,`Matched element ${e.ref} is covered by another visible element and cannot ${t} 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,sessionRef:a,command:o,publicFlags:s}=e;l(i,a,r,o,{ref:t.ref,action:n},{flags:s})}function X(e){return{...b(e)??{}}}export{B as handleFindCommands};
1
+ import{b as e,f as t,s as n}from"./sdk-contracts.js";import{Fn as r,In as i,Pn as a,Rt as o,_t as s,zn as c}from"./sdk-batch.js";import{f as l}from"./dispatch-resolve.js";import{c as u}from"./target-evidence.js";import{f as d,m as f,p,u as m}from"./runtime.js";import{r as h,t as g}from"./success-text.js";import{m as _}from"./overlay.js";import{j as v,v as y,x as b}from"./session-snapshot.js";import{t as x}from"./selector-pipeline-policy.js";import{s as S}from"./quality-warnings.js";import{f as C}from"./internal/daemon.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,p(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&&!f(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`&&!f(e.node,t)?2:0:0}function M(e){return e.rect?e.rect.width*e.rect.height:1/0}function N(e,t,r){return n(`AMBIGUOUS_MATCH`,`find matched ${e.length} elements for ${t} "${r}". Use a more specific locator or selector.`,{locator:t,query:r,..._(e)})}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:t,locator:i,query:a,selectorExpression:o,flags:s,platform:c}=e,l=x.findAct,u=t.filter(e=>!f(e,t[0])),d=l.resolution,p;if(p=o?m(l,u,o,{platform:c}).list?.matchedNodes??[]:r(u,i,a,{requireRect:d.requireRect}).matches,p=O(p,t),p.length>1){P(d);let e=I(p,s);if(!e)return{ok:!1,response:N(p,i,a)};p=e}let h=p[0]??null;return h?{ok:!0,node:h}:{ok:!1,response:n(`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,req:n,logPath:r,locator:i,query:a,sessionStore:o,sessionName:s}=e,c=T({ref:e.ref,device:t,sessionStore:o,sessionName:s,req:n,logPath:r,capture:e.capture,captureProof:e.captureProof});return async()=>{let{snapshot:e}=await c.capture({flags:{...n.flags,snapshotInteractiveOnly:!0},recovery:{legacyIosSparse:{query:a,shouldScope:z(i)},sparseVerdictQueryScope:{query:a,shouldScope:z(i)}}});return e}}function R(e){return n(`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:r,sessionName:l,logPath:f,sessionStore:p,invoke:m}=e,h=p.lookup(l),g=r.command;if(g!==`find`)return null;let _=r.positionals??[],v=a(_,r.flags);if(!v.ok)return n(v.code,v.message);let{locator:y,query:b,action:C,value:T}=v.parsed;if(r.flags?.record&&!i(C))return n(`INVALID_ARGS`,`find ${C} is a mutating action and is always recorded; --record only applies to a read-only find (exists, wait, list, get text, get attrs).`);let D=await E({req:r,sessionName:l,logPath:f,sessionStore:p,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(D)return D;let O=h?p.requireCurrent(h):void 0;if(!O||!h)return t();let k=O.device,A=await w({command:`find`,device:k,session:O,plan:o({hasActiveApp:O.appBundleId!==void 0,intent:s(C)}),inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(!A.ok)return A.response;let j=c(y,b),M={},N=L({ref:h,device:k,req:r,logPath:f,locator:y,query:b,sessionStore:p,sessionName:l,capture:A.capture,captureProof:M}),P={sessionRef:h,req:r,sessionName:l,logPath:f,sessionStore:p,invoke:m,device:k,command:g,locator:y,query:b,publicFlags:X(r.flags),boundFocusPoint:A.focusPoint,boundTypeText:A.typeText},I=await N();if(S(I.snapshotQuality))return u({response:R(I.snapshotQuality),consumedTree:I,captureProof:M});let{nodes:z}=I,B=F({nodes:z,locator:y,query:b,selectorExpression:j,flags:r.flags,platform:k.platform});if(!B.ok)return u({response:B.response,consumedTree:I,captureProof:M});let H=B.node,U=await d(x.findAct,z,H),W=U.node,G=`@${W.ref}`,K={...r.flags??{},noRecord:!0},q=await V(P,{node:H,resolvedNode:W,ref:G,nodes:z,...I.iosSystemSurfaceBundleId?{iosSystemSurfaceBundleId:I.iosSystemSurfaceBundleId}:{},...I.keyboard?{keyboard:I.keyboard}:{},actionFlags:K,...U.kind===`occluded`?{occludedNode:U.node}:{}},C,T);return q&&u({response:q,consumedTree:I,captureProof:M})}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,sessionRef: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,_={ref:n.ref,locator:u,query:d};m&&(_.x=m.x,_.y=m.y);let v=g(p.data)??`Tapped ${n.ref}${m?` (${m.x}, ${m.y})`:``}`;return Object.assign(_,h(v)),l(a,o,r,c,{ref:n.ref,action:`click`,locator:u,query:d},{flags:f}),{ok:!0,data:_}}async function W(e,t,r){let{req:i,sessionName:a,sessionStore:o,sessionRef:s,invoke:c,command:u,publicFlags:d}=e;if(r===void 0)return n(`INVALID_ARGS`,`find fill requires text (use "" to clear the field)`);let f=await c({token:i.token,session:a,command:`fill`,positionals:[t.ref,r],flags:t.actionFlags,internal:{findResolvedTarget:H(t)}});return f.ok&&l(o,s,i,u,{ref:t.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,t,r){let{req:i,logPath:a}=e;if(!r)return n(`INVALID_ARGS`,`find type requires text`);let o=await q(e,t);if(!o.ok)return o;let s=e.sessionStore.requireCurrent(e.sessionRef);v(s);let c=e.boundTypeText;if(!c)return n(`COMMAND_FAILED`,`find type was admitted without a text-entry operation`);let l=await D({operations:{typeText:c}},[r],y(a,i.flags,s.appBundleId,s.trace?.outPath));return Y(e,t,`type`),{ok:!0,data:l??{ref:t.ref}}}async function q(t,r){let{req:i,logPath:a}=t,o=J(r,`be focused`);if(o)return o;let s=r.resolvedNode.rect?e(r.resolvedNode.rect):null;if(!s)return n(`COMMAND_FAILED`,`matched element has no bounds`);let c=t.sessionStore.requireCurrent(t.sessionRef);v(c);let l=t.boundFocusPoint;return l?{ok:!0,data:await C({operations:{focusPoint:l}},s,y(a,i.flags,c.appBundleId,c.trace?.outPath))??{ref:r.ref}}:n(`COMMAND_FAILED`,`find focus was admitted without a focus operation`)}function J(e,t){let r=e.occludedNode;return r?n(`COMMAND_FAILED`,`Matched element ${e.ref} is covered by another visible element and cannot ${t} 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,sessionRef:a,command:o,publicFlags:s}=e;l(i,a,r,o,{ref:t.ref,action:n},{flags:s})}function X(e){return{...b(e)??{}}}export{B as handleFindCommands};
@@ -1 +1 @@
1
- import{Ln as e}from"./sdk-batch.js";import{t}from"./sdk-finders.js";export{t as findBestMatchesByLocator,e as parseFindArgs};
1
+ import{Rn as e}from"./sdk-batch.js";import{t}from"./sdk-finders.js";export{t as findBestMatchesByLocator,e as parseFindArgs};
@@ -1 +1,2 @@
1
- import e from"node:path";function t(t){let n=e.extname(t).toLowerCase();return n===`.yaml`||n===`.yml`}function n(e,t){return`Maestro YAML requires explicit --maestro routing: ${e} ${t} --maestro`}function r(e,n){return n===`maestro`&&t(e)?`maestro`:`ad`}export{n,r,t};
1
+ import{P 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
+ `||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{O as e,d as t}from"./sdk-device.js";const n={ios:`iOS`,ipados:`iPadOS`,tvos:`tvOS`,watchos:`watchOS`,visionos:`visionOS`,macos:`macOS`},r=`Target-authored drag requires an adapter that preserves source hold, timed movement, and destination hold; it is supported on Android touch devices and iOS/iPadOS.`,i=`Android TV has no touch input — this gesture is supported on Android phones, tablets, and the iOS simulator only.`,a=`Two-finger gesture synthesis is iOS-simulator only — not available on physical iOS devices.`;function o(e,t){return(t===`multi-touch`?s(e):t===`directional-fling`&&e.platform===`linux`?`Linux`:void 0)??e.appleOs??e.platform}function s(r){if(r.platform===`android`)return r.target===`tv`?`Android TV`:void 0;if(!t(r.platform))return;let i=e(r);if(i===`ios`||i===`ipados`)return`physical iOS devices`;if(i===`macos`||i===`tvos`||i===`visionos`)return n[i]}function c(e,t,n){return`gesture ${n} is not supported on ${o(e,t)}`}export{c as a,r as i,n,a as r,i as t};
1
+ import{A as e,f as t}from"./sdk-device.js";const n={ios:`iOS`,ipados:`iPadOS`,tvos:`tvOS`,watchos:`watchOS`,visionos:`visionOS`,macos:`macOS`},r=`Target-authored drag requires an adapter that preserves source hold, timed movement, and destination hold; it is supported on Android touch devices and iOS/iPadOS.`,i=`Android TV has no touch input — this gesture is supported on Android phones, tablets, and the iOS simulator only.`,a=`Two-finger gesture synthesis is iOS-simulator only — not available on physical iOS devices.`;function o(e,t){return(t===`multi-touch`?s(e):t===`directional-fling`&&e.platform===`linux`?`Linux`:void 0)??e.appleOs??e.platform}function s(r){if(r.platform===`android`)return r.target===`tv`?`Android TV`:void 0;if(!t(r.platform))return;let i=e(r);if(i===`ios`||i===`ipados`)return`physical iOS devices`;if(i===`macos`||i===`tvos`||i===`visionos`)return n[i]}function c(e,t,n){return`gesture ${n} is not supported on ${o(e,t)}`}export{c as a,r as i,n,a as r,i as t};
@@ -1,7 +1,4 @@
1
- import { A as Rect, O as Point } from "./sdk-contracts.js";
2
- //#region packages/contracts/src/app-inventory.d.ts
3
- type AppsFilter = 'user-installed' | 'all';
4
- //#endregion
1
+ import { j as Rect, k as Point } from "./sdk-contracts.js";
5
2
  //#region packages/contracts/src/gesture-plan-types.d.ts
6
3
  type GesturePointerCount = 1 | 2;
7
4
  /** Selects one-pointer release timing without changing semantic gesture intent. */
@@ -35,4 +32,4 @@ type MultiTouchGesturePlan = {
35
32
  };
36
33
  type GesturePlan = SinglePointerGesturePlan | MultiTouchGesturePlan;
37
34
  //#endregion
38
- export { PointerTrajectorySample as a, PointerTrajectory as i, GesturePointerCount as n, SinglePointerGesturePlan as o, MultiTouchGesturePlan as r, AppsFilter as s, GesturePlan as t };
35
+ export { PointerTrajectorySample as a, PointerTrajectory as i, GesturePointerCount as n, SinglePointerGesturePlan as o, MultiTouchGesturePlan as r, GesturePlan as t };
@@ -1 +1 @@
1
- import{J as e,P as t}from"./sdk-contracts.js";import{Ft as n,bt as r}from"./sdk-batch.js";import{m as i}from"./session-snapshot.js";import{n as a,t as o}from"./runtime-admission.js";import{a as s}from"./gesture-admission.js";async function c(e){let t=await a({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),a=await o({command:`gesture`,device:r.device,required:i.use.required,inspectFacts:r.inspectFacts,bindDevice:r.bindDevice,unavailableResponse:n=>({ok:!1,error:e(new t(`UNSUPPORTED_OPERATION`,s(r.device,i.tier,r.input.intent),{gesture:r.input.intent,...n.hint===void 0?{}:{hint:n.hint}}))})});return a.type===`response`?{ok:!1,response:a.response}:{ok:!0,gestures:await u(a.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:i(t)}}function p(e){return{...e.appBundleId===void 0?{}:{options:{appBundleId:e.appBundleId}},execution:i(e)}}export{c as n,l as t};
1
+ import{J as e,P as t}from"./sdk-contracts.js";import{Ft as n,bt as r}from"./sdk-batch.js";import{h as i}from"./session-snapshot.js";import{n as a,t as o}from"./runtime-admission.js";import{a as s}from"./gesture-admission.js";async function c(e){let t=await a({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),a=await o({command:`gesture`,device:r.device,required:i.use.required,inspectFacts:r.inspectFacts,bindDevice:r.bindDevice,unavailableResponse:n=>({ok:!1,error:e(new t(`UNSUPPORTED_OPERATION`,s(r.device,i.tier,r.input.intent),{gesture:r.input.intent,...n.hint===void 0?{}:{hint:n.hint}}))})});return a.type===`response`?{ok:!1,response:a.response}:{ok:!0,gestures:await u(a.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:i(t)}}function p(e){return{...e.appBundleId===void 0?{}:{options:{appBundleId:e.appBundleId}},execution:i(e)}}export{c as n,l as t};
@@ -1 +1 @@
1
- import{P as e}from"./sdk-contracts.js";import{r as t}from"./request-cancel.js";import"./request.js";import{a as n}from"./human-control-contract.js";async function r(n){let{req:r,registry:s}=n,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),t(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(t){let r;try{r=JSON.parse(t)}catch(t){throw new e(`INVALID_ARGS`,`Human-control payload must be valid JSON.`,void 0,t)}return n(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{P as e}from"./sdk-contracts.js";import{r as t}from"./request-cancel.js";import"./request.js";import{ut as n}from"./internal/daemon.js";async function r(n){let{req:r,registry:s}=n,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),t(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(t){let r;try{r=JSON.parse(t)}catch(t){throw new e(`INVALID_ARGS`,`Human-control payload must be valid JSON.`,void 0,t)}return n(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 +1 @@
1
- import{K as e}from"./sdk-contracts.js";import{a as t,d as n,h as r,o as i}from"./adb-executor.js";import{S as a,l as o,m as s,n as c,o as l,u}from"./ime-state.js";async function d(o){let d=c(o);return d?await l(d.stateDir,o.id,async()=>{if(c(o)!==d)return{kind:`not-owned`};let l=t(o),{manifest:m}=await a(i(o));r({level:`warn`,phase:`android_test_ime_rebind`,data:{device:o.id}}),d.rebindUnconfirmed=!0;let h=`record-write`;try{if(!await s(l))return f(o.id,h);h=`command-failed`;for(let e of[`disable`,`enable`,`set`])if((await n(l,[`ime`,e,m.serviceComponent],{allowFailure:!0,timeoutMs:1e4})).exitCode!==0)return f(o.id,h);h=`read-failed`;let e=await u(l);return e===m.serviceComponent?(d.rebindUnconfirmed=!await p(l,o.id),{kind:`confirmed`}):f(o.id,e?`helper-not-selected`:`read-failed`)}catch(t){if(e(t))throw t}return f(o.id,h)}):{kind:`not-owned`}}function f(e,t){return r({level:`warn`,phase:`android_test_ime_rebind_failed`,data:{device:e,cause:t}}),{kind:`unconfirmed`,cause:t}}async function p(e,t){let n=await o(e);return n||r({level:`warn`,phase:`android_test_ime_rebind_record_clear_failed`,data:{device:t}}),n}export{d as rebindAndroidTestIme};
1
+ import{K as e}from"./sdk-contracts.js";import{a as t,d as n,h as r,o as i}from"./adb-executor.js";import{_ as a,i as o,l as s}from"./ime-state.js";import{c,i as l,r as u}from"./ime-settings-record.js";async function d(u){let d=o(u);return d?await s(d.stateDir,u.id,async()=>{if(o(u)!==d)return{kind:`not-owned`};let s=t(u),{manifest:m}=await a(i(u));r({level:`warn`,phase:`android_test_ime_rebind`,data:{device:u.id}}),d.rebindUnconfirmed=!0;let h=`record-write`;try{if(!await c(s))return f(u.id,h);h=`command-failed`;for(let e of[`disable`,`enable`,`set`])if((await n(s,[`ime`,e,m.serviceComponent],{allowFailure:!0,timeoutMs:1e4})).exitCode!==0)return f(u.id,h);h=`read-failed`;let e=await l(s);return e===m.serviceComponent?(d.rebindUnconfirmed=!await p(s,u.id),{kind:`confirmed`}):f(u.id,e?`helper-not-selected`:`read-failed`)}catch(t){if(e(t))throw t}return f(u.id,h)}):{kind:`not-owned`}}function f(e,t){return r({level:`warn`,phase:`android_test_ime_rebind_failed`,data:{device:e,cause:t}}),{kind:`unconfirmed`,cause:t}}async function p(e,t){let n=await u(e);return n||r({level:`warn`,phase:`android_test_ime_rebind_record_clear_failed`,data:{device:t}}),n}export{d as rebindAndroidTestIme};
@@ -0,0 +1 @@
1
+ import{J as e}from"./sdk-contracts.js";import{d as t,h as n}from"./adb-executor.js";const r=`agent_device_ime_helper_previous_ime`,i=`agent_device_ime_helper_rebind_displaced`,a=`secure`,o=`default_input_method`,s={previousIme:r,rebindDisplaced:i,defaultInputMethod:o};async function c(e){let n=await t(e,[`settings`,`get`,a,o],{allowFailure:!0,timeoutMs:5e3});return v(n.exitCode===0?n.stdout:``)}async function l(e){return await _(e,r)||void 0}async function u(e,n){return(await t(e,[`settings`,`put`,a,r,n],{allowFailure:!0,timeoutMs:5e3})).exitCode===0&&await l(e)===n}async function d(e){await t(e,[`settings`,`delete`,a,r],{allowFailure:!0,timeoutMs:5e3})}async function f(e){let t=await _(e,r),n=await _(e,i);if(t===void 0||n===void 0)return{kind:`unreadable`};let a=n===`1`;return t?{kind:`owned`,previousIme:t,rebindDisplaced:a}:{kind:`absent`,rebindDisplaced:a}}async function p(e){return(await t(e,[`settings`,`put`,a,i,`1`],{allowFailure:!0,timeoutMs:5e3})).exitCode===0&&await _(e,i)===`1`}async function m(e){return await t(e,[`settings`,`delete`,a,i],{allowFailure:!0,timeoutMs:5e3}),await _(e,i)===``}async function h(t,r,i){try{(r?await u(t,r):await g(t))||n({level:`warn`,phase:`android_test_ime_record_rollback_failed`,data:{device:i,hadPriorRecord:r!==void 0}})}catch(t){n({level:`warn`,phase:`android_test_ime_record_rollback_failed`,data:{device:i,hadPriorRecord:r!==void 0,error:e(t).message}})}}async function g(e){return await d(e),await l(e)===void 0}async function _(e,n){let r=await t(e,[`settings`,`get`,a,n],{allowFailure:!0,timeoutMs:5e3});return r.exitCode===0?v(r.stdout):void 0}function v(e){let t=e.trim();return!t||t===`null`?``:t}export{f as a,p as c,c as i,d as n,h as o,m as r,u as s,s as t};
@@ -1 +1 @@
1
- import{J as e,P as t}from"./sdk-contracts.js";import{d as n,g as r,h as i}from"./adb-executor.js";import{c as a,n as o}from"./adb-failure.js";import{t as s}from"./keyed-lock.js";function c(e,n,r){if(typeof e!=`number`||!Number.isInteger(e))throw new t(`INVALID_ARGS`,`Android ${r} manifest ${n} must be an integer.`);return e}function l(e,n,r,i){if(e!==r)throw new t(`INVALID_ARGS`,`Android ${i} manifest ${n} must be "${r}".`);return r}function u(e,n,r){if(typeof e!=`string`||e.length===0)throw new t(`INVALID_ARGS`,`Android ${r} manifest ${n} is required.`);return e}function d(e,n){let r=u(e,`sha256`,n).trim().toLowerCase();if(r.length!==64||!/^[0-9a-f]+$/.test(r))throw new t(`INVALID_ARGS`,`Android ${n} manifest sha256 must be a 64-character hex string.`);return r}const f=`com.callstack.agentdevice.imehelper`,p=`com.callstack.agentdevice.imehelper/.TestInputMethodService`,m=`android-ime-helper-v1`,h=p;async function g(e){return e.imeHelperArtifact??await _()}async function _(){return await r().resolveHelperArtifact({helperDirName:`ime-helper`,manifestFileName:e=>`agent-device-android-ime-helper-${e}.manifest.json`,parseManifest:y,unavailableMessage:`Android test IME text entry requires the bundled Android IME helper artifact, but it was not found or could not be read`})}const v=`IME helper`;function y(e){if(!e||typeof e!=`object`||Array.isArray(e))throw new t(`INVALID_ARGS`,`Android IME helper manifest must be an object.`);let n=e;return{name:l(n.name,`name`,`android-ime-helper`,v),version:u(n.version,`version`,v),assetName:u(n.assetName,`assetName`,v),sha256:d(n.sha256,v),packageName:l(n.packageName,`packageName`,f,v),versionCode:c(n.versionCode,`versionCode`,v),serviceComponent:l(n.serviceComponent,`serviceComponent`,p,v),broadcastProtocol:l(n.broadcastProtocol,`broadcastProtocol`,m,v)}}const b=new Set;async function x(e){return await r().ensureHelperInstalled({cache:b,installTimeoutMs:3e4,helperLabel:`Android IME helper`},e)}function S(){b.clear()}function C(e){return`${e.platform}:${e.id}`}function w(e){return e===f}async function T(e,t,n){await D(e,t,`com.callstack.agentdevice.imehelper.ACTION_INPUT_TEXT_B64`,{text:Buffer.from(n,`utf8`).toString(`base64`)})}async function E(e,t){await D(e,t,`com.callstack.agentdevice.imehelper.ACTION_CLEAR_TEXT`,{})}async function D(e,t,r,i){let s=[`am`,`broadcast`,`-p`,t,`-a`,r];s.push(`--es`,`protocol`,m);for(let[e,t]of Object.entries(i))s.push(`--es`,e,t);try{let i=await n(e,s,{allowFailure:!0,timeoutMs:1e4});if(i.exitCode!==0)throw o(`Android IME helper broadcast failed`,i,{action:r,packageName:t})}catch(e){throw a(e)}}const O=`agent_device_ime_helper_previous_ime`,k=`agent_device_ime_helper_rebind_displaced`,A=`secure`,j=`default_input_method`,M={previousIme:O,rebindDisplaced:k,defaultInputMethod:j};async function N(e){let t=await n(e,[`settings`,`get`,A,j],{allowFailure:!0,timeoutMs:5e3});return U(t.exitCode===0?t.stdout:``)}async function P(e){return await H(e,O)||void 0}async function F(e,t){return(await n(e,[`settings`,`put`,A,O,t],{allowFailure:!0,timeoutMs:5e3})).exitCode===0&&await P(e)===t}async function I(e){await n(e,[`settings`,`delete`,A,O],{allowFailure:!0,timeoutMs:5e3})}async function L(e){let t=await H(e,O),n=await H(e,k);if(t===void 0||n===void 0)return{kind:`unreadable`};let r=n===`1`;return t?{kind:`owned`,previousIme:t,rebindDisplaced:r}:{kind:`absent`,rebindDisplaced:r}}async function R(e){return(await n(e,[`settings`,`put`,A,k,`1`],{allowFailure:!0,timeoutMs:5e3})).exitCode===0&&await H(e,k)===`1`}async function z(e){return await n(e,[`settings`,`delete`,A,k],{allowFailure:!0,timeoutMs:5e3}),await H(e,k)===``}async function B(t,n,r){try{(n?await F(t,n):await V(t))||i({level:`warn`,phase:`android_test_ime_record_rollback_failed`,data:{device:r,hadPriorRecord:n!==void 0}})}catch(t){i({level:`warn`,phase:`android_test_ime_record_rollback_failed`,data:{device:r,hadPriorRecord:n!==void 0,error:e(t).message}})}}async function V(e){return await I(e),await P(e)===void 0}async function H(e,t){let r=await n(e,[`settings`,`get`,A,t],{allowFailure:!0,timeoutMs:5e3});return r.exitCode===0?U(r.stdout):void 0}function U(e){let t=e.trim();return!t||t===`null`?``:t}const W=new Map,G=new Map;function K(e){return W.has(C(e))}function q(e){return W.get(C(e))}function J(e,t,n){return s(G,`${e}:${t}`,n)}function Y(){W.clear()}function X(e,t,n=`/state`){let r=C(e);t?W.set(r,{stateDir:n,rebindUnconfirmed:!1}):W.delete(r)}export{T as C,g as S,l as T,x as _,X as a,S as b,I as c,L as d,B as f,E as g,h,Y as i,z as l,R as m,q as n,J as o,F as p,K as r,M as s,W as t,N as u,C as v,c as w,_ as x,w as y};
1
+ import{P as e}from"./sdk-contracts.js";import{i as t}from"./retry.js";import"./retry2.js";import{d as n,g as r}from"./adb-executor.js";import{c as i,n as a}from"./adb-failure.js";import{t as o}from"./keyed-lock.js";function s(t,n,r){if(typeof t!=`number`||!Number.isInteger(t))throw new e(`INVALID_ARGS`,`Android ${r} manifest ${n} must be an integer.`);return t}function c(t,n,r,i){if(t!==r)throw new e(`INVALID_ARGS`,`Android ${i} manifest ${n} must be "${r}".`);return r}function l(t,n,r){if(typeof t!=`string`||t.length===0)throw new e(`INVALID_ARGS`,`Android ${r} manifest ${n} is required.`);return t}function u(t,n){let r=l(t,`sha256`,n).trim().toLowerCase();if(r.length!==64||!/^[0-9a-f]+$/.test(r))throw new e(`INVALID_ARGS`,`Android ${n} manifest sha256 must be a 64-character hex string.`);return r}const d=`com.callstack.agentdevice.imehelper`,f=`com.callstack.agentdevice.imehelper/.TestInputMethodService`,p=`android-ime-helper-v1`,m=f;async function h(e){return e.imeHelperArtifact??await g()}async function g(){return await r().resolveHelperArtifact({helperDirName:`ime-helper`,manifestFileName:e=>`agent-device-android-ime-helper-${e}.manifest.json`,parseManifest:v,unavailableMessage:`Android test IME text entry requires the bundled Android IME helper artifact, but it was not found or could not be read`})}const _=`IME helper`;function v(t){if(!t||typeof t!=`object`||Array.isArray(t))throw new e(`INVALID_ARGS`,`Android IME helper manifest must be an object.`);let n=t;return{name:c(n.name,`name`,`android-ime-helper`,_),version:l(n.version,`version`,_),assetName:l(n.assetName,`assetName`,_),sha256:u(n.sha256,_),packageName:c(n.packageName,`packageName`,d,_),versionCode:s(n.versionCode,`versionCode`,_),serviceComponent:c(n.serviceComponent,`serviceComponent`,f,_),broadcastProtocol:c(n.broadcastProtocol,`broadcastProtocol`,p,_)}}const y=new Set;async function b(e){return await r().ensureHelperInstalled({cache:y,installTimeoutMs:3e4,helperLabel:`Android IME helper`},e)}function x(){y.clear()}function S(e){return`${e.platform}:${e.id}`}function C(e){return e===d}async function w(e,t,n){await E(e,t,`com.callstack.agentdevice.imehelper.ACTION_INPUT_TEXT_B64`,{text:Buffer.from(n,`utf8`).toString(`base64`)})}async function T(e,t){await E(e,t,`com.callstack.agentdevice.imehelper.ACTION_CLEAR_TEXT`,{})}async function E(e,t,r,o){let s=[`am`,`broadcast`,`-p`,t,`-a`,r];s.push(`--es`,`protocol`,p);for(let[e,t]of Object.entries(o))s.push(`--es`,e,t);try{let i=await n(e,s,{allowFailure:!0,timeoutMs:1e4});if(i.exitCode!==0)throw a(`Android IME helper broadcast failed`,i,{action:r,packageName:t})}catch(e){throw i(e)}}const D=new Map,O=new Map;function k(e){let t=O.get(e);t||(t=new Set,O.set(e,t));let n,r=new Promise(e=>{n=e});return t.add(r),()=>{t.delete(r),t.size===0&&O.get(e)===t&&O.delete(e),n()}}function A(e){let t=O.get(e);if(!(!t||t.size===0))return Promise.allSettled(t).then(()=>void 0)}async function j(e,t){if(!t){await e;return}await new Promise(n=>{let r=()=>{t.removeEventListener(`abort`,r),n()};t.addEventListener(`abort`,r,{once:!0}),e.then(r,r)})}function M(e,t){let n=D.get(e)?.atPerfMs??0;D.set(e,{atPerfMs:Math.max(n,performance.now()),confirmed:t})}async function N(e,t){if(t?.aborted)return`aborted`;for(;;){let n=await P(e,t);if(n!==`extended`)return n}}async function P(e,n){if(!await F(e,n))return`aborted`;let r=D.get(e);if(r===void 0)return`idle`;let i=r.atPerfMs+2500-performance.now();return i>0&&(await t(i,n),n?.aborted)?`aborted`:I(e,r)}async function F(e,t){let n=A(e);return!n||(await j(n,t),!t?.aborted)}function I(e,t){if(A(e))return`extended`;let n=D.get(e);return n===void 0||n===t?(D.delete(e),t.confirmed?`covered-confirmed`:`covered-issued`):`extended`}const L=new Map,R=new Map;function z(e){return L.has(S(e))}function B(e){return L.get(S(e))}function V(e,t,n){return o(R,`${e}:${t}`,n)}function H(){L.clear(),D.clear(),O.clear()}function U(e,t,n=`/state`){let r=S(e);t?L.set(r,{stateDir:n,rebindUnconfirmed:!1}):L.delete(r)}export{h as _,z as a,c as b,U as c,T as d,b as f,g,x as h,B as i,V as l,C as m,N as n,M as o,S as p,k as r,H as s,L as t,m as u,w as v,s as y};
@@ -1,7 +1,7 @@
1
- import { A as Rect, G as AppErrorDetails, H as centerOfRect, J as KnownAppErrorCode, O as Point, P as SnapshotNode, Q as normalizeAgentDeviceError, R as SnapshotState, U as AppError, W as AppErrorCode, Y as NormalizedError, Z as isAgentDeviceError, k as RawSnapshotNode, q as ErrorCause, y as AppleOS } from "./sdk-contracts.js";
2
- import { s as AppsFilter } from "./gesture-plan-types.js";
1
+ import { $ as normalizeAgentDeviceError, A as RawSnapshotNode, F as SnapshotNode, G as AppErrorCode, J as ErrorCause, K as AppErrorDetails, Q as isAgentDeviceError, U as centerOfRect, W as AppError, X as NormalizedError, Y as KnownAppErrorCode, j as Rect, k as Point, y as AppleOS, z as SnapshotState } from "./sdk-contracts.js";
2
+ import { t as AppsFilter } from "./app-inventory.js";
3
3
  import { $ as NetworkOptions, $t as AppTriggerEventOptions, A as WaitCommandOptions, At as ElementTarget, B as GetOptions, Bt as FindSnapshotCommandOptions, C as HomeCommandOptions, Cn as isRecord, Ct as RotateGestureOptions, D as ReactNativeCommandOptions, Dt as SwipeOptions, E as PrepareCommandOptions, Et as SwipeGestureOptions, F as SessionCloseResult, Ft as CaptureDiffOptions, G as CommandRequestResult, Gt as AppDeployResult, H as IsStatePredicateOptions, Ht as AppCloseOptions, I as SessionSaveScriptOptions, It as CaptureScreenshotOptions, J as ReplayRunOptions, Jt as AppInstallOptions, K as BatchRunOptions, Kt as AppInstallFromSourceOptions, L as SessionSaveScriptResult, Lt as CaptureScreenshotResult, M as AlertAction, Mt as PointTarget, N as PermissionTarget, Nt as RefTarget, O as TvRemoteCommandOptions, Ot as TransformGestureOptions, P as SettingsUpdateOptions, Pt as SelectorTarget, Q as LogsOptions, Qt as AppPushOptions, R as FindBaseOptions, Rt as CaptureSnapshotOptions, S as FoldCommandOptions, Sn as JsonValue, St as RepeatedPressOptions, T as OrientationCommandOptions, Tt as SettleCommandOptions, U as IsTextPredicateOptions, Ut as AppCloseResult, V as IsOptions, Vt as SelectorSnapshotCommandOptions, W as RecordControlOptions, Wt as AppDeployOptions, X as AudioOptions, Xt as AppOpenOptions, Y as ReplayTestOptions, Yt as AppListOptions, Z as EventsOptions, Zt as AppOpenResult, _ as AppStateCommandOptions, _n as AgentDeviceSelectionOptions, _t as LongPressOptions, a as WaitCommandResult, an as AgentDeviceCapabilitiesResult, at as HumanControlHoldOptions, b as ClipboardCommandOptions, bn as JsonObject, bt as PressOptions, c as DebugSymbolsOptions, cn as AgentDeviceSessionDevice, ct as LeaseAllocateOptions, d as PrepareCommandResult, dn as StartupPerfSample, dt as ClickOptions, en as DeviceSelectionMetadata, et as PerfOptions, f as ReplayCommandResult, fn as AgentDeviceClientConfig, ft as DragOptions, g as AlertCommandOptions, gn as AgentDeviceRequestOverrides, gt as HoverOptions, h as ActionButtonCommandOptions, hn as AgentDeviceIdentifiers, ht as FocusOptions, i as TraceCommandResult, in as MaterializationReleaseResult, it as HumanControlHold, j as WaitCommandTarget, jt as InteractionTarget, k as ViewportCommandOptions, kt as TypeTextOptions, l as DebugSymbolsResult, ln as DeviceBootOptions, lt as LeaseOptions, m as TriggerAppEventCommandResult, mn as AgentDeviceDaemonTransportContext, mt as FlingOptions, n as AgentDeviceCommandClient, nn as DeviceSelectionSource, nt as TraceOptions, o as DiffSnapshotCommandResult, on as AgentDeviceDevice, ot as HumanControlHoldScope, p as ReplaySuiteResult, pn as AgentDeviceDaemonTransport, pt as FillOptions, q as BatchStep, qt as AppInstallFromSourceResult, r as RecordingCommandResult, rn as MaterializationReleaseOptions, rt as CloudArtifactsOptions, s as DoctorCommandResult, sn as AgentDeviceSession, st as Lease, t as AgentDeviceClient, tn as DeviceSelectionReason, tt as RecordOptions, u as PushCommandResult, un as DeviceShutdownOptions, ut as LeaseScopedOptions, v as AppSwitcherCommandOptions, vn as DeviceCommandBaseOptions, vt as PanOptions, w as KeyboardCommandOptions, wt as ScrollOptions, x as DoctorCommandOptions, xn as JsonPrimitive, xt as ReadinessBudgetOptions, y as BackCommandOptions, yn as TargetShutdownResult, yt as PinchOptions, z as FindOptions, zt as CaptureSnapshotResult } from "./client-types.js";
4
- import { r as CloudProviderSessionResult, t as AgentArtifactsResult } from "./cloud-artifacts.js";
4
+ import { i as CloudProviderSessionResult, t as AgentArtifactsResult } from "./cloud-artifacts.js";
5
5
  import { c as MetroPrepareResult, l as MetroReloadOptions, p as MetroBridgeScope, s as MetroPrepareOptions, u as MetroReloadResult } from "./sdk-remote-config.js";
6
6
  import { t as BatchRunResult } from "./sdk-batch-runner.js";
7
7
  import { p as createLocalArtifactAdapter } from "./sdk-io.js";
@@ -1 +1 @@
1
- import{P 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{P as e}from"./sdk-contracts.js";import{d as t}from"./scroll-gesture.js";import{i as n}from"./retry.js";import"./retry2.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{B as e,P as t}from"./sdk-contracts.js";import{t as n}from"./scroll-gesture.js";import{l as r}from"./owner-identity.js";import{t as i}from"./timeouts.js";import"./process.js";import"./retry.js";import{t as a}from"./tool-provider2.js";function o(){let e=r();return e.WAYLAND_DISPLAY||e.XDG_SESSION_TYPE===`wayland`?`wayland`:`x11`}let s=null;async function c(){let e=a();if(s?.provider===e)return s;let n=o();if(n===`wayland`){if(await e.whichCommand(`ydotool`))return s={tool:`ydotool`,display:n,provider:e},s;throw new t(`TOOL_MISSING`,`ydotool is required for input synthesis on Wayland (xdotool does not work on Wayland). Install it via your package manager.`)}if(await e.whichCommand(`xdotool`))return s={tool:`xdotool`,display:n,provider:e},s;throw new t(`TOOL_MISSING`,`xdotool is required for input synthesis on X11. Install it via your package manager.`)}const l=1e4;async function u(...e){await a().runCommand(`xdotool`,e,{allowFailure:!1,timeoutMs:l})}async function d(...e){await a().runCommand(`ydotool`,e,{allowFailure:!1,timeoutMs:l})}function f(){return a().input}async function p(e,t){let{tool:n}=await c();if(n===`xdotool`){if(await m(e,t))return;await u(`mousemove`,`--sync`,String(e),String(t))}else await d(`mousemove`,`--absolute`,`-x`,String(e),`-y`,String(t))}async function m(e,t){try{let n=await a().runCommand(`xdotool`,[`getmouselocation`,`--shell`],{allowFailure:!0,timeoutMs:l}),r=new Map(n.stdout.split(`
1
+ import{B as e,P as t}from"./sdk-contracts.js";import{t as n}from"./scroll-gesture.js";import{l as r}from"./owner-identity.js";import{i}from"./retry.js";import"./process.js";import"./retry2.js";import{t as a}from"./tool-provider2.js";function o(){let e=r();return e.WAYLAND_DISPLAY||e.XDG_SESSION_TYPE===`wayland`?`wayland`:`x11`}let s=null;async function c(){let e=a();if(s?.provider===e)return s;let n=o();if(n===`wayland`){if(await e.whichCommand(`ydotool`))return s={tool:`ydotool`,display:n,provider:e},s;throw new t(`TOOL_MISSING`,`ydotool is required for input synthesis on Wayland (xdotool does not work on Wayland). Install it via your package manager.`)}if(await e.whichCommand(`xdotool`))return s={tool:`xdotool`,display:n,provider:e},s;throw new t(`TOOL_MISSING`,`xdotool is required for input synthesis on X11. Install it via your package manager.`)}const l=1e4;async function u(...e){await a().runCommand(`xdotool`,e,{allowFailure:!1,timeoutMs:l})}async function d(...e){await a().runCommand(`ydotool`,e,{allowFailure:!1,timeoutMs:l})}function f(){return a().input}async function p(e,t){let{tool:n}=await c();if(n===`xdotool`){if(await m(e,t))return;await u(`mousemove`,`--sync`,String(e),String(t))}else await d(`mousemove`,`--absolute`,`-x`,String(e),`-y`,String(t))}async function m(e,t){try{let n=await a().runCommand(`xdotool`,[`getmouselocation`,`--shell`],{allowFailure:!0,timeoutMs:l}),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 h(e,t){let n=f();if(n){await n.key(e,t);return}let{tool:r}=await c();r===`xdotool`?await u(`key`,`--clearmodifiers`,e):await d(`key`,...t)}async function g(e,t,n,r){await p(e,t);let{tool:i}=await c();i===`xdotool`?await u(`click`,n):await d(`click`,r)}async function _(e,t,n,r,i){let a=f();if(a){await a.click(e,t,n);return}await g(e,t,r,i)}async function v(e,t){await _(e,t,`primary`,`1`,`0xC0`)}async function y(e,t){await _(e,t,`secondary`,`3`,`0xC1`)}async function b(e,t){await _(e,t,`middle`,`2`,`0xC2`)}async function x(e,t){let n=f();if(n){await n.doubleClick(e,t);return}let{tool:r}=await c();await p(e,t),r===`xdotool`?await u(`click`,`--repeat`,`2`,`1`):(await d(`click`,`0xC0`),await d(`click`,`0xC0`))}async function S(e,t,n=800){let r=f();if(r){await r.longPress(e,t,n);return}let{tool:a}=await c();await p(e,t),a===`xdotool`?(await u(`mousedown`,`1`),await i(n),await u(`mouseup`,`1`)):(await d(`click`,`--down`,`0xC0`),await i(n),await d(`click`,`--up`,`0xC0`))}async function C(e,t){await v(e,t)}async function w(e,t,n,r,a=300){let o=f();if(o){await o.drag(e,t,n,r,a);return}let{tool:s}=await c();await p(e,t),s===`xdotool`?(await u(`mousedown`,`1`),await u(`mousemove`,`--sync`,String(n),String(r)),await i(a),await u(`mouseup`,`1`)):(await d(`click`,`--down`,`0xC0`),await d(`mousemove`,`--absolute`,`-x`,String(n),`-y`,String(r)),await i(a),await d(`click`,`--up`,`0xC0`))}async function T(e,t){let r=f();if(r)return await r.scroll(e,t),D(t);let{tool:i}=await c(),a=5;if(t?.pixels==null?t?.amount!=null&&(a=Math.max(1,Math.round(5*(t.amount/n)))):a=i===`xdotool`?Math.max(1,Math.round(t.pixels/15)):Math.max(1,Math.round(t.pixels/40)),i===`xdotool`){let n=e===`up`?`4`:e===`down`?`5`:e===`left`?`6`:`7`;await E(a,t?.durationMs,async e=>{await u(`click`,`--repeat`,String(e),n)})}else e===`up`||e===`down`?await E(a,t?.durationMs,async t=>{await d(`mousemove`,`--wheel`,`-y`,String(e===`up`?-t:t))}):await E(a,t?.durationMs,async t=>{await d(`mousemove`,`--wheel`,`-x`,String(e===`left`?-t:t))});return D(t)}async function E(t,n,r){if(n===void 0||n<=0||t<=1){await r(t);return}let a=n/Math.max(1,t-1),o=0;try{for(let e=0;e<t;e+=1)await r(1),o+=1,e<t-1&&await i(a)}catch(t){throw e(t,o)}}function D(e){return e?.durationMs===void 0?{}:{durationMs:e.durationMs}}async function O(e,t=0){let n=f();if(n){await n.typeText(e,{delayMs:t});return}let{tool:r}=await c();if(r===`xdotool`){let n=[`type`];t>0&&n.push(`--delay`,String(t)),n.push(`--clearmodifiers`,`--`,e),await u(...n)}else await d(`type`,`--`,e)}async function k(e,t,n,r=0){if(await v(e,t),await i(100),await h(`ctrl+a`,[`29:1`,`30:1`,`30:0`,`29:0`]),await i(50),n.length===0){await h(`BackSpace`,[`14:1`,`14:0`]);return}await O(n,r)}export{x as doubleClickLinux,k as fillLinux,C as focusLinux,S as longPressLinux,b as middleClickLinux,v as pressLinux,y as rightClickLinux,T as scrollLinux,h as sendKey,w as swipeLinux,O as typeLinux};
@@ -1 +1 @@
1
- import{I as e,P as t}from"./sdk-contracts.js";import{t as n}from"./path-resolution.js";import"./file.js";import{a as r,i,n as a,r as o}from"./archive.js";import{t as s}from"./byte-limit-stream.js";import{r as c,t as ee}from"./install-source-network-transport.js";import{AsyncLocalStorage as l}from"node:async_hooks";import{createWriteStream as u,promises as d}from"node:fs";import f from"node:os";import p from"node:path";import{pipeline as m}from"node:stream/promises";function h(e,t){return{archivePath:t.archivePath,...t.containingArchivePath?{containingArchivePath:t.containingArchivePath}:{},installablePath:e}}async function g(e,n){let r=await d.stat(e).catch(()=>null);if(!r)throw new t(`INVALID_ARGS`,`App source not found: ${e}`);if(n.isInstallablePath(e,r))return h(e,n);if(r.isFile()&&b(e))return await _(e,n);if(r.isDirectory()){let r=await y(e,n.isInstallablePath);if(r.length===1)return h(r[0],n);if(r.length>1)throw new t(`INVALID_ARGS`,`Found multiple ${n.installableLabel} candidates under ${e}: ${r.join(`, `)}`,{matches:r});let i=await y(e,(e,t)=>!!(t.isFile()&&b(e)));if(i.length===1)return await _(i[0],n);if(i.length>1)throw new t(`INVALID_ARGS`,`Found multiple nested archives under ${e}; expected one ${n.installableLabel} source`,{matches:i})}throw new t(`INVALID_ARGS`,`Expected ${n.installableLabel} source, but got ${e}`)}async function _(e,t){let n=await v(e,t.budget,t.archiveDepth+1);return t.onArchiveAccepted?.(t.archiveDepth+1),t.registerCleanup(n.cleanup),await g(n.outputPath,{...t,archivePath:t.archivePath??e,containingArchivePath:e,archiveDepth:t.archiveDepth+1})}async function v(e,n,r){let i=a(e);if(!i)throw new t(`INVALID_ARGS`,`Unsupported archive: ${e}`);let s=await d.mkdtemp(p.join(f.tmpdir(),`agent-device-archive-`)),c=p.join(s,`extracted`);try{return await o({archivePath:e,outputRoot:c,type:i,budget:n,depth:r}),{outputPath:c,cleanup:async()=>await d.rm(s,{recursive:!0,force:!0})}}catch(e){throw await d.rm(s,{recursive:!0,force:!0}),e}}async function y(e,t){let n=[],r=[{path:e,depth:0}];for(;r.length>0;){let e=r.shift();if(!e)continue;let i=await d.readdir(e.path,{withFileTypes:!0});i.sort((e,t)=>e.name.localeCompare(t.name));for(let a of i){if(a.name===`__MACOSX`||a.name.startsWith(`._`))continue;let i=p.join(e.path,a.name);t(i,a)?n.push(i):a.isDirectory()&&e.depth<5&&r.push({path:i,depth:e.depth+1})}}return[...new Set(n)]}function b(e){return a(e)!==void 0}const x=new l;async function S(e){return await x.run({budget:new i,depth:0},e)}function C(){return x.getStore()?.budget}function w(){return x.getStore()?.depth??0}function T(e){let t=x.getStore();t&&(t.depth=Math.max(t.depth,e))}const E=new Set([301,302,303,307,308]),D=/^[A-Z][A-Z0-9_]{0,63}$/,O=new Set([`accept-encoding`,`connection`,`content-length`,`host`,`keep-alive`,`proxy-connection`,`proxy-authorization`,`te`,`trailer`,`transfer-encoding`,`upgrade`]);async function k(e){let t=V(e.url),n=L(I(e.headers));for(let r=0;;r+=1){let i=await A(t,n,e.signal);try{let a=M(i,t,r);if(a){a.origin!==t.origin&&(n=R(n)),t=a;continue}return N(i),await P(e.tempDir,t,i)}finally{await i.close()}}}async function A(e,n,r){let i=await c(e,r);try{return await ee({url:e,approvedAddress:i.address,family:i.family,headers:{...n,"accept-encoding":`identity`},signal:r})}catch(e){if(e instanceof t)throw e;let n=j(e);throw new t(`COMMAND_FAILED`,n?`The daemon failed to fetch the app source (network error code: ${n})`:`The daemon failed to fetch the app source`,n?{networkErrorCode:n}:void 0,e)}}function j(e){let t=e?.code;return typeof t==`string`&&D.test(t)?t:void 0}function M(e,n,r){if(!E.has(e.statusCode))return;e.body.resume?.();let i=B(e.headers,`location`);if(!i||r>=5)throw new t(`COMMAND_FAILED`,`App source redirect limit was exceeded`,{status:e.statusCode});let a=new URL(i,n);if(n.protocol===`https:`&&a.protocol!==`https:`)throw new t(`COMMAND_FAILED`,`App source redirect downgraded HTTPS`);return a}function N(e){if(!(e.statusCode>=200&&e.statusCode<300))throw new t(`COMMAND_FAILED`,`Failed to download app source: ${e.statusCode}`,{status:e.statusCode})}async function P(e,n,i){let a=B(i.headers,`content-encoding`);if(a&&a.toLowerCase()!==`identity`)throw new t(`COMMAND_FAILED`,`App source response used unsupported content encoding`);F(B(i.headers,`content-length`));let o=p.join(e,z(i,n)),c=s({maxBytes:r,createLimitError:()=>new t(`COMMAND_FAILED`,`App source exceeds maximum size of ${r} bytes`,{reason:`ARTIFACT_BYTE_LIMIT`})});try{return await m(i.body,c,u(o,{flags:`wx`})),o}catch(e){throw await d.rm(o,{force:!0}).catch(()=>{}),e}}function F(e){if(e===null)return;if(!/^\d+$/.test(e))throw new t(`COMMAND_FAILED`,`App source response had invalid content-length`);let n=Number(e);if(!Number.isSafeInteger(n)||n>2147483648)throw new t(`COMMAND_FAILED`,`App source response exceeded the byte limit`,{reason:`ARTIFACT_BYTE_LIMIT`})}function I(e){let t=new Set(Object.entries(e??{}).filter(([e])=>e.toLowerCase()===`connection`).flatMap(([,e])=>e.split(`,`).map(e=>e.trim().toLowerCase())));return Object.fromEntries(Object.entries(e??{}).filter(([e])=>{let n=e.toLowerCase();return!O.has(n)&&!t.has(n)}))}function L(e){return Object.keys(e).some(e=>e.toLowerCase()===`user-agent`)?e:{...e,"user-agent":`agent-device`}}function R(e){return Object.fromEntries(Object.entries(e).filter(([e])=>[`accept`,`user-agent`].includes(e.toLowerCase())))}function z(e,t){let n=(B(e.headers,`content-disposition`)?.match(/filename\*?=(?:UTF-8'')?"?([^";]+)"?/i))?.[1]?.trim()||p.basename(t.pathname)||`downloaded-artifact.bin`;return p.basename(n)}function B(e,t){let n=e[t];return Array.isArray(n)?n[0]??null:n??null}function V(e){let n;try{n=new URL(e)}catch{throw H()}if(n.username||n.password)throw new t(`INVALID_ARGS`,`Source URL credentials are not allowed`);return n}function H(){return new t(`INVALID_ARGS`,`Invalid source URL`)}const U=Object.freeze([`.zip`,`.tar`,`.tar.gz`,`.tgz`]);async function W(e){let t=[];try{let n=await K(e.source,{signal:e.signal,downloadTimeoutMs:e.downloadTimeoutMs});t.push(n.cleanup);let r=await g(n.localPath,{archivePath:void 0,isInstallablePath:e.isInstallablePath,installableLabel:e.installableLabel,registerCleanup:e=>{t.push(e)},budget:C()??new i,archiveDepth:0,onArchiveAccepted:T});return{archivePath:r.archivePath,...r.containingArchivePath?{containingArchivePath:r.containingArchivePath}:{},installablePath:r.installablePath,cleanup:async()=>{await $(t)}}}catch(e){throw await $(t),e}}function G(e){return n(e)}async function K(e,t){if(e.kind===`path`)return{localPath:G(e.path),cleanup:async()=>{}};let n=await d.mkdtemp(p.join(f.tmpdir(),`agent-device-source-`));try{return{localPath:await q(n,e.url,e.headers,t),cleanup:async()=>{await d.rm(n,{recursive:!0,force:!0})}}}catch(e){throw await d.rm(n,{recursive:!0,force:!0}),e}}async function q(t,n,r,i){let a=i?.signal;if(a?.aborted)throw e();let o=i?.downloadTimeoutMs??12e4,s=AbortSignal.timeout(o),c=a?AbortSignal.any([a,s]):s;try{return await k({tempDir:t,url:n,headers:r,signal:c})}catch(e){throw J(e,a,s,o)}}function J(n,r,i,a){return r?.aborted?e(void 0,n):i.aborted?new t(`COMMAND_FAILED`,`App source download timed out after ${a}ms`,{timeoutMs:a},n):n}async function Y(e){await c(e)}function X(e){let t=e instanceof URL?e:URL.parse(e);if(!t)throw H();let n=t.hostname.toLowerCase();if(!n)return!1;let r=t.pathname;return Z(n,r)||Q(n,r)}function Z(e,t){return e===`api.github.com`?/^\/repos\/[^/]+\/[^/]+\/actions\/artifacts\/\d+\/zip$/i.test(t):e===`github.com`&&/^\/[^/]+\/[^/]+\/(?:actions\/runs\/\d+\/artifacts\/\d+|suites\/\d+\/artifacts\/\d+)$/i.test(t)}function Q(e,t){return e!==`expo.dev`&&!e.endsWith(`.expo.dev`)?!1:/^\/(?:artifacts\/eas\/|accounts\/[^/]+\/projects\/[^/]+\/builds\/)/i.test(t)}async function $(e){for(let t of[...e].reverse())await t()}export{C as a,S as c,Y as i,X as n,w as o,W as r,T as s,U as t};
1
+ import{I as e,P as t}from"./sdk-contracts.js";import{t as n}from"./path-resolution.js";import"./file.js";import{a as r,i,n as a,r as o}from"./archive.js";import{t as s}from"./byte-limit-stream.js";import{r as c,t as l}from"./install-source-network-transport.js";import{AsyncLocalStorage as u}from"node:async_hooks";import{createWriteStream as ee,promises as d}from"node:fs";import f from"node:os";import p from"node:path";import{pipeline as m}from"node:stream/promises";function h(e,t){return{archivePath:t.archivePath,...t.containingArchivePath?{containingArchivePath:t.containingArchivePath}:{},installablePath:e}}async function g(e,n){let r=await d.stat(e).catch(()=>null);if(!r)throw new t(`INVALID_ARGS`,`App source not found: ${e}`);if(n.isInstallablePath(e,r))return h(e,n);if(r.isFile()&&b(e))return await _(e,n);if(r.isDirectory()){let r=await y(e,n.isInstallablePath);if(r.length===1)return h(r[0],n);if(r.length>1)throw new t(`INVALID_ARGS`,`Found multiple ${n.installableLabel} candidates under ${e}: ${r.join(`, `)}`,{matches:r});let i=await y(e,(e,t)=>!!(t.isFile()&&b(e)));if(i.length===1)return await _(i[0],n);if(i.length>1)throw new t(`INVALID_ARGS`,`Found multiple nested archives under ${e}; expected one ${n.installableLabel} source`,{matches:i})}throw new t(`INVALID_ARGS`,`Expected ${n.installableLabel} source, but got ${e}`)}async function _(e,t){let n=await v(e,t.budget,t.archiveDepth+1);return t.onArchiveAccepted?.(t.archiveDepth+1),t.registerCleanup(n.cleanup),await g(n.outputPath,{...t,archivePath:t.archivePath??e,containingArchivePath:e,archiveDepth:t.archiveDepth+1})}async function v(e,n,r){let i=a(e);if(!i)throw new t(`INVALID_ARGS`,`Unsupported archive: ${e}`);let s=await d.mkdtemp(p.join(f.tmpdir(),`agent-device-archive-`)),c=p.join(s,`extracted`);try{return await o({archivePath:e,outputRoot:c,type:i,budget:n,depth:r}),{outputPath:c,cleanup:async()=>await d.rm(s,{recursive:!0,force:!0})}}catch(e){throw await d.rm(s,{recursive:!0,force:!0}),e}}async function y(e,t){let n=[],r=[{path:e,depth:0}];for(;r.length>0;){let e=r.shift();if(!e)continue;let i=await d.readdir(e.path,{withFileTypes:!0});i.sort((e,t)=>e.name.localeCompare(t.name));for(let a of i){if(a.name===`__MACOSX`||a.name.startsWith(`._`))continue;let i=p.join(e.path,a.name);t(i,a)?n.push(i):a.isDirectory()&&e.depth<5&&r.push({path:i,depth:e.depth+1})}}return[...new Set(n)]}function b(e){return a(e)!==void 0}const x=new u;async function S(e){return await x.run({budget:new i,depth:0},e)}function C(){return x.getStore()?.budget}function w(){return x.getStore()?.depth??0}function T(e){let t=x.getStore();t&&(t.depth=Math.max(t.depth,e))}const E=new Set([301,302,303,307,308]),D=/^[A-Z][A-Z0-9_]{0,63}$/,O=new Set([`accept-encoding`,`connection`,`content-length`,`host`,`keep-alive`,`proxy-connection`,`proxy-authorization`,`te`,`trailer`,`transfer-encoding`,`upgrade`]);async function k(e){let t=V(e.url),n=L(I(e.headers));for(let r=0;;r+=1){let i=await A(t,n,e.signal);try{let a=M(i,t,r);if(a){a.origin!==t.origin&&(n=R(n)),t=a;continue}return N(i),await P(e.tempDir,t,i)}finally{await i.close()}}}async function A(e,n,r){let i=await c(e,r);try{return await l({url:e,approvedAddress:i.address,family:i.family,headers:{...n,"accept-encoding":`identity`},signal:r})}catch(e){if(e instanceof t)throw e;let n=j(e);throw new t(`COMMAND_FAILED`,n?`The daemon failed to fetch the app source (network error code: ${n})`:`The daemon failed to fetch the app source`,n?{networkErrorCode:n}:void 0,e)}}function j(e){let t=e?.code;return typeof t==`string`&&D.test(t)?t:void 0}function M(e,n,r){if(!E.has(e.statusCode))return;e.body.resume?.();let i=B(e.headers,`location`);if(!i||r>=5)throw new t(`COMMAND_FAILED`,`App source redirect limit was exceeded`,{status:e.statusCode});let a=new URL(i,n);if(n.protocol===`https:`&&a.protocol!==`https:`)throw new t(`COMMAND_FAILED`,`App source redirect downgraded HTTPS`);return a}function N(e){if(!(e.statusCode>=200&&e.statusCode<300))throw new t(`COMMAND_FAILED`,`Failed to download app source: ${e.statusCode}`,{status:e.statusCode})}async function P(e,n,i){let a=B(i.headers,`content-encoding`);if(a&&a.toLowerCase()!==`identity`)throw new t(`COMMAND_FAILED`,`App source response used unsupported content encoding`);F(B(i.headers,`content-length`));let o=p.join(e,z(i,n)),c=s({maxBytes:r,createLimitError:()=>new t(`COMMAND_FAILED`,`App source exceeds maximum size of ${r} bytes`,{reason:`ARTIFACT_BYTE_LIMIT`})});try{return await m(i.body,c,ee(o,{flags:`wx`})),o}catch(e){throw await d.rm(o,{force:!0}).catch(()=>{}),e}}function F(e){if(e===null)return;if(!/^\d+$/.test(e))throw new t(`COMMAND_FAILED`,`App source response had invalid content-length`);let n=Number(e);if(!Number.isSafeInteger(n)||n>2147483648)throw new t(`COMMAND_FAILED`,`App source response exceeded the byte limit`,{reason:`ARTIFACT_BYTE_LIMIT`})}function I(e){let t=new Set(Object.entries(e??{}).filter(([e])=>e.toLowerCase()===`connection`).flatMap(([,e])=>e.split(`,`).map(e=>e.trim().toLowerCase())));return Object.fromEntries(Object.entries(e??{}).filter(([e])=>{let n=e.toLowerCase();return!O.has(n)&&!t.has(n)}))}function L(e){return Object.keys(e).some(e=>e.toLowerCase()===`user-agent`)?e:{...e,"user-agent":`agent-device`}}function R(e){return Object.fromEntries(Object.entries(e).filter(([e])=>[`accept`,`user-agent`].includes(e.toLowerCase())))}function z(e,t){let n=(B(e.headers,`content-disposition`)?.match(/filename\*?=(?:UTF-8'')?"?([^";]+)"?/i))?.[1]?.trim()||p.basename(t.pathname)||`downloaded-artifact.bin`;return p.basename(n)}function B(e,t){let n=e[t];return Array.isArray(n)?n[0]??null:n??null}function V(e){let n;try{n=new URL(e)}catch{throw H()}if(n.username||n.password)throw new t(`INVALID_ARGS`,`Source URL credentials are not allowed`);return n}function H(){return new t(`INVALID_ARGS`,`Invalid source URL`)}const U=Object.freeze([`.zip`,`.tar`,`.tar.gz`,`.tgz`]),W=12e4;async function G(e){let t=[];try{let n=await q(e.source,{signal:e.signal});t.push(n.cleanup);let r=await g(n.localPath,{archivePath:void 0,isInstallablePath:e.isInstallablePath,installableLabel:e.installableLabel,registerCleanup:e=>{t.push(e)},budget:C()??new i,archiveDepth:0,onArchiveAccepted:T});return{archivePath:r.archivePath,...r.containingArchivePath?{containingArchivePath:r.containingArchivePath}:{},installablePath:r.installablePath,cleanup:async()=>{await $(t)}}}catch(e){throw await $(t),e}}function K(e){return n(e)}async function q(e,t){if(e.kind===`path`)return{localPath:K(e.path),cleanup:async()=>{}};let n=await d.mkdtemp(p.join(f.tmpdir(),`agent-device-source-`));try{return{localPath:await J(n,e.url,e.headers,t),cleanup:async()=>{await d.rm(n,{recursive:!0,force:!0})}}}catch(e){throw await d.rm(n,{recursive:!0,force:!0}),e}}async function J(t,n,r,i){let a=i?.signal;if(a?.aborted)throw e();let o=AbortSignal.timeout(W),s=a?AbortSignal.any([a,o]):o;try{return await k({tempDir:t,url:n,headers:r,signal:s})}catch(e){throw Y(e,a,o,W)}}function Y(n,r,i,a){return r?.aborted?e(void 0,n):i.aborted?new t(`COMMAND_FAILED`,`App source download timed out after ${a}ms`,{timeoutMs:a},n):n}async function X(e){await c(e)}function Z(e){let t=e instanceof URL?e:URL.parse(e);if(!t)throw H();let n=t.hostname.toLowerCase();if(!n)return!1;let r=t.pathname;return Q(n,r)||te(n,r)}function Q(e,t){return e===`api.github.com`?/^\/repos\/[^/]+\/[^/]+\/actions\/artifacts\/\d+\/zip$/i.test(t):e===`github.com`&&/^\/[^/]+\/[^/]+\/(?:actions\/runs\/\d+\/artifacts\/\d+|suites\/\d+\/artifacts\/\d+)$/i.test(t)}function te(e,t){return e!==`expo.dev`&&!e.endsWith(`.expo.dev`)?!1:/^\/(?:artifacts\/eas\/|accounts\/[^/]+\/projects\/[^/]+\/builds\/)/i.test(t)}async function $(e){for(let t of[...e].reverse())await t()}export{C as a,S as c,X as i,Z as n,w as o,G as r,T as s,U as t};
@@ -1 +1 @@
1
- import{P as e}from"./sdk-contracts.js";import{Cr as t,br as n,vr as r,xr as i,yr as a}from"./sdk-batch.js";function o(e){return e?.startsWith(`@`)?e.slice(1):e}const s=/^e\d+$/;function c(n){if(n[0]?.startsWith(`@`)){let e=_(n.slice(1));return{ref:n[0],...e===void 0?{}:{label:e}}}if(s.test(n[0]??``))throw new e(`INVALID_ARGS`,`Did you mean "@${n[0]}"? Snapshot refs need the @ prefix.`);let r=t(n);if(r){if(r.rest.length>0)throw new e(`INVALID_ARGS`,m(n,r));return{selector:r.selectorExpression}}return u(n)}function l(n){let r=n[0];if(r?.startsWith(`@`)){let e=n.slice(1),t=e.length===0?void 0:e.join(` `);return{kind:`ref`,target:{ref:r},text:t}}if(s.test(r??``))throw new e(`INVALID_ARGS`,`Did you mean "@${r}"? Snapshot refs need the @ prefix.`);let i=t(n,{preferTrailingValue:!0});if(i)return{kind:`selector`,target:{selector:i.selectorExpression},text:i.rest.length===0?void 0:i.rest.join(` `)};let a=n.slice(2);return{kind:`point`,target:u(n.slice(0,2)),text:a.length===0?void 0:a.join(` `)}}function u(t){let n=t[0]??``,r=a(n);if(r){let i=d(n)?r.value:[r.value,...t.slice(1)].join(` `).trim();throw new e(`INVALID_ARGS`,f({key:r.key,value:i}))}let i=Number(t[0]),o=Number(t[1]);if(Number.isFinite(i)&&Number.isFinite(o))return{x:i,y:o};throw new e(`INVALID_ARGS`,p(t))}function d(e){let t=e.slice(e.indexOf(`=`)+1).trim();if(t.length<2)return!1;let n=t[0];return(n===`"`||n===`'`)&&t.endsWith(n)}function f(e){let{key:t,value:i}=e;return`Unknown selector key "${t}". Supported: ${r.join(`, `)}. ${n(t)?`Did you mean role=${t} label=${g(i)}?`:`Did you mean label=${g(i)}?`}`}function p(e){let t=e.filter(e=>e!==void 0).join(` `);if(!t.trim())return`Missing target. Pass an @ref from snapshot, a selector like text="Sign in", or "x y" coordinates.`;let n=`Target "${t}" is not a @ref, selector, or "x y" point.`;return e.some(e=>i(e??``))?`${n} Selector values with spaces need quotes, e.g. text="Sign in".`:`${n} To match by visible text, use text=${g(t)} (or label=/id=/role=), or pass an @ref from snapshot.`}function m(e,t){return`${`Selector ${t.selectorExpression} is followed by unexpected extra arguments: "${t.rest.join(` `)}".`} Selector values with spaces need quotes, e.g. ${h(e,t)??`text="Sign in"`}.`}function h(e,t){let n=e.length-t.rest.length,r=e[n-1];if(r===void 0)return;let i=r.indexOf(`=`);if(i<=0)return;let a=[r.slice(i+1),...t.rest].join(` `),o=`${r.slice(0,i+1)}${g(a)}`;return[...e.slice(0,n-1),o].join(` `)}function g(e){return`"${e.replaceAll(`\\`,String.raw`\\`).replaceAll(`"`,String.raw`\"`)}"`}function _(e){return e.join(` `).trim()||void 0}export{c as n,o as r,l as t};
1
+ import{P as e}from"./sdk-contracts.js";import{Sr as t,br as n,wr as r,xr as i,yr as a}from"./sdk-batch.js";function o(e){return e?.startsWith(`@`)?e.slice(1):e}const s=/^e\d+$/;function c(t){if(t[0]?.startsWith(`@`)){let e=_(t.slice(1));return{ref:t[0],...e===void 0?{}:{label:e}}}if(s.test(t[0]??``))throw new e(`INVALID_ARGS`,`Did you mean "@${t[0]}"? Snapshot refs need the @ prefix.`);let n=r(t);if(n){if(n.rest.length>0)throw new e(`INVALID_ARGS`,m(t,n));return{selector:n.selectorExpression}}return u(t)}function l(t){let n=t[0];if(n?.startsWith(`@`)){let e=t.slice(1),r=e.length===0?void 0:e.join(` `);return{kind:`ref`,target:{ref:n},text:r}}if(s.test(n??``))throw new e(`INVALID_ARGS`,`Did you mean "@${n}"? Snapshot refs need the @ prefix.`);let i=r(t,{preferTrailingValue:!0});if(i)return{kind:`selector`,target:{selector:i.selectorExpression},text:i.rest.length===0?void 0:i.rest.join(` `)};let a=t.slice(2);return{kind:`point`,target:u(t.slice(0,2)),text:a.length===0?void 0:a.join(` `)}}function u(t){let r=t[0]??``,i=n(r);if(i){let n=d(r)?i.value:[i.value,...t.slice(1)].join(` `).trim();throw new e(`INVALID_ARGS`,f({key:i.key,value:n}))}let a=Number(t[0]),o=Number(t[1]);if(Number.isFinite(a)&&Number.isFinite(o))return{x:a,y:o};throw new e(`INVALID_ARGS`,p(t))}function d(e){let t=e.slice(e.indexOf(`=`)+1).trim();if(t.length<2)return!1;let n=t[0];return(n===`"`||n===`'`)&&t.endsWith(n)}function f(e){let{key:t,value:n}=e;return`Unknown selector key "${t}". Supported: ${a.join(`, `)}. ${i(t)?`Did you mean role=${t} label=${g(n)}?`:`Did you mean label=${g(n)}?`}`}function p(e){let n=e.filter(e=>e!==void 0).join(` `);if(!n.trim())return`Missing target. Pass an @ref from snapshot, a selector like text="Sign in", or "x y" coordinates.`;let r=`Target "${n}" is not a @ref, selector, or "x y" point.`;return e.some(e=>t(e??``))?`${r} Selector values with spaces need quotes, e.g. text="Sign in".`:`${r} To match by visible text, use text=${g(n)} (or label=/id=/role=), or pass an @ref from snapshot.`}function m(e,t){return`${`Selector ${t.selectorExpression} is followed by unexpected extra arguments: "${t.rest.join(` `)}".`} Selector values with spaces need quotes, e.g. ${h(e,t)??`text="Sign in"`}.`}function h(e,t){let n=e.length-t.rest.length,r=e[n-1];if(r===void 0)return;let i=r.indexOf(`=`);if(i<=0)return;let a=[r.slice(i+1),...t.rest].join(` `),o=`${r.slice(0,i+1)}${g(a)}`;return[...e.slice(0,n-1),o].join(` `)}function g(e){return`"${e.replaceAll(`\\`,String.raw`\\`).replaceAll(`"`,String.raw`\"`)}"`}function _(e){return e.join(` `).trim()||void 0}export{c as n,o as r,l as t};
@@ -1 +1 @@
1
- import{F as e,K as t,P as n,r}from"./sdk-contracts.js";import{p as i,w as a}from"./sdk-device.js";import{fn as o}from"./sdk-batch.js";import{i as s,s as c,u as l}from"./target-evidence.js";import{M as u,P as d,n as f,p,r as m}from"./provider-device-admission.js";import{i as h}from"./mobile-snapshot-semantics.js";import{r as g}from"./request-cancel.js";import"./request.js";import{A as _,b as v,f as y,g as b,o as x,s as S,v as C,y as w}from"./session-snapshot.js";import{i as T}from"./internal/daemon.js";function E(e){return{...e,sessionRef:`sessionRef`in e?e.sessionRef:e.sessionStore.lookup(e.sessionName)}}function D(e){let{req:t,logPath:n,traceLogPath:r}=e;return{verbose:t.flags?.verbose,logPath:n,traceLogPath:r,requestId:t.meta?.requestId,iosXctestrunFile:t.flags?.iosXctestrunFile,iosXctestDerivedDataPath:t.flags?.iosXctestDerivedDataPath,iosXctestEnvDir:t.flags?.iosXctestEnvDir}}function O(e,t){return!(!e||!i(e.device)||f(e.device)||t.skipPendingPostGestureStabilization&&C(e))}function k(e){let{session:t,selectorExpression:n}=e;return O(t,{skipPendingPostGestureStabilization:!0})?o(n):null}function A(e){let t=e.identifier?.trim();if(t)return{key:`id`,value:t};let n=e.label?.trim();return n?{key:`label`,value:n}:null}async function j(e,t,n){let r=await b(e.device,t,e.appBundleId,n),i=r.found===!0,a=M(r);return{found:i,...typeof r.text==`string`?{text:r.text}:{},...a?{node:a}:{}}}function M(e){let t=e.nodes;if(!Array.isArray(t))return;let n=t[0];if(!(!n||typeof n!=`object`))return n}const N=new Set([`ELEMENT_NOT_FOUND`,`ELEMENT_OFFSCREEN`,`AMBIGUOUS_MATCH`]);function P(n,r){let i=e(n);return i.details?.dispatched!==`no`||t(i)?!1:N.has(i.code)?r.delegateSemanticFailures:i.code===`COMMAND_FAILED`}async function F(e){let{session:t,node:n,rootViewport:r,requestOptions:i}=e,a=A(n);if(!a)return null;let o;try{o=await j(t,a,i)}catch{return null}if(!o.found||!o.node?.rect)return null;let s={rect:o.node.rect,hittable:o.node.hittable===!0};return h(s,r)?s.rect:null}function I(e){let{operations:t,command:n,positionals:r,actionCommand:i=n,flags:a,result:o,responseData:c,recordedTarget:l,recordedTargets:u,actionStartedAt:d,actionFinishedAt:f,androidFreshnessBaseline:p}=e,m=v(a),[h,g]=R({command:n,positionals:r,flags:m,result:o,responseData:c}),_=t.isSessionRecording()&&l?s(l):void 0,y=t.isSessionRecording()&&u?L(u):void 0;return t.recordAction({command:n,positionals:r,flags:m??{},result:h,..._?{targetEvidence:_}:{},...y?{targetEvidences:y}:{}}),t.markDeferredOutcome({command:n,action:i,positionals:r,flags:a,androidFreshnessBaseline:p}),t.recordGestureVisualization(i,r,h,m??{},d,f),{ok:!0,data:g}}function L(e){let t=s(e.source),n=s(e.destination);return t&&n?{source:t,destination:n}:void 0}function R(e){if(e.command!==`fill`||typeof e.flags?.recordAs!=`string`)return[e.result,e.responseData];let t=u({ts:0,command:`fill`,positionals:e.positionals,flags:e.flags,result:e.result}),n=d(e.flags.recordAs);return[m(e.result,t,n),m(e.responseData,t,n)]}function z(e){let t=E(e).sessionRef;if(!t)throw new n(`SESSION_NOT_FOUND`,r);let i=e.sessionStore.requireCurrent(t);return V({requestId:e.req.meta?.requestId,flags:e.req.flags,session:i,contextFromFlags:e.contextFromFlags,captureSnapshot:async(n,r)=>{let i=await e.captureSnapshotForSession(t,n,e.sessionStore,e.contextFromFlags,r);return c(e.captureProof,i)},runtimeSessions:S({sessionName:e.sessionName,sessionStore:e.sessionStore,ref:t,recordOptions:{includeSnapshot:!0,omitRefFrameSnapshot:e.req.internal?.findResolvedTarget!==void 0},setRecord:(e,t)=>{e.snapshot&&x(t,e.snapshot)}}),expireRefFrame:()=>_(e.sessionStore.requireCurrent(t)),confirmOffscreenTargetVisible:O(i,{skipPendingPostGestureStabilization:!1})?async(t,n)=>await F({session:i,node:t,rootViewport:n,requestOptions:D({req:e.req,logPath:e.logPath,traceLogPath:i.trace?.outPath})}):void 0,pairedGestureViewport:e.pairedGestureViewport,touchExecutor:e.touchExecutor,gestures:e.gestures})}function B(e){let{ref:t,sessionStore:n,...r}=e,i=n.requireCurrent(t);return I({...r,operations:{recordAction:n.recordAction.bind(n,t),markDeferredOutcome:e=>w({session:i,...e}),isSessionRecording:p.bind(null,i),recordGestureVisualization:T.bind(null,i)}})}function V(e){return y({backend:H(e),...l(`interaction commands`,{plural:!0}),sessions:e.runtimeSessions,signal:g(e.requestId)})}function H(e){let{flags:t,session:n}=e;return{platform:a(n.device),captureSnapshot:async(n,r)=>({snapshot:await e.captureSnapshot(t,{interactiveOnly:r?.interactiveOnly===!0,preferredBackend:r?.preferredBackend,includeRects:r?.includeRects===!0,signal:n.signal,boundCapture:e.touchExecutor?.captureSnapshot??e.gestures?.captureSnapshot})}),...U(e,()=>e.contextFromFlags(t,n.appBundleId,n.trace?.outPath)),...e.confirmOffscreenTargetVisible?{confirmOffscreenTargetVisible:async(t,n,r)=>await e.confirmOffscreenTargetVisible(n,r)}:{},...W(e.touchExecutor,e.expireRefFrame,t)}}function U(e,t){let n=e.gestures,r=e.pairedGestureViewport;return n?{resolveGestureViewport:async()=>r??await n.gestureViewport?.(t()),performGesture:async(r,i)=>(e.expireRefFrame(),G(await n.performPlan(i,t())))}:r?{resolveGestureViewport:async()=>r}:{}}function W(e,t,n){if(!e)return{};let{tapPoint:r,tapRef:i,fillPoint:a,fillRef:o,longPressPoint:s,hoverPoint:c,hoverRef:l}=e,u=async e=>(t(),G(await e()));return{tap:r?(e,t)=>u(()=>r(t,n)):void 0,tapTarget:i?(e,t)=>u(()=>i(t.ref)):void 0,fill:a?(e,t,n,r)=>u(()=>a(t,n,r)):void 0,fillTarget:o?(e,t,n,r)=>u(()=>o(t.ref,n,r)):void 0,longPress:s?(e,t,n)=>u(()=>s(t,n?.durationMs)):void 0,hover:c?(e,t)=>u(()=>c(t)):void 0,hoverTarget:l?(e,t)=>u(()=>l(t.ref)):void 0}}function G(e){return e&&typeof e==`object`?e:void 0}function K(e,t,n){return{ok:!1,error:{code:e,message:t,...n?{details:n}:{}}}}function q(e,t){if(!t||t.settle===!0)return null;let n=[];return t.settleQuietMs!==void 0&&n.push(`--settle-quiet`),n.length===0?null:K(`INVALID_ARGS`,`${e}: ${n.join(`, `)} require${n.length===1?`s`:``} --settle.`)}function J(e){if(e?.settle===!0)return{...e.settleQuietMs===void 0?{}:{quietMs:e.settleQuietMs},...e.timeoutMs===void 0?{}:{timeoutMs:e.timeoutMs}}}function Y(e){try{return X(e),null}catch(e){if(e instanceof n)return K(e.code,e.message,e.details);throw e}}function X(e){let t=e.ref.startsWith(`@`)?e.ref.slice(1):e.ref,{admission:r,scope:i,currentGeneration:a}=e.frame;if(r.admitted)return;let o=r.reason===`plain_ref_requires_complete_frame`&&i!==`all`&&i.has(t)&&a!==void 0?`@${t}~s${a}`:void 0;throw new n(`COMMAND_FAILED`,Q(r.reason,e.ref),{reason:r.reason,ref:e.ref,currentGeneration:a,scope:i===`all`?`all`:Array.from(i),...e.mintedGeneration===void 0?{}:{mintedGeneration:e.mintedGeneration},...o?{suggestedRef:o}:{},hint:o?`Retry with the exact emitted ref ${o}.`:e.staleRefsWarning??Z})}const Z=`Capture a fresh interactive snapshot (snapshot -i) or use a stable selector, then retry.`;function Q(e,t){switch(e){case`ref_frame_expired`:return`Ref ${t} belongs to an expired ref frame — a device action since the snapshot invalidated it`;case`ref_generation_mismatch`:return`Ref ${t} was minted from a superseded snapshot generation`;case`plain_ref_requires_complete_frame`:return`Ref ${t} needs a complete snapshot — the current frame only authorizes its emitted refs`;case`ref_not_issued`:return`Ref ${t} was not issued by the current ref frame`}}export{z as a,O as c,q as i,k as l,Y as n,B as o,J as r,P as s,X as t,E as u};
1
+ import{F as e,K as t,P as n,r}from"./sdk-contracts.js";import{E as i,h as a}from"./sdk-device.js";import{pn as o}from"./sdk-batch.js";import{i as s,s as c,u as l}from"./target-evidence.js";import{M as u,P as d,n as f,p,r as m}from"./provider-device-admission.js";import{i as h}from"./mobile-snapshot-semantics.js";import{r as g}from"./request-cancel.js";import"./request.js";import{_,b as v,c as y,j as b,p as x,s as S,x as C,y as w}from"./session-snapshot.js";import{Q as T}from"./internal/daemon.js";function E(e){return{...e,sessionRef:`sessionRef`in e?e.sessionRef:e.sessionStore.lookup(e.sessionName)}}function D(e){let{req:t,logPath:n,traceLogPath:r}=e;return{verbose:t.flags?.verbose,logPath:n,traceLogPath:r,requestId:t.meta?.requestId,iosXctestrunFile:t.flags?.iosXctestrunFile,iosXctestDerivedDataPath:t.flags?.iosXctestDerivedDataPath,iosXctestEnvDir:t.flags?.iosXctestEnvDir}}function O(e,t){return!(!e||!a(e.device)||f(e.device)||t.skipPendingPostGestureStabilization&&w(e))}function k(e){let{session:t,selectorExpression:n}=e;return O(t,{skipPendingPostGestureStabilization:!0})?o(n):null}function A(e){let t=e.identifier?.trim();if(t)return{key:`id`,value:t};let n=e.label?.trim();return n?{key:`label`,value:n}:null}async function j(e,t,n){let r=await _(e.device,t,e.appBundleId,n),i=r.found===!0,a=M(r);return{found:i,...typeof r.text==`string`?{text:r.text}:{},...a?{node:a}:{}}}function M(e){let t=e.nodes;if(!Array.isArray(t))return;let n=t[0];if(!(!n||typeof n!=`object`))return n}const N=new Set([`ELEMENT_NOT_FOUND`,`ELEMENT_OFFSCREEN`,`AMBIGUOUS_MATCH`]);function P(n,r){let i=e(n);return i.details?.dispatched!==`no`||t(i)?!1:N.has(i.code)?r.delegateSemanticFailures:i.code===`COMMAND_FAILED`}async function F(e){let{session:t,node:n,rootViewport:r,requestOptions:i}=e,a=A(n);if(!a)return null;let o;try{o=await j(t,a,i)}catch{return null}if(!o.found||!o.node?.rect)return null;let s={rect:o.node.rect,hittable:o.node.hittable===!0};return h(s,r)?s.rect:null}function I(e){let{operations:t,command:n,positionals:r,actionCommand:i=n,flags:a,result:o,responseData:c,recordedTarget:l,recordedTargets:u,actionStartedAt:d,actionFinishedAt:f,androidFreshnessBaseline:p}=e,m=C(a),[h,g]=R({command:n,positionals:r,flags:m,result:o,responseData:c}),_=t.isSessionRecording()&&l?s(l):void 0,v=t.isSessionRecording()&&u?L(u):void 0;return t.recordAction({command:n,positionals:r,flags:m??{},result:h,..._?{targetEvidence:_}:{},...v?{targetEvidences:v}:{}}),t.markDeferredOutcome({command:n,action:i,positionals:r,flags:a,androidFreshnessBaseline:p}),t.recordGestureVisualization(i,r,h,m??{},d,f),{ok:!0,data:g}}function L(e){let t=s(e.source),n=s(e.destination);return t&&n?{source:t,destination:n}:void 0}function R(e){if(e.command!==`fill`||typeof e.flags?.recordAs!=`string`)return[e.result,e.responseData];let t=u({ts:0,command:`fill`,positionals:e.positionals,flags:e.flags,result:e.result}),n=d(e.flags.recordAs);return[m(e.result,t,n),m(e.responseData,t,n)]}function z(e){let t=E(e).sessionRef;if(!t)throw new n(`SESSION_NOT_FOUND`,r);let i=e.sessionStore.requireCurrent(t);return V({requestId:e.req.meta?.requestId,flags:e.req.flags,session:i,contextFromFlags:e.contextFromFlags,captureSnapshot:async(n,r)=>{let i=await e.captureSnapshotForSession(t,n,e.sessionStore,e.contextFromFlags,r);return e.consumedCapture&&(e.consumedCapture.state=i),c(e.captureProof,i)},runtimeSessions:y({sessionName:e.sessionName,sessionStore:e.sessionStore,ref:t,recordOptions:{includeSnapshot:!0,omitRefFrameSnapshot:e.req.internal?.findResolvedTarget!==void 0},setRecord:(e,t)=>{e.snapshot&&S(t,e.snapshot)}}),expireRefFrame:()=>b(e.sessionStore.requireCurrent(t)),confirmOffscreenTargetVisible:O(i,{skipPendingPostGestureStabilization:!1})?async(t,n)=>await F({session:i,node:t,rootViewport:n,requestOptions:D({req:e.req,logPath:e.logPath,traceLogPath:i.trace?.outPath})}):void 0,pairedGestureViewport:e.pairedGestureViewport,touchExecutor:e.touchExecutor,gestures:e.gestures})}function B(e){let{ref:t,sessionStore:n,...r}=e,i=n.requireCurrent(t);return I({...r,operations:{recordAction:n.recordAction.bind(n,t),markDeferredOutcome:e=>v({session:i,...e}),isSessionRecording:p.bind(null,i),recordGestureVisualization:T.bind(null,i)}})}function V(e){return x({backend:H(e),...l(`interaction commands`,{plural:!0}),sessions:e.runtimeSessions,signal:g(e.requestId)})}function H(e){let{flags:t,session:n}=e;return{platform:i(n.device),captureSnapshot:async(n,r)=>({snapshot:await e.captureSnapshot(t,{interactiveOnly:r?.interactiveOnly===!0,preferredBackend:r?.preferredBackend,includeRects:r?.includeRects===!0,signal:n.signal,boundCapture:e.touchExecutor?.captureSnapshot??e.gestures?.captureSnapshot})}),...U(e,()=>e.contextFromFlags(t,n.appBundleId,n.trace?.outPath)),...e.confirmOffscreenTargetVisible?{confirmOffscreenTargetVisible:async(t,n,r)=>await e.confirmOffscreenTargetVisible(n,r)}:{},...W(e.touchExecutor,e.expireRefFrame,t)}}function U(e,t){let n=e.gestures,r=e.pairedGestureViewport;return n?{resolveGestureViewport:async()=>r??await n.gestureViewport?.(t()),performGesture:async(r,i)=>(e.expireRefFrame(),G(await n.performPlan(i,t())))}:r?{resolveGestureViewport:async()=>r}:{}}function W(e,t,n){if(!e)return{};let{tapPoint:r,tapRef:i,fillPoint:a,fillRef:o,longPressPoint:s,hoverPoint:c,hoverRef:l}=e,u=async e=>(t(),G(await e()));return{tap:r?(e,t)=>u(()=>r(t,n)):void 0,tapTarget:i?(e,t)=>u(()=>i(t.ref)):void 0,fill:a?(e,t,n,r)=>u(()=>a(t,n,r)):void 0,fillTarget:o?(e,t,n,r)=>u(()=>o(t.ref,n,r)):void 0,longPress:s?(e,t,n)=>u(()=>s(t,n?.durationMs)):void 0,hover:c?(e,t)=>u(()=>c(t)):void 0,hoverTarget:l?(e,t)=>u(()=>l(t.ref)):void 0}}function G(e){return e&&typeof e==`object`?e:void 0}function K(e,t,n){return{ok:!1,error:{code:e,message:t,...n?{details:n}:{}}}}function q(e,t){if(!t||t.settle===!0)return null;let n=[];return t.settleQuietMs!==void 0&&n.push(`--settle-quiet`),n.length===0?null:K(`INVALID_ARGS`,`${e}: ${n.join(`, `)} require${n.length===1?`s`:``} --settle.`)}function J(e){if(e?.settle===!0)return{...e.settleQuietMs===void 0?{}:{quietMs:e.settleQuietMs},...e.timeoutMs===void 0?{}:{timeoutMs:e.timeoutMs}}}function Y(e){try{return X(e),null}catch(e){if(e instanceof n)return K(e.code,e.message,e.details);throw e}}function X(e){let t=e.ref.startsWith(`@`)?e.ref.slice(1):e.ref,{admission:r,scope:i,currentGeneration:a}=e.frame;if(r.admitted)return;let o=r.reason===`plain_ref_requires_complete_frame`&&i!==`all`&&i.has(t)&&a!==void 0?`@${t}~s${a}`:void 0;throw new n(`COMMAND_FAILED`,Q(r.reason,e.ref),{reason:r.reason,ref:e.ref,currentGeneration:a,scope:i===`all`?`all`:Array.from(i),...e.mintedGeneration===void 0?{}:{mintedGeneration:e.mintedGeneration},...o?{suggestedRef:o}:{},hint:o?`Retry with the exact emitted ref ${o}.`:e.staleRefsWarning??Z})}const Z=`Capture a fresh interactive snapshot (snapshot -i) or use a stable selector, then retry.`;function Q(e,t){switch(e){case`ref_frame_expired`:return`Ref ${t} belongs to an expired ref frame — a device action since the snapshot invalidated it`;case`ref_generation_mismatch`:return`Ref ${t} was minted from a superseded snapshot generation`;case`plain_ref_requires_complete_frame`:return`Ref ${t} needs a complete snapshot — the current frame only authorizes its emitted refs`;case`ref_not_issued`:return`Ref ${t} was not issued by the current ref frame`}}export{z as a,O as c,q as i,k as l,Y as n,B as o,J as r,P as s,X as t,E as u};
@@ -1 +1 @@
1
- import{l as e,o as t,p as n}from"./session-snapshot.js";import{s as r}from"./quality-warnings.js";import{a as i,i as a,n as o,o as s,r as c,u as l}from"./interaction-ref-policy.js";import{t as u}from"./backend-snapshot-options.js";async function d(e){let{session:t,flags:n,contextFromFlags:i,options:a}=e,o={...n??{},...u(a)},s=i(o,t.appBundleId,t.trace?.outPath),c=await e.capture({flags:o,options:a,context:s});return r(c.snapshotQuality)||e.publishSnapshot(c),c}const f=async(r,i,a,o,s)=>{let c=a.requireCurrent(r);return await d({session:c,flags:i,contextFromFlags:o,options:s,capture:async({flags:t,options:r,context:i})=>{let{snapshot:a}=await e({device:c.device,session:c,flags:t,outPath:t.out,logPath:i.logPath??``,includeRects:r.includeRects,androidFreshnessMode:r.androidFreshnessMode,signal:r.signal,...r.boundCapture?{captureData:async()=>await r.boundCapture(n({flags:t,session:c,snapshotScope:t.snapshotScope,includeRects:r.includeRects,signal:r.signal,context:i}))}:{}});return a},publishSnapshot:e=>{t(a.requireCurrent(r),e)}})};function p(e){return i({...l(e),captureSnapshotForSession:e.captureSnapshotForSession??f})}async function m(e){return(await import(`./find.js`)).handleFindCommands(e)}async function h(e){let t=l(e);return await(await import(`./interaction2.js`)).handleInteractionCommands({...t,captureSnapshotForSession:e.captureSnapshotForSession??f})}export{l as bindInteractionSession,f as captureSnapshotForSession,p as createInteractionRuntime,s as finalizeTouchInteraction,m as handleFindCommands,h as handleInteractionCommands,c as readSettleRequest,o as refMutationAdmissionResponse,a as settleFlagGuardResponse};
1
+ import{m as e,s as t,u as n}from"./session-snapshot.js";import{s as r}from"./quality-warnings.js";import{a as i,i as a,n as o,o as s,r as c,u as l}from"./interaction-ref-policy.js";import{t as u}from"./backend-snapshot-options.js";async function d(e){let{session:t,flags:n,contextFromFlags:i,options:a}=e,o={...n??{},...u(a)},s=i(o,t.appBundleId,t.trace?.outPath),c=await e.capture({flags:o,options:a,context:s});return r(c.snapshotQuality)||e.publishSnapshot(c),c}const f=async(r,i,a,o,s)=>{let c=a.requireCurrent(r);return await d({session:c,flags:i,contextFromFlags:o,options:s,capture:async({flags:t,options:r,context:i})=>{let{snapshot:a}=await n({device:c.device,session:c,flags:t,logPath:i.logPath??``,includeRects:r.includeRects,androidFreshnessMode:r.androidFreshnessMode,signal:r.signal,...r.boundCapture?{captureData:async()=>await r.boundCapture(e({flags:t,session:c,snapshotScope:t.snapshotScope,includeRects:r.includeRects,signal:r.signal,context:i}))}:{}});return a},publishSnapshot:e=>{t(a.requireCurrent(r),e)}})};function p(e){return i({...l(e),captureSnapshotForSession:e.captureSnapshotForSession??f})}async function m(e){return(await import(`./find.js`)).handleFindCommands(e)}async function h(e){let t=l(e);return await(await import(`./interaction2.js`)).handleInteractionCommands({...t,captureSnapshotForSession:e.captureSnapshotForSession??f})}export{l as bindInteractionSession,f as captureSnapshotForSession,p as createInteractionRuntime,s as finalizeTouchInteraction,m as handleFindCommands,h as handleInteractionCommands,c as readSettleRequest,o as refMutationAdmissionResponse,a as settleFlagGuardResponse};