agent-device 0.21.24 → 0.21.25
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.25.apk +0 -0
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.25.apk.sha256 +1 -0
- package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.24.manifest.json → agent-device-android-ime-helper-0.21.25.manifest.json} +4 -4
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.25.apk +0 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.25.apk.sha256 +1 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.25.manifest.json +16 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +159 -4
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerHttpRequestFraming.swift +139 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerListenerPeer.swift +41 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerListenerToken.swift +25 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Environment.swift +18 -11
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Navigation.swift +25 -1
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedTextEntry.swift +0 -3
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +1 -3
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryConfirmation.swift +59 -26
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextTyping.swift +47 -103
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Transport.swift +142 -54
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TypeExecution.swift +4 -1
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +21 -19
- package/dist/src/absence-observation-errors.js +1 -0
- package/dist/src/adapter.js +1 -1
- package/dist/src/adb-executor.js +2 -2
- package/dist/src/adb-failure.js +2 -2
- 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/android-adb.js +1 -1
- package/dist/src/android-input-ownership.js +1 -1
- package/dist/src/android-system-surface-disclosure.js +1 -0
- package/dist/src/android-text-entry.js +1 -0
- package/dist/src/android.js +1 -1
- package/dist/src/app-backend.js +1 -1
- package/dist/src/app-helpers.js +1 -1
- package/dist/src/app-launch.js +1 -1
- package/dist/src/app-lifecycle.js +4 -3
- package/dist/src/app-lifecycle2.js +2 -2
- package/dist/src/app-log-files.js +1 -1
- package/dist/src/app-log-reconnect.js +1 -1
- package/dist/src/app-log-runtime2.js +3 -3
- package/dist/src/app-resolution-facade.js +1 -1
- package/dist/src/app-resolution.js +2 -2
- package/dist/src/apple-runner-platform.js +1 -1
- package/dist/src/artifact-download.js +1 -1
- package/dist/src/auth.js +1 -1
- package/dist/src/aws-device-farm-connection.js +1 -1
- package/dist/src/back-mode.js +1 -1
- package/dist/src/boot-diagnostics.js +1 -1
- package/dist/src/browserstack-connection.js +1 -1
- package/dist/src/capture-disclosure.js +1 -0
- package/dist/src/cli-config.js +1 -1
- package/dist/src/cli-help.js +17 -14
- package/dist/src/cli-output.js +1 -1
- package/dist/src/cli-runner.js +3 -1
- package/dist/src/cli.js +3 -3
- package/dist/src/client-companion-tunnel.js +1 -1
- package/dist/src/client-metro.js +1 -1
- package/dist/src/client-types.d.ts +8 -2
- package/dist/src/code-signature-cache.js +1 -1
- package/dist/src/code-signature.js +1 -1
- package/dist/src/command-metadata.js +73 -1
- package/dist/src/command-policy.js +1 -0
- package/dist/src/command-schema.js +3 -3
- package/dist/src/command-surface.js +1 -1
- package/dist/src/command-tools.js +2 -2
- package/dist/src/connection-runtime.js +1 -1
- package/dist/src/connection-verification.js +1 -1
- package/dist/src/connection.js +3 -3
- package/dist/src/contracts.js +1 -1
- package/dist/src/daemon-client-lease-beat.js +1 -1
- package/dist/src/daemon-client-lifecycle.js +1 -1
- package/dist/src/daemon-client-liveness-probe.js +1 -1
- package/dist/src/daemon-policy-file.js +1 -1
- package/dist/src/daemon-registration-owner.js +1 -1
- package/dist/src/daemon-registration.js +1 -1
- package/dist/src/daemon-resolution.js +3 -1
- package/dist/src/debug-symbols-facade.js +1 -1
- package/dist/src/device-claim-inspection.js +1 -1
- package/dist/src/device-input-state.d.ts +5 -3
- package/dist/src/device-inventory-context.js +1 -1
- package/dist/src/device-readiness-runtime.js +1 -1
- package/dist/src/device-release.js +1 -1
- package/dist/src/device-shell.js +1 -1
- package/dist/src/device.js +3 -1
- package/dist/src/devicectl.js +1 -1
- package/dist/src/diagnostics.js +1 -1
- package/dist/src/doctor-facade.js +1 -1
- package/dist/src/durable-capture-resource.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/expo-dev-client-launch.js +1 -0
- package/dist/src/file.js +3 -1
- package/dist/src/find.js +1 -1
- package/dist/src/finders.js +1 -1
- package/dist/src/generic-settle.js +1 -1
- package/dist/src/generic.js +1 -1
- package/dist/src/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 +2 -2
- package/dist/src/human-control.js +1 -1
- package/dist/src/ime-rebind.js +1 -1
- package/dist/src/ime-state.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 +2 -2
- package/dist/src/install-source-network-transport.js +1 -1
- package/dist/src/install-source2.js +1 -1
- package/dist/src/interaction-error.js +1 -0
- package/dist/src/interaction-positionals.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/internal/bin.js +1 -1
- package/dist/src/internal/daemon.js +5 -1
- package/dist/src/internal/png-worker.js +1 -1
- package/dist/src/inventory.js +2 -2
- package/dist/src/inventory6.js +1 -1
- package/dist/src/io.d.ts +2 -2
- package/dist/src/ios-client.js +1 -1
- package/dist/src/ios-settings.js +1 -1
- package/dist/src/ios-snapshot-acquisition.js +1 -1
- package/dist/src/ios-snapshot-adapter.js +1 -1
- package/dist/src/ios-snapshot-engine.js +1 -1
- package/dist/src/ios-snapshot-runtime.js +1 -1
- package/dist/src/keyed-lock.js +1 -1
- package/dist/src/launch-confirmation.js +1 -1
- package/dist/src/lease.js +1 -1
- package/dist/src/limrun-runtime-dependencies.js +1 -1
- package/dist/src/limrun.d.ts +2 -10
- package/dist/src/limrun.js +1 -1
- package/dist/src/linux.js +1 -1
- package/dist/src/load.js +1 -1
- package/dist/src/local-interactor-operation-set.js +1 -1
- package/dist/src/log-stream.js +9 -9
- package/dist/src/mechanics.js +16 -16
- package/dist/src/metro.js +1 -1
- package/dist/src/metro2.js +1 -1
- package/dist/src/mobile-snapshot-semantics.js +1 -1
- package/dist/src/observability.js +1 -1
- package/dist/src/open-target-resolution.js +1 -1
- package/dist/src/output-path.js +1 -1
- package/dist/src/overlay.js +1 -3
- package/dist/src/perf-facade.js +1 -1
- package/dist/src/perf-runtime-operation-builder.js +1 -1
- package/dist/src/perf-runtime.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-app-log-android-transport.js +1 -1
- package/dist/src/platform-runtime-apple-resources.js +1 -0
- package/dist/src/platform-runtime-claim-recovery.js +1 -0
- package/dist/src/platform-runtime-daemon-services.js +1 -0
- package/dist/src/platform-runtime-host.js +1 -1
- package/dist/src/platform-runtime-network-web-transport.js +1 -1
- package/dist/src/platform-runtime-open-target.js +1 -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-harmony-host.js +1 -1
- package/dist/src/platform-runtime-screen-recording-web-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/plugin.js +1 -1
- package/dist/src/png-crop-bytes.js +1 -1
- package/dist/src/png-resize.js +1 -0
- package/dist/src/png-worker-client.js +1 -1
- package/dist/src/png-worker-contract.js +1 -1
- package/dist/src/process-entry.js +1 -1
- package/dist/src/process.js +1 -1
- package/dist/src/provider-credential-fingerprint.js +1 -1
- package/dist/src/provider-device-admission.js +1 -1
- package/dist/src/provider-policy.js +1 -1
- package/dist/src/provider-webdriver.js +1 -1
- package/dist/src/proxy.js +2 -2
- package/dist/src/quality-warnings.js +1 -1
- package/dist/src/react-native-overlay2.js +3 -0
- package/dist/src/react-native.js +1 -1
- package/dist/src/record-runtime.js +1 -1
- package/dist/src/record-trace.js +1 -1
- package/dist/src/recording.js +2 -2
- package/dist/src/register-builtins.js +1 -1
- package/dist/src/remote-config-core.js +1 -1
- package/dist/src/replay-backend-registry.js +1 -0
- package/dist/src/replay-divergence.js +1 -1
- package/dist/src/replay-maestro-backend.js +117 -0
- package/dist/src/replay-script-selection.js +1 -0
- package/dist/src/replay.js +1 -3
- package/dist/src/replay2.js +1 -0
- package/dist/src/reporting.js +3 -3
- package/dist/src/request-cancel.js +1 -1
- package/dist/src/request-providers.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-retention.js +1 -1
- package/dist/src/runner-cache-trim.js +1 -1
- package/dist/src/runner-client.js +1 -1
- package/dist/src/runner-dev-tools-security.js +1 -1
- package/dist/src/runner-device-readiness.js +1 -1
- package/dist/src/runner-device-set.js +1 -1
- package/dist/src/runner-error-classification.js +3 -3
- package/dist/src/runner-exchange.js +1 -1
- package/dist/src/runner-lease.js +1 -1
- package/dist/src/runner-operations-facade.js +1 -1
- package/dist/src/runner-retention.js +1 -0
- package/dist/src/runner-start-budget.js +1 -1
- package/dist/src/runner-startup-transport.js +1 -0
- package/dist/src/runner-toolchain-probe.js +1 -1
- package/dist/src/runner.js +2 -1
- package/dist/src/runtime-command-surface.js +1 -0
- package/dist/src/runtime-deployment.js +1 -1
- package/dist/src/runtime-factory.js +1 -0
- package/dist/src/runtime-session.js +1 -0
- package/dist/src/runtime-transport-hints.js +1 -1
- package/dist/src/runtime.js +2 -1
- package/dist/src/runtime10.js +2 -1
- package/dist/src/runtime2.js +5 -2
- package/dist/src/runtime3.js +1 -5
- package/dist/src/runtime4.js +5 -1
- package/dist/src/runtime5.js +1 -5
- 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/screenshot-image.js +1 -1
- package/dist/src/screenshot-runtime.js +1 -0
- package/dist/src/screenshot3.js +5 -5
- package/dist/src/sdk-batch-runner.js +2 -2
- package/dist/src/sdk-batch.js +1 -1
- package/dist/src/sdk-contracts.js +2 -2
- package/dist/src/sdk-finders.js +1 -1
- package/dist/src/sdk-io.d.ts +4 -2
- package/dist/src/sdk-selectors.d.ts +4 -5
- package/dist/src/sdk-selectors.js +1 -1
- package/dist/src/selection.js +0 -0
- package/dist/src/selector-pipeline-policy.js +1 -1
- package/dist/src/selector-runtime.js +1 -1
- package/dist/src/selectors.js +1 -1
- package/dist/src/server.js +2 -2
- package/dist/src/session-allocation.js +1 -1
- package/dist/src/session-replay-runtime-failure-response.js +1 -0
- package/dist/src/session-runtime-admission.js +1 -0
- package/dist/src/session.js +1 -1
- package/dist/src/session2.js +5 -5
- package/dist/src/settings.js +1 -1
- package/dist/src/settings2.js +1 -1
- package/dist/src/simctl-settings.js +1 -1
- package/dist/src/simulator.js +1 -1
- package/dist/src/snapshot-chrome.js +1 -0
- package/dist/src/snapshot-desktop-projection.js +1 -1
- package/dist/src/snapshot-evidence.js +1 -0
- package/dist/src/snapshot-node-lookup.js +1 -0
- package/dist/src/snapshot-occlusion.js +1 -0
- package/dist/src/snapshot-quality-verdict.js +1 -0
- 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/src.js +5 -1
- package/dist/src/src2.js +1 -1
- package/dist/src/src3.js +2 -1
- package/dist/src/store.js +1 -1
- package/dist/src/surface-snapshot2.js +1 -1
- package/dist/src/target-evidence-tree.js +1 -0
- package/dist/src/target-evidence.js +1 -1
- package/dist/src/text-entry-focus.js +1 -1
- package/dist/src/tool-provider2.js +1 -1
- package/dist/src/touch-runtime.js +1 -1
- package/dist/src/touch-runtime2.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/undici.js +8 -8
- package/dist/src/update-check.js +1 -1
- package/dist/src/vars.js +2 -0
- package/dist/src/version.js +1 -1
- package/dist/src/video.js +2 -2
- package/dist/src/wait.js +1 -0
- package/dist/src/web.js +1 -1
- package/dist/src/web2.js +1 -1
- package/package.json +9 -11
- package/server.json +2 -2
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.24.apk +0 -0
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.24.apk.sha256 +0 -1
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.24.apk +0 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.24.apk.sha256 +0 -1
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.24.manifest.json +0 -16
- package/dist/src/adb-transport.js +0 -1
- package/dist/src/alert-runtime.js +0 -1
- package/dist/src/app-deployment-resolution.js +0 -2
- package/dist/src/app-inventory-contract.js +0 -1
- package/dist/src/app-log-session-resource.js +0 -1
- package/dist/src/application-lifecycle-runtime.js +0 -1
- package/dist/src/auth-session.js +0 -1
- package/dist/src/browserstack-device-features.js +0 -1
- package/dist/src/browserstack.js +0 -1
- package/dist/src/cache.js +0 -1
- package/dist/src/capture.js +0 -1
- package/dist/src/catalog.js +0 -1
- package/dist/src/click-button.js +0 -1
- package/dist/src/client-metro-companion.js +0 -1
- package/dist/src/client-options.js +0 -3
- package/dist/src/daemon-client-transport.js +0 -1
- package/dist/src/daemon-http.js +0 -1
- package/dist/src/device-rotation.js +0 -1
- package/dist/src/device-session.js +0 -3
- package/dist/src/device2.js +0 -1
- package/dist/src/device3.js +0 -3
- package/dist/src/dispatch-resolve.js +0 -4
- package/dist/src/format.js +0 -2
- package/dist/src/gesture-plan-types.js +0 -1
- package/dist/src/host.js +0 -1
- package/dist/src/ime-settings-record.js +0 -1
- package/dist/src/interaction-ref-policy.js +0 -1
- package/dist/src/interactor-operation-binding.js +0 -1
- package/dist/src/keyboard-actions.js +0 -1
- package/dist/src/lease-context.js +0 -1
- package/dist/src/lease-registry-scope.js +0 -1
- package/dist/src/lease-scope.js +0 -1
- package/dist/src/managed-device-scope.js +0 -1
- package/dist/src/manifest.js +0 -1
- package/dist/src/observe-until.js +0 -1
- package/dist/src/output-common.js +0 -5
- package/dist/src/owner-identity.js +0 -3
- package/dist/src/path-resolution.js +0 -1
- package/dist/src/perf-runtime-plan.js +0 -1
- package/dist/src/platform-runtime-app-log-process.js +0 -1
- package/dist/src/platform-runtime-managed-owner.js +0 -1
- package/dist/src/platform-runtime-screen-recording-process-host.js +0 -1
- package/dist/src/png.js +0 -1
- package/dist/src/provider-session-ownership.js +0 -2
- package/dist/src/providers.js +0 -1
- package/dist/src/registry.js +0 -68
- package/dist/src/remote-connection-state.js +0 -1
- package/dist/src/request-admission.js +0 -1
- package/dist/src/request-cancellation.js +0 -1
- package/dist/src/request-progress-protocol.js +0 -1
- package/dist/src/runner-cache-metadata.js +0 -2
- package/dist/src/runner-disposal.js +0 -1
- package/dist/src/runner-session-types.js +0 -1
- package/dist/src/runtime-admission.js +0 -1
- package/dist/src/runtime11.js +0 -2
- package/dist/src/screen-recording-resource-recovery.js +0 -1
- package/dist/src/screenshot-result.js +0 -1
- package/dist/src/script.js +0 -1
- package/dist/src/scroll-command.js +0 -1
- package/dist/src/scroll-gesture.js +0 -1
- package/dist/src/scroll-indicator.js +0 -1
- package/dist/src/session-artifact-paths.js +0 -1
- package/dist/src/session-paths.js +0 -1
- package/dist/src/session-repair-tombstone.js +0 -1
- package/dist/src/session-snapshot.js +0 -1
- package/dist/src/snapshot-private-evidence.js +0 -1
- package/dist/src/snapshot4.js +0 -1
- package/dist/src/src4.js +0 -1
- package/dist/src/src5.js +0 -1
- package/dist/src/src6.js +0 -1
- package/dist/src/src7.js +0 -2
- package/dist/src/src8.js +0 -115
- package/dist/src/string-enum.js +0 -1
- package/dist/src/success-text.js +0 -1
- package/dist/src/transport.js +0 -3
- package/dist/src/ttl-memo.js +0 -1
- package/dist/src/verified-file.js +0 -1
- package/dist/src/window-state.js +0 -1
- /package/dist/src/{doctor-output.js → doctor-lines.js} +0 -0
package/dist/src/process.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime.js";import{
|
|
1
|
+
import{r as e}from"./rolldown-runtime.js";import{A as t,B as n,C as r,D as i,E as a,M as o,N as s,O as c,P as l,S as u,T as d,_ as f,b as ee,c as p,d as m,f as h,g,h as _,j as v,k as y,l as b,m as x,o as S,p as te,s as ne,u as re,v as ie,w as C,x as w,y as T}from"./file.js";import{h as E}from"./exec.js";import D from"node:fs";import O from"node:path";async function k(e,t={}){let n=j(),r=M(t);for(let t of e.read()){if(!A(t))continue;let i=await N(t,r,n);i.length===0?e.clear(t.scope):i.length!==t.records.length&&e.replace(t.scope,i)}return Object.freeze(n)}function A(e){return e.status===`decoded`}function j(){return{inspected:0,inspectedPids:[],terminated:0,terminatedPids:[],missing:0,missingPids:[],ownershipLost:0,ownershipLostPids:[],skippedForOpenWebSession:!1}}function M(e){return{openWebSession:(e.openWebSessionNames??[]).length>0,purposes:e.purposes?new Set(e.purposes):void 0,termTimeoutMs:e.termTimeoutMs??1500,killTimeoutMs:e.killTimeoutMs??1e3}}async function N(e,t,n){let r=[];for(let i of e.records){if(P(e.scope.kind,i,t)){r.push(i),I(e.scope.kind,i,t)&&(n.skippedForOpenWebSession=!0);continue}n.inspected+=1,n.inspectedPids.push(i.pid),L(n,i,await ae(i,t),r)}return r}function P(e,t,n){return!F(t,n)||I(e,t,n)}function F(e,t){return t.purposes===void 0||t.purposes.has(e.purpose)}function I(e,t,n){return e===`daemon`&&t.purpose===`managed-web-browser`&&n.openWebSession}function L(e,t,n,r){if(n===`terminated`){e.terminated+=1,e.terminatedPids.push(t.pid);return}if(n===`missing`){e.missing+=1,e.missingPids.push(t.pid);return}e.ownershipLost+=1,e.ownershipLostPids.push(t.pid),r.push(t)}async function ae(e,t){let n=await R(e);return n===void 0?(U(e.pid,z(e)),await B(e,t)):n}async function R(e){if(e.pid===process.pid||!T(e.pid))return`missing`;let t=await c(e.pid);return t.zombie?`missing`:H(e,t)?void 0:`ownership-lost`}function z(e){return e.purpose===`simctl-screen-recording`?`SIGINT`:`SIGTERM`}async function B(e,t){let n=await V(e,t.termTimeoutMs);return n===`exited`?`terminated`:n===`ownership-lost`?`ownership-lost`:(U(e.pid,`SIGKILL`),await V(e,t.killTimeoutMs)===`exited`?`terminated`:`ownership-lost`)}async function V(e,t){if(await s(e.pid,t),!T(e.pid))return`exited`;let n=await c(e.pid);return n.zombie?`exited`:H(e,n)?`owned-alive`:`ownership-lost`}function H(e,t){return t.startTime===e.startTime&&t.command===e.command}function U(e,t){try{process.kill(e,t)}catch{}}const W=`owned-processes.json`;function G(e){let t=O.resolve(e.stateDir),r=O.resolve(e.sessionsDir),i=O.join(t,W),a=t=>{if(t.kind===`daemon`)return i;let n=O.resolve(e.resolveSessionDir(t.sessionId));if(O.dirname(n)!==r)throw TypeError(`owned process session scope must resolve directly under the sessions dir`);return O.join(n,W)};return Object.freeze({replace(e,t){let r=J(t),i=a(e);if(r.length===0){Y(i);return}let o=O.dirname(i);D.mkdirSync(o,{recursive:!0}),n(i,e=>{let t=D.openSync(e,`wx`,384);try{D.writeFileSync(t,`${JSON.stringify({version:1,processes:r})}\n`,`utf8`),D.fsyncSync(t)}finally{D.closeSync(t)}X(i),D.renameSync(e,i)})},clear(e){Y(a(e))},read(){return q(r,i)}})}function K(e,t){let n;try{X(e),n=JSON.parse(D.readFileSync(e,`utf8`))}catch(n){return{scope:t,path:e,status:`invalid`,records:[],message:$(n)}}if(!se(n))return{scope:t,path:e,status:`invalid`,records:[],message:`owned process record must contain version 1 and a processes array`};try{return{scope:t,path:e,status:`decoded`,records:J(n.processes)}}catch(n){return{scope:t,path:e,status:`invalid`,records:[],message:$(n)}}}function q(e,t){let n=[];if(Z(t)&&n.push(K(t,{kind:`daemon`})),!D.existsSync(e))return n;for(let t of D.readdirSync(e,{withFileTypes:!0}).sort((e,t)=>e.name.localeCompare(t.name))){if(!t.isDirectory())continue;let r=O.join(e,t.name,W);Z(r)&&n.push(K(r,{kind:`session`,sessionId:t.name}))}return n}function J(e){let t=new Set,n=[];for(let r of e){if(!oe(r))throw TypeError(`owned process record has an invalid identity or purpose`);if(t.has(r.pid))throw TypeError(`duplicate owned process pid ${r.pid}`);t.add(r.pid),n.push(Object.freeze({pid:r.pid,startTime:r.startTime,command:r.command,purpose:r.purpose}))}return n.sort((e,t)=>e.pid-t.pid)}function oe(e){return Number.isInteger(e.pid)&&e.pid>0&&typeof e.startTime==`string`&&e.startTime.length>0&&typeof e.command==`string`&&e.command.length>0&&typeof e.purpose==`string`&&e.purpose.length>0}function se(e){return typeof e==`object`&&!!e&&`version`in e&&e.version===1&&`processes`in e&&Array.isArray(e.processes)}function Y(e){try{X(e),D.unlinkSync(e)}catch(e){if(!Q(e))throw e}}function X(e){try{let t=D.lstatSync(e);if(t.isSymbolicLink())throw Error(`Refusing to follow an owned process record symlink`);if(!t.isFile())throw Error(`Owned process record is not a regular file`)}catch(e){if(!Q(e))throw e}}function Z(e){try{return D.lstatSync(e).isFile()}catch{return!1}}function Q(e){return!!(e&&typeof e==`object`&&`code`in e&&e.code===`ENOENT`)}function $(e){return e instanceof Error?e.message:`owned process record is invalid`}var ce=e({classifyOwnerLiveness:()=>S,classifyOwnerLivenessFromObservation:()=>ne,createOwnedProcessRecordStore:()=>G,expandProcessTree:()=>h,hostCurrentWorkingDirectory:()=>te,hostEnvironment:()=>x,hostNodeExecutablePath:()=>_,hostNodeVersion:()=>g,hostPlatform:()=>f,hostProcessId:()=>ie,isProcessAlive:()=>T,isProcessGroupAlive:()=>ee,isProcessPid:()=>p,isProcessZombie:()=>w,listHostProcesses:()=>u,ownerIdentityDiffers:()=>b,ownerIdentityMatches:()=>re,readCurrentOwnerIdentity:()=>m,readHostCpuArch:()=>r,readHostCpuArchSync:()=>C,readHostEnvironmentVariable:()=>d,readHostProcessIdentityObservations:()=>a,readOwnedProcessRecordFile:()=>K,readProcessCommand:()=>i,readProcessIdentityFacts:()=>c,readProcessStartTime:()=>y,reapOwnedProcessRecordsAtStartup:()=>k,signalPidsBestEffort:()=>t,signalProcessGroupBestEffort:()=>E,stopPidsWithEscalation:()=>v,uniquePositivePids:()=>o,waitForProcessExit:()=>s,writeHostStderr:()=>l});export{G as n,k as r,ce as t};
|
|
@@ -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,i as n,n as r}from"./store.js";import{r as i}from"./provider-limrun-credentials.js";import a from"node:crypto";var o=e({providerCredentialFingerprint:()=>c,readDaemonProviderCredentials:()=>u});const s=new Map([[`limrun`,i]]);function c(e,t,n){let r=s.get(e);if(r)return d(r(t,n));let i=l(e,t);return i?d(Object.fromEntries(i.map(e=>[e,t[e]?.trim()?t[e]:void 0]))):void 0}function l(e,i){return n.includes(e)?t(e)?.credentialVariables:r(i).find(t=>t.agentDevicePlugin.provider===e)?.agentDevicePlugin.credentialVariables}function u(e,t){let n={...e};return{fingerprint:(e,t)=>c(e,n,t),stateDir:t}}function d(e){let t=Object.entries(e).filter(e=>e[1]!==void 0).sort(([e],[t])=>e.localeCompare(t));if(t.length!==0)return`v1:${a.createHash(`sha256`).update(JSON.stringify(t)).digest(`hex`).slice(0,16)}`}export{u as n,o as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
let e={isActive:()=>!1};function t(t){e=t}function n(t){return e.isActive(t)}export{n,t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{_ as e}from"./base-url.js";import{n as t,t as n}from"./client-companion-tunnel.js";import{
|
|
1
|
+
import{_ as e}from"./base-url.js";import{n as t,t as n}from"./client-companion-tunnel.js";import{d as r,i,n as a}from"./store.js";const o={slug:`react-devtools-companion`,runArg:e,displayName:`React DevTools companion`};async function s(e){return await n({...e,definition:o,localBaseUrl:e.localBaseUrl??`http://127.0.0.1:8097`,registerPath:`/api/react-devtools/companion/register`,unregisterPath:`/api/react-devtools/companion/unregister`,devicePort:e.devicePort??8097})}async function c(e){return await t({...e,definition:o})}function l(e,t=process.env){return e===void 0?void 0:a(t).find(t=>t.agentDevicePlugin.provider===e)?.agentDevicePlugin.connection}function u(e=process.env){return a(e).filter(e=>e.agentDevicePlugin.connection).map(e=>e.agentDevicePlugin.provider)}const d={leaseKind:`direct-device-provider`,requiresAppAttachment:!1,requiresRemoteDaemon:!1,supportsArtifacts:!1,supportsDeferredAppSelection:!0,supportsDirectPortReverse:!0,usesCloudWebDriverLease:!1};function f(e){return{leaseKind:e,requiresAppAttachment:!1,requiresRemoteDaemon:!0,supportsArtifacts:!1,supportsDeferredAppSelection:!1,supportsDirectPortReverse:!1,usesCloudWebDriverLease:!1}}function p(e,t=process.env){return e===`cloud`||e===`proxy`||e===`limrun`||r(e)!==void 0||l(e,t)!==void 0}function m(){return[...i,...u()].join(`, `)}function h(e,t=process.env){return e===`limrun`?d:e===`proxy`?f(`proxy`):r(e)?.connection??(e===`cloud`?void 0:l(e,t))??f(`remote-provider`)}export{c as a,s as i,h as n,p as r,m as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{l as e}from"./exec.js";import"./command.js";import{a as t}from"./version.js";import{i as n}from"./runtime-deployment.js";import{_ as r,g as i,l as a,m as o,t as s}from"./runtime2.js";import{_ as c,a as l,b as u,d,f,g as p,h as m,i as h,l as g,o as _,p as v,r as y,s as b,u as x,v as S,y as C}from"./browserstack.js";import{i as w,n as T}from"./providers.js";import{n as E,t as D}from"./browserstack-device-features.js";const O=T.awsDeviceFarm,k=`AWS Device Farm`,A={declaration:w(O),create:j};function j(e){let{env:t,runHostCommand:n}=e,o=e=>v({runHostCommand:n,region:e}),s={provider:O,profileFields:f,endpoint:`http://127.0.0.1/`,platform:`android`,deviceName:`AWS Device Farm device`,capabilityOverrides:d,listArtifacts:async({provider:e,providerSessionId:n})=>await u(e,n,o(S(t,`awsRegion`)??c(n??``))),prepareSession:async({req:e,lease:n,base:s})=>{let c=i(e,k),l=r(c,k),u=e=>C(a(c,e),t,e,k);return await m({client:o(a(c,`awsRegion`)??S(t,`awsRegion`)),projectArn:u(`awsProjectArn`),deviceArn:u(`awsDeviceArn`),appArn:a(c,`awsAppArn`)??S(t,`awsAppArn`),platform:l,deviceName:a(c,`device`)??`AWS Device Farm device`,sessionName:a(c,`providerSessionName`)??n.leaseId,interactionMode:p(c)})({lease:n,req:e,base:s})}},l=async()=>(await import(`./aws-device-farm-connection.js`)).createAwsDeviceFarmConnection(e);return{webDriver:s,connection:{resolve:async e=>(await l()).resolve(e),verify:async e=>await(await l()).verify(e)}}}const M=T.browserStack,N=`BrowserStack`,P={declaration:w(M),create:F};function F(e){let{env:t,clientVersion:s}=e,c={provider:M,profileFields:h,platform:`android`,deviceName:`BrowserStack device`,endpoint:t.BROWSERSTACK_WEBDRIVER_ENDPOINT??`https://hub-cloud.browserstack.com/wd/hub/`,capabilityOverrides:y,listArtifacts:async({provider:e,providerSessionId:n})=>await b(e,n,{clientVersion:s,...g(t,`BrowserStack artifact lookup`),endpoint:t.BROWSERSTACK_SESSION_DETAILS_ENDPOINT}),prepareSession:async({req:e,lease:c,base:u})=>{let d=i(e,N),f=g(t,N),p=r(d,N),m=o(d,`device`,`BrowserStack requires --device <name>.`),h=o(d,`providerOsVersion`,`BrowserStack requires --provider-os-version <version>.`),v={clientVersion:s,...f,endpoint:t.BROWSERSTACK_APP_UPLOAD_ENDPOINT??`https://api-cloud.browserstack.com/app-automate/upload`},y=await x(o(d,`providerApp`,`BrowserStack requires --provider-app <bs://app-id-or-local-path>.`),{...v,cwd:d.cwd,signal:d.signal});return{...u,platform:p,deviceName:m,auth:f,uploadApp:_(v),webdriverCapabilities:l({deviceName:m,osVersion:h,app:y,projectName:a(d,`providerProject`),buildName:a(d,`providerBuild`)??c.runId,sessionName:a(d,`providerSessionName`)??c.leaseId,deviceFeatures:D(E(d.flags),p),configured:n(p,m)})}}},u=async()=>(await import(`./browserstack-connection.js`)).createBrowserStackConnection(e);return{webDriver:c,connection:{resolve:async e=>(await u()).resolve(e),verify:async e=>await(await u()).verify(e)}}}const I=Object.freeze([P,A]);function L(e){return I.find(t=>t.declaration.provider===e)}function R(e){return I.map(t=>s({...t.create(e).webDriver,clientVersion:e.clientVersion}))}const z=I.map(e=>e.declaration.provider);function B(n){return{env:n,clientVersion:t(),runHostCommand:async(t,n)=>({stdout:(await e(t,[...n],{maxBuffer:10485760,timeoutMs:3e4})).stdout})}}function V(e){return R(B(e))}function H(e,t){return L(e)?.create(B(t)).connection}export{H as n,V as r,z as t};
|
|
1
|
+
import{P as e}from"./sdk-contracts.js";import{c as t,u as n}from"./sdk-remote-config.js";import{l as r}from"./exec.js";import"./command.js";import{a as i}from"./version.js";import{i as a}from"./runtime-deployment.js";import{S as o,_ as s,a as c,c as l,g as u,h as d,i as f,l as p,m,o as h,p as g,r as ee,t as te,u as ne,v as re,x as _}from"./runtime.js";import{c as v,d as y,f as ie,l as b,u as x}from"./store.js";import{setTimeout as S}from"node:timers/promises";async function C(e,t,n){if(!t)return;let r=(await Promise.all([n.listArtifacts(t,`FILE`),n.listArtifacts(t,`LOG`)])).flat().flatMap(n=>T(e,t,n));return _({provider:e,providerSessionId:t,artifacts:r,pendingMessage:`AWS Device Farm artifacts are not ready yet.`})}function w(e){if(!e||typeof e!=`object`)return[];let t=e.artifacts;return Array.isArray(t)?t:[]}function T(e,t,n){let r=n.url;return typeof r!=`string`||r.length===0?[]:[{provider:e,providerSessionId:t,kind:E(n.type),name:n.name??n.type??`AWS Device Farm artifact`,url:r,providerArtifactId:n.arn,extension:n.extension,availability:`ready`,metadata:{awsType:n.type,...n.metadata?{awsMetadata:n.metadata}:{}}}]}function E(e){switch(e){case`VIDEO`:return`video`;case`APPIUM_SERVER_OUTPUT`:return`appium-log`;case`DEVICE_LOG`:return`device-log`;case`MESSAGE_LOG`:case`UNKNOWN`:return`automation-log`;default:return`raw`}}const D={provider:b.awsDeviceFarm,label:`AWS Device Farm`,fields:{providerApp:`refused`,providerOsVersion:`refused`,providerDeviceType:`refused`,providerProject:`refused`,providerBuild:`refused`,providerSessionName:`consumed`,providerDeviceOrientation:`refused`,providerGeoLocation:`refused`,providerTimezone:`refused`,providerAppiumVersion:`refused`,providerLanguage:`refused`,providerLocale:`refused`,providerNetworkProfile:`refused`,providerCustomNetwork:`refused`,providerNoResignApp:`refused`,awsProjectArn:`consumed`,awsDeviceArn:`consumed`,awsAppArn:`consumed`,awsRegion:`consumed`,awsInteractionMode:`consumed`}},O={awsProjectArn:[`AGENT_DEVICE_AWS_DEVICE_FARM_PROJECT_ARN`,`AWS_DEVICE_FARM_PROJECT_ARN`],awsDeviceArn:[`AGENT_DEVICE_AWS_DEVICE_FARM_DEVICE_ARN`,`AWS_DEVICE_FARM_DEVICE_ARN`],awsAppArn:[`AGENT_DEVICE_AWS_DEVICE_FARM_APP_ARN`,`AWS_DEVICE_FARM_APP_ARN`],awsRegion:[`AWS_REGION`,`AWS_DEFAULT_REGION`]};function k(e,t){return O[t].map(t=>e[t]).find(e=>!!e)}function A(t,r,i,a){let o=t??k(r,i);if(o)return o;throw new e(`INVALID_ARGS`,`${a} requires ${n[i]} <arn> or ${O[i][1]}.`)}function ae(e){let t=e.flags?.awsInteractionMode;if(t===`INTERACTIVE`||t===`NO_VIDEO`||t===`VIDEO_ONLY`)return t}const oe={install:{support:`unsupported`,note:`Pass appArn when creating the remote access session; local artifact upload/install is not implemented.`},portReverse:{support:`unsupported`,note:`AWS Device Farm remote access does not expose agent-device port reverse.`},artifacts:{support:`supported`,note:`AWS Device Farm remote access exposes provider-hosted video, Appium logs, and device logs after session completion.`}};function j(e){return/^arn:[^:]+:devicefarm:([^:]+):/.exec(e)?.[1]}function se(e){let t=I(e);return{createRemoteAccessSession:async e=>L(await t(`create-remote-access-session`,[`--project-arn`,e.projectArn,`--device-arn`,e.deviceArn,`--name`,e.name,...e.appArn?[`--app-arn`,e.appArn]:[],...e.interactionMode?[`--interaction-mode`,e.interactionMode]:[],...e.configuration?[`--configuration`,JSON.stringify(e.configuration)]:[]])),getRemoteAccessSession:async e=>L(await t(`get-remote-access-session`,[`--arn`,e])),stopRemoteAccessSession:async e=>L(await t(`stop-remote-access-session`,[`--arn`,e])),listArtifacts:async(e,n)=>w(await t(`list-artifacts`,[`--arn`,e,`--type`,n]))}}function ce(t){return async({lease:n,req:r,base:i})=>{let o=await t.client.createRemoteAccessSession({projectArn:t.projectArn,deviceArn:t.deviceArn,appArn:t.appArn,name:t.sessionName??`agent-device-${n.leaseId}`,interactionMode:t.interactionMode}),s,c;try{if(s=await M(o.arn,t,r),c=le(s),!c)throw new e(`COMMAND_FAILED`,`AWS Device Farm did not expose a WebDriver endpoint.`,{sessionArn:s.arn,status:s.status})}catch(e){throw await ne(e,()=>t.client.stopRemoteAccessSession(o.arn)),e}let l=s.device?.name??t.deviceName,u=t.platform===`android`?{"appium:autoLaunch":!1}:{};return{...i,endpoint:c,platform:t.platform,deviceName:l,webdriverCapabilities:a(t.platform,l,u),cleanup:async()=>(await t.client.stopRemoteAccessSession(s.arn),{awsDeviceFarmSessionArn:s.arn}),providerSessionId:s.arn,providerData:{awsDeviceFarmSessionArn:s.arn}}}}function le(e){let t=e.endpoints&&typeof e.endpoints==`object`?Object.values(e.endpoints):[],n=[e.remoteDriverEndpoint,e.endpoint,...t,e.remoteDebugUrl,e.remoteRecordAppUrl].filter(e=>typeof e==`string`&&e.length>0).find(e=>!/^wss?:\/\//i.test(e));return n?ue(n):void 0}function ue(e){return/^https?:\/\//i.test(e)?e:`http://${e}`}async function M(t,n,r){let i=n.pollIntervalMs??5e3,a=Date.now(),o=r?.deadline??a+(n.startupTimeoutMs??12e4),s=r?.signal,c=await n.client.getRemoteAccessSession(t);for(;Date.now()<o;){if(s?.throwIfAborted(),c.status===`RUNNING`)return c;P(c),await S(i,void 0,{signal:s}).catch(()=>s?.throwIfAborted()),c=await n.client.getRemoteAccessSession(t)}throw new e(`COMMAND_FAILED`,`Timed out waiting for AWS Device Farm remote access.`,{sessionArn:t,status:c.status,result:c.result,timeoutMs:o-a})}const N=new Set([`ERRORED`,`STOPPED`,`COMPLETED`]);function P(t){if(!(!t.status||!N.has(t.status)))throw new e(`COMMAND_FAILED`,`AWS Device Farm remote access session did not start.`,{sessionArn:t.arn,status:t.status,result:t.result})}async function F(t,n,r){let i=await t(n,r);try{return JSON.parse(i.stdout)}catch(t){throw new e(`COMMAND_FAILED`,`AWS Device Farm returned invalid JSON.`,void 0,t)}}function I(e){let t=e.region?[`--region`,e.region]:[],n=e.awsCommand??`aws`;return async(r,i)=>await F(e.runHostCommand,n,[`devicefarm`,r,...t,...i,`--output`,`json`])}function L(t){if(!t||typeof t!=`object`)throw new e(`COMMAND_FAILED`,`AWS Device Farm response was not an object.`,{response:t});let n=t.remoteAccessSession;if(!n||typeof n!=`object`)throw new e(`COMMAND_FAILED`,`AWS Device Farm response missed remoteAccessSession.`,{response:t});return n}const R=b.awsDeviceFarm,z=`AWS Device Farm`,B={declaration:y(R),create:V};function V(e){let{env:t,runHostCommand:n}=e,r=e=>se({runHostCommand:n,region:e}),i={provider:R,profileFields:D,endpoint:`http://127.0.0.1/`,platform:`android`,deviceName:`AWS Device Farm device`,capabilityOverrides:oe,listArtifacts:async({provider:e,providerSessionId:n})=>await C(e,n,r(k(t,`awsRegion`)??j(n??``))),prepareSession:async({req:e,lease:n,base:i})=>{let a=u(e,z),o=s(a,z),c=e=>A(p(a,e),t,e,z);return await ce({client:r(p(a,`awsRegion`)??k(t,`awsRegion`)),projectArn:c(`awsProjectArn`),deviceArn:c(`awsDeviceArn`),appArn:p(a,`awsAppArn`)??k(t,`awsAppArn`),platform:o,deviceName:p(a,`device`)??`AWS Device Farm device`,sessionName:p(a,`providerSessionName`)??n.leaseId,interactionMode:ae(a)})({lease:n,req:e,base:i})}},a=async()=>(await import(`./aws-device-farm-connection.js`)).createAwsDeviceFarmConnection(e);return{webDriver:i,connection:{resolve:async e=>(await a()).resolve(e),verify:async e=>await(await a()).verify(e)}}}const H={provider:b.browserStack,label:`BrowserStack`,fields:{providerApp:`consumed`,providerOsVersion:`consumed`,providerDeviceType:`refused`,providerProject:`consumed`,providerBuild:`consumed`,providerSessionName:`consumed`,providerDeviceOrientation:`consumed`,providerGeoLocation:`consumed`,providerTimezone:`consumed`,providerAppiumVersion:`consumed`,providerLanguage:`consumed`,providerLocale:`consumed`,providerNetworkProfile:`consumed`,providerCustomNetwork:`consumed`,providerNoResignApp:`consumed`,awsProjectArn:`refused`,awsDeviceArn:`refused`,awsAppArn:`refused`,awsRegion:`refused`,awsInteractionMode:`refused`}};function U(e,t){return{username:g(e,v.username,t),accessKey:g(e,v.accessKey,t)}}const de={install:{support:`partial`,note:`Local app artifacts are uploaded to BrowserStack App Automate, then installed with Appium.`},portReverse:{support:`unsupported`,note:`Use BrowserStack Local for network tunneling; agent-device port reverse is not available.`},artifacts:{support:`supported`,note:`BrowserStack session details expose provider-hosted video, Appium logs, device logs, and dashboard links.`}};async function fe(e,t,n){if(!t)return;let r=_e(e,t,await ge(t,n));return _({provider:e,providerSessionId:t,artifacts:r,pendingMessage:`BrowserStack artifacts are not ready yet.`})}async function W(e,t,n){return n?.throwIfAborted(),await l(await ee(e,`file`,{provider:b.browserStack,service:`BrowserStack`}),{service:`BrowserStack`,endpoint:t.endpoint??`https://api-cloud.browserstack.com/app-automate/upload`,clientVersion:t.clientVersion,auth:t,readAppReference:ve},n)}function pe(e){return c(async(t,n)=>await W(t,e,n))}function G(t){let n=x(t);if(n===void 0||ie(n))return n;throw new e(`INVALID_ARGS`,`BrowserStack --provider-app ${t} is not a bs:// app id.`,{providerApp:t,hint:`Pass <bs://app-id-or-local-path>.`})}async function me(e,t){return await re({service:`BrowserStack`,app:e,cwd:t.cwd,referenceLabel:`a bs:// app id`,parseReference:G,uploadFile:async(e,n)=>await W(e,t,n),signal:t.signal})}function he(e){let{"bstack:options":t,...n}=e.configured??{};return{"appium:deviceName":e.deviceName,"appium:platformVersion":e.osVersion,...e.app?{"appium:app":e.app}:{},...n,"bstack:options":{...e.projectName?{projectName:e.projectName}:{},buildName:e.buildName,sessionName:e.sessionName,...e.deviceFeatures??{},...K(t)}}}function K(e){return e&&typeof e==`object`&&!Array.isArray(e)?e:{}}async function ge(e,t){let n=f(t.endpoint??`https://api-cloud.browserstack.com/app-automate/sessions`,`${e}.json`),r=await h(n,{clientVersion:t.clientVersion,auth:t,service:`BrowserStack`});return K(r.automation_session??r)}function _e(e,t,n){return[o(e,t,n,`video_url`,`video`,`Session video`),o(e,t,n,`appium_logs_url`,`appium-log`,`Appium logs`),o(e,t,n,`device_logs_url`,`device-log`,`Device logs`),o(e,t,n,`browser_url`,`provider-session`,`BrowserStack dashboard`),o(e,t,n,`public_url`,`provider-session`,`Public session link`)].filter(e=>e!==void 0)}function ve(e){if(!e||typeof e!=`object`)return;let t=e.app_url;return typeof t==`string`?t:void 0}const q=[{field:`providerDeviceOrientation`,capability:`deviceOrientation`,type:`enum`,enumValues:t},{field:`providerGeoLocation`,capability:`geoLocation`,type:`string`},{field:`providerTimezone`,capability:`timezone`,type:`string`},{field:`providerAppiumVersion`,capability:`appiumVersion`,type:`string`},{field:`providerLanguage`,capability:`language`,type:`string`},{field:`providerLocale`,capability:`locale`,type:`string`},{field:`providerNetworkProfile`,capability:`networkProfile`,type:`string`},{field:`providerCustomNetwork`,capability:`customNetwork`,type:`string`},{field:`providerNoResignApp`,capability:`resignApp`,type:`negated-boolean`,platform:`ios`}].map(e=>({...e,flag:n[e.field]}));function ye(e,t){Se(e);let n={};for(let r of q){let i=e[r.field];i!==void 0&&i!==!1&&i!==``&&(xe(r,t),n[r.capability]=r.type!==`negated-boolean`&&i)}return n}function J(e){let t={};for(let n of q){let r=e?.[n.field];if(n.type===`negated-boolean`){r===!0&&(t.providerNoResignApp=!0);continue}typeof r==`string`&&r.length!==0&&be(t,n,r)}return t}function be(e,t,n){if(t.field===`providerDeviceOrientation`){e.providerDeviceOrientation=d(t,n);return}t.field!==`providerNoResignApp`&&(e[t.field]=n)}function xe(t,n){if(!(!t.platform||t.platform===n))throw new e(`INVALID_ARGS`,`${t.flag} applies to ${t.platform} sessions only, but the session platform is ${n}.`,{hint:`Drop ${t.flag} or connect with --platform ${t.platform}.`,flag:t.flag,capability:t.capability,platform:n})}function Se(t){if(!(!t.providerNetworkProfile||!t.providerCustomNetwork))throw new e(`INVALID_ARGS`,`BrowserStack accepts either a named network profile or a custom network shape, not both.`,{hint:`Pass only one of --provider-network-profile or --provider-custom-network.`,networkProfile:t.providerNetworkProfile,customNetwork:t.providerCustomNetwork})}const Y=b.browserStack,X=`BrowserStack`,Z={declaration:y(Y),create:Ce};function Ce(e){let{env:t,clientVersion:n}=e,r={provider:Y,profileFields:H,platform:`android`,deviceName:`BrowserStack device`,endpoint:t.BROWSERSTACK_WEBDRIVER_ENDPOINT??`https://hub-cloud.browserstack.com/wd/hub/`,capabilityOverrides:de,listArtifacts:async({provider:e,providerSessionId:r})=>await fe(e,r,{clientVersion:n,...U(t,`BrowserStack artifact lookup`),endpoint:t.BROWSERSTACK_SESSION_DETAILS_ENDPOINT}),prepareSession:async({req:e,lease:r,base:i})=>{let o=u(e,X),c=U(t,X),l=s(o,X),d=m(o,`device`,`BrowserStack requires --device <name>.`),f=m(o,`providerOsVersion`,`BrowserStack requires --provider-os-version <version>.`),h={clientVersion:n,...c,endpoint:t.BROWSERSTACK_APP_UPLOAD_ENDPOINT??`https://api-cloud.browserstack.com/app-automate/upload`},g=await me(m(o,`providerApp`,`BrowserStack requires --provider-app <bs://app-id-or-local-path>.`),{...h,cwd:o.cwd,signal:o.signal});return{...i,platform:l,deviceName:d,auth:c,uploadApp:pe(h),webdriverCapabilities:he({deviceName:d,osVersion:f,app:g,projectName:p(o,`providerProject`),buildName:p(o,`providerBuild`)??r.runId,sessionName:p(o,`providerSessionName`)??r.leaseId,deviceFeatures:ye(J(o.flags),l),configured:a(l,d)})}}},i=async()=>(await import(`./browserstack-connection.js`)).createBrowserStackConnection(e);return{webDriver:r,connection:{resolve:async e=>(await i()).resolve(e),verify:async e=>await(await i()).verify(e)}}}const Q=Object.freeze([Z,B]);function we(e){return Q.find(t=>t.declaration.provider===e)}function Te(e){return Q.map(t=>te({...t.create(e).webDriver,clientVersion:e.clientVersion}))}const Ee=Q.map(e=>e.declaration.provider);function $(e){return{env:e,clientVersion:i(),runHostCommand:async(e,t)=>({stdout:(await r(e,[...t],{maxBuffer:10485760,timeoutMs:3e4})).stdout})}}function De(e){return Te($(e))}function Oe(e,t){return we(e)?.create($(t)).connection}export{H as a,D as c,k as d,A as f,J as i,I as l,Oe as n,G as o,De as r,U as s,Ee as t,j as u};
|
package/dist/src/proxy.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
2
|
-
`)}function $(e,t,n){return n?
|
|
1
|
+
import{P as e,Y as t}from"./sdk-contracts.js";import{A as n,D as r,E as i,I as a,L as o,M as s,N as c,O as l,P as u,T as d,j as f,k as p,w as m}from"./daemon-resolution.js";import{t as h}from"./shared.js";import{ensureDaemon as g,resolveClientSettings as ee}from"./daemon-client-lifecycle.js";import{n as te,t as ne}from"./color.js";import{randomBytes as _,randomUUID as v}from"node:crypto";import y from"node:http";function b(e){let t=S(e);if(!t)return!1;let n=T(t.meta);return C(n)?!1:w(t.source)||w(n?.installSource)}function x(n){let r=new e(`INVALID_ARGS`,`Invalid params: an install source of kind "path" names a file on the daemon host and is not accepted through the proxy`,{hint:`Upload the artifact, or use a "url" or "github-actions-artifact" source.`});return Response.json({jsonrpc:`2.0`,id:n,error:{code:-32602,message:r.message,data:t(r)}},{status:400})}function S(e){if(e)try{return T(T(JSON.parse(e))?.params)}catch{return}}function C(e){let t=e?.uploadedArtifactId;return typeof t==`string`&&t.trim().length>0}function w(e){return T(e)?.kind===`path`}function T(e){return e&&typeof e==`object`&&!Array.isArray(e)?e:void 0}const E=`${d}/`,D=[`content-type`,`content-range`,`x-artifact-type`,`x-artifact-filename`,`x-artifact-hash`,`x-artifact-hash-algorithm`,n],O=[`content-type`,`content-disposition`,`x-request-id`,r];function k(e){let t=V(e),n=v();return{instanceId:n,handle:async e=>{try{return await M(e,t,n)}catch(e){return me(e)}}}}function A(e){return y.createServer(j(k(e)))}function j(e){return(t,n)=>{import(`./node-http.js`).then(({serveProxyRequest:r})=>r(e,t,n)).catch(e=>{n.destroyed||n.destroy(e instanceof Error?e:void 0)})}}async function M(e,t,n){let r=W(e.url);if(e.method===`GET`&&r===`/health`)return await N(e,t,n);if(!re(r,e.method))return new Response(new TextEncoder().encode(`Not found`),{status:404});let i;return r===`/rpc`&&(i=await ae(e,t.maxRpcBodyBytes,`Proxy request body is too large.`)),oe(e,t.clientToken,i)?de(e,r,Z(i),n)||(b(i)?x(Z(i)):await F({request:e,route:r,options:t,rpcBody:i})):pe(r,Z(i))}async function N(e,t,n){let[r,{readVersion:i},{readHostCpuArch:a}]=await Promise.all([P(e,t),import(`./version.js`).then(e=>e.t),import(`./process.js`).then(e=>e.t)]);return Response.json(s(`agent-device-proxy`,i(),{upstream:r,instanceId:n,hostArch:await a()}))}async function P(e,t){let n=await t.upstreamFetch(new Request(a(t.upstreamBaseUrl,`health`),{method:`GET`,headers:X(new Headers,t.upstreamToken,`/health`),signal:I(e,t)})),r=await n.text();try{return r?JSON.parse(r):{ok:n.ok,status:n.status}}catch{return{ok:n.ok,status:n.status}}}async function F(e){let{request:t,route:n,options:r,rpcBody:i}=e,a=ie(t,n,i,r.upstreamToken),o=await r.upstreamFetch(new Request(J(r.upstreamBaseUrl,n,t.url),{method:t.method,headers:X(t.headers,r.upstreamToken,n),signal:I(t,r),...a?{body:a,duplex:`half`}:{}})),s=L(o,t);return q(n)?await R({request:t,upstreamResponse:o,headers:s,clientToken:r.clientToken}):new Response(o.body,{status:o.status,headers:s})}function I(e,t){return AbortSignal.any([e.signal,AbortSignal.timeout(t.upstreamTimeoutMs)])}function L(e,t){let n=new Headers;for(let t of O){let r=e.headers.get(t);r&&n.set(t,r)}return n.has(`x-request-id`)||n.set(`x-request-id`,ue(t)),n}async function R(e){let{request:t,upstreamResponse:n,headers:r,clientToken:i}=e,a=await n.text();return r.set(`content-type`,n.headers.get(`content-type`)??`application/json`),new Response(z(a,t,i),{status:n.status,headers:r})}function z(e,t,n){let r;try{r=JSON.parse(e)}catch{return e}if(!r||typeof r!=`object`)return e;let i=r;if(!i.upload||typeof i.upload.url!=`string`)return e;let a=B(i.upload.url,t);if(!a)return e;let o=i.upload.headers&&typeof i.upload.headers==`object`?{...i.upload.headers}:{};return Object.assign(o,c(n)),JSON.stringify({...r,upload:{...i.upload,url:a,headers:o}})}function B(e,t){let n;try{n=new URL(e)}catch{return null}if(!n.pathname.startsWith(`/upload/`))return null;let r=new URL(t.url),i=r.pathname.lastIndexOf(`/upload/preflight`),a=i>=0?r.pathname.slice(0,i):``,o=t.headers.get(`x-forwarded-proto`)?.split(`,`)[0]?.trim(),s=new URL(`${o||r.protocol.replace(/:$/,``)}://${r.host}`);return s.pathname=`${a}${n.pathname}`,s.search=n.search,s.toString()}function V(e){return{upstreamBaseUrl:H(e.upstreamBaseUrl,`upstreamBaseUrl`),upstreamToken:U(e.upstreamToken,`upstreamToken`),clientToken:U(e.clientToken,`clientToken`),maxRpcBodyBytes:e.maxRpcBodyBytes??1048576,upstreamTimeoutMs:e.upstreamTimeoutMs??3e5,upstreamFetch:e.upstreamFetch??(e=>fetch(e))}}function H(t,n){try{let e=new URL(t);if(e.protocol!==`http:`&&e.protocol!==`https:`)throw Error(`unsupported protocol`);return e.toString().replace(/\/+$/,``)}catch(r){throw new e(`INVALID_ARGS`,`Invalid ${n}`,{[n]:t},r)}}function U(t,n){let r=t.trim();if(!r)throw new e(`INVALID_ARGS`,`Proxy ${n} is required.`);return r}function W(e){let t=new URL(e).pathname;return t===`/agent-device`?`/`:t.startsWith(E)?`/${t.slice(E.length)}`:t}function re(e,t){return e===`/rpc`?t===`POST`:K(e,t)?!0:e===`/artifacts`||e===`/artifacts/`||e.startsWith(`/artifacts/`)||G(e)?t===`GET`:!1}function G(e){let t=e.split(`/`);return t.length===6&&t[1]===`sessions`&&t[3]===`requests`&&t[5]===`diagnostics`&&t[2]!==``&&t[4]!==``}function K(e,t){return e===`/upload`||q(e)||e===`/upload/finalize`?t===`POST`:e.startsWith(`/upload/direct/`)?t===`PUT`:!1}function q(e){return e===`/upload/preflight`}function J(e,t,n){let r=new URL(a(e,t));return r.search=new URL(n).search,r}function Y(e){let t=e.get(f);return t===null?{}:{[i]:t}}function X(e,t,n){let r=new Headers;for(let t of D){let n=e.get(t);n?.trim()&&r.set(t,n)}if(n===`/rpc`&&!r.has(`content-type`)&&r.set(`content-type`,`application/json`),n===`/rpc`){r.set(l,p);for(let[t,n]of Object.entries(Y(e)))r.set(t,n)}for(let[e,n]of Object.entries(c(t)))r.set(e,n);return r}function ie(e,t,n,r){return e.method===`GET`||e.method===`HEAD`?null:t===`/rpc`?ce(n??``,r):e.body}async function ae(t,n,r){if(!t.body)return``;let i=t.body.getReader(),a=[],o=0;for(;;){let{done:t,value:s}=await i.read();if(t)break;if(o+=s.byteLength,o>n)throw await i.cancel(),new e(`INVALID_ARGS`,r);a.push(s)}return Buffer.concat(a).toString(`utf8`)}function oe(e,t,n){let r=se(e,n);return r.length>0&&m(r,t)}function se(e,t){let n=e.headers.get(`authorization`)??``;if(n.toLowerCase().startsWith(`bearer `))return n.slice(7);let r=e.headers.get(`x-agent-device-token`);if(r!==null)return r;if(t){let e=le(t);if(e)return e}return``}function ce(e,t){let n=JSON.parse(e);return n.params={...n.params??{},token:t},JSON.stringify(n)}function le(e){try{let t=JSON.parse(e);return typeof t.params?.token==`string`?t.params.token:``}catch{return``}}function Z(e){if(!e)return null;try{return JSON.parse(e).id??null}catch{return null}}function ue(e){let t=e.headers.get(`x-request-id`);return t?.trim()?t.trim().slice(0,128):v()}function de(e,t,n,r){if(t!==`/rpc`)return null;let a=e.headers.get(i);return a===null||a===r?null:fe(n)}function fe(n){return Response.json(o(n,`Proxy instance changed`,t(new e(`COMMAND_FAILED`,`Proxy instance changed`,{reason:`remote_instance_mismatch`}))),{status:409,headers:{[r]:`true`}})}function pe(n,r){return n===`/rpc`?Response.json({jsonrpc:`2.0`,id:r,error:{code:-32001,message:`Invalid proxy token`,data:t(new e(`UNAUTHORIZED`,`Invalid proxy token`))}},{status:401}):Response.json({ok:!1,error:`Invalid proxy token`,code:`UNAUTHORIZED`},{status:401})}function me(e){let n=t(e);return Response.json({ok:!1,error:n.message,code:n.code},{status:n.code===`INVALID_ARGS`?400:500})}const Q=async({positionals:t,flags:n})=>{if(t.length>0)throw new e(`INVALID_ARGS`,`proxy does not accept positional arguments.`);let r=await he(n);return await h(n,r,()=>be(r)),await xe(),!0};async function he(t){let n=ee({session:`default`,command:`proxy`,positionals:[],flags:{stateDir:t.stateDir,daemonBaseUrl:``,daemonTransport:`http`,daemonServerMode:`http`}}),r=await g(n),i=ge(r.info.httpPort),a=_e(t),o=A({upstreamBaseUrl:i,upstreamToken:r.info.token,clientToken:a});await ve(o,t.proxyHost?.trim()||`127.0.0.1`,t.proxyPort??0);let s=o.address();if(!s||typeof s==`string`)throw new e(`COMMAND_FAILED`,`Proxy did not bind to a TCP address.`);let c=`http://${ye(s.address)}:${s.port}`;return{proxyBaseUrl:c,agentDeviceBaseUrl:u(c),token:a,upstreamBaseUrl:i,stateDir:n.paths.baseDir}}function ge(t){if(!t)throw new e(`COMMAND_FAILED`,`Local daemon HTTP endpoint is unavailable.`,{hint:`Retry after cleaning daemon state, or run proxy with a fresh --state-dir.`});return`http://127.0.0.1:${t}`}function _e(e){return e.daemonAuthToken?.trim()||_(32).toString(`hex`)}function ve(e,t,n){return new Promise((r,i)=>{e.once(`error`,i),e.listen(n,t,()=>{e.off(`error`,i),r()})})}function ye(e){return e.includes(`:`)&&!e.startsWith(`[`)?`[${e}]`:e}function be(e,t={}){let n=t.useColor??te(),r=$(`✓`,`green`,n),i=$(e.proxyBaseUrl,`cyan`,n),a=$(`<tunnel URL>`,`cyan`,n),o=$(e.token,`yellow`,n);return[`${r} Proxy listening at ${i}`,``,`Provide this to the agent-device instance connecting:`,``,`Daemon base URL: ${a}`,`Daemon auth token: ${o}`].join(`
|
|
2
|
+
`)}function $(e,t,n){return n?ne(e,t,{validateStream:!1}):e}function xe(){return new Promise(()=>{})}export{Q as proxyCommand};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
function e(e,n){return[...i(e),...t(e),...o(e),...s(e,n)]}function t(e){let t=e.customActions;if(!t)return[];let n=[];return t.blocked?n.push(`Custom actions were not read: an earlier accessibility read is still hung, so this capture skipped the read pass instead of queueing behind it. No element’s actions list is authoritative here. Reads resume once that call returns.`):t.read<t.candidates&&n.push(`Custom actions were read for ${t.read} of ${t.candidates} merged elements, on-screen ones first; the remaining ${t.candidates-t.read} were not read, so an absent actions list on those is not evidence that they have none. Scroll them into view and re-run to read them.`),t.truncated>0&&n.push(`${t.truncated} element(s) published more custom actions than are shown; those lists are clipped to the first 8 names, and long names are shortened.`),n}function n(e){return e===!0?[`This capture was cut at a backend limit, so elements later in the tree — footers, tab bars, items after a long list — may be missing even when they are on screen; their refs and selectors cannot be resolved from this snapshot. Navigate or scroll so fewer elements render and re-run, and use screenshot as visual truth for what is missing.`]:[]}function r(e){return`Detected an overly complex or slow accessibility tree. Fell back to the ${e} snapshot backend. It is OK to continue; use --json to inspect snapshotQuality.reason if you need recovery details.`}function i(e){return e.state===`recovered`?e.reasonCode===`deferred`||e.reasonCode===`requested-backend`?[]:e.reasonCode===`presentation-failed`?[`Agent Device could not safely present the captured accessibility tree and fell back to the ${e.backend} snapshot backend. This is an Agent Device runner bug, not an app accessibility-tree issue. Use screenshot as visual truth and report snapshotQuality.reason with the screenshot.`]:[r(e.backend)]:e.state===`sparse`?[`No snapshot backend could read this screen`+(e.reason?` (${e.reason})`:``)+`. Its refs and selectors are invalid. Use screenshot as visual truth and coordinate taps; retry snapshot after navigating.`,...a(e)]:[]}function a(e){return e.reasonCode===`sparse-tree`?[`This screen publishes no accessibility content at all; assistive technologies see the same empty tree, so it is worth flagging as an app accessibility bug rather than only an automation limitation.`]:[]}function o(e){return e.effectiveDepth===void 0?[]:[`Some deeper accessibility nodes were omitted; the accessibility backend capped this tree at depth ${e.effectiveDepth}. Navigate so the content you need sits higher in the tree, and use screenshot as visual truth for the rest.`]}function s(e,t){let n=[];for(let r of e.collapsedLeafIndexes??[]){let e=t.find(e=>e.index===r);if(!e)continue;let i=e.identifier?` (${e.identifier})`:``;n.push(`@${e.ref} [${e.type??`element`}]${i} merges many labels into a single accessibility element. The app likely marks a container as accessible, which hides every descendant from assistive tech and automation — the children cannot be addressed individually. Fix the app's accessibility (mark the rows, not the container); until then use screenshot as visual truth and coordinate taps.`)}return n}export{e as n,n as r,r as t};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import{b as e}from"./sdk-contracts.js";import{Qr as t}from"./sdk-batch.js";import{a as n,n as r,o as i,t as a}from"./react-native-overlay.js";const o=/\b(logbox|redbox|reload js|copy stack|component stack|call stack|runtime error|open debugger to view warnings)\b/,s=[/\b[\w.$<>/-]+\.(?:tsx?|jsx?):\d+(?::\d+)?\b/,/\b[\w.$<>/-]+\.(?:tsx?|jsx?)\s+\(\d+:\d+\)/],c=new Set([`x`,`×`,`✕`,`✖`,`⨯`]);function l(e){if(u(e).detected)return[`Hint: React Native warning/error overlay detected. It overlays part of the app and should be handled before interacting.`,`Run: agent-device react-native dismiss-overlay`,`The command verifies the overlay is gone. Run agent-device snapshot -i afterward only when you need fresh refs for the next action.`].join(`
|
|
2
|
+
`)}function u(e){let t=d(e),n=t.detected?f(t):null;return{detected:t.detected,dismissNodes:t.dismissNodes,minimizeNodes:t.minimizeNodes,collapsedNodes:t.collapsedNodes,primaryAction:n}}function d(e){let t=e.map(p).join(`
|
|
3
|
+
`).toLowerCase(),n=E(e,b),a=E(e,i),o=E(e,r,w),s=E(e,y),c=h(t),l=g(t);return{dismissNodes:n,minimizeNodes:a,collapsedNodes:o,detected:v({text:t,hasReactNativeStackFrame:c,hasOverlayControl:_(t,n,a),hasControllessRedBoxText:l,collapsedNodes:o,openDebuggerWarningNodes:s})}}function f(e){let t=D(e.dismissNodes);if(t)return A(t,j(t));let n=M(e.collapsedNodes.filter(T));return n?.rect?{action:`close-collapsed-banner`,point:L(n),rect:n.rect,ref:n.ref,label:z(n)}:null}function p(e){return[e.label,e.value,e.identifier,e.type,e.role].filter(Boolean).join(` `)}function m(e){return o.test(e)}function h(e){return s.some(t=>t.test(e))}function g(e){return/\buncaught\b/.test(e)&&/unable to download asset/.test(e)}function _(e,t,n){return t.length>0||n.length>0||/\b(reload js|copy stack)\b/.test(e)}function v(e){return e.collapsedNodes.length>0||e.openDebuggerWarningNodes.length>0||e.hasControllessRedBoxText||e.hasOverlayControl&&(m(e.text)||e.hasReactNativeStackFrame)}function y(e){return e.includes(`open debugger to view warnings`)||/^!,\s+open debugger\b/.test(e)}function b(e){return n(e)||x(e)||S(e)}function x(e){return/^close(?:\s*\([^)]*\))?$/i.test(e)}function S(e){return c.has(e)}function C(e){return/^!,\s+/.test(e)}function w(e){return!e.rect||e.rect.height<=180}function T(e){let t=z(e)?.trim().toLowerCase()??``;return(y(t)||C(t))&&a(e)}function E(e,t,n=()=>!0){let r=[];for(let i of e)i.ref&&n(i)&&[i.label,i.value,i.identifier].map(e=>e?.trim().toLowerCase()).filter(e=>!!e).some(e=>t(e))&&r.push(i);return r}function D(e){return N(e,k)}function O(e){let t=[e.type,e.role,e.subrole].join(` `).toLowerCase();return/\b(button|menuitem|link)\b/.test(t)}function k(e){return[F(O(e)),F(e.hittable),-(e.rect?t(e.rect):1/0)]}function A(t,n){if(!t.rect)throw Error(`React Native overlay target node must have rect`);return{action:n,point:e(t.rect),rect:t.rect,ref:t.ref,label:z(t)}}function j(e){let t=z(e)?.trim().toLowerCase();return t&&n(t)?`dismiss`:`close`}function M(e){return N(e,P)}function N(e,t){let n=e.filter(e=>e.rect);return n.length===0?null:n.sort((e,n)=>I(t(n),t(e)))[0]??null}function P(e){return[F(e.hittable),e.rect?.width??0,e.rect?.y??0]}function F(e){return+(e===!0)}function I(e,t){for(let n=0;n<e.length;n+=1){let r=e[n]-t[n];if(r!==0)return r}return 0}function L(e){if(!e.rect)throw Error(`Collapsed React Native warning node must have rect`);let t=Math.min(e.rect.height,52),n=Math.min(36,Math.max(18,t*.45));return{x:Math.round(R(e.rect.x+e.rect.width-n,e.rect.x+1,e.rect.x+e.rect.width-1)),y:Math.round(e.rect.y+t/2)}}function R(e,t,n){return Math.min(n,Math.max(t,e))}function z(e){return e.label??e.value??e.identifier}export{l as n,u as t};
|
package/dist/src/react-native.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{Y as e,f as t,s as n}from"./sdk-contracts.js";import{H as r}from"./tv-remote.js";import{A as i}from"./sdk-batch-runner.js";import{E as a}from"./back-mode.js";import{t as o}from"./react-native-overlay2.js";import{c as s}from"./replay-script-selection.js";import{tt as c}from"./internal/daemon.js";import{t as l}from"./snapshot-quality-verdict.js";import{bindInteractionSession as u,captureSnapshotForSession as d,finalizeTouchInteraction as f}from"./interaction.js";import{n as p,t as m}from"./touch-runtime2.js";async function h(r){r=u(r);let{req:i,sessionStore:s}=r;if(i.command!==a.reactNative)return null;let c=g(i.positionals??[]);if(!c.ok)return c.response;let f=r.sessionRef?s.requireCurrent(r.sessionRef):void 0;if(!f)return t();let m=await p({device:f.device,command:`press`,requiresCapture:!1,inspectFacts:r.inspectFacts,platformServices:r.platformServices,bindDevice:r.bindDevice,unavailableResponse:e=>n(`UNSUPPORTED_OPERATION`,`react-native dismiss-overlay is not supported on this device`,void 0,e.hint?{hint:e.hint}:void 0)});if(!m.ok)return m.response;try{let e=await d(r.sessionRef,i.flags,s,r.contextFromFlags,{interactiveOnly:!0});if(l(e.snapshotQuality))return v(e.snapshotQuality);let t=o(e.nodes),n=t.primaryAction;return n?await y(r,f,e,n,m.runtime):_(t.detected)}catch(t){return{ok:!1,error:e(t)}}}function g(e){return e.length===1&&e[0]===`dismiss-overlay`?{ok:!0}:{ok:!1,response:n(`INVALID_ARGS`,`react-native supports only: dismiss-overlay`)}}function _(e){return e?n(`COMMAND_FAILED`,`React Native overlay detected, but no safe dismiss target was found`,{hint:`Use screenshot --overlay-refs for visual evidence and report the overlay instead of pressing the warning body.`}):{ok:!0,data:{action:`dismiss-overlay`,detected:!1,dismissed:!1,...r(`No React Native overlay detected`)}}}function v(e){return n(`COMMAND_FAILED`,`React Native overlay state could not be determined because the accessibility tree is unreadable`,{reason:e.reason,hint:`The snapshot quality verdict is sparse. Use screenshot as visual truth; if an overlay is visible, report it or navigate with coordinates, then retry snapshot or dismiss-overlay on a readable screen.`})}async function y(e,t,a,o,l){let{req:u,sessionStore:d}=e,p=e.contextFromFlags(u.flags,t.appBundleId,t.trace?.outPath),h=m(l,p).tapPoint;if(!h)return n(`UNSUPPORTED_OPERATION`,`react-native dismiss-overlay is not supported on this device`);let g=Date.now();c(t);let _=await h(o.point),v=Date.now(),y=await b(e),S=i({...s(a.nodes),..._,action:`dismiss-overlay`,overlayAction:o.action,x:o.point.x,y:o.point.y,ref:o.ref,label:o.label,warning:o.warning,dismissed:!0,verified:y.verified,verificationRequired:!y.verified,verificationWarning:y.verificationWarning,nextCommand:y.nextCommand,...r(x(y))});return f({ref:e.sessionRef,sessionStore:d,command:u.command,positionals:u.positionals??[],flags:u.flags,result:S,responseData:S,actionStartedAt:g,actionFinishedAt:v})}async function b(e){let{req:t,sessionStore:n}=e,r=await d(e.sessionRef,t.flags,n,e.contextFromFlags,{interactiveOnly:!0});return l(r.snapshotQuality)?{verified:!1,verificationWarning:`React Native overlay dismissal could not be verified because the post-dismiss accessibility tree is unreadable. Use screenshot as visual truth.`,nextCommand:`agent-device screenshot`}:o(r.nodes).detected?{verified:!1,verificationWarning:`React Native overlay is still detected after dismissal. Use screenshot --overlay-refs for visual evidence and report the overlay instead of pressing the warning body.`,nextCommand:`agent-device screenshot --overlay-refs`}:{verified:!0}}function x(e){return e.verified?`React Native overlay dismiss action sent and verified gone`:`React Native overlay dismiss action sent, but verification still detects an overlay`}export{h as handleReactNativeCommands};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{P as e,Y as t}from"./sdk-contracts.js";import{_t as n}from"./tv-remote.js";import{v as r}from"./sdk-batch-runner.js";import{r as i}from"./diagnostics.js";import"./diagnostics2.js";import{I as a,N as o}from"./sdk-device.js";import{D as s,O as c,k as l}from"./sdk-batch.js";import{i as u,n as d}from"./recording-export-quality.js";import{n as f,r as p}from"./recording-scope.js";import{i as m}from"./output-path.js";import{i as h,n as g}from"./recording-stop-observation.js";import{d as _}from"./replay-script-selection.js";import{C as v,S as y,b,i as x,x as S,y as C}from"./platform-request-scope.js";import{r as w,s as T}from"./durable-capture-resource.js";import{n as E}from"./request-runtime-binding.js";import{I as D,N as O,Ot as k}from"./internal/daemon.js";import{t as A}from"./telemetry.js";import j from"node:fs";import M from"node:path";const N=[`clientOutPath`,`telemetryPath`,`warning`,`overlayWarning`];function P(e){let{resourcePath:t,record:n}=I(e);if(n.status!==`decoded`)return{kind:`none`};if(L(e,n.envelope),n.envelope.lifecycle!==`completed`)return{kind:`open`,resourcePath:t};let r=R(n.envelope.metadata);return r===void 0?(i({level:`warn`,phase:`screen_recording_completed_manifest_unreplayable`,data:{resourcePath:t}}),{kind:`none`}):j.existsSync(r.outPath)?{kind:`completed`,completion:r}:{kind:`none`}}function F(e){let{record:t}=I(e);return t.status===`decoded`&&t.envelope.lifecycle===`completed`}function I(e){let t=v.resourcePath(e.sessionStore,e.sessionName);return{resourcePath:t,record:v.store.read(t)}}function L(t,n){if(n.sessionId!==t.sessionName)throw new e(`COMMAND_FAILED`,`Screen recording recovery record does not belong to the requested session`,{reason:`runtime-contract-invalid`});if(!a(n.device,o(t.device)))throw new e(`COMMAND_FAILED`,`Screen recording recovery device does not match the selected device`,{reason:`runtime-contract-invalid`})}function R(e){let t=e?.[C];if(!(!r(t)||!z(t)||!B(t)||!V(t)))return t}function z(e){return H(e.outPath)&&H(e.backend)&&W(e.startedAt)&&W(e.completedAt)&&(e.capturedDurationMs===void 0||W(e.capturedDurationMs))&&f(e.scope)&&typeof e.showTouches==`boolean`&&typeof e.recordOnlySession==`boolean`}function B(e){return N.every(t=>U(e[t]))&&K(e.activeSessionApp)&&J(e.chunks)}function V(e){return(e.stopObservation===void 0||g(e.stopObservation))&&(e.nativePathDisposition===void 0||h(e.nativePathDisposition))}function H(e){return typeof e==`string`&&e.length>0}function U(e){return e===void 0||H(e)}function W(e){return typeof e==`number`&&Number.isFinite(e)}function G(e){return!r(e)||!H(e.bundleId)?!1:U(e.name)}function K(e){return e===void 0||G(e)}function q(e){return Array.isArray(e)&&e.every(e=>r(e)&&Number.isFinite(e.index)&&H(e.path)&&U(e.clientOutPath))}function J(e){return e===void 0||q(e)}function ee(t){let r=n(`record`,t.flags);if(r)throw new e(`INVALID_ARGS`,r);let i=t.flags?.fps;if(i!==void 0&&(!Number.isInteger(i)||i<1||i>120))throw new e(`INVALID_ARGS`,`fps must be an integer between 1 and 120`);let a=u(t.flags?.quality);if(t.flags?.quality!==void 0&&a===void 0)throw new e(`INVALID_ARGS`,`quality must be one of: ${d.join(`, `)} (legacy numeric values 5-10 are accepted)`);return{scope:Y(t.flags?.recordingScope),...i===void 0?{}:{fps:i},...a===void 0?{}:{exportQuality:a},showTouches:t.flags?.hideTouches!==!0,hideTouchesRequested:t.flags?.hideTouches===!0}}function Y(t){if(t===void 0)return`app`;if(t===`app`||t===`device`||t===`system`)return t;throw new e(`INVALID_ARGS`,`record scope must be app, device, or system`)}function X(e){return{ok:!1,error:{code:`INVALID_ARGS`,message:O(e)?`record start with app scope and an explicit session requires an active app session; run open <app> first, or use --scope device to record the full screen`:`record start defaults to app scope and requires an active app session; run open <app> first, or use --scope device to record the full screen`}}}function Z(e,t,n){return{ok:!0,data:{recording:`started`,outPath:e.clientOutPath??n,sessionStateDir:t,recordingBackend:e.backend,recordingScope:e.scope,recordOnlySession:e.recordOnlySession,activeSessionApp:e.activeSessionApp,showTouches:e.showTouches}}}function Q(e){return{action:`start`,...e.clientOutPath?{requestedFileName:M.basename(e.clientOutPath)}:{},showTouches:e.showTouches}}function $(e){return{ok:!1,error:{code:`UNSUPPORTED_OPERATION`,message:`record is not supported on this device`,hint:e.hint??`Select an Apple, Android, physical HarmonyOS, or web target that supports screen recording.`,details:{reason:e.reason}}}}function te(e){let t=[ne(e)];if(e.chunks&&e.chunks.length>1&&t.push(...e.chunks.slice(1).map(e=>({field:`chunkPath`,artifactType:`screen-recording-chunk`,path:e.path,localPath:e.clientOutPath,fileName:M.basename(e.clientOutPath??e.path)}))),e.telemetryPath){let n=e.clientOutPath?A(e.clientOutPath):void 0;t.push({field:`telemetryPath`,artifactType:`screen-recording-telemetry`,path:e.telemetryPath,localPath:n,fileName:M.basename(e.telemetryPath)})}return{ok:!0,data:{recording:`stopped`,outPath:e.outPath,telemetryPath:e.telemetryPath,artifacts:t,recordingBackend:e.backend,recordingScope:e.scope,recordOnlySession:e.recordOnlySession,activeSessionApp:e.activeSessionApp,durationMs:Math.max(0,e.completedAt-e.startedAt),...e.capturedDurationMs===void 0?{}:{capturedDurationMs:e.capturedDurationMs},...e.stopObservation===void 0?{}:{recorder:e.stopObservation.recorder},...e.nativePathDisposition===void 0?{}:{nativePathDisposition:e.nativePathDisposition},showTouches:e.showTouches,warning:e.warning,overlayWarning:e.overlayWarning,chunks:e.chunks?.map(e=>({index:e.index,path:e.clientOutPath??e.path}))}}}function ne(e){return{field:`outPath`,artifactType:`screen-recording`,path:e.outPath,localPath:e.clientOutPath,fileName:M.basename(e.clientOutPath??e.outPath)}}async function re(e){try{return await ie(e)}catch(e){return{ok:!1,error:t(e)}}}async function ie(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.lookup(n),a=i?.session,{plan:o,scope:s}=ae(t,a);if(o.kind===`start`&&!p(s)&&!a)return X(t);let c=await oe(e,i),{session:l}=c;return o.kind===`start`?await se(e,l,c.ref,ee(t),o.use,c.needsReadiness):await de(e,l,c.ref,o.kind,c.needsReadiness)}function ae(e,t){let n=Y(e.flags?.recordingScope);return{scope:n,plan:s({action:e.positionals?.[0],scope:n,hasLiveHandle:t?.screenRecording!==void 0})}}async function oe(e,t){let n=t?.session.device??await _(e.req.flags??{});return await e.retainDeviceExecutionLock(n.id),t?{session:e.sessionStore.requireCurrent(t),ref:t,needsReadiness:!1}:{session:me(e,n),needsReadiness:!0}}async function se(e,t,n,r,i,a){if(t.screenRecording)return{ok:!1,error:{code:`INVALID_ARGS`,message:`recording already in progress`}};let o=n?void 0:w(e.sessionStore,e.sessionName,t),s=n?T(e.sessionStore,n):o.binding;s.assertAdoptable();let l=await e.bindDevice(t.device,c);a&&await E(l,e.platformServices);let u=l.facts.screenRecordingStart;if(!u.available)return $(u);let d=await e.bindDevice(t.device,i),{fence:f,outputPaths:p}=ce(e,t);s.assertAdoptable();let m=await d.operations.screenRecordingStart(le(e,t,r,f,p.outputPath));await b({admissionLedger:e.admissionLedger,binding:s,device:t.device,owner:d.owner,fence:f,...m,throwIfCanceled:e.throwIfCanceled});let h=n??o.requireRef(),g=s.read();if(!g)throw TypeError(`Screen recording adoption did not publish a live handle`);let _=g.handle.inspect();return k(e.sessionStore,h,e.req,e.req.command,Q(_)),Z(_,e.sessionStore.ensureSessionDir(e.sessionName),p.requestedPath)}function ce(e,t){let n=v.resourcePath(e.sessionStore,e.sessionName);return{fence:v.createNextFence({admissionLedger:e.admissionLedger,resourcePath:n,device:t.device}),outputPaths:m({requestedPath:e.req.positionals?.[1],platform:t.device.platform,cwd:e.req.meta?.cwd})}}function le(e,t,n,r,i){return{sessionId:e.sessionName,outputPath:i,clientOutputPath:e.req.meta?.clientArtifactPaths?.outPath,scope:n.scope,showTouches:n.showTouches,hideTouchesRequested:n.hideTouchesRequested,recordOnlySession:t.recordOnlySession===!0,activeSessionApp:ue(t),exportQuality:n.exportQuality,fps:n.fps,fence:r}}function ue(e){if(e.appBundleId)return{bundleId:e.appBundleId,...e.appName?{name:e.appName}:{}}}async function de(e,t,n,r,i){let a;try{a=r===`stop-live`?{completion:await S({intent:`capture`,binding:T(e.sessionStore,n)}),recordsSessionAction:!0}:await pe(e,t,i)}catch(r){throw fe(e,t,n),r}let o=a.completion,s=te(o);return a.recordsSessionAction&&k(e.sessionStore,n,e.req,e.req.command,{action:`stop`,outPath:o.outPath,...o.clientOutPath?{requestedFileName:M.basename(o.clientOutPath)}:{},showTouches:o.showTouches}),t.recordOnlySession&&n&&e.sessionStore.retire(n),s}function fe(e,t,n){!t.recordOnlySession||!n||F(e)&&e.sessionStore.retire(n)}async function pe(t,n,r){let i=P({sessionName:t.sessionName,sessionStore:t.sessionStore,device:n.device});if(i.kind===`completed`)return{completion:i.completion,recordsSessionAction:!1};if(i.kind===`none`)throw new e(`INVALID_ARGS`,`no active recording`);return{completion:await y({resourcePath:i.resourcePath,scope:t.requestScope,acquireControl:async(e,i)=>{let a=await t.bindExactDevice(n.device,e.owner,e.fence,l,i);return r&&await E(a,t.platformServices),x({runtime:a,dispose:async()=>{}})}}),recordsSessionAction:!0}}function me(e,t){return{name:e.sessionName,sessionScope:D(e.req),device:t,createdAt:Date.now(),recordOnlySession:!0,actions:[]}}export{re as t};
|
package/dist/src/record-trace.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{s as e}from"./sdk-contracts.js";import{
|
|
1
|
+
import{s as e}from"./sdk-contracts.js";import{d as t}from"./daemon-resolution.js";import{Ot as n}from"./internal/daemon.js";import{t as r}from"./record-runtime.js";import i from"node:fs";import a from"node:path";function o(t){let n=(t.req.positionals?.[0]??``).toLowerCase();if(n!==`start`&&n!==`stop`)return e(`INVALID_ARGS`,`trace requires start|stop`);let r=t.sessionStore.lookup(t.sessionName);return r?n===`start`?s(t.req,t.sessionStore,r):c(t.req,t.sessionStore,r):e(`SESSION_NOT_FOUND`,`No active session`)}function s(r,o,s){let c=o.requireCurrent(s);if(c.trace)return e(`INVALID_ARGS`,`trace already in progress`);let l=t(r.positionals?.[1]??o.defaultTracePath(c));return i.mkdirSync(a.dirname(l),{recursive:!0}),i.appendFileSync(l,``),c.trace={outPath:l,startedAt:Date.now()},n(o,s,r,r.command,{action:`start`,outPath:l}),{ok:!0,data:{trace:`started`,outPath:l}}}function c(t,r,i){let o=r.requireCurrent(i);if(!o.trace)return e(`INVALID_ARGS`,`no active trace`);let s=l(o.trace.outPath,t.positionals?.[1]);o.trace=void 0,n(r,i,t,t.command,{action:`stop`,outPath:s});let c=t.meta?.clientArtifactPaths?.outPath??s;return{ok:!0,data:{trace:`stopped`,outPath:s,artifacts:[{field:`outPath`,artifactType:`trace-log`,path:s,localPath:c,fileName:a.basename(c)}]}}}function l(e,n){if(!n)return e;let r=t(n);return i.mkdirSync(a.dirname(r),{recursive:!0}),i.existsSync(e)?i.renameSync(e,r):i.appendFileSync(r,``),r}async function u(e){let{req:t,sessionName:n,sessionStore:i}=e,a=t.command;return a===`record`?r({req:t,sessionName:n,sessionStore:i,bindDevice:e.bindDevice,platformServices:e.platformServices,bindExactDevice:e.bindExactDevice,admissionLedger:e.admissionLedger,requestScope:e.requestScope,retainDeviceExecutionLock:e.retainDeviceExecutionLock,throwIfCanceled:e.throwIfCanceled}):a===`trace`?o({req:t,sessionName:n,sessionStore:i}):null}export{u as handleRecordTraceCommands};
|
package/dist/src/recording.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{P as e}from"./sdk-contracts.js";import{
|
|
1
|
+
import{P as e}from"./sdk-contracts.js";import{L as t}from"./file.js";import{t as n}from"./shared.js";import{t as r}from"./command-policy.js";const i=async({positionals:i,flags:s})=>{if(i[0]!==`contact-sheet`)return!1;if(i.length>2)throw new e(`INVALID_ARGS`,`record contact-sheet accepts one recording path: record contact-sheet <video.mp4> [--out <sheet.png>]`);let c=t(a(i[1])),l=typeof s.out==`string`?t(s.out):void 0,[{createAgentDevice:u},{createLocalArtifactAdapter:d}]=await Promise.all([import(`./runtime10.js`),import(`./sdk-io.js`).then(e=>e.n)]),f=await u({backend:{platform:`ios`},artifacts:d(),sessions:{get:e=>({name:e}),set:()=>{}},policy:r()}).recording.contactSheet({video:{kind:`path`,path:c},...l?{out:{kind:`path`,path:l}}:{}});return await n(s,f,()=>o(f)),!0};function a(t){if(t)return t;throw new e(`INVALID_ARGS`,`record contact-sheet requires a recording path: record contact-sheet <video.mp4>`)}function o(e){let t=(e.durationMs/1e3).toFixed(e.durationMs%1e3==0?0:1),n=[e.path,`${e.cells.length} cells over ${t}s (${e.sampledFrameCount} sample times, ${e.decodedFrameCount} frames decoded)`];return e.warning?[...n,e.warning].join(`
|
|
2
2
|
`):n.join(`
|
|
3
|
-
`)}export{
|
|
3
|
+
`)}export{i as recordingCommand};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{P as e}from"./sdk-contracts.js";import{t
|
|
1
|
+
import{P as e}from"./sdk-contracts.js";import{K as t,q as n}from"./platform-runtime.js";const r=new Map;function i(e){for(let t of e.platforms){if(r.has(t))throw Error(`PlatformPlugin already registered for platform "${t}"`);r.set(t,e)}}function a(t){let n=r.get(t);if(!n)throw new e(`UNSUPPORTED_PLATFORM`,`Unsupported platform: ${t}`);return n}function o(e){return r.get(e)}const s=[n,{id:`android`,platforms:[`android`],providers:{platformGatedResolvers:[`androidAdbProvider`]},createInteractor:async(e,t)=>{let{createAndroidInteractor:n}=await import(`./android.js`).then(e=>e.t);return n(e,void 0,t)}},{id:`harmonyos`,platforms:[`harmonyos`],createInteractor:async(e,t)=>{let{createHarmonyInteractor:n}=await import(`./harmonyos.js`);return n(e,t)}},t,{id:`linux`,platforms:[`linux`],providers:{platformGatedResolvers:[`linuxToolProvider`]},createInteractor:async()=>{let{createLinuxInteractor:e}=await import(`./linux.js`);return e()}},{id:`web`,platforms:[`web`],providers:{platformGatedResolvers:[`webProvider`]},createInteractor:async()=>{let{createWebInteractor:e}=await import(`./web2.js`);return await e()}}];let c=!1;function l(){if(!c){for(let e of s)i(e);c=!0}}export{a as n,o as r,l as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{P as e}from"./sdk-contracts.js";import{i as t,n,r,s as i}from"./sdk-remote-config.js";import{
|
|
1
|
+
import{P as e}from"./sdk-contracts.js";import{i as t,n,r,s as i}from"./sdk-remote-config.js";import{L as a}from"./file.js";import o from"node:fs";import s from"node:path";function c(n){let r=n.env??process.env,c=d(n);if(!o.existsSync(c))throw new e(`INVALID_ARGS`,`Remote config file not found: ${c}`);let l;try{l=o.readFileSync(c,`utf8`)}catch(t){throw new e(`INVALID_ARGS`,`Failed to read remote config file: ${c}`,{cause:t instanceof Error?t.message:String(t)})}let u;try{u=JSON.parse(l)}catch(t){throw new e(`INVALID_ARGS`,`Invalid JSON in remote config file: ${c}`,{cause:t instanceof Error?t.message:String(t)})}if(!u||typeof u!=`object`||Array.isArray(u))throw new e(`INVALID_ARGS`,`Remote config file must contain a JSON object: ${c}`);let f={},p=u,m=s.dirname(c);for(let[n,o]of Object.entries(p)){let s=t(n);if(!s)throw new e(`INVALID_ARGS`,`Unsupported remote config key "${n}" in remote config file ${c}.`);let l=i(s,o,`remote config file ${c}`,n);f[s.key]=typeof l==`string`&&`path`in s&&s.path?a(l,{cwd:m,env:r}):l}return{resolvedPath:c,profile:f}}function l(e=process.env){let t={};for(let a of n){let n=r(a.key).map(t=>({name:t,value:e[t]})).find(e=>typeof e.value==`string`&&e.value.trim().length>0);n&&(t[a.key]=i(a,n.value,`environment variable ${n.name}`,n.name))}return t}function u(...e){let t={};for(let r of e)if(r)for(let e of n){let n=r[e.key];n!==void 0&&(t[e.key]=n)}return t}function d(e){let t=e.env??process.env;return a(e.configPath,{cwd:e.cwd,env:t})}function f(e){let t=c(e);return{resolvedPath:t.resolvedPath,profile:u(l(e.env),t.profile)}}export{d as n,f as r,c as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as e}from"./rolldown-runtime.js";var t=e({getReplayBackend:()=>i});const n={maestro:async()=>(await import(`./replay-maestro-backend.js`)).maestroBackend},r=new Map;function i(e){let t=r.get(e);if(t)return t;let i=n[e]().catch(t=>{throw r.delete(e),t});return r.set(e,i),i}export{t as n,i as t};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{at as e}from"./sdk-contracts.js";function t(e){let t=e?.resume;if(typeof t?.allowed==`boolean`&&!(!Number.isInteger(t.from)||typeof t.planDigest!=`string`)&&!(!t.allowed&&typeof t.reason!=`string`)&&(t.repairSessionHeld===void 0||t.repairSessionHeld===!0)&&!(t.alternateFrom!==void 0&&!Number.isInteger(t.alternateFrom)))return t}const n={digest:8192,default:24576,full:65536};function r(e){return e===`digest`||e===`full`?e:`default`}function i(e,t=256){let n=Buffer.from(e,`utf8`);if(n.length<=t)return e;let r=`…<truncated>`,i=Buffer.byteLength(r,`utf8`),a=Math.max(0,t-i);for(;a>0&&(n[a]&192)==128;)--a;return`${n.subarray(0,a).toString(`utf8`)}${r}`}function a(t,n=256){return i(e(t),n)}function o(e,t){let n=e;for(let e of t)e.value&&(n=n.split(e.value).join(`<var:${e.name}>`));return n}function s(e){return(t,n)=>a(o(t,e),n)}function c(e,t){return e.state!==`available`||e.refs.length<=t?e:{...e,refs:e.refs.slice(0,t),truncated:!0}}function l(e,t){let n=r(t),i=n===`digest`?8:20,a=c(e.screen,i),o=n===`digest`?[]:e.suggestions.slice(0,5);return{...e,screen:a,suggestions:o}}function u(e){return Buffer.byteLength(JSON.stringify(e),`utf8`)}function d(e){let{divergence:t,level:i,writeOverflowArtifact:a}=e,o=r(i),s=n[o],c=l(t,i),d=u(c);if(d<=s)return c;let p=d-s,m=a(l(t,`full`)),h=f(c);return`artifactPath`in m?{...h,overflow:{omittedBytes:p,artifactPath:m.artifactPath}}:{...h,artifactUnavailable:!0}}function f(e){return{version:e.version,kind:e.kind,step:{index:e.step.index,source:{path:a(e.step.source.path),line:e.step.source.line}},action:a(e.action),cause:{code:e.cause.code,message:a(e.cause.message),...e.cause.hint?{hint:a(e.cause.hint)}:{}},screen:{state:`unavailable`,reason:`omitted-for-size`,hint:`The screen digest and suggestions were omitted to stay within the response byte budget. See overflow.artifactPath (or retry at --level full) for the complete report.`},suggestions:[],suggestionCount:e.suggestionCount,resume:e.resume,repairHint:e.repairHint,...e.targetBinding?{targetBinding:e.targetBinding}:{}}}function p(e){let t=e?.divergence;if(!t||typeof t!=`object`)return null;let n=t,r=[...E(n.step),...S(n.kind,n.targetBinding),...m(n.repairHint,n.resume),...D(n.screen),...j(n.suggestions,n.suggestionCount),...N(n.overflow,n.artifactUnavailable)];return r.length>0?r.join(`
|
|
2
2
|
`):null}function m(e,t){if(typeof e!=`string`)return[];let n=v(e,t);return[`Repair hint: ${e}${n?` — ${n}`:``}`]}function h(e){let t=e;if(!t||typeof t.allowed!=`boolean`)return;if(!t.allowed)return{allowed:!1,reason:typeof t.reason==`string`?t.reason:void 0};let{from:n,planDigest:r,alternateFrom:i}=t;if(typeof n==`number`&&typeof r==`string`&&r.length!==0)return{allowed:!0,from:n,planDigest:r,alternateFrom:typeof i==`number`?i:void 0}}function g(e,t){return`replay --from ${e} --plan-digest ${t}`}function _(e){return e?.repairSessionHeld===!0}function v(e,t){let n=y(e,h(t));if(n!==void 0)return _(t)?`${n} Read-only inspection while armed (snapshot -i, get attrs, find, is) is excluded from the healed script by default — no --no-record needed. If the step you are repairing is itself a read, add --record to that command so it lands in the heal.`:n}function y(e,t){switch(e){case`record-and-heal`:return t?.allowed?`press the correct control via a blessed @ref from screen.refs (recorded), then ${g(t.from,t.planDigest)}.`:`press the correct control via a blessed @ref from screen.refs (recorded). ${x(t)}`;case`state-repair`:return t?.allowed?`fix app state with --no-record actions, then ${g(t.from,t.planDigest)} to re-run it.`:`fix app state with --no-record actions. ${x(t)}`;case`caution`:return b({lead:`something already matches the recorded selector; a blind re-press may repeat the mistake.`,guidance:t});case`manual`:return b({lead:`no safe automated repair could be proven; inspect the screen and repair by hand.`,guidance:t});default:return}}function b(e){let{lead:t,guidance:n}=e;if(!n?.allowed)return`${t} ${x(n)}`;let r=`if you fixed app state with --no-record actions: ${g(n.from,n.planDigest)}`;return n.alternateFrom===void 0?`${t} ${r}.`:`${t} ${r}; ${`if you performed the step's intent as a recorded action: ${g(n.alternateFrom,n.planDigest)}`}.`}function x(e){return e&&!e.allowed&&e.reason?`This step cannot currently be resumed automatically (${e.reason}) — run a fresh full replay instead.`:`This step cannot currently be resumed automatically — run a fresh full replay instead.`}function S(e,t){if(typeof e!=`string`||e===`action-failure`)return[];let n=t;return n?[C(e,n.matchCount),...w(n.mismatches),...T(n.candidates)]:[]}function C(e,t){return`Target binding: ${e}${typeof t==`number`?` (matchCount ${t})`:``} — recorded target evidence did not verify.`}function w(e){return!Array.isArray(e)||e.length===0?[]:[` mismatches: ${e.slice(0,5).join(`; `)}`]}function T(e){return!Array.isArray(e)||e.length===0?[]:[` ${e.length} candidate(s) shared the recorded identity:`,...e.slice(0,5).map(e=>` ${A(e)}`)]}function E(e){let t=e;if(typeof t?.index!=`number`)return[];let n=t.source,r=typeof n?.path==`string`&&typeof n.line==`number`?` (${n.path}:${n.line})`:``;return[`Divergence at step ${t.index}${r}`]}function D(e){let t=e;return t?.state===`available`&&Array.isArray(t.refs)?O(t.refs,t.refsGeneration):t?.state===`unavailable`?[k(t)]:[]}function O(e,t){let n=e.slice(0,8).map(A),r=e.length-n.length;return[`Screen: ${e.length} actionable ref(s) captured (refsGeneration ${t}).`,...n,...r>0?[` ... ${r} more`]:[]]}function k(e){let t=typeof e.hint==`string`&&e.hint.length>0?` ${e.hint}`:``;return`Screen: unavailable (${String(e.reason??`unknown`)}).${t}`}function A(e){let t=e,n=typeof t.label==`string`?` "${t.label}"`:``;return` @${String(t.ref)} [${String(t.role)}]${n}`}function j(e,t){return Array.isArray(e)&&e.length>0?[`Suggestions:`,...e.slice(0,5).map(M)]:typeof t==`number`&&t>0?[`Suggestions: ${t} available (omitted at this response level; rerun with --json for the full report).`]:[]}function M(e){let t=e,n=typeof t.label==`string`?` "${t.label}"`:``;return` - [${String(t.basis)}]${n} ${String(t.selector)}`}function N(e,t){return e&&typeof e==`object`?[`Full report written to ${String(e.artifactPath)}.`]:t===!0?[`Full report exceeded the response budget and the overflow artifact could not be written.`]:[]}export{o as a,t as i,s as n,p as r,d as t};
|