agent-device 0.17.7 → 0.17.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/README.md +14 -0
  2. package/android-multitouch-helper/dist/{agent-device-android-multitouch-helper-0.17.7.apk → agent-device-android-multitouch-helper-0.17.9.apk} +0 -0
  3. package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.17.9.apk.sha256 +1 -0
  4. package/android-multitouch-helper/dist/{agent-device-android-multitouch-helper-0.17.7.manifest.json → agent-device-android-multitouch-helper-0.17.9.manifest.json} +4 -4
  5. package/android-snapshot-helper/dist/{agent-device-android-snapshot-helper-0.17.7.apk → agent-device-android-snapshot-helper-0.17.9.apk} +0 -0
  6. package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.17.9.apk.sha256 +1 -0
  7. package/android-snapshot-helper/dist/{agent-device-android-snapshot-helper-0.17.7.manifest.json → agent-device-android-snapshot-helper-0.17.9.manifest.json} +6 -6
  8. package/dist/src/1404.js +1 -0
  9. package/dist/src/2133.js +1 -1
  10. package/dist/src/2577.js +1 -0
  11. package/dist/src/2948.js +30 -1
  12. package/dist/src/4428.js +1 -1
  13. package/dist/src/587.js +1 -1
  14. package/dist/src/7394.js +5 -5
  15. package/dist/src/8184.js +1 -1
  16. package/dist/src/8358.js +4 -0
  17. package/dist/src/9581.js +13 -2
  18. package/dist/src/9722.js +36 -36
  19. package/dist/src/9836.js +1 -1
  20. package/dist/src/9919.js +5 -5
  21. package/dist/src/android.js +3 -3
  22. package/dist/src/apple.js +1 -1
  23. package/dist/src/apps.js +1 -1
  24. package/dist/src/cli-help.js +25 -7
  25. package/dist/src/cli-output.js +1 -4
  26. package/dist/src/cli.js +28 -18
  27. package/dist/src/command-surface.js +1 -1
  28. package/dist/src/find.js +1 -1
  29. package/dist/src/generic.js +5 -5
  30. package/dist/src/index.d.ts +12 -0
  31. package/dist/src/input-actions.js +1 -1
  32. package/dist/src/input-actions~1.js +1 -1
  33. package/dist/src/interaction.js +1 -1
  34. package/dist/src/internal/bin.js +1 -1
  35. package/dist/src/react-native.js +1 -1
  36. package/dist/src/record-trace-recording.js +1 -1
  37. package/dist/src/selector-runtime.js +1 -1
  38. package/dist/src/selectors.js +1 -1
  39. package/dist/src/server.js +1 -1
  40. package/dist/src/session.js +7 -7
  41. package/dist/src/snapshot.js +1 -1
  42. package/dist/src/web.js +1 -1
  43. package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +92 -4
  44. package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandJournal.swift +1 -1
  45. package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +130 -0
  46. package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +4 -2
  47. package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScrollGesture.swift +18 -0
  48. package/package.json +3 -3
  49. package/server.json +2 -2
  50. package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.17.7.apk.sha256 +0 -1
  51. package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.17.7.apk.sha256 +0 -1
  52. package/dist/src/2892.js +0 -4
  53. package/dist/src/368.js +0 -1
  54. package/dist/src/6311.js +0 -27
  55. package/dist/src/7244.js +0 -1
  56. package/dist/src/9873.js +0 -1
