agent-device 0.20.8 → 0.20.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +94 -31
- package/android/ime-helper/dist/{agent-device-android-ime-helper-0.20.8.apk → agent-device-android-ime-helper-0.20.10.apk} +0 -0
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.10.apk.sha256 +1 -0
- package/android/ime-helper/dist/{agent-device-android-ime-helper-0.20.8.manifest.json → agent-device-android-ime-helper-0.20.10.manifest.json} +4 -4
- package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.20.8.apk → agent-device-android-snapshot-helper-0.20.10.apk} +0 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.10.apk.sha256 +1 -0
- package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.20.8.manifest.json → agent-device-android-snapshot-helper-0.20.10.manifest.json} +6 -6
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.h +3 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.m +13 -7
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AXSnapshotFallback.swift +10 -117
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +4 -4
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+FlatSnapshotFiltering.swift +103 -2
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +22 -23
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +3 -23
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Navigation.swift +10 -11
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+PrivateAXPresentation.swift +108 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScrollGesture.swift +8 -5
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Snapshot.swift +179 -73
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCapturePlan.swift +13 -12
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotPresentation.swift +183 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotPresentationTests.swift +0 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SystemModal.swift +20 -18
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextInputCandidatePolicy.swift +19 -0
- package/dist/src/agent-browser-tool.js +1 -1
- package/dist/src/agent-device-client.js +2 -2
- package/dist/src/ai-sdk.d.ts +61 -0
- package/dist/src/ai-sdk.js +1 -0
- package/dist/src/android-adb.d.ts +6 -6
- package/dist/src/android-adb.js +1 -1
- package/dist/src/android.js +1 -1
- package/dist/src/app-helpers.js +1 -1
- package/dist/src/app-lifecycle.js +6 -7
- package/dist/src/app-lifecycle2.js +2 -2
- package/dist/src/app-log-reconnect.js +1 -1
- package/dist/src/app-log-runtime.js +3 -3
- package/dist/src/app-resolution.js +2 -2
- package/dist/src/app-state.js +2 -0
- package/dist/src/appearance.js +1 -0
- package/dist/src/apps.js +5 -5
- package/dist/src/artifacts.d.ts +1 -1
- package/dist/src/audio-probe.js +1 -1
- package/dist/src/auth-session.js +1 -1
- package/dist/src/backend-snapshot-options.js +1 -0
- package/dist/src/boot-diagnostics.js +2 -2
- package/dist/src/bounds.js +1 -0
- package/dist/src/byte-limit-stream.js +1 -0
- package/dist/src/cli-config.js +1 -1
- package/dist/src/cli-help.js +42 -30
- package/dist/src/cli-runner.js +1 -1
- package/dist/src/cli.js +7 -7
- package/dist/src/client-metro.js +1 -1
- package/dist/src/client-types.d.ts +1582 -0
- package/dist/src/command-catalog.js +1 -0
- package/dist/src/command-metadata.js +1 -1
- package/dist/src/command-schema.js +1 -1
- package/dist/src/command-surface.js +1 -1
- package/dist/src/command-tools.js +2 -0
- package/dist/src/config.js +1 -0
- package/dist/src/connection-runtime.js +1 -1
- package/dist/src/connection.js +3 -3
- package/dist/src/contracts.d.ts +1 -1
- package/dist/src/contracts.js +1 -1
- package/dist/src/daemon-shutdown-report.js +1 -1
- package/dist/src/daemon.js +1 -1
- package/dist/src/debug-symbols.js +3 -3
- package/dist/src/device-claim-inspection.js +1 -1
- package/dist/src/device-input-state.js +1 -1
- package/dist/src/device-ready.js +1 -1
- package/dist/src/device2.js +2 -2
- package/dist/src/dispatch.js +1 -1
- package/dist/src/entities.js +1 -1
- package/dist/src/find.js +1 -1
- package/dist/src/finders.js +1 -1
- package/dist/src/generic-settle.js +1 -1
- package/dist/src/generic.js +1 -1
- package/dist/src/harmonyos.js +1 -1
- package/dist/src/hdc.js +1 -1
- package/dist/src/helper-package-install.js +1 -0
- package/dist/src/helper.js +2 -2
- package/dist/src/host-process.js +1 -1
- package/dist/src/ime-lifecycle.js +2 -9
- package/dist/src/ime-recovery-marker.js +1 -0
- package/dist/src/index.d.ts +2 -1569
- package/dist/src/index.js +1 -1
- package/dist/src/input-actions.js +4 -4
- package/dist/src/input-actions2.js +1 -1
- package/dist/src/install-artifact.js +1 -1
- package/dist/src/install-artifact2.js +1 -1
- package/dist/src/install-source2.js +1 -1
- package/dist/src/interaction-common.js +1 -0
- package/dist/src/interaction-runtime.js +1 -1
- package/dist/src/interaction-snapshot.js +1 -1
- package/dist/src/interaction.js +1 -1
- package/dist/src/interaction2.js +1 -0
- package/dist/src/interactor.js +2 -2
- package/dist/src/interactor2.js +1 -1
- package/dist/src/interactors.js +1 -0
- package/dist/src/internal/bin.js +2 -2
- package/dist/src/internal/daemon.js +4 -7
- package/dist/src/internal/png-worker.js +1 -1
- package/dist/src/inventory.js +1 -1
- package/dist/src/keyed-lock.js +1 -0
- package/dist/src/lease-context.js +1 -1
- package/dist/src/lease.js +1 -1
- package/dist/src/limrun-runtime-dependencies.js +1 -1
- package/dist/src/limrun.d.ts +13 -3
- package/dist/src/limrun.js +1 -1
- package/dist/src/linux.js +1 -1
- package/dist/src/location-coordinates.js +1 -0
- package/dist/src/logcat.js +1 -1
- package/dist/src/manifest.js +1 -1
- package/dist/src/mobile-snapshot-semantics.js +1 -0
- package/dist/src/observability.js +1 -0
- package/dist/src/owner-identity.js +1 -1
- package/dist/src/perf.js +4 -0
- package/dist/src/physical-device-control.js +1 -1
- package/dist/src/platform-runtime-app-log-process.js +1 -1
- package/dist/src/platform-runtime-host.js +1 -1
- package/dist/src/platform-runtime-network-web-transport.js +1 -1
- package/dist/src/platform-runtime-open-target.js +1 -0
- package/dist/src/platform-runtime-operation-host.js +4 -4
- package/dist/src/platform-runtime-runtime-hints.js +2 -0
- package/dist/src/platform-runtime-screen-recording-apple-runner-host.js +1 -1
- package/dist/src/platform-runtime-screen-recording-apple-runner-transport.js +1 -1
- package/dist/src/platform-runtime-screen-recording-apple-transport.js +1 -1
- package/dist/src/platform-runtime-screen-recording-finalizer-host.js +1 -1
- package/dist/src/platform-runtime-screen-recording-web-host.js +1 -1
- package/dist/src/platform-runtime.js +1 -1
- package/dist/src/platform-runtime2.js +1 -0
- package/dist/src/plist.js +1 -1
- package/dist/src/png-resize.js +1 -0
- package/dist/src/png-worker-contract.js +1 -1
- package/dist/src/process-lock.js +1 -1
- package/dist/src/project-runtime.js +1 -0
- package/dist/src/provider-webdriver.js +1 -1
- package/dist/src/provider.js +1 -0
- package/dist/src/proxy.js +1 -1
- package/dist/src/react-native.js +1 -1
- package/dist/src/record-runtime.js +1 -1
- package/dist/src/record-trace.js +1 -1
- package/dist/src/recording-export-quality.js +1 -0
- package/dist/src/registry.js +29 -26
- package/dist/src/remote-config2.js +1 -1
- package/dist/src/replay.js +2 -2
- package/dist/src/reporting.js +5 -5
- package/dist/src/rolldown-runtime.js +1 -0
- package/dist/src/runner-client.js +1 -0
- package/dist/src/runner-disposal.js +1 -1
- package/dist/src/runner-lease.js +1 -1
- package/dist/src/runner-sequence.js +1 -1
- package/dist/src/runtime-transport.js +1 -1
- package/dist/src/runtime.js +3 -3
- package/dist/src/runtime2.js +4 -3
- package/dist/src/runtime3.js +1 -3
- package/dist/src/runtime4.js +3 -1
- package/dist/src/runtime5.js +1 -1
- package/dist/src/runtime6.js +1 -1
- package/dist/src/runtime7.js +1 -1
- package/dist/src/runtime8.js +1 -0
- package/dist/src/runtime9.js +1 -0
- package/dist/src/scoped-provider.js +1 -0
- package/dist/src/screenshot-density.js +1 -0
- package/dist/src/screenshot-result.js +4 -4
- package/dist/src/screenshot.js +1 -1
- package/dist/src/script-source-bundle.js +16 -0
- package/dist/src/sdk-android-adb.d.ts +44 -26
- package/dist/src/sdk-android-adb.js +4 -4
- package/dist/src/sdk-batch-runner.js +3 -3
- package/dist/src/sdk-contracts.d.ts +125 -88
- package/dist/src/sdk-contracts.js +2 -2
- package/dist/src/sdk-device.js +1 -1
- package/dist/src/sdk-finders.d.ts +1 -1
- package/dist/src/sdk-finders.js +1 -1
- package/dist/src/sdk-io.js +1 -1
- package/dist/src/sdk-remote-config.js +1 -1
- package/dist/src/sdk-selectors.d.ts +107 -95
- package/dist/src/sdk-selectors.js +1 -1
- package/dist/src/sdk.js +1 -0
- package/dist/src/selector-runtime.js +1 -1
- package/dist/src/selectors.d.ts +1 -1
- package/dist/src/selectors.js +1 -1
- package/dist/src/server.js +10 -3
- package/dist/src/session-target-evidence.js +1 -1
- package/dist/src/session.js +1 -30
- package/dist/src/session2.js +27 -0
- package/dist/src/setting-state.js +1 -1
- package/dist/src/shared.js +1 -1
- package/dist/src/simctl.js +1 -0
- package/dist/src/simulator-state.js +1 -0
- package/dist/src/simulator.js +1 -1
- package/dist/src/snapshot-runtime.js +1 -1
- package/dist/src/snapshot-scope.js +1 -0
- package/dist/src/snapshot-session.js +1 -1
- package/dist/src/snapshot.js +8 -1
- package/dist/src/snapshot2.js +1 -1
- package/dist/src/snapshot3.js +1 -0
- package/dist/src/src.js +1 -1
- package/dist/src/src2.js +1 -2
- package/dist/src/src3.js +2 -1
- package/dist/src/src4.js +1 -0
- package/dist/src/string-enum.js +1 -0
- package/dist/src/tool-provider.js +3 -3
- package/dist/src/tool-provider2.js +1 -1
- package/dist/src/tool-provider3.js +1 -1
- package/dist/src/update-check.js +1 -1
- package/dist/src/verdict.js +1 -0
- package/dist/src/verified-file.js +1 -0
- package/dist/src/version.js +1 -1
- package/dist/src/video.js +1 -1
- package/dist/src/web.js +1 -1
- package/package.json +27 -10
- package/server.json +3 -3
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.8.apk.sha256 +0 -1
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.8.apk.sha256 +0 -1
- package/dist/src/interaction-touch-reference-frame.js +0 -1
- package/dist/src/notifications.js +0 -1
- package/dist/src/platform-runtime-toolchain-host.js +0 -1
- package/dist/src/prepare-kind.js +0 -15
- package/dist/src/selector-vocabulary.js +0 -1
- package/dist/src/text-surface.js +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const
|
|
2
|
-
`)){let e=t.trim();if(!e||
|
|
1
|
+
import{n as e}from"./rolldown-runtime.js";const t=/(token|secret|password|authorization|cookie|api[_-]?key|access[_-]?key|private[_-]?key|user[_-]?code|device[_-]?code|refresh[_-]?credential)/i,n=/\b(?:bearer\s+[a-z0-9._-]+|adc_(?:agent|live|refresh|cli)_[a-z0-9._-]+)\b/gi,r=/\b([a-z0-9_-]*(?:api[_-]?key|token|secret|password|user[_-]?code|device[_-]?code|refresh[_-]?credential)[a-z0-9_-]*)(\s*[=:]\s*)("[^"]*"|'[^']*'|\S+)/gi,i=/https?:\/\/[^\s"'<>]+/gi;function a(e){return o(e,new WeakSet)}function o(e,n,r){if(e==null)return e;if(typeof e==`string`)return s(e,r);if(typeof e!=`object`)return e;if(n.has(e))return`[Circular]`;if(n.add(e),Array.isArray(e))return e.map(e=>o(e,n));let i={};for(let[r,a]of Object.entries(e)){if(t.test(r)){i[r]=`[REDACTED]`;continue}i[r]=o(a,n,r)}return i}function s(e,i){let a=e.trim();if(!a)return e;if(i&&t.test(i))return`[REDACTED]`;let o=c(a);return o=o.replace(n,`[REDACTED]`),o=o.replace(r,(e,t,n,r,i,a)=>u({key:t,separator:n,rawValue:r,offset:i,input:a})||l(r)?e:`${t}${n}[REDACTED]`),o===a?a.length>400?`${a.slice(0,200)}...<truncated>`:a:o}function c(e){return e.replace(i,e=>d(e)??e)}function l(e){return/^adc_(?:agent|live|refresh|cli)_\.\.\.$/i.test(e)}function u(e){if(e.key.toLowerCase()!==`token`||!e.separator.includes(`:`))return!1;try{return new URL(e.rawValue).pathname.replace(/\/+$/,``)===`/api-keys`?/(?:^|\b)(?:service\/)?api\s+$/i.test(e.input.slice(0,e.offset)):!1}catch{return!1}}function d(e){try{let t=new URL(e);return t.search&&=`?REDACTED`,(t.username||t.password)&&(t.username=`REDACTED`,t.password=`REDACTED`),t.toString()}catch{return null}}var f=e({AppError:()=>h,KNOWN_APP_ERROR_CODES:()=>p,asAppError:()=>S,createRequestCanceledError:()=>y,defaultHintForCode:()=>M,errorMessage:()=>x,isAgentDeviceError:()=>C,isRequestCanceledError:()=>b,normalizeAgentDeviceError:()=>w,normalizeError:()=>T,readDiagnosticsRecordRef:()=>A,retriableForErrorCode:()=>j,throwDaemonError:()=>g,toAppErrorCode:()=>m});const p=[`INVALID_ARGS`,`DEVICE_NOT_FOUND`,`DEVICE_IN_USE`,`TOOL_MISSING`,`APP_NOT_INSTALLED`,`UNSUPPORTED_PLATFORM`,`UNSUPPORTED_OPERATION`,`NOT_IMPLEMENTED`,`COMMAND_FAILED`,`SESSION_NOT_FOUND`,`UNAUTHORIZED`,`AMBIGUOUS_MATCH`,`REPLAY_DIVERGENCE`,`REPAIR_SESSION_EXPIRED`,`REPAIR_COMMIT_FAILED`,`UNKNOWN`];function m(e,t=`COMMAND_FAILED`){return typeof e==`string`&&e.length>0?e:t}var h=class extends Error{code;details;cause;constructor(e,t,n,r){super(t),this.code=e,this.details=n,this.cause=r}};function g(e){throw new h(m(e.code),e.message,{...e.details??{},hint:e.hint,diagnosticId:e.diagnosticId,logPath:e.logPath,logPathUnavailable:e.logPathUnavailable,diagnosticsRecord:e.diagnosticsRecord,retriable:e.retriable,supportedOn:e.supportedOn})}const _=`request_canceled`,v=`request canceled`;function y(e,t){return new h(`COMMAND_FAILED`,v,{hint:`The request was canceled intentionally (explicit cancel or client disconnect) — no retry is needed unless the cancellation was unintended.`,...e,reason:_},t)}function b(e){return!(e instanceof h)||e.code!==`COMMAND_FAILED`?!1:e.details?.reason===_?!0:e.message===v}function x(e){return e instanceof Error?e.message:String(e)}function S(e,t=`UNKNOWN`){return e instanceof h?e:e instanceof Error?new h(t,e.message,void 0,e):new h(t,`Unknown error`,{err:e})}function C(e){return e instanceof h}function w(e,t={}){return T(e,t)}function T(e,t={}){let n=S(e),r=n.details?a(n.details):void 0,i=k(r,`diagnosticId`)??t.diagnosticId,o=k(r,`logPath`)??t.logPath,s=k(r,`logPathUnavailable`),c=A(r?.diagnosticsRecord)??t.diagnosticsRecord,l=k(r,`hint`)??M(n.code),u=ne(r,`retriable`)??j(n.code),d=k(r,`supportedOn`),f=re(r),p=ee(n.code,n.message,r);return{code:n.code,message:p,hint:l,diagnosticId:i,logPath:o,...s===void 0?{}:{logPathUnavailable:s},...c===void 0?{}:{diagnosticsRecord:c},...u===void 0?{}:{retriable:u},...d===void 0?{}:{supportedOn:d},details:f}}const E=/^\S+ exited with code -?\d+$/;function ee(e,t,n){if(e!==`COMMAND_FAILED`||n?.processExitError!==!0)return t;let r=O(typeof n?.stderr==`string`?n.stderr:``);return r?E.test(t)?r:t.includes(r)?t:`${t}: ${r}`:t}const te=[/^an error was encountered processing the command/i,/^underlying error\b/i,/^simulator device failed to complete the requested operation/i],D=/^(?:(?:adb|xcrun|simctl):\s*)?(?:error:\s*)?/i;function O(e){for(let t of e.split(`
|
|
2
|
+
`)){let e=t.trim();if(!e||te.some(t=>t.test(e)))continue;let n=e.replace(D,``).trim();if(n)return n.length>200?`${n.slice(0,200)}...`:n}return null}function k(e,t){let n=e?.[t];return typeof n==`string`?n:void 0}function A(e){if(!e||typeof e!=`object`)return;let{session:t,requestId:n}=e;if(!(typeof t!=`string`||typeof n!=`string`)&&!(t.length===0||n.length===0))return{session:t,requestId:n}}function ne(e,t){let n=e?.[t];return typeof n==`boolean`?n:void 0}function re(e){if(!e)return;let t={...e};return delete t.hint,delete t.diagnosticId,delete t.logPath,delete t.logPathUnavailable,delete t.diagnosticsRecord,delete t.retriable,delete t.supportedOn,Object.keys(t).length>0?t:void 0}const ie={DEVICE_IN_USE:!0};function ae(e){return p.includes(e)}function j(e){return ae(e)?ie[e]:void 0}function M(e){switch(e){case`INVALID_ARGS`:return`Check command arguments and run --help for usage examples.`;case`SESSION_NOT_FOUND`:return`Run open first or pass an explicit device selector.`;case`TOOL_MISSING`:return`Install required platform tooling and ensure it is available in PATH.`;case`DEVICE_NOT_FOUND`:return`Verify the target device is booted/connected and selectors match.`;case`APP_NOT_INSTALLED`:return`Run apps to discover the exact installed package or bundle id, or install the app before open.`;case`UNSUPPORTED_OPERATION`:return`This command is not available for the selected platform/device.`;case`UNSUPPORTED_PLATFORM`:return`This platform is not supported for the requested operation; run devices to inspect available targets.`;case`AMBIGUOUS_MATCH`:return`Multiple candidates matched. Narrow the query or pass an exact identifier.`;case`DEVICE_IN_USE`:return`The device is busy with another agent-device request; retry once it frees up.`;case`REPLAY_DIVERGENCE`:return`Read details.divergence (screen/suggestions) for repair context, or rerun with --json for the full report.`;case`REPAIR_SESSION_EXPIRED`:return`The --save-script repair session was reaped before it was finalized; re-run replay <script> --save-script from the start.`;case`REPAIR_COMMIT_FAILED`:return`The repair transaction completed, but committing its healed script failed at teardown (no-clobber refusal or a filesystem error); inspect the target path/permissions, then re-run replay <script> --save-script to retry.`;case`NOT_IMPLEMENTED`:return`This command is part of the planned API but is not implemented yet.`;case`COMMAND_FAILED`:return`Retry with --debug and inspect diagnostics log for details.`;case`UNAUTHORIZED`:return`Refresh daemon metadata and retry the command.`;case`UNKNOWN`:return`Unexpected internal error. Retry with --debug and report the diagnostics log if it persists.`;default:return`Retry with --debug and inspect diagnostics log for details.`}}function N(e){return e===`xctest`||e===`android`||e===`harmonyos-arkui`||e===`macos-helper`||e===`linux-atspi`||e===`web`}function P(e){return e===void 0||e===`xctest`||e===`android`||e===`harmonyos-arkui`}function F(e){return e.map((e,t)=>({...e,ref:`e${t+1}`}))}const I=/^~s(\d+)$/,L=`Refs look like @e12, optionally pinned to the snapshot generation that minted them: @e12~s3 (the ref, then "~s" and the refsGeneration reported by the issuing snapshot/find response).`;function R(e){let t=e.trim(),n=t.indexOf(`~`);if(n===-1)return{base:t};let r=I.exec(t.slice(n));return!r||n===0?null:{base:t.slice(0,n),generation:Number(r[1])}}function z(e){let t=R(e);if(!t)return null;let n=t.base;return n.startsWith(`@`)?n.slice(1)||null:n.startsWith(`e`)?n:null}function B(e,t){return e.find(e=>e.ref===t)??null}function V(e){return JSON.stringify({interactiveOnly:e?.interactiveOnly===!0,depth:typeof e?.depth==`number`?e.depth:null,scope:e?.scope?.trim()||null,raw:e?.raw===!0,customActions:e?.customActions===!0})}function H(e){if(e)return{depth:e.snapshotDepth,interactiveOnly:e.snapshotInteractiveOnly,raw:e.snapshotRaw,scope:e.snapshotScope,customActions:e.snapshotCustomActions}}function U(e){return{x:Math.round(e.x+e.width/2),y:Math.round(e.y+e.height/2)}}const W=[`summary`,`headers`,`body`,`all`],G=[`digest`,`default`,`full`];function K(e){return e!==void 0&&e!=="default"}function q(e){return{parse(t){return e(t,`$`)}}}function J(e,t){throw Error(`${e}: ${t}`)}function Y(e,t){return(!e||typeof e!=`object`||Array.isArray(e))&&J(t,`Expected an object`),e}function X(e,t){return typeof e!=`string`&&J(t,`Expected a string`),e}function oe(e,t){return Number.isInteger(e)||J(t,`Expected an integer`),e}function se(e,t){return Array.isArray(e)||J(t,`Expected an array`),e}function Z(e,t,n){let r=e[t];return r===void 0?void 0:X(r,`${n}.${t}`)}function ce(e,t,n){let r=e[t];if(r!==void 0)return se(r,`${n}.${t}`).map((e,r)=>X(e,`${n}.${t}[${String(r)}]`))}function le(e,t,n){let r=e[t];return r===void 0?void 0:oe(r,`${n}.${t}`)}function Q(e,t,n){let r=e[t];return r===void 0?void 0:Y(r,`${n}.${t}`)}function $(e,t,n,r){let i=e[t];if(i!==void 0)return(typeof i!=`string`||!n.includes(i))&&J(`${r}.${t}`,`Expected one of: ${n.join(`, `)}`),i}const ue=q((e,t)=>{let n=Y(e,t);return{platform:$(n,`platform`,[`ios`,`android`],t),metroHost:Z(n,`metroHost`,t),metroPort:le(n,`metroPort`,t),bundleUrl:Z(n,`bundleUrl`,t),launchUrl:Z(n,`launchUrl`,t)}});function de(e,t){let n=e.id;return n==null||typeof n!=`string`&&typeof n!=`number`&&J(`${t}.id`,`Expected a string, number, or null`),n}const fe=q((e,t)=>{let n=Y(e,t);return{jsonrpc:Z(n,`jsonrpc`,t),id:de(n,t),method:Z(n,`method`,t),params:n.params}}),pe=q((e,t)=>{let n=Y(e,t);return{token:Z(n,`token`,t),session:Z(n,`session`,t),command:Z(n,`command`,t),positionals:ce(n,`positionals`,t),input:Q(n,`input`,t),flags:Q(n,`flags`,t),runtime:Q(n,`runtime`,t),meta:Q(n,`meta`,t)}});export{m as A,C,A as D,T as E,j as O,f as S,w as T,h as _,K as a,M as b,F as c,B as d,N as f,P as g,R as h,ue as i,a as j,g as k,V as l,H as m,G as n,fe as o,z as p,pe as r,L as s,W as t,U as u,S as v,b as w,x,y};
|
package/dist/src/sdk-device.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{_ as e}from"./sdk-contracts.js";function t(e){return Object.freeze({family:e.platform,...e.appleOs===void 0?{}:{appleOs:e.appleOs},kind:e.kind,...e.target===void 0?{}:{target:e.target},...e.iosPhysicalDeviceBackend===void 0?{}:{iosPhysicalDeviceBackend:e.iosPhysicalDeviceBackend}})}function n(e){return Object.freeze({id:e.id,...t(e)})}function r(e){return JSON.stringify([e.id,...o(e)])}function i(e,t){return r(e)===r(t)}function a(e,t){return JSON.stringify(o(e))===JSON.stringify(o(t))}function o(e){return[e.family,e.appleOs??null,e.kind,e.target??null,e.iosPhysicalDeviceBackend??null]}const s=[`ios`,`ipados`,`tvos`,`watchos`,`visionos`,`macos`],c=[`apple`,`android`,`harmonyos`,`vega`,`linux`,`web`],l=[`ios`,`macos`,`android`,`harmonyos`,`vega`,`linux`,`web`],u=[...c,`ios`,`macos`],d=[`mobile`,`tv`,`desktop`];function f(e){return e===`apple`||e===`ios`||e===`macos`}function p(e){return e.appleOs===`macos`||e.platform===`macos`}function m(e){return f(e.platform)&&!p(e)}function h(e){return e.platform===`android`||e.platform===`harmonyos`||f(e.platform)&&!p(e)}function g(e){return f(e.platform)?p(e)?`macos`:`ios`:e.platform}function _(e){return e===`macos`?{platform:`apple`,appleOs:`macos`}:e===`ios`?{platform:`apple`}:{platform:e}}function v(e){return f(e.platform)&&e.target===`tv`}function y(e){return e.appleOs?e.appleOs:e.platform===`macos`?`macos`:v(e)?`tvos`:`ios`}function b(e){return c.includes(e)}function x(e){return l.includes(e)}function S(e){return s.includes(e)}function C(e,t){return t?t===`apple`?f(e.platform):t===`ios`?f(e.platform)&&!p(e):t===`macos`?f(e.platform)&&p(e):e.platform===t:!0}function w(e,t){return t?T(t):e===`macos`||e===`desktop`?`macOS`:e===`tv`?`tvOS`:`iOS`}function T(e){switch(e){case`tvos`:return`tvOS`;case`macos`:return`macOS`;case`visionos`:return`visionOS`;default:return`iOS`}}function E(e){let{simulatorSetPath:t,platform:n,target:r}=e;if(t&&!(n===`macos`||r===`desktop`))return t}function D(e){return e.map((e,t)=>({device:e,index:t})).sort((e,t)=>
|
|
1
|
+
import{_ as e}from"./sdk-contracts.js";function t(e){return Object.freeze({family:e.platform,...e.appleOs===void 0?{}:{appleOs:e.appleOs},kind:e.kind,...e.target===void 0?{}:{target:e.target},...e.iosPhysicalDeviceBackend===void 0?{}:{iosPhysicalDeviceBackend:e.iosPhysicalDeviceBackend}})}function n(e){return Object.freeze({id:e.id,...t(e)})}function r(e){return JSON.stringify([e.id,...o(e)])}function i(e,t){return r(e)===r(t)}function a(e,t){return JSON.stringify(o(e))===JSON.stringify(o(t))}function o(e){return[e.family,e.appleOs??null,e.kind,e.target??null,e.iosPhysicalDeviceBackend??null]}const s=[`ios`,`ipados`,`tvos`,`watchos`,`visionos`,`macos`],c=[`apple`,`android`,`harmonyos`,`vega`,`linux`,`web`],l=[`ios`,`macos`,`android`,`harmonyos`,`vega`,`linux`,`web`],u=[...c,`ios`,`macos`],d=[`mobile`,`tv`,`desktop`];function f(e){return e===`apple`||e===`ios`||e===`macos`}function p(e){return e.appleOs===`macos`||e.platform===`macos`}function m(e){return f(e.platform)&&!p(e)}function h(e){return e.platform===`android`||e.platform===`harmonyos`||f(e.platform)&&!p(e)}function g(e){return f(e.platform)?p(e)?`macos`:`ios`:e.platform}function _(e){return e===`macos`?{platform:`apple`,appleOs:`macos`}:e===`ios`?{platform:`apple`}:{platform:e}}function v(e){return f(e.platform)&&e.target===`tv`}function y(e){return e.appleOs?e.appleOs:e.platform===`macos`?`macos`:v(e)?`tvos`:`ios`}function b(e){return c.includes(e)}function x(e){return l.includes(e)}function S(e){return s.includes(e)}function C(e,t){return t?t===`apple`?f(e.platform):t===`ios`?f(e.platform)&&!p(e):t===`macos`?f(e.platform)&&p(e):e.platform===t:!0}function w(e,t){return t?T(t):e===`macos`||e===`desktop`?`macOS`:e===`tv`?`tvOS`:`iOS`}function T(e){switch(e){case`tvos`:return`tvOS`;case`macos`:return`macOS`;case`visionos`:return`visionOS`;default:return`iOS`}}function E(e){let{simulatorSetPath:t,platform:n,target:r}=e;if(t&&!(n===`macos`||r===`desktop`))return t}function D(e){return e.map((e,t)=>({device:e,index:t})).sort((e,t)=>H(e,t)).map(({device:e})=>e)}function O(e){return!e||e===`apple`||e===`ios`}async function k(e,t,n={}){let r=e.filter(e=>I(e,t));return A(r,t)||N(r,t.deviceName)||(G(r)&&(r=D(r)),P(r,t,n))}function A(e,t){if(t.udid)return j(e,t.udid);if(t.serial)return M(e,t)}function j(t,n){let r=t.find(e=>e.id===n&&f(e.platform));if(!r)throw new e(`DEVICE_NOT_FOUND`,`No Apple device with UDID ${n}`);return r}function M(t,n){let r=t.find(e=>e.id===n.serial&&R(e.platform));if(!r)throw new e(`DEVICE_NOT_FOUND`,z(n));return r}function N(t,n){if(!n)return;let r=V(n),i=t.find(e=>V(e.name)===r);if(!i)throw new e(`DEVICE_NOT_FOUND`,`No device named ${n}`);return i}function P(e,t,n){let r=e[0];if(r!==void 0&&e.length===1)return r;e.length===0&&B(t,n);let i=F(e);return i||B(t,n),i}function F(e){let t=e.filter(e=>e.kind!==`device`),n=t.length>0?t:e;if(G(n))return n[0];let r=n.filter(e=>e.booted),i=r[0];return i&&r.length===1?i:r[0]??n[0]}function I(e,t,n={}){return C(e,t.platform)&&(!t.target||(e.target??`mobile`)===t.target)&&(!n.includeExplicitSelectors||L(e,t))}function L(e,t){return!(t.udid&&!(e.id===t.udid&&f(e.platform))||t.serial&&!(e.id===t.serial&&R(e.platform))||t.deviceName&&V(e.name)!==V(t.deviceName))}function R(e){return e===`android`||e===`harmonyos`||e===`vega`}function z(e){return e.platform===`android`?`No Android device with serial ${e.serial}`:e.platform===`vega`?`No Vega VVD with serial ${e.serial}`:e.platform===`harmonyos`?`No HarmonyOS device with serial ${e.serial}`:`No Android, HarmonyOS device, or Vega VVD with serial ${e.serial}`}function B(t,n){let r=n.simulatorSetPath;throw r&&O(t.platform)?new e(`DEVICE_NOT_FOUND`,`No devices found in the scoped simulator set`,{simulatorSetPath:r,hint:`The simulator set at "${r}" appears to be empty. Create a compatible simulator first with xcrun simctl --set "${r}" create, or remove the scoped simulator set.`,selector:t}):new e(`DEVICE_NOT_FOUND`,`No devices found`,{selector:t})}function V(e){return e.toLowerCase().replace(/_/g,` `).replace(/\s+/g,` `).trim()}function H(e,t){return U(e.device)-U(t.device)||Number(t.device.booted===!0)-Number(e.device.booted===!0)||e.device.name.localeCompare(t.device.name)||e.index-t.index}function U(e){return e.kind===`simulator`?W(e,0,1,2,3):e.kind===`device`&&f(e.platform)&&!p(e)?W(e,10,11,12,13):14}function W(e,t,n,r,i){return{mobile:K(e.name)?n:t,tv:r,desktop:i}[e.target??`mobile`]}function G(e){return e.length>0&&e.every(e=>f(e.platform))}function K(e){return/\bipad\b/i.test(e)}export{n as C,a as D,i as E,D as S,t as T,g as _,_ as a,k as b,m as c,b as d,x as f,C as g,I as h,l as i,p as l,v as m,c as n,S as o,R as p,u as r,f as s,d as t,h as u,w as v,r as w,y as x,E as y};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { C as SnapshotNode } from "./sdk-contracts.js";
|
|
2
2
|
//#region packages/selectors/src/internal/find.d.ts
|
|
3
3
|
declare const FIND_LOCATORS: readonly ['any', 'text', 'label', 'value', 'role', 'id'];
|
|
4
4
|
type FindLocator = (typeof FIND_LOCATORS)[number];
|
package/dist/src/sdk-finders.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{xn as e}from"./sdk-batch-runner.js";function t(t,n,r,i){return e(t,n,r,typeof i==`boolean`?{requireRect:i}:i)}export{t};
|
package/dist/src/sdk-io.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{n as e}from"./rolldown-runtime.js";import{_ as t}from"./sdk-contracts.js";import n from"node:path";import{promises as r}from"node:fs";import i from"node:os";var a=e({createLocalArtifactAdapter:()=>o});function o(e={}){let a=e.cwd??process.cwd(),o=e.tempDir??i.tmpdir(),c=e.rootDir?s(e.rootDir,a):void 0;return{resolveInput:async e=>{if(e.kind===`uploadedArtifact`)throw new t(`UNSUPPORTED_OPERATION`,`Uploaded artifact inputs require a custom artifact adapter`);return{path:s(e.path,a,c)}},reserveOutput:async(e,t)=>{let i,l=t.visibility??`client-visible`,u=e?.kind===`path`?s(e.path,a,c):n.join(i=await r.mkdtemp(n.join(o,`agent-device-${t.field}-`)),`${t.field}${t.ext}`);return await r.mkdir(n.dirname(u),{recursive:!0}),{path:u,visibility:l,...i?{cleanup:async()=>{await r.rm(i,{recursive:!0,force:!0})}}:{},publish:async()=>e?.kind===`downloadableArtifact`?{kind:`localPath`,field:t.field,artifactType:t.artifactType,path:u,fileName:e.fileName??n.basename(e.clientPath??u)}:void 0}},createTempFile:async e=>{let t=await r.mkdtemp(n.join(o,`${e.prefix}-`));return{path:n.join(t,`file${e.ext}`),visibility:`internal`,cleanup:async()=>{await r.rm(t,{recursive:!0,force:!0})}}}}}function s(e,r,i){let a=n.isAbsolute(e)?e:n.resolve(r,e);if(i&&!c(a,i))throw new t(`INVALID_ARGS`,`Local path is outside the artifact adapter root`,{path:a,rootDir:i});return a}function c(e,t){let r=n.relative(t,e);return r===``||!r.startsWith(`..`)&&!n.isAbsolute(r)}export{a as n,o as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as e}from"./sdk-device.js";import{
|
|
1
|
+
import{r as e}from"./sdk-device.js";import{T as t}from"./sdk-android-adb.js";const n=[`portrait`,`landscape`],r=[{key:`stateDir`,type:`string`,path:!0},{key:`daemonBaseUrl`,type:`string`},{key:`daemonAuthToken`,type:`string`},{key:`daemonTransport`,type:`enum`,enumValues:[`auto`,`socket`,`http`]},{key:`daemonServerMode`,type:`enum`,enumValues:[`socket`,`http`,`dual`]},{key:`tenant`,type:`string`},{key:`sessionIsolation`,type:`enum`,enumValues:[`none`,`tenant`]},{key:`runId`,type:`string`},{key:`leaseId`,type:`string`},{key:`leaseBackend`,type:`enum`,enumValues:[`ios-simulator`,`ios-instance`,`android-instance`]},{key:`platform`,type:`enum`,enumValues:e},{key:`target`,type:`enum`,enumValues:[`mobile`,`tv`,`desktop`]},{key:`device`,type:`string`},{key:`udid`,type:`string`},{key:`serial`,type:`string`},{key:`iosSimulatorDeviceSet`,type:`string`,path:!0,env:!1},{key:`androidDeviceAllowlist`,type:`string`},{key:`session`,type:`string`},{key:`providerApp`,type:`string`},{key:`providerOsVersion`,type:`string`},{key:`providerProject`,type:`string`},{key:`providerBuild`,type:`string`},{key:`providerSessionName`,type:`string`},{key:`providerDeviceOrientation`,type:`enum`,enumValues:n},{key:`providerGeoLocation`,type:`string`},{key:`providerTimezone`,type:`string`},{key:`providerLanguage`,type:`string`},{key:`providerLocale`,type:`string`},{key:`providerNetworkProfile`,type:`string`},{key:`providerCustomNetwork`,type:`string`},{key:`providerNoResignApp`,type:`boolean`},{key:`awsProjectArn`,type:`string`},{key:`awsDeviceArn`,type:`string`},{key:`awsAppArn`,type:`string`},{key:`awsRegion`,type:`string`},{key:`awsInteractionMode`,type:`enum`,enumValues:[`INTERACTIVE`,`NO_VIDEO`,`VIDEO_ONLY`]},{key:`metroProjectRoot`,type:`string`,path:!0},{key:`metroKind`,type:`enum`,enumValues:[`auto`,`react-native`,`expo`,`repack`]},{key:`metroPublicBaseUrl`,type:`string`},{key:`metroProxyBaseUrl`,type:`string`},{key:`metroBearerToken`,type:`string`},{key:`metroPreparePort`,type:`int`,min:1,max:65535},{key:`metroListenHost`,type:`string`},{key:`metroStatusHost`,type:`string`},{key:`metroStartupTimeoutMs`,type:`int`,min:1},{key:`metroProbeTimeoutMs`,type:`int`,min:1},{key:`metroRuntimeFile`,type:`string`,path:!0},{key:`metroNoReuseExisting`,type:`boolean`},{key:`metroNoInstallDeps`,type:`boolean`},{key:`launchUrl`,type:`string`}],i=[{key:`leaseProvider`,type:`string`,env:!1},{key:`deviceKey`,type:`string`,env:!1},{key:`clientId`,type:`string`,env:!1}],a=[...r,...i],o=new Map(a.map(e=>[e.key,e]));function s(e){return o.get(e)}function c(e){return s(e)?.env===!1?[]:[t(e)]}export{n as a,s as i,a as n,c as r,r as t};
|
|
@@ -1,79 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { C as SnapshotNode, E as SnapshotState, S as SnapshotBackend, T as SnapshotQualityVerdict, U as PublicPlatform, V as Platform, b as Rect, m as ResponseCost, v as Point, w as SnapshotOptions$1, x as ScreenshotOverlayRef, y as RawSnapshotNode } from "./sdk-contracts.js";
|
|
2
2
|
import { c as ScrollDirection, o as GesturePlan } from "./sdk-android-adb.js";
|
|
3
|
-
//#region packages/contracts/src/back-mode.d.ts
|
|
4
|
-
declare const BACK_MODES: readonly ['in-app', 'system'];
|
|
5
|
-
type BackMode = (typeof BACK_MODES)[number];
|
|
6
|
-
//#endregion
|
|
7
|
-
//#region packages/contracts/src/click-button.d.ts
|
|
8
|
-
declare const CLICK_BUTTONS: readonly ['primary', 'secondary', 'middle'];
|
|
9
|
-
type ClickButton = (typeof CLICK_BUTTONS)[number];
|
|
10
|
-
//#endregion
|
|
11
|
-
//#region packages/contracts/src/device-rotation.d.ts
|
|
12
|
-
declare const DEVICE_ROTATIONS: readonly ['portrait', 'portrait-upside-down', 'landscape-left', 'landscape-right'];
|
|
13
|
-
type DeviceRotation = (typeof DEVICE_ROTATIONS)[number];
|
|
14
|
-
//#endregion
|
|
15
|
-
//#region packages/contracts/src/tv-remote.d.ts
|
|
16
|
-
declare const TV_REMOTE_BUTTON_DEFINITIONS: {
|
|
17
|
-
readonly up: {
|
|
18
|
-
readonly aliases: readonly [];
|
|
19
|
-
readonly androidKeyevent: 'KEYCODE_DPAD_UP';
|
|
20
|
-
readonly appleRemoteButton: 'up';
|
|
21
|
-
readonly vegaKey: 'KEY_UP';
|
|
22
|
-
};
|
|
23
|
-
readonly down: {
|
|
24
|
-
readonly aliases: readonly [];
|
|
25
|
-
readonly androidKeyevent: 'KEYCODE_DPAD_DOWN';
|
|
26
|
-
readonly appleRemoteButton: 'down';
|
|
27
|
-
readonly vegaKey: 'KEY_DOWN';
|
|
28
|
-
};
|
|
29
|
-
readonly left: {
|
|
30
|
-
readonly aliases: readonly [];
|
|
31
|
-
readonly androidKeyevent: 'KEYCODE_DPAD_LEFT';
|
|
32
|
-
readonly appleRemoteButton: 'left';
|
|
33
|
-
readonly vegaKey: 'KEY_LEFT';
|
|
34
|
-
};
|
|
35
|
-
readonly right: {
|
|
36
|
-
readonly aliases: readonly [];
|
|
37
|
-
readonly androidKeyevent: 'KEYCODE_DPAD_RIGHT';
|
|
38
|
-
readonly appleRemoteButton: 'right';
|
|
39
|
-
readonly vegaKey: 'KEY_RIGHT';
|
|
40
|
-
};
|
|
41
|
-
readonly select: {
|
|
42
|
-
readonly aliases: readonly ["ok", "center", "enter"];
|
|
43
|
-
readonly androidKeyevent: 'KEYCODE_DPAD_CENTER';
|
|
44
|
-
readonly appleRemoteButton: 'select';
|
|
45
|
-
readonly vegaKey: 'KEY_ENTER';
|
|
46
|
-
};
|
|
47
|
-
readonly menu: {
|
|
48
|
-
readonly aliases: readonly [];
|
|
49
|
-
readonly androidKeyevent: 'KEYCODE_MENU';
|
|
50
|
-
readonly appleRemoteButton: 'menu';
|
|
51
|
-
readonly vegaKey: 'KEY_MENU';
|
|
52
|
-
};
|
|
53
|
-
readonly home: {
|
|
54
|
-
readonly aliases: readonly [];
|
|
55
|
-
readonly androidKeyevent: 'KEYCODE_HOME';
|
|
56
|
-
readonly appleRemoteButton: 'home';
|
|
57
|
-
readonly vegaKey: 'KEY_HOMEPAGE';
|
|
58
|
-
};
|
|
59
|
-
readonly back: {
|
|
60
|
-
readonly aliases: readonly [];
|
|
61
|
-
readonly androidKeyevent: 'KEYCODE_BACK';
|
|
62
|
-
readonly appleRemoteButton: 'menu';
|
|
63
|
-
readonly vegaKey: 'KEY_BACK';
|
|
64
|
-
};
|
|
65
|
-
};
|
|
66
|
-
declare const TV_REMOTE_BUTTONS: (keyof typeof TV_REMOTE_BUTTON_DEFINITIONS)[];
|
|
67
|
-
type TvRemoteButton = (typeof TV_REMOTE_BUTTONS)[number];
|
|
68
|
-
//#endregion
|
|
69
|
-
//#region packages/contracts/src/settings.d.ts
|
|
70
|
-
type SettingOptions = {
|
|
71
|
-
permissionTarget?: string;
|
|
72
|
-
permissionMode?: string;
|
|
73
|
-
latitude?: number;
|
|
74
|
-
longitude?: number;
|
|
75
|
-
};
|
|
76
|
-
//#endregion
|
|
77
3
|
//#region packages/contracts/src/session-surface.d.ts
|
|
78
4
|
declare const SESSION_SURFACES: readonly ['app', 'frontmost-app', 'desktop', 'menubar'];
|
|
79
5
|
type SessionSurface = (typeof SESSION_SURFACES)[number];
|
|
@@ -144,9 +70,85 @@ type AndroidSnapshotBackendMetadata = {
|
|
|
144
70
|
nodeCount?: number;
|
|
145
71
|
helperTruncated?: boolean;
|
|
146
72
|
elapsedMs?: number;
|
|
73
|
+
/** API 23 helper output carries no `drawing-order`; covered same-window surfaces are not pruned. */
|
|
74
|
+
occlusionScanUnavailable?: boolean;
|
|
147
75
|
};
|
|
148
76
|
type FindLocator = 'any' | 'text' | 'label' | 'value' | 'role' | 'id';
|
|
149
77
|
//#endregion
|
|
78
|
+
//#region packages/contracts/src/click-button.d.ts
|
|
79
|
+
declare const CLICK_BUTTONS: readonly ['primary', 'secondary', 'middle'];
|
|
80
|
+
type ClickButton = (typeof CLICK_BUTTONS)[number];
|
|
81
|
+
//#endregion
|
|
82
|
+
//#region packages/contracts/src/back-mode.d.ts
|
|
83
|
+
declare const BACK_MODES: readonly ['in-app', 'system'];
|
|
84
|
+
type BackMode = (typeof BACK_MODES)[number];
|
|
85
|
+
//#endregion
|
|
86
|
+
//#region packages/contracts/src/device-rotation.d.ts
|
|
87
|
+
declare const DEVICE_ROTATIONS: readonly ['portrait', 'portrait-upside-down', 'landscape-left', 'landscape-right'];
|
|
88
|
+
type DeviceRotation = (typeof DEVICE_ROTATIONS)[number];
|
|
89
|
+
//#endregion
|
|
90
|
+
//#region packages/contracts/src/tv-remote.d.ts
|
|
91
|
+
declare const TV_REMOTE_BUTTON_DEFINITIONS: {
|
|
92
|
+
readonly up: {
|
|
93
|
+
readonly aliases: readonly [];
|
|
94
|
+
readonly androidKeyevent: 'KEYCODE_DPAD_UP';
|
|
95
|
+
readonly appleRemoteButton: 'up';
|
|
96
|
+
readonly vegaKey: 'KEY_UP';
|
|
97
|
+
};
|
|
98
|
+
readonly down: {
|
|
99
|
+
readonly aliases: readonly [];
|
|
100
|
+
readonly androidKeyevent: 'KEYCODE_DPAD_DOWN';
|
|
101
|
+
readonly appleRemoteButton: 'down';
|
|
102
|
+
readonly vegaKey: 'KEY_DOWN';
|
|
103
|
+
};
|
|
104
|
+
readonly left: {
|
|
105
|
+
readonly aliases: readonly [];
|
|
106
|
+
readonly androidKeyevent: 'KEYCODE_DPAD_LEFT';
|
|
107
|
+
readonly appleRemoteButton: 'left';
|
|
108
|
+
readonly vegaKey: 'KEY_LEFT';
|
|
109
|
+
};
|
|
110
|
+
readonly right: {
|
|
111
|
+
readonly aliases: readonly [];
|
|
112
|
+
readonly androidKeyevent: 'KEYCODE_DPAD_RIGHT';
|
|
113
|
+
readonly appleRemoteButton: 'right';
|
|
114
|
+
readonly vegaKey: 'KEY_RIGHT';
|
|
115
|
+
};
|
|
116
|
+
readonly select: {
|
|
117
|
+
readonly aliases: readonly ["ok", "center", "enter"];
|
|
118
|
+
readonly androidKeyevent: 'KEYCODE_DPAD_CENTER';
|
|
119
|
+
readonly appleRemoteButton: 'select';
|
|
120
|
+
readonly vegaKey: 'KEY_ENTER';
|
|
121
|
+
};
|
|
122
|
+
readonly menu: {
|
|
123
|
+
readonly aliases: readonly [];
|
|
124
|
+
readonly androidKeyevent: 'KEYCODE_MENU';
|
|
125
|
+
readonly appleRemoteButton: 'menu';
|
|
126
|
+
readonly vegaKey: 'KEY_MENU';
|
|
127
|
+
};
|
|
128
|
+
readonly home: {
|
|
129
|
+
readonly aliases: readonly [];
|
|
130
|
+
readonly androidKeyevent: 'KEYCODE_HOME';
|
|
131
|
+
readonly appleRemoteButton: 'home';
|
|
132
|
+
readonly vegaKey: 'KEY_HOMEPAGE';
|
|
133
|
+
};
|
|
134
|
+
readonly back: {
|
|
135
|
+
readonly aliases: readonly [];
|
|
136
|
+
readonly androidKeyevent: 'KEYCODE_BACK';
|
|
137
|
+
readonly appleRemoteButton: 'menu';
|
|
138
|
+
readonly vegaKey: 'KEY_BACK';
|
|
139
|
+
};
|
|
140
|
+
};
|
|
141
|
+
declare const TV_REMOTE_BUTTONS: (keyof typeof TV_REMOTE_BUTTON_DEFINITIONS)[];
|
|
142
|
+
type TvRemoteButton = (typeof TV_REMOTE_BUTTONS)[number];
|
|
143
|
+
//#endregion
|
|
144
|
+
//#region packages/contracts/src/settings.d.ts
|
|
145
|
+
type SettingOptions = {
|
|
146
|
+
permissionTarget?: string;
|
|
147
|
+
permissionMode?: string;
|
|
148
|
+
latitude?: number;
|
|
149
|
+
longitude?: number;
|
|
150
|
+
};
|
|
151
|
+
//#endregion
|
|
150
152
|
//#region packages/contracts/src/runner-lease-context.d.ts
|
|
151
153
|
type RunnerLogicalLeaseContext = {
|
|
152
154
|
leaseId?: string;
|
|
@@ -228,7 +230,7 @@ type SnapshotOptions = SnapshotOptions$1 & {
|
|
|
228
230
|
};
|
|
229
231
|
type SnapshotResult = Omit<BackendSnapshotResult, 'backend' | 'nodes'> & {
|
|
230
232
|
nodes?: RawSnapshotNode[];
|
|
231
|
-
backend: Extract<SnapshotBackend, 'android' | 'harmonyos-arkui' | 'xctest' | 'linux-atspi' | 'web'>;
|
|
233
|
+
backend: Extract<SnapshotBackend, 'android' | 'harmonyos-arkui' | 'xctest' | 'linux-atspi' | 'macos-helper' | 'web'>;
|
|
232
234
|
};
|
|
233
235
|
type Interactor = {
|
|
234
236
|
open(app: string, options?: {
|
|
@@ -245,6 +247,12 @@ type Interactor = {
|
|
|
245
247
|
tapElementSelector?(selector: ElementSelectorTapOptions): Promise<Record<string, unknown> | void>;
|
|
246
248
|
doubleTap(x: number, y: number): Promise<Record<string, unknown> | void>;
|
|
247
249
|
longPress(x: number, y: number, durationMs?: number): Promise<Record<string, unknown> | void>;
|
|
250
|
+
/**
|
|
251
|
+
* Move the pointer to a point without pressing. Only pointer-driven
|
|
252
|
+
* platforms (web today) implement it; touch platforms have no hover state
|
|
253
|
+
* and leave it undefined, which the `hover` command reports as unsupported.
|
|
254
|
+
*/
|
|
255
|
+
hover?(x: number, y: number): Promise<Record<string, unknown> | void>;
|
|
248
256
|
focus(x: number, y: number): Promise<Record<string, unknown> | void>;
|
|
249
257
|
type(text: string, delayMs?: number): Promise<TypeTextBackendResult | void>;
|
|
250
258
|
fillElementSelector?(selector: ElementSelectorTapOptions, text: string, delayMs?: number): Promise<Record<string, unknown> | void>;
|
|
@@ -479,6 +487,10 @@ type TouchLongPressExtras = {
|
|
|
479
487
|
gesture: 'longpress';
|
|
480
488
|
};
|
|
481
489
|
type LongPressCommandResponseData = (TouchResponsePoint & TouchLongPressExtras) | (TouchResponseRef & TouchLongPressExtras) | (TouchResponseSelector & TouchLongPressExtras);
|
|
490
|
+
type TouchHoverExtras = {
|
|
491
|
+
gesture: 'hover';
|
|
492
|
+
};
|
|
493
|
+
type HoverCommandResponseData = (TouchResponsePoint & TouchHoverExtras) | (TouchResponseRef & TouchHoverExtras) | (TouchResponseSelector & TouchHoverExtras);
|
|
482
494
|
/**
|
|
483
495
|
* Daemon response data for the `find` command. Read-only actions (`exists`,
|
|
484
496
|
* `wait`, `get_text`, `get_attrs`) may issue a pinnable ref with
|
|
@@ -508,6 +520,24 @@ type FindCommandResponseData = {
|
|
|
508
520
|
cost?: ResponseCost;
|
|
509
521
|
};
|
|
510
522
|
//#endregion
|
|
523
|
+
//#region packages/selectors/src/internal/parse.d.ts
|
|
524
|
+
type SelectorKey = 'id' | 'role' | 'text' | 'label' | 'value' | 'appname' | 'windowtitle' | 'visible' | 'hidden' | 'editable' | 'selected' | 'focused' | 'enabled' | 'hittable';
|
|
525
|
+
type SelectorTerm = {
|
|
526
|
+
key: SelectorKey;
|
|
527
|
+
value: string | boolean;
|
|
528
|
+
};
|
|
529
|
+
type Selector = {
|
|
530
|
+
raw: string;
|
|
531
|
+
terms: SelectorTerm[];
|
|
532
|
+
};
|
|
533
|
+
type SelectorChain = {
|
|
534
|
+
raw: string;
|
|
535
|
+
selectors: Selector[];
|
|
536
|
+
};
|
|
537
|
+
declare function parseSelectorChain(expression: string): SelectorChain;
|
|
538
|
+
declare function tryParseSelectorChain(expression: string): SelectorChain | null;
|
|
539
|
+
declare function isSelectorToken(token: string): boolean;
|
|
540
|
+
//#endregion
|
|
511
541
|
//#region packages/selectors/src/internal/public-resolution-types.d.ts
|
|
512
542
|
/** One per-alternative diagnostic returned by selector resolution. */
|
|
513
543
|
type SelectorDiagnostics = {
|
|
@@ -539,24 +569,6 @@ type SelectorResolutionOptions = SelectorMatchOptions & {
|
|
|
539
569
|
disambiguateAmbiguous?: boolean;
|
|
540
570
|
};
|
|
541
571
|
//#endregion
|
|
542
|
-
//#region packages/selectors/src/internal/parse.d.ts
|
|
543
|
-
type SelectorKey = 'id' | 'role' | 'text' | 'label' | 'value' | 'appname' | 'windowtitle' | 'visible' | 'hidden' | 'editable' | 'selected' | 'focused' | 'enabled' | 'hittable';
|
|
544
|
-
type SelectorTerm = {
|
|
545
|
-
key: SelectorKey;
|
|
546
|
-
value: string | boolean;
|
|
547
|
-
};
|
|
548
|
-
type Selector = {
|
|
549
|
-
raw: string;
|
|
550
|
-
terms: SelectorTerm[];
|
|
551
|
-
};
|
|
552
|
-
type SelectorChain = {
|
|
553
|
-
raw: string;
|
|
554
|
-
selectors: Selector[];
|
|
555
|
-
};
|
|
556
|
-
declare function parseSelectorChain(expression: string): SelectorChain;
|
|
557
|
-
declare function tryParseSelectorChain(expression: string): SelectorChain | null;
|
|
558
|
-
declare function isSelectorToken(token: string): boolean;
|
|
559
|
-
//#endregion
|
|
560
572
|
//#region packages/selectors/src/internal/resolve.d.ts
|
|
561
573
|
/**
|
|
562
574
|
* The parser-side twin of the façade's `SelectorResolution`: identical except
|
|
@@ -602,4 +614,4 @@ declare function formatSelectorFailure(chain: SelectorChain | string, diagnostic
|
|
|
602
614
|
unique?: boolean;
|
|
603
615
|
}): string;
|
|
604
616
|
//#endregion
|
|
605
|
-
export {
|
|
617
|
+
export { ClickButton as C, SnapshotDiagnosticsSummary as D, ScreenshotResultData as E, SessionSurface as O, BackMode as S, FindLocator as T, SettleObservation as _, resolveSelectorChain as a, TvRemoteButton as b, isSelectorToken as c, ClickCommandResponseData as d, FillCommandResponseData as f, PressCommandResponseData as g, LongPressCommandResponseData as h, findSelectorChainMatch as i, parseSelectorChain as l, HoverCommandResponseData as m, isNodeEditable as n, SelectorDiagnostics as o, FindCommandResponseData as p, isNodeVisible as r, SelectorChain as s, formatSelectorFailure as t, tryParseSelectorChain as u, Interactor as v, AndroidSnapshotBackendMetadata as w, DeviceRotation as x, RunnerContext as y };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{pn as e}from"./sdk-batch-runner.js";function t(t,n,r){return e(typeof t==`string`?t:t.raw,n,r)}export{t};
|
package/dist/src/sdk.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{n as e}from"./rolldown-runtime.js";import t from"node:path";import{promises as n}from"node:fs";import r from"node:os";var i=e({ensureAndroidSdkPathConfigured:()=>l,resolveAndroidSdkRoots:()=>s});const a=[`emulator`,`platform-tools`,t.join(`cmdline-tools`,`latest`,`bin`),t.join(`cmdline-tools`,`tools`,`bin`)];function o(e){let t=new Set,n=[];for(let r of e){let e=r.trim();!e||t.has(e)||(t.add(e),n.push(e))}return n}function s(e=process.env){let n=e.ANDROID_SDK_ROOT?.trim(),i=e.ANDROID_HOME?.trim(),a=e.HOME?.trim()||r.homedir(),s=a?t.join(a,`Android`,`Sdk`):``;return o([n??``,i??``,s])}async function c(e){try{return await n.access(e,n.constants.X_OK),!0}catch{return!1}}async function l(e=process.env){let n=[],r;for(let i of s(e)){let e=[];for(let n of a){let r=t.join(i,n);await c(r)&&e.push(r)}e.length!==0&&(r||=i,n.push(...e))}if(r&&(e.ANDROID_SDK_ROOT=e.ANDROID_SDK_ROOT?.trim()||r,e.ANDROID_HOME=e.ANDROID_HOME?.trim()||r),n.length===0)return;let i=(e.PATH??``).split(t.delimiter).map(e=>e.trim()).filter(e=>e.length>0);e.PATH=o([...n,...i]).join(t.delimiter)}export{i as n,s as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{S as e,_ as t,h as n,l as r,m as i,s as a,v as o}from"./sdk-contracts.js";import{x as s}from"./version.js";import{Jt as c,Kt as l,Mn as u,Yt as d,Zt as f,cn as p,ct as m,et as h,mt as ee,qt as te,un as ne}from"./sdk-batch-runner.js";import{_ as re,c as g,l as ie,s as ae}from"./sdk-device.js";import{J as oe,X as se,c as ce,it as le,z as ue}from"./prepare-kind.js";import{X as _,j as de}from"./screenshot-result.js";import{i as fe}from"./session-target-evidence.js";import{i as pe}from"./text-surface.js";import{a as me,t as he}from"./runtime.js";import{j as ge}from"./sdk-android-adb.js";import{r as _e}from"./app-lifecycle.js";import{h as v}from"./ime-lifecycle.js";import{N as ve}from"./runner-disposal.js";import{E as y,c as b,g as ye,o as x,s as be,t as xe}from"./dispatch.js";import{Xt as S,Yt as Se,Zt as C,an as w,ct as T,fn as Ce,ln as E,pn as D,qt as we}from"./internal/daemon.js";import{a as O,i as Te,l as Ee,r as De}from"./snapshot-session.js";import{t as Oe}from"./device-ready.js";const ke=[[`snapshotDepth`,`--depth`],[`snapshotScope`,`--scope`],[`snapshotRaw`,`--raw`]];function k(e,t){let n=Ae(t);return n.length===0?null:x(`INVALID_ARGS`,`${e} @ref does not support ${n.join(`, `)}.`)}function Ae(e){if(!e)return[];let t=[];for(let[n,r]of ke)e[n]!==void 0&&t.push(r);return t}function je(e,t){if(!t||t.settle===!0)return null;let n=[];return t.settleQuietMs!==void 0&&n.push(`--settle-quiet`),n.length===0?null:x(`INVALID_ARGS`,`${e}: ${n.join(`, `)} require${n.length===1?`s`:``} --settle.`)}function Me(e){if(e?.settle===!0)return{...e.settleQuietMs===void 0?{}:{quietMs:e.settleQuietMs},...e.timeoutMs===void 0?{}:{timeoutMs:e.timeoutMs}}}function A(e){if(e.length<2)return null;let t=Number(e[0]),n=Number(e[1]);return!Number.isFinite(t)||!Number.isFinite(n)?null:{x:t,y:n}}function j(e){let t=n(e);return t?{ok:!0,ref:t.base,generation:t.generation}:{ok:!1,response:x(`INVALID_ARGS`,`Invalid ref "${e}" — malformed generation suffix.`,{hint:a})}}function M(e,t){let n=A(e);if(n)return{ok:!0,target:{kind:`point`,x:n.x,y:n.y}};let r=e[0]??``;if(r.startsWith(`@`)){let t=j(r);return t.ok?{ok:!0,target:{kind:`ref`,ref:t.ref,fallbackLabel:e.slice(1).join(` `).trim()},refGeneration:t.generation}:{ok:!1,response:t.response}}let i=e.join(` `).trim();return i?{ok:!0,target:{kind:`selector`,selector:i}}:{ok:!1,response:x(`INVALID_ARGS`,`${t} requires @ref, selector expression, or x y coordinates`)}}function Ne(e){let t=A(e);if(t)return{ok:!0,target:{kind:`point`,x:t.x,y:t.y},...Be(e[2])};let n=ze(e),r=M(n.targetPositionals,`longpress`);return r.ok?{ok:!0,target:r.target,refGeneration:r.refGeneration,...n.duration}:r}function Pe(e){let t=e[0]??``;if(t.startsWith(`@`)){let n=j(t);if(!n.ok)return{ok:!1,response:n.response};let r=ce(e).text;return r?{ok:!0,target:{kind:`ref`,ref:n.ref,fallbackLabel:Re(e)},refGeneration:n.generation,text:r}:{ok:!1,response:x(`INVALID_ARGS`,`fill requires text after ref`)}}let n=A(e);if(n){let t=e.slice(2).join(` `);return t?{ok:!0,target:{kind:`point`,x:n.x,y:n.y},text:t}:{ok:!1,response:x(`INVALID_ARGS`,`fill requires text after coordinates`)}}let r=Fe(e);return!r||r.kind!==`selector`?{ok:!1,response:x(`INVALID_ARGS`,`fill requires x y text, @ref text, or selector text`)}:r.text.trim()?{ok:!0,target:{kind:`selector`,selector:r.target.selector},text:r.text}:{ok:!1,response:x(`INVALID_ARGS`,`fill requires text after selector`)}}function Fe(e){try{return ce(e)}catch{return null}}function Ie(e){let t=`evidence`in e?e.evidence:void 0,n=e.settle;return e.kind===`ref`?{ref:N(e.target?.kind===`ref`?e.target.ref:void 0),refLabel:e.refLabel,selectorChain:e.selectorChain,targetHittable:e.targetHittable,hint:e.hint,evidence:t,settle:n,resolution:e.resolution}:e.kind===`selector`?{selector:e.target?.kind===`selector`?e.target.selector:void 0,selectorChain:e.selectorChain,refLabel:e.refLabel,targetHittable:e.targetHittable,hint:e.hint,evidence:t,settle:n,resolution:e.resolution}:{evidence:t,settle:n}}function Le(e,t){return e.kind===`point`?`coordinate tap`:t.kind===`ref`&&t.target?.kind===`ref`?t.target.ref:t.kind===`selector`&&t.target?.kind===`selector`?t.target.selector:`target`}function N(e){return e?.startsWith(`@`)?e.slice(1):e}function Re(e){return e.length>=3&&e[1]?.trim()||``}function ze(e){let t=e.at(-1);return e.length>1&&Ve(t)?{targetPositionals:e.slice(0,-1),duration:{durationMs:Number(t)}}:{targetPositionals:e,duration:{}}}function Be(e){return e===void 0?{}:{durationMs:Number(e)}}function Ve(e){return e===void 0||e.trim()===``?!1:Number.isFinite(Number(e))}function P(e,t){return!(!e||!g(e.device)||y(e.device)||t.skipPendingPostGestureStabilization&&E(e))}function F(e){let{session:t,selectorExpression:n}=e;return P(t,{skipPendingPostGestureStabilization:!0})?ee(n):null}function He(e){let t=e.identifier?.trim();if(t)return{key:`id`,value:t};let n=e.label?.trim();return n?{key:`label`,value:n}:null}function I(e,t={}){let n=o(e);if(n.code===`ELEMENT_NOT_FOUND`)return t.delegateSemanticFailures===!0||t.allowElementNotFound===!0;if(n.code===`AMBIGUOUS_MATCH`)return t.delegateSemanticFailures===!0;if(n.code===`ELEMENT_OFFSCREEN`)return t.delegateSemanticFailures!==!1;if(n.code!==`COMMAND_FAILED`)return!1;let r=n.message.toLowerCase();return r.includes(`fetch failed`)||r.includes(`timed out`)||r.includes(`timeout`)||r.includes(`runner did not accept connection`)||r.includes(`invalid runner response`)}async function Ue(e,n){let r=await L(e);if(r){if(v(r.foregroundPackage))return`press ${n} opened an Android permission dialog (${r.foregroundPackage}) over ${r.expectedPackage}. ${r.hint}`;throw new t(`COMMAND_FAILED`,`press ${n} left ${e.appBundleId} and foregrounded ${r.foregroundPackage}. The tap likely escaped the app.`,r)}}async function L(e){if(e.device.platform!==`android`||!e.appBundleId)return null;let t=await _e(e.device),n=t.package?.trim();return!n||n===e.appBundleId||!qe(n)?null:{expectedPackage:e.appBundleId,foregroundPackage:n,activity:t.activity,hint:Ke(n)}}function We(e){return v(e.foregroundPackage)?`Android permission dialog is blocking ${e.expectedPackage}`:`${e.foregroundPackage} is foreground instead of ${e.expectedPackage}`}function Ge(e){return e.code===`COMMAND_FAILED`&&typeof e.details?.expectedPackage==`string`&&typeof e.details?.foregroundPackage==`string`}function Ke(e){return v(e)?`Use "alert get" to inspect it, then "alert accept" or "alert dismiss" to respond.`:`Use screenshot as visual truth, then take a fresh snapshot -i before retrying.`}function qe(e){return e===`com.android.settings`||e===`com.android.systemui`||v(e)||e.includes(`launcher`)}function Je(e,t){if(t===`exists`)return{found:!0};if(t===`wait`)return{found:!0,waitedMs:e.waitedMs};if(t===`list`)return{action:`list`,matches:Array.isArray(e.matches)?e.matches.length:0};let n=typeof e.ref==`string`?e.ref:void 0;return t===`get_attrs`?{ref:n,action:`get attrs`}:{ref:n,action:`get text`,text:typeof e.text==`string`?e.text:``}}function Ye(e){return e.kind===`found`?{found:!0,...typeof e.waitedMs==`number`?{waitedMs:e.waitedMs}:{}}:e.kind===`list`?{matches:e.matches.map(e=>({ref:e.ref,node:h(e.node)}))}:{ref:e.ref,...e.kind===`text`?{text:e.text}:{},node:h(e.node)}}function Xe(e,t){let n=Array.isArray(e.selectorChain)?e.selectorChain:void 0,r=$e(e),i=r?.kind===`ref`?H(r.ref):void 0,a=r?.kind===`selector`?r.selector:void 0,o={...i?{ref:i}:{},...a?{selector:a}:{},...n?{selectorChain:n}:{}};if(t===`attrs`)return o;let s=typeof e.text==`string`?e.text:``;return{...o,text:s,refLabel:Qe(s)}}function R(e){let{target:t}=e;return{...t.kind===`ref`?{ref:H(t.ref)}:{},...t.kind===`selector`?{selector:t.selector}:{},...typeof e.text==`string`?{text:e.text}:{},node:h(e.node)}}function z(e){let{node:t,preActionNodes:n,...r}=e;return r}function Ze(e){return{waitedMs:e.waitedMs,...typeof e.text==`string`?{text:e.text}:{},...typeof e.selector==`string`?{selector:e.selector}:{},...typeof e.captures==`number`?{captures:e.captures}:{},...typeof e.nodeCount==`number`?{nodeCount:e.nodeCount}:{},...typeof e.hint==`string`?{hint:e.hint}:{}}}function B(e){let{selectorChain:t,...n}=e;return n}function V(e,t,n,r,i,a){let o=e.get(t);if(!o)return;let s=_(o)&&i?fe(i,{mode:a}):void 0;e.recordAction(o,{command:n.command,positionals:n.positionals??[],flags:n.flags??{},result:r,interactiveObservation:de(n),...s?{targetEvidence:s}:{}})}function Qe(e){let t=e.trim();if(!(!t||t.length>80||/[\r\n]/.test(t)))return t}function $e(e){let t=e.target;if(!t||typeof t!=`object`)return;let n=t;if(n.kind===`ref`&&typeof n.ref==`string`)return{kind:`ref`,ref:n.ref};if(n.kind===`selector`&&typeof n.selector==`string`)return{kind:`selector`,selector:n.selector}}function H(e){return e.startsWith(`@`)?e.slice(1):e}const et=[`application`,`window`,`tabbar`,`scrollbar`,`image`],tt=new Set([`tab bar`]);async function U(e,t){if(t.ok||!nt(t.error.details?.reason)||t.error.details?.captureStalled===!0||t.error.details?.captureTruncated===!0)return t;let n=await rt(e).catch(()=>null);return n?x(t.error.code,`${t.error.message}. Current surface: ${n.summary}.`,{...t.error.details??{},currentSurface:n.details}):t}function nt(e){return e===s.targetAbsent||e===s.stableTimeout}async function rt(e){let t=[...(await w({device:e.device,session:e.session,flags:{...e.req.flags,snapshotInteractiveOnly:!0},logPath:e.logPath??``})).snapshot.nodes].sort(it),n=W(t,6,{includeIdentifiers:!0});if(n.length===0)return null;let r=W(t.filter(e=>!ct(e)),4,{includeIdentifiers:!1}),i=W(t.filter(lt),4,{includeIdentifiers:!0});return{summary:(r.length>0?r:n.slice(0,4)).join(`, `),details:{labels:n,...i.length>0?{buttons:i}:{}}}}function W(e,t,n){let r=new Set,i=[];for(let a of e){let e=st(a,n);if(!(!e||r.has(e))&&(r.add(e),i.push(e),i.length>=t))break}return i}function it(e,t){return at(e)-at(t)||ot(e,t)}function at(e){let t=!!st(e,{includeIdentifiers:!1});return(ct(e)?2:0)+ +!t}function ot(e,t){return e.rect&&t.rect?e.rect.y-t.rect.y||e.rect.x-t.rect.x:e.rect?-1:t.rect?1:(e.depth??0)-(t.depth??0)||e.index-t.index}function st(e,t){let n=(t.includeIdentifiers?[e.label,e.value,e.identifier]:[e.label,e.value]).map(e=>typeof e==`string`?e.trim():``).find(e=>e.length>0);return n?n.replace(/\s+/g,` `).slice(0,80):``}function ct(e){let t=u(`${e.type??``} ${e.role??``} ${e.subrole??``}`),n=`${e.label??``} ${e.value??``}`.trim().toLowerCase();return et.some(e=>t.includes(e))||tt.has(n)||n.endsWith(`.fill`)}function lt(e){return u(`${e.type??``} ${e.role??``} ${e.subrole??``}`).includes(`button`)}function G(e,t){let n=me(t);if(!n)return e;if(e.ok){let t=ut(e.data?.warning,n);return{...e,data:{...e.data,warning:t}}}let r=e.error.details??{};return{...e,error:{...e.error,details:{...r,hint:ut(r.hint,n)}}}}function ut(e,t){return typeof e==`string`&&e.trim()!==``?`${e}\n${t}`:t}async function dt(e){let{device:t,node:n,flags:r,appBundleId:i,traceOutPath:a,surface:o,contextFromFlags:s}=e,c=oe(n),l=le(n.rect);if(!l||g(t)&&c&&!pe(n.type??``))return c;try{let e=await xe(t,`read`,[String(l.x),String(l.y)],void 0,{...s(r,i,a),surface:o}),u=e&&typeof e==`object`?e:void 0,d=typeof u?.text==`string`?u.text:``;return d.trim()?d:(ge({level:`warn`,phase:`interaction_read_fallback`,data:{reason:`empty_backend_text`,nodeRef:n.ref,surface:o,platform:t.platform}}),c)}catch(e){return ge({level:`warn`,phase:`interaction_read_fallback`,data:{reason:`backend_read_failed`,nodeRef:n.ref,surface:o,platform:t.platform,error:e instanceof Error?e.message:String(e)}}),c}}function K(e){let{session:t,sessionStore:n,sessionName:r}=e,i=0,a,o,s=t=>(e.consumedSnapshot&&(e.consumedSnapshot.state=t.snapshot),t);return{capture:async c=>{let l=Date.now(),u=xt(c,e.req.flags?.out),d=ht({timestamp:l,lastSnapshotAt:i,lastSnapshotResult:a,lastSnapshotCacheKey:o,session:t,request:c,cacheKey:u});if(d)return s(d);let f=gt({session:t,timestamp:l,request:c});if(f)return i=f.createdAt,a={snapshot:f},o=u,s(a);let p=await ft({params:e,request:c});c.signal?.throwIfAborted();let m={snapshot:p};return Ct({session:t,sessionStore:n,sessionName:r,snapshot:p}),i=l,a=m,o=u,s(m)}}}async function ft(e){let{params:t,request:n}=e,r=await q(t,n,n.snapshotScope);return n.recovery?.legacyIosSparse&&wt(r)?await pt({runtimeParams:t,request:n,policy:n.recovery.legacyIosSparse}):n.recovery?.sparseVerdictQueryScope?.shouldScope&&ue(r.snapshotQuality)?await mt({runtimeParams:t,request:n,policy:n.recovery.sparseVerdictQueryScope,snapshot:r}):r}async function pt(e){let{runtimeParams:t,request:n,policy:r}=e;try{return await q(t,n,void 0,!1)}catch(e){if(!r.shouldScope)throw e;return await q(t,n,r.query,!1)}}async function mt(e){let{runtimeParams:t,request:n,policy:r,snapshot:i}=e;try{return await q(t,n,r.query,!1)}catch{return i}}async function q(e,t,n,r=t.flags?.snapshotInteractiveOnly){return(await w({device:e.device,session:e.session,flags:{...t.flags,snapshotInteractiveOnly:r},outPath:t.outPath??e.req.flags?.out,logPath:e.logPath??``,snapshotScope:n,includeRects:t.includeRects,signal:t.signal})).snapshot}function ht(e){let{timestamp:t,lastSnapshotAt:n,lastSnapshotResult:r,lastSnapshotCacheKey:i,session:a,request:o,cacheKey:s}=e;if(o.cache?.forceFresh!==!0&&r&&i===s&&!(t-n>=750)&&!D(a)&&!yt(a,o))return r}function gt(e){let{session:t,timestamp:n,request:r}=e,i=t?.snapshot;if(i&&_t(t,r)&&vt(i,n)&&i.presentationKey===bt(r))return i}function _t(e,t){return!(t.cache?.forceFresh===!0||t.cache?.useSessionSnapshot!==!0||D(e)||yt(e,t))}function vt(e,t){return t-e.createdAt<750}function yt(e,t){return t.cache?.bypassForPostGestureStabilization===!0&&E(e)}function bt(e){return r(i(St(e)))}function xt(e,t){return JSON.stringify({presentationKey:bt(e),includeRects:e.includeRects===!0,outPath:e.outPath??t??null})}function St(e){return e.snapshotScope===void 0?e.flags:{...e.flags,snapshotScope:e.snapshotScope}}function Ct(e){let{session:t,sessionStore:n,sessionName:r,snapshot:i}=e;!t||ue(i.snapshotQuality)||(C(t,i),n.set(r,t))}function wt(e){return e.snapshotQuality||e.backend!==`xctest`||e.nodes.length!==1?!1:e.nodes[0]?.type===`Application`}function Tt(e){return he({backend:Et(e),...Ee(`selector commands`,{plural:!0}),sessions:we({sessionName:e.sessionName,getSession:()=>e.session,recordOptions:{includeSnapshot:!0},setRecord:t=>{!e.session||!t.snapshot||(C(e.session,t.snapshot),e.sessionStore.set(e.sessionName,e.session))}}),signal:e.signal??ve(e.req.meta?.requestId)})}async function J(e,t){e.consumedSnapshot??={};let n=e.sessionStore.get(e.sessionName);if(!n&&t.requireSession)return{ok:!1,response:be()};let r=n?.device??await ye(e.req.flags??{});n||await Oe(r);let i=b(t.capability,r);return i?{ok:!1,response:i}:{ok:!0,runtime:Tt({...e,session:n,device:r})}}function Et(e){let{req:t,session:n,device:r,logPath:i,sessionName:a,sessionStore:o}=e,s=K({device:r,session:n,sessionStore:o,sessionName:a,req:t,consumedSnapshot:e.consumedSnapshot,logPath:i});return{platform:re(r),captureSnapshot:async(e,n)=>{let i={...t.flags,...Dt(n)},a=n?.includeRects===!0,o=n?.scope??t.flags?.snapshotScope,c=t.command===`wait`||t.command===`find`||a&&r.platform===`web`;return await s.capture({flags:i,signal:e.signal,snapshotScope:o,includeRects:a,cache:{forceFresh:c,useSessionSnapshot:!0,bypassForPostGestureStabilization:!0}})},readText:async(a,o)=>({text:await dt({device:r,node:o,flags:t.flags,appBundleId:n?.appBundleId,traceOutPath:n?.trace?.outPath,surface:n?.surface,contextFromFlags:e.contextFromFlags??((e,t,n)=>Ce(i??``,e,t,n))})}),findText:async(t,n)=>({found:await Ot(e,n,t.signal)})}}function Dt(e){let{interactiveOnly:t,scope:n,depth:r,raw:i,includeHiddenContentHints:a}=e??{},o={};return t!==void 0&&(o.snapshotInteractiveOnly=t),n!==void 0&&(o.snapshotScope=n),r!==void 0&&(o.snapshotDepth=r),i!==void 0&&(o.snapshotRaw=i),a!==void 0&&(o.snapshotIncludeHiddenContentHints=a),o}async function Ot(e,t,n){let r=await kt(e,t,n);return r===null?await At(e,t,n)===!0?!0:await Nt(e,t,n):r}async function kt(e,t,n){return!ie(e.device)||!e.session?.surface||e.session.surface===`app`?null:await Nt(e,t,n)}async function At(e,t,n){let r=jt(e);return r?(await T(r.device,{command:`findText`,text:t,appBundleId:r.appBundleId},{...Mt(e,r),signal:n}))?.found===!0:null}function jt(e){return!ae(e.device.platform)||y(e.device)||!e.session?.appBundleId?null:{device:e.device,appBundleId:e.session.appBundleId,traceLogPath:e.session.trace?.outPath}}function Mt(e,t){return O({req:e.req,logPath:e.logPath,traceLogPath:t.traceLogPath})}async function Nt(e,t,n){return!!se((await Pt(e,n)).nodes,t)}async function Pt(e,t){let{snapshot:n}=await K({device:e.device,session:e.session,sessionStore:e.sessionStore,sessionName:e.sessionName,req:e.req,logPath:e.logPath,consumedSnapshot:e.consumedSnapshot}).capture({flags:{...e.req.flags,snapshotInteractiveOnly:!1,snapshotIncludeHiddenContentHints:!1},signal:t,cache:{forceFresh:!0,bypassForPostGestureStabilization:!0}});return n}async function Ft(e){let{req:t}=e;if(t.command!==`find`)return null;let n=p(t.positionals??[],t.flags);if(!n.ok)return x(n.code,n.message);let r=n.parsed,i=r.action;if(!ne(i))return null;let a=await J(e,{requireSession:!1,capability:`find`});return a.ok?G(await Q(async()=>{let n=await a.runtime.selectors.find({session:e.sessionName,requestId:t.meta?.requestId,locator:r.locator,query:r.query,action:i,timeoutMs:r.timeoutMs});V(e.sessionStore,e.sessionName,t,Je(n,i));let o=Ye(n),s=typeof o.ref==`string`?[o.ref]:Array.isArray(o.matches)?o.matches.map(e=>e.ref).filter(e=>typeof e==`string`):[];if(s.length>0){let t=e.sessionStore.get(e.sessionName);if(t&&(Se(t,s),e.sessionStore.set(e.sessionName,t),t.snapshotGeneration!==void 0))return{...o,refsGeneration:t.snapshotGeneration}}return o}),Y(e)):a.response}function Y(e){return e.consumedSnapshot?.state??e.sessionStore.get(e.sessionName)?.snapshot}async function It(e){let{req:t}=e;if(t.command!==`get`)return null;let n=te(t.positionals?.[0]);if(!n.ok)return x(n.code,n.message);let r=n.format,i=Yt(t);if(!i.ok)return i.response;if(i.target.kind===`ref`){let e=k(`get`,t.flags);if(e)return e}let a=t.internal?.replayTargetGuard;if(i.target.kind===`selector`&&!a){let t=await Vt(e,r,i.target.selector);if(t)return t}let o=await J(e,{requireSession:!0,capability:`get`});if(!o.ok)return o.response;let s=i.target.kind===`ref`?S({session:e.sessionStore.get(e.sessionName),ref:i.target.ref,mintedGeneration:i.refGeneration}):void 0;return G(await Q(async()=>{let n=await o.runtime.selectors.get({session:e.sessionName,requestId:t.meta?.requestId,property:r,target:i.target,expectedResolvedTarget:a});V(e.sessionStore,e.sessionName,t,Xe(n,r),{node:n.node,preActionNodes:n.preActionNodes});let c=R(n);return s?{...c,warning:s}:c}),Y(e))}async function Lt(e){let{req:t}=e;if(t.command!==`is`)return null;let n=c(t.positionals??[]);if(!n.ok)return x(n.code,n.message,n.hint?{hint:n.hint}:void 0);let{predicate:r,expectedText:i}=n,a={selectorExpression:n.selectorExpression},o=t.internal?.replayTargetGuard,s=_(e.sessionStore.get(e.sessionName));if(!o&&!s){let t=await Ht(e,r,a.selectorExpression,i);if(t)return t}let l=await J(e,{requireSession:!0,capability:`is`});return l.ok?G(await $(e,await Q(async()=>{let n=await l.runtime.selectors.is({session:e.sessionName,requestId:t.meta?.requestId,predicate:r,selector:a.selectorExpression,expectedText:i,expectedResolvedTarget:o}),s=zt(n),c=z(n);return V(e.sessionStore,e.sessionName,t,c,s),B(c)}),`is ${r}`),Y(e)):l.response}async function Rt(e){let{req:t,sessionName:n,sessionStore:r}=e,i=m(t.positionals??[]);if(!i)return x(`INVALID_ARGS`,`wait requires a duration or text`);let{session:a,device:o}=await De(r,n,t.flags);if(i.kind!==`sleep`){let e=b(`wait`,o);if(e)return e}let s=t.internal?.replayLandmarkGuard;if(i.kind===`selector`&&!s&&!_(a)){let t=await Ut({...e,session:a,device:o,selectorExpression:i.selectorExpression,timeoutMs:i.timeoutMs});if(t)return t}let c=i,l;if(i.kind===`ref`){let e=j(i.rawRef);if(!e.ok)return e.response;c={...i,rawRef:e.ref},l=S({session:a,ref:e.ref,mintedGeneration:e.generation})}e.consumedSnapshot??={};let u=async()=>{let i=Tt({...e,session:a,device:o}),u=await Q(async()=>{let e=await i.selectors.wait({session:n,requestId:t.meta?.requestId,target:Xt(c,a,s)}),o=zt(e);V(r,n,t,z(e),o,`landmark`);let u=Ze(e);return l?{...u,warning:l}:u});return await $(e,await U({req:t,logPath:e.logPath,session:a,device:o},u),`wait`)};return i.kind===`sleep`?await u():G(await Te(a,o,u),Y(e))}function zt(e){let t=e.node,n=e.preActionNodes;if(!(!t||typeof t!=`object`||!Array.isArray(n)))return{node:t,preActionNodes:n}}function Bt(e,t,n){if(!e||_(e))return null;let r=F({session:e,selectorExpression:n});return t===`text`&&r?.key!==`id`?null:r}async function Vt(e,t,n){let r=e.sessionStore.get(e.sessionName),i=Bt(r,t,n);if(!r||!i)return null;let a=await X(e,r,i);if(Z(a))return a.response;if(!a)return null;let o=Kt(t,i.raw,a);return o?(V(e.sessionStore,e.sessionName,e.req,Xe(o,t)),{ok:!0,data:R(o)}):null}async function Ht(e,t,n,r){if(t===`hidden`)return null;let i=await Wt(e,n);if(Z(i))return i.response;if(!i?.result.found||!i.result.node)return null;let a=t===`exists`?{predicate:t,pass:!0,selector:i.selector.raw,matches:1,selectorChain:[i.selector.raw]}:qt(t,r,i.selector.raw,i.session,i.result.node);return a?(V(e.sessionStore,e.sessionName,e.req,a),{ok:!0,data:B(a)}):null}async function Ut(e){let t=F({session:e.session,selectorExpression:e.selectorExpression});if(!e.session||!t)return null;let n=Date.now(),r=await X(e,e.session,t);if(Z(r))return r.response;if(!r?.found)return null;let i={kind:`selector`,selector:t.raw,waitedMs:Date.now()-n,selectorChain:[t.raw]};V(e.sessionStore,e.sessionName,e.req,i);let a={ok:!0,data:B(i)};return await U({req:e.req,logPath:e.logPath,session:e.session,device:e.device},a)}async function Wt(e,t){let n=e.sessionStore.get(e.sessionName),r=F({session:n,selectorExpression:t});if(!n||!r)return null;let i=await X(e,n,r);return Z(i)?i:i?{session:n,selector:r,result:i}:null}async function Gt(e,t,n){let r=await T(e.device,{command:`querySelector`,selectorKey:t.key,selectorValue:t.value,appBundleId:e.appBundleId},n),i=r.found===!0,a=Jt(r);return{found:i,...typeof r.text==`string`?{text:r.text}:{},...a?{node:a}:{}}}async function X(t,n,r){try{return await Gt(n,r,O({req:t.req,logPath:t.logPath,traceLogPath:n.trace?.outPath}))}catch(t){return I(t,{allowElementNotFound:!0})?null:{kind:`error`,response:{ok:!1,error:e(t)}}}}function Z(e){return e!==null&&`kind`in e&&e.kind===`error`}function Kt(e,t,n){if(!n.found||!n.node)return null;let r={target:{kind:`selector`,selector:t},node:n.node,selectorChain:[t]};return e===`attrs`?{kind:`attrs`,...r}:typeof n.text==`string`?{kind:`text`,...r,text:n.text}:null}function qt(e,t,n,r,i){let a=f({predicate:e,node:i,nodes:[i],expectedText:t,platform:r.device.platform});return{predicate:e,pass:a.pass,selector:n,...e===`text`?{text:a.actualText}:{},selectorChain:[n]}}function Jt(e){let t=e.nodes;if(!Array.isArray(t))return;let n=t[0];if(!(!n||typeof n!=`object`))return n}function Yt(e){let t=e.positionals?.[1]??``;if(t.startsWith(`@`)){let n=j(t);return n.ok?{ok:!0,target:{kind:`ref`,ref:n.ref,fallbackLabel:e.positionals.length>2?e.positionals.slice(2).join(` `).trim():``},refGeneration:n.generation}:{ok:!1,response:n.response}}let n=l(e.positionals?.slice(1)??[]);return n.ok?{ok:!0,target:{kind:`selector`,selector:`selector`in n?n.selector:``}}:{ok:!1,response:x(n.code,n.message)}}function Xt(e,n,r){if(e.kind===`sleep`)return{kind:`sleep`,durationMs:e.durationMs};if(e.kind===`selector`)return{kind:`selector`,selector:e.selectorExpression,timeoutMs:e.timeoutMs,...r?{recordedLandmark:r}:{}};if(e.kind===`ref`){if(!n?.snapshot)throw new t(`INVALID_ARGS`,`Ref wait requires an existing snapshot in session.`);return{kind:`ref`,ref:e.rawRef,timeoutMs:e.timeoutMs}}if(e.kind===`stable`)return{kind:`stable`,quietMs:e.quietMs,timeoutMs:e.timeoutMs};let i=d(e.text);if(!i.ok)throw new t(i.code,i.message);return{kind:`text`,text:i.text,timeoutMs:e.timeoutMs}}async function Q(e){try{return{ok:!0,data:await e()}}catch(e){let t=o(e);return x(t.code,t.message,t.details)}}async function $(e,t,n){if(t.ok)return t;let r=e.sessionStore.get(e.sessionName);if(!r)return t;let i;try{i=await L(r)}catch{return t}return i?x(t.error.code,`${n} failed because ${We(i)}.`,{...t.error.details??{},...i,blockedBy:`android_foreground_surface`,originalMessage:t.error.message}):t}export{je as S,Ne as _,Gt as a,Me as b,Ue as c,I as d,P as f,Pe as g,Ie as h,Rt as i,Ge as l,Le as m,It as n,K as o,F as p,Lt as r,G as s,Ft as t,He as u,M as v,k as x,N as y};
|
|
1
|
+
import{E as e,_ as t,h as n,l as r,m as i,s as a,v as o}from"./sdk-contracts.js";import{$n as s,Bt as c,Cr as l,Qn as u,Sn as d,Xn as f,Zn as p,Zt as m,bn as ee,nn as te,tr as ne}from"./sdk-batch-runner.js";import{_ as re,c as h,l as ie,s as ae}from"./sdk-device.js";import{Dt as oe,G as se,Ot as ce,m as g,ot as le}from"./script-source-bundle.js";import{t as ue}from"./interaction.js";import{N as de,Q as _}from"./screenshot-result.js";import{i as fe}from"./session-target-evidence.js";import{t as pe}from"./verdict.js";import{a as me,t as he}from"./runtime.js";import{A as ge}from"./sdk-android-adb.js";import{r as _e}from"./app-lifecycle.js";import{a as v}from"./snapshot.js";import{j as ve}from"./runner-disposal.js";import{o as y}from"./interactors.js";import{a as b,o as ye,p as be,s as x,t as xe}from"./dispatch.js";import{n as S}from"./runner-client.js";import{Mt as C,Ot as w,ft as Se,gt as T,ht as E,jt as Ce,mt as we,wt as D}from"./internal/daemon.js";import{a as Te,i as Ee,r as De}from"./snapshot-session.js";import{t as Oe}from"./device-ready.js";import{t as ke}from"./backend-snapshot-options.js";const Ae=[[`snapshotDepth`,`--depth`],[`snapshotScope`,`--scope`],[`snapshotRaw`,`--raw`]];function O(e,t){let n=je(t);return n.length===0?null:b(`INVALID_ARGS`,`${e} @ref does not support ${n.join(`, `)}.`)}function je(e){if(!e)return[];let t=[];for(let[n,r]of Ae)e[n]!==void 0&&t.push(r);return t}function Me(e,t){if(!t||t.settle===!0)return null;let n=[];return t.settleQuietMs!==void 0&&n.push(`--settle-quiet`),n.length===0?null:b(`INVALID_ARGS`,`${e}: ${n.join(`, `)} require${n.length===1?`s`:``} --settle.`)}function Ne(e){if(e?.settle===!0)return{...e.settleQuietMs===void 0?{}:{quietMs:e.settleQuietMs},...e.timeoutMs===void 0?{}:{timeoutMs:e.timeoutMs}}}function k(e){if(e.length<2)return null;let t=Number(e[0]),n=Number(e[1]);return!Number.isFinite(t)||!Number.isFinite(n)?null:{x:t,y:n}}function A(e){let t=n(e);return t?{ok:!0,ref:t.base,generation:t.generation}:{ok:!1,response:b(`INVALID_ARGS`,`Invalid ref "${e}" — malformed generation suffix.`,{hint:a})}}function j(e,t){let n=k(e);if(n)return{ok:!0,target:{kind:`point`,x:n.x,y:n.y}};let r=e[0]??``;if(r.startsWith(`@`)){let t=A(r);return t.ok?{ok:!0,target:{kind:`ref`,ref:t.ref,fallbackLabel:e.slice(1).join(` `).trim()},refGeneration:t.generation}:{ok:!1,response:t.response}}let i=e.join(` `).trim();return i?{ok:!0,target:{kind:`selector`,selector:i}}:{ok:!1,response:b(`INVALID_ARGS`,`${t} requires @ref, selector expression, or x y coordinates`)}}function Pe(e){let t=k(e);if(t)return{ok:!0,target:{kind:`point`,x:t.x,y:t.y},...Ve(e[2])};let n=Be(e),r=j(n.targetPositionals,`longpress`);return r.ok?{ok:!0,target:r.target,refGeneration:r.refGeneration,...n.duration}:r}function Fe(e){let t=e[0]??``;if(t.startsWith(`@`)){let n=A(t);if(!n.ok)return{ok:!1,response:n.response};let r=g(e).text;return r?{ok:!0,target:{kind:`ref`,ref:n.ref,fallbackLabel:ze(e)},refGeneration:n.generation,text:r}:{ok:!1,response:b(`INVALID_ARGS`,`fill requires text after ref`)}}let n=k(e);if(n){let t=e.slice(2).join(` `);return t?{ok:!0,target:{kind:`point`,x:n.x,y:n.y},text:t}:{ok:!1,response:b(`INVALID_ARGS`,`fill requires text after coordinates`)}}let r=Ie(e);return!r||r.kind!==`selector`?{ok:!1,response:b(`INVALID_ARGS`,`fill requires x y text, @ref text, or selector text`)}:r.text.trim()?{ok:!0,target:{kind:`selector`,selector:r.target.selector},text:r.text}:{ok:!1,response:b(`INVALID_ARGS`,`fill requires text after selector`)}}function Ie(e){try{return g(e)}catch{return null}}function Le(e){let t=`evidence`in e?e.evidence:void 0,n=e.settle;return e.kind===`ref`?{ref:M(e.target?.kind===`ref`?e.target.ref:void 0),refLabel:e.refLabel,selectorChain:e.selectorChain,targetHittable:e.targetHittable,hint:e.hint,evidence:t,settle:n,resolution:e.resolution}:e.kind===`selector`?{selector:e.target?.kind===`selector`?e.target.selector:void 0,selectorChain:e.selectorChain,refLabel:e.refLabel,targetHittable:e.targetHittable,hint:e.hint,evidence:t,settle:n,resolution:e.resolution}:{evidence:t,settle:n}}function Re(e,t){return e.kind===`point`?`coordinate tap`:t.kind===`ref`&&t.target?.kind===`ref`?t.target.ref:t.kind===`selector`&&t.target?.kind===`selector`?t.target.selector:`target`}function M(e){return e?.startsWith(`@`)?e.slice(1):e}function ze(e){return e.length>=3&&e[1]?.trim()||``}function Be(e){let t=e.at(-1);return e.length>1&&He(t)?{targetPositionals:e.slice(0,-1),duration:{durationMs:Number(t)}}:{targetPositionals:e,duration:{}}}function Ve(e){return e===void 0?{}:{durationMs:Number(e)}}function He(e){return e===void 0||e.trim()===``?!1:Number.isFinite(Number(e))}function N(e){let{req:t,logPath:n,traceLogPath:r}=e;return{verbose:t.flags?.verbose,logPath:n,traceLogPath:r,requestId:t.meta?.requestId,iosXctestrunFile:t.flags?.iosXctestrunFile,iosXctestDerivedDataPath:t.flags?.iosXctestDerivedDataPath,iosXctestEnvDir:t.flags?.iosXctestEnvDir}}function P(e,t){return!(!e||!h(e.device)||y(e.device)||t.skipPendingPostGestureStabilization&&w(e))}function F(e){let{session:t,selectorExpression:n}=e;return P(t,{skipPendingPostGestureStabilization:!0})?te(n):null}function Ue(e){let t=e.identifier?.trim();if(t)return{key:`id`,value:t};let n=e.label?.trim();return n?{key:`label`,value:n}:null}function I(e,t={}){let n=o(e);if(n.code===`ELEMENT_NOT_FOUND`)return t.delegateSemanticFailures===!0||t.allowElementNotFound===!0;if(n.code===`AMBIGUOUS_MATCH`)return t.delegateSemanticFailures===!0;if(n.code===`ELEMENT_OFFSCREEN`)return t.delegateSemanticFailures!==!1;if(n.code!==`COMMAND_FAILED`)return!1;let r=n.message.toLowerCase();return r.includes(`fetch failed`)||r.includes(`timed out`)||r.includes(`timeout`)||r.includes(`runner did not accept connection`)||r.includes(`invalid runner response`)}async function We(e,n){let r=await L(e);if(r){if(v(r.foregroundPackage))return`press ${n} opened an Android permission dialog (${r.foregroundPackage}) over ${r.expectedPackage}. ${r.hint}`;throw new t(`COMMAND_FAILED`,`press ${n} left ${e.appBundleId} and foregrounded ${r.foregroundPackage}. The tap likely escaped the app.`,r)}}async function L(e){if(e.device.platform!==`android`||!e.appBundleId)return null;let t=await _e(e.device),n=t.package?.trim();return!n||n===e.appBundleId||!Je(n)?null:{expectedPackage:e.appBundleId,foregroundPackage:n,activity:t.activity,hint:qe(n)}}function Ge(e){return v(e.foregroundPackage)?`Android permission dialog is blocking ${e.expectedPackage}`:`${e.foregroundPackage} is foreground instead of ${e.expectedPackage}`}function Ke(e){return e.code===`COMMAND_FAILED`&&typeof e.details?.expectedPackage==`string`&&typeof e.details?.foregroundPackage==`string`}function qe(e){return v(e)?`Use "alert get" to inspect it, then "alert accept" or "alert dismiss" to respond.`:`Use screenshot as visual truth, then take a fresh snapshot -i before retrying.`}function Je(e){return e===`com.android.settings`||e===`com.android.systemui`||v(e)||e.includes(`launcher`)}function Ye(e,t){if(t===`exists`)return{found:!0};if(t===`wait`)return{found:!0,waitedMs:e.waitedMs};if(t===`list`)return{action:`list`,matches:Array.isArray(e.matches)?e.matches.length:0};let n=typeof e.ref==`string`?e.ref:void 0;return t===`get_attrs`?{ref:n,action:`get attrs`}:{ref:n,action:`get text`,text:typeof e.text==`string`?e.text:``}}function Xe(e){return e.kind===`found`?{found:!0,...typeof e.waitedMs==`number`?{waitedMs:e.waitedMs}:{}}:e.kind===`list`?{matches:e.matches.map(e=>({ref:e.ref,node:c(e.node)}))}:{ref:e.ref,...e.kind===`text`?{text:e.text}:{},node:c(e.node)}}function Ze(e,t){let n=Array.isArray(e.selectorChain)?e.selectorChain:void 0,r=et(e),i=r?.kind===`ref`?H(r.ref):void 0,a=r?.kind===`selector`?r.selector:void 0,o={...i?{ref:i}:{},...a?{selector:a}:{},...n?{selectorChain:n}:{}};if(t===`attrs`)return o;let s=typeof e.text==`string`?e.text:``;return{...o,text:s,refLabel:$e(s)}}function R(e){let{target:t}=e;return{...t.kind===`ref`?{ref:H(t.ref)}:{},...t.kind===`selector`?{selector:t.selector}:{},...typeof e.text==`string`?{text:e.text}:{},node:c(e.node)}}function z(e){let{node:t,preActionNodes:n,...r}=e;return r}function Qe(e){return{waitedMs:e.waitedMs,...typeof e.text==`string`?{text:e.text}:{},...typeof e.selector==`string`?{selector:e.selector}:{},...typeof e.captures==`number`?{captures:e.captures}:{},...typeof e.nodeCount==`number`?{nodeCount:e.nodeCount}:{},...typeof e.hint==`string`?{hint:e.hint}:{}}}function B(e){let{selectorChain:t,...n}=e;return n}function V(e,t,n,r,i,a){let o=e.get(t);if(!o)return;let s=_(o)&&i?fe(i,{mode:a}):void 0;e.recordAction(o,{command:n.command,positionals:n.positionals??[],flags:n.flags??{},result:r,interactiveObservation:de(n),...s?{targetEvidence:s}:{}})}function $e(e){let t=e.trim();if(!(!t||t.length>80||/[\r\n]/.test(t)))return t}function et(e){let t=e.target;if(!t||typeof t!=`object`)return;let n=t;if(n.kind===`ref`&&typeof n.ref==`string`)return{kind:`ref`,ref:n.ref};if(n.kind===`selector`&&typeof n.selector==`string`)return{kind:`selector`,selector:n.selector}}function H(e){return e.startsWith(`@`)?e.slice(1):e}const tt=[`application`,`window`,`tabbar`,`scrollbar`,`image`],nt=new Set([`tab bar`]);async function U(e,t){if(t.ok||!rt(t.error.details?.reason)||t.error.details?.captureStalled===!0||t.error.details?.captureTruncated===!0)return t;let n=await it(e).catch(()=>null);return n?b(t.error.code,`${t.error.message}. Current surface: ${n.summary}.`,{...t.error.details??{},currentSurface:n.details}):t}function rt(e){return e===ue.targetAbsent||e===ue.stableTimeout}async function it(e){let t=[...(await D({device:e.device,session:e.session,flags:{...e.req.flags,snapshotInteractiveOnly:!0},logPath:e.logPath??``})).snapshot.nodes].sort(at),n=W(t,6,{includeIdentifiers:!0});if(n.length===0)return null;let r=W(t.filter(e=>!lt(e)),4,{includeIdentifiers:!1}),i=W(t.filter(ut),4,{includeIdentifiers:!0});return{summary:(r.length>0?r:n.slice(0,4)).join(`, `),details:{labels:n,...i.length>0?{buttons:i}:{}}}}function W(e,t,n){let r=new Set,i=[];for(let a of e){let e=ct(a,n);if(!(!e||r.has(e))&&(r.add(e),i.push(e),i.length>=t))break}return i}function at(e,t){return ot(e)-ot(t)||st(e,t)}function ot(e){let t=!!ct(e,{includeIdentifiers:!1});return(lt(e)?2:0)+ +!t}function st(e,t){return e.rect&&t.rect?e.rect.y-t.rect.y||e.rect.x-t.rect.x:e.rect?-1:t.rect?1:(e.depth??0)-(t.depth??0)||e.index-t.index}function ct(e,t){let n=(t.includeIdentifiers?[e.label,e.value,e.identifier]:[e.label,e.value]).map(e=>typeof e==`string`?e.trim():``).find(e=>e.length>0);return n?n.replace(/\s+/g,` `).slice(0,80):``}function lt(e){let t=l(`${e.type??``} ${e.role??``} ${e.subrole??``}`),n=`${e.label??``} ${e.value??``}`.trim().toLowerCase();return tt.some(e=>t.includes(e))||nt.has(n)||n.endsWith(`.fill`)}function ut(e){return l(`${e.type??``} ${e.role??``} ${e.subrole??``}`).includes(`button`)}function G(e,t){let n=me(t);if(!n)return e;if(e.ok){let t=dt(e.data?.warning,n);return{...e,data:{...e.data,warning:t}}}let r=e.error.details??{};return{...e,error:{...e.error,details:{...r,hint:dt(r.hint,n)}}}}function dt(e,t){return typeof e==`string`&&e.trim()!==``?`${e}\n${t}`:t}async function ft(e){let{device:t,node:n,flags:r,appBundleId:i,traceOutPath:a,surface:o,contextFromFlags:s}=e,c=oe(n),l=le(n.rect);if(!l||h(t)&&c&&!ce(n.type??``))return c;try{let e=await xe(t,`read`,[String(l.x),String(l.y)],void 0,{...s(r,i,a),surface:o}),u=e&&typeof e==`object`?e:void 0,d=typeof u?.text==`string`?u.text:``;return d.trim()?d:(ge({level:`warn`,phase:`interaction_read_fallback`,data:{reason:`empty_backend_text`,nodeRef:n.ref,surface:o,platform:t.platform}}),c)}catch(e){return ge({level:`warn`,phase:`interaction_read_fallback`,data:{reason:`backend_read_failed`,nodeRef:n.ref,surface:o,platform:t.platform,error:e instanceof Error?e.message:String(e)}}),c}}function K(e){let{session:t,sessionStore:n,sessionName:r}=e,i=0,a,o,s=t=>(e.consumedSnapshot&&(e.consumedSnapshot.state=t.snapshot),t);return{capture:async c=>{let l=Date.now(),u=St(c,e.req.flags?.out),d=gt({timestamp:l,lastSnapshotAt:i,lastSnapshotResult:a,lastSnapshotCacheKey:o,session:t,request:c,cacheKey:u});if(d)return s(d);let f=_t({session:t,timestamp:l,request:c});if(f)return i=f.createdAt,a={snapshot:f},o=u,s(a);let p=await pt({params:e,request:c});c.signal?.throwIfAborted();let m={snapshot:p};return wt({session:t,sessionStore:n,sessionName:r,snapshot:p}),i=l,a=m,o=u,s(m)}}}async function pt(e){let{params:t,request:n}=e,r=await q(t,n,n.snapshotScope);return n.recovery?.legacyIosSparse&&Tt(r)?await mt({runtimeParams:t,request:n,policy:n.recovery.legacyIosSparse}):n.recovery?.sparseVerdictQueryScope?.shouldScope&&pe(r.snapshotQuality)?await ht({runtimeParams:t,request:n,policy:n.recovery.sparseVerdictQueryScope,snapshot:r}):r}async function mt(e){let{runtimeParams:t,request:n,policy:r}=e;try{return await q(t,n,void 0,!1)}catch(e){if(!r.shouldScope)throw e;return await q(t,n,r.query,!1)}}async function ht(e){let{runtimeParams:t,request:n,policy:r,snapshot:i}=e;try{return await q(t,n,r.query,!1)}catch{return i}}async function q(e,t,n,r=t.flags?.snapshotInteractiveOnly){return(await D({device:e.device,session:e.session,flags:{...t.flags,snapshotInteractiveOnly:r},outPath:t.outPath??e.req.flags?.out,logPath:e.logPath??``,snapshotScope:n,includeRects:t.includeRects,signal:t.signal})).snapshot}function gt(e){let{timestamp:t,lastSnapshotAt:n,lastSnapshotResult:r,lastSnapshotCacheKey:i,session:a,request:o,cacheKey:s}=e;if(o.cache?.forceFresh!==!0&&r&&i===s&&!(t-n>=750)&&!C(a)&&!bt(a,o))return r}function _t(e){let{session:t,timestamp:n,request:r}=e,i=t?.snapshot;if(i&&vt(t,r)&&yt(i,n)&&i.presentationKey===xt(r))return i}function vt(e,t){return!(t.cache?.forceFresh===!0||t.cache?.useSessionSnapshot!==!0||C(e)||bt(e,t))}function yt(e,t){return t-e.createdAt<750}function bt(e,t){return t.cache?.bypassForPostGestureStabilization===!0&&w(e)}function xt(e){return r(i(Ct(e)))}function St(e,t){return JSON.stringify({presentationKey:xt(e),includeRects:e.includeRects===!0,outPath:e.outPath??t??null})}function Ct(e){return e.snapshotScope===void 0?e.flags:{...e.flags,snapshotScope:e.snapshotScope}}function wt(e){let{session:t,sessionStore:n,sessionName:r,snapshot:i}=e;!t||pe(i.snapshotQuality)||(T(t,i),n.set(r,t))}function Tt(e){return e.snapshotQuality||e.backend!==`xctest`||e.nodes.length!==1?!1:e.nodes[0]?.type===`Application`}function Et(e){return he({backend:Dt(e),...Te(`selector commands`,{plural:!0}),sessions:Se({sessionName:e.sessionName,getSession:()=>e.session,recordOptions:{includeSnapshot:!0},setRecord:t=>{!e.session||!t.snapshot||(T(e.session,t.snapshot),e.sessionStore.set(e.sessionName,e.session))}}),signal:e.signal??ve(e.req.meta?.requestId)})}async function J(e,t){e.consumedSnapshot??={};let n=e.sessionStore.get(e.sessionName);if(!n&&t.requireSession)return{ok:!1,response:ye()};let r=n?.device??await be(e.req.flags??{});n||await Oe(r);let i=x(t.capability,r);return i?{ok:!1,response:i}:{ok:!0,runtime:Et({...e,session:n,device:r})}}function Dt(e){let{req:t,session:n,device:r,logPath:i,sessionName:a,sessionStore:o}=e,s=K({device:r,session:n,sessionStore:o,sessionName:a,req:t,consumedSnapshot:e.consumedSnapshot,logPath:i});return{platform:re(r),captureSnapshot:async(e,n)=>{let i={...t.flags,...ke(n)},a=n?.includeRects===!0,o=n?.scope??t.flags?.snapshotScope,c=t.command===`wait`||t.command===`find`||a&&r.platform===`web`;return await s.capture({flags:i,signal:e.signal,snapshotScope:o,includeRects:a,cache:{forceFresh:c,useSessionSnapshot:!0,bypassForPostGestureStabilization:!0}})},readText:async(a,o)=>({text:await ft({device:r,node:o,flags:t.flags,appBundleId:n?.appBundleId,traceOutPath:n?.trace?.outPath,surface:n?.surface,contextFromFlags:e.contextFromFlags??((e,t,n)=>Ce(i??``,e,t,n))})}),findText:async(t,n)=>({found:await Ot(e,n,t.signal)})}}async function Ot(e,t,n){let r=await kt(e,t,n);return r===null?await At(e,t,n)===!0?!0:await Nt(e,t,n):r}async function kt(e,t,n){return!ie(e.device)||!e.session?.surface||e.session.surface===`app`?null:await Nt(e,t,n)}async function At(e,t,n){let r=jt(e);return r?(await S(r.device,{command:`findText`,text:t,appBundleId:r.appBundleId},{...Mt(e,r),signal:n}))?.found===!0:null}function jt(e){return!ae(e.device.platform)||y(e.device)||!e.session?.appBundleId?null:{device:e.device,appBundleId:e.session.appBundleId,traceLogPath:e.session.trace?.outPath}}function Mt(e,t){return N({req:e.req,logPath:e.logPath,traceLogPath:t.traceLogPath})}async function Nt(e,t,n){return!!se((await Pt(e,n)).nodes,t)}async function Pt(e,t){let{snapshot:n}=await K({device:e.device,session:e.session,sessionStore:e.sessionStore,sessionName:e.sessionName,req:e.req,logPath:e.logPath,consumedSnapshot:e.consumedSnapshot}).capture({flags:{...e.req.flags,snapshotInteractiveOnly:!1,snapshotIncludeHiddenContentHints:!1},signal:t,cache:{forceFresh:!0,bypassForPostGestureStabilization:!0}});return n}async function Ft(e){let{req:t}=e;if(t.command!==`find`)return null;let n=ee(t.positionals??[],t.flags);if(!n.ok)return b(n.code,n.message);let r=n.parsed,i=r.action;if(!d(i))return null;let a=await J(e,{requireSession:!1,capability:`find`});return a.ok?G(await Q(async()=>{let n=await a.runtime.selectors.find({session:e.sessionName,requestId:t.meta?.requestId,locator:r.locator,query:r.query,action:i,timeoutMs:r.timeoutMs});V(e.sessionStore,e.sessionName,t,Ye(n,i));let o=Xe(n),s=typeof o.ref==`string`?[o.ref]:Array.isArray(o.matches)?o.matches.map(e=>e.ref).filter(e=>typeof e==`string`):[];if(s.length>0){let t=e.sessionStore.get(e.sessionName);if(t&&(we(t,s),e.sessionStore.set(e.sessionName,t),t.snapshotGeneration!==void 0))return{...o,refsGeneration:t.snapshotGeneration}}return o}),Y(e)):a.response}function Y(e){return e.consumedSnapshot?.state??e.sessionStore.get(e.sessionName)?.snapshot}async function It(e){let{req:t}=e;if(t.command!==`get`)return null;let n=p(t.positionals?.[0]);if(!n.ok)return b(n.code,n.message);let r=n.format,i=Yt(t);if(!i.ok)return i.response;if(i.target.kind===`ref`){let e=O(`get`,t.flags);if(e)return e}let a=t.internal?.replayTargetGuard;if(i.target.kind===`selector`&&!a){let t=await Vt(e,r,i.target.selector);if(t)return t}let o=await J(e,{requireSession:!0,capability:`get`});if(!o.ok)return o.response;let s=i.target.kind===`ref`?E({session:e.sessionStore.get(e.sessionName),ref:i.target.ref,mintedGeneration:i.refGeneration}):void 0;return G(await Q(async()=>{let n=await o.runtime.selectors.get({session:e.sessionName,requestId:t.meta?.requestId,property:r,target:i.target,expectedResolvedTarget:a});V(e.sessionStore,e.sessionName,t,Ze(n,r),{node:n.node,preActionNodes:n.preActionNodes});let c=R(n);return s?{...c,warning:s}:c}),Y(e))}async function Lt(e){let{req:t}=e;if(t.command!==`is`)return null;let n=u(t.positionals??[]);if(!n.ok)return b(n.code,n.message,n.hint?{hint:n.hint}:void 0);let{predicate:r,expectedText:i}=n,a={selectorExpression:n.selectorExpression},o=t.internal?.replayTargetGuard,s=_(e.sessionStore.get(e.sessionName));if(!o&&!s){let t=await Ht(e,r,a.selectorExpression,i);if(t)return t}let c=await J(e,{requireSession:!0,capability:`is`});return c.ok?G(await $(e,await Q(async()=>{let n=await c.runtime.selectors.is({session:e.sessionName,requestId:t.meta?.requestId,predicate:r,selector:a.selectorExpression,expectedText:i,expectedResolvedTarget:o}),s=zt(n),l=z(n);return V(e.sessionStore,e.sessionName,t,l,s),B(l)}),`is ${r}`),Y(e)):c.response}async function Rt(e){let{req:t,sessionName:n,sessionStore:r}=e,i=m(t.positionals??[]);if(!i)return b(`INVALID_ARGS`,`wait requires a duration or text`);if(i.kind===`invalid`)return b(`INVALID_ARGS`,i.message);let{session:a,device:o}=await De(r,n,t.flags);if(i.kind!==`sleep`){let e=x(`wait`,o);if(e)return e}let s=t.internal?.replayLandmarkGuard;if(i.kind===`selector`&&!s&&!_(a)){let t=await Ut({...e,session:a,device:o,selectorExpression:i.selectorExpression,timeoutMs:i.timeoutMs});if(t)return t}let c=i,l;if(i.kind===`ref`){let e=A(i.rawRef);if(!e.ok)return e.response;c={...i,rawRef:e.ref},l=E({session:a,ref:e.ref,mintedGeneration:e.generation})}e.consumedSnapshot??={};let u=async()=>{let i=Et({...e,session:a,device:o}),u=await Q(async()=>{let e=await i.selectors.wait({session:n,requestId:t.meta?.requestId,target:Xt(c,a,s)}),o=zt(e);V(r,n,t,z(e),o,`landmark`);let u=Qe(e);return l?{...u,warning:l}:u});return await $(e,await U({req:t,logPath:e.logPath,session:a,device:o},u),`wait`)};return i.kind===`sleep`?await u():G(await Ee(a,o,u),Y(e))}function zt(e){let t=e.node,n=e.preActionNodes;if(!(!t||typeof t!=`object`||!Array.isArray(n)))return{node:t,preActionNodes:n}}function Bt(e,t,n){if(!e||_(e))return null;let r=F({session:e,selectorExpression:n});return t===`text`&&r?.key!==`id`?null:r}async function Vt(e,t,n){let r=e.sessionStore.get(e.sessionName),i=Bt(r,t,n);if(!r||!i)return null;let a=await X(e,r,i);if(Z(a))return a.response;if(!a)return null;let o=Kt(t,i.raw,a);return o?(V(e.sessionStore,e.sessionName,e.req,Ze(o,t)),{ok:!0,data:R(o)}):null}async function Ht(e,t,n,r){if(t===`hidden`)return null;let i=await Wt(e,n);if(Z(i))return i.response;if(!i?.result.found||!i.result.node)return null;let a=t===`exists`?{predicate:t,pass:!0,selector:i.selector.raw,matches:1,selectorChain:[i.selector.raw]}:qt(t,r,i.selector.raw,i.session,i.result.node);return a?(V(e.sessionStore,e.sessionName,e.req,a),{ok:!0,data:B(a)}):null}async function Ut(e){let t=F({session:e.session,selectorExpression:e.selectorExpression});if(!e.session||!t)return null;let n=Date.now(),r=await X(e,e.session,t);if(Z(r))return r.response;if(!r?.found)return null;let i={kind:`selector`,selector:t.raw,waitedMs:Date.now()-n,selectorChain:[t.raw]};V(e.sessionStore,e.sessionName,e.req,i);let a={ok:!0,data:B(i)};return await U({req:e.req,logPath:e.logPath,session:e.session,device:e.device},a)}async function Wt(e,t){let n=e.sessionStore.get(e.sessionName),r=F({session:n,selectorExpression:t});if(!n||!r)return null;let i=await X(e,n,r);return Z(i)?i:i?{session:n,selector:r,result:i}:null}async function Gt(e,t,n){let r=await S(e.device,{command:`querySelector`,selectorKey:t.key,selectorValue:t.value,appBundleId:e.appBundleId},n),i=r.found===!0,a=Jt(r);return{found:i,...typeof r.text==`string`?{text:r.text}:{},...a?{node:a}:{}}}async function X(t,n,r){try{return await Gt(n,r,N({req:t.req,logPath:t.logPath,traceLogPath:n.trace?.outPath}))}catch(t){return I(t,{allowElementNotFound:!0})?null:{kind:`error`,response:{ok:!1,error:e(t)}}}}function Z(e){return e!==null&&`kind`in e&&e.kind===`error`}function Kt(e,t,n){if(!n.found||!n.node)return null;let r={target:{kind:`selector`,selector:t},node:n.node,selectorChain:[t]};return e===`attrs`?{kind:`attrs`,...r}:typeof n.text==`string`?{kind:`text`,...r,text:n.text}:null}function qt(e,t,n,r,i){let a=ne({predicate:e,node:i,nodes:[i],expectedText:t,platform:r.device.platform});return{predicate:e,pass:a.pass,selector:n,...e===`text`?{text:a.actualText}:{},selectorChain:[n]}}function Jt(e){let t=e.nodes;if(!Array.isArray(t))return;let n=t[0];if(!(!n||typeof n!=`object`))return n}function Yt(e){let t=e.positionals?.[1]??``;if(t.startsWith(`@`)){let n=A(t);return n.ok?{ok:!0,target:{kind:`ref`,ref:n.ref,fallbackLabel:e.positionals.length>2?e.positionals.slice(2).join(` `).trim():``},refGeneration:n.generation}:{ok:!1,response:n.response}}let n=f(e.positionals?.slice(1)??[]);return n.ok?{ok:!0,target:{kind:`selector`,selector:`selector`in n?n.selector:``}}:{ok:!1,response:b(n.code,n.message)}}function Xt(e,n,r){if(e.kind===`sleep`)return{kind:`sleep`,durationMs:e.durationMs};if(e.kind===`selector`)return{kind:`selector`,selector:e.selectorExpression,timeoutMs:e.timeoutMs,...r?{recordedLandmark:r}:{}};if(e.kind===`ref`){if(!n?.snapshot)throw new t(`INVALID_ARGS`,`Ref wait requires an existing snapshot in session.`);return{kind:`ref`,ref:e.rawRef,timeoutMs:e.timeoutMs}}if(e.kind===`stable`)return{kind:`stable`,quietMs:e.quietMs,timeoutMs:e.timeoutMs};let i=s(e.text);if(!i.ok)throw new t(i.code,i.message);return{kind:`text`,text:i.text,timeoutMs:e.timeoutMs}}async function Q(e){try{return{ok:!0,data:await e()}}catch(e){let t=o(e);return b(t.code,t.message,t.details)}}async function $(e,t,n){if(t.ok)return t;let r=e.sessionStore.get(e.sessionName);if(!r)return t;let i;try{i=await L(r)}catch{return t}return i?b(t.error.code,`${n} failed because ${Ge(i)}.`,{...t.error.details??{},...i,blockedBy:`android_foreground_surface`,originalMessage:t.error.message}):t}export{Me as C,O as S,Fe as _,Gt as a,M as b,We as c,I as d,P as f,Le as g,Re as h,Rt as i,Ke as l,N as m,It as n,K as o,F as p,Lt as r,G as s,Ft as t,Ue as u,Pe as v,Ne as x,j as y};
|
package/dist/src/selectors.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as resolveSelectorChain, c as
|
|
1
|
+
import { a as resolveSelectorChain, c as isSelectorToken, i as findSelectorChainMatch, l as parseSelectorChain, n as isNodeEditable, o as SelectorDiagnostics, r as isNodeVisible, s as SelectorChain, t as formatSelectorFailure, u as tryParseSelectorChain } from "./sdk-selectors.js";
|
|
2
2
|
export { type SelectorChain, type SelectorDiagnostics, findSelectorChainMatch, formatSelectorFailure, isNodeEditable, isNodeVisible, isSelectorToken, parseSelectorChain, resolveSelectorChain, tryParseSelectorChain };
|
package/dist/src/selectors.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{dr as e,fn as t,hn as n,lr as r,or as i,sr as a,ur as o}from"./sdk-batch-runner.js";import{t as s}from"./sdk-selectors.js";export{t as findSelectorChainMatch,s as formatSelectorFailure,o as isNodeEditable,e as isNodeVisible,i as isSelectorToken,a as parseSelectorChain,n as resolveSelectorChain,r as tryParseSelectorChain};
|
package/dist/src/server.js
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
-
import{S as e,_ as t,n,o as r}from"./sdk-contracts.js";import{n as i}from"./version.js";import{S as a,Un as o,g as s,h as c}from"./sdk-batch-runner.js";import{i as l,t as u}from"./sdk-device.js";import{Et as ee,Ot as te,kt as ne,qt as re,un as ie}from"./prepare-kind.js";import{_ as d,g as f,h as ae,s as oe,v as p}from"./registry.js";import{i as se,n as ce,t as le}from"./command-metadata.js";import{n as ue,r as de,t as fe}from"./cli-config.js";import{t as pe}from"./cli-output.js";const m=[`simulator`,`emulator`,`device`];function h(e){return{type:`number`,...e?{description:e}:{}}}function g(e,t){return{type:`string`,enum:e,...t?{description:t}:{}}}function _(e){return{type:`string`,const:e}}function v(e){return{type:[`string`,`null`],...e?{description:e}:{}}}function y(e,t=[],n){return{type:`object`,...n?{description:n}:{},properties:e,...t.length>0?{required:t}:{}}}const b={type:`array`,items:{type:`string`}},x=y({wallClockMs:h(`Total wall-clock time for the request in milliseconds.`),runnerRoundTrips:h(`Number of real runner round-trips made while serving the request.`),nodeCount:h(`Number of nodes in the original node tree when the response carries one.`)},[`wallClockMs`,`runnerRoundTrips`]),S=y({field:p(),artifactType:p(),path:p(),localPath:p(),fileName:p()},[`field`]);function C(e={}){let t=e.properties??{},n=e.required??[];return y({targetKind:g([`point`,`ref`,`selector`],`Resolved interaction target kind.`),x:h(`Resolved interaction x coordinate when available.`),y:h(`Resolved interaction y coordinate when available.`),referenceWidth:h(`Reference frame width for visualizing the interaction point.`),referenceHeight:h(`Reference frame height for visualizing the interaction point.`),ref:p(`Snapshot ref without the @ prefix when the target was an @ref.`),selector:p(`Selector expression when the target was a selector.`),selectorChain:b,refLabel:p(),targetHittable:f(),hint:p(),warning:p(),message:p(),evidence:T,resolution:me,cost:x,maestroNonHittableCoordinateFallbackAllowed:f(`Whether the direct iOS Maestro coordinate fallback was allowed for this selector.`),maestroNonHittableCoordinateFallbackUsed:f(`Whether the direct iOS Maestro coordinate fallback was actually used.`),maestroFallbackReason:_(`non-hittable-coordinate`),...t},[`targetKind`,...n])}const w=y({diagnosticRef:p(`Opaque non-@ diagnostic token. Never a snapshot ref: not issued via refsGeneration and cannot be pinned or reused as an @ref target. UTF-8 truncated to 256 bytes.`),role:p(`UTF-8 truncated to 256 bytes.`),label:p(`UTF-8 truncated to 256 bytes.`)},[`diagnosticRef`]),me={type:`object`,description:`Pre-action disclosure of how the acting path resolved its target. Absent when resolutionDisclosure is inapplicable for the path.`,oneOf:[y({source:_(`runtime`),phase:_(`pre-action`),kind:_(`unique`)},[`source`,`phase`,`kind`]),y({source:_(`runtime`),phase:_(`pre-action`),kind:_(`disambiguated`),matchCount:h(`Total matches resolveSelectorChain found before disambiguation.`),winnerDiagnostic:w,tiebreak:g([`visible`,`deepest`,`smallest-area`,`structural-equivalence`],`The comparison that decided the winner.`),alternatives:{type:`array`,description:`At most 5 losing candidates, document order. Present at default/full response levels and omitted in digest. The winner is never included.`,items:w}},[`source`,`phase`,`kind`,`matchCount`,`winnerDiagnostic`,`tiebreak`]),y({source:_(`ref`),phase:_(`pre-action`),kind:_(`exact`)},[`source`,`phase`,`kind`]),y({source:_(`ref`),phase:_(`pre-action`),kind:_(`label-fallback`)},[`source`,`phase`,`kind`]),y({source:_(`direct-ios`),kind:_(`not-observed`)},[`source`,`kind`])]},T=y({foregroundApp:p(`Foreground app bundle id or name, when the capture carries it.`),nodeCount:h(`Node count in the post-action interactive-only capture.`),interactiveNodeCount:h(`Subset of nodeCount the platform reports as hittable.`),digest:p(`Order-independent digest of the post-action node multiset.`),changedFromBefore:f(`Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure.`)},[`nodeCount`,`interactiveNodeCount`,`digest`,`changedFromBefore`]),E=y({settled:f(`Whether the UI held the quiet window before the deadline. false is advisory, not failure.`),waitedMs:h(),captures:h(),quietMs:h(),timeoutMs:h(),refsGeneration:h(`Snapshot generation of the stored settled tree; refs on added diff lines were minted from it.`),refs:{type:`array`,items:y({ref:p(`Plain ref body (e12) minted from the stored settled tree.`)},[`ref`])},diff:y({summary:y({additions:h(),removals:h(),unchanged:h()},[`additions`,`removals`,`unchanged`]),lines:{type:`array`,items:y({kind:g([`added`,`removed`]),text:p(),ref:p(`Plain ref body (e12) for added lines.`)},[`kind`,`text`])},truncated:f(`Lines were capped to the response bound.`)},[`summary`,`lines`],`Settled diff vs the pre-action tree (changed lines only).`),tail:{type:`array`,description:`Unchanged interactive refs tail: still-present, actionable elements from the settled tree, attached only when diff carries zero added-line refs (a modal-dismiss/toast-only diff).`,items:y({ref:p(`Plain ref body (e12) minted from the stored settled tree.`),role:p(),label:p()},[`ref`,`role`])},tailTruncated:f(`Present (true) when tail candidates exceeded the response cap.`),hint:p()},[`settled`,`waitedMs`,`captures`,`quietMs`,`timeoutMs`]),D={platform:g(l),target:g(u),device:p(`Human-readable device name.`),id:p(`Stable device id.`),kind:g(m)},O=[`platform`,`target`,`device`,`id`,`kind`],he=y({success:f(),exitCode:h(),stdout:p(),stderr:p(),error:d(`Normalized error detail when shutdown failed.`)},[`success`,`exitCode`,`stdout`,`stderr`]);function ge(e){return{...e,properties:{...e.properties??{},settle:E}}}const _e=C({properties:{evidence:T,settle:E,button:g([`secondary`,`middle`]),count:h(`Number of press/click repetitions.`),intervalMs:h(`Delay between repeated press/click actions.`),holdMs:h(`Hold duration for each action.`),jitterPx:h(`Randomization radius in pixels.`),doubleTap:f(`Whether the command requested a double-tap action.`)}}),k={text:p(`Text submitted to the field.`),delayMs:h(`Delay between typed characters in milliseconds.`),evidence:T,settle:E},ve=y({resourceId:v(`Android resource id of the exact field that changed.`),className:v(`Android class name of the exact field that changed.`),packageName:v(`Android package name that owns the exact field.`),rect:y({x:h(),y:h(),width:h(),height:h()},[`x`,`y`,`width`,`height`],`Screen-space rectangle of the exact field that changed.`)},[`resourceId`,`className`,`packageName`,`rect`],`Target identity captured before fill and matched after fill.`),ye={press:_e,click:_e,fill:{type:`object`,description:`Fill response. Android may return target-bound unconfirmed evidence when the exact app-owned field changed but formatting prevented raw equality.`,oneOf:[{...C({properties:k,required:[`text`]}),not:y({},[`verification`])},C({properties:{...k,verification:_(`unconfirmed`),requested:p(`Literal text requested by the fill command.`),before:v(`Raw target text captured before the fill.`),after:v(`Raw target text captured after the fill.`),target:ve},required:[`text`,`verification`,`requested`,`before`,`after`,`target`]})]},longpress:C({properties:{durationMs:h(),settle:E,gesture:_(`longpress`)}}),find:y({ref:p(`Snapshot ref without the @ prefix when the find action returns one.`),refsGeneration:h(`ADR 0014 ref frame epoch for read-only find actions.`),found:f(`Whether a wait/exists/read-only find satisfied its condition.`),waitedMs:h(`Milliseconds waited for a read-only find condition.`),text:p(`Text value returned by find get_text.`),node:d(`Snapshot node for find get_attrs/get_text.`),matches:{type:`array`,description:`Every match for the read-only find list action (#1625): { ref, node } each.`,items:d(`One listed match with its snapshot ref and node.`)},locator:p(`Locator kind used for the find action.`),query:p(`Query argument used for the find action.`),x:h(`Resolved x coordinate for mutating find actions.`),y:h(`Resolved y coordinate for mutating find actions.`),message:p(`Diagnostic message for mutating find actions.`),settle:E,cost:x},[],`Daemon response data for the find command.`),boot:y({...D,booted:{type:`boolean`,const:!0}},[...O,`booted`]),shutdown:y({...D,shutdown:he},[...O,`shutdown`]),viewport:y({width:h(),height:h(),message:p()},[`width`,`height`,`message`]),...oe,back:ge(oe.back),wait:y({waitedMs:h(),kind:_(`selector`),text:p(),selector:p(),captures:h(),nodeCount:h(),hint:p(),warning:p()},[`waitedMs`]),prepare:y({action:_(`ios-runner`),platform:g(l),deviceId:p(),deviceName:p(),kind:g(m),durationMs:h(),runner:y({},[]),cache:g([`exact`,`restore-key`,`miss`,`external`]),artifact:g([`valid`,`rebuilt`]),buildMs:h(),connectMs:h(),healthCheckMs:h(),xctestrunPath:p(),recoveryReason:p(),failureReason:p(),timing:y({totalMs:h(),additiveParts:y({buildMs:h(),connectAfterBuildMs:h(),healthCheckMs:h()},[`connectAfterBuildMs`,`healthCheckMs`]),containment:y({connectMs:{type:`array`,items:_(`buildMs`)},healthCheckMs:{type:`array`,items:p()}},[`healthCheckMs`]),note:p()},[`totalMs`,`additiveParts`,`containment`,`note`]),message:p()},[`action`,`platform`,`deviceId`,`deviceName`,`kind`,`durationMs`,`runner`,`connectMs`,`healthCheckMs`,`timing`,`message`]),push:{type:`object`,oneOf:[y({platform:_(`ios`),bundleId:p(),message:p()},[`platform`,`bundleId`,`message`]),y({platform:_(`android`),package:p(),action:p(),extrasCount:h(),message:p()},[`platform`,`package`,`action`,`extrasCount`,`message`])]},"trigger-app-event":y({event:p(),eventUrl:p(),transport:_(`deep-link`),message:p()},[`event`,`eventUrl`,`transport`,`message`]),clipboard:{type:`object`,oneOf:[y({action:_(`read`),text:p()},[`action`,`text`]),y({action:_(`write`),textLength:h(),message:p()},[`action`,`textLength`,`message`])]},appstate:{type:`object`,oneOf:[y({platform:g([`ios`,`macos`]),appName:p(),appBundleId:p(),source:_(`session`),surface:g(re),device_udid:p(`iOS only — the session device UDID.`),ios_simulator_device_set:{type:[`string`,`null`],description:`iOS only — the simulator set path, or null when unknown.`}},[`platform`,`appName`,`source`,`surface`]),y({platform:_(`android`),package:p(),activity:p()},[`platform`,`package`,`activity`])]},keyboard:y({platform:g([`android`,`ios`]),action:g([`status`,`dismiss`,`enter`]),visible:f(),wasVisible:f(),dismissed:f(),attempts:h(),inputType:p(),type:g([`text`,`number`,`email`,`phone`,`password`,`datetime`,`unknown`]),inputMethodPackage:p(),focusedPackage:p(),focusedResourceId:p(),inputOwner:g([`app`,`ime`,`unknown`]),message:p()},[`platform`,`action`]),doctor:y({status:g([`pass`,`warn`,`fail`,`info`]),summary:p(),kind:g([`auto`,`react-native`,`expo`,`repack`]),platform:p(),target:g(u),targetApp:p(),metro:y({host:p(),port:h()},[`host`,`port`]),checks:{type:`array`,items:y({id:p(),status:g([`pass`,`warn`,`fail`,`info`]),summary:p(),hint:p(),command:p(),evidence:d()},[`id`,`status`,`summary`])}},[`status`,`summary`,`kind`,`checks`]),diff:y({mode:_(`snapshot`),baselineInitialized:f(),summary:y({additions:h(),removals:h(),unchanged:h()},[`additions`,`removals`,`unchanged`]),lines:{type:`array`,items:y({kind:g([`added`,`removed`]),text:p(),ref:p()},[`kind`,`text`])},warnings:b},[`mode`,`baselineInitialized`,`summary`,`lines`]),replay:y({replayed:h(),healed:h(),session:p(),sessionActive:f(`True iff the session is still active — the script had no terminal close.`),artifactPaths:b,snapshotDiagnostics:d(),message:p()},[`replayed`,`healed`,`session`,`sessionActive`,`artifactPaths`,`message`]),test:y({total:h(),executed:h(),passed:h(),failed:h(),skipped:h(),notRun:h(),durationMs:h(),failures:{type:`array`,items:d()},tests:{type:`array`,items:d()},snapshotDiagnostics:d()},[`total`,`executed`,`passed`,`failed`,`skipped`,`notRun`,`durationMs`,`failures`,`tests`]),record:{type:`object`,oneOf:[y({recording:_(`started`),outPath:p(),sessionStateDir:p(),recordingBackend:p(),recordingScope:p(),recordOnlySession:f(),activeSessionApp:d(),showTouches:f()},[`recording`,`outPath`,`sessionStateDir`,`showTouches`]),y({recording:_(`stopped`),outPath:p(),telemetryPath:p(),artifacts:{type:`array`,items:S},recordingBackend:p(),recordingScope:p(),recordOnlySession:f(),activeSessionApp:d(),durationMs:h(),showTouches:f(),warning:p(),overlayWarning:p(),chunks:{type:`array`,items:d()}},[`recording`,`outPath`,`artifacts`,`durationMs`,`showTouches`])]},trace:{type:`object`,oneOf:[y({trace:_(`started`),outPath:p()},[`trace`,`outPath`]),y({trace:_(`stopped`),outPath:p(),artifacts:{type:`array`,items:S}},[`trace`,`outPath`,`artifacts`])]}},be={devices:{type:`object`,properties:{devices:{type:`array`,items:{type:`object`,properties:{platform:{type:`string`,enum:l},target:{type:`string`,enum:u},kind:{type:`string`,enum:m},id:{type:`string`},name:{type:`string`}},required:[`platform`,`target`,`kind`,`id`,`name`]}}},required:[`devices`]},apps:{type:`object`,properties:{apps:{type:`array`,items:{type:`string`}}},required:[`apps`]}},A={...ye,...be};function xe(t){return e(t)}function Se(e){let t=[`Error (${e.code}): ${e.message}`];e.hint&&t.push(`Hint: ${e.hint}`),t.push(...te(e.details)),e.supportedOn&&t.push(`Supported on: ${e.supportedOn}`);let n=ee(e.details);return n&&t.push(n),t.join(`
|
|
2
|
-
`)}function Ce(e,t,n){let r=fe({command:e,cwd:process.cwd(),cliFlags:t}),i={};for(let[t,a]of Object.entries(r))Object.hasOwn(n,t)&&ue(t,e)&&(i[t]=a);return de(i,t)}const we={devices:e=>({devices:e.map(ie)}),apps:e=>({apps:e})};function Te(e,t){let n=we[e];return n?n(t):t}function Ee(){let e=new Map;return{pinInput:(t,n,r)=>Be(t,n,je(e,r,n.session)),mergeCommandResult:(t,n,r,i)=>Me(e,t,n,r,i),mergeErrorDetails:(t,n,r)=>{let i=j(n,r);De(e,i,t),Re(e,i,t)}}}function De(e,t,n){let r=n?.refsGeneration;typeof r==`number`&&M(e,t,ne(n),r)}const Oe=new Set([`snapshot`,`find`]),ke=new Set(c.map(e=>e.name).filter(ce).filter(e=>s(e))),Ae=new Set([`press`,`click`,`fill`,`longpress`,`get`]);function je(e,t,n){return e.get(j(t,n))}function j(e,t){let n=typeof t==`string`&&t.length>0?t:`default`;return`${e??``}\u0000${n}`}function Me(e,t,n,r,i){let a=j(r,i);if(ke.has(t)){Fe(e,a,Ie(n));return}Oe.has(t)&&(t===`find`?Pe(e,a,n):Ne(e,a,n))}function Ne(e,t,n){let r=n.refsGeneration;if(typeof r!=`number`){e.delete(t);return}let i=[];for(let{ref:e}of n.refs??[])i.push(e);for(let e of n.nodes??[])i.push(e.ref);M(e,t,i,r)}function Pe(e,t,n){let r=n.refsGeneration;if(typeof r!=`number`)return;let i=[];typeof n.ref==`string`&&n.ref.startsWith(`@`)&&i.push(n.ref.slice(1));for(let e of n.matches??[])typeof e.ref==`string`&&e.ref.length>0&&i.push(e.ref.startsWith(`@`)?e.ref.slice(1):e.ref);M(e,t,i,r)}function Fe(e,t,n){n?.refsGeneration!==void 0&&M(e,t,[...n.diff?.lines??[],...n.refs??[],...n.tail??[]].map(e=>e.ref).filter(e=>typeof e==`string`),n.refsGeneration)}function Ie(e){let t=e.settle;return typeof t==`object`&&t?t:void 0}function M(e,t,n,r){if(n.length===0)return;let i=e.get(t)??new Map;e.set(t,i),Le(i,n,r)}function Le(e,t,n){for(let r of t)e.delete(r),e.set(r,n);for(;e.size>1e3;)e.delete(e.keys().next().value)}function Re(e,t,n){let r=o(o(n?.divergence)?.screen);if(r?.state!==`available`)return;let i=r.refsGeneration;if(typeof i!=`number`)return;let a=[];ze(r.refs,a),M(e,t,a,i)}function ze(e,t){if(Array.isArray(e))for(let n of e){let e=o(n)?.ref;typeof e==`string`&&e.length>0&&t.push(e)}}function Be(e,t,n){return n===void 0||n.size===0?t:e===`wait`?Ve(t,n)??t:Ae.has(e)?He(t,n)??t:t}function Ve(e,t){if(typeof e.ref!=`string`)return;let n=N(e.ref,t);return n===e.ref?void 0:{...e,ref:n}}function He(e,t){let n=o(e.target);if(n?.kind!==`ref`||typeof n.ref!=`string`)return;let r=N(n.ref,t);return r===n.ref?void 0:{...e,target:{...n,ref:r}}}function N(e,t){if(!e.startsWith(`@`)||e.includes(`~`))return e;let n=t.get(e.slice(1));return n===void 0?e:`${e}~s${n}`}function Ue(){return se().map(e=>{let t=e.name in A?A[e.name]:void 0;return{name:e.name,description:ae(e),inputSchema:P(e.name,e.inputSchema),...t?{outputSchema:t}:{}}})}function We(e={}){let n=Ee();return{execute:async(r,i)=>{if(!ce(r))throw new t(`INVALID_ARGS`,`Unknown command tool: ${r}`);let a=P(r,le(r).inputSchema).properties,o=Ce(r,i,a),s=Ye(o),c=$e(o),l=n.pinInput(r,c,s.client.stateDir),u=await qe(e,s.client);try{let t=await(e.runCommand??Je)(u,r,l);return n.mergeCommandResult(r,t,s.client.stateDir,c.session),{isError:!1,structuredContent:Te(r,t),content:[{type:`text`,text:et({name:r,input:c,result:t,outputFormat:s.outputFormat,responseLevel:s.client.responseLevel})}]}}catch(e){return Ge(e,n,s.client.stateDir,c.session)}}}}function Ge(e,t,n,r){let i=xe(e);return t.mergeErrorDetails(i.details,n,r),{isError:!0,structuredContent:i,content:[{type:`text`,text:Se(i)}]}}const Ke=We();async function qe(e,t){if(e.createClient)return await e.createClient(t);let{createAgentDeviceClient:n}=await import(`./agent-device-client.js`).then(e=>e.t);return n(t)}async function Je(e,t,n){return await(await import(`./command-surface.js`).then(e=>e.t)).runCommand(e,t,n)}function Ye(e){return{client:Xe(e),outputFormat:Qe(e.mcpOutputFormat)}}function Xe(e){let n=e.stateDir,r=e.includeCost,i=e.responseLevel,a={};if(n!==void 0){if(typeof n!=`string`||n.length===0)throw new t(`INVALID_ARGS`,`Expected stateDir to be a non-empty string.`);a.stateDir=n}if(r!==void 0){if(typeof r!=`boolean`)throw new t(`INVALID_ARGS`,`Expected includeCost to be a boolean.`);r&&(a.cost=!0)}let o=Ze(i);return o!==void 0&&(a.responseLevel=o),a}function Ze(e){if(e===void 0)return;let r=n.find(t=>t===e);if(r===void 0)throw new t(`INVALID_ARGS`,`Expected responseLevel to be one of 'digest', 'default', or 'full'.`);return r}function Qe(e){if(e===void 0)return`optimized`;if(e!==`optimized`&&e!==`json`)throw new t(`INVALID_ARGS`,`Expected mcpOutputFormat to be "optimized" or "json".`);return e}function $e(e){let{stateDir:t,mcpOutputFormat:n,includeCost:r,responseLevel:i,...a}=e;return a}function P(e,t){let n=a(e);return{...t,properties:{...t.properties,...n&&!t.properties?.noRecord?{noRecord:{type:`boolean`,description:`Do not record this action.`}}:{},stateDir:{type:`string`,description:`Agent-device state directory.`},mcpOutputFormat:{type:`string`,enum:[`optimized`,`json`],description:`MCP text content format. Defaults to optimized agent-friendly text; use json for JSON text. Structured content is always returned separately.`},includeCost:{type:`boolean`,description:`Include per-command agent-cost (cost.wallClockMs, …) in structuredContent. Defaults to off; the default response shape is unchanged.`},responseLevel:{type:`string`,enum:[`digest`,`default`,`full`],description:`Response verbosity: token-cheap digest / default (today) / full. Defaults to default; the default response shape is unchanged.`}}}}function et(e){if(e.outputFormat===`json`||e.responseLevel!==void 0&&e.responseLevel!=="default")return F(e.result);let t=pe({name:e.name,input:e.input,result:e.result});return typeof t?.text==`string`?t.text:F(t?.data??e.result)}function F(e){return typeof e==`string`?e:JSON.stringify(e,null,2)}const I=`2026-07-28`,L=[I],R=[`2025-11-25`,`2025-06-18`],z=[...L,...R],B=`server/discover`,tt=new Set([`initialize`,`ping`]),V=`io.modelcontextprotocol/protocolVersion`,H=`io.modelcontextprotocol/clientCapabilities`,U=`io.modelcontextprotocol/clientInfo`,W=36e5;var G=class extends Error{requested;constructor(e){super(`Unsupported MCP protocol version: ${e}. Supported: ${z.join(`, `)}.`),this.requested=e}get data(){return{supported:z,requested:this.requested}}};function nt(e,n){let r=X(X(n)._meta),i=ut(r,V);if(i===void 0){if(e===B)throw new t(`INVALID_ARGS`,`Expected _meta["${V}"] on ${B}.`);return`legacy`}if(!z.includes(i))throw new G(i);if(!q(r[H]))throw new t(`INVALID_ARGS`,`Expected _meta["${H}"] to be an object.`);let a=r[U];if(a!==void 0&&!st(a))throw new t(`INVALID_ARGS`,`Expected _meta["${U}"] to be a valid Implementation.`);if(!L.includes(i)){if(e===B)throw new G(i);return`legacy`}return`modern`}function rt(e){let t=ut(X(e),`protocolVersion`);return t!==void 0&&R.includes(t)?t:`2025-11-25`}function it(e,t){return t===`modern`&&tt.has(e)}function K(){return{name:`agent-device`,version:i()}}function at(e,t){return t===`legacy`||typeof e!=`object`||!e?e:{resultType:`complete`,...e,_meta:{...e._meta,"io.modelcontextprotocol/serverInfo":K()}}}function ot(e,t){return e===`modern`?{ttlMs:t,cacheScope:`public`}:void 0}function q(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function st(e){return!q(e)||!Y(e.name)||!Y(e.version)?!1:J(e.title,Y)&&J(e.description,Y)&&J(e.websiteUrl,Y)&&J(e.icons,e=>Array.isArray(e)&&e.every(ct))}function ct(e){return!q(e)||!Y(e.src)?!1:J(e.mimeType,Y)&&J(e.sizes,lt)&&J(e.theme,e=>e===`light`||e===`dark`)}function J(e,t){return e===void 0||t(e)}function Y(e){return typeof e==`string`}function lt(e){return Array.isArray(e)&&e.every(Y)}function X(e){return q(e)?e:{}}function ut(e,t){let n=e[t];return typeof n==`string`&&n.length>0?n:void 0}async function dt(e){if(e.jsonrpc!==`2.0`||typeof e.method!=`string`)return Z(e.id??null,-32600,`Invalid JSON-RPC request.`);if(e.id===void 0)return null;try{let t=nt(e.method,e.params),n=await ft(e.method,e.params,t);return ht(e.id,at(n,t))}catch(t){return t instanceof G?Z(e.id,-32022,t.message,t.data):t instanceof Q?Z(e.id,-32601,t.message):Z(e.id,-32602,t instanceof Error?t.message:String(t))}}async function ft(e,t,n){if(it(e,n))throw new Q(`${e} was removed in MCP ${I}.`);switch(e){case`server/discover`:return{supportedVersions:z,capabilities:{tools:{}},instructions:`agent-device drives iOS, Android, tvOS, Android TV, macOS, Linux, and web targets. Each tool mirrors the CLI command of the same name; tool descriptions carry the per-command contract.`,ttlMs:W,cacheScope:`public`};case`initialize`:return{protocolVersion:rt(t),capabilities:{tools:{}},serverInfo:K()};case`ping`:return{};case`tools/list`:return{tools:Ue(),...ot(n,W)};case`tools/call`:return await pt(t);default:throw new Q(`Unsupported MCP method: ${e}`)}}async function pt(e){let t=gt(e),n=vt(t,`name`);try{return await Ke.execute(n,_t(t.arguments))}catch(e){return mt(Se(xe(e)),!0)}}function mt(e,t=!1){return{isError:t,content:[{type:`text`,text:e}]}}function ht(e,t){return{jsonrpc:`2.0`,id:e,result:t}}function Z(e,t,n,r){return{jsonrpc:`2.0`,id:e,error:{code:t,message:n,...r?{data:r}:{}}}}function gt(e){if(!e||typeof e!=`object`||Array.isArray(e))throw new t(`INVALID_ARGS`,`Expected object parameters.`);return e}function _t(e){return e===void 0?{}:gt(e)}function vt(e,n){let r=e[n];if(typeof r!=`string`||r.length===0)throw new t(`INVALID_ARGS`,`Expected ${n} to be a non-empty string.`);return r}var Q=class extends Error{};async function yt(){let e=bt(),t=new Et(t=>{e.push(t)});process.stdin.setEncoding(`utf8`),process.stdin.on(`data`,e=>{try{t.push(e)}catch(e){Ot({jsonrpc:`2.0`,id:null,error:{code:-32700,message:e instanceof Error?e.message:String(e)}})}}),await new Promise(e=>{process.stdin.on(`end`,e),process.stdin.on(`close`,e),process.stdin.resume()}),await e.idle()}function bt(e={}){let t=e.handlePayload??xt,n=e.write??Ot,r=Promise.resolve();return{push:e=>{let i=Tt(e);r=r.then(async()=>{let r=await t(e);r&&n(r)}).catch(e=>{n({jsonrpc:`2.0`,id:i,error:{code:-32603,message:e instanceof Error?e.message:String(e)}})})},idle:async()=>{await r}}}function xt(e){return Array.isArray(e)?St(e):Ct(e)}async function St(e){let t=[];for(let n of e)t.push(...Dt(await Ct(n)));return t.length>0?t:null}async function Ct(e){let t;try{t=r.parse(e)}catch{return wt($(e))}return dt(t)}function wt(e){return{jsonrpc:`2.0`,id:e,error:{code:-32600,message:`Invalid JSON-RPC request.`}}}function Tt(e){return Array.isArray(e)?e.length===1?$(e[0]):null:$(e)}function $(e){if(e&&typeof e==`object`&&!Array.isArray(e)){let t=e.id;if(typeof t==`string`||typeof t==`number`||t===null)return t}return null}var Et=class{buffer=``;sink;constructor(e){this.sink=e}push(e){for(this.buffer+=e;;){let e=this.tryReadLineMessage();if(e!==void 0){this.emit(e);continue}break}}tryReadLineMessage(){let e=this.buffer.indexOf(`
|
|
3
|
-
|
|
1
|
+
import{_ as e,o as t}from"./sdk-contracts.js";import{_ as n}from"./sdk-batch-runner.js";import{i as r}from"./command-catalog.js";import{n as i}from"./version.js";import{a,i as o,r as s,t as ee}from"./command-tools.js";import{n as c}from"./internal/bin.js";import{i as l,n as u,t as d}from"./cli-help.js";const f=`agent-device drives iOS, Android, tvOS, Android TV, macOS, Linux, and web apps. Tools mirror CLI commands of the same name; CLI flags are camelCase properties (--settle -> settle: true).
|
|
2
|
+
|
|
3
|
+
Start: known app -> call open {app, foreground: true} at once; do not probe with devices, apps, appstate, snapshot, or screenshot first. open returns the initial interactive snapshot with @refs. Unknown app id: devices, then apps, then open the discovered id; never invent ids. Existing session: continue from its state, do not reopen.
|
|
4
|
+
|
|
5
|
+
Loop: press/click/fill/longpress/hover/scroll/back with settle: true; the response is the settled UI diff, continue from it. snapshot {interactiveOnly: true} only when the diff lacks the next target or did not settle. Verify with wait {kind: "text", text}, wait {selector}, is, get, or find; a bare screenshot is not verification. End with close.
|
|
6
|
+
|
|
7
|
+
Targets: copy refs byte-for-byte (@e12, @e12~s4; keep @ and any ~sN). Refs go stale after mutations. Prefer refs, then id/label/role selectors; coordinates last. On a sparse/AX-unavailable warning its refs and selectors are invalid: screenshot, read the image, press {x, y}, then snapshot the changed screen.
|
|
8
|
+
|
|
9
|
+
Errors carry hints; follow them instead of re-planning. Call help only for specialized work (gestures, scripting, TV, macOS, web, remote, debugging) or an unclear command shape, never at startup.`;function p(){let e=new Set(n());return r().filter(t=>!e.has(t))}const m={name:`help`,description:`Usage guides. No topic: the full workflow card. topic = one of ${l().join(`, `)} for that guide, or a tool name for its complete flag reference. For specialized work or an unclear command shape only; not a startup step, not needed after an error that carries a hint.`,inputSchema:{type:`object`,properties:{topic:{type:`string`,description:`Guide topic or tool name; omit for the card.`}},additionalProperties:!1}},h=`CLI syntax over MCP: \`agent-device <command> <positionals> --flag\` = tool <command>; positionals are named properties (target, text, direction), flags camelCase (--settle -> settle: true, -i -> interactiveOnly: true). Terminal-only (no MCP tool; run in a shell): ${p().join(`, `)}.\n\n`;function te(e){let t=e.topic;if(t!==void 0&&typeof t!=`string`)return g(`Expected topic to be a string.`,!0);let n=t?d(c(t)):u();return n===null?g(`Unknown help topic: ${t}. ${m.description}`,!0):g(h+n)}function g(e,t=!1){return{isError:t,content:[{type:`text`,text:e}]}}const _=`2026-07-28`,v=[_],y=[`2025-11-25`,`2025-06-18`],b=[...v,...y],x=`server/discover`,S=new Set([`initialize`,`ping`]),C=`io.modelcontextprotocol/protocolVersion`,w=`io.modelcontextprotocol/clientCapabilities`,T=`io.modelcontextprotocol/clientInfo`,E=36e5;var D=class extends Error{requested;constructor(e){super(`Unsupported MCP protocol version: ${e}. Supported: ${b.join(`, `)}.`),this.requested=e}get data(){return{supported:b,requested:this.requested}}};function O(t,n){let r=R(R(n)._meta),i=z(r,C);if(i===void 0){if(t===x)throw new e(`INVALID_ARGS`,`Expected _meta["${C}"] on ${x}.`);return`legacy`}if(!b.includes(i))throw new D(i);if(!M(r[w]))throw new e(`INVALID_ARGS`,`Expected _meta["${w}"] to be an object.`);let a=r[T];if(a!==void 0&&!N(a))throw new e(`INVALID_ARGS`,`Expected _meta["${T}"] to be a valid Implementation.`);if(!v.includes(i)){if(t===x)throw new D(i);return`legacy`}return`modern`}function ne(e){let t=z(R(e),`protocolVersion`);return t!==void 0&&y.includes(t)?t:`2025-11-25`}function re(e,t){return t===`modern`&&S.has(e)}function k(){return{name:`agent-device`,version:i()}}function A(e,t){return t===`legacy`||typeof e!=`object`||!e?e:{resultType:`complete`,...e,_meta:{...e._meta,"io.modelcontextprotocol/serverInfo":k()}}}function j(e,t){return e===`modern`?{ttlMs:t,cacheScope:`public`}:void 0}function M(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function N(e){return!M(e)||!I(e.name)||!I(e.version)?!1:F(e.title,I)&&F(e.description,I)&&F(e.websiteUrl,I)&&F(e.icons,e=>Array.isArray(e)&&e.every(P))}function P(e){return!M(e)||!I(e.src)?!1:F(e.mimeType,I)&&F(e.sizes,L)&&F(e.theme,e=>e===`light`||e===`dark`)}function F(e,t){return e===void 0||t(e)}function I(e){return typeof e==`string`}function L(e){return Array.isArray(e)&&e.every(I)}function R(e){return M(e)?e:{}}function z(e,t){let n=e[t];return typeof n==`string`&&n.length>0?n:void 0}async function B(e){if(e.jsonrpc!==`2.0`||typeof e.method!=`string`)return G(e.id??null,-32600,`Invalid JSON-RPC request.`);if(e.id===void 0)return null;try{let t=O(e.method,e.params),n=await V(e.method,e.params,t);return W(e.id,A(n,t))}catch(t){return t instanceof D?G(e.id,-32022,t.message,t.data):t instanceof Y?G(e.id,-32601,t.message):G(e.id,-32602,t instanceof Error?t.message:String(t))}}async function V(e,t,n){if(re(e,n))throw new Y(`${e} was removed in MCP ${_}.`);switch(e){case`server/discover`:return{supportedVersions:b,capabilities:{tools:{}},instructions:f,ttlMs:E,cacheScope:`public`};case`initialize`:return{protocolVersion:ne(t),capabilities:{tools:{}},serverInfo:k(),instructions:f};case`ping`:return{};case`tools/list`:return{tools:[...s(),m],...j(n,E)};case`tools/call`:return await H(t);default:throw new Y(`Unsupported MCP method: ${e}`)}}async function H(e){let t=K(e),n=J(t,`name`);try{return n===`help`?te(q(t.arguments)):await ee.execute(n,q(t.arguments))}catch(e){return U(o(a(e)),!0)}}function U(e,t=!1){return{isError:t,content:[{type:`text`,text:e}]}}function W(e,t){return{jsonrpc:`2.0`,id:e,result:t}}function G(e,t,n,r){return{jsonrpc:`2.0`,id:e,error:{code:t,message:n,...r?{data:r}:{}}}}function K(t){if(!t||typeof t!=`object`||Array.isArray(t))throw new e(`INVALID_ARGS`,`Expected object parameters.`);return t}function q(e){return e===void 0?{}:K(e)}function J(t,n){let r=t[n];if(typeof r!=`string`||r.length===0)throw new e(`INVALID_ARGS`,`Expected ${n} to be a non-empty string.`);return r}var Y=class extends Error{};async function ie(){let e=ae(),t=new le(t=>{e.push(t)});process.stdin.setEncoding(`utf8`),process.stdin.on(`data`,e=>{try{t.push(e)}catch(e){$({jsonrpc:`2.0`,id:null,error:{code:-32700,message:e instanceof Error?e.message:String(e)}})}}),await new Promise(e=>{process.stdin.on(`end`,e),process.stdin.on(`close`,e),process.stdin.resume()}),await e.idle()}function ae(e={}){let t=e.handlePayload??oe,n=e.write??$,r=Promise.resolve();return{push:e=>{let i=ce(e);r=r.then(async()=>{let r=await t(e);r&&n(r)}).catch(e=>{n({jsonrpc:`2.0`,id:i,error:{code:-32603,message:e instanceof Error?e.message:String(e)}})})},idle:async()=>{await r}}}function oe(e){return Array.isArray(e)?X(e):Z(e)}async function X(e){let t=[];for(let n of e)t.push(...ue(await Z(n)));return t.length>0?t:null}async function Z(e){let n;try{n=t.parse(e)}catch{return se(Q(e))}return B(n)}function se(e){return{jsonrpc:`2.0`,id:e,error:{code:-32600,message:`Invalid JSON-RPC request.`}}}function ce(e){return Array.isArray(e)?e.length===1?Q(e[0]):null:Q(e)}function Q(e){if(e&&typeof e==`object`&&!Array.isArray(e)){let t=e.id;if(typeof t==`string`||typeof t==`number`||t===null)return t}return null}var le=class{buffer=``;sink;constructor(e){this.sink=e}push(e){for(this.buffer+=e;;){let e=this.tryReadLineMessage();if(e!==void 0){this.emit(e);continue}break}}tryReadLineMessage(){let e=this.buffer.indexOf(`
|
|
10
|
+
`);if(e===-1)return;let t=this.buffer.slice(0,e).trim();return this.buffer=this.buffer.slice(e+1),t.length>0?t:void 0}emit(e){this.sink(JSON.parse(e))}};function ue(e){return e?[e]:[]}function $(e){process.stdout.write(`${JSON.stringify(e)}\n`)}export{ie as runAgentDeviceMcpServer};
|