agent-device 0.18.2 → 0.18.3
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.18.2.apk → agent-device-android-multitouch-helper-0.18.3.apk} +0 -0
- package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.18.3.apk.sha256 +1 -0
- package/android-multitouch-helper/dist/{agent-device-android-multitouch-helper-0.18.2.manifest.json → agent-device-android-multitouch-helper-0.18.3.manifest.json} +4 -4
- package/android-snapshot-helper/dist/{agent-device-android-snapshot-helper-0.18.2.apk → agent-device-android-snapshot-helper-0.18.3.apk} +0 -0
- package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.18.3.apk.sha256 +1 -0
- package/android-snapshot-helper/dist/{agent-device-android-snapshot-helper-0.18.2.manifest.json → agent-device-android-snapshot-helper-0.18.3.manifest.json} +6 -6
- package/dist/src/2948.js +3 -3
- package/dist/src/9581.js +3 -3
- package/dist/src/9722.js +38 -37
- package/dist/src/cli-help.js +6 -1
- package/dist/src/cli.js +1 -1
- package/dist/src/index.d.ts +19 -1
- package/dist/src/internal/bin.js +1 -1
- package/dist/src/lease.js +1 -1
- package/dist/src/session.js +11 -11
- package/package.json +1 -1
- package/server.json +2 -2
- package/skills/agent-device/SKILL.md +2 -0
- package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.18.2.apk.sha256 +0 -1
- package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.18.2.apk.sha256 +0 -1
package/dist/src/2948.js
CHANGED
|
@@ -25,6 +25,6 @@ ${b}${p.map(e=>JSON.stringify(e)).join("\n")}
|
|
|
25
25
|
${b}${eS(S,{summarizeTextSurfaces:!0}).flatMap(e=>[ek(e.node,0,!1,e.type,{summarizeTextSurfaces:!0}),...e5({...e,depth:0})]).join("\n")}${eq(w)}
|
|
26
26
|
`:`${g}${D}
|
|
27
27
|
${b}${(function(e){let t=[],r=[],n=new Map(e.map(e=>[e.node.index,e.node])),i=e=>{for(var i,a,o;r.length>0&&(!e||(i=e,a=r[r.length-1],o=n,!function(e,t,r){let n=e;for(;"number"==typeof n.parentIndex;){if(n.parentIndex===t.index)return!0;let e=r.get(n.parentIndex);if(!e)break;n=e}return!1}(i.node,a.node,o)&&i.depth<=a.depth));)t.push(...e5(r.pop(),"below"))};for(let n of e)i(n),t.push(n.text),t.push(...e5(n,"above")),n.node.hiddenContentBelow&&r.push(n);return i(),t})(eS(S,{summarizeTextSurfaces:!0})).join("\n")}${eq(w)}
|
|
28
|
-
`}(a,{raw:r.raw,flatten:r.interactiveOnly,scoped:"string"==typeof r.scope&&r.scope.trim().length>0,depthLimited:"number"==typeof r.depth})}}},{name:nK,metadata:nX,definition:nJ,cliSchema:{helpDescription:"Capture screenshot (web defaults to the viewport; use --fullscreen, --full, or -f for the entire page. macOS app sessions default to the app window; use --fullscreen for full desktop, --max-size to downscale, --overlay-refs to annotate current refs, --normalize-status-bar for deterministic iOS simulator chrome, or --no-stabilize for low-latency Android capture loops)",summary:"Capture screenshot with optional web full-page, desktop, downscale, or ref overlay modes",positionalArgs:["path?"],allowedFlags:["out","overlayRefs","screenshotFullscreen","screenshotMaxSize","screenshotNoStabilize","screenshotNormalizeStatusBar"]},cliReader:(e,t)=>({...tZ(t),path:e[0]??t.out,...rv(t)}),daemonWriter:e=>tQ(L.screenshot,rn(e.path),{...e,...rw(e)})},{name:nz,metadata:nq,definition:nG,cliSchema:nW,cliReader:(e,t)=>{if("snapshot"!==e[0])throw new A("INVALID_ARGS","Only diff snapshot is available through this parser.");return{...tZ(t),kind:"snapshot",out:t.out,interactiveOnly:t.snapshotInteractiveOnly,depth:t.snapshotDepth,scope:t.snapshotScope,raw:t.snapshotRaw}},daemonWriter:nH},{name:i$,metadata:iM,definition:iR,cliSchema:{usageOverride:"wait <ms>|text <text>|@ref|<selector> [timeoutMs]",positionalArgs:["durationOrSelector","timeoutMs?"],allowsExtraPositionals:!0,allowedFlags:[...nw]},cliReader:(e,t)=>(function(e,t){let r=iD(e);if(!r)throw new A("INVALID_ARGS","wait requires <ms>, text <text>, @ref, or <selector> [timeoutMs].");let n={...t0(t),...t2(t)};if("sleep"===r.kind)return{...n,durationMs:r.durationMs};if("text"===r.kind){if(!r.text)throw new A("INVALID_ARGS","wait requires text.");return{...n,text:r.text,...iN(r.timeoutMs)}}return"ref"===r.kind?{...n,ref:r.rawRef,...iN(r.timeoutMs)}:{...n,selector:r.selectorExpression,...iN(r.timeoutMs)}})(e,t),daemonWriter:tY(L.wait,e=>(function(e){if(1!==[void 0!==e.durationMs?"durationMs":void 0,void 0!==e.text?"text":void 0,void 0!==e.ref?"ref":void 0,void 0!==e.selector?"selector":void 0].filter(Boolean).length)throw new A("INVALID_ARGS","wait command requires exactly one of durationMs, text, ref, or selector.");if(void 0!==e.durationMs)return[String(e.durationMs)];let t=ri(e.timeoutMs);if(void 0!==e.text)return["text",e.text,...t];if(void 0!==e.ref)return[e.ref,...t];let r=e.selector;if(!X(r))throw new A("INVALID_ARGS",`Invalid wait selector: ${r}`);return[r,...t]})(e)),cliOutputFormatter:rf},{name:nj,metadata:nU,definition:nB,cliSchema:{usageOverride:"alert [get|accept|dismiss|wait] [timeout]",positionalArgs:["action?","timeout?"]},cliReader:(e,t)=>({...tZ(t),...function(e){if(e.length>2)throw new A("INVALID_ARGS","alert accepts at most action and timeout arguments.");return tW({action:function(e){let t=e?.toLowerCase();if(void 0===t||"get"===t||"accept"===t||"dismiss"===t||"wait"===t)return t;throw new A("INVALID_ARGS","alert action must be get, accept, dismiss, or wait.")}(e[0]),timeoutMs:function(e,t){if(void 0===e)return;let r=Number(e);if(Number.isFinite(r))return r;throw new A("INVALID_ARGS",`${t} must be a finite number.`)}(e[1],"alert timeout")})}(e)}),daemonWriter:nV,cliOutputFormatter:rf},{name:io,metadata:is,definition:il,cliSchema:{usageOverride:n9,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?"]},cliReader:(e,t)=>(function(e,t){let r=t0(t),n=e[0],i=e[1];if(re(n,ic)&&re(i,id))return{...r,setting:n,state:i};if("location"===n&&"set"===i)return{...r,setting:n,state:i,latitude:ir(e[2],"latitude"),longitude:ir(e[3],"longitude")};if("appearance"===n&&re(i,ip)||re(n,im)&&re(i,ih)||"fingerprint"===n&&re(i,ig))return{...r,setting:n,state:i};if("permission"===n&&re(i,iy))return{...r,setting:n,state:i,permission:function(e){if(re(e,ib))return e;throw new A("INVALID_ARGS","settings permission requires a permission target.")}(e[2]),mode:function(e){if(void 0===e||"full"===e||"limited"===e)return e;throw new A("INVALID_ARGS","settings permission mode must be full or limited.")}(e[3])};if("clear-app-state"===n){let t="clear"===i?e[2]:i;return{...r,setting:n,state:"clear",app:t}}throw new A("INVALID_ARGS","Invalid settings arguments.")})(e,t),daemonWriter:iu}]}),iO={debug:rm(function(e){let t=[e.outPath,e.message];for(let r of(t.push(...function(e){let t=e.crash,r=[`Crash: ${t.appName??"unknown app"}${void 0===t.crashedThread?"":` thread ${t.crashedThread}`}`];for(let e of(t.bundleId&&r.push(`Bundle: ${t.bundleId}`),t.exceptionType&&r.push(`Exception: ${t.exceptionType}`),t.terminationReason&&r.push(`Termination: ${t.terminationReason}`),t.topFrames))r.push(`Frame ${e.index}: ${e.image} ${e.symbol??e.address}`);for(let e of t.findings)r.push(`Finding: ${e}`);return r}(e)),e.matchedImages))t.push(`Matched: ${r.name} ${r.uuid}${r.arch?` ${r.arch}`:""}`);for(let r of e.warnings??[])t.push(`Warning: ${r}`);return{data:e,text:t.join("\n")}})},iP="debug",iC=n_(iP,"Symbolicate crash artifacts with matching debug symbols.",{action:ty(tS(["symbols"])),artifact:ty(tb("Apple crash artifact path (.ips, .crash, or .log).")),dsym:tb("Path to a matching .dSYM bundle."),searchPath:tb("Directory to scan for matching .dSYM bundles."),out:tb("Output path for the symbolicated artifact.")}),iF=ru(iC,(e,t)=>e.debug.symbols(t)),iE=rs({name:"debugging",commands:[{name:iP,metadata:iC,definition:iF,cliSchema:{usageOverride:"debug symbols --artifact <crash.ips|crash.log> (--dsym <App.dSYM> | --search-path <dir>) [--out <symbolicated>]",listUsageOverride:"debug",helpDescription:"Symbolicate Apple crash artifacts with matching dSYM UUIDs. This debug namespace is intentionally narrow: use logs for app logs, network for HTTP evidence, perf for performance samples, record/trace for media and traces, and react-devtools for React Native profiles.",summary:"Symbolicate Apple crash artifacts with dSYMs; use logs/network/perf for other diagnostics",positionalArgs:["symbols"],allowedFlags:["artifact","dsym","searchPath","out"]},cliReader:(e,t)=>({...tZ(t),action:function(e){if("symbols"===e)return e;throw new A("INVALID_ARGS","debug supports only symbols; use logs, network, perf, record, trace, or react-devtools for other diagnostics")}(e[0]),artifact:t.artifact,dsym:t.dsym,searchPath:t.searchPath,out:t.out}),cliOutputFormatter:iO.debug}]});function iT(e){return e?.clickButton??"primary"}function i_(e){return"primary"===e.button?null:"click"!==e.commandLabel?new A("INVALID_ARGS","--button is supported only for click"):"macos"!==e.platform&&"linux"!==e.platform?new A("UNSUPPORTED_OPERATION",`click --button ${e.button} is supported only on macOS and Linux`):"macos"===e.platform&&"middle"===e.button?new A("UNSUPPORTED_OPERATION","click --button middle is not supported by the macOS runner yet"):"number"==typeof e.count||"number"==typeof e.intervalMs||"number"==typeof e.holdMs||"number"==typeof e.jitterPx||!0===e.doubleTap?new A("INVALID_ARGS",`click --button ${e.button} does not support repeat or gesture modifier flags`):null}function ij(e){return"primary"===e?{}:{button:e}}function iU(e,t="scroll accepts either a relative amount or --pixels, not both"){if(void 0!==e.amount&&void 0!==e.pixels)throw new A("INVALID_ARGS",t)}function iB(e,t={}){if(void 0===e)return;let r=t.field??"scroll durationMs",n=t.max??1e4,i=t.invalidMessage??`${r} must be a non-negative integer`;if(!Number.isFinite(e)||!Number.isInteger(e)||e<0)throw new A("INVALID_ARGS",i);if(e>n)throw new A("INVALID_ARGS",`${r} must be a non-negative integer at most ${n}`);return e}function iV(e){return"number"==typeof e?.durationMs?e.durationMs:void 0}let iz=["up","down","left","right"],iq=["left","right","left-edge","right-edge"],iG=["one-way","ping-pong"],iW=r5(iq,{message:"gesture swipe requires left, right, left-edge, or right-edge"}),iH=r5(iz,{message:e=>`Unknown direction: ${e}`});function iK(e){let t=e.direction,r="up"===t||"down"===t?e.referenceHeight:e.referenceWidth,n=i3(e.amount),i=void 0!==e.pixels?i4(e.pixels):Math.round(r*n),a=Math.max(1,Math.round(.05*r)),o=Math.max(1,Math.min(i,Math.max(1,r-2*a))),s=Math.round(o/2),l=Math.round(e.referenceWidth/2),u=Math.round(e.referenceHeight/2),c=(r,n,i,a)=>({direction:t,x1:r,y1:n,x2:i,y2:a,referenceWidth:e.referenceWidth,referenceHeight:e.referenceHeight,amount:e.amount,pixels:o});switch(t){case"up":return c(l,u-s,l,u+s);case"down":return c(l,u+s,l,u-s);case"left":return c(l-s,u,l+s,u);case"right":return c(l+s,u,l-s,u)}}function iX(e){i3(e.amount),void 0!==e.pixels&&i4(e.pixels)}function iJ(e){return{...iK({...e,direction:function(e){switch(e){case"up":return"down";case"down":return"up";case"left":return"right";case"right":return"left"}}(e.direction)}),direction:e.direction}}function iY(e,t,r={}){let n=r.marginPx??8,[i,a,o]="left"===e?[85,15,50]:"right"===e?[15,85,50]:"left-edge"===e?[99,15,50]:[1,85,50],s=i0(t,i,o,{marginPx:n}),l=i0(t,a,o,{marginPx:n});return{preset:e,x1:s.x,y1:s.y,x2:l.x,y2:l.y,referenceWidth:t.referenceWidth,referenceHeight:t.referenceHeight}}function iQ(e){return iW.parse(e)}function iZ(e){let t=function(e){let t=e.filter(e=>(function(e){if(!e)return!1;let t=e.toLowerCase();return t.includes("application")||t.includes("window")})(e.type)&&i5(e.rect)).map(e=>e.rect).sort((e,t)=>(t?.width??0)*(t?.height??0)-(e?.width??0)*(e?.height??0))[0];if(t)return t;let r=e.map(e=>e.rect).filter(i5);if(0===r.length)return;let n=Math.max(...r.map(e=>e.x+e.width)),i=Math.max(...r.map(e=>e.y+e.height));if(!(n<=0)&&!(i<=0))return{x:0,y:0,width:n,height:i}}(e);if(t)return{referenceWidth:t.width,referenceHeight:t.height}}function i0(e,t,r,n={}){let i={x:Math.round(e.referenceWidth*t/100),y:Math.round(e.referenceHeight*r/100)};return void 0===n.marginPx?i:i1(i,e,n.marginPx)}function i1(e,t,r){return{x:i8(e.x,r,t.referenceWidth),y:i8(e.y,r,t.referenceHeight)}}function i2(e){return iH.parse(e)}function i5(e){return!!e&&e.width>0&&e.height>0}function i3(e){if(void 0===e)return .6;if(!Number.isFinite(e)||e<=0)throw new A("INVALID_ARGS","scroll amount must be a positive number");return e}function i4(e){if(!Number.isFinite(e)||e<=0)throw new A("INVALID_ARGS","scroll pixels must be a positive integer");return Math.max(1,Math.round(e))}function i8(e,t,r){let n=Math.max(t,r-t);return i6(e,t,n)}function i6(e,t,r){return Math.min(Math.round(r),Math.max(Math.round(t),Math.round(e)))}function i9(e,t,r,n){if(!Number.isFinite(e)||!Number.isInteger(e)||e<r||e>n)throw new A("INVALID_ARGS",`${t} must be an integer between ${r} and ${n}`);return e}async function i7(e){let{edge:t,target:r={},scope:n,captureNodes:i}=e;try{let e=await i(n),a=function(e,t,r={}){var n,i,a;let o,s=(e??[]).map((e,t)=>({...e,ref:"ref"in e&&e.ref?e.ref:`e${t+1}`}));if(0===s.length)return{canScroll:!1,emptySnapshot:!0,signature:""};let l=eF(s),u=function(e,t,r,n){let i=new Map(e.map(e=>[e.index,e])),a=e.filter(e=>eP(e)&&as(e.rect));if(0===a.length)return null;let o=function(e,t){if(void 0===e)return null;let r=t.get(e);for(;r;){if(eP(r)&&as(r.rect))return r;r=void 0===r.parentIndex?void 0:t.get(r.parentIndex)}return null}(n.nodeIndex,i);if(o)return o;let s=n.point;if(s){let e=a.filter(e=>{var t,r;return e.rect&&(t=e.rect,(r=s).x>=t.x&&r.x<=t.x+t.width&&r.y>=t.y&&r.y<=t.y+t.height)}).sort(ai);if(e.length>0)return e.find(e=>ar(e,t.get(e.index),r))??e[0]??null}let l=a.filter(e=>ar(e,t.get(e.index),r)).sort(aa);return l.length>0?l[0]??null:a.filter(t=>eT(t,e)).sort(aa)[0]??a.sort(aa)[0]??null}(s,l,t,r),c=(u?(n=s,i=u.index,o=new Map(n.map(e=>[e.index,e])),n.filter(e=>e.index===i||function(e,t,r){let n=void 0===e.parentIndex?void 0:r.get(e.parentIndex);for(;n;){if(n.index===t)return!0;n=void 0===n.parentIndex?void 0:r.get(n.parentIndex)}return!1}(e,i,o))):s).map(e=>{let t=e.rect?["x","y","width","height"].map(t=>{var r;return r=e.rect?.[t],"number"==typeof r&&Number.isFinite(r)?r.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:ar(u,l.get(u.index),t),emptySnapshot:!1,signature:c,scope:[(a=u).identifier,a.label,a.value].map(e=>"string"==typeof e?e.trim():"").find(an)}:{canScroll:!1,emptySnapshot:!1,signature:c}}(e,t,r);if(n&&a.emptySnapshot)return await i7({edge:t,target:r,captureNodes:i});return a}catch(e){var a,o,s;throw a=t,o=n,s=e,o?new A("COMMAND_FAILED",`Failed to verify scroll ${a} state for scoped container`,{scope:o,hint:`scroll ${a} could not verify the scoped scroll container. Run snapshot -i for the current screen and retry with a visible scroll target.`},s):new A("COMMAND_FAILED",`Failed to verify scroll ${a} state`,{hint:`scroll ${a} needs a snapshot showing hidden content ${"bottom"===a?"below":"above"} before it will move.`},s)}}async function ae(e){let t,{edge:r,captureState:n,scroll:i}=e,a=await n();a.scope&&(a=await n(a.scope));let o=0;for(;a.canScroll;){if(o>=40)throw new A("COMMAND_FAILED",`scroll ${r} reached the safety limit before the snapshot showed the edge`,{hint:"The scoped scroll container still reports hidden content. Use a smaller manual scroll + snapshot loop to inspect the current state."});t=await i(),o+=1,a=await n(a.scope)}return{passes:o,result:t}}function at(e,t,r,n,i){return t&&0===r?`Already at ${t}; no hidden content ${"bottom"===t?"below":"above"} detected`:t?`Scrolled to ${t} with ${r} ${e} passes`:void 0!==i?`Scrolled ${e} by ${i}px`:void 0!==n?`Scrolled ${e} by ${n}`:`Scrolled ${e}`}function ar(e,t,r){return"bottom"===r?!0===e.hiddenContentBelow||t?.hiddenContentBelow===!0:!0===e.hiddenContentAbove||t?.hiddenContentAbove===!0}function an(e){return e.length>0&&e.length<=80&&!/^(true|false)$/i.test(e)&&!/^\d+$/.test(e)&&!/^\d+%$/.test(e)}function ai(e,t){return ao(e.rect)-ao(t.rect)}function aa(e,t){return ao(t.rect)-ao(e.rect)}function ao(e){return e?e.width*e.height:0}function as(e){return!!(e&&e.width>0&&e.height>0)}function al(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}function au(e){return e.clock?.now()??Date.now()}async function ac(e,t){e.clock?await e.clock.sleep(t):await new Promise(e=>setTimeout(e,t))}function ad(e){return e&&"object"==typeof e?e:void 0}let ap=["x","y","width","height"];function am(e){let t=af(e);if(!t)return null;let r=x(t);return Number.isFinite(r.x)&&Number.isFinite(r.y)?r:null}function af(e){if(!e)return null;let t=Number(e.x),r=Number(e.y),n=Number(e.width),i=Number(e.height);return Number.isFinite(t)&&Number.isFinite(r)&&Number.isFinite(n)&&Number.isFinite(i)&&!(n<0)&&!(i<0)?{x:t,y:r,width:n,height:i}:null}function ah(e,t){return!!e&&!!t&&ap.every(r=>.5>=Math.abs(e[r]-t[r]))}function ag(e){return{x:ay(e.x,e.width),y:ay(e.y,e.height)}}function ay(e,t){if(t<=1)return Math.floor(e);let r=Math.ceil(e);return Math.round(Math.min(Math.floor(e+t-1),Math.max(r,e+t/2)))}let ab=["tabbar","toolbar","navigationbar","bottomnavigation","bottomnavigationview","sheet","dialog","alert","popover","menu"],av=["button","link","menuitem","tabitem","textfield","searchfield","edittext","checkbox","radio","switch","cell"];function aw(e){if(e.length<2)return e;let t=[...e],r={nodes:t,byIndex:new Map(t.map(e=>[e.index,e]))},n=!1;for(let[e,i]of t.entries()){if(!function(e){return!!aD(e.rect)&&(!!(!0===e.hittable||aS(e,av))||!!(e.label?.trim()||e.value?.trim()||e.identifier?.trim()))}(i)||!function e(t,r,n){let i=aD(n.rect);if(!i)return null;let a=x(i);for(let o=r+1;o<t.nodes.length;o+=1){let r=t.nodes[o];if(r&&function(t,r,n,i,a){if(!t.nodes[r])return!1;let o=function(t,r,n,i){var a,o,s,l;let u=t.nodes[r];if(!u||!(!(!aD((a=u).rect)||function(e){let t=ak(e);return t.includes("application")||t.includes("window")}(a))&&aS(a,ab))||aI(o=n,s=u,l=t.byIndex)||aI(s,o,l))return null;let c=aD(u.rect);return!c||ah(i,c)||e(t,r,u)?null:c}(t,r,n,i);return!!(o&&eR(o,a.x,a.y))}(t,o,n,i,a))return r}return null}(r,e,i))continue;n=!0;let a={...i,hittable:!1,interactionBlocked:"covered",presentationHints:Array.from(new Set([...i.presentationHints??[],"covered"]))};t[e]=a,r.byIndex.set(a.index,a)}return n?t:e}function ax(e){return void 0!==e.interactionBlocked}function aS(e,t){let r=ak(e);return t.some(e=>r.includes(e))}function ak(e){return[e.type,e.role,e.subrole].map(e=>p(e??"")).join(" ")}function aI(e,t,r){let n="number"==typeof t.parentIndex?r.get(t.parentIndex):void 0,i=new Set;for(;n&&!i.has(n.index);){if(n.index===e.index)return!0;i.add(n.index),n="number"==typeof n.parentIndex?r.get(n.parentIndex):void 0}return!1}function aD(e){let t=af(e);return t&&t.width>0&&t.height>0?t:null}function aA(e){return e}function a$(e){let t=1/0,r=1/0,n=-1/0,i=-1/0;for(let a of e)t=Math.min(t,a.x),r=Math.min(r,a.y),n=Math.max(n,a.x+a.width),i=Math.max(i,a.y+a.height);return{x:t,y:r,width:n-t,height:i-r}}function aM(e,t){return{x:e.x-t,y:e.y-t,width:e.width+2*t,height:e.height+2*t}}function aR(e,t){let r=Math.max(e.x,t.x),n=Math.max(e.y,t.y),i=Math.min(e.x+e.width,t.x+t.width),a=Math.min(e.y+e.height,t.y+t.height);return i<=r||a<=n?0:(i-r)*(a-n)}function aN(e){return{x:e.x+e.width/2,y:e.y+e.height/2}}function aL(e,t){return(e.x-t.x)**2+(e.y-t.y)**2}function aO(e,t,r){return Math.min(Math.max(e,t),r)}let aP=["button","link","menuitem","tabitem","textfield","searchfield","securetextfield","checkbox","radio","switch","cell"];function aC(e,t){return aF(e,t).node}function aF(e,t){var r;if(ax(t))return{node:t,reason:"covered"};let n=function(e,t){let r=af(t.rect);if(!r)return null;let n=t,i=new Set;for(;!i.has(n.ref);){i.add(n.ref);let t=e.filter(e=>{if(e.parentIndex!==n.index||!e.hittable||ax(e))return!1;let t=af(e.rect);return!!t&&ah(t,r)});if(1!==t.length)break;n=t[0]}return n===t?null:n}(e,t);if(n?.rect&&am(n.rect))return{node:n,reason:"same-rect-descendant"};if([(r=t).type,r.role,r.subrole].map(e=>p(e??"")).some(aE)&&t.rect&&am(t.rect))return{node:t,reason:"semantic-target"};let i=a(e,t);return i?.rect&&!ax(i)&&am(i.rect)?!function(e,t,r){var n,i;let a,o,s,l=af(e.rect),u=af(t.rect);if(!l||!u)return!1;let c=function(e,t){let r=x(t),n=e.filter(e=>{let t=(e.type??"").toLowerCase();return t.includes("application")||t.includes("window")}).map(e=>af(e.rect)).filter(e=>null!==e);if(0===n.length)return null;let i=n.filter(e=>eR(e,r.x,r.y));return eN(i.length>0?i:n)}(r,l);return!!c&&(a=aR(n=u,i=c),o=n.width*n.height,s=i.width*i.height,!(a<=0)&&!(o<=0)&&!(s<=0)&&!!(a/s>=.9)&&!!(a/o>=.8))&&!ah(l,u)}(t,i,e)?{node:i,reason:"hittable-ancestor"}:{node:t,reason:"overly-broad-ancestor"}:{node:t,reason:"original"}}function aE(e){return"tab"===e||aP.some(t=>e.includes(t))}async function aT(e,t,r){var n;return(await aG(e,t,r.action),"point"===t.target.kind)?{kind:"point",point:{x:(n=t.target).x,y:n.y}}:"ref"===t.target.kind?await a_(e,t,t.target,r):await aj(e,t,t.target,r)}async function a_(e,t,r,n){let i=await aH(e,t,r),a=i.resolved,s=n.promoteToHittableAncestor?aB(i.snapshot.nodes,a.node,{action:n.action,label:`Ref ${r.ref}`}):a.node;return aV(s,`Ref ${r.ref}`,n.action),function(e,t,r,n){let i=e.rect?e_(e,t):null;if(!(!e.rect||!i||eT(e,t)))throw new A("COMMAND_FAILED",`Ref ${r} is off-screen and not safe to ${n}`,{reason:"offscreen_ref",ref:m(r),rect:e.rect,viewport:i,hint:`Use scroll with the direction from the off-screen summary, take a fresh snapshot, then retry ${n} with the new ref or a selector.`})}(s,i.snapshot.nodes,r.ref,n.action),{kind:"ref",point:aX(s,`Ref ${r.ref} not found or has invalid bounds`),target:{kind:"ref",ref:`@${a.ref}`},node:s,selectorChain:o(s,e.backend.platform,{action:"fill"===n.action?"fill":"click"}),refLabel:u(s,i.snapshot.nodes)}}async function aj(e,t,r,n){let i=J(r.selector),a=await aq(e,t,n.requireInteractive),l=s(aU(a.snapshot.nodes),i,{platform:e.backend.platform,requireRect:!0,requireUnique:!0,disambiguateAmbiguous:!0});if(l&&l.node.rect||!n.requireInteractive||(l=s(aU((a=await aq(e,t,!1)).snapshot.nodes),i,{platform:e.backend.platform,requireRect:!0,requireUnique:!0,disambiguateAmbiguous:!0})),!l||!l.node.rect){let t=s(a.snapshot.nodes,i,{platform:e.backend.platform,requireRect:!0,requireUnique:!1});if(t?.node&&ax(t.node))throw az({label:`Selector ${t.selector.raw}`,node:t.node,action:n.action,selector:t.selector.raw});throw new A("COMMAND_FAILED",d(i,l?.diagnostics??[],{unique:!0}))}let c=n.promoteToHittableAncestor?aB(a.snapshot.nodes,l.node,{action:n.action,label:`Selector ${l.selector.raw}`}):l.node;return aV(c,`Selector ${l.selector.raw}`,n.action),{kind:"selector",point:aX(c,`Selector ${l.selector.raw} resolved to invalid bounds`),target:{kind:"selector",selector:l.selector.raw},node:c,selectorChain:o(c,e.backend.platform,{action:"fill"===n.action?"fill":"click"}),refLabel:u(c,a.snapshot.nodes)}}function aU(e){return e.filter(e=>!ax(e))}function aB(e,t,r){let n=aF(e,t);if("covered"===n.reason)throw az({label:r.label,node:t,action:r.action});return n.node}function aV(e,t,r){if(ax(e))throw az({label:t,node:e,action:r})}function az(e){return new A("COMMAND_FAILED",`${e.label} is covered by another visible element and cannot ${function(e){switch(e){case"fill":return"be filled";case"focus":return"be focused";case"longPress":return"be long-pressed";default:return"be tapped"}}(e.action)} safely`,{hint:"Use a different visible target, scroll it clear of the overlay, or inspect with snapshot/screenshot before retrying.",...e.selector?{selector:e.selector}:{},ref:`@${e.node.ref}`,interactionBlocked:e.node.interactionBlocked})}async function aq(e,t,r){if(!e.backend.captureSnapshot)throw new A("UNSUPPORTED_OPERATION","snapshot is not supported by this backend");let n=t.session??"default",i=await e.sessions.get(n);if(!i)throw new A("SESSION_NOT_FOUND","No active session. Run open first.");let a=await e.backend.captureSnapshot(al(e,t),{interactiveOnly:r,includeRects:!0}),o=a.snapshot??{nodes:a.nodes??[],truncated:a.truncated,backend:a.backend,createdAt:au(e)};return await e.sessions.set({...i,snapshot:o}),{snapshot:o}}async function aG(e,t,r){if("macos"!==e.backend.platform)return;let n=await aW(e,t);if(("desktop"===n||"menubar"===n)&&("menubar"!==n||"click"!==r&&"press"!==r))throw new A("UNSUPPORTED_OPERATION",`${r} is not supported on macOS ${n} sessions yet. Open an app session to act, or use the ${n} surface to inspect.`)}async function aW(e,t){let r=await e.sessions.get(t.session??"default");return r?.metadata?.surface}async function aH(e,t,r){let n=t.session??"default",i=await e.sessions.get(n);if(!i)throw new A("SESSION_NOT_FOUND","No active session. Run open first.");if(!i.snapshot)throw new A("INVALID_ARGS","No snapshot in session. Run snapshot first.");let a=r.fallbackLabel??"",o=aK(i.snapshot.nodes,r.ref,{fallbackLabel:a});if(o)return{snapshot:i.snapshot,resolved:o};let s=await aq(e,t,!0),l=aK(s.snapshot.nodes,r.ref,{fallbackLabel:a});if(!l)throw new A("COMMAND_FAILED",`Ref ${r.ref} not found or has no bounds`);return{...s,resolved:l}}function aK(e,t,r){let n=m(t);if(!n)throw new A("INVALID_ARGS",`Invalid ref: ${t}`);let i=w(e,n);if(aJ(i))return{ref:n,node:i};let a=r.fallbackLabel.length>0?l(e,r.fallbackLabel):null;return aJ(a)?{ref:n,node:a}:null}function aX(e,t){let r=am(e.rect);if(!r)throw new A("COMMAND_FAILED",t);return r}function aJ(e){return!!e&&null!==am(e.rect)}let aY=async(e,t)=>{let r=await aT(e,t,{action:"focus",requireInteractive:!0,promoteToHittableAncestor:!1});if(!e.backend.focus)throw new A("UNSUPPORTED_OPERATION","focus is not supported by this backend");let n=a4(r),i=ad(await e.backend.focus(al(e,t),n));return{...r,...i?{backendResult:i}:{},...rc(`Focused (${n.x}, ${n.y})`)}},aQ=async(e,t)=>{let r=await aT(e,t,{action:"longPress",requireInteractive:!0,promoteToHittableAncestor:!0});if(!e.backend.longPress)throw new A("UNSUPPORTED_OPERATION","longPress is not supported by this backend");let n=void 0===t.durationMs?void 0:i9(t.durationMs,"durationMs",0,12e4),i=a4(r),a=ad(await e.backend.longPress(al(e,t),i,{durationMs:n}));return{...r,...void 0!==n?{durationMs:n}:{},...a?{backendResult:a}:{},...rc(`Long pressed (${i.x}, ${i.y})`)}},aZ=async(e,t)=>{var r,n,i,a;let o;if(!e.backend.scroll)throw new A("UNSUPPORTED_OPERATION","scroll is not supported by this backend");let s="bottom"===(r=t.direction)?{direction:"down",edge:"bottom"}:"top"===r?{direction:"up",edge:"top"}:{direction:a6(r,"scroll direction")},l=(n=t.amount,i="scroll amount",void 0===n?void 0:a7(n,i)),u=function(e,t){if(void 0!==e){if(!Number.isFinite(e)||!Number.isInteger(e)||e<=0)throw new A("INVALID_ARGS",`${t} must be a positive integer`);return e}}(t.pixels,"scroll pixels"),c=iB(t.durationMs);iU({amount:l,pixels:u},"scroll accepts either amount or pixels, not both");let d=await a5(e,t),p="viewport"===d.kind?{kind:"viewport"}:{kind:"point",point:a4(d)},m=e.backend.scroll,f=async()=>await m(al(e,t),p,{direction:s.direction,...void 0!==l?{amount:l}:{},...void 0!==u?{pixels:u}:{},...void 0!==c?{durationMs:c}:{}}),h=0;if(s.edge){let r=s.edge,n="viewport"===(a=d).kind?{}:{point:a.point,nodeIndex:"node"in a?a.node?.index:void 0},i=await ae({edge:r,captureState:async i=>await a8(e,t,r,n,i),scroll:f});o=i.result,h=i.passes}else o=await f(),h=1;let g=ad(o),y=iV(g);return{...d,direction:s.direction,...s.edge?{edge:s.edge,passes:h}:{},...void 0!==l?{amount:l}:{},...void 0!==u?{pixels:u}:{},...void 0!==y?{durationMs:y}:{},...g?{backendResult:g}:{},...rc(at(s.direction,s.edge,h,l,u))}},a0=async(e,t)=>{if(!e.backend.swipe)throw new A("UNSUPPORTED_OPERATION","swipe is not supported by this backend");if(t.preset)return await a1(e,t,e.backend.swipe);let r=await a3(e,t),n=function(e,t){if(t.to)return{point:a9(t.to,"to")};let r=a6(t.direction,"swipe direction"),n=a7(t.distance??200,"swipe distance");switch(r){case"up":return{point:{x:e.x,y:e.y-n},direction:r,distance:n};case"down":return{point:{x:e.x,y:e.y+n},direction:r,distance:n};case"left":return{point:{x:e.x-n,y:e.y},direction:r,distance:n};case"right":return{point:{x:e.x+n,y:e.y},direction:r,distance:n}}}(r.point,t),i=void 0===t.durationMs?void 0:i9(t.durationMs,"durationMs",16,1e4),a=ad(await e.backend.swipe(al(e,t),r.point,n.point,{durationMs:i}));return{kind:"swipe",from:r.point,to:n.point,...n.direction?{direction:n.direction}:{},...void 0!==n.distance?{distance:n.distance}:{},...void 0!==i?{durationMs:i}:{},...r.target?{fromTarget:r.target}:{},...a?{backendResult:a}:{},...rc("Swiped")}};async function a1(e,t,r){let n;if(t.from||t.to||t.direction||void 0!==t.distance)throw new A("INVALID_ARGS","gesture swipe preset cannot be combined with from, to, direction, or distance");let i=iQ(t.preset);await aG(e,t,"swipe");let a=iY(i,{referenceWidth:(n=oe((await aq(e,t,!1)).snapshot.nodes)).width,referenceHeight:n.height},{platform:e.backend.platform}),o=void 0===t.durationMs?void 0:i9(t.durationMs,"durationMs",16,1e4),s={x:a.x1,y:a.y1},l={x:a.x2,y:a.y2},u=ad(await r(al(e,t),s,l,{durationMs:o}));return{kind:"swipe",from:s,to:l,preset:i,...void 0!==o?{durationMs:o}:{},fromTarget:{kind:"viewport"},...u?{backendResult:u}:{},...rc(`Swiped ${i}`)}}let a2=async(e,t)=>{if(!e.backend.pinch)throw new A("UNSUPPORTED_OPERATION","pinch is not supported by this backend");await aG(e,t,"pinch");let r=a7(t.scale,"pinch scale"),n=t.center?await aT(e,{...t,target:t.center},{action:"pinch",requireInteractive:!1,promoteToHittableAncestor:!1}):void 0,i=ad(await e.backend.pinch(al(e,t),{scale:r,...n?{center:n.point}:{}}));return{kind:"pinch",scale:r,...n?{center:n.point,centerTarget:n}:{},...i?{backendResult:i}:{},...rc(`Pinched to scale ${r}`)}};async function a5(e,t){let r=t.target??{kind:"viewport"};return"viewport"===r.kind?(await aG(e,t,"scroll"),{kind:"viewport"}):await aT(e,{...t,target:r},{action:"scroll",requireInteractive:!1,promoteToHittableAncestor:!1})}async function a3(e,t){if(t.from){var r;if("x"in(r=t.from)&&"y"in r)return await aG(e,t,"swipe"),{point:a9(t.from,"from")};let n=await aT(e,{...t,target:t.from},{action:"swipe",requireInteractive:!1,promoteToHittableAncestor:!1});return{point:a4(n),target:n}}if(!t.direction)throw new A("INVALID_ARGS","swipe requires from+to or a direction");return await aG(e,t,"swipe"),{point:x(oe((await aq(e,t,!1)).snapshot.nodes)),target:{kind:"viewport"}}}function a4(e){if(!e.point)throw new A("COMMAND_FAILED","Interaction target resolved without coordinates");return e.point}async function a8(e,t,r,n,i){if(!e.backend.captureSnapshot)throw new A("UNSUPPORTED_OPERATION",`scroll ${r} requires snapshot support to verify hidden content before scrolling`);let{captureSnapshot:a}=e.backend;return await i7({edge:r,target:n,scope:i,captureNodes:async r=>{let n=await a(al(e,t),{scope:r});return n.snapshot?.nodes??n.nodes??[]}})}function a6(e,t){switch(e){case"up":case"down":case"left":case"right":return e;default:throw new A("INVALID_ARGS",`${t} must be up, down, left, or right`)}}function a9(e,t){let r=Number(e.x),n=Number(e.y);if(!Number.isFinite(r)||!Number.isFinite(n))throw new A("INVALID_ARGS",`${t} point requires finite x and y`);return{x:r,y:n}}function a7(e,t){if(!Number.isFinite(e)||e<=0)throw new A("INVALID_ARGS",`${t} must be a positive number`);return e}function oe(e){let t=e.filter(t=>eT(t,e)).map(e=>e.rect).filter(ot),r=t.length>0?t:e.map(e=>e.rect).filter(ot);if(0===r.length)throw new A("COMMAND_FAILED","Cannot infer viewport for directional swipe");let n=Math.min(...r.map(e=>e.x)),i=Math.min(...r.map(e=>e.y));return{x:n,y:i,width:Math.max(...r.map(e=>e.x+e.width))-n,height:Math.max(...r.map(e=>e.y+e.height))-i}}function ot(e){return!!(e&&e.width>0&&e.height>0)}let or={click:"Click or tap a semantic UI target by ref, selector, or point.",press:"Press a semantic UI target by ref, selector, or point.",fill:"Fill text into a semantic UI target by ref, selector, or point.",longpress:"Long press by ref, selector, or point.",swipe:"Swipe between two points.",focus:"Focus input at coordinates.",type:"Type text in the focused field.",scroll:"Scroll in a direction or to an edge.",get:"Get element text or attributes.",is:"Assert UI state.",find:"Find an element and optionally act on it.",gesture:"Run a structured gesture."},on={target:ty(tD()),button:tS(["primary","secondary","middle"],"Pointer button for platforms that support mouse buttons."),...t$(),...tM()},oi={target:ty(tD()),...t$(),...tM()},oa={target:ty(tD()),text:ty(tb("Text to enter into the target.")),delayMs:tw("Delay between typed characters.",{min:0}),...t$()},oo={target:ty(tD()),durationMs:tw("Long press duration in milliseconds.",{min:0}),...t$()},os={from:ty(tA("Swipe start point.")),to:ty(tA("Swipe end point.")),durationMs:tw("Swipe duration in milliseconds.",{min:0}),count:tw("Number of swipe repetitions.",{min:1}),pauseMs:tw("Pause between repeated swipes.",{min:0}),pattern:tS(iG)},ol={x:ty(tv("X coordinate.")),y:ty(tv("Y coordinate."))},ou={text:ty(tb("Text to type.")),delayMs:tw("Delay between typed characters.",{min:0})},oc={direction:ty(tS(["up","down","left","right","top","bottom"])),amount:tv("Platform scroll amount."),pixels:tw("Pixel scroll amount.",{min:0}),durationMs:tw("Scroll duration in milliseconds when the backend supports pacing.",{min:0,max:1e4})},od={format:ty(tS(["text","attrs"])),target:ty(tH({oneOf:tX(),description:"UI element target by snapshot ref or selector expression."},(e,t)=>{let r,n;return void 0===e[t]?void 0:"ref"===(n=tU(r=tJ(e,t),"kind",["ref","selector"]))?{kind:n,ref:tC(r,"ref"),label:tF(r,"label")}:{kind:n,selector:tC(r,"selector")}})),...t$()},op={predicate:ty(tS(["visible","hidden","exists","editable","selected","text"])),selector:ty(tb()),value:tb(),...t$()},om={locator:tS(Y),query:ty(tb()),action:tS(["click","focus","exists","getText","getAttrs","wait","fill","type"]),value:tb(),timeoutMs:tw(),first:tx(),last:tx(),depth:tw(),raw:tx()},of={kind:ty(tS(C,"Gesture variant.")),direction:tS(iz,"Fling direction."),preset:tS(iq,"Swipe preset."),origin:tA("Gesture origin point."),delta:tA("Movement delta for pan or transform gestures."),distance:tw("Fling distance.",{min:0}),scale:tv("Pinch or transform scale."),degrees:tv("Rotation in degrees."),velocity:tw("Rotate gesture velocity.",{min:0}),durationMs:tw("Gesture duration in milliseconds.",{min:0})},oh=[{name:"click",description:or.click,inputSchema:tR(on),readInput:e=>tN(e,on)},{name:"press",description:or.press,inputSchema:tR(oi),readInput:e=>tN(e,oi)},{name:"fill",description:or.fill,inputSchema:tR(oa),readInput:e=>tN(e,oa)},og("longpress",oo),og("swipe",os),og("focus",ol),og("type",ou),og("scroll",oc),og("get",od),og("is",op),og("find",om),{name:"gesture",description:or.gesture,inputSchema:tR(of),readInput:function(e){let t=tL(e),r=tO(t),n=tU(t,"kind",C);return"pan"===n?{...r,kind:n,origin:tP(t,"origin"),delta:tP(t,"delta"),durationMs:t_(t,"durationMs",{min:0})}:"fling"===n?{...r,kind:n,direction:tU(t,"direction",iz),origin:tP(t,"origin"),distance:t_(t,"distance",{min:0}),durationMs:t_(t,"durationMs",{min:0})}:"swipe"===n?{...r,kind:n,preset:tU(t,"preset",iq),durationMs:t_(t,"durationMs",{min:0})}:"pinch"===n?{...r,kind:n,scale:tE(t,"scale"),origin:oy(t,"origin")}:"rotate"===n?{...r,kind:n,degrees:tE(t,"degrees"),origin:oy(t,"origin"),velocity:t_(t,"velocity",{min:0})}:{...r,kind:n,origin:tP(t,"origin"),delta:tP(t,"delta"),scale:tE(t,"scale"),degrees:tE(t,"degrees"),durationMs:t_(t,"durationMs",{min:0})}}}];function og(e,t){return n_(e,or[e],t)}function oy(e,t){return void 0===e[t]?void 0:tP(e,t)}let ob={gesture:tY(L.gesture,function(e){switch(e.kind){case"pan":return["pan",String(e.origin?.x),String(e.origin?.y),String(e.delta?.x),String(e.delta?.y),...ri(e.durationMs)];case"fling":return["fling",ro(e.direction,"gesture fling requires direction"),String(e.origin?.x),String(e.origin?.y),...ri(e.distance),...ri(e.durationMs)];case"swipe":return ov(e);case"pinch":return["pinch",String(e.scale),...ri(e.origin?.x),...ri(e.origin?.y)];case"rotate":return["rotate",String(e.degrees),...ri(e.origin?.x),...ri(e.origin?.y),...ri(e.velocity)];case"transform":return["transform",String(e.origin?.x),String(e.origin?.y),String(e.delta?.x),String(e.delta?.y),String(e.scale),String(e.degrees),...ri(e.durationMs)];default:throw new A("INVALID_ARGS","gesture requires pan, fling, swipe, pinch, rotate, or transform")}}),"gesture-pan":tY(L.gesture,function(e){return["pan",String(e.x),String(e.y),String(e.dx),String(e.dy),...ri(e.durationMs)]}),"gesture-fling":tY(L.gesture,e=>{var t;let r;return r=void 0!==(t=e).durationMs?t.distance??180:t.distance,["fling",t.direction,String(t.x),String(t.y),...ri(r),...ri(t.durationMs)]}),"gesture-swipe":tY(L.gesture,ov),"gesture-pinch":tY(L.gesture,function(e){return["pinch",String(e.scale),...ri(e.x),...ri(e.y)]}),"gesture-rotate":tY(L.gesture,e=>(function(e){var t=e;if(void 0===t.x&&void 0!==t.y||void 0!==t.x&&void 0===t.y)throw new A("INVALID_ARGS","gesture rotate center requires both x and y");let r=void 0===e.x||void 0===e.y?[]:[String(e.x),String(e.y)];return["rotate",String(e.degrees),...r,...ri(e.velocity)]})(e)),"gesture-transform":tY(L.gesture,function(e){return["transform",String(e.x),String(e.y),String(e.dx),String(e.dy),String(e.scale),String(e.degrees),...ri(e.durationMs)]})};function ov(e){return["swipe",ro(e.preset,"gesture swipe requires preset"),...ri(e.durationMs)]}function ow(e){if(e[0]?.startsWith("@")){let t=oS(e.slice(1));return{ref:e[0],...void 0===t?{}:{label:t}}}let t=K(e);return t?{selector:t.selectorExpression}:{x:Number(e[0]),y:Number(e[1])}}function ox(e){let t=e[0];if(t?.startsWith("@")){let r=e.length>=3?e.slice(2).join(" "):e.slice(1).join(" ");return{kind:"ref",target:{ref:t,label:e.length>=3?oS(e.slice(1,2)):void 0},text:r}}let r=K(e,{preferTrailingValue:!0});return r?{kind:"selector",target:{selector:r.selectorExpression},text:r.rest.join(" ")}:{kind:"point",target:{x:Number(e[0]),y:Number(e[1])},text:e.slice(2).join(" ")}}function oS(e){return e.join(" ").trim()||void 0}let ok={click:e=>tQ(L.click,t4(e),{...e,clickButton:e.button}),press:tY(L.press,e=>t4(e)),longpress:tY(L.longPress,e=>{var t;return[...t4(t=e),...ri(t.durationMs)]}),swipe:tY(L.swipe,function(e){return[String(e.from?.x),String(e.from?.y),String(e.to?.x),String(e.to?.y),...ri(e.durationMs)]}),focus:tY(L.focus,e=>[String(e.x),String(e.y)]),type:tY(L.type,e=>[e.text]),fill:tY(L.fill,e=>{var t;return[...t4(t=e),t.text]}),scroll:tY(L.scroll,e=>[ro(e.direction,"scroll requires direction"),...ri(e.amount)]),get:tY(L.get,e=>[ro(e.format,"get requires format"),...function(e){let t=t8(e);if("string"==typeof t.ref)return[t.ref,...t9(t.label)];if("string"==typeof t.selector)return[t.selector];throw new A("INVALID_ARGS","element command requires @ref or selector target")}(e)])};function oI(e){let t=e.ref??"",r=e.x,n=e.y;return t&&"number"==typeof r&&"number"==typeof n?{data:e,text:`Tapped @${t} (${r}, ${n})`}:rh(e)}let oD={click:rm(oI),press:rm(oI),get:({input:e,result:t})=>{var r;let n;return n=(r={result:t,format:e.format}).result,"text"===r.format?{data:n,text:"string"==typeof n.text?n.text:""}:"attrs"===r.format?{data:n,text:JSON.stringify(n.node??{},null,2)}:rh(n)},is:rm(function(e){return{data:e,text:`Passed: is ${e.predicate??"assertion"}`}}),find:rm(function(e){return"string"==typeof e.text?{data:e,text:e.text}:"boolean"==typeof e.found?{data:e,text:`Found: ${e.found}`}:e.node?{data:e,text:JSON.stringify(e.node,null,2)}:rh(e)})},oA={is:tY(L.is,e=>{var t;return[(t=e).predicate,t.selector,..."text"===t.predicate?[t.value]:[]]}),find:e=>tQ(L.find,function(e){let t=e.locator&&"any"!==e.locator?[e.locator,e.query]:[e.query];switch(e.action){case void 0:case"click":case"focus":case"exists":return e.action?[...t,e.action]:t;case"getText":return[...t,"get","text"];case"getAttrs":return[...t,"get","attrs"];case"wait":return[...t,"wait",...ri(e.timeoutMs)];case"fill":case"type":return[...t,e.action,e.value]}}(e),{...e,findFirst:e.first,findLast:e.last})};function o$(e){if(void 0===e||""===e)throw new A("INVALID_ARGS","find requires query");return e}let oM={get:{usageOverride:"get text|attrs <@ref|selector>",positionalArgs:["subcommand","target"],allowedFlags:[...nw]},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:[...nw]},click:{usageOverride:"click <x y|@ref|selector>",positionalArgs:["target"],allowsExtraPositionals:!0,allowedFlags:[...nk,"clickButton",...nw]},press:{usageOverride:"press <x y|@ref|selector>",helpDescription:"Short press a semantic UI target by ref, selector, or point. For native context menus or hold gestures, use longpress <target> <durationMs> instead of press --hold-ms.",positionalArgs:["targetOrX","y?"],allowsExtraPositionals:!0,allowedFlags:[...nk,...nw]},longpress:{usageOverride:"longpress <x y|@ref|selector> [durationMs]",helpDescription:"Open native context menus or long-press targets by ref, selector, or point. Duration is positional, for example longpress @e12 800 or longpress 300 500 800.",positionalArgs:["targetOrX","yOrDurationMs?","durationMs?"],allowsExtraPositionals:!0,allowedFlags:[...nw]},swipe:{helpDescription:"Swipe coordinates with optional repeat pattern",positionalArgs:["x1","y1","x2","y2","durationMs?"],allowedFlags:["count","pauseMs","pattern"]},gesture:{usageOverride:"gesture <pan|fling|swipe|pinch|rotate|transform> ...",listUsageOverride:"gesture <pan|fling|swipe|pinch|rotate|transform> ...",helpDescription:'Run touch gestures: pan <x> <y> <dx> <dy> [durationMs], fling <up|down|left|right> <x> <y> [distance] [durationMs], swipe <left|right|left-edge|right-edge> [durationMs], pinch <scale> [x] [y], rotate <degrees> [x] [y] [velocity], or transform <x> <y> <dx> <dy> <scale> <degrees> [durationMs]. For command plans, output only command lines. Android transform verification should use all app-observable effects, for example wait text "pan changed yes", wait text "pinch changed yes", and wait text "rotate changed yes", not exact transform values.',summary:"Run pan, fling, swipe, pinch, rotate, or transform gestures",positionalArgs:["pan|fling|swipe|pinch|rotate|transform","args?"],allowsExtraPositionals:!0},focus:{positionalArgs:["x","y"]},type:{positionalArgs:["text"],allowsExtraPositionals:!0,allowedFlags:["delayMs"]},fill:{usageOverride:"fill <x> <y> <text> | fill <@ref|selector> <text>",positionalArgs:["targetOrX","yOrText","text?"],allowsExtraPositionals:!0,allowedFlags:[...nw,"delayMs"]},scroll:{usageOverride:"scroll <direction|top|bottom> [amount] [--pixels <n>] [--duration-ms <ms>]",helpDescription:"Scroll in a direction, or toward the top/bottom edge of scrollable content.",summary:"Scroll in a direction or to an edge",positionalArgs:["directionOrEdge","amount?"],allowedFlags:["pixels","durationMs"]}},{gesture:oR,...oN}=ob,oL=ru(oq("click"),(e,t)=>{var r;return e.interactions.click({...tV(r=t),...tz(r.target),...tG(r),...tq(r),button:r.button})}),oO=ru(oq("press"),(e,t)=>{var r;return e.interactions.press({...tV(r=t),...tz(r.target),...tG(r),...tq(r)})}),oP=ru(oq("fill"),(e,t)=>{var r;return e.interactions.fill({...tV(r=t),...tz(r.target),...tG(r),text:r.text,delayMs:r.delayMs})}),oC=ru(oq("longpress"),(e,t)=>{var r;return e.interactions.longPress({...tV(r=t),...tz(r.target),...tG(r),durationMs:r.durationMs})}),oF=ru(oq("swipe"),(e,t)=>e.interactions.swipe(t)),oE=ru(oq("focus"),(e,t)=>e.interactions.focus(t)),oT=ru(oq("type"),(e,t)=>e.interactions.type(t)),o_=ru(oq("scroll"),(e,t)=>e.interactions.scroll(t)),oj=ru(oq("get"),(e,t)=>{var r;return e.interactions.get({...tV(r=t),...function(e){switch(e.kind){case"ref":return{ref:e.ref,label:e.label};case"selector":return{selector:e.selector}}}(r.target),...tG(r),format:r.format})}),oU=ru(oq("is"),(e,t)=>e.interactions.is(t)),oB=ru(oq("find"),(e,t)=>e.interactions.find(t)),oV=ru(oq("gesture"),async(e,t)=>{var r,n,i,a,o,s;switch(t.kind){case"pan":return await e.interactions.pan({...tV(r=t),x:r.origin.x,y:r.origin.y,dx:r.delta.x,dy:r.delta.y,durationMs:r.durationMs});case"fling":return await e.interactions.fling({...tV(n=t),direction:n.direction,x:n.origin.x,y:n.origin.y,distance:n.distance,durationMs:n.durationMs});case"swipe":return await e.interactions.swipeGesture({...tV(i=t),preset:i.preset,durationMs:i.durationMs});case"pinch":return await e.interactions.pinch({...tV(a=t),scale:a.scale,x:a.origin?.x,y:a.origin?.y});case"rotate":return await e.interactions.rotateGesture({...tV(o=t),degrees:o.degrees,x:o.origin?.x,y:o.origin?.y,velocity:o.velocity});case"transform":return await e.interactions.transformGesture({...tV(s=t),x:s.origin.x,y:s.origin.y,dx:s.delta.x,dy:s.delta.y,scale:s.scale,degrees:s.degrees,durationMs:s.durationMs})}}),oz=rs({name:"interaction",clientSurface:!1,commands:[{name:"click",metadata:oq("click"),definition:oL,cliSchema:oM.click,cliReader:(e,t)=>({...tZ(t),...t1(t),...t5(t),target:t3(ow(e)),button:t.clickButton}),daemonWriter:ok.click,cliOutputFormatter:oD.click},{name:"press",metadata:oq("press"),definition:oO,cliSchema:oM.press,cliReader:(e,t)=>({...tZ(t),...t1(t),...t5(t),target:t3(ow(e))}),daemonWriter:ok.press,cliOutputFormatter:oD.press},{name:"fill",metadata:oq("fill"),definition:oP,cliSchema:oM.fill,cliReader:(e,t)=>{let r=ox(e);return{...tZ(t),...t1(t),target:t3(r.target),text:r.text,delayMs:t.delayMs}},daemonWriter:ok.fill},{name:"longpress",metadata:oq("longpress"),definition:oC,cliSchema:oM.longpress,cliReader:(e,t)=>{let r,n={...ow((r=function(e){if(rt(e[0])&&rt(e[1]))return{target:e.slice(0,2),...void 0!==e[2]?{durationMs:Number(e[2])}:{}};let t=e.at(-1);return e.length>1&&rt(t)?{target:e.slice(0,-1),durationMs:Number(t)}:{target:e}}(e)).target),...void 0!==r.durationMs?{durationMs:r.durationMs}:{}};return{...tZ(t),...t1(t),target:t3(n),durationMs:n.durationMs}},daemonWriter:ok.longpress},{name:"swipe",metadata:oq("swipe"),definition:oF,cliSchema:oM.swipe,cliReader:(e,t)=>({...tZ(t),from:{x:Number(e[0]),y:Number(e[1])},to:{x:Number(e[2]),y:Number(e[3])},durationMs:rr(e[4]),count:t.count,pauseMs:t.pauseMs,pattern:t.pattern}),daemonWriter:ok.swipe},{name:"focus",metadata:oq("focus"),definition:oE,cliSchema:oM.focus,cliReader:(e,t)=>({...tZ(t),x:Number(e[0]),y:Number(e[1])}),daemonWriter:ok.focus},{name:"type",metadata:oq("type"),definition:oT,cliSchema:oM.type,cliReader:(e,t)=>({...tZ(t),text:e.join(" "),delayMs:t.delayMs}),daemonWriter:ok.type},{name:"scroll",metadata:oq("scroll"),definition:o_,cliSchema:oM.scroll,cliReader:(e,t)=>({...tZ(t),direction:function(e){if("up"===e||"down"===e||"left"===e||"right"===e||"top"===e||"bottom"===e)return e;throw new A("INVALID_ARGS",`Unknown direction: ${String(e)}`)}(e[0]),amount:rr(e[1]),pixels:t.pixels,durationMs:t.durationMs}),daemonWriter:ok.scroll},{name:"get",metadata:oq("get"),definition:oj,cliSchema:oM.get,cliReader:(e,t)=>({...tZ(t),...t1(t),format:function(e){if("text"===e||"attrs"===e)return e;throw new A("INVALID_ARGS","get only supports text or attrs")}(e[0]),target:t3(function(e){if(e[0]?.startsWith("@"))return{ref:e[0],label:e.slice(1).join(" ").trim()||void 0};let t=e.join(" ").trim();if(!t)throw new A("INVALID_ARGS","get requires @ref or selector expression");return{selector:t}}(e.slice(1)))}),daemonWriter:ok.get,cliOutputFormatter:oD.get},{name:"is",metadata:oq("is"),definition:oU,cliSchema:oM.is,cliReader:(e,t)=>(function(e,t){let r={...t2(t),...t0(t)},n=e[0],i=function(e,t={}){let r=K(e,t);if(!r)throw new A("INVALID_ARGS","is requires a selector expression");return r}(e.slice(1),{preferTrailingValue:"text"===n});if("text"===n)return{...r,predicate:n,selector:i.selectorExpression,value:i.rest.join(" ")};if("visible"===n||"hidden"===n||"exists"===n||"editable"===n||"selected"===n)return{...r,predicate:n,selector:i.selectorExpression};throw new A("INVALID_ARGS","is requires predicate: visible|hidden|exists|editable|selected|text")})(e,t),daemonWriter:oA.is,cliOutputFormatter:oD.is},{name:"find",metadata:oq("find"),definition:oB,cliSchema:oM.find,cliReader:(e,t)=>(function(e,t){var r;let n={...{depth:(r=t).snapshotDepth,raw:r.snapshotRaw},...t0(t),first:t.findFirst,last:t.findLast},i=function(e){if("text"===e||"label"===e||"value"===e||"role"===e||"id"===e)return e}(e[0]),a=void 0!==i,o=a?e[1]:e[0],s=a?2:1,l=e[s];if(void 0===l)return{...n,locator:i,query:o$(o)};if("get"===l){let t=e[s+1];if("text"===t)return{...n,locator:i,query:o$(o),action:"getText"};if("attrs"===t)return{...n,locator:i,query:o$(o),action:"getAttrs"};throw new A("INVALID_ARGS","find get only supports text or attrs")}if("wait"===l)return{...n,locator:i,query:o$(o),action:"wait",timeoutMs:rr(e[s+1])};if("fill"===l||"type"===l)return{...n,locator:i,query:o$(o),action:l,value:e.slice(s+1).join(" ")};if("click"===l||"focus"===l||"exists"===l)return{...n,locator:i,query:o$(o),action:l};throw new A("INVALID_ARGS",`Unsupported find action: ${l}`)})(e,t),daemonWriter:oA.find,cliOutputFormatter:oD.find},{name:"gesture",metadata:oq("gesture"),definition:oV,cliSchema:oM.gesture,cliReader:function(e,t){let r=e[0],n=e.slice(1),i=tZ(t);switch(r){case"pan":return{...i,kind:r,origin:{x:Number(n[0]),y:Number(n[1])},delta:{x:Number(n[2]),y:Number(n[3])},durationMs:rr(n[4])};case"fling":return{...i,kind:r,direction:n[0],origin:{x:Number(n[1]),y:Number(n[2])},distance:rr(n[3]),durationMs:rr(n[4])};case"swipe":return{...i,kind:r,preset:n[0],durationMs:rr(n[1])};case"pinch":return{...i,kind:r,scale:Number(n[0]),origin:void 0===n[1]||void 0===n[2]?void 0:{x:Number(n[1]),y:Number(n[2])}};case"rotate":return{...i,kind:r,degrees:Number(n[0]),origin:void 0===n[1]||void 0===n[2]?void 0:{x:Number(n[1]),y:Number(n[2])},velocity:rr(n[3])};case"transform":return{...i,kind:r,origin:{x:Number(n[0]),y:Number(n[1])},delta:{x:Number(n[2]),y:Number(n[3])},scale:Number(n[4]),degrees:Number(n[5]),durationMs:rr(n[6])};default:throw new A("INVALID_ARGS","gesture requires pan, fling, swipe, pinch, rotate, or transform")}},daemonWriter:ob.gesture,extraDaemonWriters:oN}]});function oq(e){let t=oh.find(t=>t.name===e);if(!t)throw Error(`Missing interaction command metadata for ${e}`);return t}function oG(e){return rh(rd({app:e.app,appPath:e.appPath,platform:e.platform,...e.appId?{appId:e.appId}:{},...e.bundleId?{bundleId:e.bundleId}:{},...e.package?{package:e.package}:{}},`Installed: ${r_(e)}`))}let oW={boot:rm(function(e){let t=e.platform??"unknown",r=e.device??e.id??"unknown";return{data:e,text:`Boot ready: ${r} (${t})`}}),shutdown:rm(function(e){let t=e.platform??"unknown",r=e.device??e.id??"unknown",n=e.shutdown,i=!!n&&"object"==typeof n&&"success"in n&&!0===n.success;return{data:e,text:`${i?"Shutdown":"Shutdown failed"}: ${r} (${t})`}}),devices:rm(function(e){return{data:{devices:e.map(rT)},text:e.map(oH).join("\n")}}),doctor:rm(function(e){var t;let r,n="string"==typeof e.status?e.status:"unknown",i=[`Doctor: ${n}`],a=Array.isArray(t=e.checks)?t.filter(e=>!!e&&"object"==typeof e&&!Array.isArray(e)):[];if(r=e9,e9=!1,r){let t="string"==typeof e.summary?e.summary:void 0;t&&i.push(t)}else if(0===a.length){let t="string"==typeof e.summary?e.summary:"No blockers found.";i.push(t)}else for(let e of a)i.push(e8(e)),i.push(...e6(e));return{data:e,text:i.join("\n")}}),apps:({input:e,result:t})=>{var r;return{data:{apps:(r={result:t,appsFilter:e.appsFilter}).result},stderr:"all"===r.appsFilter?"Showing all apps, including system apps.\n":"Showing user-installed apps. Use --all to include system apps.\n",text:r.result.length>0?r.result.join("\n"):"all"===r.appsFilter?"No apps found.":"No user-installed apps found."}},session:rm(function(e){if("stateDir"in e)return{data:e,text:e.stateDir};let t={sessions:e.sessions.map(rE)};return{data:t,text:JSON.stringify(t,null,2)}}),artifacts:rm(function(e){let t=[e.message??`No cloud artifacts available for ${e.provider}.`],r=function(e){if(e.providerSessionId)return`agent-device artifacts ${e.providerSessionId} --provider ${e.provider} --json`}(e);return r&&t.push(`Retry: ${r}`),{data:e,text:e.cloudArtifacts.length>0?e.cloudArtifacts.map(oK).join("\n"):t.join("\n")}}),open:rm(function(e){let t,r=(t=e.appName??e.appBundleId??e.session,rd({session:e.session,...e.sessionStateDir?{sessionStateDir:e.sessionStateDir}:{},...e.runnerLogPath?{runnerLogPath:e.runnerLogPath}:{},...e.requestLogPath?{requestLogPath:e.requestLogPath}:{},...e.appName?{appName:e.appName}:{},...e.appBundleId?{appBundleId:e.appBundleId}:{},...e.startup?{startup:e.startup}:{},...e.runtime?{runtime:e.runtime}:{},...e.device?rF(e.device):{}},t?`Opened: ${t}`:"Opened")),n=[rp(r)].filter(e=>!!e);return"string"==typeof r.sessionStateDir&&n.push(`Session state: ${r.sessionStateDir}`),{data:r,text:n.join("\n")||null}}),close:rm(function(e){return rh({session:e.session,...e.shutdown?{shutdown:e.shutdown}:{},..."provider"in e&&e.provider?{provider:e.provider}:{},...rc(e.session?`Closed: ${e.session}`:"Closed")})}),install:rm(oG),reinstall:rm(oG),"install-from-source":rm(function(e){return rh(rd({launchTarget:e.launchTarget,...e.appName?{appName:e.appName}:{},...e.appId?{appId:e.appId}:{},...e.bundleId?{bundleId:e.bundleId}:{},...e.packageName?{package:e.packageName}:{},...e.installablePath?{installablePath:e.installablePath}:{},...e.archivePath?{archivePath:e.archivePath}:{},...e.materializationId?{materializationId:e.materializationId}:{},...e.materializationExpiresAt?{materializationExpiresAt:e.materializationExpiresAt}:{}},`Installed: ${rj(e)}`))}),prepare:rf,viewport:rf};function oH(e){let t=e.kind?` ${e.kind}`:"",r=e.target?` target=${e.target}`:"",n="boolean"==typeof e.booted?` booted=${e.booted}`:"";return`${e.name} (${e.platform}${t}${r})${n}`}function oK(e){let t=e.url?` ${e.url}`:"",r=e.availability?` ${e.availability}`:"";return`${e.kind}: ${e.name}${r}${t}`}let oX=n_("artifacts","List cloud provider artifacts for an active or completed provider session.",{provider:tb("Cloud provider name, for example browserstack or aws-device-farm."),providerSessionId:tb("Cloud provider session id or ARN.")}),oJ=ru(oX,(e,t)=>e.sessions.artifacts(t)),oY={name:"artifacts",metadata:oX,definition:oJ,cliSchema:{summary:"List cloud provider session artifacts",usageOverride:"artifacts [provider-session-id] --provider <name>",positionalArgs:["provider-session-id?"],allowedFlags:["provider","providerSessionId"]},cliReader:(e,t)=>({...tZ(t),provider:t.provider,providerSessionId:e[0]??t.providerSessionId}),daemonWriter:tY(L.artifacts),cliOutputFormatter:oW.artifacts},oQ=n_("apps","List installed apps.",{appsFilter:tS(["user-installed","all"])}),oZ=n_("open","Open an app, deep link, URL, or platform surface.",{app:tb("App name, bundle id, package, or URL."),url:tb("Optional URL passed with an app shell."),surface:tS(r3),activity:tb("Android activity name."),launchConsole:tb("Launch console mode."),launchArgs:tk("Launch arguments forwarded verbatim to the platform launch command."),relaunch:tx("Force relaunch."),saveScript:tI({oneOf:[th(),tf()]}),deviceHub:tx("Use Xcode Device Hub when surfacing Apple simulators."),noRecord:tx("Do not record this action.")}),o0=n_("close","Close an app or end the active session.",{app:tb("Optional app to close."),shutdown:tx("Shutdown the session/device where supported."),saveScript:tI({oneOf:[th(),tf()]})}),o1=ru(oQ,(e,t)=>e.apps.list(t)),o2=ru(oZ,(e,t)=>e.apps.open(t)),o5=ru(o0,(e,t)=>t.app?e.apps.close(t):e.sessions.close(function(e){let{app:t,...r}=e;return r}(t))),o3=tY(L.apps),o4=tY(L.open,function(e){return e.app?e.url?[e.app,e.url]:[e.app]:[]}),o8=tY(L.close,e=>rn(e.app)),o6={name:"apps",metadata:oQ,definition:o1,cliSchema:{helpDescription:"List user-installed apps; use --all to include system/OEM apps",summary:"List installed apps",allowedFlags:["appsFilter"],defaults:{appsFilter:Q}},cliReader:(e,t)=>({...tZ(t),appsFilter:Z(t.appsFilter)}),daemonWriter:o3,cliOutputFormatter:oW.apps},o9={name:"open",metadata:oZ,definition:o2,cliSchema:{helpDescription:'Boot device/simulator; optionally launch app or deep link URL. Use --platform to bind URL/deep-link opens to the target platform. For iOS simulator initial stdout/stderr, put --launch-console <path> on this open command, for example agent-device open "Agent Device Tester" --platform ios --launch-console artifacts/launch-console.log. Expo Go/dev-client shells accept host + URL, for example agent-device open "Expo Go" exp://127.0.0.1:8081 --platform ios. macOS also supports --surface app|frontmost-app|desktop|menubar.',summary:"Open an app, deep link or URL, save replays",positionalArgs:["appOrUrl?","url?"],allowedFlags:["activity","launchConsole","launchArgs","deviceHub","saveScript","noRecord","relaunch","surface"]},cliReader:(e,t)=>({...tZ(t),app:e[0],url:e[1],surface:t.surface,activity:t.activity,launchConsole:t.launchConsole,launchArgs:t.launchArgs,relaunch:t.relaunch,saveScript:t.saveScript,deviceHub:t.deviceHub,noRecord:t.noRecord}),daemonWriter:o4,cliOutputFormatter:oW.open},o7={name:"close",metadata:o0,definition:o5,cliSchema:{positionalArgs:["app?"],allowedFlags:["saveScript","shutdown"]},cliReader:(e,t)=>({...tZ(t),app:e[0],shutdown:t.shutdown,saveScript:t.saveScript}),daemonWriter:o8,cliOutputFormatter:oW.close},se=n_("devices","List available devices.",{}),st=n_("boot","Boot or prepare a selected device without using CLI positional arguments.",{headless:tx("Boot without showing simulator UI when supported.")}),sr=n_("shutdown","Shutdown a selected simulator or emulator.",{}),sn=ru(se,(e,t)=>e.devices.list(t)),si=ru(st,(e,t)=>e.devices.boot(t)),sa=ru(sr,(e,t)=>e.devices.shutdown(t)),so=(e,t)=>tZ(t),ss=tY(L.devices),sl=tY(L.boot),su=tY(L.shutdown),sc={name:"devices",metadata:se,definition:sn,cliReader:so,daemonWriter:ss,cliOutputFormatter:oW.devices},sd={name:"boot",metadata:st,definition:si,cliSchema:{summary:"Boot target device/simulator",allowedFlags:["headless"]},cliReader:(e,t)=>({...tZ(t),headless:t.headless}),daemonWriter:sl,cliOutputFormatter:oW.boot},sp={name:"shutdown",metadata:sr,definition:sa,cliSchema:{summary:"Shutdown target simulator/emulator"},cliReader:so,daemonWriter:su,cliOutputFormatter:oW.shutdown},sm=n_("doctor","Diagnose device, app, Metro, and React Native readiness before a run.",{targetApp:tb("Installed app package/bundle id or app name to verify without opening a session."),remote:tx("Check remote connection setup instead of local device inventory.")}),sf=ru(sm,(e,t)=>e.command.doctor(t)),sh={name:"doctor",metadata:sm,definition:sf,cliSchema:{usageOverride:"doctor [--platform ios|android|macos|linux|web|apple] [--app <id-or-name>] [--remote]",helpDescription:"Read-only preflight for QA and dogfood runs. Reports local device inventory, active sessions, optional app discovery, scoped toolchain info, and Metro reachability inferred from cwd/runtime. Pass --app to verify a target app on the one matching booted device without opening a session. Use --remote to check remote connection setup without probing local devices. Default output is compact; use --json for full checks and evidence.",summary:"Preflight device, app, Metro, and RN/Expo readiness",allowedFlags:["targetApp","remote"]},cliReader:(e,t)=>({...tZ(t),targetApp:t.targetApp,remote:t.remote}),daemonWriter:tY(L.doctor),cliOutputFormatter:oW.doctor};function sg(e,t){if(!e||"object"!=typeof e||Array.isArray(e))throw new A("INVALID_ARGS",`${t} installSource must be an object.`);if("github-actions-artifact"!==sv(e.type,`${t} installSource.type`))throw new A("INVALID_ARGS",`${t} installSource.type must be "github-actions-artifact".`);let{owner:r,repo:n}=sb(sv(e.repo,`${t} installSource.repo`),`${t} installSource.repo`);return sy(r,n,e.artifact,`${t} installSource.artifact`)}function sy(e,t,r,n){var i;return"number"==typeof r||"string"==typeof(i=r)&&/^\d+$/.test(i.trim())?{kind:"github-actions-artifact",owner:e,repo:t,artifactId:function(e,t){let r="number"==typeof e?e:"string"==typeof e?Number(e):NaN;if(!Number.isInteger(r))throw new A("INVALID_ARGS",`${t} must be an integer.`);return r}(r,n)}:{kind:"github-actions-artifact",owner:e,repo:t,artifactName:sv(r,n)}}function sb(e,t){let r=e.indexOf("/");if(r<=0||r===e.length-1||-1!==e.indexOf("/",r+1))throw new A("INVALID_ARGS",`${t} must use owner/repo.`);let n={owner:e.slice(0,r).trim(),repo:e.slice(r+1).trim()};if(!n.owner||!n.repo)throw new A("INVALID_ARGS",`${t} must use owner/repo.`);return n}function sv(e,t){let r="string"==typeof e&&e.trim().length>0?e.trim():void 0;if(!r)throw new A("INVALID_ARGS",`${t} must be a non-empty string.`);return r}let sw=n_("install","Install an app binary.",{app:tb("Optional app identifier hint."),appPath:ty(tb("Path to app binary."))}),sx=n_("reinstall","Reinstall an app binary.",{app:ty(tb()),appPath:ty(tb("Path to app binary."))}),sS=n_("install-from-source","Install an app from a structured source.",{source:ty(tI(tg("Install source object."))),retainPaths:tx(),retentionMs:tw()}),sk=ru(sw,(e,t)=>e.apps.install(t)),sI=ru(sx,(e,t)=>e.apps.reinstall(t)),sD=ru(sS,(e,t)=>e.apps.installFromSource(t)),sA=tY(L.install,e=>{var t;let r;return t=e.app,r=ro(e.appPath,"missing app path"),"string"==typeof t&&t.length>0?[t,r]:[r]}),s$=tY(L.reinstall,e=>{var t,r;return t=e.app,r=e.appPath,[ro(t,"missing first positional"),ro(r,"missing second positional")]}),sM={name:"install",metadata:sw,definition:sk,cliSchema:{usageOverride:"install <path> | install <app> <path>",listUsageOverride:"install <path>",positionalArgs:["appOrPath","path?"]},cliReader:(e,t)=>(function(e,t){let[r,n]=e,i=void 0!==n;return{...tZ(t),...i?{app:ra(r,"install requires app")}:{},appPath:ra(i?n:r,"install requires path")}})(e,t),daemonWriter:sA,cliOutputFormatter:oW.install},sR={name:"reinstall",metadata:sx,definition:sI,cliSchema:{positionalArgs:["app","path"]},cliReader:(e,t)=>{var r;return r=e,{...tZ(t),app:ra(r[0],"reinstall requires app"),appPath:ra(r[1],"reinstall requires path")}},daemonWriter:s$,cliOutputFormatter:oW.reinstall},sN={name:"install-from-source",metadata:sS,definition:sD,cliSchema:{usageOverride:"install-from-source <url> | install-from-source --github-actions-artifact <owner/repo:artifact>",listUsageOverride:"install-from-source",helpDescription:"Install app builds from URLs, remote source specs, or CI artifacts resolved by a remote daemon.",summary:"Install app builds from URLs, remote source specs, or CI artifacts",positionalArgs:["url?"],allowedFlags:["header","githubActionsArtifact","installSource","retainPaths","retentionMs"]},cliReader:(e,t)=>({...tZ(t),source:function(e,t){let r=e[0]?.trim();if(e.length>1)throw new A("INVALID_ARGS","install-from-source accepts either one <url> positional or --github-actions-artifact");let n=t.githubActionsArtifact?function(e,t="--github-actions-artifact"){let r=e.indexOf(":");if(r<=0||r===e.length-1)throw new A("INVALID_ARGS",`${t} must use owner/repo:artifact, for example thymikee/RNCLI83:6635342232`);let{owner:n,repo:i}=sb(e.slice(0,r),t);return sy(n,i,e.slice(r+1),`${t} artifact`)}(t.githubActionsArtifact):void 0,i=t.installSource;if(1!=+!!r+ +!!n+ +!!i)throw new A("INVALID_ARGS","install-from-source requires exactly one source: <url>, --github-actions-artifact, or config installSource");if(!r&&t.header&&t.header.length>0)throw new A("INVALID_ARGS","install-from-source --header is only supported for URL sources");return n||i||{kind:"url",url:r,headers:function(e){if(!e||0===e.length)return;let t={};for(let r of e){let e=r.indexOf(":");if(e<=0)throw new A("INVALID_ARGS",`Invalid --header value "${r}". Expected "name:value".`);let n=r.slice(0,e).trim(),i=r.slice(e+1).trim();if(!n)throw new A("INVALID_ARGS",`Invalid --header value "${r}". Header name cannot be empty.`);t[n]=i}return t}(t.header)}}(e,t),retainPaths:t.retainPaths,retentionMs:t.retentionMs}),daemonWriter:e=>tQ(G.installSource,[],{...e,installSource:e.source,retainMaterializedPaths:e.retainPaths,materializedPathRetentionMs:e.retentionMs}),cliOutputFormatter:oW["install-from-source"]},sL=n_("prepare","Prepare platform helper infrastructure.",{action:ty(tS(["ios-runner"])),timeoutMs:tw("Maximum wall-clock time for the prepare command.")}),sO=ru(sL,(e,t)=>e.command.prepare(t)),sP={name:"prepare",metadata:sL,definition:sO,cliSchema:{usageOverride:"prepare ios-runner --platform ios|macos [--timeout <ms>]",listUsageOverride:"prepare",helpDescription:'Prepare platform helper infrastructure. ios-runner builds/reuses, starts, and health-checks the XCTest runner so later Apple snapshots and interactions do not pay first-use startup cost. In CI, run it after boot/install and before replay/test; if replay/test starts a separate daemon, stop the prepare daemon before replay/test so it does not keep the prepared runner lease. It is not a recovery step for "runner already owned by another agent-device daemon"; stop the owning daemon on the Mac with simulator access instead. Runner build/start output is written to the session runner.log; daemon.log is for daemon lifecycle/startup issues.',summary:"Pre-warm platform helpers, especially the iOS/macOS XCTest runner before Apple automation",positionalArgs:["ios-runner"],allowedFlags:["timeoutMs"]},cliReader:(e,t)=>({...tZ(t),action:ra(e[0],"prepare requires subcommand"),timeoutMs:t.timeoutMs}),daemonWriter:tY(L.prepare,e=>[ro(e.action,"prepare requires subcommand")]),cliOutputFormatter:oW.prepare},sC=n_("push","Deliver a push payload.",{app:ty(tb()),payload:ty(tI({oneOf:[tf(),tg()]}))}),sF=n_("trigger-app-event","Trigger an app-defined event.",{event:ty(tb()),payload:tH(tg(void 0),function(e,t){let r=e[t];if(void 0!==r){if(!r||"object"!=typeof r||Array.isArray(r))throw Error(`Expected ${t} to be an object.`);return r}})}),sE=ru(sC,(e,t)=>e.apps.push(t)),sT=ru(sF,(e,t)=>e.apps.triggerEvent(t)),s_=[{name:"push",metadata:sC,definition:sE,cliSchema:{listUsageOverride:"push",helpDescription:"Deliver push notification payloads to an installed app.",summary:"Deliver push notification payloads to an installed app",positionalArgs:["bundleOrPackage","payloadOrJson"]},cliReader:(e,t)=>({...tZ(t),app:ra(e[0],"push requires bundleOrPackage"),payload:ra(e[1],"push requires payloadOrJson")}),daemonWriter:tY(L.push,e=>{var t;return[(t=e).app,"string"==typeof t.payload?t.payload:JSON.stringify(t.payload)]})},{name:"trigger-app-event",metadata:sF,definition:sT,cliSchema:{usageOverride:"trigger-app-event <event> [payloadJson]",listUsageOverride:"trigger-app-event",helpDescription:"Invoke app-defined automation or test events with an optional structured payload.",summary:"Invoke app-defined automation/test events with optional structured payloads",positionalArgs:["event","payloadJson?"]},cliReader:(e,t)=>({...tZ(t),event:ra(e[0],"trigger-app-event requires event"),payload:e[1]?function(e,t){try{let t=JSON.parse(e);if(t&&"object"==typeof t&&!Array.isArray(t))return t}catch{}throw new A("INVALID_ARGS",`${t} must be a JSON object`)}(e[1],"trigger-app-event payload"):void 0}),daemonWriter:tY(L.triggerAppEvent,e=>{var t;return[(t=e).event,...t.payload?[JSON.stringify(t.payload)]:[]]})}],sj=n_("session","List active sessions or print daemon state directory.",{action:tS(["list","state-dir"],"list shows active sessions; state-dir prints the resolved daemon state directory without contacting the daemon.")}),sU=ru(sj,async(e,{action:t,...r})=>"state-dir"===t?{stateDir:await e.sessions.stateDir(r)}:{sessions:await e.sessions.list(r)}),sB={name:"session",metadata:sj,definition:sU,cliSchema:{usageOverride:"session list | session state-dir",listUsageOverride:"session",helpDescription:"List active sessions or print the effective daemon state directory",positionalArgs:["list|state-dir?"]},cliReader:(e,t)=>({...tZ(t),action:function(e){let t=e??"list";if("list"===t||"state-dir"===t)return t;throw new A("INVALID_ARGS","session only supports list or state-dir")}(e[0])}),cliOutputFormatter:oW.session};function sV(e,t){let r=void 0===e?NaN:Number(e);if(!Number.isInteger(r)||r<1)throw new A("INVALID_ARGS",`viewport ${t} must be a positive integer`);return r}let sz=n_("viewport","Resize the active web viewport.",{width:ty(tw("Viewport width in CSS pixels.",{min:1})),height:ty(tw("Viewport height in CSS pixels.",{min:1}))}),sq=ru(sz,(e,t)=>e.command.viewport(t)),sG=rs({name:"management",commands:[sc,sd,sp,oY,sh,sP,o6,sB,o9,o7,{name:"viewport",metadata:sz,definition:sq,cliSchema:{helpDescription:"Resize the active web viewport before taking snapshots or screenshots. Useful for fixed-layout or 100vh apps where changing the viewport reveals different content.",summary:"Resize the active web viewport for the current session",positionalArgs:["width","height"]},cliReader:(e,t)=>({...tZ(t),width:sV(e[0],"width"),height:sV(e[1],"height")}),daemonWriter:tY(L.viewport,e=>{let{width:t,height:r}=e;return[String(t),String(r)]}),cliOutputFormatter:oW.viewport},sM,sR,sN,...s_]}),sW="metro",sH=n_(sW,"Prepare Metro runtime or reload React Native apps.",{action:ty(tS(["prepare","reload"])),projectRoot:tb(),kind:tI(tf()),publicBaseUrl:tb(),proxyBaseUrl:tb(),bearerToken:tb(),bridgeScope:tI({type:"object",additionalProperties:!0}),launchUrl:tb(),port:tw(),listenHost:tb(),statusHost:tb(),startupTimeoutMs:tw(),probeTimeoutMs:tw(),reuseExisting:tx(),installDependenciesIfNeeded:tx(),runtimeFilePath:tb(),logPath:tb(),metroHost:tb(),metroPort:tw(),bundleUrl:tb(),timeoutMs:tw()}),sK=ru(sH,async(e,t)=>{var r,n,i;return"prepare"===t.action?await e.metro.prepare({projectRoot:(r=t).projectRoot,kind:r.kind,publicBaseUrl:r.publicBaseUrl,proxyBaseUrl:r.proxyBaseUrl,bearerToken:r.bearerToken,bridgeScope:r.bridgeScope??((n=r).tenant&&n.runId&&n.leaseId?{tenantId:n.tenant,runId:n.runId,leaseId:n.leaseId}:void 0),port:r.port,listenHost:r.listenHost,statusHost:r.statusHost,startupTimeoutMs:r.startupTimeoutMs,probeTimeoutMs:r.probeTimeoutMs,reuseExisting:r.reuseExisting,installDependenciesIfNeeded:r.installDependenciesIfNeeded,runtimeFilePath:r.runtimeFilePath}):await e.metro.reload({metroHost:(i=t).metroHost,metroPort:i.metroPort,bundleUrl:i.bundleUrl,timeoutMs:i.timeoutMs})}),sX=rs({name:"metro",commands:[{name:sW,metadata:sH,definition:sK,cliSchema:{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",helpDescription:"Prepare a local Metro runtime or ask Metro to reload connected React Native apps",summary:"Prepare Metro reachability for React Native/Expo apps or trigger app reloads",positionalArgs:["prepare|reload"],allowedFlags:[...nS,...nx]},cliReader:(e,t)=>{let r=(e[0]??"").toLowerCase();if("prepare"!==r&&"reload"!==r)throw new A("INVALID_ARGS","metro requires a subcommand: prepare or reload");if("reload"===r)return{action:r,metroHost:t.metroHost,metroPort:t.metroPort,bundleUrl:t.bundleUrl,timeoutMs:t.metroProbeTimeoutMs};if(!t.metroPublicBaseUrl&&!t.metroProxyBaseUrl)throw new A("INVALID_ARGS","metro prepare requires --public-base-url <url> or --proxy-base-url <url>.");return{action:r,projectRoot:t.metroProjectRoot,kind:function(e){if(void 0!==e){if("auto"===e||"react-native"===e||"expo"===e)return e;throw new A("INVALID_ARGS","metro prepare --kind must be auto, react-native, or expo")}}(t.kind??t.metroKind),port:t.metroPreparePort,listenHost:t.metroListenHost,statusHost:t.metroStatusHost,publicBaseUrl:t.metroPublicBaseUrl,proxyBaseUrl:t.metroProxyBaseUrl,bearerToken:t.metroBearerToken,bridgeScope:t.tenant&&t.runId&&t.leaseId?{tenantId:t.tenant,runId:t.runId,leaseId:t.leaseId}:void 0,startupTimeoutMs:t.metroStartupTimeoutMs,probeTimeoutMs:t.metroProbeTimeoutMs,reuseExisting:!t.metroNoReuseExisting&&void 0,installDependenciesIfNeeded:!t.metroNoInstallDeps&&void 0,runtimeFilePath:t.metroRuntimeFile}},cliOutputFormatter:({input:e,result:t})=>{var r;return{data:(r={result:t,action:e.action}).result,text:"reload"===r.action?`Reloaded React Native apps via ${r.result.reloadUrl}`:JSON.stringify(r.result,null,2)}}}]}),sJ=["path","start","stop","doctor","mark","clear"],sY=["started","stopped","marked","cleared","restarted","removedRotatedFiles"],sQ={logs:rm(function(e){var t;return{data:e,text:e.path,stderr:s3([s2(e,["active","state","backend","sizeBytes"]),(t=e,sY.map(e=>{var r,n;return r=e,null==(n=t[e])?"":`${r}=${n}`}).filter(Boolean).join(" ")||void 0),e.hint,s5(e.notes)])}}),network:rm(function(e){let t=[],r=e.entries??[];if(e.path&&t.push(e.path),0===r.length)t.push("No recent HTTP(s) entries found.");else for(let e of r)t.push(...function(e){let t=e.method??"HTTP",r=e.url??"<unknown-url>",n=void 0!==e.status?` status=${e.status}`:"",i=e.timestamp?`${e.timestamp} `:"",a=void 0!==e.durationMs?` durationMs=${e.durationMs}`:"",o=[`${i}${t} ${r}${n}${a}`];return e.headers?s1(o,"headers",e.headers):(s0(o,"request headers",e.requestHeaders),s0(o,"response headers",e.responseHeaders)),s1(o,"request",e.requestBody),s1(o,"response",e.responseBody),o}(e));return{data:e,text:t.join("\n"),stderr:s3([s2(e,["active","state","backend","include","scannedLines","matchedLines"]),s5(e.notes)])}}),audio:rm(function(e){let t=[`Audio probe: ${String(e.state??"stopped")} heard=${String(!0===e.heard)}`,sZ("rmsDbfs",e.rmsDbfs),sZ("peakDbfs",e.peakDbfs)].filter(e=>!!e);return{data:e,text:t.join("\n"),stderr:s3([s2(e,["active","backend","source","durationMs","elapsedMs","bucketMs","sampleCount","sourceCount","mediaElementCount"]),s5(e.notes)])}})};function sZ(e,t){if(!Array.isArray(t))return;let r=t.filter(e=>"number"==typeof e&&Number.isFinite(e));return r.length>0?`${e}: [${r.join(", ")}]`:void 0}function s0(e,t,r){r&&0!==Object.keys(r).length&&e.push(` ${t}: ${JSON.stringify(r)}`)}function s1(e,t,r){void 0!==r&&e.push(` ${t}: ${r}`)}function s2(e,t){return t.map(t=>void 0!==e[t]&&null!==e[t]?`${t}=${e[t]}`:"").filter(Boolean).join(" ")||void 0}function s5(e){let t=e?.filter(e=>e.length>0)??[];return t.length>0?t.join("\n"):void 0}function s3(e){return e.filter(e=>!!e).join("\n")||void 0}let s4="logs",s8="network",s6="audio",s9=["probe"],s7=["start","status","stop"],le=n_(s4,"Manage session app logs.",{action:tS(sJ),message:tb(),restart:tx()}),lt=n_(s8,"Show recent HTTP traffic.",{action:tS(["dump","log"]),limit:tw(),include:tS(y)}),lr=n_(s6,"Probe audio levels.",{action:tS(s9),probeAction:tS(s7),durationMs:tw("Probe duration in milliseconds."),bucketMs:tw("Audio level bucket size in milliseconds.")}),ln=ru(le,(e,t)=>e.observability.logs(t)),li=ru(lt,(e,t)=>e.observability.network(t)),la=ru(lr,(e,t)=>e.observability.audio(t)),lo=tY(s4,e=>{var t;return[(t=e).action??"path",...rn(t.message)]}),ls=rs({name:"observability",commands:[{name:s4,metadata:le,definition:ln,cliSchema:{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"]},cliReader:(e,t)=>({...tZ(t),action:function(e){if(void 0!==e)return r2(sJ,e,{message:"logs requires path, start, stop, doctor, mark, or clear"})}(e[0]),message:e.slice(1).join(" ")||void 0,restart:t.restart}),daemonWriter:lo,cliOutputFormatter:sQ.logs},{name:s8,metadata:lt,definition:li,cliSchema:{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]",listUsageOverride:"network",helpDescription:"Dump recent HTTP(s) traffic parsed from the session app log",summary:"Inspect HTTP(S) traffic parsed from session app logs, including summaries, headers, and bodies",positionalArgs:["dump|log","limit?","include?"],allowedFlags:["networkInclude"]},cliReader:(e,t)=>({...tZ(t),action:function(e){if(void 0!==e){if("dump"===e||"log"===e)return e;throw new A("INVALID_ARGS","network requires dump or log")}}(e[0]),limit:rr(e[1]),include:t.networkInclude??function(e){if(void 0!==e)return r2(y,e,{message:"network include must be summary, headers, body, or all"})}(e[2])}),daemonWriter:e=>{var t;return tQ(s8,[...(t=e).action?[t.action]:[],...ri(t.limit)],{...e,networkInclude:e.include})},cliOutputFormatter:sQ.network},{name:s6,metadata:lr,definition:la,cliSchema:{usageOverride:"audio probe start [durationSeconds] [bucketMs] | audio probe status | audio probe stop",listUsageOverride:"audio",helpDescription:"Probe browser or host-rendered simulator/emulator audio as compact dBFS buckets",summary:"Probe audio levels",positionalArgs:["probe","start|status|stop","durationSeconds?","bucketMs?"]},cliReader:(e,t)=>{let r;return{...tZ(t),action:function(e){if(void 0!==e)return r2(s9,e,{message:"audio requires probe"})}(e[0]),probeAction:function(e){if(void 0!==e)return r2(s7,e,{message:"audio probe requires start, status, or stop"})}(e[1]),durationMs:void 0===(r=rr(e[2]))?void 0:Math.round(1e3*r),bucketMs:rr(e[3])}},daemonWriter:e=>{var t;return tQ(s6,[(t=e).action??"probe",t.probeAction??"status",...ri(t.durationMs),...ri(t.bucketMs)],e)},cliOutputFormatter:sQ.audio}]}),ll={perf:rm(function(e){return{data:e,text:function(e){var t;let r="xctrace"===(t=e).kind?function(e){var t,r,n,i,a;let o="string"==typeof e.perf?e.perf:void 0,s="string"==typeof(t=e).outPath?t.outPath:"string"==typeof t.reportPath?t.reportPath:void 0;if(o&&s&&"xctrace"===e.kind){let t;return r=s,n="string"==typeof e.mode?e.mode:"capture",i=o,a=e.template,t=[r,`Perf ${n}: ${i}`],"string"==typeof a&&t.push(`Template: ${a}`),t.join("\n")}}(t):function(e){var t;let r,n,i,a=(r=lu((t=e).action),n=lu(t.kind),i=lu(t.type),r&&n&&i?{action:r,kind:n,type:i}:void 0);if(a){let t;return`Perf ${a.action}: ${a.kind} ${a.type}${(t=lu(e.state))?` state=${t}`:""}${function(e){let t=lu(e.outPath);if(!t)return"";let r=ld(e.sizeBytes);return`
|
|
29
|
-
${t}${void 0!==r?` (${
|
|
30
|
-
Trace frame health: dropped ${lp(n)} (${Math.round(i)}/${Math.round(a)} frames)`}(e)}`}}(t);if(r)return r;let n=H(e.artifact)?e.artifact:void 0;return n?function(e){let t="string"==typeof e.kind?e.kind:"memory";if(!1===e.available){let r="string"==typeof e.reason&&e.reason.length>0?e.reason:"not available";return`Memory artifact (${t}): unavailable - ${r}`}let r="string"==typeof e.path?e.path:void 0,n=ld(e.sizeBytes),i=void 0===n?"":` (${lf(n)})`;return r?`Memory artifact (${t}): ${r}${i}`:`Memory artifact (${t}): captured${i}`}(n):function(e){var t,r,n,i,a;let o,s,l,u,c,d=H(e?.fps)?e.fps:void 0,p=(t=e,o=H(t?.cpu)?t.cpu:void 0,s=H(t?.memory)?t.memory:void 0,(l=[function(e){if(e?.available!==!0)return;let t=ld(e.usagePercent);return void 0!==t?`CPU ${lp(t)}`:void 0}(o),function(e){let t;if(e?.available!==!0)return;let r=ld(e.residentMemoryKb)??ld(e.totalPssKb)??ld(e.totalRssKb);return void 0!==r?`memory ${t=r/1024,`${t>=10?Math.round(t):t.toFixed(1)}MB`}`:void 0}(s)].filter(e=>!!e)).length>0?l.join(", "):void 0);if(!d)return lc(p,"missing frame metric");if(!1===d.available){return lc(p,"string"==typeof(r=d).reason&&r.reason.length>0?r.reason:"not available")}let m=function(e){let t=ld(e.droppedFramePercent),r=ld(e.droppedFrameCount);if(void 0!==t&&void 0!==r){var n,i,a;return[`dropped ${lp(t)}`,(n=r,void 0!==(i=ld(e.totalFrameCount))?`(${Math.round(n)}/${Math.round(i)} frames)`:`(${Math.round(n)} dropped frames)`),void 0!==(a=ld(e.sampleWindowMs))?`window ${lm(a)}`:""].filter(Boolean).join(" ")}}(d);return m?(n=d,i=m,u=[`Frame health: ${i}`],(c=Array.isArray((a=n).worstWindows)?a.worstWindows.flatMap(e=>{if(!H(e))return[];let t=function(e){let t=ld(e.startOffsetMs),r=ld(e.endOffsetMs),n=ld(e.missedDeadlineFrameCount);if(void 0===t||void 0===r||void 0===n)return;let i=ld(e.worstFrameMs),a=void 0===i?"":`, worst ${lm(i)}`;return`- +${lm(t)}-+${lm(r)}: ${Math.round(n)} missed-deadline frames${a}`}(e);return t?[t]:[]}):[]).length>0&&u.push("Worst windows:",...c),u.join("\n")):lc(p,"missing dropped-frame summary")}(H(e.metrics)?e.metrics:void 0)}(e)}})};function lu(e){return"string"==typeof e?e:void 0}function lc(e,t){return e?`Performance: ${e}`:`Frame health: unavailable - ${t}`}function ld(e){return"number"==typeof e&&Number.isFinite(e)?e:void 0}function lp(e){return`${Number.isInteger(e)?e:e.toFixed(1)}%`}function lm(e){let t=Math.max(0,Math.round(e));if(t<1e3)return`${t}ms`;let r=Math.round(t/1e3);if(r<60)return`${r}s`;let n=Math.floor(r/60),i=r%60;return i>0?`${n}m ${i}s`:`${n}m`}function lf(e){if(e<1024)return`${Math.round(e)}B`;let t=e/1024;if(t<1024)return`${t>=10?Math.round(t):t.toFixed(1)}KB`;let r=t/1024;return`${r>=10?Math.round(r):r.toFixed(1)}MB`}let lh="perf",lg=n_(lh,"Show session performance, frame health, and memory diagnostics.",{area:tS(r6),subject:tS(r7),action:tS(r9),kind:tS(ne),template:tb("xctrace template name, for example Time Profiler."),out:tb("Output artifact path."),tracePath:tb("Existing .trace path to report, defaults to the latest session trace.")}),ly=ru(lg,(e,t)=>e.observability.perf(t)),lb=tY(lh,e=>{var t;let r;return"cpu"===(r=(t=e).area??(t.action?"metrics":void 0))?lw([...rn(r),...rn(t.subject),...rn(t.action),...rn(t.kind)],t):"trace"===r?lw([...rn(r),...rn(t.action),...rn(t.kind)],t):[...rn(r),...rn(t.action)]}),lv=rs({name:"perf",commands:[{name:lh,metadata:lg,definition:ly,cliSchema:{usageOverride:"perf metrics --json\n agent-device perf frames --json\n agent-device perf memory sample --json\n agent-device perf memory snapshot [--kind android-hprof|memgraph] [--out <path>]\n agent-device perf cpu profile start --kind xctrace [--template <name>] --out <profile.trace>\n agent-device perf cpu profile stop --kind xctrace --out <profile.trace>\n agent-device perf cpu profile report --kind xctrace --out <report.json>\n agent-device perf trace start|stop --kind xctrace [--template <name>] --out <path>\n agent-device perf cpu profile start --kind simpleperf --out <cpu.perf.data>\n agent-device perf cpu profile stop --kind simpleperf\n agent-device perf cpu profile report --kind simpleperf --out <cpu-report.json>\n agent-device perf trace start|stop --kind perfetto [--out <path>]",listUsageOverride:"perf",helpDescription:"Show session performance metrics, focused frame/jank health, memory diagnostics artifacts, Apple xctrace artifacts, or Android native Simpleperf/Perfetto artifacts. Prefer explicit perf metrics --json for first-pass startup/CPU/memory data. For CPU profiles, start/stop write the raw artifact and report writes a compact .json summary; include report after simpleperf stop when the task needs agent-readable native CPU evidence. Bare perf and metrics remain aliases. Native perf output is agent evidence: compact state, artifact path, and size only; raw profiles/traces stay on disk.",summary:"Check runtime metrics, frames, memory, CPU profiles, or native trace artifacts",positionalArgs:["area?","subjectOrAction?","action?"],allowedFlags:["kind","perfTemplate","out"]},cliReader:(e,t)=>{var r;return{...tZ(t),...function(e,t={}){if(void 0!==e[0]&&void 0===e[1]){let r=lx(e[0],{allowUndefined:!0});if(r)return{action:r,kind:lS(t.kind),out:t.out}}let r=function(e){if(void 0===e)return;let t=e.toLowerCase();if(nd(t))return t;throw new A("INVALID_ARGS",no)}(e[0]);return"cpu"===r?{area:r,subject:function(e){let t=e?.toLowerCase();if(void 0!==t&&nm(t))return t;throw new A("INVALID_ARGS",nl)}(e[1]),action:lx(e[2]),kind:lS(t.kind),template:t.template,out:t.out}:"trace"===r?{area:r,action:lx(e[1]),kind:lS(t.kind),template:t.template,out:t.out}:{area:r,action:lx(e[1]),kind:lS(t.kind),out:t.out}}(e,{kind:"string"==typeof(r=t.kind)?lS(r):void 0,template:t.perfTemplate,out:t.out})}},daemonWriter:lb,cliOutputFormatter:ll.perf}]});function lw(e,t){let r=[...e];return(t.template||t.out||t.tracePath)&&r.push(t.template??""),(t.out||t.tracePath)&&r.push(t.out??""),t.tracePath&&r.push(t.tracePath),r}function lx(e,t={}){if(void 0===e)return;let r=e.toLowerCase();if(np(r))return r;if(!t.allowUndefined)throw new A("INVALID_ARGS",ns)}function lS(e){if(void 0===e)return;let t=e.toLowerCase();if(nf(t))return t;throw new A("INVALID_ARGS",nu)}let lk=/\b(logbox|redbox|reload js|copy stack|component stack|call stack|runtime error|open debugger to view warnings)\b/,lI=/\b(redbox|runtime error|reload js|copy stack|component stack|call stack)\b/,lD=[/\b[\w.$<>/-]+\.(?:tsx?|jsx?):\d+(?::\d+)?\b/,/\b[\w.$<>/-]+\.(?:tsx?|jsx?)\s+\(\d+:\d+\)/],lA=[/^!,\s+/,/^(warn|warning|error):\s+/,/\b(?:possible\s+)?unhandled (?:promise )?rejection\b/],l$=["open debugger to view warnings","getsnapshot should be cached to avoid an infinite loop",'unique "key" prop',"unique 'key' prop","virtualizedlists should never be nested","failed prop type"],lM=new Set(["x","\xd7","✕","✖","⨯"]);function lR(e){if(lL(e).detected)return"Hint: React Native warning/error overlay detected. It overlays part of the app and should be handled before interacting.\nRun: agent-device react-native dismiss-overlay\nThe command verifies the overlay is gone. Run agent-device snapshot -i afterward only when you need fresh refs for the next action."}function lN(e){return lL(e)}function lL(e){var t,r,n,i,a,o,s,l,u,c;let d,p,m,f,h,g,y,b,v=(d=(t=e).map(lF).join("\n").toLowerCase(),p=lG(t,lj),m=lG(t,lB),f=lG(t,lT,lV),h=lG(t,l_),g=(r=d,lD.some(e=>e.test(r))),y=lE(d),b=(n=d,i=p,a=m,i.length>0||a.length>0||/\b(reload js|copy stack)\b/.test(n)),{dismissNodes:p,minimizeNodes:m,collapsedNodes:f,redBox:(o=d,s=g,l=b,lI.test(o)||lE(o)||s&&l),detected:(u={text:d,hasReactNativeStackFrame:g,hasOverlayControl:b,hasControllessRedBoxText:y,collapsedNodes:f,openDebuggerWarningNodes:h}).collapsedNodes.length>0||u.openDebuggerWarningNodes.length>0||u.hasControllessRedBoxText||u.hasOverlayControl&&(c=u.text,lk.test(c)||u.hasReactNativeStackFrame)}),w=v.detected?function(e){let t=lH(e.dismissNodes,lW);if(t){let e;var r,n=t,i=(r=t,(e=lX(r)?.trim().toLowerCase())&&lU(e)?"dismiss":"close");if(!n.rect)throw Error("React Native overlay target node must have rect");return{action:i,point:x(n.rect),rect:n.rect,ref:n.ref,label:lX(n)}}let a=lH(e.collapsedNodes.filter(lz),lK);return a?.rect?{action:"close-collapsed-banner",point:function(e){var t,r;if(!e.rect)throw Error("Collapsed React Native warning node must have rect");let n=Math.min(e.rect.height,52),i=Math.min(36,Math.max(18,.45*n));return{x:Math.round((t=e.rect.x+e.rect.width-i,r=e.rect.x+1,Math.min(e.rect.x+e.rect.width-1,Math.max(r,t)))),y:Math.round(e.rect.y+n/2)}}(a),rect:a.rect,ref:a.ref,label:lX(a)}:null}(v):null;return{detected:v.detected,redBox:v.redBox,dismissNodes:v.dismissNodes,minimizeNodes:v.minimizeNodes,collapsedNodes:v.collapsedNodes,primaryAction:w}}function lO(e){return[...e.dismissNodes,...e.minimizeNodes,...e.collapsedNodes]}function lP(e){var t;return lT(e.label?.trim())&&!!(t=e.rect)&&t.x<=1&&t.y<=1&&t.width>=300&&t.height>=600}function lC(e,t){let r=e.label?.trim();return!!r&&!!lP(e)&&t.some(e=>e.label?.trim()===r&&lq(e))}function lF(e){return[e.label,e.value,e.identifier,e.type,e.role].filter(Boolean).join(" ")}function lE(e){return/\buncaught\b/.test(e)&&/unable to download asset/.test(e)}function lT(e){let t=e?.trim().toLowerCase();return!!t&&(l$.some(e=>t.includes(e))||lA.some(e=>e.test(t)))}function l_(e){return e.includes("open debugger to view warnings")||/^!,\s+open debugger\b/.test(e)}function lj(e){var t,r;return lU(e)||(t=e,/^close(?:\s*\([^)]*\))?$/i.test(t))||(r=e,lM.has(r))}function lU(e){return/^dismiss(?:\s*\([^)]*\))?$/i.test(e)}function lB(e){return/^minimi[sz]e(?:\b|\s|\()/i.test(e)}function lV(e){return!e.rect||e.rect.height<=180}function lz(e){let t=lX(e)?.trim().toLowerCase()??"";return(l_(t)||/^!,\s+/.test(t))&&lq(e)}function lq(e){return!!e.rect&&e.rect.width>=120&&e.rect.height>=36&&e.rect.height<=180}function lG(e,t,r=()=>!0){let n=[];for(let i of e)i.ref&&r(i)&&[i.label,i.value,i.identifier].map(e=>e?.trim().toLowerCase()).filter(e=>!!e).some(e=>t(e))&&n.push(i);return n}function lW(e){var t;let r;return[+(!0===(r=[e.type,e.role,e.subrole].join(" ").toLowerCase(),/\b(button|menuitem|link)\b/.test(r))),+(!0===e.hittable),-((t=e.rect)?t.width*t.height:1/0)]}function lH(e,t){let r=e.filter(e=>e.rect);return 0===r.length?null:r.sort((e,r)=>(function(e,t){for(let r=0;r<e.length;r+=1){let n=e[r]-t[r];if(0!==n)return n}return 0})(t(r),t(e)))[0]??null}function lK(e){return[+(!0===e.hittable),e.rect?.width??0,e.rect?.y??0]}function lX(e){return e.label??e.value??e.identifier}let lJ="react-native",lY=n_(lJ,"Run supported React Native app automation helpers.",{action:ty(tS(["dismiss-overlay"]))}),lQ=ru(lY,(e,t)=>e.command.reactNative(t)),lZ=tY(lJ,e=>[ro(e.action,"react-native requires action")]),l0=rs({name:"react-native",commands:[{name:lJ,metadata:lY,definition:lQ,cliSchema:{usageOverride:"react-native dismiss-overlay",listUsageOverride:"react-native dismiss-overlay",positionalArgs:["dismiss-overlay"]},cliReader:(e,t)=>({...tZ(t),action:function(e){if("dismiss-overlay"===e)return e;throw new A("INVALID_ARGS","react-native supports only: dismiss-overlay")}(e[0])}),daemonWriter:lZ}]}),l1=["medium","high"];function l2(e){var t;let r;if(l1.includes(e))return e;let n=void 0!==(r="number"==typeof e?e:"string"==typeof(t=e)&&/^\d+$/.test(t)?Number(t):void 0)&&Number.isInteger(r)&&r>=5&&r<=10?r:void 0;if(void 0!==n)return n<=7?"medium":"high"}let l5={record:rm(function(e){let t,r="string"==typeof e.outPath?e.outPath:"",n=Array.isArray(t=e.chunks)?t.flatMap(e=>e&&"object"==typeof e?"number"!=typeof e.index||"string"!=typeof e.path?[]:[{index:e.index,path:e.path}]:[]):[];if(n.length<=1){var i,a;let t;return{data:e,text:(i=e,t=[],(a=r)&&t.push(a),"string"==typeof i.sessionStateDir&&t.push(`Session state: ${i.sessionStateDir}`),"string"==typeof i.warning&&t.push(`Warning: ${i.warning}`),"string"==typeof i.overlayWarning&&t.push(`Overlay warning: ${i.overlayWarning}`),t.join("\n"))}}let o=["Recording chunks:"];for(let e of n)o.push(` ${e.index}: ${e.path}`);return"string"==typeof e.telemetryPath&&o.push(`Telemetry: ${e.telemetryPath}`),"string"==typeof e.warning&&o.push(`Warning: ${e.warning}`),"string"==typeof e.overlayWarning&&o.push(`Overlay warning: ${e.overlayWarning}`),{data:e,text:o.join("\n")}})},l3="record",l4="trace",l8=["start","stop"],l6=n_(l3,"Start or stop screen recording.",{action:ty(tS(l8)),path:tb(),fps:tw(),maxSize:tw(),quality:tS(l1),hideTouches:tx()}),l9=n_(l4,"Start or stop trace capture.",{action:ty(tS(l8)),path:tb()}),l7=ru(l6,(e,t)=>e.recording.record(t)),ue=ru(l9,(e,t)=>e.recording.trace(t)),ut=tY(l3,e=>ui(e)),ur=tY(l4,e=>ui(e)),un=rs({name:"recording",commands:[{name:l3,metadata:l6,definition:l7,cliSchema:{usageOverride:"record start [path] [--fps <n>] [--max-size <px>] [--quality <medium|high>] [--hide-touches] | record stop",listUsageOverride:"record start [path] | record stop",helpDescription:"Start/stop screen recording; Android recordings longer than the 180s adb screenrecord limit are returned as multiple MP4 chunks. Use --max-size to limit dimensions and --quality to choose medium or high export quality",summary:"Start or stop screen recording",positionalArgs:["start|stop","path?"],allowedFlags:["fps","screenshotMaxSize","quality","hideTouches"]},cliReader:(e,t)=>({...tZ(t),action:ua(e[0],l3),path:e[1],fps:t.fps,maxSize:t.screenshotMaxSize,quality:t.quality,hideTouches:t.hideTouches}),daemonWriter:ut,cliOutputFormatter:l5.record},{name:l4,metadata:l9,definition:ue,cliSchema:{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?"]},cliReader:(e,t)=>({...tZ(t),action:ua(e[0],l4),path:e[1]}),daemonWriter:ur}]});function ui(e){return[e.action,...rn(e.path)]}function ua(e,t){if("start"===e||"stop"===e)return e;throw new A("INVALID_ARGS",`${t} requires start|stop`)}let uo="replay",us="test",ul="Replay a recorded session.",uu=n_(uo,ul,{path:ty(tb()),update:tx(),backend:tb(),maestro:tx(),env:tk()}),uc=n_(us,"Run one or more replay scripts.",{paths:ty(tk()),update:tx(),backend:tb(),maestro:tx(),env:tk(),failFast:tx(),timeoutMs:tw(),retries:tw(),recordVideo:tx(),artifactsDir:tb(),shardAll:tw(),shardSplit:tw()}),ud=ru(uu,(e,t)=>e.replay.run(t)),up=ru(uc,(e,t)=>e.replay.test(t)),um=rs({name:"replay",commands:[{name:uo,metadata:uu,definition:ud,cliSchema:{usageOverride:"replay <path> | replay export <file.ad> [--format maestro] [--out <path>]",helpDescription:"Replay a recorded session. For Maestro YAML compatibility flows, use replay <flow.yaml> --maestro and keep the target binding such as --platform ios on the replay command.",summary:ul,positionalArgs:["path"],allowsExtraPositionals:!0,allowedFlags:["replayMaestro","replayExportFormat",...nI,"timeoutMs","out"]},cliReader:(e,t)=>({...tZ(t),path:ra(e[0],"replay requires path"),update:t.replayUpdate,backend:t.replayMaestro?"maestro":void 0,env:t.replayEnv}),daemonWriter:e=>tQ(uo,[ro(e.path,"replay requires path")],{...e,replayUpdate:e.update,replayBackend:uf(e),replayEnv:e.env,replayShellEnv:uh(process.env)})},{name:us,metadata:uc,definition:up,cliSchema:{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",...nI,"failFast","timeoutMs","retries","recordVideo","artifactsDir","reporter","reportJunit","shardAll","shardSplit"]},cliReader:(e,t)=>({...tZ(t),paths:e,update:t.replayUpdate,backend:t.replayMaestro?"maestro":void 0,env:t.replayEnv,failFast:t.failFast,timeoutMs:t.timeoutMs,retries:t.retries,recordVideo:t.recordVideo,artifactsDir:t.artifactsDir,shardAll:t.shardAll,shardSplit:t.shardSplit}),daemonWriter:e=>{let t;return tQ(us,e.paths??[],{...(t={...e},delete t.reporter,delete t.reportJunit,t),replayUpdate:e.update,replayBackend:uf(e),replayEnv:e.env,replayShellEnv:uh(process.env)})}}]});function uf(e){return e.backend??(!0===e.maestro?"maestro":void 0)}function uh(e){let t={};for(let[r,n]of Object.entries(e))"string"==typeof n&&r.startsWith("AD_VAR_")&&(t[r]=n);return t}let ug=["in-app","system"],uy=["portrait","portrait-upside-down","landscape-left","landscape-right"];function ub(e){if(void 0===e)throw new A("INVALID_ARGS","rotate requires an orientation argument. Use portrait|portrait-upside-down|landscape-left|landscape-right.");switch(e?.trim().toLowerCase()){case"portrait":return"portrait";case"portrait-upside-down":case"upside-down":return"portrait-upside-down";case"landscape-left":case"left":return"landscape-left";case"landscape-right":case"right":return"landscape-right";default:throw new A("INVALID_ARGS",`Invalid rotation: ${e}. Use portrait|portrait-upside-down|landscape-left|landscape-right.`)}}let uv={appstate:rm(function(e){return{data:e,text:function(e){if("ios"===e.platform){let t=[`Foreground app: ${e.appName??e.appBundleId??"unknown"}`];return e.appBundleId&&t.push(`Bundle: ${e.appBundleId}`),e.source&&t.push(`Source: ${e.source}`),t.join("\n")}if("android"===e.platform){let t=[`Foreground app: ${e.package??"unknown"}`];return e.activity&&t.push(`Activity: ${e.activity}`),t.join("\n")}return null}(e)}}),back:rf,home:rf,rotate:rf,"app-switcher":rf,keyboard:rm(function(e){if("android"===e.platform&&"status"===e.action){var t;let r=[`Keyboard visible: ${!0===e.visible?"yes":"no"}`,`Input type: ${e.type??e.inputType??"unknown"}`,`Input owner: ${e.inputOwner??"unknown"}`];return e.inputMethodPackage&&r.push(`Input method: ${e.inputMethodPackage}`),e.focusedPackage&&r.push(`Focused package: ${e.focusedPackage}`),e.focusedResourceId&&r.push(`Focused resource: ${e.focusedResourceId}`),r.push(`Next action: ${(t=e.visible,"ime"===e.inputOwner?"Focused input appears to be owned by the keyboard/IME; dismiss or change the IME before retrying text entry.":!0===t?"Keyboard is visible and focused input appears app-owned; fill/type can proceed.":"Keyboard is hidden; focus an app field before type, or use fill with a concrete target.")}`),{data:e,text:r.join("\n")}}return rh(e)}),clipboard:rm(function(e){return"read"===e.action?{data:e,text:e.text}:rh(e)})},uw="appstate",ux="back",uS="home",uk="rotate",uI="app-switcher",uD="keyboard",uA="clipboard",u$=n_(uw,"Show foreground app or activity.",{}),uM=n_(ux,"Navigate back.",{mode:tS(ug)}),uR=n_(uS,"Go to the home screen.",{}),uN=n_(uk,"Rotate device orientation.",{orientation:ty(tS(uy))}),uL=n_(uI,"Open the app switcher.",{}),uO=n_(uD,"Inspect or dismiss the keyboard.",{action:tS(["status","dismiss"])}),uP=n_(uA,"Read or write clipboard text.",{action:ty(tS(["read","write"])),text:tb()}),uC=ru(u$,(e,t)=>e.command.appState(t)),uF=ru(uM,(e,t)=>e.command.back(t)),uE=ru(uR,(e,t)=>e.command.home(t)),uT=ru(uN,(e,t)=>e.command.rotate(t)),u_=ru(uL,(e,t)=>e.command.appSwitcher(t)),uj=ru(uO,(e,t)=>e.command.keyboard(t)),uU=ru(uP,(e,t)=>e.command.clipboard(t)),uB=tY(uw),uV=tY(uS),uz=tY(uk,e=>[ro(e.orientation,"rotate requires orientation")]),uq=tY(uI),uG=tY(uD,e=>rn(e.action)),uW=tY(uA,e=>{var t;return"read"===(t=e).action?["read"]:["write",t.text]}),uH=[oz,sG,iL,rs({name:"system",commands:[{name:uw,metadata:u$,definition:uC,cliSchema:{helpDescription:"Show foreground app/activity"},cliReader:(e,t)=>tZ(t),daemonWriter:uB,cliOutputFormatter:uv.appstate},{name:ux,metadata:uM,definition:uF,cliSchema:{usageOverride:"back [--in-app|--system]",allowedFlags:["backMode"]},cliReader:(e,t)=>({...tZ(t),mode:t.backMode}),daemonWriter:e=>{var t;return tQ(ux,[],{...e,backMode:"in-app"===(t=e.mode)||"system"===t?t:void 0})},cliOutputFormatter:uv.back},{name:uS,metadata:uR,definition:uE,cliReader:(e,t)=>tZ(t),daemonWriter:uV,cliOutputFormatter:uv.home},{name:uk,metadata:uN,definition:uT,cliSchema:{usageOverride:"rotate <portrait|portrait-upside-down|landscape-left|landscape-right>",helpDescription:"Rotate device orientation on iOS and Android",positionalArgs:["orientation"]},cliReader:(e,t)=>({...tZ(t),orientation:ub(e[0])}),daemonWriter:uz,cliOutputFormatter:uv.rotate},{name:uI,metadata:uL,definition:u_,cliReader:(e,t)=>tZ(t),daemonWriter:uq,cliOutputFormatter:uv["app-switcher"]},{name:uD,metadata:uO,definition:uj,cliSchema:{usageOverride:"keyboard [status|get|dismiss|enter|return]",helpDescription:"Inspect Android keyboard visibility/type or press/dismiss the device keyboard. To hide the keyboard, use keyboard dismiss. It taps safe controls like Done when available, verifies the keyboard closed, and reports UNSUPPORTED_OPERATION when no safe control is available.",summary:"Inspect, press, or dismiss the device keyboard",positionalArgs:["action?"]},cliReader:(e,t)=>({...tZ(t),...function(e){if(e.length>1)throw new A("INVALID_ARGS","keyboard accepts at most one action argument.");return tW({action:function(e){let t=e?.toLowerCase();if("get"===t)return"status";if(void 0===t||"status"===t||"dismiss"===t||"enter"===t||"return"===t)return t;throw new A("INVALID_ARGS","keyboard action must be status, get, dismiss, enter, or return.")}(e[0])})}(e)}),daemonWriter:uG,cliOutputFormatter:uv.keyboard},{name:uA,metadata:uP,definition:uU,cliSchema:{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},cliReader:(e,t)=>({...tZ(t),...function(e){let t=e[0]?.toLowerCase();if("read"!==t&&"write"!==t)throw new A("INVALID_ARGS","clipboard requires a subcommand: read or write.");if("read"===t){if(1!==e.length)throw new A("INVALID_ARGS","clipboard read does not accept additional arguments.");return{action:t}}if(e.length<2)throw new A("INVALID_ARGS","clipboard write requires text.");return{action:t,text:e.slice(1).join(" ")}}(e)}),daemonWriter:uW,cliOutputFormatter:uv.clipboard}]}),l0,um,ls,lv,iE,un,sX,nT];function uK(){return uH.flatMap(e=>[...e.definitions])}function uX(){return uZ("cliSchemas")}function uJ(){return uZ("cliReaders")}function uY(){return uZ("daemonWriters")}function uQ(){return uZ("cliOutputFormatters")}function uZ(e){let t={};for(let r of uH){let n=r[e];if(n)for(let[r,i]of Object.entries(n)){if(Object.hasOwn(t,r))throw Error(`Duplicate ${String(e)} command family entry: ${r}`);t[r]=i}}return t}let u0=uH.flatMap(e=>[...e.metadata]),u1=new Map(u0.map(e=>[e.name,e]));function u2(){return[...u0]}function u5(){return B().map(e=>{let t=u4(e);if(!t)throw Error(`Missing command metadata for MCP-exposed command: ${e}`);return t})}function u3(e){return u1.has(e)}function u4(e){return u1.get(e)}export{ug as BACK_MODES,nA as COMMON_COMMAND_SUPPORTED_FLAG_KEYS,uy as DEVICE_ROTATIONS,n$ as GLOBAL_FLAG_KEYS,sJ as LOG_ACTION_VALUES,ng as MAESTRO_COMPAT_TRACKER_URL,ny as MAESTRO_NEW_ISSUE_URL,nx as METRO_PREPARE_FLAGS,ns as PERF_ACTION_ERROR_MESSAGE,no as PERF_AREA_ERROR_MESSAGE,nu as PERF_KIND_ERROR_MESSAGE,nc as PERF_MEMORY_KIND_ERROR_MESSAGE,nl as PERF_SUBJECT_ERROR_MESSAGE,l1 as RECORDING_EXPORT_QUALITIES,rb as SCREENSHOT_ACTION_FLAG_KEYS,iz as SCROLL_DIRECTIONS,r3 as SESSION_SURFACES,n7 as SETTINGS_INVALID_ARGS_MESSAGE,iG as SWIPE_PATTERNS,lL as analyzeReactNativeOverlay,aw as annotateCoveredSnapshotNodes,rx as appendScreenshotScriptFlags,ah as areRectsApproximatelyEqual,iU as assertExclusiveScrollDistanceInputs,iX as assertScrollGestureInput,th as booleanSchema,rZ as buildMeta,eC as buildMobileSnapshotPresentation,nO as buildRequestFlags,iK as buildScrollGesturePlan,eS as buildSnapshotDisplayLines,iJ as buildSwipeGesturePlan,iY as buildSwipePresetGesturePlan,ij as buttonTag,i7 as captureScrollEdgeState,aO as clamp,i1 as clampGesturePoint,i6 as clampToRange,e0 as colorize,nC as createBatchDaemonWriter,eF as deriveMobileSnapshotHiddenContentHints,lN as detectReactNativeOverlay,eI as displayLabel,aM as expandRect,u4 as findCommandMetadata,tc as findMissingProxyLeaseFields,aY as focusCommand,e3 as formatCliStatusMarker,e6 as formatDoctorCheckDetailLines,e8 as formatDoctorCheckSummaryLine,lR as formatReactNativeOverlayWarning,eD as formatRole,eW as formatScreenshotDiffText,at as formatScrollEdgeMessage,eG as formatSnapshotDiffText,ek as formatSnapshotLine,i_ as getClickButtonValidationError,nR as getFlagDefinition,nN as getFlagDefinitions,it as getUnsupportedMacOsSettingMessage,iV as honoredScrollDurationMs,iZ as inferGestureReferenceFrame,ew as inferVerticalScrollIndicatorDirections,aR as intersectArea,u3 as isCommandName,ie as isMacOsSettingSupported,eT as isNodeVisibleInEffectiveViewport,np as isPerfAction,nd as isPerfArea,nf as isPerfKind,nh as isPerfMemoryKind,nm as isPerfSubject,tu as isProxyLeaseScope,lP as isReactNativeCollapsedWarningWrapperCandidate,lC as isReactNativeCollapsedWarningWrapperWithVisibleBanner,eO as isScrollableType,ax as isSnapshotNodeInteractionBlocked,rM as isSparseSnapshotQualityVerdict,r1 as isStringMember,ev as isSystemScrollIndicatorLabel,tr as leaseScopeFromOptions,tt as leaseScopeFromRequest,ti as leaseScopeToAllocateRequest,tn as leaseScopeToCommandFlags,tl as leaseScopeToConnectionMetadata,ta as leaseScopeToHeartbeatRequest,ts as leaseScopeToLeaseRpcParams,to as leaseScopeToReleaseRequest,uQ as listCommandFamilyCliOutputFormatters,uJ as listCommandFamilyCliReaders,uX as listCommandFamilyCliSchemas,uY as listCommandFamilyDaemonWriters,uK as listCommandFamilyDefinitions,u2 as listCommandMetadata,u5 as listMcpCommandMetadata,aQ as longPressCommand,tg as looseObjectSchema,e7 as markDoctorProgressRendered,rU as normalizeDeployResult,rz as normalizeDevice,rB as normalizeInstallFromSourceResult,rV as normalizeMaterializationReleaseResult,rX as normalizeOpenDevice,rK as normalizeRuntimeHints,iB as normalizeScrollDurationMs,rq as normalizeSession,ea as normalizeSnapshotTree,rJ as normalizeStartupSample,rY as normalizeTargetShutdownResult,aA as normalizedRect,au as now,ub as parseDeviceRotation,sg as parseInstallSourceConfig,i2 as parseScrollDirection,r8 as parseSessionSurface,r2 as parseStringMember,iQ as parseSwipePreset,iI as parseTimeout,iD as parseWaitPositionals,a2 as pinchCommand,i0 as pointFromPercent,ag as pointInsideRect,ez as printHumanError,eV as printJson,rL as publicSnapshotCaptureAnnotations,rp as readCommandMessage,ox as readFillTargetFromPositionals,ir as readLocationCoordinate,nP as readMetadataCommandFlags,lO as readReactNativeOverlayActionNodes,rS as readScreenshotScriptFlag,rO as readSerializedSnapshotCaptureAnnotations,rQ as readSnapshotNodes,r$ as readSnapshotQualityVerdict,sV as readViewportDimension,l2 as recordingQualityInputToExportQuality,aN as rectCenter,rR as renderSnapshotQualityWarnings,i9 as requireIntInRange,ii as requireLocationCoordinates,aC as resolveActionableTouchNode,aF as resolveActionableTouchResolution,iT as resolveClickButton,r_ as resolveDeployResultTarget,rj as resolveInstallFromSourceResultTarget,aT as resolveInteractionTarget,am as resolveRectCenter,r0 as resolveSessionName,ae as runScrollEdgePasses,rw as screenshotFlagsFromOptions,rv as screenshotOptionsFromFlags,aZ as scrollCommand,ac as sleep,rN as snapshotCaptureAnnotationsFrom,aL as squaredDistance,tf as stringSchema,rc as successText,eZ as supportsColor,a0 as swipeCommand,al as toBackendContext,ad as toBackendResult,a$ as unionRects,rd as withSuccessText};
|
|
28
|
+
`}(a,{raw:r.raw,flatten:r.interactiveOnly,scoped:"string"==typeof r.scope&&r.scope.trim().length>0,depthLimited:"number"==typeof r.depth})}}},{name:nK,metadata:nX,definition:nJ,cliSchema:{helpDescription:"Capture screenshot (web defaults to the viewport; use --fullscreen, --full, or -f for the entire page. macOS app sessions default to the app window; use --fullscreen for full desktop, --max-size to downscale, --overlay-refs to annotate current refs, --normalize-status-bar for deterministic iOS simulator chrome, or --no-stabilize for low-latency Android capture loops)",summary:"Capture screenshot with optional web full-page, desktop, downscale, or ref overlay modes",positionalArgs:["path?"],allowedFlags:["out","overlayRefs","screenshotFullscreen","screenshotMaxSize","screenshotNoStabilize","screenshotNormalizeStatusBar"]},cliReader:(e,t)=>({...tZ(t),path:e[0]??t.out,...rv(t)}),daemonWriter:e=>tQ(L.screenshot,rn(e.path),{...e,...rw(e)})},{name:nz,metadata:nq,definition:nG,cliSchema:nW,cliReader:(e,t)=>{if("snapshot"!==e[0])throw new A("INVALID_ARGS","Only diff snapshot is available through this parser.");return{...tZ(t),kind:"snapshot",out:t.out,interactiveOnly:t.snapshotInteractiveOnly,depth:t.snapshotDepth,scope:t.snapshotScope,raw:t.snapshotRaw}},daemonWriter:nH},{name:i$,metadata:iM,definition:iR,cliSchema:{usageOverride:"wait <ms>|text <text>|@ref|<selector> [timeoutMs]",positionalArgs:["durationOrSelector","timeoutMs?"],allowsExtraPositionals:!0,allowedFlags:[...nw]},cliReader:(e,t)=>(function(e,t){let r=iD(e);if(!r)throw new A("INVALID_ARGS","wait requires <ms>, text <text>, @ref, or <selector> [timeoutMs].");let n={...t0(t),...t2(t)};if("sleep"===r.kind)return{...n,durationMs:r.durationMs};if("text"===r.kind){if(!r.text)throw new A("INVALID_ARGS","wait requires text.");return{...n,text:r.text,...iN(r.timeoutMs)}}return"ref"===r.kind?{...n,ref:r.rawRef,...iN(r.timeoutMs)}:{...n,selector:r.selectorExpression,...iN(r.timeoutMs)}})(e,t),daemonWriter:tY(L.wait,e=>(function(e){if(1!==[void 0!==e.durationMs?"durationMs":void 0,void 0!==e.text?"text":void 0,void 0!==e.ref?"ref":void 0,void 0!==e.selector?"selector":void 0].filter(Boolean).length)throw new A("INVALID_ARGS","wait command requires exactly one of durationMs, text, ref, or selector.");if(void 0!==e.durationMs)return[String(e.durationMs)];let t=ri(e.timeoutMs);if(void 0!==e.text)return["text",e.text,...t];if(void 0!==e.ref)return[e.ref,...t];let r=e.selector;if(!X(r))throw new A("INVALID_ARGS",`Invalid wait selector: ${r}`);return[r,...t]})(e)),cliOutputFormatter:rf},{name:nj,metadata:nU,definition:nB,cliSchema:{usageOverride:"alert [get|accept|dismiss|wait] [timeout]",positionalArgs:["action?","timeout?"]},cliReader:(e,t)=>({...tZ(t),...function(e){if(e.length>2)throw new A("INVALID_ARGS","alert accepts at most action and timeout arguments.");return tW({action:function(e){let t=e?.toLowerCase();if(void 0===t||"get"===t||"accept"===t||"dismiss"===t||"wait"===t)return t;throw new A("INVALID_ARGS","alert action must be get, accept, dismiss, or wait.")}(e[0]),timeoutMs:function(e,t){if(void 0===e)return;let r=Number(e);if(Number.isFinite(r))return r;throw new A("INVALID_ARGS",`${t} must be a finite number.`)}(e[1],"alert timeout")})}(e)}),daemonWriter:nV,cliOutputFormatter:rf},{name:io,metadata:is,definition:il,cliSchema:{usageOverride:n9,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?"]},cliReader:(e,t)=>(function(e,t){let r=t0(t),n=e[0],i=e[1];if(re(n,ic)&&re(i,id))return{...r,setting:n,state:i};if("location"===n&&"set"===i)return{...r,setting:n,state:i,latitude:ir(e[2],"latitude"),longitude:ir(e[3],"longitude")};if("appearance"===n&&re(i,ip)||re(n,im)&&re(i,ih)||"fingerprint"===n&&re(i,ig))return{...r,setting:n,state:i};if("permission"===n&&re(i,iy))return{...r,setting:n,state:i,permission:function(e){if(re(e,ib))return e;throw new A("INVALID_ARGS","settings permission requires a permission target.")}(e[2]),mode:function(e){if(void 0===e||"full"===e||"limited"===e)return e;throw new A("INVALID_ARGS","settings permission mode must be full or limited.")}(e[3])};if("clear-app-state"===n){let t="clear"===i?e[2]:i;return{...r,setting:n,state:"clear",app:t}}throw new A("INVALID_ARGS","Invalid settings arguments.")})(e,t),daemonWriter:iu}]}),iO={debug:rm(function(e){let t=[e.outPath,e.message];for(let r of(t.push(...function(e){let t=e.crash,r=[`Crash: ${t.appName??"unknown app"}${void 0===t.crashedThread?"":` thread ${t.crashedThread}`}`];for(let e of(t.bundleId&&r.push(`Bundle: ${t.bundleId}`),t.exceptionType&&r.push(`Exception: ${t.exceptionType}`),t.terminationReason&&r.push(`Termination: ${t.terminationReason}`),t.topFrames))r.push(`Frame ${e.index}: ${e.image} ${e.symbol??e.address}`);for(let e of t.findings)r.push(`Finding: ${e}`);return r}(e)),e.matchedImages))t.push(`Matched: ${r.name} ${r.uuid}${r.arch?` ${r.arch}`:""}`);for(let r of e.warnings??[])t.push(`Warning: ${r}`);return{data:e,text:t.join("\n")}})},iP="debug",iC=n_(iP,"Symbolicate crash artifacts with matching debug symbols.",{action:ty(tS(["symbols"])),artifact:ty(tb("Apple crash artifact path (.ips, .crash, or .log).")),dsym:tb("Path to a matching .dSYM bundle."),searchPath:tb("Directory to scan for matching .dSYM bundles."),out:tb("Output path for the symbolicated artifact.")}),iF=ru(iC,(e,t)=>e.debug.symbols(t)),iE=rs({name:"debugging",commands:[{name:iP,metadata:iC,definition:iF,cliSchema:{usageOverride:"debug symbols --artifact <crash.ips|crash.log> (--dsym <App.dSYM> | --search-path <dir>) [--out <symbolicated>]",listUsageOverride:"debug",helpDescription:"Symbolicate Apple crash artifacts with matching dSYM UUIDs. This debug namespace is intentionally narrow: use logs for app logs, network for HTTP evidence, perf for performance samples, record/trace for media and traces, and react-devtools for React Native profiles.",summary:"Symbolicate Apple crash artifacts with dSYMs; use logs/network/perf for other diagnostics",positionalArgs:["symbols"],allowedFlags:["artifact","dsym","searchPath","out"]},cliReader:(e,t)=>({...tZ(t),action:function(e){if("symbols"===e)return e;throw new A("INVALID_ARGS","debug supports only symbols; use logs, network, perf, record, trace, or react-devtools for other diagnostics")}(e[0]),artifact:t.artifact,dsym:t.dsym,searchPath:t.searchPath,out:t.out}),cliOutputFormatter:iO.debug}]});function iT(e){return e?.clickButton??"primary"}function i_(e){return"primary"===e.button?null:"click"!==e.commandLabel?new A("INVALID_ARGS","--button is supported only for click"):"macos"!==e.platform&&"linux"!==e.platform?new A("UNSUPPORTED_OPERATION",`click --button ${e.button} is supported only on macOS and Linux`):"macos"===e.platform&&"middle"===e.button?new A("UNSUPPORTED_OPERATION","click --button middle is not supported by the macOS runner yet"):"number"==typeof e.count||"number"==typeof e.intervalMs||"number"==typeof e.holdMs||"number"==typeof e.jitterPx||!0===e.doubleTap?new A("INVALID_ARGS",`click --button ${e.button} does not support repeat or gesture modifier flags`):null}function ij(e){return"primary"===e?{}:{button:e}}function iU(e,t="scroll accepts either a relative amount or --pixels, not both"){if(void 0!==e.amount&&void 0!==e.pixels)throw new A("INVALID_ARGS",t)}function iB(e,t={}){if(void 0===e)return;let r=t.field??"scroll durationMs",n=t.max??1e4,i=t.invalidMessage??`${r} must be a non-negative integer`;if(!Number.isFinite(e)||!Number.isInteger(e)||e<0)throw new A("INVALID_ARGS",i);if(e>n)throw new A("INVALID_ARGS",`${r} must be a non-negative integer at most ${n}`);return e}function iV(e){return"number"==typeof e?.durationMs?e.durationMs:void 0}let iz=["up","down","left","right"],iq=["left","right","left-edge","right-edge"],iG=["one-way","ping-pong"],iW=r5(iq,{message:"gesture swipe requires left, right, left-edge, or right-edge"}),iH=r5(iz,{message:e=>`Unknown direction: ${e}`});function iK(e){let t=e.direction,r="up"===t||"down"===t?e.referenceHeight:e.referenceWidth,n=i3(e.amount),i=void 0!==e.pixels?i4(e.pixels):Math.round(r*n),a=Math.max(1,Math.round(.05*r)),o=Math.max(1,Math.min(i,Math.max(1,r-2*a))),s=Math.round(o/2),l=Math.round(e.referenceWidth/2),u=Math.round(e.referenceHeight/2),c=(r,n,i,a)=>({direction:t,x1:r,y1:n,x2:i,y2:a,referenceWidth:e.referenceWidth,referenceHeight:e.referenceHeight,amount:e.amount,pixels:o});switch(t){case"up":return c(l,u-s,l,u+s);case"down":return c(l,u+s,l,u-s);case"left":return c(l-s,u,l+s,u);case"right":return c(l+s,u,l-s,u)}}function iX(e){i3(e.amount),void 0!==e.pixels&&i4(e.pixels)}function iJ(e){return{...iK({...e,direction:function(e){switch(e){case"up":return"down";case"down":return"up";case"left":return"right";case"right":return"left"}}(e.direction)}),direction:e.direction}}function iY(e,t,r={}){let n=r.marginPx??8,[i,a,o]="left"===e?[85,15,50]:"right"===e?[15,85,50]:"left-edge"===e?[99,15,50]:[1,85,50],s=i0(t,i,o,{marginPx:n}),l=i0(t,a,o,{marginPx:n});return{preset:e,x1:s.x,y1:s.y,x2:l.x,y2:l.y,referenceWidth:t.referenceWidth,referenceHeight:t.referenceHeight}}function iQ(e){return iW.parse(e)}function iZ(e){let t=function(e){let t=e.filter(e=>(function(e){if(!e)return!1;let t=e.toLowerCase();return t.includes("application")||t.includes("window")})(e.type)&&i5(e.rect)).map(e=>e.rect).sort((e,t)=>(t?.width??0)*(t?.height??0)-(e?.width??0)*(e?.height??0))[0];if(t)return t;let r=e.map(e=>e.rect).filter(i5);if(0===r.length)return;let n=Math.max(...r.map(e=>e.x+e.width)),i=Math.max(...r.map(e=>e.y+e.height));if(!(n<=0)&&!(i<=0))return{x:0,y:0,width:n,height:i}}(e);if(t)return{referenceWidth:t.width,referenceHeight:t.height}}function i0(e,t,r,n={}){let i={x:Math.round(e.referenceWidth*t/100),y:Math.round(e.referenceHeight*r/100)};return void 0===n.marginPx?i:i1(i,e,n.marginPx)}function i1(e,t,r){return{x:i8(e.x,r,t.referenceWidth),y:i8(e.y,r,t.referenceHeight)}}function i2(e){return iH.parse(e)}function i5(e){return!!e&&e.width>0&&e.height>0}function i3(e){if(void 0===e)return .6;if(!Number.isFinite(e)||e<=0)throw new A("INVALID_ARGS","scroll amount must be a positive number");return e}function i4(e){if(!Number.isFinite(e)||e<=0)throw new A("INVALID_ARGS","scroll pixels must be a positive integer");return Math.max(1,Math.round(e))}function i8(e,t,r){let n=Math.max(t,r-t);return i6(e,t,n)}function i6(e,t,r){return Math.min(Math.round(r),Math.max(Math.round(t),Math.round(e)))}function i9(e,t,r,n){if(!Number.isFinite(e)||!Number.isInteger(e)||e<r||e>n)throw new A("INVALID_ARGS",`${t} must be an integer between ${r} and ${n}`);return e}async function i7(e){let{edge:t,target:r={},scope:n,captureNodes:i}=e;try{let e=await i(n),a=function(e,t,r={}){var n,i,a;let o,s=(e??[]).map((e,t)=>({...e,ref:"ref"in e&&e.ref?e.ref:`e${t+1}`}));if(0===s.length)return{canScroll:!1,emptySnapshot:!0,signature:""};let l=eF(s),u=function(e,t,r,n){let i=new Map(e.map(e=>[e.index,e])),a=e.filter(e=>eP(e)&&as(e.rect));if(0===a.length)return null;let o=function(e,t){if(void 0===e)return null;let r=t.get(e);for(;r;){if(eP(r)&&as(r.rect))return r;r=void 0===r.parentIndex?void 0:t.get(r.parentIndex)}return null}(n.nodeIndex,i);if(o)return o;let s=n.point;if(s){let e=a.filter(e=>{var t,r;return e.rect&&(t=e.rect,(r=s).x>=t.x&&r.x<=t.x+t.width&&r.y>=t.y&&r.y<=t.y+t.height)}).sort(ai);if(e.length>0)return e.find(e=>ar(e,t.get(e.index),r))??e[0]??null}let l=a.filter(e=>ar(e,t.get(e.index),r)).sort(aa);return l.length>0?l[0]??null:a.filter(t=>eT(t,e)).sort(aa)[0]??a.sort(aa)[0]??null}(s,l,t,r),c=(u?(n=s,i=u.index,o=new Map(n.map(e=>[e.index,e])),n.filter(e=>e.index===i||function(e,t,r){let n=void 0===e.parentIndex?void 0:r.get(e.parentIndex);for(;n;){if(n.index===t)return!0;n=void 0===n.parentIndex?void 0:r.get(n.parentIndex)}return!1}(e,i,o))):s).map(e=>{let t=e.rect?["x","y","width","height"].map(t=>{var r;return r=e.rect?.[t],"number"==typeof r&&Number.isFinite(r)?r.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:ar(u,l.get(u.index),t),emptySnapshot:!1,signature:c,scope:[(a=u).identifier,a.label,a.value].map(e=>"string"==typeof e?e.trim():"").find(an)}:{canScroll:!1,emptySnapshot:!1,signature:c}}(e,t,r);if(n&&a.emptySnapshot)return await i7({edge:t,target:r,captureNodes:i});return a}catch(e){var a,o,s;throw a=t,o=n,s=e,o?new A("COMMAND_FAILED",`Failed to verify scroll ${a} state for scoped container`,{scope:o,hint:`scroll ${a} could not verify the scoped scroll container. Run snapshot -i for the current screen and retry with a visible scroll target.`},s):new A("COMMAND_FAILED",`Failed to verify scroll ${a} state`,{hint:`scroll ${a} needs a snapshot showing hidden content ${"bottom"===a?"below":"above"} before it will move.`},s)}}async function ae(e){let t,{edge:r,captureState:n,scroll:i}=e,a=await n();a.scope&&(a=await n(a.scope));let o=0;for(;a.canScroll;){if(o>=40)throw new A("COMMAND_FAILED",`scroll ${r} reached the safety limit before the snapshot showed the edge`,{hint:"The scoped scroll container still reports hidden content. Use a smaller manual scroll + snapshot loop to inspect the current state."});t=await i(),o+=1,a=await n(a.scope)}return{passes:o,result:t}}function at(e,t,r,n,i){return t&&0===r?`Already at ${t}; no hidden content ${"bottom"===t?"below":"above"} detected`:t?`Scrolled to ${t} with ${r} ${e} passes`:void 0!==i?`Scrolled ${e} by ${i}px`:void 0!==n?`Scrolled ${e} by ${n}`:`Scrolled ${e}`}function ar(e,t,r){return"bottom"===r?!0===e.hiddenContentBelow||t?.hiddenContentBelow===!0:!0===e.hiddenContentAbove||t?.hiddenContentAbove===!0}function an(e){return e.length>0&&e.length<=80&&!/^(true|false)$/i.test(e)&&!/^\d+$/.test(e)&&!/^\d+%$/.test(e)}function ai(e,t){return ao(e.rect)-ao(t.rect)}function aa(e,t){return ao(t.rect)-ao(e.rect)}function ao(e){return e?e.width*e.height:0}function as(e){return!!(e&&e.width>0&&e.height>0)}function al(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}function au(e){return e.clock?.now()??Date.now()}async function ac(e,t){e.clock?await e.clock.sleep(t):await new Promise(e=>setTimeout(e,t))}function ad(e){return e&&"object"==typeof e?e:void 0}let ap=["x","y","width","height"];function am(e){let t=af(e);if(!t)return null;let r=x(t);return Number.isFinite(r.x)&&Number.isFinite(r.y)?r:null}function af(e){if(!e)return null;let t=Number(e.x),r=Number(e.y),n=Number(e.width),i=Number(e.height);return Number.isFinite(t)&&Number.isFinite(r)&&Number.isFinite(n)&&Number.isFinite(i)&&!(n<0)&&!(i<0)?{x:t,y:r,width:n,height:i}:null}function ah(e,t){return!!e&&!!t&&ap.every(r=>.5>=Math.abs(e[r]-t[r]))}function ag(e){return{x:ay(e.x,e.width),y:ay(e.y,e.height)}}function ay(e,t){if(t<=1)return Math.floor(e);let r=Math.ceil(e);return Math.round(Math.min(Math.floor(e+t-1),Math.max(r,e+t/2)))}let ab=["tabbar","toolbar","navigationbar","bottomnavigation","bottomnavigationview","sheet","dialog","alert","popover","menu"],av=["button","link","menuitem","tabitem","textfield","searchfield","edittext","checkbox","radio","switch","cell"];function aw(e){if(e.length<2)return e;let t=[...e],r={nodes:t,byIndex:new Map(t.map(e=>[e.index,e]))},n=!1;for(let[e,i]of t.entries()){if(!function(e){return!!aD(e.rect)&&(!!(!0===e.hittable||aS(e,av))||!!(e.label?.trim()||e.value?.trim()||e.identifier?.trim()))}(i)||!function e(t,r,n){let i=aD(n.rect);if(!i)return null;let a=x(i);for(let o=r+1;o<t.nodes.length;o+=1){let r=t.nodes[o];if(r&&function(t,r,n,i,a){if(!t.nodes[r])return!1;let o=function(t,r,n,i){var a,o,s,l;let u=t.nodes[r];if(!u||!(!(!aD((a=u).rect)||function(e){let t=ak(e);return t.includes("application")||t.includes("window")}(a))&&aS(a,ab))||aI(o=n,s=u,l=t.byIndex)||aI(s,o,l))return null;let c=aD(u.rect);return!c||ah(i,c)||e(t,r,u)?null:c}(t,r,n,i);return!!(o&&eR(o,a.x,a.y))}(t,o,n,i,a))return r}return null}(r,e,i))continue;n=!0;let a={...i,hittable:!1,interactionBlocked:"covered",presentationHints:Array.from(new Set([...i.presentationHints??[],"covered"]))};t[e]=a,r.byIndex.set(a.index,a)}return n?t:e}function ax(e){return void 0!==e.interactionBlocked}function aS(e,t){let r=ak(e);return t.some(e=>r.includes(e))}function ak(e){return[e.type,e.role,e.subrole].map(e=>p(e??"")).join(" ")}function aI(e,t,r){let n="number"==typeof t.parentIndex?r.get(t.parentIndex):void 0,i=new Set;for(;n&&!i.has(n.index);){if(n.index===e.index)return!0;i.add(n.index),n="number"==typeof n.parentIndex?r.get(n.parentIndex):void 0}return!1}function aD(e){let t=af(e);return t&&t.width>0&&t.height>0?t:null}function aA(e){return e}function a$(e){let t=1/0,r=1/0,n=-1/0,i=-1/0;for(let a of e)t=Math.min(t,a.x),r=Math.min(r,a.y),n=Math.max(n,a.x+a.width),i=Math.max(i,a.y+a.height);return{x:t,y:r,width:n-t,height:i-r}}function aM(e,t){return{x:e.x-t,y:e.y-t,width:e.width+2*t,height:e.height+2*t}}function aR(e,t){let r=Math.max(e.x,t.x),n=Math.max(e.y,t.y),i=Math.min(e.x+e.width,t.x+t.width),a=Math.min(e.y+e.height,t.y+t.height);return i<=r||a<=n?0:(i-r)*(a-n)}function aN(e){return{x:e.x+e.width/2,y:e.y+e.height/2}}function aL(e,t){return(e.x-t.x)**2+(e.y-t.y)**2}function aO(e,t,r){return Math.min(Math.max(e,t),r)}let aP=["button","link","menuitem","tabitem","textfield","searchfield","securetextfield","checkbox","radio","switch","cell"];function aC(e,t){return aF(e,t).node}function aF(e,t){var r;if(ax(t))return{node:t,reason:"covered"};let n=function(e,t){let r=af(t.rect);if(!r)return null;let n=t,i=new Set;for(;!i.has(n.ref);){i.add(n.ref);let t=e.filter(e=>{if(e.parentIndex!==n.index||!e.hittable||ax(e))return!1;let t=af(e.rect);return!!t&&ah(t,r)});if(1!==t.length)break;n=t[0]}return n===t?null:n}(e,t);if(n?.rect&&am(n.rect))return{node:n,reason:"same-rect-descendant"};if([(r=t).type,r.role,r.subrole].map(e=>p(e??"")).some(aE)&&t.rect&&am(t.rect))return{node:t,reason:"semantic-target"};let i=a(e,t);return i?.rect&&!ax(i)&&am(i.rect)?!function(e,t,r){var n,i;let a,o,s,l=af(e.rect),u=af(t.rect);if(!l||!u)return!1;let c=function(e,t){let r=x(t),n=e.filter(e=>{let t=(e.type??"").toLowerCase();return t.includes("application")||t.includes("window")}).map(e=>af(e.rect)).filter(e=>null!==e);if(0===n.length)return null;let i=n.filter(e=>eR(e,r.x,r.y));return eN(i.length>0?i:n)}(r,l);return!!c&&(a=aR(n=u,i=c),o=n.width*n.height,s=i.width*i.height,!(a<=0)&&!(o<=0)&&!(s<=0)&&!!(a/s>=.9)&&!!(a/o>=.8))&&!ah(l,u)}(t,i,e)?{node:i,reason:"hittable-ancestor"}:{node:t,reason:"overly-broad-ancestor"}:{node:t,reason:"original"}}function aE(e){return"tab"===e||aP.some(t=>e.includes(t))}async function aT(e,t,r){var n;return(await aG(e,t,r.action),"point"===t.target.kind)?{kind:"point",point:{x:(n=t.target).x,y:n.y}}:"ref"===t.target.kind?await a_(e,t,t.target,r):await aj(e,t,t.target,r)}async function a_(e,t,r,n){let i=await aH(e,t,r),a=i.resolved,s=n.promoteToHittableAncestor?aB(i.snapshot.nodes,a.node,{action:n.action,label:`Ref ${r.ref}`}):a.node;return aV(s,`Ref ${r.ref}`,n.action),function(e,t,r,n){let i=e.rect?e_(e,t):null;if(!(!e.rect||!i||eT(e,t)))throw new A("COMMAND_FAILED",`Ref ${r} is off-screen and not safe to ${n}`,{reason:"offscreen_ref",ref:m(r),rect:e.rect,viewport:i,hint:`Use scroll with the direction from the off-screen summary, take a fresh snapshot, then retry ${n} with the new ref or a selector.`})}(s,i.snapshot.nodes,r.ref,n.action),{kind:"ref",point:aX(s,`Ref ${r.ref} not found or has invalid bounds`),target:{kind:"ref",ref:`@${a.ref}`},node:s,selectorChain:o(s,e.backend.platform,{action:"fill"===n.action?"fill":"click"}),refLabel:u(s,i.snapshot.nodes)}}async function aj(e,t,r,n){let i=J(r.selector),a=await aq(e,t,n.requireInteractive),l=s(aU(a.snapshot.nodes),i,{platform:e.backend.platform,requireRect:!0,requireUnique:!0,disambiguateAmbiguous:!0});if(l&&l.node.rect||!n.requireInteractive||(l=s(aU((a=await aq(e,t,!1)).snapshot.nodes),i,{platform:e.backend.platform,requireRect:!0,requireUnique:!0,disambiguateAmbiguous:!0})),!l||!l.node.rect){let t=s(a.snapshot.nodes,i,{platform:e.backend.platform,requireRect:!0,requireUnique:!1});if(t?.node&&ax(t.node))throw az({label:`Selector ${t.selector.raw}`,node:t.node,action:n.action,selector:t.selector.raw});throw new A("COMMAND_FAILED",d(i,l?.diagnostics??[],{unique:!0}))}let c=n.promoteToHittableAncestor?aB(a.snapshot.nodes,l.node,{action:n.action,label:`Selector ${l.selector.raw}`}):l.node;return aV(c,`Selector ${l.selector.raw}`,n.action),{kind:"selector",point:aX(c,`Selector ${l.selector.raw} resolved to invalid bounds`),target:{kind:"selector",selector:l.selector.raw},node:c,selectorChain:o(c,e.backend.platform,{action:"fill"===n.action?"fill":"click"}),refLabel:u(c,a.snapshot.nodes)}}function aU(e){return e.filter(e=>!ax(e))}function aB(e,t,r){let n=aF(e,t);if("covered"===n.reason)throw az({label:r.label,node:t,action:r.action});return n.node}function aV(e,t,r){if(ax(e))throw az({label:t,node:e,action:r})}function az(e){return new A("COMMAND_FAILED",`${e.label} is covered by another visible element and cannot ${function(e){switch(e){case"fill":return"be filled";case"focus":return"be focused";case"longPress":return"be long-pressed";default:return"be tapped"}}(e.action)} safely`,{hint:"Use a different visible target, scroll it clear of the overlay, or inspect with snapshot/screenshot before retrying.",...e.selector?{selector:e.selector}:{},ref:`@${e.node.ref}`,interactionBlocked:e.node.interactionBlocked})}async function aq(e,t,r){if(!e.backend.captureSnapshot)throw new A("UNSUPPORTED_OPERATION","snapshot is not supported by this backend");let n=t.session??"default",i=await e.sessions.get(n);if(!i)throw new A("SESSION_NOT_FOUND","No active session. Run open first.");let a=await e.backend.captureSnapshot(al(e,t),{interactiveOnly:r,includeRects:!0}),o=a.snapshot??{nodes:a.nodes??[],truncated:a.truncated,backend:a.backend,createdAt:au(e)};return await e.sessions.set({...i,snapshot:o}),{snapshot:o}}async function aG(e,t,r){if("macos"!==e.backend.platform)return;let n=await aW(e,t);if(("desktop"===n||"menubar"===n)&&("menubar"!==n||"click"!==r&&"press"!==r))throw new A("UNSUPPORTED_OPERATION",`${r} is not supported on macOS ${n} sessions yet. Open an app session to act, or use the ${n} surface to inspect.`)}async function aW(e,t){let r=await e.sessions.get(t.session??"default");return r?.metadata?.surface}async function aH(e,t,r){let n=t.session??"default",i=await e.sessions.get(n);if(!i)throw new A("SESSION_NOT_FOUND","No active session. Run open first.");if(!i.snapshot)throw new A("INVALID_ARGS","No snapshot in session. Run snapshot first.");let a=r.fallbackLabel??"",o=aK(i.snapshot.nodes,r.ref,{fallbackLabel:a});if(o)return{snapshot:i.snapshot,resolved:o};let s=await aq(e,t,!0),l=aK(s.snapshot.nodes,r.ref,{fallbackLabel:a});if(!l)throw new A("COMMAND_FAILED",`Ref ${r.ref} not found or has no bounds`);return{...s,resolved:l}}function aK(e,t,r){let n=m(t);if(!n)throw new A("INVALID_ARGS",`Invalid ref: ${t}`);let i=w(e,n);if(aJ(i))return{ref:n,node:i};let a=r.fallbackLabel.length>0?l(e,r.fallbackLabel):null;return aJ(a)?{ref:n,node:a}:null}function aX(e,t){let r=am(e.rect);if(!r)throw new A("COMMAND_FAILED",t);return r}function aJ(e){return!!e&&null!==am(e.rect)}let aY=async(e,t)=>{let r=await aT(e,t,{action:"focus",requireInteractive:!0,promoteToHittableAncestor:!1});if(!e.backend.focus)throw new A("UNSUPPORTED_OPERATION","focus is not supported by this backend");let n=a4(r),i=ad(await e.backend.focus(al(e,t),n));return{...r,...i?{backendResult:i}:{},...rc(`Focused (${n.x}, ${n.y})`)}},aQ=async(e,t)=>{let r=await aT(e,t,{action:"longPress",requireInteractive:!0,promoteToHittableAncestor:!0});if(!e.backend.longPress)throw new A("UNSUPPORTED_OPERATION","longPress is not supported by this backend");let n=void 0===t.durationMs?void 0:i9(t.durationMs,"durationMs",0,12e4),i=a4(r),a=ad(await e.backend.longPress(al(e,t),i,{durationMs:n}));return{...r,...void 0!==n?{durationMs:n}:{},...a?{backendResult:a}:{},...rc(`Long pressed (${i.x}, ${i.y})`)}},aZ=async(e,t)=>{var r,n,i,a;let o;if(!e.backend.scroll)throw new A("UNSUPPORTED_OPERATION","scroll is not supported by this backend");let s="bottom"===(r=t.direction)?{direction:"down",edge:"bottom"}:"top"===r?{direction:"up",edge:"top"}:{direction:a6(r,"scroll direction")},l=(n=t.amount,i="scroll amount",void 0===n?void 0:a7(n,i)),u=function(e,t){if(void 0!==e){if(!Number.isFinite(e)||!Number.isInteger(e)||e<=0)throw new A("INVALID_ARGS",`${t} must be a positive integer`);return e}}(t.pixels,"scroll pixels"),c=iB(t.durationMs);iU({amount:l,pixels:u},"scroll accepts either amount or pixels, not both");let d=await a5(e,t),p="viewport"===d.kind?{kind:"viewport"}:{kind:"point",point:a4(d)},m=e.backend.scroll,f=async()=>await m(al(e,t),p,{direction:s.direction,...void 0!==l?{amount:l}:{},...void 0!==u?{pixels:u}:{},...void 0!==c?{durationMs:c}:{}}),h=0;if(s.edge){let r=s.edge,n="viewport"===(a=d).kind?{}:{point:a.point,nodeIndex:"node"in a?a.node?.index:void 0},i=await ae({edge:r,captureState:async i=>await a8(e,t,r,n,i),scroll:f});o=i.result,h=i.passes}else o=await f(),h=1;let g=ad(o),y=iV(g);return{...d,direction:s.direction,...s.edge?{edge:s.edge,passes:h}:{},...void 0!==l?{amount:l}:{},...void 0!==u?{pixels:u}:{},...void 0!==y?{durationMs:y}:{},...g?{backendResult:g}:{},...rc(at(s.direction,s.edge,h,l,u))}},a0=async(e,t)=>{if(!e.backend.swipe)throw new A("UNSUPPORTED_OPERATION","swipe is not supported by this backend");if(t.preset)return await a1(e,t,e.backend.swipe);let r=await a3(e,t),n=function(e,t){if(t.to)return{point:a9(t.to,"to")};let r=a6(t.direction,"swipe direction"),n=a7(t.distance??200,"swipe distance");switch(r){case"up":return{point:{x:e.x,y:e.y-n},direction:r,distance:n};case"down":return{point:{x:e.x,y:e.y+n},direction:r,distance:n};case"left":return{point:{x:e.x-n,y:e.y},direction:r,distance:n};case"right":return{point:{x:e.x+n,y:e.y},direction:r,distance:n}}}(r.point,t),i=void 0===t.durationMs?void 0:i9(t.durationMs,"durationMs",16,1e4),a=ad(await e.backend.swipe(al(e,t),r.point,n.point,{durationMs:i}));return{kind:"swipe",from:r.point,to:n.point,...n.direction?{direction:n.direction}:{},...void 0!==n.distance?{distance:n.distance}:{},...void 0!==i?{durationMs:i}:{},...r.target?{fromTarget:r.target}:{},...a?{backendResult:a}:{},...rc("Swiped")}};async function a1(e,t,r){let n;if(t.from||t.to||t.direction||void 0!==t.distance)throw new A("INVALID_ARGS","gesture swipe preset cannot be combined with from, to, direction, or distance");let i=iQ(t.preset);await aG(e,t,"swipe");let a=iY(i,{referenceWidth:(n=oe((await aq(e,t,!1)).snapshot.nodes)).width,referenceHeight:n.height},{platform:e.backend.platform}),o=void 0===t.durationMs?void 0:i9(t.durationMs,"durationMs",16,1e4),s={x:a.x1,y:a.y1},l={x:a.x2,y:a.y2},u=ad(await r(al(e,t),s,l,{durationMs:o}));return{kind:"swipe",from:s,to:l,preset:i,...void 0!==o?{durationMs:o}:{},fromTarget:{kind:"viewport"},...u?{backendResult:u}:{},...rc(`Swiped ${i}`)}}let a2=async(e,t)=>{if(!e.backend.pinch)throw new A("UNSUPPORTED_OPERATION","pinch is not supported by this backend");await aG(e,t,"pinch");let r=a7(t.scale,"pinch scale"),n=t.center?await aT(e,{...t,target:t.center},{action:"pinch",requireInteractive:!1,promoteToHittableAncestor:!1}):void 0,i=ad(await e.backend.pinch(al(e,t),{scale:r,...n?{center:n.point}:{}}));return{kind:"pinch",scale:r,...n?{center:n.point,centerTarget:n}:{},...i?{backendResult:i}:{},...rc(`Pinched to scale ${r}`)}};async function a5(e,t){let r=t.target??{kind:"viewport"};return"viewport"===r.kind?(await aG(e,t,"scroll"),{kind:"viewport"}):await aT(e,{...t,target:r},{action:"scroll",requireInteractive:!1,promoteToHittableAncestor:!1})}async function a3(e,t){if(t.from){var r;if("x"in(r=t.from)&&"y"in r)return await aG(e,t,"swipe"),{point:a9(t.from,"from")};let n=await aT(e,{...t,target:t.from},{action:"swipe",requireInteractive:!1,promoteToHittableAncestor:!1});return{point:a4(n),target:n}}if(!t.direction)throw new A("INVALID_ARGS","swipe requires from+to or a direction");return await aG(e,t,"swipe"),{point:x(oe((await aq(e,t,!1)).snapshot.nodes)),target:{kind:"viewport"}}}function a4(e){if(!e.point)throw new A("COMMAND_FAILED","Interaction target resolved without coordinates");return e.point}async function a8(e,t,r,n,i){if(!e.backend.captureSnapshot)throw new A("UNSUPPORTED_OPERATION",`scroll ${r} requires snapshot support to verify hidden content before scrolling`);let{captureSnapshot:a}=e.backend;return await i7({edge:r,target:n,scope:i,captureNodes:async r=>{let n=await a(al(e,t),{scope:r});return n.snapshot?.nodes??n.nodes??[]}})}function a6(e,t){switch(e){case"up":case"down":case"left":case"right":return e;default:throw new A("INVALID_ARGS",`${t} must be up, down, left, or right`)}}function a9(e,t){let r=Number(e.x),n=Number(e.y);if(!Number.isFinite(r)||!Number.isFinite(n))throw new A("INVALID_ARGS",`${t} point requires finite x and y`);return{x:r,y:n}}function a7(e,t){if(!Number.isFinite(e)||e<=0)throw new A("INVALID_ARGS",`${t} must be a positive number`);return e}function oe(e){let t=e.filter(t=>eT(t,e)).map(e=>e.rect).filter(ot),r=t.length>0?t:e.map(e=>e.rect).filter(ot);if(0===r.length)throw new A("COMMAND_FAILED","Cannot infer viewport for directional swipe");let n=Math.min(...r.map(e=>e.x)),i=Math.min(...r.map(e=>e.y));return{x:n,y:i,width:Math.max(...r.map(e=>e.x+e.width))-n,height:Math.max(...r.map(e=>e.y+e.height))-i}}function ot(e){return!!(e&&e.width>0&&e.height>0)}let or={click:"Click or tap a semantic UI target by ref, selector, or point.",press:"Press a semantic UI target by ref, selector, or point.",fill:"Fill text into a semantic UI target by ref, selector, or point.",longpress:"Long press by ref, selector, or point.",swipe:"Swipe between two points.",focus:"Focus input at coordinates.",type:"Type text in the focused field.",scroll:"Scroll in a direction or to an edge.",get:"Get element text or attributes.",is:"Assert UI state.",find:"Find an element and optionally act on it.",gesture:"Run a structured gesture."},on={target:ty(tD()),button:tS(["primary","secondary","middle"],"Pointer button for platforms that support mouse buttons."),...t$(),...tM()},oi={target:ty(tD()),...t$(),...tM()},oa={target:ty(tD()),text:ty(tb("Text to enter into the target.")),delayMs:tw("Delay between typed characters.",{min:0}),...t$()},oo={target:ty(tD()),durationMs:tw("Long press duration in milliseconds.",{min:0}),...t$()},os={from:ty(tA("Swipe start point.")),to:ty(tA("Swipe end point.")),durationMs:tw("Swipe duration in milliseconds.",{min:0}),count:tw("Number of swipe repetitions.",{min:1}),pauseMs:tw("Pause between repeated swipes.",{min:0}),pattern:tS(iG)},ol={x:ty(tv("X coordinate.")),y:ty(tv("Y coordinate."))},ou={text:ty(tb("Text to type.")),delayMs:tw("Delay between typed characters.",{min:0})},oc={direction:ty(tS(["up","down","left","right","top","bottom"])),amount:tv("Platform scroll amount."),pixels:tw("Pixel scroll amount.",{min:0}),durationMs:tw("Scroll duration in milliseconds when the backend supports pacing.",{min:0,max:1e4})},od={format:ty(tS(["text","attrs"])),target:ty(tH({oneOf:tX(),description:"UI element target by snapshot ref or selector expression."},(e,t)=>{let r,n;return void 0===e[t]?void 0:"ref"===(n=tU(r=tJ(e,t),"kind",["ref","selector"]))?{kind:n,ref:tC(r,"ref"),label:tF(r,"label")}:{kind:n,selector:tC(r,"selector")}})),...t$()},op={predicate:ty(tS(["visible","hidden","exists","editable","selected","text"])),selector:ty(tb()),value:tb(),...t$()},om={locator:tS(Y),query:ty(tb()),action:tS(["click","focus","exists","getText","getAttrs","wait","fill","type"]),value:tb(),timeoutMs:tw(),first:tx(),last:tx(),depth:tw(),raw:tx()},of={kind:ty(tS(C,"Gesture variant.")),direction:tS(iz,"Fling direction."),preset:tS(iq,"Swipe preset."),origin:tA("Gesture origin point."),delta:tA("Movement delta for pan or transform gestures."),distance:tw("Fling distance.",{min:0}),scale:tv("Pinch or transform scale."),degrees:tv("Rotation in degrees."),velocity:tw("Rotate gesture velocity.",{min:0}),durationMs:tw("Gesture duration in milliseconds.",{min:0})},oh=[{name:"click",description:or.click,inputSchema:tR(on),readInput:e=>tN(e,on)},{name:"press",description:or.press,inputSchema:tR(oi),readInput:e=>tN(e,oi)},{name:"fill",description:or.fill,inputSchema:tR(oa),readInput:e=>tN(e,oa)},og("longpress",oo),og("swipe",os),og("focus",ol),og("type",ou),og("scroll",oc),og("get",od),og("is",op),og("find",om),{name:"gesture",description:or.gesture,inputSchema:tR(of),readInput:function(e){let t=tL(e),r=tO(t),n=tU(t,"kind",C);return"pan"===n?{...r,kind:n,origin:tP(t,"origin"),delta:tP(t,"delta"),durationMs:t_(t,"durationMs",{min:0})}:"fling"===n?{...r,kind:n,direction:tU(t,"direction",iz),origin:tP(t,"origin"),distance:t_(t,"distance",{min:0}),durationMs:t_(t,"durationMs",{min:0})}:"swipe"===n?{...r,kind:n,preset:tU(t,"preset",iq),durationMs:t_(t,"durationMs",{min:0})}:"pinch"===n?{...r,kind:n,scale:tE(t,"scale"),origin:oy(t,"origin")}:"rotate"===n?{...r,kind:n,degrees:tE(t,"degrees"),origin:oy(t,"origin"),velocity:t_(t,"velocity",{min:0})}:{...r,kind:n,origin:tP(t,"origin"),delta:tP(t,"delta"),scale:tE(t,"scale"),degrees:tE(t,"degrees"),durationMs:t_(t,"durationMs",{min:0})}}}];function og(e,t){return n_(e,or[e],t)}function oy(e,t){return void 0===e[t]?void 0:tP(e,t)}let ob={gesture:tY(L.gesture,function(e){switch(e.kind){case"pan":return["pan",String(e.origin?.x),String(e.origin?.y),String(e.delta?.x),String(e.delta?.y),...ri(e.durationMs)];case"fling":return["fling",ro(e.direction,"gesture fling requires direction"),String(e.origin?.x),String(e.origin?.y),...ri(e.distance),...ri(e.durationMs)];case"swipe":return ov(e);case"pinch":return["pinch",String(e.scale),...ri(e.origin?.x),...ri(e.origin?.y)];case"rotate":return["rotate",String(e.degrees),...ri(e.origin?.x),...ri(e.origin?.y),...ri(e.velocity)];case"transform":return["transform",String(e.origin?.x),String(e.origin?.y),String(e.delta?.x),String(e.delta?.y),String(e.scale),String(e.degrees),...ri(e.durationMs)];default:throw new A("INVALID_ARGS","gesture requires pan, fling, swipe, pinch, rotate, or transform")}}),"gesture-pan":tY(L.gesture,function(e){return["pan",String(e.x),String(e.y),String(e.dx),String(e.dy),...ri(e.durationMs)]}),"gesture-fling":tY(L.gesture,e=>{var t;let r;return r=void 0!==(t=e).durationMs?t.distance??180:t.distance,["fling",t.direction,String(t.x),String(t.y),...ri(r),...ri(t.durationMs)]}),"gesture-swipe":tY(L.gesture,ov),"gesture-pinch":tY(L.gesture,function(e){return["pinch",String(e.scale),...ri(e.x),...ri(e.y)]}),"gesture-rotate":tY(L.gesture,e=>(function(e){var t=e;if(void 0===t.x&&void 0!==t.y||void 0!==t.x&&void 0===t.y)throw new A("INVALID_ARGS","gesture rotate center requires both x and y");let r=void 0===e.x||void 0===e.y?[]:[String(e.x),String(e.y)];return["rotate",String(e.degrees),...r,...ri(e.velocity)]})(e)),"gesture-transform":tY(L.gesture,function(e){return["transform",String(e.x),String(e.y),String(e.dx),String(e.dy),String(e.scale),String(e.degrees),...ri(e.durationMs)]})};function ov(e){return["swipe",ro(e.preset,"gesture swipe requires preset"),...ri(e.durationMs)]}function ow(e){if(e[0]?.startsWith("@")){let t=oS(e.slice(1));return{ref:e[0],...void 0===t?{}:{label:t}}}let t=K(e);return t?{selector:t.selectorExpression}:{x:Number(e[0]),y:Number(e[1])}}function ox(e){let t=e[0];if(t?.startsWith("@")){let r=e.length>=3?e.slice(2).join(" "):e.slice(1).join(" ");return{kind:"ref",target:{ref:t,label:e.length>=3?oS(e.slice(1,2)):void 0},text:r}}let r=K(e,{preferTrailingValue:!0});return r?{kind:"selector",target:{selector:r.selectorExpression},text:r.rest.join(" ")}:{kind:"point",target:{x:Number(e[0]),y:Number(e[1])},text:e.slice(2).join(" ")}}function oS(e){return e.join(" ").trim()||void 0}let ok={click:e=>tQ(L.click,t4(e),{...e,clickButton:e.button}),press:tY(L.press,e=>t4(e)),longpress:tY(L.longPress,e=>{var t;return[...t4(t=e),...ri(t.durationMs)]}),swipe:tY(L.swipe,function(e){return[String(e.from?.x),String(e.from?.y),String(e.to?.x),String(e.to?.y),...ri(e.durationMs)]}),focus:tY(L.focus,e=>[String(e.x),String(e.y)]),type:tY(L.type,e=>[e.text]),fill:tY(L.fill,e=>{var t;return[...t4(t=e),t.text]}),scroll:tY(L.scroll,e=>[ro(e.direction,"scroll requires direction"),...ri(e.amount)]),get:tY(L.get,e=>[ro(e.format,"get requires format"),...function(e){let t=t8(e);if("string"==typeof t.ref)return[t.ref,...t9(t.label)];if("string"==typeof t.selector)return[t.selector];throw new A("INVALID_ARGS","element command requires @ref or selector target")}(e)])};function oI(e){let t=e.ref??"",r=e.x,n=e.y;return t&&"number"==typeof r&&"number"==typeof n?{data:e,text:`Tapped @${t} (${r}, ${n})`}:rh(e)}let oD={click:rm(oI),press:rm(oI),get:({input:e,result:t})=>{var r;let n;return n=(r={result:t,format:e.format}).result,"text"===r.format?{data:n,text:"string"==typeof n.text?n.text:""}:"attrs"===r.format?{data:n,text:JSON.stringify(n.node??{},null,2)}:rh(n)},is:rm(function(e){return{data:e,text:`Passed: is ${e.predicate??"assertion"}`}}),find:rm(function(e){return"string"==typeof e.text?{data:e,text:e.text}:"boolean"==typeof e.found?{data:e,text:`Found: ${e.found}`}:e.node?{data:e,text:JSON.stringify(e.node,null,2)}:rh(e)})},oA={is:tY(L.is,e=>{var t;return[(t=e).predicate,t.selector,..."text"===t.predicate?[t.value]:[]]}),find:e=>tQ(L.find,function(e){let t=e.locator&&"any"!==e.locator?[e.locator,e.query]:[e.query];switch(e.action){case void 0:case"click":case"focus":case"exists":return e.action?[...t,e.action]:t;case"getText":return[...t,"get","text"];case"getAttrs":return[...t,"get","attrs"];case"wait":return[...t,"wait",...ri(e.timeoutMs)];case"fill":case"type":return[...t,e.action,e.value]}}(e),{...e,findFirst:e.first,findLast:e.last})};function o$(e){if(void 0===e||""===e)throw new A("INVALID_ARGS","find requires query");return e}let oM={get:{usageOverride:"get text|attrs <@ref|selector>",positionalArgs:["subcommand","target"],allowedFlags:[...nw]},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:[...nw]},click:{usageOverride:"click <x y|@ref|selector>",positionalArgs:["target"],allowsExtraPositionals:!0,allowedFlags:[...nk,"clickButton",...nw]},press:{usageOverride:"press <x y|@ref|selector>",helpDescription:"Short press a semantic UI target by ref, selector, or point. For native context menus or hold gestures, use longpress <target> <durationMs> instead of press --hold-ms.",positionalArgs:["targetOrX","y?"],allowsExtraPositionals:!0,allowedFlags:[...nk,...nw]},longpress:{usageOverride:"longpress <x y|@ref|selector> [durationMs]",helpDescription:"Open native context menus or long-press targets by ref, selector, or point. Duration is positional, for example longpress @e12 800 or longpress 300 500 800.",positionalArgs:["targetOrX","yOrDurationMs?","durationMs?"],allowsExtraPositionals:!0,allowedFlags:[...nw]},swipe:{helpDescription:"Swipe coordinates with optional repeat pattern",positionalArgs:["x1","y1","x2","y2","durationMs?"],allowedFlags:["count","pauseMs","pattern"]},gesture:{usageOverride:"gesture <pan|fling|swipe|pinch|rotate|transform> ...",listUsageOverride:"gesture <pan|fling|swipe|pinch|rotate|transform> ...",helpDescription:'Run touch gestures: pan <x> <y> <dx> <dy> [durationMs], fling <up|down|left|right> <x> <y> [distance] [durationMs], swipe <left|right|left-edge|right-edge> [durationMs], pinch <scale> [x] [y], rotate <degrees> [x] [y] [velocity], or transform <x> <y> <dx> <dy> <scale> <degrees> [durationMs]. For command plans, output only command lines. Android transform verification should use all app-observable effects, for example wait text "pan changed yes", wait text "pinch changed yes", and wait text "rotate changed yes", not exact transform values.',summary:"Run pan, fling, swipe, pinch, rotate, or transform gestures",positionalArgs:["pan|fling|swipe|pinch|rotate|transform","args?"],allowsExtraPositionals:!0},focus:{positionalArgs:["x","y"]},type:{positionalArgs:["text"],allowsExtraPositionals:!0,allowedFlags:["delayMs"]},fill:{usageOverride:"fill <x> <y> <text> | fill <@ref|selector> <text>",positionalArgs:["targetOrX","yOrText","text?"],allowsExtraPositionals:!0,allowedFlags:[...nw,"delayMs"]},scroll:{usageOverride:"scroll <direction|top|bottom> [amount] [--pixels <n>] [--duration-ms <ms>]",helpDescription:"Scroll in a direction, or toward the top/bottom edge of scrollable content.",summary:"Scroll in a direction or to an edge",positionalArgs:["directionOrEdge","amount?"],allowedFlags:["pixels","durationMs"]}},{gesture:oR,...oN}=ob,oL=ru(oq("click"),(e,t)=>{var r;return e.interactions.click({...tV(r=t),...tz(r.target),...tG(r),...tq(r),button:r.button})}),oO=ru(oq("press"),(e,t)=>{var r;return e.interactions.press({...tV(r=t),...tz(r.target),...tG(r),...tq(r)})}),oP=ru(oq("fill"),(e,t)=>{var r;return e.interactions.fill({...tV(r=t),...tz(r.target),...tG(r),text:r.text,delayMs:r.delayMs})}),oC=ru(oq("longpress"),(e,t)=>{var r;return e.interactions.longPress({...tV(r=t),...tz(r.target),...tG(r),durationMs:r.durationMs})}),oF=ru(oq("swipe"),(e,t)=>e.interactions.swipe(t)),oE=ru(oq("focus"),(e,t)=>e.interactions.focus(t)),oT=ru(oq("type"),(e,t)=>e.interactions.type(t)),o_=ru(oq("scroll"),(e,t)=>e.interactions.scroll(t)),oj=ru(oq("get"),(e,t)=>{var r;return e.interactions.get({...tV(r=t),...function(e){switch(e.kind){case"ref":return{ref:e.ref,label:e.label};case"selector":return{selector:e.selector}}}(r.target),...tG(r),format:r.format})}),oU=ru(oq("is"),(e,t)=>e.interactions.is(t)),oB=ru(oq("find"),(e,t)=>e.interactions.find(t)),oV=ru(oq("gesture"),async(e,t)=>{var r,n,i,a,o,s;switch(t.kind){case"pan":return await e.interactions.pan({...tV(r=t),x:r.origin.x,y:r.origin.y,dx:r.delta.x,dy:r.delta.y,durationMs:r.durationMs});case"fling":return await e.interactions.fling({...tV(n=t),direction:n.direction,x:n.origin.x,y:n.origin.y,distance:n.distance,durationMs:n.durationMs});case"swipe":return await e.interactions.swipeGesture({...tV(i=t),preset:i.preset,durationMs:i.durationMs});case"pinch":return await e.interactions.pinch({...tV(a=t),scale:a.scale,x:a.origin?.x,y:a.origin?.y});case"rotate":return await e.interactions.rotateGesture({...tV(o=t),degrees:o.degrees,x:o.origin?.x,y:o.origin?.y,velocity:o.velocity});case"transform":return await e.interactions.transformGesture({...tV(s=t),x:s.origin.x,y:s.origin.y,dx:s.delta.x,dy:s.delta.y,scale:s.scale,degrees:s.degrees,durationMs:s.durationMs})}}),oz=rs({name:"interaction",clientSurface:!1,commands:[{name:"click",metadata:oq("click"),definition:oL,cliSchema:oM.click,cliReader:(e,t)=>({...tZ(t),...t1(t),...t5(t),target:t3(ow(e)),button:t.clickButton}),daemonWriter:ok.click,cliOutputFormatter:oD.click},{name:"press",metadata:oq("press"),definition:oO,cliSchema:oM.press,cliReader:(e,t)=>({...tZ(t),...t1(t),...t5(t),target:t3(ow(e))}),daemonWriter:ok.press,cliOutputFormatter:oD.press},{name:"fill",metadata:oq("fill"),definition:oP,cliSchema:oM.fill,cliReader:(e,t)=>{let r=ox(e);return{...tZ(t),...t1(t),target:t3(r.target),text:r.text,delayMs:t.delayMs}},daemonWriter:ok.fill},{name:"longpress",metadata:oq("longpress"),definition:oC,cliSchema:oM.longpress,cliReader:(e,t)=>{let r,n={...ow((r=function(e){if(rt(e[0])&&rt(e[1]))return{target:e.slice(0,2),...void 0!==e[2]?{durationMs:Number(e[2])}:{}};let t=e.at(-1);return e.length>1&&rt(t)?{target:e.slice(0,-1),durationMs:Number(t)}:{target:e}}(e)).target),...void 0!==r.durationMs?{durationMs:r.durationMs}:{}};return{...tZ(t),...t1(t),target:t3(n),durationMs:n.durationMs}},daemonWriter:ok.longpress},{name:"swipe",metadata:oq("swipe"),definition:oF,cliSchema:oM.swipe,cliReader:(e,t)=>({...tZ(t),from:{x:Number(e[0]),y:Number(e[1])},to:{x:Number(e[2]),y:Number(e[3])},durationMs:rr(e[4]),count:t.count,pauseMs:t.pauseMs,pattern:t.pattern}),daemonWriter:ok.swipe},{name:"focus",metadata:oq("focus"),definition:oE,cliSchema:oM.focus,cliReader:(e,t)=>({...tZ(t),x:Number(e[0]),y:Number(e[1])}),daemonWriter:ok.focus},{name:"type",metadata:oq("type"),definition:oT,cliSchema:oM.type,cliReader:(e,t)=>({...tZ(t),text:e.join(" "),delayMs:t.delayMs}),daemonWriter:ok.type},{name:"scroll",metadata:oq("scroll"),definition:o_,cliSchema:oM.scroll,cliReader:(e,t)=>({...tZ(t),direction:function(e){if("up"===e||"down"===e||"left"===e||"right"===e||"top"===e||"bottom"===e)return e;throw new A("INVALID_ARGS",`Unknown direction: ${String(e)}`)}(e[0]),amount:rr(e[1]),pixels:t.pixels,durationMs:t.durationMs}),daemonWriter:ok.scroll},{name:"get",metadata:oq("get"),definition:oj,cliSchema:oM.get,cliReader:(e,t)=>({...tZ(t),...t1(t),format:function(e){if("text"===e||"attrs"===e)return e;throw new A("INVALID_ARGS","get only supports text or attrs")}(e[0]),target:t3(function(e){if(e[0]?.startsWith("@"))return{ref:e[0],label:e.slice(1).join(" ").trim()||void 0};let t=e.join(" ").trim();if(!t)throw new A("INVALID_ARGS","get requires @ref or selector expression");return{selector:t}}(e.slice(1)))}),daemonWriter:ok.get,cliOutputFormatter:oD.get},{name:"is",metadata:oq("is"),definition:oU,cliSchema:oM.is,cliReader:(e,t)=>(function(e,t){let r={...t2(t),...t0(t)},n=e[0],i=function(e,t={}){let r=K(e,t);if(!r)throw new A("INVALID_ARGS","is requires a selector expression");return r}(e.slice(1),{preferTrailingValue:"text"===n});if("text"===n)return{...r,predicate:n,selector:i.selectorExpression,value:i.rest.join(" ")};if("visible"===n||"hidden"===n||"exists"===n||"editable"===n||"selected"===n)return{...r,predicate:n,selector:i.selectorExpression};throw new A("INVALID_ARGS","is requires predicate: visible|hidden|exists|editable|selected|text")})(e,t),daemonWriter:oA.is,cliOutputFormatter:oD.is},{name:"find",metadata:oq("find"),definition:oB,cliSchema:oM.find,cliReader:(e,t)=>(function(e,t){var r;let n={...{depth:(r=t).snapshotDepth,raw:r.snapshotRaw},...t0(t),first:t.findFirst,last:t.findLast},i=function(e){if("text"===e||"label"===e||"value"===e||"role"===e||"id"===e)return e}(e[0]),a=void 0!==i,o=a?e[1]:e[0],s=a?2:1,l=e[s];if(void 0===l)return{...n,locator:i,query:o$(o)};if("get"===l){let t=e[s+1];if("text"===t)return{...n,locator:i,query:o$(o),action:"getText"};if("attrs"===t)return{...n,locator:i,query:o$(o),action:"getAttrs"};throw new A("INVALID_ARGS","find get only supports text or attrs")}if("wait"===l)return{...n,locator:i,query:o$(o),action:"wait",timeoutMs:rr(e[s+1])};if("fill"===l||"type"===l)return{...n,locator:i,query:o$(o),action:l,value:e.slice(s+1).join(" ")};if("click"===l||"focus"===l||"exists"===l)return{...n,locator:i,query:o$(o),action:l};throw new A("INVALID_ARGS",`Unsupported find action: ${l}`)})(e,t),daemonWriter:oA.find,cliOutputFormatter:oD.find},{name:"gesture",metadata:oq("gesture"),definition:oV,cliSchema:oM.gesture,cliReader:function(e,t){let r=e[0],n=e.slice(1),i=tZ(t);switch(r){case"pan":return{...i,kind:r,origin:{x:Number(n[0]),y:Number(n[1])},delta:{x:Number(n[2]),y:Number(n[3])},durationMs:rr(n[4])};case"fling":return{...i,kind:r,direction:n[0],origin:{x:Number(n[1]),y:Number(n[2])},distance:rr(n[3]),durationMs:rr(n[4])};case"swipe":return{...i,kind:r,preset:n[0],durationMs:rr(n[1])};case"pinch":return{...i,kind:r,scale:Number(n[0]),origin:void 0===n[1]||void 0===n[2]?void 0:{x:Number(n[1]),y:Number(n[2])}};case"rotate":return{...i,kind:r,degrees:Number(n[0]),origin:void 0===n[1]||void 0===n[2]?void 0:{x:Number(n[1]),y:Number(n[2])},velocity:rr(n[3])};case"transform":return{...i,kind:r,origin:{x:Number(n[0]),y:Number(n[1])},delta:{x:Number(n[2]),y:Number(n[3])},scale:Number(n[4]),degrees:Number(n[5]),durationMs:rr(n[6])};default:throw new A("INVALID_ARGS","gesture requires pan, fling, swipe, pinch, rotate, or transform")}},daemonWriter:ob.gesture,extraDaemonWriters:oN}]});function oq(e){let t=oh.find(t=>t.name===e);if(!t)throw Error(`Missing interaction command metadata for ${e}`);return t}function oG(e){return rh(rd({app:e.app,appPath:e.appPath,platform:e.platform,...e.appId?{appId:e.appId}:{},...e.bundleId?{bundleId:e.bundleId}:{},...e.package?{package:e.package}:{}},`Installed: ${r_(e)}`))}let oW={boot:rm(function(e){let t=e.platform??"unknown",r=e.device??e.id??"unknown";return{data:e,text:`Boot ready: ${r} (${t})`}}),shutdown:rm(function(e){let t=e.platform??"unknown",r=e.device??e.id??"unknown",n=e.shutdown,i=!!n&&"object"==typeof n&&"success"in n&&!0===n.success;return{data:e,text:`${i?"Shutdown":"Shutdown failed"}: ${r} (${t})`}}),devices:rm(function(e){return{data:{devices:e.map(rT)},text:e.map(oH).join("\n")}}),doctor:rm(function(e){var t;let r,n="string"==typeof e.status?e.status:"unknown",i=[`Doctor: ${n}`],a=Array.isArray(t=e.checks)?t.filter(e=>!!e&&"object"==typeof e&&!Array.isArray(e)):[];if(r=e9,e9=!1,r){let t="string"==typeof e.summary?e.summary:void 0;t&&i.push(t)}else if(0===a.length){let t="string"==typeof e.summary?e.summary:"No blockers found.";i.push(t)}else for(let e of a)i.push(e8(e)),i.push(...e6(e));return{data:e,text:i.join("\n")}}),apps:({input:e,result:t})=>{var r;return{data:{apps:(r={result:t,appsFilter:e.appsFilter}).result},stderr:"all"===r.appsFilter?"Showing all apps, including system apps.\n":"Showing user-installed apps. Use --all to include system apps.\n",text:r.result.length>0?r.result.join("\n"):"all"===r.appsFilter?"No apps found.":"No user-installed apps found."}},session:rm(function(e){if("stateDir"in e)return{data:e,text:e.stateDir};let t={sessions:e.sessions.map(rE)};return{data:t,text:JSON.stringify(t,null,2)}}),artifacts:rm(function(e){var t;if("source"in(t=e)&&"daemon"===t.source)return{data:e,text:e.artifacts.length>0?e.artifacts.map(oX).join("\n"):e.message??"No daemon artifacts available."};let r=[e.message??`No cloud artifacts available for ${e.provider}.`],n=function(e){if(e.providerSessionId)return`agent-device artifacts ${e.providerSessionId} --provider ${e.provider} --json`}(e);return n&&r.push(`Retry: ${n}`),{data:e,text:e.cloudArtifacts.length>0?e.cloudArtifacts.map(oK).join("\n"):r.join("\n")}}),open:rm(function(e){let t,r=(t=e.appName??e.appBundleId??e.session,rd({session:e.session,...e.sessionStateDir?{sessionStateDir:e.sessionStateDir}:{},...e.runnerLogPath?{runnerLogPath:e.runnerLogPath}:{},...e.requestLogPath?{requestLogPath:e.requestLogPath}:{},...e.appName?{appName:e.appName}:{},...e.appBundleId?{appBundleId:e.appBundleId}:{},...e.startup?{startup:e.startup}:{},...e.runtime?{runtime:e.runtime}:{},...e.device?rF(e.device):{}},t?`Opened: ${t}`:"Opened")),n=[rp(r)].filter(e=>!!e);return"string"==typeof r.sessionStateDir&&n.push(`Session state: ${r.sessionStateDir}`),{data:r,text:n.join("\n")||null}}),close:rm(function(e){return rh({session:e.session,...e.shutdown?{shutdown:e.shutdown}:{},..."provider"in e&&e.provider?{provider:e.provider}:{},...rc(e.session?`Closed: ${e.session}`:"Closed")})}),install:rm(oG),reinstall:rm(oG),"install-from-source":rm(function(e){return rh(rd({launchTarget:e.launchTarget,...e.appName?{appName:e.appName}:{},...e.appId?{appId:e.appId}:{},...e.bundleId?{bundleId:e.bundleId}:{},...e.packageName?{package:e.packageName}:{},...e.installablePath?{installablePath:e.installablePath}:{},...e.archivePath?{archivePath:e.archivePath}:{},...e.materializationId?{materializationId:e.materializationId}:{},...e.materializationExpiresAt?{materializationExpiresAt:e.materializationExpiresAt}:{}},`Installed: ${rj(e)}`))}),prepare:rf,viewport:rf};function oH(e){let t=e.kind?` ${e.kind}`:"",r=e.target?` target=${e.target}`:"",n="boolean"==typeof e.booted?` booted=${e.booted}`:"";return`${e.name} (${e.platform}${t}${r})${n}`}function oK(e){let t=e.url?` ${e.url}`:"",r=e.availability?` ${e.availability}`:"";return`${e.kind}: ${e.name}${r}${t}`}function oX(e){return`${e.filename}: ${e.mimeType} ${e.sizeBytes} bytes id=${e.id}`}let oJ=n_("artifacts","List daemon or cloud provider artifacts for an active or completed session.",{provider:tb("Cloud provider name, for example browserstack or aws-device-farm."),providerSessionId:tb("Cloud provider session id or ARN.")}),oY=ru(oJ,(e,t)=>e.sessions.artifacts(t)),oQ={name:"artifacts",metadata:oJ,definition:oY,cliSchema:{summary:"List daemon or cloud provider session artifacts",usageOverride:"artifacts [provider-session-id] [--provider <name>]",positionalArgs:["provider-session-id?"],allowedFlags:["provider","providerSessionId"]},cliReader:(e,t)=>({...tZ(t),provider:t.provider,providerSessionId:e[0]??t.providerSessionId}),daemonWriter:tY(L.artifacts),cliOutputFormatter:oW.artifacts},oZ=n_("apps","List installed apps.",{appsFilter:tS(["user-installed","all"])}),o0=n_("open","Open an app, deep link, URL, or platform surface.",{app:tb("App name, bundle id, package, or URL."),url:tb("Optional URL passed with an app shell."),surface:tS(r3),activity:tb("Android activity name."),launchConsole:tb("Launch console mode."),launchArgs:tk("Launch arguments forwarded verbatim to the platform launch command."),relaunch:tx("Force relaunch."),saveScript:tI({oneOf:[th(),tf()]}),deviceHub:tx("Use Xcode Device Hub when surfacing Apple simulators."),noRecord:tx("Do not record this action.")}),o1=n_("close","Close an app or end the active session.",{app:tb("Optional app to close."),shutdown:tx("Shutdown the session/device where supported."),saveScript:tI({oneOf:[th(),tf()]})}),o2=ru(oZ,(e,t)=>e.apps.list(t)),o5=ru(o0,(e,t)=>e.apps.open(t)),o3=ru(o1,(e,t)=>t.app?e.apps.close(t):e.sessions.close(function(e){let{app:t,...r}=e;return r}(t))),o4=tY(L.apps),o8=tY(L.open,function(e){return e.app?e.url?[e.app,e.url]:[e.app]:[]}),o6=tY(L.close,e=>rn(e.app)),o9={name:"apps",metadata:oZ,definition:o2,cliSchema:{helpDescription:"List user-installed apps; use --all to include system/OEM apps",summary:"List installed apps",allowedFlags:["appsFilter"],defaults:{appsFilter:Q}},cliReader:(e,t)=>({...tZ(t),appsFilter:Z(t.appsFilter)}),daemonWriter:o4,cliOutputFormatter:oW.apps},o7={name:"open",metadata:o0,definition:o5,cliSchema:{helpDescription:'Boot device/simulator; optionally launch app or deep link URL. Use --platform to bind URL/deep-link opens to the target platform. For iOS simulator initial stdout/stderr, put --launch-console <path> on this open command, for example agent-device open "Agent Device Tester" --platform ios --launch-console artifacts/launch-console.log. Expo Go/dev-client shells accept host + URL, for example agent-device open "Expo Go" exp://127.0.0.1:8081 --platform ios. macOS also supports --surface app|frontmost-app|desktop|menubar.',summary:"Open an app, deep link or URL, save replays",positionalArgs:["appOrUrl?","url?"],allowedFlags:["activity","launchConsole","launchArgs","deviceHub","saveScript","noRecord","relaunch","surface"]},cliReader:(e,t)=>({...tZ(t),app:e[0],url:e[1],surface:t.surface,activity:t.activity,launchConsole:t.launchConsole,launchArgs:t.launchArgs,relaunch:t.relaunch,saveScript:t.saveScript,deviceHub:t.deviceHub,noRecord:t.noRecord}),daemonWriter:o8,cliOutputFormatter:oW.open},se={name:"close",metadata:o1,definition:o3,cliSchema:{positionalArgs:["app?"],allowedFlags:["saveScript","shutdown"]},cliReader:(e,t)=>({...tZ(t),app:e[0],shutdown:t.shutdown,saveScript:t.saveScript}),daemonWriter:o6,cliOutputFormatter:oW.close},st=n_("devices","List available devices.",{}),sr=n_("boot","Boot or prepare a selected device without using CLI positional arguments.",{headless:tx("Boot without showing simulator UI when supported.")}),sn=n_("shutdown","Shutdown a selected simulator or emulator.",{}),si=ru(st,(e,t)=>e.devices.list(t)),sa=ru(sr,(e,t)=>e.devices.boot(t)),so=ru(sn,(e,t)=>e.devices.shutdown(t)),ss=(e,t)=>tZ(t),sl=tY(L.devices),su=tY(L.boot),sc=tY(L.shutdown),sd={name:"devices",metadata:st,definition:si,cliReader:ss,daemonWriter:sl,cliOutputFormatter:oW.devices},sp={name:"boot",metadata:sr,definition:sa,cliSchema:{summary:"Boot target device/simulator",allowedFlags:["headless"]},cliReader:(e,t)=>({...tZ(t),headless:t.headless}),daemonWriter:su,cliOutputFormatter:oW.boot},sm={name:"shutdown",metadata:sn,definition:so,cliSchema:{summary:"Shutdown target simulator/emulator"},cliReader:ss,daemonWriter:sc,cliOutputFormatter:oW.shutdown},sf=n_("doctor","Diagnose device, app, Metro, and React Native readiness before a run.",{targetApp:tb("Installed app package/bundle id or app name to verify without opening a session."),remote:tx("Check remote connection setup instead of local device inventory.")}),sh=ru(sf,(e,t)=>e.command.doctor(t)),sg={name:"doctor",metadata:sf,definition:sh,cliSchema:{usageOverride:"doctor [--platform ios|android|macos|linux|web|apple] [--app <id-or-name>] [--remote]",helpDescription:"Preflight for QA and dogfood runs. Reports local device inventory, active sessions, optional app discovery, scoped toolchain info, and Metro reachability inferred from cwd/runtime. On iOS simulators it also warms the XCTest runner build cache in the background when missing, so the first open on a fresh machine skips the runner build — run doctor first on new setups. Pass --app to verify a target app on the one matching booted device without opening a session. Use --remote to check remote connection setup without probing local devices. Default output is compact; use --json for full checks and evidence.",summary:"Preflight device, app, Metro, and RN/Expo readiness",allowedFlags:["targetApp","remote"]},cliReader:(e,t)=>({...tZ(t),targetApp:t.targetApp,remote:t.remote}),daemonWriter:tY(L.doctor),cliOutputFormatter:oW.doctor};function sy(e,t){if(!e||"object"!=typeof e||Array.isArray(e))throw new A("INVALID_ARGS",`${t} installSource must be an object.`);if("github-actions-artifact"!==sw(e.type,`${t} installSource.type`))throw new A("INVALID_ARGS",`${t} installSource.type must be "github-actions-artifact".`);let{owner:r,repo:n}=sv(sw(e.repo,`${t} installSource.repo`),`${t} installSource.repo`);return sb(r,n,e.artifact,`${t} installSource.artifact`)}function sb(e,t,r,n){var i;return"number"==typeof r||"string"==typeof(i=r)&&/^\d+$/.test(i.trim())?{kind:"github-actions-artifact",owner:e,repo:t,artifactId:function(e,t){let r="number"==typeof e?e:"string"==typeof e?Number(e):NaN;if(!Number.isInteger(r))throw new A("INVALID_ARGS",`${t} must be an integer.`);return r}(r,n)}:{kind:"github-actions-artifact",owner:e,repo:t,artifactName:sw(r,n)}}function sv(e,t){let r=e.indexOf("/");if(r<=0||r===e.length-1||-1!==e.indexOf("/",r+1))throw new A("INVALID_ARGS",`${t} must use owner/repo.`);let n={owner:e.slice(0,r).trim(),repo:e.slice(r+1).trim()};if(!n.owner||!n.repo)throw new A("INVALID_ARGS",`${t} must use owner/repo.`);return n}function sw(e,t){let r="string"==typeof e&&e.trim().length>0?e.trim():void 0;if(!r)throw new A("INVALID_ARGS",`${t} must be a non-empty string.`);return r}let sx=n_("install","Install an app binary.",{app:tb("Optional app identifier hint."),appPath:ty(tb("Path to app binary."))}),sS=n_("reinstall","Reinstall an app binary.",{app:ty(tb()),appPath:ty(tb("Path to app binary."))}),sk=n_("install-from-source","Install an app from a structured source.",{source:ty(tI(tg("Install source object."))),retainPaths:tx(),retentionMs:tw()}),sI=ru(sx,(e,t)=>e.apps.install(t)),sD=ru(sS,(e,t)=>e.apps.reinstall(t)),sA=ru(sk,(e,t)=>e.apps.installFromSource(t)),s$=tY(L.install,e=>{var t;let r;return t=e.app,r=ro(e.appPath,"missing app path"),"string"==typeof t&&t.length>0?[t,r]:[r]}),sM=tY(L.reinstall,e=>{var t,r;return t=e.app,r=e.appPath,[ro(t,"missing first positional"),ro(r,"missing second positional")]}),sR={name:"install",metadata:sx,definition:sI,cliSchema:{usageOverride:"install <path> | install <app> <path>",listUsageOverride:"install <path>",positionalArgs:["appOrPath","path?"]},cliReader:(e,t)=>(function(e,t){let[r,n]=e,i=void 0!==n;return{...tZ(t),...i?{app:ra(r,"install requires app")}:{},appPath:ra(i?n:r,"install requires path")}})(e,t),daemonWriter:s$,cliOutputFormatter:oW.install},sN={name:"reinstall",metadata:sS,definition:sD,cliSchema:{positionalArgs:["app","path"]},cliReader:(e,t)=>{var r;return r=e,{...tZ(t),app:ra(r[0],"reinstall requires app"),appPath:ra(r[1],"reinstall requires path")}},daemonWriter:sM,cliOutputFormatter:oW.reinstall},sL={name:"install-from-source",metadata:sk,definition:sA,cliSchema:{usageOverride:"install-from-source <url> | install-from-source --github-actions-artifact <owner/repo:artifact>",listUsageOverride:"install-from-source",helpDescription:"Install app builds from URLs, remote source specs, or CI artifacts resolved by a remote daemon.",summary:"Install app builds from URLs, remote source specs, or CI artifacts",positionalArgs:["url?"],allowedFlags:["header","githubActionsArtifact","installSource","retainPaths","retentionMs"]},cliReader:(e,t)=>({...tZ(t),source:function(e,t){let r=e[0]?.trim();if(e.length>1)throw new A("INVALID_ARGS","install-from-source accepts either one <url> positional or --github-actions-artifact");let n=t.githubActionsArtifact?function(e,t="--github-actions-artifact"){let r=e.indexOf(":");if(r<=0||r===e.length-1)throw new A("INVALID_ARGS",`${t} must use owner/repo:artifact, for example thymikee/RNCLI83:6635342232`);let{owner:n,repo:i}=sv(e.slice(0,r),t);return sb(n,i,e.slice(r+1),`${t} artifact`)}(t.githubActionsArtifact):void 0,i=t.installSource;if(1!=+!!r+ +!!n+ +!!i)throw new A("INVALID_ARGS","install-from-source requires exactly one source: <url>, --github-actions-artifact, or config installSource");if(!r&&t.header&&t.header.length>0)throw new A("INVALID_ARGS","install-from-source --header is only supported for URL sources");return n||i||{kind:"url",url:r,headers:function(e){if(!e||0===e.length)return;let t={};for(let r of e){let e=r.indexOf(":");if(e<=0)throw new A("INVALID_ARGS",`Invalid --header value "${r}". Expected "name:value".`);let n=r.slice(0,e).trim(),i=r.slice(e+1).trim();if(!n)throw new A("INVALID_ARGS",`Invalid --header value "${r}". Header name cannot be empty.`);t[n]=i}return t}(t.header)}}(e,t),retainPaths:t.retainPaths,retentionMs:t.retentionMs}),daemonWriter:e=>tQ(G.installSource,[],{...e,installSource:e.source,retainMaterializedPaths:e.retainPaths,materializedPathRetentionMs:e.retentionMs}),cliOutputFormatter:oW["install-from-source"]},sO=n_("prepare","Prepare platform helper infrastructure.",{action:ty(tS(["ios-runner"])),timeoutMs:tw("Maximum wall-clock time for the prepare command.")}),sP=ru(sO,(e,t)=>e.command.prepare(t)),sC={name:"prepare",metadata:sO,definition:sP,cliSchema:{usageOverride:"prepare ios-runner --platform ios|macos [--timeout <ms>]",listUsageOverride:"prepare",helpDescription:'Prepare platform helper infrastructure. ios-runner builds/reuses, starts, and health-checks the XCTest runner so later Apple snapshots and interactions do not pay first-use startup cost. In CI, run it after boot/install and before replay/test; if replay/test starts a separate daemon, stop the prepare daemon before replay/test so it does not keep the prepared runner lease. It is not a recovery step for "runner already owned by another agent-device daemon"; stop the owning daemon on the Mac with simulator access instead. Runner build/start output is written to the session runner.log; daemon.log is for daemon lifecycle/startup issues.',summary:"Pre-warm platform helpers, especially the iOS/macOS XCTest runner before Apple automation",positionalArgs:["ios-runner"],allowedFlags:["timeoutMs"]},cliReader:(e,t)=>({...tZ(t),action:ra(e[0],"prepare requires subcommand"),timeoutMs:t.timeoutMs}),daemonWriter:tY(L.prepare,e=>[ro(e.action,"prepare requires subcommand")]),cliOutputFormatter:oW.prepare},sF=n_("push","Deliver a push payload.",{app:ty(tb()),payload:ty(tI({oneOf:[tf(),tg()]}))}),sE=n_("trigger-app-event","Trigger an app-defined event.",{event:ty(tb()),payload:tH(tg(void 0),function(e,t){let r=e[t];if(void 0!==r){if(!r||"object"!=typeof r||Array.isArray(r))throw Error(`Expected ${t} to be an object.`);return r}})}),sT=ru(sF,(e,t)=>e.apps.push(t)),s_=ru(sE,(e,t)=>e.apps.triggerEvent(t)),sj=[{name:"push",metadata:sF,definition:sT,cliSchema:{listUsageOverride:"push",helpDescription:"Deliver push notification payloads to an installed app.",summary:"Deliver push notification payloads to an installed app",positionalArgs:["bundleOrPackage","payloadOrJson"]},cliReader:(e,t)=>({...tZ(t),app:ra(e[0],"push requires bundleOrPackage"),payload:ra(e[1],"push requires payloadOrJson")}),daemonWriter:tY(L.push,e=>{var t;return[(t=e).app,"string"==typeof t.payload?t.payload:JSON.stringify(t.payload)]})},{name:"trigger-app-event",metadata:sE,definition:s_,cliSchema:{usageOverride:"trigger-app-event <event> [payloadJson]",listUsageOverride:"trigger-app-event",helpDescription:"Invoke app-defined automation or test events with an optional structured payload.",summary:"Invoke app-defined automation/test events with optional structured payloads",positionalArgs:["event","payloadJson?"]},cliReader:(e,t)=>({...tZ(t),event:ra(e[0],"trigger-app-event requires event"),payload:e[1]?function(e,t){try{let t=JSON.parse(e);if(t&&"object"==typeof t&&!Array.isArray(t))return t}catch{}throw new A("INVALID_ARGS",`${t} must be a JSON object`)}(e[1],"trigger-app-event payload"):void 0}),daemonWriter:tY(L.triggerAppEvent,e=>{var t;return[(t=e).event,...t.payload?[JSON.stringify(t.payload)]:[]]})}],sU=n_("session","List active sessions or print daemon state directory.",{action:tS(["list","state-dir"],"list shows active sessions; state-dir prints the resolved daemon state directory without contacting the daemon.")}),sB=ru(sU,async(e,{action:t,...r})=>"state-dir"===t?{stateDir:await e.sessions.stateDir(r)}:{sessions:await e.sessions.list(r)}),sV={name:"session",metadata:sU,definition:sB,cliSchema:{usageOverride:"session list | session state-dir",listUsageOverride:"session",helpDescription:"List active sessions or print the effective daemon state directory",positionalArgs:["list|state-dir?"]},cliReader:(e,t)=>({...tZ(t),action:function(e){let t=e??"list";if("list"===t||"state-dir"===t)return t;throw new A("INVALID_ARGS","session only supports list or state-dir")}(e[0])}),cliOutputFormatter:oW.session};function sz(e,t){let r=void 0===e?NaN:Number(e);if(!Number.isInteger(r)||r<1)throw new A("INVALID_ARGS",`viewport ${t} must be a positive integer`);return r}let sq=n_("viewport","Resize the active web viewport.",{width:ty(tw("Viewport width in CSS pixels.",{min:1})),height:ty(tw("Viewport height in CSS pixels.",{min:1}))}),sG=ru(sq,(e,t)=>e.command.viewport(t)),sW=rs({name:"management",commands:[sd,sp,sm,oQ,sg,sC,o9,sV,o7,se,{name:"viewport",metadata:sq,definition:sG,cliSchema:{helpDescription:"Resize the active web viewport before taking snapshots or screenshots. Useful for fixed-layout or 100vh apps where changing the viewport reveals different content.",summary:"Resize the active web viewport for the current session",positionalArgs:["width","height"]},cliReader:(e,t)=>({...tZ(t),width:sz(e[0],"width"),height:sz(e[1],"height")}),daemonWriter:tY(L.viewport,e=>{let{width:t,height:r}=e;return[String(t),String(r)]}),cliOutputFormatter:oW.viewport},sR,sN,sL,...sj]}),sH="metro",sK=n_(sH,"Prepare Metro runtime or reload React Native apps.",{action:ty(tS(["prepare","reload"])),projectRoot:tb(),kind:tI(tf()),publicBaseUrl:tb(),proxyBaseUrl:tb(),bearerToken:tb(),bridgeScope:tI({type:"object",additionalProperties:!0}),launchUrl:tb(),port:tw(),listenHost:tb(),statusHost:tb(),startupTimeoutMs:tw(),probeTimeoutMs:tw(),reuseExisting:tx(),installDependenciesIfNeeded:tx(),runtimeFilePath:tb(),logPath:tb(),metroHost:tb(),metroPort:tw(),bundleUrl:tb(),timeoutMs:tw()}),sX=ru(sK,async(e,t)=>{var r,n,i;return"prepare"===t.action?await e.metro.prepare({projectRoot:(r=t).projectRoot,kind:r.kind,publicBaseUrl:r.publicBaseUrl,proxyBaseUrl:r.proxyBaseUrl,bearerToken:r.bearerToken,bridgeScope:r.bridgeScope??((n=r).tenant&&n.runId&&n.leaseId?{tenantId:n.tenant,runId:n.runId,leaseId:n.leaseId}:void 0),port:r.port,listenHost:r.listenHost,statusHost:r.statusHost,startupTimeoutMs:r.startupTimeoutMs,probeTimeoutMs:r.probeTimeoutMs,reuseExisting:r.reuseExisting,installDependenciesIfNeeded:r.installDependenciesIfNeeded,runtimeFilePath:r.runtimeFilePath}):await e.metro.reload({metroHost:(i=t).metroHost,metroPort:i.metroPort,bundleUrl:i.bundleUrl,timeoutMs:i.timeoutMs})}),sJ=rs({name:"metro",commands:[{name:sH,metadata:sK,definition:sX,cliSchema:{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",helpDescription:"Prepare a local Metro runtime or ask Metro to reload connected React Native apps",summary:"Prepare Metro reachability for React Native/Expo apps or trigger app reloads",positionalArgs:["prepare|reload"],allowedFlags:[...nS,...nx]},cliReader:(e,t)=>{let r=(e[0]??"").toLowerCase();if("prepare"!==r&&"reload"!==r)throw new A("INVALID_ARGS","metro requires a subcommand: prepare or reload");if("reload"===r)return{action:r,metroHost:t.metroHost,metroPort:t.metroPort,bundleUrl:t.bundleUrl,timeoutMs:t.metroProbeTimeoutMs};if(!t.metroPublicBaseUrl&&!t.metroProxyBaseUrl)throw new A("INVALID_ARGS","metro prepare requires --public-base-url <url> or --proxy-base-url <url>.");return{action:r,projectRoot:t.metroProjectRoot,kind:function(e){if(void 0!==e){if("auto"===e||"react-native"===e||"expo"===e)return e;throw new A("INVALID_ARGS","metro prepare --kind must be auto, react-native, or expo")}}(t.kind??t.metroKind),port:t.metroPreparePort,listenHost:t.metroListenHost,statusHost:t.metroStatusHost,publicBaseUrl:t.metroPublicBaseUrl,proxyBaseUrl:t.metroProxyBaseUrl,bearerToken:t.metroBearerToken,bridgeScope:t.tenant&&t.runId&&t.leaseId?{tenantId:t.tenant,runId:t.runId,leaseId:t.leaseId}:void 0,startupTimeoutMs:t.metroStartupTimeoutMs,probeTimeoutMs:t.metroProbeTimeoutMs,reuseExisting:!t.metroNoReuseExisting&&void 0,installDependenciesIfNeeded:!t.metroNoInstallDeps&&void 0,runtimeFilePath:t.metroRuntimeFile}},cliOutputFormatter:({input:e,result:t})=>{var r;return{data:(r={result:t,action:e.action}).result,text:"reload"===r.action?`Reloaded React Native apps via ${r.result.reloadUrl}`:JSON.stringify(r.result,null,2)}}}]}),sY=["path","start","stop","doctor","mark","clear"],sQ=["started","stopped","marked","cleared","restarted","removedRotatedFiles"],sZ={logs:rm(function(e){var t;return{data:e,text:e.path,stderr:s4([s5(e,["active","state","backend","sizeBytes"]),(t=e,sQ.map(e=>{var r,n;return r=e,null==(n=t[e])?"":`${r}=${n}`}).filter(Boolean).join(" ")||void 0),e.hint,s3(e.notes)])}}),network:rm(function(e){let t=[],r=e.entries??[];if(e.path&&t.push(e.path),0===r.length)t.push("No recent HTTP(s) entries found.");else for(let e of r)t.push(...function(e){let t=e.method??"HTTP",r=e.url??"<unknown-url>",n=void 0!==e.status?` status=${e.status}`:"",i=e.timestamp?`${e.timestamp} `:"",a=void 0!==e.durationMs?` durationMs=${e.durationMs}`:"",o=[`${i}${t} ${r}${n}${a}`];return e.headers?s2(o,"headers",e.headers):(s1(o,"request headers",e.requestHeaders),s1(o,"response headers",e.responseHeaders)),s2(o,"request",e.requestBody),s2(o,"response",e.responseBody),o}(e));return{data:e,text:t.join("\n"),stderr:s4([s5(e,["active","state","backend","include","scannedLines","matchedLines"]),s3(e.notes)])}}),audio:rm(function(e){let t=[`Audio probe: ${String(e.state??"stopped")} heard=${String(!0===e.heard)}`,s0("rmsDbfs",e.rmsDbfs),s0("peakDbfs",e.peakDbfs)].filter(e=>!!e);return{data:e,text:t.join("\n"),stderr:s4([s5(e,["active","backend","source","durationMs","elapsedMs","bucketMs","sampleCount","sourceCount","mediaElementCount"]),s3(e.notes)])}})};function s0(e,t){if(!Array.isArray(t))return;let r=t.filter(e=>"number"==typeof e&&Number.isFinite(e));return r.length>0?`${e}: [${r.join(", ")}]`:void 0}function s1(e,t,r){r&&0!==Object.keys(r).length&&e.push(` ${t}: ${JSON.stringify(r)}`)}function s2(e,t,r){void 0!==r&&e.push(` ${t}: ${r}`)}function s5(e,t){return t.map(t=>void 0!==e[t]&&null!==e[t]?`${t}=${e[t]}`:"").filter(Boolean).join(" ")||void 0}function s3(e){let t=e?.filter(e=>e.length>0)??[];return t.length>0?t.join("\n"):void 0}function s4(e){return e.filter(e=>!!e).join("\n")||void 0}let s8="logs",s6="network",s9="audio",s7=["probe"],le=["start","status","stop"],lt=n_(s8,"Manage session app logs.",{action:tS(sY),message:tb(),restart:tx()}),lr=n_(s6,"Show recent HTTP traffic.",{action:tS(["dump","log"]),limit:tw(),include:tS(y)}),ln=n_(s9,"Probe audio levels.",{action:tS(s7),probeAction:tS(le),durationMs:tw("Probe duration in milliseconds."),bucketMs:tw("Audio level bucket size in milliseconds.")}),li=ru(lt,(e,t)=>e.observability.logs(t)),la=ru(lr,(e,t)=>e.observability.network(t)),lo=ru(ln,(e,t)=>e.observability.audio(t)),ls=tY(s8,e=>{var t;return[(t=e).action??"path",...rn(t.message)]}),ll=rs({name:"observability",commands:[{name:s8,metadata:lt,definition:li,cliSchema:{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"]},cliReader:(e,t)=>({...tZ(t),action:function(e){if(void 0!==e)return r2(sY,e,{message:"logs requires path, start, stop, doctor, mark, or clear"})}(e[0]),message:e.slice(1).join(" ")||void 0,restart:t.restart}),daemonWriter:ls,cliOutputFormatter:sZ.logs},{name:s6,metadata:lr,definition:la,cliSchema:{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]",listUsageOverride:"network",helpDescription:"Dump recent HTTP(s) traffic parsed from the session app log",summary:"Inspect HTTP(S) traffic parsed from session app logs, including summaries, headers, and bodies",positionalArgs:["dump|log","limit?","include?"],allowedFlags:["networkInclude"]},cliReader:(e,t)=>({...tZ(t),action:function(e){if(void 0!==e){if("dump"===e||"log"===e)return e;throw new A("INVALID_ARGS","network requires dump or log")}}(e[0]),limit:rr(e[1]),include:t.networkInclude??function(e){if(void 0!==e)return r2(y,e,{message:"network include must be summary, headers, body, or all"})}(e[2])}),daemonWriter:e=>{var t;return tQ(s6,[...(t=e).action?[t.action]:[],...ri(t.limit)],{...e,networkInclude:e.include})},cliOutputFormatter:sZ.network},{name:s9,metadata:ln,definition:lo,cliSchema:{usageOverride:"audio probe start [durationSeconds] [bucketMs] | audio probe status | audio probe stop",listUsageOverride:"audio",helpDescription:"Probe browser or host-rendered simulator/emulator audio as compact dBFS buckets",summary:"Probe audio levels",positionalArgs:["probe","start|status|stop","durationSeconds?","bucketMs?"]},cliReader:(e,t)=>{let r;return{...tZ(t),action:function(e){if(void 0!==e)return r2(s7,e,{message:"audio requires probe"})}(e[0]),probeAction:function(e){if(void 0!==e)return r2(le,e,{message:"audio probe requires start, status, or stop"})}(e[1]),durationMs:void 0===(r=rr(e[2]))?void 0:Math.round(1e3*r),bucketMs:rr(e[3])}},daemonWriter:e=>{var t;return tQ(s9,[(t=e).action??"probe",t.probeAction??"status",...ri(t.durationMs),...ri(t.bucketMs)],e)},cliOutputFormatter:sZ.audio}]}),lu={perf:rm(function(e){return{data:e,text:function(e){var t;let r="xctrace"===(t=e).kind?function(e){var t,r,n,i,a;let o="string"==typeof e.perf?e.perf:void 0,s="string"==typeof(t=e).outPath?t.outPath:"string"==typeof t.reportPath?t.reportPath:void 0;if(o&&s&&"xctrace"===e.kind){let t;return r=s,n="string"==typeof e.mode?e.mode:"capture",i=o,a=e.template,t=[r,`Perf ${n}: ${i}`],"string"==typeof a&&t.push(`Template: ${a}`),t.join("\n")}}(t):function(e){var t;let r,n,i,a=(r=lc((t=e).action),n=lc(t.kind),i=lc(t.type),r&&n&&i?{action:r,kind:n,type:i}:void 0);if(a){let t;return`Perf ${a.action}: ${a.kind} ${a.type}${(t=lc(e.state))?` state=${t}`:""}${function(e){let t=lc(e.outPath);if(!t)return"";let r=lp(e.sizeBytes);return`
|
|
29
|
+
${t}${void 0!==r?` (${lh(r)})`:""}`}(e)}${function(e){let t=H(e.summary)?e.summary:void 0,r=H(t?.frameHealth)?t.frameHealth:void 0;if(!r||!0!==r.available)return"";let n=lp(r.droppedFramePercent),i=lp(r.droppedFrameCount),a=lp(r.totalFrameCount);return void 0===n||void 0===i||void 0===a?"":`
|
|
30
|
+
Trace frame health: dropped ${lm(n)} (${Math.round(i)}/${Math.round(a)} frames)`}(e)}`}}(t);if(r)return r;let n=H(e.artifact)?e.artifact:void 0;return n?function(e){let t="string"==typeof e.kind?e.kind:"memory";if(!1===e.available){let r="string"==typeof e.reason&&e.reason.length>0?e.reason:"not available";return`Memory artifact (${t}): unavailable - ${r}`}let r="string"==typeof e.path?e.path:void 0,n=lp(e.sizeBytes),i=void 0===n?"":` (${lh(n)})`;return r?`Memory artifact (${t}): ${r}${i}`:`Memory artifact (${t}): captured${i}`}(n):function(e){var t,r,n,i,a;let o,s,l,u,c,d=H(e?.fps)?e.fps:void 0,p=(t=e,o=H(t?.cpu)?t.cpu:void 0,s=H(t?.memory)?t.memory:void 0,(l=[function(e){if(e?.available!==!0)return;let t=lp(e.usagePercent);return void 0!==t?`CPU ${lm(t)}`:void 0}(o),function(e){let t;if(e?.available!==!0)return;let r=lp(e.residentMemoryKb)??lp(e.totalPssKb)??lp(e.totalRssKb);return void 0!==r?`memory ${t=r/1024,`${t>=10?Math.round(t):t.toFixed(1)}MB`}`:void 0}(s)].filter(e=>!!e)).length>0?l.join(", "):void 0);if(!d)return ld(p,"missing frame metric");if(!1===d.available){return ld(p,"string"==typeof(r=d).reason&&r.reason.length>0?r.reason:"not available")}let m=function(e){let t=lp(e.droppedFramePercent),r=lp(e.droppedFrameCount);if(void 0!==t&&void 0!==r){var n,i,a;return[`dropped ${lm(t)}`,(n=r,void 0!==(i=lp(e.totalFrameCount))?`(${Math.round(n)}/${Math.round(i)} frames)`:`(${Math.round(n)} dropped frames)`),void 0!==(a=lp(e.sampleWindowMs))?`window ${lf(a)}`:""].filter(Boolean).join(" ")}}(d);return m?(n=d,i=m,u=[`Frame health: ${i}`],(c=Array.isArray((a=n).worstWindows)?a.worstWindows.flatMap(e=>{if(!H(e))return[];let t=function(e){let t=lp(e.startOffsetMs),r=lp(e.endOffsetMs),n=lp(e.missedDeadlineFrameCount);if(void 0===t||void 0===r||void 0===n)return;let i=lp(e.worstFrameMs),a=void 0===i?"":`, worst ${lf(i)}`;return`- +${lf(t)}-+${lf(r)}: ${Math.round(n)} missed-deadline frames${a}`}(e);return t?[t]:[]}):[]).length>0&&u.push("Worst windows:",...c),u.join("\n")):ld(p,"missing dropped-frame summary")}(H(e.metrics)?e.metrics:void 0)}(e)}})};function lc(e){return"string"==typeof e?e:void 0}function ld(e,t){return e?`Performance: ${e}`:`Frame health: unavailable - ${t}`}function lp(e){return"number"==typeof e&&Number.isFinite(e)?e:void 0}function lm(e){return`${Number.isInteger(e)?e:e.toFixed(1)}%`}function lf(e){let t=Math.max(0,Math.round(e));if(t<1e3)return`${t}ms`;let r=Math.round(t/1e3);if(r<60)return`${r}s`;let n=Math.floor(r/60),i=r%60;return i>0?`${n}m ${i}s`:`${n}m`}function lh(e){if(e<1024)return`${Math.round(e)}B`;let t=e/1024;if(t<1024)return`${t>=10?Math.round(t):t.toFixed(1)}KB`;let r=t/1024;return`${r>=10?Math.round(r):r.toFixed(1)}MB`}let lg="perf",ly=n_(lg,"Show session performance, frame health, and memory diagnostics.",{area:tS(r6),subject:tS(r7),action:tS(r9),kind:tS(ne),template:tb("xctrace template name, for example Time Profiler."),out:tb("Output artifact path."),tracePath:tb("Existing .trace path to report, defaults to the latest session trace.")}),lb=ru(ly,(e,t)=>e.observability.perf(t)),lv=tY(lg,e=>{var t;let r;return"cpu"===(r=(t=e).area??(t.action?"metrics":void 0))?lx([...rn(r),...rn(t.subject),...rn(t.action),...rn(t.kind)],t):"trace"===r?lx([...rn(r),...rn(t.action),...rn(t.kind)],t):[...rn(r),...rn(t.action)]}),lw=rs({name:"perf",commands:[{name:lg,metadata:ly,definition:lb,cliSchema:{usageOverride:"perf metrics --json\n agent-device perf frames --json\n agent-device perf memory sample --json\n agent-device perf memory snapshot [--kind android-hprof|memgraph] [--out <path>]\n agent-device perf cpu profile start --kind xctrace [--template <name>] --out <profile.trace>\n agent-device perf cpu profile stop --kind xctrace --out <profile.trace>\n agent-device perf cpu profile report --kind xctrace --out <report.json>\n agent-device perf trace start|stop --kind xctrace [--template <name>] --out <path>\n agent-device perf cpu profile start --kind simpleperf --out <cpu.perf.data>\n agent-device perf cpu profile stop --kind simpleperf\n agent-device perf cpu profile report --kind simpleperf --out <cpu-report.json>\n agent-device perf trace start|stop --kind perfetto [--out <path>]",listUsageOverride:"perf",helpDescription:"Show session performance metrics, focused frame/jank health, memory diagnostics artifacts, Apple xctrace artifacts, or Android native Simpleperf/Perfetto artifacts. Prefer explicit perf metrics --json for first-pass startup/CPU/memory data. For CPU profiles, start/stop write the raw artifact and report writes a compact .json summary; include report after simpleperf stop when the task needs agent-readable native CPU evidence. Bare perf and metrics remain aliases. Native perf output is agent evidence: compact state, artifact path, and size only; raw profiles/traces stay on disk.",summary:"Check runtime metrics, frames, memory, CPU profiles, or native trace artifacts",positionalArgs:["area?","subjectOrAction?","action?"],allowedFlags:["kind","perfTemplate","out"]},cliReader:(e,t)=>{var r;return{...tZ(t),...function(e,t={}){if(void 0!==e[0]&&void 0===e[1]){let r=lS(e[0],{allowUndefined:!0});if(r)return{action:r,kind:lk(t.kind),out:t.out}}let r=function(e){if(void 0===e)return;let t=e.toLowerCase();if(nd(t))return t;throw new A("INVALID_ARGS",no)}(e[0]);return"cpu"===r?{area:r,subject:function(e){let t=e?.toLowerCase();if(void 0!==t&&nm(t))return t;throw new A("INVALID_ARGS",nl)}(e[1]),action:lS(e[2]),kind:lk(t.kind),template:t.template,out:t.out}:"trace"===r?{area:r,action:lS(e[1]),kind:lk(t.kind),template:t.template,out:t.out}:{area:r,action:lS(e[1]),kind:lk(t.kind),out:t.out}}(e,{kind:"string"==typeof(r=t.kind)?lk(r):void 0,template:t.perfTemplate,out:t.out})}},daemonWriter:lv,cliOutputFormatter:lu.perf}]});function lx(e,t){let r=[...e];return(t.template||t.out||t.tracePath)&&r.push(t.template??""),(t.out||t.tracePath)&&r.push(t.out??""),t.tracePath&&r.push(t.tracePath),r}function lS(e,t={}){if(void 0===e)return;let r=e.toLowerCase();if(np(r))return r;if(!t.allowUndefined)throw new A("INVALID_ARGS",ns)}function lk(e){if(void 0===e)return;let t=e.toLowerCase();if(nf(t))return t;throw new A("INVALID_ARGS",nu)}let lI=/\b(logbox|redbox|reload js|copy stack|component stack|call stack|runtime error|open debugger to view warnings)\b/,lD=/\b(redbox|runtime error|reload js|copy stack|component stack|call stack)\b/,lA=[/\b[\w.$<>/-]+\.(?:tsx?|jsx?):\d+(?::\d+)?\b/,/\b[\w.$<>/-]+\.(?:tsx?|jsx?)\s+\(\d+:\d+\)/],l$=[/^!,\s+/,/^(warn|warning|error):\s+/,/\b(?:possible\s+)?unhandled (?:promise )?rejection\b/],lM=["open debugger to view warnings","getsnapshot should be cached to avoid an infinite loop",'unique "key" prop',"unique 'key' prop","virtualizedlists should never be nested","failed prop type"],lR=new Set(["x","\xd7","✕","✖","⨯"]);function lN(e){if(lO(e).detected)return"Hint: React Native warning/error overlay detected. It overlays part of the app and should be handled before interacting.\nRun: agent-device react-native dismiss-overlay\nThe command verifies the overlay is gone. Run agent-device snapshot -i afterward only when you need fresh refs for the next action."}function lL(e){return lO(e)}function lO(e){var t,r,n,i,a,o,s,l,u,c;let d,p,m,f,h,g,y,b,v=(d=(t=e).map(lE).join("\n").toLowerCase(),p=lW(t,lU),m=lW(t,lV),f=lW(t,l_,lz),h=lW(t,lj),g=(r=d,lA.some(e=>e.test(r))),y=lT(d),b=(n=d,i=p,a=m,i.length>0||a.length>0||/\b(reload js|copy stack)\b/.test(n)),{dismissNodes:p,minimizeNodes:m,collapsedNodes:f,redBox:(o=d,s=g,l=b,lD.test(o)||lT(o)||s&&l),detected:(u={text:d,hasReactNativeStackFrame:g,hasOverlayControl:b,hasControllessRedBoxText:y,collapsedNodes:f,openDebuggerWarningNodes:h}).collapsedNodes.length>0||u.openDebuggerWarningNodes.length>0||u.hasControllessRedBoxText||u.hasOverlayControl&&(c=u.text,lI.test(c)||u.hasReactNativeStackFrame)}),w=v.detected?function(e){let t=lK(e.dismissNodes,lH);if(t){let e;var r,n=t,i=(r=t,(e=lJ(r)?.trim().toLowerCase())&&lB(e)?"dismiss":"close");if(!n.rect)throw Error("React Native overlay target node must have rect");return{action:i,point:x(n.rect),rect:n.rect,ref:n.ref,label:lJ(n)}}let a=lK(e.collapsedNodes.filter(lq),lX);return a?.rect?{action:"close-collapsed-banner",point:function(e){var t,r;if(!e.rect)throw Error("Collapsed React Native warning node must have rect");let n=Math.min(e.rect.height,52),i=Math.min(36,Math.max(18,.45*n));return{x:Math.round((t=e.rect.x+e.rect.width-i,r=e.rect.x+1,Math.min(e.rect.x+e.rect.width-1,Math.max(r,t)))),y:Math.round(e.rect.y+n/2)}}(a),rect:a.rect,ref:a.ref,label:lJ(a)}:null}(v):null;return{detected:v.detected,redBox:v.redBox,dismissNodes:v.dismissNodes,minimizeNodes:v.minimizeNodes,collapsedNodes:v.collapsedNodes,primaryAction:w}}function lP(e){return[...e.dismissNodes,...e.minimizeNodes,...e.collapsedNodes]}function lC(e){var t;return l_(e.label?.trim())&&!!(t=e.rect)&&t.x<=1&&t.y<=1&&t.width>=300&&t.height>=600}function lF(e,t){let r=e.label?.trim();return!!r&&!!lC(e)&&t.some(e=>e.label?.trim()===r&&lG(e))}function lE(e){return[e.label,e.value,e.identifier,e.type,e.role].filter(Boolean).join(" ")}function lT(e){return/\buncaught\b/.test(e)&&/unable to download asset/.test(e)}function l_(e){let t=e?.trim().toLowerCase();return!!t&&(lM.some(e=>t.includes(e))||l$.some(e=>e.test(t)))}function lj(e){return e.includes("open debugger to view warnings")||/^!,\s+open debugger\b/.test(e)}function lU(e){var t,r;return lB(e)||(t=e,/^close(?:\s*\([^)]*\))?$/i.test(t))||(r=e,lR.has(r))}function lB(e){return/^dismiss(?:\s*\([^)]*\))?$/i.test(e)}function lV(e){return/^minimi[sz]e(?:\b|\s|\()/i.test(e)}function lz(e){return!e.rect||e.rect.height<=180}function lq(e){let t=lJ(e)?.trim().toLowerCase()??"";return(lj(t)||/^!,\s+/.test(t))&&lG(e)}function lG(e){return!!e.rect&&e.rect.width>=120&&e.rect.height>=36&&e.rect.height<=180}function lW(e,t,r=()=>!0){let n=[];for(let i of e)i.ref&&r(i)&&[i.label,i.value,i.identifier].map(e=>e?.trim().toLowerCase()).filter(e=>!!e).some(e=>t(e))&&n.push(i);return n}function lH(e){var t;let r;return[+(!0===(r=[e.type,e.role,e.subrole].join(" ").toLowerCase(),/\b(button|menuitem|link)\b/.test(r))),+(!0===e.hittable),-((t=e.rect)?t.width*t.height:1/0)]}function lK(e,t){let r=e.filter(e=>e.rect);return 0===r.length?null:r.sort((e,r)=>(function(e,t){for(let r=0;r<e.length;r+=1){let n=e[r]-t[r];if(0!==n)return n}return 0})(t(r),t(e)))[0]??null}function lX(e){return[+(!0===e.hittable),e.rect?.width??0,e.rect?.y??0]}function lJ(e){return e.label??e.value??e.identifier}let lY="react-native",lQ=n_(lY,"Run supported React Native app automation helpers.",{action:ty(tS(["dismiss-overlay"]))}),lZ=ru(lQ,(e,t)=>e.command.reactNative(t)),l0=tY(lY,e=>[ro(e.action,"react-native requires action")]),l1=rs({name:"react-native",commands:[{name:lY,metadata:lQ,definition:lZ,cliSchema:{usageOverride:"react-native dismiss-overlay",listUsageOverride:"react-native dismiss-overlay",positionalArgs:["dismiss-overlay"]},cliReader:(e,t)=>({...tZ(t),action:function(e){if("dismiss-overlay"===e)return e;throw new A("INVALID_ARGS","react-native supports only: dismiss-overlay")}(e[0])}),daemonWriter:l0}]}),l2=["medium","high"];function l5(e){var t;let r;if(l2.includes(e))return e;let n=void 0!==(r="number"==typeof e?e:"string"==typeof(t=e)&&/^\d+$/.test(t)?Number(t):void 0)&&Number.isInteger(r)&&r>=5&&r<=10?r:void 0;if(void 0!==n)return n<=7?"medium":"high"}let l3={record:rm(function(e){let t,r="string"==typeof e.outPath?e.outPath:"",n=Array.isArray(t=e.chunks)?t.flatMap(e=>e&&"object"==typeof e?"number"!=typeof e.index||"string"!=typeof e.path?[]:[{index:e.index,path:e.path}]:[]):[];if(n.length<=1){var i,a;let t;return{data:e,text:(i=e,t=[],(a=r)&&t.push(a),"string"==typeof i.sessionStateDir&&t.push(`Session state: ${i.sessionStateDir}`),"string"==typeof i.warning&&t.push(`Warning: ${i.warning}`),"string"==typeof i.overlayWarning&&t.push(`Overlay warning: ${i.overlayWarning}`),t.join("\n"))}}let o=["Recording chunks:"];for(let e of n)o.push(` ${e.index}: ${e.path}`);return"string"==typeof e.telemetryPath&&o.push(`Telemetry: ${e.telemetryPath}`),"string"==typeof e.warning&&o.push(`Warning: ${e.warning}`),"string"==typeof e.overlayWarning&&o.push(`Overlay warning: ${e.overlayWarning}`),{data:e,text:o.join("\n")}})},l4="record",l8="trace",l6=["start","stop"],l9=n_(l4,"Start or stop screen recording.",{action:ty(tS(l6)),path:tb(),fps:tw(),maxSize:tw(),quality:tS(l2),hideTouches:tx()}),l7=n_(l8,"Start or stop trace capture.",{action:ty(tS(l6)),path:tb()}),ue=ru(l9,(e,t)=>e.recording.record(t)),ut=ru(l7,(e,t)=>e.recording.trace(t)),ur=tY(l4,e=>ua(e)),un=tY(l8,e=>ua(e)),ui=rs({name:"recording",commands:[{name:l4,metadata:l9,definition:ue,cliSchema:{usageOverride:"record start [path] [--fps <n>] [--max-size <px>] [--quality <medium|high>] [--hide-touches] | record stop",listUsageOverride:"record start [path] | record stop",helpDescription:"Start/stop screen recording; Android recordings longer than the 180s adb screenrecord limit are returned as multiple MP4 chunks. Use --max-size to limit dimensions and --quality to choose medium or high export quality",summary:"Start or stop screen recording",positionalArgs:["start|stop","path?"],allowedFlags:["fps","screenshotMaxSize","quality","hideTouches"]},cliReader:(e,t)=>({...tZ(t),action:uo(e[0],l4),path:e[1],fps:t.fps,maxSize:t.screenshotMaxSize,quality:t.quality,hideTouches:t.hideTouches}),daemonWriter:ur,cliOutputFormatter:l3.record},{name:l8,metadata:l7,definition:ut,cliSchema:{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?"]},cliReader:(e,t)=>({...tZ(t),action:uo(e[0],l8),path:e[1]}),daemonWriter:un}]});function ua(e){return[e.action,...rn(e.path)]}function uo(e,t){if("start"===e||"stop"===e)return e;throw new A("INVALID_ARGS",`${t} requires start|stop`)}let us="replay",ul="test",uu="Replay a recorded session.",uc=n_(us,uu,{path:ty(tb()),update:tx(),backend:tb(),maestro:tx(),env:tk()}),ud=n_(ul,"Run one or more replay scripts.",{paths:ty(tk()),update:tx(),backend:tb(),maestro:tx(),env:tk(),failFast:tx(),timeoutMs:tw(),retries:tw(),recordVideo:tx(),artifactsDir:tb(),shardAll:tw(),shardSplit:tw()}),up=ru(uc,(e,t)=>e.replay.run(t)),um=ru(ud,(e,t)=>e.replay.test(t)),uf=rs({name:"replay",commands:[{name:us,metadata:uc,definition:up,cliSchema:{usageOverride:"replay <path> | replay export <file.ad> [--format maestro] [--out <path>]",helpDescription:"Replay a recorded session. For Maestro YAML compatibility flows, use replay <flow.yaml> --maestro and keep the target binding such as --platform ios on the replay command.",summary:uu,positionalArgs:["path"],allowsExtraPositionals:!0,allowedFlags:["replayMaestro","replayExportFormat",...nI,"timeoutMs","out"]},cliReader:(e,t)=>({...tZ(t),path:ra(e[0],"replay requires path"),update:t.replayUpdate,backend:t.replayMaestro?"maestro":void 0,env:t.replayEnv}),daemonWriter:e=>tQ(us,[ro(e.path,"replay requires path")],{...e,replayUpdate:e.update,replayBackend:uh(e),replayEnv:e.env,replayShellEnv:ug(process.env)})},{name:ul,metadata:ud,definition:um,cliSchema:{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",...nI,"failFast","timeoutMs","retries","recordVideo","artifactsDir","reporter","reportJunit","shardAll","shardSplit"]},cliReader:(e,t)=>({...tZ(t),paths:e,update:t.replayUpdate,backend:t.replayMaestro?"maestro":void 0,env:t.replayEnv,failFast:t.failFast,timeoutMs:t.timeoutMs,retries:t.retries,recordVideo:t.recordVideo,artifactsDir:t.artifactsDir,shardAll:t.shardAll,shardSplit:t.shardSplit}),daemonWriter:e=>{let t;return tQ(ul,e.paths??[],{...(t={...e},delete t.reporter,delete t.reportJunit,t),replayUpdate:e.update,replayBackend:uh(e),replayEnv:e.env,replayShellEnv:ug(process.env)})}}]});function uh(e){return e.backend??(!0===e.maestro?"maestro":void 0)}function ug(e){let t={};for(let[r,n]of Object.entries(e))"string"==typeof n&&r.startsWith("AD_VAR_")&&(t[r]=n);return t}let uy=["in-app","system"],ub=["portrait","portrait-upside-down","landscape-left","landscape-right"];function uv(e){if(void 0===e)throw new A("INVALID_ARGS","rotate requires an orientation argument. Use portrait|portrait-upside-down|landscape-left|landscape-right.");switch(e?.trim().toLowerCase()){case"portrait":return"portrait";case"portrait-upside-down":case"upside-down":return"portrait-upside-down";case"landscape-left":case"left":return"landscape-left";case"landscape-right":case"right":return"landscape-right";default:throw new A("INVALID_ARGS",`Invalid rotation: ${e}. Use portrait|portrait-upside-down|landscape-left|landscape-right.`)}}let uw={appstate:rm(function(e){return{data:e,text:function(e){if("ios"===e.platform){let t=[`Foreground app: ${e.appName??e.appBundleId??"unknown"}`];return e.appBundleId&&t.push(`Bundle: ${e.appBundleId}`),e.source&&t.push(`Source: ${e.source}`),t.join("\n")}if("android"===e.platform){let t=[`Foreground app: ${e.package??"unknown"}`];return e.activity&&t.push(`Activity: ${e.activity}`),t.join("\n")}return null}(e)}}),back:rf,home:rf,rotate:rf,"app-switcher":rf,keyboard:rm(function(e){if("android"===e.platform&&"status"===e.action){var t;let r=[`Keyboard visible: ${!0===e.visible?"yes":"no"}`,`Input type: ${e.type??e.inputType??"unknown"}`,`Input owner: ${e.inputOwner??"unknown"}`];return e.inputMethodPackage&&r.push(`Input method: ${e.inputMethodPackage}`),e.focusedPackage&&r.push(`Focused package: ${e.focusedPackage}`),e.focusedResourceId&&r.push(`Focused resource: ${e.focusedResourceId}`),r.push(`Next action: ${(t=e.visible,"ime"===e.inputOwner?"Focused input appears to be owned by the keyboard/IME; dismiss or change the IME before retrying text entry.":!0===t?"Keyboard is visible and focused input appears app-owned; fill/type can proceed.":"Keyboard is hidden; focus an app field before type, or use fill with a concrete target.")}`),{data:e,text:r.join("\n")}}return rh(e)}),clipboard:rm(function(e){return"read"===e.action?{data:e,text:e.text}:rh(e)})},ux="appstate",uS="back",uk="home",uI="rotate",uD="app-switcher",uA="keyboard",u$="clipboard",uM=n_(ux,"Show foreground app or activity.",{}),uR=n_(uS,"Navigate back.",{mode:tS(uy)}),uN=n_(uk,"Go to the home screen.",{}),uL=n_(uI,"Rotate device orientation.",{orientation:ty(tS(ub))}),uO=n_(uD,"Open the app switcher.",{}),uP=n_(uA,"Inspect or dismiss the keyboard.",{action:tS(["status","dismiss"])}),uC=n_(u$,"Read or write clipboard text.",{action:ty(tS(["read","write"])),text:tb()}),uF=ru(uM,(e,t)=>e.command.appState(t)),uE=ru(uR,(e,t)=>e.command.back(t)),uT=ru(uN,(e,t)=>e.command.home(t)),u_=ru(uL,(e,t)=>e.command.rotate(t)),uj=ru(uO,(e,t)=>e.command.appSwitcher(t)),uU=ru(uP,(e,t)=>e.command.keyboard(t)),uB=ru(uC,(e,t)=>e.command.clipboard(t)),uV=tY(ux),uz=tY(uk),uq=tY(uI,e=>[ro(e.orientation,"rotate requires orientation")]),uG=tY(uD),uW=tY(uA,e=>rn(e.action)),uH=tY(u$,e=>{var t;return"read"===(t=e).action?["read"]:["write",t.text]}),uK=[oz,sW,iL,rs({name:"system",commands:[{name:ux,metadata:uM,definition:uF,cliSchema:{helpDescription:"Show foreground app/activity"},cliReader:(e,t)=>tZ(t),daemonWriter:uV,cliOutputFormatter:uw.appstate},{name:uS,metadata:uR,definition:uE,cliSchema:{usageOverride:"back [--in-app|--system]",allowedFlags:["backMode"]},cliReader:(e,t)=>({...tZ(t),mode:t.backMode}),daemonWriter:e=>{var t;return tQ(uS,[],{...e,backMode:"in-app"===(t=e.mode)||"system"===t?t:void 0})},cliOutputFormatter:uw.back},{name:uk,metadata:uN,definition:uT,cliReader:(e,t)=>tZ(t),daemonWriter:uz,cliOutputFormatter:uw.home},{name:uI,metadata:uL,definition:u_,cliSchema:{usageOverride:"rotate <portrait|portrait-upside-down|landscape-left|landscape-right>",helpDescription:"Rotate device orientation on iOS and Android",positionalArgs:["orientation"]},cliReader:(e,t)=>({...tZ(t),orientation:uv(e[0])}),daemonWriter:uq,cliOutputFormatter:uw.rotate},{name:uD,metadata:uO,definition:uj,cliReader:(e,t)=>tZ(t),daemonWriter:uG,cliOutputFormatter:uw["app-switcher"]},{name:uA,metadata:uP,definition:uU,cliSchema:{usageOverride:"keyboard [status|get|dismiss|enter|return]",helpDescription:"Inspect Android keyboard visibility/type or press/dismiss the device keyboard. To hide the keyboard, use keyboard dismiss. It taps safe controls like Done when available, verifies the keyboard closed, and reports UNSUPPORTED_OPERATION when no safe control is available.",summary:"Inspect, press, or dismiss the device keyboard",positionalArgs:["action?"]},cliReader:(e,t)=>({...tZ(t),...function(e){if(e.length>1)throw new A("INVALID_ARGS","keyboard accepts at most one action argument.");return tW({action:function(e){let t=e?.toLowerCase();if("get"===t)return"status";if(void 0===t||"status"===t||"dismiss"===t||"enter"===t||"return"===t)return t;throw new A("INVALID_ARGS","keyboard action must be status, get, dismiss, enter, or return.")}(e[0])})}(e)}),daemonWriter:uW,cliOutputFormatter:uw.keyboard},{name:u$,metadata:uC,definition:uB,cliSchema:{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},cliReader:(e,t)=>({...tZ(t),...function(e){let t=e[0]?.toLowerCase();if("read"!==t&&"write"!==t)throw new A("INVALID_ARGS","clipboard requires a subcommand: read or write.");if("read"===t){if(1!==e.length)throw new A("INVALID_ARGS","clipboard read does not accept additional arguments.");return{action:t}}if(e.length<2)throw new A("INVALID_ARGS","clipboard write requires text.");return{action:t,text:e.slice(1).join(" ")}}(e)}),daemonWriter:uH,cliOutputFormatter:uw.clipboard}]}),l1,uf,ll,lw,iE,ui,sJ,nT];function uX(){return uK.flatMap(e=>[...e.definitions])}function uJ(){return u0("cliSchemas")}function uY(){return u0("cliReaders")}function uQ(){return u0("daemonWriters")}function uZ(){return u0("cliOutputFormatters")}function u0(e){let t={};for(let r of uK){let n=r[e];if(n)for(let[r,i]of Object.entries(n)){if(Object.hasOwn(t,r))throw Error(`Duplicate ${String(e)} command family entry: ${r}`);t[r]=i}}return t}let u1=uK.flatMap(e=>[...e.metadata]),u2=new Map(u1.map(e=>[e.name,e]));function u5(){return[...u1]}function u3(){return B().map(e=>{let t=u8(e);if(!t)throw Error(`Missing command metadata for MCP-exposed command: ${e}`);return t})}function u4(e){return u2.has(e)}function u8(e){return u2.get(e)}export{uy as BACK_MODES,nA as COMMON_COMMAND_SUPPORTED_FLAG_KEYS,ub as DEVICE_ROTATIONS,n$ as GLOBAL_FLAG_KEYS,sY as LOG_ACTION_VALUES,ng as MAESTRO_COMPAT_TRACKER_URL,ny as MAESTRO_NEW_ISSUE_URL,nx as METRO_PREPARE_FLAGS,ns as PERF_ACTION_ERROR_MESSAGE,no as PERF_AREA_ERROR_MESSAGE,nu as PERF_KIND_ERROR_MESSAGE,nc as PERF_MEMORY_KIND_ERROR_MESSAGE,nl as PERF_SUBJECT_ERROR_MESSAGE,l2 as RECORDING_EXPORT_QUALITIES,rb as SCREENSHOT_ACTION_FLAG_KEYS,iz as SCROLL_DIRECTIONS,r3 as SESSION_SURFACES,n7 as SETTINGS_INVALID_ARGS_MESSAGE,iG as SWIPE_PATTERNS,lO as analyzeReactNativeOverlay,aw as annotateCoveredSnapshotNodes,rx as appendScreenshotScriptFlags,ah as areRectsApproximatelyEqual,iU as assertExclusiveScrollDistanceInputs,iX as assertScrollGestureInput,th as booleanSchema,rZ as buildMeta,eC as buildMobileSnapshotPresentation,nO as buildRequestFlags,iK as buildScrollGesturePlan,eS as buildSnapshotDisplayLines,iJ as buildSwipeGesturePlan,iY as buildSwipePresetGesturePlan,ij as buttonTag,i7 as captureScrollEdgeState,aO as clamp,i1 as clampGesturePoint,i6 as clampToRange,e0 as colorize,nC as createBatchDaemonWriter,eF as deriveMobileSnapshotHiddenContentHints,lL as detectReactNativeOverlay,eI as displayLabel,aM as expandRect,u8 as findCommandMetadata,tc as findMissingProxyLeaseFields,aY as focusCommand,e3 as formatCliStatusMarker,e6 as formatDoctorCheckDetailLines,e8 as formatDoctorCheckSummaryLine,lN as formatReactNativeOverlayWarning,eD as formatRole,eW as formatScreenshotDiffText,at as formatScrollEdgeMessage,eG as formatSnapshotDiffText,ek as formatSnapshotLine,i_ as getClickButtonValidationError,nR as getFlagDefinition,nN as getFlagDefinitions,it as getUnsupportedMacOsSettingMessage,iV as honoredScrollDurationMs,iZ as inferGestureReferenceFrame,ew as inferVerticalScrollIndicatorDirections,aR as intersectArea,u4 as isCommandName,ie as isMacOsSettingSupported,eT as isNodeVisibleInEffectiveViewport,np as isPerfAction,nd as isPerfArea,nf as isPerfKind,nh as isPerfMemoryKind,nm as isPerfSubject,tu as isProxyLeaseScope,lC as isReactNativeCollapsedWarningWrapperCandidate,lF as isReactNativeCollapsedWarningWrapperWithVisibleBanner,eO as isScrollableType,ax as isSnapshotNodeInteractionBlocked,rM as isSparseSnapshotQualityVerdict,r1 as isStringMember,ev as isSystemScrollIndicatorLabel,tr as leaseScopeFromOptions,tt as leaseScopeFromRequest,ti as leaseScopeToAllocateRequest,tn as leaseScopeToCommandFlags,tl as leaseScopeToConnectionMetadata,ta as leaseScopeToHeartbeatRequest,ts as leaseScopeToLeaseRpcParams,to as leaseScopeToReleaseRequest,uZ as listCommandFamilyCliOutputFormatters,uY as listCommandFamilyCliReaders,uJ as listCommandFamilyCliSchemas,uQ as listCommandFamilyDaemonWriters,uX as listCommandFamilyDefinitions,u5 as listCommandMetadata,u3 as listMcpCommandMetadata,aQ as longPressCommand,tg as looseObjectSchema,e7 as markDoctorProgressRendered,rU as normalizeDeployResult,rz as normalizeDevice,rB as normalizeInstallFromSourceResult,rV as normalizeMaterializationReleaseResult,rX as normalizeOpenDevice,rK as normalizeRuntimeHints,iB as normalizeScrollDurationMs,rq as normalizeSession,ea as normalizeSnapshotTree,rJ as normalizeStartupSample,rY as normalizeTargetShutdownResult,aA as normalizedRect,au as now,uv as parseDeviceRotation,sy as parseInstallSourceConfig,i2 as parseScrollDirection,r8 as parseSessionSurface,r2 as parseStringMember,iQ as parseSwipePreset,iI as parseTimeout,iD as parseWaitPositionals,a2 as pinchCommand,i0 as pointFromPercent,ag as pointInsideRect,ez as printHumanError,eV as printJson,rL as publicSnapshotCaptureAnnotations,rp as readCommandMessage,ox as readFillTargetFromPositionals,ir as readLocationCoordinate,nP as readMetadataCommandFlags,lP as readReactNativeOverlayActionNodes,rS as readScreenshotScriptFlag,rO as readSerializedSnapshotCaptureAnnotations,rQ as readSnapshotNodes,r$ as readSnapshotQualityVerdict,sz as readViewportDimension,l5 as recordingQualityInputToExportQuality,aN as rectCenter,rR as renderSnapshotQualityWarnings,i9 as requireIntInRange,ii as requireLocationCoordinates,aC as resolveActionableTouchNode,aF as resolveActionableTouchResolution,iT as resolveClickButton,r_ as resolveDeployResultTarget,rj as resolveInstallFromSourceResultTarget,aT as resolveInteractionTarget,am as resolveRectCenter,r0 as resolveSessionName,ae as runScrollEdgePasses,rw as screenshotFlagsFromOptions,rv as screenshotOptionsFromFlags,aZ as scrollCommand,ac as sleep,rN as snapshotCaptureAnnotationsFrom,aL as squaredDistance,tf as stringSchema,rc as successText,eZ as supportsColor,a0 as swipeCommand,al as toBackendContext,ad as toBackendResult,a$ as unionRects,rd as withSuccessText};
|