agent-device 0.21.22 → 0.21.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -6
- package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.22.apk → 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 +1 -0
- package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.22.manifest.json → agent-device-android-ime-helper-0.21.24.manifest.json} +4 -4
- 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 +1 -0
- package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.22.manifest.json → agent-device-android-snapshot-helper-0.21.24.manifest.json} +6 -6
- package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/SnapshotTraversal.swift +12 -6
- package/apple/macos-helper/Tests/AgentDeviceMacOSHelperTests/RectResponseTests.swift +21 -0
- package/apple/snapshot-bridge/README.md +9 -7
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandDispatch.swift +56 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +14 -5
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Lifecycle.swift +8 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +12 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCaptureTarget.swift +1 -1
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotExecution.swift +29 -5
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +34 -10
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryFocus.swift +19 -5
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextTyping.swift +3 -3
- package/dist/src/adapter.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-device-client.js +2 -2
- package/dist/src/alert-runtime.js +1 -1
- package/dist/src/alert.js +1 -1
- package/dist/src/android-adb.d.ts +3 -2
- package/dist/src/android-input-ownership.js +1 -1
- package/dist/src/app-backend.js +1 -1
- package/dist/src/app-inventory.d.ts +4 -0
- package/dist/src/app-launch.js +1 -1
- package/dist/src/app-lifecycle.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.js +2 -2
- package/dist/src/app-state-runtime.d.ts +15 -0
- package/dist/src/apple-runner-platform.js +1 -1
- package/dist/src/application-lifecycle-interaction.js +1 -1
- package/dist/src/aws-device-farm-connection.js +1 -0
- package/dist/src/back-mode.js +1 -1
- package/dist/src/backend-snapshot-options.js +1 -1
- package/dist/src/browserstack-connection.js +1 -0
- package/dist/src/browserstack-device-features.js +1 -0
- package/dist/src/browserstack.js +1 -0
- package/dist/src/cache.js +1 -1
- package/dist/src/cli-config.js +1 -1
- package/dist/src/cli-help.js +35 -19
- package/dist/src/cli-runner.js +1 -1
- package/dist/src/cli.js +3 -4
- package/dist/src/client-companion-tunnel.js +1 -0
- package/dist/src/client-metro-companion.js +1 -1
- package/dist/src/client-metro.js +1 -1
- package/dist/src/client-options.js +3 -3
- package/dist/src/client-types.d.ts +7 -5
- package/dist/src/cloud-artifacts.d.ts +9 -2
- package/dist/src/code-signature-cache.js +1 -1
- package/dist/src/command-metadata.js +1 -1
- package/dist/src/command-schema.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 -0
- package/dist/src/connection.js +5 -5
- package/dist/src/contracts.d.ts +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-transport.js +1 -1
- package/dist/src/daemon-http.js +1 -1
- package/dist/src/daemon-policy-file.js +1 -1
- package/dist/src/daemon-registration-owner.js +1 -1
- package/dist/src/device-claim-inspection.js +1 -1
- package/dist/src/device-input-state.d.ts +2 -15
- package/dist/src/device-readiness-runtime.js +1 -1
- package/dist/src/device-selection-resolver.js +1 -1
- package/dist/src/device-session.js +3 -1
- package/dist/src/device.js +1 -1
- package/dist/src/device2.js +1 -1
- package/dist/src/device3.js +1 -1
- package/dist/src/dispatch-resolve.js +3 -3
- 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/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/gesture-admission.js +1 -1
- package/dist/src/gesture-plan-types.d.ts +2 -5
- package/dist/src/gesture-runtime.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 -0
- package/dist/src/ime-settings-record.js +1 -0
- package/dist/src/ime-state.js +1 -0
- package/dist/src/index.d.ts +3 -3
- package/dist/src/input-actions.js +1 -1
- package/dist/src/input-actions2.js +1 -1
- package/dist/src/install-source2.js +1 -1
- package/dist/src/instance-client.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.js +5 -5
- package/dist/src/interactors.js +1 -1
- package/dist/src/internal/bin.js +1 -1
- package/dist/src/internal/daemon.js +1 -1
- package/dist/src/inventory2.js +1 -1
- package/dist/src/ios-client.js +4 -4
- package/dist/src/ios-snapshot-acquisition.js +1 -1
- package/dist/src/ios-snapshot-engine.js +1 -1
- package/dist/src/ios-snapshot-runtime.js +1 -1
- package/dist/src/launch-confirmation.js +1 -1
- package/dist/src/lease-scope.js +1 -1
- package/dist/src/lease.js +1 -1
- package/dist/src/limrun.d.ts +4 -555
- package/dist/src/load.js +1 -1
- package/dist/src/local-interactor-operation-set.js +1 -1
- package/dist/src/log-stream.js +33 -0
- package/dist/src/managed-device-scope.js +1 -1
- package/dist/src/manifest.js +1 -0
- package/dist/src/mechanics.js +16 -16
- package/dist/src/mobile-snapshot-semantics.js +1 -1
- package/dist/src/node-http.js +1 -0
- package/dist/src/observation.js +1 -2
- package/dist/src/overlay.js +3 -3
- package/dist/src/owner-identity.js +3 -3
- package/dist/src/perf-facade.js +1 -1
- package/dist/src/perf-runtime-plan.js +1 -1
- package/dist/src/perf-target.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-app-log-process.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 +1 -1
- package/dist/src/platform-runtime-screen-recording-finalizer-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/plugin.js +1 -0
- package/dist/src/plugins/webdriver.d.ts +111 -0
- package/dist/src/plugins/webdriver.js +1 -0
- package/dist/src/plugins.d.ts +2 -1
- package/dist/src/plugins2.js +1 -1
- package/dist/src/process-exit.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-device-runtime.d.ts +556 -0
- package/dist/src/provider-policy.js +1 -0
- package/dist/src/provider-profile-fields.js +1 -1
- package/dist/src/provider-webdriver.js +1 -2
- package/dist/src/providers.js +1 -1
- package/dist/src/proxy.js +2 -2
- package/dist/src/react-devtools.js +2 -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 +1 -1
- package/dist/src/registry.js +24 -24
- package/dist/src/remote-bridge.js +1 -0
- package/dist/src/remote-config-core.js +1 -0
- package/dist/src/remote-config.js +1 -1
- package/dist/src/remote-config2.js +1 -1
- package/dist/src/remote-connection-state.js +1 -0
- package/dist/src/replay.js +2 -2
- package/dist/src/request-admission.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/retry2.js +1 -0
- package/dist/src/runner-artifact-manifest.js +1 -1
- package/dist/src/runner-cache-metadata.js +2 -3
- package/dist/src/runner-cache-retention.js +1 -0
- package/dist/src/runner-cache-trim.js +1 -0
- 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 -0
- package/dist/src/runner-disposal.js +1 -1
- package/dist/src/runner-error-classification.js +1 -1
- package/dist/src/runner-exchange.js +1 -1
- package/dist/src/runner-lease.js +1 -0
- package/dist/src/runner-operations-facade.js +1 -1
- package/dist/src/runner-session-types.js +1 -1
- package/dist/src/runner-start-budget.js +1 -1
- package/dist/src/runner-toolchain-probe.js +2 -0
- package/dist/src/runner.js +1 -1
- package/dist/src/runtime-deployment.js +1 -0
- package/dist/src/runtime.js +1 -1
- package/dist/src/runtime10.js +1 -2
- package/dist/src/runtime11.js +2 -0
- package/dist/src/runtime2.js +2 -5
- package/dist/src/runtime3.js +5 -1
- package/dist/src/runtime4.js +1 -5
- package/dist/src/runtime5.js +5 -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-transport.js +1 -1
- package/dist/src/screenshot-density.js +1 -1
- package/dist/src/screenshot-overlay-draw.js +1 -1
- package/dist/src/screenshot3.js +2 -2
- package/dist/src/script.js +1 -1
- package/dist/src/scroll-gesture.js +1 -1
- package/dist/src/sdk-batch.js +2 -2
- package/dist/src/sdk-contracts.d.ts +25 -33
- package/dist/src/sdk-contracts.js +2 -2
- 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-remote-config.d.ts +4 -0
- package/dist/src/sdk-remote-config.js +1 -1
- package/dist/src/sdk-selectors.d.ts +1 -1
- 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-snapshot.js +1 -1
- package/dist/src/session2.js +5 -5
- package/dist/src/simctl.js +1 -1
- package/dist/src/simulator-boot.js +1 -1
- package/dist/src/simulator-state.js +1 -1
- package/dist/src/simulator.js +1 -1
- package/dist/src/snapshot-capture-annotations.js +1 -1
- package/dist/src/snapshot-desktop-projection.js +1 -1
- package/dist/src/snapshot-private-evidence.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/snapshot4.js +1 -1
- package/dist/src/src2.js +1 -1
- package/dist/src/src3.js +1 -1
- package/dist/src/src4.js +1 -1
- package/dist/src/src5.js +1 -1
- package/dist/src/src6.js +1 -1
- package/dist/src/src7.js +1 -1
- package/dist/src/src8.js +20 -20
- package/dist/src/store.js +1 -1
- 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-runtime2.js +1 -1
- package/dist/src/tree.js +1 -1
- package/dist/src/type-text-runtime.js +1 -1
- package/dist/src/video.js +1 -1
- package/package.json +24 -16
- package/server.json +2 -2
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.22.apk.sha256 +0 -1
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.22.apk +0 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.22.apk.sha256 +0 -1
- package/dist/src/capabilities.js +0 -1
- package/dist/src/compatibility-policy.js +0 -1
- package/dist/src/daemon-artifacts.js +0 -1
- package/dist/src/device-claim-rule.js +0 -1
- package/dist/src/human-control-contract.js +0 -1
- package/dist/src/prepare-kind.js +0 -1
- package/dist/src/provider-device-runtimes.js +0 -1
- package/dist/src/screen-recording-admission-ledger.js +0 -1
- package/dist/src/screenshot-runtime.js +0 -1
- package/dist/src/session-routing.js +0 -1
- package/dist/src/session-runtime-admission.js +0 -1
- package/dist/src/session-stream.js +0 -27
- package/dist/src/timeouts.js +0 -1
- package/dist/src/touch-reference-frame.js +0 -1
- package/dist/src/vars.js +0 -2
- package/dist/src/viewport.js +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function e(e){return e===`android-instance`||e===`ios-instance`}export{e as t};
|
|
@@ -0,0 +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{n as a}from"./path-resolution.js";import"./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};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as e}from"./remote-config2.js";export{e as resolveRemoteConfigProfile};
|
|
1
|
+
import{r as e}from"./remote-config-core.js";import"./remote-config2.js";export{e as resolveRemoteConfigProfile};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import
|
|
1
|
+
import"./remote-config-core.js";export{};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{P as e,d as t,p as n}from"./sdk-contracts.js";import{r}from"./diagnostics.js";import"./diagnostics2.js";import{E as i,T as a,s as o}from"./sdk-device.js";import{a as s,c,l}from"./lease-scope.js";import{t as u}from"./sdk-remote-config.js";import{j as d}from"./owner-identity.js";import{p as f}from"./exec.js";import"./file.js";import"./command.js";import{n as p,r as m}from"./remote-config-core.js";import{t as h}from"./remote-bridge.js";import g from"node:crypto";import _ from"node:fs";import v from"node:path";function y(e){return[`exec`,`--yes`,`--package`,`agent-cdp@1.6.1`,`--`,`agent-cdp`,...e]}function b(e){return e.some(e=>e===`--url`||e.startsWith(`--url=`))}function x(e){return e[0]===`target`&&(e[1]===`list`||e[1]===`select`)&&!b(e)}function S(e){let t=new URL(e);t.search=``,t.hash=``;let n=t.pathname.replace(/\/+$/,``);return t.pathname=n.endsWith(`/index.bundle`)?n.slice(0,-13)||`/`:n||`/`,t.toString().replace(/\/+$/,``)}function C(e){let t=e?.metroPublicBaseUrl?.trim();return t?S(t):null}function w(t,n={}){if(!x(t)||!n.flags?.metroProxyBaseUrl||!h(n.flags.leaseBackend))return t;let r=C(n.flags);if(!r)throw new e(`INVALID_ARGS`,`cdp remote bridge target discovery requires a React Native dev-server public base URL.`,{hint:`Include metroPublicBaseUrl in the remote config so cdp can reach the local or tunneled Metro/Re.Pack CDP endpoint without bridge proxy authentication.`});return[...t,`--url`,r]}async function T(e,t={}){let n=w(e,t);return(await f(`npm`,y(n),{cwd:t.cwd??process.cwd(),env:t.env??process.env,allowFailure:!0,onStdoutChunk:e=>{process.stdout.write(e)},onStderrChunk:e=>{process.stderr.write(e)}})).exitCode}const E=u.map(e=>e.key);function D(e){let t={};for(let n of E){let r=e[n];r!==void 0&&(t[n]=r)}return t}function O(e){return e.remoteConfig?{...D(m({configPath:e.remoteConfig,cwd:e.cwd,env:e.env}).profile),remoteConfig:e.remoteConfig}:{}}function k(e){let n=i(e),r=t(n);return{platform:n,target:e.target,leaseBackend:r,identityFlag:r?o(n):void 0,id:e.id}}function A(e){return`${e.platform}:${e.target??`mobile`}:${e.id}`}function j(e){let t=[e.leaseBackend?n(e.leaseBackend):void 0,e.recordedPlatform].filter(e=>e!==void 0);if(t.some(e=>t.some(t=>a(e,t)))||a(e.requestedPlatform,t[0]??e.recordedPlatform))return{ok:!1,boundPlatform:t[0],requestedPlatform:e.requestedPlatform};let r=[...t,e.requestedPlatform].filter(e=>e!==void 0);return{ok:!0,platform:r.find(e=>e!==`apple`)??r[0]}}function M(e,t){return t!==void 0&&e.platform===void 0?!1:j({leaseBackend:e.leaseBackend,recordedPlatform:e.platform,requestedPlatform:t}).ok}function N(e){let t=H(e);if(!_.existsSync(t))return null;let n;try{n=JSON.parse(_.readFileSync(t,`utf8`))}catch(t){return X(e,t),null}return Q(n)?n:(X(e),null)}function P(e){let t=H({stateDir:e.stateDir,session:e.state.session});_.mkdirSync(v.dirname(t),{recursive:!0}),J(t,e.state),J(U(e.stateDir),{session:e.state.session})}function F(e){return{baseUrl:Y(e.daemonBaseUrl),transport:e.daemonTransport,serverMode:e.daemonServerMode}}function I(e){_.rmSync(H(e),{force:!0});let t=U(e.stateDir);G(e.stateDir)===e.session&&_.rmSync(t,{force:!0})}function L(t){let n=t.validateRemoteConfigHash??!0,r=t.remoteConfig?p({configPath:t.remoteConfig,cwd:t.cwd,env:t.env}):void 0,i=N(t)??(t.allowActiveFallback?W({stateDir:t.stateDir}):null);if(!i||r&&i.remoteConfigPath!==r)return null;if(n&&V(i.remoteConfigPath)!==i.remoteConfigHash)throw new e(`INVALID_ARGS`,`Active remote connection config changed. Run agent-device connect --force to refresh it.`,{remoteConfig:i.remoteConfigPath});let a=q(i,t),o=s(i);return{runtime:i.runtime,connection:l(o),flags:{...a,remoteConfig:i.remoteConfigPath,daemonBaseUrl:i.daemon?.baseUrl??a.daemonBaseUrl,daemonAuthToken:a.daemonAuthToken,daemonTransport:i.daemon?.transport??a.daemonTransport,daemonServerMode:i.daemon?.serverMode??a.daemonServerMode,...c(o),sessionIsolation:`tenant`,session:i.session,platform:i.platform??a.platform,target:i.target??a.target}}}function R(e){return l(s(e))}function z(e,t){return{leaseProvider:e.leaseProvider??t.leaseProvider,clientId:e.clientId??t.clientId,deviceKey:e.deviceKey??t.deviceKey}}function B(e,t){return!t||(t.leaseProvider===void 0||e.leaseProvider===t.leaseProvider)&&(t.clientId===void 0||e.clientId===t.clientId)}function V(t){try{return g.createHash(`sha256`).update(_.readFileSync(t)).digest(`hex`)}catch(n){throw new e(`INVALID_ARGS`,`Remote config file not found: ${t}`,{cause:n instanceof Error?n.message:String(n)})}}function H(e){return v.join(e.stateDir,`remote-connections`,`${Z(e.session)}.json`)}function U(e){return v.join(e,`remote-connections`,`.active-session.json`)}function W(e){let t=G(e.stateDir);return t?N({stateDir:e.stateDir,session:t}):null}function G(e){let t=U(e);if(_.existsSync(t))try{let e=JSON.parse(_.readFileSync(t,`utf8`));return typeof e.session==`string`?e.session:void 0}catch{return}}function K(e){if(e)return g.createHash(`sha256`).update(e).digest(`hex`).slice(0,12)}function q(e,t){try{return m({configPath:e.remoteConfigPath,cwd:t.cwd,env:t.env}).profile}catch(e){if(t.validateRemoteConfigHash===!1)return{};throw e}}function J(e,t){d({destination:e,contents:`${JSON.stringify(t,null,2)}\n`,mode:384})}function Y(e){if(!e)return;let t=new URL(e);t.username=``,t.password=``;for(let e of Array.from(t.searchParams.keys()))/(auth|key|password|secret|token)/i.test(e)&&t.searchParams.delete(e);return t.toString().replace(/\/+$/,``)}function X(e,t){r({level:`warn`,phase:`remote_connection_state_invalid`,data:{session:e.session,cause:t instanceof Error?t.message:t?String(t):void 0}}),I(e)}function Z(e){let t=e.replaceAll(/[^a-zA-Z0-9._-]/g,`_`);return t?t===e?t:`${t}-${g.createHash(`sha256`).update(e).digest(`hex`).slice(0,8)}`:`default`}function Q(e){if(!e||typeof e!=`object`||Array.isArray(e))return!1;let t=e;return t.version===1&&$(t,[`session`,`remoteConfigPath`,`remoteConfigHash`,`tenant`,`runId`,`connectedAt`,`updatedAt`])&&ee(t,[`leaseId`,`leaseBackend`,`leaseProvider`,`deviceKey`,`clientId`])&&te(t.daemon)}function $(e,t){return t.every(t=>typeof e[t]==`string`)}function ee(e,t){return t.every(t=>e[t]===void 0||typeof e[t]==`string`)}function te(e){return e===void 0?!0:!e||typeof e!=`object`||Array.isArray(e)?!1:ne(e)}function ne(e){let t=e;return(t.baseUrl===void 0||typeof t.baseUrl==`string`)&&(t.authToken===void 0||typeof t.authToken==`string`)&&(t.transport===void 0||typeof t.transport==`string`)&&(t.serverMode===void 0||typeof t.serverMode==`string`)}export{O as _,K as a,j as c,B as d,I as f,D as g,P as h,M as i,W as l,L as m,F as n,V as o,k as p,R as r,z as s,A as t,N as u,T as v,x as y};
|
package/dist/src/replay.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{P as e}from"./sdk-contracts.js";import{i as t}from"./sdk-batch-runner.js";import{
|
|
1
|
+
import{P as e}from"./sdk-contracts.js";import{i as t}from"./sdk-batch-runner.js";import{dn as n,mn as r}from"./sdk-batch.js";import{n as i,r as a}from"./script.js";import{n as o}from"./path-resolution.js";import"./file.js";import"./gesture-plan.js";import{E as s,x as c,y as l}from"./src8.js";import{t as u}from"./shared.js";import d from"node:fs";import f from"node:path";function p(e,t){return`${e},${t}`}const m={open:h,back:()=>({kind:`commands`,commands:[`back`]}),home:()=>({kind:`commands`,commands:[{pressKey:`Home`}]}),keyboard:v};function h(e){let[n,r]=e.positionals;if(!n)return{kind:`unsupported`,message:`open requires an app id or URL`};if(t(n))return{kind:`commands`,commands:[{openLink:n}]};let i=g(e,n);return r&&t(r)?{kind:`config`,appId:n,commands:[i,{openLink:r}]}:r?{kind:`unsupported`,message:`open with a non-URL second argument is unsupported`}:{kind:`config`,appId:n,commands:[i]}}function g(e,t){return{launchApp:{appId:t,..._(e)}}}function _(e){let t=e.flags?.launchArgs,n={};return e.flags?.relaunch===!0&&(n.stopApp=!0),e.flags?.clearAppState===!0&&(n.clearState=!0),Array.isArray(t)&&t.length>0&&(n.launchArguments=t),n}function v(e){let[t]=e.positionals;return t===`dismiss`?{kind:`commands`,commands:[`hideKeyboard`]}:t===`enter`||t===`return`?{kind:`commands`,commands:[{pressKey:`Enter`}]}:{kind:`unsupported`,message:`keyboard ${t??``}`.trim()}}var y=s();function b(e){return`${e.map(e=>(0,y.stringify)(e).trimEnd()).join(`
|
|
2
2
|
---
|
|
3
|
-
`)}\n`}function x(t,n){let r={config:S(n.metadata),warnings:[],unsupported:[]},i=[];for(let[e,a]of t.entries()){let t=n.actionLines?.[e]??e+1,o=w(a,n.resolveSelector);switch(o.kind){case`commands`:i.push(...o.commands),K(r,o.warnings,a,t);break;case`config`:r.config.appId??=o.appId,i.push(...o.commands),K(r,o.warnings,a,t);break;case`unsupported`:r.unsupported.push({line:t,action:X(a),message:o.message})}}if(r.unsupported.length>0)throw new e(`INVALID_ARGS`,`Cannot export replay to Maestro YAML: unsupported .ad action ${Y(r.unsupported)}.`,{unsupported:r.unsupported});return{yaml:J(r.config,i),warnings:r.warnings}}function S(e){return e?.env&&Object.keys(e.env).length>0?{env:e.env}:{}}const C={...m,click:T,press:T,longpress:E,fill:A,type:j,wait:M,find:P,screenshot:F,scroll:I,swipe:L};function w(e,t){return C[e.command]?.(e,t)??{kind:`unsupported`,message:`${e.command} has no Maestro equivalent`}}function T(e,t){let[n,r]=e.positionals;if(!n)return{kind:`unsupported`,message:`${e.command} requires a target`};let i=B(n,r,t);if(!i)return{kind:`unsupported`,message:`tap target is not Maestro-compatible`};let a=V(e);return a.ok?e.flags?.doubleTap===!0?{kind:`commands`,commands:[{doubleTapOn:i}],warnings:[...N(n),...k(e,`doubleTapOn`)]}:typeof e.flags?.holdMs==`number`?{kind:`commands`,commands:[{longPressOn:i}],warnings:[...N(n),O(e.flags.holdMs),...k(e,`longPressOn`)]}:{kind:`commands`,commands:[W(i,a.options)],warnings:N(n)}:{kind:`unsupported`,message:a.message}}function E(e,t){let[n,r]=e.positionals;if(!n)return{kind:`unsupported`,message:`longpress requires a target`};let i=B(n,r,t);return i?{kind:`commands`,commands:[{longPressOn:i}],warnings:[...N(n),...D(e).map(O)]}:{kind:`unsupported`,message:`longpress target is not Maestro-compatible`}}function D(e){let[t,n,r]=e.positionals,i=Z(t)&&Z(n)?r:n;return i&&Z(i)?[Number(i)]:[]}function O(e){return`long-press duration exports as Maestro longPressOn; Maestro uses its default long-press duration instead of ${e}ms`}function k(e,t){let n=[];return typeof e.flags?.count==`number`&&e.flags.count>1&&n.push(`tap --count ${e.flags.count} is not represented by Maestro ${t}`),typeof e.flags?.intervalMs==`number`&&e.flags.intervalMs>0&&n.push(`tap --interval-ms ${e.flags.intervalMs} is not represented by Maestro ${t}`),n}function A(e,t){let[n,r]=e.positionals;if(!n||r===void 0)return{kind:`unsupported`,message:`fill requires a target and text`};let i=B(n,void 0,t);return i?r.length===0?{kind:`commands`,commands:[{tapOn:i},`eraseText`],warnings:[...N(n),`fill "" exports as tapOn + eraseText; Maestro erases at most its 50-character default`]}:{kind:`commands`,commands:[{tapOn:i},{inputText:r}],warnings:[...N(n),`fill exports as tapOn + inputText; Maestro may append text instead of replacing existing field contents`]}:{kind:`unsupported`,message:`fill target is not Maestro-compatible`}}function j(e){let[t]=e.positionals;if(t===void 0)return{kind:`unsupported`,message:`type requires text`};let n=G(t);return n===null?{kind:`commands`,commands:[{inputText:t}]}:{kind:`commands`,commands:[{eraseText:n}]}}function M(e,t){let[n,r]=e.positionals;if(!n)return{kind:`unsupported`,message:`wait requires a target or duration`};if(Z(n))return{kind:`commands`,commands:[{waitForAnimationToEnd:{timeout:Number(n)}}],warnings:[`wait <ms> exports as waitForAnimationToEnd and may return before the full duration`]};if(n===`absent`)return{kind:`unsupported`,message:`strict wait absent requires zero selector matches and is unsupported by Maestro`};if(n===`text`&&r)return{kind:`commands`,commands:[{extendedWaitUntil:{visible:r,timeout:q(e,
|
|
3
|
+
`)}\n`}function x(t,n){let r={config:S(n.metadata),warnings:[],unsupported:[]},i=[];for(let[e,a]of t.entries()){let t=n.actionLines?.[e]??e+1,o=w(a,n.resolveSelector);switch(o.kind){case`commands`:i.push(...o.commands),K(r,o.warnings,a,t);break;case`config`:r.config.appId??=o.appId,i.push(...o.commands),K(r,o.warnings,a,t);break;case`unsupported`:r.unsupported.push({line:t,action:X(a),message:o.message})}}if(r.unsupported.length>0)throw new e(`INVALID_ARGS`,`Cannot export replay to Maestro YAML: unsupported .ad action ${Y(r.unsupported)}.`,{unsupported:r.unsupported});return{yaml:J(r.config,i),warnings:r.warnings}}function S(e){return e?.env&&Object.keys(e.env).length>0?{env:e.env}:{}}const C={...m,click:T,press:T,longpress:E,fill:A,type:j,wait:M,find:P,screenshot:F,scroll:I,swipe:L};function w(e,t){return C[e.command]?.(e,t)??{kind:`unsupported`,message:`${e.command} has no Maestro equivalent`}}function T(e,t){let[n,r]=e.positionals;if(!n)return{kind:`unsupported`,message:`${e.command} requires a target`};let i=B(n,r,t);if(!i)return{kind:`unsupported`,message:`tap target is not Maestro-compatible`};let a=V(e);return a.ok?e.flags?.doubleTap===!0?{kind:`commands`,commands:[{doubleTapOn:i}],warnings:[...N(n),...k(e,`doubleTapOn`)]}:typeof e.flags?.holdMs==`number`?{kind:`commands`,commands:[{longPressOn:i}],warnings:[...N(n),O(e.flags.holdMs),...k(e,`longPressOn`)]}:{kind:`commands`,commands:[W(i,a.options)],warnings:N(n)}:{kind:`unsupported`,message:a.message}}function E(e,t){let[n,r]=e.positionals;if(!n)return{kind:`unsupported`,message:`longpress requires a target`};let i=B(n,r,t);return i?{kind:`commands`,commands:[{longPressOn:i}],warnings:[...N(n),...D(e).map(O)]}:{kind:`unsupported`,message:`longpress target is not Maestro-compatible`}}function D(e){let[t,n,r]=e.positionals,i=Z(t)&&Z(n)?r:n;return i&&Z(i)?[Number(i)]:[]}function O(e){return`long-press duration exports as Maestro longPressOn; Maestro uses its default long-press duration instead of ${e}ms`}function k(e,t){let n=[];return typeof e.flags?.count==`number`&&e.flags.count>1&&n.push(`tap --count ${e.flags.count} is not represented by Maestro ${t}`),typeof e.flags?.intervalMs==`number`&&e.flags.intervalMs>0&&n.push(`tap --interval-ms ${e.flags.intervalMs} is not represented by Maestro ${t}`),n}function A(e,t){let[n,r]=e.positionals;if(!n||r===void 0)return{kind:`unsupported`,message:`fill requires a target and text`};let i=B(n,void 0,t);return i?r.length===0?{kind:`commands`,commands:[{tapOn:i},`eraseText`],warnings:[...N(n),`fill "" exports as tapOn + eraseText; Maestro erases at most its 50-character default`]}:{kind:`commands`,commands:[{tapOn:i},{inputText:r}],warnings:[...N(n),`fill exports as tapOn + inputText; Maestro may append text instead of replacing existing field contents`]}:{kind:`unsupported`,message:`fill target is not Maestro-compatible`}}function j(e){let[t]=e.positionals;if(t===void 0)return{kind:`unsupported`,message:`type requires text`};let n=G(t);return n===null?{kind:`commands`,commands:[{inputText:t}]}:{kind:`commands`,commands:[{eraseText:n}]}}function M(e,t){let[n,r]=e.positionals;if(!n)return{kind:`unsupported`,message:`wait requires a target or duration`};if(Z(n))return{kind:`commands`,commands:[{waitForAnimationToEnd:{timeout:Number(n)}}],warnings:[`wait <ms> exports as waitForAnimationToEnd and may return before the full duration`]};if(n===`absent`)return{kind:`unsupported`,message:`strict wait absent requires zero selector matches and is unsupported by Maestro`};if(n===`text`&&r)return{kind:`commands`,commands:[{extendedWaitUntil:{visible:r,timeout:q(e,c.extendedWaitUntilTimeoutMs)}}]};let i=t(n);return i?{kind:`commands`,commands:[{extendedWaitUntil:{visible:i,timeout:q(e,c.extendedWaitUntilTimeoutMs)}}],warnings:N(n)}:{kind:`unsupported`,message:`wait selector is not Maestro-compatible`}}function N(e){return r(e,`label`)?[`label= selectors export as Maestro text; Maestro text matching is broader than agent-device label-only matching`]:[]}function P(e){let[t,n,r]=e.positionals;return t!==`text`||!n||!r?{kind:`unsupported`,message:`only find text <query> exists|missing exports to Maestro`}:r===`exists`?{kind:`commands`,commands:[{assertVisible:n}]}:r===`missing`||r===`not-exists`?{kind:`commands`,commands:[{assertNotVisible:n}]}:{kind:`unsupported`,message:`find text assertion "${r}" is unsupported`}}function F(e){let[t]=e.positionals;return t?{kind:`commands`,commands:[{takeScreenshot:t}]}:{kind:`unsupported`,message:`screenshot requires an output path`}}function I(e){let[t]=e.positionals;if(t&&t!==`down`)return{kind:`unsupported`,message:`scroll ${t} is not exported yet`};let n=typeof e.flags?.until==`string`?e.flags.until:void 0;return{kind:`commands`,commands:[`scroll`],warnings:n===void 0?[]:[`scroll --until ${n} is not represented by Maestro scroll`]}}function L(e){let t=R(e);if(!t)return{kind:`unsupported`,message:`only coordinate swipe exports to Maestro`};let n=z(e);if(n===null)return{kind:`unsupported`,message:`swipe count must be a positive integer`};let r=ee(e);return r?{kind:`unsupported`,message:r}:{kind:`commands`,commands:Array.from({length:n},()=>({swipe:t}))}}function R(e){let[t,n,r,i]=e.positionals;if(!(!Z(t)||!Z(n)||!Z(r)||!Z(i)))return{start:p(t,n),end:p(r,i),duration:100}}function z(e){let t=e.flags?.count??1;return Number.isInteger(t)&&t>=1?t:null}function ee(e){if(e.flags?.pauseMs!==void 0)return`swipe --pause-ms has no Maestro equivalent`;if(e.flags?.pattern&&e.flags.pattern!==`one-way`)return`swipe ping-pong pattern has no Maestro equivalent`}function B(e,t,n){return Z(e)&&Z(t)?{point:p(e,t)}:e.startsWith(`@`)?null:n(e)}function V(e){let t=U(e);return t?{ok:!1,message:t}:{ok:!0,options:H(e)}}function H(e){let t={};return typeof e.flags?.count==`number`&&e.flags.count>1&&(t.repeat=e.flags.count),typeof e.flags?.intervalMs==`number`&&e.flags.intervalMs>0&&(t.delay=e.flags.intervalMs),t}function U(e){if(e.flags?.jitterPx!==void 0)return`tap --jitter-px has no Maestro equivalent`;if(e.flags?.clickButton&&e.flags.clickButton!==`primary`)return`tap --button ${e.flags.clickButton} has no Maestro equivalent`}function W(e,t){return Object.keys(t).length===0?{tapOn:e}:typeof e==`string`?{tapOn:{text:e,...t}}:e&&typeof e==`object`&&!Array.isArray(e)?{tapOn:{...e,...t}}:{tapOn:e}}function G(e){return e.length===0||![...e].every(e=>e===`\b`)?null:e.length}function K(e,t,n,r){for(let i of t??[])e.warnings.push({line:r,action:X(n),message:i})}function q(e,t){let n=e.positionals.at(-1);return n&&Z(n)?Number(n):t}function J(e,t){return b(Object.keys(e).length>0?[e,t]:[t])}function Y(e){return e.map(e=>`line ${e.line} (${e.action}): ${e.message}`).join(`; `)}function X(e){return[e.command,...e.positionals??[]].join(` `).trim()}function Z(e){return e!==void 0&&Number.isFinite(Number(e))}const Q=async e=>{let{positionals:t}=e;return t[0]===`export`?await te(e):$(e)};function $({positionals:t,flags:n}){if(t.length>1)throw new e(`INVALID_ARGS`,`replay accepts exactly one input path: replay <path>`);if(n.out!==void 0)throw new e(`INVALID_ARGS`,`replay --out is only supported with replay export.`);return!1}async function te({positionals:t,flags:r}){ne(t,r);let s=t[1];if(!s)throw new e(`INVALID_ARGS`,`replay export requires an input path.`);let c=o(s),p=d.readFileSync(c,`utf8`),m=i(p),h=x(m.actions,{actionLines:m.actionLines,metadata:a(p),resolveSelector:e=>n(e,l)}),g=typeof r.out==`string`?o(r.out):void 0;g&&(d.mkdirSync(f.dirname(g),{recursive:!0}),d.writeFileSync(g,h.yaml));for(let e of h.warnings)process.stderr.write(`Warning: line ${e.line}: ${e.message}\n`);return await u(r,{format:`maestro`,sourcePath:c,...g?{path:g}:{yaml:h.yaml},warnings:h.warnings},()=>g??h.yaml),!0}function ne(t,n){if(t.length>2)throw new e(`INVALID_ARGS`,`replay export accepts exactly one input path: replay export <file.ad>`);if(n.replayUpdate)throw new e(`INVALID_ARGS`,`replay export does not support --update.`);if(n.replayMaestro)throw new e(`INVALID_ARGS`,`replay export reads .ad files; omit --maestro.`);if(n.replayEnv?.length)throw new e(`INVALID_ARGS`,`replay export does not evaluate --env substitutions.`)}export{Q as replayCommand};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{I as e,P as t}from"./sdk-contracts.js";import{
|
|
1
|
+
import{I as e,P as t}from"./sdk-contracts.js";import{N as n,P as r}from"./sdk-device.js";import{tn as i}from"./sdk-batch.js";function a(a){let o=a.resolve?.(a.device,a.intent);if(!o||!i(o.lease.owner,a.intent.owner)||o.lease.fence.token!==a.intent.fence.token||o.lease.fence.generation!==a.intent.fence.generation||r(n(o.lease.reachability.device))!==r(n(a.device))||o.lease.reachability.device.simulatorSetPath!==a.device.simulatorSetPath)throw new t(`UNSUPPORTED_OPERATION`,`Managed binding has no matching lease admission.`,{reason:`managed-lease-admission-unavailable`});let{lease:s,horizon:c}=o,l=AbortSignal.any([a.scope.signal,a.lifetime]),u=!1,d=async n=>{let r=await s.run(c,l,n);if(r.status===`admitted`)return r.value;throw r.status===`abandoned`?e():new t(`COMMAND_FAILED`,`Managed lease does not authorize execution.`,{...r,reason:r.status===`teardown-required`?`managed-lease-teardown-required`:`managed-command-deadline-exceeded`,retriable:!1})},f=async e=>{if(!u)throw new t(`COMMAND_FAILED`,`Managed request is not admitted.`,{reason:`managed-request-not-admitted`});return await d(e)},p=async()=>await f(async()=>{}),m=Object.freeze({device:s.reachability.device,owner:s.owner,fence:s.fence,admit:f,run:s.reachability.run});return{scope:{...a.scope,managedDevice:m},bind:d,activate:()=>{if(l.aborted)throw e();u=!0},ensureReady:p}}export{a as createManagedRequestAdmission};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{P as
|
|
1
|
+
import{H as e,P as t}from"./sdk-contracts.js";import{N as n,P as r,h as i}from"./sdk-device.js";import{Qt as a}from"./sdk-batch.js";import{n as o}from"./provider-device-admission.js";import{t as s}from"./ttl-memo.js";import{t as c}from"./platform-runtime-android-mechanics.js";import{t as l}from"./async-lifecycle.js";async function u(e){if(i(e)){if(e.kind===`simulator`){let{ensureBootedSimulator:t}=await import(`./simulator-facade.js`);return await t(e),!0}if(e.kind===`device`){let{resolveIosPhysicalDeviceControl:t}=await import(`./physical-device-facade.js`);return await t(e).ensureReady(e),!0}}if(e.platform===`android`){let{waitForAndroidBoot:t}=await c();return await t(e.id),!0}return!1}const d=s({ttlMs:5e3});async function f(e){if(o(e))return;let t=m(e);d.get(t)!==!0&&await u(e)&&p(t)}function p(e){d.set(e,!0)}function m(e){let t=e.kind===`simulator`?e.simulatorSetPath??``:``;return JSON.stringify([e.platform,e.kind,e.id,e.target??``,t])}const h=Object.freeze({acceptAlert:`mutates`,actionButton:`mutates`,appLogCleanup:`repeatable`,appLogDoctor:`repeatable`,appLogInspect:`repeatable`,appLogReattach:`repeatable`,appLogStart:`repeatable`,appState:`repeatable`,appSwitcher:`mutates`,applyRuntimeHints:`mutates`,audioProbeCleanup:`repeatable`,audioProbeQuery:`repeatable`,audioProbeReattach:`repeatable`,audioProbeStart:`repeatable`,awaitAlert:`repeatable`,back:`mutates`,bootTarget:`mutates`,bootTargetHeadless:`mutates`,captureScreenshot:`repeatable`,captureSnapshot:`repeatable`,captureSnapshotWithCustomActions:`repeatable`,captureSnapshotWithoutActiveApp:`repeatable`,clearRuntimeHints:`mutates`,closeApplication:`mutates`,configureProviderPortReverse:`repeatable`,deployApp:`mutates`,deployMaterializedApp:`mutates`,dismissAlert:`mutates`,ensureReady:`repeatable`,fillPoint:`mutates`,fillRef:`mutates`,finalizeApplicationClose:`mutates`,findText:`repeatable`,focusPoint:`mutates`,gestureViewport:`repeatable`,home:`mutates`,hoverPoint:`mutates`,hoverRef:`mutates`,keyboardDismiss:`mutates`,keyboardEnter:`mutates`,keyboardStatus:`repeatable`,listApps:`repeatable`,longPressPoint:`mutates`,materializeAppSource:`repeatable`,networkDump:`repeatable`,openApplication:`mutates`,perfFrames:`repeatable`,perfMemorySample:`repeatable`,perfMemorySnapshot:`repeatable`,perfNativeCaptureCleanup:`repeatable`,perfNativeCaptureReattach:`repeatable`,perfNativeCaptureStart:`repeatable`,perfProfileReport:`repeatable`,performDirectionalFlingPlan:`mutates`,performGesturePlan:`mutates`,performMultiTouchGesturePlan:`mutates`,performTargetAuthoredDrag:`mutates`,prepareAppleRunner:`repeatable`,prepareApplicationOpen:`repeatable`,readAlert:`repeatable`,readClipboard:`repeatable`,readSetting:`repeatable`,readTextAtPoint:`repeatable`,resolveOpenTarget:`repeatable`,screenRecordingCleanup:`repeatable`,screenRecordingReattach:`repeatable`,screenRecordingStart:`repeatable`,scrollDirection:`mutates`,sendPushNotification:`mutates`,setFoldPose:`mutates`,setOrientation:`mutates`,setSetting:`mutates`,setViewport:`mutates`,shutdownTarget:`mutates`,tapElementSelector:`mutates`,tapPoint:`mutates`,tapRef:`mutates`,triggerAppEvent:`mutates`,tvRemote:`mutates`,typeText:`mutates`,writeClipboard:`mutates`});function g(){return{dispatchedSteps:0}}function _(e){return e.internal?.dispatchLedger??g()}function v(e,t){let n={};for(let[r,i]of Object.entries(e.operations))n[r]=typeof i==`function`&&h[r]===`mutates`?y(i,t):i;return Object.freeze({...e,operations:Object.freeze(n)})}function y(e,t){return(...n)=>{let r=e(...n);return r instanceof Promise?r.then(e=>(t.dispatchedSteps+=1,e)):(t.dispatchedSteps+=1,r)}}function b(e,t){return async n=>{let r=g(),i=await e({...n,internal:{...n.internal,dispatchLedger:r}});return t.dispatchedSteps+=r.dispatchedSteps,i.ok||r.dispatchedSteps===0?i:x(i,r.dispatchedSteps)}}function x(e,t){let{dispatchedSteps:n,...r}=e.error.details??{},i=typeof n==`number`?n-t:0;return{...e,error:{...e.error,details:i>0?{...r,dispatchedSteps:i}:r}}}const S=new WeakMap;async function C(e){switch(e.owner.kind){case`provider-runtime`:return;case`managed-local`:{let n=S.get(e);if(n){await n();return}throw new t(`UNSUPPORTED_OPERATION`,`Managed-device readiness is unavailable until allocator confirmation.`,{reason:`managed-readiness-unavailable`})}case`local-family`:await f(e.device)}}function w(e){let t=new l,i=new AbortController,o=new Map,s=async(t,n)=>(await e.admitDeviceClaim(t.device,t.owner,n),t);return{inspectFacts:async t=>(e.admitDevice?.(t),await e.gateway.inspectFacts(t)),bindDevice:async(i,c)=>{e.admitDevice?.(i);let l=r(n(i)),u=o.get(l);if(!u){let n={kind:`ordinary`};u=e.gateway.bind({device:i,intent:n,scope:e.scope}).then(e=>t.use(e)).then(e=>s(e,n)),o.set(l,u),u.catch(()=>{o.get(l)===u&&o.delete(l)})}return v(a(await u,c),e.dispatchLedger)},bindExactDevice:async(n,r,o,c,l)=>{e.admitDevice?.(n);let u={kind:`exact-owner`,owner:r,fence:o},d;if(r.kind===`managed-local`){let{createManagedRequestAdmission:t}=await import(`./request-admission.js`);d=t({device:n,intent:u,scope:l,lifetime:i.signal,resolve:e.resolveManagedLease})}d&&await e.admitDeviceClaim(n,r,u);let f=d?await d.bind(()=>e.gateway.bind({device:n,intent:u,scope:d.scope})):await e.gateway.bind({device:n,intent:u,scope:l}),p=await T(t,f,l),m=d?p:await s(p,u),h=v(a(m,c),e.dispatchLedger);return d?.activate(),d&&S.set(h,d.ensureReady),h},[Symbol.asyncDispose]:async()=>{i.abort(),await t[Symbol.asyncDispose]()}}}async function T(t,n,r){try{return t.use(n)}catch(t){try{await n[Symbol.asyncDispose]()}catch(n){r.diagnostics.emit({level:`error`,phase:`request_runtime_late_binding_cleanup_failed`,data:{error:e(n),primaryError:e(t)}})}throw t}}export{_ as i,C as n,b as r,w as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime.js";import"./capture.js";import{t}from"./snapshot-capture-annotations.js";import{
|
|
1
|
+
import{r as e}from"./rolldown-runtime.js";import"./capture.js";import{t}from"./snapshot-capture-annotations.js";import{b as n}from"./sdk-device.js";import{i as r,r as i}from"./success-text.js";import{n as a,t as o}from"./deploy-result-target.js";var s=e({serializeCloseResult:()=>_,serializeDeployResult:()=>p,serializeDevice:()=>d,serializeInstallFromSourceResult:()=>m,serializeOpenResult:()=>h,serializeSessionListEntry:()=>u,serializeSnapshotResult:()=>f});function c(e,t={}){let n=t.includeSerial??!0,r=l(e);return{platform:e.platform,target:e.target,device:e.name,id:e.id,...e.platform===`ios`?{device_udid:e.ios?.udid??e.id,ios_simulator_device_set:e.ios?.simulatorSetPath??null}:{},...n&&r?{serial:r}:{}}}function l(e){return n(e.platform)?e.identifiers.serial??e.id:void 0}function u(e){return{name:e.name,...e.address?{address:e.address}:{},...e.sessionStateDir?{sessionStateDir:e.sessionStateDir}:{},...e.runnerLogPath?{runnerLogPath:e.runnerLogPath}:{},...c(e.device,{includeSerial:!1}),createdAt:e.createdAt}}function d(e){return{platform:e.platform,...e.appleOs?{appleOs:e.appleOs}:{},id:e.id,name:e.name,kind:e.kind,target:e.target,...e.model?{model:e.model}:{},...e.osVersion?{osVersion:e.osVersion}:{},...typeof e.booted==`boolean`?{booted:e.booted}:{},...e.claimedBy?{claimedBy:e.claimedBy}:{}}}function f(e){return{nodes:e.nodes,...e.truncated===void 0?{}:{truncated:e.truncated},...e.appName?{appName:e.appName}:{},...e.appBundleId?{appBundleId:e.appBundleId}:{},...e.visibility?{visibility:e.visibility}:{},...e.keyboard?{keyboard:e.keyboard}:{},...e.viewport?{viewport:e.viewport}:{},...t({...e,...e.snapshotQuality?{quality:e.snapshotQuality}:{}}),...e.unchanged?{unchanged:e.unchanged}:{},...e.snapshotDiagnostics?{snapshotDiagnostics:e.snapshotDiagnostics}:{},...e.fallbackScreenshotPath?{fallbackScreenshotPath:e.fallbackScreenshotPath}:{},...e.refsGeneration===void 0?{}:{refsGeneration:e.refsGeneration}}}function p(e){return r({app:e.app,appPath:e.appPath,platform:e.platform,...e.appId?{appId:e.appId}:{},...e.bundleId?{bundleId:e.bundleId}:{},...e.package?{package:e.package}:{}},`Installed: ${o(e)}`)}function m(e){return r({launchTarget:e.launchTarget,...e.appName?{appName:e.appName}:{},...e.appId?{appId:e.appId}:{},...e.bundleId?{bundleId:e.bundleId}:{},...e.packageName?{package:e.packageName}:{},...e.installablePath?{installablePath:e.installablePath}:{},...e.archivePath?{archivePath:e.archivePath}:{},...e.materializationId?{materializationId:e.materializationId}:{},...e.materializationExpiresAt?{materializationExpiresAt:e.materializationExpiresAt}:{}},`Installed: ${a(e)}`)}function h(e){let t=e.appName??e.appBundleId??e.session;return r({session:e.session,...e.warnings?.length?{warnings:e.warnings}:{},...g(e),...e.appName?{appName:e.appName}:{},...e.appBundleId?{appBundleId:e.appBundleId}:{},...e.selection?{selection:e.selection}:{},...e.startup?{startup:e.startup}:{},...e.runtime?{runtime:e.runtime}:{},...e.device?c(e.device):{},...e.launchConfirmation?{launchConfirmation:e.launchConfirmation}:{},...e.snapshot?{snapshot:e.snapshot}:{},...e.initialSnapshotError?{initialSnapshotError:e.initialSnapshotError}:{}},t?`Opened: ${t}`:`Opened`)}function g(e){return{...e.sessionStateDir?{sessionStateDir:e.sessionStateDir}:{},...e.runnerLogPath?{runnerLogPath:e.runnerLogPath}:{},...e.requestLogPath?{requestLogPath:e.requestLogPath}:{},...e.eventLogPath?{eventLogPath:e.eventLogPath}:{}}}function _(e){return{session:e.session,...e.shutdown?{shutdown:e.shutdown}:{},...`provider`in e&&e.provider?{provider:e.provider}:{},...i(e.session?`Closed: ${e.session}`:`Closed`)}}export{d as n,s as t};
|
package/dist/src/retry.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{I as e,P as t}from"./sdk-contracts.js";import{r as n}from"./diagnostics.js";function r(e){return[`1`,`true`,`yes`,`on`].includes((e??``).trim().toLowerCase())}const i={maxAttempts:3,baseDelayMs:200,maxDelayMs:2e3,jitter:.2};var a=class e{startedAtMs;expiresAtMs;constructor(e,t){this.startedAtMs=e,this.expiresAtMs=e+Math.max(0,t)}static fromTimeoutMs(t,n=Date.now()){return new e(n,t)}remainingMs(e=Date.now()){return Math.max(0,this.expiresAtMs-e)}elapsedMs(e=Date.now()){return Math.max(0,e-this.startedAtMs)}isExpired(e=Date.now()){return this.remainingMs(e)<=0}};async function o(n,r={},a={}){let o={maxAttempts:r.maxAttempts??i.maxAttempts,baseDelayMs:r.baseDelayMs??i.baseDelayMs,maxDelayMs:r.maxDelayMs??i.maxDelayMs,jitter:r.jitter??i.jitter,shouldRetry:r.shouldRetry},d=!1,f;for(let t=1;t<=o.maxAttempts;t+=1){if(a.signal?.aborted)throw e();if(a.deadline?.isExpired()&&t>1)break;try{let e=await n({attempt:t,maxAttempts:o.maxAttempts,deadline:a.deadline});return a.onEvent?.({phase:a.phase,event:`succeeded`,attempt:t,maxAttempts:o.maxAttempts,elapsedMs:a.deadline?.elapsedMs(),remainingMs:a.deadline?.remainingMs()}),u({phase:a.phase,event:`succeeded`,attempt:t,maxAttempts:o.maxAttempts,elapsedMs:a.deadline?.elapsedMs(),remainingMs:a.deadline?.remainingMs()}),e}catch(e){f=e;let n=a.classifyReason?.(e),r={phase:a.phase,event:`attempt_failed`,attempt:t,maxAttempts:o.maxAttempts,elapsedMs:a.deadline?.elapsedMs(),remainingMs:a.deadline?.remainingMs(),reason:n};if(a.onEvent?.(r),u(r),t>=o.maxAttempts||o.shouldRetry&&!o.shouldRetry(e,t))break;let i=c(o.baseDelayMs,o.maxDelayMs,o.jitter,t),p=a.deadline?Math.min(i,a.deadline.remainingMs()):i;if(p<=0)break;let m={phase:a.phase,event:`retry_scheduled`,attempt:t,maxAttempts:o.maxAttempts,delayMs:p,elapsedMs:a.deadline?.elapsedMs(),remainingMs:a.deadline?.remainingMs(),reason:n};a.onEvent?.(m),u(m),a.retryWakeSignal&&!d?d=await s(p,a.signal,a.retryWakeSignal)===`signaled`:await l(p,a.signal)}}let p={phase:a.phase,event:`exhausted`,attempt:o.maxAttempts,maxAttempts:o.maxAttempts,elapsedMs:a.deadline?.elapsedMs(),remainingMs:a.deadline?.remainingMs(),reason:a.classifyReason?.(f)};throw a.onEvent?.(p),u(p),f||new t(`COMMAND_FAILED`,`retry failed`)}function s(e,t,n){return new Promise(r=>{let i=!1,a=e=>{i||(i=!0,clearTimeout(o),t?.removeEventListener(`abort`,s),n.removeEventListener(`abort`,c),r(e))},o=setTimeout(()=>a(`delay`),e),s=()=>a(`delay`),c=()=>a(`signaled`);if(t?.addEventListener(`abort`,s,{once:!0}),n.addEventListener(`abort`,c,{once:!0}),t?.aborted){a(`delay`);return}n.aborted&&a(`signaled`)})}function c(e,t,n,r){let i=Math.min(t,e*2**(r-1)),a=i*n;return Math.max(0,i+(Math.random()*2-1)*a)}function l(e,t){return new Promise(n=>{if(t?.aborted){n();return}let r=!1,i=()=>{r||(r=!0,t&&t.removeEventListener(`abort`,o),n())},a=setTimeout(i,e);function o(){clearTimeout(a),i()}t&&t.addEventListener(`abort`,o,{once:!0})})}function u(e){n({level:e.event===`attempt_failed`||e.event===`exhausted`?`warn`:`debug`,phase:`retry`,data:{...e}})}export{l as i,r as n,o as r,a as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as e}from"./rolldown-runtime.js";import{i as t,n,r,t as i}from"./retry.js";var a=e({Deadline:()=>i,isEnvTruthy:()=>n,retryWithPolicy:()=>r,sleep:()=>t});export{a as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import e from"node:crypto";import t from"node:fs";import n from"node:path";const r=134217728,i=4095;function a(e,t,n){let r=_(e);if(r===null)return{ok:!1,refusal:{reason:`root_unusable`,path:e}};let i=o(e,t,r);if(`reason`in i)return{ok:!1,refusal:i};let a=c(n,e,r);if(!a.ok)return{ok:!1,refusal:a.refusal};let s=[];for(let e of a.roots){let t=h(r,e,a.roots);if(!t.ok)return{ok:!1,refusal:t.refusal};s.push(...t.entries)}return s.length===0?{ok:!1,refusal:{reason:`root_unusable`,path:n.join(`, `)}}:(s.sort((e,t)=>e.path.localeCompare(t.path)),{ok:!0,artifacts:{xctestrunPath:t,xctestrunSize:i.size,xctestrunDigest:i.digest,productPaths:[...n],entries:s}})}function o(e,t,n){let r=g(e,t)??t,i=_(t);return i===null?{reason:`root_unusable`,path:r}:N(i,n)?s(t)?v(t)??{reason:`root_unusable`,path:r}:{reason:`root_unusable`,path:r}:{reason:`root_escapes_cache`,path:r,target:i}}function s(e){try{return t.lstatSync(e).isFile()}catch{return!1}}function c(e,t,n){let r=[];for(let i of e){let e=_(i);if(e===null)return{ok:!1,refusal:C(t,i)};if(!N(e,n))return{ok:!1,refusal:{reason:`root_escapes_cache`,path:g(t,i)??i,target:e}};r.push(e)}let i=l(r);return i.length>0?{ok:!0,roots:i}:{ok:!1,refusal:{reason:`root_unusable`,path:e.join(`, `)}}}function l(e){let t=[];for(let n of new Set([...e].sort()))t.some(e=>N(n,e))||t.push(n);return t}function u(e,r,i){let a=[],o=[r];for(;o.length>0;){let r=o.pop(),s;try{s=t.readdirSync(r)}catch{return{ok:!1,refusal:{reason:`root_unusable`,path:g(e,r)??void 0}}}for(let c of s){let s=n.join(r,c),l=g(e,s);if(l===null)return{ok:!1,refusal:{reason:`root_unusable`,path:s}};let u;try{u=t.lstatSync(s)}catch{return{ok:!1,refusal:{reason:`root_unusable`,path:l}}}if(!m(u))return{ok:!1,refusal:{reason:`root_unusable`,path:l}};if(u.isSymbolicLink()&&d(s,i)===null)return{ok:!1,refusal:{reason:`symlink_escapes_cache`,path:l,target:f(s)??`(unreadable)`}};u.isDirectory()?o.push(s):a.push({relativePath:l,fullPath:s,stat:u})}}return{ok:!0,leaves:a}}function d(e,t){let n=f(e);if(n===null)return null;let r=p(e,n);return r===null?null:t.some(e=>N(r,e))?n:null}function f(e){try{return t.readlinkSync(e)}catch{return null}}function p(e,t){let r=_(n.dirname(e));if(r===null)return null;let i=n.isAbsolute(t)?n.resolve(t):n.resolve(r,t);return _(i)??i}function m(e){return e.isDirectory()||e.isFile()||e.isSymbolicLink()}function h(e,t,n){let a=u(e,t,n);if(!a.ok)return{ok:!1,refusal:a.refusal};let o=[];for(let e of a.leaves){if(e.stat.isSymbolicLink()){let t=f(e.fullPath);if(t===null)return{ok:!1,refusal:{reason:`root_unusable`,path:e.relativePath}};o.push({path:e.relativePath,symlink:t});continue}if(e.stat.size>r)return{ok:!1,refusal:{reason:`root_unusable`,path:e.relativePath}};let t=v(e.fullPath);if(!t)return{ok:!1,refusal:{reason:`root_unusable`,path:e.relativePath}};o.push({path:e.relativePath,size:t.size,mode:e.stat.mode&i,digest:t.digest})}return{ok:!0,entries:o}}function g(e,t){let r=n.relative(n.resolve(e),n.resolve(t));return r===``||r.startsWith(`..`)||n.isAbsolute(r)?null:r}function _(e){try{return t.realpathSync(e)}catch{return null}}function v(n){try{let i=t.statSync(n);if(!i.isFile()||i.size>r)return null;let a=e.createHash(`sha256`);return a.update(t.readFileSync(n)),{digest:a.digest(`hex`),size:i.size}}catch{return null}}function y(e,t){let n=t.artifacts,r=n?_(e):null;if(!n||!D(n)||r===null||!N(n.xctestrunPath,e))return{ok:!1,mismatch:null};let i=x(n,r);if(i)return{ok:!1,mismatch:i};let a=b(n,r,c(n.productPaths,e,r));return a?{ok:!1,mismatch:a}:{ok:!0,xctestrunPath:n.xctestrunPath,productPaths:[...n.productPaths]}}function b(e,t,n){if(!n.ok)return S(n.refusal);let r=new Map(e.entries.map(e=>[e.path,e]));for(let e of n.roots){let i=w(t,e,n.roots,r);if(i)return i}let i=r.keys().next();return i.done?null:{path:i.value,reason:`missing`}}function x(e,t){let n=E(e.xctestrunPath,e.xctestrunSize,e.xctestrunDigest);if(n)return n;let r=_(e.xctestrunPath);return r!==null&&N(r,t)?null:{path:e.xctestrunPath,reason:`root_escapes_cache`,target:r??`(?)`}}function S(e){return e.reason===`root_unusable`?{path:e.path??`(cache root)`,reason:`root_unusable`}:{...e}}function C(e,t){return{reason:`root_unusable`,path:g(e,t)??void 0}}function w(e,t,n,r){let i=u(e,t,n);if(!i.ok)return i.refusal?S(i.refusal):{path:t,reason:`root_unusable`};for(let e of i.leaves){let t=r.get(e.relativePath);if(!t)return{path:e.relativePath,reason:`undeclared_entry`};let n=T(e.fullPath,e.relativePath,t);if(n)return n;r.delete(e.relativePath)}return null}function T(e,t,n){if(`symlink`in n){let r=f(e);return r===null?{path:t,reason:`missing`}:r===n.symlink?null:{path:t,reason:`symlink_target_changed`,expected:n.symlink,actual:r}}return E(e,n.size,n.digest,n.mode,t)}function E(e,n,r,a,o){let s=o??e,c;try{c=t.lstatSync(e)}catch{return{path:s,reason:`missing`}}if(!c.isFile())return{path:s,reason:`kind_changed`};if(c.size!==n)return{path:s,reason:`size_changed`,expected:n,actual:c.size};if(a!==void 0&&(c.mode&i)!==a)return{path:s,reason:`mode_changed`,expected:a,actual:c.mode&i};let l=v(e);return l?l.digest===r?null:{path:s,reason:`digest_mismatch`}:{path:s,reason:`file_too_large`,size:c.size}}function D(e){if(!e||typeof e!=`object`||Array.isArray(e))return!1;let t=e;return typeof t.xctestrunPath==`string`&&A(t.xctestrunSize)&&typeof t.xctestrunDigest==`string`&&j(t.productPaths)&&M(t.entries)&&t.entries.every(O)}function O(e){if(!e||typeof e!=`object`||Array.isArray(e))return!1;let t=e;return typeof t.path!=`string`||!k(t.path)?!1:typeof t.symlink==`string`?t.digest===void 0:typeof t.digest==`string`&&A(t.size)&&typeof t.mode==`number`}function k(e){return!e.startsWith(`/`)&&!e.startsWith(`..`)&&!n.isAbsolute(e)}function A(e){return Number.isInteger(e)&&e>=0}function j(e){return M(e)&&e.every(e=>typeof e==`string`)}function M(e){return Array.isArray(e)&&e.length>0}function N(e,t){let r=n.relative(n.resolve(t),n.resolve(e));return r!==``&&!r.startsWith(`..`)&&!n.isAbsolute(r)}export{a as buildRunnerCacheArtifactManifest,y as validateRunnerCacheArtifactManifest};
|
|
1
|
+
import e from"node:crypto";import t from"node:fs";import n from"node:path";const r=134217728,i=4095;function a(e,t,n){let r=_(e);if(r===null)return{ok:!1,refusal:{reason:`root_unusable`,path:e}};let i=o(e,t,r);if(`reason`in i)return{ok:!1,refusal:i};let a=c(n,e,r);if(!a.ok)return{ok:!1,refusal:a.refusal};let s=[];for(let e of a.roots){let t=h(r,e,a.roots);if(!t.ok)return{ok:!1,refusal:t.refusal};s.push(...t.entries)}return s.length===0?{ok:!1,refusal:{reason:`root_unusable`,path:n.join(`, `)}}:(s.sort((e,t)=>e.path.localeCompare(t.path)),{ok:!0,artifacts:{xctestrunPath:t,xctestrunSize:i.size,xctestrunDigest:i.digest,productPaths:[...n],entries:s}})}function o(e,t,n){let r=g(e,t)??t,i=_(t);return i===null?{reason:`root_unusable`,path:r}:N(i,n)?s(t)?v(t)??{reason:`root_unusable`,path:r}:{reason:`root_unusable`,path:r}:{reason:`root_escapes_cache`,path:r,target:i}}function s(e){try{return t.lstatSync(e).isFile()}catch{return!1}}function c(e,t,n){let r=[];for(let i of e){let e=_(i);if(e===null)return{ok:!1,refusal:C(t,i)};if(!N(e,n))return{ok:!1,refusal:{reason:`root_escapes_cache`,path:g(t,i)??i,target:e}};r.push(e)}let i=l(r);return i.length>0?{ok:!0,roots:i}:{ok:!1,refusal:{reason:`root_unusable`,path:e.join(`, `)}}}function l(e){let t=[];for(let n of new Set([...e].sort()))t.some(e=>N(n,e))||t.push(n);return t}function u(e,r,i){let a=[],o=[r];for(;o.length>0;){let r=o.pop(),s;try{s=t.readdirSync(r)}catch{return{ok:!1,refusal:{reason:`root_unusable`,path:g(e,r)??void 0}}}for(let c of s){let s=n.join(r,c),l=g(e,s);if(l===null)return{ok:!1,refusal:{reason:`root_unusable`,path:s}};let u;try{u=t.lstatSync(s)}catch{return{ok:!1,refusal:{reason:`root_unusable`,path:l}}}if(!m(u))return{ok:!1,refusal:{reason:`root_unusable`,path:l}};if(u.isSymbolicLink()&&d(s,i)===null)return{ok:!1,refusal:{reason:`symlink_escapes_cache`,path:l,target:f(s)??`(unreadable)`}};u.isDirectory()?o.push(s):a.push({relativePath:l,fullPath:s,stat:u})}}return{ok:!0,leaves:a}}function d(e,t){let n=f(e);if(n===null)return null;let r=p(e,n);return r===null?null:t.some(e=>N(r,e))?n:null}function f(e){try{return t.readlinkSync(e)}catch{return null}}function p(e,t){let r=_(n.dirname(e));if(r===null)return null;let i=n.isAbsolute(t)?n.resolve(t):n.resolve(r,t);return _(i)??i}function m(e){return e.isDirectory()||e.isFile()||e.isSymbolicLink()}function h(e,t,n){let a=u(e,t,n);if(!a.ok)return{ok:!1,refusal:a.refusal};let o=[];for(let e of a.leaves){if(e.stat.isSymbolicLink()){let t=f(e.fullPath);if(t===null)return{ok:!1,refusal:{reason:`root_unusable`,path:e.relativePath}};o.push({path:e.relativePath,symlink:t});continue}if(e.stat.size>r)return{ok:!1,refusal:{reason:`root_unusable`,path:e.relativePath}};let t=v(e.fullPath);if(!t)return{ok:!1,refusal:{reason:`root_unusable`,path:e.relativePath}};o.push({path:e.relativePath,size:t.size,mode:e.stat.mode&i,digest:t.digest})}return{ok:!0,entries:o}}function g(e,t){let r=n.relative(n.resolve(e),n.resolve(t));return r===``||r.startsWith(`..`)||n.isAbsolute(r)?null:r}function _(e){try{return t.realpathSync(e)}catch{return null}}function v(n){try{let i=t.statSync(n);if(!i.isFile()||i.size>r)return null;let a=e.createHash(`sha256`);return a.update(t.readFileSync(n)),{digest:a.digest(`hex`),size:i.size}}catch{return null}}function y(e,t){let n=t.artifacts,r=n?_(e):null;if(!n||!D(n)||r===null||!N(n.xctestrunPath,e))return{ok:!1,mismatch:null};let i=x(n,r);if(i)return{ok:!1,mismatch:i};let a=b(n,r,c(n.productPaths,e,r));return a?{ok:!1,mismatch:a}:{ok:!0,xctestrunPath:n.xctestrunPath,productPaths:[...n.productPaths]}}function b(e,t,n){if(!n.ok)return S(n.refusal);let r=new Map(e.entries.map(e=>[e.path,e]));for(let e of n.roots){let i=w(t,e,n.roots,r);if(i)return i}let i=r.keys().next();return i.done?null:{path:i.value,reason:`missing`}}function x(e,t){let n=E(e.xctestrunPath,e.xctestrunSize,e.xctestrunDigest);if(n)return n;let r=_(e.xctestrunPath);return r!==null&&N(r,t)?null:{path:e.xctestrunPath,reason:`root_escapes_cache`,target:r??`(?)`}}function S(e){return e.reason===`root_unusable`?{path:e.path??`(cache root)`,reason:`root_unusable`}:{...e}}function C(e,t){return{reason:`root_unusable`,path:g(e,t)??void 0}}function w(e,t,n,r){let i=u(e,t,n);if(!i.ok)return i.refusal?S(i.refusal):{path:t,reason:`root_unusable`};for(let e of i.leaves){let t=r.get(e.relativePath);if(!t)return{path:e.relativePath,reason:`undeclared_entry`};let n=T(e.fullPath,e.relativePath,t);if(n)return n;r.delete(e.relativePath)}return null}function T(e,t,n){if(`symlink`in n){let r=f(e);return r===null?{path:t,reason:`missing`}:r===n.symlink?null:{path:t,reason:`symlink_target_changed`,expected:n.symlink,actual:r}}return E(e,n.size,n.digest,n.mode,t)}function E(e,n,r,a,o){let s=o??e,c;try{c=t.lstatSync(e)}catch{return{path:s,reason:`missing`}}if(!c.isFile())return{path:s,reason:`kind_changed`};if(c.size!==n)return{path:s,reason:`size_changed`,expected:n,actual:c.size};if(a!==void 0&&(c.mode&i)!==a)return{path:s,reason:`mode_changed`,expected:a,actual:c.mode&i};let l=v(e);return l?l.digest===r?null:{path:s,reason:`digest_mismatch`}:{path:s,reason:`file_too_large`,size:c.size}}function D(e){if(!e||typeof e!=`object`||Array.isArray(e))return!1;let t=e;return typeof t.xctestrunPath==`string`&&A(t.xctestrunSize)&&typeof t.xctestrunDigest==`string`&&j(t.productPaths)&&M(t.entries)&&t.entries.every(O)}function O(e){if(!e||typeof e!=`object`||Array.isArray(e))return!1;let t=e;return typeof t.path!=`string`||!k(t.path)?!1:typeof t.symlink==`string`?t.digest===void 0:typeof t.digest==`string`&&A(t.size)&&typeof t.mode==`number`}function k(e){return!e.startsWith(`/`)&&!e.startsWith(`..`)&&!n.isAbsolute(e)}function A(e){return Number.isInteger(e)&&e>=0}function j(e){return M(e)&&e.every(e=>typeof e==`string`)}function M(e){return Array.isArray(e)&&e.length>0}function N(e,t){let r=n.relative(n.resolve(t),n.resolve(e));return r!==``&&!r.startsWith(`..`)&&!n.isAbsolute(r)}export{a as buildRunnerCacheArtifactManifest,N as isPathInsideDirectory,y as validateRunnerCacheArtifactManifest};
|
|
@@ -1,3 +1,2 @@
|
|
|
1
|
-
import{
|
|
2
|
-
|
|
3
|
-
`),r=new Map,i=!1,a=``;for(let[e,t]of n.entries()){if(Le.test(t)){a=n[e+1]??``;continue}if(Ie.test(t)){i=!0;continue}if(!i)continue;let o=Z.exec(t);if(!o)break;r.set(o[1],o[2].trimEnd())}return i?{settings:r,invocationLine:a}:null}function $(e){return[...e.runnerBundleBuildSettings,...e.runnerSigningBuildSettings,...e.runnerPerformanceBuildSettings,...e.runnerArchBuildSettings,...e.runnerSandboxBuildArgs]}function ze(e){let t={};for(let n of $(e)){let e=Q.exec(n);e&&(t[e[1]]=e[2])}return t}function Be(e,t){return $(e).filter(e=>!Q.test(e)).filter(e=>!t.includes(e)).map(e=>({key:`(invocation flag)`,expected:e,actual:`absent from the "Command line invocation:" line`}))}function Ve(e,t){let n=Re(t);return n?[...Object.entries(ze(e)).filter(([e,t])=>{let r=n.settings.get(e);return r===void 0?t!==``:r!==t}).map(([e,t])=>({key:e,expected:t,actual:n.settings.get(e)??`(absent)`})),...Be(e,n.invocationLine)]:[{key:`(build log)`,expected:`a "Build settings from command line:" block`,actual:`missing or unreadable log`}]}function He(e,t){let r=Ve(e,t);if(r.length!==0)throw new n(`COMMAND_FAILED`,`The Apple runner build did not use the settings its cache identity records`,{reason:`runner_build_settings_mismatch`,buildLogPath:t,differences:r,hint:`Align the build invocation with the runner cache identity resolvers, or rebuild without the cache.`})}export{J as _,Me as a,W as b,D as c,Y as d,Pe as f,Ne as g,Ae as h,E as i,Se as l,B as m,S as n,we as o,q as p,V as r,He as s,xe as t,j as u,X as v,oe as x,K as y};
|
|
1
|
+
import{P as e}from"./sdk-contracts.js";import{g as t}from"./sdk-device.js";import{_ as n,f as r,k as i}from"./host.js";import{a,c as o,i as s,u as ee}from"./apple-runner-platform.js";import{n as c}from"./runner-toolchain-probe.js";import l from"node:crypto";import u from"node:fs";import te from"node:os";import d from"node:path";const f=d.join(`apple`,`runner`,`AgentDeviceRunner`),p=d.join(`dist`,`apple`,`runner`,`AgentDeviceRunner`),m=d.join(`apple`,`snapshot-presentation`),h=d.join(`dist`,`apple`,`snapshot-presentation`);function g(e){let t=d.join(e,f);return u.existsSync(t)?t:d.join(e,p)}function _(e){return d.join(g(e),`AgentDeviceRunner.xcodeproj`)}function v(e){let t=d.join(e,m);return u.existsSync(t)?t:d.join(e,h)}const y=new Set([`.build`,`.swiftpm`,`xcuserdata`]),ne=new Set([`.DS_Store`]),b=new Set([`.xcuserstate`]),re=new Set([`.build`,`.swiftpm`,`SnapshotPresentationConformance`,`Tests`,`xcuserdata`]),x=new Map;function ie(e){let t=[{path:g(e),ignoredDirectoryNames:y},{path:v(e),ignoredDirectoryNames:re}],n=oe(t),r=ae(e,n),i=JSON.stringify(t.map(({path:e})=>e)),a=x.get(i);if(a?.fileStatsFingerprint===r)return a.sourceFingerprint;let o=l.createHash(`sha256`);for(let t of n){let n=d.relative(e,t);o.update(n),o.update(`\0`),o.update(u.readFileSync(t)),o.update(`\0`)}let s=o.digest(`hex`);return x.set(i,{fileStatsFingerprint:r,sourceFingerprint:s}),s}function ae(e,t){let n=l.createHash(`sha256`);for(let r of t){let t=d.relative(e,r),i=u.statSync(r);n.update(t),n.update(`\0`),n.update(String(i.size)),n.update(`\0`),n.update(String(Math.trunc(i.mtimeMs))),n.update(`\0`)}return n.digest(`hex`)}function oe(e){return[...new Set(e.flatMap(({path:e,ignoredDirectoryNames:t})=>se(e,t)))].sort((e,t)=>e.localeCompare(t))}function se(e,t){return u.existsSync(e)?S(e,t,!1):[]}function S(e,t,n){let r=[];for(let i of u.readdirSync(e,{withFileTypes:!0})){let a=d.join(e,i.name);if(i.isDirectory()){if(t.has(i.name))continue;let e=n||le(i.name);r.push(...S(a,t,e))}else if(i.isFile()){if(n?ce(i.name):!w(i.name))continue;r.push(a)}}return r}function ce(e){return ne.has(e)||b.has(d.extname(e))}function le(e){return e.endsWith(`.xcodeproj`)||e.endsWith(`.xcworkspace`)}const C=new Set([`.jpg`,`.json`,`.png`,`.swift`,`.m`,`.h`,`.plist`,`.entitlements`,`.xctestplan`,`.xcconfig`,`.storyboard`,`.xib`,`.xcscheme`,`.xcworkspacedata`]);function w(e){return C.has(d.extname(e))}const T=d.join(te.homedir(),`.agent-device`,`apple-runner`),E=`.agent-device-runner-cache.json`,D=[`-IDEPackageSupportDisableManifestSandbox=1`,`-IDEPackageSupportDisablePluginExecutionSandbox=1`,`ENABLE_USER_SCRIPT_SANDBOXING=NO`],O=`$(inherited) -disable-sandbox -D AGENT_DEVICE_RUNNER_ISOLATION_CANARY`,k=`${O} -D AGENT_DEVICE_RUNNER_UNIT_TESTS`;function A(e){return e?.trim()??``}function j(e=process.env){return A(e.AGENT_DEVICE_IOS_BUNDLE_ID)||A(e.AGENT_DEVICE_IOS_RUNNER_APP_BUNDLE_ID)||`com.callstack.agentdevice.runner`}function M(e=process.env){return A(e.AGENT_DEVICE_IOS_RUNNER_TEST_BUNDLE_ID)||`${j(e)}.uitests`}function N(e=process.env){let t=j(e),n=M(e);return Array.from(new Set([A(e.AGENT_DEVICE_IOS_RUNNER_CONTAINER_BUNDLE_ID),`${n}.xctrunner`,t].filter(e=>e.length>0)))}const P=N(process.env);function F(e,t=r(),n){let a=o(e);return{schemaVersion:3,packageVersion:i(t),runnerSourceFingerprint:ie(t),...c(ee(a,e.kind),n),platformName:a,deviceKind:e.kind,target:e.target??`mobile`,buildDestinationFamily:s(e),runnerBundleBuildSettings:q(process.env),runnerSigningBuildSettings:K(process.env,e.kind===`device`,e),runnerPerformanceBuildSettings:J(),runnerArchBuildSettings:Y(process.env),runnerSandboxBuildArgs:X()}}function I(e,t){let n=process.env.AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH?.trim();return n?d.resolve(n):L(e,t)}function L(e,t){return d.join(R(e),z(t))}function R(e){return d.join(T,`derived`,a(e))}function z(e){return`cache-${l.createHash(`sha256`).update(W(B(e))).digest(`hex`).slice(0,16)}`}function B(e){let{artifacts:t,packageVersion:n,...r}=e;return r}function V(e,t){let n=B(e),r=B(t);return[...new Set([...Object.keys(n),...Object.keys(r)])].sort((e,t)=>e.localeCompare(t)).flatMap(e=>{let t=H(n[e]),i=H(r[e]);return t===i?[]:[{key:e,expected:U(t),actual:U(i)}]})}function H(e){return e===void 0?`(absent)`:W(e)}function U(e){return e.length<=300?e:`${e.slice(0,149)}…${e.slice(-149)}`}function W(e){return JSON.stringify(G(e))}function G(e){return Array.isArray(e)?e.map(e=>G(e)):!e||typeof e!=`object`?e:Object.fromEntries(Object.entries(e).sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>[e,G(t)]))}function ue(e){return t(e)||e.kind===`device`?`-maximum-concurrent-test-device-destinations`:`-maximum-concurrent-test-simulator-destinations`}function K(e=process.env,n=!1,r={platform:`apple`}){if(t(r))return[`CODE_SIGNING_ALLOWED=NO`,`CODE_SIGNING_REQUIRED=NO`,`CODE_SIGN_IDENTITY=`,`DEVELOPMENT_TEAM=`];if(!n)return[];let i=e.AGENT_DEVICE_IOS_TEAM_ID?.trim()||``,a=e.AGENT_DEVICE_IOS_SIGNING_IDENTITY?.trim()||``,o=e.AGENT_DEVICE_IOS_PROVISIONING_PROFILE?.trim()||``,s=[`CODE_SIGN_STYLE=${o?`Manual`:`Automatic`}`];return i&&s.push(`DEVELOPMENT_TEAM=${i}`),a&&s.push(`CODE_SIGN_IDENTITY=${a}`),o&&s.push(`PROVISIONING_PROFILE_SPECIFIER=${o}`),s}function q(e=process.env){let t=j(e),n=M(e);return[`AGENT_DEVICE_IOS_RUNNER_APP_BUNDLE_ID=${t}`,`AGENT_DEVICE_IOS_RUNNER_TEST_BUNDLE_ID=${n}`]}function J(){return[`COMPILER_INDEX_STORE_ENABLE=NO`,`ENABLE_CODE_COVERAGE=NO`,`ONLY_ACTIVE_ARCH=YES`,`ENABLE_PREVIEWS=NO`,`ENABLE_DEBUG_DYLIB=NO`]}function Y(e=process.env){let t=e.AGENT_DEVICE_XCUITEST_ARCHS?.trim();return t?[`ARCHS=${t}`]:[]}function de(e){let t=d.join(e,`Build`,`Intermediates.noindex`);return[`SYMROOT=${d.join(e,`Build`,`Products`)}`,`OBJROOT=${t}`,`SHARED_PRECOMPS_DIR=${d.join(t,`PrecompiledHeaders`)}`]}function X(){return[...D,`OTHER_SWIFT_FLAGS=${fe(process.env)}`]}function fe(e){return n(e.AGENT_DEVICE_XCUITEST_INCLUDE_UNIT_TESTS)?k:O}const pe=/^\s*Build settings from command line:\s*$/,me=/^\s+([A-Z][A-Z0-9_]*)\s*=\s*(.*)$/,Z=/^([A-Z][A-Z0-9_]*)=(.*)$/,Q=/^\s*Command line invocation:\s*$/;function he(e){let t;try{t=u.readFileSync(e,`utf8`)}catch{return null}let n=t.split(`
|
|
2
|
+
`),r=new Map,i=!1,a=``;for(let[e,t]of n.entries()){if(Q.test(t)){a=n[e+1]??``;continue}if(pe.test(t)){i=!0;continue}if(!i)continue;let o=me.exec(t);if(!o)break;r.set(o[1],o[2].trimEnd())}return i?{settings:r,invocationLine:a}:null}function $(e){return[...e.runnerBundleBuildSettings,...e.runnerSigningBuildSettings,...e.runnerPerformanceBuildSettings,...e.runnerArchBuildSettings,...e.runnerSandboxBuildArgs]}function ge(e){let t={};for(let n of $(e)){let e=Z.exec(n);e&&(t[e[1]]=e[2])}return t}function _e(e,t){return $(e).filter(e=>!Z.test(e)).filter(e=>!t.includes(e)).map(e=>({key:`(invocation flag)`,expected:e,actual:`absent from the "Command line invocation:" line`}))}function ve(e,t){let n=he(t);return n?[...Object.entries(ge(e)).filter(([e,t])=>{let r=n.settings.get(e);return r===void 0?t!==``:r!==t}).map(([e,t])=>({key:e,expected:t,actual:n.settings.get(e)??`(absent)`})),..._e(e,n.invocationLine)]:[{key:`(build log)`,expected:`a "Build settings from command line:" block`,actual:`missing or unreadable log`}]}function ye(t,n){let r=ve(t,n);if(r.length!==0)throw new e(`COMMAND_FAILED`,`The Apple runner build did not use the settings its cache identity records`,{reason:`runner_build_settings_mismatch`,buildLogPath:n,differences:r,hint:`Align the build invocation with the runner cache identity resolvers, or rebuild without the cache.`})}export{K as _,ye as a,Y as c,z as d,I as f,X as g,J as h,V as i,de as l,ue as m,E as n,F as o,L as p,B as r,j as s,P as t,q as u,W as v,_ as y};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{u as e}from"./host.js";import{T as t,b as n,g as r,s as i}from"./runner-lease.js";import a from"node:fs";import o from"node:path";const s=864e5,c=/^cache-[0-9a-f]{16}$/;function l(e=process.env){let t=e.AGENT_DEVICE_IOS_RUNNER_CACHE_KEEP?.trim();return!t||!/^\d+$/.test(t)?3:Number(t)}async function u(e,t=process.env,n=Date.now()){let r=l(t);if(r===0||t.AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH?.trim())return[];let i=f(o.dirname(e)).filter(t=>t.derived!==e).sort((e,t)=>t.lastUsedMs-e.lastUsedMs).slice(r-1).filter(e=>n-e.lastUsedMs>=s),a=[];for(let{derived:e}of i)try{await m(e,n)&&a.push(e)}catch(t){d(e,t)}return a}function d(t,n){e({level:`warn`,phase:`runner_xctestrun_cache_eviction_failed`,data:{derived:t,error:n instanceof Error?n.message:String(n)}})}function f(e){let t;try{t=a.readdirSync(e,{withFileTypes:!0}).filter(e=>e.isDirectory()&&c.test(e.name)).map(e=>e.name)}catch{return[]}return t.map(t=>{let n=o.join(e,t);return{derived:n,lastUsedMs:p(n)}})}function p(e){try{return a.statSync(t(e)).mtimeMs}catch{return 0}}async function m(e,c){let l;try{l=await r(e,0)}catch{return!1}try{if(c-p(e)<s)return!1;let r=o.basename(e);return!i().some(({xctestrunPath:t,cacheKey:n})=>n===r||t.startsWith(`${e}${o.sep}`))&&(await a.promises.rm(t(e),{force:!0}),await a.promises.rm(e,{recursive:!0,force:!0}),n(`clean`,`stale_cache_evicted`,{derived:e}),!0)}finally{await l().catch(()=>void 0)}}export{u as evictStaleRunnerCaches};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{n as e}from"./runner-cache-metadata.js";import{isPathInsideDirectory as t}from"./runner-artifact-manifest.js";import n from"node:fs";import r from"node:path";async function i(e,t,n){if(!a(e,n))return[];let r=o(e,t);return r?await c(e,e,r):[]}function a(e,t){try{let i=r.join(n.realpathSync(r.dirname(t)),r.basename(t));return n.realpathSync(e)===i}catch{return!1}}function o(i,a){let o=new Set([e]);try{let e=n.realpathSync(i);for(let c of a){let a=n.realpathSync(c);if(!t(c,i)||!t(a,e))return null;o.add(s(r.relative(i,c))),o.add(s(r.relative(e,a)))}}catch{return null}return o}function s(e){let t=e.split(r.sep);return t.slice(0,t[0]===`Build`?2:1).join(r.sep)}async function c(e,t,i){let a=[];for(let o of await n.promises.readdir(t,{withFileTypes:!0})){let s=r.join(t,o.name),l=r.relative(e,s);if(!i.has(l)){if(o.isDirectory()&&[...i].some(e=>e.startsWith(`${l}${r.sep}`))){a.push(...await c(e,s,i));continue}await n.promises.rm(s,{recursive:!0,force:!0}),a.push(l)}}return a}export{i as trimRunnerBuildScratch};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime.js";import{F as t,I as n,K as r,P as i,V as a,z as o}from"./sdk-contracts.js";import{v as s}from"./sdk-batch-runner.js";import{c,r as l}from"./diagnostics.js";import"./diagnostics2.js";import{d as u,p as d}from"./sdk-device.js";import{o as f}from"./sdk-remote-config.js";import{A as p,S as m,T as h,h as g,m as _,t as v,w as ee,y as te}from"./owner-identity.js";import{h as ne,i as re,m as ie,n as ae,o as oe,p as se,u as ce}from"./exec.js";import{a as le,t as ue}from"./file.js";import"./command.js";import"./process.js";import{a as de,r as fe}from"./version.js";import{t as pe}from"./ttl-memo.js";import{i as me,n as he,r as ge}from"./retry.js";import{o as _e}from"./device-shell.js";import{t as ve}from"./keyed-lock.js";import{n as ye,t as be}from"./boot-diagnostics.js";import{i as xe,r as Se}from"./request-cancel.js";import{t as Ce}from"./request.js";import{a as we,n as Te,o as Ee,r as De}from"./tool-provider.js";import{t as Oe}from"./physical-device-control.js";import{a as ke,o as Ae}from"./runner.js";import{C as je,L as Me,M as Ne,P as Pe,W as Fe,a as y,d as Ie,h as Le,r as Re,t as ze,u as b,v as x}from"./host.js";import{o as Be,s as Ve}from"./apple-runner-platform.js";import{c as He,g as Ue,h as We,i as Ge,l as Ke,m as qe,t as Je}from"./runner-cache-metadata.js";import{t as Ye}from"./plist-xml.js";import{n as Xe,t as Ze}from"./runner-owner-state.js";import{l as Qe,n as $e}from"./simctl.js";import{C as et,S as tt,T as nt,_ as rt,a as it,b as at,c as ot,d as st,f as ct,h as lt,i as ut,l as S,n as dt,o as ft,p as pt,r as mt,s as ht,t as gt,w as _t,x as vt,y as yt}from"./runner-session-types.js";import{A as bt,D as xt,E as St,M as C,O as Ct,P as w,S as wt,_ as Tt,a as T,b as E,f as Et,g as Dt,h as Ot,i as kt,j as At,l as jt,n as Mt,o as Nt,u as Pt,v as Ft,w as D}from"./runner-error-classification.js";import{O as It,T as Lt,_ as Rt,a as zt,b as O,c as Bt,d as Vt,f as Ht,h as Ut,i as Wt,m as Gt,n as Kt,o as qt,p as Jt,r as Yt,t as k,u as Xt,v as Zt,w as Qt,x as $t,y as en}from"./runner-disposal.js";import A from"node:fs";import tn from"node:path";const nn={runCmdStreaming:se,runCmdSync:ie,runCmdBackground:ce,requireExecSuccess:oe,isCommandTimeoutError:re,commandDeveloperDir:ae,shellQuote:_e,emitDiagnostic:l,withDiagnosticTimer:c,retryWithPolicy:me,isEnvTruthy:ge,deadlineFromTimeoutMs:(e,t)=>he.fromTimeoutMs(e,t),isProcessAlive:_,isProcessGroupAlive:g,readProcessStartTime:ee,readProcessCommand:m,signalPidsBestEffort:h,signalProcessGroupBestEffort:ne,findProjectRoot:fe,readVersion:de,acquireProcessLock:ue,withProcessLock:le,withKeyedLock:ve,publishFileSync:p,classifyOwnerLiveness:v,readHostCpuArchSync:te,createTtlMemo:pe,parseBooleanLiteral:f,isRecord:s,emitRequestProgress:Ce,getRequestSignal:Se,isRequestCanceled:xe,classifyBootFailure:ye,bootFailureHint:be,runAppleToolCommand:we,runXcrun:Ee,readApplePlistJson:De,hasScopedAppleToolProvider:Te,buildSimctlArgsForDevice:$e,simulatorAddressFor:Qe,resolveIosPhysicalDeviceControl:Oe,visitXmlPlistEntries:Ye,leaseOwnerStateDir:Xe,hasDeviceClaimAuthority:e=>Ze()?.(e)??!1};function rn(e=process.env){return je(e.AGENT_DEVICE_IOS_RUNNER_DETACH??``)!==!1}async function an(e,t){if(!rn())return null;let n=Ve(e),r=(t,r)=>(b({level:`debug`,phase:`ios_runner_lease_adoption_skipped`,data:{deviceId:e.id,lane:n.handoff?n.lane:void 0,runnerPid:r?.runnerPid,port:r?.port,reason:t}}),null);if(!n.handoff)return r(n.reason);let i=Ut(e.id);if(i.type===`absent`)return r(`lease_absent`);if(i.type===`refused`)return r(i.reason,i.lease);let a=i.lease;if(a.simulatorSetPath!==lt(e))return r(`simulator_set_mismatch`,a);let o=on(a,t.expectedRunnerSessionId);if(`refusal`in o)return r(o.refusal,a);let s=sn(e,a,t.budget);if(`refusal`in s)return r(s.refusal,a);let c=o.value,l=s.value,u=await cn(e,a.port,n.lane,t.budget);if(u!==`answered`)return r(u,a);if(!Jt(a,c))return r(`runner_pid_recycled`,a);let d=dn(e,a,c,l);try{O(d.lease)}catch{return r(`lease_write_failed`,a)}return b({level:`info`,phase:`ios_runner_lease_adopted`,data:{deviceId:e.id,lane:n.lane,sessionId:d.sessionId,runnerPid:c,port:a.port,previousOwnerPid:a.ownerPid}}),d}function on(e,t){if(t!==void 0&&e.sessionId!==t)return{refusal:`session_identity_mismatch`};let n=e.runnerPid;return n?x(n)?Zt(e,n)?{value:n}:{refusal:`runner_pid_recycled`}:{refusal:`runner_process_dead`}:{refusal:`runner_pid_missing`}}function sn(e,t,n){let r=un(e,n);return r?t.cacheKey!==r.cacheKey||!t.xctestrunPath.startsWith(`${r.derived}${tn.sep}`)?{refusal:`artifact_fingerprint_mismatch`}:{value:r}:{refusal:`expected_derived_unresolved`}}async function cn(e,t,n,i){let a=n===`physical_coredevice`?5e3:500,o=ln(i,a);if(o<=0)return`probe_budget_exhausted`;let s=Date.now(),c=!1;try{let n=await ct(e,t,w({command:`uptime`}),o,i?.signal);return c=bt(Ct(await n.text())),c?`answered`:`probe_failed`}catch(e){if(r(e))throw e;return`probe_failed`}finally{b({level:`debug`,phase:`ios_runner_lease_adoption_probe`,durationMs:Date.now()-s,data:{deviceId:e.id,port:t,lane:n,budgetCapMs:a,timeoutMs:o,answered:c}})}}function ln(e,t){return e?.deadline?Math.min(t,Math.floor(e.deadline.remainingMs())):t}function un(e,t){try{let n=Ke(e,void 0,t);return{derived:We(e,n),cacheKey:qe(n)}}catch(e){if(r(e))throw e;return null}}function dn(e,t,n,r){let i=t.sessionId,a={xctestrunPath:t.xctestrunPath,...r,cache:`exact`,artifact:`valid`,buildMs:0,xctestrunPathSource:`manifest`,reason:`adopted_from_lease`},{child:o,wait:s}=fn(n);return{sessionId:i,device:e,deviceId:e.id,port:t.port,xctestrunPath:t.xctestrunPath,xctestrunArtifact:a,jsonPath:t.jsonPath,testPromise:s,child:o,runnerLogPath:t.runnerLogPath,state:`ready`,commandCharges:new gt,lease:Vt({device:e,sessionId:i,runnerPid:n,port:t.port,xctestrunPath:t.xctestrunPath,cacheKey:r.cacheKey,jsonPath:t.jsonPath,runnerLogPath:t.runnerLogPath})}}function fn(e){let t={pid:e,exitCode:null};return{child:t,wait:new Promise(n=>{let r=setInterval(()=>{x(e)||(clearInterval(r),t.exitCode=-1,n({stdout:``,stderr:``,exitCode:-1}))},1e3);r.unref?.()})}}function pn(){let e=new AbortController,t=!1,n=``;return{wake:e.signal,observe:r=>{if(t)return;let i=n+r;if(i.includes(`AGENT_DEVICE_RUNNER_LISTENER_READY`)){t=!0,n=``,e.abort();return}n=i.slice(-33)},finish:()=>{t=!0,n=``,e.abort()}}}function mn(e){let t=e.logPath;A.mkdirSync(tn.dirname(t),{recursive:!0});let n=A.openSync(t,`a`),r=yt(t,n),i=hn(()=>{try{A.closeSync(n)}catch{}}),a=pn();try{let t=Pe(`xcodebuild`,[`test-without-building`,`-only-testing`,`AgentDeviceRunnerUITests/RunnerTests/testCommand`,`-parallel-testing-enabled`,`NO`,`-test-timeouts-enabled`,`NO`,`-collect-test-diagnostics`,`never`,Ue(e.device),`1`,`-destination-timeout`,`20`,`-xctestrun`,e.xctestrunPath,`-derivedDataPath`,e.derivedPath,...rt(e.device,Be(e.device))],{allowFailure:!0,env:{...process.env,AGENT_DEVICE_RUNNER_PORT:String(e.port)},detached:!0,signal:e.signal,stdio:[`ignore`,n,n],captureOutput:!1}),o=nt({file:r,onOutput:t=>{a.observe(t),(e.traceLogPath||e.verbose)&&tt(t,void 0,e.traceLogPath,e.verbose)}}),s=hn(()=>{o.stop(),i()}),c=()=>{o.drain(),i(),a.finish()};return t.wait.then(c,c),{...t,startupRetryWake:a.wake,endOutputObservation:s,readLogTail:e=>et(r,e)}}catch(e){throw i(),e}}function hn(e){let t=!1;return()=>{t||(t=!0,e())}}const j=new Map,gn=new Map,M=new Map,_n=1e4;function N(e,t){return Fe(gn,e,t)}async function P(e,t){R(e.id);let n=N(e.id,async()=>{let{openRunnerStartBudget:n}=await import(`./runner-start-budget.js`),r=n(t);try{let n=j.get(e.id);if(n){bn(n,t.expectedRunnerSessionId);let i=await wn(e,n,r.phase);if(i)return i}return await en(e.id,async()=>await yn(e,t,r))}catch(e){throw r.exhausted.aborted?r.exhausted.reason:e}finally{r.close()}}),{raceRunnerStartAgainstCaller:r}=await import(`./runner-start-budget.js`);return await r(n,t.signal,e.id)}const vn=1e4;async function yn(e,t,r){let i={},a=r.phase,o=a.signal,s=Wn(t.runnerLeaseContext,e.id);b({level:`debug`,phase:`ios_runner_session_startup`,data:{deviceId:e.id,logicalLeaseContext:s}});let c=await V(i,`adopt_detached_runner`,async()=>await an(e,{budget:a,expectedRunnerSessionId:t.expectedRunnerSessionId}));if(c)return c.startupTimings=i,c.logicalLeaseContext=s,j.set(e.id,c),c;xn(t.expectedRunnerSessionId),await V(i,`cleanup_stale_xcodebuild`,async()=>{await Gt(e,qt,s)}),await V(i,`ensure_booted`,async()=>{await Rn(e)});let l=await V(i,`verify_device_readiness`,async()=>await(await import(`./runner-device-readiness.js`)).preflightIosRunnerDeviceReadiness(e,{budgetMs:Math.min(vn,a.deadline?.remainingMs()??vn),signal:o}));await V(i,`verify_host_dev_tools_security`,async()=>{let{assertDevToolsSecurityForIosRunner:t}=await import(`./runner-dev-tools-security.js`);await t(e)}),t.cleanStaleBundles?await V(i,`cleanup_stale_bundles`,async()=>{await Tn(e)}):(i.cleanup_stale_bundles=0,b({level:`debug`,phase:`ios_runner_startup_cleanup_stale_bundles_skipped`}));let u,d,f,p,m=_t(t.logPath,e.id),h;try{u=await V(i,`ensure_xctestrun`,async()=>await $t(e,{...t,budget:Ge(Vn(t,r),o)})),i.build_xctestrun=u.buildMs,d=await V(i,`allocate_port`,async()=>await vt()),{xctestrunPath:f,jsonPath:p}=await V(i,`prepare_xctestrun_env`,async()=>await Lt(u.xctestrunPath,{AGENT_DEVICE_RUNNER_PORT:String(d)},Qt({deviceId:e.id,ownerToken:Rt(),port:d}),{iosXctestEnvDir:t.iosXctestEnvDir})),u.buildMs>0&&Ie({type:`command`,status:`progress`,message:`Starting XCTest runner...`}),h=await V(i,`launch_xcodebuild`,async()=>(await at(m).catch(()=>{}),await mn({device:e,port:d,xctestrunPath:f,derivedPath:u.derived,signal:o,logPath:m,traceLogPath:t.traceLogPath,verbose:t.verbose})))}catch(e){throw kt(e,l)}let g=mt(e.id,d),_=Vt({device:e,sessionId:g,runnerPid:h.child.pid,port:d,xctestrunPath:f,cacheKey:u.cacheKey,jsonPath:p,runnerLogPath:m}),v={sessionId:g,device:e,deviceId:e.id,port:d,xctestrunPath:f,xctestrunArtifact:u,jsonPath:p,runnerLogPath:m,testPromise:h.wait,child:h.child,endOutputObservation:h.endOutputObservation,readLogTail:h.readLogTail,state:`starting`,commandCharges:new gt,startupRetryWake:h.startupRetryWake,launchDeadline:ze.fromTimeoutMs(Hn(r)),startupTimings:i,startupDeviceStates:l,logicalLeaseContext:s,lease:_,speculative:t.speculative===!0};if(o?.aborted)throw await Wt(v,{graceful:!1,waitTimeoutMs:k,leaseLockHeld:!0}),n();try{O(_)}catch(t){throw await L(e.id,v,{graceful:!1,waitTimeoutMs:k,leaseLockHeld:!0}),t}return j.set(e.id,v),v}function bn(e,t){if(t!==void 0&&e.sessionId!==t)throw Sn()}function xn(e){if(e!==void 0)throw Sn()}function Sn(){return new i(`COMMAND_FAILED`,`Apple runner session ownership changed before command dispatch`,{reason:`runner_session_ownership_changed`})}async function Cn(e,t){let n=On(t);return n===`gone`?(await V({},`stop_stale_session`,async()=>{await L(e.id,t,{graceful:!1,waitTimeoutMs:k})}),!1):n!==`starting`&&n!==`ready`?!1:n===`starting`&&t.launchDeadline?.isExpired()?(b({level:`warn`,phase:`ios_runner_session_invalidated`,data:{deviceId:e.id,sessionId:t.sessionId,reason:`runner_launch_budget_exhausted`}}),await V({},`stop_expired_starting_session`,async()=>{await L(e.id,t,{graceful:!1,waitTimeoutMs:k})}),!1):pt(t.device,e)?!0:(await V({},`stop_other_simulator_set_session`,async()=>{await L(e.id,t)}),!1)}async function wn(e,t,n){if(!await Cn(e,t))return null;let r=t.xctestrunArtifact;if(r?.cache===`external`)return b({level:`debug`,phase:`ios_runner_session_reuse`,data:{deviceId:e.id,sessionId:t.sessionId,ready:t.state===`ready`,cache:r.cache,logicalLeaseContext:t.logicalLeaseContext}}),t;let i=Ke(e,void 0,n),a=We(e,i),o=qe(i);return r?.derived!==a||r.cacheKey!==o?(b({level:`debug`,phase:`ios_runner_session_artifact_stale`,data:{deviceId:e.id,sessionId:t.sessionId,currentDerived:r?.derived,expectedDerived:a,currentCacheKey:r?.cacheKey,expectedCacheKey:o}}),await V({},`stop_stale_artifact_session`,async()=>{await L(e.id,t)}),null):(b({level:`debug`,phase:`ios_runner_session_reuse`,data:{deviceId:e.id,sessionId:t.sessionId,ready:t.state===`ready`,logicalLeaseContext:t.logicalLeaseContext}}),t)}async function Tn(e){e.kind===`simulator`&&await Promise.allSettled(Je.map(async t=>{let n=await En(e,t);!n||Dn(n)}))}async function En(e,t){try{return await Me(y(e,[`uninstall`,e.id,t]),{allowFailure:!0,timeoutMs:_n})}catch(n){b({level:`warn`,phase:`ios_runner_startup_cleanup_stale_bundle_failed`,data:{deviceId:e.id,bundleId:t,timeoutMs:_n,error:n instanceof Error?n.message:String(n)}});return}}function Dn(e){if(e.exitCode===0)return!0;let t=`${e.stdout}\n${e.stderr}`.toLowerCase();return t.includes(`not installed`)||t.includes(`found nothing`)||t.includes(`no such file`)||t.includes(`invalid device`)||t.includes(`could not find`)}function F(e){let t=j.get(e);return t?{sessionId:t.sessionId,liveness:On(t)}:null}function On(e){return ot({state:e.state,processRunning:zt(e.child.pid)})}async function I(e,t){await N(e.deviceId,async()=>{j.get(e.deviceId)===e&&ut(e)&&(b({level:`warn`,phase:`ios_runner_session_invalidated`,data:{deviceId:e.deviceId,sessionId:e.sessionId,reason:t}}),await L(e.deviceId,e,{graceful:!1,waitTimeoutMs:k}))})}async function L(e,t,n={}){let r=t??j.get(e);r&&ut(r)&&(await Wt(r,n),j.get(e)===r&&j.delete(e))}function kn(e){R(e);let t=An();if(t<=0||!j.has(e))return;let n=setTimeout(()=>{M.delete(e),b({level:`info`,phase:`ios_runner_idle_stop`,data:{deviceId:e,idleMs:t}}),z(e).catch(t=>{b({level:`warn`,phase:`ios_runner_idle_stop_failed`,data:{deviceId:e,error:t instanceof Error?t.message:String(t)}})})},t);n.unref?.(),M.set(e,n),b({level:`debug`,phase:`ios_runner_idle_stop_scheduled`,data:{deviceId:e,idleMs:t}})}function R(e){let t=M.get(e);t&&(clearTimeout(t),M.delete(e))}function An(e=process.env){let t=e.AGENT_DEVICE_IOS_RUNNER_IDLE_STOP_MS?.trim();if(t){let e=Number(t);if(Number.isFinite(e)&&e>=0)return Math.floor(e)}return 3e5}function jn(e,t){e.speculative&&!wt(t)&&(e.speculative=!1)}async function Mn(e){return await N(e,async()=>{let t=j.get(e);return t?.speculative?(b({level:`debug`,phase:`ios_runner_speculative_released`,data:{deviceId:e,sessionId:t.sessionId,ready:t.state===`ready`}}),await z(e),!0):!1})}async function z(e){R(e),await N(e,async()=>{await en(e,async()=>{await L(e,void 0,{leaseLockHeld:!0}),await Yt(e)})})}async function Nn(e,t){let n=j.get(e);if(t.retain&&!it(n)){kn(e);return}t.retain&&b({level:`info`,phase:`ios_runner_retain_skipped_busy`,data:{deviceId:e}}),await Bt(e),await z(e)}async function Pn(){let e=Array.from(j.values());await Kt(e);for(let t of e)j.get(t.deviceId)===t&&j.delete(t.deviceId)}async function Fn(){if(!rn())return 0;let e=0;for(let[t,n]of j){let r=In(t,n);if(!r.detached){b({level:`debug`,phase:`ios_runner_session_detach_skipped`,data:{deviceId:t,sessionId:n.sessionId,lane:r.lane,reason:r.reason,outstandingCharges:n.commandCharges.outstandingChargeCount,hasAbandonedCharges:n.commandCharges.hasAbandonedCharges}});continue}e+=1,b({level:`info`,phase:`ios_runner_session_detached`,data:{deviceId:t,lane:r.lane,sessionId:n.sessionId,runnerPid:n.child.pid,port:n.port,runnerLogPath:n.runnerLogPath}})}return e}function In(e,t){let n=Ve(t.device);if(!n.handoff)return{detached:!1,lane:void 0,reason:n.reason};let r=n.lane,i=ht(t);if(!i.detach)return{detached:!1,lane:r,reason:i.reason};let a=t.lease;if(!a)return{detached:!1,lane:r,reason:`lease_absent`};if(!zt(t.child.pid))return{detached:!1,lane:r,reason:`runner_process_dead`};try{O(Xt(a))}catch{return{detached:!1,lane:r,reason:`lease_write_failed`}}return t.endOutputObservation?.(),j.delete(e),R(e),dt(t,`stopped`),{detached:!0,lane:r}}async function Ln(){await Pn();let e=Array.from(j.keys());await Promise.allSettled(e.map(async e=>{await z(e)})),await Bt()}function Rn(e){return e.kind===`simulator`?e.booted?(b({level:`debug`,phase:`ios_runner_startup_ensure_booted_skipped`,data:{deviceId:e.id}}),Promise.resolve()):zn(e):Promise.resolve()}async function zn(e){await Me(y(e,[`bootstatus`,e.id,`-b`]),{timeoutMs:S})}function Bn(e){if(!u(e.platform))throw new i(`UNSUPPORTED_PLATFORM`,`Unsupported platform for iOS runner: ${e.platform}`);if(e.kind!==`simulator`&&e.kind!==`device`)throw new i(`UNSUPPORTED_OPERATION`,`Unsupported iOS device kind for runner: ${e.kind}`)}async function B(e,t,n,r,i,a){Un(t,n.command);let{executeRunnerExchange:o}=await import(`./runner-exchange.js`);return o(e,t,n,r,i,e=>I(t,e),a)}function Vn(e,t){let n=He(t.phase,`runner_xctestrun_build`)??t.timeoutMs,r=ft(e.buildTimeoutMs);return r===void 0?n:Math.min(r,n)}function Hn(e){let t=Math.floor(e.phase.deadline?.remainingMs()??e.timeoutMs);return e.explicit?t:Math.min(S,t)}async function V(e,t,n){let r=Date.now();try{return await n()}finally{let n=Date.now()-r;e[t]=n,b({level:`debug`,phase:`ios_runner_startup_${t}`,durationMs:n})}}function Un(e,t){if(e.startupTimingsReported||!e.startupTimings)return;e.startupTimingsReported=!0;let n=Object.values(e.startupTimings).reduce((e,t)=>e+t,0);b({level:`info`,phase:`ios_runner_session_startup_timings`,durationMs:n,data:{command:t,sessionId:e.sessionId,ready:e.state===`ready`,logicalLeaseContext:e.logicalLeaseContext,timings:e.startupTimings}})}function Wn(e,t){if(!e)return;let n={leaseId:H(e.leaseId),clientId:H(e.clientId),tenantId:H(e.tenantId),runId:H(e.runId),leaseProvider:H(e.leaseProvider),deviceKey:H(e.deviceKey)??t},r=Object.entries(n).filter(([,e])=>e!==void 0);return r.length>0?Object.fromEntries(r):void 0}function H(e){return typeof e==`string`&&e.trim().length>0?e.trim():void 0}async function Gn(e){let{device:t,session:n,command:r,transportError:i,options:a,signal:o,invalidationReason:s}=e;return await Kn(await Qn(t,n,r,i,a,o),{command:r,session:n,transportError:i,options:a,invalidationReason:s,invalidateSession:e.invalidateSession})}async function Kn(e,t){if(e.type===`recovered`)return Yn(e,t);let n=qn(e,t);if(e.type===`skipInvalidation`)throw Xn(e,t,n);return await Zn(e,t,n)}function qn(e,t){return`runnerAnswer`in e?o(e.runnerAnswer,e.dispatched):E(t.command)?o(t.transportError,`unknown`):o(Jn(t,e.lostReply),`unknown`)}function Jn(e,t){let{command:n,transportError:r,options:a}=e,o=r.details?.reason,s=r.details?.hint;return new i(`COMMAND_FAILED`,`cause`in t?fr(n.command,t.cause):t.message,{command:n.command,commandId:n.commandId,...t.lifecycleState===void 0?{}:{lifecycleState:t.lifecycleState},reason:Mt,...o===void 0?{}:{transportReason:o},recovery:t.recovery,...W(r),hint:typeof s==`string`?s:t.hint,logPath:a.logPath??r.details?.logPath,transportError:r.message},r)}function Yn(e,t){return K({command:t.command,session:t.session,transportError:t.transportError,decision:`skipped`,reason:e.reason,lifecycleState:e.lifecycleState}),e.data}function Xn(e,t,n){return K({command:t.command,session:t.session,transportError:t.transportError,decision:`skipped`,reason:e.reason,lifecycleState:e.lifecycleState}),n}async function Zn(e,t,n){throw K({command:t.command,session:t.session,transportError:t.transportError,decision:`retained`,reason:e.reason,lifecycleState:e.lifecycleState}),await t.invalidateSession(t.session,t.invalidationReason),n}async function Qn(e,t,n,r,i,a){if(n.command===`status`||!n.commandId?.trim())return{type:`retainInvalidation`,reason:`status_recovery_unavailable`,lostReply:{recovery:`status_recovery_unavailable`,cause:`status recovery was unavailable`,hint:G(n.command)}};let o=W(r),s;try{s=await B(e,t,{command:`status`,statusCommandId:n.commandId},i.logPath,3e3,a)}catch(e){return b({level:`debug`,phase:`ios_runner_command_status_recovery_failed`,data:{command:n.command,commandId:n.commandId,error:e instanceof Error?e.message:String(e),...o}}),{type:`retainInvalidation`,reason:`status_probe_failed`,lostReply:{recovery:`status_probe_failed`,cause:`the status probe failed`,hint:G(n.command)}}}let c=typeof s.lifecycleState==`string`?s.lifecycleState:``,l=tr(t,n,c);return b({level:`debug`,phase:`ios_runner_command_status_recovery`,data:{command:n.command,commandId:n.commandId,lifecycleState:c,...o,...l===void 0?{}:{abandonedChargeSettled:l}}}),nr(s,c,n,r,i)}const $n=new Set([`completed`,`failed`]),er=new Set([`accepted`,`started`]);function tr(e,t,n){if($n.has(n))return e.commandCharges.settleTerminalEvidence(t.commandId)}function nr(e,t,n,r,i){if(t===`completed`)return rr(e,n,r);if(t===`failed`){let a=xt(typeof e.lifecycleErrorCode==`string`?e.lifecycleErrorCode:void 0);return{type:`skipInvalidation`,reason:`runner_reported_failure`,lifecycleState:t,dispatched:a.details.dispatched,runnerAnswer:ir(e,a,n,r,i)}}return er.has(t)?{type:`skipInvalidation`,reason:`command_still_in_flight`,lifecycleState:t,lostReply:{recovery:`command_still_in_flight`,lifecycleState:t,message:`Runner command "${n.command}" is still ${t} after the transport response was lost.`,hint:cr(n.command,t,W(r))}}:{type:`retainInvalidation`,reason:t?`unknown_lifecycle_state`:`missing_lifecycle_state`,lifecycleState:t,lostReply:{recovery:`lifecycle_state_not_recoverable`,lifecycleState:t,cause:`lifecycle status was ${t?`"${t}"`:`missing`}`,hint:G(n.command)}}}function rr(e,t,n){let r=ar(e.lifecycleResponseJson);return r?{type:`recovered`,data:r,reason:`completed_with_retained_response`,lifecycleState:`completed`}:{type:`skipInvalidation`,reason:E(t)?`read_only_completed_without_retained_response`:`completed_without_retained_response`,lifecycleState:`completed`,lostReply:{recovery:`completed_without_retained_response`,lifecycleState:`completed`,message:`Runner command "${t.command}" completed after the transport response was lost, but no recoverable response was retained.`,hint:or(t.command,W(n))}}}function ir(e,t,n,r,a){let o=typeof e.lifecycleErrorMessage==`string`?e.lifecycleErrorMessage:`Runner command failed`,s=typeof e.lifecycleErrorHint==`string`?e.lifecycleErrorHint:void 0,c=W(r);return new i(t.code,o,{command:n.command,commandId:n.commandId,lifecycleState:`failed`,recovery:`runner_reported_failure`,...t.details,...c,hint:s??sr(n.command,c),logPath:a.logPath,transportError:r.message},r)}function ar(e){if(typeof e!=`string`||e.trim().length===0)return;let t;try{t=Ct(e)}catch{return}return bt(t)?At(t):void 0}function or(e,t){return`${U(t)}The runner is still reachable and reports "${e}" already completed, so agent-device kept the session open and will not replay it. Run snapshot -i to inspect the current UI, then continue from that observed state.`}function sr(e,t){return`${U(t)}The runner is still reachable and reports "${e}" failed after the transport response was lost, so agent-device kept the session open and did not replay it. Run snapshot -i to inspect the current UI and retry with a selector visible in that snapshot.`}function cr(e,t,n){return`${U(n)}The runner is still reachable and reports "${e}" is ${t}, so agent-device kept the session open and will not replay it. Wait briefly, run snapshot -i to inspect the current UI, then continue from that observed state.`}function U(e){return e.readinessPreflightSkipped===!0?`This hot command skipped the uptime preflight because the runner had just completed a healthy interaction; status recovery confirmed the runner still observed it. `:``}function lr(e,t){let n=e.details?.[t];return typeof n==`boolean`?n:void 0}function ur(e,t){let n=e.details?.[t];return typeof n==`string`?n:void 0}function dr(e,t){let n=e.details?.[t];return typeof n==`number`?n:void 0}function W(e){let t={},n=lr(e,`runnerReadinessPreflightSkipped`);n!==void 0&&(t.readinessPreflightSkipped=n);let r=ur(e,`runnerReadinessPreflightSkipReason`);r!==void 0&&(t.readinessPreflightSkipReason=r);let i=dr(e,`runnerReadinessPreflightSkippedAgeMs`);return i!==void 0&&(t.readinessPreflightSkippedAgeMs=i),t}function fr(e,t){return`Runner command "${e}" lost its transport response and ${t}, so agent-device invalidated the runner session instead of replaying the command.`}function G(e){return`The runner did not confirm that "${e}" reached a safe terminal state, so agent-device kept the conservative invalidation path. Run snapshot -i before retrying if the UI may have changed.`}function K(e){let{command:t,session:n,transportError:r,decision:i,reason:a,lifecycleState:o}=e;b({level:i===`retained`?`warn`:`debug`,phase:`ios_runner_command_invalidation_decision`,data:{command:t.command,commandId:t.commandId,decision:i,reason:a,lifecycleState:o,runnerReachable:o!==void 0,sessionId:n.sessionId,transportError:r.message}})}const q=new Map;function pr(e,t){let n=e.requestId?.trim();if(n)return`request:${n}`;let r=t.commandId?.trim();if(r)return`command:${r}`}function mr(e){if(!e)return;let t=J(e);t.touchedSession=!0,Y(e,t)}function hr(e){return e?q.get(e)?.touchedSession===!0:!1}function gr(e){if(!e)return!0;let t=J(e);return t.recycles>=1?(Y(e,t),!1):(Y(e,t),!0)}function _r(e){if(!e)return;let t=J(e);t.recycles+=1,Y(e,t)}function vr(e,t){return b({level:`warn`,phase:`ios_runner_recycle_budget_exhausted`,data:{command:e.command,commandId:e.commandId,requestId:t.requestId,maxRecycles:1}}),o(new i(`COMMAND_FAILED`,`iOS runner was already restarted during this request and "${e.command}" still failed, so agent-device stopped instead of paying for another runner boot.`,{command:e.command,commandId:e.commandId,recovery:`runner_recycle_budget_exhausted`,hint:"Check the runner log for the underlying failure before retrying — a provisioning or code-signing error there means the runner cannot install on this device, and no retry will help. If the runner is healthy, the current screen is likely too heavy or animating for accessibility capture: the app session is preserved, so run `screenshot` for visual truth and interact by coordinates, or navigate to another screen.",logPath:t.logPath}),`no`)}function J(e){return yr(),q.get(e)??{touchedSession:!1,recycles:0,lastAtMs:Date.now()}}function Y(e,t){t.lastAtMs=Date.now(),q.delete(e),q.set(e,t)}function yr(){let e=Date.now()-6e5;for(let[t,n]of q)n.lastAtMs<e&&q.delete(t);for(;q.size>512;){let e=q.keys().next().value;if(e===void 0)break;q.delete(e)}}async function br(e,t){D(t.requestId);let n=C(t),r=w({command:`uptime`}),a;for(let i=1;i<=2;i+=1){let o=await xr({device:e,command:r,options:t,signal:n,attempt:i,recoveryReason:a});if(o.kind===`prepared`)return o.result;a=o.recoveryReason}throw new i(`COMMAND_FAILED`,`iOS runner prepare failed`)}async function xr(e){let{device:t,command:n,options:r,signal:i,attempt:a,recoveryReason:o}=e,s=Date.now(),c=await P(t,{...r,cleanStaleBundles:a>1||r.cleanStaleBundles,...Ar(r,`runner_session`)}),l=Date.now()-s;try{return{kind:`prepared`,result:Fr(t,await kr(t,c,n,r,i,l,{recoveryReason:o}))}}catch(e){return await Sr({device:t,session:c,command:n,options:r,signal:i,attempt:a,error:e})}}async function Sr(e){let{device:n,session:i,command:a,options:o,signal:s,attempt:c,error:l}=e,u=t(l,`COMMAND_FAILED`);if(r(u))throw await X(i,`prepare_runner_request_canceled`),l;if(c===1&&Mr(u,i))return{kind:`prepared`,result:await Cr({device:n,session:i,command:a,options:o,signal:s,error:u})};if(!wr(u))throw l;let d=u.message||`runner_health_failed`;if(c>=2)throw await X(i,`prepare_runner_health_failed`),l;return D(o.requestId),await I(i,`prepare_runner_health_retry`),b({level:`warn`,phase:`ios_runner_prepare_health_retry`,data:{command:a.command,commandId:a.commandId,sessionId:i.sessionId,attempt:c,maxAttempts:2,reason:d}}),{kind:`retry`,recoveryReason:d}}async function Cr(e){let{device:t,session:n,command:r,options:i,signal:a,error:o}=e,s=o.message||`runner_health_failed`;await I(n,`prepare_cached_runner_health_failed`),await It(n.xctestrunArtifact,s);let c=Date.now(),l=await P(t,{...i,cleanStaleBundles:!0,forceRunnerXctestrunRebuild:!0,...Ar(i,`runner_rebuild`)}),u=Date.now()-c;try{let e=await kr(t,l,r,i,a,u,{recoveryReason:s});return b({level:`info`,phase:`ios_runner_prepare_bad_cache_recovered`,data:{command:r.command,commandId:r.commandId,sessionId:l.sessionId,xctestrunPath:l.xctestrunArtifact?.xctestrunPath,reason:s}}),Fr(t,e)}catch(e){await X(l,`prepare_rebuilt_runner_health_failed`);let n=Nr(e,l,s);throw Ir(t,{cache:l.xctestrunArtifact?.cache,artifact:l.xctestrunArtifact?.artifact,buildMs:l.xctestrunArtifact?.buildMs,connectMs:u,healthCheckMs:0,xctestrunPath:l.xctestrunArtifact?.xctestrunPath,failureReason:n.message}),n}}async function X(e,t){try{await I(e,t)}catch{}}function wr(e){return r(e)?!1:T(e)||Ft(e)}async function Tr(e,n,r){let i={entered:!1};try{return await Er(e,n,r,i)}catch(e){let n=t(e);throw i.entered?jt(n)?a(n,`no`):n:o(n,`no`)}}async function Er(e,i,a,o){D(a.requestId);let s=C(a),c=pr(a,i),l,u=!1,d=F(e.id)?.liveness??`gone`;try{if((d===`gone`||d===`stopped`)&&hr(c)){if(!gr(c))throw vr(i,a);u=!0}l=await P(e,a),bn(l,a.expectedRunnerSessionId),jn(l,i),u&&_r(c),mr(c);let t=st;if(l.state!==`ready`){let{readRunnerStartupTimeoutMs:e}=await import(`./runner-exchange.js`);t=e(l)}return o.entered=!0,await B(e,l,i,a.logPath,t,s)}catch(o){if(a.expectedRunnerSessionId!==void 0)throw o;let c=t(o,`COMMAND_FAILED`);if((l?l.state===`starting`:d!==`ready`)&&r(c))throw l&&!St(a)&&await X(l,`runner_startup_request_canceled`),n({...c.details,readinessPhase:`runner-start`},c);if(Tt(c,i)&&l)return D(a.requestId),await Dr({device:e,session:l,command:i,options:a,signal:s,restartReason:`runner_connect_failed_before_command_send`,firstAttemptDispatched:Et(c)});if(l&&Dt(c))return D(a.requestId),await Dr({device:e,session:l,command:i,options:a,signal:s,restartReason:`runner_readiness_preflight_failed_before_command_send`,recoveredDiagnosticPhase:`ios_runner_readiness_preflight_recovered`,firstAttemptDispatched:`no`});if(l&&T(c)&&!Pt(c))return await Gn({device:e,session:l,command:i,transportError:c,options:a,signal:s,invalidationReason:`transport_error_after_command_send`,invalidateSession:I});throw o}}async function Dr(e){let{device:n,command:r,options:i,signal:a,restartReason:s}=e,c=pr(i,r);if(!gr(c))throw o(vr(r,i),e.firstAttemptDispatched);await I(e.session,s);let l=await P(n,{...i,cleanStaleBundles:!0}).catch(t=>{throw Z(t,e)});_r(c);try{let t=await B(n,l,r,i.logPath,S,a);return e.recoveredDiagnosticPhase&&b({level:`debug`,phase:e.recoveredDiagnosticPhase,data:{command:r.command,commandId:r.commandId,recovery:`session_restarted`,sessionId:l.sessionId}}),t}catch(o){let s=t(o,`COMMAND_FAILED`);if(T(s)&&!Pt(s))try{return await Gn({device:n,session:l,command:r,transportError:s,options:i,signal:a,invalidationReason:`transport_error_after_retry_command_send`,invalidateSession:I})}catch(t){throw Z(t,e,l)}throw Z(o,e,l)}}function Z(e,t,n){return e instanceof i?Or(new i(e.code,e.message,{...e.details??{},runnerRestarted:!0,runnerRestartReason:t.restartReason,runnerRestartCommand:t.command.command,...t.command.commandId?{runnerRestartCommandId:t.command.commandId}:{},runnerInvalidatedSessionId:t.session.sessionId,...n?{runnerRestartSessionId:n.sessionId}:{},...e.details?.logPath===void 0&&t.options.logPath?{logPath:t.options.logPath}:{}},e.cause??e),t.firstAttemptDispatched,n):e}function Or(e,t,n){return!n||t===`unknown`?o(e,t):a(e,jt(e)?`no`:`unknown`)}async function kr(e,t,n,r,i,a,o){let s=Date.now(),c=jr(r.prepareDeadline,r.healthTimeoutMs,`runner_health`);return Pr(await B(e,t,n,r.logPath,c,i),t,a,Date.now()-s,o)}function Ar(e,t){if(!e.prepareDeadline)return{};let n=jr(e.prepareDeadline,e.buildTimeoutMs,t);return{buildTimeoutMs:n,startupTimeoutMs:n}}function jr(e,t,n){if(!e)return t??45e3;let r=Math.floor(e.remainingMs());if(r<=0)throw new i(`COMMAND_FAILED`,`prepare ios-runner timed out`,{phase:n,reason:`prepare_deadline_expired`});return r}function Mr(e,t){let n=t.xctestrunArtifact;return!n||n.cache===`miss`?!1:Ot(e)}function Nr(e,n,r){let a=t(e,`COMMAND_FAILED`);return new i(a.code,`artifact restored but runner did not connect`,{...a.details??{},restoredFailureReason:r,xctestrunPath:n.xctestrunArtifact?.xctestrunPath,artifact:n.xctestrunArtifact?.artifact,cache:n.xctestrunArtifact?.cache,reason:a.message},a)}function Pr(e,t,n,r,i){let a=t.xctestrunArtifact,o={...i?.recoveryReason?{recoveryReason:i.recoveryReason}:{},...i?.failureReason?{failureReason:i.failureReason}:{}};return a?{runner:e,cache:a.cache,artifact:a.artifact,buildMs:a.buildMs,connectMs:Math.max(0,n),healthCheckMs:Math.max(0,r),xctestrunPath:a.xctestrunPath,...o}:{runner:e,connectMs:Math.max(0,n),healthCheckMs:Math.max(0,r),...o}}function Fr(e,t){return Ir(e,t),t}function Ir(e,t){b({level:t.failureReason?`warn`:`info`,phase:`apple_runner_prepare`,data:{platform:e.platform,target:e.target,deviceId:e.id,cache:t.cache,artifact:t.artifact,buildMs:t.buildMs,connectMs:t.connectMs,healthCheckMs:t.healthCheckMs,timingContainment:t.buildMs===void 0?{healthCheckMs:[]}:{connectMs:[`buildMs`],healthCheckMs:[]},xctestrunPath:t.xctestrunPath,recoveryReason:t.recoveryReason,failureReason:t.failureReason}})}const Lr={maxAttempts:8,baseDelayMs:200,maxDelayMs:1e3,jitter:0};function Rr(e){return Nt(e)?8:T(e)?3:1}async function Q(e,t,n={}){Bn(e),D(n.requestId);let r=w(t),i=$(e,n);if(!E(r))return i.runCommand(e,r,n);let a;try{return await Ne(()=>(D(n.requestId),i.runCommand(e,r,n)),{...Lr,shouldRetry:(e,t)=>(D(n.requestId),Nt(e)&&(a=e),t<Rr(e))},{signal:C(n)})}catch(e){throw a&&St(n)?a:e}}async function zr(e,t={}){if(d(e))try{await Q(e,{command:`targetReset`},t)}catch(t){b({level:`warn`,phase:`ios_runner_target_reset_failed`,data:{deviceId:e.id,error:t instanceof Error?t.message:String(t)}}),await z(e.id)}}function Br(e,t={}){if(d(e)){if(Le()){b({level:`debug`,phase:`ios_runner_cache_prewarm_unavailable`,data:{deviceId:e.id}});return}return Hr({device:e,options:t,failurePhase:`ios_runner_cache_prewarm_failed`,task:async t=>{await $t(e,{...t,budget:Ge(t.buildTimeoutMs,t.signal)})}})}}function Vr(e,t={}){if(!d(e))return;let n=$(e,t).prewarm;if(!n){b({level:`debug`,phase:`ios_runner_session_prewarm_unavailable`,data:{deviceId:e.id}});return}return Hr({device:e,options:t,failurePhase:`ios_runner_session_prewarm_failed`,task:async t=>{await n(e,t)}})}function Hr(e){let{device:t,options:n,failurePhase:r,task:i}=e,{propagateError:a=!1,...o}=n;return i(o).catch(e=>{if(b({level:`warn`,phase:r,data:{deviceId:t.id,error:e instanceof Error?e.message:String(e)}}),a)throw e})}async function Ur(e,t){Bn(e),D(t.requestId);let n=w({command:`uptime`}),r=$(e,t);if(r.prepare)return await r.prepare(e,t);let i=Date.now();return{runner:await r.runCommand(e,n,t),connectMs:0,healthCheckMs:Math.max(0,Date.now()-i)}}function $(e,t){return Ae(e,Kr,{requestId:t.requestId})}function Wr(e,t={}){return d(e)?$(e,t).hasLiveSession(e):!1}async function Gr(e,t={}){if(!d(e))return!1;let n=$(e,t).releaseSpeculativeSession;return n?await n(e):!1}const Kr=ke(Tr,{prepare:br,hasLiveSession:e=>F(e.id)?.liveness===`ready`,releaseSpeculativeSession:async e=>await Mn(e.id),prewarm:async(e,t)=>{let{healthCheck:n,...r}=t;if(n===!1){await P(e,{...r,speculative:!0});return}await br(e,{...r,speculative:!0,healthTimeoutMs:st})}});var qr=e({cleanupRunnerLeasesForOwner:()=>Ht,readRunnerSessionLiveness:()=>F});Re(nn);export{Br as a,Q as c,Nn as d,Ln as f,Ur as i,Fn as l,Wr as n,Vr as o,z as p,zr as r,Gr as s,qr as t,F as u};
|
|
1
|
+
import{r as e}from"./rolldown-runtime.js";import{F as t,I as n,K as r,P as i,V as a,z as o}from"./sdk-contracts.js";import{v as s}from"./sdk-batch-runner.js";import{c,r as l}from"./diagnostics.js";import"./diagnostics2.js";import{f as u,h as d}from"./sdk-device.js";import{o as f}from"./sdk-remote-config.js";import{S as p,T as m,h,j as g,m as _,t as v,w as y,y as ee}from"./owner-identity.js";import{h as te,i as ne,m as re,n as ie,o as ae,p as oe,u as se}from"./exec.js";import{n as ce,r as le,t as ue}from"./retry.js";import{a as de,t as fe}from"./file.js";import"./command.js";import"./process.js";import{a as pe,r as me}from"./version.js";import{t as he}from"./ttl-memo.js";import"./retry2.js";import{o as ge}from"./device-shell.js";import{t as _e}from"./keyed-lock.js";import{n as ve,t as ye}from"./boot-diagnostics.js";import{i as be,r as xe}from"./request-cancel.js";import{t as Se}from"./request.js";import{a as Ce,n as we,o as Te,r as Ee}from"./tool-provider.js";import{t as De}from"./physical-device-control.js";import{a as Oe,o as ke}from"./runner.js";import{C as Ae,L as je,M as Me,P as Ne,W as Pe,a as Fe,d as Ie,h as Le,r as Re,t as ze,u as b,v as Be}from"./host.js";import{o as Ve,s as He}from"./apple-runner-platform.js";import{i as Ue,r as We}from"./runner-toolchain-probe.js";import{d as Ge,f as Ke,m as qe,o as Je,t as Ye}from"./runner-cache-metadata.js";import{t as Xe}from"./plist-xml.js";import{n as Ze,t as Qe}from"./runner-owner-state.js";import{n as $e,u as et}from"./simctl.js";import{_ as tt,a as nt,b as rt,c as it,d as at,f as ot,g as st,h as ct,i as lt,l as x,m as ut,n as dt,o as ft,r as pt,s as mt,t as ht,v as gt,y as _t}from"./runner-session-types.js";import{A as vt,D as yt,E as bt,M as S,O as xt,P as C,S as St,_ as Ct,a as w,b as T,f as wt,g as Tt,h as Et,i as Dt,j as Ot,l as kt,n as At,o as jt,u as Mt,v as Nt,w as E}from"./runner-error-classification.js";import{a as Pt,r as Ft,t as It}from"./runner-device-set.js";import{C as Lt,c as Rt,f as zt,h as D,i as Bt,l as Vt,m as Ht,n as Ut,o as Wt,p as Gt,t as Kt}from"./runner-lease.js";import{C as qt,D as Jt,E as Yt,T as Xt,a as Zt,b as Qt,c as $t,d as en,g as tn,i as O,m as nn,n as rn,o as an,p as on,r as sn,t as k,w as cn,x as ln,y as un}from"./runner-disposal.js";import A from"node:fs";import dn from"node:path";const fn={runCmdStreaming:oe,runCmdSync:re,runCmdBackground:se,requireExecSuccess:ae,isCommandTimeoutError:ne,commandDeveloperDir:ie,shellQuote:ge,emitDiagnostic:l,withDiagnosticTimer:c,retryWithPolicy:le,isEnvTruthy:ce,deadlineFromTimeoutMs:(e,t)=>ue.fromTimeoutMs(e,t),isProcessAlive:_,isProcessGroupAlive:h,readProcessStartTime:y,readProcessCommand:p,signalPidsBestEffort:m,signalProcessGroupBestEffort:te,findProjectRoot:me,readVersion:pe,acquireProcessLock:fe,withProcessLock:de,withKeyedLock:_e,publishFileSync:g,classifyOwnerLiveness:v,readHostCpuArchSync:ee,createTtlMemo:he,parseBooleanLiteral:f,isRecord:s,emitRequestProgress:Se,getRequestSignal:xe,isRequestCanceled:be,classifyBootFailure:ve,bootFailureHint:ye,runAppleToolCommand:Ce,runXcrun:Te,readApplePlistJson:Ee,hasScopedAppleToolProvider:we,buildSimctlArgsForDevice:$e,simulatorAddressFor:et,resolveIosPhysicalDeviceControl:De,visitXmlPlistEntries:Xe,leaseOwnerStateDir:Ze,hasDeviceClaimAuthority:e=>Qe()?.(e)??!1};function pn(e=process.env){return Ae(e.AGENT_DEVICE_IOS_RUNNER_DETACH??``)!==!1}async function mn(e,t){if(!pn())return 0;let n=0;for(let[r,i]of e){let e=hn(i);if(!e.detached){b({level:`debug`,phase:`ios_runner_session_detach_skipped`,data:{deviceId:r,sessionId:i.sessionId,lane:e.lane,reason:e.reason,outstandingCharges:i.commandCharges.outstandingChargeCount,hasAbandonedCharges:i.commandCharges.hasAbandonedCharges}});continue}n+=1,t(r,i),b({level:`info`,phase:`ios_runner_session_detached`,data:{deviceId:r,lane:e.lane,sessionId:i.sessionId,runnerPid:i.child.pid,port:i.port,runnerLogPath:i.runnerLogPath}})}return n}function hn(e){let t=He(e.device);if(!t.handoff)return{detached:!1,lane:void 0,reason:t.reason};let n=t.lane,r=mt(e);if(!r.detach)return{detached:!1,lane:n,reason:r.reason};let i=e.lease;if(!i)return{detached:!1,lane:n,reason:`lease_absent`};if(!Zt(e.child.pid))return{detached:!1,lane:n,reason:`runner_process_dead`};try{D(Kt(i))}catch{return{detached:!1,lane:n,reason:`lease_write_failed`}}return e.endOutputObservation?.(),dt(e,`stopped`),{detached:!0,lane:n}}async function gn(e,t){if(!pn())return null;let n=He(e),r=(t,r)=>(b({level:`debug`,phase:`ios_runner_lease_adoption_skipped`,data:{deviceId:e.id,lane:n.handoff?n.lane:void 0,runnerPid:r?.runnerPid,port:r?.port,reason:t}}),null);if(!n.handoff)return r(n.reason);let i=Vt(e.id);if(i.type===`absent`)return r(`lease_absent`);if(i.type===`refused`)return r(i.reason,i.lease);let a=i.lease;if(a.simulatorSetPath!==Ft(e))return r(`simulator_set_mismatch`,a);let o=_n(a,t.expectedRunnerSessionId);if(`refusal`in o)return r(o.refusal,a);let s=vn(e,a,t.budget);if(`refusal`in s)return r(s.refusal,a);let c=o.value,l=s.value,u=await yn(e,a.port,n.lane,t.budget);if(u!==`answered`)return r(u,a);if(!Wt(a,c))return r(`runner_pid_recycled`,a);let d=Sn(e,a,c,l);try{D(d.lease)}catch{return r(`lease_write_failed`,a)}return b({level:`info`,phase:`ios_runner_lease_adopted`,data:{deviceId:e.id,lane:n.lane,sessionId:d.sessionId,runnerPid:c,port:a.port,previousOwnerPid:a.ownerPid}}),d}function _n(e,t){if(t!==void 0&&e.sessionId!==t)return{refusal:`session_identity_mismatch`};let n=e.runnerPid;return n?Be(n)?Gt(e,n)?{value:n}:{refusal:`runner_pid_recycled`}:{refusal:`runner_process_dead`}:{refusal:`runner_pid_missing`}}function vn(e,t,n){let r=xn(e,n);return r?t.cacheKey!==r.cacheKey||!t.xctestrunPath.startsWith(`${r.derived}${dn.sep}`)?{refusal:`artifact_fingerprint_mismatch`}:{value:r}:{refusal:`expected_derived_unresolved`}}async function yn(e,t,n,i){let a=n===`physical_coredevice`?5e3:500,o=bn(i,a);if(o<=0)return`probe_budget_exhausted`;let s=Date.now(),c=!1;try{let n=await ot(e,t,C({command:`uptime`}),o,i?.signal);return c=vt(xt(await n.text())),c?`answered`:`probe_failed`}catch(e){if(r(e))throw e;return`probe_failed`}finally{b({level:`debug`,phase:`ios_runner_lease_adoption_probe`,durationMs:Date.now()-s,data:{deviceId:e.id,port:t,lane:n,budgetCapMs:a,timeoutMs:o,answered:c}})}}function bn(e,t){return e?.deadline?Math.min(t,Math.floor(e.deadline.remainingMs())):t}function xn(e,t){try{let n=Je(e,void 0,t);return{derived:Ke(e,n),cacheKey:Ge(n)}}catch(e){if(r(e))throw e;return null}}function Sn(e,t,n,r){let i=t.sessionId,a={xctestrunPath:t.xctestrunPath,...r,cache:`exact`,artifact:`valid`,buildMs:0,xctestrunPathSource:`manifest`,reason:`adopted_from_lease`},{child:o,wait:s}=Cn(n);return{sessionId:i,device:e,deviceId:e.id,port:t.port,xctestrunPath:t.xctestrunPath,xctestrunArtifact:a,jsonPath:t.jsonPath,testPromise:s,child:o,runnerLogPath:t.runnerLogPath,state:`ready`,commandCharges:new ht,lease:Ut({device:e,sessionId:i,runnerPid:n,port:t.port,xctestrunPath:t.xctestrunPath,cacheKey:r.cacheKey,jsonPath:t.jsonPath,runnerLogPath:t.runnerLogPath})}}function Cn(e){let t={pid:e,exitCode:null};return{child:t,wait:new Promise(n=>{let r=setInterval(()=>{Be(e)||(clearInterval(r),t.exitCode=-1,n({stdout:``,stderr:``,exitCode:-1}))},1e3);r.unref?.()})}}function wn(){let e=new AbortController,t=!1,n=``;return{wake:e.signal,observe:r=>{if(t)return;let i=n+r;if(i.includes(`AGENT_DEVICE_RUNNER_LISTENER_READY`)){t=!0,n=``,e.abort();return}n=i.slice(-33)},finish:()=>{t=!0,n=``,e.abort()}}}function Tn(e){let t=e.logPath;A.mkdirSync(dn.dirname(t),{recursive:!0});let n=A.openSync(t,`a`),r=ut(t,n),i=En(()=>{try{A.closeSync(n)}catch{}}),a=wn();try{let t=Ne(`xcodebuild`,[`test-without-building`,`-only-testing`,`AgentDeviceRunnerUITests/RunnerTests/testCommand`,`-parallel-testing-enabled`,`NO`,`-test-timeouts-enabled`,`NO`,`-collect-test-diagnostics`,`never`,qe(e.device),`1`,`-destination-timeout`,`20`,`-xctestrun`,e.xctestrunPath,`-derivedDataPath`,e.derivedPath,...Pt(e.device,Ve(e.device))],{allowFailure:!0,env:{...process.env,AGENT_DEVICE_RUNNER_PORT:String(e.port)},detached:!0,signal:e.signal,stdio:[`ignore`,n,n],captureOutput:!1}),o=rt({file:r,onOutput:t=>{a.observe(t),(e.traceLogPath||e.verbose)&&tt(t,void 0,e.traceLogPath,e.verbose)}}),s=En(()=>{o.stop(),i()}),c=()=>{o.drain(),i(),a.finish()};return t.wait.then(c,c),{...t,startupRetryWake:a.wake,endOutputObservation:s,readLogTail:e=>gt(r,e)}}catch(e){throw i(),e}}function En(e){let t=!1;return()=>{t||(t=!0,e())}}const j=new Map,Dn=new Map,M=new Map,On=1e4;function N(e,t){return Pe(Dn,e,t)}async function P(e,t){R(e.id);let n=t.startAdmission,r=n??un(e.id),i=N(e.id,async()=>{let{openRunnerStartBudget:n,reserveRunnerStartOwnerInterest:i}=await import(`./runner-start-budget.js`);ln(r),en(e.id,r);let a=n(t),o=i(r,t);try{let n=j.get(e.id);if(n){Mn(n,t.expectedRunnerSessionId);let r=await In(e,n,a.phase);if(r)return r}return await Ht(e.id,async()=>await An(e,t,a,r))}catch(e){throw a.exhausted.aborted?a.exhausted.reason:e}finally{a.close(),o()}}),{raceRunnerStartAgainstCaller:a}=await import(`./runner-start-budget.js`);return await a(n?i:i.finally(()=>tn(r)),r,t.signal)}const kn=1e4;async function An(e,t,r,i){let a={},o=r.phase,s=o.signal,c=tr(t.runnerLeaseContext,e.id);b({level:`debug`,phase:`ios_runner_session_startup`,data:{deviceId:e.id,logicalLeaseContext:c}});let l=await V(a,`adopt_detached_runner`,async()=>await gn(e,{budget:o,expectedRunnerSessionId:t.expectedRunnerSessionId}));if(l)return l.startupTimings=a,l.logicalLeaseContext=c,en(e.id,i),j.set(e.id,l),l;Nn(t.expectedRunnerSessionId),await V(a,`cleanup_stale_xcodebuild`,async()=>{await Rt(e,an,c)}),await V(a,`ensure_booted`,async()=>{await Yn(e)});let u=await V(a,`verify_device_readiness`,async()=>await(await import(`./runner-device-readiness.js`)).preflightIosRunnerDeviceReadiness(e,{budgetMs:Math.min(kn,o.deadline?.remainingMs()??kn),signal:s}));await V(a,`verify_host_dev_tools_security`,async()=>{let{assertDevToolsSecurityForIosRunner:t}=await import(`./runner-dev-tools-security.js`);await t(e)}),t.cleanStaleBundles?await V(a,`cleanup_stale_bundles`,async()=>{await Ln(e)}):(a.cleanup_stale_bundles=0,b({level:`debug`,phase:`ios_runner_startup_cleanup_stale_bundles_skipped`}));let d,f,p,m,h=_t(t.logPath,e.id),g;try{d=await V(a,`ensure_xctestrun`,async()=>await on(e,{...t,startAdmission:i,budget:We(Qn(t,r),s)})),a.build_xctestrun=d.buildMs,f=await V(a,`allocate_port`,async()=>await st()),{xctestrunPath:p,jsonPath:m}=await V(a,`prepare_xctestrun_env`,async()=>await Jt(d.xctestrunPath,{AGENT_DEVICE_RUNNER_PORT:String(f)},Yt({deviceId:e.id,ownerToken:zt(),port:f}),{iosXctestEnvDir:t.iosXctestEnvDir})),d.buildMs>0&&Ie({type:`command`,status:`progress`,message:`Starting XCTest runner...`}),g=await V(a,`launch_xcodebuild`,async()=>(await ct(h).catch(()=>{}),await Tn({device:e,port:f,xctestrunPath:p,derivedPath:d.derived,signal:s,logPath:h,traceLogPath:t.traceLogPath,verbose:t.verbose})))}catch(e){throw Dt(e,u)}let _=pt(e.id,f),v=Ut({device:e,sessionId:_,runnerPid:g.child.pid,port:f,xctestrunPath:p,cacheKey:d.cacheKey,jsonPath:m,runnerLogPath:h}),y={sessionId:_,device:e,deviceId:e.id,port:f,xctestrunPath:p,xctestrunArtifact:d,jsonPath:m,runnerLogPath:h,testPromise:g.wait,child:g.child,endOutputObservation:g.endOutputObservation,readLogTail:g.readLogTail,state:`starting`,commandCharges:new ht,startupRetryWake:g.startupRetryWake,launchDeadline:ze.fromTimeoutMs($n(r)),startupTimings:a,startupDeviceStates:u,logicalLeaseContext:c,lease:v,speculative:t.speculative===!0};if(s?.aborted)throw await O(y,{graceful:!1,waitTimeoutMs:k,leaseLockHeld:!0}),n();await jn(e,y,i);try{D(v)}catch(t){throw await L(e.id,y,{graceful:!1,waitTimeoutMs:k,leaseLockHeld:!0}),t}return j.set(e.id,y),y}async function jn(e,t,n){if(!cn(e.id,n))throw await O(t,{graceful:!1,waitTimeoutMs:k,leaseLockHeld:!0}),Xt(n.retired??`device_teardown`)}function Mn(e,t){if(t!==void 0&&e.sessionId!==t)throw Pn()}function Nn(e){if(e!==void 0)throw Pn()}function Pn(){return new i(`COMMAND_FAILED`,`Apple runner session ownership changed before command dispatch`,{reason:`runner_session_ownership_changed`})}async function Fn(e,t){let n=zn(t);return n===`gone`?(await V({},`stop_stale_session`,async()=>{await L(e.id,t,{graceful:!1,waitTimeoutMs:k})}),!1):n!==`starting`&&n!==`ready`?!1:n===`starting`&&t.launchDeadline?.isExpired()?(b({level:`warn`,phase:`ios_runner_session_invalidated`,data:{deviceId:e.id,sessionId:t.sessionId,reason:`runner_launch_budget_exhausted`}}),await V({},`stop_expired_starting_session`,async()=>{await L(e.id,t,{graceful:!1,waitTimeoutMs:k})}),!1):It(t.device,e)?!0:(await V({},`stop_other_simulator_set_session`,async()=>{await L(e.id,t)}),!1)}async function In(e,t,n){if(!await Fn(e,t))return null;let r=t.xctestrunArtifact;if(r?.cache===`external`)return b({level:`debug`,phase:`ios_runner_session_reuse`,data:{deviceId:e.id,sessionId:t.sessionId,ready:t.state===`ready`,cache:r.cache,logicalLeaseContext:t.logicalLeaseContext}}),t;let i=Je(e,void 0,n),a=Ke(e,i),o=Ge(i);return r?.derived!==a||r.cacheKey!==o?(b({level:`debug`,phase:`ios_runner_session_artifact_stale`,data:{deviceId:e.id,sessionId:t.sessionId,currentDerived:r?.derived,expectedDerived:a,currentCacheKey:r?.cacheKey,expectedCacheKey:o}}),await V({},`stop_stale_artifact_session`,async()=>{await L(e.id,t)}),null):(b({level:`debug`,phase:`ios_runner_session_reuse`,data:{deviceId:e.id,sessionId:t.sessionId,ready:t.state===`ready`,logicalLeaseContext:t.logicalLeaseContext}}),t)}async function Ln(e){e.kind===`simulator`&&await Promise.allSettled(Ye.map(async t=>{await Rn(e,t)}))}async function Rn(e,t){try{await je(Fe(e,[`uninstall`,e.id,t]),{allowFailure:!0,timeoutMs:On})}catch(n){b({level:`warn`,phase:`ios_runner_startup_cleanup_stale_bundle_failed`,data:{deviceId:e.id,bundleId:t,timeoutMs:On,error:n instanceof Error?n.message:String(n)}})}}function F(e){let t=j.get(e);return t?{sessionId:t.sessionId,liveness:zn(t)}:null}function zn(e){return it({state:e.state,processRunning:Zt(e.child.pid)})}async function I(e,t){await N(e.deviceId,async()=>{j.get(e.deviceId)===e&<(e)&&(b({level:`warn`,phase:`ios_runner_session_invalidated`,data:{deviceId:e.deviceId,sessionId:e.sessionId,reason:t}}),await L(e.deviceId,e,{graceful:!1,waitTimeoutMs:k}))})}async function L(e,t,n={}){let r=t??j.get(e);r&<(r)&&(await O(r,n),j.get(e)===r&&j.delete(e))}function Bn(e){R(e);let t=Vn();if(t<=0||!j.has(e))return;let n=setTimeout(()=>{M.delete(e),b({level:`info`,phase:`ios_runner_idle_stop`,data:{deviceId:e,idleMs:t}}),z(e).catch(t=>{b({level:`warn`,phase:`ios_runner_idle_stop_failed`,data:{deviceId:e,error:t instanceof Error?t.message:String(t)}})})},t);n.unref?.(),M.set(e,n),b({level:`debug`,phase:`ios_runner_idle_stop_scheduled`,data:{deviceId:e,idleMs:t}})}function R(e){let t=M.get(e);t&&(clearTimeout(t),M.delete(e))}function Vn(e=process.env){let t=e.AGENT_DEVICE_IOS_RUNNER_IDLE_STOP_MS?.trim();if(t){let e=Number(t);if(Number.isFinite(e)&&e>=0)return Math.floor(e)}return 3e5}function Hn(e,t){e.speculative&&!St(t)&&(e.speculative=!1)}async function Un(e){return await N(e,async()=>{let t=j.get(e);return t?.speculative?(b({level:`debug`,phase:`ios_runner_speculative_released`,data:{deviceId:e,sessionId:t.sessionId,ready:t.state===`ready`}}),await z(e),!0):!1})}async function z(e){await Wn(e)}async function Wn(e,t){R(e);try{await N(e,async()=>{await Ht(e,async()=>{await L(e,void 0,{leaseLockHeld:!0}),await sn(e)}),t?.()})}finally{t?.()}}async function Gn(e,t){let n=j.get(e);if(t.retain&&!nt(n)){Bn(e);return}t.retain&&b({level:`info`,phase:`ios_runner_retain_skipped_busy`,data:{deviceId:e}});let r=nn(e);try{await $t(e),await Wn(e,r)}finally{r()}}async function Kn(){let e=Array.from(j.values()),t=qt(e.map(e=>e.deviceId));try{await rn(e);for(let t of e)j.get(t.deviceId)===t&&j.delete(t.deviceId)}finally{t()}}async function qn(){return await mn(j,e=>{j.delete(e),R(e)})}async function Jn(){let e=qt(j.keys());try{await Kn();let e=Array.from(j.keys());await Promise.allSettled(e.map(async e=>{await z(e)})),await $t()}finally{e()}}function Yn(e){return e.kind===`simulator`?e.booted?(b({level:`debug`,phase:`ios_runner_startup_ensure_booted_skipped`,data:{deviceId:e.id}}),Promise.resolve()):Xn(e):Promise.resolve()}async function Xn(e){await je(Fe(e,[`bootstatus`,e.id,`-b`]),{timeoutMs:x})}function Zn(e){if(!u(e.platform))throw new i(`UNSUPPORTED_PLATFORM`,`Unsupported platform for iOS runner: ${e.platform}`);if(e.kind!==`simulator`&&e.kind!==`device`)throw new i(`UNSUPPORTED_OPERATION`,`Unsupported iOS device kind for runner: ${e.kind}`)}async function B(e,t,n,r,i,a){er(t,n.command);let{executeRunnerExchange:o}=await import(`./runner-exchange.js`);return o(e,t,n,r,i,e=>I(t,e),a)}function Qn(e,t){let n=Ue(t.phase,`runner_xctestrun_build`)??t.timeoutMs,r=ft(e.buildTimeoutMs);return r===void 0?n:Math.min(r,n)}function $n(e){let t=Math.floor(e.phase.deadline?.remainingMs()??e.timeoutMs);return e.explicit?t:Math.min(x,t)}async function V(e,t,n){let r=Date.now();try{return await n()}finally{let n=Date.now()-r;e[t]=n,b({level:`debug`,phase:`ios_runner_startup_${t}`,durationMs:n})}}function er(e,t){if(e.startupTimingsReported||!e.startupTimings)return;e.startupTimingsReported=!0;let n=Object.values(e.startupTimings).reduce((e,t)=>e+t,0);b({level:`info`,phase:`ios_runner_session_startup_timings`,durationMs:n,data:{command:t,sessionId:e.sessionId,ready:e.state===`ready`,logicalLeaseContext:e.logicalLeaseContext,timings:e.startupTimings}})}function tr(e,t){if(!e)return;let n={leaseId:H(e.leaseId),clientId:H(e.clientId),tenantId:H(e.tenantId),runId:H(e.runId),leaseProvider:H(e.leaseProvider),deviceKey:H(e.deviceKey)??t},r=Object.entries(n).filter(([,e])=>e!==void 0);return r.length>0?Object.fromEntries(r):void 0}function H(e){return typeof e==`string`&&e.trim().length>0?e.trim():void 0}async function nr(e){let{device:t,session:n,command:r,transportError:i,options:a,signal:o,invalidationReason:s}=e;return await rr(await lr(t,n,r,i,a,o),{command:r,session:n,transportError:i,options:a,invalidationReason:s,invalidateSession:e.invalidateSession})}async function rr(e,t){if(e.type===`recovered`)return or(e,t);let n=ir(e,t);if(e.type===`skipInvalidation`)throw sr(e,t,n);return await cr(e,t,n)}function ir(e,t){return`runnerAnswer`in e?o(e.runnerAnswer,e.dispatched):T(t.command)?o(t.transportError,`unknown`):o(ar(t,e.lostReply),`unknown`)}function ar(e,t){let{command:n,transportError:r,options:a}=e,o=r.details?.reason,s=r.details?.hint;return new i(`COMMAND_FAILED`,`cause`in t?Cr(n.command,t.cause):t.message,{command:n.command,commandId:n.commandId,...t.lifecycleState===void 0?{}:{lifecycleState:t.lifecycleState},reason:At,...o===void 0?{}:{transportReason:o},recovery:t.recovery,...W(r),hint:typeof s==`string`?s:t.hint,logPath:a.logPath??r.details?.logPath,transportError:r.message},r)}function or(e,t){return K({command:t.command,session:t.session,transportError:t.transportError,decision:`skipped`,reason:e.reason,lifecycleState:e.lifecycleState}),e.data}function sr(e,t,n){return K({command:t.command,session:t.session,transportError:t.transportError,decision:`skipped`,reason:e.reason,lifecycleState:e.lifecycleState}),n}async function cr(e,t,n){throw K({command:t.command,session:t.session,transportError:t.transportError,decision:`retained`,reason:e.reason,lifecycleState:e.lifecycleState}),await t.invalidateSession(t.session,t.invalidationReason),n}async function lr(e,t,n,r,i,a){if(n.command===`status`||!n.commandId?.trim())return{type:`retainInvalidation`,reason:`status_recovery_unavailable`,lostReply:{recovery:`status_recovery_unavailable`,cause:`status recovery was unavailable`,hint:G(n.command)}};let o=W(r),s;try{s=await B(e,t,{command:`status`,statusCommandId:n.commandId},i.logPath,3e3,a)}catch(e){return b({level:`debug`,phase:`ios_runner_command_status_recovery_failed`,data:{command:n.command,commandId:n.commandId,error:e instanceof Error?e.message:String(e),...o}}),{type:`retainInvalidation`,reason:`status_probe_failed`,lostReply:{recovery:`status_probe_failed`,cause:`the status probe failed`,hint:G(n.command)}}}let c=typeof s.lifecycleState==`string`?s.lifecycleState:``,l=fr(t,n,c);return b({level:`debug`,phase:`ios_runner_command_status_recovery`,data:{command:n.command,commandId:n.commandId,lifecycleState:c,...o,...l===void 0?{}:{abandonedChargeSettled:l}}}),pr(s,c,n,r,i)}const ur=new Set([`completed`,`failed`]),dr=new Set([`accepted`,`started`]);function fr(e,t,n){if(ur.has(n))return e.commandCharges.settleTerminalEvidence(t.commandId)}function pr(e,t,n,r,i){if(t===`completed`)return mr(e,n,r);if(t===`failed`){let a=yt(typeof e.lifecycleErrorCode==`string`?e.lifecycleErrorCode:void 0);return{type:`skipInvalidation`,reason:`runner_reported_failure`,lifecycleState:t,dispatched:a.details.dispatched,runnerAnswer:hr(e,a,n,r,i)}}return dr.has(t)?{type:`skipInvalidation`,reason:`command_still_in_flight`,lifecycleState:t,lostReply:{recovery:`command_still_in_flight`,lifecycleState:t,message:`Runner command "${n.command}" is still ${t} after the transport response was lost.`,hint:yr(n.command,t,W(r))}}:{type:`retainInvalidation`,reason:t?`unknown_lifecycle_state`:`missing_lifecycle_state`,lifecycleState:t,lostReply:{recovery:`lifecycle_state_not_recoverable`,lifecycleState:t,cause:`lifecycle status was ${t?`"${t}"`:`missing`}`,hint:G(n.command)}}}function mr(e,t,n){let r=gr(e.lifecycleResponseJson);return r?{type:`recovered`,data:r,reason:`completed_with_retained_response`,lifecycleState:`completed`}:{type:`skipInvalidation`,reason:T(t)?`read_only_completed_without_retained_response`:`completed_without_retained_response`,lifecycleState:`completed`,lostReply:{recovery:`completed_without_retained_response`,lifecycleState:`completed`,message:`Runner command "${t.command}" completed after the transport response was lost, but no recoverable response was retained.`,hint:_r(t.command,W(n))}}}function hr(e,t,n,r,a){let o=typeof e.lifecycleErrorMessage==`string`?e.lifecycleErrorMessage:`Runner command failed`,s=typeof e.lifecycleErrorHint==`string`?e.lifecycleErrorHint:void 0,c=W(r);return new i(t.code,o,{command:n.command,commandId:n.commandId,lifecycleState:`failed`,recovery:`runner_reported_failure`,...t.details,...c,hint:s??vr(n.command,c),logPath:a.logPath,transportError:r.message},r)}function gr(e){if(typeof e!=`string`||e.trim().length===0)return;let t;try{t=xt(e)}catch{return}return vt(t)?Ot(t):void 0}function _r(e,t){return`${U(t)}The runner is still reachable and reports "${e}" already completed, so agent-device kept the session open and will not replay it. Run snapshot -i to inspect the current UI, then continue from that observed state.`}function vr(e,t){return`${U(t)}The runner is still reachable and reports "${e}" failed after the transport response was lost, so agent-device kept the session open and did not replay it. Run snapshot -i to inspect the current UI and retry with a selector visible in that snapshot.`}function yr(e,t,n){return`${U(n)}The runner is still reachable and reports "${e}" is ${t}, so agent-device kept the session open and will not replay it. Wait briefly, run snapshot -i to inspect the current UI, then continue from that observed state.`}function U(e){return e.readinessPreflightSkipped===!0?`This hot command skipped the uptime preflight because the runner had just completed a healthy interaction; status recovery confirmed the runner still observed it. `:``}function br(e,t){let n=e.details?.[t];return typeof n==`boolean`?n:void 0}function xr(e,t){let n=e.details?.[t];return typeof n==`string`?n:void 0}function Sr(e,t){let n=e.details?.[t];return typeof n==`number`?n:void 0}function W(e){let t={},n=br(e,`runnerReadinessPreflightSkipped`);n!==void 0&&(t.readinessPreflightSkipped=n);let r=xr(e,`runnerReadinessPreflightSkipReason`);r!==void 0&&(t.readinessPreflightSkipReason=r);let i=Sr(e,`runnerReadinessPreflightSkippedAgeMs`);return i!==void 0&&(t.readinessPreflightSkippedAgeMs=i),t}function Cr(e,t){return`Runner command "${e}" lost its transport response and ${t}, so agent-device invalidated the runner session instead of replaying the command.`}function G(e){return`The runner did not confirm that "${e}" reached a safe terminal state, so agent-device kept the conservative invalidation path. Run snapshot -i before retrying if the UI may have changed.`}function K(e){let{command:t,session:n,transportError:r,decision:i,reason:a,lifecycleState:o}=e;b({level:i===`retained`?`warn`:`debug`,phase:`ios_runner_command_invalidation_decision`,data:{command:t.command,commandId:t.commandId,decision:i,reason:a,lifecycleState:o,runnerReachable:o!==void 0,sessionId:n.sessionId,transportError:r.message}})}const q=new Map;function wr(e,t){let n=e.requestId?.trim();if(n)return`request:${n}`;let r=t.commandId?.trim();if(r)return`command:${r}`}function Tr(e){if(!e)return;let t=Y(e);t.touchedSession=!0,X(e,t)}function Er(e){return e?q.get(e)?.touchedSession===!0:!1}function Dr(e){if(!e)return!0;let t=Y(e);return t.recycles>=1?(X(e,t),!1):(X(e,t),!0)}function Or(e){if(!e)return;let t=Y(e);t.recycles+=1,X(e,t)}function J(e,t){return b({level:`warn`,phase:`ios_runner_recycle_budget_exhausted`,data:{command:e.command,commandId:e.commandId,requestId:t.requestId,maxRecycles:1}}),o(new i(`COMMAND_FAILED`,`iOS runner was already restarted during this request and "${e.command}" still failed, so agent-device stopped instead of paying for another runner boot.`,{command:e.command,commandId:e.commandId,recovery:`runner_recycle_budget_exhausted`,hint:"Check the runner log for the underlying failure before retrying — a provisioning or code-signing error there means the runner cannot install on this device, and no retry will help. If the runner is healthy, the current screen is likely too heavy or animating for accessibility capture: the app session is preserved, so run `screenshot` for visual truth and interact by coordinates, or navigate to another screen.",logPath:t.logPath}),`no`)}function Y(e){return kr(),q.get(e)??{touchedSession:!1,recycles:0,lastAtMs:Date.now()}}function X(e,t){t.lastAtMs=Date.now(),q.delete(e),q.set(e,t)}function kr(){let e=Date.now()-6e5;for(let[t,n]of q)n.lastAtMs<e&&q.delete(t);for(;q.size>512;){let e=q.keys().next().value;if(e===void 0)break;q.delete(e)}}async function Ar(e,t){E(t.requestId);let n=S(t),r=C({command:`uptime`}),a=Qt(e.id),o;try{for(let i=1;i<=2;i+=1){let s=await jr({device:e,command:r,options:{...t,startAdmission:a},signal:n,attempt:i,recoveryReason:o});if(s.kind===`prepared`)return s.result;o=s.recoveryReason}}finally{tn(a)}throw new i(`COMMAND_FAILED`,`iOS runner prepare failed`)}async function jr(e){let{device:t,command:n,options:r,signal:i,attempt:a,recoveryReason:o}=e,s=Date.now(),c=await P(t,{...r,cleanStaleBundles:a>1||r.cleanStaleBundles,...Br(r,`runner_session`)}),l=Date.now()-s;try{return{kind:`prepared`,result:Gr(t,await zr(t,c,n,r,i,l,{recoveryReason:o}))}}catch(e){return await Mr({device:t,session:c,command:n,options:r,signal:i,attempt:a,error:e})}}async function Mr(e){let{device:n,session:i,command:a,options:o,signal:s,attempt:c,error:l}=e,u=t(l,`COMMAND_FAILED`);if(r(u))throw await Z(i,`prepare_runner_request_canceled`),l;if(c===1&&Hr(u,i))return{kind:`prepared`,result:await Nr({device:n,session:i,command:a,options:o,signal:s,error:u})};if(!Pr(u))throw l;let d=u.message||`runner_health_failed`;if(c>=2)throw await Z(i,`prepare_runner_health_failed`),l;return E(o.requestId),await I(i,`prepare_runner_health_retry`),b({level:`warn`,phase:`ios_runner_prepare_health_retry`,data:{command:a.command,commandId:a.commandId,sessionId:i.sessionId,attempt:c,maxAttempts:2,reason:d}}),{kind:`retry`,recoveryReason:d}}async function Nr(e){let{device:t,session:n,command:r,options:i,signal:a,error:o}=e,s=o.message||`runner_health_failed`;await I(n,`prepare_cached_runner_health_failed`),await Lt(n.xctestrunArtifact,s);let c=Date.now(),l=await P(t,{...i,cleanStaleBundles:!0,forceRunnerXctestrunRebuild:!0,...Br(i,`runner_rebuild`)}),u=Date.now()-c;try{let e=await zr(t,l,r,i,a,u,{recoveryReason:s});return b({level:`info`,phase:`ios_runner_prepare_bad_cache_recovered`,data:{command:r.command,commandId:r.commandId,sessionId:l.sessionId,xctestrunPath:l.xctestrunArtifact?.xctestrunPath,reason:s}}),Gr(t,e)}catch(e){await Z(l,`prepare_rebuilt_runner_health_failed`);let n=Ur(e,l,s);throw Kr(t,{cache:l.xctestrunArtifact?.cache,artifact:l.xctestrunArtifact?.artifact,buildMs:l.xctestrunArtifact?.buildMs,connectMs:u,healthCheckMs:0,xctestrunPath:l.xctestrunArtifact?.xctestrunPath,failureReason:n.message}),n}}async function Z(e,t){try{await I(e,t)}catch{}}function Pr(e){return r(e)?!1:w(e)||Nt(e)}async function Fr(e,n,r){let i={entered:!1};try{return await Ir(e,n,r,i)}catch(e){let n=t(e);throw i.entered?kt(n)?a(n,`no`):n:o(n,`no`)}}async function Ir(e,i,a,o){E(a.requestId);let s=S(a),c=wr(a,i),l,u=!1,d=F(e.id)?.liveness??`gone`;try{if((d===`gone`||d===`stopped`)&&Er(c)){if(!Dr(c))throw J(i,a);u=!0}l=await P(e,a),Mn(l,a.expectedRunnerSessionId),Hn(l,i),u&&Or(c),Tr(c);let t=at;if(l.state!==`ready`){let{readRunnerStartupTimeoutMs:e}=await import(`./runner-exchange.js`);t=e(l)}return o.entered=!0,await B(e,l,i,a.logPath,t,s)}catch(o){if(a.expectedRunnerSessionId!==void 0)throw o;let c=t(o,`COMMAND_FAILED`);if((l?l.state===`starting`:d!==`ready`)&&r(c))throw l&&!bt(a)&&await Z(l,`runner_startup_request_canceled`),n({...c.details,readinessPhase:`runner-start`},c);if(Ct(c,i)&&l)return E(a.requestId),await Lr({device:e,session:l,command:i,options:a,signal:s,restartReason:`runner_connect_failed_before_command_send`,firstAttemptDispatched:wt(c)});if(l&&Tt(c))return E(a.requestId),await Lr({device:e,session:l,command:i,options:a,signal:s,restartReason:`runner_readiness_preflight_failed_before_command_send`,recoveredDiagnosticPhase:`ios_runner_readiness_preflight_recovered`,firstAttemptDispatched:`no`});if(l&&w(c)&&!Mt(c))return await nr({device:e,session:l,command:i,transportError:c,options:a,signal:s,invalidationReason:`transport_error_after_command_send`,invalidateSession:I});throw o}}async function Lr(e){let{device:n,command:r,options:i,signal:a,restartReason:s}=e,c=wr(i,r);if(!Dr(c))throw o(J(r,i),e.firstAttemptDispatched);await I(e.session,s);let l=await P(n,{...i,cleanStaleBundles:!0}).catch(t=>{throw Q(t,e)});Or(c);try{let t=await B(n,l,r,i.logPath,x,a);return e.recoveredDiagnosticPhase&&b({level:`debug`,phase:e.recoveredDiagnosticPhase,data:{command:r.command,commandId:r.commandId,recovery:`session_restarted`,sessionId:l.sessionId}}),t}catch(o){let s=t(o,`COMMAND_FAILED`);if(w(s)&&!Mt(s))try{return await nr({device:n,session:l,command:r,transportError:s,options:i,signal:a,invalidationReason:`transport_error_after_retry_command_send`,invalidateSession:I})}catch(t){throw Q(t,e,l)}throw Q(o,e,l)}}function Q(e,t,n){return e instanceof i?Rr(new i(e.code,e.message,{...e.details??{},runnerRestarted:!0,runnerRestartReason:t.restartReason,runnerRestartCommand:t.command.command,...t.command.commandId?{runnerRestartCommandId:t.command.commandId}:{},runnerInvalidatedSessionId:t.session.sessionId,...n?{runnerRestartSessionId:n.sessionId}:{},...e.details?.logPath===void 0&&t.options.logPath?{logPath:t.options.logPath}:{}},e.cause??e),t.firstAttemptDispatched,n):e}function Rr(e,t,n){return!n||t===`unknown`?o(e,t):a(e,kt(e)?`no`:`unknown`)}async function zr(e,t,n,r,i,a,o){let s=Date.now(),c=Vr(r.prepareDeadline,r.healthTimeoutMs,`runner_health`);return Wr(await B(e,t,n,r.logPath,c,i),t,a,Date.now()-s,o)}function Br(e,t){if(!e.prepareDeadline)return{};let n=Vr(e.prepareDeadline,e.buildTimeoutMs,t);return{buildTimeoutMs:n,startupTimeoutMs:n}}function Vr(e,t,n){if(!e)return t??45e3;let r=Math.floor(e.remainingMs());if(r<=0)throw new i(`COMMAND_FAILED`,`prepare ios-runner timed out`,{phase:n,reason:`prepare_deadline_expired`});return r}function Hr(e,t){let n=t.xctestrunArtifact;return!n||n.cache===`miss`?!1:Et(e)}function Ur(e,n,r){let a=t(e,`COMMAND_FAILED`);return new i(a.code,`artifact restored but runner did not connect`,{...a.details??{},restoredFailureReason:r,xctestrunPath:n.xctestrunArtifact?.xctestrunPath,artifact:n.xctestrunArtifact?.artifact,cache:n.xctestrunArtifact?.cache,reason:a.message},a)}function Wr(e,t,n,r,i){let a=t.xctestrunArtifact,o={...i?.recoveryReason?{recoveryReason:i.recoveryReason}:{},...i?.failureReason?{failureReason:i.failureReason}:{}};return a?{runner:e,cache:a.cache,artifact:a.artifact,buildMs:a.buildMs,connectMs:Math.max(0,n),healthCheckMs:Math.max(0,r),xctestrunPath:a.xctestrunPath,...o}:{runner:e,connectMs:Math.max(0,n),healthCheckMs:Math.max(0,r),...o}}function Gr(e,t){return Kr(e,t),t}function Kr(e,t){b({level:t.failureReason?`warn`:`info`,phase:`apple_runner_prepare`,data:{platform:e.platform,target:e.target,deviceId:e.id,cache:t.cache,artifact:t.artifact,buildMs:t.buildMs,connectMs:t.connectMs,healthCheckMs:t.healthCheckMs,timingContainment:t.buildMs===void 0?{healthCheckMs:[]}:{connectMs:[`buildMs`],healthCheckMs:[]},xctestrunPath:t.xctestrunPath,recoveryReason:t.recoveryReason,failureReason:t.failureReason}})}const qr={maxAttempts:8,baseDelayMs:200,maxDelayMs:1e3,jitter:0};function Jr(e){return jt(e)?8:w(e)?3:1}async function Yr(e,t,n={}){Zn(e),E(n.requestId);let r=C(t),i=$(e,n);if(!T(r))return i.runCommand(e,r,n);let a;try{return await Me(()=>(E(n.requestId),i.runCommand(e,r,n)),{...qr,shouldRetry:(e,t)=>(E(n.requestId),jt(e)&&(a=e),t<Jr(e))},{signal:S(n)})}catch(e){throw a&&bt(n)?a:e}}async function Xr(e,t={}){if(d(e))try{await Yr(e,{command:`targetReset`},t)}catch(t){b({level:`warn`,phase:`ios_runner_target_reset_failed`,data:{deviceId:e.id,error:t instanceof Error?t.message:String(t)}}),await z(e.id)}}function Zr(e,t={}){if(d(e)){if(Le()){b({level:`debug`,phase:`ios_runner_cache_prewarm_unavailable`,data:{deviceId:e.id}});return}return $r({device:e,options:t,failurePhase:`ios_runner_cache_prewarm_failed`,task:async t=>{await on(e,{...t,budget:We(t.buildTimeoutMs,t.signal)})}})}}function Qr(e,t={}){if(!d(e))return;let n=$(e,t).prewarm;if(!n){b({level:`debug`,phase:`ios_runner_session_prewarm_unavailable`,data:{deviceId:e.id}});return}return $r({device:e,options:t,failurePhase:`ios_runner_session_prewarm_failed`,task:async t=>{await n(e,t)}})}function $r(e){let{device:t,options:n,failurePhase:r,task:i}=e,{propagateError:a=!1,...o}=n;return i(o).catch(e=>{if(b({level:`warn`,phase:r,data:{deviceId:t.id,error:e instanceof Error?e.message:String(e)}}),a)throw e})}async function ei(e,t){Zn(e),E(t.requestId);let n=C({command:`uptime`}),r=$(e,t);if(r.prepare)return await r.prepare(e,t);let i=Date.now();return{runner:await r.runCommand(e,n,t),connectMs:0,healthCheckMs:Math.max(0,Date.now()-i)}}function $(e,t){return ke(e,ri,{requestId:t.requestId})}function ti(e,t={}){return d(e)?$(e,t).hasLiveSession(e):!1}async function ni(e,t={}){if(!d(e))return!1;let n=$(e,t).releaseSpeculativeSession;return n?await n(e):!1}const ri=Oe(Fr,{prepare:Ar,hasLiveSession:e=>F(e.id)?.liveness===`ready`,releaseSpeculativeSession:async e=>await Un(e.id),prewarm:async(e,t)=>{let{healthCheck:n,...r}=t;if(n===!1){await P(e,{...r,speculative:!0});return}await Ar(e,{...r,speculative:!0,healthTimeoutMs:at})}});var ii=e({cleanupRunnerLeasesForOwner:()=>Bt,readRunnerSessionLiveness:()=>F});Re(fn);export{Zr as a,Yr as c,Gn as d,Jn as f,ei as i,qn as l,ti as n,Qr as o,z as p,Xr as r,ni as s,ii as t,F as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{P as e}from"./sdk-contracts.js";import{
|
|
1
|
+
import{P as e}from"./sdk-contracts.js";import{h as t}from"./sdk-device.js";import{N as n}from"./host.js";import{r}from"./runner-error-classification.js";const i=`Developer mode is disabled for Apple development tools`;async function a(e){if(!t(e)||e.kind!==`device`)return;let r=await n(`DevToolsSecurity`,[`-status`],{allowFailure:!0,timeoutMs:2e3}),i=`${r.stdout}\n${r.stderr}`;if(/developer mode is currently disabled/i.test(i))throw o(i.trim())}function o(t){let n=new e(`COMMAND_FAILED`,i,{devToolsSecurityStatus:t}),{reason:a,hint:o}=r(n);return new e(`COMMAND_FAILED`,i,{reason:a,hint:o,devToolsSecurityStatus:t})}export{a as assertDevToolsSecurityForIosRunner};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{P as e}from"./sdk-contracts.js";import{
|
|
1
|
+
import{P as e}from"./sdk-contracts.js";import{h as t}from"./sdk-device.js";import{j as n}from"./host.js";import"./runner-error-classification.js";async function r(r,a){if(!t(r)||r.kind!==`device`)return;let o=await n(r).readDeviceReadiness(r,a.budgetMs,a.signal);if(a.signal?.throwIfAborted(),!o.available)return;let s=i(o);if(s)throw new e(`COMMAND_FAILED`,s.message,{reason:s.reason,hint:s.hint,deviceId:r.id,developerMode:o.developerMode,developerDiskImage:o.developerDiskImage});return{developerMode:o.developerMode,developerDiskImage:o.developerDiskImage,developerDiskImageHint:o.remedies.developerDiskImageUnavailable}}function i(e){if(e.developerMode===`disabled`)return{reason:`device_developer_mode_disabled`,message:`The iOS device reports that Developer Mode is turned off`,hint:e.remedies.developerModeOff}}export{r as preflightIosRunnerDeviceReadiness};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{V as e}from"./host.js";import{t}from"./runner-toolchain-probe.js";function n(t){return e(t).simulatorSetPath}function r(t,n){let r=e(t),i=e(n);return r.udid===i.udid&&r.simulatorSetPath===i.simulatorSetPath}function i(e,t){let r=n(e);return r===void 0?[`-destination`,t]:[`-destination`,t,`-DVTSimulatorSetLocation=${r}`]}function a(e){let r=n(e);if(r===void 0)return{};let i=t(e);return i===void 0?{simulatorSetPath:r}:{simulatorSetPath:r,xcodeVersion:i}}function o(e,t,n){return`${e}: xcodebuild found no simulator ${t.id} in simulator set ${n.simulatorSetPath}${n.xcodeVersion===void 0?``:` with Xcode ${n.xcodeVersion}`}`}export{i as a,o as i,a as n,n as r,r as t};
|