agent-device 0.20.3 → 0.20.5

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 (140) hide show
  1. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.20.3.apk → agent-device-android-ime-helper-0.20.5.apk} +0 -0
  2. package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.5.apk.sha256 +1 -0
  3. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.20.3.manifest.json → agent-device-android-ime-helper-0.20.5.manifest.json} +4 -4
  4. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.5.apk +0 -0
  5. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.5.apk.sha256 +1 -0
  6. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.20.3.manifest.json → agent-device-android-snapshot-helper-0.20.5.manifest.json} +6 -6
  7. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +57 -4
  8. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +45 -9
  9. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Keyboard.swift +73 -0
  10. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Navigation.swift +1 -0
  11. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScrollGesture.swift +3 -2
  12. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SequenceExecution.swift +1 -1
  13. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedGesturePolicy.swift +8 -2
  14. package/dist/src/agent-browser-tool.js +1 -1
  15. package/dist/src/agent-device-client.js +2 -2
  16. package/dist/src/android-adb.d.ts +1 -1
  17. package/dist/src/android.js +1 -1
  18. package/dist/src/app-helpers.js +1 -1
  19. package/dist/src/app-inventory.d.ts +4 -0
  20. package/dist/src/app-lifecycle.js +7 -7
  21. package/dist/src/app-resolution.js +1 -1
  22. package/dist/src/apps.js +5 -5
  23. package/dist/src/boot-diagnostics.js +1 -1
  24. package/dist/src/cli-config.js +1 -1
  25. package/dist/src/cli-help.js +27 -19
  26. package/dist/src/cli-runner.js +1 -1
  27. package/dist/src/cli.js +15 -14
  28. package/dist/src/client-metro.js +1 -1
  29. package/dist/src/{tv-remote.d.ts → cloud-artifacts.d.ts} +109 -126
  30. package/dist/src/command-metadata.js +1 -1
  31. package/dist/src/command-schema.js +1 -1
  32. package/dist/src/command-surface.js +1 -1
  33. package/dist/src/context.js +1 -1
  34. package/dist/src/contracts.d.ts +1 -1
  35. package/dist/src/debug-symbols.js +4 -4
  36. package/dist/src/device-input-state.d.ts +2 -2
  37. package/dist/src/device-input-state.js +1 -1
  38. package/dist/src/device.js +1 -9
  39. package/dist/src/devices2.js +1 -1
  40. package/dist/src/entities.js +1 -0
  41. package/dist/src/find.js +1 -1
  42. package/dist/src/finders.d.ts +1 -1
  43. package/dist/src/finders.js +1 -1
  44. package/dist/src/generic.js +1 -1
  45. package/dist/src/helper.js +2 -2
  46. package/dist/src/ime-lifecycle.js +9 -0
  47. package/dist/src/index.d.ts +592 -555
  48. package/dist/src/input-actions.js +4 -4
  49. package/dist/src/install-artifact.js +4 -4
  50. package/dist/src/install-artifact2.js +1 -1
  51. package/dist/src/install-source2.js +1 -1
  52. package/dist/src/interaction-snapshot.js +1 -1
  53. package/dist/src/interaction.d.ts +7 -4
  54. package/dist/src/interaction.js +1 -1
  55. package/dist/src/interactor.js +2 -2
  56. package/dist/src/interactor2.js +1 -1
  57. package/dist/src/internal/bin.js +1 -1
  58. package/dist/src/internal/daemon.js +14 -14
  59. package/dist/src/internal/png-worker.js +1 -1
  60. package/dist/src/lease-context.js +1 -1
  61. package/dist/src/lease.js +1 -1
  62. package/dist/src/limrun.d.ts +103 -198
  63. package/dist/src/limrun.js +1 -1
  64. package/dist/src/linux.js +1 -1
  65. package/dist/src/logcat.js +1 -1
  66. package/dist/src/manifest.js +1 -1
  67. package/dist/src/metro.d.ts +1 -1
  68. package/dist/src/parser.js +2 -0
  69. package/dist/src/path-resolution.js +1 -1
  70. package/dist/src/physical-device-control.js +1 -1
  71. package/dist/src/plist-xml.js +1 -0
  72. package/dist/src/plist.js +1 -1
  73. package/dist/src/png-worker-contract.js +1 -1
  74. package/dist/src/process-lock.js +1 -1
  75. package/dist/src/provider-limrun-runtime.js +1 -0
  76. package/dist/src/react-native.js +1 -1
  77. package/dist/src/record-trace.js +1 -1
  78. package/dist/src/register-builtins.js +1 -1
  79. package/dist/src/registry.js +22 -22
  80. package/dist/src/remote-config2.js +1 -1
  81. package/dist/src/reporting.js +7 -7
  82. package/dist/src/runner-client.js +1 -1
  83. package/dist/src/runner-disposal.js +1 -1
  84. package/dist/src/runner-lease.js +1 -1
  85. package/dist/src/runner-provider.js +1 -1
  86. package/dist/src/runner-sequence.js +1 -1
  87. package/dist/src/runtime-transport.js +1 -1
  88. package/dist/src/runtime.js +3 -3
  89. package/dist/src/screenshot-geometry.js +1 -0
  90. package/dist/src/screenshot-result.js +6 -0
  91. package/dist/src/sdk-android-adb.d.ts +5 -6
  92. package/dist/src/sdk-android-adb.js +3 -3
  93. package/dist/src/sdk-batch-runner.d.ts +2 -2
  94. package/dist/src/sdk-batch-runner.js +3 -3
  95. package/dist/src/sdk-contracts.d.ts +21 -25
  96. package/dist/src/sdk-contracts.js +2 -2
  97. package/dist/src/sdk-finders.d.ts +1 -1
  98. package/dist/src/sdk-finders.js +1 -1
  99. package/dist/src/sdk-io.js +1 -1
  100. package/dist/src/sdk-remote-config.d.ts +19 -4
  101. package/dist/src/sdk-remote-config.js +1 -1
  102. package/dist/src/sdk-selectors.js +1 -1
  103. package/dist/src/selector-runtime.js +1 -1
  104. package/dist/src/selector-vocabulary.js +1 -1
  105. package/dist/src/selectors.d.ts +1 -1
  106. package/dist/src/selectors.js +1 -1
  107. package/dist/src/server.js +2 -2
  108. package/dist/src/session-target-evidence.js +1 -1
  109. package/dist/src/session.js +9 -8
  110. package/dist/src/setting-state.js +1 -1
  111. package/dist/src/simulator.js +1 -1
  112. package/dist/src/snapshot.js +1 -1
  113. package/dist/src/snapshot2.js +1 -1
  114. package/dist/src/src.js +1 -0
  115. package/dist/src/tool-provider.js +3 -3
  116. package/dist/src/tool-provider2.js +1 -1
  117. package/dist/src/tool-provider3.js +1 -1
  118. package/dist/src/update-check.js +1 -1
  119. package/dist/src/version.js +1 -1
  120. package/dist/src/viewport-dimension.js +14 -0
  121. package/package.json +21 -9
  122. package/server.json +2 -2
  123. package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.3.apk.sha256 +0 -1
  124. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.3.apk +0 -0
  125. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.3.apk.sha256 +0 -1
  126. package/dist/src/android-input-method-overlays.js +0 -1
  127. package/dist/src/android-input-ownership.js +0 -1
  128. package/dist/src/apple-multitouch-support.js +0 -1
  129. package/dist/src/click-button.d.ts +0 -5
  130. package/dist/src/compatibility-policy.js +0 -1
  131. package/dist/src/gesture-plan-types.js +0 -1
  132. package/dist/src/gesture-plan.js +0 -1
  133. package/dist/src/launch-console.js +0 -1
  134. package/dist/src/recording-export-quality.js +0 -14
  135. package/dist/src/rolldown-runtime.js +0 -1
  136. package/dist/src/runtime2.js +0 -1
  137. package/dist/src/sdk-app-inventory.d.ts +0 -4
  138. package/dist/src/sdk-app-inventory.js +0 -1
  139. package/dist/src/snapshot-diagnostics.js +0 -6
  140. package/dist/src/xml.js +0 -2
