agent-device 0.18.2 → 0.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/android-multitouch-helper/dist/{agent-device-android-multitouch-helper-0.18.2.apk → agent-device-android-multitouch-helper-0.19.0.apk} +0 -0
- package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.19.0.apk.sha256 +1 -0
- package/android-multitouch-helper/dist/{agent-device-android-multitouch-helper-0.18.2.manifest.json → agent-device-android-multitouch-helper-0.19.0.manifest.json} +4 -4
- package/android-snapshot-helper/dist/{agent-device-android-snapshot-helper-0.18.2.apk → agent-device-android-snapshot-helper-0.19.0.apk} +0 -0
- package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.19.0.apk.sha256 +1 -0
- package/android-snapshot-helper/dist/{agent-device-android-snapshot-helper-0.18.2.manifest.json → agent-device-android-snapshot-helper-0.19.0.manifest.json} +6 -6
- package/dist/apple-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTapPointPolicy.swift +28 -0
- package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AXSnapshotFallback.swift +9 -120
- package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +132 -66
- package/dist/apple-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandJournal.swift +155 -0
- package/dist/apple-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+FlatSnapshotFiltering.swift +67 -0
- package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +20 -74
- package/dist/apple-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScrollGesture.swift +64 -0
- package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SequenceExecution.swift +0 -177
- package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Snapshot.swift +81 -48
- package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCapturePlan.swift +102 -129
- package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +208 -46
- package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Transport.swift +82 -11
- package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +72 -0
- package/dist/src/agent-browser-tool.js +1 -0
- package/dist/src/android-adb.d.ts +64 -234
- package/dist/src/android-adb.js +1 -1
- package/dist/src/android.js +1 -5
- package/dist/src/app-lifecycle.js +7 -0
- package/dist/src/apple-runner-options.js +1 -0
- package/dist/src/apps.js +5 -11
- package/dist/src/artifacts.d.ts +4 -3
- package/dist/src/artifacts.js +1 -1
- package/dist/src/audio-probe.js +1 -1
- package/dist/src/batch.d.ts +2 -177
- package/dist/src/batch.js +1 -1
- package/dist/src/cli-help.js +64 -38
- package/dist/src/cli-output.js +1 -1
- package/dist/src/cli-runner.js +2 -0
- package/dist/src/cli.js +12 -41
- package/dist/src/client-metro-companion.js +1 -0
- package/dist/src/client.js +3 -0
- package/dist/src/command-metadata.js +1 -0
- package/dist/src/command-schema.js +22 -0
- package/dist/src/command-surface.js +1 -1
- package/dist/src/contracts.d.ts +2 -213
- package/dist/src/contracts.js +1 -1
- package/dist/src/debug-symbols.js +5 -3
- package/dist/src/device-input-state.js +2 -0
- package/dist/src/device-rotation.js +14 -0
- package/dist/src/devices.js +1 -1
- package/dist/src/devices2.js +1 -0
- package/dist/src/devices3.js +1 -0
- package/dist/src/find.js +1 -1
- package/dist/src/finders.d.ts +2 -81
- package/dist/src/finders.js +1 -1
- package/dist/src/generic.js +1 -1
- package/dist/src/handler-utils.js +1 -1
- package/dist/src/helper.js +2 -0
- package/dist/src/host-process.js +2 -0
- package/dist/src/index.d.ts +1265 -1768
- package/dist/src/index.js +1 -1
- package/dist/src/input-actions.js +3 -1
- package/dist/src/input-actions2.js +1 -0
- package/dist/src/install-source.d.ts +13 -14
- package/dist/src/install-source.js +1 -1
- package/dist/src/install-source2.js +1 -0
- package/dist/src/interaction-snapshot.js +1 -0
- package/dist/src/interaction.js +1 -1
- package/dist/src/interactor.js +2 -1
- package/dist/src/internal/bin.d.ts +1 -1
- package/dist/src/internal/bin.js +2 -5
- package/dist/src/internal/companion-tunnel.d.ts +1 -1
- package/dist/src/internal/companion-tunnel.js +1 -1
- package/dist/src/internal/daemon.d.ts +1 -1
- package/dist/src/internal/daemon.js +16 -1
- package/dist/src/internal/png-worker.d.ts +29 -26
- package/dist/src/internal/png-worker.js +1 -1
- package/dist/src/internal/update-check-entry.d.ts +1 -1
- package/dist/src/internal/update-check-entry.js +1 -1
- package/dist/src/io.d.ts +2 -85
- package/dist/src/io.js +1 -1
- package/dist/src/lease.js +1 -1
- package/dist/src/linux.js +1 -1
- package/dist/src/logcat.js +6 -0
- package/dist/src/manifest.js +1 -0
- package/dist/src/metro.d.ts +70 -113
- package/dist/src/metro.js +1 -1
- package/dist/src/metro2.js +1 -0
- package/dist/src/notifications.js +1 -1
- package/dist/src/output-path.js +1 -0
- package/dist/src/path-resolution.js +1 -0
- package/dist/src/png-worker-contract.js +1 -0
- package/dist/src/points.js +4 -0
- package/dist/src/project-runtime.js +1 -0
- package/dist/src/provider.js +1 -1
- package/dist/src/providers.js +1 -0
- package/dist/src/react-native.js +1 -1
- package/dist/src/record-trace-recording.js +2 -5
- package/dist/src/record-trace.js +1 -1
- package/dist/src/recording-provider.js +1 -1
- package/dist/src/registry.js +37 -0
- package/dist/src/remote-config.d.ts +2 -83
- package/dist/src/reporting.js +9 -0
- package/dist/src/rolldown-runtime.js +1 -0
- package/dist/src/runner-client.js +1 -0
- package/dist/src/runner-provider.js +1 -0
- package/dist/src/runner-sequence.js +1 -1
- package/dist/src/runtime-transport.js +1 -0
- package/dist/src/runtime.js +3 -0
- package/dist/src/scoped-provider.js +1 -0
- package/dist/src/sdk-android-adb.d.ts +144 -0
- package/dist/src/sdk-android-adb.js +4 -0
- package/dist/src/sdk-app-inventory.d.ts +4 -0
- package/dist/src/sdk-app-inventory.js +1 -0
- package/dist/src/sdk-batch-runner.d.ts +40 -0
- package/dist/src/sdk-batch-runner.js +2 -0
- package/dist/src/sdk-batch.js +2 -0
- package/dist/src/sdk-contracts.d.ts +386 -0
- package/dist/src/sdk-contracts.js +2 -0
- package/dist/src/sdk-finders.d.ts +61 -0
- package/dist/src/sdk-finders.js +1 -0
- package/dist/src/sdk-io.d.ts +79 -0
- package/dist/src/sdk-io.js +1 -0
- package/dist/src/sdk-remote-config.d.ts +140 -0
- package/dist/src/sdk-remote-config.js +1 -0
- package/dist/src/sdk-selectors.js +1 -0
- package/dist/src/selector-runtime.js +1 -1
- package/dist/src/selectors.d.ts +39 -137
- package/dist/src/selectors.js +1 -1
- package/dist/src/selectors2.js +1 -0
- package/dist/src/server.js +3 -2
- package/dist/src/session.js +10 -11
- package/dist/src/setting-state.js +1 -0
- package/dist/src/simctl.js +1 -0
- package/dist/src/simulator.js +1 -2
- package/dist/src/snapshot-diagnostics.js +3 -0
- package/dist/src/snapshot-helper.js +5 -0
- package/dist/src/snapshot-quality.js +1 -0
- package/dist/src/snapshot.js +1 -2
- package/dist/src/snapshot2.js +2 -0
- package/dist/src/{5560.js → timeouts.js} +1 -1
- package/dist/src/tool-provider.js +3 -0
- package/dist/src/tool-provider2.js +1 -0
- package/dist/src/ttl-memo.js +1 -0
- package/dist/src/update-check.js +1 -0
- package/dist/src/url.js +1 -0
- package/dist/src/version.js +1 -0
- package/dist/src/web.js +1 -1
- package/dist/src/xml.js +2 -0
- package/package.json +12 -19
- package/server.json +2 -2
- package/skills/agent-device/SKILL.md +2 -0
- package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.18.2.apk.sha256 +0 -1
- package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.18.2.apk.sha256 +0 -1
- package/apple-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandJournal.swift +0 -443
- package/apple-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+FlatSnapshotFiltering.swift +0 -169
- package/apple-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScrollGesture.swift +0 -220
- package/dist/src/1404.js +0 -1
- package/dist/src/1986.js +0 -1
- package/dist/src/2748.js +0 -1
- package/dist/src/2948.js +0 -30
- package/dist/src/3006.js +0 -1
- package/dist/src/314.js +0 -1
- package/dist/src/3340.js +0 -8
- package/dist/src/4418.js +0 -1
- package/dist/src/4428.js +0 -3
- package/dist/src/485.js +0 -1
- package/dist/src/4917.js +0 -1
- package/dist/src/495.js +0 -5
- package/dist/src/5448.js +0 -3
- package/dist/src/5484.js +0 -1
- package/dist/src/5643.js +0 -1
- package/dist/src/587.js +0 -1
- package/dist/src/5913.js +0 -4
- package/dist/src/6849.js +0 -1
- package/dist/src/6918.js +0 -1
- package/dist/src/6967.js +0 -1
- package/dist/src/760.js +0 -1
- package/dist/src/7871.js +0 -1
- package/dist/src/8184.js +0 -1
- package/dist/src/8225.js +0 -1
- package/dist/src/8391.js +0 -1
- package/dist/src/8404.js +0 -2
- package/dist/src/8414.js +0 -2
- package/dist/src/8875.js +0 -4
- package/dist/src/893.js +0 -1
- package/dist/src/8936.js +0 -1
- package/dist/src/9414.js +0 -1
- package/dist/src/9581.js +0 -22
- package/dist/src/9612.js +0 -1
- package/dist/src/9624.js +0 -1
- package/dist/src/9722.js +0 -38
- package/dist/src/devices~1.js +0 -1
- package/dist/src/devices~2.js +0 -1
- package/dist/src/input-actions~1.js +0 -1
- package/dist/src/rslib-runtime.js +0 -1
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunner.xcodeproj/project.pbxproj +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunner.xcodeproj/xcshareddata/xcschemes/AgentDeviceRunner.xcscheme +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/AgentDeviceRunnerUITests-Bridging-Header.h +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/AgentDeviceRunnerUITests.entitlements +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.h +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.m +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerObjCExceptionCatcher.h +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerObjCExceptionCatcher.m +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.h +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.m +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Alert.swift +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Environment.swift +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Exceptions.swift +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Lifecycle.swift +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScreenRecorder.swift +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SystemModal.swift +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TvRemote.swift +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests.xctestplan +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/RecordingScripts/recording-overlay.swift +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/RecordingScripts/recording-resize.swift +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/RecordingScripts/recording-trim.swift +0 -0
package/dist/src/2948.js
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
var e;import t from"node:path";import{styleText as r}from"node:util";import{buildTextPreview as n,trimText as i,findNearestHittableAncestor as a,buildSelectorChainForNode as o,resolveSelectorChain as s,findNodeByLabel as l,resolveRefLabel as u,describeTextSurface as c,formatSelectorFailure as d,normalizeType as p}from"./893.js";import{normalizeRef as m,isAppleOs as f,isSnapshotBackend as h,RESPONSE_LEVELS as g,NETWORK_INCLUDE_MODES as y,DEVICE_TARGETS as b,isApplePlatform as v,findNodeByRef as w,centerOfRect as x,device_PLATFORM_SELECTORS as S,isPublicPlatform as k,usesMobileSnapshotPresentation as I}from"./6849.js";import{normalizeError as D,AppError as A}from"./485.js";import{readRequiredString as $,readNullableString as M,readBatchStepInputObject as R,readDeviceTarget as N,PUBLIC_COMMANDS as L,asRecord as O,STRUCTURED_BATCH_COMMAND_NAMES as P,GESTURE_KINDS as C,readRequiredNumber as F,readOptionalString as E,readRequiredPlatform as T,readRequiredDeviceKind as _,readStructuredBatchCommandName as j,stripUndefined as U,listMcpExposedCommandNames as B,readBatchStepRecord as V,parseBatchStepRuntime as z,assertBatchStepCount as q,INTERNAL_COMMANDS as G,isValidBatchMaxSteps as W,isRecord as H}from"./1986.js";import{splitSelectorFromArgs as K,tryParseSelectorChain as X,parseSelectorChain as J,FIND_LOCATORS as Y}from"./587.js";import{DEFAULT_APPS_FILTER as Q,assertResolvedAppsFilter as Z}from"./2748.js";function ee(e){return e.width>0&&e.height>0}function et(e,t){return!!e&&!!t&&e.x>=t.x-2&&e.y>=t.y-2&&e.x+e.width<=t.x+t.width+2&&e.y+e.height<=t.y+t.height+2}function er(e){return"number"!=typeof e.parentIndex}function en(e){let t=(e.type??"").toLowerCase(),r=(e.identifier??"").trim().toLowerCase();return t.includes("edittext")||t.includes("textfield")||"composer"===r}function ei(e){let t=(e.type??"").toLowerCase();return t.includes("scroll")||t.includes("list")||t.includes("recyclerview")}function ea(e){let t=new Map;for(let[r,n]of e.entries())t.set(n.index,r);let r=[],n=[];for(let[i,a]of e.entries()){let e=Math.max(0,a.depth??0);for(;n.length>0&&e<=n[n.length-1].depth;)n.pop();let o="number"==typeof a.parentIndex?t.get(a.parentIndex):void 0,s="number"==typeof o&&o<i?o:n[n.length-1]?.index;r.push({...a,index:i,depth:e,parentIndex:s}),n.push({depth:e,index:i})}return r}function eo(e){return new Map(e.map(e=>[e.index,e]))}function es(e){return e.label?.trim()||e.value?.trim()||e.identifier?.trim()||""}function el(e){var t;let r=es(e);if(!r||r!==e.identifier?.trim()||(t=r,!/^[\w.]+:id\/[\w.-]+$/i.test(t)))return r;let n=(e.type??"").toLowerCase();return n.includes("view")||n.includes("layout")||n.includes("image")||n.includes("list")||n.includes("recyclerview")||n.includes("collection")?"":r}function eu(e){let t=e.trim().replace(/\s+/g," ").toLowerCase();return!t||/^(true|false|\d+)$/.test(t)?null:t}function ec(e,t){let r=[],n=[t];for(;n.length>0;){let t=n.pop();for(let i of e)i.parentIndex===t&&(r.push(i),n.push(i.index))}return r}function ed(e,t,r){let n=[t];for(;n.length>0;){let t=n.pop();if(!r.has(t))for(let i of(r.add(t),e))i.parentIndex!==t||r.has(i.index)||n.push(i.index)}}let ep=["button","switch","checkbox","radio"],em=["button","image","textview","view"];function ef(e){if(!0===e.hittable||en(e))return!1;let t=(e.type??"").toLowerCase();return t.includes("text")||t.includes("image")||t.includes("icon")}function eh(e){if(!e.rect||!ee(e.rect)||er(e)||en(e))return!1;let t=(e.type??"").toLowerCase();return"text"===t||eb(t,em)}function eg(e,t){let r=ey(e);return ey(t)>r?t:e}function ey(e){let t=(e.type??"").toLowerCase(),r=0;return eb(t,ep)?r+=100:t.includes("image")?r+=30:t.includes("textview")||"text"===t?r+=20:t.includes("view")&&(r+=10),!0===e.hittable&&(r+=20),!1!==e.enabled&&(r+=5),r}function eb(e,t){return t.some(t=>e.includes(t))}function ev(e){let t=e.trim().toLowerCase();return!!t&&/^(vertical|horizontal)\s+scroll\s+bar(?:,?\s*\d+\s+pages?)?$/.test(t)}function ew(e,t){if(!(e?.trim().toLowerCase()??"").includes("vertical scroll bar"))return null;let r=function(e){if(!e)return null;let t=/^(\d{1,3})%$/.exec(e.trim());if(!t)return null;let r=Number(t[1]);return Number.isFinite(r)?Math.max(0,Math.min(100,r)):null}(t);return null===r?null:r<=1?{above:!1,below:!0}:r>=99?{above:!0,below:!1}:{above:!0,below:!0}}let ex={application:"application",navigationbar:"navigation-bar",tabbar:"tab-bar",button:"button",imagebutton:"button",link:"link",cell:"cell",statictext:"text",checkedtextview:"text",textbox:"text-field",textfield:"text-field",edittext:"text-field",textarea:"text-view",switch:"switch",slider:"slider",image:"image",imageview:"image",webview:"webview",framelayout:"group",linearlayout:"group",relativelayout:"group",constraintlayout:"group",viewgroup:"group",view:"group",listview:"list",recyclerview:"list",collectionview:"collection",searchfield:"search",segmentedcontrol:"segmented-control",group:"group",window:"window",checkbox:"checkbox",radio:"radio",menuitem:"menu-item",toolbar:"toolbar",scrollarea:"scroll-area",scrollview:"scroll-area",nestedscrollview:"scroll-area",table:"table"};function eS(e,t={}){let r=[],n=[];for(let i of e){let e=i.depth??0,a=i.label?.trim()||i.value?.trim()||i.identifier?.trim()||"",o=eD(i.type??"Element");if("group"===o&&!a)continue;for(;r.length>0&&e<=r[r.length-1];)r.pop();let s=r.length;r.push(e),n.push({node:i,depth:s,type:o,text:ek(i,s,!1,o,t)})}return n}function ek(e,t,r,a,o={}){var s,l,u,d,p,m,f,h;let g,y=a??eD(e.type??"Element"),b=c(e,y),v=(s=e,l=y,u=o,d=b,u.summarizeTextSurfaces&&d.shouldSummarize&&function(e,t,r){let n=i(e.label);if(n&&n!==r)return n;let a=i(e.identifier);if(a&&!e$(a)&&a!==r)return a;switch(t){case"text":case"text-view":return"Text view";case"text-field":return"Text field";case"search":return"Search field";default:return""}}(s,l,d.text)||eI(s,l)),w=" ".repeat(t),x=e.ref?`@${e.ref}`:"",S=(p=e,m=y,f=o,h=b,g=[],!1===p.enabled&&g.push("disabled"),g.push(...p.presentationHints??[]),f.summarizeTextSurfaces&&(!0===p.selected&&g.push("selected"),!0===p.focused&&g.push("focused"),eA(m)&&g.push("editable"),function(e,t){if("scroll-area"===t)return!0;let r=(e.type??"").toLowerCase(),n=`${e.role??""} ${e.subrole??""}`.toLowerCase();return r.includes("scroll")||n.includes("scroll")}(p,m)&&g.push("scrollable"),h.shouldSummarize&&(g.push(`preview:"${n(h.text).replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`),g.push("truncated"))),eM(g)).map(e=>` [${e}]`).join(""),k=v?` "${v}"`:"";return r?`${w}${x} [${y}]${S}`.trimEnd():`${w}${x} [${y}]${k}${S}`.trimEnd()}function eI(e,t){var r,n;let i=e.label?.trim();if(i&&(r=t,n=i,("scroll-area"===r||"list"===r||"collection"===r||"table"===r)&&ev(n)))return"";let a=e.value?.trim();if(eA(t)){if(a)return a;if(i)return i}else if(i)return i;if(a)return a;let o=e.identifier?.trim();return!o||e$(o)&&("group"===t||"image"===t||"list"===t||"collection"===t)?"":o}function eD(e){var t;let r=e.replace(/XCUIElementType/gi,"").toLowerCase(),n=e.includes(".")&&(e.startsWith("android.")||e.startsWith("androidx.")||e.startsWith("com."));return(r.includes(".")&&(r=r.replace(/^android\.widget\./,"").replace(/^android\.view\./,"").replace(/^android\.webkit\./,"").replace(/^androidx\./,"").replace(/^com\.google\.android\./,"").replace(/^com\.android\./,""),n&&r.includes(".")&&(r=r.slice(r.lastIndexOf(".")+1))),"textview"===r)?n?"text":"text-view":(t=r,(Object.prototype.hasOwnProperty.call(ex,t)?ex[t]:void 0)||r||"element")}function eA(e){return"text-field"===e||"text-view"===e||"search"===e}function e$(e){return/^[\w.]+:id\/[\w.-]+$/i.test(e)}function eM(e){return[...new Set(e)]}function eR(e,t,r){return t>=e.x&&t<=e.x+e.width&&r>=e.y&&r<=e.y+e.height}function eN(e){let t=null,r=-1;for(let n of e){let e=n.width*n.height;e>r&&(t=n,r=e)}return t}function eL(e,t,r,n){return Math.max(e,r)<=Math.min(t,n)}function eO(e){let t=`${e??""}`.toLowerCase();return t.includes("scroll")||t.includes("recyclerview")||t.includes("listview")||t.includes("gridview")||t.includes("collectionview")||"table"===t}function eP(e){return!!eO(e.type)||`${e.role??""} ${e.subrole??""}`.toLowerCase().includes("scroll")}function eC(e){if(0===e.length)return{nodes:e,hiddenCount:0,summaryLines:[]};let{byIndex:t,visibleNodeIndexes:r,offscreenNodes:n,hintedContainers:i}=eE(e),a=0===r.size?e:e.filter(e=>r.has(e.index));return{nodes:a.map(e=>(function(e,t){let r=t.get(e.index);if(!r||0===r.size)return e;let n=!!(!0===e.hiddenContentAbove||r.has("above"))||void 0,i=!!(!0===e.hiddenContentBelow||r.has("below"))||void 0;return{...e,hiddenContentAbove:n,hiddenContentBelow:i}})(e,i.directionsByContainer)),hiddenCount:0===r.size?0:e.length-a.length,summaryLines:function(e,t,r){let n=new Map;for(let i of e){let e=function(e,t,r){if(!e.rect)return null;let n=e_(e,t,r);return n?ej(e.rect,n):null}(i,t,r);if(!e)continue;let a=n.get(e)??[];a.push(i),n.set(e,a)}return["above","below"].flatMap(e=>{let t=n.get(e);if(!t||0===t.length)return[];let r=(function(e){let t=new Set,r=[];for(let n of e){let e=es(n);!e||t.has(e)||(t.add(e),r.push(e))}return r})(t).slice(0,3).map(e=>`"${e}"`),i=1===t.length?"interactive item":"interactive items",a=r.length>0?`: ${r.join(", ")}`:"";return[`[off-screen ${e}] ${t.length} ${i}${a}`]})}(n.filter(e=>!i.coveredNodeIndexes.has(e.index)&&function(e){if(!0===e.hittable)return!0;let t=(e.type??"").toLowerCase();return t.includes("button")||t.includes("link")||t.includes("textfield")||t.includes("edittext")||t.includes("searchfield")||t.includes("checkbox")||t.includes("radio")||t.includes("switch")||t.includes("menuitem")||!!es(e)}(e)),e,t)}}function eF(e){if(0===e.length)return new Map;let{hintedContainers:t}=eE(e);var r=t.directionsByContainer;let n=new Map;for(let[e,t]of r){let r={};t.has("above")&&(r.hiddenContentAbove=!0),t.has("below")&&(r.hiddenContentBelow=!0),(r.hiddenContentAbove||r.hiddenContentBelow)&&n.set(e,r)}return n}function eE(e){let t=eo(e),r=new Set,n=[];for(let i of e){if(eT(i,e,t)){!function(e,t,r){let n=e,i=new Set;for(;n&&!i.has(n.index);)i.add(n.index),t.add(n.index),n="number"==typeof n.parentIndex?r.get(n.parentIndex):void 0}(i,r,t);continue}n.push(i)}let i=function(e,t,r,n){let i=new Map,a=new Map,o=new Set;for(let e of t){if(!e.rect)continue;let t=eU(e,r,n);if(!t?.rect)continue;let s=ej(e.rect,t.rect);if(!s)continue;let l=i.get(t.index)??new Set;l.add(s),i.set(t.index,l);let u=a.get(t.index)??new Set;u.add(s),a.set(t.index,u),o.add(e.index)}return function(e,t,r,n,i){for(let a of e){let e=function(e){let t=ew(e.label,e.value);if(!t)return null;let r=new Set;return t.above&&r.add("above"),t.below&&r.add("below"),r.size>0?r:null}(a);if(!e||0===e.size)continue;let o=eU(a,t,r);if(!o)continue;let s=n.get(o.index)??new Set,l=i.get(o.index);for(let t of e)(!l||!(l.size>0)||l.has(t))&&s.add(t);n.set(o.index,s)}}(e,r,n,i,a),{directionsByContainer:i,coveredNodeIndexes:o}}(e,n,r,t);return{byIndex:t,visibleNodeIndexes:r,offscreenNodes:n,hintedContainers:i}}function eT(e,t,r=eo(t)){var n;if(!e.rect)return!0;let i=e_(e,t,r);return!i||(n=e.rect,eL(n.x,n.x+n.width,i.x,i.x+i.width)&&eL(n.y,n.y+n.height,i.y,i.y+i.height))}function e_(e,t,r=eo(t)){var n,i;let a=(n=e,i=r,eB(n,i,e=>!!e.rect)?.rect??null);return a||function(e,t){let r=x(t),n=e.filter(e=>{var t;return!!(t=e.rect)&&Number.isFinite(t.x)&&Number.isFinite(t.y)&&Number.isFinite(t.width)&&Number.isFinite(t.height)}),i=n.filter(e=>{let t=(e.type??"").toLowerCase();return t.includes("application")||t.includes("window")}),a=eN(i.map(e=>e.rect).filter(e=>eR(e,r.x,r.y)));if(a)return a;let o=eN(i.map(e=>e.rect));if(o)return o;let s=eN(n.map(e=>e.rect).filter(e=>eR(e,r.x,r.y)));return s||null}(t,e.rect??{x:0,y:0,width:0,height:0})}function ej(e,t){return e.y+e.height<=t.y?"above":e.y>=t.y+t.height?"below":null}function eU(e,t,r){return eB(e,r,e=>t.has(e.index))}function eB(e,t,r){let n="number"==typeof e.parentIndex?t.get(e.parentIndex):void 0,i=new Set;for(;n&&!i.has(n.index);){if(i.add(n.index),r(n)&&eP(n))return n;n="number"==typeof n.parentIndex?t.get(n.parentIndex):void 0}return null}function eV(e){process.stdout.write(`${JSON.stringify(e,null,2)}
|
|
2
|
-
`)}function ez(e,t={}){let r=e instanceof A?D(e):e;process.stderr.write(`Error (${r.code}): ${r.message}
|
|
3
|
-
`),r.hint&&process.stderr.write(`Hint: ${r.hint}
|
|
4
|
-
`),r.diagnosticId&&process.stderr.write(`Diagnostic ID: ${r.diagnosticId}
|
|
5
|
-
`),r.logPath&&process.stderr.write(`Diagnostics Log: ${r.logPath}
|
|
6
|
-
`),t.showDetails&&r.details&&process.stderr.write(`${JSON.stringify(r.details,null,2)}
|
|
7
|
-
`)}function eq(e){return e&&e.summaryLines.length>0?`
|
|
8
|
-
${e.summaryLines.join("\n")}`:""}function eG(e){let t=!0===e.baselineInitialized,r=e.summary??{},n=eQ(r.additions),i=eQ(r.removals),a=eQ(r.unchanged),o=eZ(),s=e2(e),l=s.length>0?`${s.join("\n")}
|
|
9
|
-
`:"";if(t)return`${l}Baseline initialized (${a} lines).
|
|
10
|
-
`;let u=(function(e){if(0===e.length)return e;let t=e.map((e,t)=>({index:t,kind:e.kind})).filter(e=>"added"===e.kind||"removed"===e.kind).map(e=>e.index);if(0===t.length)return e;let r=Array(e.length).fill(!1);for(let n of t){let t=Math.max(0,n-1),i=Math.min(e.length-1,n+1);for(let e=t;e<=i;e+=1)r[e]=!0}return e.filter((e,t)=>r[t])})(Array.isArray(e.lines)?e.lines:[]).map(e=>{let t="string"==typeof e.text?e.text:"";if("added"===e.kind){let e=t.startsWith(" ")?`+${t}`:`+ ${t}`;return o?e0(e,"green"):e}if("removed"===e.kind){let e=t.startsWith(" ")?`-${t}`:`- ${t}`;return o?e0(e,"red"):e}return o?e0(t,"dim"):t}),c=u.length>0?`${u.join("\n")}
|
|
11
|
-
`:"";if(!o)return`${l}${c}${n} additions, ${i} removals, ${a} unchanged
|
|
12
|
-
`;let d=`${e0(String(n),"green")} additions, ${e0(String(i),"red")} removals, ${e0(String(a),"dim")} unchanged`;return`${l}${c}${d}
|
|
13
|
-
`}function eW(e){var t,r,n,i;let a,o,s,l,u=eZ(),c=!0===e.match,d=e.dimensionMismatch,p=[];return p.push(...function(e,t){if(!0===e.match){let e=t?e0("✓","green"):"✓";return[`${e} Screenshots match.`]}let r=e.dimensionMismatch,n=t?e0("✗","red"):"✗";if(r){let e=r.expected,t=r.actual;return[`${n} Screenshots have different dimensions: expected ${e?.width}x${e?.height}, got ${t?.width}x${t?.height}`]}let i=eQ(e.differentPixels),a=eQ(e.mismatchPercentage),o=0===a&&i>0?"<0.01":String(a),s=`${o}% pixels differ`;return[`${n} ${t?e0(s,"red"):s}`]}(e,u)),p.push(...function(e,t,r){if(t)return[];let n=[];if(e.diffPath){let t=eY(e.diffPath),i=r?e0("Diff image:","dim"):"Diff image:",a=r?e0(t,"green"):t;n.push(` ${i} ${a}`)}if(e.currentOverlayPath){let t=eY(e.currentOverlayPath),i=r?e0("Current overlay:","dim"):"Current overlay:",a=r?e0(t,"green"):t,o=eQ(e.currentOverlayRefCount),s=o>0?` (${o} refs)`:"";n.push(` ${i} ${a}${s}`)}return n}(e,c,u)),c||d||(p.push(...(t=e,r=u,a=eQ(t.differentPixels),o=eQ(t.totalPixels),s=r?e0(String(a),"red"):String(a),[` ${s} different / ${o} total pixels`])),p.push(...(n=e,i=u,0===(l=function(e){let t=[];for(let r of(e.ocr?.movementClusters??[]).slice(0,2))t.push(`text movement cluster: ${function(e){let t=e.slice(0,4).map(e=>JSON.stringify(e)),r=e.length>t.length?` +${e.length-t.length} more`:"";return`${t.join(", ")}${r}`}(r.texts)} dx=${eJ(r.xRange)}px dy=${eJ(r.yRange)}px`);let r=(e.nonTextDeltas??[]).filter(e=>["icon","toggle","chevron"].includes(e.likelyKind)).slice(0,3);r.length>0&&t.push(`non-text controls: ${r.map(eX).join("; ")}`);let n=(e.nonTextDeltas??[]).filter(e=>"separator"===e.likelyKind).slice(0,2);return n.length>0&&t.push(`non-text boundaries: ${n.map(eX).join("; ")}`),t.slice(0,6)}(n)).length?[]:[` ${e1("Hints:",i)}`,...l.map(e=>` - ${e}`)])),p.push(...function(e,t){let r=Array.isArray(e.regions)?e.regions:[];if(0===r.length)return[];let n=[` ${e1("Changed regions:",t)}`];for(let e of r.slice(0,5))n.push(...function(e){let t=0===e.shareOfDiffPercentage&&e.differentPixels>0?"<0.01":String(e.shareOfDiffPercentage),r=e.rect,n=[` ${e.index}. ${e.location} x=${r.x} y=${r.y} ${r.width}x${r.height}, ${t}% of diff, change=${e.dominantChange}`],i=function(e){let t=[e.size?`size=${e.size}`:null,e.shape?`shape=${e.shape}`:null,"number"==typeof e.densityPercentage?`density=${e.densityPercentage}%`:null,e.averageBaselineColorHex&&e.averageCurrentColorHex?`avgColor=${e.averageBaselineColorHex}->${e.averageCurrentColorHex}`:null,"number"==typeof e.baselineLuminance&&"number"==typeof e.currentLuminance?`luminance=${e.baselineLuminance}->${e.currentLuminance}`:null].filter(e=>null!==e);return t.length>0?t.join(" "):null}(e);i&&n.push(` ${i}`);let a=e.currentOverlayMatches?.[0];if(a){let e=a.label?` "${a.label}"`:"";n.push(` overlaps @${a.ref}${e}, ${a.regionCoveragePercentage}% of region`)}return n}(e));return n}(e,u)),p.push(...function(e,t){let r=e.ocr?.matches??[];if(0===r.length)return[];let n=r.slice(0,8),i=[` ${e1(`OCR text deltas (${e.ocr?.provider}; baselineBlocks=${e.ocr?.baselineBlocks} currentBlocks=${e.ocr?.currentBlocks}; showing ${n.length}/${r.length}; px):`,t)}`,` ${e1("item | text | movePx | sizeDeltaPx | bboxBaseline | bboxCurrent | confidence | issueHint",t)}`];for(let[e,t]of n.entries()){let r=t.delta;i.push(` ${e+1} | ${JSON.stringify(t.text)} | ${eK(r.x)},${eK(r.y)} | ${eK(r.width)},${eK(r.height)} | ${eH(t.baselineRect)} | ${eH(t.currentRect)} | ${t.confidence} | ${t.possibleTextMetricMismatch?"ocr-bbox-size-change":"-"}`)}return i}(e,u)),p.push(...function(e,t){let r=e.nonTextDeltas??[];if(0===r.length)return[];let n=r.slice(0,8),i=[` ${e1(`Non-text visual deltas (showing ${n.length}/${r.length}; px):`,t)}`,` ${e1("item | region | slot | kind | bboxCurrent | nearestText",t)}`];for(let e of n)i.push(` ${e.index} | ${e.regionIndex?`r${e.regionIndex}`:"-"} | ${e.slot} | ${e.likelyKind} | ${eH(e.rect)} | ${e.nearestText?JSON.stringify(e.nearestText):"-"}`);return i}(e,u))),`${p.join("\n")}
|
|
14
|
-
`}function eH(e){return`x=${e.x},y=${e.y},w=${e.width},h=${e.height}`}function eK(e){return e>0?`+${e}`:String(e)}function eX(e){let t=e.nearestText?` near ${JSON.stringify(e.nearestText)}`:"",r=e.regionIndex?` r${e.regionIndex}`:"";return`${e.likelyKind}${t}${r}`}function eJ(e){return e.min===e.max?eK(e.min):`${eK(e.min)}..${eK(e.max)}`}function eY(e){let r=process.cwd(),n=t.relative(r,e);return""!==n&&(n.startsWith("..")||t.isAbsolute(n))?e:""===n?".":`.${t.sep}${n}`}function eQ(e){return"number"==typeof e&&Number.isFinite(e)?e:0}function eZ(e=process.stdout){let t=process.env.FORCE_COLOR;return"string"==typeof t?"0"!==t:"string"!=typeof process.env.NO_COLOR&&!!e.isTTY}function e0(e,t,n){return r(t,e,n)}function e1(e,t){return t?e0(e,"dim"):e}function e2(e){let t=e.warnings;return Array.isArray(t)?t.filter(e=>"string"==typeof e&&e.length>0):[]}function e5(e,t){var r;let n="scroll-area"===(r=e.type)||"list"===r||"collection"===r||"table"===r?r:null;if(!n)return[];let i=[];if(e.node.hiddenContentAbove&&"below"!==t&&i.push(`[content above ${n} hidden]`),e.node.hiddenContentBelow&&"above"!==t&&i.push(`[content below ${n} hidden]`),0===i.length)return[];let a=" ".repeat(e.depth+1);return i.map(e=>`${a}${e}`)}function e3(e,t={}){let r=eZ(process.stderr);if("pass"===e){let e=t.passFormat??"green";return r?e4("✓",e):"✓"}return"fail"===e?r?e4("⨯","red"):"⨯":"warn"===e?r?e4("!","yellow"):"!":r?e4("-","dim"):"-"}function e4(e,t){return e0(e,t,{validateStream:!1})}function e8(e){var t,r;let n,i,a=e3("pass"===(t=e.status)?"pass":"fail"===t?"fail":"warn"===t?"warn":"skip");return`${a} ${n="string"==typeof(r=e).id&&r.id.length>0?r.id:"check",(i="string"==typeof r.summary&&r.summary.length>0?r.summary:n)===n?n:`${n}: ${i}`}`}function e6(e){return"fail"!==e.status&&"warn"!==e.status?[]:"string"==typeof e.command?[` run: ${e.command}`]:"string"==typeof e.hint?[` hint: ${e.hint}`]:[]}let e9=!1;function e7(){e9=!0}let te=["leaseId","tenantId","runId","clientId","deviceKey"];function tt(e){return U({tenantId:e.meta?.tenantId??tp(e.flags,"tenant"),runId:e.meta?.runId??tp(e.flags,"runId"),leaseId:e.meta?.leaseId??tp(e.flags,"leaseId"),leaseTtlMs:e.meta?.leaseTtlMs,leaseBackend:e.meta?.leaseBackend,leaseProvider:e.meta?.leaseProvider??tp(e.flags,"leaseProvider")??tp(e.flags,"provider"),deviceKey:e.meta?.deviceKey??tp(e.flags,"deviceKey"),clientId:e.meta?.clientId??tp(e.flags,"clientId")})}function tr(e){return U({tenantId:e.tenant,runId:e.runId,leaseId:e.leaseId,leaseTtlMs:e.leaseTtlMs??e.ttlMs,leaseBackend:e.leaseBackend,leaseProvider:e.leaseProvider??e.provider,deviceKey:e.deviceKey,clientId:e.clientId})}function tn(e){return U({tenant:e.tenantId,runId:e.runId,leaseId:e.leaseId,leaseBackend:e.leaseBackend,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey,clientId:e.clientId})}function ti(e){return U({tenantId:e.tenantId??"",runId:e.runId??"",leaseBackend:e.leaseBackend,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey,clientId:e.clientId,ttlMs:e.leaseTtlMs})}function ta(e){return td(e)}function to(e){let{ttlMs:t,...r}=td(e);return r}function ts(e,t,r){let n=U({...r.includeTokenParam?{token:r.token}:{},session:r.session,tenantId:e.tenantId,runId:e.runId,leaseProvider:e.leaseProvider,clientId:e.clientId,deviceKey:e.deviceKey});switch(t){case"lease_allocate":return{...n,...U({ttlMs:e.leaseTtlMs,backend:e.leaseBackend})};case"lease_heartbeat":return{...n,...U({leaseId:e.leaseId,ttlMs:e.leaseTtlMs})};case"lease_release":return{...n,...U({leaseId:e.leaseId})}}}function tl(e){let t=U({leaseProvider:e.leaseProvider,deviceKey:e.deviceKey,clientId:e.clientId});return Object.keys(t).length>0?t:void 0}function tu(e){return"proxy"===e.leaseProvider}function tc(e){return tu(e)?te.filter(t=>!e[t]):[]}function td(e){return U({leaseId:e.leaseId??"",tenantId:e.tenantId,runId:e.runId,leaseBackend:e.leaseBackend,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey,clientId:e.clientId,ttlMs:e.leaseTtlMs})}function tp(e,t){let r=e?.[t];return"string"==typeof r?r:void 0}let tm=["ref","selector","point"];function tf(e){return{type:"string",...e?{description:e}:{}}}function th(e){return{type:"boolean",...e?{description:e}:{}}}function tg(e){return{type:"object",additionalProperties:!0,...e?{description:e}:{}}}function ty(e){return{...e,required:!0}}function tb(e){return tH(tf(e),tF)}function tv(e){return tH({type:"number",...e?{description:e}:{}},tT)}function tw(e,t={}){return tH(function(e,t){return{...{type:"integer",...e?{description:e}:{}},...void 0===t.min?{}:{minimum:t.min},...void 0===t.max?{}:{maximum:t.max}}}(e,t),(e,r)=>t_(e,r,t))}function tx(e){return tH(th(e),tj)}function tS(e,t){return tH({type:"string",enum:e,...t?{description:t}:{}},(t,r)=>tB(t,r,e))}function tk(e){return tH({type:"array",items:{type:"string"},...e?{description:e}:{}},tK)}function tI(e){return tH(e,(e,t)=>e[t])}function tD(){return tH({oneOf:[...tX(),{type:"object",properties:{kind:{type:"string",const:"point"},x:{type:"number"},y:{type:"number"}},required:["kind","x","y"],additionalProperties:!1}],description:"UI target. This is separate from deviceTarget, which selects the device form."},(e,t)=>void 0===e[t]?void 0:function(e,t){let r=tJ(e,t),n=tU(r,"kind",tm);switch(n){case"ref":return{kind:n,ref:tC(r,"ref"),label:tF(r,"label")};case"selector":return{kind:n,selector:tC(r,"selector")};case"point":return{kind:n,x:tE(r,"x"),y:tE(r,"y")}}}(e,t))}function tA(e){return tH({type:"object",description:e,properties:{x:{type:"number"},y:{type:"number"}},required:["x","y"],additionalProperties:!1},(e,t)=>void 0===e[t]?void 0:tP(e,t))}function t$(){return{depth:tw("Snapshot traversal depth.",{min:0}),scope:tb("Snapshot scope selector used before resolution."),raw:tx("Use raw snapshot data during selector resolution.")}}function tM(){return{count:tw("Number of press/click repetitions.",{min:1}),intervalMs:tw("Delay between repeated press/click actions.",{min:0}),holdMs:tw("Hold duration for each action.",{min:0}),jitterPx:tw("Randomization radius in pixels.",{min:0}),doubleTap:tx("Request a double-tap action.")}}function tR(e){return function(e,t=[]){return{type:"object",properties:{session:{type:"string",description:"Agent-device session name."},platform:{type:"string",enum:S,description:"Platform selector used to resolve a device."},deviceTarget:{type:"string",enum:b,description:"Device target form. Maps to the CLI --target flag."},target:{type:"string",enum:b,description:"Alias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element."},device:{type:"string",description:"Device name selector."},udid:{type:"string",description:"iOS device UDID selector."},serial:{type:"string",description:"Android serial selector."},iosSimulatorDeviceSet:{type:"string",description:"iOS simulator device-set path used for device resolution."},iosXctestrunFile:{type:"string",description:"Externally built iOS XCTest runner .xctestrun artifact path."},iosXctestDerivedDataPath:{type:"string",description:"Derived data path for external iOS XCTest runner execution."},iosXctestEnvDir:{type:"string",description:"Writable directory for iOS XCTest runner env overlays."},androidDeviceAllowlist:{type:"string",description:"Android serial allowlist used for device resolution."},daemonBaseUrl:{type:"string",description:"Remote daemon base URL."},daemonAuthToken:{type:"string",description:"Remote daemon auth token."},tenant:{type:"string",description:"Remote tenant identifier."},runId:{type:"string",description:"Lease run identifier."},leaseId:{type:"string",description:"Existing lease identifier."},cwd:{type:"string",description:"Working directory for command execution."},debug:{type:"boolean",description:"Enable debug diagnostics."},...e},...t.length>0?{required:t}:{},additionalProperties:!1}}(Object.fromEntries(Object.entries(e).map(([e,t])=>[e,t.schema])),Object.entries(e).flatMap(([e,t])=>t.required?[e]:[]))}function tN(e,t){let r=tL(e),n=Object.fromEntries(Object.entries(t).flatMap(([e,t])=>{let n=t.read(r,e);if(t.required&&void 0===n)throw Error(`Expected ${e} to be set.`);return void 0===n?[]:[[e,n]]})),i=tO(r,{readTargetAlias:!Object.hasOwn(t,"target")});return tW({...i,...tV(i),...n})}function tL(e){if(null==e)return{};if(!e||"object"!=typeof e||Array.isArray(e))throw Error("Expected object arguments.");return e}function tO(e,t={}){return{session:tF(e,"session"),platform:tB(e,"platform",S),deviceTarget:function(e,t){let r=tB(e,"deviceTarget",b);if(!1===t.readTargetAlias||void 0===e.target)return r;let n=tB(e,"target",b);if(void 0!==r&&n!==r)throw Error("Expected target alias to match deviceTarget when both are set.");return r??n}(e,t),device:tF(e,"device"),udid:tF(e,"udid"),serial:tF(e,"serial"),iosSimulatorDeviceSet:tF(e,"iosSimulatorDeviceSet"),iosXctestrunFile:tF(e,"iosXctestrunFile"),iosXctestDerivedDataPath:tF(e,"iosXctestDerivedDataPath"),iosXctestEnvDir:tF(e,"iosXctestEnvDir"),androidDeviceAllowlist:tF(e,"androidDeviceAllowlist"),daemonBaseUrl:tF(e,"daemonBaseUrl"),daemonAuthToken:tF(e,"daemonAuthToken"),tenant:tF(e,"tenant"),runId:tF(e,"runId"),leaseId:tF(e,"leaseId"),cwd:tF(e,"cwd"),debug:tj(e,"debug")}}function tP(e,t){let r=tJ(e,t);return{x:tE(r,"x"),y:tE(r,"y")}}function tC(e,t){let r=e[t];if("string"!=typeof r||0===r.length)throw Error(`Expected ${t} to be a non-empty string.`);return r}function tF(e,t){let r=e[t];if(void 0!==r){if("string"!=typeof r||0===r.length)throw Error(`Expected ${t} to be a non-empty string.`);return r}}function tE(e,t){let r=e[t];if("number"!=typeof r||!Number.isFinite(r))throw Error(`Expected ${t} to be a finite number.`);return r}function tT(e,t){let r=e[t];if(void 0!==r){if("number"!=typeof r||!Number.isFinite(r))throw Error(`Expected ${t} to be a finite number.`);return r}}function t_(e,t,r={}){let n=e[t];if(void 0!==n){if(!Number.isInteger(n))throw Error(`Expected ${t} to be an integer.`);if(void 0!==r.min&&n<r.min)throw Error(`Expected ${t} to be at least ${r.min}.`);if(void 0!==r.max&&n>r.max)throw Error(`Expected ${t} to be at most ${r.max}.`);return n}}function tj(e,t){let r=e[t];if(void 0!==r){if("boolean"!=typeof r)throw Error(`Expected ${t} to be a boolean.`);return r}}function tU(e,t,r){let n=e[t];if("string"!=typeof n||!r.includes(n))throw Error(`Expected ${t} to be one of: ${r.join(", ")}.`);return n}function tB(e,t,r){let n=e[t];if(void 0!==n){if("string"!=typeof n||!r.includes(n))throw Error(`Expected ${t} to be one of: ${r.join(", ")}.`);return n}}function tV(e){return tW({session:e.session,platform:e.platform,target:e.deviceTarget,device:e.device,udid:e.udid,serial:e.serial,iosSimulatorDeviceSet:e.iosSimulatorDeviceSet,iosXctestrunFile:e.iosXctestrunFile,iosXctestDerivedDataPath:e.iosXctestDerivedDataPath,iosXctestEnvDir:e.iosXctestEnvDir,androidDeviceAllowlist:e.androidDeviceAllowlist,daemonBaseUrl:e.daemonBaseUrl,daemonAuthToken:e.daemonAuthToken,tenant:e.tenant,runId:e.runId,leaseId:e.leaseId,cwd:e.cwd,debug:e.debug})}function tz(e){switch(e.kind){case"ref":return{ref:e.ref,label:e.label};case"selector":return{selector:e.selector};case"point":return{x:e.x,y:e.y}}}function tq(e){return{count:e.count,intervalMs:e.intervalMs,holdMs:e.holdMs,jitterPx:e.jitterPx,doubleTap:e.doubleTap}}function tG(e){return{depth:e.depth,scope:e.scope,raw:e.raw}}function tW(e){return Object.fromEntries(Object.entries(e).filter(([,e])=>void 0!==e))}function tH(e,t){return{schema:e,required:!1,read:t}}function tK(e,t){let r=e[t];if(void 0!==r){if(!Array.isArray(r)||r.some(e=>"string"!=typeof e))throw Error(`Expected ${t} to be an array of strings.`);return r}}function tX(){return[{type:"object",properties:{kind:{type:"string",const:"ref"},ref:{type:"string",description:"Snapshot element ref such as @e12."},label:{type:"string",description:"Optional human label for the ref."}},required:["kind","ref"],additionalProperties:!1},{type:"object",properties:{kind:{type:"string",const:"selector"},selector:{type:"string",description:"Agent-device selector expression."}},required:["kind","selector"],additionalProperties:!1}]}function tJ(e,t){let r=e[t];if(!r||"object"!=typeof r||Array.isArray(r))throw Error(`Expected ${t} to be an object.`);return r}function tY(e,t){return r=>tQ(e,t?t(r):[],r)}function tQ(e,t,r){return{command:e,positionals:t,options:function(e){var t;let r="mobile"===(t=e.deviceTarget??e.target)||"tv"===t||"desktop"===t?t:void 0;if(void 0===r&&void 0===e.target)return e;let{target:n,...i}=e;return void 0===r?i:{...i,target:r}}(r)}}function tZ(e){return tW({session:e.session,platform:e.platform,deviceTarget:e.target,device:e.device,udid:e.udid,serial:e.serial,iosSimulatorDeviceSet:e.iosSimulatorDeviceSet,iosXctestrunFile:e.iosXctestrunFile,iosXctestDerivedDataPath:e.iosXctestDerivedDataPath,iosXctestEnvDir:e.iosXctestEnvDir,androidDeviceAllowlist:e.androidDeviceAllowlist})}function t0(e){return{platform:e.platform,target:e.target,device:e.device,udid:e.udid,serial:e.serial,iosSimulatorDeviceSet:e.iosSimulatorDeviceSet,androidDeviceAllowlist:e.androidDeviceAllowlist}}function t1(e){return tW({depth:e.snapshotDepth,scope:e.snapshotScope,raw:e.snapshotRaw})}function t2(e){return{depth:e.snapshotDepth,scope:e.snapshotScope,raw:e.snapshotRaw}}function t5(e){return tW({count:e.count,intervalMs:e.intervalMs,holdMs:e.holdMs,jitterPx:e.jitterPx,doubleTap:e.doubleTap})}function t3(e){return"ref"in e&&void 0!==e.ref?tW({kind:"ref",ref:e.ref,label:e.label}):"selector"in e&&void 0!==e.selector?{kind:"selector",selector:e.selector}:{kind:"point",x:e.x,y:e.y}}function t4(e){let t=t8(e);if("string"==typeof t.ref)return[t.ref,...t9(t.label)];if("string"==typeof t.selector)return[t.selector];if("point"===t.kind||void 0!==t.x||void 0!==t.y)return[String(t6(t.x,"x")),String(t6(t.y,"y"))];throw new A("INVALID_ARGS","interaction requires @ref, selector, or point target")}function t8(e){if(!e||"object"!=typeof e||Array.isArray(e))throw new A("INVALID_ARGS","Expected target object.");let t=e.target;return t&&"object"==typeof t&&!Array.isArray(t)?t:e}function t6(e,t){if("number"!=typeof e||!Number.isFinite(e))throw new A("INVALID_ARGS",`point target requires numeric ${t}.`);return e}function t9(e){return"string"==typeof e&&e.length>0?[e]:[]}function t7(...e){return new Set(e)}function re(e,t){return void 0!==e&&t.has(e)}function rt(e){return void 0!==e&&""!==e.trim()&&Number.isFinite(Number(e))}function rr(e){return void 0===e?void 0:Number(e)}function rn(e){return void 0===e?[]:[e]}function ri(e){return void 0===e?[]:[String(e)]}function ra(e,t){if(void 0===e||""===e)throw new A("INVALID_ARGS",t);return e}function ro(e,t){if("string"!=typeof e||0===e.length)throw new A("INVALID_ARGS",t);return e}function rs(e){let t={},r={},n={},i={};for(let a of e.commands){if(a.cliSchema&&rl(t,"CLI schema",a.name,a.cliSchema),rl(r,"CLI reader",a.name,a.cliReader),a.daemonWriter&&rl(n,"daemon writer",a.name,a.daemonWriter),a.extraDaemonWriters)for(let[e,t]of Object.entries(a.extraDaemonWriters))rl(n,"daemon writer",e,t);a.cliOutputFormatter&&rl(i,"CLI output formatter",a.name,a.cliOutputFormatter)}return{name:e.name,clientSurface:e.clientSurface,metadata:e.commands.map(e=>e.metadata),definitions:e.commands.map(e=>e.definition),cliSchemas:t,cliReaders:r,daemonWriters:n,cliOutputFormatters:i}}function rl(e,t,r,n){if(Object.hasOwn(e,r))throw Error(`Duplicate command family ${t}: ${r}`);e[r]=n}function ru(e,t){return{...e,run:t,invoke:async(r,n)=>await t(r,e.readInput(n))}}function rc(e){return e?{message:e}:{}}function rd(e,t){return t?{...e,message:t}:e}function rp(e){return"string"==typeof e?.message&&e.message.length>0?e.message:null}function rm(e){return({result:t})=>e(t)}let rf=rm(rh);function rh(e){return{data:e,text:rp(e)}}let rg={batch:rm(function(e){let t=[`Batch completed: ${e.executed}/${e.total} steps in ${e.totalDurationMs}ms`];for(let r of e.results)t.push(function(e){let t=rp(e.data)??e.command;return`${e.step}. OK ${t} (${e.durationMs}ms)`}(r));return{data:e,text:t.join("\n")}})},ry=e=>Error(e),rb=["screenshotFullscreen","screenshotMaxSize","screenshotNoStabilize","screenshotNormalizeStatusBar"];function rv(e){return rk({overlayRefs:e?.overlayRefs,fullscreen:e?.screenshotFullscreen,maxSize:e?.screenshotMaxSize,stabilize:!e?.screenshotNoStabilize&&void 0,normalizeStatusBar:e?.screenshotNormalizeStatusBar})}function rw(e={}){return rk({overlayRefs:e.overlayRefs,screenshotFullscreen:e.screenshotFullscreen??e.fullscreen,screenshotMaxSize:e.screenshotMaxSize??e.maxSize,screenshotNoStabilize:e.screenshotNoStabilize??(!1===e.stabilize||void 0),screenshotNormalizeStatusBar:e.screenshotNormalizeStatusBar??e.normalizeStatusBar})}function rx(e,t){t?.screenshotFullscreen&&e.push("--fullscreen"),"number"==typeof t?.screenshotMaxSize&&e.push("--max-size",String(t.screenshotMaxSize)),t?.screenshotNoStabilize&&e.push("--no-stabilize"),t?.screenshotNormalizeStatusBar&&e.push("--normalize-status-bar")}function rS(e){let{args:t,flags:r,index:n}=e,i=t[n];if("--fullscreen"===i||"--full"===i||"-f"===i)return r.screenshotFullscreen=!0,{handled:!0,nextIndex:n};if("--no-stabilize"===i)return r.screenshotNoStabilize=!0,{handled:!0,nextIndex:n};if("--normalize-status-bar"===i)return r.screenshotNormalizeStatusBar=!0,{handled:!0,nextIndex:n};if("--max-size"===i){let e=t[n+1],i=void 0===e?NaN:Number(e);if(!Number.isInteger(i)||i<1)throw new A("INVALID_ARGS","screenshot --max-size requires a positive integer");return r.screenshotMaxSize=i,{handled:!0,nextIndex:n+1}}return{handled:!1}}function rk(e){return Object.fromEntries(Object.entries(e).filter(e=>void 0!==e[1]))}let rI=new Set(["healthy","recovered","sparse"]),rD=new Set(["tree","queries","private-ax"]),rA=new Set(["ax-rejected","sparse-tree","budget","no-nodes","capture-failed"]);function r$(e){if(e&&"object"==typeof e){if("string"==typeof e.state&&rI.has(e.state)&&"string"==typeof e.backend&&rD.has(e.backend))return{state:e.state,backend:e.backend,reason:"string"==typeof e.reason?e.reason:void 0,reasonCode:"string"==typeof e.reasonCode&&rA.has(e.reasonCode)?e.reasonCode:void 0,effectiveDepth:"number"==typeof e.effectiveDepth?e.effectiveDepth:void 0,collapsedLeafIndexes:Array.isArray(e.collapsedLeafIndexes)?e.collapsedLeafIndexes.filter(e=>"number"==typeof e):void 0}}}function rM(e){return e?.state==="sparse"}function rR(e,t){var r;return[...function(e){if("recovered"===e.state){let t="budget"===e.reasonCode?" The primary capture ran out of its time budget (busy app or simulator); the recovered tree is authoritative for this screen.":" This usually means the app publishes an unhealthy accessibility tree — fixing the app's accessibility is the real cure. Treat screenshot as visual truth when this warning appears.";return[`Recovered this snapshot with the ${e.backend} accessibility backend`+(e.reason?` after: ${e.reason}.`:".")+t]}return"sparse"===e.state?["No snapshot backend could read this screen"+(e.reason?` (${e.reason})`:"")+". Use screenshot as visual truth and coordinate taps; retry snapshot after navigating."]:[]}(e),...void 0===(r=e).effectiveDepth?[]:[`The accessibility server rejected deeper requests; this tree is capped at depth ${r.effectiveDepth} — re-run with --depth ${r.effectiveDepth} --scope <container> for deeper content.`],...function(e,t){let r=[];for(let n of e.collapsedLeafIndexes??[]){let e=t.find(e=>e.index===n);if(!e)continue;let i=e.identifier?` (${e.identifier})`:"";r.push(`@${e.ref} [${e.type??"element"}]${i} merges many labels into a single accessibility element. The app likely marks a container as accessible, which hides every descendant from assistive tech and automation — the children cannot be addressed individually. Fix the app's accessibility (mark the rows, not the container); until then use screenshot as visual truth and coordinate taps.`)}return r}(e,t)]}function rN(e){let t=r$(e.quality);return{...e.analysis?{analysis:e.analysis}:{},...e.androidSnapshot?{androidSnapshot:e.androidSnapshot}:{},...e.freshness?{freshness:e.freshness}:{},...t?{quality:t}:{},...e.warnings?{warnings:e.warnings}:{}}}function rL(e){return{...e.androidSnapshot?{androidSnapshot:e.androidSnapshot}:{},...e.quality?{snapshotQuality:e.quality}:{},...e.warnings&&e.warnings.length>0?{warnings:e.warnings}:{}}}function rO(e){var t;let r="object"==typeof(t=e.androidSnapshot)&&null!==t?t:void 0,n=Array.isArray(e.warnings)?e.warnings.filter(e=>"string"==typeof e):void 0,i=r$(e.snapshotQuality);return rL({...r?{androidSnapshot:r}:{},...i?{quality:i}:{},...n?{warnings:n}:{}})}function rP(e){let t=e.appId??e.bundleId??e.packageName;return{session:e.session,appId:t,appBundleId:e.bundleId,package:e.packageName}}function rC(e,t,r){return{deviceId:t,deviceName:r,..."android"===e?{serial:t}:"ios"===e?{udid:t}:{}}}function rF(e,t={}){let r=t.includeAndroidSerial??!0;return{platform:e.platform,target:e.target,device:e.name,id:e.id,..."ios"===e.platform?{device_udid:e.ios?.udid??e.id,ios_simulator_device_set:e.ios?.simulatorSetPath??null}:{},..."android"===e.platform&&r?{serial:e.android?.serial??e.id}:{}}}function rE(e){return{name:e.name,...e.sessionStateDir?{sessionStateDir:e.sessionStateDir}:{},...e.runnerLogPath?{runnerLogPath:e.runnerLogPath}:{},...rF(e.device,{includeAndroidSerial:!1}),createdAt:e.createdAt}}function rT(e){return{platform:e.platform,id:e.id,name:e.name,kind:e.kind,target:e.target,..."boolean"==typeof e.booted?{booted:e.booted}:{}}}function r_(e){return e.bundleId??e.package??e.app}function rj(e){return e.appName??e.bundleId??e.packageName??e.launchTarget}function rU(e,t){let r=E(e,"bundleId"),n=E(e,"package");return{app:$(e,"app"),appPath:$(e,"appPath"),platform:T(e,"platform"),appId:r??n,bundleId:r,package:n,identifiers:rP({session:t,bundleId:r,packageName:n})}}function rB(e,t){let r=E(e,"bundleId"),n=E(e,"packageName"),i=r??n??E(e,"appId"),a=E(e,"launchTarget")??n??r??i;if(!a)throw new A("COMMAND_FAILED",'Daemon response is missing "launchTarget".',{response:e});return{appName:E(e,"appName"),appId:i,bundleId:r,packageName:n,launchTarget:a,installablePath:E(e,"installablePath"),archivePath:E(e,"archivePath"),materializationId:E(e,"materializationId"),materializationExpiresAt:E(e,"materializationExpiresAt"),identifiers:rP({session:t,bundleId:r,packageName:n,appId:i})}}function rV(e){return{released:!0===e.released,materializationId:$(e,"materializationId"),identifiers:{}}}function rz(e){let{record:t,platform:r,id:n,name:i,target:a}=rW(e,"name"),o=rG(t);return{platform:r,target:a,kind:_(t,"kind"),id:n,name:i,booted:"boolean"==typeof t.booted?t.booted:void 0,...v(r)&&o?{appleOs:o}:{},identifiers:rC(r,n,i),...rH(r,n)}}function rq(e){let{record:t,platform:r,id:n,name:i,target:a}=rW(e,"name"),o=$(t,"device"),s=rG(t),l={session:i,...rC(r,n,o)};return{name:i,createdAt:F(t,"createdAt"),sessionStateDir:E(t,"sessionStateDir"),runnerLogPath:E(t,"runnerLogPath"),device:{platform:r,target:a,id:n,name:o,...s?{appleOs:s}:{},identifiers:l,...rH(r,n,M(t,"ios_simulator_device_set"))},identifiers:l}}function rG(e){let t=e.appleOs;return f(t)?t:void 0}function rW(e,t){let r=O(e);return{record:r,platform:T(r,"platform"),id:$(r,"id"),name:$(r,t),target:N(r,"target")}}function rH(e,t,r){return{ios:"ios"===e?{udid:t,...void 0!==r?{simulatorSetPath:r}:{}}:void 0,android:"android"===e?{serial:t}:void 0}}function rK(e){if(!H(e))return;let t=e.platform,r=E(e,"metroHost"),n="number"==typeof e.metroPort?e.metroPort:void 0;return{platform:"ios"===t||"android"===t?t:void 0,metroHost:r,metroPort:n,bundleUrl:E(e,"bundleUrl"),launchUrl:E(e,"launchUrl")}}function rX(e){let t=e.platform,r=E(e,"id"),n=E(e,"device");if(!k(t)||!r||!n)return;let i=N(e,"target"),a=rC(t,r,n);return{platform:t,target:i,id:r,name:n,identifiers:a,ios:"ios"===t?{udid:E(e,"device_udid")??r,simulatorSetPath:M(e,"ios_simulator_device_set")}:void 0,android:"android"===t?{serial:E(e,"serial")??r}:void 0}}function rJ(e){if(H(e)&&"number"==typeof e.durationMs&&"string"==typeof e.measuredAt&&"string"==typeof e.method)return{durationMs:e.durationMs,measuredAt:e.measuredAt,method:e.method,appTarget:E(e,"appTarget"),appBundleId:E(e,"appBundleId")}}function rY(e){if(!H(e)||"boolean"!=typeof e.success||"number"!=typeof e.exitCode||"string"!=typeof e.stdout||"string"!=typeof e.stderr)return;let t=function(e){if(H(e)&&"string"==typeof e.code&&"string"==typeof e.message)return{code:e.code,message:e.message,..."string"==typeof e.hint?{hint:e.hint}:{},..."string"==typeof e.diagnosticId?{diagnosticId:e.diagnosticId}:{},..."string"==typeof e.logPath?{logPath:e.logPath}:{},...H(e.details)?{details:e.details}:{}}}(e.error);return{success:e.success,exitCode:e.exitCode,stdout:e.stdout,stderr:e.stderr,...t?{error:t}:{}}}function rQ(e){return Array.isArray(e)?e:[]}function rZ(e){let t=tr(e);return U({requestId:e.requestId,cwd:e.cwd,sessionExplicit:void 0!==e.session,debug:e.debug,includeCost:e.cost,responseLevel:e.responseLevel,lockPolicy:e.lockPolicy,lockPlatform:e.lockPlatform,...U({tenantId:t.tenantId,runId:t.runId,leaseId:t.leaseId,leaseTtlMs:t.leaseTtlMs,leaseBackend:t.leaseBackend,leaseProvider:t.leaseProvider,deviceKey:t.deviceKey,clientId:t.clientId}),sessionIsolation:e.sessionIsolation,installSource:e.installSource,retainMaterializedPaths:e.retainMaterializedPaths,materializedPathRetentionMs:e.materializedPathRetentionMs,materializationId:e.materializationId})}function r0(e){return e??"default"}function r1(e,t){return e.includes(t)}function r2(e,t,r={}){let n=void 0===t?void 0:r.normalize?.(t)??t;if(void 0!==n&&r1(e,n))return n;throw new A("INVALID_ARGS",("function"==typeof r.message?r.message(t):r.message)??`Invalid value: ${t}. Use ${e.join("|")}.`)}function r5(e,t={}){return{values:e,is:t=>r1(e,t),parse:r=>r2(e,r,t)}}let r3=["app","frontmost-app","desktop","menubar"],r4=r5(r3,{normalize:e=>e.trim().toLowerCase(),message:e=>`Invalid surface: ${e}. Use ${r3.join("|")}.`});function r8(e){return r4.parse(e)}let r6=["metrics","frames","memory","cpu","trace"],r9=["sample","snapshot","start","stop","report"],r7=["profile"],ne=["xctrace","simpleperf","perfetto","android-hprof","memgraph"],nt=r5(r6),nr=r5(r9),nn=r5(r7),ni=r5(ne),na=r5(["android-hprof","memgraph"]),no="perf area must be metrics, frames, memory, cpu, or trace",ns="perf action must be sample, snapshot, start, stop, or report",nl="perf cpu requires profile",nu="perf --kind must be xctrace, simpleperf, perfetto, android-hprof, or memgraph",nc="perf memory snapshot --kind must be android-hprof or memgraph",nd=nt.is,np=nr.is,nm=nn.is,nf=ni.is,nh=na.is,ng="https://github.com/callstack/agent-device/issues/558",ny="https://github.com/callstack/agent-device/issues/new";function nb(...e){return e}let nv=nb("snapshotInteractiveOnly","snapshotDepth","snapshotScope","snapshotRaw"),nw=nb("snapshotDepth","snapshotScope","snapshotRaw"),nx=nb("metroProjectRoot","kind","metroKind","metroPublicBaseUrl","metroProxyBaseUrl","metroBearerToken","metroPreparePort","metroListenHost","metroStatusHost","metroStartupTimeoutMs","metroProbeTimeoutMs","metroRuntimeFile","metroNoReuseExisting","metroNoInstallDeps"),nS=nb("metroHost","metroPort","bundleUrl"),nk=nb("count","intervalMs","holdMs","jitterPx","doubleTap"),nI=nb("replayUpdate","replayEnv"),nD=[{key:"config",names:["--config"],type:"string",usageLabel:"--config <path>",usageDescription:"Load CLI defaults from a specific config file"},{key:"remoteConfig",names:["--remote-config"],type:"string",usageLabel:"--remote-config <path>",usageDescription:"Load remote host + Metro workflow settings from a specific profile file"},{key:"stateDir",names:["--state-dir"],type:"string",usageLabel:"--state-dir <path>",usageDescription:"Daemon state directory (defaults to ~/.agent-device for packages, or a worktree-scoped dev dir from source)"},{key:"daemonBaseUrl",names:["--daemon-base-url"],type:"string",usageLabel:"--daemon-base-url <url>",usageDescription:"Explicit remote HTTP daemon base URL (skip local daemon discovery/startup)"},{key:"daemonAuthToken",names:["--daemon-auth-token"],type:"string",usageLabel:"--daemon-auth-token <token>",usageDescription:"Remote HTTP daemon or proxy auth token (sent as request token and bearer header)"},{key:"daemonTransport",names:["--daemon-transport"],type:"enum",enumValues:["auto","socket","http"],usageLabel:"--daemon-transport auto|socket|http",usageDescription:"Daemon client transport preference"},{key:"daemonServerMode",names:["--daemon-server-mode"],type:"enum",enumValues:["socket","http","dual"],usageLabel:"--daemon-server-mode socket|http|dual",usageDescription:"Daemon server mode used when spawning daemon"},{key:"proxyHost",names:["--host"],type:"string",usageLabel:"--host <host>",usageDescription:"Proxy: host interface to bind (default: 127.0.0.1)"},{key:"proxyPort",names:["--port"],type:"int",min:1,max:65535,usageLabel:"--port <port>",usageDescription:"Proxy: TCP port to bind (default: 0, choose a free port)"},{key:"tenant",names:["--tenant"],type:"string",usageLabel:"--tenant <id>",usageDescription:"Tenant scope identifier for isolated daemon sessions"},{key:"sessionIsolation",names:["--session-isolation"],type:"enum",enumValues:["none","tenant"],usageLabel:"--session-isolation none|tenant",usageDescription:"Session isolation strategy (tenant prefixes session namespace)"},{key:"runId",names:["--run-id"],type:"string",usageLabel:"--run-id <id>",usageDescription:"Run identifier used for tenant lease admission checks"},{key:"leaseId",names:["--lease-id"],type:"string",usageLabel:"--lease-id <id>",usageDescription:"Lease identifier bound to tenant/run admission scope"},{key:"leaseBackend",names:["--lease-backend"],type:"enum",enumValues:["ios-simulator","ios-instance","android-instance"],usageLabel:"--lease-backend ios-simulator|ios-instance|android-instance",usageDescription:"Lease backend for remote tenant connection admission"},{key:"provider",names:["--provider"],type:"string",usageLabel:"--provider <name>",usageDescription:"Cloud provider name for provider-scoped commands"},{key:"providerSessionId",names:["--provider-session"],type:"string",usageLabel:"--provider-session <id>",usageDescription:"Cloud provider session id or ARN"},{key:"providerApp",names:["--provider-app"],type:"string",usageLabel:"--provider-app <ref-or-path>",usageDescription:"Cloud provider app reference or local app path used when creating hosted WebDriver sessions"},{key:"providerOsVersion",names:["--provider-os-version","--os-version"],type:"string",usageLabel:"--provider-os-version <version>",usageDescription:"Hosted cloud provider OS version, for example 17 or 14.0"},{key:"providerProject",names:["--provider-project"],type:"string",usageLabel:"--provider-project <name>",usageDescription:"Hosted cloud provider project label"},{key:"providerBuild",names:["--provider-build"],type:"string",usageLabel:"--provider-build <name>",usageDescription:"Hosted cloud provider build label"},{key:"providerSessionName",names:["--provider-session-name"],type:"string",usageLabel:"--provider-session-name <name>",usageDescription:"Hosted cloud provider session label"},{key:"awsProjectArn",names:["--aws-project-arn"],type:"string",usageLabel:"--aws-project-arn <arn>",usageDescription:"AWS Device Farm project ARN for hosted WebDriver sessions"},{key:"awsDeviceArn",names:["--aws-device-arn"],type:"string",usageLabel:"--aws-device-arn <arn>",usageDescription:"AWS Device Farm device ARN for hosted WebDriver sessions"},{key:"awsAppArn",names:["--aws-app-arn"],type:"string",usageLabel:"--aws-app-arn <arn>",usageDescription:"AWS Device Farm app ARN attached to hosted remote access sessions"},{key:"awsRegion",names:["--aws-region"],type:"string",usageLabel:"--aws-region <region>",usageDescription:"AWS region for Device Farm API calls"},{key:"awsInteractionMode",names:["--aws-interaction-mode"],type:"enum",enumValues:["INTERACTIVE","NO_VIDEO","VIDEO_ONLY"],usageLabel:"--aws-interaction-mode INTERACTIVE|NO_VIDEO|VIDEO_ONLY",usageDescription:"AWS Device Farm remote access interaction mode"},{key:"force",names:["--force"],type:"boolean",usageLabel:"--force",usageDescription:"Force connection state replacement when reconnecting"},{key:"noLogin",names:["--no-login"],type:"boolean",usageLabel:"--no-login",usageDescription:"Connect: fail instead of starting implicit cloud login"},{key:"sessionLock",names:["--session-lock"],type:"enum",enumValues:["reject","strip"],usageLabel:"--session-lock reject|strip",usageDescription:"Lock bound-session device routing for this CLI invocation and nested batch steps"},{key:"sessionLocked",names:["--session-locked"],type:"boolean",usageLabel:"--session-locked",usageDescription:"Deprecated alias for --session-lock reject"},{key:"sessionLockConflicts",names:["--session-lock-conflicts"],type:"enum",enumValues:["reject","strip"],usageLabel:"--session-lock-conflicts reject|strip",usageDescription:"Deprecated alias for --session-lock"},{key:"platform",names:["--platform"],type:"enum",enumValues:S,usageLabel:`--platform ${S.join("|")}`,usageDescription:"Platform to target (`apple` aliases the Apple automation backend)"},{key:"target",names:["--target"],type:"enum",enumValues:["mobile","tv","desktop"],usageLabel:"--target mobile|tv|desktop",usageDescription:"Device target class to match"},{key:"device",names:["--device"],type:"string",usageLabel:"--device <name>",usageDescription:"Device name to target"},{key:"udid",names:["--udid"],type:"string",usageLabel:"--udid <udid>",usageDescription:"iOS device UDID"},{key:"serial",names:["--serial"],type:"string",usageLabel:"--serial <serial>",usageDescription:"Android device serial"},{key:"surface",names:["--surface"],type:"enum",enumValues:r3,usageLabel:"--surface app|frontmost-app|desktop|menubar",usageDescription:"macOS session surface for open (defaults to app)"},{key:"headless",names:["--headless"],type:"boolean",usageLabel:"--headless",usageDescription:"Boot: launch Android emulator without a GUI window"},{key:"targetApp",names:["--app","--target-app"],type:"string",usageLabel:"--app <id-or-name>",usageDescription:"Doctor: verify an installed target app without opening a session"},{key:"metroHost",names:["--metro-host"],type:"string",usageLabel:"--metro-host <host>",usageDescription:"Session-scoped Metro/debug host hint"},{key:"metroPort",names:["--metro-port"],type:"int",min:1,max:65535,usageLabel:"--metro-port <port>",usageDescription:"Session-scoped Metro/debug port hint"},{key:"metroProjectRoot",names:["--project-root"],type:"string",usageLabel:"--project-root <path>",usageDescription:"metro prepare: React Native project root (default: cwd)"},{key:"kind",names:["--kind"],type:"enum",enumValues:["auto","react-native","expo",...ne],usageLabel:"--kind <kind>",usageDescription:"Kind selector for commands that support it, such as metro prepare or perf artifact collectors"},{key:"perfTemplate",names:["--template"],type:"string",usageLabel:"--template <name>",usageDescription:"Perf xctrace template name, for example Time Profiler"},{key:"metroKind",names:["--metro-kind"],type:"enum",enumValues:["auto","react-native","expo"],usageLabel:"--metro-kind auto|react-native|expo",usageDescription:"metro prepare: detect or force the Metro launcher kind"},{key:"metroPublicBaseUrl",names:["--public-base-url"],type:"string",usageLabel:"--public-base-url <url>",usageDescription:"metro prepare: public base URL used for direct bundle hints"},{key:"metroProxyBaseUrl",names:["--proxy-base-url"],type:"string",usageLabel:"--proxy-base-url <url>",usageDescription:"metro prepare: optional bridge origin for remote Metro access"},{key:"metroBearerToken",names:["--bearer-token"],type:"string",usageLabel:"--bearer-token <token>",usageDescription:"metro prepare: host bridge bearer token (or AGENT_DEVICE_METRO_BEARER_TOKEN; falls back to AGENT_DEVICE_DAEMON_AUTH_TOKEN)"},{key:"metroPreparePort",names:["--port"],type:"int",min:1,max:65535,usageLabel:"--port <port>",usageDescription:"metro prepare: local Metro port (default: 8081)"},{key:"metroListenHost",names:["--listen-host"],type:"string",usageLabel:"--listen-host <host>",usageDescription:"metro prepare: host Metro listens on (default: 0.0.0.0)"},{key:"metroStatusHost",names:["--status-host"],type:"string",usageLabel:"--status-host <host>",usageDescription:"metro prepare: host used for local /status polling (default: 127.0.0.1)"},{key:"metroStartupTimeoutMs",names:["--startup-timeout-ms"],type:"int",min:1,usageLabel:"--startup-timeout-ms <ms>",usageDescription:"metro prepare: timeout while waiting for Metro to become ready"},{key:"metroProbeTimeoutMs",names:["--probe-timeout-ms"],type:"int",min:1,usageLabel:"--probe-timeout-ms <ms>",usageDescription:"metro prepare: timeout for /status and proxy bridge calls"},{key:"metroRuntimeFile",names:["--runtime-file"],type:"string",usageLabel:"--runtime-file <path>",usageDescription:"metro prepare: optional file path to persist the JSON result"},{key:"metroNoReuseExisting",names:["--no-reuse-existing"],type:"boolean",usageLabel:"--no-reuse-existing",usageDescription:"metro prepare: always start a fresh Metro process"},{key:"metroNoInstallDeps",names:["--no-install-deps"],type:"boolean",usageLabel:"--no-install-deps",usageDescription:"metro prepare: skip package-manager install when node_modules is missing"},{key:"bundleUrl",names:["--bundle-url"],type:"string",usageLabel:"--bundle-url <url>",usageDescription:"Session-scoped bundle URL hint"},{key:"launchUrl",names:["--launch-url"],type:"string",usageLabel:"--launch-url <url>",usageDescription:"Session-scoped deep link / launch URL hint"},{key:"iosSimulatorDeviceSet",names:["--ios-simulator-device-set"],type:"string",usageLabel:"--ios-simulator-device-set <path>",usageDescription:"Scope iOS simulator discovery/commands to this simulator device set"},{key:"iosXctestrunFile",names:["--ios-xctestrun-file"],type:"string",usageLabel:"--ios-xctestrun-file <path>",usageDescription:"Use an externally built iOS XCTest runner .xctestrun artifact"},{key:"iosXctestDerivedDataPath",names:["--ios-xctest-derived-data-path"],type:"string",usageLabel:"--ios-xctest-derived-data-path <path>",usageDescription:"Derived data path for external iOS XCTest runner execution"},{key:"iosXctestEnvDir",names:["--ios-xctest-env-dir"],type:"string",usageLabel:"--ios-xctest-env-dir <path>",usageDescription:"Writable directory for per-session iOS XCTest runner env overlays"},{key:"deviceHub",names:["--device-hub"],type:"boolean",usageLabel:"--device-hub",usageDescription:"open: use Xcode Device Hub when surfacing Apple simulators"},{key:"androidDeviceAllowlist",names:["--android-device-allowlist"],type:"string",usageLabel:"--android-device-allowlist <serials>",usageDescription:"Comma/space separated Android serial allowlist for discovery/selection"},{key:"remote",names:["--remote"],type:"boolean",usageLabel:"--remote",usageDescription:"Doctor: check remote connection setup instead of local device inventory"},{key:"activity",names:["--activity"],type:"string",usageLabel:"--activity <component>",usageDescription:"Android app launch activity (package/Activity); not for URL opens"},{key:"launchConsole",names:["--launch-console"],type:"string",usageLabel:"--launch-console <path>",usageDescription:"open: capture the initial iOS simulator launch console window to a file"},{key:"launchArgs",names:["--launch-args"],type:"string",multiple:!0,usageLabel:"--launch-args <arg>",usageDescription:"open: repeatable launch argument forwarded verbatim to the platform launch command (iOS app process args; Android adb shell am start args). Linux and macOS reject the flag."},{key:"header",names:["--header"],type:"string",multiple:!0,usageLabel:"--header <name:value>",usageDescription:"install-from-source: repeatable HTTP header for URL downloads"},{key:"githubActionsArtifact",names:["--github-actions-artifact"],type:"string",usageLabel:"--github-actions-artifact <owner/repo:artifact>",usageDescription:"install-from-source: GitHub Actions artifact resolved by a remote daemon"},{key:"installSource",names:[],type:"string"},{key:"session",names:["--session"],type:"string",usageLabel:"--session <name>",usageDescription:"Named session"},{key:"count",names:["--count"],type:"int",min:1,max:200,usageLabel:"--count <n>",usageDescription:"Repeat count for press/swipe series"},{key:"fps",names:["--fps"],type:"int",min:1,max:120,usageLabel:"--fps <n>",usageDescription:"Record: target frames per second (iOS physical device runner)"},{key:"quality",names:["--quality"],type:"string",usageLabel:"--quality <medium|high>",usageDescription:"Record: output quality preset; Android maps this to screenrecord bitrate, Apple targets use it for export/encoding. Legacy numeric values 5-7 map to medium; 8-10 map to high"},{key:"hideTouches",names:["--hide-touches"],type:"boolean",usageLabel:"--hide-touches",usageDescription:"Record: skip touch-overlay post-processing for faster raw benchmark videos"},{key:"intervalMs",names:["--interval-ms"],type:"int",min:0,max:1e4,usageLabel:"--interval-ms <ms>",usageDescription:"Delay between press iterations"},{key:"delayMs",names:["--delay-ms"],type:"int",min:0,max:1e4,usageLabel:"--delay-ms <ms>",usageDescription:"Delay between typed characters"},{key:"durationMs",names:["--duration-ms"],type:"int",min:0,max:1e4,usageLabel:"--duration-ms <ms>",usageDescription:"Scroll: pace the gesture over this duration when supported"},{key:"holdMs",names:["--hold-ms"],type:"int",min:0,max:1e4,usageLabel:"--hold-ms <ms>",usageDescription:"Press hold duration for each iteration"},{key:"jitterPx",names:["--jitter-px"],type:"int",min:0,max:100,usageLabel:"--jitter-px <n>",usageDescription:"Deterministic coordinate jitter radius for press"},{key:"pixels",names:["--pixels"],type:"int",min:1,max:1e5,usageLabel:"--pixels <n>",usageDescription:"Scroll: explicit gesture distance in pixels"},{key:"doubleTap",names:["--double-tap"],type:"boolean",usageLabel:"--double-tap",usageDescription:"Use double-tap gesture per press iteration"},{key:"clickButton",names:["--button"],type:"enum",enumValues:["primary","secondary","middle"],usageLabel:"--button primary|secondary|middle",usageDescription:"Click: choose mouse button (middle reserved for future macOS support)"},{key:"backMode",names:["--in-app"],type:"enum",enumValues:["in-app","system"],setValue:"in-app",usageLabel:"--in-app",usageDescription:"Back: use app-provided back UI when available"},{key:"backMode",names:["--system"],type:"enum",enumValues:["in-app","system"],setValue:"system",usageLabel:"--system",usageDescription:"Back: use system back input or gesture when available"},{key:"pauseMs",names:["--pause-ms"],type:"int",min:0,max:1e4,usageLabel:"--pause-ms <ms>",usageDescription:"Delay between swipe iterations"},{key:"pattern",names:["--pattern"],type:"enum",enumValues:["one-way","ping-pong"],usageLabel:"--pattern one-way|ping-pong",usageDescription:"Swipe repeat pattern"},{key:"verbose",names:["--debug","--verbose","-v"],type:"boolean",usageLabel:"--debug, --verbose, -v",usageDescription:"Enable debug diagnostics; test --verbose prints per-test step timings without debug logs"},{key:"cost",names:["--cost"],type:"boolean",usageLabel:"--cost",usageDescription:"Include per-command wall-clock latency (cost.wallClockMs) in the response"},{key:"responseLevel",names:["--level"],type:"enum",enumValues:g,usageLabel:"--level digest|default|full",usageDescription:"Response detail level: digest (token-cheap), default (today), or full. Default keeps the wire shape unchanged."},{key:"json",names:["--json"],type:"boolean",usageLabel:"--json",usageDescription:"JSON output"},{key:"help",names:["--help","-h"],type:"boolean",usageLabel:"--help, -h",usageDescription:"Print help and exit"},{key:"version",names:["--version","-V"],type:"boolean",usageLabel:"--version, -V",usageDescription:"Print version and exit"},{key:"snapshotDiff",names:["--diff"],type:"boolean",usageLabel:"--diff",usageDescription:"Snapshot: show structural diff against the previous session baseline"},{key:"saveScript",names:["--save-script"],type:"booleanOrString",usageLabel:"--save-script [path]",usageDescription:"Save session script (.ad) on close; optional custom output path"},{key:"networkInclude",names:["--include"],type:"enum",enumValues:["summary","headers","body","all"],usageLabel:"--include summary|headers|body|all",usageDescription:"Network: include headers, bodies, or both in output"},{key:"shutdown",names:["--shutdown"],type:"boolean",usageLabel:"--shutdown",usageDescription:"close: shutdown associated simulator/emulator after ending session"},{key:"relaunch",names:["--relaunch"],type:"boolean",usageLabel:"--relaunch",usageDescription:"open: terminate app process before launching it"},{key:"restart",names:["--restart"],type:"boolean",usageLabel:"--restart",usageDescription:"logs clear: stop active stream, clear logs, then start streaming again"},{key:"retainPaths",names:["--retain-paths"],type:"boolean",usageLabel:"--retain-paths",usageDescription:"install-from-source: keep materialized artifact paths after install"},{key:"retentionMs",names:["--retention-ms"],type:"int",min:1,usageLabel:"--retention-ms <ms>",usageDescription:"install-from-source: retention TTL for materialized artifact paths"},{key:"noRecord",names:["--no-record"],type:"boolean",usageLabel:"--no-record",usageDescription:"Do not record this action"},{key:"replayUpdate",names:["--update","-u"],type:"boolean",usageLabel:"--update, -u",usageDescription:"Replay: update selectors and rewrite replay file in place"},{key:"replayMaestro",names:["--maestro"],type:"boolean",usageLabel:"--maestro",usageDescription:`Replay: treat input as a Maestro YAML compatibility flow. Supported subset: ${(e=["app launch with Apple-platform launch arguments and Android/iOS simulator clearState","runFlow file/inline with when.platform, when.visible, when.notVisible, and limited when.true boolean/platform expressions","onFlowStart and onFlowComplete hooks","deterministic repeat.times","tapOn including optional, index, childOf, label, and absolute/percentage point taps","doubleTapOn and longPressOn","inputText, focused-field eraseText, and pasteText","openLink","visibility assertions and extendedWaitUntil","scroll and scrollUntilVisible","absolute/percentage swipe and swipe.label","screenshots","keyboard dismiss","basic pressKey, back, animation waits, and stopApp","ordered trusted runScript file/env scripts with http.post, json, and output variables"]).length>1?`${e.slice(0,-1).join(", ")}, and ${e.at(-1)}`:e[0]??""}. Unsupported syntax fails loudly with a link to ${ng}`},{key:"replayExportFormat",names:["--format"],type:"enum",enumValues:["maestro"],usageLabel:"--format maestro",usageDescription:"Replay export: output format"},{key:"replayEnv",names:["-e","--env"],type:"string",multiple:!0,usageLabel:"-e KEY=VALUE, --env KEY=VALUE",usageDescription:"Replay/Test: inject or override a ${KEY} variable for the script (repeatable)"},{key:"failFast",names:["--fail-fast"],type:"boolean",usageLabel:"--fail-fast",usageDescription:"Test: stop the suite after the first failing script; with sharding, each shard stops independently"},{key:"timeoutMs",names:["--timeout"],type:"int",min:1,usageLabel:"--timeout <ms>",usageDescription:"Prepare/Replay/Snapshot/Test: maximum wall-clock time for the command or attempt"},{key:"retries",names:["--retries"],type:"int",min:0,max:3,usageLabel:"--retries <n>",usageDescription:"Test: retry each failed script up to n additional times"},{key:"recordVideo",names:["--record-video"],type:"boolean",usageLabel:"--record-video",usageDescription:"Test: record each replay attempt to recording.mp4 in its attempt artifacts"},{key:"artifactsDir",names:["--artifacts-dir"],type:"string",usageLabel:"--artifacts-dir <path>",usageDescription:"Test: root directory for suite artifacts"},{key:"reporter",names:["--reporter"],type:"string",multiple:!0,usageLabel:"--reporter <name-or-path>",usageDescription:"Test: add a replay suite reporter; use default, junit:<path>, or a custom reporter path (repeatable)"},{key:"reportJunit",names:["--report-junit"],type:"string",usageLabel:"--report-junit <path>",usageDescription:"Test: compatibility alias for --reporter junit:<path>"},{key:"shardAll",names:["--shard-all"],type:"int",min:1,usageLabel:"--shard-all <n>",usageDescription:"Test: run the full suite on each of n devices; combine with --device id1,id2 for explicit connected devices; AD_SHARD_INDEX is zero-based"},{key:"shardSplit",names:["--shard-split"],type:"int",min:1,usageLabel:"--shard-split <n>",usageDescription:"Test: split runnable suite entries across n devices; AD_SHARD_INDEX is zero-based"},{key:"steps",names:["--steps"],type:"string",usageLabel:"--steps <json>",usageDescription:"Batch: JSON array of steps"},{key:"stepsFile",names:["--steps-file"],type:"string",usageLabel:"--steps-file <path>",usageDescription:"Batch: read steps JSON from file"},{key:"batchOnError",names:["--on-error"],type:"enum",enumValues:["stop"],usageLabel:"--on-error stop",usageDescription:"Batch: stop when a step fails"},{key:"batchMaxSteps",names:["--max-steps"],type:"int",min:1,max:1e3,usageLabel:"--max-steps <n>",usageDescription:"Batch: maximum number of allowed steps"},{key:"appsFilter",names:["--all"],type:"enum",enumValues:["user-installed","all"],setValue:"all",usageLabel:"--all",usageDescription:"Apps: include system/OEM apps"},{key:"snapshotInteractiveOnly",names:["-i"],type:"boolean",usageLabel:"-i",usageDescription:"Snapshot: interactive elements only"},{key:"snapshotDepth",names:["--depth","-d"],type:"int",min:0,usageLabel:"--depth, -d <depth>",usageDescription:"Snapshot: limit snapshot depth"},{key:"snapshotScope",names:["--scope","-s"],type:"string",usageLabel:"--scope, -s <scope>",usageDescription:"Snapshot: scope snapshot to label/identifier"},{key:"snapshotRaw",names:["--raw"],type:"boolean",usageLabel:"--raw",usageDescription:"Snapshot: raw node output"},{key:"snapshotForceFull",names:["--force-full"],type:"boolean",usageLabel:"--force-full",usageDescription:"Snapshot: re-emit the full tree even when unchanged"},{key:"findFirst",names:["--first"],type:"boolean",usageLabel:"--first",usageDescription:"Find: pick the first match when ambiguous"},{key:"findLast",names:["--last"],type:"boolean",usageLabel:"--last",usageDescription:"Find: pick the last match when ambiguous"},{key:"out",names:["--out"],type:"string",usageLabel:"--out <path>",usageDescription:"Output path"},{key:"artifact",names:["--artifact"],type:"string",usageLabel:"--artifact <path>",usageDescription:"Debug symbols: Apple crash artifact path (.ips, .crash, or .log)"},{key:"dsym",names:["--dsym"],type:"string",usageLabel:"--dsym <path>",usageDescription:"Debug symbols: matching .dSYM bundle path"},{key:"searchPath",names:["--search-path"],type:"string",usageLabel:"--search-path <dir>",usageDescription:"Debug symbols: directory to scan for matching .dSYM bundles"},{key:"overlayRefs",names:["--overlay-refs"],type:"boolean",usageLabel:"--overlay-refs",usageDescription:"Screenshot: draw current snapshot refs and target rectangles onto the saved PNG; diff screenshot: also write a separate current-screen overlay guide"},{key:"screenshotFullscreen",names:["--fullscreen","--full","-f"],type:"boolean",usageLabel:"--fullscreen, --full, -f",usageDescription:"Screenshot: on web capture the full page; on macOS app sessions capture the full desktop instead of the app window"},{key:"screenshotMaxSize",names:["--max-size"],type:"int",min:1,usageLabel:"--max-size <px>",usageDescription:"Screenshot/record: downscale so the longest edge is at most <px>"},{key:"screenshotNoStabilize",names:["--no-stabilize"],type:"boolean",usageLabel:"--no-stabilize",usageDescription:"Screenshot: skip Android demo-mode/status-bar stabilization and settle delay for low-latency capture loops"},{key:"screenshotNormalizeStatusBar",names:["--normalize-status-bar"],type:"boolean",usageLabel:"--normalize-status-bar",usageDescription:"Screenshot: on iOS simulators temporarily normalize status-bar chrome for deterministic screenshot diffs"},{key:"baseline",names:["--baseline","-b"],type:"string",usageLabel:"--baseline, -b <path>",usageDescription:"Diff screenshot: path to baseline image file"},{key:"threshold",names:["--threshold"],type:"string",usageLabel:"--threshold <0-1>",usageDescription:"Diff screenshot: color distance threshold (default 0.1)"}],nA=nb("remoteConfig","stateDir","daemonBaseUrl","daemonAuthToken","daemonTransport","daemonServerMode","tenant","sessionIsolation","runId","leaseId","leaseBackend","sessionLock","sessionLocked","sessionLockConflicts","platform","target","device","providerApp","providerOsVersion","providerProject","providerBuild","providerSessionName","awsProjectArn","awsDeviceArn","awsAppArn","awsRegion","awsInteractionMode","udid","serial","iosSimulatorDeviceSet","iosXctestrunFile","iosXctestDerivedDataPath","iosXctestEnvDir","androidDeviceAllowlist","session","noRecord"),n$=new Set(["json","config","help","version","verbose","cost","responseLevel"]),nM=new Map;for(let e of nD)for(let t of e.names)nM.set(t,e);function nR(e){return nM.get(e)}function nN(){return nD}let nL=new Set(nN().map(e=>e.key));function nO(e,t){let r;return{...(r=tr(e),U({stateDir:e.stateDir,daemonBaseUrl:e.daemonBaseUrl,daemonAuthToken:e.daemonAuthToken,daemonTransport:e.daemonTransport,daemonServerMode:e.daemonServerMode,...tn(r),provider:e.provider,providerSessionId:e.providerSessionId,providerApp:e.providerApp,providerOsVersion:e.providerOsVersion,providerProject:e.providerProject,providerBuild:e.providerBuild,providerSessionName:e.providerSessionName,awsProjectArn:e.awsProjectArn,awsDeviceArn:e.awsDeviceArn,awsAppArn:e.awsAppArn,awsRegion:e.awsRegion,awsInteractionMode:e.awsInteractionMode,sessionIsolation:e.sessionIsolation,platform:e.platform,target:e.target,device:e.device,udid:e.udid,serial:e.serial,iosSimulatorDeviceSet:e.iosSimulatorDeviceSet,iosXctestrunFile:e.iosXctestrunFile,iosXctestDerivedDataPath:e.iosXctestDerivedDataPath,iosXctestEnvDir:e.iosXctestEnvDir,androidDeviceAllowlist:e.androidDeviceAllowlist,surface:e.surface,activity:e.activity,launchConsole:e.launchConsole,launchArgs:e.launchArgs,relaunch:e.relaunch,shutdown:e.shutdown,saveScript:e.saveScript,deviceHub:e.deviceHub,noRecord:e.noRecord,backMode:e.backMode,metroHost:e.metroHost,metroPort:e.metroPort,bundleUrl:e.bundleUrl,launchUrl:e.launchUrl,snapshotInteractiveOnly:e.interactiveOnly,snapshotDepth:e.depth,snapshotScope:e.scope,snapshotRaw:e.raw,snapshotForceFull:e.forceFull,...rw(e),appsFilter:e.appsFilter,kind:e.kind,out:e.out,count:e.count,fps:e.fps,screenshotMaxSize:e.maxSize,quality:e.quality,hideTouches:e.hideTouches,intervalMs:e.intervalMs,delayMs:e.delayMs,durationMs:e.durationMs,holdMs:e.holdMs,jitterPx:e.jitterPx,pixels:e.pixels,doubleTap:e.doubleTap,clickButton:e.clickButton,pauseMs:e.pauseMs,pattern:e.pattern,headless:e.headless,restart:e.restart,replayUpdate:e.replayUpdate,replayBackend:e.replayBackend,replayEnv:e.replayEnv,replayShellEnv:e.replayShellEnv,failFast:e.failFast,timeoutMs:e.timeoutMs,retries:e.retries,recordVideo:e.recordVideo,artifactsDir:e.artifactsDir,shardAll:e.shardAll,shardSplit:e.shardSplit,findFirst:e.findFirst,findLast:e.findLast,networkInclude:e.networkInclude,batchOnError:e.batchOnError,batchMaxSteps:e.batchMaxSteps,batchSteps:e.batchSteps,verbose:e.debug})),...t}}function nP(e,t){let r=e.inputSchema.properties;if(!r)return{};let n={};for(let e of Object.keys(r)){var i;if(!nL.has(e))continue;let r=t[e];("boolean"==typeof(i=r)||"number"==typeof i||"string"==typeof i)&&(n[e]=r)}return n}function nC(e){return t=>tQ(L.batch,[],{...t,batchSteps:function(e,t){if(!Array.isArray(e)||0===e.length)throw new A("INVALID_ARGS","batch requires a non-empty steps array.");return e.map((e,r)=>{var n,i,a,o,s;let l,u,c,d,p;return n=e,i=r+1,a=t,u=(o=l=V(n,i),s=i,j(o.command,s)),c=R(l,i),d=z(l.runtime,i),{command:(p=a(u,c,i)).command,positionals:p.positionals,flags:nO(p.options,p.metadataFlags),runtime:d??p.options.runtime}})}(t.steps,e),batchOnError:t.onError,batchMaxSteps:t.maxSteps})}let nF=function(e=P){var t;let r={steps:ty(tH({type:"array",description:"Structured batch steps. Each step uses a command name and the same input object as that command tool.",items:{type:"object",properties:{command:{type:"string",enum:t=e,description:"Command name to run with structured input."},input:{type:"object",additionalProperties:!0,description:"Structured command input for the nested command. Use the matching MCP tool schema for this object."},runtime:{type:"object",additionalProperties:!0,description:"Optional per-step runtime payload."}},required:["command","input"],additionalProperties:!1}},(e,r)=>(function(e,t){if(!Array.isArray(e))throw Error("Expected steps to be an array.");return e.map((e,r)=>{var n,i,a,o,s;let l,u;return n=e,i=r+1,a=t,!function(e,t,r){let n=new Set(t),i=Object.keys(e).filter(e=>!n.has(e));if(i.length>0)throw Error(`${r} has unknown field(s): ${i.join(", ")}.`)}(l=V(n,i,ry),["command","input","runtime"],`Batch step ${i}`),{command:function(e,t,r){if(r===P)return j(e.command,t);let n=e.command;if("string"!=typeof n||!r.includes(n))throw Error(`Expected command to be one of: ${r.join(", ")}.`);return n}(l,i,a),input:R(l,i,ry),...(o=l,s=i,void 0===(u=z(o.runtime,s,ry))?{}:{runtime:u})}})})(e[r],t))),onError:tS(["stop"],"Batch failure policy."),maxSteps:tw("Maximum number of steps accepted for this batch.",{min:1,max:1e3}),out:tb("Optional output path for command artifacts.")};return{name:"batch",description:"Run multiple structured command steps in one daemon request.",inputSchema:tR(r),readInput:e=>(function(e,t){let r=tN(e,t),n=r.maxSteps??100;if(!W(n))throw Error(`Invalid batch maxSteps: ${String(r.maxSteps)}`);return q(r.steps.length,n,ry),{...r}})(e,r)}}(),nE=ru(nF,(e,t)=>{var r;return e.batch.run({...tV(r=t),steps:r.steps,onError:r.onError,maxSteps:r.maxSteps,out:r.out})}),nT=rs({name:"batch",clientSurface:!1,commands:[{name:"batch",metadata:nF,definition:nE,cliSchema:{usageOverride:"batch [--steps <json> | --steps-file <path>]",listUsageOverride:"batch --steps <json> | --steps-file <path>",helpDescription:"Execute multiple commands in one daemon request",summary:"Run multiple commands",allowedFlags:["steps","stepsFile","batchOnError","batchMaxSteps","out"]},cliReader:(e,t)=>({...tZ(t),steps:t.batchSteps??[],onError:t.batchOnError,maxSteps:t.batchMaxSteps,out:t.out}),cliOutputFormatter:rg.batch}]});function n_(e,t,r){return{name:e,description:t,inputSchema:tR(r),readInput:e=>tN(e,r)}}let nj="alert",nU=n_(nj,"Inspect or handle platform alerts.",{action:tS(["get","accept","dismiss","wait"]),timeoutMs:tw()}),nB=ru(nU,(e,t)=>e.command.alert(t)),nV=tY(L.alert,e=>{var t;return[(t=e).action??"get",...ri(t.timeoutMs)]}),nz="diff",nq=n_(nz,"Diff accessibility snapshots.",{kind:ty(tI({type:"string",const:"snapshot"})),out:tb(),interactiveOnly:tx(),depth:tw(),scope:tb(),raw:tx()}),nG=ru(nq,(e,t)=>e.capture.diff(t)),nW={usageOverride:"diff snapshot | diff screenshot --baseline <path> [current.png] [--out <diff.png>] [--threshold <0-1>] [--overlay-refs]",helpDescription:"Diff accessibility snapshot or compare screenshots pixel-by-pixel. Live iOS simulator screenshot diffs normalize status-bar chrome by default; use screenshot --normalize-status-bar when capturing reusable baselines.",summary:"Diff snapshot or screenshot",positionalArgs:["kind","current?"],allowedFlags:[...nv,"baseline","threshold","out","overlayRefs"]},nH=tY(L.diff,e=>[ro(e.kind,"diff requires kind")]),nK="screenshot",nX=n_(nK,"Capture a screenshot.",{path:tb("Output path."),overlayRefs:tx(),fullscreen:tx(),maxSize:tw(),stabilize:tx(),normalizeStatusBar:tx(),surface:tS(r3)}),nJ=ru(nX,(e,t)=>e.capture.screenshot(t)),nY="<wifi|airplane|location> <on|off>",nQ="location set <lat> <lon>",nZ="animations <on|off>",n0="appearance <light|dark|toggle>",n1="faceid <match|nonmatch|enroll|unenroll>",n2="touchid <match|nonmatch|enroll|unenroll>",n5="fingerprint <match|nonmatch>",n3="clear-app-state [app-id]",n4="permission <grant|deny|reset> <camera|microphone|photos|contacts|contacts-limited|notifications|calendar|location|location-always|media-library|motion|reminders|siri> [full|limited]",n8="permission <grant|reset> <accessibility|screen-recording|input-monitoring>",n6=`macOS supports only settings ${n0} and settings ${n8}. wifi|airplane|location|animations remain unsupported on macOS.`,n9=`settings ${nY} | settings ${nQ} | settings ${nZ} | settings ${n0} | settings ${n1} | settings ${n2} | settings ${n5} | settings ${n3} | settings ${n4} | settings ${n8}`,n7=`settings requires ${nY}, ${nQ}, ${nZ}, ${n0}, ${n1}, ${n2}, ${n5}, ${n3}, ${n4}, or ${n8}`;function ie(e){let t=e.trim().toLowerCase();return"appearance"===t||"permission"===t}function it(e){return`Unsupported macOS setting: ${e}. ${n6}`}function ir(e,t){if(void 0===e||""===e.trim())throw new A("INVALID_ARGS",`settings location set requires ${t}`);return ia(Number(e),t)}function ii(e){return{latitude:ia(e?.latitude,"latitude"),longitude:ia(e?.longitude,"longitude")}}function ia(e,t){let r="latitude"===t?-90:-180,n="latitude"===t?90:180;if("number"!=typeof e||!Number.isFinite(e)||e<r||e>n)throw new A("INVALID_ARGS",`${t} must be a number from ${r} to ${n}`);return e}let io="settings",is=n_(io,"Change OS settings and app permissions.",{setting:ty(tb()),state:ty(tb()),app:tb(),latitude:tv(),longitude:tv(),permission:tb(),mode:tS(["full","limited"])}),il=ru(is,(e,t)=>e.settings.update(t)),iu=tY(L.settings,e=>{var t;return"clear-app-state"===(t=e).setting?[t.setting,...rn(t.app)]:"location"===t.setting&&"set"===t.state?[t.setting,t.state,String(t.latitude),String(t.longitude)]:"permission"===t.setting?[t.setting,t.state,t.permission,...rn(t.mode)]:[t.setting,t.state]}),ic=t7("wifi","airplane","location","animations"),id=t7("on","off"),ip=t7("light","dark","toggle"),im=t7("faceid","touchid"),ih=t7("match","nonmatch","enroll","unenroll"),ig=t7("match","nonmatch"),iy=t7("grant","deny","reset"),ib=t7("camera","microphone","photos","contacts","contacts-limited","notifications","calendar","location","location-always","media-library","motion","reminders","siri","accessibility","screen-recording","input-monitoring"),iv="snapshot",iw=n_(iv,"Capture an accessibility snapshot.",{interactiveOnly:tx(),depth:tw(),scope:tb(),raw:tx(),forceFull:tx(),timeoutMs:tw("Maximum wall-clock time for the snapshot command.")}),ix=ru(iw,(e,t)=>e.capture.snapshot(t)),iS={usageOverride:"snapshot [--diff] [-i] [-d <depth>] [-s <scope>] [--raw] [--force-full] [--timeout <ms>]",helpDescription:"Capture accessibility tree or diff against the previous session baseline. For iOS raw-coordinate fallback after a no-op ref press, inspect rects with snapshot -i --json, press the rect center, then verify with diff snapshot -i or snapshot --diff.",summary:"Capture accessibility tree or diff against the previous session baseline",allowedFlags:["snapshotDiff",...nv,"snapshotForceFull","timeoutMs"]},ik=tY(L.snapshot);function iI(e){if(!e)return null;let t=Number(e);return Number.isFinite(t)?t:null}function iD(e){let t=e[0];if(void 0===t)return null;let r=iI(t);if(null!==r)return{kind:"sleep",durationMs:r};let n=iI(e[e.length-1]);if("text"===t)return{kind:"text",text:(null!==n?e.slice(1,-1).join(" "):e.slice(1).join(" ")).trim(),timeoutMs:n};if(t.startsWith("@"))return{kind:"ref",rawRef:t,timeoutMs:n};let i=K(null!==n?e.slice(0,-1):e.slice());return i&&0===i.rest.length&&X(i.selectorExpression)?{kind:"selector",selectorExpression:i.selectorExpression,timeoutMs:n}:{kind:"text",text:(null!==n?e.slice(0,-1).join(" "):e.join(" ")).trim(),timeoutMs:n}}let iA=["duration","text","ref","selector"],i$="wait",iM=n_(i$,"Wait for duration, text, ref, or selector.",{kind:tS(iA),durationMs:tw(),text:tb(),ref:tb(),selector:tb(),timeoutMs:tw(),depth:tw(),scope:tb(),raw:tx()}),iR=ru(iM,(e,t)=>{var r;let n;return e.command.wait((tB(r=t,"kind",iA),n={...r},delete n.kind,n))});function iN(e){return null===e?{}:{timeoutMs:e}}let iL=rs({name:"capture",commands:[{name:iv,metadata:iw,definition:ix,cliSchema:iS,cliReader:(e,t)=>({...tZ(t),interactiveOnly:t.snapshotInteractiveOnly,depth:t.snapshotDepth,scope:t.snapshotScope,raw:t.snapshotRaw,forceFull:t.snapshotForceFull,timeoutMs:t.timeoutMs}),daemonWriter:ik,cliOutputFormatter:({input:e,result:t})=>{var r,n,i;let a;return{data:a={nodes:(n=(r={result:t,raw:e.raw,interactiveOnly:e.interactiveOnly,scope:e.scope,depth:e.depth}).result).nodes,truncated:n.truncated,...n.appName?{appName:n.appName}:{},...n.appBundleId?{appBundleId:n.appBundleId}:{},...n.visibility?{visibility:n.visibility}:{},...rL({...i=n,...i.snapshotQuality?{quality:i.snapshotQuality}:{}}),...n.unchanged?{unchanged:n.unchanged}:{},...n.snapshotDiagnostics?{snapshotDiagnostics:n.snapshotDiagnostics}:{}},jsonData:function(e){let{unchanged:t,...r}=e;return r}(a),stderr:r.result.snapshotDiagnostics?.warning?`${r.result.snapshotDiagnostics.warning}
|
|
15
|
-
`:void 0,text:function(e,t={}){var r,n,i,a;let o,s,l,u,c,d=e.nodes,p=Array.isArray(d)?d:[],m=I(h(e.backend)?e.backend:void 0),f=function(e,t,r){let n;if(r.raw||!((n=e.androidSnapshot)&&"object"==typeof n&&"android-helper"===n.backend))return{nodes:t,filteredCount:0};let i=function(e){var t,r;if(0===e.length)return e;let n=new Set,i=new Map,a=new Map(e.map(e=>[e.index,e]));(function(e,t){for(let r of e)!r.rect||ee(r.rect)||er(r)||ed(e,r.index,t)})(e,n),function(e,t,r,n){for(let i of e){if(r.has(i.index)||i.rect||er(i))continue;let a=function(e,t,r){let n=e;for(;"number"==typeof n.parentIndex;){let e=t.get(n.parentIndex);if(!e)break;if(r(e))return e;n=e}return null}(i,t,ei);a&&function(e,t,r){if(!r)return;let n=e.get(t.index)??t;e.set(t.index,{...n,hiddenContentAbove:!0===n.hiddenContentAbove||"above"===r||void 0,hiddenContentBelow:!0===n.hiddenContentBelow||"below"===r||void 0})}(n,a,function(e,t){let r=t.filter(t=>t.parentIndex===e.parentIndex&&t.rect&&ee(t.rect)).map(e=>e.index);return 0===r.length?null:e.index<Math.min(...r)?"above":e.index>Math.max(...r)?"below":null}(i,e)),ed(e,i.index,r)}}(e,a,n,i);for(let r of e){if(n.has(r.index)||!(!0===(t=r).hittable&&!en(t)&&t.rect&&ee(t.rect)&&0===el(t).trim().length))continue;let a=function(e,t,r){let n=[],i=[],a=new Set;for(let o of e){if(r.has(o.index)||!ef(o)||!et(o.rect,t.rect))continue;let e=el(o).trim().replace(/\s+/g," "),s=eu(e);i.push(o.index),!e||!s||a.has(s)||(a.add(s),n.push(e))}return{label:n.join(", "),removableIndexes:i}}(ec(e,r.index),r,n);if(a.label)for(let t of(i.set(r.index,{...r,...i.get(r.index),label:a.label}),a.removableIndexes))ed(e,t,n)}for(let t of e){if(n.has(t.index)||!(!0===(r=t).hittable&&!en(r)&&r.rect&&ee(r.rect)&&eu(el(r))))continue;let i=eu(el(t));if(!i)continue;let a=ec(e,t.index).filter(e=>!n.has(e.index)&&function(e,t,r){if(!eh(t)||!et(t.rect,e.rect))return!1;let n=eu(el(t));return!!(n&&r!==n&&r.includes(n))}(t,e,i));for(let t of a.filter(ef))ed(e,t.index,n);let o=a.filter(e=>!ef(e)),s=new Set(o.map(e=>eu(el(e))).filter(e=>!!e));if(!(o.length<2)&&!(s.size<2))for(let t of o)ed(e,t.index,n)}let o=new Map;for(let t of e){if(n.has(t.index)||!eh(t))continue;let r=eu(el(t));if(!r)continue;let a=o.get(r);if(a&&function(e,t,r){var n,i,a,o;return!r.has(e.index)&&(n=e.rect,i=t.rect,!n||!i||Math.abs(n.y+n.height/2-(i.y+i.height/2))<=Math.max(n.height,i.height,1))&&(a=e,o=t,(a.parentIndex===o.parentIndex?3>=Math.abs(a.index-o.index):a.parentIndex!==o.index&&o.parentIndex!==a.index&&1>=Math.abs((a.depth??0)-(o.depth??0))&&2>=Math.abs(a.index-o.index))||function(e,t){let r=e.parentIndex===t.index?t:t.parentIndex===e.index?e:null,n=r?.index===e.index?t:r?.index===t.index?e:null;return!!r&&!!n&&eg(r,n).index===r.index}(e,t))}(a,t,n)){let s=function(e,t,r,n,i){var a,o,s;let l=eg(t,r),u=l.index===t.index?r:t,c=(u.type??"").toLowerCase().includes("image")?"has image":null,d=i.get(l.index)??l,p=i.get(u.index)?.presentationHints??u.presentationHints;return i.set(l.index,{...d,presentationHints:(a=d.presentationHints,o=p,s=c,[...new Set([...Array.isArray(a)?a:[],...Array.isArray(o)?o:[],...s?[s]:[]])])}),ed(e,u.index,n),i.get(l.index)??l}(e,a,t,n,i);o.set(r,s);continue}o.set(r,t)}return e.filter(e=>!n.has(e.index)).map(e=>i.get(e.index)??e)}(t);return{nodes:i,filteredCount:t.length-i.length}}(e,p,t),g=(o="string"==typeof(r=e).appName?r.appName:void 0,s="string"==typeof r.appBundleId?r.appBundleId:void 0,l=[],o&&l.push(`Page: ${o}`),s&&l.push(`App: ${s}`),l.length>0?`${l.join("\n")}
|
|
16
|
-
`:""),y=function(e,t,r,n={nodes:t,filteredCount:0}){var i;let a=e2(e);if(!(i=e).snapshotQuality&&!function(e){let t=e.snapshotDiagnostics;if(!t||"object"!=typeof t)return!1;let r=t.stats;return!!(r&&"object"==typeof r&&"web"===r.platform)}(i)){let e=function(e,t){if(!0===t.scoped||!0===t.depthLimited||e.length>3)return null;let r=1===e.length?"node":"nodes";return`Hint: sparse accessibility snapshot returned ${e.length} ${r}; snapshot state is invalid or unavailable for this screen. Use plain screenshot, not screenshot --overlay-refs, as visual truth. If screenshot shows the Home Screen or another app, run open for this app again first. Then navigate away with coordinates if needed and retry snapshot -i on the next screen.`}(t,r);e&&a.push(e)}!r.raw&&n.filteredCount>0&&a.push(`Collapsed ${n.filteredCount} Android helper node${1===n.filteredCount?"":"s"} from the agent-facing text snapshot; use --raw or --json for the full hierarchy.`);let o=n.filteredCount>0?n.nodes:t;return!r.raw&&function(e){if(e.length<20)return!1;let t=new Map;for(let r of e){let e=(r.type??"").toLowerCase(),n=function(e){var t;let r=e.trim().replace(/\s+/g," ").toLowerCase();return!r||(t=r,/\S+@\S+\.\S+/.test(t))?null:r}(es(r));if(!n)continue;let i=`${e}|${n}`,a=t.get(i)??[];a.push(r),t.set(i,a)}let r=0;for(let e of t.values())!(e.length<=1)&&function(e){for(let n=0;n<e.length;n+=1)for(let i=n+1;i<e.length;i+=1){var t,r;if(t=e[n]?.rect,r=e[i]?.rect,!t||!r||!(t.x+t.width<=r.x+.5||r.x+r.width<=t.x+.5||t.y+t.height<=r.y+.5||r.y+r.height<=t.y+.5))return!0}return!1}(e)&&(r+=e.length);return r>=8}(o)&&a.push("Warning: possible repeated nav subtree detected."),a}(e,p,t,f),b=y.length>0?`${y.join("\n")}
|
|
17
|
-
`:"",v=t.raw?null:(u=e.unchanged)&&"object"==typeof u?"number"!=typeof u.ageMs||"number"!=typeof u.nodeCount?null:{ageMs:u.ageMs,nodeCount:u.nodeCount,interactiveOnly:!0===u.interactiveOnly||void 0,scope:"string"==typeof u.scope?u.scope:void 0}:null;if(v){let e;return`${g}${b}${e=function(e){if(e<1e3)return`${Math.round(e)}ms`;if(e<6e4)return`${(Math.round(e/100)/10).toFixed(1)}s`;let t=e/6e4;return t<60?`${(Math.round(10*t)/10).toFixed(1)}m`:`${(Math.round(t/60*10)/10).toFixed(1)}h`}((n=v).ageMs),n.scope?`Scoped snapshot unchanged for scope "${n.scope}" since previous read ${e} ago.
|
|
18
|
-
Previous refs in this scope remain valid. Use find/get/is for a targeted query, or --force-full to re-emit.`:n.interactiveOnly?`Interactive snapshot unchanged since previous read ${e} ago.
|
|
19
|
-
${n.nodeCount} visible nodes are unchanged. Previous @e refs are still valid. Use find/get/is for a targeted query, or --force-full to re-emit.`:`Snapshot unchanged since previous read ${e} ago.
|
|
20
|
-
Refs from the previous snapshot are still valid. Use --force-full to re-emit the tree, or use find/get/is for a targeted query.`}
|
|
21
|
-
`}let w=t.raw||!m?null:eC(f.nodes),x=!!e.truncated,S=w?.nodes??p,k=t.raw||!m?null:function(e,t,r,n,i=0){let a,o=(a=e.visibility)&&"object"==typeof a&&"boolean"==typeof a.partial&&"number"==typeof a.visibleNodeCount&&"number"==typeof a.totalNodeCount&&Array.isArray(a.reasons)?{partial:a.partial,visibleNodeCount:a.visibleNodeCount,totalNodeCount:a.totalNodeCount,reasons:a.reasons.filter(e=>"string"==typeof e)}:null;if(0===i&&o)return o;let s=(t?.hiddenCount??0)+i,l=!!t&&t.nodes.some(e=>e.hiddenContentAbove||e.hiddenContentBelow);return s>0?{partial:!0,visibleNodeCount:r,totalNodeCount:Math.max(n,o?.totalNodeCount??n),reasons:[...new Set([...o?.reasons??[],"offscreen-nodes"])]}:o||(l?{partial:!0,visibleNodeCount:r,totalNodeCount:r,reasons:[]}:null)}(e,w,S.length,p.length,f.filteredCount),D=(i=p.length,a=k,c=x?" (truncated)":"",a?.partial?a.totalNodeCount>a.visibleNodeCount?`Snapshot: ${a.visibleNodeCount} visible nodes (${a.totalNodeCount} total)${c}`:`Snapshot: ${a.visibleNodeCount} visible nodes${c}`:`Snapshot: ${i} nodes${c}`);return 0===p.length?`${g}${D}
|
|
22
|
-
${b}`:t.raw?`${g}${D}
|
|
23
|
-
${b}${p.map(e=>JSON.stringify(e)).join("\n")}
|
|
24
|
-
`:t.flatten?`${g}${D}
|
|
25
|
-
${b}${eS(S,{summarizeTextSurfaces:!0}).flatMap(e=>[ek(e.node,0,!1,e.type,{summarizeTextSurfaces:!0}),...e5({...e,depth:0})]).join("\n")}${eq(w)}
|
|
26
|
-
`:`${g}${D}
|
|
27
|
-
${b}${(function(e){let t=[],r=[],n=new Map(e.map(e=>[e.node.index,e.node])),i=e=>{for(var i,a,o;r.length>0&&(!e||(i=e,a=r[r.length-1],o=n,!function(e,t,r){let n=e;for(;"number"==typeof n.parentIndex;){if(n.parentIndex===t.index)return!0;let e=r.get(n.parentIndex);if(!e)break;n=e}return!1}(i.node,a.node,o)&&i.depth<=a.depth));)t.push(...e5(r.pop(),"below"))};for(let n of e)i(n),t.push(n.text),t.push(...e5(n,"above")),n.node.hiddenContentBelow&&r.push(n);return i(),t})(eS(S,{summarizeTextSurfaces:!0})).join("\n")}${eq(w)}
|
|
28
|
-
`}(a,{raw:r.raw,flatten:r.interactiveOnly,scoped:"string"==typeof r.scope&&r.scope.trim().length>0,depthLimited:"number"==typeof r.depth})}}},{name:nK,metadata:nX,definition:nJ,cliSchema:{helpDescription:"Capture screenshot (web defaults to the viewport; use --fullscreen, --full, or -f for the entire page. macOS app sessions default to the app window; use --fullscreen for full desktop, --max-size to downscale, --overlay-refs to annotate current refs, --normalize-status-bar for deterministic iOS simulator chrome, or --no-stabilize for low-latency Android capture loops)",summary:"Capture screenshot with optional web full-page, desktop, downscale, or ref overlay modes",positionalArgs:["path?"],allowedFlags:["out","overlayRefs","screenshotFullscreen","screenshotMaxSize","screenshotNoStabilize","screenshotNormalizeStatusBar"]},cliReader:(e,t)=>({...tZ(t),path:e[0]??t.out,...rv(t)}),daemonWriter:e=>tQ(L.screenshot,rn(e.path),{...e,...rw(e)})},{name:nz,metadata:nq,definition:nG,cliSchema:nW,cliReader:(e,t)=>{if("snapshot"!==e[0])throw new A("INVALID_ARGS","Only diff snapshot is available through this parser.");return{...tZ(t),kind:"snapshot",out:t.out,interactiveOnly:t.snapshotInteractiveOnly,depth:t.snapshotDepth,scope:t.snapshotScope,raw:t.snapshotRaw}},daemonWriter:nH},{name:i$,metadata:iM,definition:iR,cliSchema:{usageOverride:"wait <ms>|text <text>|@ref|<selector> [timeoutMs]",positionalArgs:["durationOrSelector","timeoutMs?"],allowsExtraPositionals:!0,allowedFlags:[...nw]},cliReader:(e,t)=>(function(e,t){let r=iD(e);if(!r)throw new A("INVALID_ARGS","wait requires <ms>, text <text>, @ref, or <selector> [timeoutMs].");let n={...t0(t),...t2(t)};if("sleep"===r.kind)return{...n,durationMs:r.durationMs};if("text"===r.kind){if(!r.text)throw new A("INVALID_ARGS","wait requires text.");return{...n,text:r.text,...iN(r.timeoutMs)}}return"ref"===r.kind?{...n,ref:r.rawRef,...iN(r.timeoutMs)}:{...n,selector:r.selectorExpression,...iN(r.timeoutMs)}})(e,t),daemonWriter:tY(L.wait,e=>(function(e){if(1!==[void 0!==e.durationMs?"durationMs":void 0,void 0!==e.text?"text":void 0,void 0!==e.ref?"ref":void 0,void 0!==e.selector?"selector":void 0].filter(Boolean).length)throw new A("INVALID_ARGS","wait command requires exactly one of durationMs, text, ref, or selector.");if(void 0!==e.durationMs)return[String(e.durationMs)];let t=ri(e.timeoutMs);if(void 0!==e.text)return["text",e.text,...t];if(void 0!==e.ref)return[e.ref,...t];let r=e.selector;if(!X(r))throw new A("INVALID_ARGS",`Invalid wait selector: ${r}`);return[r,...t]})(e)),cliOutputFormatter:rf},{name:nj,metadata:nU,definition:nB,cliSchema:{usageOverride:"alert [get|accept|dismiss|wait] [timeout]",positionalArgs:["action?","timeout?"]},cliReader:(e,t)=>({...tZ(t),...function(e){if(e.length>2)throw new A("INVALID_ARGS","alert accepts at most action and timeout arguments.");return tW({action:function(e){let t=e?.toLowerCase();if(void 0===t||"get"===t||"accept"===t||"dismiss"===t||"wait"===t)return t;throw new A("INVALID_ARGS","alert action must be get, accept, dismiss, or wait.")}(e[0]),timeoutMs:function(e,t){if(void 0===e)return;let r=Number(e);if(Number.isFinite(r))return r;throw new A("INVALID_ARGS",`${t} must be a finite number.`)}(e[1],"alert timeout")})}(e)}),daemonWriter:nV,cliOutputFormatter:rf},{name:io,metadata:is,definition:il,cliSchema:{usageOverride:n9,listUsageOverride:"settings [area] [options]",helpDescription:"Toggle OS settings, animation scales, appearance, and app permissions (macOS supports only settings appearance <light|dark|toggle> and settings permission <grant|reset> <accessibility|screen-recording|input-monitoring>; wifi|airplane|location|animations remain unsupported on macOS; mobile permission actions use the active session app)",summary:"Change OS settings and app permissions",positionalArgs:["setting","state","target?","mode?"]},cliReader:(e,t)=>(function(e,t){let r=t0(t),n=e[0],i=e[1];if(re(n,ic)&&re(i,id))return{...r,setting:n,state:i};if("location"===n&&"set"===i)return{...r,setting:n,state:i,latitude:ir(e[2],"latitude"),longitude:ir(e[3],"longitude")};if("appearance"===n&&re(i,ip)||re(n,im)&&re(i,ih)||"fingerprint"===n&&re(i,ig))return{...r,setting:n,state:i};if("permission"===n&&re(i,iy))return{...r,setting:n,state:i,permission:function(e){if(re(e,ib))return e;throw new A("INVALID_ARGS","settings permission requires a permission target.")}(e[2]),mode:function(e){if(void 0===e||"full"===e||"limited"===e)return e;throw new A("INVALID_ARGS","settings permission mode must be full or limited.")}(e[3])};if("clear-app-state"===n){let t="clear"===i?e[2]:i;return{...r,setting:n,state:"clear",app:t}}throw new A("INVALID_ARGS","Invalid settings arguments.")})(e,t),daemonWriter:iu}]}),iO={debug:rm(function(e){let t=[e.outPath,e.message];for(let r of(t.push(...function(e){let t=e.crash,r=[`Crash: ${t.appName??"unknown app"}${void 0===t.crashedThread?"":` thread ${t.crashedThread}`}`];for(let e of(t.bundleId&&r.push(`Bundle: ${t.bundleId}`),t.exceptionType&&r.push(`Exception: ${t.exceptionType}`),t.terminationReason&&r.push(`Termination: ${t.terminationReason}`),t.topFrames))r.push(`Frame ${e.index}: ${e.image} ${e.symbol??e.address}`);for(let e of t.findings)r.push(`Finding: ${e}`);return r}(e)),e.matchedImages))t.push(`Matched: ${r.name} ${r.uuid}${r.arch?` ${r.arch}`:""}`);for(let r of e.warnings??[])t.push(`Warning: ${r}`);return{data:e,text:t.join("\n")}})},iP="debug",iC=n_(iP,"Symbolicate crash artifacts with matching debug symbols.",{action:ty(tS(["symbols"])),artifact:ty(tb("Apple crash artifact path (.ips, .crash, or .log).")),dsym:tb("Path to a matching .dSYM bundle."),searchPath:tb("Directory to scan for matching .dSYM bundles."),out:tb("Output path for the symbolicated artifact.")}),iF=ru(iC,(e,t)=>e.debug.symbols(t)),iE=rs({name:"debugging",commands:[{name:iP,metadata:iC,definition:iF,cliSchema:{usageOverride:"debug symbols --artifact <crash.ips|crash.log> (--dsym <App.dSYM> | --search-path <dir>) [--out <symbolicated>]",listUsageOverride:"debug",helpDescription:"Symbolicate Apple crash artifacts with matching dSYM UUIDs. This debug namespace is intentionally narrow: use logs for app logs, network for HTTP evidence, perf for performance samples, record/trace for media and traces, and react-devtools for React Native profiles.",summary:"Symbolicate Apple crash artifacts with dSYMs; use logs/network/perf for other diagnostics",positionalArgs:["symbols"],allowedFlags:["artifact","dsym","searchPath","out"]},cliReader:(e,t)=>({...tZ(t),action:function(e){if("symbols"===e)return e;throw new A("INVALID_ARGS","debug supports only symbols; use logs, network, perf, record, trace, or react-devtools for other diagnostics")}(e[0]),artifact:t.artifact,dsym:t.dsym,searchPath:t.searchPath,out:t.out}),cliOutputFormatter:iO.debug}]});function iT(e){return e?.clickButton??"primary"}function i_(e){return"primary"===e.button?null:"click"!==e.commandLabel?new A("INVALID_ARGS","--button is supported only for click"):"macos"!==e.platform&&"linux"!==e.platform?new A("UNSUPPORTED_OPERATION",`click --button ${e.button} is supported only on macOS and Linux`):"macos"===e.platform&&"middle"===e.button?new A("UNSUPPORTED_OPERATION","click --button middle is not supported by the macOS runner yet"):"number"==typeof e.count||"number"==typeof e.intervalMs||"number"==typeof e.holdMs||"number"==typeof e.jitterPx||!0===e.doubleTap?new A("INVALID_ARGS",`click --button ${e.button} does not support repeat or gesture modifier flags`):null}function ij(e){return"primary"===e?{}:{button:e}}function iU(e,t="scroll accepts either a relative amount or --pixels, not both"){if(void 0!==e.amount&&void 0!==e.pixels)throw new A("INVALID_ARGS",t)}function iB(e,t={}){if(void 0===e)return;let r=t.field??"scroll durationMs",n=t.max??1e4,i=t.invalidMessage??`${r} must be a non-negative integer`;if(!Number.isFinite(e)||!Number.isInteger(e)||e<0)throw new A("INVALID_ARGS",i);if(e>n)throw new A("INVALID_ARGS",`${r} must be a non-negative integer at most ${n}`);return e}function iV(e){return"number"==typeof e?.durationMs?e.durationMs:void 0}let iz=["up","down","left","right"],iq=["left","right","left-edge","right-edge"],iG=["one-way","ping-pong"],iW=r5(iq,{message:"gesture swipe requires left, right, left-edge, or right-edge"}),iH=r5(iz,{message:e=>`Unknown direction: ${e}`});function iK(e){let t=e.direction,r="up"===t||"down"===t?e.referenceHeight:e.referenceWidth,n=i3(e.amount),i=void 0!==e.pixels?i4(e.pixels):Math.round(r*n),a=Math.max(1,Math.round(.05*r)),o=Math.max(1,Math.min(i,Math.max(1,r-2*a))),s=Math.round(o/2),l=Math.round(e.referenceWidth/2),u=Math.round(e.referenceHeight/2),c=(r,n,i,a)=>({direction:t,x1:r,y1:n,x2:i,y2:a,referenceWidth:e.referenceWidth,referenceHeight:e.referenceHeight,amount:e.amount,pixels:o});switch(t){case"up":return c(l,u-s,l,u+s);case"down":return c(l,u+s,l,u-s);case"left":return c(l-s,u,l+s,u);case"right":return c(l+s,u,l-s,u)}}function iX(e){i3(e.amount),void 0!==e.pixels&&i4(e.pixels)}function iJ(e){return{...iK({...e,direction:function(e){switch(e){case"up":return"down";case"down":return"up";case"left":return"right";case"right":return"left"}}(e.direction)}),direction:e.direction}}function iY(e,t,r={}){let n=r.marginPx??8,[i,a,o]="left"===e?[85,15,50]:"right"===e?[15,85,50]:"left-edge"===e?[99,15,50]:[1,85,50],s=i0(t,i,o,{marginPx:n}),l=i0(t,a,o,{marginPx:n});return{preset:e,x1:s.x,y1:s.y,x2:l.x,y2:l.y,referenceWidth:t.referenceWidth,referenceHeight:t.referenceHeight}}function iQ(e){return iW.parse(e)}function iZ(e){let t=function(e){let t=e.filter(e=>(function(e){if(!e)return!1;let t=e.toLowerCase();return t.includes("application")||t.includes("window")})(e.type)&&i5(e.rect)).map(e=>e.rect).sort((e,t)=>(t?.width??0)*(t?.height??0)-(e?.width??0)*(e?.height??0))[0];if(t)return t;let r=e.map(e=>e.rect).filter(i5);if(0===r.length)return;let n=Math.max(...r.map(e=>e.x+e.width)),i=Math.max(...r.map(e=>e.y+e.height));if(!(n<=0)&&!(i<=0))return{x:0,y:0,width:n,height:i}}(e);if(t)return{referenceWidth:t.width,referenceHeight:t.height}}function i0(e,t,r,n={}){let i={x:Math.round(e.referenceWidth*t/100),y:Math.round(e.referenceHeight*r/100)};return void 0===n.marginPx?i:i1(i,e,n.marginPx)}function i1(e,t,r){return{x:i8(e.x,r,t.referenceWidth),y:i8(e.y,r,t.referenceHeight)}}function i2(e){return iH.parse(e)}function i5(e){return!!e&&e.width>0&&e.height>0}function i3(e){if(void 0===e)return .6;if(!Number.isFinite(e)||e<=0)throw new A("INVALID_ARGS","scroll amount must be a positive number");return e}function i4(e){if(!Number.isFinite(e)||e<=0)throw new A("INVALID_ARGS","scroll pixels must be a positive integer");return Math.max(1,Math.round(e))}function i8(e,t,r){let n=Math.max(t,r-t);return i6(e,t,n)}function i6(e,t,r){return Math.min(Math.round(r),Math.max(Math.round(t),Math.round(e)))}function i9(e,t,r,n){if(!Number.isFinite(e)||!Number.isInteger(e)||e<r||e>n)throw new A("INVALID_ARGS",`${t} must be an integer between ${r} and ${n}`);return e}async function i7(e){let{edge:t,target:r={},scope:n,captureNodes:i}=e;try{let e=await i(n),a=function(e,t,r={}){var n,i,a;let o,s=(e??[]).map((e,t)=>({...e,ref:"ref"in e&&e.ref?e.ref:`e${t+1}`}));if(0===s.length)return{canScroll:!1,emptySnapshot:!0,signature:""};let l=eF(s),u=function(e,t,r,n){let i=new Map(e.map(e=>[e.index,e])),a=e.filter(e=>eP(e)&&as(e.rect));if(0===a.length)return null;let o=function(e,t){if(void 0===e)return null;let r=t.get(e);for(;r;){if(eP(r)&&as(r.rect))return r;r=void 0===r.parentIndex?void 0:t.get(r.parentIndex)}return null}(n.nodeIndex,i);if(o)return o;let s=n.point;if(s){let e=a.filter(e=>{var t,r;return e.rect&&(t=e.rect,(r=s).x>=t.x&&r.x<=t.x+t.width&&r.y>=t.y&&r.y<=t.y+t.height)}).sort(ai);if(e.length>0)return e.find(e=>ar(e,t.get(e.index),r))??e[0]??null}let l=a.filter(e=>ar(e,t.get(e.index),r)).sort(aa);return l.length>0?l[0]??null:a.filter(t=>eT(t,e)).sort(aa)[0]??a.sort(aa)[0]??null}(s,l,t,r),c=(u?(n=s,i=u.index,o=new Map(n.map(e=>[e.index,e])),n.filter(e=>e.index===i||function(e,t,r){let n=void 0===e.parentIndex?void 0:r.get(e.parentIndex);for(;n;){if(n.index===t)return!0;n=void 0===n.parentIndex?void 0:r.get(n.parentIndex)}return!1}(e,i,o))):s).map(e=>{let t=e.rect?["x","y","width","height"].map(t=>{var r;return r=e.rect?.[t],"number"==typeof r&&Number.isFinite(r)?r.toFixed(1):""}).join(","):"";return[String(e.index??""),String(e.parentIndex??""),String(e.type??""),String(e.label??""),String(e.value??""),t].join("|")}).join("\n");return u?{canScroll:ar(u,l.get(u.index),t),emptySnapshot:!1,signature:c,scope:[(a=u).identifier,a.label,a.value].map(e=>"string"==typeof e?e.trim():"").find(an)}:{canScroll:!1,emptySnapshot:!1,signature:c}}(e,t,r);if(n&&a.emptySnapshot)return await i7({edge:t,target:r,captureNodes:i});return a}catch(e){var a,o,s;throw a=t,o=n,s=e,o?new A("COMMAND_FAILED",`Failed to verify scroll ${a} state for scoped container`,{scope:o,hint:`scroll ${a} could not verify the scoped scroll container. Run snapshot -i for the current screen and retry with a visible scroll target.`},s):new A("COMMAND_FAILED",`Failed to verify scroll ${a} state`,{hint:`scroll ${a} needs a snapshot showing hidden content ${"bottom"===a?"below":"above"} before it will move.`},s)}}async function ae(e){let t,{edge:r,captureState:n,scroll:i}=e,a=await n();a.scope&&(a=await n(a.scope));let o=0;for(;a.canScroll;){if(o>=40)throw new A("COMMAND_FAILED",`scroll ${r} reached the safety limit before the snapshot showed the edge`,{hint:"The scoped scroll container still reports hidden content. Use a smaller manual scroll + snapshot loop to inspect the current state."});t=await i(),o+=1,a=await n(a.scope)}return{passes:o,result:t}}function at(e,t,r,n,i){return t&&0===r?`Already at ${t}; no hidden content ${"bottom"===t?"below":"above"} detected`:t?`Scrolled to ${t} with ${r} ${e} passes`:void 0!==i?`Scrolled ${e} by ${i}px`:void 0!==n?`Scrolled ${e} by ${n}`:`Scrolled ${e}`}function ar(e,t,r){return"bottom"===r?!0===e.hiddenContentBelow||t?.hiddenContentBelow===!0:!0===e.hiddenContentAbove||t?.hiddenContentAbove===!0}function an(e){return e.length>0&&e.length<=80&&!/^(true|false)$/i.test(e)&&!/^\d+$/.test(e)&&!/^\d+%$/.test(e)}function ai(e,t){return ao(e.rect)-ao(t.rect)}function aa(e,t){return ao(t.rect)-ao(e.rect)}function ao(e){return e?e.width*e.height:0}function as(e){return!!(e&&e.width>0&&e.height>0)}function al(e,t){return{session:t.session,requestId:t.requestId,signal:t.signal??e.signal,metadata:t.metadata}}function au(e){return e.clock?.now()??Date.now()}async function ac(e,t){e.clock?await e.clock.sleep(t):await new Promise(e=>setTimeout(e,t))}function ad(e){return e&&"object"==typeof e?e:void 0}let ap=["x","y","width","height"];function am(e){let t=af(e);if(!t)return null;let r=x(t);return Number.isFinite(r.x)&&Number.isFinite(r.y)?r:null}function af(e){if(!e)return null;let t=Number(e.x),r=Number(e.y),n=Number(e.width),i=Number(e.height);return Number.isFinite(t)&&Number.isFinite(r)&&Number.isFinite(n)&&Number.isFinite(i)&&!(n<0)&&!(i<0)?{x:t,y:r,width:n,height:i}:null}function ah(e,t){return!!e&&!!t&&ap.every(r=>.5>=Math.abs(e[r]-t[r]))}function ag(e){return{x:ay(e.x,e.width),y:ay(e.y,e.height)}}function ay(e,t){if(t<=1)return Math.floor(e);let r=Math.ceil(e);return Math.round(Math.min(Math.floor(e+t-1),Math.max(r,e+t/2)))}let ab=["tabbar","toolbar","navigationbar","bottomnavigation","bottomnavigationview","sheet","dialog","alert","popover","menu"],av=["button","link","menuitem","tabitem","textfield","searchfield","edittext","checkbox","radio","switch","cell"];function aw(e){if(e.length<2)return e;let t=[...e],r={nodes:t,byIndex:new Map(t.map(e=>[e.index,e]))},n=!1;for(let[e,i]of t.entries()){if(!function(e){return!!aD(e.rect)&&(!!(!0===e.hittable||aS(e,av))||!!(e.label?.trim()||e.value?.trim()||e.identifier?.trim()))}(i)||!function e(t,r,n){let i=aD(n.rect);if(!i)return null;let a=x(i);for(let o=r+1;o<t.nodes.length;o+=1){let r=t.nodes[o];if(r&&function(t,r,n,i,a){if(!t.nodes[r])return!1;let o=function(t,r,n,i){var a,o,s,l;let u=t.nodes[r];if(!u||!(!(!aD((a=u).rect)||function(e){let t=ak(e);return t.includes("application")||t.includes("window")}(a))&&aS(a,ab))||aI(o=n,s=u,l=t.byIndex)||aI(s,o,l))return null;let c=aD(u.rect);return!c||ah(i,c)||e(t,r,u)?null:c}(t,r,n,i);return!!(o&&eR(o,a.x,a.y))}(t,o,n,i,a))return r}return null}(r,e,i))continue;n=!0;let a={...i,hittable:!1,interactionBlocked:"covered",presentationHints:Array.from(new Set([...i.presentationHints??[],"covered"]))};t[e]=a,r.byIndex.set(a.index,a)}return n?t:e}function ax(e){return void 0!==e.interactionBlocked}function aS(e,t){let r=ak(e);return t.some(e=>r.includes(e))}function ak(e){return[e.type,e.role,e.subrole].map(e=>p(e??"")).join(" ")}function aI(e,t,r){let n="number"==typeof t.parentIndex?r.get(t.parentIndex):void 0,i=new Set;for(;n&&!i.has(n.index);){if(n.index===e.index)return!0;i.add(n.index),n="number"==typeof n.parentIndex?r.get(n.parentIndex):void 0}return!1}function aD(e){let t=af(e);return t&&t.width>0&&t.height>0?t:null}function aA(e){return e}function a$(e){let t=1/0,r=1/0,n=-1/0,i=-1/0;for(let a of e)t=Math.min(t,a.x),r=Math.min(r,a.y),n=Math.max(n,a.x+a.width),i=Math.max(i,a.y+a.height);return{x:t,y:r,width:n-t,height:i-r}}function aM(e,t){return{x:e.x-t,y:e.y-t,width:e.width+2*t,height:e.height+2*t}}function aR(e,t){let r=Math.max(e.x,t.x),n=Math.max(e.y,t.y),i=Math.min(e.x+e.width,t.x+t.width),a=Math.min(e.y+e.height,t.y+t.height);return i<=r||a<=n?0:(i-r)*(a-n)}function aN(e){return{x:e.x+e.width/2,y:e.y+e.height/2}}function aL(e,t){return(e.x-t.x)**2+(e.y-t.y)**2}function aO(e,t,r){return Math.min(Math.max(e,t),r)}let aP=["button","link","menuitem","tabitem","textfield","searchfield","securetextfield","checkbox","radio","switch","cell"];function aC(e,t){return aF(e,t).node}function aF(e,t){var r;if(ax(t))return{node:t,reason:"covered"};let n=function(e,t){let r=af(t.rect);if(!r)return null;let n=t,i=new Set;for(;!i.has(n.ref);){i.add(n.ref);let t=e.filter(e=>{if(e.parentIndex!==n.index||!e.hittable||ax(e))return!1;let t=af(e.rect);return!!t&&ah(t,r)});if(1!==t.length)break;n=t[0]}return n===t?null:n}(e,t);if(n?.rect&&am(n.rect))return{node:n,reason:"same-rect-descendant"};if([(r=t).type,r.role,r.subrole].map(e=>p(e??"")).some(aE)&&t.rect&&am(t.rect))return{node:t,reason:"semantic-target"};let i=a(e,t);return i?.rect&&!ax(i)&&am(i.rect)?!function(e,t,r){var n,i;let a,o,s,l=af(e.rect),u=af(t.rect);if(!l||!u)return!1;let c=function(e,t){let r=x(t),n=e.filter(e=>{let t=(e.type??"").toLowerCase();return t.includes("application")||t.includes("window")}).map(e=>af(e.rect)).filter(e=>null!==e);if(0===n.length)return null;let i=n.filter(e=>eR(e,r.x,r.y));return eN(i.length>0?i:n)}(r,l);return!!c&&(a=aR(n=u,i=c),o=n.width*n.height,s=i.width*i.height,!(a<=0)&&!(o<=0)&&!(s<=0)&&!!(a/s>=.9)&&!!(a/o>=.8))&&!ah(l,u)}(t,i,e)?{node:i,reason:"hittable-ancestor"}:{node:t,reason:"overly-broad-ancestor"}:{node:t,reason:"original"}}function aE(e){return"tab"===e||aP.some(t=>e.includes(t))}async function aT(e,t,r){var n;return(await aG(e,t,r.action),"point"===t.target.kind)?{kind:"point",point:{x:(n=t.target).x,y:n.y}}:"ref"===t.target.kind?await a_(e,t,t.target,r):await aj(e,t,t.target,r)}async function a_(e,t,r,n){let i=await aH(e,t,r),a=i.resolved,s=n.promoteToHittableAncestor?aB(i.snapshot.nodes,a.node,{action:n.action,label:`Ref ${r.ref}`}):a.node;return aV(s,`Ref ${r.ref}`,n.action),function(e,t,r,n){let i=e.rect?e_(e,t):null;if(!(!e.rect||!i||eT(e,t)))throw new A("COMMAND_FAILED",`Ref ${r} is off-screen and not safe to ${n}`,{reason:"offscreen_ref",ref:m(r),rect:e.rect,viewport:i,hint:`Use scroll with the direction from the off-screen summary, take a fresh snapshot, then retry ${n} with the new ref or a selector.`})}(s,i.snapshot.nodes,r.ref,n.action),{kind:"ref",point:aX(s,`Ref ${r.ref} not found or has invalid bounds`),target:{kind:"ref",ref:`@${a.ref}`},node:s,selectorChain:o(s,e.backend.platform,{action:"fill"===n.action?"fill":"click"}),refLabel:u(s,i.snapshot.nodes)}}async function aj(e,t,r,n){let i=J(r.selector),a=await aq(e,t,n.requireInteractive),l=s(aU(a.snapshot.nodes),i,{platform:e.backend.platform,requireRect:!0,requireUnique:!0,disambiguateAmbiguous:!0});if(l&&l.node.rect||!n.requireInteractive||(l=s(aU((a=await aq(e,t,!1)).snapshot.nodes),i,{platform:e.backend.platform,requireRect:!0,requireUnique:!0,disambiguateAmbiguous:!0})),!l||!l.node.rect){let t=s(a.snapshot.nodes,i,{platform:e.backend.platform,requireRect:!0,requireUnique:!1});if(t?.node&&ax(t.node))throw az({label:`Selector ${t.selector.raw}`,node:t.node,action:n.action,selector:t.selector.raw});throw new A("COMMAND_FAILED",d(i,l?.diagnostics??[],{unique:!0}))}let c=n.promoteToHittableAncestor?aB(a.snapshot.nodes,l.node,{action:n.action,label:`Selector ${l.selector.raw}`}):l.node;return aV(c,`Selector ${l.selector.raw}`,n.action),{kind:"selector",point:aX(c,`Selector ${l.selector.raw} resolved to invalid bounds`),target:{kind:"selector",selector:l.selector.raw},node:c,selectorChain:o(c,e.backend.platform,{action:"fill"===n.action?"fill":"click"}),refLabel:u(c,a.snapshot.nodes)}}function aU(e){return e.filter(e=>!ax(e))}function aB(e,t,r){let n=aF(e,t);if("covered"===n.reason)throw az({label:r.label,node:t,action:r.action});return n.node}function aV(e,t,r){if(ax(e))throw az({label:t,node:e,action:r})}function az(e){return new A("COMMAND_FAILED",`${e.label} is covered by another visible element and cannot ${function(e){switch(e){case"fill":return"be filled";case"focus":return"be focused";case"longPress":return"be long-pressed";default:return"be tapped"}}(e.action)} safely`,{hint:"Use a different visible target, scroll it clear of the overlay, or inspect with snapshot/screenshot before retrying.",...e.selector?{selector:e.selector}:{},ref:`@${e.node.ref}`,interactionBlocked:e.node.interactionBlocked})}async function aq(e,t,r){if(!e.backend.captureSnapshot)throw new A("UNSUPPORTED_OPERATION","snapshot is not supported by this backend");let n=t.session??"default",i=await e.sessions.get(n);if(!i)throw new A("SESSION_NOT_FOUND","No active session. Run open first.");let a=await e.backend.captureSnapshot(al(e,t),{interactiveOnly:r,includeRects:!0}),o=a.snapshot??{nodes:a.nodes??[],truncated:a.truncated,backend:a.backend,createdAt:au(e)};return await e.sessions.set({...i,snapshot:o}),{snapshot:o}}async function aG(e,t,r){if("macos"!==e.backend.platform)return;let n=await aW(e,t);if(("desktop"===n||"menubar"===n)&&("menubar"!==n||"click"!==r&&"press"!==r))throw new A("UNSUPPORTED_OPERATION",`${r} is not supported on macOS ${n} sessions yet. Open an app session to act, or use the ${n} surface to inspect.`)}async function aW(e,t){let r=await e.sessions.get(t.session??"default");return r?.metadata?.surface}async function aH(e,t,r){let n=t.session??"default",i=await e.sessions.get(n);if(!i)throw new A("SESSION_NOT_FOUND","No active session. Run open first.");if(!i.snapshot)throw new A("INVALID_ARGS","No snapshot in session. Run snapshot first.");let a=r.fallbackLabel??"",o=aK(i.snapshot.nodes,r.ref,{fallbackLabel:a});if(o)return{snapshot:i.snapshot,resolved:o};let s=await aq(e,t,!0),l=aK(s.snapshot.nodes,r.ref,{fallbackLabel:a});if(!l)throw new A("COMMAND_FAILED",`Ref ${r.ref} not found or has no bounds`);return{...s,resolved:l}}function aK(e,t,r){let n=m(t);if(!n)throw new A("INVALID_ARGS",`Invalid ref: ${t}`);let i=w(e,n);if(aJ(i))return{ref:n,node:i};let a=r.fallbackLabel.length>0?l(e,r.fallbackLabel):null;return aJ(a)?{ref:n,node:a}:null}function aX(e,t){let r=am(e.rect);if(!r)throw new A("COMMAND_FAILED",t);return r}function aJ(e){return!!e&&null!==am(e.rect)}let aY=async(e,t)=>{let r=await aT(e,t,{action:"focus",requireInteractive:!0,promoteToHittableAncestor:!1});if(!e.backend.focus)throw new A("UNSUPPORTED_OPERATION","focus is not supported by this backend");let n=a4(r),i=ad(await e.backend.focus(al(e,t),n));return{...r,...i?{backendResult:i}:{},...rc(`Focused (${n.x}, ${n.y})`)}},aQ=async(e,t)=>{let r=await aT(e,t,{action:"longPress",requireInteractive:!0,promoteToHittableAncestor:!0});if(!e.backend.longPress)throw new A("UNSUPPORTED_OPERATION","longPress is not supported by this backend");let n=void 0===t.durationMs?void 0:i9(t.durationMs,"durationMs",0,12e4),i=a4(r),a=ad(await e.backend.longPress(al(e,t),i,{durationMs:n}));return{...r,...void 0!==n?{durationMs:n}:{},...a?{backendResult:a}:{},...rc(`Long pressed (${i.x}, ${i.y})`)}},aZ=async(e,t)=>{var r,n,i,a;let o;if(!e.backend.scroll)throw new A("UNSUPPORTED_OPERATION","scroll is not supported by this backend");let s="bottom"===(r=t.direction)?{direction:"down",edge:"bottom"}:"top"===r?{direction:"up",edge:"top"}:{direction:a6(r,"scroll direction")},l=(n=t.amount,i="scroll amount",void 0===n?void 0:a7(n,i)),u=function(e,t){if(void 0!==e){if(!Number.isFinite(e)||!Number.isInteger(e)||e<=0)throw new A("INVALID_ARGS",`${t} must be a positive integer`);return e}}(t.pixels,"scroll pixels"),c=iB(t.durationMs);iU({amount:l,pixels:u},"scroll accepts either amount or pixels, not both");let d=await a5(e,t),p="viewport"===d.kind?{kind:"viewport"}:{kind:"point",point:a4(d)},m=e.backend.scroll,f=async()=>await m(al(e,t),p,{direction:s.direction,...void 0!==l?{amount:l}:{},...void 0!==u?{pixels:u}:{},...void 0!==c?{durationMs:c}:{}}),h=0;if(s.edge){let r=s.edge,n="viewport"===(a=d).kind?{}:{point:a.point,nodeIndex:"node"in a?a.node?.index:void 0},i=await ae({edge:r,captureState:async i=>await a8(e,t,r,n,i),scroll:f});o=i.result,h=i.passes}else o=await f(),h=1;let g=ad(o),y=iV(g);return{...d,direction:s.direction,...s.edge?{edge:s.edge,passes:h}:{},...void 0!==l?{amount:l}:{},...void 0!==u?{pixels:u}:{},...void 0!==y?{durationMs:y}:{},...g?{backendResult:g}:{},...rc(at(s.direction,s.edge,h,l,u))}},a0=async(e,t)=>{if(!e.backend.swipe)throw new A("UNSUPPORTED_OPERATION","swipe is not supported by this backend");if(t.preset)return await a1(e,t,e.backend.swipe);let r=await a3(e,t),n=function(e,t){if(t.to)return{point:a9(t.to,"to")};let r=a6(t.direction,"swipe direction"),n=a7(t.distance??200,"swipe distance");switch(r){case"up":return{point:{x:e.x,y:e.y-n},direction:r,distance:n};case"down":return{point:{x:e.x,y:e.y+n},direction:r,distance:n};case"left":return{point:{x:e.x-n,y:e.y},direction:r,distance:n};case"right":return{point:{x:e.x+n,y:e.y},direction:r,distance:n}}}(r.point,t),i=void 0===t.durationMs?void 0:i9(t.durationMs,"durationMs",16,1e4),a=ad(await e.backend.swipe(al(e,t),r.point,n.point,{durationMs:i}));return{kind:"swipe",from:r.point,to:n.point,...n.direction?{direction:n.direction}:{},...void 0!==n.distance?{distance:n.distance}:{},...void 0!==i?{durationMs:i}:{},...r.target?{fromTarget:r.target}:{},...a?{backendResult:a}:{},...rc("Swiped")}};async function a1(e,t,r){let n;if(t.from||t.to||t.direction||void 0!==t.distance)throw new A("INVALID_ARGS","gesture swipe preset cannot be combined with from, to, direction, or distance");let i=iQ(t.preset);await aG(e,t,"swipe");let a=iY(i,{referenceWidth:(n=oe((await aq(e,t,!1)).snapshot.nodes)).width,referenceHeight:n.height},{platform:e.backend.platform}),o=void 0===t.durationMs?void 0:i9(t.durationMs,"durationMs",16,1e4),s={x:a.x1,y:a.y1},l={x:a.x2,y:a.y2},u=ad(await r(al(e,t),s,l,{durationMs:o}));return{kind:"swipe",from:s,to:l,preset:i,...void 0!==o?{durationMs:o}:{},fromTarget:{kind:"viewport"},...u?{backendResult:u}:{},...rc(`Swiped ${i}`)}}let a2=async(e,t)=>{if(!e.backend.pinch)throw new A("UNSUPPORTED_OPERATION","pinch is not supported by this backend");await aG(e,t,"pinch");let r=a7(t.scale,"pinch scale"),n=t.center?await aT(e,{...t,target:t.center},{action:"pinch",requireInteractive:!1,promoteToHittableAncestor:!1}):void 0,i=ad(await e.backend.pinch(al(e,t),{scale:r,...n?{center:n.point}:{}}));return{kind:"pinch",scale:r,...n?{center:n.point,centerTarget:n}:{},...i?{backendResult:i}:{},...rc(`Pinched to scale ${r}`)}};async function a5(e,t){let r=t.target??{kind:"viewport"};return"viewport"===r.kind?(await aG(e,t,"scroll"),{kind:"viewport"}):await aT(e,{...t,target:r},{action:"scroll",requireInteractive:!1,promoteToHittableAncestor:!1})}async function a3(e,t){if(t.from){var r;if("x"in(r=t.from)&&"y"in r)return await aG(e,t,"swipe"),{point:a9(t.from,"from")};let n=await aT(e,{...t,target:t.from},{action:"swipe",requireInteractive:!1,promoteToHittableAncestor:!1});return{point:a4(n),target:n}}if(!t.direction)throw new A("INVALID_ARGS","swipe requires from+to or a direction");return await aG(e,t,"swipe"),{point:x(oe((await aq(e,t,!1)).snapshot.nodes)),target:{kind:"viewport"}}}function a4(e){if(!e.point)throw new A("COMMAND_FAILED","Interaction target resolved without coordinates");return e.point}async function a8(e,t,r,n,i){if(!e.backend.captureSnapshot)throw new A("UNSUPPORTED_OPERATION",`scroll ${r} requires snapshot support to verify hidden content before scrolling`);let{captureSnapshot:a}=e.backend;return await i7({edge:r,target:n,scope:i,captureNodes:async r=>{let n=await a(al(e,t),{scope:r});return n.snapshot?.nodes??n.nodes??[]}})}function a6(e,t){switch(e){case"up":case"down":case"left":case"right":return e;default:throw new A("INVALID_ARGS",`${t} must be up, down, left, or right`)}}function a9(e,t){let r=Number(e.x),n=Number(e.y);if(!Number.isFinite(r)||!Number.isFinite(n))throw new A("INVALID_ARGS",`${t} point requires finite x and y`);return{x:r,y:n}}function a7(e,t){if(!Number.isFinite(e)||e<=0)throw new A("INVALID_ARGS",`${t} must be a positive number`);return e}function oe(e){let t=e.filter(t=>eT(t,e)).map(e=>e.rect).filter(ot),r=t.length>0?t:e.map(e=>e.rect).filter(ot);if(0===r.length)throw new A("COMMAND_FAILED","Cannot infer viewport for directional swipe");let n=Math.min(...r.map(e=>e.x)),i=Math.min(...r.map(e=>e.y));return{x:n,y:i,width:Math.max(...r.map(e=>e.x+e.width))-n,height:Math.max(...r.map(e=>e.y+e.height))-i}}function ot(e){return!!(e&&e.width>0&&e.height>0)}let or={click:"Click or tap a semantic UI target by ref, selector, or point.",press:"Press a semantic UI target by ref, selector, or point.",fill:"Fill text into a semantic UI target by ref, selector, or point.",longpress:"Long press by ref, selector, or point.",swipe:"Swipe between two points.",focus:"Focus input at coordinates.",type:"Type text in the focused field.",scroll:"Scroll in a direction or to an edge.",get:"Get element text or attributes.",is:"Assert UI state.",find:"Find an element and optionally act on it.",gesture:"Run a structured gesture."},on={target:ty(tD()),button:tS(["primary","secondary","middle"],"Pointer button for platforms that support mouse buttons."),...t$(),...tM()},oi={target:ty(tD()),...t$(),...tM()},oa={target:ty(tD()),text:ty(tb("Text to enter into the target.")),delayMs:tw("Delay between typed characters.",{min:0}),...t$()},oo={target:ty(tD()),durationMs:tw("Long press duration in milliseconds.",{min:0}),...t$()},os={from:ty(tA("Swipe start point.")),to:ty(tA("Swipe end point.")),durationMs:tw("Swipe duration in milliseconds.",{min:0}),count:tw("Number of swipe repetitions.",{min:1}),pauseMs:tw("Pause between repeated swipes.",{min:0}),pattern:tS(iG)},ol={x:ty(tv("X coordinate.")),y:ty(tv("Y coordinate."))},ou={text:ty(tb("Text to type.")),delayMs:tw("Delay between typed characters.",{min:0})},oc={direction:ty(tS(["up","down","left","right","top","bottom"])),amount:tv("Platform scroll amount."),pixels:tw("Pixel scroll amount.",{min:0}),durationMs:tw("Scroll duration in milliseconds when the backend supports pacing.",{min:0,max:1e4})},od={format:ty(tS(["text","attrs"])),target:ty(tH({oneOf:tX(),description:"UI element target by snapshot ref or selector expression."},(e,t)=>{let r,n;return void 0===e[t]?void 0:"ref"===(n=tU(r=tJ(e,t),"kind",["ref","selector"]))?{kind:n,ref:tC(r,"ref"),label:tF(r,"label")}:{kind:n,selector:tC(r,"selector")}})),...t$()},op={predicate:ty(tS(["visible","hidden","exists","editable","selected","text"])),selector:ty(tb()),value:tb(),...t$()},om={locator:tS(Y),query:ty(tb()),action:tS(["click","focus","exists","getText","getAttrs","wait","fill","type"]),value:tb(),timeoutMs:tw(),first:tx(),last:tx(),depth:tw(),raw:tx()},of={kind:ty(tS(C,"Gesture variant.")),direction:tS(iz,"Fling direction."),preset:tS(iq,"Swipe preset."),origin:tA("Gesture origin point."),delta:tA("Movement delta for pan or transform gestures."),distance:tw("Fling distance.",{min:0}),scale:tv("Pinch or transform scale."),degrees:tv("Rotation in degrees."),velocity:tw("Rotate gesture velocity.",{min:0}),durationMs:tw("Gesture duration in milliseconds.",{min:0})},oh=[{name:"click",description:or.click,inputSchema:tR(on),readInput:e=>tN(e,on)},{name:"press",description:or.press,inputSchema:tR(oi),readInput:e=>tN(e,oi)},{name:"fill",description:or.fill,inputSchema:tR(oa),readInput:e=>tN(e,oa)},og("longpress",oo),og("swipe",os),og("focus",ol),og("type",ou),og("scroll",oc),og("get",od),og("is",op),og("find",om),{name:"gesture",description:or.gesture,inputSchema:tR(of),readInput:function(e){let t=tL(e),r=tO(t),n=tU(t,"kind",C);return"pan"===n?{...r,kind:n,origin:tP(t,"origin"),delta:tP(t,"delta"),durationMs:t_(t,"durationMs",{min:0})}:"fling"===n?{...r,kind:n,direction:tU(t,"direction",iz),origin:tP(t,"origin"),distance:t_(t,"distance",{min:0}),durationMs:t_(t,"durationMs",{min:0})}:"swipe"===n?{...r,kind:n,preset:tU(t,"preset",iq),durationMs:t_(t,"durationMs",{min:0})}:"pinch"===n?{...r,kind:n,scale:tE(t,"scale"),origin:oy(t,"origin")}:"rotate"===n?{...r,kind:n,degrees:tE(t,"degrees"),origin:oy(t,"origin"),velocity:t_(t,"velocity",{min:0})}:{...r,kind:n,origin:tP(t,"origin"),delta:tP(t,"delta"),scale:tE(t,"scale"),degrees:tE(t,"degrees"),durationMs:t_(t,"durationMs",{min:0})}}}];function og(e,t){return n_(e,or[e],t)}function oy(e,t){return void 0===e[t]?void 0:tP(e,t)}let ob={gesture:tY(L.gesture,function(e){switch(e.kind){case"pan":return["pan",String(e.origin?.x),String(e.origin?.y),String(e.delta?.x),String(e.delta?.y),...ri(e.durationMs)];case"fling":return["fling",ro(e.direction,"gesture fling requires direction"),String(e.origin?.x),String(e.origin?.y),...ri(e.distance),...ri(e.durationMs)];case"swipe":return ov(e);case"pinch":return["pinch",String(e.scale),...ri(e.origin?.x),...ri(e.origin?.y)];case"rotate":return["rotate",String(e.degrees),...ri(e.origin?.x),...ri(e.origin?.y),...ri(e.velocity)];case"transform":return["transform",String(e.origin?.x),String(e.origin?.y),String(e.delta?.x),String(e.delta?.y),String(e.scale),String(e.degrees),...ri(e.durationMs)];default:throw new A("INVALID_ARGS","gesture requires pan, fling, swipe, pinch, rotate, or transform")}}),"gesture-pan":tY(L.gesture,function(e){return["pan",String(e.x),String(e.y),String(e.dx),String(e.dy),...ri(e.durationMs)]}),"gesture-fling":tY(L.gesture,e=>{var t;let r;return r=void 0!==(t=e).durationMs?t.distance??180:t.distance,["fling",t.direction,String(t.x),String(t.y),...ri(r),...ri(t.durationMs)]}),"gesture-swipe":tY(L.gesture,ov),"gesture-pinch":tY(L.gesture,function(e){return["pinch",String(e.scale),...ri(e.x),...ri(e.y)]}),"gesture-rotate":tY(L.gesture,e=>(function(e){var t=e;if(void 0===t.x&&void 0!==t.y||void 0!==t.x&&void 0===t.y)throw new A("INVALID_ARGS","gesture rotate center requires both x and y");let r=void 0===e.x||void 0===e.y?[]:[String(e.x),String(e.y)];return["rotate",String(e.degrees),...r,...ri(e.velocity)]})(e)),"gesture-transform":tY(L.gesture,function(e){return["transform",String(e.x),String(e.y),String(e.dx),String(e.dy),String(e.scale),String(e.degrees),...ri(e.durationMs)]})};function ov(e){return["swipe",ro(e.preset,"gesture swipe requires preset"),...ri(e.durationMs)]}function ow(e){if(e[0]?.startsWith("@")){let t=oS(e.slice(1));return{ref:e[0],...void 0===t?{}:{label:t}}}let t=K(e);return t?{selector:t.selectorExpression}:{x:Number(e[0]),y:Number(e[1])}}function ox(e){let t=e[0];if(t?.startsWith("@")){let r=e.length>=3?e.slice(2).join(" "):e.slice(1).join(" ");return{kind:"ref",target:{ref:t,label:e.length>=3?oS(e.slice(1,2)):void 0},text:r}}let r=K(e,{preferTrailingValue:!0});return r?{kind:"selector",target:{selector:r.selectorExpression},text:r.rest.join(" ")}:{kind:"point",target:{x:Number(e[0]),y:Number(e[1])},text:e.slice(2).join(" ")}}function oS(e){return e.join(" ").trim()||void 0}let ok={click:e=>tQ(L.click,t4(e),{...e,clickButton:e.button}),press:tY(L.press,e=>t4(e)),longpress:tY(L.longPress,e=>{var t;return[...t4(t=e),...ri(t.durationMs)]}),swipe:tY(L.swipe,function(e){return[String(e.from?.x),String(e.from?.y),String(e.to?.x),String(e.to?.y),...ri(e.durationMs)]}),focus:tY(L.focus,e=>[String(e.x),String(e.y)]),type:tY(L.type,e=>[e.text]),fill:tY(L.fill,e=>{var t;return[...t4(t=e),t.text]}),scroll:tY(L.scroll,e=>[ro(e.direction,"scroll requires direction"),...ri(e.amount)]),get:tY(L.get,e=>[ro(e.format,"get requires format"),...function(e){let t=t8(e);if("string"==typeof t.ref)return[t.ref,...t9(t.label)];if("string"==typeof t.selector)return[t.selector];throw new A("INVALID_ARGS","element command requires @ref or selector target")}(e)])};function oI(e){let t=e.ref??"",r=e.x,n=e.y;return t&&"number"==typeof r&&"number"==typeof n?{data:e,text:`Tapped @${t} (${r}, ${n})`}:rh(e)}let oD={click:rm(oI),press:rm(oI),get:({input:e,result:t})=>{var r;let n;return n=(r={result:t,format:e.format}).result,"text"===r.format?{data:n,text:"string"==typeof n.text?n.text:""}:"attrs"===r.format?{data:n,text:JSON.stringify(n.node??{},null,2)}:rh(n)},is:rm(function(e){return{data:e,text:`Passed: is ${e.predicate??"assertion"}`}}),find:rm(function(e){return"string"==typeof e.text?{data:e,text:e.text}:"boolean"==typeof e.found?{data:e,text:`Found: ${e.found}`}:e.node?{data:e,text:JSON.stringify(e.node,null,2)}:rh(e)})},oA={is:tY(L.is,e=>{var t;return[(t=e).predicate,t.selector,..."text"===t.predicate?[t.value]:[]]}),find:e=>tQ(L.find,function(e){let t=e.locator&&"any"!==e.locator?[e.locator,e.query]:[e.query];switch(e.action){case void 0:case"click":case"focus":case"exists":return e.action?[...t,e.action]:t;case"getText":return[...t,"get","text"];case"getAttrs":return[...t,"get","attrs"];case"wait":return[...t,"wait",...ri(e.timeoutMs)];case"fill":case"type":return[...t,e.action,e.value]}}(e),{...e,findFirst:e.first,findLast:e.last})};function o$(e){if(void 0===e||""===e)throw new A("INVALID_ARGS","find requires query");return e}let oM={get:{usageOverride:"get text|attrs <@ref|selector>",positionalArgs:["subcommand","target"],allowedFlags:[...nw]},find:{usageOverride:"find <locator|text> <action> [value] [--first|--last]",helpDescription:"Find by text/label/value/role/id and run action",summary:"Find an element and act",positionalArgs:["query","action","value?"],allowsExtraPositionals:!0,allowedFlags:["snapshotDepth","snapshotRaw","findFirst","findLast"]},is:{positionalArgs:["predicate","selector","value?"],allowsExtraPositionals:!0,allowedFlags:[...nw]},click:{usageOverride:"click <x y|@ref|selector>",positionalArgs:["target"],allowsExtraPositionals:!0,allowedFlags:[...nk,"clickButton",...nw]},press:{usageOverride:"press <x y|@ref|selector>",helpDescription:"Short press a semantic UI target by ref, selector, or point. For native context menus or hold gestures, use longpress <target> <durationMs> instead of press --hold-ms.",positionalArgs:["targetOrX","y?"],allowsExtraPositionals:!0,allowedFlags:[...nk,...nw]},longpress:{usageOverride:"longpress <x y|@ref|selector> [durationMs]",helpDescription:"Open native context menus or long-press targets by ref, selector, or point. Duration is positional, for example longpress @e12 800 or longpress 300 500 800.",positionalArgs:["targetOrX","yOrDurationMs?","durationMs?"],allowsExtraPositionals:!0,allowedFlags:[...nw]},swipe:{helpDescription:"Swipe coordinates with optional repeat pattern",positionalArgs:["x1","y1","x2","y2","durationMs?"],allowedFlags:["count","pauseMs","pattern"]},gesture:{usageOverride:"gesture <pan|fling|swipe|pinch|rotate|transform> ...",listUsageOverride:"gesture <pan|fling|swipe|pinch|rotate|transform> ...",helpDescription:'Run touch gestures: pan <x> <y> <dx> <dy> [durationMs], fling <up|down|left|right> <x> <y> [distance] [durationMs], swipe <left|right|left-edge|right-edge> [durationMs], pinch <scale> [x] [y], rotate <degrees> [x] [y] [velocity], or transform <x> <y> <dx> <dy> <scale> <degrees> [durationMs]. For command plans, output only command lines. Android transform verification should use all app-observable effects, for example wait text "pan changed yes", wait text "pinch changed yes", and wait text "rotate changed yes", not exact transform values.',summary:"Run pan, fling, swipe, pinch, rotate, or transform gestures",positionalArgs:["pan|fling|swipe|pinch|rotate|transform","args?"],allowsExtraPositionals:!0},focus:{positionalArgs:["x","y"]},type:{positionalArgs:["text"],allowsExtraPositionals:!0,allowedFlags:["delayMs"]},fill:{usageOverride:"fill <x> <y> <text> | fill <@ref|selector> <text>",positionalArgs:["targetOrX","yOrText","text?"],allowsExtraPositionals:!0,allowedFlags:[...nw,"delayMs"]},scroll:{usageOverride:"scroll <direction|top|bottom> [amount] [--pixels <n>] [--duration-ms <ms>]",helpDescription:"Scroll in a direction, or toward the top/bottom edge of scrollable content.",summary:"Scroll in a direction or to an edge",positionalArgs:["directionOrEdge","amount?"],allowedFlags:["pixels","durationMs"]}},{gesture:oR,...oN}=ob,oL=ru(oq("click"),(e,t)=>{var r;return e.interactions.click({...tV(r=t),...tz(r.target),...tG(r),...tq(r),button:r.button})}),oO=ru(oq("press"),(e,t)=>{var r;return e.interactions.press({...tV(r=t),...tz(r.target),...tG(r),...tq(r)})}),oP=ru(oq("fill"),(e,t)=>{var r;return e.interactions.fill({...tV(r=t),...tz(r.target),...tG(r),text:r.text,delayMs:r.delayMs})}),oC=ru(oq("longpress"),(e,t)=>{var r;return e.interactions.longPress({...tV(r=t),...tz(r.target),...tG(r),durationMs:r.durationMs})}),oF=ru(oq("swipe"),(e,t)=>e.interactions.swipe(t)),oE=ru(oq("focus"),(e,t)=>e.interactions.focus(t)),oT=ru(oq("type"),(e,t)=>e.interactions.type(t)),o_=ru(oq("scroll"),(e,t)=>e.interactions.scroll(t)),oj=ru(oq("get"),(e,t)=>{var r;return e.interactions.get({...tV(r=t),...function(e){switch(e.kind){case"ref":return{ref:e.ref,label:e.label};case"selector":return{selector:e.selector}}}(r.target),...tG(r),format:r.format})}),oU=ru(oq("is"),(e,t)=>e.interactions.is(t)),oB=ru(oq("find"),(e,t)=>e.interactions.find(t)),oV=ru(oq("gesture"),async(e,t)=>{var r,n,i,a,o,s;switch(t.kind){case"pan":return await e.interactions.pan({...tV(r=t),x:r.origin.x,y:r.origin.y,dx:r.delta.x,dy:r.delta.y,durationMs:r.durationMs});case"fling":return await e.interactions.fling({...tV(n=t),direction:n.direction,x:n.origin.x,y:n.origin.y,distance:n.distance,durationMs:n.durationMs});case"swipe":return await e.interactions.swipeGesture({...tV(i=t),preset:i.preset,durationMs:i.durationMs});case"pinch":return await e.interactions.pinch({...tV(a=t),scale:a.scale,x:a.origin?.x,y:a.origin?.y});case"rotate":return await e.interactions.rotateGesture({...tV(o=t),degrees:o.degrees,x:o.origin?.x,y:o.origin?.y,velocity:o.velocity});case"transform":return await e.interactions.transformGesture({...tV(s=t),x:s.origin.x,y:s.origin.y,dx:s.delta.x,dy:s.delta.y,scale:s.scale,degrees:s.degrees,durationMs:s.durationMs})}}),oz=rs({name:"interaction",clientSurface:!1,commands:[{name:"click",metadata:oq("click"),definition:oL,cliSchema:oM.click,cliReader:(e,t)=>({...tZ(t),...t1(t),...t5(t),target:t3(ow(e)),button:t.clickButton}),daemonWriter:ok.click,cliOutputFormatter:oD.click},{name:"press",metadata:oq("press"),definition:oO,cliSchema:oM.press,cliReader:(e,t)=>({...tZ(t),...t1(t),...t5(t),target:t3(ow(e))}),daemonWriter:ok.press,cliOutputFormatter:oD.press},{name:"fill",metadata:oq("fill"),definition:oP,cliSchema:oM.fill,cliReader:(e,t)=>{let r=ox(e);return{...tZ(t),...t1(t),target:t3(r.target),text:r.text,delayMs:t.delayMs}},daemonWriter:ok.fill},{name:"longpress",metadata:oq("longpress"),definition:oC,cliSchema:oM.longpress,cliReader:(e,t)=>{let r,n={...ow((r=function(e){if(rt(e[0])&&rt(e[1]))return{target:e.slice(0,2),...void 0!==e[2]?{durationMs:Number(e[2])}:{}};let t=e.at(-1);return e.length>1&&rt(t)?{target:e.slice(0,-1),durationMs:Number(t)}:{target:e}}(e)).target),...void 0!==r.durationMs?{durationMs:r.durationMs}:{}};return{...tZ(t),...t1(t),target:t3(n),durationMs:n.durationMs}},daemonWriter:ok.longpress},{name:"swipe",metadata:oq("swipe"),definition:oF,cliSchema:oM.swipe,cliReader:(e,t)=>({...tZ(t),from:{x:Number(e[0]),y:Number(e[1])},to:{x:Number(e[2]),y:Number(e[3])},durationMs:rr(e[4]),count:t.count,pauseMs:t.pauseMs,pattern:t.pattern}),daemonWriter:ok.swipe},{name:"focus",metadata:oq("focus"),definition:oE,cliSchema:oM.focus,cliReader:(e,t)=>({...tZ(t),x:Number(e[0]),y:Number(e[1])}),daemonWriter:ok.focus},{name:"type",metadata:oq("type"),definition:oT,cliSchema:oM.type,cliReader:(e,t)=>({...tZ(t),text:e.join(" "),delayMs:t.delayMs}),daemonWriter:ok.type},{name:"scroll",metadata:oq("scroll"),definition:o_,cliSchema:oM.scroll,cliReader:(e,t)=>({...tZ(t),direction:function(e){if("up"===e||"down"===e||"left"===e||"right"===e||"top"===e||"bottom"===e)return e;throw new A("INVALID_ARGS",`Unknown direction: ${String(e)}`)}(e[0]),amount:rr(e[1]),pixels:t.pixels,durationMs:t.durationMs}),daemonWriter:ok.scroll},{name:"get",metadata:oq("get"),definition:oj,cliSchema:oM.get,cliReader:(e,t)=>({...tZ(t),...t1(t),format:function(e){if("text"===e||"attrs"===e)return e;throw new A("INVALID_ARGS","get only supports text or attrs")}(e[0]),target:t3(function(e){if(e[0]?.startsWith("@"))return{ref:e[0],label:e.slice(1).join(" ").trim()||void 0};let t=e.join(" ").trim();if(!t)throw new A("INVALID_ARGS","get requires @ref or selector expression");return{selector:t}}(e.slice(1)))}),daemonWriter:ok.get,cliOutputFormatter:oD.get},{name:"is",metadata:oq("is"),definition:oU,cliSchema:oM.is,cliReader:(e,t)=>(function(e,t){let r={...t2(t),...t0(t)},n=e[0],i=function(e,t={}){let r=K(e,t);if(!r)throw new A("INVALID_ARGS","is requires a selector expression");return r}(e.slice(1),{preferTrailingValue:"text"===n});if("text"===n)return{...r,predicate:n,selector:i.selectorExpression,value:i.rest.join(" ")};if("visible"===n||"hidden"===n||"exists"===n||"editable"===n||"selected"===n)return{...r,predicate:n,selector:i.selectorExpression};throw new A("INVALID_ARGS","is requires predicate: visible|hidden|exists|editable|selected|text")})(e,t),daemonWriter:oA.is,cliOutputFormatter:oD.is},{name:"find",metadata:oq("find"),definition:oB,cliSchema:oM.find,cliReader:(e,t)=>(function(e,t){var r;let n={...{depth:(r=t).snapshotDepth,raw:r.snapshotRaw},...t0(t),first:t.findFirst,last:t.findLast},i=function(e){if("text"===e||"label"===e||"value"===e||"role"===e||"id"===e)return e}(e[0]),a=void 0!==i,o=a?e[1]:e[0],s=a?2:1,l=e[s];if(void 0===l)return{...n,locator:i,query:o$(o)};if("get"===l){let t=e[s+1];if("text"===t)return{...n,locator:i,query:o$(o),action:"getText"};if("attrs"===t)return{...n,locator:i,query:o$(o),action:"getAttrs"};throw new A("INVALID_ARGS","find get only supports text or attrs")}if("wait"===l)return{...n,locator:i,query:o$(o),action:"wait",timeoutMs:rr(e[s+1])};if("fill"===l||"type"===l)return{...n,locator:i,query:o$(o),action:l,value:e.slice(s+1).join(" ")};if("click"===l||"focus"===l||"exists"===l)return{...n,locator:i,query:o$(o),action:l};throw new A("INVALID_ARGS",`Unsupported find action: ${l}`)})(e,t),daemonWriter:oA.find,cliOutputFormatter:oD.find},{name:"gesture",metadata:oq("gesture"),definition:oV,cliSchema:oM.gesture,cliReader:function(e,t){let r=e[0],n=e.slice(1),i=tZ(t);switch(r){case"pan":return{...i,kind:r,origin:{x:Number(n[0]),y:Number(n[1])},delta:{x:Number(n[2]),y:Number(n[3])},durationMs:rr(n[4])};case"fling":return{...i,kind:r,direction:n[0],origin:{x:Number(n[1]),y:Number(n[2])},distance:rr(n[3]),durationMs:rr(n[4])};case"swipe":return{...i,kind:r,preset:n[0],durationMs:rr(n[1])};case"pinch":return{...i,kind:r,scale:Number(n[0]),origin:void 0===n[1]||void 0===n[2]?void 0:{x:Number(n[1]),y:Number(n[2])}};case"rotate":return{...i,kind:r,degrees:Number(n[0]),origin:void 0===n[1]||void 0===n[2]?void 0:{x:Number(n[1]),y:Number(n[2])},velocity:rr(n[3])};case"transform":return{...i,kind:r,origin:{x:Number(n[0]),y:Number(n[1])},delta:{x:Number(n[2]),y:Number(n[3])},scale:Number(n[4]),degrees:Number(n[5]),durationMs:rr(n[6])};default:throw new A("INVALID_ARGS","gesture requires pan, fling, swipe, pinch, rotate, or transform")}},daemonWriter:ob.gesture,extraDaemonWriters:oN}]});function oq(e){let t=oh.find(t=>t.name===e);if(!t)throw Error(`Missing interaction command metadata for ${e}`);return t}function oG(e){return rh(rd({app:e.app,appPath:e.appPath,platform:e.platform,...e.appId?{appId:e.appId}:{},...e.bundleId?{bundleId:e.bundleId}:{},...e.package?{package:e.package}:{}},`Installed: ${r_(e)}`))}let oW={boot:rm(function(e){let t=e.platform??"unknown",r=e.device??e.id??"unknown";return{data:e,text:`Boot ready: ${r} (${t})`}}),shutdown:rm(function(e){let t=e.platform??"unknown",r=e.device??e.id??"unknown",n=e.shutdown,i=!!n&&"object"==typeof n&&"success"in n&&!0===n.success;return{data:e,text:`${i?"Shutdown":"Shutdown failed"}: ${r} (${t})`}}),devices:rm(function(e){return{data:{devices:e.map(rT)},text:e.map(oH).join("\n")}}),doctor:rm(function(e){var t;let r,n="string"==typeof e.status?e.status:"unknown",i=[`Doctor: ${n}`],a=Array.isArray(t=e.checks)?t.filter(e=>!!e&&"object"==typeof e&&!Array.isArray(e)):[];if(r=e9,e9=!1,r){let t="string"==typeof e.summary?e.summary:void 0;t&&i.push(t)}else if(0===a.length){let t="string"==typeof e.summary?e.summary:"No blockers found.";i.push(t)}else for(let e of a)i.push(e8(e)),i.push(...e6(e));return{data:e,text:i.join("\n")}}),apps:({input:e,result:t})=>{var r;return{data:{apps:(r={result:t,appsFilter:e.appsFilter}).result},stderr:"all"===r.appsFilter?"Showing all apps, including system apps.\n":"Showing user-installed apps. Use --all to include system apps.\n",text:r.result.length>0?r.result.join("\n"):"all"===r.appsFilter?"No apps found.":"No user-installed apps found."}},session:rm(function(e){if("stateDir"in e)return{data:e,text:e.stateDir};let t={sessions:e.sessions.map(rE)};return{data:t,text:JSON.stringify(t,null,2)}}),artifacts:rm(function(e){let t=[e.message??`No cloud artifacts available for ${e.provider}.`],r=function(e){if(e.providerSessionId)return`agent-device artifacts ${e.providerSessionId} --provider ${e.provider} --json`}(e);return r&&t.push(`Retry: ${r}`),{data:e,text:e.cloudArtifacts.length>0?e.cloudArtifacts.map(oK).join("\n"):t.join("\n")}}),open:rm(function(e){let t,r=(t=e.appName??e.appBundleId??e.session,rd({session:e.session,...e.sessionStateDir?{sessionStateDir:e.sessionStateDir}:{},...e.runnerLogPath?{runnerLogPath:e.runnerLogPath}:{},...e.requestLogPath?{requestLogPath:e.requestLogPath}:{},...e.appName?{appName:e.appName}:{},...e.appBundleId?{appBundleId:e.appBundleId}:{},...e.startup?{startup:e.startup}:{},...e.runtime?{runtime:e.runtime}:{},...e.device?rF(e.device):{}},t?`Opened: ${t}`:"Opened")),n=[rp(r)].filter(e=>!!e);return"string"==typeof r.sessionStateDir&&n.push(`Session state: ${r.sessionStateDir}`),{data:r,text:n.join("\n")||null}}),close:rm(function(e){return rh({session:e.session,...e.shutdown?{shutdown:e.shutdown}:{},..."provider"in e&&e.provider?{provider:e.provider}:{},...rc(e.session?`Closed: ${e.session}`:"Closed")})}),install:rm(oG),reinstall:rm(oG),"install-from-source":rm(function(e){return rh(rd({launchTarget:e.launchTarget,...e.appName?{appName:e.appName}:{},...e.appId?{appId:e.appId}:{},...e.bundleId?{bundleId:e.bundleId}:{},...e.packageName?{package:e.packageName}:{},...e.installablePath?{installablePath:e.installablePath}:{},...e.archivePath?{archivePath:e.archivePath}:{},...e.materializationId?{materializationId:e.materializationId}:{},...e.materializationExpiresAt?{materializationExpiresAt:e.materializationExpiresAt}:{}},`Installed: ${rj(e)}`))}),prepare:rf,viewport:rf};function oH(e){let t=e.kind?` ${e.kind}`:"",r=e.target?` target=${e.target}`:"",n="boolean"==typeof e.booted?` booted=${e.booted}`:"";return`${e.name} (${e.platform}${t}${r})${n}`}function oK(e){let t=e.url?` ${e.url}`:"",r=e.availability?` ${e.availability}`:"";return`${e.kind}: ${e.name}${r}${t}`}let oX=n_("artifacts","List cloud provider artifacts for an active or completed provider session.",{provider:tb("Cloud provider name, for example browserstack or aws-device-farm."),providerSessionId:tb("Cloud provider session id or ARN.")}),oJ=ru(oX,(e,t)=>e.sessions.artifacts(t)),oY={name:"artifacts",metadata:oX,definition:oJ,cliSchema:{summary:"List cloud provider session artifacts",usageOverride:"artifacts [provider-session-id] --provider <name>",positionalArgs:["provider-session-id?"],allowedFlags:["provider","providerSessionId"]},cliReader:(e,t)=>({...tZ(t),provider:t.provider,providerSessionId:e[0]??t.providerSessionId}),daemonWriter:tY(L.artifacts),cliOutputFormatter:oW.artifacts},oQ=n_("apps","List installed apps.",{appsFilter:tS(["user-installed","all"])}),oZ=n_("open","Open an app, deep link, URL, or platform surface.",{app:tb("App name, bundle id, package, or URL."),url:tb("Optional URL passed with an app shell."),surface:tS(r3),activity:tb("Android activity name."),launchConsole:tb("Launch console mode."),launchArgs:tk("Launch arguments forwarded verbatim to the platform launch command."),relaunch:tx("Force relaunch."),saveScript:tI({oneOf:[th(),tf()]}),deviceHub:tx("Use Xcode Device Hub when surfacing Apple simulators."),noRecord:tx("Do not record this action.")}),o0=n_("close","Close an app or end the active session.",{app:tb("Optional app to close."),shutdown:tx("Shutdown the session/device where supported."),saveScript:tI({oneOf:[th(),tf()]})}),o1=ru(oQ,(e,t)=>e.apps.list(t)),o2=ru(oZ,(e,t)=>e.apps.open(t)),o5=ru(o0,(e,t)=>t.app?e.apps.close(t):e.sessions.close(function(e){let{app:t,...r}=e;return r}(t))),o3=tY(L.apps),o4=tY(L.open,function(e){return e.app?e.url?[e.app,e.url]:[e.app]:[]}),o8=tY(L.close,e=>rn(e.app)),o6={name:"apps",metadata:oQ,definition:o1,cliSchema:{helpDescription:"List user-installed apps; use --all to include system/OEM apps",summary:"List installed apps",allowedFlags:["appsFilter"],defaults:{appsFilter:Q}},cliReader:(e,t)=>({...tZ(t),appsFilter:Z(t.appsFilter)}),daemonWriter:o3,cliOutputFormatter:oW.apps},o9={name:"open",metadata:oZ,definition:o2,cliSchema:{helpDescription:'Boot device/simulator; optionally launch app or deep link URL. Use --platform to bind URL/deep-link opens to the target platform. For iOS simulator initial stdout/stderr, put --launch-console <path> on this open command, for example agent-device open "Agent Device Tester" --platform ios --launch-console artifacts/launch-console.log. Expo Go/dev-client shells accept host + URL, for example agent-device open "Expo Go" exp://127.0.0.1:8081 --platform ios. macOS also supports --surface app|frontmost-app|desktop|menubar.',summary:"Open an app, deep link or URL, save replays",positionalArgs:["appOrUrl?","url?"],allowedFlags:["activity","launchConsole","launchArgs","deviceHub","saveScript","noRecord","relaunch","surface"]},cliReader:(e,t)=>({...tZ(t),app:e[0],url:e[1],surface:t.surface,activity:t.activity,launchConsole:t.launchConsole,launchArgs:t.launchArgs,relaunch:t.relaunch,saveScript:t.saveScript,deviceHub:t.deviceHub,noRecord:t.noRecord}),daemonWriter:o4,cliOutputFormatter:oW.open},o7={name:"close",metadata:o0,definition:o5,cliSchema:{positionalArgs:["app?"],allowedFlags:["saveScript","shutdown"]},cliReader:(e,t)=>({...tZ(t),app:e[0],shutdown:t.shutdown,saveScript:t.saveScript}),daemonWriter:o8,cliOutputFormatter:oW.close},se=n_("devices","List available devices.",{}),st=n_("boot","Boot or prepare a selected device without using CLI positional arguments.",{headless:tx("Boot without showing simulator UI when supported.")}),sr=n_("shutdown","Shutdown a selected simulator or emulator.",{}),sn=ru(se,(e,t)=>e.devices.list(t)),si=ru(st,(e,t)=>e.devices.boot(t)),sa=ru(sr,(e,t)=>e.devices.shutdown(t)),so=(e,t)=>tZ(t),ss=tY(L.devices),sl=tY(L.boot),su=tY(L.shutdown),sc={name:"devices",metadata:se,definition:sn,cliReader:so,daemonWriter:ss,cliOutputFormatter:oW.devices},sd={name:"boot",metadata:st,definition:si,cliSchema:{summary:"Boot target device/simulator",allowedFlags:["headless"]},cliReader:(e,t)=>({...tZ(t),headless:t.headless}),daemonWriter:sl,cliOutputFormatter:oW.boot},sp={name:"shutdown",metadata:sr,definition:sa,cliSchema:{summary:"Shutdown target simulator/emulator"},cliReader:so,daemonWriter:su,cliOutputFormatter:oW.shutdown},sm=n_("doctor","Diagnose device, app, Metro, and React Native readiness before a run.",{targetApp:tb("Installed app package/bundle id or app name to verify without opening a session."),remote:tx("Check remote connection setup instead of local device inventory.")}),sf=ru(sm,(e,t)=>e.command.doctor(t)),sh={name:"doctor",metadata:sm,definition:sf,cliSchema:{usageOverride:"doctor [--platform ios|android|macos|linux|web|apple] [--app <id-or-name>] [--remote]",helpDescription:"Read-only preflight for QA and dogfood runs. Reports local device inventory, active sessions, optional app discovery, scoped toolchain info, and Metro reachability inferred from cwd/runtime. Pass --app to verify a target app on the one matching booted device without opening a session. Use --remote to check remote connection setup without probing local devices. Default output is compact; use --json for full checks and evidence.",summary:"Preflight device, app, Metro, and RN/Expo readiness",allowedFlags:["targetApp","remote"]},cliReader:(e,t)=>({...tZ(t),targetApp:t.targetApp,remote:t.remote}),daemonWriter:tY(L.doctor),cliOutputFormatter:oW.doctor};function sg(e,t){if(!e||"object"!=typeof e||Array.isArray(e))throw new A("INVALID_ARGS",`${t} installSource must be an object.`);if("github-actions-artifact"!==sv(e.type,`${t} installSource.type`))throw new A("INVALID_ARGS",`${t} installSource.type must be "github-actions-artifact".`);let{owner:r,repo:n}=sb(sv(e.repo,`${t} installSource.repo`),`${t} installSource.repo`);return sy(r,n,e.artifact,`${t} installSource.artifact`)}function sy(e,t,r,n){var i;return"number"==typeof r||"string"==typeof(i=r)&&/^\d+$/.test(i.trim())?{kind:"github-actions-artifact",owner:e,repo:t,artifactId:function(e,t){let r="number"==typeof e?e:"string"==typeof e?Number(e):NaN;if(!Number.isInteger(r))throw new A("INVALID_ARGS",`${t} must be an integer.`);return r}(r,n)}:{kind:"github-actions-artifact",owner:e,repo:t,artifactName:sv(r,n)}}function sb(e,t){let r=e.indexOf("/");if(r<=0||r===e.length-1||-1!==e.indexOf("/",r+1))throw new A("INVALID_ARGS",`${t} must use owner/repo.`);let n={owner:e.slice(0,r).trim(),repo:e.slice(r+1).trim()};if(!n.owner||!n.repo)throw new A("INVALID_ARGS",`${t} must use owner/repo.`);return n}function sv(e,t){let r="string"==typeof e&&e.trim().length>0?e.trim():void 0;if(!r)throw new A("INVALID_ARGS",`${t} must be a non-empty string.`);return r}let sw=n_("install","Install an app binary.",{app:tb("Optional app identifier hint."),appPath:ty(tb("Path to app binary."))}),sx=n_("reinstall","Reinstall an app binary.",{app:ty(tb()),appPath:ty(tb("Path to app binary."))}),sS=n_("install-from-source","Install an app from a structured source.",{source:ty(tI(tg("Install source object."))),retainPaths:tx(),retentionMs:tw()}),sk=ru(sw,(e,t)=>e.apps.install(t)),sI=ru(sx,(e,t)=>e.apps.reinstall(t)),sD=ru(sS,(e,t)=>e.apps.installFromSource(t)),sA=tY(L.install,e=>{var t;let r;return t=e.app,r=ro(e.appPath,"missing app path"),"string"==typeof t&&t.length>0?[t,r]:[r]}),s$=tY(L.reinstall,e=>{var t,r;return t=e.app,r=e.appPath,[ro(t,"missing first positional"),ro(r,"missing second positional")]}),sM={name:"install",metadata:sw,definition:sk,cliSchema:{usageOverride:"install <path> | install <app> <path>",listUsageOverride:"install <path>",positionalArgs:["appOrPath","path?"]},cliReader:(e,t)=>(function(e,t){let[r,n]=e,i=void 0!==n;return{...tZ(t),...i?{app:ra(r,"install requires app")}:{},appPath:ra(i?n:r,"install requires path")}})(e,t),daemonWriter:sA,cliOutputFormatter:oW.install},sR={name:"reinstall",metadata:sx,definition:sI,cliSchema:{positionalArgs:["app","path"]},cliReader:(e,t)=>{var r;return r=e,{...tZ(t),app:ra(r[0],"reinstall requires app"),appPath:ra(r[1],"reinstall requires path")}},daemonWriter:s$,cliOutputFormatter:oW.reinstall},sN={name:"install-from-source",metadata:sS,definition:sD,cliSchema:{usageOverride:"install-from-source <url> | install-from-source --github-actions-artifact <owner/repo:artifact>",listUsageOverride:"install-from-source",helpDescription:"Install app builds from URLs, remote source specs, or CI artifacts resolved by a remote daemon.",summary:"Install app builds from URLs, remote source specs, or CI artifacts",positionalArgs:["url?"],allowedFlags:["header","githubActionsArtifact","installSource","retainPaths","retentionMs"]},cliReader:(e,t)=>({...tZ(t),source:function(e,t){let r=e[0]?.trim();if(e.length>1)throw new A("INVALID_ARGS","install-from-source accepts either one <url> positional or --github-actions-artifact");let n=t.githubActionsArtifact?function(e,t="--github-actions-artifact"){let r=e.indexOf(":");if(r<=0||r===e.length-1)throw new A("INVALID_ARGS",`${t} must use owner/repo:artifact, for example thymikee/RNCLI83:6635342232`);let{owner:n,repo:i}=sb(e.slice(0,r),t);return sy(n,i,e.slice(r+1),`${t} artifact`)}(t.githubActionsArtifact):void 0,i=t.installSource;if(1!=+!!r+ +!!n+ +!!i)throw new A("INVALID_ARGS","install-from-source requires exactly one source: <url>, --github-actions-artifact, or config installSource");if(!r&&t.header&&t.header.length>0)throw new A("INVALID_ARGS","install-from-source --header is only supported for URL sources");return n||i||{kind:"url",url:r,headers:function(e){if(!e||0===e.length)return;let t={};for(let r of e){let e=r.indexOf(":");if(e<=0)throw new A("INVALID_ARGS",`Invalid --header value "${r}". Expected "name:value".`);let n=r.slice(0,e).trim(),i=r.slice(e+1).trim();if(!n)throw new A("INVALID_ARGS",`Invalid --header value "${r}". Header name cannot be empty.`);t[n]=i}return t}(t.header)}}(e,t),retainPaths:t.retainPaths,retentionMs:t.retentionMs}),daemonWriter:e=>tQ(G.installSource,[],{...e,installSource:e.source,retainMaterializedPaths:e.retainPaths,materializedPathRetentionMs:e.retentionMs}),cliOutputFormatter:oW["install-from-source"]},sL=n_("prepare","Prepare platform helper infrastructure.",{action:ty(tS(["ios-runner"])),timeoutMs:tw("Maximum wall-clock time for the prepare command.")}),sO=ru(sL,(e,t)=>e.command.prepare(t)),sP={name:"prepare",metadata:sL,definition:sO,cliSchema:{usageOverride:"prepare ios-runner --platform ios|macos [--timeout <ms>]",listUsageOverride:"prepare",helpDescription:'Prepare platform helper infrastructure. ios-runner builds/reuses, starts, and health-checks the XCTest runner so later Apple snapshots and interactions do not pay first-use startup cost. In CI, run it after boot/install and before replay/test; if replay/test starts a separate daemon, stop the prepare daemon before replay/test so it does not keep the prepared runner lease. It is not a recovery step for "runner already owned by another agent-device daemon"; stop the owning daemon on the Mac with simulator access instead. Runner build/start output is written to the session runner.log; daemon.log is for daemon lifecycle/startup issues.',summary:"Pre-warm platform helpers, especially the iOS/macOS XCTest runner before Apple automation",positionalArgs:["ios-runner"],allowedFlags:["timeoutMs"]},cliReader:(e,t)=>({...tZ(t),action:ra(e[0],"prepare requires subcommand"),timeoutMs:t.timeoutMs}),daemonWriter:tY(L.prepare,e=>[ro(e.action,"prepare requires subcommand")]),cliOutputFormatter:oW.prepare},sC=n_("push","Deliver a push payload.",{app:ty(tb()),payload:ty(tI({oneOf:[tf(),tg()]}))}),sF=n_("trigger-app-event","Trigger an app-defined event.",{event:ty(tb()),payload:tH(tg(void 0),function(e,t){let r=e[t];if(void 0!==r){if(!r||"object"!=typeof r||Array.isArray(r))throw Error(`Expected ${t} to be an object.`);return r}})}),sE=ru(sC,(e,t)=>e.apps.push(t)),sT=ru(sF,(e,t)=>e.apps.triggerEvent(t)),s_=[{name:"push",metadata:sC,definition:sE,cliSchema:{listUsageOverride:"push",helpDescription:"Deliver push notification payloads to an installed app.",summary:"Deliver push notification payloads to an installed app",positionalArgs:["bundleOrPackage","payloadOrJson"]},cliReader:(e,t)=>({...tZ(t),app:ra(e[0],"push requires bundleOrPackage"),payload:ra(e[1],"push requires payloadOrJson")}),daemonWriter:tY(L.push,e=>{var t;return[(t=e).app,"string"==typeof t.payload?t.payload:JSON.stringify(t.payload)]})},{name:"trigger-app-event",metadata:sF,definition:sT,cliSchema:{usageOverride:"trigger-app-event <event> [payloadJson]",listUsageOverride:"trigger-app-event",helpDescription:"Invoke app-defined automation or test events with an optional structured payload.",summary:"Invoke app-defined automation/test events with optional structured payloads",positionalArgs:["event","payloadJson?"]},cliReader:(e,t)=>({...tZ(t),event:ra(e[0],"trigger-app-event requires event"),payload:e[1]?function(e,t){try{let t=JSON.parse(e);if(t&&"object"==typeof t&&!Array.isArray(t))return t}catch{}throw new A("INVALID_ARGS",`${t} must be a JSON object`)}(e[1],"trigger-app-event payload"):void 0}),daemonWriter:tY(L.triggerAppEvent,e=>{var t;return[(t=e).event,...t.payload?[JSON.stringify(t.payload)]:[]]})}],sj=n_("session","List active sessions or print daemon state directory.",{action:tS(["list","state-dir"],"list shows active sessions; state-dir prints the resolved daemon state directory without contacting the daemon.")}),sU=ru(sj,async(e,{action:t,...r})=>"state-dir"===t?{stateDir:await e.sessions.stateDir(r)}:{sessions:await e.sessions.list(r)}),sB={name:"session",metadata:sj,definition:sU,cliSchema:{usageOverride:"session list | session state-dir",listUsageOverride:"session",helpDescription:"List active sessions or print the effective daemon state directory",positionalArgs:["list|state-dir?"]},cliReader:(e,t)=>({...tZ(t),action:function(e){let t=e??"list";if("list"===t||"state-dir"===t)return t;throw new A("INVALID_ARGS","session only supports list or state-dir")}(e[0])}),cliOutputFormatter:oW.session};function sV(e,t){let r=void 0===e?NaN:Number(e);if(!Number.isInteger(r)||r<1)throw new A("INVALID_ARGS",`viewport ${t} must be a positive integer`);return r}let sz=n_("viewport","Resize the active web viewport.",{width:ty(tw("Viewport width in CSS pixels.",{min:1})),height:ty(tw("Viewport height in CSS pixels.",{min:1}))}),sq=ru(sz,(e,t)=>e.command.viewport(t)),sG=rs({name:"management",commands:[sc,sd,sp,oY,sh,sP,o6,sB,o9,o7,{name:"viewport",metadata:sz,definition:sq,cliSchema:{helpDescription:"Resize the active web viewport before taking snapshots or screenshots. Useful for fixed-layout or 100vh apps where changing the viewport reveals different content.",summary:"Resize the active web viewport for the current session",positionalArgs:["width","height"]},cliReader:(e,t)=>({...tZ(t),width:sV(e[0],"width"),height:sV(e[1],"height")}),daemonWriter:tY(L.viewport,e=>{let{width:t,height:r}=e;return[String(t),String(r)]}),cliOutputFormatter:oW.viewport},sM,sR,sN,...s_]}),sW="metro",sH=n_(sW,"Prepare Metro runtime or reload React Native apps.",{action:ty(tS(["prepare","reload"])),projectRoot:tb(),kind:tI(tf()),publicBaseUrl:tb(),proxyBaseUrl:tb(),bearerToken:tb(),bridgeScope:tI({type:"object",additionalProperties:!0}),launchUrl:tb(),port:tw(),listenHost:tb(),statusHost:tb(),startupTimeoutMs:tw(),probeTimeoutMs:tw(),reuseExisting:tx(),installDependenciesIfNeeded:tx(),runtimeFilePath:tb(),logPath:tb(),metroHost:tb(),metroPort:tw(),bundleUrl:tb(),timeoutMs:tw()}),sK=ru(sH,async(e,t)=>{var r,n,i;return"prepare"===t.action?await e.metro.prepare({projectRoot:(r=t).projectRoot,kind:r.kind,publicBaseUrl:r.publicBaseUrl,proxyBaseUrl:r.proxyBaseUrl,bearerToken:r.bearerToken,bridgeScope:r.bridgeScope??((n=r).tenant&&n.runId&&n.leaseId?{tenantId:n.tenant,runId:n.runId,leaseId:n.leaseId}:void 0),port:r.port,listenHost:r.listenHost,statusHost:r.statusHost,startupTimeoutMs:r.startupTimeoutMs,probeTimeoutMs:r.probeTimeoutMs,reuseExisting:r.reuseExisting,installDependenciesIfNeeded:r.installDependenciesIfNeeded,runtimeFilePath:r.runtimeFilePath}):await e.metro.reload({metroHost:(i=t).metroHost,metroPort:i.metroPort,bundleUrl:i.bundleUrl,timeoutMs:i.timeoutMs})}),sX=rs({name:"metro",commands:[{name:sW,metadata:sH,definition:sK,cliSchema:{usageOverride:"metro prepare (--public-base-url <url> | --proxy-base-url <url>) [--project-root <path>] [--port <port>] [--kind auto|react-native|expo]\n agent-device metro reload [--metro-host <host>] [--metro-port <port>] [--bundle-url <url>]",listUsageOverride:"metro",helpDescription:"Prepare a local Metro runtime or ask Metro to reload connected React Native apps",summary:"Prepare Metro reachability for React Native/Expo apps or trigger app reloads",positionalArgs:["prepare|reload"],allowedFlags:[...nS,...nx]},cliReader:(e,t)=>{let r=(e[0]??"").toLowerCase();if("prepare"!==r&&"reload"!==r)throw new A("INVALID_ARGS","metro requires a subcommand: prepare or reload");if("reload"===r)return{action:r,metroHost:t.metroHost,metroPort:t.metroPort,bundleUrl:t.bundleUrl,timeoutMs:t.metroProbeTimeoutMs};if(!t.metroPublicBaseUrl&&!t.metroProxyBaseUrl)throw new A("INVALID_ARGS","metro prepare requires --public-base-url <url> or --proxy-base-url <url>.");return{action:r,projectRoot:t.metroProjectRoot,kind:function(e){if(void 0!==e){if("auto"===e||"react-native"===e||"expo"===e)return e;throw new A("INVALID_ARGS","metro prepare --kind must be auto, react-native, or expo")}}(t.kind??t.metroKind),port:t.metroPreparePort,listenHost:t.metroListenHost,statusHost:t.metroStatusHost,publicBaseUrl:t.metroPublicBaseUrl,proxyBaseUrl:t.metroProxyBaseUrl,bearerToken:t.metroBearerToken,bridgeScope:t.tenant&&t.runId&&t.leaseId?{tenantId:t.tenant,runId:t.runId,leaseId:t.leaseId}:void 0,startupTimeoutMs:t.metroStartupTimeoutMs,probeTimeoutMs:t.metroProbeTimeoutMs,reuseExisting:!t.metroNoReuseExisting&&void 0,installDependenciesIfNeeded:!t.metroNoInstallDeps&&void 0,runtimeFilePath:t.metroRuntimeFile}},cliOutputFormatter:({input:e,result:t})=>{var r;return{data:(r={result:t,action:e.action}).result,text:"reload"===r.action?`Reloaded React Native apps via ${r.result.reloadUrl}`:JSON.stringify(r.result,null,2)}}}]}),sJ=["path","start","stop","doctor","mark","clear"],sY=["started","stopped","marked","cleared","restarted","removedRotatedFiles"],sQ={logs:rm(function(e){var t;return{data:e,text:e.path,stderr:s3([s2(e,["active","state","backend","sizeBytes"]),(t=e,sY.map(e=>{var r,n;return r=e,null==(n=t[e])?"":`${r}=${n}`}).filter(Boolean).join(" ")||void 0),e.hint,s5(e.notes)])}}),network:rm(function(e){let t=[],r=e.entries??[];if(e.path&&t.push(e.path),0===r.length)t.push("No recent HTTP(s) entries found.");else for(let e of r)t.push(...function(e){let t=e.method??"HTTP",r=e.url??"<unknown-url>",n=void 0!==e.status?` status=${e.status}`:"",i=e.timestamp?`${e.timestamp} `:"",a=void 0!==e.durationMs?` durationMs=${e.durationMs}`:"",o=[`${i}${t} ${r}${n}${a}`];return e.headers?s1(o,"headers",e.headers):(s0(o,"request headers",e.requestHeaders),s0(o,"response headers",e.responseHeaders)),s1(o,"request",e.requestBody),s1(o,"response",e.responseBody),o}(e));return{data:e,text:t.join("\n"),stderr:s3([s2(e,["active","state","backend","include","scannedLines","matchedLines"]),s5(e.notes)])}}),audio:rm(function(e){let t=[`Audio probe: ${String(e.state??"stopped")} heard=${String(!0===e.heard)}`,sZ("rmsDbfs",e.rmsDbfs),sZ("peakDbfs",e.peakDbfs)].filter(e=>!!e);return{data:e,text:t.join("\n"),stderr:s3([s2(e,["active","backend","source","durationMs","elapsedMs","bucketMs","sampleCount","sourceCount","mediaElementCount"]),s5(e.notes)])}})};function sZ(e,t){if(!Array.isArray(t))return;let r=t.filter(e=>"number"==typeof e&&Number.isFinite(e));return r.length>0?`${e}: [${r.join(", ")}]`:void 0}function s0(e,t,r){r&&0!==Object.keys(r).length&&e.push(` ${t}: ${JSON.stringify(r)}`)}function s1(e,t,r){void 0!==r&&e.push(` ${t}: ${r}`)}function s2(e,t){return t.map(t=>void 0!==e[t]&&null!==e[t]?`${t}=${e[t]}`:"").filter(Boolean).join(" ")||void 0}function s5(e){let t=e?.filter(e=>e.length>0)??[];return t.length>0?t.join("\n"):void 0}function s3(e){return e.filter(e=>!!e).join("\n")||void 0}let s4="logs",s8="network",s6="audio",s9=["probe"],s7=["start","status","stop"],le=n_(s4,"Manage session app logs.",{action:tS(sJ),message:tb(),restart:tx()}),lt=n_(s8,"Show recent HTTP traffic.",{action:tS(["dump","log"]),limit:tw(),include:tS(y)}),lr=n_(s6,"Probe audio levels.",{action:tS(s9),probeAction:tS(s7),durationMs:tw("Probe duration in milliseconds."),bucketMs:tw("Audio level bucket size in milliseconds.")}),ln=ru(le,(e,t)=>e.observability.logs(t)),li=ru(lt,(e,t)=>e.observability.network(t)),la=ru(lr,(e,t)=>e.observability.audio(t)),lo=tY(s4,e=>{var t;return[(t=e).action??"path",...rn(t.message)]}),ls=rs({name:"observability",commands:[{name:s4,metadata:le,definition:ln,cliSchema:{usageOverride:"logs path | logs start | logs stop | logs clear [--restart] | logs doctor | logs mark [message...]",helpDescription:"Session app log info, start/stop streaming, diagnostics, and markers",summary:"Manage session app logs",positionalArgs:["path|start|stop|clear|doctor|mark","message?"],allowsExtraPositionals:!0,allowedFlags:["restart"]},cliReader:(e,t)=>({...tZ(t),action:function(e){if(void 0!==e)return r2(sJ,e,{message:"logs requires path, start, stop, doctor, mark, or clear"})}(e[0]),message:e.slice(1).join(" ")||void 0,restart:t.restart}),daemonWriter:lo,cliOutputFormatter:sQ.logs},{name:s8,metadata:lt,definition:li,cliSchema:{usageOverride:"network dump [limit] [summary|headers|body|all] [--include summary|headers|body|all] | network log [limit] [summary|headers|body|all] [--include summary|headers|body|all]",listUsageOverride:"network",helpDescription:"Dump recent HTTP(s) traffic parsed from the session app log",summary:"Inspect HTTP(S) traffic parsed from session app logs, including summaries, headers, and bodies",positionalArgs:["dump|log","limit?","include?"],allowedFlags:["networkInclude"]},cliReader:(e,t)=>({...tZ(t),action:function(e){if(void 0!==e){if("dump"===e||"log"===e)return e;throw new A("INVALID_ARGS","network requires dump or log")}}(e[0]),limit:rr(e[1]),include:t.networkInclude??function(e){if(void 0!==e)return r2(y,e,{message:"network include must be summary, headers, body, or all"})}(e[2])}),daemonWriter:e=>{var t;return tQ(s8,[...(t=e).action?[t.action]:[],...ri(t.limit)],{...e,networkInclude:e.include})},cliOutputFormatter:sQ.network},{name:s6,metadata:lr,definition:la,cliSchema:{usageOverride:"audio probe start [durationSeconds] [bucketMs] | audio probe status | audio probe stop",listUsageOverride:"audio",helpDescription:"Probe browser or host-rendered simulator/emulator audio as compact dBFS buckets",summary:"Probe audio levels",positionalArgs:["probe","start|status|stop","durationSeconds?","bucketMs?"]},cliReader:(e,t)=>{let r;return{...tZ(t),action:function(e){if(void 0!==e)return r2(s9,e,{message:"audio requires probe"})}(e[0]),probeAction:function(e){if(void 0!==e)return r2(s7,e,{message:"audio probe requires start, status, or stop"})}(e[1]),durationMs:void 0===(r=rr(e[2]))?void 0:Math.round(1e3*r),bucketMs:rr(e[3])}},daemonWriter:e=>{var t;return tQ(s6,[(t=e).action??"probe",t.probeAction??"status",...ri(t.durationMs),...ri(t.bucketMs)],e)},cliOutputFormatter:sQ.audio}]}),ll={perf:rm(function(e){return{data:e,text:function(e){var t;let r="xctrace"===(t=e).kind?function(e){var t,r,n,i,a;let o="string"==typeof e.perf?e.perf:void 0,s="string"==typeof(t=e).outPath?t.outPath:"string"==typeof t.reportPath?t.reportPath:void 0;if(o&&s&&"xctrace"===e.kind){let t;return r=s,n="string"==typeof e.mode?e.mode:"capture",i=o,a=e.template,t=[r,`Perf ${n}: ${i}`],"string"==typeof a&&t.push(`Template: ${a}`),t.join("\n")}}(t):function(e){var t;let r,n,i,a=(r=lu((t=e).action),n=lu(t.kind),i=lu(t.type),r&&n&&i?{action:r,kind:n,type:i}:void 0);if(a){let t;return`Perf ${a.action}: ${a.kind} ${a.type}${(t=lu(e.state))?` state=${t}`:""}${function(e){let t=lu(e.outPath);if(!t)return"";let r=ld(e.sizeBytes);return`
|
|
29
|
-
${t}${void 0!==r?` (${lf(r)})`:""}`}(e)}${function(e){let t=H(e.summary)?e.summary:void 0,r=H(t?.frameHealth)?t.frameHealth:void 0;if(!r||!0!==r.available)return"";let n=ld(r.droppedFramePercent),i=ld(r.droppedFrameCount),a=ld(r.totalFrameCount);return void 0===n||void 0===i||void 0===a?"":`
|
|
30
|
-
Trace frame health: dropped ${lp(n)} (${Math.round(i)}/${Math.round(a)} frames)`}(e)}`}}(t);if(r)return r;let n=H(e.artifact)?e.artifact:void 0;return n?function(e){let t="string"==typeof e.kind?e.kind:"memory";if(!1===e.available){let r="string"==typeof e.reason&&e.reason.length>0?e.reason:"not available";return`Memory artifact (${t}): unavailable - ${r}`}let r="string"==typeof e.path?e.path:void 0,n=ld(e.sizeBytes),i=void 0===n?"":` (${lf(n)})`;return r?`Memory artifact (${t}): ${r}${i}`:`Memory artifact (${t}): captured${i}`}(n):function(e){var t,r,n,i,a;let o,s,l,u,c,d=H(e?.fps)?e.fps:void 0,p=(t=e,o=H(t?.cpu)?t.cpu:void 0,s=H(t?.memory)?t.memory:void 0,(l=[function(e){if(e?.available!==!0)return;let t=ld(e.usagePercent);return void 0!==t?`CPU ${lp(t)}`:void 0}(o),function(e){let t;if(e?.available!==!0)return;let r=ld(e.residentMemoryKb)??ld(e.totalPssKb)??ld(e.totalRssKb);return void 0!==r?`memory ${t=r/1024,`${t>=10?Math.round(t):t.toFixed(1)}MB`}`:void 0}(s)].filter(e=>!!e)).length>0?l.join(", "):void 0);if(!d)return lc(p,"missing frame metric");if(!1===d.available){return lc(p,"string"==typeof(r=d).reason&&r.reason.length>0?r.reason:"not available")}let m=function(e){let t=ld(e.droppedFramePercent),r=ld(e.droppedFrameCount);if(void 0!==t&&void 0!==r){var n,i,a;return[`dropped ${lp(t)}`,(n=r,void 0!==(i=ld(e.totalFrameCount))?`(${Math.round(n)}/${Math.round(i)} frames)`:`(${Math.round(n)} dropped frames)`),void 0!==(a=ld(e.sampleWindowMs))?`window ${lm(a)}`:""].filter(Boolean).join(" ")}}(d);return m?(n=d,i=m,u=[`Frame health: ${i}`],(c=Array.isArray((a=n).worstWindows)?a.worstWindows.flatMap(e=>{if(!H(e))return[];let t=function(e){let t=ld(e.startOffsetMs),r=ld(e.endOffsetMs),n=ld(e.missedDeadlineFrameCount);if(void 0===t||void 0===r||void 0===n)return;let i=ld(e.worstFrameMs),a=void 0===i?"":`, worst ${lm(i)}`;return`- +${lm(t)}-+${lm(r)}: ${Math.round(n)} missed-deadline frames${a}`}(e);return t?[t]:[]}):[]).length>0&&u.push("Worst windows:",...c),u.join("\n")):lc(p,"missing dropped-frame summary")}(H(e.metrics)?e.metrics:void 0)}(e)}})};function lu(e){return"string"==typeof e?e:void 0}function lc(e,t){return e?`Performance: ${e}`:`Frame health: unavailable - ${t}`}function ld(e){return"number"==typeof e&&Number.isFinite(e)?e:void 0}function lp(e){return`${Number.isInteger(e)?e:e.toFixed(1)}%`}function lm(e){let t=Math.max(0,Math.round(e));if(t<1e3)return`${t}ms`;let r=Math.round(t/1e3);if(r<60)return`${r}s`;let n=Math.floor(r/60),i=r%60;return i>0?`${n}m ${i}s`:`${n}m`}function lf(e){if(e<1024)return`${Math.round(e)}B`;let t=e/1024;if(t<1024)return`${t>=10?Math.round(t):t.toFixed(1)}KB`;let r=t/1024;return`${r>=10?Math.round(r):r.toFixed(1)}MB`}let lh="perf",lg=n_(lh,"Show session performance, frame health, and memory diagnostics.",{area:tS(r6),subject:tS(r7),action:tS(r9),kind:tS(ne),template:tb("xctrace template name, for example Time Profiler."),out:tb("Output artifact path."),tracePath:tb("Existing .trace path to report, defaults to the latest session trace.")}),ly=ru(lg,(e,t)=>e.observability.perf(t)),lb=tY(lh,e=>{var t;let r;return"cpu"===(r=(t=e).area??(t.action?"metrics":void 0))?lw([...rn(r),...rn(t.subject),...rn(t.action),...rn(t.kind)],t):"trace"===r?lw([...rn(r),...rn(t.action),...rn(t.kind)],t):[...rn(r),...rn(t.action)]}),lv=rs({name:"perf",commands:[{name:lh,metadata:lg,definition:ly,cliSchema:{usageOverride:"perf metrics --json\n agent-device perf frames --json\n agent-device perf memory sample --json\n agent-device perf memory snapshot [--kind android-hprof|memgraph] [--out <path>]\n agent-device perf cpu profile start --kind xctrace [--template <name>] --out <profile.trace>\n agent-device perf cpu profile stop --kind xctrace --out <profile.trace>\n agent-device perf cpu profile report --kind xctrace --out <report.json>\n agent-device perf trace start|stop --kind xctrace [--template <name>] --out <path>\n agent-device perf cpu profile start --kind simpleperf --out <cpu.perf.data>\n agent-device perf cpu profile stop --kind simpleperf\n agent-device perf cpu profile report --kind simpleperf --out <cpu-report.json>\n agent-device perf trace start|stop --kind perfetto [--out <path>]",listUsageOverride:"perf",helpDescription:"Show session performance metrics, focused frame/jank health, memory diagnostics artifacts, Apple xctrace artifacts, or Android native Simpleperf/Perfetto artifacts. Prefer explicit perf metrics --json for first-pass startup/CPU/memory data. For CPU profiles, start/stop write the raw artifact and report writes a compact .json summary; include report after simpleperf stop when the task needs agent-readable native CPU evidence. Bare perf and metrics remain aliases. Native perf output is agent evidence: compact state, artifact path, and size only; raw profiles/traces stay on disk.",summary:"Check runtime metrics, frames, memory, CPU profiles, or native trace artifacts",positionalArgs:["area?","subjectOrAction?","action?"],allowedFlags:["kind","perfTemplate","out"]},cliReader:(e,t)=>{var r;return{...tZ(t),...function(e,t={}){if(void 0!==e[0]&&void 0===e[1]){let r=lx(e[0],{allowUndefined:!0});if(r)return{action:r,kind:lS(t.kind),out:t.out}}let r=function(e){if(void 0===e)return;let t=e.toLowerCase();if(nd(t))return t;throw new A("INVALID_ARGS",no)}(e[0]);return"cpu"===r?{area:r,subject:function(e){let t=e?.toLowerCase();if(void 0!==t&&nm(t))return t;throw new A("INVALID_ARGS",nl)}(e[1]),action:lx(e[2]),kind:lS(t.kind),template:t.template,out:t.out}:"trace"===r?{area:r,action:lx(e[1]),kind:lS(t.kind),template:t.template,out:t.out}:{area:r,action:lx(e[1]),kind:lS(t.kind),out:t.out}}(e,{kind:"string"==typeof(r=t.kind)?lS(r):void 0,template:t.perfTemplate,out:t.out})}},daemonWriter:lb,cliOutputFormatter:ll.perf}]});function lw(e,t){let r=[...e];return(t.template||t.out||t.tracePath)&&r.push(t.template??""),(t.out||t.tracePath)&&r.push(t.out??""),t.tracePath&&r.push(t.tracePath),r}function lx(e,t={}){if(void 0===e)return;let r=e.toLowerCase();if(np(r))return r;if(!t.allowUndefined)throw new A("INVALID_ARGS",ns)}function lS(e){if(void 0===e)return;let t=e.toLowerCase();if(nf(t))return t;throw new A("INVALID_ARGS",nu)}let lk=/\b(logbox|redbox|reload js|copy stack|component stack|call stack|runtime error|open debugger to view warnings)\b/,lI=/\b(redbox|runtime error|reload js|copy stack|component stack|call stack)\b/,lD=[/\b[\w.$<>/-]+\.(?:tsx?|jsx?):\d+(?::\d+)?\b/,/\b[\w.$<>/-]+\.(?:tsx?|jsx?)\s+\(\d+:\d+\)/],lA=[/^!,\s+/,/^(warn|warning|error):\s+/,/\b(?:possible\s+)?unhandled (?:promise )?rejection\b/],l$=["open debugger to view warnings","getsnapshot should be cached to avoid an infinite loop",'unique "key" prop',"unique 'key' prop","virtualizedlists should never be nested","failed prop type"],lM=new Set(["x","\xd7","✕","✖","⨯"]);function lR(e){if(lL(e).detected)return"Hint: React Native warning/error overlay detected. It overlays part of the app and should be handled before interacting.\nRun: agent-device react-native dismiss-overlay\nThe command verifies the overlay is gone. Run agent-device snapshot -i afterward only when you need fresh refs for the next action."}function lN(e){return lL(e)}function lL(e){var t,r,n,i,a,o,s,l,u,c;let d,p,m,f,h,g,y,b,v=(d=(t=e).map(lF).join("\n").toLowerCase(),p=lG(t,lj),m=lG(t,lB),f=lG(t,lT,lV),h=lG(t,l_),g=(r=d,lD.some(e=>e.test(r))),y=lE(d),b=(n=d,i=p,a=m,i.length>0||a.length>0||/\b(reload js|copy stack)\b/.test(n)),{dismissNodes:p,minimizeNodes:m,collapsedNodes:f,redBox:(o=d,s=g,l=b,lI.test(o)||lE(o)||s&&l),detected:(u={text:d,hasReactNativeStackFrame:g,hasOverlayControl:b,hasControllessRedBoxText:y,collapsedNodes:f,openDebuggerWarningNodes:h}).collapsedNodes.length>0||u.openDebuggerWarningNodes.length>0||u.hasControllessRedBoxText||u.hasOverlayControl&&(c=u.text,lk.test(c)||u.hasReactNativeStackFrame)}),w=v.detected?function(e){let t=lH(e.dismissNodes,lW);if(t){let e;var r,n=t,i=(r=t,(e=lX(r)?.trim().toLowerCase())&&lU(e)?"dismiss":"close");if(!n.rect)throw Error("React Native overlay target node must have rect");return{action:i,point:x(n.rect),rect:n.rect,ref:n.ref,label:lX(n)}}let a=lH(e.collapsedNodes.filter(lz),lK);return a?.rect?{action:"close-collapsed-banner",point:function(e){var t,r;if(!e.rect)throw Error("Collapsed React Native warning node must have rect");let n=Math.min(e.rect.height,52),i=Math.min(36,Math.max(18,.45*n));return{x:Math.round((t=e.rect.x+e.rect.width-i,r=e.rect.x+1,Math.min(e.rect.x+e.rect.width-1,Math.max(r,t)))),y:Math.round(e.rect.y+n/2)}}(a),rect:a.rect,ref:a.ref,label:lX(a)}:null}(v):null;return{detected:v.detected,redBox:v.redBox,dismissNodes:v.dismissNodes,minimizeNodes:v.minimizeNodes,collapsedNodes:v.collapsedNodes,primaryAction:w}}function lO(e){return[...e.dismissNodes,...e.minimizeNodes,...e.collapsedNodes]}function lP(e){var t;return lT(e.label?.trim())&&!!(t=e.rect)&&t.x<=1&&t.y<=1&&t.width>=300&&t.height>=600}function lC(e,t){let r=e.label?.trim();return!!r&&!!lP(e)&&t.some(e=>e.label?.trim()===r&&lq(e))}function lF(e){return[e.label,e.value,e.identifier,e.type,e.role].filter(Boolean).join(" ")}function lE(e){return/\buncaught\b/.test(e)&&/unable to download asset/.test(e)}function lT(e){let t=e?.trim().toLowerCase();return!!t&&(l$.some(e=>t.includes(e))||lA.some(e=>e.test(t)))}function l_(e){return e.includes("open debugger to view warnings")||/^!,\s+open debugger\b/.test(e)}function lj(e){var t,r;return lU(e)||(t=e,/^close(?:\s*\([^)]*\))?$/i.test(t))||(r=e,lM.has(r))}function lU(e){return/^dismiss(?:\s*\([^)]*\))?$/i.test(e)}function lB(e){return/^minimi[sz]e(?:\b|\s|\()/i.test(e)}function lV(e){return!e.rect||e.rect.height<=180}function lz(e){let t=lX(e)?.trim().toLowerCase()??"";return(l_(t)||/^!,\s+/.test(t))&&lq(e)}function lq(e){return!!e.rect&&e.rect.width>=120&&e.rect.height>=36&&e.rect.height<=180}function lG(e,t,r=()=>!0){let n=[];for(let i of e)i.ref&&r(i)&&[i.label,i.value,i.identifier].map(e=>e?.trim().toLowerCase()).filter(e=>!!e).some(e=>t(e))&&n.push(i);return n}function lW(e){var t;let r;return[+(!0===(r=[e.type,e.role,e.subrole].join(" ").toLowerCase(),/\b(button|menuitem|link)\b/.test(r))),+(!0===e.hittable),-((t=e.rect)?t.width*t.height:1/0)]}function lH(e,t){let r=e.filter(e=>e.rect);return 0===r.length?null:r.sort((e,r)=>(function(e,t){for(let r=0;r<e.length;r+=1){let n=e[r]-t[r];if(0!==n)return n}return 0})(t(r),t(e)))[0]??null}function lK(e){return[+(!0===e.hittable),e.rect?.width??0,e.rect?.y??0]}function lX(e){return e.label??e.value??e.identifier}let lJ="react-native",lY=n_(lJ,"Run supported React Native app automation helpers.",{action:ty(tS(["dismiss-overlay"]))}),lQ=ru(lY,(e,t)=>e.command.reactNative(t)),lZ=tY(lJ,e=>[ro(e.action,"react-native requires action")]),l0=rs({name:"react-native",commands:[{name:lJ,metadata:lY,definition:lQ,cliSchema:{usageOverride:"react-native dismiss-overlay",listUsageOverride:"react-native dismiss-overlay",positionalArgs:["dismiss-overlay"]},cliReader:(e,t)=>({...tZ(t),action:function(e){if("dismiss-overlay"===e)return e;throw new A("INVALID_ARGS","react-native supports only: dismiss-overlay")}(e[0])}),daemonWriter:lZ}]}),l1=["medium","high"];function l2(e){var t;let r;if(l1.includes(e))return e;let n=void 0!==(r="number"==typeof e?e:"string"==typeof(t=e)&&/^\d+$/.test(t)?Number(t):void 0)&&Number.isInteger(r)&&r>=5&&r<=10?r:void 0;if(void 0!==n)return n<=7?"medium":"high"}let l5={record:rm(function(e){let t,r="string"==typeof e.outPath?e.outPath:"",n=Array.isArray(t=e.chunks)?t.flatMap(e=>e&&"object"==typeof e?"number"!=typeof e.index||"string"!=typeof e.path?[]:[{index:e.index,path:e.path}]:[]):[];if(n.length<=1){var i,a;let t;return{data:e,text:(i=e,t=[],(a=r)&&t.push(a),"string"==typeof i.sessionStateDir&&t.push(`Session state: ${i.sessionStateDir}`),"string"==typeof i.warning&&t.push(`Warning: ${i.warning}`),"string"==typeof i.overlayWarning&&t.push(`Overlay warning: ${i.overlayWarning}`),t.join("\n"))}}let o=["Recording chunks:"];for(let e of n)o.push(` ${e.index}: ${e.path}`);return"string"==typeof e.telemetryPath&&o.push(`Telemetry: ${e.telemetryPath}`),"string"==typeof e.warning&&o.push(`Warning: ${e.warning}`),"string"==typeof e.overlayWarning&&o.push(`Overlay warning: ${e.overlayWarning}`),{data:e,text:o.join("\n")}})},l3="record",l4="trace",l8=["start","stop"],l6=n_(l3,"Start or stop screen recording.",{action:ty(tS(l8)),path:tb(),fps:tw(),maxSize:tw(),quality:tS(l1),hideTouches:tx()}),l9=n_(l4,"Start or stop trace capture.",{action:ty(tS(l8)),path:tb()}),l7=ru(l6,(e,t)=>e.recording.record(t)),ue=ru(l9,(e,t)=>e.recording.trace(t)),ut=tY(l3,e=>ui(e)),ur=tY(l4,e=>ui(e)),un=rs({name:"recording",commands:[{name:l3,metadata:l6,definition:l7,cliSchema:{usageOverride:"record start [path] [--fps <n>] [--max-size <px>] [--quality <medium|high>] [--hide-touches] | record stop",listUsageOverride:"record start [path] | record stop",helpDescription:"Start/stop screen recording; Android recordings longer than the 180s adb screenrecord limit are returned as multiple MP4 chunks. Use --max-size to limit dimensions and --quality to choose medium or high export quality",summary:"Start or stop screen recording",positionalArgs:["start|stop","path?"],allowedFlags:["fps","screenshotMaxSize","quality","hideTouches"]},cliReader:(e,t)=>({...tZ(t),action:ua(e[0],l3),path:e[1],fps:t.fps,maxSize:t.screenshotMaxSize,quality:t.quality,hideTouches:t.hideTouches}),daemonWriter:ut,cliOutputFormatter:l5.record},{name:l4,metadata:l9,definition:ue,cliSchema:{usageOverride:"trace start <path> | trace stop <path>",listUsageOverride:"trace start <path> | trace stop <path>",helpDescription:"Start/stop trace log capture; when an artifact path is requested, pass the same positional path to start and stop",summary:"Start or stop trace capture",positionalArgs:["start|stop","path?"]},cliReader:(e,t)=>({...tZ(t),action:ua(e[0],l4),path:e[1]}),daemonWriter:ur}]});function ui(e){return[e.action,...rn(e.path)]}function ua(e,t){if("start"===e||"stop"===e)return e;throw new A("INVALID_ARGS",`${t} requires start|stop`)}let uo="replay",us="test",ul="Replay a recorded session.",uu=n_(uo,ul,{path:ty(tb()),update:tx(),backend:tb(),maestro:tx(),env:tk()}),uc=n_(us,"Run one or more replay scripts.",{paths:ty(tk()),update:tx(),backend:tb(),maestro:tx(),env:tk(),failFast:tx(),timeoutMs:tw(),retries:tw(),recordVideo:tx(),artifactsDir:tb(),shardAll:tw(),shardSplit:tw()}),ud=ru(uu,(e,t)=>e.replay.run(t)),up=ru(uc,(e,t)=>e.replay.test(t)),um=rs({name:"replay",commands:[{name:uo,metadata:uu,definition:ud,cliSchema:{usageOverride:"replay <path> | replay export <file.ad> [--format maestro] [--out <path>]",helpDescription:"Replay a recorded session. For Maestro YAML compatibility flows, use replay <flow.yaml> --maestro and keep the target binding such as --platform ios on the replay command.",summary:ul,positionalArgs:["path"],allowsExtraPositionals:!0,allowedFlags:["replayMaestro","replayExportFormat",...nI,"timeoutMs","out"]},cliReader:(e,t)=>({...tZ(t),path:ra(e[0],"replay requires path"),update:t.replayUpdate,backend:t.replayMaestro?"maestro":void 0,env:t.replayEnv}),daemonWriter:e=>tQ(uo,[ro(e.path,"replay requires path")],{...e,replayUpdate:e.update,replayBackend:uf(e),replayEnv:e.env,replayShellEnv:uh(process.env)})},{name:us,metadata:uc,definition:up,cliSchema:{usageOverride:"test <path-or-glob>...",listUsageOverride:"test <path-or-glob>...",helpDescription:"Run one or more replay scripts as a serial test suite",summary:"Run replay test suites",positionalArgs:["pathOrGlob"],allowsExtraPositionals:!0,allowedFlags:["replayMaestro",...nI,"failFast","timeoutMs","retries","recordVideo","artifactsDir","reporter","reportJunit","shardAll","shardSplit"]},cliReader:(e,t)=>({...tZ(t),paths:e,update:t.replayUpdate,backend:t.replayMaestro?"maestro":void 0,env:t.replayEnv,failFast:t.failFast,timeoutMs:t.timeoutMs,retries:t.retries,recordVideo:t.recordVideo,artifactsDir:t.artifactsDir,shardAll:t.shardAll,shardSplit:t.shardSplit}),daemonWriter:e=>{let t;return tQ(us,e.paths??[],{...(t={...e},delete t.reporter,delete t.reportJunit,t),replayUpdate:e.update,replayBackend:uf(e),replayEnv:e.env,replayShellEnv:uh(process.env)})}}]});function uf(e){return e.backend??(!0===e.maestro?"maestro":void 0)}function uh(e){let t={};for(let[r,n]of Object.entries(e))"string"==typeof n&&r.startsWith("AD_VAR_")&&(t[r]=n);return t}let ug=["in-app","system"],uy=["portrait","portrait-upside-down","landscape-left","landscape-right"];function ub(e){if(void 0===e)throw new A("INVALID_ARGS","rotate requires an orientation argument. Use portrait|portrait-upside-down|landscape-left|landscape-right.");switch(e?.trim().toLowerCase()){case"portrait":return"portrait";case"portrait-upside-down":case"upside-down":return"portrait-upside-down";case"landscape-left":case"left":return"landscape-left";case"landscape-right":case"right":return"landscape-right";default:throw new A("INVALID_ARGS",`Invalid rotation: ${e}. Use portrait|portrait-upside-down|landscape-left|landscape-right.`)}}let uv={appstate:rm(function(e){return{data:e,text:function(e){if("ios"===e.platform){let t=[`Foreground app: ${e.appName??e.appBundleId??"unknown"}`];return e.appBundleId&&t.push(`Bundle: ${e.appBundleId}`),e.source&&t.push(`Source: ${e.source}`),t.join("\n")}if("android"===e.platform){let t=[`Foreground app: ${e.package??"unknown"}`];return e.activity&&t.push(`Activity: ${e.activity}`),t.join("\n")}return null}(e)}}),back:rf,home:rf,rotate:rf,"app-switcher":rf,keyboard:rm(function(e){if("android"===e.platform&&"status"===e.action){var t;let r=[`Keyboard visible: ${!0===e.visible?"yes":"no"}`,`Input type: ${e.type??e.inputType??"unknown"}`,`Input owner: ${e.inputOwner??"unknown"}`];return e.inputMethodPackage&&r.push(`Input method: ${e.inputMethodPackage}`),e.focusedPackage&&r.push(`Focused package: ${e.focusedPackage}`),e.focusedResourceId&&r.push(`Focused resource: ${e.focusedResourceId}`),r.push(`Next action: ${(t=e.visible,"ime"===e.inputOwner?"Focused input appears to be owned by the keyboard/IME; dismiss or change the IME before retrying text entry.":!0===t?"Keyboard is visible and focused input appears app-owned; fill/type can proceed.":"Keyboard is hidden; focus an app field before type, or use fill with a concrete target.")}`),{data:e,text:r.join("\n")}}return rh(e)}),clipboard:rm(function(e){return"read"===e.action?{data:e,text:e.text}:rh(e)})},uw="appstate",ux="back",uS="home",uk="rotate",uI="app-switcher",uD="keyboard",uA="clipboard",u$=n_(uw,"Show foreground app or activity.",{}),uM=n_(ux,"Navigate back.",{mode:tS(ug)}),uR=n_(uS,"Go to the home screen.",{}),uN=n_(uk,"Rotate device orientation.",{orientation:ty(tS(uy))}),uL=n_(uI,"Open the app switcher.",{}),uO=n_(uD,"Inspect or dismiss the keyboard.",{action:tS(["status","dismiss"])}),uP=n_(uA,"Read or write clipboard text.",{action:ty(tS(["read","write"])),text:tb()}),uC=ru(u$,(e,t)=>e.command.appState(t)),uF=ru(uM,(e,t)=>e.command.back(t)),uE=ru(uR,(e,t)=>e.command.home(t)),uT=ru(uN,(e,t)=>e.command.rotate(t)),u_=ru(uL,(e,t)=>e.command.appSwitcher(t)),uj=ru(uO,(e,t)=>e.command.keyboard(t)),uU=ru(uP,(e,t)=>e.command.clipboard(t)),uB=tY(uw),uV=tY(uS),uz=tY(uk,e=>[ro(e.orientation,"rotate requires orientation")]),uq=tY(uI),uG=tY(uD,e=>rn(e.action)),uW=tY(uA,e=>{var t;return"read"===(t=e).action?["read"]:["write",t.text]}),uH=[oz,sG,iL,rs({name:"system",commands:[{name:uw,metadata:u$,definition:uC,cliSchema:{helpDescription:"Show foreground app/activity"},cliReader:(e,t)=>tZ(t),daemonWriter:uB,cliOutputFormatter:uv.appstate},{name:ux,metadata:uM,definition:uF,cliSchema:{usageOverride:"back [--in-app|--system]",allowedFlags:["backMode"]},cliReader:(e,t)=>({...tZ(t),mode:t.backMode}),daemonWriter:e=>{var t;return tQ(ux,[],{...e,backMode:"in-app"===(t=e.mode)||"system"===t?t:void 0})},cliOutputFormatter:uv.back},{name:uS,metadata:uR,definition:uE,cliReader:(e,t)=>tZ(t),daemonWriter:uV,cliOutputFormatter:uv.home},{name:uk,metadata:uN,definition:uT,cliSchema:{usageOverride:"rotate <portrait|portrait-upside-down|landscape-left|landscape-right>",helpDescription:"Rotate device orientation on iOS and Android",positionalArgs:["orientation"]},cliReader:(e,t)=>({...tZ(t),orientation:ub(e[0])}),daemonWriter:uz,cliOutputFormatter:uv.rotate},{name:uI,metadata:uL,definition:u_,cliReader:(e,t)=>tZ(t),daemonWriter:uq,cliOutputFormatter:uv["app-switcher"]},{name:uD,metadata:uO,definition:uj,cliSchema:{usageOverride:"keyboard [status|get|dismiss|enter|return]",helpDescription:"Inspect Android keyboard visibility/type or press/dismiss the device keyboard. To hide the keyboard, use keyboard dismiss. It taps safe controls like Done when available, verifies the keyboard closed, and reports UNSUPPORTED_OPERATION when no safe control is available.",summary:"Inspect, press, or dismiss the device keyboard",positionalArgs:["action?"]},cliReader:(e,t)=>({...tZ(t),...function(e){if(e.length>1)throw new A("INVALID_ARGS","keyboard accepts at most one action argument.");return tW({action:function(e){let t=e?.toLowerCase();if("get"===t)return"status";if(void 0===t||"status"===t||"dismiss"===t||"enter"===t||"return"===t)return t;throw new A("INVALID_ARGS","keyboard action must be status, get, dismiss, enter, or return.")}(e[0])})}(e)}),daemonWriter:uG,cliOutputFormatter:uv.keyboard},{name:uA,metadata:uP,definition:uU,cliSchema:{usageOverride:"clipboard read | clipboard write <text>",listUsageOverride:"clipboard read | clipboard write <text>",helpDescription:"Read or write device clipboard text",positionalArgs:["read|write","text?"],allowsExtraPositionals:!0},cliReader:(e,t)=>({...tZ(t),...function(e){let t=e[0]?.toLowerCase();if("read"!==t&&"write"!==t)throw new A("INVALID_ARGS","clipboard requires a subcommand: read or write.");if("read"===t){if(1!==e.length)throw new A("INVALID_ARGS","clipboard read does not accept additional arguments.");return{action:t}}if(e.length<2)throw new A("INVALID_ARGS","clipboard write requires text.");return{action:t,text:e.slice(1).join(" ")}}(e)}),daemonWriter:uW,cliOutputFormatter:uv.clipboard}]}),l0,um,ls,lv,iE,un,sX,nT];function uK(){return uH.flatMap(e=>[...e.definitions])}function uX(){return uZ("cliSchemas")}function uJ(){return uZ("cliReaders")}function uY(){return uZ("daemonWriters")}function uQ(){return uZ("cliOutputFormatters")}function uZ(e){let t={};for(let r of uH){let n=r[e];if(n)for(let[r,i]of Object.entries(n)){if(Object.hasOwn(t,r))throw Error(`Duplicate ${String(e)} command family entry: ${r}`);t[r]=i}}return t}let u0=uH.flatMap(e=>[...e.metadata]),u1=new Map(u0.map(e=>[e.name,e]));function u2(){return[...u0]}function u5(){return B().map(e=>{let t=u4(e);if(!t)throw Error(`Missing command metadata for MCP-exposed command: ${e}`);return t})}function u3(e){return u1.has(e)}function u4(e){return u1.get(e)}export{ug as BACK_MODES,nA as COMMON_COMMAND_SUPPORTED_FLAG_KEYS,uy as DEVICE_ROTATIONS,n$ as GLOBAL_FLAG_KEYS,sJ as LOG_ACTION_VALUES,ng as MAESTRO_COMPAT_TRACKER_URL,ny as MAESTRO_NEW_ISSUE_URL,nx as METRO_PREPARE_FLAGS,ns as PERF_ACTION_ERROR_MESSAGE,no as PERF_AREA_ERROR_MESSAGE,nu as PERF_KIND_ERROR_MESSAGE,nc as PERF_MEMORY_KIND_ERROR_MESSAGE,nl as PERF_SUBJECT_ERROR_MESSAGE,l1 as RECORDING_EXPORT_QUALITIES,rb as SCREENSHOT_ACTION_FLAG_KEYS,iz as SCROLL_DIRECTIONS,r3 as SESSION_SURFACES,n7 as SETTINGS_INVALID_ARGS_MESSAGE,iG as SWIPE_PATTERNS,lL as analyzeReactNativeOverlay,aw as annotateCoveredSnapshotNodes,rx as appendScreenshotScriptFlags,ah as areRectsApproximatelyEqual,iU as assertExclusiveScrollDistanceInputs,iX as assertScrollGestureInput,th as booleanSchema,rZ as buildMeta,eC as buildMobileSnapshotPresentation,nO as buildRequestFlags,iK as buildScrollGesturePlan,eS as buildSnapshotDisplayLines,iJ as buildSwipeGesturePlan,iY as buildSwipePresetGesturePlan,ij as buttonTag,i7 as captureScrollEdgeState,aO as clamp,i1 as clampGesturePoint,i6 as clampToRange,e0 as colorize,nC as createBatchDaemonWriter,eF as deriveMobileSnapshotHiddenContentHints,lN as detectReactNativeOverlay,eI as displayLabel,aM as expandRect,u4 as findCommandMetadata,tc as findMissingProxyLeaseFields,aY as focusCommand,e3 as formatCliStatusMarker,e6 as formatDoctorCheckDetailLines,e8 as formatDoctorCheckSummaryLine,lR as formatReactNativeOverlayWarning,eD as formatRole,eW as formatScreenshotDiffText,at as formatScrollEdgeMessage,eG as formatSnapshotDiffText,ek as formatSnapshotLine,i_ as getClickButtonValidationError,nR as getFlagDefinition,nN as getFlagDefinitions,it as getUnsupportedMacOsSettingMessage,iV as honoredScrollDurationMs,iZ as inferGestureReferenceFrame,ew as inferVerticalScrollIndicatorDirections,aR as intersectArea,u3 as isCommandName,ie as isMacOsSettingSupported,eT as isNodeVisibleInEffectiveViewport,np as isPerfAction,nd as isPerfArea,nf as isPerfKind,nh as isPerfMemoryKind,nm as isPerfSubject,tu as isProxyLeaseScope,lP as isReactNativeCollapsedWarningWrapperCandidate,lC as isReactNativeCollapsedWarningWrapperWithVisibleBanner,eO as isScrollableType,ax as isSnapshotNodeInteractionBlocked,rM as isSparseSnapshotQualityVerdict,r1 as isStringMember,ev as isSystemScrollIndicatorLabel,tr as leaseScopeFromOptions,tt as leaseScopeFromRequest,ti as leaseScopeToAllocateRequest,tn as leaseScopeToCommandFlags,tl as leaseScopeToConnectionMetadata,ta as leaseScopeToHeartbeatRequest,ts as leaseScopeToLeaseRpcParams,to as leaseScopeToReleaseRequest,uQ as listCommandFamilyCliOutputFormatters,uJ as listCommandFamilyCliReaders,uX as listCommandFamilyCliSchemas,uY as listCommandFamilyDaemonWriters,uK as listCommandFamilyDefinitions,u2 as listCommandMetadata,u5 as listMcpCommandMetadata,aQ as longPressCommand,tg as looseObjectSchema,e7 as markDoctorProgressRendered,rU as normalizeDeployResult,rz as normalizeDevice,rB as normalizeInstallFromSourceResult,rV as normalizeMaterializationReleaseResult,rX as normalizeOpenDevice,rK as normalizeRuntimeHints,iB as normalizeScrollDurationMs,rq as normalizeSession,ea as normalizeSnapshotTree,rJ as normalizeStartupSample,rY as normalizeTargetShutdownResult,aA as normalizedRect,au as now,ub as parseDeviceRotation,sg as parseInstallSourceConfig,i2 as parseScrollDirection,r8 as parseSessionSurface,r2 as parseStringMember,iQ as parseSwipePreset,iI as parseTimeout,iD as parseWaitPositionals,a2 as pinchCommand,i0 as pointFromPercent,ag as pointInsideRect,ez as printHumanError,eV as printJson,rL as publicSnapshotCaptureAnnotations,rp as readCommandMessage,ox as readFillTargetFromPositionals,ir as readLocationCoordinate,nP as readMetadataCommandFlags,lO as readReactNativeOverlayActionNodes,rS as readScreenshotScriptFlag,rO as readSerializedSnapshotCaptureAnnotations,rQ as readSnapshotNodes,r$ as readSnapshotQualityVerdict,sV as readViewportDimension,l2 as recordingQualityInputToExportQuality,aN as rectCenter,rR as renderSnapshotQualityWarnings,i9 as requireIntInRange,ii as requireLocationCoordinates,aC as resolveActionableTouchNode,aF as resolveActionableTouchResolution,iT as resolveClickButton,r_ as resolveDeployResultTarget,rj as resolveInstallFromSourceResultTarget,aT as resolveInteractionTarget,am as resolveRectCenter,r0 as resolveSessionName,ae as runScrollEdgePasses,rw as screenshotFlagsFromOptions,rv as screenshotOptionsFromFlags,aZ as scrollCommand,ac as sleep,rN as snapshotCaptureAnnotationsFrom,aL as squaredDistance,tf as stringSchema,rc as successText,eZ as supportsColor,a0 as swipeCommand,al as toBackendContext,ad as toBackendResult,a$ as unionRects,rd as withSuccessText};
|
package/dist/src/3006.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
let t;import e from"node:fs/promises";import r from"node:path";import{TextDecoder as n}from"node:util";import{promises as i}from"node:fs";import a from"node:os";import{isExecutablePath as o,runCmd as l}from"./8875.js";let f=["emulator","platform-tools",r.join("cmdline-tools","latest","bin"),r.join("cmdline-tools","tools","bin")];function u(t){let e=new Set,r=[];for(let n of t){let t=n.trim();!t||e.has(t)||(e.add(t),r.push(t))}return r}function d(t=process.env){let e=t.ANDROID_SDK_ROOT?.trim(),n=t.ANDROID_HOME?.trim(),i=t.HOME?.trim()||a.homedir();return u([e??"",n??"",i?r.join(i,"Android","Sdk"):""])}async function s(t){try{return await i.access(t,i.constants.X_OK),!0}catch{return!1}}async function c(t=process.env){let e,n=[];for(let i of d(t)){let t=[];for(let e of f){let n=r.join(i,e);await s(n)&&t.push(n)}0!==t.length&&(e||(e=i),n.push(...t))}if(e&&(t.ANDROID_SDK_ROOT=t.ANDROID_SDK_ROOT?.trim()||e,t.ANDROID_HOME=t.ANDROID_HOME?.trim()||e),0===n.length)return;let i=(t.PATH??"").split(r.delimiter).map(t=>t.trim()).filter(t=>t.length>0);t.PATH=u([...n,...i]).join(r.delimiter)}let m=new n("utf-16le");async function h(t){for(let r of["AndroidManifest.xml","base/manifest/AndroidManifest.xml"]){var e;let n=await p(t,r);if(!n)continue;let i=(e=n).subarray(0,Math.min(e.length,128)).toString("utf8").trimStart().startsWith("<")?function(t){let e=t.match(/<manifest\b[^>]*\bpackage\s*=\s*["']([^"']+)["']/i);return e?.[1]}(e.toString("utf8")):function(t){let e;if(!(t.length<8)&&3===t.readUInt16LE(0))for(let r=t.readUInt16LE(2);r+8<=t.length;){let n=t.readUInt16LE(r),i=t.readUInt16LE(r+2),a=t.readUInt32LE(r+4);if(a<=0||r+a>t.length)break;if(1===n)e=function(t){if(t.length<28)return[];let e=t.readUInt32LE(8),r=t.readUInt32LE(16),n=t.readUInt32LE(20),i=(256&r)!=0,a=[];for(let r=0;r<e;r+=1){let e=28+4*r;if(e+4>t.length)break;let o=n+t.readUInt32LE(e);a.push(i?function(t,e){let[,r]=I(t,e),[n,i]=I(t,e+r),a=e+r+i;return t.subarray(a,a+n).toString("utf8")}(t,o):function(t,e){let[r,n]=function(t,e){let r=t.readUInt16LE(e);return(32768&r)==0?[r,2]:[(32767&r)<<16|t.readUInt16LE(e+2),4]}(t,e),i=e+n;return m.decode(t.subarray(i,i+2*r))}(t,o))}return a}(t.subarray(r,r+a));else if(258===n&&e){let n=function(t,e,r,n){if(r<36||e+r>t.length||"manifest"!==n[t.readUInt32LE(e+20)])return;let i=t.readUInt16LE(e+24),a=t.readUInt16LE(e+26),o=t.readUInt16LE(e+28),l=e+i;for(let e=0;e<o;e+=1){let r=l+e*a;if(r+20>t.length)break;if("package"!==n[t.readUInt32LE(r+4)])continue;let i=t.readUInt32LE(r+8);if(0xffffffff!==i)return n[i];let o=t.readUInt8(r+15),f=t.readUInt32LE(r+16);if(3===o)return n[f];break}}(t,r,i,e);if(n)return n}r+=a}}(e);if(i)return i}return await E(t)}async function p(t,e){try{let r=await l("unzip",["-p",t,e],{allowFailure:!0,binaryStdout:!0});if(0!==r.exitCode||!r.stdoutBuffer||0===r.stdoutBuffer.length)return;return r.stdoutBuffer}catch{return}}function I(t,e){let r=t.readUInt8(e);return(128&r)==0?[r,1]:[(127&r)<<8|t.readUInt8(e+1),2]}async function E(t){let e=await g();if(!e)return;let r=await l(e,["dump","badging",t],{allowFailure:!0});if(0!==r.exitCode)return;let n=r.stdout.match(/package:\s+name='([^']+)'/);return n?.[1]}async function g(){if(void 0!==t)return t??void 0;try{for(let n of d()){let i=r.join(n,"build-tools");try{for(let n of(await e.readdir(i)).sort((t,e)=>e.localeCompare(t,void 0,{numeric:!0}))){let e=r.join(i,n,"aapt");if(r.isAbsolute(e)&&await o(e))return t=e,e}}catch{}}}catch{}t=null}export{c as ensureAndroidSdkPathConfigured,h as resolveAndroidArchivePackageName};
|
package/dist/src/314.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{promises as t}from"node:fs";import e from"node:os";import i from"node:path";import{AppError as a}from"./485.js";function r(n={}){let l=n.cwd??process.cwd(),c=n.tempDir??e.tmpdir(),p=n.rootDir?o(n.rootDir,l):void 0;return{resolveInput:async t=>{if("uploadedArtifact"===t.kind)throw new a("UNSUPPORTED_OPERATION","Uploaded artifact inputs require a custom artifact adapter");return{path:o(t.path,l,p)}},reserveOutput:async(e,a)=>{let r,n=a.visibility??"client-visible",d=e?.kind==="path"?o(e.path,l,p):i.join(r=await t.mkdtemp(i.join(c,`agent-device-${a.field}-`)),`${a.field}${a.ext}`);return await t.mkdir(i.dirname(d),{recursive:!0}),{path:d,visibility:n,...r?{cleanup:async()=>{await t.rm(r,{recursive:!0,force:!0})}}:{},publish:async()=>e?.kind==="downloadableArtifact"?{kind:"localPath",field:a.field,path:d,fileName:e.fileName??i.basename(e.clientPath??d)}:void 0}},createTempFile:async e=>{let a=await t.mkdtemp(i.join(c,`${e.prefix}-`));return{path:i.join(a,`file${e.ext}`),visibility:"internal",cleanup:async()=>{await t.rm(a,{recursive:!0,force:!0})}}}}}function o(t,e,r){var o,n;let l,c=i.isAbsolute(t)?t:i.resolve(e,t);if(r&&(o=c,n=r,""!==(l=i.relative(n,o))&&(l.startsWith("..")||i.isAbsolute(l))))throw new a("INVALID_ARGS","Local path is outside the artifact adapter root",{path:c,rootDir:r});return c}export{r as createLocalArtifactAdapter};
|