agent-device 0.18.2 → 0.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/android-multitouch-helper/dist/{agent-device-android-multitouch-helper-0.18.2.apk → agent-device-android-multitouch-helper-0.19.0.apk} +0 -0
- package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.19.0.apk.sha256 +1 -0
- package/android-multitouch-helper/dist/{agent-device-android-multitouch-helper-0.18.2.manifest.json → agent-device-android-multitouch-helper-0.19.0.manifest.json} +4 -4
- package/android-snapshot-helper/dist/{agent-device-android-snapshot-helper-0.18.2.apk → agent-device-android-snapshot-helper-0.19.0.apk} +0 -0
- package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.19.0.apk.sha256 +1 -0
- package/android-snapshot-helper/dist/{agent-device-android-snapshot-helper-0.18.2.manifest.json → agent-device-android-snapshot-helper-0.19.0.manifest.json} +6 -6
- package/dist/apple-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTapPointPolicy.swift +28 -0
- package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AXSnapshotFallback.swift +9 -120
- package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +132 -66
- package/dist/apple-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandJournal.swift +155 -0
- package/dist/apple-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+FlatSnapshotFiltering.swift +67 -0
- package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +20 -74
- package/dist/apple-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScrollGesture.swift +64 -0
- package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SequenceExecution.swift +0 -177
- package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Snapshot.swift +81 -48
- package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCapturePlan.swift +102 -129
- package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +208 -46
- package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Transport.swift +82 -11
- package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +72 -0
- package/dist/src/agent-browser-tool.js +1 -0
- package/dist/src/android-adb.d.ts +64 -234
- package/dist/src/android-adb.js +1 -1
- package/dist/src/android.js +1 -5
- package/dist/src/app-lifecycle.js +7 -0
- package/dist/src/apple-runner-options.js +1 -0
- package/dist/src/apps.js +5 -11
- package/dist/src/artifacts.d.ts +4 -3
- package/dist/src/artifacts.js +1 -1
- package/dist/src/audio-probe.js +1 -1
- package/dist/src/batch.d.ts +2 -177
- package/dist/src/batch.js +1 -1
- package/dist/src/cli-help.js +64 -38
- package/dist/src/cli-output.js +1 -1
- package/dist/src/cli-runner.js +2 -0
- package/dist/src/cli.js +12 -41
- package/dist/src/client-metro-companion.js +1 -0
- package/dist/src/client.js +3 -0
- package/dist/src/command-metadata.js +1 -0
- package/dist/src/command-schema.js +22 -0
- package/dist/src/command-surface.js +1 -1
- package/dist/src/contracts.d.ts +2 -213
- package/dist/src/contracts.js +1 -1
- package/dist/src/debug-symbols.js +5 -3
- package/dist/src/device-input-state.js +2 -0
- package/dist/src/device-rotation.js +14 -0
- package/dist/src/devices.js +1 -1
- package/dist/src/devices2.js +1 -0
- package/dist/src/devices3.js +1 -0
- package/dist/src/find.js +1 -1
- package/dist/src/finders.d.ts +2 -81
- package/dist/src/finders.js +1 -1
- package/dist/src/generic.js +1 -1
- package/dist/src/handler-utils.js +1 -1
- package/dist/src/helper.js +2 -0
- package/dist/src/host-process.js +2 -0
- package/dist/src/index.d.ts +1265 -1768
- package/dist/src/index.js +1 -1
- package/dist/src/input-actions.js +3 -1
- package/dist/src/input-actions2.js +1 -0
- package/dist/src/install-source.d.ts +13 -14
- package/dist/src/install-source.js +1 -1
- package/dist/src/install-source2.js +1 -0
- package/dist/src/interaction-snapshot.js +1 -0
- package/dist/src/interaction.js +1 -1
- package/dist/src/interactor.js +2 -1
- package/dist/src/internal/bin.d.ts +1 -1
- package/dist/src/internal/bin.js +2 -5
- package/dist/src/internal/companion-tunnel.d.ts +1 -1
- package/dist/src/internal/companion-tunnel.js +1 -1
- package/dist/src/internal/daemon.d.ts +1 -1
- package/dist/src/internal/daemon.js +16 -1
- package/dist/src/internal/png-worker.d.ts +29 -26
- package/dist/src/internal/png-worker.js +1 -1
- package/dist/src/internal/update-check-entry.d.ts +1 -1
- package/dist/src/internal/update-check-entry.js +1 -1
- package/dist/src/io.d.ts +2 -85
- package/dist/src/io.js +1 -1
- package/dist/src/lease.js +1 -1
- package/dist/src/linux.js +1 -1
- package/dist/src/logcat.js +6 -0
- package/dist/src/manifest.js +1 -0
- package/dist/src/metro.d.ts +70 -113
- package/dist/src/metro.js +1 -1
- package/dist/src/metro2.js +1 -0
- package/dist/src/notifications.js +1 -1
- package/dist/src/output-path.js +1 -0
- package/dist/src/path-resolution.js +1 -0
- package/dist/src/png-worker-contract.js +1 -0
- package/dist/src/points.js +4 -0
- package/dist/src/project-runtime.js +1 -0
- package/dist/src/provider.js +1 -1
- package/dist/src/providers.js +1 -0
- package/dist/src/react-native.js +1 -1
- package/dist/src/record-trace-recording.js +2 -5
- package/dist/src/record-trace.js +1 -1
- package/dist/src/recording-provider.js +1 -1
- package/dist/src/registry.js +37 -0
- package/dist/src/remote-config.d.ts +2 -83
- package/dist/src/reporting.js +9 -0
- package/dist/src/rolldown-runtime.js +1 -0
- package/dist/src/runner-client.js +1 -0
- package/dist/src/runner-provider.js +1 -0
- package/dist/src/runner-sequence.js +1 -1
- package/dist/src/runtime-transport.js +1 -0
- package/dist/src/runtime.js +3 -0
- package/dist/src/scoped-provider.js +1 -0
- package/dist/src/sdk-android-adb.d.ts +144 -0
- package/dist/src/sdk-android-adb.js +4 -0
- package/dist/src/sdk-app-inventory.d.ts +4 -0
- package/dist/src/sdk-app-inventory.js +1 -0
- package/dist/src/sdk-batch-runner.d.ts +40 -0
- package/dist/src/sdk-batch-runner.js +2 -0
- package/dist/src/sdk-batch.js +2 -0
- package/dist/src/sdk-contracts.d.ts +386 -0
- package/dist/src/sdk-contracts.js +2 -0
- package/dist/src/sdk-finders.d.ts +61 -0
- package/dist/src/sdk-finders.js +1 -0
- package/dist/src/sdk-io.d.ts +79 -0
- package/dist/src/sdk-io.js +1 -0
- package/dist/src/sdk-remote-config.d.ts +140 -0
- package/dist/src/sdk-remote-config.js +1 -0
- package/dist/src/sdk-selectors.js +1 -0
- package/dist/src/selector-runtime.js +1 -1
- package/dist/src/selectors.d.ts +39 -137
- package/dist/src/selectors.js +1 -1
- package/dist/src/selectors2.js +1 -0
- package/dist/src/server.js +3 -2
- package/dist/src/session.js +10 -11
- package/dist/src/setting-state.js +1 -0
- package/dist/src/simctl.js +1 -0
- package/dist/src/simulator.js +1 -2
- package/dist/src/snapshot-diagnostics.js +3 -0
- package/dist/src/snapshot-helper.js +5 -0
- package/dist/src/snapshot-quality.js +1 -0
- package/dist/src/snapshot.js +1 -2
- package/dist/src/snapshot2.js +2 -0
- package/dist/src/{5560.js → timeouts.js} +1 -1
- package/dist/src/tool-provider.js +3 -0
- package/dist/src/tool-provider2.js +1 -0
- package/dist/src/ttl-memo.js +1 -0
- package/dist/src/update-check.js +1 -0
- package/dist/src/url.js +1 -0
- package/dist/src/version.js +1 -0
- package/dist/src/web.js +1 -1
- package/dist/src/xml.js +2 -0
- package/package.json +12 -19
- package/server.json +2 -2
- package/skills/agent-device/SKILL.md +2 -0
- package/android-multitouch-helper/dist/agent-device-android-multitouch-helper-0.18.2.apk.sha256 +0 -1
- package/android-snapshot-helper/dist/agent-device-android-snapshot-helper-0.18.2.apk.sha256 +0 -1
- package/apple-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandJournal.swift +0 -443
- package/apple-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+FlatSnapshotFiltering.swift +0 -169
- package/apple-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScrollGesture.swift +0 -220
- package/dist/src/1404.js +0 -1
- package/dist/src/1986.js +0 -1
- package/dist/src/2748.js +0 -1
- package/dist/src/2948.js +0 -30
- package/dist/src/3006.js +0 -1
- package/dist/src/314.js +0 -1
- package/dist/src/3340.js +0 -8
- package/dist/src/4418.js +0 -1
- package/dist/src/4428.js +0 -3
- package/dist/src/485.js +0 -1
- package/dist/src/4917.js +0 -1
- package/dist/src/495.js +0 -5
- package/dist/src/5448.js +0 -3
- package/dist/src/5484.js +0 -1
- package/dist/src/5643.js +0 -1
- package/dist/src/587.js +0 -1
- package/dist/src/5913.js +0 -4
- package/dist/src/6849.js +0 -1
- package/dist/src/6918.js +0 -1
- package/dist/src/6967.js +0 -1
- package/dist/src/760.js +0 -1
- package/dist/src/7871.js +0 -1
- package/dist/src/8184.js +0 -1
- package/dist/src/8225.js +0 -1
- package/dist/src/8391.js +0 -1
- package/dist/src/8404.js +0 -2
- package/dist/src/8414.js +0 -2
- package/dist/src/8875.js +0 -4
- package/dist/src/893.js +0 -1
- package/dist/src/8936.js +0 -1
- package/dist/src/9414.js +0 -1
- package/dist/src/9581.js +0 -22
- package/dist/src/9612.js +0 -1
- package/dist/src/9624.js +0 -1
- package/dist/src/9722.js +0 -38
- package/dist/src/devices~1.js +0 -1
- package/dist/src/devices~2.js +0 -1
- package/dist/src/input-actions~1.js +0 -1
- package/dist/src/rslib-runtime.js +0 -1
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunner.xcodeproj/project.pbxproj +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunner.xcodeproj/xcshareddata/xcschemes/AgentDeviceRunner.xcscheme +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/AgentDeviceRunnerUITests-Bridging-Header.h +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/AgentDeviceRunnerUITests.entitlements +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.h +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.m +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerObjCExceptionCatcher.h +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerObjCExceptionCatcher.m +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.h +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.m +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Alert.swift +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Environment.swift +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Exceptions.swift +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Lifecycle.swift +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+ScreenRecorder.swift +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SystemModal.swift +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TvRemote.swift +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/AgentDeviceRunnerUITests.xctestplan +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/RecordingScripts/recording-overlay.swift +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/RecordingScripts/recording-resize.swift +0 -0
- /package/{apple-runner → dist/apple-runner}/AgentDeviceRunner/RecordingScripts/recording-trim.swift +0 -0
package/dist/src/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
import{F as e,O as t,R as n,z as r}from"./sdk-contracts.js";import{n as i}from"./client.js";import{t as a}from"./sdk-io.js";export{e as AppError,t as centerOfRect,i as createAgentDeviceClient,a as createLocalArtifactAdapter,n as isAgentDeviceError,r as normalizeAgentDeviceError};
|
|
@@ -1 +1,3 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{t as e}from"./rolldown-runtime.js";import{F as t}from"./sdk-contracts.js";import{j as n,u as r}from"./sdk-android-adb.js";import{t as i}from"./timeouts.js";import{tt as a}from"./device-rotation.js";import{s as o}from"./logcat.js";import{l as s,r as c}from"./device-input-state.js";import{p as l}from"./snapshot-helper.js";import{Ct as u}from"./internal/daemon.js";function ee(e,t){if(!t)return{expected:e,actual:null,failureReason:`text_mismatch`,targetInput:null,actualInput:null};let n=ne(t),r={failureReason:t.reason??`text_mismatch`,targetInput:p(t.targetInput),actualInput:p(t.actualInput)};return n?{...r,expectedLength:Array.from(e).length,actual:null,masked:!0,actualLength:Array.from(t.actual??``).length}:{...r,expected:e,actual:t.actual}}function d(e){return e?e.password?!0:f(e.text):!1}function f(e){return e?Array.from(e).every(te):!1}function p(e){if(!e)return null;let t=d(e);return{...e,text:t?null:e.text,...t?{textRedacted:!0}:{}}}function te(e){return e===`•`||e===`*`||e===`●`}function ne(e){return e.masked===!0||d(e.targetInput)||d(e.actualInput)}async function m(e,t,n,r){let a=[0,150,350],o=null,s=null,c=await D(e);for(let l of a){l>0&&await i(l);let a=await v(e,t,n,r,c);if(o=a,a.reason===`ime_capture`)return a;s=a.ok?a:null}return s??o??{ok:!1,actual:null,reason:`text_mismatch`,targetInput:null,actualInput:null}}async function re(e,t,n){return h(await u(e),t,n)}function ie(e,t,n,r,i={}){let a=y(e,t,n,i);return b(a)?{ok:!1,actual:a.actualInput?.text??null,reason:`ime_capture`,targetInput:a.targetInput,actualInput:a.actualInput}:x(a,r)??S(a,r)}function h(e,t,n){return y(e,t,n).actualInput?.text??null}function g(e){return e?.reason===`ime_capture`?`Android fill input was captured by the active keyboard instead of the app field`:e?.reason===`masked_unverified`?`Android fill verification could not confirm masked text value`:`Android fill verification failed`}function _(e,t){let n=ee(e,t);return t?.reason===`ime_capture`&&(n.hint=`The focused input belongs to the Android keyboard/IME, not the app field. Disable handwriting/stylus input or switch to a standard IME, then retry fill.`),n}async function v(e,t,n,r,i){return ie(await u(e),t,n,r,i)}function y(e,t,n,r={}){let i={focusedEdit:null,editAtPoint:null,anyAtPoint:null};for(let a of l(e)){let e=E(a,r);e&&O(i,e,t,n)}return oe(i)}function b(e){let{targetInput:t,actualInput:n}=e;return!t||!n||n===t?!1:n.inputMethodOwned&&!t.inputMethodOwned}function x(e,t){let n=e.actualInput;if(!n||!A(n))return null;let r=n.text??null,i=Array.from(r??``).length,a=Array.from(t).length,o=r!==null&&i>0&&a>0&&i===a;return{ok:o,actual:r,reason:o?void 0:`masked_unverified`,masked:!0,targetInput:e.targetInput,actualInput:n}}function S(e,t){let n=e.actualInput?.text??null;return{ok:C(n,t),actual:n,reason:`text_mismatch`,targetInput:e.targetInput,actualInput:e.actualInput}}function C(e,t){if(e===t)return!0;let n=w(e),r=w(t);return!n||!r?!1:!!(n===r||T(n,r))}function w(e){return(e??``).replace(/\s+/g,` `).trim()}function T(e,t){if(e.length!==t.length||e.length===0||e.slice(1)!==t.slice(1))return!1;let n=e[0],r=t[0];return!n||!r?!1:r.toLowerCase()===r&&n===r.toUpperCase()}function E(e,t){if(!e.rect)return null;let n=e.text??``,r=Math.max(1,e.rect.width*e.rect.height);return{text:n||null,className:e.className,resourceId:e.resourceId,packageName:e.packageName,rect:e.rect,focused:e.focused??!1,password:e.password===!0,inputMethodOwned:s({packageName:e.packageName,resourceId:e.resourceId,activeInputMethodPackage:t.activeInputMethodPackage}),area:r,editText:se(e.className??``)}}async function D(e){try{return{activeInputMethodPackage:(await c(e)).inputMethodPackage}}catch(e){return n({level:`warn`,phase:`android_fill_verification_input_method_probe_failed`,data:{error:e instanceof Error?e.message:String(e)}}),{}}}function O(e,t,n,r){let i=ae(t.rect,n,r);if(i&&t.editText&&(e.editAtPoint=k(e.editAtPoint,t)),t.focused&&t.editText){e.focusedEdit=k(e.focusedEdit,t);return}i&&t.text&&(e.anyAtPoint=k(e.anyAtPoint,t))}function ae(e,t,n){return t>=e.x&&t<=e.x+e.width&&n>=e.y&&n<=e.y+e.height}function k(e,t){return e&&e.area<t.area?e:t}function oe(e){let t=e.editAtPoint??e.anyAtPoint;return{targetInput:t,actualInput:(e.focusedEdit?.text?e.focusedEdit:null)??t}}function se(e){let t=e.toLowerCase();return t.includes(`edittext`)||t.includes(`textfield`)}function A(e){return d(e)}var j=e({appSwitcherAndroid:()=>R,backAndroid:()=>P,fillAndroid:()=>H,focusAndroid:()=>V,getAndroidScreenSize:()=>q,homeAndroid:()=>F,longPressAndroid:()=>z,pressAndroid:()=>M,pressAndroidEnter:()=>I,readAndroidTextAtPoint:()=>re,rotateAndroid:()=>L,scrollAndroid:()=>W,swipeAndroid:()=>N,typeAndroid:()=>B});async function M(e,t,n){await o(e,[`shell`,`input`,`tap`,String(t),String(n)])}async function N(e,t,n,r,i,a=250){await o(e,[`shell`,`input`,`swipe`,String(t),String(n),String(r),String(i),String(a)])}async function P(e){await o(e,[`shell`,`input`,`keyevent`,`4`])}async function F(e){await o(e,[`shell`,`input`,`keyevent`,`3`])}async function I(e){await o(e,[`shell`,`input`,`keyevent`,`ENTER`])}async function L(e,t){let n=G(t);await o(e,[`shell`,`settings`,`put`,`system`,`accelerometer_rotation`,`0`]),await o(e,[`shell`,`settings`,`put`,`system`,`user_rotation`,n])}async function R(e){await o(e,[`shell`,`input`,`keyevent`,`187`])}async function z(e,t,n,r=800){await o(e,[`shell`,`input`,`swipe`,String(t),String(n),String(t),String(n),String(r)])}async function B(e,t,n=0){let i=r(e);if(i){await i({action:`type`,text:t,delayMs:n}),$(`type`,`provider-native`,t);return}if(X(t),await K(e,`type`),n>0&&Array.from(t).length>1){await Y(e,{action:`type`,text:t,chunkSize:1,delayMs:n});return}await Y(e,{action:`type`,text:t,chunkSize:J,delayMs:0})}async function V(e,t,n){await M(e,t,n)}async function H(e,t,n,i,a=0){let o=r(e);if(o){await o({action:`fill`,target:{x:t,y:n},text:i,delayMs:a}),$(`fill`,`provider-native`,i);let r=await m(e,t,n,i);if(r.ok)return;U(i,r)}X(i);let s=Array.from(i).length,c=[{clearPadding:12,minClear:8,maxClear:48,chunkSize:a>0?1:J,inputDelayMs:a},{clearPadding:24,minClear:16,maxClear:96,chunkSize:a>0?1:4,inputDelayMs:a>0?a:15}],l=null;for(let r of c){await V(e,t,n),await K(e,`fill`),await fe(e,pe(s+r.clearPadding,r.minClear,r.maxClear)),await Y(e,{action:`fill`,text:i,chunkSize:r.chunkSize,delayMs:r.inputDelayMs});let a=await m(e,t,n,i);if(l=a,a.ok)return;a.reason===`ime_capture`&&U(i,a)}U(i,l)}function U(e,n){throw new t(`COMMAND_FAILED`,g(n),_(e,n))}async function W(e,t,n){let r=await q(e),i=a({direction:t,amount:n?.amount,pixels:n?.pixels,referenceWidth:r.width,referenceHeight:r.height}),s=n?.durationMs??300;return await o(e,[`shell`,`input`,`swipe`,String(i.x1),String(i.y1),String(i.x2),String(i.y2),String(s)]),{...i,...n?.durationMs===void 0?{}:{durationMs:n.durationMs}}}function G(e){switch(e){case`portrait`:return`0`;case`landscape-left`:return`1`;case`portrait-upside-down`:return`2`;case`landscape-right`:return`3`;default:throw new t(`INVALID_ARGS`,`Unsupported Android rotation: ${e}`)}}async function K(e,r){let i;try{i=await c(e)}catch(e){n({level:`warn`,phase:`android_input_ownership_probe_failed`,data:{action:r,error:e instanceof Error?e.message:String(e)}});return}if(i.inputOwner===`ime`)throw new t(`COMMAND_FAILED`,`KEYBOARD_OVERLAY_BLOCKING: Android text input is blocked because the focused input belongs to the active keyboard/IME.`,{failureReason:`ime_capture`,action:r,inputOwner:i.inputOwner,inputType:i.inputType,type:i.type,inputMethodPackage:i.inputMethodPackage,focusedPackage:i.focusedPackage,focusedResourceId:i.focusedResourceId,nextAction:`Focused input appears to be owned by the keyboard/IME; dismiss or change the IME before retrying text entry.`})}async function q(e){let n=(await o(e,[`shell`,`wm`,`size`])).stdout.match(/Physical size:\s*(\d+)x(\d+)/);if(!n)throw new t(`COMMAND_FAILED`,`Unable to read screen size`);return{width:Number(n[1]),height:Number(n[2])}}const J=8;async function Y(e,t){let n=t.text.split(`
|
|
2
|
+
`);for(let[r,a]of n.entries()){let s=de(a,t.chunkSize);for(let[a,o]of s.entries())await ce(e,o),t.delayMs>0&&(a+1<s.length||r+1<n.length)&&await i(t.delayMs);r+1<n.length&&await o(e,[`shell`,`input`,`keyevent`,`ENTER`])}$(t.action,`adb-shell`,t.text)}async function ce(e,t){if(t)try{await o(e,[`shell`,`input`,`text`,Z(t)])}catch(e){throw ue(e)?Q(t,e):e}}function X(e){if(!le(e))throw Q(e)}function le(e){for(let t of e){let e=t.codePointAt(0);if(e!==void 0&&t!==`
|
|
3
|
+
`&&(e<32||e>126))return!1}return!0}function Z(e){return e.replace(/ /g,`%s`)}function ue(e){if(!(e instanceof t)||e.code!==`COMMAND_FAILED`)return!1;let n=e.details?.stderr,r=(typeof n==`string`?n:``).toLowerCase();return!!(r.includes(`exception occurred while executing 'text'`)||r.includes(`nullpointerexception`)&&r.includes(`inputshellcommand.sendtext`))}function Q(e,n){return new t(`COMMAND_FAILED`,`Android text input requires provider-native text injection for non-ASCII/control characters; the current adb-shell fallback supports ASCII text only.`,{backend:`adb-shell`,textLength:Array.from(e).length,textPreview:e.slice(0,32)},n instanceof Error?n:void 0)}function de(e,t){let n=Math.max(1,Math.floor(t)),r=[],i=Array.from(e);for(let e=0;e<i.length;e+=n)r.push(i.slice(e,e+n).join(``));return r.length>0?r:[``]}function $(e,t,r){n({phase:`android_text_injection`,data:{action:e,backend:t,textLength:Array.from(r).length}})}async function fe(e,t){let n=Math.max(0,t);await o(e,[`shell`,`input`,`keyevent`,`KEYCODE_MOVE_END`],{allowFailure:!0});for(let t=0;t<n;t+=24){let r=Math.min(24,n-t);await o(e,[`shell`,`input`,`keyevent`,...Array(r).fill(`KEYCODE_DEL`)],{allowFailure:!0})}}function pe(e,t,n){return Math.max(t,Math.min(n,e))}export{q as a,z as c,W as d,N as f,V as i,M as l,P as n,F as o,B as p,H as r,j as s,R as t,L as u};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{F as e}from"./sdk-contracts.js";import{t}from"./timeouts.js";import{t as n}from"./tool-provider2.js";function r(){return process.env.WAYLAND_DISPLAY||process.env.XDG_SESSION_TYPE===`wayland`?`wayland`:`x11`}let i=null;async function a(){let t=n();if(i?.provider===t)return i;let a=r();if(a===`wayland`){if(await t.whichCommand(`ydotool`))return i={tool:`ydotool`,display:a,provider:t},i;throw new e(`TOOL_MISSING`,`ydotool is required for input synthesis on Wayland (xdotool does not work on Wayland). Install it via your package manager.`)}if(await t.whichCommand(`xdotool`))return i={tool:`xdotool`,display:a,provider:t},i;throw new e(`TOOL_MISSING`,`xdotool is required for input synthesis on X11. Install it via your package manager.`)}const o=1e4;async function s(...e){await n().runCommand(`xdotool`,e,{allowFailure:!1,timeoutMs:o})}async function c(...e){await n().runCommand(`ydotool`,e,{allowFailure:!1,timeoutMs:o})}function l(){return n().input}async function u(e,t){let{tool:n}=await a();n===`xdotool`?await s(`mousemove`,`--sync`,String(e),String(t)):await c(`mousemove`,`--absolute`,`-x`,String(e),`-y`,String(t))}async function d(e,t){let n=l();if(n){await n.key(e,t);return}let{tool:r}=await a();r===`xdotool`?await s(`key`,`--clearmodifiers`,e):await c(`key`,...t)}async function f(e,t,n,r){await u(e,t);let{tool:i}=await a();i===`xdotool`?await s(`click`,n):await c(`click`,r)}async function p(e,t,n,r,i){let a=l();if(a){await a.click(e,t,n);return}await f(e,t,r,i)}async function m(e,t){await p(e,t,`primary`,`1`,`0xC0`)}async function h(e,t){await p(e,t,`secondary`,`3`,`0xC1`)}async function g(e,t){await p(e,t,`middle`,`2`,`0xC2`)}async function _(e,t){let n=l();if(n){await n.doubleClick(e,t);return}let{tool:r}=await a();await u(e,t),r===`xdotool`?await s(`click`,`--repeat`,`2`,`1`):(await c(`click`,`0xC0`),await c(`click`,`0xC0`))}async function v(e,n,r=800){let i=l();if(i){await i.longPress(e,n,r);return}let{tool:o}=await a();await u(e,n),o===`xdotool`?(await s(`mousedown`,`1`),await t(r),await s(`mouseup`,`1`)):(await c(`click`,`--down`,`0xC0`),await t(r),await c(`click`,`--up`,`0xC0`))}async function y(e,t){await m(e,t)}async function b(e,n,r,i,o=300){let d=l();if(d){await d.drag(e,n,r,i,o);return}let{tool:f}=await a();await u(e,n),f===`xdotool`?(await s(`mousedown`,`1`),await s(`mousemove`,`--sync`,String(r),String(i)),await t(o),await s(`mouseup`,`1`)):(await c(`click`,`--down`,`0xC0`),await c(`mousemove`,`--absolute`,`-x`,String(r),`-y`,String(i)),await t(o),await c(`click`,`--up`,`0xC0`))}async function x(e,t){let n=l();if(n)return await n.scroll(e,t),C(t);let{tool:r}=await a(),i=5;if(t?.pixels==null?t?.amount!=null&&(i=Math.max(1,Math.round(5*(t.amount/.6)))):i=r===`xdotool`?Math.max(1,Math.round(t.pixels/15)):Math.max(1,Math.round(t.pixels/40)),r===`xdotool`){let n=e===`up`?`4`:e===`down`?`5`:e===`left`?`6`:`7`;await S(i,t?.durationMs,async e=>{await s(`click`,`--repeat`,String(e),n)})}else e===`up`||e===`down`?await S(i,t?.durationMs,async t=>{await c(`mousemove`,`--wheel`,`-y`,String(e===`up`?-t:t))}):await S(i,t?.durationMs,async t=>{await c(`mousemove`,`--wheel`,`-x`,String(e===`left`?-t:t))});return C(t)}async function S(e,n,r){if(n===void 0||n<=0||e<=1){await r(e);return}let i=n/Math.max(1,e-1);for(let n=0;n<e;n+=1)await r(1),n<e-1&&await t(i)}function C(e){return e?.durationMs===void 0?{}:{durationMs:e.durationMs}}async function w(e,t=0){let n=l();if(n){await n.typeText(e,{delayMs:t});return}let{tool:r}=await a();if(r===`xdotool`){let n=[`type`];t>0&&n.push(`--delay`,String(t)),n.push(`--clearmodifiers`,`--`,e),await s(...n)}else await c(`type`,`--`,e)}async function T(e,n,r,i=0){await m(e,n),await t(100),await d(`ctrl+a`,[`29:1`,`30:1`,`30:0`,`29:0`]),await t(50),await w(r,i)}export{_ as doubleClickLinux,T as fillLinux,y as focusLinux,v as longPressLinux,g as middleClickLinux,m as pressLinux,h as rightClickLinux,x as scrollLinux,d as sendKey,b as swipeLinux,w as typeLinux};
|
|
@@ -1,14 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
export { }
|
|
1
|
+
//#region src/platforms/install-source.d.ts
|
|
2
|
+
type MaterializeInstallSource = {
|
|
3
|
+
kind: 'url';
|
|
4
|
+
url: string;
|
|
5
|
+
headers?: Record<string, string>;
|
|
6
|
+
} | {
|
|
7
|
+
kind: 'path';
|
|
8
|
+
path: string;
|
|
9
|
+
};
|
|
10
|
+
declare function validateDownloadSourceUrl(parsedUrl: URL): Promise<void>;
|
|
11
|
+
declare function isTrustedInstallSourceUrl(sourceUrl: string | URL): boolean;
|
|
12
|
+
//#endregion
|
|
13
|
+
export { type MaterializeInstallSource, isTrustedInstallSourceUrl, validateDownloadSourceUrl };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
import{r as e,t}from"./install-source2.js";export{t as isTrustedInstallSourceUrl,e as validateDownloadSourceUrl};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{F as e}from"./sdk-contracts.js";import{v as t}from"./sdk-android-adb.js";import{t as n}from"./path-resolution.js";import{createWriteStream as r,promises as i}from"node:fs";import a from"node:os";import o from"node:path";import{pipeline as s}from"node:stream/promises";import{Readable as c}from"node:stream";import l from"node:net";import u from"node:dns/promises";const d=[`.zip`,`.tar`,`.tar.gz`,`.tgz`];Object.freeze([...d]);async function f(e){let t=[];try{let n=await m(e.source,{signal:e.signal,downloadTimeoutMs:e.downloadTimeoutMs});t.push(n.cleanup);let r=await T(n.localPath,{archivePath:void 0,isInstallablePath:e.isInstallablePath,installableLabel:e.installableLabel,allowArchiveExtraction:e.allowArchiveExtraction!==!1,registerCleanup:e=>{t.push(e)}});return{archivePath:r.archivePath,installablePath:r.installablePath,cleanup:async()=>{await A(t)}}}catch(e){throw await A(t),e}}function p(e){return n(e)}async function m(e,t){if(e.kind===`path`)return{localPath:p(e.path),cleanup:async()=>{}};let n=await i.mkdtemp(o.join(a.tmpdir(),`agent-device-source-`));try{return{localPath:await h(n,e.url,e.headers,t),cleanup:async()=>{await i.rm(n,{recursive:!0,force:!0})}}}catch(e){throw await i.rm(n,{recursive:!0,force:!0}),e}}async function h(t,n,i,a){let l;try{l=new URL(n)}catch{throw new e(`INVALID_ARGS`,`Invalid source URL: ${n}`)}await g(l);let u=a?.signal;if(u?.aborted)throw new e(`COMMAND_FAILED`,`request canceled`,{reason:`request_canceled`});let d=a?.downloadTimeoutMs??12e4,f=AbortSignal.timeout(d),p=u?AbortSignal.any([u,f]):f;try{let n=await fetch(l,{headers:i,redirect:`follow`,signal:p});if(!n.ok)throw new e(`COMMAND_FAILED`,`Failed to download app source: ${n.status} ${n.statusText}`,{status:n.status,statusText:n.statusText,url:l.toString()});let a=b(n,l),u=o.join(t,a),d=n.body;if(!d)throw new e(`COMMAND_FAILED`,`Download response body was empty`,{url:l.toString()});return await s(c.fromWeb(d),r(u)),u}catch(t){throw u?.aborted?new e(`COMMAND_FAILED`,`request canceled`,{reason:`request_canceled`},t):f.aborted?new e(`COMMAND_FAILED`,`App source download timed out after ${d}ms`,{timeoutMs:d,url:l.toString()},t):t}}async function g(t){if(t.protocol!==`http:`&&t.protocol!==`https:`)throw new e(`INVALID_ARGS`,`Unsupported source URL protocol: ${t.protocol}`);if(x(t.hostname.toLowerCase()))throw new e(`INVALID_ARGS`,`Source URL host is not allowed: ${t.hostname}`,{hint:`Use a public artifact URL.`});if((await u.lookup(t.hostname,{all:!0,verbatim:!0}).catch(()=>[])).some(e=>S(e.address)))throw new e(`INVALID_ARGS`,`Source URL host resolved to a private or loopback address: ${t.hostname}`,{hint:`Use a public artifact URL.`})}function _(e){let t=e instanceof URL?e:new URL(e),n=t.hostname.toLowerCase();if(!n)return!1;let r=t.pathname;return v(n,r)||y(n,r)}function v(e,t){return e===`api.github.com`?/^\/repos\/[^/]+\/[^/]+\/actions\/artifacts\/\d+\/zip$/i.test(t):e===`github.com`?/^\/[^/]+\/[^/]+\/(?:actions\/runs\/\d+\/artifacts\/\d+|suites\/\d+\/artifacts\/\d+)$/i.test(t):!1}function y(e,t){return e!==`expo.dev`&&!e.endsWith(`.expo.dev`)?!1:/^\/(?:artifacts\/eas\/|accounts\/[^/]+\/projects\/[^/]+\/builds\/)/i.test(t)}function b(e,t){let n=(e.headers.get(`content-disposition`)?.match(/filename\*?=(?:UTF-8'')?"?([^";]+)"?/i))?.[1]?.trim();return n?o.basename(n):o.basename(t.pathname)||`downloaded-artifact.bin`}function x(e){return!e||e===`localhost`||e.endsWith(`.localhost`)?!0:S(e)}function S(e){let t=l.isIP(e);return t===4?C(e):t===6?w(e):!1}function C(e){let t=e.split(`.`).map(e=>Number.parseInt(e,10));if(t.length!==4||t.some(e=>Number.isNaN(e)||e<0||e>255))return!1;let n=t[0],r=t[1];return n===void 0||r===void 0?!1:n===10||n===127||n===169&&r===254||n===172&&r>=16&&r<=31||n===192&&r===168}function w(e){let t=e.toLowerCase();return!!(t===`::1`||t.startsWith(`fc`)||t.startsWith(`fd`)||t.startsWith(`fe80:`))}async function T(t,n){let r=await i.stat(t).catch(()=>null);if(!r)throw new e(`INVALID_ARGS`,`App source not found: ${t}`);if(n.isInstallablePath(t,r))return{archivePath:n.archivePath,installablePath:t};if(r.isFile()&&k(t)){if(!n.allowArchiveExtraction)throw new e(`INVALID_ARGS`,`URL sources must point directly to a ${n.installableLabel}; archive extraction is not allowed`,{path:t});let r=await D(t);return n.registerCleanup(r.cleanup),await T(r.outputPath,{...n,archivePath:n.archivePath??t})}if(r.isDirectory()){let r=await E(t,n.isInstallablePath),i=r[0];if(i!==void 0&&r.length===1)return{archivePath:n.archivePath,installablePath:i};if(r.length>1)throw new e(`INVALID_ARGS`,`Found multiple ${n.installableLabel} candidates under ${t}`,{matches:r});let a=await E(t,(e,t)=>t.isFile()&&k(e)),o=a[0];if(o!==void 0&&a.length===1){if(!n.allowArchiveExtraction)throw new e(`INVALID_ARGS`,`URL sources must point directly to a ${n.installableLabel}; nested archives are not allowed`,{path:o});let t=await D(o);return n.registerCleanup(t.cleanup),await T(t.outputPath,{...n,archivePath:n.archivePath??o})}if(a.length>1)throw new e(`INVALID_ARGS`,`Found multiple nested archives under ${t}; expected one ${n.installableLabel} source`,{matches:a})}throw new e(`INVALID_ARGS`,`Expected ${n.installableLabel} source, but got ${t}`)}async function E(e,t){let n=[],r=[{path:e,depth:0}];for(;r.length>0;){let e=r.shift();if(!e)continue;let a=await i.readdir(e.path,{withFileTypes:!0});a.sort((e,t)=>e.name.localeCompare(t.name));for(let i of a){let a=o.join(e.path,i.name);if(t(a,i)){n.push(a);continue}i.isDirectory()&&e.depth<5&&r.push({path:a,depth:e.depth+1})}}return n}async function D(e){let n=await i.mkdtemp(o.join(a.tmpdir(),`agent-device-archive-`));try{return e.toLowerCase().endsWith(`.zip`)?await O(e,n):e.toLowerCase().endsWith(`.tar.gz`)||e.toLowerCase().endsWith(`.tgz`)?await t(`tar`,[`-xzf`,e,`-C`,n]):await t(`tar`,[`-xf`,e,`-C`,n]),{outputPath:n,cleanup:async()=>{await i.rm(n,{recursive:!0,force:!0})}}}catch(e){throw await i.rm(n,{recursive:!0,force:!0}),e}}async function O(e,n){await t(`unzip`,[`-q`,e,`-d`,n])}function k(e){let t=e.toLowerCase();return d.some(e=>t.endsWith(e))}async function A(e){for(let t of[...e].reverse())await t()}export{f as n,g as r,_ as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{j as e}from"./sdk-android-adb.js";import{t}from"./snapshot-quality.js";import{Bt as n,Ft as r,Nt as i,Pt as a,Vt as o,jt as s,kt as c,vt as l,yt as u}from"./internal/daemon.js";import{a as d}from"./input-actions.js";function f(e){let{session:t,sessionStore:s,command:c,positionals:u,retryPositionals:d,flags:f,result:p,responseData:m,actionStartedAt:h,actionFinishedAt:g,androidFreshnessBaseline:_}=e,v=r(f);return s.recordAction(t,{command:c,positionals:u,flags:v??{},result:p}),a({session:t,command:c,positionals:d??u,flags:f,preSnapshot:t.snapshot}),n(c)&&o(t,c,_??t.snapshot),i(t,c,d??u,f),l(t,c,u,p,v??{},h,g),{ok:!0,data:m}}async function p(e){let{session:t,flags:n,sessionStore:r,contextFromFlags:i,captureSnapshotForSession:a}=e;if(!t.recording)return;if(t.recording.touchReferenceFrame)return t.recording.touchReferenceFrame;if(t.device.platform===`android`){let e=await d(t.device),n={referenceWidth:e.width,referenceHeight:e.height};return t.recording&&(t.recording.touchReferenceFrame=n),n}let o=u(t.snapshot);if(o)return t.recording&&(t.recording.touchReferenceFrame=o),o;if(!t.recording)return;let s=u(await a(t,n,r,i,{interactiveOnly:!0}));return s&&t.recording&&(t.recording.touchReferenceFrame=s),s}async function m(t){try{return await p(t)}catch(n){e({level:`warn`,phase:`touch_reference_frame_resolve_failed`,data:{platform:t.session.device.platform,error:n instanceof Error?n.message:String(n)}});return}}function h(e){return u({nodes:e,createdAt:0})}async function g(e,n,r,i,a){let o={...n??{},snapshotInteractiveOnly:a.interactiveOnly},l=i(o,e.appBundleId,e.trace?.outPath),{snapshot:u}=await s({device:e.device,session:e,flags:o,outPath:o.out,logPath:l.logPath??``,includeRects:a.includeRects,androidFreshnessMode:a.androidFreshnessMode});return t(u.snapshotQuality)||(c(e,u),r.set(e.name,e)),u}export{f as i,h as n,m as r,g as t};
|
package/dist/src/interaction.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{__webpack_require__ as e}from"./rslib-runtime.js";import{isMacOs as t,publicPlatformString as r}from"./6849.js";import{createDaemonRuntimeSessionStore as a,setSessionSnapshot as n,dispatchCommand as s,requireCommandSupported as o,ensureAndroidBlockingSystemDialogReady as i,errorResponse as l,NO_ACTIVE_SESSION_MESSAGE as c,noActiveSessionError as f,recoverAndroidBlockingSystemDialog as u,getActiveAndroidSnapshotFreshness as d}from"./9722.js";import{buttonTag as p,resolveClickButton as g,readFillTargetFromPositionals as m,getClickButtonValidationError as k,successText as y}from"./2948.js";import{createAgentDevice as w}from"./7871.js";import{asAppError as _,normalizeError as S,AppError as h}from"./485.js";import{assertAndroidPressStayedInApp as b,isAndroidEscapeError as x,createDaemonRuntimePolicy as v,dispatchGetViaRuntime as F,dispatchIsViaRuntime as N,isDirectIosSelectorFallbackError as M,refSnapshotFlagGuardResponse as P,readSimpleIosSelectorTarget as R}from"./selector-runtime.js";import{resolveWebProvider as C}from"./provider.js";import{interaction_snapshot_captureSnapshotForSession as A,readSnapshotNodesReferenceFrame as q,resolveDirectTouchReferenceFrameSafely as I,buildTouchVisualizationResult as K,finalizeTouchInteraction as H}from"./8184.js";import{emitDiagnostic as E}from"./8875.js";import{PUBLIC_COMMANDS as D}from"./1986.js";var U={};function O(e,r){return t(e.device)&&("desktop"===e.surface||"menubar"===e.surface)&&("menubar"!==e.surface||"click"!==r&&"press"!==r)?l("UNSUPPORTED_OPERATION",`${r} is not supported on macOS ${e.surface} sessions yet. Open an app session to act, or use the ${e.surface} surface to inspect.`):null}function T(e){if(e.length<2)return null;let t=Number(e[0]),r=Number(e[1]);return Number.isFinite(t)&&Number.isFinite(r)?{x:t,y:r}:null}function L(e,t){let r=T(e);if(r)return{ok:!0,target:{kind:"point",x:r.x,y:r.y}};let a=e[0]??"";if(a.startsWith("@"))return{ok:!0,target:{kind:"ref",ref:a,fallbackLabel:e.slice(1).join(" ").trim()}};let n=e.join(" ").trim();return n?{ok:!0,target:{kind:"selector",selector:n}}:{ok:!1,response:l("INVALID_ARGS",`${t} requires @ref, selector expression, or x y coordinates`)}}function j(e){return"ref"===e.kind?{ref:B(e.target?.kind==="ref"?e.target.ref:void 0),refLabel:e.refLabel,selectorChain:e.selectorChain}:"selector"===e.kind?{selector:e.target?.kind==="selector"?e.target.selector:void 0,selectorChain:e.selectorChain,refLabel:e.refLabel}:{}}function B(e){return e?.startsWith("@")?e.slice(1):e}function G(e){let t=e.sessionStore.get(e.sessionName);if(!t)throw new h("SESSION_NOT_FOUND",c);return w({backend:function(e){let{req:t,session:a}=e,n=function(e){if("web"!==e.device.platform)return;let t=C();return t.clickRef||t.fillRef?t:void 0}(a);return{platform:r(a.device),captureSnapshot:async(r,n)=>({snapshot:await e.captureSnapshotForSession(a,t.flags,e.sessionStore,e.contextFromFlags,{interactiveOnly:n?.interactiveOnly===!0,includeRects:n?.includeRects===!0})}),tap:async(r,n)=>W(await s(a.device,"press",[String(n.x),String(n.y)],t.flags?.out,e.contextFromFlags(t.flags,a.appBundleId,a.trace?.outPath))),tapTarget:n?.clickRef?async(e,t)=>(await n.clickRef?.(t.ref),{ref:B(t.ref)}):void 0,fill:async(r,n,o)=>W(await s(a.device,"fill",[String(n.x),String(n.y),o],t.flags?.out,e.contextFromFlags(t.flags,a.appBundleId,a.trace?.outPath))),fillTarget:n?.fillRef?async(e,t,r,a)=>(await n.fillRef?.(t.ref,r,a),{ref:B(t.ref),text:r,delayMs:a?.delayMs??0}):void 0,longPress:async(r,n,o)=>W(await s(a.device,"longpress",[String(n.x),String(n.y),...o?.durationMs===void 0?[]:[String(o.durationMs)]],t.flags?.out,e.contextFromFlags(t.flags,a.appBundleId,a.trace?.outPath))),typeText:async(r,n)=>W(await s(a.device,"type",[n],t.flags?.out,e.contextFromFlags(t.flags,a.appBundleId,a.trace?.outPath)))}}({...e,session:t}),...v("interaction commands",{plural:!0}),sessions:a({sessionName:e.sessionName,getSession:()=>t,recordOptions:{includeSnapshot:!0},setRecord:r=>{r.snapshot&&(n(t,r.snapshot),e.sessionStore.set(e.sessionName,t))}})})}function W(e){return e&&"object"==typeof e?e:void 0}async function V(e){switch(e.req.command){case"press":return await $(e,"press");case"click":return await $(e,"click");case"longpress":return await $(e,"longpress");case"fill":return await Q(e);default:return null}}async function $(e,t){let a,{req:n,sessionName:s,sessionStore:i}=e,c=i.get(s);if(!c)return f();let u="click"===t?"click":t,d="longpress"===t?"longpress":"press",m=O(c,u);if(m)return m;let y=o(d,c.device);if(y)return y;let w=g(n.flags),_=p(w);if("longpress"!==t&&"primary"!==w){let e=k({commandLabel:u,platform:r(c.device),button:w,count:n.flags?.count,intervalMs:n.flags?.intervalMs,holdMs:n.flags?.holdMs,jitterPx:n.flags?.jitterPx,doubleTap:n.flags?.doubleTap});if(e)return l(e.code,e.message,e.details)}let S="longpress"===t?function(e){var t,r,a;let n,s=T(e);if(s){return{ok:!0,target:{kind:"point",x:s.x,y:s.y},...void 0===(t=e[2])?{}:{durationMs:Number(t)}}}let o=(n=(r=e).at(-1),r.length>1&&void 0!==(a=n)&&""!==a.trim()&&Number.isFinite(Number(a))?{targetPositionals:r.slice(0,-1),duration:{durationMs:Number(n)}}:{targetPositionals:r,duration:{}}),i=L(o.targetPositionals,"longpress");return i.ok?{ok:!0,target:i.target,...o.duration}:i}(n.positionals??[]):L(n.positionals??[],u);if(!S.ok)return S.response;if("ref"===S.target.kind){let r=e.refSnapshotFlagGuardResponse("longpress"===t?"longpress":"press",n.flags);if(r)return r;a=await er(e,c)}let h=function(e){var t;let{session:r,commandLabel:a,target:n,flags:s}=e;if("click"!==a||"selector"!==n.kind||(t=s,t?.count!==void 0||t?.intervalMs!==void 0||t?.holdMs!==void 0||t?.jitterPx!==void 0||t?.doubleTap!==void 0||t?.clickButton!==void 0&&"primary"!==t.clickButton))return null;let o=R({session:r,selectorExpression:n.selector});return o?{...o,...s?.maestro?.allowNonHittableCoordinateFallback?{allowNonHittableCoordinateFallback:!0}:{}}:null}({session:c,commandLabel:u,target:S.target,flags:n.flags});if(h){let t=await z(e,c,h);if(t)return t}let x="longpress"===t?S.durationMs:void 0;return await ee(e,{androidFreshnessBaseline:a,run:async e=>await X({runtime:e,command:t,target:S.target,sessionName:s,requestId:n.meta?.requestId,clickButton:w,flags:n.flags,durationMs:x}),afterRun:async e=>{if(!c.lease?.leaseProvider){var t;await b(c,(t=S.target,"point"===t.kind?"coordinate tap":"ref"===e.kind&&e.target?.kind==="ref"?e.target.ref:"selector"===e.kind&&e.target?.kind==="selector"?e.target.selector:"target"))}},buildPayloads:async r=>{var a;let n="durationMs"in(a=r)?a.durationMs:void 0,s=await Y({params:e,session:c,result:r,extra:"longpress"===t?{...void 0!==n?{durationMs:n}:{},gesture:"longpress"}:_});return{result:s,responseData:s}}})}async function X(e){let{runtime:t,command:r,target:a,sessionName:n,requestId:s,flags:o}=e;if("longpress"===r)return await t.interactions.longPress(a,{session:n,requestId:s,durationMs:e.durationMs});let i={session:n,requestId:s,button:e.clickButton,count:o?.count,intervalMs:o?.intervalMs,holdMs:o?.holdMs,jitterPx:o?.jitterPx,doubleTap:o?.doubleTap};return"click"===r?await t.interactions.click(a,i):await t.interactions.press(a,i)}async function Y(e){let{params:t,session:r,result:a,extra:n}=e,s="point"===a.kind?await I({session:r,flags:t.req.flags,sessionStore:t.sessionStore,contextFromFlags:t.contextFromFlags,captureSnapshotForSession:t.captureSnapshotForSession}):q(r.snapshot?.nodes??[]);return K({data:a.backendResult,fallbackX:a.point?.x,fallbackY:a.point?.y,referenceFrame:s,extra:{...j(a),...n}})}async function z(e,t,r){return await J({params:e,session:t,selector:r,command:"press",positionals:[],extra:{selector:r.raw},fallbackPhase:"ios_direct_selector_tap_fallback"})}async function J(e){let{params:t,session:r,selector:a,command:n,positionals:o,extra:i,fallbackPhase:l}=e,c=Date.now();try{var f,u;let e,l,d=await s(r.device,n,o,t.req.flags?.out,{...t.contextFromFlags(t.req.flags,r.appBundleId,r.trace?.outPath),directElementSelector:a,surface:r.surface})??{},p=Date.now(),g=(f=d,e="number"==typeof f.x?f.x:void 0,l="number"==typeof f.y?f.y:void 0,void 0!==e&&void 0!==l?{x:e,y:l}:{x:0,y:0}),m=K({data:d,fallbackX:g.x,fallbackY:g.y,referenceFrame:(u=d,"number"==typeof u.referenceWidth&&"number"==typeof u.referenceHeight?{referenceWidth:u.referenceWidth,referenceHeight:u.referenceHeight}:void 0),extra:{...i,...function(e,t){if(!e.allowNonHittableCoordinateFallback)return{};let r="tapped via non-hittable coordinate fallback"===t.message;return{maestroNonHittableCoordinateFallbackAllowed:!0,maestroNonHittableCoordinateFallbackUsed:r,...r?{maestroFallbackReason:"non-hittable-coordinate"}:{}}}(a,d)}});return H({session:r,sessionStore:t.sessionStore,command:t.req.command,positionals:t.req.positionals??[],retryPositionals:ea(g),flags:t.req.flags,result:m,responseData:m,actionStartedAt:c,actionFinishedAt:p})}catch(e){if(!M(e))return{ok:!1,error:S(e)};return E({level:"debug",phase:l,data:{selector:a.raw,error:e instanceof Error?e.message:String(e)}}),null}}async function Q(e){let{req:t,sessionName:r,sessionStore:a}=e,n=a.get(r);if(n){let e=O(n,"fill");if(e)return e;let t=o("fill",n.device);if(t)return t}if(!n)return f();let s=function(e){let t=e[0]??"";if(t.startsWith("@")){var r;let a=m(e).text;return a?{ok:!0,target:{kind:"ref",ref:t,fallbackLabel:(r=e).length>=3&&r[1]?.trim()||""},text:a}:{ok:!1,response:l("INVALID_ARGS","fill requires text after ref")}}let a=T(e);if(a){let t=e.slice(2).join(" ");return t?{ok:!0,target:{kind:"point",x:a.x,y:a.y},text:t}:{ok:!1,response:l("INVALID_ARGS","fill requires text after coordinates")}}let n=m(e);return"selector"!==n.kind?{ok:!1,response:l("INVALID_ARGS","fill requires x y text, @ref text, or selector text")}:n.text.trim()?{ok:!0,target:{kind:"selector",selector:n.target.selector},text:n.text}:{ok:!1,response:l("INVALID_ARGS","fill requires text after selector")}}(t.positionals??[]);if(!s.ok)return s.response;if("ref"===s.target.kind){let r=e.refSnapshotFlagGuardResponse("fill",t.flags);if(r)return r;await er(e,n)}let i=function(e){let{session:t,target:r,flags:a}=e;if("selector"!==r.kind)return null;let n=R({session:t,selectorExpression:r.selector});return n?{...n,...a?.maestro?.allowNonHittableCoordinateFallback?{allowNonHittableCoordinateFallback:!0}:{}}:null}({session:n,target:s.target,flags:t.flags});if(i){let t=await Z(e,n,i,s.text);if(t)return t}return await ee(e,{run:async e=>await e.interactions.fill(s.target,s.text,{session:r,requestId:t.meta?.requestId,delayMs:t.flags?.delayMs}),buildPayloads:e=>{let t="point"===e.kind?void 0:q(n.snapshot?.nodes??[]),r=K({data:e.backendResult,fallbackX:e.point?.x,fallbackY:e.point?.y,referenceFrame:t,extra:{...j(e),text:s.text}});e.warning&&(r.warning=e.warning);let a="ref"===e.kind?{...e.backendResult??{ref:B(e.target?.kind==="ref"?e.target.ref:void 0),...e.point?{x:e.point.x,y:e.point.y}:{}}}:r;return e.warning&&(a.warning=e.warning),{result:r,responseData:a}}})}async function Z(e,t,r,a){return await J({params:e,session:t,selector:r,command:"fill",positionals:[a],extra:{selector:r.raw,text:a},fallbackPhase:"ios_direct_selector_fill_fallback"})}async function ee(e,t){let r=e.sessionStore.get(e.sessionName);if(!r)return f();let a=G(e),n=Date.now();try{let{readiness:s,runtimeResult:o}=await et(r,e.req.command,async()=>{let e=await t.run(a);return await t.afterRun?.(e),e}),i=Date.now(),{result:l,responseData:c}=await t.buildPayloads(o);return"recovered"===s.status&&(l.warning=s.warning,c.warning=s.warning),H({session:r,sessionStore:e.sessionStore,command:e.req.command,positionals:e.req.positionals??[],retryPositionals:function(e,t){if(("ref"!==t.kind||t.node)&&("click"===e||"press"===e)&&t.point)return ea(t.point)}(e.req.command,o),flags:e.req.flags,result:l,responseData:c,actionStartedAt:n,actionFinishedAt:i,androidFreshnessBaseline:t.androidFreshnessBaseline})}catch(t){let e=_(t);if(x(e))throw e;return{ok:!1,error:S(t)}}}async function et(e,t,r){if(e.lease?.leaseProvider)return{readiness:{status:"clear"},runtimeResult:await r()};let a=await i({session:e,command:t,phase:"before-command"}),n=await r();return await i({session:e,command:t,phase:"after-command"}),{readiness:a,runtimeResult:n}}async function er(e,t){if(!d(t))return;let r=t.snapshot?.comparisonSafe===!0?t.snapshot:void 0;try{await e.captureSnapshotForSession(t,e.req.flags,e.sessionStore,e.contextFromFlags,{interactiveOnly:!0,androidFreshnessMode:"ref-refresh"})}catch(t){E({level:"warn",phase:"android_ref_snapshot_refresh_failed",data:{command:e.req.command,error:t instanceof Error?t.message:String(t)}})}return r}function ea(e){return[String(e.x),String(e.y)]}async function en(e){let t=await V({...e,captureSnapshotForSession:A,refSnapshotFlagGuardResponse:P});if(t)return t;switch(e.req.command){case D.type:return await es({...e,captureSnapshotForSession:A});case"get":return await F(e);case"is":return await N(e);default:return null}}async function es(e){let{sessionName:t,sessionStore:r}=e,a=r.get(t);if(!a)return f();let n=o(D.type,a.device);if(n)return n;let s=await eo(a);return s||await ei(e,a)}async function eo(e){return"android"===e.device.platform&&e.recording&&"failed"===(await u({session:e})).status?l("COMMAND_FAILED","Android system dialog blocked the recording session"):null}async function ei(e,t){let{req:r,sessionName:a,sessionStore:n}=e,s=(r.positionals??[]).join(" "),o=G(e),l=Date.now();try{let e=await i({session:t,command:r.command,phase:"before-command"}),c=await o.interactions.typeText(s,{session:a,requestId:r.meta?.requestId,delayMs:r.flags?.delayMs});await i({session:t,command:r.command,phase:"after-command"});let f=Date.now(),u={...c.backendResult??{},text:c.text,delayMs:c.delayMs,...y(c.message??`Typed ${Array.from(c.text).length} chars`)};return"recovered"===e.status&&(u.warning=e.warning),H({session:t,sessionStore:n,command:r.command,positionals:r.positionals??[],flags:r.flags,result:u,responseData:u,actionStartedAt:l,actionFinishedAt:f})}catch(e){return{ok:!1,error:S(e)}}}e.r(U),e.d(U,{handleInteractionCommands:()=>en});export{U as interaction_namespaceObject};
|
|
1
|
+
import{B as e,F as t,I as n,b as r,m as i}from"./sdk-contracts.js";import{j as a}from"./sdk-android-adb.js";import{d as o,u as s,w as c}from"./sdk-batch.js";import{_t as l,gn as u,gt as d,ht as ee}from"./device-rotation.js";import{t as f}from"./runtime.js";import{Et as p,Ht as m,Ot as h,Qt as g,St as _,Tt as v,Wt as y,Xt as b,Yt as x,Zt as S,kt as C,xt as w,zt as te}from"./internal/daemon.js";import{n as ne}from"./provider.js";import{_ as T,c as re,d as ie,f as ae,g as E,h as oe,l as se,m as D,n as O,o as k,p as A,r as ce,s as le,u as ue,v as de,y as j}from"./selector-runtime.js";import{i as M,n as N,r as fe,t as P}from"./interaction-snapshot.js";function F(e){let{source:t,referenceFrame:n,extra:r}=e;if(t.kind===`runner-payload`){let e={targetKind:t.targetKind,...r??{}};return{result:R({data:t.data,fallbackX:t.point.x,fallbackY:t.point.y,referenceFrame:n,extra:e}),responseData:R({data:B(t.data),fallbackX:t.point.x,fallbackY:t.point.y,referenceFrame:n,extra:e})}}let{result:i}=t,a=ae(i),o={targetKind:i.kind,...a,...I(i.settle,e.settleRefsGeneration),...r??{}},s=R({data:i.backendResult,fallbackX:i.point?.x,fallbackY:i.point?.y,referenceFrame:n,extra:o}),c=R({data:B(i.backendResult),fallbackX:i.point?.x,fallbackY:i.point?.y,referenceFrame:n,extra:o}),l=L(`warning`in i?i.warning:void 0,e.staleRefsWarning);return l&&(s.warning=l,c.warning=l),{result:s,responseData:c}}function I(e,t){return!e?.diff||t===void 0?{}:{settle:{...e,refsGeneration:t}}}function L(e,t){return t?e?`${e} ${t}`:t:e}function R(e){let{data:t,fallbackX:n,fallbackY:r,referenceFrame:i,extra:a}=e,o=pe(a,n,r)??(typeof t?.message==`string`?t.message:void 0);return z({...t??{},...n===void 0||r===void 0?{}:{x:n,y:r},...i??{},...a??{},...u(o)})}function z(e){return Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0))}function B(e){if(!e)return;let t=Object.fromEntries(Object.entries(e).filter(([e,t])=>V(e,t)));return Object.keys(t).length>0?t:void 0}function V(e,t){switch(e){case`gestureStartUptimeMs`:case`gestureEndUptimeMs`:case`sequenceResults`:return!1;case`count`:return t!==1;case`intervalMs`:case`holdMs`:case`jitterPx`:return t!==0;case`doubleTap`:return t!==!1;default:return!0}}function pe(e,t,n){let r=H(e,`text`);if(r!==void 0)return`Filled ${Array.from(r).length} chars`;let i=me(t,n),a=he(e);if(a)return _e(a,e??{},i);if(i)return ge(e,i)}function H(e,t){let n=e?.[t];return typeof n==`string`?n:void 0}function me(e,t){return e===void 0||t===void 0?``:` (${e}, ${t})`}function he(e){let t=H(e,`ref`);return t===void 0?H(e,`selector`):`@${t}`}function ge(e,t){return e?.gesture===`longpress`?`Long pressed${t}`:`Tapped${t}`}function _e(e,t,n){let r=typeof t.button==`string`?t.button:void 0;return t.gesture===`longpress`?`Long pressed ${e}${n}`:r&&r!==`primary`?`Clicked ${r} ${e}${n}`:`Tapped ${e}${n}`}function U(e,t){return!i(e.device)||e.surface!==`desktop`&&e.surface!==`menubar`||e.surface===`menubar`&&(t===`click`||t===`press`)?null:b(`UNSUPPORTED_OPERATION`,`${t} is not supported on macOS ${e.surface} sessions yet. Open an app session to act, or use the ${e.surface} surface to inspect.`)}function W(e){let n=e.sessionStore.get(e.sessionName);if(!n)throw new t(`SESSION_NOT_FOUND`,x);return f({backend:ve({...e,session:n}),...k(`interaction commands`,{plural:!0}),sessions:v({sessionName:e.sessionName,getSession:()=>n,recordOptions:{includeSnapshot:!0},setRecord:t=>{t.snapshot&&(C(n,t.snapshot),e.sessionStore.set(e.sessionName,n))}})})}function ve(e){let{req:t,session:n}=e,i=ye(n);return{platform:r(n.device),captureSnapshot:async(r,i)=>({snapshot:await e.captureSnapshotForSession(n,t.flags,e.sessionStore,e.contextFromFlags,{interactiveOnly:i?.interactiveOnly===!0,includeRects:i?.includeRects===!0})}),tap:async(r,i)=>G(await m(n.device,`press`,[String(i.x),String(i.y)],t.flags?.out,e.contextFromFlags(t.flags,n.appBundleId,n.trace?.outPath))),tapTarget:i?.clickRef?async(e,t)=>(await i.clickRef?.(t.ref),{ref:E(t.ref)}):void 0,fill:async(r,i,a)=>G(await m(n.device,`fill`,[String(i.x),String(i.y),a],t.flags?.out,e.contextFromFlags(t.flags,n.appBundleId,n.trace?.outPath))),fillTarget:i?.fillRef?async(e,t,n,r)=>(await i.fillRef?.(t.ref,n,r),{ref:E(t.ref),text:n,delayMs:r?.delayMs??0}):void 0,longPress:async(r,i,a)=>G(await m(n.device,`longpress`,[String(i.x),String(i.y),...a?.durationMs===void 0?[]:[String(a.durationMs)]],t.flags?.out,e.contextFromFlags(t.flags,n.appBundleId,n.trace?.outPath))),typeText:async(r,i)=>G(await m(n.device,`type`,[i],t.flags?.out,e.contextFromFlags(t.flags,n.appBundleId,n.trace?.outPath)))}}function ye(e){if(e.device.platform!==`web`)return;let t=ne();return t.clickRef||t.fillRef?t:void 0}function G(e){return e&&typeof e==`object`?e:void 0}async function be(e){switch(e.req.command){case`press`:return await K(e,`press`);case`click`:return await K(e,`click`);case`longpress`:return await K(e,`longpress`);case`fill`:return await ke(e);default:return null}}async function K(e,t){let{req:n,sessionName:i,sessionStore:a}=e,o=a.get(i);if(!o)return S();let s=t===`click`?`click`:t,c=t===`longpress`?`longpress`:`press`,u=U(o,s);if(u)return u;let f=g(c,o.device);if(f)return f;let p=j(t,n.flags);if(p)return p;let m=l(n.flags),_=ee(m);if(t!==`longpress`&&m!==`primary`){let e=d({commandLabel:s,platform:r(o.device),button:m,count:n.flags?.count,intervalMs:n.flags?.intervalMs,holdMs:n.flags?.holdMs,jitterPx:n.flags?.jitterPx,doubleTap:n.flags?.doubleTap});if(e)return b(e.code,e.message,e.details)}let v=t===`longpress`?D(n.positionals??[]):oe(n.positionals??[],s);if(!v.ok)return v.response;let y=v.target.kind===`ref`?h({session:o,ref:v.target.ref,mintedGeneration:v.refGeneration}):void 0,x;if(v.target.kind===`ref`){let r=e.refSnapshotFlagGuardResponse(t===`longpress`?`longpress`:`press`,n.flags);if(r)return r;x=await Q(e,o)}let C=Ce({session:o,commandLabel:s,target:v.target,flags:n.flags});if(C){let t=await Te(e,o,C);if(t)return t}let w=t===`longpress`?v.durationMs:void 0;return await Z(e,{androidFreshnessBaseline:x,run:async e=>await q({runtime:e,command:t,target:v.target,sessionName:i,requestId:n.meta?.requestId,clickButton:m,flags:n.flags,durationMs:w}),afterRun:async e=>{o.lease?.leaseProvider||await se(o,ie(v.target,e))},buildPayloads:async n=>{let r=Se(n);return await xe({params:e,session:o,result:n,staleRefsWarning:y,extra:t===`longpress`?{...r===void 0?{}:{durationMs:r},gesture:`longpress`}:_})}})}async function q(e){let{runtime:t,command:n,target:r,sessionName:i,requestId:a,flags:o}=e,s=T(o);if(n===`longpress`)return await t.interactions.longPress(r,{session:i,requestId:a,durationMs:e.durationMs,settle:s});let c={session:i,requestId:a,button:e.clickButton,count:o?.count,intervalMs:o?.intervalMs,holdMs:o?.holdMs,jitterPx:o?.jitterPx,doubleTap:o?.doubleTap,verify:o?.verify,settle:s};return n===`click`?await t.interactions.click(r,c):await t.interactions.press(r,c)}async function xe(e){let{params:t,session:n,result:r,extra:i}=e,a=r.kind===`point`?await fe({session:n,flags:t.req.flags,sessionStore:t.sessionStore,contextFromFlags:t.contextFromFlags,captureSnapshotForSession:t.captureSnapshotForSession}):N(n.snapshot?.nodes??[]);return F({source:{kind:`runtime`,result:r},referenceFrame:a,extra:i,staleRefsWarning:e.staleRefsWarning,settleRefsGeneration:J(n,r)})}function J(e,t){if(t.settle?.diff)return p(e),e.snapshotGeneration}function Se(e){return`durationMs`in e?e.durationMs:void 0}function Ce(e){let{session:t,commandLabel:n,target:r,flags:i}=e;return n!==`click`||r.kind!==`selector`||we(i)||o(n)&&i?.verify===!0||s(n)&&i?.settle===!0?null:Y(t,r.selector,i)}function Y(e,t,n){let r=re({session:e,selectorExpression:t});return r?{...r,...n?.maestro?.allowNonHittableCoordinateFallback?{allowNonHittableCoordinateFallback:!0}:{}}:null}function we(e){return e?.count!==void 0||e?.intervalMs!==void 0||e?.holdMs!==void 0||e?.jitterPx!==void 0||e?.doubleTap!==void 0||e?.clickButton!==void 0&&e.clickButton!==`primary`}async function Te(e,t,n){return await X({params:e,session:t,selector:n,command:`press`,positionals:[],extra:{selector:n.raw},fallbackPhase:`ios_direct_selector_tap_fallback`})}async function X(t){let{params:n,session:r,selector:i,command:o,positionals:s,extra:c,fallbackPhase:l}=t,u=Date.now();try{let e=await m(r.device,o,s,n.req.flags?.out,{...n.contextFromFlags(n.req.flags,r.appBundleId,r.trace?.outPath),directElementSelector:i,surface:r.surface})??{},t=Date.now(),a=De(e),{result:l,responseData:d}=F({source:{kind:`runner-payload`,targetKind:`selector`,data:e,point:a},referenceFrame:Oe(e),extra:{...c,...Ee(i,e)}});return M({session:r,sessionStore:n.sessionStore,command:n.req.command,positionals:n.req.positionals??[],retryPositionals:$(a),flags:n.req.flags,result:l,responseData:d,actionStartedAt:u,actionFinishedAt:t})}catch(t){return le(t,{delegateSemanticFailures:i.allowNonHittableCoordinateFallback!==!0})?(a({level:`debug`,phase:l,data:{selector:i.raw,error:t instanceof Error?t.message:String(t)}}),null):{ok:!1,error:e(t)}}}function Ee(e,t){if(!e.allowNonHittableCoordinateFallback)return{};let n=t.message===y;return{maestroNonHittableCoordinateFallbackAllowed:!0,maestroNonHittableCoordinateFallbackUsed:n,...n?{maestroFallbackReason:`non-hittable-coordinate`}:{}}}function De(e){let t=typeof e.x==`number`?e.x:void 0,n=typeof e.y==`number`?e.y:void 0;return t!==void 0&&n!==void 0?{x:t,y:n}:{x:0,y:0}}function Oe(e){return typeof e.referenceWidth==`number`&&typeof e.referenceHeight==`number`?{referenceWidth:e.referenceWidth,referenceHeight:e.referenceHeight}:void 0}async function ke(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n);if(i){let e=U(i,`fill`);if(e)return e;let t=g(`fill`,i.device);if(t)return t}if(!i)return S();let a=j(`fill`,t.flags);if(a)return a;let o=A(t.positionals??[]);if(!o.ok)return o.response;let s=await Ae(e,i,o.target,o.refGeneration);if(s.response)return s.response;let{staleRefsWarning:c}=s;return await je(e,i,o.target,o.text)||await Z(e,{run:async e=>await e.interactions.fill(o.target,o.text,{session:n,requestId:t.meta?.requestId,delayMs:t.flags?.delayMs,verify:t.flags?.verify,settle:T(t.flags)}),buildPayloads:e=>Me({session:i,result:e,text:o.text,staleRefsWarning:c})})}async function Ae(e,t,n,r){if(n.kind!==`ref`)return{};let i=h({session:t,ref:n.ref,mintedGeneration:r}),a=e.refSnapshotFlagGuardResponse(`fill`,e.req.flags);return a?{response:a,staleRefsWarning:i}:(await Q(e,t),{staleRefsWarning:i})}async function je(e,t,n,r){let i=Ne({session:t,target:n,flags:e.req.flags});return i?await Pe(e,t,i,r):null}function Me(e){let{session:t,result:n}=e,r=n.kind===`point`?void 0:N(t.snapshot?.nodes??[]);return F({source:{kind:`runtime`,result:n},referenceFrame:r,extra:{text:e.text},staleRefsWarning:e.staleRefsWarning,settleRefsGeneration:J(t,n)})}function Ne(e){let{session:t,target:n,flags:r}=e;return n.kind!==`selector`||o(`fill`)&&r?.verify===!0||s(`fill`)&&r?.settle===!0?null:Y(t,n.selector,r)}async function Pe(e,t,n,r){return await X({params:e,session:t,selector:n,command:`fill`,positionals:[r],extra:{selector:n.raw,text:r},fallbackPhase:`ios_direct_selector_fill_fallback`})}async function Z(e,t){let r=e.sessionStore.get(e.sessionName);if(!r)return S();let i=W(e),a=Date.now();try{let{readiness:n,runtimeResult:o}=await Fe(r,e.req.command,async()=>{let e=await t.run(i);return await t.afterRun?.(e),e}),s=Date.now(),{result:c,responseData:l}=await t.buildPayloads(o);if(n.status===`recovered`){let e=typeof l.warning==`string`?`${l.warning} ${n.warning}`:n.warning;c.warning=e,l.warning=e}return M({session:r,sessionStore:e.sessionStore,command:e.req.command,positionals:e.req.positionals??[],retryPositionals:Le(e.req.command,o),flags:e.req.flags,result:c,responseData:l,actionStartedAt:a,actionFinishedAt:s,androidFreshnessBaseline:t.androidFreshnessBaseline})}catch(e){let t=n(e);if(ue(t))throw t;return Ie(e)}}async function Fe(e,t,n){if(e.lease?.leaseProvider)return{readiness:{status:`clear`},runtimeResult:await n()};let r=await w({session:e,command:t,phase:`before-command`}),i=await n();return await w({session:e,command:t,phase:`after-command`}),{readiness:r,runtimeResult:i}}async function Q(e,t){if(!te(t))return;let n=t.snapshot?.comparisonSafe===!0?t.snapshot:void 0;try{await e.captureSnapshotForSession(t,e.req.flags,e.sessionStore,e.contextFromFlags,{interactiveOnly:!0,androidFreshnessMode:`ref-refresh`})}catch(t){a({level:`warn`,phase:`android_ref_snapshot_refresh_failed`,data:{command:e.req.command,error:t instanceof Error?t.message:String(t)}})}return n}function Ie(t){return{ok:!1,error:e(t)}}function Le(e,t){if(!(t.kind===`ref`&&!t.node)&&(e===`click`||e===`press`))return t.point?$(t.point):void 0}function $(e){return[String(e.x),String(e.y)]}async function Re(e){let t=await be({...e,captureSnapshotForSession:P,refSnapshotFlagGuardResponse:de});if(t)return t;switch(e.req.command){case c.type:return await ze({...e,captureSnapshotForSession:P});case`get`:return await O(e);case`is`:return await ce(e);default:return null}}async function ze(e){let{sessionName:t,sessionStore:n}=e,r=n.get(t);return r?g(c.type,r.device)||await Be(r)||await Ve(e,r):S()}async function Be(e){return e.device.platform===`android`&&e.recording&&(await _({session:e})).status===`failed`?b(`COMMAND_FAILED`,`Android system dialog blocked the recording session`):null}async function Ve(t,n){let{req:r,sessionName:i,sessionStore:a}=t,o=(r.positionals??[]).join(` `),s=W(t),c=Date.now();try{let e=await w({session:n,command:r.command,phase:`before-command`}),t=await s.interactions.typeText(o,{session:i,requestId:r.meta?.requestId,delayMs:r.flags?.delayMs});await w({session:n,command:r.command,phase:`after-command`});let l=Date.now(),d={...t.backendResult??{},text:t.text,delayMs:t.delayMs,...u(t.message??`Typed ${Array.from(t.text).length} chars`)};return e.status===`recovered`&&(d.warning=e.warning),M({session:n,sessionStore:a,command:r.command,positionals:r.positionals??[],flags:r.flags,result:d,responseData:d,actionStartedAt:c,actionFinishedAt:l})}catch(t){return{ok:!1,error:e(t)}}}export{Re as handleInteractionCommands};
|
package/dist/src/interactor.js
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{F as e,_ as t,m as n,p as r}from"./sdk-contracts.js";import{F as i}from"./sdk-android-adb.js";import{et as a,pt as o,tt as s,ut as c}from"./device-rotation.js";import{n as l}from"./snapshot-quality.js";import{i as u}from"./runner-client.js";import{o as d}from"./helper.js";import{c as f,i as p,n as m,o as h,r as g,s as _,u as v}from"./apps.js";import{n as y,t as b}from"./runner-sequence.js";function x(e,t,n){return{command:`remotePress`,remoteButton:e,...n===void 0?{}:{durationMs:n},...t===void 0?{}:{appBundleId:t}}}function S(e,t,n,r={includeDuration:!0}){let i=w(e.referenceWidth),a=w(e.referenceHeight);if(i===void 0||a===void 0)return T(e,{amount:n?.amount});let o=s({direction:t,amount:n?.amount,pixels:n?.pixels,referenceWidth:i,referenceHeight:a});return T(e,{amount:n?.amount,pixels:o.pixels,durationMs:r?.includeDuration?n?.durationMs:void 0,preferProvidedPixels:!0})}function C(e,t={includeDuration:!0}){return{...e?.amount===void 0?{}:{amount:e.amount},...e?.pixels===void 0?{}:{pixels:e.pixels},...t?.includeDuration&&e?.durationMs!==void 0?{durationMs:e.durationMs}:{}}}function w(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}function T(e,t){let{x1:n,y1:r,x2:i,y2:a}=D(e),o=w(e.referenceWidth),s=w(e.referenceHeight),c=E(t,n!==void 0&&i!==void 0?Math.round(Math.abs(i-n)):void 0,r!==void 0&&a!==void 0?Math.round(Math.abs(a-r)):void 0);return{...n===void 0?{}:{x1:n},...r===void 0?{}:{y1:r},...i===void 0?{}:{x2:i},...a===void 0?{}:{y2:a},...o===void 0?{}:{referenceWidth:o},...s===void 0?{}:{referenceHeight:s},...t?.amount===void 0?{}:{amount:t.amount},...c===void 0?{}:{pixels:c},...t?.durationMs===void 0?{}:{durationMs:t.durationMs}}}function E(e,t,n){if(e?.preferProvidedPixels&&e.pixels!==void 0)return e.pixels;if(t!==void 0&&t>0)return t;if(n!==void 0&&n>0)return n}function D(e){let t=w(e.x),n=w(e.y),r=w(e.x2),i=w(e.y2);return{...t===void 0?{}:{x1:t},...n===void 0?{}:{y1:n},...r===void 0?{}:{x2:r},...i===void 0?{}:{y2:i}}}async function O(e,t,n,r,i,a){return S(await e(t,{command:`desktopScroll`,direction:i,...C(a,{includeDuration:!0}),appBundleId:n.appBundleId},r),i,a,{includeDuration:!0})}function k(e){return e===`system`?`backSystem`:`backInApp`}function A(e,t){let n={verbose:t.verbose,logPath:t.logPath,traceLogPath:t.traceLogPath,requestId:t.requestId,iosXctestrunFile:t.iosXctestrunFile,iosXctestDerivedDataPath:t.iosXctestDerivedDataPath,iosXctestEnvDir:t.iosXctestEnvDir,runnerLeaseContext:t.runnerLeaseContext};return{runnerOpts:n,overrides:{tap:async(r,i)=>await u(e,j(e,t,r,i),n),tapElementSelector:async r=>await u(e,{command:`tap`,selectorKey:r.key,selectorValue:r.value,allowNonHittableCoordinateFallback:r.allowNonHittableCoordinateFallback,appBundleId:t.appBundleId},n),doubleTap:async(r,i)=>{let a=await u(e,b([{kind:`doubleTap`,x:r,y:i}],t.appBundleId),n);return y(a),a},swipe:async(r,i,a,o,s)=>await u(e,N(e,t,r,i,a,o,s,{defaultDurationMs:250,synthesized:M(e)}),n),pan:async(r,i,a,o,s)=>await u(e,N(e,t,r,i,a,o,s,{defaultDurationMs:500,legacyDefaultDurationMs:500,synthesized:M(e)}),n),fling:async(r,i,a,o,s)=>await u(e,N(e,t,r,i,a,o,s,{defaultDurationMs:16,legacyDefaultDurationMs:16,synthesized:M(e)}),n),longPress:async(r,i,a)=>await u(e,{command:`longPress`,x:r,y:i,durationMs:a,appBundleId:t.appBundleId},n),focus:async(r,i)=>await u(e,j(e,t,r,i),n),type:async(r,i)=>{await u(e,{command:`type`,text:r,delayMs:i,textEntryMode:r===`
|
|
2
|
+
`?void 0:`append`,appBundleId:t.appBundleId},n)},fillElementSelector:async(r,i,a)=>await u(e,{command:`type`,selectorKey:r.key,selectorValue:r.value,allowNonHittableCoordinateFallback:r.allowNonHittableCoordinateFallback,text:i,delayMs:a,textEntryMode:`replace`,appBundleId:t.appBundleId},n),fill:async(r,i,a,o)=>await u(e,{command:`type`,x:r,y:i,text:a,delayMs:o,textEntryMode:`replace`,appBundleId:t.appBundleId},n),scroll:async(r,i)=>await F(u,e,t,n,r,i),pinch:async(r,i,a)=>{await u(e,{command:`pinch`,scale:r,x:i,y:a,appBundleId:t.appBundleId},n)},rotateGesture:async(r,i,a,o)=>{await u(e,{command:`rotateGesture`,degrees:r,x:i,y:a,velocity:o,appBundleId:t.appBundleId},n)},transformGesture:async r=>await u(e,{command:`transformGesture`,x:r.x,y:r.y,dx:r.dx,dy:r.dy,scale:r.scale,degrees:r.degrees,durationMs:r.durationMs,appBundleId:t.appBundleId},n)}}}function j(e,t,n,r){return{command:`tap`,x:n,y:r,...M(e)?{synthesized:!0}:{},appBundleId:t.appBundleId}}function M(e){return r(e)&&!t(e)}function N(e,n,i,a,o,s,c,l){let u=r(e)&&!t(e)?P(c,l.defaultDurationMs):c??l.legacyDefaultDurationMs;return{command:`drag`,x:i,y:a,x2:o,y2:s,...u===void 0?{}:{durationMs:u},...l.synthesized===!0?{synthesized:!0}:{},appBundleId:n.appBundleId}}function P(e,t){return e===void 0?t:Math.min(1e4,Math.max(16,Math.round(e)))}async function F(e,r,i,s,l,u){return o(u?.durationMs,{invalidMessage:`scroll durationMs must be a non-negative integer at most ${c}`}),t(r)?T(await e(r,x(l,i.appBundleId,u?.durationMs),s),{amount:u?.amount,durationMs:u?.durationMs}):(a(u??{}),n(r)?await O(e,r,i,s,l,u):S(await e(r,{command:`scroll`,direction:l,...C(u),appBundleId:i.appBundleId},s),l,u))}function I(r,a){if(r.appleOs===`watchos`)throw new e(`UNSUPPORTED_PLATFORM`,`watchOS is not supported: XCUITest cannot drive watchOS UI, so this device has no runner backend.`);let{overrides:o,runnerOpts:s}=A(r,a);return{open:(e,t)=>_(r,e,{appBundleId:t?.appBundleId,launchConsole:t?.launchConsole,launchArgs:t?.launchArgs,terminateRunningApp:t?.terminateRunningApp,url:t?.url}),openDevice:()=>f(r),close:e=>h(r,e),screenshot:async(e,t)=>{if(n(r)&&t?.surface&&t.surface!==`app`){await d(e,{surface:t.surface,fullscreen:t.fullscreen});return}await v(r,e,{appBundleId:t?.appBundleId,fullscreen:t?.fullscreen,runnerOptions:s,normalizeStatusBar:t?.normalizeStatusBar,skipIosSimulatorBootCheck:t?.skipIosSimulatorBootCheck})},snapshot:async t=>{let n=L(await i(`snapshot_capture`,async()=>await u(r,{command:`snapshot`,appBundleId:t?.appBundleId,interactiveOnly:t?.interactiveOnly,depth:t?.depth,scope:t?.scope,raw:t?.raw},s),{backend:`xctest`})),a=n.nodes??[];if(a.length===0&&r.kind===`simulator`)throw new e(`COMMAND_FAILED`,`XCTest snapshot returned 0 nodes on iOS simulator.`);return{nodes:a,truncated:n.truncated??!1,backend:`xctest`,...n.quality?{quality:n.quality}:{},...!n.quality&&n.message?{warnings:[n.message]}:{}}},back:async e=>{if(t(r)){await u(r,x(`menu`,a.appBundleId),s);return}await u(r,{command:k(e),appBundleId:a.appBundleId},s)},home:async()=>{if(t(r)){await u(r,x(`home`,a.appBundleId),s);return}await u(r,{command:`home`,appBundleId:a.appBundleId},s)},rotate:async e=>{await u(r,{command:`rotate`,orientation:e,appBundleId:a.appBundleId},s)},appSwitcher:async()=>{await u(r,{command:`appSwitcher`,appBundleId:a.appBundleId},s)},readClipboard:()=>g(r),writeClipboard:e=>p(r,e),setSetting:(e,t,n,i)=>m(r,e,t,n,i),...o}}function L(e){return{nodes:Array.isArray(e.nodes)?e.nodes:void 0,truncated:typeof e.truncated==`boolean`?e.truncated:void 0,quality:l(e.snapshotQuality),message:typeof e.message==`string`&&e.message.trim().length>0?e.message:void 0}}export{I as createAppleInteractor};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { }
|
|
1
|
+
export { };
|
package/dist/src/internal/bin.js
CHANGED
|
@@ -1,5 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
`),process.exit(1)}1
|
|
3
|
-
`),1)||0===e.length&&(import("../cli-help.js").then(({buildUsageText:e})=>{process.stdout.write(`${e()}
|
|
4
|
-
`),process.exit(1)}).catch(p),1)||void 0!==(n=function(e){var t,r,s,n;switch(e.length){case 1:return"help"===(t=e[0])||c(t)?null:void 0;case 2:return r=e[0],s=e[1],"help"===r?s:(n=r,c(s)?n:void 0);default:return}}(s=e))&&(import("../cli-help.js").then(({buildCommandUsageText:e,buildUsageText:t})=>{var r;if(null===n)return void process.stdout.write(`${t()}
|
|
5
|
-
`);let o=e("long-press"===(r=n)?"longpress":"metrics"===r?"perf":r);o?process.stdout.write(o):i(s)}).catch(p),1)||("mcp"!==o[0]||o.includes("--help")||o.includes("-h")?i(o):import("../server.js").then(({runAgentDeviceMcpServer:e})=>e()).catch(p));export{};
|
|
1
|
+
const e=process.argv.slice(2);t(e)||(e[0]===`mcp`&&!e.includes(`--help`)&&!e.includes(`-h`)?import(`../server.js`).then(({runAgentDeviceMcpServer:e})=>e()).catch(m):p(e));function t(e){return n(e)||r(e)||i(e)}function n(e){return e.length!==1||!f(e[0])?!1:(process.stdout.write(`0.19.0
|
|
2
|
+
`),!0)}function r(e){return e.length===0?(import(`../cli-help.js`).then(({buildUsageText:e})=>{process.stdout.write(`${e()}\n`),process.exit(1)}).catch(m),!0):!1}function i(e){let t=a(e);return t===void 0?!1:(import(`../cli-help.js`).then(({buildCommandUsageText:n,buildUsageText:r})=>{if(t===null){process.stdout.write(`${r()}\n`);return}let i=n(l(t));if(i){process.stdout.write(i);return}p(e)}).catch(m),!0)}function a(e){switch(e.length){case 1:return o(e[0]);case 2:return s(e[0],e[1]);default:return}}function o(e){return e===`help`||d(e)?null:void 0}function s(e,t){return u(e)?t:c(e,t)}function c(e,t){return d(t)?e:void 0}function l(e){return e===`long-press`?`longpress`:e===`metrics`?`perf`:e}function u(e){return e===`help`}function d(e){return e===`--help`||e===`-h`}function f(e){return e===`--version`||e===`-V`}function p(e){import(`../cli.js`).then(({runCli:t})=>t(e)).catch(m)}function m(e){process.stderr.write(`${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}export{};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { }
|
|
1
|
+
export { };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import
|
|
1
|
+
import{_ as e,a as t,c as n,d as r,f as i,h as a,i as o,l as s,m as c,n as l,o as u,p as d,s as f,u as p}from"../url.js";import m from"node:fs";import{setTimeout as h}from"node:timers/promises";const g=5e3,_=6e4;var v=class extends Error{retryable;retryAfterMs;constructor(e,t,n){super(e),this.retryable=t,this.retryAfterMs=n}};function y(e,t){return{authorization:`Bearer ${t}`,"content-type":`application/json`,...e.includes(`ngrok`)?{"ngrok-skip-browser-warning":`1`}:{}}}function b(e){let t=e.replaceAll(/\s+/g,` `).trim();return t.length>300?`${t.slice(0,300)}...`:t}function x(e){return e.registerPath}function S(e){return e.unregisterPath??null}function C(e){return{...e.bridgeScope,...e.session?{session:e.session}:{},local_base_url:l(e.localBaseUrl),...e.devicePort?{device_port:e.devicePort}:{},...e.launchUrl?{launch_url:e.launchUrl}:{}}}async function w(e){let t=x(e),n;try{n=await fetch(`${l(e.serverBaseUrl)}${t}`,{method:`POST`,headers:y(e.serverBaseUrl,e.bearerToken),body:JSON.stringify(C(e)),signal:AbortSignal.timeout(g)})}catch(n){throw n instanceof Error&&n.name===`TimeoutError`?Error(`${t} timed out after ${g}ms calling ${l(e.serverBaseUrl)}${t}`):n}let r=await n.text(),i;try{i=r?JSON.parse(r):{}}catch{throw new v(`Failed to register companion (${n.status}): invalid JSON response: ${b(r)}`,T(n.status,void 0),E(n,{}))}if(!n.ok||i.ok!==!0||typeof i.data?.ws_url!=`string`)throw new v(`Failed to register companion (${n.status}): ${JSON.stringify(i)}`,T(n.status,i.error?.code),E(n,i));return{wsUrl:i.data.ws_url}}function T(e,t){return t===`RATE_LIMITED`?!0:t===`UNAUTHORIZED`||t===`INVALID_ARGS`||t===`SESSION_NOT_FOUND`?!1:e===408||e===409||e===425||e===429||e>=500}function E(e,t){let n=t.error?.details?.retryAfterMs;if(typeof n==`number`&&Number.isFinite(n))return D(n);let r=e.headers.get(`retry-after`);if(!r)return;let i=Number(r);if(Number.isFinite(i))return D(i*1e3);let a=Date.parse(r);if(Number.isFinite(a))return D(a-Date.now())}function D(e){return Math.max(0,Math.min(_,Math.ceil(e)))}function O(e){return Math.min(e*2,_)}async function k(e){let t=S(e);if(t)try{await fetch(`${l(e.serverBaseUrl)}${t}`,{method:`POST`,headers:y(e.serverBaseUrl,e.bearerToken),body:JSON.stringify(C(e)),signal:AbortSignal.timeout(2e3)})}catch(e){console.error(e instanceof Error?e.message:String(e))}}async function A(e){return typeof e==`string`?Buffer.from(e,`utf8`):e instanceof ArrayBuffer?Buffer.from(e):ArrayBuffer.isView(e)?Buffer.from(e.buffer,e.byteOffset,e.byteLength):typeof Blob<`u`&&e instanceof Blob?Buffer.from(await e.arrayBuffer()):Buffer.from(String(e),`utf8`)}async function j(e){let t=(await A(e.data)).toString(`utf8`);return JSON.parse(t)}function M(e,t){let n=new URL(t,`${l(e)}/`);return n.protocol=n.protocol===`https:`?`wss:`:`ws:`,n.toString()}function N(e){return typeof e!=`number`||!Number.isInteger(e)?1011:e===1e3||e>=3e3&&e<=4999||e>=1001&&e<=1015&&e!==1004&&e!==1005&&e!==1006?e:1011}function P(e){return e===1e3||e>=3e3&&e<=4999?e:3001}function F(e,t){e.readyState===1&&e.send(JSON.stringify(t))}async function I(e,t){e.readyState!==1&&await new Promise((n,r)=>{let i=()=>{s(),n()},a=()=>{s(),r(Error(`${t} WebSocket failed before opening.`))},o=()=>{s(),r(Error(`${t} WebSocket closed before opening.`))},s=()=>{e.removeEventListener(`open`,i),e.removeEventListener(`error`,a),e.removeEventListener(`close`,o)};e.addEventListener(`open`,i,{once:!0}),e.addEventListener(`error`,a,{once:!0}),e.addEventListener(`close`,o,{once:!0})})}async function L(e){e.readyState>=WebSocket.CLOSING||await new Promise(t=>{let n=()=>{r(),t()},r=()=>{e.removeEventListener(`close`,n),e.removeEventListener(`error`,n)};e.addEventListener(`close`,n,{once:!0}),e.addEventListener(`error`,n,{once:!0}),e.readyState>=WebSocket.CLOSING&&n()})}function R(e,t,n){try{e.close(P(t),n)}catch{}}function z(e){return!e.statePath||m.existsSync(e.statePath)}async function B(e,t,n){try{let r=await fetch(new URL(t.path,`${l(n.localBaseUrl)}/`),{method:t.method,headers:t.headers,...t.bodyBase64?{body:Buffer.from(t.bodyBase64,`base64`)}:{}}),i=Buffer.from(await r.arrayBuffer());F(e,{type:`http-response`,requestId:t.requestId,status:r.status,headers:Object.fromEntries(r.headers.entries()),...i.length>0?{bodyBase64:i.toString(`base64`)}:{}})}catch(n){F(e,{type:`http-error`,requestId:t.requestId,message:n instanceof Error?n.message:String(n)})}}async function V(e,t,n,r){let i=new WebSocket(M(n.localBaseUrl,t.path));i.binaryType=`arraybuffer`;let a=!1;i.addEventListener(`message`,n=>{(async()=>{if(!a)return;let r=await A(n.data);F(e,{type:`ws-frame`,streamId:t.streamId,dataBase64:r.toString(`base64`),binary:typeof n.data!=`string`})})().catch(e=>{console.error(e instanceof Error?e.message:String(e))})}),i.addEventListener(`close`,n=>{r.delete(t.streamId),a&&F(e,{type:`ws-close`,streamId:t.streamId,code:n.code,reason:n.reason})}),i.addEventListener(`error`,()=>{a&&F(e,{type:`ws-close`,streamId:t.streamId,code:1011,reason:`Upstream WebSocket error.`})}),r.set(t.streamId,i);try{await I(i,`Upstream`),a=!0,F(e,{type:`ws-open-result`,streamId:t.streamId,success:!0,headers:{}})}catch(n){r.delete(t.streamId),R(i,1011,`open failed`),F(e,{type:`ws-open-result`,streamId:t.streamId,success:!1,error:n instanceof Error?n.message:String(n)})}}function H(e,t){let n=t.get(e.streamId);if(!n||n.readyState!==1)return;let r=Buffer.from(e.dataBase64,`base64`);n.send(e.binary?r:r.toString(`utf8`))}function U(e,t){let n=t.get(e.streamId);n&&(t.delete(e.streamId),R(n,N(e.code),e.reason??`bridge requested close`))}async function W(e,t,n,r){switch(t.type){case`ping`:F(e,{type:`pong`,timestamp:t.timestamp});return;case`http-request`:await B(e,t,n);return;case`ws-open`:await V(e,t,n,r);return;case`ws-frame`:H(t,r);return;case`ws-close`:U(t,r);return}}async function G(e,t={}){let n=new Map,r=!1,i=null,a=!1,o=null,s=t.delay??h,c,l=new Promise(e=>{c=e}),u=()=>{t.exit?.(0)},d=async()=>{!a&&!o||(o??=k(e).finally(()=>{a=!1,o=null}),await o)},f=()=>{r||(r=!0,c(),a&&d().finally(u),i&&R(i,1e3,`companion stopping`),t.exit&&setTimeout(u,900).unref())};t.registerProcessSignals&&(process.once(`SIGTERM`,f),process.once(`SIGINT`,f));let p=setInterval(()=>{z(e)||(f(),u())},t.leaseCheckIntervalMs??250);p.unref();let m=t.reconnectDelayMs??1e3;try{for(;!r&&z(e);){let o=!1,c;try{a=!1;let s=await w(e);if(m=t.reconnectDelayMs??1e3,o=!0,a=!0,r||!z(e)){await d(),o=!1;break}let c=new WebSocket(s.wsUrl);i=c,c.binaryType=`arraybuffer`;try{await I(c,`Bridge`),c.addEventListener(`message`,t=>{(async()=>{let r=await j(t);await W(c,r,e,n)})().catch(e=>{console.error(e instanceof Error?e.message:String(e))})}),await Promise.race([L(c),l])}finally{i=null,n.forEach(e=>R(e,1012,`bridge disconnected`)),n.clear(),o&&=(await d(),!1)}}catch(t){if(i=null,o&&=(await d(),!1),r||!z(e)||(console.error(t instanceof Error?t.message:String(t)),t instanceof v&&!t.retryable))break;c=t instanceof v?t.retryAfterMs:void 0}if(r||!z(e))break;let u=c??m;c===void 0&&(m=O(m)),await s(u)}}finally{clearInterval(p),t.registerProcessSignals&&(process.off(`SIGTERM`,f),process.off(`SIGINT`,f))}}function K(e){if(!e?.trim())return;let t=Number.parseInt(e,10);if(!Number.isInteger(t)||t<1||t>65535)throw Error(`Companion worker received invalid device port configuration.`);return t}function q(l,m){let h=l[0];if(h!==`--agent-device-run-metro-companion`&&h!==`--agent-device-run-react-devtools-companion`)return null;let g=m[i]?.trim(),_=m[o]?.trim(),v=m[f]?.trim();if(!g||!_||!v)throw new e(`Companion tunnel worker is missing required environment configuration.`);let y=m[r]?.trim(),b=m[p]?.trim(),x=m[s]?.trim();if(!y||!b||!x)throw new e(`Companion tunnel worker is missing required bridge scope configuration.`);let S=m[n]?.trim();if(!S)throw new e(`Companion tunnel worker is missing required register path configuration.`);return{serverBaseUrl:g,bearerToken:_,localBaseUrl:v,registerPath:S,bridgeScope:{tenantId:y,runId:b,leaseId:x},launchUrl:m[u]?.trim(),statePath:m[c]?.trim(),unregisterPath:m[a]?.trim(),devicePort:K(m[t]?.trim()),session:m[d]?.trim()}}async function J(e,t){let n=q(e,t);return n?(await G(n,{exit:e=>process.exit(e),registerProcessSignals:!0}),!0):!1}J(process.argv.slice(2),process.env).catch(t=>{if(t instanceof e){console.error(t.message),process.exitCode=1;return}console.error(t instanceof Error?t.stack??t.message:String(t)),process.exitCode=1});export{};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { }
|
|
1
|
+
export { };
|