agent-device 0.19.1 → 0.19.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.19.3.apk +0 -0
- package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.19.3.apk.sha256 +1 -0
- package/android-multitouch-helper/dist/{agent-device-android-multitouch-helper-0.19.1.manifest.json → agent-device-android-multitouch-helper-0.19.3.manifest.json} +4 -4
- package/android-snapshot-helper/dist/{agent-device-android-snapshot-helper-0.19.1.apk → agent-device-android-snapshot-helper-0.19.3.apk} +0 -0
- package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.19.3.apk.sha256 +1 -0
- package/android-snapshot-helper/dist/{agent-device-android-snapshot-helper-0.19.1.manifest.json → agent-device-android-snapshot-helper-0.19.3.manifest.json} +6 -6
- package/dist/apple-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.h +7 -0
- package/dist/apple-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.m +99 -30
- package/dist/apple-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +9 -1
- package/dist/apple-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +21 -8
- package/dist/apple-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +10 -0
- package/dist/apple-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SequenceExecution.swift +1 -0
- package/dist/src/agent-browser-tool.js +1 -1
- package/dist/src/android-adb.js +1 -1
- package/dist/src/android-input-ownership.js +1 -1
- package/dist/src/android.js +1 -1
- package/dist/src/app-lifecycle.js +1 -1
- package/dist/src/apple-runner-options.js +1 -1
- package/dist/src/apps.js +5 -5
- package/dist/src/audio-probe.js +1 -1
- package/dist/src/cli-help.js +34 -19
- package/dist/src/cli-runner.js +1 -1
- package/dist/src/cli.js +11 -11
- package/dist/src/client.js +2 -2
- package/dist/src/contracts.js +1 -1
- package/dist/src/debug-symbols.js +1 -1
- package/dist/src/device-input-state.js +1 -1
- package/dist/src/devices2.js +1 -1
- package/dist/src/find.js +1 -1
- package/dist/src/generic.js +1 -1
- package/dist/src/helper.js +1 -1
- package/dist/src/index.d.ts +29 -0
- package/dist/src/index.js +1 -1
- package/dist/src/input-actions.js +1 -1
- package/dist/src/input-actions2.js +1 -1
- package/dist/src/install-source2.js +1 -1
- package/dist/src/interaction-snapshot.js +1 -1
- package/dist/src/interaction.js +1 -1
- package/dist/src/interactor.js +2 -2
- package/dist/src/internal/bin.js +1 -1
- package/dist/src/internal/daemon.js +20 -16
- package/dist/src/internal/png-worker.js +1 -1
- package/dist/src/lease.js +1 -1
- package/dist/src/linux.js +1 -1
- package/dist/src/notifications.js +1 -1
- package/dist/src/png-worker-contract.js +1 -1
- package/dist/src/points.js +3 -3
- package/dist/src/providers.js +1 -1
- package/dist/src/react-native.js +1 -1
- package/dist/src/record-trace-recording.js +2 -2
- package/dist/src/record-trace.js +1 -1
- package/dist/src/registry.js +24 -24
- package/dist/src/reporting.js +3 -3
- package/dist/src/runner-client.js +1 -1
- package/dist/src/runner-sequence.js +1 -1
- package/dist/src/runtime-transport.js +1 -1
- package/dist/src/runtime.js +2 -2
- package/dist/src/sdk-android-adb.js +3 -3
- package/dist/src/sdk-app-inventory.js +1 -1
- package/dist/src/sdk-batch-runner.js +2 -2
- package/dist/src/sdk-batch.js +2 -2
- package/dist/src/sdk-contracts.js +2 -2
- package/dist/src/sdk-device.js +1 -0
- 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.js +1 -1
- package/dist/src/selector-runtime.js +1 -1
- package/dist/src/selectors.js +1 -1
- package/dist/src/server.js +2 -2
- package/dist/src/session.js +10 -10
- package/dist/src/setting-state.js +1 -1
- package/dist/src/simctl.js +1 -1
- package/dist/src/simulator.js +1 -1
- package/dist/src/snapshot-diagnostics.js +1 -1
- package/dist/src/snapshot.js +1 -1
- package/dist/src/snapshot2.js +2 -2
- package/dist/src/tool-provider.js +2 -2
- package/dist/src/tool-provider2.js +1 -1
- package/dist/src/tv-remote.js +9 -9
- package/dist/src/version.js +1 -1
- package/dist/src/web.js +1 -1
- package/package.json +11 -3
- package/server.json +2 -2
- package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.19.1.apk +0 -0
- package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.19.1.apk.sha256 +0 -1
- package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.19.1.apk.sha256 +0 -1
- package/dist/src/snapshot-helper.js +0 -5
package/dist/src/sdk-batch.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
2
|
-
`],[`r`,`\r`],[`t`,` `]]);function o(t){let n=t.trim();if(!n)throw new e(`INVALID_ARGS`,`Selector expression cannot be empty`);let r=te(n);if(r.length===0)throw new e(`INVALID_ARGS`,`Selector expression cannot be empty`);return{raw:n,selectors:r.map(e=>u(e))}}function s(e){try{return o(e)}catch{return null}}function c(e){let t=e.trim();if(!t)return!1;if(t===`||`)return!0;let n=t.indexOf(`=`);if(n!==-1){let e=t.slice(0,n).trim().toLowerCase();return i.has(e)}return i.has(t.toLowerCase())}function l(e,t={}){if(e.length===0)return null;let n=t.preferTrailingValue??!1,r=0,i=[];for(;r<e.length;){let t=e[r];if(t===void 0||!c(t))break;r+=1;let n=e.slice(0,r).join(` `).trim();n&&s(n)&&i.push(r)}if(i.length===0)return null;let a=i.at(-1);if(a===void 0)return null;let o=a;if(n)for(let t=i.length-1;t>=0;--t){let n=i[t];if(n!==void 0&&n<e.length){o=n;break}}let l=e.slice(0,o).join(` `).trim();return l?{selectorExpression:l,rest:e.slice(o)}:null}function u(t){let n=t.trim();if(!n)throw new e(`INVALID_ARGS`,`Selector segment cannot be empty`);let r=ne(n);if(r.length===0)throw new e(`INVALID_ARGS`,`Invalid selector segment: ${t}`);return{raw:n,terms:r.map(ee)}}function ee(t){let n=t.trim();if(!n)throw new e(`INVALID_ARGS`,`Empty selector term`);let a=n.indexOf(`=`);if(a===-1){let i=n.toLowerCase();if(!r.has(i))throw new e(`INVALID_ARGS`,`Invalid selector term "${t}", expected key=value`);return{key:i,value:!0}}let o=n.slice(0,a).trim().toLowerCase(),s=n.slice(a+1).trim();if(!i.has(o))throw new e(`INVALID_ARGS`,`Unknown selector key: ${o}`);if(!s)throw new e(`INVALID_ARGS`,`Missing selector value for key: ${o}`);if(r.has(o)){let t=re(s);if(t===null)throw new e(`INVALID_ARGS`,`Invalid boolean value for ${o}: ${s}`);return{key:o,value:t}}return{key:o,value:f(s)}}function te(t){let n=[],r=``,i=null;for(let a=0;a<t.length;a+=1){let o=t[a];if((o===`"`||o===`'`)&&!h(t,a)){i=d(i,o),r+=o;continue}if(!i&&o===`|`&&t[a+1]===`|`){let i=r.trim();if(!i)throw new e(`INVALID_ARGS`,`Invalid selector fallback expression: ${t}`);n.push(i),r=``,a+=1;continue}r+=o}let a=r.trim();if(!a)throw new e(`INVALID_ARGS`,`Invalid selector fallback expression: ${t}`);return n.push(a),n}function ne(t){let n=[],r=``,i=null;for(let e=0;e<t.length;e+=1){let a=t.charAt(e);if((a===`"`||a===`'`)&&!h(t,e)){i=d(i,a),r+=a;continue}if(!i&&/\s/.test(a)){r.trim()&&n.push(r.trim()),r=``;continue}r+=a}if(i)throw new e(`INVALID_ARGS`,`Unclosed quote in selector: ${t}`);return r.trim()&&n.push(r.trim()),n}function d(e,t){return e?e===t?null:e:t}function f(e){let t=e.trim();return t.startsWith(`"`)&&t.endsWith(`"`)||t.startsWith(`'`)&&t.endsWith(`'`)?p(t.slice(1,-1)):t}function p(e){let t=``,n=0;for(;n<e.length;){let r=e.charAt(n);if(r!==`\\`){t+=r,n+=1;continue}let i=e.charAt(n+1);if(!i){t+=r,n+=1;continue}let a=m(i);if(a!==null){t+=a,n+=2;continue}if(i===`u`){let r=e.slice(n+2,n+6);if(/^[0-9a-fA-F]{4}$/.test(r)){t+=String.fromCharCode(Number.parseInt(r,16)),n+=6;continue}}t+=r,n+=1}return t}function m(e){return a.get(e)??null}function re(e){let t=f(e).toLowerCase();return t===`true`?!0:t===`false`?!1:null}function h(e,t){let n=0;for(let r=t-1;r>=0&&e[r]===`\\`;--r)n+=1;return n%2==1}function g(e){let n=e[0];if(n===void 0)return null;let r=t(n);if(r!==null)return{kind:`sleep`,durationMs:r};let i=t(e[e.length-1]);if(n===`text`)return{kind:`text`,text:(i===null?e.slice(1).join(` `):e.slice(1,-1).join(` `)).trim(),timeoutMs:i};if(n===`stable`){let n=e.slice(1),r=n.length>1?t(n[1]):null;return{kind:`stable`,quietMs:n.length>0?t(n[0]):null,timeoutMs:r}}if(n.startsWith(`@`))return{kind:`ref`,rawRef:n,timeoutMs:i};let a=l(i===null?e.slice():e.slice(0,-1));return a&&a.rest.length===0&&s(a.selectorExpression)?{kind:`selector`,selectorExpression:a.selectorExpression,timeoutMs:i}:{kind:`text`,text:(i===null?e.join(` `):e.slice(0,-1).join(` `)).trim(),timeoutMs:i}}function _(e){let t=g(e);return t?t.kind===`sleep`?t.durationMs:t.timeoutMs:null}const v=24e4,y={budget:{source:`none`},envelopeMs:9e4,onTimeout:`reset-daemon`},ie={click:`settle-and-verify`,press:`settle-and-verify`,fill:`settle-and-verify`,longpress:`settle`};function b(e){if(e!==void 0)return ie[e]}const x={leaseAdmissionExempt:!0,sessionExecutionLockExempt:!0},S={leaseAdmissionExempt:!0,sessionExecutionLockExempt:!0,selectorValidationExempt:!0},C=()=>!0,w=e=>(e.positionals?.[0]??``).toLowerCase()===`start`,T=e=>e.command===`test`&&(typeof e.flags?.shardAll==`number`||typeof e.flags?.shardSplit==`number`),E={simulator:!0,device:!0},D={emulator:!0,device:!0,unknown:!0},O={device:!0},k={},A={apple:E,android:D,linux:O},j=A,M={apple:E,android:D,linux:k},N={apple:E,android:D,linux:k},P={...y,onTimeout:`preserve-daemon`},F={...y,envelopeMs:18e4},ae={...y,budget:{source:`flag`,envelope:`widen`,defaultBudgetMs:1e4},onTimeout:`preserve-daemon`},I={fields:{count:{defaultValue:1,omitDefault:!0},intervalMs:{defaultValue:0,omitDefault:!0},holdMs:{defaultValue:0,omitDefault:!0},jitterPx:{defaultValue:0,omitDefault:!0},doubleTap:{defaultValue:!1,omitDefault:!0}}},oe={fields:{delayMs:{defaultValue:0}}};function L(e){return b(e)===void 0?P:ae}function R(e){let t=b(e);if(t===void 0)throw Error(`Missing post-action observation descriptor support for ${e}`);return t}const z=[{name:`lease_allocate`,catalog:{group:`internal`,key:`leaseAllocate`},daemon:{route:`lease`,...x},timeoutPolicy:y,batchable:!1},{name:`lease_heartbeat`,catalog:{group:`internal`,key:`leaseHeartbeat`},daemon:{route:`lease`,...x},timeoutPolicy:y,batchable:!1},{name:`lease_release`,catalog:{group:`internal`,key:`leaseRelease`},daemon:{route:`lease`,...x},timeoutPolicy:y,batchable:!1},{name:`artifacts`,catalog:{group:`public`},daemon:{route:`lease`,...x},timeoutPolicy:y,batchable:!1},{name:`session_list`,catalog:{group:`internal`,key:`sessionList`},daemon:{route:`session`,sessionKind:`inventory`,...S},timeoutPolicy:y,batchable:!1},{name:`devices`,catalog:{group:`public`},daemon:{route:`session`,sessionKind:`inventory`,lockPolicySelectorOverride:!0,...S},timeoutPolicy:y,batchable:!0},{name:`capabilities`,catalog:{group:`public`},daemon:{route:`session`,sessionKind:`inventory`,lockPolicySelectorOverride:!0,preferExplicitDeviceOverExistingSession:!0,...S},timeoutPolicy:y,batchable:!0},{name:`doctor`,catalog:{group:`public`},daemon:{route:`session`,sessionKind:`inventory`,lockPolicySelectorOverride:!0,allowSessionlessDefaultDevice:C,...S},timeoutPolicy:y,batchable:!0},{name:`apps`,catalog:{group:`public`},daemon:{route:`session`,sessionKind:`inventory`,lockPolicySelectorOverride:!0,preferExplicitDeviceOverExistingSession:!0},capability:M,timeoutPolicy:y,batchable:!0},{name:`boot`,catalog:{group:`public`},daemon:{route:`session`,sessionKind:`state`},capability:{apple:E,android:D,linux:k},timeoutPolicy:y,batchable:!0},{name:`shutdown`,catalog:{group:`public`},daemon:{route:`session`,sessionKind:`state`},capability:{apple:{simulator:!0},android:{emulator:!0},linux:k},timeoutPolicy:y,batchable:!0},{name:`appstate`,catalog:{group:`public`,key:`appState`},daemon:{route:`session`,sessionKind:`state`},timeoutPolicy:y,batchable:!0},{name:`perf`,catalog:{group:`public`},daemon:{route:`session`,sessionKind:`observability`},capability:{apple:E,android:D,linux:k},timeoutPolicy:y,batchable:!0},{name:`logs`,catalog:{group:`public`},daemon:{route:`session`,sessionKind:`observability`},capability:{apple:E,android:D,linux:k},timeoutPolicy:y,batchable:!0},{name:`events`,catalog:{group:`public`},daemon:{route:`session`,sessionKind:`observability`,allowInvalidRecording:!0,...S},timeoutPolicy:y,batchable:!1},{name:`network`,catalog:{group:`public`},daemon:{route:`session`,sessionKind:`observability`},capability:{apple:E,android:D,linux:k},timeoutPolicy:y,batchable:!0},{name:`audio`,catalog:{group:`public`},daemon:{route:`session`,sessionKind:`observability`},capability:{apple:E,android:{emulator:!0},linux:k},timeoutPolicy:y,batchable:!0},{name:`replay`,catalog:{group:`public`},daemon:{route:`session`,sessionKind:`replay`,skipSessionlessProviderDevice:T},timeoutPolicy:{...y,budget:{source:`flag`}},batchable:!1},{name:`test`,catalog:{group:`public`},daemon:{route:`session`,sessionKind:`replay`,skipSessionlessProviderDevice:T},timeoutPolicy:{...y,envelopeMs:`unbounded`},batchable:!0},{name:`runtime`,catalog:{group:`internal`},daemon:{route:`session`},timeoutPolicy:y,batchable:!1},{name:`clipboard`,catalog:{group:`public`},daemon:{route:`session`,replayScopedAction:!0},dispatch:{},capability:{apple:E,android:D,linux:O},timeoutPolicy:y,batchable:!0},{name:`keyboard`,catalog:{group:`public`},daemon:{route:`session`,replayScopedAction:!0,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:E,android:D,linux:k},timeoutPolicy:y,batchable:!0},{name:`install`,catalog:{group:`public`},daemon:{route:`session`},capability:N,timeoutPolicy:F,batchable:!0},{name:`reinstall`,catalog:{group:`public`},daemon:{route:`session`},capability:N,timeoutPolicy:F,batchable:!0},{name:`install_source`,catalog:{group:`internal`,key:`installSource`},daemon:{route:`session`},timeoutPolicy:F,batchable:!1},{name:`release_materialized_paths`,catalog:{group:`internal`,key:`releaseMaterializedPaths`},daemon:{route:`session`,...S},timeoutPolicy:y,batchable:!1},{name:`push`,catalog:{group:`public`},daemon:{route:`session`},dispatch:{},capability:{apple:{simulator:!0},android:D,linux:k},timeoutPolicy:y,batchable:!0},{name:`trigger-app-event`,catalog:{group:`public`,key:`triggerAppEvent`},daemon:{route:`session`},dispatch:{},capability:{apple:E,android:D,linux:k},timeoutPolicy:y,batchable:!0},{name:`open`,catalog:{group:`public`},daemon:{route:`session`,allowSessionlessDefaultDevice:C},dispatch:{},capability:j,timeoutPolicy:y,batchable:!0},{name:`prepare`,catalog:{group:`public`},daemon:{route:`session`},timeoutPolicy:{budget:{source:`flag`},envelopeMs:v,onTimeout:`reset-daemon`},batchable:!1,mcpExposed:!1},{name:`batch`,catalog:{group:`public`},daemon:{route:`session`},timeoutPolicy:y,batchable:!1},{name:`close`,catalog:{group:`public`},daemon:{route:`session`,allowInvalidRecording:!0},dispatch:{},capability:j,timeoutPolicy:y,batchable:!0},{name:`snapshot`,catalog:{group:`public`},daemon:{route:`snapshot`,replayScopedAction:!0},dispatch:{},capability:A,timeoutPolicy:{...P,budget:{source:`flag`}},batchable:!0},{name:`diff`,catalog:{group:`public`},daemon:{route:`snapshot`,replayScopedAction:!0},capability:A,timeoutPolicy:y,batchable:!0},{name:`wait`,catalog:{group:`public`},daemon:{route:`snapshot`,replayScopedAction:!0},capability:A,timeoutPolicy:{...P,budget:{source:`positional-parser`,parser:_}},batchable:!0},{name:`alert`,catalog:{group:`public`},daemon:{route:`snapshot`,replayScopedAction:!0},capability:{apple:E,android:D,linux:k},timeoutPolicy:y,batchable:!0},{name:`settings`,catalog:{group:`public`},daemon:{route:`snapshot`,replayScopedAction:!0},dispatch:{},capability:{apple:E,android:D,linux:k},timeoutPolicy:y,batchable:!0},{name:`react-native`,catalog:{group:`public`,key:`reactNative`},daemon:{route:`reactNative`,replayScopedAction:!0},capability:{apple:E,android:D,linux:k},timeoutPolicy:y,batchable:!0},{name:`record`,catalog:{group:`public`},daemon:{route:`recordTrace`,replayScopedAction:!0,allowInvalidRecording:!0,allowSessionlessDefaultDevice:w},capability:{apple:E,android:D,linux:k},timeoutPolicy:y,batchable:!0},{name:`trace`,catalog:{group:`public`},daemon:{route:`recordTrace`},timeoutPolicy:y,batchable:!0},{name:`find`,catalog:{group:`public`},daemon:{route:`find`,replayScopedAction:!0},capability:A,timeoutPolicy:P,batchable:!0},{name:`click`,catalog:{group:`public`},daemon:{route:`interaction`,replayScopedAction:!0,androidBlockingDialogGuard:!0},capability:{apple:E,android:D,linux:O},timeoutPolicy:L(`click`),postActionObservation:R(`click`),responseDataTransform:I,batchable:!0},{name:`fill`,catalog:{group:`public`},daemon:{route:`interaction`,replayScopedAction:!0,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:E,android:D,linux:O},timeoutPolicy:L(`fill`),postActionObservation:R(`fill`),responseDataTransform:oe,batchable:!0},{name:`longpress`,catalog:{group:`public`,key:`longPress`},daemon:{route:`interaction`,replayScopedAction:!0,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:E,android:D,linux:O},timeoutPolicy:L(`longpress`),postActionObservation:R(`longpress`),batchable:!0},{name:`press`,catalog:{group:`public`},daemon:{route:`interaction`,replayScopedAction:!0,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:E,android:D,linux:O},timeoutPolicy:L(`press`),postActionObservation:R(`press`),responseDataTransform:I,batchable:!0},{name:`type`,catalog:{group:`public`},daemon:{route:`interaction`,replayScopedAction:!0,androidBlockingDialogGuard:!0},dispatch:{},capability:A,timeoutPolicy:L(`type`),batchable:!0},{name:`get`,catalog:{group:`public`},daemon:{route:`interaction`,replayScopedAction:!0},capability:A,timeoutPolicy:L(`get`),batchable:!0},{name:`read`,catalog:{group:`dispatch-alias`},dispatch:{},timeoutPolicy:y,batchable:!1},{name:`is`,catalog:{group:`public`},daemon:{route:`interaction`,replayScopedAction:!0},capability:A,timeoutPolicy:L(`is`),batchable:!0},{name:`back`,catalog:{group:`public`},daemon:{route:`generic`,replayScopedAction:!0,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:E,android:D,linux:O},timeoutPolicy:y,batchable:!0},{name:`gesture`,catalog:{group:`public`},daemon:{route:`generic`,replayScopedAction:!0,androidBlockingDialogGuard:!0},timeoutPolicy:y,batchable:!0},{name:`home`,catalog:{group:`public`},daemon:{route:`generic`,replayScopedAction:!0,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:E,android:D,linux:O},timeoutPolicy:y,batchable:!0},{name:`tv-remote`,catalog:{group:`public`,key:`tvRemote`},daemon:{route:`generic`,replayScopedAction:!0,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:E,android:D,linux:k},timeoutPolicy:y,batchable:!0},{name:`rotate`,catalog:{group:`public`},daemon:{route:`generic`,replayScopedAction:!0,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:E,android:D,linux:k},timeoutPolicy:y,batchable:!0},{name:`scroll`,catalog:{group:`public`},daemon:{route:`generic`,replayScopedAction:!0,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:E,android:D,linux:O},timeoutPolicy:y,batchable:!0},{name:`swipe`,catalog:{group:`public`},daemon:{route:`generic`,replayScopedAction:!0,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:E,android:D,linux:O},timeoutPolicy:y,batchable:!0},{name:`swipe-preset`,catalog:{group:`dispatch-alias`},dispatch:{},timeoutPolicy:y,batchable:!1},{name:`pinch`,catalog:{group:`dispatch-alias`},daemon:{route:`generic`,replayScopedAction:!0,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:E,android:D,linux:k},timeoutPolicy:y,batchable:!1},{name:`focus`,catalog:{group:`public`},daemon:{route:`generic`,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:E,android:D,linux:O},timeoutPolicy:y,batchable:!0},{name:`screenshot`,catalog:{group:`public`},daemon:{route:`generic`,replayScopedAction:!0},dispatch:{},capability:A,timeoutPolicy:y,batchable:!0},{name:`viewport`,catalog:{group:`public`},daemon:{route:`generic`,replayScopedAction:!0},dispatch:{},capability:{apple:E,android:D,linux:k},timeoutPolicy:y,batchable:!1},{name:`pan`,catalog:{group:`dispatch-alias`},daemon:{route:`generic`,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:E,android:D,linux:O},timeoutPolicy:y,batchable:!1},{name:`fling`,catalog:{group:`dispatch-alias`},daemon:{route:`generic`,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:E,android:D,linux:k},timeoutPolicy:y,batchable:!1},{name:`rotate-gesture`,catalog:{group:`dispatch-alias`},daemon:{route:`generic`,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:E,android:D,linux:k},timeoutPolicy:y,batchable:!1},{name:`transform-gesture`,catalog:{group:`dispatch-alias`},daemon:{route:`generic`,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:E,android:D,linux:k},timeoutPolicy:y,batchable:!1},{name:`app-switcher`,catalog:{group:`public`,key:`appSwitcher`},dispatch:{},capability:{apple:E,android:D,linux:k},timeoutPolicy:y,batchable:!0},{name:`install-from-source`,catalog:{group:`public`,key:`installFromSource`},capability:N,timeoutPolicy:y,batchable:!0},{name:`debug`,catalog:{group:`local-cli`},timeoutPolicy:y,batchable:!1},{name:`metro`,catalog:{group:`local-cli`},timeoutPolicy:y,batchable:!1},{name:`session`,catalog:{group:`local-cli`},timeoutPolicy:y,batchable:!1},{name:`cdp`,catalog:{group:`local-cli`},timeoutPolicy:y,batchable:!1,mcpExposed:!1},{name:`auth`,catalog:{group:`local-cli`},timeoutPolicy:y,batchable:!1,mcpExposed:!1},{name:`connect`,catalog:{group:`local-cli`},timeoutPolicy:y,batchable:!1,mcpExposed:!1},{name:`connection`,catalog:{group:`local-cli`},timeoutPolicy:y,batchable:!1,mcpExposed:!1},{name:`disconnect`,catalog:{group:`local-cli`},timeoutPolicy:y,batchable:!1,mcpExposed:!1},{name:`mcp`,catalog:{group:`local-cli`},timeoutPolicy:y,batchable:!1,mcpExposed:!1},{name:`proxy`,catalog:{group:`local-cli`},timeoutPolicy:y,batchable:!1,mcpExposed:!1},{name:`react-devtools`,catalog:{group:`local-cli`,key:`reactDevtools`},timeoutPolicy:y,batchable:!1,mcpExposed:!1},{name:`web`,catalog:{group:`local-cli`},timeoutPolicy:y,batchable:!1,mcpExposed:!1}],B=new Set([`public`,`local-cli`]),V=new Set(z.filter(e=>B.has(J(e))).map(e=>e.name)),H=z.map(e=>({...e,mcpExposed:q(e)}));function U(e){return H.filter(t=>J(t)===e).map(e=>[ce(e),e.name])}function W(){return H.filter(e=>se(e)).map(e=>e.name).sort()}const G=new Map(H.map(e=>[e.name,e]));function K(e){return V.has(e)}function q(e){return e.mcpExposed??V.has(e.name)}function se(e){return e.mcpExposed&&K(e.name)}function J(e){return e.catalog.group}function ce(e){return e.catalog.key??e.name}const le=new Map(H.map(e=>[e.name,e.timeoutPolicy])),Y=new Map(Array.from(G.values()).flatMap(e=>e.responseDataTransform?[[e.name,e.responseDataTransform]]:[]));function X(e){if(e!==void 0)return G.get(e)?.postActionObservation}function ue(e){return X(e)!==void 0}function de(e){return X(e)===`settle-and-verify`}function fe(e){return e===void 0?y:le.get(e)??y}function pe(e){if(e!==void 0)return Y.get(e)}function me(){return[...new Set(Array.from(Y.values()).flatMap(e=>Object.keys(e.fields)))].sort()}function Z(e){let t=[];for(let n of e)n.daemon&&t.push({command:n.name,...n.daemon});return t}function he(e){let t={};for(let n of e)n.capability&&(t[n.name]=n.capability);return t}function ge(e){return e.filter(e=>e.batchable).map(e=>e.name)}const Q=ge(H),_e=new Set([`batch`,`replay`]),ve=[`command`,`positionals`,`flags`,`runtime`],ye=[`platform`,`target`,`device`,`udid`,`serial`,`verbose`,`out`],be=new Set(Q);function xe(e){return be.has(e)}function $(e){return typeof e==`string`?e.trim().toLowerCase():``}function Se(t,n){let r=$(t);if(xe(r))return r;throw new e(`INVALID_ARGS`,`Batch step ${n} command is not available through command batch: ${String(t)}`)}function Ce(t,n){if(_e.has(t))throw new e(`INVALID_ARGS`,`Batch step ${n} cannot run ${t}.`)}export{t as C,s as S,v as _,$ as a,o as b,Z as c,de as d,me as f,fe as g,pe as h,Ce as i,H as l,W as m,ye as n,Se as o,U as p,Q as r,he as s,ve as t,ue as u,g as v,l as x,c as y};
|
|
1
|
+
import{_ as e}from"./sdk-contracts.js";function t(e){if(!e)return null;let t=Number(e);return Number.isFinite(t)?t:null}const n=new Set([`id`,`role`,`text`,`label`,`value`,`appname`,`windowtitle`]),r=new Set([`visible`,`hidden`,`editable`,`selected`,`focused`,`enabled`,`hittable`]),i=new Set([...n,...r]),a=[...i],o=new Set(`button.imagebutton.link.cell.statictext.checkedtextview.textfield.textbox.edittext.textarea.switch.slider.image.imageview.webview.framelayout.linearlayout.relativelayout.constraintlayout.viewgroup.view.listview.recyclerview.collectionview.list.searchfield.segmentedcontrol.group.window.checkbox.radio.menuitem.toolbar.scrollarea.scrollview.nestedscrollview.table.application.navigationbar.tabbar.tab.alert.dialog.header`.split(`.`));function s(e){return o.has(e.trim().toLowerCase())}const ee=new Map([[`"`,`"`],[`'`,`'`],[`\\`,`\\`],[`/`,`/`],[`b`,`\b`],[`f`,`\f`],[`n`,`
|
|
2
|
+
`],[`r`,`\r`],[`t`,` `]]);function c(t){let n=t.trim();if(!n)throw new e(`INVALID_ARGS`,`Selector expression cannot be empty`);let r=h(n);if(r.length===0)throw new e(`INVALID_ARGS`,`Selector expression cannot be empty`);return{raw:n,selectors:r.map(e=>p(e))}}function l(e){try{return c(e)}catch{return null}}function u(e){let t=e.trim();if(!t)return!1;if(t===`||`)return!0;let n=t.indexOf(`=`);if(n!==-1){let e=t.slice(0,n).trim().toLowerCase();return i.has(e)}return i.has(t.toLowerCase())}function d(e){let t=e.trim(),n=t.indexOf(`=`);if(n===-1)return null;let r=t.slice(0,n).trim().toLowerCase();if(!r||i.has(r))return null;let a=t.slice(n+1).trim();if(!a)return null;let o=_(a).trim();return o?{key:r,value:o}:null}function f(e,t={}){if(e.length===0)return null;let n=t.preferTrailingValue??!1,r=0,i=[];for(;r<e.length;){let t=e[r];if(t===void 0||!u(t))break;r+=1;let n=e.slice(0,r).join(` `).trim();n&&l(n)&&i.push(r)}if(i.length===0)return null;let a=i.at(-1);if(a===void 0)return null;let o=a;if(n)for(let t=i.length-1;t>=0;--t){let n=i[t];if(n!==void 0&&n<e.length){o=n;break}}let s=e.slice(0,o).join(` `).trim();return s?{selectorExpression:s,rest:e.slice(o)}:null}function p(t){let n=t.trim();if(!n)throw new e(`INVALID_ARGS`,`Selector segment cannot be empty`);let r=te(n);if(r.length===0)throw new e(`INVALID_ARGS`,`Invalid selector segment: ${t}`);return{raw:n,terms:r.map(m)}}function m(t){let n=t.trim();if(!n)throw new e(`INVALID_ARGS`,`Empty selector term`);let a=n.indexOf(`=`);if(a===-1){let i=n.toLowerCase();if(!r.has(i))throw new e(`INVALID_ARGS`,`Invalid selector term "${t}", expected key=value`);return{key:i,value:!0}}let o=n.slice(0,a).trim().toLowerCase(),s=n.slice(a+1).trim();if(!i.has(o))throw new e(`INVALID_ARGS`,`Unknown selector key: ${o}`);if(!s)throw new e(`INVALID_ARGS`,`Missing selector value for key: ${o}`);if(r.has(o)){let t=v(s);if(t===null)throw new e(`INVALID_ARGS`,`Invalid boolean value for ${o}: ${s}`);return{key:o,value:t}}return{key:o,value:_(s)}}function h(t){let n=[],r=``,i=null;for(let a=0;a<t.length;a+=1){let o=t[a];if((o===`"`||o===`'`)&&!y(t,a)){i=g(i,o),r+=o;continue}if(!i&&o===`|`&&t[a+1]===`|`){let i=r.trim();if(!i)throw new e(`INVALID_ARGS`,`Invalid selector fallback expression: ${t}`);n.push(i),r=``,a+=1;continue}r+=o}let a=r.trim();if(!a)throw new e(`INVALID_ARGS`,`Invalid selector fallback expression: ${t}`);return n.push(a),n}function te(t){let n=[],r=``,i=null;for(let e=0;e<t.length;e+=1){let a=t.charAt(e);if((a===`"`||a===`'`)&&!y(t,e)){i=g(i,a),r+=a;continue}if(!i&&/\s/.test(a)){r.trim()&&n.push(r.trim()),r=``;continue}r+=a}if(i)throw new e(`INVALID_ARGS`,`Unclosed quote in selector: ${t}`);return r.trim()&&n.push(r.trim()),n}function g(e,t){return e?e===t?null:e:t}function _(e){let t=e.trim();return t.startsWith(`"`)&&t.endsWith(`"`)||t.startsWith(`'`)&&t.endsWith(`'`)?ne(t.slice(1,-1)):t}function ne(e){let t=``,n=0;for(;n<e.length;){let r=e.charAt(n);if(r!==`\\`){t+=r,n+=1;continue}let i=e.charAt(n+1);if(!i){t+=r,n+=1;continue}let a=re(i);if(a!==null){t+=a,n+=2;continue}if(i===`u`){let r=e.slice(n+2,n+6);if(/^[0-9a-fA-F]{4}$/.test(r)){t+=String.fromCharCode(Number.parseInt(r,16)),n+=6;continue}}t+=r,n+=1}return t}function re(e){return ee.get(e)??null}function v(e){let t=_(e).toLowerCase();return t===`true`?!0:t===`false`?!1:null}function y(e,t){let n=0;for(let r=t-1;r>=0&&e[r]===`\\`;--r)n+=1;return n%2==1}function b(e){let n=e[0];if(n===void 0)return null;let r=t(n);if(r!==null)return{kind:`sleep`,durationMs:r};let i=t(e[e.length-1]);if(n===`text`)return{kind:`text`,text:(i===null?e.slice(1).join(` `):e.slice(1,-1).join(` `)).trim(),timeoutMs:i};if(n===`stable`){let n=e.slice(1),r=n.length>1?t(n[1]):null;return{kind:`stable`,quietMs:n.length>0?t(n[0]):null,timeoutMs:r}}if(n.startsWith(`@`))return{kind:`ref`,rawRef:n,timeoutMs:i};let a=f(i===null?e.slice():e.slice(0,-1));return a&&a.rest.length===0&&l(a.selectorExpression)?{kind:`selector`,selectorExpression:a.selectorExpression,timeoutMs:i}:{kind:`text`,text:(i===null?e.join(` `):e.slice(0,-1).join(` `)).trim(),timeoutMs:i}}function ie(e){let t=b(e);return t?t.kind===`sleep`?t.durationMs:t.timeoutMs:null}const x=24e4,S={budget:{source:`none`},envelopeMs:9e4,onTimeout:`reset-daemon`},C={click:`settle-and-verify`,press:`settle-and-verify`,fill:`settle-and-verify`,longpress:`settle`};function w(e){if(e!==void 0)return C[e]}const T={leaseAdmissionExempt:!0,sessionExecutionLockExempt:!0},E={leaseAdmissionExempt:!0,sessionExecutionLockExempt:!0,selectorValidationExempt:!0},D=()=>!0,ae=e=>(e.positionals?.[0]??``).toLowerCase()===`start`,O=e=>e.command===`test`&&(typeof e.flags?.shardAll==`number`||typeof e.flags?.shardSplit==`number`),k={simulator:!0,device:!0},A={emulator:!0,device:!0,unknown:!0},j={device:!0},M={},N={apple:k,android:A,linux:j},P=N,oe={apple:k,android:A,linux:M},F={apple:k,android:A,linux:M},I={...S,onTimeout:`preserve-daemon`},L={...S,envelopeMs:18e4},se={...S,budget:{source:`flag`,envelope:`widen`,defaultBudgetMs:1e4},onTimeout:`preserve-daemon`},R={fields:{count:{defaultValue:1,omitDefault:!0},intervalMs:{defaultValue:0,omitDefault:!0},holdMs:{defaultValue:0,omitDefault:!0},jitterPx:{defaultValue:0,omitDefault:!0},doubleTap:{defaultValue:!1,omitDefault:!0}}},z={fields:{delayMs:{defaultValue:0}}};function B(e){return w(e)===void 0?I:se}function V(e){let t=w(e);if(t===void 0)throw Error(`Missing post-action observation descriptor support for ${e}`);return t}const H=[{name:`lease_allocate`,ownerFiles:[`src/daemon/handlers/lease.ts`],catalog:{group:`internal`,key:`leaseAllocate`},daemon:{route:`lease`,...T},timeoutPolicy:S,batchable:!1},{name:`lease_heartbeat`,ownerFiles:[`src/daemon/handlers/lease.ts`],catalog:{group:`internal`,key:`leaseHeartbeat`},daemon:{route:`lease`,...T},timeoutPolicy:S,batchable:!1},{name:`lease_release`,ownerFiles:[`src/daemon/handlers/lease.ts`],catalog:{group:`internal`,key:`leaseRelease`},daemon:{route:`lease`,...T},timeoutPolicy:S,batchable:!1},{name:`artifacts`,ownerFiles:[`src/commands/management/artifacts.ts`],catalog:{group:`public`},daemon:{route:`lease`,...T},timeoutPolicy:S,batchable:!1},{name:`session_list`,ownerFiles:[`src/daemon/handlers/session-inventory.ts`],catalog:{group:`internal`,key:`sessionList`},daemon:{route:`session`,sessionKind:`inventory`,...E},timeoutPolicy:S,batchable:!1},{name:`devices`,ownerFiles:[`src/commands/management/device.ts`],catalog:{group:`public`},daemon:{route:`session`,sessionKind:`inventory`,lockPolicySelectorOverride:!0,...E},timeoutPolicy:S,batchable:!0},{name:`capabilities`,ownerFiles:[`src/commands/management/device.ts`],catalog:{group:`public`},daemon:{route:`session`,sessionKind:`inventory`,lockPolicySelectorOverride:!0,preferExplicitDeviceOverExistingSession:!0,...E},timeoutPolicy:S,batchable:!0},{name:`doctor`,ownerFiles:[`src/commands/management/doctor.ts`],catalog:{group:`public`},daemon:{route:`session`,sessionKind:`inventory`,lockPolicySelectorOverride:!0,allowSessionlessDefaultDevice:D,...E},timeoutPolicy:S,batchable:!0},{name:`apps`,ownerFiles:[`src/commands/management/app.ts`],catalog:{group:`public`},daemon:{route:`session`,sessionKind:`inventory`,lockPolicySelectorOverride:!0,preferExplicitDeviceOverExistingSession:!0},capability:oe,timeoutPolicy:S,batchable:!0},{name:`boot`,ownerFiles:[`src/commands/management/device.ts`],catalog:{group:`public`},daemon:{route:`session`,sessionKind:`state`},capability:{apple:k,android:A,linux:M},timeoutPolicy:S,batchable:!0},{name:`shutdown`,ownerFiles:[`src/commands/management/device.ts`],catalog:{group:`public`},daemon:{route:`session`,sessionKind:`state`},capability:{apple:{simulator:!0},android:{emulator:!0},linux:M},timeoutPolicy:S,batchable:!0},{name:`appstate`,ownerFiles:[`src/commands/system/index.ts`],catalog:{group:`public`,key:`appState`},daemon:{route:`session`,sessionKind:`state`},timeoutPolicy:S,batchable:!0},{name:`perf`,ownerFiles:[`src/commands/perf/index.ts`],catalog:{group:`public`},daemon:{route:`session`,sessionKind:`observability`},capability:{apple:k,android:A,linux:M},timeoutPolicy:S,batchable:!0},{name:`logs`,ownerFiles:[`src/commands/observability/index.ts`],catalog:{group:`public`},daemon:{route:`session`,sessionKind:`observability`},capability:{apple:k,android:A,linux:M},timeoutPolicy:S,batchable:!0},{name:`events`,ownerFiles:[`src/commands/observability/index.ts`],catalog:{group:`public`},daemon:{route:`session`,sessionKind:`observability`,allowInvalidRecording:!0,...E},timeoutPolicy:S,batchable:!1},{name:`network`,ownerFiles:[`src/commands/observability/index.ts`],catalog:{group:`public`},daemon:{route:`session`,sessionKind:`observability`},capability:{apple:k,android:A,linux:M},timeoutPolicy:S,batchable:!0},{name:`audio`,ownerFiles:[`src/commands/observability/index.ts`],catalog:{group:`public`},daemon:{route:`session`,sessionKind:`observability`},capability:{apple:k,android:{emulator:!0},linux:M},timeoutPolicy:S,batchable:!0},{name:`replay`,ownerFiles:[`src/commands/replay/index.ts`],catalog:{group:`public`},daemon:{route:`session`,sessionKind:`replay`,skipSessionlessProviderDevice:O},timeoutPolicy:{...S,budget:{source:`flag`}},batchable:!1},{name:`test`,ownerFiles:[`src/commands/replay/index.ts`],catalog:{group:`public`},daemon:{route:`session`,sessionKind:`replay`,skipSessionlessProviderDevice:O},timeoutPolicy:{...S,envelopeMs:`unbounded`},batchable:!0},{name:`runtime`,ownerFiles:[`src/daemon/handlers/session-runtime-command.ts`],catalog:{group:`internal`},daemon:{route:`session`},timeoutPolicy:S,batchable:!1},{name:`clipboard`,ownerFiles:[`src/commands/system/index.ts`],catalog:{group:`public`},daemon:{route:`session`,replayScopedAction:!0},dispatch:{},capability:{apple:k,android:A,linux:j},timeoutPolicy:S,batchable:!0},{name:`keyboard`,ownerFiles:[`src/commands/system/index.ts`],catalog:{group:`public`},daemon:{route:`session`,replayScopedAction:!0,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:k,android:A,linux:M},timeoutPolicy:S,batchable:!0},{name:`install`,ownerFiles:[`src/commands/management/install.ts`],catalog:{group:`public`},daemon:{route:`session`},capability:F,timeoutPolicy:L,batchable:!0},{name:`reinstall`,ownerFiles:[`src/commands/management/install.ts`],catalog:{group:`public`},daemon:{route:`session`},capability:F,timeoutPolicy:L,batchable:!0},{name:`install_source`,ownerFiles:[`src/daemon/handlers/install-source.ts`],catalog:{group:`internal`,key:`installSource`},daemon:{route:`session`},timeoutPolicy:L,batchable:!1},{name:`release_materialized_paths`,ownerFiles:[`src/daemon/handlers/install-source.ts`],catalog:{group:`internal`,key:`releaseMaterializedPaths`},daemon:{route:`session`,...E},timeoutPolicy:S,batchable:!1},{name:`push`,ownerFiles:[`src/commands/management/push.ts`],catalog:{group:`public`},daemon:{route:`session`},dispatch:{},capability:{apple:{simulator:!0},android:A,linux:M},timeoutPolicy:S,batchable:!0},{name:`trigger-app-event`,ownerFiles:[`src/commands/management/push.ts`],catalog:{group:`public`,key:`triggerAppEvent`},daemon:{route:`session`},dispatch:{},capability:{apple:k,android:A,linux:M},timeoutPolicy:S,batchable:!0},{name:`open`,ownerFiles:[`src/commands/management/app.ts`],catalog:{group:`public`},daemon:{route:`session`,allowSessionlessDefaultDevice:D},dispatch:{},capability:P,timeoutPolicy:S,batchable:!0},{name:`prepare`,ownerFiles:[`src/commands/management/prepare.ts`],catalog:{group:`public`},daemon:{route:`session`},timeoutPolicy:{budget:{source:`flag`},envelopeMs:x,onTimeout:`reset-daemon`},batchable:!1,mcpExposed:!1},{name:`batch`,ownerFiles:[`src/commands/batch/index.ts`],catalog:{group:`public`},daemon:{route:`session`},timeoutPolicy:S,batchable:!1},{name:`close`,ownerFiles:[`src/commands/management/app.ts`],catalog:{group:`public`},daemon:{route:`session`,allowInvalidRecording:!0},dispatch:{},capability:P,timeoutPolicy:S,batchable:!0},{name:`snapshot`,ownerFiles:[`src/commands/capture/snapshot.ts`],catalog:{group:`public`},daemon:{route:`snapshot`,replayScopedAction:!0},dispatch:{},capability:N,timeoutPolicy:{...I,budget:{source:`flag`}},batchable:!0},{name:`diff`,ownerFiles:[`src/commands/capture/diff.ts`],catalog:{group:`public`},daemon:{route:`snapshot`,replayScopedAction:!0},capability:N,timeoutPolicy:S,batchable:!0},{name:`wait`,ownerFiles:[`src/commands/capture/wait.ts`],catalog:{group:`public`},daemon:{route:`snapshot`,replayScopedAction:!0},capability:N,timeoutPolicy:{...I,budget:{source:`positional-parser`,parser:ie}},batchable:!0},{name:`alert`,ownerFiles:[`src/commands/capture/alert.ts`],catalog:{group:`public`},daemon:{route:`snapshot`,replayScopedAction:!0},capability:{apple:k,android:A,linux:M},timeoutPolicy:S,batchable:!0},{name:`settings`,ownerFiles:[`src/commands/capture/settings.ts`],catalog:{group:`public`},daemon:{route:`snapshot`,replayScopedAction:!0},dispatch:{},capability:{apple:k,android:A,linux:M},timeoutPolicy:S,batchable:!0},{name:`react-native`,ownerFiles:[`src/commands/react-native/index.ts`],catalog:{group:`public`,key:`reactNative`},daemon:{route:`reactNative`,replayScopedAction:!0},capability:{apple:k,android:A,linux:M},timeoutPolicy:S,batchable:!0},{name:`record`,ownerFiles:[`src/commands/recording/index.ts`],catalog:{group:`public`},daemon:{route:`recordTrace`,replayScopedAction:!0,allowInvalidRecording:!0,allowSessionlessDefaultDevice:ae},capability:{apple:k,android:A,linux:M},timeoutPolicy:S,batchable:!0},{name:`trace`,ownerFiles:[`src/commands/recording/index.ts`],catalog:{group:`public`},daemon:{route:`recordTrace`},timeoutPolicy:S,batchable:!0},{name:`find`,ownerFiles:[`src/commands/interaction/index.ts`],catalog:{group:`public`},daemon:{route:`find`,replayScopedAction:!0},capability:N,timeoutPolicy:I,batchable:!0},{name:`click`,ownerFiles:[`src/commands/interaction/index.ts`],catalog:{group:`public`},daemon:{route:`interaction`,replayScopedAction:!0,androidBlockingDialogGuard:!0},capability:{apple:k,android:A,linux:j},timeoutPolicy:B(`click`),postActionObservation:V(`click`),responseDataTransform:R,batchable:!0},{name:`fill`,ownerFiles:[`src/commands/interaction/index.ts`],catalog:{group:`public`},daemon:{route:`interaction`,replayScopedAction:!0,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:k,android:A,linux:j},timeoutPolicy:B(`fill`),postActionObservation:V(`fill`),responseDataTransform:z,batchable:!0},{name:`longpress`,ownerFiles:[`src/commands/interaction/index.ts`],catalog:{group:`public`,key:`longPress`},daemon:{route:`interaction`,replayScopedAction:!0,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:k,android:A,linux:j},timeoutPolicy:B(`longpress`),postActionObservation:V(`longpress`),batchable:!0},{name:`press`,ownerFiles:[`src/commands/interaction/index.ts`],catalog:{group:`public`},daemon:{route:`interaction`,replayScopedAction:!0,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:k,android:A,linux:j},timeoutPolicy:B(`press`),postActionObservation:V(`press`),responseDataTransform:R,batchable:!0},{name:`type`,ownerFiles:[`src/commands/interaction/index.ts`],catalog:{group:`public`},daemon:{route:`interaction`,replayScopedAction:!0,androidBlockingDialogGuard:!0},dispatch:{},capability:N,timeoutPolicy:B(`type`),batchable:!0},{name:`get`,ownerFiles:[`src/commands/interaction/index.ts`],catalog:{group:`public`},daemon:{route:`interaction`,replayScopedAction:!0},capability:N,timeoutPolicy:B(`get`),batchable:!0},{name:`read`,ownerFiles:[`src/daemon/handlers/interaction.ts`],catalog:{group:`dispatch-alias`},dispatch:{},timeoutPolicy:S,batchable:!1},{name:`is`,ownerFiles:[`src/commands/interaction/index.ts`],catalog:{group:`public`},daemon:{route:`interaction`,replayScopedAction:!0},capability:N,timeoutPolicy:B(`is`),batchable:!0},{name:`back`,ownerFiles:[`src/commands/system/index.ts`],catalog:{group:`public`},daemon:{route:`generic`,replayScopedAction:!0,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:k,android:A,linux:j},timeoutPolicy:S,batchable:!0},{name:`gesture`,ownerFiles:[`src/commands/interaction/index.ts`],catalog:{group:`public`},daemon:{route:`generic`,replayScopedAction:!0,androidBlockingDialogGuard:!0},timeoutPolicy:S,batchable:!0},{name:`home`,ownerFiles:[`src/commands/system/index.ts`],catalog:{group:`public`},daemon:{route:`generic`,replayScopedAction:!0,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:k,android:A,linux:j},timeoutPolicy:S,batchable:!0},{name:`tv-remote`,ownerFiles:[`src/commands/system/index.ts`],catalog:{group:`public`,key:`tvRemote`},daemon:{route:`generic`,replayScopedAction:!0,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:k,android:A,linux:M},timeoutPolicy:S,batchable:!0},{name:`rotate`,ownerFiles:[`src/commands/system/index.ts`],catalog:{group:`public`},daemon:{route:`generic`,replayScopedAction:!0,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:k,android:A,linux:M},timeoutPolicy:S,batchable:!0},{name:`scroll`,ownerFiles:[`src/commands/interaction/index.ts`],catalog:{group:`public`},daemon:{route:`generic`,replayScopedAction:!0,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:k,android:A,linux:j},timeoutPolicy:S,batchable:!0},{name:`swipe`,ownerFiles:[`src/commands/interaction/index.ts`],catalog:{group:`public`},daemon:{route:`generic`,replayScopedAction:!0,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:k,android:A,linux:j},timeoutPolicy:S,batchable:!0},{name:`swipe-preset`,ownerFiles:[`src/core/dispatch.ts`],catalog:{group:`dispatch-alias`},dispatch:{},timeoutPolicy:S,batchable:!1},{name:`pinch`,ownerFiles:[`src/core/dispatch.ts`],catalog:{group:`dispatch-alias`},daemon:{route:`generic`,replayScopedAction:!0,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:k,android:A,linux:M},timeoutPolicy:S,batchable:!1},{name:`focus`,ownerFiles:[`src/commands/interaction/index.ts`],catalog:{group:`public`},daemon:{route:`generic`,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:k,android:A,linux:j},timeoutPolicy:S,batchable:!0},{name:`screenshot`,ownerFiles:[`src/commands/capture/screenshot.ts`],catalog:{group:`public`},daemon:{route:`generic`,replayScopedAction:!0},dispatch:{},capability:N,timeoutPolicy:S,batchable:!0},{name:`viewport`,ownerFiles:[`src/commands/management/viewport.ts`],catalog:{group:`public`},daemon:{route:`generic`,replayScopedAction:!0},dispatch:{},capability:{apple:k,android:A,linux:M},timeoutPolicy:S,batchable:!1},{name:`pan`,ownerFiles:[`src/core/dispatch.ts`],catalog:{group:`dispatch-alias`},daemon:{route:`generic`,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:k,android:A,linux:j},timeoutPolicy:S,batchable:!1},{name:`fling`,ownerFiles:[`src/core/dispatch.ts`],catalog:{group:`dispatch-alias`},daemon:{route:`generic`,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:k,android:A,linux:M},timeoutPolicy:S,batchable:!1},{name:`rotate-gesture`,ownerFiles:[`src/core/dispatch.ts`],catalog:{group:`dispatch-alias`},daemon:{route:`generic`,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:k,android:A,linux:M},timeoutPolicy:S,batchable:!1},{name:`transform-gesture`,ownerFiles:[`src/core/dispatch.ts`],catalog:{group:`dispatch-alias`},daemon:{route:`generic`,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:k,android:A,linux:M},timeoutPolicy:S,batchable:!1},{name:`app-switcher`,ownerFiles:[`src/commands/system/index.ts`],catalog:{group:`public`,key:`appSwitcher`},dispatch:{},capability:{apple:k,android:A,linux:M},timeoutPolicy:S,batchable:!0},{name:`install-from-source`,ownerFiles:[`src/commands/management/install.ts`],catalog:{group:`public`,key:`installFromSource`},capability:F,timeoutPolicy:S,batchable:!0},{name:`debug`,ownerFiles:[`src/commands/debugging/index.ts`],catalog:{group:`local-cli`},timeoutPolicy:S,batchable:!1},{name:`metro`,ownerFiles:[`src/commands/metro/index.ts`],catalog:{group:`local-cli`},timeoutPolicy:S,batchable:!1},{name:`session`,ownerFiles:[`src/commands/management/session.ts`],catalog:{group:`local-cli`},timeoutPolicy:S,batchable:!1},{name:`cdp`,ownerFiles:[`src/cli/commands/agent-cdp.ts`],catalog:{group:`local-cli`},timeoutPolicy:S,batchable:!1,mcpExposed:!1},{name:`auth`,ownerFiles:[`src/cli/commands/auth.ts`],catalog:{group:`local-cli`},timeoutPolicy:S,batchable:!1,mcpExposed:!1},{name:`connect`,ownerFiles:[`src/cli/commands/connection.ts`],catalog:{group:`local-cli`},timeoutPolicy:S,batchable:!1,mcpExposed:!1},{name:`connection`,ownerFiles:[`src/cli/commands/connection.ts`],catalog:{group:`local-cli`},timeoutPolicy:S,batchable:!1,mcpExposed:!1},{name:`disconnect`,ownerFiles:[`src/cli/commands/connection.ts`],catalog:{group:`local-cli`},timeoutPolicy:S,batchable:!1,mcpExposed:!1},{name:`mcp`,ownerFiles:[`src/bin.ts`],catalog:{group:`local-cli`},timeoutPolicy:S,batchable:!1,mcpExposed:!1},{name:`proxy`,ownerFiles:[`src/cli/commands/proxy.ts`],catalog:{group:`local-cli`},timeoutPolicy:S,batchable:!1,mcpExposed:!1},{name:`react-devtools`,ownerFiles:[`src/cli/commands/react-devtools.ts`],catalog:{group:`local-cli`,key:`reactDevtools`},timeoutPolicy:S,batchable:!1,mcpExposed:!1},{name:`web`,ownerFiles:[`src/cli/commands/web.ts`],catalog:{group:`local-cli`},timeoutPolicy:S,batchable:!1,mcpExposed:!1}],U=new Set([`public`,`local-cli`]),W=new Set(H.filter(e=>U.has(J(e))).map(e=>e.name)),G=H.map(e=>({...e,mcpExposed:ue(e)}));function K(e){return G.filter(t=>J(t)===e).map(e=>[fe(e),e.name])}function ce(){return G.filter(e=>de(e)).map(e=>e.name).sort()}const q=new Map(G.map(e=>[e.name,e]));function le(e){return W.has(e)}function ue(e){return e.mcpExposed??W.has(e.name)}function de(e){return e.mcpExposed&&le(e.name)}function J(e){return e.catalog.group}function fe(e){return e.catalog.key??e.name}const pe=new Map(G.map(e=>[e.name,e.timeoutPolicy])),Y=new Map(Array.from(q.values()).flatMap(e=>e.responseDataTransform?[[e.name,e.responseDataTransform]]:[]));function X(e){if(e!==void 0)return q.get(e)?.postActionObservation}function me(e){return X(e)!==void 0}function he(e){return X(e)===`settle-and-verify`}function ge(e){return e===void 0?S:pe.get(e)??S}function _e(e){if(e!==void 0)return Y.get(e)}function ve(){return[...new Set(Array.from(Y.values()).flatMap(e=>Object.keys(e.fields)))].sort()}function ye(e){let t=[];for(let n of e)n.daemon&&t.push({command:n.name,...n.daemon});return t}function be(e){let t={};for(let n of e)n.capability&&(t[n.name]=n.capability);return t}function xe(e){return e.filter(e=>e.batchable).map(e=>e.name)}const Z=xe(G),Q=new Set([`batch`,`replay`]),Se=[`command`,`positionals`,`flags`,`runtime`],Ce=[`platform`,`target`,`device`,`udid`,`serial`,`verbose`,`out`],we=new Set(Z);function Te(e){return we.has(e)}function $(e){return typeof e==`string`?e.trim().toLowerCase():``}function Ee(t,n){let r=$(t);if(Te(r))return r;throw new e(`INVALID_ARGS`,`Batch step ${n} command is not available through command batch: ${String(t)}`)}function De(t,n){if(Q.has(t))throw new e(`INVALID_ARGS`,`Batch step ${n} cannot run ${t}.`)}export{c as C,t as E,u as S,l as T,x as _,$ as a,d as b,ye as c,he as d,ve as f,ge as g,_e as h,De as i,G as l,ce as m,Ce as n,Ee as o,K as p,Z as r,be as s,Se as t,me as u,b as v,f as w,s as x,a as y};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=/(token|secret|password|authorization|cookie|api[_-]?key|access[_-]?key|private[_-]?key|user[_-]?code|device[_-]?code|refresh[_-]?credential)/i,t=/\b(?:bearer\s+[a-z0-9._-]+|adc_(?:agent|live|refresh|cli)_[a-z0-9._-]+)\b/gi,n=/\b([a-z0-9_-]*(?:api[_-]?key|token|secret|password|user[_-]?code|device[_-]?code|refresh[_-]?credential)[a-z0-9_-]*)(\s*[=:]\s*)("[^"]*"|'[^']*'|\S+)/gi,r=/https?:\/\/[^\s"'<>]+/gi;function i(e){return a(e,new WeakSet)}function a(t,n,r){if(t==null)return t;if(typeof t==`string`)return o(t,r);if(typeof t!=`object`)return t;if(n.has(t))return`[Circular]`;if(n.add(t),Array.isArray(t))return t.map(e=>a(e,n));let i={};for(let[r,o]of Object.entries(t)){if(e.test(r)){i[r]=`[REDACTED]`;continue}i[r]=a(o,n,r)}return i}function o(r,i){let a=r.trim();if(!a)return r;if(i&&e.test(i))return`[REDACTED]`;let o=s(a);return o=o.replace(t,`[REDACTED]`),o=o.replace(n,(e,t,n,r,i,a)=>l({key:t,separator:n,rawValue:r,offset:i,input:a})||c(r)?e:`${t}${n}[REDACTED]`),o===a?a.length>400?`${a.slice(0,200)}...<truncated>`:a:o}function s(e){return e.replace(r,e=>u(e)??e)}function c(e){return/^adc_(?:agent|live|refresh|cli)_\.\.\.$/i.test(e)}function l(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 u(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}}function d(e,t=`COMMAND_FAILED`){return typeof e==`string`&&e.length>0?e:t}var f=class extends Error{code;details;cause;constructor(e,t,n,r){super(t),this.code=e,this.details=n,this.cause=r}};function p(e,t=`UNKNOWN`){return e instanceof f?e:e instanceof Error?new f(t,e.message,void 0,e):new f(t,`Unknown error`,{err:e})}function
|
|
2
|
-
`)){let e=t.trim();if(!e||
|
|
1
|
+
const e=/(token|secret|password|authorization|cookie|api[_-]?key|access[_-]?key|private[_-]?key|user[_-]?code|device[_-]?code|refresh[_-]?credential)/i,t=/\b(?:bearer\s+[a-z0-9._-]+|adc_(?:agent|live|refresh|cli)_[a-z0-9._-]+)\b/gi,n=/\b([a-z0-9_-]*(?:api[_-]?key|token|secret|password|user[_-]?code|device[_-]?code|refresh[_-]?credential)[a-z0-9_-]*)(\s*[=:]\s*)("[^"]*"|'[^']*'|\S+)/gi,r=/https?:\/\/[^\s"'<>]+/gi;function i(e){return a(e,new WeakSet)}function a(t,n,r){if(t==null)return t;if(typeof t==`string`)return o(t,r);if(typeof t!=`object`)return t;if(n.has(t))return`[Circular]`;if(n.add(t),Array.isArray(t))return t.map(e=>a(e,n));let i={};for(let[r,o]of Object.entries(t)){if(e.test(r)){i[r]=`[REDACTED]`;continue}i[r]=a(o,n,r)}return i}function o(r,i){let a=r.trim();if(!a)return r;if(i&&e.test(i))return`[REDACTED]`;let o=s(a);return o=o.replace(t,`[REDACTED]`),o=o.replace(n,(e,t,n,r,i,a)=>l({key:t,separator:n,rawValue:r,offset:i,input:a})||c(r)?e:`${t}${n}[REDACTED]`),o===a?a.length>400?`${a.slice(0,200)}...<truncated>`:a:o}function s(e){return e.replace(r,e=>u(e)??e)}function c(e){return/^adc_(?:agent|live|refresh|cli)_\.\.\.$/i.test(e)}function l(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 u(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}}function d(e,t=`COMMAND_FAILED`){return typeof e==`string`&&e.length>0?e:t}var f=class extends Error{code;details;cause;constructor(e,t,n,r){super(t),this.code=e,this.details=n,this.cause=r}};function p(e,t=`UNKNOWN`){return e instanceof f?e:e instanceof Error?new f(t,e.message,void 0,e):new f(t,`Unknown error`,{err:e})}function m(e){return e instanceof f}function h(e,t={}){return g(e,t)}function g(e,t={}){let n=p(e),r=n.details?i(n.details):void 0,a=S(r,`diagnosticId`)??t.diagnosticId,o=S(r,`logPath`)??t.logPath,s=S(r,`hint`)??E(n.code),c=C(r,`retriable`)??T(n.code),l=S(r,`supportedOn`),u=w(r),d=v(n.code,n.message,r);return{code:n.code,message:d,hint:s,diagnosticId:a,logPath:o,...c===void 0?{}:{retriable:c},...l===void 0?{}:{supportedOn:l},details:u}}const _=/^\S+ exited with code -?\d+$/;function v(e,t,n){if(e!==`COMMAND_FAILED`||n?.processExitError!==!0)return t;let r=x(typeof n?.stderr==`string`?n.stderr:``);return r?_.test(t)?r:t.includes(r)?t:`${t}: ${r}`:t}const y=[/^an error was encountered processing the command/i,/^underlying error\b/i,/^simulator device failed to complete the requested operation/i],b=/^(?:(?:adb|xcrun|simctl):\s*)?(?:error:\s*)?/i;function x(e){for(let t of e.split(`
|
|
2
|
+
`)){let e=t.trim();if(!e||y.some(t=>t.test(e)))continue;let n=e.replace(b,``).trim();if(n)return n.length>200?`${n.slice(0,200)}...`:n}return null}function S(e,t){let n=e?.[t];return typeof n==`string`?n:void 0}function C(e,t){let n=e?.[t];return typeof n==`boolean`?n:void 0}function w(e){if(!e)return;let t={...e};return delete t.hint,delete t.diagnosticId,delete t.logPath,delete t.retriable,delete t.supportedOn,Object.keys(t).length>0?t:void 0}function T(e){switch(e){case`DEVICE_IN_USE`:return!0;default:return}}function E(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`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 D(e){return e===`xctest`||e===`android`||e===`macos-helper`||e===`linux-atspi`||e===`web`}function O(e){return e===void 0||e===`xctest`||e===`android`}function k(e){return e.map((e,t)=>({...e,ref:`e${t+1}`}))}const A=/^~s(\d+)$/,j=`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 M(e){let t=e.trim(),n=t.indexOf(`~`);if(n===-1)return{base:t};let r=A.exec(t.slice(n));return!r||n===0?null:{base:t.slice(0,n),generation:Number(r[1])}}function N(e){let t=M(e);if(!t)return null;let n=t.base;return n.startsWith(`@`)?n.slice(1)||null:n.startsWith(`e`)?n:null}function P(e,t){return e.find(e=>e.ref===t)??null}function F(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})}function I(e){if(e)return{depth:e.snapshotDepth,interactiveOnly:e.snapshotInteractiveOnly,raw:e.snapshotRaw,scope:e.snapshotScope}}function L(e){return{x:Math.round(e.x+e.width/2),y:Math.round(e.y+e.height/2)}}const R=[`summary`,`headers`,`body`,`all`],z=[`digest`,`default`,`full`];function B(e){return e!==void 0&&e!=="default"}function V(e){return{parse(t){return e(t,`$`)}}}function H(e,t){throw Error(`${e}: ${t}`)}function U(e,t){return(!e||typeof e!=`object`||Array.isArray(e))&&H(t,`Expected an object`),e}function W(e,t){return typeof e!=`string`&&H(t,`Expected a string`),e}function G(e,t){return Number.isInteger(e)||H(t,`Expected an integer`),e}function K(e,t){return Array.isArray(e)||H(t,`Expected an array`),e}function q(e,t,n){let r=e[t];return r===void 0?void 0:W(r,`${n}.${t}`)}function J(e,t,n){let r=e[t];if(r!==void 0)return K(r,`${n}.${t}`).map((e,r)=>W(e,`${n}.${t}[${String(r)}]`))}function Y(e,t,n){let r=e[t];return r===void 0?void 0:G(r,`${n}.${t}`)}function X(e,t,n){let r=e[t];return r===void 0?void 0:U(r,`${n}.${t}`)}function Z(e,t,n,r){let i=e[t];if(i!==void 0)return(typeof i!=`string`||!n.includes(i))&&H(`${r}.${t}`,`Expected one of: ${n.join(`, `)}`),i}const Q=V((e,t)=>{let n=U(e,t);return{platform:Z(n,`platform`,[`ios`,`android`],t),metroHost:q(n,`metroHost`,t),metroPort:Y(n,`metroPort`,t),bundleUrl:q(n,`bundleUrl`,t),launchUrl:q(n,`launchUrl`,t)}});function $(e,t){let n=e.id;return n==null||typeof n!=`string`&&typeof n!=`number`&&H(`${t}.id`,`Expected a string, number, or null`),n}const ee=V((e,t)=>{let n=U(e,t);return{jsonrpc:q(n,`jsonrpc`,t),id:$(n,t),method:q(n,`method`,t),params:n.params}}),te=V((e,t)=>{let n=U(e,t);return{token:q(n,`token`,t),session:q(n,`session`,t),command:q(n,`command`,t),positionals:J(n,`positionals`,t),flags:X(n,`flags`,t),runtime:X(n,`runtime`,t),meta:X(n,`meta`,t)}});export{T as C,g as S,i as T,f as _,B as a,m as b,k as c,P as d,D as f,O as g,M as h,Q as i,F as l,I as m,z as n,ee as o,N as p,te as r,j as s,R as t,L as u,p as v,d as w,h as x,E as y};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as e}from"./sdk-contracts.js";const t=[`ios`,`ipados`,`tvos`,`watchos`,`visionos`,`macos`],n=[`apple`,`android`,`linux`,`web`],r=[`ios`,`macos`,`android`,`linux`,`web`],i=[...n,`ios`,`macos`],a=[`mobile`,`tv`,`desktop`];function o(e){return e===`apple`||e===`ios`||e===`macos`}function s(e){return e.appleOs===`macos`||e.platform===`macos`}function c(e){return o(e.platform)&&!s(e)}function l(e){return e.platform===`android`||o(e.platform)&&!s(e)}function u(e){return o(e.platform)?s(e)?`macos`:`ios`:e.platform}function d(e){return e===`macos`?{platform:`apple`,appleOs:`macos`}:e===`ios`?{platform:`apple`}:{platform:e}}function f(e){return o(e.platform)&&e.target===`tv`}function p(e){return r.includes(e)}function m(e){return t.includes(e)}function h(e,t){return t?t===`apple`?o(e.platform):t===`ios`?o(e.platform)&&!s(e):t===`macos`?o(e.platform)&&s(e):e.platform===t:!0}function g(e,t){return t?_(t):e===`macos`||e===`desktop`?`macOS`:e===`tv`?`tvOS`:`iOS`}function _(e){switch(e){case`tvos`:return`tvOS`;case`macos`:return`macOS`;case`visionos`:return`visionOS`;default:return`iOS`}}function v(e){let{simulatorSetPath:t,platform:n,target:r}=e;if(t&&!(n===`macos`||r===`desktop`))return t}function y(e){return e.map((e,t)=>({device:e,index:t})).sort((e,t)=>D(e,t)).map(({device:e})=>e)}function b(e){return!e||e===`apple`||e===`ios`}async function x(t,n,r={}){let i=t.filter(e=>C(e,n));if(n.udid){let t=i.find(e=>e.id===n.udid&&o(e.platform));if(!t)throw new e(`DEVICE_NOT_FOUND`,`No Apple device with UDID ${n.udid}`);return t}if(n.serial){let t=i.find(e=>e.id===n.serial&&e.platform===`android`);if(!t)throw new e(`DEVICE_NOT_FOUND`,`No Android device with serial ${n.serial}`);return t}if(r.allowStoppedAndroidAvdPlaceholders!==!0&&(i=i.filter(e=>!S(e))),n.deviceName){let t=E(n.deviceName),r=i.find(e=>E(e.name)===t);if(!r)throw new e(`DEVICE_NOT_FOUND`,`No device named ${n.deviceName}`);return r}A(i)&&(i=y(i));let a=i[0];if(a!==void 0&&i.length===1)return a;i.length===0&&T(n,r);let s=i.filter(e=>e.kind!==`device`),c=s.length>0?s:i,l=c.filter(e=>e.booted),u=l[0];if(u&&l.length===1&&!A(c))return u;let d=A(c)?c[0]:l[0]??c[0];return d||T(n,r),d}function S(e){return e.platform===`android`&&e.kind===`emulator`&&e.booted===!1&&!/^emulator-\d+$/.test(e.id)}function C(e,t,n={}){return h(e,t.platform)&&(!t.target||(e.target??`mobile`)===t.target)&&(!n.includeExplicitSelectors||w(e,t))}function w(e,t){return!(t.udid&&!(e.id===t.udid&&o(e.platform))||t.serial&&!(e.id===t.serial&&e.platform===`android`)||t.deviceName&&E(e.name)!==E(t.deviceName))}function T(t,n){let r=n.simulatorSetPath;throw r&&b(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 E(e){return e.toLowerCase().replace(/_/g,` `).replace(/\s+/g,` `).trim()}function D(e,t){return O(e.device)-O(t.device)||Number(t.device.booted===!0)-Number(e.device.booted===!0)||e.device.name.localeCompare(t.device.name)||e.index-t.index}function O(e){return e.kind===`simulator`?k(e,0,1,2,3):e.kind===`device`&&o(e.platform)&&!s(e)?k(e,10,11,12,13):14}function k(e,t,n,r,i){return{mobile:j(e.name)?n:t,tv:r,desktop:i}[e.target??`mobile`]}function A(e){return e.length>0&&e.every(e=>o(e.platform))}function j(e){return/\bipad\b/i.test(e)}export{x as _,m as a,s as c,f as d,C as f,v as g,g as h,d as i,l,u as m,n,o,h as p,i as r,c as s,a as t,p as u,y as v};
|
package/dist/src/sdk-finders.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{_ as e}from"./sdk-contracts.js";import{T as t}from"./sdk-batch.js";const n=[`any`,`text`,`label`,`value`,`role`,`id`],r=[`text`,`label`,`value`,`role`,`id`];function i(e,t,n,r={}){let i=c(n);if(!i)return{matches:[],score:0};let o=0,s=[];for(let n of e){if(r.requireRect&&!n.rect)continue;let e=a(n,t,i);if(!(e<=0)){if(e>o){o=e,s.length=0,s.push(n);continue}e===o&&s.push(n)}}return{matches:s,score:o}}function a(e,t,n){switch(t){case`role`:return s(e.type,n);case`label`:return o(e.label,n);case`value`:return o(e.value,n);case`id`:return o(e.identifier,n);default:return Math.max(o(e.label,n),o(e.value,n),o(e.identifier,n))}}function o(e,t){let n=c(e??``);return n?n===t?2:+!!n.includes(t):0}function s(e,t){let n=l(e??``);return n?n===t?2:+!!n.includes(t):0}function c(e){return e.trim().toLowerCase().replace(/\s+/g,` `)}function l(e){let t=e.trim();return t?(t=(t.split(`.`).pop()??t).replace(/XCUIElementType/gi,``).toLowerCase(),t):``}function u(t){let n=`any`,i=0;r.includes(t[0])&&(n=t[0],i=1);let a=t[i]??``,o=t.slice(i+1);if(o.length===0)return{locator:n,query:a,action:`click`};let s=o[0]?.toLowerCase();if(s===`get`){let t=o[1]?.toLowerCase();if(t===`text`)return{locator:n,query:a,action:`get_text`};if(t===`attrs`)return{locator:n,query:a,action:`get_attrs`};throw new e(`INVALID_ARGS`,`find get only supports text or attrs`)}if(s===`wait`){let e=f(o[1]);return{locator:n,query:a,action:`wait`,timeoutMs:e??void 0}}if(s===`exists`)return{locator:n,query:a,action:`exists`};if(s===`click`)return{locator:n,query:a,action:`click`};if(s===`focus`)return{locator:n,query:a,action:`focus`};if(s===`fill`){let e=o.slice(1).join(` `);return{locator:n,query:a,action:`fill`,value:e}}if(s===`type`){let e=o.slice(1).join(` `);return{locator:n,query:a,action:`type`,value:e}}throw new e(`INVALID_ARGS`,`Unsupported find action: ${o[0]}`)}function d(e,n){return e!==`any`||!n.includes(`=`)&&!n.includes(`||`)?null:t(n)}function f(e){if(!e)return null;let t=Number(e);return Number.isFinite(t)?t:null}function p(e,t,n,r){return i(e,t,n,typeof r==`boolean`?{requireRect:r}:r)}export{u as a,c as i,n,d as o,i as r,p as t};
|
package/dist/src/sdk-io.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as e}from"./rolldown-runtime.js";import{
|
|
1
|
+
import{t as e}from"./rolldown-runtime.js";import{_ as t}from"./sdk-contracts.js";import{promises as n}from"node:fs";import r from"node:os";import i from"node:path";var a=e({createLocalArtifactAdapter:()=>o});function o(e={}){let a=e.cwd??process.cwd(),o=e.tempDir??r.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 r,l=t.visibility??`client-visible`,u=e?.kind===`path`?s(e.path,a,c):i.join(r=await n.mkdtemp(i.join(o,`agent-device-${t.field}-`)),`${t.field}${t.ext}`);return await n.mkdir(i.dirname(u),{recursive:!0}),{path:u,visibility:l,...r?{cleanup:async()=>{await n.rm(r,{recursive:!0,force:!0})}}:{},publish:async()=>e?.kind===`downloadableArtifact`?{kind:`localPath`,field:t.field,artifactType:t.artifactType,path:u,fileName:e.fileName??i.basename(e.clientPath??u)}:void 0}},createTempFile:async e=>{let t=await n.mkdtemp(i.join(o,`${e.prefix}-`));return{path:i.join(t,`file${e.ext}`),visibility:`internal`,cleanup:async()=>{await n.rm(t,{recursive:!0,force:!0})}}}}}function s(e,n,r){let a=i.isAbsolute(e)?e:i.resolve(n,e);if(r&&!c(a,r))throw new t(`INVALID_ARGS`,`Local path is outside the artifact adapter root`,{path:a,rootDir:r});return a}function c(e,t){let n=i.relative(t,e);return n===``||!n.startsWith(`..`)&&!i.isAbsolute(n)}export{a as n,o as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{E as e}from"./sdk-android-adb.js";import{r as t}from"./sdk-device.js";const n=[{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:t},{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:`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`}],r=[{key:`leaseProvider`,type:`string`,env:!1},{key:`deviceKey`,type:`string`,env:!1},{key:`clientId`,type:`string`,env:!1}],i=[...n,...r],a=new Map(i.map(e=>[e.key,e]));function o(e){return a.get(e)}function s(t){return o(t)?.env===!1?[]:[e(t)]}export{o as i,i as n,s as r,n as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{O as e}from"./sdk-contracts.js";import{S as t,x as n}from"./sdk-batch.js";function r(e){let t=new Map;for(let[n,r]of e.entries())t.set(r.index,n);let n=[],r=[];for(let[i,a]of e.entries()){let e=Math.max(0,a.depth??0);for(;r.length>0&&e<=r[r.length-1].depth;)r.pop();let o=i,s=typeof a.parentIndex==`number`?t.get(a.parentIndex):void 0,c=typeof s==`number`&&s<o?s:r[r.length-1]?.index;n.push({...a,index:o,depth:e,parentIndex:c}),r.push({depth:e,index:o})}return n}function i(e){return new Map(e.map(e=>[e.index,e]))}function a(e){return e.label?.trim()||e.value?.trim()||e.identifier?.trim()||``}function o(e){let t=e.trim().toLowerCase();return t?/^(vertical|horizontal)\s+scroll\s+bar(?:,?\s*\d+\s+pages?)?$/.test(t):!1}function s(e,t){if(!(e?.trim().toLowerCase()??``).includes(`vertical scroll bar`))return null;let n=c(t);return n===null?null:n<=1?{above:!1,below:!0}:n>=99?{above:!0,below:!1}:{above:!0,below:!0}}function c(e){if(!e)return null;let t=/^(\d{1,3})%$/.exec(e.trim());if(!t)return null;let n=Number(t[1]);return Number.isFinite(n)?Math.max(0,Math.min(100,n)):null}function l(e){let t=m(e.label),n=m(e.value),r=m(e.identifier),i=ee(r)?r:``;return g(e.type??``)?n||t||i:t||n||i}function u(e,t){if(t===`text-view`||t===`text-field`||t===`search`)return!0;let n=h(e.type??``),r=`${e.role??``} ${e.subrole??``}`.toLowerCase();return n.includes(`textview`)||n.includes(`textarea`)||n.includes(`textfield`)||n.includes(`securetextfield`)||n.includes(`searchfield`)||n.includes(`edittext`)||r.includes(`text area`)||r.includes(`text field`)}function d(e){let t=e.replace(/\s+/g,` `).trim();return t.length<=48?t:`${t.slice(0,45)}...`}function f(e,t){let n=l(e),r=u(e,t);return{text:n,isLargeSurface:r,shouldSummarize:r&&p(n)}}function p(e){return e?e.length>80||/[\r\n]/.test(e):!1}function m(e){return typeof e==`string`?e.trim():``}function h(e){let t=e.trim().replace(/XCUIElementType/gi,``).replace(/^AX/,``).toLowerCase(),n=Math.max(t.lastIndexOf(`.`),t.lastIndexOf(`/`));return n!==-1&&(t=t.slice(n+1)),t}function g(e){let t=h(e);return t.includes(`textfield`)||t.includes(`securetextfield`)||t.includes(`searchfield`)||t.includes(`edittext`)||t.includes(`textview`)||t.includes(`textarea`)}function ee(e){return e?!/^[\w.]+:id\/[\w.-]+$/i.test(e)&&!/^_?NS:\d+$/i.test(e):!1}function _(t,n){let r=e(n),i=t.filter(e=>te(e.rect)),a=i.filter(e=>{let t=(e.type??``).toLowerCase();return t.includes(`application`)||t.includes(`window`)});return b(a.map(e=>e.rect).filter(e=>y(e,r.x,r.y)))||b(a.map(e=>e.rect))||b(i.map(e=>e.rect).filter(e=>y(e,r.x,r.y)))||null}function v(e,t){return x(e.x,e.x+e.width,t.x,t.x+t.width)&&x(e.y,e.y+e.height,t.y,t.y+t.height)}function te(e){return e?Number.isFinite(e.x)&&Number.isFinite(e.y)&&Number.isFinite(e.width)&&Number.isFinite(e.height):!1}function y(e,t,n){return t>=e.x&&t<=e.x+e.width&&n>=e.y&&n<=e.y+e.height}function b(e){let t=null,n=-1;for(let r of e){let e=r.width*r.height;e>n&&(t=r,n=e)}return t}function x(e,t,n,r){return Math.max(e,n)<=Math.min(t,r)}function S(e){let t=`${e??``}`.toLowerCase();return t.includes(`scroll`)||t.includes(`recyclerview`)||t.includes(`listview`)||t.includes(`gridview`)||t.includes(`collectionview`)||t===`table`}function C(e){return S(e.type)?!0:`${e.role??``} ${e.subrole??``}`.toLowerCase().includes(`scroll`)}function w(e){if(e.length===0)return{nodes:e,hiddenCount:0,summaryLines:[]};let{byIndex:t,visibleNodeIndexes:n,offscreenNodes:r,hintedContainers:i}=E(e),a=n.size===0?e:e.filter(e=>n.has(e.index));return{nodes:a.map(e=>oe(e,i.directionsByContainer)),hiddenCount:n.size===0?0:e.length-a.length,summaryLines:se(r.filter(e=>!i.coveredNodeIndexes.has(e.index)&&le(e)),e,t)}}function T(e){if(e.length===0)return new Map;let{hintedContainers:t}=E(e);return ae(t.directionsByContainer)}function E(e){let t=i(e),n=new Set,r=[];for(let i of e){if(D(i,e,t)){A(i,n,t);continue}r.push(i)}return{byIndex:t,visibleNodeIndexes:n,offscreenNodes:r,hintedContainers:ie(e,r,n,t)}}function D(e,t,n=i(t)){if(!e.rect)return!0;let r=O(e,t,n);return r?v(e.rect,r):!0}function ne(e,t,n=i(t)){if(!e.rect)return!0;if(!D(e,t,n))return!1;let r=_(t,e.rect);return re(e.rect,r)}function re(e,t){return!t||t.width<=0||t.height<=0?!0:y(t,e.x+e.width/2,e.y+e.height/2)}function O(e,t,n=i(t)){return P(e,n)||_(t,e.rect??{x:0,y:0,width:0,height:0})}function ie(e,t,n,r){let i=new Map,a=new Map,o=new Set;for(let e of t){if(!e.rect)continue;let t=j(e,n,r);if(!t?.rect)continue;let s=k(e.rect,t.rect);if(!s)continue;let c=i.get(t.index)??new Set;c.add(s),i.set(t.index,c);let l=a.get(t.index)??new Set;l.add(s),a.set(t.index,l),o.add(e.index)}return M(e,n,r,i,a),{directionsByContainer:i,coveredNodeIndexes:o}}function ae(e){let t=new Map;for(let[n,r]of e){let e={};r.has(`above`)&&(e.hiddenContentAbove=!0),r.has(`below`)&&(e.hiddenContentBelow=!0),(e.hiddenContentAbove||e.hiddenContentBelow)&&t.set(n,e)}return t}function oe(e,t){let n=t.get(e.index);if(!n||n.size===0)return e;let r=e.hiddenContentAbove===!0||n.has(`above`)?!0:void 0,i=e.hiddenContentBelow===!0||n.has(`below`)?!0:void 0;return{...e,hiddenContentAbove:r,hiddenContentBelow:i}}function se(e,t,n){let r=new Map;for(let i of e){let e=ce(i,t,n);if(!e)continue;let a=r.get(e)??[];a.push(i),r.set(e,a)}return[`above`,`below`].flatMap(e=>{let t=r.get(e);if(!t||t.length===0)return[];let n=ue(t).slice(0,3).map(e=>`"${e}"`),i=t.length===1?`interactive item`:`interactive items`,a=n.length>0?`: ${n.join(`, `)}`:``;return[`[off-screen ${e}] ${t.length} ${i}${a}`]})}function ce(e,t,n){if(!e.rect)return null;let r=O(e,t,n);return r?k(e.rect,r):null}function k(e,t){return e.y+e.height<=t.y?`above`:e.y>=t.y+t.height?`below`:null}function le(e){if(e.hittable===!0)return!0;let t=(e.type??``).toLowerCase();return t.includes(`button`)||t.includes(`link`)||t.includes(`textfield`)||t.includes(`edittext`)||t.includes(`searchfield`)||t.includes(`checkbox`)||t.includes(`radio`)||t.includes(`switch`)||t.includes(`menuitem`)||!!a(e)}function ue(e){let t=new Set,n=[];for(let r of e){let e=a(r);!e||t.has(e)||(t.add(e),n.push(e))}return n}function A(e,t,n){let r=e,i=new Set;for(;r&&!i.has(r.index);)i.add(r.index),t.add(r.index),r=typeof r.parentIndex==`number`?n.get(r.parentIndex):void 0}function j(e,t,n){return F(e,n,e=>t.has(e.index))}function M(e,t,n,r,i){for(let a of e){let e=N(a);if(!e||e.size===0)continue;let o=j(a,t,n);if(!o)continue;let s=r.get(o.index)??new Set,c=i.get(o.index);for(let t of e)c&&c.size>0&&!c.has(t)||s.add(t);r.set(o.index,s)}}function N(e){let t=s(e.label,e.value);if(!t)return null;let n=new Set;return t.above&&n.add(`above`),t.below&&n.add(`below`),n.size>0?n:null}function P(e,t){return F(e,t,e=>!!e.rect)?.rect??null}function F(e,t,n){let r=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0,i=new Set;for(;r&&!i.has(r.index);){if(i.add(r.index),n(r)&&C(r))return r;r=typeof r.parentIndex==`number`?t.get(r.parentIndex):void 0}return null}function I(e,t){let n=t.toLowerCase();return e.find(e=>{let t=(e.label??``).toLowerCase(),r=(e.value??``).toLowerCase(),i=(e.identifier??``).toLowerCase();return t.includes(n)||r.includes(n)||i.includes(n)})??null}function L(e,t){let n=[e.label,e.value,e.identifier].map(e=>typeof e==`string`?e.trim():``).find(e=>e&&e.length>0);return n&&R(n)?n:z(e,t)??(n&&R(n)?n:void 0)}function R(e){let t=e.trim();return!(!t||/^(true|false)$/i.test(t)||/^\d+$/.test(t))}function z(e,t){if(!e.rect)return;let n=e.rect.y+e.rect.height/2,r=null;for(let e of t){if(!e.rect)continue;let t=[e.label,e.value,e.identifier].map(e=>typeof e==`string`?e.trim():``).find(e=>e&&e.length>0);if(!t||!R(t))continue;let i=e.rect.y+e.rect.height/2,a=Math.abs(i-n);(!r||a<r.distance)&&(r={label:t,distance:a})}return r?.label}function B(e){let t=[],n=[];for(let r of e){let e=r.depth??0;for(;t.length>0&&e<=t[t.length-1];)t.pop();let i=h(r.type??``),a=[r.label,r.value,r.identifier].map(e=>typeof e==`string`?e.trim():``).find(e=>e&&e.length>0),o=a?R(a):!1;if((i===`group`||i===`ioscontentgroup`)&&!o){t.push(e);continue}let s=Math.max(0,e-t.length);n.push({...r,depth:s})}return n}function V(e,t){let n=h(e);return n?t===`android`?n.includes(`edittext`)||n.includes(`autocompletetextview`):n.includes(`textfield`)||n.includes(`securetextfield`)||n.includes(`searchfield`)||n.includes(`textview`)||n.includes(`textarea`)||n===`search`:!0}function H(e,t){return t.hittable?t:G(e,t,e=>e.hittable===!0)}function U(e){return new Map(e.map(e=>[e.index,e]))}function W(e,t,n,r){let i=t,a=new Set;for(;typeof i.parentIndex==`number`&&!a.has(i.index);){if(a.add(i.index),i=n.get(i.parentIndex)??e[i.parentIndex],!i)return null;let t=r(i);if(t!==null)return t}return null}function de(e,t,n,r){return!!W(e,t,r,e=>e===n||e.index===n.index?e:null)}function G(e,t,n){return W(e,t,U(e),e=>n(e)?e:null)}function K(e){return[e.label,e.value,e.identifier].map(e=>typeof e==`string`?e.trim():``).filter(e=>e.length>0)[0]??``}function fe(e){return l(e)}function q(e){return e.hittable===!0?!0:e.rect?e.rect.width>0&&e.rect.height>0:!1}function J(e,t){return V(e.type??``,t)&&e.enabled!==!1}function Y(e){return[`visible`,`hidden`,`exists`,`editable`,`selected`,`focused`,`text`].includes(e)}const pe=`is requires predicate: visible|hidden|exists|editable|selected|focused|text`,me=`Use "is <predicate> <selector>" or "is <selector> <predicate>". visible|hidden|editable|selected|focused double as selector keys: a bare predicate token after the selector is read as the predicate, so write key=true (e.g. visible=true) inside the selector to use it as a filter instead.`;function X(e){if(Y((e[0]??``).toLowerCase()))return e;for(let n=1;n<e.length;n+=1){let r=(e[n]??``).toLowerCase();if(Y(r)&&t(e.slice(0,n).join(` `)))return[r,...e.slice(0,n),...e.slice(n+1)]}return e}function he(e){let{predicate:t,node:n,nodes:r,expectedText:i,platform:a}=e,o=K(n),s=J(n,a),c=n.selected===!0,l=n.focused===!0,u=t===`text`?q(n):Z(n,r,a),d=!1;switch(t){case`visible`:d=u;break;case`hidden`:d=!u;break;case`editable`:d=s;break;case`selected`:d=c;break;case`focused`:d=l;break;case`text`:d=o===(i??``);break}let f=t===`text`?`expected="${i??``}" actual="${o}"`:`actual=${JSON.stringify({visible:u,editable:s,selected:c,focused:l})}`;return{pass:d,actualText:o,details:f}}function Z(e,t,n){if(n===`android`&&e.visibleToUser===!1)return!1;if($(e.rect))return Q(e,t);if(e.rect)return!1;if(n!==`android`&&e.hittable===!0)return!0;let r=ge(e,t,n);return r?$(r.rect)?Q(r,t):n!==`android`&&r.hittable===!0:!1}function Q(e,t){return D(e,t)}function ge(e,t,n){return W(t,e,U(t),e=>_e(e,n)?e:null)}function _e(e,t){if(t===`android`&&e.visibleToUser===!1)return!1;let n=h(e.type??``);return n.includes(`application`)||n.includes(`window`)||n.includes(`scrollview`)||n.includes(`tableview`)||n.includes(`collectionview`)||n===`table`||n===`list`||n===`listview`?!1:t===`android`?e.hittable===!0&&$(e.rect):e.hittable===!0||$(e.rect)}function $(e){return!!(e&&Number.isFinite(e.x)&&Number.isFinite(e.y)&&Number.isFinite(e.width)&&Number.isFinite(e.height)&&e.width>0&&e.height>0)}function ve(e){let t=X(e),r=t[0]??``;return{predicate:r,split:n(t.slice(1),{preferTrailingValue:r===`text`})}}export{d as A,r as B,ne as C,y as D,S as E,m as F,s as I,o as L,l as M,h as N,b as O,g as P,i as R,D as S,C as T,V as _,Y as a,w as b,q as c,K as d,G as f,de as g,W as h,he as i,f as j,_ as k,U as l,I as m,pe as n,X as o,H as p,me as r,J as s,ve as t,fe as u,B as v,O as w,T as x,L as y,a as z};
|
|
1
|
+
import{u as e}from"./sdk-contracts.js";import{T as t,w as n}from"./sdk-batch.js";function r(e){let t=new Map;for(let[n,r]of e.entries())t.set(r.index,n);let n=[],r=[];for(let[i,a]of e.entries()){let e=Math.max(0,a.depth??0);for(;r.length>0&&e<=r[r.length-1].depth;)r.pop();let o=i,s=typeof a.parentIndex==`number`?t.get(a.parentIndex):void 0,c=typeof s==`number`&&s<o?s:r[r.length-1]?.index;n.push({...a,index:o,depth:e,parentIndex:c}),r.push({depth:e,index:o})}return n}function i(e){return new Map(e.map(e=>[e.index,e]))}function a(e){return e.label?.trim()||e.value?.trim()||e.identifier?.trim()||``}function o(e){let t=e.trim().toLowerCase();return t?/^(vertical|horizontal)\s+scroll\s+bar(?:,?\s*\d+\s+pages?)?$/.test(t):!1}function s(e,t){if(!(e?.trim().toLowerCase()??``).includes(`vertical scroll bar`))return null;let n=c(t);return n===null?null:n<=1?{above:!1,below:!0}:n>=99?{above:!0,below:!1}:{above:!0,below:!0}}function c(e){if(!e)return null;let t=/^(\d{1,3})%$/.exec(e.trim());if(!t)return null;let n=Number(t[1]);return Number.isFinite(n)?Math.max(0,Math.min(100,n)):null}function l(e){let t=m(e.label),n=m(e.value),r=m(e.identifier),i=ee(r)?r:``;return g(e.type??``)?n||t||i:t||n||i}function u(e,t){if(t===`text-view`||t===`text-field`||t===`search`)return!0;let n=h(e.type??``),r=`${e.role??``} ${e.subrole??``}`.toLowerCase();return n.includes(`textview`)||n.includes(`textarea`)||n.includes(`textfield`)||n.includes(`securetextfield`)||n.includes(`searchfield`)||n.includes(`edittext`)||r.includes(`text area`)||r.includes(`text field`)}function d(e){let t=e.replace(/\s+/g,` `).trim();return t.length<=48?t:`${t.slice(0,45)}...`}function f(e,t){let n=l(e),r=u(e,t);return{text:n,isLargeSurface:r,shouldSummarize:r&&p(n)}}function p(e){return e?e.length>80||/[\r\n]/.test(e):!1}function m(e){return typeof e==`string`?e.trim():``}function h(e){let t=e.trim().replace(/XCUIElementType/gi,``).replace(/^AX/,``).toLowerCase(),n=Math.max(t.lastIndexOf(`.`),t.lastIndexOf(`/`));return n!==-1&&(t=t.slice(n+1)),t}function g(e){let t=h(e);return t.includes(`textfield`)||t.includes(`securetextfield`)||t.includes(`searchfield`)||t.includes(`edittext`)||t.includes(`textview`)||t.includes(`textarea`)}function ee(e){return e?!/^[\w.]+:id\/[\w.-]+$/i.test(e)&&!/^_?NS:\d+$/i.test(e):!1}function _(t,n){let r=e(n),i=t.filter(e=>te(e.rect)),a=i.filter(e=>{let t=(e.type??``).toLowerCase();return t.includes(`application`)||t.includes(`window`)});return b(a.map(e=>e.rect).filter(e=>y(e,r.x,r.y)))||b(a.map(e=>e.rect))||b(i.map(e=>e.rect).filter(e=>y(e,r.x,r.y)))||null}function v(e,t){return x(e.x,e.x+e.width,t.x,t.x+t.width)&&x(e.y,e.y+e.height,t.y,t.y+t.height)}function te(e){return e?Number.isFinite(e.x)&&Number.isFinite(e.y)&&Number.isFinite(e.width)&&Number.isFinite(e.height):!1}function y(e,t,n){return t>=e.x&&t<=e.x+e.width&&n>=e.y&&n<=e.y+e.height}function b(e){let t=null,n=-1;for(let r of e){let e=r.width*r.height;e>n&&(t=r,n=e)}return t}function x(e,t,n,r){return Math.max(e,n)<=Math.min(t,r)}function S(e){let t=`${e??``}`.toLowerCase();return t.includes(`scroll`)||t.includes(`recyclerview`)||t.includes(`listview`)||t.includes(`gridview`)||t.includes(`collectionview`)||t===`table`}function C(e){return S(e.type)?!0:`${e.role??``} ${e.subrole??``}`.toLowerCase().includes(`scroll`)}function w(e){if(e.length===0)return{nodes:e,hiddenCount:0,summaryLines:[]};let{byIndex:t,visibleNodeIndexes:n,offscreenNodes:r,hintedContainers:i}=E(e),a=n.size===0?e:e.filter(e=>n.has(e.index));return{nodes:a.map(e=>oe(e,i.directionsByContainer)),hiddenCount:n.size===0?0:e.length-a.length,summaryLines:se(r.filter(e=>!i.coveredNodeIndexes.has(e.index)&&le(e)),e,t)}}function T(e){if(e.length===0)return new Map;let{hintedContainers:t}=E(e);return ae(t.directionsByContainer)}function E(e){let t=i(e),n=new Set,r=[];for(let i of e){if(D(i,e,t)){A(i,n,t);continue}r.push(i)}return{byIndex:t,visibleNodeIndexes:n,offscreenNodes:r,hintedContainers:ie(e,r,n,t)}}function D(e,t,n=i(t)){if(!e.rect)return!0;let r=O(e,t,n);return r?v(e.rect,r):!0}function ne(e,t,n=i(t)){if(!e.rect)return!0;if(!D(e,t,n))return!1;let r=_(t,e.rect);return re(e.rect,r)}function re(e,t){return!t||t.width<=0||t.height<=0?!0:y(t,e.x+e.width/2,e.y+e.height/2)}function O(e,t,n=i(t)){return P(e,n)||_(t,e.rect??{x:0,y:0,width:0,height:0})}function ie(e,t,n,r){let i=new Map,a=new Map,o=new Set;for(let e of t){if(!e.rect)continue;let t=j(e,n,r);if(!t?.rect)continue;let s=k(e.rect,t.rect);if(!s)continue;let c=i.get(t.index)??new Set;c.add(s),i.set(t.index,c);let l=a.get(t.index)??new Set;l.add(s),a.set(t.index,l),o.add(e.index)}return M(e,n,r,i,a),{directionsByContainer:i,coveredNodeIndexes:o}}function ae(e){let t=new Map;for(let[n,r]of e){let e={};r.has(`above`)&&(e.hiddenContentAbove=!0),r.has(`below`)&&(e.hiddenContentBelow=!0),(e.hiddenContentAbove||e.hiddenContentBelow)&&t.set(n,e)}return t}function oe(e,t){let n=t.get(e.index);if(!n||n.size===0)return e;let r=e.hiddenContentAbove===!0||n.has(`above`)?!0:void 0,i=e.hiddenContentBelow===!0||n.has(`below`)?!0:void 0;return{...e,hiddenContentAbove:r,hiddenContentBelow:i}}function se(e,t,n){let r=new Map;for(let i of e){let e=ce(i,t,n);if(!e)continue;let a=r.get(e)??[];a.push(i),r.set(e,a)}return[`above`,`below`].flatMap(e=>{let t=r.get(e);if(!t||t.length===0)return[];let n=ue(t).slice(0,3).map(e=>`"${e}"`),i=t.length===1?`interactive item`:`interactive items`,a=n.length>0?`: ${n.join(`, `)}`:``;return[`[off-screen ${e}] ${t.length} ${i}${a}`]})}function ce(e,t,n){if(!e.rect)return null;let r=O(e,t,n);return r?k(e.rect,r):null}function k(e,t){return e.y+e.height<=t.y?`above`:e.y>=t.y+t.height?`below`:null}function le(e){if(e.hittable===!0)return!0;let t=(e.type??``).toLowerCase();return t.includes(`button`)||t.includes(`link`)||t.includes(`textfield`)||t.includes(`edittext`)||t.includes(`searchfield`)||t.includes(`checkbox`)||t.includes(`radio`)||t.includes(`switch`)||t.includes(`menuitem`)||!!a(e)}function ue(e){let t=new Set,n=[];for(let r of e){let e=a(r);!e||t.has(e)||(t.add(e),n.push(e))}return n}function A(e,t,n){let r=e,i=new Set;for(;r&&!i.has(r.index);)i.add(r.index),t.add(r.index),r=typeof r.parentIndex==`number`?n.get(r.parentIndex):void 0}function j(e,t,n){return F(e,n,e=>t.has(e.index))}function M(e,t,n,r,i){for(let a of e){let e=N(a);if(!e||e.size===0)continue;let o=j(a,t,n);if(!o)continue;let s=r.get(o.index)??new Set,c=i.get(o.index);for(let t of e)c&&c.size>0&&!c.has(t)||s.add(t);r.set(o.index,s)}}function N(e){let t=s(e.label,e.value);if(!t)return null;let n=new Set;return t.above&&n.add(`above`),t.below&&n.add(`below`),n.size>0?n:null}function P(e,t){return F(e,t,e=>!!e.rect)?.rect??null}function F(e,t,n){let r=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0,i=new Set;for(;r&&!i.has(r.index);){if(i.add(r.index),n(r)&&C(r))return r;r=typeof r.parentIndex==`number`?t.get(r.parentIndex):void 0}return null}function I(e,t){let n=t.toLowerCase();return e.find(e=>{let t=(e.label??``).toLowerCase(),r=(e.value??``).toLowerCase(),i=(e.identifier??``).toLowerCase();return t.includes(n)||r.includes(n)||i.includes(n)})??null}function L(e,t){let n=[e.label,e.value,e.identifier].map(e=>typeof e==`string`?e.trim():``).find(e=>e&&e.length>0);return n&&R(n)?n:z(e,t)??(n&&R(n)?n:void 0)}function R(e){let t=e.trim();return!(!t||/^(true|false)$/i.test(t)||/^\d+$/.test(t))}function z(e,t){if(!e.rect)return;let n=e.rect.y+e.rect.height/2,r=null;for(let e of t){if(!e.rect)continue;let t=[e.label,e.value,e.identifier].map(e=>typeof e==`string`?e.trim():``).find(e=>e&&e.length>0);if(!t||!R(t))continue;let i=e.rect.y+e.rect.height/2,a=Math.abs(i-n);(!r||a<r.distance)&&(r={label:t,distance:a})}return r?.label}function B(e){let t=[],n=[];for(let r of e){let e=r.depth??0;for(;t.length>0&&e<=t[t.length-1];)t.pop();let i=h(r.type??``),a=[r.label,r.value,r.identifier].map(e=>typeof e==`string`?e.trim():``).find(e=>e&&e.length>0),o=a?R(a):!1;if((i===`group`||i===`ioscontentgroup`)&&!o){t.push(e);continue}let s=Math.max(0,e-t.length);n.push({...r,depth:s})}return n}function V(e,t){let n=h(e);return n?t===`android`?n.includes(`edittext`)||n.includes(`autocompletetextview`):n.includes(`textfield`)||n.includes(`securetextfield`)||n.includes(`searchfield`)||n.includes(`textview`)||n.includes(`textarea`)||n===`search`:!0}function H(e,t){return t.hittable?t:G(e,t,e=>e.hittable===!0)}function U(e){return new Map(e.map(e=>[e.index,e]))}function W(e,t,n,r){let i=t,a=new Set;for(;typeof i.parentIndex==`number`&&!a.has(i.index);){if(a.add(i.index),i=n.get(i.parentIndex)??e[i.parentIndex],!i)return null;let t=r(i);if(t!==null)return t}return null}function de(e,t,n,r){return!!W(e,t,r,e=>e===n||e.index===n.index?e:null)}function G(e,t,n){return W(e,t,U(e),e=>n(e)?e:null)}function K(e){return[e.label,e.value,e.identifier].map(e=>typeof e==`string`?e.trim():``).filter(e=>e.length>0)[0]??``}function fe(e){return l(e)}function q(e){return e.hittable===!0?!0:e.rect?e.rect.width>0&&e.rect.height>0:!1}function J(e,t){return V(e.type??``,t)&&e.enabled!==!1}function Y(e){return[`visible`,`hidden`,`exists`,`editable`,`selected`,`focused`,`text`].includes(e)}const pe=`is requires predicate: visible|hidden|exists|editable|selected|focused|text`,me=`Use "is <predicate> <selector>" or "is <selector> <predicate>". visible|hidden|editable|selected|focused double as selector keys: a bare predicate token after the selector is read as the predicate, so write key=true (e.g. visible=true) inside the selector to use it as a filter instead.`;function X(e){if(Y((e[0]??``).toLowerCase()))return e;for(let n=1;n<e.length;n+=1){let r=(e[n]??``).toLowerCase();if(Y(r)&&t(e.slice(0,n).join(` `)))return[r,...e.slice(0,n),...e.slice(n+1)]}return e}function he(e){let{predicate:t,node:n,nodes:r,expectedText:i,platform:a}=e,o=K(n),s=J(n,a),c=n.selected===!0,l=n.focused===!0,u=t===`text`?q(n):Z(n,r,a),d=!1;switch(t){case`visible`:d=u;break;case`hidden`:d=!u;break;case`editable`:d=s;break;case`selected`:d=c;break;case`focused`:d=l;break;case`text`:d=o===(i??``);break}let f=t===`text`?`expected="${i??``}" actual="${o}"`:`actual=${JSON.stringify({visible:u,editable:s,selected:c,focused:l})}`;return{pass:d,actualText:o,details:f}}function Z(e,t,n){if(n===`android`&&e.visibleToUser===!1)return!1;if($(e.rect))return Q(e,t);if(e.rect)return!1;if(n!==`android`&&e.hittable===!0)return!0;let r=ge(e,t,n);return r?$(r.rect)?Q(r,t):n!==`android`&&r.hittable===!0:!1}function Q(e,t){return D(e,t)}function ge(e,t,n){return W(t,e,U(t),e=>_e(e,n)?e:null)}function _e(e,t){if(t===`android`&&e.visibleToUser===!1)return!1;let n=h(e.type??``);return n.includes(`application`)||n.includes(`window`)||n.includes(`scrollview`)||n.includes(`tableview`)||n.includes(`collectionview`)||n===`table`||n===`list`||n===`listview`?!1:t===`android`?e.hittable===!0&&$(e.rect):e.hittable===!0||$(e.rect)}function $(e){return!!(e&&Number.isFinite(e.x)&&Number.isFinite(e.y)&&Number.isFinite(e.width)&&Number.isFinite(e.height)&&e.width>0&&e.height>0)}function ve(e){let t=X(e),r=t[0]??``;return{predicate:r,split:n(t.slice(1),{preferTrailingValue:r===`text`})}}export{d as A,r as B,ne as C,y as D,S as E,m as F,s as I,o as L,l as M,h as N,b as O,g as P,i as R,D as S,C as T,V as _,Y as a,w as b,q as c,K as d,G as f,de as g,W as h,he as i,f as j,_ as k,U as l,I as m,pe as n,X as o,H as p,me as r,J as s,ve as t,fe as u,B as v,O as w,T as x,L as y,a as z};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{B as e,D as t,F as n,I as r,M as i,N as a,T as o,b as s,f as c,m as l,p as u}from"./sdk-contracts.js";import{j as d}from"./sdk-android-adb.js";import{S as f,v as p}from"./sdk-batch.js";import{J as ee,m}from"./tv-remote.js";import{N as h,P as te,a as ne,i as re,m as ie,n as ae,r as oe,t as se,u as ce}from"./sdk-selectors.js";import{t as le}from"./snapshot-quality.js";import{a as ue}from"./sdk-finders.js";import"./selectors2.js";import{n as de,t as fe}from"./runtime.js";import{r as pe}from"./app-lifecycle.js";import{c as me,f as he,i as g}from"./runner-client.js";import{$t as _,Gt as ge,Ht as v,Mt as y,Ot as _e,Pt as b,en as ve,jt as x,kt as ye,ln as S,tn as C,zt as be}from"./internal/daemon.js";import{a as w,t as T}from"./apple-runner-options.js";import{o as xe}from"./apps.js";function E(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}}async function D(e){let{device:t,node:n,flags:r,appBundleId:i,traceOutPath:a,surface:o,contextFromFlags:s}=e,c=ce(n),l=ee(n.rect);if(!l||u(t)&&c&&!te(n.type??``))return c;try{let e=await ge(t,`read`,[String(l.x),String(l.y)],void 0,{...s(r,i,a),surface:o}),u=e&&typeof e==`object`?e:void 0,f=typeof u?.text==`string`?u.text:``;return f.trim()?f:(d({level:`warn`,phase:`interaction_read_fallback`,data:{reason:`empty_backend_text`,nodeRef:n.ref,surface:o,platform:t.platform}}),c)}catch(e){return d({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}}async function O(e,t,n){let r=e.get(t),i=r?.device??await S(n??{});return r||await w(i),{session:r,device:i}}async function k(e,t,n){let r=!e&&u(t);try{return await n()}finally{r&&(await me(t.id),await Se(t))}}async function Se(e){let t=he();await xe(e,t).catch(n=>{d({level:`debug`,phase:`ios_sessionless_runner_host_close_failed`,data:{deviceId:e.id,bundleId:t,error:n instanceof Error?n.message:String(n)}})})}function Ce(e,t,n,r){t&&e.recordAction(t,{command:n.command,positionals:n.positionals??[],flags:n.flags??{},result:r})}function we(e){let{session:t,sessionName:n,device:r,snapshot:i,appBundleId:a}=e;return t?{...t,snapshot:i,lastComparisonSafeSnapshot:i?.comparisonSafe===!0?i:t.lastComparisonSafeSnapshot}:{name:n,device:r,createdAt:Date.now(),appBundleId:a,snapshot:i,...i?.comparisonSafe===!0?{lastComparisonSafeSnapshot:i}:{},actions:[]}}const Te=[[`snapshotDepth`,`--depth`],[`snapshotScope`,`--scope`],[`snapshotRaw`,`--raw`]];function A(e,t){let n=Ee(t);return n.length===0?null:_(`INVALID_ARGS`,`${e} @ref does not support ${n.join(`, `)}.`)}function Ee(e){if(!e)return[];let t=[];for(let[n,r]of Te)e[n]!==void 0&&t.push(r);return t}function De(e,t){if(!t||t.settle===!0)return null;let n=[];return t.settleQuietMs!==void 0&&n.push(`--settle-quiet`),n.length===0?null:_(`INVALID_ARGS`,`${e}: ${n.join(`, `)} require${n.length===1?`s`:``} --settle.`)}function Oe(e){if(e?.settle===!0)return{...e.settleQuietMs===void 0?{}:{quietMs:e.settleQuietMs},...e.timeoutMs===void 0?{}:{timeoutMs:e.timeoutMs}}}function j(e){let t=a(e);return t?{ok:!0,ref:t.base,generation:t.generation}:{ok:!1,response:_(`INVALID_ARGS`,`Invalid ref "${e}" — malformed generation suffix.`,{hint:o})}}function ke(e,t){let n=E(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:_(`INVALID_ARGS`,`${t} requires @ref, selector expression, or x y coordinates`)}}function Ae(e){let t=E(e);if(t)return{ok:!0,target:{kind:`point`,x:t.x,y:t.y},...Le(e[2])};let n=Ie(e),r=ke(n.targetPositionals,`longpress`);return r.ok?{ok:!0,target:r.target,refGeneration:r.refGeneration,...n.duration}:r}function je(e){let t=e[0]??``;if(t.startsWith(`@`)){let n=j(t);if(!n.ok)return{ok:!1,response:n.response};let r=m(e).text;return r?{ok:!0,target:{kind:`ref`,ref:n.ref,fallbackLabel:Fe(e)},refGeneration:n.generation,text:r}:{ok:!1,response:_(`INVALID_ARGS`,`fill requires text after ref`)}}let n=E(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:_(`INVALID_ARGS`,`fill requires text after coordinates`)}}let r=Me(e);return!r||r.kind!==`selector`?{ok:!1,response:_(`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:_(`INVALID_ARGS`,`fill requires text after selector`)}}function Me(e){try{return m(e)}catch{return null}}function Ne(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}: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}:{evidence:t,settle:n}}function Pe(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 Fe(e){return e.length>=3&&e[1]?.trim()||``}function Ie(e){let t=e.at(-1);return e.length>1&&Re(t)?{targetPositionals:e.slice(0,-1),duration:{durationMs:Number(t)}}:{targetPositionals:e,duration:{}}}function Le(e){return e===void 0?{}:{durationMs:Number(e)}}function Re(e){return e===void 0||e.trim()===``?!1:Number.isFinite(Number(e))}async function ze(e,t){let r=await N(e);if(r)throw new n(`COMMAND_FAILED`,`press ${t} left ${e.appBundleId} and foregrounded ${r.foregroundPackage}. The tap likely escaped the app.`,r)}async function N(e){if(e.device.platform!==`android`||!e.appBundleId)return null;let t=await pe(e.device),n=t.package?.trim();return!n||n===e.appBundleId||!Ue(n)?null:{expectedPackage:e.appBundleId,foregroundPackage:n,activity:t.activity,hint:He(n)}}function Be(e){return e.foregroundPackage===`com.google.android.permissioncontroller`?`Android permission dialog is blocking ${e.expectedPackage}`:`${e.foregroundPackage} is foreground instead of ${e.expectedPackage}`}function Ve(e){return e.code===`COMMAND_FAILED`&&typeof e.details?.expectedPackage==`string`&&typeof e.details?.foregroundPackage==`string`}function He(e){return e===`com.google.android.permissioncontroller`?`Dismiss or allow the permission prompt, then retry the smoke assertion.`:`Use screenshot as visual truth, then take a fresh snapshot -i before retrying.`}function Ue(e){return e===`com.android.settings`||e===`com.android.systemui`||e===`com.google.android.permissioncontroller`||e.includes(`launcher`)}function We(e,t){if(t===`exists`)return{found:!0};if(t===`wait`)return{found:!0,waitedMs:e.waitedMs};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 Ge(e){return e.kind===`found`?{found:!0,...typeof e.waitedMs==`number`?{waitedMs:e.waitedMs}:{}}:{...typeof e.ref==`string`?{ref:e.ref}:{},...typeof e.text==`string`?{text:e.text}:{},...e.node&&typeof e.node==`object`?{node:e.node}:{}}}function P(e,t){let n=Array.isArray(e.selectorChain)?e.selectorChain:void 0,r=R(e),i=r?.kind===`ref`?z(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 F(e){let t=R(e);return{...t?.kind===`ref`?{ref:z(t.ref)}:{},...t?.kind===`selector`?{selector:t.selector}:{},...typeof e.text==`string`?{text:e.text}:{},...e.node&&typeof e.node==`object`?{node:e.node}:{}}}function Ke(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 I(e){let{selectorChain:t,...n}=e;return n}function L(e,t,n,r){let i=e.get(t);i&&e.recordAction(i,{command:n.command,positionals:n.positionals??[],flags:n.flags??{},result:r})}function qe(e){let t=e.trim();if(!(!t||t.length>80||/[\r\n]/.test(t)))return t}function R(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 z(e){return e.startsWith(`@`)?e.slice(1):e}const Je=[`application`,`window`,`tabbar`,`scrollbar`,`image`],Ye=new Set([`tab bar`]);async function B(e,t){if(t.ok||!Xe(t.error.message)||t.error.details?.captureStalled===!0)return t;let n=await Ze(e).catch(()=>null);return n?_(t.error.code,`${t.error.message}. Current surface: ${n.summary}.`,{...t.error.details??{},currentSurface:n.details}):t}function Xe(e){return/^wait timed out (?:for (?:selector|text): |waiting for a stable UI)/i.test(e)}async function Ze(e){let t=[...(await b({device:e.device,session:e.session,flags:{...e.req.flags,snapshotInteractiveOnly:!0},logPath:e.logPath??``})).snapshot.nodes].sort(Qe),n=V(t,6,{includeIdentifiers:!0});if(n.length===0)return null;let r=V(t.filter(e=>!W(e)),4,{includeIdentifiers:!1}),i=V(t.filter(et),4,{includeIdentifiers:!0});return{summary:(r.length>0?r:n.slice(0,4)).join(`, `),details:{labels:n,...i.length>0?{buttons:i}:{}}}}function V(e,t,n){let r=new Set,i=[];for(let a of e){let e=U(a,n);if(!(!e||r.has(e))&&(r.add(e),i.push(e),i.length>=t))break}return i}function Qe(e,t){return H(e)-H(t)||$e(e,t)}function H(e){let t=!!U(e,{includeIdentifiers:!1});return(W(e)?2:0)+ +!t}function $e(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 U(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 W(e){let t=h(`${e.type??``} ${e.role??``} ${e.subrole??``}`),n=`${e.label??``} ${e.value??``}`.trim().toLowerCase();return Je.some(e=>t.includes(e))||Ye.has(n)||n.endsWith(`.fill`)}function et(e){return h(`${e.type??``} ${e.role??``} ${e.subrole??``}`).includes(`button`)}function G(e){let{session:t,selectorExpression:n}=e;if(!t||!u(t.device)||t.postGestureStabilization)return null;let r=f(n);if(!r||r.selectors.length!==1)return null;let i=r.selectors[0];if(!i||i.terms.length!==1)return null;let a=i.terms[0];return!a||typeof a.value!=`string`||!tt(a.key)?null:{key:a.key,value:a.value,raw:i.raw}}function tt(e){return e===`id`||e===`label`||e===`text`||e===`value`}function K(e,t={}){let n=r(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!0;if(n.code!==`COMMAND_FAILED`)return!1;let i=n.message.toLowerCase();return i.includes(`fetch failed`)||i.includes(`timed out`)||i.includes(`timeout`)||i.includes(`runner did not accept connection`)||i.includes(`invalid runner response`)}function nt(e,t={}){let r=t.plural===!0?`do`:`does`;return{resolveInput:async()=>{throw new n(`UNSUPPORTED_OPERATION`,`${e} ${r} not resolve input artifacts`)},reserveOutput:async()=>{throw new n(`UNSUPPORTED_OPERATION`,`${e} ${r} not reserve output artifacts`)},createTempFile:async()=>{throw new n(`UNSUPPORTED_OPERATION`,`${e} ${r} not create temporary files`)}}}function rt(e,t={}){return{artifacts:nt(e,t),policy:de()}}function q(e){let{session:t,sessionStore:n,sessionName:r}=e,i=0,a,o;return{capture:async s=>{let c=Date.now(),l=pt(s,e.req.flags?.out),u=st({timestamp:c,lastSnapshotAt:i,lastSnapshotResult:a,lastSnapshotCacheKey:o,session:t,request:s,cacheKey:l});if(u)return u;let d=ct({session:t,timestamp:c,request:s});if(d)return i=d.createdAt,a={snapshot:d},o=l,a;let f=await it({params:e,request:s}),p={snapshot:f};return ht({session:t,sessionStore:n,sessionName:r,snapshot:f}),i=c,a=p,o=l,p}}}async function it(e){let{params:t,request:n}=e,r=await J(t,n,n.snapshotScope);return n.recovery?.legacyIosSparse&>(r)?await at({runtimeParams:t,request:n,policy:n.recovery.legacyIosSparse}):n.recovery?.sparseVerdictQueryScope?.shouldScope&&le(r.snapshotQuality)?await ot({runtimeParams:t,request:n,policy:n.recovery.sparseVerdictQueryScope,snapshot:r}):r}async function at(e){let{runtimeParams:t,request:n,policy:r}=e;try{return await J(t,n,r.scope,!1)}catch(e){if(!r.shouldScope)throw e;return await J(t,n,r.query,!1)}}async function ot(e){let{runtimeParams:t,request:n,policy:r,snapshot:i}=e;try{return await J(t,n,r.query,!1)}catch{return i}}async function J(e,t,n,r=t.flags?.snapshotInteractiveOnly){return(await b({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})).snapshot}function st(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)&&!v(a)&&!dt(a,o))return r}function ct(e){let{session:t,timestamp:n,request:r}=e,i=t?.snapshot;if(i&<(t,r)&&ut(i,n)&&i.presentationKey===ft(r))return i}function lt(e,t){return!(t.cache?.forceFresh===!0||t.cache?.useSessionSnapshot!==!0||v(e)||dt(e,t))}function ut(e,t){return t-e.createdAt<750}function dt(e,t){return t.cache?.bypassForPostGestureStabilization===!0&&!!e?.postGestureStabilization}function ft(e){return t(i(mt(e)))}function pt(e,t){return JSON.stringify({presentationKey:ft(e),includeRects:e.includeRects===!0,outPath:e.outPath??t??null})}function mt(e){return e.snapshotScope===void 0?e.flags:{...e.flags,snapshotScope:e.snapshotScope}}function ht(e){let{session:t,sessionStore:n,sessionName:r,snapshot:i}=e;!t||le(i.snapshotQuality)||(y(t,i),n.set(r,t))}function gt(e){return e.snapshotQuality||e.backend!==`xctest`||e.nodes.length!==1?!1:e.nodes[0]?.type===`Application`}function _t(e){return fe({backend:vt(e),...rt(`selector commands`,{plural:!0}),sessions:_e({sessionName:e.sessionName,getSession:()=>e.session,recordOptions:{includeSnapshot:!0},setRecord:t=>{!e.session||!t.snapshot||(y(e.session,t.snapshot),e.sessionStore.set(e.sessionName,e.session))}})})}async function Y(e,t){let n=e.sessionStore.get(e.sessionName);if(!n&&t.requireSession)return{ok:!1,response:ve()};let r=n?.device??await S(e.req.flags??{});n||await w(r);let i=C(t.capability,r);return i?{ok:!1,response:i}:{ok:!0,runtime:_t({...e,session:n,device:r})}}function vt(e){let{req:t,session:n,device:r,logPath:i,sessionName:a,sessionStore:o}=e,c=q({device:r,session:n,sessionStore:o,sessionName:a,req:t,logPath:i});return{platform:s(r),captureSnapshot:async(e,n)=>{let i={...t.flags,...yt(n)},a=n?.includeRects===!0,o=n?.scope??t.flags?.snapshotScope,s=t.command===`wait`||t.command===`find`||a&&r.platform===`web`;return await c.capture({flags:i,snapshotScope:o,includeRects:a,cache:{forceFresh:s,useSessionSnapshot:!0,bypassForPostGestureStabilization:!0}})},readText:async(a,o)=>({text:await D({device:r,node:o,flags:t.flags,appBundleId:n?.appBundleId,traceOutPath:n?.trace?.outPath,surface:n?.surface,contextFromFlags:e.contextFromFlags??((e,t,n)=>be(i??``,e,t,n))})}),findText:async(t,n)=>({found:await bt(e,n)})}}function yt(e){let t={};return e?.interactiveOnly!==void 0&&(t.snapshotInteractiveOnly=e.interactiveOnly),e?.scope!==void 0&&(t.snapshotScope=e.scope),e?.depth!==void 0&&(t.snapshotDepth=e.depth),e?.raw!==void 0&&(t.snapshotRaw=e.raw),t}async function bt(e,t){let n=await xt(e,t);if(n!==null)return n;let r=await St(e,t);return r===null?await Tt(e,t):r}async function xt(e,t){return!l(e.device)||!e.session?.surface||e.session.surface===`app`?null:await Tt(e,t)}async function St(e,t){let n=Ct(e);return n?(await g(n.device,{command:`findText`,text:t,appBundleId:n.appBundleId},wt(e,n)))?.found===!0:null}function Ct(e){return!c(e.device.platform)||!e.session?.appBundleId?null:{device:e.device,appBundleId:e.session.appBundleId,traceLogPath:e.session.trace?.outPath}}function wt(e,t){return T({req:e.req,logPath:e.logPath,traceLogPath:t.traceLogPath})}async function Tt(e,t){return!!ie((await Et(e)).nodes,t)}async function Et(e){let{snapshot:t}=await q({device:e.device,session:e.session,sessionStore:e.sessionStore,sessionName:e.sessionName,req:e.req,logPath:e.logPath}).capture({flags:{...e.req.flags,snapshotInteractiveOnly:!1},cache:{forceFresh:!0,bypassForPostGestureStabilization:!0}});return t}async function Dt(e){let{req:t}=e;if(t.command!==`find`)return null;let n=t.positionals??[];if(n.length===0)return _(`INVALID_ARGS`,`find requires a locator or text`);let r=ue(n);if(!r.query)return _(`INVALID_ARGS`,`find requires a value`);if(t.flags?.findFirst&&t.flags?.findLast)return _(`INVALID_ARGS`,`find accepts only one of --first or --last`);let i=r.action;if(!Vt(i))return null;let a=await Y(e,{requireSession:!1,capability:`find`});return a.ok?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});L(e.sessionStore,e.sessionName,t,We(n,i));let o=Ge(n);if(typeof o.ref==`string`){let t=e.sessionStore.get(e.sessionName);if(t&&(ye(t),e.sessionStore.set(e.sessionName,t),t.snapshotGeneration!==void 0))return{...o,refsGeneration:t.snapshotGeneration}}return o}):a.response}async function Ot(e){let{req:t}=e;if(t.command!==`get`)return null;let n=t.positionals?.[0];if(n!==`text`&&n!==`attrs`)return _(`INVALID_ARGS`,`get only supports text or attrs`);let r=zt(t);if(!r.ok)return r.response;if(r.target.kind===`ref`){let e=A(`get`,t.flags);if(e)return e}if(r.target.kind===`selector`){let t=await jt(e,n,r.target.selector);if(t)return t}let i=await Y(e,{requireSession:!0,capability:`get`});if(!i.ok)return i.response;let a=r.target.kind===`ref`?x({session:e.sessionStore.get(e.sessionName),ref:r.target.ref,mintedGeneration:r.refGeneration}):void 0;return await Q(async()=>{let o=await i.runtime.selectors.get({session:e.sessionName,requestId:t.meta?.requestId,property:n,target:r.target});L(e.sessionStore,e.sessionName,t,P(o,n));let s=F(o);return a?{...s,warning:a}:s})}async function kt(e){let{req:t}=e;if(t.command!==`is`)return null;let{predicate:n,split:r}=se(t.positionals??[]),i=n.toLowerCase();if(!ne(i))return _(`INVALID_ARGS`,ae,{hint:oe});if(!r)return _(`INVALID_ARGS`,`is requires a selector expression`);let a=r.rest.join(` `).trim();if(i===`text`&&!a)return _(`INVALID_ARGS`,`is text requires expected text value`);if(i!==`text`&&r.rest.length>0)return _(`INVALID_ARGS`,`is ${i} does not accept trailing values`);let o=await Mt(e,i,r.selectorExpression,a);if(o)return o;let s=await Y(e,{requireSession:!0,capability:`is`});return s.ok?await $(e,await Q(async()=>{let n=await s.runtime.selectors.is({session:e.sessionName,requestId:t.meta?.requestId,predicate:i,selector:r.selectorExpression,expectedText:a});return L(e.sessionStore,e.sessionName,t,n),I(n)}),`is ${i}`):s.response}async function At(e){let{req:t,sessionName:n,sessionStore:r}=e,i=p(t.positionals??[]);if(!i)return _(`INVALID_ARGS`,`wait requires a duration or text`);let{session:a,device:o}=await O(r,n,t.flags);if(i.kind!==`sleep`){let e=C(`wait`,o);if(e)return e}if(i.kind===`selector`){let t=await Nt({...e,session:a,device:o,selectorExpression:i.selectorExpression,timeoutMs:i.timeoutMs});if(t)return t}let s=i,c;if(i.kind===`ref`){let e=j(i.rawRef);if(!e.ok)return e.response;s={...i,rawRef:e.ref},c=x({session:a,ref:e.ref,mintedGeneration:e.generation})}let l=async()=>{let i=_t({...e,session:a,device:o}),l=await Q(async()=>{let e=await i.selectors.wait({session:n,requestId:t.meta?.requestId,target:Bt(s,a)});L(r,n,t,e);let o=Ke(e);return c?{...o,warning:c}:o});return await $(e,await B({req:t,logPath:e.logPath,session:a,device:o},l),`wait`)};return i.kind===`sleep`?await l():await k(a,o,l)}async function jt(e,t,n){let r=e.sessionStore.get(e.sessionName),i=G({session:r,selectorExpression:n});if(!r||!i||t===`text`&&i.key!==`id`)return null;let a=await X(e,r,i);if(Z(a))return a.response;if(!a)return null;let o={session:r,selector:i,result:a},s=It(t,o.selector.raw,o.result);return s?(L(e.sessionStore,e.sessionName,e.req,P(s,t)),{ok:!0,data:F(s)}):null}async function Mt(e,t,n,r){if(t===`hidden`)return null;let i=await Pt(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]}:Lt(t,r,i.selector.raw,i.session,i.result.node);return a?(L(e.sessionStore,e.sessionName,e.req,a),{ok:!0,data:I(a)}):null}async function Nt(e){let t=G({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]};L(e.sessionStore,e.sessionName,e.req,i);let a={ok:!0,data:I(i)};return await B({req:e.req,logPath:e.logPath,session:e.session,device:e.device},a)}async function Pt(e,t){let n=e.sessionStore.get(e.sessionName),r=G({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 Ft(e,t,n){let r=await g(t.device,{command:`querySelector`,selectorKey:n.key,selectorValue:n.value,appBundleId:t.appBundleId},T({req:e.req,logPath:e.logPath,traceLogPath:t.trace?.outPath})),i=r.found===!0,a=Rt(r);return{found:i,...typeof r.text==`string`?{text:r.text}:{},...a?{node:a}:{}}}async function X(t,n,r){try{return await Ft(t,n,r)}catch(t){return K(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 It(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 Lt(e,t,n,r,i){let a=re({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 Rt(e){let t=e.nodes;if(!Array.isArray(t))return;let n=t[0];if(!(!n||typeof n!=`object`))return n}function zt(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=e.positionals?.slice(1).join(` `).trim()??``;return n?{ok:!0,target:{kind:`selector`,selector:n}}:{ok:!1,response:_(`INVALID_ARGS`,`get requires @ref or selector expression`)}}function Bt(e,t){if(e.kind===`sleep`)return{kind:`sleep`,durationMs:e.durationMs};if(e.kind===`selector`)return{kind:`selector`,selector:e.selectorExpression,timeoutMs:e.timeoutMs};if(e.kind===`ref`){if(!t?.snapshot)throw new n(`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};if(!e.text)throw new n(`INVALID_ARGS`,`wait requires text`);return{kind:`text`,text:e.text,timeoutMs:e.timeoutMs}}async function Q(e){try{return{ok:!0,data:await e()}}catch(e){let t=r(e);return _(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 N(r)}catch{return t}return i?_(t.error.code,`${n} failed because ${Be(i)}.`,{...t.error.details??{},...i,blockedBy:`android_foreground_surface`,originalMessage:t.error.message}):t}function Vt(e){return e===`exists`||e===`wait`||e===`get_text`||e===`get_attrs`}export{k as C,O as S,Oe as _,q as a,we as b,G as c,Pe as d,Ne as f,M as g,ke as h,At as i,ze as l,Ae as m,Ot as n,rt as o,je as p,kt as r,K as s,Dt as t,Ve as u,A as v,D as w,Ce as x,De as y};
|
|
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{j as s}from"./sdk-android-adb.js";import{T as c,v as l}from"./sdk-batch.js";import{J as u,m as d}from"./tv-remote.js";import{N as f,P as p,a as ee,i as te,m as ne,n as re,r as ie,t as ae,u as oe}from"./sdk-selectors.js";import{c as se,m as ce,o as le,s as m}from"./sdk-device.js";import{t as ue}from"./snapshot-quality.js";import{a as de}from"./sdk-finders.js";import"./selectors2.js";import{n as fe,t as pe}from"./runtime.js";import{r as me}from"./app-lifecycle.js";import{c as he,f as ge,i as h}from"./runner-client.js";import{It as g,Lt as _,Nt as _e,Pt as ve,Wt as ye,Xt as be,an as xe,in as v,mn as y,on as b,qt as x,zt as S}from"./internal/daemon.js";import{a as C,t as w}from"./apple-runner-options.js";import{o as Se}from"./apps.js";function T(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}}async function E(e){let{device:t,node:n,flags:r,appBundleId:i,traceOutPath:a,surface:o,contextFromFlags:c}=e,l=oe(n),d=u(n.rect);if(!d||m(t)&&l&&!p(n.type??``))return l;try{let e=await be(t,`read`,[String(d.x),String(d.y)],void 0,{...c(r,i,a),surface:o}),u=e&&typeof e==`object`?e:void 0,f=typeof u?.text==`string`?u.text:``;return f.trim()?f:(s({level:`warn`,phase:`interaction_read_fallback`,data:{reason:`empty_backend_text`,nodeRef:n.ref,surface:o,platform:t.platform}}),l)}catch(e){return s({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)}}),l}}async function D(e,t,n){let r=e.get(t),i=r?.device??await y(n??{});return r||await C(i),{session:r,device:i}}async function O(e,t,n){let r=!e&&m(t);try{return await n()}finally{r&&(await he(t.id),await Ce(t))}}async function Ce(e){let t=ge();await Se(e,t).catch(n=>{s({level:`debug`,phase:`ios_sessionless_runner_host_close_failed`,data:{deviceId:e.id,bundleId:t,error:n instanceof Error?n.message:String(n)}})})}function we(e,t,n,r){t&&e.recordAction(t,{command:n.command,positionals:n.positionals??[],flags:n.flags??{},result:r})}function Te(e){let{session:t,sessionName:n,device:r,snapshot:i,appBundleId:a}=e;return t?{...t,snapshot:i,lastComparisonSafeSnapshot:i?.comparisonSafe===!0?i:t.lastComparisonSafeSnapshot}:{name:n,device:r,createdAt:Date.now(),appBundleId:a,snapshot:i,...i?.comparisonSafe===!0?{lastComparisonSafeSnapshot:i}:{},actions:[]}}const Ee=[[`snapshotDepth`,`--depth`],[`snapshotScope`,`--scope`],[`snapshotRaw`,`--raw`]];function k(e,t){let n=De(t);return n.length===0?null:v(`INVALID_ARGS`,`${e} @ref does not support ${n.join(`, `)}.`)}function De(e){if(!e)return[];let t=[];for(let[n,r]of Ee)e[n]!==void 0&&t.push(r);return t}function Oe(e,t){if(!t||t.settle===!0)return null;let n=[];return t.settleQuietMs!==void 0&&n.push(`--settle-quiet`),n.length===0?null:v(`INVALID_ARGS`,`${e}: ${n.join(`, `)} require${n.length===1?`s`:``} --settle.`)}function ke(e){if(e?.settle===!0)return{...e.settleQuietMs===void 0?{}:{quietMs:e.settleQuietMs},...e.timeoutMs===void 0?{}:{timeoutMs:e.timeoutMs}}}function A(e){let t=n(e);return t?{ok:!0,ref:t.base,generation:t.generation}:{ok:!1,response:v(`INVALID_ARGS`,`Invalid ref "${e}" — malformed generation suffix.`,{hint:a})}}function j(e,t){let n=T(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:v(`INVALID_ARGS`,`${t} requires @ref, selector expression, or x y coordinates`)}}function Ae(e){let t=T(e);if(t)return{ok:!0,target:{kind:`point`,x:t.x,y:t.y},...Le(e[2])};let n=Ie(e),r=j(n.targetPositionals,`longpress`);return r.ok?{ok:!0,target:r.target,refGeneration:r.refGeneration,...n.duration}:r}function je(e){let t=e[0]??``;if(t.startsWith(`@`)){let n=A(t);if(!n.ok)return{ok:!1,response:n.response};let r=d(e).text;return r?{ok:!0,target:{kind:`ref`,ref:n.ref,fallbackLabel:Fe(e)},refGeneration:n.generation,text:r}:{ok:!1,response:v(`INVALID_ARGS`,`fill requires text after ref`)}}let n=T(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:v(`INVALID_ARGS`,`fill requires text after coordinates`)}}let r=Me(e);return!r||r.kind!==`selector`?{ok:!1,response:v(`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:v(`INVALID_ARGS`,`fill requires text after selector`)}}function Me(e){try{return d(e)}catch{return null}}function Ne(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}: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}:{evidence:t,settle:n}}function Pe(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 Fe(e){return e.length>=3&&e[1]?.trim()||``}function Ie(e){let t=e.at(-1);return e.length>1&&Re(t)?{targetPositionals:e.slice(0,-1),duration:{durationMs:Number(t)}}:{targetPositionals:e,duration:{}}}function Le(e){return e===void 0?{}:{durationMs:Number(e)}}function Re(e){return e===void 0||e.trim()===``?!1:Number.isFinite(Number(e))}async function ze(e,n){let r=await N(e);if(r)throw new t(`COMMAND_FAILED`,`press ${n} left ${e.appBundleId} and foregrounded ${r.foregroundPackage}. The tap likely escaped the app.`,r)}async function N(e){if(e.device.platform!==`android`||!e.appBundleId)return null;let t=await me(e.device),n=t.package?.trim();return!n||n===e.appBundleId||!Ue(n)?null:{expectedPackage:e.appBundleId,foregroundPackage:n,activity:t.activity,hint:He(n)}}function Be(e){return e.foregroundPackage===`com.google.android.permissioncontroller`?`Android permission dialog is blocking ${e.expectedPackage}`:`${e.foregroundPackage} is foreground instead of ${e.expectedPackage}`}function Ve(e){return e.code===`COMMAND_FAILED`&&typeof e.details?.expectedPackage==`string`&&typeof e.details?.foregroundPackage==`string`}function He(e){return e===`com.google.android.permissioncontroller`?`Dismiss or allow the permission prompt, then retry the smoke assertion.`:`Use screenshot as visual truth, then take a fresh snapshot -i before retrying.`}function Ue(e){return e===`com.android.settings`||e===`com.android.systemui`||e===`com.google.android.permissioncontroller`||e.includes(`launcher`)}function We(e,t){if(t===`exists`)return{found:!0};if(t===`wait`)return{found:!0,waitedMs:e.waitedMs};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 Ge(e){return e.kind===`found`?{found:!0,...typeof e.waitedMs==`number`?{waitedMs:e.waitedMs}:{}}:{...typeof e.ref==`string`?{ref:e.ref}:{},...typeof e.text==`string`?{text:e.text}:{},...e.node&&typeof e.node==`object`?{node:e.node}:{}}}function P(e,t){let n=Array.isArray(e.selectorChain)?e.selectorChain:void 0,r=R(e),i=r?.kind===`ref`?z(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 F(e){let t=R(e);return{...t?.kind===`ref`?{ref:z(t.ref)}:{},...t?.kind===`selector`?{selector:t.selector}:{},...typeof e.text==`string`?{text:e.text}:{},...e.node&&typeof e.node==`object`?{node:e.node}:{}}}function Ke(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 I(e){let{selectorChain:t,...n}=e;return n}function L(e,t,n,r){let i=e.get(t);i&&e.recordAction(i,{command:n.command,positionals:n.positionals??[],flags:n.flags??{},result:r})}function qe(e){let t=e.trim();if(!(!t||t.length>80||/[\r\n]/.test(t)))return t}function R(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 z(e){return e.startsWith(`@`)?e.slice(1):e}const Je=[`application`,`window`,`tabbar`,`scrollbar`,`image`],Ye=new Set([`tab bar`]);async function B(e,t){if(t.ok||!Xe(t.error.message)||t.error.details?.captureStalled===!0)return t;let n=await Ze(e).catch(()=>null);return n?v(t.error.code,`${t.error.message}. Current surface: ${n.summary}.`,{...t.error.details??{},currentSurface:n.details}):t}function Xe(e){return/^wait timed out (?:for (?:selector|text): |waiting for a stable UI)/i.test(e)}async function Ze(e){let t=[...(await S({device:e.device,session:e.session,flags:{...e.req.flags,snapshotInteractiveOnly:!0},logPath:e.logPath??``})).snapshot.nodes].sort(Qe),n=V(t,6,{includeIdentifiers:!0});if(n.length===0)return null;let r=V(t.filter(e=>!W(e)),4,{includeIdentifiers:!1}),i=V(t.filter(et),4,{includeIdentifiers:!0});return{summary:(r.length>0?r:n.slice(0,4)).join(`, `),details:{labels:n,...i.length>0?{buttons:i}:{}}}}function V(e,t,n){let r=new Set,i=[];for(let a of e){let e=U(a,n);if(!(!e||r.has(e))&&(r.add(e),i.push(e),i.length>=t))break}return i}function Qe(e,t){return H(e)-H(t)||$e(e,t)}function H(e){let t=!!U(e,{includeIdentifiers:!1});return(W(e)?2:0)+ +!t}function $e(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 U(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 W(e){let t=f(`${e.type??``} ${e.role??``} ${e.subrole??``}`),n=`${e.label??``} ${e.value??``}`.trim().toLowerCase();return Je.some(e=>t.includes(e))||Ye.has(n)||n.endsWith(`.fill`)}function et(e){return f(`${e.type??``} ${e.role??``} ${e.subrole??``}`).includes(`button`)}function G(e){let{session:t,selectorExpression:n}=e;if(!t||!m(t.device)||t.postGestureStabilization)return null;let r=c(n);if(!r||r.selectors.length!==1)return null;let i=r.selectors[0];if(!i||i.terms.length!==1)return null;let a=i.terms[0];return!a||typeof a.value!=`string`||!tt(a.key)?null:{key:a.key,value:a.value,raw:i.raw}}function tt(e){return e===`id`||e===`label`||e===`text`||e===`value`}function K(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!0;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`)}function nt(e,n={}){let r=n.plural===!0?`do`:`does`;return{resolveInput:async()=>{throw new t(`UNSUPPORTED_OPERATION`,`${e} ${r} not resolve input artifacts`)},reserveOutput:async()=>{throw new t(`UNSUPPORTED_OPERATION`,`${e} ${r} not reserve output artifacts`)},createTempFile:async()=>{throw new t(`UNSUPPORTED_OPERATION`,`${e} ${r} not create temporary files`)}}}function rt(e,t={}){return{artifacts:nt(e,t),policy:fe()}}function q(e){let{session:t,sessionStore:n,sessionName:r}=e,i=0,a,o;return{capture:async s=>{let c=Date.now(),l=pt(s,e.req.flags?.out),u=st({timestamp:c,lastSnapshotAt:i,lastSnapshotResult:a,lastSnapshotCacheKey:o,session:t,request:s,cacheKey:l});if(u)return u;let d=ct({session:t,timestamp:c,request:s});if(d)return i=d.createdAt,a={snapshot:d},o=l,a;let f=await it({params:e,request:s}),p={snapshot:f};return ht({session:t,sessionStore:n,sessionName:r,snapshot:f}),i=c,a=p,o=l,p}}}async function it(e){let{params:t,request:n}=e,r=await J(t,n,n.snapshotScope);return n.recovery?.legacyIosSparse&>(r)?await at({runtimeParams:t,request:n,policy:n.recovery.legacyIosSparse}):n.recovery?.sparseVerdictQueryScope?.shouldScope&&ue(r.snapshotQuality)?await ot({runtimeParams:t,request:n,policy:n.recovery.sparseVerdictQueryScope,snapshot:r}):r}async function at(e){let{runtimeParams:t,request:n,policy:r}=e;try{return await J(t,n,r.scope,!1)}catch(e){if(!r.shouldScope)throw e;return await J(t,n,r.query,!1)}}async function ot(e){let{runtimeParams:t,request:n,policy:r,snapshot:i}=e;try{return await J(t,n,r.query,!1)}catch{return i}}async function J(e,t,n,r=t.flags?.snapshotInteractiveOnly){return(await S({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})).snapshot}function st(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)&&!x(a)&&!dt(a,o))return r}function ct(e){let{session:t,timestamp:n,request:r}=e,i=t?.snapshot;if(i&<(t,r)&&ut(i,n)&&i.presentationKey===ft(r))return i}function lt(e,t){return!(t.cache?.forceFresh===!0||t.cache?.useSessionSnapshot!==!0||x(e)||dt(e,t))}function ut(e,t){return t-e.createdAt<750}function dt(e,t){return t.cache?.bypassForPostGestureStabilization===!0&&!!e?.postGestureStabilization}function ft(e){return r(i(mt(e)))}function pt(e,t){return JSON.stringify({presentationKey:ft(e),includeRects:e.includeRects===!0,outPath:e.outPath??t??null})}function mt(e){return e.snapshotScope===void 0?e.flags:{...e.flags,snapshotScope:e.snapshotScope}}function ht(e){let{session:t,sessionStore:n,sessionName:r,snapshot:i}=e;!t||ue(i.snapshotQuality)||(_(t,i),n.set(r,t))}function gt(e){return e.snapshotQuality||e.backend!==`xctest`||e.nodes.length!==1?!1:e.nodes[0]?.type===`Application`}function _t(e){return pe({backend:vt(e),...rt(`selector commands`,{plural:!0}),sessions:_e({sessionName:e.sessionName,getSession:()=>e.session,recordOptions:{includeSnapshot:!0},setRecord:t=>{!e.session||!t.snapshot||(_(e.session,t.snapshot),e.sessionStore.set(e.sessionName,e.session))}})})}async function Y(e,t){let n=e.sessionStore.get(e.sessionName);if(!n&&t.requireSession)return{ok:!1,response:xe()};let r=n?.device??await y(e.req.flags??{});n||await C(r);let i=b(t.capability,r);return i?{ok:!1,response:i}:{ok:!0,runtime:_t({...e,session:n,device:r})}}function vt(e){let{req:t,session:n,device:r,logPath:i,sessionName:a,sessionStore:o}=e,s=q({device:r,session:n,sessionStore:o,sessionName:a,req:t,logPath:i});return{platform:ce(r),captureSnapshot:async(e,n)=>{let i={...t.flags,...yt(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,snapshotScope:o,includeRects:a,cache:{forceFresh:c,useSessionSnapshot:!0,bypassForPostGestureStabilization:!0}})},readText:async(a,o)=>({text:await E({device:r,node:o,flags:t.flags,appBundleId:n?.appBundleId,traceOutPath:n?.trace?.outPath,surface:n?.surface,contextFromFlags:e.contextFromFlags??((e,t,n)=>ye(i??``,e,t,n))})}),findText:async(t,n)=>({found:await bt(e,n)})}}function yt(e){let t={};return e?.interactiveOnly!==void 0&&(t.snapshotInteractiveOnly=e.interactiveOnly),e?.scope!==void 0&&(t.snapshotScope=e.scope),e?.depth!==void 0&&(t.snapshotDepth=e.depth),e?.raw!==void 0&&(t.snapshotRaw=e.raw),t}async function bt(e,t){let n=await xt(e,t);if(n!==null)return n;let r=await St(e,t);return r===null?await Tt(e,t):r}async function xt(e,t){return!se(e.device)||!e.session?.surface||e.session.surface===`app`?null:await Tt(e,t)}async function St(e,t){let n=Ct(e);return n?(await h(n.device,{command:`findText`,text:t,appBundleId:n.appBundleId},wt(e,n)))?.found===!0:null}function Ct(e){return!le(e.device.platform)||!e.session?.appBundleId?null:{device:e.device,appBundleId:e.session.appBundleId,traceLogPath:e.session.trace?.outPath}}function wt(e,t){return w({req:e.req,logPath:e.logPath,traceLogPath:t.traceLogPath})}async function Tt(e,t){return!!ne((await Et(e)).nodes,t)}async function Et(e){let{snapshot:t}=await q({device:e.device,session:e.session,sessionStore:e.sessionStore,sessionName:e.sessionName,req:e.req,logPath:e.logPath}).capture({flags:{...e.req.flags,snapshotInteractiveOnly:!1},cache:{forceFresh:!0,bypassForPostGestureStabilization:!0}});return t}async function Dt(e){let{req:t}=e;if(t.command!==`find`)return null;let n=t.positionals??[];if(n.length===0)return v(`INVALID_ARGS`,`find requires a locator or text`);let r=de(n);if(!r.query)return v(`INVALID_ARGS`,`find requires a value`);if(t.flags?.findFirst&&t.flags?.findLast)return v(`INVALID_ARGS`,`find accepts only one of --first or --last`);let i=r.action;if(!Vt(i))return null;let a=await Y(e,{requireSession:!1,capability:`find`});return a.ok?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});L(e.sessionStore,e.sessionName,t,We(n,i));let o=Ge(n);if(typeof o.ref==`string`){let t=e.sessionStore.get(e.sessionName);if(t&&(ve(t),e.sessionStore.set(e.sessionName,t),t.snapshotGeneration!==void 0))return{...o,refsGeneration:t.snapshotGeneration}}return o}):a.response}async function Ot(e){let{req:t}=e;if(t.command!==`get`)return null;let n=t.positionals?.[0];if(n!==`text`&&n!==`attrs`)return v(`INVALID_ARGS`,`get only supports text or attrs`);let r=zt(t);if(!r.ok)return r.response;if(r.target.kind===`ref`){let e=k(`get`,t.flags);if(e)return e}if(r.target.kind===`selector`){let t=await jt(e,n,r.target.selector);if(t)return t}let i=await Y(e,{requireSession:!0,capability:`get`});if(!i.ok)return i.response;let a=r.target.kind===`ref`?g({session:e.sessionStore.get(e.sessionName),ref:r.target.ref,mintedGeneration:r.refGeneration}):void 0;return await Q(async()=>{let o=await i.runtime.selectors.get({session:e.sessionName,requestId:t.meta?.requestId,property:n,target:r.target});L(e.sessionStore,e.sessionName,t,P(o,n));let s=F(o);return a?{...s,warning:a}:s})}async function kt(e){let{req:t}=e;if(t.command!==`is`)return null;let{predicate:n,split:r}=ae(t.positionals??[]),i=n.toLowerCase();if(!ee(i))return v(`INVALID_ARGS`,re,{hint:ie});if(!r)return v(`INVALID_ARGS`,`is requires a selector expression`);let a=r.rest.join(` `).trim();if(i===`text`&&!a)return v(`INVALID_ARGS`,`is text requires expected text value`);if(i!==`text`&&r.rest.length>0)return v(`INVALID_ARGS`,`is ${i} does not accept trailing values`);let o=await Mt(e,i,r.selectorExpression,a);if(o)return o;let s=await Y(e,{requireSession:!0,capability:`is`});return s.ok?await $(e,await Q(async()=>{let n=await s.runtime.selectors.is({session:e.sessionName,requestId:t.meta?.requestId,predicate:i,selector:r.selectorExpression,expectedText:a});return L(e.sessionStore,e.sessionName,t,n),I(n)}),`is ${i}`):s.response}async function At(e){let{req:t,sessionName:n,sessionStore:r}=e,i=l(t.positionals??[]);if(!i)return v(`INVALID_ARGS`,`wait requires a duration or text`);let{session:a,device:o}=await D(r,n,t.flags);if(i.kind!==`sleep`){let e=b(`wait`,o);if(e)return e}if(i.kind===`selector`){let t=await Nt({...e,session:a,device:o,selectorExpression:i.selectorExpression,timeoutMs:i.timeoutMs});if(t)return t}let s=i,c;if(i.kind===`ref`){let e=A(i.rawRef);if(!e.ok)return e.response;s={...i,rawRef:e.ref},c=g({session:a,ref:e.ref,mintedGeneration:e.generation})}let u=async()=>{let i=_t({...e,session:a,device:o}),l=await Q(async()=>{let e=await i.selectors.wait({session:n,requestId:t.meta?.requestId,target:Bt(s,a)});L(r,n,t,e);let o=Ke(e);return c?{...o,warning:c}:o});return await $(e,await B({req:t,logPath:e.logPath,session:a,device:o},l),`wait`)};return i.kind===`sleep`?await u():await O(a,o,u)}async function jt(e,t,n){let r=e.sessionStore.get(e.sessionName),i=G({session:r,selectorExpression:n});if(!r||!i||t===`text`&&i.key!==`id`)return null;let a=await X(e,r,i);if(Z(a))return a.response;if(!a)return null;let o={session:r,selector:i,result:a},s=It(t,o.selector.raw,o.result);return s?(L(e.sessionStore,e.sessionName,e.req,P(s,t)),{ok:!0,data:F(s)}):null}async function Mt(e,t,n,r){if(t===`hidden`)return null;let i=await Pt(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]}:Lt(t,r,i.selector.raw,i.session,i.result.node);return a?(L(e.sessionStore,e.sessionName,e.req,a),{ok:!0,data:I(a)}):null}async function Nt(e){let t=G({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]};L(e.sessionStore,e.sessionName,e.req,i);let a={ok:!0,data:I(i)};return await B({req:e.req,logPath:e.logPath,session:e.session,device:e.device},a)}async function Pt(e,t){let n=e.sessionStore.get(e.sessionName),r=G({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 Ft(e,t,n){let r=await h(t.device,{command:`querySelector`,selectorKey:n.key,selectorValue:n.value,appBundleId:t.appBundleId},w({req:e.req,logPath:e.logPath,traceLogPath:t.trace?.outPath})),i=r.found===!0,a=Rt(r);return{found:i,...typeof r.text==`string`?{text:r.text}:{},...a?{node:a}:{}}}async function X(t,n,r){try{return await Ft(t,n,r)}catch(t){return K(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 It(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 Lt(e,t,n,r,i){let a=te({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 Rt(e){let t=e.nodes;if(!Array.isArray(t))return;let n=t[0];if(!(!n||typeof n!=`object`))return n}function zt(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=e.positionals?.slice(1).join(` `).trim()??``;return n?{ok:!0,target:{kind:`selector`,selector:n}}:{ok:!1,response:v(`INVALID_ARGS`,`get requires @ref or selector expression`)}}function Bt(e,n){if(e.kind===`sleep`)return{kind:`sleep`,durationMs:e.durationMs};if(e.kind===`selector`)return{kind:`selector`,selector:e.selectorExpression,timeoutMs:e.timeoutMs};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};if(!e.text)throw new t(`INVALID_ARGS`,`wait requires text`);return{kind:`text`,text:e.text,timeoutMs:e.timeoutMs}}async function Q(e){try{return{ok:!0,data:await e()}}catch(e){let t=o(e);return v(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 N(r)}catch{return t}return i?v(t.error.code,`${n} failed because ${Be(i)}.`,{...t.error.details??{},...i,blockedBy:`android_foreground_surface`,originalMessage:t.error.message}):t}function Vt(e){return e===`exists`||e===`wait`||e===`get_text`||e===`get_attrs`}export{O as C,D as S,ke as _,q as a,Te as b,G as c,Pe as d,Ne as f,M as g,j as h,At as i,ze as l,Ae as m,Ot as n,rt as o,je as p,kt as r,K as s,Dt as t,Ve as u,k as v,E as w,we as x,Oe as y};
|
package/dist/src/selectors.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{C as e,S as t,T as n}from"./sdk-batch.js";import{c as r,s as i}from"./sdk-selectors.js";import{a,i as o,r as s}from"./selectors2.js";export{s as findSelectorChainMatch,o as formatSelectorFailure,i as isNodeEditable,r as isNodeVisible,t as isSelectorToken,e as parseSelectorChain,a as resolveSelectorChain,n as tryParseSelectorChain};
|
package/dist/src/server.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{B as e,F as t,c as n,n as r,o as i,s as a}from"./sdk-contracts.js";import{Qt as o,s,t as c}from"./tv-remote.js";import{n as l}from"./version.js";import{M as u,N as d,c as f,j as p}from"./registry.js";import{i as ee,n as m}from"./command-metadata.js";import{t as h}from"./cli-output.js";const g=[`simulator`,`emulator`,`device`];function _(e){return{type:`number`,...e?{description:e}:{}}}function v(e,t){return{type:`string`,enum:e,...t?{description:t}:{}}}function y(e){return{type:`string`,const:e}}function b(e,t=[],n){return{type:`object`,...n?{description:n}:{},properties:e,...t.length>0?{required:t}:{}}}const x={type:`array`,items:{type:`string`}};function S(e={}){let t=e.properties??{},n=e.required??[];return b({targetKind:v([`point`,`ref`,`selector`],`Resolved interaction target kind.`),x:_(`Resolved interaction x coordinate when available.`),y:_(`Resolved interaction y coordinate when available.`),referenceWidth:_(`Reference frame width for visualizing the interaction point.`),referenceHeight:_(`Reference frame height for visualizing the interaction point.`),ref:d(`Snapshot ref without the @ prefix when the target was an @ref.`),selector:d(`Selector expression when the target was a selector.`),selectorChain:x,refLabel:d(),targetHittable:p(),hint:d(),warning:d(),message:d(),evidence:C,...t},[`targetKind`,...n])}const C=b({foregroundApp:d(`Foreground app bundle id or name, when the capture carries it.`),nodeCount:_(`Node count in the post-action interactive-only capture.`),interactiveNodeCount:_(`Subset of nodeCount the platform reports as hittable.`),digest:d(`Order-independent digest of the post-action node multiset.`),changedFromBefore:p(`Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure.`)},[`nodeCount`,`interactiveNodeCount`,`digest`,`changedFromBefore`]),w=b({settled:p(`Whether the UI held the quiet window before the deadline. false is advisory, not failure.`),waitedMs:_(),captures:_(),quietMs:_(),timeoutMs:_(),refsGeneration:_(`Snapshot generation of the stored settled tree; refs on added diff lines were minted from it.`),refs:{type:`array`,items:b({ref:d(`Plain ref body (e12) minted from the stored settled tree.`)},[`ref`])},diff:b({summary:b({additions:_(),removals:_(),unchanged:_()},[`additions`,`removals`,`unchanged`]),lines:{type:`array`,items:b({kind:v([`added`,`removed`]),text:d(),ref:d(`Plain ref body (e12) for added lines.`)},[`kind`,`text`])},truncated:p(`Lines were capped to the response bound.`)},[`summary`,`lines`],`Settled diff vs the pre-action tree (changed lines only).`),hint:d()},[`settled`,`waitedMs`,`captures`,`quietMs`,`timeoutMs`]),T={platform:v(n),target:v(a),device:d(`Human-readable device name.`),id:d(`Stable device id.`),kind:v(g)},E=[`platform`,`target`,`device`,`id`,`kind`],te=b({success:p(),exitCode:_(),stdout:d(),stderr:d(),error:u(`Normalized error detail when shutdown failed.`)},[`success`,`exitCode`,`stdout`,`stderr`]),D={press:S({properties:{evidence:C,settle:w,button:v([`secondary`,`middle`]),count:_(`Number of press/click repetitions.`),intervalMs:_(`Delay between repeated press/click actions.`),holdMs:_(`Hold duration for each action.`),jitterPx:_(`Randomization radius in pixels.`),doubleTap:p(`Whether the command requested a double-tap action.`)}}),fill:S({properties:{text:d(`Text submitted to the field.`),delayMs:_(`Delay between typed characters in milliseconds.`),evidence:C,settle:w},required:[`text`]}),longpress:S({properties:{durationMs:_(),settle:w,gesture:y(`longpress`)}}),boot:b({...T,booted:{type:`boolean`,const:!0}},[...E,`booted`]),shutdown:b({...T,shutdown:te},[...E,`shutdown`]),viewport:b({width:_(),height:_(),message:d()},[`width`,`height`,`message`]),home:b({action:y(`home`),message:d()},[`action`,`message`]),back:b({action:y(`back`),mode:v(f),message:d()},[`action`,`mode`,`message`]),rotate:b({action:y(`rotate`),orientation:v(s),message:d()},[`action`,`orientation`,`message`]),"app-switcher":b({action:y(`app-switcher`),message:d()},[`action`,`message`]),"tv-remote":b({action:y(`tv-remote`),button:v(c),durationMs:_(),message:d()},[`action`,`button`,`message`]),wait:b({waitedMs:_(),kind:y(`selector`),text:d(),selector:d(),captures:_(),nodeCount:_(),hint:d(),warning:d()},[`waitedMs`]),prepare:b({action:y(`ios-runner`),platform:v(n),deviceId:d(),deviceName:d(),kind:v(g),durationMs:_(),runner:b({},[]),cache:v([`exact`,`restore-key`,`miss`,`external`]),artifact:v([`valid`,`rebuilt`]),buildMs:_(),connectMs:_(),healthCheckMs:_(),xctestrunPath:d(),recoveryReason:d(),failureReason:d(),timing:b({totalMs:_(),additiveParts:b({buildMs:_(),connectAfterBuildMs:_(),healthCheckMs:_()},[`connectAfterBuildMs`,`healthCheckMs`]),containment:b({connectMs:{type:`array`,items:y(`buildMs`)},healthCheckMs:{type:`array`,items:d()}},[`healthCheckMs`]),note:d()},[`totalMs`,`additiveParts`,`containment`,`note`]),message:d()},[`action`,`platform`,`deviceId`,`deviceName`,`kind`,`durationMs`,`runner`,`connectMs`,`healthCheckMs`,`timing`,`message`]),push:{type:`object`,oneOf:[b({platform:y(`ios`),bundleId:d(),message:d()},[`platform`,`bundleId`,`message`]),b({platform:y(`android`),package:d(),action:d(),extrasCount:_(),message:d()},[`platform`,`package`,`action`,`extrasCount`,`message`])]},"trigger-app-event":b({event:d(),eventUrl:d(),transport:y(`deep-link`),message:d()},[`event`,`eventUrl`,`transport`,`message`]),clipboard:{type:`object`,oneOf:[b({action:y(`read`),text:d()},[`action`,`text`]),b({action:y(`write`),textLength:_(),message:d()},[`action`,`textLength`,`message`])]},appstate:{type:`object`,oneOf:[b({platform:v([`ios`,`macos`]),appName:d(),appBundleId:d(),source:y(`session`),surface:v(o),device_udid:d(`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`]),b({platform:y(`android`),package:d(),activity:d()},[`platform`,`package`,`activity`])]},keyboard:b({platform:v([`android`,`ios`]),action:v([`status`,`dismiss`,`enter`]),visible:p(),wasVisible:p(),dismissed:p(),attempts:_(),inputType:d(),type:v([`text`,`number`,`email`,`phone`,`password`,`datetime`,`unknown`]),inputMethodPackage:d(),focusedPackage:d(),focusedResourceId:d(),inputOwner:v([`app`,`ime`,`unknown`]),message:d()},[`platform`,`action`])};function ne(){return ee().map(e=>{let t=e.name in D?D[e.name]:void 0;return{name:e.name,description:e.description,inputSchema:K(e.inputSchema),...t?{outputSchema:t}:{}}})}function re(e={}){let n=new Map;return{execute:async(r,i)=>{if(!m(r))throw new t(`INVALID_ARGS`,`Unknown command tool: ${r}`);let a=V(i),o=G(i),s=se(a,o),c=N(r,o,n.get(s)),l=await z(e,a.client),u=await(e.runCommand??B)(l,r,c);return O(n,s,r,u),{isError:!1,structuredContent:u,content:[{type:`text`,text:ce({name:r,input:o,result:u,outputFormat:a.outputFormat,responseLevel:a.client.responseLevel})}]}}}}const ie=new Set([`snapshot`,`find`]),ae=new Set([`press`,`click`,`fill`,`longpress`]),oe=new Set([`press`,`click`,`fill`,`longpress`,`get`]);function se(e,t){let n=L(t)?.session,r=typeof n==`string`&&n.length>0?n:`default`;return`${e.client.stateDir??``}\u0000${r}`}function O(e,t,n,r){if(ae.has(n)){k(e,t,r);return}if(!ie.has(n))return;let i=L(r),a=i?.refsGeneration;if(i===void 0||typeof a!=`number`){e.delete(t);return}let o=j(i);if(o.length===0)return;let s=e.get(t)??new Map;e.set(t,s),A(s,o,a)}function k(e,t,n){let r=L(L(n)?.settle);if(!r)return;let i=r?.refsGeneration;if(typeof i!=`number`)return;let a=L(r?.diff)?.lines,o=[];if(M(a,o),M(r.refs,o),o.length===0)return;let s=e.get(t)??new Map;e.set(t,s),A(s,o,i)}function A(e,t,n){for(let r of t)e.delete(r),e.set(r,n);for(;e.size>1e3;){let t=e.keys().next().value;if(t===void 0)break;e.delete(t)}}function j(e){let t=[];return typeof e.ref==`string`&&e.ref.startsWith(`@`)&&t.push(e.ref.slice(1)),M(e.nodes,t),M(e.refs,t),t}function M(e,t){if(Array.isArray(e))for(let n of e){let e=L(n)?.ref;typeof e==`string`&&e.length>0&&t.push(e)}}function N(e,t,n){if(n===void 0||n.size===0)return t;let r=L(t);return r?e===`wait`?P(r,n)??t:oe.has(e)?F(r,n)??t:t:t}function P(e,t){if(typeof e.ref!=`string`)return;let n=I(e.ref,t);return n===e.ref?void 0:{...e,ref:n}}function F(e,t){let n=L(e.target);if(n?.kind!==`ref`||typeof n.ref!=`string`)return;let r=I(n.ref,t);return r===n.ref?void 0:{...e,target:{...n,ref:r}}}function I(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 L(e){if(!(!e||typeof e!=`object`||Array.isArray(e)))return e}const R=re();async function z(e,t){if(e.createClient)return await e.createClient(t);let{createAgentDeviceClient:n}=await import(`./client.js`).then(e=>e.t);return n(t)}async function B(e,t,n){return await(await import(`./command-surface.js`).then(e=>e.t)).runCommand(e,t,n)}function V(e){if(!e||typeof e!=`object`||Array.isArray(e))return{client:{},outputFormat:`optimized`};let t=e;return{client:H(t),outputFormat:W(t.mcpOutputFormat)}}function H(e){let n=e.stateDir,r=e.includeCost,i=e.responseLevel,a={};if(n!==void 0&&(typeof n!=`string`||n.length===0))throw new t(`INVALID_ARGS`,`Expected stateDir to be a non-empty string.`);if(typeof n==`string`&&(a.stateDir=n),r!==void 0&&typeof r!=`boolean`)throw new t(`INVALID_ARGS`,`Expected includeCost to be a boolean.`);r===!0&&(a.cost=!0);let o=U(i);return o!==void 0&&(a.responseLevel=o),a}function U(e){if(e!==void 0){if(typeof e!=`string`||!r.includes(e))throw new t(`INVALID_ARGS`,`Expected responseLevel to be one of 'digest', 'default', or 'full'.`);return e}}function W(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 G(e){if(!e||typeof e!=`object`||Array.isArray(e))return e;let{stateDir:t,mcpOutputFormat:n,includeCost:r,responseLevel:i,...a}=e;return a}function K(e){return{...e,properties:{...e.properties,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 ce(e){if(e.outputFormat===`json`||e.responseLevel!==void 0&&e.responseLevel!=="default")return q(e.result);let t=h({name:e.name,input:e.input,result:e.result});return typeof t?.text==`string`?t.text:q(t?.data??e.result)}function q(e){return typeof e==`string`?e:JSON.stringify(e,null,2)}async function le(e){if(e.jsonrpc!==`2.0`||typeof e.method!=`string`)return J(e.id??null,-32600,`Invalid JSON-RPC request.`);if(e.id===void 0)return null;try{return he(e.id,await ue(e.method,e.params))}catch(t){return t instanceof Y?J(e.id,-32601,t.message):J(e.id,-32602,t instanceof Error?t.message:String(t))}}async function ue(e,t){switch(e){case`initialize`:return{protocolVersion:pe(t),capabilities:{tools:{}},serverInfo:{name:`agent-device`,version:l()}};case`ping`:return{};case`tools/list`:return{tools:ne()};case`tools/call`:return await de(t);default:throw new Y(`Unsupported MCP method: ${e}`)}}async function de(e){let t=ge(e),n=_e(t,`name`);try{return await R.execute(n,t.arguments)}catch(e){return me(fe(e),!0)}}function fe(t){let n=e(t),r=[`Error (${n.code}): ${n.message}`];return n.hint&&r.push(`Hint: ${n.hint}`),n.supportedOn&&r.push(`Supported on: ${n.supportedOn}`),r.join(`
|
|
2
|
-
`)}function pe(e){return`2025-11-25`}function me(e,t=!1){return{isError:t,content:[{type:`text`,text:e}]}}function he(e,t){return{jsonrpc:`2.0`,id:e,result:t}}function J(e,t,n){return{jsonrpc:`2.0`,id:e,error:{code:t,message:n}}}function ge(e){if(!e||typeof e!=`object`||Array.isArray(e))throw new t(`INVALID_ARGS`,`Expected object parameters.`);return e}function _e(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 Y=class extends Error{};async function ve(){let e=ye(),t=new Ce(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 ye(e={}){let t=e.handlePayload??X,n=e.write??$,r=Promise.resolve();return{push:e=>{let i=Se(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 X(e){return Array.isArray(e)?be(e):Z(e)}async function be(e){let t=[];for(let n of e)t.push(...we(await Z(n)));return t.length>0?t:null}async function Z(e){let t;try{t=
|
|
1
|
+
import{S as e,_ as t,n,o as r}from"./sdk-contracts.js";import{Xt as i,s as a,t as o}from"./tv-remote.js";import{n as s}from"./version.js";import{M as c,N as l,c as u,j as d}from"./registry.js";import{n as f,t as p}from"./sdk-device.js";import{i as ee,n as m}from"./command-metadata.js";import{t as h}from"./cli-output.js";const g=[`simulator`,`emulator`,`device`];function _(e){return{type:`number`,...e?{description:e}:{}}}function v(e,t){return{type:`string`,enum:e,...t?{description:t}:{}}}function y(e){return{type:`string`,const:e}}function b(e,t=[],n){return{type:`object`,...n?{description:n}:{},properties:e,...t.length>0?{required:t}:{}}}const x={type:`array`,items:{type:`string`}};function S(e={}){let t=e.properties??{},n=e.required??[];return b({targetKind:v([`point`,`ref`,`selector`],`Resolved interaction target kind.`),x:_(`Resolved interaction x coordinate when available.`),y:_(`Resolved interaction y coordinate when available.`),referenceWidth:_(`Reference frame width for visualizing the interaction point.`),referenceHeight:_(`Reference frame height for visualizing the interaction point.`),ref:l(`Snapshot ref without the @ prefix when the target was an @ref.`),selector:l(`Selector expression when the target was a selector.`),selectorChain:x,refLabel:l(),targetHittable:d(),hint:l(),warning:l(),message:l(),evidence:C,...t},[`targetKind`,...n])}const C=b({foregroundApp:l(`Foreground app bundle id or name, when the capture carries it.`),nodeCount:_(`Node count in the post-action interactive-only capture.`),interactiveNodeCount:_(`Subset of nodeCount the platform reports as hittable.`),digest:l(`Order-independent digest of the post-action node multiset.`),changedFromBefore:d(`Whether the post-action digest differs from the pre-action capture digest. false is evidence, not failure.`)},[`nodeCount`,`interactiveNodeCount`,`digest`,`changedFromBefore`]),w=b({settled:d(`Whether the UI held the quiet window before the deadline. false is advisory, not failure.`),waitedMs:_(),captures:_(),quietMs:_(),timeoutMs:_(),refsGeneration:_(`Snapshot generation of the stored settled tree; refs on added diff lines were minted from it.`),refs:{type:`array`,items:b({ref:l(`Plain ref body (e12) minted from the stored settled tree.`)},[`ref`])},diff:b({summary:b({additions:_(),removals:_(),unchanged:_()},[`additions`,`removals`,`unchanged`]),lines:{type:`array`,items:b({kind:v([`added`,`removed`]),text:l(),ref:l(`Plain ref body (e12) for added lines.`)},[`kind`,`text`])},truncated:d(`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:b({ref:l(`Plain ref body (e12) minted from the stored settled tree.`),role:l(),label:l()},[`ref`,`role`])},tailTruncated:d(`Present (true) when tail candidates exceeded the response cap.`),hint:l()},[`settled`,`waitedMs`,`captures`,`quietMs`,`timeoutMs`]),T={platform:v(f),target:v(p),device:l(`Human-readable device name.`),id:l(`Stable device id.`),kind:v(g)},E=[`platform`,`target`,`device`,`id`,`kind`],te=b({success:d(),exitCode:_(),stdout:l(),stderr:l(),error:c(`Normalized error detail when shutdown failed.`)},[`success`,`exitCode`,`stdout`,`stderr`]),D={press:S({properties:{evidence:C,settle:w,button:v([`secondary`,`middle`]),count:_(`Number of press/click repetitions.`),intervalMs:_(`Delay between repeated press/click actions.`),holdMs:_(`Hold duration for each action.`),jitterPx:_(`Randomization radius in pixels.`),doubleTap:d(`Whether the command requested a double-tap action.`)}}),fill:S({properties:{text:l(`Text submitted to the field.`),delayMs:_(`Delay between typed characters in milliseconds.`),evidence:C,settle:w},required:[`text`]}),longpress:S({properties:{durationMs:_(),settle:w,gesture:y(`longpress`)}}),boot:b({...T,booted:{type:`boolean`,const:!0}},[...E,`booted`]),shutdown:b({...T,shutdown:te},[...E,`shutdown`]),viewport:b({width:_(),height:_(),message:l()},[`width`,`height`,`message`]),home:b({action:y(`home`),message:l()},[`action`,`message`]),back:b({action:y(`back`),mode:v(u),message:l()},[`action`,`mode`,`message`]),rotate:b({action:y(`rotate`),orientation:v(a),message:l()},[`action`,`orientation`,`message`]),"app-switcher":b({action:y(`app-switcher`),message:l()},[`action`,`message`]),"tv-remote":b({action:y(`tv-remote`),button:v(o),durationMs:_(),message:l()},[`action`,`button`,`message`]),wait:b({waitedMs:_(),kind:y(`selector`),text:l(),selector:l(),captures:_(),nodeCount:_(),hint:l(),warning:l()},[`waitedMs`]),prepare:b({action:y(`ios-runner`),platform:v(f),deviceId:l(),deviceName:l(),kind:v(g),durationMs:_(),runner:b({},[]),cache:v([`exact`,`restore-key`,`miss`,`external`]),artifact:v([`valid`,`rebuilt`]),buildMs:_(),connectMs:_(),healthCheckMs:_(),xctestrunPath:l(),recoveryReason:l(),failureReason:l(),timing:b({totalMs:_(),additiveParts:b({buildMs:_(),connectAfterBuildMs:_(),healthCheckMs:_()},[`connectAfterBuildMs`,`healthCheckMs`]),containment:b({connectMs:{type:`array`,items:y(`buildMs`)},healthCheckMs:{type:`array`,items:l()}},[`healthCheckMs`]),note:l()},[`totalMs`,`additiveParts`,`containment`,`note`]),message:l()},[`action`,`platform`,`deviceId`,`deviceName`,`kind`,`durationMs`,`runner`,`connectMs`,`healthCheckMs`,`timing`,`message`]),push:{type:`object`,oneOf:[b({platform:y(`ios`),bundleId:l(),message:l()},[`platform`,`bundleId`,`message`]),b({platform:y(`android`),package:l(),action:l(),extrasCount:_(),message:l()},[`platform`,`package`,`action`,`extrasCount`,`message`])]},"trigger-app-event":b({event:l(),eventUrl:l(),transport:y(`deep-link`),message:l()},[`event`,`eventUrl`,`transport`,`message`]),clipboard:{type:`object`,oneOf:[b({action:y(`read`),text:l()},[`action`,`text`]),b({action:y(`write`),textLength:_(),message:l()},[`action`,`textLength`,`message`])]},appstate:{type:`object`,oneOf:[b({platform:v([`ios`,`macos`]),appName:l(),appBundleId:l(),source:y(`session`),surface:v(i),device_udid:l(`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`]),b({platform:y(`android`),package:l(),activity:l()},[`platform`,`package`,`activity`])]},keyboard:b({platform:v([`android`,`ios`]),action:v([`status`,`dismiss`,`enter`]),visible:d(),wasVisible:d(),dismissed:d(),attempts:_(),inputType:l(),type:v([`text`,`number`,`email`,`phone`,`password`,`datetime`,`unknown`]),inputMethodPackage:l(),focusedPackage:l(),focusedResourceId:l(),inputOwner:v([`app`,`ime`,`unknown`]),message:l()},[`platform`,`action`])};function ne(){return ee().map(e=>{let t=e.name in D?D[e.name]:void 0;return{name:e.name,description:e.description,inputSchema:K(e.inputSchema),...t?{outputSchema:t}:{}}})}function re(e={}){let n=new Map;return{execute:async(r,i)=>{if(!m(r))throw new t(`INVALID_ARGS`,`Unknown command tool: ${r}`);let a=V(i),o=G(i),s=se(a,o),c=N(r,o,n.get(s)),l=await z(e,a.client),u=await(e.runCommand??B)(l,r,c);return O(n,s,r,u),{isError:!1,structuredContent:u,content:[{type:`text`,text:ce({name:r,input:o,result:u,outputFormat:a.outputFormat,responseLevel:a.client.responseLevel})}]}}}}const ie=new Set([`snapshot`,`find`]),ae=new Set([`press`,`click`,`fill`,`longpress`]),oe=new Set([`press`,`click`,`fill`,`longpress`,`get`]);function se(e,t){let n=L(t)?.session,r=typeof n==`string`&&n.length>0?n:`default`;return`${e.client.stateDir??``}\u0000${r}`}function O(e,t,n,r){if(ae.has(n)){k(e,t,r);return}if(!ie.has(n))return;let i=L(r),a=i?.refsGeneration;if(i===void 0||typeof a!=`number`){e.delete(t);return}let o=j(i);if(o.length===0)return;let s=e.get(t)??new Map;e.set(t,s),A(s,o,a)}function k(e,t,n){let r=L(L(n)?.settle);if(!r)return;let i=r?.refsGeneration;if(typeof i!=`number`)return;let a=L(r?.diff)?.lines,o=[];if(M(a,o),M(r.refs,o),M(r.tail,o),o.length===0)return;let s=e.get(t)??new Map;e.set(t,s),A(s,o,i)}function A(e,t,n){for(let r of t)e.delete(r),e.set(r,n);for(;e.size>1e3;){let t=e.keys().next().value;if(t===void 0)break;e.delete(t)}}function j(e){let t=[];return typeof e.ref==`string`&&e.ref.startsWith(`@`)&&t.push(e.ref.slice(1)),M(e.nodes,t),M(e.refs,t),t}function M(e,t){if(Array.isArray(e))for(let n of e){let e=L(n)?.ref;typeof e==`string`&&e.length>0&&t.push(e)}}function N(e,t,n){if(n===void 0||n.size===0)return t;let r=L(t);return r?e===`wait`?P(r,n)??t:oe.has(e)?F(r,n)??t:t:t}function P(e,t){if(typeof e.ref!=`string`)return;let n=I(e.ref,t);return n===e.ref?void 0:{...e,ref:n}}function F(e,t){let n=L(e.target);if(n?.kind!==`ref`||typeof n.ref!=`string`)return;let r=I(n.ref,t);return r===n.ref?void 0:{...e,target:{...n,ref:r}}}function I(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 L(e){if(!(!e||typeof e!=`object`||Array.isArray(e)))return e}const R=re();async function z(e,t){if(e.createClient)return await e.createClient(t);let{createAgentDeviceClient:n}=await import(`./client.js`).then(e=>e.t);return n(t)}async function B(e,t,n){return await(await import(`./command-surface.js`).then(e=>e.t)).runCommand(e,t,n)}function V(e){if(!e||typeof e!=`object`||Array.isArray(e))return{client:{},outputFormat:`optimized`};let t=e;return{client:H(t),outputFormat:W(t.mcpOutputFormat)}}function H(e){let n=e.stateDir,r=e.includeCost,i=e.responseLevel,a={};if(n!==void 0&&(typeof n!=`string`||n.length===0))throw new t(`INVALID_ARGS`,`Expected stateDir to be a non-empty string.`);if(typeof n==`string`&&(a.stateDir=n),r!==void 0&&typeof r!=`boolean`)throw new t(`INVALID_ARGS`,`Expected includeCost to be a boolean.`);r===!0&&(a.cost=!0);let o=U(i);return o!==void 0&&(a.responseLevel=o),a}function U(e){if(e!==void 0){if(typeof e!=`string`||!n.includes(e))throw new t(`INVALID_ARGS`,`Expected responseLevel to be one of 'digest', 'default', or 'full'.`);return e}}function W(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 G(e){if(!e||typeof e!=`object`||Array.isArray(e))return e;let{stateDir:t,mcpOutputFormat:n,includeCost:r,responseLevel:i,...a}=e;return a}function K(e){return{...e,properties:{...e.properties,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 ce(e){if(e.outputFormat===`json`||e.responseLevel!==void 0&&e.responseLevel!=="default")return q(e.result);let t=h({name:e.name,input:e.input,result:e.result});return typeof t?.text==`string`?t.text:q(t?.data??e.result)}function q(e){return typeof e==`string`?e:JSON.stringify(e,null,2)}async function le(e){if(e.jsonrpc!==`2.0`||typeof e.method!=`string`)return J(e.id??null,-32600,`Invalid JSON-RPC request.`);if(e.id===void 0)return null;try{return he(e.id,await ue(e.method,e.params))}catch(t){return t instanceof Y?J(e.id,-32601,t.message):J(e.id,-32602,t instanceof Error?t.message:String(t))}}async function ue(e,t){switch(e){case`initialize`:return{protocolVersion:pe(t),capabilities:{tools:{}},serverInfo:{name:`agent-device`,version:s()}};case`ping`:return{};case`tools/list`:return{tools:ne()};case`tools/call`:return await de(t);default:throw new Y(`Unsupported MCP method: ${e}`)}}async function de(e){let t=ge(e),n=_e(t,`name`);try{return await R.execute(n,t.arguments)}catch(e){return me(fe(e),!0)}}function fe(t){let n=e(t),r=[`Error (${n.code}): ${n.message}`];return n.hint&&r.push(`Hint: ${n.hint}`),n.supportedOn&&r.push(`Supported on: ${n.supportedOn}`),r.join(`
|
|
2
|
+
`)}function pe(e){return`2025-11-25`}function me(e,t=!1){return{isError:t,content:[{type:`text`,text:e}]}}function he(e,t){return{jsonrpc:`2.0`,id:e,result:t}}function J(e,t,n){return{jsonrpc:`2.0`,id:e,error:{code:t,message:n}}}function ge(e){if(!e||typeof e!=`object`||Array.isArray(e))throw new t(`INVALID_ARGS`,`Expected object parameters.`);return e}function _e(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 Y=class extends Error{};async function ve(){let e=ye(),t=new Ce(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 ye(e={}){let t=e.handlePayload??X,n=e.write??$,r=Promise.resolve();return{push:e=>{let i=Se(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 X(e){return Array.isArray(e)?be(e):Z(e)}async function be(e){let t=[];for(let n of e)t.push(...we(await Z(n)));return t.length>0?t:null}async function Z(e){let t;try{t=r.parse(e)}catch{return xe(Q(e))}return le(t)}function xe(e){return{jsonrpc:`2.0`,id:e,error:{code:-32600,message:`Invalid JSON-RPC request.`}}}function Se(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 Ce=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
3
|
`);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 we(e){return e?[e]:[]}function $(e){process.stdout.write(`${JSON.stringify(e)}\n`)}export{ve as runAgentDeviceMcpServer};
|