package/README.md CHANGED
@@ -88,6 +88,20 @@ Snapshots assign refs like `@e1`, `@e2`, and `@e3` to elements on the current sc
88
88
  - **Try the sample app**: clone the repo and run the bundled Expo fixture when you want a guided first dogfood run with screenshots, replay, and performance evidence. See [Quick Start](https://oss.callstack.com/agent-device/docs/quick-start).
89
89
  - **Go deeper**: use [Commands](https://oss.callstack.com/agent-device/docs/commands), [Replay & E2E](https://oss.callstack.com/agent-device/docs/replay-e2e), and [Debugging & Profiling](https://oss.callstack.com/agent-device/docs/debugging-profiling) for production workflows.
90
90
 
91
+ ## Articles & Videos
92
+
93
+ ### Articles
94
+
95
+ - [Build an AI QA agent for Expo apps with EAS Workflows](https://expo.dev/blog/build-an-ai-qa-agent-for-expo-apps-with-eas-workflows-in-minutes-today)
96
+ - [Agent Device: iOS & Android automation for AI agents](https://www.callstack.com/blog/agent-device-ai-native-mobile-automation-for-ios-android)
97
+ - [Building mobile QA agents with Vercel Eve](https://www.callstack.com/blog/building-reviewable-mobile-qa-agents-with-vercel-eve)
98
+ - [How we optimized Agent Device for mobile app automation](https://www.callstack.com/blog/how-we-optimized-agent-device-for-mobile-app-automation)
99
+
100
+ ### Videos
101
+
102
+ - [Verifying mobile apps with agent-device](https://youtu.be/kZDU-k5r9kE)
103
+ - [Using agent-device in an AI coding workflow](https://youtu.be/dfVG_aNPkW4)
104
+
91
105
  ## Where To Run agent-device
92
106
 
93
107
  | Path | Best for | Start with |
@@ -0,0 +1 @@
1
+ d4db2e3034f561da280f9c8ddda16ea0318346313fd4c95106437f9c0ff9e135 agent-device-android-multitouch-helper-0.17.9.apk
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "android-multitouch-helper",
3
- "version": "0.17.7",
4
- "assetName": "agent-device-android-multitouch-helper-0.17.7.apk",
5
- "sha256": "cc41db9a5e5f7df8bdf302c3d4e6130ed7b35f1012bd37d2db583b70a0104ee8",
3
+ "version": "0.17.9",
4
+ "assetName": "agent-device-android-multitouch-helper-0.17.9.apk",
5
+ "sha256": "d4db2e3034f561da280f9c8ddda16ea0318346313fd4c95106437f9c0ff9e135",
6
6
  "packageName": "com.callstack.agentdevice.multitouchhelper",
7
- "versionCode": 17007,
7
+ "versionCode": 17009,
8
8
  "instrumentationRunner": "com.callstack.agentdevice.multitouchhelper/.MultiTouchInstrumentation",
9
9
  "statusProtocol": "android-multitouch-helper-v1"
10
10
  }
@@ -0,0 +1 @@
1
+ b5b991a30ba75fa0b292cdb4027e249a9dae180884b10d9be78d4bdbd674dbc1 agent-device-android-snapshot-helper-0.17.9.apk
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "android-snapshot-helper",
3
- "version": "0.17.7",
4
- "releaseTag": "v0.17.7",
5
- "assetName": "agent-device-android-snapshot-helper-0.17.7.apk",
3
+ "version": "0.17.9",
4
+ "releaseTag": "v0.17.9",
5
+ "assetName": "agent-device-android-snapshot-helper-0.17.9.apk",
6
6
  "apkUrl": null,
7
- "sha256": "a8d1788b652e75d6542891763afee0213d38d02825f453a1b5d0edfca6ad8cd4",
8
- "checksumName": "agent-device-android-snapshot-helper-0.17.7.apk.sha256",
7
+ "sha256": "b5b991a30ba75fa0b292cdb4027e249a9dae180884b10d9be78d4bdbd674dbc1",
8
+ "checksumName": "agent-device-android-snapshot-helper-0.17.9.apk.sha256",
9
9
  "packageName": "com.callstack.agentdevice.snapshothelper",
10
- "versionCode": 17007,
10
+ "versionCode": 17009,
11
11
  "instrumentationRunner": "com.callstack.agentdevice.snapshothelper/.SnapshotInstrumentation",
12
12
  "minSdk": 23,
13
13
  "targetSdk": 36,
@@ -0,0 +1 @@
1
+ import r from"node:fs";import e from"node:path";import{fileURLToPath as o}from"node:url";function t(){try{let o=n();return JSON.parse(r.readFileSync(e.join(o,"package.json"),"utf8")).version??"0.0.0"}catch{return"0.0.0"}}function n(){let t=e.dirname(o(import.meta.url)),n=t;for(let o=0;o<6;o+=1){let o=e.join(n,"package.json");if(r.existsSync(o))return n;n=e.dirname(n)}return t}export{n as findProjectRoot,t as readVersion};
package/dist/src/2133.js CHANGED
@@ -1 +1 @@
1
- import{AppError as e}from"./733.js";let t={alert:"alert",appState:"appstate",appSwitcher:"app-switcher",apps:"apps",back:"back",batch:"batch",boot:"boot",click:"click",close:"close",clipboard:"clipboard",devices:"devices",diff:"diff",fill:"fill",find:"find",focus:"focus",gesture:"gesture",get:"get",home:"home",install:"install",installFromSource:"install-from-source",is:"is",keyboard:"keyboard",logs:"logs",longPress:"longpress",network:"network",open:"open",perf:"perf",prepare:"prepare",press:"press",push:"push",record:"record",reactNative:"react-native",reinstall:"reinstall",replay:"replay",rotate:"rotate",scroll:"scroll",screenshot:"screenshot",settings:"settings",shutdown:"shutdown",snapshot:"snapshot",swipe:"swipe",test:"test",trace:"trace",triggerAppEvent:"trigger-app-event",type:"type",wait:"wait"},s={installSource:"install_source",leaseAllocate:"lease_allocate",leaseHeartbeat:"lease_heartbeat",leaseRelease:"lease_release",releaseMaterializedPaths:"release_materialized_paths",runtime:"runtime",sessionList:"session_list"},a={auth:"auth",connect:"connect",connection:"connection",debug:"debug",disconnect:"disconnect",mcp:"mcp",metro:"metro",reactDevtools:"react-devtools",session:"session",web:"web"},r=["pan","fling","swipe","pinch","rotate","transform"],o=`gesture requires one of: ${r.join(", ")}`,n=c(a.auth,a.connect,a.connection,a.disconnect,a.mcp,a.reactDevtools,a.web,t.prepare);function c(...e){return new Set(e)}function i(){return[...Object.values(t),...Object.values(a)].sort()}function l(e){return Object.values(t).includes(e)||e===a.debug||e===a.metro||e===a.session}function p(){return i().filter(e=>!n.has(e))}c(a.auth,a.connect,a.connection,a.debug,a.disconnect,a.mcp,a.metro,a.reactDevtools,a.session,a.web,t.appState,t.prepare,t.batch,t.devices,t.gesture,t.replay,t.test,t.trace);let u=[t.devices,t.boot,t.shutdown,t.apps,t.open,t.close,t.install,t.reinstall,t.installFromSource,t.push,t.triggerAppEvent,t.snapshot,t.screenshot,t.diff,t.wait,t.alert,t.settings,t.click,t.press,t.longPress,t.swipe,t.focus,t.type,t.fill,t.scroll,t.get,t.gesture,t.is,t.find,t.perf,t.logs,t.network,t.record,t.trace,t.test,t.appState,t.back,t.home,t.rotate,t.appSwitcher,t.keyboard,t.clipboard,t.reactNative],d=new Set(["batch","replay"]),m=["command","positionals","flags","runtime"],h=["platform","target","device","udid","serial","verbose","out"],f=new Set(u);function g(e){return"string"==typeof e?e.trim().toLowerCase():""}function b(t,s){let a=g(t);if(f.has(a))return a;throw new e("INVALID_ARGS",`Batch step ${s} command is not available through command batch: ${String(t)}`)}function _(t,s){if(d.has(t))throw new e("INVALID_ARGS",`Batch step ${s} cannot run ${t}.`)}export{d as BATCH_BLOCKED_COMMANDS,m as BATCH_DAEMON_STEP_KEYS,r as GESTURE_KINDS,o as GESTURE_SUBCOMMAND_ERROR,h as INHERITED_PARENT_FLAG_KEYS,s as INTERNAL_COMMANDS,t as PUBLIC_COMMANDS,u as STRUCTURED_BATCH_COMMAND_NAMES,_ as assertBatchRuntimeCommandAllowed,l as isClientBackedCliCommandName,i as listCliCommandNames,p as listMcpExposedCommandNames,g as normalizeBatchCommandName,b as readStructuredBatchCommandName};
1
+ import{AppError as e}from"./733.js";let t={alert:"alert",appState:"appstate",appSwitcher:"app-switcher",apps:"apps",back:"back",batch:"batch",boot:"boot",click:"click",close:"close",clipboard:"clipboard",devices:"devices",diff:"diff",fill:"fill",find:"find",focus:"focus",gesture:"gesture",get:"get",home:"home",install:"install",installFromSource:"install-from-source",is:"is",keyboard:"keyboard",logs:"logs",longPress:"longpress",network:"network",open:"open",perf:"perf",prepare:"prepare",press:"press",push:"push",record:"record",reactNative:"react-native",reinstall:"reinstall",replay:"replay",rotate:"rotate",scroll:"scroll",screenshot:"screenshot",settings:"settings",shutdown:"shutdown",snapshot:"snapshot",swipe:"swipe",test:"test",trace:"trace",triggerAppEvent:"trigger-app-event",type:"type",viewport:"viewport",wait:"wait"},s={installSource:"install_source",leaseAllocate:"lease_allocate",leaseHeartbeat:"lease_heartbeat",leaseRelease:"lease_release",releaseMaterializedPaths:"release_materialized_paths",runtime:"runtime",sessionList:"session_list"},a={auth:"auth",connect:"connect",connection:"connection",debug:"debug",disconnect:"disconnect",mcp:"mcp",metro:"metro",proxy:"proxy",reactDevtools:"react-devtools",session:"session",web:"web"},r=["pan","fling","swipe","pinch","rotate","transform"],o=`gesture requires one of: ${r.join(", ")}`,n=i(a.auth,a.connect,a.connection,a.disconnect,a.mcp,a.proxy,a.reactDevtools,a.web,t.prepare);function i(...e){return new Set(e)}function c(){return[...Object.values(t),...Object.values(a)].sort()}function l(e){return Object.values(t).includes(e)||e===a.debug||e===a.metro||e===a.session}function p(){return c().filter(e=>!n.has(e))}i(a.auth,a.connect,a.connection,a.debug,a.disconnect,a.mcp,a.metro,a.proxy,a.reactDevtools,a.session,a.web,t.appState,t.prepare,t.batch,t.devices,t.gesture,t.replay,t.test,t.trace);let u=[t.devices,t.boot,t.shutdown,t.apps,t.open,t.close,t.install,t.reinstall,t.installFromSource,t.push,t.triggerAppEvent,t.snapshot,t.screenshot,t.diff,t.wait,t.alert,t.settings,t.click,t.press,t.longPress,t.swipe,t.focus,t.type,t.fill,t.scroll,t.get,t.gesture,t.is,t.find,t.perf,t.logs,t.network,t.record,t.trace,t.test,t.appState,t.back,t.home,t.rotate,t.appSwitcher,t.keyboard,t.clipboard,t.reactNative],d=new Set(["batch","replay"]),m=["command","positionals","flags","runtime"],h=["platform","target","device","udid","serial","verbose","out"],f=new Set(u);function g(e){return"string"==typeof e?e.trim().toLowerCase():""}function b(t,s){let a=g(t);if(f.has(a))return a;throw new e("INVALID_ARGS",`Batch step ${s} command is not available through command batch: ${String(t)}`)}function w(t,s){if(d.has(t))throw new e("INVALID_ARGS",`Batch step ${s} cannot run ${t}.`)}export{d as BATCH_BLOCKED_COMMANDS,m as BATCH_DAEMON_STEP_KEYS,r as GESTURE_KINDS,o as GESTURE_SUBCOMMAND_ERROR,h as INHERITED_PARENT_FLAG_KEYS,s as INTERNAL_COMMANDS,t as PUBLIC_COMMANDS,u as STRUCTURED_BATCH_COMMAND_NAMES,w as assertBatchRuntimeCommandAllowed,l as isClientBackedCliCommandName,c as listCliCommandNames,p as listMcpExposedCommandNames,g as normalizeBatchCommandName,b as readStructuredBatchCommandName};
@@ -0,0 +1 @@
1
+ import e from"node:crypto";import t,{promises as n}from"node:fs";import a from"node:path";import{Worker as r}from"node:worker_threads";import{fileURLToPath as i}from"node:url";import s from"node:os";import{buildMobileSnapshotPresentation as o,isSparseSnapshotQualityVerdict as l,renderSnapshotQualityWarnings as d,formatRole as u,isNodeVisibleInEffectiveViewport as c,publicSnapshotCaptureAnnotations as p,now as h,formatSnapshotLine as f,sleep as m,scrollCommand as w,appendScreenshotScriptFlags as g,successText as b,longPressCommand as y,displayLabel as k,focusCommand as v,swipeCommand as x,resolveInteractionTarget as A,toBackendResult as M,recordingQualityInputToExportQuality as S,toBackendContext as I,snapshotCaptureAnnotationsFrom as R,requireIntInRange as P,formatReactNativeOverlayWarning as N,pinchCommand as D,buildSnapshotDisplayLines as _}from"./2948.js";import{emitDiagnostic as O}from"./432.js";import{asAppError as E,toAppErrorCode as T,AppError as C}from"./733.js";import{computeScreenshotDiffPixels as U,PNG as L,toBuffer as $,decodePng as B}from"./4418.js";import{expandRect as q,intersectArea as G,unionRects as X,rectCenter as Y,clamp as F,normalizedRect as K,squaredDistance as j}from"./6024.js";import{whichCmd as H,runCmd as V}from"./8875.js";import{normalizeRef as z,findNodeByRef as W,buildSnapshotPresentationKey as J,usesMobileSnapshotPresentation as Z}from"./4291.js";import{findSelectorChainMatch as Q,extractNodeText as ee,findSnapshotAncestor as et,buildSelectorChainForNode as en,resolveSelectorChain as ea,findNodeByLabel as er,resolveRefLabel as ei,isNodeVisible as es,extractReadableText as eo,buildSnapshotNodeByIndex as el,formatSelectorFailure as ed,normalizeType as eu,isNodeEditable as ec,isFillableType as ep}from"./9836.js";import{parseFindSelectorExpression as eh,findBestMatchesByLocator as ef,parseSelectorChain as em}from"./587.js";import{isProcessAlive as ew,readProcessStartTime as eg}from"./5628.js";import{sleep as eb}from"./5560.js";import{resolveAppsFilter as ey,assertResolvedAppsFilter as ek}from"./2748.js";let ev=/^-?\d+(\.\d+)?$/,ex=/^[^\s"\\]+$/,eA=new Map([["--count","count"],["--interval-ms","intervalMs"],["--hold-ms","holdMs"],["--jitter-px","jitterPx"]]),eM=new Map([["--count","count"],["--pause-ms","pauseMs"]]),eS=new Map([["--delay-ms","delayMs"]]);function eI(e){return"click"===e||"press"===e}function eR(e){return eI(e)||"longpress"===e}function eP(e){return"type"===e||"fill"===e}function eN(e){return e_(e,eO)}function eD(e){return JSON.stringify(e)}function e_(e,t){return t(e)?e:eD(e)}function eO(e){return eE(e)&&e.startsWith("@")||ev.test(e)}function eE(e){return ex.test(e)}function eT(e){let t=(e.positionals??[]).map(e=>eN(e));return[e.command,...t].join(" ")}function eC(e,t){let n=t.flags??{};if(eI(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}eP(t.command)&&"number"==typeof n.delayMs&&e.push("--delay-ms",String(n.delayMs))}function eU(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",e_(t.metroHost,eE)),"number"==typeof t.metroPort&&e.push("--metro-port",String(t.metroPort)),"string"==typeof t.bundleUrl&&t.bundleUrl.length>0&&e.push("--bundle-url",e_(t.bundleUrl,eE)),"string"==typeof t.launchUrl&&t.launchUrl.length>0&&e.push("--launch-url",e_(t.launchUrl,eE)))}function eL(e,t){let n=[],a={},r=eI(e)?eA:"swipe"===e?eM:eP(e)?eS:void 0;for(let i=0;i<t.length;i+=1){let s=t[i];if(eI(e)&&"--double-tap"===s){a.doubleTap=!0;continue}let o=t[i+1];if(eI(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=eB(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 e$(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=eB(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 eB(e){if(!e)return null;let t=Number(e);return!Number.isFinite(t)||t<0?null:Math.floor(t)}function eq(e){var t;let n=[],a={};for(let t of e){if("--relaunch"===t){a.relaunch=!0;continue}n.push(t)}let r=e$(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 eG(e,t={}){let n=[e.command];if("snapshot"===e.command)e.flags?.snapshotInteractiveOnly&&n.push("-i"),"number"==typeof e.flags?.snapshotDepth&&n.push("-d",String(e.flags.snapshotDepth)),e.flags?.snapshotScope&&n.push("-s",eN(e.flags.snapshotScope)),e.flags?.snapshotRaw&&n.push("--raw");else if("open"===e.command){for(let t of e.positionals??[])n.push(eN(t));e.flags?.relaunch&&n.push("--relaunch"),eU(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(e_(t,eE));eU(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(e_(n,eE)),a))e.push(eN(t));"number"==typeof t.flags?.fps&&e.push("--fps",String(t.flags.fps)),"number"==typeof t.flags?.screenshotMaxSize&&e.push("--max-size",String(t.flags.screenshotMaxSize)),("number"==typeof t.flags?.quality||"string"==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(eN(t));g(n,e.flags)}else{for(let t of e.positionals??[])n.push(eN(t));eC(n,e)}return n.join(" ")}function eX(t,n){let a=e.createHash("sha256").update(t).digest(),r=e.createHash("sha256").update(n).digest();return e.timingSafeEqual(a,r)}let eY=["status","get","dismiss","enter","return"];function eF(e){return eY.includes(e)}function eK(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}class ej extends Error{}let eH=null,eV=!1,ez=!1,eW=0,eJ=new Map;function eZ(e){eV=!0,ez||(ez=!0,O({level:"warn",phase:"png_worker_unavailable",data:{reason:e}}),process.emitWarning(`PNG worker unavailable, falling back to in-process PNG processing: ${e}`))}function eQ(e){let t=eJ.get(e.id);t&&(eJ.delete(e.id),e2(),e.ok?t.resolve(e.result):t.reject(new C(T(e.error.code),e.error.message,e.error.details)))}function e0(e,t){eH===e&&(eZ(t.message),eH=null,e.terminate().catch(()=>{}),e1(new ej(`PNG worker failed: ${t.message}`)))}function e1(e){let t=[...eJ.values()];for(let n of(eJ.clear(),t))n.reject(e)}function e2(){eH&&(eJ.size>0?eH.ref():eH.unref())}function e4(){if(eV)return null;if(eH)return eH;let e=function(e,n){try{let r=i(e),s=a.extname(r)||".js";return[a.join(a.dirname(r),`${n}${s}`),a.join(a.dirname(r),"internal",`${n}${s}`)].find(e=>t.existsSync(e))??null}catch{return null}}(import.meta.url,"png-worker");if(!e)return eZ("worker entry module not found next to the current module"),null;try{let t=new r(e,{execArgv:e.endsWith(".ts")?["--experimental-strip-types"]:[]});return t.on("message",eQ),t.on("error",e=>{e0(t,e)}),t.on("exit",e=>{e0(t,Error(`PNG worker exited with code ${e}`))}),t.unref(),eH=t,t}catch(e){return eZ(`failed to spawn worker: ${e instanceof Error?e.message:String(e)}`),null}}async function e3(e,t){try{return await function(e){let t=e4();if(!t)return Promise.reject(new ej("PNG worker is unavailable"));let n=eW+=1;return new Promise((a,r)=>{eJ.set(n,{resolve:a,reject:r}),e2();try{t.postMessage({...e,id:n})}catch(e){eJ.delete(n),e2(),r(new ej(`failed to post job to PNG worker: ${e instanceof Error?e.message:String(e)}`))}})}(e)}catch(e){if(e instanceof ej)return t();throw e}}function e5(){e4()}async function e8(){let e=eH;eH=null,e1(new ej("PNG worker terminated")),e&&await e.terminate()}async function e6(e,t){let n=await e3({kind:"decode",png:e,label:t},()=>{let n=B(e,t);return{kind:"decode",width:n.width,height:n.height,data:n.data}});return new L({width:n.width,height:n.height,data:$(n.data)})}async function e9(e){return $((await e3({kind:"encode",width:e.width,height:e.height,data:e.data},()=>({kind:"encode",png:L.sync.write(e)}))).png)}async function e7(e){let{kind:t,...n}=await e3({kind:"diff-pixels",...e},()=>({kind:"diff-pixels",...U(e)}));return{...n,diffData:$(n.diffData)}}let te=[0,187,255,255];function tt(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 tn(e,t,n){return Math.min(Math.max(e,t),n)}let ta=[{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 tr(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(!ti(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 ta){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;ti(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 ti(e,t,n){return 1===e[n]&&1!==t[n]}let ts={icon:90,toggle:90,chevron:75,separator:45,visual:35,background:10},to={leading:20,trailing:20,separator:10,unknown:0,background:-30};function tl(e){return"background"!==e.likelyKind}function td(e,t){return e.width>=.25*t.width||e.height>=.06*t.height}function tu(e,t){let n,a=0;for(let r of t){let t=tm(e,r.rect);t<=a||(a=t,n=r)}return n}function tc(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,tm(t,a=n.rect)>0||Math.abs(Y(t).y-Y(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=X([e.rect,n.rect])}return t}function tp(e,t){let n,a=Y(e);for(let e of t){let t=Math.sqrt(j(a,Y(e.rect)));n&&t>=n.distance||(n={block:e,distance:t})}return n}function th(e){let t=tf(e);return e.differentPixels>=24&&t.width>=3&&t.height>=3}function tf(e){return{x:e.minX,y:e.minY,width:e.maxX-e.minX+1,height:e.maxY-e.minY+1}}function tm(e,t){return Math.max(0,Math.min(e.y+e.height,t.y+t.height)-Math.max(e.y,t.y))}async function tw(e){if(await H("tesseract"))try{let[t,n]=await Promise.all([tb(e.baselinePath),tb(e.currentPath)]);if(0!==t.exitCode||0!==n.exitCode)return;let a=tg(t.stdout,e.width,e.height),r=tg(n.stdout,e.width,e.height),i=function(e,t){let n=new Set,a=[];for(let i of e){var r;let e=tM(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(tM(o.text)!==t)continue;let l=Y(e.normalizedRect),d=j(l,Y(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=tR(t.rect.width/e.rect.width),r=tR(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)=>ty(t)-ty(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-tS(e.map(e=>e.delta.x))));e?e.push(n):t.push([n])}return t.filter(e=>e.length>=2).map(tk).filter(e=>e.yRange.max-e.yRange.min<=60).sort((e,t)=>tv(t)-tv(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 tg(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=tA(t,i,"level"),a=tx(t,i,"text").trim(),r=tA(t,i,"conf");if(5!==n||(o=a,!/[\p{L}\p{N}]/u.test(o))||r<0)continue;let l=tA(t,i,"left"),d=tA(t,i,"top"),u=tA(t,i,"width"),c=tA(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=X(a.map(e=>e.rect)),i=Math.round(100*tS(a.map(e=>e.confidence)))/100;return{text:a.map(e=>e.text).join(" "),confidence:i,rect:r,normalizedRect:K({x:tI(r.x/t),y:tI(r.y/n),width:tI(r.width/t),height:tI(r.height/n)})}})(e,t,n)).filter(e=>null!==e)}function tb(e){return V("tesseract",[e,"stdout","-l","eng","tsv"],{allowFailure:!0,timeoutMs:1e4})}function ty(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 tk(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 tv(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 tA(e,t,n){let a=Number(tx(e,t,n));return Number.isFinite(a)?a:0}function tM(e){return e.trim().replace(/\s+/g," ").toLowerCase()}function tS(e){return e.reduce((e,t)=>e+t,0)/e.length}function tI(e){return Math.round(100*e*100)/100}function tR(e){return Math.round(1e3*e)/1e3}function tP(e,t,n,a){return{r:Math.round(e/a),g:Math.round(t/a),b:Math.round(n/a)}}function tN(e){return .2126*e.r+.7152*e.g+.0722*e.b}function tD(e){return`#${t_(e.r)}${t_(e.g)}${t_(e.b)}`}function t_(e){return e.toString(16).padStart(2,"0")}function tO(e){return Math.round(100*e*100)/100}let tE=255*Math.sqrt(3);async function tT(e,t,r={}){var i,s,o,l,d;let u,c,p,h;await tC(e,"Baseline image not found"),await tC(t,"Current screenshot not found");let f=r.outputPath,[m,w]=await Promise.all([n.readFile(e),n.readFile(t)]),[g,b]=await Promise.all([e6(m,"baseline screenshot"),e6(w,"current screenshot")]);tU(g.width,g.height,"baseline screenshot",r.maxPixels),tU(b.width,b.height,"current screenshot",r.maxPixels);let y=r.threshold??.1;if(g.width!==b.width||g.height!==b.height){let e=g.width*g.height;return await tL(r.outputPath),{match:!1,mismatchPercentage:100,totalPixels:e,differentPixels:e,dimensionMismatch:{expected:{width:g.width,height:g.height},actual:{width:b.width,height:b.height}}}}let k=g.width*g.height,{diffData:v,diffMask:x,differentPixels:A}=await e7({width:g.width,height:g.height,baselineData:g.data,currentData:b.data,maxColorDistance:y*tE}),M=A>0?(s=(u=function(e){let{diffMask:t,baseline:n,current:a}=e,{width:r,height:i}=n;return tr({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:x,baseline:g,current:b,totalPixels:k,differentPixels:A,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,M,S,I,R,P,N,D;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=tP(n.baselineRed,n.baselineGreen,n.baselineBlue,n.differentPixels),x=tP(n.currentRed,n.currentGreen,n.currentBlue,n.differentPixels),A=y.width*y.height,M=tO(n.differentPixels/A),S=Math.round(tN(v)),I=Math.round(tN(x)),R=(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"),P=(f=A/r.totalPixels)>=.04?"large":f>=.01?"medium":"small",N=(d=v,u=x,m=tN(d),Math.abs(w=tN(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"),D=(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:K({x:tO(y.x/r.width),y:tO(y.y/r.height),width:tO(y.width/r.width),height:tO(y.height/r.height)}),differentPixels:n.differentPixels,shareOfDiffPercentage:tO(n.differentPixels/r.differentPixels),densityPercentage:M,shape:R,size:P,location:D,averageBaselineColorHex:tD(v),averageCurrentColorHex:tD(x),baselineLuminance:S,currentLuminance:I,dominantChange:N}}):[];if(A>0&&f){let e=new L({width:g.width,height:g.height,data:v});for(let t of M)t.rect.width<4||t.rect.height<4||function(e,t){let n=tn(t.x,0,e.width-1),a=tn(t.y,0,e.height-1),r=tn(t.x+t.width-1,0,e.width-1),i=tn(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)tt(e,s,a+t,te),tt(e,s,i-t,te);for(let s=a;s<=i;s+=1)tt(e,n+t,s,te),tt(e,r-t,s,te)}}(e,t.rect);await n.mkdir(a.dirname(f),{recursive:!0}),await n.writeFile(f,await e9(e))}else await tL(r.outputPath);let S=A>0?await tw({baselinePath:e,currentPath:t,width:g.width,height:g.height}):void 0,I=S&&(S.matches.length>0||(S.movementClusters?.length??0)>0)?{provider:S.provider,baselineBlocks:S.baselineBlocks,currentBlocks:S.currentBlocks,matches:S.matches,...S.movementClusters?{movementClusters:S.movementClusters}:{}}:void 0,R=A>0&&S?(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=F(Math.floor(a.x),0,t-1),i=F(Math.floor(a.y),0,n-1),s=F(Math.ceil(a.x+a.width),0,t),o=F(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,q(e.rect,8));return r}((o={diffMask:x,width:g.width,height:g.height,regions:M,ocr:S}).diffMask,o.width,o.height,o.ocr),d=o.width,tr({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=tc(o.ocr?.currentBlocksRaw??[]),h=tc(o.ocr?.baselineBlocksRaw??[]),c.filter(th).map(e=>{var t,n,a,r,i,s,l,d,u,c,f;let m,w,g,b,y,k,v,x,A,M;return t=e,n=o,a=p,r=h,b=function(e,t){let n,a=0;for(let r of t){let t=G(e,r.rect);t<=a||(a=t,n=r)}return n?.index}(g=tf(t),n.regions),y=function(e,t,n){let a=tu(e,t);if(a)return tp(e,a.blocks);let r=tu(e,n);return r?tp(e,r.blocks):void 0}(g,a,r),k=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),v=(i=g,s=k,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":td(i,d)?"background":"visual"),x={...b?{regionIndex:b}:{},slot:k,likelyKind:v,rect:g},{...b?{regionIndex:b}:{},slot:k,likelyKind:v,rect:g,...y?{nearestText:y.block.text.trim().replace(/^[^\p{L}\p{N}]+/u,"").replace(/^\p{L}\s+/u,"")}:{},score:(u=x,c=t.differentPixels,f=n,A=td(u.rect,f)?-35:0,M=20*!!u.regionIndex,ts[u.likelyKind]+to[u.slot]+M+A+Math.min(20,c/200))}}).filter(e=>e.rect.y>=.08*o.height).filter(tl).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}:{}}})):[],P=k>0?Math.round(A/k*1e4)/100:0;return{...A>0&&f?{diffPath:f}:{},...M.length>0?{regions:M}:{},...I?{ocr:I}:{},...R.length>0?{nonTextDeltas:R}:{},totalPixels:k,differentPixels:A,mismatchPercentage:P,match:0===A}}async function tC(e,t){try{await n.access(e)}catch{throw new C("INVALID_ARGS",`${t}: ${e}`)}}function tU(e,t,n,a){if(null==a||a<=0)return;let r=e*t;if(!(r<=a))throw new C("INVALID_ARGS",`${n} is ${r} pixels, which exceeds the configured maxImagePixels limit of ${a}`)}async function tL(e){if(e)try{await n.unlink(e)}catch(e){var t;if(!("object"==typeof(t=e)&&null!==t&&"code"in t&&"ENOENT"===t.code))throw e}}function t$(e){return e.width*e.height}function tB(e){return Math.round(100*e*100)/100}async function tq(e,t,n){if("path"===t.kind&&!e.policy.allowLocalInputPaths)throw new C("INVALID_ARGS",`Local ${n.field??"input"} paths are not allowed by command policy`);try{return await e.artifacts.resolveInput(t,n)}catch(e){throw E(e)}}async function tG(e,t,n){if(t?.kind==="path"&&!e.policy.allowLocalOutputPaths)throw new C("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 E(e)}}async function tX(e,t){try{return await e.artifacts.createTempFile(t)}catch(e){throw E(e)}}let tY=async(e,t)=>{let n,a,r;if(!t.baseline)throw new C("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 C("INVALID_ARGS","--threshold must be a number between 0 and 1");return t}(t.threshold),s=t.current??{kind:"live"};if(t.overlayRefs&&!tW(s))throw new C("INVALID_ARGS","diff screenshot <current.png> cannot use --overlay-refs because saved-image comparisons have no live accessibility refs");let o=await tq(e,t.baseline,{usage:"diff screenshot baseline",field:"baseline"}),l=[];try{let d;d=tW(s)?(a=await tF(e,t)).path:(n=await tq(e,s,{usage:"diff screenshot current",field:"current"})).path,r=t.out?await tG(e,t.out,{field:"diffPath",ext:".png"}):void 0;let u=await tT(o.path,d,{threshold:i,outputPath:r?.path,maxPixels:e.policy.maxImagePixels});tW(s)&&(u=await tK(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?.()}};async function tF(e,t){let n=await tX(e,{prefix:"agent-device-diff-current",ext:".png"});try{await tj(e,t,n.path,tH(t))}catch(e){throw await n.cleanup(),e}return n}async function tK(e,t,n,a,r){var i,s,o,l;if(!t.overlayRefs)return a;if(a.match||a.dimensionMismatch)return n&&await tz(n),a;let d=(i=t,s=n,i.currentOverlayOut?i.currentOverlayOut:i.out?.kind==="path"?{kind:"path",path:tV(s??i.out.path)}:i.out?.kind==="downloadableArtifact"?{kind:"downloadableArtifact",...i.out.clientPath?{clientPath:tV(i.out.clientPath)}:{},...i.out.fileName?{fileName:tV(i.out.fileName)}:{}}:void 0),u=await tG(e,d,{field:"currentOverlayPath",ext:".png"});try{let n=await tj(e,t,u.path,{overlayRefs:!0,...tH(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=t$(t.rect),n.map(e=>{let n=e.overlayRect,r=G(t.rect,n);return r<=0?null:{ref:e.ref,...e.label?{label:e.label}:{},rect:n,overlayCoveragePercentage:tB(r/t$(n)),regionCoveragePercentage:tB(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 tj(e,t,n,a={}){if(!e.backend.captureScreenshot)throw new C("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 tH(e){return e.surface?{surface:e.surface}:{}}function tV(e){let t=a.extname(e),n=t?e.slice(0,-t.length):e;return`${n}.current-overlay${t||".png"}`}async function tz(e){try{await n.unlink(tV(e))}catch(e){var t;if(!("object"==typeof(t=e)&&null!==t&&"code"in t&&"ENOENT"===t.code))throw e}}function tW(e){return"live"===e.kind}async function tJ(e,t){if(!Number.isInteger(t)||t<1)throw new C("INVALID_ARGS","Screenshot max size must be a positive integer");let a=await e6(await n.readFile(e),"screenshot"),r=Math.max(a.width,a.height);if(r<=t)return;let i=t/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 L({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 n.writeFile(e,await e9(l))}let tZ=async(e,t)=>{let n;if(!e.backend.captureScreenshot)throw new C("UNSUPPORTED_OPERATION","screenshot is not supported by this backend");let a=await tG(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 tJ(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}`)}};function tQ(e,t){let n=u(e.type??"Element"),a=k(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 t0(e,t){return t.flatten?e.map(e=>({text:f(e,0,!1),comparable:tQ(e,0)})):_(e).map(e=>({text:e.text,comparable:tQ(e.node,e.depth)}))}function t1(e,t){return e.get(t)??0}function t2(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}))}let t4=async(e,t)=>{var n;let a,r,i=await t5(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(t2(r.nodes))!==JSON.stringify(t2(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(t8(t.session,i)),{nodes:i.snapshot.nodes,truncated:i.snapshot.truncated??!1,visibility:function(e){let{nodes:t,backend:n,snapshotRaw:a}=e;if(a||!Z(n))return{partial:!1,visibleNodeCount:t.length,totalNodeCount:t.length,reasons:[]};let r=o(t),i=new Set;return r.hiddenCount>0&&i.add("offscreen-nodes"),r.nodes.some(e=>e.hiddenContentAbove)&&i.add("scroll-hidden-above"),r.nodes.some(e=>e.hiddenContentBelow)&&i.add("scroll-hidden-below"),{partial:i.size>0,visibleNodeCount:r.nodes.length,totalNodeCount:t.length,reasons:[...i]}}({nodes:i.snapshot.nodes,backend:i.snapshot.backend,snapshotRaw:t.raw}),...p({...i.annotations,warnings:i.warnings}),...s?{unchanged:s}:{},...i.result.snapshotDiagnostics?{snapshotDiagnostics:i.result.snapshotDiagnostics}:{},...(a=(n=i).result.appName??n.session?.appName,r=n.result.appBundleId??n.session?.appBundleId,{...a||r?{appName:a??r}:{},...r?{appBundleId:r}:{}})}},t3=async(e,t)=>{let n=await t5(e,t),a=!0===t.interactiveOnly,r=n.session?.snapshot,i=t8(t.session,n);if(!r){let t=function(e,t={}){return t0(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&&t1(i,r-1)<t1(i,r+1)?t1(i,r+1):t1(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&&t1(r,l-1)<t1(r,l+1)?l+1:l-1,u=t1(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[]}(t0(e,n),t0(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}:{}}};async function t5(e,t){var n,a,r,i,s,o,l;let u,c,p,f,m;if(!e.backend.captureSnapshot)throw new C("UNSUPPORTED_OPERATION","snapshot is not supported by this backend");let w=t.session??"default",g=await e.sessions.get(w),b=await e.backend.captureSnapshot({session:w,requestId:t.requestId,appId:g?.appId,appBundleId:g?.appBundleId,signal:t.signal??e.signal,metadata:t.metadata},{interactiveOnly:t.interactiveOnly,depth:t.depth,scope:t.scope,raw:t.raw}),y=(a=b,r=e,n=a.snapshot?a.snapshot:{nodes:a.nodes??[],truncated:a.truncated,backend:a.backend,createdAt:h(r)},n.presentationKey?n:{...n,presentationKey:J(t)}),k=R(b),v=h(e);return{snapshot:y,result:b,session:g,annotations:k,warnings:(u=[...(i={result:b,annotations:k,snapshot:y,options:t,session:g,capturedAt:y.createdAt??v,runtimeNow:v}).annotations.warnings??[]],i.annotations.quality&&u.push(...d(i.annotations.quality,i.snapshot.nodes)),u.push(...function(e){let t=e.annotations.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)),i.annotations.quality||(u.push(...function(e){if("xctest"!==e.snapshot.backend||!0!==e.options.interactiveOnly||1!==e.snapshot.nodes.length)return[];let t=e.snapshot.nodes[0];return t?.type!=="Application"?[]:["iOS interactive snapshot exposed only the application root. XCTest 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.push(...(c=new Set((s=i.snapshot.nodes).map(e=>e.parentIndex).filter(e=>void 0!==e)),s.filter(e=>!(c.has(e.index)||(e.type?.toLowerCase()??"").includes("text"))&&(e.label??"").split(", ").length>10).map(e=>{let t=(e.label??"").split(", ").length,n=e.identifier?` (${e.identifier})`:"";return`@${e.ref} [${e.type??"element"}]${n} merges ~${t} labels into a single accessibility element. The app likely marks a container as accessible, which hides every descendant from assistive tech and automation — the children cannot be addressed individually. Fix the app's accessibility (mark the rows, not the container); until then use screenshot as visual truth and coordinate taps.`})))),(p=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.annotations.androidSnapshot))&&u.push(p),(f=N(i.snapshot.nodes))&&u.push(f),(m=function(e){var t,n,a,r,i,s;let o=e.session?.snapshot;if(!e.annotations.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 t6}(i))&&u.push(m),u.push(...(o=i.annotations.freshness,l=i.snapshot.backend,o?.staleAfterRetries&&"android"===l?"stuck-route"===o.reason?[`Recent ${o.action} was followed by a nearly identical snapshot after ${o.retryCount} automatic retr${1===o.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"===o.reason?[t6]:[]:[])),Array.from(new Set(u)))}}function t8(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 t6="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.",t9=async(e,t)=>await nn(e,t,"press"),t7=async(e,t)=>await nn(e,t,"click"),ne=async(e,t)=>{var n;if(!t.text)throw new C("INVALID_ARGS","fill requires text");let a=await ni(e,t);if(a)return a;let r=await A(e,t,{action:"fill",requireInteractive:!0,promoteToHittableAncestor:!1});if(!e.backend.fill)throw new C("UNSUPPORTED_OPERATION","fill is not supported by this backend");let i=na(r),s=M(await e.backend.fill(I(e,t),i,t.text,{delayMs:t.delayMs})),o="node"in r?r.node?.type??"":"",l=o&&!ep(o,e.backend.platform)?`fill target ${n=r,n.target?.kind==="ref"?n.target.ref:n.target?.kind==="selector"?n.target.selector:"point"} resolved to "${o}", attempting fill anyway.`:void 0;return{...r,text:t.text,...l?{warning:l}:{},...s?{backendResult:s}:{}}},nt=async(e,t)=>{let n=t.text;if(!n)throw new C("INVALID_ARGS","type requires text");let a=eK(n);if(a)throw new C("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 C("UNSUPPORTED_OPERATION","type is not supported by this backend");let r=P(t.delayMs??0,"delay-ms",0,1e4),i=M(await e.backend.typeText(I(e,t),n,{delayMs:r}));return{kind:"text",text:n,delayMs:r,...i?{backendResult:i}:{},...b(`Typed ${Array.from(n).length} chars`)}};async function nn(e,t,n){let a=await nr(e,t,n);if(a)return a;let r=await A(e,t,{action:n,requireInteractive:!0,promoteToHittableAncestor:!0});if(!e.backend.tap)throw new C("UNSUPPORTED_OPERATION","tap is not supported by this backend");let i=na(r),s=M(await e.backend.tap(I(e,t),i,{button:t.button,count:t.count,intervalMs:t.intervalMs,holdMs:t.holdMs,jitterPx:t.jitterPx,doubleTap:t.doubleTap}));return{...r,...s?{backendResult:s}:{}}}function na(e){if(!e.point)throw new C("COMMAND_FAILED","Interaction target resolved without coordinates");return e.point}async function nr(e,t,n){var a;if("click"!==n||"ref"!==t.target.kind||!e.backend.tapTarget||void 0!==(a=t).count||void 0!==a.intervalMs||void 0!==a.holdMs||void 0!==a.jitterPx||void 0!==a.doubleTap||void 0!==a.button&&"primary"!==a.button)return null;let r=M(await e.backend.tapTarget(I(e,t),{kind:"ref",ref:t.target.ref,...t.target.fallbackLabel?{fallbackLabel:t.target.fallbackLabel}:{}}));return{kind:"ref",target:{kind:"ref",ref:t.target.ref},...r?{backendResult:r}:{}}}async function ni(e,t){if("ref"!==t.target.kind||!e.backend.fillTarget)return null;let n=M(await e.backend.fillTarget(I(e,t),{kind:"ref",ref:t.target.ref,...t.target.fallbackLabel?{fallbackLabel:t.target.fallbackLabel}:{}},t.text,{delayMs:t.delayMs}));return{kind:"ref",target:{kind:"ref",ref:t.target.ref},text:t.text,...n?{backendResult:n}:{}}}function ns(e){return["visible","hidden","exists","editable","selected","text"].includes(e)}function no(e){let{predicate:t,node:n,nodes:a,expectedText:r,platform:i}=e,s=ee(n),o=ec(n,i),l=!0===n.selected,d="text"===t?es(n):function(e,t,n){var a,r,i;let s;if("android"===n&&!1===e.visibleToUser)return!1;if(nl(e.rect))return function(e,t){return c(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=el(r),et(r,a,s,e=>!function(e,t){if("android"===t&&!1===e.visibleToUser)return!1;let n=eu(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&&nl(e.rect):!0===e.hittable||nl(e.rect))}(e,i)?null:e));return!!o&&(nl(o.rect)?function(e,t){return c(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 p="text"===t?`expected="${r??""}" actual="${s}"`:`actual=${JSON.stringify({visible:d,editable:o,selected:l})}`;return{pass:u,actualText:s,details:p}}function nl(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 nd(e,t){let n=t??"default",a=await e.sessions.get(n);if(!a)throw new C("SESSION_NOT_FOUND","No active session. Run open first.");if(!a.snapshot)throw new C("INVALID_ARGS","No snapshot in session. Run snapshot first.");return{sessionName:n,session:a,snapshot:a.snapshot}}async function nu(e,t,n={updateSession:!0}){let a=e.backend.captureSnapshot;if(!a)throw new C("UNSUPPORTED_OPERATION","snapshot is not supported by this backend");let r=t.session??"default",i=await e.sessions.get(r),s=await a(I(e,t),{interactiveOnly:!1,depth:t.depth,scope:n.scope??t.scope,raw:t.raw,includeRects:n.includeRects}),o=s.snapshot??{nodes:s.nodes??[],truncated:s.truncated,backend:s.backend,...s.quality?{snapshotQuality:s.quality}:{},createdAt:h(e)};return n.updateSession&&i&&!l(o.snapshotQuality)&&await e.sessions.set({...i,snapshot:o}),{sessionName:r,session:i,snapshot:o}}async function nc(e,t,n){if(e.backend.readText){let a=await e.backend.readText(I(e,{session:t.sessionName}),n);if(a.text.trim())return a.text}return eo(n)}let np=async(e,t)=>{let n=t.locator??"any";if(!t.query)throw new C("INVALID_ARGS","find requires a value");if("wait"===t.action)return await nv(e,t,n);let{capture:a,match:r}=await nx(e,t,n);if(!r)throw new C("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 nc(e,a,r),node:r}},nh=async(e,t)=>{if("ref"===t.target.kind){let n=await nd(e,t.session),a=function(e,t,n){let a=z(t);if(!a)throw new C("INVALID_ARGS",n.invalidRefMessage);let r=W(e,a)??(n.fallbackLabel.length>0?er(e,n.fallbackLabel):null);if(!r)throw new C("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=en(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 nc(e,n,a.node),node:a.node,selectorChain:r}}let n=await nI(e,t,t.session??"default",{selector:t.target.selector,disambiguateAmbiguous:"text"===t.property}),a=en(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 nc(e,n.capture,n.node);return{kind:"text",target:{kind:"selector",selector:n.selector},text:r,node:n.node,selectorChain:a}},nf=async(e,t)=>{let n=await nh(e,{...t,property:"text",target:t.target});if("text"!==n.kind)throw new C("COMMAND_FAILED","getText returned non-text result");return n},nm=async(e,t)=>{let n=await nh(e,{...t,property:"attrs",target:t.target});if("attrs"!==n.kind)throw new C("COMMAND_FAILED","getAttrs returned non-attrs result");return n},nw=async(e,t)=>{var n;if(!ns(t.predicate))throw new C("INVALID_ARGS","is requires predicate: visible|hidden|exists|editable|selected|text");if("text"===t.predicate&&!t.expectedText)throw new C("INVALID_ARGS","is text requires expected text value");let a="visible"===(n=t.predicate)||"hidden"===n,r=await nu(e,t,{updateSession:!0,includeRects:a}),i=em(t.selector);if("exists"===t.predicate){let n=Q(r.snapshot.nodes,i,{platform:e.backend.platform});if(!n)throw new C("COMMAND_FAILED",ed(i,[],{unique:!1}));return{predicate:t.predicate,pass:!0,selector:n.selector.raw,matches:n.matches,selectorChain:i.selectors.map(e=>e.raw)}}let s=ea(r.snapshot.nodes,i,{platform:e.backend.platform,requireRect:!1,requireUnique:!0,disambiguateAmbiguous:!1});if(!s)throw new C("COMMAND_FAILED",ed(i,[],{unique:!0}),{command:"is",reason:"selector_not_found",predicate:t.predicate,selector:i.raw});let o=no({predicate:t.predicate,node:s.node,nodes:r.snapshot.nodes,expectedText:t.expectedText,platform:e.backend.platform});if(!o.pass)throw new C("COMMAND_FAILED",`is ${t.predicate} failed for selector ${s.selector.raw}: ${o.details}`,{command:"is",reason:"predicate_failed",predicate:t.predicate,selector:s.selector.raw,predicateDetails:o.details});return{predicate:t.predicate,pass:!0,selector:s.selector.raw,..."text"===t.predicate?{text:o.actualText}:{},selectorChain:i.selectors.map(e=>e.raw)}},ng=async(e,t)=>await nw(e,{...t,predicate:"visible",selector:t.target.selector}),nb=async(e,t)=>await nw(e,{...t,predicate:"hidden",selector:t.target.selector}),ny=async(e,t)=>{if("sleep"===t.target.kind)return await m(e,t.target.durationMs),{kind:"sleep",waitedMs:t.target.durationMs};if("ref"===t.target.kind){let n=await nd(e,t.session),a=z(t.target.ref);if(!a)throw new C("INVALID_ARGS",`Invalid ref: ${t.target.ref}`);let r=W(n.snapshot.nodes,a),i=r?ei(r,n.snapshot.nodes):void 0;if(!i)throw new C("COMMAND_FAILED",`Ref ${t.target.ref} not found or has no label`);return await nM(e,t,i,t.target.timeoutMs)}if("selector"===t.target.kind)return await nA(e,t,t.target.selector,t.target.timeoutMs);if(!t.target.text)throw new C("INVALID_ARGS","wait requires text");return await nM(e,t,t.target.text,t.target.timeoutMs)},nk=async(e,t)=>{let n=await ny(e,{...t,target:{kind:"text",text:t.text,timeoutMs:t.timeoutMs}});if("text"!==n.kind)throw new C("COMMAND_FAILED","waitForText returned non-text result");return n};async function nv(e,t,n){let a=t.timeoutMs??1e4,r=h(e);for(;h(e)-r<a;){let{match:a}=await nx(e,t,n);if(a)return{kind:"found",found:!0,waitedMs:h(e)-r};await m(e,300)}throw new C("COMMAND_FAILED","find wait timed out")}async function nx(e,t,n){let a=eh(n,t.query),r=await nu(e,t,{updateSession:!0,scope:function(e,t,n,a){if(!a&&"web"!==e.backend.platform)return"text"===t||"label"===t||"any"===t?n:void 0}(e,n,t.query,a)});if(l(r.snapshot.snapshotQuality))throw new C("COMMAND_FAILED","find could not read the current accessibility tree",{reason:r.snapshot.snapshotQuality.reason,hint:"The snapshot quality verdict is sparse. Use screenshot as visual truth, navigate with coordinates if needed, then retry find after reaching a readable screen."});if(a){let t=ea(r.snapshot.nodes,a,{platform:e.backend.platform,requireRect:!1,requireUnique:!1});return{capture:r,match:t?.node}}let i=ef(r.snapshot.nodes,n,t.query,{requireRect:!1}).matches[0];return{capture:r,match:i}}async function nA(e,t,n,a){let r=a??1e4,i=h(e),s=em(n);for(;h(e)-i<r;){let n=Q((await nu(e,t,{updateSession:!0})).snapshot.nodes,s,{platform:e.backend.platform});if(n)return{kind:"selector",selector:n.selector.raw,waitedMs:h(e)-i};await m(e,300)}throw new C("COMMAND_FAILED",`wait timed out for selector: ${n}`)}async function nM(e,t,n,a){let r=a??1e4,i=h(e);for(;h(e)-i<r;){if(e.backend.findText?(await e.backend.findText(I(e,t),n)).found:await nS(e,t,n))return{kind:"text",text:n,waitedMs:h(e)-i};await m(e,300)}throw new C("COMMAND_FAILED",`wait timed out for text: ${n}`)}async function nS(e,t,n){return!!er((await nu(e,t,{updateSession:!0})).snapshot.nodes,n)}async function nI(e,t,n,a){let r=await nu(e,{...t,session:n},{updateSession:!0}),i=em(a.selector),s=ea(r.snapshot.nodes,i,{platform:e.backend.platform,requireRect:!1,requireUnique:!0,disambiguateAmbiguous:a.disambiguateAmbiguous});if(!s)throw new C("COMMAND_FAILED",ed(i,[],{unique:!0}));return{capture:r,node:s.node,selector:s.selector.raw,ref:`@${s.node.ref}`}}function nR(e,t){if(void 0!==e)return nP(e,t)}function nP(e,t){let n=e?.trim();if(!n)throw new C("INVALID_ARGS",`${t} must be a non-empty string`);return n}let nN=async(e,t={})=>{if(!e.backend.listDevices)throw new C("UNSUPPORTED_OPERATION","admin.devices is not supported by this backend");return{kind:"adminDevices",devices:await e.backend.listDevices(I(e,t),t.filter)}},nD=async(e,t={})=>{if(!e.backend.bootDevice)throw new C("UNSUPPORTED_OPERATION","admin.boot is not supported by this backend");let n=nB(t.target),a=M(await e.backend.bootDevice(I(e,t),n));return{kind:"deviceBooted",...n?{target:n}:{},...a?{backendResult:a}:{},...b("Booted device")}},n_=async(e,t={})=>{if(!e.backend.shutdownDevice)throw new C("UNSUPPORTED_OPERATION","admin.shutdown is not supported by this backend");let n=nB(t.target),a=M(await e.backend.shutdownDevice(I(e,t),n));return{kind:"deviceShutdown",...n?{target:n}:{},...a?{backendResult:a}:{},...b("Shutdown device")}},nO=async(e,t)=>await nC(e,t,"install"),nE=async(e,t)=>await nC(e,t,"reinstall"),nT=async(e,t)=>await nC(e,t,"installFromSource");async function nC(e,t,n){let a="reinstall"===n?"reinstallApp":"installApp",r=e.backend[a];if(!r)throw new C("UNSUPPORTED_OPERATION",`admin.${n} is not supported by this backend`);let i="app"in t&&void 0!==t.app?nP(t.app,"app"):void 0;if("installFromSource"!==n&&!i)throw new C("INVALID_ARGS",`admin.${n} requires app`);let s=I(e,t),o=await nU(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=M(c),a=nq(c,"appName"),h=nq(c,"appId"),f=nq(c,"bundleId"),m=nq(c,"packageName"),w=nq(c,"launchTarget"),g=nq(c,"installablePath"),y=nq(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 nU(e,t,n){let a=n$(n),r=await nL(e,a);try{let n=e.backend.resolveInstallSource?await e.backend.resolveInstallSource(t,r.source):r.source;return{source:n$(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 tq(e,t,{usage:"admin.install",field:"source"});return{source:{kind:"path",path:n.path},...n.cleanup?{cleanup:n.cleanup}:{}}}function n$(e){if(!e||"object"!=typeof e)throw new C("INVALID_ARGS","install source is required");if("path"===e.kind)return{kind:"path",path:nP(e.path,"source.path")};if("uploadedArtifact"===e.kind)return{kind:"uploadedArtifact",id:nP(e.id,"source.id")};if("url"===e.kind){let t=nP(e.url,"source.url");return function(e){let t;try{t=new URL(e)}catch{throw new C("INVALID_ARGS",`Invalid install source URL: ${e}`)}if("http:"!==t.protocol&&"https:"!==t.protocol)throw new C("INVALID_ARGS","Install source URL must use http or https")}(t),{kind:"url",url:t}}throw new C("INVALID_ARGS","install source kind must be path, uploadedArtifact, or url")}function nB(e){if(!e)return;let t=nR(e.id,"target.id"),n=nR(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 nq(e,t){let n=e[t];return"string"==typeof n&&n.length>0?n:void 0}let nG=/^[A-Za-z0-9_.:-]{1,64}$/,nX=async(e,t)=>{var n;if(!e.backend.openApp)throw new C("UNSUPPORTED_OPERATION","apps.open is not supported by this backend");let a=function(e){var t;let n=nR(e.app,"app"),a=nR(e.appId,"appId"),r=nR(e.bundleId,"bundleId"),i=nR(e.packageName,"packageName"),s=nR(e.url,"url"),o=nR(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 C("INVALID_ARGS","apps.open requires app, appId, bundleId, packageName, url, or activity");return l}(t),r=M(await e.backend.openApp(nW(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"}`)}},nY=async(e,t={})=>{if(!e.backend.closeApp)throw new C("UNSUPPORTED_OPERATION","apps.close is not supported by this backend");let n=nR(t.app,"app"),a=M(await e.backend.closeApp(nW(e,t),n));return{kind:"appClosed",...n?{app:n}:{},...a?{backendResult:a}:{},...b(n?`Closed: ${n}`:"Closed app")}},nF=async(e,t={})=>{if(!e.backend.listApps)throw new C("UNSUPPORTED_OPERATION","apps.list is not supported by this backend");return{kind:"appsList",apps:await e.backend.listApps(nW(e,t),ek(t.filter))}},nK=async(e,t)=>{if(!e.backend.getAppState)throw new C("UNSUPPORTED_OPERATION","apps.state is not supported by this backend");let n=nP(t.app,"app"),a=await e.backend.getAppState(nW(e,t),n);return{kind:"appState",app:n,state:a}},nj=async(e,t)=>{if(!e.backend.pushFile)throw new C("UNSUPPORTED_OPERATION","apps.push is not supported by this backend");let n=nP(t.app,"app"),a=await nV(e,t.input);try{let r=await e.backend.pushFile(nW(e,t),a.backendInput,n),i=M(r);return{kind:"appPushed",app:n,inputKind:a.inputKind,...i?{backendResult:i}:{},...b(`Pushed to ${n}`)}}finally{await a.cleanup?.()}},nH=async(e,t)=>{var n,a;if(!e.backend.triggerAppEvent)throw new C("UNSUPPORTED_OPERATION","apps.triggerEvent is not supported by this backend");let r=function(e){let t=nP(e,"name");if(!nG.test(t))throw new C("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&&nz(n,a,8192);let i=M(await e.backend.triggerAppEvent(nW(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}`)}};async function nV(e,t){if(!t||"object"!=typeof t)throw new C("INVALID_ARGS","apps.push requires an input");if("json"===t.kind)return nz(t.payload,"apps.push JSON payload",8192),{backendInput:{kind:"json",payload:t.payload},inputKind:"json"};let n=await tq(e,t,{usage:"apps.push",field:"input"});return{backendInput:{kind:"file",path:n.path},inputKind:"file",...n.cleanup?{cleanup:n.cleanup}:{}}}function nz(e,t,n){if(function(e,t){if(!e||"object"!=typeof e||Array.isArray(e))throw new C("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 C("INVALID_ARGS",`${t} must be JSON-serializable`);return n}catch{throw new C("INVALID_ARGS",`${t} must be JSON-serializable`)}}(e,t),"utf8")>n)throw new C("INVALID_ARGS",`${t} exceeds ${n} bytes`)}function nW(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}let nJ=/(?:authorization|cookie|token|secret|password|passwd|api[-_]?key)/i,nZ=/\b[A-Za-z0-9_-]{16,}\.[A-Za-z0-9_-]{16,}\.[A-Za-z0-9_-]{16,}\b/g;function nQ(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(nZ,()=>(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=n0(e);return t?(t.redacted&&n(),t.value):e}):t),redacted:a}}function n0(e){try{let t=new URL(e),n=function(e){let t=!1;for(let n of Array.from(e.searchParams.keys()))nJ.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 n1=/(?:authorization|cookie|token|secret|password|passwd|api[-_]?key)/i;function n2(e){if(!e)return{redacted:!1};let t=!1,n={};for(let[a,r]of Object.entries(e))if(n1.test(a))n[a]="[REDACTED]",t=!0;else{let e=n8(r,2048);n[a]=e.value??"",t||=e.redacted}return{value:n,redacted:t}}function n4(e){return void 0===e?{redacted:!1}:function(e){try{let t=JSON.parse(e),n=n5(t,nQ);return n6(JSON.stringify(n.value),2048,n.redacted)}catch{return}}(e)??n8(e,2048)}function n3(e){return n5(e,e=>n8(e,2048))}function n5(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=n5(e,t);return n||=a.redacted,a.value}),redacted:n}}let n=!1,a={};for(let[r,i]of Object.entries(e)){if(n1.test(r)){a[r]="[REDACTED]",n=!0;continue}let e=n5(i,t);a[r]=e.value,n||=e.redacted}return{value:a,redacted:n}}function n8(e,t){if(void 0===e)return{redacted:!1};let n=nQ(e);return n6(n.value,t,n.redacted)}function n6(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}}let n9=async(e,t={})=>{var n,a;let r;if(!e.backend.readLogs)throw new C("UNSUPPORTED_OPERATION","diagnostics.logs is not supported by this backend");return r=!0===(n=await e.backend.readLogs(await at(e,t),{...an(a=t,100,500,"logs limit"),...void 0!==a.levels?{levels:ar(a.levels,"levels")}:{},...void 0!==a.search?{search:nP(a.search,"search")}:{},...void 0!==a.source?{source:nP(a.source,"source")}:{}})).redacted,{kind:"diagnosticsLogs",entries:n.entries.map(e=>{let t=n8(e.message,4096),n=n3(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}:{}}},n7=async(e,t={})=>{var n,a,r;let i;if(!e.backend.dumpNetwork)throw new C("UNSUPPORTED_OPERATION","diagnostics.network is not supported by this backend");let s={...an(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 C("INVALID_ARGS","network include must be summary, headers, body, or all")}(r.include)};return n=await e.backend.dumpNetwork(await at(e,t),s),a=s.include??"summary",i=!0===n.redacted,{kind:"diagnosticsNetwork",entries:n.entries.map(e=>{var t;let n=e.url?n0(t=e.url)??n8(t,2048):void 0,r="headers"===a||"all"===a?n2(e.requestHeaders):void 0,s="headers"===a||"all"===a?n2(e.responseHeaders):void 0,o="body"===a||"all"===a?n4(e.requestBody):void 0,l="body"===a||"all"===a?n4(e.responseBody):void 0,d=n3(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}:{}}},ae=async(e,t={})=>{var n,a;let r;if(!e.backend.measurePerf)throw new C("UNSUPPORTED_OPERATION","diagnostics.perf is not supported by this backend");return r=!0===(n=await e.backend.measurePerf(await at(e,t),{...aa(a=t),...void 0!==a.sampleMs?{sampleMs:P(a.sampleMs,"sampleMs",100,6e4)}:{},...void 0!==a.metrics?{metrics:ar(a.metrics,"metrics",20)}:{}})).redacted,{kind:"diagnosticsPerf",metrics:n.metrics.map(e=>{let t=n8(e.message,4096),n=n3(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}:{}}};async function at(e,t){let n=I(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 an(e,t,n,a){return{...aa(e),...void 0!==e.cursor?{cursor:nP(e.cursor,"cursor")}:{},limit:void 0===e.limit?t:P(e.limit,a,1,n)}}function aa(e){return{...void 0!==e.since?{since:nP(e.since,"since")}:{},...void 0!==e.until?{until:nP(e.until,"until")}:{}}}function ar(e,t,n=50){if(!Array.isArray(e))throw new C("INVALID_ARGS",`${t} must be an array of strings`);if(e.length>n)throw new C("INVALID_ARGS",`${t} must contain at most ${n} entries`);return e.map((e,n)=>nP(e,`${t}[${n}]`))}let ai=async(e,t)=>{let n=ao(t.action,"record"),a="start"===n?e.backend.startRecording:e.backend.stopRecording;if(!a)throw new C("UNSUPPORTED_OPERATION",`record ${n} is not supported by this backend`);let r=t.out?await tG(e,t.out,{field:"path",ext:".mp4"}):void 0;try{var i,s,o,l,d,u,c;let p,h,f,m,w=(i=t,s=r?.path,p={},s&&(p.outPath=s),h=(o=i.fps,void 0===o?void 0:P(o,"fps",1,60)),void 0!==h&&(p.fps=h),f=(l=i.maxSize,void 0===l?void 0:P(l,"maxSize",1,Number.MAX_SAFE_INTEGER)),void 0!==f&&(p.maxSize=f),m=function(e){if(void 0===e)return;let t=S(e);if(void 0===t)throw new C("INVALID_ARGS","quality must be one of: medium, high (legacy numeric values 5-10 are accepted)");return t}(i.quality),void 0!==m&&(p.quality=m),void 0!==i.hideTouches&&(p.showTouches=!0!==i.hideTouches),p),g=await a.call(e.backend,I(e,t),w),b=await r?.publish();return d=n,u=g,c=b,{..."string"==typeof u.path?{path:u.path}:{},..."string"==typeof u.telemetryPath?{telemetryPath:u.telemetryPath}:{},..."string"==typeof u.warning?{warning:u.warning}:{},...al(d,u,c,{startKind:"recordingStarted",stopKind:"recordingStopped",startMessage:"Recording started",stopMessage:"Recording stopped"})}}catch(e){throw await r?.cleanup?.(),e}},as=async(e,t)=>{let n=ao(t.action,"trace"),a="start"===n?e.backend.startTrace:e.backend.stopTrace;if(!a)throw new C("UNSUPPORTED_OPERATION",`trace ${n} is not supported by this backend`);let r=t.out?await tG(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,I(e,t),l),u=await r?.publish();return i=n,s=d,o=u,{..."string"==typeof s.outPath?{outPath:s.outPath}:{},...al(i,s,o,{startKind:"traceStarted",stopKind:"traceStopped",startMessage:"Trace started",stopMessage:"Trace stopped"})}}catch(e){throw await r?.cleanup?.(),e}};function ao(e,t){if("start"===e||"stop"===e)return e;throw new C("INVALID_ARGS",`${t} action must be start or stop`)}function al(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 ad=async(e,t={})=>{if(!e.backend.pressBack)throw new C("UNSUPPORTED_OPERATION","system.back is not supported by this backend");let n=t.mode??"in-app";if("in-app"!==n&&"system"!==n)throw new C("INVALID_ARGS","system.back mode must be in-app or system");let a=M(await e.backend.pressBack(I(e,t),{mode:n}));return{kind:"systemBack",mode:n,...a?{backendResult:a}:{},...b("Back")}},au=async(e,t={})=>{if(!e.backend.pressHome)throw new C("UNSUPPORTED_OPERATION","system.home is not supported by this backend");let n=M(await e.backend.pressHome(I(e,t)));return{kind:"systemHome",...n?{backendResult:n}:{},...b("Home")}},ac=async(e,t)=>{if(!e.backend.rotate)throw new C("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 C("INVALID_ARGS","system.rotate orientation must be portrait, portrait-upside-down, landscape-left, or landscape-right")}}(t.orientation),a=M(await e.backend.rotate(I(e,t),n));return{kind:"systemRotated",orientation:n,...a?{backendResult:a}:{},...b(`Rotated to ${n}`)}},ap=async(e,t={})=>{var n,a,r,i,s,o,l;if(!e.backend.setKeyboard)throw new C("UNSUPPORTED_OPERATION","system.keyboard is not supported by this backend");let d=t.action??"status";if(!eF(d))throw new C("INVALID_ARGS","system.keyboard action must be status, get, dismiss, enter, or return");let u=await e.backend.setKeyboard(I(e,t),{action:d}),c=M(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}:{}})},ah=async(e,t)=>{if("read"===t.action){if(!e.backend.getClipboard)throw new C("UNSUPPORTED_OPERATION","system.clipboard read is not supported by this backend");let n=await e.backend.getClipboard(I(e,t));return{kind:"clipboardText",action:"read",text:"string"==typeof n?n:n.text}}if("write"!==t.action)throw new C("INVALID_ARGS","system.clipboard action must be read or write");if(!e.backend.setClipboard)throw new C("UNSUPPORTED_OPERATION","system.clipboard write is not supported by this backend");if("string"!=typeof t.text)throw new C("INVALID_ARGS","system.clipboard write requires text");let n=M(await e.backend.setClipboard(I(e,t),t.text));return{kind:"clipboardUpdated",action:"write",textLength:Array.from(t.text).length,...n?{backendResult:n}:{},...b("Clipboard updated")}},af=async(e,t={})=>{if(!e.backend.openSettings)throw new C("UNSUPPORTED_OPERATION","system.settings is not supported by this backend");let n=nR(t.target,"target"),a=M(await e.backend.openSettings(I(e,t),n));return{kind:"settingsOpened",...n?{target:n}:{},...a?{backendResult:a}:{},...b(n?`Opened settings: ${n}`:"Opened settings")}},am=async(e,t={})=>{var n,a;if(!e.backend.handleAlert)throw new C("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 C("INVALID_ARGS","system.alert action must be get, accept, dismiss, or wait");let i=void 0===t.timeoutMs?void 0:P(t.timeoutMs,"timeoutMs",0,12e4),s=await e.backend.handleAlert(I(e,t),r,{timeoutMs:i});return n=r,a=s,"get"===n?function(e){if("alertStatus"!==e.kind)throw new C("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 C("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 C("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)},aw=async(e,t={})=>{if(!e.backend.openAppSwitcher)throw new C("UNSUPPORTED_OPERATION","system.appSwitcher is not supported by this backend");let n=M(await e.backend.openAppSwitcher(I(e,t)));return{kind:"appSwitcherOpened",...n?{backendResult:n}:{},...b("Opened app switcher")}};function ag(e){let t={backend:e.backend,artifacts:e.artifacts,sessions:e.sessions??function(e=[]){let t=new Map(e.map(e=>[e.name,ab(e)]));return{get:e=>ab(t.get(e)),set:e=>{t.set(e.name,ab(e))},delete:e=>{t.delete(e)},list:()=>Array.from(t.values(),e=>ab(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=>tZ(t,e),diffScreenshot:e=>tY(t,e),snapshot:e=>t4(t,e),diffSnapshot:e=>t3(t,e)},selectors:{find:e=>np(t,e),get:e=>nh(t,e),getText:(e,n={})=>nf(t,{...n,target:e}),getAttrs:(e,n={})=>nm(t,{...n,target:e}),is:e=>nw(t,e),isVisible:(e,n={})=>ng(t,{...n,target:e}),isHidden:(e,n={})=>nb(t,{...n,target:e}),wait:e=>ny(t,e),waitForText:(e,n={})=>nk(t,{...n,text:e})},interactions:{click:(e,n={})=>t7(t,{...n,target:e}),press:(e,n={})=>t9(t,{...n,target:e}),fill:(e,n,a={})=>ne(t,{...a,target:e,text:n}),typeText:(e,n={})=>nt(t,{...n,text:e}),focus:(e,n={})=>v(t,{...n,target:e}),longPress:(e,n={})=>y(t,{...n,target:e}),swipe:e=>x(t,e),scroll:e=>w(t,e),pinch:e=>D(t,e)},system:{back:e=>ad(t,e),home:e=>au(t,e),rotate:e=>ac(t,e),keyboard:e=>ap(t,e),clipboard:e=>ah(t,e),settings:e=>af(t,e),alert:e=>am(t,e),appSwitcher:e=>aw(t,e)},apps:{open:e=>nX(t,e),close:e=>nY(t,e),list:(e={})=>nF(t,{...e,filter:ey(e.filter)}),state:e=>nK(t,e),push:e=>nj(t,e),triggerEvent:e=>nH(t,e)},admin:{devices:e=>nN(t,e),boot:e=>nD(t,e),shutdown:e=>n_(t,e),install:e=>nO(t,e),reinstall:e=>nE(t,e),installFromSource:e=>nT(t,e)},recording:{record:e=>ai(t,e),trace:e=>as(t,e)},observability:{logs:e=>n9(t,e),network:e=>n7(t,e),perf:e=>ae(t,e)}}}function ab(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 ay(e={}){return{allowLocalInputPaths:!0,allowLocalOutputPaths:!0,maxImagePixels:2e7,allowNamedBackendCapabilities:[],...e}}async function ak(e){let{lockDirPath:n,owner:r}=e,i=a.join(n,"owner.json"),s=Date.now()+(e.timeoutMs??3e4),o=e.pollMs??100,l=e.ownerGraceMs??5e3,d=e.description??"process lock";for(t.mkdirSync(a.dirname(n),{recursive:!0});Date.now()<s;)try{t.mkdirSync(n),function(e,n){let a=`${e}.${process.pid}.${Date.now()}.tmp`;t.writeFileSync(a,JSON.stringify(n),"utf8"),t.renameSync(a,e)}(i,r);let e=!1;return async()=>{e||(e=!0,t.rmSync(n,{recursive:!0,force:!0}))}}catch(e){if("EEXIST"!==e.code)throw e;if(function(e,n,a){let r=null;try{r=t.statSync(e)}catch{return!0}let i=av(n);if(i){var s;return!(Number.isInteger((s=i).pid)&&!(s.pid<=0)&&ew(s.pid)&&(!s.startTime||eg(s.pid)===s.startTime))&&(t.rmSync(e,{recursive:!0,force:!0}),!0)}return!(Date.now()-r.mtimeMs<a)&&(t.rmSync(e,{recursive:!0,force:!0}),!0)}(n,i,l))continue;await eb(o)}throw new C("COMMAND_FAILED",`Timed out waiting for ${d}`,{lockDirPath:n,...function(e,n){let a,r=Date.now(),i=av(n);try{a=Math.max(0,Math.round(r-t.statSync(e).mtimeMs))}catch{}return{...void 0!==a?{lockAgeMs:a}:{},...i?{ownerPid:i.pid,ownerStartTime:i.startTime,ownerAgeMs:Math.max(0,Math.round(r-i.acquiredAtMs))}:{}}}(n,i)})}function av(e){try{return JSON.parse(t.readFileSync(e,"utf8"))}catch{return null}}let ax="0.27.1",aA="agent-browser";async function aM(e){let t=aR(e);if(t.installed){var n=t;if(!n.installed)throw a_(n);return{command:n.binaryPath,env:aD(n,process.env)}}throw a_(t)}async function aS(e){let n=aR(e);var r,i=n.nodeMajor;if(!(i>=24))throw new C("UNSUPPORTED_OPERATION","Web automation requires Node 24 or newer.",{currentNode:process.version,requiredNodeMajor:24,hint:"Run agent-device with Node 24+ for web setup and web automation."});let s=await ak({lockDirPath:a.join(n.installDir,"..",".agent-browser-install.lock"),owner:{pid:process.pid,startTime:eg(process.pid),acquiredAtMs:Date.now()},timeoutMs:3e5,description:"managed agent-browser setup"});try{let n=aR(e);if(n.installed)return n;return t.mkdirSync(n.installDir,{recursive:!0}),await aP(n),await aN(n,["install"],{timeoutMs:3e5}),await aN(n,["doctor","--offline","--quick"],{timeoutMs:6e4}),r=n,t.writeFileSync(a.join(r.installDir,"manifest.json"),JSON.stringify({package:aA,version:ax,node:process.version,installedAt:new Date().toISOString()},null,2),"utf8"),aR(e)}finally{await s()}}async function aI(e){let t=aR(e);if(!t.installed)throw a_(t);let n=await aN(t,["doctor","--offline","--quick"],{timeoutMs:6e4,allowFailure:!0});return{status:t,...n}}function aR(n){var r,i,o;let l,d,u=n.stateDir??process.env.AGENT_DEVICE_STATE_DIR??a.join(process.env.HOME??process.cwd(),".agent-device"),c=a.join(u,"tools","agent-browser",ax),p=(r=c,l=a.join(r,"package"),a.join(l,"node_modules",".bin","win32"===process.platform?"agent-browser.cmd":"agent-browser")),h=a.join(c,"home"),f=function(t){if("win32"===process.platform)return a.join(t,"home");let n=e.createHash("sha1").update(t).digest("hex").slice(0,12);return a.join(s.tmpdir(),"agent-device-web",n)}(c),m=(i=c,d=e.createHash("sha1").update(i).digest("hex").slice(0,12),a.join(s.tmpdir(),"adw",d)),w=function(e){try{return t.accessSync(e,t.constants.X_OK),!0}catch{return!1}}(p)&&(o=c,t.existsSync(a.join(o,"manifest.json"))),g=Number.parseInt(process.versions.node.split(".")[0]??"0",10);return{version:ax,stateDir:u,installDir:c,binaryPath:p,homeDir:h,runtimeHomeDir:f,socketDir:m,installed:w,nodeMajor:g,nodeSupported:g>=24}}async function aP(e){let n=a.join(e.installDir,"package");t.mkdirSync(n,{recursive:!0}),await V("npm",["install","--prefix",n,"--no-audit","--no-fund","--no-save",`${aA}@${ax}`],{env:process.env,timeoutMs:3e5})}async function aN(e,t,n){return await V(e.binaryPath,t,{allowFailure:n.allowFailure,env:aD(e,process.env),timeoutMs:n.timeoutMs})}function aD(e,n){return t.mkdirSync(e.homeDir,{recursive:!0}),function(e){if(e.runtimeHomeDir!==e.homeDir){t.mkdirSync(a.dirname(e.runtimeHomeDir),{recursive:!0});try{let n=t.lstatSync(e.runtimeHomeDir);if(n.isSymbolicLink()&&t.readlinkSync(e.runtimeHomeDir)===e.homeDir||n.isDirectory())return;n.isSymbolicLink()&&t.unlinkSync(e.runtimeHomeDir)}catch(e){var n;if(!("object"==typeof(n=e)&&null!==n&&"code"in n&&"ENOENT"===n.code))throw e}try{t.symlinkSync(e.homeDir,e.runtimeHomeDir,"dir")}catch{t.mkdirSync(e.runtimeHomeDir,{recursive:!0})}}}(e),t.mkdirSync(e.socketDir,{recursive:!0}),{...n,HOME:e.runtimeHomeDir,AGENT_BROWSER_SOCKET_DIR:e.socketDir}}function a_(e){return new C("TOOL_MISSING","Managed web browser backend is not installed.",{version:ax,installDir:e.installDir,hint:!1===e.nodeSupported?`Web automation requires Node 24+; current Node is ${process.version}.`:"Run `agent-device web setup` to install the managed web backend."})}function aO(e){let t=E(e);return"TOOL_MISSING"!==t.code?t:new C(t.code,t.message,{...t.details??{},hint:"string"==typeof t.details?.hint?t.details.hint:"Run `agent-device web setup` to install the managed web backend."})}export{ak as acquireProcessLock,eC as appendScriptSeriesFlags,ag as createAgentDevice,e6 as decodePngAsync,aI as doctorManagedAgentBrowser,e9 as encodePngAsync,no as evaluateIsPredicate,eK as findMistargetedTypeRefToken,eG as formatPortableActionLine,eT as formatScriptActionSummary,eN as formatScriptArg,eD as formatScriptStringLiteral,eI as isClickLikeCommand,eF as isKeyboardAction,ns as isSupportedPredicate,eR as isTouchTargetCommand,ay as localCommandPolicy,aO as mapManagedAgentBrowserError,eq as parseReplayOpenFlags,e$ as parseReplayRuntimeFlags,eL as parseReplaySeriesFlags,e5 as prewarmPngWorker,aM as resolveAgentBrowserTool,aS as setupManagedAgentBrowser,e8 as terminatePngWorker,eX as timingSafeStringEqual};