agent-device 0.20.7 → 0.20.8
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.
- package/android/ime-helper/dist/{agent-device-android-ime-helper-0.20.7.apk → agent-device-android-ime-helper-0.20.8.apk} +0 -0
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.8.apk.sha256 +1 -0
- package/android/ime-helper/dist/{agent-device-android-ime-helper-0.20.7.manifest.json → agent-device-android-ime-helper-0.20.8.manifest.json} +4 -4
- package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.20.7.apk → agent-device-android-snapshot-helper-0.20.8.apk} +0 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.8.apk.sha256 +1 -0
- package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.20.7.manifest.json → agent-device-android-snapshot-helper-0.20.8.manifest.json} +6 -6
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +5 -1
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+RecordingTests.swift +4 -0
- package/dist/src/agent-browser-tool.js +1 -1
- package/dist/src/agent-device-client.js +2 -2
- package/dist/src/android.js +1 -1
- package/dist/src/app-lifecycle.js +7 -7
- package/dist/src/app-lifecycle2.js +1 -1
- package/dist/src/app-log-reconnect.js +1 -1
- package/dist/src/app-log-runtime.js +3 -3
- package/dist/src/app-resolution.js +2 -2
- package/dist/src/apps.js +5 -5
- package/dist/src/auth-session.js +1 -1
- package/dist/src/boot-diagnostics.js +1 -1
- package/dist/src/cli-config.js +1 -1
- package/dist/src/cli-help.js +1 -1
- package/dist/src/cli.js +4 -4
- package/dist/src/client-metro.js +1 -1
- package/dist/src/connection-runtime.js +1 -1
- package/dist/src/debug-symbols.js +3 -3
- package/dist/src/device-claim-inspection.js +1 -1
- package/dist/src/device-input-state.js +1 -1
- package/dist/src/device-ready.js +1 -0
- package/dist/src/dispatch.js +1 -0
- package/dist/src/find.js +1 -1
- package/dist/src/finders.js +1 -1
- package/dist/src/generic-settle.js +1 -1
- package/dist/src/handler-utils.js +1 -0
- package/dist/src/harmonyos.js +1 -1
- package/dist/src/hdc.js +1 -0
- package/dist/src/helper.js +1 -1
- package/dist/src/host-process.js +3 -2
- package/dist/src/ime-lifecycle.js +5 -5
- package/dist/src/index.d.ts +21 -21
- package/dist/src/input-actions.js +4 -4
- package/dist/src/input-actions2.js +1 -1
- package/dist/src/install-artifact.js +1 -1
- package/dist/src/interaction-runtime.js +1 -1
- package/dist/src/interaction-snapshot.js +1 -1
- package/dist/src/interaction-touch-reference-frame.js +1 -1
- package/dist/src/interaction.js +1 -1
- package/dist/src/interactor.js +1 -1
- package/dist/src/interactor2.js +1 -1
- package/dist/src/internal/bin.js +1 -1
- package/dist/src/internal/daemon.js +7 -29
- package/dist/src/inventory2.js +1 -1
- package/dist/src/lease-context.js +1 -1
- package/dist/src/lease.js +1 -1
- package/dist/src/limrun-runtime-dependencies.js +1 -1
- package/dist/src/linux.js +1 -1
- package/dist/src/manifest.js +1 -1
- package/dist/src/notifications.js +1 -1
- package/dist/src/output-path.js +1 -0
- package/dist/src/owner-identity.js +1 -1
- package/dist/src/physical-device-control.js +1 -1
- package/dist/src/platform-runtime-app-log-process.js +1 -1
- package/dist/src/platform-runtime-host.js +1 -1
- package/dist/src/platform-runtime-network-web-transport.js +1 -1
- package/dist/src/platform-runtime-operation-host.js +4 -4
- package/dist/src/platform-runtime-screen-recording-android-host.js +1 -0
- package/dist/src/platform-runtime-screen-recording-apple-host.js +1 -0
- package/dist/src/platform-runtime-screen-recording-apple-runner-host.js +1 -0
- package/dist/src/platform-runtime-screen-recording-apple-runner-transport.js +1 -0
- package/dist/src/platform-runtime-screen-recording-apple-simulator-host.js +1 -0
- package/dist/src/platform-runtime-screen-recording-apple-transport.js +1 -0
- package/dist/src/platform-runtime-screen-recording-finalizer-host.js +1 -0
- package/dist/src/platform-runtime-screen-recording-harmony-host.js +1 -0
- package/dist/src/platform-runtime-screen-recording-output-host.js +1 -0
- package/dist/src/platform-runtime-screen-recording-web-host.js +1 -0
- package/dist/src/platform-runtime-toolchain-host.js +1 -1
- package/dist/src/platform-runtime.js +1 -1
- package/dist/src/prepare-kind.js +13 -13
- package/dist/src/provider-webdriver.js +1 -1
- package/dist/src/proxy.js +1 -1
- package/dist/src/react-native.js +1 -1
- package/dist/src/record-runtime.js +1 -0
- package/dist/src/record-trace.js +1 -1
- package/dist/src/recording-telemetry.js +1 -0
- package/dist/src/registry.js +4 -4
- package/dist/src/remote-config2.js +1 -1
- package/dist/src/replay.js +2 -2
- package/dist/src/runner-disposal.js +1 -1
- package/dist/src/runner-lease.js +1 -1
- package/dist/src/runtime.js +3 -3
- package/dist/src/runtime2.js +3 -3
- package/dist/src/runtime3.js +3 -3
- package/dist/src/runtime4.js +1 -1
- package/dist/src/runtime7.js +1 -1
- package/dist/src/screenshot-result.js +4 -4
- package/dist/src/sdk-android-adb.js +4 -4
- package/dist/src/sdk-batch-runner.js +2 -2
- package/dist/src/sdk-finders.js +1 -1
- package/dist/src/sdk-remote-config.js +1 -1
- package/dist/src/sdk-selectors.d.ts +5 -1
- package/dist/src/sdk-selectors.js +1 -1
- package/dist/src/selector-runtime.js +1 -1
- package/dist/src/selectors.js +1 -1
- package/dist/src/server.js +2 -2
- package/dist/src/session-target-evidence.js +1 -1
- package/dist/src/session.js +10 -10
- package/dist/src/simulator.js +1 -1
- package/dist/src/snapshot-runtime.js +1 -1
- package/dist/src/snapshot-session.js +1 -1
- package/dist/src/snapshot.js +1 -1
- package/dist/src/snapshot2.js +1 -1
- package/dist/src/src.js +1 -1
- package/dist/src/src2.js +2 -2
- package/dist/src/src3.js +1 -1
- package/dist/src/text-surface.js +1 -1
- package/dist/src/tool-provider.js +3 -3
- package/dist/src/tool-provider2.js +1 -1
- package/dist/src/tool-provider3.js +1 -1
- package/dist/src/update-check.js +1 -1
- package/dist/src/version.js +1 -1
- package/dist/src/video.js +23 -0
- package/dist/src/web.js +1 -1
- package/package.json +2 -4
- package/server.json +2 -2
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.7.apk.sha256 +0 -1
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.7.apk.sha256 +0 -1
- package/dist/src/context.js +0 -1
- package/dist/src/provider.js +0 -1
- package/dist/src/runner-client.js +0 -1
- package/dist/src/runner-provider.js +0 -1
- package/skills/agent-device/SKILL.md +0 -20
- package/skills/dogfood/SKILL.md +0 -27
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{o as e}from"./png-worker-contract.js";import{_ as t}from"./sdk-contracts.js";import{
|
|
2
|
-
`).replace(/\n$/,``),writeClipboard:async t=>{
|
|
3
|
-
`)){let t=e.trim();t&&i.add(t)}}return d((await Promise.all(Array.from(i).map(async e=>{let n=await h(e,t).catch(()=>({})),r=n.bundleId;return r?{bundleId:r,name:n.appName??o.basename(e,`.app`)}:null}))).filter(e=>e!==null).sort((e,t)=>e.name.localeCompare(t.name)),n)}async function h(e,t){for(let n of[o.join(e,`Contents`,`Info.plist`),o.join(e,`Info.plist`)]){let e=await t(n),r=g(e,`CFBundleIdentifier`),i=g(e,`CFBundleDisplayName`),a=g(e,`CFBundleName`);if(r||i||a)return{bundleId:r,appName:i??a}}return{}}function g(e,t){let n=e?.[t];return typeof n==`string`&&n.trim()?n.trim():void 0}var _=e({createLocalAppleToolProvider:()=>b,hasScopedAppleToolProvider:()=>C,readApplePlistJson:()=>E,resolveAppleToolProvider:()=>x,runAppleToolCommand:()=>w,runXcrun:()=>T,withAppleToolProvider:()=>S});const v={runCommand:
|
|
1
|
+
import{o as e}from"./png-worker-contract.js";import{_ as t}from"./sdk-contracts.js";import{d as n,h as r,v as i,w as a}from"./sdk-android-adb.js";import o from"node:path";import{AsyncLocalStorage as s}from"node:async_hooks";import{promises as c}from"node:fs";import l from"node:os";function u(e,t=e=>e){let n=new s;return{resolve(r){return r?t(r):n.getStore()??e},async run(e,r){return e?await n.run(t(e),r):await r()},hasScope(){return!!n.getStore()}}}function d(e,t){return t===`user-installed`?e.filter(e=>!e.bundleId.startsWith(`com.apple.`)):e}function f(e,n){return{openBundle:async(t,n)=>{await e(`open`,p(t,n))},openTarget:async t=>{await e(`open`,[t])},readClipboard:async()=>r(await e(`pbpaste`,[],{allowFailure:!0}),`Failed to read macOS clipboard`).stdout.replace(/\r\n/g,`
|
|
2
|
+
`).replace(/\n$/,``),writeClipboard:async t=>{r(await e(`pbcopy`,[],{allowFailure:!0,stdin:t}),`Failed to write macOS clipboard`)},readDarkMode:async()=>{let n=r(await e(`osascript`,[`-e`,`tell application "System Events" to tell appearance preferences to get dark mode`],{allowFailure:!0}),`Failed to read macOS appearance`),i=n.stdout.trim().toLowerCase();if(i===`true`)return!0;if(i===`false`)return!1;throw new t(`COMMAND_FAILED`,`Unable to determine current macOS appearance from osascript output: ${n.stdout.trim()}`)},setDarkMode:async t=>{r(await e(`osascript`,[`-e`,`tell application "System Events" to tell appearance preferences to set dark mode to ${t?`true`:`false`}`],{allowFailure:!0}),`Failed to set macOS appearance`)},listApps:async t=>await m(e,n,t)}}function p(e,t){let n=[`-b`,e];return t&&n.push(t),n}async function m(e,t,n){let r=[`/Applications`,`/System/Applications`,o.join(l.homedir(),`Applications`)],i=new Set;for(let t of r){if(!(await c.stat(t).catch(()=>null))?.isDirectory())continue;let n=await e(`find`,[t,`-maxdepth`,`4`,`-type`,`d`,`-name`,`*.app`],{allowFailure:!0});if(n.exitCode===0)for(let e of n.stdout.split(`
|
|
3
|
+
`)){let t=e.trim();t&&i.add(t)}}return d((await Promise.all(Array.from(i).map(async e=>{let n=await h(e,t).catch(()=>({})),r=n.bundleId;return r?{bundleId:r,name:n.appName??o.basename(e,`.app`)}:null}))).filter(e=>e!==null).sort((e,t)=>e.name.localeCompare(t.name)),n)}async function h(e,t){for(let n of[o.join(e,`Contents`,`Info.plist`),o.join(e,`Info.plist`)]){let e=await t(n),r=g(e,`CFBundleIdentifier`),i=g(e,`CFBundleDisplayName`),a=g(e,`CFBundleName`);if(r||i||a)return{bundleId:r,appName:i??a}}return{}}function g(e,t){let n=e?.[t];return typeof n==`string`&&n.trim()?n.trim():void 0}var _=e({createLocalAppleToolProvider:()=>b,hasScopedAppleToolProvider:()=>C,readApplePlistJson:()=>E,resolveAppleToolProvider:()=>x,runAppleToolCommand:()=>w,runXcrun:()=>T,withAppleToolProvider:()=>S});const v={runCommand:i,simctl:{run:async(e,t)=>await i(`xcrun`,[`simctl`,...e],t)},devicectl:{run:async(e,t)=>await i(`xcrun`,[`devicectl`,...e],t)},plist:{readJson:async e=>await A(i,e)},macosHost:f(i,async e=>await A(i,e)),whichCommand:a},y=u(v,D);function b(e={}){let t={...v,...e},n=e.plist??{readJson:async e=>await A(t.runCommand,e)};return{...t,simctl:e.simctl??{run:async(e,n)=>await t.runCommand(`xcrun`,[`simctl`,...e],n)},devicectl:e.devicectl??{run:async(e,n)=>await t.runCommand(`xcrun`,[`devicectl`,...e],n)},plist:n,macosHost:e.macosHost??f(t.runCommand,async e=>await n.readJson(e))}}function x(e){return y.resolve(e)}async function S(e,t){return await y.run(e,t)}function C(){return y.hasScope()}async function w(e,t,n){return await x().runCommand(e,t,n)}async function T(e,t){let n=x(),[r,...i]=e;return r===`simctl`?await(n.simctl?.run(i,t)??n.runCommand(`xcrun`,e,t)):r===`devicectl`?await(n.devicectl?.run(i,t)??n.runCommand(`xcrun`,e,t)):await w(`xcrun`,e,t)}async function E(e){return await x().plist?.readJson(e)??null}function D(e){return b({...e,runCommand:O(e.runCommand),...e.simctl?{simctl:{run:k(e.simctl.run)}}:{},...e.devicectl?{devicectl:{run:k(e.devicectl.run)}}:{},...e.macosHelper?{macosHelper:{run:k(e.macosHelper.run)}}:{}})}function O(e){return async(t,r,i)=>n(await e(t,r,i))}function k(e){return async(t,r)=>n(await e(t,r))}async function A(e,t){try{let n=await e(`plutil`,[`-convert`,`json`,`-o`,`-`,t],{allowFailure:!0});return n.exitCode!==0||!n.stdout.trim()?null:JSON.parse(n.stdout)}catch{return null}}export{T as a,u as c,w as i,E as n,_ as o,x as r,d as s,C as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{o as e}from"./png-worker-contract.js";import{_ as t}from"./sdk-contracts.js";import{
|
|
1
|
+
import{o as e}from"./png-worker-contract.js";import{_ as t}from"./sdk-contracts.js";import{j as n,v as r,w as i}from"./sdk-android-adb.js";import{t as a}from"./timeouts.js";import{c as o}from"./tool-provider.js";var s=e({createLocalLinuxToolProvider:()=>u,resolveLinuxToolProvider:()=>d,runLinuxToolCommand:()=>p,withLinuxToolProvider:()=>f});const c={runCommand:r,whichCommand:i,desktop:m(r,i),clipboard:h(r,i),screenshot:g(r,i)},l=o(c,u);function u(e={}){let t={...c,...e};return{...t,desktop:e.desktop??m(t.runCommand,t.whichCommand),clipboard:e.clipboard??h(t.runCommand,t.whichCommand),screenshot:e.screenshot??g(t.runCommand,t.whichCommand)}}function d(e){return l.resolve(e)}async function f(e,t){return await l.run(e,t)}async function p(e,t,n){return await d().runCommand(e,t,n)}function m(e,t){return{async openTarget(r){if(r.includes(`://`)||r.startsWith(`/`)){await e(`xdg-open`,[r]);return}if(await t(r)){e(r,[],{allowFailure:!0}).catch(e=>{n({level:`warn`,phase:`linux_app_launch`,data:{app:r,error:String(e)}})}),await a(500);return}await e(`xdg-open`,[r],{allowFailure:!0})},async closeApp(n){if(await t(`wmctrl`)){await e(`wmctrl`,[`-c`,n],{allowFailure:!0});return}await e(`pkill`,[`-x`,n],{allowFailure:!0})}}}function h(e,t){return{async readText(){let n=await C(t,v),r=b[n];return(await e(r.cmd,r.args,r.options)).stdout},async writeText(n){let r=await C(t,v),i=x[r](n);await e(i.cmd,i.args,i.options)}}}function g(e,t){return{async capture(n){let r=await C(t,y),i=S[r](n);await e(i.cmd,i.args,i.options)}}}const _=5e3,v={wayland:[{tool:`wl-clipboard`,command:`wl-paste`}],x11:[{tool:`xclip`,command:`xclip`},{tool:`xsel`,command:`xsel`}],waylandError:`wl-paste (wl-clipboard) is required for clipboard access on Wayland. Install via your package manager.`,x11Error:`xclip or xsel is required for clipboard access on X11. Install via your package manager.`},y={wayland:[{tool:`grim`,command:`grim`},{tool:`gnome-screenshot`,command:`gnome-screenshot`}],x11:[{tool:`scrot`,command:`scrot`},{tool:`import`,command:`import`},{tool:`gnome-screenshot`,command:`gnome-screenshot`}],waylandError:`grim or gnome-screenshot is required for screenshots on Wayland. Install via your package manager.`,x11Error:`scrot, import (ImageMagick), or gnome-screenshot is required for screenshots on X11. Install via your package manager.`},b={"wl-clipboard":{cmd:`wl-paste`,args:[`--no-newline`],options:{allowFailure:!0,timeoutMs:_}},xclip:{cmd:`xclip`,args:[`-selection`,`clipboard`,`-o`],options:{allowFailure:!0,timeoutMs:_}},xsel:{cmd:`xsel`,args:[`--clipboard`,`--output`],options:{allowFailure:!0,timeoutMs:_}}},x={"wl-clipboard":e=>({cmd:`wl-copy`,args:[`--`,e],options:{allowFailure:!1,timeoutMs:_}}),xclip:e=>({cmd:`xclip`,args:[`-selection`,`clipboard`],options:{allowFailure:!1,timeoutMs:_,stdin:e}}),xsel:e=>({cmd:`xsel`,args:[`--clipboard`,`--input`],options:{allowFailure:!1,timeoutMs:_,stdin:e}})},S={grim:e=>({cmd:`grim`,args:[e]}),scrot:e=>({cmd:`scrot`,args:[e]}),import:e=>({cmd:`import`,args:[`-window`,`root`,e]}),"gnome-screenshot":e=>({cmd:`gnome-screenshot`,args:[`-f`,e]})};async function C(e,n){let r=w()?`wayland`:`x11`;for(let t of n[r])if(await e(t.command))return t.tool;throw new t(`TOOL_MISSING`,r===`wayland`?n.waylandError:n.x11Error)}function w(){return!!process.env.WAYLAND_DISPLAY||process.env.XDG_SESSION_TYPE===`wayland`}export{p as n,s as r,d as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{o as e}from"./png-worker-contract.js";import{
|
|
1
|
+
import{o as e}from"./png-worker-contract.js";import{v as t,w as n}from"./sdk-android-adb.js";import{c as r}from"./tool-provider.js";import i from"node:path";import{constants as a}from"node:fs";import o from"node:os";import{access as s}from"node:fs/promises";var c=e({createLocalVegaToolProvider:()=>d,resolveVegaToolProvider:()=>f,withVegaToolProvider:()=>p});const l={run:async(e,n)=>await t(await h()??`vega`,e,n),isAvailable:async()=>!!await h()},u=r(d());function d(e=l){return{isAvailable:async()=>await e.isAvailable(),version:async t=>await e.run([`--version`],t),listDevices:async t=>await e.run([`device`,`list`],t),checkConnected:async(t,n)=>await e.run([`device`,`is-connected`,`--device`,t],n),launchApp:async(t,n,r)=>await e.run([`device`,`launch-app`,`--device`,t,`--appName`,n],r),terminateApp:async(t,n,r)=>await e.run([`device`,`terminate-app`,`--device`,t,`--appName`,n],r),pressRemote:async(t,n,r,i)=>await e.run([`device`,`run-cmd`,`--device`,t,`--command`,[`inputd-cli`,`button_press`,n,...r===void 0?[]:[`--holdDuration`,String(r)]].join(` `)],i)}}function f(e){return u.resolve(e)}async function p(e,t){return await u.run(e,t)}let m;async function h(){if(m)return m;if(await n(`vega`))return m=`vega`,m;let e=i.join(o.homedir(),`vega`,`bin`,`vega`);try{await s(e,a.X_OK),m=e}catch{return}return m}export{c as n,f as t};
|
package/dist/src/update-check.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{b as e}from"./sdk-android-adb.js";import t from"node:path";import n from"node:fs";import{fileURLToPath as r}from"node:url";const i=`agent-device`,a=`--agent-device-run-update-check`;function o(e){if(!c(e))return;let n=Date.now(),r=t.join(e.stateDir,`update-check.json`),a=d(r);l(a,e.currentVersion)&&(process.stderr.write(`Update available: ${i} ${e.currentVersion} -> ${a.latestVersion}. Run \`npm install -g ${i}@latest\` to upgrade the CLI.\n`),f(r,{...a,prompted:!0})),u(a,n)&&m(r,e.currentVersion)}async function s(e){let t=Date.now(),n=d(e.cachePath);try{let r=await h()??void 0;if(!r||_(r,e.currentVersion)<=0){f(e.cachePath,{checkedAt:new Date(t).toISOString()});return}f(e.cachePath,{checkedAt:new Date(t).toISOString(),latestVersion:r,prompted:n.latestVersion===r?n.prompted===!0:!1})}catch{f(e.cachePath,{...n,checkedAt:new Date(t).toISOString()})}}function c(e){return!e.command||e.command===`help`||e.command===`test`||e.flags.help||e.flags.version||e.flags.json||process.env.CI?.trim()||process.env.NODE_ENV===`test`||process.env.AGENT_DEVICE_NO_UPDATE_NOTIFIER?.trim()?!1:!!process.stderr.isTTY}function l(e,t){return!e.latestVersion||_(e.latestVersion,t)<=0?!1:e.prompted!==!0}function u(e,t){let n=g(e.checkedAt);return n===void 0||t-n>=12096e5}function d(e){try{let t=JSON.parse(n.readFileSync(e,`utf8`));return{checkedAt:typeof t.checkedAt==`string`?t.checkedAt:void 0,latestVersion:typeof t.latestVersion==`string`?t.latestVersion:void 0,prompted:t.prompted===!0}}catch{return{}}}function f(e,r){try{n.mkdirSync(t.dirname(e),{recursive:!0}),n.writeFileSync(e,`${JSON.stringify(r,null,2)}\n`,`utf8`)}catch{}}function p(){let e=r(import.meta.url),i=t.extname(e)||`.js`,a=[t.join(t.dirname(e),`update-check-entry${i}`),t.join(t.dirname(e),`internal`,`update-check-entry${i}`)].find(e=>n.existsSync(e));if(!a)throw Error(`Update check entrypoint not found. Rebuild the package to include the update-check worker entry.`);return a}function m(t,n){let r=p(),i=r.endsWith(`.ts`)?[`--experimental-strip-types`]:[];e(process.execPath,[...i,r,a,t,n])}async function h(){let e=await fetch(`https://registry.npmjs.org/${i}/latest`,{signal:AbortSignal.timeout(3500),headers:{accept:`application/json`}});if(!e.ok)return;let t=await e.json();return typeof t.version==`string`&&t.version.trim().length>0?t.version.trim():void 0}function g(e){if(!e)return;let t=Date.parse(e);return Number.isNaN(t)?void 0:t}function _(e,t){return e.localeCompare(t,void 0,{numeric:!0})}function v(e){if(e[0]!==a)return null;let t=e[1]?.trim(),n=e[2]?.trim();return!t||!n?null:{cachePath:t,currentVersion:n}}export{v as n,s as r,o as t};
|
package/dist/src/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{_ as e}from"./sdk-contracts.js";import{Cn as t,Dn as n,Ht as r,On as i,Pn as a,Rn as o,Sn as s,Tn as c,kn as l,nr as u}from"./sdk-batch-runner.js";import d from"node:path";import f from"node:fs";import{fileURLToPath as ee}from"node:url";const p={min:.01,max:1},m={flagKey:`screenshotMaxSize`,cliToken:`--max-size`,envVar:`AGENT_DEVICE_SCREENSHOT_MAX_SIZE`,publicOptionKey:`maxSize`,migration:{screenshot:`screenshot --max-size was removed; use --scale <0.01-1> (or AGENT_DEVICE_SCREENSHOT_SCALE) to downscale proportionally`,record:`record --max-size was removed; recordings capture at native resolution`}};function te(e,t){return t&&Object.hasOwn(t,m.flagKey)?m.migration[e]:void 0}function ne(t,n){if(Object.hasOwn(n,m.publicOptionKey)||Object.hasOwn(n,m.flagKey))throw new e(`INVALID_ARGS`,m.migration[t])}const re=[`out`,`overlayRefs`,`screenshotPixelDensity`,`screenshotFullscreen`,`screenshotScale`,`screenshotNoStabilize`,`screenshotNormalizeStatusBar`],ie=[`screenshotPixelDensity`,`screenshotFullscreen`,`screenshotScale`,`screenshotNoStabilize`,`screenshotNormalizeStatusBar`],ae=[{key:`screenshotPixelDensity`,names:[`--pixel-density`],type:`int`,min:1,usageLabel:`--pixel-density <n>`,usageDescription:`Screenshot: output PNG pixel density in pixels per logical point (currently supported on iOS simulators)`},{key:`screenshotFullscreen`,names:[`--fullscreen`,`--full`,`-f`],type:`boolean`,usageLabel:`--fullscreen, --full, -f`,usageDescription:`Screenshot: on web capture the full page; on macOS app sessions capture the full desktop instead of the app window`},{key:`screenshotScale`,names:[`--scale`],type:`number`,min:p.min,max:p.max,usageLabel:`--scale <0.01-1>`,usageDescription:`Screenshot: resize both dimensions by this factor (or use AGENT_DEVICE_SCREENSHOT_SCALE)`},{key:`screenshotNoStabilize`,names:[`--no-stabilize`],type:`boolean`,usageLabel:`--no-stabilize`,usageDescription:`Screenshot: skip Android demo-mode/status-bar stabilization and settle delay for low-latency capture loops`},{key:`screenshotNormalizeStatusBar`,names:[`--normalize-status-bar`],type:`boolean`,usageLabel:`--normalize-status-bar`,usageDescription:`Screenshot: on iOS simulators temporarily normalize status-bar chrome for deterministic screenshot diffs`}],oe=[{tokens:[`--fullscreen`,`--full`,`-f`],key:`screenshotFullscreen`},{tokens:[`--no-stabilize`],key:`screenshotNoStabilize`},{tokens:[`--normalize-status-bar`],key:`screenshotNormalizeStatusBar`}],se=[{token:`--pixel-density`,key:`screenshotPixelDensity`,label:`screenshot --pixel-density`}],ce=[{token:`--scale`,key:`screenshotScale`,label:`screenshot --scale`,min:p.min,max:p.max}];function le(e){return he({overlayRefs:e?.overlayRefs,pixelDensity:e?.screenshotPixelDensity,fullscreen:e?.screenshotFullscreen,scale:e?.screenshotScale,stabilize:e?.screenshotNoStabilize?!1:void 0,normalizeStatusBar:e?.screenshotNormalizeStatusBar})}function ue(e={}){return he({overlayRefs:e.overlayRefs,screenshotPixelDensity:e.screenshotPixelDensity??e.pixelDensity,screenshotFullscreen:e.screenshotFullscreen??e.fullscreen,screenshotScale:e.screenshotScale,screenshotNoStabilize:e.screenshotNoStabilize??(e.stabilize===!1?!0:void 0),screenshotNormalizeStatusBar:e.screenshotNormalizeStatusBar??e.normalizeStatusBar})}function de(e={}){return ue({...e,screenshotScale:e.screenshotScale??e.scale})}function fe(t){let{min:n,max:r}=p;if(t.scale!==void 0&&(!Number.isFinite(t.scale)||t.scale<n||t.scale>r))throw new e(`INVALID_ARGS`,`screenshot scale must be between ${n} and ${r}`)}function pe(e,t){typeof t?.screenshotPixelDensity==`number`&&e.push(`--pixel-density`,String(t.screenshotPixelDensity)),t?.screenshotFullscreen&&e.push(`--fullscreen`),typeof t?.screenshotScale==`number`&&e.push(`--scale`,String(t.screenshotScale)),t?.screenshotNoStabilize&&e.push(`--no-stabilize`),t?.screenshotNormalizeStatusBar&&e.push(`--normalize-status-bar`)}function me(t){let{args:n,flags:r,index:i}=t,a=n[i];if(a===m.cliToken)throw new e(`INVALID_ARGS`,m.migration.screenshot);return ge(a,r,i)??_e({args:n,index:i,flags:r,token:a})??ve({args:n,index:i,flags:r,token:a})??{handled:!1}}function he(e){return Object.fromEntries(Object.entries(e).filter(e=>e[1]!==void 0))}function ge(e,t,n){let r=oe.find(t=>t.tokens.some(t=>t===e));if(r)return t[r.key]=!0,{handled:!0,nextIndex:n}}function _e(t){let n=se.find(e=>e.token===t.token);if(!n)return;let r=Number(t.args[t.index+1]);if(!Number.isInteger(r)||r<1)throw new e(`INVALID_ARGS`,`${n.label} requires a positive integer`);return t.flags[n.key]=r,{handled:!0,nextIndex:t.index+1}}function ve(t){let n=ce.find(e=>e.token===t.token);if(!n)return;let r=Number(t.args[t.index+1]);if(!Number.isFinite(r)||r<n.min||r>n.max)throw new e(`INVALID_ARGS`,`${n.label} requires a number from ${n.min} to ${n.max}`);return t.flags[n.key]=r,{handled:!0,nextIndex:t.index+1}}function ye(e){let t=Se(e.quality);return{...e.analysis?{analysis:e.analysis}:{},...e.androidSnapshot?{androidSnapshot:e.androidSnapshot}:{},...e.freshness?{freshness:e.freshness}:{},...t?{quality:t}:{},...e.warnings?{warnings:e.warnings}:{}}}function be(e){return{...e.androidSnapshot?{androidSnapshot:e.androidSnapshot}:{},...e.quality?{snapshotQuality:e.quality}:{},...e.warnings&&e.warnings.length>0?{warnings:e.warnings}:{}}}function xe(e){let t=Ce(e.androidSnapshot),n=Array.isArray(e.warnings)?e.warnings.filter(e=>typeof e==`string`):void 0,r=Se(e.snapshotQuality);return be({...t?{androidSnapshot:t}:{},...r?{quality:r}:{},...n?{warnings:n}:{}})}function Se(e){if(!e||typeof e!=`object`)return;let t=e;return typeof t.state==`string`&&typeof t.backend==`string`?t:void 0}function Ce(e){return typeof e==`object`&&e?e:void 0}const h=1500;function we(e,t){e&&(e.snapshotDiagnostics??={samples:[]}).samples.push({...t,durationMs:Math.max(0,Math.round(t.durationMs))})}function Te(e){let t=e?.snapshotDiagnostics?.samples;if(!(!t||t.length===0))return Ee(t)}function Ee(e){if(e.length===0)return;let t=e.slice(1),n=t.length>=3?g(t):void 0,r=t.filter(e=>e.durationMs>=h).length,i=n!==void 0&&n.p95Ms>=h&&r>=2;return{stats:g(e),...i&&n?{warning:je(n)}:{}}}function De(e){let t=e.filter(e=>e!==void 0),n=t.flatMap(e=>Le(e.stats));if(n.length===0)return;let r=g(n),i=t.filter(e=>e.warning);return{stats:r,...i.length>0?{warning:Me({warnedCount:i.length,totalCount:t.length,worst:i.reduce((e,t)=>Math.max(e,t.stats.p95Ms),0),platform:r.platform})}:{}}}function Oe(e){if(!u(e))return;let t=Ne(e.stats);if(!t)return;let n=typeof e.warning==`string`?e.warning:void 0;return{stats:t,...n?{warning:n}:{}}}function g(e){let t=e.map(e=>e.durationMs).sort((e,t)=>e-t);return{count:t.length,p50Ms:_(t,50),p95Ms:_(t,95),maxMs:t[t.length-1]??0,slowThresholdMs:h,...ke(e),...Ae(e)}}function _(e,t){if(e.length===0)return 0;let n=Math.max(0,Math.ceil(t/100*e.length)-1);return e[Math.min(n,e.length-1)]??0}function ke(e){let t=e.map(e=>e.platform).filter(e=>!!e);return new Set(t).size===1?{platform:t[0]}:{}}function Ae(e){let t={};for(let n of e)n.backend&&(t[n.backend]=(t[n.backend]??0)+1);return Object.keys(t).length>0?{backends:t}:{}}function je(e){return`Warning: ${e.platform?`${e.platform} `:``}snapshots are slow in this run: p95 ${e.p95Ms}ms over ${e.count} captures. Possible causes: device load, app or dev server stuck, helper fallback, or stale daemon.`}function Me(e){return`Warning: ${e.platform?`${e.platform} `:``}snapshots were slow in ${e.warnedCount} of ${e.totalCount} runs (worst run p95 ${e.worst}ms). Possible causes: device load, app or dev server stuck, helper fallback, or stale daemon.`}function Ne(e){if(!u(e))return;let t=Pe(e);if(t)return{...t,...Ie(e)}}function Pe(e){let t={count:e.count,p50Ms:e.p50Ms,p95Ms:e.p95Ms,maxMs:e.maxMs,slowThresholdMs:e.slowThresholdMs};if(!Object.values(t).some(e=>typeof e!=`number`))return t}function Fe(e){let t=Object.entries(e).filter(e=>typeof e[1]==`number`);return t.length>0?Object.fromEntries(t):void 0}function Ie(e){let t=typeof e.platform==`string`?e.platform:void 0,n=u(e.backends)?Fe(e.backends):void 0;return{...t?{platform:t}:{},...n?{backends:n}:{}}}function Le(e){if(!e||e.count<=0)return[];let t=e.platform;return e.count===1?[{durationMs:e.maxMs,platform:t}]:e.count===2?[{durationMs:e.p50Ms,platform:t},{durationMs:e.maxMs,platform:t}]:[...Array.from({length:e.count-3},()=>({durationMs:e.p50Ms,platform:t})),{durationMs:e.p50Ms,platform:t},{durationMs:e.p95Ms,platform:t},{durationMs:e.maxMs,platform:t}]}const Re=1e4,ze=2e3,Be=[`get`,`accept`,`dismiss`,`wait`],Ve=[`in-app`,`system`],He=[`primary`,`secondary`,`middle`];function Ue(e){return e?.clickButton??`primary`}function We(t){return t.button===`primary`?null:t.commandLabel===`click`?t.platform!==`macos`&&t.platform!==`linux`?new e(`UNSUPPORTED_OPERATION`,`click --button ${t.button} is supported only on macOS and Linux`):t.platform===`macos`&&t.button===`middle`?new e(`UNSUPPORTED_OPERATION`,`click --button middle is not supported by the macOS runner yet`):typeof t.count==`number`||typeof t.intervalMs==`number`||typeof t.holdMs==`number`||typeof t.jitterPx==`number`||t.doubleTap===!0?new e(`INVALID_ARGS`,`click --button ${t.button} does not support repeat or gesture modifier flags`):null:new e(`INVALID_ARGS`,`--button is supported only for click`)}function Ge(e){return e===`primary`?{}:{button:e}}function v(t,n={message:e=>`Invalid value: ${e}`}){let r=new Set(t),i=n.normalize??(e=>e);return{is:e=>typeof e==`string`&&r.has(e),parse:t=>{let a=i(t??``);if(r.has(a))return a;throw new e(`INVALID_ARGS`,n.message(t??``))}}}const Ke=[`up`,`down`,`left`,`right`,`top`,`bottom`],y=[`up`,`down`,`left`,`right`],b=[`left`,`right`,`left-edge`,`right-edge`],qe=[`one-way`,`ping-pong`],Je=1e4,Ye=6e4,Xe=v(y,{message:e=>`Unknown direction: ${e}`});function Ze(e){let t=e.direction,n=t===`up`||t===`down`?e.referenceHeight:e.referenceWidth,r=T(e.amount),i=e.pixels===void 0?Math.round(n*r):E(e.pixels),a=Math.max(1,Math.round(n*.05)),o=Math.max(1,n-a*2),s=Math.max(1,Math.min(i,o)),c=Math.round(s/2),l=Math.round(e.referenceWidth/2),u=Math.round(e.referenceHeight/2),d=(n,r,i,a)=>({direction:t,x1:n,y1:r,x2:i,y2:a,referenceWidth:e.referenceWidth,referenceHeight:e.referenceHeight,amount:e.amount,pixels:s});switch(t){case`up`:return d(l,u-c,l,u+c);case`down`:return d(l,u+c,l,u-c);case`left`:return d(l-c,u,l+c,u);case`right`:return d(l+c,u,l-c,u)}}function Qe(e){T(e.amount),e.pixels!==void 0&&E(e.pixels)}function $e(e,t){if(e===`left`||e===`right`){let n=x(e,t);return{preset:e,x1:n.x1,y1:n.y1,x2:n.x2,y2:n.y2,referenceWidth:n.referenceWidth,referenceHeight:n.referenceHeight}}let[n,r]=e===`left-edge`?[99,15]:[1,85],i=C(S(t,n,50),t,8),a=C(S(t,r,50),t,8);return{preset:e,x1:i.x,y1:i.y,x2:a.x,y2:a.y,referenceWidth:t.referenceWidth,referenceHeight:t.referenceHeight}}function et(e,t){switch(e){case`up`:return{x:0,y:-t};case`down`:return{x:0,y:t};case`left`:return{x:-t,y:0};case`right`:return{x:t,y:0}}}function x(e,t){let n=e===`left`||e===`up`,r=n?85:15,i=n?15:85,a=e===`up`||e===`down`,o=C(S(t,a?50:r,a?r:50),t,8),s=C(S(t,a?50:i,a?i:50),t,8);return{direction:e,x1:o.x,y1:o.y,x2:s.x,y2:s.y,referenceWidth:t.referenceWidth,referenceHeight:t.referenceHeight}}function tt(e){let t=rt(e);if(t)return{referenceWidth:t.width,referenceHeight:t.height}}function S(e,t,n){let r=Math.trunc(e.referenceWidth*t/100),i=Math.trunc(e.referenceHeight*n/100);return{x:Number.isFinite(r)?r:0,y:Number.isFinite(i)?i:0}}function C(e,t,n){return{x:D(e.x,n,t.referenceWidth),y:D(e.y,n,t.referenceHeight)}}function nt(e){return Xe.parse(e)}function rt(e){let t=e.filter(e=>n(e)&&w(e.rect)).map(e=>e.rect).sort((e,t)=>(t?.width??0)*(t?.height??0)-(e?.width??0)*(e?.height??0))[0];if(t)return t;let r=e.map(e=>e.rect).filter(w);if(r.length===0)return;let i=Math.max(...r.map(e=>e.x+e.width)),a=Math.max(...r.map(e=>e.y+e.height));if(!(i<=0||a<=0))return{x:0,y:0,width:i,height:a}}function w(e){return!!e&&e.width>0&&e.height>0}function T(t){if(t===void 0)return .6;if(!Number.isFinite(t)||t<=0)throw new e(`INVALID_ARGS`,`scroll amount must be a positive number`);return t}function E(t){if(!Number.isFinite(t)||t<=0)throw new e(`INVALID_ARGS`,`scroll pixels must be a positive integer`);return Math.max(1,Math.round(t))}function D(e,t,n){let r=Math.round(t);if(!Number.isFinite(r))return 0;let i=Math.max(r,Math.round(n-t));return!Number.isFinite(i)||!Number.isFinite(e)?r:Math.min(i,Math.max(r,Math.round(e)))}const O=1e4,k=[`pan`,`fling`,`swipe`,`pinch`,`rotate`,`transform`,`drag`];function A(t){let n=M(t),i=I(n,`kind`,k);if(i===`pan`)return{kind:i,origin:N(n,`origin`),delta:N(n,`delta`),pointerCount:r(n,`pointerCount`,{min:1,max:2}),durationMs:j(n)};if(i===`drag`)return it(n);if(n.pointerCount!==void 0)throw new e(`INVALID_ARGS`,`pointerCount is supported only for gesture pan`);if(i===`fling`){if(n.durationMs!==void 0)throw new e(`INVALID_ARGS`,`gesture fling does not accept durationMs; use gesture pan for timed movement`);return{kind:i,direction:I(n,`direction`,y),origin:N(n,`origin`),distance:r(n,`distance`,{min:0})}}if(i===`swipe`){if(n.durationMs!==void 0)throw new e(`INVALID_ARGS`,`gesture swipe does not accept durationMs; use gesture pan for timed movement`);return{kind:i,preset:I(n,`preset`,b)}}if(i===`pinch`)return{kind:i,scale:F(n,`scale`),origin:P(n,`origin`)};if(i===`rotate`){if(n.velocity!==void 0)throw new e(`INVALID_ARGS`,`gesture rotate does not accept velocity; rotation pacing derives from degrees`);return{kind:i,degrees:F(n,`degrees`),origin:P(n,`origin`)}}return{kind:i,origin:N(n,`origin`),delta:N(n,`delta`),scale:F(n,`scale`),degrees:F(n,`degrees`),durationMs:j(n)}}function it(t){let n=r(t,`sourceHoldMs`,{min:1,max:1e4}),i=r(t,`moveMs`,{min:16,max:1e4}),a=r(t,`destinationHoldMs`,{min:0,max:1e4});if((n??800)+(i??500)+(a??0)>1e4)throw new e(`INVALID_ARGS`,`gesture drag total duration must be at most ${O}`);return{kind:`drag`,source:at(t,`source`),destination:at(t,`destination`),sourceHoldMs:n,moveMs:i,destinationHoldMs:a}}function j(t){let n=r(t,`durationMs`);if(n!==void 0){if(n<16||n>1e4)throw new e(`INVALID_ARGS`,`Expected durationMs to be an integer between 16 and ${O}.`);return n}}function M(t){if(!t||typeof t!=`object`||Array.isArray(t))throw new e(`INVALID_ARGS`,`gesture requires structured object input`);return t}function N(e,t){let n=M(e[t]);return{x:F(n,`x`),y:F(n,`y`)}}function P(e,t){return e[t]===void 0?void 0:N(e,t)}function F(t,n){let r=t[n];if(typeof r!=`number`||!Number.isFinite(r))throw new e(`INVALID_ARGS`,`Expected ${n} to be a finite number.`);return r}function at(t,n){let r=t[n];if(typeof r!=`string`||r.trim().length===0)throw new e(`INVALID_ARGS`,`Expected ${n} to be a non-empty string.`);return r.trim()}function I(t,n,r){let i=t[n];if(typeof i!=`string`||!r.includes(i))throw new e(`INVALID_ARGS`,`Expected ${n} to be one of: ${r.join(`, `)}.`);return i}const ot={swipe:{max:4,usage:`swipe accepts 4 arguments: x1 y1 x2 y2`,retired:{positional:`durationMs`,migrate:st}},"gesture pan":{max:5,usage:`gesture pan accepts at most 5 arguments: x y dx dy [durationMs]`},"gesture fling":{max:4,usage:`gesture fling accepts at most 4 arguments: direction x y [distance]`,retired:{positional:`durationMs`,migrate:(e,t)=>`use "${t}", or gesture pan for timed movement.`}},"gesture swipe":{max:1,usage:`gesture swipe accepts 1 argument: preset`,retired:{positional:`durationMs`,migrate:(e,t)=>`use "${t}", or gesture pan for timed movement.`}},"gesture pinch":{max:3,usage:`gesture pinch accepts at most 3 arguments: scale [x] [y]`},"gesture rotate":{max:3,usage:`gesture rotate accepts at most 3 arguments: degrees [x] [y]`,retired:{positional:`velocity`,migrate:(e,t)=>`use "${t}"; rotation pacing derives from degrees.`}},"gesture transform":{max:7,usage:`gesture transform accepts at most 7 arguments: x y dx dy scale degrees [durationMs]`},"gesture drag":{max:5,usage:`gesture drag accepts at most 5 arguments: source destination [sourceHoldMs] [moveMs] [destinationHoldMs]`}};function st(e,t){let[n,r,i,a,o]=e,s=ct(n,i),c=ct(r,a);return s===void 0||c===void 0?`use "gesture pan x1 y1 dx dy durationMs" for the same timed drag, or "${t}" for a default-duration swipe.`:`use "gesture pan ${n} ${r} ${s} ${c} ${o}" for the same timed drag, or "${t}" for a default-duration swipe.`}function ct(e,t){let n=Number(t)-Number(e);return Number.isFinite(n)?n:void 0}function L(e,t){let n=ot[e];if(t.length<=n.max)return;let r=n.retired;if(!r||t.length!==n.max+1||!lt(t[n.max]))return{usage:n.usage};let i=`${e} ${t.slice(0,n.max).join(` `)}`;return{usage:n.usage,migration:`The trailing ${r.positional} positional was removed: ${r.migrate(t,i)}`}}function lt(e){return e===void 0||e.trim().length===0?!1:e.startsWith("${")||Number.isFinite(Number(e))}function ut(t){if(!(!t||typeof t!=`object`||Array.isArray(t))&&t.durationMs!==void 0)throw new e(`INVALID_ARGS`,`swipe does not accept durationMs; use gesture pan for timed movement`)}function dt(e,t){let n=t?`${e.usage} (${t})`:e.usage;return e.migration?`${n}. ${e.migration}`:`${n}.`}function R(t,n){let r=L(t,n);if(r)throw new e(`INVALID_ARGS`,dt(r))}function ft(e,t,n){let r=pt(e,t);return r?dt(r,n):void 0}function pt(e,t){if(e===`swipe`)return L(`swipe`,t);if(e!==`gesture`)return;let n=`gesture ${t[0]}`;if(Object.hasOwn(ot,n))return L(n,t.slice(1))}function mt(e){return{origin:{x:Number(e[0]),y:Number(e[1])},delta:{x:Number(e[2]),y:Number(e[3])}}}function ht(e,t){let n=e[0],r=e.slice(1);switch(n){case`pan`:{R(`gesture pan`,r);let{origin:e,delta:i}=mt(r);return A({kind:n,origin:e,delta:i,pointerCount:t,durationMs:z(r[4])})}case`fling`:return R(`gesture fling`,r),A({kind:n,direction:r[0],origin:{x:Number(r[1]),y:Number(r[2])},distance:z(r[3])});case`swipe`:return R(`gesture swipe`,r),A({kind:n,preset:r[0]});case`pinch`:return R(`gesture pinch`,r),A({kind:n,scale:Number(r[0]),origin:St(r[1],r[2])});case`rotate`:return R(`gesture rotate`,r),A({kind:n,degrees:Number(r[0]),origin:St(r[1],r[2])});case`transform`:{R(`gesture transform`,r);let{origin:e,delta:t}=mt(r);return A({kind:n,origin:e,delta:t,scale:Number(r[4]),degrees:Number(r[5]),durationMs:z(r[6])})}case`drag`:return R(`gesture drag`,r),A({kind:n,source:r[0],destination:r[1],sourceHoldMs:z(r[2]),moveMs:z(r[3]),destinationHoldMs:z(r[4])});default:return A({kind:n})}}function gt(e){if(e[0]!==`drag`)return;let t=ht(e);return t.kind===`drag`?t:void 0}function _t(e){switch(e.kind){case`pan`:return B([e.kind,e.origin.x,e.origin.y,e.delta.x,e.delta.y,e.durationMs]);case`fling`:return B([e.kind,e.direction,e.origin.x,e.origin.y,e.distance]);case`swipe`:return[e.kind,e.preset];case`pinch`:return B([e.kind,e.scale,e.origin?.x,e.origin?.y]);case`rotate`:return e.origin?B([e.kind,e.degrees,e.origin.x,e.origin.y]):[e.kind,String(e.degrees)];case`transform`:return B([e.kind,e.origin.x,e.origin.y,e.delta.x,e.delta.y,e.scale,e.degrees,e.durationMs]);case`drag`:return[e.kind,e.source,e.destination,String(e.sourceHoldMs??800),String(e.moveMs??500),String(e.destinationHoldMs??0)]}}function vt(e,t={}){return R(`swipe`,e),{from:{x:Number(e[0]),y:Number(e[1])},to:{x:Number(e[2]),y:Number(e[3])},...t.count===void 0?{}:{count:t.count},...t.pauseMs===void 0?{}:{pauseMs:t.pauseMs},...t.pattern===void 0?{}:{pattern:t.pattern}}}function yt(t){switch(t.kind){case`pan`:return{gesture:{intent:`pan`,origin:t.origin,delta:t.delta,pointerCount:t.pointerCount,durationMs:t.durationMs}};case`fling`:return{gesture:{intent:`fling`,direction:t.direction,origin:t.origin,distance:t.distance}};case`swipe`:return{gesture:{intent:`fling`,preset:t.preset}};case`pinch`:return{gesture:{intent:`pinch`,origin:t.origin,scale:t.scale}};case`rotate`:return{gesture:{intent:`rotate`,origin:t.origin,degrees:t.degrees}};case`transform`:return{gesture:{intent:`transform`,origin:t.origin,delta:t.delta,scale:t.scale,degrees:t.degrees,durationMs:t.durationMs}};case`drag`:throw new e(`INVALID_ARGS`,`gesture drag targets must be resolved before coordinate normalization`)}}function bt(e){return e.kind===`drag`?{intent:`drag`,source:e.source,destination:e.destination,sourceHoldMs:e.sourceHoldMs,moveMs:e.moveMs,destinationHoldMs:e.destinationHoldMs}:yt(e).gesture}function xt(e){return{gesture:{intent:`fling`,from:e.from,to:e.to}}}function z(e){return e===void 0?void 0:Number(e)}function St(t,n){if(t===void 0!=(n===void 0))throw new e(`INVALID_ARGS`,`gesture origin requires both x and y coordinates`);return t===void 0?void 0:{x:Number(t),y:Number(n)}}function B(e){return e.filter(e=>e!==void 0).map(String)}const V={pinchAxisDegrees:-90,samplingProfile:`default`},Ct={ios:V,macos:V,android:{pinchAxisDegrees:0,samplingProfile:`android`},harmonyos:V,vega:V,linux:V,web:V};function wt(e,t,n){let r=It(t),i=Gt(n);switch(e.intent){case`fling`:return Ot(e,r);case`pan`:return kt(e,r,i);case`pinch`:return U({intent:`pinch`,origin:e.origin??Ht(r),delta:{x:0,y:0},scale:Bt(e.scale,`gesture pinch scale`),rotationDegrees:0,durationMs:300},r,i);case`rotate`:{let t=K(e.degrees,`gesture rotate degrees`);return U({intent:`rotate`,origin:e.origin??Ht(r),delta:{x:0,y:0},scale:1,rotationDegrees:t,durationMs:zt(t)},r,i)}case`transform`:{let t=K(e.degrees,`gesture transform degrees`);return U({intent:`transform`,origin:e.origin,delta:e.delta,scale:Bt(e.scale,`gesture transform scale`),rotationDegrees:t,durationMs:W(e.durationMs,zt(t),`gesture transform durationMs`)},r,i)}}}function Tt(e){let[{samples:t}]=e.pointers,n=t[0],r=t.at(-1);return{start:n.point,end:r.point}}function Et(t,n){let r=It(n),i=Lt(t.sourceHoldMs,800,`gesture drag sourceHoldMs`),a=W(t.moveMs,500,`gesture drag moveMs`),o=Rt(t.destinationHoldMs,0,`gesture drag destinationHoldMs`);if(i+a+o>1e4)throw new e(`INVALID_ARGS`,`gesture drag total duration must be at most ${O}`);return Dt(H(`pan`,t.from,t.to,a,r,`timed-pan`),i,o)}function Dt(e,t,n){let r=e.pointers[0],[i,a]=r.samples,o=t+e.durationMs+n,s=[{offsetMs:0,point:i.point},{...i,offsetMs:i.offsetMs+t},{...a,offsetMs:a.offsetMs+t},...n>0?[{offsetMs:o,point:a.point}]:[]];return{...e,durationMs:o,pointers:[{...r,samples:s}]}}function Ot(e,t){if(`preset`in e){let{from:n,to:r}=Wt(e.preset,t);return H(`fling`,n,r,100,t,`endpoint-hold`)}if(`from`in e)return H(`fling`,e.from,e.to,100,t,`endpoint-hold`);let n=G(e.origin,`gesture fling origin`),r=Vt(e.distance??180,`gesture fling distance`);return H(`fling`,n,q(n,et(e.direction,r)),100,t,`endpoint-hold`)}function kt(t,n,r){let i=W(t.durationMs,500,`gesture pan durationMs`);if((t.pointerCount??1)===1){let e=G(t.origin,`gesture pan origin`);return H(`pan`,e,q(e,G(t.delta,`gesture pan delta`)),i,n,t.executionProfile??`timed-pan`)}if(t.pointerCount!==2)throw new e(`INVALID_ARGS`,`gesture pan pointerCount must be 1 or 2`);return U({intent:`pan`,origin:t.origin,delta:t.delta,scale:1,rotationDegrees:0,durationMs:i},n,r)}function H(e,t,n,r,i,a){let o=G(t,`gesture ${e} start`),s=G(n,`gesture ${e} end`),c=[{offsetMs:0,point:o},{offsetMs:r,point:s}];return Pt(c,i,{intent:e,pointerId:0}),{topology:`single`,intent:e,executionProfile:a,durationMs:r,viewport:i,pointers:[{pointerId:0,samples:c}]}}function U(e,t,n){let r=G(e.origin,`gesture ${e.intent} origin`),i=q(r,G(e.delta,`gesture ${e.intent} delta`)),a=Math.min(t.width,t.height)*Mt(e.intent),o=e.scale>1?a/e.scale:a,s=o*e.scale;if(Math.min(o,s)<48)throw Ft({intent:e.intent,viewport:t,initialSpan:o,finalSpan:s,minimumReliableSpan:48});let c=o/2,l=Nt(e.durationMs,n.samplingProfile),u=(a,o)=>{let s=l.map(t=>({offsetMs:t,point:At({...e,start:r,end:i,initialRadius:c,offsetMs:t,side:o,profile:n})}));return Pt(s,t,{intent:e.intent,pointerId:a}),{pointerId:a,samples:s}};return{topology:`two`,intent:e.intent,durationMs:e.durationMs,viewport:t,pointers:[u(0,1),u(1,-1)]}}function At(e){let t=e.offsetMs/e.durationMs,n=Ut(e.start,e.end,t),r=e.initialRadius*(1+(e.scale-1)*t),i=Kt(jt(e.intent,e.profile)+e.rotationDegrees*t);return{x:n.x+Math.cos(i)*r*e.side,y:n.y+Math.sin(i)*r*e.side}}function jt(e,t){return e===`pinch`?t.pinchAxisDegrees:-90}function Mt(e){return e===`pinch`?.4:.25}function Nt(t,n){if(!Number.isFinite(t)||t<=0)throw new e(`INVALID_ARGS`,`gesture sample duration must be a positive finite number`);let r=t/16,i=Math.max(3,n===`android`?Math.round(r):Math.floor(r));return Array.from({length:i+1},(e,n)=>Math.round(t*n/i))}function Pt(t,n,r){let i=n.x+n.width-1,a=n.y+n.height-1;for(let o of t){let{x:t,y:s}=o.point;if(!Number.isFinite(t)||!Number.isFinite(s))throw new e(`INVALID_ARGS`,`Gesture motion produces non-finite pointer coordinates`,{...r,reason:`GESTURE_TRAJECTORY_NON_FINITE`,hint:`Reduce the requested rotation, translation, or scale.`});if(t<n.x+1||t>i||s<n.y+1||s>a)throw Ft({...r,viewport:n,sample:o})}}function Ft(t){return new e(`INVALID_ARGS`,`Gesture trajectory does not fit inside the viewport`,{...t,reason:`GESTURE_TRAJECTORY_OUT_OF_BOUNDS`,hint:`Move the gesture away from the edge or reduce its translation, scale, or rotation.`})}function It(t){let n={x:K(t.x,`gesture viewport x`),y:K(t.y,`gesture viewport y`),width:K(t.width,`gesture viewport width`),height:K(t.height,`gesture viewport height`)};if(n.width<=0||n.height<=0)throw new e(`INVALID_ARGS`,`gesture viewport width and height must be positive`);return n}function W(t,n,r){let i=t??n;if(!Number.isInteger(i)||i<16||i>1e4)throw new e(`INVALID_ARGS`,`${r} must be an integer between 16 and ${O}`);return i}function Lt(t,n,r){let i=t??n;if(!Number.isInteger(i)||i<1||i>1e4)throw new e(`INVALID_ARGS`,`${r} must be an integer between 1 and ${O}`);return i}function Rt(t,n,r){let i=t??n;if(!Number.isInteger(i)||i<0||i>1e4)throw new e(`INVALID_ARGS`,`${r} must be an integer between 0 and ${O}`);return i}function zt(e){let t=Math.ceil(Math.abs(e)/3)*16;return Math.min(Math.max(300,t),2400)}function G(e,t){return{x:K(e.x,`${t} x`),y:K(e.y,`${t} y`)}}function K(t,n){if(!Number.isFinite(t))throw new e(`INVALID_ARGS`,`${n} must be a finite number`);return t}function Bt(t,n){let r=K(t,n);if(r<=0)throw new e(`INVALID_ARGS`,`${n} must be greater than 0`);return r}function Vt(t,n){let r=K(t,n);if(r<=0)throw new e(`INVALID_ARGS`,`${n} must be a positive number`);return r}function Ht(e){return{x:e.x+e.width/2,y:e.y+e.height/2}}function q(e,t){return{x:e.x+t.x,y:e.y+t.y}}function Ut(e,t,n){return{x:e.x+(t.x-e.x)*n,y:e.y+(t.y-e.y)*n}}function Wt(e,t){let n=$e(e,{referenceWidth:t.width,referenceHeight:t.height});return{from:{x:t.x+n.x1,y:t.y+n.y1},to:{x:t.x+n.x2,y:t.y+n.y2}}}function Gt(e){return e===void 0?V:Ct[e]}function Kt(e){return e*Math.PI/180}const qt={occlusion:{kind:`runtime`,via:`src/snapshot/snapshot-occlusion.ts#isSnapshotNodeInteractionBlocked`},parentOwnedTouchPoint:{kind:`runtime`,via:`src/core/interaction-touch-point.ts#resolveInteractionTouchPoint`},offscreen:{kind:`runtime`,via:`src/commands/interaction/runtime/resolution.ts#throwIfOffscreenInteractionTarget`},nonHittable:{kind:`runtime`,via:`src/core/interaction-targeting.ts#resolveActionableTouchResolution`},responseConstruction:{kind:`runtime`,via:`src/daemon/handlers/interaction-touch-response.ts#buildInteractionResponseData`},responseIdentity:{kind:`runtime`,via:`src/daemon/handlers/interaction-touch-targets.ts#interactionResultExtra`},verifyEvidence:{kind:`runtime`,via:`src/commands/interaction/runtime/interactions.ts#pressCommand`,appliesTo:[`press`,`click`,`fill`]},settleObservation:{kind:`runtime`,via:`src/commands/interaction/runtime/settle.ts#settleAfterInteraction`}};({...qt}),{...qt};const Jt=`tapped via non-hittable coordinate fallback`,Yt=[`xctest-element`,`synthesized-first-responder`,`synthesized-first-responder-replacement`,`xctest-application-fallback`],Xt=[`focused-element`,`keyboard-shown`],Zt=1e4;function Qt(t,n=`scroll accepts either a relative amount or --pixels, not both`){if(t.amount!==void 0&&t.pixels!==void 0)throw new e(`INVALID_ARGS`,n)}function $t(t,n={}){if(t===void 0)return;let r=n.field??`scroll durationMs`,i=n.max??1e4,a=n.invalidMessage??`${r} must be a non-negative integer`;if(!Number.isFinite(t)||!Number.isInteger(t)||t<0)throw new e(`INVALID_ARGS`,a);if(t>i)throw new e(`INVALID_ARGS`,`${r} must be a non-negative integer at most ${i}`);return t}function en(e){return typeof e?.durationMs==`number`?e.durationMs:void 0}const tn={android:`longpress`,apple:`exact`,vega:`exact`},J={up:{aliases:[],androidKeyevent:`KEYCODE_DPAD_UP`,appleRemoteButton:`up`,vegaKey:`KEY_UP`},down:{aliases:[],androidKeyevent:`KEYCODE_DPAD_DOWN`,appleRemoteButton:`down`,vegaKey:`KEY_DOWN`},left:{aliases:[],androidKeyevent:`KEYCODE_DPAD_LEFT`,appleRemoteButton:`left`,vegaKey:`KEY_LEFT`},right:{aliases:[],androidKeyevent:`KEYCODE_DPAD_RIGHT`,appleRemoteButton:`right`,vegaKey:`KEY_RIGHT`},select:{aliases:[`ok`,`center`,`enter`],androidKeyevent:`KEYCODE_DPAD_CENTER`,appleRemoteButton:`select`,vegaKey:`KEY_ENTER`},menu:{aliases:[],androidKeyevent:`KEYCODE_MENU`,appleRemoteButton:`menu`,vegaKey:`KEY_MENU`},home:{aliases:[],androidKeyevent:`KEYCODE_HOME`,appleRemoteButton:`home`,vegaKey:`KEY_HOMEPAGE`},back:{aliases:[],androidKeyevent:`KEYCODE_BACK`,appleRemoteButton:`menu`,vegaKey:`KEY_BACK`}},Y=Object.keys(J),nn=`<${Y.join(`|`)}>`;function rn(t){let n=t?.toLowerCase();if(an(n))return n;let r=n?un.get(n):void 0;if(r)return r;throw new e(`INVALID_ARGS`,`tv-remote button must be one of: ${Y.join(`, `)}.`)}function an(e){return typeof e==`string`&&Y.includes(e)}function on(e){return J[e].appleRemoteButton}function sn(e){return J[e].androidKeyevent}function cn(e){return J[e].vegaKey}function ln(e){return tn[e]}const un=new Map(Y.flatMap(e=>J[e].aliases.map(t=>[t,e]))),dn={captureStalled:`wait_capture_stalled`,deadlineExceeded:`wait_deadline_exceeded`,targetAbsent:`wait_target_absent`,stableTimeout:`wait_stable_timeout`,landmarkIdentityMismatch:`wait_landmark_identity_mismatch`},fn=[`camera`,`microphone`,`photos`,`contacts`,`contacts-limited`,`notifications`,`calendar`,`location`,`location-always`,`media-library`,`motion`,`reminders`,`siri`],pn=`<wifi|airplane|location> <on|off>`,mn=`location set <lat> <lon>`,hn=`animations <on|off>`,X=`appearance <light|dark|toggle>`,gn=`faceid <match|nonmatch|enroll|unenroll>`,_n=`touchid <match|nonmatch|enroll|unenroll>`,vn=`fingerprint <match|nonmatch>`,yn=`clear-app-state [app-id]`,bn=`permission <grant|deny|reset> <camera|microphone|photos|contacts|contacts-limited|notifications|calendar|location|location-always|media-library|motion|reminders|siri> [full|limited]`,Z=`permission <grant|reset> <accessibility|screen-recording|input-monitoring>`,xn=`macOS supports only settings ${X} and settings ${Z}. wifi|airplane|location|animations remain unsupported on macOS.`,Sn=[`settings ${pn}`,`settings ${mn}`,`settings ${hn}`,`settings ${X}`,`settings ${gn}`,`settings ${_n}`,`settings ${vn}`,`settings ${yn}`,`settings ${bn}`,`settings ${Z}`].join(` | `),Cn=`settings requires ${pn}, ${mn}, ${hn}, ${X}, ${gn}, ${_n}, ${vn}, ${yn}, ${bn}, or ${Z}`;function wn(e){let t=e.trim().toLowerCase();return t===`appearance`||t===`permission`}function Tn(e){return`Unsupported macOS setting: ${e}. ${xn}`}function En(t){let n=t.trim().toLowerCase();if(n===`grant`)return`grant`;if(n===`deny`)return`deny`;if(n===`reset`)return`reset`;throw new e(`INVALID_ARGS`,`Invalid permission action: ${t}. Use grant|deny|reset.`)}function Dn(t){let n=t?.trim().toLowerCase();if(n===`camera`||n===`microphone`||n===`photos`||n===`contacts`||n===`contacts-limited`||n===`notifications`||n===`calendar`||n===`location`||n===`location-always`||n===`media-library`||n===`motion`||n===`reminders`||n===`siri`)return n;throw new e(`INVALID_ARGS`,`permission setting requires a target: ${fn.join(`|`)}`)}function On(t,n){if(t===void 0||t.trim()===``)throw new e(`INVALID_ARGS`,`settings location set requires ${n}`);return Q(Number(t),n)}function kn(e){return{latitude:Q(e?.latitude,`latitude`),longitude:Q(e?.longitude,`longitude`)}}function Q(t,n){let r=n===`latitude`?-90:-180,i=n===`latitude`?90:180;if(typeof t!=`number`||!Number.isFinite(t)||t<r||t>i)throw new e(`INVALID_ARGS`,`${n} must be a number from ${r} to ${i}`);return t}function An(e){let t=new Map;for(let[n,r]of e.entries())t.set(r.index,n);let n=[],r=[];for(let[i,a]of e.entries()){let e=Math.max(0,a.depth??0);for(;r.length>0&&e<=r[r.length-1].depth;)r.pop();let o=i,s=typeof a.parentIndex==`number`?t.get(a.parentIndex):void 0,c=typeof s==`number`&&s<o?s:r[r.length-1]?.index;n.push({...a,index:o,depth:e,parentIndex:c}),r.push({depth:e,index:o})}return n}function $(e){return e.label?.trim()||e.value?.trim()||e.identifier?.trim()||``}function jn(e){let t=e.trim().toLowerCase();return t?/^(vertical|horizontal)\s+scroll\s+bar(?:,?\s*\d+\s+pages?)?$/.test(t):!1}function Mn(e,t){if(!(e?.trim().toLowerCase()??``).includes(`vertical scroll bar`))return null;let n=Nn(t);return n===null?null:n<=1?{above:!1,below:!0}:n>=99?{above:!0,below:!1}:{above:!0,below:!0}}function Nn(e){if(!e)return null;let t=/^(\d{1,3})%$/.exec(e.trim());if(!t)return null;let n=Number(t[1]);return Number.isFinite(n)?Math.max(0,Math.min(100,n)):null}function Pn(e){if(e.length===0)return{nodes:e,hiddenCount:0,summaryLines:[]};let{byIndex:t,visibleNodeIndexes:n,offscreenNodes:r,hintedContainers:i}=In(e),a=n.size===0?e:e.filter(e=>n.has(e.index));return{nodes:a.map(e=>Hn(e,i.directionsByContainer)),hiddenCount:n.size===0?0:e.length-a.length,summaryLines:Un(r.filter(e=>!i.coveredNodeIndexes.has(e.index)&&Kn(e)),e,t)}}function Fn(e){if(e.length===0)return new Map;let{hintedContainers:t}=In(e);return Vn(t.directionsByContainer)}function In(e){let n=o(e),r=new Set,i=[];for(let a of e){if(t(a,e,n)){Jn(a,r,n);continue}i.push(a)}return{byIndex:n,visibleNodeIndexes:r,offscreenNodes:i,hintedContainers:Bn(e,i,r,n)}}function Ln(e,t){return e.hittable&&c(e.rect,t)}function Rn(e,t,n=o(t)){if(!e.rect)return null;let r=i(e,t,n);if(r&&!a(e.rect,r)){let t=zn(e.rect,r);if(t)return t}let s=l(t,e.rect);if(s&&!c(e.rect,s)){let t=zn(e.rect,s);if(t)return t}return null}function zn(e,t){let n=e.x+e.width/2,r=e.y+e.height/2,i=[{direction:`down`,amount:r-(t.y+t.height)},{direction:`up`,amount:t.y-r},{direction:`right`,amount:n-(t.x+t.width)},{direction:`left`,amount:t.x-n}],a=null;for(let e of i)e.amount>0&&(!a||e.amount>a.amount)&&(a=e);return a?.direction??null}function Bn(e,t,n,r){let i=new Map,a=new Map,o=new Set;for(let e of t){if(!e.rect)continue;let t=Yn(e,n,r);if(!t?.rect)continue;let s=Gn(e.rect,t.rect);if(!s)continue;let c=i.get(t.index)??new Set;c.add(s),i.set(t.index,c);let l=a.get(t.index)??new Set;l.add(s),a.set(t.index,l),o.add(e.index)}return Xn(e,n,r,i,a),{directionsByContainer:i,coveredNodeIndexes:o}}function Vn(e){let t=new Map;for(let[n,r]of e){let e={};r.has(`above`)&&(e.hiddenContentAbove=!0),r.has(`below`)&&(e.hiddenContentBelow=!0),(e.hiddenContentAbove||e.hiddenContentBelow)&&t.set(n,e)}return t}function Hn(e,t){let n=t.get(e.index);if(!n||n.size===0)return e;let r=e.hiddenContentAbove===!0||n.has(`above`)?!0:void 0,i=e.hiddenContentBelow===!0||n.has(`below`)?!0:void 0;return{...e,hiddenContentAbove:r,hiddenContentBelow:i}}function Un(e,t,n){let r=new Map;for(let i of e){let e=Wn(i,t,n);if(!e)continue;let a=r.get(e)??[];a.push(i),r.set(e,a)}return[`above`,`below`].flatMap(e=>{let t=r.get(e);if(!t||t.length===0)return[];let n=qn(t).slice(0,3).map(e=>`"${e}"`),i=t.length===1?`interactive item`:`interactive items`,a=n.length>0?`: ${n.join(`, `)}`:``;return[`[off-screen ${e}] ${t.length} ${i}${a}`]})}function Wn(e,t,n){if(!e.rect)return null;let r=i(e,t,n);return r?Gn(e.rect,r):null}function Gn(e,t){return e.y+e.height<=t.y?`above`:e.y>=t.y+t.height?`below`:null}function Kn(e){if(e.hittable===!0)return!0;let t=(e.type??``).toLowerCase();return t.includes(`button`)||t.includes(`link`)||t.includes(`textfield`)||t.includes(`edittext`)||t.includes(`searchfield`)||t.includes(`checkbox`)||t.includes(`radio`)||t.includes(`switch`)||t.includes(`menuitem`)||!!$(e)}function qn(e){let t=new Set,n=[];for(let r of e){let e=$(r);!e||t.has(e)||(t.add(e),n.push(e))}return n}function Jn(e,t,n){let r=e,i=new Set;for(;r&&!i.has(r.index);)i.add(r.index),t.add(r.index),r=typeof r.parentIndex==`number`?n.get(r.parentIndex):void 0}function Yn(e,t,n){return s(e,n,e=>t.has(e.index))}function Xn(e,t,n,r,i){for(let a of e){let e=Zn(a);if(!e||e.size===0)continue;let o=Yn(a,t,n);if(!o)continue;let s=r.get(o.index)??new Set,c=i.get(o.index);for(let t of e)c&&c.size>0&&!c.has(t)||s.add(t);r.set(o.index,s)}}function Zn(e){let t=Mn(e.label,e.value);if(!t)return null;let n=new Set;return t.above&&n.add(`above`),t.below&&n.add(`below`),n.size>0?n:null}function Qn(e){return e}function $n(e,t){let n=Math.max(e.x,t.x),r=Math.max(e.y,t.y),i=Math.min(e.x+e.width,t.x+t.width),a=Math.min(e.y+e.height,t.y+t.height);return i<=n||a<=r?0:(i-n)*(a-r)}function er(e=tr()){try{let t=JSON.parse(f.readFileSync(d.join(e,`package.json`),`utf8`));return typeof t.version==`string`?t.version:`0.0.0`}catch{return`0.0.0`}}function tr(){let e=d.dirname(ee(import.meta.url)),t=e;for(let e=0;e<6;e+=1){let e=d.join(t,`package.json`);if(f.existsSync(e))return t;t=d.dirname(t)}return e}export{qe as $,Qt as A,pe as At,Tt as B,nn as C,xe as Ct,cn as D,re as Dt,on as E,ie as Et,Yt as F,le as Ft,_t as G,ft as H,Et as I,ne as It,vt as J,bt as K,wt as L,fe as Lt,$t as M,te as Mt,Xt as N,ue as Nt,ln as O,p as Ot,Jt as P,de as Pt,Ke as Q,Ut as R,Y as S,be as St,sn as T,m as Tt,gt as U,ut as V,ht as W,A as X,k as Y,y as Z,Tn as _,De as _t,Pn as a,Ze as at,Dn as b,Te as bt,Ln as c,v as ct,$ as d,We as dt,Je as et,An as f,Ue as ft,Sn as g,Re as gt,Cn as h,ze as ht,Qn as i,x as it,en as j,me as jt,Zt as k,ae as kt,Mn as l,He as lt,kn as m,Be as mt,er as n,Ye as nt,Rn as o,tt as ot,On as p,Ve as pt,xt as q,$n as r,Qe as rt,Fn as s,nt as st,tr as t,b as tt,jn as u,Ge as ut,wn as v,Oe as vt,rn as w,ye as wt,dn as x,Ee as xt,En as y,we as yt,Nt as z};
|
|
1
|
+
import{_ as e}from"./sdk-contracts.js";import{An as t,Cn as n,En as r,Fn as i,Ht as a,On as o,kn as s,rr as c,wn as l,zn as u}from"./sdk-batch-runner.js";import d from"node:path";import f from"node:fs";import{fileURLToPath as ee}from"node:url";const p={min:.01,max:1},m={flagKey:`screenshotMaxSize`,cliToken:`--max-size`,envVar:`AGENT_DEVICE_SCREENSHOT_MAX_SIZE`,publicOptionKey:`maxSize`,migration:{screenshot:`screenshot --max-size was removed; use --scale <0.01-1> (or AGENT_DEVICE_SCREENSHOT_SCALE) to downscale proportionally`,record:`record --max-size was removed; recordings capture at native resolution`}};function te(e,t){return t&&Object.hasOwn(t,m.flagKey)?m.migration[e]:void 0}function ne(t,n){if(Object.hasOwn(n,m.publicOptionKey)||Object.hasOwn(n,m.flagKey))throw new e(`INVALID_ARGS`,m.migration[t])}const re=[`out`,`overlayRefs`,`screenshotPixelDensity`,`screenshotFullscreen`,`screenshotScale`,`screenshotNoStabilize`,`screenshotNormalizeStatusBar`],ie=[`screenshotPixelDensity`,`screenshotFullscreen`,`screenshotScale`,`screenshotNoStabilize`,`screenshotNormalizeStatusBar`],ae=[{key:`screenshotPixelDensity`,names:[`--pixel-density`],type:`int`,min:1,usageLabel:`--pixel-density <n>`,usageDescription:`Screenshot: output PNG pixel density in pixels per logical point (currently supported on iOS simulators)`},{key:`screenshotFullscreen`,names:[`--fullscreen`,`--full`,`-f`],type:`boolean`,usageLabel:`--fullscreen, --full, -f`,usageDescription:`Screenshot: on web capture the full page; on macOS app sessions capture the full desktop instead of the app window`},{key:`screenshotScale`,names:[`--scale`],type:`number`,min:p.min,max:p.max,usageLabel:`--scale <0.01-1>`,usageDescription:`Screenshot: resize both dimensions by this factor (or use AGENT_DEVICE_SCREENSHOT_SCALE)`},{key:`screenshotNoStabilize`,names:[`--no-stabilize`],type:`boolean`,usageLabel:`--no-stabilize`,usageDescription:`Screenshot: skip Android demo-mode/status-bar stabilization and settle delay for low-latency capture loops`},{key:`screenshotNormalizeStatusBar`,names:[`--normalize-status-bar`],type:`boolean`,usageLabel:`--normalize-status-bar`,usageDescription:`Screenshot: on iOS simulators temporarily normalize status-bar chrome for deterministic screenshot diffs`}],oe=[{tokens:[`--fullscreen`,`--full`,`-f`],key:`screenshotFullscreen`},{tokens:[`--no-stabilize`],key:`screenshotNoStabilize`},{tokens:[`--normalize-status-bar`],key:`screenshotNormalizeStatusBar`}],se=[{token:`--pixel-density`,key:`screenshotPixelDensity`,label:`screenshot --pixel-density`}],ce=[{token:`--scale`,key:`screenshotScale`,label:`screenshot --scale`,min:p.min,max:p.max}];function le(e){return he({overlayRefs:e?.overlayRefs,pixelDensity:e?.screenshotPixelDensity,fullscreen:e?.screenshotFullscreen,scale:e?.screenshotScale,stabilize:e?.screenshotNoStabilize?!1:void 0,normalizeStatusBar:e?.screenshotNormalizeStatusBar})}function ue(e={}){return he({overlayRefs:e.overlayRefs,screenshotPixelDensity:e.screenshotPixelDensity??e.pixelDensity,screenshotFullscreen:e.screenshotFullscreen??e.fullscreen,screenshotScale:e.screenshotScale,screenshotNoStabilize:e.screenshotNoStabilize??(e.stabilize===!1?!0:void 0),screenshotNormalizeStatusBar:e.screenshotNormalizeStatusBar??e.normalizeStatusBar})}function de(e={}){return ue({...e,screenshotScale:e.screenshotScale??e.scale})}function fe(t){let{min:n,max:r}=p;if(t.scale!==void 0&&(!Number.isFinite(t.scale)||t.scale<n||t.scale>r))throw new e(`INVALID_ARGS`,`screenshot scale must be between ${n} and ${r}`)}function pe(e,t){typeof t?.screenshotPixelDensity==`number`&&e.push(`--pixel-density`,String(t.screenshotPixelDensity)),t?.screenshotFullscreen&&e.push(`--fullscreen`),typeof t?.screenshotScale==`number`&&e.push(`--scale`,String(t.screenshotScale)),t?.screenshotNoStabilize&&e.push(`--no-stabilize`),t?.screenshotNormalizeStatusBar&&e.push(`--normalize-status-bar`)}function me(t){let{args:n,flags:r,index:i}=t,a=n[i];if(a===m.cliToken)throw new e(`INVALID_ARGS`,m.migration.screenshot);return ge(a,r,i)??_e({args:n,index:i,flags:r,token:a})??ve({args:n,index:i,flags:r,token:a})??{handled:!1}}function he(e){return Object.fromEntries(Object.entries(e).filter(e=>e[1]!==void 0))}function ge(e,t,n){let r=oe.find(t=>t.tokens.some(t=>t===e));if(r)return t[r.key]=!0,{handled:!0,nextIndex:n}}function _e(t){let n=se.find(e=>e.token===t.token);if(!n)return;let r=Number(t.args[t.index+1]);if(!Number.isInteger(r)||r<1)throw new e(`INVALID_ARGS`,`${n.label} requires a positive integer`);return t.flags[n.key]=r,{handled:!0,nextIndex:t.index+1}}function ve(t){let n=ce.find(e=>e.token===t.token);if(!n)return;let r=Number(t.args[t.index+1]);if(!Number.isFinite(r)||r<n.min||r>n.max)throw new e(`INVALID_ARGS`,`${n.label} requires a number from ${n.min} to ${n.max}`);return t.flags[n.key]=r,{handled:!0,nextIndex:t.index+1}}function ye(e){let t=Se(e.quality);return{...e.analysis?{analysis:e.analysis}:{},...e.androidSnapshot?{androidSnapshot:e.androidSnapshot}:{},...e.freshness?{freshness:e.freshness}:{},...t?{quality:t}:{},...e.warnings?{warnings:e.warnings}:{}}}function be(e){return{...e.androidSnapshot?{androidSnapshot:e.androidSnapshot}:{},...e.quality?{snapshotQuality:e.quality}:{},...e.warnings&&e.warnings.length>0?{warnings:e.warnings}:{}}}function xe(e){let t=Ce(e.androidSnapshot),n=Array.isArray(e.warnings)?e.warnings.filter(e=>typeof e==`string`):void 0,r=Se(e.snapshotQuality);return be({...t?{androidSnapshot:t}:{},...r?{quality:r}:{},...n?{warnings:n}:{}})}function Se(e){if(!e||typeof e!=`object`)return;let t=e;return typeof t.state==`string`&&typeof t.backend==`string`?t:void 0}function Ce(e){return typeof e==`object`&&e?e:void 0}const h=1500;function we(e,t){e&&(e.snapshotDiagnostics??={samples:[]}).samples.push({...t,durationMs:Math.max(0,Math.round(t.durationMs))})}function Te(e){let t=e?.snapshotDiagnostics?.samples;if(!(!t||t.length===0))return Ee(t)}function Ee(e){if(e.length===0)return;let t=e.slice(1),n=t.length>=3?g(t):void 0,r=t.filter(e=>e.durationMs>=h).length,i=n!==void 0&&n.p95Ms>=h&&r>=2;return{stats:g(e),...i&&n?{warning:je(n)}:{}}}function De(e){let t=e.filter(e=>e!==void 0),n=t.flatMap(e=>Le(e.stats));if(n.length===0)return;let r=g(n),i=t.filter(e=>e.warning);return{stats:r,...i.length>0?{warning:Me({warnedCount:i.length,totalCount:t.length,worst:i.reduce((e,t)=>Math.max(e,t.stats.p95Ms),0),platform:r.platform})}:{}}}function Oe(e){if(!c(e))return;let t=Ne(e.stats);if(!t)return;let n=typeof e.warning==`string`?e.warning:void 0;return{stats:t,...n?{warning:n}:{}}}function g(e){let t=e.map(e=>e.durationMs).sort((e,t)=>e-t);return{count:t.length,p50Ms:_(t,50),p95Ms:_(t,95),maxMs:t[t.length-1]??0,slowThresholdMs:h,...ke(e),...Ae(e)}}function _(e,t){if(e.length===0)return 0;let n=Math.max(0,Math.ceil(t/100*e.length)-1);return e[Math.min(n,e.length-1)]??0}function ke(e){let t=e.map(e=>e.platform).filter(e=>!!e);return new Set(t).size===1?{platform:t[0]}:{}}function Ae(e){let t={};for(let n of e)n.backend&&(t[n.backend]=(t[n.backend]??0)+1);return Object.keys(t).length>0?{backends:t}:{}}function je(e){return`Warning: ${e.platform?`${e.platform} `:``}snapshots are slow in this run: p95 ${e.p95Ms}ms over ${e.count} captures. Possible causes: device load, app or dev server stuck, helper fallback, or stale daemon.`}function Me(e){return`Warning: ${e.platform?`${e.platform} `:``}snapshots were slow in ${e.warnedCount} of ${e.totalCount} runs (worst run p95 ${e.worst}ms). Possible causes: device load, app or dev server stuck, helper fallback, or stale daemon.`}function Ne(e){if(!c(e))return;let t=Pe(e);if(t)return{...t,...Ie(e)}}function Pe(e){let t={count:e.count,p50Ms:e.p50Ms,p95Ms:e.p95Ms,maxMs:e.maxMs,slowThresholdMs:e.slowThresholdMs};if(!Object.values(t).some(e=>typeof e!=`number`))return t}function Fe(e){let t=Object.entries(e).filter(e=>typeof e[1]==`number`);return t.length>0?Object.fromEntries(t):void 0}function Ie(e){let t=typeof e.platform==`string`?e.platform:void 0,n=c(e.backends)?Fe(e.backends):void 0;return{...t?{platform:t}:{},...n?{backends:n}:{}}}function Le(e){if(!e||e.count<=0)return[];let t=e.platform;return e.count===1?[{durationMs:e.maxMs,platform:t}]:e.count===2?[{durationMs:e.p50Ms,platform:t},{durationMs:e.maxMs,platform:t}]:[...Array.from({length:e.count-3},()=>({durationMs:e.p50Ms,platform:t})),{durationMs:e.p50Ms,platform:t},{durationMs:e.p95Ms,platform:t},{durationMs:e.maxMs,platform:t}]}const Re=1e4,ze=2e3,Be=[`get`,`accept`,`dismiss`,`wait`],Ve=[`in-app`,`system`],He=[`primary`,`secondary`,`middle`];function Ue(e){return e?.clickButton??`primary`}function We(t){return t.button===`primary`?null:t.commandLabel===`click`?t.platform!==`macos`&&t.platform!==`linux`?new e(`UNSUPPORTED_OPERATION`,`click --button ${t.button} is supported only on macOS and Linux`):t.platform===`macos`&&t.button===`middle`?new e(`UNSUPPORTED_OPERATION`,`click --button middle is not supported by the macOS runner yet`):typeof t.count==`number`||typeof t.intervalMs==`number`||typeof t.holdMs==`number`||typeof t.jitterPx==`number`||t.doubleTap===!0?new e(`INVALID_ARGS`,`click --button ${t.button} does not support repeat or gesture modifier flags`):null:new e(`INVALID_ARGS`,`--button is supported only for click`)}function Ge(e){return e===`primary`?{}:{button:e}}function v(t,n={message:e=>`Invalid value: ${e}`}){let r=new Set(t),i=n.normalize??(e=>e);return{is:e=>typeof e==`string`&&r.has(e),parse:t=>{let a=i(t??``);if(r.has(a))return a;throw new e(`INVALID_ARGS`,n.message(t??``))}}}const Ke=[`up`,`down`,`left`,`right`,`top`,`bottom`],y=[`up`,`down`,`left`,`right`],b=[`left`,`right`,`left-edge`,`right-edge`],qe=[`one-way`,`ping-pong`],Je=1e4,Ye=6e4,Xe=v(y,{message:e=>`Unknown direction: ${e}`});function Ze(e){let t=e.direction,n=t===`up`||t===`down`?e.referenceHeight:e.referenceWidth,r=T(e.amount),i=e.pixels===void 0?Math.round(n*r):E(e.pixels),a=Math.max(1,Math.round(n*.05)),o=Math.max(1,n-a*2),s=Math.max(1,Math.min(i,o)),c=Math.round(s/2),l=Math.round(e.referenceWidth/2),u=Math.round(e.referenceHeight/2),d=(n,r,i,a)=>({direction:t,x1:n,y1:r,x2:i,y2:a,referenceWidth:e.referenceWidth,referenceHeight:e.referenceHeight,amount:e.amount,pixels:s});switch(t){case`up`:return d(l,u-c,l,u+c);case`down`:return d(l,u+c,l,u-c);case`left`:return d(l-c,u,l+c,u);case`right`:return d(l+c,u,l-c,u)}}function Qe(e){T(e.amount),e.pixels!==void 0&&E(e.pixels)}function $e(e,t){if(e===`left`||e===`right`){let n=x(e,t);return{preset:e,x1:n.x1,y1:n.y1,x2:n.x2,y2:n.y2,referenceWidth:n.referenceWidth,referenceHeight:n.referenceHeight}}let[n,r]=e===`left-edge`?[99,15]:[1,85],i=C(S(t,n,50),t,8),a=C(S(t,r,50),t,8);return{preset:e,x1:i.x,y1:i.y,x2:a.x,y2:a.y,referenceWidth:t.referenceWidth,referenceHeight:t.referenceHeight}}function et(e,t){switch(e){case`up`:return{x:0,y:-t};case`down`:return{x:0,y:t};case`left`:return{x:-t,y:0};case`right`:return{x:t,y:0}}}function x(e,t){let n=e===`left`||e===`up`,r=n?85:15,i=n?15:85,a=e===`up`||e===`down`,o=C(S(t,a?50:r,a?r:50),t,8),s=C(S(t,a?50:i,a?i:50),t,8);return{direction:e,x1:o.x,y1:o.y,x2:s.x,y2:s.y,referenceWidth:t.referenceWidth,referenceHeight:t.referenceHeight}}function tt(e){let t=rt(e);if(t)return{referenceWidth:t.width,referenceHeight:t.height}}function S(e,t,n){let r=Math.trunc(e.referenceWidth*t/100),i=Math.trunc(e.referenceHeight*n/100);return{x:Number.isFinite(r)?r:0,y:Number.isFinite(i)?i:0}}function C(e,t,n){return{x:D(e.x,n,t.referenceWidth),y:D(e.y,n,t.referenceHeight)}}function nt(e){return Xe.parse(e)}function rt(e){let t=e.filter(e=>o(e)&&w(e.rect)).map(e=>e.rect).sort((e,t)=>(t?.width??0)*(t?.height??0)-(e?.width??0)*(e?.height??0))[0];if(t)return t;let n=e.map(e=>e.rect).filter(w);if(n.length===0)return;let r=Math.max(...n.map(e=>e.x+e.width)),i=Math.max(...n.map(e=>e.y+e.height));if(!(r<=0||i<=0))return{x:0,y:0,width:r,height:i}}function w(e){return!!e&&e.width>0&&e.height>0}function T(t){if(t===void 0)return .6;if(!Number.isFinite(t)||t<=0)throw new e(`INVALID_ARGS`,`scroll amount must be a positive number`);return t}function E(t){if(!Number.isFinite(t)||t<=0)throw new e(`INVALID_ARGS`,`scroll pixels must be a positive integer`);return Math.max(1,Math.round(t))}function D(e,t,n){let r=Math.round(t);if(!Number.isFinite(r))return 0;let i=Math.max(r,Math.round(n-t));return!Number.isFinite(i)||!Number.isFinite(e)?r:Math.min(i,Math.max(r,Math.round(e)))}const O=1e4,k=[`pan`,`fling`,`swipe`,`pinch`,`rotate`,`transform`,`drag`];function A(t){let n=M(t),r=I(n,`kind`,k);if(r===`pan`)return{kind:r,origin:N(n,`origin`),delta:N(n,`delta`),pointerCount:a(n,`pointerCount`,{min:1,max:2}),durationMs:j(n)};if(r===`drag`)return it(n);if(n.pointerCount!==void 0)throw new e(`INVALID_ARGS`,`pointerCount is supported only for gesture pan`);if(r===`fling`){if(n.durationMs!==void 0)throw new e(`INVALID_ARGS`,`gesture fling does not accept durationMs; use gesture pan for timed movement`);return{kind:r,direction:I(n,`direction`,y),origin:N(n,`origin`),distance:a(n,`distance`,{min:0})}}if(r===`swipe`){if(n.durationMs!==void 0)throw new e(`INVALID_ARGS`,`gesture swipe does not accept durationMs; use gesture pan for timed movement`);return{kind:r,preset:I(n,`preset`,b)}}if(r===`pinch`)return{kind:r,scale:F(n,`scale`),origin:P(n,`origin`)};if(r===`rotate`){if(n.velocity!==void 0)throw new e(`INVALID_ARGS`,`gesture rotate does not accept velocity; rotation pacing derives from degrees`);return{kind:r,degrees:F(n,`degrees`),origin:P(n,`origin`)}}return{kind:r,origin:N(n,`origin`),delta:N(n,`delta`),scale:F(n,`scale`),degrees:F(n,`degrees`),durationMs:j(n)}}function it(t){let n=a(t,`sourceHoldMs`,{min:1,max:1e4}),r=a(t,`moveMs`,{min:16,max:1e4}),i=a(t,`destinationHoldMs`,{min:0,max:1e4});if((n??800)+(r??500)+(i??0)>1e4)throw new e(`INVALID_ARGS`,`gesture drag total duration must be at most ${O}`);return{kind:`drag`,source:at(t,`source`),destination:at(t,`destination`),sourceHoldMs:n,moveMs:r,destinationHoldMs:i}}function j(t){let n=a(t,`durationMs`);if(n!==void 0){if(n<16||n>1e4)throw new e(`INVALID_ARGS`,`Expected durationMs to be an integer between 16 and ${O}.`);return n}}function M(t){if(!t||typeof t!=`object`||Array.isArray(t))throw new e(`INVALID_ARGS`,`gesture requires structured object input`);return t}function N(e,t){let n=M(e[t]);return{x:F(n,`x`),y:F(n,`y`)}}function P(e,t){return e[t]===void 0?void 0:N(e,t)}function F(t,n){let r=t[n];if(typeof r!=`number`||!Number.isFinite(r))throw new e(`INVALID_ARGS`,`Expected ${n} to be a finite number.`);return r}function at(t,n){let r=t[n];if(typeof r!=`string`||r.trim().length===0)throw new e(`INVALID_ARGS`,`Expected ${n} to be a non-empty string.`);return r.trim()}function I(t,n,r){let i=t[n];if(typeof i!=`string`||!r.includes(i))throw new e(`INVALID_ARGS`,`Expected ${n} to be one of: ${r.join(`, `)}.`);return i}const ot={swipe:{max:4,usage:`swipe accepts 4 arguments: x1 y1 x2 y2`,retired:{positional:`durationMs`,migrate:st}},"gesture pan":{max:5,usage:`gesture pan accepts at most 5 arguments: x y dx dy [durationMs]`},"gesture fling":{max:4,usage:`gesture fling accepts at most 4 arguments: direction x y [distance]`,retired:{positional:`durationMs`,migrate:(e,t)=>`use "${t}", or gesture pan for timed movement.`}},"gesture swipe":{max:1,usage:`gesture swipe accepts 1 argument: preset`,retired:{positional:`durationMs`,migrate:(e,t)=>`use "${t}", or gesture pan for timed movement.`}},"gesture pinch":{max:3,usage:`gesture pinch accepts at most 3 arguments: scale [x] [y]`},"gesture rotate":{max:3,usage:`gesture rotate accepts at most 3 arguments: degrees [x] [y]`,retired:{positional:`velocity`,migrate:(e,t)=>`use "${t}"; rotation pacing derives from degrees.`}},"gesture transform":{max:7,usage:`gesture transform accepts at most 7 arguments: x y dx dy scale degrees [durationMs]`},"gesture drag":{max:5,usage:`gesture drag accepts at most 5 arguments: source destination [sourceHoldMs] [moveMs] [destinationHoldMs]`}};function st(e,t){let[n,r,i,a,o]=e,s=ct(n,i),c=ct(r,a);return s===void 0||c===void 0?`use "gesture pan x1 y1 dx dy durationMs" for the same timed drag, or "${t}" for a default-duration swipe.`:`use "gesture pan ${n} ${r} ${s} ${c} ${o}" for the same timed drag, or "${t}" for a default-duration swipe.`}function ct(e,t){let n=Number(t)-Number(e);return Number.isFinite(n)?n:void 0}function L(e,t){let n=ot[e];if(t.length<=n.max)return;let r=n.retired;if(!r||t.length!==n.max+1||!lt(t[n.max]))return{usage:n.usage};let i=`${e} ${t.slice(0,n.max).join(` `)}`;return{usage:n.usage,migration:`The trailing ${r.positional} positional was removed: ${r.migrate(t,i)}`}}function lt(e){return e===void 0||e.trim().length===0?!1:e.startsWith("${")||Number.isFinite(Number(e))}function ut(t){if(!(!t||typeof t!=`object`||Array.isArray(t))&&t.durationMs!==void 0)throw new e(`INVALID_ARGS`,`swipe does not accept durationMs; use gesture pan for timed movement`)}function dt(e,t){let n=t?`${e.usage} (${t})`:e.usage;return e.migration?`${n}. ${e.migration}`:`${n}.`}function R(t,n){let r=L(t,n);if(r)throw new e(`INVALID_ARGS`,dt(r))}function ft(e,t,n){let r=pt(e,t);return r?dt(r,n):void 0}function pt(e,t){if(e===`swipe`)return L(`swipe`,t);if(e!==`gesture`)return;let n=`gesture ${t[0]}`;if(Object.hasOwn(ot,n))return L(n,t.slice(1))}function mt(e){return{origin:{x:Number(e[0]),y:Number(e[1])},delta:{x:Number(e[2]),y:Number(e[3])}}}function ht(e,t){let n=e[0],r=e.slice(1);switch(n){case`pan`:{R(`gesture pan`,r);let{origin:e,delta:i}=mt(r);return A({kind:n,origin:e,delta:i,pointerCount:t,durationMs:z(r[4])})}case`fling`:return R(`gesture fling`,r),A({kind:n,direction:r[0],origin:{x:Number(r[1]),y:Number(r[2])},distance:z(r[3])});case`swipe`:return R(`gesture swipe`,r),A({kind:n,preset:r[0]});case`pinch`:return R(`gesture pinch`,r),A({kind:n,scale:Number(r[0]),origin:St(r[1],r[2])});case`rotate`:return R(`gesture rotate`,r),A({kind:n,degrees:Number(r[0]),origin:St(r[1],r[2])});case`transform`:{R(`gesture transform`,r);let{origin:e,delta:t}=mt(r);return A({kind:n,origin:e,delta:t,scale:Number(r[4]),degrees:Number(r[5]),durationMs:z(r[6])})}case`drag`:return R(`gesture drag`,r),A({kind:n,source:r[0],destination:r[1],sourceHoldMs:z(r[2]),moveMs:z(r[3]),destinationHoldMs:z(r[4])});default:return A({kind:n})}}function gt(e){if(e[0]!==`drag`)return;let t=ht(e);return t.kind===`drag`?t:void 0}function _t(e){switch(e.kind){case`pan`:return B([e.kind,e.origin.x,e.origin.y,e.delta.x,e.delta.y,e.durationMs]);case`fling`:return B([e.kind,e.direction,e.origin.x,e.origin.y,e.distance]);case`swipe`:return[e.kind,e.preset];case`pinch`:return B([e.kind,e.scale,e.origin?.x,e.origin?.y]);case`rotate`:return e.origin?B([e.kind,e.degrees,e.origin.x,e.origin.y]):[e.kind,String(e.degrees)];case`transform`:return B([e.kind,e.origin.x,e.origin.y,e.delta.x,e.delta.y,e.scale,e.degrees,e.durationMs]);case`drag`:return[e.kind,e.source,e.destination,String(e.sourceHoldMs??800),String(e.moveMs??500),String(e.destinationHoldMs??0)]}}function vt(e,t={}){return R(`swipe`,e),{from:{x:Number(e[0]),y:Number(e[1])},to:{x:Number(e[2]),y:Number(e[3])},...t.count===void 0?{}:{count:t.count},...t.pauseMs===void 0?{}:{pauseMs:t.pauseMs},...t.pattern===void 0?{}:{pattern:t.pattern}}}function yt(t){switch(t.kind){case`pan`:return{gesture:{intent:`pan`,origin:t.origin,delta:t.delta,pointerCount:t.pointerCount,durationMs:t.durationMs}};case`fling`:return{gesture:{intent:`fling`,direction:t.direction,origin:t.origin,distance:t.distance}};case`swipe`:return{gesture:{intent:`fling`,preset:t.preset}};case`pinch`:return{gesture:{intent:`pinch`,origin:t.origin,scale:t.scale}};case`rotate`:return{gesture:{intent:`rotate`,origin:t.origin,degrees:t.degrees}};case`transform`:return{gesture:{intent:`transform`,origin:t.origin,delta:t.delta,scale:t.scale,degrees:t.degrees,durationMs:t.durationMs}};case`drag`:throw new e(`INVALID_ARGS`,`gesture drag targets must be resolved before coordinate normalization`)}}function bt(e){return e.kind===`drag`?{intent:`drag`,source:e.source,destination:e.destination,sourceHoldMs:e.sourceHoldMs,moveMs:e.moveMs,destinationHoldMs:e.destinationHoldMs}:yt(e).gesture}function xt(e){return{gesture:{intent:`fling`,from:e.from,to:e.to}}}function z(e){return e===void 0?void 0:Number(e)}function St(t,n){if(t===void 0!=(n===void 0))throw new e(`INVALID_ARGS`,`gesture origin requires both x and y coordinates`);return t===void 0?void 0:{x:Number(t),y:Number(n)}}function B(e){return e.filter(e=>e!==void 0).map(String)}const V={pinchAxisDegrees:-90,samplingProfile:`default`},Ct={ios:V,macos:V,android:{pinchAxisDegrees:0,samplingProfile:`android`},harmonyos:V,vega:V,linux:V,web:V};function wt(e,t,n){let r=It(t),i=Gt(n);switch(e.intent){case`fling`:return Ot(e,r);case`pan`:return kt(e,r,i);case`pinch`:return U({intent:`pinch`,origin:e.origin??Ht(r),delta:{x:0,y:0},scale:Bt(e.scale,`gesture pinch scale`),rotationDegrees:0,durationMs:300},r,i);case`rotate`:{let t=K(e.degrees,`gesture rotate degrees`);return U({intent:`rotate`,origin:e.origin??Ht(r),delta:{x:0,y:0},scale:1,rotationDegrees:t,durationMs:zt(t)},r,i)}case`transform`:{let t=K(e.degrees,`gesture transform degrees`);return U({intent:`transform`,origin:e.origin,delta:e.delta,scale:Bt(e.scale,`gesture transform scale`),rotationDegrees:t,durationMs:W(e.durationMs,zt(t),`gesture transform durationMs`)},r,i)}}}function Tt(e){let[{samples:t}]=e.pointers,n=t[0],r=t.at(-1);return{start:n.point,end:r.point}}function Et(t,n){let r=It(n),i=Lt(t.sourceHoldMs,800,`gesture drag sourceHoldMs`),a=W(t.moveMs,500,`gesture drag moveMs`),o=Rt(t.destinationHoldMs,0,`gesture drag destinationHoldMs`);if(i+a+o>1e4)throw new e(`INVALID_ARGS`,`gesture drag total duration must be at most ${O}`);return Dt(H(`pan`,t.from,t.to,a,r,`timed-pan`),i,o)}function Dt(e,t,n){let r=e.pointers[0],[i,a]=r.samples,o=t+e.durationMs+n,s=[{offsetMs:0,point:i.point},{...i,offsetMs:i.offsetMs+t},{...a,offsetMs:a.offsetMs+t},...n>0?[{offsetMs:o,point:a.point}]:[]];return{...e,durationMs:o,pointers:[{...r,samples:s}]}}function Ot(e,t){if(`preset`in e){let{from:n,to:r}=Wt(e.preset,t);return H(`fling`,n,r,100,t,`endpoint-hold`)}if(`from`in e)return H(`fling`,e.from,e.to,100,t,`endpoint-hold`);let n=G(e.origin,`gesture fling origin`),r=Vt(e.distance??180,`gesture fling distance`);return H(`fling`,n,q(n,et(e.direction,r)),100,t,`endpoint-hold`)}function kt(t,n,r){let i=W(t.durationMs,500,`gesture pan durationMs`);if((t.pointerCount??1)===1){let e=G(t.origin,`gesture pan origin`);return H(`pan`,e,q(e,G(t.delta,`gesture pan delta`)),i,n,t.executionProfile??`timed-pan`)}if(t.pointerCount!==2)throw new e(`INVALID_ARGS`,`gesture pan pointerCount must be 1 or 2`);return U({intent:`pan`,origin:t.origin,delta:t.delta,scale:1,rotationDegrees:0,durationMs:i},n,r)}function H(e,t,n,r,i,a){let o=G(t,`gesture ${e} start`),s=G(n,`gesture ${e} end`),c=[{offsetMs:0,point:o},{offsetMs:r,point:s}];return Pt(c,i,{intent:e,pointerId:0}),{topology:`single`,intent:e,executionProfile:a,durationMs:r,viewport:i,pointers:[{pointerId:0,samples:c}]}}function U(e,t,n){let r=G(e.origin,`gesture ${e.intent} origin`),i=q(r,G(e.delta,`gesture ${e.intent} delta`)),a=Math.min(t.width,t.height)*Mt(e.intent),o=e.scale>1?a/e.scale:a,s=o*e.scale;if(Math.min(o,s)<48)throw Ft({intent:e.intent,viewport:t,initialSpan:o,finalSpan:s,minimumReliableSpan:48});let c=o/2,l=Nt(e.durationMs,n.samplingProfile),u=(a,o)=>{let s=l.map(t=>({offsetMs:t,point:At({...e,start:r,end:i,initialRadius:c,offsetMs:t,side:o,profile:n})}));return Pt(s,t,{intent:e.intent,pointerId:a}),{pointerId:a,samples:s}};return{topology:`two`,intent:e.intent,durationMs:e.durationMs,viewport:t,pointers:[u(0,1),u(1,-1)]}}function At(e){let t=e.offsetMs/e.durationMs,n=Ut(e.start,e.end,t),r=e.initialRadius*(1+(e.scale-1)*t),i=Kt(jt(e.intent,e.profile)+e.rotationDegrees*t);return{x:n.x+Math.cos(i)*r*e.side,y:n.y+Math.sin(i)*r*e.side}}function jt(e,t){return e===`pinch`?t.pinchAxisDegrees:-90}function Mt(e){return e===`pinch`?.4:.25}function Nt(t,n){if(!Number.isFinite(t)||t<=0)throw new e(`INVALID_ARGS`,`gesture sample duration must be a positive finite number`);let r=t/16,i=Math.max(3,n===`android`?Math.round(r):Math.floor(r));return Array.from({length:i+1},(e,n)=>Math.round(t*n/i))}function Pt(t,n,r){let i=n.x+n.width-1,a=n.y+n.height-1;for(let o of t){let{x:t,y:s}=o.point;if(!Number.isFinite(t)||!Number.isFinite(s))throw new e(`INVALID_ARGS`,`Gesture motion produces non-finite pointer coordinates`,{...r,reason:`GESTURE_TRAJECTORY_NON_FINITE`,hint:`Reduce the requested rotation, translation, or scale.`});if(t<n.x+1||t>i||s<n.y+1||s>a)throw Ft({...r,viewport:n,sample:o})}}function Ft(t){return new e(`INVALID_ARGS`,`Gesture trajectory does not fit inside the viewport`,{...t,reason:`GESTURE_TRAJECTORY_OUT_OF_BOUNDS`,hint:`Move the gesture away from the edge or reduce its translation, scale, or rotation.`})}function It(t){let n={x:K(t.x,`gesture viewport x`),y:K(t.y,`gesture viewport y`),width:K(t.width,`gesture viewport width`),height:K(t.height,`gesture viewport height`)};if(n.width<=0||n.height<=0)throw new e(`INVALID_ARGS`,`gesture viewport width and height must be positive`);return n}function W(t,n,r){let i=t??n;if(!Number.isInteger(i)||i<16||i>1e4)throw new e(`INVALID_ARGS`,`${r} must be an integer between 16 and ${O}`);return i}function Lt(t,n,r){let i=t??n;if(!Number.isInteger(i)||i<1||i>1e4)throw new e(`INVALID_ARGS`,`${r} must be an integer between 1 and ${O}`);return i}function Rt(t,n,r){let i=t??n;if(!Number.isInteger(i)||i<0||i>1e4)throw new e(`INVALID_ARGS`,`${r} must be an integer between 0 and ${O}`);return i}function zt(e){let t=Math.ceil(Math.abs(e)/3)*16;return Math.min(Math.max(300,t),2400)}function G(e,t){return{x:K(e.x,`${t} x`),y:K(e.y,`${t} y`)}}function K(t,n){if(!Number.isFinite(t))throw new e(`INVALID_ARGS`,`${n} must be a finite number`);return t}function Bt(t,n){let r=K(t,n);if(r<=0)throw new e(`INVALID_ARGS`,`${n} must be greater than 0`);return r}function Vt(t,n){let r=K(t,n);if(r<=0)throw new e(`INVALID_ARGS`,`${n} must be a positive number`);return r}function Ht(e){return{x:e.x+e.width/2,y:e.y+e.height/2}}function q(e,t){return{x:e.x+t.x,y:e.y+t.y}}function Ut(e,t,n){return{x:e.x+(t.x-e.x)*n,y:e.y+(t.y-e.y)*n}}function Wt(e,t){let n=$e(e,{referenceWidth:t.width,referenceHeight:t.height});return{from:{x:t.x+n.x1,y:t.y+n.y1},to:{x:t.x+n.x2,y:t.y+n.y2}}}function Gt(e){return e===void 0?V:Ct[e]}function Kt(e){return e*Math.PI/180}const qt={occlusion:{kind:`runtime`,via:`src/snapshot/snapshot-occlusion.ts#isSnapshotNodeInteractionBlocked`},parentOwnedTouchPoint:{kind:`runtime`,via:`src/core/interaction-touch-point.ts#resolveInteractionTouchPoint`},offscreen:{kind:`runtime`,via:`src/commands/interaction/runtime/resolution.ts#throwIfOffscreenInteractionTarget`},nonHittable:{kind:`runtime`,via:`src/core/interaction-targeting.ts#resolveActionableTouchResolution`},responseConstruction:{kind:`runtime`,via:`src/daemon/handlers/interaction-touch-response.ts#buildInteractionResponseData`},responseIdentity:{kind:`runtime`,via:`src/daemon/handlers/interaction-touch-targets.ts#interactionResultExtra`},verifyEvidence:{kind:`runtime`,via:`src/commands/interaction/runtime/interactions.ts#pressCommand`,appliesTo:[`press`,`click`,`fill`]},settleObservation:{kind:`runtime`,via:`src/commands/interaction/runtime/settle.ts#settleAfterInteraction`}};({...qt}),{...qt};const Jt=`tapped via non-hittable coordinate fallback`,Yt=[`xctest-element`,`synthesized-first-responder`,`synthesized-first-responder-replacement`,`xctest-application-fallback`],Xt=[`focused-element`,`keyboard-shown`],Zt=1e4;function Qt(t,n=`scroll accepts either a relative amount or --pixels, not both`){if(t.amount!==void 0&&t.pixels!==void 0)throw new e(`INVALID_ARGS`,n)}function $t(t,n={}){if(t===void 0)return;let r=n.field??`scroll durationMs`,i=n.max??1e4,a=n.invalidMessage??`${r} must be a non-negative integer`;if(!Number.isFinite(t)||!Number.isInteger(t)||t<0)throw new e(`INVALID_ARGS`,a);if(t>i)throw new e(`INVALID_ARGS`,`${r} must be a non-negative integer at most ${i}`);return t}function en(e){return typeof e?.durationMs==`number`?e.durationMs:void 0}const tn={android:`longpress`,apple:`exact`,vega:`exact`},J={up:{aliases:[],androidKeyevent:`KEYCODE_DPAD_UP`,appleRemoteButton:`up`,vegaKey:`KEY_UP`},down:{aliases:[],androidKeyevent:`KEYCODE_DPAD_DOWN`,appleRemoteButton:`down`,vegaKey:`KEY_DOWN`},left:{aliases:[],androidKeyevent:`KEYCODE_DPAD_LEFT`,appleRemoteButton:`left`,vegaKey:`KEY_LEFT`},right:{aliases:[],androidKeyevent:`KEYCODE_DPAD_RIGHT`,appleRemoteButton:`right`,vegaKey:`KEY_RIGHT`},select:{aliases:[`ok`,`center`,`enter`],androidKeyevent:`KEYCODE_DPAD_CENTER`,appleRemoteButton:`select`,vegaKey:`KEY_ENTER`},menu:{aliases:[],androidKeyevent:`KEYCODE_MENU`,appleRemoteButton:`menu`,vegaKey:`KEY_MENU`},home:{aliases:[],androidKeyevent:`KEYCODE_HOME`,appleRemoteButton:`home`,vegaKey:`KEY_HOMEPAGE`},back:{aliases:[],androidKeyevent:`KEYCODE_BACK`,appleRemoteButton:`menu`,vegaKey:`KEY_BACK`}},Y=Object.keys(J),nn=`<${Y.join(`|`)}>`;function rn(t){let n=t?.toLowerCase();if(an(n))return n;let r=n?un.get(n):void 0;if(r)return r;throw new e(`INVALID_ARGS`,`tv-remote button must be one of: ${Y.join(`, `)}.`)}function an(e){return typeof e==`string`&&Y.includes(e)}function on(e){return J[e].appleRemoteButton}function sn(e){return J[e].androidKeyevent}function cn(e){return J[e].vegaKey}function ln(e){return tn[e]}const un=new Map(Y.flatMap(e=>J[e].aliases.map(t=>[t,e]))),dn={captureStalled:`wait_capture_stalled`,deadlineExceeded:`wait_deadline_exceeded`,targetAbsent:`wait_target_absent`,stableTimeout:`wait_stable_timeout`,landmarkIdentityMismatch:`wait_landmark_identity_mismatch`},fn=[`camera`,`microphone`,`photos`,`contacts`,`contacts-limited`,`notifications`,`calendar`,`location`,`location-always`,`media-library`,`motion`,`reminders`,`siri`],pn=`<wifi|airplane|location> <on|off>`,mn=`location set <lat> <lon>`,hn=`animations <on|off>`,X=`appearance <light|dark|toggle>`,gn=`faceid <match|nonmatch|enroll|unenroll>`,_n=`touchid <match|nonmatch|enroll|unenroll>`,vn=`fingerprint <match|nonmatch>`,yn=`clear-app-state [app-id]`,bn=`permission <grant|deny|reset> <camera|microphone|photos|contacts|contacts-limited|notifications|calendar|location|location-always|media-library|motion|reminders|siri> [full|limited]`,Z=`permission <grant|reset> <accessibility|screen-recording|input-monitoring>`,xn=`macOS supports only settings ${X} and settings ${Z}. wifi|airplane|location|animations remain unsupported on macOS.`,Sn=[`settings ${pn}`,`settings ${mn}`,`settings ${hn}`,`settings ${X}`,`settings ${gn}`,`settings ${_n}`,`settings ${vn}`,`settings ${yn}`,`settings ${bn}`,`settings ${Z}`].join(` | `),Cn=`settings requires ${pn}, ${mn}, ${hn}, ${X}, ${gn}, ${_n}, ${vn}, ${yn}, ${bn}, or ${Z}`;function wn(e){let t=e.trim().toLowerCase();return t===`appearance`||t===`permission`}function Tn(e){return`Unsupported macOS setting: ${e}. ${xn}`}function En(t){let n=t.trim().toLowerCase();if(n===`grant`)return`grant`;if(n===`deny`)return`deny`;if(n===`reset`)return`reset`;throw new e(`INVALID_ARGS`,`Invalid permission action: ${t}. Use grant|deny|reset.`)}function Dn(t){let n=t?.trim().toLowerCase();if(n===`camera`||n===`microphone`||n===`photos`||n===`contacts`||n===`contacts-limited`||n===`notifications`||n===`calendar`||n===`location`||n===`location-always`||n===`media-library`||n===`motion`||n===`reminders`||n===`siri`)return n;throw new e(`INVALID_ARGS`,`permission setting requires a target: ${fn.join(`|`)}`)}function On(t,n){if(t===void 0||t.trim()===``)throw new e(`INVALID_ARGS`,`settings location set requires ${n}`);return Q(Number(t),n)}function kn(e){return{latitude:Q(e?.latitude,`latitude`),longitude:Q(e?.longitude,`longitude`)}}function Q(t,n){let r=n===`latitude`?-90:-180,i=n===`latitude`?90:180;if(typeof t!=`number`||!Number.isFinite(t)||t<r||t>i)throw new e(`INVALID_ARGS`,`${n} must be a number from ${r} to ${i}`);return t}function An(e){let t=new Map;for(let[n,r]of e.entries())t.set(r.index,n);let n=[],r=[];for(let[i,a]of e.entries()){let e=Math.max(0,a.depth??0);for(;r.length>0&&e<=r[r.length-1].depth;)r.pop();let o=i,s=typeof a.parentIndex==`number`?t.get(a.parentIndex):void 0,c=typeof s==`number`&&s<o?s:r[r.length-1]?.index;n.push({...a,index:o,depth:e,parentIndex:c}),r.push({depth:e,index:o})}return n}function $(e){return e.label?.trim()||e.value?.trim()||e.identifier?.trim()||``}function jn(e){let t=e.trim().toLowerCase();return t?/^(vertical|horizontal)\s+scroll\s+bar(?:,?\s*\d+\s+pages?)?$/.test(t):!1}function Mn(e,t){if(!(e?.trim().toLowerCase()??``).includes(`vertical scroll bar`))return null;let n=Nn(t);return n===null?null:n<=1?{above:!1,below:!0}:n>=99?{above:!0,below:!1}:{above:!0,below:!0}}function Nn(e){if(!e)return null;let t=/^(\d{1,3})%$/.exec(e.trim());if(!t)return null;let n=Number(t[1]);return Number.isFinite(n)?Math.max(0,Math.min(100,n)):null}function Pn(e){if(e.length===0)return{nodes:e,hiddenCount:0,summaryLines:[]};let{byIndex:t,visibleNodeIndexes:n,offscreenNodes:r,hintedContainers:i}=In(e),a=n.size===0?e:e.filter(e=>n.has(e.index));return{nodes:a.map(e=>Hn(e,i.directionsByContainer)),hiddenCount:n.size===0?0:e.length-a.length,summaryLines:Un(r.filter(e=>!i.coveredNodeIndexes.has(e.index)&&Kn(e)),e,t)}}function Fn(e){if(e.length===0)return new Map;let{hintedContainers:t}=In(e);return Vn(t.directionsByContainer)}function In(e){let t=u(e),n=new Set,r=[];for(let i of e){if(l(i,e,t)){Jn(i,n,t);continue}r.push(i)}return{byIndex:t,visibleNodeIndexes:n,offscreenNodes:r,hintedContainers:Bn(e,r,n,t)}}function Ln(e,t){return e.hittable&&r(e.rect,t)}function Rn(e,n,a=u(n)){if(!e.rect)return null;let o=s(e,n,a);if(o&&!i(e.rect,o)){let t=zn(e.rect,o);if(t)return t}let c=t(n,e.rect);if(c&&!r(e.rect,c)){let t=zn(e.rect,c);if(t)return t}return null}function zn(e,t){let n=e.x+e.width/2,r=e.y+e.height/2,i=[{direction:`down`,amount:r-(t.y+t.height)},{direction:`up`,amount:t.y-r},{direction:`right`,amount:n-(t.x+t.width)},{direction:`left`,amount:t.x-n}],a=null;for(let e of i)e.amount>0&&(!a||e.amount>a.amount)&&(a=e);return a?.direction??null}function Bn(e,t,n,r){let i=new Map,a=new Map,o=new Set;for(let e of t){if(!e.rect)continue;let t=Yn(e,n,r);if(!t?.rect)continue;let s=Gn(e.rect,t.rect);if(!s)continue;let c=i.get(t.index)??new Set;c.add(s),i.set(t.index,c);let l=a.get(t.index)??new Set;l.add(s),a.set(t.index,l),o.add(e.index)}return Xn(e,n,r,i,a),{directionsByContainer:i,coveredNodeIndexes:o}}function Vn(e){let t=new Map;for(let[n,r]of e){let e={};r.has(`above`)&&(e.hiddenContentAbove=!0),r.has(`below`)&&(e.hiddenContentBelow=!0),(e.hiddenContentAbove||e.hiddenContentBelow)&&t.set(n,e)}return t}function Hn(e,t){let n=t.get(e.index);if(!n||n.size===0)return e;let r=e.hiddenContentAbove===!0||n.has(`above`)?!0:void 0,i=e.hiddenContentBelow===!0||n.has(`below`)?!0:void 0;return{...e,hiddenContentAbove:r,hiddenContentBelow:i}}function Un(e,t,n){let r=new Map;for(let i of e){let e=Wn(i,t,n);if(!e)continue;let a=r.get(e)??[];a.push(i),r.set(e,a)}return[`above`,`below`].flatMap(e=>{let t=r.get(e);if(!t||t.length===0)return[];let n=qn(t).slice(0,3).map(e=>`"${e}"`),i=t.length===1?`interactive item`:`interactive items`,a=n.length>0?`: ${n.join(`, `)}`:``;return[`[off-screen ${e}] ${t.length} ${i}${a}`]})}function Wn(e,t,n){if(!e.rect)return null;let r=s(e,t,n);return r?Gn(e.rect,r):null}function Gn(e,t){return e.y+e.height<=t.y?`above`:e.y>=t.y+t.height?`below`:null}function Kn(e){if(e.hittable===!0)return!0;let t=(e.type??``).toLowerCase();return t.includes(`button`)||t.includes(`link`)||t.includes(`textfield`)||t.includes(`edittext`)||t.includes(`searchfield`)||t.includes(`checkbox`)||t.includes(`radio`)||t.includes(`switch`)||t.includes(`menuitem`)||!!$(e)}function qn(e){let t=new Set,n=[];for(let r of e){let e=$(r);!e||t.has(e)||(t.add(e),n.push(e))}return n}function Jn(e,t,n){let r=e,i=new Set;for(;r&&!i.has(r.index);)i.add(r.index),t.add(r.index),r=typeof r.parentIndex==`number`?n.get(r.parentIndex):void 0}function Yn(e,t,r){return n(e,r,e=>t.has(e.index))}function Xn(e,t,n,r,i){for(let a of e){let e=Zn(a);if(!e||e.size===0)continue;let o=Yn(a,t,n);if(!o)continue;let s=r.get(o.index)??new Set,c=i.get(o.index);for(let t of e)c&&c.size>0&&!c.has(t)||s.add(t);r.set(o.index,s)}}function Zn(e){let t=Mn(e.label,e.value);if(!t)return null;let n=new Set;return t.above&&n.add(`above`),t.below&&n.add(`below`),n.size>0?n:null}function Qn(e){return e}function $n(e,t){let n=Math.max(e.x,t.x),r=Math.max(e.y,t.y),i=Math.min(e.x+e.width,t.x+t.width),a=Math.min(e.y+e.height,t.y+t.height);return i<=n||a<=r?0:(i-n)*(a-r)}function er(e=tr()){try{let t=JSON.parse(f.readFileSync(d.join(e,`package.json`),`utf8`));return typeof t.version==`string`?t.version:`0.0.0`}catch{return`0.0.0`}}function tr(){let e=d.dirname(ee(import.meta.url)),t=e;for(let e=0;e<6;e+=1){let e=d.join(t,`package.json`);if(f.existsSync(e))return t;t=d.dirname(t)}return e}export{qe as $,Qt as A,pe as At,Tt as B,nn as C,xe as Ct,cn as D,re as Dt,on as E,ie as Et,Yt as F,le as Ft,_t as G,ft as H,Et as I,ne as It,vt as J,bt as K,wt as L,fe as Lt,$t as M,te as Mt,Xt as N,ue as Nt,ln as O,p as Ot,Jt as P,de as Pt,Ke as Q,Ut as R,Y as S,be as St,sn as T,m as Tt,gt as U,ut as V,ht as W,A as X,k as Y,y as Z,Tn as _,De as _t,Pn as a,Ze as at,Dn as b,Te as bt,Ln as c,v as ct,$ as d,We as dt,Je as et,An as f,Ue as ft,Sn as g,Re as gt,Cn as h,ze as ht,Qn as i,x as it,en as j,me as jt,Zt as k,ae as kt,Mn as l,He as lt,kn as m,Be as mt,er as n,Ye as nt,Rn as o,tt as ot,On as p,Ve as pt,xt as q,$n as r,Qe as rt,Fn as s,nt as st,tr as t,b as tt,jn as u,Ge as ut,wn as v,Oe as vt,rn as w,ye as wt,dn as x,Ee as xt,En as y,we as yt,Nt as z};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import{_ as e}from"./sdk-contracts.js";import{v as t}from"./sdk-android-adb.js";import{t as n}from"./timeouts.js";import{c as r}from"./host-process.js";import{t as i}from"./process-lock.js";import a from"node:path";import{createHash as o}from"node:crypto";import s from"node:fs";import c from"node:os";function l(e=process.env){let t=f(),n=a.join(t,`home`),r=a.join(t,`module-cache`);return s.mkdirSync(n,{recursive:!0}),s.mkdirSync(r,{recursive:!0}),{...e,HOME:n,CLANG_MODULE_CACHE_PATH:r}}async function u(e){let t=s.statSync(e.sourcePath),n=s.readFileSync(e.sourcePath),r=g(e.cacheName??a.basename(e.sourcePath,a.extname(e.sourcePath))),i=v([`2`,process.platform,process.arch,a.resolve(e.sourcePath),t.size,n]),o=a.join(f(),`bin`,`${r}-${i}`);return await p({sourcePath:e.sourcePath,executablePath:o,timeoutMs:e.timeoutMs}),o}async function d(e){let t=g(e.cacheName),n=v([`2`,process.platform,process.arch,e.source]),r=a.join(f(),`sources`,`${t}-${n}.swift`),i=a.join(f(),`bin`,`${t}-${n}`);return await p({sourcePath:r,executablePath:i,sourceText:e.source,timeoutMs:e.timeoutMs}),i}function f(){let e=process.env.AGENT_DEVICE_SWIFT_CACHE_DIR?.trim();return e?a.resolve(e):a.join(c.tmpdir(),`agent-device-swift-cache`)}async function p(e){if(h(e.executablePath))return;let n=a.dirname(e.executablePath);s.mkdirSync(n,{recursive:!0});let r=await m(`${e.executablePath}.lock`,e.executablePath,e.timeoutMs??12e4);if(!r)return;let i=s.mkdtempSync(a.join(n,`.${a.basename(e.executablePath)}.${process.pid}.`)),o=a.join(i,a.basename(e.executablePath));try{if(h(e.executablePath))return;e.sourceText!==void 0&&!s.existsSync(e.sourcePath)&&(s.mkdirSync(a.dirname(e.sourcePath),{recursive:!0}),s.writeFileSync(e.sourcePath,e.sourceText)),await t(`xcrun`,[`swiftc`,e.sourcePath,`-o`,o],{timeoutMs:e.timeoutMs??12e4,env:l()}),s.renameSync(o,e.executablePath)}finally{s.rmSync(i,{recursive:!0,force:!0}),await r()}}async function m(t,n,a){if(h(n))return null;try{return await i({lockDirPath:t,owner:{pid:process.pid,startTime:r(process.pid),acquiredAtMs:Date.now()},timeoutMs:a,pollMs:25,ownerGraceMs:a,description:`Swift cache lock: ${t} (${a}ms)`})}catch(n){throw n instanceof e&&n.message.startsWith(`Timed out waiting for Swift cache lock:`)?new e(`COMMAND_FAILED`,n.message,{...n.details,lockDir:t,timeoutMs:a,hint:`Another agent-device process may still be compiling this Swift helper. Retry shortly; if no agent-device process is active, remove "${t}" and retry.`}):n}}function h(e){try{return s.accessSync(e,s.constants.X_OK),s.statSync(e).isFile()}catch{return!1}}function g(e){return _(e.replaceAll(/[^A-Za-z0-9._-]/g,`-`))||`swift-helper`}function _(e){let t=0,n=e.length;for(;t<n&&e[t]===`-`;)t+=1;for(;n>t&&e[n-1]===`-`;)--n;return e.slice(t,n)}function v(e){let t=o(`sha256`);for(let n of e)t.update(Buffer.isBuffer(n)?n:String(n)),t.update(`\0`);return t.digest(`hex`).slice(0,16)}const y={block:161,blockGroup:160,cluster:524531317,codecId:134,documentType:17026,ebml:440786851,segment:408125543,simpleBlock:163,trackEntry:174,trackNumber:215,tracks:374648427,trackType:131};function b(e){let t=x(e);if(!t)return!1;let{bytes:n,fileSize:r}=t,i=M(n,0,n.length,r);if(!i||i.id!==y.ebml||!i.complete||i.unknownSize||!S(n,i))return!1;let a=M(n,i.nextOffset,n.length,r);return!a||a.id!==y.segment||!I(a,r)?!1:C(n,a,r)}function x(e){try{let t=s.openSync(e,`r`);try{let e=s.fstatSync(t).size;if(e<=0)return;let n=Buffer.alloc(Math.min(e,1048576));return s.readSync(t,n,0,n.length,0)===n.length?{bytes:n,fileSize:e}:void 0}finally{s.closeSync(t)}}catch{return}}function S(e,t){let n=j(e,t)?.find(e=>e.id===y.documentType);return n!==void 0&&e.toString(`ascii`,n.dataStart,n.dataEnd)===`webm`}function C(e,t,n){let r=new Set,i=new Set;for(let a=t.dataStart;a<t.dataEnd;){let o=M(e,a,t.dataEnd,n);if(!o||!I(o,n))return!1;if(o.id===y.tracks&&w(e,o,r),o.id===y.cluster&&E(e,o,n,i),L(r,i))return!0;if(!o.complete||o.unknownSize)return!1;a=o.nextOffset}return!1}function w(e,t,n){let r=j(e,t);if(r){for(let t of r)if(t.id===y.trackEntry){let r=T(e,t);r!==void 0&&n.add(r)}}}function T(e,t){let n=j(e,t),r=A(e,n,y.trackNumber),i=A(e,n,y.trackType),a=n?.find(e=>e.id===y.codecId),o=a?e.toString(`ascii`,a.dataStart,a.dataEnd):void 0;return i===1&&o?.startsWith(`V_`)?r:void 0}function E(e,t,n,r){for(let i=t.dataStart;i<t.dataEnd;){let a=M(e,i,t.dataEnd,n);if(!a||!I(a,n)||(a.id===y.simpleBlock&&O(e,a,r),a.id===y.blockGroup&&D(e,a,r),!a.complete||a.unknownSize))return;i=a.nextOffset}}function D(e,t,n){let r=j(e,t)?.find(e=>e.id===y.block);r&&O(e,r,n)}function O(e,t,n){if(!t.complete||t.unknownSize)return;let r=P(e,t.dataStart);!r||r.unknown||t.dataEnd-t.dataStart<r.length+4||n.add(r.value)}function k(e,t){let n=t.dataEnd-t.dataStart;if(n<1||n>6)return;let r=0;for(let n=t.dataStart;n<t.dataEnd;n+=1)r=r*256+e[n];return Number.isSafeInteger(r)?r:void 0}function A(e,t,n){let r=t?.find(e=>e.id===n);return r?k(e,r):void 0}function j(e,t){if(!t.complete||t.unknownSize)return;let n=[];for(let r=t.dataStart;r<t.dataEnd;){let i=M(e,r,t.dataEnd,e.length);if(!i||!i.complete||i.unknownSize)return;n.push(i),r=i.nextOffset}return n}function M(e,t,n,r){let i=N(e,t);if(!i)return;let a=P(e,t+i.length);if(!a)return;let o=t+i.length+a.length;if(o>n)return;let s=a.unknown?r:o+a.value;if(!(!Number.isSafeInteger(s)||s<o))return{id:i.value,dataStart:o,dataEnd:Math.min(s,n),nextOffset:s,complete:s<=n,unknownSize:a.unknown}}function N(e,t){let n=F(e,t,4);if(!n)return;let r=0;for(let i=0;i<n;i+=1)r=r*256+e[t+i];return{length:n,value:r}}function P(e,t){let n=F(e,t,8);if(!n)return;let r=e[t],i=128>>n-1;if((r&i-1)==i-1&&e.subarray(t+1,t+n).every(e=>e===255))return{length:n,value:0,unknown:!0};let a=r&i-1;for(let r=1;r<n;r+=1)a=a*256+e[t+r];return Number.isSafeInteger(a)?{length:n,value:a,unknown:!1}:void 0}function F(e,t,n){let r=e[t];if(r===void 0||r===0)return;let i=128,a=1;for(;(r&i)===0;)i>>=1,a+=1;return a<=n&&t+a<=e.length?a:void 0}function I(e,t){return e.unknownSize||e.nextOffset<=t}function L(e,t){for(let n of e)if(t.has(n))return!0;return!1}let R;async function z(e,t={}){let r=t.pollMs??150,i=t.attempts??12,a,o=0;for(let t=0;t<i;t+=1){let t=0;try{t=s.statSync(e).size}catch{t=0}if(t>0&&t===a){if(o+=1,o>=2)return}else o=0;a=t,await n(r)}}async function B(e){let n=G(e);if(!n)return!1;if(n===`webm`)return!0;try{let n=await t(await V(),[e],{allowFailure:!0,timeoutMs:1e4,env:l()});return n.exitCode===0?!0:W(n.stderr,n.stdout)}catch(e){if(H(e))return!0;throw e}}async function V(){R??=d({source:`import Foundation
|
|
2
|
+
import AVFoundation
|
|
3
|
+
|
|
4
|
+
let url = URL(fileURLWithPath: CommandLine.arguments[1])
|
|
5
|
+
let asset = AVURLAsset(url: url)
|
|
6
|
+
let semaphore = DispatchSemaphore(value: 0)
|
|
7
|
+
var exitCode: Int32 = 1
|
|
8
|
+
|
|
9
|
+
Task {
|
|
10
|
+
defer { semaphore.signal() }
|
|
11
|
+
do {
|
|
12
|
+
let playable = try await asset.load(.isPlayable)
|
|
13
|
+
let duration = try await asset.load(.duration)
|
|
14
|
+
if playable && duration.isValid && !duration.isIndefinite {
|
|
15
|
+
exitCode = 0
|
|
16
|
+
}
|
|
17
|
+
} catch {
|
|
18
|
+
exitCode = 1
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
semaphore.wait()
|
|
23
|
+
exit(exitCode)`,cacheName:`video-validator`,timeoutMs:3e4});try{return await R}catch(e){throw R=void 0,e}}function H(t){return t instanceof e?t.code===`TOOL_MISSING`?!0:W(String(t.details?.stderr??``),String(t.details?.stdout??``)):!1}async function U(e,t={}){let r=t.pollMs??150,i=t.attempts??12;for(let t=0;t<i;t+=1){if(await B(e))return;await n(r)}}function W(e,t){let n=`${e}\n${t}`;return/\b(no such module ['"]AVFoundation['"]|unable to find utility ["']swiftc?["']|xcrun: error: unable to find utility ["']swiftc?["'])\b/i.test(n)}function G(e){try{let t=s.statSync(e);if(!t.isFile()||t.size<=0)return}catch{return}if(e.toLowerCase().endsWith(`.webm`))return b(e)?`webm`:void 0;let t=K(e);return t.includes(`ftyp`)&&t.includes(`moov`)?`mp4`:void 0}function K(e){try{let t=s.openSync(e,`r`);try{let e=s.fstatSync(t).size,n=0,r=[];for(;n+8<=e&&r.length<16;){let e=Buffer.alloc(8);if(s.readSync(t,e,0,8,n)<8)break;let i=e.readUInt32BE(0),a=e.toString(`latin1`,4,8);if(r.push(a),i===1){let e=Buffer.alloc(8);if(s.readSync(t,e,0,8,n+8)<8)break;i=Number(e.readBigUInt64BE(0))}if(!Number.isFinite(i)||i<=0)break;n+=i}return r}finally{s.closeSync(t)}}catch{return[]}}export{u as a,l as i,U as n,z as r,B as t};
|
package/dist/src/web.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{_ as e}from"./sdk-contracts.js";import{
|
|
1
|
+
import{_ as e}from"./sdk-contracts.js";import{I as t}from"./sdk-android-adb.js";import{gn as n}from"./internal/daemon.js";import{t as r}from"./unsupported-interactor.js";function i(){let i=()=>n();return{...r(`web`),open:(e,t)=>i().open(t?.url??e,{url:t?.url}),openDevice:()=>i().open(`about:blank`),close:e=>i().close(e),tap:(e,t)=>i().click(e,t),focus:(e,t)=>i().click(e,t),type:(e,t)=>i().typeText(e,{delayMs:t}),fill:(e,t,n,r)=>i().fill(e,t,n,{delayMs:r}),scroll:(e,t)=>i().scroll(e,t),screenshot:(e,t)=>i().screenshot(e,t),setViewport:(e,t)=>i().setViewport(e,t),snapshot:async e=>{let n=await t(`snapshot_capture`,async()=>await i().snapshot(e),{backend:`web`});return{nodes:n.nodes,truncated:n.truncated??!1,backend:`web`}},setOrientation:async()=>{throw new e(`UNSUPPORTED_OPERATION`,`orientation is not supported on web`)}}}export{i as createWebInteractor};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agent-device",
|
|
3
|
-
"version": "0.20.
|
|
3
|
+
"version": "0.20.8",
|
|
4
4
|
"description": "Agent-native CLI for AI app automation across iOS, Android, tvOS, Android TV, macOS, Linux, and web.",
|
|
5
5
|
"mcpName": "io.github.callstack/agent-device",
|
|
6
6
|
"license": "MIT",
|
|
@@ -130,7 +130,7 @@
|
|
|
130
130
|
"check:affected:test": "node --experimental-strip-types scripts/node-test-tmpdir.ts --experimental-strip-types --test scripts/check-affected/model.test.ts scripts/check-affected/platform-packages.test.ts scripts/check-affected/run.test.ts",
|
|
131
131
|
"check:coverage-changed": "node --experimental-strip-types scripts/coverage-changed/run.ts",
|
|
132
132
|
"check:coverage-changed:test": "node --experimental-strip-types scripts/node-test-tmpdir.ts --experimental-strip-types --test scripts/coverage-changed/model.test.ts scripts/coverage-changed/run.test.ts",
|
|
133
|
-
"check:layering": "node --experimental-strip-types scripts/node-test-tmpdir.ts --experimental-strip-types --test scripts/layering/model.test.ts scripts/layering/zone-policy.test.ts scripts/layering/daemon-modularity.test.ts scripts/layering/package-boundaries.test.ts scripts/layering/platform-package-policy.test.ts scripts/layering/platform-package-repository.test.ts scripts/layering/platform-package-source-policy.test.ts scripts/layering/device-inventory-cutover-policy.test.ts scripts/layering/logs-runtime-cutover-policy.test.ts scripts/layering/network-runtime-cutover-policy.test.ts scripts/layering/contracts-implementation-policy.test.ts scripts/layering/facade-exports.test.ts scripts/layering/bin-alias-fast-path.test.ts && node --experimental-strip-types scripts/layering/check.ts",
|
|
133
|
+
"check:layering": "node --experimental-strip-types scripts/node-test-tmpdir.ts --experimental-strip-types --test scripts/layering/model.test.ts scripts/layering/zone-policy.test.ts scripts/layering/daemon-modularity.test.ts scripts/layering/package-boundaries.test.ts scripts/layering/platform-package-policy.test.ts scripts/layering/platform-package-repository.test.ts scripts/layering/platform-package-source-policy.test.ts scripts/layering/device-inventory-cutover-policy.test.ts scripts/layering/logs-runtime-cutover-policy.test.ts scripts/layering/network-runtime-cutover-policy.test.ts scripts/layering/record-runtime-cutover-policy.test.ts scripts/layering/contracts-implementation-policy.test.ts scripts/layering/facade-exports.test.ts scripts/layering/bin-alias-fast-path.test.ts && node --experimental-strip-types scripts/layering/check.ts",
|
|
134
134
|
"depgraph": "node --experimental-strip-types scripts/depgraph/build.ts",
|
|
135
135
|
"depgraph:test": "node --experimental-strip-types scripts/node-test-tmpdir.ts --experimental-strip-types --test scripts/depgraph/model.test.ts scripts/depgraph/affected.test.ts",
|
|
136
136
|
"check:production-exports": "fallow dead-code --config fallow-production-exports.json --production --unused-exports --fail-on-issues",
|
|
@@ -196,8 +196,6 @@
|
|
|
196
196
|
"!android/ime-helper/dist/*.idsig",
|
|
197
197
|
"!android/ime-helper/README.md",
|
|
198
198
|
"linux/atspi-dump.py",
|
|
199
|
-
"skills/agent-device",
|
|
200
|
-
"skills/dogfood",
|
|
201
199
|
"server.json",
|
|
202
200
|
"smithery.yaml",
|
|
203
201
|
"README.md",
|
package/server.json
CHANGED
|
@@ -7,12 +7,12 @@
|
|
|
7
7
|
"url": "https://github.com/callstack/agent-device",
|
|
8
8
|
"source": "github"
|
|
9
9
|
},
|
|
10
|
-
"version": "0.20.
|
|
10
|
+
"version": "0.20.8",
|
|
11
11
|
"packages": [
|
|
12
12
|
{
|
|
13
13
|
"registryType": "npm",
|
|
14
14
|
"identifier": "agent-device",
|
|
15
|
-
"version": "0.20.
|
|
15
|
+
"version": "0.20.8",
|
|
16
16
|
"transport": {
|
|
17
17
|
"type": "stdio"
|
|
18
18
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
7311d6a527bdf8be33b752e59e73f4a527585654f8d530d3680ab15ccf271cb0 agent-device-android-ime-helper-0.20.7.apk
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
c45f72eea93c19b4a17fedb4b25f880d5e225c9ab41be4017db8613fdd276e09 agent-device-android-snapshot-helper-0.20.7.apk
|
package/dist/src/context.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{_ as e}from"./sdk-contracts.js";import{A as t,Ft as n,M as r,N as i,Nt as a,P as o,dt as s,ft as c,j as l,p as u,st as d,w as f}from"./version.js";import{G as ee,V as te,a as ne,h as re,s as p}from"./sdk-batch-runner.js";import{_ as m,b as ie,c as h,h as ae,l as g,m as _,s as v,x as oe,y as se}from"./sdk-device.js";import{Gt as ce,Kt as le,Xt as y,_n as b,dt as ue,ft as de,gn as x,n as fe,pt as pe,ut as S}from"./prepare-kind.js";import{A as me}from"./screenshot-result.js";import{a as he}from"./device.js";import{f as ge}from"./runtime.js";import{A as C,F as _e,M as ve}from"./sdk-android-adb.js";import{t as ye}from"./timeouts.js";import{F as be}from"./runner-disposal.js";import{i as xe}from"./lease-context.js";import{B as Se,V as Ce}from"./physical-device-control.js";import we from"node:path";import{AsyncLocalStorage as w}from"node:async_hooks";import Te,{promises as T}from"node:fs";let Ee=[];const E=new w;async function De(e,t){return await E.run([...e],t)}function Oe(e,t){for(let n of O()){if(!n.ownsDevice(e))continue;let r=n.getInteractor(e,t);if(r)return r}}function D(e){return O().some(t=>t.ownsDevice(e))}async function ke(e,t,n,r){for(let i of O()){if(!i.ownsDevice(e))continue;if(!i.installApp)throw j(i,e,`install`);let a=await i.installApp?.(e,t,n,r);if(a)return a;throw j(i,e,`install`)}}async function Ae(e,t,n){for(let r of O()){if(!r.ownsDevice(e))continue;if(!r.installInstallablePath)throw j(r,e,`install_from_source`);let i=await r.installInstallablePath?.(e,t,n);if(i)return i;throw j(r,e,`install_from_source`)}}async function je(e){for(let t of O()){if(!A(t,e.provider))continue;let n=await t.configurePortReverse?.(e);if(n)return n}}function O(){return E.getStore()??Ee}function Me(e,t={}){Be(e);let n=e.map(e=>e.provider);return{providerRuntimeIds:n,providerRuntimeRequiredIds:Ie([...n,...t.providerRuntimeRequiredIds??[]]),leaseLifecycleProvider:Le(e),recoverableProviderIds:e.filter(e=>e.recoverExpiredLease!==void 0).map(e=>e.provider),recoverExpiredLease:Fe(e),cloudArtifactProvider:Re(e),deviceInventorySource:ze(e),appleRunnerProvider:Ne(e),providerDeviceRuntimeScope:async t=>await De(e,t)}}function Ne(e){if(e.some(Pe))return t=>{for(let n of e){if(!Pe(n)||!n.ownsDevice(t.device))continue;let e=n.getAppleRunnerProvider(t.device);if(e)return e}}}function Pe(e){return`getAppleRunnerProvider`in e&&typeof e.getAppleRunnerProvider==`function`}function Fe(t){if(t.some(e=>e.recoverExpiredLease!==void 0))return async n=>{let r=t.find(e=>A(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 Ie(e){return[...new Set(e)]}function Le(e){if(e.length!==0)return{allocate:async(t,n)=>await k(e,`allocate`,t,n),heartbeat:async(t,n)=>await k(e,`heartbeat`,t,n),release:async(t,n)=>await k(e,`release`,t,n)}}function Re(e){if(e.length!==0)return{listCloudArtifacts:async t=>await Ve(e,t)}}function ze(e){if(e.length!==0)return{discover:async(t,n)=>{n.throwIfAborted();for(let r of e){if(!A(r,t.leaseProvider))continue;let e=await r.deviceInventoryProvider(t,n);if(n.throwIfAborted(),e!=null)return{kind:`inventory`,devices:e}}return{kind:`declined`}}}}function Be(e){let t=new Set;for(let n of e){if(t.has(n.provider))throw TypeError(`Duplicate provider device runtime: ${n.provider}`);t.add(n.provider)}}async function Ve(e,t){for(let n of e){if(!A(n,t.provider))continue;let e=await n.cloudArtifacts?.listCloudArtifacts?.(t);if(e)return e}}async function k(e,t,n,r){for(let i of e){if(!A(i,n.leaseProvider))continue;let e=i.leaseLifecycle[t],a=e?await e(n,r):void 0;if(a)return a}}function A(e,t){return e.provider===t}function j(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:m(n)})}const He=`device_inventory_context_unavailable`,Ue=new w;async function We(e,t){return await Ue.run(e,t)}async function Ge(e){return await Je(`providerFirst`,e)}async function Ke(e){let t=Ye(),n=await t.providerFirst.discoverWithSource(e,t.requestScope);return{devices:n.devices.map(e=>({...e})),source:n.source}}async function qe(e){return await Je(`localOnly`,e)}async function Je(e,t){let n=Ye();return(await n[e].discover(t,n.requestScope)).map(e=>({...e}))}function Ye(){let t=Ue.getStore();if(!t)throw new e(`COMMAND_FAILED`,`Device inventory gateway is unavailable outside request execution`,{reason:He});return t}function Xe(t){return be(t)||t instanceof e&&t.code===`COMMAND_FAILED`&&t.details?.reason===He?!0:t instanceof Error&&t.name===`AbortError`}const M=new w;async function Ze(t,n,r){let i=await Qe(t,n,r);if(i)return i;let a=await et(t,n,r);if(r.allowLocalSimulatorFallback!==!1&&nt(n,a)){let e;try{[e]=await qe({platform:n.platform??`ios`,target:n.target,iosSimulatorSetPath:r.simulatorSetPath,kind:`simulator`})}catch(e){if(Xe(e))throw e}if(e)return e}if(a)return a;throw new e(`DEVICE_NOT_FOUND`,`No devices found`,{selector:n})}async function Qe(t,n,r){let i=r.appleSimulatorAppTarget?.trim();if(!i||N(n)||r.allowLocalSimulatorFallback===!1)return;let a=t.filter(e=>ae(e,n)&&h(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];throw s.length===0?new e(`APP_NOT_INSTALLED`,`No booted iOS simulator has ${i} installed`,{appTarget:i,...$e(a),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,...$e(s),hint:`Pass --udid to select the intended simulator explicitly.`})}function $e(e){return{devices:e.map(e=>({id:e.id,name:e.name}))}}async function et(e,t,n){try{return await ie(e,t,n)}catch(e){if(tt(e,t))return;throw e}}function tt(t,n){return!N(n)&&t instanceof e&&t.code===`DEVICE_NOT_FOUND`}function nt(e,t){return!N(e)&&(!e.platform||e.platform===`apple`||e.platform===`ios`)&&e.target!==`desktop`&&(!t||t.kind===`device`)}function N(e){return!!(e.udid||e.serial||e.deviceName)}async function rt(e,t={}){let n=it(e),{iosSimulatorSetPath:r,...i}=n,a=ut(n,t),o={simulatorSetPath:r,allowStoppedAndroidAvdPlaceholders:t.allowStoppedAndroidAvdPlaceholders},s={platform:n.platform,target:e.target,cacheHit:!1};return await _e(`resolve_target_device`,async()=>{let e=ct(a);if(e)return s.cacheHit=!0,e;let c=await Ke(n),l=[...c.devices];return st(i)?lt(a,await Ze(l,i,{simulatorSetPath:r,allowLocalSimulatorFallback:c.source===`local`||n.leaseProvider===void 0,appleSimulatorAppTarget:t.appleSimulatorAppTarget})):lt(a,await ie(l,i,o))},s)}function it(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=se({simulatorSetPath:Ce(t.iosSimulatorDeviceSet),platform:n,target:t.target}),i=Se(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 at(e){return M.getStore()?await e():await M.run(new Map,e)}function ot(e){return v(e.platform)}function st(e){return ot(e)}function ct(e){let t=M.getStore()?.get(e);if(t)return{...t}}function lt(e,t){return M.getStore()?.set(e,{...t}),t}function ut(e,t){let{appleSimulatorAppTarget:n,...r}=t;return JSON.stringify({request:e,options:r})}const P=new Map;function dt(e){for(let t of e.platforms){if(P.has(t))throw Error(`PlatformPlugin already registered for platform "${t}"`);P.set(t,e)}}function ft(t){let n=P.get(t);if(!n)throw new e(`UNSUPPORTED_PLATFORM`,`Unsupported platform: ${t}`);return n}function F(e){return P.get(e)}const I={appAndDeviceLifecycle:!0,keyboard:!0,orientation:!0,physicalDeviceSurfaces:!1},pt={ios:I,ipados:I,visionos:{appAndDeviceLifecycle:!0,keyboard:!0,orientation:!0,physicalDeviceSurfaces:!1},tvos:{appAndDeviceLifecycle:!0,keyboard:!1,orientation:!1,physicalDeviceSurfaces:!1},macos:{appAndDeviceLifecycle:!1,keyboard:!1,orientation:!1,physicalDeviceSurfaces:!0},watchos:{appAndDeviceLifecycle:!1,keyboard:!1,orientation:!1,physicalDeviceSurfaces:!1}};function L(e){return v(e.platform)?pt[oe(e)]:void 0}const R=e=>{let t=L(e);return t?t.appAndDeviceLifecycle:!0},z=e=>e.platform!==`apple`||e.kind!==`device`||e.iosPhysicalDeviceBackend!==`xctest`,B=e=>R(e)&&z(e),mt=e=>{let t=L(e);return t?t.keyboard:e.platform===`android`},ht=e=>{let t=L(e);return t?t.orientation:e.platform===`android`},V=e=>{let t=L(e);return t&&t.physicalDeviceSurfaces||e.kind===`simulator`},gt=e=>e.platform===`android`||e.platform===`apple`&&oe(e)===`ios`||V(e),_t=e=>e.platform===`android`?e.target===`tv`:_(e),vt={[y.boot]:R,[y.apps]:z,[y.install]:B,[y.reinstall]:B,[y.installFromSource]:B,[y.perf]:z,[y.record]:z,[y.push]:R,[y.home]:R,[y.appSwitcher]:R,[y.clipboard]:e=>e.platform===`android`||e.platform===`linux`||V(e),[y.keyboard]:mt,[y.orientation]:ht,[y.tvRemote]:_t,[y.alert]:gt,[y.settings]:e=>e.platform===`android`||V(e),[y.audio]:te},yt={[y.apps]:H,[y.install]:H,[y.reinstall]:H,[y.installFromSource]:H,[y.perf]:H,[y.record]:H,[y.viewport]:e=>e.platform===`apple`?`viewport resizes web targets only (--platform web). Apple screen geometry is fixed by the selected simulator or device type — open a different simulator to test another screen size.`:void 0,[y.tvRemote]:e=>e.platform===`android`?e.target===`tv`?void 0:`tv-remote is supported only on Android TV targets.`:L(e)?_(e)?void 0:`tv-remote is supported only on tvOS devices.`:void 0};function H(e){if(!z(e))return`This command requires a CoreDevice-backed physical iOS device. The selected XCTest backend supports open, close, interactions, snapshots, and screenshots.`}const bt={id:`apple`,platforms:[`apple`],familySelector:`apple`,capability:{bucket:`apple`,supportsByDefault:vt,unsupportedHintByDefault:yt},perf:{supportsMetrics:()=>!0,metricsSamplerTag:()=>`apple`},recording:{resolveBackendTag:e=>g(e)?`macos`:e.kind===`device`?`ios-device`:`ios-simulator`},providers:{platformGatedResolvers:[`appleRunnerProvider`,`appleToolProvider`]},createInteractor:async(e,t)=>{let{createAppleInteractor:n}=await import(`./interactor.js`);return n(e,t)}},xt=[y.open,y.close,y.back,y.home,y.tvRemote],St=e=>e.target===`tv`,Ct=e=>e.kind===`emulator`&&St(e),wt={id:`vega`,platforms:[`vega`],capability:{bucket:`vega`,supportsByDefault:Object.fromEntries(xt.map(e=>[e,St])),unsupportedHintByDefault:Object.fromEntries(xt.map(e=>[e,t=>Ct(t)?void 0:`${e} currently supports only Vega Virtual Devices.`]))},providers:{platformGatedResolvers:[`vegaToolProvider`]},createInteractor:async(e,t)=>{let{createVegaInteractor:n}=await import(`./interactor2.js`);return n(e,t)}},Tt=[bt,{id:`android`,platforms:[`android`],capability:{bucket:`android`,supportsByDefault:{[y.audio]:te,[y.tvRemote]:e=>e.target===`tv`},unsupportedHintByDefault:{[y.tvRemote]:e=>e.target===`tv`?void 0:`tv-remote is supported only on Android TV targets.`}},perf:{supportsMetrics:()=>!0,metricsSamplerTag:()=>`android`},recording:{resolveBackendTag:()=>`android`},providers:{platformGatedResolvers:[`androidAdbProvider`]},createInteractor:async(e,t)=>{let{createAndroidInteractor:n}=await import(`./android.js`).then(e=>e.t);return n(e,void 0,t)}},{id:`harmonyos`,platforms:[`harmonyos`],capability:{bucket:`harmonyos`},perf:{supportsMetrics:()=>!0,metricsSamplerTag:()=>`harmonyos`},recording:{resolveBackendTag:e=>e.kind===`device`?`harmonyos`:`unsupported`},createInteractor:async(e,t)=>{let{createHarmonyInteractor:n}=await import(`./harmonyos.js`);return n(e,t)}},wt,{id:`linux`,platforms:[`linux`],capability:{bucket:`linux`},providers:{platformGatedResolvers:[`linuxToolProvider`]},createInteractor:async()=>{let{createLinuxInteractor:e}=await import(`./linux.js`);return e()}},{id:`web`,platforms:[`web`],capability:{bucket:`web`},recording:{resolveBackendTag:()=>`web`},providers:{platformGatedResolvers:[`webProvider`]},createInteractor:async()=>{let{createWebInteractor:e}=await import(`./web.js`);return e()}}];let Et=!1;function U(){if(!Et){for(let e of Tt)dt(e);Et=!0}}U();const Dt={device:!0},Ot={emulator:!0,device:!0},kt={device:!0},At=new Set(`open.perf.close.back.apps.appstate.app-switcher.click.fill.find.focus.get.home.gesture.install.keyboard.is.longpress.press.reinstall.screenshot.scroll.settings.snapshot.swipe.type.wait`.split(`.`)),jt=[`open`,`close`],Mt=[`record`],Nt=[`audio`,`find`,`get`,`is`,`screenshot`,`snapshot`,`wait`],Pt=[`click`,`fill`,`focus`,`press`,`scroll`,`type`],Ft=[`viewport`],It=new Set([...jt,...Mt,...Nt,...Pt,...Ft]),Lt=Rt(ne(re));function Rt(e){let t={};for(let[n,r]of Object.entries(e))t[n]=At.has(n)?{...r,harmonyos:Ot}:n===`record`?{...r,harmonyos:kt}:r;return zt(t)}function zt(e){let t={};for(let[n,r]of Object.entries(e))t[n]=It.has(n)?{...r,web:Dt}:r;for(let t of It)if(!(t in e))throw Error(`Web command "${t}" missing from capability matrix`);return t}function Bt(e,t){let n=Lt[e];if(!n)return!0;let r=F(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 Vt(e,t){return F(t.platform)?.capability.unsupportedHintByDefault?.[e]?.(t)}function Ht(){return re.filter(e=>`capability`in e&&e.capability!==void 0||e.platformExecution.kind===`device-runtime`).map(e=>e.name).sort()}function Ut(e){let t=Lt[e];if(!t)return[];let n=[`apple`,`android`,`harmonyos`,`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 Wt(e,t){if(e.intent===`drag`){Gt(e,t);return}if(t.platform===`web`||t.appleOs===`watchos`)throw G(e,W(e,t));if(qt(e)){Jt(e,t);return}if(t.appleOs===`visionos`)throw G(e,W(e,t));if(e.intent===`fling`&&`direction`in e&&t.platform===`linux`)throw G(e,`gesture fling is not supported on Linux`)}function Gt(e,t){if(!Kt(t))throw G(e,W(e,t),`Target-authored drag requires an adapter that preserves source hold, timed movement, and destination hold; it is supported on Android touch devices and iOS/iPadOS.`)}function Kt(e){return e.platform===`android`?e.target!==`tv`:e.platform===`apple`?e.appleOs===void 0?e.target!==`desktop`&&e.target!==`tv`:e.appleOs===`ios`||e.appleOs===`ipados`:!1}function qt(e){return e.intent===`pan`?(`pointerCount`in e?e.pointerCount:1)===2:e.intent===`pinch`||e.intent===`rotate`||e.intent===`transform`}function Jt(e,t){if(t.platform===`android`){if(t.target!==`tv`)return;throw G(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 G(e,W(e,t));ee(t,e.intent)}function W(e,t){return`gesture ${e.intent} is not supported on ${t.appleOs??t.platform}`}function G(t,n,r){return new e(`UNSUPPORTED_OPERATION`,n,{gesture:t.intent,...r?{hint:r}:{}})}const Yt=`No active session. Run open first.`;function Xt(e,t,n){return{ok:!1,error:{code:e,message:t,...n?{details:n}:{}}}}function Zt(){return Xt(`SESSION_NOT_FOUND`,Yt)}function Qt(e,t,n){if(Bt(e,t))return null;let r=n?.hint?Vt(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}$/,en=8*1024,tn=4*1024;function nn(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:an(r,n)}}function rn(t,n,r){let i=m(t),a=on(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>tn)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:tn});return s}function an(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`)>en)throw new e(`INVALID_ARGS`,`trigger-app-event payload for "${n}" exceeds ${en} bytes`);return r}catch(n){throw n instanceof e?n:new e(`INVALID_ARGS`,`Invalid trigger-app-event payload JSON: ${t}`)}}function on(e){return((h(e)?process.env.AGENT_DEVICE_IOS_APP_EVENT_URL_TEMPLATE:g(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}function sn(e){let t=e?e.textEntryReadiness:void 0,n=fn(t)?{textEntryReadiness:t}:{},r=cn(e);return r?{...n,...r}:n}function cn(e){if(!ln(e))return null;let t=un(e.target);return t?{verification:`unconfirmed`,requested:e.requested,before:e.before,after:e.after,target:t}:null}function ln(e){return!!(e&&e.verification===`unconfirmed`&&typeof e.requested==`string`&&K(e.before)&&K(e.after))}function un(e){if(!mn(e)||!dn(e))return null;let t=pn(e.rect);return t?{resourceId:e.resourceId,className:e.className,packageName:e.packageName,rect:t}:null}function dn(e){return K(e.resourceId)&&K(e.className)&&K(e.packageName)}function fn(e){return typeof e==`string`&&i.includes(e)}function K(e){return e===null||typeof e==`string`}function pn(e){return!mn(e)||![e.x,e.y,e.width,e.height].every(e=>typeof e==`number`)?null:e}function mn(e){return!!e&&typeof e==`object`}const q=[[0,0],[1,0],[0,1],[-1,0],[0,-1],[1,1],[-1,1],[1,-1],[-1,-1]];function hn(e,t){return v(e.platform)&&t>1}function gn(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 _n(e,t){if(t<=0)return[0,0];let[n,r]=q[e%q.length];return[n*t,r*t]}async function vn(e,t,n){for(let r=0;r<e;r+=1)await n(r),r<e-1&&t>0&&await ye(t)}async function yn(e,t){let{x:n,y:r}=J(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,...x(`Long pressed (${n}, ${r})`)}}async function bn(e,t){let{x:n,y:r}=J(t,`focus requires x y`);return await e.focus(n,r),{x:n,y:r,...x(`Focused (${n}, ${r})`)}}async function xn(t,n,r){let i=Kn(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=S(r?.delayMs??0,`delay-ms`,0,1e4),s=(await t.type(a,o))?.textEntryRoute;return{...s===void 0?{}:{textEntryRoute:s},text:a,delayMs:o,...x(Z(`Typed`,a))}}async function Sn(t,n,r){if(r?.directElementSelector)return await Cn(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=S(r?.delayMs??0,`delay-ms`,0,1e4),c=await t.fill(i,a,o,s,{allowNonHittableCoordinateFallback:r?.allowNonHittableCoordinateFallback===!0});return{x:i,y:a,text:o,delayMs:s,...c?.maestroNonHittableCoordinateFallbackUsed===!0?{maestroNonHittableCoordinateFallbackUsed:!0}:{},...sn(c),...x(Z(`Filled`,o))}}async function Cn(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=S(i.delayMs??0,`delay-ms`,0,1e4),s=await t.fillElementSelector(n,a,o);return{selector:n.raw,text:a,delayMs:o,...s??{},...x(Z(`Filled`,a))}}async function wn(e,t,n,r){if(r?.directElementSelector&&h(e))return await Tn(t,r.directElementSelector);let{x:i,y:a}=J(n,`press requires x y`);if(g(e)&&r?.surface&&r.surface!==`app`)return await En(i,a,r);let o=c(r);if(o!==`primary`)return await Dn(e,i,a,o,r);let s=An(r);return jn(s),hn(e,s.count)?await Nn(e,i,a,s,r):await In(t,i,a,s)}async function Tn(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??{},...x(i?o:`Tapped ${n.raw}`)}}function J(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 En(t,n,r){let i=c(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,...x(X({x:t,y:n}))}}async function Dn(e,t,n,r,i){if(On(e,r,i),e.platform===`linux`)return await kn(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},Ln(i)),{x:t,y:n,button:r,...x(X({x:t,y:n,button:r}))}}function On(e,t,n){let r=s({commandLabel:`click`,platform:m(e),button:t,count:n?.count,intervalMs:n?.intervalMs,holdMs:n?.holdMs,jitterPx:n?.jitterPx,doubleTap:n?.doubleTap});if(r)throw r}async function kn(e,t,n){if(n===`secondary`){let{rightClickLinux:n}=await import(`./input-actions3.js`);await n(e,t)}else{let{middleClickLinux:n}=await import(`./input-actions3.js`);await n(e,t)}return{x:e,y:t,button:n,...x(X({x:e,y:t,button:n}))}}function An(e){return{count:Y(e?.count,1,`count`,1,200),intervalMs:Y(e?.intervalMs,0,`interval-ms`,0,1e4),holdMs:Y(e?.holdMs,0,`hold-ms`,0,1e4),jitterPx:Y(e?.jitterPx,0,`jitter-px`,0,100),doubleTap:!!e?.doubleTap}}function Y(e,t,n,r,i){return S(e===void 0?t:e,n,r,i)}function jn({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 Mn(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=gn(t,i),c,l,u=0,d=[],f=0;for(let t of s){let i=await r(e,a(t,n?.appBundleId),Ln(n));c??=i,l=i;let s;try{s=o(i)}catch(e){throw Fn(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 Nn(e,t,n,r,i){let a=await Mn(e,Pn(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,...x(X({x:t,y:n}))}}function Pn(e,t,n,r){let i=r.doubleTap?`doubleTap`:r.holdMs>0?`longPress`:`tap`,a=i===`tap`&&h(e)&&!_(e);return Array.from({length:r.count},(e,o)=>{let[s,c]=_n(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 Fn(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 In(e,t,n,r){let i;return await vn(r.count,r.intervalMs,async a=>{let[o,s]=_n(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}}),b({x:t,y:n,count:r.count,intervalMs:r.intervalMs,holdMs:r.holdMs,jitterPx:r.jitterPx,doubleTap:r.doubleTap,...i},X({x:t,y:n}))}function Ln(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 Rn(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`);zn(a,o,s);let c=Wn(i),l={amount:a,pixels:o,durationMs:s},{interactionResult:u,completedPasses:d}=await Vn(t,r,c,l);return b(Hn(c,l,d,u),de(c.direction,c.edge,d,a,o))}function zn(e,n,i){Bn(e),r(i),t({amount:e,pixels:n})}function Bn(t){if(t!==void 0&&!Number.isFinite(t))throw new e(`INVALID_ARGS`,`scroll amount must be a number`)}async function Vn(e,t,n,r){if(n.edge){let i=n.edge,a=await pe({edge:i,captureState:async n=>await Un(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 Hn(e,t,n,r){let i=l(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 Un(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 ue({edge:r,scope:i,captureNodes:async e=>(await a({appBundleId:n?.appBundleId,scope:e})).nodes??[]})}function Wn(e){return e===`bottom`?{direction:`down`,edge:`bottom`}:e===`top`?{direction:`up`,edge:`top`}:{direction:d(e)}}async function Gn(e,t,n){let{x:r,y:i}=J(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(g(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 Kn(e){return ge(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 qn(e){let t=e.trim();return t.startsWith(`{`)&&t.endsWith(`}`)||t.startsWith(`[`)&&t.endsWith(`]`)}function Jn(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(qn(i))return{kind:`inline`,text:i};throw new e(`INVALID_ARGS`,`${r} file not found: ${a}`)}async function Yn(t){let n=Jn(t,{subject:`Push payload`}),r=n.kind===`inline`?n.text:await Xn(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 Xn(t){try{return await T.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)})}}U();async function Q(t,n){if(D(t)){let r=Oe(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:m(t)})}return await ft(t.platform).createInteractor(t,n)}async function Zn(e,t,n,r,i){let a=$(i),o=await Q(e,a);return C({level:`debug`,phase:`platform_command_prepare`,data:{command:t,platform:e.platform,kind:e.kind}}),await _e(`platform_command`,async()=>await tr(e,o,t,n,r,i,a),{command:t,platform:e.platform})}async function Qn(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 $n(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 er={open:({device:e,interactor:t,positionals:n,context:r})=>nr(e,t,n,r),close:async({device:e,interactor:t,positionals:n})=>{let r=n[0];return r?(await t.close(r),{app:r,...x(`Closed: ${r}`)}):(e.platform===`web`&&await t.close(``),{closed:`session`,...x(`Closed session`)})},press:({device:e,interactor:t,positionals:n,context:r})=>wn(e,t,n,r),longpress:({interactor:e,positionals:t})=>yn(e,t),focus:({interactor:e,positionals:t})=>bn(e,t),type:({interactor:e,positionals:t,context:n})=>xn(e,t,n),fill:({interactor:e,positionals:t,context:n})=>Sn(e,t,n),scroll:({interactor:e,positionals:t,context:n})=>Rn(e,t,n),"trigger-app-event":({device:e,interactor:t,positionals:n,context:r})=>rr(e,t,n,r),screenshot:({interactor:e,positionals:t,outPath:n,context:r})=>ir(e,t,n,r),viewport:({interactor:e,positionals:t})=>ar(e,t),back:async({interactor:e,context:t})=>(await e.back(t?.backMode),{action:`back`,mode:t?.backMode??`in-app`,...x(`Back`)}),home:async({interactor:e})=>(await e.home(),{action:`home`,...x(`Home`)}),orientation:async({interactor:e,positionals:t})=>{let n=he(t[0]),r=(await e.setOrientation(n))?.orientation??n;return{action:`orientation`,orientation:r,...x(`Rotated to ${r}`)}},"app-switcher":async({interactor:e})=>(await e.appSwitcher(),{action:`app-switcher`,...x(`Opened app switcher`)}),clipboard:({interactor:e,positionals:t})=>or(e,t),keyboard:({device:e,positionals:t,context:n,runnerCtx:r})=>cr(e,t,n,r),"tv-remote":({device:e,interactor:t,positionals:n,context:r})=>sr(e,t,n,r),settings:({device:e,interactor:t,positionals:n,context:r})=>pr(e,t,n,r),push:({device:e,positionals:t,context:n})=>vr(e,t,n),snapshot:({interactor:e,context:t})=>yr(e,t),read:({device:e,positionals:t,context:n})=>Gn(e,t,n)};async function tr(t,n,r,i,a,o,s){let c=Object.hasOwn(er,r)?er[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 nr(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,...x(`Opened device`)}}if(s&&(!h(t)||t.kind!==`simulator`))throw new e(`UNSUPPORTED_OPERATION`,le);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(p(a))throw new e(`INVALID_ARGS`,`open <app> <url> requires an app target as the first argument`);if(!p(o))throw new e(`INVALID_ARGS`,`open <app> <url> requires a valid URL target`);if(s)throw new e(`INVALID_ARGS`,ce);return await n.open(a,{activity:i?.activity,appBundleId:i?.appBundleId,launchArgs:c,terminateRunningApp:i?.terminateRunningApp,url:o}),{app:a,url:o,...x(`Opened: ${a}`)}}if(s&&p(a))throw new e(`INVALID_ARGS`,ce);if(i?.clearAppState){if(p(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}:{},...x(`Opened: ${a}`)}}async function rr(e,t,n,r){let{eventName:i,payload:a}=nn(n),o=rn(e,i,a);return await t.open(o,{appBundleId:r?.appBundleId}),{event:i,eventUrl:o,transport:`deep-link`,...x(`Triggered app event: ${i}`)}}async function ir(e,t,r,i){let a=t[0]??r??`./screenshot-${Date.now()}.png`;await T.mkdir(we.dirname(a),{recursive:!0});let o=n(i);return await e.screenshot(a,{appBundleId:i?.appBundleId,pixelDensity:o.pixelDensity,fullscreen:o.fullscreen,normalizeStatusBar:o.normalizeStatusBar,stabilize:o.stabilize,surface:i?.surface,skipIosSimulatorBootCheck:i?.skipIosSimulatorBootCheck,captureBackend:i?.screenshotCaptureBackend}),{path:a,...x(`Saved screenshot: ${a}`)}}async function ar(t,n){if(n.length!==2)throw new e(`INVALID_ARGS`,`viewport requires exactly two arguments: <width> <height>`);let r=fe(n[0],`width`),i=fe(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,...x(`Viewport set: ${r}x${i}`)}}async function or(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,...x(`Clipboard updated`)}}async function sr(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=f(r[0]),o=i?.durationMs===void 0?void 0:S(i.durationMs,`durationMs`,0,1e4);return await n.tvRemote(a,o),{action:`tv-remote`,button:a,...o===void 0?{}:{durationMs:o},...x(`Pressed TV remote ${a}`)}}async function cr(t,n,r,i){let a=(n[0]??`status`).toLowerCase();if(!me(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 ur(t,a);if(t.platform===`harmonyos`)return await lr(t,a);if(h(t))return await dr(t,a,r,i);throw new e(`UNSUPPORTED_OPERATION`,`keyboard is supported only on Android, HarmonyOS, and iOS`)}async function lr(t,n){if(n!==`dismiss`&&n!==`enter`&&n!==`return`)throw new e(`UNSUPPORTED_OPERATION`,`keyboard status/get is not available through the public HarmonyOS HDC API; use keyboard dismiss or enter`);let{pressHarmonyKeyboardKey:r}=await import(`./input-actions2.js`);return await r(t,n===`dismiss`?`Back`:`Enter`),{platform:`harmonyos`,action:n===`dismiss`?`dismiss`:`enter`,...x(n===`dismiss`?`Keyboard dismissed`:`Keyboard enter pressed`)}}async function ur(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`,...x(`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 dr(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,...x(`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),s=typeof o.keyboardDismissMechanism==`string`?o.keyboardDismissMechanism:void 0;return{platform:`ios`,action:`dismiss`,wasVisible:o.wasVisible,dismissed:o.dismissed,visible:o.visible,mechanism:s,...x(fr(o.dismissed===!0,s))}}function fr(e,t){return e?t===`dismissKey`?`Keyboard dismissed via its dismiss key`:`Keyboard dismissed`:`Keyboard already hidden`}async function pr(t,n,r,i){let[a,o,s,c]=r;if(!a||!o&&a!==`clear-app-state`)throw new e(`INVALID_ARGS`,`settings requires setting state`);if(a===`clear-app-state`)return await mr(t,n,o,s,i);if(!o)throw new e(`INVALID_ARGS`,`settings requires setting state`);return await hr(t,n,a,o,s,c,r,i)}async function mr(t,n,r,i,a){let o=(r===`clear`?i:r)??a?.appBundleId;if(!o)throw new e(`INVALID_ARGS`,`settings clear-app-state requires an app id or an active app session.`);C({level:`debug`,phase:`settings_apply`,data:{setting:`clear-app-state`,state:`clear`,appBundleId:o,platform:t.platform}});let s=await n.setSetting(`clear-app-state`,`clear`,o);return s&&typeof s==`object`?b({setting:`clear-app-state`,state:`clear`,...s},br(s)??`Cleared user data for ${o}`):{setting:`clear-app-state`,state:`clear`,...x(`Cleared user data for ${o}`)}}async function hr(e,t,n,r,i,a,o,s){let c=n===`location`&&r===`set`,l=(n===`permission`||c?o[4]:o[2])??s?.appBundleId;C({level:`debug`,phase:`settings_apply`,data:_r(e,n,r,i,a,l,c)});let u=await t.setSetting(n,r,l,gr(n,i,a,c));return u&&typeof u==`object`?b({setting:n,state:r,...u},br(u)??`Updated setting: ${n}`):{setting:n,state:r,...x(`Updated setting: ${n}`)}}function gr(e,t,n,r){if(e===`permission`)return{permissionTarget:t,permissionMode:n};if(r)return{latitude:u(t,`latitude`),longitude:u(n,`longitude`)}}function _r(e,t,n,r,i,a,o){return o?{setting:t,state:n,latitude:r,longitude:i,platform:e.platform}:t===`permission`?{setting:t,state:n,permissionTarget:r,permissionMode:i,platform:e.platform}:{setting:t,state:n,appBundleId:a,platform:e.platform}}async function vr(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 Yn(a);if(h(t)){let{pushIosNotification:e}=await import(`./apps.js`).then(e=>e.t);return await e(t,i,o),{platform:`ios`,bundleId:i,...x(`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,...x(`Pushed notification to ${i}`)}}async function yr(e,t){let n=t??{};return await e.snapshot({appBundleId:n.appBundleId,signal:n.signal,interactiveOnly:n.snapshotInteractiveOnly,preferredBackend:n.snapshotPreferredBackend,depth:n.snapshotDepth,scope:n.snapshotScope,raw:n.snapshotRaw,customActions:n.snapshotCustomActions,includeRects:n.snapshotIncludeRects,includeHiddenContentHints:n.snapshotIncludeHiddenContentHints,surface:n.surface})}function br(e){return typeof e.message==`string`&&e.message.length>0?e.message:void 0}function xr(e,t,n,r,i,o){return{requestId:i??ve().requestId,appBundleId:n,runnerLeaseContext:xe({meta:o}),activity:t?.activity,launchConsole:t?.launchConsole,launchArgs:t?.launchArgs,clearAppState:t?.clearAppState,verbose:t?.verbose,logPath:e,traceLogPath:r,iosXctestrunFile:t?.iosXctestrunFile,iosXctestDerivedDataPath:t?.iosXctestDerivedDataPath,iosXctestEnvDir:t?.iosXctestEnvDir,screenshotCaptureBackend:t?.maestro?.screenshotCaptureBackend,snapshotInteractiveOnly:t?.snapshotInteractiveOnly,snapshotPreferredBackend:t?.snapshotPreferredBackend,snapshotDepth:t?.snapshotDepth,snapshotScope:t?.snapshotScope,snapshotRaw:t?.snapshotRaw,snapshotCustomActions:t?.snapshotCustomActions,snapshotIncludeHiddenContentHints:t?.snapshotIncludeHiddenContentHints,...a(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:c(t),backMode:t?.backMode,pauseMs:t?.pauseMs,pattern:t?.pattern}}export{je as C,D,Ae as E,We as S,ke as T,rt as _,Jn as a,qe as b,Zt as c,Ht as d,Wt as f,it as g,F as h,$n as i,Qt as l,U as m,Zn as n,Yt as o,Ut as p,Qn as r,Xt as s,xr as t,Bt as u,at as v,Me as w,Xe as x,Ge as y};
|
package/dist/src/provider.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{o as e}from"./png-worker-contract.js";import{_ as t}from"./sdk-contracts.js";import{W as n,tr as r}from"./sdk-batch-runner.js";import{A as i,_ as a,f as o}from"./sdk-android-adb.js";import{t as s}from"./timeouts.js";import{c}from"./tool-provider.js";import{i as l,n as ee,o as te,r as ne}from"./agent-browser-tool.js";function u(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function d(e,t){return u(e)?e[t]:void 0}function f(e,t){let n=d(e,t);return typeof n==`string`?n:void 0}function re(e,t){let n=d(e,t);return typeof n==`boolean`?n:void 0}function p(e,t){let n=e[t];return typeof n==`number`&&Number.isFinite(n)?n:void 0}const ie=[h,g,_,v,y,b,x,S,C,w,T,E,D,O,k,A,j];function ae(e){let t=ie.map(e=>`${e.toString()};`).join(``),n=se(e.action),r=m(e.durationMs),i=m(e.bucketMs);return`(()=>{${t}return ${j.name}({action:${n},durationMs:${r},bucketMs:${i}})})()`}function oe(e){let t=n(ce(e),{source:`media-elements`,backend:`agent-browser`,durationMs:0,elapsedMs:0,bucketMs:1e3,activeFallback:!1,mediaElementCount:0,sourceCount:0});return{...t,source:`media-elements`,mediaElementCount:t.mediaElementCount??0}}function se(e){switch(e){case`start`:return`'start'`;case`stop`:return`'stop'`;default:return`'status'`}}function m(e){return e===void 0||!Number.isFinite(e)?`undefined`:String(Math.trunc(e))}function h(e){return!Number.isFinite(e)||e<=0?-90:Math.max(-90,Math.min(0,Math.round(20*Math.log10(e))))}function g(e,t){e.notes.includes(t)||e.notes.push(t)}function _(){return Array.from(document.querySelectorAll(`audio,video`))}function v(e,t){if(!e||e.state===`stopped`)return e;clearInterval(e.timer),clearTimeout(e.timeout),e.timer=void 0,e.timeout=void 0,e.state=`stopped`,e.active=!1,e.reason=t,e.stoppedAt=Date.now();for(let t of e.analysers)try{t.analyser.disconnect(),t.source.disconnect(),t.audible&&t.source.connect(e.context.destination)}catch{}if(e.resumeOnGesture){for(let t of[`click`,`pointerdown`,`keydown`])window.removeEventListener(t,e.resumeOnGesture,!0);e.resumeOnGesture=void 0}return e}function y(e){let t=window.AudioContext||window.webkitAudioContext;if(!t)return;let n=window[e];if(n&&n.state!==`closed`)return n;let r=new t;return window[e]=r,r}function b(e,t,n){if(!(!t.currentSrc&&!t.src&&t.readyState===0))try{window[n]||(window[n]=new WeakMap);let r=window[n].get(t);return r||(r=e.context.createMediaElementSource(t),window[n].set(t,r)),r.disconnect(),{source:r,audible:!0}}catch{return}}function x(e,t){if(!(!t||typeof t.getAudioTracks!=`function`)&&t.getAudioTracks().length!==0)return{source:e.context.createMediaStreamSource(t),audible:!1}}function S(e,t){if(typeof t.captureStream==`function`)return x(e,t.captureStream())}function C(e,t){let n=e.context.createAnalyser();n.fftSize=2048,t.source.connect(n),n.connect(t.audible?e.context.destination:e.sink),e.analysers.push({...t,analyser:n,buffer:new Float32Array(n.fftSize)})}function w(e,t){let n=_();e.mediaElementCount=n.length;for(let r of n){if(e.seen.has(r))continue;let n=x(e,r.srcObject)??S(e,r)??b(e,r,t);if(!n){g(e,`Some media elements do not expose capturable audio to Web Audio.`);continue}e.seen.add(r),C(e,n)}e.sourceCount=e.analysers.length,e.sourceCount===0&&g(e,`No capturable page media audio sources were found yet.`)}function T(e){let t=0,n=0,r=0;for(let i of e.analysers){i.analyser.getFloatTimeDomainData(i.buffer);for(let e of i.buffer)t+=e*e,n+=1,r=Math.max(r,Math.abs(e))}return{rms:n>0?Math.sqrt(t/n):0,peak:r}}function E(e){let t=Math.ceil(e.durationMs/e.bucketMs)+2;e.rmsDbfs.length>t&&e.rmsDbfs.splice(0,e.rmsDbfs.length-t),e.peakDbfs.length>t&&e.peakDbfs.splice(0,e.peakDbfs.length-t)}function D(e,t){if(!e||e.state!==`running`)return;w(e,t);let n=T(e),r=h(n.rms),i=h(n.peak);e.rmsDbfs.push(r),e.peakDbfs.push(i),e.heard=e.heard||r>-90||i>-90,E(e),Date.now()-e.startedAt>=e.durationMs&&v(e,`duration`)}function O(e,t){return{audio:`probe`,state:`stopped`,active:!1,heard:!1,source:`media-elements`,backend:`agent-browser`,durationMs:Number(e.durationMs)||1e4,elapsedMs:0,bucketMs:Number(e.bucketMs)||1e3,sampleCount:0,mediaElementCount:_().length,sourceCount:0,rmsDbfs:[],peakDbfs:[],notes:t}}function k(e,t,n,r){return e?{audio:`probe`,state:e.state,active:e.state===`running`,heard:e.heard,source:`media-elements`,backend:`agent-browser`,durationMs:e.durationMs,elapsedMs:Math.max(0,Math.min((e.stoppedAt||Date.now())-e.startedAt,e.durationMs)),bucketMs:e.bucketMs,sampleCount:e.rmsDbfs.length,mediaElementCount:_().length,sourceCount:e.sourceCount,rmsDbfs:e.rmsDbfs.slice(),peakDbfs:e.peakDbfs.slice(),startedAt:new Date(e.startedAt).toISOString(),stoppedAt:e.stoppedAt?new Date(e.stoppedAt).toISOString():void 0,reason:e.reason,notes:[n,r,...e.notes]}:O(t,[n,r])}function A(e,t,n,r,i,a,o){t&&v(t,`restarted`);let s=y(r);if(!s)return O(e,[`Web Audio API is not available in this browser context.`]);let c=s.createGain();c.gain.value=0,c.connect(s.destination);let l={state:`running`,active:!0,context:s,sink:c,seen:new WeakSet,analysers:[],mediaElementCount:0,sourceCount:0,durationMs:Math.max(100,Number(e.durationMs)||1e4),bucketMs:Math.max(100,Number(e.bucketMs)||1e3),startedAt:Date.now(),stoppedAt:void 0,reason:void 0,heard:!1,rmsDbfs:[],peakDbfs:[],notes:[]};try{s.resume()}catch{g(l,`AudioContext could not be resumed by the probe.`)}l.resumeOnGesture=()=>{try{s.resume()}catch{g(l,`AudioContext could not be resumed from a user gesture.`)}};for(let e of[`click`,`pointerdown`,`keydown`])window.addEventListener(e,l.resumeOnGesture,{capture:!0,once:!0});return w(l,i),l.timer=setInterval(()=>D(l,i),l.bucketMs),l.timeout=setTimeout(()=>v(l,`duration`),l.durationMs),window[n]=l,k(l,e,a,o)}function j(e){let t=`__agentDeviceAudioProbe`,n=`__agentDeviceAudioProbeSources`,r=`Audio probe samples HTML media elements exposed to Web Audio; it is not whole-tab or system audio capture.`,i=`URL-backed media elements may be routed through the probe AudioContext while they are observed.`,a=window[t];return a&&a.state===`running`&&Date.now()-a.startedAt>=a.durationMs&&(D(a,n),v(a,`duration`)),e.action===`start`?A(e,a,t,`__agentDeviceAudioProbeContext`,n,r,i):e.action===`stop`?(a&&D(a,n),v(a,`manual`),k(a,e,r,i)):(a&&D(a,n),k(a,e,r,i))}function ce(e){return u(e)?u(e.result)?e.result:e:{}}function le(e,t={}){let n=ue(e),r=me(t.limit),i=t.include===`headers`||t.include===`all`,a=n.slice(-r).reverse().map(e=>fe(e,i)),o=t.include===`body`||t.include===`all`?[`agent-browser network requests does not expose request or response bodies.`]:void 0;return{entries:a,backend:`agent-browser`,redacted:!1,...o?{notes:o}:{}}}function ue(e){let t=u(e)&&Array.isArray(e.requests)?e.requests:e;return Array.isArray(t)?t.filter(de).map(e=>({headers:M(e.headers),method:f(e,`method`),mimeType:f(e,`mimeType`),requestId:f(e,`requestId`),resourceType:f(e,`resourceType`),responseHeaders:M(e.responseHeaders),status:p(e,`status`),timestamp:pe(e.timestamp),url:f(e,`url`)})):[]}function de(e){return u(e)}function fe(e,t){let n=e.timestamp===void 0?void 0:N(e.timestamp),i=r({requestId:e.requestId,resourceType:e.resourceType,mimeType:e.mimeType});return r({timestamp:n,method:e.method,url:e.url,status:e.status,requestHeaders:t?e.headers:void 0,responseHeaders:t?e.responseHeaders:void 0,metadata:Object.keys(i).length>0?i:void 0})}function M(e){if(!u(e))return;let t={};for(let[n,r]of Object.entries(e))typeof r==`string`&&(t[n]=r);return Object.keys(t).length>0?t:void 0}function pe(e){if(typeof e==`number`||typeof e==`string`)return e}function N(e){if(typeof e==`string`){let t=Number(e);return Number.isFinite(t)?N(t):e}let t=e>1e10?e:e*1e3,n=new Date(t);return Number.isNaN(n.getTime())?String(e):n.toISOString()}function me(e){return typeof e!=`number`||!Number.isInteger(e)?25:Math.max(1,Math.min(e,200))}async function he(e,t){let n=P(f(e,`snapshot`)??``,L(d(e,`refs`)));return t&&await ge(n,t),{nodes:n.map((e,t)=>({...e.node,index:t})),truncated:re(e,`truncated`)}}async function ge(e,t){for(let n=0;n<e.length;n+=8){let r=e.slice(n,n+8),i=await Promise.all(r.map(e=>t(e.ref)));for(let[e,t]of i.entries())t&&(r[e].node.rect=t)}}function P(e,t){let n=new Map(t.map(e=>[e.ref,e])),r=[],i=new Set,a=new Map;for(let t of e.split(/\r?\n/)){let e=ye(t);if(!e)continue;i.add(e);let o=n.get(e)?.data,s=_e(t),c=F(t,o,s),l=ve(a,s);l!==void 0&&(c.parentIndex=l),r.push({ref:e,node:{...c,index:r.length}}),a.set(s,r.length-1)}for(let e of t)i.has(e.ref)||r.push({ref:e.ref,node:{...I(e.data),index:r.length}});return r}function F(e,t,n){let r=be(e)??z(t,[`role`,`type`]);return{index:0,type:r,role:r,label:xe(e)??z(t,[`label`,`name`,`text`]),value:Se(e)??z(t,[`value`]),depth:n,enabled:B(t,[`enabled`]),focused:B(t,[`focused`])}}function I(e){let t=z(e,[`role`,`type`]);return{index:0,type:t,role:t,label:z(e,[`label`,`name`,`text`]),value:z(e,[`value`]),enabled:B(e,[`enabled`]),focused:B(e,[`focused`])}}function L(e){return Array.isArray(e)?e.flatMap(e=>{let t=u(e)?e:void 0,n=R(z(t,[`ref`,`id`])??String(e));return n?[{ref:n,data:t}]:[]}):u(e)?Object.entries(e).flatMap(([e,t])=>{let n=R(e);return n?[{ref:n,data:u(t)?t:void 0}]:[]}):[]}function _e(e){let t=e.match(/^\s*/)?.[0].length??0;return Math.floor(t/2)}function ve(e,t){for(let n=t-1;n>=0;--n){let t=e.get(n);if(t!==void 0)return t}}function ye(e){return R(e.match(/\bref=['"]?(@?e\d+)['"]?/i)?.[1]??e.match(/@?(e\d+)\b/i)?.[1])}function R(e){let t=e?.trim().replace(/^@/,``);return t&&/^e\d+$/i.test(t)?t.toLowerCase():null}function be(e){return e.replace(/\[[^\]]*ref[^\]]*\]/gi,``).replace(/@?e\d+\b/gi,``).replace(/^[\s|├└─>*-]+/g,``).trim().match(/^([A-Za-z][\w-]*)\b/)?.[1]}function xe(e){return e.match(/"([^"]+)"/)?.[1]??e.match(/'([^']+)'/)?.[1]}function Se(e){return Ce(e)??e.match(/\bvalue=(?:"([^"]*)"|'([^']*)'|([^\s\]]+))/i)?.slice(1).find(V)??e.match(/\bvalue:\s*(?:"([^"]*)"|'([^']*)'|([^\s\]]+))/i)?.slice(1).find(V)}function Ce(e){return e.match(/\]\s*:\s*(.+)$/)?.[1]?.trim()||void 0}function z(e,t){if(e)for(let n of t){let t=e[n];if(typeof t==`string`&&t.length>0)return t}}function B(e,t){if(e)for(let n of t){let t=e[n];if(typeof t==`boolean`)return t}}function V(e){return typeof e==`string`}const H=`agent-browser`,U="Run `agent-device web setup` to install the managed web backend.";function W(e={}){let t=e.session?.trim(),n=async(n,r)=>await Ne(n,{session:t,options:e,signal:r});return{async open(e){await n([`open`,e])},async close(){await n([`close`])},async startRecording(e){await n([`record`,`start`,e])},async stopRecording(){await n([`record`,`stop`])},async snapshot(e){return await ke(t=>n(t,e?.signal),e)},async screenshot(e,t){await n([`screenshot`,...t?.fullscreen?[`--full`]:[],e])},async setViewport(e,t){await n([`set`,`viewport`,String(e),String(t)])},async click(e,t){await G(n,e,t)},async clickRef(e){await n([`click`,q(e)])},async fill(e,t,r){await G(n,e,t),await n([`press`,Ve()]),await n([`keyboard`,`type`,r])},async fillRef(e,t){await n([`fill`,q(e),t])},async typeText(e){await n([`keyboard`,`type`,e])},async scroll(e,t){return await we(n,e,t),t?.durationMs===void 0?{}:{durationMs:t.durationMs}},async dumpNetwork(e){return le(await n([`network`,`requests`]),e)},async probeAudio(e){return oe(await n([`eval`,ae(e)]))}}}async function we(e,t,n){let r=Te(n);for(let n of r)await e(Oe(t,n.distance)),n.delayAfterMs>0&&await s(n.delayAfterMs)}function Te(e){let t=e?.pixels??e?.amount,n=e?.durationMs;if(n===void 0||n<=0)return[{distance:t,delayAfterMs:0}];let r=Math.max(1,Math.min(20,Math.ceil(n/50))),i=n/Math.max(1,r-1);return Ee(e,r).map((e,t)=>({distance:e,delayAfterMs:t<r-1?i:0}))}function Ee(e,t){let n=e?.pixels??e?.amount??300;return e?.amount!==void 0&&e.pixels===void 0?Array.from({length:t},()=>n/t):De(Math.round(n),t)}function De(e,t){let n=Math.floor(e/t),r=e-n*t;return Array.from({length:t},(e,t)=>t<r?n+1:n)}function Oe(e,t){return[`scroll`,e,...t===void 0?[]:[String(t)]]}async function G(e,t,n){await e([`mouse`,`move`,String(Math.round(t)),String(Math.round(n))]),await e([`mouse`,`down`]),await e([`mouse`,`up`])}async function ke(e,t){return await he(await e(Ae(t)),t?.includeRects?async t=>await je(e,t):void 0)}function Ae(e){return[`snapshot`,...e?.interactiveOnly?[`--interactive`]:[],...e?.raw?[]:[`--compact`],...typeof e?.depth==`number`?[`--depth`,String(e.depth)]:[],...e?.scope?[`--selector`,e.scope]:[]]}async function je(e,t){try{return He(await e([`get`,`box`,q(t)]))}catch(e){if(Me(e))return;throw e}}function Me(e){let t=e instanceof Error?e.message:String(e);return!/\bstale\b/i.test(t)&&/\bbox\b|not visible|not found|no element/i.test(t)}async function Ne(e,t){let{session:n,options:r,signal:i}=t,a=[...e,`--json`,...n?[`--session`,n]:[]],o=await Pe(a,r,i);return Ie(Le(o.stdout,o.stderr,a,o.exitCode),o,a)}async function Pe(e,t,n){let r=``,i=``,o=0;try{await Fe(t);let s=await l({stateDir:t.stateDir}),c=await a(s.command,e,{allowFailure:!0,env:s.env,timeoutMs:3e4,signal:n});r=c.stdout,i=c.stderr,o=c.exitCode}catch(t){throw Re(t,e)}return{stdout:r,stderr:i,exitCode:o}}async function Fe(e){if(!e.openWebSessionNames)return;let t=ee({stateDir:e.stateDir});if(t.installed)try{await te(t,{openWebSessionNames:e.openWebSessionNames()})}catch(e){i({level:`warn`,phase:`web_agent_browser_provider_orphan_cleanup_failed`,data:{error:e instanceof Error?e.message:String(e)}})}}function Ie(e,n,r){if(!u(e))return e;if((e.success??e.ok)===!1)throw new t(Be(e.code),ze(e),{cmd:H,args:r,hint:f(e,`hint`)??U,agentBrowserError:e.error});if(n.exitCode!==0)throw new t(`COMMAND_FAILED`,`agent-browser command failed`,o(n,{cmd:H,args:r,stdout:n.stdout.slice(0,500),stderr:n.stderr.slice(0,500),hint:f(e,`hint`)??U}));return Object.hasOwn(e,`data`)?e.data:e}function Le(e,n,r,i){try{return JSON.parse(e)}catch(a){let o=i!==0;throw new t(`COMMAND_FAILED`,o?`agent-browser command failed`:`agent-browser returned invalid JSON`,{cmd:H,args:r,...o?{exitCode:i}:{},stdout:e.slice(0,500),stderr:n.slice(0,500),hint:U},a instanceof Error?a:void 0)}}function Re(e,n){let r=ne(e);return r.code===`TOOL_MISSING`?new t(`TOOL_MISSING`,r.message,{...r.details??{},cmd:H,args:n,hint:K(r)},r):r.code===`COMMAND_FAILED`?new t(`COMMAND_FAILED`,r.message,{...r.details??{},cmd:H,args:n,hint:K(r)},r):r}function K(e){return typeof e.details?.hint==`string`?e.details.hint:U}function ze(e){let t=e.error;if(typeof t==`string`&&t.trim())return t.trim();if(u(t)){let e=f(t,`message`)??f(t,`error`);if(e)return e}return f(e,`message`)??`agent-browser command failed`}function Be(e){return typeof e==`string`&&e.length>0?e:`COMMAND_FAILED`}function q(e){return e.startsWith(`@`)?e:`@${e}`}function Ve(){return process.platform===`darwin`?`Meta+a`:`Control+a`}function He(e){let t=u(e)&&u(e.box)?e.box:e;if(u(t))return J(t)??Ue(t)}function J(e){return Y(p(e,`x`),p(e,`y`),p(e,`width`),p(e,`height`))}function Ue(e){let t=p(e,`left`),n=p(e,`top`),r=p(e,`right`),i=p(e,`bottom`);return Y(t,n,X(r,t),X(i,n))}function Y(e,t,n,r){if(!(e===void 0||t===void 0||n===void 0||r===void 0))return{x:e,y:t,width:n,height:r}}function X(e,t){return e===void 0||t===void 0?void 0:e-t}var We=e({hasScopedWebProvider:()=>Ge,resolveWebProvider:()=>Q,withWebProvider:()=>$});const Z=c(W());function Q(e){return Z.resolve(e)}function Ge(){return Z.hasScope()}async function $(e,t){return await Z.run(e,t)}export{W as i,Q as n,$ as r,We as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{o as e}from"./png-worker-contract.js";import{T as t,_ as n,v as r}from"./sdk-contracts.js";import{c as i,s as a}from"./sdk-device.js";import{A as o,E as s,F as c,v as l}from"./sdk-android-adb.js";import{n as u}from"./host-process.js";import{i as d,o as f}from"./boot-diagnostics.js";import{C as p,D as m,E as h,F as g,M as ee,O as te,S as _,T as v,_ as y,a as b,b as x,c as ne,d as re,f as ie,g as ae,h as oe,i as S,l as se,m as ce,n as le,o as ue,p as de,r as fe,t as C,v as pe,w as me,x as w,y as T}from"./runner-disposal.js";import{E as he,L as E,P as ge,S as _e,T as ve,V as ye,y as be}from"./physical-device-control.js";import{a as xe,i as Se}from"./tool-provider.js";import{a as Ce,d as we,f as D,n as Te,o as Ee,r as De,t as Oe,u as ke}from"./runner-lease.js";import{n as Ae,t as je}from"./runner-provider.js";import Me from"node:path";import Ne from"node:fs/promises";const Pe={tap:`preflightSkippableTouchMutation`,mouseClick:`default`,longPress:`preflightSkippableTouchMutation`,drag:`preflightSkippableTouchMutation`,remotePress:`default`,type:`default`,swipe:`preflightSkippableTouchMutation`,scroll:`preflightSkippableTouchMutation`,desktopScroll:`preflightSkippableTouchMutation`,findText:`readOnly`,querySelector:`readOnly`,readText:`readOnly`,snapshot:`readOnly`,screenshot:`readOnly`,back:`default`,backInApp:`default`,backSystem:`default`,home:`default`,rotate:`default`,gesture:`preflightSkippableTouchMutation`,gestureViewport:`readOnly`,appSwitcher:`default`,keyboardDismiss:`default`,keyboardReturn:`default`,alert:`readOnly`,sequence:`preflightSkippableTouchMutation`,recordStart:`default`,recordStop:`default`,status:`readOnlyReadinessProbe`,uptime:`readOnlyReadinessProbe`,activate:`readinessPreflightExemptMutation`,terminate:`readinessPreflightExemptMutation`,targetReset:`readinessPreflightExemptMutation`,shutdown:`default`},O={readOnly:!1,readinessProbe:!1,readinessPreflightExempt:!1,readinessPreflightSkipEligibleAfterHealthyMutation:!1},Fe={...O,readinessPreflightExempt:!0},Ie={...O,readOnly:!0},Le={...Ie,readinessProbe:!0},Re={...O,readinessPreflightSkipEligibleAfterHealthyMutation:!0},ze=Object.fromEntries(Object.entries(Pe).map(([e,t])=>[e,Ue(t)]));function k(e){return ze[e]}function A(e){return k(e).readOnly}function Be(e){return k(e).readinessProbe}function Ve(e){return k(e).readinessPreflightExempt}function He(e){return k(e).readinessPreflightSkipEligibleAfterHealthyMutation}function Ue(e){switch(e){case`default`:return O;case`readinessPreflightExemptMutation`:return Fe;case`readOnly`:return Ie;case`readOnlyReadinessProbe`:return Le;case`preflightSkippableTouchMutation`:return Re}}function We(e,t){return`${e}:${t}:${Date.now()}`}function Ge(e){return typeof e==`number`&&Number.isFinite(e)&&e>0?Math.floor(e):void 0}function Ke(e=process.env){return s(e.AGENT_DEVICE_IOS_RUNNER_DETACH??``)!==!1}async function qe(e,t){if(e.kind!==`simulator`||!Ke()||ye(e.simulatorSetPath))return null;let n=Ee(e.id);if(!n)return null;let r=t=>(o({level:`debug`,phase:`ios_runner_lease_adoption_skipped`,data:{deviceId:e.id,runnerPid:n.runnerPid,port:n.port,reason:t}}),null),i=n.runnerPid;if(!i)return r(`runner_pid_missing`);if(!u(i))return r(`runner_process_dead`);if(!ke(n,i))return r(`runner_pid_recycled`);let a=Ye(e);if(!a)return r(`expected_derived_unresolved`);if(!n.xctestrunPath.startsWith(`${a}${Me.sep}`))return r(`artifact_fingerprint_mismatch`);if(!await Je(e,n.port))return r(`probe_failed`);if(!u(i)||!ke(n,i))return r(`runner_pid_recycled`);let s=Xe(e,n,i,a,t);try{D(s.lease)}catch{return null}return o({level:`info`,phase:`ios_runner_lease_adopted`,data:{deviceId:e.id,sessionId:s.sessionId,runnerPid:i,port:n.port,previousOwnerPid:n.ownerPid}}),s}async function Je(e,t){try{let n=await ae(e,t,h({command:`uptime`}),500);return JSON.parse(await n.text())?.ok===!0}catch{return!1}}function Ye(e){try{return ve(e,_e(e))}catch{return null}}function Xe(e,t,n,r,i){let a=We(e.id,t.port),o={xctestrunPath:t.xctestrunPath,derived:r,cache:`exact`,artifact:`valid`,buildMs:0,xctestrunPathSource:`manifest`,reason:`adopted_from_lease`},{child:s,wait:c}=Ze(n);return{sessionId:a,device:e,deviceId:e.id,port:t.port,xctestrunPath:t.xctestrunPath,xctestrunArtifact:o,jsonPath:t.jsonPath,testPromise:c,child:s,ready:!0,startupTimeoutMs:Ge(i.startupTimeoutMs),lease:De({deviceId:e.id,sessionId:a,runnerPid:n,port:t.port,xctestrunPath:t.xctestrunPath,jsonPath:t.jsonPath})}}function Ze(e){let t={pid:e,exitCode:null};return{child:t,wait:new Promise(n=>{let r=setInterval(()=>{u(e)||(clearInterval(r),t.exitCode=-1,n({stdout:``,stderr:``,exitCode:-1}))},1e3);r.unref?.()})}}async function Qe(e){let t=await $e(e.logPath)??tt(e.error);return t?new n(t.code??e.error.code,e.error.message,{...e.error.details??{},hint:typeof e.error.details?.hint==`string`?`${e.error.details.hint} ${t.hint}`:t.hint,runnerFailureReason:t.reason},e.error):e.error}async function $e(e){if(!e)return;let t=await at(e,65536);if(t)return et(t)}function et(e){let t=e.toLowerCase();if(nt(t))return{code:`IOS_TARGET_APP_CRASH`,reason:`target_app_axruntime_coretext_crash`,hint:`The target iOS app appears to have crashed while XCTest/AXRuntime read accessibility attributes. This is usually a simulator/XCTest/runtime or app accessibility payload issue, not a text-entry failure. Reproduce on the latest stable simulator runtime, reinstall the app, and capture the app crash from Console.app or ~/Library/Logs/DiagnosticReports with the exact command, selector/ref, app build, Xcode, and simulator runtime.`};if(rt(t))return{code:`IOS_TARGET_APP_CRASH`,reason:`target_app_crash`,hint:`The target iOS app appears to have crashed while the runner was executing the command. Reopen or reinstall the app, retry on a fresh/latest stable simulator runtime, and capture the app crash from Console.app or ~/Library/Logs/DiagnosticReports with the exact command, selector/ref, app build, Xcode, and simulator runtime.`}}function tt(e){if(it(e.message))return{reason:`runner_main_thread_execution_timeout`,hint:`XCTest timed out waiting for main-thread work on the current iOS screen. The app may still be visually responsive, especially on focused React Native overlays or animating screens. Use screenshot as visual truth, use coordinate presses only to prove or leave the state, and retry snapshot -i after the UI settles or after navigating away.`}}function nt(e){return e.includes(`axruntime`)&&e.includes(`coretext`)&&(e.includes(`attributesforelement`)||e.includes(`axuielementcopymultipleattributevalues`)||e.includes(`reconstitutedsmuggledctfontfromdictionary`)||e.includes(`reconstitutedsmuggledattributedstringfromdictionary`))}function rt(e){return e.includes(`process crashed`)||e.includes(`the application under test`)||e.includes(`terminated unexpectedly`)||e.includes(`exception type:`)&&e.includes(`thread 0 crashed`)}function it(e){return e.toLowerCase().includes(`main thread execution timed out`)}async function at(e,t){let n;try{let r=await Ne.stat(e),i=Math.max(0,r.size-t),a=r.size-i;if(a<=0)return;n=await Ne.open(e,`r`);let o=Buffer.alloc(a);return await n.read(o,0,a,i),o.toString(`utf8`)}catch{return}finally{await n?.close().catch(()=>{})}}const j=new Map,ot=new Map,M=new Map,N=1e4;function P(e,t){return m(ot,e,t)}async function F(e,t){return z(e.id),await P(e.id,async()=>{let n=j.get(e.id);if(n){let t=await ct(e,n);if(t)return t}return await we(e.id,async()=>await st(e,t))})}async function st(e,t){let n={},r=p(t),i=zt(t.runnerLeaseContext,e.id);o({level:`debug`,phase:`ios_runner_session_startup`,data:{deviceId:e.id,logicalLeaseContext:i}});let a=await H(n,`adopt_detached_runner`,async()=>await qe(e,{startupTimeoutMs:t.startupTimeoutMs}));if(a)return a.startupTimings=n,a.logicalLeaseContext=i,j.set(e.id,a),a;await H(n,`cleanup_stale_xcodebuild`,async()=>{await Ce(e.id,ue,i)}),await H(n,`ensure_booted`,async()=>{await _t(e)}),await H(n,`verify_developer_mode`,async()=>{await yt(e)}),t.cleanStaleBundles?await H(n,`cleanup_stale_bundles`,async()=>{await lt(e)}):(n.cleanup_stale_bundles=0,o({level:`debug`,phase:`ios_runner_startup_cleanup_stale_bundles_skipped`}));let s=await H(n,`ensure_xctestrun`,async()=>await se(e,{...t,signal:r}));n.build_xctestrun=s.buildMs;let c=await H(n,`allocate_port`,async()=>await pe()),{xctestrunPath:u,jsonPath:d}=await H(n,`prepare_xctestrun_env`,async()=>await re(s.xctestrunPath,{AGENT_DEVICE_RUNNER_PORT:String(c)},`session-${e.id}-${Oe}-${c}`,{iosXctestEnvDir:t.iosXctestEnvDir})),f=await H(n,`simulator_set_redirect`,async()=>await de(e)),m,h,g=[`test-without-building`,`-only-testing`,`AgentDeviceRunnerUITests/RunnerTests/testCommand`,`-parallel-testing-enabled`,`NO`,`-test-timeouts-enabled`,`NO`,`-collect-test-diagnostics`,`never`,he(e),`1`,`-destination-timeout`,`20`,`-xctestrun`,u,`-derivedDataPath`,s.derived,`-destination`,ge(e)];try{s.buildMs>0&&te({type:`command`,status:`progress`,message:`Starting XCTest runner...`}),{child:m,wait:h}=await H(n,`launch_xcodebuild`,()=>l(`xcodebuild`,g,{allowFailure:!0,env:{...process.env,AGENT_DEVICE_RUNNER_PORT:String(c)},detached:!0,signal:r}))}catch(e){throw await f?.release(),e}m.stdout?.on(`data`,e=>{T(e,t.logPath,t.traceLogPath,t.verbose)}),m.stderr?.on(`data`,e=>{T(e,t.logPath,t.traceLogPath,t.verbose)});let _=We(e.id,c),v=De({deviceId:e.id,sessionId:_,runnerPid:m.pid,port:c,xctestrunPath:u,jsonPath:d}),y={sessionId:_,device:e,deviceId:e.id,port:c,xctestrunPath:u,xctestrunArtifact:s,jsonPath:d,testPromise:h,child:m,ready:!1,startupTimeoutMs:Ge(t.startupTimeoutMs),startupTimings:n,logicalLeaseContext:i,simulatorSetRedirect:f??void 0,lease:v};if(r?.aborted)throw await S(y,{graceful:!1,waitTimeoutMs:C}),ee();try{D(v)}catch(t){throw await R(e.id,y,{graceful:!1,waitTimeoutMs:C}),t}return j.set(e.id,y),y}async function ct(e,t){if(!b(t.child.pid))return await H({},`stop_stale_session`,async()=>{await R(e.id,t,{graceful:!1,waitTimeoutMs:C})}),null;let n=t.xctestrunArtifact;if(n?.cache===`external`)return o({level:`debug`,phase:`ios_runner_session_reuse`,data:{deviceId:e.id,sessionId:t.sessionId,ready:t.ready,cache:n.cache,logicalLeaseContext:t.logicalLeaseContext}}),t;let r=ve(e,_e(e));return n?.derived===r?(o({level:`debug`,phase:`ios_runner_session_reuse`,data:{deviceId:e.id,sessionId:t.sessionId,ready:t.ready,logicalLeaseContext:t.logicalLeaseContext}}),t):(o({level:`debug`,phase:`ios_runner_session_artifact_stale`,data:{deviceId:e.id,sessionId:t.sessionId,currentDerived:n?.derived,expectedDerived:r}}),await H({},`stop_stale_artifact_session`,async()=>{await R(e.id,t)}),null)}async function lt(e){if(e.kind===`simulator`)for(let t of be){let n=await ut(e,t);!n||dt(n)}}async function ut(e,t){try{return await xe(E(e,[`uninstall`,e.id,t]),{allowFailure:!0,timeoutMs:N})}catch(n){o({level:`warn`,phase:`ios_runner_startup_cleanup_stale_bundle_failed`,data:{deviceId:e.id,bundleId:t,timeoutMs:N,error:n instanceof Error?n.message:String(n)}});return}}function dt(e){if(e.exitCode===0)return!0;let t=`${e.stdout}\n${e.stderr}`.toLowerCase();return t.includes(`not installed`)||t.includes(`found nothing`)||t.includes(`no such file`)||t.includes(`invalid device`)||t.includes(`could not find`)}function I(e){let t=j.get(e);return t?{sessionId:t.sessionId,alive:b(t.child.pid)}:null}async function L(e,t){await P(e.deviceId,async()=>{j.get(e.deviceId)===e&&(o({level:`warn`,phase:`ios_runner_session_invalidated`,data:{deviceId:e.deviceId,sessionId:e.sessionId,reason:t}}),await R(e.deviceId,e,{graceful:!1,waitTimeoutMs:C}))})}async function R(e,t,n={}){let r=t??j.get(e);r&&(await S(r,n),j.get(e)===r&&j.delete(e))}function ft(e){z(e);let t=pt();if(t<=0||!j.has(e))return;let n=setTimeout(()=>{M.delete(e),o({level:`info`,phase:`ios_runner_idle_stop`,data:{deviceId:e,idleMs:t}}),B(e).catch(t=>{o({level:`warn`,phase:`ios_runner_idle_stop_failed`,data:{deviceId:e,error:t instanceof Error?t.message:String(t)}})})},t);n.unref?.(),M.set(e,n),o({level:`debug`,phase:`ios_runner_idle_stop_scheduled`,data:{deviceId:e,idleMs:t}})}function z(e){let t=M.get(e);t&&(clearTimeout(t),M.delete(e))}function pt(e=process.env){let t=e.AGENT_DEVICE_IOS_RUNNER_IDLE_STOP_MS?.trim();if(t){let e=Number(t);if(Number.isFinite(e)&&e>=0)return Math.floor(e)}return 3e5}async function B(e){z(e),await P(e,async()=>{await we(e,async()=>{await R(e),await fe(e)})})}async function mt(){let e=Array.from(j.values());await le(e);for(let t of e)j.get(t.deviceId)===t&&j.delete(t.deviceId)}async function ht(){if(!Ke())return 0;let e=0;for(let[t,n]of j)if(n.device.kind===`simulator`&&!n.simulatorSetRedirect&&!(!n.lease||!b(n.child.pid))){try{D(Te(n.lease))}catch{continue}j.delete(t),z(t),e+=1,o({level:`info`,phase:`ios_runner_session_detached`,data:{deviceId:t,sessionId:n.sessionId,runnerPid:n.child.pid,port:n.port}})}return e}async function gt(){await mt();let e=Array.from(j.keys());await Promise.allSettled(e.map(async e=>{await B(e)})),await ne()}function _t(e){return e.kind===`simulator`?e.booted?(o({level:`debug`,phase:`ios_runner_startup_ensure_booted_skipped`,data:{deviceId:e.id}}),Promise.resolve()):vt(e):Promise.resolve()}async function vt(e){await xe(E(e,[`bootstatus`,e.id,`-b`]),{timeoutMs:oe})}async function yt(e){if(!i(e)||e.kind!==`device`)return;let t=await Se(`DevToolsSecurity`,[`-status`],{allowFailure:!0,timeoutMs:2e3}),r=`${t.stdout}\n${t.stderr}`;if(/developer mode is currently disabled/i.test(r))throw new n(`COMMAND_FAILED`,`Developer mode is disabled for Apple development tools`,{hint:"Run `sudo DevToolsSecurity -enable`, then retry the iOS runner. UI test runners start suspended until Xcode/testmanagerd can attach.",devToolsSecurityStatus:r.trim()})}function bt(e){if(!a(e.platform))throw new n(`UNSUPPORTED_PLATFORM`,`Unsupported platform for iOS runner: ${e.platform}`);if(e.kind!==`simulator`&&e.kind!==`device`)throw new n(`UNSUPPORTED_OPERATION`,`Unsupported iOS device kind for runner: ${e.kind}`)}async function V(e,t,n,r,i,a){Rt(t,n.command);let o=h(n),s=A(o.command),c=d.fromTimeoutMs(i),l=Pt(t,o);l.action===`run`?await wt({device:e,session:t,runnerCommand:o,logPath:r,deadline:c,signal:a,decision:l}):Tt(o,t,l);let u;try{u=await Ct({device:e,session:t,runnerCommand:o,logPath:r,deadline:c,timeoutMs:i,signal:a,readOnlyCommand:s})}catch(e){throw St(e,t,l)}try{let e=await Et(u,t,r),n=Nt(e);return n?(t.lastHealthyMutation=void 0,await L(t,n)):He(o.command)&&(t.lastHealthyMutation={atMs:Date.now(),appBundleId:o.appBundleId}),e}catch(e){let n=_(e);throw n?(t.lastHealthyMutation=void 0,await L(t,n),e):xt(e)?e:St(e,t,l)}}function xt(e){return e instanceof n&&e.details?.runner!==void 0}function St(e,t,n){return n.action!==`skip`||n.reason!==`recent_healthy_mutation`?e:(t.lastHealthyMutation=void 0,It(e,{runnerReadinessPreflightSkipped:!0,runnerReadinessPreflightSkipReason:n.reason,runnerReadinessPreflightSkippedAgeMs:n.lastHealthyMutationAgeMs}))}async function Ct(e){let{device:t,session:r,runnerCommand:i,logPath:a,deadline:o,timeoutMs:s,signal:l,readOnlyCommand:u}=e,d=o.remainingMs();if(d<=0)throw new n(`COMMAND_FAILED`,`Runner command deadline exceeded`,{timeoutMs:s});return await c(`ios_runner_command_send`,async()=>u?await y(t,r.port,i,a,d,r,l):await ae(t,r.port,i,d,l),u?{command:i.command,commandId:i.commandId,readOnly:!0,sessionReady:r.ready,timeoutMs:d}:{command:i.command,commandId:i.commandId})}async function wt(e){let{device:t,session:n,runnerCommand:r,logPath:i,deadline:a,signal:o,decision:s}=e,l=n.ready?Math.min(1e3,a.remainingMs()):Math.min(Lt(n),a.remainingMs());try{await Et(await c(`ios_runner_readiness_preflight`,async()=>await y(t,n.port,h({command:`uptime`}),i,l,n,o),{command:r.command,commandId:r.commandId,reason:s.reason,lastHealthyMutationAgeMs:s.lastHealthyMutationAgeMs,sessionReady:n.ready,timeoutMs:l}),n,i)}catch(e){throw Ft(e)}}function Tt(e,t,n){o({level:`debug`,phase:`ios_runner_readiness_preflight_skipped`,data:{command:e.command,commandId:e.commandId,reason:n.reason,lastHealthyMutationAgeMs:n.reason===`recent_healthy_mutation`?n.lastHealthyMutationAgeMs:void 0,sessionReady:t.ready}})}async function Et(e,t,n){let r=Dt(await e.text());if(!r.ok)throw await Qe({error:Ot(r,n),logPath:n});return t.ready=!0,jt(r)}function Dt(e){try{let t=JSON.parse(e);return t&&typeof t==`object`?t:{}}catch{throw new n(`COMMAND_FAILED`,`Invalid runner response`,{text:e})}}function Ot(e,t){let r=kt(e.error?.code),i=typeof e.error?.message==`string`?e.error.message:void 0,a=typeof e.error?.hint==`string`?e.error.hint:void 0;return new n(At(r),i??`Runner error`,{runner:e,runnerErrorCode:r,retriable:r===`RUNNER_BUSY`?!0:void 0,xcodebuild:{exitCode:1,stdout:``,stderr:``},hint:a,logPath:t})}function kt(e){return typeof e==`string`&&e.trim().length>0?e.trim():void 0}function At(e){return e===`RUNNER_BUSY`?`COMMAND_FAILED`:e?t(e):`COMMAND_FAILED`}function jt(e){if(!e.data||typeof e.data!=`object`||Array.isArray(e.data))return{};let t=e.data;return Mt(t),t}function Mt(e){let t=e.gestureFallback;typeof t!=`string`||t.length===0||o({level:`debug`,phase:`ios_runner_gesture_fallback`,data:{fallback:t,message:typeof e.gestureFallbackMessage==`string`?e.gestureFallbackMessage:void 0,hint:typeof e.gestureFallbackHint==`string`?e.gestureFallbackHint:void 0}})}function Nt(e){if(e.runnerFatal===!0)return typeof e.runnerFatalReason==`string`&&e.runnerFatalReason.trim().length>0?e.runnerFatalReason:`runner_reported_fatal_response`}function Pt(e,t){let n=A(t.command);if(Ve(t.command))return{action:`skip`,reason:`preflight_exempt_command`};if(!e.ready)return n?{action:`skip`,reason:`read_only_startup_command`}:{action:`run`,reason:`startup`};if(Be(t.command))return{action:`skip`,reason:`readiness_probe_command`};if(!He(t.command))return{action:`run`,reason:`conservative_command`};let r=e.lastHealthyMutation;if(!r)return{action:`run`,reason:`no_recent_healthy_mutation`};if(t.appBundleId!==r.appBundleId)return{action:`run`,reason:`app_activation_uncertain`};let i=Date.now()-r.atMs;return i>5e3?{action:`run`,reason:`healthy_mutation_stale`,lastHealthyMutationAgeMs:i}:{action:`skip`,reason:`recent_healthy_mutation`,lastHealthyMutationAgeMs:i}}function Ft(e){return It(e,{runnerReadinessPreflightFailed:!0})}function It(e,t){let r=e instanceof n?e:new n(`COMMAND_FAILED`,e instanceof Error?e.message:String(e),void 0,e);return new n(r.code,r.message,{...r.details??{},...t},r.cause??e)}function Lt(e){return e.startupTimeoutMs??45e3}async function H(e,t,n){let r=Date.now();try{return await n()}finally{let n=Date.now()-r;e[t]=n,o({level:`debug`,phase:`ios_runner_startup_${t}`,durationMs:n})}}function Rt(e,t){e.startupTimingsReported||!e.startupTimings||(e.startupTimingsReported=!0,o({level:`info`,phase:`ios_runner_session_startup_timings`,durationMs:Object.values(e.startupTimings).reduce((e,t)=>e+t,0),data:{command:t,sessionId:e.sessionId,ready:e.ready,logicalLeaseContext:e.logicalLeaseContext,timings:e.startupTimings}}))}function zt(e,t){if(!e)return;let n={leaseId:U(e.leaseId),clientId:U(e.clientId),tenantId:U(e.tenantId),runId:U(e.runId),leaseProvider:U(e.leaseProvider),deviceKey:U(e.deviceKey)??t},r=Object.entries(n).filter(([,e])=>e!==void 0);return r.length>0?Object.fromEntries(r):void 0}function U(e){return typeof e==`string`&&e.trim().length>0?e.trim():void 0}async function Bt(e){let{device:t,session:n,command:r,transportError:i,options:a,signal:o,invalidationReason:s}=e;return await Vt(await Gt(t,n,r,i,a,o),{command:r,session:n,transportError:i,invalidationReason:s,invalidateSession:e.invalidateSession})}async function Vt(e,t){if(!e)return await Wt(t,`status_recovery_unavailable`);if(e.type===`recovered`)return Ht(e,t);if(e.type===`skipInvalidation`)throw Ut(e,t);return await Wt(t,e.reason,e.lifecycleState,e.error)}function Ht(e,t){return K({command:t.command,session:t.session,transportError:t.transportError,decision:`skipped`,reason:e.reason,lifecycleState:e.lifecycleState}),e.data}function Ut(e,t){return K({command:t.command,session:t.session,transportError:t.transportError,decision:`skipped`,reason:e.reason,lifecycleState:e.lifecycleState}),e.error}async function Wt(e,t,n,r){throw K({command:e.command,session:e.session,transportError:e.transportError,decision:`retained`,reason:t,lifecycleState:n}),await e.invalidateSession(e.session,e.invalidationReason),r??e.transportError}async function Gt(e,t,n,r,i,a){if(n.command===`status`||!n.commandId?.trim())return;let s=G(r),c;try{c=await V(e,t,{command:`status`,statusCommandId:n.commandId},i.logPath,3e3,a)}catch(e){return o({level:`debug`,phase:`ios_runner_command_status_recovery_failed`,data:{command:n.command,commandId:n.commandId,error:e instanceof Error?e.message:String(e),...s}}),{type:`retainInvalidation`,reason:`status_probe_failed`}}let l=typeof c.lifecycleState==`string`?c.lifecycleState:``;return o({level:`debug`,phase:`ios_runner_command_status_recovery`,data:{command:n.command,commandId:n.commandId,lifecycleState:l,...s}}),Kt(c,l,n,r,i)}function Kt(e,t,r,i,a){return t===`completed`?qt(e,r,i,a):t===`failed`?{type:`skipInvalidation`,reason:`runner_reported_failure`,lifecycleState:t,error:Jt(e,r,i,a)}:t===`accepted`||t===`started`?{type:`skipInvalidation`,reason:`command_still_in_flight`,lifecycleState:t,error:Yt(t,r,i,a)}:{type:`retainInvalidation`,reason:t?`unknown_lifecycle_state`:`missing_lifecycle_state`,lifecycleState:t,error:new n(`COMMAND_FAILED`,`Runner command "${r.command}" lost its transport response and lifecycle status was ${t?`"${t}"`:`missing`}, so agent-device invalidated the runner session instead of replaying the command.`,{command:r.command,commandId:r.commandId,lifecycleState:t,recovery:`lifecycle_state_not_recoverable`,hint:an(r.command),logPath:a.logPath,transportError:i.message},i)}}function qt(e,t,r,i){let a=Xt(e.lifecycleResponseJson);if(a)return{type:`recovered`,data:a,reason:`completed_with_retained_response`,lifecycleState:`completed`};if(A(t.command))return{type:`skipInvalidation`,error:r,reason:`read_only_completed_without_retained_response`,lifecycleState:`completed`};let o=G(r);return{type:`skipInvalidation`,reason:`completed_without_retained_response`,lifecycleState:`completed`,error:new n(`COMMAND_FAILED`,`Runner command "${t.command}" completed after the transport response was lost, but no recoverable response was retained.`,{command:t.command,commandId:t.commandId,lifecycleState:`completed`,recovery:`completed_without_retained_response`,...o,hint:Qt(t.command,o),logPath:i.logPath,transportError:r.message},r)}}function Jt(e,r,i,a){let o=typeof e.lifecycleErrorCode==`string`?e.lifecycleErrorCode:void 0,s=typeof e.lifecycleErrorMessage==`string`?e.lifecycleErrorMessage:`Runner command failed`,c=typeof e.lifecycleErrorHint==`string`?e.lifecycleErrorHint:void 0,l=G(i);return new n(t(o),s,{command:r.command,commandId:r.commandId,lifecycleState:`failed`,recovery:`runner_reported_failure`,...l,hint:c??$t(r.command,l),logPath:a.logPath,transportError:i.message},i)}function Yt(e,t,r,i){if(A(t.command))return r;let a=G(r);return new n(`COMMAND_FAILED`,`Runner command "${t.command}" is still ${e} after the transport response was lost.`,{command:t.command,commandId:t.commandId,lifecycleState:e,recovery:`command_still_in_flight`,...a,hint:en(t.command,e,a),logPath:i.logPath,transportError:r.message},r)}function Xt(e){if(typeof e!=`string`||e.trim().length===0)return;let t=Zt(e);if(t.ok)return t.data&&typeof t.data==`object`&&!Array.isArray(t.data)?t.data:{}}function Zt(e){try{let t=JSON.parse(e);if(t&&typeof t==`object`)return t}catch{}return{}}function Qt(e,t){return`${W(t)}The runner is still reachable and reports "${e}" already completed, so agent-device kept the session open and will not replay it. Run snapshot -i to inspect the current UI, then continue from that observed state.`}function $t(e,t){return`${W(t)}The runner is still reachable and reports "${e}" failed after the transport response was lost, so agent-device kept the session open and did not replay it. Run snapshot -i to inspect the current UI and retry with a selector visible in that snapshot.`}function en(e,t,n){return`${W(n)}The runner is still reachable and reports "${e}" is ${t}, so agent-device kept the session open and will not replay it. Wait briefly, run snapshot -i to inspect the current UI, then continue from that observed state.`}function W(e){return e.readinessPreflightSkipped===!0?`This hot command skipped the uptime preflight because the runner had just completed a healthy interaction; status recovery confirmed the runner still observed it. `:``}function tn(e,t){let n=e.details?.[t];return typeof n==`boolean`?n:void 0}function nn(e,t){let n=e.details?.[t];return typeof n==`string`?n:void 0}function rn(e,t){let n=e.details?.[t];return typeof n==`number`?n:void 0}function G(e){let t={},n=tn(e,`runnerReadinessPreflightSkipped`);n!==void 0&&(t.readinessPreflightSkipped=n);let r=nn(e,`runnerReadinessPreflightSkipReason`);r!==void 0&&(t.readinessPreflightSkipReason=r);let i=rn(e,`runnerReadinessPreflightSkippedAgeMs`);return i!==void 0&&(t.readinessPreflightSkippedAgeMs=i),t}function an(e){return`The runner did not confirm that "${e}" reached a safe terminal state, so agent-device kept the conservative invalidation path. Run snapshot -i before retrying if the UI may have changed.`}function K(e){let{command:t,session:n,transportError:r,decision:i,reason:a,lifecycleState:s}=e;o({level:i===`retained`?`warn`:`debug`,phase:`ios_runner_command_invalidation_decision`,data:{command:t.command,commandId:t.commandId,decision:i,reason:a,lifecycleState:s,runnerReachable:s!==void 0,sessionId:n.sessionId,transportError:r.message}})}const q=new Map;function on(e,t){let n=e.requestId?.trim();if(n)return`request:${n}`;let r=t.commandId?.trim();if(r)return`command:${r}`}function sn(e){if(!e)return;let t=J(e);t.touchedSession=!0,Y(e,t)}function cn(e){return e?q.get(e)?.touchedSession===!0:!1}function ln(e){if(!e)return!0;let t=J(e);return t.recycles>=1?(Y(e,t),!1):(Y(e,t),!0)}function un(e){if(!e)return;let t=J(e);t.recycles+=1,Y(e,t)}function dn(e,t){return o({level:`warn`,phase:`ios_runner_recycle_budget_exhausted`,data:{command:e.command,commandId:e.commandId,requestId:t.requestId,maxRecycles:1}}),new n(`COMMAND_FAILED`,`iOS runner was already restarted during this request and "${e.command}" still failed, so agent-device stopped instead of paying for another runner boot.`,{command:e.command,commandId:e.commandId,recovery:`runner_recycle_budget_exhausted`,hint:"Check the runner log for the underlying failure before retrying — a provisioning or code-signing error there means the runner cannot install on this device, and no retry will help. If the runner is healthy, the current screen is likely too heavy or animating for accessibility capture: the app session is preserved, so run `screenshot` for visual truth and interact by coordinates, or navigate to another screen.",logPath:t.logPath})}function J(e){return fn(),q.get(e)??{touchedSession:!1,recycles:0,lastAtMs:Date.now()}}function Y(e,t){t.lastAtMs=Date.now(),q.delete(e),q.set(e,t)}function fn(){let e=Date.now()-6e5;for(let[t,n]of q)n.lastAtMs<e&&q.delete(t);for(;q.size>512;){let e=q.keys().next().value;if(e===void 0)break;q.delete(e)}}async function pn(e,t){x(t.requestId);let r=p(t),i=h({command:`uptime`}),a;for(let n=1;n<=2;n+=1){let o=await mn({device:e,command:i,options:t,signal:r,attempt:n,recoveryReason:a});if(o.kind===`prepared`)return o.result;a=o.recoveryReason}throw new n(`COMMAND_FAILED`,`iOS runner prepare failed`)}async function mn(e){let{device:t,command:n,options:r,signal:i,attempt:a,recoveryReason:o}=e,s=Date.now(),c=await F(t,{...r,cleanStaleBundles:a>1?!0:r.cleanStaleBundles,...xn(r,`runner_session`)}),l=Date.now()-s;try{return{kind:`prepared`,result:Z(t,await bn(t,c,n,r,i,l,{recoveryReason:o}))}}catch(e){return await hn({device:t,session:c,command:n,options:r,signal:i,attempt:a,error:e})}}async function hn(e){let{device:t,session:n,command:i,options:a,signal:s,attempt:c,error:l}=e,u=r(l,`COMMAND_FAILED`);if(g(u))throw await X(n,`prepare_runner_request_canceled`),l;if(c===1&&Cn(u,n))return{kind:`prepared`,result:await gn({device:t,session:n,command:i,options:a,signal:s,error:u})};if(!_n(u))throw l;let d=u.message||`runner_health_failed`;if(c>=2)throw await X(n,`prepare_runner_health_failed`),l;return x(a.requestId),await L(n,`prepare_runner_health_retry`),o({level:`warn`,phase:`ios_runner_prepare_health_retry`,data:{command:i.command,commandId:i.commandId,sessionId:n.sessionId,attempt:c,maxAttempts:2,reason:d}}),{kind:`retry`,recoveryReason:d}}async function gn(e){let{device:t,session:n,command:r,options:i,signal:a,error:s}=e,c=s.message||`runner_health_failed`;await L(n,`prepare_cached_runner_health_failed`),await ie(n.xctestrunArtifact,c);let l=Date.now(),u=await F(t,{...i,cleanStaleBundles:!0,forceRunnerXctestrunRebuild:!0,...xn(i,`runner_rebuild`)}),d=Date.now()-l;try{let e=await bn(t,u,r,i,a,d,{recoveryReason:c});return o({level:`info`,phase:`ios_runner_prepare_bad_cache_recovered`,data:{command:r.command,commandId:r.commandId,sessionId:u.sessionId,xctestrunPath:u.xctestrunArtifact?.xctestrunPath,reason:c}}),Z(t,e)}catch(e){await X(u,`prepare_rebuilt_runner_health_failed`);let n=Tn(e,u,c);throw Dn(t,{cache:u.xctestrunArtifact?.cache,artifact:u.xctestrunArtifact?.artifact,buildMs:u.xctestrunArtifact?.buildMs,connectMs:d,healthCheckMs:0,xctestrunPath:u.xctestrunArtifact?.xctestrunPath,failureReason:n.message}),n}}async function X(e,t){try{await L(e,t)}catch{}}function _n(e){return g(e)?!1:w(e)||v(e)||wn(e)}async function vn(e,t,n){x(n.requestId);let i=p(n),a=on(n,t),o,s=!1;try{if(!I(e.id)?.alive&&cn(a)){if(!ln(a))throw dn(t,n);s=!0}o=await F(e,n),s&&un(a),sn(a);let r=o.ready?ce:Lt(o);return await V(e,o,t,n.logPath,r,i)}catch(a){let s=r(a,`COMMAND_FAILED`);if(o&&!o.ready&&g(s))throw await X(o,`runner_startup_request_canceled`),a;if(me(s)&&o)return x(n.requestId),await yn({device:e,session:o,command:t,options:n,signal:i,restartReason:`runner_connect_failed_before_command_send`});if(o&&kn(s))return x(n.requestId),await yn({device:e,session:o,command:t,options:n,signal:i,restartReason:`runner_readiness_preflight_failed_before_command_send`,recoveredDiagnosticPhase:`ios_runner_readiness_preflight_recovered`});if(o&&w(s))return await Bt({device:e,session:o,command:t,transportError:s,options:n,signal:i,invalidationReason:`transport_error_after_command_send`,invalidateSession:L});throw a}}async function yn(e){let{device:t,command:n,options:i,signal:a,restartReason:s}=e,c=on(i,n);if(!ln(c))throw dn(n,i);await L(e.session,s);let l=await F(t,{...i,cleanStaleBundles:!0});un(c);try{let r=await V(t,l,n,i.logPath,oe,a);return e.recoveredDiagnosticPhase&&o({level:`debug`,phase:e.recoveredDiagnosticPhase,data:{command:n.command,commandId:n.commandId,recovery:`session_restarted`,sessionId:l.sessionId}}),r}catch(e){let o=r(e,`COMMAND_FAILED`);if(w(o))return await Bt({device:t,session:l,command:n,transportError:o,options:i,signal:a,invalidationReason:`transport_error_after_retry_command_send`,invalidateSession:L});throw e}}async function bn(e,t,n,r,i,a,o){let s=Date.now(),c=Sn(r.prepareDeadline,r.healthTimeoutMs,`runner_health`);return En(await V(e,t,n,r.logPath,c,i),t,a,Date.now()-s,o)}function xn(e,t){if(!e.prepareDeadline)return{};let n=Sn(e.prepareDeadline,e.buildTimeoutMs,t);return{buildTimeoutMs:n,startupTimeoutMs:n}}function Sn(e,t,r){if(!e)return t??45e3;let i=Math.floor(e.remainingMs());if(i<=0)throw new n(`COMMAND_FAILED`,`prepare ios-runner timed out`,{phase:r,reason:`prepare_deadline_expired`});return i}function Cn(e,t){let n=t.xctestrunArtifact;return!n||n.cache===`miss`?!1:_n(e)}function wn(e){let t=e.message.toLowerCase();return t.includes(`timeout`)||t.includes(`timed out`)||t.includes(`deadline`)}function Tn(e,t,i){let a=r(e,`COMMAND_FAILED`);return new n(a.code,`artifact restored but runner did not connect`,{...a.details??{},restoredFailureReason:i,xctestrunPath:t.xctestrunArtifact?.xctestrunPath,artifact:t.xctestrunArtifact?.artifact,cache:t.xctestrunArtifact?.cache,reason:a.message},a)}function En(e,t,n,r,i){let a=t.xctestrunArtifact,o={...i?.recoveryReason?{recoveryReason:i.recoveryReason}:{},...i?.failureReason?{failureReason:i.failureReason}:{}};return a?{runner:e,cache:a.cache,artifact:a.artifact,buildMs:a.buildMs,connectMs:Math.max(0,n),healthCheckMs:Math.max(0,r),xctestrunPath:a.xctestrunPath,...o}:{runner:e,connectMs:Math.max(0,n),healthCheckMs:Math.max(0,r),...o}}function Z(e,t){return Dn(e,t),t}function Dn(e,t){o({level:t.failureReason?`warn`:`info`,phase:`apple_runner_prepare`,data:{platform:e.platform,target:e.target,deviceId:e.id,cache:t.cache,artifact:t.artifact,buildMs:t.buildMs,connectMs:t.connectMs,healthCheckMs:t.healthCheckMs,timingContainment:t.buildMs===void 0?{healthCheckMs:[]}:{connectMs:[`buildMs`],healthCheckMs:[]},xctestrunPath:t.xctestrunPath,recoveryReason:t.recoveryReason,failureReason:t.failureReason}})}function On(e){return e.details?.runnerReadinessPreflightFailed===!0}function kn(e){return On(e)&&(w(e)||An(e))}function An(e){let t=e.message.toLowerCase();return t.includes(`timeout`)||t.includes(`timed out`)}var jn=e({detachIosSimulatorRunnerSessionsForShutdown:()=>ht,notifyIosRunnerAppRelaunched:()=>Mn,prepareIosRunner:()=>In,prewarmAppleRunnerCache:()=>Nn,prewarmIosRunnerSession:()=>Pn,runAppleRunnerCommand:()=>Q,stopAllIosRunnerSessions:()=>gt});async function Q(e,t,n={}){bt(e),x(n.requestId);let r=h(t),i=$(e,n);return A(r.command)?f(()=>(x(n.requestId),i.runCommand(e,r,n)),{shouldRetry:e=>(x(n.requestId),w(e))}):i.runCommand(e,r,n)}async function Mn(e,t={}){if(i(e))try{await Q(e,{command:`targetReset`},t)}catch(t){o({level:`warn`,phase:`ios_runner_target_reset_failed`,data:{deviceId:e.id,error:t instanceof Error?t.message:String(t)}}),await B(e.id)}}function Nn(e,t={}){if(i(e))return Fn({device:e,options:t,failurePhase:`ios_runner_cache_prewarm_failed`,task:async t=>{await se(e,t)}})}function Pn(e,t={}){if(!i(e))return;let n=$(e,t).prewarm;if(!n){o({level:`debug`,phase:`ios_runner_session_prewarm_unavailable`,data:{deviceId:e.id}});return}return Fn({device:e,options:t,failurePhase:`ios_runner_session_prewarm_failed`,task:async t=>{await n(e,t)}})}function Fn(e){let{device:t,options:n,failurePhase:r,task:i}=e,{propagateError:a=!1,...s}=n;return i(s).catch(e=>{if(o({level:`warn`,phase:r,data:{deviceId:t.id,error:e instanceof Error?e.message:String(e)}}),a)throw e})}async function In(e,t){bt(e),x(t.requestId);let n=h({command:`uptime`}),r=$(e,t);if(r.prepare)return await r.prepare(e,t);let i=Date.now();return{runner:await r.runCommand(e,n,t),connectMs:0,healthCheckMs:Math.max(0,Date.now()-i)}}function $(e,t){return Ae(e,Ln,void 0,{requestId:t.requestId})}const Ln=je(vn,{prepare:pn,prewarm:async(e,t)=>{await pn(e,{...t,healthTimeoutMs:ce})}});export{Q as a,ft as c,Pn as i,B as l,In as n,jn as o,Nn as r,I as s,Mn as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{o as e}from"./png-worker-contract.js";import{AsyncLocalStorage as t}from"node:async_hooks";var n=e({createLocalAppleRunnerProvider:()=>i,resolveAppleRunnerProvider:()=>a,withAppleRunnerProvider:()=>s});const r=new t;function i(e,t={}){return{runCommand:e,...t}}function a(e,t,n,r={}){if(n)return c(n);let i=o(e,r);return c(i?i.provider:t)}function o(e,t={}){let n=r.getStore();return n&&n.deviceId===e.id&&(n.requestId?n.requestId===t.requestId:!t.requestId)?n:void 0}async function s(e,t,n){if(!e)return await n();let i={provider:c(e),deviceId:t.deviceId,requestId:t.requestId};return await r.run(i,n)}function c(e){return typeof e==`function`?{runCommand:e}:e}export{s as i,a as n,n as r,i as t};
|