agent-device 0.17.9 → 0.17.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -19,6 +19,8 @@ A device automation CLI for real apps on iOS, Android, TV, web, and desktop. Age
19
19
 
20
20
  `agent-device` lets coding agents open apps, inspect the current UI, interact with visible elements, and collect debugging evidence through one CLI. Use it when an agent needs to verify what actually happens on a device, not just reason about code.
21
21
 
22
+ The CLI is the agent's hands, eyes, and evidence collector; it is not the brain. Your coding agent or QA harness reads the task, interprets the current screen, chooses the next command, and decides whether the result satisfies the test. `agent-device` keeps that loop grounded in structured accessibility data, deterministic actions, and files an engineer can inspect.
23
+
22
24
  If you know Vercel's [agent-browser](https://github.com/vercel-labs/agent-browser), `agent-device` is the same idea for mobile, TV, and desktop apps. Minimal `--platform web` support reuses `agent-browser` when a browser session needs to fit into the same command/session/replay loop.
23
25
 
24
26
  It works with native iOS and Android apps, plus apps built with Expo, Flutter, and React Native, as long as the target can run on a supported device, simulator, emulator, or desktop environment.
@@ -82,6 +84,8 @@ agent-device close
82
84
 
83
85
  Snapshots assign refs like `@e1`, `@e2`, and `@e3` to elements on the current screen. Refs from the latest snapshot are immediately actionable; after scrolling or changing screens, take a fresh snapshot.
84
86
 
87
+ Snapshots come from the app's accessibility tree, so high-quality labels, roles, and test IDs make agent runs far more reliable. Use screenshots and videos as evidence or visual fallback, but prefer refs and selectors for actions and assertions whenever the UI exposes enough structure.
88
+
85
89
  ## Next Steps
86
90
 
87
91
  - **Set up your agent**: run the CLI from Cursor, Codex, Claude Code, Windsurf, or another agent terminal. For skills, rules, direct MCP tools, and client-specific setup, see [AI Agent Setup](https://oss.callstack.com/agent-device/docs/agent-setup).
@@ -0,0 +1 @@
1
+ e3c1bb4b43e7e4bbcceaa4975ec7c00f606208a435d575209a9f0819a7adc5de agent-device-android-multitouch-helper-0.17.10.apk
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "android-multitouch-helper",
3
- "version": "0.17.9",
4
- "assetName": "agent-device-android-multitouch-helper-0.17.9.apk",
5
- "sha256": "d4db2e3034f561da280f9c8ddda16ea0318346313fd4c95106437f9c0ff9e135",
3
+ "version": "0.17.10",
4
+ "assetName": "agent-device-android-multitouch-helper-0.17.10.apk",
5
+ "sha256": "e3c1bb4b43e7e4bbcceaa4975ec7c00f606208a435d575209a9f0819a7adc5de",
6
6
  "packageName": "com.callstack.agentdevice.multitouchhelper",
7
- "versionCode": 17009,
7
+ "versionCode": 17010,
8
8
  "instrumentationRunner": "com.callstack.agentdevice.multitouchhelper/.MultiTouchInstrumentation",
9
9
  "statusProtocol": "android-multitouch-helper-v1"
10
10
  }
@@ -0,0 +1 @@
1
+ 2e2b87ebaf4ff9cb8f545a025a5470ce5f13744cc73f084431b263088c3002b8 agent-device-android-snapshot-helper-0.17.10.apk
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "android-snapshot-helper",
3
- "version": "0.17.9",
4
- "releaseTag": "v0.17.9",
5
- "assetName": "agent-device-android-snapshot-helper-0.17.9.apk",
3
+ "version": "0.17.10",
4
+ "releaseTag": "v0.17.10",
5
+ "assetName": "agent-device-android-snapshot-helper-0.17.10.apk",
6
6
  "apkUrl": null,
7
- "sha256": "b5b991a30ba75fa0b292cdb4027e249a9dae180884b10d9be78d4bdbd674dbc1",
8
- "checksumName": "agent-device-android-snapshot-helper-0.17.9.apk.sha256",
7
+ "sha256": "2e2b87ebaf4ff9cb8f545a025a5470ce5f13744cc73f084431b263088c3002b8",
8
+ "checksumName": "agent-device-android-snapshot-helper-0.17.10.apk.sha256",
9
9
  "packageName": "com.callstack.agentdevice.snapshothelper",
10
- "versionCode": 17009,
10
+ "versionCode": 17010,
11
11
  "instrumentationRunner": "com.callstack.agentdevice.snapshothelper/.SnapshotInstrumentation",
12
12
  "minSdk": 23,
13
13
  "targetSdk": 36,
package/dist/src/2133.js CHANGED
@@ -1 +1 @@
1
- import{AppError as e}from"./733.js";let t={alert:"alert",appState:"appstate",appSwitcher:"app-switcher",apps:"apps",back:"back",batch:"batch",boot:"boot",click:"click",close:"close",clipboard:"clipboard",devices:"devices",diff:"diff",fill:"fill",find:"find",focus:"focus",gesture:"gesture",get:"get",home:"home",install:"install",installFromSource:"install-from-source",is:"is",keyboard:"keyboard",logs:"logs",longPress:"longpress",network:"network",open:"open",perf:"perf",prepare:"prepare",press:"press",push:"push",record:"record",reactNative:"react-native",reinstall:"reinstall",replay:"replay",rotate:"rotate",scroll:"scroll",screenshot:"screenshot",settings:"settings",shutdown:"shutdown",snapshot:"snapshot",swipe:"swipe",test:"test",trace:"trace",triggerAppEvent:"trigger-app-event",type:"type",viewport:"viewport",wait:"wait"},s={installSource:"install_source",leaseAllocate:"lease_allocate",leaseHeartbeat:"lease_heartbeat",leaseRelease:"lease_release",releaseMaterializedPaths:"release_materialized_paths",runtime:"runtime",sessionList:"session_list"},a={auth:"auth",connect:"connect",connection:"connection",debug:"debug",disconnect:"disconnect",mcp:"mcp",metro:"metro",proxy:"proxy",reactDevtools:"react-devtools",session:"session",web:"web"},r=["pan","fling","swipe","pinch","rotate","transform"],o=`gesture requires one of: ${r.join(", ")}`,n=i(a.auth,a.connect,a.connection,a.disconnect,a.mcp,a.proxy,a.reactDevtools,a.web,t.prepare);function i(...e){return new Set(e)}function c(){return[...Object.values(t),...Object.values(a)].sort()}function l(e){return Object.values(t).includes(e)||e===a.debug||e===a.metro||e===a.session}function p(){return c().filter(e=>!n.has(e))}i(a.auth,a.connect,a.connection,a.debug,a.disconnect,a.mcp,a.metro,a.proxy,a.reactDevtools,a.session,a.web,t.appState,t.prepare,t.batch,t.devices,t.gesture,t.replay,t.test,t.trace);let u=[t.devices,t.boot,t.shutdown,t.apps,t.open,t.close,t.install,t.reinstall,t.installFromSource,t.push,t.triggerAppEvent,t.snapshot,t.screenshot,t.diff,t.wait,t.alert,t.settings,t.click,t.press,t.longPress,t.swipe,t.focus,t.type,t.fill,t.scroll,t.get,t.gesture,t.is,t.find,t.perf,t.logs,t.network,t.record,t.trace,t.test,t.appState,t.back,t.home,t.rotate,t.appSwitcher,t.keyboard,t.clipboard,t.reactNative],d=new Set(["batch","replay"]),m=["command","positionals","flags","runtime"],h=["platform","target","device","udid","serial","verbose","out"],f=new Set(u);function g(e){return"string"==typeof e?e.trim().toLowerCase():""}function b(t,s){let a=g(t);if(f.has(a))return a;throw new e("INVALID_ARGS",`Batch step ${s} command is not available through command batch: ${String(t)}`)}function w(t,s){if(d.has(t))throw new e("INVALID_ARGS",`Batch step ${s} cannot run ${t}.`)}export{d as BATCH_BLOCKED_COMMANDS,m as BATCH_DAEMON_STEP_KEYS,r as GESTURE_KINDS,o as GESTURE_SUBCOMMAND_ERROR,h as INHERITED_PARENT_FLAG_KEYS,s as INTERNAL_COMMANDS,t as PUBLIC_COMMANDS,u as STRUCTURED_BATCH_COMMAND_NAMES,w as assertBatchRuntimeCommandAllowed,l as isClientBackedCliCommandName,c as listCliCommandNames,p as listMcpExposedCommandNames,g as normalizeBatchCommandName,b as readStructuredBatchCommandName};
1
+ import{AppError as e}from"./733.js";let t={alert:"alert",appState:"appstate",appSwitcher:"app-switcher",apps:"apps",back:"back",batch:"batch",boot:"boot",click:"click",close:"close",clipboard:"clipboard",devices:"devices",diff:"diff",fill:"fill",find:"find",focus:"focus",gesture:"gesture",get:"get",home:"home",install:"install",installFromSource:"install-from-source",is:"is",keyboard:"keyboard",logs:"logs",longPress:"longpress",network:"network",open:"open",perf:"perf",prepare:"prepare",press:"press",push:"push",record:"record",reactNative:"react-native",reinstall:"reinstall",replay:"replay",rotate:"rotate",scroll:"scroll",screenshot:"screenshot",settings:"settings",shutdown:"shutdown",snapshot:"snapshot",swipe:"swipe",test:"test",trace:"trace",triggerAppEvent:"trigger-app-event",type:"type",viewport:"viewport",wait:"wait"},s={installSource:"install_source",leaseAllocate:"lease_allocate",leaseHeartbeat:"lease_heartbeat",leaseRelease:"lease_release",releaseMaterializedPaths:"release_materialized_paths",runtime:"runtime",sessionList:"session_list"},a={cdp:"cdp",auth:"auth",connect:"connect",connection:"connection",debug:"debug",disconnect:"disconnect",mcp:"mcp",metro:"metro",proxy:"proxy",reactDevtools:"react-devtools",session:"session",web:"web"},r=["pan","fling","swipe","pinch","rotate","transform"],o=`gesture requires one of: ${r.join(", ")}`,n=c(a.auth,a.cdp,a.connect,a.connection,a.disconnect,a.mcp,a.proxy,a.reactDevtools,a.web,t.prepare);function c(...e){return new Set(e)}function i(){return[...Object.values(t),...Object.values(a)].sort()}function l(e){return Object.values(t).includes(e)||e===a.debug||e===a.metro||e===a.session}function p(){return i().filter(e=>!n.has(e))}c(a.auth,a.cdp,a.connect,a.connection,a.debug,a.disconnect,a.mcp,a.metro,a.proxy,a.reactDevtools,a.session,a.web,t.appState,t.prepare,t.batch,t.devices,t.gesture,t.replay,t.test,t.trace);let d=[t.devices,t.boot,t.shutdown,t.apps,t.open,t.close,t.install,t.reinstall,t.installFromSource,t.push,t.triggerAppEvent,t.snapshot,t.screenshot,t.diff,t.wait,t.alert,t.settings,t.click,t.press,t.longPress,t.swipe,t.focus,t.type,t.fill,t.scroll,t.get,t.gesture,t.is,t.find,t.perf,t.logs,t.network,t.record,t.trace,t.test,t.appState,t.back,t.home,t.rotate,t.appSwitcher,t.keyboard,t.clipboard,t.reactNative],u=new Set(["batch","replay"]),m=["command","positionals","flags","runtime"],h=["platform","target","device","udid","serial","verbose","out"],f=new Set(d);function g(e){return"string"==typeof e?e.trim().toLowerCase():""}function b(t,s){let a=g(t);if(f.has(a))return a;throw new e("INVALID_ARGS",`Batch step ${s} command is not available through command batch: ${String(t)}`)}function w(t,s){if(u.has(t))throw new e("INVALID_ARGS",`Batch step ${s} cannot run ${t}.`)}export{u as BATCH_BLOCKED_COMMANDS,m as BATCH_DAEMON_STEP_KEYS,r as GESTURE_KINDS,o as GESTURE_SUBCOMMAND_ERROR,h as INHERITED_PARENT_FLAG_KEYS,s as INTERNAL_COMMANDS,t as PUBLIC_COMMANDS,d as STRUCTURED_BATCH_COMMAND_NAMES,w as assertBatchRuntimeCommandAllowed,l as isClientBackedCliCommandName,i as listCliCommandNames,p as listMcpExposedCommandNames,g as normalizeBatchCommandName,b as readStructuredBatchCommandName};
package/dist/src/2948.js CHANGED
@@ -25,6 +25,6 @@ ${v}${p.map(e=>JSON.stringify(e)).join("\n")}
25
25
  ${v}${ea(k,{summarizeTextSurfaces:!0}).flatMap(e=>[eo(e.node,0,!1,e.type,{summarizeTextSurfaces:!0}),...e_({...e,depth:0})]).join("\n")}${e$(x)}
26
26
  `:`${g}${$}
27
27
  ${v}${(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(...e_(r.pop(),"below"))};for(let n of e)i(n),t.push(n.text),t.push(...e_(n,"above")),n.node.hiddenContentBelow&&r.push(n);return i(),t})(ea(k,{summarizeTextSurfaces:!0})).join("\n")}${e$(x)}
