agent-device 0.21.6 → 0.21.7
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/ime-helper/dist/{agent-device-android-ime-helper-0.21.6.apk → agent-device-android-ime-helper-0.21.7.apk} +0 -0
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.7.apk.sha256 +1 -0
- package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.6.manifest.json → agent-device-android-ime-helper-0.21.7.manifest.json} +4 -4
- package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.6.apk → agent-device-android-snapshot-helper-0.21.7.apk} +0 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.7.apk.sha256 +1 -0
- package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.6.manifest.json → agent-device-android-snapshot-helper-0.21.7.manifest.json} +6 -6
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.h +4 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerAXSnapshotBridge.m +20 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerScrollViewportPolicy.swift +1 -2
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AXSnapshotFallback.swift +25 -12
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +56 -1
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandJournal.swift +1 -1
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +36 -108
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Keyboard.swift +241 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Lifecycle.swift +29 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +46 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+PrivateAXPresentation.swift +85 -26
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Snapshot.swift +134 -117
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotBackendCapabilities.swift +1 -3
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCapturePlan.swift +25 -4
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SystemModal.swift +1 -1
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +3 -0
- package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotCoordinateSpace.swift +197 -0
- package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotModels.swift +30 -4
- package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentation.swift +0 -81
- package/dist/apple/snapshot-presentation/Sources/AgentDeviceSnapshotPresentation/SnapshotPresentationInvariant.swift +1 -9
- package/dist/src/absence-observation-errors.js +1 -1
- package/dist/src/adapter.js +1 -1
- package/dist/src/adb-executor.js +2 -2
- package/dist/src/adb-failure.js +1 -1
- package/dist/src/adb-transport.js +1 -1
- package/dist/src/adb.js +1 -1
- package/dist/src/agent-browser-lifecycle.js +1 -1
- package/dist/src/agent-browser-process-record.js +1 -1
- package/dist/src/agent-browser-provider.js +1 -1
- package/dist/src/agent-browser-tool.js +1 -1
- package/dist/src/agent-device-client.js +2 -2
- package/dist/src/ai-sdk.js +1 -1
- package/dist/src/alert-runtime.js +1 -1
- package/dist/src/android-adb.d.ts +29 -2
- package/dist/src/android-adb.js +1 -1
- package/dist/src/android-input-ownership.js +1 -1
- package/dist/src/android.js +1 -1
- package/dist/src/app-catalog.js +1 -1
- package/dist/src/app-deployment-resolution.js +1 -1
- package/dist/src/app-helpers.js +1 -1
- package/dist/src/app-inventory.js +1 -1
- package/dist/src/app-launch.js +2 -2
- package/dist/src/app-lifecycle.js +2 -2
- package/dist/src/app-lifecycle2.js +2 -2
- package/dist/src/app-log-files.js +1 -1
- package/dist/src/app-log-runtime2.js +3 -3
- package/dist/src/app-resolution.js +2 -2
- package/dist/src/app-state.js +1 -1
- package/dist/src/apple-runner-platform.js +1 -1
- package/dist/src/application-lifecycle-interaction.js +1 -1
- package/dist/src/archive.js +1 -1
- package/dist/src/artifact-download.js +1 -1
- package/dist/src/auth-session.js +1 -1
- package/dist/src/auth.js +1 -1
- package/dist/src/back-mode.js +1 -1
- package/dist/src/backend-snapshot-options.js +1 -1
- package/dist/src/boot-diagnostics.js +1 -1
- package/dist/src/capture-disclosure.js +1 -0
- package/dist/src/capture.js +1 -1
- package/dist/src/cli-config.js +1 -1
- package/dist/src/cli-help.js +15 -2
- package/dist/src/cli-output.js +1 -1
- package/dist/src/cli.js +4 -4
- package/dist/src/click-button.js +1 -1
- package/dist/src/client-metro.js +1 -1
- package/dist/src/client-types.d.ts +32 -2
- package/dist/src/clipboard-shell-response.js +1 -0
- package/dist/src/command-schema.js +1 -1
- package/dist/src/command-tools.js +4 -2
- package/dist/src/command.js +1 -1
- package/dist/src/config.js +1 -1
- package/dist/src/connection-runtime.js +1 -1
- package/dist/src/connection.js +1 -1
- package/dist/src/contracts.d.ts +1 -1
- package/dist/src/contracts.js +1 -1
- package/dist/src/daemon-client-lifecycle.js +1 -1
- package/dist/src/daemon.js +1 -1
- package/dist/src/debug-symbols-facade.js +1 -1
- package/dist/src/device-boot.js +1 -1
- package/dist/src/device-claim-inspection.js +1 -1
- package/dist/src/device-claim-rule.js +2 -1
- package/dist/src/device-input-state.d.ts +4 -4
- package/dist/src/device-inventory-context.js +1 -1
- package/dist/src/device-rotation.js +1 -1
- package/dist/src/device-selection-resolver.js +1 -1
- package/dist/src/device-session.js +1 -1
- package/dist/src/device-shell.js +1 -0
- package/dist/src/device.js +1 -1
- package/dist/src/device2.js +1 -1
- package/dist/src/devicectl.js +1 -0
- package/dist/src/diagnostics.js +1 -1
- package/dist/src/dispatch-resolve.js +1 -1
- package/dist/src/display-inventory.js +1 -0
- package/dist/src/doctor-facade.js +1 -1
- package/dist/src/doctor2.js +1 -1
- package/dist/src/durable-resource.js +1 -1
- package/dist/src/engine-eval-script.js +1 -1
- package/dist/src/error.js +1 -1
- package/dist/src/exec.js +1 -1
- package/dist/src/file.js +1 -1
- package/dist/src/find.js +1 -1
- package/dist/src/finders.js +1 -1
- package/dist/src/format.js +2 -1
- package/dist/src/generic.js +1 -1
- package/dist/src/gesture-admission.js +1 -1
- package/dist/src/gesture-plan.js +1 -1
- package/dist/src/gesture-runtime.js +1 -1
- package/dist/src/harmonyos.js +1 -1
- package/dist/src/hdc.js +1 -1
- package/dist/src/helper.js +1 -1
- package/dist/src/human-control-contract.js +1 -1
- package/dist/src/human-control.js +1 -1
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/input-actions.js +1 -1
- package/dist/src/input-actions2.js +1 -1
- package/dist/src/install-artifact-facade.js +1 -1
- package/dist/src/install-source-network-transport.js +1 -1
- package/dist/src/install-source2.js +1 -1
- package/dist/src/interaction-positionals.js +1 -1
- package/dist/src/interaction-ref-policy.js +1 -1
- package/dist/src/interaction.js +1 -1
- package/dist/src/interaction2.js +1 -1
- package/dist/src/interactor-operation-catalog.js +1 -1
- package/dist/src/interactor.js +5 -5
- package/dist/src/interactor2.js +1 -1
- package/dist/src/interactors.js +1 -1
- package/dist/src/internal/bin.js +1 -1
- package/dist/src/internal/daemon.js +2 -2
- package/dist/src/internal/png-worker.d.ts +4 -1
- package/dist/src/internal/png-worker.js +1 -1
- package/dist/src/internal/run-script-http-child.js +1 -1
- package/dist/src/inventory.js +4 -4
- package/dist/src/inventory2.js +1 -1
- package/dist/src/inventory3.js +2 -2
- package/dist/src/inventory5.js +1 -1
- package/dist/src/ios-snapshot-acquisition.js +1 -1
- package/dist/src/ios-snapshot-runtime.js +1 -1
- package/dist/src/ios-target-activation.js +1 -0
- package/dist/src/lease-context.js +1 -1
- package/dist/src/lease-scope.js +1 -1
- package/dist/src/lease.js +1 -1
- package/dist/src/limrun-download-file.js +1 -0
- package/dist/src/limrun-runtime-dependencies.js +1 -1
- package/dist/src/limrun.d.ts +10 -4
- package/dist/src/linux.js +1 -1
- package/dist/src/local-interactor-operation-set.js +1 -1
- package/dist/src/location-coordinates.js +1 -1
- package/dist/src/managed-device-scope.js +1 -1
- package/dist/src/mechanics.js +16 -16
- package/dist/src/mobile-snapshot-semantics.js +1 -1
- package/dist/src/multitouch-support.js +1 -1
- package/dist/src/observation.js +2 -2
- package/dist/src/output-common.js +5 -2
- package/dist/src/parameterized-recorded-fill.js +1 -1
- package/dist/src/perf-facade.js +2 -2
- package/dist/src/perf-runtime-operation-builder.js +1 -1
- package/dist/src/perf-runtime-plan.js +1 -1
- package/dist/src/perf.js +1 -1
- package/dist/src/physical-device-control.js +1 -1
- package/dist/src/platform-request-scope.js +1 -1
- package/dist/src/platform-runtime-android-adb-host.js +1 -1
- package/dist/src/platform-runtime-host.js +1 -1
- package/dist/src/platform-runtime-managed-owner.js +1 -1
- package/dist/src/platform-runtime-open-target.js +1 -1
- package/dist/src/platform-runtime-operation-host.js +4 -4
- package/dist/src/platform-runtime-runtime-hints.js +2 -2
- package/dist/src/platform-runtime-screen-recording-android-host.js +1 -1
- package/dist/src/platform-runtime-screen-recording-apple-runner-transport.js +1 -1
- package/dist/src/platform-runtime-screen-recording-apple-simulator-host.js +1 -1
- package/dist/src/platform-runtime-screen-recording-apple-transport.js +1 -1
- package/dist/src/platform-runtime-screen-recording-finalizer-host.js +1 -1
- package/dist/src/platform-runtime-screen-recording-harmony-host.js +1 -1
- package/dist/src/platform-runtime-screen-recording-process-host.js +1 -1
- package/dist/src/platform-runtime-unavailable.js +1 -1
- package/dist/src/platform-runtime.js +1 -1
- package/dist/src/platform-runtime2.js +1 -1
- package/dist/src/png-crop-bytes.js +1 -1
- package/dist/src/png-transcode.js +1 -0
- package/dist/src/png-worker-client.js +1 -0
- package/dist/src/png.js +1 -1
- package/dist/src/prepare-kind.js +1 -1
- package/dist/src/provider-session-ownership.js +1 -1
- package/dist/src/provider-webdriver.js +1 -1
- package/dist/src/proxy.js +1 -1
- package/dist/src/quality-warnings.js +1 -1
- package/dist/src/react-native.js +1 -1
- package/dist/src/record-runtime.js +1 -1
- package/dist/src/record-trace.js +1 -1
- package/dist/src/rect-center.js +1 -1
- package/dist/src/register-builtins.js +1 -1
- package/dist/src/registry.js +35 -35
- package/dist/src/remote-config2.js +1 -1
- package/dist/src/replay-divergence.js +1 -1
- package/dist/src/replay.js +2 -2
- package/dist/src/reporting.js +1 -1
- package/dist/src/request-admission.js +1 -1
- package/dist/src/request-cancel.js +1 -1
- package/dist/src/request-runtime-binding.js +1 -1
- package/dist/src/result-serialization.js +1 -1
- package/dist/src/retry.js +1 -1
- package/dist/src/runner-cache-metadata.js +2 -2
- package/dist/src/runner-client.js +1 -1
- package/dist/src/runner-disposal.js +1 -1
- package/dist/src/runner-operations-facade.js +1 -1
- package/dist/src/runner-presentation.js +1 -1
- package/dist/src/runner.js +1 -1
- package/dist/src/runtime-transport-hints.js +1 -1
- package/dist/src/runtime.js +3 -3
- package/dist/src/runtime10.js +1 -1
- package/dist/src/runtime2.js +4 -4
- package/dist/src/runtime3.js +1 -1
- package/dist/src/runtime4.js +5 -5
- package/dist/src/runtime5.js +1 -1
- package/dist/src/runtime6.js +1 -1
- package/dist/src/runtime7.js +1 -1
- package/dist/src/runtime8.js +1 -1
- package/dist/src/runtime9.js +1 -1
- package/dist/src/screen-recording-admission-ledger.js +1 -0
- package/dist/src/screen-recording-completion.js +1 -1
- package/dist/src/screen-recording-options.js +1 -1
- package/dist/src/screen-recording-resource-recovery.js +1 -1
- package/dist/src/screen-recording-transport.js +1 -0
- package/dist/src/screenshot-density.js +1 -1
- package/dist/src/screenshot-runtime.js +1 -1
- package/dist/src/screenshot.js +1 -1
- package/dist/src/screenshot3.js +1 -1
- package/dist/src/script.js +1 -1
- package/dist/src/scroll-command.js +1 -1
- package/dist/src/scroll-gesture.js +1 -1
- package/dist/src/sdk-batch-runner.js +2 -2
- package/dist/src/sdk-batch.js +2 -2
- package/dist/src/sdk-contracts.d.ts +76 -1
- package/dist/src/sdk-contracts.js +1 -1
- package/dist/src/sdk-device.js +1 -1
- package/dist/src/sdk-finders.d.ts +1 -1
- package/dist/src/sdk-finders.js +1 -1
- package/dist/src/sdk-io.js +1 -1
- package/dist/src/sdk-remote-config.js +1 -1
- package/dist/src/sdk-selectors.d.ts +18 -1
- package/dist/src/sdk-selectors.js +1 -1
- package/dist/src/selection.js +0 -0
- package/dist/src/selector-runtime.js +1 -1
- package/dist/src/selectors.js +1 -1
- package/dist/src/semantic-index.js +1 -1
- package/dist/src/server.js +1 -1
- package/dist/src/session-allocation.js +1 -1
- package/dist/src/session-observation.js +1 -1
- package/dist/src/session-routing.js +1 -1
- package/dist/src/session-runtime-admission.js +1 -1
- package/dist/src/session-snapshot.js +1 -1
- package/dist/src/session-store.js +3 -3
- package/dist/src/session2.js +4 -5
- package/dist/src/settings.js +1 -1
- package/dist/src/simctl-facade.js +1 -1
- package/dist/src/simctl.js +1 -1
- package/dist/src/simulator-boot.js +1 -1
- package/dist/src/simulator.js +1 -1
- package/dist/src/snapshot-capture-annotations.js +1 -1
- package/dist/src/snapshot-diagnostics.js +1 -1
- package/dist/src/snapshot-quality-backend-capabilities.js +1 -1
- package/dist/src/snapshot-runtime-binding.js +1 -1
- package/dist/src/snapshot-runtime.js +1 -1
- package/dist/src/snapshot-state.js +1 -1
- package/dist/src/snapshot.js +1 -1
- package/dist/src/snapshot2.js +1 -1
- package/dist/src/snapshot3.js +1 -1
- package/dist/src/snapshot4.js +1 -1
- package/dist/src/src.js +1 -1
- package/dist/src/src4.js +1 -1
- package/dist/src/src7.js +1 -1
- package/dist/src/src8.js +1 -1
- package/dist/src/stop-sequence.js +1 -1
- package/dist/src/string-enum.js +1 -1
- package/dist/src/takeover.js +1 -1
- package/dist/src/text-entry-focus.js +1 -1
- package/dist/src/tool-provider.js +1 -1
- package/dist/src/tool-provider2.js +1 -1
- package/dist/src/touch-runtime.js +1 -1
- package/dist/src/transport.js +1 -1
- package/dist/src/tree.js +1 -1
- package/dist/src/tv-remote.js +1 -1
- package/dist/src/type-text-runtime.js +1 -1
- package/dist/src/verified-file.js +1 -1
- package/dist/src/video.js +1 -1
- package/dist/src/viewport.js +1 -1
- package/dist/src/web.js +1 -1
- package/dist/src/web2.js +1 -1
- package/dist/src/webdriver-source.js +1 -1
- package/dist/src/window-state.js +1 -1
- package/package.json +2 -1
- package/server.json +2 -2
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.6.apk.sha256 +0 -1
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.6.apk.sha256 +0 -1
- package/dist/src/session-target-evidence.js +0 -1
- package/dist/src/vars.js +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime.js";import{
|
|
1
|
+
import{r as e}from"./rolldown-runtime.js";import{D as t}from"./sdk-contracts.js";import{i as n}from"./device-shell.js";var r=e({ADB_GLOBAL_OPTIONS:()=>a,ADB_MANAGED_FORBIDDEN_COMMANDS:()=>c,ADB_WAIT_STATES:()=>s,ADB_WAIT_TRANSPORTS:()=>o,adoptAndroidAdbSerial:()=>g,androidAdbHostTarget:()=>m,androidAdbInvocation:()=>h,androidAdbPayloadWithoutSerial:()=>T,androidAdbSerialTarget:()=>p,androidManagedAdbEnvironment:()=>P,applyManagedAndroidAdbServer:()=>E,lowerAndroidAdbInvocation:()=>N,normalizeAndroidAdbInstallOptions:()=>i,parseAndroidAdbArgv:()=>x,requireAndroidAdbServerPort:()=>C,requireManagedAndroidAdbAddressing:()=>k,requireManagedAndroidAdbCommand:()=>A,requireManagedAndroidAdbSerial:()=>D,requireSameAndroidAdbServer:()=>w,requireUnconflictedAndroidAdbSelector:()=>O,serializeAndroidAdbInvocation:()=>_});function i(e){let{replace:t,...n}=e??{};return{installArgs:t?[`-r`]:[],execOptions:n}}const a={"-a":0,"-d":0,"-e":0,"-s":1,"-t":1,"-H":1,"-P":1,"-L":1,"--one-device":1,"--exit-on-write-error":0},o=[``,`usb-`,`local-`,`any-`],s=[`device`,`recovery`,`bootloader`,`sideload`,`sideload-window`],c=[`nodaemon`,`server`,`fork-server`,`kill-server`,`start-server`,`connect`,`disconnect`,`reconnect`,`attach`,`detach`,`pair`],l=new Set(c);function u(e){return e.startsWith(`wait-for-`)}function d(e){if(!u(e))return;let t=e.slice(9);return o.some(e=>t.startsWith(e)&&s.includes(t.slice(e.length)))?e:void 0}function f(e){return l.has(e)}function p(e,t){return{selector:{kind:`serial`,serial:e},server:t===void 0?{kind:`ambient`}:{kind:`port`,port:t}}}function m(){return{selector:{kind:`unspecified`},server:{kind:`ambient`}}}function h(e,t,n){return{target:e,command:t,...n?{rawArgv:n}:{}}}function g(e,t){return{...e,selector:{kind:`serial`,serial:t}}}function _(e){if(e.rawArgv)return[...e.rawArgv];let{target:t,command:n}=e,r=[];return t.server.kind===`port`&&r.push(`-P`,String(t.server.port)),t.selector.kind===`serial`&&r.push(`-s`,t.selector.serial),t.hostGlobals&&r.push(...t.hostGlobals),t.waitFor&&r.push(t.waitFor),r.push(...n),r}const v={"-s":`serial`,"-P":`server`};function y(e,t){let n=e[t],r=d(n);if(r)return{kind:`wait`,waitFor:r,next:t+1};if(u(n))return{kind:`unknown-wait`,token:n,next:t+1};let i=v[n];if(i===void 0){if(!n.startsWith(`-`))return{kind:`stop`,next:t};let r=a[n]??0;return{kind:`global`,tokens:[n,...e.slice(t+1,t+1+r)],next:t+1+r}}let o=e[t+1]??``;if(i===`serial`)return{kind:`serial`,serial:o,next:t+2};let s=Number(o);return Number.isInteger(s)?{kind:`server`,port:s,next:t+2}:{kind:`global`,tokens:[n,o],next:t+2}}function b(e,t){e.kind===`wait`?t.waitFor===void 0?t.waitFor=e.waitFor:t.hostGlobals.push(e.waitFor):e.kind===`unknown-wait`?t.hostGlobals.push(e.token):e.kind===`serial`?t.selector.kind===`unspecified`?t.selector={kind:`serial`,serial:e.serial}:t.selector.serial!==e.serial&&t.hostGlobals.push(`-s`,e.serial):e.kind===`server`?t.server={kind:`port`,port:e.port}:e.kind===`global`&&t.hostGlobals.push(...e.tokens)}function x(e){let t=m(),r={selector:t.selector,server:t.server,waitFor:void 0,hostGlobals:[]},i=0;for(;;){let t=i<e.length?y(e,i):{kind:`stop`,next:i};if(t.kind===`stop`)break;b(t,r),i=t.next}let{selector:a,server:o,waitFor:s,hostGlobals:c}=r,l={selector:a,server:o,...s?{waitFor:s}:{},...c.length>0?{hostGlobals:c}:{}},u=c.length>0||s!==void 0||a.kind!==`unspecified`||o.kind===`port`;return{target:l,command:n(e,0,i),rawArgv:u?e:void 0}}function S(e){if(e.rawArgv===void 0)return e.target.server.kind===`port`?e.target.server.port:void 0}function C(e,t){return w(S(e),t?.serverPort)}function w(e,t){if(e!==void 0&&t!==void 0&&e!==t)throw M(`server`);return e??t}function T(e,t){let r=0;for(;;){let i=r<e.length?y(e,r):{kind:`stop`,next:r};if(i.kind===`stop`)return;if(i.kind===`serial`)return i.serial===t?n(e,r,2):void 0;r=i.next}}function E(e,t){let{target:n,command:r}=e;return k(n,t.port),A(r),h({selector:n.selector,server:{kind:`port`,port:t.port},...n.waitFor?{waitFor:n.waitFor}:{}},r)}function D(e,t){return O(e.selector,t),{...e,selector:{kind:`serial`,serial:t}}}function O(e,t){if(e.kind===`serial`&&e.serial!==t)throw M(`device`)}function k(e,t){if(e.hostGlobals)throw M(`target`);w(t,e.server.kind===`port`?e.server.port:void 0)}function A(e){if(f(e.find(e=>!u(e))??``))throw M(`target`)}const j={device:`Managed ADB transport cannot address another device.`,target:`Managed ADB transport cannot select another target.`,server:`Managed ADB transport cannot select another server.`};function M(e){throw new t(`COMMAND_FAILED`,j[e],{reason:`managed-device-transport-mismatch`})}function N(e,t,n){let{serverPort:r,...i}=t??{},a=C(e,t),o=a===void 0?e:E(e,{port:a}),s=a===void 0?void 0:P(o.target,n,i.env);return{args:_(o),options:{...i,...s===void 0?{}:{env:s}}}}function P(e,t,n){return e.server.kind===`port`?{...t,...n??{},ADB_SERVER_SOCKET:void 0,ANDROID_ADB_SERVER_PORT:String(e.server.port),ANDROID_ADB_SERVER_ADDRESS:`127.0.0.1`}:n}export{T as a,N as c,k as d,D as f,_ as h,h as i,i as l,O as m,g as n,p as o,w as p,m as r,E as s,r as t,x as u};
|
package/dist/src/adb.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime.js";import"./retry.js";import{a as t}from"./adb-executor.js";var
|
|
1
|
+
import{r as e}from"./rolldown-runtime.js";import"./retry.js";import{a as t,d as n,u as r}from"./adb-executor.js";var i=e({isAndroidShellCommandUnsupported:()=>u,reportsAndroidNoShellCommand:()=>l,runAndroidAdb:()=>a,runAndroidExecOut:()=>s,runAndroidShell:()=>o});async function a(e,n,r){return await t(e)(n,r)}async function o(e,r,i){return await n(t(e),r,i)}async function s(e,n,i){return await r(t(e),n,i)}const c=`no shell command implementation`;function l(e){return e.toLowerCase().includes(c)}function u(e,t){let n=`${e}\n${t}`.toLowerCase();return n.includes(c)||n.includes(`unknown command`)}export{s as a,a as i,u as n,o,l as r,i as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime.js";import{
|
|
1
|
+
import{r as e}from"./rolldown-runtime.js";import{ir as t}from"./sdk-batch.js";import{r as n}from"./diagnostics.js";import{c as r}from"./owner-identity.js";import"./diagnostics2.js";import{n as i}from"./process.js";import{_ as a,d as o}from"./host-file.js";import"./agent-browser-process-record.js";import s from"node:path";var c=e({DEFAULT_AGENT_BROWSER_IDLE_TIMEOUT_MS:()=>l,cleanupManagedAgentBrowserOrphans:()=>f,cleanupManagedAgentBrowserOrphansForProviderStartup:()=>p,resolveAgentBrowserIdleTimeoutMs:()=>d});const l=3e5,u=new Map;function d(e){return m(e.AGENT_BROWSER_IDLE_TIMEOUT_MS)??m(e.AGENT_DEVICE_WEB_IDLE_TIMEOUT_MS)??3e5}async function f(e,a,o={}){let s=t((o.openWebSessionNames??[]).filter(e=>e.length>0));if(s.length>0)return h(`open-web-session`,{openWebSessionNames:s});let c=d(r()),l=_(e);if(l!==void 0&&Date.now()-l<c)return h(`recent-browser-activity`,{idleTimeoutMs:c,latestActivityMs:l});let u=o.ownedProcessRecords;if(!u)return g();let f=await i(u,{openWebSessionNames:s,purposes:[`managed-web-browser`],termTimeoutMs:1500,killTimeoutMs:1e3}),p=[...f.terminatedPids];return f.inspected>0&&n({level:`warn`,phase:`web_agent_browser_orphan_cleanup`,data:{reason:a,count:f.inspected,pids:[...f.inspectedPids],signalPids:p,ownershipLostPids:[...f.ownershipLostPids],stateDir:e.stateDir,installDir:e.installDir}}),{count:f.inspected,pids:[...f.inspectedPids],processes:[],signalPids:p}}async function p(e,t={}){let n=Date.now(),r=s.resolve(e.stateDir),i=u.get(r);if(!(i!==void 0&&n-i<3e4))return u.set(r,n),await f(e,`provider-startup`,t)}function m(e){if(e===void 0||e.trim()===``)return;let t=Number.parseInt(e,10);return Number.isInteger(t)&&t>0?t:void 0}function h(e,t){return{count:0,pids:[],processes:[],signalPids:[],skipped:{reason:e,...t}}}function g(){return{count:0,pids:[],processes:[],signalPids:[]}}function _(e){let t=v(e.socketDir).map(e=>y(e)).filter(e=>e!==void 0);return t.length>0?Math.max(...t):void 0}function v(e){try{return a(e).map(t=>s.join(e,t))}catch{return[]}}function y(e){try{return o(e).mtimeMs}catch{return}}export{p as n,d as r,c as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime.js";import{
|
|
1
|
+
import{r as e}from"./rolldown-runtime.js";import{ir as t}from"./sdk-batch.js";import{f as n,g as r,o as i,x as a,y as o}from"./owner-identity.js";import{_ as s}from"./exec.js";import"./command.js";import"./process.js";import c from"node:path";import l from"node:crypto";var u=e({agentBrowserChromeLaunchMarker:()=>d,appendAgentDeviceChromeArgs:()=>f,inspectManagedAgentBrowserProcesses:()=>_,matchAgentBrowserChromeProcess:()=>p,recordManagedAgentBrowserProcesses:()=>v,summarizeAgentBrowserProcesses:()=>m,summarizeManagedAgentBrowserProcesses:()=>g});function d(e){let t=l.createHash(`sha256`);return t.update(c.resolve(e.stateDir)),t.update(`\0`),t.update(c.resolve(e.installDir)),`--agent-device-managed-web=${t.digest(`hex`).slice(0,16)}`}function f(e,t){let n=d(t),r=e?.trim();return r?x(r).includes(n)?r:`${r},${n}`:n}function p(e,t){if(!(e.pid===n()||!S(e.command))){if(e.command.includes(d(t)))return{process:e,reason:`launch-marker`};if(w(t).some(t=>T(e,t)))return{process:e,reason:`managed-browser-home`}}}function m(e,t){return b(e,e=>p(e,t))}function h(e,t){return p(e,t)??C(e,t)}function g(e,t){return b(e,e=>h(e,t))}async function _(e){return m(await y(),e)}async function v(e,t){let n=await y(),r=g(n,e),s=i(r.pids,n),c={count:s.length,pids:s.map(({pid:e})=>e),processes:s.map(t=>({process:t,reason:h(t,e)?.reason??`descendant`}))},l=c.processes.flatMap(({process:e})=>{let t=a(e.pid),n=o(e.pid);return t&&n?[{pid:e.pid,startTime:t,command:n,purpose:`managed-web-browser`}]:[]});return l.length>0&&t.replace({kind:`daemon`},l),c}async function y(){return await s(async()=>await r({timeoutMs:1500}))}function b(e,t){let n=e.flatMap(e=>{let n=t(e);return n?[n]:[]});return{count:n.length,pids:n.map(e=>e.process.pid),processes:n}}function x(e){return e.split(/[,\n]/).map(e=>e.trim()).filter(Boolean)}function S(e){return/\b(?:Google Chrome for Testing|Chrome for Testing|Chromium|chrome|chrome\.exe|chromium|chromium-browser|headless_shell)\b/i.test(e)}function C(e,t){if(e.pid===n()||S(e.command))return;let r=E(e.command),i=E(c.resolve(t.installDir));return r.includes(`${i}/`)?{process:e,reason:`agent-browser-daemon`}:void 0}function w(e){return t([c.join(e.homeDir,`.agent-browser`,`browsers`),c.join(e.runtimeHomeDir,`.agent-browser`,`browsers`)])}function T(e,t){let n=E(e.command),r=`${E(c.resolve(t)).replace(/\/+$/,``)}/`;return n.includes(r)}function E(e){return e.replaceAll(`\\`,`/`)}export{v as i,f as n,_ as r,u as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{C as e}from"./sdk-contracts.js";import{D as t}from"./sdk-batch-runner.js";import{t as n}from"./scroll-gesture.js";import{r}from"./diagnostics.js";import{d as i}from"./owner-identity.js";import{n as a}from"./exec.js";import{t as o}from"./timeouts.js";import"./diagnostics2.js";import"./command.js";import"./retry.js";import"./process.js";import{n as s}from"./audio-probe-result.js";import{i as c}from"./agent-browser-process-record.js";import{n as l}from"./agent-browser-lifecycle.js";import{i as ee,n as u,r as te}from"./agent-browser-tool.js";function d(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function f(e,t){return d(e)?e[t]:void 0}function p(e,t){let n=f(e,t);return typeof n==`string`?n:void 0}function ne(e,t){let n=f(e,t);return typeof n==`boolean`?n:void 0}function m(e,t){let n=e[t];return typeof n==`number`&&Number.isFinite(n)?n:void 0}const re=[g,_,v,y,b,x,S,C,w,T,E,D,O,k,A,j,M];function ie(e){let t=re.map(e=>`${e.toString()};`).join(``),n=oe(e.action),r=h(e.durationMs),i=h(e.bucketMs);return`(()=>{${t}return ${M.name}({action:${n},durationMs:${r},bucketMs:${i}})})()`}function ae(e){let t=s(se(e),{source:`media-elements`,backend:`agent-browser`,durationMs:0,elapsedMs:0,bucketMs:1e3,activeFallback:!1,mediaElementCount:0,sourceCount:0});return{...t,source:`media-elements`,mediaElementCount:t.mediaElementCount??0}}function oe(e){switch(e){case`start`:return`'start'`;case`stop`:return`'stop'`;default:return`'status'`}}function h(e){return e===void 0||!Number.isFinite(e)?`undefined`:String(Math.trunc(e))}function g(e){return!Number.isFinite(e)||e<=0?-90:Math.max(-90,Math.min(0,Math.round(20*Math.log10(e))))}function _(e,t){e.notes.includes(t)||e.notes.push(t)}function v(){return Array.from(document.querySelectorAll(`audio,video`))}function y(e,t){if(!e||e.state===`stopped`)return e;clearInterval(e.timer),clearTimeout(e.timeout),e.timer=void 0,e.timeout=void 0,e.state=`stopped`,e.active=!1,e.reason=t,e.stoppedAt=Date.now();for(let t of e.analysers)try{t.analyser.disconnect(),t.source.disconnect(),t.audible&&t.source.connect(e.context.destination)}catch{}if(e.resumeOnGesture){for(let t of[`click`,`pointerdown`,`keydown`])window.removeEventListener(t,e.resumeOnGesture,!0);e.resumeOnGesture=void 0}return e}function b(e){let t=window.AudioContext||window.webkitAudioContext;if(!t)return;let n=window[e];if(n&&n.state!==`closed`)return n;let r=new t;return window[e]=r,r}function x(e,t,n){if(!(!t.currentSrc&&!t.src&&t.readyState===0))try{window[n]||(window[n]=new WeakMap);let r=window[n].get(t);return r||(r=e.context.createMediaElementSource(t),window[n].set(t,r)),r.disconnect(),{source:r,audible:!0}}catch{return}}function S(e,t){if(!(!t||typeof t.getAudioTracks!=`function`)&&t.getAudioTracks().length!==0)return{source:e.context.createMediaStreamSource(t),audible:!1}}function C(e,t){if(typeof t.captureStream==`function`)return S(e,t.captureStream())}function w(e,t){let n=e.context.createAnalyser();n.fftSize=2048,t.source.connect(n),n.connect(t.audible?e.context.destination:e.sink),e.analysers.push({...t,analyser:n,buffer:new Float32Array(n.fftSize)})}function T(e,t){let n=v();e.mediaElementCount=n.length;for(let r of n){if(e.seen.has(r))continue;let n=S(e,r.srcObject)??C(e,r)??x(e,r,t);if(!n){_(e,`Some media elements do not expose capturable audio to Web Audio.`);continue}e.seen.add(r),w(e,n)}e.sourceCount=e.analysers.length,e.sourceCount===0&&_(e,`No capturable page media audio sources were found yet.`)}function E(e){let t=0,n=0,r=0;for(let i of e.analysers){i.analyser.getFloatTimeDomainData(i.buffer);for(let e of i.buffer)t+=e*e,n+=1,r=Math.max(r,Math.abs(e))}return{rms:n>0?Math.sqrt(t/n):0,peak:r}}function D(e){let t=Math.ceil(e.durationMs/e.bucketMs)+2;e.rmsDbfs.length>t&&e.rmsDbfs.splice(0,e.rmsDbfs.length-t),e.peakDbfs.length>t&&e.peakDbfs.splice(0,e.peakDbfs.length-t)}function O(e,t){if(!e||e.state!==`running`)return;T(e,t);let n=E(e),r=g(n.rms),i=g(n.peak);e.rmsDbfs.push(r),e.peakDbfs.push(i),e.heard=e.heard||r>-90||i>-90,D(e),Date.now()-e.startedAt>=e.durationMs&&y(e,`duration`)}function k(e,t){return{audio:`probe`,state:`stopped`,active:!1,heard:!1,source:`media-elements`,backend:`agent-browser`,durationMs:Number(e.durationMs)||1e4,elapsedMs:0,bucketMs:Number(e.bucketMs)||1e3,sampleCount:0,mediaElementCount:v().length,sourceCount:0,rmsDbfs:[],peakDbfs:[],notes:t}}function A(e,t,n,r){return e?{audio:`probe`,state:e.state,active:e.state===`running`,heard:e.heard,source:`media-elements`,backend:`agent-browser`,durationMs:e.durationMs,elapsedMs:Math.max(0,Math.min((e.stoppedAt||Date.now())-e.startedAt,e.durationMs)),bucketMs:e.bucketMs,sampleCount:e.rmsDbfs.length,mediaElementCount:v().length,sourceCount:e.sourceCount,rmsDbfs:e.rmsDbfs.slice(),peakDbfs:e.peakDbfs.slice(),startedAt:new Date(e.startedAt).toISOString(),stoppedAt:e.stoppedAt?new Date(e.stoppedAt).toISOString():void 0,reason:e.reason,notes:[n,r,...e.notes]}:k(t,[n,r])}function j(e,t,n,r,i,a,o){t&&y(t,`restarted`);let s=b(r);if(!s)return k(e,[`Web Audio API is not available in this browser context.`]);let c=s.createGain();c.gain.value=0,c.connect(s.destination);let l={state:`running`,active:!0,context:s,sink:c,seen:new WeakSet,analysers:[],mediaElementCount:0,sourceCount:0,durationMs:Math.max(100,Number(e.durationMs)||1e4),bucketMs:Math.max(100,Number(e.bucketMs)||1e3),startedAt:Date.now(),stoppedAt:void 0,reason:void 0,heard:!1,rmsDbfs:[],peakDbfs:[],notes:[]};try{s.resume()}catch{_(l,`AudioContext could not be resumed by the probe.`)}l.resumeOnGesture=()=>{try{s.resume()}catch{_(l,`AudioContext could not be resumed from a user gesture.`)}};for(let e of[`click`,`pointerdown`,`keydown`])window.addEventListener(e,l.resumeOnGesture,{capture:!0,once:!0});return T(l,i),l.timer=setInterval(()=>O(l,i),l.bucketMs),l.timeout=setTimeout(()=>y(l,`duration`),l.durationMs),window[n]=l,A(l,e,a,o)}function M(e){let t=`__agentDeviceAudioProbe`,n=`__agentDeviceAudioProbeSources`,r=`Audio probe samples HTML media elements exposed to Web Audio; it is not whole-tab or system audio capture.`,i=`URL-backed media elements may be routed through the probe AudioContext while they are observed.`,a=window[t];return a&&a.state===`running`&&Date.now()-a.startedAt>=a.durationMs&&(O(a,n),y(a,`duration`)),e.action===`start`?j(e,a,t,`__agentDeviceAudioProbeContext`,n,r,i):e.action===`stop`?(a&&O(a,n),y(a,`manual`),A(a,e,r,i)):(a&&O(a,n),A(a,e,r,i))}function se(e){return d(e)?d(e.result)?e.result:e:{}}function ce(e,t={}){let n=le(e),r=pe(t.limit),i=t.include===`headers`||t.include===`all`,a=n.slice(-r).reverse().map(e=>de(e,i)),o=t.include===`body`||t.include===`all`?[`agent-browser network requests does not expose request or response bodies.`]:void 0;return{entries:a,backend:`agent-browser`,redacted:!1,...o?{notes:o}:{}}}function le(e){let t=d(e)&&Array.isArray(e.requests)?e.requests:e;return Array.isArray(t)?t.filter(ue).map(e=>({headers:N(e.headers),method:p(e,`method`),mimeType:p(e,`mimeType`),requestId:p(e,`requestId`),resourceType:p(e,`resourceType`),responseHeaders:N(e.responseHeaders),status:m(e,`status`),timestamp:fe(e.timestamp),url:p(e,`url`)})):[]}function ue(e){return d(e)}function de(e,n){let r=e.timestamp===void 0?void 0:P(e.timestamp),i=t({requestId:e.requestId,resourceType:e.resourceType,mimeType:e.mimeType});return t({timestamp:r,method:e.method,url:e.url,status:e.status,requestHeaders:n?e.headers:void 0,responseHeaders:n?e.responseHeaders:void 0,metadata:Object.keys(i).length>0?i:void 0})}function N(e){if(!d(e))return;let t={};for(let[n,r]of Object.entries(e))typeof r==`string`&&(t[n]=r);return Object.keys(t).length>0?t:void 0}function fe(e){if(typeof e==`number`||typeof e==`string`)return e}function P(e){if(typeof e==`string`){let t=Number(e);return Number.isFinite(t)?P(t):e}let t=e>1e10?e:e*1e3,n=new Date(t);return Number.isNaN(n.getTime())?String(e):n.toISOString()}function pe(e){return typeof e!=`number`||!Number.isInteger(e)?25:Math.max(1,Math.min(e,200))}async function me(e,t){let n=F(p(e,`snapshot`)??``,R(f(e,`refs`)));return t&&await he(n,t),{nodes:n.map((e,t)=>({...e.node,index:t,ref:e.ref})),truncated:ne(e,`truncated`)}}async function he(e,t){for(let n=0;n<e.length;n+=8){let r=e.slice(n,n+8),i=await Promise.all(r.map(e=>t(e.ref)));for(let[e,t]of i.entries())t&&(r[e].node.rect=t)}}function F(e,t){let n=new Map(t.map(e=>[e.ref,e])),r=[],i=new Set,a=new Map;for(let t of e.split(/\r?\n/)){let e=ve(t);if(!e)continue;i.add(e);let o=n.get(e)?.data,s=ge(t),c=I(t,o,s),l=_e(a,s);l!==void 0&&(c.parentIndex=l),r.push({ref:e,node:{...c,index:r.length}}),a.set(s,r.length-1)}for(let e of t)i.has(e.ref)||r.push({ref:e.ref,node:{...L(e.data),index:r.length}});return r}function I(e,t,n){let r=ye(e)??V(t,[`role`,`type`]);return{index:0,type:r,role:r,label:be(e)??V(t,[`label`,`name`,`text`]),value:Se(e)??V(t,[`value`]),depth:n,enabled:H(t,[`enabled`])??(!xe(e)&&void 0),focused:H(t,[`focused`])}}function L(e){let t=V(e,[`role`,`type`]);return{index:0,type:t,role:t,label:V(e,[`label`,`name`,`text`]),value:V(e,[`value`]),enabled:H(e,[`enabled`]),focused:H(e,[`focused`])}}function R(e){return Array.isArray(e)?e.flatMap(e=>{let t=d(e)?e:void 0,n=B(V(t,[`ref`,`id`])??String(e));return n?[{ref:n,data:t}]:[]}):d(e)?Object.entries(e).flatMap(([e,t])=>{let n=B(e);return n?[{ref:n,data:d(t)?t:void 0}]:[]}):[]}function ge(e){let t=e.match(/^\s*/)?.[0].length??0;return Math.floor(t/2)}function _e(e,t){for(let n=t-1;n>=0;--n){let t=e.get(n);if(t!==void 0)return t}}function ve(e){return B(z(e)?.match(/\bref\s*=\s*['"]?(@?e\d+)['"]?/i)?.[1]??e.match(/@?(e\d+)\b/i)?.[1])}function z(e){return e.replaceAll(/"(?:[^"\\]|\\.)*"/g,`""`).replaceAll(/'(?:[^'\\]|\\.)*'/g,`''`).match(/\[([^\]]*\bref\s*=\s*['"]?@?e\d+[^\]]*)\]\s*(?=:|$)/i)?.[1]}function B(e){let t=e?.trim().replace(/^@/,``);return t&&/^e\d+$/i.test(t)?t.toLowerCase():null}function ye(e){return e.replaceAll(/\[[^\]]*ref[^\]]*\]/gi,``).replaceAll(/@?e\d+\b/gi,``).replaceAll(/^[\s|├└─>*-]+/g,``).trim().match(/^([A-Za-z][\w-]*)\b/)?.[1]}function be(e){return e.match(/"([^"]+)"/)?.[1]??e.match(/'([^']+)'/)?.[1]}function xe(e){return/\bdisabled\b/i.test(z(e)??``)}function Se(e){return Ce(e)??e.match(/\bvalue=(?:"([^"]*)"|'([^']*)'|([^\s\]]+))/i)?.slice(1).find(U)??e.match(/\bvalue:\s*(?:"([^"]*)"|'([^']*)'|([^\s\]]+))/i)?.slice(1).find(U)}function Ce(e){return e.match(/\]\s*:\s*(.+)$/)?.[1]?.trim()||void 0}function V(e,t){if(e)for(let n of t){let t=e[n];if(typeof t==`string`&&t.length>0)return t}}function H(e,t){if(e)for(let n of t){let t=e[n];if(typeof t==`boolean`)return t}}function U(e){return typeof e==`string`}const W=`agent-browser`,G="Run `agent-device web setup` to install the managed web backend.";function we(e={}){let t=e.session?.trim(),n=async(n,r)=>await Pe(n,{session:t,options:e,signal:r});return{async open(e){await n([`open`,e])},async close(){await n([`close`])},async startRecording(e){await n([`record`,`start`,e])},async stopRecording(){await n([`record`,`stop`])},async snapshot(e){return await Ae(t=>n(t,e?.signal),e)},async screenshot(e,t){await n([`screenshot`,...t?.fullscreen?[`--full`]:[],e])},async setViewport(e,t){await n([`set`,`viewport`,String(e),String(t)])},async click(e,t){await K(n,e,t)},async hover(e,t){await q(n,e,t)},async hoverRef(e){await n([`hover`,Z(e)])},async clickRef(e){await n([`click`,Z(e)])},async fill(e,t,r){if(await K(n,e,t),await n([`press`,He()]),r.length===0){await n([`press`,`Backspace`]);return}await n([`keyboard`,`type`,r])},async fillRef(e,t){await n([`fill`,Z(e),t])},async typeText(e){await n([`keyboard`,`type`,e])},async scroll(e,t){return await Te(n,e,t),t?.durationMs===void 0?{}:{durationMs:t.durationMs}},async dumpNetwork(e){return ce(await n([`network`,`requests`]),e)},async probeAudio(e){return ae(await n([`eval`,ie(e)]))}}}async function Te(e,t,n){let r=De(Ee(n));for(let n of r)await e(ke(t,n.distance)),n.delayAfterMs>0&&await o(n.delayAfterMs)}function Ee(e){let t=e?.durationMs,r=t===void 0?{}:{durationMs:t};return e?.pixels===void 0?e?.amount===void 0?r:{distance:Math.max(1,Math.round(300*e.amount/n)),...r}:{distance:e.pixels,...r}}function De(e){let{distance:t,durationMs:n}=e;if(n===void 0||n<=0)return[{distance:t,delayAfterMs:0}];let r=Math.max(1,Math.min(20,Math.ceil(n/50))),i=n/Math.max(1,r-1);return Oe(Math.round(t??300),r).map((e,t)=>({distance:e,delayAfterMs:t<r-1?i:0}))}function Oe(e,t){let n=Math.floor(e/t),r=e-n*t;return Array.from({length:t},(e,t)=>t<r?n+1:n)}function ke(e,t){return[`scroll`,e,...t===void 0?[]:[String(t)]]}async function K(e,t,n){await q(e,t,n),await e([`mouse`,`down`]),await e([`mouse`,`up`])}async function q(e,t,n){await e([`mouse`,`move`,String(Math.round(t)),String(Math.round(n))])}async function Ae(e,t){return await me(await e(je(t)),t?.includeRects?async t=>await Me(e,t):void 0)}function je(e){return[`snapshot`,...e?.interactiveOnly?[`--interactive`]:[],...e?.raw?[]:[`--compact`],...typeof e?.depth==`number`?[`--depth`,String(e.depth)]:[],...e?.scope?[`--selector`,e.scope]:[]]}async function Me(e,t){try{return Ue(await e([`get`,`box`,Z(t)]))}catch(e){if(Ne(e))return;throw e}}function Ne(e){let t=e instanceof Error?e.message:String(e);return!/\bstale\b/i.test(t)&&/\bbox\b|not visible|not found|no element/i.test(t)}async function Pe(e,t){let{session:n,options:r,signal:i}=t,a=[...e,`--json`,...n?[`--session`,n]:[]];return await Fe(a,r,e=>Re(ze(e.stdout,e.stderr,a,e.exitCode),e,a),i)}async function Fe(e,t,n,r){let i=``,a=``,o=0,s=!1,c=!1,l=u({stateDir:t.stateDir});try{await Le(t);let n=await ee(e,{stateDir:t.stateDir,allowFailure:!0,timeoutMs:3e4,signal:r});i=n.stdout,a=n.stderr,o=n.exitCode,s=!0}catch(n){throw await J({cliArgs:e,commandCompleted:s,exitCode:o,semanticSuccess:c,options:t,status:l}),Be(n,e)}try{let e=n({stdout:i,stderr:a,exitCode:o});return c=!0,e}finally{await J({cliArgs:e,commandCompleted:s,exitCode:o,semanticSuccess:c,options:t,status:l})}}async function J(e){let t=e.options.ownedProcessRecords;if(!(!t||!e.status.installed))try{let n=e.options.openWebSessionNames?.()??[],r=e.options.session?.trim();Ie(e,n.filter(e=>e!==r).length)?t.clear({kind:`daemon`}):await c(e.status,t)}catch(e){r({level:`warn`,phase:`web_agent_browser_process_record_failed`,data:{error:e instanceof Error?e.message:String(e)}})}}function Ie(e,t){return e.commandCompleted&&e.semanticSuccess&&e.cliArgs[0]===`close`&&e.exitCode===0&&t===0}async function Le(e){if(!e.openWebSessionNames)return;let t=u({stateDir:e.stateDir});if(t.installed)try{await l(t,{openWebSessionNames:e.openWebSessionNames(),...e.ownedProcessRecords===void 0?{}:{ownedProcessRecords:e.ownedProcessRecords}})}catch(e){r({level:`warn`,phase:`web_agent_browser_provider_orphan_cleanup_failed`,data:{error:e instanceof Error?e.message:String(e)}})}}function Re(t,n,r){if(!d(t))return t;if((t.success??t.ok)===!1)throw new e(Ve(t.code),X(t),{cmd:W,args:r,hint:p(t,`hint`)??G,agentBrowserError:t.error});if(n.exitCode!==0)throw new e(`COMMAND_FAILED`,`agent-browser command failed`,a(n,{cmd:W,args:r,stdout:n.stdout.slice(0,500),stderr:n.stderr.slice(0,500),hint:p(t,`hint`)??G}));return Object.hasOwn(t,`data`)?t.data:t}function ze(t,n,r,i){try{return JSON.parse(t)}catch(a){let o=i!==0;throw new e(`COMMAND_FAILED`,o?`agent-browser command failed`:`agent-browser returned invalid JSON`,{cmd:W,args:r,...o?{exitCode:i}:{},stdout:t.slice(0,500),stderr:n.slice(0,500),hint:G},a instanceof Error?a:void 0)}}function Be(t,n){let r=te(t);return r.code===`TOOL_MISSING`?new e(`TOOL_MISSING`,r.message,{...r.details??{},cmd:W,args:n,hint:Y(r)},r):r.code===`COMMAND_FAILED`?new e(`COMMAND_FAILED`,r.message,{...r.details??{},cmd:W,args:n,hint:Y(r)},r):r}function Y(e){return typeof e.details?.hint==`string`?e.details.hint:G}function X(e){let t=e.error;if(typeof t==`string`&&t.trim())return t.trim();if(d(t)){let e=p(t,`message`)??p(t,`error`);if(e)return e}return p(e,`message`)??`agent-browser command failed`}function Ve(e){return typeof e==`string`&&e.length>0?e:`COMMAND_FAILED`}function Z(e){return e.startsWith(`@`)?e:`@${e}`}function He(){return i()===`darwin`?`Meta+a`:`Control+a`}function Ue(e){let t=d(e)&&d(e.box)?e.box:e;if(d(t))return We(t)??Ge(t)}function We(e){return Q(m(e,`x`),m(e,`y`),m(e,`width`),m(e,`height`))}function Ge(e){let t=m(e,`left`),n=m(e,`top`),r=m(e,`right`),i=m(e,`bottom`);return Q(t,n,$(r,t),$(i,n))}function Q(e,t,n,r){if(e!==void 0&&t!==void 0&&n!==void 0&&r!==void 0)return{x:e,y:t,width:n,height:r}}function $(e,t){return e===void 0||t===void 0?void 0:e-t}export{we as createAgentBrowserWebProvider};
|
|
1
|
+
import{D as e}from"./sdk-contracts.js";import{O as t}from"./sdk-batch-runner.js";import{t as n}from"./scroll-gesture.js";import{r}from"./diagnostics.js";import{d as i}from"./owner-identity.js";import{n as a}from"./exec.js";import{t as o}from"./timeouts.js";import"./diagnostics2.js";import"./command.js";import"./retry.js";import"./process.js";import{n as s}from"./audio-probe-result.js";import{i as c}from"./agent-browser-process-record.js";import{n as l}from"./agent-browser-lifecycle.js";import{i as ee,n as u,r as te}from"./agent-browser-tool.js";function d(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function f(e,t){return d(e)?e[t]:void 0}function p(e,t){let n=f(e,t);return typeof n==`string`?n:void 0}function ne(e,t){let n=f(e,t);return typeof n==`boolean`?n:void 0}function m(e,t){let n=e[t];return typeof n==`number`&&Number.isFinite(n)?n:void 0}const re=[g,_,v,y,b,x,S,C,w,T,E,D,O,k,A,j,M];function ie(e){let t=re.map(e=>`${e.toString()};`).join(``),n=oe(e.action),r=h(e.durationMs),i=h(e.bucketMs);return`(()=>{${t}return ${M.name}({action:${n},durationMs:${r},bucketMs:${i}})})()`}function ae(e){let t=s(se(e),{source:`media-elements`,backend:`agent-browser`,durationMs:0,elapsedMs:0,bucketMs:1e3,activeFallback:!1,mediaElementCount:0,sourceCount:0});return{...t,source:`media-elements`,mediaElementCount:t.mediaElementCount??0}}function oe(e){switch(e){case`start`:return`'start'`;case`stop`:return`'stop'`;default:return`'status'`}}function h(e){return e===void 0||!Number.isFinite(e)?`undefined`:String(Math.trunc(e))}function g(e){return!Number.isFinite(e)||e<=0?-90:Math.max(-90,Math.min(0,Math.round(20*Math.log10(e))))}function _(e,t){e.notes.includes(t)||e.notes.push(t)}function v(){return Array.from(document.querySelectorAll(`audio,video`))}function y(e,t){if(!e||e.state===`stopped`)return e;clearInterval(e.timer),clearTimeout(e.timeout),e.timer=void 0,e.timeout=void 0,e.state=`stopped`,e.active=!1,e.reason=t,e.stoppedAt=Date.now();for(let t of e.analysers)try{t.analyser.disconnect(),t.source.disconnect(),t.audible&&t.source.connect(e.context.destination)}catch{}if(e.resumeOnGesture){for(let t of[`click`,`pointerdown`,`keydown`])window.removeEventListener(t,e.resumeOnGesture,!0);e.resumeOnGesture=void 0}return e}function b(e){let t=window.AudioContext||window.webkitAudioContext;if(!t)return;let n=window[e];if(n&&n.state!==`closed`)return n;let r=new t;return window[e]=r,r}function x(e,t,n){if(!(!t.currentSrc&&!t.src&&t.readyState===0))try{window[n]||(window[n]=new WeakMap);let r=window[n].get(t);return r||(r=e.context.createMediaElementSource(t),window[n].set(t,r)),r.disconnect(),{source:r,audible:!0}}catch{return}}function S(e,t){if(!(!t||typeof t.getAudioTracks!=`function`)&&t.getAudioTracks().length!==0)return{source:e.context.createMediaStreamSource(t),audible:!1}}function C(e,t){if(typeof t.captureStream==`function`)return S(e,t.captureStream())}function w(e,t){let n=e.context.createAnalyser();n.fftSize=2048,t.source.connect(n),n.connect(t.audible?e.context.destination:e.sink),e.analysers.push({...t,analyser:n,buffer:new Float32Array(n.fftSize)})}function T(e,t){let n=v();e.mediaElementCount=n.length;for(let r of n){if(e.seen.has(r))continue;let n=S(e,r.srcObject)??C(e,r)??x(e,r,t);if(!n){_(e,`Some media elements do not expose capturable audio to Web Audio.`);continue}e.seen.add(r),w(e,n)}e.sourceCount=e.analysers.length,e.sourceCount===0&&_(e,`No capturable page media audio sources were found yet.`)}function E(e){let t=0,n=0,r=0;for(let i of e.analysers){i.analyser.getFloatTimeDomainData(i.buffer);for(let e of i.buffer)t+=e*e,n+=1,r=Math.max(r,Math.abs(e))}return{rms:n>0?Math.sqrt(t/n):0,peak:r}}function D(e){let t=Math.ceil(e.durationMs/e.bucketMs)+2;e.rmsDbfs.length>t&&e.rmsDbfs.splice(0,e.rmsDbfs.length-t),e.peakDbfs.length>t&&e.peakDbfs.splice(0,e.peakDbfs.length-t)}function O(e,t){if(!e||e.state!==`running`)return;T(e,t);let n=E(e),r=g(n.rms),i=g(n.peak);e.rmsDbfs.push(r),e.peakDbfs.push(i),e.heard=e.heard||r>-90||i>-90,D(e),Date.now()-e.startedAt>=e.durationMs&&y(e,`duration`)}function k(e,t){return{audio:`probe`,state:`stopped`,active:!1,heard:!1,source:`media-elements`,backend:`agent-browser`,durationMs:Number(e.durationMs)||1e4,elapsedMs:0,bucketMs:Number(e.bucketMs)||1e3,sampleCount:0,mediaElementCount:v().length,sourceCount:0,rmsDbfs:[],peakDbfs:[],notes:t}}function A(e,t,n,r){return e?{audio:`probe`,state:e.state,active:e.state===`running`,heard:e.heard,source:`media-elements`,backend:`agent-browser`,durationMs:e.durationMs,elapsedMs:Math.max(0,Math.min((e.stoppedAt||Date.now())-e.startedAt,e.durationMs)),bucketMs:e.bucketMs,sampleCount:e.rmsDbfs.length,mediaElementCount:v().length,sourceCount:e.sourceCount,rmsDbfs:e.rmsDbfs.slice(),peakDbfs:e.peakDbfs.slice(),startedAt:new Date(e.startedAt).toISOString(),stoppedAt:e.stoppedAt?new Date(e.stoppedAt).toISOString():void 0,reason:e.reason,notes:[n,r,...e.notes]}:k(t,[n,r])}function j(e,t,n,r,i,a,o){t&&y(t,`restarted`);let s=b(r);if(!s)return k(e,[`Web Audio API is not available in this browser context.`]);let c=s.createGain();c.gain.value=0,c.connect(s.destination);let l={state:`running`,active:!0,context:s,sink:c,seen:new WeakSet,analysers:[],mediaElementCount:0,sourceCount:0,durationMs:Math.max(100,Number(e.durationMs)||1e4),bucketMs:Math.max(100,Number(e.bucketMs)||1e3),startedAt:Date.now(),stoppedAt:void 0,reason:void 0,heard:!1,rmsDbfs:[],peakDbfs:[],notes:[]};try{s.resume()}catch{_(l,`AudioContext could not be resumed by the probe.`)}l.resumeOnGesture=()=>{try{s.resume()}catch{_(l,`AudioContext could not be resumed from a user gesture.`)}};for(let e of[`click`,`pointerdown`,`keydown`])window.addEventListener(e,l.resumeOnGesture,{capture:!0,once:!0});return T(l,i),l.timer=setInterval(()=>O(l,i),l.bucketMs),l.timeout=setTimeout(()=>y(l,`duration`),l.durationMs),window[n]=l,A(l,e,a,o)}function M(e){let t=`__agentDeviceAudioProbe`,n=`__agentDeviceAudioProbeSources`,r=`Audio probe samples HTML media elements exposed to Web Audio; it is not whole-tab or system audio capture.`,i=`URL-backed media elements may be routed through the probe AudioContext while they are observed.`,a=window[t];return a&&a.state===`running`&&Date.now()-a.startedAt>=a.durationMs&&(O(a,n),y(a,`duration`)),e.action===`start`?j(e,a,t,`__agentDeviceAudioProbeContext`,n,r,i):e.action===`stop`?(a&&O(a,n),y(a,`manual`),A(a,e,r,i)):(a&&O(a,n),A(a,e,r,i))}function se(e){return d(e)?d(e.result)?e.result:e:{}}function ce(e,t={}){let n=le(e),r=pe(t.limit),i=t.include===`headers`||t.include===`all`,a=n.slice(-r).reverse().map(e=>de(e,i)),o=t.include===`body`||t.include===`all`?[`agent-browser network requests does not expose request or response bodies.`]:void 0;return{entries:a,backend:`agent-browser`,redacted:!1,...o?{notes:o}:{}}}function le(e){let t=d(e)&&Array.isArray(e.requests)?e.requests:e;return Array.isArray(t)?t.filter(ue).map(e=>({headers:N(e.headers),method:p(e,`method`),mimeType:p(e,`mimeType`),requestId:p(e,`requestId`),resourceType:p(e,`resourceType`),responseHeaders:N(e.responseHeaders),status:m(e,`status`),timestamp:fe(e.timestamp),url:p(e,`url`)})):[]}function ue(e){return d(e)}function de(e,n){let r=e.timestamp===void 0?void 0:P(e.timestamp),i=t({requestId:e.requestId,resourceType:e.resourceType,mimeType:e.mimeType});return t({timestamp:r,method:e.method,url:e.url,status:e.status,requestHeaders:n?e.headers:void 0,responseHeaders:n?e.responseHeaders:void 0,metadata:Object.keys(i).length>0?i:void 0})}function N(e){if(!d(e))return;let t={};for(let[n,r]of Object.entries(e))typeof r==`string`&&(t[n]=r);return Object.keys(t).length>0?t:void 0}function fe(e){if(typeof e==`number`||typeof e==`string`)return e}function P(e){if(typeof e==`string`){let t=Number(e);return Number.isFinite(t)?P(t):e}let t=e>1e10?e:e*1e3,n=new Date(t);return Number.isNaN(n.getTime())?String(e):n.toISOString()}function pe(e){return typeof e!=`number`||!Number.isInteger(e)?25:Math.max(1,Math.min(e,200))}async function me(e,t){let n=F(p(e,`snapshot`)??``,R(f(e,`refs`)));return t&&await he(n,t),{nodes:n.map((e,t)=>({...e.node,index:t,ref:e.ref})),truncated:ne(e,`truncated`)}}async function he(e,t){for(let n=0;n<e.length;n+=8){let r=e.slice(n,n+8),i=await Promise.all(r.map(e=>t(e.ref)));for(let[e,t]of i.entries())t&&(r[e].node.rect=t)}}function F(e,t){let n=new Map(t.map(e=>[e.ref,e])),r=[],i=new Set,a=new Map;for(let t of e.split(/\r?\n/)){let e=ve(t);if(!e)continue;i.add(e);let o=n.get(e)?.data,s=ge(t),c=I(t,o,s),l=_e(a,s);l!==void 0&&(c.parentIndex=l),r.push({ref:e,node:{...c,index:r.length}}),a.set(s,r.length-1)}for(let e of t)i.has(e.ref)||r.push({ref:e.ref,node:{...L(e.data),index:r.length}});return r}function I(e,t,n){let r=ye(e)??V(t,[`role`,`type`]);return{index:0,type:r,role:r,label:be(e)??V(t,[`label`,`name`,`text`]),value:Se(e)??V(t,[`value`]),depth:n,enabled:H(t,[`enabled`])??(!xe(e)&&void 0),focused:H(t,[`focused`])}}function L(e){let t=V(e,[`role`,`type`]);return{index:0,type:t,role:t,label:V(e,[`label`,`name`,`text`]),value:V(e,[`value`]),enabled:H(e,[`enabled`]),focused:H(e,[`focused`])}}function R(e){return Array.isArray(e)?e.flatMap(e=>{let t=d(e)?e:void 0,n=B(V(t,[`ref`,`id`])??String(e));return n?[{ref:n,data:t}]:[]}):d(e)?Object.entries(e).flatMap(([e,t])=>{let n=B(e);return n?[{ref:n,data:d(t)?t:void 0}]:[]}):[]}function ge(e){let t=e.match(/^\s*/)?.[0].length??0;return Math.floor(t/2)}function _e(e,t){for(let n=t-1;n>=0;--n){let t=e.get(n);if(t!==void 0)return t}}function ve(e){return B(z(e)?.match(/\bref\s*=\s*['"]?(@?e\d+)['"]?/i)?.[1]??e.match(/@?(e\d+)\b/i)?.[1])}function z(e){return e.replaceAll(/"(?:[^"\\]|\\.)*"/g,`""`).replaceAll(/'(?:[^'\\]|\\.)*'/g,`''`).match(/\[([^\]]*\bref\s*=\s*['"]?@?e\d+[^\]]*)\]\s*(?=:|$)/i)?.[1]}function B(e){let t=e?.trim().replace(/^@/,``);return t&&/^e\d+$/i.test(t)?t.toLowerCase():null}function ye(e){return e.replaceAll(/\[[^\]]*ref[^\]]*\]/gi,``).replaceAll(/@?e\d+\b/gi,``).replaceAll(/^[\s|├└─>*-]+/g,``).trim().match(/^([A-Za-z][\w-]*)\b/)?.[1]}function be(e){return e.match(/"([^"]+)"/)?.[1]??e.match(/'([^']+)'/)?.[1]}function xe(e){return/\bdisabled\b/i.test(z(e)??``)}function Se(e){return Ce(e)??e.match(/\bvalue=(?:"([^"]*)"|'([^']*)'|([^\s\]]+))/i)?.slice(1).find(U)??e.match(/\bvalue:\s*(?:"([^"]*)"|'([^']*)'|([^\s\]]+))/i)?.slice(1).find(U)}function Ce(e){return e.match(/\]\s*:\s*(.+)$/)?.[1]?.trim()||void 0}function V(e,t){if(e)for(let n of t){let t=e[n];if(typeof t==`string`&&t.length>0)return t}}function H(e,t){if(e)for(let n of t){let t=e[n];if(typeof t==`boolean`)return t}}function U(e){return typeof e==`string`}const W=`agent-browser`,G="Run `agent-device web setup` to install the managed web backend.";function we(e={}){let t=e.session?.trim(),n=async(n,r)=>await Pe(n,{session:t,options:e,signal:r});return{async open(e){await n([`open`,e])},async close(){await n([`close`])},async startRecording(e){await n([`record`,`start`,e])},async stopRecording(){await n([`record`,`stop`])},async snapshot(e){return await Ae(t=>n(t,e?.signal),e)},async screenshot(e,t){await n([`screenshot`,...t?.fullscreen?[`--full`]:[],e])},async setViewport(e,t){await n([`set`,`viewport`,String(e),String(t)])},async click(e,t){await K(n,e,t)},async hover(e,t){await q(n,e,t)},async hoverRef(e){await n([`hover`,Z(e)])},async clickRef(e){await n([`click`,Z(e)])},async fill(e,t,r){if(await K(n,e,t),await n([`press`,He()]),r.length===0){await n([`press`,`Backspace`]);return}await n([`keyboard`,`type`,r])},async fillRef(e,t){await n([`fill`,Z(e),t])},async typeText(e){await n([`keyboard`,`type`,e])},async scroll(e,t){return await Te(n,e,t),t?.durationMs===void 0?{}:{durationMs:t.durationMs}},async dumpNetwork(e){return ce(await n([`network`,`requests`]),e)},async probeAudio(e){return ae(await n([`eval`,ie(e)]))}}}async function Te(e,t,n){let r=De(Ee(n));for(let n of r)await e(ke(t,n.distance)),n.delayAfterMs>0&&await o(n.delayAfterMs)}function Ee(e){let t=e?.durationMs,r=t===void 0?{}:{durationMs:t};return e?.pixels===void 0?e?.amount===void 0?r:{distance:Math.max(1,Math.round(300*e.amount/n)),...r}:{distance:e.pixels,...r}}function De(e){let{distance:t,durationMs:n}=e;if(n===void 0||n<=0)return[{distance:t,delayAfterMs:0}];let r=Math.max(1,Math.min(20,Math.ceil(n/50))),i=n/Math.max(1,r-1);return Oe(Math.round(t??300),r).map((e,t)=>({distance:e,delayAfterMs:t<r-1?i:0}))}function Oe(e,t){let n=Math.floor(e/t),r=e-n*t;return Array.from({length:t},(e,t)=>t<r?n+1:n)}function ke(e,t){return[`scroll`,e,...t===void 0?[]:[String(t)]]}async function K(e,t,n){await q(e,t,n),await e([`mouse`,`down`]),await e([`mouse`,`up`])}async function q(e,t,n){await e([`mouse`,`move`,String(Math.round(t)),String(Math.round(n))])}async function Ae(e,t){return await me(await e(je(t)),t?.includeRects?async t=>await Me(e,t):void 0)}function je(e){return[`snapshot`,...e?.interactiveOnly?[`--interactive`]:[],...e?.raw?[]:[`--compact`],...typeof e?.depth==`number`?[`--depth`,String(e.depth)]:[],...e?.scope?[`--selector`,e.scope]:[]]}async function Me(e,t){try{return Ue(await e([`get`,`box`,Z(t)]))}catch(e){if(Ne(e))return;throw e}}function Ne(e){let t=e instanceof Error?e.message:String(e);return!/\bstale\b/i.test(t)&&/\bbox\b|not visible|not found|no element/i.test(t)}async function Pe(e,t){let{session:n,options:r,signal:i}=t,a=[...e,`--json`,...n?[`--session`,n]:[]];return await Fe(a,r,e=>Re(ze(e.stdout,e.stderr,a,e.exitCode),e,a),i)}async function Fe(e,t,n,r){let i=``,a=``,o=0,s=!1,c=!1,l=u({stateDir:t.stateDir});try{await Le(t);let n=await ee(e,{stateDir:t.stateDir,allowFailure:!0,timeoutMs:3e4,signal:r});i=n.stdout,a=n.stderr,o=n.exitCode,s=!0}catch(n){throw await J({cliArgs:e,commandCompleted:s,exitCode:o,semanticSuccess:c,options:t,status:l}),Be(n,e)}try{let e=n({stdout:i,stderr:a,exitCode:o});return c=!0,e}finally{await J({cliArgs:e,commandCompleted:s,exitCode:o,semanticSuccess:c,options:t,status:l})}}async function J(e){let t=e.options.ownedProcessRecords;if(!(!t||!e.status.installed))try{let n=e.options.openWebSessionNames?.()??[],r=e.options.session?.trim();Ie(e,n.filter(e=>e!==r).length)?t.clear({kind:`daemon`}):await c(e.status,t)}catch(e){r({level:`warn`,phase:`web_agent_browser_process_record_failed`,data:{error:e instanceof Error?e.message:String(e)}})}}function Ie(e,t){return e.commandCompleted&&e.semanticSuccess&&e.cliArgs[0]===`close`&&e.exitCode===0&&t===0}async function Le(e){if(!e.openWebSessionNames)return;let t=u({stateDir:e.stateDir});if(t.installed)try{await l(t,{openWebSessionNames:e.openWebSessionNames(),...e.ownedProcessRecords===void 0?{}:{ownedProcessRecords:e.ownedProcessRecords}})}catch(e){r({level:`warn`,phase:`web_agent_browser_provider_orphan_cleanup_failed`,data:{error:e instanceof Error?e.message:String(e)}})}}function Re(t,n,r){if(!d(t))return t;if((t.success??t.ok)===!1)throw new e(Ve(t.code),X(t),{cmd:W,args:r,hint:p(t,`hint`)??G,agentBrowserError:t.error});if(n.exitCode!==0)throw new e(`COMMAND_FAILED`,`agent-browser command failed`,a(n,{cmd:W,args:r,stdout:n.stdout.slice(0,500),stderr:n.stderr.slice(0,500),hint:p(t,`hint`)??G}));return Object.hasOwn(t,`data`)?t.data:t}function ze(t,n,r,i){try{return JSON.parse(t)}catch(a){let o=i!==0;throw new e(`COMMAND_FAILED`,o?`agent-browser command failed`:`agent-browser returned invalid JSON`,{cmd:W,args:r,...o?{exitCode:i}:{},stdout:t.slice(0,500),stderr:n.slice(0,500),hint:G},a instanceof Error?a:void 0)}}function Be(t,n){let r=te(t);return r.code===`TOOL_MISSING`?new e(`TOOL_MISSING`,r.message,{...r.details??{},cmd:W,args:n,hint:Y(r)},r):r.code===`COMMAND_FAILED`?new e(`COMMAND_FAILED`,r.message,{...r.details??{},cmd:W,args:n,hint:Y(r)},r):r}function Y(e){return typeof e.details?.hint==`string`?e.details.hint:G}function X(e){let t=e.error;if(typeof t==`string`&&t.trim())return t.trim();if(d(t)){let e=p(t,`message`)??p(t,`error`);if(e)return e}return p(e,`message`)??`agent-browser command failed`}function Ve(e){return typeof e==`string`&&e.length>0?e:`COMMAND_FAILED`}function Z(e){return e.startsWith(`@`)?e:`@${e}`}function He(){return i()===`darwin`?`Meta+a`:`Control+a`}function Ue(e){let t=d(e)&&d(e.box)?e.box:e;if(d(t))return We(t)??Ge(t)}function We(e){return Q(m(e,`x`),m(e,`y`),m(e,`width`),m(e,`height`))}function Ge(e){let t=m(e,`left`),n=m(e,`top`),r=m(e,`right`),i=m(e,`bottom`);return Q(t,n,$(r,t),$(i,n))}function Q(e,t,n,r){if(e!==void 0&&t!==void 0&&n!==void 0&&r!==void 0)return{x:e,y:t,width:n,height:r}}function $(e,t){return e===void 0||t===void 0?void 0:e-t}export{we as createAgentBrowserWebProvider};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime.js";import{
|
|
1
|
+
import{r as e}from"./rolldown-runtime.js";import{D as t,O as n}from"./sdk-contracts.js";import{c as r,d as i,f as a,l as o,s,u as c,x as l}from"./owner-identity.js";import{c as u}from"./exec.js";import{n as d,t as f}from"./file.js";import"./command.js";import"./process.js";import{O as p,S as m,a as h,b as g,c as _,d as v,l as y,p as b,s as x,v as S}from"./host-file.js";import{n as C}from"./agent-browser-process-record.js";import{r as w}from"./agent-browser-lifecycle.js";import T from"node:path";import E from"node:crypto";async function D(e){x(e.packageRoot);let t=ee([`install`,`--prefix`,e.packageRoot,`--no-global`,`--no-audit`,`--no-fund`,`--no-save`,e.packageSpec]);await u(t.command,t.args,{env:r(),timeoutMs:e.timeoutMs})}function O(e){p(T.join(e.installDir,`manifest.json`),JSON.stringify({package:e.packageName,version:e.version,node:c(),installedAt:new Date().toISOString()},null,2))}function ee(e){if(i()!==`win32`)return{command:`npm`,args:e};let n=k(r());if(!n)throw new t(`TOOL_MISSING`,`npm not found in PATH`,{nodeExecPath:o(),hint:"Install Node.js with npm, or add npm to PATH, and run `agent-device web setup` again."});return{command:o(),args:[n,...e]}}function k(e){let t=e.npm_execpath?.trim();if(t){let e=T.resolve(t);if(T.basename(e)===`npm-cli.js`&&A(e))return e}let n=T.join(T.dirname(o()),`node_modules`,`npm`,`bin`,`npm-cli.js`);return A(n)?n:void 0}function A(e){try{return v(e).isFile()}catch{return!1}}var j=e({doctorManagedAgentBrowser:()=>R,getManagedAgentBrowserStatus:()=>z,mapManagedAgentBrowserError:()=>$,runManagedAgentBrowser:()=>I,setupManagedAgentBrowser:()=>L});const M=`0.27.1`,N=`agent-browser`,P=3e5,F=6e4;async function I(e,t){let n=z({stateDir:t.stateDir});if(!n.installed)throw J(n);return await B(n,e,t)}async function L(e){let t=z(e);X(t.nodeMajor);let n=a();return await d({acquire:()=>f({lockDirPath:T.join(t.installDir,`..`,`.agent-browser-install.lock`),owner:{pid:n,startTime:l(n),acquiredAtMs:Date.now()},timeoutMs:P,description:`managed agent-browser setup`}),task:async()=>{let t=z(e);if(t.installed)return t;x(t.installDir),await D({packageRoot:T.join(t.installDir,`package`),packageSpec:`${N}@${M}`,timeoutMs:P});let n=z(e);if(!n.entryScript)throw Y(n);return await B(n,[`install`],{timeoutMs:P}),await B(n,[`doctor`,`--offline`,`--quick`],{timeoutMs:F}),O({installDir:n.installDir,packageName:N,version:M}),await z(e)}})}async function R(e){let t=z(e);if(!t.installed)throw J(t);return{status:t,...await B(t,[`doctor`,`--offline`,`--quick`],{timeoutMs:F,allowFailure:!0})}}function z(e){let t=e.stateDir??r().AGENT_DEVICE_STATE_DIR??ne(),n=T.join(t,`tools`,`agent-browser`,M),i=K(n),a=q(n),o=W(i),s=T.join(n,`home`),l=Z(n),u=Q(n),d=o!==void 0&&U(n),f=Number.parseInt(c().replace(/^v/,``).split(`.`)[0]??`0`,10);return{version:M,stateDir:t,installDir:n,packageDir:i,binaryPath:a,entryScript:o,homeDir:s,runtimeHomeDir:l,socketDir:u,installed:d,nodeMajor:f,nodeSupported:f>=24}}async function B(e,t,n){if(!e.entryScript)throw J(e);return await u(o(),[e.entryScript,...t],{allowFailure:n.allowFailure,env:V(e,r()),timeoutMs:n.timeoutMs,signal:n.signal})}function V(e,t){return x(e.homeDir),H(e),x(e.socketDir),{...t,HOME:e.runtimeHomeDir,AGENT_BROWSER_SOCKET_DIR:e.socketDir,AGENT_BROWSER_IDLE_TIMEOUT_MS:String(w(t)),AGENT_BROWSER_ARGS:C(t.AGENT_BROWSER_ARGS,e)}}function H(e){if(e.runtimeHomeDir!==e.homeDir){x(T.dirname(e.runtimeHomeDir));try{let t=y(e.runtimeHomeDir);if(t.isSymbolicLink()&&S(e.runtimeHomeDir)===e.homeDir||t.isDirectory())return;t.isSymbolicLink()&&m(e.runtimeHomeDir)}catch(e){if(!te(e))throw e}try{h(e.homeDir,e.runtimeHomeDir)}catch{x(e.runtimeHomeDir)}}}function U(e){return _(T.join(e,`manifest.json`))}function W(e){let t;try{let n=JSON.parse(g(T.join(e,`package.json`)));t=typeof n==`object`&&n?n.bin:void 0}catch{return}let n=typeof t==`string`?t:typeof t==`object`&&t?t[N]:void 0;if(typeof n!=`string`)return;let r=T.resolve(e,n);return G(r)?r:void 0}function G(e){try{return v(e).isFile()}catch{return!1}}function K(e){return T.join(e,`package`,`node_modules`,N)}function q(e){let t=i()===`win32`?`${N}.cmd`:N;return T.join(e,`package`,`node_modules`,`.bin`,t)}function J(e){return new t(`TOOL_MISSING`,`Managed web browser backend is not installed.`,{version:M,installDir:e.installDir,hint:e.nodeSupported===!1?`Web automation requires Node 24+; current Node is ${c()}.`:"Run `agent-device web setup` to install the managed web backend."})}function Y(e){return new t(`TOOL_MISSING`,`Managed web backend install produced no runnable entry.`,{version:M,installDir:e.installDir,packageDir:e.packageDir,hint:`Remove ${e.installDir} and run \`agent-device web setup\` again.`})}function X(e){if(!(e>=24))throw new t(`UNSUPPORTED_OPERATION`,`Web automation requires Node 24 or newer.`,{currentNode:c(),requiredNodeMajor:24,hint:`Run agent-device with Node 24+ for web setup and web automation.`})}function Z(e){if(i()===`win32`)return T.join(e,`home`);let t=E.createHash(`sha1`).update(e).digest(`hex`).slice(0,12);return T.join(b(),`agent-device-web`,t)}function Q(e){let t=E.createHash(`sha1`).update(e).digest(`hex`).slice(0,12);return T.join(b(),`adw`,t)}function te(e){return typeof e==`object`&&!!e&&`code`in e&&e.code===`ENOENT`}function ne(){return T.join(r().HOME??s(),`.agent-device`)}function $(e){let r=n(e);return r.code===`TOOL_MISSING`?new t(r.code,r.message,{...r.details??{},hint:typeof r.details?.hint==`string`?r.details.hint:"Run `agent-device web setup` to install the managed web backend."}):r}export{I as i,z as n,$ as r,j as t};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime.js";import{
|
|
1
|
+
import{r as e}from"./rolldown-runtime.js";import{D as t,G as n,H as r,c as i,s as a}from"./sdk-contracts.js";import"./capture.js";import{n as o}from"./snapshot-capture-annotations.js";import{C as s,E as c,O as l,S as u,T as d,b as f,g as p,h as ee,w as m,x as h,y as g}from"./sdk-batch-runner.js";import{n as _}from"./snapshot-diagnostics.js";import{c as te,h as v,l as y,m as ne}from"./sdk-device.js";import{f as re,i as ie}from"./lease-scope.js";import{nn as ae,w as oe}from"./sdk-batch.js";import{n as b,t as x}from"./catalog.js";import{T as se,i as ce,m as le,w as S}from"./registry.js";import{n as C}from"./success-text.js";import{c as w,n as ue,r as de}from"./diagnostics.js";import{t as T}from"./command-metadata.js";import"./diagnostics2.js";import{a as fe,c as pe,i as me,l as he,n as ge,o as _e,r as ve,s as ye,t as be}from"./daemon-client-lifecycle.js";import{t as E}from"./daemon-resolution.js";import{r as xe}from"./session-paths.js";import{n as Se,t as D}from"./client-metro.js";import{t as O}from"./screenshot-result.js";import k from"node:path";import A from"node:fs";function j(e){let t=e.appId??e.bundleId??e.packageName;return{session:e.session,appId:t,appBundleId:e.bundleId,package:e.packageName}}function M(e,t,n){return{deviceId:t,deviceName:n,...v(e)?{serial:t}:e===`ios`?{udid:t}:{}}}function N(e,t){let n=h(e,`bundleId`),r=h(e,`package`);return{app:d(e,`app`),appPath:d(e,`appPath`),platform:m(e,`platform`),appId:n??r,bundleId:n,package:r,identifiers:j({session:t,bundleId:n,packageName:r})}}function Ce(e,n){let r=h(e,`bundleId`),i=h(e,`packageName`),a=r??i??h(e,`appId`),o=h(e,`launchTarget`)??i??r??a;if(!o)throw new t(`COMMAND_FAILED`,`Daemon response is missing "launchTarget".`,{response:e});return{appName:h(e,`appName`),appId:a,bundleId:r,packageName:i,launchTarget:o,installablePath:h(e,`installablePath`),archivePath:h(e,`archivePath`),materializationId:h(e,`materializationId`),materializationExpiresAt:h(e,`materializationExpiresAt`),identifiers:j({session:n,bundleId:r,packageName:i,appId:a})}}function we(e){return{released:e.released===!0,materializationId:d(e,`materializationId`),identifiers:{}}}function P(e){let{record:t,platform:n,id:r,name:i,target:a}=I(e,`name`),o=F(t);return{platform:n,target:a,kind:u(t,`kind`),id:r,name:i,booted:typeof t.booted==`boolean`?t.booted:void 0,...y(n)&&o?{appleOs:o}:{},identifiers:M(n,r,i),...Te(t),...L(n,r)}}function Te(e){let t=e.claimedBy;if(!t||typeof t!=`object`||Array.isArray(t))return{};let n=t,r=n.session,i=n.workspace;return typeof r!=`string`||typeof i!=`string`?{}:{claimedBy:{session:r,workspace:i}}}function Ee(e){let{record:t,platform:n,id:r,name:i,target:a}=I(e,`name`),o=d(t,`device`),c=F(t),l={session:i,...M(n,r,o)};return{name:i,address:h(t,`address`),createdAt:s(t,`createdAt`),sessionStateDir:h(t,`sessionStateDir`),runnerLogPath:h(t,`runnerLogPath`),device:{platform:n,target:a,id:r,name:o,...c?{appleOs:c}:{},identifiers:l,...L(n,r,{simulatorSetPath:f(t,`ios_simulator_device_set`)})},identifiers:l}}function F(e){let t=e.appleOs;return te(t)?t:void 0}function I(e,t){let n=ee(e);return{record:n,platform:m(n,`platform`),id:d(n,`id`),name:d(n,t),target:g(n,`target`)}}function L(e,t,n={}){if(e===`ios`)return{ios:{udid:t,...n.simulatorSetPath===void 0?{}:{simulatorSetPath:n.simulatorSetPath}}};if(!v(e))return{};let r=n.serial??t;return e===`android`?{android:{serial:r}}:e===`harmonyos`?{harmonyos:{serial:r}}:{vega:{serial:r}}}function De(e){if(!p(e))return;let t=e.platform,n=h(e,`metroHost`),r=typeof e.metroPort==`number`?e.metroPort:void 0,a=h(e,`bundleUrl`),o=h(e,`launchUrl`);return{platform:i(t)?t:void 0,metroHost:n,metroPort:r,bundleUrl:a,launchUrl:o}}function Oe(e){let t=e.platform,n=h(e,`id`),r=h(e,`device`);if(!ne(t)||!n||!r)return;let i=g(e,`target`),a=v(t)?h(e,`serial`)??n:void 0;return{platform:t,target:i,id:n,name:r,identifiers:{...M(t,n,r),...a?{serial:a}:{}},...L(t,t===`ios`?h(e,`device_udid`)??n:n,{simulatorSetPath:f(e,`ios_simulator_device_set`),serial:a})}}const ke=[`explicit-selector`,`existing-session`,`single-booted-local`,`single-bootable-local`,`single-app-installed-local`,`preferred-local`,`single-provider-device`],Ae=[`session`,`local`,`provider`];function je(e){if(!p(e))return;let{reason:t,source:n,candidateCount:r,bootOccurred:i}=e;if(!(!ke.includes(t)||!Ae.includes(n)||typeof r!=`number`||!Number.isInteger(r)||r<0||typeof i!=`boolean`))return{reason:t,source:n,candidateCount:r,bootOccurred:i}}function Me(e){if(p(e)&&typeof e.durationMs==`number`&&typeof e.measuredAt==`string`&&typeof e.method==`string`)return{durationMs:e.durationMs,measuredAt:e.measuredAt,method:e.method,appTarget:h(e,`appTarget`),appBundleId:h(e,`appBundleId`)}}function R(e){if(!p(e)||typeof e.success!=`boolean`||typeof e.exitCode!=`number`||typeof e.stdout!=`string`||typeof e.stderr!=`string`)return;let t=z(e.error);return{success:e.success,exitCode:e.exitCode,stdout:e.stdout,stderr:e.stderr,...t?{error:t}:{}}}const Ne=[`hint`,`diagnosticId`,`logPath`,`supportedOn`];function z(e){if(!p(e)||typeof e.code!=`string`||typeof e.message!=`string`)return;let t={code:e.code,message:e.message};Object.assign(t,Pe(e.cause));for(let n of Ne){let r=e[n];typeof r==`string`&&(t[n]=r)}return p(e.details)&&(t.details=e.details),typeof e.retriable==`boolean`&&(t.retriable=e.retriable),t}function Pe(e){let t=n(e);return t?{cause:t}:void 0}function Fe(e){let t=z(e.initialSnapshotError);return{...e.snapshot&&typeof e.snapshot==`object`?{snapshot:e.snapshot}:{},...t?{initialSnapshotError:t}:{}}}function Ie(e){return Array.isArray(e)?e:[]}function Le(e){let t=ie(e);return l({requestId:e.requestId,cwd:e.cwd,sessionExplicit:e.session!==void 0,debug:e.debug,includeCost:e.cost,responseLevel:e.responseLevel,lockPolicy:e.lockPolicy,lockPlatform:e.lockPlatform,...re(t),sessionIsolation:e.sessionIsolation,installSource:e.installSource,retainMaterializedPaths:e.retainMaterializedPaths,materializedPathRetentionMs:e.materializedPathRetentionMs,materializationId:e.materializationId})}function B(e){return e??`default`}const V={...ce(),batch:le(Re)};async function Re(e,n,r){let i=V[e];if(!i)throw Error(`Missing daemon writer for batch command: ${e}`);let a=T(e);if(!a)throw Error(`Missing command metadata for batch command: ${e}`);try{return await H(i,a,a.readInput(n))}catch(n){let i=n instanceof Error?n.message:String(n);throw new t(`INVALID_ARGS`,`Batch step ${r} ${e} input is invalid: ${i}`,void 0,n)}}async function ze(e,t){let n=V[e];if(!n)throw Error(`Missing daemon writer for command: ${e}`);return await H(n,T(e),t)}async function H(e,t,n){let r=await e(n);return{...r,...t?{metadataFlags:se(t,r.options)}:{}}}async function U(e,t={}){let n=e.meta?.requestId??ue(),r=!!(e.meta?.debug||e.flags?.verbose),i=e.flags,{daemonAuthToken:a,...o}=i??{},s=i?{...e,flags:o}:e,c=ye(s,t.authToken??a),l=ae(oe(s.command),s),u=await w(`daemon_startup`,async()=>await me(c),{requestId:n,session:e.session}),d=u.info,f=await he(s,d);qe(s.command);let p=Be(s,f,d.token,n,r);return de({level:`info`,phase:`daemon_request_prepare`,data:{requestId:n,command:s.command,session:s.session}}),await We(s,u,c,async()=>Ke(Ge(await w(`daemon_request`,async()=>await pe(d,p,c.transportPreference,c.paths,l,t.onProgress?{onProgress:t.onProgress}:void 0),{requestId:n,command:e.command}),c),s,c))}function Be(e,t,n,r,i){return{...e,positionals:t.positionals,flags:t.flags,token:n,meta:Ve(e,t,r,i)}}function Ve(e,t,n,r){let i=e.meta??{};return{...i,requestId:n,debug:r,...He(i,e.flags),...Ue(t)}}function He(e,t){return{includeCost:e.includeCost,cwd:e.cwd,sessionExplicit:e.sessionExplicit,tenantId:e.tenantId??t?.tenant,runId:e.runId??t?.runId,leaseId:e.leaseId??t?.leaseId,sessionIsolation:e.sessionIsolation??t?.sessionIsolation,lockPolicy:e.lockPolicy,lockPlatform:e.lockPlatform}}function Ue(e){return{...e.uploadedArtifactId?{uploadedArtifactId:e.uploadedArtifactId}:{},...e.clientArtifactPaths?{clientArtifactPaths:e.clientArtifactPaths}:{},...e.installSource?{installSource:e.installSource}:{}}}async function We(e,n,r,i){let a,o=!1,s;try{a=await i()}catch(e){o=!0,s=e}let c=await ve(e,n,r,a);if(o)throw s;if(!c)throw new t(`COMMAND_FAILED`,`Daemon request produced no response after cleanup`);return c}function Ge(e,t){return e.ok||!t.ownedStateDir||!_e(e)?e:ge(e,t.paths.baseDir)}function Ke(e,t,n){return!e.ok||!fe(t,e)?e:be(e,n.ownedStateDir?n.paths.baseDir:void 0)}function qe(e){!Je(e)||process.stderr.isTTY!==!0||process.env.CI||process.stderr.write(e===b.reinstall?`Reinstalling...
|
|
2
2
|
`:`Installing...
|
|
3
|
-
`)}function Je(e){return e===S.install||e===S.reinstall||e===C.installSource}function U(e,t){return O.join(e,`metro-sessions`,`${be(t)}.json`)}function W(e){let t=U(e.stateDir,e.session);k.mkdirSync(O.dirname(t),{recursive:!0}),k.writeFileSync(t,`${JSON.stringify(e.hints,null,2)}\n`,`utf8`)}function Ye(e){let t=U(e.stateDir,e.session),n;try{n=k.readFileSync(t,`utf8`)}catch{return}let r;try{r=JSON.parse(n)}catch{return}if(!r||typeof r!=`object`||Array.isArray(r))return;let i=r,a={};return typeof i.metroHost==`string`&&i.metroHost&&(a.metroHost=i.metroHost),typeof i.metroPort==`number`&&Number.isInteger(i.metroPort)&&(a.metroPort=i.metroPort),typeof i.bundleUrl==`string`&&i.bundleUrl&&(a.bundleUrl=i.bundleUrl),Object.keys(a).length>0?a:void 0}function G(e){k.rmSync(U(e.stateDir,e.session),{force:!0})}function Xe(e){let n=async(t,n)=>await e(C.humanControl,t,n);return{allocate:async t=>q(await e(C.leaseAllocate,[],{...t,leaseId:void 0})),heartbeat:async t=>q(await e(C.leaseHeartbeat,[],t)),release:async t=>{let n=await e(C.leaseRelease,[],t);return{released:n.released===!0,provider:f(n.provider)?n.provider:void 0}},humanControl:{list:async e=>{let r=await n([`list`],e);if(!Array.isArray(r.holds))throw new t(`COMMAND_FAILED`,`Daemon did not return human-control holds.`);return r.holds.map(K)},put:async(e,t={},r)=>K((await n([`put`,e,JSON.stringify(t)],r)).hold),remove:async(e,t)=>(await n([`remove`,e],t)).released===!0}}}function K(e){if(!f(e)||!f(e.scope)||e.state!==`active`&&e.state!==`activating`||typeof e.createdAt!=`number`||typeof e.updatedAt!=`number`)throw new t(`COMMAND_FAILED`,`Daemon returned an invalid human-control hold.`);return{id:u(e,`id`),scope:{backend:u(e.scope,`backend`),leaseProvider:h(e.scope,`leaseProvider`),deviceKey:u(e.scope,`deviceKey`)},state:e.state,reason:h(e,`reason`),createdAt:e.createdAt,updatedAt:e.updatedAt,...typeof e.expiresAt==`number`?{expiresAt:e.expiresAt}:{}}}function q(e){let t=e.lease;if(!f(t))throw Error(`Invalid lease response from daemon`);return{leaseId:u(t,`leaseId`),tenantId:u(t,`tenantId`),runId:u(t,`runId`),backend:u(t,`backend`),leaseProvider:h(t,`leaseProvider`),clientId:h(t,`clientId`),deviceKey:h(t,`deviceKey`),createdAt:typeof t.createdAt==`number`?t.createdAt:void 0,heartbeatAt:typeof t.heartbeatAt==`number`?t.heartbeatAt:void 0,expiresAt:typeof t.expiresAt==`number`?t.expiresAt:void 0}}var Ze=e({createAgentDeviceClient:()=>J});function J(e={},r={}){let a=r.transport??H,o=t=>i(t.responseLevel??e.responseLevel),s=async(t,r=[],i={},o,s)=>{let c=Q(e,i),l={session:z(c.session),command:t,positionals:r,...s?{input:s}:{},flags:se(c,o),runtime:c.runtime,meta:Le(c)},u=await a(l,{authToken:c.daemonAuthToken});return u.ok||n(u.error),u.data??{}},c=async(e={})=>{let t=await s(C.sessionList,[],e);return(Array.isArray(t.sessions)?t.sessions:[]).map(Ee)},l=async(e,t={})=>{let n=await ze(e,t);return await s(n.command,n.positionals,n.options,n.metadataFlags,n.input)},d=(t={})=>z(Q(e,t).session);return{command:{wait:async e=>await l(`wait`,e),alert:async(e={})=>await l(`alert`,e),appState:async(e={})=>await l(`appstate`,e),back:async(e={})=>await l(`back`,e),home:async(e={})=>await l(`home`,e),orientation:async e=>await l(`orientation`,e),appSwitcher:async(e={})=>await l(`app-switcher`,e),keyboard:async(e={})=>await l(`keyboard`,e),clipboard:async e=>await l(`clipboard`,e),tvRemote:async e=>await l(`tv-remote`,e),reactNative:async e=>await l(`react-native`,e),doctor:async(e={})=>await l(`doctor`,e),prepare:async e=>await l(`prepare`,e),viewport:async e=>await l(`viewport`,e)},devices:{list:async(e={})=>{let t=await l(`devices`,e);return(Array.isArray(t.devices)?t.devices:[]).map(N)},capabilities:async(e={})=>{let t=await l(`capabilities`,e),n=Array.isArray(t.availableCommands)?t.availableCommands.filter(e=>typeof e==`string`):[];return{device:N(t.device),availableCommands:n}},boot:async(e={})=>await l(`boot`,e),shutdown:async(e={})=>await l(`shutdown`,e)},sessions:{list:async(e={})=>await c(e),stateDir:async(t={})=>{let n=Q(e,t);return E(n.stateDir??process.env.AGENT_DEVICE_STATE_DIR).baseDir},close:async(t={})=>{let n=d(t);try{let e=await l(`close`,t);return{session:n,shutdown:L(e.shutdown),provider:Z(e.provider),savedScript:h(e,`savedScript`),identifiers:{session:n}}}finally{ut(e,t)}},saveScript:async(e={})=>{let n=await s(C.sessionSaveScript,e.path===void 0?[]:[e.path],e,{force:e.force}),r=n.actionCount;if(typeof r!=`number`||!Number.isInteger(r)||r<0)throw new t(`COMMAND_FAILED`,`Daemon returned an invalid saved-script action count.`);let i=u(n,`session`);return{session:i,savedScript:u(n,`savedScript`),actionCount:r,identifiers:{session:i}}},artifacts:async(e={})=>await l(`artifacts`,e)},apps:{install:async e=>M(await l(`install`,e),d(e)),reinstall:async e=>M(await l(`reinstall`,e),d(e)),installFromSource:async e=>Ce(await l(`install-from-source`,e),d(e)),list:async(e={})=>{let t=await l(`apps`,e);return Array.isArray(t.apps)?t.apps.filter(e=>typeof e==`string`):[]},open:async t=>{let n=d(t),r=await l(`open`,t);lt({config:e,options:t,runtime:Q(e,t).runtime,sessionReused:r.sessionReused===!0});let i=Oe(r),a=h(r,`appBundleId`),o=a,s=ce(r);return{session:n,...s.length>0?{warnings:s}:{},sessionStateDir:h(r,`sessionStateDir`),runnerLogPath:h(r,`runnerLogPath`),requestLogPath:h(r,`requestLogPath`),eventLogPath:h(r,`eventLogPath`),appName:h(r,`appName`),appBundleId:a,appId:o,selection:je(r.selection),startup:Me(r.startup),runtime:De(r.runtime),device:i,...Fe(r),identifiers:{session:n,deviceId:i?.id,deviceName:i?.name,udid:i?.ios?.udid,serial:i?.android?.serial,appId:o,appBundleId:a}}},close:async(e={})=>{let t=d(e),n=await l(`close`,e);return{session:t,closedApp:e.app,shutdown:L(n.shutdown),savedScript:h(n,`savedScript`),identifiers:{session:t}}},push:async e=>await l(`push`,e),triggerEvent:async e=>await l(`trigger-app-event`,e)},materializations:{release:async e=>we(await s(C.releaseMaterializedPaths,[],{...e,materializationId:e.materializationId}))},leases:Xe(s),metro:{prepare:async t=>{let n=await Se({projectRoot:t.projectRoot??e.cwd,kind:t.kind,publicBaseUrl:t.publicBaseUrl,proxyBaseUrl:t.proxyBaseUrl,proxyBearerToken:t.bearerToken,bridgeScope:t.bridgeScope,launchUrl:t.launchUrl,companionProfileKey:t.companionProfileKey,companionConsumerKey:t.companionConsumerKey,metroPort:t.port,listenHost:t.listenHost,statusHost:t.statusHost,startupTimeoutMs:t.startupTimeoutMs,probeTimeoutMs:t.probeTimeoutMs,reuseExisting:t.reuseExisting,installDependenciesIfNeeded:t.installDependenciesIfNeeded,runtimeFilePath:t.runtimeFilePath,logPath:t.logPath});return ot(e,n),n},reload:async(t={})=>await xe({metroHost:t.metroHost,metroPort:t.metroPort,bundleUrl:t.bundleUrl,runtime:e.runtime??st(e),timeoutMs:t.timeoutMs})},capture:{snapshot:async(e={})=>{let t=d(e),n=await l(`snapshot`,e);return o(e)?n:it(n,t)},screenshot:async(e={})=>{let t=d(e),n=await l(`screenshot`,e);return o(e)?n:D(n,t)},diff:async e=>await l(`diff`,e)},interactions:{click:async e=>await l(`click`,e),press:async e=>await l(`press`,e),longPress:async e=>await l(`longpress`,e),hover:async e=>await l(`hover`,e),swipe:async e=>await l(`swipe`,e),pan:async e=>await l(`gesture`,Qe(e)),drag:async e=>await l(`gesture`,$e(e)),fling:async e=>await l(`gesture`,et(e)),swipeGesture:async e=>await l(`gesture`,tt(e)),focus:async e=>await l(`focus`,e),type:async e=>await l(`type`,e),fill:async e=>await l(`fill`,e),scroll:async e=>await l(`scroll`,e),pinch:async e=>await l(`gesture`,Y(e)),rotateGesture:async e=>await l(`gesture`,nt(e)),transformGesture:async e=>await l(`gesture`,rt(e)),get:async e=>await l(`get`,e),is:async e=>await l(`is`,e),find:async e=>await l(`find`,e)},replay:{run:async e=>await l(`replay`,e),test:async e=>await l(`test`,e)},batch:{run:async e=>await l(`batch`,e)},observability:{perf:async e=>await l(`perf`,e),logs:async(e={})=>await l(`logs`,e),events:async(e={})=>await l(`events`,e),network:async(e={})=>await l(`network`,e),audio:async(e={})=>await l(`audio`,e)},debug:{symbols:async t=>{let{symbolicateCrashArtifact:n}=await import(`./debug-symbols-facade.js`);return n({cwd:t.cwd??e.cwd,...t})}},recording:{record:async e=>await l(`record`,e),trace:async e=>await l(`trace`,e)},settings:{update:async e=>await l(`settings`,e)}}}function Qe(e){let{x:t,y:n,dx:r,dy:i,...a}=e;return{...a,kind:`pan`,origin:{x:t,y:n},delta:{x:r,y:i}}}function $e(e){return{...e,kind:`drag`}}function et(e){let{x:t,y:n,...r}=e;return{...r,kind:`fling`,origin:{x:t,y:n}}}function tt(e){return{...e,kind:`swipe`}}function Y(e){let{x:t,y:n,...r}=e;return X(t,n,`pinch`),{...r,kind:`pinch`,...t===void 0&&n===void 0?{}:{origin:{x:t,y:n}}}}function nt(e){let{x:t,y:n,...r}=e;return X(t,n,`rotate`),{...r,kind:`rotate`,...t===void 0&&n===void 0?{}:{origin:{x:t,y:n}}}}function rt(e){let{x:t,y:n,dx:r,dy:i,...a}=e;return{...a,kind:`transform`,origin:{x:t,y:n},delta:{x:r,y:i}}}function X(e,n,r){if(e===void 0!=(n===void 0))throw new t(`INVALID_ARGS`,`gesture ${r} center requires both x and y`)}function it(e,t){let n=h(e,`appBundleId`);return{nodes:Ie(e.nodes),...typeof e.truncated==`boolean`?{truncated:e.truncated}:{},appName:h(e,`appName`),appBundleId:n,...at(e),identifiers:{session:t,appId:n,appBundleId:n}}}function at(e){let t=Z(e.visibility),n=Z(e.unchanged),r=ee(e.snapshotDiagnostics);return{...t?{visibility:t}:{},...o(e),...n?{unchanged:n}:{},...r?{snapshotDiagnostics:r}:{},...typeof e.fallbackScreenshotPath==`string`?{fallbackScreenshotPath:e.fallbackScreenshotPath}:{},...typeof e.refsGeneration==`number`?{refsGeneration:e.refsGeneration}:{}}}function Z(e){return f(e)?e:void 0}function Q(e,t){return{...e,...t}}function $(e,t={}){let n=Q(e,t);return{stateDir:E(n.stateDir??process.env.AGENT_DEVICE_STATE_DIR).baseDir,session:z(n.session)}}function ot(e,t){try{let n=new URL(t.statusUrl),r=Number.parseInt(n.port,10);if(!n.hostname||!Number.isInteger(r))return;let i=t.bridge?void 0:t.iosRuntime.bundleUrl??t.androidRuntime.bundleUrl;W({...$(e),hints:{metroHost:n.hostname,metroPort:r,bundleUrl:i}})}catch{}}function st(e){try{return Ye($(e))}catch{return}}function ct(e){if(!e)return;let{metroHost:t,metroPort:n,bundleUrl:r}=e;if(t!==void 0||n!==void 0||r!==void 0)return{metroHost:t,metroPort:n,bundleUrl:r}}function lt(e){try{let t=$(e.config,e.options),n=ct(e.runtime);if(n){W({...t,hints:n});return}e.sessionReused||G(t)}catch{}}function ut(e,t){try{G($(e,t))}catch{}}export{J as n,H as r,Ze as t};
|
|
3
|
+
`)}function Je(e){return e===b.install||e===b.reinstall||e===x.installSource}function W(e,t){return k.join(e,`metro-sessions`,`${xe(t)}.json`)}function G(e){let t=W(e.stateDir,e.session);A.mkdirSync(k.dirname(t),{recursive:!0}),A.writeFileSync(t,`${JSON.stringify(e.hints,null,2)}\n`,`utf8`)}function Ye(e){let t=W(e.stateDir,e.session),n;try{n=A.readFileSync(t,`utf8`)}catch{return}let r;try{r=JSON.parse(n)}catch{return}if(!r||typeof r!=`object`||Array.isArray(r))return;let i=r,a={};return typeof i.metroHost==`string`&&i.metroHost&&(a.metroHost=i.metroHost),typeof i.metroPort==`number`&&Number.isInteger(i.metroPort)&&(a.metroPort=i.metroPort),typeof i.bundleUrl==`string`&&i.bundleUrl&&(a.bundleUrl=i.bundleUrl),Object.keys(a).length>0?a:void 0}function K(e){A.rmSync(W(e.stateDir,e.session),{force:!0})}function Xe(e){let n=async(t,n)=>await e(x.humanControl,t,n);return{allocate:async t=>J(await e(x.leaseAllocate,[],{...t,leaseId:void 0})),heartbeat:async t=>J(await e(x.leaseHeartbeat,[],t)),release:async t=>{let n=await e(x.leaseRelease,[],t);return{released:n.released===!0,provider:p(n.provider)?n.provider:void 0}},humanControl:{list:async e=>{let r=await n([`list`],e);if(!Array.isArray(r.holds))throw new t(`COMMAND_FAILED`,`Daemon did not return human-control holds.`);return r.holds.map(q)},put:async(e,t={},r)=>q((await n([`put`,e,JSON.stringify(t)],r)).hold),remove:async(e,t)=>(await n([`remove`,e],t)).released===!0}}}function q(e){if(!p(e)||!p(e.scope)||e.state!==`active`&&e.state!==`activating`||typeof e.createdAt!=`number`||typeof e.updatedAt!=`number`)throw new t(`COMMAND_FAILED`,`Daemon returned an invalid human-control hold.`);return{id:d(e,`id`),scope:{backend:d(e.scope,`backend`),leaseProvider:h(e.scope,`leaseProvider`),deviceKey:d(e.scope,`deviceKey`)},state:e.state,reason:h(e,`reason`),createdAt:e.createdAt,updatedAt:e.updatedAt,...typeof e.expiresAt==`number`?{expiresAt:e.expiresAt}:{}}}function J(e){let t=e.lease;if(!p(t))throw Error(`Invalid lease response from daemon`);return{leaseId:d(t,`leaseId`),tenantId:d(t,`tenantId`),runId:d(t,`runId`),backend:d(t,`backend`),leaseProvider:h(t,`leaseProvider`),clientId:h(t,`clientId`),deviceKey:h(t,`deviceKey`),createdAt:typeof t.createdAt==`number`?t.createdAt:void 0,heartbeatAt:typeof t.heartbeatAt==`number`?t.heartbeatAt:void 0,expiresAt:typeof t.expiresAt==`number`?t.expiresAt:void 0}}var Ze=e({createAgentDeviceClient:()=>Y});function Y(e={},n={}){let i=n.transport??U,o=t=>a(t.responseLevel??e.responseLevel),s=async(t,n=[],a={},o,s)=>{let c=Q(e,a),l={session:B(c.session),command:t,positionals:n,...s?{input:s}:{},flags:S(c,o),runtime:c.runtime,meta:Le(c)},u=await i(l,{authToken:c.daemonAuthToken});return u.ok||r(u.error),u.data??{}},c=async(e={})=>{let t=await s(x.sessionList,[],e);return(Array.isArray(t.sessions)?t.sessions:[]).map(Ee)},l=async(e,t={})=>{let n=await ze(e,t);return await s(n.command,n.positionals,n.options,n.metadataFlags,n.input)},u=(t={})=>B(Q(e,t).session);return{command:{wait:async e=>await l(`wait`,e),alert:async(e={})=>await l(`alert`,e),appState:async(e={})=>await l(`appstate`,e),back:async(e={})=>await l(`back`,e),home:async(e={})=>await l(`home`,e),orientation:async e=>await l(`orientation`,e),appSwitcher:async(e={})=>await l(`app-switcher`,e),actionButton:async(e={})=>await l(`action-button`,e),keyboard:async(e={})=>await l(`keyboard`,e),clipboard:async e=>await l(`clipboard`,e),tvRemote:async e=>await l(`tv-remote`,e),reactNative:async e=>await l(`react-native`,e),doctor:async(e={})=>await l(`doctor`,e),prepare:async e=>await l(`prepare`,e),viewport:async e=>await l(`viewport`,e)},devices:{list:async(e={})=>{let t=await l(`devices`,e);return(Array.isArray(t.devices)?t.devices:[]).map(P)},capabilities:async(e={})=>{let t=await l(`capabilities`,e),n=Array.isArray(t.availableCommands)?t.availableCommands.filter(e=>typeof e==`string`):[];return{device:P(t.device),availableCommands:n}},boot:async(e={})=>await l(`boot`,e),shutdown:async(e={})=>await l(`shutdown`,e)},sessions:{list:async(e={})=>await c(e),stateDir:async(t={})=>{let n=Q(e,t);return E(n.stateDir??process.env.AGENT_DEVICE_STATE_DIR).baseDir},close:async(t={})=>{let n=u(t);try{let e=await l(`close`,t);return{session:n,shutdown:R(e.shutdown),provider:Z(e.provider),savedScript:h(e,`savedScript`),identifiers:{session:n}}}finally{dt(e,t)}},saveScript:async(e={})=>{let n=await s(x.sessionSaveScript,e.path===void 0?[]:[e.path],e,{force:e.force}),r=n.actionCount;if(typeof r!=`number`||!Number.isInteger(r)||r<0)throw new t(`COMMAND_FAILED`,`Daemon returned an invalid saved-script action count.`);let i=d(n,`session`);return{session:i,savedScript:d(n,`savedScript`),actionCount:r,identifiers:{session:i}}},artifacts:async(e={})=>await l(`artifacts`,e)},apps:{install:async e=>N(await l(`install`,e),u(e)),reinstall:async e=>N(await l(`reinstall`,e),u(e)),installFromSource:async e=>Ce(await l(`install-from-source`,e),u(e)),list:async(e={})=>{let t=await l(`apps`,e);return Array.isArray(t.apps)?t.apps.filter(e=>typeof e==`string`):[]},open:async t=>{let n=u(t),r=await l(`open`,t);ut({config:e,options:t,runtime:Q(e,t).runtime,sessionReused:r.sessionReused===!0});let i=Oe(r),a=h(r,`appBundleId`),o=a,s=C(r);return{session:n,...s.length>0?{warnings:s}:{},sessionStateDir:h(r,`sessionStateDir`),runnerLogPath:h(r,`runnerLogPath`),requestLogPath:h(r,`requestLogPath`),eventLogPath:h(r,`eventLogPath`),appName:h(r,`appName`),appBundleId:a,appId:o,selection:je(r.selection),startup:Me(r.startup),runtime:De(r.runtime),device:i,...Fe(r),identifiers:{session:n,deviceId:i?.id,deviceName:i?.name,udid:i?.ios?.udid,serial:i?.android?.serial,appId:o,appBundleId:a}}},close:async(e={})=>{let t=u(e),n=await l(`close`,e);return{session:t,closedApp:e.app,shutdown:R(n.shutdown),savedScript:h(n,`savedScript`),identifiers:{session:t}}},push:async e=>await l(`push`,e),triggerEvent:async e=>await l(`trigger-app-event`,e)},materializations:{release:async e=>we(await s(x.releaseMaterializedPaths,[],{...e,materializationId:e.materializationId}))},leases:Xe(s),metro:{prepare:async t=>{let n=await D({projectRoot:t.projectRoot??e.cwd,kind:t.kind,publicBaseUrl:t.publicBaseUrl,proxyBaseUrl:t.proxyBaseUrl,proxyBearerToken:t.bearerToken,bridgeScope:t.bridgeScope,launchUrl:t.launchUrl,companionProfileKey:t.companionProfileKey,companionConsumerKey:t.companionConsumerKey,metroPort:t.port,listenHost:t.listenHost,statusHost:t.statusHost,startupTimeoutMs:t.startupTimeoutMs,probeTimeoutMs:t.probeTimeoutMs,reuseExisting:t.reuseExisting,installDependenciesIfNeeded:t.installDependenciesIfNeeded,runtimeFilePath:t.runtimeFilePath,logPath:t.logPath});return st(e,n),n},reload:async(t={})=>await Se({metroHost:t.metroHost,metroPort:t.metroPort,bundleUrl:t.bundleUrl,runtime:e.runtime??ct(e),timeoutMs:t.timeoutMs})},capture:{snapshot:async(e={})=>{let t=u(e),n=await l(`snapshot`,e);return o(e)?n:at(n,t)},screenshot:async(e={})=>{let t=u(e),n=await l(`screenshot`,e);return o(e)?n:O(n,t)},diff:async e=>await l(`diff`,e)},interactions:{click:async e=>await l(`click`,e),press:async e=>await l(`press`,e),longPress:async e=>await l(`longpress`,e),hover:async e=>await l(`hover`,e),swipe:async e=>await l(`swipe`,e),pan:async e=>await l(`gesture`,Qe(e)),drag:async e=>await l(`gesture`,$e(e)),fling:async e=>await l(`gesture`,et(e)),swipeGesture:async e=>await l(`gesture`,tt(e)),focus:async e=>await l(`focus`,e),type:async e=>await l(`type`,e),fill:async e=>await l(`fill`,e),scroll:async e=>await l(`scroll`,e),pinch:async e=>await l(`gesture`,nt(e)),rotateGesture:async e=>await l(`gesture`,rt(e)),transformGesture:async e=>await l(`gesture`,it(e)),get:async e=>await l(`get`,e),is:async e=>await l(`is`,e),find:async e=>await l(`find`,e)},replay:{run:async e=>await l(`replay`,e),test:async e=>await l(`test`,e)},batch:{run:async e=>await l(`batch`,e)},observability:{perf:async e=>await l(`perf`,e),logs:async(e={})=>await l(`logs`,e),events:async(e={})=>await l(`events`,e),network:async(e={})=>await l(`network`,e),audio:async(e={})=>await l(`audio`,e)},debug:{symbols:async t=>{let{symbolicateCrashArtifact:n}=await import(`./debug-symbols-facade.js`);return n({cwd:t.cwd??e.cwd,...t})}},recording:{record:async e=>await l(`record`,e),trace:async e=>await l(`trace`,e)},settings:{update:async e=>await l(`settings`,e)}}}function Qe(e){let{x:t,y:n,dx:r,dy:i,...a}=e;return{...a,kind:`pan`,origin:{x:t,y:n},delta:{x:r,y:i}}}function $e(e){return{...e,kind:`drag`}}function et(e){let{x:t,y:n,...r}=e;return{...r,kind:`fling`,origin:{x:t,y:n}}}function tt(e){return{...e,kind:`swipe`}}function nt(e){let{x:t,y:n,...r}=e;return X(t,n,`pinch`),{...r,kind:`pinch`,...t===void 0&&n===void 0?{}:{origin:{x:t,y:n}}}}function rt(e){let{x:t,y:n,...r}=e;return X(t,n,`rotate`),{...r,kind:`rotate`,...t===void 0&&n===void 0?{}:{origin:{x:t,y:n}}}}function it(e){let{x:t,y:n,dx:r,dy:i,...a}=e;return{...a,kind:`transform`,origin:{x:t,y:n},delta:{x:r,y:i}}}function X(e,n,r){if(e===void 0!=(n===void 0))throw new t(`INVALID_ARGS`,`gesture ${r} center requires both x and y`)}function at(e,t){let n=h(e,`appBundleId`);return{nodes:Ie(e.nodes),...typeof e.truncated==`boolean`?{truncated:e.truncated}:{},appName:h(e,`appName`),appBundleId:n,...ot(e),identifiers:{session:t,appId:n,appBundleId:n}}}function ot(e){let t=Z(e.visibility),n=Z(e.unchanged),r=c(e.keyboard),i=_(e.snapshotDiagnostics);return{...r?{keyboard:r}:{},...t?{visibility:t}:{},...o(e),...n?{unchanged:n}:{},...i?{snapshotDiagnostics:i}:{},...typeof e.fallbackScreenshotPath==`string`?{fallbackScreenshotPath:e.fallbackScreenshotPath}:{},...typeof e.refsGeneration==`number`?{refsGeneration:e.refsGeneration}:{}}}function Z(e){return p(e)?e:void 0}function Q(e,t){return{...e,...t}}function $(e,t={}){let n=Q(e,t);return{stateDir:E(n.stateDir??process.env.AGENT_DEVICE_STATE_DIR).baseDir,session:B(n.session)}}function st(e,t){try{let n=new URL(t.statusUrl),r=Number.parseInt(n.port,10);if(!n.hostname||!Number.isInteger(r))return;let i=t.bridge?void 0:t.iosRuntime.bundleUrl??t.androidRuntime.bundleUrl;G({...$(e),hints:{metroHost:n.hostname,metroPort:r,bundleUrl:i}})}catch{}}function ct(e){try{return Ye($(e))}catch{return}}function lt(e){if(!e)return;let{metroHost:t,metroPort:n,bundleUrl:r}=e;if(t!==void 0||n!==void 0||r!==void 0)return{metroHost:t,metroPort:n,bundleUrl:r}}function ut(e){try{let t=$(e.config,e.options),n=lt(e.runtime);if(n){G({...t,hints:n});return}e.sessionReused||K(t)}catch{}}function dt(e,t){try{K($(e,t))}catch{}}export{Y as n,U as r,Ze as t};
|
package/dist/src/ai-sdk.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{D as e}from"./sdk-contracts.js";import{n as t}from"./agent-device-client.js";import{b as n}from"./sdk-batch.js";import{i as r,n as i,o as a,r as o}from"./command-tools.js";const s=[`session`,...a];async function c(a){let{jsonSchema:c,tool:f}=await l(),{session:p,platform:m,set:h=`core`,approval:g}=a,_=t({session:p,...m?{lockPlatform:m}:{}}),v=i(),y=new Set(s);m&&y.add(`platform`);let b={};for(let t of o())(h!==`core`||n(t.name)===`core`)&&(b[t.name]=f({description:t.description,inputSchema:c(u(t.inputSchema,y)),...t.outputSchema?{outputSchema:c(t.outputSchema)}:{},execute:async n=>{let i={...d(n,y),session:p,...m?{platform:m}:{}},a=await v.execute(t.name,i);if(a.isError){let t=a.structuredContent,n=r(t);throw new e(t.code,n,t.details)}return a.structuredContent??{}}}));return{tools:b,client:_,...g?{toolApproval:g}:{}}}async function l(){try{return await import(`ai`)}catch(t){throw new e(`MISSING_PEER_DEPENDENCY`,"createAgentDeviceTools() requires the optional peer dependency 'ai'. Install it with `pnpm add ai` (or npm/yarn equivalent).",void 0,t)}}function u(e,t){if(!e.properties)return e;let n=e.required?.filter(e=>!t.has(e));return{...e,properties:d(e.properties,t),...n?{required:n}:{}}}function d(e,t){let n={};for(let[r,i]of Object.entries(e))t.has(r)||(n[r]=i);return n}export{c as createAgentDeviceTools};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{D as e}from"./sdk-contracts.js";import{$t as t}from"./sdk-batch.js";import{a as n,o as r}from"./touch-runtime.js";function i(e){return Object.freeze({captureScreenshot:e.capture})}function a(e,t){return Object.freeze({captureScreenshot:async n=>{await(await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})).screenshot(n.outPath,n.options)}})}function o(e){return a(e.signal,n(e))}function s(e){return a(e.signal,r({...e,operation:`screenshot`}))}function c(e,t){return t.signal===void 0?e:AbortSignal.any([e,t.signal])}function l(e){return Object.freeze({captureSnapshot:e.capture,captureSnapshotWithCustomActions:e.customActions,captureSnapshotWithoutActiveApp:e.withoutActiveApp})}function u(t){let n=async n=>{let r=c(t.signal,n),i={...n.execution,appBundleId:n.options?.appBundleId,signal:r},a=t.ownership===`local`?await t.resolveInteractor(t.device,i):t.resolveInteractor(i);if(!a)throw new e(`UNSUPPORTED_OPERATION`,`Provider-owned snapshot operation has no bound provider interactor.`,{reason:`provider-runtime-interactor-missing`,deviceId:t.device.id});let o=await a.snapshot({...n.options,signal:r});if(!p(o))return o;if(!t.presentIosAcquisition)throw new e(`COMMAND_FAILED`,`Acquired iOS snapshot has no host presentation owner.`,{reason:`ios-snapshot-presenter-missing`,deviceId:t.device.id});return await t.presentIosAcquisition(o,n.options)};return Object.freeze({captureSnapshot:n,captureSnapshotWithCustomActions:n,captureSnapshotWithoutActiveApp:n})}function d(e){return u({...e,ownership:`local`})}function f(e){return u({...e,ownership:`provider`})}function p(e){return`stage`in e&&e.stage===`acquired`}function m(e){return Object.freeze({findText:e.findText})}function h(e){return Object.freeze({setViewport:e.setViewport})}function g(e){return Object.freeze({focusPoint:e.focus})}function _(e,t){return Object.freeze({focusPoint:async n=>{e.throwIfAborted(),await(await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})).focus(n.point.x,n.point.y)}})}function v(e){return _(e.signal,n(e))}function y(e){return _(e.signal,r({...e,operation:`focus`}))}function b(e){let t=t=>t??e.unsupported;return Object.freeze({performGesturePlan:t(e.plan),performDirectionalFlingPlan:t(e.directionalFling),performMultiTouchGesturePlan:t(e.multiTouch),performTargetAuthoredDrag:t(e.targetAuthoredDrag),gestureViewport:t(e.viewport)})}function x(e,n,r){let i=async e=>{let i=await S(n,r,e);if(typeof i.performGesture!=`function`)throw t(`Runtime owner advertised gesture execution without an interactor implementation`);return await i.performGesture(e.plan)};return Object.freeze({...e.performGesturePlan.available?{performGesturePlan:i}:{},...e.performDirectionalFlingPlan.available?{performDirectionalFlingPlan:i}:{},...e.performMultiTouchGesturePlan.available?{performMultiTouchGesturePlan:i}:{},...e.performTargetAuthoredDrag.available?{performTargetAuthoredDrag:i}:{},...e.gestureViewport.available?{gestureViewport:async e=>{let i=await S(n,r,e);if(typeof i.gestureViewport!=`function`)throw t(`Runtime owner advertised gestureViewport without an interactor implementation`);return await i.gestureViewport()}}:{}})}async function S(e,t,n){return e.throwIfAborted(),await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})}function C(e){return x(e.facts,e.signal,n(e))}function w(e){return x(e.facts,e.signal,r({...e,operation:`gesture`}))}function T(e){return Object.freeze({scrollDirection:e.scroll})}function E(e,t){return Object.freeze({scrollDirection:async n=>(e.throwIfAborted(),await(await t({...n.execution,appBundleId:n.target?.appBundleId,signal:e})).scroll(n.direction,n.options))})}function D(e){return E(e.signal,n(e))}function O(e){return E(e.signal,r({...e,operation:`scroll`}))}function k(e){return Object.freeze({typeText:e.type})}function A(e,t){return Object.freeze({typeText:async n=>(e.throwIfAborted(),await(await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})).type(n.text,n.delayMs))})}function j(e){return A(e.signal,n(e))}function M(e){return A(e.signal,r({...e,operation:`type`}))}function N(e){return typeof e!=`string`||e.trim().length===0?Object.freeze({status:`unreadable`,reason:`no-text-at-point`}):Object.freeze({status:`read`,text:e})}function P(e){return Object.freeze({readTextAtPoint:e.readTextAtPoint})}function F(e){return Object.freeze({readTextAtPoint:async n=>{let r=e.signal;r.throwIfAborted();let i=await e.resolveInteractor(e.device,{...n.execution,appBundleId:n.options?.appBundleId,signal:r});if(typeof i.readTextAtPoint!=`function`)throw t(`Runtime owner advertised readTextAtPoint without an interactor implementation`);return N(await i.readTextAtPoint(n.point,{appBundleId:n.options?.appBundleId,surface:n.options?.surface,signal:r}))}})}function I(e){return Object.freeze({back:e.back})}function ee(e,t){return Object.freeze({back:async n=>{e.throwIfAborted(),await(await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})).back(n.mode)}})}function L(e){return Object.freeze({home:e.home})}function R(e,t){return Object.freeze({home:async n=>{e.throwIfAborted(),await(await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})).home()}})}function z(e){return Object.freeze({setOrientation:e.orientation})}function B(e,t){return Object.freeze({setOrientation:async n=>(e.throwIfAborted(),await(await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})).setOrientation(n.rotation))})}function V(e){return Object.freeze({tvRemote:e.tvRemote})}function H(e,t){return Object.freeze({tvRemote:async n=>{e.throwIfAborted(),await(await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})).tvRemote(n.button,n.durationMs)}})}function U(e){let t=t=>t??e.unsupported;return Object.freeze({keyboardStatus:t(e.status),keyboardDismiss:t(e.dismiss),keyboardEnter:t(e.enter)})}function W(t,n){if(t)return t;throw new e(`COMMAND_FAILED`,`${n} was admitted but its bound interactor has no implementation.`,{reason:`interactor-method-missing`})}async function G(e,t,n){return e.throwIfAborted(),await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})}const K={keyboardStatus:`keyboard status`,keyboardDismiss:`keyboard dismiss`,keyboardEnter:`keyboard enter`};function q(e,t,n){let r=async r=>{let i=await G(t,n,r);return await W(i[e],K[e]).call(i)};return Object.freeze({[e]:r})}function J(e){let t=t=>t??e.unsupported;return Object.freeze({readClipboard:t(e.read),writeClipboard:t(e.write)})}async function Y(e,t,n){return e.throwIfAborted(),await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})}function X(e,t){return Object.freeze({readClipboard:async n=>await(await Y(e,t,n)).readClipboard()})}function Z(e,t){return Object.freeze({writeClipboard:async n=>{await(await Y(e,t,n)).writeClipboard(n.text)}})}function Q(e){return Object.freeze({appSwitcher:e.appSwitcher})}function $(e,t){return Object.freeze({appSwitcher:async n=>{e.throwIfAborted(),await(await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})).appSwitcher()}})}function te(e){return Object.freeze({triggerAppEvent:e.triggerAppEvent})}function ne(e,t){return Object.freeze({triggerAppEvent:async n=>{e.throwIfAborted(),await(await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})).open(n.eventUrl,{appBundleId:n.options?.appBundleId})}})}function re(e){return Object.freeze({setSetting:e.setSetting})}function ie(e,t){return Object.freeze({setSetting:async n=>(e.throwIfAborted(),await(await t({...n.execution,appBundleId:n.appBundleId,signal:e})).setSetting(n.setting,n.state,n.appBundleId,n.options))})}function ae(e){return Object.freeze({readAlert:e.read,awaitAlert:e.wait,acceptAlert:e.accept,dismissAlert:e.dismiss})}async function oe(e,t,n){return e.throwIfAborted(),await t({...n.execution,appBundleId:n.appBundleId,signal:e})}function se(e){return{...e.timeoutMs===void 0?{}:{timeoutMs:e.timeoutMs},...e.appBundleId===void 0?{}:{appBundleId:e.appBundleId},...e.surface===void 0?{}:{surface:e.surface}}}function ce(e,t,n){return Object.freeze({[e]:async r=>await(await oe(t,n,r))[e](se(r))})}export{T as A,f as B,F as C,k as D,M as E,y as F,i as G,l as H,g as I,h as L,w as M,b as N,D as O,v as P,m as R,ee as S,j as T,o as U,c as V,s as W,B as _,te as a,L as b,$ as c,J as d,K as f,V as g,H as h,re as i,C as j,O as k,X as l,U as m,ce as n,ne as o,q as p,ie as r,Q as s,ae as t,Z as u,z as v,P as w,I as x,R as y,d as z};
|
|
@@ -1,8 +1,29 @@
|
|
|
1
|
+
import { b as DeviceInfo } from "./sdk-contracts.js";
|
|
1
2
|
import { t as AppsFilter } from "./app-inventory.js";
|
|
2
|
-
import { a as readAndroidClipboardWithAdb, c as AndroidAdbExecutor, d as
|
|
3
|
+
import { a as readAndroidClipboardWithAdb, c as AndroidAdbExecutor, d as AndroidAdbProvider, f as AndroidPortReverseEndpoint, i as getAndroidKeyboardStatusWithAdb, l as AndroidAdbExecutorOptions, n as AndroidKeyboardState, o as writeAndroidClipboardWithAdb, p as AndroidPortReverseProvider, r as dismissAndroidKeyboardWithAdb, t as AndroidKeyboardDismissResult, u as AndroidAdbExecutorResult } from "./device-input-state.js";
|
|
3
4
|
//#region packages/platform-android/src/adb-port-reverse.d.ts
|
|
4
5
|
declare function createAndroidPortReverseManager(provider: AndroidAdbProvider | AndroidAdbExecutor): AndroidPortReverseProvider;
|
|
5
6
|
//#endregion
|
|
7
|
+
//#region packages/kernel/src/device-shell.d.ts
|
|
8
|
+
declare const shellFragmentBrand: unique symbol;
|
|
9
|
+
/**
|
|
10
|
+
* A shell-script fragment the author wrote and quoted themselves (a pipeline, redirection, or
|
|
11
|
+
* `&` background job). The device shell parses it verbatim, so every interpolated value inside
|
|
12
|
+
* it must go through `shellQuote`.
|
|
13
|
+
*/
|
|
14
|
+
type ShellFragment = Readonly<{
|
|
15
|
+
readonly [shellFragmentBrand]: true;
|
|
16
|
+
script: string;
|
|
17
|
+
}>;
|
|
18
|
+
/** One element of a device-shell command: a value (quoted for the device shell) or a fragment. */
|
|
19
|
+
type ShellWord = string | number | ShellFragment;
|
|
20
|
+
//#endregion
|
|
21
|
+
//#region packages/platform-android/src/adb-provider-scope.d.ts
|
|
22
|
+
/** Runs `adb shell <words>` through an executor; every word is quoted for the device shell. */
|
|
23
|
+
declare function runAdbShell(adb: AndroidAdbExecutor, words: readonly ShellWord[], options?: AndroidAdbExecutorOptions): Promise<AndroidAdbExecutorResult>;
|
|
24
|
+
/** Runs `adb exec-out <words>` (raw stdout) through an executor. */
|
|
25
|
+
declare function runAdbExecOut(adb: AndroidAdbExecutor, words: readonly ShellWord[], options?: AndroidAdbExecutorOptions): Promise<AndroidAdbExecutorResult>;
|
|
26
|
+
//#endregion
|
|
6
27
|
//#region packages/platform-android/src/app-helpers.d.ts
|
|
7
28
|
type AndroidAppListFilter = AppsFilter;
|
|
8
29
|
type AndroidAppListTarget = 'mobile' | 'tv' | 'auto';
|
|
@@ -23,6 +44,12 @@ type AndroidLogcatCaptureOptions = {
|
|
|
23
44
|
};
|
|
24
45
|
declare function captureAndroidLogcatWithAdb$1(adb: AndroidAdbExecutor, options?: AndroidLogcatCaptureOptions): Promise<string>;
|
|
25
46
|
//#endregion
|
|
47
|
+
//#region packages/platform-android/src/adb.d.ts
|
|
48
|
+
/** Runs `adb shell <words>` for the device; every word is quoted for the device shell. */
|
|
49
|
+
declare function runAndroidShell(device: DeviceInfo, words: readonly ShellWord[], options?: AndroidAdbExecutorOptions): Promise<AndroidAdbExecutorResult>;
|
|
50
|
+
/** Runs `adb exec-out <words>` (raw stdout) for the device. */
|
|
51
|
+
declare function runAndroidExecOut(device: DeviceInfo, words: readonly ShellWord[], options?: AndroidAdbExecutorOptions): Promise<AndroidAdbExecutorResult>;
|
|
52
|
+
//#endregion
|
|
26
53
|
//#region packages/platform-android/src/app-control.d.ts
|
|
27
54
|
type AndroidOpenAppWithAdbOptions = {
|
|
28
55
|
activity?: string;
|
|
@@ -45,4 +72,4 @@ declare function captureAndroidLogcatWithAdb(...args: Parameters<typeof captureA
|
|
|
45
72
|
//#region src/sdk/android-adb.d.ts
|
|
46
73
|
declare function getAndroidAppStateWithAdb(adb: AndroidAdbExecutor, signal?: AbortSignal): Promise<AppStateRuntimeResult>;
|
|
47
74
|
//#endregion
|
|
48
|
-
export { type AndroidAdbExecutor, type AndroidAdbExecutorOptions, type AndroidAdbProvider, type AndroidKeyboardDismissResult, type AndroidKeyboardState, type AndroidPortReverseEndpoint, captureAndroidLogcatWithAdb, createAndroidPortReverseManager, dismissAndroidKeyboardWithAdb, forceStopAndroidAppWithAdb, getAndroidAppStateWithAdb, getAndroidKeyboardStatusWithAdb, listAndroidAppsWithAdb, openAndroidAppWithAdb, readAndroidClipboardWithAdb, writeAndroidClipboardWithAdb };
|
|
75
|
+
export { type AndroidAdbExecutor, type AndroidAdbExecutorOptions, type AndroidAdbProvider, type AndroidKeyboardDismissResult, type AndroidKeyboardState, type AndroidPortReverseEndpoint, type ShellWord, captureAndroidLogcatWithAdb, createAndroidPortReverseManager, dismissAndroidKeyboardWithAdb, forceStopAndroidAppWithAdb, getAndroidAppStateWithAdb, getAndroidKeyboardStatusWithAdb, listAndroidAppsWithAdb, openAndroidAppWithAdb, readAndroidClipboardWithAdb, runAdbExecOut, runAdbShell, runAndroidExecOut, runAndroidShell, writeAndroidClipboardWithAdb };
|
package/dist/src/android-adb.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{d as e}from"./adb-executor.js";import{_ as
|
|
1
|
+
import{d as e,p as t,u as n}from"./adb-executor.js";import{_ as r,d as i,h as a,n as o,p as s,t as c,v as l,y as u}from"./mechanics.js";import{a as d,o as f}from"./adb.js";import"./platform-runtime-android-adb-host.js";async function p(e,t){let{getAndroidAppStateWithAdb:n}=await import(`./platform-runtime.js`).then(e=>e.a);return await n(e,t)}export{c as captureAndroidLogcatWithAdb,t as createAndroidPortReverseManager,i as dismissAndroidKeyboardWithAdb,l as forceStopAndroidAppWithAdb,p as getAndroidAppStateWithAdb,s as getAndroidKeyboardStatusWithAdb,o as listAndroidAppsWithAdb,u as openAndroidAppWithAdb,a as readAndroidClipboardWithAdb,n as runAdbExecOut,e as runAdbShell,d as runAndroidExecOut,f as runAndroidShell,r as writeAndroidClipboardWithAdb};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{g as e}from"./sdk-contracts.js";import{Dr as t,Nr as n,zr as r}from"./sdk-batch.js";import{n as i,t as a}from"./rect-center.js";const o=new WeakMap;function s(e,t){return o.set(e,{...o.get(e),...t}),e}function c(e,t){return s(e,{clickability:t})}function l(e){return e?o.get(e)?.clickability:void 0}function u(e,t){let n=l(e);return n?c(t,n):t}function d(e,t){return s(e,{occlusionContext:t})}function f(e){return e?o.get(e)?.occlusionContext:void 0}const p=[`tabbar`,`toolbar`,`navigationbar`,`bottomnavigation`,`bottomnavigationview`,`sheet`,`dialog`,`alert`,`popover`,`menu`],m=[`tabbar`,`toolbar`,`navigationbar`],h=[`button`,`link`,`menuitem`,`tabitem`,`textfield`,`searchfield`,`edittext`,`checkbox`,`radio`,`switch`,`cell`];function g(e,t={}){if(e.length<2)return e;let n=new Map(e.map(e=>[e.index,e])),r={nodes:e,byIndex:n,overlayPositions:e.flatMap((e,r)=>E(e,n,t)?[r]:[]),coverCache:new Map},i=[];for(let[n,a]of e.entries())T(a)&&b(r,n,a,t)&&i.push(n);return v(e,i)}function _(e,t){let n=[];for(let[r,i]of e.entries())T(i)&&t(i)&&n.push(r);return v(e,n)}function v(e,t){if(t.length===0)return e;let n=[...e];for(let r of t){let t=e[r];n[r]={...t,hittable:!1,interactionBlocked:`covered`,presentationHints:L(t.presentationHints)}}return n}function y(e){return e.interactionBlocked!==void 0}function b(t,n,r,i){let a=t.coverCache.get(n);if(a!==void 0)return a;t.coverCache.set(n,null);let o=I(r.rect);if(!o)return S(t,n,null);let s=e(o),c=i.isAdditionalOverlayNode?.(r)===!0;for(let e of t.overlayPositions){if(!x(t,e,n,c,i))continue;let a=t.nodes[e];if(C(t,e,r,o,s,i))return S(t,n,a)}return S(t,n,null)}function x(e,t,n,r,i){let a=e.nodes[t];return a?t>n?!0:t===n||r?!1:i.isAdditionalOverlayNode?.(a)===!0:!1}function S(e,t,n){return e.coverCache.set(t,n),n}function C(e,t,n,i,a,o){if(!e.nodes[t])return!1;let s=w(e,t,n,i,o);return!!(s&&r(s,a.x,a.y))}function w(e,t,n,r,i){let o=e.nodes[t];if(!o||!E(o,e.byIndex,i)||P(n,o,e.byIndex))return null;let s=I(o.rect);return!s||a(r,s)||b(e,t,o,i)?null:s}function T(e){return I(e.rect)?e.hittable===!0||j(e)?!0:!!(e.label?.trim()||e.value?.trim()||e.identifier?.trim()):!1}function E(e,n,r){return!I(e.rect)||t(e)||D(e,n)?!1:M(e,p)||O(e,n,r)}function D(e,n){if(!M(e,m))return!1;let r=I(e.rect);if(!r)return!1;let i=typeof e.parentIndex==`number`?n.get(e.parentIndex):void 0,o=new Set;for(;i&&!o.has(i.index);){if(t(i)){let e=I(i.rect);return!!(e&&a(r,e))}o.add(i.index),i=typeof i.parentIndex==`number`?n.get(i.parentIndex):void 0}return!1}function O(e,t,n){return n.isAdditionalOverlayNode?.(e)===!0&&!k(e,t,n)}function k(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(A(r,n))return!0;i.add(r.index),r=typeof r.parentIndex==`number`?t.get(r.parentIndex):void 0}return!1}function A(e,n){return n.isAdditionalOverlayNode?.(e)===!0&&I(e.rect)!==null&&!t(e)}function j(e){return M(e,h)}function M(e,t){let n=N(e);return t.some(e=>n.includes(e))}function N(e){return[e.type,e.role,e.subrole].map(e=>n(e??``)).join(` `)}function P(e,t,n){return F(e,t,n)||F(t,e,n)}function F(e,t,n){let r=typeof t.parentIndex==`number`?n.get(t.parentIndex):void 0,i=new Set;for(;r&&!i.has(r.index);){if(r.index===e.index)return!0;i.add(r.index),r=typeof r.parentIndex==`number`?n.get(r.parentIndex):void 0}return!1}function I(e){let t=i(e);return t&&t.width>0&&t.height>0?t:null}function L(e){return Array.from(new Set([...e??[],`covered`]))}const R=new Set([`com.google.android.inputmethod.latin`,`com.samsung.android.honeyboard`,`com.touchtype.swiftkey`,`com.microsoft.swiftkey`]);function z(e){let t=J(e.packageName),n=(e.resourceId??``).toLowerCase(),r=J(e.activeInputMethodPackage);if(t&&r&&t===r)return{inputMethodOwned:!0,source:`active-input-method`};if(r&&n.startsWith(`${r}:id/`))return{inputMethodOwned:!0,source:`active-input-method-resource`};if(t&&R.has(t))return{inputMethodOwned:!0,source:`known-ime-package`};for(let e of R)if(n.startsWith(`${e}:id/`))return{inputMethodOwned:!0,source:`known-ime-resource`};return{inputMethodOwned:!1,source:`app`}}function B(e,t,n){return z({packageName:e,resourceId:t,activeInputMethodPackage:n}).inputMethodOwned}function V(e){return z(e).inputMethodOwned}function H(e){return V({packageName:e.bundleId,resourceId:e.identifier})}function U(e){let t=J(e);return!!(t&&R.has(t))}function W(e){let t=(e??``).toLowerCase();for(let e of R)if(t.startsWith(`${e}:id/`))return!0;return!1}function G(e,t,n){return!e&&!t?`unknown`:B(e,t,n)?`ime`:`app`}function K(e){for(let t of[/\bmCurMethodId=([^\s]+)/i,/\bmCurId=([^\s]+)/i,/\bmCurrentInputMethodId=([^\s]+)/i,/\bcurMethodId=([^\s]+)/i]){let n=q(e.match(t)?.[1]);if(n)return n}}function q(e){let t=(e??``).trim();if(t)return J((t.split(`/`)[0]??``).match(/[a-zA-Z0-9_.]+/)?.[0])}function J(e){return(e??``).trim().toLowerCase()||void 0}export{W as a,_ as c,d,u as f,U as i,y as l,f as m,H as n,K as o,l as p,V as r,g as s,G as t,c as u};
|
package/dist/src/android.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime.js";import{
|
|
1
|
+
import{r as e}from"./rolldown-runtime.js";import{D as t}from"./sdk-contracts.js";import{c as n}from"./diagnostics.js";import"./diagnostics2.js";import{f as r}from"./adb-executor.js";import{A as i,C as a,D as o,E as s,M as c,O as l,S as u,T as d,a as f,b as p,c as m,f as h,g,i as _,j as v,k as y,l as b,m as x,o as S,s as C,u as w,w as T,x as E}from"./mechanics.js";import{a as D,i as O,n as k}from"./app-lifecycle.js";import"./platform-runtime-android-adb-host.js";import{n as A}from"./scoped-provider.js";import{t as j}from"./snapshot-state.js";var M=e({createAndroidInteractor:()=>P});function N(e){return e?`daemon-session`:`command`}function P(e,M,P){let F=N(P?.appBundleId),I=t=>({...t===void 0?{}:{timeoutMs:t},captureNodes:async()=>{let t=await m(e,{includeHiddenContentHints:!1});return j(b(t),void 0).nodes}}),L={open:(t,n)=>O(e,t,{activity:n?.activity,appBundleId:n?.appBundleId,launchArgs:n?.launchArgs,url:n?.url}),openDevice:()=>D(e),close:t=>k(e,t),tap:(t,n)=>s(e,t,n),doubleTap:async(t,n)=>{await s(e,t,n),await s(e,t,n)},longPress:(t,n,r)=>d(e,t,n,r),focus:(t,n)=>a(e,t,n),type:(t,n)=>f(e,t,n),fill:(t,n,r,i)=>_(e,t,n,r,i,{helperSessionScope:F}),scroll:(t,n)=>y(e,t,{...n,helperSessionScope:F}),performGesture:t=>v(e,t),gestureViewport:()=>c(e,{helperSessionScope:F}),screenshot:(t,n)=>S(e,t,n),readTextAtPoint:async(t,n)=>{let{readAndroidTextAtPoint:r}=await import(`./mechanics.js`).then(e=>e.r);return await r(e,t.x,t.y,{helperSessionScope:N(n?.appBundleId)})??void 0},snapshot:async t=>{let r=t??{},i=await n(`snapshot_capture`,async()=>await m(e,{appBundleId:r.appBundleId,signal:r.signal??P?.signal,interactiveOnly:r.interactiveOnly,depth:r.depth,scope:r.scope,raw:r.raw,includeHiddenContentHints:r.includeHiddenContentHints,helperSessionScope:N(r.appBundleId)}),{backend:`android`});return b(i)},back:t=>u(e),home:()=>T(e),setOrientation:t=>i(e,t),appSwitcher:()=>E(e),actionButton:()=>{throw new t(`UNSUPPORTED_OPERATION`,`action-button presses iPhone Action Button hardware, which Android has no equivalent for`)},tvRemote:(t,n)=>l(e,t,n),keyboardStatus:async()=>({kind:`ime-probe`,...await h(e)}),keyboardDismiss:async()=>({kind:`ime-probe`,...await w(e)}),keyboardEnter:async()=>(await o(e),{kind:`android-acknowledged`}),readClipboard:()=>x(e),writeClipboard:t=>g(e,t),setSetting:(t,n,r,i)=>C(e,t,n,r,i),readAlert:async()=>await p(e,`get`,I()),awaitAlert:async t=>await p(e,`wait`,I(t?.timeoutMs)),acceptAlert:async()=>await p(e,`accept`,I()),dismissAlert:async()=>await p(e,`dismiss`,I())};return M?A(L,t=>r(M,{serial:e.id},t)):L}export{P as n,M as t};
|
package/dist/src/app-catalog.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{D as e}from"./sdk-contracts.js";const t=1e3;function n(t){if(t)throw new e(`UNAUTHORIZED`,`Limrun uploaded apps are unavailable on the public daemon HTTP surface.`)}async function r(e,n,r){r?.throwIfAborted();let i=await e.assets.list({limit:t},{signal:r});r?.throwIfAborted();let a=[];for(let e of i){let t=o(e,n);t&&a.push(t)}return a.sort((e,t)=>e.name.localeCompare(t.name))}async function i(n,r,i,a){a?.throwIfAborted();let s=await n.assets.list({limit:t,nameFilter:i},{signal:a});a?.throwIfAborted();let c=s.filter(e=>e.name===i).map(e=>o(e,r)).filter(e=>e!==void 0);if(c.length<=1)return c[0];throw new e(`COMMAND_FAILED`,`Limrun returned multiple uploaded apps named ${i}.`,{app:i,platform:r,assetIds:c.map(e=>e.id)})}function a(e,t){let n=l(e.replace(/\.(?:tar\.gz|tgz|tar|zip|ipa|apk)$/i,``).replace(/\.app$/i,``));if(n.length<5)return;let r=t.map(e=>({app:e,keys:c(e)})).filter(({keys:e})=>e.includes(n));return r.length===1?r[0]?.app.id:void 0}function o(e,t){if(e.md5&&s(e)===t)return{id:e.id,name:e.name}}function s(e){if(e.os===`android`||e.os===`ios`)return e.os;let t=e.name.toLowerCase();if(t.endsWith(`.apk`))return`android`;if(t.endsWith(`.ipa`)||t.endsWith(`.zip`)||t.endsWith(`.tar`)||t.endsWith(`.tar.gz`)||t.endsWith(`.tgz`))return`ios`}function c(e){let t=e.id.split(/[.:/]/).at(-1);return[e.id,t,e.name].filter(e=>typeof e==`string`).map(l)}function l(e){return e.toLowerCase().replaceAll(/[^a-z0-9]+/g,``)}export{n as assertLimrunUploadedAppAccess,r as listLimrunAppAssets,a as resolveInstalledAppIdForAsset,i as resolveLimrunAppAsset};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{D as e}from"./sdk-contracts.js";import{o as t}from"./adb.js";import{t as n}from"./app-resolution-cache.js";const r=/\.(?:apk|aab)$/i,i=/^[A-Za-z_][\w]*(\.[A-Za-z_][\w]*)+$/;function a(e){let t=e.trim();return t.length===0?`other`:r.test(t)?t.includes(`/`)||t.includes(`\\`)||t.startsWith(`.`)||t.startsWith(`~`)||!o(t)?`binary`:`package`:o(t)?`package`:`other`}function o(e){return i.test(e)}function s(e){return`Android runtime hints require an installed package name, not "${e}". Install or reinstall the app first, then relaunch by package.`}const c={settings:{type:`intent`,value:`android.settings.SETTINGS`}},l=`Run agent-device apps --platform android to discover the installed package name, then retry open with that exact package.`,u=n();function d(e){return{platform:`android`,deviceId:e.id,variant:e.target??``}}async function f(e,t){return await u.invalidateWhile(d(e),t)}async function p(n,r){let i=r.trim();if(a(i)===`package`)return{type:`package`,value:i};let o=c[i.toLowerCase()];if(o)return o;let s=d(n),f=u.get(s,i);if(f)return f;let p=(await t(n,[`pm`,`list`,`packages`])).stdout.split(`
|
|
2
2
|
`).map(e=>e.replace(`package:`,``).trim()).filter(Boolean).filter(e=>e.toLowerCase().includes(i.toLowerCase())),m=p[0];if(m!==void 0&&p.length===1)return u.set(s,i,{type:`package`,value:m});throw p.length>1?new e(`INVALID_ARGS`,`Multiple packages matched "${r}"`,{matches:p,hint:`Run agent-device apps --platform android to see the exact installed package names before retrying open.`}):new e(`APP_NOT_INSTALLED`,`No package found matching "${r}"`,{hint:l})}function m(e){let t=new Set([`com`,`android`,`google`,`app`,`apps`,`service`,`services`,`mobile`,`client`]),n=e.split(`.`).flatMap(e=>e.split(/[_-]+/)).map(e=>e.trim().toLowerCase()).filter(e=>e.length>0),r=n.at(-1)??e;for(let e=n.length-1;e>=0;--e){let i=n[e];if(i&&!t.has(i)){r=i;break}}return r.split(/[^a-z0-9]+/i).filter(Boolean).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(` `)}export{a,f as i,m as n,s as o,p as r,l as t};
|
package/dist/src/app-helpers.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{n as e}from"./app-inventory.js";import"./device.js";import"./adb-executor.js";import{n
|
|
1
|
+
import{n as e}from"./app-inventory.js";import"./device.js";import{d as t}from"./adb-executor.js";import{n}from"./adb-failure.js";import{n as r}from"./app-deployment-resolution.js";import{a as i,i as a}from"./app-parsers.js";const o=`android.intent.category.LAUNCHER`,s=`android.intent.category.LEANBACK_LAUNCHER`;async function c(t,n={}){let i=await l(t,n.target??`auto`);return(e(n.filter)===`user-installed`?(await p(t)).filter(e=>i.has(e)):Array.from(i)).map(e=>({package:e,name:r(e)})).sort((e,t)=>e.package.localeCompare(t.package))}async function l(e,n){let r=(await Promise.all(u(n).map(async n=>{let r=await t(e,d(n),{allowFailure:!0});return r.exitCode===0?f(r.stdout):[]}))).flat();return new Set(r)}function u(e){switch(e){case`mobile`:return[o];case`tv`:return[s];default:return[o,s]}}function d(e){return[`cmd`,`package`,`query-activities`,`--brief`,`-a`,`android.intent.action.MAIN`,`-c`,e]}function f(e){return e.trim().length===0?[]:a(e)}async function p(e){let r=await t(e,[`pm`,`list`,`packages`,`-3`],{allowFailure:!0});if(r.exitCode!==0)throw n(`Failed to list Android user-installed apps`,r);return i(r.stdout)}export{c as listAndroidAppsWithAdb};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{D as e}from"./sdk-contracts.js";function t(e){return e??`user-installed`}function n(t){if(t===void 0)throw new e(`INVALID_ARGS`,`appsFilter must be resolved before executing the apps command`);return t}export{t as n,n as t};
|
package/dist/src/app-launch.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
2
|
-
`)||e.endsWith(`\r`)?`${e}${t}`:`${e}\n${t}`}async function W(e,t,n){await L(t),await
|
|
1
|
+
import{D as e}from"./sdk-contracts.js";import{a as t,i as n,r}from"./sdk-batch-runner.js";import{d as i,u as a}from"./sdk-device.js";import{n as o,t as s}from"./launch-console.js";import"./observability.js";import{r as c}from"./diagnostics.js";import{n as l}from"./exec.js";import"./diagnostics2.js";import"./command.js";import{i as u,n as d}from"./retry.js";import{D as f,o as p}from"./host-file.js";import{n as m,p as h}from"./config.js";import{a as g,o as _}from"./tool-provider.js";import{t as v}from"./simctl.js";import{n as y,r as b}from"./apps-simctl.js";import{t as x}from"./physical-device-control.js";import{h as S}from"./runner-client.js";import{t as C}from"./simulator.js";import{a as w,l as T,u as E}from"./app-resolution.js";import D from"node:path";function O(t){if(!(t instanceof e)||t.code!==`COMMAND_FAILED`)return!1;let n=t.details??{};if(n.exitCode!==4)return!1;let r=String(n.stderr??``).toLowerCase();return r.includes(`fbsopenapplicationserviceerrordomain`)&&r.includes(`the request to open`)}async function k(e,t){let n=await _(v(e,[`get_app_container`,e.id,t]),{allowFailure:!0});if(n.exitCode!==0)return{installed:!1};let r=n.stdout.trim();if(!r)return{installed:!1};let i=await g(`plutil`,[`-extract`,`CFBundleExecutable`,`raw`,`-o`,`-`,`${r}/Info.plist`],{allowFailure:!0});if(i.exitCode!==0||!i.stdout.trim())return{installed:!0};let a=`${r}/${i.stdout.trim()}`,o=await g(`otool`,[`-l`,a],{allowFailure:!0});if(o.exitCode!==0)return{installed:!0};let s=o.stdout.toLowerCase();return{installed:!0,simulatorCompatible:s.includes(`iossimulator`)||s.includes(`platform 7`)}}function A(e){return e.installed?e.simulatorCompatible===!1?`ARCH_MISMATCH`:`PERSISTENT_LAUNCH_FAIL`:`APP_NOT_INSTALLED`}function j(e){switch(e){case`ARCH_MISMATCH`:return`The app binary was not built for the simulator platform. Rebuild with a simulator destination or use a physical device.`;case`APP_NOT_INSTALLED`:return`The app bundle is not installed on this simulator. Run install before open.`;case`PERSISTENT_LAUNCH_FAIL`:return`The simulator repeatedly refused to launch the app. Inspect crash logs in Console.app or ~/Library/Logs/DiagnosticReports/ and consider reinstalling the app.`;default:return`The simulator failed to launch the app. Retry with --debug and inspect diagnostics log for details.`}}const M=25e3;async function N(c,l,u){let d=u?.launchConsole?.trim(),f=u?.launchArgs;if(d&&(!a(c)||c.kind!==`simulator`))throw new e(`UNSUPPORTED_OPERATION`,o);if(i(c)){if(f&&f.length>0)throw new e(`UNSUPPORTED_OPERATION`,`--launch-args is not supported on macOS; launch arguments are currently iOS-only.`);await E(c,l,u);return}let p=u?.url?.trim();if(p){if(d)throw new e(`INVALID_ARGS`,s);if(!r(p))throw new e(`INVALID_ARGS`,`open <app> <url> requires a valid URL target`);if(c.kind===`simulator`){let e=!!f||n(p);if(u?.terminateRunningApp||e){let t=u?.appBundleId??await w(c,l);e?await z(c,t,{...f?{launchArgs:f}:{},...u?.terminateRunningApp?{terminateRunningApp:!0}:{}}):await R(c,t)}await P(c,p,void 0);return}let i=u?.appBundleId??await w(c,l),a=t(i,p);if(!a)throw new e(`INVALID_ARGS`,`Deep link open on iOS devices requires an active app bundle ID. Open the app first, then open the URL.`);await W(c,a,{payloadUrl:p,launchArgs:f,runnerOptions:u?.runnerOptions});return}let m=l.trim();if(r(m)){if(d)throw new e(`INVALID_ARGS`,s);if(c.kind===`simulator`){await P(c,m,f);return}let n=t(u?.appBundleId,m);if(!n)throw new e(`INVALID_ARGS`,`Deep link open on iOS devices requires an active app bundle ID. Open the app first, then open the URL.`);await W(c,n,{payloadUrl:m,launchArgs:f,runnerOptions:u?.runnerOptions});return}let h=u?.appBundleId??await w(c,l);if(c.kind===`simulator`){await z(c,h,{...d?{launchConsole:d}:{},...f?{launchArgs:f}:{},...u?.terminateRunningApp?{terminateRunningApp:!0}:{}});return}await W(c,h,{launchArgs:f,runnerOptions:u?.runnerOptions})}async function P(t,n,r){if(r&&r.length>0)throw new e(`INVALID_ARGS`,`--launch-args is not supported with iOS simulator URL opens (simctl openurl ignores launch args). Launch the app first with --launch-args, then issue the URL open in a separate call.`);await C(t),await y(t,[`openurl`,t.id,n])}async function F(e){i(e)||e.kind===`simulator`&&await C(e)}async function I(e,t,n){if(i(e)){await T(e,t);return}let r=await w(e,t);if(e.kind===`simulator`){await R(e,r);return}await L(r),await x(e).terminateApp(e,r,{runnerOptions:n,runRunnerCommand:S})}async function L(t){let{iosSystemSurfaceHost:n,iosSystemSurfaceOpenRefusal:r}=await import(`./ios-system-surface.js`).then(e=>e.a);if(n(t))throw new e(`UNSUPPORTED_OPERATION`,r(t),{reason:`system-surface-host-not-openable`,appBundleId:t})}async function R(t,n){await L(n),await C(t);let r=b(t,[`terminate`,t.id,n]),i=await _(r,{allowFailure:!0,timeoutMs:h});if(i.exitCode!==0&&!i.stderr.toLowerCase().includes(`found nothing to terminate`))throw new e(`COMMAND_FAILED`,`xcrun exited with code ${i.exitCode}`,l(i,{cmd:`xcrun`,args:r}))}async function z(t,n,r){await L(n),await C(t);let i=0,a=d.fromTimeoutMs(m);try{await u(async({deadline:i})=>{if(i?.isExpired())throw new e(`COMMAND_FAILED`,`App launch deadline exceeded`,{timeoutMs:m});let a=b(t,B(t.id,n,r)),o=r?.launchConsole?await V(a,r.launchConsole):await _(a,{allowFailure:!0});if(o.exitCode!==0)throw new e(`COMMAND_FAILED`,`xcrun exited with code ${o.exitCode}`,l(o,{cmd:`xcrun`,args:a}))},{maxAttempts:10,baseDelayMs:1e3,maxDelayMs:5e3,jitter:.2,shouldRetry(e){return O(e)?(i+=1,i<3):!1}},{deadline:a})}catch(e){if(O(e)){let r=e,i=A(await k(t,n));r.details={...r.details,hint:j(i)}}throw e}}function B(e,t,n){let r=[`launch`];return n?.launchConsole&&r.push(`--console-pty`),n?.terminateRunningApp&&r.push(`--terminate-running-process`),r.push(e,t),n?.launchArgs&&n.launchArgs.length>0&&r.push(...n.launchArgs),r}async function V(t,n){await p(D.dirname(n));try{let e=await _(t,{allowFailure:!0,timeoutMs:M});return await H(n,e.stdout,e.stderr),e}catch(t){let r=(t instanceof e?t:void 0)?.details;if(r?.timeoutMs===M){let e=typeof r.stdout==`string`?r.stdout:``,t=typeof r.stderr==`string`?r.stderr:``;return await H(n,e,t),c({level:`warn`,phase:`ios_simulator_launch_console_capture_timeout`,data:{timeoutMs:M,logPath:n,stdoutBytes:Buffer.byteLength(e),stderrBytes:Buffer.byteLength(t)}}),{stdout:e,stderr:t,exitCode:0}}throw t}}async function H(e,t,n){await f(e,U(t,n))}function U(e,t){return!e||!t||e.endsWith(`
|
|
2
|
+
`)||e.endsWith(`\r`)?`${e}${t}`:`${e}\n${t}`}async function W(e,t,n){await L(t),await x(e).launchApp(e,t,{...n,runRunnerCommand:S})}export{N as n,F as r,I as t};
|