@@ -1 +1 @@
1
- import{_ as e,v as t}from"./sdk-contracts.js";import{C as n,b as r}from"./sdk-android-adb.js";import{n as i}from"./path-resolution.js";import{t as a}from"./timeouts.js";import{a as o,n as s,o as c,u as l}from"./host-process.js";import{a as u,c as d,d as f,f as ee,g as te,h as p,i as ne,l as re,m as ie,n as m,o as h,p as g,s as ae,t as oe,u as se}from"./url.js";import{a as ce,i as le,t as ue}from"./runtime-transport.js";import{createHash as de}from"node:crypto";import _ from"node:fs";import v from"node:path";import{fileURLToPath as fe}from"node:url";const y=`companion-tunnel`;function b(e){return de(`sha256`).update(e).digest(`hex`)}function x(e){return e?.trim()?e.trim():void 0}function pe(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e;if(!(typeof t.tenantId!=`string`||typeof t.runId!=`string`||typeof t.leaseId!=`string`))return{tenantId:t.tenantId,runId:t.runId,leaseId:t.leaseId}}function me(e,t){return e.tenantId===t.tenantId&&e.runId===t.runId&&e.leaseId===t.leaseId}function S(e,t,n,r){let i=r??v.join(e,`.agent-device`);if(!n)return{statePath:v.join(i,`${t.slug}.json`),logPath:v.join(i,`${t.slug}.log`)};let a=b(n).slice(0,12),o=v.join(i,t.slug);return{statePath:v.join(o,`${t.slug}-${a}.json`),logPath:v.join(o,`${t.slug}-${a}.log`)}}function C(e){try{let t=JSON.parse(_.readFileSync(e,`utf8`));if(!Number.isInteger(t.pid)||Number(t.pid)<=0||typeof t.serverBaseUrl!=`string`||typeof t.localBaseUrl!=`string`||typeof t.tokenHash!=`string`||t.tokenHash.length===0)return null;let n=Array.isArray(t.consumers)?t.consumers.filter(e=>typeof e==`string`&&e.length>0):[];return{pid:Number(t.pid),startTime:typeof t.startTime==`string`?t.startTime:void 0,command:typeof t.command==`string`?t.command:void 0,serverBaseUrl:t.serverBaseUrl,localBaseUrl:t.localBaseUrl,launchUrl:x(typeof t.launchUrl==`string`?t.launchUrl:void 0),registerPath:x(typeof t.registerPath==`string`?t.registerPath:void 0),unregisterPath:x(typeof t.unregisterPath==`string`?t.unregisterPath:void 0),devicePort:Number.isInteger(t.devicePort)?Number(t.devicePort):void 0,session:x(typeof t.session==`string`?t.session:void 0),bridgeScope:pe(t.bridgeScope),tokenHash:t.tokenHash,consumers:n}}catch{return null}}function w(e,t){_.mkdirSync(v.dirname(e),{recursive:!0}),_.writeFileSync(e,`${JSON.stringify(t,null,2)}\n`,`utf8`)}function he(e){_.mkdirSync(v.dirname(e),{recursive:!0}),_.closeSync(_.openSync(e,`a`))}function ge(e){try{_.unlinkSync(e)}catch{}}function _e(e){try{_.unlinkSync(e)}catch{}}function T(e){try{_.readdirSync(e).length===0&&_.rmdirSync(e)}catch{}}function E(e,t){let n=v.dirname(e.statePath),r=v.dirname(e.logPath);ge(e.statePath),_e(e.logPath),T(n),r!==n&&T(r),v.basename(n)===t.slug&&T(v.dirname(n))}function D(e,t){return e.includes(t.runArg)}function ve(e,t){if(!s(e.pid))return!1;if(e.startTime){let t=c(e.pid);if(!t||t!==e.startTime)return!1}let n=o(e.pid);return!n||!D(n,t.definition)||!e.bridgeScope?!1:e.serverBaseUrl===m(t.serverBaseUrl)&&e.localBaseUrl===m(t.localBaseUrl)&&e.launchUrl===x(t.launchUrl)&&e.registerPath===x(t.registerPath)&&e.unregisterPath===x(t.unregisterPath)&&e.devicePort===t.devicePort&&e.session===x(t.session)&&me(e.bridgeScope,t.bridgeScope)&&e.tokenHash===b(t.bearerToken)}function O(e){return x(e.consumerKey)??x(e.profileKey)??null}function k(e,t){return!t||e.consumers.includes(t)?e:{...e,consumers:[...e.consumers,t]}}function ye(e,t){return t?{...e,consumers:e.consumers.filter(e=>e!==t)}:{...e,consumers:[]}}async function A(e,t){if(!s(e.pid))return;let n=o(e.pid);if(!(!n||!D(n,t))){try{process.kill(e.pid,`SIGTERM`)}catch(e){let t=e.code;if(t===`ESRCH`||t===`EPERM`)return;throw e}if(!await l(e.pid,1e3)){try{process.kill(e.pid,`SIGKILL`)}catch(e){let t=e.code;if(t===`ESRCH`||t===`EPERM`)return;throw e}await l(e.pid,1e3)}}}function be(e,t){let n={...t};return n[ee]=m(e.serverBaseUrl),n[ne]=e.bearerToken,n[ae]=m(e.localBaseUrl),n[ie]=S(e.projectRoot,e.definition,e.profileKey,e.stateDir).statePath,n[f]=e.bridgeScope.tenantId,n[se]=e.bridgeScope.runId,n[re]=e.bridgeScope.leaseId,e.launchUrl?.trim()?n[h]=e.launchUrl.trim():delete n[h],e.registerPath?.trim()?n[d]=e.registerPath.trim():delete n[d],e.unregisterPath?.trim()?n[p]=e.unregisterPath.trim():delete n[p],e.devicePort===void 0?delete n[u]:n[u]=String(e.devicePort),e.session?.trim()?n[g]=e.session.trim():delete n[g],n}function xe(e){let t=fe(import.meta.url),n=v.extname(t)||`.js`,r=[v.join(v.dirname(t),`${y}${n}`),v.join(v.dirname(t),`internal`,`${y}${n}`)].find(e=>_.existsSync(e));if(!r)throw Error(`${e.displayName} entrypoint not found. Rebuild the package to include the companion worker entry.`);return r}function Se(e,t){let n=xe(e.definition),i=n.endsWith(`.ts`)?[`--experimental-strip-types`]:[];_.mkdirSync(v.dirname(t),{recursive:!0});let a=_.openSync(t,`a`),s=0;try{s=r(process.execPath,[...i,n,e.definition.runArg],{env:be(e,e.env??process.env),stdio:[`ignore`,a,a]})}finally{_.closeSync(a)}if(!Number.isInteger(s)||s<=0)throw Error(`Failed to start ${e.definition.displayName} process.`);return{pid:s,startTime:c(s)??void 0,command:o(s)??void 0,serverBaseUrl:m(e.serverBaseUrl),localBaseUrl:m(e.localBaseUrl),launchUrl:x(e.launchUrl),registerPath:x(e.registerPath),unregisterPath:x(e.unregisterPath),devicePort:e.devicePort,session:x(e.session),bridgeScope:e.bridgeScope,tokenHash:b(e.bearerToken),consumers:[]}}async function j(e){let t=O(e),n=S(e.projectRoot,e.definition,e.profileKey,e.stateDir),r=C(n.statePath);if(r&&ve(r,e)){let e=k(r,t);return e!==r&&w(n.statePath,e),{pid:r.pid,spawned:!1,statePath:n.statePath,logPath:n.logPath}}r&&(await A(r,e.definition),E(n,e.definition)),he(n.statePath);let i;try{i=Se(e,n.logPath),w(n.statePath,k(i,t))}catch(t){throw i&&await A(i,e.definition).catch(()=>{}),E(n,e.definition),t}return{pid:i.pid,spawned:!0,statePath:n.statePath,logPath:n.logPath}}async function M(e){let t=O(e),n=S(e.projectRoot,e.definition,e.profileKey,e.stateDir),r=C(n.statePath);if(!r)return E(n,e.definition),{stopped:!1,statePath:n.statePath};let i=ye(r,t);return i.consumers.length>0?(w(n.statePath,i),{stopped:!1,statePath:n.statePath}):(await A(r,e.definition),E(n,e.definition),{stopped:!0,statePath:n.statePath})}const N={slug:`metro-companion`,runArg:te,displayName:`Metro companion`};async function Ce(e){return await j({...e,definition:N,registerPath:e.registerPath??`/api/metro/companion/register`})}async function we(e){return await M({...e,definition:N})}const P=8081,F=`.expo/.virtual-metro-entry.bundle`;function I(t,n){if(t==null||t===``)return n;let r=Number.parseInt(String(t),10);if(!Number.isInteger(r)||r<1||r>65535)throw new e(`INVALID_ARGS`,`Invalid Metro port: ${String(t)}. Use 1-65535.`);return r}function Te(t){let n=R(t.bundleUrl),r=n??t.runtime?.bundleUrl,i=!!n,a=!!R(r),o=ue({metroHost:Ee(t,i,a),metroPort:De(t,i,a),bundleUrl:r});if(!o)throw new e(`INVALID_ARGS`,`Unable to resolve Metro host and port for reload.`);let s=Oe(r);return{reloadUrl:L(o,o.scheme,`${s}/reload`),messageSocketUrl:L(o,o.scheme===`https`?`wss`:`ws`,`${s}/message`)}}function Ee(e,t,n){return R(e.metroHost)??(t?void 0:R(e.runtime?.metroHost))??(n?void 0:`localhost`)}function De(e,t,n){if(e.metroPort!==void 0)return I(e.metroPort,P);if(!t)return e.runtime?.metroPort??(n?void 0:P)}function Oe(e){let t=R(e);if(!t)return``;let n;try{n=new URL(t)}catch{return``}let r=n.pathname.replace(/\/+$/,``),i=`/${F}`;if(r.endsWith(i))return r.slice(0,-i.length);let a=r.lastIndexOf(`/`);return(a>=0?r.slice(a+1):r).endsWith(`.bundle`)&&a>0?r.slice(0,a):``}function L(e,t,n){let r=new URL(`${t}://localhost`);return r.hostname=e.host,r.port=String(e.port),r.pathname=n,r.toString()}function R(e){return typeof e==`string`&&e.trim()?e.trim():void 0}function z(e){return typeof e==`string`&&e.trim()?m(e.trim()):``}function B(e){return typeof e==`string`&&e.trim()?e.trim():void 0}function V(e,t,n){return i(e,{env:t,cwd:n})}function H(e){try{return _.accessSync(e,_.constants.F_OK),!0}catch{return!1}}function ke(e){try{return _.statSync(e).isDirectory()}catch{return!1}}function U(t){let n=v.join(t,`package.json`),r=ce(t);if(!r)throw new e(`INVALID_ARGS`,`package.json not found at ${n}`);return r}const Ae=[{file:`pnpm-lock.yaml`,command:`pnpm`},{file:`yarn.lock`,command:`yarn`},{file:`bun.lock`,command:`bun`},{file:`bun.lockb`,command:`bun`},{file:`package-lock.json`,command:`npm`}];function je(e){let t=e;for(;;){for(let{file:e,command:n}of Ae)if(H(v.join(t,e)))return{command:n,installArgs:[`install`]};if(H(v.join(t,`.git`)))return null;let e=v.dirname(t);if(e===t)return null;t=e}}function Me(e){return je(e)??{command:`npm`,installArgs:[`install`]}}function Ne(e,t){if(t!==`auto`)return t;let n=le(e);return n===`expo`||n===`repack`?n:`react-native`}function W(e,t){return typeof{...e.dependencies??{},...e.devDependencies??{}}[t]==`string`}function G(e,t){return[`js`,`mjs`,`cjs`,`ts`,`mts`,`cts`].some(n=>H(v.join(e,`${t}.config.${n}`)))}function Pe(e,t){return G(e,`rspack`)?`rspack`:G(e,`webpack`)?`webpack`:W(t,`@rspack/core`)?`rspack`:W(t,`webpack`)?`webpack`:`rspack`}function K(e,t,n){if(e==null||e===``)return t;let r=Number.parseInt(String(e),10);return Number.isInteger(r)?Math.max(r,n):t}function Fe(e){return e===`expo`?F:`index.bundle`}function q(e,t,n){return{platform:t,bundleUrl:oe(e,t,Fe(n))}}function J(e,t){return{platform:t,metroHost:B(e?.metro_host),metroPort:e?.metro_port,bundleUrl:B(e?.metro_bundle_url),launchUrl:B(e?.launch_url)}}function Ie(e,t){if(ke(v.join(e,`node_modules`)))return{installed:!1};let r=Me(e);try{n(r.command,r.installArgs,{cwd:e,env:t})}catch(e){throw Le(e,r)}return{installed:!0,packageManager:r.command}}function Le(n,r){let i=t(n),a=`Dependency install failed using detected package manager "${r.command}". If dependencies are already installed (for example via a monorepo root install), pass --no-install-deps to skip this step, or install manually with "${r.command} ${r.installArgs.join(` `)}" from the project root.`;return new e(i.code,i.message,{...i.details??{},hint:a,packageManager:r.command},i)}async function Y(e){await a(e)}async function X(t,n,r={}){try{let e=await fetch(t,{headers:r,signal:AbortSignal.timeout(n)});return{ok:e.ok,status:e.status,body:await e.text()}}catch(r){throw r instanceof Error&&r.name===`TimeoutError`?new e(`COMMAND_FAILED`,`Timed out fetching ${t} after ${n}ms`):r}}async function Re(e,t){try{let n=await X(e,t);return n.ok&&n.body.includes(`packager-status:running`)}catch{return!1}}function ze(e,t,n,r){return e===`expo`?{command:`npx`,installArgs:[`expo`,`start`,`--host`,`lan`,`--port`,String(n)]}:e===`repack`?{command:`npx`,installArgs:[`react-native`,t===`webpack`?`webpack-start`:`rspack-start`,`--host`,r,`--port`,String(n)]}:{command:`npx`,installArgs:[`react-native`,`start`,`--host`,r,`--port`,String(n)]}}function Be(t,n,i,a,o,s,c){let l=ze(n,i,a,o);_.mkdirSync(v.dirname(s),{recursive:!0});let u=_.openSync(s,`a`),d=0;try{d=r(l.command,l.installArgs,{cwd:t,env:c,stdio:[`ignore`,u,u]})}finally{_.closeSync(u)}if(!Number.isInteger(d)||d<=0)throw new e(`COMMAND_FAILED`,`Failed to start React Native dev server. Expected a detached child PID.`);return{pid:d}}async function Ve(e){if(!(!Number.isInteger(e)||e<=0)){try{process.kill(e,`SIGTERM`)}catch(e){let t=e.code;if(t===`ESRCH`||t===`EPERM`)return;throw e}if(!await l(e,1e3)){try{process.kill(e,`SIGKILL`)}catch(e){let t=e.code;if(t===`ESRCH`||t===`EPERM`)return;throw e}await l(e,1e3)}}}function He(e,t){return{Authorization:`Bearer ${t}`,"Content-Type":`application/json`,...e.includes(`ngrok`)?{"ngrok-skip-browser-warning":`1`}:{}}}function Z(t,n){let r=new e(`COMMAND_FAILED`,t);return r.retryable=n,r}function Ue(e,t){return!!(e>=500||e===408||e===425||e===429||JSON.stringify(t).includes(`Metro companion is not connected`))}function We(e){return!!(e&&typeof e==`object`&&`retryable`in e&&e.retryable===!0)}async function Q(e){let t;try{t=await fetch(`${e.baseUrl}/api/metro/bridge`,{method:`POST`,headers:He(e.baseUrl,e.bearerToken),body:JSON.stringify({...e.scope,...e.runtime?{ios_runtime:e.runtime}:{},timeout_ms:e.timeoutMs}),signal:AbortSignal.timeout(e.timeoutMs)})}catch(t){throw t instanceof Error&&t.name===`TimeoutError`?Z(`/api/metro/bridge timed out after ${e.timeoutMs}ms calling ${e.baseUrl}/api/metro/bridge`,!0):Z(t instanceof Error?t.message:String(t),!0)}let n=Ge(await t.text(),t.status,e.baseUrl);if(!t.ok)throw Z(`/api/metro/bridge failed (${t.status}): ${JSON.stringify(n)}`,Ue(t.status,n));return qe(n)}function Ge(e,t,n){if(!e)return{};try{let t=JSON.parse(e);if(!t||typeof t!=`object`||Array.isArray(t))throw Error(`Expected a JSON object`);return t}catch(r){let i=e.slice(0,200);throw Z(`/api/metro/bridge returned invalid JSON (${t}) from ${n}: ${r instanceof Error?r.message:String(r)}. body=${JSON.stringify(i)}`,Ue(t,e))}}function Ke(e){return{enabled:e.enabled,baseUrl:e.base_url,statusUrl:e.status_url??``,bundleUrl:e.bundle_url??``,iosRuntime:J(e.ios_runtime,`ios`),androidRuntime:J(e.android_runtime,`android`),upstream:{bundleUrl:e.upstream.bundle_url??``,host:e.upstream.host??``,port:e.upstream.port??0,statusUrl:e.upstream.status_url??``},probe:{reachable:e.probe.reachable,statusCode:e.probe.status_code,latencyMs:e.probe.latency_ms,detail:e.probe.detail}}}function qe(e){let t=e.data??e;if(!t||typeof t!=`object`||Array.isArray(t))throw Z(`/api/metro/bridge returned malformed descriptor: Expected a JSON object.`,!1);try{return Ke(t)}catch(e){throw Z(`/api/metro/bridge returned malformed descriptor: ${e instanceof Error?e.message:String(e)}`,!1)}}function $(e,t,n,r,i){let a=[`Metro bridge is required for this run but could not be configured via ${e}/api/metro/bridge.`];return t&&a.push(`bridgeError=${t}`),n?.probe.reachable===!1&&a.push(`bridgeProbe=${n.probe.detail||`unreachable (status ${n.probe.statusCode||0})`}`),r&&r!==t&&a.push(`initialBridgeError=${r}`),i&&a.push(`metroCompanionLog=${i}`),a.join(` `)}function Je(t,n){if(!n?.iosRuntime.bundleUrl)throw new e(`COMMAND_FAILED`,$(t,`bridge descriptor is missing ios_runtime.metro_bundle_url`,n))}function Ye(t,n,r){let i=n||B(r.AGENT_DEVICE_METRO_BEARER_TOKEN)||``,a=i||t&&B(r.AGENT_DEVICE_DAEMON_AUTH_TOKEN)||``;if(t&&!a)throw new e(`INVALID_ARGS`,`metro prepare requires proxy auth when --proxy-base-url is provided. Pass --bearer-token or set AGENT_DEVICE_METRO_BEARER_TOKEN or AGENT_DEVICE_DAEMON_AUTH_TOKEN.`);if(!t&&i)throw new e(`INVALID_ARGS`,`metro prepare requires --proxy-base-url when proxy auth is provided.`);return{proxyEnabled:!!(t&&a),proxyBaseUrl:t,proxyBearerToken:a}}function Xe(t){if(!t?.tenantId||!t.runId||!t.leaseId)throw new e(`INVALID_ARGS`,`metro prepare with proxy requires tenantId, runId, and leaseId bridge scope.`);return t}function Ze(t,n){if(!(t||n))throw new e(`INVALID_ARGS`,`metro prepare requires --public-base-url <url> or --proxy-base-url <url>.`)}function Qe(e,t,n){return e.runtimeFilePath?V(e.runtimeFilePath,t,n):null}function $e(e,t,n,r){return V(e.logPath??v.join(r,`.agent-device`,`metro.log`),t,n)}function et(e){let t=e.env??process.env,n=process.cwd(),r=V(e.projectRoot??n,t,n),i=e.kind??`auto`,a=null,o;i===`auto`?(a=U(r),o=Ne(a,i)):o=i;let s=null;o===`repack`&&(a??=U(r),s=Pe(r,a));let c=z(e.publicBaseUrl),l=z(e.proxyBaseUrl);Ze(c,l);let{proxyEnabled:u,proxyBaseUrl:d,proxyBearerToken:f}=Ye(l,B(e.proxyBearerToken)??``,t);return{env:t,projectRoot:r,kind:o,repackBundler:s,metroPort:I(e.metroPort??8081,8081),listenHost:B(e.listenHost)??`0.0.0.0`,statusHost:B(e.statusHost)??`127.0.0.1`,publicBaseUrl:c,proxyBaseUrl:d,proxyBearerToken:f,bridgeScope:u?Xe(e.bridgeScope):null,startupTimeoutMs:K(e.startupTimeoutMs,18e4,3e4),probeTimeoutMs:K(e.probeTimeoutMs,1e4,1e3),reuseExisting:e.reuseExisting??!0,installProjectDeps:e.installDependenciesIfNeeded??!0,runtimeFilePath:Qe(e,t,n),logPath:$e(e,t,n,r)}}async function tt(e,t,n){let r=Date.now()+t;for(;Date.now()<r;){let t=r-Date.now();if(await Re(e,Math.min(n,Math.max(t,1))))return!0;let i=Math.min(500,Math.max(r-Date.now(),0));i>0&&await Y(i)}return!1}async function nt(t){let n=Date.now()+t.startupTimeoutMs,r=null,i=null;for(;Date.now()<n;){try{let e=await Q({baseUrl:t.baseUrl,bearerToken:t.bearerToken,scope:t.scope,runtime:t.runtime,timeoutMs:t.probeTimeoutMs});if(e.probe.reachable!==!1)return e;r=e,i=null}catch(n){if(i=n instanceof Error?n.message:String(n),!We(n))throw new e(`COMMAND_FAILED`,$(t.baseUrl,i,r,t.initialBridgeError,t.companionLogPath),void 0,n)}let a=Math.min(1e3,Math.max(n-Date.now(),0));a>0&&await Y(a)}throw new e(`COMMAND_FAILED`,$(t.baseUrl,i,r,t.initialBridgeError,t.companionLogPath))}async function rt(t){let n=`http://${t.statusHost}:${t.metroPort}/status`;if(t.reuseExisting&&await Re(n,t.probeTimeoutMs))return{started:!1,reused:!0,pid:0,statusUrl:n};let r=Be(t.projectRoot,t.kind,t.repackBundler,t.metroPort,t.listenHost,t.logPath,t.env);if(await tt(n,t.startupTimeoutMs,t.probeTimeoutMs))return{started:!0,reused:!1,pid:r.pid,statusUrl:n};throw await Ve(r.pid).catch(()=>{}),new e(`COMMAND_FAILED`,`React Native dev server did not become ready at ${n} within ${t.startupTimeoutMs}ms. Check ${t.logPath}.`,{logPath:t.logPath})}async function it(e,t){let n=t.bridgeScope;if(!n)return null;let r=null,i=null;try{r=await Q({baseUrl:t.proxyBaseUrl,bearerToken:t.proxyBearerToken,scope:n,timeoutMs:t.probeTimeoutMs})}catch(e){if(!We(e))throw e;i=e instanceof Error?e.message:String(e)}return(!r||r.probe.reachable===!1)&&(r=await at(e,t,n,r,i)),Je(t.proxyBaseUrl,r),r}async function at(t,n,r,i,a){let o;try{o=(await Ce({projectRoot:n.projectRoot,serverBaseUrl:n.proxyBaseUrl,bearerToken:n.proxyBearerToken,bridgeScope:r,localBaseUrl:`http://${n.statusHost}:${n.metroPort}`,launchUrl:B(t.launchUrl),profileKey:B(t.companionProfileKey),consumerKey:B(t.companionConsumerKey),env:n.env})).logPath}catch(t){throw new e(`COMMAND_FAILED`,$(n.proxyBaseUrl,t instanceof Error?t.message:String(t),i,a),void 0,t)}try{return await nt({baseUrl:n.proxyBaseUrl,bearerToken:n.proxyBearerToken,scope:r,probeTimeoutMs:n.probeTimeoutMs,startupTimeoutMs:n.startupTimeoutMs,initialBridgeError:a,companionLogPath:o})}catch(e){throw e instanceof Error?e:Error(String(e))}}function ot(e,t){return{baseIosRuntime:e?q(e,`ios`,t):{platform:`ios`},baseAndroidRuntime:e?q(e,`android`,t):{platform:`android`}}}function st(e,t){e&&(_.mkdirSync(v.dirname(e),{recursive:!0}),_.writeFileSync(e,JSON.stringify(t,null,2)))}async function ct(e={}){let t=et(e),n=t.installProjectDeps?Ie(t.projectRoot,t.env):{installed:!1},r=await rt(t),{baseIosRuntime:i,baseAndroidRuntime:a}=ot(t.publicBaseUrl,t.kind),o=await it(e,t),s=o?.iosRuntime??i,c=o?.androidRuntime??a,l={projectRoot:t.projectRoot,kind:t.kind,dependenciesInstalled:n.installed,packageManager:n.packageManager??null,started:r.started,reused:r.reused,pid:r.pid,logPath:t.logPath,statusUrl:r.statusUrl,runtimeFilePath:t.runtimeFilePath,iosRuntime:s,androidRuntime:c,bridge:o};return st(t.runtimeFilePath,l),l}function lt(e){let t=e.trimStart().slice(0,15).toLowerCase();return t.startsWith(`<!doctype`)||t.startsWith(`<html`)}async function ut(t,n){await new Promise((r,i)=>{let a=new WebSocket(t),o=t=>{clearTimeout(s);try{a.close()}catch{}i(new e(`COMMAND_FAILED`,t))},s=setTimeout(()=>{o(`Timed out broadcasting reload to ${t} after ${n}ms`)},n);a.addEventListener(`open`,()=>{a.send(JSON.stringify({version:2,method:`reload`}));let e=()=>{if(a.bufferedAmount===0){clearTimeout(s),a.close(),r();return}setTimeout(e,20)};e()}),a.addEventListener(`error`,()=>{o(`Failed to reach the dev server message socket at ${t}`)})})}async function dt(t={}){let n=K(t.timeoutMs,1e4,1e3),{reloadUrl:r,messageSocketUrl:i}=Te(t),a=await X(r,n);if(a.ok&&!lt(a.body))return{reloaded:!0,reloadUrl:r,status:a.status,body:a.body,transport:`http`};try{await ut(i,n)}catch(t){throw new e(`COMMAND_FAILED`,`React Native dev server reload failed (${a.status}).`,{reloadUrl:r,status:a.status,body:a.body.slice(0,500),messageSocketUrl:i,hint:`Verify Metro or Re.Pack is running and the target React Native app is connected to this dev server instance.`},t instanceof Error?t:void 0)}return{reloaded:!0,reloadUrl:i,status:a.status,body:``,transport:`message-socket`}}export{M as a,j as i,dt as n,we as r,ct as t};
1
+ import{_ as e,v as t}from"./sdk-contracts.js";import{C as n,b as r}from"./sdk-android-adb.js";import{n as i}from"./path-resolution.js";import{t as a}from"./timeouts.js";import{a as o,n as s,o as c,u as l}from"./host-process.js";import{a as u,c as d,d as f,f as ee,g as te,h as p,i as ne,l as re,m as ie,n as m,o as h,p as g,s as ae,t as oe,u as se}from"./url.js";import{a as ce,i as le,t as ue}from"./runtime-transport.js";import _ from"node:path";import{createHash as de}from"node:crypto";import v from"node:fs";import{fileURLToPath as fe}from"node:url";const y=`companion-tunnel`;function b(e){return de(`sha256`).update(e).digest(`hex`)}function x(e){return e?.trim()?e.trim():void 0}function pe(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e;if(!(typeof t.tenantId!=`string`||typeof t.runId!=`string`||typeof t.leaseId!=`string`))return{tenantId:t.tenantId,runId:t.runId,leaseId:t.leaseId}}function me(e,t){return e.tenantId===t.tenantId&&e.runId===t.runId&&e.leaseId===t.leaseId}function S(e,t,n,r){let i=r??_.join(e,`.agent-device`);if(!n)return{statePath:_.join(i,`${t.slug}.json`),logPath:_.join(i,`${t.slug}.log`)};let a=b(n).slice(0,12),o=_.join(i,t.slug);return{statePath:_.join(o,`${t.slug}-${a}.json`),logPath:_.join(o,`${t.slug}-${a}.log`)}}function C(e){try{let t=JSON.parse(v.readFileSync(e,`utf8`));if(!Number.isInteger(t.pid)||Number(t.pid)<=0||typeof t.serverBaseUrl!=`string`||typeof t.localBaseUrl!=`string`||typeof t.tokenHash!=`string`||t.tokenHash.length===0)return null;let n=Array.isArray(t.consumers)?t.consumers.filter(e=>typeof e==`string`&&e.length>0):[];return{pid:Number(t.pid),startTime:typeof t.startTime==`string`?t.startTime:void 0,command:typeof t.command==`string`?t.command:void 0,serverBaseUrl:t.serverBaseUrl,localBaseUrl:t.localBaseUrl,launchUrl:x(typeof t.launchUrl==`string`?t.launchUrl:void 0),registerPath:x(typeof t.registerPath==`string`?t.registerPath:void 0),unregisterPath:x(typeof t.unregisterPath==`string`?t.unregisterPath:void 0),devicePort:Number.isInteger(t.devicePort)?Number(t.devicePort):void 0,session:x(typeof t.session==`string`?t.session:void 0),bridgeScope:pe(t.bridgeScope),tokenHash:t.tokenHash,consumers:n}}catch{return null}}function w(e,t){v.mkdirSync(_.dirname(e),{recursive:!0}),v.writeFileSync(e,`${JSON.stringify(t,null,2)}\n`,`utf8`)}function he(e){v.mkdirSync(_.dirname(e),{recursive:!0}),v.closeSync(v.openSync(e,`a`))}function ge(e){try{v.unlinkSync(e)}catch{}}function _e(e){try{v.unlinkSync(e)}catch{}}function T(e){try{v.readdirSync(e).length===0&&v.rmdirSync(e)}catch{}}function E(e,t){let n=_.dirname(e.statePath),r=_.dirname(e.logPath);ge(e.statePath),_e(e.logPath),T(n),r!==n&&T(r),_.basename(n)===t.slug&&T(_.dirname(n))}function D(e,t){return e.includes(t.runArg)}function ve(e,t){if(!s(e.pid))return!1;if(e.startTime){let t=c(e.pid);if(!t||t!==e.startTime)return!1}let n=o(e.pid);return!n||!D(n,t.definition)||!e.bridgeScope?!1:e.serverBaseUrl===m(t.serverBaseUrl)&&e.localBaseUrl===m(t.localBaseUrl)&&e.launchUrl===x(t.launchUrl)&&e.registerPath===x(t.registerPath)&&e.unregisterPath===x(t.unregisterPath)&&e.devicePort===t.devicePort&&e.session===x(t.session)&&me(e.bridgeScope,t.bridgeScope)&&e.tokenHash===b(t.bearerToken)}function O(e){return x(e.consumerKey)??x(e.profileKey)??null}function k(e,t){return!t||e.consumers.includes(t)?e:{...e,consumers:[...e.consumers,t]}}function ye(e,t){return t?{...e,consumers:e.consumers.filter(e=>e!==t)}:{...e,consumers:[]}}async function A(e,t){if(!s(e.pid))return;let n=o(e.pid);if(!(!n||!D(n,t))){try{process.kill(e.pid,`SIGTERM`)}catch(e){let t=e.code;if(t===`ESRCH`||t===`EPERM`)return;throw e}if(!await l(e.pid,1e3)){try{process.kill(e.pid,`SIGKILL`)}catch(e){let t=e.code;if(t===`ESRCH`||t===`EPERM`)return;throw e}await l(e.pid,1e3)}}}function be(e,t){let n={...t};return n[ee]=m(e.serverBaseUrl),n[ne]=e.bearerToken,n[ae]=m(e.localBaseUrl),n[ie]=S(e.projectRoot,e.definition,e.profileKey,e.stateDir).statePath,n[f]=e.bridgeScope.tenantId,n[se]=e.bridgeScope.runId,n[re]=e.bridgeScope.leaseId,e.launchUrl?.trim()?n[h]=e.launchUrl.trim():delete n[h],e.registerPath?.trim()?n[d]=e.registerPath.trim():delete n[d],e.unregisterPath?.trim()?n[p]=e.unregisterPath.trim():delete n[p],e.devicePort===void 0?delete n[u]:n[u]=String(e.devicePort),e.session?.trim()?n[g]=e.session.trim():delete n[g],n}function xe(e){let t=fe(import.meta.url),n=_.extname(t)||`.js`,r=[_.join(_.dirname(t),`${y}${n}`),_.join(_.dirname(t),`internal`,`${y}${n}`)].find(e=>v.existsSync(e));if(!r)throw Error(`${e.displayName} entrypoint not found. Rebuild the package to include the companion worker entry.`);return r}function Se(e,t){let n=xe(e.definition),i=n.endsWith(`.ts`)?[`--experimental-strip-types`]:[];v.mkdirSync(_.dirname(t),{recursive:!0});let a=v.openSync(t,`a`),s=0;try{s=r(process.execPath,[...i,n,e.definition.runArg],{env:be(e,e.env??process.env),stdio:[`ignore`,a,a]})}finally{v.closeSync(a)}if(!Number.isInteger(s)||s<=0)throw Error(`Failed to start ${e.definition.displayName} process.`);return{pid:s,startTime:c(s)??void 0,command:o(s)??void 0,serverBaseUrl:m(e.serverBaseUrl),localBaseUrl:m(e.localBaseUrl),launchUrl:x(e.launchUrl),registerPath:x(e.registerPath),unregisterPath:x(e.unregisterPath),devicePort:e.devicePort,session:x(e.session),bridgeScope:e.bridgeScope,tokenHash:b(e.bearerToken),consumers:[]}}async function j(e){let t=O(e),n=S(e.projectRoot,e.definition,e.profileKey,e.stateDir),r=C(n.statePath);if(r&&ve(r,e)){let e=k(r,t);return e!==r&&w(n.statePath,e),{pid:r.pid,spawned:!1,statePath:n.statePath,logPath:n.logPath}}r&&(await A(r,e.definition),E(n,e.definition)),he(n.statePath);let i;try{i=Se(e,n.logPath),w(n.statePath,k(i,t))}catch(t){throw i&&await A(i,e.definition).catch(()=>{}),E(n,e.definition),t}return{pid:i.pid,spawned:!0,statePath:n.statePath,logPath:n.logPath}}async function M(e){let t=O(e),n=S(e.projectRoot,e.definition,e.profileKey,e.stateDir),r=C(n.statePath);if(!r)return E(n,e.definition),{stopped:!1,statePath:n.statePath};let i=ye(r,t);return i.consumers.length>0?(w(n.statePath,i),{stopped:!1,statePath:n.statePath}):(await A(r,e.definition),E(n,e.definition),{stopped:!0,statePath:n.statePath})}const N={slug:`metro-companion`,runArg:te,displayName:`Metro companion`};async function Ce(e){return await j({...e,definition:N,registerPath:e.registerPath??`/api/metro/companion/register`})}async function we(e){return await M({...e,definition:N})}const P=8081,F=`.expo/.virtual-metro-entry.bundle`;function I(t,n){if(t==null||t===``)return n;let r=Number.parseInt(String(t),10);if(!Number.isInteger(r)||r<1||r>65535)throw new e(`INVALID_ARGS`,`Invalid Metro port: ${String(t)}. Use 1-65535.`);return r}function Te(t){let n=R(t.bundleUrl),r=n??t.runtime?.bundleUrl,i=!!n,a=!!R(r),o=ue({metroHost:Ee(t,i,a),metroPort:De(t,i,a),bundleUrl:r});if(!o)throw new e(`INVALID_ARGS`,`Unable to resolve Metro host and port for reload.`);let s=Oe(r);return{reloadUrl:L(o,o.scheme,`${s}/reload`),messageSocketUrl:L(o,o.scheme===`https`?`wss`:`ws`,`${s}/message`)}}function Ee(e,t,n){return R(e.metroHost)??(t?void 0:R(e.runtime?.metroHost))??(n?void 0:`localhost`)}function De(e,t,n){if(e.metroPort!==void 0)return I(e.metroPort,P);if(!t)return e.runtime?.metroPort??(n?void 0:P)}function Oe(e){let t=R(e);if(!t)return``;let n;try{n=new URL(t)}catch{return``}let r=n.pathname.replace(/\/+$/,``),i=`/${F}`;if(r.endsWith(i))return r.slice(0,-i.length);let a=r.lastIndexOf(`/`);return(a>=0?r.slice(a+1):r).endsWith(`.bundle`)&&a>0?r.slice(0,a):``}function L(e,t,n){let r=new URL(`${t}://localhost`);return r.hostname=e.host,r.port=String(e.port),r.pathname=n,r.toString()}function R(e){return typeof e==`string`&&e.trim()?e.trim():void 0}function z(e){return typeof e==`string`&&e.trim()?m(e.trim()):``}function B(e){return typeof e==`string`&&e.trim()?e.trim():void 0}function V(e,t,n){return i(e,{env:t,cwd:n})}function H(e){try{return v.accessSync(e,v.constants.F_OK),!0}catch{return!1}}function ke(e){try{return v.statSync(e).isDirectory()}catch{return!1}}function U(t){let n=_.join(t,`package.json`),r=ce(t);if(!r)throw new e(`INVALID_ARGS`,`package.json not found at ${n}`);return r}const Ae=[{file:`pnpm-lock.yaml`,command:`pnpm`},{file:`yarn.lock`,command:`yarn`},{file:`bun.lock`,command:`bun`},{file:`bun.lockb`,command:`bun`},{file:`package-lock.json`,command:`npm`}];function je(e){let t=e;for(;;){for(let{file:e,command:n}of Ae)if(H(_.join(t,e)))return{command:n,installArgs:[`install`]};if(H(_.join(t,`.git`)))return null;let e=_.dirname(t);if(e===t)return null;t=e}}function Me(e){return je(e)??{command:`npm`,installArgs:[`install`]}}function Ne(e,t){if(t!==`auto`)return t;let n=le(e);return n===`expo`||n===`repack`?n:`react-native`}function W(e,t){return typeof{...e.dependencies??{},...e.devDependencies??{}}[t]==`string`}function G(e,t){return[`js`,`mjs`,`cjs`,`ts`,`mts`,`cts`].some(n=>H(_.join(e,`${t}.config.${n}`)))}function Pe(e,t){return G(e,`rspack`)?`rspack`:G(e,`webpack`)?`webpack`:W(t,`@rspack/core`)?`rspack`:W(t,`webpack`)?`webpack`:`rspack`}function K(e,t,n){if(e==null||e===``)return t;let r=Number.parseInt(String(e),10);return Number.isInteger(r)?Math.max(r,n):t}function Fe(e){return e===`expo`?F:`index.bundle`}function q(e,t,n){return{platform:t,bundleUrl:oe(e,t,Fe(n))}}function J(e,t){return{platform:t,metroHost:B(e?.metro_host),metroPort:e?.metro_port,bundleUrl:B(e?.metro_bundle_url),launchUrl:B(e?.launch_url)}}function Ie(e,t){if(ke(_.join(e,`node_modules`)))return{installed:!1};let r=Me(e);try{n(r.command,r.installArgs,{cwd:e,env:t})}catch(e){throw Le(e,r)}return{installed:!0,packageManager:r.command}}function Le(n,r){let i=t(n),a=`Dependency install failed using detected package manager "${r.command}". If dependencies are already installed (for example via a monorepo root install), pass --no-install-deps to skip this step, or install manually with "${r.command} ${r.installArgs.join(` `)}" from the project root.`;return new e(i.code,i.message,{...i.details??{},hint:a,packageManager:r.command},i)}async function Y(e){await a(e)}async function X(t,n,r={}){try{let e=await fetch(t,{headers:r,signal:AbortSignal.timeout(n)});return{ok:e.ok,status:e.status,body:await e.text()}}catch(r){throw r instanceof Error&&r.name===`TimeoutError`?new e(`COMMAND_FAILED`,`Timed out fetching ${t} after ${n}ms`):r}}async function Re(e,t){try{let n=await X(e,t);return n.ok&&n.body.includes(`packager-status:running`)}catch{return!1}}function ze(e,t,n,r){return e===`expo`?{command:`npx`,installArgs:[`expo`,`start`,`--host`,`lan`,`--port`,String(n)]}:e===`repack`?{command:`npx`,installArgs:[`react-native`,t===`webpack`?`webpack-start`:`rspack-start`,`--host`,r,`--port`,String(n)]}:{command:`npx`,installArgs:[`react-native`,`start`,`--host`,r,`--port`,String(n)]}}function Be(t,n,i,a,o,s,c){let l=ze(n,i,a,o);v.mkdirSync(_.dirname(s),{recursive:!0});let u=v.openSync(s,`a`),d=0;try{d=r(l.command,l.installArgs,{cwd:t,env:c,stdio:[`ignore`,u,u]})}finally{v.closeSync(u)}if(!Number.isInteger(d)||d<=0)throw new e(`COMMAND_FAILED`,`Failed to start React Native dev server. Expected a detached child PID.`);return{pid:d}}async function Ve(e){if(!(!Number.isInteger(e)||e<=0)){try{process.kill(e,`SIGTERM`)}catch(e){let t=e.code;if(t===`ESRCH`||t===`EPERM`)return;throw e}if(!await l(e,1e3)){try{process.kill(e,`SIGKILL`)}catch(e){let t=e.code;if(t===`ESRCH`||t===`EPERM`)return;throw e}await l(e,1e3)}}}function He(e,t){return{Authorization:`Bearer ${t}`,"Content-Type":`application/json`,...e.includes(`ngrok`)?{"ngrok-skip-browser-warning":`1`}:{}}}function Z(t,n){let r=new e(`COMMAND_FAILED`,t);return r.retryable=n,r}function Ue(e,t){return!!(e>=500||e===408||e===425||e===429||JSON.stringify(t).includes(`Metro companion is not connected`))}function We(e){return!!(e&&typeof e==`object`&&`retryable`in e&&e.retryable===!0)}async function Q(e){let t;try{t=await fetch(`${e.baseUrl}/api/metro/bridge`,{method:`POST`,headers:He(e.baseUrl,e.bearerToken),body:JSON.stringify({...e.scope,...e.runtime?{ios_runtime:e.runtime}:{},timeout_ms:e.timeoutMs}),signal:AbortSignal.timeout(e.timeoutMs)})}catch(t){throw t instanceof Error&&t.name===`TimeoutError`?Z(`/api/metro/bridge timed out after ${e.timeoutMs}ms calling ${e.baseUrl}/api/metro/bridge`,!0):Z(t instanceof Error?t.message:String(t),!0)}let n=Ge(await t.text(),t.status,e.baseUrl);if(!t.ok)throw Z(`/api/metro/bridge failed (${t.status}): ${JSON.stringify(n)}`,Ue(t.status,n));return qe(n)}function Ge(e,t,n){if(!e)return{};try{let t=JSON.parse(e);if(!t||typeof t!=`object`||Array.isArray(t))throw Error(`Expected a JSON object`);return t}catch(r){let i=e.slice(0,200);throw Z(`/api/metro/bridge returned invalid JSON (${t}) from ${n}: ${r instanceof Error?r.message:String(r)}. body=${JSON.stringify(i)}`,Ue(t,e))}}function Ke(e){return{enabled:e.enabled,baseUrl:e.base_url,statusUrl:e.status_url??``,bundleUrl:e.bundle_url??``,iosRuntime:J(e.ios_runtime,`ios`),androidRuntime:J(e.android_runtime,`android`),upstream:{bundleUrl:e.upstream.bundle_url??``,host:e.upstream.host??``,port:e.upstream.port??0,statusUrl:e.upstream.status_url??``},probe:{reachable:e.probe.reachable,statusCode:e.probe.status_code,latencyMs:e.probe.latency_ms,detail:e.probe.detail}}}function qe(e){let t=e.data??e;if(!t||typeof t!=`object`||Array.isArray(t))throw Z(`/api/metro/bridge returned malformed descriptor: Expected a JSON object.`,!1);try{return Ke(t)}catch(e){throw Z(`/api/metro/bridge returned malformed descriptor: ${e instanceof Error?e.message:String(e)}`,!1)}}function $(e,t,n,r,i){let a=[`Metro bridge is required for this run but could not be configured via ${e}/api/metro/bridge.`];return t&&a.push(`bridgeError=${t}`),n?.probe.reachable===!1&&a.push(`bridgeProbe=${n.probe.detail||`unreachable (status ${n.probe.statusCode||0})`}`),r&&r!==t&&a.push(`initialBridgeError=${r}`),i&&a.push(`metroCompanionLog=${i}`),a.join(` `)}function Je(t,n){if(!n?.iosRuntime.bundleUrl)throw new e(`COMMAND_FAILED`,$(t,`bridge descriptor is missing ios_runtime.metro_bundle_url`,n))}function Ye(t,n,r){let i=n||B(r.AGENT_DEVICE_METRO_BEARER_TOKEN)||``,a=i||t&&B(r.AGENT_DEVICE_DAEMON_AUTH_TOKEN)||``;if(t&&!a)throw new e(`INVALID_ARGS`,`metro prepare requires proxy auth when --proxy-base-url is provided. Pass --bearer-token or set AGENT_DEVICE_METRO_BEARER_TOKEN or AGENT_DEVICE_DAEMON_AUTH_TOKEN.`);if(!t&&i)throw new e(`INVALID_ARGS`,`metro prepare requires --proxy-base-url when proxy auth is provided.`);return{proxyEnabled:!!(t&&a),proxyBaseUrl:t,proxyBearerToken:a}}function Xe(t){if(!t?.tenantId||!t.runId||!t.leaseId)throw new e(`INVALID_ARGS`,`metro prepare with proxy requires tenantId, runId, and leaseId bridge scope.`);return t}function Ze(t,n){if(!(t||n))throw new e(`INVALID_ARGS`,`metro prepare requires --public-base-url <url> or --proxy-base-url <url>.`)}function Qe(e,t,n){return e.runtimeFilePath?V(e.runtimeFilePath,t,n):null}function $e(e,t,n,r){return V(e.logPath??_.join(r,`.agent-device`,`metro.log`),t,n)}function et(e){let t=e.env??process.env,n=process.cwd(),r=V(e.projectRoot??n,t,n),i=e.kind??`auto`,a=null,o;i===`auto`?(a=U(r),o=Ne(a,i)):o=i;let s=null;o===`repack`&&(a??=U(r),s=Pe(r,a));let c=z(e.publicBaseUrl),l=z(e.proxyBaseUrl);Ze(c,l);let{proxyEnabled:u,proxyBaseUrl:d,proxyBearerToken:f}=Ye(l,B(e.proxyBearerToken)??``,t);return{env:t,projectRoot:r,kind:o,repackBundler:s,metroPort:I(e.metroPort??8081,8081),listenHost:B(e.listenHost)??`0.0.0.0`,statusHost:B(e.statusHost)??`127.0.0.1`,publicBaseUrl:c,proxyBaseUrl:d,proxyBearerToken:f,bridgeScope:u?Xe(e.bridgeScope):null,startupTimeoutMs:K(e.startupTimeoutMs,18e4,3e4),probeTimeoutMs:K(e.probeTimeoutMs,1e4,1e3),reuseExisting:e.reuseExisting??!0,installProjectDeps:e.installDependenciesIfNeeded??!0,runtimeFilePath:Qe(e,t,n),logPath:$e(e,t,n,r)}}async function tt(e,t,n){let r=Date.now()+t;for(;Date.now()<r;){let t=r-Date.now();if(await Re(e,Math.min(n,Math.max(t,1))))return!0;let i=Math.min(500,Math.max(r-Date.now(),0));i>0&&await Y(i)}return!1}async function nt(t){let n=Date.now()+t.startupTimeoutMs,r=null,i=null;for(;Date.now()<n;){try{let e=await Q({baseUrl:t.baseUrl,bearerToken:t.bearerToken,scope:t.scope,runtime:t.runtime,timeoutMs:t.probeTimeoutMs});if(e.probe.reachable!==!1)return e;r=e,i=null}catch(n){if(i=n instanceof Error?n.message:String(n),!We(n))throw new e(`COMMAND_FAILED`,$(t.baseUrl,i,r,t.initialBridgeError,t.companionLogPath),void 0,n)}let a=Math.min(1e3,Math.max(n-Date.now(),0));a>0&&await Y(a)}throw new e(`COMMAND_FAILED`,$(t.baseUrl,i,r,t.initialBridgeError,t.companionLogPath))}async function rt(t){let n=`http://${t.statusHost}:${t.metroPort}/status`;if(t.reuseExisting&&await Re(n,t.probeTimeoutMs))return{started:!1,reused:!0,pid:0,statusUrl:n};let r=Be(t.projectRoot,t.kind,t.repackBundler,t.metroPort,t.listenHost,t.logPath,t.env);if(await tt(n,t.startupTimeoutMs,t.probeTimeoutMs))return{started:!0,reused:!1,pid:r.pid,statusUrl:n};throw await Ve(r.pid).catch(()=>{}),new e(`COMMAND_FAILED`,`React Native dev server did not become ready at ${n} within ${t.startupTimeoutMs}ms. Check ${t.logPath}.`,{logPath:t.logPath})}async function it(e,t){let n=t.bridgeScope;if(!n)return null;let r=null,i=null;try{r=await Q({baseUrl:t.proxyBaseUrl,bearerToken:t.proxyBearerToken,scope:n,timeoutMs:t.probeTimeoutMs})}catch(e){if(!We(e))throw e;i=e instanceof Error?e.message:String(e)}return(!r||r.probe.reachable===!1)&&(r=await at(e,t,n,r,i)),Je(t.proxyBaseUrl,r),r}async function at(t,n,r,i,a){let o;try{o=(await Ce({projectRoot:n.projectRoot,serverBaseUrl:n.proxyBaseUrl,bearerToken:n.proxyBearerToken,bridgeScope:r,localBaseUrl:`http://${n.statusHost}:${n.metroPort}`,launchUrl:B(t.launchUrl),profileKey:B(t.companionProfileKey),consumerKey:B(t.companionConsumerKey),env:n.env})).logPath}catch(t){throw new e(`COMMAND_FAILED`,$(n.proxyBaseUrl,t instanceof Error?t.message:String(t),i,a),void 0,t)}try{return await nt({baseUrl:n.proxyBaseUrl,bearerToken:n.proxyBearerToken,scope:r,probeTimeoutMs:n.probeTimeoutMs,startupTimeoutMs:n.startupTimeoutMs,initialBridgeError:a,companionLogPath:o})}catch(e){throw e instanceof Error?e:Error(String(e))}}function ot(e,t){return{baseIosRuntime:e?q(e,`ios`,t):{platform:`ios`},baseAndroidRuntime:e?q(e,`android`,t):{platform:`android`}}}function st(e,t){e&&(v.mkdirSync(_.dirname(e),{recursive:!0}),v.writeFileSync(e,JSON.stringify(t,null,2)))}async function ct(e={}){let t=et(e),n=t.installProjectDeps?Ie(t.projectRoot,t.env):{installed:!1},r=await rt(t),{baseIosRuntime:i,baseAndroidRuntime:a}=ot(t.publicBaseUrl,t.kind),o=await it(e,t),s=o?.iosRuntime??i,c=o?.androidRuntime??a,l={projectRoot:t.projectRoot,kind:t.kind,dependenciesInstalled:n.installed,packageManager:n.packageManager??null,started:r.started,reused:r.reused,pid:r.pid,logPath:t.logPath,statusUrl:r.statusUrl,runtimeFilePath:t.runtimeFilePath,iosRuntime:s,androidRuntime:c,bridge:o};return st(t.runtimeFilePath,l),l}function lt(e){let t=e.trimStart().slice(0,15).toLowerCase();return t.startsWith(`<!doctype`)||t.startsWith(`<html`)}async function ut(t,n){await new Promise((r,i)=>{let a=new WebSocket(t),o=t=>{clearTimeout(s);try{a.close()}catch{}i(new e(`COMMAND_FAILED`,t))},s=setTimeout(()=>{o(`Timed out broadcasting reload to ${t} after ${n}ms`)},n);a.addEventListener(`open`,()=>{a.send(JSON.stringify({version:2,method:`reload`}));let e=()=>{if(a.bufferedAmount===0){clearTimeout(s),a.close(),r();return}setTimeout(e,20)};e()}),a.addEventListener(`error`,()=>{o(`Failed to reach the dev server message socket at ${t}`)})})}async function dt(t={}){let n=K(t.timeoutMs,1e4,1e3),{reloadUrl:r,messageSocketUrl:i}=Te(t),a=await X(r,n);if(a.ok&&!lt(a.body))return{reloaded:!0,reloadUrl:r,status:a.status,body:a.body,transport:`http`};try{await ut(i,n)}catch(t){throw new e(`COMMAND_FAILED`,`React Native dev server reload failed (${a.status}).`,{reloadUrl:r,status:a.status,body:a.body.slice(0,500),messageSocketUrl:i,hint:`Verify Metro or Re.Pack is running and the target React Native app is connected to this dev server instance.`},t instanceof Error?t:void 0)}return{reloaded:!0,reloadUrl:i,status:a.status,body:``,transport:`message-socket`}}export{M as a,j as i,dt as n,we as r,ct as t};
@@ -1,61 +1,71 @@
1
- import { M as SnapshotQualityVerdict, O as ScreenshotOverlayRef, U as PublicPlatform, n as DaemonArtifactType } from "./sdk-contracts.js";
2
- import { h as AndroidSnapshotHelperTransport, m as AndroidSnapshotHelperInstallReason, p as AndroidSnapshotCaptureMode } from "./sdk-android-adb.js";
3
- //#region src/contracts/json.d.ts
4
- type JsonPrimitive = string | number | boolean | null;
5
- type JsonValue = JsonPrimitive | JsonObject | JsonValue[];
6
- type JsonObject = {
7
- [key: string]: JsonValue;
8
- };
1
+ import { A as SnapshotNode, M as SnapshotQualityVerdict, N as SnapshotState, O as ScreenshotOverlayRef, U as PublicPlatform, n as DaemonArtifactType } from "./sdk-contracts.js";
2
+ //#region packages/contracts/src/back-mode.d.ts
3
+ declare const BACK_MODES: readonly ['in-app', 'system'];
4
+ type BackMode = (typeof BACK_MODES)[number];
9
5
  //#endregion