28
- `}(a,{raw:r.raw,flatten:r.interactiveOnly,scoped:"string"==typeof r.scope&&r.scope.trim().length>0,depthLimited:"number"==typeof r.depth})}}},{name:n$,metadata:nD,definition:nI,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, 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"]},cliReader:(e,t)=>({...th(t),path:e[0]??t.out,...tW(t)}),daemonWriter:e=>tf(P.screenshot,tR(e.path),{...e,...tH(e)})},{name:nw,metadata:nx,definition:nS,cliSchema:nk,cliReader:(e,t)=>{if("snapshot"!==e[0])throw new S("INVALID_ARGS","Only diff snapshot is available through this parser.");return{...th(t),kind:"snapshot",out:t.out,interactiveOnly:t.snapshotInteractiveOnly,depth:t.snapshotDepth,scope:t.snapshotScope,raw:t.snapshotRaw}},daemonWriter:nA},{name:ir,metadata:ii,definition:ia,cliSchema:{usageOverride:"wait <ms>|text <text>|@ref|<selector> [timeoutMs]",positionalArgs:["durationOrSelector","timeoutMs?"],allowsExtraPositionals:!0,allowedFlags:[...r6]},cliReader:(e,t)=>(function(e,t){let r=ie(e);if(!r)throw new S("INVALID_ARGS","wait requires <ms>, text <text>, @ref, or <selector> [timeoutMs].");let n={...tg(t),...tb(t)};if("sleep"===r.kind)return{...n,durationMs:r.durationMs};if("text"===r.kind){if(!r.text)throw new S("INVALID_ARGS","wait requires text.");return{...n,text:r.text,...io(r.timeoutMs)}}return"ref"===r.kind?{...n,ref:r.rawRef,...io(r.timeoutMs)}:{...n,selector:r.selectorExpression,...io(r.timeoutMs)}})(e,t),daemonWriter:tm(P.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 S("INVALID_ARGS","wait command requires exactly one of durationMs, text, ref, or selector.");if(void 0!==e.durationMs)return[String(e.durationMs)];let t=tN(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(!D(r))throw new S("INVALID_ARGS",`Invalid wait selector: ${r}`);return[r,...t]})(e)),cliOutputFormatter:tU},{name:ng,metadata:ny,definition:nb,cliSchema:{usageOverride:"alert [get|accept|dismiss|wait] [timeout]",positionalArgs:["action?","timeout?"]},cliReader:(e,t)=>({...th(t),...function(e){if(e.length>2)throw new S("INVALID_ARGS","alert accepts at most action and timeout arguments.");return tl({action:function(e){let t=e?.toLowerCase();if(void 0===t||"get"===t||"accept"===t||"dismiss"===t||"wait"===t)return t;throw new S("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 S("INVALID_ARGS",`${t} must be a finite number.`)}(e[1],"alert timeout")})}(e)}),daemonWriter:nv,cliOutputFormatter:tU},{name:nW,metadata:nH,definition:nX,cliSchema:{usageOverride:nj,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=tg(t),n=e[0],i=e[1];if(tD(n,nJ)&&tD(i,nY))return{...r,setting:n,state:i};if("location"===n&&"set"===i)return{...r,setting:n,state:i,latitude:nq(e[2],"latitude"),longitude:nq(e[3],"longitude")};if("appearance"===n&&tD(i,nQ)||tD(n,nZ)&&tD(i,n0)||"fingerprint"===n&&tD(i,n1))return{...r,setting:n,state:i};if("permission"===n&&tD(i,n2))return{...r,setting:n,state:i,permission:function(e){if(tD(e,n5))return e;throw new S("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 S("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 S("INVALID_ARGS","Invalid settings arguments.")})(e,t),daemonWriter:nK}]}),il={debug:tj(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")}})},iu="debug",ic=nh(iu,"Symbolicate crash artifacts with matching debug symbols.",{action:eq(eX(["symbols"])),artifact:eq(eG("Apple crash artifact path (.ips, .crash, or .log).")),dsym:eG("Path to a matching .dSYM bundle."),searchPath:eG("Directory to scan for matching .dSYM bundles."),out:eG("Output path for the symbolicated artifact.")}),id=tF(ic,(e,t)=>e.debug.symbols(t)),ip=tP({name:"debugging",commands:[{name:iu,metadata:ic,definition:id,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)=>({...th(t),action:function(e){if("symbols"===e)return e;throw new S("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:il.debug}]});function im(e){return e?.clickButton??"primary"}function ih(e){return"primary"===e.button?null:"click"!==e.commandLabel?new S("INVALID_ARGS","--button is supported only for click"):"macos"!==e.platform&&"linux"!==e.platform?new S("UNSUPPORTED_OPERATION",`click --button ${e.button} is supported only on macOS and Linux`):"macos"===e.platform&&"middle"===e.button?new S("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 S("INVALID_ARGS",`click --button ${e.button} does not support repeat or gesture modifier flags`):null}function ig(e){return"primary"===e?{}:{button:e}}function iy(e,t="scroll accepts either a relative amount or --pixels, not both"){if(void 0!==e.amount&&void 0!==e.pixels)throw new S("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 S("INVALID_ARGS",i);if(e>n)throw new S("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 iw=["up","down","left","right"],ix=["left","right","left-edge","right-edge"],iS=["one-way","ping-pong"],ik=rE(ix,{message:"gesture swipe requires left, right, left-edge, or right-edge"}),iA=rE(iw,{message:e=>`Unknown direction: ${e}`});function i$(e){let t=e.direction,r="up"===t||"down"===t?e.referenceHeight:e.referenceWidth,n=iF(e.amount),i=void 0!==e.pixels?iC(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 iD(e){iF(e.amount),void 0!==e.pixels&&iC(e.pixels)}function iI(e){return{...i$({...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 iM(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=iL(t,i,o,{marginPx:n}),l=iL(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 iR(e){return ik.parse(e)}function iN(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)&&iE(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(iE);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 iL(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:iO(i,e,n.marginPx)}function iO(e,t,r){return{x:iT(e.x,r,t.referenceWidth),y:iT(e.y,r,t.referenceHeight)}}function iP(e){return iA.parse(e)}function iE(e){return!!e&&e.width>0&&e.height>0}function iF(e){if(void 0===e)return .6;if(!Number.isFinite(e)||e<=0)throw new S("INVALID_ARGS","scroll amount must be a positive number");return e}function iC(e){if(!Number.isFinite(e)||e<=0)throw new S("INVALID_ARGS","scroll pixels must be a positive integer");return Math.max(1,Math.round(e))}function iT(e,t,r){let n=Math.max(t,r-t);return i_(e,t,n)}function i_(e,t,r){return Math.min(Math.round(r),Math.max(Math.round(t),Math.round(e)))}function ij(e,t,r,n){if(!Number.isFinite(e)||!Number.isInteger(e)||e<r||e>n)throw new S("INVALID_ARGS",`${t} must be an integer between ${r} and ${n}`);return e}async function iU(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=eg(s),u=function(e,t,r,n){let i=new Map(e.map(e=>[e.index,e])),a=e.filter(e=>w(e)&&iX(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(w(r)&&iX(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(iz);if(e.length>0)return e.find(e=>iq(e,t.get(e.index),r))??e[0]??null}let l=a.filter(e=>iq(e,t.get(e.index),r)).sort(iW);return l.length>0?l[0]??null:a.filter(t=>eb(t,e)).sort(iW)[0]??a.sort(iW)[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:iq(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(iG)}:{canScroll:!1,emptySnapshot:!1,signature:c}}(e,t,r);if(n&&a.emptySnapshot)return await iU({edge:t,target:r,captureNodes:i});return a}catch(e){var a,o,s;throw a=t,o=n,s=e,o?new S("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 S("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 iV(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 S("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 iB(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 iq(e,t,r){return"bottom"===r?!0===e.hiddenContentBelow||t?.hiddenContentBelow===!0:!0===e.hiddenContentAbove||t?.hiddenContentAbove===!0}function iG(e){return e.length>0&&e.length<=80&&!/^(true|false)$/i.test(e)&&!/^\d+$/.test(e)&&!/^\d+%$/.test(e)}function iz(e,t){return iH(e.rect)-iH(t.rect)}function iW(e,t){return iH(t.rect)-iH(e.rect)}function iH(e){return e?e.width*e.height:0}function iX(e){return!!(e&&e.width>0&&e.height>0)}function iK(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}function iJ(e){return e.clock?.now()??Date.now()}async function iY(e,t){e.clock?await e.clock.sleep(t):await new Promise(e=>setTimeout(e,t))}function iQ(e){return e&&"object"==typeof e?e:void 0}let iZ=["x","y","width","height"];function i0(e){let t=i1(e);if(!t)return null;let r=f(t);return Number.isFinite(r.x)&&Number.isFinite(r.y)?r:null}function i1(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 i2(e,t){return!!e&&!!t&&iZ.every(r=>.5>=Math.abs(e[r]-t[r]))}function i5(e){return{x:i3(e.x,e.width),y:i3(e.y,e.height)}}function i3(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 i4=["tabbar","toolbar","navigationbar","bottomnavigation","bottomnavigationview","sheet","dialog","alert","popover","menu"],i8=["button","link","menuitem","tabitem","textfield","searchfield","edittext","checkbox","radio","switch","cell"];function i6(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!!ar(e.rect)&&(!!(!0===e.hittable||i7(e,i8))||!!(e.label?.trim()||e.value?.trim()||e.identifier?.trim()))}(i)||!function e(t,r,n){let i=ar(n.rect);if(!i)return null;let a=f(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||!(!(!ar((a=u).rect)||function(e){let t=ae(e);return t.includes("application")||t.includes("window")}(a))&&i7(a,i4))||at(o=n,s=u,l=t.byIndex)||at(s,o,l))return null;let c=ar(u.rect);return!c||i2(i,c)||e(t,r,u)?null:c}(t,r,n,i);return!!(o&&ep(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 i9(e){return void 0!==e.interactionBlocked}function i7(e,t){let r=ae(e);return t.some(e=>r.includes(e))}function ae(e){return[e.type,e.role,e.subrole].map(e=>p(e??"")).join(" ")}function at(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 ar(e){let t=i1(e);return t&&t.width>0&&t.height>0?t:null}let an=["button","link","menuitem","tabitem","textfield","searchfield","securetextfield","checkbox","radio","switch","cell"];function ai(e,t){return aa(e,t).node}function aa(e,t){var r;if(i9(t))return{node:t,reason:"covered"};let n=function(e,t){let r=i1(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||i9(e))return!1;let t=i1(e.rect);return!!t&&i2(t,r)});if(1!==t.length)break;n=t[0]}return n===t?null:n}(e,t);if(n?.rect&&i0(n.rect))return{node:n,reason:"same-rect-descendant"};if([(r=t).type,r.role,r.subrole].map(e=>p(e??"")).some(ao)&&t.rect&&i0(t.rect))return{node:t,reason:"semantic-target"};let i=a(e,t);return i?.rect&&!i9(i)&&i0(i.rect)?!function(e,t,r){var n,i;let a,o,s,l=i1(e.rect),u=i1(t.rect);if(!l||!u)return!1;let c=function(e,t){let r=f(t),n=e.filter(e=>{let t=(e.type??"").toLowerCase();return t.includes("application")||t.includes("window")}).map(e=>i1(e.rect)).filter(e=>null!==e);if(0===n.length)return null;let i=n.filter(e=>ep(e,r.x,r.y));return em(i.length>0?i:n)}(r,l);return!!c&&(a=v(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))&&!i2(l,u)}(t,i,e)?{node:i,reason:"hittable-ancestor"}:{node:t,reason:"overly-broad-ancestor"}:{node:t,reason:"original"}}function ao(e){return"tab"===e||an.some(t=>e.includes(t))}async function as(e,t,r){var n;return(await ah(e,t,r.action),"point"===t.target.kind)?{kind:"point",point:{x:(n=t.target).x,y:n.y}}:"ref"===t.target.kind?await al(e,t,t.target,r):await au(e,t,t.target,r)}async function al(e,t,r,n){let i=await ay(e,t,r),a=i.resolved,s=n.promoteToHittableAncestor?ad(i.snapshot.nodes,a.node,{action:n.action,label:`Ref ${r.ref}`}):a.node;return ap(s,`Ref ${r.ref}`,n.action),function(e,t,r,n){let i=e.rect?ev(e,t):null;if(!(!e.rect||!i||eb(e,t)))throw new S("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:av(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 au(e,t,r,n){let i=I(r.selector),a=await af(e,t,n.requireInteractive),l=s(ac(a.snapshot.nodes),i,{platform:e.backend.platform,requireRect:!0,requireUnique:!0,disambiguateAmbiguous:!0});if(l&&l.node.rect||!n.requireInteractive||(l=s(ac((a=await af(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&&i9(t.node))throw am({label:`Selector ${t.selector.raw}`,node:t.node,action:n.action,selector:t.selector.raw});throw new S("COMMAND_FAILED",d(i,l?.diagnostics??[],{unique:!0}))}let c=n.promoteToHittableAncestor?ad(a.snapshot.nodes,l.node,{action:n.action,label:`Selector ${l.selector.raw}`}):l.node;return ap(c,`Selector ${l.selector.raw}`,n.action),{kind:"selector",point:av(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 ac(e){return e.filter(e=>!i9(e))}function ad(e,t,r){let n=aa(e,t);if("covered"===n.reason)throw am({label:r.label,node:t,action:r.action});return n.node}function ap(e,t,r){if(i9(e))throw am({label:t,node:e,action:r})}function am(e){return new S("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 af(e,t,r){if(!e.backend.captureSnapshot)throw new S("UNSUPPORTED_OPERATION","snapshot is not supported by this backend");let n=t.session??"default",i=await e.sessions.get(n);if(!i)throw new S("SESSION_NOT_FOUND","No active session. Run open first.");let a=await e.backend.captureSnapshot(iK(e,t),{interactiveOnly:r,includeRects:!0}),o=a.snapshot??{nodes:a.nodes??[],truncated:a.truncated,backend:a.backend,createdAt:iJ(e)};return await e.sessions.set({...i,snapshot:o}),{snapshot:o}}async function ah(e,t,r){if("macos"!==e.backend.platform)return;let n=await ag(e,t);if(("desktop"===n||"menubar"===n)&&("menubar"!==n||"click"!==r&&"press"!==r))throw new S("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 ag(e,t){let r=await e.sessions.get(t.session??"default");return r?.metadata?.surface}async function ay(e,t,r){let n=t.session??"default",i=await e.sessions.get(n);if(!i)throw new S("SESSION_NOT_FOUND","No active session. Run open first.");if(!i.snapshot)throw new S("INVALID_ARGS","No snapshot in session. Run snapshot first.");let a=r.fallbackLabel??"",o=ab(i.snapshot.nodes,r.ref,{fallbackLabel:a});if(o)return{snapshot:i.snapshot,resolved:o};let s=await af(e,t,!0),l=ab(s.snapshot.nodes,r.ref,{fallbackLabel:a});if(!l)throw new S("COMMAND_FAILED",`Ref ${r.ref} not found or has no bounds`);return{...s,resolved:l}}function ab(e,t,r){let n=m(t);if(!n)throw new S("INVALID_ARGS",`Invalid ref: ${t}`);let i=g(e,n);if(aw(i))return{ref:n,node:i};let a=r.fallbackLabel.length>0?l(e,r.fallbackLabel):null;return aw(a)?{ref:n,node:a}:null}function av(e,t){let r=i0(e.rect);if(!r)throw new S("COMMAND_FAILED",t);return r}function aw(e){return!!e&&null!==i0(e.rect)}let ax=async(e,t)=>{let r=await as(e,t,{action:"focus",requireInteractive:!0,promoteToHittableAncestor:!1});if(!e.backend.focus)throw new S("UNSUPPORTED_OPERATION","focus is not supported by this backend");let n=aR(r),i=iQ(await e.backend.focus(iK(e,t),n));return{...r,...i?{backendResult:i}:{},...tC(`Focused (${n.x}, ${n.y})`)}},aS=async(e,t)=>{let r=await as(e,t,{action:"longPress",requireInteractive:!0,promoteToHittableAncestor:!0});if(!e.backend.longPress)throw new S("UNSUPPORTED_OPERATION","longPress is not supported by this backend");let n=void 0===t.durationMs?void 0:ij(t.durationMs,"durationMs",0,12e4),i=aR(r),a=iQ(await e.backend.longPress(iK(e,t),i,{durationMs:n}));return{...r,...void 0!==n?{durationMs:n}:{},...a?{backendResult:a}:{},...tC(`Long pressed (${i.x}, ${i.y})`)}},ak=async(e,t)=>{var r,n,i,a;let o;if(!e.backend.scroll)throw new S("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:aL(r,"scroll direction")},l=(n=t.amount,i="scroll amount",void 0===n?void 0:aP(n,i)),u=function(e,t){if(void 0!==e){if(!Number.isFinite(e)||!Number.isInteger(e)||e<=0)throw new S("INVALID_ARGS",`${t} must be a positive integer`);return e}}(t.pixels,"scroll pixels"),c=ib(t.durationMs);iy({amount:l,pixels:u},"scroll accepts either amount or pixels, not both");let d=await aI(e,t),p="viewport"===d.kind?{kind:"viewport"}:{kind:"point",point:aR(d)},m=e.backend.scroll,f=async()=>await m(iK(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 iV({edge:r,captureState:async i=>await aN(e,t,r,n,i),scroll:f});o=i.result,h=i.passes}else o=await f(),h=1;let g=iQ(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}:{},...tC(iB(s.direction,s.edge,h,l,u))}},aA=async(e,t)=>{if(!e.backend.swipe)throw new S("UNSUPPORTED_OPERATION","swipe is not supported by this backend");if(t.preset)return await a$(e,t,e.backend.swipe);let r=await aM(e,t),n=function(e,t){if(t.to)return{point:aO(t.to,"to")};let r=aL(t.direction,"swipe direction"),n=aP(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:ij(t.durationMs,"durationMs",16,1e4),a=iQ(await e.backend.swipe(iK(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}:{},...tC("Swiped")}};async function a$(e,t,r){let n;if(t.from||t.to||t.direction||void 0!==t.distance)throw new S("INVALID_ARGS","gesture swipe preset cannot be combined with from, to, direction, or distance");let i=iR(t.preset);await ah(e,t,"swipe");let a=iM(i,{referenceWidth:(n=aE((await af(e,t,!1)).snapshot.nodes)).width,referenceHeight:n.height},{platform:e.backend.platform}),o=void 0===t.durationMs?void 0:ij(t.durationMs,"durationMs",16,1e4),s={x:a.x1,y:a.y1},l={x:a.x2,y:a.y2},u=iQ(await r(iK(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}:{},...tC(`Swiped ${i}`)}}let aD=async(e,t)=>{if(!e.backend.pinch)throw new S("UNSUPPORTED_OPERATION","pinch is not supported by this backend");await ah(e,t,"pinch");let r=aP(t.scale,"pinch scale"),n=t.center?await as(e,{...t,target:t.center},{action:"pinch",requireInteractive:!1,promoteToHittableAncestor:!1}):void 0,i=iQ(await e.backend.pinch(iK(e,t),{scale:r,...n?{center:n.point}:{}}));return{kind:"pinch",scale:r,...n?{center:n.point,centerTarget:n}:{},...i?{backendResult:i}:{},...tC(`Pinched to scale ${r}`)}};async function aI(e,t){let r=t.target??{kind:"viewport"};return"viewport"===r.kind?(await ah(e,t,"scroll"),{kind:"viewport"}):await as(e,{...t,target:r},{action:"scroll",requireInteractive:!1,promoteToHittableAncestor:!1})}async function aM(e,t){if(t.from){var r;if("x"in(r=t.from)&&"y"in r)return await ah(e,t,"swipe"),{point:aO(t.from,"from")};let n=await as(e,{...t,target:t.from},{action:"swipe",requireInteractive:!1,promoteToHittableAncestor:!1});return{point:aR(n),target:n}}if(!t.direction)throw new S("INVALID_ARGS","swipe requires from+to or a direction");return await ah(e,t,"swipe"),{point:f(aE((await af(e,t,!1)).snapshot.nodes)),target:{kind:"viewport"}}}function aR(e){if(!e.point)throw new S("COMMAND_FAILED","Interaction target resolved without coordinates");return e.point}async function aN(e,t,r,n,i){if(!e.backend.captureSnapshot)throw new S("UNSUPPORTED_OPERATION",`scroll ${r} requires snapshot support to verify hidden content before scrolling`);let{captureSnapshot:a}=e.backend;return await iU({edge:r,target:n,scope:i,captureNodes:async r=>{let n=await a(iK(e,t),{scope:r});return n.snapshot?.nodes??n.nodes??[]}})}function aL(e,t){switch(e){case"up":case"down":case"left":case"right":return e;default:throw new S("INVALID_ARGS",`${t} must be up, down, left, or right`)}}function aO(e,t){let r=Number(e.x),n=Number(e.y);if(!Number.isFinite(r)||!Number.isFinite(n))throw new S("INVALID_ARGS",`${t} point requires finite x and y`);return{x:r,y:n}}function aP(e,t){if(!Number.isFinite(e)||e<=0)throw new S("INVALID_ARGS",`${t} must be a positive number`);return e}function aE(e){let t=e.filter(t=>eb(t,e)).map(e=>e.rect).filter(aF),r=t.length>0?t:e.map(e=>e.rect).filter(aF);if(0===r.length)throw new S("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 aF(e){return!!(e&&e.width>0&&e.height>0)}let aC={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."},aT={target:eq(eY()),button:eX(["primary","secondary","middle"],"Pointer button for platforms that support mouse buttons."),...eZ(),...e0()},a_={target:eq(eY()),...eZ(),...e0()},aj={target:eq(eY()),text:eq(eG("Text to enter into the target.")),delayMs:eW("Delay between typed characters.",{min:0}),...eZ()},aU={target:eq(eY()),durationMs:eW("Long press duration in milliseconds.",{min:0}),...eZ()},aV={from:eq(eQ("Swipe start point.")),to:eq(eQ("Swipe end point.")),durationMs:eW("Swipe duration in milliseconds.",{min:0}),count:eW("Number of swipe repetitions.",{min:1}),pauseMs:eW("Pause between repeated swipes.",{min:0}),pattern:eX(iS)},aB={x:eq(ez("X coordinate.")),y:eq(ez("Y coordinate."))},aq={text:eq(eG("Text to type.")),delayMs:eW("Delay between typed characters.",{min:0})},aG={direction:eq(eX(["up","down","left","right","top","bottom"])),amount:ez("Platform scroll amount."),pixels:eW("Pixel scroll amount.",{min:0}),durationMs:eW("Scroll duration in milliseconds when the backend supports pacing.",{min:0,max:1e4})},az={format:eq(eX(["text","attrs"])),target:eq(tu({oneOf:td(),description:"UI element target by snapshot ref or selector expression."},(e,t)=>{let r,n;return void 0===e[t]?void 0:"ref"===(n=tr(r=tp(e,t),"kind",["ref","selector"]))?{kind:n,ref:e8(r,"ref"),label:e6(r,"label")}:{kind:n,selector:e8(r,"selector")}})),...eZ()},aW={predicate:eq(eX(["visible","hidden","exists","editable","selected","text"])),selector:eq(eG()),value:eG(),...eZ()},aH={locator:eX(M),query:eq(eG()),action:eX(["click","focus","exists","getText","getAttrs","wait","fill","type"]),value:eG(),timeoutMs:eW(),first:eH(),last:eH(),depth:eW(),raw:eH()},aX={kind:eq(eX(O,"Gesture variant.")),direction:eX(iw,"Fling direction."),preset:eX(ix,"Swipe preset."),origin:eQ("Gesture origin point."),delta:eQ("Movement delta for pan or transform gestures."),distance:eW("Fling distance.",{min:0}),scale:ez("Pinch or transform scale."),degrees:ez("Rotation in degrees."),velocity:eW("Rotate gesture velocity.",{min:0}),durationMs:eW("Gesture duration in milliseconds.",{min:0})},aK=[{name:"click",description:aC.click,inputSchema:e1(aT),readInput:e=>e2(e,aT)},{name:"press",description:aC.press,inputSchema:e1(a_),readInput:e=>e2(e,a_)},{name:"fill",description:aC.fill,inputSchema:e1(aj),readInput:e=>e2(e,aj)},aJ("longpress",aU),aJ("swipe",aV),aJ("focus",aB),aJ("type",aq),aJ("scroll",aG),aJ("get",az),aJ("is",aW),aJ("find",aH),{name:"gesture",description:aC.gesture,inputSchema:e1(aX),readInput:function(e){let t=e5(e),r=e3(t),n=tr(t,"kind",O);return"pan"===n?{...r,kind:n,origin:e4(t,"origin"),delta:e4(t,"delta"),durationMs:te(t,"durationMs",{min:0})}:"fling"===n?{...r,kind:n,direction:tr(t,"direction",iw),origin:e4(t,"origin"),distance:te(t,"distance",{min:0}),durationMs:te(t,"durationMs",{min:0})}:"swipe"===n?{...r,kind:n,preset:tr(t,"preset",ix),durationMs:te(t,"durationMs",{min:0})}:"pinch"===n?{...r,kind:n,scale:e9(t,"scale"),origin:aY(t,"origin")}:"rotate"===n?{...r,kind:n,degrees:e9(t,"degrees"),origin:aY(t,"origin"),velocity:te(t,"velocity",{min:0})}:{...r,kind:n,origin:e4(t,"origin"),delta:e4(t,"delta"),scale:e9(t,"scale"),degrees:e9(t,"degrees"),durationMs:te(t,"durationMs",{min:0})}}}];function aJ(e,t){return nh(e,aC[e],t)}function aY(e,t){return void 0===e[t]?void 0:e4(e,t)}let aQ={gesture:tm(P.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),...tN(e.durationMs)];case"fling":return["fling",tO(e.direction,"gesture fling requires direction"),String(e.origin?.x),String(e.origin?.y),...tN(e.distance),...tN(e.durationMs)];case"swipe":return aZ(e);case"pinch":return["pinch",String(e.scale),...tN(e.origin?.x),...tN(e.origin?.y)];case"rotate":return["rotate",String(e.degrees),...tN(e.origin?.x),...tN(e.origin?.y),...tN(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),...tN(e.durationMs)];default:throw new S("INVALID_ARGS","gesture requires pan, fling, swipe, pinch, rotate, or transform")}}),"gesture-pan":tm(P.gesture,function(e){return["pan",String(e.x),String(e.y),String(e.dx),String(e.dy),...tN(e.durationMs)]}),"gesture-fling":tm(P.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),...tN(r),...tN(t.durationMs)]}),"gesture-swipe":tm(P.gesture,aZ),"gesture-pinch":tm(P.gesture,function(e){return["pinch",String(e.scale),...tN(e.x),...tN(e.y)]}),"gesture-rotate":tm(P.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 S("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,...tN(e.velocity)]})(e)),"gesture-transform":tm(P.gesture,function(e){return["transform",String(e.x),String(e.y),String(e.dx),String(e.dy),String(e.scale),String(e.degrees),...tN(e.durationMs)]})};function aZ(e){return["swipe",tO(e.preset,"gesture swipe requires preset"),...tN(e.durationMs)]}function a0(e){if(e[0]?.startsWith("@")){let t=a2(e.slice(1));return{ref:e[0],...void 0===t?{}:{label:t}}}let t=$(e);return t?{selector:t.selectorExpression}:{x:Number(e[0]),y:Number(e[1])}}function a1(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?a2(e.slice(1,2)):void 0},text:r}}let r=$(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 a2(e){return e.join(" ").trim()||void 0}let a5={click:e=>tf(P.click,tx(e),{...e,clickButton:e.button}),press:tm(P.press,e=>tx(e)),longpress:tm(P.longPress,e=>{var t;return[...tx(t=e),...tN(t.durationMs)]}),swipe:tm(P.swipe,function(e){return[String(e.from?.x),String(e.from?.y),String(e.to?.x),String(e.to?.y),...tN(e.durationMs)]}),focus:tm(P.focus,e=>[String(e.x),String(e.y)]),type:tm(P.type,e=>[e.text]),fill:tm(P.fill,e=>{var t;return[...tx(t=e),t.text]}),scroll:tm(P.scroll,e=>[tO(e.direction,"scroll requires direction"),...tN(e.amount)]),get:tm(P.get,e=>[tO(e.format,"get requires format"),...function(e){let t=tS(e);if("string"==typeof t.ref)return[t.ref,...tA(t.label)];if("string"==typeof t.selector)return[t.selector];throw new S("INVALID_ARGS","element command requires @ref or selector target")}(e)])};function a3(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})`}:tV(e)}let a4={click:tj(a3),press:tj(a3),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)}:tV(n)},is:tj(function(e){return{data:e,text:`Passed: is ${e.predicate??"assertion"}`}}),find:tj(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)}:tV(e)})},a8={is:tm(P.is,e=>{var t;return[(t=e).predicate,t.selector,..."text"===t.predicate?[t.value]:[]]}),find:e=>tf(P.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",...tN(e.timeoutMs)];case"fill":case"type":return[...t,e.action,e.value]}}(e),{...e,findFirst:e.first,findLast:e.last})};function a6(e){if(void 0===e||""===e)throw new S("INVALID_ARGS","find requires query");return e}let a9={get:{usageOverride:"get text|attrs <@ref|selector>",positionalArgs:["subcommand","target"],allowedFlags:[...r6]},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:[...r6]},click:{usageOverride:"click <x y|@ref|selector>",positionalArgs:["target"],allowsExtraPositionals:!0,allowedFlags:[...ne,"clickButton",...r6]},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:[...ne,...r6]},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:[...r6]},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:[...r6,"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:a7,...oe}=aQ,ot=tF(of("click"),(e,t)=>{var r;return e.interactions.click({...ti(r=t),...ta(r.target),...ts(r),...to(r),button:r.button})}),or=tF(of("press"),(e,t)=>{var r;return e.interactions.press({...ti(r=t),...ta(r.target),...ts(r),...to(r)})}),on=tF(of("fill"),(e,t)=>{var r;return e.interactions.fill({...ti(r=t),...ta(r.target),...ts(r),text:r.text,delayMs:r.delayMs})}),oi=tF(of("longpress"),(e,t)=>{var r;return e.interactions.longPress({...ti(r=t),...ta(r.target),...ts(r),durationMs:r.durationMs})}),oa=tF(of("swipe"),(e,t)=>e.interactions.swipe(t)),oo=tF(of("focus"),(e,t)=>e.interactions.focus(t)),os=tF(of("type"),(e,t)=>e.interactions.type(t)),ol=tF(of("scroll"),(e,t)=>e.interactions.scroll(t)),ou=tF(of("get"),(e,t)=>{var r;return e.interactions.get({...ti(r=t),...function(e){switch(e.kind){case"ref":return{ref:e.ref,label:e.label};case"selector":return{selector:e.selector}}}(r.target),...ts(r),format:r.format})}),oc=tF(of("is"),(e,t)=>e.interactions.is(t)),od=tF(of("find"),(e,t)=>e.interactions.find(t)),op=tF(of("gesture"),async(e,t)=>{var r,n,i,a,o,s;switch(t.kind){case"pan":return await e.interactions.pan({...ti(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({...ti(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({...ti(i=t),preset:i.preset,durationMs:i.durationMs});case"pinch":return await e.interactions.pinch({...ti(a=t),scale:a.scale,x:a.origin?.x,y:a.origin?.y});case"rotate":return await e.interactions.rotateGesture({...ti(o=t),degrees:o.degrees,x:o.origin?.x,y:o.origin?.y,velocity:o.velocity});case"transform":return await e.interactions.transformGesture({...ti(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})}}),om=tP({name:"interaction",clientSurface:!1,commands:[{name:"click",metadata:of("click"),definition:ot,cliSchema:a9.click,cliReader:(e,t)=>({...th(t),...ty(t),...tv(t),target:tw(a0(e)),button:t.clickButton}),daemonWriter:a5.click,cliOutputFormatter:a4.click},{name:"press",metadata:of("press"),definition:or,cliSchema:a9.press,cliReader:(e,t)=>({...th(t),...ty(t),...tv(t),target:tw(a0(e))}),daemonWriter:a5.press,cliOutputFormatter:a4.press},{name:"fill",metadata:of("fill"),definition:on,cliSchema:a9.fill,cliReader:(e,t)=>{let r=a1(e);return{...th(t),...ty(t),target:tw(r.target),text:r.text,delayMs:t.delayMs}},daemonWriter:a5.fill},{name:"longpress",metadata:of("longpress"),definition:oi,cliSchema:a9.longpress,cliReader:(e,t)=>{let r,n={...a0((r=function(e){if(tI(e[0])&&tI(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&&tI(t)?{target:e.slice(0,-1),durationMs:Number(t)}:{target:e}}(e)).target),...void 0!==r.durationMs?{durationMs:r.durationMs}:{}};return{...th(t),...ty(t),target:tw(n),durationMs:n.durationMs}},daemonWriter:a5.longpress},{name:"swipe",metadata:of("swipe"),definition:oa,cliSchema:a9.swipe,cliReader:(e,t)=>({...th(t),from:{x:Number(e[0]),y:Number(e[1])},to:{x:Number(e[2]),y:Number(e[3])},durationMs:tM(e[4]),count:t.count,pauseMs:t.pauseMs,pattern:t.pattern}),daemonWriter:a5.swipe},{name:"focus",metadata:of("focus"),definition:oo,cliSchema:a9.focus,cliReader:(e,t)=>({...th(t),x:Number(e[0]),y:Number(e[1])}),daemonWriter:a5.focus},{name:"type",metadata:of("type"),definition:os,cliSchema:a9.type,cliReader:(e,t)=>({...th(t),text:e.join(" "),delayMs:t.delayMs}),daemonWriter:a5.type},{name:"scroll",metadata:of("scroll"),definition:ol,cliSchema:a9.scroll,cliReader:(e,t)=>({...th(t),direction:function(e){if("up"===e||"down"===e||"left"===e||"right"===e||"top"===e||"bottom"===e)return e;throw new S("INVALID_ARGS",`Unknown direction: ${String(e)}`)}(e[0]),amount:tM(e[1]),pixels:t.pixels,durationMs:t.durationMs}),daemonWriter:a5.scroll},{name:"get",metadata:of("get"),definition:ou,cliSchema:a9.get,cliReader:(e,t)=>({...th(t),...ty(t),format:function(e){if("text"===e||"attrs"===e)return e;throw new S("INVALID_ARGS","get only supports text or attrs")}(e[0]),target:tw(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 S("INVALID_ARGS","get requires @ref or selector expression");return{selector:t}}(e.slice(1)))}),daemonWriter:a5.get,cliOutputFormatter:a4.get},{name:"is",metadata:of("is"),definition:oc,cliSchema:a9.is,cliReader:(e,t)=>(function(e,t){let r={...tb(t),...tg(t)},n=e[0],i=function(e,t={}){let r=$(e,t);if(!r)throw new S("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 S("INVALID_ARGS","is requires predicate: visible|hidden|exists|editable|selected|text")})(e,t),daemonWriter:a8.is,cliOutputFormatter:a4.is},{name:"find",metadata:of("find"),definition:od,cliSchema:a9.find,cliReader:(e,t)=>(function(e,t){var r;let n={...{depth:(r=t).snapshotDepth,raw:r.snapshotRaw},...tg(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:a6(o)};if("get"===l){let t=e[s+1];if("text"===t)return{...n,locator:i,query:a6(o),action:"getText"};if("attrs"===t)return{...n,locator:i,query:a6(o),action:"getAttrs"};throw new S("INVALID_ARGS","find get only supports text or attrs")}if("wait"===l)return{...n,locator:i,query:a6(o),action:"wait",timeoutMs:tM(e[s+1])};if("fill"===l||"type"===l)return{...n,locator:i,query:a6(o),action:l,value:e.slice(s+1).join(" ")};if("click"===l||"focus"===l||"exists"===l)return{...n,locator:i,query:a6(o),action:l};throw new S("INVALID_ARGS",`Unsupported find action: ${l}`)})(e,t),daemonWriter:a8.find,cliOutputFormatter:a4.find},{name:"gesture",metadata:of("gesture"),definition:op,cliSchema:a9.gesture,cliReader:function(e,t){let r=e[0],n=e.slice(1),i=th(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:tM(n[4])};case"fling":return{...i,kind:r,direction:n[0],origin:{x:Number(n[1]),y:Number(n[2])},distance:tM(n[3]),durationMs:tM(n[4])};case"swipe":return{...i,kind:r,preset:n[0],durationMs:tM(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:tM(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:tM(n[6])};default:throw new S("INVALID_ARGS","gesture requires pan, fling, swipe, pinch, rotate, or transform")}},daemonWriter:aQ.gesture,extraDaemonWriters:oe}]});function of(e){let t=aK.find(t=>t.name===e);if(!t)throw Error(`Missing interaction command metadata for ${e}`);return t}function oh(e){return tV(tT({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: ${rt(e)}`))}let og={boot:tj(function(e){let t=e.platform??"unknown",r=e.device??e.id??"unknown";return{data:e,text:`Boot ready: ${r} (${t})`}}),shutdown:tj(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:tj(function(e){return{data:{devices:e.map(re)},text:e.map(oy).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:tj(function(e){if("stateDir"in e)return{data:e,text:e.stateDir};let t={sessions:e.sessions.map(t7)};return{data:t,text:JSON.stringify(t,null,2)}}),open:tj(function(e){let t,r=(t=e.appName??e.appBundleId??e.session,tT({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?t9(e.device):{}},t?`Opened: ${t}`:"Opened")),n=[t_(r)].filter(e=>!!e);return"string"==typeof r.sessionStateDir&&n.push(`Session state: ${r.sessionStateDir}`),{data:r,text:n.join("\n")||null}}),close:tj(function(e){return tV({session:e.session,...e.shutdown?{shutdown:e.shutdown}:{},...tC(e.session?`Closed: ${e.session}`:"Closed")})}),install:tj(oh),reinstall:tj(oh),"install-from-source":tj(function(e){return tV(tT({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: ${rr(e)}`))}),prepare:tU,viewport:tU};function oy(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}`}let ob=nh("apps","List installed apps.",{appsFilter:eX(["user-installed","all"])}),ov=nh("open","Open an app, deep link, URL, or platform surface.",{app:eG("App name, bundle id, package, or URL."),url:eG("Optional URL passed with an app shell."),surface:eX(rF),activity:eG("Android activity name."),launchConsole:eG("Launch console mode."),launchArgs:eK("Launch arguments forwarded verbatim to the platform launch command."),relaunch:eH("Force relaunch."),saveScript:eJ({oneOf:[eV(),eU()]}),deviceHub:eH("Use Xcode Device Hub when surfacing Apple simulators."),noRecord:eH("Do not record this action.")}),ow=nh("close","Close an app or end the active session.",{app:eG("Optional app to close."),shutdown:eH("Shutdown the session/device where supported."),saveScript:eJ({oneOf:[eV(),eU()]})}),ox=tF(ob,(e,t)=>e.apps.list(t)),oS=tF(ov,(e,t)=>e.apps.open(t)),ok=tF(ow,(e,t)=>t.app?e.apps.close(t):e.sessions.close(function(e){let{app:t,...r}=e;return r}(t))),oA=tm(P.apps),o$=tm(P.open,function(e){return e.app?e.url?[e.app,e.url]:[e.app]:[]}),oD=tm(P.close,e=>tR(e.app)),oI={name:"apps",metadata:ob,definition:ox,cliSchema:{helpDescription:"List user-installed apps; use --all to include system/OEM apps",summary:"List installed apps",allowedFlags:["appsFilter"],defaults:{appsFilter:F}},cliReader:(e,t)=>({...th(t),appsFilter:C(t.appsFilter)}),daemonWriter:oA,cliOutputFormatter:og.apps},oM={name:"open",metadata:ov,definition:oS,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)=>({...th(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:o$,cliOutputFormatter:og.open},oR={name:"close",metadata:ow,definition:ok,cliSchema:{positionalArgs:["app?"],allowedFlags:["saveScript","shutdown"]},cliReader:(e,t)=>({...th(t),app:e[0],shutdown:t.shutdown,saveScript:t.saveScript}),daemonWriter:oD,cliOutputFormatter:og.close},oN=nh("devices","List available devices.",{}),oL=nh("boot","Boot or prepare a selected device without using CLI positional arguments.",{headless:eH("Boot without showing simulator UI when supported.")}),oO=nh("shutdown","Shutdown a selected simulator or emulator.",{}),oP=tF(oN,(e,t)=>e.devices.list(t)),oE=tF(oL,(e,t)=>e.devices.boot(t)),oF=tF(oO,(e,t)=>e.devices.shutdown(t)),oC=(e,t)=>th(t),oT=tm(P.devices),o_=tm(P.boot),oj=tm(P.shutdown),oU={name:"devices",metadata:oN,definition:oP,cliReader:oC,daemonWriter:oT,cliOutputFormatter:og.devices},oV={name:"boot",metadata:oL,definition:oE,cliSchema:{summary:"Boot target device/simulator",allowedFlags:["headless"]},cliReader:(e,t)=>({...th(t),headless:t.headless}),daemonWriter:o_,cliOutputFormatter:og.boot},oB={name:"shutdown",metadata:oO,definition:oF,cliSchema:{summary:"Shutdown target simulator/emulator"},cliReader:oC,daemonWriter:oj,cliOutputFormatter:og.shutdown};function oq(e,t){if(!e||"object"!=typeof e||Array.isArray(e))throw new S("INVALID_ARGS",`${t} installSource must be an object.`);if("github-actions-artifact"!==oW(e.type,`${t} installSource.type`))throw new S("INVALID_ARGS",`${t} installSource.type must be "github-actions-artifact".`);let{owner:r,repo:n}=oz(oW(e.repo,`${t} installSource.repo`),`${t} installSource.repo`);return oG(r,n,e.artifact,`${t} installSource.artifact`)}function oG(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 S("INVALID_ARGS",`${t} must be an integer.`);return r}(r,n)}:{kind:"github-actions-artifact",owner:e,repo:t,artifactName:oW(r,n)}}function oz(e,t){let r=e.indexOf("/");if(r<=0||r===e.length-1||-1!==e.indexOf("/",r+1))throw new S("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 S("INVALID_ARGS",`${t} must use owner/repo.`);return n}function oW(e,t){let r="string"==typeof e&&e.trim().length>0?e.trim():void 0;if(!r)throw new S("INVALID_ARGS",`${t} must be a non-empty string.`);return r}let oH=nh("install","Install an app binary.",{app:eq(eG()),appPath:eq(eG("Path to app binary."))}),oX=nh("reinstall","Reinstall an app binary.",{app:eq(eG()),appPath:eq(eG("Path to app binary."))}),oK=nh("install-from-source","Install an app from a structured source.",{source:eq(eJ(eB("Install source object."))),retainPaths:eH(),retentionMs:eW()}),oJ=tF(oH,(e,t)=>e.apps.install(t)),oY=tF(oX,(e,t)=>e.apps.reinstall(t)),oQ=tF(oK,(e,t)=>e.apps.installFromSource(t)),oZ=tm(P.install,e=>o4(e.app,e.appPath)),o0=tm(P.reinstall,e=>o4(e.app,e.appPath)),o1={name:"install",metadata:oH,definition:oJ,cliSchema:{positionalArgs:["app","path"]},cliReader:(e,t)=>o3(e,t,"install"),daemonWriter:oZ,cliOutputFormatter:og.install},o2={name:"reinstall",metadata:oX,definition:oY,cliSchema:{positionalArgs:["app","path"]},cliReader:(e,t)=>o3(e,t,"reinstall"),daemonWriter:o0,cliOutputFormatter:og.reinstall},o5={name:"install-from-source",metadata:oK,definition:oQ,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)=>({...th(t),source:function(e,t){let r=e[0]?.trim();if(e.length>1)throw new S("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 S("INVALID_ARGS",`${t} must use owner/repo:artifact, for example thymikee/RNCLI83:6635342232`);let{owner:n,repo:i}=oz(e.slice(0,r),t);return oG(n,i,e.slice(r+1),`${t} artifact`)}(t.githubActionsArtifact):void 0,i=t.installSource;if(1!=+!!r+ +!!n+ +!!i)throw new S("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 S("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 S("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 S("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=>tf(L.installSource,[],{...e,installSource:e.source,retainMaterializedPaths:e.retainPaths,materializedPathRetentionMs:e.retentionMs}),cliOutputFormatter:og["install-from-source"]};function o3(e,t,r){return{...th(t),app:tL(e[0],`${r} requires app`),appPath:tL(e[1],`${r} requires path`)}}function o4(e,t){return[tO(e,"missing first positional"),tO(t,"missing second positional")]}let o8=nh("prepare","Prepare platform helper infrastructure.",{action:eq(eX(["ios-runner"])),timeoutMs:eW("Maximum wall-clock time for the prepare command.")}),o6=tF(o8,(e,t)=>e.command.prepare(t)),o9={name:"prepare",metadata:o8,definition:o6,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, run clean:daemon after prepare to release the prepared runner lease. Runner build/start output is written to the session runner.log; daemon.log is for daemon lifecycle/startup issues.",summary:"Pre-warm platform helpers, especially the iOS/macOS XCTest runner before Apple automation",positionalArgs:["ios-runner"],allowedFlags:["timeoutMs"]},cliReader:(e,t)=>({...th(t),action:tL(e[0],"prepare requires subcommand"),timeoutMs:t.timeoutMs}),daemonWriter:tm(P.prepare,e=>[tO(e.action,"prepare requires subcommand")]),cliOutputFormatter:og.prepare},o7=nh("push","Deliver a push payload.",{app:eq(eG()),payload:eq(eJ({oneOf:[eU(),eB()]}))}),se=nh("trigger-app-event","Trigger an app-defined event.",{event:eq(eG()),payload:tu(eB(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=tF(o7,(e,t)=>e.apps.push(t)),sr=tF(se,(e,t)=>e.apps.triggerEvent(t)),sn=[{name:"push",metadata:o7,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)=>({...th(t),app:tL(e[0],"push requires bundleOrPackage"),payload:tL(e[1],"push requires payloadOrJson")}),daemonWriter:tm(P.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:sr,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)=>({...th(t),event:tL(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 S("INVALID_ARGS",`${t} must be a JSON object`)}(e[1],"trigger-app-event payload"):void 0}),daemonWriter:tm(P.triggerAppEvent,e=>{var t;return[(t=e).event,...t.payload?[JSON.stringify(t.payload)]:[]]})}],si=nh("session","List active sessions or print daemon state directory.",{action:eX(["list","state-dir"],"list shows active sessions; state-dir prints the resolved daemon state directory without contacting the daemon.")}),sa=tF(si,async(e,{action:t,...r})=>"state-dir"===t?{stateDir:await e.sessions.stateDir(r)}:{sessions:await e.sessions.list(r)}),so={name:"session",metadata:si,definition:sa,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)=>({...th(t),action:function(e){let t=e??"list";if("list"===t||"state-dir"===t)return t;throw new S("INVALID_ARGS","session only supports list or state-dir")}(e[0])}),cliOutputFormatter:og.session},ss=nh("viewport","Resize the active web viewport.",{width:eq(eW("Viewport width in CSS pixels.",{min:1})),height:eq(eW("Viewport height in CSS pixels.",{min:1}))}),sl=tF(ss,(e,t)=>e.command.viewport(t));function su(e,t){let r=void 0===e?NaN:Number(e);if(!Number.isInteger(r)||r<1)throw new S("INVALID_ARGS",`viewport ${t} must be a positive integer`);return r}let sc=tP({name:"management",commands:[oU,oV,oB,o9,oI,so,oM,oR,{name:"viewport",metadata:ss,definition:sl,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)=>({...th(t),width:su(e[0],"width"),height:su(e[1],"height")}),daemonWriter:tm(P.viewport,e=>{let{width:t,height:r}=e;return[String(t),String(r)]}),cliOutputFormatter:og.viewport},o1,o2,o5,...sn]}),sd="metro",sp=nh(sd,"Prepare Metro runtime or reload React Native apps.",{action:eq(eX(["prepare","reload"])),projectRoot:eG(),kind:eJ(eU()),publicBaseUrl:eG(),proxyBaseUrl:eG(),bearerToken:eG(),bridgeScope:eJ({type:"object",additionalProperties:!0}),launchUrl:eG(),port:eW(),listenHost:eG(),statusHost:eG(),startupTimeoutMs:eW(),probeTimeoutMs:eW(),reuseExisting:eH(),installDependenciesIfNeeded:eH(),runtimeFilePath:eG(),logPath:eG(),metroHost:eG(),metroPort:eW(),bundleUrl:eG(),timeoutMs:eW()}),sm=tF(sp,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})}),sf=tP({name:"metro",commands:[{name:sd,metadata:sp,definition:sm,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:[...r7,...r9]},cliReader:(e,t)=>{let r=(e[0]??"").toLowerCase();if("prepare"!==r&&"reload"!==r)throw new S("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 S("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 S("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)}}}]}),sh=["path","start","stop","doctor","mark","clear"],sg={logs:tj(function(e){var t;let r="string"==typeof e.path?e.path:"";return{data:e,text:r,stderr:sx([sv(e,["active","state","backend","sizeBytes"]),(t=e,["started","stopped","marked","cleared","restarted","removedRotatedFiles"].map(e=>{var r,n;return r=e,!0===(n=t[e])?`${r}=true`:"number"==typeof n?`${r}=${n}`:""}).filter(Boolean).join(" ")||void 0),"string"==typeof e.hint?e.hint:void 0,sw(e.notes)])}}),network:tj(function(e){let t=[],r="string"==typeof e.path?e.path:"";r&&t.push(r);let n=Array.isArray(e.entries)?e.entries:[];if(0===n.length)t.push("No recent HTTP(s) entries found.");else for(let e of n)t.push(...function(e){let t=tB(e)??{},r="string"==typeof t.method?t.method:"HTTP",n="string"==typeof t.url?t.url:"<unknown-url>",i="number"==typeof t.status?` status=${t.status}`:"",a="string"==typeof t.timestamp?`${t.timestamp} `:"",o="number"==typeof t.durationMs?` durationMs=${t.durationMs}`:"",s=[`${a}${r} ${n}${i}${o}`],l="string"==typeof t.headers;return sb(s,"headers",t.headers),l||(sy(s,"request headers",t.requestHeaders),sy(s,"response headers",t.responseHeaders)),sb(s,"request",t.requestBody),sb(s,"response",t.responseBody),s}(e));return{data:e,text:t.join("\n"),stderr:sx([sv(e,["active","state","backend","include","scannedLines","matchedLines"]),sw(e.notes)])}})};function sy(e,t,r){let n=tB(r);n&&0!==Object.keys(n).length&&e.push(` ${t}: ${JSON.stringify(n)}`)}function sb(e,t,r){"string"==typeof r&&e.push(` ${t}: ${r}`)}function sv(e,t){return t.map(t=>void 0!==e[t]&&null!==e[t]?`${t}=${e[t]}`:"").filter(Boolean).join(" ")||void 0}function sw(e){if(!Array.isArray(e))return;let t=e.filter(e=>"string"==typeof e&&e.length>0);return t.length>0?t.join("\n"):void 0}function sx(e){return e.filter(e=>!!e).join("\n")||void 0}let sS="logs",sk="network",sA=nh(sS,"Manage session app logs.",{action:eX(sh),message:eG(),restart:eH()}),s$=nh(sk,"Show recent HTTP traffic.",{action:eX(["dump","log"]),limit:eW(),include:eX(b)}),sD=tF(sA,(e,t)=>e.observability.logs(t)),sI=tF(s$,(e,t)=>e.observability.network(t)),sM=tm(sS,e=>{var t;return[(t=e).action??"path",...tR(t.message)]}),sR=tP({name:"observability",commands:[{name:sS,metadata:sA,definition:sD,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)=>({...th(t),action:function(e){if(void 0!==e)return rP(sh,e,{message:"logs requires path, start, stop, doctor, mark, or clear"})}(e[0]),message:e.slice(1).join(" ")||void 0,restart:t.restart}),daemonWriter:sM,cliOutputFormatter:sg.logs},{name:sk,metadata:s$,definition:sI,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)=>({...th(t),action:function(e){if(void 0!==e){if("dump"===e||"log"===e)return e;throw new S("INVALID_ARGS","network requires dump or log")}}(e[0]),limit:tM(e[1]),include:t.networkInclude??function(e){if(void 0!==e)return rP(b,e,{message:"network include must be summary, headers, body, or all"})}(e[2])}),daemonWriter:e=>{var t;return tf(sk,[...(t=e).action?[t.action]:[],...tN(t.limit)],{...e,networkInclude:e.include})},cliOutputFormatter:sg.network}]}),sN={perf:tj(function(e){return{data:e,text:function(e){var t,r,n,i;let a,o="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=sL((t=e).action),n=sL(t.kind),i=sL(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=sL(e.state))?` state=${t}`:""}${function(e){let t=sL(e.outPath);if(!t)return"";let r=sP(e.sizeBytes);return`
28
+ `}(a,{raw:r.raw,flatten:r.interactiveOnly,scoped:"string"==typeof r.scope&&r.scope.trim().length>0,depthLimited:"number"==typeof r.depth})}}},{name:n$,metadata:nD,definition:nI,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, 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"]},cliReader:(e,t)=>({...th(t),path:e[0]??t.out,...tW(t)}),daemonWriter:e=>tf(P.screenshot,tR(e.path),{...e,...tH(e)})},{name:nw,metadata:nx,definition:nS,cliSchema:nk,cliReader:(e,t)=>{if("snapshot"!==e[0])throw new S("INVALID_ARGS","Only diff snapshot is available through this parser.");return{...th(t),kind:"snapshot",out:t.out,interactiveOnly:t.snapshotInteractiveOnly,depth:t.snapshotDepth,scope:t.snapshotScope,raw:t.snapshotRaw}},daemonWriter:nA},{name:ir,metadata:ii,definition:ia,cliSchema:{usageOverride:"wait <ms>|text <text>|@ref|<selector> [timeoutMs]",positionalArgs:["durationOrSelector","timeoutMs?"],allowsExtraPositionals:!0,allowedFlags:[...r6]},cliReader:(e,t)=>(function(e,t){let r=ie(e);if(!r)throw new S("INVALID_ARGS","wait requires <ms>, text <text>, @ref, or <selector> [timeoutMs].");let n={...tg(t),...tb(t)};if("sleep"===r.kind)return{...n,durationMs:r.durationMs};if("text"===r.kind){if(!r.text)throw new S("INVALID_ARGS","wait requires text.");return{...n,text:r.text,...io(r.timeoutMs)}}return"ref"===r.kind?{...n,ref:r.rawRef,...io(r.timeoutMs)}:{...n,selector:r.selectorExpression,...io(r.timeoutMs)}})(e,t),daemonWriter:tm(P.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 S("INVALID_ARGS","wait command requires exactly one of durationMs, text, ref, or selector.");if(void 0!==e.durationMs)return[String(e.durationMs)];let t=tN(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(!D(r))throw new S("INVALID_ARGS",`Invalid wait selector: ${r}`);return[r,...t]})(e)),cliOutputFormatter:tU},{name:ng,metadata:ny,definition:nb,cliSchema:{usageOverride:"alert [get|accept|dismiss|wait] [timeout]",positionalArgs:["action?","timeout?"]},cliReader:(e,t)=>({...th(t),...function(e){if(e.length>2)throw new S("INVALID_ARGS","alert accepts at most action and timeout arguments.");return tl({action:function(e){let t=e?.toLowerCase();if(void 0===t||"get"===t||"accept"===t||"dismiss"===t||"wait"===t)return t;throw new S("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 S("INVALID_ARGS",`${t} must be a finite number.`)}(e[1],"alert timeout")})}(e)}),daemonWriter:nv,cliOutputFormatter:tU},{name:nW,metadata:nH,definition:nX,cliSchema:{usageOverride:nj,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=tg(t),n=e[0],i=e[1];if(tD(n,nJ)&&tD(i,nY))return{...r,setting:n,state:i};if("location"===n&&"set"===i)return{...r,setting:n,state:i,latitude:nq(e[2],"latitude"),longitude:nq(e[3],"longitude")};if("appearance"===n&&tD(i,nQ)||tD(n,nZ)&&tD(i,n0)||"fingerprint"===n&&tD(i,n1))return{...r,setting:n,state:i};if("permission"===n&&tD(i,n2))return{...r,setting:n,state:i,permission:function(e){if(tD(e,n5))return e;throw new S("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 S("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 S("INVALID_ARGS","Invalid settings arguments.")})(e,t),daemonWriter:nK}]}),il={debug:tj(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")}})},iu="debug",ic=nh(iu,"Symbolicate crash artifacts with matching debug symbols.",{action:eq(eX(["symbols"])),artifact:eq(eG("Apple crash artifact path (.ips, .crash, or .log).")),dsym:eG("Path to a matching .dSYM bundle."),searchPath:eG("Directory to scan for matching .dSYM bundles."),out:eG("Output path for the symbolicated artifact.")}),id=tF(ic,(e,t)=>e.debug.symbols(t)),ip=tP({name:"debugging",commands:[{name:iu,metadata:ic,definition:id,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)=>({...th(t),action:function(e){if("symbols"===e)return e;throw new S("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:il.debug}]});function im(e){return e?.clickButton??"primary"}function ih(e){return"primary"===e.button?null:"click"!==e.commandLabel?new S("INVALID_ARGS","--button is supported only for click"):"macos"!==e.platform&&"linux"!==e.platform?new S("UNSUPPORTED_OPERATION",`click --button ${e.button} is supported only on macOS and Linux`):"macos"===e.platform&&"middle"===e.button?new S("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 S("INVALID_ARGS",`click --button ${e.button} does not support repeat or gesture modifier flags`):null}function ig(e){return"primary"===e?{}:{button:e}}function iy(e,t="scroll accepts either a relative amount or --pixels, not both"){if(void 0!==e.amount&&void 0!==e.pixels)throw new S("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 S("INVALID_ARGS",i);if(e>n)throw new S("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 iw=["up","down","left","right"],ix=["left","right","left-edge","right-edge"],iS=["one-way","ping-pong"],ik=rE(ix,{message:"gesture swipe requires left, right, left-edge, or right-edge"}),iA=rE(iw,{message:e=>`Unknown direction: ${e}`});function i$(e){let t=e.direction,r="up"===t||"down"===t?e.referenceHeight:e.referenceWidth,n=iF(e.amount),i=void 0!==e.pixels?iC(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 iD(e){iF(e.amount),void 0!==e.pixels&&iC(e.pixels)}function iI(e){return{...i$({...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 iM(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=iL(t,i,o,{marginPx:n}),l=iL(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 iR(e){return ik.parse(e)}function iN(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)&&iE(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(iE);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 iL(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:iO(i,e,n.marginPx)}function iO(e,t,r){return{x:iT(e.x,r,t.referenceWidth),y:iT(e.y,r,t.referenceHeight)}}function iP(e){return iA.parse(e)}function iE(e){return!!e&&e.width>0&&e.height>0}function iF(e){if(void 0===e)return .6;if(!Number.isFinite(e)||e<=0)throw new S("INVALID_ARGS","scroll amount must be a positive number");return e}function iC(e){if(!Number.isFinite(e)||e<=0)throw new S("INVALID_ARGS","scroll pixels must be a positive integer");return Math.max(1,Math.round(e))}function iT(e,t,r){let n=Math.max(t,r-t);return i_(e,t,n)}function i_(e,t,r){return Math.min(Math.round(r),Math.max(Math.round(t),Math.round(e)))}function ij(e,t,r,n){if(!Number.isFinite(e)||!Number.isInteger(e)||e<r||e>n)throw new S("INVALID_ARGS",`${t} must be an integer between ${r} and ${n}`);return e}async function iU(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=eg(s),u=function(e,t,r,n){let i=new Map(e.map(e=>[e.index,e])),a=e.filter(e=>w(e)&&iX(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(w(r)&&iX(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(iz);if(e.length>0)return e.find(e=>iq(e,t.get(e.index),r))??e[0]??null}let l=a.filter(e=>iq(e,t.get(e.index),r)).sort(iW);return l.length>0?l[0]??null:a.filter(t=>eb(t,e)).sort(iW)[0]??a.sort(iW)[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:iq(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(iG)}:{canScroll:!1,emptySnapshot:!1,signature:c}}(e,t,r);if(n&&a.emptySnapshot)return await iU({edge:t,target:r,captureNodes:i});return a}catch(e){var a,o,s;throw a=t,o=n,s=e,o?new S("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 S("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 iV(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 S("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 iB(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 iq(e,t,r){return"bottom"===r?!0===e.hiddenContentBelow||t?.hiddenContentBelow===!0:!0===e.hiddenContentAbove||t?.hiddenContentAbove===!0}function iG(e){return e.length>0&&e.length<=80&&!/^(true|false)$/i.test(e)&&!/^\d+$/.test(e)&&!/^\d+%$/.test(e)}function iz(e,t){return iH(e.rect)-iH(t.rect)}function iW(e,t){return iH(t.rect)-iH(e.rect)}function iH(e){return e?e.width*e.height:0}function iX(e){return!!(e&&e.width>0&&e.height>0)}function iK(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}function iJ(e){return e.clock?.now()??Date.now()}async function iY(e,t){e.clock?await e.clock.sleep(t):await new Promise(e=>setTimeout(e,t))}function iQ(e){return e&&"object"==typeof e?e:void 0}let iZ=["x","y","width","height"];function i0(e){let t=i1(e);if(!t)return null;let r=f(t);return Number.isFinite(r.x)&&Number.isFinite(r.y)?r:null}function i1(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 i2(e,t){return!!e&&!!t&&iZ.every(r=>.5>=Math.abs(e[r]-t[r]))}function i5(e){return{x:i3(e.x,e.width),y:i3(e.y,e.height)}}function i3(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 i4=["tabbar","toolbar","navigationbar","bottomnavigation","bottomnavigationview","sheet","dialog","alert","popover","menu"],i8=["button","link","menuitem","tabitem","textfield","searchfield","edittext","checkbox","radio","switch","cell"];function i6(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!!ar(e.rect)&&(!!(!0===e.hittable||i7(e,i8))||!!(e.label?.trim()||e.value?.trim()||e.identifier?.trim()))}(i)||!function e(t,r,n){let i=ar(n.rect);if(!i)return null;let a=f(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||!(!(!ar((a=u).rect)||function(e){let t=ae(e);return t.includes("application")||t.includes("window")}(a))&&i7(a,i4))||at(o=n,s=u,l=t.byIndex)||at(s,o,l))return null;let c=ar(u.rect);return!c||i2(i,c)||e(t,r,u)?null:c}(t,r,n,i);return!!(o&&ep(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 i9(e){return void 0!==e.interactionBlocked}function i7(e,t){let r=ae(e);return t.some(e=>r.includes(e))}function ae(e){return[e.type,e.role,e.subrole].map(e=>p(e??"")).join(" ")}function at(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 ar(e){let t=i1(e);return t&&t.width>0&&t.height>0?t:null}let an=["button","link","menuitem","tabitem","textfield","searchfield","securetextfield","checkbox","radio","switch","cell"];function ai(e,t){return aa(e,t).node}function aa(e,t){var r;if(i9(t))return{node:t,reason:"covered"};let n=function(e,t){let r=i1(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||i9(e))return!1;let t=i1(e.rect);return!!t&&i2(t,r)});if(1!==t.length)break;n=t[0]}return n===t?null:n}(e,t);if(n?.rect&&i0(n.rect))return{node:n,reason:"same-rect-descendant"};if([(r=t).type,r.role,r.subrole].map(e=>p(e??"")).some(ao)&&t.rect&&i0(t.rect))return{node:t,reason:"semantic-target"};let i=a(e,t);return i?.rect&&!i9(i)&&i0(i.rect)?!function(e,t,r){var n,i;let a,o,s,l=i1(e.rect),u=i1(t.rect);if(!l||!u)return!1;let c=function(e,t){let r=f(t),n=e.filter(e=>{let t=(e.type??"").toLowerCase();return t.includes("application")||t.includes("window")}).map(e=>i1(e.rect)).filter(e=>null!==e);if(0===n.length)return null;let i=n.filter(e=>ep(e,r.x,r.y));return em(i.length>0?i:n)}(r,l);return!!c&&(a=v(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))&&!i2(l,u)}(t,i,e)?{node:i,reason:"hittable-ancestor"}:{node:t,reason:"overly-broad-ancestor"}:{node:t,reason:"original"}}function ao(e){return"tab"===e||an.some(t=>e.includes(t))}async function as(e,t,r){var n;return(await ah(e,t,r.action),"point"===t.target.kind)?{kind:"point",point:{x:(n=t.target).x,y:n.y}}:"ref"===t.target.kind?await al(e,t,t.target,r):await au(e,t,t.target,r)}async function al(e,t,r,n){let i=await ay(e,t,r),a=i.resolved,s=n.promoteToHittableAncestor?ad(i.snapshot.nodes,a.node,{action:n.action,label:`Ref ${r.ref}`}):a.node;return ap(s,`Ref ${r.ref}`,n.action),function(e,t,r,n){let i=e.rect?ev(e,t):null;if(!(!e.rect||!i||eb(e,t)))throw new S("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:av(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 au(e,t,r,n){let i=I(r.selector),a=await af(e,t,n.requireInteractive),l=s(ac(a.snapshot.nodes),i,{platform:e.backend.platform,requireRect:!0,requireUnique:!0,disambiguateAmbiguous:!0});if(l&&l.node.rect||!n.requireInteractive||(l=s(ac((a=await af(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&&i9(t.node))throw am({label:`Selector ${t.selector.raw}`,node:t.node,action:n.action,selector:t.selector.raw});throw new S("COMMAND_FAILED",d(i,l?.diagnostics??[],{unique:!0}))}let c=n.promoteToHittableAncestor?ad(a.snapshot.nodes,l.node,{action:n.action,label:`Selector ${l.selector.raw}`}):l.node;return ap(c,`Selector ${l.selector.raw}`,n.action),{kind:"selector",point:av(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 ac(e){return e.filter(e=>!i9(e))}function ad(e,t,r){let n=aa(e,t);if("covered"===n.reason)throw am({label:r.label,node:t,action:r.action});return n.node}function ap(e,t,r){if(i9(e))throw am({label:t,node:e,action:r})}function am(e){return new S("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 af(e,t,r){if(!e.backend.captureSnapshot)throw new S("UNSUPPORTED_OPERATION","snapshot is not supported by this backend");let n=t.session??"default",i=await e.sessions.get(n);if(!i)throw new S("SESSION_NOT_FOUND","No active session. Run open first.");let a=await e.backend.captureSnapshot(iK(e,t),{interactiveOnly:r,includeRects:!0}),o=a.snapshot??{nodes:a.nodes??[],truncated:a.truncated,backend:a.backend,createdAt:iJ(e)};return await e.sessions.set({...i,snapshot:o}),{snapshot:o}}async function ah(e,t,r){if("macos"!==e.backend.platform)return;let n=await ag(e,t);if(("desktop"===n||"menubar"===n)&&("menubar"!==n||"click"!==r&&"press"!==r))throw new S("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 ag(e,t){let r=await e.sessions.get(t.session??"default");return r?.metadata?.surface}async function ay(e,t,r){let n=t.session??"default",i=await e.sessions.get(n);if(!i)throw new S("SESSION_NOT_FOUND","No active session. Run open first.");if(!i.snapshot)throw new S("INVALID_ARGS","No snapshot in session. Run snapshot first.");let a=r.fallbackLabel??"",o=ab(i.snapshot.nodes,r.ref,{fallbackLabel:a});if(o)return{snapshot:i.snapshot,resolved:o};let s=await af(e,t,!0),l=ab(s.snapshot.nodes,r.ref,{fallbackLabel:a});if(!l)throw new S("COMMAND_FAILED",`Ref ${r.ref} not found or has no bounds`);return{...s,resolved:l}}function ab(e,t,r){let n=m(t);if(!n)throw new S("INVALID_ARGS",`Invalid ref: ${t}`);let i=g(e,n);if(aw(i))return{ref:n,node:i};let a=r.fallbackLabel.length>0?l(e,r.fallbackLabel):null;return aw(a)?{ref:n,node:a}:null}function av(e,t){let r=i0(e.rect);if(!r)throw new S("COMMAND_FAILED",t);return r}function aw(e){return!!e&&null!==i0(e.rect)}let ax=async(e,t)=>{let r=await as(e,t,{action:"focus",requireInteractive:!0,promoteToHittableAncestor:!1});if(!e.backend.focus)throw new S("UNSUPPORTED_OPERATION","focus is not supported by this backend");let n=aR(r),i=iQ(await e.backend.focus(iK(e,t),n));return{...r,...i?{backendResult:i}:{},...tC(`Focused (${n.x}, ${n.y})`)}},aS=async(e,t)=>{let r=await as(e,t,{action:"longPress",requireInteractive:!0,promoteToHittableAncestor:!0});if(!e.backend.longPress)throw new S("UNSUPPORTED_OPERATION","longPress is not supported by this backend");let n=void 0===t.durationMs?void 0:ij(t.durationMs,"durationMs",0,12e4),i=aR(r),a=iQ(await e.backend.longPress(iK(e,t),i,{durationMs:n}));return{...r,...void 0!==n?{durationMs:n}:{},...a?{backendResult:a}:{},...tC(`Long pressed (${i.x}, ${i.y})`)}},ak=async(e,t)=>{var r,n,i,a;let o;if(!e.backend.scroll)throw new S("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:aL(r,"scroll direction")},l=(n=t.amount,i="scroll amount",void 0===n?void 0:aP(n,i)),u=function(e,t){if(void 0!==e){if(!Number.isFinite(e)||!Number.isInteger(e)||e<=0)throw new S("INVALID_ARGS",`${t} must be a positive integer`);return e}}(t.pixels,"scroll pixels"),c=ib(t.durationMs);iy({amount:l,pixels:u},"scroll accepts either amount or pixels, not both");let d=await aI(e,t),p="viewport"===d.kind?{kind:"viewport"}:{kind:"point",point:aR(d)},m=e.backend.scroll,f=async()=>await m(iK(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 iV({edge:r,captureState:async i=>await aN(e,t,r,n,i),scroll:f});o=i.result,h=i.passes}else o=await f(),h=1;let g=iQ(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}:{},...tC(iB(s.direction,s.edge,h,l,u))}},aA=async(e,t)=>{if(!e.backend.swipe)throw new S("UNSUPPORTED_OPERATION","swipe is not supported by this backend");if(t.preset)return await a$(e,t,e.backend.swipe);let r=await aM(e,t),n=function(e,t){if(t.to)return{point:aO(t.to,"to")};let r=aL(t.direction,"swipe direction"),n=aP(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:ij(t.durationMs,"durationMs",16,1e4),a=iQ(await e.backend.swipe(iK(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}:{},...tC("Swiped")}};async function a$(e,t,r){let n;if(t.from||t.to||t.direction||void 0!==t.distance)throw new S("INVALID_ARGS","gesture swipe preset cannot be combined with from, to, direction, or distance");let i=iR(t.preset);await ah(e,t,"swipe");let a=iM(i,{referenceWidth:(n=aE((await af(e,t,!1)).snapshot.nodes)).width,referenceHeight:n.height},{platform:e.backend.platform}),o=void 0===t.durationMs?void 0:ij(t.durationMs,"durationMs",16,1e4),s={x:a.x1,y:a.y1},l={x:a.x2,y:a.y2},u=iQ(await r(iK(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}:{},...tC(`Swiped ${i}`)}}let aD=async(e,t)=>{if(!e.backend.pinch)throw new S("UNSUPPORTED_OPERATION","pinch is not supported by this backend");await ah(e,t,"pinch");let r=aP(t.scale,"pinch scale"),n=t.center?await as(e,{...t,target:t.center},{action:"pinch",requireInteractive:!1,promoteToHittableAncestor:!1}):void 0,i=iQ(await e.backend.pinch(iK(e,t),{scale:r,...n?{center:n.point}:{}}));return{kind:"pinch",scale:r,...n?{center:n.point,centerTarget:n}:{},...i?{backendResult:i}:{},...tC(`Pinched to scale ${r}`)}};async function aI(e,t){let r=t.target??{kind:"viewport"};return"viewport"===r.kind?(await ah(e,t,"scroll"),{kind:"viewport"}):await as(e,{...t,target:r},{action:"scroll",requireInteractive:!1,promoteToHittableAncestor:!1})}async function aM(e,t){if(t.from){var r;if("x"in(r=t.from)&&"y"in r)return await ah(e,t,"swipe"),{point:aO(t.from,"from")};let n=await as(e,{...t,target:t.from},{action:"swipe",requireInteractive:!1,promoteToHittableAncestor:!1});return{point:aR(n),target:n}}if(!t.direction)throw new S("INVALID_ARGS","swipe requires from+to or a direction");return await ah(e,t,"swipe"),{point:f(aE((await af(e,t,!1)).snapshot.nodes)),target:{kind:"viewport"}}}function aR(e){if(!e.point)throw new S("COMMAND_FAILED","Interaction target resolved without coordinates");return e.point}async function aN(e,t,r,n,i){if(!e.backend.captureSnapshot)throw new S("UNSUPPORTED_OPERATION",`scroll ${r} requires snapshot support to verify hidden content before scrolling`);let{captureSnapshot:a}=e.backend;return await iU({edge:r,target:n,scope:i,captureNodes:async r=>{let n=await a(iK(e,t),{scope:r});return n.snapshot?.nodes??n.nodes??[]}})}function aL(e,t){switch(e){case"up":case"down":case"left":case"right":return e;default:throw new S("INVALID_ARGS",`${t} must be up, down, left, or right`)}}function aO(e,t){let r=Number(e.x),n=Number(e.y);if(!Number.isFinite(r)||!Number.isFinite(n))throw new S("INVALID_ARGS",`${t} point requires finite x and y`);return{x:r,y:n}}function aP(e,t){if(!Number.isFinite(e)||e<=0)throw new S("INVALID_ARGS",`${t} must be a positive number`);return e}function aE(e){let t=e.filter(t=>eb(t,e)).map(e=>e.rect).filter(aF),r=t.length>0?t:e.map(e=>e.rect).filter(aF);if(0===r.length)throw new S("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 aF(e){return!!(e&&e.width>0&&e.height>0)}let aC={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."},aT={target:eq(eY()),button:eX(["primary","secondary","middle"],"Pointer button for platforms that support mouse buttons."),...eZ(),...e0()},a_={target:eq(eY()),...eZ(),...e0()},aj={target:eq(eY()),text:eq(eG("Text to enter into the target.")),delayMs:eW("Delay between typed characters.",{min:0}),...eZ()},aU={target:eq(eY()),durationMs:eW("Long press duration in milliseconds.",{min:0}),...eZ()},aV={from:eq(eQ("Swipe start point.")),to:eq(eQ("Swipe end point.")),durationMs:eW("Swipe duration in milliseconds.",{min:0}),count:eW("Number of swipe repetitions.",{min:1}),pauseMs:eW("Pause between repeated swipes.",{min:0}),pattern:eX(iS)},aB={x:eq(ez("X coordinate.")),y:eq(ez("Y coordinate."))},aq={text:eq(eG("Text to type.")),delayMs:eW("Delay between typed characters.",{min:0})},aG={direction:eq(eX(["up","down","left","right","top","bottom"])),amount:ez("Platform scroll amount."),pixels:eW("Pixel scroll amount.",{min:0}),durationMs:eW("Scroll duration in milliseconds when the backend supports pacing.",{min:0,max:1e4})},az={format:eq(eX(["text","attrs"])),target:eq(tu({oneOf:td(),description:"UI element target by snapshot ref or selector expression."},(e,t)=>{let r,n;return void 0===e[t]?void 0:"ref"===(n=tr(r=tp(e,t),"kind",["ref","selector"]))?{kind:n,ref:e8(r,"ref"),label:e6(r,"label")}:{kind:n,selector:e8(r,"selector")}})),...eZ()},aW={predicate:eq(eX(["visible","hidden","exists","editable","selected","text"])),selector:eq(eG()),value:eG(),...eZ()},aH={locator:eX(M),query:eq(eG()),action:eX(["click","focus","exists","getText","getAttrs","wait","fill","type"]),value:eG(),timeoutMs:eW(),first:eH(),last:eH(),depth:eW(),raw:eH()},aX={kind:eq(eX(O,"Gesture variant.")),direction:eX(iw,"Fling direction."),preset:eX(ix,"Swipe preset."),origin:eQ("Gesture origin point."),delta:eQ("Movement delta for pan or transform gestures."),distance:eW("Fling distance.",{min:0}),scale:ez("Pinch or transform scale."),degrees:ez("Rotation in degrees."),velocity:eW("Rotate gesture velocity.",{min:0}),durationMs:eW("Gesture duration in milliseconds.",{min:0})},aK=[{name:"click",description:aC.click,inputSchema:e1(aT),readInput:e=>e2(e,aT)},{name:"press",description:aC.press,inputSchema:e1(a_),readInput:e=>e2(e,a_)},{name:"fill",description:aC.fill,inputSchema:e1(aj),readInput:e=>e2(e,aj)},aJ("longpress",aU),aJ("swipe",aV),aJ("focus",aB),aJ("type",aq),aJ("scroll",aG),aJ("get",az),aJ("is",aW),aJ("find",aH),{name:"gesture",description:aC.gesture,inputSchema:e1(aX),readInput:function(e){let t=e5(e),r=e3(t),n=tr(t,"kind",O);return"pan"===n?{...r,kind:n,origin:e4(t,"origin"),delta:e4(t,"delta"),durationMs:te(t,"durationMs",{min:0})}:"fling"===n?{...r,kind:n,direction:tr(t,"direction",iw),origin:e4(t,"origin"),distance:te(t,"distance",{min:0}),durationMs:te(t,"durationMs",{min:0})}:"swipe"===n?{...r,kind:n,preset:tr(t,"preset",ix),durationMs:te(t,"durationMs",{min:0})}:"pinch"===n?{...r,kind:n,scale:e9(t,"scale"),origin:aY(t,"origin")}:"rotate"===n?{...r,kind:n,degrees:e9(t,"degrees"),origin:aY(t,"origin"),velocity:te(t,"velocity",{min:0})}:{...r,kind:n,origin:e4(t,"origin"),delta:e4(t,"delta"),scale:e9(t,"scale"),degrees:e9(t,"degrees"),durationMs:te(t,"durationMs",{min:0})}}}];function aJ(e,t){return nh(e,aC[e],t)}function aY(e,t){return void 0===e[t]?void 0:e4(e,t)}let aQ={gesture:tm(P.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),...tN(e.durationMs)];case"fling":return["fling",tO(e.direction,"gesture fling requires direction"),String(e.origin?.x),String(e.origin?.y),...tN(e.distance),...tN(e.durationMs)];case"swipe":return aZ(e);case"pinch":return["pinch",String(e.scale),...tN(e.origin?.x),...tN(e.origin?.y)];case"rotate":return["rotate",String(e.degrees),...tN(e.origin?.x),...tN(e.origin?.y),...tN(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),...tN(e.durationMs)];default:throw new S("INVALID_ARGS","gesture requires pan, fling, swipe, pinch, rotate, or transform")}}),"gesture-pan":tm(P.gesture,function(e){return["pan",String(e.x),String(e.y),String(e.dx),String(e.dy),...tN(e.durationMs)]}),"gesture-fling":tm(P.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),...tN(r),...tN(t.durationMs)]}),"gesture-swipe":tm(P.gesture,aZ),"gesture-pinch":tm(P.gesture,function(e){return["pinch",String(e.scale),...tN(e.x),...tN(e.y)]}),"gesture-rotate":tm(P.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 S("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,...tN(e.velocity)]})(e)),"gesture-transform":tm(P.gesture,function(e){return["transform",String(e.x),String(e.y),String(e.dx),String(e.dy),String(e.scale),String(e.degrees),...tN(e.durationMs)]})};function aZ(e){return["swipe",tO(e.preset,"gesture swipe requires preset"),...tN(e.durationMs)]}function a0(e){if(e[0]?.startsWith("@")){let t=a2(e.slice(1));return{ref:e[0],...void 0===t?{}:{label:t}}}let t=$(e);return t?{selector:t.selectorExpression}:{x:Number(e[0]),y:Number(e[1])}}function a1(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?a2(e.slice(1,2)):void 0},text:r}}let r=$(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 a2(e){return e.join(" ").trim()||void 0}let a5={click:e=>tf(P.click,tx(e),{...e,clickButton:e.button}),press:tm(P.press,e=>tx(e)),longpress:tm(P.longPress,e=>{var t;return[...tx(t=e),...tN(t.durationMs)]}),swipe:tm(P.swipe,function(e){return[String(e.from?.x),String(e.from?.y),String(e.to?.x),String(e.to?.y),...tN(e.durationMs)]}),focus:tm(P.focus,e=>[String(e.x),String(e.y)]),type:tm(P.type,e=>[e.text]),fill:tm(P.fill,e=>{var t;return[...tx(t=e),t.text]}),scroll:tm(P.scroll,e=>[tO(e.direction,"scroll requires direction"),...tN(e.amount)]),get:tm(P.get,e=>[tO(e.format,"get requires format"),...function(e){let t=tS(e);if("string"==typeof t.ref)return[t.ref,...tA(t.label)];if("string"==typeof t.selector)return[t.selector];throw new S("INVALID_ARGS","element command requires @ref or selector target")}(e)])};function a3(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})`}:tV(e)}let a4={click:tj(a3),press:tj(a3),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)}:tV(n)},is:tj(function(e){return{data:e,text:`Passed: is ${e.predicate??"assertion"}`}}),find:tj(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)}:tV(e)})},a8={is:tm(P.is,e=>{var t;return[(t=e).predicate,t.selector,..."text"===t.predicate?[t.value]:[]]}),find:e=>tf(P.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",...tN(e.timeoutMs)];case"fill":case"type":return[...t,e.action,e.value]}}(e),{...e,findFirst:e.first,findLast:e.last})};function a6(e){if(void 0===e||""===e)throw new S("INVALID_ARGS","find requires query");return e}let a9={get:{usageOverride:"get text|attrs <@ref|selector>",positionalArgs:["subcommand","target"],allowedFlags:[...r6]},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:[...r6]},click:{usageOverride:"click <x y|@ref|selector>",positionalArgs:["target"],allowsExtraPositionals:!0,allowedFlags:[...ne,"clickButton",...r6]},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:[...ne,...r6]},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:[...r6]},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:[...r6,"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:a7,...oe}=aQ,ot=tF(of("click"),(e,t)=>{var r;return e.interactions.click({...ti(r=t),...ta(r.target),...ts(r),...to(r),button:r.button})}),or=tF(of("press"),(e,t)=>{var r;return e.interactions.press({...ti(r=t),...ta(r.target),...ts(r),...to(r)})}),on=tF(of("fill"),(e,t)=>{var r;return e.interactions.fill({...ti(r=t),...ta(r.target),...ts(r),text:r.text,delayMs:r.delayMs})}),oi=tF(of("longpress"),(e,t)=>{var r;return e.interactions.longPress({...ti(r=t),...ta(r.target),...ts(r),durationMs:r.durationMs})}),oa=tF(of("swipe"),(e,t)=>e.interactions.swipe(t)),oo=tF(of("focus"),(e,t)=>e.interactions.focus(t)),os=tF(of("type"),(e,t)=>e.interactions.type(t)),ol=tF(of("scroll"),(e,t)=>e.interactions.scroll(t)),ou=tF(of("get"),(e,t)=>{var r;return e.interactions.get({...ti(r=t),...function(e){switch(e.kind){case"ref":return{ref:e.ref,label:e.label};case"selector":return{selector:e.selector}}}(r.target),...ts(r),format:r.format})}),oc=tF(of("is"),(e,t)=>e.interactions.is(t)),od=tF(of("find"),(e,t)=>e.interactions.find(t)),op=tF(of("gesture"),async(e,t)=>{var r,n,i,a,o,s;switch(t.kind){case"pan":return await e.interactions.pan({...ti(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({...ti(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({...ti(i=t),preset:i.preset,durationMs:i.durationMs});case"pinch":return await e.interactions.pinch({...ti(a=t),scale:a.scale,x:a.origin?.x,y:a.origin?.y});case"rotate":return await e.interactions.rotateGesture({...ti(o=t),degrees:o.degrees,x:o.origin?.x,y:o.origin?.y,velocity:o.velocity});case"transform":return await e.interactions.transformGesture({...ti(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})}}),om=tP({name:"interaction",clientSurface:!1,commands:[{name:"click",metadata:of("click"),definition:ot,cliSchema:a9.click,cliReader:(e,t)=>({...th(t),...ty(t),...tv(t),target:tw(a0(e)),button:t.clickButton}),daemonWriter:a5.click,cliOutputFormatter:a4.click},{name:"press",metadata:of("press"),definition:or,cliSchema:a9.press,cliReader:(e,t)=>({...th(t),...ty(t),...tv(t),target:tw(a0(e))}),daemonWriter:a5.press,cliOutputFormatter:a4.press},{name:"fill",metadata:of("fill"),definition:on,cliSchema:a9.fill,cliReader:(e,t)=>{let r=a1(e);return{...th(t),...ty(t),target:tw(r.target),text:r.text,delayMs:t.delayMs}},daemonWriter:a5.fill},{name:"longpress",metadata:of("longpress"),definition:oi,cliSchema:a9.longpress,cliReader:(e,t)=>{let r,n={...a0((r=function(e){if(tI(e[0])&&tI(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&&tI(t)?{target:e.slice(0,-1),durationMs:Number(t)}:{target:e}}(e)).target),...void 0!==r.durationMs?{durationMs:r.durationMs}:{}};return{...th(t),...ty(t),target:tw(n),durationMs:n.durationMs}},daemonWriter:a5.longpress},{name:"swipe",metadata:of("swipe"),definition:oa,cliSchema:a9.swipe,cliReader:(e,t)=>({...th(t),from:{x:Number(e[0]),y:Number(e[1])},to:{x:Number(e[2]),y:Number(e[3])},durationMs:tM(e[4]),count:t.count,pauseMs:t.pauseMs,pattern:t.pattern}),daemonWriter:a5.swipe},{name:"focus",metadata:of("focus"),definition:oo,cliSchema:a9.focus,cliReader:(e,t)=>({...th(t),x:Number(e[0]),y:Number(e[1])}),daemonWriter:a5.focus},{name:"type",metadata:of("type"),definition:os,cliSchema:a9.type,cliReader:(e,t)=>({...th(t),text:e.join(" "),delayMs:t.delayMs}),daemonWriter:a5.type},{name:"scroll",metadata:of("scroll"),definition:ol,cliSchema:a9.scroll,cliReader:(e,t)=>({...th(t),direction:function(e){if("up"===e||"down"===e||"left"===e||"right"===e||"top"===e||"bottom"===e)return e;throw new S("INVALID_ARGS",`Unknown direction: ${String(e)}`)}(e[0]),amount:tM(e[1]),pixels:t.pixels,durationMs:t.durationMs}),daemonWriter:a5.scroll},{name:"get",metadata:of("get"),definition:ou,cliSchema:a9.get,cliReader:(e,t)=>({...th(t),...ty(t),format:function(e){if("text"===e||"attrs"===e)return e;throw new S("INVALID_ARGS","get only supports text or attrs")}(e[0]),target:tw(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 S("INVALID_ARGS","get requires @ref or selector expression");return{selector:t}}(e.slice(1)))}),daemonWriter:a5.get,cliOutputFormatter:a4.get},{name:"is",metadata:of("is"),definition:oc,cliSchema:a9.is,cliReader:(e,t)=>(function(e,t){let r={...tb(t),...tg(t)},n=e[0],i=function(e,t={}){let r=$(e,t);if(!r)throw new S("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 S("INVALID_ARGS","is requires predicate: visible|hidden|exists|editable|selected|text")})(e,t),daemonWriter:a8.is,cliOutputFormatter:a4.is},{name:"find",metadata:of("find"),definition:od,cliSchema:a9.find,cliReader:(e,t)=>(function(e,t){var r;let n={...{depth:(r=t).snapshotDepth,raw:r.snapshotRaw},...tg(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:a6(o)};if("get"===l){let t=e[s+1];if("text"===t)return{...n,locator:i,query:a6(o),action:"getText"};if("attrs"===t)return{...n,locator:i,query:a6(o),action:"getAttrs"};throw new S("INVALID_ARGS","find get only supports text or attrs")}if("wait"===l)return{...n,locator:i,query:a6(o),action:"wait",timeoutMs:tM(e[s+1])};if("fill"===l||"type"===l)return{...n,locator:i,query:a6(o),action:l,value:e.slice(s+1).join(" ")};if("click"===l||"focus"===l||"exists"===l)return{...n,locator:i,query:a6(o),action:l};throw new S("INVALID_ARGS",`Unsupported find action: ${l}`)})(e,t),daemonWriter:a8.find,cliOutputFormatter:a4.find},{name:"gesture",metadata:of("gesture"),definition:op,cliSchema:a9.gesture,cliReader:function(e,t){let r=e[0],n=e.slice(1),i=th(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:tM(n[4])};case"fling":return{...i,kind:r,direction:n[0],origin:{x:Number(n[1]),y:Number(n[2])},distance:tM(n[3]),durationMs:tM(n[4])};case"swipe":return{...i,kind:r,preset:n[0],durationMs:tM(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:tM(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:tM(n[6])};default:throw new S("INVALID_ARGS","gesture requires pan, fling, swipe, pinch, rotate, or transform")}},daemonWriter:aQ.gesture,extraDaemonWriters:oe}]});function of(e){let t=aK.find(t=>t.name===e);if(!t)throw Error(`Missing interaction command metadata for ${e}`);return t}function oh(e){return tV(tT({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: ${rt(e)}`))}let og={boot:tj(function(e){let t=e.platform??"unknown",r=e.device??e.id??"unknown";return{data:e,text:`Boot ready: ${r} (${t})`}}),shutdown:tj(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:tj(function(e){return{data:{devices:e.map(re)},text:e.map(oy).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:tj(function(e){if("stateDir"in e)return{data:e,text:e.stateDir};let t={sessions:e.sessions.map(t7)};return{data:t,text:JSON.stringify(t,null,2)}}),open:tj(function(e){let t,r=(t=e.appName??e.appBundleId??e.session,tT({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?t9(e.device):{}},t?`Opened: ${t}`:"Opened")),n=[t_(r)].filter(e=>!!e);return"string"==typeof r.sessionStateDir&&n.push(`Session state: ${r.sessionStateDir}`),{data:r,text:n.join("\n")||null}}),close:tj(function(e){return tV({session:e.session,...e.shutdown?{shutdown:e.shutdown}:{},...tC(e.session?`Closed: ${e.session}`:"Closed")})}),install:tj(oh),reinstall:tj(oh),"install-from-source":tj(function(e){return tV(tT({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: ${rr(e)}`))}),prepare:tU,viewport:tU};function oy(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}`}let ob=nh("apps","List installed apps.",{appsFilter:eX(["user-installed","all"])}),ov=nh("open","Open an app, deep link, URL, or platform surface.",{app:eG("App name, bundle id, package, or URL."),url:eG("Optional URL passed with an app shell."),surface:eX(rF),activity:eG("Android activity name."),launchConsole:eG("Launch console mode."),launchArgs:eK("Launch arguments forwarded verbatim to the platform launch command."),relaunch:eH("Force relaunch."),saveScript:eJ({oneOf:[eV(),eU()]}),deviceHub:eH("Use Xcode Device Hub when surfacing Apple simulators."),noRecord:eH("Do not record this action.")}),ow=nh("close","Close an app or end the active session.",{app:eG("Optional app to close."),shutdown:eH("Shutdown the session/device where supported."),saveScript:eJ({oneOf:[eV(),eU()]})}),ox=tF(ob,(e,t)=>e.apps.list(t)),oS=tF(ov,(e,t)=>e.apps.open(t)),ok=tF(ow,(e,t)=>t.app?e.apps.close(t):e.sessions.close(function(e){let{app:t,...r}=e;return r}(t))),oA=tm(P.apps),o$=tm(P.open,function(e){return e.app?e.url?[e.app,e.url]:[e.app]:[]}),oD=tm(P.close,e=>tR(e.app)),oI={name:"apps",metadata:ob,definition:ox,cliSchema:{helpDescription:"List user-installed apps; use --all to include system/OEM apps",summary:"List installed apps",allowedFlags:["appsFilter"],defaults:{appsFilter:F}},cliReader:(e,t)=>({...th(t),appsFilter:C(t.appsFilter)}),daemonWriter:oA,cliOutputFormatter:og.apps},oM={name:"open",metadata:ov,definition:oS,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)=>({...th(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:o$,cliOutputFormatter:og.open},oR={name:"close",metadata:ow,definition:ok,cliSchema:{positionalArgs:["app?"],allowedFlags:["saveScript","shutdown"]},cliReader:(e,t)=>({...th(t),app:e[0],shutdown:t.shutdown,saveScript:t.saveScript}),daemonWriter:oD,cliOutputFormatter:og.close},oN=nh("devices","List available devices.",{}),oL=nh("boot","Boot or prepare a selected device without using CLI positional arguments.",{headless:eH("Boot without showing simulator UI when supported.")}),oO=nh("shutdown","Shutdown a selected simulator or emulator.",{}),oP=tF(oN,(e,t)=>e.devices.list(t)),oE=tF(oL,(e,t)=>e.devices.boot(t)),oF=tF(oO,(e,t)=>e.devices.shutdown(t)),oC=(e,t)=>th(t),oT=tm(P.devices),o_=tm(P.boot),oj=tm(P.shutdown),oU={name:"devices",metadata:oN,definition:oP,cliReader:oC,daemonWriter:oT,cliOutputFormatter:og.devices},oV={name:"boot",metadata:oL,definition:oE,cliSchema:{summary:"Boot target device/simulator",allowedFlags:["headless"]},cliReader:(e,t)=>({...th(t),headless:t.headless}),daemonWriter:o_,cliOutputFormatter:og.boot},oB={name:"shutdown",metadata:oO,definition:oF,cliSchema:{summary:"Shutdown target simulator/emulator"},cliReader:oC,daemonWriter:oj,cliOutputFormatter:og.shutdown};function oq(e,t){if(!e||"object"!=typeof e||Array.isArray(e))throw new S("INVALID_ARGS",`${t} installSource must be an object.`);if("github-actions-artifact"!==oW(e.type,`${t} installSource.type`))throw new S("INVALID_ARGS",`${t} installSource.type must be "github-actions-artifact".`);let{owner:r,repo:n}=oz(oW(e.repo,`${t} installSource.repo`),`${t} installSource.repo`);return oG(r,n,e.artifact,`${t} installSource.artifact`)}function oG(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 S("INVALID_ARGS",`${t} must be an integer.`);return r}(r,n)}:{kind:"github-actions-artifact",owner:e,repo:t,artifactName:oW(r,n)}}function oz(e,t){let r=e.indexOf("/");if(r<=0||r===e.length-1||-1!==e.indexOf("/",r+1))throw new S("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 S("INVALID_ARGS",`${t} must use owner/repo.`);return n}function oW(e,t){let r="string"==typeof e&&e.trim().length>0?e.trim():void 0;if(!r)throw new S("INVALID_ARGS",`${t} must be a non-empty string.`);return r}let oH=nh("install","Install an app binary.",{app:eq(eG()),appPath:eq(eG("Path to app binary."))}),oX=nh("reinstall","Reinstall an app binary.",{app:eq(eG()),appPath:eq(eG("Path to app binary."))}),oK=nh("install-from-source","Install an app from a structured source.",{source:eq(eJ(eB("Install source object."))),retainPaths:eH(),retentionMs:eW()}),oJ=tF(oH,(e,t)=>e.apps.install(t)),oY=tF(oX,(e,t)=>e.apps.reinstall(t)),oQ=tF(oK,(e,t)=>e.apps.installFromSource(t)),oZ=tm(P.install,e=>o4(e.app,e.appPath)),o0=tm(P.reinstall,e=>o4(e.app,e.appPath)),o1={name:"install",metadata:oH,definition:oJ,cliSchema:{positionalArgs:["app","path"]},cliReader:(e,t)=>o3(e,t,"install"),daemonWriter:oZ,cliOutputFormatter:og.install},o2={name:"reinstall",metadata:oX,definition:oY,cliSchema:{positionalArgs:["app","path"]},cliReader:(e,t)=>o3(e,t,"reinstall"),daemonWriter:o0,cliOutputFormatter:og.reinstall},o5={name:"install-from-source",metadata:oK,definition:oQ,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)=>({...th(t),source:function(e,t){let r=e[0]?.trim();if(e.length>1)throw new S("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 S("INVALID_ARGS",`${t} must use owner/repo:artifact, for example thymikee/RNCLI83:6635342232`);let{owner:n,repo:i}=oz(e.slice(0,r),t);return oG(n,i,e.slice(r+1),`${t} artifact`)}(t.githubActionsArtifact):void 0,i=t.installSource;if(1!=+!!r+ +!!n+ +!!i)throw new S("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 S("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 S("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 S("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=>tf(L.installSource,[],{...e,installSource:e.source,retainMaterializedPaths:e.retainPaths,materializedPathRetentionMs:e.retentionMs}),cliOutputFormatter:og["install-from-source"]};function o3(e,t,r){return{...th(t),app:tL(e[0],`${r} requires app`),appPath:tL(e[1],`${r} requires path`)}}function o4(e,t){return[tO(e,"missing first positional"),tO(t,"missing second positional")]}let o8=nh("prepare","Prepare platform helper infrastructure.",{action:eq(eX(["ios-runner"])),timeoutMs:eW("Maximum wall-clock time for the prepare command.")}),o6=tF(o8,(e,t)=>e.command.prepare(t)),o9={name:"prepare",metadata:o8,definition:o6,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, run clean:daemon after prepare to release the prepared runner lease. It is not a recovery step for "runner already owned by another agent-device daemon"; stop or clean 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)=>({...th(t),action:tL(e[0],"prepare requires subcommand"),timeoutMs:t.timeoutMs}),daemonWriter:tm(P.prepare,e=>[tO(e.action,"prepare requires subcommand")]),cliOutputFormatter:og.prepare},o7=nh("push","Deliver a push payload.",{app:eq(eG()),payload:eq(eJ({oneOf:[eU(),eB()]}))}),se=nh("trigger-app-event","Trigger an app-defined event.",{event:eq(eG()),payload:tu(eB(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=tF(o7,(e,t)=>e.apps.push(t)),sr=tF(se,(e,t)=>e.apps.triggerEvent(t)),sn=[{name:"push",metadata:o7,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)=>({...th(t),app:tL(e[0],"push requires bundleOrPackage"),payload:tL(e[1],"push requires payloadOrJson")}),daemonWriter:tm(P.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:sr,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)=>({...th(t),event:tL(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 S("INVALID_ARGS",`${t} must be a JSON object`)}(e[1],"trigger-app-event payload"):void 0}),daemonWriter:tm(P.triggerAppEvent,e=>{var t;return[(t=e).event,...t.payload?[JSON.stringify(t.payload)]:[]]})}],si=nh("session","List active sessions or print daemon state directory.",{action:eX(["list","state-dir"],"list shows active sessions; state-dir prints the resolved daemon state directory without contacting the daemon.")}),sa=tF(si,async(e,{action:t,...r})=>"state-dir"===t?{stateDir:await e.sessions.stateDir(r)}:{sessions:await e.sessions.list(r)}),so={name:"session",metadata:si,definition:sa,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)=>({...th(t),action:function(e){let t=e??"list";if("list"===t||"state-dir"===t)return t;throw new S("INVALID_ARGS","session only supports list or state-dir")}(e[0])}),cliOutputFormatter:og.session},ss=nh("viewport","Resize the active web viewport.",{width:eq(eW("Viewport width in CSS pixels.",{min:1})),height:eq(eW("Viewport height in CSS pixels.",{min:1}))}),sl=tF(ss,(e,t)=>e.command.viewport(t));function su(e,t){let r=void 0===e?NaN:Number(e);if(!Number.isInteger(r)||r<1)throw new S("INVALID_ARGS",`viewport ${t} must be a positive integer`);return r}let sc=tP({name:"management",commands:[oU,oV,oB,o9,oI,so,oM,oR,{name:"viewport",metadata:ss,definition:sl,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)=>({...th(t),width:su(e[0],"width"),height:su(e[1],"height")}),daemonWriter:tm(P.viewport,e=>{let{width:t,height:r}=e;return[String(t),String(r)]}),cliOutputFormatter:og.viewport},o1,o2,o5,...sn]}),sd="metro",sp=nh(sd,"Prepare Metro runtime or reload React Native apps.",{action:eq(eX(["prepare","reload"])),projectRoot:eG(),kind:eJ(eU()),publicBaseUrl:eG(),proxyBaseUrl:eG(),bearerToken:eG(),bridgeScope:eJ({type:"object",additionalProperties:!0}),launchUrl:eG(),port:eW(),listenHost:eG(),statusHost:eG(),startupTimeoutMs:eW(),probeTimeoutMs:eW(),reuseExisting:eH(),installDependenciesIfNeeded:eH(),runtimeFilePath:eG(),logPath:eG(),metroHost:eG(),metroPort:eW(),bundleUrl:eG(),timeoutMs:eW()}),sm=tF(sp,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})}),sf=tP({name:"metro",commands:[{name:sd,metadata:sp,definition:sm,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:[...r7,...r9]},cliReader:(e,t)=>{let r=(e[0]??"").toLowerCase();if("prepare"!==r&&"reload"!==r)throw new S("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 S("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 S("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)}}}]}),sh=["path","start","stop","doctor","mark","clear"],sg={logs:tj(function(e){var t;let r="string"==typeof e.path?e.path:"";return{data:e,text:r,stderr:sx([sv(e,["active","state","backend","sizeBytes"]),(t=e,["started","stopped","marked","cleared","restarted","removedRotatedFiles"].map(e=>{var r,n;return r=e,!0===(n=t[e])?`${r}=true`:"number"==typeof n?`${r}=${n}`:""}).filter(Boolean).join(" ")||void 0),"string"==typeof e.hint?e.hint:void 0,sw(e.notes)])}}),network:tj(function(e){let t=[],r="string"==typeof e.path?e.path:"";r&&t.push(r);let n=Array.isArray(e.entries)?e.entries:[];if(0===n.length)t.push("No recent HTTP(s) entries found.");else for(let e of n)t.push(...function(e){let t=tB(e)??{},r="string"==typeof t.method?t.method:"HTTP",n="string"==typeof t.url?t.url:"<unknown-url>",i="number"==typeof t.status?` status=${t.status}`:"",a="string"==typeof t.timestamp?`${t.timestamp} `:"",o="number"==typeof t.durationMs?` durationMs=${t.durationMs}`:"",s=[`${a}${r} ${n}${i}${o}`],l="string"==typeof t.headers;return sb(s,"headers",t.headers),l||(sy(s,"request headers",t.requestHeaders),sy(s,"response headers",t.responseHeaders)),sb(s,"request",t.requestBody),sb(s,"response",t.responseBody),s}(e));return{data:e,text:t.join("\n"),stderr:sx([sv(e,["active","state","backend","include","scannedLines","matchedLines"]),sw(e.notes)])}})};function sy(e,t,r){let n=tB(r);n&&0!==Object.keys(n).length&&e.push(` ${t}: ${JSON.stringify(n)}`)}function sb(e,t,r){"string"==typeof r&&e.push(` ${t}: ${r}`)}function sv(e,t){return t.map(t=>void 0!==e[t]&&null!==e[t]?`${t}=${e[t]}`:"").filter(Boolean).join(" ")||void 0}function sw(e){if(!Array.isArray(e))return;let t=e.filter(e=>"string"==typeof e&&e.length>0);return t.length>0?t.join("\n"):void 0}function sx(e){return e.filter(e=>!!e).join("\n")||void 0}let sS="logs",sk="network",sA=nh(sS,"Manage session app logs.",{action:eX(sh),message:eG(),restart:eH()}),s$=nh(sk,"Show recent HTTP traffic.",{action:eX(["dump","log"]),limit:eW(),include:eX(b)}),sD=tF(sA,(e,t)=>e.observability.logs(t)),sI=tF(s$,(e,t)=>e.observability.network(t)),sM=tm(sS,e=>{var t;return[(t=e).action??"path",...tR(t.message)]}),sR=tP({name:"observability",commands:[{name:sS,metadata:sA,definition:sD,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)=>({...th(t),action:function(e){if(void 0!==e)return rP(sh,e,{message:"logs requires path, start, stop, doctor, mark, or clear"})}(e[0]),message:e.slice(1).join(" ")||void 0,restart:t.restart}),daemonWriter:sM,cliOutputFormatter:sg.logs},{name:sk,metadata:s$,definition:sI,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)=>({...th(t),action:function(e){if(void 0!==e){if("dump"===e||"log"===e)return e;throw new S("INVALID_ARGS","network requires dump or log")}}(e[0]),limit:tM(e[1]),include:t.networkInclude??function(e){if(void 0!==e)return rP(b,e,{message:"network include must be summary, headers, body, or all"})}(e[2])}),daemonWriter:e=>{var t;return tf(sk,[...(t=e).action?[t.action]:[],...tN(t.limit)],{...e,networkInclude:e.include})},cliOutputFormatter:sg.network}]}),sN={perf:tj(function(e){return{data:e,text:function(e){var t,r,n,i;let a,o="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=sL((t=e).action),n=sL(t.kind),i=sL(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=sL(e.state))?` state=${t}`:""}${function(e){let t=sL(e.outPath);if(!t)return"";let r=sP(e.sizeBytes);return`
29
29
  ${t}${void 0!==r?` (${sC(r)})`:""}`}(e)}${function(e){let t=tB(e.summary),r=tB(t?.frameHealth);if(!r||!0!==r.available)return"";let n=sP(r.droppedFramePercent),i=sP(r.droppedFrameCount),a=sP(r.totalFrameCount);return void 0===n||void 0===i||void 0===a?"":`
30
30
  Trace frame health: dropped ${sE(n)} (${Math.round(i)}/${Math.round(a)} frames)`}(e)}`}}(t);if(o)return o;let s=tB(e.artifact);if(s)return 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=sP(e.sizeBytes),i=void 0===n?"":` (${sC(n)})`;return r?`Memory artifact (${t}): ${r}${i}`:`Memory artifact (${t}): captured${i}`}(s);let l=tB(e.metrics),u=tB(l?.fps),c=(r=l,(a=[function(e){if(e?.available!==!0)return;let t=sP(e.usagePercent);return void 0!==t?`CPU ${sE(t)}`:void 0}(tB(r?.cpu)),function(e){let t;if(e?.available!==!0)return;let r=sP(e.residentMemoryKb)??sP(e.totalPssKb)??sP(e.totalRssKb);return void 0!==r?`memory ${t=r/1024,`${t>=10?Math.round(t):t.toFixed(1)}MB`}`:void 0}(tB(r?.memory))].filter(e=>!!e)).length>0?a.join(", "):void 0);if(!u)return sO(c,"missing frame metric");if(!1===u.available){return sO(c,"string"==typeof(n=u).reason&&n.reason.length>0?n.reason:"not available")}let d=function(e){let t=sP(e.droppedFramePercent),r=sP(e.droppedFrameCount);if(void 0!==t&&void 0!==r){var n,i,a;return[`dropped ${sE(t)}`,(n=r,void 0!==(i=sP(e.totalFrameCount))?`(${Math.round(n)}/${Math.round(i)} frames)`:`(${Math.round(n)} dropped frames)`),void 0!==(a=sP(e.sampleWindowMs))?`window ${sF(a)}`:""].filter(Boolean).join(" ")}}(u);if(!d)return sO(c,"missing dropped-frame summary");let p=[`Frame health: ${d}`],m=(Array.isArray(i=u.worstWindows)?i.filter(tq):[]).flatMap(e=>{let t=function(e){let t=sP(e.startOffsetMs),r=sP(e.endOffsetMs),n=sP(e.missedDeadlineFrameCount);if(void 0===t||void 0===r||void 0===n)return;let i=sP(e.worstFrameMs),a=void 0===i?"":`, worst ${sF(i)}`;return`- +${sF(t)}-+${sF(r)}: ${Math.round(n)} missed-deadline frames${a}`}(e);return t?[t]:[]});return m.length>0&&p.push("Worst windows:",...m),p.join("\n")}(e)}})};function sL(e){return"string"==typeof e?e:void 0}function sO(e,t){return e?`Performance: ${e}`:`Frame health: unavailable - ${t}`}function sP(e){return"number"==typeof e&&Number.isFinite(e)?e:void 0}function sE(e){return`${Number.isInteger(e)?e:e.toFixed(1)}%`}function sF(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 sC(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 sT="perf",s_=nh(sT,"Show session performance, frame health, and memory diagnostics.",{area:eX(r_),subject:eX(rU),action:eX(rj),kind:eX(rV),template:eG("xctrace template name, for example Time Profiler."),out:eG("Output artifact path."),tracePath:eG("Existing .trace path to report, defaults to the latest session trace.")}),sj=tF(s_,(e,t)=>e.observability.perf(t)),sU=tm(sT,e=>{var t;let r;return"cpu"===(r=(t=e).area??(t.action?"metrics":void 0))?sB([...tR(r),...tR(t.subject),...tR(t.action),...tR(t.kind)],t):"trace"===r?sB([...tR(r),...tR(t.action),...tR(t.kind)],t):[...tR(r),...tR(t.action)]}),sV=tP({name:"perf",commands:[{name:sT,metadata:s_,definition:sj,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{...th(t),...function(e,t={}){if(void 0!==e[0]&&void 0===e[1]){let r=sq(e[0],{allowUndefined:!0});if(r)return{action:r,kind:sG(t.kind),out:t.out}}let r=function(e){if(void 0===e)return;let t=e.toLowerCase();if(rQ(t))return t;throw new S("INVALID_ARGS",rH)}(e[0]);return"cpu"===r?{area:r,subject:function(e){let t=e?.toLowerCase();if(void 0!==t&&r0(t))return t;throw new S("INVALID_ARGS",rK)}(e[1]),action:sq(e[2]),kind:sG(t.kind),template:t.template,out:t.out}:"trace"===r?{area:r,action:sq(e[1]),kind:sG(t.kind),template:t.template,out:t.out}:{area:r,action:sq(e[1]),kind:sG(t.kind),out:t.out}}(e,{kind:"string"==typeof(r=t.kind)?sG(r):void 0,template:t.perfTemplate,out:t.out})}},daemonWriter:sU,cliOutputFormatter:sN.perf}]});function sB(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 sq(e,t={}){if(void 0===e)return;let r=e.toLowerCase();if(rZ(r))return r;if(!t.allowUndefined)throw new S("INVALID_ARGS",rX)}function sG(e){if(void 0===e)return;let t=e.toLowerCase();if(r1(t))return t;throw new S("INVALID_ARGS",rJ)}let sz=/\b(logbox|redbox|reload js|copy stack|component stack|call stack|runtime error|open debugger to view warnings)\b/,sW=/\b(redbox|runtime error|reload js|copy stack|component stack|call stack)\b/,sH=[/\b[\w.$<>/-]+\.(?:tsx?|jsx?):\d+(?::\d+)?\b/,/\b[\w.$<>/-]+\.(?:tsx?|jsx?)\s+\(\d+:\d+\)/],sX=[/^!,\s+/,/^(warn|warning|error):\s+/,/\b(?:possible\s+)?unhandled (?:promise )?rejection\b/],sK=["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"],sJ=new Set(["x","\xd7","✕","✖","⨯"]);function sY(e){if(sZ(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 sQ(e){return sZ(e)}function sZ(e){var t,r,n,i,a,o,s,l,u,c;let d,p,m,h,g,y,b,v,w=(d=(t=e).map(s5).join("\n").toLowerCase(),p=ln(t,s6),m=ln(t,s7),h=ln(t,s4,le),g=ln(t,s8),y=(r=d,sH.some(e=>e.test(r))),b=s3(d),v=(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:h,redBox:(o=d,s=y,l=v,sW.test(o)||s3(o)||s&&l),detected:(u={text:d,hasReactNativeStackFrame:y,hasOverlayControl:v,hasControllessRedBoxText:b,collapsedNodes:h,openDebuggerWarningNodes:g}).collapsedNodes.length>0||u.openDebuggerWarningNodes.length>0||u.hasControllessRedBoxText||u.hasOverlayControl&&(c=u.text,sz.test(c)||u.hasReactNativeStackFrame)}),x=w.detected?function(e){let t=la(e.dismissNodes,li);if(t){let e;var r,n=t,i=(r=t,(e=ls(r)?.trim().toLowerCase())&&s9(e)?"dismiss":"close");if(!n.rect)throw Error("React Native overlay target node must have rect");return{action:i,point:f(n.rect),rect:n.rect,ref:n.ref,label:ls(n)}}let a=la(e.collapsedNodes.filter(lt),lo);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:ls(a)}:null}(w):null;return{detected:w.detected,redBox:w.redBox,dismissNodes:w.dismissNodes,minimizeNodes:w.minimizeNodes,collapsedNodes:w.collapsedNodes,primaryAction:x}}function s0(e){return[...e.dismissNodes,...e.minimizeNodes,...e.collapsedNodes]}function s1(e){var t;return s4(e.label?.trim())&&!!(t=e.rect)&&t.x<=1&&t.y<=1&&t.width>=300&&t.height>=600}function s2(e,t){let r=e.label?.trim();return!!r&&!!s1(e)&&t.some(e=>e.label?.trim()===r&&lr(e))}function s5(e){return[e.label,e.value,e.identifier,e.type,e.role].filter(Boolean).join(" ")}function s3(e){return/\buncaught\b/.test(e)&&/unable to download asset/.test(e)}function s4(e){let t=e?.trim().toLowerCase();return!!t&&(sK.some(e=>t.includes(e))||sX.some(e=>e.test(t)))}function s8(e){return e.includes("open debugger to view warnings")||/^!,\s+open debugger\b/.test(e)}function s6(e){var t,r;return s9(e)||(t=e,/^close(?:\s*\([^)]*\))?$/i.test(t))||(r=e,sJ.has(r))}function s9(e){return/^dismiss(?:\s*\([^)]*\))?$/i.test(e)}function s7(e){return/^minimi[sz]e(?:\b|\s|\()/i.test(e)}function le(e){return!e.rect||e.rect.height<=180}function lt(e){let t=ls(e)?.trim().toLowerCase()??"";return(s8(t)||/^!,\s+/.test(t))&&lr(e)}function lr(e){return!!e.rect&&e.rect.width>=120&&e.rect.height>=36&&e.rect.height<=180}function ln(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 li(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 la(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 lo(e){return[+(!0===e.hittable),e.rect?.width??0,e.rect?.y??0]}function ls(e){return e.label??e.value??e.identifier}let ll="react-native",lu=nh(ll,"Run supported React Native app automation helpers.",{action:eq(eX(["dismiss-overlay"]))}),lc=tF(lu,(e,t)=>e.command.reactNative(t)),ld=tm(ll,e=>[tO(e.action,"react-native requires action")]),lp=tP({name:"react-native",commands:[{name:ll,metadata:lu,definition:lc,cliSchema:{usageOverride:"react-native dismiss-overlay",listUsageOverride:"react-native dismiss-overlay",positionalArgs:["dismiss-overlay"]},cliReader:(e,t)=>({...th(t),action:function(e){if("dismiss-overlay"===e)return e;throw new S("INVALID_ARGS","react-native supports only: dismiss-overlay")}(e[0])}),daemonWriter:ld}]}),lm=["medium","high"];function lf(e){var t;let r;if(lm.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 lh={record:tj(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")}})},lg="record",ly="trace",lb=["start","stop"],lv=nh(lg,"Start or stop screen recording.",{action:eq(eX(lb)),path:eG(),fps:eW(),maxSize:eW(),quality:eX(lm),hideTouches:eH()}),lw=nh(ly,"Start or stop trace capture.",{action:eq(eX(lb)),path:eG()}),lx=tF(lv,(e,t)=>e.recording.record(t)),lS=tF(lw,(e,t)=>e.recording.trace(t)),lk=tm(lg,e=>lD(e)),lA=tm(ly,e=>lD(e)),l$=tP({name:"recording",commands:[{name:lg,metadata:lv,definition:lx,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)=>({...th(t),action:lI(e[0],lg),path:e[1],fps:t.fps,maxSize:t.screenshotMaxSize,quality:t.quality,hideTouches:t.hideTouches}),daemonWriter:lk,cliOutputFormatter:lh.record},{name:ly,metadata:lw,definition:lS,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)=>({...th(t),action:lI(e[0],ly),path:e[1]}),daemonWriter:lA}]});function lD(e){return[e.action,...tR(e.path)]}function lI(e,t){if("start"===e||"stop"===e)return e;throw new S("INVALID_ARGS",`${t} requires start|stop`)}let lM="replay",lR="test",lN="Replay a recorded session.",lL=nh(lM,lN,{path:eq(eG()),update:eH(),backend:eG(),maestro:eH(),env:eK()}),lO=nh(lR,"Run one or more replay scripts.",{paths:eq(eK()),update:eH(),backend:eG(),maestro:eH(),env:eK(),failFast:eH(),timeoutMs:eW(),retries:eW(),recordVideo:eH(),artifactsDir:eG(),reportJunit:eG(),shardAll:eW(),shardSplit:eW()}),lP=tF(lL,(e,t)=>e.replay.run(t)),lE=tF(lO,(e,t)=>e.replay.test(t)),lF=tP({name:"replay",commands:[{name:lM,metadata:lL,definition:lP,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:lN,positionalArgs:["path"],allowsExtraPositionals:!0,allowedFlags:["replayMaestro","replayExportFormat",...nt,"timeoutMs","out"]},cliReader:(e,t)=>({...th(t),path:tL(e[0],"replay requires path"),update:t.replayUpdate,backend:t.replayMaestro?"maestro":void 0,env:t.replayEnv}),daemonWriter:e=>tf(lM,[tO(e.path,"replay requires path")],{...e,replayUpdate:e.update,replayBackend:lC(e),replayEnv:e.env,replayShellEnv:lT(process.env)})},{name:lR,metadata:lO,definition:lE,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",...nt,"failFast","timeoutMs","retries","recordVideo","artifactsDir","reportJunit","shardAll","shardSplit"]},cliReader:(e,t)=>({...th(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,reportJunit:t.reportJunit,shardAll:t.shardAll,shardSplit:t.shardSplit}),daemonWriter:e=>tf(lR,e.paths??[],{...e,replayUpdate:e.update,replayBackend:lC(e),replayEnv:e.env,replayShellEnv:lT(process.env)})}]});function lC(e){return e.backend??(!0===e.maestro?"maestro":void 0)}function lT(e){let t={};for(let[r,n]of Object.entries(e))"string"==typeof n&&r.startsWith("AD_VAR_")&&(t[r]=n);return t}function l_(e){if(void 0===e)throw new S("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 S("INVALID_ARGS",`Invalid rotation: ${e}. Use portrait|portrait-upside-down|landscape-left|landscape-right.`)}}let lj={appstate:tj(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:tU,home:tU,rotate:tU,"app-switcher":tU,keyboard:tj(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 tV(e)}),clipboard:tj(function(e){return"read"===e.action?{data:e,text:e.text}:tV(e)})},lU="appstate",lV="back",lB="home",lq="rotate",lG="app-switcher",lz="keyboard",lW="clipboard",lH=nh(lU,"Show foreground app or activity.",{}),lX=nh(lV,"Navigate back.",{mode:eX(["in-app","system"])}),lK=nh(lB,"Go to the home screen.",{}),lJ=nh(lq,"Rotate device orientation.",{orientation:eq(eX(["portrait","portrait-upside-down","landscape-left","landscape-right"]))}),lY=nh(lG,"Open the app switcher.",{}),lQ=nh(lz,"Inspect or dismiss the keyboard.",{action:eX(["status","dismiss"])}),lZ=nh(lW,"Read or write clipboard text.",{action:eq(eX(["read","write"])),text:eG()}),l0=tF(lH,(e,t)=>e.command.appState(t)),l1=tF(lX,(e,t)=>e.command.back(t)),l2=tF(lK,(e,t)=>e.command.home(t)),l5=tF(lJ,(e,t)=>e.command.rotate(t)),l3=tF(lY,(e,t)=>e.command.appSwitcher(t)),l4=tF(lQ,(e,t)=>e.command.keyboard(t)),l8=tF(lZ,(e,t)=>e.command.clipboard(t)),l6=tm(lU),l9=tm(lB),l7=tm(lq,e=>[tO(e.orientation,"rotate requires orientation")]),ue=tm(lG),ut=tm(lz,e=>tR(e.action)),ur=tm(lW,e=>{var t;return"read"===(t=e).action?["read"]:["write",t.text]}),un=[om,sc,is,tP({name:"system",commands:[{name:lU,metadata:lH,definition:l0,cliSchema:{helpDescription:"Show foreground app/activity"},cliReader:(e,t)=>th(t),daemonWriter:l6,cliOutputFormatter:lj.appstate},{name:lV,metadata:lX,definition:l1,cliSchema:{usageOverride:"back [--in-app|--system]",allowedFlags:["backMode"]},cliReader:(e,t)=>({...th(t),mode:t.backMode}),daemonWriter:e=>{var t;return tf(lV,[],{...e,backMode:"in-app"===(t=e.mode)||"system"===t?t:void 0})},cliOutputFormatter:lj.back},{name:lB,metadata:lK,definition:l2,cliReader:(e,t)=>th(t),daemonWriter:l9,cliOutputFormatter:lj.home},{name:lq,metadata:lJ,definition:l5,cliSchema:{usageOverride:"rotate <portrait|portrait-upside-down|landscape-left|landscape-right>",helpDescription:"Rotate device orientation on iOS and Android",positionalArgs:["orientation"]},cliReader:(e,t)=>({...th(t),orientation:l_(e[0])}),daemonWriter:l7,cliOutputFormatter:lj.rotate},{name:lG,metadata:lY,definition:l3,cliReader:(e,t)=>th(t),daemonWriter:ue,cliOutputFormatter:lj["app-switcher"]},{name:lz,metadata:lQ,definition:l4,cliSchema:{usageOverride:"keyboard [status|get|dismiss|enter|return]",helpDescription:"Inspect Android keyboard visibility/type or press/dismiss the device keyboard. For iOS toolbar Done dismissal, focus the field by id/ref first, then run keyboard dismiss; do not manually press Done unless keyboard dismiss reports unsupported.",summary:"Inspect, press, or dismiss the device keyboard",positionalArgs:["action?"]},cliReader:(e,t)=>({...th(t),...function(e){if(e.length>1)throw new S("INVALID_ARGS","keyboard accepts at most one action argument.");return tl({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 S("INVALID_ARGS","keyboard action must be status, get, dismiss, enter, or return.")}(e[0])})}(e)}),daemonWriter:ut,cliOutputFormatter:lj.keyboard},{name:lW,metadata:lZ,definition:l8,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)=>({...th(t),...function(e){let t=e[0]?.toLowerCase();if("read"!==t&&"write"!==t)throw new S("INVALID_ARGS","clipboard requires a subcommand: read or write.");if("read"===t){if(1!==e.length)throw new S("INVALID_ARGS","clipboard read does not accept additional arguments.");return{action:t}}if(e.length<2)throw new S("INVALID_ARGS","clipboard write requires text.");return{action:t,text:e.slice(1).join(" ")}}(e)}),daemonWriter:ur,cliOutputFormatter:lj.clipboard}]}),lp,lF,sR,sV,ip,l$,sf,nf];function ui(){return un.flatMap(e=>[...e.definitions])}function ua(){return uu("cliSchemas")}function uo(){return uu("cliReaders")}function us(){return uu("daemonWriters")}function ul(){return uu("cliOutputFormatters")}function uu(e){let t={};for(let r of un){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 uc=un.flatMap(e=>[...e.metadata]),ud=new Map(uc.map(e=>[e.name,e]));function up(){return[...uc]}function um(){return E().map(e=>{let t=uh(e);if(!t)throw Error(`Missing command metadata for MCP-exposed command: ${e}`);return t})}function uf(e){return ud.has(e)}function uh(e){return ud.get(e)}export{nn as COMMON_COMMAND_SUPPORTED_FLAG_KEYS,ni as GLOBAL_FLAG_KEYS,sh as LOG_ACTION_VALUES,r5 as MAESTRO_COMPAT_TRACKER_URL,r3 as MAESTRO_NEW_ISSUE_URL,r9 as METRO_PREPARE_FLAGS,rX as PERF_ACTION_ERROR_MESSAGE,rH as PERF_AREA_ERROR_MESSAGE,rJ as PERF_KIND_ERROR_MESSAGE,rY as PERF_MEMORY_KIND_ERROR_MESSAGE,rK as PERF_SUBJECT_ERROR_MESSAGE,lm as RECORDING_EXPORT_QUALITIES,tz as SCREENSHOT_ACTION_FLAG_KEYS,iw as SCROLL_DIRECTIONS,nU as SETTINGS_INVALID_ARGS_MESSAGE,iS as SWIPE_PATTERNS,sZ as analyzeReactNativeOverlay,i6 as annotateCoveredSnapshotNodes,tX as appendScreenshotScriptFlags,i2 as areRectsApproximatelyEqual,iy as assertExclusiveScrollDistanceInputs,iD as assertScrollGestureInput,rN as buildMeta,eh as buildMobileSnapshotPresentation,nu as buildRequestFlags,i$ as buildScrollGesturePlan,ea as buildSnapshotDisplayLines,iI as buildSwipeGesturePlan,iM as buildSwipePresetGesturePlan,ig as buttonTag,iU as captureScrollEdgeState,iO as clampGesturePoint,i_ as clampToRange,eF as colorize,nd as createBatchDaemonWriter,eg as deriveMobileSnapshotHiddenContentHints,sQ as detectReactNativeOverlay,es as displayLabel,uh as findCommandMetadata,ax as focusCommand,sY as formatReactNativeOverlayWarning,el as formatRole,eI as formatScreenshotDiffText,iB as formatScrollEdgeMessage,eD as formatSnapshotDiffText,eo as formatSnapshotLine,ih as getClickButtonValidationError,no as getFlagDefinition,ns as getFlagDefinitions,nB as getUnsupportedMacOsSettingMessage,iv as honoredScrollDurationMs,iN as inferGestureReferenceFrame,en as inferVerticalScrollIndicatorDirections,uf as isCommandName,nV as isMacOsSettingSupported,eb as isNodeVisibleInEffectiveViewport,rZ as isPerfAction,rQ as isPerfArea,r1 as isPerfKind,r2 as isPerfMemoryKind,r0 as isPerfSubject,s1 as isReactNativeCollapsedWarningWrapperCandidate,s2 as isReactNativeCollapsedWarningWrapperWithVisibleBanner,i9 as isSnapshotNodeInteractionBlocked,t1 as isSparseSnapshotQualityVerdict,rO as isStringMember,er as isSystemScrollIndicatorLabel,ul as listCommandFamilyCliOutputFormatters,uo as listCommandFamilyCliReaders,ua as listCommandFamilyCliSchemas,us as listCommandFamilyDaemonWriters,ui as listCommandFamilyDefinitions,up as listCommandMetadata,um as listMcpCommandMetadata,aS as longPressCommand,rb as normalizeDeployResult,rx as normalizeDevice,rv as normalizeInstallFromSourceResult,rw as normalizeMaterializationReleaseResult,rD as normalizeOpenDevice,r$ as normalizeRuntimeHints,ib as normalizeScrollDurationMs,rS as normalizeSession,B as normalizeSnapshotTree,rI as normalizeStartupSample,iJ as now,l_ as parseDeviceRotation,oq as parseInstallSourceConfig,iP as parseScrollDirection,rT as parseSessionSurface,rP as parseStringMember,iR as parseSwipePreset,n7 as parseTimeout,ie as parseWaitPositionals,rg as parsing_stripUndefined,aD as pinchCommand,iL as pointFromPercent,i5 as pointInsideRect,eA as printHumanError,ek as printJson,t3 as publicSnapshotCaptureAnnotations,t_ as readCommandMessage,a1 as readFillTargetFromPositionals,nq as readLocationCoordinate,nc as readMetadataCommandFlags,ra as readOptionalString,s0 as readReactNativeOverlayActionNodes,ri as readRequiredString,rR as readScreenshotOverlayRefs,tK as readScreenshotScriptFlag,t4 as readSerializedSnapshotCaptureAnnotations,rM as readSnapshotNodes,t0 as readSnapshotQualityVerdict,lf as recordingQualityInputToExportQuality,t2 as renderSnapshotQualityWarnings,ij as requireIntInRange,nG as requireLocationCoordinates,ai as resolveActionableTouchNode,aa as resolveActionableTouchResolution,im as resolveClickButton,rt as resolveDeployResultTarget,rr as resolveInstallFromSourceResultTarget,as as resolveInteractionTarget,i0 as resolveRectCenter,rL as resolveSessionName,iV as runScrollEdgePasses,tH as screenshotFlagsFromOptions,tW as screenshotOptionsFromFlags,ak as scrollCommand,iY as sleep,t5 as snapshotCaptureAnnotationsFrom,ry as splitNonEmptyTrimmedLines,tC as successText,eE as supportsColor,aA as swipeCommand,iK as toBackendContext,iQ as toBackendResult,tT as withSuccessText};
package/dist/src/9581.js CHANGED
@@ -1,4 +1,4 @@
1
- import{COMMON_COMMAND_SUPPORTED_FLAG_KEYS as e,listCommandFamilyCliSchemas as t,METRO_PREPARE_FLAGS as o,listCommandMetadata as a}from"./2948.js";let n={auth:{usageOverride:"auth status|login|logout",listUsageOverride:"auth",helpDescription:"Manage cloud login state used by remote daemon and cloud device workflows.",summary:"Manage cloud login state used by remote daemon and cloud device workflows",positionalArgs:["status|login|logout"],supportedFlags:["remoteConfig","stateDir"]},connect:{usageOverride:"connect [--remote-config <path>] [--daemon-base-url <url>] [--tenant <id>] [--run-id <id>] [--lease-id <id>] [--lease-backend <backend>] [--force] [--no-login]",helpDescription:"Connect to a remote daemon, authenticate when needed, and save remote session state. AGENT_DEVICE_CLOUD_BASE_URL is the bridge/control-plane API origin; use AGENT_DEVICE_DAEMON_AUTH_TOKEN=adc_live_... for CI/service-token automation.",listUsageOverride:"connect",summary:"Attach CLI commands to a saved remote daemon/cloud lease; inspect for remote runs, tenants, or service-token CI",allowedFlags:["remoteConfig","daemonBaseUrl","tenant","runId","leaseId","leaseBackend","force","noLogin"],supportedFlags:["stateDir","daemonAuthToken","session","platform",...o,"launchUrl"]},connection:{usageOverride:"connection status",listUsageOverride:"connection",helpDescription:"Inspect active remote connection state",summary:"Inspect the active saved remote connection before assuming commands are local",positionalArgs:["status"],supportedFlags:["remoteConfig","stateDir","session"]},disconnect:{helpDescription:"Disconnect remote daemon state, stop owned Metro companion, and release lease",listUsageOverride:"disconnect",summary:"Clear remote connection state, stop owned Metro companions, and release remote leases",allowedFlags:["shutdown"],supportedFlags:["remoteConfig","stateDir","session"]},mcp:{helpDescription:"Start the official stdio MCP server. It exposes structured command tools backed by the agent-device client.",summary:"Start MCP server"},proxy:{usageOverride:"proxy [--host <host>] [--port <port>] [--daemon-auth-token <token>] [--state-dir <path>]",listUsageOverride:"proxy",helpDescription:`Expose the local daemon HTTP contract through a tunnel-friendly reverse proxy.
1
+ import{COMMON_COMMAND_SUPPORTED_FLAG_KEYS as e,listCommandFamilyCliSchemas as t,METRO_PREPARE_FLAGS as o,listCommandMetadata as a}from"./2948.js";let s={cdp:{usageOverride:"cdp [...args]",listUsageOverride:"cdp",helpDescription:"Run CDP commands for React Native diagnostics, JS heap usage, heap snapshots, and leak analysis",summary:"Inspect React Native CDP targets, JS heap growth, heap snapshots, retainers, and leak signals",positionalArgs:["args?"],allowsExtraPositionals:!0,supportedFlags:e},auth:{usageOverride:"auth status|login|logout",listUsageOverride:"auth",helpDescription:"Manage cloud login state used by remote daemon and cloud device workflows.",summary:"Manage cloud login state used by remote daemon and cloud device workflows",positionalArgs:["status|login|logout"],supportedFlags:["remoteConfig","stateDir"]},connect:{usageOverride:"connect [--remote-config <path>] [--daemon-base-url <url>] [--tenant <id>] [--run-id <id>] [--lease-id <id>] [--lease-backend <backend>] [--force] [--no-login]",helpDescription:"Connect to a remote daemon, authenticate when needed, and save remote session state. AGENT_DEVICE_CLOUD_BASE_URL is the bridge/control-plane API origin; use AGENT_DEVICE_DAEMON_AUTH_TOKEN=adc_live_... for CI/service-token automation.",listUsageOverride:"connect",summary:"Attach CLI commands to a saved remote daemon/cloud lease; inspect for remote runs, tenants, or service-token CI",allowedFlags:["remoteConfig","daemonBaseUrl","tenant","runId","leaseId","leaseBackend","force","noLogin"],supportedFlags:["stateDir","daemonAuthToken","session","platform",...o,"launchUrl"]},connection:{usageOverride:"connection status",listUsageOverride:"connection",helpDescription:"Inspect active remote connection state",summary:"Inspect the active saved remote connection before assuming commands are local",positionalArgs:["status"],supportedFlags:["remoteConfig","stateDir","session"]},disconnect:{helpDescription:"Disconnect remote daemon state, stop owned Metro companion, and release lease",listUsageOverride:"disconnect",summary:"Clear remote connection state, stop owned Metro companions, and release remote leases",allowedFlags:["shutdown"],supportedFlags:["remoteConfig","stateDir","session"]},mcp:{helpDescription:"Start the official stdio MCP server. It exposes structured command tools backed by the agent-device client.",summary:"Start MCP server"},proxy:{usageOverride:"proxy [--host <host>] [--port <port>] [--daemon-auth-token <token>] [--state-dir <path>]",listUsageOverride:"proxy",helpDescription:`Expose the local daemon HTTP contract through a tunnel-friendly reverse proxy.
2
2
 
3
3
  Run this on the host that has access to simulators/devices, then point another machine at the printed daemon base URL with --daemon-base-url or AGENT_DEVICE_DAEMON_BASE_URL.
4
4
 
@@ -19,4 +19,4 @@ First-run flow:
19
19
 
20
20
  Runtime web commands do not install the backend implicitly. If the managed backend is missing, run agent-device web setup. The backend is resolved only from the managed install in the effective agent-device state dir.
21
21
 
22
- Use web setup to install or reuse the pinned backend. Use web doctor after setup to verify browser backend health.`,summary:"Manage web automation backend",positionalArgs:["setup|doctor"],supportedFlags:["stateDir"]}},r=t(),s=new Map(a().map(t=>[t.name,{helpDescription:t.description,supportedFlags:e}]));function i(e){if(e)return c(e)}function d(e){let t=c(e);if(!t)throw Error(`Missing command schema for ${e}`);return t}function c(e){let t=Object.hasOwn(n,e)?n[e]:void 0;if(t)return t;let o=s.get(e),a=Object.hasOwn(r,e)?r[e]:void 0;if(o)return a?{...o,...a}:o}function l(e,t){let o=i(e);if(!o?.defaults)return!1;let a=!1;for(let[e,n]of Object.entries(o.defaults))void 0===t[e]&&(t[e]=n,a=!0);return a}export{l as applyCommandDefaults,d as getCliCommandSchema,i as getCommandSchema};
22
+ Use web setup to install or reuse the pinned backend. Use web doctor after setup to verify browser backend health.`,summary:"Manage web automation backend",positionalArgs:["setup|doctor"],supportedFlags:["stateDir"]}},n=t(),r=new Map(a().map(t=>[t.name,{helpDescription:t.description,supportedFlags:e}]));function i(e){if(e)return c(e)}function d(e){let t=c(e);if(!t)throw Error(`Missing command schema for ${e}`);return t}function c(e){let t=Object.hasOwn(s,e)?s[e]:void 0;if(t)return t;let o=r.get(e),a=Object.hasOwn(n,e)?n[e]:void 0;if(o)return a?{...o,...a}:o}function l(e,t){let o=i(e);if(!o?.defaults)return!1;let a=!1;for(let[e,s]of Object.entries(o.defaults))void 0===t[e]&&(t[e]=s,a=!0);return a}export{l as applyCommandDefaults,d as getCliCommandSchema,i as getCommandSchema};