agent-device 0.17.0 → 0.17.2
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/README.md +1 -1
- package/android-multitouch-helper/dist/{agent-device-android-multitouch-helper-0.17.0.apk → agent-device-android-multitouch-helper-0.17.2.apk} +0 -0
- package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.17.2.apk.sha256 +1 -0
- package/android-multitouch-helper/dist/{agent-device-android-multitouch-helper-0.17.0.manifest.json → agent-device-android-multitouch-helper-0.17.2.manifest.json} +4 -4
- package/android-snapshot-helper/dist/{agent-device-android-snapshot-helper-0.17.0.apk → agent-device-android-snapshot-helper-0.17.2.apk} +0 -0
- package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.17.2.apk.sha256 +1 -0
- package/android-snapshot-helper/dist/{agent-device-android-snapshot-helper-0.17.0.manifest.json → agent-device-android-snapshot-helper-0.17.2.manifest.json} +6 -6
- package/dist/src/123.js +1 -0
- package/dist/src/1352.js +1 -1
- package/dist/src/1534.js +1 -0
- package/dist/src/1620.js +1 -0
- package/dist/src/1644.js +2 -0
- package/dist/src/2284.js +1 -0
- package/dist/src/2403.js +3 -0
- package/dist/src/2415.js +28 -29
- package/dist/src/2474.js +1 -0
- package/dist/src/2672.js +1 -0
- package/dist/src/3393.js +1 -0
- package/dist/src/4778.js +1 -1
- package/dist/src/5898.js +1 -0
- package/dist/src/7556.js +1 -1
- package/dist/src/7847.js +1 -1
- package/dist/src/8173.js +27 -0
- package/dist/src/8407.js +1 -0
- package/dist/src/8699.js +1 -1
- package/dist/src/8806.js +3 -3
- package/dist/src/9010.js +1 -0
- package/dist/src/9238.js +3 -3
- package/dist/src/9471.js +1 -1
- package/dist/src/9542.js +3 -3
- package/dist/src/9616.js +1 -0
- package/dist/src/9673.js +1 -0
- package/dist/src/9974.js +1 -0
- package/dist/src/android-adb.d.ts +12 -6
- package/dist/src/android-adb.js +1 -1
- package/dist/src/android-snapshot-helper.d.ts +15 -7
- package/dist/src/android.js +1 -1
- package/dist/src/apple.js +1 -1
- package/dist/src/apps.js +2 -2
- package/dist/src/args.js +2 -2
- package/dist/src/batch.d.ts +16 -4
- package/dist/src/cli.js +18 -42
- package/dist/src/command-surface.js +1 -1
- package/dist/src/contracts.d.ts +28 -4
- package/dist/src/contracts.js +1 -1
- package/dist/src/find.js +1 -1
- package/dist/src/finders.d.ts +3 -1
- package/dist/src/generic.js +13 -11
- package/dist/src/index.d.ts +142 -73
- package/dist/src/index.js +1 -1
- package/dist/src/input-actions.js +1 -1
- package/dist/src/interaction.js +1 -1
- package/dist/src/internal/png-worker.d.ts +26 -0
- package/dist/src/internal/png-worker.js +1 -0
- package/dist/src/metro.d.ts +3 -1
- package/dist/src/react-native.js +1 -1
- package/dist/src/record-trace-recording.js +26 -0
- package/dist/src/record-trace.js +1 -26
- package/dist/src/remote-config.d.ts +33 -7
- package/dist/src/selector-runtime.js +1 -1
- package/dist/src/selectors.d.ts +3 -3
- package/dist/src/selectors.js +1 -1
- package/dist/src/server.js +2 -2
- package/dist/src/session.js +10 -11
- package/dist/src/snapshot.js +1 -1
- package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +6 -2
- package/package.json +7 -4
- package/server.json +2 -2
- package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.17.0.apk.sha256 +0 -1
- package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.17.0.apk.sha256 +0 -1
- package/dist/src/1998.js +0 -1
- package/dist/src/2805.js +0 -1
- package/dist/src/4057.js +0 -1
- package/dist/src/5792.js +0 -1
- package/dist/src/6085.js +0 -1
- package/dist/src/6232.js +0 -1
- package/dist/src/8020.js +0 -1
- package/dist/src/8502.js +0 -1
- package/dist/src/940.js +0 -1
- package/dist/src/9404.js +0 -1
- package/dist/src/9533.js +0 -1
- package/dist/src/command-metadata.js +0 -1
- /package/dist/src/{1393.js → 3675.js} +0 -0
- /package/dist/src/{5310.js → 695.js} +0 -0
package/README.md
CHANGED
|
@@ -30,7 +30,7 @@ It works with native iOS and Android apps, plus apps built with Expo, Flutter, a
|
|
|
30
30
|
- **Inspect** real app UI through compact accessibility snapshots, interactive refs like `@e3`, selectors, and React Native component trees.
|
|
31
31
|
- **Interact** by opening apps, tapping, typing, scrolling, performing gestures, waiting, asserting state, handling alerts, and closing sessions.
|
|
32
32
|
- **Capture evidence** with screenshots, videos, logs, traces, network traffic, performance samples, crash context, and React profiles.
|
|
33
|
-
- **Replay workflows** by recording `.ad` scripts for local runs, CI,
|
|
33
|
+
- **Replay workflows** by recording `.ad` scripts for local runs, CI, repeatable e2e checks, and strict Maestro YAML export when a flow needs to run in Maestro.
|
|
34
34
|
- **Run across platforms** with iOS Simulator automation, Android Emulator automation, physical devices, tvOS, Android TV, macOS, Linux, and desktop app automation, so agents can see and feel the app they work on.
|
|
35
35
|
|
|
36
36
|
## Use Cases
|
|
Binary file
|
package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.17.2.apk.sha256
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
e50fe5576ae7edbb9ae18414ae65d094de416ba3e0f6e418ac3cdc319e491a0d agent-device-android-multitouch-helper-0.17.2.apk
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "android-multitouch-helper",
|
|
3
|
-
"version": "0.17.
|
|
4
|
-
"assetName": "agent-device-android-multitouch-helper-0.17.
|
|
5
|
-
"sha256": "
|
|
3
|
+
"version": "0.17.2",
|
|
4
|
+
"assetName": "agent-device-android-multitouch-helper-0.17.2.apk",
|
|
5
|
+
"sha256": "e50fe5576ae7edbb9ae18414ae65d094de416ba3e0f6e418ac3cdc319e491a0d",
|
|
6
6
|
"packageName": "com.callstack.agentdevice.multitouchhelper",
|
|
7
|
-
"versionCode":
|
|
7
|
+
"versionCode": 17002,
|
|
8
8
|
"instrumentationRunner": "com.callstack.agentdevice.multitouchhelper/.MultiTouchInstrumentation",
|
|
9
9
|
"statusProtocol": "android-multitouch-helper-v1"
|
|
10
10
|
}
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0f91b28c7374fbf1d12fa43c283d01354b3a4d68a44b0dc68ccc22959f02d13e agent-device-android-snapshot-helper-0.17.2.apk
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "android-snapshot-helper",
|
|
3
|
-
"version": "0.17.
|
|
4
|
-
"releaseTag": "v0.17.
|
|
5
|
-
"assetName": "agent-device-android-snapshot-helper-0.17.
|
|
3
|
+
"version": "0.17.2",
|
|
4
|
+
"releaseTag": "v0.17.2",
|
|
5
|
+
"assetName": "agent-device-android-snapshot-helper-0.17.2.apk",
|
|
6
6
|
"apkUrl": null,
|
|
7
|
-
"sha256": "
|
|
8
|
-
"checksumName": "agent-device-android-snapshot-helper-0.17.
|
|
7
|
+
"sha256": "0f91b28c7374fbf1d12fa43c283d01354b3a4d68a44b0dc68ccc22959f02d13e",
|
|
8
|
+
"checksumName": "agent-device-android-snapshot-helper-0.17.2.apk.sha256",
|
|
9
9
|
"packageName": "com.callstack.agentdevice.snapshothelper",
|
|
10
|
-
"versionCode":
|
|
10
|
+
"versionCode": 17002,
|
|
11
11
|
"instrumentationRunner": "com.callstack.agentdevice.snapshothelper/.SnapshotInstrumentation",
|
|
12
12
|
"minSdk": 23,
|
|
13
13
|
"targetSdk": 36,
|
package/dist/src/123.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import e,{promises as t}from"node:fs";import{Worker as n}from"node:worker_threads";import a from"node:path";import{fileURLToPath as r}from"node:url";import{appendScreenshotScriptFlags as i}from"./695.js";import{normalizeRef as s,centerOfRect as o,buildSnapshotPresentationKey as l,findNodeByRef as d}from"./1644.js";import{emitDiagnostic as u}from"./7599.js";import{asAppError as c,toAppErrorCode as p,AppError as h}from"./9152.js";import{computeScreenshotDiffPixels as f,PNG as m,toBuffer as w,decodePng as g}from"./9010.js";import{successText as b}from"./1534.js";import{expandRect as y,intersectArea as k,unionRects as v,rectCenter as x,clamp as A,normalizedRect as M,squaredDistance as R}from"./4778.js";import{whichCmd as N,runCmd as I}from"./9818.js";import{buildMobileSnapshotPresentation as P,now as S,sleep as _,formatRole as O,isNodeVisibleInEffectiveViewport as D,formatSnapshotLine as E,shouldScopeFind as C,scrollCommand as T,longPressCommand as U,focusCommand as $,toBackendResult as L,displayLabel as B,swipeCommand as G,resolveInteractionTarget as X,toBackendContext as Y,requireIntInRange as K,pinchCommand as q,buildSnapshotDisplayLines as F}from"./1620.js";import{findSelectorChainMatch as V,extractNodeText as j,findSnapshotAncestor as H,buildSelectorChainForNode as z,resolveSelectorChain as W,findNodeByLabel as J,resolveRefLabel as Z,isNodeVisible as Q,extractReadableText as ee,buildSnapshotNodeByIndex as et,formatSelectorFailure as en,normalizeType as ea,isNodeEditable as er,isFillableType as ei}from"./7847.js";import{findBestMatchesByLocator as es}from"./7556.js";import"./9673.js";import{parseSelectorChain as eo}from"./8407.js";import{resolveAppsFilter as el,assertResolvedAppsFilter as ed}from"./3675.js";let eu=/^-?\d+(\.\d+)?$/,ec=/^[^\s"\\]+$/,ep=new Map([["--count","count"],["--interval-ms","intervalMs"],["--hold-ms","holdMs"],["--jitter-px","jitterPx"]]),eh=new Map([["--count","count"],["--pause-ms","pauseMs"]]),ef=new Map([["--delay-ms","delayMs"]]);function em(e){return"click"===e||"press"===e}function ew(e){return em(e)||"longpress"===e}function eg(e){return"type"===e||"fill"===e}function eb(e){return ek(e,ev)}function ey(e){return JSON.stringify(e)}function ek(e,t){return t(e)?e:ey(e)}function ev(e){return ex(e)&&e.startsWith("@")||eu.test(e)}function ex(e){return ec.test(e)}function eA(e){let t=(e.positionals??[]).map(e=>eb(e));return[e.command,...t].join(" ")}function eM(e,t){let n=t.flags??{};if(em(t.command)){"number"==typeof n.count&&e.push("--count",String(n.count)),"number"==typeof n.intervalMs&&e.push("--interval-ms",String(n.intervalMs)),"number"==typeof n.holdMs&&e.push("--hold-ms",String(n.holdMs)),"number"==typeof n.jitterPx&&e.push("--jitter-px",String(n.jitterPx)),!0===n.doubleTap&&e.push("--double-tap");let t=n.clickButton;t&&"primary"!==t&&e.push("--button",t);return}if("swipe"===t.command){"number"==typeof n.count&&e.push("--count",String(n.count)),"number"==typeof n.pauseMs&&e.push("--pause-ms",String(n.pauseMs)),("one-way"===n.pattern||"ping-pong"===n.pattern)&&e.push("--pattern",n.pattern);return}eg(t.command)&&"number"==typeof n.delayMs&&e.push("--delay-ms",String(n.delayMs))}function eR(e,t){t&&(("ios"===t.platform||"android"===t.platform)&&e.push("--platform",t.platform),"string"==typeof t.metroHost&&t.metroHost.length>0&&e.push("--metro-host",ek(t.metroHost,ex)),"number"==typeof t.metroPort&&e.push("--metro-port",String(t.metroPort)),"string"==typeof t.bundleUrl&&t.bundleUrl.length>0&&e.push("--bundle-url",ek(t.bundleUrl,ex)),"string"==typeof t.launchUrl&&t.launchUrl.length>0&&e.push("--launch-url",ek(t.launchUrl,ex)))}function eN(e,t){let n=[],a={},r=em(e)?ep:"swipe"===e?eh:eg(e)?ef:void 0;for(let i=0;i<t.length;i+=1){let s=t[i];if(em(e)&&"--double-tap"===s){a.doubleTap=!0;continue}let o=t[i+1];if(em(e)&&"--button"===s&&void 0!==o){("primary"===o||"secondary"===o||"middle"===o)&&(a.clickButton=o),i+=1;continue}let l=r?.get(s);if(l&&void 0!==o){let e=eP(o);if(null!==e){a[l]=e,i+=1;continue}}if("swipe"===e&&"--pattern"===s&&void 0!==o){("one-way"===o||"ping-pong"===o)&&(a.pattern=o),i+=1;continue}n.push(s)}return{positionals:n,flags:a}}function eI(e){let t=[],n={};for(let a=0;a<e.length;a+=1){let r=e[a],i=e[a+1];if("--platform"===r&&void 0!==i){("ios"===i||"android"===i)&&(n.platform=i),a+=1;continue}if("--metro-host"===r&&void 0!==i){n.metroHost=i,a+=1;continue}if("--metro-port"===r&&void 0!==i){let e=eP(i);null!==e&&(n.metroPort=e),a+=1;continue}if("--bundle-url"===r&&void 0!==i){n.bundleUrl=i,a+=1;continue}if("--launch-url"===r&&void 0!==i){n.launchUrl=i,a+=1;continue}t.push(r)}return{positionals:t,flags:n}}function eP(e){if(!e)return null;let t=Number(e);return!Number.isFinite(t)||t<0?null:Math.floor(t)}function eS(e){var t;let n=[],a={};for(let t of e){if("--relaunch"===t){a.relaunch=!0;continue}n.push(t)}let r=eI(n);return{positionals:r.positionals,flags:a,runtime:(t=r.flags).platform||t.metroHost||void 0!==t.metroPort||t.bundleUrl||t.launchUrl?r.flags:void 0}}function e_(e,t={}){let n=[e.command];if("snapshot"===e.command)e.flags?.snapshotInteractiveOnly&&n.push("-i"),e.flags?.snapshotCompact&&n.push("-c"),"number"==typeof e.flags?.snapshotDepth&&n.push("-d",String(e.flags.snapshotDepth)),e.flags?.snapshotScope&&n.push("-s",eb(e.flags.snapshotScope)),e.flags?.snapshotRaw&&n.push("--raw");else if("open"===e.command){for(let t of e.positionals??[])n.push(eb(t));e.flags?.relaunch&&n.push("--relaunch"),eR(n,e.runtime)}else if("runtime"===e.command)!function(e,t,n={}){let a=t.positionals??[];for(let t of n.includeAllPositionals?a:a.slice(0,1))e.push(ek(t,ex));eR(e,t.flags)}(n,e,{includeAllPositionals:t.runtimeIncludeAllPositionals});else if("record"===e.command)!function(e,t){let[n,...a]=t.positionals??[];for(let t of(n&&e.push(ek(n,ex)),a))e.push(eb(t));"number"==typeof t.flags?.fps&&e.push("--fps",String(t.flags.fps)),"number"==typeof t.flags?.quality&&e.push("--quality",String(t.flags.quality)),t.flags?.hideTouches&&e.push("--hide-touches")}(n,e);else if("screenshot"===e.command){for(let t of e.positionals??[])n.push(eb(t));i(n,e.flags)}else{for(let t of e.positionals??[])n.push(eb(t));eM(n,e)}return n.join(" ")}let eO=["status","get","dismiss","enter","return"];function eD(e){return eO.includes(e)}function eE(e){let t=e?.trim().split(/\s+/,1)[0];if(!t||!t.startsWith("@")||t.length<3)return null;let n=t.slice(1);return/^[A-Za-z_-]*\d[\w-]*$/i.test(n)||/^(?:ref|node|element|el)[\w-]*$/i.test(n)?t:null}let eC=/\b(logbox|redbox|reload js|copy stack|component stack|call stack|runtime error|open debugger to view warnings)\b/,eT=/\b(redbox|runtime error|reload js|copy stack|component stack|call stack)\b/,eU=[/\b[\w.$<>/-]+\.(?:tsx?|jsx?):\d+(?::\d+)?\b/,/\b[\w.$<>/-]+\.(?:tsx?|jsx?)\s+\(\d+:\d+\)/],e$=[/^!,\s+/,/^(warn|warning|error):\s+/,/\b(?:possible\s+)?unhandled (?:promise )?rejection\b/],eL=["open debugger to view warnings","getsnapshot should be cached to avoid an infinite loop",'unique "key" prop',"unique 'key' prop","virtualizedlists should never be nested","failed prop type"],eB=new Set(["x","\xd7","✕","✖","⨯"]);function eG(e){return eX(e)}function eX(e){var t,n,a,r,i,s,l,d,u,c;let p,h,f,m,w,g,b,y,k=(p=(t=e).map(eF).join("\n").toLowerCase(),h=e1(t,ez),f=e1(t,eJ),m=e1(t,ej,eZ),w=e1(t,eH),g=(n=p,eU.some(e=>e.test(n))),b=eV(p),y=(a=p,r=h,i=f,r.length>0||i.length>0||/\b(reload js|copy stack)\b/.test(a)),{dismissNodes:h,minimizeNodes:f,collapsedNodes:m,redBox:(s=p,l=g,d=y,eT.test(s)||eV(s)||l&&d),detected:(u={text:p,hasReactNativeStackFrame:g,hasOverlayControl:y,hasControllessRedBoxText:b,collapsedNodes:m,openDebuggerWarningNodes:w}).collapsedNodes.length>0||u.openDebuggerWarningNodes.length>0||u.hasControllessRedBoxText||u.hasOverlayControl&&(c=u.text,eC.test(c)||u.hasReactNativeStackFrame)}),v=k.detected?function(e){let t=e4(e.dismissNodes,e2);if(t){let e;var n,a=t,r=(n=t,(e=e5(n)?.trim().toLowerCase())&&eW(e)?"dismiss":"close");if(!a.rect)throw Error("React Native overlay target node must have rect");return{action:r,point:o(a.rect),rect:a.rect,ref:a.ref,label:e5(a)}}let i=e4(e.collapsedNodes.filter(eQ),e3);return i?.rect?{action:"close-collapsed-banner",point:function(e){var t,n;if(!e.rect)throw Error("Collapsed React Native warning node must have rect");let a=Math.min(e.rect.height,52),r=Math.min(36,Math.max(18,.45*a));return{x:Math.round((t=e.rect.x+e.rect.width-r,n=e.rect.x+1,Math.min(e.rect.x+e.rect.width-1,Math.max(n,t)))),y:Math.round(e.rect.y+a/2)}}(i),rect:i.rect,ref:i.ref,label:e5(i)}:null}(k):null;return{detected:k.detected,redBox:k.redBox,dismissNodes:k.dismissNodes,minimizeNodes:k.minimizeNodes,collapsedNodes:k.collapsedNodes,primaryAction:v}}function eY(e){return[...e.dismissNodes,...e.minimizeNodes,...e.collapsedNodes]}function eK(e){var t;return ej(e.label?.trim())&&!!(t=e.rect)&&t.x<=1&&t.y<=1&&t.width>=300&&t.height>=600}function eq(e,t){let n=e.label?.trim();return!!n&&!!eK(e)&&t.some(e=>e.label?.trim()===n&&e0(e))}function eF(e){return[e.label,e.value,e.identifier,e.type,e.role].filter(Boolean).join(" ")}function eV(e){return/\buncaught\b/.test(e)&&/unable to download asset/.test(e)}function ej(e){let t=e?.trim().toLowerCase();return!!t&&(eL.some(e=>t.includes(e))||e$.some(e=>e.test(t)))}function eH(e){return e.includes("open debugger to view warnings")||/^!,\s+open debugger\b/.test(e)}function ez(e){var t,n;return eW(e)||(t=e,/^close(?:\s*\([^)]*\))?$/i.test(t))||(n=e,eB.has(n))}function eW(e){return/^dismiss(?:\s*\([^)]*\))?$/i.test(e)}function eJ(e){return/^minimi[sz]e(?:\b|\s|\()/i.test(e)}function eZ(e){return!e.rect||e.rect.height<=180}function eQ(e){let t=e5(e)?.trim().toLowerCase()??"";return(eH(t)||/^!,\s+/.test(t))&&e0(e)}function e0(e){return!!e.rect&&e.rect.width>=120&&e.rect.height>=36&&e.rect.height<=180}function e1(e,t,n=()=>!0){let a=[];for(let r of e)r.ref&&n(r)&&[r.label,r.value,r.identifier].map(e=>e?.trim().toLowerCase()).filter(e=>!!e).some(e=>t(e))&&a.push(r);return a}function e2(e){var t;let n;return[+(!0===(n=[e.type,e.role,e.subrole].join(" ").toLowerCase(),/\b(button|menuitem|link)\b/.test(n))),+(!0===e.hittable),-((t=e.rect)?t.width*t.height:1/0)]}function e4(e,t){let n=e.filter(e=>e.rect);return 0===n.length?null:n.sort((e,n)=>(function(e,t){for(let n=0;n<e.length;n+=1){let a=e[n]-t[n];if(0!==a)return a}return 0})(t(n),t(e)))[0]??null}function e3(e){return[+(!0===e.hittable),e.rect?.width??0,e.rect?.y??0]}function e5(e){return e.label??e.value??e.identifier}class e8 extends Error{}let e6=null,e9=!1,e7=!1,te=0,tt=new Map;function tn(e){e9=!0,e7||(e7=!0,u({level:"warn",phase:"png_worker_unavailable",data:{reason:e}}),process.emitWarning(`PNG worker unavailable, falling back to in-process PNG processing: ${e}`))}function ta(e){let t=tt.get(e.id);t&&(tt.delete(e.id),ts(),e.ok?t.resolve(e.result):t.reject(new h(p(e.error.code),e.error.message,e.error.details)))}function tr(e,t){e6===e&&(tn(t.message),e6=null,e.terminate().catch(()=>{}),ti(new e8(`PNG worker failed: ${t.message}`)))}function ti(e){let t=[...tt.values()];for(let n of(tt.clear(),t))n.reject(e)}function ts(){e6&&(tt.size>0?e6.ref():e6.unref())}function to(){if(e9)return null;if(e6)return e6;let t=function(t,n){try{let i=r(t),s=a.extname(i)||".js";return[a.join(a.dirname(i),`${n}${s}`),a.join(a.dirname(i),"internal",`${n}${s}`)].find(t=>e.existsSync(t))??null}catch{return null}}(import.meta.url,"png-worker");if(!t)return tn("worker entry module not found next to the current module"),null;try{let e=new n(t,{execArgv:t.endsWith(".ts")?["--experimental-strip-types"]:[]});return e.on("message",ta),e.on("error",t=>{tr(e,t)}),e.on("exit",t=>{tr(e,Error(`PNG worker exited with code ${t}`))}),e.unref(),e6=e,e}catch(e){return tn(`failed to spawn worker: ${e instanceof Error?e.message:String(e)}`),null}}async function tl(e,t){try{return await function(e){let t=to();if(!t)return Promise.reject(new e8("PNG worker is unavailable"));let n=te+=1;return new Promise((a,r)=>{tt.set(n,{resolve:a,reject:r}),ts();try{t.postMessage({...e,id:n})}catch(e){tt.delete(n),ts(),r(new e8(`failed to post job to PNG worker: ${e instanceof Error?e.message:String(e)}`))}})}(e)}catch(e){if(e instanceof e8)return t();throw e}}function td(){to()}async function tu(){let e=e6;e6=null,ti(new e8("PNG worker terminated")),e&&await e.terminate()}async function tc(e,t){let n=await tl({kind:"decode",png:e,label:t},()=>{let n=g(e,t);return{kind:"decode",width:n.width,height:n.height,data:n.data}});return new m({width:n.width,height:n.height,data:w(n.data)})}async function tp(e){return w((await tl({kind:"encode",width:e.width,height:e.height,data:e.data},()=>({kind:"encode",png:m.sync.write(e)}))).png)}async function th(e){let{kind:t,...n}=await tl({kind:"diff-pixels",...e},()=>({kind:"diff-pixels",...f(e)}));return{...n,diffData:w(n.diffData)}}async function tf(e,n){if(!Number.isInteger(n)||n<1)throw new h("INVALID_ARGS","Screenshot max size must be a positive integer");let a=await tc(await t.readFile(e),"screenshot"),r=Math.max(a.width,a.height);if(r<=n)return;let i=n/r,s=Math.max(1,Math.round(a.width*i)),o=Math.max(1,Math.round(a.height*i)),l=function(e,t,n){let a=new m({width:t,height:n});for(let r=0;r<n;r+=1){let i=r*e.height/n,s=(r+1)*e.height/n;for(let n=0;n<t;n+=1){let o=n*e.width/t,l=(n+1)*e.width/t,d=0,u=0,c=0,p=0,h=0;for(let t=Math.floor(i);t<Math.ceil(s);t+=1){let n=Math.min(t+1,s)-Math.max(t,i);for(let a=Math.floor(o);a<Math.ceil(l);a+=1){let r=n*(Math.min(a+1,l)-Math.max(a,o)),i=(t*e.width+a)*4;d+=(e.data[i]??0)*r,u+=(e.data[i+1]??0)*r,c+=(e.data[i+2]??0)*r,p+=(e.data[i+3]??0)*r,h+=r}}let f=(r*a.width+n)*4;a.data[f]=Math.round(d/h),a.data[f+1]=Math.round(u/h),a.data[f+2]=Math.round(c/h),a.data[f+3]=Math.round(p/h)}}return a}(a,s,o);await t.writeFile(e,await tp(l))}async function tm(e,t,n){if("path"===t.kind&&!e.policy.allowLocalInputPaths)throw new h("INVALID_ARGS",`Local ${n.field??"input"} paths are not allowed by command policy`);try{return await e.artifacts.resolveInput(t,n)}catch(e){throw c(e)}}async function tw(e,t,n){if(t?.kind==="path"&&!e.policy.allowLocalOutputPaths)throw new h("INVALID_ARGS","Local output paths are not allowed by command policy");try{return await e.artifacts.reserveOutput(t,{...n,visibility:n.visibility??"client-visible",requestedClientPath:t?.kind==="downloadableArtifact"?t.clientPath??n.requestedClientPath:n.requestedClientPath})}catch(e){throw c(e)}}async function tg(e,t){try{return await e.artifacts.createTempFile(t)}catch(e){throw c(e)}}let tb=async(e,t)=>{let n;if(!e.backend.captureScreenshot)throw new h("UNSUPPORTED_OPERATION","screenshot is not supported by this backend");let a=await tw(e,t.out,{field:"path",ext:".png"});try{await e.backend.captureScreenshot({session:t.session,requestId:t.requestId,appId:t.appId,appBundleId:t.appBundleId,signal:t.signal??e.signal,metadata:t.metadata},a.path,{fullscreen:t.fullscreen,overlayRefs:t.overlayRefs,stabilize:t.stabilize,surface:t.surface}),void 0!==t.maxSize&&await tf(a.path,t.maxSize),n=await a.publish()}catch(e){throw await a.cleanup?.(),e}return{path:a.path,...n?{artifacts:[n]}:{},...b(`Saved screenshot: ${a.path}`)}},ty=[0,187,255,255];function tk(e,t,n,a){if(t<0||t>=e.width||n<0||n>=e.height)return;let r=(n*e.width+t)*4;e.data[r]=a[0],e.data[r+1]=a[1],e.data[r+2]=a[2],e.data[r+3]=a[3]}function tv(e,t,n){return Math.min(Math.max(e,t),n)}let tx=[{x:-1,y:-1},{x:0,y:-1},{x:1,y:-1},{x:-1,y:0},{x:1,y:0},{x:-1,y:1},{x:0,y:1},{x:1,y:1}];function tA(e){let{mask:t,width:n,height:a,hooks:r}=e,i=new Uint8Array(t.length),s=new Int32Array(t.length),o=[];for(let e=0;e<t.length;e+=1){var l,d;if(!tM(t,i,e))continue;let u=0,c=(l=s,i[d=e]=1,l[0]=d,1),p=r.create(e);for(;u<c;){let e=s[u];u+=1,r.visit(p,e),c=function(e){let{mask:t,visited:n,queue:a,width:r,height:i,pixelIndex:s}=e,o=s%r,l=Math.floor(s/r),d=e.queueEnd;for(let e of tx){var u,c,p,h;let s=o+e.x,f=l+e.y;if(u=s,c=f,p=r,h=i,!(u>=0)||!(u<p)||!(c>=0)||!(c<h))continue;let m=f*r+s;tM(t,n,m)&&(d=function(e,t,n,a){return t[a]=1,e[n]=a,n+1}(a,n,d,m))}return d}({mask:t,visited:i,queue:s,queueEnd:c,width:n,height:a,pixelIndex:e})}o.push(p)}return o}function tM(e,t,n){return 1===e[n]&&1!==t[n]}let tR={icon:90,toggle:90,chevron:75,separator:45,visual:35,background:10},tN={leading:20,trailing:20,separator:10,unknown:0,background:-30};function tI(e){return"background"!==e.likelyKind}function tP(e,t){return e.width>=.25*t.width||e.height>=.06*t.height}function tS(e,t){let n,a=0;for(let r of t){let t=tC(e,r.rect);t<=a||(a=t,n=r)}return n}function t_(e){let t=[];for(let n of[...e].sort((e,t)=>e.rect.y-t.rect.y)){let e=t.find(e=>{var t,a;return t=e.rect,tC(t,a=n.rect)>0||Math.abs(x(t).y-x(a).y)<=.5*Math.max(t.height,a.height)});if(!e){t.push({rect:n.rect,blocks:[n]});continue}e.blocks.push(n),e.blocks.sort((e,t)=>e.rect.x-t.rect.x),e.rect=v([e.rect,n.rect])}return t}function tO(e,t){let n,a=x(e);for(let e of t){let t=Math.sqrt(R(a,x(e.rect)));n&&t>=n.distance||(n={block:e,distance:t})}return n}function tD(e){let t=tE(e);return e.differentPixels>=24&&t.width>=3&&t.height>=3}function tE(e){return{x:e.minX,y:e.minY,width:e.maxX-e.minX+1,height:e.maxY-e.minY+1}}function tC(e,t){return Math.max(0,Math.min(e.y+e.height,t.y+t.height)-Math.max(e.y,t.y))}async function tT(e){if(await N("tesseract"))try{let[t,n]=await Promise.all([t$(e.baselinePath),t$(e.currentPath)]);if(0!==t.exitCode||0!==n.exitCode)return;let a=tU(t.stdout,e.width,e.height),r=tU(n.stdout,e.width,e.height),i=function(e,t){let n=new Set,a=[];for(let i of e){var r;let e=tK(i.text),s=function(e,t,n,a){let r=null,i=1/0;for(let s=0;s<n.length;s+=1){if(a.has(s))continue;let o=n[s];if(tK(o.text)!==t)continue;let l=x(e.normalizedRect),d=R(l,x(o.normalizedRect));d>=i||(r=s,i=d)}return r}(i,e,t,n);if(null===s)continue;n.add(s);let o=function(e,t){let n={x:t.rect.x-e.rect.x,y:t.rect.y-e.rect.y,width:t.rect.width-e.rect.width,height:t.rect.height-e.rect.height},a=tV(t.rect.width/e.rect.width),r=tV(t.rect.height/e.rect.height),i=Math.abs(a-1)>=.08||Math.abs(r-1)>=.12;return{text:e.text,baselineRect:e.rect,currentRect:t.rect,delta:n,confidence:Math.round(100*Math.min(e.confidence,t.confidence))/100,possibleTextMetricMismatch:i}}(i,t[s]);r=o,(Math.abs(r.delta.x)>=2||Math.abs(r.delta.y)>=2||Math.abs(r.delta.width)>=2||Math.abs(r.delta.height)>=2||r.possibleTextMetricMismatch)&&a.push(o)}return a.sort((e,t)=>tL(t)-tL(e)).slice(0,12)}(a,r),s=function(e){let t=[];for(let n of[...e].sort((e,t)=>e.currentRect.y-t.currentRect.y)){let e=t.find(e=>32>=Math.abs(n.delta.x-tq(e.map(e=>e.delta.x))));e?e.push(n):t.push([n])}return t.filter(e=>e.length>=2).map(tB).filter(e=>e.yRange.max-e.yRange.min<=60).sort((e,t)=>tG(t)-tG(e)).slice(0,4)}(i);if(0===a.length&&0===r.length)return;return{provider:"tesseract",baselineBlocks:a.length,currentBlocks:r.length,baselineBlocksRaw:a,currentBlocksRaw:r,matches:i,...s.length>0?{movementClusters:s}:{}}}catch{return}}function tU(e,t,n){let[a,...r]=e.split(/\r?\n/);if(!a)return[];let i=new Map(a.split(" ").map((e,t)=>[e,t])),s=[];for(let e of r){var o;if(!e.trim())continue;let t=e.split(" "),n=tY(t,i,"level"),a=tX(t,i,"text").trim(),r=tY(t,i,"conf");if(5!==n||(o=a,!/[\p{L}\p{N}]/u.test(o))||r<0)continue;let l=tY(t,i,"left"),d=tY(t,i,"top"),u=tY(t,i,"width"),c=tY(t,i,"height");u<=0||c<=0||s.push({key:[tX(t,i,"page_num"),tX(t,i,"block_num"),tX(t,i,"par_num"),tX(t,i,"line_num")].join(":"),text:a,confidence:r,rect:{x:l,y:d,width:u,height:c}})}let l=new Map;for(let e of s){let t=l.get(e.key);t?t.push(e):l.set(e.key,[e])}return Array.from(l.values()).flatMap(e=>(function(e){let t=[...e].sort((e,t)=>e.rect.x-t.rect.x),n=[],a=[];for(let e of t){let t=a.at(-1);if(!t){a.push(e);continue}if(e.rect.x-(t.rect.x+t.rect.width)>Math.max(48,2.5*Math.max(t.rect.height,e.rect.height))){n.push(a),a=[e];continue}a.push(e)}return a.length>0&&n.push(a),n})(e)).map(e=>(function(e,t,n){if(0===e.length)return null;let a=[...e].sort((e,t)=>e.rect.x-t.rect.x),r=v(a.map(e=>e.rect)),i=Math.round(100*tq(a.map(e=>e.confidence)))/100;return{text:a.map(e=>e.text).join(" "),confidence:i,rect:r,normalizedRect:M({x:tF(r.x/t),y:tF(r.y/n),width:tF(r.width/t),height:tF(r.height/n)})}})(e,t,n)).filter(e=>null!==e)}function t$(e){return I("tesseract",[e,"stdout","-l","eng","tsv"],{allowFailure:!0,timeoutMs:1e4})}function tL(e){return Math.abs(e.delta.x)+Math.abs(e.delta.y)+Math.abs(e.delta.width)+Math.abs(e.delta.height)+25*!!e.possibleTextMetricMismatch}function tB(e){let t=e.map(e=>e.delta.x),n=e.map(e=>e.delta.y);return{texts:e.map(e=>e.text),xRange:{min:Math.min(...t),max:Math.max(...t)},yRange:{min:Math.min(...n),max:Math.max(...n)}}}function tG(e){return 2*Math.abs((e.xRange.min+e.xRange.max)/2)+Math.abs((e.yRange.min+e.yRange.max)/2)}function tX(e,t,n){let a=t.get(n);return void 0===a?"":e[a]??""}function tY(e,t,n){let a=Number(tX(e,t,n));return Number.isFinite(a)?a:0}function tK(e){return e.trim().replace(/\s+/g," ").toLowerCase()}function tq(e){return e.reduce((e,t)=>e+t,0)/e.length}function tF(e){return Math.round(100*e*100)/100}function tV(e){return Math.round(1e3*e)/1e3}function tj(e,t,n,a){return{r:Math.round(e/a),g:Math.round(t/a),b:Math.round(n/a)}}function tH(e){return .2126*e.r+.7152*e.g+.0722*e.b}function tz(e){return`#${tW(e.r)}${tW(e.g)}${tW(e.b)}`}function tW(e){return e.toString(16).padStart(2,"0")}function tJ(e){return Math.round(100*e*100)/100}let tZ=255*Math.sqrt(3);async function tQ(e,n,r={}){var i,s,o,l,d;let u,c,p,h;await t0(e,"Baseline image not found"),await t0(n,"Current screenshot not found");let f=r.outputPath,[w,g]=await Promise.all([t.readFile(e),t.readFile(n)]),[b,v]=await Promise.all([tc(w,"baseline screenshot"),tc(g,"current screenshot")]);t1(b.width,b.height,"baseline screenshot",r.maxPixels),t1(v.width,v.height,"current screenshot",r.maxPixels);let x=r.threshold??.1;if(b.width!==v.width||b.height!==v.height){let e=b.width*b.height;return await t2(r.outputPath),{match:!1,mismatchPercentage:100,totalPixels:e,differentPixels:e,dimensionMismatch:{expected:{width:b.width,height:b.height},actual:{width:v.width,height:v.height}}}}let R=b.width*b.height,{diffData:N,diffMask:I,differentPixels:P}=await th({width:b.width,height:b.height,baselineData:b.data,currentData:v.data,maxColorDistance:x*tZ}),S=P>0?(s=(u=function(e){let{diffMask:t,baseline:n,current:a}=e,{width:r,height:i}=n;return tA({mask:t,width:r,height:i,hooks:{create:e=>{var t,n;let a,i;return a=(t=e)%(n=r),{minX:a,minY:i=Math.floor(t/n),maxX:a,maxY:i,differentPixels:0,baselineRed:0,baselineGreen:0,baselineBlue:0,currentRed:0,currentGreen:0,currentBlue:0}},visit:(e,t)=>{var i,s,o,l,d;let u,c,p;return i=e,s=t,o=r,l=n,d=a,u=s%o,c=Math.floor(s/o),p=4*s,void(i.minX=Math.min(i.minX,u),i.minY=Math.min(i.minY,c),i.maxX=Math.max(i.maxX,u),i.maxY=Math.max(i.maxY,c),i.differentPixels+=1,i.baselineRed+=l.data[p],i.baselineGreen+=l.data[p+1],i.baselineBlue+=l.data[p+2],i.currentRed+=d.data[p],i.currentGreen+=d.data[p+1],i.currentBlue+=d.data[p+2])}}})}(i={diffMask:I,baseline:b,current:v,totalPixels:R,differentPixels:P,maxRegions:r.maxRegions})).length<=2e3?function(e){let t=[];for(let r of e.sort((e,t)=>{let n=e.minY-t.minY;return 0!==n?n:e.minX-t.minX})){var n,a;let e=t.find(e=>{var t,n,a;return t=e,n=r,a=12,t.minX-a<=n.maxX&&n.minX-a<=t.maxX&&t.minY-a<=n.maxY&&n.minY-a<=t.maxY});if(!e){t.push({...r});continue}n=e,a=r,n.minX=Math.min(n.minX,a.minX),n.minY=Math.min(n.minY,a.minY),n.maxX=Math.max(n.maxX,a.maxX),n.maxY=Math.max(n.maxY,a.maxY),n.differentPixels+=a.differentPixels,n.baselineRed+=a.baselineRed,n.baselineGreen+=a.baselineGreen,n.baselineBlue+=a.baselineBlue,n.currentRed+=a.currentRed,n.currentGreen+=a.currentGreen,n.currentBlue+=a.currentBlue}return t}(u):u,s.flatMap(e=>{var t,n,a;let r;return(t=e,n=i.baseline.width,a=i.baseline.height,r=t.maxX-t.minX+1,t.maxY-t.minY+1>=Math.max(48,Math.round(.07*a))&&r>=.35*n)?function(e,t,n){var a;let r=function(e,t){let n=[],a=null;for(let r=0;r<e.length;r+=1){if(e[r]<=t){a??=r;continue}null!==a&&(r-a>=6&&n.push([a,r-1]),a=null)}return null!==a&&e.length-a>=6&&n.push([a,e.length-1]),n}((a=function(e,t,n){let a=[];for(let r=e.minY;r<=e.maxY;r+=1){let i=0;for(let a=e.minX;a<=e.maxX;a+=1)1===t[r*n+a]&&(i+=1);a.push(i)}return a}(e,t.diffMask,t.baseline.width)).map((e,t)=>{let n=0,r=0,i=Math.max(0,t-3),s=Math.min(a.length-1,t+3);for(let e=i;e<=s;e+=1)n+=a[e],r+=1;return Math.round(n/r)}),Math.max(1,Math.round((e.maxX-e.minX+1)*.08))),i=function(e,t,n){let a=[],r=e.minY;for(let[i,s]of t){let t=e.minY+Math.round((i+s)/2);t-r+1<n||e.maxY-t<n||(a.push([r,t]),r=t+1)}return a.push([r,e.maxY]),a}(e,r,n);if(i.length<=1)return[e];let s=i.map(([n,a])=>(function(e,t,n,a){let r=null;for(let o=t;o<=n;o+=1)for(let t=e.minX;t<=e.maxX;t+=1){var i,s;let e=o*a.baseline.width+t;1===a.diffMask[e]&&function(e,t,n,a,r,i){let s=4*t;e.minX=Math.min(e.minX,n),e.minY=Math.min(e.minY,a),e.maxX=Math.max(e.maxX,n),e.maxY=Math.max(e.maxY,a),e.differentPixels+=1,e.baselineRed+=r.data[s],e.baselineGreen+=r.data[s+1],e.baselineBlue+=r.data[s+2],e.currentRed+=i.data[s],e.currentGreen+=i.data[s+1],e.currentBlue+=i.data[s+2]}(r??={minX:i=t,minY:s=o,maxX:i,maxY:s,differentPixels:0,baselineRed:0,baselineGreen:0,baselineBlue:0,currentRed:0,currentGreen:0,currentBlue:0},e,t,o,a.baseline,a.current)}return r})(e,n,a,t)).filter(e=>null!==e);return s.length>1?s:[e]}(e,i,Math.max(24,Math.round(.03*i.baseline.height))):[e]})).sort((e,t)=>{let n=t.differentPixels-e.differentPixels;if(0!==n)return n;let a=e.minY-t.minY;return 0!==a?a:e.minX-t.minX}).slice(0,Math.max(0,i.maxRegions??8)).map((e,t)=>{var n,a,r,s,o,l,d,u,c,p,h;let f,m,w,g,b,y,k,v,x,A,R,N,I,P,S,_,O;return n=e,a=t+1,r={width:i.baseline.width,height:i.baseline.height,totalPixels:i.totalPixels,differentPixels:i.differentPixels},y={x:n.minX,y:n.minY,width:n.maxX-n.minX+1,height:n.maxY-n.minY+1},k={x:Math.round(n.minX+y.width/2),y:Math.round(n.minY+y.height/2)},v=tj(n.baselineRed,n.baselineGreen,n.baselineBlue,n.differentPixels),x=tj(n.currentRed,n.currentGreen,n.currentBlue,n.differentPixels),A=y.width*y.height,R=tJ(n.differentPixels/A),N=Math.round(tH(v)),I=Math.round(tH(x)),P=(s=y,o=r.width,l=r.height,s.width>=.55*o&&s.height>=.12*l?"large-area":s.width>=2.5*s.height?"horizontal-band":s.height>=2.5*s.width?"vertical-band":"compact"),S=(f=A/r.totalPixels)>=.04?"large":f>=.01?"medium":"small",_=(d=v,u=x,m=tH(d),Math.abs(w=tH(u)-m)>=12?w>0?"brighter":"darker":Math.max(Math.abs(u.r-d.r),Math.abs(u.g-d.g),Math.abs(u.b-d.b))>=12?"color-shift":"mixed"),O=(c=k,p=r.width,h=r.height,g=c.x<p/3?"left":c.x>2*p/3?"right":"center",b=c.y<h/3?"top":c.y>2*h/3?"bottom":"middle","center"===g&&"middle"===b?"center":`${b}-${g}`),{index:a,rect:y,normalizedRect:M({x:tJ(y.x/r.width),y:tJ(y.y/r.height),width:tJ(y.width/r.width),height:tJ(y.height/r.height)}),differentPixels:n.differentPixels,shareOfDiffPercentage:tJ(n.differentPixels/r.differentPixels),densityPercentage:R,shape:P,size:S,location:O,averageBaselineColorHex:tz(v),averageCurrentColorHex:tz(x),baselineLuminance:N,currentLuminance:I,dominantChange:_}}):[];if(P>0&&f){let e=new m({width:b.width,height:b.height,data:N});for(let t of S)t.rect.width<4||t.rect.height<4||function(e,t){let n=tv(t.x,0,e.width-1),a=tv(t.y,0,e.height-1),r=tv(t.x+t.width-1,0,e.width-1),i=tv(t.y+t.height-1,0,e.height-1);for(let t=0;t<2;t+=1){for(let s=n;s<=r;s+=1)tk(e,s,a+t,ty),tk(e,s,i-t,ty);for(let s=a;s<=i;s+=1)tk(e,n+t,s,ty),tk(e,r-t,s,ty)}}(e,t.rect);await t.mkdir(a.dirname(f),{recursive:!0}),await t.writeFile(f,await tp(e))}else await t2(r.outputPath);let _=P>0?await tT({baselinePath:e,currentPath:n,width:b.width,height:b.height}):void 0,O=_&&(_.matches.length>0||(_.movementClusters?.length??0)>0)?{provider:_.provider,baselineBlocks:_.baselineBlocks,currentBlocks:_.currentBlocks,matches:_.matches,..._.movementClusters?{movementClusters:_.movementClusters}:{}}:void 0,D=P>0&&_?(c=function(e){let t=[];for(let n of e.sort((e,t)=>e.minY-t.minY||e.minX-t.minX)){let e=t.find(e=>{var t,a,r;return t=e,a=n,r=10,t.minX-r<=a.maxX&&a.minX-r<=t.maxX&&t.minY-r<=a.maxY&&a.minY-r<=t.maxY});if(!e){t.push({...n});continue}e.minX=Math.min(e.minX,n.minX),e.minY=Math.min(e.minY,n.minY),e.maxX=Math.max(e.maxX,n.maxX),e.maxY=Math.max(e.maxY,n.maxY),e.differentPixels+=n.differentPixels}return t}((l=function(e,t,n,a){let r=new Uint8Array(e);if(!a)return r;for(let e of[...a.baselineBlocksRaw,...a.currentBlocksRaw])!function(e,t,n,a){let r=A(Math.floor(a.x),0,t-1),i=A(Math.floor(a.y),0,n-1),s=A(Math.ceil(a.x+a.width),0,t),o=A(Math.ceil(a.y+a.height),0,n);for(let n=i;n<o;n+=1)for(let a=r;a<s;a+=1)e[n*t+a]=0}(r,t,n,y(e.rect,8));return r}((o={diffMask:I,width:b.width,height:b.height,regions:S,ocr:_}).diffMask,o.width,o.height,o.ocr),d=o.width,tA({mask:l,width:d,height:o.height,hooks:{create:e=>{var t,n;let a,r;return a=(t=e)%(n=d),{minX:a,minY:r=Math.floor(t/n),maxX:a,maxY:r,differentPixels:0}},visit:(e,t)=>{var n,a,r;let i,s;return n=e,i=(a=t)%(r=d),s=Math.floor(a/r),void(n.minX=Math.min(n.minX,i),n.minY=Math.min(n.minY,s),n.maxX=Math.max(n.maxX,i),n.maxY=Math.max(n.maxY,s),n.differentPixels+=1)}}}))),p=t_(o.ocr?.currentBlocksRaw??[]),h=t_(o.ocr?.baselineBlocksRaw??[]),c.filter(tD).map(e=>{var t,n,a,r,i,s,l,d,u,c,f;let m,w,g,b,y,v,x,A,M,R;return t=e,n=o,a=p,r=h,b=function(e,t){let n,a=0;for(let r of t){let t=k(e,r.rect);t<=a||(a=t,n=r)}return n?.index}(g=tE(t),n.regions),y=function(e,t,n){let a=tS(e,t);if(a)return tO(e,a.blocks);let r=tS(e,n);return r?tO(e,r.blocks):void 0}(g,a,r),v=function(e,t,n){if(e.height<=3&&e.width>=.12*n)return"separator";if(!t)return e.width>=.4*n?"background":"unknown";if(e.width>=.4*n)return"background";let a=e.x+e.width/2,r=t.x+t.width/2;return a<r-t.width/2?"leading":a>r+t.width/2?"trailing":e.width>=.35*n?"background":"unknown"}(g,y?.block.rect,n.width),x=(i=g,s=v,l=t.differentPixels,d=n,m=i.width/i.height,w=l/(i.width*i.height),"separator"===s?"separator":"background"===s?"background":"trailing"===s&&m>=1.5&&m<=3.8&&w>=.35?"toggle":"trailing"===s&&i.width<=.06*d.width&&i.height<=.04*d.height?"chevron":"leading"===s&&m>=.55&&m<=1.8?"icon":tP(i,d)?"background":"visual"),A={...b?{regionIndex:b}:{},slot:v,likelyKind:x,rect:g},{...b?{regionIndex:b}:{},slot:v,likelyKind:x,rect:g,...y?{nearestText:y.block.text.trim().replace(/^[^\p{L}\p{N}]+/u,"").replace(/^\p{L}\s+/u,"")}:{},score:(u=A,c=t.differentPixels,f=n,M=tP(u.rect,f)?-35:0,R=20*!!u.regionIndex,tR[u.likelyKind]+tN[u.slot]+R+M+Math.min(20,c/200))}}).filter(e=>e.rect.y>=.08*o.height).filter(tI).sort((e,t)=>t.score-e.score).slice(0,Math.max(0,o.maxDeltas??12)).map((e,t)=>{var n;return n=e,{index:t+1,...n.regionIndex?{regionIndex:n.regionIndex}:{},slot:n.slot,likelyKind:n.likelyKind,rect:n.rect,...n.nearestText?{nearestText:n.nearestText}:{}}})):[],E=R>0?Math.round(P/R*1e4)/100:0;return{...P>0&&f?{diffPath:f}:{},...S.length>0?{regions:S}:{},...O?{ocr:O}:{},...D.length>0?{nonTextDeltas:D}:{},totalPixels:R,differentPixels:P,mismatchPercentage:E,match:0===P}}async function t0(e,n){try{await t.access(e)}catch{throw new h("INVALID_ARGS",`${n}: ${e}`)}}function t1(e,t,n,a){if(null==a||a<=0)return;let r=e*t;if(!(r<=a))throw new h("INVALID_ARGS",`${n} is ${r} pixels, which exceeds the configured maxImagePixels limit of ${a}`)}async function t2(e){if(e)try{await t.unlink(e)}catch(e){var n;if(!("object"==typeof(n=e)&&null!==n&&"code"in n&&"ENOENT"===n.code))throw e}}function t4(e){return e.width*e.height}function t3(e){return Math.round(100*e*100)/100}async function t5(e,t){let n=await tg(e,{prefix:"agent-device-diff-current",ext:".png"});try{await t6(e,t,n.path,t9(t))}catch(e){throw await n.cleanup(),e}return n}async function t8(e,t,n,a,r){var i,s,o,l;if(!t.overlayRefs)return a;if(a.match||a.dimensionMismatch)return n&&await ne(n),a;let d=(i=t,s=n,i.currentOverlayOut?i.currentOverlayOut:i.out?.kind==="path"?{kind:"path",path:t7(s??i.out.path)}:i.out?.kind==="downloadableArtifact"?{kind:"downloadableArtifact",...i.out.clientPath?{clientPath:t7(i.out.clientPath)}:{},...i.out.fileName?{fileName:t7(i.out.fileName)}:{}}:void 0),u=await tw(e,d,{field:"currentOverlayPath",ext:".png"});try{let n=await t6(e,t,u.path,{overlayRefs:!0,...t9(t)}),i=await u.publish();return i&&r.push(i),{...a,currentOverlayPath:n.path??u.path,...n.overlayRefs?{currentOverlayRefCount:n.overlayRefs.length}:{},...a.regions&&n.overlayRefs?{regions:(o=a.regions,l=n.overlayRefs,o.map(e=>{var t,n;let a,r=(t=e,n=l,a=t4(t.rect),n.map(e=>{let n=e.overlayRect,r=k(t.rect,n);return r<=0?null:{ref:e.ref,...e.label?{label:e.label}:{},rect:n,overlayCoveragePercentage:t3(r/t4(n)),regionCoveragePercentage:t3(r/a)}}).filter(e=>null!==e).sort((e,t)=>{let n=t.regionCoveragePercentage-e.regionCoveragePercentage;return 0!==n?n:t.overlayCoveragePercentage-e.overlayCoveragePercentage}).slice(0,3).map(e=>({ref:e.ref,...e.label?{label:e.label}:{},rect:e.rect,regionCoveragePercentage:e.regionCoveragePercentage})));return r.length>0?{...e,currentOverlayMatches:r}:e}))}:{}}}catch(e){throw await u.cleanup?.(),e}}async function t6(e,t,n,a={}){if(!e.backend.captureScreenshot)throw new h("UNSUPPORTED_OPERATION","screenshot is not supported by this backend");return await e.backend.captureScreenshot({session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata},n,a)??{}}function t9(e){return e.surface?{surface:e.surface}:{}}function t7(e){let t=a.extname(e),n=t?e.slice(0,-t.length):e;return`${n}.current-overlay${t||".png"}`}async function ne(e){try{await t.unlink(t7(e))}catch(e){var n;if(!("object"==typeof(n=e)&&null!==n&&"code"in n&&"ENOENT"===n.code))throw e}}function nt(e){return"live"===e.kind}function nn(e,t){let n=O(e.type??"Element"),a=B(e,n),r=!1===e.enabled?"disabled":"enabled",i=!0===e.selected?"selected":"unselected",s=!0===e.hittable?"hittable":"not-hittable";return[String(t??e.depth??0),n,a,r,i,s].join("|")}function na(e,t){return t.flatten?e.map(e=>({text:E(e,0,!1),comparable:nn(e,0)})):F(e).map(e=>({text:e.text,comparable:nn(e.node,e.depth)}))}function nr(e,t){return e.get(t)??0}function ni(e){return e.map(e=>({index:e.index,depth:e.depth,parentIndex:e.parentIndex,type:e.type,role:e.role,subrole:e.subrole,label:e.label,value:e.value,identifier:e.identifier,enabled:e.enabled,selected:e.selected,focused:e.focused,hittable:e.hittable,rect:e.rect,bundleId:e.bundleId,appName:e.appName,windowTitle:e.windowTitle,surface:e.surface,hiddenContentAbove:e.hiddenContentAbove,hiddenContentBelow:e.hiddenContentBelow,interactionBlocked:e.interactionBlocked,presentationHints:e.presentationHints}))}async function ns(e,t){var n,a,r,i,s,o;let d,u,c,p;if(!e.backend.captureSnapshot)throw new h("UNSUPPORTED_OPERATION","snapshot is not supported by this backend");let f=t.session??"default",m=await e.sessions.get(f),w=await e.backend.captureSnapshot({session:f,requestId:t.requestId,appId:m?.appId,appBundleId:m?.appBundleId,signal:t.signal??e.signal,metadata:t.metadata},{interactiveOnly:t.interactiveOnly,compact:t.compact,depth:t.depth,scope:t.scope,raw:t.raw}),g=(a=w,r=e,n=a.snapshot?a.snapshot:{nodes:a.nodes??[],truncated:a.truncated,backend:a.backend,createdAt:S(r)},n.presentationKey?n:{...n,presentationKey:l(t)}),b=S(e);return{snapshot:g,result:w,session:m,warnings:((d=[...(i={result:w,snapshot:g,options:t,session:m,capturedAt:g.createdAt??b,runtimeNow:b}).result.warnings??[]]).push(...function(e){let t=e.result.analysis;if("android"!==e.snapshot.backend||!0!==e.options.interactiveOnly||e.snapshot.nodes.length>0||!t||(t.rawNodeCount??0)<12)return[];let n=[`Interactive snapshot is empty after filtering ${t.rawNodeCount} raw Android nodes. Likely causes: the app content is not accessibility-visible yet, a transient route change, or depth/filter options hid the target.`];return"number"==typeof e.options.depth&&"number"==typeof t.maxDepth&&t.maxDepth>=e.options.depth+2&&n.push(`Interactive output is empty at depth ${e.options.depth}; retry without -d.`),n}(i)),d.push(...function(e){if("xctest"!==e.snapshot.backend||!0!==e.options.interactiveOnly||!0!==e.options.compact||1!==e.snapshot.nodes.length)return[];let t=e.snapshot.nodes[0];return t?.type!=="Application"?[]:["iOS compact interactive snapshot exposed only the application root. XCTest typed accessibility queries can fail to enumerate some simulator UI trees even when screenshots and direct gestures still work. Use screenshot as visual truth, try a scoped/full snapshot for diagnostics, and prefer direct selectors when known."]}(i)),(u=function(e){if(e?.backend!=="uiautomator-dump")return;let t=e.fallbackReason?` Reason: ${e.fallbackReason}`:"";return`Android snapshot helper unavailable; using stock UIAutomator dump, which can time out on busy React Native UIs.${t}`}(i.result.androidSnapshot))&&d.push(u),(c=function(e){if(eX(e).detected)return"Hint: React Native warning/error overlay detected. It overlays part of the app and should be handled before interacting.\nRun: agent-device react-native dismiss-overlay\nThe command verifies the overlay is gone. Run agent-device snapshot -i -c afterward only when you need fresh refs for the next action."}(i.snapshot.nodes))&&d.push(c),(p=function(e){var t,n,a,r,i,s;let o=e.session?.snapshot;if(!e.result.freshness&&o&&(t=o,n=e.snapshot,void 0===t.presentationKey||void 0===n.presentationKey||t.presentationKey===n.presentationKey)&&(a=o,r=e.capturedAt,[r,e.runtimeNow].some(e=>{let t=e-a.createdAt;return t>=0&&t<=2e3}))&&(i=o.nodes.length,s=e.snapshot.nodes.length,!(i<12)&&s<=Math.floor(.2*i)))return nl}(i))&&d.push(p),d.push(...(s=i.result.freshness,o=i.snapshot.backend,s?.staleAfterRetries&&"android"===o?"stuck-route"===s.reason?[`Recent ${s.action} was followed by a nearly identical snapshot after ${s.retryCount} automatic retr${1===s.retryCount?"y":"ies"}. If you expected navigation or submit, the tree may still be stale. Use screenshot as visual truth, wait briefly, then re-snapshot once.`]:"sharp-drop"===s.reason?[nl]:[]:[])),Array.from(new Set(d)))}}function no(e,t){let n=t.session?.name??e??"default";return{...t.session??{name:n},name:n,snapshot:t.snapshot,appName:t.result.appName??t.session?.appName,appBundleId:t.result.appBundleId??t.session?.appBundleId}}let nl="Recent snapshots dropped sharply in node count, which suggests stale or mid-transition UI. Use screenshot as visual truth, wait briefly, then re-snapshot once.";function nd(e){return["visible","hidden","exists","editable","selected","text"].includes(e)}function nu(e){let{predicate:t,node:n,nodes:a,expectedText:r,platform:i}=e,s=j(n),o=er(n,i),l=!0===n.selected,d="text"===t?Q(n):function(e,t,n){var a,r,i;let s;if("android"===n&&!1===e.visibleToUser)return!1;if(nc(e.rect))return function(e,t){return D(e,t)}(e,t);if(e.rect)return!1;if("android"!==n&&!0===e.hittable)return!0;let o=(a=e,r=t,i=n,s=et(r),H(r,a,s,e=>!function(e,t){if("android"===t&&!1===e.visibleToUser)return!1;let n=ea(e.type??"");return!(n.includes("application")||n.includes("window")||n.includes("scrollview")||n.includes("tableview")||n.includes("collectionview"))&&"table"!==n&&"list"!==n&&"listview"!==n&&("android"===t?!0===e.hittable&&nc(e.rect):!0===e.hittable||nc(e.rect))}(e,i)?null:e));return!!o&&(nc(o.rect)?function(e,t){return D(e,t)}(o,t):"android"!==n&&!0===o.hittable)}(n,a,i),u=!1;switch(t){case"visible":u=d;break;case"hidden":u=!d;break;case"editable":u=o;break;case"selected":u=l;break;case"text":u=s===(r??"")}let c="text"===t?`expected="${r??""}" actual="${s}"`:`actual=${JSON.stringify({visible:d,editable:o,selected:l})}`;return{pass:u,actualText:s,details:c}}function nc(e){return!!(e&&Number.isFinite(e.x)&&Number.isFinite(e.y)&&Number.isFinite(e.width)&&Number.isFinite(e.height)&&e.width>0&&e.height>0)}async function np(e,t){let n=t??"default",a=await e.sessions.get(n);if(!a)throw new h("SESSION_NOT_FOUND","No active session. Run open first.");if(!a.snapshot)throw new h("INVALID_ARGS","No snapshot in session. Run snapshot first.");return{sessionName:n,session:a,snapshot:a.snapshot}}async function nh(e,t,n={updateSession:!0}){let a=e.backend.captureSnapshot;if(!a)throw new h("UNSUPPORTED_OPERATION","snapshot is not supported by this backend");let r=t.session??"default",i=await e.sessions.get(r),s=await a(Y(e,t),{interactiveOnly:!1,compact:!1,depth:t.depth,scope:n.scope??t.scope,raw:t.raw}),o=s.snapshot??{nodes:s.nodes??[],truncated:s.truncated,backend:s.backend,createdAt:S(e)};return n.updateSession&&i&&await e.sessions.set({...i,snapshot:o}),{sessionName:r,session:i,snapshot:o}}async function nf(e,t,n){if(e.backend.readText){let a=await e.backend.readText(Y(e,{session:t.sessionName}),n);if(a.text.trim())return a.text}return ee(n)}let nm=async(e,t)=>{if("ref"===t.target.kind){let n=await np(e,t.session),a=function(e,t,n){let a=s(t);if(!a)throw new h("INVALID_ARGS",n.invalidRefMessage);let r=d(e,a)??(n.fallbackLabel.length>0?J(e,n.fallbackLabel):null);if(!r)throw new h("COMMAND_FAILED",n.notFoundMessage);return{ref:a,node:r}}(n.snapshot.nodes,t.target.ref,{fallbackLabel:t.target.fallbackLabel??"",invalidRefMessage:"get text requires a ref like @e2",notFoundMessage:`Ref ${t.target.ref} not found`}),r=z(a.node,e.backend.platform,{action:"get"}),i={kind:"ref",ref:`@${a.ref}`};return"attrs"===t.property?{kind:"attrs",target:i,node:a.node,selectorChain:r}:{kind:"text",target:i,text:await nf(e,n,a.node),node:a.node,selectorChain:r}}let n=await nP(e,t,t.session??"default",{selector:t.target.selector,disambiguateAmbiguous:"text"===t.property}),a=z(n.node,e.backend.platform,{action:"get"});if("attrs"===t.property)return{kind:"attrs",target:{kind:"selector",selector:n.selector},node:n.node,selectorChain:a};let r=await nf(e,n.capture,n.node);return{kind:"text",target:{kind:"selector",selector:n.selector},text:r,node:n.node,selectorChain:a}},nw=async(e,t)=>{let n=await nm(e,{...t,property:"text",target:t.target});if("text"!==n.kind)throw new h("COMMAND_FAILED","getText returned non-text result");return n},ng=async(e,t)=>{let n=await nm(e,{...t,property:"attrs",target:t.target});if("attrs"!==n.kind)throw new h("COMMAND_FAILED","getAttrs returned non-attrs result");return n},nb=async(e,t)=>{if(!nd(t.predicate))throw new h("INVALID_ARGS","is requires predicate: visible|hidden|exists|editable|selected|text");if("text"===t.predicate&&!t.expectedText)throw new h("INVALID_ARGS","is text requires expected text value");let n=await nh(e,t,{updateSession:!0}),a=eo(t.selector);if("exists"===t.predicate){let r=V(n.snapshot.nodes,a,{platform:e.backend.platform});if(!r)throw new h("COMMAND_FAILED",en(a,[],{unique:!1}));return{predicate:t.predicate,pass:!0,selector:r.selector.raw,matches:r.matches,selectorChain:a.selectors.map(e=>e.raw)}}let r=W(n.snapshot.nodes,a,{platform:e.backend.platform,requireRect:!1,requireUnique:!0,disambiguateAmbiguous:!1});if(!r)throw new h("COMMAND_FAILED",en(a,[],{unique:!0}),{command:"is",reason:"selector_not_found",predicate:t.predicate,selector:a.raw});let i=nu({predicate:t.predicate,node:r.node,nodes:n.snapshot.nodes,expectedText:t.expectedText,platform:e.backend.platform});if(!i.pass)throw new h("COMMAND_FAILED",`is ${t.predicate} failed for selector ${r.selector.raw}: ${i.details}`,{command:"is",reason:"predicate_failed",predicate:t.predicate,selector:r.selector.raw,predicateDetails:i.details});return{predicate:t.predicate,pass:!0,selector:r.selector.raw,..."text"===t.predicate?{text:i.actualText}:{},selectorChain:a.selectors.map(e=>e.raw)}},ny=async(e,t)=>await nb(e,{...t,predicate:"visible",selector:t.target.selector}),nk=async(e,t)=>await nb(e,{...t,predicate:"hidden",selector:t.target.selector}),nv=async(e,t)=>{if("sleep"===t.target.kind)return await _(e,t.target.durationMs),{kind:"sleep",waitedMs:t.target.durationMs};if("ref"===t.target.kind){let n=await np(e,t.session),a=s(t.target.ref);if(!a)throw new h("INVALID_ARGS",`Invalid ref: ${t.target.ref}`);let r=d(n.snapshot.nodes,a),i=r?Z(r,n.snapshot.nodes):void 0;if(!i)throw new h("COMMAND_FAILED",`Ref ${t.target.ref} not found or has no label`);return await nN(e,t,i,t.target.timeoutMs)}if("selector"===t.target.kind)return await nR(e,t,t.target.selector,t.target.timeoutMs);if(!t.target.text)throw new h("INVALID_ARGS","wait requires text");return await nN(e,t,t.target.text,t.target.timeoutMs)},nx=async(e,t)=>{let n=await nv(e,{...t,target:{kind:"text",text:t.text,timeoutMs:t.timeoutMs}});if("text"!==n.kind)throw new h("COMMAND_FAILED","waitForText returned non-text result");return n};async function nA(e,t,n){let a=t.timeoutMs??1e4,r=S(e);for(;S(e)-r<a;){let{match:a}=await nM(e,t,n);if(a)return{kind:"found",found:!0,waitedMs:S(e)-r};await _(e,300)}throw new h("COMMAND_FAILED","find wait timed out")}async function nM(e,t,n){let a=await nh(e,t,{updateSession:!0,scope:C(n)?t.query:void 0}),r=es(a.snapshot.nodes,n,t.query,{requireRect:!1}).matches[0];return{capture:a,match:r}}async function nR(e,t,n,a){let r=a??1e4,i=S(e),s=eo(n);for(;S(e)-i<r;){let n=V((await nh(e,t,{updateSession:!0})).snapshot.nodes,s,{platform:e.backend.platform});if(n)return{kind:"selector",selector:n.selector.raw,waitedMs:S(e)-i};await _(e,300)}throw new h("COMMAND_FAILED",`wait timed out for selector: ${n}`)}async function nN(e,t,n,a){let r=a??1e4,i=S(e);for(;S(e)-i<r;){if(e.backend.findText?(await e.backend.findText(Y(e,t),n)).found:await nI(e,t,n))return{kind:"text",text:n,waitedMs:S(e)-i};await _(e,300)}throw new h("COMMAND_FAILED",`wait timed out for text: ${n}`)}async function nI(e,t,n){return!!J((await nh(e,t,{updateSession:!0})).snapshot.nodes,n)}async function nP(e,t,n,a){let r=await nh(e,{...t,session:n},{updateSession:!0}),i=eo(a.selector),s=W(r.snapshot.nodes,i,{platform:e.backend.platform,requireRect:!1,requireUnique:!0,disambiguateAmbiguous:a.disambiguateAmbiguous});if(!s)throw new h("COMMAND_FAILED",en(i,[],{unique:!0}));return{capture:r,node:s.node,selector:s.selector.raw,ref:`@${s.node.ref}`}}async function nS(e,t,n){let a=await X(e,t,{action:n,requireInteractive:!0,promoteToHittableAncestor:!0});if(!e.backend.tap)throw new h("UNSUPPORTED_OPERATION","tap is not supported by this backend");let r=L(await e.backend.tap(Y(e,t),a.point,{button:t.button,count:t.count,intervalMs:t.intervalMs,holdMs:t.holdMs,jitterPx:t.jitterPx,doubleTap:t.doubleTap}));return{...a,...r?{backendResult:r}:{}}}function n_(e,t){if(void 0!==e)return nO(e,t)}function nO(e,t){let n=e?.trim();if(!n)throw new h("INVALID_ARGS",`${t} must be a non-empty string`);return n}let nD=/^[A-Za-z0-9_.:-]{1,64}$/;async function nE(e,t){if(!t||"object"!=typeof t)throw new h("INVALID_ARGS","apps.push requires an input");if("json"===t.kind)return nC(t.payload,"apps.push JSON payload",8192),{backendInput:{kind:"json",payload:t.payload},inputKind:"json"};let n=await tm(e,t,{usage:"apps.push",field:"input"});return{backendInput:{kind:"file",path:n.path},inputKind:"file",...n.cleanup?{cleanup:n.cleanup}:{}}}function nC(e,t,n){if(function(e,t){if(!e||"object"!=typeof e||Array.isArray(e))throw new h("INVALID_ARGS",`${t} must be a JSON object`)}(e,t),Buffer.byteLength(function(e,t){try{let n=JSON.stringify(e);if("string"!=typeof n)throw new h("INVALID_ARGS",`${t} must be JSON-serializable`);return n}catch{throw new h("INVALID_ARGS",`${t} must be JSON-serializable`)}}(e,t),"utf8")>n)throw new h("INVALID_ARGS",`${t} exceeds ${n} bytes`)}function nT(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}async function nU(e,t,n){let a="reinstall"===n?"reinstallApp":"installApp",r=e.backend[a];if(!r)throw new h("UNSUPPORTED_OPERATION",`admin.${n} is not supported by this backend`);let i="app"in t&&void 0!==t.app?nO(t.app,"app"):void 0;if("installFromSource"!==n&&!i)throw new h("INVALID_ARGS",`admin.${n} requires app`);let s=Y(e,t),o=await n$(e,s,t.source);try{var l,d,u,c,p;let t,a,h,f,m,w,g,y,k=await r.call(e.backend,s,{...i?{app:i}:{},source:o.source});return l=n,d=i,u=o.source,c=k,t=L(c),a=nX(c,"appName"),h=nX(c,"appId"),f=nX(c,"bundleId"),m=nX(c,"packageName"),w=nX(c,"launchTarget"),g=nX(c,"installablePath"),y=nX(c,"archivePath"),{kind:"reinstall"===l?"appReinstalled":"installFromSource"===l?"appInstalledFromSource":"appInstalled",...d?{app:d}:{},source:u,...h?{appId:h}:{},...a?{appName:a}:{},...f?{bundleId:f}:{},...m?{packageName:m}:{},...w?{launchTarget:w}:{},...g?{installablePath:g}:{},...y?{archivePath:y}:{},...t?{backendResult:t}:{},...b(`${"reinstall"===l?"Reinstalled":"Installed"}: ${a??w??d??(p=u,"path"===p.kind?p.path:"uploadedArtifact"===p.kind?p.id:p.url)}`)}}finally{await o.cleanup?.()}}async function n$(e,t,n){let a=nB(n),r=await nL(e,a);try{let n=e.backend.resolveInstallSource?await e.backend.resolveInstallSource(t,r.source):r.source;return{source:nB(n),...r.cleanup?{cleanup:r.cleanup}:{}}}catch(e){if(r.cleanup)try{await r.cleanup()}catch{}throw e}}async function nL(e,t){if("url"===t.kind)return{source:t};let n=await tm(e,t,{usage:"admin.install",field:"source"});return{source:{kind:"path",path:n.path},...n.cleanup?{cleanup:n.cleanup}:{}}}function nB(e){if(!e||"object"!=typeof e)throw new h("INVALID_ARGS","install source is required");if("path"===e.kind)return{kind:"path",path:nO(e.path,"source.path")};if("uploadedArtifact"===e.kind)return{kind:"uploadedArtifact",id:nO(e.id,"source.id")};if("url"===e.kind){let t=nO(e.url,"source.url");return function(e){let t;try{t=new URL(e)}catch{throw new h("INVALID_ARGS",`Invalid install source URL: ${e}`)}if("http:"!==t.protocol&&"https:"!==t.protocol)throw new h("INVALID_ARGS","Install source URL must use http or https")}(t),{kind:"url",url:t}}throw new h("INVALID_ARGS","install source kind must be path, uploadedArtifact, or url")}function nG(e){if(!e)return;let t=n_(e.id,"target.id"),n=n_(e.name,"target.name"),a={...t?{id:t}:{},...n?{name:n}:{},...e.platform?{platform:e.platform}:{},...e.target?{target:e.target}:{},...void 0!==e.headless?{headless:e.headless}:{}};return Object.keys(a).length>0?a:void 0}function nX(e,t){let n=e[t];return"string"==typeof n&&n.length>0?n:void 0}function nY(e,t){if("start"===e||"stop"===e)return e;throw new h("INVALID_ARGS",`${t} action must be start or stop`)}function nK(e,t,n,a){return{kind:"start"===e?a.startKind:a.stopKind,action:e,...n?{artifact:n}:{},backendResult:t,...b("start"===e?a.startMessage:a.stopMessage)}}let nq=/(?:authorization|cookie|token|secret|password|passwd|api[-_]?key)/i,nF=/\b[A-Za-z0-9_-]{16,}\.[A-Za-z0-9_-]{16,}\.[A-Za-z0-9_-]{16,}\b/g;function nV(e){var t,n;let a=!1,r=e;return{value:(t=r=(r=(r=(r=(r=r.replaceAll(/(authorization|token|secret|password|passwd|api[-_]?key)=([^&\s]+)/gi,(e,t)=>(a=!0,`${String(t)}=[REDACTED]`))).replaceAll(/("(?:authorization|cookie|token|secret|password|passwd|api[-_]?key)"\s*:\s*")([^"]*)(")/gi,(e,t,n,r)=>(a=!0,`${String(t)}[REDACTED]${String(r)}`))).replaceAll(/\b(Bearer\s+)([^\s",;]+)/gi,(e,t)=>(a=!0,`${String(t)}[REDACTED]`))).replaceAll(/((?:authorization|cookie|token|secret|password|passwd|api[-_]?key)\s*[:=]\s*)([^\s,;&]+)/gi,(e,t)=>(a=!0,`${String(t)}[REDACTED]`))).replaceAll(nF,()=>(a=!0,"[REDACTED]")),n=()=>{a=!0},r=/(https?:\/\/|token|secret|password|authorization|cookie|api[-_]?key)/i.test(t)?t.replaceAll(/https?:\/\/[^\s"'<>)]+/gi,e=>{let t=nj(e);return t?(t.redacted&&n(),t.value):e}):t),redacted:a}}function nj(e){try{let t=new URL(e),n=function(e){let t=!1;for(let n of Array.from(e.searchParams.keys()))nq.test(n)&&(e.searchParams.set(n,"[REDACTED]"),t=!0);return t}(t);return(t.username||t.password)&&(t.username="REDACTED",t.password="REDACTED",n=!0),{value:t.toString(),redacted:n}}catch{return}}let nH=/(?:authorization|cookie|token|secret|password|passwd|api[-_]?key)/i;function nz(e){if(!e)return{redacted:!1};let t=!1,n={};for(let[a,r]of Object.entries(e))if(nH.test(a))n[a]="[REDACTED]",t=!0;else{let e=nQ(r,2048);n[a]=e.value??"",t||=e.redacted}return{value:n,redacted:t}}function nW(e){return void 0===e?{redacted:!1}:function(e){try{let t=JSON.parse(e),n=nZ(t,nV);return n0(JSON.stringify(n.value),2048,n.redacted)}catch{return}}(e)??nQ(e,2048)}function nJ(e){return nZ(e,e=>nQ(e,2048))}function nZ(e,t){if(void 0===e)return{redacted:!1};if("string"==typeof e)return t(e);if(!e||"object"!=typeof e)return{value:e,redacted:!1};if(Array.isArray(e)){let n=!1;return{value:e.map(e=>{let a=nZ(e,t);return n||=a.redacted,a.value}),redacted:n}}let n=!1,a={};for(let[r,i]of Object.entries(e)){if(nH.test(r)){a[r]="[REDACTED]",n=!0;continue}let e=nZ(i,t);a[r]=e.value,n||=e.redacted}return{value:a,redacted:n}}function nQ(e,t){if(void 0===e)return{redacted:!1};let n=nV(e);return n0(n.value,t,n.redacted)}function n0(e,t,n){if(void 0===e)return{redacted:n};let a=e;return a.length>t&&(a=`${a.slice(0,t)}...[truncated]`,n=!0),{value:a,redacted:n}}async function n1(e,t){let n=Y(e,t),a=t.session?await e.sessions.get(t.session):void 0;return{...n,...t.appId??a?.appId?{appId:t.appId??a?.appId}:{},...t.appBundleId??a?.appBundleId?{appBundleId:t.appBundleId??a?.appBundleId}:{}}}function n2(e,t,n,a){return{...n4(e),...void 0!==e.cursor?{cursor:nO(e.cursor,"cursor")}:{},limit:void 0===e.limit?t:K(e.limit,a,1,n)}}function n4(e){return{...void 0!==e.since?{since:nO(e.since,"since")}:{},...void 0!==e.until?{until:nO(e.until,"until")}:{}}}function n3(e,t,n=50){if(!Array.isArray(e))throw new h("INVALID_ARGS",`${t} must be an array of strings`);if(e.length>n)throw new h("INVALID_ARGS",`${t} must contain at most ${n} entries`);return e.map((e,n)=>nO(e,`${t}[${n}]`))}let n5=tb,n8=async(e,t)=>{let n,a,r;if(!t.baseline)throw new h("INVALID_ARGS","diff screenshot requires a baseline image");let i=function(e){if(null==e||""===e)return .1;let t=Number(e);if(Number.isNaN(t)||t<0||t>1)throw new h("INVALID_ARGS","--threshold must be a number between 0 and 1");return t}(t.threshold),s=t.current??{kind:"live"};if(t.overlayRefs&&!nt(s))throw new h("INVALID_ARGS","diff screenshot <current.png> cannot use --overlay-refs because saved-image comparisons have no live accessibility refs");let o=await tm(e,t.baseline,{usage:"diff screenshot baseline",field:"baseline"}),l=[];try{let d;d=nt(s)?(a=await t5(e,t)).path:(n=await tm(e,s,{usage:"diff screenshot current",field:"current"})).path,r=t.out?await tw(e,t.out,{field:"diffPath",ext:".png"}):void 0;let u=await tQ(o.path,d,{threshold:i,outputPath:r?.path,maxPixels:e.policy.maxImagePixels});nt(s)&&(u=await t8(e,t,r?.path,u,l));let c=u.diffPath?await r?.publish():void 0;return c&&l.push(c),u.diffPath||await r?.cleanup?.(),{...u,...l.length>0?{artifacts:l}:{}}}catch(e){throw await r?.cleanup?.(),e}finally{await o.cleanup?.(),await n?.cleanup?.(),await a?.cleanup?.()}},n6=async(e,t)=>{var n;let a,r,i=await ns(e,t),s=function(e){var t,n,a,r,i;let{previous:s,current:o,options:l,identity:d}=e;if(!0===l.forceFull||!0===l.raw||!s||!1===s.comparisonSafe||!1===o.comparisonSafe||(t=s,n=o,a=d,t.backend&&n.backend&&t.backend!==n.backend||a?.previousAppBundleId&&a.currentAppBundleId&&a.previousAppBundleId!==a.currentAppBundleId)||!s.presentationKey||s.presentationKey!==o.presentationKey||(r=s,i=o,r.truncated!==i.truncated||JSON.stringify(ni(r.nodes))!==JSON.stringify(ni(i.nodes))))return;let u=l.scope?.trim();return{ageMs:Math.max(0,o.createdAt-s.createdAt),nodeCount:o.nodes.length,...!0===l.interactiveOnly?{interactiveOnly:!0}:{},...u?{scope:u}:{}}}({previous:i.session?.snapshot,current:i.snapshot,options:t,identity:{previousAppBundleId:i.session?.appBundleId,currentAppBundleId:i.result.appBundleId??i.session?.appBundleId}});return await e.sessions.set(no(t.session,i)),{nodes:i.snapshot.nodes,truncated:i.snapshot.truncated??!1,visibility:function(e){var t;let{nodes:n,backend:a,snapshotRaw:r}=e;if(r||"macos-helper"===(t=a)||"linux-atspi"===t)return{partial:!1,visibleNodeCount:n.length,totalNodeCount:n.length,reasons:[]};let i=P(n),s=new Set;return i.hiddenCount>0&&s.add("offscreen-nodes"),i.nodes.some(e=>e.hiddenContentAbove)&&s.add("scroll-hidden-above"),i.nodes.some(e=>e.hiddenContentBelow)&&s.add("scroll-hidden-below"),{partial:s.size>0,visibleNodeCount:i.nodes.length,totalNodeCount:n.length,reasons:[...s]}}({nodes:i.snapshot.nodes,backend:i.snapshot.backend,snapshotRaw:t.raw}),...i.result.androidSnapshot?{androidSnapshot:i.result.androidSnapshot}:{},...i.warnings.length>0?{warnings:i.warnings}:{},...s?{unchanged:s}:{},...(a=(n=i).result.appName??n.session?.appName,r=n.result.appBundleId??n.session?.appBundleId,{...a||r?{appName:a??r}:{},...r?{appBundleId:r}:{}})}},n9=async(e,t)=>{let n=await ns(e,t),a=!0===t.interactiveOnly,r=n.session?.snapshot,i=no(t.session,n);if(!r){let t=function(e,t={}){return na(e,t).length}(n.snapshot.nodes,{flatten:a});return await e.sessions.set(i),{mode:"snapshot",baselineInitialized:!0,summary:{additions:0,removals:0,unchanged:t},lines:[],...n.warnings.length>0?{warnings:n.warnings}:{}}}let s=function(e,t,n={}){let a=function(e,t){let n=e.length,a=t.length,r=n+a,i=new Map,s=[];i.set(1,0);for(let o=0;o<=r;o+=1){s.push(new Map(i));for(let r=-o;r<=o;r+=2){let l=r===-o||r!==o&&nr(i,r-1)<nr(i,r+1)?nr(i,r+1):nr(i,r-1)+1,d=l-r;for(;l<n&&d<a&&e[l].comparable===t[d].comparable;)l+=1,d+=1;if(i.set(r,l),l>=n&&d>=a)return function(e,t,n,a,r){let i=[],s=a,o=r;for(let a=e.length-1;a>=0;a-=1){let r=e[a],l=s-o,d=l===-a||l!==a&&nr(r,l-1)<nr(r,l+1)?l+1:l-1,u=nr(r,d),c=u-d;for(;s>u&&o>c;)i.push({kind:"unchanged",text:n[o-1].text}),s-=1,o-=1;if(0===a)break;s===u?(i.push({kind:"added",text:n[c].text}),o=c):(i.push({kind:"removed",text:t[u].text}),s=u)}return i.reverse(),i}(s,e,t,n,a)}}return[]}(na(e,n),na(t,n)),r={additions:0,removals:0,unchanged:0};for(let e of a)"added"===e.kind&&(r.additions+=1),"removed"===e.kind&&(r.removals+=1),"unchanged"===e.kind&&(r.unchanged+=1);return{summary:r,lines:a}}(r.nodes,n.snapshot.nodes,{flatten:a});return await e.sessions.set(i),{mode:"snapshot",baselineInitialized:!1,summary:s.summary,lines:s.lines,...n.warnings.length>0?{warnings:n.warnings}:{}}},n7=async(e,t)=>{let n=t.locator??"any";if(!t.query)throw new h("INVALID_ARGS","find requires a value");if("wait"===t.action)return await nA(e,t,n);let{capture:a,match:r}=await nM(e,t,n);if(!r)throw new h("COMMAND_FAILED","find did not match any element");if("exists"===t.action)return{kind:"found",found:!0};let i=`@${r.ref}`;return"get_attrs"===t.action?{kind:"attrs",ref:i,node:r}:{kind:"text",ref:i,text:await nf(e,a,r),node:r}},ae=nm,at=nw,an=ng,aa=nb,ar=ny,ai=nk,as=nv,ao=nx,al=async(e,t)=>await nS(e,t,"click"),ad=async(e,t)=>await nS(e,t,"press"),au=async(e,t)=>{var n;if(!t.text)throw new h("INVALID_ARGS","fill requires text");let a=await X(e,t,{action:"fill",requireInteractive:!0,promoteToHittableAncestor:!1});if(!e.backend.fill)throw new h("UNSUPPORTED_OPERATION","fill is not supported by this backend");let r=L(await e.backend.fill(Y(e,t),a.point,t.text,{delayMs:t.delayMs})),i="node"in a?a.node.type??"":"",s=i&&!ei(i,e.backend.platform)?`fill target ${n=a,n.target?.kind==="ref"?n.target.ref:n.target?.kind==="selector"?n.target.selector:"point"} resolved to "${i}", attempting fill anyway.`:void 0;return{...a,text:t.text,...s?{warning:s}:{},...r?{backendResult:r}:{}}},ac=async(e,t)=>{let n=t.text;if(!n)throw new h("INVALID_ARGS","type requires text");let a=eE(n);if(a)throw new h("INVALID_ARGS",`type does not accept a target ref like "${a}"`,{hint:`Use fill ${a} "text" to target that field, or press ${a} then type "text" to append.`});if(!e.backend.typeText)throw new h("UNSUPPORTED_OPERATION","type is not supported by this backend");let r=K(t.delayMs??0,"delay-ms",0,1e4),i=L(await e.backend.typeText(Y(e,t),n,{delayMs:r}));return{kind:"text",text:n,delayMs:r,...i?{backendResult:i}:{},...b(`Typed ${Array.from(n).length} chars`)}},ap=$,ah=U,af=G,am=T,aw=q,ag=async(e,t={})=>{if(!e.backend.pressBack)throw new h("UNSUPPORTED_OPERATION","system.back is not supported by this backend");let n=t.mode??"in-app";if("in-app"!==n&&"system"!==n)throw new h("INVALID_ARGS","system.back mode must be in-app or system");let a=L(await e.backend.pressBack(Y(e,t),{mode:n}));return{kind:"systemBack",mode:n,...a?{backendResult:a}:{},...b("Back")}},ab=async(e,t={})=>{if(!e.backend.pressHome)throw new h("UNSUPPORTED_OPERATION","system.home is not supported by this backend");let n=L(await e.backend.pressHome(Y(e,t)));return{kind:"systemHome",...n?{backendResult:n}:{},...b("Home")}},ay=async(e,t)=>{if(!e.backend.rotate)throw new h("UNSUPPORTED_OPERATION","system.rotate is not supported by this backend");let n=function(e){switch(e){case"portrait":case"portrait-upside-down":case"landscape-left":case"landscape-right":return e;default:throw new h("INVALID_ARGS","system.rotate orientation must be portrait, portrait-upside-down, landscape-left, or landscape-right")}}(t.orientation),a=L(await e.backend.rotate(Y(e,t),n));return{kind:"systemRotated",orientation:n,...a?{backendResult:a}:{},...b(`Rotated to ${n}`)}},ak=async(e,t={})=>{var n,a,r,i,s,o,l;if(!e.backend.setKeyboard)throw new h("UNSUPPORTED_OPERATION","system.keyboard is not supported by this backend");let d=t.action??"status";if(!eD(d))throw new h("INVALID_ARGS","system.keyboard action must be status, get, dismiss, enter, or return");let u=await e.backend.setKeyboard(Y(e,t),{action:d}),c=L(u),p=(n=u)&&"object"==typeof n?u:{};return"enter"===d||"return"===d?{kind:"keyboardEnterPressed",action:"enter",state:p,...(a=c)?{backendResult:a}:{},...b("Keyboard enter pressed")}:"dismiss"===d?(r=d,{kind:"keyboardDismissed",action:r,state:i=p,...(s=c)?{backendResult:s}:{},...b(!1===i.dismissed?"Keyboard already hidden":"Keyboard dismissed")}):(o=d,{kind:"keyboardState",action:o,state:p,...(l=c)?{backendResult:l}:{}})},av=async(e,t)=>{if("read"===t.action){if(!e.backend.getClipboard)throw new h("UNSUPPORTED_OPERATION","system.clipboard read is not supported by this backend");let n=await e.backend.getClipboard(Y(e,t));return{kind:"clipboardText",action:"read",text:"string"==typeof n?n:n.text}}if("write"!==t.action)throw new h("INVALID_ARGS","system.clipboard action must be read or write");if(!e.backend.setClipboard)throw new h("UNSUPPORTED_OPERATION","system.clipboard write is not supported by this backend");if("string"!=typeof t.text)throw new h("INVALID_ARGS","system.clipboard write requires text");let n=L(await e.backend.setClipboard(Y(e,t),t.text));return{kind:"clipboardUpdated",action:"write",textLength:Array.from(t.text).length,...n?{backendResult:n}:{},...b("Clipboard updated")}},ax=async(e,t={})=>{if(!e.backend.openSettings)throw new h("UNSUPPORTED_OPERATION","system.settings is not supported by this backend");let n=n_(t.target,"target"),a=L(await e.backend.openSettings(Y(e,t),n));return{kind:"settingsOpened",...n?{target:n}:{},...a?{backendResult:a}:{},...b(n?`Opened settings: ${n}`:"Opened settings")}},aA=async(e,t={})=>{var n,a;if(!e.backend.handleAlert)throw new h("UNSUPPORTED_OPERATION","system.alert is not supported by this backend");let r=t.action??"get";if("get"!==r&&"accept"!==r&&"dismiss"!==r&&"wait"!==r)throw new h("INVALID_ARGS","system.alert action must be get, accept, dismiss, or wait");let i=void 0===t.timeoutMs?void 0:K(t.timeoutMs,"timeoutMs",0,12e4),s=await e.backend.handleAlert(Y(e,t),r,{timeoutMs:i});return n=r,a=s,"get"===n?function(e){if("alertStatus"!==e.kind)throw new h("COMMAND_FAILED","system.alert get returned an invalid backend result");return{kind:"alertStatus",action:"get",alert:e.alert}}(a):"wait"===n?function(e){if("alertWait"!==e.kind)throw new h("COMMAND_FAILED","system.alert wait returned an invalid backend result");return{kind:"alertWait",action:"wait",alert:e.alert,...void 0!==e.waitedMs?{waitedMs:e.waitedMs}:{},...void 0!==e.timedOut?{timedOut:e.timedOut}:{},...b(e.alert?"Alert visible":"Alert wait timed out")}}(a):function(e,t){if("alertHandled"!==t.kind)throw new h("COMMAND_FAILED",`system.alert ${e} returned an invalid backend result`);return{kind:"alertHandled",action:e,handled:t.handled,...t.alert?{alert:t.alert}:{},...t.button?{button:t.button}:{},...b(t.handled?`Alert ${e}ed`:"No alert handled")}}(n,a)},aM=async(e,t={})=>{if(!e.backend.openAppSwitcher)throw new h("UNSUPPORTED_OPERATION","system.appSwitcher is not supported by this backend");let n=L(await e.backend.openAppSwitcher(Y(e,t)));return{kind:"appSwitcherOpened",...n?{backendResult:n}:{},...b("Opened app switcher")}},aR=async(e,t)=>{var n;if(!e.backend.openApp)throw new h("UNSUPPORTED_OPERATION","apps.open is not supported by this backend");let a=function(e){var t;let n=n_(e.app,"app"),a=n_(e.appId,"appId"),r=n_(e.bundleId,"bundleId"),i=n_(e.packageName,"packageName"),s=n_(e.url,"url"),o=n_(e.activity,"activity"),l={...n?{app:n}:{},...a?{appId:a}:{},...r?{bundleId:r}:{},...i?{packageName:i}:{},...s?{url:s}:{},...o?{activity:o}:{}};if(!((t=l).app??t.appId??t.bundleId??t.packageName??t.url??t.activity))throw new h("INVALID_ARGS","apps.open requires app, appId, bundleId, packageName, url, or activity");return l}(t),r=L(await e.backend.openApp(nT(e,t),a,{launchArgs:t.launchArgs,relaunch:t.relaunch}));return{kind:"appOpened",target:a,relaunch:!0===t.relaunch,...r?{backendResult:r}:{},...b(`Opened: ${(n=a).app??n.appId??n.bundleId??n.packageName??n.url??n.activity??"app"}`)}},aN=async(e,t={})=>{if(!e.backend.closeApp)throw new h("UNSUPPORTED_OPERATION","apps.close is not supported by this backend");let n=n_(t.app,"app"),a=L(await e.backend.closeApp(nT(e,t),n));return{kind:"appClosed",...n?{app:n}:{},...a?{backendResult:a}:{},...b(n?`Closed: ${n}`:"Closed app")}},aI=async(e,t={})=>{if(!e.backend.listApps)throw new h("UNSUPPORTED_OPERATION","apps.list is not supported by this backend");return{kind:"appsList",apps:await e.backend.listApps(nT(e,t),ed(t.filter))}},aP=async(e,t)=>{if(!e.backend.getAppState)throw new h("UNSUPPORTED_OPERATION","apps.state is not supported by this backend");let n=nO(t.app,"app"),a=await e.backend.getAppState(nT(e,t),n);return{kind:"appState",app:n,state:a}},aS=async(e,t)=>{if(!e.backend.pushFile)throw new h("UNSUPPORTED_OPERATION","apps.push is not supported by this backend");let n=nO(t.app,"app"),a=await nE(e,t.input);try{let r=await e.backend.pushFile(nT(e,t),a.backendInput,n),i=L(r);return{kind:"appPushed",app:n,inputKind:a.inputKind,...i?{backendResult:i}:{},...b(`Pushed to ${n}`)}}finally{await a.cleanup?.()}},a_=async(e,t)=>{var n,a;if(!e.backend.triggerAppEvent)throw new h("UNSUPPORTED_OPERATION","apps.triggerEvent is not supported by this backend");let r=function(e){let t=nO(e,"name");if(!nD.test(t))throw new h("INVALID_ARGS",`Invalid apps.triggerEvent name: ${t}`,{hint:"Use 1-64 chars: letters, numbers, underscore, dot, colon, or dash."});return t}(t.name);n=t.payload,a=`apps.triggerEvent payload for "${r}"`,void 0!==n&&nC(n,a,8192);let i=L(await e.backend.triggerAppEvent(nT(e,t),{name:r,...t.payload?{payload:t.payload}:{}}));return{kind:"appEventTriggered",name:r,...t.payload?{payload:t.payload}:{},...i?{backendResult:i}:{},...b(`Triggered app event: ${r}`)}},aO=async(e,t={})=>{if(!e.backend.listDevices)throw new h("UNSUPPORTED_OPERATION","admin.devices is not supported by this backend");return{kind:"adminDevices",devices:await e.backend.listDevices(Y(e,t),t.filter)}},aD=async(e,t={})=>{if(!e.backend.bootDevice)throw new h("UNSUPPORTED_OPERATION","admin.boot is not supported by this backend");let n=nG(t.target),a=L(await e.backend.bootDevice(Y(e,t),n));return{kind:"deviceBooted",...n?{target:n}:{},...a?{backendResult:a}:{},...b("Booted device")}},aE=async(e,t={})=>{if(!e.backend.shutdownDevice)throw new h("UNSUPPORTED_OPERATION","admin.shutdown is not supported by this backend");let n=nG(t.target),a=L(await e.backend.shutdownDevice(Y(e,t),n));return{kind:"deviceShutdown",...n?{target:n}:{},...a?{backendResult:a}:{},...b("Shutdown device")}},aC=async(e,t)=>await nU(e,t,"install"),aT=async(e,t)=>await nU(e,t,"reinstall"),aU=async(e,t)=>await nU(e,t,"installFromSource"),a$=async(e,t)=>{let n=nY(t.action,"record"),a="start"===n?e.backend.startRecording:e.backend.stopRecording;if(!a)throw new h("UNSUPPORTED_OPERATION",`record ${n} is not supported by this backend`);let r=t.out?await tw(e,t.out,{field:"path",ext:".mp4"}):void 0;try{var i,s,o,l,d;let u,c,p=(i=t,s=r?.path,u=void 0===i.fps?void 0:K(i.fps,"fps",1,60),c=void 0===i.quality?void 0:K(i.quality,"quality",5,10),{...s?{outPath:s}:{},...void 0!==u?{fps:u}:{},...void 0!==c?{quality:c}:{},...void 0!==i.hideTouches?{showTouches:!0!==i.hideTouches}:{}}),h=await a.call(e.backend,Y(e,t),p),f=await r?.publish();return o=n,l=h,d=f,{..."string"==typeof l.path?{path:l.path}:{},..."string"==typeof l.telemetryPath?{telemetryPath:l.telemetryPath}:{},..."string"==typeof l.warning?{warning:l.warning}:{},...nK(o,l,d,{startKind:"recordingStarted",stopKind:"recordingStopped",startMessage:"Recording started",stopMessage:"Recording stopped"})}}catch(e){throw await r?.cleanup?.(),e}},aL=async(e,t)=>{let n=nY(t.action,"trace"),a="start"===n?e.backend.startTrace:e.backend.stopTrace;if(!a)throw new h("UNSUPPORTED_OPERATION",`trace ${n} is not supported by this backend`);let r=t.out?await tw(e,t.out,{field:"outPath",ext:".trace"}):void 0;try{var i,s,o;let l={...r?.path?{outPath:r.path}:{}},d=await a.call(e.backend,Y(e,t),l),u=await r?.publish();return i=n,s=d,o=u,{..."string"==typeof s.outPath?{outPath:s.outPath}:{},...nK(i,s,o,{startKind:"traceStarted",stopKind:"traceStopped",startMessage:"Trace started",stopMessage:"Trace stopped"})}}catch(e){throw await r?.cleanup?.(),e}},aB=async(e,t={})=>{var n,a;let r;if(!e.backend.readLogs)throw new h("UNSUPPORTED_OPERATION","diagnostics.logs is not supported by this backend");return r=!0===(n=await e.backend.readLogs(await n1(e,t),{...n2(a=t,100,500,"logs limit"),...void 0!==a.levels?{levels:n3(a.levels,"levels")}:{},...void 0!==a.search?{search:nO(a.search,"search")}:{},...void 0!==a.source?{source:nO(a.source,"source")}:{}})).redacted,{kind:"diagnosticsLogs",entries:n.entries.map(e=>{let t=nQ(e.message,4096),n=nJ(e.metadata);return r||=t.redacted||n.redacted,{...e.timestamp?{timestamp:e.timestamp}:{},...e.level?{level:e.level}:{},message:t.value??"",...e.source?{source:e.source}:{},...n.value?{metadata:n.value}:{}}}),...n.nextCursor?{nextCursor:n.nextCursor}:{},...n.timeWindow?{timeWindow:n.timeWindow}:{},...n.backend?{backend:n.backend}:{},redacted:r,...n.notes?{notes:n.notes}:{}}},aG=async(e,t={})=>{var n,a,r;let i;if(!e.backend.dumpNetwork)throw new h("UNSUPPORTED_OPERATION","diagnostics.network is not supported by this backend");let s={...n2(r=t,25,200,"network limit"),include:function(e){if(void 0===e)return"summary";if("summary"===e||"headers"===e||"body"===e||"all"===e)return e;throw new h("INVALID_ARGS","network include must be summary, headers, body, or all")}(r.include)};return n=await e.backend.dumpNetwork(await n1(e,t),s),a=s.include??"summary",i=!0===n.redacted,{kind:"diagnosticsNetwork",entries:n.entries.map(e=>{var t;let n=e.url?nj(t=e.url)??nQ(t,2048):void 0,r="headers"===a||"all"===a?nz(e.requestHeaders):void 0,s="headers"===a||"all"===a?nz(e.responseHeaders):void 0,o="body"===a||"all"===a?nW(e.requestBody):void 0,l="body"===a||"all"===a?nW(e.responseBody):void 0,d=nJ(e.metadata);return i||=(n?.redacted??!1)||(r?.redacted??!1)||(s?.redacted??!1)||(o?.redacted??!1)||(l?.redacted??!1)||d.redacted,{...e.timestamp?{timestamp:e.timestamp}:{},...e.method?{method:e.method}:{},...n?{url:n.value}:{},...void 0!==e.status?{status:e.status}:{},...void 0!==e.durationMs?{durationMs:e.durationMs}:{},...r?.value?{requestHeaders:r.value}:{},...s?.value?{responseHeaders:s.value}:{},...o?.value!==void 0?{requestBody:o.value}:{},...l?.value!==void 0?{responseBody:l.value}:{},...d.value?{metadata:d.value}:{}}}),...n.nextCursor?{nextCursor:n.nextCursor}:{},...n.timeWindow?{timeWindow:n.timeWindow}:{},...n.backend?{backend:n.backend}:{},redacted:i,...n.notes?{notes:n.notes}:{}}},aX=async(e,t={})=>{var n,a;let r;if(!e.backend.measurePerf)throw new h("UNSUPPORTED_OPERATION","diagnostics.perf is not supported by this backend");return r=!0===(n=await e.backend.measurePerf(await n1(e,t),{...n4(a=t),...void 0!==a.sampleMs?{sampleMs:K(a.sampleMs,"sampleMs",100,6e4)}:{},...void 0!==a.metrics?{metrics:n3(a.metrics,"metrics",20)}:{}})).redacted,{kind:"diagnosticsPerf",metrics:n.metrics.map(e=>{let t=nQ(e.message,4096),n=nJ(e.metadata);return r||=t.redacted||n.redacted,{name:e.name,...void 0!==e.value?{value:e.value}:{},...e.unit?{unit:e.unit}:{},...e.status?{status:e.status}:{},...void 0!==t.value?{message:t.value}:{},...n.value?{metadata:n.value}:{}}}),...n.startedAt?{startedAt:n.startedAt}:{},...n.endedAt?{endedAt:n.endedAt}:{},...n.backend?{backend:n.backend}:{},redacted:r,...n.notes?{notes:n.notes}:{}}};function aY(e){let t={backend:e.backend,artifacts:e.artifacts,sessions:e.sessions??function(e=[]){let t=new Map(e.map(e=>[e.name,aK(e)]));return{get:e=>aK(t.get(e)),set:e=>{t.set(e.name,aK(e))},delete:e=>{t.delete(e)},list:()=>Array.from(t.values(),e=>aK(e))}}(),policy:e.policy??function(e={}){return{allowLocalInputPaths:!1,allowLocalOutputPaths:!1,maxImagePixels:2e7,allowNamedBackendCapabilities:[],...e}}(),diagnostics:e.diagnostics,clock:e.clock,signal:e.signal};return{...t,capture:{screenshot:e=>n5(t,e),diffScreenshot:e=>n8(t,e),snapshot:e=>n6(t,e),diffSnapshot:e=>n9(t,e)},selectors:{find:e=>n7(t,e),get:e=>ae(t,e),getText:(e,n={})=>at(t,{...n,target:e}),getAttrs:(e,n={})=>an(t,{...n,target:e}),is:e=>aa(t,e),isVisible:(e,n={})=>ar(t,{...n,target:e}),isHidden:(e,n={})=>ai(t,{...n,target:e}),wait:e=>as(t,e),waitForText:(e,n={})=>ao(t,{...n,text:e})},interactions:{click:(e,n={})=>al(t,{...n,target:e}),press:(e,n={})=>ad(t,{...n,target:e}),fill:(e,n,a={})=>au(t,{...a,target:e,text:n}),typeText:(e,n={})=>ac(t,{...n,text:e}),focus:(e,n={})=>ap(t,{...n,target:e}),longPress:(e,n={})=>ah(t,{...n,target:e}),swipe:e=>af(t,e),scroll:e=>am(t,e),pinch:e=>aw(t,e)},system:{back:e=>ag(t,e),home:e=>ab(t,e),rotate:e=>ay(t,e),keyboard:e=>ak(t,e),clipboard:e=>av(t,e),settings:e=>ax(t,e),alert:e=>aA(t,e),appSwitcher:e=>aM(t,e)},apps:{open:e=>aR(t,e),close:e=>aN(t,e),list:(e={})=>aI(t,{...e,filter:el(e.filter)}),state:e=>aP(t,e),push:e=>aS(t,e),triggerEvent:e=>a_(t,e)},admin:{devices:e=>aO(t,e),boot:e=>aD(t,e),shutdown:e=>aE(t,e),install:e=>aC(t,e),reinstall:e=>aT(t,e),installFromSource:e=>aU(t,e)},recording:{record:e=>a$(t,e),trace:e=>aL(t,e)},observability:{logs:e=>aB(t,e),network:e=>aG(t,e),perf:e=>aX(t,e)}}}function aK(e){if(e)return{...e,...e.snapshot?{snapshot:structuredClone(e.snapshot)}:{},...e.metadata?{metadata:function(e){try{return structuredClone(e)}catch{return{...e}}}(e.metadata)}:{}}}function aq(e={}){return{allowLocalInputPaths:!0,allowLocalOutputPaths:!0,maxImagePixels:2e7,allowNamedBackendCapabilities:[],...e}}export{eX as analyzeReactNativeOverlay,eM as appendScriptSeriesFlags,aY as createAgentDevice,tc as decodePngAsync,eG as detectReactNativeOverlay,tp as encodePngAsync,nu as evaluateIsPredicate,eE as findMistargetedTypeRefToken,e_ as formatPortableActionLine,eA as formatScriptActionSummary,eb as formatScriptArg,ey as formatScriptStringLiteral,em as isClickLikeCommand,eD as isKeyboardAction,eK as isReactNativeCollapsedWarningWrapperCandidate,eq as isReactNativeCollapsedWarningWrapperWithVisibleBanner,nd as isSupportedPredicate,ew as isTouchTargetCommand,aq as localCommandPolicy,eS as parseReplayOpenFlags,eI as parseReplayRuntimeFlags,eN as parseReplaySeriesFlags,td as prewarmPngWorker,eY as readReactNativeOverlayActionNodes,tu as terminatePngWorker};
|
package/dist/src/1352.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var e;import{AppError as s}from"./9152.js";import{SCREENSHOT_SPECIFIC_FLAG_DEFINITIONS as t,SCREENSHOT_COMMAND_FLAG_KEYS as a}from"./5310.js";import{DEFAULT_APPS_FILTER as o}from"./1393.js";import{listCommandDescriptionMetadata as r}from"./2805.js";let i="<wifi|airplane|location> <on|off>",n="location set <lat> <lon>",l="animations <on|off>",p="appearance <light|dark|toggle>",u="faceid <match|nonmatch|enroll|unenroll>",c="touchid <match|nonmatch|enroll|unenroll>",d="fingerprint <match|nonmatch>",m="clear-app-state [app-id]",g="permission <grant|deny|reset> <camera|microphone|photos|contacts|contacts-limited|notifications|calendar|location|location-always|media-library|motion|reminders|siri> [full|limited]",h="permission <grant|reset> <accessibility|screen-recording|input-monitoring>",y=`macOS supports only settings ${p} and settings ${h}. wifi|airplane|location|animations remain unsupported on macOS.`,f=`settings ${i} | settings ${n} | settings ${l} | settings ${p} | settings ${u} | settings ${c} | settings ${d} | settings ${m} | settings ${g} | settings ${h}`,b=`settings requires ${i}, ${n}, ${l}, ${p}, ${u}, ${c}, ${d}, ${m}, ${g}, or ${h}`;function k(e){let s=e.trim().toLowerCase();return"appearance"===s||"permission"===s}function v(e){return`Unsupported macOS setting: ${e}. ${y}`}let D=["app","frontmost-app","desktop","menubar"];function w(e){let t=e?.trim().toLowerCase();if("app"===t||"frontmost-app"===t||"desktop"===t||"menubar"===t)return t;throw new s("INVALID_ARGS",`Invalid surface: ${e}. Use ${D.join("|")}.`)}let L="https://github.com/callstackincubator/agent-device/issues/558",O="https://github.com/callstackincubator/agent-device/issues/new";function S(...e){return e}let x=S("snapshotInteractiveOnly","snapshotCompact","snapshotDepth","snapshotScope","snapshotRaw"),A=S("snapshotDepth","snapshotScope","snapshotRaw"),M=S("metroProjectRoot","metroKind","metroPublicBaseUrl","metroProxyBaseUrl","metroBearerToken","metroPreparePort","metroListenHost","metroStatusHost","metroStartupTimeoutMs","metroProbeTimeoutMs","metroRuntimeFile","metroNoReuseExisting","metroNoInstallDeps"),E=S("metroHost","metroPort","bundleUrl"),R=S("count","intervalMs","holdMs","jitterPx","doubleTap"),U=S("replayUpdate","replayEnv"),P=[{key:"config",names:["--config"],type:"string",usageLabel:"--config <path>",usageDescription:"Load CLI defaults from a specific config file"},{key:"remoteConfig",names:["--remote-config"],type:"string",usageLabel:"--remote-config <path>",usageDescription:"Load remote host + Metro workflow settings from a specific profile file"},{key:"stateDir",names:["--state-dir"],type:"string",usageLabel:"--state-dir <path>",usageDescription:"Daemon state directory (defaults to ~/.agent-device)"},{key:"daemonBaseUrl",names:["--daemon-base-url"],type:"string",usageLabel:"--daemon-base-url <url>",usageDescription:"Explicit remote HTTP daemon base URL (skip local daemon discovery/startup)"},{key:"daemonAuthToken",names:["--daemon-auth-token"],type:"string",usageLabel:"--daemon-auth-token <token>",usageDescription:"Remote HTTP daemon auth token (sent as request token and bearer header)"},{key:"daemonTransport",names:["--daemon-transport"],type:"enum",enumValues:["auto","socket","http"],usageLabel:"--daemon-transport auto|socket|http",usageDescription:"Daemon client transport preference"},{key:"daemonServerMode",names:["--daemon-server-mode"],type:"enum",enumValues:["socket","http","dual"],usageLabel:"--daemon-server-mode socket|http|dual",usageDescription:"Daemon server mode used when spawning daemon"},{key:"tenant",names:["--tenant"],type:"string",usageLabel:"--tenant <id>",usageDescription:"Tenant scope identifier for isolated daemon sessions"},{key:"sessionIsolation",names:["--session-isolation"],type:"enum",enumValues:["none","tenant"],usageLabel:"--session-isolation none|tenant",usageDescription:"Session isolation strategy (tenant prefixes session namespace)"},{key:"runId",names:["--run-id"],type:"string",usageLabel:"--run-id <id>",usageDescription:"Run identifier used for tenant lease admission checks"},{key:"leaseId",names:["--lease-id"],type:"string",usageLabel:"--lease-id <id>",usageDescription:"Lease identifier bound to tenant/run admission scope"},{key:"leaseBackend",names:["--lease-backend"],type:"enum",enumValues:["ios-simulator","ios-instance","android-instance"],usageLabel:"--lease-backend ios-simulator|ios-instance|android-instance",usageDescription:"Lease backend for remote tenant connection admission"},{key:"force",names:["--force"],type:"boolean",usageLabel:"--force",usageDescription:"Force connection state replacement when reconnecting"},{key:"noLogin",names:["--no-login"],type:"boolean",usageLabel:"--no-login",usageDescription:"Connect: fail instead of starting implicit cloud login"},{key:"sessionLock",names:["--session-lock"],type:"enum",enumValues:["reject","strip"],usageLabel:"--session-lock reject|strip",usageDescription:"Lock bound-session device routing for this CLI invocation and nested batch steps"},{key:"sessionLocked",names:["--session-locked"],type:"boolean",usageLabel:"--session-locked",usageDescription:"Deprecated alias for --session-lock reject"},{key:"sessionLockConflicts",names:["--session-lock-conflicts"],type:"enum",enumValues:["reject","strip"],usageLabel:"--session-lock-conflicts reject|strip",usageDescription:"Deprecated alias for --session-lock"},{key:"platform",names:["--platform"],type:"enum",enumValues:["ios","macos","android","linux","apple"],usageLabel:"--platform ios|macos|android|linux|apple",usageDescription:"Platform to target (`apple` aliases the Apple automation backend)"},{key:"target",names:["--target"],type:"enum",enumValues:["mobile","tv","desktop"],usageLabel:"--target mobile|tv|desktop",usageDescription:"Device target class to match"},{key:"device",names:["--device"],type:"string",usageLabel:"--device <name>",usageDescription:"Device name to target"},{key:"udid",names:["--udid"],type:"string",usageLabel:"--udid <udid>",usageDescription:"iOS device UDID"},{key:"serial",names:["--serial"],type:"string",usageLabel:"--serial <serial>",usageDescription:"Android device serial"},{key:"surface",names:["--surface"],type:"enum",enumValues:D,usageLabel:"--surface app|frontmost-app|desktop|menubar",usageDescription:"macOS session surface for open (defaults to app)"},{key:"headless",names:["--headless"],type:"boolean",usageLabel:"--headless",usageDescription:"Boot: launch Android emulator without a GUI window"},{key:"metroHost",names:["--metro-host"],type:"string",usageLabel:"--metro-host <host>",usageDescription:"Session-scoped Metro/debug host hint"},{key:"metroPort",names:["--metro-port"],type:"int",min:1,max:65535,usageLabel:"--metro-port <port>",usageDescription:"Session-scoped Metro/debug port hint"},{key:"metroProjectRoot",names:["--project-root"],type:"string",usageLabel:"--project-root <path>",usageDescription:"metro prepare: React Native project root (default: cwd)"},{key:"metroKind",names:["--kind"],type:"enum",enumValues:["auto","react-native","expo"],usageLabel:"--kind auto|react-native|expo",usageDescription:"metro prepare: detect or force the Metro launcher kind"},{key:"metroPublicBaseUrl",names:["--public-base-url"],type:"string",usageLabel:"--public-base-url <url>",usageDescription:"metro prepare: public base URL used for direct bundle hints"},{key:"metroProxyBaseUrl",names:["--proxy-base-url"],type:"string",usageLabel:"--proxy-base-url <url>",usageDescription:"metro prepare: optional bridge origin for remote Metro access"},{key:"metroBearerToken",names:["--bearer-token"],type:"string",usageLabel:"--bearer-token <token>",usageDescription:"metro prepare: host bridge bearer token (or AGENT_DEVICE_METRO_BEARER_TOKEN; falls back to AGENT_DEVICE_DAEMON_AUTH_TOKEN)"},{key:"metroPreparePort",names:["--port"],type:"int",min:1,max:65535,usageLabel:"--port <port>",usageDescription:"metro prepare: local Metro port (default: 8081)"},{key:"metroListenHost",names:["--listen-host"],type:"string",usageLabel:"--listen-host <host>",usageDescription:"metro prepare: host Metro listens on (default: 0.0.0.0)"},{key:"metroStatusHost",names:["--status-host"],type:"string",usageLabel:"--status-host <host>",usageDescription:"metro prepare: host used for local /status polling (default: 127.0.0.1)"},{key:"metroStartupTimeoutMs",names:["--startup-timeout-ms"],type:"int",min:1,usageLabel:"--startup-timeout-ms <ms>",usageDescription:"metro prepare: timeout while waiting for Metro to become ready"},{key:"metroProbeTimeoutMs",names:["--probe-timeout-ms"],type:"int",min:1,usageLabel:"--probe-timeout-ms <ms>",usageDescription:"metro prepare: timeout for /status and proxy bridge calls"},{key:"metroRuntimeFile",names:["--runtime-file"],type:"string",usageLabel:"--runtime-file <path>",usageDescription:"metro prepare: optional file path to persist the JSON result"},{key:"metroNoReuseExisting",names:["--no-reuse-existing"],type:"boolean",usageLabel:"--no-reuse-existing",usageDescription:"metro prepare: always start a fresh Metro process"},{key:"metroNoInstallDeps",names:["--no-install-deps"],type:"boolean",usageLabel:"--no-install-deps",usageDescription:"metro prepare: skip package-manager install when node_modules is missing"},{key:"bundleUrl",names:["--bundle-url"],type:"string",usageLabel:"--bundle-url <url>",usageDescription:"Session-scoped bundle URL hint"},{key:"launchUrl",names:["--launch-url"],type:"string",usageLabel:"--launch-url <url>",usageDescription:"Session-scoped deep link / launch URL hint"},{key:"iosSimulatorDeviceSet",names:["--ios-simulator-device-set"],type:"string",usageLabel:"--ios-simulator-device-set <path>",usageDescription:"Scope iOS simulator discovery/commands to this simulator device set"},{key:"androidDeviceAllowlist",names:["--android-device-allowlist"],type:"string",usageLabel:"--android-device-allowlist <serials>",usageDescription:"Comma/space separated Android serial allowlist for discovery/selection"},{key:"activity",names:["--activity"],type:"string",usageLabel:"--activity <component>",usageDescription:"Android app launch activity (package/Activity); not for URL opens"},{key:"launchConsole",names:["--launch-console"],type:"string",usageLabel:"--launch-console <path>",usageDescription:"open: capture the initial iOS simulator launch console window to a file"},{key:"launchArgs",names:["--launch-args"],type:"string",multiple:!0,usageLabel:"--launch-args <arg>",usageDescription:"open: repeatable launch argument forwarded verbatim to the platform launch command (iOS app process args; Android adb shell am start args). Linux and macOS reject the flag."},{key:"header",names:["--header"],type:"string",multiple:!0,usageLabel:"--header <name:value>",usageDescription:"install-from-source: repeatable HTTP header for URL downloads"},{key:"githubActionsArtifact",names:["--github-actions-artifact"],type:"string",usageLabel:"--github-actions-artifact <owner/repo:artifact>",usageDescription:"install-from-source: GitHub Actions artifact resolved by a remote daemon"},{key:"installSource",names:[],type:"string"},{key:"session",names:["--session"],type:"string",usageLabel:"--session <name>",usageDescription:"Named session"},{key:"count",names:["--count"],type:"int",min:1,max:200,usageLabel:"--count <n>",usageDescription:"Repeat count for press/swipe series"},{key:"fps",names:["--fps"],type:"int",min:1,max:120,usageLabel:"--fps <n>",usageDescription:"Record: target frames per second (iOS physical device runner)"},{key:"quality",names:["--quality"],type:"int",min:5,max:10,usageLabel:"--quality <5-10>",usageDescription:"Record: scale recording resolution from 5 (50%) through 10 (native resolution)"},{key:"hideTouches",names:["--hide-touches"],type:"boolean",usageLabel:"--hide-touches",usageDescription:"Record: skip touch-overlay post-processing for faster raw benchmark videos"},{key:"intervalMs",names:["--interval-ms"],type:"int",min:0,max:1e4,usageLabel:"--interval-ms <ms>",usageDescription:"Delay between press iterations"},{key:"delayMs",names:["--delay-ms"],type:"int",min:0,max:1e4,usageLabel:"--delay-ms <ms>",usageDescription:"Delay between typed characters"},{key:"holdMs",names:["--hold-ms"],type:"int",min:0,max:1e4,usageLabel:"--hold-ms <ms>",usageDescription:"Press hold duration for each iteration"},{key:"jitterPx",names:["--jitter-px"],type:"int",min:0,max:100,usageLabel:"--jitter-px <n>",usageDescription:"Deterministic coordinate jitter radius for press"},{key:"pixels",names:["--pixels"],type:"int",min:1,max:1e5,usageLabel:"--pixels <n>",usageDescription:"Scroll: explicit gesture distance in pixels"},{key:"doubleTap",names:["--double-tap"],type:"boolean",usageLabel:"--double-tap",usageDescription:"Use double-tap gesture per press iteration"},{key:"clickButton",names:["--button"],type:"enum",enumValues:["primary","secondary","middle"],usageLabel:"--button primary|secondary|middle",usageDescription:"Click: choose mouse button (middle reserved for future macOS support)"},{key:"backMode",names:["--in-app"],type:"enum",enumValues:["in-app","system"],setValue:"in-app",usageLabel:"--in-app",usageDescription:"Back: use app-provided back UI when available"},{key:"backMode",names:["--system"],type:"enum",enumValues:["in-app","system"],setValue:"system",usageLabel:"--system",usageDescription:"Back: use system back input or gesture when available"},{key:"pauseMs",names:["--pause-ms"],type:"int",min:0,max:1e4,usageLabel:"--pause-ms <ms>",usageDescription:"Delay between swipe iterations"},{key:"pattern",names:["--pattern"],type:"enum",enumValues:["one-way","ping-pong"],usageLabel:"--pattern one-way|ping-pong",usageDescription:"Swipe repeat pattern"},{key:"verbose",names:["--debug","--verbose","-v"],type:"boolean",usageLabel:"--debug, --verbose, -v",usageDescription:"Enable debug diagnostics; test --verbose prints per-test step timings without debug logs"},{key:"json",names:["--json"],type:"boolean",usageLabel:"--json",usageDescription:"JSON output"},{key:"help",names:["--help","-h"],type:"boolean",usageLabel:"--help, -h",usageDescription:"Print help and exit"},{key:"version",names:["--version","-V"],type:"boolean",usageLabel:"--version, -V",usageDescription:"Print version and exit"},{key:"snapshotDiff",names:["--diff"],type:"boolean",usageLabel:"--diff",usageDescription:"Snapshot: show structural diff against the previous session baseline"},{key:"saveScript",names:["--save-script"],type:"booleanOrString",usageLabel:"--save-script [path]",usageDescription:"Save session script (.ad) on close; optional custom output path"},{key:"networkInclude",names:["--include"],type:"enum",enumValues:["summary","headers","body","all"],usageLabel:"--include summary|headers|body|all",usageDescription:"Network: include headers, bodies, or both in output"},{key:"shutdown",names:["--shutdown"],type:"boolean",usageLabel:"--shutdown",usageDescription:"close: shutdown associated simulator/emulator after ending session"},{key:"relaunch",names:["--relaunch"],type:"boolean",usageLabel:"--relaunch",usageDescription:"open: terminate app process before launching it"},{key:"restart",names:["--restart"],type:"boolean",usageLabel:"--restart",usageDescription:"logs clear: stop active stream, clear logs, then start streaming again"},{key:"retainPaths",names:["--retain-paths"],type:"boolean",usageLabel:"--retain-paths",usageDescription:"install-from-source: keep materialized artifact paths after install"},{key:"retentionMs",names:["--retention-ms"],type:"int",min:1,usageLabel:"--retention-ms <ms>",usageDescription:"install-from-source: retention TTL for materialized artifact paths"},{key:"noRecord",names:["--no-record"],type:"boolean",usageLabel:"--no-record",usageDescription:"Do not record this action"},{key:"replayUpdate",names:["--update","-u"],type:"boolean",usageLabel:"--update, -u",usageDescription:"Replay: update selectors and rewrite replay file in place"},{key:"replayMaestro",names:["--maestro"],type:"boolean",usageLabel:"--maestro",usageDescription:`Replay: treat input as a Maestro YAML compatibility flow. Supported subset: ${(e=["app launch with Apple-platform launch arguments and Android/iOS simulator clearState","runFlow file/inline with when.platform, when.visible, when.notVisible, and limited when.true boolean/platform expressions","onFlowStart and onFlowComplete hooks","deterministic repeat.times","tapOn including optional, index, childOf, label, and absolute/percentage point taps","doubleTapOn and longPressOn","inputText, focused-field eraseText, and pasteText","openLink","visibility assertions and extendedWaitUntil","scroll and scrollUntilVisible","absolute/percentage swipe and swipe.label","screenshots","keyboard dismiss","basic pressKey, back, animation waits, and stopApp","ordered trusted runScript file/env scripts with http.post, json, and output variables"]).length>1?`${e.slice(0,-1).join(", ")}, and ${e.at(-1)}`:e[0]??""}. Unsupported syntax fails loudly with a link to ${L}`},{key:"replayEnv",names:["-e","--env"],type:"string",multiple:!0,usageLabel:"-e KEY=VALUE, --env KEY=VALUE",usageDescription:"Replay/Test: inject or override a ${KEY} variable for the script (repeatable)"},{key:"failFast",names:["--fail-fast"],type:"boolean",usageLabel:"--fail-fast",usageDescription:"Test: stop the suite after the first failing script; with sharding, each shard stops independently"},{key:"timeoutMs",names:["--timeout"],type:"int",min:1,usageLabel:"--timeout <ms>",usageDescription:"Prepare/Replay/Snapshot/Test: maximum wall-clock time for the command or attempt"},{key:"retries",names:["--retries"],type:"int",min:0,max:3,usageLabel:"--retries <n>",usageDescription:"Test: retry each failed script up to n additional times"},{key:"artifactsDir",names:["--artifacts-dir"],type:"string",usageLabel:"--artifacts-dir <path>",usageDescription:"Test: root directory for suite artifacts"},{key:"reportJunit",names:["--report-junit"],type:"string",usageLabel:"--report-junit <path>",usageDescription:"Test: write a JUnit XML report for the replay suite"},{key:"shardAll",names:["--shard-all"],type:"int",min:1,usageLabel:"--shard-all <n>",usageDescription:"Test: run the full suite on each of n devices; AD_SHARD_INDEX is zero-based"},{key:"shardSplit",names:["--shard-split"],type:"int",min:1,usageLabel:"--shard-split <n>",usageDescription:"Test: split runnable suite entries across n devices; AD_SHARD_INDEX is zero-based"},{key:"steps",names:["--steps"],type:"string",usageLabel:"--steps <json>",usageDescription:"Batch: JSON array of steps"},{key:"stepsFile",names:["--steps-file"],type:"string",usageLabel:"--steps-file <path>",usageDescription:"Batch: read steps JSON from file"},{key:"batchOnError",names:["--on-error"],type:"enum",enumValues:["stop"],usageLabel:"--on-error stop",usageDescription:"Batch: stop when a step fails"},{key:"batchMaxSteps",names:["--max-steps"],type:"int",min:1,max:1e3,usageLabel:"--max-steps <n>",usageDescription:"Batch: maximum number of allowed steps"},{key:"appsFilter",names:["--all"],type:"enum",enumValues:["user-installed","all"],setValue:"all",usageLabel:"--all",usageDescription:"Apps: include system/OEM apps"},{key:"snapshotInteractiveOnly",names:["-i"],type:"boolean",usageLabel:"-i",usageDescription:"Snapshot: interactive elements only"},{key:"snapshotCompact",names:["-c"],type:"boolean",usageLabel:"-c",usageDescription:"Snapshot: compact output (drop empty structure)"},{key:"snapshotDepth",names:["--depth","-d"],type:"int",min:0,usageLabel:"--depth, -d <depth>",usageDescription:"Snapshot: limit snapshot depth"},{key:"snapshotScope",names:["--scope","-s"],type:"string",usageLabel:"--scope, -s <scope>",usageDescription:"Snapshot: scope snapshot to label/identifier"},{key:"snapshotRaw",names:["--raw"],type:"boolean",usageLabel:"--raw",usageDescription:"Snapshot: raw node output"},{key:"snapshotForceFull",names:["--force-full"],type:"boolean",usageLabel:"--force-full",usageDescription:"Snapshot: re-emit the full tree even when unchanged"},{key:"findFirst",names:["--first"],type:"boolean",usageLabel:"--first",usageDescription:"Find: pick the first match when ambiguous"},{key:"findLast",names:["--last"],type:"boolean",usageLabel:"--last",usageDescription:"Find: pick the last match when ambiguous"},{key:"out",names:["--out"],type:"string",usageLabel:"--out <path>",usageDescription:"Output path"},{key:"overlayRefs",names:["--overlay-refs"],type:"boolean",usageLabel:"--overlay-refs",usageDescription:"Screenshot: draw current snapshot refs and target rectangles onto the saved PNG; diff screenshot: also write a separate current-screen overlay guide"},...t,{key:"baseline",names:["--baseline","-b"],type:"string",usageLabel:"--baseline, -b <path>",usageDescription:"Diff screenshot: path to baseline image file"},{key:"threshold",names:["--threshold"],type:"string",usageLabel:"--threshold <0-1>",usageDescription:"Diff screenshot: color distance threshold (default 0.1)"}],T=new Set(["json","config","remoteConfig","stateDir","daemonBaseUrl","daemonAuthToken","daemonTransport","daemonServerMode","tenant","sessionIsolation","runId","leaseId","leaseBackend","sessionLock","sessionLocked","sessionLockConflicts","help","version","verbose","platform","target","device","udid","serial","iosSimulatorDeviceSet","androidDeviceAllowlist","session","noRecord"]),F=new Map;for(let e of P)for(let s of e.names)F.set(s,e);function _(e){return F.get(e)}function C(){return P}let I={auth:{usageOverride:"auth status|login|logout",listUsageOverride:"auth status|login|logout",helpDescription:"Manage cloud CLI authentication",summary:"Manage cloud authentication",positionalArgs:["status|login|logout"]},connect:{usageOverride:"connect [--remote-config <path>] [--tenant <id>] [--run-id <id>] [--lease-backend <backend>] [--force] [--no-login]",helpDescription:"Connect to a remote daemon, authenticate when needed, and save remote session state. AGENT_DEVICE_CLOUD_BASE_URL is the bridge/control-plane API origin; use AGENT_DEVICE_DAEMON_AUTH_TOKEN=adc_live_... for CI/service-token automation.",summary:"Connect to remote daemon",allowedFlags:["force","noLogin",...M,"launchUrl"]},connection:{usageOverride:"connection status",listUsageOverride:"connection status",helpDescription:"Inspect active remote connection state",summary:"Inspect remote connection",positionalArgs:["status"]},disconnect:{helpDescription:"Disconnect remote daemon state, stop owned Metro companion, and release lease",summary:"Disconnect remote daemon",allowedFlags:["shutdown"]},mcp:{helpDescription:"Start the official stdio MCP server. It exposes structured command tools backed by the agent-device client.",summary:"Start MCP server"},"react-devtools":{usageOverride:"react-devtools [...args]",listUsageOverride:"react-devtools [...args]",helpDescription:"Run pinned agent-react-devtools commands for React Native performance profiling, component trees, props/state/hooks, and render analysis",summary:"Profile React Native performance and component renders",positionalArgs:["args?"],allowsExtraPositionals:!0}},j={boot:{summary:"Boot target device/simulator",allowedFlags:["headless"]},prepare:{usageOverride:"prepare ios-runner --platform ios|macos [--timeout <ms>]",listUsageOverride:"prepare ios-runner --platform ios|macos",helpDescription:"Prepare platform helper infrastructure. ios-runner builds/reuses, starts, and health-checks the XCTest runner so later Apple snapshots and interactions do not pay first-use startup cost. In CI, run it after boot/install and before replay/test. Runner build/start output is written to the session runner.log; daemon.log is for daemon lifecycle/startup issues.",summary:"Prepare platform helpers",positionalArgs:["ios-runner"],allowedFlags:["timeoutMs"]},open:{helpDescription:"Boot device/simulator; optionally launch app or deep link URL (macOS also supports --surface app|frontmost-app|desktop|menubar)",summary:"Open an app, deep link or URL, save replays",positionalArgs:["appOrUrl?","url?"],allowedFlags:["activity","launchConsole","launchArgs","saveScript","relaunch","surface"]},close:{positionalArgs:["app?"],allowedFlags:["saveScript","shutdown"]},reinstall:{positionalArgs:["app","path"]},install:{positionalArgs:["app","path"]},"install-from-source":{usageOverride:"install-from-source <url> | install-from-source --github-actions-artifact <owner/repo:artifact>",listUsageOverride:"install-from-source <url> | install-from-source --github-actions-artifact",helpDescription:"Install app from a URL or remote-resolved source",summary:"Install app from a source",positionalArgs:["url?"],allowedFlags:["header","githubActionsArtifact","installSource","retainPaths","retentionMs"]},apps:{helpDescription:"List user-installed apps; use --all to include system/OEM apps",summary:"List installed apps",allowedFlags:["appsFilter"],defaults:{appsFilter:o}},push:{positionalArgs:["bundleOrPackage","payloadOrJson"]},snapshot:{usageOverride:"snapshot [--diff] [-i] [-c] [-d <depth>] [-s <scope>] [--raw] [--force-full] [--timeout <ms>]",helpDescription:"Capture accessibility tree or diff against the previous session baseline",allowedFlags:["snapshotDiff",...x,"snapshotForceFull","timeoutMs"]},diff:{usageOverride:"diff snapshot | diff screenshot --baseline <path> [current.png] [--out <diff.png>] [--threshold <0-1>] [--overlay-refs]",helpDescription:"Diff accessibility snapshot or compare screenshots pixel-by-pixel",summary:"Diff snapshot or screenshot",positionalArgs:["kind","current?"],allowedFlags:[...x,"baseline","threshold","out","overlayRefs"]},screenshot:{helpDescription:"Capture screenshot (macOS app sessions default to the app window; use --fullscreen for full desktop, --max-size to downscale, --overlay-refs to annotate current refs, or --no-stabilize for low-latency Android capture loops)",positionalArgs:["path?"],allowedFlags:a},appstate:{helpDescription:"Show foreground app/activity"},perf:{usageOverride:"perf [metrics|frames] [sample]",listUsageOverride:"perf [metrics|frames]",helpDescription:"Show session performance metrics or focused frame/jank health. Bare perf and metrics are aliases for perf metrics.",summary:"Show session performance and frame health",positionalArgs:["area?","action?"]},metro:{usageOverride:"metro prepare (--public-base-url <url> | --proxy-base-url <url>) [--project-root <path>] [--port <port>] [--kind auto|react-native|expo]\n agent-device metro reload [--metro-host <host>] [--metro-port <port>] [--bundle-url <url>]",listUsageOverride:"metro prepare --public-base-url <url> | --proxy-base-url <url>; metro reload",helpDescription:"Prepare a local Metro runtime or ask Metro to reload connected React Native apps",summary:"Prepare Metro or reload apps",positionalArgs:["prepare|reload"],allowedFlags:[...E,...M]},clipboard:{usageOverride:"clipboard read | clipboard write <text>",listUsageOverride:"clipboard read | clipboard write <text>",helpDescription:"Read or write device clipboard text",positionalArgs:["read|write","text?"],allowsExtraPositionals:!0},keyboard:{usageOverride:"keyboard [status|get|dismiss|enter|return]",helpDescription:"Inspect Android keyboard visibility/type or press/dismiss the device keyboard",summary:"Inspect, press, or dismiss the device keyboard",positionalArgs:["action?"]},back:{usageOverride:"back [--in-app|--system]",allowedFlags:["backMode"]},rotate:{usageOverride:"rotate <portrait|portrait-upside-down|landscape-left|landscape-right>",helpDescription:"Rotate device orientation on iOS and Android",positionalArgs:["orientation"]},wait:{usageOverride:"wait <ms>|text <text>|@ref|<selector> [timeoutMs]",positionalArgs:["durationOrSelector","timeoutMs?"],allowsExtraPositionals:!0,allowedFlags:[...A]},get:{usageOverride:"get text|attrs <@ref|selector>",positionalArgs:["subcommand","target"],allowedFlags:[...A]},find:{usageOverride:"find <locator|text> <action> [value] [--first|--last]",helpDescription:"Find by text/label/value/role/id and run action",summary:"Find an element and act",positionalArgs:["query","action","value?"],allowsExtraPositionals:!0,allowedFlags:["snapshotDepth","snapshotRaw","findFirst","findLast"]},is:{positionalArgs:["predicate","selector","value?"],allowsExtraPositionals:!0,allowedFlags:[...A]},alert:{usageOverride:"alert [get|accept|dismiss|wait] [timeout]",positionalArgs:["action?","timeout?"]},click:{usageOverride:"click <x y|@ref|selector>",positionalArgs:["target"],allowsExtraPositionals:!0,allowedFlags:[...R,"clickButton",...A]},replay:{positionalArgs:["path"],allowedFlags:["replayMaestro",...U,"timeoutMs"]},test:{usageOverride:"test <path-or-glob>...",listUsageOverride:"test <path-or-glob>...",helpDescription:"Run one or more replay scripts as a serial test suite",summary:"Run replay test suites",positionalArgs:["pathOrGlob"],allowsExtraPositionals:!0,allowedFlags:["replayMaestro",...U,"failFast","timeoutMs","retries","artifactsDir","reportJunit","shardAll","shardSplit"]},batch:{usageOverride:"batch [--steps <json> | --steps-file <path>]",listUsageOverride:"batch --steps <json> | --steps-file <path>",helpDescription:"Execute multiple commands in one daemon request",summary:"Run multiple commands",allowedFlags:["steps","stepsFile","batchOnError","batchMaxSteps","out"]},press:{usageOverride:"press <x y|@ref|selector>",positionalArgs:["targetOrX","y?"],allowsExtraPositionals:!0,allowedFlags:[...R,...A]},longpress:{usageOverride:"longpress <x y|@ref|selector> [durationMs]",positionalArgs:["targetOrX","yOrDurationMs?","durationMs?"],allowsExtraPositionals:!0,allowedFlags:[...A]},swipe:{helpDescription:"Swipe coordinates with optional repeat pattern",positionalArgs:["x1","y1","x2","y2","durationMs?"],allowedFlags:["count","pauseMs","pattern"]},gesture:{usageOverride:"gesture <pan|fling|swipe|pinch|rotate|transform> ...",listUsageOverride:"gesture <pan|fling|swipe|pinch|rotate|transform> ...",helpDescription:"Run touch gestures: pan <x> <y> <dx> <dy> [durationMs], fling <up|down|left|right> <x> <y> [distance] [durationMs], swipe <left|right|left-edge|right-edge> [durationMs], pinch <scale> [x] [y], rotate <degrees> [x] [y] [velocity], or transform <x> <y> <dx> <dy> <scale> <degrees> [durationMs]",summary:"Run pan, fling, swipe, pinch, rotate, or transform gestures",positionalArgs:["pan|fling|swipe|pinch|rotate|transform","args?"],allowsExtraPositionals:!0},focus:{positionalArgs:["x","y"]},type:{positionalArgs:["text"],allowsExtraPositionals:!0,allowedFlags:["delayMs"]},fill:{usageOverride:"fill <x> <y> <text> | fill <@ref|selector> <text>",positionalArgs:["targetOrX","yOrText","text?"],allowsExtraPositionals:!0,allowedFlags:[...A,"delayMs"]},scroll:{usageOverride:"scroll <direction|top|bottom> [amount] [--pixels <n>]",helpDescription:"Scroll in direction, or verify hidden content and scroll toward top/bottom",summary:"Scroll in a direction or to an edge",positionalArgs:["directionOrEdge","amount?"],allowedFlags:["pixels"]},"trigger-app-event":{usageOverride:"trigger-app-event <event> [payloadJson]",positionalArgs:["event","payloadJson?"]},record:{usageOverride:"record start [path] [--fps <n>] [--quality <5-10>] [--hide-touches] | record stop",listUsageOverride:"record start [path] | record stop",helpDescription:"Start/stop screen recording; Android recordings longer than the 180s adb screenrecord limit are returned as multiple MP4 chunks",summary:"Start or stop screen recording",positionalArgs:["start|stop","path?"],allowedFlags:["fps","quality","hideTouches"]},"react-native":{usageOverride:"react-native dismiss-overlay",listUsageOverride:"react-native dismiss-overlay",positionalArgs:["dismiss-overlay"]},trace:{usageOverride:"trace start <path> | trace stop <path>",listUsageOverride:"trace start <path> | trace stop <path>",helpDescription:"Start/stop trace log capture; when an artifact path is requested, pass the same positional path to start and stop",summary:"Start or stop trace capture",positionalArgs:["start|stop","path?"]},logs:{usageOverride:"logs path | logs start | logs stop | logs clear [--restart] | logs doctor | logs mark [message...]",helpDescription:"Session app log info, start/stop streaming, diagnostics, and markers",summary:"Manage session app logs",positionalArgs:["path|start|stop|clear|doctor|mark","message?"],allowsExtraPositionals:!0,allowedFlags:["restart"]},network:{usageOverride:"network dump [limit] [summary|headers|body|all] [--include summary|headers|body|all] | network log [limit] [summary|headers|body|all] [--include summary|headers|body|all]",helpDescription:"Dump recent HTTP(s) traffic parsed from the session app log",summary:"Show recent HTTP traffic",positionalArgs:["dump|log","limit?","include?"],allowedFlags:["networkInclude"]},settings:{usageOverride:f,listUsageOverride:"settings [area] [options]",helpDescription:"Toggle OS settings, animation scales, appearance, and app permissions (macOS supports only settings appearance <light|dark|toggle> and settings permission <grant|reset> <accessibility|screen-recording|input-monitoring>; wifi|airplane|location|animations remain unsupported on macOS; mobile permission actions use the active session app)",summary:"Change OS settings and app permissions",positionalArgs:["setting","state","target?","mode?"]},session:{usageOverride:"session list",positionalArgs:["list?"]}},N=new Map(r().map(e=>[e.name,{helpDescription:e.description}]));function V(e){if(e)return B(e)}function $(e){let s=B(e);if(!s)throw Error(`Missing command schema for ${e}`);return s}function B(e){let s=Object.hasOwn(I,e)?I[e]:void 0;if(s)return s;let t=N.get(e),a=Object.hasOwn(j,e)?j[e]:void 0;if(t)return a?{...t,...a}:t}function H(e,s){let t=V(e);if(!t?.defaults)return!1;let a=!1;for(let[e,o]of Object.entries(t.defaults))void 0===s[e]&&(s[e]=o,a=!0);return a}export{T as GLOBAL_FLAG_KEYS,L as MAESTRO_COMPAT_TRACKER_URL,O as MAESTRO_NEW_ISSUE_URL,b as SETTINGS_INVALID_ARGS_MESSAGE,H as applyCommandDefaults,$ as getCliCommandSchema,V as getCommandSchema,_ as getFlagDefinition,C as getFlagDefinitions,v as getUnsupportedMacOsSettingMessage,k as isMacOsSettingSupported,w as parseSessionSurface};
|
|
1
|
+
var e;import{SESSION_SURFACES as s,listCommandDescriptionMetadata as t}from"./2474.js";import{SCREENSHOT_SPECIFIC_FLAG_DEFINITIONS as a,SCREENSHOT_COMMAND_FLAG_KEYS as o}from"./695.js";import{DEFAULT_APPS_FILTER as r}from"./3675.js";let i="<wifi|airplane|location> <on|off>",n="location set <lat> <lon>",l="animations <on|off>",p="appearance <light|dark|toggle>",u="faceid <match|nonmatch|enroll|unenroll>",c="touchid <match|nonmatch|enroll|unenroll>",d="fingerprint <match|nonmatch>",m="clear-app-state [app-id]",g="permission <grant|deny|reset> <camera|microphone|photos|contacts|contacts-limited|notifications|calendar|location|location-always|media-library|motion|reminders|siri> [full|limited]",h="permission <grant|reset> <accessibility|screen-recording|input-monitoring>",y=`macOS supports only settings ${p} and settings ${h}. wifi|airplane|location|animations remain unsupported on macOS.`,f=`settings ${i} | settings ${n} | settings ${l} | settings ${p} | settings ${u} | settings ${c} | settings ${d} | settings ${m} | settings ${g} | settings ${h}`,b=`settings requires ${i}, ${n}, ${l}, ${p}, ${u}, ${c}, ${d}, ${m}, ${g}, or ${h}`;function k(e){let s=e.trim().toLowerCase();return"appearance"===s||"permission"===s}function v(e){return`Unsupported macOS setting: ${e}. ${y}`}let D="https://github.com/callstackincubator/agent-device/issues/558",w="https://github.com/callstackincubator/agent-device/issues/new";function L(...e){return e}let O=L("snapshotInteractiveOnly","snapshotCompact","snapshotDepth","snapshotScope","snapshotRaw"),x=L("snapshotDepth","snapshotScope","snapshotRaw"),S=L("metroProjectRoot","metroKind","metroPublicBaseUrl","metroProxyBaseUrl","metroBearerToken","metroPreparePort","metroListenHost","metroStatusHost","metroStartupTimeoutMs","metroProbeTimeoutMs","metroRuntimeFile","metroNoReuseExisting","metroNoInstallDeps"),A=L("metroHost","metroPort","bundleUrl"),M=L("count","intervalMs","holdMs","jitterPx","doubleTap"),E=L("replayUpdate","replayEnv"),R=[{key:"config",names:["--config"],type:"string",usageLabel:"--config <path>",usageDescription:"Load CLI defaults from a specific config file"},{key:"remoteConfig",names:["--remote-config"],type:"string",usageLabel:"--remote-config <path>",usageDescription:"Load remote host + Metro workflow settings from a specific profile file"},{key:"stateDir",names:["--state-dir"],type:"string",usageLabel:"--state-dir <path>",usageDescription:"Daemon state directory (defaults to ~/.agent-device for packages, or a worktree-scoped dev dir from source)"},{key:"daemonBaseUrl",names:["--daemon-base-url"],type:"string",usageLabel:"--daemon-base-url <url>",usageDescription:"Explicit remote HTTP daemon base URL (skip local daemon discovery/startup)"},{key:"daemonAuthToken",names:["--daemon-auth-token"],type:"string",usageLabel:"--daemon-auth-token <token>",usageDescription:"Remote HTTP daemon auth token (sent as request token and bearer header)"},{key:"daemonTransport",names:["--daemon-transport"],type:"enum",enumValues:["auto","socket","http"],usageLabel:"--daemon-transport auto|socket|http",usageDescription:"Daemon client transport preference"},{key:"daemonServerMode",names:["--daemon-server-mode"],type:"enum",enumValues:["socket","http","dual"],usageLabel:"--daemon-server-mode socket|http|dual",usageDescription:"Daemon server mode used when spawning daemon"},{key:"tenant",names:["--tenant"],type:"string",usageLabel:"--tenant <id>",usageDescription:"Tenant scope identifier for isolated daemon sessions"},{key:"sessionIsolation",names:["--session-isolation"],type:"enum",enumValues:["none","tenant"],usageLabel:"--session-isolation none|tenant",usageDescription:"Session isolation strategy (tenant prefixes session namespace)"},{key:"runId",names:["--run-id"],type:"string",usageLabel:"--run-id <id>",usageDescription:"Run identifier used for tenant lease admission checks"},{key:"leaseId",names:["--lease-id"],type:"string",usageLabel:"--lease-id <id>",usageDescription:"Lease identifier bound to tenant/run admission scope"},{key:"leaseBackend",names:["--lease-backend"],type:"enum",enumValues:["ios-simulator","ios-instance","android-instance"],usageLabel:"--lease-backend ios-simulator|ios-instance|android-instance",usageDescription:"Lease backend for remote tenant connection admission"},{key:"force",names:["--force"],type:"boolean",usageLabel:"--force",usageDescription:"Force connection state replacement when reconnecting"},{key:"noLogin",names:["--no-login"],type:"boolean",usageLabel:"--no-login",usageDescription:"Connect: fail instead of starting implicit cloud login"},{key:"sessionLock",names:["--session-lock"],type:"enum",enumValues:["reject","strip"],usageLabel:"--session-lock reject|strip",usageDescription:"Lock bound-session device routing for this CLI invocation and nested batch steps"},{key:"sessionLocked",names:["--session-locked"],type:"boolean",usageLabel:"--session-locked",usageDescription:"Deprecated alias for --session-lock reject"},{key:"sessionLockConflicts",names:["--session-lock-conflicts"],type:"enum",enumValues:["reject","strip"],usageLabel:"--session-lock-conflicts reject|strip",usageDescription:"Deprecated alias for --session-lock"},{key:"platform",names:["--platform"],type:"enum",enumValues:["ios","macos","android","linux","apple"],usageLabel:"--platform ios|macos|android|linux|apple",usageDescription:"Platform to target (`apple` aliases the Apple automation backend)"},{key:"target",names:["--target"],type:"enum",enumValues:["mobile","tv","desktop"],usageLabel:"--target mobile|tv|desktop",usageDescription:"Device target class to match"},{key:"device",names:["--device"],type:"string",usageLabel:"--device <name>",usageDescription:"Device name to target"},{key:"udid",names:["--udid"],type:"string",usageLabel:"--udid <udid>",usageDescription:"iOS device UDID"},{key:"serial",names:["--serial"],type:"string",usageLabel:"--serial <serial>",usageDescription:"Android device serial"},{key:"surface",names:["--surface"],type:"enum",enumValues:s,usageLabel:"--surface app|frontmost-app|desktop|menubar",usageDescription:"macOS session surface for open (defaults to app)"},{key:"headless",names:["--headless"],type:"boolean",usageLabel:"--headless",usageDescription:"Boot: launch Android emulator without a GUI window"},{key:"metroHost",names:["--metro-host"],type:"string",usageLabel:"--metro-host <host>",usageDescription:"Session-scoped Metro/debug host hint"},{key:"metroPort",names:["--metro-port"],type:"int",min:1,max:65535,usageLabel:"--metro-port <port>",usageDescription:"Session-scoped Metro/debug port hint"},{key:"metroProjectRoot",names:["--project-root"],type:"string",usageLabel:"--project-root <path>",usageDescription:"metro prepare: React Native project root (default: cwd)"},{key:"metroKind",names:["--kind"],type:"enum",enumValues:["auto","react-native","expo"],usageLabel:"--kind auto|react-native|expo",usageDescription:"metro prepare: detect or force the Metro launcher kind"},{key:"metroPublicBaseUrl",names:["--public-base-url"],type:"string",usageLabel:"--public-base-url <url>",usageDescription:"metro prepare: public base URL used for direct bundle hints"},{key:"metroProxyBaseUrl",names:["--proxy-base-url"],type:"string",usageLabel:"--proxy-base-url <url>",usageDescription:"metro prepare: optional bridge origin for remote Metro access"},{key:"metroBearerToken",names:["--bearer-token"],type:"string",usageLabel:"--bearer-token <token>",usageDescription:"metro prepare: host bridge bearer token (or AGENT_DEVICE_METRO_BEARER_TOKEN; falls back to AGENT_DEVICE_DAEMON_AUTH_TOKEN)"},{key:"metroPreparePort",names:["--port"],type:"int",min:1,max:65535,usageLabel:"--port <port>",usageDescription:"metro prepare: local Metro port (default: 8081)"},{key:"metroListenHost",names:["--listen-host"],type:"string",usageLabel:"--listen-host <host>",usageDescription:"metro prepare: host Metro listens on (default: 0.0.0.0)"},{key:"metroStatusHost",names:["--status-host"],type:"string",usageLabel:"--status-host <host>",usageDescription:"metro prepare: host used for local /status polling (default: 127.0.0.1)"},{key:"metroStartupTimeoutMs",names:["--startup-timeout-ms"],type:"int",min:1,usageLabel:"--startup-timeout-ms <ms>",usageDescription:"metro prepare: timeout while waiting for Metro to become ready"},{key:"metroProbeTimeoutMs",names:["--probe-timeout-ms"],type:"int",min:1,usageLabel:"--probe-timeout-ms <ms>",usageDescription:"metro prepare: timeout for /status and proxy bridge calls"},{key:"metroRuntimeFile",names:["--runtime-file"],type:"string",usageLabel:"--runtime-file <path>",usageDescription:"metro prepare: optional file path to persist the JSON result"},{key:"metroNoReuseExisting",names:["--no-reuse-existing"],type:"boolean",usageLabel:"--no-reuse-existing",usageDescription:"metro prepare: always start a fresh Metro process"},{key:"metroNoInstallDeps",names:["--no-install-deps"],type:"boolean",usageLabel:"--no-install-deps",usageDescription:"metro prepare: skip package-manager install when node_modules is missing"},{key:"bundleUrl",names:["--bundle-url"],type:"string",usageLabel:"--bundle-url <url>",usageDescription:"Session-scoped bundle URL hint"},{key:"launchUrl",names:["--launch-url"],type:"string",usageLabel:"--launch-url <url>",usageDescription:"Session-scoped deep link / launch URL hint"},{key:"iosSimulatorDeviceSet",names:["--ios-simulator-device-set"],type:"string",usageLabel:"--ios-simulator-device-set <path>",usageDescription:"Scope iOS simulator discovery/commands to this simulator device set"},{key:"noDeviceHub",names:["--no-device-hub"],type:"boolean",usageLabel:"--no-device-hub",usageDescription:"open: skip Xcode Device Hub and use the standalone Simulator app when surfacing Apple simulators"},{key:"androidDeviceAllowlist",names:["--android-device-allowlist"],type:"string",usageLabel:"--android-device-allowlist <serials>",usageDescription:"Comma/space separated Android serial allowlist for discovery/selection"},{key:"activity",names:["--activity"],type:"string",usageLabel:"--activity <component>",usageDescription:"Android app launch activity (package/Activity); not for URL opens"},{key:"launchConsole",names:["--launch-console"],type:"string",usageLabel:"--launch-console <path>",usageDescription:"open: capture the initial iOS simulator launch console window to a file"},{key:"launchArgs",names:["--launch-args"],type:"string",multiple:!0,usageLabel:"--launch-args <arg>",usageDescription:"open: repeatable launch argument forwarded verbatim to the platform launch command (iOS app process args; Android adb shell am start args). Linux and macOS reject the flag."},{key:"header",names:["--header"],type:"string",multiple:!0,usageLabel:"--header <name:value>",usageDescription:"install-from-source: repeatable HTTP header for URL downloads"},{key:"githubActionsArtifact",names:["--github-actions-artifact"],type:"string",usageLabel:"--github-actions-artifact <owner/repo:artifact>",usageDescription:"install-from-source: GitHub Actions artifact resolved by a remote daemon"},{key:"installSource",names:[],type:"string"},{key:"session",names:["--session"],type:"string",usageLabel:"--session <name>",usageDescription:"Named session"},{key:"count",names:["--count"],type:"int",min:1,max:200,usageLabel:"--count <n>",usageDescription:"Repeat count for press/swipe series"},{key:"fps",names:["--fps"],type:"int",min:1,max:120,usageLabel:"--fps <n>",usageDescription:"Record: target frames per second (iOS physical device runner)"},{key:"quality",names:["--quality"],type:"int",min:5,max:10,usageLabel:"--quality <5-10>",usageDescription:"Record: scale recording resolution from 5 (50%) through 10 (native resolution)"},{key:"hideTouches",names:["--hide-touches"],type:"boolean",usageLabel:"--hide-touches",usageDescription:"Record: skip touch-overlay post-processing for faster raw benchmark videos"},{key:"intervalMs",names:["--interval-ms"],type:"int",min:0,max:1e4,usageLabel:"--interval-ms <ms>",usageDescription:"Delay between press iterations"},{key:"delayMs",names:["--delay-ms"],type:"int",min:0,max:1e4,usageLabel:"--delay-ms <ms>",usageDescription:"Delay between typed characters"},{key:"holdMs",names:["--hold-ms"],type:"int",min:0,max:1e4,usageLabel:"--hold-ms <ms>",usageDescription:"Press hold duration for each iteration"},{key:"jitterPx",names:["--jitter-px"],type:"int",min:0,max:100,usageLabel:"--jitter-px <n>",usageDescription:"Deterministic coordinate jitter radius for press"},{key:"pixels",names:["--pixels"],type:"int",min:1,max:1e5,usageLabel:"--pixels <n>",usageDescription:"Scroll: explicit gesture distance in pixels"},{key:"doubleTap",names:["--double-tap"],type:"boolean",usageLabel:"--double-tap",usageDescription:"Use double-tap gesture per press iteration"},{key:"clickButton",names:["--button"],type:"enum",enumValues:["primary","secondary","middle"],usageLabel:"--button primary|secondary|middle",usageDescription:"Click: choose mouse button (middle reserved for future macOS support)"},{key:"backMode",names:["--in-app"],type:"enum",enumValues:["in-app","system"],setValue:"in-app",usageLabel:"--in-app",usageDescription:"Back: use app-provided back UI when available"},{key:"backMode",names:["--system"],type:"enum",enumValues:["in-app","system"],setValue:"system",usageLabel:"--system",usageDescription:"Back: use system back input or gesture when available"},{key:"pauseMs",names:["--pause-ms"],type:"int",min:0,max:1e4,usageLabel:"--pause-ms <ms>",usageDescription:"Delay between swipe iterations"},{key:"pattern",names:["--pattern"],type:"enum",enumValues:["one-way","ping-pong"],usageLabel:"--pattern one-way|ping-pong",usageDescription:"Swipe repeat pattern"},{key:"verbose",names:["--debug","--verbose","-v"],type:"boolean",usageLabel:"--debug, --verbose, -v",usageDescription:"Enable debug diagnostics; test --verbose prints per-test step timings without debug logs"},{key:"json",names:["--json"],type:"boolean",usageLabel:"--json",usageDescription:"JSON output"},{key:"help",names:["--help","-h"],type:"boolean",usageLabel:"--help, -h",usageDescription:"Print help and exit"},{key:"version",names:["--version","-V"],type:"boolean",usageLabel:"--version, -V",usageDescription:"Print version and exit"},{key:"snapshotDiff",names:["--diff"],type:"boolean",usageLabel:"--diff",usageDescription:"Snapshot: show structural diff against the previous session baseline"},{key:"saveScript",names:["--save-script"],type:"booleanOrString",usageLabel:"--save-script [path]",usageDescription:"Save session script (.ad) on close; optional custom output path"},{key:"networkInclude",names:["--include"],type:"enum",enumValues:["summary","headers","body","all"],usageLabel:"--include summary|headers|body|all",usageDescription:"Network: include headers, bodies, or both in output"},{key:"shutdown",names:["--shutdown"],type:"boolean",usageLabel:"--shutdown",usageDescription:"close: shutdown associated simulator/emulator after ending session"},{key:"relaunch",names:["--relaunch"],type:"boolean",usageLabel:"--relaunch",usageDescription:"open: terminate app process before launching it"},{key:"restart",names:["--restart"],type:"boolean",usageLabel:"--restart",usageDescription:"logs clear: stop active stream, clear logs, then start streaming again"},{key:"retainPaths",names:["--retain-paths"],type:"boolean",usageLabel:"--retain-paths",usageDescription:"install-from-source: keep materialized artifact paths after install"},{key:"retentionMs",names:["--retention-ms"],type:"int",min:1,usageLabel:"--retention-ms <ms>",usageDescription:"install-from-source: retention TTL for materialized artifact paths"},{key:"noRecord",names:["--no-record"],type:"boolean",usageLabel:"--no-record",usageDescription:"Do not record this action"},{key:"replayUpdate",names:["--update","-u"],type:"boolean",usageLabel:"--update, -u",usageDescription:"Replay: update selectors and rewrite replay file in place"},{key:"replayMaestro",names:["--maestro"],type:"boolean",usageLabel:"--maestro",usageDescription:`Replay: treat input as a Maestro YAML compatibility flow. Supported subset: ${(e=["app launch with Apple-platform launch arguments and Android/iOS simulator clearState","runFlow file/inline with when.platform, when.visible, when.notVisible, and limited when.true boolean/platform expressions","onFlowStart and onFlowComplete hooks","deterministic repeat.times","tapOn including optional, index, childOf, label, and absolute/percentage point taps","doubleTapOn and longPressOn","inputText, focused-field eraseText, and pasteText","openLink","visibility assertions and extendedWaitUntil","scroll and scrollUntilVisible","absolute/percentage swipe and swipe.label","screenshots","keyboard dismiss","basic pressKey, back, animation waits, and stopApp","ordered trusted runScript file/env scripts with http.post, json, and output variables"]).length>1?`${e.slice(0,-1).join(", ")}, and ${e.at(-1)}`:e[0]??""}. Unsupported syntax fails loudly with a link to ${D}`},{key:"replayExportFormat",names:["--format"],type:"enum",enumValues:["maestro"],usageLabel:"--format maestro",usageDescription:"Replay export: output format"},{key:"replayEnv",names:["-e","--env"],type:"string",multiple:!0,usageLabel:"-e KEY=VALUE, --env KEY=VALUE",usageDescription:"Replay/Test: inject or override a ${KEY} variable for the script (repeatable)"},{key:"failFast",names:["--fail-fast"],type:"boolean",usageLabel:"--fail-fast",usageDescription:"Test: stop the suite after the first failing script; with sharding, each shard stops independently"},{key:"timeoutMs",names:["--timeout"],type:"int",min:1,usageLabel:"--timeout <ms>",usageDescription:"Prepare/Replay/Snapshot/Test: maximum wall-clock time for the command or attempt"},{key:"retries",names:["--retries"],type:"int",min:0,max:3,usageLabel:"--retries <n>",usageDescription:"Test: retry each failed script up to n additional times"},{key:"recordVideo",names:["--record-video"],type:"boolean",usageLabel:"--record-video",usageDescription:"Test: record each replay attempt to recording.mp4 in its attempt artifacts"},{key:"artifactsDir",names:["--artifacts-dir"],type:"string",usageLabel:"--artifacts-dir <path>",usageDescription:"Test: root directory for suite artifacts"},{key:"reportJunit",names:["--report-junit"],type:"string",usageLabel:"--report-junit <path>",usageDescription:"Test: write a JUnit XML report for the replay suite"},{key:"shardAll",names:["--shard-all"],type:"int",min:1,usageLabel:"--shard-all <n>",usageDescription:"Test: run the full suite on each of n devices; AD_SHARD_INDEX is zero-based"},{key:"shardSplit",names:["--shard-split"],type:"int",min:1,usageLabel:"--shard-split <n>",usageDescription:"Test: split runnable suite entries across n devices; AD_SHARD_INDEX is zero-based"},{key:"steps",names:["--steps"],type:"string",usageLabel:"--steps <json>",usageDescription:"Batch: JSON array of steps"},{key:"stepsFile",names:["--steps-file"],type:"string",usageLabel:"--steps-file <path>",usageDescription:"Batch: read steps JSON from file"},{key:"batchOnError",names:["--on-error"],type:"enum",enumValues:["stop"],usageLabel:"--on-error stop",usageDescription:"Batch: stop when a step fails"},{key:"batchMaxSteps",names:["--max-steps"],type:"int",min:1,max:1e3,usageLabel:"--max-steps <n>",usageDescription:"Batch: maximum number of allowed steps"},{key:"appsFilter",names:["--all"],type:"enum",enumValues:["user-installed","all"],setValue:"all",usageLabel:"--all",usageDescription:"Apps: include system/OEM apps"},{key:"snapshotInteractiveOnly",names:["-i"],type:"boolean",usageLabel:"-i",usageDescription:"Snapshot: interactive elements only"},{key:"snapshotCompact",names:["-c"],type:"boolean",usageLabel:"-c",usageDescription:"Snapshot: compact output (drop empty structure)"},{key:"snapshotDepth",names:["--depth","-d"],type:"int",min:0,usageLabel:"--depth, -d <depth>",usageDescription:"Snapshot: limit snapshot depth"},{key:"snapshotScope",names:["--scope","-s"],type:"string",usageLabel:"--scope, -s <scope>",usageDescription:"Snapshot: scope snapshot to label/identifier"},{key:"snapshotRaw",names:["--raw"],type:"boolean",usageLabel:"--raw",usageDescription:"Snapshot: raw node output"},{key:"snapshotForceFull",names:["--force-full"],type:"boolean",usageLabel:"--force-full",usageDescription:"Snapshot: re-emit the full tree even when unchanged"},{key:"findFirst",names:["--first"],type:"boolean",usageLabel:"--first",usageDescription:"Find: pick the first match when ambiguous"},{key:"findLast",names:["--last"],type:"boolean",usageLabel:"--last",usageDescription:"Find: pick the last match when ambiguous"},{key:"out",names:["--out"],type:"string",usageLabel:"--out <path>",usageDescription:"Output path"},{key:"overlayRefs",names:["--overlay-refs"],type:"boolean",usageLabel:"--overlay-refs",usageDescription:"Screenshot: draw current snapshot refs and target rectangles onto the saved PNG; diff screenshot: also write a separate current-screen overlay guide"},...a,{key:"baseline",names:["--baseline","-b"],type:"string",usageLabel:"--baseline, -b <path>",usageDescription:"Diff screenshot: path to baseline image file"},{key:"threshold",names:["--threshold"],type:"string",usageLabel:"--threshold <0-1>",usageDescription:"Diff screenshot: color distance threshold (default 0.1)"}],U=new Set(["json","config","remoteConfig","stateDir","daemonBaseUrl","daemonAuthToken","daemonTransport","daemonServerMode","tenant","sessionIsolation","runId","leaseId","leaseBackend","sessionLock","sessionLocked","sessionLockConflicts","help","version","verbose","platform","target","device","udid","serial","iosSimulatorDeviceSet","androidDeviceAllowlist","session","noRecord"]),T=new Map;for(let e of R)for(let s of e.names)T.set(s,e);function F(e){return T.get(e)}function P(){return R}let _={auth:{usageOverride:"auth status|login|logout",listUsageOverride:"auth status|login|logout",helpDescription:"Manage cloud CLI authentication",summary:"Manage cloud authentication",positionalArgs:["status|login|logout"]},connect:{usageOverride:"connect [--remote-config <path>] [--tenant <id>] [--run-id <id>] [--lease-backend <backend>] [--force] [--no-login]",helpDescription:"Connect to a remote daemon, authenticate when needed, and save remote session state. AGENT_DEVICE_CLOUD_BASE_URL is the bridge/control-plane API origin; use AGENT_DEVICE_DAEMON_AUTH_TOKEN=adc_live_... for CI/service-token automation.",summary:"Connect to remote daemon",allowedFlags:["force","noLogin",...S,"launchUrl"]},connection:{usageOverride:"connection status",listUsageOverride:"connection status",helpDescription:"Inspect active remote connection state",summary:"Inspect remote connection",positionalArgs:["status"]},disconnect:{helpDescription:"Disconnect remote daemon state, stop owned Metro companion, and release lease",summary:"Disconnect remote daemon",allowedFlags:["shutdown"]},mcp:{helpDescription:"Start the official stdio MCP server. It exposes structured command tools backed by the agent-device client.",summary:"Start MCP server"},"react-devtools":{usageOverride:"react-devtools [...args]",listUsageOverride:"react-devtools [...args]",helpDescription:"Run pinned agent-react-devtools commands for React Native performance profiling, component trees, props/state/hooks, and render analysis",summary:"Profile React Native performance and component renders",positionalArgs:["args?"],allowsExtraPositionals:!0}},C={boot:{summary:"Boot target device/simulator",allowedFlags:["headless"]},shutdown:{summary:"Shutdown target simulator/emulator"},prepare:{usageOverride:"prepare ios-runner --platform ios|macos [--timeout <ms>]",listUsageOverride:"prepare ios-runner --platform ios|macos",helpDescription:"Prepare platform helper infrastructure. ios-runner builds/reuses, starts, and health-checks the XCTest runner so later Apple snapshots and interactions do not pay first-use startup cost. In CI, run it after boot/install and before replay/test; if replay/test starts a separate daemon, run clean:daemon after prepare to release the prepared runner lease. Runner build/start output is written to the session runner.log; daemon.log is for daemon lifecycle/startup issues.",summary:"Prepare platform helpers",positionalArgs:["ios-runner"],allowedFlags:["timeoutMs"]},open:{helpDescription:"Boot device/simulator; optionally launch app or deep link URL (macOS also supports --surface app|frontmost-app|desktop|menubar)",summary:"Open an app, deep link or URL, save replays",positionalArgs:["appOrUrl?","url?"],allowedFlags:["activity","launchConsole","launchArgs","noDeviceHub","saveScript","relaunch","surface"]},close:{positionalArgs:["app?"],allowedFlags:["saveScript","shutdown"]},reinstall:{positionalArgs:["app","path"]},install:{positionalArgs:["app","path"]},"install-from-source":{usageOverride:"install-from-source <url> | install-from-source --github-actions-artifact <owner/repo:artifact>",listUsageOverride:"install-from-source <url> | install-from-source --github-actions-artifact",helpDescription:"Install app from a URL or remote-resolved source",summary:"Install app from a source",positionalArgs:["url?"],allowedFlags:["header","githubActionsArtifact","installSource","retainPaths","retentionMs"]},apps:{helpDescription:"List user-installed apps; use --all to include system/OEM apps",summary:"List installed apps",allowedFlags:["appsFilter"],defaults:{appsFilter:r}},push:{positionalArgs:["bundleOrPackage","payloadOrJson"]},snapshot:{usageOverride:"snapshot [--diff] [-i] [-c] [-d <depth>] [-s <scope>] [--raw] [--force-full] [--timeout <ms>]",helpDescription:"Capture accessibility tree or diff against the previous session baseline",allowedFlags:["snapshotDiff",...O,"snapshotForceFull","timeoutMs"]},diff:{usageOverride:"diff snapshot | diff screenshot --baseline <path> [current.png] [--out <diff.png>] [--threshold <0-1>] [--overlay-refs]",helpDescription:"Diff accessibility snapshot or compare screenshots pixel-by-pixel",summary:"Diff snapshot or screenshot",positionalArgs:["kind","current?"],allowedFlags:[...O,"baseline","threshold","out","overlayRefs"]},screenshot:{helpDescription:"Capture screenshot (macOS app sessions default to the app window; use --fullscreen for full desktop, --max-size to downscale, --overlay-refs to annotate current refs, or --no-stabilize for low-latency Android capture loops)",positionalArgs:["path?"],allowedFlags:o},appstate:{helpDescription:"Show foreground app/activity"},perf:{usageOverride:"perf [metrics|frames] [sample]",listUsageOverride:"perf [metrics|frames]",helpDescription:"Show session performance metrics or focused frame/jank health. Bare perf and metrics are aliases for perf metrics.",summary:"Show session performance and frame health",positionalArgs:["area?","action?"]},metro:{usageOverride:"metro prepare (--public-base-url <url> | --proxy-base-url <url>) [--project-root <path>] [--port <port>] [--kind auto|react-native|expo]\n agent-device metro reload [--metro-host <host>] [--metro-port <port>] [--bundle-url <url>]",listUsageOverride:"metro prepare --public-base-url <url> | --proxy-base-url <url>; metro reload",helpDescription:"Prepare a local Metro runtime or ask Metro to reload connected React Native apps",summary:"Prepare Metro or reload apps",positionalArgs:["prepare|reload"],allowedFlags:[...A,...S]},clipboard:{usageOverride:"clipboard read | clipboard write <text>",listUsageOverride:"clipboard read | clipboard write <text>",helpDescription:"Read or write device clipboard text",positionalArgs:["read|write","text?"],allowsExtraPositionals:!0},keyboard:{usageOverride:"keyboard [status|get|dismiss|enter|return]",helpDescription:"Inspect Android keyboard visibility/type or press/dismiss the device keyboard",summary:"Inspect, press, or dismiss the device keyboard",positionalArgs:["action?"]},back:{usageOverride:"back [--in-app|--system]",allowedFlags:["backMode"]},rotate:{usageOverride:"rotate <portrait|portrait-upside-down|landscape-left|landscape-right>",helpDescription:"Rotate device orientation on iOS and Android",positionalArgs:["orientation"]},wait:{usageOverride:"wait <ms>|text <text>|@ref|<selector> [timeoutMs]",positionalArgs:["durationOrSelector","timeoutMs?"],allowsExtraPositionals:!0,allowedFlags:[...x]},get:{usageOverride:"get text|attrs <@ref|selector>",positionalArgs:["subcommand","target"],allowedFlags:[...x]},find:{usageOverride:"find <locator|text> <action> [value] [--first|--last]",helpDescription:"Find by text/label/value/role/id and run action",summary:"Find an element and act",positionalArgs:["query","action","value?"],allowsExtraPositionals:!0,allowedFlags:["snapshotDepth","snapshotRaw","findFirst","findLast"]},is:{positionalArgs:["predicate","selector","value?"],allowsExtraPositionals:!0,allowedFlags:[...x]},alert:{usageOverride:"alert [get|accept|dismiss|wait] [timeout]",positionalArgs:["action?","timeout?"]},click:{usageOverride:"click <x y|@ref|selector>",positionalArgs:["target"],allowsExtraPositionals:!0,allowedFlags:[...M,"clickButton",...x]},replay:{usageOverride:"replay <path> | replay export <file.ad> [--format maestro] [--out <path>]",positionalArgs:["path"],allowsExtraPositionals:!0,allowedFlags:["replayMaestro","replayExportFormat",...E,"timeoutMs","out"]},test:{usageOverride:"test <path-or-glob>...",listUsageOverride:"test <path-or-glob>...",helpDescription:"Run one or more replay scripts as a serial test suite",summary:"Run replay test suites",positionalArgs:["pathOrGlob"],allowsExtraPositionals:!0,allowedFlags:["replayMaestro",...E,"failFast","timeoutMs","retries","recordVideo","artifactsDir","reportJunit","shardAll","shardSplit"]},batch:{usageOverride:"batch [--steps <json> | --steps-file <path>]",listUsageOverride:"batch --steps <json> | --steps-file <path>",helpDescription:"Execute multiple commands in one daemon request",summary:"Run multiple commands",allowedFlags:["steps","stepsFile","batchOnError","batchMaxSteps","out"]},press:{usageOverride:"press <x y|@ref|selector>",positionalArgs:["targetOrX","y?"],allowsExtraPositionals:!0,allowedFlags:[...M,...x]},longpress:{usageOverride:"longpress <x y|@ref|selector> [durationMs]",positionalArgs:["targetOrX","yOrDurationMs?","durationMs?"],allowsExtraPositionals:!0,allowedFlags:[...x]},swipe:{helpDescription:"Swipe coordinates with optional repeat pattern",positionalArgs:["x1","y1","x2","y2","durationMs?"],allowedFlags:["count","pauseMs","pattern"]},gesture:{usageOverride:"gesture <pan|fling|swipe|pinch|rotate|transform> ...",listUsageOverride:"gesture <pan|fling|swipe|pinch|rotate|transform> ...",helpDescription:"Run touch gestures: pan <x> <y> <dx> <dy> [durationMs], fling <up|down|left|right> <x> <y> [distance] [durationMs], swipe <left|right|left-edge|right-edge> [durationMs], pinch <scale> [x] [y], rotate <degrees> [x] [y] [velocity], or transform <x> <y> <dx> <dy> <scale> <degrees> [durationMs]",summary:"Run pan, fling, swipe, pinch, rotate, or transform gestures",positionalArgs:["pan|fling|swipe|pinch|rotate|transform","args?"],allowsExtraPositionals:!0},focus:{positionalArgs:["x","y"]},type:{positionalArgs:["text"],allowsExtraPositionals:!0,allowedFlags:["delayMs"]},fill:{usageOverride:"fill <x> <y> <text> | fill <@ref|selector> <text>",positionalArgs:["targetOrX","yOrText","text?"],allowsExtraPositionals:!0,allowedFlags:[...x,"delayMs"]},scroll:{usageOverride:"scroll <direction|top|bottom> [amount] [--pixels <n>]",helpDescription:"Scroll in direction, or verify hidden content and scroll toward top/bottom",summary:"Scroll in a direction or to an edge",positionalArgs:["directionOrEdge","amount?"],allowedFlags:["pixels"]},"trigger-app-event":{usageOverride:"trigger-app-event <event> [payloadJson]",positionalArgs:["event","payloadJson?"]},record:{usageOverride:"record start [path] [--fps <n>] [--quality <5-10>] [--hide-touches] | record stop",listUsageOverride:"record start [path] | record stop",helpDescription:"Start/stop screen recording; Android recordings longer than the 180s adb screenrecord limit are returned as multiple MP4 chunks",summary:"Start or stop screen recording",positionalArgs:["start|stop","path?"],allowedFlags:["fps","quality","hideTouches"]},"react-native":{usageOverride:"react-native dismiss-overlay",listUsageOverride:"react-native dismiss-overlay",positionalArgs:["dismiss-overlay"]},trace:{usageOverride:"trace start <path> | trace stop <path>",listUsageOverride:"trace start <path> | trace stop <path>",helpDescription:"Start/stop trace log capture; when an artifact path is requested, pass the same positional path to start and stop",summary:"Start or stop trace capture",positionalArgs:["start|stop","path?"]},logs:{usageOverride:"logs path | logs start | logs stop | logs clear [--restart] | logs doctor | logs mark [message...]",helpDescription:"Session app log info, start/stop streaming, diagnostics, and markers",summary:"Manage session app logs",positionalArgs:["path|start|stop|clear|doctor|mark","message?"],allowsExtraPositionals:!0,allowedFlags:["restart"]},network:{usageOverride:"network dump [limit] [summary|headers|body|all] [--include summary|headers|body|all] | network log [limit] [summary|headers|body|all] [--include summary|headers|body|all]",helpDescription:"Dump recent HTTP(s) traffic parsed from the session app log",summary:"Show recent HTTP traffic",positionalArgs:["dump|log","limit?","include?"],allowedFlags:["networkInclude"]},settings:{usageOverride:f,listUsageOverride:"settings [area] [options]",helpDescription:"Toggle OS settings, animation scales, appearance, and app permissions (macOS supports only settings appearance <light|dark|toggle> and settings permission <grant|reset> <accessibility|screen-recording|input-monitoring>; wifi|airplane|location|animations remain unsupported on macOS; mobile permission actions use the active session app)",summary:"Change OS settings and app permissions",positionalArgs:["setting","state","target?","mode?"]},session:{usageOverride:"session list | session state-dir",listUsageOverride:"session list",helpDescription:"List active sessions or print the effective daemon state directory",positionalArgs:["list|state-dir?"]}},I=new Map(t().map(e=>[e.name,{helpDescription:e.description}]));function V(e){if(e)return N(e)}function j(e){let s=N(e);if(!s)throw Error(`Missing command schema for ${e}`);return s}function N(e){let s=Object.hasOwn(_,e)?_[e]:void 0;if(s)return s;let t=I.get(e),a=Object.hasOwn(C,e)?C[e]:void 0;if(t)return a?{...t,...a}:t}function $(e,s){let t=V(e);if(!t?.defaults)return!1;let a=!1;for(let[e,o]of Object.entries(t.defaults))void 0===s[e]&&(s[e]=o,a=!0);return a}export{U as GLOBAL_FLAG_KEYS,D as MAESTRO_COMPAT_TRACKER_URL,w as MAESTRO_NEW_ISSUE_URL,b as SETTINGS_INVALID_ARGS_MESSAGE,$ as applyCommandDefaults,j as getCliCommandSchema,V as getCommandSchema,F as getFlagDefinition,P as getFlagDefinitions,v as getUnsupportedMacOsSettingMessage,k as isMacOsSettingSupported};
|
package/dist/src/1534.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{AppError as e}from"./9152.js";function t(e){return e?{message:e}:{}}function r(e,t){return t?{...e,message:t}:e}function a(e){return"string"==typeof e?.message&&e.message.length>0?e.message:null}let n=["portrait","portrait-upside-down","landscape-left","landscape-right"];function s(t){if(void 0===t)throw new e("INVALID_ARGS","rotate requires an orientation argument. Use portrait|portrait-upside-down|landscape-left|landscape-right.");switch(t?.trim().toLowerCase()){case"portrait":return"portrait";case"portrait-upside-down":case"upside-down":return"portrait-upside-down";case"landscape-left":case"left":return"landscape-left";case"landscape-right":case"right":return"landscape-right";default:throw new e("INVALID_ARGS",`Invalid rotation: ${t}. Use portrait|portrait-upside-down|landscape-left|landscape-right.`)}}export{n as DEVICE_ROTATIONS,s as parseDeviceRotation,a as readCommandMessage,t as successText,r as withSuccessText};
|
package/dist/src/1620.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{AppError as e}from"./9152.js";import{defineStringEnum as t}from"./5898.js";import{centerOfRect as n,findNodeByRef as r,normalizeRef as i}from"./1644.js";import{intersectArea as o,isScrollableNodeLike as a}from"./4778.js";import{buildTextPreview as l,trimText as c,findNearestHittableAncestor as s,buildSelectorChainForNode as u,resolveSelectorChain as d,findNodeByLabel as f,resolveRefLabel as p,describeTextSurface as h,formatSelectorFailure as w,normalizeType as m}from"./7847.js";import{successText as b}from"./1534.js";import{parseSelectorChain as g}from"./8407.js";let x=["up","down","left","right"],v=["left","right","left-edge","right-edge"],y=["one-way","ping-pong"],S=t(v,{message:"gesture swipe requires left, right, left-edge, or right-edge"}),I=t(x,{message:e=>`Unknown direction: ${e}`});function N(t){let n=t.direction,r="up"===n||"down"===n?t.referenceHeight:t.referenceWidth,i=function(t){if(void 0===t)return .6;if(!Number.isFinite(t)||t<=0)throw new e("INVALID_ARGS","scroll amount must be a positive number");return t}(t.amount),o=void 0!==t.pixels?function(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))}(t.pixels):Math.round(r*i),a=Math.max(1,Math.round(.05*r)),l=Math.max(1,Math.min(o,Math.max(1,r-2*a))),c=Math.round(l/2),s=Math.round(t.referenceWidth/2),u=Math.round(t.referenceHeight/2),d=(e,r,i,o)=>({direction:n,x1:e,y1:r,x2:i,y2:o,referenceWidth:t.referenceWidth,referenceHeight:t.referenceHeight,amount:t.amount,pixels:l});switch(n){case"up":return d(s,u-c,s,u+c);case"down":return d(s,u+c,s,u-c);case"left":return d(s-c,u,s+c,u);case"right":return d(s+c,u,s-c,u)}}function k(e){return{...N({...e,direction:function(e){switch(e){case"up":return"down";case"down":return"up";case"left":return"right";case"right":return"left"}}(e.direction)}),direction:e.direction}}function M(e,t,n={}){let r=n.marginPx??8,[i,o,a]="left"===e?[85,15,50]:"right"===e?[15,85,50]:"left-edge"===e?[99,15,50]:[1,85,50],l=_(t,i,a,{marginPx:r}),c=_(t,o,a,{marginPx:r});return{preset:e,x1:l.x,y1:l.y,x2:c.x,y2:c.y,referenceWidth:t.referenceWidth,referenceHeight:t.referenceHeight}}function A(e){return S.parse(e)}function $(e){let t=function(e){let t=e.filter(e=>(function(e){if(!e)return!1;let t=e.toLowerCase();return t.includes("application")||t.includes("window")})(e.type)&&P(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(P);if(0===n.length)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}}(e);if(t)return{referenceWidth:t.width,referenceHeight:t.height}}function _(e,t,n,r={}){let i={x:Math.round(e.referenceWidth*t/100),y:Math.round(e.referenceHeight*n/100)};return void 0===r.marginPx?i:R(i,e,r.marginPx)}function R(e,t,n){return{x:O(e.x,n,t.referenceWidth),y:O(e.y,n,t.referenceHeight)}}function C(e){return I.parse(e)}function P(e){return!!e&&e.width>0&&e.height>0}function O(e,t,n){let r=Math.max(t,n-t);return E(e,t,r)}function E(e,t,n){return Math.min(Math.round(n),Math.max(Math.round(t),Math.round(e)))}let T=["primary","secondary","middle"];function L(e){return e?.clickButton??"primary"}function D(t){return"primary"===t.button?null:"click"!==t.commandLabel?new e("INVALID_ARGS","--button is supported only for click"):"macos"!==t.platform&&"linux"!==t.platform?new e("UNSUPPORTED_OPERATION",`click --button ${t.button} is supported only on macOS and Linux`):"macos"===t.platform&&"middle"===t.button?new e("UNSUPPORTED_OPERATION","click --button middle is not supported by the macOS runner yet"):"number"==typeof t.count||"number"==typeof t.intervalMs||"number"==typeof t.holdMs||"number"==typeof t.jitterPx||!0===t.doubleTap?new e("INVALID_ARGS",`click --button ${t.button} does not support repeat or gesture modifier flags`):null}function U(e){return"primary"===e?{}:{button:e}}function F(e,t,n){return t>=e.x&&t<=e.x+e.width&&n>=e.y&&n<=e.y+e.height}function H(e){let t=null,n=-1;for(let r of e){let e=r.width*r.height;e>n&&(t=r,n=e)}return t}function q(e,t,n,r){return Math.max(e,n)<=Math.min(t,r)}function G(e){let t=e.trim().toLowerCase();return!!t&&/^(vertical|horizontal)\s+scroll\s+bar(?:,?\s*\d+\s+pages?)?$/.test(t)}function B(e,t){if(!(e?.trim().toLowerCase()??"").includes("vertical scroll bar"))return null;let n=function(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}(t);return null===n?null:n<=1?{above:!1,below:!0}:n>=99?{above:!0,below:!1}:{above:!0,below:!0}}function V(e){let t=new Map;for(let[n,r]of e.entries())t.set(r.index,n);let n=[],r=[];for(let[i,o]of e.entries()){let e=Math.max(0,o.depth??0);for(;r.length>0&&e<=r[r.length-1].depth;)r.pop();let a="number"==typeof o.parentIndex?t.get(o.parentIndex):void 0,l="number"==typeof a&&a<i?a:r[r.length-1]?.index;n.push({...o,index:i,depth:e,parentIndex:l}),r.push({depth:e,index:i})}return n}function K(e){return new Map(e.map(e=>[e.index,e]))}function W(e){return e.label?.trim()||e.value?.trim()||e.identifier?.trim()||""}function z(e){if(0===e.length)return{nodes:e,hiddenCount:0,summaryLines:[]};let{byIndex:t,visibleNodeIndexes:n,offscreenNodes:r,hintedContainers:i}=X(e),o=0===n.size?e:e.filter(e=>n.has(e.index));return{nodes:o.map(e=>(function(e,t){let n=t.get(e.index);if(!n||0===n.size)return e;let r=!!(!0===e.hiddenContentAbove||n.has("above"))||void 0,i=!!(!0===e.hiddenContentBelow||n.has("below"))||void 0;return{...e,hiddenContentAbove:r,hiddenContentBelow:i}})(e,i.directionsByContainer)),hiddenCount:0===n.size?0:e.length-o.length,summaryLines:function(e,t,n){let r=new Map;for(let i of e){let e=function(e,t,n){if(!e.rect)return null;let r=Q(e,t,n);return r?Y(e.rect,r):null}(i,t,n);if(!e)continue;let o=r.get(e)??[];o.push(i),r.set(e,o)}return["above","below"].flatMap(e=>{let t=r.get(e);if(!t||0===t.length)return[];let n=(function(e){let t=new Set,n=[];for(let r of e){let e=W(r);!e||t.has(e)||(t.add(e),n.push(e))}return n})(t).slice(0,3).map(e=>`"${e}"`),i=1===t.length?"interactive item":"interactive items",o=n.length>0?`: ${n.join(", ")}`:"";return[`[off-screen ${e}] ${t.length} ${i}${o}`]})}(r.filter(e=>!i.coveredNodeIndexes.has(e.index)&&function(e){if(!0===e.hittable)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")||!!W(e)}(e)),e,t)}}function j(e){if(0===e.length)return new Map;let{hintedContainers:t}=X(e);var n=t.directionsByContainer;let r=new Map;for(let[e,t]of n){let n={};t.has("above")&&(n.hiddenContentAbove=!0),t.has("below")&&(n.hiddenContentBelow=!0),(n.hiddenContentAbove||n.hiddenContentBelow)&&r.set(e,n)}return r}function X(e){let t=K(e),n=new Set,r=[];for(let i of e){if(J(i,e,t)){!function(e,t,n){let r=e,i=new Set;for(;r&&!i.has(r.index);)i.add(r.index),t.add(r.index),r="number"==typeof r.parentIndex?n.get(r.parentIndex):void 0}(i,n,t);continue}r.push(i)}let i=function(e,t,n,r){let i=new Map,o=new Map,a=new Set;for(let e of t){if(!e.rect)continue;let t=Z(e,n,r);if(!t?.rect)continue;let l=Y(e.rect,t.rect);if(!l)continue;let c=i.get(t.index)??new Set;c.add(l),i.set(t.index,c);let s=o.get(t.index)??new Set;s.add(l),o.set(t.index,s),a.add(e.index)}return function(e,t,n,r,i){for(let o of e){let e=function(e){let t=B(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}(o);if(!e||0===e.size)continue;let a=Z(o,t,n);if(!a)continue;let l=r.get(a.index)??new Set,c=i.get(a.index);for(let t of e)(!c||!(c.size>0)||c.has(t))&&l.add(t);r.set(a.index,l)}}(e,n,r,i,o),{directionsByContainer:i,coveredNodeIndexes:a}}(e,r,n,t);return{byIndex:t,visibleNodeIndexes:n,offscreenNodes:r,hintedContainers:i}}function J(e,t,n=K(t)){var r;if(!e.rect)return!0;let i=Q(e,t,n);return!i||(r=e.rect,q(r.x,r.x+r.width,i.x,i.x+i.width)&&q(r.y,r.y+r.height,i.y,i.y+i.height))}function Q(e,t,r=K(t)){var i,o;let a=(i=e,o=r,ee(i,o,e=>!!e.rect)?.rect??null);return a||function(e,t){let r=n(t),i=e.filter(e=>{var t;return!!(t=e.rect)&&Number.isFinite(t.x)&&Number.isFinite(t.y)&&Number.isFinite(t.width)&&Number.isFinite(t.height)}),o=i.filter(e=>{let t=(e.type??"").toLowerCase();return t.includes("application")||t.includes("window")}),a=H(o.map(e=>e.rect).filter(e=>F(e,r.x,r.y)));if(a)return a;let l=H(o.map(e=>e.rect));if(l)return l;let c=H(i.map(e=>e.rect).filter(e=>F(e,r.x,r.y)));return c||null}(t,e.rect??{x:0,y:0,width:0,height:0})}function Y(e,t){return e.y+e.height<=t.y?"above":e.y>=t.y+t.height?"below":null}function Z(e,t,n){return ee(e,n,e=>t.has(e.index))}function ee(e,t,n){let r="number"==typeof e.parentIndex?t.get(e.parentIndex):void 0,i=new Set;for(;r&&!i.has(r.index);){if(i.add(r.index),n(r)&&a(r))return r;r="number"==typeof r.parentIndex?t.get(r.parentIndex):void 0}return null}async function et(t){let{edge:n,target:r={},scope:i,captureNodes:o}=t;try{let e=await o(i),t=function(e,t,n={}){var r,i,o;let l,c=(e??[]).map((e,t)=>({...e,ref:"ref"in e&&e.ref?e.ref:`e${t+1}`}));if(0===c.length)return{canScroll:!1,emptySnapshot:!0,signature:""};let s=j(c),u=function(e,t,n,r){let i=new Map(e.map(e=>[e.index,e])),o=e.filter(e=>a(e)&&es(e.rect));if(0===o.length)return null;let l=function(e,t){if(void 0===e)return null;let n=t.get(e);for(;n;){if(a(n)&&es(n.rect))return n;n=void 0===n.parentIndex?void 0:t.get(n.parentIndex)}return null}(r.nodeIndex,i);if(l)return l;let c=r.point;if(c){let e=o.filter(e=>{var t,n;return e.rect&&(t=e.rect,(n=c).x>=t.x&&n.x<=t.x+t.width&&n.y>=t.y&&n.y<=t.y+t.height)}).sort(ea);if(e.length>0)return e.find(e=>ei(e,t.get(e.index),n))??e[0]??null}let s=o.filter(e=>ei(e,t.get(e.index),n)).sort(el);return s.length>0?s[0]??null:o.filter(t=>J(t,e)).sort(el)[0]??o.sort(el)[0]??null}(c,s,t,n),d=(u?(r=c,i=u.index,l=new Map(r.map(e=>[e.index,e])),r.filter(e=>e.index===i||function(e,t,n){let r=void 0===e.parentIndex?void 0:n.get(e.parentIndex);for(;r;){if(r.index===t)return!0;r=void 0===r.parentIndex?void 0:n.get(r.parentIndex)}return!1}(e,i,l))):c).map(e=>{let t=e.rect?["x","y","width","height"].map(t=>{var n;return n=e.rect?.[t],"number"==typeof n&&Number.isFinite(n)?n.toFixed(1):""}).join(","):"";return[String(e.index??""),String(e.parentIndex??""),String(e.type??""),String(e.label??""),String(e.value??""),t].join("|")}).join("\n");return u?{canScroll:ei(u,s.get(u.index),t),emptySnapshot:!1,signature:d,scope:[(o=u).identifier,o.label,o.value].map(e=>"string"==typeof e?e.trim():"").find(eo)}:{canScroll:!1,emptySnapshot:!1,signature:d}}(e,n,r);if(i&&t.emptySnapshot)return await et({edge:n,target:r,captureNodes:o});return t}catch(t){var l,c,s;throw l=n,c=i,s=t,c?new e("COMMAND_FAILED",`Failed to verify scroll ${l} state for scoped container`,{scope:c,hint:`scroll ${l} could not verify the scoped scroll container. Run snapshot -i -c for the current screen and retry with a visible scroll target.`},s):new e("COMMAND_FAILED",`Failed to verify scroll ${l} state`,{hint:`scroll ${l} needs a snapshot showing hidden content ${"bottom"===l?"below":"above"} before it will move.`},s)}}async function en(t){let n,{edge:r,captureState:i,scroll:o}=t,a=await i();a.scope&&(a=await i(a.scope));let l=0;for(;a.canScroll;){if(l>=40)throw new e("COMMAND_FAILED",`scroll ${r} reached the safety limit before the snapshot showed the edge`,{hint:"The scoped scroll container still reports hidden content. Use a smaller manual scroll + snapshot loop to inspect the current state."});n=await o(),l+=1,a=await i(a.scope)}return{passes:l,result:n}}function er(e,t,n,r,i){return t&&0===n?`Already at ${t}; no hidden content ${"bottom"===t?"below":"above"} detected`:t?`Scrolled to ${t} with ${n} ${e} passes`:void 0!==i?`Scrolled ${e} by ${i}px`:void 0!==r?`Scrolled ${e} by ${r}`:`Scrolled ${e}`}function ei(e,t,n){return"bottom"===n?!0===e.hiddenContentBelow||t?.hiddenContentBelow===!0:!0===e.hiddenContentAbove||t?.hiddenContentAbove===!0}function eo(e){return e.length>0&&e.length<=80&&!/^(true|false)$/i.test(e)&&!/^\d+$/.test(e)&&!/^\d+%$/.test(e)}function ea(e,t){return ec(e.rect)-ec(t.rect)}function el(e,t){return ec(t.rect)-ec(e.rect)}function ec(e){return e?e.width*e.height:0}function es(e){return!!(e&&e.width>0&&e.height>0)}function eu(t,n,r,i){if(!Number.isFinite(t)||!Number.isInteger(t)||t<r||t>i)throw new e("INVALID_ARGS",`${n} must be an integer between ${r} and ${i}`);return t}let ed=["x","y","width","height"];function ef(e){let t=ep(e);if(!t)return null;let r=n(t);return Number.isFinite(r.x)&&Number.isFinite(r.y)?r:null}function ep(e){if(!e)return null;let t=Number(e.x),n=Number(e.y),r=Number(e.width),i=Number(e.height);return Number.isFinite(t)&&Number.isFinite(n)&&Number.isFinite(r)&&Number.isFinite(i)&&!(r<0)&&!(i<0)?{x:t,y:n,width:r,height:i}:null}function eh(e,t){return!!e&&!!t&&ed.every(n=>.5>=Math.abs(e[n]-t[n]))}function ew(e){return{x:em(e.x,e.width),y:em(e.y,e.height)}}function em(e,t){if(t<=1)return Math.floor(e);let n=Math.ceil(e);return Math.round(Math.min(Math.floor(e+t-1),Math.max(n,e+t/2)))}let eb=["tabbar","toolbar","navigationbar","bottomnavigation","bottomnavigationview","sheet","dialog","alert","popover","menu"],eg=["button","link","menuitem","tabitem","textfield","searchfield","edittext","checkbox","radio","switch","cell"];function ex(e){if(e.length<2)return e;let t=[...e],r={nodes:t,byIndex:new Map(t.map(e=>[e.index,e]))},i=!1;for(let[e,o]of t.entries()){if(!function(e){return!!eN(e.rect)&&(!!(!0===e.hittable||ey(e,eg))||!!(e.label?.trim()||e.value?.trim()||e.identifier?.trim()))}(o)||!function e(t,r,i){let o=eN(i.rect);if(!o)return null;let a=n(o);for(let n=r+1;n<t.nodes.length;n+=1){let r=t.nodes[n];if(r&&function(t,n,r,i,o){if(!t.nodes[n])return!1;let a=function(t,n,r,i){var o,a,l,c;let s=t.nodes[n];if(!s||!(!(!eN((o=s).rect)||function(e){let t=eS(e);return t.includes("application")||t.includes("window")}(o))&&ey(o,eb))||eI(a=r,l=s,c=t.byIndex)||eI(l,a,c))return null;let u=eN(s.rect);return!u||eh(i,u)||e(t,n,s)?null:u}(t,n,r,i);return!!(a&&F(a,o.x,o.y))}(t,n,i,o,a))return r}return null}(r,e,o))continue;i=!0;let a={...o,hittable:!1,interactionBlocked:"covered",presentationHints:Array.from(new Set([...o.presentationHints??[],"covered"]))};t[e]=a,r.byIndex.set(a.index,a)}return i?t:e}function ev(e){return void 0!==e.interactionBlocked}function ey(e,t){let n=eS(e);return t.some(e=>n.includes(e))}function eS(e){return[e.type,e.role,e.subrole].map(e=>m(e??"")).join(" ")}function eI(e,t,n){let r="number"==typeof t.parentIndex?n.get(t.parentIndex):void 0,i=new Set;for(;r&&!i.has(r.index);){if(r.index===e.index)return!0;i.add(r.index),r="number"==typeof r.parentIndex?n.get(r.parentIndex):void 0}return!1}function eN(e){let t=ep(e);return t&&t.width>0&&t.height>0?t:null}let ek={application:"application",navigationbar:"navigation-bar",tabbar:"tab-bar",button:"button",imagebutton:"button",link:"link",cell:"cell",statictext:"text",checkedtextview:"text",textfield:"text-field",edittext:"text-field",textarea:"text-view",switch:"switch",slider:"slider",image:"image",imageview:"image",webview:"webview",framelayout:"group",linearlayout:"group",relativelayout:"group",constraintlayout:"group",viewgroup:"group",view:"group",listview:"list",recyclerview:"list",collectionview:"collection",searchfield:"search",segmentedcontrol:"segmented-control",group:"group",window:"window",checkbox:"checkbox",radio:"radio",menuitem:"menu-item",toolbar:"toolbar",scrollarea:"scroll-area",scrollview:"scroll-area",nestedscrollview:"scroll-area",table:"table"};function eM(e,t={}){let n=[],r=[];for(let i of e){let e=i.depth??0,o=i.label?.trim()||i.value?.trim()||i.identifier?.trim()||"",a=e_(i.type??"Element");if("group"===a&&!o)continue;for(;n.length>0&&e<=n[n.length-1];)n.pop();let l=n.length;n.push(e),r.push({node:i,depth:l,type:a,text:eA(i,l,!1,a,t)})}return r}function eA(e,t,n,r,i={}){var o,a,s,u,d,f,p,w;let m,b=r??e_(e.type??"Element"),g=h(e,b),x=(o=e,a=b,s=i,u=g,s.summarizeTextSurfaces&&u.shouldSummarize&&function(e,t,n){let r=c(e.label);if(r&&r!==n)return r;let i=c(e.identifier);if(i&&!eC(i)&&i!==n)return i;switch(t){case"text":case"text-view":return"Text view";case"text-field":return"Text field";case"search":return"Search field";default:return""}}(o,a,u.text)||e$(o,a)),v=" ".repeat(t),y=e.ref?`@${e.ref}`:"",S=(d=e,f=b,p=i,w=g,m=[],!1===d.enabled&&m.push("disabled"),m.push(...d.presentationHints??[]),p.summarizeTextSurfaces&&(!0===d.selected&&m.push("selected"),!0===d.focused&&m.push("focused"),eR(f)&&m.push("editable"),function(e,t){if("scroll-area"===t)return!0;let n=(e.type??"").toLowerCase(),r=`${e.role??""} ${e.subrole??""}`.toLowerCase();return n.includes("scroll")||r.includes("scroll")}(d,f)&&m.push("scrollable"),w.shouldSummarize&&(m.push(`preview:"${l(w.text).replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`),m.push("truncated"))),eP(m)).map(e=>` [${e}]`).join(""),I=x?` "${x}"`:"";return n?`${v}${y} [${b}]${S}`.trimEnd():`${v}${y} [${b}]${I}${S}`.trimEnd()}function e$(e,t){var n,r;let i=e.label?.trim();if(i&&(n=t,r=i,("scroll-area"===n||"list"===n||"collection"===n||"table"===n)&&G(r)))return"";let o=e.value?.trim();if(eR(t)){if(o)return o;if(i)return i}else if(i)return i;if(o)return o;let a=e.identifier?.trim();return!a||eC(a)&&("group"===t||"image"===t||"list"===t||"collection"===t)?"":a}function e_(e){var t;let n=e.replace(/XCUIElementType/gi,"").toLowerCase(),r=e.includes(".")&&(e.startsWith("android.")||e.startsWith("androidx.")||e.startsWith("com."));return(n.includes(".")&&(n=n.replace(/^android\.widget\./,"").replace(/^android\.view\./,"").replace(/^android\.webkit\./,"").replace(/^androidx\./,"").replace(/^com\.google\.android\./,"").replace(/^com\.android\./,""),r&&n.includes(".")&&(n=n.slice(n.lastIndexOf(".")+1))),"textview"===n)?r?"text":"text-view":(t=n,(Object.prototype.hasOwnProperty.call(ek,t)?ek[t]:void 0)||n||"element")}function eR(e){return"text-field"===e||"text-view"===e||"search"===e}function eC(e){return/^[\w.]+:id\/[\w.-]+$/i.test(e)}function eP(e){return[...new Set(e)]}function eO(e){return"text"===e||"label"===e||"any"===e}function eE(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}function eT(e){return e.clock?.now()??Date.now()}async function eL(e,t){e.clock?await e.clock.sleep(t):await new Promise(e=>setTimeout(e,t))}function eD(e){return e&&"object"==typeof e?e:void 0}let eU=["button","link","menuitem","tabitem","textfield","searchfield","securetextfield","checkbox","radio","switch","cell"];function eF(e,t){return eH(e,t).node}function eH(e,t){var r;if(ev(t))return{node:t,reason:"covered"};let i=function(e,t){let n=ep(t.rect);if(!n)return null;let r=t,i=new Set;for(;!i.has(r.ref);){i.add(r.ref);let t=e.filter(e=>{if(e.parentIndex!==r.index||!e.hittable||ev(e))return!1;let t=ep(e.rect);return!!t&&eh(t,n)});if(1!==t.length)break;r=t[0]}return r===t?null:r}(e,t);if(i?.rect&&ef(i.rect))return{node:i,reason:"same-rect-descendant"};if([(r=t).type,r.role,r.subrole].map(e=>m(e??"")).some(eq)&&t.rect&&ef(t.rect))return{node:t,reason:"semantic-target"};let a=s(e,t);return a?.rect&&!ev(a)&&ef(a.rect)?!function(e,t,r){var i,a;let l,c,s,u=ep(e.rect),d=ep(t.rect);if(!u||!d)return!1;let f=function(e,t){let r=n(t),i=e.filter(e=>{let t=(e.type??"").toLowerCase();return t.includes("application")||t.includes("window")}).map(e=>ep(e.rect)).filter(e=>null!==e);if(0===i.length)return null;let o=i.filter(e=>F(e,r.x,r.y));return H(o.length>0?o:i)}(r,u);return!!f&&(l=o(i=d,a=f),c=i.width*i.height,s=a.width*a.height,!(l<=0)&&!(c<=0)&&!(s<=0)&&!!(l/s>=.9)&&!!(l/c>=.8))&&!eh(u,d)}(t,a,e)?{node:a,reason:"hittable-ancestor"}:{node:t,reason:"overly-broad-ancestor"}:{node:t,reason:"original"}}function eq(e){return"tab"===e||eU.some(t=>e.includes(t))}async function eG(e,t,n){var r;return(await eJ(e,t,n.action),"point"===t.target.kind)?{kind:"point",point:{x:(r=t.target).x,y:r.y}}:"ref"===t.target.kind?await eB(e,t,t.target,n):await eV(e,t,t.target,n)}async function eB(t,n,r,o){let a=await eY(t,n,r),l=a.resolved,c=o.promoteToHittableAncestor?eW(a.snapshot.nodes,l.node,{action:o.action,label:`Ref ${r.ref}`}):l.node;return ez(c,`Ref ${r.ref}`,o.action),function(t,n,r,o){let a=t.rect?Q(t,n):null;if(!(!t.rect||!a||J(t,n)))throw new e("COMMAND_FAILED",`Ref ${r} is off-screen and not safe to ${o}`,{reason:"offscreen_ref",ref:i(r),rect:t.rect,viewport:a,hint:`Use scroll with the direction from the off-screen summary, take a fresh snapshot, then retry ${o} with the new ref or a selector.`})}(c,a.snapshot.nodes,r.ref,o.action),{kind:"ref",point:e0(c,`Ref ${r.ref} not found or has invalid bounds`),target:{kind:"ref",ref:`@${l.ref}`},node:c,selectorChain:u(c,t.backend.platform,{action:"fill"===o.action?"fill":"click"}),refLabel:p(c,a.snapshot.nodes)}}async function eV(t,n,r,i){let o=g(r.selector),a=await eX(t,n,i.requireInteractive),l=d(eK(a.snapshot.nodes),o,{platform:t.backend.platform,requireRect:!0,requireUnique:!0,disambiguateAmbiguous:!0});if(l&&l.node.rect||!i.requireInteractive||(l=d(eK((a=await eX(t,n,!1)).snapshot.nodes),o,{platform:t.backend.platform,requireRect:!0,requireUnique:!0,disambiguateAmbiguous:!0})),!l||!l.node.rect){let n=d(a.snapshot.nodes,o,{platform:t.backend.platform,requireRect:!0,requireUnique:!1});if(n?.node&&ev(n.node))throw ej({label:`Selector ${n.selector.raw}`,node:n.node,action:i.action,selector:n.selector.raw});throw new e("COMMAND_FAILED",w(o,l?.diagnostics??[],{unique:!0}))}let c=i.promoteToHittableAncestor?eW(a.snapshot.nodes,l.node,{action:i.action,label:`Selector ${l.selector.raw}`}):l.node;return ez(c,`Selector ${l.selector.raw}`,i.action),{kind:"selector",point:e0(c,`Selector ${l.selector.raw} resolved to invalid bounds`),target:{kind:"selector",selector:l.selector.raw},node:c,selectorChain:u(c,t.backend.platform,{action:"fill"===i.action?"fill":"click"}),refLabel:p(c,a.snapshot.nodes)}}function eK(e){return e.filter(e=>!ev(e))}function eW(e,t,n){let r=eH(e,t);if("covered"===r.reason)throw ej({label:n.label,node:t,action:n.action});return r.node}function ez(e,t,n){if(ev(e))throw ej({label:t,node:e,action:n})}function ej(t){return new e("COMMAND_FAILED",`${t.label} is covered by another visible element and cannot ${function(e){switch(e){case"fill":return"be filled";case"focus":return"be focused";case"longPress":return"be long-pressed";default:return"be tapped"}}(t.action)} safely`,{hint:"Use a different visible target, scroll it clear of the overlay, or inspect with snapshot/screenshot before retrying.",...t.selector?{selector:t.selector}:{},ref:`@${t.node.ref}`,interactionBlocked:t.node.interactionBlocked})}async function eX(t,n,r){if(!t.backend.captureSnapshot)throw new e("UNSUPPORTED_OPERATION","snapshot is not supported by this backend");let i=n.session??"default",o=await t.sessions.get(i);if(!o)throw new e("SESSION_NOT_FOUND","No active session. Run open first.");let a=await t.backend.captureSnapshot(eE(t,n),{interactiveOnly:r,compact:r}),l=a.snapshot??{nodes:a.nodes??[],truncated:a.truncated,backend:a.backend,createdAt:eT(t)};return await t.sessions.set({...o,snapshot:l}),{snapshot:l}}async function eJ(t,n,r){if("macos"!==t.backend.platform)return;let i=await eQ(t,n);if(("desktop"===i||"menubar"===i)&&("menubar"!==i||"click"!==r&&"press"!==r))throw new e("UNSUPPORTED_OPERATION",`${r} is not supported on macOS ${i} sessions yet. Open an app session to act, or use the ${i} surface to inspect.`)}async function eQ(e,t){let n=await e.sessions.get(t.session??"default");return n?.metadata?.surface}async function eY(t,n,r){let i=n.session??"default",o=await t.sessions.get(i);if(!o)throw new e("SESSION_NOT_FOUND","No active session. Run open first.");if(!o.snapshot)throw new e("INVALID_ARGS","No snapshot in session. Run snapshot first.");let a=r.fallbackLabel??"",l=eZ(o.snapshot.nodes,r.ref,{fallbackLabel:a});if(l)return{snapshot:o.snapshot,resolved:l};let c=await eX(t,n,!0),s=eZ(c.snapshot.nodes,r.ref,{fallbackLabel:a});if(!s)throw new e("COMMAND_FAILED",`Ref ${r.ref} not found or has no bounds`);return{...c,resolved:s}}function eZ(t,n,o){let a=i(n);if(!a)throw new e("INVALID_ARGS",`Invalid ref: ${n}`);let l=r(t,a);if(e1(l))return{ref:a,node:l};let c=o.fallbackLabel.length>0?f(t,o.fallbackLabel):null;return e1(c)?{ref:a,node:c}:null}function e0(t,n){let r=ef(t.rect);if(!r)throw new e("COMMAND_FAILED",n);return r}function e1(e){return!!e&&null!==ef(e.rect)}let e5=["up","down","left","right","top","bottom"],e2=async(t,n)=>{let r=await eG(t,n,{action:"focus",requireInteractive:!0,promoteToHittableAncestor:!1});if(!t.backend.focus)throw new e("UNSUPPORTED_OPERATION","focus is not supported by this backend");let i=eD(await t.backend.focus(eE(t,n),r.point));return{...r,...i?{backendResult:i}:{},...b(`Focused (${r.point.x}, ${r.point.y})`)}},e8=async(t,n)=>{let r=await eG(t,n,{action:"longPress",requireInteractive:!0,promoteToHittableAncestor:!0});if(!t.backend.longPress)throw new e("UNSUPPORTED_OPERATION","longPress is not supported by this backend");let i=void 0===n.durationMs?void 0:eu(n.durationMs,"durationMs",0,12e4),o=eD(await t.backend.longPress(eE(t,n),r.point,{durationMs:i}));return{...r,...void 0!==i?{durationMs:i}:{},...o?{backendResult:o}:{},...b(`Long pressed (${r.point.x}, ${r.point.y})`)}},e4=async(t,n)=>{var r,i,o,a;let l;if(!t.backend.scroll)throw new e("UNSUPPORTED_OPERATION","scroll is not supported by this backend");let c="bottom"===(r=n.direction)?{direction:"down",edge:"bottom"}:"top"===r?{direction:"up",edge:"top"}:{direction:tn(r,"scroll direction")},s=(i=n.amount,o="scroll amount",void 0===i?void 0:ti(i,o)),u=function(t,n){if(void 0!==t){if(!Number.isFinite(t)||!Number.isInteger(t)||t<=0)throw new e("INVALID_ARGS",`${n} must be a positive integer`);return t}}(n.pixels,"scroll pixels");if(void 0!==s&&void 0!==u)throw new e("INVALID_ARGS","scroll accepts either amount or pixels, not both");let d=await e3(t,n),f="viewport"===d.kind?{kind:"viewport"}:{kind:"point",point:d.point},p=t.backend.scroll,h=async()=>await p(eE(t,n),f,{direction:c.direction,...void 0!==s?{amount:s}:{},...void 0!==u?{pixels:u}:{}}),w=0;if(c.edge){let e=c.edge,r="viewport"===(a=d).kind?{}:{point:a.point,nodeIndex:"node"in a?a.node.index:void 0},i=await en({edge:e,captureState:async i=>await tt(t,n,e,r,i),scroll:h});l=i.result,w=i.passes}else l=await h(),w=1;let m=eD(l);return{...d,direction:c.direction,...c.edge?{edge:c.edge,passes:w}:{},...void 0!==s?{amount:s}:{},...void 0!==u?{pixels:u}:{},...m?{backendResult:m}:{},...b(er(c.direction,c.edge,w,s,u))}},e9=async(t,n)=>{if(!t.backend.swipe)throw new e("UNSUPPORTED_OPERATION","swipe is not supported by this backend");if(n.preset)return await e7(t,n,t.backend.swipe);let r=await te(t,n),i=function(e,t){if(t.to)return{point:tr(t.to,"to")};let n=tn(t.direction,"swipe direction"),r=ti(t.distance??200,"swipe distance");switch(n){case"up":return{point:{x:e.x,y:e.y-r},direction:n,distance:r};case"down":return{point:{x:e.x,y:e.y+r},direction:n,distance:r};case"left":return{point:{x:e.x-r,y:e.y},direction:n,distance:r};case"right":return{point:{x:e.x+r,y:e.y},direction:n,distance:r}}}(r.point,n),o=void 0===n.durationMs?void 0:eu(n.durationMs,"durationMs",16,1e4),a=eD(await t.backend.swipe(eE(t,n),r.point,i.point,{durationMs:o}));return{kind:"swipe",from:r.point,to:i.point,...i.direction?{direction:i.direction}:{},...void 0!==i.distance?{distance:i.distance}:{},...void 0!==o?{durationMs:o}:{},...r.target?{fromTarget:r.target}:{},...a?{backendResult:a}:{},...b("Swiped")}};async function e7(t,n,r){let i;if(n.from||n.to||n.direction||void 0!==n.distance)throw new e("INVALID_ARGS","gesture swipe preset cannot be combined with from, to, direction, or distance");let o=A(n.preset);await eJ(t,n,"swipe");let a=M(o,{referenceWidth:(i=to((await eX(t,n,!1)).snapshot.nodes)).width,referenceHeight:i.height},{platform:t.backend.platform}),l=void 0===n.durationMs?void 0:eu(n.durationMs,"durationMs",16,1e4),c={x:a.x1,y:a.y1},s={x:a.x2,y:a.y2},u=eD(await r(eE(t,n),c,s,{durationMs:l}));return{kind:"swipe",from:c,to:s,preset:o,...void 0!==l?{durationMs:l}:{},fromTarget:{kind:"viewport"},...u?{backendResult:u}:{},...b(`Swiped ${o}`)}}let e6=async(t,n)=>{if(!t.backend.pinch)throw new e("UNSUPPORTED_OPERATION","pinch is not supported by this backend");await eJ(t,n,"pinch");let r=ti(n.scale,"pinch scale"),i=n.center?await eG(t,{...n,target:n.center},{action:"pinch",requireInteractive:!1,promoteToHittableAncestor:!1}):void 0,o=eD(await t.backend.pinch(eE(t,n),{scale:r,...i?{center:i.point}:{}}));return{kind:"pinch",scale:r,...i?{center:i.point,centerTarget:i}:{},...o?{backendResult:o}:{},...b(`Pinched to scale ${r}`)}};async function e3(e,t){let n=t.target??{kind:"viewport"};return"viewport"===n.kind?(await eJ(e,t,"scroll"),{kind:"viewport"}):await eG(e,{...t,target:n},{action:"scroll",requireInteractive:!1,promoteToHittableAncestor:!1})}async function te(t,r){if(r.from){var i;if("x"in(i=r.from)&&"y"in i)return await eJ(t,r,"swipe"),{point:tr(r.from,"from")};let e=await eG(t,{...r,target:r.from},{action:"swipe",requireInteractive:!1,promoteToHittableAncestor:!1});return{point:e.point,target:e}}if(!r.direction)throw new e("INVALID_ARGS","swipe requires from+to or a direction");return await eJ(t,r,"swipe"),{point:n(to((await eX(t,r,!1)).snapshot.nodes)),target:{kind:"viewport"}}}async function tt(t,n,r,i,o){if(!t.backend.captureSnapshot)throw new e("UNSUPPORTED_OPERATION",`scroll ${r} requires snapshot support to verify hidden content before scrolling`);let{captureSnapshot:a}=t.backend;return await et({edge:r,target:i,scope:o,captureNodes:async e=>{let r=await a(eE(t,n),{compact:!0,scope:e});return r.snapshot?.nodes??r.nodes??[]}})}function tn(t,n){switch(t){case"up":case"down":case"left":case"right":return t;default:throw new e("INVALID_ARGS",`${n} must be up, down, left, or right`)}}function tr(t,n){let r=Number(t.x),i=Number(t.y);if(!Number.isFinite(r)||!Number.isFinite(i))throw new e("INVALID_ARGS",`${n} point requires finite x and y`);return{x:r,y:i}}function ti(t,n){if(!Number.isFinite(t)||t<=0)throw new e("INVALID_ARGS",`${n} must be a positive number`);return t}function to(t){let n=t.filter(e=>J(e,t)).map(e=>e.rect).filter(ta),r=n.length>0?n:t.map(e=>e.rect).filter(ta);if(0===r.length)throw new e("COMMAND_FAILED","Cannot infer viewport for directional swipe");let i=Math.min(...r.map(e=>e.x)),o=Math.min(...r.map(e=>e.y));return{x:i,y:o,width:Math.max(...r.map(e=>e.x+e.width))-i,height:Math.max(...r.map(e=>e.y+e.height))-o}}function ta(e){return!!(e&&e.width>0&&e.height>0)}export{T as CLICK_BUTTONS,x as SCROLL_DIRECTIONS,e5 as SCROLL_INPUT_DIRECTIONS,y as SWIPE_PATTERNS,v as SWIPE_PRESETS,ex as annotateCoveredSnapshotNodes,eh as areRectsApproximatelyEqual,z as buildMobileSnapshotPresentation,N as buildScrollGesturePlan,eM as buildSnapshotDisplayLines,k as buildSwipeGesturePlan,M as buildSwipePresetGesturePlan,U as buttonTag,et as captureScrollEdgeState,R as clampGesturePoint,E as clampToRange,j as deriveMobileSnapshotHiddenContentHints,e$ as displayLabel,W as displayNodeLabel,e2 as focusCommand,e_ as formatRole,er as formatScrollEdgeMessage,eA as formatSnapshotLine,D as getClickButtonValidationError,$ as inferGestureReferenceFrame,B as inferVerticalScrollIndicatorDirections,J as isNodeVisibleInEffectiveViewport,ev as isSnapshotNodeInteractionBlocked,G as isSystemScrollIndicatorLabel,e8 as longPressCommand,V as normalizeSnapshotTree,eT as now,C as parseScrollDirection,A as parseSwipePreset,e6 as pinchCommand,_ as pointFromPercent,ew as pointInsideRect,eu as requireIntInRange,eF as resolveActionableTouchNode,eH as resolveActionableTouchResolution,L as resolveClickButton,eG as resolveInteractionTarget,ef as resolveRectCenter,en as runScrollEdgePasses,e4 as scrollCommand,eO as shouldScopeFind,eL as sleep,e9 as swipeCommand,eE as toBackendContext,eD as toBackendResult};
|
package/dist/src/1644.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{AppError as e}from"./9152.js";let t=["ios","macos","android","linux","apple"],r=["mobile","tv","desktop"];function i(e){return e}function o(e){return"apple"===e||"ios"===e||"macos"===e}function n(e,t){return!t||("apple"===t?o(e):e===t)}function a(e){return"macos"===e||"desktop"===e?"macOS":"tv"===e?"tvOS":"iOS"}function l(e){let{simulatorSetPath:t,platform:r,target:i}=e;if(t&&"macos"!==r&&"desktop"!==i)return t}async function s(t,r,i={}){let a=t,l=e=>e.toLowerCase().replace(/_/g," ").replace(/\s+/g," ").trim();if(r.platform&&(a=a.filter(e=>n(e.platform,r.platform))),r.target&&(a=a.filter(e=>(e.target??"mobile")===r.target)),r.udid){let t=a.find(e=>e.id===r.udid&&o(e.platform));if(!t)throw new e("DEVICE_NOT_FOUND",`No Apple device with UDID ${r.udid}`);return t}if(r.serial){let t=a.find(e=>e.id===r.serial&&"android"===e.platform);if(!t)throw new e("DEVICE_NOT_FOUND",`No Android device with serial ${r.serial}`);return t}if(r.deviceName){let t=l(r.deviceName),i=a.find(e=>l(e.name)===t);if(!i)throw new e("DEVICE_NOT_FOUND",`No device named ${r.deviceName}`);return i}let c=a[0];if(void 0!==c&&1===a.length)return c;if(0===a.length){var p;let t=i.simulatorSetPath;if(t&&(!(p=r.platform)||"apple"===p||"ios"===p))throw new e("DEVICE_NOT_FOUND","No devices found in the scoped simulator set",{simulatorSetPath:t,hint:`The simulator set at "${t}" appears to be empty. Create a simulator first:
|
|
2
|
+
xcrun simctl --set "${t}" create "iPhone 16" com.apple.CoreSimulator.SimDeviceType.iPhone-16 com.apple.CoreSimulator.SimRuntime.iOS-18-0`,selector:r});throw new e("DEVICE_NOT_FOUND","No devices found",{selector:r})}let f=a.filter(e=>"device"!==e.kind);f.length>0&&(a=f);let u=a.filter(e=>e.booted),m=u[0];if(void 0!==m&&1===u.length)return m;let d=u[0]??a[0];if(void 0===d)throw new e("DEVICE_NOT_FOUND","No devices found",{selector:r});return d}function c(e){return e.map((e,t)=>({...e,ref:`e${t+1}`}))}function p(e){let t=e.trim();return t.startsWith("@")?t.slice(1)||null:t.startsWith("e")?t:null}function f(e,t){return e.find(e=>e.ref===t)??null}function u(e){return JSON.stringify({interactiveOnly:e?.interactiveOnly===!0,compact:e?.compact===!0,depth:"number"==typeof e?.depth?e.depth:null,scope:e?.scope?.trim()||null,raw:e?.raw===!0})}function m(e){if(e)return{compact:e.snapshotCompact,depth:e.snapshotDepth,interactiveOnly:e.snapshotInteractiveOnly,raw:e.snapshotRaw,scope:e.snapshotScope}}function d(e){return{x:Math.round(e.x+e.width/2),y:Math.round(e.y+e.height/2)}}export{r as DEVICE_TARGETS,t as PLATFORM_SELECTORS,c as attachRefs,u as buildSnapshotPresentationKey,d as centerOfRect,f as findNodeByRef,o as isApplePlatform,n as matchesPlatformSelector,i as normalizePlatformSelector,p as normalizeRef,a as resolveApplePlatformName,l as resolveAppleSimulatorSetPathForSelector,s as resolveDevice,m as snapshotPresentationOptionsFromFlags};
|
package/dist/src/2284.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{splitSelectorFromArgs as e,tryParseSelectorChain as t}from"./8407.js";function i(e){if(!e)return null;let t=Number(e);return Number.isFinite(t)?t:null}function n(n){let r=n[0];if(void 0===r)return null;let l=i(r);if(null!==l)return{kind:"sleep",durationMs:l};let s=i(n[n.length-1]);if("text"===r)return{kind:"text",text:(null!==s?n.slice(1,-1).join(" "):n.slice(1).join(" ")).trim(),timeoutMs:s};if(r.startsWith("@"))return{kind:"ref",rawRef:r,timeoutMs:s};let o=e(null!==s?n.slice(0,-1):n.slice());return o&&0===o.rest.length&&t(o.selectorExpression)?{kind:"selector",selectorExpression:o.selectorExpression,timeoutMs:s}:{kind:"text",text:(null!==s?n.slice(0,-1).join(" "):n.join(" ")).trim(),timeoutMs:s}}export{i as parseTimeout,n as parseWaitPositionals};
|