agent-device 0.16.1 → 0.16.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/android-multitouch-helper/dist/{agent-device-android-multitouch-helper-0.16.1.apk → agent-device-android-multitouch-helper-0.16.2.apk} +0 -0
- package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.16.2.apk.sha256 +1 -0
- package/android-multitouch-helper/dist/{agent-device-android-multitouch-helper-0.16.1.manifest.json → agent-device-android-multitouch-helper-0.16.2.manifest.json} +4 -4
- package/android-snapshot-helper/dist/{agent-device-android-snapshot-helper-0.16.1.apk → agent-device-android-snapshot-helper-0.16.2.apk} +0 -0
- package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.16.2.apk.sha256 +1 -0
- package/android-snapshot-helper/dist/{agent-device-android-snapshot-helper-0.16.1.manifest.json → agent-device-android-snapshot-helper-0.16.2.manifest.json} +6 -6
- package/dist/src/6277.js +4 -0
- package/dist/src/7519.js +1 -1
- package/dist/src/89.js +1 -1
- package/dist/src/9542.js +3 -2
- package/dist/src/batch.d.ts +1 -0
- package/dist/src/cli.js +2 -2
- package/dist/src/contracts.d.ts +1 -0
- package/dist/src/contracts.js +1 -1
- package/dist/src/index.d.ts +1 -0
- package/dist/src/internal/daemon.js +51 -51
- package/dist/src/server.js +1 -1
- package/package.json +1 -4
- package/server.json +2 -2
- package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.16.1.apk.sha256 +0 -1
- package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.16.1.apk.sha256 +0 -1
- package/dist/src/2099.js +0 -1
package/dist/src/7519.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{promises as e}from"node:fs";import{PNG as t}from"pngjs";import a from"node:path";import{normalizeRef as n,centerOfRect as r,buildSnapshotPresentationKey as i,findNodeByRef as s}from"./4057.js";import{isScrollableNodeLike as o}from"./2842.js";import{asAppError as l,AppError as c}from"./9152.js";import{SCREENSHOT_SPECIFIC_FLAG_DEFINITIONS as u,SCREENSHOT_COMMAND_FLAG_KEYS as d,successText as p}from"./2099.js";import{whichCmd as h,runCmd as m}from"./9818.js";import{trimText as f,extractNodeText as g,parseSelectorChain as b,isNodeVisible as w,isNodeEditable as y,buildTextPreview as k,findNearestHittableAncestor as v,buildSelectorChainForNode as x,findSelectorChainMatch as A,resolveSelectorChain as M,findNodeByLabel as D,resolveRefLabel as I,describeTextSurface as S,extractReadableText as R,formatSelectorFailure as N,normalizeType as O,isFillableType as P}from"./940.js";import{findBestMatchesByLocator as L}from"./7556.js";import"./7847.js";import{resolveAppsFilter as E,DEFAULT_APPS_FILTER as _,assertResolvedAppsFilter as T}from"./3622.js";import{listCommandDefinitions as C}from"./89.js";function $(e,t,a){return t>=e.x&&t<=e.x+e.width&&a>=e.y&&a<=e.y+e.height}function U(e){let t=null,a=-1;for(let n of e){let e=n.width*n.height;e>a&&(t=n,a=e)}return t}function F(e,t,a,n){return Math.max(e,a)<=Math.min(t,n)}function B(e){let t=e.trim().toLowerCase();return!!t&&/^(vertical|horizontal)\s+scroll\s+bar(?:,?\s*\d+\s+pages?)?$/.test(t)}function V(e,t){if(!(e?.trim().toLowerCase()??"").includes("vertical scroll bar"))return null;let a=function(e){if(!e)return null;let t=/^(\d{1,3})%$/.exec(e.trim());if(!t)return null;let a=Number(t[1]);return Number.isFinite(a)?Math.max(0,Math.min(100,a)):null}(t);return null===a?null:a<=1?{above:!1,below:!0}:a>=99?{above:!0,below:!1}:{above:!0,below:!0}}function q(e){let t=new Map;for(let[a,n]of e.entries())t.set(n.index,a);let a=[],n=[];for(let[r,i]of e.entries()){let e=Math.max(0,i.depth??0);for(;n.length>0&&e<=n[n.length-1].depth;)n.pop();let s="number"==typeof i.parentIndex?t.get(i.parentIndex):void 0,o="number"==typeof s&&s<r?s:n[n.length-1]?.index;a.push({...i,index:r,depth:e,parentIndex:o}),n.push({depth:e,index:r})}return a}function G(e){return new Map(e.map(e=>[e.index,e]))}function j(e){return e.label?.trim()||e.value?.trim()||e.identifier?.trim()||""}function X(e){if(0===e.length)return{nodes:e,hiddenCount:0,summaryLines:[]};let{byIndex:t,visibleNodeIndexes:a,offscreenNodes:n,hintedContainers:r}=K(e),i=0===a.size?e:e.filter(e=>a.has(e.index));return{nodes:i.map(e=>(function(e,t){let a=t.get(e.index);if(!a||0===a.size)return e;let n=!!(!0===e.hiddenContentAbove||a.has("above"))||void 0,r=!!(!0===e.hiddenContentBelow||a.has("below"))||void 0;return{...e,hiddenContentAbove:n,hiddenContentBelow:r}})(e,r.directionsByContainer)),hiddenCount:0===a.size?0:e.length-i.length,summaryLines:function(e,t,a){let n=new Map;for(let r of e){let e=function(e,t,a){if(!e.rect)return null;let n=z(e,t,a);return n?J(e.rect,n):null}(r,t,a);if(!e)continue;let i=n.get(e)??[];i.push(r),n.set(e,i)}return["above","below"].flatMap(e=>{let t=n.get(e);if(!t||0===t.length)return[];let a=(function(e){let t=new Set,a=[];for(let n of e){let e=j(n);!e||t.has(e)||(t.add(e),a.push(e))}return a})(t).slice(0,3).map(e=>`"${e}"`),r=1===t.length?"interactive item":"interactive items",i=a.length>0?`: ${a.join(", ")}`:"";return[`[off-screen ${e}] ${t.length} ${r}${i}`]})}(n.filter(e=>!r.coveredNodeIndexes.has(e.index)&&function(e){if(!0===e.hittable)return!0;let t=(e.type??"").toLowerCase();return t.includes("button")||t.includes("link")||t.includes("textfield")||t.includes("edittext")||t.includes("searchfield")||t.includes("checkbox")||t.includes("radio")||t.includes("switch")||t.includes("menuitem")||!!j(e)}(e)),e,t)}}function Y(e){if(0===e.length)return new Map;let{hintedContainers:t}=K(e);var a=t.directionsByContainer;let n=new Map;for(let[e,t]of a){let a={};t.has("above")&&(a.hiddenContentAbove=!0),t.has("below")&&(a.hiddenContentBelow=!0),(a.hiddenContentAbove||a.hiddenContentBelow)&&n.set(e,a)}return n}function K(e){let t=G(e),a=new Set,n=[];for(let r of e){if(H(r,e,t)){!function(e,t,a){let n=e,r=new Set;for(;n&&!r.has(n.index);)r.add(n.index),t.add(n.index),n="number"==typeof n.parentIndex?a.get(n.parentIndex):void 0}(r,a,t);continue}n.push(r)}let r=function(e,t,a,n){let r=new Map,i=new Map,s=new Set;for(let e of t){if(!e.rect)continue;let t=W(e,a,n);if(!t?.rect)continue;let o=J(e.rect,t.rect);if(!o)continue;let l=r.get(t.index)??new Set;l.add(o),r.set(t.index,l);let c=i.get(t.index)??new Set;c.add(o),i.set(t.index,c),s.add(e.index)}return function(e,t,a,n,r){for(let i of e){let e=function(e){let t=V(e.label,e.value);if(!t)return null;let a=new Set;return t.above&&a.add("above"),t.below&&a.add("below"),a.size>0?a:null}(i);if(!e||0===e.size)continue;let s=W(i,t,a);if(!s)continue;let o=n.get(s.index)??new Set,l=r.get(s.index);for(let t of e)(!l||!(l.size>0)||l.has(t))&&o.add(t);n.set(s.index,o)}}(e,a,n,r,i),{directionsByContainer:r,coveredNodeIndexes:s}}(e,n,a,t);return{byIndex:t,visibleNodeIndexes:a,offscreenNodes:n,hintedContainers:r}}function H(e,t,a=G(t)){var n;if(!e.rect)return!0;let r=z(e,t,a);return!r||(n=e.rect,F(n.x,n.x+n.width,r.x,r.x+r.width)&&F(n.y,n.y+n.height,r.y,r.y+r.height))}function z(e,t,a=G(t)){var n,i;let s=(n=e,i=a,Z(n,i,e=>!!e.rect)?.rect??null);return s||function(e,t){let a=r(t),n=e.filter(e=>{var t;return!!(t=e.rect)&&Number.isFinite(t.x)&&Number.isFinite(t.y)&&Number.isFinite(t.width)&&Number.isFinite(t.height)}),i=n.filter(e=>{let t=(e.type??"").toLowerCase();return t.includes("application")||t.includes("window")}),s=U(i.map(e=>e.rect).filter(e=>$(e,a.x,a.y)));if(s)return s;let o=U(i.map(e=>e.rect));if(o)return o;let l=U(n.map(e=>e.rect).filter(e=>$(e,a.x,a.y)));return l||null}(t,e.rect??{x:0,y:0,width:0,height:0})}function J(e,t){return e.y+e.height<=t.y?"above":e.y>=t.y+t.height?"below":null}function W(e,t,a){return Z(e,a,e=>t.has(e.index))}function Z(e,t,a){let n="number"==typeof e.parentIndex?t.get(e.parentIndex):void 0,r=new Set;for(;n&&!r.has(n.index);){if(r.add(n.index),a(n)&&o(n))return n;n="number"==typeof n.parentIndex?t.get(n.parentIndex):void 0}return null}let Q="<wifi|airplane|location> <on|off>",ee="location set <lat> <lon>",et="animations <on|off>",ea="appearance <light|dark|toggle>",en="faceid <match|nonmatch|enroll|unenroll>",er="touchid <match|nonmatch|enroll|unenroll>",ei="fingerprint <match|nonmatch>",es="permission <grant|deny|reset> <camera|microphone|photos|contacts|contacts-limited|notifications|calendar|location|location-always|media-library|motion|reminders|siri> [full|limited]",eo="permission <grant|reset> <accessibility|screen-recording|input-monitoring>",el=`macOS supports only settings ${ea} and settings ${eo}. wifi|airplane|location|animations remain unsupported on macOS.`,ec=`settings ${Q} | settings ${ee} | settings ${et} | settings ${ea} | settings ${en} | settings ${er} | settings ${ei} | settings ${es} | settings ${eo}`,eu=`settings requires ${Q}, ${ee}, ${et}, ${ea}, ${en}, ${er}, ${ei}, ${es}, or ${eo}`;function ed(e){let t=e.trim().toLowerCase();return"appearance"===t||"permission"===t}function ep(e){return`Unsupported macOS setting: ${e}. ${el}`}let eh=["status","get","dismiss","enter","return"];function em(e){return eh.includes(e)}function ef(e){let t=e?.trim().split(/\s+/,1)[0];if(!t||!t.startsWith("@")||t.length<3)return null;let a=t.slice(1);return/^[A-Za-z_-]*\d[\w-]*$/i.test(a)||/^(?:ref|node|element|el)[\w-]*$/i.test(a)?t:null}async function eg(e){let{edge:t,target:a={},scope:n,captureNodes:r}=e;try{let e=await r(n),i=function(e,t,a={}){var n,r,i;let s,l=(e??[]).map((e,t)=>({...e,ref:"ref"in e&&e.ref?e.ref:`e${t+1}`}));if(0===l.length)return{canScroll:!1,emptySnapshot:!0,signature:""};let c=Y(l),u=function(e,t,a,n){let r=new Map(e.map(e=>[e.index,e])),i=e.filter(e=>o(e)&&eM(e.rect));if(0===i.length)return null;let s=function(e,t){if(void 0===e)return null;let a=t.get(e);for(;a;){if(o(a)&&eM(a.rect))return a;a=void 0===a.parentIndex?void 0:t.get(a.parentIndex)}return null}(n.nodeIndex,r);if(s)return s;let l=n.point;if(l){let e=i.filter(e=>{var t,a;return e.rect&&(t=e.rect,(a=l).x>=t.x&&a.x<=t.x+t.width&&a.y>=t.y&&a.y<=t.y+t.height)}).sort(ev);if(e.length>0)return e.find(e=>ey(e,t.get(e.index),a))??e[0]??null}let c=i.filter(e=>ey(e,t.get(e.index),a)).sort(ex);return c.length>0?c[0]??null:i.filter(t=>H(t,e)).sort(ex)[0]??i.sort(ex)[0]??null}(l,c,t,a),d=(u?(n=l,r=u.index,s=new Map(n.map(e=>[e.index,e])),n.filter(e=>e.index===r||function(e,t,a){let n=void 0===e.parentIndex?void 0:a.get(e.parentIndex);for(;n;){if(n.index===t)return!0;n=void 0===n.parentIndex?void 0:a.get(n.parentIndex)}return!1}(e,r,s))):l).map(e=>{let t=e.rect?["x","y","width","height"].map(t=>{var a;return a=e.rect?.[t],"number"==typeof a&&Number.isFinite(a)?a.toFixed(1):""}).join(","):"";return[String(e.index??""),String(e.parentIndex??""),String(e.type??""),String(e.label??""),String(e.value??""),t].join("|")}).join("\n");return u?{canScroll:ey(u,c.get(u.index),t),emptySnapshot:!1,signature:d,scope:[(i=u).identifier,i.label,i.value].map(e=>"string"==typeof e?e.trim():"").find(ek)}:{canScroll:!1,emptySnapshot:!1,signature:d}}(e,t,a);if(n&&i.emptySnapshot)return await eg({edge:t,target:a,captureNodes:r});return i}catch(e){var i,s,l;throw i=t,s=n,l=e,s?new c("COMMAND_FAILED",`Failed to verify scroll ${i} state for scoped container`,{scope:s,hint:`scroll ${i} could not verify the scoped scroll container. Run snapshot -i -c for the current screen and retry with a visible scroll target.`},l):new c("COMMAND_FAILED",`Failed to verify scroll ${i} state`,{hint:`scroll ${i} needs a snapshot showing hidden content ${"bottom"===i?"below":"above"} before it will move.`},l)}}async function eb(e){let t,{edge:a,captureState:n,scroll:r}=e,i=await n();i.scope&&(i=await n(i.scope));let s=0;for(;i.canScroll;){if(s>=40)throw new c("COMMAND_FAILED",`scroll ${a} reached the safety limit before the snapshot showed the edge`,{hint:"The scoped scroll container still reports hidden content. Use a smaller manual scroll + snapshot loop to inspect the current state."});t=await r(),s+=1,i=await n(i.scope)}return{passes:s,result:t}}function ew(e,t,a,n,r){return t&&0===a?`Already at ${t}; no hidden content ${"bottom"===t?"below":"above"} detected`:t?`Scrolled to ${t} with ${a} ${e} passes`:void 0!==r?`Scrolled ${e} by ${r}px`:void 0!==n?`Scrolled ${e} by ${n}`:`Scrolled ${e}`}function ey(e,t,a){return"bottom"===a?!0===e.hiddenContentBelow||t?.hiddenContentBelow===!0:!0===e.hiddenContentAbove||t?.hiddenContentAbove===!0}function ek(e){return e.length>0&&e.length<=80&&!/^(true|false)$/i.test(e)&&!/^\d+$/.test(e)&&!/^\d+%$/.test(e)}function ev(e,t){return eA(e.rect)-eA(t.rect)}function ex(e,t){return eA(t.rect)-eA(e.rect)}function eA(e){return e?e.width*e.height:0}function eM(e){return!!(e&&e.width>0&&e.height>0)}function eD(e,t,a,n){if(!Number.isFinite(e)||!Number.isInteger(e)||e<a||e>n)throw new c("INVALID_ARGS",`${t} must be an integer between ${a} and ${n}`);return e}function eI(e){let t=e?.trim().toLowerCase();return!!t&&(t.includes("open debugger to view warnings")||/^!,\s+/.test(t)||/^(warn|warning|error):\s+/.test(t)||/\b(?:possible\s+)?unhandled (?:promise )?rejection\b/.test(t)||t.includes("getsnapshot should be cached to avoid an infinite loop")||t.includes('unique "key" prop')||t.includes("unique 'key' prop")||t.includes("virtualizedlists should never be nested")||t.includes("failed prop type"))}function eS(e){return e.includes("open debugger to view warnings")||/^!,\s+open debugger\b/.test(e)}function eR(e,a){try{return t.sync.read(e)}catch(e){throw new c("COMMAND_FAILED",`Failed to decode ${a} as PNG`,{label:a,reason:e instanceof Error?e.message:String(e)})}}async function eN(a,n){if(!Number.isInteger(n)||n<1)throw new c("INVALID_ARGS","Screenshot max size must be a positive integer");let r=eR(await e.readFile(a),"screenshot"),i=Math.max(r.width,r.height);if(i<=n)return;let s=n/i,o=Math.max(1,Math.round(r.width*s)),l=Math.max(1,Math.round(r.height*s)),u=function(e,a,n){let r=new t({width:a,height:n});for(let t=0;t<n;t+=1){let i=t*e.height/n,s=(t+1)*e.height/n;for(let n=0;n<a;n+=1){let o=n*e.width/a,l=(n+1)*e.width/a,c=0,u=0,d=0,p=0,h=0;for(let t=Math.floor(i);t<Math.ceil(s);t+=1){let a=Math.min(t+1,s)-Math.max(t,i);for(let n=Math.floor(o);n<Math.ceil(l);n+=1){let r=a*(Math.min(n+1,l)-Math.max(n,o)),i=(t*e.width+n)*4;c+=(e.data[i]??0)*r,u+=(e.data[i+1]??0)*r,d+=(e.data[i+2]??0)*r,p+=(e.data[i+3]??0)*r,h+=r}}let m=(t*r.width+n)*4;r.data[m]=Math.round(c/h),r.data[m+1]=Math.round(u/h),r.data[m+2]=Math.round(d/h),r.data[m+3]=Math.round(p/h)}}return r}(r,o,l);await e.writeFile(a,t.sync.write(u))}async function eO(e,t,a){if("path"===t.kind&&!e.policy.allowLocalInputPaths)throw new c("INVALID_ARGS",`Local ${a.field??"input"} paths are not allowed by command policy`);try{return await e.artifacts.resolveInput(t,a)}catch(e){throw l(e)}}async function eP(e,t,a){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,{...a,visibility:a.visibility??"client-visible",requestedClientPath:t?.kind==="downloadableArtifact"?t.clientPath??a.requestedClientPath:a.requestedClientPath})}catch(e){throw l(e)}}async function eL(e,t){try{return await e.artifacts.createTempFile(t)}catch(e){throw l(e)}}let eE=[0,187,255,255];function e_(e,t,a,n){if(t<0||t>=e.width||a<0||a>=e.height)return;let r=(a*e.width+t)*4;e.data[r]=n[0],e.data[r+1]=n[1],e.data[r+2]=n[2],e.data[r+3]=n[3]}function eT(e,t,a){return Math.min(Math.max(e,t),a)}let eC={icon:90,toggle:90,chevron:75,separator:45,visual:35,background:10},e$={leading:20,trailing:20,separator:10,unknown:0,background:-30};function eU(e){return"background"!==e.likelyKind}function eF(e,t){return e.width>=.25*t.width||e.height>=.06*t.height}function eB(e,t){let a,n=0;for(let r of t){let t=eX(e,r.rect);t<=n||(n=t,a=r)}return a}function eV(e){let t=[];for(let a of[...e].sort((e,t)=>e.rect.y-t.rect.y)){let e=t.find(e=>{var t,n;return t=e.rect,eX(t,n=a.rect)>0||Math.abs(eY(t).y-eY(n).y)<=.5*Math.max(t.height,n.height)});if(!e){t.push({rect:a.rect,blocks:[a]});continue}e.blocks.push(a),e.blocks.sort((e,t)=>e.rect.x-t.rect.x),e.rect=function(e){let t=1/0,a=1/0,n=-1/0,r=-1/0;for(let i of e)t=Math.min(t,i.x),a=Math.min(a,i.y),n=Math.max(n,i.x+i.width),r=Math.max(r,i.y+i.height);return{x:t,y:a,width:n-t,height:r-a}}([e.rect,a.rect])}return t}function eq(e,t){let a,n=eY(e);for(let e of t){var r,i;let t=Math.sqrt((r=n,i=eY(e.rect),(r.x-i.x)**2+(r.y-i.y)**2));a&&t>=a.distance||(a={block:e,distance:t})}return a}function eG(e){let t=ej(e);return e.differentPixels>=24&&t.width>=3&&t.height>=3}function ej(e){return{x:e.minX,y:e.minY,width:e.maxX-e.minX+1,height:e.maxY-e.minY+1}}function eX(e,t){return Math.max(0,Math.min(e.y+e.height,t.y+t.height)-Math.max(e.y,t.y))}function eY(e){return{x:e.x+e.width/2,y:e.y+e.height/2}}function eK(e,t,a){return Math.min(Math.max(e,t),a)}async function eH(e){if(await h("tesseract"))try{let[t,a]=await Promise.all([eJ(e.baselinePath),eJ(e.currentPath)]);if(0!==t.exitCode||0!==a.exitCode)return;let n=ez(t.stdout,e.width,e.height),r=ez(a.stdout,e.width,e.height),i=function(e,t){let a=new Set,n=[];for(let i of e){var r;let e=e5(i.text),s=function(e,t,a,n){let r=null,i=1/0;for(let l=0;l<a.length;l+=1){var s,o;if(n.has(l))continue;let c=a[l];if(e5(c.text)!==t)continue;let u=(s=e0(e.normalizedRect),o=e0(c.normalizedRect),(s.x-o.x)**2+(s.y-o.y)**2);u>=i||(r=l,i=u)}return r}(i,e,t,a);if(null===s)continue;a.add(s);let o=function(e,t){let a={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},n=e8(t.rect.width/e.rect.width),r=e8(t.rect.height/e.rect.height),i=Math.abs(n-1)>=.08||Math.abs(r-1)>=.12;return{text:e.text,baselineRect:e.rect,currentRect:t.rect,delta:a,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)&&n.push(o)}return n.sort((e,t)=>eW(t)-eW(e)).slice(0,12)}(n,r),s=function(e){let t=[];for(let a of[...e].sort((e,t)=>e.currentRect.y-t.currentRect.y)){let e=t.find(e=>32>=Math.abs(a.delta.x-e4(e.map(e=>e.delta.x))));e?e.push(a):t.push([a])}return t.filter(e=>e.length>=2).map(eZ).filter(e=>e.yRange.max-e.yRange.min<=60).sort((e,t)=>eQ(t)-eQ(e)).slice(0,4)}(i);if(0===n.length&&0===r.length)return;return{provider:"tesseract",baselineBlocks:n.length,currentBlocks:r.length,baselineBlocksRaw:n,currentBlocksRaw:r,matches:i,...s.length>0?{movementClusters:s}:{}}}catch{return}}function ez(e,t,a){let[n,...r]=e.split(/\r?\n/);if(!n)return[];let i=new Map(n.split(" ").map((e,t)=>[e,t])),s=[];for(let e of r){var o;if(!e.trim())continue;let t=e.split(" "),a=e2(t,i,"level"),n=e1(t,i,"text").trim(),r=e2(t,i,"conf");if(5!==a||(o=n,!/[\p{L}\p{N}]/u.test(o))||r<0)continue;let l=e2(t,i,"left"),c=e2(t,i,"top"),u=e2(t,i,"width"),d=e2(t,i,"height");u<=0||d<=0||s.push({key:[e1(t,i,"page_num"),e1(t,i,"block_num"),e1(t,i,"par_num"),e1(t,i,"line_num")].join(":"),text:n,confidence:r,rect:{x:l,y:c,width:u,height:d}})}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),a=[],n=[];for(let e of t){let t=n.at(-1);if(!t){n.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))){a.push(n),n=[e];continue}n.push(e)}return n.length>0&&a.push(n),a})(e)).map(e=>(function(e,t,a){if(0===e.length)return null;let n=[...e].sort((e,t)=>e.rect.x-t.rect.x),r=function(e){let t=1/0,a=1/0,n=-1/0,r=-1/0;for(let i of e)t=Math.min(t,i.x),a=Math.min(a,i.y),n=Math.max(n,i.x+i.width),r=Math.max(r,i.y+i.height);return{x:t,y:a,width:n-t,height:r-a}}(n.map(e=>e.rect)),i=Math.round(100*e4(n.map(e=>e.confidence)))/100;return{text:n.map(e=>e.text).join(" "),confidence:i,rect:r,normalizedRect:{x:e3(r.x/t),y:e3(r.y/a),width:e3(r.width/t),height:e3(r.height/a)}}})(e,t,a)).filter(e=>null!==e)}function eJ(e){return m("tesseract",[e,"stdout","-l","eng","tsv"],{allowFailure:!0,timeoutMs:1e4})}function eW(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 eZ(e){let t=e.map(e=>e.delta.x),a=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(...a),max:Math.max(...a)}}}function eQ(e){return 2*Math.abs((e.xRange.min+e.xRange.max)/2)+Math.abs((e.yRange.min+e.yRange.max)/2)}function e0(e){return{x:e.x+e.width/2,y:e.y+e.height/2}}function e1(e,t,a){let n=t.get(a);return void 0===n?"":e[n]??""}function e2(e,t,a){let n=Number(e1(e,t,a));return Number.isFinite(n)?n:0}function e5(e){return e.trim().replace(/\s+/g," ").toLowerCase()}function e4(e){return e.reduce((e,t)=>e+t,0)/e.length}function e3(e){return Math.round(100*e*100)/100}function e8(e){return Math.round(1e3*e)/1e3}function e6(e,t,a,n){return{r:Math.round(e/n),g:Math.round(t/n),b:Math.round(a/n)}}function e9(e){return .2126*e.r+.7152*e.g+.0722*e.b}function e7(e){return`#${te(e.r)}${te(e.g)}${te(e.b)}`}function te(e){return e.toString(16).padStart(2,"0")}function tt(e){return Math.round(100*e*100)/100}let ta=255*Math.sqrt(3);async function tn(n,r,i={}){let s,o,l,c;await tr(n,"Baseline image not found"),await tr(r,"Current screenshot not found");let u=i.outputPath,[d,p]=await Promise.all([e.readFile(n),e.readFile(r)]),h=eR(d,"baseline screenshot"),m=eR(p,"current screenshot");ti(h.width,h.height,"baseline screenshot",i.maxPixels),ti(m.width,m.height,"current screenshot",i.maxPixels);let f=i.threshold??.1;if(h.width!==m.width||h.height!==m.height){let e=h.width*h.height;return await ts(i.outputPath),{match:!1,mismatchPercentage:100,totalPixels:e,differentPixels:e,dimensionMismatch:{expected:{width:h.width,height:h.height},actual:{width:m.width,height:m.height}}}}let g=h.width*h.height,b=f*ta,w=new t({width:h.width,height:h.height}),y=new Uint8Array(g),k=0;for(let e=0,t=0;e<h.data.length;e+=4,t+=1){if(Math.sqrt((h.data[e]-m.data[e])**2+(h.data[e+1]-m.data[e+1])**2+(h.data[e+2]-m.data[e+2])**2)>b){k+=1,y[t]=1;let a=to(m,e);w.data[e]=tl(a,220,.78),w.data[e+1]=tl(a,0,.78),w.data[e+2]=tl(a,0,.78),w.data[e+3]=255;continue}let a=to(m,e);w.data[e]=a,w.data[e+1]=a,w.data[e+2]=a,w.data[e+3]=255}let v=k>0?(A=(s=function(e){let{diffMask:t,baseline:a,current:n}=e,{width:r,height:i}=a,s=new Uint8Array(t.length),o=new Int32Array(t.length),l=[];for(let e=0;e<t.length;e+=1){if(1!==t[e]||1===s[e])continue;let c=0,u=0;o[0]=e,u+=1,s[e]=1;let d=e%r,p=Math.floor(e/r),h={minX:d,minY:p,maxX:d,maxY:p,differentPixels:0,baselineRed:0,baselineGreen:0,baselineBlue:0,currentRed:0,currentGreen:0,currentBlue:0};for(;c<u;){let e=o[c];c+=1,function(e,t,a,n,r){let i=t%a,s=Math.floor(t/a),o=4*t;e.minX=Math.min(e.minX,i),e.minY=Math.min(e.minY,s),e.maxX=Math.max(e.maxX,i),e.maxY=Math.max(e.maxY,s),e.differentPixels+=1,e.baselineRed+=n.data[o],e.baselineGreen+=n.data[o+1],e.baselineBlue+=n.data[o+2],e.currentRed+=r.data[o],e.currentGreen+=r.data[o+1],e.currentBlue+=r.data[o+2]}(h,e,r,a,n);let l=e%r,d=Math.floor(e/r);for(let e=-1;e<=1;e+=1){let a=d+e;if(!(a<0)&&!(a>=i))for(let n=-1;n<=1;n+=1){if(0===n&&0===e)continue;let i=l+n;if(i<0||i>=r)continue;let c=a*r+i;1===t[c]&&1!==s[c]&&(s[c]=1,o[u]=c,u+=1)}}}l.push(h)}return l}(x={diffMask:y,baseline:h,current:m,totalPixels:g,differentPixels:k,maxRegions:i.maxRegions})).length<=2e3?function(e){let t=[];for(let r of e.sort((e,t)=>{let a=e.minY-t.minY;return 0!==a?a:e.minX-t.minX})){var a,n;let e=t.find(e=>{var t,a,n;return t=e,a=r,n=12,t.minX-n<=a.maxX&&a.minX-n<=t.maxX&&t.minY-n<=a.maxY&&a.minY-n<=t.maxY});if(!e){t.push({...r});continue}a=e,n=r,a.minX=Math.min(a.minX,n.minX),a.minY=Math.min(a.minY,n.minY),a.maxX=Math.max(a.maxX,n.maxX),a.maxY=Math.max(a.maxY,n.maxY),a.differentPixels+=n.differentPixels,a.baselineRed+=n.baselineRed,a.baselineGreen+=n.baselineGreen,a.baselineBlue+=n.baselineBlue,a.currentRed+=n.currentRed,a.currentGreen+=n.currentGreen,a.currentBlue+=n.currentBlue}return t}(s):s,A.flatMap(e=>{var t,a,n;let r;return(t=e,a=x.baseline.width,n=x.baseline.height,r=t.maxX-t.minX+1,t.maxY-t.minY+1>=Math.max(48,Math.round(.07*n))&&r>=.35*a)?function(e,t,a){var n;let r=function(e,t){let a=[],n=null;for(let r=0;r<e.length;r+=1){if(e[r]<=t){n??=r;continue}null!==n&&(r-n>=6&&a.push([n,r-1]),n=null)}return null!==n&&e.length-n>=6&&a.push([n,e.length-1]),a}((n=function(e,t,a){let n=[];for(let r=e.minY;r<=e.maxY;r+=1){let i=0;for(let n=e.minX;n<=e.maxX;n+=1)1===t[r*a+n]&&(i+=1);n.push(i)}return n}(e,t.diffMask,t.baseline.width)).map((e,t)=>{let a=0,r=0,i=Math.max(0,t-3),s=Math.min(n.length-1,t+3);for(let e=i;e<=s;e+=1)a+=n[e],r+=1;return Math.round(a/r)}),Math.max(1,Math.round((e.maxX-e.minX+1)*.08))),i=function(e,t,a){let n=[],r=e.minY;for(let[i,s]of t){let t=e.minY+Math.round((i+s)/2);t-r+1<a||e.maxY-t<a||(n.push([r,t]),r=t+1)}return n.push([r,e.maxY]),n}(e,r,a);if(i.length<=1)return[e];let s=i.map(([a,n])=>(function(e,t,a,n){let r=null;for(let o=t;o<=a;o+=1)for(let t=e.minX;t<=e.maxX;t+=1){var i,s;let e=o*n.baseline.width+t;1===n.diffMask[e]&&function(e,t,a,n,r,i){let s=4*t;e.minX=Math.min(e.minX,a),e.minY=Math.min(e.minY,n),e.maxX=Math.max(e.maxX,a),e.maxY=Math.max(e.maxY,n),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,n.baseline,n.current)}return r})(e,a,n,t)).filter(e=>null!==e);return s.length>1?s:[e]}(e,x,Math.max(24,Math.round(.03*x.baseline.height))):[e]})).sort((e,t)=>{let a=t.differentPixels-e.differentPixels;if(0!==a)return a;let n=e.minY-t.minY;return 0!==n?n:e.minX-t.minX}).slice(0,Math.max(0,x.maxRegions??8)).map((e,t)=>{var a,n,r,i,s,o,l,c,u,d,p;let h,m,f,g,b,w,y,k,v,A,M,D,I,S,R,N,O;return a=e,n=t+1,r={width:x.baseline.width,height:x.baseline.height,totalPixels:x.totalPixels,differentPixels:x.differentPixels},w={x:a.minX,y:a.minY,width:a.maxX-a.minX+1,height:a.maxY-a.minY+1},y={x:Math.round(a.minX+w.width/2),y:Math.round(a.minY+w.height/2)},k=e6(a.baselineRed,a.baselineGreen,a.baselineBlue,a.differentPixels),v=e6(a.currentRed,a.currentGreen,a.currentBlue,a.differentPixels),A=w.width*w.height,M=tt(a.differentPixels/A),D=Math.round(e9(k)),I=Math.round(e9(v)),S=(i=w,s=r.width,o=r.height,i.width>=.55*s&&i.height>=.12*o?"large-area":i.width>=2.5*i.height?"horizontal-band":i.height>=2.5*i.width?"vertical-band":"compact"),R=(h=A/r.totalPixels)>=.04?"large":h>=.01?"medium":"small",N=(l=k,c=v,m=e9(l),Math.abs(f=e9(c)-m)>=12?f>0?"brighter":"darker":Math.max(Math.abs(c.r-l.r),Math.abs(c.g-l.g),Math.abs(c.b-l.b))>=12?"color-shift":"mixed"),O=(u=y,d=r.width,p=r.height,g=u.x<d/3?"left":u.x>2*d/3?"right":"center",b=u.y<p/3?"top":u.y>2*p/3?"bottom":"middle","center"===g&&"middle"===b?"center":`${b}-${g}`),{index:n,rect:w,normalizedRect:{x:tt(w.x/r.width),y:tt(w.y/r.height),width:tt(w.width/r.width),height:tt(w.height/r.height)},differentPixels:a.differentPixels,shareOfDiffPercentage:tt(a.differentPixels/r.differentPixels),densityPercentage:M,shape:S,size:R,location:O,averageBaselineColorHex:e7(k),averageCurrentColorHex:e7(v),baselineLuminance:D,currentLuminance:I,dominantChange:N}}):[];if(k>0&&u){var x,A,M;for(let e of v)e.rect.width<4||e.rect.height<4||function(e,t){let a=eT(t.x,0,e.width-1),n=eT(t.y,0,e.height-1),r=eT(t.x+t.width-1,0,e.width-1),i=eT(t.y+t.height-1,0,e.height-1);for(let t=0;t<2;t+=1){for(let s=a;s<=r;s+=1)e_(e,s,n+t,eE),e_(e,s,i-t,eE);for(let s=n;s<=i;s+=1)e_(e,a+t,s,eE),e_(e,r-t,s,eE)}}(w,e.rect);await e.mkdir(a.dirname(u),{recursive:!0}),await e.writeFile(u,t.sync.write(w))}else await ts(i.outputPath);let D=k>0?await eH({baselinePath:n,currentPath:r,width:h.width,height:h.height}):void 0,I=D&&(D.matches.length>0||(D.movementClusters?.length??0)>0)?{provider:D.provider,baselineBlocks:D.baselineBlocks,currentBlocks:D.currentBlocks,matches:D.matches,...D.movementClusters?{movementClusters:D.movementClusters}:{}}:void 0,S=k>0&&D?(o=function(e){let t=[];for(let a of e.sort((e,t)=>e.minY-t.minY||e.minX-t.minX)){let e=t.find(e=>{var t,n,r;return t=e,n=a,r=10,t.minX-r<=n.maxX&&n.minX-r<=t.maxX&&t.minY-r<=n.maxY&&n.minY-r<=t.maxY});if(!e){t.push({...a});continue}e.minX=Math.min(e.minX,a.minX),e.minY=Math.min(e.minY,a.minY),e.maxX=Math.max(e.maxX,a.maxX),e.maxY=Math.max(e.maxY,a.maxY),e.differentPixels+=a.differentPixels}return t}(function(e,t,a){let n=new Uint8Array(e.length),r=new Int32Array(e.length),i=[];for(let s=0;s<e.length;s+=1){if(1!==e[s]||1===n[s])continue;let o=0,l=0;r[0]=s,l+=1,n[s]=1;let c=s%t,u=Math.floor(s/t),d={minX:c,minY:u,maxX:c,maxY:u,differentPixels:0};for(;o<l;){let i=r[o];o+=1;let s=i%t,c=Math.floor(i/t);d.minX=Math.min(d.minX,s),d.minY=Math.min(d.minY,c),d.maxX=Math.max(d.maxX,s),d.maxY=Math.max(d.maxY,c),d.differentPixels+=1;for(let i=-1;i<=1;i+=1){let o=c+i;if(!(o<0)&&!(o>=a))for(let a=-1;a<=1;a+=1){if(0===a&&0===i)continue;let c=s+a;if(c<0||c>=t)continue;let u=o*t+c;1===e[u]&&1!==n[u]&&(n[u]=1,r[l]=u,l+=1)}}}i.push(d)}return i}(function(e,t,a,n){let r=new Uint8Array(e);if(!n)return r;for(let e of[...n.baselineBlocksRaw,...n.currentBlocksRaw]){var i;!function(e,t,a,n){let r=eK(Math.floor(n.x),0,t-1),i=eK(Math.floor(n.y),0,a-1),s=eK(Math.ceil(n.x+n.width),0,t),o=eK(Math.ceil(n.y+n.height),0,a);for(let a=i;a<o;a+=1)for(let n=r;n<s;n+=1)e[a*t+n]=0}(r,t,a,{x:(i=e.rect).x-8,y:i.y-8,width:i.width+16,height:i.height+16})}return r}((M={diffMask:y,width:h.width,height:h.height,regions:v,ocr:D}).diffMask,M.width,M.height,M.ocr),M.width,M.height)),l=eV(M.ocr?.currentBlocksRaw??[]),c=eV(M.ocr?.baselineBlocksRaw??[]),o.filter(eG).map(e=>{var t,a,n,r,i,s,o,u,d,p,h;let m,f,g,b,w,y,k,v,x,A;return t=e,a=M,n=l,r=c,b=function(e,t){let a,n=0;for(let r of t){let t=function(e,t){let a=Math.max(e.x,t.x),n=Math.max(e.y,t.y),r=Math.min(e.x+e.width,t.x+t.width),i=Math.min(e.y+e.height,t.y+t.height);return r<=a||i<=n?0:(r-a)*(i-n)}(e,r.rect);t<=n||(n=t,a=r)}return a?.index}(g=ej(t),a.regions),w=function(e,t,a){let n=eB(e,t);if(n)return eq(e,n.blocks);let r=eB(e,a);return r?eq(e,r.blocks):void 0}(g,n,r),y=function(e,t,a){if(e.height<=3&&e.width>=.12*a)return"separator";if(!t)return e.width>=.4*a?"background":"unknown";if(e.width>=.4*a)return"background";let n=e.x+e.width/2,r=t.x+t.width/2;return n<r-t.width/2?"leading":n>r+t.width/2?"trailing":e.width>=.35*a?"background":"unknown"}(g,w?.block.rect,a.width),k=(i=g,s=y,o=t.differentPixels,u=a,m=i.width/i.height,f=o/(i.width*i.height),"separator"===s?"separator":"background"===s?"background":"trailing"===s&&m>=1.5&&m<=3.8&&f>=.35?"toggle":"trailing"===s&&i.width<=.06*u.width&&i.height<=.04*u.height?"chevron":"leading"===s&&m>=.55&&m<=1.8?"icon":eF(i,u)?"background":"visual"),v={...b?{regionIndex:b}:{},slot:y,likelyKind:k,rect:g},{...b?{regionIndex:b}:{},slot:y,likelyKind:k,rect:g,...w?{nearestText:w.block.text.trim().replace(/^[^\p{L}\p{N}]+/u,"").replace(/^\p{L}\s+/u,"")}:{},score:(d=v,p=t.differentPixels,h=a,x=eF(d.rect,h)?-35:0,A=20*!!d.regionIndex,eC[d.likelyKind]+e$[d.slot]+A+x+Math.min(20,p/200))}}).filter(e=>e.rect.y>=.08*M.height).filter(eU).sort((e,t)=>t.score-e.score).slice(0,Math.max(0,M.maxDeltas??12)).map((e,t)=>{var a;return a=e,{index:t+1,...a.regionIndex?{regionIndex:a.regionIndex}:{},slot:a.slot,likelyKind:a.likelyKind,rect:a.rect,...a.nearestText?{nearestText:a.nearestText}:{}}})):[],R=g>0?Math.round(k/g*1e4)/100:0;return{...k>0&&u?{diffPath:u}:{},...v.length>0?{regions:v}:{},...I?{ocr:I}:{},...S.length>0?{nonTextDeltas:S}:{},totalPixels:g,differentPixels:k,mismatchPercentage:R,match:0===k}}async function tr(t,a){try{await e.access(t)}catch{throw new c("INVALID_ARGS",`${a}: ${t}`)}}function ti(e,t,a,n){if(null==n||n<=0)return;let r=e*t;if(!(r<=n))throw new c("INVALID_ARGS",`${a} is ${r} pixels, which exceeds the configured maxImagePixels limit of ${n}`)}async function ts(t){if(t)try{await e.unlink(t)}catch(e){var a;if(!("object"==typeof(a=e)&&null!==a&&"code"in a&&"ENOENT"===a.code))throw e}}function to(e,t){return tl(Math.round(.299*e.data[t]+.587*e.data[t+1]+.114*e.data[t+2]),255,.72)}function tl(e,t,a){return Math.round(e*(1-a)+t*a)}function tc(e){return e.width*e.height}function tu(e){return Math.round(100*e*100)/100}async function td(e,t){let a=await eL(e,{prefix:"agent-device-diff-current",ext:".png"});try{await th(e,t,a.path,tm(t))}catch(e){throw await a.cleanup(),e}return a}async function tp(e,t,a,n,r){var i,s,o,l;if(!t.overlayRefs)return n;if(n.match||n.dimensionMismatch)return a&&await tg(a),n;let c=(i=t,s=a,i.currentOverlayOut?i.currentOverlayOut:i.out?.kind==="path"?{kind:"path",path:tf(s??i.out.path)}:i.out?.kind==="downloadableArtifact"?{kind:"downloadableArtifact",...i.out.clientPath?{clientPath:tf(i.out.clientPath)}:{},...i.out.fileName?{fileName:tf(i.out.fileName)}:{}}:void 0),u=await eP(e,c,{field:"currentOverlayPath",ext:".png"});try{let a=await th(e,t,u.path,{overlayRefs:!0,...tm(t)}),i=await u.publish();return i&&r.push(i),{...n,currentOverlayPath:a.path??u.path,...a.overlayRefs?{currentOverlayRefCount:a.overlayRefs.length}:{},...n.regions&&a.overlayRefs?{regions:(o=n.regions,l=a.overlayRefs,o.map(e=>{var t,a;let n,r=(t=e,a=l,n=tc(t.rect),a.map(e=>{var a,r;let i,s,o,l,c=e.overlayRect,u=(a=t.rect,r=c,i=Math.max(a.x,r.x),s=Math.max(a.y,r.y),o=Math.min(a.x+a.width,r.x+r.width),l=Math.min(a.y+a.height,r.y+r.height),o<=i||l<=s?0:(o-i)*(l-s));return u<=0?null:{ref:e.ref,...e.label?{label:e.label}:{},rect:c,overlayCoveragePercentage:tu(u/tc(c)),regionCoveragePercentage:tu(u/n)}}).filter(e=>null!==e).sort((e,t)=>{let a=t.regionCoveragePercentage-e.regionCoveragePercentage;return 0!==a?a: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 th(e,t,a,n={}){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},a,n)??{}}function tm(e){return e.surface?{surface:e.surface}:{}}function tf(e){let t=a.extname(e),n=t?e.slice(0,-t.length):e;return`${n}.current-overlay${t||".png"}`}async function tg(t){try{await e.unlink(tf(t))}catch(e){var a;if(!("object"==typeof(a=e)&&null!==a&&"code"in a&&"ENOENT"===a.code))throw e}}function tb(e){return"live"===e.kind}let tw={application:"application",navigationbar:"navigation-bar",tabbar:"tab-bar",button:"button",imagebutton:"button",link:"link",cell:"cell",statictext:"text",checkedtextview:"text",textfield:"text-field",edittext:"text-field",textarea:"text-view",switch:"switch",slider:"slider",image:"image",imageview:"image",webview:"webview",framelayout:"group",linearlayout:"group",relativelayout:"group",constraintlayout:"group",viewgroup:"group",view:"group",listview:"list",recyclerview:"list",collectionview:"collection",searchfield:"search",segmentedcontrol:"segmented-control",group:"group",window:"window",checkbox:"checkbox",radio:"radio",menuitem:"menu-item",toolbar:"toolbar",scrollarea:"scroll-area",scrollview:"scroll-area",nestedscrollview:"scroll-area",table:"table"};function ty(e,t={}){let a=[],n=[];for(let r of e){let e=r.depth??0,i=r.label?.trim()||r.value?.trim()||r.identifier?.trim()||"",s=tx(r.type??"Element");if("group"===s&&!i)continue;for(;a.length>0&&e<=a[a.length-1];)a.pop();let o=a.length;a.push(e),n.push({node:r,depth:o,type:s,text:tk(r,o,!1,s,t)})}return n}function tk(e,t,a,n,r={}){var i,s,o,l,c,u,d,p;let h,m=n??tx(e.type??"Element"),g=S(e,m),b=(i=e,s=m,o=r,l=g,o.summarizeTextSurfaces&&l.shouldSummarize&&function(e,t,a){let n=f(e.label);if(n&&n!==a)return n;let r=f(e.identifier);if(r&&!tM(r)&&r!==a)return r;switch(t){case"text":case"text-view":return"Text view";case"text-field":return"Text field";case"search":return"Search field";default:return""}}(i,s,l.text)||tv(i,s)),w=" ".repeat(t),y=e.ref?`@${e.ref}`:"",v=(c=e,u=m,d=r,p=g,h=[],(!1===c.enabled&&h.push("disabled"),d.summarizeTextSurfaces)?(!0===c.selected&&h.push("selected"),!0===c.focused&&h.push("focused"),tA(u)&&h.push("editable"),function(e,t){if("scroll-area"===t)return!0;let a=(e.type??"").toLowerCase(),n=`${e.role??""} ${e.subrole??""}`.toLowerCase();return a.includes("scroll")||n.includes("scroll")}(c,u)&&h.push("scrollable"),h.push(...c.presentationHints??[]),p.shouldSummarize&&(h.push(`preview:"${k(p.text).replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`),h.push("truncated")),tD(h)):h).map(e=>` [${e}]`).join(""),x=b?` "${b}"`:"";return a?`${w}${y} [${m}]${v}`.trimEnd():`${w}${y} [${m}]${x}${v}`.trimEnd()}function tv(e,t){var a,n;let r=e.label?.trim();if(r&&(a=t,n=r,("scroll-area"===a||"list"===a||"collection"===a||"table"===a)&&B(n)))return"";let i=e.value?.trim();if(tA(t)){if(i)return i;if(r)return r}else if(r)return r;if(i)return i;let s=e.identifier?.trim();return!s||tM(s)&&("group"===t||"image"===t||"list"===t||"collection"===t)?"":s}function tx(e){var t;let a=e.replace(/XCUIElementType/gi,"").toLowerCase(),n=e.includes(".")&&(e.startsWith("android.")||e.startsWith("androidx.")||e.startsWith("com."));return(a.includes(".")&&(a=a.replace(/^android\.widget\./,"").replace(/^android\.view\./,"").replace(/^android\.webkit\./,"").replace(/^androidx\./,"").replace(/^com\.google\.android\./,"").replace(/^com\.android\./,""),n&&a.includes(".")&&(a=a.slice(a.lastIndexOf(".")+1))),"textview"===a)?n?"text":"text-view":(t=a,(Object.prototype.hasOwnProperty.call(tw,t)?tw[t]:void 0)||a||"element")}function tA(e){return"text-field"===e||"text-view"===e||"search"===e}function tM(e){return/^[\w.]+:id\/[\w.-]+$/i.test(e)}function tD(e){return[...new Set(e)]}function tI(e,t){let a=tx(e.type??"Element"),n=tv(e,a),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),a,n,r,i,s].join("|")}function tS(e,t){return t.flatten?e.map(e=>({text:tk(e,0,!1),comparable:tI(e,0)})):ty(e).map(e=>({text:e.text,comparable:tI(e.node,e.depth)}))}function tR(e,t){return e.get(t)??0}function tN(e){let t=e.map(e=>[e.label,e.value,e.identifier,e.type,e.role].filter(Boolean).join(" ")).join("\n").toLowerCase(),a=t_(e,tP),n=t_(e,tL),r=t_(e,eI,tE),i=t_(e,eS),s=tT(a),o=tT(n),l=tT(r),c=/\b[\w.$<>/-]+\.(?:tsx?|jsx?):\d+(?::\d+)?\b/.test(t)||/\b[\w.$<>/-]+\.(?:tsx?|jsx?)\s+\(\d+:\d+\)/.test(t),u=s.length>0||o.length>0||/\b(reload js|copy stack)\b/.test(t),d=/\b(redbox|runtime error|reload js|copy stack|component stack|call stack)\b/.test(t)||c&&u;return{detected:l.length>0||i.length>0||u&&(/\b(logbox|redbox|reload js|copy stack|component stack|call stack|runtime error|open debugger to view warnings)\b/.test(t)||c),redBox:d,dismissRefs:s,minimizeRefs:o,collapsedRefs:l,dismissNodes:a,minimizeNodes:n,collapsedNodes:r}}function tO(e){let t,a=tN(e);if(!a.detected)return null;if(a.redBox){let e=tC(a.minimizeNodes);if(e)return t$(e,"minimize");let t=tC(a.dismissNodes);return t?{...t$(t,tU(t)),warning:"RedBox Minimize control was not exposed; used Dismiss fallback"}:null}let n=tC(a.dismissNodes);if(n)return t$(n,tU(n));let r=0===(t=a.collapsedNodes.filter(e=>e.rect)).length?null:t.sort((e,t)=>{let a=+(!0===e.hittable),n=+(!0===t.hittable);if(a!==n)return n-a;let r=e.rect?.width??0,i=t.rect?.width??0;return r!==i?i-r:(t.rect?.y??0)-(e.rect?.y??0)})[0]??null;return r?.rect?{action:"close-collapsed-banner",point:function(e){var t,a;if(!e.rect)throw Error("Collapsed React Native warning node must have rect");let n=Math.min(e.rect.height,52),r=Math.min(36,Math.max(18,.45*n));return{x:Math.round((t=e.rect.x+e.rect.width-r,a=e.rect.x+1,Math.min(e.rect.x+e.rect.width-1,Math.max(a,t)))),y:Math.round(e.rect.y+n/2)}}(r),ref:r.ref,label:tF(r)}:null}function tP(e){return"dismiss"===e||"close"===e||["x","\xd7","✕","✖","⨯"].includes(e)}function tL(e){return/^minimi[sz]e$/.test(e)}function tE(e){return!e.rect||e.rect.height<=180}function t_(e,t,a=()=>!0){let n=[];for(let r of e)r.ref&&a(r)&&[r.label,r.value,r.identifier].map(e=>e?.trim().toLowerCase()).filter(e=>!!e).some(e=>t(e))&&n.push(r);return n}function tT(e){return e.map(e=>e.ref)}function tC(e){return e.find(e=>e.rect)??null}function t$(e,t){if(!e.rect)throw Error("React Native overlay target node must have rect");return{action:t,point:r(e.rect),ref:e.ref,label:tF(e)}}function tU(e){return"dismiss"===tF(e)?.trim().toLowerCase()?"dismiss":"close"}function tF(e){return e.label??e.value??e.identifier}function tB(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}))}function tV(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}function tq(e){return e.clock?.now()??Date.now()}async function tG(e,t){e.clock?await e.clock.sleep(t):await new Promise(e=>setTimeout(e,t))}async function tj(e,t){var a,n,r,s,o,l;let u,d,p,h;if(!e.backend.captureSnapshot)throw new c("UNSUPPORTED_OPERATION","snapshot is not supported by this backend");let m=t.session??"default",f=await e.sessions.get(m),g=await e.backend.captureSnapshot({session:m,requestId:t.requestId,appId:f?.appId,appBundleId:f?.appBundleId,signal:t.signal??e.signal,metadata:t.metadata},{interactiveOnly:t.interactiveOnly,compact:t.compact,depth:t.depth,scope:t.scope,raw:t.raw}),b=(n=g,r=e,a=n.snapshot?n.snapshot:{nodes:n.nodes??[],truncated:n.truncated,backend:n.backend,createdAt:tq(r)},a.presentationKey?a:{...a,presentationKey:i(t)}),w=tq(e);return{snapshot:b,result:g,session:f,warnings:((u=[...(s={result:g,snapshot:b,options:t,session:f,capturedAt:b.createdAt??w,runtimeNow:w}).result.warnings??[]]).push(...function(e){let t=e.result.analysis;if("android"!==e.snapshot.backend||!0!==e.options.interactiveOnly||e.snapshot.nodes.length>0||!t||(t.rawNodeCount??0)<12)return[];let a=[`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&&a.push(`Interactive output is empty at depth ${e.options.depth}; retry without -d.`),a}(s)),(d=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}`}(s.result.androidSnapshot))&&u.push(d),(p=function(e){if(tN(e).detected)return"Hint: React Native warning/error overlay detected. It overlays part of the app and should be handled before interacting.\nRun: agent-device react-native dismiss-overlay\nThen run: agent-device snapshot -i -c\nUse refs from the new snapshot."}(s.snapshot.nodes))&&u.push(p),(h=function(e){var t,a;let n=e.session?.snapshot,r=!!n&&[e.capturedAt,e.runtimeNow].some(e=>{let t=e-n.createdAt;return t>=0&&t<=2e3});if(!e.result.freshness&&n&&r&&(t=n.nodes.length,a=e.snapshot.nodes.length,!(t<12)&&a<=Math.floor(.2*t)))return tY}(s))&&u.push(h),u.push(...(o=s.result.freshness,l=s.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?[tY]:[]:[])),Array.from(new Set(u)))}}function tX(e,t){let a=t.session?.name??e??"default";return{...t.session??{name:a},name:a,snapshot:t.snapshot,appName:t.result.appName??t.session?.appName,appBundleId:t.result.appBundleId??t.session?.appBundleId}}let tY="Recent snapshots dropped sharply in node count, which suggests stale or mid-transition UI. Use screenshot as visual truth, wait briefly, then re-snapshot once.";function tK(e){return["visible","hidden","exists","editable","selected","text"].includes(e)}function tH(e){let{predicate:t,node:a,nodes:n,expectedText:r,platform:i}=e,s=g(a),o=y(a,i),l=!0===a.selected,c="text"===t?w(a):function(e,t,a){if(tz(e.rect))return function(e,t){return H(e,t)}(e,t);if(e.rect)return!1;if("android"!==a&&!0===e.hittable)return!0;let n=function(e,t){let a=new Map(t.map(e=>[e.index,e])),n=e,r=new Set;for(;"number"==typeof n.parentIndex&&!r.has(n.index);){r.add(n.index);let e=a.get(n.parentIndex);if(!e)break;if(function(e){let t=O(e.type??"");return!(t.includes("application")||t.includes("window")||t.includes("scrollview")||t.includes("tableview")||t.includes("collectionview"))&&"table"!==t&&"list"!==t&&"listview"!==t&&(!0===e.hittable||tz(e.rect))}(e))return e;n=e}return null}(e,t);return!!n&&(tz(n.rect)?function(e,t){return H(e,t)}(n,t):"android"!==a&&!0===n.hittable)}(a,n,i),u=!1;switch(t){case"visible":u=c;break;case"hidden":u=!c;break;case"editable":u=o;break;case"selected":u=l;break;case"text":u=s===(r??"")}let d="text"===t?`expected="${r??""}" actual="${s}"`:`actual=${JSON.stringify({visible:c,editable:o,selected:l})}`;return{pass:u,actualText:s,details:d}}function tz(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 tJ(e,t){let a=t??"default",n=await e.sessions.get(a);if(!n)throw new c("SESSION_NOT_FOUND","No active session. Run open first.");if(!n.snapshot)throw new c("INVALID_ARGS","No snapshot in session. Run snapshot first.");return{sessionName:a,session:n,snapshot:n.snapshot}}async function tW(e,t,a={updateSession:!0}){let n=e.backend.captureSnapshot;if(!n)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 n(tV(e,t),{interactiveOnly:!1,compact:!1,depth:t.depth,scope:a.scope??t.scope,raw:t.raw}),o=s.snapshot??{nodes:s.nodes??[],truncated:s.truncated,backend:s.backend,createdAt:tq(e)};return a.updateSession&&i&&await e.sessions.set({...i,snapshot:o}),{sessionName:r,session:i,snapshot:o}}async function tZ(e,t,a){if(e.backend.readText){let n=await e.backend.readText(tV(e,{session:t.sessionName}),a);if(n.text.trim())return n.text}return R(a)}let tQ=async(e,t)=>{if("ref"===t.target.kind){let a=await tJ(e,t.session),r=function(e,t,a){let r=n(t);if(!r)throw new c("INVALID_ARGS",a.invalidRefMessage);let i=s(e,r)??(a.fallbackLabel.length>0?D(e,a.fallbackLabel):null);if(!i)throw new c("COMMAND_FAILED",a.notFoundMessage);return{ref:r,node:i}}(a.snapshot.nodes,t.target.ref,{fallbackLabel:t.target.fallbackLabel??"",invalidRefMessage:"get text requires a ref like @e2",notFoundMessage:`Ref ${t.target.ref} not found`}),i=x(r.node,e.backend.platform,{action:"get"}),o={kind:"ref",ref:`@${r.ref}`};return"attrs"===t.property?{kind:"attrs",target:o,node:r.node,selectorChain:i}:{kind:"text",target:o,text:await tZ(e,a,r.node),node:r.node,selectorChain:i}}let a=await aa(e,t,t.session??"default",{selector:t.target.selector,disambiguateAmbiguous:"text"===t.property}),r=x(a.node,e.backend.platform,{action:"get"});if("attrs"===t.property)return{kind:"attrs",target:{kind:"selector",selector:a.selector},node:a.node,selectorChain:r};let i=await tZ(e,a.capture,a.node);return{kind:"text",target:{kind:"selector",selector:a.selector},text:i,node:a.node,selectorChain:r}},t0=async(e,t)=>{let a=await tQ(e,{...t,property:"text",target:t.target});if("text"!==a.kind)throw new c("COMMAND_FAILED","getText returned non-text result");return a},t1=async(e,t)=>{let a=await tQ(e,{...t,property:"attrs",target:t.target});if("attrs"!==a.kind)throw new c("COMMAND_FAILED","getAttrs returned non-attrs result");return a},t2=async(e,t)=>{if(!tK(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=await tW(e,t,{updateSession:!0}),n=b(t.selector);if("exists"===t.predicate){let r=A(a.snapshot.nodes,n,{platform:e.backend.platform});if(!r)throw new c("COMMAND_FAILED",N(n,[],{unique:!1}));return{predicate:t.predicate,pass:!0,selector:r.selector.raw,matches:r.matches,selectorChain:n.selectors.map(e=>e.raw)}}let r=M(a.snapshot.nodes,n,{platform:e.backend.platform,requireRect:!1,requireUnique:!0,disambiguateAmbiguous:!1});if(!r)throw new c("COMMAND_FAILED",N(n,[],{unique:!0}),{command:"is",reason:"selector_not_found",predicate:t.predicate,selector:n.raw});let i=tH({predicate:t.predicate,node:r.node,nodes:a.snapshot.nodes,expectedText:t.expectedText,platform:e.backend.platform});if(!i.pass)throw new c("COMMAND_FAILED",`is ${t.predicate} failed for selector ${r.selector.raw}: ${i.details}`,{command:"is",reason:"predicate_failed",predicate:t.predicate,selector:r.selector.raw,predicateDetails:i.details});return{predicate:t.predicate,pass:!0,selector:r.selector.raw,..."text"===t.predicate?{text:i.actualText}:{},selectorChain:n.selectors.map(e=>e.raw)}},t5=async(e,t)=>await t2(e,{...t,predicate:"visible",selector:t.target.selector}),t4=async(e,t)=>await t2(e,{...t,predicate:"hidden",selector:t.target.selector}),t3=async(e,t)=>{if("sleep"===t.target.kind)return await tG(e,t.target.durationMs),{kind:"sleep",waitedMs:t.target.durationMs};if("ref"===t.target.kind){let a=await tJ(e,t.session),r=n(t.target.ref);if(!r)throw new c("INVALID_ARGS",`Invalid ref: ${t.target.ref}`);let i=s(a.snapshot.nodes,r),o=i?I(i,a.snapshot.nodes):void 0;if(!o)throw new c("COMMAND_FAILED",`Ref ${t.target.ref} not found or has no label`);return await ae(e,t,o,t.target.timeoutMs)}if("selector"===t.target.kind)return await t7(e,t,t.target.selector,t.target.timeoutMs);if(!t.target.text)throw new c("INVALID_ARGS","wait requires text");return await ae(e,t,t.target.text,t.target.timeoutMs)},t8=async(e,t)=>{let a=await t3(e,{...t,target:{kind:"text",text:t.text,timeoutMs:t.timeoutMs}});if("text"!==a.kind)throw new c("COMMAND_FAILED","waitForText returned non-text result");return a};async function t6(e,t,a){let n=t.timeoutMs??1e4,r=tq(e);for(;tq(e)-r<n;){let{match:n}=await t9(e,t,a);if(n)return{kind:"found",found:!0,waitedMs:tq(e)-r};await tG(e,300)}throw new c("COMMAND_FAILED","find wait timed out")}async function t9(e,t,a){let n=await tW(e,t,{updateSession:!0,scope:"text"===a||"label"===a||"any"===a?t.query:void 0}),r=L(n.snapshot.nodes,a,t.query,{requireRect:!1}).matches[0];return{capture:n,match:r}}async function t7(e,t,a,n){let r=n??1e4,i=tq(e),s=b(a);for(;tq(e)-i<r;){let a=A((await tW(e,t,{updateSession:!0})).snapshot.nodes,s,{platform:e.backend.platform});if(a)return{kind:"selector",selector:a.selector.raw,waitedMs:tq(e)-i};await tG(e,300)}throw new c("COMMAND_FAILED",`wait timed out for selector: ${a}`)}async function ae(e,t,a,n){let r=n??1e4,i=tq(e);for(;tq(e)-i<r;){if(e.backend.findText?(await e.backend.findText(tV(e,t),a)).found:await at(e,t,a))return{kind:"text",text:a,waitedMs:tq(e)-i};await tG(e,300)}throw new c("COMMAND_FAILED",`wait timed out for text: ${a}`)}async function at(e,t,a){return!!D((await tW(e,t,{updateSession:!0})).snapshot.nodes,a)}async function aa(e,t,a,n){let r=await tW(e,{...t,session:a},{updateSession:!0}),i=b(n.selector),s=M(r.snapshot.nodes,i,{platform:e.backend.platform,requireRect:!1,requireUnique:!0,disambiguateAmbiguous:n.disambiguateAmbiguous});if(!s)throw new c("COMMAND_FAILED",N(i,[],{unique:!0}));return{capture:r,node:s.node,selector:s.selector.raw,ref:`@${s.node.ref}`}}function an(e){let t=ar(e);if(!t)return null;let a=r(t);return Number.isFinite(a.x)&&Number.isFinite(a.y)?a:null}function ar(e){if(!e)return null;let t=Number(e.x),a=Number(e.y),n=Number(e.width),r=Number(e.height);return Number.isFinite(t)&&Number.isFinite(a)&&Number.isFinite(n)&&Number.isFinite(r)&&!(n<0)&&!(r<0)?{x:t,y:a,width:n,height:r}:null}let ai=["button","link","menuitem","tabitem","textfield","searchfield","securetextfield","checkbox","radio","switch","cell"];function as(e,t){return ao(e,t).node}function ao(e,t){var a;let n=function(e,t){let a=ar(t.rect);if(!a)return null;let n=t,r=new Set;for(;!r.has(n.ref);){r.add(n.ref);let t=e.filter(e=>{if(e.parentIndex!==n.index||!e.hittable)return!1;let t=ar(e.rect);return!!t&&ac(t,a)});if(1!==t.length)break;let i=t[0];if(void 0===i)break;n=i}return n===t?null:n}(e,t);if(n?.rect&&an(n.rect))return{node:n,reason:"same-rect-descendant"};if([(a=t).type,a.role,a.subrole].map(e=>O(e??"")).some(al)&&t.rect&&an(t.rect))return{node:t,reason:"semantic-target"};let i=v(e,t);return i?.rect&&an(i.rect)?!function(e,t,a){var n,i,s,o;let l,c,u,d=ar(e.rect),p=ar(t.rect);if(!d||!p)return!1;let h=function(e,t){let a=r(t),n=e.filter(e=>{let t=(e.type??"").toLowerCase();return t.includes("application")||t.includes("window")}).map(e=>ar(e.rect)).filter(e=>null!==e);if(0===n.length)return null;let i=n.filter(e=>$(e,a.x,a.y));return U(i.length>0?i:n)}(a,d);return!!h&&(n=p,i=h,l=(s=n,o=i,Math.max(0,Math.min(s.x+s.width,o.x+o.width)-Math.max(s.x,o.x))*Math.max(0,Math.min(s.y+s.height,o.y+o.height)-Math.max(s.y,o.y))),c=n.width*n.height,u=i.width*i.height,!(l<=0)&&!(c<=0)&&!(u<=0)&&!!(l/u>=.9)&&!!(l/c>=.8))&&!ac(d,p)}(t,i,e)?{node:i,reason:"hittable-ancestor"}:{node:t,reason:"overly-broad-ancestor"}:{node:t,reason:"original"}}function al(e){return"tab"===e||ai.some(t=>e.includes(t))}function ac(e,t){return .5>=Math.abs(e.x-t.x)&&.5>=Math.abs(e.y-t.y)&&.5>=Math.abs(e.width-t.width)&&.5>=Math.abs(e.height-t.height)}async function au(e,t,a){if(await ap(e,t,a.action),"point"===t.target.kind)return{kind:"point",point:{x:t.target.x,y:t.target.y}};if("ref"===t.target.kind){let r=await am(e,t,t.target),i=r.resolved,s=a.promoteToHittableAncestor?as(r.snapshot.nodes,i.node):i.node;return function(e,t,a,r){let i=e.rect?z(e,t):null;if(!(!e.rect||!i||H(e,t)))throw new c("COMMAND_FAILED",`Ref ${a} is off-screen and not safe to ${r}`,{reason:"offscreen_ref",ref:n(a),rect:e.rect,viewport:i,hint:`Use scroll with the direction from the off-screen summary, take a fresh snapshot, then retry ${r} with the new ref or a selector.`})}(s,r.snapshot.nodes,t.target.ref,a.action),{kind:"ref",point:ag(s,`Ref ${t.target.ref} not found or has invalid bounds`),target:{kind:"ref",ref:`@${i.ref}`},node:s,selectorChain:x(s,e.backend.platform,{action:"fill"===a.action?"fill":"click"}),refLabel:I(s,r.snapshot.nodes)}}let r=await ad(e,t,a.requireInteractive),i=b(t.target.selector),s=M(r.snapshot.nodes,i,{platform:e.backend.platform,requireRect:!0,requireUnique:!0,disambiguateAmbiguous:!0});if(!s||!s.node.rect)throw new c("COMMAND_FAILED",N(i,s?.diagnostics??[],{unique:!0}));let o=a.promoteToHittableAncestor?as(r.snapshot.nodes,s.node):s.node;return{kind:"selector",point:ag(o,`Selector ${s.selector.raw} resolved to invalid bounds`),target:{kind:"selector",selector:s.selector.raw},node:o,selectorChain:x(o,e.backend.platform,{action:"fill"===a.action?"fill":"click"}),refLabel:I(o,r.snapshot.nodes)}}async function ad(e,t,a){if(!e.backend.captureSnapshot)throw new c("UNSUPPORTED_OPERATION","snapshot is not supported by this backend");let n=t.session??"default",r=await e.sessions.get(n);if(!r)throw new c("SESSION_NOT_FOUND","No active session. Run open first.");let i=await e.backend.captureSnapshot(tV(e,t),{interactiveOnly:a,compact:a}),s=i.snapshot??{nodes:i.nodes??[],truncated:i.truncated,backend:i.backend,createdAt:tq(e)};return await e.sessions.set({...r,snapshot:s}),{snapshot:s}}async function ap(e,t,a){if("macos"!==e.backend.platform)return;let n=await ah(e,t);if(("desktop"===n||"menubar"===n)&&("menubar"!==n||"click"!==a&&"press"!==a))throw new c("UNSUPPORTED_OPERATION",`${a} is not supported on macOS ${n} sessions yet. Open an app session to act, or use the ${n} surface to inspect.`)}async function ah(e,t){let a=await e.sessions.get(t.session??"default");return a?.metadata?.surface}async function am(e,t,a){let n=t.session??"default",r=await e.sessions.get(n);if(!r)throw new c("SESSION_NOT_FOUND","No active session. Run open first.");if(!r.snapshot)throw new c("INVALID_ARGS","No snapshot in session. Run snapshot first.");let i=a.fallbackLabel??"",s=af(r.snapshot.nodes,a.ref,{fallbackLabel:i,requireRect:!0});if(s)return{snapshot:r.snapshot,resolved:s};let o=await ad(e,t,!0),l=af(o.snapshot.nodes,a.ref,{fallbackLabel:i,requireRect:!0});if(!l)throw new c("COMMAND_FAILED",`Ref ${a.ref} not found or has no bounds`);return{...o,resolved:l}}function af(e,t,a){let r=n(t);if(!r)throw new c("INVALID_ARGS",`Invalid ref: ${t}`);let i=s(e,r);if(ab(i,a.requireRect))return{ref:r,node:i};let o=a.fallbackLabel.length>0?D(e,a.fallbackLabel):null;return ab(o,a.requireRect)?{ref:r,node:o}:null}function ag(e,t){if(!e.rect)throw new c("COMMAND_FAILED",t);let a=r(e.rect);if(!Number.isFinite(a.x)||!Number.isFinite(a.y))throw new c("COMMAND_FAILED",t);return a}function ab(e,t){if(!e)return!1;if(!t)return!0;if(!e.rect)return!1;let{x:a,y:n,width:i,height:s}=e.rect;if(!Number.isFinite(Number(a))||!Number.isFinite(Number(n))||!Number.isFinite(Number(i))||!Number.isFinite(Number(s))||0>Number(i)||0>Number(s))return!1;let o=r(e.rect);return Number.isFinite(o.x)&&Number.isFinite(o.y)}async function aw(e,t){let a=t.target??{kind:"viewport"};return"viewport"===a.kind?(await ap(e,t,"scroll"),{kind:"viewport"}):await au(e,{...t,target:a},{action:"scroll",requireInteractive:!1,promoteToHittableAncestor:!1})}async function ay(e,t){if(t.from){var a;if("x"in(a=t.from)&&"y"in a)return await ap(e,t,"swipe"),{point:ax(t.from,"from")};let n=await au(e,{...t,target:t.from},{action:"swipe",requireInteractive:!1,promoteToHittableAncestor:!1});return{point:n.point,target:n}}if(!t.direction)throw new c("INVALID_ARGS","swipe requires from+to or a direction");return await ap(e,t,"swipe"),{point:r(function(e){let t=e.filter(t=>H(t,e)).map(e=>e.rect).filter(aM),a=t.length>0?t:e.map(e=>e.rect).filter(aM);if(0===a.length)throw new c("COMMAND_FAILED","Cannot infer viewport for directional swipe");let n=Math.min(...a.map(e=>e.x)),r=Math.min(...a.map(e=>e.y));return{x:n,y:r,width:Math.max(...a.map(e=>e.x+e.width))-n,height:Math.max(...a.map(e=>e.y+e.height))-r}}((await ad(e,t,!1)).snapshot.nodes)),target:{kind:"viewport"}}}async function ak(e,t,a,n,r){if(!e.backend.captureSnapshot)throw new c("UNSUPPORTED_OPERATION",`scroll ${a} requires snapshot support to verify hidden content before scrolling`);let{captureSnapshot:i}=e.backend;return await eg({edge:a,target:n,scope:r,captureNodes:async a=>{let n=await i(tV(e,t),{compact:!0,scope:a});return n.snapshot?.nodes??n.nodes??[]}})}function av(e,t){switch(e){case"up":case"down":case"left":case"right":return e;default:throw new c("INVALID_ARGS",`${t} must be up, down, left, or right`)}}function ax(e,t){let a=Number(e.x),n=Number(e.y);if(!Number.isFinite(a)||!Number.isFinite(n))throw new c("INVALID_ARGS",`${t} point requires finite x and y`);return{x:a,y:n}}function aA(e,t){if(!Number.isFinite(e)||e<=0)throw new c("INVALID_ARGS",`${t} must be a positive number`);return e}function aM(e){return!!(e&&e.width>0&&e.height>0)}function aD(e){return e&&"object"==typeof e?e:void 0}async function aI(e,t,a){let n=await au(e,t,{action:a,requireInteractive:!0,promoteToHittableAncestor:!0});if(!e.backend.tap)throw new c("UNSUPPORTED_OPERATION","tap is not supported by this backend");let r=aS(await e.backend.tap(tV(e,t),n.point,{button:t.button,count:t.count,intervalMs:t.intervalMs,holdMs:t.holdMs,jitterPx:t.jitterPx,doubleTap:t.doubleTap}));return{...n,...r?{backendResult:r}:{}}}function aS(e){return e&&"object"==typeof e?e:void 0}function aR(e,t){if(void 0!==e)return aN(e,t)}function aN(e,t){let a=e?.trim();if(!a)throw new c("INVALID_ARGS",`${t} must be a non-empty string`);return a}function aO(e){return e&&"object"==typeof e?e:void 0}let aP=/^[A-Za-z0-9_.:-]{1,64}$/;async function aL(e,t){if(!t||"object"!=typeof t)throw new c("INVALID_ARGS","apps.push requires an input");if("json"===t.kind)return aE(t.payload,"apps.push JSON payload",8192),{backendInput:{kind:"json",payload:t.payload},inputKind:"json"};let a=await eO(e,t,{usage:"apps.push",field:"input"});return{backendInput:{kind:"file",path:a.path},inputKind:"file",...a.cleanup?{cleanup:a.cleanup}:{}}}function aE(e,t,a){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 a=JSON.stringify(e);if("string"!=typeof a)throw new c("INVALID_ARGS",`${t} must be JSON-serializable`);return a}catch{throw new c("INVALID_ARGS",`${t} must be JSON-serializable`)}}(e,t),"utf8")>a)throw new c("INVALID_ARGS",`${t} exceeds ${a} bytes`)}function a_(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}function aT(e){return e&&"object"==typeof e?e:void 0}async function aC(e,t,a){let n="reinstall"===a?"reinstallApp":"installApp",r=e.backend[n];if(!r)throw new c("UNSUPPORTED_OPERATION",`admin.${a} is not supported by this backend`);let i="app"in t&&void 0!==t.app?aN(t.app,"app"):void 0;if("installFromSource"!==a&&!i)throw new c("INVALID_ARGS",`admin.${a} requires app`);let s=tV(e,t),o=await a$(e,s,t.source);try{var l,u,d,h,m;let t,n,c,f,g,b,w,y,k=await r.call(e.backend,s,{...i?{app:i}:{},source:o.source});return l=a,u=i,d=o.source,h=k,t=aV(h),n=aB(h,"appName"),c=aB(h,"appId"),f=aB(h,"bundleId"),g=aB(h,"packageName"),b=aB(h,"launchTarget"),w=aB(h,"installablePath"),y=aB(h,"archivePath"),{kind:"reinstall"===l?"appReinstalled":"installFromSource"===l?"appInstalledFromSource":"appInstalled",...u?{app:u}:{},source:d,...c?{appId:c}:{},...n?{appName:n}:{},...f?{bundleId:f}:{},...g?{packageName:g}:{},...b?{launchTarget:b}:{},...w?{installablePath:w}:{},...y?{archivePath:y}:{},...t?{backendResult:t}:{},...p(`${"reinstall"===l?"Reinstalled":"Installed"}: ${n??b??u??(m=d,"path"===m.kind?m.path:"uploadedArtifact"===m.kind?m.id:m.url)}`)}}finally{await o.cleanup?.()}}async function a$(e,t,a){let n=aF(a),r=await aU(e,n);try{let a=e.backend.resolveInstallSource?await e.backend.resolveInstallSource(t,r.source):r.source;return{source:aF(a),...r.cleanup?{cleanup:r.cleanup}:{}}}catch(e){if(r.cleanup)try{await r.cleanup()}catch{}throw e}}async function aU(e,t){if("url"===t.kind)return{source:t};let a=await eO(e,t,{usage:"admin.install",field:"source"});return{source:{kind:"path",path:a.path},...a.cleanup?{cleanup:a.cleanup}:{}}}function aF(e){if(!e||"object"!=typeof e)throw new c("INVALID_ARGS","install source is required");if("path"===e.kind)return{kind:"path",path:aN(e.path,"source.path")};if("uploadedArtifact"===e.kind)return{kind:"uploadedArtifact",id:aN(e.id,"source.id")};if("url"===e.kind){let t=aN(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 aB(e,t){let a=e[t];return"string"==typeof a&&a.length>0?a:void 0}function aV(e){return e&&"object"==typeof e?e:void 0}function aq(e,t){if("start"===e||"stop"===e)return e;throw new c("INVALID_ARGS",`${t} action must be start or stop`)}function aG(e,t,a,n){return{kind:"start"===e?n.startKind:n.stopKind,action:e,...a?{artifact:a}:{},backendResult:t,...p("start"===e?n.startMessage:n.stopMessage)}}let aj=/(?:authorization|cookie|token|secret|password|passwd|api[-_]?key)/i,aX=/\b[A-Za-z0-9_-]{16,}\.[A-Za-z0-9_-]{16,}\.[A-Za-z0-9_-]{16,}\b/g;function aY(e){var t,a;let n=!1,r=e;return{value:(t=r=(r=(r=(r=(r=r.replaceAll(/(authorization|token|secret|password|passwd|api[-_]?key)=([^&\s]+)/gi,(e,t)=>(n=!0,`${String(t)}=[REDACTED]`))).replaceAll(/("(?:authorization|cookie|token|secret|password|passwd|api[-_]?key)"\s*:\s*")([^"]*)(")/gi,(e,t,a,r)=>(n=!0,`${String(t)}[REDACTED]${String(r)}`))).replaceAll(/\b(Bearer\s+)([^\s",;]+)/gi,(e,t)=>(n=!0,`${String(t)}[REDACTED]`))).replaceAll(/((?:authorization|cookie|token|secret|password|passwd|api[-_]?key)\s*[:=]\s*)([^\s,;&]+)/gi,(e,t)=>(n=!0,`${String(t)}[REDACTED]`))).replaceAll(aX,()=>(n=!0,"[REDACTED]")),a=()=>{n=!0},r=/(https?:\/\/|token|secret|password|authorization|cookie|api[-_]?key)/i.test(t)?t.replaceAll(/https?:\/\/[^\s"'<>)]+/gi,e=>{let t=aK(e);return t?(t.redacted&&a(),t.value):e}):t),redacted:n}}function aK(e){try{let t=new URL(e),a=function(e){let t=!1;for(let a of Array.from(e.searchParams.keys()))aj.test(a)&&(e.searchParams.set(a,"[REDACTED]"),t=!0);return t}(t);return(t.username||t.password)&&(t.username="REDACTED",t.password="REDACTED",a=!0),{value:t.toString(),redacted:a}}catch{return}}let aH=/(?:authorization|cookie|token|secret|password|passwd|api[-_]?key)/i;function az(e){if(!e)return{redacted:!1};let t=!1,a={};for(let[n,r]of Object.entries(e))if(aH.test(n))a[n]="[REDACTED]",t=!0;else{let e=aQ(r,2048);a[n]=e.value??"",t||=e.redacted}return{value:a,redacted:t}}function aJ(e){return void 0===e?{redacted:!1}:function(e){try{let t=JSON.parse(e),a=aZ(t,aY);return a0(JSON.stringify(a.value),2048,a.redacted)}catch{return}}(e)??aQ(e,2048)}function aW(e){return aZ(e,e=>aQ(e,2048))}function aZ(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 a=!1;return{value:e.map(e=>{let n=aZ(e,t);return a||=n.redacted,n.value}),redacted:a}}let a=!1,n={};for(let[r,i]of Object.entries(e)){if(aH.test(r)){n[r]="[REDACTED]",a=!0;continue}let e=aZ(i,t);n[r]=e.value,a||=e.redacted}return{value:n,redacted:a}}function aQ(e,t){if(void 0===e)return{redacted:!1};let a=aY(e);return a0(a.value,t,a.redacted)}function a0(e,t,a){if(void 0===e)return{redacted:a};let n=e;return n.length>t&&(n=`${n.slice(0,t)}...[truncated]`,a=!0),{value:n,redacted:a}}async function a1(e,t){let a=tV(e,t),n=t.session?await e.sessions.get(t.session):void 0;return{...a,...t.appId??n?.appId?{appId:t.appId??n?.appId}:{},...t.appBundleId??n?.appBundleId?{appBundleId:t.appBundleId??n?.appBundleId}:{}}}function a2(e,t,a,n){return{...a5(e),...void 0!==e.cursor?{cursor:aN(e.cursor,"cursor")}:{},limit:void 0===e.limit?t:eD(e.limit,n,1,a)}}function a5(e){return{...void 0!==e.since?{since:aN(e.since,"since")}:{},...void 0!==e.until?{until:aN(e.until,"until")}:{}}}function a4(e,t,a=50){if(!Array.isArray(e))throw new c("INVALID_ARGS",`${t} must be an array of strings`);if(e.length>a)throw new c("INVALID_ARGS",`${t} must contain at most ${a} entries`);return e.map((e,a)=>aN(e,`${t}[${a}]`))}let a3=async(e,t)=>{let a;if(!e.backend.captureScreenshot)throw new c("UNSUPPORTED_OPERATION","screenshot is not supported by this backend");let n=await eP(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},n.path,{fullscreen:t.fullscreen,overlayRefs:t.overlayRefs,stabilize:t.stabilize,surface:t.surface}),void 0!==t.maxSize&&await eN(n.path,t.maxSize),a=await n.publish()}catch(e){throw await n.cleanup?.(),e}return{path:n.path,...a?{artifacts:[a]}:{},...p(`Saved screenshot: ${n.path}`)}},a8=async(e,t)=>{let a,n,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&&!tb(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 eO(e,t.baseline,{usage:"diff screenshot baseline",field:"baseline"}),l=[];try{let c;c=tb(s)?(n=await td(e,t)).path:(a=await eO(e,s,{usage:"diff screenshot current",field:"current"})).path,r=t.out?await eP(e,t.out,{field:"diffPath",ext:".png"}):void 0;let u=await tn(o.path,c,{threshold:i,outputPath:r?.path,maxPixels:e.policy.maxImagePixels});tb(s)&&(u=await tp(e,t,r?.path,u,l));let d=u.diffPath?await r?.publish():void 0;return d&&l.push(d),u.diffPath||await r?.cleanup?.(),{...u,...l.length>0?{artifacts:l}:{}}}catch(e){throw await r?.cleanup?.(),e}finally{await o.cleanup?.(),await a?.cleanup?.(),await n?.cleanup?.()}},a6=async(e,t)=>{var a;let n,r,i=await tj(e,t),s=function(e){var t,a,n,r,i;let{previous:s,current:o,options:l,identity:c}=e;if(!0===l.forceFull||!0===l.raw||!s||!1===s.comparisonSafe||!1===o.comparisonSafe||(t=s,a=o,n=c,t.backend&&a.backend&&t.backend!==a.backend||n?.previousAppBundleId&&n.currentAppBundleId&&n.previousAppBundleId!==n.currentAppBundleId)||!s.presentationKey||s.presentationKey!==o.presentationKey||(r=s,i=o,r.truncated!==i.truncated||JSON.stringify(tB(r.nodes))!==JSON.stringify(tB(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(tX(t.session,i)),{nodes:i.snapshot.nodes,truncated:i.snapshot.truncated??!1,visibility:function(e){var t;let{nodes:a,backend:n,snapshotRaw:r}=e;if(r||"macos-helper"===(t=n)||"linux-atspi"===t)return{partial:!1,visibleNodeCount:a.length,totalNodeCount:a.length,reasons:[]};let i=X(a),s=new Set;return i.hiddenCount>0&&s.add("offscreen-nodes"),i.nodes.some(e=>e.hiddenContentAbove)&&s.add("scroll-hidden-above"),i.nodes.some(e=>e.hiddenContentBelow)&&s.add("scroll-hidden-below"),{partial:s.size>0,visibleNodeCount:i.nodes.length,totalNodeCount:a.length,reasons:[...s]}}({nodes:i.snapshot.nodes,backend:i.snapshot.backend,snapshotRaw:t.raw}),...i.result.androidSnapshot?{androidSnapshot:i.result.androidSnapshot}:{},...i.warnings.length>0?{warnings:i.warnings}:{},...s?{unchanged:s}:{},...(n=(a=i).result.appName??a.session?.appName,r=a.result.appBundleId??a.session?.appBundleId,{...n||r?{appName:n??r}:{},...r?{appBundleId:r}:{}})}},a9=async(e,t)=>{let a=await tj(e,t),n=!0===t.interactiveOnly,r=a.session?.snapshot,i=tX(t.session,a);if(!r){let t=function(e,t={}){return tS(e,t).length}(a.snapshot.nodes,{flatten:n});return await e.sessions.set(i),{mode:"snapshot",baselineInitialized:!0,summary:{additions:0,removals:0,unchanged:t},lines:[],...a.warnings.length>0?{warnings:a.warnings}:{}}}let s=function(e,t,a={}){let n=function(e,t){let a=e.length,n=t.length,r=a+n,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&&tR(i,r-1)<tR(i,r+1)?tR(i,r+1):tR(i,r-1)+1,c=l-r;for(;l<a&&c<n&&e[l].comparable===t[c].comparable;)l+=1,c+=1;if(i.set(r,l),l>=a&&c>=n)return function(e,t,a,n,r){let i=[],s=n,o=r;for(let n=e.length-1;n>=0;n-=1){let r=e[n],l=s-o,c=l===-n||l!==n&&tR(r,l-1)<tR(r,l+1)?l+1:l-1,u=tR(r,c),d=u-c;for(;s>u&&o>d;)i.push({kind:"unchanged",text:a[o-1].text}),s-=1,o-=1;if(0===n)break;s===u?(i.push({kind:"added",text:a[d].text}),o=d):(i.push({kind:"removed",text:t[u].text}),s=u)}return i.reverse(),i}(s,e,t,a,n)}}return[]}(tS(e,a),tS(t,a)),r={additions:0,removals:0,unchanged:0};for(let e of n)"added"===e.kind&&(r.additions+=1),"removed"===e.kind&&(r.removals+=1),"unchanged"===e.kind&&(r.unchanged+=1);return{summary:r,lines:n}}(r.nodes,a.snapshot.nodes,{flatten:n});return await e.sessions.set(i),{mode:"snapshot",baselineInitialized:!1,summary:s.summary,lines:s.lines,...a.warnings.length>0?{warnings:a.warnings}:{}}},a7=async(e,t)=>{let a=t.locator??"any";if(!t.query)throw new c("INVALID_ARGS","find requires a value");if("wait"===t.action)return await t6(e,t,a);let{capture:n,match:r}=await t9(e,t,a);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 tZ(e,n,r),node:r}},ne=tQ,nt=t0,na=t1,nn=t2,nr=t5,ni=t4,ns=t3,no=t8,nl=async(e,t)=>await aI(e,t,"click"),nc=async(e,t)=>await aI(e,t,"press"),nu=async(e,t)=>{var a;if(!t.text)throw new c("INVALID_ARGS","fill requires text");let n=await au(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 r=aS(await e.backend.fill(tV(e,t),n.point,t.text,{delayMs:t.delayMs})),i="node"in n?n.node.type??"":"",s=i&&!P(i,e.backend.platform)?`fill target ${a=n,a.target?.kind==="ref"?a.target.ref:a.target?.kind==="selector"?a.target.selector:"point"} resolved to "${i}", attempting fill anyway.`:void 0;return{...n,text:t.text,...s?{warning:s}:{},...r?{backendResult:r}:{}}},nd=async(e,t)=>{let a=t.text;if(!a)throw new c("INVALID_ARGS","type requires text");let n=ef(a);if(n)throw new c("INVALID_ARGS",`type does not accept a target ref like "${n}"`,{hint:`Use fill ${n} "text" to target that field, or press ${n} then type "text" to append.`});if(!e.backend.typeText)throw new c("UNSUPPORTED_OPERATION","type is not supported by this backend");let r=eD(t.delayMs??0,"delay-ms",0,1e4),i=aS(await e.backend.typeText(tV(e,t),a,{delayMs:r}));return{kind:"text",text:a,delayMs:r,...i?{backendResult:i}:{},...p(`Typed ${Array.from(a).length} chars`)}},np=async(e,t)=>{let a=await au(e,t,{action:"focus",requireInteractive:!0,promoteToHittableAncestor:!1});if(!e.backend.focus)throw new c("UNSUPPORTED_OPERATION","focus is not supported by this backend");let n=aD(await e.backend.focus(tV(e,t),a.point));return{...a,...n?{backendResult:n}:{},...p(`Focused (${a.point.x}, ${a.point.y})`)}},nh=async(e,t)=>{let a=await au(e,t,{action:"longPress",requireInteractive:!0,promoteToHittableAncestor:!0});if(!e.backend.longPress)throw new c("UNSUPPORTED_OPERATION","longPress is not supported by this backend");let n=void 0===t.durationMs?void 0:eD(t.durationMs,"durationMs",0,12e4),r=aD(await e.backend.longPress(tV(e,t),a.point,{durationMs:n}));return{...a,...void 0!==n?{durationMs:n}:{},...r?{backendResult:r}:{},...p(`Long pressed (${a.point.x}, ${a.point.y})`)}},nm=async(e,t)=>{if(!e.backend.swipe)throw new c("UNSUPPORTED_OPERATION","swipe is not supported by this backend");let a=await ay(e,t),n=function(e,t){if(t.to)return{point:ax(t.to,"to")};let a=av(t.direction,"swipe direction"),n=aA(t.distance??200,"swipe distance");switch(a){case"up":return{point:{x:e.x,y:e.y-n},direction:a,distance:n};case"down":return{point:{x:e.x,y:e.y+n},direction:a,distance:n};case"left":return{point:{x:e.x-n,y:e.y},direction:a,distance:n};case"right":return{point:{x:e.x+n,y:e.y},direction:a,distance:n}}}(a.point,t),r=void 0===t.durationMs?void 0:eD(t.durationMs,"durationMs",16,1e4),i=aD(await e.backend.swipe(tV(e,t),a.point,n.point,{durationMs:r}));return{kind:"swipe",from:a.point,to:n.point,...n.direction?{direction:n.direction}:{},...void 0!==n.distance?{distance:n.distance}:{},...void 0!==r?{durationMs:r}:{},...a.target?{fromTarget:a.target}:{},...i?{backendResult:i}:{},...p("Swiped")}},nf=async(e,t)=>{var a,n,r,i;let s;if(!e.backend.scroll)throw new c("UNSUPPORTED_OPERATION","scroll is not supported by this backend");let o="bottom"===(a=t.direction)?{direction:"down",edge:"bottom"}:"top"===a?{direction:"up",edge:"top"}:{direction:av(a,"scroll direction")},l=(n=t.amount,r="scroll amount",void 0===n?void 0:aA(n,r)),u=function(e,t){if(void 0!==e){if(!Number.isFinite(e)||!Number.isInteger(e)||e<=0)throw new c("INVALID_ARGS",`${t} must be a positive integer`);return e}}(t.pixels,"scroll pixels");if(void 0!==l&&void 0!==u)throw new c("INVALID_ARGS","scroll accepts either amount or pixels, not both");let d=await aw(e,t),h="viewport"===d.kind?{kind:"viewport"}:{kind:"point",point:d.point},m=e.backend.scroll,f=async()=>await m(tV(e,t),h,{direction:o.direction,...void 0!==l?{amount:l}:{},...void 0!==u?{pixels:u}:{}}),g=0;if(o.edge){let a=o.edge,n="viewport"===(i=d).kind?{}:{point:i.point,nodeIndex:"node"in i?i.node.index:void 0},r=await eb({edge:a,captureState:async r=>await ak(e,t,a,n,r),scroll:f});s=r.result,g=r.passes}else s=await f(),g=1;let b=aD(s);return{...d,direction:o.direction,...o.edge?{edge:o.edge,passes:g}:{},...void 0!==l?{amount:l}:{},...void 0!==u?{pixels:u}:{},...b?{backendResult:b}:{},...p(ew(o.direction,o.edge,g,l,u))}},ng=async(e,t)=>{if(!e.backend.pinch)throw new c("UNSUPPORTED_OPERATION","pinch is not supported by this backend");await ap(e,t,"pinch");let a=aA(t.scale,"pinch scale"),n=t.center?await au(e,{...t,target:t.center},{action:"pinch",requireInteractive:!1,promoteToHittableAncestor:!1}):void 0,r=aD(await e.backend.pinch(tV(e,t),{scale:a,...n?{center:n.point}:{}}));return{kind:"pinch",scale:a,...n?{center:n.point,centerTarget:n}:{},...r?{backendResult:r}:{},...p(`Pinched to scale ${a}`)}},nb=async(e,t={})=>{if(!e.backend.pressBack)throw new c("UNSUPPORTED_OPERATION","system.back is not supported by this backend");let a=t.mode??"in-app";if("in-app"!==a&&"system"!==a)throw new c("INVALID_ARGS","system.back mode must be in-app or system");let n=aO(await e.backend.pressBack(tV(e,t),{mode:a}));return{kind:"systemBack",mode:a,...n?{backendResult:n}:{},...p("Back")}},nw=async(e,t={})=>{if(!e.backend.pressHome)throw new c("UNSUPPORTED_OPERATION","system.home is not supported by this backend");let a=aO(await e.backend.pressHome(tV(e,t)));return{kind:"systemHome",...a?{backendResult:a}:{},...p("Home")}},ny=async(e,t)=>{if(!e.backend.rotate)throw new c("UNSUPPORTED_OPERATION","system.rotate is not supported by this backend");let a=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),n=aO(await e.backend.rotate(tV(e,t),a));return{kind:"systemRotated",orientation:a,...n?{backendResult:n}:{},...p(`Rotated to ${a}`)}},nk=async(e,t={})=>{var a,n,r,i,s,o,l;if(!e.backend.setKeyboard)throw new c("UNSUPPORTED_OPERATION","system.keyboard is not supported by this backend");let u=t.action??"status";if(!em(u))throw new c("INVALID_ARGS","system.keyboard action must be status, get, dismiss, enter, or return");let d=await e.backend.setKeyboard(tV(e,t),{action:u}),h=aO(d),m=(a=d)&&"object"==typeof a?d:{};return"enter"===u||"return"===u?{kind:"keyboardEnterPressed",action:"enter",state:m,...(n=h)?{backendResult:n}:{},...p("Keyboard enter pressed")}:"dismiss"===u?(r=u,{kind:"keyboardDismissed",action:r,state:i=m,...(s=h)?{backendResult:s}:{},...p(!1===i.dismissed?"Keyboard already hidden":"Keyboard dismissed")}):(o=u,{kind:"keyboardState",action:o,state:m,...(l=h)?{backendResult:l}:{}})},nv=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 a=await e.backend.getClipboard(tV(e,t));return{kind:"clipboardText",action:"read",text:"string"==typeof a?a:a.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 a=aO(await e.backend.setClipboard(tV(e,t),t.text));return{kind:"clipboardUpdated",action:"write",textLength:Array.from(t.text).length,...a?{backendResult:a}:{},...p("Clipboard updated")}},nx=async(e,t={})=>{if(!e.backend.openSettings)throw new c("UNSUPPORTED_OPERATION","system.settings is not supported by this backend");let a=aR(t.target,"target"),n=aO(await e.backend.openSettings(tV(e,t),a));return{kind:"settingsOpened",...a?{target:a}:{},...n?{backendResult:n}:{},...p(a?`Opened settings: ${a}`:"Opened settings")}},nA=async(e,t={})=>{var a,n;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:eD(t.timeoutMs,"timeoutMs",0,12e4),s=await e.backend.handleAlert(tV(e,t),r,{timeoutMs:i});return a=r,n=s,"get"===a?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}}(n):"wait"===a?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}:{},...p(e.alert?"Alert visible":"Alert wait timed out")}}(n):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}:{},...p(t.handled?`Alert ${e}ed`:"No alert handled")}}(a,n)},nM=async(e,t={})=>{if(!e.backend.openAppSwitcher)throw new c("UNSUPPORTED_OPERATION","system.appSwitcher is not supported by this backend");let a=aO(await e.backend.openAppSwitcher(tV(e,t)));return{kind:"appSwitcherOpened",...a?{backendResult:a}:{},...p("Opened app switcher")}},nD=async(e,t)=>{var a;if(!e.backend.openApp)throw new c("UNSUPPORTED_OPERATION","apps.open is not supported by this backend");let n=function(e){var t;let a=aR(e.app,"app"),n=aR(e.appId,"appId"),r=aR(e.bundleId,"bundleId"),i=aR(e.packageName,"packageName"),s=aR(e.url,"url"),o=aR(e.activity,"activity"),l={...a?{app:a}:{},...n?{appId:n}:{},...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=aT(await e.backend.openApp(a_(e,t),n,{relaunch:t.relaunch}));return{kind:"appOpened",target:n,relaunch:!0===t.relaunch,...r?{backendResult:r}:{},...p(`Opened: ${(a=n).app??a.appId??a.bundleId??a.packageName??a.url??a.activity??"app"}`)}},nI=async(e,t={})=>{if(!e.backend.closeApp)throw new c("UNSUPPORTED_OPERATION","apps.close is not supported by this backend");let a=aR(t.app,"app"),n=aT(await e.backend.closeApp(a_(e,t),a));return{kind:"appClosed",...a?{app:a}:{},...n?{backendResult:n}:{},...p(a?`Closed: ${a}`:"Closed app")}},nS=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(a_(e,t),T(t.filter))}},nR=async(e,t)=>{if(!e.backend.getAppState)throw new c("UNSUPPORTED_OPERATION","apps.state is not supported by this backend");let a=aN(t.app,"app"),n=await e.backend.getAppState(a_(e,t),a);return{kind:"appState",app:a,state:n}},nN=async(e,t)=>{if(!e.backend.pushFile)throw new c("UNSUPPORTED_OPERATION","apps.push is not supported by this backend");let a=aN(t.app,"app"),n=await aL(e,t.input);try{let r=await e.backend.pushFile(a_(e,t),n.backendInput,a),i=aT(r);return{kind:"appPushed",app:a,inputKind:n.inputKind,...i?{backendResult:i}:{},...p(`Pushed to ${a}`)}}finally{await n.cleanup?.()}},nO=async(e,t)=>{var a,n;if(!e.backend.triggerAppEvent)throw new c("UNSUPPORTED_OPERATION","apps.triggerEvent is not supported by this backend");let r=function(e){let t=aN(e,"name");if(!aP.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);a=t.payload,n=`apps.triggerEvent payload for "${r}"`,void 0!==a&&aE(a,n,8192);let i=aT(await e.backend.triggerAppEvent(a_(e,t),{name:r,...t.payload?{payload:t.payload}:{}}));return{kind:"appEventTriggered",name:r,...t.payload?{payload:t.payload}:{},...i?{backendResult:i}:{},...p(`Triggered app event: ${r}`)}},nP=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(tV(e,t),t.filter)}},nL=async(e,t={})=>{if(!e.backend.bootDevice)throw new c("UNSUPPORTED_OPERATION","admin.boot is not supported by this backend");let a=function(e){if(!e)return;let t=aR(e.id,"target.id"),a=aR(e.name,"target.name"),n={...t?{id:t}:{},...a?{name:a}:{},...e.platform?{platform:e.platform}:{},...e.target?{target:e.target}:{},...void 0!==e.headless?{headless:e.headless}:{}};return Object.keys(n).length>0?n:void 0}(t.target),n=aV(await e.backend.bootDevice(tV(e,t),a));return{kind:"deviceBooted",...a?{target:a}:{},...n?{backendResult:n}:{},...p("Booted device")}},nE=async(e,t)=>await aC(e,t,"install"),n_=async(e,t)=>await aC(e,t,"reinstall"),nT=async(e,t)=>await aC(e,t,"installFromSource"),nC=async(e,t)=>{let a=aq(t.action,"record"),n="start"===a?e.backend.startRecording:e.backend.stopRecording;if(!n)throw new c("UNSUPPORTED_OPERATION",`record ${a} is not supported by this backend`);let r=t.out?await eP(e,t.out,{field:"path",ext:".mp4"}):void 0;try{var i,s,o,l,u;let c,d,p=(i=t,s=r?.path,c=void 0===i.fps?void 0:eD(i.fps,"fps",1,60),d=void 0===i.quality?void 0:eD(i.quality,"quality",5,10),{...s?{outPath:s}:{},...void 0!==c?{fps:c}:{},...void 0!==d?{quality:d}:{},...void 0!==i.hideTouches?{showTouches:!0!==i.hideTouches}:{}}),h=await n.call(e.backend,tV(e,t),p),m=await r?.publish();return o=a,l=h,u=m,{..."string"==typeof l.path?{path:l.path}:{},..."string"==typeof l.telemetryPath?{telemetryPath:l.telemetryPath}:{},..."string"==typeof l.warning?{warning:l.warning}:{},...aG(o,l,u,{startKind:"recordingStarted",stopKind:"recordingStopped",startMessage:"Recording started",stopMessage:"Recording stopped"})}}catch(e){throw await r?.cleanup?.(),e}},n$=async(e,t)=>{let a=aq(t.action,"trace"),n="start"===a?e.backend.startTrace:e.backend.stopTrace;if(!n)throw new c("UNSUPPORTED_OPERATION",`trace ${a} is not supported by this backend`);let r=t.out?await eP(e,t.out,{field:"outPath",ext:".trace"}):void 0;try{var i,s,o;let l={...r?.path?{outPath:r.path}:{}},c=await n.call(e.backend,tV(e,t),l),u=await r?.publish();return i=a,s=c,o=u,{..."string"==typeof s.outPath?{outPath:s.outPath}:{},...aG(i,s,o,{startKind:"traceStarted",stopKind:"traceStopped",startMessage:"Trace started",stopMessage:"Trace stopped"})}}catch(e){throw await r?.cleanup?.(),e}},nU=async(e,t={})=>{var a,n;let r;if(!e.backend.readLogs)throw new c("UNSUPPORTED_OPERATION","diagnostics.logs is not supported by this backend");return r=!0===(a=await e.backend.readLogs(await a1(e,t),{...a2(n=t,100,500,"logs limit"),...void 0!==n.levels?{levels:a4(n.levels,"levels")}:{},...void 0!==n.search?{search:aN(n.search,"search")}:{},...void 0!==n.source?{source:aN(n.source,"source")}:{}})).redacted,{kind:"diagnosticsLogs",entries:a.entries.map(e=>{let t=aQ(e.message,4096),a=aW(e.metadata);return r||=t.redacted||a.redacted,{...e.timestamp?{timestamp:e.timestamp}:{},...e.level?{level:e.level}:{},message:t.value??"",...e.source?{source:e.source}:{},...a.value?{metadata:a.value}:{}}}),...a.nextCursor?{nextCursor:a.nextCursor}:{},...a.timeWindow?{timeWindow:a.timeWindow}:{},...a.backend?{backend:a.backend}:{},redacted:r,...a.notes?{notes:a.notes}:{}}},nF=async(e,t={})=>{var a,n,r;let i;if(!e.backend.dumpNetwork)throw new c("UNSUPPORTED_OPERATION","diagnostics.network is not supported by this backend");let s={...a2(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 a=await e.backend.dumpNetwork(await a1(e,t),s),n=s.include??"summary",i=!0===a.redacted,{kind:"diagnosticsNetwork",entries:a.entries.map(e=>{var t;let a=e.url?aK(t=e.url)??aQ(t,2048):void 0,r="headers"===n||"all"===n?az(e.requestHeaders):void 0,s="headers"===n||"all"===n?az(e.responseHeaders):void 0,o="body"===n||"all"===n?aJ(e.requestBody):void 0,l="body"===n||"all"===n?aJ(e.responseBody):void 0,c=aW(e.metadata);return i||=(a?.redacted??!1)||(r?.redacted??!1)||(s?.redacted??!1)||(o?.redacted??!1)||(l?.redacted??!1)||c.redacted,{...e.timestamp?{timestamp:e.timestamp}:{},...e.method?{method:e.method}:{},...a?{url:a.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}:{},...c.value?{metadata:c.value}:{}}}),...a.nextCursor?{nextCursor:a.nextCursor}:{},...a.timeWindow?{timeWindow:a.timeWindow}:{},...a.backend?{backend:a.backend}:{},redacted:i,...a.notes?{notes:a.notes}:{}}},nB=async(e,t={})=>{var a,n;let r;if(!e.backend.measurePerf)throw new c("UNSUPPORTED_OPERATION","diagnostics.perf is not supported by this backend");return r=!0===(a=await e.backend.measurePerf(await a1(e,t),{...a5(n=t),...void 0!==n.sampleMs?{sampleMs:eD(n.sampleMs,"sampleMs",100,6e4)}:{},...void 0!==n.metrics?{metrics:a4(n.metrics,"metrics",20)}:{}})).redacted,{kind:"diagnosticsPerf",metrics:a.metrics.map(e=>{let t=aQ(e.message,4096),a=aW(e.metadata);return r||=t.redacted||a.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}:{},...a.value?{metadata:a.value}:{}}}),...a.startedAt?{startedAt:a.startedAt}:{},...a.endedAt?{endedAt:a.endedAt}:{},...a.backend?{backend:a.backend}:{},redacted:r,...a.notes?{notes:a.notes}:{}}};function nV(e){let t={backend:e.backend,artifacts:e.artifacts,sessions:e.sessions??function(e=[]){let t=new Map(e.map(e=>[e.name,nq(e)]));return{get:e=>nq(t.get(e)),set:e=>{t.set(e.name,nq(e))},delete:e=>{t.delete(e)},list:()=>Array.from(t.values(),e=>nq(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=>a3(t,e),diffScreenshot:e=>a8(t,e),snapshot:e=>a6(t,e),diffSnapshot:e=>a9(t,e)},selectors:{find:e=>a7(t,e),get:e=>ne(t,e),getText:(e,a={})=>nt(t,{...a,target:e}),getAttrs:(e,a={})=>na(t,{...a,target:e}),is:e=>nn(t,e),isVisible:(e,a={})=>nr(t,{...a,target:e}),isHidden:(e,a={})=>ni(t,{...a,target:e}),wait:e=>ns(t,e),waitForText:(e,a={})=>no(t,{...a,text:e})},interactions:{click:(e,a={})=>nl(t,{...a,target:e}),press:(e,a={})=>nc(t,{...a,target:e}),fill:(e,a,n={})=>nu(t,{...n,target:e,text:a}),typeText:(e,a={})=>nd(t,{...a,text:e}),focus:(e,a={})=>np(t,{...a,target:e}),longPress:(e,a={})=>nh(t,{...a,target:e}),swipe:e=>nm(t,e),scroll:e=>nf(t,e),pinch:e=>ng(t,e)},system:{back:e=>nb(t,e),home:e=>nw(t,e),rotate:e=>ny(t,e),keyboard:e=>nk(t,e),clipboard:e=>nv(t,e),settings:e=>nx(t,e),alert:e=>nA(t,e),appSwitcher:e=>nM(t,e)},apps:{open:e=>nD(t,e),close:e=>nI(t,e),list:(e={})=>nS(t,{...e,filter:E(e.filter)}),state:e=>nR(t,e),push:e=>nN(t,e),triggerEvent:e=>nO(t,e)},admin:{devices:e=>nP(t,e),boot:e=>nL(t,e),install:e=>nE(t,e),reinstall:e=>n_(t,e),installFromSource:e=>nT(t,e)},recording:{record:e=>nC(t,e),trace:e=>n$(t,e)},observability:{logs:e=>nU(t,e),network:e=>nF(t,e),perf:e=>nB(t,e)}}}function nq(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 nG(e={}){return{allowLocalInputPaths:!0,allowLocalOutputPaths:!0,maxImagePixels:2e7,allowNamedBackendCapabilities:[],...e}}let nj=["app","frontmost-app","desktop","menubar"];function nX(e){let t=e?.trim().toLowerCase();if("app"===t||"frontmost-app"===t||"desktop"===t||"menubar"===t)return t;throw new c("INVALID_ARGS",`Invalid surface: ${e}. Use ${nj.join("|")}.`)}function nY(...e){return e}let nK=nY("snapshotInteractiveOnly","snapshotCompact","snapshotDepth","snapshotScope","snapshotRaw"),nH=nY("snapshotDepth","snapshotScope","snapshotRaw"),nz=nY("metroProjectRoot","metroKind","metroPublicBaseUrl","metroProxyBaseUrl","metroBearerToken","metroPreparePort","metroListenHost","metroStatusHost","metroStartupTimeoutMs","metroProbeTimeoutMs","metroRuntimeFile","metroNoReuseExisting","metroNoInstallDeps"),nJ=nY("metroHost","metroPort","bundleUrl"),nW=nY("count","intervalMs","holdMs","jitterPx","doubleTap"),nZ=nY("replayUpdate","replayEnv"),nQ=[{key:"config",names:["--config"],type:"string",usageLabel:"--config <path>",usageDescription:"Load CLI defaults from a specific config file"},{key:"remoteConfig",names:["--remote-config"],type:"string",usageLabel:"--remote-config <path>",usageDescription:"Load remote host + Metro workflow settings from a specific profile file"},{key:"stateDir",names:["--state-dir"],type:"string",usageLabel:"--state-dir <path>",usageDescription:"Daemon state directory (defaults to ~/.agent-device)"},{key:"daemonBaseUrl",names:["--daemon-base-url"],type:"string",usageLabel:"--daemon-base-url <url>",usageDescription:"Explicit remote HTTP daemon base URL (skip local daemon discovery/startup)"},{key:"daemonAuthToken",names:["--daemon-auth-token"],type:"string",usageLabel:"--daemon-auth-token <token>",usageDescription:"Remote HTTP daemon auth token (sent as request token and bearer header)"},{key:"daemonTransport",names:["--daemon-transport"],type:"enum",enumValues:["auto","socket","http"],usageLabel:"--daemon-transport auto|socket|http",usageDescription:"Daemon client transport preference"},{key:"daemonServerMode",names:["--daemon-server-mode"],type:"enum",enumValues:["socket","http","dual"],usageLabel:"--daemon-server-mode socket|http|dual",usageDescription:"Daemon server mode used when spawning daemon"},{key:"tenant",names:["--tenant"],type:"string",usageLabel:"--tenant <id>",usageDescription:"Tenant scope identifier for isolated daemon sessions"},{key:"sessionIsolation",names:["--session-isolation"],type:"enum",enumValues:["none","tenant"],usageLabel:"--session-isolation none|tenant",usageDescription:"Session isolation strategy (tenant prefixes session namespace)"},{key:"runId",names:["--run-id"],type:"string",usageLabel:"--run-id <id>",usageDescription:"Run identifier used for tenant lease admission checks"},{key:"leaseId",names:["--lease-id"],type:"string",usageLabel:"--lease-id <id>",usageDescription:"Lease identifier bound to tenant/run admission scope"},{key:"leaseBackend",names:["--lease-backend"],type:"enum",enumValues:["ios-simulator","ios-instance","android-instance"],usageLabel:"--lease-backend ios-simulator|ios-instance|android-instance",usageDescription:"Lease backend for remote tenant connection admission"},{key:"force",names:["--force"],type:"boolean",usageLabel:"--force",usageDescription:"Force connection state replacement when reconnecting"},{key:"noLogin",names:["--no-login"],type:"boolean",usageLabel:"--no-login",usageDescription:"Connect: fail instead of starting implicit cloud login"},{key:"sessionLock",names:["--session-lock"],type:"enum",enumValues:["reject","strip"],usageLabel:"--session-lock reject|strip",usageDescription:"Lock bound-session device routing for this CLI invocation and nested batch steps"},{key:"sessionLocked",names:["--session-locked"],type:"boolean",usageLabel:"--session-locked",usageDescription:"Deprecated alias for --session-lock reject"},{key:"sessionLockConflicts",names:["--session-lock-conflicts"],type:"enum",enumValues:["reject","strip"],usageLabel:"--session-lock-conflicts reject|strip",usageDescription:"Deprecated alias for --session-lock"},{key:"platform",names:["--platform"],type:"enum",enumValues:["ios","macos","android","linux","apple"],usageLabel:"--platform ios|macos|android|linux|apple",usageDescription:"Platform to target (`apple` aliases the Apple automation backend)"},{key:"target",names:["--target"],type:"enum",enumValues:["mobile","tv","desktop"],usageLabel:"--target mobile|tv|desktop",usageDescription:"Device target class to match"},{key:"device",names:["--device"],type:"string",usageLabel:"--device <name>",usageDescription:"Device name to target"},{key:"udid",names:["--udid"],type:"string",usageLabel:"--udid <udid>",usageDescription:"iOS device UDID"},{key:"serial",names:["--serial"],type:"string",usageLabel:"--serial <serial>",usageDescription:"Android device serial"},{key:"surface",names:["--surface"],type:"enum",enumValues:nj,usageLabel:"--surface app|frontmost-app|desktop|menubar",usageDescription:"macOS session surface for open (defaults to app)"},{key:"headless",names:["--headless"],type:"boolean",usageLabel:"--headless",usageDescription:"Boot: launch Android emulator without a GUI window"},{key:"metroHost",names:["--metro-host"],type:"string",usageLabel:"--metro-host <host>",usageDescription:"Session-scoped Metro/debug host hint"},{key:"metroPort",names:["--metro-port"],type:"int",min:1,max:65535,usageLabel:"--metro-port <port>",usageDescription:"Session-scoped Metro/debug port hint"},{key:"metroProjectRoot",names:["--project-root"],type:"string",usageLabel:"--project-root <path>",usageDescription:"metro prepare: React Native project root (default: cwd)"},{key:"metroKind",names:["--kind"],type:"enum",enumValues:["auto","react-native","expo"],usageLabel:"--kind auto|react-native|expo",usageDescription:"metro prepare: detect or force the Metro launcher kind"},{key:"metroPublicBaseUrl",names:["--public-base-url"],type:"string",usageLabel:"--public-base-url <url>",usageDescription:"metro prepare: public base URL used for direct bundle hints"},{key:"metroProxyBaseUrl",names:["--proxy-base-url"],type:"string",usageLabel:"--proxy-base-url <url>",usageDescription:"metro prepare: optional bridge origin for remote Metro access"},{key:"metroBearerToken",names:["--bearer-token"],type:"string",usageLabel:"--bearer-token <token>",usageDescription:"metro prepare: host bridge bearer token (or AGENT_DEVICE_METRO_BEARER_TOKEN; falls back to AGENT_DEVICE_DAEMON_AUTH_TOKEN)"},{key:"metroPreparePort",names:["--port"],type:"int",min:1,max:65535,usageLabel:"--port <port>",usageDescription:"metro prepare: local Metro port (default: 8081)"},{key:"metroListenHost",names:["--listen-host"],type:"string",usageLabel:"--listen-host <host>",usageDescription:"metro prepare: host Metro listens on (default: 0.0.0.0)"},{key:"metroStatusHost",names:["--status-host"],type:"string",usageLabel:"--status-host <host>",usageDescription:"metro prepare: host used for local /status polling (default: 127.0.0.1)"},{key:"metroStartupTimeoutMs",names:["--startup-timeout-ms"],type:"int",min:1,usageLabel:"--startup-timeout-ms <ms>",usageDescription:"metro prepare: timeout while waiting for Metro to become ready"},{key:"metroProbeTimeoutMs",names:["--probe-timeout-ms"],type:"int",min:1,usageLabel:"--probe-timeout-ms <ms>",usageDescription:"metro prepare: timeout for /status and proxy bridge calls"},{key:"metroRuntimeFile",names:["--runtime-file"],type:"string",usageLabel:"--runtime-file <path>",usageDescription:"metro prepare: optional file path to persist the JSON result"},{key:"metroNoReuseExisting",names:["--no-reuse-existing"],type:"boolean",usageLabel:"--no-reuse-existing",usageDescription:"metro prepare: always start a fresh Metro process"},{key:"metroNoInstallDeps",names:["--no-install-deps"],type:"boolean",usageLabel:"--no-install-deps",usageDescription:"metro prepare: skip package-manager install when node_modules is missing"},{key:"bundleUrl",names:["--bundle-url"],type:"string",usageLabel:"--bundle-url <url>",usageDescription:"Session-scoped bundle URL hint"},{key:"launchUrl",names:["--launch-url"],type:"string",usageLabel:"--launch-url <url>",usageDescription:"Session-scoped deep link / launch URL hint"},{key:"iosSimulatorDeviceSet",names:["--ios-simulator-device-set"],type:"string",usageLabel:"--ios-simulator-device-set <path>",usageDescription:"Scope iOS simulator discovery/commands to this simulator device set"},{key:"androidDeviceAllowlist",names:["--android-device-allowlist"],type:"string",usageLabel:"--android-device-allowlist <serials>",usageDescription:"Comma/space separated Android serial allowlist for discovery/selection"},{key:"activity",names:["--activity"],type:"string",usageLabel:"--activity <component>",usageDescription:"Android app launch activity (package/Activity); not for URL opens"},{key:"launchConsole",names:["--launch-console"],type:"string",usageLabel:"--launch-console <path>",usageDescription:"open: capture the initial iOS simulator launch console window to a file"},{key:"header",names:["--header"],type:"string",multiple:!0,usageLabel:"--header <name:value>",usageDescription:"install-from-source: repeatable HTTP header for URL downloads"},{key:"githubActionsArtifact",names:["--github-actions-artifact"],type:"string",usageLabel:"--github-actions-artifact <owner/repo:artifact>",usageDescription:"install-from-source: GitHub Actions artifact resolved by a remote daemon"},{key:"installSource",names:[],type:"string"},{key:"session",names:["--session"],type:"string",usageLabel:"--session <name>",usageDescription:"Named session"},{key:"count",names:["--count"],type:"int",min:1,max:200,usageLabel:"--count <n>",usageDescription:"Repeat count for press/swipe series"},{key:"fps",names:["--fps"],type:"int",min:1,max:120,usageLabel:"--fps <n>",usageDescription:"Record: target frames per second (iOS physical device runner)"},{key:"quality",names:["--quality"],type:"int",min:5,max:10,usageLabel:"--quality <5-10>",usageDescription:"Record: scale recording resolution from 5 (50%) through 10 (native resolution)"},{key:"hideTouches",names:["--hide-touches"],type:"boolean",usageLabel:"--hide-touches",usageDescription:"Record: skip touch-overlay post-processing for faster raw benchmark videos"},{key:"intervalMs",names:["--interval-ms"],type:"int",min:0,max:1e4,usageLabel:"--interval-ms <ms>",usageDescription:"Delay between press iterations"},{key:"delayMs",names:["--delay-ms"],type:"int",min:0,max:1e4,usageLabel:"--delay-ms <ms>",usageDescription:"Delay between typed characters"},{key:"holdMs",names:["--hold-ms"],type:"int",min:0,max:1e4,usageLabel:"--hold-ms <ms>",usageDescription:"Press hold duration for each iteration"},{key:"jitterPx",names:["--jitter-px"],type:"int",min:0,max:100,usageLabel:"--jitter-px <n>",usageDescription:"Deterministic coordinate jitter radius for press"},{key:"pixels",names:["--pixels"],type:"int",min:1,max:1e5,usageLabel:"--pixels <n>",usageDescription:"Scroll: explicit gesture distance in pixels"},{key:"doubleTap",names:["--double-tap"],type:"boolean",usageLabel:"--double-tap",usageDescription:"Use double-tap gesture per press iteration"},{key:"clickButton",names:["--button"],type:"enum",enumValues:["primary","secondary","middle"],usageLabel:"--button primary|secondary|middle",usageDescription:"Click: choose mouse button (middle reserved for future macOS support)"},{key:"backMode",names:["--in-app"],type:"enum",enumValues:["in-app","system"],setValue:"in-app",usageLabel:"--in-app",usageDescription:"Back: use app-provided back UI when available"},{key:"backMode",names:["--system"],type:"enum",enumValues:["in-app","system"],setValue:"system",usageLabel:"--system",usageDescription:"Back: use system back input or gesture when available"},{key:"pauseMs",names:["--pause-ms"],type:"int",min:0,max:1e4,usageLabel:"--pause-ms <ms>",usageDescription:"Delay between swipe iterations"},{key:"pattern",names:["--pattern"],type:"enum",enumValues:["one-way","ping-pong"],usageLabel:"--pattern one-way|ping-pong",usageDescription:"Swipe repeat pattern"},{key:"verbose",names:["--debug","--verbose","-v"],type:"boolean",usageLabel:"--debug, --verbose, -v",usageDescription:"Enable debug diagnostics and stream daemon/runner logs"},{key:"json",names:["--json"],type:"boolean",usageLabel:"--json",usageDescription:"JSON output"},{key:"help",names:["--help","-h"],type:"boolean",usageLabel:"--help, -h",usageDescription:"Print help and exit"},{key:"version",names:["--version","-V"],type:"boolean",usageLabel:"--version, -V",usageDescription:"Print version and exit"},{key:"snapshotDiff",names:["--diff"],type:"boolean",usageLabel:"--diff",usageDescription:"Snapshot: show structural diff against the previous session baseline"},{key:"saveScript",names:["--save-script"],type:"booleanOrString",usageLabel:"--save-script [path]",usageDescription:"Save session script (.ad) on close; optional custom output path"},{key:"networkInclude",names:["--include"],type:"enum",enumValues:["summary","headers","body","all"],usageLabel:"--include summary|headers|body|all",usageDescription:"Network: include headers, bodies, or both in output"},{key:"shutdown",names:["--shutdown"],type:"boolean",usageLabel:"--shutdown",usageDescription:"close: shutdown associated simulator/emulator after ending session"},{key:"relaunch",names:["--relaunch"],type:"boolean",usageLabel:"--relaunch",usageDescription:"open: terminate app process before launching it"},{key:"restart",names:["--restart"],type:"boolean",usageLabel:"--restart",usageDescription:"logs clear: stop active stream, clear logs, then start streaming again"},{key:"retainPaths",names:["--retain-paths"],type:"boolean",usageLabel:"--retain-paths",usageDescription:"install-from-source: keep materialized artifact paths after install"},{key:"retentionMs",names:["--retention-ms"],type:"int",min:1,usageLabel:"--retention-ms <ms>",usageDescription:"install-from-source: retention TTL for materialized artifact paths"},{key:"noRecord",names:["--no-record"],type:"boolean",usageLabel:"--no-record",usageDescription:"Do not record this action"},{key:"replayUpdate",names:["--update","-u"],type:"boolean",usageLabel:"--update, -u",usageDescription:"Replay: update selectors and rewrite replay file in place"},{key:"replayMaestro",names:["--maestro"],type:"boolean",usageLabel:"--maestro",usageDescription:"Replay: treat input as a Maestro YAML compatibility flow. Supported subset: launchApp without state-reset side effects, runFlow file/inline with when.platform, onFlowStart/onFlowComplete, deterministic repeat.times, ordered trusted runScript, tapOn, doubleTapOn, longPressOn, inputText, pasteText, openLink, assertVisible, assertNotVisible, assertTrue literal true/false, extendedWaitUntil, scroll, absolute/percentage swipe, takeScreenshot, hideKeyboard, pressKey back/enter/home, back, waitForAnimationToEnd, stopApp/killApp, setAirplaneMode, setLocation, setOrientation, supported setPermissions targets, and startRecording/stopRecording. Unsupported syntax fails loudly with a link to https://github.com/callstackincubator/agent-device/issues/558"},{key:"replayEnv",names:["-e","--env"],type:"string",multiple:!0,usageLabel:"-e KEY=VALUE, --env KEY=VALUE",usageDescription:"Replay/Test: inject or override a ${KEY} variable for the script (repeatable)"},{key:"failFast",names:["--fail-fast"],type:"boolean",usageLabel:"--fail-fast",usageDescription:"Test: stop the suite after the first failing script"},{key:"timeoutMs",names:["--timeout"],type:"int",min:1,usageLabel:"--timeout <ms>",usageDescription:"Test: maximum wall-clock time per script attempt"},{key:"retries",names:["--retries"],type:"int",min:0,max:3,usageLabel:"--retries <n>",usageDescription:"Test: retry each failed script up to n additional times"},{key:"artifactsDir",names:["--artifacts-dir"],type:"string",usageLabel:"--artifacts-dir <path>",usageDescription:"Test: root directory for suite artifacts"},{key:"reportJunit",names:["--report-junit"],type:"string",usageLabel:"--report-junit <path>",usageDescription:"Test: write a JUnit XML report for the replay suite"},{key:"steps",names:["--steps"],type:"string",usageLabel:"--steps <json>",usageDescription:"Batch: JSON array of steps"},{key:"stepsFile",names:["--steps-file"],type:"string",usageLabel:"--steps-file <path>",usageDescription:"Batch: read steps JSON from file"},{key:"batchOnError",names:["--on-error"],type:"enum",enumValues:["stop"],usageLabel:"--on-error stop",usageDescription:"Batch: stop when a step fails"},{key:"batchMaxSteps",names:["--max-steps"],type:"int",min:1,max:1e3,usageLabel:"--max-steps <n>",usageDescription:"Batch: maximum number of allowed steps"},{key:"appsFilter",names:["--all"],type:"enum",enumValues:["user-installed","all"],setValue:"all",usageLabel:"--all",usageDescription:"Apps: include system/OEM apps"},{key:"snapshotInteractiveOnly",names:["-i"],type:"boolean",usageLabel:"-i",usageDescription:"Snapshot: interactive elements only"},{key:"snapshotCompact",names:["-c"],type:"boolean",usageLabel:"-c",usageDescription:"Snapshot: compact output (drop empty structure)"},{key:"snapshotDepth",names:["--depth","-d"],type:"int",min:0,usageLabel:"--depth, -d <depth>",usageDescription:"Snapshot: limit snapshot depth"},{key:"snapshotScope",names:["--scope","-s"],type:"string",usageLabel:"--scope, -s <scope>",usageDescription:"Snapshot: scope snapshot to label/identifier"},{key:"snapshotRaw",names:["--raw"],type:"boolean",usageLabel:"--raw",usageDescription:"Snapshot: raw node output"},{key:"snapshotForceFull",names:["--force-full"],type:"boolean",usageLabel:"--force-full",usageDescription:"Snapshot: re-emit the full tree even when unchanged"},{key:"findFirst",names:["--first"],type:"boolean",usageLabel:"--first",usageDescription:"Find: pick the first match when ambiguous"},{key:"findLast",names:["--last"],type:"boolean",usageLabel:"--last",usageDescription:"Find: pick the last match when ambiguous"},{key:"out",names:["--out"],type:"string",usageLabel:"--out <path>",usageDescription:"Output path"},{key:"overlayRefs",names:["--overlay-refs"],type:"boolean",usageLabel:"--overlay-refs",usageDescription:"Screenshot: draw current snapshot refs and target rectangles onto the saved PNG; diff screenshot: also write a separate current-screen overlay guide"},...u,{key:"baseline",names:["--baseline","-b"],type:"string",usageLabel:"--baseline, -b <path>",usageDescription:"Diff screenshot: path to baseline image file"},{key:"threshold",names:["--threshold"],type:"string",usageLabel:"--threshold <0-1>",usageDescription:"Diff screenshot: color distance threshold (default 0.1)"}],n0=new Set(["json","config","remoteConfig","stateDir","daemonBaseUrl","daemonAuthToken","daemonTransport","daemonServerMode","tenant","sessionIsolation","runId","leaseId","leaseBackend","sessionLock","sessionLocked","sessionLockConflicts","help","version","verbose","platform","target","device","udid","serial","iosSimulatorDeviceSet","androidDeviceAllowlist","session","noRecord"]),n1=new Map;for(let e of nQ)for(let t of e.names)n1.set(t,e);function n2(e){return n1.get(e)}function n5(){return nQ}let n4={auth:{usageOverride:"auth status|login|logout",listUsageOverride:"auth status|login|logout",helpDescription:"Manage cloud CLI authentication",summary:"Manage cloud authentication",positionalArgs:["status|login|logout"]},connect:{usageOverride:"connect [--remote-config <path>] [--tenant <id>] [--run-id <id>] [--lease-backend <backend>] [--force] [--no-login]",helpDescription:"Connect to a remote daemon, authenticate when needed, and save remote session state. AGENT_DEVICE_CLOUD_BASE_URL is the bridge/control-plane API origin; use AGENT_DEVICE_DAEMON_AUTH_TOKEN=adc_live_... for CI/service-token automation.",summary:"Connect to remote daemon",allowedFlags:["force","noLogin",...nz,"launchUrl"]},connection:{usageOverride:"connection status",listUsageOverride:"connection status",helpDescription:"Inspect active remote connection state",summary:"Inspect remote connection",positionalArgs:["status"]},disconnect:{helpDescription:"Disconnect remote daemon state, stop owned Metro companion, and release lease",summary:"Disconnect remote daemon",allowedFlags:["shutdown"]},mcp:{helpDescription:"Start the official stdio MCP server. It exposes structured command tools backed by the agent-device client.",summary:"Start MCP server"},"react-devtools":{usageOverride:"react-devtools [...args]",listUsageOverride:"react-devtools [...args]",helpDescription:"Run pinned agent-react-devtools commands for React Native performance profiling, component trees, props/state/hooks, and render analysis",summary:"Profile React Native performance and component renders",positionalArgs:["args?"],allowsExtraPositionals:!0}},n3={boot:{summary:"Boot target device/simulator",allowedFlags:["headless"]},open:{helpDescription:"Boot device/simulator; optionally launch app or deep link URL (macOS also supports --surface app|frontmost-app|desktop|menubar)",summary:"Open an app, deep link or URL, save replays",positionalArgs:["appOrUrl?","url?"],allowedFlags:["activity","launchConsole","saveScript","relaunch","surface"]},close:{positionalArgs:["app?"],allowedFlags:["saveScript","shutdown"]},reinstall:{positionalArgs:["app","path"]},install:{positionalArgs:["app","path"]},"install-from-source":{usageOverride:"install-from-source <url> | install-from-source --github-actions-artifact <owner/repo:artifact>",listUsageOverride:"install-from-source <url> | install-from-source --github-actions-artifact",helpDescription:"Install app from a URL or remote-resolved source",summary:"Install app from a source",positionalArgs:["url?"],allowedFlags:["header","githubActionsArtifact","installSource","retainPaths","retentionMs"]},apps:{helpDescription:"List user-installed apps; use --all to include system/OEM apps",summary:"List installed apps",allowedFlags:["appsFilter"],defaults:{appsFilter:_}},push:{positionalArgs:["bundleOrPackage","payloadOrJson"]},snapshot:{usageOverride:"snapshot [--diff] [-i] [-c] [-d <depth>] [-s <scope>] [--raw] [--force-full]",helpDescription:"Capture accessibility tree or diff against the previous session baseline",allowedFlags:["snapshotDiff",...nK,"snapshotForceFull"]},diff:{usageOverride:"diff snapshot | diff screenshot --baseline <path> [current.png] [--out <diff.png>] [--threshold <0-1>] [--overlay-refs]",helpDescription:"Diff accessibility snapshot or compare screenshots pixel-by-pixel",summary:"Diff snapshot or screenshot",positionalArgs:["kind","current?"],allowedFlags:[...nK,"baseline","threshold","out","overlayRefs"]},screenshot:{helpDescription:"Capture screenshot (macOS app sessions default to the app window; use --fullscreen for full desktop, --max-size to downscale, --overlay-refs to annotate current refs, or --no-stabilize for low-latency Android capture loops)",positionalArgs:["path?"],allowedFlags:d},appstate:{helpDescription:"Show foreground app/activity"},metro:{usageOverride:"metro prepare (--public-base-url <url> | --proxy-base-url <url>) [--project-root <path>] [--port <port>] [--kind auto|react-native|expo]\n agent-device metro reload [--metro-host <host>] [--metro-port <port>] [--bundle-url <url>]",listUsageOverride:"metro prepare --public-base-url <url> | --proxy-base-url <url>; metro reload",helpDescription:"Prepare a local Metro runtime or ask Metro to reload connected React Native apps",summary:"Prepare Metro or reload apps",positionalArgs:["prepare|reload"],allowedFlags:[...nJ,...nz]},clipboard:{usageOverride:"clipboard read | clipboard write <text>",listUsageOverride:"clipboard read | clipboard write <text>",helpDescription:"Read or write device clipboard text",positionalArgs:["read|write","text?"],allowsExtraPositionals:!0},keyboard:{usageOverride:"keyboard [status|get|dismiss|enter|return]",helpDescription:"Inspect Android keyboard visibility/type or press/dismiss the device keyboard",summary:"Inspect, press, or dismiss the device keyboard",positionalArgs:["action?"]},back:{usageOverride:"back [--in-app|--system]",allowedFlags:["backMode"]},rotate:{usageOverride:"rotate <portrait|portrait-upside-down|landscape-left|landscape-right>",helpDescription:"Rotate device orientation on iOS and Android",positionalArgs:["orientation"]},wait:{usageOverride:"wait <ms>|text <text>|@ref|<selector> [timeoutMs]",positionalArgs:["durationOrSelector","timeoutMs?"],allowsExtraPositionals:!0,allowedFlags:[...nH]},get:{usageOverride:"get text|attrs <@ref|selector>",positionalArgs:["subcommand","target"],allowedFlags:[...nH]},find:{usageOverride:"find <locator|text> <action> [value] [--first|--last]",helpDescription:"Find by text/label/value/role/id and run action",summary:"Find an element and act",positionalArgs:["query","action","value?"],allowsExtraPositionals:!0,allowedFlags:["snapshotDepth","snapshotRaw","findFirst","findLast"]},is:{positionalArgs:["predicate","selector","value?"],allowsExtraPositionals:!0,allowedFlags:[...nH]},alert:{usageOverride:"alert [get|accept|dismiss|wait] [timeout]",positionalArgs:["action?","timeout?"]},click:{usageOverride:"click <x y|@ref|selector>",positionalArgs:["target"],allowsExtraPositionals:!0,allowedFlags:[...nW,"clickButton",...nH]},replay:{positionalArgs:["path"],allowedFlags:["replayMaestro",...nZ,"timeoutMs"]},test:{usageOverride:"test <path-or-glob>...",listUsageOverride:"test <path-or-glob>...",helpDescription:"Run one or more replay scripts as a serial test suite",summary:"Run replay test suites",positionalArgs:["pathOrGlob"],allowsExtraPositionals:!0,allowedFlags:["replayMaestro",...nZ,"failFast","timeoutMs","retries","artifactsDir","reportJunit"]},batch:{usageOverride:"batch [--steps <json> | --steps-file <path>]",listUsageOverride:"batch --steps <json> | --steps-file <path>",helpDescription:"Execute multiple commands in one daemon request",summary:"Run multiple commands",allowedFlags:["steps","stepsFile","batchOnError","batchMaxSteps","out"]},press:{usageOverride:"press <x y|@ref|selector>",positionalArgs:["targetOrX","y?"],allowsExtraPositionals:!0,allowedFlags:[...nW,...nH]},longpress:{usageOverride:"longpress <x y|@ref|selector> [durationMs]",positionalArgs:["targetOrX","yOrDurationMs?","durationMs?"],allowsExtraPositionals:!0,allowedFlags:[...nH]},swipe:{helpDescription:"Swipe coordinates with optional repeat pattern",positionalArgs:["x1","y1","x2","y2","durationMs?"],allowedFlags:["count","pauseMs","pattern"]},gesture:{usageOverride:"gesture <pan|fling|pinch|rotate|transform> ...",listUsageOverride:"gesture <pan|fling|pinch|rotate|transform> ...",helpDescription:"Run touch gestures: pan <x> <y> <dx> <dy> [durationMs], fling <up|down|left|right> <x> <y> [distance] [durationMs], pinch <scale> [x] [y], rotate <degrees> [x] [y] [velocity], or transform <x> <y> <dx> <dy> <scale> <degrees> [durationMs]",summary:"Run pan, fling, pinch, rotate, or transform gestures",positionalArgs:["pan|fling|pinch|rotate|transform","args?"],allowsExtraPositionals:!0},focus:{positionalArgs:["x","y"]},type:{positionalArgs:["text"],allowsExtraPositionals:!0,allowedFlags:["delayMs"]},fill:{usageOverride:"fill <x> <y> <text> | fill <@ref|selector> <text>",positionalArgs:["targetOrX","yOrText","text?"],allowsExtraPositionals:!0,allowedFlags:[...nH,"delayMs"]},scroll:{usageOverride:"scroll <direction|top|bottom> [amount] [--pixels <n>]",helpDescription:"Scroll in direction, or verify hidden content and scroll toward top/bottom",summary:"Scroll in a direction or to an edge",positionalArgs:["directionOrEdge","amount?"],allowedFlags:["pixels"]},"trigger-app-event":{usageOverride:"trigger-app-event <event> [payloadJson]",positionalArgs:["event","payloadJson?"]},record:{usageOverride:"record start [path] [--fps <n>] [--quality <5-10>] [--hide-touches] | record stop",listUsageOverride:"record start [path] | record stop",helpDescription:"Start/stop screen recording",summary:"Start or stop screen recording",positionalArgs:["start|stop","path?"],allowedFlags:["fps","quality","hideTouches"]},"react-native":{usageOverride:"react-native dismiss-overlay",listUsageOverride:"react-native dismiss-overlay",positionalArgs:["dismiss-overlay"]},trace:{usageOverride:"trace start <path> | trace stop <path>",listUsageOverride:"trace start <path> | trace stop <path>",helpDescription:"Start/stop trace log capture; when an artifact path is requested, pass the same positional path to start and stop",summary:"Start or stop trace capture",positionalArgs:["start|stop","path?"]},logs:{usageOverride:"logs path | logs start | logs stop | logs clear [--restart] | logs doctor | logs mark [message...]",helpDescription:"Session app log info, start/stop streaming, diagnostics, and markers",summary:"Manage session app logs",positionalArgs:["path|start|stop|clear|doctor|mark","message?"],allowsExtraPositionals:!0,allowedFlags:["restart"]},network:{usageOverride:"network dump [limit] [summary|headers|body|all] [--include summary|headers|body|all] | network log [limit] [summary|headers|body|all] [--include summary|headers|body|all]",helpDescription:"Dump recent HTTP(s) traffic parsed from the session app log",summary:"Show recent HTTP traffic",positionalArgs:["dump|log","limit?","include?"],allowedFlags:["networkInclude"]},settings:{usageOverride:ec,listUsageOverride:"settings [area] [options]",helpDescription:"Toggle OS settings, animation scales, appearance, and app permissions (macOS supports only settings appearance <light|dark|toggle> and settings permission <grant|reset> <accessibility|screen-recording|input-monitoring>; wifi|airplane|location|animations remain unsupported on macOS; mobile permission actions use the active session app)",summary:"Change OS settings and app permissions",positionalArgs:["setting","state","target?","mode?"]},session:{usageOverride:"session list",positionalArgs:["list?"]}},n8=new Map(C().map(e=>[e.name,{helpDescription:e.description}]));function n6(e){if(e)return n7(e)}function n9(e){let t=n7(e);if(!t)throw Error(`Missing command schema for ${e}`);return t}function n7(e){let t=Object.hasOwn(n4,e)?n4[e]:void 0;if(t)return t;let a=n8.get(e),n=Object.hasOwn(n3,e)?n3[e]:void 0;if(a)return n?{...a,...n}:a}function re(e,t){let a=n6(e);if(!a?.defaults)return!1;let n=!1;for(let[e,r]of Object.entries(a.defaults))void 0===t[e]&&(t[e]=r,n=!0);return n}export{n0 as GLOBAL_FLAG_KEYS,eu as SETTINGS_INVALID_ARGS_MESSAGE,re as applyCommandDefaults,X as buildMobileSnapshotPresentation,ty as buildSnapshotDisplayLines,eg as captureScrollEdgeState,nV as createAgentDevice,eR as decodePng,Y as deriveMobileSnapshotHiddenContentHints,tN as detectReactNativeOverlay,j as displayNodeLabel,tH as evaluateIsPredicate,ef as findMistargetedTypeRefToken,ew as formatScrollEdgeMessage,tk as formatSnapshotLine,n9 as getCliCommandSchema,n6 as getCommandSchema,n2 as getFlagDefinition,n5 as getFlagDefinitions,ep as getUnsupportedMacOsSettingMessage,V as inferVerticalScrollIndicatorDirections,em as isKeyboardAction,ed as isMacOsSettingSupported,eI as isReactNativeCollapsedWarningLabel,tK as isSupportedPredicate,B as isSystemScrollIndicatorLabel,nG as localCommandPolicy,q as normalizeSnapshotTree,nX as parseSessionSurface,eD as requireIntInRange,as as resolveActionableTouchNode,ao as resolveActionableTouchResolution,tO as resolveReactNativeOverlayDismissTarget,an as resolveRectCenter,eb as runScrollEdgePasses};
|
|
1
|
+
import{promises as e}from"node:fs";import{deflateSync as t,inflateSync as n}from"node:zlib";import a from"node:path";import{normalizeRef as r,centerOfRect as i,buildSnapshotPresentationKey as s,findNodeByRef as o}from"./4057.js";import{isScrollableNodeLike as l}from"./2842.js";import{asAppError as u,AppError as c}from"./9152.js";import{SCREENSHOT_SPECIFIC_FLAG_DEFINITIONS as d,SCREENSHOT_COMMAND_FLAG_KEYS as p,successText as h}from"./6277.js";import{whichCmd as f,runCmd as m}from"./9818.js";import{trimText as g,extractNodeText as w,parseSelectorChain as b,isNodeVisible as y,isNodeEditable as v,buildTextPreview as k,findNearestHittableAncestor as x,buildSelectorChainForNode as A,findSelectorChainMatch as D,resolveSelectorChain as M,findNodeByLabel as I,resolveRefLabel as N,describeTextSurface as S,extractReadableText as R,formatSelectorFailure as P,normalizeType as O,isFillableType as L}from"./940.js";import{findBestMatchesByLocator as E}from"./7556.js";import"./7847.js";import{resolveAppsFilter as T,DEFAULT_APPS_FILTER as _,assertResolvedAppsFilter as $}from"./3622.js";import{listCommandDefinitions as C}from"./89.js";function U(e,t,n){return t>=e.x&&t<=e.x+e.width&&n>=e.y&&n<=e.y+e.height}function F(e){let t=null,n=-1;for(let a of e){let e=a.width*a.height;e>n&&(t=a,n=e)}return t}function B(e,t,n,a){return Math.max(e,n)<=Math.min(t,a)}function G(e){let t=e.trim().toLowerCase();return!!t&&/^(vertical|horizontal)\s+scroll\s+bar(?:,?\s*\d+\s+pages?)?$/.test(t)}function V(e,t){if(!(e?.trim().toLowerCase()??"").includes("vertical scroll bar"))return null;let n=function(e){if(!e)return null;let t=/^(\d{1,3})%$/.exec(e.trim());if(!t)return null;let n=Number(t[1]);return Number.isFinite(n)?Math.max(0,Math.min(100,n)):null}(t);return null===n?null:n<=1?{above:!1,below:!0}:n>=99?{above:!0,below:!1}:{above:!0,below:!0}}function q(e){let t=new Map;for(let[n,a]of e.entries())t.set(a.index,n);let n=[],a=[];for(let[r,i]of e.entries()){let e=Math.max(0,i.depth??0);for(;a.length>0&&e<=a[a.length-1].depth;)a.pop();let s="number"==typeof i.parentIndex?t.get(i.parentIndex):void 0,o="number"==typeof s&&s<r?s:a[a.length-1]?.index;n.push({...i,index:r,depth:e,parentIndex:o}),a.push({depth:e,index:r})}return n}function j(e){return new Map(e.map(e=>[e.index,e]))}function X(e){return e.label?.trim()||e.value?.trim()||e.identifier?.trim()||""}function Y(e){if(0===e.length)return{nodes:e,hiddenCount:0,summaryLines:[]};let{byIndex:t,visibleNodeIndexes:n,offscreenNodes:a,hintedContainers:r}=K(e),i=0===n.size?e:e.filter(e=>n.has(e.index));return{nodes:i.map(e=>(function(e,t){let n=t.get(e.index);if(!n||0===n.size)return e;let a=!!(!0===e.hiddenContentAbove||n.has("above"))||void 0,r=!!(!0===e.hiddenContentBelow||n.has("below"))||void 0;return{...e,hiddenContentAbove:a,hiddenContentBelow:r}})(e,r.directionsByContainer)),hiddenCount:0===n.size?0:e.length-i.length,summaryLines:function(e,t,n){let a=new Map;for(let r of e){let e=function(e,t,n){if(!e.rect)return null;let a=J(e,t,n);return a?W(e.rect,a):null}(r,t,n);if(!e)continue;let i=a.get(e)??[];i.push(r),a.set(e,i)}return["above","below"].flatMap(e=>{let t=a.get(e);if(!t||0===t.length)return[];let n=(function(e){let t=new Set,n=[];for(let a of e){let e=X(a);!e||t.has(e)||(t.add(e),n.push(e))}return n})(t).slice(0,3).map(e=>`"${e}"`),r=1===t.length?"interactive item":"interactive items",i=n.length>0?`: ${n.join(", ")}`:"";return[`[off-screen ${e}] ${t.length} ${r}${i}`]})}(a.filter(e=>!r.coveredNodeIndexes.has(e.index)&&function(e){if(!0===e.hittable)return!0;let t=(e.type??"").toLowerCase();return t.includes("button")||t.includes("link")||t.includes("textfield")||t.includes("edittext")||t.includes("searchfield")||t.includes("checkbox")||t.includes("radio")||t.includes("switch")||t.includes("menuitem")||!!X(e)}(e)),e,t)}}function H(e){if(0===e.length)return new Map;let{hintedContainers:t}=K(e);var n=t.directionsByContainer;let a=new Map;for(let[e,t]of n){let n={};t.has("above")&&(n.hiddenContentAbove=!0),t.has("below")&&(n.hiddenContentBelow=!0),(n.hiddenContentAbove||n.hiddenContentBelow)&&a.set(e,n)}return a}function K(e){let t=j(e),n=new Set,a=[];for(let r of e){if(z(r,e,t)){!function(e,t,n){let a=e,r=new Set;for(;a&&!r.has(a.index);)r.add(a.index),t.add(a.index),a="number"==typeof a.parentIndex?n.get(a.parentIndex):void 0}(r,n,t);continue}a.push(r)}let r=function(e,t,n,a){let r=new Map,i=new Map,s=new Set;for(let e of t){if(!e.rect)continue;let t=Z(e,n,a);if(!t?.rect)continue;let o=W(e.rect,t.rect);if(!o)continue;let l=r.get(t.index)??new Set;l.add(o),r.set(t.index,l);let u=i.get(t.index)??new Set;u.add(o),i.set(t.index,u),s.add(e.index)}return function(e,t,n,a,r){for(let i of e){let e=function(e){let t=V(e.label,e.value);if(!t)return null;let n=new Set;return t.above&&n.add("above"),t.below&&n.add("below"),n.size>0?n:null}(i);if(!e||0===e.size)continue;let s=Z(i,t,n);if(!s)continue;let o=a.get(s.index)??new Set,l=r.get(s.index);for(let t of e)(!l||!(l.size>0)||l.has(t))&&o.add(t);a.set(s.index,o)}}(e,n,a,r,i),{directionsByContainer:r,coveredNodeIndexes:s}}(e,a,n,t);return{byIndex:t,visibleNodeIndexes:n,offscreenNodes:a,hintedContainers:r}}function z(e,t,n=j(t)){var a;if(!e.rect)return!0;let r=J(e,t,n);return!r||(a=e.rect,B(a.x,a.x+a.width,r.x,r.x+r.width)&&B(a.y,a.y+a.height,r.y,r.y+r.height))}function J(e,t,n=j(t)){var a,r;let s=(a=e,r=n,Q(a,r,e=>!!e.rect)?.rect??null);return s||function(e,t){let n=i(t),a=e.filter(e=>{var t;return!!(t=e.rect)&&Number.isFinite(t.x)&&Number.isFinite(t.y)&&Number.isFinite(t.width)&&Number.isFinite(t.height)}),r=a.filter(e=>{let t=(e.type??"").toLowerCase();return t.includes("application")||t.includes("window")}),s=F(r.map(e=>e.rect).filter(e=>U(e,n.x,n.y)));if(s)return s;let o=F(r.map(e=>e.rect));if(o)return o;let l=F(a.map(e=>e.rect).filter(e=>U(e,n.x,n.y)));return l||null}(t,e.rect??{x:0,y:0,width:0,height:0})}function W(e,t){return e.y+e.height<=t.y?"above":e.y>=t.y+t.height?"below":null}function Z(e,t,n){return Q(e,n,e=>t.has(e.index))}function Q(e,t,n){let a="number"==typeof e.parentIndex?t.get(e.parentIndex):void 0,r=new Set;for(;a&&!r.has(a.index);){if(r.add(a.index),n(a)&&l(a))return a;a="number"==typeof a.parentIndex?t.get(a.parentIndex):void 0}return null}let ee="<wifi|airplane|location> <on|off>",et="location set <lat> <lon>",en="animations <on|off>",ea="appearance <light|dark|toggle>",er="faceid <match|nonmatch|enroll|unenroll>",ei="touchid <match|nonmatch|enroll|unenroll>",es="fingerprint <match|nonmatch>",eo="permission <grant|deny|reset> <camera|microphone|photos|contacts|contacts-limited|notifications|calendar|location|location-always|media-library|motion|reminders|siri> [full|limited]",el="permission <grant|reset> <accessibility|screen-recording|input-monitoring>",eu=`macOS supports only settings ${ea} and settings ${el}. wifi|airplane|location|animations remain unsupported on macOS.`,ec=`settings ${ee} | settings ${et} | settings ${en} | settings ${ea} | settings ${er} | settings ${ei} | settings ${es} | settings ${eo} | settings ${el}`,ed=`settings requires ${ee}, ${et}, ${en}, ${ea}, ${er}, ${ei}, ${es}, ${eo}, or ${el}`;function ep(e){let t=e.trim().toLowerCase();return"appearance"===t||"permission"===t}function eh(e){return`Unsupported macOS setting: ${e}. ${eu}`}let ef=["status","get","dismiss","enter","return"];function em(e){return ef.includes(e)}function eg(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}async function ew(e){let{edge:t,target:n={},scope:a,captureNodes:r}=e;try{let e=await r(a),i=function(e,t,n={}){var a,r,i;let s,o=(e??[]).map((e,t)=>({...e,ref:"ref"in e&&e.ref?e.ref:`e${t+1}`}));if(0===o.length)return{canScroll:!1,emptySnapshot:!0,signature:""};let u=H(o),c=function(e,t,n,a){let r=new Map(e.map(e=>[e.index,e])),i=e.filter(e=>l(e)&&eM(e.rect));if(0===i.length)return null;let s=function(e,t){if(void 0===e)return null;let n=t.get(e);for(;n;){if(l(n)&&eM(n.rect))return n;n=void 0===n.parentIndex?void 0:t.get(n.parentIndex)}return null}(a.nodeIndex,r);if(s)return s;let o=a.point;if(o){let e=i.filter(e=>{var t,n;return e.rect&&(t=e.rect,(n=o).x>=t.x&&n.x<=t.x+t.width&&n.y>=t.y&&n.y<=t.y+t.height)}).sort(ex);if(e.length>0)return e.find(e=>ev(e,t.get(e.index),n))??e[0]??null}let u=i.filter(e=>ev(e,t.get(e.index),n)).sort(eA);return u.length>0?u[0]??null:i.filter(t=>z(t,e)).sort(eA)[0]??i.sort(eA)[0]??null}(o,u,t,n),d=(c?(a=o,r=c.index,s=new Map(a.map(e=>[e.index,e])),a.filter(e=>e.index===r||function(e,t,n){let a=void 0===e.parentIndex?void 0:n.get(e.parentIndex);for(;a;){if(a.index===t)return!0;a=void 0===a.parentIndex?void 0:n.get(a.parentIndex)}return!1}(e,r,s))):o).map(e=>{let t=e.rect?["x","y","width","height"].map(t=>{var n;return n=e.rect?.[t],"number"==typeof n&&Number.isFinite(n)?n.toFixed(1):""}).join(","):"";return[String(e.index??""),String(e.parentIndex??""),String(e.type??""),String(e.label??""),String(e.value??""),t].join("|")}).join("\n");return c?{canScroll:ev(c,u.get(c.index),t),emptySnapshot:!1,signature:d,scope:[(i=c).identifier,i.label,i.value].map(e=>"string"==typeof e?e.trim():"").find(ek)}:{canScroll:!1,emptySnapshot:!1,signature:d}}(e,t,n);if(a&&i.emptySnapshot)return await ew({edge:t,target:n,captureNodes:r});return i}catch(e){var i,s,o;throw i=t,s=a,o=e,s?new c("COMMAND_FAILED",`Failed to verify scroll ${i} state for scoped container`,{scope:s,hint:`scroll ${i} could not verify the scoped scroll container. Run snapshot -i -c for the current screen and retry with a visible scroll target.`},o):new c("COMMAND_FAILED",`Failed to verify scroll ${i} state`,{hint:`scroll ${i} needs a snapshot showing hidden content ${"bottom"===i?"below":"above"} before it will move.`},o)}}async function eb(e){let t,{edge:n,captureState:a,scroll:r}=e,i=await a();i.scope&&(i=await a(i.scope));let s=0;for(;i.canScroll;){if(s>=40)throw new c("COMMAND_FAILED",`scroll ${n} reached the safety limit before the snapshot showed the edge`,{hint:"The scoped scroll container still reports hidden content. Use a smaller manual scroll + snapshot loop to inspect the current state."});t=await r(),s+=1,i=await a(i.scope)}return{passes:s,result:t}}function ey(e,t,n,a,r){return t&&0===n?`Already at ${t}; no hidden content ${"bottom"===t?"below":"above"} detected`:t?`Scrolled to ${t} with ${n} ${e} passes`:void 0!==r?`Scrolled ${e} by ${r}px`:void 0!==a?`Scrolled ${e} by ${a}`:`Scrolled ${e}`}function ev(e,t,n){return"bottom"===n?!0===e.hiddenContentBelow||t?.hiddenContentBelow===!0:!0===e.hiddenContentAbove||t?.hiddenContentAbove===!0}function ek(e){return e.length>0&&e.length<=80&&!/^(true|false)$/i.test(e)&&!/^\d+$/.test(e)&&!/^\d+%$/.test(e)}function ex(e,t){return eD(e.rect)-eD(t.rect)}function eA(e,t){return eD(t.rect)-eD(e.rect)}function eD(e){return e?e.width*e.height:0}function eM(e){return!!(e&&e.width>0&&e.height>0)}function eI(e,t,n,a){if(!Number.isFinite(e)||!Number.isInteger(e)||e<n||e>a)throw new c("INVALID_ARGS",`${t} must be an integer between ${n} and ${a}`);return e}function eN(e){let t=e?.trim().toLowerCase();return!!t&&(t.includes("open debugger to view warnings")||/^!,\s+/.test(t)||/^(warn|warning|error):\s+/.test(t)||/\b(?:possible\s+)?unhandled (?:promise )?rejection\b/.test(t)||t.includes("getsnapshot should be cached to avoid an infinite loop")||t.includes('unique "key" prop')||t.includes("unique 'key' prop")||t.includes("virtualizedlists should never be nested")||t.includes("failed prop type"))}function eS(e){return e.includes("open debugger to view warnings")||/^!,\s+open debugger\b/.test(e)}let eR=Buffer.from([137,80,78,71,13,10,26,10]),eP=new Map([[0,1],[2,3],[3,1],[4,2],[6,4]]),eO=new Map([[0,new Set([1,2,4,8,16])],[2,new Set([8,16])],[3,new Set([1,2,4,8])],[4,new Set([8,16])],[6,new Set([8,16])]]),eL=[{x:0,y:0,dx:8,dy:8},{x:4,y:0,dx:8,dy:8},{x:0,y:4,dx:4,dy:8},{x:2,y:0,dx:4,dy:4},{x:0,y:2,dx:2,dy:4},{x:1,y:0,dx:2,dy:2},{x:0,y:1,dx:1,dy:2}];class eE{width;height;data;static sync={read:eT,write:e_};constructor(e){this.width=ej(e.width,"width"),this.height=ej(e.height,"height");let t=this.width*this.height*4;if(this.data=e.data?Buffer.from(e.data):Buffer.alloc(t),this.data.length!==t)throw Error(`PNG data length must be ${t} bytes`)}}function eT(e){var t;let{metadata:a,idatChunks:r}=function(e){let t,n=[];for(let a of function*(e){if(!e.subarray(0,eR.length).equals(eR))throw Error("Invalid PNG signature");let t=eR.length;for(;t<e.length;){if(t+12>e.length)throw Error("Truncated PNG chunk");let n=e.readUInt32BE(t),a=e.toString("ascii",t+4,t+8),r=t+8,i=r+n;if(i+4>e.length)throw Error(`Truncated PNG ${a} chunk`);let s=e.subarray(r,i),o=e.readUInt32BE(i);if(eq(e.subarray(t+4,i))!==o)throw Error(`Invalid PNG ${a} chunk CRC`);t=i+4,yield{type:a,data:s}}}(e))if("IHDR"===a.type?t=function(e){var t;if(13!==e.length)throw Error("Invalid PNG IHDR length");let n=e.readUInt32BE(0),a=e.readUInt32BE(4),r=e[8],i=e[9],s=e[10],o=e[11],l=e[12];if(t=i,!eP.has(t))throw Error(`Unsupported PNG color type ${i}`);let u=eO.get(i);if(!u?.has(r))throw Error(`Unsupported PNG color type ${i} with bit depth ${r}`);if(0!==s)throw Error(`Unsupported PNG compression method ${s}`);if(0!==o)throw Error(`Unsupported PNG filter method ${o}`);if(0!==l&&1!==l)throw Error(`Unsupported PNG interlace method ${l}`);return{width:ej(n,"width"),height:ej(a,"height"),bitDepth:r,colorType:i,interlace:l}}(a.data):"IDAT"===a.type?n.push(Buffer.from(a.data)):t=function(e,t){if("PLTE"===e.type){if(!t)throw Error("PNG PLTE appeared before IHDR");t.palette=Buffer.from(e.data)}else if("tRNS"===e.type){if(!t)throw Error("PNG tRNS appeared before IHDR");t.transparency=Buffer.from(e.data)}return t}(a,t),"IEND"===a.type)break;return{metadata:t,idatChunks:n}}(e);if(!a)throw Error("PNG is missing IHDR");if(0===r.length)throw Error("PNG is missing IDAT");let i=function(e,t){let a=function(e){if(0===e.interlace)return function(e,t){return(eB(e)+1)*t}(e,e.height);let t=0;for(let n of eL){let a=eC(e.width,n.x,n.dx),r=eC(e.height,n.y,n.dy);0!==a&&0!==r&&(t+=function(e,t){return(eB(e)+1)*t}({...e,width:a,height:r},r))}return t}(t);try{let t=n(Buffer.concat(e),{maxOutputLength:a});if(t.length!==a)throw Error("PNG pixel data is truncated");return t}catch(e){var r;if((r=e)instanceof Error&&"code"in r&&"ERR_BUFFER_TOO_LARGE"===r.code)throw Error(`PNG pixel data exceeds expected length ${a}`);throw e}}(r,a);return new eE({width:a.width,height:a.height,data:1===a.interlace?function(e,t){let n=Buffer.alloc(t.width*t.height*4),a=0;for(let r of eL){let i=eC(t.width,r.x,r.dx),s=eC(t.height,r.y,r.dy);if(0===i||0===s)continue;let o={...t,width:i,height:s,interlace:0},l=e$({inflated:e,offset:a,scanlineLength:eB(o),height:s,bytesPerPixel:eG(o)});a=l.offset;let u=eB(o);for(let e=0;e<s;e+=1){let a=l.raw.subarray(e*u,(e+1)*u);for(let s=0;s<i;s+=1){let i=r.x+s*r.dx,l=((r.y+e*r.dy)*t.width+i)*4,[u,c,d,p]=eU(a,s,o);n[l]=u,n[l+1]=c,n[l+2]=d,n[l+3]=p}}}return n}(i,a):function(e,t){let n=Buffer.alloc(t.width*t.height*4),a=eB(t);for(let r=0;r<t.height;r+=1){let i=e.subarray(r*a,(r+1)*a);for(let e=0;e<t.width;e+=1){let a=(r*t.width+e)*4,[s,o,l,u]=eU(i,e,t);n[a]=s,n[a+1]=o,n[a+2]=l,n[a+3]=u}}return n}(e$({inflated:i,offset:0,scanlineLength:eB(t=a),height:t.height,bytesPerPixel:eG(t)}).raw,a)})}function e_(e){let n=4*e.width,a=Buffer.alloc((n+1)*e.height);for(let t=0;t<e.height;t+=1){let r=t*(n+1);a[r]=0,e.data.copy(a,r+1,t*n,(t+1)*n)}let r=Buffer.alloc(13);return r.writeUInt32BE(e.width,0),r.writeUInt32BE(e.height,4),r[8]=8,r[9]=6,r[10]=0,r[11]=0,r[12]=0,Buffer.concat([eR,eV("IHDR",r),eV("IDAT",t(a)),eV("IEND",Buffer.alloc(0))])}function e$(e){let{inflated:t,offset:n,scanlineLength:a,height:r,bytesPerPixel:i}=e,s=n+(a+1)*r;if(t.length<s)throw Error("PNG pixel data is truncated");let o=Buffer.alloc(a*r);for(let e=0;e<r;e+=1){let r=n+e*(a+1),s=e*a,l=t[r];for(let n=0;n<a;n+=1){let u=t[r+1+n],c=n>=i?o[s+n-i]:0,d=e>0?o[s+n-a]:0,p=e>0&&n>=i?o[s+n-a-i]:0;o[s+n]=function(e,t,n,a,r){if(0===e)return t;if(1===e)return t+n&255;if(2===e)return t+a&255;if(3===e)return t+Math.floor((n+a)/2)&255;if(4===e)return t+function(e,t,n){let a=e+t-n,r=Math.abs(a-e),i=Math.abs(a-t),s=Math.abs(a-n);return r<=i&&r<=s?e:i<=s?t:n}(n,a,r)&255;throw Error(`Unsupported PNG filter type ${e}`)}(l,u,c,d,p)}}return{raw:o,offset:s}}function eC(e,t,n){return e<=t?0:Math.floor((e-t+n-1)/n)}function eU(e,t,n){if(3===n.colorType){var a,r,i,s,o,l,u,c=e,d=t,p=n;if(!p.palette)throw Error("Indexed PNG is missing PLTE");let h=eF(c,d,p.bitDepth),f=3*h;if(f+2>=p.palette.length)throw Error("Indexed PNG palette is invalid");return[p.palette[f],p.palette[f+1],p.palette[f+2],p.transparency?.[h]??255]}if(n.bitDepth<8){let r,i;return[i=Math.round((r=eF(e,t,(a=n).bitDepth))/((1<<a.bitDepth)-1)*255),i,i,255*!(a.transparency&&a.transparency.length>=2&&r===a.transparency.readUInt16BE(0))]}let h=16===n.bitDepth?2:1,f=t*eP.get(n.colorType)*h,m=t=>16===n.bitDepth?e.readUInt16BE(f+2*t):e[f+t*h],g=e=>{var t;return t=m(e),16===n.bitDepth?Math.round(t/65535*255):t};if(0===n.colorType){let e=g(0);return[e,e,e,255*(r=m(0),!(i=n).transparency||!!(i.transparency.length<2)||r!==i.transparency.readUInt16BE(0))]}if(2===n.colorType){return[g(0),g(1),g(2),255*(s=m(0),o=m(1),l=m(2),!(u=n).transparency||!!(u.transparency.length<6)||s!==u.transparency.readUInt16BE(0)||o!==u.transparency.readUInt16BE(2)||l!==u.transparency.readUInt16BE(4))]}if(4===n.colorType){let e=g(0);return[e,e,e,g(1)]}return[g(0),g(1),g(2),g(3)]}function eF(e,t,n){let a=t*n;return e[Math.floor(a/8)]>>8-n-a%8&(1<<n)-1}function eB(e){let t=eP.get(e.colorType);return Math.ceil(e.width*t*e.bitDepth/8)}function eG(e){return Math.max(1,Math.ceil(eP.get(e.colorType)*e.bitDepth/8))}function eV(e,t){let n=Buffer.from(e,"ascii"),a=Buffer.alloc(8+t.length+4);return a.writeUInt32BE(t.length,0),n.copy(a,4),t.copy(a,8),a.writeUInt32BE(eq(Buffer.concat([n,t])),8+t.length),a}function eq(e){let t=0xffffffff;for(let n of e){t^=n;for(let e=0;e<8;e+=1)t=1&t?0xedb88320^t>>>1:t>>>1}return(0xffffffff^t)>>>0}function ej(e,t){if(!Number.isInteger(e)||e<1)throw Error(`PNG ${t} must be positive`);return e}function eX(e,t){try{return eE.sync.read(e)}catch(e){throw new c("COMMAND_FAILED",`Failed to decode ${t} as PNG`,{label:t,reason:e instanceof Error?e.message:String(e)})}}async function eY(t,n){if(!Number.isInteger(n)||n<1)throw new c("INVALID_ARGS","Screenshot max size must be a positive integer");let a=eX(await e.readFile(t),"screenshot"),r=Math.max(a.width,a.height);if(r<=n)return;let i=n/r,s=Math.max(1,Math.round(a.width*i)),o=Math.max(1,Math.round(a.height*i)),l=function(e,t,n){let a=new eE({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,u=0,c=0,d=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;u+=(e.data[i]??0)*r,c+=(e.data[i+1]??0)*r,d+=(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(u/h),a.data[f+1]=Math.round(c/h),a.data[f+2]=Math.round(d/h),a.data[f+3]=Math.round(p/h)}}return a}(a,s,o);await e.writeFile(t,eE.sync.write(l))}async function eH(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 u(e)}}async function eK(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 u(e)}}async function ez(e,t){try{return await e.artifacts.createTempFile(t)}catch(e){throw u(e)}}let eJ=async(e,t)=>{let n;if(!e.backend.captureScreenshot)throw new c("UNSUPPORTED_OPERATION","screenshot is not supported by this backend");let a=await eK(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 eY(a.path,t.maxSize),n=await a.publish()}catch(e){throw await a.cleanup?.(),e}return{path:a.path,...n?{artifacts:[n]}:{},...h(`Saved screenshot: ${a.path}`)}},eW=[0,187,255,255];function eZ(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 eQ(e,t,n){return Math.min(Math.max(e,t),n)}let e0=[{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 e1(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,u;if(!e2(t,i,e))continue;let c=0,d=(l=s,i[u=e]=1,l[0]=u,1),p=r.create(e);for(;c<d;){let e=s[c];c+=1,r.visit(p,e),d=function(e){let{mask:t,visited:n,queue:a,width:r,height:i,pixelIndex:s}=e,o=s%r,l=Math.floor(s/r),u=e.queueEnd;for(let e of e0){var c,d,p,h;let s=o+e.x,f=l+e.y;if(c=s,d=f,p=r,h=i,!(c>=0)||!(c<p)||!(d>=0)||!(d<h))continue;let m=f*r+s;e2(t,n,m)&&(u=function(e,t,n,a){return t[a]=1,e[n]=a,n+1}(a,n,u,m))}return u}({mask:t,visited:i,queue:s,queueEnd:d,width:n,height:a,pixelIndex:e})}o.push(p)}return o}function e2(e,t,n){return 1===e[n]&&1!==t[n]}function e5(e){let t=1/0,n=1/0,a=-1/0,r=-1/0;for(let i of e)t=Math.min(t,i.x),n=Math.min(n,i.y),a=Math.max(a,i.x+i.width),r=Math.max(r,i.y+i.height);return{x:t,y:n,width:a-t,height:r-n}}function e4(e,t){let n=Math.max(e.x,t.x),a=Math.max(e.y,t.y),r=Math.min(e.x+e.width,t.x+t.width),i=Math.min(e.y+e.height,t.y+t.height);return r<=n||i<=a?0:(r-n)*(i-a)}function e8(e){return{x:e.x+e.width/2,y:e.y+e.height/2}}function e3(e,t){return(e.x-t.x)**2+(e.y-t.y)**2}function e6(e,t,n){return Math.min(Math.max(e,t),n)}let e7={icon:90,toggle:90,chevron:75,separator:45,visual:35,background:10},e9={leading:20,trailing:20,separator:10,unknown:0,background:-30};function te(e){return"background"!==e.likelyKind}function tt(e,t){return e.width>=.25*t.width||e.height>=.06*t.height}function tn(e,t){let n,a=0;for(let r of t){let t=to(e,r.rect);t<=a||(a=t,n=r)}return n}function ta(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,to(t,a=n.rect)>0||Math.abs(e8(t).y-e8(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=e5([e.rect,n.rect])}return t}function tr(e,t){let n,a=e8(e);for(let e of t){let t=Math.sqrt(e3(a,e8(e.rect)));n&&t>=n.distance||(n={block:e,distance:t})}return n}function ti(e){let t=ts(e);return e.differentPixels>=24&&t.width>=3&&t.height>=3}function ts(e){return{x:e.minX,y:e.minY,width:e.maxX-e.minX+1,height:e.maxY-e.minY+1}}function to(e,t){return Math.max(0,Math.min(e.y+e.height,t.y+t.height)-Math.max(e.y,t.y))}async function tl(e){if(await f("tesseract"))try{let[t,n]=await Promise.all([tc(e.baselinePath),tc(e.currentPath)]);if(0!==t.exitCode||0!==n.exitCode)return;let a=tu(t.stdout,e.width,e.height),r=tu(n.stdout,e.width,e.height),i=function(e,t){let n=new Set,a=[];for(let i of e){var r;let e=tg(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(tg(o.text)!==t)continue;let l=e3(e8(e.normalizedRect),e8(o.normalizedRect));l>=i||(r=s,i=l)}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=ty(t.rect.width/e.rect.width),r=ty(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)=>td(t)-td(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-tw(e.map(e=>e.delta.x))));e?e.push(n):t.push([n])}return t.filter(e=>e.length>=2).map(tp).filter(e=>e.yRange.max-e.yRange.min<=60).sort((e,t)=>th(t)-th(e)).slice(0,4)}(i);if(0===a.length&&0===r.length)return;return{provider:"tesseract",baselineBlocks:a.length,currentBlocks:r.length,baselineBlocksRaw:a,currentBlocksRaw:r,matches:i,...s.length>0?{movementClusters:s}:{}}}catch{return}}function tu(e,t,n){let[a,...r]=e.split(/\r?\n/);if(!a)return[];let i=new Map(a.split(" ").map((e,t)=>[e,t])),s=[];for(let e of r){var o;if(!e.trim())continue;let t=e.split(" "),n=tm(t,i,"level"),a=tf(t,i,"text").trim(),r=tm(t,i,"conf");if(5!==n||(o=a,!/[\p{L}\p{N}]/u.test(o))||r<0)continue;let l=tm(t,i,"left"),u=tm(t,i,"top"),c=tm(t,i,"width"),d=tm(t,i,"height");c<=0||d<=0||s.push({key:[tf(t,i,"page_num"),tf(t,i,"block_num"),tf(t,i,"par_num"),tf(t,i,"line_num")].join(":"),text:a,confidence:r,rect:{x:l,y:u,width:c,height:d}})}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=e5(a.map(e=>e.rect)),i=Math.round(100*tw(a.map(e=>e.confidence)))/100;return{text:a.map(e=>e.text).join(" "),confidence:i,rect:r,normalizedRect:{x:tb(r.x/t),y:tb(r.y/n),width:tb(r.width/t),height:tb(r.height/n)}}})(e,t,n)).filter(e=>null!==e)}function tc(e){return m("tesseract",[e,"stdout","-l","eng","tsv"],{allowFailure:!0,timeoutMs:1e4})}function td(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 tp(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 th(e){return 2*Math.abs((e.xRange.min+e.xRange.max)/2)+Math.abs((e.yRange.min+e.yRange.max)/2)}function tf(e,t,n){let a=t.get(n);return void 0===a?"":e[a]??""}function tm(e,t,n){let a=Number(tf(e,t,n));return Number.isFinite(a)?a:0}function tg(e){return e.trim().replace(/\s+/g," ").toLowerCase()}function tw(e){return e.reduce((e,t)=>e+t,0)/e.length}function tb(e){return Math.round(100*e*100)/100}function ty(e){return Math.round(1e3*e)/1e3}function tv(e,t,n,a){return{r:Math.round(e/a),g:Math.round(t/a),b:Math.round(n/a)}}function tk(e){return .2126*e.r+.7152*e.g+.0722*e.b}function tx(e){return`#${tA(e.r)}${tA(e.g)}${tA(e.b)}`}function tA(e){return e.toString(16).padStart(2,"0")}function tD(e){return Math.round(100*e*100)/100}let tM=255*Math.sqrt(3);async function tI(t,n,r={}){var i,s,o,l,u;let c,d,p,h;await tN(t,"Baseline image not found"),await tN(n,"Current screenshot not found");let f=r.outputPath,[m,g]=await Promise.all([e.readFile(t),e.readFile(n)]),w=eX(m,"baseline screenshot"),b=eX(g,"current screenshot");tS(w.width,w.height,"baseline screenshot",r.maxPixels),tS(b.width,b.height,"current screenshot",r.maxPixels);let y=r.threshold??.1;if(w.width!==b.width||w.height!==b.height){let e=w.width*w.height;return await tR(r.outputPath),{match:!1,mismatchPercentage:100,totalPixels:e,differentPixels:e,dimensionMismatch:{expected:{width:w.width,height:w.height},actual:{width:b.width,height:b.height}}}}let v=w.width*w.height,k=y*tM,x=new eE({width:w.width,height:w.height}),A=new Uint8Array(v),D=0;for(let e=0,t=0;e<w.data.length;e+=4,t+=1){if(Math.sqrt((w.data[e]-b.data[e])**2+(w.data[e+1]-b.data[e+1])**2+(w.data[e+2]-b.data[e+2])**2)>k){D+=1,A[t]=1;let n=tP(b,e);x.data[e]=tO(n,220,.78),x.data[e+1]=tO(n,0,.78),x.data[e+2]=tO(n,0,.78),x.data[e+3]=255;continue}let n=tP(b,e);x.data[e]=n,x.data[e+1]=n,x.data[e+2]=n,x.data[e+3]=255}let M=D>0?(s=(c=function(e){let{diffMask:t,baseline:n,current:a}=e,{width:r,height:i}=n;return e1({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,u;let c,d,p;return i=e,s=t,o=r,l=n,u=a,c=s%o,d=Math.floor(s/o),p=4*s,void(i.minX=Math.min(i.minX,c),i.minY=Math.min(i.minY,d),i.maxX=Math.max(i.maxX,c),i.maxY=Math.max(i.maxY,d),i.differentPixels+=1,i.baselineRed+=l.data[p],i.baselineGreen+=l.data[p+1],i.baselineBlue+=l.data[p+2],i.currentRed+=u.data[p],i.currentGreen+=u.data[p+1],i.currentBlue+=u.data[p+2])}}})}(i={diffMask:A,baseline:w,current:b,totalPixels:v,differentPixels:D,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}(c):c,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,u,c,d,p,h;let f,m,g,w,b,y,v,k,x,A,D,M,I,N,S,R,P;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},v={x:Math.round(n.minX+y.width/2),y:Math.round(n.minY+y.height/2)},k=tv(n.baselineRed,n.baselineGreen,n.baselineBlue,n.differentPixels),x=tv(n.currentRed,n.currentGreen,n.currentBlue,n.differentPixels),A=y.width*y.height,D=tD(n.differentPixels/A),M=Math.round(tk(k)),I=Math.round(tk(x)),N=(s=y,o=r.width,l=r.height,s.width>=.55*o&&s.height>=.12*l?"large-area":s.width>=2.5*s.height?"horizontal-band":s.height>=2.5*s.width?"vertical-band":"compact"),S=(f=A/r.totalPixels)>=.04?"large":f>=.01?"medium":"small",R=(u=k,c=x,m=tk(u),Math.abs(g=tk(c)-m)>=12?g>0?"brighter":"darker":Math.max(Math.abs(c.r-u.r),Math.abs(c.g-u.g),Math.abs(c.b-u.b))>=12?"color-shift":"mixed"),P=(d=v,p=r.width,h=r.height,w=d.x<p/3?"left":d.x>2*p/3?"right":"center",b=d.y<h/3?"top":d.y>2*h/3?"bottom":"middle","center"===w&&"middle"===b?"center":`${b}-${w}`),{index:a,rect:y,normalizedRect:{x:tD(y.x/r.width),y:tD(y.y/r.height),width:tD(y.width/r.width),height:tD(y.height/r.height)},differentPixels:n.differentPixels,shareOfDiffPercentage:tD(n.differentPixels/r.differentPixels),densityPercentage:D,shape:N,size:S,location:P,averageBaselineColorHex:tx(k),averageCurrentColorHex:tx(x),baselineLuminance:M,currentLuminance:I,dominantChange:R}}):[];if(D>0&&f){for(let e of M)e.rect.width<4||e.rect.height<4||function(e,t){let n=eQ(t.x,0,e.width-1),a=eQ(t.y,0,e.height-1),r=eQ(t.x+t.width-1,0,e.width-1),i=eQ(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)eZ(e,s,a+t,eW),eZ(e,s,i-t,eW);for(let s=a;s<=i;s+=1)eZ(e,n+t,s,eW),eZ(e,r-t,s,eW)}}(x,e.rect);await e.mkdir(a.dirname(f),{recursive:!0}),await e.writeFile(f,eE.sync.write(x))}else await tR(r.outputPath);let I=D>0?await tl({baselinePath:t,currentPath:n,width:w.width,height:w.height}):void 0,N=I&&(I.matches.length>0||(I.movementClusters?.length??0)>0)?{provider:I.provider,baselineBlocks:I.baselineBlocks,currentBlocks:I.currentBlocks,matches:I.matches,...I.movementClusters?{movementClusters:I.movementClusters}:{}}:void 0,S=D>0&&I?(d=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]){var i;!function(e,t,n,a){let r=e6(Math.floor(a.x),0,t-1),i=e6(Math.floor(a.y),0,n-1),s=e6(Math.ceil(a.x+a.width),0,t),o=e6(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,{x:(i=e.rect).x-8,y:i.y-8,width:i.width+16,height:i.height+16})}return r}((o={diffMask:A,width:w.width,height:w.height,regions:M,ocr:I}).diffMask,o.width,o.height,o.ocr),u=o.width,e1({mask:l,width:u,height:o.height,hooks:{create:e=>{var t,n;let a,r;return a=(t=e)%(n=u),{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=u),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=ta(o.ocr?.currentBlocksRaw??[]),h=ta(o.ocr?.baselineBlocksRaw??[]),d.filter(ti).map(e=>{var t,n,a,r,i,s,l,u,c,d,f;let m,g,w,b,y,v,k,x,A,D;return t=e,n=o,a=p,r=h,b=function(e,t){let n,a=0;for(let r of t){let t=e4(e,r.rect);t<=a||(a=t,n=r)}return n?.index}(w=ts(t),n.regions),y=function(e,t,n){let a=tn(e,t);if(a)return tr(e,a.blocks);let r=tn(e,n);return r?tr(e,r.blocks):void 0}(w,a,r),v=function(e,t,n){if(e.height<=3&&e.width>=.12*n)return"separator";if(!t)return e.width>=.4*n?"background":"unknown";if(e.width>=.4*n)return"background";let a=e.x+e.width/2,r=t.x+t.width/2;return a<r-t.width/2?"leading":a>r+t.width/2?"trailing":e.width>=.35*n?"background":"unknown"}(w,y?.block.rect,n.width),k=(i=w,s=v,l=t.differentPixels,u=n,m=i.width/i.height,g=l/(i.width*i.height),"separator"===s?"separator":"background"===s?"background":"trailing"===s&&m>=1.5&&m<=3.8&&g>=.35?"toggle":"trailing"===s&&i.width<=.06*u.width&&i.height<=.04*u.height?"chevron":"leading"===s&&m>=.55&&m<=1.8?"icon":tt(i,u)?"background":"visual"),x={...b?{regionIndex:b}:{},slot:v,likelyKind:k,rect:w},{...b?{regionIndex:b}:{},slot:v,likelyKind:k,rect:w,...y?{nearestText:y.block.text.trim().replace(/^[^\p{L}\p{N}]+/u,"").replace(/^\p{L}\s+/u,"")}:{},score:(c=x,d=t.differentPixels,f=n,A=tt(c.rect,f)?-35:0,D=20*!!c.regionIndex,e7[c.likelyKind]+e9[c.slot]+D+A+Math.min(20,d/200))}}).filter(e=>e.rect.y>=.08*o.height).filter(te).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}:{}}})):[],R=v>0?Math.round(D/v*1e4)/100:0;return{...D>0&&f?{diffPath:f}:{},...M.length>0?{regions:M}:{},...N?{ocr:N}:{},...S.length>0?{nonTextDeltas:S}:{},totalPixels:v,differentPixels:D,mismatchPercentage:R,match:0===D}}async function tN(t,n){try{await e.access(t)}catch{throw new c("INVALID_ARGS",`${n}: ${t}`)}}function tS(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 tR(t){if(t)try{await e.unlink(t)}catch(e){var n;if(!("object"==typeof(n=e)&&null!==n&&"code"in n&&"ENOENT"===n.code))throw e}}function tP(e,t){return tO(Math.round(.299*e.data[t]+.587*e.data[t+1]+.114*e.data[t+2]),255,.72)}function tO(e,t,n){return Math.round(e*(1-n)+t*n)}function tL(e){return e.width*e.height}function tE(e){return Math.round(100*e*100)/100}async function tT(e,t){let n=await ez(e,{prefix:"agent-device-diff-current",ext:".png"});try{await t$(e,t,n.path,tC(t))}catch(e){throw await n.cleanup(),e}return n}async function t_(e,t,n,a,r){var i,s,o,l;if(!t.overlayRefs)return a;if(a.match||a.dimensionMismatch)return n&&await tF(n),a;let u=(i=t,s=n,i.currentOverlayOut?i.currentOverlayOut:i.out?.kind==="path"?{kind:"path",path:tU(s??i.out.path)}:i.out?.kind==="downloadableArtifact"?{kind:"downloadableArtifact",...i.out.clientPath?{clientPath:tU(i.out.clientPath)}:{},...i.out.fileName?{fileName:tU(i.out.fileName)}:{}}:void 0),c=await eK(e,u,{field:"currentOverlayPath",ext:".png"});try{let n=await t$(e,t,c.path,{overlayRefs:!0,...tC(t)}),i=await c.publish();return i&&r.push(i),{...a,currentOverlayPath:n.path??c.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=tL(t.rect),n.map(e=>{let n=e.overlayRect,r=e4(t.rect,n);return r<=0?null:{ref:e.ref,...e.label?{label:e.label}:{},rect:n,overlayCoveragePercentage:tE(r/tL(n)),regionCoveragePercentage:tE(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 c.cleanup?.(),e}}async function t$(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 tC(e){return e.surface?{surface:e.surface}:{}}function tU(e){let t=a.extname(e),n=t?e.slice(0,-t.length):e;return`${n}.current-overlay${t||".png"}`}async function tF(t){try{await e.unlink(tU(t))}catch(e){var n;if(!("object"==typeof(n=e)&&null!==n&&"code"in n&&"ENOENT"===n.code))throw e}}function tB(e){return"live"===e.kind}let tG={application:"application",navigationbar:"navigation-bar",tabbar:"tab-bar",button:"button",imagebutton:"button",link:"link",cell:"cell",statictext:"text",checkedtextview:"text",textfield:"text-field",edittext:"text-field",textarea:"text-view",switch:"switch",slider:"slider",image:"image",imageview:"image",webview:"webview",framelayout:"group",linearlayout:"group",relativelayout:"group",constraintlayout:"group",viewgroup:"group",view:"group",listview:"list",recyclerview:"list",collectionview:"collection",searchfield:"search",segmentedcontrol:"segmented-control",group:"group",window:"window",checkbox:"checkbox",radio:"radio",menuitem:"menu-item",toolbar:"toolbar",scrollarea:"scroll-area",scrollview:"scroll-area",nestedscrollview:"scroll-area",table:"table"};function tV(e,t={}){let n=[],a=[];for(let r of e){let e=r.depth??0,i=r.label?.trim()||r.value?.trim()||r.identifier?.trim()||"",s=tX(r.type??"Element");if("group"===s&&!i)continue;for(;n.length>0&&e<=n[n.length-1];)n.pop();let o=n.length;n.push(e),a.push({node:r,depth:o,type:s,text:tq(r,o,!1,s,t)})}return a}function tq(e,t,n,a,r={}){var i,s,o,l,u,c,d,p;let h,f=a??tX(e.type??"Element"),m=S(e,f),w=(i=e,s=f,o=r,l=m,o.summarizeTextSurfaces&&l.shouldSummarize&&function(e,t,n){let a=g(e.label);if(a&&a!==n)return a;let r=g(e.identifier);if(r&&!tH(r)&&r!==n)return r;switch(t){case"text":case"text-view":return"Text view";case"text-field":return"Text field";case"search":return"Search field";default:return""}}(i,s,l.text)||tj(i,s)),b=" ".repeat(t),y=e.ref?`@${e.ref}`:"",v=(u=e,c=f,d=r,p=m,h=[],(!1===u.enabled&&h.push("disabled"),d.summarizeTextSurfaces)?(!0===u.selected&&h.push("selected"),!0===u.focused&&h.push("focused"),tY(c)&&h.push("editable"),function(e,t){if("scroll-area"===t)return!0;let n=(e.type??"").toLowerCase(),a=`${e.role??""} ${e.subrole??""}`.toLowerCase();return n.includes("scroll")||a.includes("scroll")}(u,c)&&h.push("scrollable"),h.push(...u.presentationHints??[]),p.shouldSummarize&&(h.push(`preview:"${k(p.text).replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`),h.push("truncated")),tK(h)):h).map(e=>` [${e}]`).join(""),x=w?` "${w}"`:"";return n?`${b}${y} [${f}]${v}`.trimEnd():`${b}${y} [${f}]${x}${v}`.trimEnd()}function tj(e,t){var n,a;let r=e.label?.trim();if(r&&(n=t,a=r,("scroll-area"===n||"list"===n||"collection"===n||"table"===n)&&G(a)))return"";let i=e.value?.trim();if(tY(t)){if(i)return i;if(r)return r}else if(r)return r;if(i)return i;let s=e.identifier?.trim();return!s||tH(s)&&("group"===t||"image"===t||"list"===t||"collection"===t)?"":s}function tX(e){var t;let n=e.replace(/XCUIElementType/gi,"").toLowerCase(),a=e.includes(".")&&(e.startsWith("android.")||e.startsWith("androidx.")||e.startsWith("com."));return(n.includes(".")&&(n=n.replace(/^android\.widget\./,"").replace(/^android\.view\./,"").replace(/^android\.webkit\./,"").replace(/^androidx\./,"").replace(/^com\.google\.android\./,"").replace(/^com\.android\./,""),a&&n.includes(".")&&(n=n.slice(n.lastIndexOf(".")+1))),"textview"===n)?a?"text":"text-view":(t=n,(Object.prototype.hasOwnProperty.call(tG,t)?tG[t]:void 0)||n||"element")}function tY(e){return"text-field"===e||"text-view"===e||"search"===e}function tH(e){return/^[\w.]+:id\/[\w.-]+$/i.test(e)}function tK(e){return[...new Set(e)]}function tz(e,t){let n=tX(e.type??"Element"),a=tj(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 tJ(e,t){return t.flatten?e.map(e=>({text:tq(e,0,!1),comparable:tz(e,0)})):tV(e).map(e=>({text:e.text,comparable:tz(e.node,e.depth)}))}function tW(e,t){return e.get(t)??0}function tZ(e){let t=e.map(e=>[e.label,e.value,e.identifier,e.type,e.role].filter(Boolean).join(" ")).join("\n").toLowerCase(),n=t5(e,t0),a=t5(e,t1),r=t5(e,eN,t2),i=t5(e,eS),s=t4(n),o=t4(a),l=t4(r),u=/\b[\w.$<>/-]+\.(?:tsx?|jsx?):\d+(?::\d+)?\b/.test(t)||/\b[\w.$<>/-]+\.(?:tsx?|jsx?)\s+\(\d+:\d+\)/.test(t),c=s.length>0||o.length>0||/\b(reload js|copy stack)\b/.test(t),d=/\b(redbox|runtime error|reload js|copy stack|component stack|call stack)\b/.test(t)||u&&c;return{detected:l.length>0||i.length>0||c&&(/\b(logbox|redbox|reload js|copy stack|component stack|call stack|runtime error|open debugger to view warnings)\b/.test(t)||u),redBox:d,dismissRefs:s,minimizeRefs:o,collapsedRefs:l,dismissNodes:n,minimizeNodes:a,collapsedNodes:r}}function tQ(e){let t,n=tZ(e);if(!n.detected)return null;if(n.redBox){let e=t8(n.minimizeNodes);if(e)return t3(e,"minimize");let t=t8(n.dismissNodes);return t?{...t3(t,t6(t)),warning:"RedBox Minimize control was not exposed; used Dismiss fallback"}:null}let a=t8(n.dismissNodes);if(a)return t3(a,t6(a));let r=0===(t=n.collapsedNodes.filter(e=>e.rect)).length?null:t.sort((e,t)=>{let n=+(!0===e.hittable),a=+(!0===t.hittable);if(n!==a)return a-n;let r=e.rect?.width??0,i=t.rect?.width??0;return r!==i?i-r:(t.rect?.y??0)-(e.rect?.y??0)})[0]??null;return r?.rect?{action:"close-collapsed-banner",point:function(e){var t,n;if(!e.rect)throw Error("Collapsed React Native warning node must have rect");let a=Math.min(e.rect.height,52),r=Math.min(36,Math.max(18,.45*a));return{x:Math.round((t=e.rect.x+e.rect.width-r,n=e.rect.x+1,Math.min(e.rect.x+e.rect.width-1,Math.max(n,t)))),y:Math.round(e.rect.y+a/2)}}(r),ref:r.ref,label:t7(r)}:null}function t0(e){return"dismiss"===e||"close"===e||["x","\xd7","✕","✖","⨯"].includes(e)}function t1(e){return/^minimi[sz]e$/.test(e)}function t2(e){return!e.rect||e.rect.height<=180}function t5(e,t,n=()=>!0){let a=[];for(let r of e)r.ref&&n(r)&&[r.label,r.value,r.identifier].map(e=>e?.trim().toLowerCase()).filter(e=>!!e).some(e=>t(e))&&a.push(r);return a}function t4(e){return e.map(e=>e.ref)}function t8(e){return e.find(e=>e.rect)??null}function t3(e,t){if(!e.rect)throw Error("React Native overlay target node must have rect");return{action:t,point:i(e.rect),ref:e.ref,label:t7(e)}}function t6(e){return"dismiss"===t7(e)?.trim().toLowerCase()?"dismiss":"close"}function t7(e){return e.label??e.value??e.identifier}function t9(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}))}function ne(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}function nt(e){return e.clock?.now()??Date.now()}async function nn(e,t){e.clock?await e.clock.sleep(t):await new Promise(e=>setTimeout(e,t))}async function na(e,t){var n,a,r,i,o,l;let u,d,p,h;if(!e.backend.captureSnapshot)throw new c("UNSUPPORTED_OPERATION","snapshot is not supported by this backend");let f=t.session??"default",m=await e.sessions.get(f),g=await e.backend.captureSnapshot({session:f,requestId:t.requestId,appId:m?.appId,appBundleId:m?.appBundleId,signal:t.signal??e.signal,metadata:t.metadata},{interactiveOnly:t.interactiveOnly,compact:t.compact,depth:t.depth,scope:t.scope,raw:t.raw}),w=(a=g,r=e,n=a.snapshot?a.snapshot:{nodes:a.nodes??[],truncated:a.truncated,backend:a.backend,createdAt:nt(r)},n.presentationKey?n:{...n,presentationKey:s(t)}),b=nt(e);return{snapshot:w,result:g,session:m,warnings:((u=[...(i={result:g,snapshot:w,options:t,session:m,capturedAt:w.createdAt??b,runtimeNow:b}).result.warnings??[]]).push(...function(e){let t=e.result.analysis;if("android"!==e.snapshot.backend||!0!==e.options.interactiveOnly||e.snapshot.nodes.length>0||!t||(t.rawNodeCount??0)<12)return[];let n=[`Interactive snapshot is empty after filtering ${t.rawNodeCount} raw Android nodes. Likely causes: the app content is not accessibility-visible yet, a transient route change, or depth/filter options hid the target.`];return"number"==typeof e.options.depth&&"number"==typeof t.maxDepth&&t.maxDepth>=e.options.depth+2&&n.push(`Interactive output is empty at depth ${e.options.depth}; retry without -d.`),n}(i)),(d=function(e){if(e?.backend!=="uiautomator-dump")return;let t=e.fallbackReason?` Reason: ${e.fallbackReason}`:"";return`Android snapshot helper unavailable; using stock UIAutomator dump, which can time out on busy React Native UIs.${t}`}(i.result.androidSnapshot))&&u.push(d),(p=function(e){if(tZ(e).detected)return"Hint: React Native warning/error overlay detected. It overlays part of the app and should be handled before interacting.\nRun: agent-device react-native dismiss-overlay\nThen run: agent-device snapshot -i -c\nUse refs from the new snapshot."}(i.snapshot.nodes))&&u.push(p),(h=function(e){var t,n;let a=e.session?.snapshot,r=!!a&&[e.capturedAt,e.runtimeNow].some(e=>{let t=e-a.createdAt;return t>=0&&t<=2e3});if(!e.result.freshness&&a&&r&&(t=a.nodes.length,n=e.snapshot.nodes.length,!(t<12)&&n<=Math.floor(.2*t)))return ni}(i))&&u.push(h),u.push(...(o=i.result.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?[ni]:[]:[])),Array.from(new Set(u)))}}function nr(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 ni="Recent snapshots dropped sharply in node count, which suggests stale or mid-transition UI. Use screenshot as visual truth, wait briefly, then re-snapshot once.";function 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=w(n),o=v(n,i),l=!0===n.selected,u="text"===t?y(n):function(e,t,n){if(nl(e.rect))return function(e,t){return z(e,t)}(e,t);if(e.rect)return!1;if("android"!==n&&!0===e.hittable)return!0;let a=function(e,t){let n=new Map(t.map(e=>[e.index,e])),a=e,r=new Set;for(;"number"==typeof a.parentIndex&&!r.has(a.index);){r.add(a.index);let e=n.get(a.parentIndex);if(!e)break;if(function(e){let t=O(e.type??"");return!(t.includes("application")||t.includes("window")||t.includes("scrollview")||t.includes("tableview")||t.includes("collectionview"))&&"table"!==t&&"list"!==t&&"listview"!==t&&(!0===e.hittable||nl(e.rect))}(e))return e;a=e}return null}(e,t);return!!a&&(nl(a.rect)?function(e,t){return z(e,t)}(a,t):"android"!==n&&!0===a.hittable)}(n,a,i),c=!1;switch(t){case"visible":c=u;break;case"hidden":c=!u;break;case"editable":c=o;break;case"selected":c=l;break;case"text":c=s===(r??"")}let d="text"===t?`expected="${r??""}" actual="${s}"`:`actual=${JSON.stringify({visible:u,editable:o,selected:l})}`;return{pass:c,actualText:s,details:d}}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 nu(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 nc(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(ne(e,t),{interactiveOnly:!1,compact:!1,depth:t.depth,scope:n.scope??t.scope,raw:t.raw}),o=s.snapshot??{nodes:s.nodes??[],truncated:s.truncated,backend:s.backend,createdAt:nt(e)};return n.updateSession&&i&&await e.sessions.set({...i,snapshot:o}),{sessionName:r,session:i,snapshot:o}}async function nd(e,t,n){if(e.backend.readText){let a=await e.backend.readText(ne(e,{session:t.sessionName}),n);if(a.text.trim())return a.text}return R(n)}let np=async(e,t)=>{if("ref"===t.target.kind){let n=await nu(e,t.session),a=function(e,t,n){let a=r(t);if(!a)throw new c("INVALID_ARGS",n.invalidRefMessage);let i=o(e,a)??(n.fallbackLabel.length>0?I(e,n.fallbackLabel):null);if(!i)throw new c("COMMAND_FAILED",n.notFoundMessage);return{ref:a,node:i}}(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`}),i=A(a.node,e.backend.platform,{action:"get"}),s={kind:"ref",ref:`@${a.ref}`};return"attrs"===t.property?{kind:"attrs",target:s,node:a.node,selectorChain:i}:{kind:"text",target:s,text:await nd(e,n,a.node),node:a.node,selectorChain:i}}let n=await nM(e,t,t.session??"default",{selector:t.target.selector,disambiguateAmbiguous:"text"===t.property}),a=A(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 i=await nd(e,n.capture,n.node);return{kind:"text",target:{kind:"selector",selector:n.selector},text:i,node:n.node,selectorChain:a}},nh=async(e,t)=>{let n=await np(e,{...t,property:"text",target:t.target});if("text"!==n.kind)throw new c("COMMAND_FAILED","getText returned non-text result");return n},nf=async(e,t)=>{let n=await np(e,{...t,property:"attrs",target:t.target});if("attrs"!==n.kind)throw new c("COMMAND_FAILED","getAttrs returned non-attrs result");return n},nm=async(e,t)=>{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 n=await nc(e,t,{updateSession:!0}),a=b(t.selector);if("exists"===t.predicate){let r=D(n.snapshot.nodes,a,{platform:e.backend.platform});if(!r)throw new c("COMMAND_FAILED",P(a,[],{unique:!1}));return{predicate:t.predicate,pass:!0,selector:r.selector.raw,matches:r.matches,selectorChain:a.selectors.map(e=>e.raw)}}let r=M(n.snapshot.nodes,a,{platform:e.backend.platform,requireRect:!1,requireUnique:!0,disambiguateAmbiguous:!1});if(!r)throw new c("COMMAND_FAILED",P(a,[],{unique:!0}),{command:"is",reason:"selector_not_found",predicate:t.predicate,selector:a.raw});let i=no({predicate:t.predicate,node:r.node,nodes:n.snapshot.nodes,expectedText:t.expectedText,platform:e.backend.platform});if(!i.pass)throw new c("COMMAND_FAILED",`is ${t.predicate} failed for selector ${r.selector.raw}: ${i.details}`,{command:"is",reason:"predicate_failed",predicate:t.predicate,selector:r.selector.raw,predicateDetails:i.details});return{predicate:t.predicate,pass:!0,selector:r.selector.raw,..."text"===t.predicate?{text:i.actualText}:{},selectorChain:a.selectors.map(e=>e.raw)}},ng=async(e,t)=>await nm(e,{...t,predicate:"visible",selector:t.target.selector}),nw=async(e,t)=>await nm(e,{...t,predicate:"hidden",selector:t.target.selector}),nb=async(e,t)=>{if("sleep"===t.target.kind)return await nn(e,t.target.durationMs),{kind:"sleep",waitedMs:t.target.durationMs};if("ref"===t.target.kind){let n=await nu(e,t.session),a=r(t.target.ref);if(!a)throw new c("INVALID_ARGS",`Invalid ref: ${t.target.ref}`);let i=o(n.snapshot.nodes,a),s=i?N(i,n.snapshot.nodes):void 0;if(!s)throw new c("COMMAND_FAILED",`Ref ${t.target.ref} not found or has no label`);return await nA(e,t,s,t.target.timeoutMs)}if("selector"===t.target.kind)return await nx(e,t,t.target.selector,t.target.timeoutMs);if(!t.target.text)throw new c("INVALID_ARGS","wait requires text");return await nA(e,t,t.target.text,t.target.timeoutMs)},ny=async(e,t)=>{let n=await nb(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=nt(e);for(;nt(e)-r<a;){let{match:a}=await nk(e,t,n);if(a)return{kind:"found",found:!0,waitedMs:nt(e)-r};await nn(e,300)}throw new c("COMMAND_FAILED","find wait timed out")}async function nk(e,t,n){let a=await nc(e,t,{updateSession:!0,scope:"text"===n||"label"===n||"any"===n?t.query:void 0}),r=E(a.snapshot.nodes,n,t.query,{requireRect:!1}).matches[0];return{capture:a,match:r}}async function nx(e,t,n,a){let r=a??1e4,i=nt(e),s=b(n);for(;nt(e)-i<r;){let n=D((await nc(e,t,{updateSession:!0})).snapshot.nodes,s,{platform:e.backend.platform});if(n)return{kind:"selector",selector:n.selector.raw,waitedMs:nt(e)-i};await nn(e,300)}throw new c("COMMAND_FAILED",`wait timed out for selector: ${n}`)}async function nA(e,t,n,a){let r=a??1e4,i=nt(e);for(;nt(e)-i<r;){if(e.backend.findText?(await e.backend.findText(ne(e,t),n)).found:await nD(e,t,n))return{kind:"text",text:n,waitedMs:nt(e)-i};await nn(e,300)}throw new c("COMMAND_FAILED",`wait timed out for text: ${n}`)}async function nD(e,t,n){return!!I((await nc(e,t,{updateSession:!0})).snapshot.nodes,n)}async function nM(e,t,n,a){let r=await nc(e,{...t,session:n},{updateSession:!0}),i=b(a.selector),s=M(r.snapshot.nodes,i,{platform:e.backend.platform,requireRect:!1,requireUnique:!0,disambiguateAmbiguous:a.disambiguateAmbiguous});if(!s)throw new c("COMMAND_FAILED",P(i,[],{unique:!0}));return{capture:r,node:s.node,selector:s.selector.raw,ref:`@${s.node.ref}`}}function nI(e){let t=nN(e);if(!t)return null;let n=i(t);return Number.isFinite(n.x)&&Number.isFinite(n.y)?n:null}function nN(e){if(!e)return null;let t=Number(e.x),n=Number(e.y),a=Number(e.width),r=Number(e.height);return Number.isFinite(t)&&Number.isFinite(n)&&Number.isFinite(a)&&Number.isFinite(r)&&!(a<0)&&!(r<0)?{x:t,y:n,width:a,height:r}:null}let nS=["button","link","menuitem","tabitem","textfield","searchfield","securetextfield","checkbox","radio","switch","cell"];function nR(e,t){return nP(e,t).node}function nP(e,t){var n;let a=function(e,t){let n=nN(t.rect);if(!n)return null;let a=t,r=new Set;for(;!r.has(a.ref);){r.add(a.ref);let t=e.filter(e=>{if(e.parentIndex!==a.index||!e.hittable)return!1;let t=nN(e.rect);return!!t&&nL(t,n)});if(1!==t.length)break;let i=t[0];if(void 0===i)break;a=i}return a===t?null:a}(e,t);if(a?.rect&&nI(a.rect))return{node:a,reason:"same-rect-descendant"};if([(n=t).type,n.role,n.subrole].map(e=>O(e??"")).some(nO)&&t.rect&&nI(t.rect))return{node:t,reason:"semantic-target"};let r=x(e,t);return r?.rect&&nI(r.rect)?!function(e,t,n){var a,r,s,o;let l,u,c,d=nN(e.rect),p=nN(t.rect);if(!d||!p)return!1;let h=function(e,t){let n=i(t),a=e.filter(e=>{let t=(e.type??"").toLowerCase();return t.includes("application")||t.includes("window")}).map(e=>nN(e.rect)).filter(e=>null!==e);if(0===a.length)return null;let r=a.filter(e=>U(e,n.x,n.y));return F(r.length>0?r:a)}(n,d);return!!h&&(a=p,r=h,l=(s=a,o=r,Math.max(0,Math.min(s.x+s.width,o.x+o.width)-Math.max(s.x,o.x))*Math.max(0,Math.min(s.y+s.height,o.y+o.height)-Math.max(s.y,o.y))),u=a.width*a.height,c=r.width*r.height,!(l<=0)&&!(u<=0)&&!(c<=0)&&!!(l/c>=.9)&&!!(l/u>=.8))&&!nL(d,p)}(t,r,e)?{node:r,reason:"hittable-ancestor"}:{node:t,reason:"overly-broad-ancestor"}:{node:t,reason:"original"}}function nO(e){return"tab"===e||nS.some(t=>e.includes(t))}function nL(e,t){return .5>=Math.abs(e.x-t.x)&&.5>=Math.abs(e.y-t.y)&&.5>=Math.abs(e.width-t.width)&&.5>=Math.abs(e.height-t.height)}async function nE(e,t,n){if(await n_(e,t,n.action),"point"===t.target.kind)return{kind:"point",point:{x:t.target.x,y:t.target.y}};if("ref"===t.target.kind){let a=await nC(e,t,t.target),i=a.resolved,s=n.promoteToHittableAncestor?nR(a.snapshot.nodes,i.node):i.node;return function(e,t,n,a){let i=e.rect?J(e,t):null;if(!(!e.rect||!i||z(e,t)))throw new c("COMMAND_FAILED",`Ref ${n} is off-screen and not safe to ${a}`,{reason:"offscreen_ref",ref:r(n),rect:e.rect,viewport:i,hint:`Use scroll with the direction from the off-screen summary, take a fresh snapshot, then retry ${a} with the new ref or a selector.`})}(s,a.snapshot.nodes,t.target.ref,n.action),{kind:"ref",point:nF(s,`Ref ${t.target.ref} not found or has invalid bounds`),target:{kind:"ref",ref:`@${i.ref}`},node:s,selectorChain:A(s,e.backend.platform,{action:"fill"===n.action?"fill":"click"}),refLabel:N(s,a.snapshot.nodes)}}let a=await nT(e,t,n.requireInteractive),i=b(t.target.selector),s=M(a.snapshot.nodes,i,{platform:e.backend.platform,requireRect:!0,requireUnique:!0,disambiguateAmbiguous:!0});if(!s||!s.node.rect)throw new c("COMMAND_FAILED",P(i,s?.diagnostics??[],{unique:!0}));let o=n.promoteToHittableAncestor?nR(a.snapshot.nodes,s.node):s.node;return{kind:"selector",point:nF(o,`Selector ${s.selector.raw} resolved to invalid bounds`),target:{kind:"selector",selector:s.selector.raw},node:o,selectorChain:A(o,e.backend.platform,{action:"fill"===n.action?"fill":"click"}),refLabel:N(o,a.snapshot.nodes)}}async function nT(e,t,n){if(!e.backend.captureSnapshot)throw new c("UNSUPPORTED_OPERATION","snapshot is not supported by this backend");let a=t.session??"default",r=await e.sessions.get(a);if(!r)throw new c("SESSION_NOT_FOUND","No active session. Run open first.");let i=await e.backend.captureSnapshot(ne(e,t),{interactiveOnly:n,compact:n}),s=i.snapshot??{nodes:i.nodes??[],truncated:i.truncated,backend:i.backend,createdAt:nt(e)};return await e.sessions.set({...r,snapshot:s}),{snapshot:s}}async function n_(e,t,n){if("macos"!==e.backend.platform)return;let a=await n$(e,t);if(("desktop"===a||"menubar"===a)&&("menubar"!==a||"click"!==n&&"press"!==n))throw new c("UNSUPPORTED_OPERATION",`${n} is not supported on macOS ${a} sessions yet. Open an app session to act, or use the ${a} surface to inspect.`)}async function n$(e,t){let n=await e.sessions.get(t.session??"default");return n?.metadata?.surface}async function nC(e,t,n){let a=t.session??"default",r=await e.sessions.get(a);if(!r)throw new c("SESSION_NOT_FOUND","No active session. Run open first.");if(!r.snapshot)throw new c("INVALID_ARGS","No snapshot in session. Run snapshot first.");let i=n.fallbackLabel??"",s=nU(r.snapshot.nodes,n.ref,{fallbackLabel:i,requireRect:!0});if(s)return{snapshot:r.snapshot,resolved:s};let o=await nT(e,t,!0),l=nU(o.snapshot.nodes,n.ref,{fallbackLabel:i,requireRect:!0});if(!l)throw new c("COMMAND_FAILED",`Ref ${n.ref} not found or has no bounds`);return{...o,resolved:l}}function nU(e,t,n){let a=r(t);if(!a)throw new c("INVALID_ARGS",`Invalid ref: ${t}`);let i=o(e,a);if(nB(i,n.requireRect))return{ref:a,node:i};let s=n.fallbackLabel.length>0?I(e,n.fallbackLabel):null;return nB(s,n.requireRect)?{ref:a,node:s}:null}function nF(e,t){if(!e.rect)throw new c("COMMAND_FAILED",t);let n=i(e.rect);if(!Number.isFinite(n.x)||!Number.isFinite(n.y))throw new c("COMMAND_FAILED",t);return n}function nB(e,t){if(!e)return!1;if(!t)return!0;if(!e.rect)return!1;let{x:n,y:a,width:r,height:s}=e.rect;if(!Number.isFinite(Number(n))||!Number.isFinite(Number(a))||!Number.isFinite(Number(r))||!Number.isFinite(Number(s))||0>Number(r)||0>Number(s))return!1;let o=i(e.rect);return Number.isFinite(o.x)&&Number.isFinite(o.y)}async function nG(e,t){let n=t.target??{kind:"viewport"};return"viewport"===n.kind?(await n_(e,t,"scroll"),{kind:"viewport"}):await nE(e,{...t,target:n},{action:"scroll",requireInteractive:!1,promoteToHittableAncestor:!1})}async function nV(e,t){if(t.from){var n;if("x"in(n=t.from)&&"y"in n)return await n_(e,t,"swipe"),{point:nX(t.from,"from")};let a=await nE(e,{...t,target:t.from},{action:"swipe",requireInteractive:!1,promoteToHittableAncestor:!1});return{point:a.point,target:a}}if(!t.direction)throw new c("INVALID_ARGS","swipe requires from+to or a direction");return await n_(e,t,"swipe"),{point:i(function(e){let t=e.filter(t=>z(t,e)).map(e=>e.rect).filter(nH),n=t.length>0?t:e.map(e=>e.rect).filter(nH);if(0===n.length)throw new c("COMMAND_FAILED","Cannot infer viewport for directional swipe");let a=Math.min(...n.map(e=>e.x)),r=Math.min(...n.map(e=>e.y));return{x:a,y:r,width:Math.max(...n.map(e=>e.x+e.width))-a,height:Math.max(...n.map(e=>e.y+e.height))-r}}((await nT(e,t,!1)).snapshot.nodes)),target:{kind:"viewport"}}}async function nq(e,t,n,a,r){if(!e.backend.captureSnapshot)throw new c("UNSUPPORTED_OPERATION",`scroll ${n} requires snapshot support to verify hidden content before scrolling`);let{captureSnapshot:i}=e.backend;return await ew({edge:n,target:a,scope:r,captureNodes:async n=>{let a=await i(ne(e,t),{compact:!0,scope:n});return a.snapshot?.nodes??a.nodes??[]}})}function nj(e,t){switch(e){case"up":case"down":case"left":case"right":return e;default:throw new c("INVALID_ARGS",`${t} must be up, down, left, or right`)}}function nX(e,t){let n=Number(e.x),a=Number(e.y);if(!Number.isFinite(n)||!Number.isFinite(a))throw new c("INVALID_ARGS",`${t} point requires finite x and y`);return{x:n,y:a}}function nY(e,t){if(!Number.isFinite(e)||e<=0)throw new c("INVALID_ARGS",`${t} must be a positive number`);return e}function nH(e){return!!(e&&e.width>0&&e.height>0)}function nK(e){return e&&"object"==typeof e?e:void 0}async function nz(e,t,n){let a=await nE(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 r=nJ(await e.backend.tap(ne(e,t),a.point,{button:t.button,count:t.count,intervalMs:t.intervalMs,holdMs:t.holdMs,jitterPx:t.jitterPx,doubleTap:t.doubleTap}));return{...a,...r?{backendResult:r}:{}}}function nJ(e){return e&&"object"==typeof e?e:void 0}function nW(e,t){if(void 0!==e)return nZ(e,t)}function nZ(e,t){let n=e?.trim();if(!n)throw new c("INVALID_ARGS",`${t} must be a non-empty string`);return n}function nQ(e){return e&&"object"==typeof e?e:void 0}let n0=/^[A-Za-z0-9_.:-]{1,64}$/;async function n1(e,t){if(!t||"object"!=typeof t)throw new c("INVALID_ARGS","apps.push requires an input");if("json"===t.kind)return n2(t.payload,"apps.push JSON payload",8192),{backendInput:{kind:"json",payload:t.payload},inputKind:"json"};let n=await eH(e,t,{usage:"apps.push",field:"input"});return{backendInput:{kind:"file",path:n.path},inputKind:"file",...n.cleanup?{cleanup:n.cleanup}:{}}}function n2(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 n5(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}function n4(e){return e&&"object"==typeof e?e:void 0}async function n8(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?nZ(t.app,"app"):void 0;if("installFromSource"!==n&&!i)throw new c("INVALID_ARGS",`admin.${n} requires app`);let s=ne(e,t),o=await n3(e,s,t.source);try{var l,u,d,p,f;let t,a,c,m,g,w,b,y,v=await r.call(e.backend,s,{...i?{app:i}:{},source:o.source});return l=n,u=i,d=o.source,p=v,t=ae(p),a=n9(p,"appName"),c=n9(p,"appId"),m=n9(p,"bundleId"),g=n9(p,"packageName"),w=n9(p,"launchTarget"),b=n9(p,"installablePath"),y=n9(p,"archivePath"),{kind:"reinstall"===l?"appReinstalled":"installFromSource"===l?"appInstalledFromSource":"appInstalled",...u?{app:u}:{},source:d,...c?{appId:c}:{},...a?{appName:a}:{},...m?{bundleId:m}:{},...g?{packageName:g}:{},...w?{launchTarget:w}:{},...b?{installablePath:b}:{},...y?{archivePath:y}:{},...t?{backendResult:t}:{},...h(`${"reinstall"===l?"Reinstalled":"Installed"}: ${a??w??u??(f=d,"path"===f.kind?f.path:"uploadedArtifact"===f.kind?f.id:f.url)}`)}}finally{await o.cleanup?.()}}async function n3(e,t,n){let a=n7(n),r=await n6(e,a);try{let n=e.backend.resolveInstallSource?await e.backend.resolveInstallSource(t,r.source):r.source;return{source:n7(n),...r.cleanup?{cleanup:r.cleanup}:{}}}catch(e){if(r.cleanup)try{await r.cleanup()}catch{}throw e}}async function n6(e,t){if("url"===t.kind)return{source:t};let n=await eH(e,t,{usage:"admin.install",field:"source"});return{source:{kind:"path",path:n.path},...n.cleanup?{cleanup:n.cleanup}:{}}}function n7(e){if(!e||"object"!=typeof e)throw new c("INVALID_ARGS","install source is required");if("path"===e.kind)return{kind:"path",path:nZ(e.path,"source.path")};if("uploadedArtifact"===e.kind)return{kind:"uploadedArtifact",id:nZ(e.id,"source.id")};if("url"===e.kind){let t=nZ(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 n9(e,t){let n=e[t];return"string"==typeof n&&n.length>0?n:void 0}function ae(e){return e&&"object"==typeof e?e:void 0}function at(e,t){if("start"===e||"stop"===e)return e;throw new c("INVALID_ARGS",`${t} action must be start or stop`)}function an(e,t,n,a){return{kind:"start"===e?a.startKind:a.stopKind,action:e,...n?{artifact:n}:{},backendResult:t,...h("start"===e?a.startMessage:a.stopMessage)}}let aa=/(?:authorization|cookie|token|secret|password|passwd|api[-_]?key)/i,ar=/\b[A-Za-z0-9_-]{16,}\.[A-Za-z0-9_-]{16,}\.[A-Za-z0-9_-]{16,}\b/g;function ai(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(ar,()=>(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=as(e);return t?(t.redacted&&n(),t.value):e}):t),redacted:a}}function as(e){try{let t=new URL(e),n=function(e){let t=!1;for(let n of Array.from(e.searchParams.keys()))aa.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 ao=/(?:authorization|cookie|token|secret|password|passwd|api[-_]?key)/i;function al(e){if(!e)return{redacted:!1};let t=!1,n={};for(let[a,r]of Object.entries(e))if(ao.test(a))n[a]="[REDACTED]",t=!0;else{let e=ap(r,2048);n[a]=e.value??"",t||=e.redacted}return{value:n,redacted:t}}function au(e){return void 0===e?{redacted:!1}:function(e){try{let t=JSON.parse(e),n=ad(t,ai);return ah(JSON.stringify(n.value),2048,n.redacted)}catch{return}}(e)??ap(e,2048)}function ac(e){return ad(e,e=>ap(e,2048))}function ad(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=ad(e,t);return n||=a.redacted,a.value}),redacted:n}}let n=!1,a={};for(let[r,i]of Object.entries(e)){if(ao.test(r)){a[r]="[REDACTED]",n=!0;continue}let e=ad(i,t);a[r]=e.value,n||=e.redacted}return{value:a,redacted:n}}function ap(e,t){if(void 0===e)return{redacted:!1};let n=ai(e);return ah(n.value,t,n.redacted)}function ah(e,t,n){if(void 0===e)return{redacted:n};let a=e;return a.length>t&&(a=`${a.slice(0,t)}...[truncated]`,n=!0),{value:a,redacted:n}}async function af(e,t){let n=ne(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 am(e,t,n,a){return{...ag(e),...void 0!==e.cursor?{cursor:nZ(e.cursor,"cursor")}:{},limit:void 0===e.limit?t:eI(e.limit,a,1,n)}}function ag(e){return{...void 0!==e.since?{since:nZ(e.since,"since")}:{},...void 0!==e.until?{until:nZ(e.until,"until")}:{}}}function aw(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)=>nZ(e,`${t}[${n}]`))}let ab=eJ,ay=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&&!tB(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 eH(e,t.baseline,{usage:"diff screenshot baseline",field:"baseline"}),l=[];try{let u;u=tB(s)?(a=await tT(e,t)).path:(n=await eH(e,s,{usage:"diff screenshot current",field:"current"})).path,r=t.out?await eK(e,t.out,{field:"diffPath",ext:".png"}):void 0;let c=await tI(o.path,u,{threshold:i,outputPath:r?.path,maxPixels:e.policy.maxImagePixels});tB(s)&&(c=await t_(e,t,r?.path,c,l));let d=c.diffPath?await r?.publish():void 0;return d&&l.push(d),c.diffPath||await r?.cleanup?.(),{...c,...l.length>0?{artifacts:l}:{}}}catch(e){throw await r?.cleanup?.(),e}finally{await o.cleanup?.(),await n?.cleanup?.(),await a?.cleanup?.()}},av=async(e,t)=>{var n;let a,r,i=await na(e,t),s=function(e){var t,n,a,r,i;let{previous:s,current:o,options:l,identity:u}=e;if(!0===l.forceFull||!0===l.raw||!s||!1===s.comparisonSafe||!1===o.comparisonSafe||(t=s,n=o,a=u,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(t9(r.nodes))!==JSON.stringify(t9(i.nodes))))return;let c=l.scope?.trim();return{ageMs:Math.max(0,o.createdAt-s.createdAt),nodeCount:o.nodes.length,...!0===l.interactiveOnly?{interactiveOnly:!0}:{},...c?{scope:c}:{}}}({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(nr(t.session,i)),{nodes:i.snapshot.nodes,truncated:i.snapshot.truncated??!1,visibility:function(e){var t;let{nodes:n,backend:a,snapshotRaw:r}=e;if(r||"macos-helper"===(t=a)||"linux-atspi"===t)return{partial:!1,visibleNodeCount:n.length,totalNodeCount:n.length,reasons:[]};let i=Y(n),s=new Set;return i.hiddenCount>0&&s.add("offscreen-nodes"),i.nodes.some(e=>e.hiddenContentAbove)&&s.add("scroll-hidden-above"),i.nodes.some(e=>e.hiddenContentBelow)&&s.add("scroll-hidden-below"),{partial:s.size>0,visibleNodeCount:i.nodes.length,totalNodeCount:n.length,reasons:[...s]}}({nodes:i.snapshot.nodes,backend:i.snapshot.backend,snapshotRaw:t.raw}),...i.result.androidSnapshot?{androidSnapshot:i.result.androidSnapshot}:{},...i.warnings.length>0?{warnings:i.warnings}:{},...s?{unchanged:s}:{},...(a=(n=i).result.appName??n.session?.appName,r=n.result.appBundleId??n.session?.appBundleId,{...a||r?{appName:a??r}:{},...r?{appBundleId:r}:{}})}},ak=async(e,t)=>{let n=await na(e,t),a=!0===t.interactiveOnly,r=n.session?.snapshot,i=nr(t.session,n);if(!r){let t=function(e,t={}){return tJ(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&&tW(i,r-1)<tW(i,r+1)?tW(i,r+1):tW(i,r-1)+1,u=l-r;for(;l<n&&u<a&&e[l].comparable===t[u].comparable;)l+=1,u+=1;if(i.set(r,l),l>=n&&u>=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,u=l===-a||l!==a&&tW(r,l-1)<tW(r,l+1)?l+1:l-1,c=tW(r,u),d=c-u;for(;s>c&&o>d;)i.push({kind:"unchanged",text:n[o-1].text}),s-=1,o-=1;if(0===a)break;s===c?(i.push({kind:"added",text:n[d].text}),o=d):(i.push({kind:"removed",text:t[c].text}),s=c)}return i.reverse(),i}(s,e,t,n,a)}}return[]}(tJ(e,n),tJ(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}:{}}},ax=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 nk(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 nd(e,a,r),node:r}},aA=np,aD=nh,aM=nf,aI=nm,aN=ng,aS=nw,aR=nb,aP=ny,aO=async(e,t)=>await nz(e,t,"click"),aL=async(e,t)=>await nz(e,t,"press"),aE=async(e,t)=>{var n;if(!t.text)throw new c("INVALID_ARGS","fill requires text");let a=await nE(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 r=nJ(await e.backend.fill(ne(e,t),a.point,t.text,{delayMs:t.delayMs})),i="node"in a?a.node.type??"":"",s=i&&!L(i,e.backend.platform)?`fill target ${n=a,n.target?.kind==="ref"?n.target.ref:n.target?.kind==="selector"?n.target.selector:"point"} resolved to "${i}", attempting fill anyway.`:void 0;return{...a,text:t.text,...s?{warning:s}:{},...r?{backendResult:r}:{}}},aT=async(e,t)=>{let n=t.text;if(!n)throw new c("INVALID_ARGS","type requires text");let a=eg(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=eI(t.delayMs??0,"delay-ms",0,1e4),i=nJ(await e.backend.typeText(ne(e,t),n,{delayMs:r}));return{kind:"text",text:n,delayMs:r,...i?{backendResult:i}:{},...h(`Typed ${Array.from(n).length} chars`)}},a_=async(e,t)=>{let n=await nE(e,t,{action:"focus",requireInteractive:!0,promoteToHittableAncestor:!1});if(!e.backend.focus)throw new c("UNSUPPORTED_OPERATION","focus is not supported by this backend");let a=nK(await e.backend.focus(ne(e,t),n.point));return{...n,...a?{backendResult:a}:{},...h(`Focused (${n.point.x}, ${n.point.y})`)}},a$=async(e,t)=>{let n=await nE(e,t,{action:"longPress",requireInteractive:!0,promoteToHittableAncestor:!0});if(!e.backend.longPress)throw new c("UNSUPPORTED_OPERATION","longPress is not supported by this backend");let a=void 0===t.durationMs?void 0:eI(t.durationMs,"durationMs",0,12e4),r=nK(await e.backend.longPress(ne(e,t),n.point,{durationMs:a}));return{...n,...void 0!==a?{durationMs:a}:{},...r?{backendResult:r}:{},...h(`Long pressed (${n.point.x}, ${n.point.y})`)}},aC=async(e,t)=>{if(!e.backend.swipe)throw new c("UNSUPPORTED_OPERATION","swipe is not supported by this backend");let n=await nV(e,t),a=function(e,t){if(t.to)return{point:nX(t.to,"to")};let n=nj(t.direction,"swipe direction"),a=nY(t.distance??200,"swipe distance");switch(n){case"up":return{point:{x:e.x,y:e.y-a},direction:n,distance:a};case"down":return{point:{x:e.x,y:e.y+a},direction:n,distance:a};case"left":return{point:{x:e.x-a,y:e.y},direction:n,distance:a};case"right":return{point:{x:e.x+a,y:e.y},direction:n,distance:a}}}(n.point,t),r=void 0===t.durationMs?void 0:eI(t.durationMs,"durationMs",16,1e4),i=nK(await e.backend.swipe(ne(e,t),n.point,a.point,{durationMs:r}));return{kind:"swipe",from:n.point,to:a.point,...a.direction?{direction:a.direction}:{},...void 0!==a.distance?{distance:a.distance}:{},...void 0!==r?{durationMs:r}:{},...n.target?{fromTarget:n.target}:{},...i?{backendResult:i}:{},...h("Swiped")}},aU=async(e,t)=>{var n,a,r,i;let s;if(!e.backend.scroll)throw new c("UNSUPPORTED_OPERATION","scroll is not supported by this backend");let o="bottom"===(n=t.direction)?{direction:"down",edge:"bottom"}:"top"===n?{direction:"up",edge:"top"}:{direction:nj(n,"scroll direction")},l=(a=t.amount,r="scroll amount",void 0===a?void 0:nY(a,r)),u=function(e,t){if(void 0!==e){if(!Number.isFinite(e)||!Number.isInteger(e)||e<=0)throw new c("INVALID_ARGS",`${t} must be a positive integer`);return e}}(t.pixels,"scroll pixels");if(void 0!==l&&void 0!==u)throw new c("INVALID_ARGS","scroll accepts either amount or pixels, not both");let d=await nG(e,t),p="viewport"===d.kind?{kind:"viewport"}:{kind:"point",point:d.point},f=e.backend.scroll,m=async()=>await f(ne(e,t),p,{direction:o.direction,...void 0!==l?{amount:l}:{},...void 0!==u?{pixels:u}:{}}),g=0;if(o.edge){let n=o.edge,a="viewport"===(i=d).kind?{}:{point:i.point,nodeIndex:"node"in i?i.node.index:void 0},r=await eb({edge:n,captureState:async r=>await nq(e,t,n,a,r),scroll:m});s=r.result,g=r.passes}else s=await m(),g=1;let w=nK(s);return{...d,direction:o.direction,...o.edge?{edge:o.edge,passes:g}:{},...void 0!==l?{amount:l}:{},...void 0!==u?{pixels:u}:{},...w?{backendResult:w}:{},...h(ey(o.direction,o.edge,g,l,u))}},aF=async(e,t)=>{if(!e.backend.pinch)throw new c("UNSUPPORTED_OPERATION","pinch is not supported by this backend");await n_(e,t,"pinch");let n=nY(t.scale,"pinch scale"),a=t.center?await nE(e,{...t,target:t.center},{action:"pinch",requireInteractive:!1,promoteToHittableAncestor:!1}):void 0,r=nK(await e.backend.pinch(ne(e,t),{scale:n,...a?{center:a.point}:{}}));return{kind:"pinch",scale:n,...a?{center:a.point,centerTarget:a}:{},...r?{backendResult:r}:{},...h(`Pinched to scale ${n}`)}},aB=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=nQ(await e.backend.pressBack(ne(e,t),{mode:n}));return{kind:"systemBack",mode:n,...a?{backendResult:a}:{},...h("Back")}},aG=async(e,t={})=>{if(!e.backend.pressHome)throw new c("UNSUPPORTED_OPERATION","system.home is not supported by this backend");let n=nQ(await e.backend.pressHome(ne(e,t)));return{kind:"systemHome",...n?{backendResult:n}:{},...h("Home")}},aV=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=nQ(await e.backend.rotate(ne(e,t),n));return{kind:"systemRotated",orientation:n,...a?{backendResult:a}:{},...h(`Rotated to ${n}`)}},aq=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 u=t.action??"status";if(!em(u))throw new c("INVALID_ARGS","system.keyboard action must be status, get, dismiss, enter, or return");let d=await e.backend.setKeyboard(ne(e,t),{action:u}),p=nQ(d),f=(n=d)&&"object"==typeof n?d:{};return"enter"===u||"return"===u?{kind:"keyboardEnterPressed",action:"enter",state:f,...(a=p)?{backendResult:a}:{},...h("Keyboard enter pressed")}:"dismiss"===u?(r=u,{kind:"keyboardDismissed",action:r,state:i=f,...(s=p)?{backendResult:s}:{},...h(!1===i.dismissed?"Keyboard already hidden":"Keyboard dismissed")}):(o=u,{kind:"keyboardState",action:o,state:f,...(l=p)?{backendResult:l}:{}})},aj=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(ne(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=nQ(await e.backend.setClipboard(ne(e,t),t.text));return{kind:"clipboardUpdated",action:"write",textLength:Array.from(t.text).length,...n?{backendResult:n}:{},...h("Clipboard updated")}},aX=async(e,t={})=>{if(!e.backend.openSettings)throw new c("UNSUPPORTED_OPERATION","system.settings is not supported by this backend");let n=nW(t.target,"target"),a=nQ(await e.backend.openSettings(ne(e,t),n));return{kind:"settingsOpened",...n?{target:n}:{},...a?{backendResult:a}:{},...h(n?`Opened settings: ${n}`:"Opened settings")}},aY=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:eI(t.timeoutMs,"timeoutMs",0,12e4),s=await e.backend.handleAlert(ne(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}:{},...h(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}:{},...h(t.handled?`Alert ${e}ed`:"No alert handled")}}(n,a)},aH=async(e,t={})=>{if(!e.backend.openAppSwitcher)throw new c("UNSUPPORTED_OPERATION","system.appSwitcher is not supported by this backend");let n=nQ(await e.backend.openAppSwitcher(ne(e,t)));return{kind:"appSwitcherOpened",...n?{backendResult:n}:{},...h("Opened app switcher")}},aK=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=nW(e.app,"app"),a=nW(e.appId,"appId"),r=nW(e.bundleId,"bundleId"),i=nW(e.packageName,"packageName"),s=nW(e.url,"url"),o=nW(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=n4(await e.backend.openApp(n5(e,t),a,{relaunch:t.relaunch}));return{kind:"appOpened",target:a,relaunch:!0===t.relaunch,...r?{backendResult:r}:{},...h(`Opened: ${(n=a).app??n.appId??n.bundleId??n.packageName??n.url??n.activity??"app"}`)}},az=async(e,t={})=>{if(!e.backend.closeApp)throw new c("UNSUPPORTED_OPERATION","apps.close is not supported by this backend");let n=nW(t.app,"app"),a=n4(await e.backend.closeApp(n5(e,t),n));return{kind:"appClosed",...n?{app:n}:{},...a?{backendResult:a}:{},...h(n?`Closed: ${n}`:"Closed app")}},aJ=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(n5(e,t),$(t.filter))}},aW=async(e,t)=>{if(!e.backend.getAppState)throw new c("UNSUPPORTED_OPERATION","apps.state is not supported by this backend");let n=nZ(t.app,"app"),a=await e.backend.getAppState(n5(e,t),n);return{kind:"appState",app:n,state:a}},aZ=async(e,t)=>{if(!e.backend.pushFile)throw new c("UNSUPPORTED_OPERATION","apps.push is not supported by this backend");let n=nZ(t.app,"app"),a=await n1(e,t.input);try{let r=await e.backend.pushFile(n5(e,t),a.backendInput,n),i=n4(r);return{kind:"appPushed",app:n,inputKind:a.inputKind,...i?{backendResult:i}:{},...h(`Pushed to ${n}`)}}finally{await a.cleanup?.()}},aQ=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=nZ(e,"name");if(!n0.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&&n2(n,a,8192);let i=n4(await e.backend.triggerAppEvent(n5(e,t),{name:r,...t.payload?{payload:t.payload}:{}}));return{kind:"appEventTriggered",name:r,...t.payload?{payload:t.payload}:{},...i?{backendResult:i}:{},...h(`Triggered app event: ${r}`)}},a0=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(ne(e,t),t.filter)}},a1=async(e,t={})=>{if(!e.backend.bootDevice)throw new c("UNSUPPORTED_OPERATION","admin.boot is not supported by this backend");let n=function(e){if(!e)return;let t=nW(e.id,"target.id"),n=nW(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}(t.target),a=ae(await e.backend.bootDevice(ne(e,t),n));return{kind:"deviceBooted",...n?{target:n}:{},...a?{backendResult:a}:{},...h("Booted device")}},a2=async(e,t)=>await n8(e,t,"install"),a5=async(e,t)=>await n8(e,t,"reinstall"),a4=async(e,t)=>await n8(e,t,"installFromSource"),a8=async(e,t)=>{let n=at(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 eK(e,t.out,{field:"path",ext:".mp4"}):void 0;try{var i,s,o,l,u;let c,d,p=(i=t,s=r?.path,c=void 0===i.fps?void 0:eI(i.fps,"fps",1,60),d=void 0===i.quality?void 0:eI(i.quality,"quality",5,10),{...s?{outPath:s}:{},...void 0!==c?{fps:c}:{},...void 0!==d?{quality:d}:{},...void 0!==i.hideTouches?{showTouches:!0!==i.hideTouches}:{}}),h=await a.call(e.backend,ne(e,t),p),f=await r?.publish();return o=n,l=h,u=f,{..."string"==typeof l.path?{path:l.path}:{},..."string"==typeof l.telemetryPath?{telemetryPath:l.telemetryPath}:{},..."string"==typeof l.warning?{warning:l.warning}:{},...an(o,l,u,{startKind:"recordingStarted",stopKind:"recordingStopped",startMessage:"Recording started",stopMessage:"Recording stopped"})}}catch(e){throw await r?.cleanup?.(),e}},a3=async(e,t)=>{let n=at(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 eK(e,t.out,{field:"outPath",ext:".trace"}):void 0;try{var i,s,o;let l={...r?.path?{outPath:r.path}:{}},u=await a.call(e.backend,ne(e,t),l),c=await r?.publish();return i=n,s=u,o=c,{..."string"==typeof s.outPath?{outPath:s.outPath}:{},...an(i,s,o,{startKind:"traceStarted",stopKind:"traceStopped",startMessage:"Trace started",stopMessage:"Trace stopped"})}}catch(e){throw await r?.cleanup?.(),e}},a6=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 af(e,t),{...am(a=t,100,500,"logs limit"),...void 0!==a.levels?{levels:aw(a.levels,"levels")}:{},...void 0!==a.search?{search:nZ(a.search,"search")}:{},...void 0!==a.source?{source:nZ(a.source,"source")}:{}})).redacted,{kind:"diagnosticsLogs",entries:n.entries.map(e=>{let t=ap(e.message,4096),n=ac(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}:{}}},a7=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={...am(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 af(e,t),s),a=s.include??"summary",i=!0===n.redacted,{kind:"diagnosticsNetwork",entries:n.entries.map(e=>{var t;let n=e.url?as(t=e.url)??ap(t,2048):void 0,r="headers"===a||"all"===a?al(e.requestHeaders):void 0,s="headers"===a||"all"===a?al(e.responseHeaders):void 0,o="body"===a||"all"===a?au(e.requestBody):void 0,l="body"===a||"all"===a?au(e.responseBody):void 0,u=ac(e.metadata);return i||=(n?.redacted??!1)||(r?.redacted??!1)||(s?.redacted??!1)||(o?.redacted??!1)||(l?.redacted??!1)||u.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}:{},...u.value?{metadata:u.value}:{}}}),...n.nextCursor?{nextCursor:n.nextCursor}:{},...n.timeWindow?{timeWindow:n.timeWindow}:{},...n.backend?{backend:n.backend}:{},redacted:i,...n.notes?{notes:n.notes}:{}}},a9=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 af(e,t),{...ag(a=t),...void 0!==a.sampleMs?{sampleMs:eI(a.sampleMs,"sampleMs",100,6e4)}:{},...void 0!==a.metrics?{metrics:aw(a.metrics,"metrics",20)}:{}})).redacted,{kind:"diagnosticsPerf",metrics:n.metrics.map(e=>{let t=ap(e.message,4096),n=ac(e.metadata);return r||=t.redacted||n.redacted,{name:e.name,...void 0!==e.value?{value:e.value}:{},...e.unit?{unit:e.unit}:{},...e.status?{status:e.status}:{},...void 0!==t.value?{message:t.value}:{},...n.value?{metadata:n.value}:{}}}),...n.startedAt?{startedAt:n.startedAt}:{},...n.endedAt?{endedAt:n.endedAt}:{},...n.backend?{backend:n.backend}:{},redacted:r,...n.notes?{notes:n.notes}:{}}};function re(e){let t={backend:e.backend,artifacts:e.artifacts,sessions:e.sessions??function(e=[]){let t=new Map(e.map(e=>[e.name,rt(e)]));return{get:e=>rt(t.get(e)),set:e=>{t.set(e.name,rt(e))},delete:e=>{t.delete(e)},list:()=>Array.from(t.values(),e=>rt(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=>ab(t,e),diffScreenshot:e=>ay(t,e),snapshot:e=>av(t,e),diffSnapshot:e=>ak(t,e)},selectors:{find:e=>ax(t,e),get:e=>aA(t,e),getText:(e,n={})=>aD(t,{...n,target:e}),getAttrs:(e,n={})=>aM(t,{...n,target:e}),is:e=>aI(t,e),isVisible:(e,n={})=>aN(t,{...n,target:e}),isHidden:(e,n={})=>aS(t,{...n,target:e}),wait:e=>aR(t,e),waitForText:(e,n={})=>aP(t,{...n,text:e})},interactions:{click:(e,n={})=>aO(t,{...n,target:e}),press:(e,n={})=>aL(t,{...n,target:e}),fill:(e,n,a={})=>aE(t,{...a,target:e,text:n}),typeText:(e,n={})=>aT(t,{...n,text:e}),focus:(e,n={})=>a_(t,{...n,target:e}),longPress:(e,n={})=>a$(t,{...n,target:e}),swipe:e=>aC(t,e),scroll:e=>aU(t,e),pinch:e=>aF(t,e)},system:{back:e=>aB(t,e),home:e=>aG(t,e),rotate:e=>aV(t,e),keyboard:e=>aq(t,e),clipboard:e=>aj(t,e),settings:e=>aX(t,e),alert:e=>aY(t,e),appSwitcher:e=>aH(t,e)},apps:{open:e=>aK(t,e),close:e=>az(t,e),list:(e={})=>aJ(t,{...e,filter:T(e.filter)}),state:e=>aW(t,e),push:e=>aZ(t,e),triggerEvent:e=>aQ(t,e)},admin:{devices:e=>a0(t,e),boot:e=>a1(t,e),install:e=>a2(t,e),reinstall:e=>a5(t,e),installFromSource:e=>a4(t,e)},recording:{record:e=>a8(t,e),trace:e=>a3(t,e)},observability:{logs:e=>a6(t,e),network:e=>a7(t,e),perf:e=>a9(t,e)}}}function rt(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 rn(e={}){return{allowLocalInputPaths:!0,allowLocalOutputPaths:!0,maxImagePixels:2e7,allowNamedBackendCapabilities:[],...e}}let ra=["app","frontmost-app","desktop","menubar"];function rr(e){let t=e?.trim().toLowerCase();if("app"===t||"frontmost-app"===t||"desktop"===t||"menubar"===t)return t;throw new c("INVALID_ARGS",`Invalid surface: ${e}. Use ${ra.join("|")}.`)}function ri(...e){return e}let rs=ri("snapshotInteractiveOnly","snapshotCompact","snapshotDepth","snapshotScope","snapshotRaw"),ro=ri("snapshotDepth","snapshotScope","snapshotRaw"),rl=ri("metroProjectRoot","metroKind","metroPublicBaseUrl","metroProxyBaseUrl","metroBearerToken","metroPreparePort","metroListenHost","metroStatusHost","metroStartupTimeoutMs","metroProbeTimeoutMs","metroRuntimeFile","metroNoReuseExisting","metroNoInstallDeps"),ru=ri("metroHost","metroPort","bundleUrl"),rc=ri("count","intervalMs","holdMs","jitterPx","doubleTap"),rd=ri("replayUpdate","replayEnv"),rp=[{key:"config",names:["--config"],type:"string",usageLabel:"--config <path>",usageDescription:"Load CLI defaults from a specific config file"},{key:"remoteConfig",names:["--remote-config"],type:"string",usageLabel:"--remote-config <path>",usageDescription:"Load remote host + Metro workflow settings from a specific profile file"},{key:"stateDir",names:["--state-dir"],type:"string",usageLabel:"--state-dir <path>",usageDescription:"Daemon state directory (defaults to ~/.agent-device)"},{key:"daemonBaseUrl",names:["--daemon-base-url"],type:"string",usageLabel:"--daemon-base-url <url>",usageDescription:"Explicit remote HTTP daemon base URL (skip local daemon discovery/startup)"},{key:"daemonAuthToken",names:["--daemon-auth-token"],type:"string",usageLabel:"--daemon-auth-token <token>",usageDescription:"Remote HTTP daemon auth token (sent as request token and bearer header)"},{key:"daemonTransport",names:["--daemon-transport"],type:"enum",enumValues:["auto","socket","http"],usageLabel:"--daemon-transport auto|socket|http",usageDescription:"Daemon client transport preference"},{key:"daemonServerMode",names:["--daemon-server-mode"],type:"enum",enumValues:["socket","http","dual"],usageLabel:"--daemon-server-mode socket|http|dual",usageDescription:"Daemon server mode used when spawning daemon"},{key:"tenant",names:["--tenant"],type:"string",usageLabel:"--tenant <id>",usageDescription:"Tenant scope identifier for isolated daemon sessions"},{key:"sessionIsolation",names:["--session-isolation"],type:"enum",enumValues:["none","tenant"],usageLabel:"--session-isolation none|tenant",usageDescription:"Session isolation strategy (tenant prefixes session namespace)"},{key:"runId",names:["--run-id"],type:"string",usageLabel:"--run-id <id>",usageDescription:"Run identifier used for tenant lease admission checks"},{key:"leaseId",names:["--lease-id"],type:"string",usageLabel:"--lease-id <id>",usageDescription:"Lease identifier bound to tenant/run admission scope"},{key:"leaseBackend",names:["--lease-backend"],type:"enum",enumValues:["ios-simulator","ios-instance","android-instance"],usageLabel:"--lease-backend ios-simulator|ios-instance|android-instance",usageDescription:"Lease backend for remote tenant connection admission"},{key:"force",names:["--force"],type:"boolean",usageLabel:"--force",usageDescription:"Force connection state replacement when reconnecting"},{key:"noLogin",names:["--no-login"],type:"boolean",usageLabel:"--no-login",usageDescription:"Connect: fail instead of starting implicit cloud login"},{key:"sessionLock",names:["--session-lock"],type:"enum",enumValues:["reject","strip"],usageLabel:"--session-lock reject|strip",usageDescription:"Lock bound-session device routing for this CLI invocation and nested batch steps"},{key:"sessionLocked",names:["--session-locked"],type:"boolean",usageLabel:"--session-locked",usageDescription:"Deprecated alias for --session-lock reject"},{key:"sessionLockConflicts",names:["--session-lock-conflicts"],type:"enum",enumValues:["reject","strip"],usageLabel:"--session-lock-conflicts reject|strip",usageDescription:"Deprecated alias for --session-lock"},{key:"platform",names:["--platform"],type:"enum",enumValues:["ios","macos","android","linux","apple"],usageLabel:"--platform ios|macos|android|linux|apple",usageDescription:"Platform to target (`apple` aliases the Apple automation backend)"},{key:"target",names:["--target"],type:"enum",enumValues:["mobile","tv","desktop"],usageLabel:"--target mobile|tv|desktop",usageDescription:"Device target class to match"},{key:"device",names:["--device"],type:"string",usageLabel:"--device <name>",usageDescription:"Device name to target"},{key:"udid",names:["--udid"],type:"string",usageLabel:"--udid <udid>",usageDescription:"iOS device UDID"},{key:"serial",names:["--serial"],type:"string",usageLabel:"--serial <serial>",usageDescription:"Android device serial"},{key:"surface",names:["--surface"],type:"enum",enumValues:ra,usageLabel:"--surface app|frontmost-app|desktop|menubar",usageDescription:"macOS session surface for open (defaults to app)"},{key:"headless",names:["--headless"],type:"boolean",usageLabel:"--headless",usageDescription:"Boot: launch Android emulator without a GUI window"},{key:"metroHost",names:["--metro-host"],type:"string",usageLabel:"--metro-host <host>",usageDescription:"Session-scoped Metro/debug host hint"},{key:"metroPort",names:["--metro-port"],type:"int",min:1,max:65535,usageLabel:"--metro-port <port>",usageDescription:"Session-scoped Metro/debug port hint"},{key:"metroProjectRoot",names:["--project-root"],type:"string",usageLabel:"--project-root <path>",usageDescription:"metro prepare: React Native project root (default: cwd)"},{key:"metroKind",names:["--kind"],type:"enum",enumValues:["auto","react-native","expo"],usageLabel:"--kind auto|react-native|expo",usageDescription:"metro prepare: detect or force the Metro launcher kind"},{key:"metroPublicBaseUrl",names:["--public-base-url"],type:"string",usageLabel:"--public-base-url <url>",usageDescription:"metro prepare: public base URL used for direct bundle hints"},{key:"metroProxyBaseUrl",names:["--proxy-base-url"],type:"string",usageLabel:"--proxy-base-url <url>",usageDescription:"metro prepare: optional bridge origin for remote Metro access"},{key:"metroBearerToken",names:["--bearer-token"],type:"string",usageLabel:"--bearer-token <token>",usageDescription:"metro prepare: host bridge bearer token (or AGENT_DEVICE_METRO_BEARER_TOKEN; falls back to AGENT_DEVICE_DAEMON_AUTH_TOKEN)"},{key:"metroPreparePort",names:["--port"],type:"int",min:1,max:65535,usageLabel:"--port <port>",usageDescription:"metro prepare: local Metro port (default: 8081)"},{key:"metroListenHost",names:["--listen-host"],type:"string",usageLabel:"--listen-host <host>",usageDescription:"metro prepare: host Metro listens on (default: 0.0.0.0)"},{key:"metroStatusHost",names:["--status-host"],type:"string",usageLabel:"--status-host <host>",usageDescription:"metro prepare: host used for local /status polling (default: 127.0.0.1)"},{key:"metroStartupTimeoutMs",names:["--startup-timeout-ms"],type:"int",min:1,usageLabel:"--startup-timeout-ms <ms>",usageDescription:"metro prepare: timeout while waiting for Metro to become ready"},{key:"metroProbeTimeoutMs",names:["--probe-timeout-ms"],type:"int",min:1,usageLabel:"--probe-timeout-ms <ms>",usageDescription:"metro prepare: timeout for /status and proxy bridge calls"},{key:"metroRuntimeFile",names:["--runtime-file"],type:"string",usageLabel:"--runtime-file <path>",usageDescription:"metro prepare: optional file path to persist the JSON result"},{key:"metroNoReuseExisting",names:["--no-reuse-existing"],type:"boolean",usageLabel:"--no-reuse-existing",usageDescription:"metro prepare: always start a fresh Metro process"},{key:"metroNoInstallDeps",names:["--no-install-deps"],type:"boolean",usageLabel:"--no-install-deps",usageDescription:"metro prepare: skip package-manager install when node_modules is missing"},{key:"bundleUrl",names:["--bundle-url"],type:"string",usageLabel:"--bundle-url <url>",usageDescription:"Session-scoped bundle URL hint"},{key:"launchUrl",names:["--launch-url"],type:"string",usageLabel:"--launch-url <url>",usageDescription:"Session-scoped deep link / launch URL hint"},{key:"iosSimulatorDeviceSet",names:["--ios-simulator-device-set"],type:"string",usageLabel:"--ios-simulator-device-set <path>",usageDescription:"Scope iOS simulator discovery/commands to this simulator device set"},{key:"androidDeviceAllowlist",names:["--android-device-allowlist"],type:"string",usageLabel:"--android-device-allowlist <serials>",usageDescription:"Comma/space separated Android serial allowlist for discovery/selection"},{key:"activity",names:["--activity"],type:"string",usageLabel:"--activity <component>",usageDescription:"Android app launch activity (package/Activity); not for URL opens"},{key:"launchConsole",names:["--launch-console"],type:"string",usageLabel:"--launch-console <path>",usageDescription:"open: capture the initial iOS simulator launch console window to a file"},{key:"header",names:["--header"],type:"string",multiple:!0,usageLabel:"--header <name:value>",usageDescription:"install-from-source: repeatable HTTP header for URL downloads"},{key:"githubActionsArtifact",names:["--github-actions-artifact"],type:"string",usageLabel:"--github-actions-artifact <owner/repo:artifact>",usageDescription:"install-from-source: GitHub Actions artifact resolved by a remote daemon"},{key:"installSource",names:[],type:"string"},{key:"session",names:["--session"],type:"string",usageLabel:"--session <name>",usageDescription:"Named session"},{key:"count",names:["--count"],type:"int",min:1,max:200,usageLabel:"--count <n>",usageDescription:"Repeat count for press/swipe series"},{key:"fps",names:["--fps"],type:"int",min:1,max:120,usageLabel:"--fps <n>",usageDescription:"Record: target frames per second (iOS physical device runner)"},{key:"quality",names:["--quality"],type:"int",min:5,max:10,usageLabel:"--quality <5-10>",usageDescription:"Record: scale recording resolution from 5 (50%) through 10 (native resolution)"},{key:"hideTouches",names:["--hide-touches"],type:"boolean",usageLabel:"--hide-touches",usageDescription:"Record: skip touch-overlay post-processing for faster raw benchmark videos"},{key:"intervalMs",names:["--interval-ms"],type:"int",min:0,max:1e4,usageLabel:"--interval-ms <ms>",usageDescription:"Delay between press iterations"},{key:"delayMs",names:["--delay-ms"],type:"int",min:0,max:1e4,usageLabel:"--delay-ms <ms>",usageDescription:"Delay between typed characters"},{key:"holdMs",names:["--hold-ms"],type:"int",min:0,max:1e4,usageLabel:"--hold-ms <ms>",usageDescription:"Press hold duration for each iteration"},{key:"jitterPx",names:["--jitter-px"],type:"int",min:0,max:100,usageLabel:"--jitter-px <n>",usageDescription:"Deterministic coordinate jitter radius for press"},{key:"pixels",names:["--pixels"],type:"int",min:1,max:1e5,usageLabel:"--pixels <n>",usageDescription:"Scroll: explicit gesture distance in pixels"},{key:"doubleTap",names:["--double-tap"],type:"boolean",usageLabel:"--double-tap",usageDescription:"Use double-tap gesture per press iteration"},{key:"clickButton",names:["--button"],type:"enum",enumValues:["primary","secondary","middle"],usageLabel:"--button primary|secondary|middle",usageDescription:"Click: choose mouse button (middle reserved for future macOS support)"},{key:"backMode",names:["--in-app"],type:"enum",enumValues:["in-app","system"],setValue:"in-app",usageLabel:"--in-app",usageDescription:"Back: use app-provided back UI when available"},{key:"backMode",names:["--system"],type:"enum",enumValues:["in-app","system"],setValue:"system",usageLabel:"--system",usageDescription:"Back: use system back input or gesture when available"},{key:"pauseMs",names:["--pause-ms"],type:"int",min:0,max:1e4,usageLabel:"--pause-ms <ms>",usageDescription:"Delay between swipe iterations"},{key:"pattern",names:["--pattern"],type:"enum",enumValues:["one-way","ping-pong"],usageLabel:"--pattern one-way|ping-pong",usageDescription:"Swipe repeat pattern"},{key:"verbose",names:["--debug","--verbose","-v"],type:"boolean",usageLabel:"--debug, --verbose, -v",usageDescription:"Enable debug diagnostics and stream daemon/runner logs"},{key:"json",names:["--json"],type:"boolean",usageLabel:"--json",usageDescription:"JSON output"},{key:"help",names:["--help","-h"],type:"boolean",usageLabel:"--help, -h",usageDescription:"Print help and exit"},{key:"version",names:["--version","-V"],type:"boolean",usageLabel:"--version, -V",usageDescription:"Print version and exit"},{key:"snapshotDiff",names:["--diff"],type:"boolean",usageLabel:"--diff",usageDescription:"Snapshot: show structural diff against the previous session baseline"},{key:"saveScript",names:["--save-script"],type:"booleanOrString",usageLabel:"--save-script [path]",usageDescription:"Save session script (.ad) on close; optional custom output path"},{key:"networkInclude",names:["--include"],type:"enum",enumValues:["summary","headers","body","all"],usageLabel:"--include summary|headers|body|all",usageDescription:"Network: include headers, bodies, or both in output"},{key:"shutdown",names:["--shutdown"],type:"boolean",usageLabel:"--shutdown",usageDescription:"close: shutdown associated simulator/emulator after ending session"},{key:"relaunch",names:["--relaunch"],type:"boolean",usageLabel:"--relaunch",usageDescription:"open: terminate app process before launching it"},{key:"restart",names:["--restart"],type:"boolean",usageLabel:"--restart",usageDescription:"logs clear: stop active stream, clear logs, then start streaming again"},{key:"retainPaths",names:["--retain-paths"],type:"boolean",usageLabel:"--retain-paths",usageDescription:"install-from-source: keep materialized artifact paths after install"},{key:"retentionMs",names:["--retention-ms"],type:"int",min:1,usageLabel:"--retention-ms <ms>",usageDescription:"install-from-source: retention TTL for materialized artifact paths"},{key:"noRecord",names:["--no-record"],type:"boolean",usageLabel:"--no-record",usageDescription:"Do not record this action"},{key:"replayUpdate",names:["--update","-u"],type:"boolean",usageLabel:"--update, -u",usageDescription:"Replay: update selectors and rewrite replay file in place"},{key:"replayMaestro",names:["--maestro"],type:"boolean",usageLabel:"--maestro",usageDescription:"Replay: treat input as a Maestro YAML compatibility flow. Supported subset: launchApp without state-reset side effects, runFlow file/inline with when.platform, onFlowStart/onFlowComplete, deterministic repeat.times, ordered trusted runScript, tapOn, doubleTapOn, longPressOn, inputText, pasteText, openLink, assertVisible, assertNotVisible, assertTrue literal true/false, extendedWaitUntil, scroll, absolute/percentage swipe, takeScreenshot, hideKeyboard, pressKey back/enter/home, back, waitForAnimationToEnd, stopApp/killApp, setAirplaneMode, setLocation, setOrientation, supported setPermissions targets, and startRecording/stopRecording. Unsupported syntax fails loudly with a link to https://github.com/callstackincubator/agent-device/issues/558"},{key:"replayEnv",names:["-e","--env"],type:"string",multiple:!0,usageLabel:"-e KEY=VALUE, --env KEY=VALUE",usageDescription:"Replay/Test: inject or override a ${KEY} variable for the script (repeatable)"},{key:"failFast",names:["--fail-fast"],type:"boolean",usageLabel:"--fail-fast",usageDescription:"Test: stop the suite after the first failing script"},{key:"timeoutMs",names:["--timeout"],type:"int",min:1,usageLabel:"--timeout <ms>",usageDescription:"Test: maximum wall-clock time per script attempt"},{key:"retries",names:["--retries"],type:"int",min:0,max:3,usageLabel:"--retries <n>",usageDescription:"Test: retry each failed script up to n additional times"},{key:"artifactsDir",names:["--artifacts-dir"],type:"string",usageLabel:"--artifacts-dir <path>",usageDescription:"Test: root directory for suite artifacts"},{key:"reportJunit",names:["--report-junit"],type:"string",usageLabel:"--report-junit <path>",usageDescription:"Test: write a JUnit XML report for the replay suite"},{key:"steps",names:["--steps"],type:"string",usageLabel:"--steps <json>",usageDescription:"Batch: JSON array of steps"},{key:"stepsFile",names:["--steps-file"],type:"string",usageLabel:"--steps-file <path>",usageDescription:"Batch: read steps JSON from file"},{key:"batchOnError",names:["--on-error"],type:"enum",enumValues:["stop"],usageLabel:"--on-error stop",usageDescription:"Batch: stop when a step fails"},{key:"batchMaxSteps",names:["--max-steps"],type:"int",min:1,max:1e3,usageLabel:"--max-steps <n>",usageDescription:"Batch: maximum number of allowed steps"},{key:"appsFilter",names:["--all"],type:"enum",enumValues:["user-installed","all"],setValue:"all",usageLabel:"--all",usageDescription:"Apps: include system/OEM apps"},{key:"snapshotInteractiveOnly",names:["-i"],type:"boolean",usageLabel:"-i",usageDescription:"Snapshot: interactive elements only"},{key:"snapshotCompact",names:["-c"],type:"boolean",usageLabel:"-c",usageDescription:"Snapshot: compact output (drop empty structure)"},{key:"snapshotDepth",names:["--depth","-d"],type:"int",min:0,usageLabel:"--depth, -d <depth>",usageDescription:"Snapshot: limit snapshot depth"},{key:"snapshotScope",names:["--scope","-s"],type:"string",usageLabel:"--scope, -s <scope>",usageDescription:"Snapshot: scope snapshot to label/identifier"},{key:"snapshotRaw",names:["--raw"],type:"boolean",usageLabel:"--raw",usageDescription:"Snapshot: raw node output"},{key:"snapshotForceFull",names:["--force-full"],type:"boolean",usageLabel:"--force-full",usageDescription:"Snapshot: re-emit the full tree even when unchanged"},{key:"findFirst",names:["--first"],type:"boolean",usageLabel:"--first",usageDescription:"Find: pick the first match when ambiguous"},{key:"findLast",names:["--last"],type:"boolean",usageLabel:"--last",usageDescription:"Find: pick the last match when ambiguous"},{key:"out",names:["--out"],type:"string",usageLabel:"--out <path>",usageDescription:"Output path"},{key:"overlayRefs",names:["--overlay-refs"],type:"boolean",usageLabel:"--overlay-refs",usageDescription:"Screenshot: draw current snapshot refs and target rectangles onto the saved PNG; diff screenshot: also write a separate current-screen overlay guide"},...d,{key:"baseline",names:["--baseline","-b"],type:"string",usageLabel:"--baseline, -b <path>",usageDescription:"Diff screenshot: path to baseline image file"},{key:"threshold",names:["--threshold"],type:"string",usageLabel:"--threshold <0-1>",usageDescription:"Diff screenshot: color distance threshold (default 0.1)"}],rh=new Set(["json","config","remoteConfig","stateDir","daemonBaseUrl","daemonAuthToken","daemonTransport","daemonServerMode","tenant","sessionIsolation","runId","leaseId","leaseBackend","sessionLock","sessionLocked","sessionLockConflicts","help","version","verbose","platform","target","device","udid","serial","iosSimulatorDeviceSet","androidDeviceAllowlist","session","noRecord"]),rf=new Map;for(let e of rp)for(let t of e.names)rf.set(t,e);function rm(e){return rf.get(e)}function rg(){return rp}let rw={auth:{usageOverride:"auth status|login|logout",listUsageOverride:"auth status|login|logout",helpDescription:"Manage cloud CLI authentication",summary:"Manage cloud authentication",positionalArgs:["status|login|logout"]},connect:{usageOverride:"connect [--remote-config <path>] [--tenant <id>] [--run-id <id>] [--lease-backend <backend>] [--force] [--no-login]",helpDescription:"Connect to a remote daemon, authenticate when needed, and save remote session state. AGENT_DEVICE_CLOUD_BASE_URL is the bridge/control-plane API origin; use AGENT_DEVICE_DAEMON_AUTH_TOKEN=adc_live_... for CI/service-token automation.",summary:"Connect to remote daemon",allowedFlags:["force","noLogin",...rl,"launchUrl"]},connection:{usageOverride:"connection status",listUsageOverride:"connection status",helpDescription:"Inspect active remote connection state",summary:"Inspect remote connection",positionalArgs:["status"]},disconnect:{helpDescription:"Disconnect remote daemon state, stop owned Metro companion, and release lease",summary:"Disconnect remote daemon",allowedFlags:["shutdown"]},mcp:{helpDescription:"Start the official stdio MCP server. It exposes structured command tools backed by the agent-device client.",summary:"Start MCP server"},"react-devtools":{usageOverride:"react-devtools [...args]",listUsageOverride:"react-devtools [...args]",helpDescription:"Run pinned agent-react-devtools commands for React Native performance profiling, component trees, props/state/hooks, and render analysis",summary:"Profile React Native performance and component renders",positionalArgs:["args?"],allowsExtraPositionals:!0}},rb={boot:{summary:"Boot target device/simulator",allowedFlags:["headless"]},open:{helpDescription:"Boot device/simulator; optionally launch app or deep link URL (macOS also supports --surface app|frontmost-app|desktop|menubar)",summary:"Open an app, deep link or URL, save replays",positionalArgs:["appOrUrl?","url?"],allowedFlags:["activity","launchConsole","saveScript","relaunch","surface"]},close:{positionalArgs:["app?"],allowedFlags:["saveScript","shutdown"]},reinstall:{positionalArgs:["app","path"]},install:{positionalArgs:["app","path"]},"install-from-source":{usageOverride:"install-from-source <url> | install-from-source --github-actions-artifact <owner/repo:artifact>",listUsageOverride:"install-from-source <url> | install-from-source --github-actions-artifact",helpDescription:"Install app from a URL or remote-resolved source",summary:"Install app from a source",positionalArgs:["url?"],allowedFlags:["header","githubActionsArtifact","installSource","retainPaths","retentionMs"]},apps:{helpDescription:"List user-installed apps; use --all to include system/OEM apps",summary:"List installed apps",allowedFlags:["appsFilter"],defaults:{appsFilter:_}},push:{positionalArgs:["bundleOrPackage","payloadOrJson"]},snapshot:{usageOverride:"snapshot [--diff] [-i] [-c] [-d <depth>] [-s <scope>] [--raw] [--force-full]",helpDescription:"Capture accessibility tree or diff against the previous session baseline",allowedFlags:["snapshotDiff",...rs,"snapshotForceFull"]},diff:{usageOverride:"diff snapshot | diff screenshot --baseline <path> [current.png] [--out <diff.png>] [--threshold <0-1>] [--overlay-refs]",helpDescription:"Diff accessibility snapshot or compare screenshots pixel-by-pixel",summary:"Diff snapshot or screenshot",positionalArgs:["kind","current?"],allowedFlags:[...rs,"baseline","threshold","out","overlayRefs"]},screenshot:{helpDescription:"Capture screenshot (macOS app sessions default to the app window; use --fullscreen for full desktop, --max-size to downscale, --overlay-refs to annotate current refs, or --no-stabilize for low-latency Android capture loops)",positionalArgs:["path?"],allowedFlags:p},appstate:{helpDescription:"Show foreground app/activity"},metro:{usageOverride:"metro prepare (--public-base-url <url> | --proxy-base-url <url>) [--project-root <path>] [--port <port>] [--kind auto|react-native|expo]\n agent-device metro reload [--metro-host <host>] [--metro-port <port>] [--bundle-url <url>]",listUsageOverride:"metro prepare --public-base-url <url> | --proxy-base-url <url>; metro reload",helpDescription:"Prepare a local Metro runtime or ask Metro to reload connected React Native apps",summary:"Prepare Metro or reload apps",positionalArgs:["prepare|reload"],allowedFlags:[...ru,...rl]},clipboard:{usageOverride:"clipboard read | clipboard write <text>",listUsageOverride:"clipboard read | clipboard write <text>",helpDescription:"Read or write device clipboard text",positionalArgs:["read|write","text?"],allowsExtraPositionals:!0},keyboard:{usageOverride:"keyboard [status|get|dismiss|enter|return]",helpDescription:"Inspect Android keyboard visibility/type or press/dismiss the device keyboard",summary:"Inspect, press, or dismiss the device keyboard",positionalArgs:["action?"]},back:{usageOverride:"back [--in-app|--system]",allowedFlags:["backMode"]},rotate:{usageOverride:"rotate <portrait|portrait-upside-down|landscape-left|landscape-right>",helpDescription:"Rotate device orientation on iOS and Android",positionalArgs:["orientation"]},wait:{usageOverride:"wait <ms>|text <text>|@ref|<selector> [timeoutMs]",positionalArgs:["durationOrSelector","timeoutMs?"],allowsExtraPositionals:!0,allowedFlags:[...ro]},get:{usageOverride:"get text|attrs <@ref|selector>",positionalArgs:["subcommand","target"],allowedFlags:[...ro]},find:{usageOverride:"find <locator|text> <action> [value] [--first|--last]",helpDescription:"Find by text/label/value/role/id and run action",summary:"Find an element and act",positionalArgs:["query","action","value?"],allowsExtraPositionals:!0,allowedFlags:["snapshotDepth","snapshotRaw","findFirst","findLast"]},is:{positionalArgs:["predicate","selector","value?"],allowsExtraPositionals:!0,allowedFlags:[...ro]},alert:{usageOverride:"alert [get|accept|dismiss|wait] [timeout]",positionalArgs:["action?","timeout?"]},click:{usageOverride:"click <x y|@ref|selector>",positionalArgs:["target"],allowsExtraPositionals:!0,allowedFlags:[...rc,"clickButton",...ro]},replay:{positionalArgs:["path"],allowedFlags:["replayMaestro",...rd,"timeoutMs"]},test:{usageOverride:"test <path-or-glob>...",listUsageOverride:"test <path-or-glob>...",helpDescription:"Run one or more replay scripts as a serial test suite",summary:"Run replay test suites",positionalArgs:["pathOrGlob"],allowsExtraPositionals:!0,allowedFlags:["replayMaestro",...rd,"failFast","timeoutMs","retries","artifactsDir","reportJunit"]},batch:{usageOverride:"batch [--steps <json> | --steps-file <path>]",listUsageOverride:"batch --steps <json> | --steps-file <path>",helpDescription:"Execute multiple commands in one daemon request",summary:"Run multiple commands",allowedFlags:["steps","stepsFile","batchOnError","batchMaxSteps","out"]},press:{usageOverride:"press <x y|@ref|selector>",positionalArgs:["targetOrX","y?"],allowsExtraPositionals:!0,allowedFlags:[...rc,...ro]},longpress:{usageOverride:"longpress <x y|@ref|selector> [durationMs]",positionalArgs:["targetOrX","yOrDurationMs?","durationMs?"],allowsExtraPositionals:!0,allowedFlags:[...ro]},swipe:{helpDescription:"Swipe coordinates with optional repeat pattern",positionalArgs:["x1","y1","x2","y2","durationMs?"],allowedFlags:["count","pauseMs","pattern"]},gesture:{usageOverride:"gesture <pan|fling|pinch|rotate|transform> ...",listUsageOverride:"gesture <pan|fling|pinch|rotate|transform> ...",helpDescription:"Run touch gestures: pan <x> <y> <dx> <dy> [durationMs], fling <up|down|left|right> <x> <y> [distance] [durationMs], pinch <scale> [x] [y], rotate <degrees> [x] [y] [velocity], or transform <x> <y> <dx> <dy> <scale> <degrees> [durationMs]",summary:"Run pan, fling, pinch, rotate, or transform gestures",positionalArgs:["pan|fling|pinch|rotate|transform","args?"],allowsExtraPositionals:!0},focus:{positionalArgs:["x","y"]},type:{positionalArgs:["text"],allowsExtraPositionals:!0,allowedFlags:["delayMs"]},fill:{usageOverride:"fill <x> <y> <text> | fill <@ref|selector> <text>",positionalArgs:["targetOrX","yOrText","text?"],allowsExtraPositionals:!0,allowedFlags:[...ro,"delayMs"]},scroll:{usageOverride:"scroll <direction|top|bottom> [amount] [--pixels <n>]",helpDescription:"Scroll in direction, or verify hidden content and scroll toward top/bottom",summary:"Scroll in a direction or to an edge",positionalArgs:["directionOrEdge","amount?"],allowedFlags:["pixels"]},"trigger-app-event":{usageOverride:"trigger-app-event <event> [payloadJson]",positionalArgs:["event","payloadJson?"]},record:{usageOverride:"record start [path] [--fps <n>] [--quality <5-10>] [--hide-touches] | record stop",listUsageOverride:"record start [path] | record stop",helpDescription:"Start/stop screen recording",summary:"Start or stop screen recording",positionalArgs:["start|stop","path?"],allowedFlags:["fps","quality","hideTouches"]},"react-native":{usageOverride:"react-native dismiss-overlay",listUsageOverride:"react-native dismiss-overlay",positionalArgs:["dismiss-overlay"]},trace:{usageOverride:"trace start <path> | trace stop <path>",listUsageOverride:"trace start <path> | trace stop <path>",helpDescription:"Start/stop trace log capture; when an artifact path is requested, pass the same positional path to start and stop",summary:"Start or stop trace capture",positionalArgs:["start|stop","path?"]},logs:{usageOverride:"logs path | logs start | logs stop | logs clear [--restart] | logs doctor | logs mark [message...]",helpDescription:"Session app log info, start/stop streaming, diagnostics, and markers",summary:"Manage session app logs",positionalArgs:["path|start|stop|clear|doctor|mark","message?"],allowsExtraPositionals:!0,allowedFlags:["restart"]},network:{usageOverride:"network dump [limit] [summary|headers|body|all] [--include summary|headers|body|all] | network log [limit] [summary|headers|body|all] [--include summary|headers|body|all]",helpDescription:"Dump recent HTTP(s) traffic parsed from the session app log",summary:"Show recent HTTP traffic",positionalArgs:["dump|log","limit?","include?"],allowedFlags:["networkInclude"]},settings:{usageOverride:ec,listUsageOverride:"settings [area] [options]",helpDescription:"Toggle OS settings, animation scales, appearance, and app permissions (macOS supports only settings appearance <light|dark|toggle> and settings permission <grant|reset> <accessibility|screen-recording|input-monitoring>; wifi|airplane|location|animations remain unsupported on macOS; mobile permission actions use the active session app)",summary:"Change OS settings and app permissions",positionalArgs:["setting","state","target?","mode?"]},session:{usageOverride:"session list",positionalArgs:["list?"]}},ry=new Map(C().map(e=>[e.name,{helpDescription:e.description}]));function rv(e){if(e)return rx(e)}function rk(e){let t=rx(e);if(!t)throw Error(`Missing command schema for ${e}`);return t}function rx(e){let t=Object.hasOwn(rw,e)?rw[e]:void 0;if(t)return t;let n=ry.get(e),a=Object.hasOwn(rb,e)?rb[e]:void 0;if(n)return a?{...n,...a}:n}function rA(e,t){let n=rv(e);if(!n?.defaults)return!1;let a=!1;for(let[e,r]of Object.entries(n.defaults))void 0===t[e]&&(t[e]=r,a=!0);return a}export{rh as GLOBAL_FLAG_KEYS,eE as PNG,ed as SETTINGS_INVALID_ARGS_MESSAGE,rA as applyCommandDefaults,Y as buildMobileSnapshotPresentation,tV as buildSnapshotDisplayLines,ew as captureScrollEdgeState,re as createAgentDevice,eX as decodePng,H as deriveMobileSnapshotHiddenContentHints,tZ as detectReactNativeOverlay,X as displayNodeLabel,no as evaluateIsPredicate,eg as findMistargetedTypeRefToken,ey as formatScrollEdgeMessage,tq as formatSnapshotLine,rk as getCliCommandSchema,rv as getCommandSchema,rm as getFlagDefinition,rg as getFlagDefinitions,eh as getUnsupportedMacOsSettingMessage,V as inferVerticalScrollIndicatorDirections,em as isKeyboardAction,ep as isMacOsSettingSupported,eN as isReactNativeCollapsedWarningLabel,ns as isSupportedPredicate,G as isSystemScrollIndicatorLabel,rn as localCommandPolicy,q as normalizeSnapshotTree,rr as parseSessionSurface,eI as requireIntInRange,nR as resolveActionableTouchNode,nP as resolveActionableTouchResolution,tQ as resolveReactNativeOverlayDismissTarget,nI as resolveRectCenter,eb as runScrollEdgePasses};
|