agent-device 0.20.4 → 0.20.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/android/ime-helper/dist/{agent-device-android-ime-helper-0.20.4.apk → agent-device-android-ime-helper-0.20.6.apk} +0 -0
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.6.apk.sha256 +1 -0
- package/android/ime-helper/dist/{agent-device-android-ime-helper-0.20.4.manifest.json → agent-device-android-ime-helper-0.20.6.manifest.json} +4 -4
- package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.20.4.apk → agent-device-android-snapshot-helper-0.20.6.apk} +0 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.6.apk.sha256 +1 -0
- package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.20.4.manifest.json → agent-device-android-snapshot-helper-0.20.6.manifest.json} +6 -6
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +28 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/AgentDeviceRunnerUITests-Bridging-Header.h +1 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.h +41 -1
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.m +298 -92
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.m +126 -187
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedTextEntry.h +32 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedTextEntry.m +212 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AXSnapshotFallback.swift +118 -8
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +134 -27
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Keyboard.swift +23 -5
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Lifecycle.swift +10 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+LifecycleCacheTests.swift +0 -67
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +11 -1
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScreenRecorder.swift +2 -22
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCapturePlan.swift +48 -11
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotTraversalIdentityTests.swift +0 -20
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedTextEntry.swift +177 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +105 -448
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryPolicyTests.swift +4 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextTyping.swift +587 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +18 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerXCTestEventBridge.h +72 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerXCTestEventBridge.m +89 -0
- package/dist/src/agent-device-client.js +2 -2
- package/dist/src/android.js +1 -1
- package/dist/src/app-log-request-scope.js +1 -1
- package/dist/src/app-resolution.js +1 -1
- package/dist/src/apps.js +5 -5
- package/dist/src/cli-config.js +1 -1
- package/dist/src/cli-help.js +34 -24
- package/dist/src/cli-runner.js +1 -1
- package/dist/src/cli.js +15 -15
- package/dist/src/command-metadata.js +1 -1
- package/dist/src/command-schema.js +3 -3
- package/dist/src/context.js +1 -1
- package/dist/src/debug-symbols.js +1 -1
- package/dist/src/find.js +1 -1
- package/dist/src/finders.js +1 -1
- package/dist/src/generic-settle.js +1 -0
- package/dist/src/generic.js +1 -1
- package/dist/src/ime-lifecycle.js +3 -3
- package/dist/src/index.d.ts +27 -7
- package/dist/src/input-actions.js +4 -4
- package/dist/src/interaction-runtime.js +1 -0
- package/dist/src/interaction-snapshot.js +1 -1
- package/dist/src/interaction-touch-reference-frame.js +1 -0
- package/dist/src/interaction.js +1 -1
- package/dist/src/interactor.js +2 -2
- package/dist/src/interactor2.js +1 -1
- package/dist/src/internal/bin.js +2 -2
- package/dist/src/internal/daemon.js +15 -15
- package/dist/src/lease-context.js +1 -1
- package/dist/src/lease.js +1 -1
- package/dist/src/limrun.d.ts +23 -2
- package/dist/src/linux.js +1 -1
- package/dist/src/process-exit.js +1 -0
- package/dist/src/react-native.js +1 -1
- package/dist/src/record-trace.js +1 -1
- package/dist/src/register-builtins.js +1 -1
- package/dist/src/registry.js +25 -24
- package/dist/src/remote-config.js +1 -1
- package/dist/src/remote-config2.js +1 -1
- package/dist/src/reporting.js +2 -2
- package/dist/src/runner-client.js +1 -1
- package/dist/src/runner-disposal.js +1 -1
- package/dist/src/runner-lease.js +1 -1
- package/dist/src/runtime.js +3 -3
- package/dist/src/screenshot-geometry.js +1 -1
- package/dist/src/screenshot-result.js +4 -4
- package/dist/src/sdk-android-adb.d.ts +20 -2
- package/dist/src/sdk-android-adb.js +1 -1
- package/dist/src/sdk-batch-runner.js +3 -3
- package/dist/src/sdk-contracts.d.ts +17 -2
- package/dist/src/sdk-finders.d.ts +4 -20
- package/dist/src/sdk-finders.js +1 -1
- package/dist/src/{interaction.d.ts → sdk-selectors.d.ts} +98 -3
- package/dist/src/sdk-selectors.js +1 -1
- package/dist/src/selector-runtime.js +1 -1
- package/dist/src/selector-vocabulary.js +1 -1
- package/dist/src/selectors.d.ts +1 -46
- package/dist/src/selectors.js +1 -1
- package/dist/src/server.js +3 -3
- package/dist/src/session-target-evidence.js +1 -1
- package/dist/src/session.js +9 -8
- package/dist/src/snapshot2.js +1 -1
- package/dist/src/text-surface.js +1 -0
- package/dist/src/viewport-dimension.js +13 -12
- package/dist/src/web.js +1 -1
- package/package.json +42 -34
- package/server.json +3 -3
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.20.4.apk.sha256 +0 -1
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.20.4.apk.sha256 +0 -1
- package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/recording-resize.swift +0 -225
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{_ as e,a as t,i as n,v as
|
|
2
|
-
`).map(e=>e.trim()).filter(e=>e.length>0)}
|
|
3
|
-
`],[`r`,`\r`],[`t`,` `]]);function be(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=>Ce(e))}}function h(e){try{return be(e)}catch{return null}}function xe(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 m.has(e)}return m.has(t.toLowerCase())}function Se(e){let t=e.trim(),n=t.indexOf(`=`);if(n===-1)return null;let r=t.slice(0,n).trim().toLowerCase();if(!r||m.has(r))return null;let i=t.slice(n+1).trim();if(!i)return null;let a=v(i).trim();return a?{key:r,value:a}:null}function g(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||!xe(t))break;r+=1;let n=e.slice(0,r).join(` `).trim();n&&h(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 Ce(t){let n=t.trim();if(!n)throw new e(`INVALID_ARGS`,`Selector segment cannot be empty`);let r=Ee(n);if(r.length===0)throw new e(`INVALID_ARGS`,`Invalid selector segment: ${t}`);return{raw:n,terms:r.map(we)}}function we(t){let n=t.trim();if(!n)throw new e(`INVALID_ARGS`,`Empty selector term`);let r=n.indexOf(`=`);if(r===-1){let r=n.toLowerCase();if(!p.has(r))throw new e(`INVALID_ARGS`,`Invalid selector term "${t}", expected key=value`);return{key:r,value:!0}}let i=n.slice(0,r).trim().toLowerCase(),a=n.slice(r+1).trim();if(!m.has(i))throw new e(`INVALID_ARGS`,`Unknown selector key: ${i}`);if(!a)throw new e(`INVALID_ARGS`,`Missing selector value for key: ${i}`);if(p.has(i)){let t=ke(a);if(t===null)throw new e(`INVALID_ARGS`,`Invalid boolean value for ${i}: ${a}`);return{key:i,value:t}}return{key:i,value:v(a)}}function Te(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=_(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 Ee(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=_(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 _(e,t){return e?e===t?null:e:t}function v(e){let t=e.trim();return t.startsWith(`"`)&&t.endsWith(`"`)||t.startsWith(`'`)&&t.endsWith(`'`)?De(t.slice(1,-1)):t}function De(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=Oe(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 Oe(e){return ye.get(e)??null}function ke(e){let t=v(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}const Ae=[`any`,`text`,`label`,`value`,`role`,`id`],je=[`text`,`label`,`value`,`role`,`id`];function b(e){return e===`exists`||e===`wait`||e===`get_text`||e===`get_attrs`}function Me(e,t,n,r={}){let i=S(n);if(!i)return{matches:[],score:0};let a=0,o=[];for(let n of e){if(r.requireRect&&!n.rect)continue;let e=Ne(n,t,i);if(!(e<=0)){if(e>a){a=e,o.length=0,o.push(n);continue}e===a&&o.push(n)}}return{matches:o,score:a}}function Ne(e,t,n){switch(t){case`role`:return Pe(e.type,n);case`label`:return x(e.label,n);case`value`:return x(e.value,n);case`id`:return x(e.identifier,n);default:return Math.max(x(e.label,n),x(e.value,n),x(e.identifier,n))}}function x(e,t){let n=S(e??``);return n?n===t?2:+!!n.includes(t):0}function Pe(e,t){let n=Fe(e??``);return n?n===t?2:+!!n.includes(t):0}function S(e){return e.trim().toLowerCase().replace(/\s+/g,` `)}function Fe(e){let t=e.trim();return t?(t=(t.split(`.`).pop()??t).replace(/XCUIElementType/gi,``).toLowerCase(),t):``}const C=`find requires a value`;function Ie(e,t){if(e.length===0)return{ok:!1,code:`INVALID_ARGS`,message:`find requires a locator or text`};let n=w([...e]);return n.query?t?.findFirst&&t?.findLast?{ok:!1,code:`INVALID_ARGS`,message:`find accepts only one of --first or --last`}:{ok:!0,parsed:n}:{ok:!1,code:`INVALID_ARGS`,message:C}}function w(t){let n=`any`,r=0;je.includes(t[0])&&(n=t[0],r=1);let i=t[r]??``,a=t.slice(r+1);if(a.length===0)return{locator:n,query:i,action:`click`};let o=a[0]?.toLowerCase();if(o===`get`){let t=a[1]?.toLowerCase();if(t===`text`)return{locator:n,query:i,action:`get_text`};if(t===`attrs`)return{locator:n,query:i,action:`get_attrs`};throw new e(`INVALID_ARGS`,`find get only supports text or attrs`)}if(o===`wait`){let e=Re(a[1]);return{locator:n,query:i,action:`wait`,timeoutMs:e??void 0}}if(o===`exists`)return{locator:n,query:i,action:`exists`};if(o===`click`)return{locator:n,query:i,action:`click`};if(o===`focus`)return{locator:n,query:i,action:`focus`};if(o===`fill`){let e=a.slice(1).join(` `);return{locator:n,query:i,action:`fill`,value:e}}if(o===`type`){let e=a.slice(1).join(` `);return{locator:n,query:i,action:`type`,value:e}}throw new e(`INVALID_ARGS`,`Unsupported find action: ${a[0]}`)}function Le(e,t){return e!==`any`||!t.includes(`=`)&&!t.includes(`||`)?null:h(t)}function Re(e){if(!e)return null;let t=Number(e);return Number.isFinite(t)?t:null}function T(e){if(!e)return null;let t=Number(e);return Number.isFinite(t)?t:null}function E(e){let t=e[0];if(t===void 0)return null;let n=T(t);if(n!==null)return{kind:`sleep`,durationMs:n};let r=T(e[e.length-1]);if(t===`text`)return{kind:`text`,text:(r===null?e.slice(1).join(` `):e.slice(1,-1).join(` `)).trim(),timeoutMs:r};if(t===`stable`){let t=e.slice(1),n=t.length>1?T(t[1]):null;return{kind:`stable`,quietMs:t.length>0?T(t[0]):null,timeoutMs:n}}if(t.startsWith(`@`))return{kind:`ref`,rawRef:t,timeoutMs:r};let i=g(r===null?e.slice():e.slice(0,-1));return i&&i.rest.length===0&&h(i.selectorExpression)?{kind:`selector`,selectorExpression:i.selectorExpression,timeoutMs:r}:{kind:`text`,text:(r===null?e.join(` `):e.slice(0,-1).join(` `)).trim(),timeoutMs:r}}function ze(e){let t=E(e);return t?t.kind===`sleep`?t.durationMs:t.timeoutMs:null}const D=24e4,O={budget:{source:`none`},envelopeMs:9e4,onTimeout:`reset-daemon`},Be={click:`settle-and-verify`,press:`settle-and-verify`,fill:`settle-and-verify`,longpress:`settle`};function k(e){if(e!==void 0)return Be[e]}const A={leaseAdmissionExempt:!0,sessionExecutionLockExempt:!0},j={leaseAdmissionExempt:!0,sessionExecutionLockExempt:!0,selectorValidationExempt:!0},M=()=>!0,Ve=e=>(e.positionals?.[0]??``).toLowerCase()===`start`,N=e=>e.command===`test`&&(typeof e.flags?.shardAll==`number`||typeof e.flags?.shardSplit==`number`),P=new Set([`status`,`get`]),He=e=>I(e,P,`status`),F=new Set([`get`,`wait`]),Ue=e=>I(e,F,`get`),We=e=>L(e,P,`status`),Ge=e=>L(e,F,`get`),Ke=e=>{try{return b(w(e.positionals??[]).action)?`observes-app`:`mutates-app`}catch{return`mutates-app`}};function I(e,t,n){return t.has((e.positionals?.[0]??n).toLowerCase())?`preserve`:`may-invalidate`}function L(e,t,n){return t.has((e.positionals?.[0]??n).toLowerCase())?`observes-app`:`mutates-app`}const R={simulator:!0,device:!0},z={emulator:!0,device:!0,unknown:!0},B={emulator:!0},V={device:!0},H={},U={apple:R,android:z,linux:V},qe={...U,vega:B},Je={apple:R,android:z,linux:H},W={apple:R,android:z,linux:H},G={recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`generic`,refFrameEffect:`may-invalidate`,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:R,android:z,linux:V},timeoutPolicy:O,batchable:!0},K={...O,onTimeout:`preserve-daemon`},q={...O,envelopeMs:18e4},Ye={...O,budget:{source:`flag`,envelope:`widen`,defaultBudgetMs:1e4},onTimeout:`preserve-daemon`},Xe={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}}},Ze={fields:{delayMs:{defaultValue:0}}};function J(e){return k(e)===void 0?K:Ye}function Y(e){let t=k(e);if(t===void 0)throw Error(`Missing post-action observation descriptor support for ${e}`);return t}const Qe=[{name:`lease_allocate`,catalog:{group:`internal`,key:`leaseAllocate`},recordsSessionAction:!1,daemon:{route:`lease`,refFrameEffect:`preserve`,...A},timeoutPolicy:O,batchable:!1},{name:`lease_heartbeat`,catalog:{group:`internal`,key:`leaseHeartbeat`},recordsSessionAction:!1,daemon:{route:`lease`,refFrameEffect:`preserve`,...A},timeoutPolicy:O,batchable:!1},{name:`lease_release`,catalog:{group:`internal`,key:`leaseRelease`},recordsSessionAction:!1,daemon:{route:`lease`,refFrameEffect:`preserve`,...A},timeoutPolicy:O,batchable:!1},{name:`artifacts`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`lease`,refFrameEffect:`preserve`,...A},timeoutPolicy:O,batchable:!1},{name:`session_list`,catalog:{group:`internal`,key:`sessionList`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`preserve`,sessionKind:`inventory`,...j},timeoutPolicy:O,batchable:!1},{name:`session_save_script`,catalog:{group:`internal`,key:`sessionSaveScript`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`preserve`,sessionKind:`publication`},timeoutPolicy:O,batchable:!1},{name:`devices`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`preserve`,sessionKind:`inventory`,lockPolicySelectorOverride:!0,...j},timeoutPolicy:O,batchable:!0},{name:`capabilities`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`preserve`,sessionKind:`inventory`,lockPolicySelectorOverride:!0,preferExplicitDeviceOverExistingSession:!0,...j},timeoutPolicy:O,batchable:!0},{name:`doctor`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`preserve`,sessionKind:`inventory`,lockPolicySelectorOverride:!0,allowSessionlessDefaultDevice:M,...j},timeoutPolicy:O,batchable:!0},{name:`apps`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`preserve`,sessionKind:`inventory`,lockPolicySelectorOverride:!0,preferExplicitDeviceOverExistingSession:!0},capability:Je,timeoutPolicy:O,batchable:!0},{name:`boot`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`may-invalidate`,sessionKind:`state`},capability:{apple:R,android:z,linux:H},timeoutPolicy:O,batchable:!0},{name:`shutdown`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`may-invalidate`,sessionKind:`state`},capability:{apple:{simulator:!0},android:{emulator:!0},linux:H},timeoutPolicy:O,batchable:!0},{name:`appstate`,catalog:{group:`public`,key:`appState`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`preserve`,sessionKind:`state`},timeoutPolicy:O,batchable:!0},{name:`perf`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`observes-app`,daemon:{route:`session`,refFrameEffect:`preserve`,sessionKind:`observability`},capability:{apple:R,android:z,linux:H},timeoutPolicy:O,batchable:!0},{name:`logs`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`preserve`,sessionKind:`observability`},capability:{apple:R,android:z,linux:H},timeoutPolicy:O,batchable:!0},{name:`events`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`preserve`,sessionKind:`observability`,allowInvalidRecording:!0,...j},timeoutPolicy:O,batchable:!1},{name:`network`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`preserve`,sessionKind:`observability`},capability:{apple:R,android:z,linux:H},timeoutPolicy:O,batchable:!0},{name:`audio`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`preserve`,sessionKind:`observability`},capability:{apple:R,android:{emulator:!0},linux:H},timeoutPolicy:O,batchable:!0},{name:`replay`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`delegated`,sessionKind:`replay`,skipSessionlessProviderDevice:N,saveScriptFlagOwner:!0},timeoutPolicy:{...O,budget:{source:`flag`}},batchable:!1},{name:`test`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`delegated`,sessionKind:`replay`,skipSessionlessProviderDevice:N},timeoutPolicy:{...O,envelopeMs:`unbounded`},batchable:!0},{name:`runtime`,catalog:{group:`internal`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`preserve`},timeoutPolicy:O,batchable:!1},{name:`clipboard`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`observes-app`,daemon:{route:`session`,refFrameEffect:`preserve`},dispatch:{},capability:{apple:R,android:z,linux:V},timeoutPolicy:O,batchable:!0},{name:`keyboard`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:We,daemon:{route:`session`,refFrameEffect:He,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:R,android:z,linux:H},timeoutPolicy:O,batchable:!0},{name:`install`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`session`,refFrameEffect:`may-invalidate`},capability:W,timeoutPolicy:q,batchable:!0},{name:`reinstall`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`session`,refFrameEffect:`may-invalidate`},capability:W,timeoutPolicy:q,batchable:!0},{name:`install_source`,catalog:{group:`internal`,key:`installSource`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`session`,refFrameEffect:`may-invalidate`},timeoutPolicy:q,batchable:!1},{name:`release_materialized_paths`,catalog:{group:`internal`,key:`releaseMaterializedPaths`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`preserve`,...j},timeoutPolicy:O,batchable:!1},{name:`push`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`session`,refFrameEffect:`may-invalidate`},dispatch:{},capability:{apple:{simulator:!0},android:z,linux:H},timeoutPolicy:O,batchable:!0},{name:`trigger-app-event`,catalog:{group:`public`,key:`triggerAppEvent`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`session`,refFrameEffect:`may-invalidate`},dispatch:{},capability:{apple:R,android:z,linux:H},timeoutPolicy:O,batchable:!0},{name:`open`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`session`,refFrameEffect:`may-invalidate`,allowSessionlessDefaultDevice:M,saveScriptFlagOwner:!0},dispatch:{},capability:qe,timeoutPolicy:O,batchable:!0},{name:`prepare`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`preserve`},capability:{apple:R,android:{},linux:H},timeoutPolicy:{budget:{source:`flag`},envelopeMs:D,onTimeout:`reset-daemon`},batchable:!1,mcpExposed:!1},{name:`batch`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`delegated`},timeoutPolicy:O,batchable:!1},{name:`close`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`session`,refFrameEffect:`may-invalidate`,allowInvalidRecording:!0,saveScriptFlagOwner:!0},dispatch:{},capability:qe,timeoutPolicy:O,batchable:!0},{name:`snapshot`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`observes-app`,daemon:{route:`snapshot`,refFrameEffect:`preserve`},dispatch:{},capability:U,timeoutPolicy:{...K,budget:{source:`flag`}},batchable:!0},{name:`diff`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`observes-app`,daemon:{route:`snapshot`,refFrameEffect:`preserve`},capability:U,timeoutPolicy:O,batchable:!0},{name:`wait`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`observes-app`,targetIdentityVerification:`post-resolution`,daemon:{route:`snapshot`,refFrameEffect:`preserve`},capability:U,timeoutPolicy:{...K,budget:{source:`positional-parser`,parser:ze}},batchable:!0},{name:`alert`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:Ge,daemon:{route:`snapshot`,refFrameEffect:Ue},capability:{apple:R,android:z,linux:H},timeoutPolicy:O,batchable:!0},{name:`settings`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`snapshot`,refFrameEffect:`may-invalidate`},dispatch:{},capability:{apple:R,android:z,linux:H},timeoutPolicy:O,batchable:!0},{name:`react-native`,catalog:{group:`public`,key:`reactNative`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`reactNative`,refFrameEffect:`may-invalidate`},capability:{apple:R,android:z,linux:H},timeoutPolicy:O,batchable:!0},{name:`record`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`observes-app`,daemon:{route:`recordTrace`,refFrameEffect:`preserve`,allowInvalidRecording:!0,allowSessionlessDefaultDevice:Ve},capability:{apple:R,android:z,linux:H},timeoutPolicy:O,batchable:!0},{name:`trace`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`observes-app`,daemon:{route:`recordTrace`,refFrameEffect:`preserve`},timeoutPolicy:O,batchable:!0},{name:`find`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:Ke,daemon:{route:`find`,refFrameEffect:`may-invalidate`},capability:U,timeoutPolicy:K,batchable:!0},{name:`click`,targetIdentityVerification:`pre-dispatch`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`interaction`,refFrameEffect:`may-invalidate`,androidBlockingDialogGuard:!0},capability:{apple:R,android:z,linux:V},timeoutPolicy:J(`click`),postActionObservation:Y(`click`),responseDataTransform:Xe,batchable:!0},{name:`fill`,targetIdentityVerification:`pre-dispatch`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`interaction`,refFrameEffect:`may-invalidate`,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:R,android:z,linux:V},timeoutPolicy:J(`fill`),postActionObservation:Y(`fill`),responseDataTransform:Ze,batchable:!0},{name:`longpress`,targetIdentityVerification:`pre-dispatch`,catalog:{group:`public`,key:`longPress`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`interaction`,refFrameEffect:`may-invalidate`,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:R,android:z,linux:V},timeoutPolicy:{...Ye,envelopeMs:21e4},postActionObservation:Y(`longpress`),batchable:!0},{name:`press`,targetIdentityVerification:`pre-dispatch`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`interaction`,refFrameEffect:`may-invalidate`,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:R,android:z,linux:V},timeoutPolicy:J(`press`),postActionObservation:Y(`press`),responseDataTransform:Xe,batchable:!0},{name:`type`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`interaction`,refFrameEffect:`may-invalidate`,androidBlockingDialogGuard:!0},dispatch:{},capability:U,timeoutPolicy:J(`type`),batchable:!0},{name:`get`,targetIdentityVerification:`pre-dispatch`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`observes-app`,daemon:{route:`interaction`,refFrameEffect:`preserve`},capability:U,timeoutPolicy:J(`get`),batchable:!0},{name:`read`,catalog:{group:`dispatch-alias`},recordsSessionAction:!1,dispatch:{},timeoutPolicy:O,batchable:!1},{name:`is`,targetIdentityVerification:`pre-dispatch`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`observes-app`,daemon:{route:`interaction`,refFrameEffect:`preserve`},capability:U,timeoutPolicy:J(`is`),batchable:!0},{name:`back`,catalog:{group:`public`},...G,capability:{...G.capability,vega:B}},{name:`gesture`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`interaction`,refFrameEffect:`may-invalidate`,androidBlockingDialogGuard:!0},capability:U,timeoutPolicy:O,batchable:!0},{name:`home`,catalog:{group:`public`},...G,capability:{...G.capability,vega:B}},{name:`tv-remote`,catalog:{group:`public`,key:`tvRemote`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`generic`,refFrameEffect:`may-invalidate`,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:R,android:z,vega:B,linux:H},timeoutPolicy:O,batchable:!0},{name:`orientation`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`generic`,refFrameEffect:`may-invalidate`,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:R,android:z,linux:H},timeoutPolicy:O,batchable:!0},{name:`scroll`,catalog:{group:`public`},...G},{name:`swipe`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`interaction`,refFrameEffect:`may-invalidate`,androidBlockingDialogGuard:!0},capability:{apple:R,android:z,linux:V},timeoutPolicy:O,batchable:!0},{name:`focus`,catalog:{group:`public`},...G},{name:`screenshot`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`observes-app`,daemon:{route:`generic`,refFrameEffect:`preserve`},dispatch:{},capability:U,timeoutPolicy:O,batchable:!0},{name:`viewport`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`generic`,refFrameEffect:`may-invalidate`},dispatch:{},capability:{apple:{},android:{},linux:H},timeoutPolicy:O,batchable:!1},{name:`app-switcher`,catalog:{group:`public`,key:`appSwitcher`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`generic`,refFrameEffect:`may-invalidate`},dispatch:{},capability:{apple:R,android:z,linux:H},timeoutPolicy:O,batchable:!0},{name:`install-from-source`,catalog:{group:`public`,key:`installFromSource`},recordsSessionAction:!0,recordingEffect:`mutates-app`,capability:W,timeoutPolicy:O,batchable:!0},{name:`debug`,catalog:{group:`local-cli`},recordsSessionAction:!1,timeoutPolicy:O,batchable:!1},{name:`daemon`,catalog:{group:`local-cli`},recordsSessionAction:!1,timeoutPolicy:O,batchable:!1,mcpExposed:!1},{name:`device`,catalog:{group:`local-cli`},recordsSessionAction:!1,timeoutPolicy:O,batchable:!1,mcpExposed:!1},{name:`metro`,catalog:{group:`local-cli`},recordsSessionAction:!1,timeoutPolicy:O,batchable:!1},{name:`session`,catalog:{group:`local-cli`},recordsSessionAction:!1,timeoutPolicy:O,batchable:!1},{name:`cdp`,catalog:{group:`local-cli`},recordsSessionAction:!1,timeoutPolicy:O,batchable:!1,mcpExposed:!1},{name:`auth`,catalog:{group:`local-cli`},recordsSessionAction:!1,timeoutPolicy:O,batchable:!1,mcpExposed:!1},{name:`connect`,catalog:{group:`local-cli`},recordsSessionAction:!1,timeoutPolicy:O,batchable:!1,mcpExposed:!1},{name:`connection`,catalog:{group:`local-cli`},recordsSessionAction:!1,timeoutPolicy:O,batchable:!1,mcpExposed:!1},{name:`disconnect`,catalog:{group:`local-cli`},recordsSessionAction:!1,timeoutPolicy:O,batchable:!1,mcpExposed:!1},{name:`mcp`,catalog:{group:`local-cli`},recordsSessionAction:!1,timeoutPolicy:O,batchable:!1,mcpExposed:!1},{name:`proxy`,catalog:{group:`local-cli`},recordsSessionAction:!1,timeoutPolicy:O,batchable:!1,mcpExposed:!1},{name:`react-devtools`,catalog:{group:`local-cli`,key:`reactDevtools`},recordsSessionAction:!1,timeoutPolicy:O,batchable:!1,mcpExposed:!1},{name:`web`,catalog:{group:`local-cli`},recordsSessionAction:!1,timeoutPolicy:O,batchable:!1,mcpExposed:!1}],$e=new Set([`public`,`local-cli`]),et=new Set(Qe.filter(e=>$e.has(ot(e))).map(e=>e.name)),X=Qe.map(e=>({...e,mcpExposed:it(e)}));function tt(e){return X.filter(t=>ot(t)===e).map(e=>[st(e),e.name])}function nt(){return X.filter(e=>at(e)).map(e=>e.name).sort()}const Z=new Map(X.map(e=>[e.name,e]));function rt(e){return et.has(e)}function it(e){return e.mcpExposed??et.has(e.name)}function at(e){return e.mcpExposed&&rt(e.name)}function ot(e){return e.catalog.group}function st(e){return e.catalog.key??e.name}const ct=new Map(X.map(e=>[e.name,e.timeoutPolicy])),lt=new Map(Array.from(Z.values()).flatMap(e=>e.responseDataTransform?[[e.name,e.responseDataTransform]]:[]));function ut(e){if(e!==void 0)return Z.get(e)?.postActionObservation}function dt(e){return ut(e)!==void 0}function ft(e){return ut(e)===`settle-and-verify`}function pt(e){return e===void 0?O:ct.get(e)??O}function mt(e){if(e!==void 0)return lt.get(e)}function ht(e){return e===void 0?!1:Z.get(e)?.recordsSessionAction??!1}function gt(e){return Z.get(e)?.targetIdentityVerification}function _t(e){let t=Z.get(e.command);if(t?.recordsSessionAction)return typeof t.recordingEffect==`function`?t.recordingEffect(e):t.recordingEffect}function vt(){return[...new Set(Array.from(lt.values()).flatMap(e=>Object.keys(e.fields)))].sort()}function yt(e){return Number.isInteger(e)&&e>=1&&e<=1e3}function bt(t,n){if(t>n)throw new e(`INVALID_ARGS`,`batch has ${t} steps; max allowed is ${n}.`)}function xt(t,n){if(!i(t))throw new e(`INVALID_ARGS`,`Invalid batch step ${n}.`);return t}function St(t,n){let r=t.input;if(!i(r))throw new e(`INVALID_ARGS`,`Batch step ${n} input must be an object.`);return r}function Ct(t,r){if(t!==void 0)try{return n.parse(t)}catch(t){throw new e(`INVALID_ARGS`,`Batch step ${r} runtime is invalid: ${t instanceof Error?t.message:String(t)}`)}}function wt(t,n,r={}){let i=t[n];if(i===void 0)return;if(!Number.isInteger(i))throw new e(`INVALID_ARGS`,`Expected ${n} to be an integer.`);let a=i;if(r.min!==void 0&&a<r.min)throw new e(`INVALID_ARGS`,`Expected ${n} to be at least ${r.min}.`);if(r.max!==void 0&&a>r.max)throw new e(`INVALID_ARGS`,`Expected ${n} to be at most ${r.max}.`);return a}function Tt(e){let t=e.trim();if(!t||/\s/.test(t))return!1;let n=/^([A-Za-z][A-Za-z0-9+.-]*):(.+)$/.exec(t);if(!n)return!1;let r=n[1]?.toLowerCase(),i=n[2]??``;return r===`http`||r===`https`||r===`ws`||r===`wss`||r===`ftp`||r===`ftps`?i.startsWith(`//`):!0}function Et(e){let t=e.trim().split(`:`)[0]?.toLowerCase();return t===`http`||t===`https`}function Dt(e,t){let n=e?.trim();if(n)return n;if(Et(t))return`com.apple.mobilesafari`}function Ot(e){let t=[];for(let n of e)n.daemon&&t.push({command:n.name,...n.daemon,replayScopedAction:n.recordsSessionAction});return t}function kt(e){let t={};for(let n of e)n.capability&&(t[n.name]=n.capability);return t}function At(e){return e.filter(e=>e.batchable).map(e=>e.name)}const jt=At(X),Mt=new Set([`batch`,`replay`]),Nt=[`command`,`positionals`,`input`,`flags`,`runtime`],Pt=[`platform`,`target`,`device`,`udid`,`serial`,`verbose`,`out`],Ft=new Set(jt);function It(e){return Ft.has(e)}function Lt(e){return typeof e==`string`?e.trim().toLowerCase():``}function Rt(t,n){let r=Lt(t);if(It(r))return r;throw new e(`INVALID_ARGS`,`Batch step ${n} command is not available through command batch: ${String(t)}`)}function zt(t,n){if(Mt.has(t))throw new e(`INVALID_ARGS`,`Batch step ${n} cannot run ${t}.`)}const Bt=new Set(Nt);async function Vt(e,t,n){let i=Q(e.flags),a=i?.batchOnError??`stop`;if(a!==`stop`)return $(`INVALID_ARGS`,`Unsupported batch on-error mode: ${a}.`);let o=i?.batchMaxSteps??100;if(!yt(o))return $(`INVALID_ARGS`,`Invalid batch max-steps: ${String(i?.batchMaxSteps)}`);try{let r=Ht(i?.batchSteps,o),a=Date.now(),s=[];for(let[i,a]of r.entries()){let o=await qt(e,t,a,n,i+1,i===r.length-1);if(!o.ok)return{ok:!1,error:{code:o.error.code,message:`Batch failed at step ${o.step} (${a.command}): ${o.error.message}`,hint:o.error.hint,diagnosticId:o.error.diagnosticId,logPath:o.error.logPath,details:{...o.error.details??{},step:o.step,command:a.command,positionals:a.positionals,executed:i,total:r.length,partialResults:s}}};s.push(o.result)}return{ok:!0,data:{total:r.length,executed:r.length,totalDurationMs:Date.now()-a,results:s}}}catch(e){let t=r(e);return $(t.code,t.message,t.details)}}function Ht(t,n){if(!Array.isArray(t)||t.length===0)throw new e(`INVALID_ARGS`,`batch requires a non-empty batchSteps array.`);bt(t.length,n);let r=[];for(let n=0;n<t.length;n+=1){let i=t[n];if(!f(i))throw new e(`INVALID_ARGS`,`Invalid batch step at index ${n}.`);let a=Object.keys(i).filter(e=>!Bt.has(e));if(a.length>0){let t=a.map(e=>`"${e}"`).join(`, `);throw new e(`INVALID_ARGS`,`Batch step ${n+1} has unknown field(s): ${t}. Allowed fields: command, positionals, input, flags, runtime.`)}let o=Lt(i.command);if(!o)throw new e(`INVALID_ARGS`,`Batch step ${n+1} requires command.`);if(zt(o,n+1),i.positionals!==void 0&&!Array.isArray(i.positionals))throw new e(`INVALID_ARGS`,`Batch step ${n+1} positionals must be an array.`);let s=i.positionals??[];if(s.some(e=>typeof e!=`string`))throw new e(`INVALID_ARGS`,`Batch step ${n+1} positionals must contain only strings.`);if(i.flags!==void 0&&!f(i.flags))throw new e(`INVALID_ARGS`,`Batch step ${n+1} flags must be an object.`);if(i.input!==void 0&&!f(i.input))throw new e(`INVALID_ARGS`,`Batch step ${n+1} input must be an object.`);r.push({command:o,positionals:s,input:i.input,flags:i.flags??{},runtime:Ct(i.runtime,n+1)})}return r}function Ut(e,t){let{batchSteps:n,batchOnError:r,batchMaxSteps:i,...a}=t??{};return Wt(Q(e),a)}function Wt(e,t){let n=Q(e)??{},r=t;for(let e of Pt)r[e]===void 0&&n[e]!==void 0&&(r[e]=n[e]);return t}function Gt(e,n){return t(e)?n?e:`digest`:e}function Kt(e,t){let n=e?.responseLevel,r=Gt(n,t);return r===n?e:{...e,responseLevel:r}}async function qt(e,t,n,r,i,a){let o=Date.now(),s=Ut(e.flags,n.flags);s.session===void 0&&(s.session=t);let c=await r({token:e.token,session:t,command:n.command,positionals:n.positionals,input:n.input,flags:s,runtime:n.runtime===void 0?e.runtime:n.runtime,meta:Kt(e.meta,a)}),l=Date.now()-o;return c.ok?{ok:!0,step:i,result:{step:i,command:n.command,ok:!0,data:c.data??{},durationMs:l}}:{ok:!1,step:i,error:c.error}}function Q(e){return e}function $(e,t,n){return{ok:!1,error:{code:e,message:t,...n?{details:n}:{}}}}export{re as $,Ae as A,ve as B,ht as C,D,gt as E,S as F,fe as G,be as H,w as I,oe as J,de as K,Le as L,Ie as M,Me as N,E as O,b as P,l as Q,ge as R,_t as S,pt as T,g as U,xe as V,h as W,ie as X,ae as Y,ee as Z,dt as _,kt as a,i as at,tt as b,Et as c,bt as d,te as et,yt as f,X as g,xt as h,Rt as i,pe as it,C as j,T as k,Dt as l,St as m,Vt as n,c as nt,Ot as o,Ct as p,f as q,jt as r,me as rt,Tt as s,Wt as t,ne as tt,wt as u,ft as v,mt as w,nt as x,vt as y,Se as z};
|
|
1
|
+
import{_ as e,a as t,i as n,u as r,v as i}from"./sdk-contracts.js";function a(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function o(t,n,r,i){let a=r(t[n]);if(a===void 0)throw new e(`COMMAND_FAILED`,i,{response:t});return a}function s(e,t,n){return n(e[t])}function c(e,t,n){let r=e[t];return r===null?null:n(r)}function l(e,t){return o(e,t,oe,`Daemon response is missing "${t}".`)}function u(e,t){return s(e,t,oe)}function d(e,t){return c(e,t,oe)}function ee(e,t){return o(e,t,se,`Daemon response is missing numeric "${t}".`)}function te(e,t){return o(e,t,ce,`Daemon response has invalid "${t}".`)}function ne(e,t){return o(e,t,le,`Daemon response has invalid "${t}".`)}function re(e,t){return s(e,t,ue)??`mobile`}function ie(e){if(!p(e))return;let t=f(e,`x`),n=f(e,`y`),r=f(e,`width`),i=f(e,`height`);if(!(t===void 0||n===void 0||r===void 0||i===void 0))return{x:t,y:n,width:r,height:i}}function ae(e){if(!p(e))return;let t=f(e,`x`),n=f(e,`y`);if(!(t===void 0||n===void 0))return{x:t,y:n}}function f(e,t){let n=e[t];return typeof n==`number`?n:void 0}function oe(e){return typeof e==`string`&&e.length>0?e:void 0}function se(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}function ce(e){return e===`apple`?`ios`:e===`ios`||e===`macos`||e===`android`||e===`vega`||e===`linux`||e===`web`?e:void 0}function le(e){return e===`simulator`||e===`emulator`||e===`device`?e:void 0}function ue(e){return e===`tv`||e===`mobile`||e===`desktop`?e:void 0}function de(t){if(!p(t))throw new e(`COMMAND_FAILED`,`Daemon returned an unexpected response shape.`,{value:t});return t}function p(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function fe(e){return p(e)?e:void 0}function pe(e){let t={};for(let[n,r]of Object.entries(e))r!==void 0&&(t[n]=r);return t}function me(e){return e.split(`
|
|
2
|
+
`).map(e=>e.trim()).filter(e=>e.length>0)}function he(e){let t=`${e??``}`.toLowerCase();return t.includes(`scroll`)||t.includes(`recyclerview`)||t.includes(`listview`)||t.includes(`gridview`)||t.includes(`collectionview`)||t===`table`}function ge(e){return he(e.type)?!0:`${e.role??``} ${e.subrole??``}`.toLowerCase().includes(`scroll`)}function m(e){return new Map(e.map(e=>[e.index,e]))}function _e(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 h(e){return!!(e&&[e.x,e.y,e.width,e.height].every(Number.isFinite)&&e.width>0&&e.height>0)}function ve(e,t){return t.x>=e.x&&t.y>=e.y&&t.x+t.width<=e.x+e.width&&t.y+t.height<=e.y+e.height}function ye(e){return e.width*e.height}function be(e,t,n){return t>=e.x&&t<=e.x+e.width&&n>=e.y&&n<=e.y+e.height}function g(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 xe(e,t){return Se(e.x,e.x+e.width,t.x,t.x+t.width)&&Se(e.y,e.y+e.height,t.y,t.y+t.height)}function Se(e,t,n,r){return Math.max(e,n)<=Math.min(t,r)}function _(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 Ce(e,t){let n=_(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 v(e){return[e.label,e.value,e.identifier].map(e=>typeof e==`string`?e.trim():``).filter(e=>e.length>0)[0]??``}function we(e){let t=[e.type,e.role,e.subrole].map(e=>_(e??``)).join(` `);return t.includes(`application`)||t.includes(`window`)}function y(e,t){let n=r(t),i=e.flatMap(e=>Te(e.rect)?[{node:e,rect:e.rect}]:[]),a=i.filter(e=>we(e.node)).map(e=>e.rect),o=e=>be(e,n.x,n.y);return g(a.filter(o))??g(a)??g(i.map(e=>e.rect).filter(o))}function Te(e){return e?Number.isFinite(e.x)&&Number.isFinite(e.y)&&Number.isFinite(e.width)&&Number.isFinite(e.height):!1}function Ee(e,t,n=m(t)){if(!e.rect)return!0;let r=ke(e,t,n);return r?xe(e.rect,r):!0}function De(e,t,n=m(t)){if(!e.rect)return!0;if(!Ee(e,t,n))return!1;let r=y(t,e.rect);return Oe(e.rect,r)}function Oe(e,t){return!t||t.width<=0||t.height<=0?!0:be(t,e.x+e.width/2,e.y+e.height/2)}function ke(e,t,n=m(t)){return Ae(e,n,e=>!!e.rect)?.rect||y(t,e.rect??{x:0,y:0,width:0,height:0})}function Ae(e,t,n=()=>!0){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)&&ge(r))return r;r=typeof r.parentIndex==`number`?t.get(r.parentIndex):void 0}return null}function je(e,t){if(t===`android`&&e.visibleToUser===!1)return!1;let n=_(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&&h(e.rect):e.hittable===!0||h(e.rect)}function b(e){return e.hittable===!0?!0:e.rect?e.rect.width>0&&e.rect.height>0:!1}function Me(e,t){return Ce(e.type??``,t)&&e.enabled!==!1}const Ne=new Set([`id`,`role`,`text`,`label`,`value`,`appname`,`windowtitle`]),Pe=new Set([`visible`,`hidden`,`editable`,`selected`,`focused`,`enabled`,`hittable`]),x=new Set([...Ne,...Pe]),Fe=[...x],Ie=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 Le(e){return Ie.has(e.trim().toLowerCase())}const Re=new Map([[`"`,`"`],[`'`,`'`],[`\\`,`\\`],[`/`,`/`],[`b`,`\b`],[`f`,`\f`],[`n`,`
|
|
3
|
+
`],[`r`,`\r`],[`t`,` `]]);function S(t){let n=t.trim();if(!n)throw new e(`INVALID_ARGS`,`Selector expression cannot be empty`);let r=Ue(n);if(r.length===0)throw new e(`INVALID_ARGS`,`Selector expression cannot be empty`);return{raw:n,selectors:r.map(e=>Ve(e))}}function C(e){try{return S(e)}catch{return null}}function ze(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 x.has(e)}return x.has(t.toLowerCase())}function Be(e){let t=e.trim(),n=t.indexOf(`=`);if(n===-1)return null;let r=t.slice(0,n).trim().toLowerCase();if(!r||x.has(r))return null;let i=t.slice(n+1).trim();if(!i)return null;let a=Ke(i).trim();return a?{key:r,value:a}:null}function w(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||!ze(t))break;r+=1;let n=e.slice(0,r).join(` `).trim();n&&C(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 Ve(t){let n=t.trim();if(!n)throw new e(`INVALID_ARGS`,`Selector segment cannot be empty`);let r=We(n);if(r.length===0)throw new e(`INVALID_ARGS`,`Invalid selector segment: ${t}`);return{raw:n,terms:r.map(He)}}function He(t){let n=t.trim();if(!n)throw new e(`INVALID_ARGS`,`Empty selector term`);let r=n.indexOf(`=`);if(r===-1){let r=n.toLowerCase();if(!Pe.has(r))throw new e(`INVALID_ARGS`,`Invalid selector term "${t}", expected key=value`);return{key:r,value:!0}}let i=n.slice(0,r).trim().toLowerCase(),a=n.slice(r+1).trim();if(!x.has(i))throw new e(`INVALID_ARGS`,`Unknown selector key: ${i}`);if(!a)throw new e(`INVALID_ARGS`,`Missing selector value for key: ${i}`);if(Pe.has(i)){let t=Ye(a);if(t===null)throw new e(`INVALID_ARGS`,`Invalid boolean value for ${i}: ${a}`);return{key:i,value:t}}return{key:i,value:Ke(a)}}function Ue(t){let n=[],r=``,i=null;for(let a=0;a<t.length;a+=1){let o=t[a];if((o===`"`||o===`'`)&&!Xe(t,a)){i=Ge(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 We(t){let n=[],r=``,i=null;for(let e=0;e<t.length;e+=1){let a=t.charAt(e);if((a===`"`||a===`'`)&&!Xe(t,e)){i=Ge(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 Ge(e,t){return e?e===t?null:e:t}function Ke(e){let t=e.trim();return t.startsWith(`"`)&&t.endsWith(`"`)||t.startsWith(`'`)&&t.endsWith(`'`)?qe(t.slice(1,-1)):t}function qe(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=Je(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 Je(e){return Re.get(e)??null}function Ye(e){let t=Ke(e).toLowerCase();return t===`true`?!0:t===`false`?!1:null}function Xe(e,t){let n=0;for(let r=t-1;r>=0&&e[r]===`\\`;--r)n+=1;return n%2==1}const Ze=[`any`,`text`,`label`,`value`,`role`,`id`],Qe=[`text`,`label`,`value`,`role`,`id`];function $e(e){let t=e?.toLowerCase();return t===`press`||t===`tap`?`click`:t}function et(e){return e===`exists`||e===`wait`||e===`get_text`||e===`get_attrs`||e===`list`}function tt(e,t,n,r={}){let i=E(n);if(!i)return{matches:[],score:0};let a=0,o=[];for(let n of e){if(r.requireRect&&!n.rect)continue;let e=nt(n,t,i);if(!(e<=0)){if(e>a){a=e,o.length=0,o.push(n);continue}e===a&&o.push(n)}}return{matches:o,score:a}}function nt(e,t,n){switch(t){case`role`:return rt(e.type,n);case`label`:return T(e.label,n);case`value`:return T(e.value,n);case`id`:return T(e.identifier,n);default:return Math.max(T(e.label,n),T(e.value,n),T(e.identifier,n))}}function T(e,t){let n=E(e??``);return n?n===t?2:+!!n.includes(t):0}function rt(e,t){let n=it(e??``);return n?n===t?2:+!!n.includes(t):0}function E(e){return e.trim().toLowerCase().replace(/\s+/g,` `)}function it(e){let t=e.trim();return t?(t=(t.split(`.`).pop()??t).replace(/XCUIElementType/gi,``).toLowerCase(),t):``}const at=`find requires a value`,ot=`find actions: click (default; press/tap are aliases), list, focus, fill, type, exists, wait, get text, get attrs — there is no longpress/swipe find action. Run find "<text>" list to inspect every match with its @ref without acting, then dispatch the gesture on the chosen ref, e.g. longpress @eNN.`;function st(e,t){if(e.length===0)return{ok:!1,code:`INVALID_ARGS`,message:`find requires a locator or text`};let n=D([...e]);return n.query?t?.findFirst&&t?.findLast?{ok:!1,code:`INVALID_ARGS`,message:`find accepts only one of --first or --last`}:{ok:!0,parsed:n}:{ok:!1,code:`INVALID_ARGS`,message:at}}const ct=[`exists`,`list`,`click`,`focus`];function lt(e){return ct.includes(e)}function D(t){let n=`any`,r=0;Qe.includes(t[0])&&(n=t[0],r=1);let i=t[r]??``,a=t.slice(r+1);if(a.length===0)return{locator:n,query:i,action:`click`};let o=$e(a[0]);if(lt(o))return{locator:n,query:i,action:o};if(o===`get`)return{locator:n,query:i,action:ut(a[1])};if(o===`wait`){let e=ft(a[1]);return{locator:n,query:i,action:`wait`,timeoutMs:e??void 0}}if(o===`fill`||o===`type`)return{locator:n,query:i,action:o,value:a.slice(1).join(` `)};throw new e(`INVALID_ARGS`,`Unsupported find action: ${a[0]}`,{hint:ot})}function ut(t){let n=t?.toLowerCase();if(n===`text`)return`get_text`;if(n===`attrs`)return`get_attrs`;throw new e(`INVALID_ARGS`,`find get only supports text or attrs`)}function dt(e,t){return e!==`any`||!t.includes(`=`)&&!t.includes(`||`)?null:C(t)?t:null}function ft(e){if(!e)return null;let t=Number(e);return Number.isFinite(t)?t:null}function O(e,t,n){return t.terms.every(t=>pt(e,t,n))}function pt(e,t,n){switch(t.key){case`id`:return k(e.identifier,String(t.value));case`role`:return k(_(e.type??``),String(t.value));case`label`:return k(e.label,String(t.value));case`value`:return k(e.value,String(t.value));case`text`:return k(v(e),String(t.value));case`appname`:return k(e.appName,String(t.value));case`windowtitle`:return k(e.windowTitle,String(t.value));case`visible`:return b(e)===!!t.value;case`hidden`:return!b(e)==!!t.value;case`editable`:return Me(e,n)===!!t.value;case`selected`:return e.selected===!0==!!t.value;case`focused`:return e.focused===!0==!!t.value;case`enabled`:return e.enabled!==!1==!!t.value;case`hittable`:return e.hittable===!0==!!t.value;default:return!1}}function k(e,t){return E(e??``)===E(t)}function A(e,t,n){let r=n.requireRect??!1,i=n.requireUnique??!0,a=[];for(let[o,s]of t.selectors.entries()){let t=vt(e,s,n.platform,r);if(a.push({selector:s.raw,matches:t.count}),!(t.count===0||!t.firstNode)){if(i&&t.count!==1){if(!n.disambiguateAmbiguous||!t.disambiguated||!t.tiebreak)continue;return{node:t.disambiguated,selector:s,selectorIndex:o,matches:t.count,diagnostics:a,disambiguation:{matchCount:t.count,tiebreak:t.tiebreak,alternatives:t.candidates.filter(e=>e!==t.disambiguated)}}}return{node:t.firstNode,selector:s,selectorIndex:o,matches:t.count,diagnostics:a}}}return null}function j(e,t,n){let r=n.requireRect??!1;for(let[i,a]of t.selectors.entries()){let t=e.filter(e=>r&&!e.rect?!1:O(e,a,n.platform));if(t.length>0)return{selector:a,selectorIndex:i,matchedNodes:t}}return null}function mt(e,t,n){let r=n.requireRect??!1,i=[];for(let[a,o]of t.selectors.entries()){let t=St(e,o,n.platform,r);if(i.push({selector:o.raw,matches:t}),t>0)return{selectorIndex:a,selector:o,matches:t,diagnostics:i}}return null}const ht=`Snapshot refs expire when the UI changes. Run snapshot -i and retry with a fresh @ref.`;function gt(e){return e.some(e=>e.matches>1)?`Add more terms to disambiguate (e.g. role=button text="Sign in"), use an @ref from snapshot -i, or use find <text> --first/--last.`:`Selector text/label values match exactly (quote multi-word values: text="Sign in"). Run snapshot -i to see current elements and refs, or use find <text> for contains matching.`}function _t(e,t,n){if(t.length===0)return`Selector did not match: ${e}`;let r=t.map(e=>`${e.selector} -> ${e.matches}`).join(`, `);return n.unique??!0?`Selector did not resolve uniquely (${r})`:`Selector did not match (${r})`}function vt(e,t,n,r){let i=0,a=null,o=[],s={best:null,bestVisible:!1,tie:!1},c,l=t=>(c??=m(e),De(t,e,c));for(let c of e)r&&!c.rect||O(c,t,n)&&(i+=1,a??=c,o.push(c),yt(s,c,l));return{count:i,firstNode:a,disambiguated:s.tie?null:s.best,tiebreak:s.tie?null:bt(o,s.best,l),candidates:o}}function yt(e,t,n){if(!e.best){e.best=t;return}e.bestVisible||=n(e.best);let r=n(t);if(r!==e.bestVisible){r&&(e.best=t,e.bestVisible=!0,e.tie=!1);return}let i=Ct(t,e.best);i.result>0?(e.best=t,e.tie=!1):i.result===0&&(e.tie=!0)}function bt(e,t,n){if(!t)return null;let r=null;for(let i of e)i!==t&&(!r||xt(i,r,n).result>0)&&(r=i);return r?xt(t,r,n).criterion:null}function xt(e,t,n){let r=n(e);return r===n(t)?Ct(e,t):{result:r?1:-1,criterion:`visible`}}function St(e,t,n,r){let i=0;for(let a of e)r&&!a.rect||O(a,t,n)&&(i+=1);return i}function Ct(e,t){let n=e.depth??0,r=t.depth??0;if(n!==r)return{result:n>r?1:-1,criterion:`deepest`};let i=wt(e),a=wt(t);return i===a?{result:0,criterion:null}:{result:i<a?1:-1,criterion:`smallest-area`}}function wt(e){return e.rect?e.rect.width*e.rect.height:1/0}function Tt(e,t,n,r){let i={...r,requireRect:n.requireRect};if(n.ambiguity===`reject-candidates`){let n=j(e,t,i);return!n||n.matchedNodes.length===0?{kind:`none`}:n.matchedNodes.length>1?{kind:`ambiguous`,selector:n.selector.raw,selectorIndex:n.selectorIndex,matchedNodes:n.matchedNodes}:Et(n)}if(n.ambiguity===`first-match`){let n=j(e,t,i);return!n||n.matchedNodes.length===0?{kind:`none`}:Et(n)}let a=A(e,t,{...i,requireUnique:!0,disambiguateAmbiguous:n.ambiguity===`disambiguate`});if(a)return{kind:`resolved`,resolution:a,matchedNodes:j(e,t,i)?.matchedNodes??[a.node]};let o=j(e,t,i);return!o||o.matchedNodes.length===0?{kind:`none`}:{kind:`ambiguous`,selector:o.selector.raw,selectorIndex:o.selectorIndex,matchedNodes:o.matchedNodes}}function Et(e){let t=e.matchedNodes[0];return t?{kind:`resolved`,matchedNodes:e.matchedNodes,resolution:{node:t,selector:e.selector,selectorIndex:e.selectorIndex,matches:e.matchedNodes.length,diagnostics:[{selector:e.selector.raw,matches:e.matchedNodes.length}]}}:{kind:`none`}}function M(e,t){return{ok:!1,code:`INVALID_ARGS`,message:e,...t?{hint:t}:{}}}function Dt(e){return[`visible`,`hidden`,`exists`,`editable`,`selected`,`focused`,`text`].includes(e)}function Ot(e){let t=e.toLowerCase();return Dt(t)?{ok:!0,predicate:t}:M(`is requires predicate: visible|hidden|exists|editable|selected|focused|text`,kt)}const kt=`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 At(e){if(Dt((e[0]??``).toLowerCase()))return e;for(let t=1;t<e.length;t+=1){let n=(e[t]??``).toLowerCase();if(Dt(n)&&C(e.slice(0,t).join(` `)))return[n,...e.slice(0,t),...e.slice(t+1)]}return e}function jt(e){let{predicate:t,node:n,nodes:r,expectedText:i,platform:a}=e,o=v(n),s=Me(n,a),c=n.selected===!0,l=n.focused===!0,u=t===`text`?b(n):Mt(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 ee=t===`text`?`expected="${i??``}" actual="${o}"`:`actual=${JSON.stringify({visible:u,editable:s,selected:c,focused:l})}`;return{pass:d,actualText:o,details:ee}}function Mt(e,t,n){if(n===`android`&&e.visibleToUser===!1)return!1;if(h(e.rect))return Nt(e,t);if(e.rect)return!1;if(n!==`android`&&e.hittable===!0)return!0;let r=Pt(e,t,n);return r?h(r.rect)?Nt(r,t):n!==`android`&&r.hittable===!0:!1}function Nt(e,t){return Ee(e,t)}function Pt(e,t,n){return _e(t,e,m(t),e=>je(e,n)?e:null)}function Ft(e){let t=At(e),n=t[0]??``;return{predicate:n,split:w(t.slice(1),{preferTrailingValue:n===`text`})}}const It=`is requires a selector expression`,Lt=`is text requires expected text value`;function Rt(e){let{predicate:t,split:n}=Ft([...e]),r=Ot(t);if(!r.ok)return r;if(!n)return M(It);let i=n.rest.join(` `).trim();return r.predicate===`text`&&!i?M(Lt):r.predicate!==`text`&&n.rest.length>0?M(`is ${r.predicate} does not accept trailing values`):{ok:!0,predicate:r.predicate,selectorExpression:n.selectorExpression,expectedText:i}}function zt(e){return e===`text`||e===`attrs`?{ok:!0,format:e}:M(`get only supports text or attrs`)}function Bt(e){let t=e[0];if(t?.startsWith(`@`)){let n=e.slice(1).join(` `).trim();return{ok:!0,ref:t,...n?{label:n}:{}}}let n=e.join(` `).trim();return n?{ok:!0,selector:n}:M(`get requires @ref or selector expression`)}function Vt(e){return e?{ok:!0,text:e}:M(`wait requires text`)}function Ht(t,n,r={}){let i=t[n];if(i===void 0)return;if(!Number.isInteger(i))throw new e(`INVALID_ARGS`,`Expected ${n} to be an integer.`);let a=i;if(r.min!==void 0&&a<r.min)throw new e(`INVALID_ARGS`,`Expected ${n} to be at least ${r.min}.`);if(r.max!==void 0&&a>r.max)throw new e(`INVALID_ARGS`,`Expected ${n} to be at most ${r.max}.`);return a}function Ut(t,n,r={}){let i=t[n];if(i!==void 0){if(typeof i!=`number`||!Number.isFinite(i))throw new e(`INVALID_ARGS`,`Expected ${n} to be a finite number.`);if(r.min!==void 0&&i<r.min)throw new e(`INVALID_ARGS`,`Expected ${n} to be at least ${r.min}.`);if(r.max!==void 0&&i>r.max)throw new e(`INVALID_ARGS`,`Expected ${n} to be at most ${r.max}.`);return i}}const Wt=/^#\s*agent-device:target-v(\d+)(?:\s+(\S.*))?$/,Gt=/^#\s*agent-device:targets-v(\d+)(?:\s+(\S.*))?$/,Kt=4096;function qt(e){return e.normalize(`NFC`)}function Jt(e){if(e===void 0)return;let t=qt(e);return t.length>0?t:void 0}function Yt(e){return qt(e)}function Xt(e){if(e===void 0)return;let t=qt(e).trim().replace(/\s+/g,` `);return t.length>0?t:void 0}function N(e){return Buffer.byteLength(e,`utf8`)}function Zt(e,t){if(N(e)<=t)return e;let n=e.length;for(;n>0&&N(e.slice(0,n))>t;)--n;if(n>0){let t=e.charCodeAt(n-1);t>=55296&&t<=56319&&--n}return e.slice(0,n)}function Qt(e){let t={};return e.id!==void 0&&(t.id=e.id),t.role=e.role,e.label!==void 0&&(t.label=e.label),t.ancestry=e.ancestry.map($t),t.sibling=e.sibling,t.viewportOrder=e.viewportOrder,e.scrollRegion&&(t.scrollRegion=en(e.scrollRegion)),e.rect&&(t.rect=tn(e.rect)),t.verification=e.verification,t}function $t(e){let t={role:e.role};return e.label!==void 0&&(t.label=e.label),t}function en(e){let t={role:e.role};return e.id!==void 0&&(t.id=e.id),e.label!==void 0&&(t.label=e.label),t}function tn(e){return{x:e.x,y:e.y,width:e.width,height:e.height}}function nn(e){return JSON.stringify(Qt(e))}function rn(e){return`# agent-device:target-v1 ${nn(e)}`}function an(e){return JSON.stringify({source:Qt(e.source),destination:Qt(e.destination)})}function on(e){return`# agent-device:targets-v1 ${an(e)}`}function sn(e){let t=e.trim(),n=Gt.exec(t);return n?Number(n[1])===1?{kind:`v1`,evidence:cn((n[2]??``).trim())}:{kind:`future-version`}:{kind:`none`}}function cn(t){if(N(t)>8320)throw new e(`INVALID_ARGS`,`targets-v1 annotation exceeds the 8320-byte payload cap.`);let n;try{n=JSON.parse(t)}catch{throw new e(`INVALID_ARGS`,`targets-v1 annotation is not valid JSON.`)}if(typeof n!=`object`||!n||Array.isArray(n))throw new e(`INVALID_ARGS`,`targets-v1 annotation must be a JSON object.`);let r=n;if(r.source===void 0||r.destination===void 0)throw new e(`INVALID_ARGS`,`targets-v1 annotation requires source and destination evidence.`);return{source:un(JSON.stringify(r.source)),destination:un(JSON.stringify(r.destination))}}function ln(e){let t=e.trim();if(!t.startsWith(`#`))return{kind:`none`};let n=Wt.exec(t);return n?Number(n[1])===1?{kind:`v1`,evidence:un((n[2]??``).trim())}:{kind:`future-version`}:{kind:`none`}}function un(t){if(N(t)>4096)throw new e(`INVALID_ARGS`,`target-v1 annotation exceeds the ${Kt}-byte payload cap.`);let n;try{n=JSON.parse(t)}catch{throw new e(`INVALID_ARGS`,`target-v1 annotation is not valid JSON.`)}if(typeof n!=`object`||!n||Array.isArray(n))throw new e(`INVALID_ARGS`,`target-v1 annotation must be a JSON object.`);let r=n,i=dn(r.role,`role`),a=fn(r.id,`id`),o=pn(r.label,`label`),s=hn(r.ancestry),c=_n(r.sibling,`sibling`,0),l=_n(r.viewportOrder,`viewportOrder`,0),u=vn(r.scrollRegion),d=yn(r.rect),ee=bn(r.verification);return{...a===void 0?{}:{id:a},role:i,...o===void 0?{}:{label:o},ancestry:s,sibling:c,viewportOrder:l,...u?{scrollRegion:u}:{},...d?{rect:d}:{},verification:ee}}function dn(t,n){if(t===void 0)throw new e(`INVALID_ARGS`,`target-v1 "${n}" is required.`);if(typeof t!=`string`)throw new e(`INVALID_ARGS`,`target-v1 "${n}" must be a string.`);return mn(Yt(t),n)}function fn(t,n){if(t===void 0)return;if(typeof t!=`string`)throw new e(`INVALID_ARGS`,`target-v1 "${n}" must be a string.`);let r=Jt(t);return r===void 0?void 0:mn(r,n)}function pn(t,n){if(t===void 0)return;if(typeof t!=`string`)throw new e(`INVALID_ARGS`,`target-v1 "${n}" must be a string.`);let r=Xt(t);return r===void 0?void 0:mn(r,n)}function mn(t,n){if(N(t)>256)throw new e(`INVALID_ARGS`,`target-v1 "${n}" exceeds the 256-byte field cap.`);return t}function hn(t){if(t===void 0)return[];if(!Array.isArray(t))throw new e(`INVALID_ARGS`,`target-v1 "ancestry" must be an array.`);if(t.length>8)throw new e(`INVALID_ARGS`,`target-v1 "ancestry" exceeds the 8-entry cap.`);return t.map((e,t)=>gn(e,t))}function gn(t,n){if(typeof t!=`object`||!t||Array.isArray(t))throw new e(`INVALID_ARGS`,`target-v1 "ancestry[${n}]" must be an object.`);let r=t,i=dn(r.role,`ancestry[${n}].role`),a=pn(r.label,`ancestry[${n}].label`);return{role:i,...a===void 0?{}:{label:a}}}function _n(t,n,r){if(t===void 0)return r;if(typeof t!=`number`||!Number.isSafeInteger(t)||t<0)throw new e(`INVALID_ARGS`,`target-v1 "${n}" must be a non-negative integer.`);return t}function vn(t){if(t===void 0)return;if(typeof t!=`object`||!t||Array.isArray(t))throw new e(`INVALID_ARGS`,`target-v1 "scrollRegion" must be an object.`);let n=t,r=dn(n.role,`scrollRegion.role`),i=fn(n.id,`id`),a=pn(n.label,`scrollRegion.label`);return{role:r,...i===void 0?{}:{id:i},...a===void 0?{}:{label:a}}}function yn(t){if(t===void 0)return;if(typeof t!=`object`||!t||Array.isArray(t))throw new e(`INVALID_ARGS`,`target-v1 "rect" must be an object.`);let n=t;return{x:P(n.x,`rect.x`),y:P(n.y,`rect.y`),width:P(n.width,`rect.width`),height:P(n.height,`rect.height`)}}function P(t,n){if(typeof t!=`number`||!Number.isFinite(t))throw new e(`INVALID_ARGS`,`target-v1 "${n}" must be a finite number.`);return t}function bn(t){if(t===`verified`||t===`unverifiable`)return t;throw new e(`INVALID_ARGS`,`target-v1 "verification" must be "verified" or "unverifiable".`)}function xn(e){let t=Yt(_(e.type??``)),n=Jt(e.identifier),r=Xt(e.label);return{...n===void 0?{}:{id:Zt(n,256)},role:Zt(t,256),...r===void 0?{}:{label:Zt(r,256)}}}function Sn(e,t){return e.id===t.id&&e.role===t.role&&e.label===t.label}function Cn(e,t){let n=0;for(let r of e)xn(r).id===t&&(n+=1);return n}function wn(e,t){if(e.id===void 0||Cn(t,e.id)<=1)return e;let{role:n,label:r}=e;return{role:n,...r===void 0?{}:{label:r}}}function Tn(e,t){let n=0;for(let r of e)if(r.parentIndex===t.parentIndex){if(r.index===t.index)return n;n+=1}return 0}function En(e,t){return{documentOrder:e.index,sibling:Tn(t,e)}}function Dn(e,t){return e.documentOrder===t.documentOrder&&e.sibling===t.sibling}function On(e){return{...e.id===void 0?{}:{id:e.id},role:e.role,...e.label===void 0?{}:{label:e.label}}}function kn(e,t){return t.id===void 0?e.role===t.role&&e.label===t.label:e.id===t.id}function An(e,t){if(e.length<t.length)return!1;for(let[n,r]of t.entries()){let t=e[n];if(!t||t.role!==r.role||r.label!==void 0&&t.label!==r.label)return!1}return!0}function jn(e,t){let n=[];return e.id!==t.id&&n.push(`id: recorded=${e.id??`(none)`} observed=${t.id??`(none)`}`),e.role!==t.role&&n.push(`role: recorded=${e.role} observed=${t.role}`),e.label!==t.label&&n.push(`label: recorded=${e.label??`(none)`} observed=${t.label??`(none)`}`),n}function Mn(e){return e?`${e.role}${e.label?`/${e.label}`:``}`:`(missing)`}function Nn(e,t){return!t||t.role!==e.role?!0:e.label!==void 0&&t.label!==e.label}function Pn(e,t){for(let[n,r]of e.entries()){let e=t[n];if(Nn(r,e))return[`ancestry[${n}]: recorded=${Mn(r)} observed=${Mn(e)}`]}return[]}function Fn(e,t,n={}){let r=[],i=_(e.type??``),a=In(e,n.nodes),o=I(e.label),s=I(e.value),c=I(v(e)),l=n.action===`fill`;a&&r.push(`id=${F(a)}`),i&&o&&r.push(l?`role=${F(i)} label=${F(o)} editable=true`:`role=${F(i)} label=${F(o)}`),o&&r.push(l?`label=${F(o)} editable=true`:`label=${F(o)}`),s&&r.push(l?`value=${F(s)} editable=true`:`value=${F(s)}`),c&&c!==o&&c!==s&&r.push(l?`text=${F(c)} editable=true`:`text=${F(c)}`),i&&l&&!r.some(e=>e.includes(`editable=true`))&&r.push(`role=${F(i)} editable=true`);let u=Ln(r);return u.length===0&&i&&u.push(l?`role=${F(i)} editable=true`:`role=${F(i)}`),u.length===0&&b(e)&&u.push(`visible=true`),u}function In(e,t){let n=I(e.identifier);if(!n||!t)return n;let r=xn(e).id;return r===void 0?n:Cn(t,r)>1?null:n}function Ln(e){return Array.from(new Set(e))}function F(e){return JSON.stringify(e)}function I(e){return e&&e.trim()||null}function Rn(e,t){let n=e===`is`?Ft([...t]).split:w([...t]);return n?C(n.selectorExpression)?{kind:`expression`,expression:n.selectorExpression,rest:n.rest}:{kind:`invalid`}:{kind:`not-applicable`}}function zn(e,t,n){let r=C(e);if(!r)return{kind:`unresolved`,reason:`parse-invalid`,matchedNodes:[]};let i=A(t,r,{platform:n.platform,requireRect:n.requireRect,requireUnique:!0,disambiguateAmbiguous:n.allowDisambiguation});if(i){let e=t.filter(e=>n.requireRect&&!e.rect?!1:O(e,i.selector,n.platform));return{kind:`resolved`,winner:i.node,matchedNodes:e,matchCount:e.length,...i.disambiguation?{disambiguation:{tiebreak:i.disambiguation.tiebreak,matchCount:i.disambiguation.matchCount,alternatives:i.disambiguation.alternatives}}:{}}}let a=j(t,r,{platform:n.platform,requireRect:n.requireRect})?.matchedNodes??[];return{kind:`unresolved`,reason:a.length>0?`ambiguous`:`no-match`,matchedNodes:a}}function Bn(e,t,n={}){return Fn(e,t,n)}function Vn(e,t,n){let r=C(e);if(!r)return;let i=A(t,r,{platform:n.platform,requireRect:n.requireRect,requireUnique:!0,disambiguateAmbiguous:n.allowDisambiguation});if(i)return{node:i.node,basis:Un(i.selector)}}function Hn(e){if(!e)return;let t=C(e);if(!t)return;let n=t.selectors.flatMap(e=>e.terms.flatMap(e=>(e.key===`label`||e.key===`text`||e.key===`id`)&&typeof e.value==`string`?[e.value]:[]));if(n.length===0)return;let r=n[0];return r&&n.every(e=>e===r)?r:void 0}function Un(e){let t=new Set(e.terms.map(e=>e.key));if(t.has(`id`))return`id`;let n=t.has(`role`),r=t.has(`label`)||t.has(`text`);return n&&r?`role-label`:r||t.has(`value`)?`label`:`other`}const Wn={act:{ambiguity:`disambiguate`,requireRect:!0},actCoveredDiagnosis:{ambiguity:`first-match`,requireRect:!0},readText:{ambiguity:`disambiguate`,requireRect:!1},readUnique:{ambiguity:`fail-closed`,requireRect:!1},readAny:{ambiguity:`first-match`,requireRect:!1},wait:{ambiguity:`first-match`,requireRect:!1},findAct:{ambiguity:`reject-candidates`,requireRect:!0}};function Gn(e){return e.ambiguity===`first-match`?{requireRect:e.requireRect,requireUnique:!1}:{requireRect:e.requireRect,requireUnique:!0,disambiguateAmbiguous:e.ambiguity===`disambiguate`}}function Kn(e,t){let n=C(e);if(!n)return e.includes(`=`)||e.includes(`||`)?null:e;let r=new Set(t.textKeys);return n.selectors.length>1?qn(n.selectors,r):Jn(n.selectors[0],r,new Set(t.booleanKeys))}function qn(e,t){let n=e.map(e=>{let n=e.terms.length===1?e.terms[0]:void 0;return n&&t.has(n.key)&&typeof n.value==`string`?n.value:void 0}),r=n[0];return r!==void 0&&n.every(e=>e===r)?r:null}function Jn(e,t,n){if(!e)return null;let r={},i=0;for(let a of e.terms){if(Yn(a,t,`string`))i+=1;else if(!Yn(a,n,`boolean`))return null;r[a.key]=a.value}return i<=1&&Object.keys(r).length>0?r:null}function Yn(e,t,n){return t.has(e.key)&&typeof e.value===n}function Xn(e){let t=C(e);if(!t||t.selectors.length!==1)return null;let n=t.selectors[0];if(!n||n.terms.length!==1)return null;let r=n.terms[0];return!r||typeof r.value!=`string`||r.key!==`id`&&r.key!==`label`&&r.key!==`text`&&r.key!==`value`?null:{key:r.key,value:r.value,raw:n.raw}}function Zn(e,t){if(!t)return!1;let n=C(e);return n?n.selectors.some(e=>e.terms.some(e=>(e.key===`text`||e.key===`label`||e.key===`value`)&&typeof e.value==`string`&&e.value.includes(t))):!1}function Qn(e){return S(e).selectors.map(e=>e.raw)}function $n(e){return C(e)!==null}function er(e,t,n){let r=mt(e,S(t),n);return r?{...r,selector:r.selector.raw}:null}function tr(e,t,n){let r=j(e,S(t),n);return r?{...r,selector:r.selector.raw}:null}function nr(e,t,n){let r=A(e,S(t),n);return r?{...r,selector:r.selector.raw}:null}function rr(e,t,n,r){let i=Tt(e,S(t),n,r);return i.kind===`resolved`?{...i,resolution:{...i.resolution,selector:i.resolution.selector.raw}}:i}function L(e){if(!e)return null;let t=Number(e);return Number.isFinite(t)?t:null}function ir(e){let t=e[0];if(t===void 0)return null;let n=L(t);if(n!==null)return{kind:`sleep`,durationMs:n};let r=L(e[e.length-1]);if(t===`text`)return{kind:`text`,text:(r===null?e.slice(1).join(` `):e.slice(1,-1).join(` `)).trim(),timeoutMs:r};if(t===`stable`){let t=e.slice(1),n=t.length>1?L(t[1]):null;return{kind:`stable`,quietMs:t.length>0?L(t[0]):null,timeoutMs:n}}if(t.startsWith(`@`))return{kind:`ref`,rawRef:t,timeoutMs:r};let i=w(r===null?e.slice():e.slice(0,-1));return i&&i.rest.length===0&&$n(i.selectorExpression)?{kind:`selector`,selectorExpression:i.selectorExpression,timeoutMs:r}:{kind:`text`,text:(r===null?e.join(` `):e.slice(0,-1).join(` `)).trim(),timeoutMs:r}}function ar(e){let t=ir(e);return t?t.kind===`sleep`?t.durationMs:t.timeoutMs:null}const or=24e4,R={budget:{source:`none`},envelopeMs:9e4,onTimeout:`reset-daemon`},sr={click:`settle-and-verify`,press:`settle-and-verify`,fill:`settle-and-verify`,longpress:`settle`,scroll:`settle`,back:`settle`};function cr(e){if(e!==void 0)return sr[e]}const z={leaseAdmissionExempt:!0,sessionExecutionLockExempt:!0},B={leaseAdmissionExempt:!0,sessionExecutionLockExempt:!0,selectorValidationExempt:!0},lr=()=>!0,ur=e=>(e.positionals?.[0]??``).toLowerCase()===`start`,dr=e=>e.command===`test`&&(typeof e.flags?.shardAll==`number`||typeof e.flags?.shardSplit==`number`),fr=new Set([`status`,`get`]),pr=e=>yr(e,fr,`status`),mr=new Set([`get`,`wait`]),hr=e=>yr(e,mr,`get`),gr=e=>br(e,fr,`status`),_r=e=>br(e,mr,`get`),vr=e=>{try{return et(D(e.positionals??[]).action)?`observes-app`:`mutates-app`}catch{return`mutates-app`}};function yr(e,t,n){return t.has((e.positionals?.[0]??n).toLowerCase())?`preserve`:`may-invalidate`}function br(e,t,n){return t.has((e.positionals?.[0]??n).toLowerCase())?`observes-app`:`mutates-app`}const V={simulator:!0,device:!0},H={emulator:!0,device:!0,unknown:!0},U={emulator:!0},W={device:!0},G={},K={apple:V,android:H,linux:W},xr={...K,vega:U},Sr={apple:V,android:H,linux:G},Cr={apple:V,android:H,linux:G},q={recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`generic`,refFrameEffect:`may-invalidate`,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:V,android:H,linux:W},timeoutPolicy:R,batchable:!0},J={...R,onTimeout:`preserve-daemon`},Y={...R,envelopeMs:18e4},wr={...R,budget:{source:`flag`,envelope:`widen`,defaultBudgetMs:1e4},onTimeout:`preserve-daemon`},Tr={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}}},Er={fields:{delayMs:{defaultValue:0}}};function X(e,t){return cr(e)===void 0?t:wr}function Z(e){let t=cr(e);if(t===void 0)throw Error(`Missing post-action observation descriptor support for ${e}`);return t}const Dr=[{name:`lease_allocate`,catalog:{group:`internal`,key:`leaseAllocate`},recordsSessionAction:!1,daemon:{route:`lease`,refFrameEffect:`preserve`,...z},timeoutPolicy:R,batchable:!1},{name:`lease_heartbeat`,catalog:{group:`internal`,key:`leaseHeartbeat`},recordsSessionAction:!1,daemon:{route:`lease`,refFrameEffect:`preserve`,...z},timeoutPolicy:R,batchable:!1},{name:`lease_release`,catalog:{group:`internal`,key:`leaseRelease`},recordsSessionAction:!1,daemon:{route:`lease`,refFrameEffect:`preserve`,...z},timeoutPolicy:R,batchable:!1},{name:`artifacts`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`lease`,refFrameEffect:`preserve`,...z},timeoutPolicy:R,batchable:!1},{name:`session_list`,catalog:{group:`internal`,key:`sessionList`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`preserve`,sessionKind:`inventory`,...B},timeoutPolicy:R,batchable:!1},{name:`session_save_script`,catalog:{group:`internal`,key:`sessionSaveScript`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`preserve`,sessionKind:`publication`},timeoutPolicy:R,batchable:!1},{name:`devices`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`preserve`,sessionKind:`inventory`,lockPolicySelectorOverride:!0,...B},timeoutPolicy:R,batchable:!0},{name:`capabilities`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`preserve`,sessionKind:`inventory`,lockPolicySelectorOverride:!0,preferExplicitDeviceOverExistingSession:!0,...B},timeoutPolicy:R,batchable:!0},{name:`doctor`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`preserve`,sessionKind:`inventory`,lockPolicySelectorOverride:!0,allowSessionlessDefaultDevice:lr,...B},timeoutPolicy:R,batchable:!0},{name:`apps`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`preserve`,sessionKind:`inventory`,lockPolicySelectorOverride:!0,preferExplicitDeviceOverExistingSession:!0},capability:Sr,timeoutPolicy:R,batchable:!0},{name:`boot`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`may-invalidate`,sessionKind:`state`},capability:{apple:V,android:H,linux:G},timeoutPolicy:R,batchable:!0},{name:`shutdown`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`may-invalidate`,sessionKind:`state`},capability:{apple:{simulator:!0},android:{emulator:!0},linux:G},timeoutPolicy:R,batchable:!0},{name:`appstate`,catalog:{group:`public`,key:`appState`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`preserve`,sessionKind:`state`},timeoutPolicy:R,batchable:!0},{name:`perf`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`observes-app`,daemon:{route:`session`,refFrameEffect:`preserve`,sessionKind:`observability`},capability:{apple:V,android:H,linux:G},timeoutPolicy:R,batchable:!0},{name:`logs`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`preserve`,sessionKind:`observability`},capability:{apple:V,android:H,linux:G},timeoutPolicy:R,batchable:!0},{name:`events`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`preserve`,sessionKind:`observability`,allowInvalidRecording:!0,...B},timeoutPolicy:R,batchable:!1},{name:`network`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`preserve`,sessionKind:`observability`},capability:{apple:V,android:H,linux:G},timeoutPolicy:R,batchable:!0},{name:`audio`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`preserve`,sessionKind:`observability`},capability:{apple:V,android:{emulator:!0},linux:G},timeoutPolicy:R,batchable:!0},{name:`replay`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`delegated`,sessionKind:`replay`,skipSessionlessProviderDevice:dr,saveScriptFlagOwner:!0},timeoutPolicy:{...R,budget:{source:`flag`}},batchable:!1},{name:`test`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`delegated`,sessionKind:`replay`,skipSessionlessProviderDevice:dr},timeoutPolicy:{...R,envelopeMs:`unbounded`},batchable:!0},{name:`runtime`,catalog:{group:`internal`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`preserve`},timeoutPolicy:R,batchable:!1},{name:`clipboard`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`observes-app`,daemon:{route:`session`,refFrameEffect:`preserve`},dispatch:{},capability:{apple:V,android:H,linux:W},timeoutPolicy:R,batchable:!0},{name:`keyboard`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:gr,daemon:{route:`session`,refFrameEffect:pr,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:V,android:H,linux:G},timeoutPolicy:R,batchable:!0},{name:`install`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`session`,refFrameEffect:`may-invalidate`},capability:Cr,timeoutPolicy:Y,batchable:!0},{name:`reinstall`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`session`,refFrameEffect:`may-invalidate`},capability:Cr,timeoutPolicy:Y,batchable:!0},{name:`install_source`,catalog:{group:`internal`,key:`installSource`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`session`,refFrameEffect:`may-invalidate`},timeoutPolicy:Y,batchable:!1},{name:`release_materialized_paths`,catalog:{group:`internal`,key:`releaseMaterializedPaths`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`preserve`,...B},timeoutPolicy:R,batchable:!1},{name:`push`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`session`,refFrameEffect:`may-invalidate`},dispatch:{},capability:{apple:{simulator:!0},android:H,linux:G},timeoutPolicy:R,batchable:!0},{name:`trigger-app-event`,catalog:{group:`public`,key:`triggerAppEvent`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`session`,refFrameEffect:`may-invalidate`},dispatch:{},capability:{apple:V,android:H,linux:G},timeoutPolicy:R,batchable:!0},{name:`open`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`session`,refFrameEffect:`may-invalidate`,allowSessionlessDefaultDevice:lr,saveScriptFlagOwner:!0},dispatch:{},capability:xr,timeoutPolicy:R,batchable:!0},{name:`prepare`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`preserve`},capability:{apple:V,android:{},linux:G},timeoutPolicy:{budget:{source:`flag`},envelopeMs:or,onTimeout:`reset-daemon`},batchable:!1,mcpExposed:!1},{name:`batch`,catalog:{group:`public`},recordsSessionAction:!1,daemon:{route:`session`,refFrameEffect:`delegated`},timeoutPolicy:R,batchable:!1},{name:`close`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`session`,refFrameEffect:`may-invalidate`,allowInvalidRecording:!0,saveScriptFlagOwner:!0},dispatch:{},capability:xr,timeoutPolicy:R,batchable:!0},{name:`snapshot`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`observes-app`,daemon:{route:`snapshot`,refFrameEffect:`preserve`},dispatch:{},capability:K,timeoutPolicy:{...J,budget:{source:`flag`}},batchable:!0},{name:`diff`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`observes-app`,daemon:{route:`snapshot`,refFrameEffect:`preserve`},capability:K,timeoutPolicy:R,batchable:!0},{name:`wait`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`observes-app`,targetIdentityVerification:`post-resolution`,daemon:{route:`snapshot`,refFrameEffect:`preserve`},capability:K,timeoutPolicy:{...J,budget:{source:`positional-parser`,parser:ar}},batchable:!0},{name:`alert`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:_r,daemon:{route:`snapshot`,refFrameEffect:hr},capability:{apple:V,android:H,linux:G},timeoutPolicy:R,batchable:!0},{name:`settings`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`snapshot`,refFrameEffect:`may-invalidate`},dispatch:{},capability:{apple:V,android:H,linux:G},timeoutPolicy:R,batchable:!0},{name:`react-native`,catalog:{group:`public`,key:`reactNative`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`reactNative`,refFrameEffect:`may-invalidate`},capability:{apple:V,android:H,linux:G},timeoutPolicy:R,batchable:!0},{name:`record`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`observes-app`,daemon:{route:`recordTrace`,refFrameEffect:`preserve`,allowInvalidRecording:!0,allowSessionlessDefaultDevice:ur},capability:{apple:V,android:H,linux:G},timeoutPolicy:R,batchable:!0},{name:`trace`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`observes-app`,daemon:{route:`recordTrace`,refFrameEffect:`preserve`},timeoutPolicy:R,batchable:!0},{name:`find`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:vr,daemon:{route:`find`,refFrameEffect:`may-invalidate`},capability:K,timeoutPolicy:J,batchable:!0},{name:`click`,targetIdentityVerification:`pre-dispatch`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`interaction`,refFrameEffect:`may-invalidate`,androidBlockingDialogGuard:!0},capability:{apple:V,android:H,linux:W},timeoutPolicy:X(`click`,J),postActionObservation:Z(`click`),responseDataTransform:Tr,batchable:!0},{name:`fill`,targetIdentityVerification:`pre-dispatch`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`interaction`,refFrameEffect:`may-invalidate`,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:V,android:H,linux:W},timeoutPolicy:X(`fill`,J),postActionObservation:Z(`fill`),responseDataTransform:Er,batchable:!0},{name:`longpress`,targetIdentityVerification:`pre-dispatch`,catalog:{group:`public`,key:`longPress`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`interaction`,refFrameEffect:`may-invalidate`,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:V,android:H,linux:W},timeoutPolicy:{...wr,envelopeMs:21e4},postActionObservation:Z(`longpress`),batchable:!0},{name:`press`,targetIdentityVerification:`pre-dispatch`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`interaction`,refFrameEffect:`may-invalidate`,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:V,android:H,linux:W},timeoutPolicy:X(`press`,J),postActionObservation:Z(`press`),responseDataTransform:Tr,batchable:!0},{name:`type`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`interaction`,refFrameEffect:`may-invalidate`,androidBlockingDialogGuard:!0},dispatch:{},capability:K,timeoutPolicy:X(`type`,J),batchable:!0},{name:`get`,targetIdentityVerification:`pre-dispatch`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`observes-app`,daemon:{route:`interaction`,refFrameEffect:`preserve`},capability:K,timeoutPolicy:X(`get`,J),batchable:!0},{name:`read`,catalog:{group:`dispatch-alias`},recordsSessionAction:!1,dispatch:{},timeoutPolicy:R,batchable:!1},{name:`is`,targetIdentityVerification:`pre-dispatch`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`observes-app`,daemon:{route:`interaction`,refFrameEffect:`preserve`},capability:K,timeoutPolicy:X(`is`,J),batchable:!0},{name:`back`,catalog:{group:`public`},...q,capability:{...q.capability,vega:U},timeoutPolicy:X(`back`,R),postActionObservation:Z(`back`)},{name:`gesture`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`mutates-app`,targetIdentityVerification:`pre-dispatch`,daemon:{route:`interaction`,refFrameEffect:`may-invalidate`,androidBlockingDialogGuard:!0},capability:K,timeoutPolicy:R,batchable:!0},{name:`home`,catalog:{group:`public`},...q,capability:{...q.capability,vega:U}},{name:`tv-remote`,catalog:{group:`public`,key:`tvRemote`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`generic`,refFrameEffect:`may-invalidate`,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:V,android:H,vega:U,linux:G},timeoutPolicy:R,batchable:!0},{name:`orientation`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`generic`,refFrameEffect:`may-invalidate`,androidBlockingDialogGuard:!0},dispatch:{},capability:{apple:V,android:H,linux:G},timeoutPolicy:R,batchable:!0},{name:`scroll`,catalog:{group:`public`},...q,timeoutPolicy:X(`scroll`,R),postActionObservation:Z(`scroll`)},{name:`swipe`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`interaction`,refFrameEffect:`may-invalidate`,androidBlockingDialogGuard:!0},capability:{apple:V,android:H,linux:W},timeoutPolicy:R,batchable:!0},{name:`focus`,catalog:{group:`public`},...q},{name:`screenshot`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`observes-app`,daemon:{route:`generic`,refFrameEffect:`preserve`},dispatch:{},capability:K,timeoutPolicy:R,batchable:!0},{name:`viewport`,catalog:{group:`public`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`generic`,refFrameEffect:`may-invalidate`},dispatch:{},capability:{apple:{},android:{},linux:G},timeoutPolicy:R,batchable:!1},{name:`app-switcher`,catalog:{group:`public`,key:`appSwitcher`},recordsSessionAction:!0,recordingEffect:`mutates-app`,daemon:{route:`generic`,refFrameEffect:`may-invalidate`},dispatch:{},capability:{apple:V,android:H,linux:G},timeoutPolicy:R,batchable:!0},{name:`install-from-source`,catalog:{group:`public`,key:`installFromSource`},recordsSessionAction:!0,recordingEffect:`mutates-app`,capability:Cr,timeoutPolicy:R,batchable:!0},{name:`debug`,catalog:{group:`local-cli`},recordsSessionAction:!1,timeoutPolicy:R,batchable:!1},{name:`daemon`,catalog:{group:`local-cli`},recordsSessionAction:!1,timeoutPolicy:R,batchable:!1,mcpExposed:!1},{name:`device`,catalog:{group:`local-cli`},recordsSessionAction:!1,timeoutPolicy:R,batchable:!1,mcpExposed:!1},{name:`metro`,catalog:{group:`local-cli`},recordsSessionAction:!1,timeoutPolicy:R,batchable:!1},{name:`session`,catalog:{group:`local-cli`},recordsSessionAction:!1,timeoutPolicy:R,batchable:!1},{name:`cdp`,catalog:{group:`local-cli`},recordsSessionAction:!1,timeoutPolicy:R,batchable:!1,mcpExposed:!1},{name:`auth`,catalog:{group:`local-cli`},recordsSessionAction:!1,timeoutPolicy:R,batchable:!1,mcpExposed:!1},{name:`connect`,catalog:{group:`local-cli`},recordsSessionAction:!1,timeoutPolicy:R,batchable:!1,mcpExposed:!1},{name:`connection`,catalog:{group:`local-cli`},recordsSessionAction:!1,timeoutPolicy:R,batchable:!1,mcpExposed:!1},{name:`disconnect`,catalog:{group:`local-cli`},recordsSessionAction:!1,timeoutPolicy:R,batchable:!1,mcpExposed:!1},{name:`mcp`,catalog:{group:`local-cli`},recordsSessionAction:!1,timeoutPolicy:R,batchable:!1,mcpExposed:!1},{name:`proxy`,catalog:{group:`local-cli`},recordsSessionAction:!1,timeoutPolicy:R,batchable:!1,mcpExposed:!1},{name:`react-devtools`,catalog:{group:`local-cli`,key:`reactDevtools`},recordsSessionAction:!1,timeoutPolicy:R,batchable:!1,mcpExposed:!1},{name:`web`,catalog:{group:`local-cli`},recordsSessionAction:!1,timeoutPolicy:R,batchable:!1,mcpExposed:!1}],Or=new Set([`public`,`local-cli`]),kr=new Set(Dr.filter(e=>Or.has(Fr(e))).map(e=>e.name)),Q=Dr.map(e=>({...e,mcpExposed:Nr(e)}));function Ar(e){return Q.filter(t=>Fr(t)===e).map(e=>[Ir(e),e.name])}function jr(){return Q.filter(e=>Pr(e)).map(e=>e.name).sort()}const $=new Map(Q.map(e=>[e.name,e]));function Mr(e){return kr.has(e)}function Nr(e){return e.mcpExposed??kr.has(e.name)}function Pr(e){return e.mcpExposed&&Mr(e.name)}function Fr(e){return e.catalog.group}function Ir(e){return e.catalog.key??e.name}const Lr=new Map(Q.map(e=>[e.name,e.timeoutPolicy])),Rr=new Map(Array.from($.values()).flatMap(e=>e.responseDataTransform?[[e.name,e.responseDataTransform]]:[]));function zr(e){if(e!==void 0)return $.get(e)?.postActionObservation}function Br(e){return zr(e)!==void 0}function Vr(e){return zr(e)===`settle-and-verify`}function Hr(e){return e===void 0?R:Lr.get(e)??R}function Ur(e){if(e!==void 0)return Rr.get(e)}function Wr(e){return e===void 0?!1:$.get(e)?.recordsSessionAction??!1}function Gr(e){return $.get(e)?.targetIdentityVerification}function Kr(e){let t=$.get(e.command);if(t?.recordsSessionAction)return typeof t.recordingEffect==`function`?t.recordingEffect(e):t.recordingEffect}function qr(){return[...new Set(Array.from(Rr.values()).flatMap(e=>Object.keys(e.fields)))].sort()}function Jr(e){return Number.isInteger(e)&&e>=1&&e<=1e3}function Yr(t,n){if(t>n)throw new e(`INVALID_ARGS`,`batch has ${t} steps; max allowed is ${n}.`)}function Xr(t,n){if(!a(t))throw new e(`INVALID_ARGS`,`Invalid batch step ${n}.`);return t}function Zr(t,n){let r=t.input;if(!a(r))throw new e(`INVALID_ARGS`,`Batch step ${n} input must be an object.`);return r}function Qr(t,r){if(t!==void 0)try{return n.parse(t)}catch(t){throw new e(`INVALID_ARGS`,`Batch step ${r} runtime is invalid: ${t instanceof Error?t.message:String(t)}`)}}function $r(e){let t=e.trim();if(!t||/\s/.test(t))return!1;let n=/^([A-Za-z][A-Za-z0-9+.-]*):(.+)$/.exec(t);if(!n)return!1;let r=n[1]?.toLowerCase(),i=n[2]??``;return r===`http`||r===`https`||r===`ws`||r===`wss`||r===`ftp`||r===`ftps`?i.startsWith(`//`):!0}function ei(e){let t=e.trim().split(`:`)[0]?.toLowerCase();return t===`http`||t===`https`}function ti(e,t){let n=e?.trim();if(n)return n;if(ei(t))return`com.apple.mobilesafari`}function ni(e){let t=[];for(let n of e)n.daemon&&t.push({command:n.name,...n.daemon,replayScopedAction:n.recordsSessionAction});return t}function ri(e){let t={};for(let n of e)n.capability&&(t[n.name]=n.capability);return t}function ii(e){return e.filter(e=>e.batchable).map(e=>e.name)}const ai=ii(Q),oi=new Set([`batch`,`replay`]),si=[`command`,`positionals`,`input`,`flags`,`runtime`],ci=[`platform`,`target`,`device`,`udid`,`serial`,`verbose`,`out`],li=new Set(ai);function ui(e){return li.has(e)}function di(e){return typeof e==`string`?e.trim().toLowerCase():``}function fi(t,n){let r=di(t);if(ui(r))return r;throw new e(`INVALID_ARGS`,`Batch step ${n} command is not available through command batch: ${String(t)}`)}function pi(t,n){if(oi.has(t))throw new e(`INVALID_ARGS`,`Batch step ${n} cannot run ${t}.`)}const mi=new Set(si);async function hi(e,t,n){let r=Si(e.flags),a=r?.batchOnError??`stop`;if(a!==`stop`)return Ci(`INVALID_ARGS`,`Unsupported batch on-error mode: ${a}.`);let o=r?.batchMaxSteps??100;if(!Jr(o))return Ci(`INVALID_ARGS`,`Invalid batch max-steps: ${String(r?.batchMaxSteps)}`);try{let i=gi(r?.batchSteps,o),a=Date.now(),s=[];for(let[r,a]of i.entries()){let o=await xi(e,t,a,n,r+1,r===i.length-1);if(!o.ok)return{ok:!1,error:{code:o.error.code,message:`Batch failed at step ${o.step} (${a.command}): ${o.error.message}`,hint:o.error.hint,diagnosticId:o.error.diagnosticId,logPath:o.error.logPath,details:{...o.error.details??{},step:o.step,command:a.command,positionals:a.positionals,executed:r,total:i.length,partialResults:s}}};s.push(o.result)}return{ok:!0,data:{total:i.length,executed:i.length,totalDurationMs:Date.now()-a,results:s}}}catch(e){let t=i(e);return Ci(t.code,t.message,t.details)}}function gi(t,n){if(!Array.isArray(t)||t.length===0)throw new e(`INVALID_ARGS`,`batch requires a non-empty batchSteps array.`);Yr(t.length,n);let r=[];for(let n=0;n<t.length;n+=1){let i=t[n];if(!p(i))throw new e(`INVALID_ARGS`,`Invalid batch step at index ${n}.`);let a=Object.keys(i).filter(e=>!mi.has(e));if(a.length>0){let t=a.map(e=>`"${e}"`).join(`, `);throw new e(`INVALID_ARGS`,`Batch step ${n+1} has unknown field(s): ${t}. Allowed fields: command, positionals, input, flags, runtime.`)}let o=di(i.command);if(!o)throw new e(`INVALID_ARGS`,`Batch step ${n+1} requires command.`);if(pi(o,n+1),i.positionals!==void 0&&!Array.isArray(i.positionals))throw new e(`INVALID_ARGS`,`Batch step ${n+1} positionals must be an array.`);let s=i.positionals??[];if(s.some(e=>typeof e!=`string`))throw new e(`INVALID_ARGS`,`Batch step ${n+1} positionals must contain only strings.`);if(i.flags!==void 0&&!p(i.flags))throw new e(`INVALID_ARGS`,`Batch step ${n+1} flags must be an object.`);if(i.input!==void 0&&!p(i.input))throw new e(`INVALID_ARGS`,`Batch step ${n+1} input must be an object.`);r.push({command:o,positionals:s,input:i.input,flags:i.flags??{},runtime:Qr(i.runtime,n+1)})}return r}function _i(e,t){let{batchSteps:n,batchOnError:r,batchMaxSteps:i,...a}=t??{};return vi(Si(e),a)}function vi(e,t){let n=Si(e)??{},r=t;for(let e of ci)r[e]===void 0&&n[e]!==void 0&&(r[e]=n[e]);return t}function yi(e,n){return t(e)?n?e:`digest`:e}function bi(e,t){let n=e?.responseLevel,r=yi(n,t);return r===n?e:{...e,responseLevel:r}}async function xi(e,t,n,r,i,a){let o=Date.now(),s=_i(e.flags,n.flags);s.session===void 0&&(s.session=t);let c=await r({token:e.token,session:t,command:n.command,positionals:n.positionals,input:n.input,flags:s,runtime:n.runtime===void 0?e.runtime:n.runtime,meta:bi(e.meta,a)}),l=Date.now()-o;return c.ok?{ok:!0,step:i,result:{step:i,command:n.command,ok:!0,data:c.data??{},durationMs:l}}:{ok:!1,step:i,error:c.error}}function Si(e){return e}function Ci(e,t,n){return{ok:!1,error:{code:e,message:t,...n?{details:n}:{}}}}export{kn as $,Ce as $t,$n as A,st as At,Bn as B,S as Bt,Ur as C,me as Cn,mt as Ct,ir as D,Ze as Dt,or as E,gt as Et,nr as F,dt as Ft,Fn as G,Ae as Gt,Rn as H,C as Ht,rr as I,Fe as It,wn as J,Oe as Jt,I as K,Ee as Kt,Zn as L,Be as Lt,Kn as M,et as Mt,Qn as N,$e as Nt,L as O,at as Ot,Xn as P,D as Pt,An as Q,y as Qt,Wn as R,Le as Rt,Wr as S,l as Sn,ht as St,Gr as T,a as Tn,A as Tt,zn as U,Me as Ut,Hn as V,w as Vt,Vn as W,b as Wt,jn as X,we as Xt,Pn as Y,je as Yt,Sn as Z,ke as Zt,Vr as _,d as _n,Rt as _t,ri as a,ye as an,on as at,jr as b,ee as bn,jt as bt,ei as c,_e as cn,ln as ct,Jr as d,fe as dn,Ht as dt,_ as en,xn as et,Qr as f,de as fn,Ut as ft,Br as g,re as gn,zt as gt,Q as h,ie as hn,Bt as ht,fi as i,g as in,Kt as it,tr as j,tt as jt,er as k,ot as kt,ti as l,ge as ln,nn as lt,Xr as m,ae as mn,It as mt,hi as n,h as nn,Tn as nt,ni as o,ve as on,rn as ot,Zr as p,p as pn,Lt as pt,On as q,De as qt,ai as r,xe as rn,Dn as rt,$r as s,m as sn,sn as st,vi as t,be as tn,En as tt,Yr as u,he as un,N as ut,qr as v,u as vn,Vt as vt,Hr as w,pe as wn,_t as wt,Kr as x,te as xn,At as xt,Ar as y,ne as yn,Ot as yt,Gn as z,ze as zt};
|
|
@@ -32,11 +32,19 @@ type DeviceInfo = {
|
|
|
32
32
|
* snapshot-quality.ts so SnapshotNode can reference it without a cyclic import;
|
|
33
33
|
* snapshot-quality.ts (the validation logic) re-exports it for existing callers.
|
|
34
34
|
*/
|
|
35
|
+
/**
|
|
36
|
+
* Which capture STRATEGY produced a snapshot, within one platform's plan —
|
|
37
|
+
* distinct from `SnapshotBackend`, which names the platform channel
|
|
38
|
+
* (`xctest`/`android`/…). The iOS plan walks these in order, so one session can
|
|
39
|
+
* change strategy mid-sequence, and two strategies do not return comparable
|
|
40
|
+
* views of one screen (#1569).
|
|
41
|
+
*/
|
|
42
|
+
type SnapshotCaptureBackend = 'tree' | 'queries' | 'private-ax';
|
|
35
43
|
type SnapshotQualityVerdict = {
|
|
36
44
|
state: 'healthy' | 'recovered' | 'sparse';
|
|
37
|
-
backend:
|
|
45
|
+
backend: SnapshotCaptureBackend;
|
|
38
46
|
reason?: string;
|
|
39
|
-
reasonCode?: 'ax-rejected' | 'sparse-tree' | 'budget' | 'no-nodes' | 'capture-failed';
|
|
47
|
+
reasonCode?: 'ax-rejected' | 'sparse-tree' | 'budget' | 'no-nodes' | 'capture-failed' | 'deferred';
|
|
40
48
|
effectiveDepth?: number;
|
|
41
49
|
collapsedLeafIndexes?: number[];
|
|
42
50
|
};
|
|
@@ -55,6 +63,13 @@ type SnapshotOptions = {
|
|
|
55
63
|
depth?: number;
|
|
56
64
|
scope?: string;
|
|
57
65
|
raw?: boolean;
|
|
66
|
+
/**
|
|
67
|
+
* Internal (never CLI-exposed): capture with this backend first regardless of
|
|
68
|
+
* channel health. Evidence comparisons are only valid same-backend (backends
|
|
69
|
+
* are not comparable views of a screen), so a corroboration probe must be
|
|
70
|
+
* captured the way its baseline was.
|
|
71
|
+
*/
|
|
72
|
+
preferredBackend?: 'private-ax';
|
|
58
73
|
};
|
|
59
74
|
type RawSnapshotNode = {
|
|
60
75
|
index: number;
|
|
@@ -1,23 +1,5 @@
|
|
|
1
1
|
import { A as SnapshotNode } from "./sdk-contracts.js";
|
|
2
|
-
//#region
|
|
3
|
-
type SelectorKey = 'id' | 'role' | 'text' | 'label' | 'value' | 'appname' | 'windowtitle' | 'visible' | 'hidden' | 'editable' | 'selected' | 'focused' | 'enabled' | 'hittable';
|
|
4
|
-
type SelectorTerm = {
|
|
5
|
-
key: SelectorKey;
|
|
6
|
-
value: string | boolean;
|
|
7
|
-
};
|
|
8
|
-
type Selector = {
|
|
9
|
-
raw: string;
|
|
10
|
-
terms: SelectorTerm[];
|
|
11
|
-
};
|
|
12
|
-
type SelectorChain = {
|
|
13
|
-
raw: string;
|
|
14
|
-
selectors: Selector[];
|
|
15
|
-
};
|
|
16
|
-
declare function parseSelectorChain(expression: string): SelectorChain;
|
|
17
|
-
declare function tryParseSelectorChain(expression: string): SelectorChain | null;
|
|
18
|
-
declare function isSelectorToken(token: string): boolean;
|
|
19
|
-
//#endregion
|
|
20
|
-
//#region src/selectors/find.d.ts
|
|
2
|
+
//#region packages/selectors/src/internal/find.d.ts
|
|
21
3
|
declare const FIND_LOCATORS: readonly ['any', 'text', 'label', 'value', 'role', 'id'];
|
|
22
4
|
type FindLocator = (typeof FIND_LOCATORS)[number];
|
|
23
5
|
type FindAction = {
|
|
@@ -39,6 +21,8 @@ type FindAction = {
|
|
|
39
21
|
} | {
|
|
40
22
|
kind: 'wait';
|
|
41
23
|
timeoutMs?: number;
|
|
24
|
+
} | {
|
|
25
|
+
kind: 'list';
|
|
42
26
|
};
|
|
43
27
|
type ParsedFindArgs = {
|
|
44
28
|
locator: FindLocator;
|
|
@@ -58,4 +42,4 @@ declare function findBestMatchesByLocator(nodes: SnapshotNode[], locator: FindLo
|
|
|
58
42
|
score: number;
|
|
59
43
|
};
|
|
60
44
|
//#endregion
|
|
61
|
-
export {
|
|
45
|
+
export { findBestMatchesByLocator as n, parseFindArgs as r, FindMatchOptions as t };
|
package/dist/src/sdk-finders.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{jt as e}from"./sdk-batch-runner.js";function t(t,n,r,i){return e(t,n,r,typeof i==`boolean`?{requireRect:i}:i)}export{t};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { A as SnapshotNode, m as ResponseCost } from "./sdk-contracts.js";
|
|
1
|
+
import { A as SnapshotNode, N as SnapshotState, U as PublicPlatform, V as Platform, m as ResponseCost } from "./sdk-contracts.js";
|
|
2
2
|
//#region packages/contracts/src/click-button.d.ts
|
|
3
3
|
declare const CLICK_BUTTONS: readonly ['primary', 'secondary', 'middle'];
|
|
4
4
|
type ClickButton = (typeof CLICK_BUTTONS)[number];
|
|
@@ -19,7 +19,7 @@ type ResolutionDiagnosticEntry = {
|
|
|
19
19
|
};
|
|
20
20
|
/**
|
|
21
21
|
* ADR 0012 decision 2: pre-action disclosure of how the acting path resolved
|
|
22
|
-
* its target,
|
|
22
|
+
* its target, including each endpoint of a target-authored drag. Never ref-issuing.
|
|
23
23
|
* `direct-ios`/`not-observed` = the XCTest fast path has no daemon tree to
|
|
24
24
|
* report from; `ref`/`label-fallback` = a stale `@ref` recovered via
|
|
25
25
|
* first-match label lookup, never exact ref provenance; `alternatives` holds
|
|
@@ -218,6 +218,11 @@ type FindCommandResponseData = {
|
|
|
218
218
|
waitedMs?: number;
|
|
219
219
|
text?: string;
|
|
220
220
|
node?: SnapshotNode;
|
|
221
|
+
/** Every match of the read-only `list` action (#1625), each ref pinnable at `refsGeneration`. */
|
|
222
|
+
matches?: Array<{
|
|
223
|
+
ref: string;
|
|
224
|
+
node: SnapshotNode;
|
|
225
|
+
}>;
|
|
221
226
|
locator?: string;
|
|
222
227
|
query?: string;
|
|
223
228
|
x?: number;
|
|
@@ -227,4 +232,94 @@ type FindCommandResponseData = {
|
|
|
227
232
|
cost?: ResponseCost;
|
|
228
233
|
};
|
|
229
234
|
//#endregion
|
|
230
|
-
|
|
235
|
+
//#region packages/selectors/src/internal/public-resolution-types.d.ts
|
|
236
|
+
/** One per-alternative diagnostic returned by selector resolution. */
|
|
237
|
+
type SelectorDiagnostics = {
|
|
238
|
+
selector: string;
|
|
239
|
+
matches: number;
|
|
240
|
+
};
|
|
241
|
+
/**
|
|
242
|
+
* The disclosure for an ambiguous selector that was resolved by the heuristic;
|
|
243
|
+
* present only when the heuristic picked among N>1 matches (ADR 0012).
|
|
244
|
+
*/
|
|
245
|
+
type SelectorDisambiguationDisclosure = {
|
|
246
|
+
matchCount: number;
|
|
247
|
+
tiebreak: DisambiguationTiebreak;
|
|
248
|
+
/** Every losing matched node, document order, uncapped (response layer caps). */
|
|
249
|
+
alternatives: SnapshotNode[];
|
|
250
|
+
};
|
|
251
|
+
/**
|
|
252
|
+
* The options every selector lookup takes. Stated once here rather than inline
|
|
253
|
+
* per function so a façade wrapper and the parser-side function it forwards to
|
|
254
|
+
* cannot drift apart.
|
|
255
|
+
*/
|
|
256
|
+
type SelectorMatchOptions = {
|
|
257
|
+
platform: Platform | PublicPlatform;
|
|
258
|
+
requireRect?: boolean;
|
|
259
|
+
};
|
|
260
|
+
/** {@link SelectorMatchOptions} plus the uniqueness policy resolution adds. */
|
|
261
|
+
type SelectorResolutionOptions = SelectorMatchOptions & {
|
|
262
|
+
requireUnique?: boolean;
|
|
263
|
+
disambiguateAmbiguous?: boolean;
|
|
264
|
+
};
|
|
265
|
+
//#endregion
|
|
266
|
+
//#region packages/selectors/src/internal/parse.d.ts
|
|
267
|
+
type SelectorKey = 'id' | 'role' | 'text' | 'label' | 'value' | 'appname' | 'windowtitle' | 'visible' | 'hidden' | 'editable' | 'selected' | 'focused' | 'enabled' | 'hittable';
|
|
268
|
+
type SelectorTerm = {
|
|
269
|
+
key: SelectorKey;
|
|
270
|
+
value: string | boolean;
|
|
271
|
+
};
|
|
272
|
+
type Selector = {
|
|
273
|
+
raw: string;
|
|
274
|
+
terms: SelectorTerm[];
|
|
275
|
+
};
|
|
276
|
+
type SelectorChain = {
|
|
277
|
+
raw: string;
|
|
278
|
+
selectors: Selector[];
|
|
279
|
+
};
|
|
280
|
+
declare function parseSelectorChain(expression: string): SelectorChain;
|
|
281
|
+
declare function tryParseSelectorChain(expression: string): SelectorChain | null;
|
|
282
|
+
declare function isSelectorToken(token: string): boolean;
|
|
283
|
+
//#endregion
|
|
284
|
+
//#region packages/selectors/src/internal/resolve.d.ts
|
|
285
|
+
/**
|
|
286
|
+
* The parser-side twin of the façade's `SelectorResolution`: identical except
|
|
287
|
+
* that the winning alternative is the `Selector` node itself, which the façade
|
|
288
|
+
* flattens to its `raw` text before any consumer sees it. Only the fields that
|
|
289
|
+
* differ are restated; everything else is shared with
|
|
290
|
+
* `public-resolution-types.ts`.
|
|
291
|
+
*/
|
|
292
|
+
type AstSelectorResolution = {
|
|
293
|
+
node: SnapshotNode;
|
|
294
|
+
selector: Selector;
|
|
295
|
+
selectorIndex: number;
|
|
296
|
+
matches: number;
|
|
297
|
+
diagnostics: SelectorDiagnostics[];
|
|
298
|
+
disambiguation?: SelectorDisambiguationDisclosure;
|
|
299
|
+
};
|
|
300
|
+
declare function resolveSelectorChain(nodes: SnapshotState['nodes'], chain: SelectorChain, options: SelectorResolutionOptions): AstSelectorResolution | null;
|
|
301
|
+
/** The parser-side twin of the façade's `SelectorChainMatch`. */
|
|
302
|
+
type AstSelectorChainMatch = {
|
|
303
|
+
selectorIndex: number;
|
|
304
|
+
selector: Selector;
|
|
305
|
+
matches: number;
|
|
306
|
+
diagnostics: SelectorDiagnostics[];
|
|
307
|
+
};
|
|
308
|
+
declare function findSelectorChainMatch(nodes: SnapshotState['nodes'], chain: SelectorChain, options: SelectorMatchOptions): AstSelectorChainMatch | null;
|
|
309
|
+
//#endregion
|
|
310
|
+
//#region packages/selectors/src/internal/node.d.ts
|
|
311
|
+
declare function isNodeVisible(node: SnapshotNode): boolean;
|
|
312
|
+
declare function isNodeEditable(node: SnapshotNode, platform: Platform | PublicPlatform): boolean;
|
|
313
|
+
//#endregion
|
|
314
|
+
//#region packages/selectors/src/ast.d.ts
|
|
315
|
+
/**
|
|
316
|
+
* The published signature takes a parsed chain or the raw text it came from;
|
|
317
|
+
* the engine only ever needs the text. Kept here rather than widening
|
|
318
|
+
* `internal/resolve.ts` back to a union, so the compatibility obligation sits
|
|
319
|
+
* at the boundary that owes it.
|
|
320
|
+
*/
|
|
321
|
+
declare function formatSelectorFailure(chain: SelectorChain | string, diagnostics: SelectorDiagnostics[], options: {
|
|
322
|
+
unique?: boolean;
|
|
323
|
+
}): string;
|
|
324
|
+
//#endregion
|
|
325
|
+
export { ClickButton as _, resolveSelectorChain as a, parseSelectorChain as c, ClickCommandResponseData as d, FillCommandResponseData as f, SettleObservation as g, PressCommandResponseData as h, findSelectorChainMatch as i, tryParseSelectorChain as l, LongPressCommandResponseData as m, isNodeEditable as n, SelectorChain as o, FindCommandResponseData as p, isNodeVisible as r, isSelectorToken as s, formatSelectorFailure as t, SelectorDiagnostics as u };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{u as e}from"./sdk-contracts.js";import{F as t,U as n,W as r}from"./sdk-batch-runner.js";import{TARGET_ANNOTATION_MAX_FIELD_BYTES as i,normalizeIdentifierField as a,normalizeLabelField as o,normalizeRoleField as s,truncateToUtf8Bytes as c}from"@agent-device/ad-script";function l(e,t){return{ok:!1,code:`INVALID_ARGS`,message:e,...t?{hint:t}:{}}}function u(e){return!!(e&&[e.x,e.y,e.width,e.height].every(Number.isFinite)&&e.width>0&&e.height>0)}function d(e,t){return t.x>=e.x&&t.y>=e.y&&t.x+t.width<=e.x+e.width&&t.y+t.height<=e.y+e.height}function f(e){return e.width*e.height}function p(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 h(a.map(e=>e.rect).filter(e=>m(e,r.x,r.y)))||h(a.map(e=>e.rect))||h(i.map(e=>e.rect).filter(e=>m(e,r.x,r.y)))||null}function ee(e,t){return g(e.x,e.x+e.width,t.x,t.x+t.width)&&g(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 m(e,t,n){return t>=e.x&&t<=e.x+e.width&&n>=e.y&&n<=e.y+e.height}function h(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 g(e,t,n,r){return Math.max(e,n)<=Math.min(t,r)}function ne(e){let t=e.trim().toLowerCase();return t?/^(vertical|horizontal)\s+scroll\s+bar(?:,?\s*\d+\s+pages?)?$/.test(t):!1}function _(e,t){if(!(e?.trim().toLowerCase()??``).includes(`vertical scroll bar`))return null;let n=re(t);return n===null?null:n<=1?{above:!1,below:!0}:n>=99?{above:!0,below:!1}:{above:!0,below:!0}}function re(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 ie(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 v(e){return new Map(e.map(e=>[e.index,e]))}function y(e){return e.label?.trim()||e.value?.trim()||e.identifier?.trim()||``}function ae(e){let t=`${e??``}`.toLowerCase();return t.includes(`scroll`)||t.includes(`recyclerview`)||t.includes(`listview`)||t.includes(`gridview`)||t.includes(`collectionview`)||t===`table`}function oe(e){return ae(e.type)?!0:`${e.role??``} ${e.subrole??``}`.toLowerCase().includes(`scroll`)}function se(e){if(e.length===0)return{nodes:e,hiddenCount:0,summaryLines:[]};let{byIndex:t,visibleNodeIndexes:n,offscreenNodes:r,hintedContainers:i}=b(e),a=n.size===0?e:e.filter(e=>n.has(e.index));return{nodes:a.map(e=>pe(e,i.directionsByContainer)),hiddenCount:n.size===0?0:e.length-a.length,summaryLines:me(r.filter(e=>!i.coveredNodeIndexes.has(e.index)&&ge(e)),e,t)}}function ce(e){if(e.length===0)return new Map;let{hintedContainers:t}=b(e);return fe(t.directionsByContainer)}function b(e){let t=v(e),n=new Set,r=[];for(let i of e){if(x(i,e,t)){ve(i,n,t);continue}r.push(i)}return{byIndex:t,visibleNodeIndexes:n,offscreenNodes:r,hintedContainers:de(e,r,n,t)}}function x(e,t,n=v(t)){if(!e.rect)return!0;let r=w(e,t,n);return r?ee(e.rect,r):!0}function S(e,t,n=v(t)){if(!e.rect)return!0;if(!x(e,t,n))return!1;let r=p(t,e.rect);return C(e.rect,r)}function C(e,t){return!t||t.width<=0||t.height<=0?!0:m(t,e.x+e.width/2,e.y+e.height/2)}function le(e,t){return e.hittable&&C(e.rect,t)}function w(e,t,n=v(t)){return xe(e,n)||p(t,e.rect??{x:0,y:0,width:0,height:0})}function ue(e,t,n=v(t)){if(!e.rect)return null;let r=w(e,t,n);if(r&&!ee(e.rect,r)){let t=T(e.rect,r);if(t)return t}let i=p(t,e.rect);if(i&&!C(e.rect,i)){let t=T(e.rect,i);if(t)return t}return null}function T(e,t){let n=e.x+e.width/2,r=e.y+e.height/2,i=[{direction:`down`,amount:r-(t.y+t.height)},{direction:`up`,amount:t.y-r},{direction:`right`,amount:n-(t.x+t.width)},{direction:`left`,amount:t.x-n}],a=null;for(let e of i)e.amount>0&&(!a||e.amount>a.amount)&&(a=e);return a?.direction??null}function de(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=D(e,n,r);if(!t?.rect)continue;let s=E(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 ye(e,n,r,i,a),{directionsByContainer:i,coveredNodeIndexes:o}}function fe(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 pe(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 me(e,t,n){let r=new Map;for(let i of e){let e=he(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=_e(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 he(e,t,n){if(!e.rect)return null;let r=w(e,t,n);return r?E(e.rect,r):null}function E(e,t){return e.y+e.height<=t.y?`above`:e.y>=t.y+t.height?`below`:null}function ge(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`)||!!y(e)}function _e(e){let t=new Set,n=[];for(let r of e){let e=y(r);!e||t.has(e)||(t.add(e),n.push(e))}return n}function ve(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 D(e,t,n){return Se(e,n,e=>t.has(e.index))}function ye(e,t,n,r,i){for(let a of e){let e=be(a);if(!e||e.size===0)continue;let o=D(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 be(e){let t=_(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 xe(e,t){return Se(e,t,e=>!!e.rect)?.rect??null}function Se(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)&&oe(r))return r;r=typeof r.parentIndex==`number`?t.get(r.parentIndex):void 0}return null}function O(e){let t=k(e.label),n=k(e.value),r=k(e.identifier),i=De(r)?r:``;return j(e.type??``)?n||t||i:t||n||i}function Ce(e,t){if(t===`text-view`||t===`text-field`||t===`search`)return!0;let n=A(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 we(e){let t=e.replace(/\s+/g,` `).trim();return t.length<=48?t:`${t.slice(0,45)}...`}function Te(e,t){let n=O(e),r=Ce(e,t);return{text:n,isLargeSurface:r,shouldSummarize:r&&Ee(n)}}function Ee(e){return e?e.length>80||/[\r\n]/.test(e):!1}function k(e){return typeof e==`string`?e.trim():``}function A(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 j(e){let t=A(e);return t.includes(`textfield`)||t.includes(`securetextfield`)||t.includes(`searchfield`)||t.includes(`edittext`)||t.includes(`textview`)||t.includes(`textarea`)}function De(e){return e?!/^[\w.]+:id\/[\w.-]+$/i.test(e)&&!/^_?NS:\d+$/i.test(e):!1}function Oe(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 ke(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&&M(n)?n:Ae(e,t)??(n&&M(n)?n:void 0)}function M(e){let t=e.trim();return!(!t||/^(true|false)$/i.test(t)||/^\d+$/.test(t))}function Ae(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||!M(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 je(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=A(r.type??``),a=[r.label,r.value,r.identifier].map(e=>typeof e==`string`?e.trim():``).find(e=>e&&e.length>0),o=a?M(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 N(e,t){let n=A(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 Me(e,t){return t.hittable?t:I(e,t,e=>e.hittable===!0)}function P(e){return new Map(e.map(e=>[e.index,e]))}function F(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 I(e,t,n){return F(e,t,P(e),e=>n(e)?e:null)}function L(e){return[e.label,e.value,e.identifier].map(e=>typeof e==`string`?e.trim():``).filter(e=>e.length>0)[0]??``}function Ne(e){return O(e)}function R(e){return e.hittable===!0?!0:e.rect?e.rect.width>0&&e.rect.height>0:!1}function z(e,t){return N(e.type??``,t)&&e.enabled!==!1}function B(e){return[`visible`,`hidden`,`exists`,`editable`,`selected`,`focused`,`text`].includes(e)}function V(e){let t=e.toLowerCase();return B(t)?{ok:!0,predicate:t}:l(`is requires predicate: visible|hidden|exists|editable|selected|focused|text`,Pe)}const Pe=`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 H(e){if(B((e[0]??``).toLowerCase()))return e;for(let t=1;t<e.length;t+=1){let n=(e[t]??``).toLowerCase();if(B(n)&&r(e.slice(0,t).join(` `)))return[n,...e.slice(0,t),...e.slice(t+1)]}return e}function Fe(e){let{predicate:t,node:n,nodes:r,expectedText:i,platform:a}=e,o=L(n),s=z(n,a),c=n.selected===!0,l=n.focused===!0,u=t===`text`?R(n):Ie(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 Ie(e,t,n){if(n===`android`&&e.visibleToUser===!1)return!1;if(u(e.rect))return U(e,t);if(e.rect)return!1;if(n!==`android`&&e.hittable===!0)return!0;let r=Le(e,t,n);return r?u(r.rect)?U(r,t):n!==`android`&&r.hittable===!0:!1}function U(e,t){return x(e,t)}function Le(e,t,n){return F(t,e,P(t),e=>Re(e,n)?e:null)}function Re(e,t){if(t===`android`&&e.visibleToUser===!1)return!1;let n=A(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&&u(e.rect):e.hittable===!0||u(e.rect)}function W(e){let t=H(e),r=t[0]??``;return{predicate:r,split:n(t.slice(1),{preferTrailingValue:r===`text`})}}const G=`is requires a selector expression`,K=`is text requires expected text value`;function ze(e){let{predicate:t,split:n}=W([...e]),r=V(t);if(!r.ok)return r;if(!n)return l(G);let i=n.rest.join(` `).trim();return r.predicate===`text`&&!i?l(K):r.predicate!==`text`&&n.rest.length>0?l(`is ${r.predicate} does not accept trailing values`):{ok:!0,predicate:r.predicate,selectorExpression:n.selectorExpression,expectedText:i}}function Be(e){return e===`text`||e===`attrs`?{ok:!0,format:e}:l(`get only supports text or attrs`)}function Ve(e){let t=e[0];if(t?.startsWith(`@`)){let n=e.slice(1).join(` `).trim();return{ok:!0,ref:t,...n?{label:n}:{}}}let n=e.join(` `).trim();return n?{ok:!0,selector:n}:l(`get requires @ref or selector expression`)}function He(e){return e?{ok:!0,text:e}:l(`wait requires text`)}function q(e,t,n){return t.terms.every(t=>Ue(e,t,n))}function Ue(e,t,n){switch(t.key){case`id`:return J(e.identifier,String(t.value));case`role`:return J(A(e.type??``),String(t.value));case`label`:return J(e.label,String(t.value));case`value`:return J(e.value,String(t.value));case`text`:return J(L(e),String(t.value));case`appname`:return J(e.appName,String(t.value));case`windowtitle`:return J(e.windowTitle,String(t.value));case`visible`:return R(e)===!!t.value;case`hidden`:return!R(e)==!!t.value;case`editable`:return z(e,n)===!!t.value;case`selected`:return e.selected===!0==!!t.value;case`focused`:return e.focused===!0==!!t.value;case`enabled`:return e.enabled!==!1==!!t.value;case`hittable`:return e.hittable===!0==!!t.value;default:return!1}}function J(e,n){return t(e??``)===t(n)}function We(e,t,n){let r=n.requireRect??!1,i=n.requireUnique??!0,a=[];for(let[o,s]of t.selectors.entries()){let t=Xe(e,s,n.platform,r);if(a.push({selector:s.raw,matches:t.count}),!(t.count===0||!t.firstNode)){if(i&&t.count!==1){if(!n.disambiguateAmbiguous||!t.disambiguated||!t.tiebreak)continue;return{node:t.disambiguated,selector:s,selectorIndex:o,matches:t.count,diagnostics:a,disambiguation:{matchCount:t.count,tiebreak:t.tiebreak,alternatives:t.candidates.filter(e=>e!==t.disambiguated)}}}return{node:t.firstNode,selector:s,selectorIndex:o,matches:t.count,diagnostics:a}}}return null}function Ge(e,t,n){let r=n.requireRect??!1;for(let[i,a]of t.selectors.entries()){let t=e.filter(e=>r&&!e.rect?!1:q(e,a,n.platform));if(t.length>0)return{selector:a,selectorIndex:i,matchedNodes:t}}return null}function Ke(e,t,n){let r=n.requireRect??!1,i=[];for(let[a,o]of t.selectors.entries()){let t=$e(e,o,n.platform,r);if(i.push({selector:o.raw,matches:t}),t>0)return{selectorIndex:a,selector:o,matches:t,diagnostics:i}}return null}const qe=`Snapshot refs expire when the UI changes. Run snapshot -i and retry with a fresh @ref.`;function Je(e){return e.some(e=>e.matches>1)?`Add more terms to disambiguate (e.g. role=button text="Sign in"), use an @ref from snapshot -i, or use find <text> --first/--last.`:`Selector text/label values match exactly (quote multi-word values: text="Sign in"). Run snapshot -i to see current elements and refs, or use find <text> for contains matching.`}function Ye(e,t,n){if(t.length===0)return`Selector did not match: ${e.raw}`;let r=t.map(e=>`${e.selector} -> ${e.matches}`).join(`, `);return n.unique??!0?`Selector did not resolve uniquely (${r})`:`Selector did not match (${r})`}function Xe(e,t,n,r){let i=0,a=null,o=[],s={best:null,bestVisible:!1,tie:!1},c,l=t=>(c??=v(e),S(t,e,c));for(let c of e)r&&!c.rect||q(c,t,n)&&(i+=1,a??=c,o.push(c),Ze(s,c,l));return{count:i,firstNode:a,disambiguated:s.tie?null:s.best,tiebreak:s.tie?null:Qe(o,s.best,l),candidates:o}}function Ze(e,t,n){if(!e.best){e.best=t;return}e.bestVisible||=n(e.best);let r=n(t);if(r!==e.bestVisible){r&&(e.best=t,e.bestVisible=!0,e.tie=!1);return}let i=X(t,e.best);i.result>0?(e.best=t,e.tie=!1):i.result===0&&(e.tie=!0)}function Qe(e,t,n){if(!t)return null;let r=null;for(let i of e)i!==t&&(!r||Y(i,r,n).result>0)&&(r=i);return r?Y(t,r,n).criterion:null}function Y(e,t,n){let r=n(e);return r===n(t)?X(e,t):{result:r?1:-1,criterion:`visible`}}function $e(e,t,n,r){let i=0;for(let a of e)r&&!a.rect||q(a,t,n)&&(i+=1);return i}function X(e,t){let n=e.depth??0,r=t.depth??0;if(n!==r)return{result:n>r?1:-1,criterion:`deepest`};let i=et(e),a=et(t);return i===a?{result:0,criterion:null}:{result:i<a?1:-1,criterion:`smallest-area`}}function et(e){return e.rect?e.rect.width*e.rect.height:1/0}function Z(e){let t=s(A(e.type??``)),n=a(e.identifier),r=o(e.label);return{...n===void 0?{}:{id:c(n,i)},role:c(t,i),...r===void 0?{}:{label:c(r,i)}}}function tt(e,t){return e.id===t.id&&e.role===t.role&&e.label===t.label}function nt(e,t){let n=0;for(let r of e)Z(r).id===t&&(n+=1);return n}function rt(e,t){if(e.id===void 0||nt(t,e.id)<=1)return e;let{role:n,label:r}=e;return{role:n,...r===void 0?{}:{label:r}}}function it(e,t){let n=0;for(let r of e)if(r.parentIndex===t.parentIndex){if(r.index===t.index)return n;n+=1}return 0}function at(e,t){return{documentOrder:e.index,sibling:it(t,e)}}function ot(e,t){return e.documentOrder===t.documentOrder&&e.sibling===t.sibling}const st=`replay_target_guard_mismatch`,ct=`wait_landmark_identity_mismatch`;function lt(e,t,n={}){let r=[],i=A(e.type??``),a=ut(e,n.nodes),o=$(e.label),s=$(e.value),c=$(L(e)),l=n.action===`fill`;a&&r.push(`id=${Q(a)}`),i&&o&&r.push(l?`role=${Q(i)} label=${Q(o)} editable=true`:`role=${Q(i)} label=${Q(o)}`),o&&r.push(l?`label=${Q(o)} editable=true`:`label=${Q(o)}`),s&&r.push(l?`value=${Q(s)} editable=true`:`value=${Q(s)}`),c&&c!==o&&c!==s&&r.push(l?`text=${Q(c)} editable=true`:`text=${Q(c)}`),i&&l&&!r.some(e=>e.includes(`editable=true`))&&r.push(`role=${Q(i)} editable=true`);let u=dt(r);return u.length===0&&i&&u.push(l?`role=${Q(i)} editable=true`:`role=${Q(i)}`),u.length===0&&R(e)&&u.push(`visible=true`),u}function ut(e,t){let n=$(e.identifier);if(!n||!t)return n;let r=Z(e).id;return r===void 0?n:nt(t,r)>1?null:n}function dt(e){return Array.from(new Set(e))}function Q(e){return JSON.stringify(e)}function $(e){return e&&e.trim()||null}export{v as $,Ne as A,O as B,He as C,H as D,Fe as E,N as F,ue as G,j as H,je as I,x as J,ce as K,ke as L,I as M,Me as N,z as O,Oe as P,ae as Q,we as R,ze as S,V as T,k as U,A as V,se as W,w as X,S as Y,oe as Z,q as _,rt as a,h as at,Ve as b,at as c,f as ct,qe as d,y as et,Ke as f,Je as g,We as h,ct as i,m as it,L as j,R as k,it as l,d as lt,Ge as m,$ as n,_ as nt,tt as o,p as ot,Ye as p,le as q,st as r,ne as rt,Z as s,u as st,lt as t,ie as tt,ot as u,K as v,W as w,Be as x,G as y,Te as z};
|
|
1
|
+
import{wt as e}from"./sdk-batch-runner.js";function t(t,n,r){return e(typeof t==`string`?t:t.raw,n,r)}export{t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{S as e,_ as t,h as n,l as r,m as i,s as a,v as o}from"./sdk-contracts.js";import{M as s,Y as c,a as l}from"./viewport-dimension.js";import{M as u,O as d,P as f,W as p}from"./sdk-batch-runner.js";import{N as m}from"./screenshot-result.js";import{c as ee,h as te,o as ne,s as h}from"./sdk-device.js";import{A as re,C as ie,E as ae,H as oe,P as se,S as ce,V as le,b as ue,x as de}from"./sdk-selectors.js";import{S as g}from"./device.js";import{i as fe,n as pe,t as me}from"./runtime.js";import{j as _}from"./sdk-android-adb.js";import{r as he}from"./app-lifecycle.js";import{h as v}from"./ime-lifecycle.js";import{j as ge}from"./runner-disposal.js";import{S as y,c as _e,g as ve,l as b,n as ye,s as x,t as be}from"./context.js";import{C as xe}from"./physical-device-control.js";import{a as S,l as Se}from"./runner-client.js";import{Ht as Ce,Qt as C,Ut as w,Vt as we,Wt as T,an as Te,g as Ee,u as De}from"./internal/daemon.js";import{a as Oe}from"./apps.js";import{i as ke}from"./session-target-evidence.js";function E(e,t){let n=fe(t);if(!n)return e;if(e.ok){let t=Ae(e.data?.warning,n);return{...e,data:{...e.data,warning:t}}}let r=e.error.details??{};return{...e,error:{...e.error,details:{...r,hint:Ae(r.hint,n)}}}}function Ae(e,t){return typeof e==`string`&&e.trim()!==``?`${e}\n${t}`:t}async function je(e,t,n){let r=e.get(t),i=r?.device??await ve(n??{});return r||await Ee(i),{session:r,device:i}}async function Me(e,t,n){let r=!e&&h(t);try{return await n()}finally{r&&(await Se(t.id),await Ne(t))}}async function Ne(e){let t=xe();await Oe(e,t).catch(n=>{_({level:`debug`,phase:`ios_sessionless_runner_host_close_failed`,data:{deviceId:e.id,bundleId:t,error:n instanceof Error?n.message:String(n)}})})}function Pe(e,t,n,r){t&&e.recordAction(t,{command:n.command,positionals:n.positionals??[],flags:n.flags??{},result:r})}function Fe(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 Ie=[[`snapshotDepth`,`--depth`],[`snapshotScope`,`--scope`],[`snapshotRaw`,`--raw`]];function D(e,t){let n=Le(t);return n.length===0?null:x(`INVALID_ARGS`,`${e} @ref does not support ${n.join(`, `)}.`)}function Le(e){if(!e)return[];let t=[];for(let[n,r]of Ie)e[n]!==void 0&&t.push(r);return t}function Re(e,t){if(!t||t.settle===!0)return null;let n=[];return t.settleQuietMs!==void 0&&n.push(`--settle-quiet`),n.length===0?null:x(`INVALID_ARGS`,`${e}: ${n.join(`, `)} require${n.length===1?`s`:``} --settle.`)}function ze(e){if(e?.settle===!0)return{...e.settleQuietMs===void 0?{}:{quietMs:e.settleQuietMs},...e.timeoutMs===void 0?{}:{timeoutMs:e.timeoutMs}}}function O(e){if(e.length<2)return null;let t=Number(e[0]),n=Number(e[1]);return!Number.isFinite(t)||!Number.isFinite(n)?null:{x:t,y:n}}function k(e){let t=n(e);return t?{ok:!0,ref:t.base,generation:t.generation}:{ok:!1,response:x(`INVALID_ARGS`,`Invalid ref "${e}" — malformed generation suffix.`,{hint:a})}}function A(e,t){let n=O(e);if(n)return{ok:!0,target:{kind:`point`,x:n.x,y:n.y}};let r=e[0]??``;if(r.startsWith(`@`)){let t=k(r);return t.ok?{ok:!0,target:{kind:`ref`,ref:t.ref,fallbackLabel:e.slice(1).join(` `).trim()},refGeneration:t.generation}:{ok:!1,response:t.response}}let i=e.join(` `).trim();return i?{ok:!0,target:{kind:`selector`,selector:i}}:{ok:!1,response:x(`INVALID_ARGS`,`${t} requires @ref, selector expression, or x y coordinates`)}}function Be(e){let t=O(e);if(t)return{ok:!0,target:{kind:`point`,x:t.x,y:t.y},...qe(e[2])};let n=Ke(e),r=A(n.targetPositionals,`longpress`);return r.ok?{ok:!0,target:r.target,refGeneration:r.refGeneration,...n.duration}:r}function Ve(e){let t=e[0]??``;if(t.startsWith(`@`)){let n=k(t);if(!n.ok)return{ok:!1,response:n.response};let r=l(e).text;return r?{ok:!0,target:{kind:`ref`,ref:n.ref,fallbackLabel:Ge(e)},refGeneration:n.generation,text:r}:{ok:!1,response:x(`INVALID_ARGS`,`fill requires text after ref`)}}let n=O(e);if(n){let t=e.slice(2).join(` `);return t?{ok:!0,target:{kind:`point`,x:n.x,y:n.y},text:t}:{ok:!1,response:x(`INVALID_ARGS`,`fill requires text after coordinates`)}}let r=He(e);return!r||r.kind!==`selector`?{ok:!1,response:x(`INVALID_ARGS`,`fill requires x y text, @ref text, or selector text`)}:r.text.trim()?{ok:!0,target:{kind:`selector`,selector:r.target.selector},text:r.text}:{ok:!1,response:x(`INVALID_ARGS`,`fill requires text after selector`)}}function He(e){try{return l(e)}catch{return null}}function Ue(e){let t=`evidence`in e?e.evidence:void 0,n=e.settle;return e.kind===`ref`?{ref:j(e.target?.kind===`ref`?e.target.ref:void 0),refLabel:e.refLabel,selectorChain:e.selectorChain,targetHittable:e.targetHittable,hint:e.hint,evidence:t,settle:n,resolution:e.resolution}:e.kind===`selector`?{selector:e.target?.kind===`selector`?e.target.selector:void 0,selectorChain:e.selectorChain,refLabel:e.refLabel,targetHittable:e.targetHittable,hint:e.hint,evidence:t,settle:n,resolution:e.resolution}:{evidence:t,settle:n}}function We(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 j(e){return e?.startsWith(`@`)?e.slice(1):e}function Ge(e){return e.length>=3&&e[1]?.trim()||``}function Ke(e){let t=e.at(-1);return e.length>1&&Je(t)?{targetPositionals:e.slice(0,-1),duration:{durationMs:Number(t)}}:{targetPositionals:e,duration:{}}}function qe(e){return e===void 0?{}:{durationMs:Number(e)}}function Je(e){return e===void 0||e.trim()===``?!1:Number.isFinite(Number(e))}async function Ye(e,n){let r=await M(e);if(r){if(v(r.foregroundPackage))return`press ${n} opened an Android permission dialog (${r.foregroundPackage}) over ${r.expectedPackage}. ${r.hint}`;throw new t(`COMMAND_FAILED`,`press ${n} left ${e.appBundleId} and foregrounded ${r.foregroundPackage}. The tap likely escaped the app.`,r)}}async function M(e){if(e.device.platform!==`android`||!e.appBundleId)return null;let t=await he(e.device),n=t.package?.trim();return!n||n===e.appBundleId||!$e(n)?null:{expectedPackage:e.appBundleId,foregroundPackage:n,activity:t.activity,hint:Qe(n)}}function Xe(e){return v(e.foregroundPackage)?`Android permission dialog is blocking ${e.expectedPackage}`:`${e.foregroundPackage} is foreground instead of ${e.expectedPackage}`}function Ze(e){return e.code===`COMMAND_FAILED`&&typeof e.details?.expectedPackage==`string`&&typeof e.details?.foregroundPackage==`string`}function Qe(e){return v(e)?`Use "alert get" to inspect it, then "alert accept" or "alert dismiss" to respond.`:`Use screenshot as visual truth, then take a fresh snapshot -i before retrying.`}function $e(e){return e===`com.android.settings`||e===`com.android.systemui`||v(e)||e.includes(`launcher`)}function et(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 tt(e){return e.kind===`found`?{found:!0,...typeof e.waitedMs==`number`?{waitedMs:e.waitedMs}:{}}:{ref:e.ref,...e.kind===`text`?{text:e.text}:{},node:g(e.node)}}function N(e,t){let n=Array.isArray(e.selectorChain)?e.selectorChain:void 0,r=it(e),i=r?.kind===`ref`?R(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:rt(s)}}function P(e){let{target:t}=e;return{...t.kind===`ref`?{ref:R(t.ref)}:{},...t.kind===`selector`?{selector:t.selector}:{},...typeof e.text==`string`?{text:e.text}:{},node:g(e.node)}}function F(e){let{node:t,preActionNodes:n,...r}=e;return r}function nt(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,i,a){let o=e.get(t);if(!o)return;let s=o.recordSession&&i?ke(i,{mode:a}):void 0;e.recordAction(o,{command:n.command,positionals:n.positionals??[],flags:n.flags??{},result:r,interactiveObservation:m(n),...s?{targetEvidence:s}:{}})}function rt(e){let t=e.trim();if(!(!t||t.length>80||/[\r\n]/.test(t)))return t}function it(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 R(e){return e.startsWith(`@`)?e.slice(1):e}const at=[`application`,`window`,`tabbar`,`scrollbar`,`image`],ot=new Set([`tab bar`]);async function z(e,t){if(t.ok||!st(t.error.message)||t.error.details?.captureStalled===!0||t.error.details?.captureTruncated===!0)return t;let n=await ct(e).catch(()=>null);return n?x(t.error.code,`${t.error.message}. Current surface: ${n.summary}.`,{...t.error.details??{},currentSurface:n.details}):t}function st(e){return/^wait timed out (?:for (?:selector|text): |waiting for a stable UI)/i.test(e)}async function ct(e){let t=[...(await C({device:e.device,session:e.session,flags:{...e.req.flags,snapshotInteractiveOnly:!0},logPath:e.logPath??``})).snapshot.nodes].sort(lt),n=B(t,6,{includeIdentifiers:!0});if(n.length===0)return null;let r=B(t.filter(e=>!dt(e)),4,{includeIdentifiers:!1}),i=B(t.filter(ft),4,{includeIdentifiers:!0});return{summary:(r.length>0?r:n.slice(0,4)).join(`, `),details:{labels:n,...i.length>0?{buttons:i}:{}}}}function B(e,t,n){let r=new Set,i=[];for(let a of e){let e=H(a,n);if(!(!e||r.has(e))&&(r.add(e),i.push(e),i.length>=t))break}return i}function lt(e,t){return V(e)-V(t)||ut(e,t)}function V(e){let t=!!H(e,{includeIdentifiers:!1});return(dt(e)?2:0)+ +!t}function ut(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 H(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 dt(e){let t=le(`${e.type??``} ${e.role??``} ${e.subrole??``}`),n=`${e.label??``} ${e.value??``}`.trim().toLowerCase();return at.some(e=>t.includes(e))||ot.has(n)||n.endsWith(`.fill`)}function ft(e){return le(`${e.type??``} ${e.role??``} ${e.subrole??``}`).includes(`button`)}function U(e,t){return!(!e||!h(e.device)||y(e.device)||t.skipPendingPostGestureStabilization&&e.postGestureStabilization)}function W(e){let{session:t,selectorExpression:n}=e;if(!U(t,{skipPendingPostGestureStabilization:!0}))return null;let r=p(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`||!pt(a.key)?null:{key:a.key,value:a.value,raw:i.raw}}function pt(e){return e===`id`||e===`label`||e===`text`||e===`value`}function mt(e){let t=e.identifier?.trim();if(t)return{key:`id`,value:t};let n=e.label?.trim();return n?{key:`label`,value:n}:null}function G(e,t={}){let n=o(e);if(n.code===`ELEMENT_NOT_FOUND`)return t.delegateSemanticFailures===!0||t.allowElementNotFound===!0;if(n.code===`AMBIGUOUS_MATCH`)return t.delegateSemanticFailures===!0;if(n.code===`ELEMENT_OFFSCREEN`)return t.delegateSemanticFailures!==!1;if(n.code!==`COMMAND_FAILED`)return!1;let r=n.message.toLowerCase();return r.includes(`fetch failed`)||r.includes(`timed out`)||r.includes(`timeout`)||r.includes(`runner did not accept connection`)||r.includes(`invalid runner response`)}function ht(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 K(e,t={}){return{artifacts:ht(e,t),policy:pe()}}async function gt(e){let{device:t,node:n,flags:r,appBundleId:i,traceOutPath:a,surface:o,contextFromFlags:s}=e,l=re(n),u=c(n.rect);if(!u||h(t)&&l&&!oe(n.type??``))return l;try{let e=await ye(t,`read`,[String(u.x),String(u.y)],void 0,{...s(r,i,a),surface:o}),c=e&&typeof e==`object`?e:void 0,d=typeof c?.text==`string`?c.text:``;return d.trim()?d:(_({level:`warn`,phase:`interaction_read_fallback`,data:{reason:`empty_backend_text`,nodeRef:n.ref,surface:o,platform:t.platform}}),l)}catch(e){return _({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}}function q(e){let{session:t,sessionStore:n,sessionName:r}=e,i=0,a,o,s=t=>(e.consumedSnapshot&&(e.consumedSnapshot.state=t.snapshot),t);return{capture:async c=>{let l=Date.now(),u=Et(c,e.req.flags?.out),d=bt({timestamp:l,lastSnapshotAt:i,lastSnapshotResult:a,lastSnapshotCacheKey:o,session:t,request:c,cacheKey:u});if(d)return s(d);let f=xt({session:t,timestamp:l,request:c});if(f)return i=f.createdAt,a={snapshot:f},o=u,s(a);let p=await _t({params:e,request:c});c.signal?.throwIfAborted();let m={snapshot:p};return Ot({session:t,sessionStore:n,sessionName:r,snapshot:p}),i=l,a=m,o=u,s(m)}}}async function _t(e){let{params:t,request:n}=e,r=await J(t,n,n.snapshotScope);return n.recovery?.legacyIosSparse&&kt(r)?await vt({runtimeParams:t,request:n,policy:n.recovery.legacyIosSparse}):n.recovery?.sparseVerdictQueryScope?.shouldScope&&s(r.snapshotQuality)?await yt({runtimeParams:t,request:n,policy:n.recovery.sparseVerdictQueryScope,snapshot:r}):r}async function vt(e){let{runtimeParams:t,request:n,policy:r}=e;try{return await J(t,n,void 0,!1)}catch(e){if(!r.shouldScope)throw e;return await J(t,n,r.query,!1)}}async function yt(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 C({device:e.device,session:e.session,flags:{...t.flags,snapshotInteractiveOnly:r},outPath:t.outPath??e.req.flags?.out,logPath:e.logPath??``,snapshotScope:n,includeRects:t.includeRects,signal:t.signal})).snapshot}function bt(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)&&!Te(a)&&!wt(a,o))return r}function xt(e){let{session:t,timestamp:n,request:r}=e,i=t?.snapshot;if(i&&St(t,r)&&Ct(i,n)&&i.presentationKey===Tt(r))return i}function St(e,t){return!(t.cache?.forceFresh===!0||t.cache?.useSessionSnapshot!==!0||Te(e)||wt(e,t))}function Ct(e,t){return t-e.createdAt<750}function wt(e,t){return t.cache?.bypassForPostGestureStabilization===!0&&!!e?.postGestureStabilization}function Tt(e){return r(i(Dt(e)))}function Et(e,t){return JSON.stringify({presentationKey:Tt(e),includeRects:e.includeRects===!0,outPath:e.outPath??t??null})}function Dt(e){return e.snapshotScope===void 0?e.flags:{...e.flags,snapshotScope:e.snapshotScope}}function Ot(e){let{session:t,sessionStore:n,sessionName:r,snapshot:i}=e;!t||s(i.snapshotQuality)||(T(t,i),n.set(r,t))}function kt(e){return e.snapshotQuality||e.backend!==`xctest`||e.nodes.length!==1?!1:e.nodes[0]?.type===`Application`}function At(e){return me({backend:jt(e),...K(`selector commands`,{plural:!0}),sessions:we({sessionName:e.sessionName,getSession:()=>e.session,recordOptions:{includeSnapshot:!0},setRecord:t=>{!e.session||!t.snapshot||(T(e.session,t.snapshot),e.sessionStore.set(e.sessionName,e.session))}}),signal:e.signal??ge(e.req.meta?.requestId)})}async function Y(e,t){e.consumedSnapshot??={};let n=e.sessionStore.get(e.sessionName);if(!n&&t.requireSession)return{ok:!1,response:_e()};let r=n?.device??await ve(e.req.flags??{});n||await Ee(r);let i=b(t.capability,r);return i?{ok:!1,response:i}:{ok:!0,runtime:At({...e,session:n,device:r})}}function jt(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,consumedSnapshot:e.consumedSnapshot,logPath:i});return{platform:te(r),captureSnapshot:async(e,n)=>{let i={...t.flags,...Mt(n)},a=n?.includeRects===!0,o=n?.scope??t.flags?.snapshotScope,c=t.command===`wait`||t.command===`find`||a&&r.platform===`web`;return await s.capture({flags:i,signal:e.signal,snapshotScope:o,includeRects:a,cache:{forceFresh:c,useSessionSnapshot:!0,bypassForPostGestureStabilization:!0}})},readText:async(a,o)=>({text:await gt({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 Nt(e,n,t.signal)})}}function Mt(e){let{interactiveOnly:t,scope:n,depth:r,raw:i,includeHiddenContentHints:a}=e??{},o={};return t!==void 0&&(o.snapshotInteractiveOnly=t),n!==void 0&&(o.snapshotScope=n),r!==void 0&&(o.snapshotDepth=r),i!==void 0&&(o.snapshotRaw=i),a!==void 0&&(o.snapshotIncludeHiddenContentHints=a),o}async function Nt(e,t,n){let r=await Pt(e,t,n);return r===null?await Ft(e,t,n)===!0?!0:await Rt(e,t,n):r}async function Pt(e,t,n){return!ee(e.device)||!e.session?.surface||e.session.surface===`app`?null:await Rt(e,t,n)}async function Ft(e,t,n){let r=It(e);return r?(await S(r.device,{command:`findText`,text:t,appBundleId:r.appBundleId},{...Lt(e,r),signal:n}))?.found===!0:null}function It(e){return!ne(e.device.platform)||y(e.device)||!e.session?.appBundleId?null:{device:e.device,appBundleId:e.session.appBundleId,traceLogPath:e.session.trace?.outPath}}function Lt(e,t){return De({req:e.req,logPath:e.logPath,traceLogPath:t.traceLogPath})}async function Rt(e,t,n){return!!se((await zt(e,n)).nodes,t)}async function zt(e,t){let{snapshot:n}=await q({device:e.device,session:e.session,sessionStore:e.sessionStore,sessionName:e.sessionName,req:e.req,logPath:e.logPath,consumedSnapshot:e.consumedSnapshot}).capture({flags:{...e.req.flags,snapshotInteractiveOnly:!1,snapshotIncludeHiddenContentHints:!1},signal:t,cache:{forceFresh:!0,bypassForPostGestureStabilization:!0}});return n}async function Bt(e){let{req:t}=e;if(t.command!==`find`)return null;let n=u(t.positionals??[],t.flags);if(!n.ok)return x(n.code,n.message);let r=n.parsed,i=r.action;if(!f(i))return null;let a=await Y(e,{requireSession:!1,capability:`find`});return a.ok?E(await $(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,et(n,i));let o=tt(n);if(typeof o.ref==`string`){let t=e.sessionStore.get(e.sessionName);if(t&&(Ce(t,[o.ref]),e.sessionStore.set(e.sessionName,t),t.snapshotGeneration!==void 0))return{...o,refsGeneration:t.snapshotGeneration}}return o}),X(e)):a.response}function X(e){return e.consumedSnapshot?.state??e.sessionStore.get(e.sessionName)?.snapshot}async function Vt(e){let{req:t}=e;if(t.command!==`get`)return null;let n=de(t.positionals?.[0]);if(!n.ok)return x(n.code,n.message);let r=n.format,i=en(t);if(!i.ok)return i.response;if(i.target.kind===`ref`){let e=D(`get`,t.flags);if(e)return e}let a=t.internal?.replayTargetGuard;if(i.target.kind===`selector`&&!a){let t=await Kt(e,r,i.target.selector);if(t)return t}let o=await Y(e,{requireSession:!0,capability:`get`});if(!o.ok)return o.response;let s=i.target.kind===`ref`?w({session:e.sessionStore.get(e.sessionName),ref:i.target.ref,mintedGeneration:i.refGeneration}):void 0;return E(await $(async()=>{let n=await o.runtime.selectors.get({session:e.sessionName,requestId:t.meta?.requestId,property:r,target:i.target,expectedResolvedTarget:a});L(e.sessionStore,e.sessionName,t,N(n,r),{node:n.node,preActionNodes:n.preActionNodes});let c=P(n);return s?{...c,warning:s}:c}),X(e))}async function Ht(e){let{req:t}=e;if(t.command!==`is`)return null;let n=ce(t.positionals??[]);if(!n.ok)return x(n.code,n.message,n.hint?{hint:n.hint}:void 0);let{predicate:r,expectedText:i}=n,a={selectorExpression:n.selectorExpression},o=t.internal?.replayTargetGuard,s=e.sessionStore.get(e.sessionName)?.recordSession===!0;if(!o&&!s){let t=await qt(e,r,a.selectorExpression,i);if(t)return t}let c=await Y(e,{requireSession:!0,capability:`is`});return c.ok?E(await nn(e,await $(async()=>{let n=await c.runtime.selectors.is({session:e.sessionName,requestId:t.meta?.requestId,predicate:r,selector:a.selectorExpression,expectedText:i,expectedResolvedTarget:o}),s=Wt(n),l=F(n);return L(e.sessionStore,e.sessionName,t,l,s),I(l)}),`is ${r}`),X(e)):c.response}async function Ut(e){let{req:t,sessionName:n,sessionStore:r}=e,i=d(t.positionals??[]);if(!i)return x(`INVALID_ARGS`,`wait requires a duration or text`);let{session:a,device:o}=await je(r,n,t.flags);if(i.kind!==`sleep`){let e=b(`wait`,o);if(e)return e}let s=t.internal?.replayLandmarkGuard;if(i.kind===`selector`&&!s&&!a?.recordSession){let t=await Jt({...e,session:a,device:o,selectorExpression:i.selectorExpression,timeoutMs:i.timeoutMs});if(t)return t}let c=i,l;if(i.kind===`ref`){let e=k(i.rawRef);if(!e.ok)return e.response;c={...i,rawRef:e.ref},l=w({session:a,ref:e.ref,mintedGeneration:e.generation})}e.consumedSnapshot??={};let u=async()=>{let i=At({...e,session:a,device:o}),u=await $(async()=>{let e=await i.selectors.wait({session:n,requestId:t.meta?.requestId,target:tn(c,a,s)}),o=Wt(e);L(r,n,t,F(e),o,`landmark`);let u=nt(e);return l?{...u,warning:l}:u});return await nn(e,await z({req:t,logPath:e.logPath,session:a,device:o},u),`wait`)};return i.kind===`sleep`?await u():E(await Me(a,o,u),X(e))}function Wt(e){let t=e.node,n=e.preActionNodes;if(!(!t||typeof t!=`object`||!Array.isArray(n)))return{node:t,preActionNodes:n}}function Gt(e,t,n){if(!e||e.recordSession)return null;let r=W({session:e,selectorExpression:n});return t===`text`&&r?.key!==`id`?null:r}async function Kt(e,t,n){let r=e.sessionStore.get(e.sessionName),i=Gt(r,t,n);if(!r||!i)return null;let a=await Z(e,r,i);if(Q(a))return a.response;if(!a)return null;let o=Zt(t,i.raw,a);return o?(L(e.sessionStore,e.sessionName,e.req,N(o,t)),{ok:!0,data:P(o)}):null}async function qt(e,t,n,r){if(t===`hidden`)return null;let i=await Yt(e,n);if(Q(i))return i.response;if(!i?.result.found||!i.result.node)return null;let a=t===`exists`?{predicate:t,pass:!0,selector:i.selector.raw,matches:1,selectorChain:[i.selector.raw]}:Qt(t,r,i.selector.raw,i.session,i.result.node);return a?(L(e.sessionStore,e.sessionName,e.req,a),{ok:!0,data:I(a)}):null}async function Jt(e){let t=W({session:e.session,selectorExpression:e.selectorExpression});if(!e.session||!t)return null;let n=Date.now(),r=await Z(e,e.session,t);if(Q(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 z({req:e.req,logPath:e.logPath,session:e.session,device:e.device},a)}async function Yt(e,t){let n=e.sessionStore.get(e.sessionName),r=W({session:n,selectorExpression:t});if(!n||!r)return null;let i=await Z(e,n,r);return Q(i)?i:i?{session:n,selector:r,result:i}:null}async function Xt(e,t,n){let r=await S(e.device,{command:`querySelector`,selectorKey:t.key,selectorValue:t.value,appBundleId:e.appBundleId},n),i=r.found===!0,a=$t(r);return{found:i,...typeof r.text==`string`?{text:r.text}:{},...a?{node:a}:{}}}async function Z(t,n,r){try{return await Xt(n,r,De({req:t.req,logPath:t.logPath,traceLogPath:n.trace?.outPath}))}catch(t){return G(t,{allowElementNotFound:!0})?null:{kind:`error`,response:{ok:!1,error:e(t)}}}}function Q(e){return e!==null&&`kind`in e&&e.kind===`error`}function Zt(e,t,n){if(!n.found||!n.node)return null;let r={target:{kind:`selector`,selector:t},node:n.node,selectorChain:[t]};return e===`attrs`?{kind:`attrs`,...r}:typeof n.text==`string`?{kind:`text`,...r,text:n.text}:null}function Qt(e,t,n,r,i){let a=ae({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 $t(e){let t=e.nodes;if(!Array.isArray(t))return;let n=t[0];if(!(!n||typeof n!=`object`))return n}function en(e){let t=e.positionals?.[1]??``;if(t.startsWith(`@`)){let n=k(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=ue(e.positionals?.slice(1)??[]);return n.ok?{ok:!0,target:{kind:`selector`,selector:`selector`in n?n.selector:``}}:{ok:!1,response:x(n.code,n.message)}}function tn(e,n,r){if(e.kind===`sleep`)return{kind:`sleep`,durationMs:e.durationMs};if(e.kind===`selector`)return{kind:`selector`,selector:e.selectorExpression,timeoutMs:e.timeoutMs,...r?{recordedLandmark:r}:{}};if(e.kind===`ref`){if(!n?.snapshot)throw new t(`INVALID_ARGS`,`Ref wait requires an existing snapshot in session.`);return{kind:`ref`,ref:e.rawRef,timeoutMs:e.timeoutMs}}if(e.kind===`stable`)return{kind:`stable`,quietMs:e.quietMs,timeoutMs:e.timeoutMs};let i=ie(e.text);if(!i.ok)throw new t(i.code,i.message);return{kind:`text`,text:i.text,timeoutMs:e.timeoutMs}}async function $(e){try{return{ok:!0,data:await e()}}catch(e){let t=o(e);return x(t.code,t.message,t.details)}}async function nn(e,t,n){if(t.ok)return t;let r=e.sessionStore.get(e.sessionName);if(!r)return t;let i;try{i=await M(r)}catch{return t}return i?x(t.error.code,`${n} failed because ${Xe(i)}.`,{...t.error.details??{},...i,blockedBy:`android_foreground_surface`,originalMessage:t.error.message}):t}export{Fe as C,E as D,Me as E,Re as S,je as T,Be as _,Xt as a,ze as b,mt as c,W as d,Ye as f,Ve as g,Ue as h,Ut as i,G as l,We as m,Vt as n,q as o,Ze as p,Ht as r,K as s,Bt as t,U as u,A as v,Pe as w,D as x,j 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{y as s}from"./screenshot-geometry.js";import{At as c,D as l,Mt as u,P as d,_t as f,bt as p,en as m,gt as ee,ht as te,vt as ne}from"./sdk-batch-runner.js";import{c as re,h as ie,o as ae,s as h}from"./sdk-device.js";import{G as oe,I as se,a as g,q as ce,tt as le}from"./viewport-dimension.js";import{N as ue}from"./screenshot-result.js";import{i as de}from"./session-target-evidence.js";import{i as fe}from"./text-surface.js";import{S as _}from"./device.js";import{a as pe,n as me,t as he}from"./runtime.js";import{j as v}from"./sdk-android-adb.js";import{r as ge}from"./app-lifecycle.js";import{h as y}from"./ime-lifecycle.js";import{N as _e}from"./runner-disposal.js";import{S as b,c as ve,g as x,l as S,n as ye,s as C,t as be}from"./context.js";import{C as xe}from"./physical-device-control.js";import{a as Se,l as Ce}from"./runner-client.js";import{Bt as we,Ht as Te,Rt as Ee,Vt as De,Xt as Oe,en as ke,h as Ae,rn as je,u as Me}from"./internal/daemon.js";import{a as Ne}from"./apps.js";const Pe=[[`snapshotDepth`,`--depth`],[`snapshotScope`,`--scope`],[`snapshotRaw`,`--raw`]];function Fe(e,t){let n=Ie(t);return n.length===0?null:C(`INVALID_ARGS`,`${e} @ref does not support ${n.join(`, `)}.`)}function Ie(e){if(!e)return[];let t=[];for(let[n,r]of Pe)e[n]!==void 0&&t.push(r);return t}function Le(e,t){if(!t||t.settle===!0)return null;let n=[];return t.settleQuietMs!==void 0&&n.push(`--settle-quiet`),n.length===0?null:C(`INVALID_ARGS`,`${e}: ${n.join(`, `)} require${n.length===1?`s`:``} --settle.`)}function Re(e){if(e?.settle===!0)return{...e.settleQuietMs===void 0?{}:{quietMs:e.settleQuietMs},...e.timeoutMs===void 0?{}:{timeoutMs:e.timeoutMs}}}function ze(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 Be(e,t={}){return{artifacts:ze(e,t),policy:me()}}function w(e){if(e.length<2)return null;let t=Number(e[0]),n=Number(e[1]);return!Number.isFinite(t)||!Number.isFinite(n)?null:{x:t,y:n}}function T(e){let t=n(e);return t?{ok:!0,ref:t.base,generation:t.generation}:{ok:!1,response:C(`INVALID_ARGS`,`Invalid ref "${e}" — malformed generation suffix.`,{hint:a})}}function E(e,t){let n=w(e);if(n)return{ok:!0,target:{kind:`point`,x:n.x,y:n.y}};let r=e[0]??``;if(r.startsWith(`@`)){let t=T(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:C(`INVALID_ARGS`,`${t} requires @ref, selector expression, or x y coordinates`)}}function Ve(e){let t=w(e);if(t)return{ok:!0,target:{kind:`point`,x:t.x,y:t.y},...Je(e[2])};let n=qe(e),r=E(n.targetPositionals,`longpress`);return r.ok?{ok:!0,target:r.target,refGeneration:r.refGeneration,...n.duration}:r}function He(e){let t=e[0]??``;if(t.startsWith(`@`)){let n=T(t);if(!n.ok)return{ok:!1,response:n.response};let r=g(e).text;return r?{ok:!0,target:{kind:`ref`,ref:n.ref,fallbackLabel:Ke(e)},refGeneration:n.generation,text:r}:{ok:!1,response:C(`INVALID_ARGS`,`fill requires text after ref`)}}let n=w(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:C(`INVALID_ARGS`,`fill requires text after coordinates`)}}let r=Ue(e);return!r||r.kind!==`selector`?{ok:!1,response:C(`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:C(`INVALID_ARGS`,`fill requires text after selector`)}}function Ue(e){try{return g(e)}catch{return null}}function We(e){let t=`evidence`in e?e.evidence:void 0,n=e.settle;return e.kind===`ref`?{ref:D(e.target?.kind===`ref`?e.target.ref:void 0),refLabel:e.refLabel,selectorChain:e.selectorChain,targetHittable:e.targetHittable,hint:e.hint,evidence:t,settle:n,resolution:e.resolution}:e.kind===`selector`?{selector:e.target?.kind===`selector`?e.target.selector:void 0,selectorChain:e.selectorChain,refLabel:e.refLabel,targetHittable:e.targetHittable,hint:e.hint,evidence:t,settle:n,resolution:e.resolution}:{evidence:t,settle:n}}function Ge(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 D(e){return e?.startsWith(`@`)?e.slice(1):e}function Ke(e){return e.length>=3&&e[1]?.trim()||``}function qe(e){let t=e.at(-1);return e.length>1&&Ye(t)?{targetPositionals:e.slice(0,-1),duration:{durationMs:Number(t)}}:{targetPositionals:e,duration:{}}}function Je(e){return e===void 0?{}:{durationMs:Number(e)}}function Ye(e){return e===void 0||e.trim()===``?!1:Number.isFinite(Number(e))}function O(e,t){return!(!e||!h(e.device)||b(e.device)||t.skipPendingPostGestureStabilization&&ke(e))}function k(e){let{session:t,selectorExpression:n}=e;return O(t,{skipPendingPostGestureStabilization:!0})?d(n):null}function Xe(e){let t=e.identifier?.trim();if(t)return{key:`id`,value:t};let n=e.label?.trim();return n?{key:`label`,value:n}:null}function A(e,t={}){let n=o(e);if(n.code===`ELEMENT_NOT_FOUND`)return t.delegateSemanticFailures===!0||t.allowElementNotFound===!0;if(n.code===`AMBIGUOUS_MATCH`)return t.delegateSemanticFailures===!0;if(n.code===`ELEMENT_OFFSCREEN`)return t.delegateSemanticFailures!==!1;if(n.code!==`COMMAND_FAILED`)return!1;let r=n.message.toLowerCase();return r.includes(`fetch failed`)||r.includes(`timed out`)||r.includes(`timeout`)||r.includes(`runner did not accept connection`)||r.includes(`invalid runner response`)}async function j(e,t,n){let r=e.get(t),i=r?.device??await x(n??{});return r||await Ae(i),{session:r,device:i}}async function M(e,t,n){let r=!e&&h(t);try{return await n()}finally{r&&(await Ce(t.id),await Ze(t))}}async function Ze(e){let t=xe();await Ne(e,t).catch(n=>{v({level:`debug`,phase:`ios_sessionless_runner_host_close_failed`,data:{deviceId:e.id,bundleId:t,error:n instanceof Error?n.message:String(n)}})})}function Qe(e,t,n,r){t&&e.recordAction(t,{command:n.command,positionals:n.positionals??[],flags:n.flags??{},result:r})}function $e(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:[]}}async function et(e,n){let r=await N(e);if(r){if(y(r.foregroundPackage))return`press ${n} opened an Android permission dialog (${r.foregroundPackage}) over ${r.expectedPackage}. ${r.hint}`;throw new t(`COMMAND_FAILED`,`press ${n} left ${e.appBundleId} and foregrounded ${r.foregroundPackage}. The tap likely escaped the app.`,r)}}async function N(e){if(e.device.platform!==`android`||!e.appBundleId)return null;let t=await ge(e.device),n=t.package?.trim();return!n||n===e.appBundleId||!it(n)?null:{expectedPackage:e.appBundleId,foregroundPackage:n,activity:t.activity,hint:rt(n)}}function tt(e){return y(e.foregroundPackage)?`Android permission dialog is blocking ${e.expectedPackage}`:`${e.foregroundPackage} is foreground instead of ${e.expectedPackage}`}function nt(e){return e.code===`COMMAND_FAILED`&&typeof e.details?.expectedPackage==`string`&&typeof e.details?.foregroundPackage==`string`}function rt(e){return y(e)?`Use "alert get" to inspect it, then "alert accept" or "alert dismiss" to respond.`:`Use screenshot as visual truth, then take a fresh snapshot -i before retrying.`}function it(e){return e===`com.android.settings`||e===`com.android.systemui`||y(e)||e.includes(`launcher`)}function at(e,t){if(t===`exists`)return{found:!0};if(t===`wait`)return{found:!0,waitedMs:e.waitedMs};if(t===`list`)return{action:`list`,matches:Array.isArray(e.matches)?e.matches.length:0};let n=typeof e.ref==`string`?e.ref:void 0;return t===`get_attrs`?{ref:n,action:`get attrs`}:{ref:n,action:`get text`,text:typeof e.text==`string`?e.text:``}}function ot(e){return e.kind===`found`?{found:!0,...typeof e.waitedMs==`number`?{waitedMs:e.waitedMs}:{}}:e.kind===`list`?{matches:e.matches.map(e=>({ref:e.ref,node:_(e.node)}))}:{ref:e.ref,...e.kind===`text`?{text:e.text}:{},node:_(e.node)}}function P(e,t){let n=Array.isArray(e.selectorChain)?e.selectorChain:void 0,r=lt(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:ct(s)}}function F(e){let{target:t}=e;return{...t.kind===`ref`?{ref:z(t.ref)}:{},...t.kind===`selector`?{selector:t.selector}:{},...typeof e.text==`string`?{text:e.text}:{},node:_(e.node)}}function I(e){let{node:t,preActionNodes:n,...r}=e;return r}function st(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 L(e){let{selectorChain:t,...n}=e;return n}function R(e,t,n,r,i,a){let o=e.get(t);if(!o)return;let s=o.recordSession&&i?de(i,{mode:a}):void 0;e.recordAction(o,{command:n.command,positionals:n.positionals??[],flags:n.flags??{},result:r,interactiveObservation:ue(n),...s?{targetEvidence:s}:{}})}function ct(e){let t=e.trim();if(!(!t||t.length>80||/[\r\n]/.test(t)))return t}function lt(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 ut=[`application`,`window`,`tabbar`,`scrollbar`,`image`],dt=new Set([`tab bar`]);async function B(e,t){if(t.ok||!ft(t.error.details?.reason)||t.error.details?.captureStalled===!0||t.error.details?.captureTruncated===!0)return t;let n=await pt(e).catch(()=>null);return n?C(t.error.code,`${t.error.message}. Current surface: ${n.summary}.`,{...t.error.details??{},currentSurface:n.details}):t}function ft(e){return e===s.targetAbsent||e===s.stableTimeout}async function pt(e){let t=[...(await Oe({device:e.device,session:e.session,flags:{...e.req.flags,snapshotInteractiveOnly:!0},logPath:e.logPath??``})).snapshot.nodes].sort(mt),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(gt),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 mt(e,t){return H(e)-H(t)||ht(e,t)}function H(e){let t=!!U(e,{includeIdentifiers:!1});return(W(e)?2:0)+ +!t}function ht(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=m(`${e.type??``} ${e.role??``} ${e.subrole??``}`),n=`${e.label??``} ${e.value??``}`.trim().toLowerCase();return ut.some(e=>t.includes(e))||dt.has(n)||n.endsWith(`.fill`)}function gt(e){return m(`${e.type??``} ${e.role??``} ${e.subrole??``}`).includes(`button`)}function G(e,t){let n=pe(t);if(!n)return e;if(e.ok){let t=_t(e.data?.warning,n);return{...e,data:{...e.data,warning:t}}}let r=e.error.details??{};return{...e,error:{...e.error,details:{...r,hint:_t(r.hint,n)}}}}function _t(e,t){return typeof e==`string`&&e.trim()!==``?`${e}\n${t}`:t}async function vt(e){let{device:t,node:n,flags:r,appBundleId:i,traceOutPath:a,surface:o,contextFromFlags:s}=e,c=oe(n),l=le(n.rect);if(!l||h(t)&&c&&!fe(n.type??``))return c;try{let e=await ye(t,`read`,[String(l.x),String(l.y)],void 0,{...s(r,i,a),surface:o}),u=e&&typeof e==`object`?e:void 0,d=typeof u?.text==`string`?u.text:``;return d.trim()?d:(v({level:`warn`,phase:`interaction_read_fallback`,data:{reason:`empty_backend_text`,nodeRef:n.ref,surface:o,platform:t.platform}}),c)}catch(e){return v({level:`warn`,phase:`interaction_read_fallback`,data:{reason:`backend_read_failed`,nodeRef:n.ref,surface:o,platform:t.platform,error:e instanceof Error?e.message:String(e)}}),c}}function K(e){let{session:t,sessionStore:n,sessionName:r}=e,i=0,a,o,s=t=>(e.consumedSnapshot&&(e.consumedSnapshot.state=t.snapshot),t);return{capture:async c=>{let l=Date.now(),u=Ot(c,e.req.flags?.out),d=St({timestamp:l,lastSnapshotAt:i,lastSnapshotResult:a,lastSnapshotCacheKey:o,session:t,request:c,cacheKey:u});if(d)return s(d);let f=Ct({session:t,timestamp:l,request:c});if(f)return i=f.createdAt,a={snapshot:f},o=u,s(a);let p=await yt({params:e,request:c});c.signal?.throwIfAborted();let m={snapshot:p};return At({session:t,sessionStore:n,sessionName:r,snapshot:p}),i=l,a=m,o=u,s(m)}}}async function yt(e){let{params:t,request:n}=e,r=await q(t,n,n.snapshotScope);return n.recovery?.legacyIosSparse&&jt(r)?await bt({runtimeParams:t,request:n,policy:n.recovery.legacyIosSparse}):n.recovery?.sparseVerdictQueryScope?.shouldScope&&se(r.snapshotQuality)?await xt({runtimeParams:t,request:n,policy:n.recovery.sparseVerdictQueryScope,snapshot:r}):r}async function bt(e){let{runtimeParams:t,request:n,policy:r}=e;try{return await q(t,n,void 0,!1)}catch(e){if(!r.shouldScope)throw e;return await q(t,n,r.query,!1)}}async function xt(e){let{runtimeParams:t,request:n,policy:r,snapshot:i}=e;try{return await q(t,n,r.query,!1)}catch{return i}}async function q(e,t,n,r=t.flags?.snapshotInteractiveOnly){return(await Oe({device:e.device,session:e.session,flags:{...t.flags,snapshotInteractiveOnly:r},outPath:t.outPath??e.req.flags?.out,logPath:e.logPath??``,snapshotScope:n,includeRects:t.includeRects,signal:t.signal})).snapshot}function 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)&&!je(a)&&!Et(a,o))return r}function Ct(e){let{session:t,timestamp:n,request:r}=e,i=t?.snapshot;if(i&&wt(t,r)&&Tt(i,n)&&i.presentationKey===Dt(r))return i}function wt(e,t){return!(t.cache?.forceFresh===!0||t.cache?.useSessionSnapshot!==!0||je(e)||Et(e,t))}function Tt(e,t){return t-e.createdAt<750}function Et(e,t){return t.cache?.bypassForPostGestureStabilization===!0&&ke(e)}function Dt(e){return r(i(kt(e)))}function Ot(e,t){return JSON.stringify({presentationKey:Dt(e),includeRects:e.includeRects===!0,outPath:e.outPath??t??null})}function kt(e){return e.snapshotScope===void 0?e.flags:{...e.flags,snapshotScope:e.snapshotScope}}function At(e){let{session:t,sessionStore:n,sessionName:r,snapshot:i}=e;!t||se(i.snapshotQuality)||(Te(t,i),n.set(r,t))}function jt(e){return e.snapshotQuality||e.backend!==`xctest`||e.nodes.length!==1?!1:e.nodes[0]?.type===`Application`}function Mt(e){return he({backend:Nt(e),...Be(`selector commands`,{plural:!0}),sessions:Ee({sessionName:e.sessionName,getSession:()=>e.session,recordOptions:{includeSnapshot:!0},setRecord:t=>{!e.session||!t.snapshot||(Te(e.session,t.snapshot),e.sessionStore.set(e.sessionName,e.session))}}),signal:e.signal??_e(e.req.meta?.requestId)})}async function J(e,t){e.consumedSnapshot??={};let n=e.sessionStore.get(e.sessionName);if(!n&&t.requireSession)return{ok:!1,response:ve()};let r=n?.device??await x(e.req.flags??{});n||await Ae(r);let i=S(t.capability,r);return i?{ok:!1,response:i}:{ok:!0,runtime:Mt({...e,session:n,device:r})}}function Nt(e){let{req:t,session:n,device:r,logPath:i,sessionName:a,sessionStore:o}=e,s=K({device:r,session:n,sessionStore:o,sessionName:a,req:t,consumedSnapshot:e.consumedSnapshot,logPath:i});return{platform:ie(r),captureSnapshot:async(e,n)=>{let i={...t.flags,...Pt(n)},a=n?.includeRects===!0,o=n?.scope??t.flags?.snapshotScope,c=t.command===`wait`||t.command===`find`||a&&r.platform===`web`;return await s.capture({flags:i,signal:e.signal,snapshotScope:o,includeRects:a,cache:{forceFresh:c,useSessionSnapshot:!0,bypassForPostGestureStabilization:!0}})},readText:async(a,o)=>({text:await vt({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 Ft(e,n,t.signal)})}}function Pt(e){let{interactiveOnly:t,scope:n,depth:r,raw:i,includeHiddenContentHints:a}=e??{},o={};return t!==void 0&&(o.snapshotInteractiveOnly=t),n!==void 0&&(o.snapshotScope=n),r!==void 0&&(o.snapshotDepth=r),i!==void 0&&(o.snapshotRaw=i),a!==void 0&&(o.snapshotIncludeHiddenContentHints=a),o}async function Ft(e,t,n){let r=await It(e,t,n);return r===null?await Lt(e,t,n)===!0?!0:await Bt(e,t,n):r}async function It(e,t,n){return!re(e.device)||!e.session?.surface||e.session.surface===`app`?null:await Bt(e,t,n)}async function Lt(e,t,n){let r=Rt(e);return r?(await Se(r.device,{command:`findText`,text:t,appBundleId:r.appBundleId},{...zt(e,r),signal:n}))?.found===!0:null}function Rt(e){return!ae(e.device.platform)||b(e.device)||!e.session?.appBundleId?null:{device:e.device,appBundleId:e.session.appBundleId,traceLogPath:e.session.trace?.outPath}}function zt(e,t){return Me({req:e.req,logPath:e.logPath,traceLogPath:t.traceLogPath})}async function Bt(e,t,n){return!!ce((await Vt(e,n)).nodes,t)}async function Vt(e,t){let{snapshot:n}=await K({device:e.device,session:e.session,sessionStore:e.sessionStore,sessionName:e.sessionName,req:e.req,logPath:e.logPath,consumedSnapshot:e.consumedSnapshot}).capture({flags:{...e.req.flags,snapshotInteractiveOnly:!1,snapshotIncludeHiddenContentHints:!1},signal:t,cache:{forceFresh:!0,bypassForPostGestureStabilization:!0}});return n}async function Ht(e){let{req:t}=e;if(t.command!==`find`)return null;let n=c(t.positionals??[],t.flags);if(!n.ok)return C(n.code,n.message);let r=n.parsed,i=r.action;if(!u(i))return null;let a=await J(e,{requireSession:!1,capability:`find`});return a.ok?G(await $(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});R(e.sessionStore,e.sessionName,t,at(n,i));let o=ot(n),s=typeof o.ref==`string`?[o.ref]:Array.isArray(o.matches)?o.matches.map(e=>e.ref).filter(e=>typeof e==`string`):[];if(s.length>0){let t=e.sessionStore.get(e.sessionName);if(t&&(we(t,s),e.sessionStore.set(e.sessionName,t),t.snapshotGeneration!==void 0))return{...o,refsGeneration:t.snapshotGeneration}}return o}),Y(e)):a.response}function Y(e){return e.consumedSnapshot?.state??e.sessionStore.get(e.sessionName)?.snapshot}async function Ut(e){let{req:t}=e;if(t.command!==`get`)return null;let n=ee(t.positionals?.[0]);if(!n.ok)return C(n.code,n.message);let r=n.format,i=tn(t);if(!i.ok)return i.response;if(i.target.kind===`ref`){let e=Fe(`get`,t.flags);if(e)return e}let a=t.internal?.replayTargetGuard;if(i.target.kind===`selector`&&!a){let t=await Jt(e,r,i.target.selector);if(t)return t}let o=await J(e,{requireSession:!0,capability:`get`});if(!o.ok)return o.response;let s=i.target.kind===`ref`?De({session:e.sessionStore.get(e.sessionName),ref:i.target.ref,mintedGeneration:i.refGeneration}):void 0;return G(await $(async()=>{let n=await o.runtime.selectors.get({session:e.sessionName,requestId:t.meta?.requestId,property:r,target:i.target,expectedResolvedTarget:a});R(e.sessionStore,e.sessionName,t,P(n,r),{node:n.node,preActionNodes:n.preActionNodes});let c=F(n);return s?{...c,warning:s}:c}),Y(e))}async function Wt(e){let{req:t}=e;if(t.command!==`is`)return null;let n=f(t.positionals??[]);if(!n.ok)return C(n.code,n.message,n.hint?{hint:n.hint}:void 0);let{predicate:r,expectedText:i}=n,a={selectorExpression:n.selectorExpression},o=t.internal?.replayTargetGuard,s=e.sessionStore.get(e.sessionName)?.recordSession===!0;if(!o&&!s){let t=await Yt(e,r,a.selectorExpression,i);if(t)return t}let c=await J(e,{requireSession:!0,capability:`is`});return c.ok?G(await rn(e,await $(async()=>{let n=await c.runtime.selectors.is({session:e.sessionName,requestId:t.meta?.requestId,predicate:r,selector:a.selectorExpression,expectedText:i,expectedResolvedTarget:o}),s=Kt(n),l=I(n);return R(e.sessionStore,e.sessionName,t,l,s),L(l)}),`is ${r}`),Y(e)):c.response}async function Gt(e){let{req:t,sessionName:n,sessionStore:r}=e,i=l(t.positionals??[]);if(!i)return C(`INVALID_ARGS`,`wait requires a duration or text`);let{session:a,device:o}=await j(r,n,t.flags);if(i.kind!==`sleep`){let e=S(`wait`,o);if(e)return e}let s=t.internal?.replayLandmarkGuard;if(i.kind===`selector`&&!s&&!a?.recordSession){let t=await Xt({...e,session:a,device:o,selectorExpression:i.selectorExpression,timeoutMs:i.timeoutMs});if(t)return t}let c=i,u;if(i.kind===`ref`){let e=T(i.rawRef);if(!e.ok)return e.response;c={...i,rawRef:e.ref},u=De({session:a,ref:e.ref,mintedGeneration:e.generation})}e.consumedSnapshot??={};let d=async()=>{let i=Mt({...e,session:a,device:o}),l=await $(async()=>{let e=await i.selectors.wait({session:n,requestId:t.meta?.requestId,target:nn(c,a,s)}),o=Kt(e);R(r,n,t,I(e),o,`landmark`);let l=st(e);return u?{...l,warning:u}:l});return await rn(e,await B({req:t,logPath:e.logPath,session:a,device:o},l),`wait`)};return i.kind===`sleep`?await d():G(await M(a,o,d),Y(e))}function Kt(e){let t=e.node,n=e.preActionNodes;if(!(!t||typeof t!=`object`||!Array.isArray(n)))return{node:t,preActionNodes:n}}function qt(e,t,n){if(!e||e.recordSession)return null;let r=k({session:e,selectorExpression:n});return t===`text`&&r?.key!==`id`?null:r}async function Jt(e,t,n){let r=e.sessionStore.get(e.sessionName),i=qt(r,t,n);if(!r||!i)return null;let a=await Z(e,r,i);if(Q(a))return a.response;if(!a)return null;let o=Qt(t,i.raw,a);return o?(R(e.sessionStore,e.sessionName,e.req,P(o,t)),{ok:!0,data:F(o)}):null}async function Yt(e,t,n,r){if(t===`hidden`)return null;let i=await Zt(e,n);if(Q(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]}:$t(t,r,i.selector.raw,i.session,i.result.node);return a?(R(e.sessionStore,e.sessionName,e.req,a),{ok:!0,data:L(a)}):null}async function Xt(e){let t=k({session:e.session,selectorExpression:e.selectorExpression});if(!e.session||!t)return null;let n=Date.now(),r=await Z(e,e.session,t);if(Q(r))return r.response;if(!r?.found)return null;let i={kind:`selector`,selector:t.raw,waitedMs:Date.now()-n,selectorChain:[t.raw]};R(e.sessionStore,e.sessionName,e.req,i);let a={ok:!0,data:L(i)};return await B({req:e.req,logPath:e.logPath,session:e.session,device:e.device},a)}async function Zt(e,t){let n=e.sessionStore.get(e.sessionName),r=k({session:n,selectorExpression:t});if(!n||!r)return null;let i=await Z(e,n,r);return Q(i)?i:i?{session:n,selector:r,result:i}:null}async function X(e,t,n){let r=await Se(e.device,{command:`querySelector`,selectorKey:t.key,selectorValue:t.value,appBundleId:e.appBundleId},n),i=r.found===!0,a=en(r);return{found:i,...typeof r.text==`string`?{text:r.text}:{},...a?{node:a}:{}}}async function Z(t,n,r){try{return await X(n,r,Me({req:t.req,logPath:t.logPath,traceLogPath:n.trace?.outPath}))}catch(t){return A(t,{allowElementNotFound:!0})?null:{kind:`error`,response:{ok:!1,error:e(t)}}}}function Q(e){return e!==null&&`kind`in e&&e.kind===`error`}function Qt(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 $t(e,t,n,r,i){let a=p({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 en(e){let t=e.nodes;if(!Array.isArray(t))return;let n=t[0];if(!(!n||typeof n!=`object`))return n}function tn(e){let t=e.positionals?.[1]??``;if(t.startsWith(`@`)){let n=T(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=te(e.positionals?.slice(1)??[]);return n.ok?{ok:!0,target:{kind:`selector`,selector:`selector`in n?n.selector:``}}:{ok:!1,response:C(n.code,n.message)}}function nn(e,n,r){if(e.kind===`sleep`)return{kind:`sleep`,durationMs:e.durationMs};if(e.kind===`selector`)return{kind:`selector`,selector:e.selectorExpression,timeoutMs:e.timeoutMs,...r?{recordedLandmark:r}:{}};if(e.kind===`ref`){if(!n?.snapshot)throw new t(`INVALID_ARGS`,`Ref wait requires an existing snapshot in session.`);return{kind:`ref`,ref:e.rawRef,timeoutMs:e.timeoutMs}}if(e.kind===`stable`)return{kind:`stable`,quietMs:e.quietMs,timeoutMs:e.timeoutMs};let i=ne(e.text);if(!i.ok)throw new t(i.code,i.message);return{kind:`text`,text:i.text,timeoutMs:e.timeoutMs}}async function $(e){try{return{ok:!0,data:await e()}}catch(e){let t=o(e);return C(t.code,t.message,t.details)}}async function rn(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?C(t.error.code,`${n} failed because ${tt(i)}.`,{...t.error.details??{},...i,blockedBy:`android_foreground_surface`,originalMessage:t.error.message}):t}export{D as C,Le as D,Fe as E,E as S,Re as T,k as _,X as a,He as b,et as c,Qe as d,j as f,O as g,A as h,Gt as i,nt as l,Xe as m,Ut as n,K as o,M as p,Wt as r,G as s,Ht as t,$e as u,Ge as v,Be as w,Ve as x,We as y};
|