agent-device 0.21.23 → 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.23.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.23.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.23.apk → 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.23.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-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-types.d.ts +7 -5
- package/dist/src/cloud-artifacts.d.ts +3 -2
- 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.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/human-control.js +1 -1
- package/dist/src/ime-rebind.js +1 -1
- package/dist/src/ime-settings-record.js +1 -0
- package/dist/src/ime-state.js +1 -1
- 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/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-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/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/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-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-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/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/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 +20 -29
- 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 +15 -10
- package/server.json +2 -2
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.23.apk.sha256 +0 -1
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.23.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/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{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{a as ce,t as le}from"./file.js";import"./command.js";import"./process.js";import{a as ue,r as de}from"./version.js";import{t as fe}from"./ttl-memo.js";import{i as pe,n as me,r as he}from"./retry.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{c as Ue,g as We,h as Ge,i as Ke,l as qe,m 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{l as $e,n as et}from"./simctl.js";import{C as tt,S as nt,T as rt,_ as it,a as at,b as ot,c as st,d as ct,f as lt,h as ut,i as dt,l as x,n as ft,o as pt,p as mt,r as ht,s as gt,t as _t,w as vt,x as yt,y as bt}from"./runner-session-types.js";import{A as xt,D as St,E as Ct,M as S,O as wt,P as C,S as Tt,_ as Et,a as w,b as T,f as Dt,g as Ot,h as kt,i as At,j as jt,l as Mt,n as Nt,o as Pt,u as Ft,v as It,w as E}from"./runner-error-classification.js";import{A as Lt,D as Rt,F as zt,I as Bt,L as Vt,M as Ht,P as Ut,R as Wt,S as Gt,T as Kt,V as qt,_ as Jt,a as Yt,b as D,c as Xt,d as Zt,f as Qt,h as $t,i as O,j as en,m as tn,n as nn,o as rn,p as an,r as on,t as k,u as sn,v as cn,w 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:pe,isEnvTruthy:he,deadlineFromTimeoutMs:(e,t)=>me.fromTimeoutMs(e,t),isProcessAlive:_,isProcessGroupAlive:h,readProcessStartTime:y,readProcessCommand:p,signalPidsBestEffort:m,signalProcessGroupBestEffort:te,findProjectRoot:de,readVersion:ue,acquireProcessLock:le,withProcessLock:ce,withKeyedLock:_e,publishFileSync:g,classifyOwnerLiveness:v,readHostCpuArchSync:ee,createTtlMemo:fe,parseBooleanLiteral:f,isRecord:s,emitRequestProgress:Se,getRequestSignal:xe,isRequestCanceled:be,classifyBootFailure:ve,bootFailureHint:ye,runAppleToolCommand:Ce,runXcrun:Te,readApplePlistJson:Ee,hasScopedAppleToolProvider:we,buildSimctlArgsForDevice:et,simulatorAddressFor:$e,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=gt(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(!Yt(e.child.pid))return{detached:!1,lane:n,reason:`runner_process_dead`};try{D(sn(i))}catch{return{detached:!1,lane:n,reason:`lease_write_failed`}}return e.endOutputObservation?.(),ft(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=$t(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!==ut(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(!an(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)?cn(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 lt(e,t,C({command:`uptime`}),o,i?.signal);return c=xt(wt(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=qe(e,void 0,t);return{derived:Ge(e,n),cacheKey:Je(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 _t,lease:Zt({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=bt(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`,We(e.device),`1`,`-destination-timeout`,`20`,`-xctestrun`,e.xctestrunPath,`-derivedDataPath`,e.derivedPath,...it(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)&&nt(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=>tt(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??Lt(e.id),i=N(e.id,async()=>{let{openRunnerStartBudget:n,reserveRunnerStartOwnerInterest:i}=await import(`./runner-start-budget.js`);Ht(r),Gt(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 un(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(()=>Rt(r)),r,t.signal)}const kn=1e4;async function An(e,t,r,i){let a={},o=r.phase,s=o.signal,c=nr(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,Gt(e.id,i),j.set(e.id,l),l;Nn(t.expectedRunnerSessionId),await V(a,`cleanup_stale_xcodebuild`,async()=>{await tn(e,rn,c)}),await V(a,`ensure_booted`,async()=>{await Xn(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=vt(t.logPath,e.id),g;try{d=await V(a,`ensure_xctestrun`,async()=>await ln(e,{...t,startAdmission:i,budget:Ke($n(t,r),s)})),a.build_xctestrun=d.buildMs,f=await V(a,`allocate_port`,async()=>await yt()),{xctestrunPath:p,jsonPath:m}=await V(a,`prepare_xctestrun_env`,async()=>await Wt(d.xctestrunPath,{AGENT_DEVICE_RUNNER_PORT:String(f)},Vt({deviceId:e.id,ownerToken:Jt(),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 ot(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 At(e,u)}let _=ht(e.id,f),v=Zt({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 _t,startupRetryWake:g.startupRetryWake,launchDeadline:ze.fromTimeoutMs(er(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(!zt(e.id,n))throw await O(t,{graceful:!1,waitTimeoutMs:k,leaseLockHeld:!0}),Bt(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=Bn(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):mt(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=qe(e,void 0,n),a=Ge(e,i),o=Je(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=>{let n=await Rn(e,t);!n||zn(n)}))}async function Rn(e,t){try{return 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)}});return}}function zn(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:Bn(t)}:null}function Bn(e){return st({state:e.state,processRunning:Yt(e.child.pid)})}async function I(e,t){await N(e.deviceId,async()=>{j.get(e.deviceId)===e&&dt(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&&dt(r)&&(await O(r,n),j.get(e)===r&&j.delete(e))}function Vn(e){R(e);let t=Hn();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 Hn(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 Un(e,t){e.speculative&&!Tt(t)&&(e.speculative=!1)}async function Wn(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 Gn(e)}async function Gn(e,t){R(e);try{await N(e,async()=>{await un(e,async()=>{await L(e,void 0,{leaseLockHeld:!0}),await on(e)}),t?.()})}finally{t?.()}}async function Kn(e,t){let n=j.get(e);if(t.retain&&!at(n)){Vn(e);return}t.retain&&b({level:`info`,phase:`ios_runner_retain_skipped_busy`,data:{deviceId:e}});let r=Kt(e);try{await Xt(e),await Gn(e,r)}finally{r()}}async function qn(){let e=Array.from(j.values()),t=Ut(e.map(e=>e.deviceId));try{await nn(e);for(let t of e)j.get(t.deviceId)===t&&j.delete(t.deviceId)}finally{t()}}async function Jn(){return await mn(j,e=>{j.delete(e),R(e)})}async function Yn(){let e=Ut(j.keys());try{await qn();let e=Array.from(j.keys());await Promise.allSettled(e.map(async e=>{await z(e)})),await Xt()}finally{e()}}function Xn(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 je(Fe(e,[`bootstatus`,e.id,`-b`]),{timeoutMs:x})}function Qn(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){tr(t,n.command);let{executeRunnerExchange:o}=await import(`./runner-exchange.js`);return o(e,t,n,r,i,e=>I(t,e),a)}function $n(e,t){let n=Ue(t.phase,`runner_xctestrun_build`)??t.timeoutMs,r=pt(e.buildTimeoutMs);return r===void 0?n:Math.min(r,n)}function er(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 tr(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 nr(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 rr(e){let{device:t,session:n,command:r,transportError:i,options:a,signal:o,invalidationReason:s}=e;return await ir(await ur(t,n,r,i,a,o),{command:r,session:n,transportError:i,options:a,invalidationReason:s,invalidateSession:e.invalidateSession})}async function ir(e,t){if(e.type===`recovered`)return sr(e,t);let n=ar(e,t);if(e.type===`skipInvalidation`)throw cr(e,t,n);return await lr(e,t,n)}function ar(e,t){return`runnerAnswer`in e?o(e.runnerAnswer,e.dispatched):T(t.command)?o(t.transportError,`unknown`):o(or(t,e.lostReply),`unknown`)}function or(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?wr(n.command,t.cause):t.message,{command:n.command,commandId:n.commandId,...t.lifecycleState===void 0?{}:{lifecycleState:t.lifecycleState},reason:Nt,...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 sr(e,t){return K({command:t.command,session:t.session,transportError:t.transportError,decision:`skipped`,reason:e.reason,lifecycleState:e.lifecycleState}),e.data}function cr(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 lr(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 ur(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=pr(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}}}),mr(s,c,n,r,i)}const dr=new Set([`completed`,`failed`]),fr=new Set([`accepted`,`started`]);function pr(e,t,n){if(dr.has(n))return e.commandCharges.settleTerminalEvidence(t.commandId)}function mr(e,t,n,r,i){if(t===`completed`)return hr(e,n,r);if(t===`failed`){let a=St(typeof e.lifecycleErrorCode==`string`?e.lifecycleErrorCode:void 0);return{type:`skipInvalidation`,reason:`runner_reported_failure`,lifecycleState:t,dispatched:a.details.dispatched,runnerAnswer:gr(e,a,n,r,i)}}return fr.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:br(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 hr(e,t,n){let r=_r(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:vr(t.command,W(n))}}}function gr(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??yr(n.command,c),logPath:a.logPath,transportError:r.message},r)}function _r(e){if(typeof e!=`string`||e.trim().length===0)return;let t;try{t=wt(e)}catch{return}return xt(t)?jt(t):void 0}function vr(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 yr(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 br(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 xr(e,t){let n=e.details?.[t];return typeof n==`boolean`?n:void 0}function Sr(e,t){let n=e.details?.[t];return typeof n==`string`?n:void 0}function Cr(e,t){let n=e.details?.[t];return typeof n==`number`?n:void 0}function W(e){let t={},n=xr(e,`runnerReadinessPreflightSkipped`);n!==void 0&&(t.readinessPreflightSkipped=n);let r=Sr(e,`runnerReadinessPreflightSkipReason`);r!==void 0&&(t.readinessPreflightSkipReason=r);let i=Cr(e,`runnerReadinessPreflightSkippedAgeMs`);return i!==void 0&&(t.readinessPreflightSkippedAgeMs=i),t}function wr(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 Tr(e,t){let n=e.requestId?.trim();if(n)return`request:${n}`;let r=t.commandId?.trim();if(r)return`command:${r}`}function Er(e){if(!e)return;let t=Y(e);t.touchedSession=!0,X(e,t)}function Dr(e){return e?q.get(e)?.touchedSession===!0:!1}function Or(e){if(!e)return!0;let t=Y(e);return t.recycles>=1?(X(e,t),!1):(X(e,t),!0)}function J(e){if(!e)return;let t=Y(e);t.recycles+=1,X(e,t)}function kr(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 Ar(),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 Ar(){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 jr(e,t){E(t.requestId);let n=S(t),r=C({command:`uptime`}),a=en(e.id),o;try{for(let i=1;i<=2;i+=1){let s=await Mr({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{Rt(a)}throw new i(`COMMAND_FAILED`,`iOS runner prepare failed`)}async function Mr(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,...Vr(r,`runner_session`)}),l=Date.now()-s;try{return{kind:`prepared`,result:Kr(t,await Br(t,c,n,r,i,l,{recoveryReason:o}))}}catch(e){return await Nr({device:t,session:c,command:n,options:r,signal:i,attempt:a,error:e})}}async function Nr(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&&Ur(u,i))return{kind:`prepared`,result:await Pr({device:n,session:i,command:a,options:o,signal:s,error:u})};if(!Fr(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 Pr(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 qt(n.xctestrunArtifact,s);let c=Date.now(),l=await P(t,{...i,cleanStaleBundles:!0,forceRunnerXctestrunRebuild:!0,...Vr(i,`runner_rebuild`)}),u=Date.now()-c;try{let e=await Br(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}}),Kr(t,e)}catch(e){await Z(l,`prepare_rebuilt_runner_health_failed`);let n=Wr(e,l,s);throw qr(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 Fr(e){return r(e)?!1:w(e)||It(e)}async function Ir(e,n,r){let i={entered:!1};try{return await Lr(e,n,r,i)}catch(e){let n=t(e);throw i.entered?Mt(n)?a(n,`no`):n:o(n,`no`)}}async function Lr(e,i,a,o){E(a.requestId);let s=S(a),c=Tr(a,i),l,u=!1,d=F(e.id)?.liveness??`gone`;try{if((d===`gone`||d===`stopped`)&&Dr(c)){if(!Or(c))throw kr(i,a);u=!0}l=await P(e,a),Mn(l,a.expectedRunnerSessionId),Un(l,i),u&&J(c),Er(c);let t=ct;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&&!Ct(a)&&await Z(l,`runner_startup_request_canceled`),n({...c.details,readinessPhase:`runner-start`},c);if(Et(c,i)&&l)return E(a.requestId),await Rr({device:e,session:l,command:i,options:a,signal:s,restartReason:`runner_connect_failed_before_command_send`,firstAttemptDispatched:Dt(c)});if(l&&Ot(c))return E(a.requestId),await Rr({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)&&!Ft(c))return await rr({device:e,session:l,command:i,transportError:c,options:a,signal:s,invalidationReason:`transport_error_after_command_send`,invalidateSession:I});throw o}}async function Rr(e){let{device:n,command:r,options:i,signal:a,restartReason:s}=e,c=Tr(i,r);if(!Or(c))throw o(kr(r,i),e.firstAttemptDispatched);await I(e.session,s);let l=await P(n,{...i,cleanStaleBundles:!0}).catch(t=>{throw Q(t,e)});J(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)&&!Ft(s))try{return await rr({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?zr(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 zr(e,t,n){return!n||t===`unknown`?o(e,t):a(e,Mt(e)?`no`:`unknown`)}async function Br(e,t,n,r,i,a,o){let s=Date.now(),c=Hr(r.prepareDeadline,r.healthTimeoutMs,`runner_health`);return Gr(await B(e,t,n,r.logPath,c,i),t,a,Date.now()-s,o)}function Vr(e,t){if(!e.prepareDeadline)return{};let n=Hr(e.prepareDeadline,e.buildTimeoutMs,t);return{buildTimeoutMs:n,startupTimeoutMs:n}}function Hr(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 Ur(e,t){let n=t.xctestrunArtifact;return!n||n.cache===`miss`?!1:kt(e)}function Wr(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 Gr(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 Kr(e,t){return qr(e,t),t}function qr(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 Jr={maxAttempts:8,baseDelayMs:200,maxDelayMs:1e3,jitter:0};function Yr(e){return Pt(e)?8:w(e)?3:1}async function Xr(e,t,n={}){Qn(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)),{...Jr,shouldRetry:(e,t)=>(E(n.requestId),Pt(e)&&(a=e),t<Yr(e))},{signal:S(n)})}catch(e){throw a&&Ct(n)?a:e}}async function Zr(e,t={}){if(d(e))try{await Xr(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 Qr(e,t={}){if(d(e)){if(Le()){b({level:`debug`,phase:`ios_runner_cache_prewarm_unavailable`,data:{deviceId:e.id}});return}return ei({device:e,options:t,failurePhase:`ios_runner_cache_prewarm_failed`,task:async t=>{await ln(e,{...t,budget:Ke(t.buildTimeoutMs,t.signal)})}})}}function $r(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 ei({device:e,options:t,failurePhase:`ios_runner_session_prewarm_failed`,task:async t=>{await n(e,t)}})}function ei(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 ti(e,t){Qn(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,ii,{requestId:t.requestId})}function ni(e,t={}){return d(e)?$(e,t).hasLiveSession(e):!1}async function ri(e,t={}){if(!d(e))return!1;let n=$(e,t).releaseSpeculativeSession;return n?await n(e):!1}const ii=Oe(Ir,{prepare:jr,hasLiveSession:e=>F(e.id)?.liveness===`ready`,releaseSpeculativeSession:async e=>await Wn(e.id),prewarm:async(e,t)=>{let{healthCheck:n,...r}=t;if(n===!1){await P(e,{...r,speculative:!0});return}await jr(e,{...r,speculative:!0,healthTimeoutMs:ct})}});var ai=e({cleanupRunnerLeasesForOwner:()=>Qt,readRunnerSessionLiveness:()=>F});Re(fn);export{Qr as a,Xr as c,Kn as d,Yn as f,ti as i,Jn as l,ni as n,$r as o,z as p,Zr as r,ri as s,ai 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};
|