10
- //#region src/contracts/session-surface.d.ts
11
- declare const SESSION_SURFACES: readonly ['app', 'frontmost-app', 'desktop', 'menubar'];
12
- type SessionSurface = (typeof SESSION_SURFACES)[number];
6
+ //#region packages/contracts/src/device-rotation.d.ts
7
+ declare const DEVICE_ROTATIONS: readonly ['portrait', 'portrait-upside-down', 'landscape-left', 'landscape-right'];
8
+ type DeviceRotation = (typeof DEVICE_ROTATIONS)[number];
13
9
  //#endregion
14
- //#region src/platforms/android/snapshot-types.d.ts
15
- type AndroidSnapshotBackendMetadata = {
16
- backend: 'android-helper';
17
- helperVersion?: string;
18
- helperApiVersion?: string;
19
- helperTransport?: AndroidSnapshotHelperTransport;
20
- helperSessionReused?: boolean;
21
- installReason?: AndroidSnapshotHelperInstallReason;
22
- waitForIdleTimeoutMs?: number;
23
- waitForIdleQuietMs?: number;
24
- timeoutMs?: number;
25
- maxDepth?: number;
26
- maxNodes?: number;
27
- rootPresent?: boolean;
28
- captureMode?: AndroidSnapshotCaptureMode;
29
- systemSurfaceOnly?: boolean;
30
- windowCount?: number;
31
- nodeCount?: number;
32
- helperTruncated?: boolean;
33
- elapsedMs?: number;
10
+ //#region packages/contracts/src/tv-remote.d.ts
11
+ declare const TV_REMOTE_BUTTON_DEFINITIONS: {
12
+ readonly up: {
13
+ readonly aliases: readonly [];
14
+ readonly androidKeyevent: 'KEYCODE_DPAD_UP';
15
+ readonly appleRemoteButton: 'up';
16
+ readonly vegaKey: 'KEY_UP';
17
+ };
18
+ readonly down: {
19
+ readonly aliases: readonly [];
20
+ readonly androidKeyevent: 'KEYCODE_DPAD_DOWN';
21
+ readonly appleRemoteButton: 'down';
22
+ readonly vegaKey: 'KEY_DOWN';
23
+ };
24
+ readonly left: {
25
+ readonly aliases: readonly [];
26
+ readonly androidKeyevent: 'KEYCODE_DPAD_LEFT';
27
+ readonly appleRemoteButton: 'left';
28
+ readonly vegaKey: 'KEY_LEFT';
29
+ };
30
+ readonly right: {
31
+ readonly aliases: readonly [];
32
+ readonly androidKeyevent: 'KEYCODE_DPAD_RIGHT';
33
+ readonly appleRemoteButton: 'right';
34
+ readonly vegaKey: 'KEY_RIGHT';
35
+ };
36
+ readonly select: {
37
+ readonly aliases: readonly ["ok", "center", "enter"];
38
+ readonly androidKeyevent: 'KEYCODE_DPAD_CENTER';
39
+ readonly appleRemoteButton: 'select';
40
+ readonly vegaKey: 'KEY_ENTER';
41
+ };
42
+ readonly menu: {
43
+ readonly aliases: readonly [];
44
+ readonly androidKeyevent: 'KEYCODE_MENU';
45
+ readonly appleRemoteButton: 'menu';
46
+ readonly vegaKey: 'KEY_MENU';
47
+ };
48
+ readonly home: {
49
+ readonly aliases: readonly [];
50
+ readonly androidKeyevent: 'KEYCODE_HOME';
51
+ readonly appleRemoteButton: 'home';
52
+ readonly vegaKey: 'KEY_HOMEPAGE';
53
+ };
54
+ readonly back: {
55
+ readonly aliases: readonly [];
56
+ readonly androidKeyevent: 'KEYCODE_BACK';
57
+ readonly appleRemoteButton: 'menu';
58
+ readonly vegaKey: 'KEY_BACK';
59
+ };
34
60
  };
61
+ declare const TV_REMOTE_BUTTONS: (keyof typeof TV_REMOTE_BUTTON_DEFINITIONS)[];
62
+ type TvRemoteButton = (typeof TV_REMOTE_BUTTONS)[number];
35
63
  //#endregion
36
- //#region src/contracts/snapshot-capture-annotations.d.ts
37
- type SnapshotCaptureAnalysis = {
38
- rawNodeCount: number;
39
- maxDepth: number;
40
- };
41
- type SnapshotCaptureFreshness = {
42
- action: string;
43
- retryCount: number;
44
- staleAfterRetries: boolean;
45
- reason?: 'empty-interactive' | 'sharp-drop' | 'stuck-route';
46
- };
47
- type SnapshotCaptureAnnotations = {
48
- analysis?: SnapshotCaptureAnalysis;
49
- androidSnapshot?: AndroidSnapshotBackendMetadata;
50
- freshness?: SnapshotCaptureFreshness;
51
- quality?: SnapshotQualityVerdict;
52
- warnings?: string[];
53
- };
54
- type PublicSnapshotCaptureAnnotations = Pick<SnapshotCaptureAnnotations, 'androidSnapshot' | 'warnings'> & {
55
- snapshotQuality?: SnapshotQualityVerdict;
56
- };
64
+ //#region packages/contracts/src/session-surface.d.ts
65
+ declare const SESSION_SURFACES: readonly ['app', 'frontmost-app', 'desktop', 'menubar'];
66
+ type SessionSurface = (typeof SESSION_SURFACES)[number];
57
67
  //#endregion
58
- //#region src/contracts/snapshot-diagnostics.d.ts
68
+ //#region packages/contracts/src/snapshot-diagnostics.d.ts
59
69
  type SnapshotTimingStats = {
60
70
  count: number;
61
71
  p50Ms: number;
@@ -70,7 +80,7 @@ type SnapshotDiagnosticsSummary = {
70
80
  warning?: string;
71
81
  };
72
82
  //#endregion
73
- //#region src/utils/screenshot-result.d.ts
83
+ //#region packages/contracts/src/snapshot-types.d.ts
74
84
  type ScreenshotResultData = {
75
85
  path?: string;
76
86
  width?: number;
@@ -80,16 +90,51 @@ type ScreenshotResultData = {
80
90
  pixelDensity?: number;
81
91
  overlayRefs?: ScreenshotOverlayRef[];
82
92
  };
93
+ type BackendSnapshotResult = {
94
+ nodes?: SnapshotNode[];
95
+ truncated?: boolean;
96
+ backend?: string;
97
+ snapshot?: SnapshotState;
98
+ appName?: string;
99
+ appBundleId?: string;
100
+ snapshotDiagnostics?: SnapshotDiagnosticsSummary;
101
+ analysis?: {
102
+ rawNodeCount: number;
103
+ maxDepth: number;
104
+ };
105
+ androidSnapshot?: AndroidSnapshotBackendMetadata;
106
+ freshness?: {
107
+ action: string;
108
+ retryCount: number;
109
+ staleAfterRetries: boolean;
110
+ reason?: 'empty-interactive' | 'sharp-drop' | 'stuck-route';
111
+ };
112
+ quality?: SnapshotQualityVerdict;
113
+ warnings?: string[];
114
+ };
115
+ type AndroidSnapshotBackendMetadata = {
116
+ backend: 'android-helper';
117
+ helperVersion?: string;
118
+ helperApiVersion?: string;
119
+ helperTransport?: string;
120
+ helperSessionReused?: boolean;
121
+ installReason?: string;
122
+ waitForIdleTimeoutMs?: number;
123
+ waitForIdleQuietMs?: number;
124
+ timeoutMs?: number;
125
+ maxDepth?: number;
126
+ maxNodes?: number;
127
+ rootPresent?: boolean;
128
+ captureMode?: string;
129
+ systemSurfaceOnly?: boolean;
130
+ windowCount?: number;
131
+ nodeCount?: number;
132
+ helperTruncated?: boolean;
133
+ elapsedMs?: number;
134
+ };
135
+ type FindLocator = 'any' | 'text' | 'label' | 'value' | 'role' | 'id';
83
136
  //#endregion
84
- //#region src/contracts/recording-export-quality.d.ts
85
- declare const RECORDING_EXPORT_QUALITIES: readonly ['medium', 'high'];
86
- type RecordingExportQuality = (typeof RECORDING_EXPORT_QUALITIES)[number];
87
- //#endregion
88
- //#region src/contracts/back-mode.d.ts
89
- declare const BACK_MODES: readonly ['in-app', 'system'];
90
- type BackMode = (typeof BACK_MODES)[number];
91
- //#endregion
92
- //#region src/contracts/cloud-artifacts.d.ts
137
+ //#region packages/contracts/src/cloud-artifacts.d.ts
93
138
  declare const CLOUD_ARTIFACT_KINDS: readonly ['video', 'appium-log', 'device-log', 'automation-log', 'provider-session', 'raw'];
94
139
  type CloudArtifactKind = (typeof CLOUD_ARTIFACT_KINDS)[number];
95
140
  type CloudArtifactAvailability = 'ready' | 'pending' | 'unavailable' | 'expired';
@@ -148,66 +193,4 @@ type CloudArtifactProvider = {
148
193
  listCloudArtifacts?: (query: CloudArtifactsQuery) => Promise<CloudArtifactsResult | undefined>;
149
194
  };
150
195
  //#endregion
151
- //#region src/contracts/alert-contract.d.ts
152
- declare const ALERT_ACTIONS: readonly ['get', 'accept', 'dismiss', 'wait'];
153
- type AlertAction = (typeof ALERT_ACTIONS)[number];
154
- //#endregion
155
- //#region src/contracts/device-rotation.d.ts
156
- declare const DEVICE_ROTATIONS: readonly ['portrait', 'portrait-upside-down', 'landscape-left', 'landscape-right'];
157
- type DeviceRotation = (typeof DEVICE_ROTATIONS)[number];
158
- //#endregion
159
- //#region src/contracts/tv-remote.d.ts
160
- declare const TV_REMOTE_BUTTON_DEFINITIONS: {
161
- readonly up: {
162
- readonly aliases: readonly [];
163
- readonly androidKeyevent: 'KEYCODE_DPAD_UP';
164
- readonly appleRemoteButton: 'up';
165
- readonly vegaKey: 'KEY_UP';
166
- };
167
- readonly down: {
168
- readonly aliases: readonly [];
169
- readonly androidKeyevent: 'KEYCODE_DPAD_DOWN';
170
- readonly appleRemoteButton: 'down';
171
- readonly vegaKey: 'KEY_DOWN';
172
- };
173
- readonly left: {
174
- readonly aliases: readonly [];
175
- readonly androidKeyevent: 'KEYCODE_DPAD_LEFT';
176
- readonly appleRemoteButton: 'left';
177
- readonly vegaKey: 'KEY_LEFT';
178
- };
179
- readonly right: {
180
- readonly aliases: readonly [];
181
- readonly androidKeyevent: 'KEYCODE_DPAD_RIGHT';
182
- readonly appleRemoteButton: 'right';
183
- readonly vegaKey: 'KEY_RIGHT';
184
- };
185
- readonly select: {
186
- readonly aliases: readonly ["ok", "center", "enter"];
187
- readonly androidKeyevent: 'KEYCODE_DPAD_CENTER';
188
- readonly appleRemoteButton: 'select';
189
- readonly vegaKey: 'KEY_ENTER';
190
- };
191
- readonly menu: {
192
- readonly aliases: readonly [];
193
- readonly androidKeyevent: 'KEYCODE_MENU';
194
- readonly appleRemoteButton: 'menu';
195
- readonly vegaKey: 'KEY_MENU';
196
- };
197
- readonly home: {
198
- readonly aliases: readonly [];
199
- readonly androidKeyevent: 'KEYCODE_HOME';
200
- readonly appleRemoteButton: 'home';
201
- readonly vegaKey: 'KEY_HOMEPAGE';
202
- };
203
- readonly back: {
204
- readonly aliases: readonly [];
205
- readonly androidKeyevent: 'KEYCODE_BACK';
206
- readonly appleRemoteButton: 'menu';
207
- readonly vegaKey: 'KEY_BACK';
208
- };
209
- };
210
- declare const TV_REMOTE_BUTTONS: (keyof typeof TV_REMOTE_BUTTON_DEFINITIONS)[];
211
- type TvRemoteButton = (typeof TV_REMOTE_BUTTONS)[number];
212
- //#endregion
213
- export { CloudArtifactProvider as a, RecordingExportQuality as c, PublicSnapshotCaptureAnnotations as d, SnapshotCaptureAnnotations as f, AgentArtifactsResult as i, ScreenshotResultData as l, JsonObject as m, DeviceRotation as n, CloudProviderSessionResult as o, SessionSurface as p, AlertAction as r, BackMode as s, TvRemoteButton as t, SnapshotDiagnosticsSummary as u };
196
+ export { BackendSnapshotResult as a, SnapshotDiagnosticsSummary as c, DeviceRotation as d, BackMode as f, AndroidSnapshotBackendMetadata as i, SessionSurface as l, CloudArtifactProvider as n, FindLocator as o, CloudProviderSessionResult as r, ScreenshotResultData as s, AgentArtifactsResult as t, TvRemoteButton as u };
@@ -1 +1 @@
1
- import{j as e}from"./sdk-batch-runner.js";import{o as t}from"./registry.js";const n=t(),r=new Map(n.map(e=>[e.name,e]));function i(){return[...n]}function a(){return e().map(e=>{let t=s(e);if(!t)throw Error(`Missing command metadata for MCP-exposed command: ${e}`);return t})}function o(e){return r.has(e)}function s(e){return r.get(e)}export{a as i,o as n,i as r,s as t};
1
+ import{x as e}from"./sdk-batch-runner.js";import{o as t}from"./registry.js";const n=t(),r=new Map(n.map(e=>[e.name,e]));function i(){return[...n]}function a(){return e().map(e=>{let t=s(e);if(!t)throw Error(`Missing command metadata for MCP-exposed command: ${e}`);return t})}function o(e){return r.has(e)}function s(e){return r.get(e)}export{a as i,o as n,i as r,s as t};
@@ -1,4 +1,4 @@
1
- import{_ as e}from"./sdk-contracts.js";import{d as t,p as n,r}from"./registry.js";import{r as i}from"./command-metadata.js";const a={cdp:{usageOverride:`cdp [...args]`,listUsageOverride:`cdp`,helpDescription:`Run CDP commands for React Native diagnostics, JS heap usage, heap snapshots, and leak analysis`,summary:`Inspect React Native CDP targets, JS heap growth, heap snapshots, retainers, and leak signals`,positionalArgs:[`args?`],allowsExtraPositionals:!0,supportedFlags:t},auth:{usageOverride:`auth status|login|logout`,listUsageOverride:`auth`,helpDescription:`Manage cloud login state used by remote daemon and cloud device workflows.`,summary:`Manage cloud login state used by remote daemon and cloud device workflows`,positionalArgs:[`status|login|logout`],supportedFlags:[`remoteConfig`,`stateDir`]},daemon:{usageOverride:`daemon stop [--state-dir <path>] [--clean]`,listUsageOverride:`daemon stop`,helpDescription:`Stop a local daemon after verifying its PID/start-time identity. Use --clean to remove retained Apple runner processes and leases owned by that daemon.`,summary:`Safely stop a local daemon and optionally clean retained runner resources`,positionalArgs:[`stop`],allowedFlags:[`clean`],supportedFlags:[`stateDir`]},device:{usageOverride:`device status [--platform <platform>] [--udid <udid>] [--serial <serial>] [--stale]`,listUsageOverride:`device status`,helpDescription:`Inspect advisory host-local device ownership claims without starting or contacting a daemon. --stale only inspects proven-stale claims; it does not reclaim claims or clean platform resources.`,summary:`Inspect local advisory device ownership without daemon side effects`,positionalArgs:[`status`],allowedFlags:[`stale`],supportedFlags:[`platform`,`device`,`udid`,`serial`]},connect:{usageOverride:`connect [cloud|proxy|limrun|browserstack|aws-device-farm] [--remote-config <path>] [--daemon-base-url <url>] [--tenant <id>] [--run-id <id>] [--lease-id <id>] [--lease-backend <backend>] [--force] [--no-login]`,helpDescription:`Connect to a remote daemon, authenticate when needed, and save remote session state. AGENT_DEVICE_CLOUD_BASE_URL is the bridge/control-plane API origin; use AGENT_DEVICE_DAEMON_AUTH_TOKEN=adc_live_... for CI/service-token automation.`,listUsageOverride:`connect`,summary:`Attach CLI commands to a saved remote daemon/cloud lease; inspect for remote runs, tenants, or service-token CI`,positionalArgs:[`provider?`],allowedFlags:[`remoteConfig`,`daemonBaseUrl`,`tenant`,`runId`,`leaseId`,`leaseBackend`,`providerApp`,`providerOsVersion`,`providerProject`,`providerBuild`,`providerSessionName`,`awsProjectArn`,`awsDeviceArn`,`awsAppArn`,`awsRegion`,`awsInteractionMode`,`force`,`noLogin`],supportedFlags:[`stateDir`,`daemonAuthToken`,`session`,`platform`,`device`,...n,`launchUrl`]},connection:{usageOverride:`connection status`,listUsageOverride:`connection`,helpDescription:`Inspect active remote connection state`,summary:`Inspect the active saved remote connection before assuming commands are local`,positionalArgs:[`status`],supportedFlags:[`remoteConfig`,`stateDir`,`session`]},disconnect:{helpDescription:`Disconnect remote daemon state, stop owned Metro companion, and release lease`,listUsageOverride:`disconnect`,summary:`Clear remote connection state, stop owned Metro companions, and release remote leases`,allowedFlags:[`shutdown`],supportedFlags:[`remoteConfig`,`stateDir`,`session`]},mcp:{helpDescription:`Start the official stdio MCP server. It exposes structured command tools backed by the agent-device client.`,summary:`Start MCP server`},proxy:{usageOverride:`proxy [--host <host>] [--port <port>] [--daemon-auth-token <token>] [--state-dir <path>]`,listUsageOverride:`proxy`,helpDescription:`Expose the local daemon HTTP contract through a tunnel-friendly reverse proxy.
1
+ import{_ as e}from"./sdk-contracts.js";import{f as t,m as n,r}from"./registry.js";import{r as i}from"./command-metadata.js";const a={cdp:{usageOverride:`cdp [...args]`,listUsageOverride:`cdp`,helpDescription:`Run CDP commands for React Native diagnostics, JS heap usage, heap snapshots, and leak analysis`,summary:`Inspect React Native CDP targets, JS heap growth, heap snapshots, retainers, and leak signals`,positionalArgs:[`args?`],allowsExtraPositionals:!0,supportedFlags:t},auth:{usageOverride:`auth status|login|logout`,listUsageOverride:`auth`,helpDescription:`Manage cloud login state used by remote daemon and cloud device workflows.`,summary:`Manage cloud login state used by remote daemon and cloud device workflows`,positionalArgs:[`status|login|logout`],supportedFlags:[`remoteConfig`,`stateDir`]},daemon:{usageOverride:`daemon stop [--state-dir <path>] [--clean]`,listUsageOverride:`daemon stop`,helpDescription:`Stop a local daemon after verifying its PID/start-time identity. Use --clean to remove retained Apple runner processes and leases owned by that daemon.`,summary:`Safely stop a local daemon and optionally clean retained runner resources`,positionalArgs:[`stop`],allowedFlags:[`clean`],supportedFlags:[`stateDir`]},device:{usageOverride:`device status [--platform <platform>] [--udid <udid>] [--serial <serial>] [--stale]`,listUsageOverride:`device status`,helpDescription:`Inspect advisory host-local device ownership claims without starting or contacting a daemon. --stale only inspects proven-stale claims; it does not reclaim claims or clean platform resources.`,summary:`Inspect local advisory device ownership without daemon side effects`,positionalArgs:[`status`],allowedFlags:[`stale`],supportedFlags:[`platform`,`device`,`udid`,`serial`]},connect:{usageOverride:`connect [cloud|proxy|limrun|browserstack|aws-device-farm] [--remote-config <path>] [--daemon-base-url <url>] [--tenant <id>] [--run-id <id>] [--lease-id <id>] [--lease-backend <backend>] [--force] [--no-login]`,helpDescription:`Configure remote access without allocating a device. Direct providers validate credentials/resources before saving state and print the exact device/app preparation needed before open. AGENT_DEVICE_CLOUD_BASE_URL is the bridge/control-plane API origin; use AGENT_DEVICE_DAEMON_AUTH_TOKEN=adc_live_... for CI/service-token automation.`,listUsageOverride:`connect`,summary:`Configure remote/provider state without allocating a live device; direct providers verify access`,positionalArgs:[`provider?`],allowedFlags:`remoteConfig.daemonBaseUrl.tenant.runId.leaseId.leaseBackend.providerApp.providerOsVersion.providerProject.providerBuild.providerSessionName.providerDeviceOrientation.providerGeoLocation.providerTimezone.providerLanguage.providerLocale.providerNetworkProfile.providerCustomNetwork.providerNoResignApp.awsProjectArn.awsDeviceArn.awsAppArn.awsRegion.awsInteractionMode.force.noLogin`.split(`.`),supportedFlags:[`stateDir`,`daemonAuthToken`,`session`,`platform`,`device`,...n,`launchUrl`]},connection:{usageOverride:`connection status`,listUsageOverride:`connection`,helpDescription:`Inspect active remote connection state`,summary:`Inspect the active saved remote connection before assuming commands are local`,positionalArgs:[`status`],supportedFlags:[`remoteConfig`,`stateDir`,`session`]},disconnect:{helpDescription:`Disconnect remote daemon state, stop owned Metro companion, and release lease`,listUsageOverride:`disconnect`,summary:`Clear remote connection state, stop owned Metro companions, and release remote leases`,allowedFlags:[`shutdown`],supportedFlags:[`remoteConfig`,`stateDir`,`session`]},mcp:{helpDescription:`Start the official stdio MCP server. It exposes structured command tools backed by the agent-device client.`,summary:`Start MCP server`},proxy:{usageOverride:`proxy [--host <host>] [--port <port>] [--daemon-auth-token <token>] [--state-dir <path>]`,listUsageOverride:`proxy`,helpDescription:`Expose the local daemon HTTP contract through a tunnel-friendly reverse proxy.
2
2
 
3
3
  Run this on the host that has access to simulators/devices, expose the printed local proxy URL through a tunnel, then point another machine at the tunnel URL with connect proxy.
4
4
 
@@ -1 +1 @@
1
- import{t as e}from"./rolldown-runtime.js";import{a as t}from"./registry.js";var n=e({runCommand:()=>a});const r=t(),i=new Map(r.map(e=>[e.name,e]));async function a(e,t,n){return await o(t).invoke(e,n)}function o(e){return i.get(e)}export{a as n,n as t};
1
+ import{o as e}from"./png-worker-contract.js";import{a as t}from"./registry.js";var n=e({runCommand:()=>a});const r=t(),i=new Map(r.map(e=>[e.name,e]));async function a(e,t,n){return await o(t).invoke(e,n)}function o(e){return i.get(e)}export{a as n,n as t};
@@ -1 +1 @@
1
- import{_ as e}from"./sdk-contracts.js";import{I as t,N as n,j as r}from"./sdk-android-adb.js";import{E as i,a}from"./sdk-batch-runner.js";import{En as o,G as s,J as c,K as l,Q as u,Tn as d,X as f,Z as p,a as m,dn as h,q as ee,sn as te,un as ne,vn as g,yn as _}from"./recording-export-quality.js";import{L as re}from"./snapshot-diagnostics.js";import{_ as ie,c as v,f as ae,h as y,o as oe,p as se,s as b,v as x}from"./sdk-device.js";import{H as ce,T as le,x as ue}from"./gesture-plan-types.js";import{t as de}from"./timeouts.js";import{d as fe}from"./runtime.js";import{l as S}from"./install-artifact.js";import{a as pe,o as me}from"./boot-diagnostics.js";import{i as he}from"./lease-context.js";import{a as C,i as w,r as ge,t as T}from"./register-builtins.js";import{t as _e}from"./apple-multitouch-support.js";import{n as ve,t as E}from"./launch-console.js";import{AsyncLocalStorage as D}from"node:async_hooks";import ye,{promises as O}from"node:fs";import be from"node:path";let xe=[];const k=new D;async function Se(e,t){return await k.run([...e],t)}function Ce(e,t){for(let n of A()){if(!n.ownsDevice(e))continue;let r=n.getInteractor(e,t);if(r)return r}}function we(e){return A().some(t=>t.ownsDevice(e))}async function Te(e,t,n,r){for(let i of A()){if(!i.ownsDevice(e))continue;if(!i.installApp)throw N(i,e,`install`);let a=await i.installApp?.(e,t,n,r);if(a)return a;throw N(i,e,`install`)}}async function Ee(e,t,n){for(let r of A()){if(!r.ownsDevice(e))continue;if(!r.installInstallablePath)throw N(r,e,`install_from_source`);let i=await r.installInstallablePath?.(e,t,n);if(i)return i;throw N(r,e,`install_from_source`)}}async function De(e){for(let t of A()){if(!M(t,e.provider))continue;let n=await t.configurePortReverse?.(e);if(n)return n}}function A(){return k.getStore()??xe}function Oe(e,t={}){let n=e.map(e=>e.provider);return{providerRuntimeIds:n,providerRuntimeRequiredIds:je([...n,...t.providerRuntimeRequiredIds??[]]),leaseLifecycleProvider:Ne(e),recoverableProviderIds:e.filter(e=>e.recoverExpiredLease!==void 0).map(e=>e.provider),recoverExpiredLease:Ae(e),cloudArtifactProvider:Pe(e),deviceInventoryProvider:Fe(e),appleRunnerProvider:ke(e),providerDeviceRuntimeScope:async t=>await Se(e,t)}}function ke(e){if(e.some(e=>e.getAppleRunnerProvider!==void 0))return t=>{for(let n of e){if(!n.ownsDevice(t.device))continue;let e=n.getAppleRunnerProvider?.(t.device);if(e)return e}}}function Ae(t){if(t.some(e=>e.recoverExpiredLease!==void 0))return async n=>{let r=t.find(e=>M(e,n.leaseProvider));if(!r?.recoverExpiredLease)throw new e(`UNSUPPORTED_OPERATION`,`Provider ${n.leaseProvider??`unknown`} cannot recover an expired lease.`,{provider:n.leaseProvider,leaseId:n.leaseId});await r.recoverExpiredLease(n)}}function je(e){return[...new Set(e)]}function Me(...e){let t=e.filter(e=>e!==void 0);if(t.length!==0)return{listCloudArtifacts:async e=>{for(let n of t){let t=await n.listCloudArtifacts?.(e);if(t)return t}}}}function Ne(e){if(e.length!==0)return{allocate:async(t,n)=>await j(e,`allocate`,t,n),heartbeat:async(t,n)=>await j(e,`heartbeat`,t,n),release:async(t,n)=>await j(e,`release`,t,n)}}function Pe(e){if(e.length!==0)return{listCloudArtifacts:async t=>await Ie(e,t)}}function Fe(e){if(e.length!==0)return async t=>{for(let n of e){if(!M(n,t.leaseProvider))continue;let e=await n.deviceInventoryProvider(t);if(e)return e}return null}}async function Ie(e,t){for(let n of e){if(!M(n,t.provider))continue;let e=await n.cloudArtifacts?.listCloudArtifacts?.(t);if(e)return e}}async function j(e,t,n,r){for(let i of e){if(!M(i,n.leaseProvider))continue;let e=i.leaseLifecycle[t],a=e?await e(n,r):void 0;if(a)return a}}function M(e,t){return e.provider===t}function N(t,n,r){throw new e(`UNSUPPORTED_OPERATION`,`Provider device runtime ${t.provider} does not support ${r} for this device.`,{provider:t.provider,deviceId:n.id,platform:y(n)})}const P=new D,Le=new D;async function Re(t,n,r){let i=await ze(t,n,r);if(i)return i;let a=await Be(t,n,r);if(r.allowLocalSimulatorFallback!==!1&&He(n,a)){let{findBootableIosSimulator:e}=await import(`./devices2.js`),t=await e({simulatorSetPath:r.simulatorSetPath,target:n.target});if(t)return t}if(a)return a;throw new e(`DEVICE_NOT_FOUND`,`No devices found`,{selector:n})}async function ze(t,n,r){let i=r.appleSimulatorAppTarget?.trim();if(!i||F(n)||r.allowLocalSimulatorFallback===!1)return;let a=t.filter(e=>se(e,n)&&b(e)&&e.kind===`simulator`&&e.booted===!0);if(a.length<2)return;let{findIosSimulatorInstalledApp:o}=await import(`./apps.js`).then(e=>e.t),s=(await Promise.all(a.map(async e=>await o(e,i)?e:void 0))).filter(e=>e!==void 0);if(s.length===1)return s[0];let c=a.map(e=>({id:e.id,name:e.name}));throw s.length===0?new e(`APP_NOT_INSTALLED`,`No booted iOS simulator has ${i} installed`,{appTarget:i,candidates:c,hint:`Install the app on a booted simulator, or pass --udid to select the intended device explicitly.`}):new e(`AMBIGUOUS_MATCH`,`Multiple booted iOS simulators have ${i} installed`,{appTarget:i,candidates:s.map(e=>({id:e.id,name:e.name})),hint:`Pass --udid to select the intended simulator explicitly.`})}async function Be(e,t,n){try{return await x(e,t,n)}catch(e){if(Ve(e,t))return;throw e}}function Ve(t,n){return!F(n)&&t instanceof e&&t.code===`DEVICE_NOT_FOUND`}function He(e,t){return!F(e)&&(!e.platform||e.platform===`apple`||e.platform===`ios`)&&e.target!==`desktop`&&(!t||t.kind===`device`)}function F(e){return!!(e.udid||e.serial||e.deviceName)}async function Ue(e,n={}){let r=We(e),{iosSimulatorSetPath:i,...a}=r,o=Ze(r,n),s={simulatorSetPath:i,allowStoppedAndroidAvdPlaceholders:n.allowStoppedAndroidAvdPlaceholders},c={platform:r.platform,target:e.target,cacheHit:!1};return await t(`resolve_target_device`,async()=>{let e=Xe(o);if(e)return c.cacheHit=!0,e;let t=await I(r);if(t)return L(a)?R(o,await Re(t,a,{simulatorSetPath:i,allowLocalSimulatorFallback:r.leaseProvider===void 0,appleSimulatorAppTarget:n.appleSimulatorAppTarget})):R(o,await x(t,a,s));let l=await C(r);return L(a)?R(o,await Re(l,a,{simulatorSetPath:i,appleSimulatorAppTarget:n.appleSimulatorAppTarget})):R(o,await x(l,a,s))},c)}function We(t){let n=t.platform;if(t.target&&!n)throw new e(`INVALID_ARGS`,`Device target selector requires --platform. Use --platform ios|macos|android|vega|linux|apple with --target mobile|tv|desktop.`);let r=ie({simulatorSetPath:me(t.iosSimulatorDeviceSet),platform:n,target:t.target}),i=pe(t.androidDeviceAllowlist);return{platform:n,target:t.target,deviceName:t.device,udid:t.udid,serial:t.serial,leaseId:t.leaseId,leaseProvider:t.leaseProvider,deviceKey:t.deviceKey,clientId:t.clientId,iosSimulatorSetPath:r,androidSerialAllowlist:i?Array.from(i).sort():void 0}}async function Ge(e){return P.getStore()?await e():await P.run(new Map,e)}async function Ke(e,t){return e?await Le.run(e,t):await t()}async function qe(e,t){return await Ke(e,async()=>await Ge(t))}async function Je(e){return await I(e)??await C(e)}async function I(e){let t=Le.getStore();if(!t)return null;let n=await t(e);return n==null?null:n.map(e=>({...e}))}function Ye(e){return oe(e.platform)}function L(e){return Ye(e)}function Xe(e){let t=P.getStore()?.get(e);if(t)return{...t}}function R(e,t){return P.getStore()?.set(e,{...t}),t}function Ze(e,t){let{appleSimulatorAppTarget:n,...r}=t;return JSON.stringify({request:e,options:r})}T();const Qe={device:!0},$e=[`open`,`close`],et=[`record`],tt=[`audio`,`find`,`get`,`is`,`network`,`screenshot`,`snapshot`,`wait`],nt=[`click`,`fill`,`focus`,`press`,`scroll`,`type`],rt=[`viewport`],z=new Set([...$e,...et,...tt,...nt,...rt]),B=it(a(i));function it(e){let t={};for(let[n,r]of Object.entries(e))t[n]=z.has(n)?{...r,web:Qe}:r;for(let t of z)if(!(t in e))throw Error(`Web command "${t}" missing from capability matrix`);return t}function V(e,t){let n=B[e];if(!n)return!0;let r=w(t.platform);if(!r)return!1;let i=n[r.capability.bucket];if(!i)return!1;let a=r.capability.supportsByDefault?.[e];return a&&!a(t)?!1:i[t.kind??`unknown`]===!0}function at(e,t){return w(t.platform)?.capability.unsupportedHintByDefault?.[e]?.(t)}function ot(){return Object.keys(B).sort()}function st(e){let t=B[e];if(!t)return[];let n=[`apple`,`android`,`vega`,`linux`,`web`],r=[];for(let e of n){let n=t[e];n&&Object.values(n).some(e=>e===!0)&&r.push(e)}return r}function ct(e,t){if(t.platform===`web`||t.appleOs===`watchos`)throw U(e,H(e,t));if(lt(e)){ut(e,t);return}if(t.appleOs===`visionos`)throw U(e,H(e,t));if(e.intent===`fling`&&`direction`in e&&t.platform===`linux`)throw U(e,`gesture fling is not supported on Linux`)}function lt(e){return e.intent===`pan`?(`pointerCount`in e?e.pointerCount:1)===2:e.intent===`pinch`||e.intent===`rotate`||e.intent===`transform`}function ut(e,t){if(t.platform===`android`){if(t.target!==`tv`)return;throw U(e,`gesture ${e.intent} is not supported on Android TV`,`Android TV has no touch input — this gesture is supported on Android phones, tablets, and the iOS simulator only.`)}if(t.platform!==`apple`)throw U(e,H(e,t));_e(t,e.intent)}function H(e,t){return`gesture ${e.intent} is not supported on ${t.appleOs??t.platform}`}function U(t,n,r){return new e(`UNSUPPORTED_OPERATION`,n,{gesture:t.intent,...r?{hint:r}:{}})}const W=`No active session. Run open first.`;function G(e,t,n){return{ok:!1,error:{code:e,message:t,...n?{details:n}:{}}}}function dt(){return G(`SESSION_NOT_FOUND`,W)}function ft(e,t,n){if(V(e,t))return null;let r=n?.hint?at(e,t):void 0;return{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:n?.message??`${e} is not supported on this device`,...r?{hint:r}:{}}}}T();async function K(t,n){if(we(t)){let r=Ce(t,n);if(r)return r;throw new e(`UNSUPPORTED_OPERATION`,`Provider device runtime does not have an active interactor for this device.`,{deviceId:t.id,platform:y(t)})}return await ge(t.platform).createInteractor(t,n)}const pt=/^[A-Za-z0-9_.:-]{1,64}$/,q=8*1024,J=4*1024;function mt(t){let n=t[0]?.trim(),r=t[1]?.trim();if(!n)throw new e(`INVALID_ARGS`,`trigger-app-event requires <event> [payloadJson]`);if(!pt.test(n))throw new e(`INVALID_ARGS`,`Invalid trigger-app-event event name: ${n}`,{hint:`Use 1-64 chars: letters, numbers, underscore, dot, colon, or dash.`});if(t.length>2)throw new e(`INVALID_ARGS`,`trigger-app-event accepts at most two arguments: <event> [payloadJson]`);return{eventName:n,payload:gt(r,n)}}function ht(t,n,r){let i=y(t),a=_t(t);if(!a)throw new e(`UNSUPPORTED_OPERATION`,`No app event URL template configured for ${i}.`,{hint:`Set AGENT_DEVICE_${i.toUpperCase()}_APP_EVENT_URL_TEMPLATE or AGENT_DEVICE_APP_EVENT_URL_TEMPLATE, for example "myapp://agent-device/event?name={event}&payload={payload}".`});let o=r?JSON.stringify(r):``,s=a.replaceAll(`{event}`,encodeURIComponent(n)).replaceAll(`{payload}`,encodeURIComponent(o)).replaceAll(`{platform}`,encodeURIComponent(i));if(s.length>J)throw new e(`INVALID_ARGS`,`trigger-app-event URL exceeds maximum supported length`,{hint:`Reduce payload size or shorten AGENT_DEVICE_*_APP_EVENT_URL_TEMPLATE.`,length:s.length,maxLength:J});return s}function gt(t,n){if(t)try{let r=JSON.parse(t);if(!r||typeof r!=`object`||Array.isArray(r))throw new e(`INVALID_ARGS`,`trigger-app-event payload for "${n}" must be a JSON object`);let i=JSON.stringify(r);if(Buffer.byteLength(i,`utf8`)>q)throw new e(`INVALID_ARGS`,`trigger-app-event payload for "${n}" exceeds ${q} bytes`);return r}catch(n){throw n instanceof e?n:new e(`INVALID_ARGS`,`Invalid trigger-app-event payload JSON: ${t}`)}}function _t(e){return((b(e)?process.env.AGENT_DEVICE_IOS_APP_EVENT_URL_TEMPLATE:v(e)?process.env.AGENT_DEVICE_MACOS_APP_EVENT_URL_TEMPLATE:process.env.AGENT_DEVICE_ANDROID_APP_EVENT_URL_TEMPLATE)??process.env.AGENT_DEVICE_APP_EVENT_URL_TEMPLATE)?.trim()||void 0}const vt=[[0,0],[1,0],[0,1],[-1,0],[0,-1],[1,1],[-1,1],[1,-1],[-1,-1]];function yt(e,t){return oe(e.platform)&&t>1}function bt(e,t,n=2e4){if(e.length===0)return[];let r=t>0?t:e.length,i=[],a=[],o=0;for(let t of e){let e=(t.durationMs??0)+(t.pauseMs??0)+250,s=a.length>0&&o+e>n,c=a.length>=r;(s||c)&&(i.push(a),a=[],o=0),a.push(t),o+=e}return a.length>0&&i.push(a),i}function xt(e,t){if(t<=0)return[0,0];let[n,r]=vt[e%vt.length];return[n*t,r*t]}async function St(e,t,n){for(let r=0;r<e;r+=1)await n(r),r<e-1&&t>0&&await de(t)}async function Ct(e,t){let{x:n,y:r}=Y(t,`longpress requires x y [durationMs]`,{hint:`Direct platform longpress requires coordinates. In an open daemon session, use agent-device longpress @ref|selector [durationMs]; otherwise run snapshot -i, use the target rect center as x y, then retry longpress x y durationMs.`}),i=t[2]?Number(t[2]):void 0;return await e.longPress(n,r,i),{x:n,y:r,durationMs:i,...g(`Long pressed (${n}, ${r})`)}}async function wt(e,t){let{x:n,y:r}=Y(t,`focus requires x y`);return await e.focus(n,r),{x:n,y:r,...g(`Focused (${n}, ${r})`)}}async function Tt(t,n,r){let i=Xt(n);if(i)throw new e(`INVALID_ARGS`,`type does not accept a target ref like "${i}"`,{hint:`Use fill ${i} "text" to target that field, or press ${i} then type "text" to append.`});let a=n.join(` `);if(!a)throw new e(`INVALID_ARGS`,`type requires text`);let o=c(r?.delayMs??0,`delay-ms`,0,1e4);return await t.type(a,o),{text:a,delayMs:o,...g(Q(`Typed`,a))}}async function Et(t,n,r){if(r?.directElementSelector)return await Dt(t,r.directElementSelector,n,r);let i=Number(n[0]),a=Number(n[1]),o=n.slice(2).join(` `);if(Number.isNaN(i)||Number.isNaN(a)||!o)throw new e(`INVALID_ARGS`,`fill requires x y text`);let s=c(r?.delayMs??0,`delay-ms`,0,1e4);return await t.fill(i,a,o,s),{x:i,y:a,text:o,delayMs:s,...g(Q(`Filled`,o))}}async function Dt(t,n,r,i){if(!t.fillElementSelector)throw new e(`UNSUPPORTED_OPERATION`,`direct element selector fill is not supported`);let a=r.join(` `);if(!a)throw new e(`INVALID_ARGS`,`fill requires text`);let o=c(i.delayMs??0,`delay-ms`,0,1e4),s=await t.fillElementSelector(n,a,o);return{selector:n.raw,text:a,delayMs:o,...s??{},...g(Q(`Filled`,a))}}async function Ot(e,t,n,r){if(r?.directElementSelector&&b(e))return await kt(t,r.directElementSelector);let{x:i,y:a}=Y(n,`press requires x y`);if(v(e)&&r?.surface&&r.surface!==`app`)return await At(i,a,r);let o=h(r);if(o!==`primary`)return await jt(e,i,a,o,r);let s=Pt(r);return Ft(s),yt(e,s.count)?await Lt(e,i,a,s,r):await Bt(t,i,a,s)}async function kt(t,n){if(!t.tapElementSelector)throw new e(`UNSUPPORTED_OPERATION`,`direct element selector tap is not supported`);let r=await t.tapElementSelector(n),i=r?.maestroNonHittableCoordinateFallbackUsed===!0;return{selector:n.raw,...r??{},...g(i?`tapped via non-hittable coordinate fallback`:`Tapped ${n.raw}`)}}function Y(t,n,r){let i=Number(t[0]),a=Number(t[1]);if(Number.isNaN(i)||Number.isNaN(a))throw new e(`INVALID_ARGS`,n,r);return{x:i,y:a}}async function At(t,n,r){let i=h(r);if(i!==`primary`)throw new e(`UNSUPPORTED_OPERATION`,`${i} click is not supported on macOS ${r.surface} sessions.`);let{runMacOsPressAction:a}=await import(`./helper.js`).then(e=>e.t);return await a(t,n,{bundleId:r.appBundleId,surface:r.surface}),{x:t,y:n,...g(Z({x:t,y:n}))}}async function jt(e,t,n,r,i){if(Mt(e,r,i),e.platform===`linux`)return await Nt(t,n,r);let{runAppleRunnerCommand:a}=await import(`./runner-client.js`).then(e=>e.o);return await a(e,{command:`mouseClick`,x:t,y:n,button:r,appBundleId:i?.appBundleId},Vt(i)),{x:t,y:n,button:r,...g(Z({x:t,y:n,button:r}))}}function Mt(e,t,n){let r=ne({commandLabel:`click`,platform:y(e),button:t,count:n?.count,intervalMs:n?.intervalMs,holdMs:n?.holdMs,jitterPx:n?.jitterPx,doubleTap:n?.doubleTap});if(r)throw r}async function Nt(e,t,n){if(n===`secondary`){let{rightClickLinux:n}=await import(`./input-actions2.js`);await n(e,t)}else{let{middleClickLinux:n}=await import(`./input-actions2.js`);await n(e,t)}return{x:e,y:t,button:n,...g(Z({x:e,y:t,button:n}))}}function Pt(e){return{count:X(e?.count,1,`count`,1,200),intervalMs:X(e?.intervalMs,0,`interval-ms`,0,1e4),holdMs:X(e?.holdMs,0,`hold-ms`,0,1e4),jitterPx:X(e?.jitterPx,0,`jitter-px`,0,100),doubleTap:!!e?.doubleTap}}function X(e,t,n,r,i){return c(e===void 0?t:e,n,r,i)}function Ft({doubleTap:t,holdMs:n,jitterPx:r}){if(t&&n>0)throw new e(`INVALID_ARGS`,`double-tap cannot be combined with hold-ms`);if(t&&r>0)throw new e(`INVALID_ARGS`,`double-tap cannot be combined with jitter-px`)}async function It(e,t,n){let{runAppleRunnerCommand:r}=await import(`./runner-client.js`).then(e=>e.o),{MAX_RUNNER_SEQUENCE_STEPS:i,buildRunnerSequenceCommand:a,parseRunnerSequenceResult:o}=await import(`./runner-sequence.js`).then(e=>e.r),s=bt(t,i),c,l,u=0,d=[],f=0;for(let t of s){let i=await r(e,a(t,n?.appBundleId),Vt(n));c??=i,l=i;let s;try{s=o(i)}catch(e){throw zt(e,f)}u+=s.completedSteps,d.push(...s.results),f+=t.length}return{...c??{},completedSteps:u,sequenceResults:d,...l?.gestureEndUptimeMs===void 0?{}:{gestureEndUptimeMs:l.gestureEndUptimeMs}}}async function Lt(e,t,n,r,i){let a=await It(e,Rt(e,t,n,r),i);return{x:t,y:n,count:r.count,intervalMs:r.intervalMs,holdMs:r.holdMs,jitterPx:r.jitterPx,doubleTap:r.doubleTap,timingMode:`runner-sequence`,...a,...g(Z({x:t,y:n}))}}function Rt(e,t,n,r){let i=r.doubleTap?`doubleTap`:r.holdMs>0?`longPress`:`tap`,a=i===`tap`&&b(e)&&!ae(e);return Array.from({length:r.count},(e,o)=>{let[s,c]=xt(o,r.jitterPx),l=o===r.count-1;return{kind:i,x:t+s,y:n+c,...a?{synthesized:!0}:{},...r.holdMs>0?{durationMs:r.holdMs}:{},...!l&&r.intervalMs>0?{pauseMs:r.intervalMs}:{}}})}function zt(t,n){if(n===0||!(t instanceof e)||!t.details)return t;let r=t.details.failedStepIndex;if(typeof r!=`number`)return t;let i=t.details.completedSteps;return new e(t.code,t.message,{...t.details,failedStepIndex:r+n,chunkStepIndex:r,...typeof i==`number`?{completedSteps:n+i}:{}},t.cause)}async function Bt(e,t,n,r){let i;return await St(r.count,r.intervalMs,async a=>{let[o,s]=xt(a,r.jitterPx),c=t+o,l=n+s;if(r.doubleTap){let t=await e.doubleTap(c,l);i??=t??void 0;return}if(r.holdMs>0){let t=await e.longPress(c,l,r.holdMs);i??=t??void 0}else{let t=await e.tap(c,l);i??=t??void 0}}),_({x:t,y:n,count:r.count,intervalMs:r.intervalMs,holdMs:r.holdMs,jitterPx:r.jitterPx,doubleTap:r.doubleTap,...i},Z({x:t,y:n}))}function Vt(e){return{verbose:e?.verbose,logPath:e?.logPath,traceLogPath:e?.traceLogPath,requestId:e?.requestId,iosXctestrunFile:e?.iosXctestrunFile,iosXctestDerivedDataPath:e?.iosXctestDerivedDataPath,iosXctestEnvDir:e?.iosXctestEnvDir}}async function Ht(t,n,r){let i=n[0],a=n[1]?Number(n[1]):void 0,o=r?.pixels,s=r?.durationMs;if(!i)throw new e(`INVALID_ARGS`,`scroll requires direction`);Ut(a,o,s);let c=Jt(i),u={amount:a,pixels:o,durationMs:s},{interactionResult:d,completedPasses:f}=await Gt(t,r,c,u);return _(Kt(c,u,f,d),l(c.direction,c.edge,f,a,o))}function Ut(e,t,n){Wt(e),u(n),f({amount:e,pixels:t})}function Wt(t){if(t!==void 0&&!Number.isFinite(t))throw new e(`INVALID_ARGS`,`scroll amount must be a number`)}async function Gt(e,t,n,r){if(n.edge){let i=n.edge,a=await ee({edge:i,captureState:async n=>await qt(e,t,i,n),scroll:async()=>await e.scroll(n.direction,r)});return{interactionResult:a.result??{},completedPasses:a.passes}}return{interactionResult:await e.scroll(n.direction,r)??{},completedPasses:1}}function Kt(e,t,n,r){let i=p(r);return{direction:e.direction,...e.edge?{edge:e.edge,passes:n}:{},...t.amount===void 0?{}:{amount:t.amount},...t.pixels===void 0?{}:{pixels:t.pixels},...i===void 0?{}:{durationMs:i},...r}}async function qt(t,n,r,i){if(typeof t.snapshot!=`function`)throw new e(`UNSUPPORTED_OPERATION`,`scroll ${r} requires snapshot support to verify hidden content before scrolling`);let a=t.snapshot;return await s({edge:r,scope:i,captureNodes:async e=>(await a({appBundleId:n?.appBundleId,scope:e})).nodes??[]})}function Jt(e){return e===`bottom`?{direction:`down`,edge:`bottom`}:e===`top`?{direction:`up`,edge:`top`}:{direction:ce(e)}}async function Yt(e,t,n){let{x:r,y:i}=Y(t,`read requires x y`);if(e.platform===`android`){let{readAndroidTextAtPoint:t}=await import(`./input-actions.js`).then(e=>e.s);return{action:`read`,text:await t(e,r,i)??``}}if(e.platform===`linux`){let{readLinuxTextAtPoint:e}=await import(`./snapshot.js`).then(e=>e.n);return{action:`read`,text:await e(r,i,n?.surface)}}if(v(e)&&n?.surface&&n.surface!==`app`){let{runMacOsReadTextAction:e}=await import(`./helper.js`).then(e=>e.t);return{action:`read`,text:(await e(r,i,{bundleId:n.appBundleId,surface:n.surface})).text}}let{runAppleRunnerCommand:a}=await import(`./runner-client.js`).then(e=>e.o),o=await a(e,{command:`readText`,x:r,y:i,appBundleId:n?.appBundleId},{verbose:n?.verbose,logPath:n?.logPath,traceLogPath:n?.traceLogPath,requestId:n?.requestId,iosXctestrunFile:n?.iosXctestrunFile,iosXctestDerivedDataPath:n?.iosXctestDerivedDataPath,iosXctestEnvDir:n?.iosXctestEnvDir});return{action:`read`,text:typeof o.text==`string`?o.text:typeof o.message==`string`?o.message:``}}function Xt(e){return fe(e[0])}function Z(e){return e.button&&e.button!==`primary`?`Clicked ${e.button} (${e.x}, ${e.y})`:`Tapped (${e.x}, ${e.y})`}function Q(e,t){return`${e} ${Array.from(t).length} chars`}function Zt(e){let t=e.trim();return t.startsWith(`{`)&&t.endsWith(`}`)||t.startsWith(`[`)&&t.endsWith(`]`)}function Qt(t,n){let r=n?.subject??`Payload`,i=t.trim();if(!i)throw new e(`INVALID_ARGS`,`${r} cannot be empty`);let a=n?.expandPath?n.expandPath(i,n.cwd):i;try{if(!ye.statSync(a).isFile())throw new e(`INVALID_ARGS`,`${r} path is not a file: ${a}`);return{kind:`file`,path:a}}catch(t){if(t instanceof e)throw t;let n=t.code;if(n===`EACCES`||n===`EPERM`)throw new e(`INVALID_ARGS`,`${r} file is not readable: ${a}`);if(n&&n!==`ENOENT`)throw new e(`COMMAND_FAILED`,`Unable to read ${r} file: ${a}`,{cause:String(t)})}if(Zt(i))return{kind:`inline`,text:i};throw new e(`INVALID_ARGS`,`${r} file not found: ${a}`)}async function $t(t){let n=Qt(t,{subject:`Push payload`}),r=n.kind===`inline`?n.text:await en(n.path);try{let t=JSON.parse(r);if(!t||typeof t!=`object`||Array.isArray(t))throw new e(`INVALID_ARGS`,`push payload must be a JSON object`);return t}catch(n){throw n instanceof e?n:new e(`INVALID_ARGS`,`Invalid push payload JSON: ${t}`)}}async function en(t){try{return await O.readFile(t,`utf8`)}catch(n){let r=n.code;throw r===`ENOENT`?new e(`INVALID_ARGS`,`Push payload file not found: ${t}`):r===`EISDIR`?new e(`INVALID_ARGS`,`Push payload path is not a file: ${t}`):r===`EACCES`||r===`EPERM`?new e(`INVALID_ARGS`,`Push payload file is not readable: ${t}`):new e(`COMMAND_FAILED`,`Unable to read push payload file: ${t}`,{cause:String(n)})}}async function tn(e,n,i,a,o){let s=$(o),c=await K(e,s);return r({level:`debug`,phase:`platform_command_prepare`,data:{command:n,platform:e.platform,kind:e.kind}}),await t(`platform_command`,async()=>await on(e,c,n,i,a,o,s),{command:n,platform:e.platform})}async function nn(t,n,r){let i=await K(t,$(r));if(!i.performGesture)throw new e(`UNSUPPORTED_OPERATION`,`Gesture execution is unavailable`);return await i.performGesture(n)}async function rn(e,t){return await(await K(e,$(t))).gestureViewport?.()}function $(e){return{requestId:e?.requestId,appBundleId:e?.appBundleId,verbose:e?.verbose,logPath:e?.logPath,traceLogPath:e?.traceLogPath,iosXctestrunFile:e?.iosXctestrunFile,iosXctestDerivedDataPath:e?.iosXctestDerivedDataPath,iosXctestEnvDir:e?.iosXctestEnvDir,runnerLeaseContext:e?.runnerLeaseContext}}const an={open:({device:e,interactor:t,positionals:n,context:r})=>sn(e,t,n,r),close:async({device:e,interactor:t,positionals:n})=>{let r=n[0];return r?(await t.close(r),{app:r,...g(`Closed: ${r}`)}):(e.platform===`web`&&await t.close(``),{closed:`session`,...g(`Closed session`)})},press:({device:e,interactor:t,positionals:n,context:r})=>Ot(e,t,n,r),longpress:({interactor:e,positionals:t})=>Ct(e,t),focus:({interactor:e,positionals:t})=>wt(e,t),type:({interactor:e,positionals:t,context:n})=>Tt(e,t,n),fill:({interactor:e,positionals:t,context:n})=>Et(e,t,n),scroll:({interactor:e,positionals:t,context:n})=>Ht(e,t,n),"trigger-app-event":({device:e,interactor:t,positionals:n,context:r})=>cn(e,t,n,r),screenshot:({interactor:e,positionals:t,outPath:n,context:r})=>ln(e,t,n,r),viewport:({interactor:e,positionals:t})=>un(e,t),back:async({interactor:e,context:t})=>(await e.back(t?.backMode),{action:`back`,mode:t?.backMode??`in-app`,...g(`Back`)}),home:async({interactor:e})=>(await e.home(),{action:`home`,...g(`Home`)}),orientation:async({interactor:e,positionals:t})=>{let n=te(t[0]),r=(await e.setOrientation(n))?.orientation??n;return{action:`orientation`,orientation:r,...g(`Rotated to ${r}`)}},"app-switcher":async({interactor:e})=>(await e.appSwitcher(),{action:`app-switcher`,...g(`Opened app switcher`)}),clipboard:({interactor:e,positionals:t})=>dn(e,t),keyboard:({device:e,positionals:t,context:n,runnerCtx:r})=>pn(e,t,n,r),"tv-remote":({device:e,interactor:t,positionals:n,context:r})=>fn(e,t,n,r),settings:({device:e,interactor:t,positionals:n,context:r})=>gn(e,t,n,r),push:({device:e,positionals:t,context:n})=>_n(e,t,n),snapshot:({interactor:e,context:t})=>vn(e,t),read:({device:e,positionals:t,context:n})=>Yt(e,t,n)};async function on(t,n,r,i,a,o,s){let c=Object.hasOwn(an,r)?an[r]:void 0;if(!c)throw new e(`INVALID_ARGS`,`Unknown command: ${r}`);return await c({device:t,interactor:n,positionals:i,outPath:a,context:o,runnerCtx:s})}async function sn(t,n,r,i){let a=r[0],o=r[1],s=i?.launchConsole,c=i?.launchArgs;if(r.length>2)throw new e(`INVALID_ARGS`,`open accepts at most two arguments: <app|url> [url]`);if(!a){if(s)throw new e(`INVALID_ARGS`,`--launch-console requires an app target`);if(c&&c.length>0)throw new e(`INVALID_ARGS`,`--launch-args requires an app target`);return await n.openDevice(),{app:null,...g(`Opened device`)}}if(s&&(!b(t)||t.kind!==`simulator`))throw new e(`UNSUPPORTED_OPERATION`,ve);if(t.platform===`linux`&&c&&c.length>0)throw new e(`UNSUPPORTED_OPERATION`,`--launch-args is not supported on Linux.`);if(o!==void 0){if(S(a))throw new e(`INVALID_ARGS`,`open <app> <url> requires an app target as the first argument`);if(!S(o))throw new e(`INVALID_ARGS`,`open <app> <url> requires a valid URL target`);if(s)throw new e(`INVALID_ARGS`,E);return await n.open(a,{activity:i?.activity,appBundleId:i?.appBundleId,launchArgs:c,terminateRunningApp:i?.terminateRunningApp,url:o}),{app:a,url:o,...g(`Opened: ${a}`)}}if(s&&S(a))throw new e(`INVALID_ARGS`,E);if(i?.clearAppState){if(S(a))throw new e(`INVALID_ARGS`,`Clearing app state requires an app target, not a deep link.`);await n.setSetting(`clear-app-state`,`clear`,a)}return await n.open(a,{activity:i?.activity,appBundleId:i?.appBundleId,launchConsole:s,launchArgs:c,terminateRunningApp:i?.terminateRunningApp}),{app:a,...s?{launchConsole:s}:{},...g(`Opened: ${a}`)}}async function cn(e,t,n,r){let{eventName:i,payload:a}=mt(n),o=ht(e,i,a);return await t.open(o,{appBundleId:r?.appBundleId}),{event:i,eventUrl:o,transport:`deep-link`,...g(`Triggered app event: ${i}`)}}async function ln(e,t,n,r){let i=t[0]??n??`./screenshot-${Date.now()}.png`;await O.mkdir(be.dirname(i),{recursive:!0});let a=o(r);return await e.screenshot(i,{appBundleId:r?.appBundleId,pixelDensity:a.pixelDensity,fullscreen:a.fullscreen,normalizeStatusBar:a.normalizeStatusBar,stabilize:a.stabilize,surface:r?.surface,skipIosSimulatorBootCheck:r?.skipIosSimulatorBootCheck,captureBackend:r?.screenshotCaptureBackend}),{path:i,...g(`Saved screenshot: ${i}`)}}async function un(t,n){if(n.length!==2)throw new e(`INVALID_ARGS`,`viewport requires exactly two arguments: <width> <height>`);let r=m(n[0],`width`),i=m(n[1],`height`);if(!t.setViewport)throw new e(`UNSUPPORTED_OPERATION`,`viewport is not supported by this backend`);return await t.setViewport(r,i),{width:r,height:i,...g(`Viewport set: ${r}x${i}`)}}async function dn(t,n){let r=(n[0]??``).toLowerCase();if(r!==`read`&&r!==`write`)throw new e(`INVALID_ARGS`,`clipboard requires a subcommand: read or write`);if(r===`read`){if(n.length!==1)throw new e(`INVALID_ARGS`,`clipboard read does not accept additional arguments`);return{action:r,text:await t.readClipboard()}}if(n.length<2)throw new e(`INVALID_ARGS`,`clipboard write requires text (use "" to clear clipboard)`);let i=n.slice(1).join(` `);return await t.writeClipboard(i),{action:r,textLength:Array.from(i).length,...g(`Clipboard updated`)}}async function fn(t,n,r,i){if(t.target!==`tv`)throw new e(`UNSUPPORTED_OPERATION`,`tv-remote is supported only on TV targets`,{hint:`Select an Android TV, tvOS, or Vega OS target with --target tv.`});if(r.length!==1)throw new e(`INVALID_ARGS`,`tv-remote requires exactly one button`);let a=le(r[0]),o=i?.durationMs===void 0?void 0:c(i.durationMs,`durationMs`,0,1e4);return await n.tvRemote(a,o),{action:`tv-remote`,button:a,...o===void 0?{}:{durationMs:o},...g(`Pressed TV remote ${a}`)}}async function pn(t,n,r,i){let a=(n[0]??`status`).toLowerCase();if(!re(a))throw new e(`INVALID_ARGS`,`keyboard requires a subcommand: status, get, dismiss, enter, or return`);if(n.length>1)throw new e(`INVALID_ARGS`,`keyboard accepts at most one subcommand argument`);if(t.platform===`android`)return await mn(t,a);if(b(t))return await hn(t,a,r,i);throw new e(`UNSUPPORTED_OPERATION`,`keyboard is supported only on Android and iOS`)}async function mn(e,t){if(t===`enter`||t===`return`){let{pressAndroidEnter:t}=await import(`./input-actions.js`).then(e=>e.s);return await t(e),{platform:`android`,action:`enter`,...g(`Keyboard enter pressed`)}}if(t===`dismiss`){let{dismissAndroidKeyboard:t}=await import(`./device-input-state.js`).then(e=>e.t),n=await t(e);return{platform:`android`,action:`dismiss`,attempts:n.attempts,wasVisible:n.wasVisible,dismissed:n.dismissed,visible:n.visible,inputType:n.inputType,type:n.type,inputMethodPackage:n.inputMethodPackage,focusedPackage:n.focusedPackage,focusedResourceId:n.focusedResourceId,inputOwner:n.inputOwner}}let{getAndroidKeyboardState:n}=await import(`./device-input-state.js`).then(e=>e.t),r=await n(e);return{platform:`android`,action:`status`,visible:r.visible,inputType:r.inputType,type:r.type,inputMethodPackage:r.inputMethodPackage,focusedPackage:r.focusedPackage,focusedResourceId:r.focusedResourceId,inputOwner:r.inputOwner}}async function hn(t,n,r,i){if(n!==`dismiss`&&n!==`enter`&&n!==`return`)throw new e(`UNSUPPORTED_OPERATION`,`keyboard status/get is currently supported only on Android; use keyboard dismiss or enter on iOS`);if(n===`enter`||n===`return`){let{runAppleRunnerCommand:e}=await import(`./runner-client.js`).then(e=>e.o),n=await e(t,{command:`keyboardReturn`,appBundleId:r?.appBundleId},i);return{platform:`ios`,action:`enter`,visible:n.visible,wasVisible:n.wasVisible,...g(`Keyboard enter pressed`)}}let{runAppleRunnerCommand:a}=await import(`./runner-client.js`).then(e=>e.o),o=await a(t,{command:`keyboardDismiss`,appBundleId:r?.appBundleId},i);return{platform:`ios`,action:`dismiss`,wasVisible:o.wasVisible,dismissed:o.dismissed,visible:o.visible,...g(o.dismissed?`Keyboard dismissed`:`Keyboard already hidden`)}}async function gn(t,n,i,a){let[o,s,c,l]=i;if(!o||!s&&o!==`clear-app-state`)throw new e(`INVALID_ARGS`,`settings requires setting state`);if(o===`clear-app-state`){let i=(s===`clear`?c:s)??a?.appBundleId;if(!i)throw new e(`INVALID_ARGS`,`settings clear-app-state requires an app id or an active app session.`);r({level:`debug`,phase:`settings_apply`,data:{setting:o,state:`clear`,appBundleId:i,platform:t.platform}});let l=await n.setSetting(o,`clear`,i);return l&&typeof l==`object`?_({setting:o,state:`clear`,...l},yn(l)??`Cleared user data for ${i}`):{setting:o,state:`clear`,...g(`Cleared user data for ${i}`)}}if(!s)throw new e(`INVALID_ARGS`,`settings requires setting state`);let u=o===`location`&&s===`set`,d=(o===`permission`||u?i[4]:i[2])??a?.appBundleId,f=o===`permission`?{permissionTarget:c,permissionMode:l}:u?{latitude:ue(c,`latitude`),longitude:ue(l,`longitude`)}:void 0;r({level:`debug`,phase:`settings_apply`,data:u?{setting:o,state:s,latitude:c,longitude:l,platform:t.platform}:o===`permission`?{setting:o,state:s,permissionTarget:c,permissionMode:l,platform:t.platform}:{setting:o,state:s,appBundleId:d,platform:t.platform}});let p=await n.setSetting(o,s,d,f);return p&&typeof p==`object`?_({setting:o,state:s,...p},yn(p)??`Updated setting: ${o}`):{setting:o,state:s,...g(`Updated setting: ${o}`)}}async function _n(t,n,r){let i=n[0]?.trim(),a=n[1]?.trim();if(!i||!a)throw new e(`INVALID_ARGS`,`push requires <bundle|package> <payload.json|inline-json>`);let o=await $t(a);if(b(t)){let{pushIosNotification:e}=await import(`./apps.js`).then(e=>e.t);return await e(t,i,o),{platform:`ios`,bundleId:i,...g(`Pushed notification to ${i}`)}}let{pushAndroidNotification:s}=await import(`./notifications.js`),c=await s(t,i,o);return{platform:`android`,package:i,action:c.action,extrasCount:c.extrasCount,...g(`Pushed notification to ${i}`)}}async function vn(e,t){return await e.snapshot({appBundleId:t?.appBundleId,interactiveOnly:t?.snapshotInteractiveOnly,depth:t?.snapshotDepth,scope:t?.snapshotScope,raw:t?.snapshotRaw,includeRects:t?.snapshotIncludeRects,includeHiddenContentHints:t?.snapshotIncludeHiddenContentHints,surface:t?.surface})}function yn(e){return typeof e.message==`string`&&e.message.length>0?e.message:void 0}function bn(e,t,r,i,a,o){return{requestId:a??n().requestId,appBundleId:r,runnerLeaseContext:he({meta:o}),activity:t?.activity,launchConsole:t?.launchConsole,launchArgs:t?.launchArgs,clearAppState:t?.clearAppState,verbose:t?.verbose,logPath:e,traceLogPath:i,iosXctestrunFile:t?.iosXctestrunFile,iosXctestDerivedDataPath:t?.iosXctestDerivedDataPath,iosXctestEnvDir:t?.iosXctestEnvDir,screenshotCaptureBackend:t?.maestro?.screenshotCaptureBackend,snapshotInteractiveOnly:t?.snapshotInteractiveOnly,snapshotDepth:t?.snapshotDepth,snapshotScope:t?.snapshotScope,snapshotRaw:t?.snapshotRaw,snapshotIncludeHiddenContentHints:t?.snapshotIncludeHiddenContentHints,...d(t),count:t?.count,intervalMs:t?.intervalMs,delayMs:t?.delayMs,durationMs:t?.durationMs,holdMs:t?.holdMs,jitterPx:t?.jitterPx,pixels:t?.pixels,doubleTap:t?.doubleTap,clickButton:h(t),backMode:t?.backMode,pauseMs:t?.pauseMs,pattern:t?.pattern}}export{we as C,Ee as S,qe as _,Qt as a,Oe as b,dt as c,ot as d,ct as f,Ue as g,Je as h,rn as i,ft as l,We as m,tn as n,W as o,st as p,nn as r,G as s,bn as t,V as u,Me as v,Te as x,De as y};
1
+ import{_ as e}from"./sdk-contracts.js";import{Cn as t,Nt as n,Pt as r,an as i,in as a,it as o,nt as s,rt as c,t as l,tt as u,wn as d}from"./viewport-dimension.js";import{J as f,S as p,W as m,b as ee,p as te,q as ne,r as h,x as re,y as ie}from"./screenshot-geometry.js";import{a as ae,g as oe,s as g}from"./sdk-batch-runner.js";import{M as se}from"./screenshot-result.js";import{_ as ce,c as _,f as le,h as v,o as ue,p as de,s as y,v as b}from"./sdk-device.js";import{_ as fe,a as pe}from"./device.js";import{d as me}from"./runtime.js";import{I as x,N as he,j as S}from"./sdk-android-adb.js";import{t as ge}from"./timeouts.js";import{a as _e,o as ve}from"./boot-diagnostics.js";import{i as ye}from"./lease-context.js";import{i as be,n as xe,r as Se,t as Ce}from"./register-builtins.js";import we from"node:path";import{AsyncLocalStorage as C}from"node:async_hooks";import Te,{promises as Ee}from"node:fs";let De=[];const Oe=new C;async function ke(e,t){return await Oe.run([...e],t)}function Ae(e,t){for(let n of T()){if(!n.ownsDevice(e))continue;let r=n.getInteractor(e,t);if(r)return r}}function w(e){return T().some(t=>t.ownsDevice(e))}async function je(e,t,n,r){for(let i of T()){if(!i.ownsDevice(e))continue;if(!i.installApp)throw k(i,e,`install`);let a=await i.installApp?.(e,t,n,r);if(a)return a;throw k(i,e,`install`)}}async function Me(e,t,n){for(let r of T()){if(!r.ownsDevice(e))continue;if(!r.installInstallablePath)throw k(r,e,`install_from_source`);let i=await r.installInstallablePath?.(e,t,n);if(i)return i;throw k(r,e,`install_from_source`)}}async function Ne(e){for(let t of T()){if(!O(t,e.provider))continue;let n=await t.configurePortReverse?.(e);if(n)return n}}function T(){return Oe.getStore()??De}function Pe(e,t={}){let n=e.map(e=>e.provider);return{providerRuntimeIds:n,providerRuntimeRequiredIds:Le([...n,...t.providerRuntimeRequiredIds??[]]),leaseLifecycleProvider:Re(e),recoverableProviderIds:e.filter(e=>e.recoverExpiredLease!==void 0).map(e=>e.provider),recoverExpiredLease:Ie(e),cloudArtifactProvider:ze(e),deviceInventoryProvider:Be(e),appleRunnerProvider:Fe(e),providerDeviceRuntimeScope:async t=>await ke(e,t)}}function Fe(e){if(e.some(E))return t=>{for(let n of e){if(!E(n)||!n.ownsDevice(t.device))continue;let e=n.getAppleRunnerProvider(t.device);if(e)return e}}}function E(e){return`getAppleRunnerProvider`in e&&typeof e.getAppleRunnerProvider==`function`}function Ie(t){if(t.some(e=>e.recoverExpiredLease!==void 0))return async n=>{let r=t.find(e=>O(e,n.leaseProvider));if(!r?.recoverExpiredLease)throw new e(`UNSUPPORTED_OPERATION`,`Provider ${n.leaseProvider??`unknown`} cannot recover an expired lease.`,{provider:n.leaseProvider,leaseId:n.leaseId});await r.recoverExpiredLease(n)}}function Le(e){return[...new Set(e)]}function Re(e){if(e.length!==0)return{allocate:async(t,n)=>await D(e,`allocate`,t,n),heartbeat:async(t,n)=>await D(e,`heartbeat`,t,n),release:async(t,n)=>await D(e,`release`,t,n)}}function ze(e){if(e.length!==0)return{listCloudArtifacts:async t=>await Ve(e,t)}}function Be(e){if(e.length!==0)return async t=>{for(let n of e){if(!O(n,t.leaseProvider))continue;let e=await n.deviceInventoryProvider(t);if(e)return e}return null}}async function Ve(e,t){for(let n of e){if(!O(n,t.provider))continue;let e=await n.cloudArtifacts?.listCloudArtifacts?.(t);if(e)return e}}async function D(e,t,n,r){for(let i of e){if(!O(i,n.leaseProvider))continue;let e=i.leaseLifecycle[t],a=e?await e(n,r):void 0;if(a)return a}}function O(e,t){return e.provider===t}function k(t,n,r){throw new e(`UNSUPPORTED_OPERATION`,`Provider device runtime ${t.provider} does not support ${r} for this device.`,{provider:t.provider,deviceId:n.id,platform:v(n)})}const A=new C,j=new C;async function He(t,n,r){let i=await Ue(t,n,r);if(i)return i;let a=await We(t,n,r);if(r.allowLocalSimulatorFallback!==!1&&Ke(n,a)){let{findBootableIosSimulator:e}=await import(`./devices2.js`),t=await e({simulatorSetPath:r.simulatorSetPath,target:n.target});if(t)return t}if(a)return a;throw new e(`DEVICE_NOT_FOUND`,`No devices found`,{selector:n})}async function Ue(t,n,r){let i=r.appleSimulatorAppTarget?.trim();if(!i||M(n)||r.allowLocalSimulatorFallback===!1)return;let a=t.filter(e=>de(e,n)&&y(e)&&e.kind===`simulator`&&e.booted===!0);if(a.length<2)return;let{findIosSimulatorInstalledApp:o}=await import(`./apps.js`).then(e=>e.t),s=(await Promise.all(a.map(async e=>await o(e,i)?e:void 0))).filter(e=>e!==void 0);if(s.length===1)return s[0];let c=a.map(e=>({id:e.id,name:e.name}));throw s.length===0?new e(`APP_NOT_INSTALLED`,`No booted iOS simulator has ${i} installed`,{appTarget:i,candidates:c,hint:`Install the app on a booted simulator, or pass --udid to select the intended device explicitly.`}):new e(`AMBIGUOUS_MATCH`,`Multiple booted iOS simulators have ${i} installed`,{appTarget:i,candidates:s.map(e=>({id:e.id,name:e.name})),hint:`Pass --udid to select the intended simulator explicitly.`})}async function We(e,t,n){try{return await b(e,t,n)}catch(e){if(Ge(e,t))return;throw e}}function Ge(t,n){return!M(n)&&t instanceof e&&t.code===`DEVICE_NOT_FOUND`}function Ke(e,t){return!M(e)&&(!e.platform||e.platform===`apple`||e.platform===`ios`)&&e.target!==`desktop`&&(!t||t.kind===`device`)}function M(e){return!!(e.udid||e.serial||e.deviceName)}async function qe(e,t={}){let n=Je(e),{iosSimulatorSetPath:r,...i}=n,a=tt(n,t),o={simulatorSetPath:r,allowStoppedAndroidAvdPlaceholders:t.allowStoppedAndroidAvdPlaceholders},s={platform:n.platform,target:e.target,cacheHit:!1};return await x(`resolve_target_device`,async()=>{let e=et(a);if(e)return s.cacheHit=!0,e;let c=await N(n);if(c)return P(i)?F(a,await He(c,i,{simulatorSetPath:r,allowLocalSimulatorFallback:n.leaseProvider===void 0,appleSimulatorAppTarget:t.appleSimulatorAppTarget})):F(a,await b(c,i,o));let l=await be(n);return P(i)?F(a,await He(l,i,{simulatorSetPath:r,appleSimulatorAppTarget:t.appleSimulatorAppTarget})):F(a,await b(l,i,o))},s)}function Je(t){let n=t.platform;if(t.target&&!n)throw new e(`INVALID_ARGS`,`Device target selector requires --platform. Use --platform ios|macos|android|vega|linux|apple with --target mobile|tv|desktop.`);let r=ce({simulatorSetPath:ve(t.iosSimulatorDeviceSet),platform:n,target:t.target}),i=_e(t.androidDeviceAllowlist);return{platform:n,target:t.target,deviceName:t.device,udid:t.udid,serial:t.serial,leaseId:t.leaseId,leaseProvider:t.leaseProvider,deviceKey:t.deviceKey,clientId:t.clientId,iosSimulatorSetPath:r,androidSerialAllowlist:i?Array.from(i).sort():void 0}}async function Ye(e){return A.getStore()?await e():await A.run(new Map,e)}async function Xe(e,t){return e?await j.run(e,t):await t()}async function Ze(e,t){return await Xe(e,async()=>await Ye(t))}async function Qe(e){return await N(e)??await be(e)}async function N(e){let t=j.getStore();if(!t)return null;let n=await t(e);return n==null?null:n.map(e=>({...e}))}function $e(e){return ue(e.platform)}function P(e){return $e(e)}function et(e){let t=A.getStore()?.get(e);if(t)return{...t}}function F(e,t){return A.getStore()?.set(e,{...t}),t}function tt(e,t){let{appleSimulatorAppTarget:n,...r}=t;return JSON.stringify({request:e,options:r})}Ce();const nt={device:!0},rt=[`open`,`close`],it=[`record`],at=[`audio`,`find`,`get`,`is`,`network`,`screenshot`,`snapshot`,`wait`],ot=[`click`,`fill`,`focus`,`press`,`scroll`,`type`],st=[`viewport`],I=new Set([...rt,...it,...at,...ot,...st]),L=ct(ae(oe));function ct(e){let t={};for(let[n,r]of Object.entries(e))t[n]=I.has(n)?{...r,web:nt}:r;for(let t of I)if(!(t in e))throw Error(`Web command "${t}" missing from capability matrix`);return t}function R(e,t){let n=L[e];if(!n)return!0;let r=Se(t.platform);if(!r)return!1;let i=n[r.capability.bucket];if(!i)return!1;let a=r.capability.supportsByDefault?.[e];return a&&!a(t)?!1:i[t.kind??`unknown`]===!0}function lt(e,t){return Se(t.platform)?.capability.unsupportedHintByDefault?.[e]?.(t)}function ut(){return Object.keys(L).sort()}function dt(e){let t=L[e];if(!t)return[];let n=[`apple`,`android`,`vega`,`linux`,`web`],r=[];for(let e of n){let n=t[e];n&&Object.values(n).some(e=>e===!0)&&r.push(e)}return r}function ft(e,t){if(t.platform===`web`||t.appleOs===`watchos`)throw B(e,z(e,t));if(pt(e)){mt(e,t);return}if(t.appleOs===`visionos`)throw B(e,z(e,t));if(e.intent===`fling`&&`direction`in e&&t.platform===`linux`)throw B(e,`gesture fling is not supported on Linux`)}function pt(e){return e.intent===`pan`?(`pointerCount`in e?e.pointerCount:1)===2:e.intent===`pinch`||e.intent===`rotate`||e.intent===`transform`}function mt(e,t){if(t.platform===`android`){if(t.target!==`tv`)return;throw B(e,`gesture ${e.intent} is not supported on Android TV`,`Android TV has no touch input — this gesture is supported on Android phones, tablets, and the iOS simulator only.`)}if(t.platform!==`apple`)throw B(e,z(e,t));fe(t,e.intent)}function z(e,t){return`gesture ${e.intent} is not supported on ${t.appleOs??t.platform}`}function B(t,n,r){return new e(`UNSUPPORTED_OPERATION`,n,{gesture:t.intent,...r?{hint:r}:{}})}const V=`No active session. Run open first.`;function H(e,t,n){return{ok:!1,error:{code:e,message:t,...n?{details:n}:{}}}}function ht(){return H(`SESSION_NOT_FOUND`,V)}function gt(e,t,n){if(R(e,t))return null;let r=n?.hint?lt(e,t):void 0;return{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:n?.message??`${e} is not supported on this device`,...r?{hint:r}:{}}}}const _t=/^[A-Za-z0-9_.:-]{1,64}$/,U=8*1024,W=4*1024;function vt(t){let n=t[0]?.trim(),r=t[1]?.trim();if(!n)throw new e(`INVALID_ARGS`,`trigger-app-event requires <event> [payloadJson]`);if(!_t.test(n))throw new e(`INVALID_ARGS`,`Invalid trigger-app-event event name: ${n}`,{hint:`Use 1-64 chars: letters, numbers, underscore, dot, colon, or dash.`});if(t.length>2)throw new e(`INVALID_ARGS`,`trigger-app-event accepts at most two arguments: <event> [payloadJson]`);return{eventName:n,payload:bt(r,n)}}function yt(t,n,r){let i=v(t),a=xt(t);if(!a)throw new e(`UNSUPPORTED_OPERATION`,`No app event URL template configured for ${i}.`,{hint:`Set AGENT_DEVICE_${i.toUpperCase()}_APP_EVENT_URL_TEMPLATE or AGENT_DEVICE_APP_EVENT_URL_TEMPLATE, for example "myapp://agent-device/event?name={event}&payload={payload}".`});let o=r?JSON.stringify(r):``,s=a.replaceAll(`{event}`,encodeURIComponent(n)).replaceAll(`{payload}`,encodeURIComponent(o)).replaceAll(`{platform}`,encodeURIComponent(i));if(s.length>W)throw new e(`INVALID_ARGS`,`trigger-app-event URL exceeds maximum supported length`,{hint:`Reduce payload size or shorten AGENT_DEVICE_*_APP_EVENT_URL_TEMPLATE.`,length:s.length,maxLength:W});return s}function bt(t,n){if(t)try{let r=JSON.parse(t);if(!r||typeof r!=`object`||Array.isArray(r))throw new e(`INVALID_ARGS`,`trigger-app-event payload for "${n}" must be a JSON object`);let i=JSON.stringify(r);if(Buffer.byteLength(i,`utf8`)>U)throw new e(`INVALID_ARGS`,`trigger-app-event payload for "${n}" exceeds ${U} bytes`);return r}catch(n){throw n instanceof e?n:new e(`INVALID_ARGS`,`Invalid trigger-app-event payload JSON: ${t}`)}}function xt(e){return((y(e)?process.env.AGENT_DEVICE_IOS_APP_EVENT_URL_TEMPLATE:_(e)?process.env.AGENT_DEVICE_MACOS_APP_EVENT_URL_TEMPLATE:process.env.AGENT_DEVICE_ANDROID_APP_EVENT_URL_TEMPLATE)??process.env.AGENT_DEVICE_APP_EVENT_URL_TEMPLATE)?.trim()||void 0}const G=[[0,0],[1,0],[0,1],[-1,0],[0,-1],[1,1],[-1,1],[1,-1],[-1,-1]];function St(e,t){return ue(e.platform)&&t>1}function Ct(e,t,n=2e4){if(e.length===0)return[];let r=t>0?t:e.length,i=[],a=[],o=0;for(let t of e){let e=(t.durationMs??0)+(t.pauseMs??0)+250,s=a.length>0&&o+e>n,c=a.length>=r;(s||c)&&(i.push(a),a=[],o=0),a.push(t),o+=e}return a.length>0&&i.push(a),i}function K(e,t){if(t<=0)return[0,0];let[n,r]=G[e%G.length];return[n*t,r*t]}async function wt(e,t,n){for(let r=0;r<e;r+=1)await n(r),r<e-1&&t>0&&await ge(t)}async function Tt(e,t){let{x:n,y:r}=q(t,`longpress requires x y [durationMs]`,{hint:`Direct platform longpress requires coordinates. In an open daemon session, use agent-device longpress @ref|selector [durationMs]; otherwise run snapshot -i, use the target rect center as x y, then retry longpress x y durationMs.`}),i=t[2]?Number(t[2]):void 0;return await e.longPress(n,r,i),{x:n,y:r,durationMs:i,...a(`Long pressed (${n}, ${r})`)}}async function Et(e,t){let{x:n,y:r}=q(t,`focus requires x y`);return await e.focus(n,r),{x:n,y:r,...a(`Focused (${n}, ${r})`)}}async function Dt(t,n,r){let i=Zt(n);if(i)throw new e(`INVALID_ARGS`,`type does not accept a target ref like "${i}"`,{hint:`Use fill ${i} "text" to target that field, or press ${i} then type "text" to append.`});let o=n.join(` `);if(!o)throw new e(`INVALID_ARGS`,`type requires text`);let s=u(r?.delayMs??0,`delay-ms`,0,1e4);return await t.type(o,s),{text:o,delayMs:s,...a(Z(`Typed`,o))}}async function Ot(t,n,r){if(r?.directElementSelector)return await kt(t,r.directElementSelector,n,r);let i=Number(n[0]),o=Number(n[1]),s=n.slice(2).join(` `);if(Number.isNaN(i)||Number.isNaN(o)||!s)throw new e(`INVALID_ARGS`,`fill requires x y text`);let c=u(r?.delayMs??0,`delay-ms`,0,1e4);return await t.fill(i,o,s,c),{x:i,y:o,text:s,delayMs:c,...a(Z(`Filled`,s))}}async function kt(t,n,r,i){if(!t.fillElementSelector)throw new e(`UNSUPPORTED_OPERATION`,`direct element selector fill is not supported`);let o=r.join(` `);if(!o)throw new e(`INVALID_ARGS`,`fill requires text`);let s=u(i.delayMs??0,`delay-ms`,0,1e4),c=await t.fillElementSelector(n,o,s);return{selector:n.raw,text:o,delayMs:s,...c??{},...a(Z(`Filled`,o))}}async function At(e,t,n,r){if(r?.directElementSelector&&y(e))return await jt(t,r.directElementSelector);let{x:i,y:a}=q(n,`press requires x y`);if(_(e)&&r?.surface&&r.surface!==`app`)return await Mt(i,a,r);let o=f(r);if(o!==`primary`)return await Nt(e,i,a,o,r);let s=It(r);return Lt(s),St(e,s.count)?await zt(e,i,a,s,r):await Ht(t,i,a,s)}async function jt(t,n){if(!t.tapElementSelector)throw new e(`UNSUPPORTED_OPERATION`,`direct element selector tap is not supported`);let r=await t.tapElementSelector(n),i=r?.maestroNonHittableCoordinateFallbackUsed===!0;return{selector:n.raw,...r??{},...a(i?p:`Tapped ${n.raw}`)}}function q(t,n,r){let i=Number(t[0]),a=Number(t[1]);if(Number.isNaN(i)||Number.isNaN(a))throw new e(`INVALID_ARGS`,n,r);return{x:i,y:a}}async function Mt(t,n,r){let i=f(r);if(i!==`primary`)throw new e(`UNSUPPORTED_OPERATION`,`${i} click is not supported on macOS ${r.surface} sessions.`);let{runMacOsPressAction:o}=await import(`./helper.js`).then(e=>e.t);return await o(t,n,{bundleId:r.appBundleId,surface:r.surface}),{x:t,y:n,...a(X({x:t,y:n}))}}async function Nt(e,t,n,r,i){if(Pt(e,r,i),e.platform===`linux`)return await Ft(t,n,r);let{runAppleRunnerCommand:o}=await import(`./runner-client.js`).then(e=>e.o);return await o(e,{command:`mouseClick`,x:t,y:n,button:r,appBundleId:i?.appBundleId},Y(i)),{x:t,y:n,button:r,...a(X({x:t,y:n,button:r}))}}function Pt(e,t,n){let r=ne({commandLabel:`click`,platform:v(e),button:t,count:n?.count,intervalMs:n?.intervalMs,holdMs:n?.holdMs,jitterPx:n?.jitterPx,doubleTap:n?.doubleTap});if(r)throw r}async function Ft(e,t,n){if(n===`secondary`){let{rightClickLinux:n}=await import(`./input-actions2.js`);await n(e,t)}else{let{middleClickLinux:n}=await import(`./input-actions2.js`);await n(e,t)}return{x:e,y:t,button:n,...a(X({x:e,y:t,button:n}))}}function It(e){return{count:J(e?.count,1,`count`,1,200),intervalMs:J(e?.intervalMs,0,`interval-ms`,0,1e4),holdMs:J(e?.holdMs,0,`hold-ms`,0,1e4),jitterPx:J(e?.jitterPx,0,`jitter-px`,0,100),doubleTap:!!e?.doubleTap}}function J(e,t,n,r,i){return u(e===void 0?t:e,n,r,i)}function Lt({doubleTap:t,holdMs:n,jitterPx:r}){if(t&&n>0)throw new e(`INVALID_ARGS`,`double-tap cannot be combined with hold-ms`);if(t&&r>0)throw new e(`INVALID_ARGS`,`double-tap cannot be combined with jitter-px`)}async function Rt(e,t,n){let{runAppleRunnerCommand:r}=await import(`./runner-client.js`).then(e=>e.o),{MAX_RUNNER_SEQUENCE_STEPS:i,buildRunnerSequenceCommand:a,parseRunnerSequenceResult:o}=await import(`./runner-sequence.js`).then(e=>e.r),s=Ct(t,i),c,l,u=0,d=[],f=0;for(let t of s){let i=await r(e,a(t,n?.appBundleId),Y(n));c??=i,l=i;let s;try{s=o(i)}catch(e){throw Vt(e,f)}u+=s.completedSteps,d.push(...s.results),f+=t.length}return{...c??{},completedSteps:u,sequenceResults:d,...l?.gestureEndUptimeMs===void 0?{}:{gestureEndUptimeMs:l.gestureEndUptimeMs}}}async function zt(e,t,n,r,i){let o=await Rt(e,Bt(e,t,n,r),i);return{x:t,y:n,count:r.count,intervalMs:r.intervalMs,holdMs:r.holdMs,jitterPx:r.jitterPx,doubleTap:r.doubleTap,timingMode:`runner-sequence`,...o,...a(X({x:t,y:n}))}}function Bt(e,t,n,r){let i=r.doubleTap?`doubleTap`:r.holdMs>0?`longPress`:`tap`,a=i===`tap`&&y(e)&&!le(e);return Array.from({length:r.count},(e,o)=>{let[s,c]=K(o,r.jitterPx),l=o===r.count-1;return{kind:i,x:t+s,y:n+c,...a?{synthesized:!0}:{},...r.holdMs>0?{durationMs:r.holdMs}:{},...!l&&r.intervalMs>0?{pauseMs:r.intervalMs}:{}}})}function Vt(t,n){if(n===0||!(t instanceof e)||!t.details)return t;let r=t.details.failedStepIndex;if(typeof r!=`number`)return t;let i=t.details.completedSteps;return new e(t.code,t.message,{...t.details,failedStepIndex:r+n,chunkStepIndex:r,...typeof i==`number`?{completedSteps:n+i}:{}},t.cause)}async function Ht(e,t,n,r){let a;return await wt(r.count,r.intervalMs,async i=>{let[o,s]=K(i,r.jitterPx),c=t+o,l=n+s;if(r.doubleTap){let t=await e.doubleTap(c,l);a??=t??void 0;return}if(r.holdMs>0){let t=await e.longPress(c,l,r.holdMs);a??=t??void 0}else{let t=await e.tap(c,l);a??=t??void 0}}),i({x:t,y:n,count:r.count,intervalMs:r.intervalMs,holdMs:r.holdMs,jitterPx:r.jitterPx,doubleTap:r.doubleTap,...a},X({x:t,y:n}))}function Y(e){return{verbose:e?.verbose,logPath:e?.logPath,traceLogPath:e?.traceLogPath,requestId:e?.requestId,iosXctestrunFile:e?.iosXctestrunFile,iosXctestDerivedDataPath:e?.iosXctestDerivedDataPath,iosXctestEnvDir:e?.iosXctestEnvDir}}async function Ut(t,n,r){let a=n[0],o=n[1]?Number(n[1]):void 0,s=r?.pixels,l=r?.durationMs;if(!a)throw new e(`INVALID_ARGS`,`scroll requires direction`);Wt(o,s,l);let u=Yt(a),d={amount:o,pixels:s,durationMs:l},{interactionResult:f,completedPasses:p}=await Kt(t,r,u,d);return i(qt(u,d,p,f),c(u.direction,u.edge,p,o,s))}function Wt(e,t,n){Gt(e),re(n),ie({amount:e,pixels:t})}function Gt(t){if(t!==void 0&&!Number.isFinite(t))throw new e(`INVALID_ARGS`,`scroll amount must be a number`)}async function Kt(e,t,n,r){if(n.edge){let i=n.edge,a=await o({edge:i,captureState:async n=>await Jt(e,t,i,n),scroll:async()=>await e.scroll(n.direction,r)});return{interactionResult:a.result??{},completedPasses:a.passes}}return{interactionResult:await e.scroll(n.direction,r)??{},completedPasses:1}}function qt(e,t,n,r){let i=ee(r);return{direction:e.direction,...e.edge?{edge:e.edge,passes:n}:{},...t.amount===void 0?{}:{amount:t.amount},...t.pixels===void 0?{}:{pixels:t.pixels},...i===void 0?{}:{durationMs:i},...r}}async function Jt(t,n,r,i){if(typeof t.snapshot!=`function`)throw new e(`UNSUPPORTED_OPERATION`,`scroll ${r} requires snapshot support to verify hidden content before scrolling`);let a=t.snapshot;return await s({edge:r,scope:i,captureNodes:async e=>(await a({appBundleId:n?.appBundleId,scope:e})).nodes??[]})}function Yt(e){return e===`bottom`?{direction:`down`,edge:`bottom`}:e===`top`?{direction:`up`,edge:`top`}:{direction:m(e)}}async function Xt(e,t,n){let{x:r,y:i}=q(t,`read requires x y`);if(e.platform===`android`){let{readAndroidTextAtPoint:t}=await import(`./input-actions.js`).then(e=>e.s);return{action:`read`,text:await t(e,r,i)??``}}if(e.platform===`linux`){let{readLinuxTextAtPoint:e}=await import(`./snapshot.js`).then(e=>e.n);return{action:`read`,text:await e(r,i,n?.surface)}}if(_(e)&&n?.surface&&n.surface!==`app`){let{runMacOsReadTextAction:e}=await import(`./helper.js`).then(e=>e.t);return{action:`read`,text:(await e(r,i,{bundleId:n.appBundleId,surface:n.surface})).text}}let{runAppleRunnerCommand:a}=await import(`./runner-client.js`).then(e=>e.o),o=await a(e,{command:`readText`,x:r,y:i,appBundleId:n?.appBundleId},{verbose:n?.verbose,logPath:n?.logPath,traceLogPath:n?.traceLogPath,requestId:n?.requestId,iosXctestrunFile:n?.iosXctestrunFile,iosXctestDerivedDataPath:n?.iosXctestDerivedDataPath,iosXctestEnvDir:n?.iosXctestEnvDir});return{action:`read`,text:typeof o.text==`string`?o.text:typeof o.message==`string`?o.message:``}}function Zt(e){return me(e[0])}function X(e){return e.button&&e.button!==`primary`?`Clicked ${e.button} (${e.x}, ${e.y})`:`Tapped (${e.x}, ${e.y})`}function Z(e,t){return`${e} ${Array.from(t).length} chars`}function Qt(e){let t=e.trim();return t.startsWith(`{`)&&t.endsWith(`}`)||t.startsWith(`[`)&&t.endsWith(`]`)}function $t(t,n){let r=n?.subject??`Payload`,i=t.trim();if(!i)throw new e(`INVALID_ARGS`,`${r} cannot be empty`);let a=n?.expandPath?n.expandPath(i,n.cwd):i;try{if(!Te.statSync(a).isFile())throw new e(`INVALID_ARGS`,`${r} path is not a file: ${a}`);return{kind:`file`,path:a}}catch(t){if(t instanceof e)throw t;let n=t.code;if(n===`EACCES`||n===`EPERM`)throw new e(`INVALID_ARGS`,`${r} file is not readable: ${a}`);if(n&&n!==`ENOENT`)throw new e(`COMMAND_FAILED`,`Unable to read ${r} file: ${a}`,{cause:String(t)})}if(Qt(i))return{kind:`inline`,text:i};throw new e(`INVALID_ARGS`,`${r} file not found: ${a}`)}async function en(t){let n=$t(t,{subject:`Push payload`}),r=n.kind===`inline`?n.text:await tn(n.path);try{let t=JSON.parse(r);if(!t||typeof t!=`object`||Array.isArray(t))throw new e(`INVALID_ARGS`,`push payload must be a JSON object`);return t}catch(n){throw n instanceof e?n:new e(`INVALID_ARGS`,`Invalid push payload JSON: ${t}`)}}async function tn(t){try{return await Ee.readFile(t,`utf8`)}catch(n){let r=n.code;throw r===`ENOENT`?new e(`INVALID_ARGS`,`Push payload file not found: ${t}`):r===`EISDIR`?new e(`INVALID_ARGS`,`Push payload path is not a file: ${t}`):r===`EACCES`||r===`EPERM`?new e(`INVALID_ARGS`,`Push payload file is not readable: ${t}`):new e(`COMMAND_FAILED`,`Unable to read push payload file: ${t}`,{cause:String(n)})}}Ce();async function Q(t,n){if(w(t)){let r=Ae(t,n);if(r)return r;throw new e(`UNSUPPORTED_OPERATION`,`Provider device runtime does not have an active interactor for this device.`,{deviceId:t.id,platform:v(t)})}return await xe(t.platform).createInteractor(t,n)}async function nn(e,t,n,r,i){let a=$(i),o=await Q(e,a);return S({level:`debug`,phase:`platform_command_prepare`,data:{command:t,platform:e.platform,kind:e.kind}}),await x(`platform_command`,async()=>await sn(e,o,t,n,r,i,a),{command:t,platform:e.platform})}async function rn(t,n,r){let i=await Q(t,$(r));if(!i.performGesture)throw new e(`UNSUPPORTED_OPERATION`,`Gesture execution is unavailable`);return await i.performGesture(n)}async function an(e,t){return await(await Q(e,$(t))).gestureViewport?.()}function $(e){return{requestId:e?.requestId,signal:e?.signal,appBundleId:e?.appBundleId,verbose:e?.verbose,logPath:e?.logPath,traceLogPath:e?.traceLogPath,iosXctestrunFile:e?.iosXctestrunFile,iosXctestDerivedDataPath:e?.iosXctestDerivedDataPath,iosXctestEnvDir:e?.iosXctestEnvDir,runnerLeaseContext:e?.runnerLeaseContext}}const on={open:({device:e,interactor:t,positionals:n,context:r})=>cn(e,t,n,r),close:async({device:e,interactor:t,positionals:n})=>{let r=n[0];return r?(await t.close(r),{app:r,...a(`Closed: ${r}`)}):(e.platform===`web`&&await t.close(``),{closed:`session`,...a(`Closed session`)})},press:({device:e,interactor:t,positionals:n,context:r})=>At(e,t,n,r),longpress:({interactor:e,positionals:t})=>Tt(e,t),focus:({interactor:e,positionals:t})=>Et(e,t),type:({interactor:e,positionals:t,context:n})=>Dt(e,t,n),fill:({interactor:e,positionals:t,context:n})=>Ot(e,t,n),scroll:({interactor:e,positionals:t,context:n})=>Ut(e,t,n),"trigger-app-event":({device:e,interactor:t,positionals:n,context:r})=>ln(e,t,n,r),screenshot:({interactor:e,positionals:t,outPath:n,context:r})=>un(e,t,n,r),viewport:({interactor:e,positionals:t})=>dn(e,t),back:async({interactor:e,context:t})=>(await e.back(t?.backMode),{action:`back`,mode:t?.backMode??`in-app`,...a(`Back`)}),home:async({interactor:e})=>(await e.home(),{action:`home`,...a(`Home`)}),orientation:async({interactor:e,positionals:t})=>{let n=pe(t[0]),r=(await e.setOrientation(n))?.orientation??n;return{action:`orientation`,orientation:r,...a(`Rotated to ${r}`)}},"app-switcher":async({interactor:e})=>(await e.appSwitcher(),{action:`app-switcher`,...a(`Opened app switcher`)}),clipboard:({interactor:e,positionals:t})=>fn(e,t),keyboard:({device:e,positionals:t,context:n,runnerCtx:r})=>mn(e,t,n,r),"tv-remote":({device:e,interactor:t,positionals:n,context:r})=>pn(e,t,n,r),settings:({device:e,interactor:t,positionals:n,context:r})=>_n(e,t,n,r),push:({device:e,positionals:t,context:n})=>vn(e,t,n),snapshot:({interactor:e,context:t})=>yn(e,t),read:({device:e,positionals:t,context:n})=>Xt(e,t,n)};async function sn(t,n,r,i,a,o,s){let c=Object.hasOwn(on,r)?on[r]:void 0;if(!c)throw new e(`INVALID_ARGS`,`Unknown command: ${r}`);return await c({device:t,interactor:n,positionals:i,outPath:a,context:o,runnerCtx:s})}async function cn(t,i,o,s){let c=o[0],l=o[1],u=s?.launchConsole,d=s?.launchArgs;if(o.length>2)throw new e(`INVALID_ARGS`,`open accepts at most two arguments: <app|url> [url]`);if(!c){if(u)throw new e(`INVALID_ARGS`,`--launch-console requires an app target`);if(d&&d.length>0)throw new e(`INVALID_ARGS`,`--launch-args requires an app target`);return await i.openDevice(),{app:null,...a(`Opened device`)}}if(u&&(!y(t)||t.kind!==`simulator`))throw new e(`UNSUPPORTED_OPERATION`,r);if(t.platform===`linux`&&d&&d.length>0)throw new e(`UNSUPPORTED_OPERATION`,`--launch-args is not supported on Linux.`);if(l!==void 0){if(g(c))throw new e(`INVALID_ARGS`,`open <app> <url> requires an app target as the first argument`);if(!g(l))throw new e(`INVALID_ARGS`,`open <app> <url> requires a valid URL target`);if(u)throw new e(`INVALID_ARGS`,n);return await i.open(c,{activity:s?.activity,appBundleId:s?.appBundleId,launchArgs:d,terminateRunningApp:s?.terminateRunningApp,url:l}),{app:c,url:l,...a(`Opened: ${c}`)}}if(u&&g(c))throw new e(`INVALID_ARGS`,n);if(s?.clearAppState){if(g(c))throw new e(`INVALID_ARGS`,`Clearing app state requires an app target, not a deep link.`);await i.setSetting(`clear-app-state`,`clear`,c)}return await i.open(c,{activity:s?.activity,appBundleId:s?.appBundleId,launchConsole:u,launchArgs:d,terminateRunningApp:s?.terminateRunningApp}),{app:c,...u?{launchConsole:u}:{},...a(`Opened: ${c}`)}}async function ln(e,t,n,r){let{eventName:i,payload:o}=vt(n),s=yt(e,i,o);return await t.open(s,{appBundleId:r?.appBundleId}),{event:i,eventUrl:s,transport:`deep-link`,...a(`Triggered app event: ${i}`)}}async function un(e,t,n,r){let i=t[0]??n??`./screenshot-${Date.now()}.png`;await Ee.mkdir(we.dirname(i),{recursive:!0});let o=d(r);return await e.screenshot(i,{appBundleId:r?.appBundleId,pixelDensity:o.pixelDensity,fullscreen:o.fullscreen,normalizeStatusBar:o.normalizeStatusBar,stabilize:o.stabilize,surface:r?.surface,skipIosSimulatorBootCheck:r?.skipIosSimulatorBootCheck,captureBackend:r?.screenshotCaptureBackend}),{path:i,...a(`Saved screenshot: ${i}`)}}async function dn(t,n){if(n.length!==2)throw new e(`INVALID_ARGS`,`viewport requires exactly two arguments: <width> <height>`);let r=l(n[0],`width`),i=l(n[1],`height`);if(!t.setViewport)throw new e(`UNSUPPORTED_OPERATION`,`viewport is not supported by this backend`);return await t.setViewport(r,i),{width:r,height:i,...a(`Viewport set: ${r}x${i}`)}}async function fn(t,n){let r=(n[0]??``).toLowerCase();if(r!==`read`&&r!==`write`)throw new e(`INVALID_ARGS`,`clipboard requires a subcommand: read or write`);if(r===`read`){if(n.length!==1)throw new e(`INVALID_ARGS`,`clipboard read does not accept additional arguments`);return{action:r,text:await t.readClipboard()}}if(n.length<2)throw new e(`INVALID_ARGS`,`clipboard write requires text (use "" to clear clipboard)`);let i=n.slice(1).join(` `);return await t.writeClipboard(i),{action:r,textLength:Array.from(i).length,...a(`Clipboard updated`)}}async function pn(t,n,r,i){if(t.target!==`tv`)throw new e(`UNSUPPORTED_OPERATION`,`tv-remote is supported only on TV targets`,{hint:`Select an Android TV, tvOS, or Vega OS target with --target tv.`});if(r.length!==1)throw new e(`INVALID_ARGS`,`tv-remote requires exactly one button`);let o=te(r[0]),s=i?.durationMs===void 0?void 0:u(i.durationMs,`durationMs`,0,1e4);return await n.tvRemote(o,s),{action:`tv-remote`,button:o,...s===void 0?{}:{durationMs:s},...a(`Pressed TV remote ${o}`)}}async function mn(t,n,r,i){let a=(n[0]??`status`).toLowerCase();if(!se(a))throw new e(`INVALID_ARGS`,`keyboard requires a subcommand: status, get, dismiss, enter, or return`);if(n.length>1)throw new e(`INVALID_ARGS`,`keyboard accepts at most one subcommand argument`);if(t.platform===`android`)return await hn(t,a);if(y(t))return await gn(t,a,r,i);throw new e(`UNSUPPORTED_OPERATION`,`keyboard is supported only on Android and iOS`)}async function hn(e,t){if(t===`enter`||t===`return`){let{pressAndroidEnter:t}=await import(`./input-actions.js`).then(e=>e.s);return await t(e),{platform:`android`,action:`enter`,...a(`Keyboard enter pressed`)}}if(t===`dismiss`){let{dismissAndroidKeyboard:t}=await import(`./device-input-state.js`).then(e=>e.t),n=await t(e);return{platform:`android`,action:`dismiss`,attempts:n.attempts,wasVisible:n.wasVisible,dismissed:n.dismissed,visible:n.visible,inputType:n.inputType,type:n.type,inputMethodPackage:n.inputMethodPackage,focusedPackage:n.focusedPackage,focusedResourceId:n.focusedResourceId,inputOwner:n.inputOwner}}let{getAndroidKeyboardState:n}=await import(`./device-input-state.js`).then(e=>e.t),r=await n(e);return{platform:`android`,action:`status`,visible:r.visible,inputType:r.inputType,type:r.type,inputMethodPackage:r.inputMethodPackage,focusedPackage:r.focusedPackage,focusedResourceId:r.focusedResourceId,inputOwner:r.inputOwner}}async function gn(t,n,r,i){if(n!==`dismiss`&&n!==`enter`&&n!==`return`)throw new e(`UNSUPPORTED_OPERATION`,`keyboard status/get is currently supported only on Android; use keyboard dismiss or enter on iOS`);if(n===`enter`||n===`return`){let{runAppleRunnerCommand:e}=await import(`./runner-client.js`).then(e=>e.o),n=await e(t,{command:`keyboardReturn`,appBundleId:r?.appBundleId},i);return{platform:`ios`,action:`enter`,visible:n.visible,wasVisible:n.wasVisible,...a(`Keyboard enter pressed`)}}let{runAppleRunnerCommand:o}=await import(`./runner-client.js`).then(e=>e.o),s=await o(t,{command:`keyboardDismiss`,appBundleId:r?.appBundleId},i);return{platform:`ios`,action:`dismiss`,wasVisible:s.wasVisible,dismissed:s.dismissed,visible:s.visible,...a(s.dismissed?`Keyboard dismissed`:`Keyboard already hidden`)}}async function _n(t,n,r,o){let[s,c,l,u]=r;if(!s||!c&&s!==`clear-app-state`)throw new e(`INVALID_ARGS`,`settings requires setting state`);if(s===`clear-app-state`){let r=(c===`clear`?l:c)??o?.appBundleId;if(!r)throw new e(`INVALID_ARGS`,`settings clear-app-state requires an app id or an active app session.`);S({level:`debug`,phase:`settings_apply`,data:{setting:s,state:`clear`,appBundleId:r,platform:t.platform}});let u=await n.setSetting(s,`clear`,r);return u&&typeof u==`object`?i({setting:s,state:`clear`,...u},bn(u)??`Cleared user data for ${r}`):{setting:s,state:`clear`,...a(`Cleared user data for ${r}`)}}if(!c)throw new e(`INVALID_ARGS`,`settings requires setting state`);let d=s===`location`&&c===`set`,f=(s===`permission`||d?r[4]:r[2])??o?.appBundleId,p=s===`permission`?{permissionTarget:l,permissionMode:u}:d?{latitude:h(l,`latitude`),longitude:h(u,`longitude`)}:void 0;S({level:`debug`,phase:`settings_apply`,data:d?{setting:s,state:c,latitude:l,longitude:u,platform:t.platform}:s===`permission`?{setting:s,state:c,permissionTarget:l,permissionMode:u,platform:t.platform}:{setting:s,state:c,appBundleId:f,platform:t.platform}});let m=await n.setSetting(s,c,f,p);return m&&typeof m==`object`?i({setting:s,state:c,...m},bn(m)??`Updated setting: ${s}`):{setting:s,state:c,...a(`Updated setting: ${s}`)}}async function vn(t,n,r){let i=n[0]?.trim(),o=n[1]?.trim();if(!i||!o)throw new e(`INVALID_ARGS`,`push requires <bundle|package> <payload.json|inline-json>`);let s=await en(o);if(y(t)){let{pushIosNotification:e}=await import(`./apps.js`).then(e=>e.t);return await e(t,i,s),{platform:`ios`,bundleId:i,...a(`Pushed notification to ${i}`)}}let{pushAndroidNotification:c}=await import(`./notifications.js`),l=await c(t,i,s);return{platform:`android`,package:i,action:l.action,extrasCount:l.extrasCount,...a(`Pushed notification to ${i}`)}}async function yn(e,t){let n=t??{};return await e.snapshot({appBundleId:n.appBundleId,signal:n.signal,interactiveOnly:n.snapshotInteractiveOnly,depth:n.snapshotDepth,scope:n.snapshotScope,raw:n.snapshotRaw,includeRects:n.snapshotIncludeRects,includeHiddenContentHints:n.snapshotIncludeHiddenContentHints,surface:n.surface})}function bn(e){return typeof e.message==`string`&&e.message.length>0?e.message:void 0}function xn(e,n,r,i,a,o){return{requestId:a??he().requestId,appBundleId:r,runnerLeaseContext:ye({meta:o}),activity:n?.activity,launchConsole:n?.launchConsole,launchArgs:n?.launchArgs,clearAppState:n?.clearAppState,verbose:n?.verbose,logPath:e,traceLogPath:i,iosXctestrunFile:n?.iosXctestrunFile,iosXctestDerivedDataPath:n?.iosXctestDerivedDataPath,iosXctestEnvDir:n?.iosXctestEnvDir,screenshotCaptureBackend:n?.maestro?.screenshotCaptureBackend,snapshotInteractiveOnly:n?.snapshotInteractiveOnly,snapshotDepth:n?.snapshotDepth,snapshotScope:n?.snapshotScope,snapshotRaw:n?.snapshotRaw,snapshotIncludeHiddenContentHints:n?.snapshotIncludeHiddenContentHints,...t(n),count:n?.count,intervalMs:n?.intervalMs,delayMs:n?.delayMs,durationMs:n?.durationMs,holdMs:n?.holdMs,jitterPx:n?.jitterPx,pixels:n?.pixels,doubleTap:n?.doubleTap,clickButton:f(n),backMode:n?.backMode,pauseMs:n?.pauseMs,pattern:n?.pattern}}export{w as S,Ze as _,$t as a,je as b,ht as c,ut as d,ft as f,qe as g,Qe as h,an as i,gt as l,Je as m,nn as n,V as o,dt as p,rn as r,H as s,xn as t,R as u,Ne as v,Me as x,Pe as y};
@@ -1,2 +1,2 @@
1
- import { I as centerOfRect, c as DaemonResponseData, d as JsonRpcId, f as JsonRpcRequestEnvelope, i as DaemonInstallSource, o as DaemonRequest, p as LeaseBackend, r as DaemonError, s as DaemonResponse, v as SessionRuntimeHints, w as normalizeError, x as defaultHintForCode } from "./sdk-contracts.js";
1
+ import { I as centerOfRect, _ as SessionRuntimeHints, a as DaemonRequest, d as JsonRpcRequestEnvelope, f as LeaseBackend, o as DaemonResponse, r as DaemonInstallSource, s as DaemonResponseData, u as JsonRpcId, w as normalizeError, x as defaultHintForCode, y as DaemonError } from "./sdk-contracts.js";
2
2
  export { type DaemonError, type DaemonInstallSource, type DaemonRequest, type DaemonResponse, type DaemonResponseData, type JsonRpcId, type JsonRpcRequestEnvelope, type LeaseBackend, type SessionRuntimeHints, centerOfRect, defaultHintForCode, normalizeError };