agent-device 0.21.1 → 0.21.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.1.apk → agent-device-android-ime-helper-0.21.2.apk} +0 -0
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.2.apk.sha256 +1 -0
- package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.1.manifest.json → agent-device-android-ime-helper-0.21.2.manifest.json} +4 -4
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.2.apk +0 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.2.apk.sha256 +1 -0
- package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.1.manifest.json → agent-device-android-snapshot-helper-0.21.2.manifest.json} +6 -6
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerScrollViewportPolicy.swift +413 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Alert.swift +34 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +56 -31
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Interaction.swift +1 -13
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +4 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedGesturePolicy.swift +9 -1
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +1 -0
- package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/RecordingExportSupport.swift +0 -4
- package/dist/src/absence-observation-errors.js +1 -0
- package/dist/src/adapter.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-tool.js +1 -1
- package/dist/src/agent-device-client.js +2 -2
- package/dist/src/ai-sdk.d.ts +1 -1
- package/dist/src/ai-sdk.js +1 -1
- package/dist/src/alert-runtime.js +1 -1
- package/dist/src/android-input-ownership.js +1 -1
- package/dist/src/app-helpers.js +1 -1
- package/dist/src/app-inventory-contract.js +1 -1
- package/dist/src/app-inventory.js +1 -1
- package/dist/src/app-log-runtime2.js +2 -2
- package/dist/src/auth-session.js +1 -1
- package/dist/src/back-mode.js +1 -0
- package/dist/src/browser-launch.js +1 -0
- package/dist/src/catalog.js +1 -1
- package/dist/src/cli-config.js +1 -1
- package/dist/src/cli-help.js +12 -12
- package/dist/src/cli-runner.js +1 -1
- package/dist/src/cli.js +3 -3
- package/dist/src/client-metro-companion.js +1 -1
- package/dist/src/client-metro.js +1 -1
- package/dist/src/client-types.d.ts +2 -1
- package/dist/src/code-signature-cache.js +1 -1
- package/dist/src/code-signature.js +1 -1
- package/dist/src/command-metadata.js +1 -1
- package/dist/src/command-schema.js +3 -3
- package/dist/src/command-tools.js +2 -2
- package/dist/src/config.js +1 -1
- package/dist/src/connection-runtime.js +1 -1
- package/dist/src/contracts.d.ts +1 -1
- package/dist/src/daemon-client-lifecycle.js +1 -1
- package/dist/src/daemon-process.js +1 -1
- package/dist/src/daemon-shutdown-report.js +1 -1
- package/dist/src/device-boot.js +1 -0
- package/dist/src/device-claim-inspection.js +1 -1
- package/dist/src/device-claim-rule.js +1 -1
- package/dist/src/device-input-state.d.ts +1 -1
- package/dist/src/device-session.js +1 -1
- package/dist/src/durable-resource.js +1 -1
- package/dist/src/engine-eval-script.js +1 -0
- 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 +1 -0
- package/dist/src/generic-settle.js +1 -1
- package/dist/src/gesture-plan.js +1 -1
- package/dist/src/gesture-runtime.js +1 -1
- package/dist/src/helper.js +1 -1
- package/dist/src/index.d.ts +1 -1
- package/dist/src/input-actions.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/internal/bin.js +1 -1
- package/dist/src/internal/daemon.js +2 -2
- package/dist/src/internal/png-worker.d.ts +3 -0
- package/dist/src/internal/png-worker.js +1 -1
- package/dist/src/ios-snapshot-acquisition.js +1 -1
- package/dist/src/ios-snapshot-planning.js +1 -1
- package/dist/src/ios-snapshot-runtime.js +1 -1
- package/dist/src/lease.js +1 -1
- package/dist/src/limrun.d.ts +1 -1
- package/dist/src/local-interactor-operation-set.js +1 -1
- package/dist/src/mechanics.js +16 -16
- package/dist/src/mobile-snapshot-semantics.js +1 -1
- package/dist/src/mp4-atoms.js +1 -0
- package/dist/src/owner-identity.js +3 -3
- package/dist/src/parameterized-recorded-fill.js +1 -1
- package/dist/src/perf-facade.js +1 -1
- package/dist/src/perf-runtime-plan.js +1 -1
- package/dist/src/platform-request-scope.js +1 -1
- package/dist/src/platform-runtime-app-log-process.js +1 -1
- package/dist/src/platform-runtime-managed-owner.js +1 -1
- package/dist/src/platform-runtime-operation-host.js +1 -1
- package/dist/src/platform-runtime-screen-recording-android-host.js +1 -1
- package/dist/src/platform-runtime-screen-recording-apple-runner-host.js +1 -1
- package/dist/src/platform-runtime-screen-recording-apple-runner-transport.js +1 -1
- package/dist/src/platform-runtime-screen-recording-apple-simulator-host.js +1 -1
- package/dist/src/platform-runtime-screen-recording-finalizer-host.js +1 -1
- package/dist/src/platform-runtime-screen-recording-process-host.js +1 -1
- package/dist/src/platform-runtime.js +1 -1
- package/dist/src/platform-runtime2.js +1 -1
- package/dist/src/png-crop-bytes.js +1 -0
- package/dist/src/png-worker-contract.js +1 -1
- package/dist/src/png.js +1 -0
- package/dist/src/process.js +1 -1
- package/dist/src/provider-webdriver.js +1 -1
- package/dist/src/quality-warnings.js +1 -0
- package/dist/src/react-native.js +1 -1
- package/dist/src/record-runtime.js +1 -1
- package/dist/src/registry.js +36 -37
- package/dist/src/replay.js +1 -1
- package/dist/src/request-admission.js +1 -1
- package/dist/src/request-cancellation.js +1 -1
- package/dist/src/request-runtime-binding.js +1 -1
- package/dist/src/runner-client.js +1 -1
- package/dist/src/runner-disposal.js +1 -1
- package/dist/src/runner-presentation.js +1 -1
- package/dist/src/runtime.js +3 -3
- package/dist/src/runtime10.js +1 -0
- package/dist/src/runtime2.js +4 -4
- package/dist/src/runtime4.js +3 -3
- 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-live-handle.js +1 -1
- package/dist/src/screen-recording-resource-recovery.js +1 -1
- package/dist/src/screenshot-runtime.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 +1 -1
- package/dist/src/sdk-contracts.d.ts +26 -26
- 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 +1 -1
- package/dist/src/sdk-selectors.d.ts +12 -4
- package/dist/src/sdk-selectors.js +1 -1
- package/dist/src/selection.js +0 -0
- package/dist/src/selector-runtime.js +1 -1
- package/dist/src/selectors.js +1 -1
- package/dist/src/semantic-index.js +1 -1
- package/dist/src/server.js +1 -1
- package/dist/src/session-snapshot.js +1 -1
- package/dist/src/session-store.js +2 -2
- package/dist/src/session-target-evidence.js +1 -1
- package/dist/src/session2.js +5 -5
- package/dist/src/simulator-boot.js +3 -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/src.js +1 -1
- package/dist/src/src7.js +1 -1
- package/dist/src/src8.js +2 -2
- package/dist/src/telemetry.js +1 -1
- package/dist/src/touch-reference-frame.js +1 -1
- package/dist/src/tree.js +1 -1
- package/dist/src/type-text-runtime.js +1 -1
- package/dist/src/vars.js +2 -0
- package/dist/src/version.js +1 -1
- package/dist/src/video.js +2 -2
- package/dist/src/viewport.js +1 -0
- package/dist/src/webdriver-ios-snapshot.js +1 -1
- package/package.json +2 -1
- package/server.json +2 -2
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.1.apk.sha256 +0 -1
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.1.apk +0 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.1.apk.sha256 +0 -1
- package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/recording-trim.swift +0 -93
- package/dist/src/snapshot-quality-verdict.js +0 -1
|
@@ -7,7 +7,6 @@ import Foundation
|
|
|
7
7
|
|
|
8
8
|
enum RecordingScriptError: Error, CustomStringConvertible {
|
|
9
9
|
case invalidArgs(String)
|
|
10
|
-
case invalidTrimRange
|
|
11
10
|
case missingVideoTrack
|
|
12
11
|
case exportFailed(String)
|
|
13
12
|
|
|
@@ -15,8 +14,6 @@ enum RecordingScriptError: Error, CustomStringConvertible {
|
|
|
15
14
|
switch self {
|
|
16
15
|
case .invalidArgs(let message):
|
|
17
16
|
return message
|
|
18
|
-
case .invalidTrimRange:
|
|
19
|
-
return "Trim start must be before the end of the recording."
|
|
20
17
|
case .missingVideoTrack:
|
|
21
18
|
return "Input video does not contain a video track."
|
|
22
19
|
case .exportFailed(let message):
|
|
@@ -48,7 +45,6 @@ func sourceVideoTrack(of asset: AVURLAsset) throws -> AVAssetTrack {
|
|
|
48
45
|
|
|
49
46
|
|
|
50
47
|
|
|
51
|
-
|
|
52
48
|
func makeRecordingComposition(
|
|
53
49
|
asset: AVURLAsset,
|
|
54
50
|
videoTrack: AVAssetTrack,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{C as e,w as t}from"./sdk-contracts.js";import{$n as n,Mr as r,Or as i,Un as a}from"./sdk-batch.js";import{n as o}from"./scroll-indicator.js";function s(e){let t=f(e.label),n=f(e.value),r=f(e.identifier),i=m(r)?r:``;return p(e.type??``)?n||t||i:t||n||i}function c(e,t){if(t===`text-view`||t===`text-field`||t===`search`)return!0;let n=r(e.type??``),i=`${e.role??``} ${e.subrole??``}`.toLowerCase();return n.includes(`textview`)||n.includes(`textarea`)||n.includes(`textfield`)||n.includes(`securetextfield`)||n.includes(`searchfield`)||n.includes(`edittext`)||i.includes(`text area`)||i.includes(`text field`)}function l(e){let t=e.replaceAll(/\s+/g,` `).trim();return t.length<=48?t:`${t.slice(0,45)}...`}function u(e,t){let n=s(e),r=c(e,t);return{text:n,isLargeSurface:r,shouldSummarize:r&&d(n)}}function d(e){return e?e.length>80||/[\r\n]/.test(e):!1}function f(e){return typeof e==`string`?e.trim():``}function p(e){let t=r(e);return t.includes(`textfield`)||t.includes(`securetextfield`)||t.includes(`searchfield`)||t.includes(`edittext`)||t.includes(`textview`)||t.includes(`textarea`)}function m(e){return e?!/^[\w.]+:id\/[\w.-]+$/i.test(e)&&!/^_?NS:\d+$/i.test(e):!1}const h={application:`application`,navigationbar:`navigation-bar`,tabbar:`tab-bar`,button:`button`,imagebutton:`button`,link:`link`,cell:`cell`,statictext:`text`,checkedtextview:`text`,textbox:`text-field`,textfield:`text-field`,edittext:`text-field`,textarea:`text-view`,switch:`switch`,slider:`slider`,image:`image`,imageview:`image`,webview:`webview`,framelayout:`group`,linearlayout:`group`,relativelayout:`group`,constraintlayout:`group`,viewgroup:`group`,view:`group`,listview:`list`,recyclerview:`list`,collectionview:`collection`,searchfield:`search`,heading:`heading`,activityindicator:`activity-indicator`,progressindicator:`progress-indicator`,segmentedcontrol:`segmented-control`,group:`group`,window:`window`,checkbox:`checkbox`,radio:`radio`,menuitem:`menu-item`,toolbar:`toolbar`,scrollarea:`scroll-area`,scrollview:`scroll-area`,nestedscrollview:`scroll-area`,table:`table`};function g(e,t={}){let n=[],r=[];for(let i of e){let e=i.depth??0,a=i.label?.trim()||i.value?.trim()||i.identifier?.trim()||``,o=x(i.type??`Element`),s=i.inheritsLabel===!0||i.inheritsIdentifier===!0;if(o===`group`&&!a&&!s)continue;for(;n.length>0&&e<=n.at(-1);)n.pop();let c=n.length;n.push(e),r.push({node:i,depth:c,type:o,text:_(i,c,!1,o,t)})}return r}function _(e,t,n,r,i={}){let a=r??x(e.type??`Element`),o=u(e,a),s=E(e,a,i,o),c=` `.repeat(t),l=e.ref?`@${e.ref}`:``,d=D(e,a,i,o);!s&&(e.inheritsLabel===!0||e.inheritsIdentifier===!0)&&d.push(`same label as parent`);let f=d.map(e=>` [${e}]`).join(``),p=s?` "${s}"`:``,m=v(e);return n?`${c}${l} [${a}]${f}${m}`.trimEnd():`${c}${l} [${a}]${p}${f}${m}`.trimEnd()}function v(e){let t=e.actions?.filter(e=>e.trim().length>0);return!t||t.length===0?``:` actions: [${t.map(e=>`"${A(y(e))}"`).join(`, `)}]`}function y(e){return e.replaceAll(/\s+/g,` `).replaceAll(/[\u0000-\u001f\u007f-\u009f]/g,``).trim()}function b(e,t){let n=e.label?.trim();if(n&&w(t,n))return``;let r=e.value?.trim();if(C(t)){if(r)return r;if(n)return n}else if(n)return n;if(r)return r;let i=e.identifier?.trim();return!i||T(i)&&(t===`group`||t===`image`||t===`list`||t===`collection`)?``:i}function x(e){let t=e,n=e.replaceAll(/XCUIElementType/gi,``).toLowerCase(),r=t.includes(`.`)&&(t.startsWith(`android.`)||t.startsWith(`androidx.`)||t.startsWith(`com.`));return n.includes(`.`)&&(n=n.replace(/^android\.widget\./,``).replace(/^android\.view\./,``).replace(/^android\.webkit\./,``).replace(/^androidx\./,``).replace(/^com\.google\.android\./,``).replace(/^com\.android\./,``),r&&n.includes(`.`)&&(n=n.slice(n.lastIndexOf(`.`)+1))),n===`textview`?r?`text`:`text-view`:S(n)||n||`element`}function S(e){return Object.prototype.hasOwnProperty.call(h,e)?h[e]:void 0}function C(e){return e===`text-field`||e===`text-view`||e===`search`}function w(e,t){return e!==`scroll-area`&&e!==`list`&&e!==`collection`&&e!==`table`?!1:o(t)}function T(e){return/^[\w.]+:id\/[\w.-]+$/i.test(e)}function E(e,t,n,r){return!n.summarizeTextSurfaces||!r.shouldSummarize?b(e,t):O(e,t,r.text)||b(e,t)}function D(e,t,n,r){let i=[];return e.enabled===!1&&i.push(`disabled`),e.selected===!0&&i.push(`selected`),i.push(...e.presentationHints??[]),!n.summarizeTextSurfaces||(e.focused===!0&&i.push(`focused`),C(t)&&i.push(`editable`),k(e,t)&&i.push(`scrollable`),!r.shouldSummarize)?j(i):(i.push(`preview:"${A(l(r.text))}"`),i.push(`truncated`),j(i))}function O(e,t,n){let r=f(e.label);if(r&&r!==n)return r;let i=f(e.identifier);if(i&&!T(i)&&i!==n)return i;switch(t){case`text`:case`text-view`:return`Text view`;case`text-field`:return`Text field`;case`search`:return`Search field`;default:return``}}function k(e,t){if(t===`scroll-area`)return!0;let n=(e.type??``).toLowerCase(),r=`${e.role??``} ${e.subrole??``}`.toLowerCase();return n.includes(`scroll`)||r.includes(`scroll`)}function A(e){return e.replaceAll(`\\`,String.raw`\\`).replaceAll(`"`,String.raw`\"`)}function j(e){return[...new Set(e)]}const M={state:`sparse`,backend:`tree`,reason:`legacy iOS capture exposed only the application root`,reasonCode:`sparse-tree`};function N(e){if(e.scope!==void 0)return`scope`;if(e.depth!==void 0)return`depth`}function P(e,t=`is`){let n=`${t} absent`;return e===`scope`?`${n} does not support --scope; it requires an unscoped capture`:`${n} does not support --depth; it requires a full-depth capture`}function F(e,t){let n=t[0]?R(t[0]):void 0,r=t.length;if(e.truncated===!0)return{kind:`truncated`,matches:r,...n?{firstMatch:n}:{}};let i=I(e);return i?{kind:`sparse`,matches:r,...n?{firstMatch:n}:{},quality:{state:i.state,backend:i.backend,...i.reason?{reason:i.reason}:{},...i.reasonCode?{reasonCode:i.reasonCode}:{}}}:r===0?{kind:`absent`,matches:0}:{kind:`present`,matches:r,firstMatch:n}}function I(e){let t=e.snapshotQuality;return t?.state===`sparse`?{state:t.state,backend:t.backend,...t.reason?{reason:t.reason}:{},...t.reasonCode?{reasonCode:t.reasonCode}:{}}:L(e)?M:void 0}function L(e){return e.snapshotQuality||e.backend!==`xctest`||e.nodes.length!==1?!1:r(e.nodes[0]?.type??``)===`application`}function R(e){let t=a(e),r=n(i(e),256);return{...t,...r&&r!==t.label?{text:r}:{}}}const z={selectorNotFound:`selector_not_found`,predicateFailed:`predicate_failed`};function B(t,n=`is`){return new e(`INVALID_ARGS`,P(t,n),{command:n,predicate:`absent`,rejectedOption:t})}function V(t,n,r=`is`){let i=`firstMatch`in n?n.firstMatch:void 0,a={command:r,reason:z.predicateFailed,predicate:`absent`,selector:t,matches:n.matches,observation:n.kind,...i?{firstMatch:i}:{},...n.kind===`sparse`?{snapshotQuality:n.quality}:{},...n.kind===`truncated`?{truncated:!0}:{}};if(n.kind===`present`){let i=n.matches>1;return new e(`COMMAND_FAILED`,`${r} absent failed for selector ${t}: ${n.matches} match${i?`es`:``} found`,{...a,...i?{hint:`Refine the selector to match no elements.`}:{}})}return new e(`COMMAND_FAILED`,`${r} absent could not prove absence for selector ${t}: ${n.kind===`sparse`?`capture was sparse`:`capture was truncated`}`,{...a,hint:`Retry after the accessibility capture is complete.`})}function H(n,r,i=`is`){let a=t(r),o=typeof a.details?.reason==`string`?a.details.reason:typeof a.details?.androidSnapshotHelperFailureReason==`string`?a.details.androidSnapshotHelperFailureReason:void 0;return new e(`COMMAND_FAILED`,`${i} absent could not prove absence for selector ${n}: capture was unreadable`,{command:i,reason:z.predicateFailed,predicate:`absent`,selector:n,matches:0,observation:`unreadable`,captureErrorCode:a.code,...o?{captureErrorReason:o}:{},hint:`Retry after the accessibility capture is readable.`},a)}export{N as a,I as c,x as d,_ as f,z as i,g as l,p as m,V as n,F as o,s as p,H as r,L as s,B as t,b as u};
|
package/dist/src/adapter.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{A as e,C as t}from"./sdk-contracts.js";import{Rr as n,zr as r}from"./sdk-batch.js";import{c as i,r as a}from"./diagnostics.js";import{S as o,b as s,f as c}from"./owner-identity.js";import{c as l,l as u,r as d}from"./exec.js";import{t as f}from"./file.js";import"./diagnostics2.js";import"./command.js";import{n as p}from"./retry.js";import{n as m}from"./version.js";import"./process.js";import{C as ee,D as te,c as ne,f as re,h as ie,n as ae,o as oe,w as se,y as ce}from"./host-file.js";import{t as le}from"./apple-runner-platform.js";import{t as ue}from"./snapshot-process.js";import h from"node:path";import{createHash as g,randomUUID as _}from"node:crypto";import de from"node:net";import{Buffer as v}from"node:buffer";const fe={unsupported:`UNSUPPORTED_OPERATION`,"malformed-tree":`COMMAND_FAILED`,"stale-target":`COMMAND_FAILED`,timeout:`COMMAND_FAILED`,cancelled:`COMMAND_FAILED`,"process-crash":`COMMAND_FAILED`,"transport-failure":`COMMAND_FAILED`};var y=class extends t{failureKind;failureCode;constructor(e,t,n=`iOS Simulator snapshot source ${e}: ${t}`,r={},i){super(fe[e],n,{...r,bridgeFailure:e,bridgeFailureCode:t,...e===`cancelled`?{reason:`request_canceled`}:{}},i),this.name=`SnapshotSourceError`,this.failureKind=e,this.failureCode=t}};function b(e,t,n={},r){return new y(e,t,void 0,n,r)}function x(n){return n instanceof y?n:e(n)?b(`cancelled`,`abort-signal`,{},n):n instanceof t&&typeof n.details?.timeoutMs==`number`?b(`timeout`,`host-operation-timeout`,{timeoutMs:n.details.timeoutMs},n):b(`transport-failure`,`unexpected-host-error`,{error:n instanceof Error?n.message:String(n)},n)}function pe(e,t,n=Date.now){if(t?.aborted)throw b(`cancelled`,`abort-signal`);return{clock:p.fromTimeoutMs(e,n()),now:n,signal:t}}function S(e,t){if(e.signal?.aborted)throw b(`cancelled`,`abort-signal`);let n=e.clock.remainingMs(e.now());if(n<=0)throw b(`timeout`,t);return Math.max(1,Math.floor(n))}async function C(e,t,n){let r=Math.min(t,S(e,n));await new Promise((t,n)=>{let i=!1,a=setTimeout(()=>s(t),r),o=()=>{s(()=>n(b(`cancelled`,`abort-signal`)))},s=t=>{i||(i=!0,clearTimeout(a),e.signal?.removeEventListener(`abort`,o),t())};e.signal?.addEventListener(`abort`,o,{once:!0}),e.signal?.aborted&&o()})}const w=[`SnapshotBridge.m`,`SnapshotBridgeRuntime.m`,`SnapshotBridgeRuntime.h`,`SnapshotBridgeCapture.h`,`SnapshotBridgeCapture.m`],me=[`SnapshotBridge.m`,`SnapshotBridgeRuntime.m`,`SnapshotBridgeCapture.m`];async function he(e,t,n){let r=g(`sha256`);for(let i of w){let a=h.join(t,i);if(S(n,`native-source-fingerprint-deadline`),!e.exists(a))throw b(`unsupported`,`native-source-missing`,{filePath:a});r.update(i),r.update(`\0`),r.update(await e.readBinary(a)),r.update(`\0`)}return r.digest(`hex`)}async function ge(e,t,n){let r=await T(e,`xcodebuild`,[`-version`],n),i=await T(e,`sw_vers`,[`-productVersion`],n),a=await T(e,`sw_vers`,[`-buildVersion`],n),o=await T(e,`uname`,[`-m`],n),s=await T(e,`xcrun`,[`--sdk`,`iphonesimulator`,`--show-sdk-version`],n),c=t.trim();if(!c)throw b(`unsupported`,`simulator-runtime-missing`);if(o!==`arm64`&&o!==`x86_64`)throw b(`unsupported`,`simulator-architecture-unsupported`,{architecture:o});return{xcode:r,macosProductVersion:i,macosBuild:a,architecture:o,simulatorSdk:s,simulatorRuntime:c}}async function T(e,t,n,r){let i=await _e(e,t,n,r);if(i.exitCode!==0)throw b(`unsupported`,`toolchain-probe-failed`,{command:t,exitCode:i.exitCode,stderr:i.stderr.slice(0,1024)});let a=(i.stdout||i.stderr).trim();if(!a)throw b(`unsupported`,`toolchain-probe-empty`,{command:t});return a}async function _e(e,t,n,r){try{return await E(e,t,n,r)}catch(i){if(!d(i))throw i;if(r.signal?.aborted)throw b(`cancelled`,`abort-signal`);if(r.clock.remainingMs(r.now())<=0)throw i;return await E(e,t,n,r)}}function E(e,t,n,r){return e.run(t,n,{allowFailure:!0,signal:r.signal,timeoutMs:Math.min(le,S(r,`toolchain-probe-deadline`))})}const D=`agent-device-simulator-ax-v1.5.5`;Object.freeze([`verb`,`requestId`,`pid`,`generation`,`snapshotTree`,`automationMode`,`maxDepth`,`maxNodes`,`maxDurationMs`,`maxResponseBytes`,`nativeLevelsHint`]),Object.freeze([`protocolVersion`,`sourceVersion`,`requestId`,`generation`,`ok`,`pid`,`tree`,`truncated`,`automationEnabled`,`recovery`,`error_kind`,`error_code`,`error`]),Object.freeze([`XC_kAXXCAttributeElementType`,`XC_kAXXCAttributeElementBaseType`,`XC_kAXXCAttributeLabel`,`XC_kAXXCAttributeValue`,`XC_kAXXCAttributeIdentifier`,`XC_kAXXCAttributeFrame`,`XC_kAXXCAttributeAutomationType`,`XC_kAXXCAttributeChildren`]);const ve=[`requests`,`rejected`,`continuations`,`acceptedLevels`];function ye(e){let t=e.recovery;if(!P(t))throw b(`malformed-tree`,`recovery-invalid`);let n=ve.map(e=>[e,t[e]]);if(n.some(([,e])=>!Number.isSafeInteger(e)||e<0))throw b(`malformed-tree`,`recovery-invalid`);return Object.freeze(Object.fromEntries(n))}function be(e,t){let n;try{n=v.from(JSON.stringify(e),`utf8`)}catch(e){throw b(`malformed-tree`,`request-not-json`,{},e)}let r=n.length+4;if(r>t.maxRequestBytes)throw b(`transport-failure`,`request-limit-exceeded`,{frameBytes:r,maxRequestBytes:t.maxRequestBytes});let i=v.alloc(4);return i.writeUInt32BE(n.length,0),v.concat([i,n])}var O=class{header=v.alloc(4);headerBytes=0;chunks=[];payloadBytes=0;expectedBodyBytes;frame;maxFrameBytes;constructor(e){if(!Number.isSafeInteger(e)||e<=0)throw b(`malformed-tree`,`frame-limit-invalid`,{maxFrameBytes:e});this.maxFrameBytes=e}push(e){if(this.frame)return this.acceptTrailingChunk(e);let t=this.readHeader(e);if(t&&(this.appendPayload(e,t.offset,t.bodyBytes),this.payloadBytes===t.bodyBytes))return this.frame=v.concat(this.chunks,t.bodyBytes),this.frame}acceptTrailingChunk(e){if(e.length>0)throw b(`malformed-tree`,`multiple-frames`,{trailingBytes:e.length});return this.frame}readHeader(e){if(this.headerBytes===4)return{offset:0,bodyBytes:this.expectedBodyBytes};let t=Math.min(4-this.headerBytes,e.length);if(e.copy(this.header,this.headerBytes,0,t),this.headerBytes+=t,this.headerBytes<4)return;let n=this.header.readUInt32BE(0);if(n===0||n>this.maxFrameBytes)throw b(`malformed-tree`,`frame-limit-exceeded`,{bodyBytes:n,maxFrameBytes:this.maxFrameBytes});return this.expectedBodyBytes=n,{offset:t,bodyBytes:n}}appendPayload(e,t,n){let r=n-this.payloadBytes,i=e.length-t;if(i>r)throw b(`malformed-tree`,`multiple-frames`,{trailingBytes:i-r});i!==0&&(this.chunks.push(e.subarray(t)),this.payloadBytes+=i)}finish(){if(this.frame)return this.frame;throw b(`transport-failure`,`bridge-frame-incomplete`,{headerBytes:this.headerBytes,payloadBytes:this.payloadBytes,expectedBodyBytes:this.expectedBodyBytes})}};function k(e){let t;try{t=JSON.parse(e.toString(`utf8`))}catch(e){throw b(`malformed-tree`,`response-not-json`,{},e)}if(!P(t))throw b(`malformed-tree`,`response-not-object`);return t}function A(e){return Object.freeze({verb:`describe`,requestId:e.requestId,pid:e.pid,generation:e.generation,snapshotTree:!0,automationMode:!0,maxDepth:e.maxDepth,maxNodes:e.maxNodes,maxDurationMs:e.maxDurationMs,maxResponseBytes:e.maxResponseBytes,...e.nativeLevelsHint===void 0?{}:{nativeLevelsHint:e.nativeLevelsHint}})}function j(e,t){if(e.protocolVersion!==1)throw b(`transport-failure`,`protocol-version-mismatch`,{expected:1,observed:e.protocolVersion});if(e.sourceVersion!==`agent-device-simulator-ax-v1.5.5`)throw b(`transport-failure`,`source-version-mismatch`,{expected:D,observed:e.sourceVersion});if(e.requestId!==t)throw b(`transport-failure`,`request-id-mismatch`,{expected:t,observed:e.requestId})}function M(e,t){if(typeof e.pid!=`number`||e.pid!==t.pid)throw b(`stale-target`,`bridge-pid-mismatch`,{expectedPid:t.pid,observedPid:e.pid});if(e.generation!==t.generation)throw b(`stale-target`,`bridge-generation-mismatch`,{expectedGeneration:t.generation,observedGeneration:e.generation})}function N(e){let t=e.error_kind,n=typeof e.error_code==`string`?e.error_code:`guest-error`,r=typeof e.error==`string`?e.error:void 0,i=r?{guestMessage:r.slice(0,1024)}:{};throw b(t===`unsupported`?`unsupported`:t===`malformed_tree`?`malformed-tree`:t===`application_not_responding`?`timeout`:t===`application_unavailable`?`transport-failure`:t===`bad_request`?`malformed-tree`:`transport-failure`,n,i)}function P(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}const F=`snapshot-bridge`,I=`manifest.json`;async function xe(e){let t=e.deadline,n=e.sourceRoot??Se(e.host),r=await he(e.host,n,t),i=await ge(e.host,e.runtime,t),a=we({schemaVersion:1,protocolVersion:1,sourceVersion:D,sourceHash:r,toolchain:i}),o=e.cacheRoot??h.join(e.host.homeDirectory(),`.agent-device`,`snapshot-source`),s=h.join(o,a),c=await e.host.acquireLock(h.join(o,`${a}.lock`),{deadline:t});try{let c=await Ce(e.host,s,{sourceHash:r,cacheKey:a,toolchain:i},t);if(c)return c;S(t,`native-build-deadline`),e.host.exists(s)&&await e.host.remove(s),S(t,`native-build-deadline`),await e.host.ensureDirectory(o);let l=h.join(o,`.${a}.${e.host.processId()}.tmp`);S(t,`native-build-deadline`),await e.host.remove(l);try{S(t,`native-build-deadline`),await e.host.ensureDirectory(l);let o=h.join(l,F),c=await e.host.run(`xcrun`,[`--sdk`,`iphonesimulator`,`clang`,`-arch`,i.architecture,`-mios-simulator-version-min=15.0`,`-fobjc-arc`,`-Werror`,`-Wall`,`-Wextra`,`-framework`,`Foundation`,`-framework`,`CoreGraphics`,...me.map(e=>h.join(n,e)),`-o`,o],{signal:t.signal,timeoutMs:Math.min(12e4,S(t,`native-build-deadline`)),allowFailure:!0});if(c.exitCode!==0||!e.host.exists(o))throw b(`unsupported`,`native-build-failed`,{exitCode:c.exitCode,stderr:c.stderr.slice(0,4096)});S(t,`native-build-deadline`),await e.host.chmod(o,493);let u=await L(e.host,o,t),d={schemaVersion:1,protocolVersion:1,sourceVersion:D,sourceHash:r,cacheKey:a,toolchain:i,binarySha256:u};return await e.host.writeText(h.join(l,I),`${JSON.stringify(d,null,2)}\n`),S(t,`native-build-deadline`),await e.host.rename(l,s),{path:h.join(s,F),sourceHash:r,cacheKey:a,protocolVersion:1,sourceVersion:D}}catch(t){throw await e.host.remove(l),t}}finally{await c()}}function Se(e){let t=e.projectRoot(),n=h.join(t,`apple`,`snapshot-bridge`);if(w.every(t=>e.exists(h.join(n,t))))return n;let r=h.join(t,`dist`,`apple`,`snapshot-bridge`);if(w.every(t=>e.exists(h.join(r,t))))return r;throw b(`unsupported`,`native-source-missing`,{projectRoot:t})}async function Ce(e,t,n,r){let i=h.join(t,F);if(!(!e.exists(i)||!e.exists(h.join(t,I))))try{let a=JSON.parse(await e.readText(h.join(t,I)));return a.schemaVersion!==1||a.protocolVersion!==1||a.sourceVersion!==`agent-device-simulator-ax-v1.5.5`||a.sourceHash!==n.sourceHash||a.cacheKey!==n.cacheKey||JSON.stringify(a.toolchain)!==JSON.stringify(n.toolchain)||typeof a.binarySha256!=`string`||await L(e,i,r)!==a.binarySha256?void 0:{path:i,sourceHash:n.sourceHash,cacheKey:n.cacheKey,protocolVersion:1,sourceVersion:D}}catch(e){if(e instanceof y&&(e.failureKind===`cancelled`||e.failureKind===`timeout`))throw e;return}}async function L(e,t,n){return S(n,`native-cache-hash-deadline`),g(`sha256`).update(await e.readBinary(t)).digest(`hex`)}function we(e){return g(`sha256`).update(JSON.stringify(e)).digest(`hex`).slice(0,32)}var Te=class{entries=new Map;probeBackAfterUses;constructor(e=8){this.probeBackAfterUses=e}consume(e,t,n){if(n)return{nativeLevels:void 0,reason:`explicit-depth`};let r=this.currentEntry(e);return r===`unidentified`?{nativeLevels:void 0,reason:`unidentified-target`}:!r||r.nativeLevels>=t?{nativeLevels:void 0,reason:`no-hint`}:r.remainingUses<=0?{nativeLevels:void 0,reason:`probe-back`}:(--r.remainingUses,{nativeLevels:r.nativeLevels,reason:`hinted`})}learn(e,t,n,r){return n||!e.targetId?`ignored`:r.rejected>0&&r.acceptedLevels<t?(this.remember(e.targetId,{generation:e.generation,nativeLevels:r.acceptedLevels,remainingUses:this.probeBackAfterUses}),`learned`):r.rejected===0&&r.acceptedLevels>=t?this.entries.delete(e.targetId)?`forgotten`:`ignored`:this.currentEntry(e)?`kept`:`ignored`}currentEntry(e){if(!e.targetId)return`unidentified`;let t=this.entries.get(e.targetId);if(t){if(t.generation!==e.generation){this.entries.delete(e.targetId);return}return t}}remember(e,t){if(this.entries.delete(e),this.entries.size>=32){let e=this.entries.keys().next().value;e!==void 0&&this.entries.delete(e)}this.entries.set(e,t)}};const R=65536;function Ee(){return{projectRoot:m,homeDirectory:re,run:async(e,t,n)=>await l(e,t,n),start:De,connect:Oe,readText:ce,readBinary:ie,writeText:te,ensureDirectory:oe,chmod:ae,exists:ne,rename:se,remove:ee,acquireLock:ke,emitDiagnostic:a,withDiagnosticTimer:i,processId:c,readTargetProcessStartTime:ue}}function De(e,t,n,r={}){if(r.signal?.aborted)throw b(`cancelled`,`abort-signal`);let i=u(`xcrun`,[`simctl`,`spawn`,e,t,`serve`,n,`--idle-timeout`,`60`,`--exit-on-disconnect`,`false`],{allowFailure:!0,captureOutput:!1,detached:!0}),a=i.child.pid??0;if(a<=0)throw b(`transport-failure`,`bridge-process-pid-missing`);let s=``;return i.child.stderr?.setEncoding(`utf8`),i.child.stderr?.on(`data`,e=>{s=Ae(s,String(e))}),{pid:a,wait:i.wait,isAlive:()=>i.child.exitCode===null&&i.child.signalCode===null,signal:e=>{o(a,e)||i.child.kill(e)},readLog:()=>s}}async function Oe(e,t){if(t.signal?.aborted)throw b(`cancelled`,`abort-signal`);let n=Math.max(1,Math.floor(t.timeoutMs));return await new Promise((r,i)=>{let a=de.createConnection({path:e}),o=!1,s=!1,c=setTimeout(()=>{p(b(`timeout`,`bridge-connect-timeout`)),a.destroy()},n),l=()=>{p(b(`cancelled`,`abort-signal`)),a.destroy()},u=()=>{o=!0,clearTimeout(c),t.signal?.removeEventListener(`abort`,l),a.off(`error`,d),a.off(`close`,f),a.setTimeout(0),r(a)},d=e=>{p(e),a.destroy()},f=()=>{o||p(b(`transport-failure`,`bridge-closed-before-connect`))},p=e=>{s||o||(s=!0,clearTimeout(c),t.signal?.removeEventListener(`abort`,l),a.off(`connect`,u),a.off(`error`,d),a.off(`close`,f),i(e))};a.once(`connect`,u),a.once(`error`,d),a.once(`close`,f),t.signal?.addEventListener(`abort`,l,{once:!0}),t.signal?.aborted&&l()})}async function ke(e,t){let n=c(),r=t.deadline,i=f({lockDirPath:e,owner:{pid:n,startTime:s(n),acquiredAtMs:Date.now()},timeoutMs:S(r,`cache-lock-deadline`),pollMs:100,ownerGraceMs:5e3,description:`iOS Simulator snapshot bridge cache`}),a=r.signal;if(!a)return await i;let o=!1,l,u=new Promise((e,t)=>{l=()=>{o=!0,t(b(`cancelled`,`abort-signal`))},a.addEventListener(`abort`,l,{once:!0}),a.aborted&&l()});try{return await Promise.race([i,u])}catch(e){throw o&&i.then(e=>e(),()=>void 0),r.clock.isExpired()&&!(e instanceof y&&e.failureKind===`cancelled`)?b(`timeout`,`cache-lock-deadline`):e}finally{a.removeEventListener(`abort`,l)}}function Ae(e,t){let n=e+t;return n.length<=R?n:n.slice(n.length-R)}function je(e,t,n){let r=g(`sha256`).update(t).digest(`hex`).slice(0,12),i=g(`sha256`).update(n).digest(`hex`).slice(0,12);return h.join(`/tmp`,`agent-device-ax-${r}-${e.processId()}-${i}`,`snapshot.sock`)}const z=new WeakSet;async function B(e,t){let n;try{n=(await t.wait).exitCode}catch{n=void 0}return z.has(t)||(z.add(t),e.emitDiagnostic({level:`error`,phase:`ios.snapshot-source.bridge-process-exit`,data:{pid:t.pid,...n===void 0?{}:{exitCode:n},stderr:Me(t.readLog())}})),b(`process-crash`,`bridge-exited`,{pid:t.pid,...n===void 0?{}:{exitCode:n}})}function Me(e){let t=v.from(e);return t.length<=65536?e:t.subarray(-65536).toString(`utf8`)}async function V(e){let t=new O(e.limits.maxResponseBytes-4),n=S(e.deadline,`bridge-request-deadline`);return await new Promise((r,i)=>{let a=!1,o=!1,s=setTimeout(()=>{p(b(`timeout`,`bridge-request-deadline`,{dispatched:o})),e.socket.destroy()},n),c=()=>{p(b(`cancelled`,`abort-signal`,{dispatched:o})),e.socket.destroy()},l=n=>{try{if(!Buffer.isBuffer(n))throw b(`transport-failure`,`bridge-data-invalid`);let r=t.push(n);if(r){let t=k(r);if(j(t,e.requestId),M(t,{pid:e.expectedPid,generation:e.expectedGeneration}),t.ok!==!0&&N(t),typeof t.truncated!=`boolean`)throw b(`malformed-tree`,`truncated-invalid`);f(t);return}}catch(t){p(t),e.socket.destroy()}},u=e=>p(x(e)),d=()=>{a||(e.process.isAlive()?p(b(`transport-failure`,`bridge-connection-closed`)):B(e.host,e.process).then(p))};e.process.wait.then(()=>{a||B(e.host,e.process).then(p)},e=>{a||p(x(e))});let f=e=>m(()=>r(e)),p=e=>m(()=>i(e)),m=t=>{a||(a=!0,clearTimeout(s),e.deadline.signal?.removeEventListener(`abort`,c),e.socket.off(`data`,l),e.socket.off(`error`,u),e.socket.off(`close`,d),t())};e.socket.on(`data`,l),e.socket.on(`error`,u),e.socket.on(`close`,d),e.deadline.signal?.addEventListener(`abort`,c,{once:!0});try{if(e.deadline.signal?.aborted)throw b(`cancelled`,`abort-signal`);o=!0,e.socket.write(e.frame)}catch(t){p(x(t)),e.socket.destroy()}})}var Ne=class{sessions=new Map;requestQueues=new Map;ownerId=_();closed=!1;host;constructor(e){this.host=e}async request(e){if(this.closed)throw b(`unsupported`,`source-closed`);return await this.withSimulatorLock(e.target.udid,e.deadline,()=>this.requestInSimulator(e))}async requestInSimulator(e){if(this.closed)throw b(`unsupported`,`source-closed`);let t=e.deadline;S(t,`bridge-request-deadline`);let n=this.sessions.get(e.target.udid),r=await this.ensureSession(e,t);try{let n=await this.readTargetStartTime(e.target,t),i=await this.exchange(r,e,t);return await this.assertTargetStillCurrent(e.target,n,t),i}catch(e){throw await this.handleRequestFailure(e,r,n)}}async handleRequestFailure(e,t,n){let r=x(e);return Fe(r,t,n)?await this.removeSession(t,!0):r.failureKind===`process-crash`?await this.removeSession(t,!1):r.failureKind===`transport-failure`&&(t.socket?.destroy(),t.socket=void 0),r}async withSimulatorLock(e,t,n){let r=this.requestQueues.get(e)??Promise.resolve(),i,a=new Promise(e=>{i=e}),o=r.then(()=>a);this.requestQueues.set(e,o);try{return await Pe(r,t),await n()}finally{i(),this.requestQueues.get(e)===o&&this.requestQueues.delete(e)}}async close(){if(this.closed)return;this.closed=!0;let e=[...this.sessions.values()];this.sessions.clear(),await Promise.all(e.map(async e=>await this.dispose(e,!0)))}async ensureSession(e,t){let n=e.target.udid,r=this.sessions.get(n);if(r&&r.bridgePath===e.bridge.path&&r.process.isAlive())return(!r.socket||r.socket.destroyed)&&(r.socket=await this.connectUntilReady(r,t)),r;r&&await this.removeSession(r,!0);let i=je(this.host,e.target.udid,this.ownerId);await this.host.ensureDirectory(h.dirname(i)),await this.host.remove(i);let a=this.host.start(e.target.udid,e.bridge.path,i,{signal:t.signal}),o={udid:e.target.udid,bridgePath:e.bridge.path,socketPath:i,process:a};this.sessions.set(n,o);try{return o.socket=await this.connectUntilReady(o,t),o}catch(e){throw await this.removeSession(o,!0),x(e)}}async connectUntilReady(e,t){let n;for(;;){let r=S(t,`bridge-connect-deadline`);if(!e.process.isAlive())throw await B(this.host,e.process);try{return await this.host.connect(e.socketPath,{signal:t.signal,timeoutMs:Math.min(250,r)})}catch(e){if(n=e,e instanceof y&&e.failureKind===`cancelled`)throw e;let r=Math.min(20,S(t,`bridge-connect-deadline`));try{await C(t,r,`bridge-connect-deadline`)}catch(e){throw x(e)}}if(n instanceof y&&n.failureKind===`timeout`)throw n}}async exchange(e,t,n){(!e.socket||e.socket.destroyed)&&(e.socket=await this.connectUntilReady(e,n));let r=_(),i=be(A({requestId:r,pid:t.target.pid,generation:t.target.generation,maxDepth:Math.min(t.limits.maxTraversalDepth,t.maxDepth),maxNodes:t.limits.maxNodes,maxDurationMs:S(n,`bridge-request-deadline`),maxResponseBytes:t.limits.maxResponseBytes,...t.nativeLevelsHint===void 0?{}:{nativeLevelsHint:t.nativeLevelsHint}}),t.limits);return await V({process:e.process,socket:e.socket,frame:i,requestId:r,deadline:n,limits:t.limits,expectedPid:t.target.pid,expectedGeneration:t.target.generation,host:this.host})}async readTargetStartTime(e,t){let n=await this.host.readTargetProcessStartTime(e.pid,{signal:t.signal,timeoutMs:S(t,`target-identity-deadline`)});if(!n)throw b(`stale-target`,`target-process-unavailable`,{pid:e.pid,generation:e.generation});if(e.processStartTime!==void 0&&e.processStartTime!==n)throw b(`stale-target`,`target-process-changed`,{pid:e.pid,generation:e.generation,expectedStartTime:e.processStartTime,observedStartTime:n});return n}async assertTargetStillCurrent(e,t,n){let r=await this.host.readTargetProcessStartTime(e.pid,{signal:n.signal,timeoutMs:S(n,`target-identity-deadline`)});if(r!==t)throw b(`stale-target`,`target-process-changed`,{pid:e.pid,generation:e.generation,expectedStartTime:t,observedStartTime:r})}async removeSession(e,t){this.sessions.get(e.udid)===e&&this.sessions.delete(e.udid),await this.dispose(e,t)}async dispose(e,t){e.socket?.destroy(),e.socket=void 0,t&&e.process.isAlive()&&(e.process.signal(`SIGTERM`),await H(e.process,500),e.process.isAlive()&&(e.process.signal(`SIGKILL`),await H(e.process,500))),await this.host.remove(e.socketPath)}};async function Pe(e,t){let n=S(t,`bridge-request-deadline`);await Promise.race([e,C(t,n,`bridge-request-deadline`).then(()=>{throw b(`timeout`,`bridge-request-deadline`)})])}function Fe(e,t,n){return(e.failureKind===`cancelled`||e.failureKind===`timeout`)&&(e.details?.dispatched===!0||n!==t)}async function H(e,t){await Promise.race([e.wait.catch(()=>void 0),new Promise(e=>setTimeout(e,t))])}const U=16777216,W=12e4,G=1e4,Ie=Object.freeze({maxRequestBytes:65536,maxResponseBytes:4194304,maxNodes:1500,maxTraversalDepth:64,maxDurationMs:5e3});function Le(e){let n={...Ie,...e??{}};for(let[e,r]of Object.entries(n))if(!Number.isSafeInteger(r)||r<=0)throw new t(`INVALID_ARGS`,`Snapshot source limit ${e} must be a positive integer`,{name:e,value:r});if(n.maxRequestBytes>n.maxResponseBytes)throw new t(`INVALID_ARGS`,`Snapshot source request bytes cannot exceed response bytes`,{maxRequestBytes:n.maxRequestBytes,maxResponseBytes:n.maxResponseBytes});if(n.maxRequestBytes>U||n.maxResponseBytes>U)throw new t(`INVALID_ARGS`,`Snapshot source frame limits exceed the bridge bound`,{maxRequestBytes:n.maxRequestBytes,maxResponseBytes:n.maxResponseBytes,maximumFrameBytes:U});if(n.maxNodes>G||n.maxTraversalDepth>128)throw new t(`INVALID_ARGS`,`Snapshot source tree limits exceed the bridge bound`,{maxNodes:n.maxNodes,maxTraversalDepth:n.maxTraversalDepth,maximumNodes:G,maximumDepth:128});if(n.maxDurationMs>W)throw new t(`INVALID_ARGS`,`Snapshot source duration exceeds the bridge bound`,{maxDurationMs:n.maxDurationMs,maximumDurationMs:W});if(n.maxRequestBytes<=4||n.maxResponseBytes<=4)throw new t(`INVALID_ARGS`,`Snapshot source frame limits must leave room for a body`,{maxRequestBytes:n.maxRequestBytes,maxResponseBytes:n.maxResponseBytes});return Object.freeze(n)}const K=Object.freeze({elementType:`XC_kAXXCAttributeElementType`,elementBaseType:`XC_kAXXCAttributeElementBaseType`,label:`XC_kAXXCAttributeLabel`,value:`XC_kAXXCAttributeValue`,identifier:`XC_kAXXCAttributeIdentifier`,frame:`XC_kAXXCAttributeFrame`,automationType:`XC_kAXXCAttributeAutomationType`,children:`XC_kAXXCAttributeChildren`}),q=`Other.Other.Application.Group.Window.Sheet.Drawer.Alert.Dialog.Button.RadioButton.RadioGroup.CheckBox.DisclosureTriangle.PopUpButton.ComboBox.MenuButton.ToolbarButton.Popover.Keyboard.Key.NavigationBar.TabBar.TabGroup.Toolbar.StatusBar.Table.TableRow.TableColumn.Outline.OutlineRow.Browser.CollectionView.Slider.PageIndicator.ProgressIndicator.ActivityIndicator.SegmentedControl.Picker.PickerWheel.Switch.Toggle.Link.Image.Icon.SearchField.ScrollView.ScrollBar.StaticText.TextField.SecureTextField.DatePicker.TextView.Menu.MenuItem.MenuBar.MenuBarItem.Map.WebView.IncrementArrow.DecrementArrow.Timeline.RatingIndicator.ValueIndicator.SplitGroup.Splitter.RelevanceIndicator.ColorWell.HelpTag.Matte.DockItem.Ruler.RulerMarker.Grid.LevelIndicator.Cell.LayoutArea.LayoutItem.Handle.Stepper.Tab.TouchBar.StatusItem`.split(`.`),J={UIApplication:`Application`,UIWindow:`Window`},Re=new Set(Object.values(K));function ze(e,t,n){let r=Array.isArray(e)?e:[e];if(r.length===0||r.some(e=>!P(e)))throw b(`malformed-tree`,`guest-tree-root-invalid`);let i=[],a=[],o=0;for(let e of r)c(e,void 0,0,!1);if(i.length>n.maxNodes)throw b(`malformed-tree`,`node-limit-exceeded`,{nodeCount:i.length,maxNodes:n.maxNodes});if(o>n.maxTraversalDepth)throw b(`malformed-tree`,`traversal-depth-exceeded`,{maxTraversalDepth:o,maxAllowedDepth:n.maxTraversalDepth});if(typeof t.truncated!=`boolean`)throw b(`malformed-tree`,`truncated-invalid`);let s=We(i.find(e=>e.type===`Application`||e.type===`Window`));return{nodes:i,maxTraversalDepth:o,viewport:s,opaqueRemoteElements:a.filter(e=>He(e,s)).length};function c(e,t,r,s){if(i.length>=n.maxNodes)throw b(`malformed-tree`,`node-limit-exceeded`,{maxNodes:n.maxNodes});for(let t of Object.keys(e))if(!Re.has(t))throw b(`malformed-tree`,`node-contains-unknown-field`,{key:t});let l=e[K.children];if(!Array.isArray(l))throw b(`malformed-tree`,`children-invalid`);let u=i.length,d=Be(e,u,t,r);i.push(d),o=Math.max(o,r),Ve(d,l.length,s)&&a.push(d.rect);let f=s||d.type===`WebView`;for(let e of l){if(!P(e))throw b(`malformed-tree`,`child-invalid`);c(e,u,r+1,f)}}}function Be(e,t,n,r){let i=X(e[K.elementType]),a=X(e[K.elementBaseType]),o=Ge(e[K.automationType]),s=Ue(e[K.frame]);return{index:t,...n===void 0?{}:{parentIndex:n},...Y(i,o)?{type:Y(i,o)}:{},...i?{role:i}:{},...a&&a!==i?{subrole:a}:{},...X(e[K.label])?{label:X(e[K.label])}:{},...Z(e[K.value])?{value:Z(e[K.value])}:{},...X(e[K.identifier])?{identifier:X(e[K.identifier])}:{},...s?{rect:s}:{},depth:r}}function Y(e,t){if(e!==void 0&&J[e])return J[e];if(e!==void 0&&q.includes(e))return e;if(t!==void 0)return q[t]??`Other`}function Ve(e,t,n){return n&&e.role===`AXRemoteElement`&&t===0}function He(e,t){return e===void 0?!0:n(e)?t.kind!==`reported`||r(e,t.rect):!1}function Ue(e){if(e===void 0)return;if(!P(e))throw b(`malformed-tree`,`frame-invalid`);let t=[`X`,`Y`,`Width`,`Height`].map(t=>e[t]);if(!t.every(e=>typeof e==`number`&&Number.isFinite(e)))throw b(`malformed-tree`,`frame-invalid`);let[n,r,i,a]=t;if(i<0||a<0)throw b(`malformed-tree`,`frame-invalid`);return{x:n,y:r,width:i,height:a}}function We(e){return!e||e.type!==`Application`&&e.type!==`Window`?{kind:`missing`,reason:`not-provided`}:n(e.rect)?{kind:`reported`,rect:e.rect}:{kind:`missing`,reason:e.rect?`invalid`:`not-provided`}}function X(e){return typeof e==`string`&&e.length>0?e:void 0}function Z(e){if(typeof e==`string`)return e.length>0?e:void 0;if(typeof e==`number`||typeof e==`boolean`)return String(e);if(e!=null)throw b(`malformed-tree`,`scalar-invalid`)}function Ge(e){if(e!=null){if(!Number.isSafeInteger(e))throw b(`malformed-tree`,`automation-type-invalid`);return e}}const Q=`simulator-ax-bridge`;function Ke(e={}){let t=e.host??Ee(),n=new Ne(t),r=new Te,i=new Map,a=!1,o=async n=>{if(a)throw b(`unsupported`,`source-closed`);let r=i.get(n.runtime);if(r)return r;let o=await t.withDiagnosticTimer(`ios.snapshot-source.prepare`,async()=>await xe({host:t,runtime:n.runtime,limits:n.limits,deadline:n.deadline,sourceRoot:e.sourceRoot,cacheRoot:e.cacheRoot}),{producer:Q});return i.set(n.runtime,o),o};return{acquire:async i=>{try{if(a)throw b(`unsupported`,`source-closed`);qe(i);let s=Le({...e.limits,...i.limits}),c=pe(s.maxDurationMs,i.signal),l=Ye(i.hint,s.maxTraversalDepth),u=l+1,d=i.hint.rawTraversalDepth!==null;return await t.withDiagnosticTimer(`ios.snapshot-source.acquire`,async()=>{let e=await o({runtime:i.target.runtime,limits:s,deadline:c}),a=r.consume(i.target,u,d),f=await n.request({target:i.target,bridge:e,limits:s,maxDepth:l,nativeLevelsHint:a.nativeLevels,deadline:c});S(c,`snapshot-decode-deadline`);let p=Xe(i.hint,i.target,f,s,l);return Je(t,r,i.target,u,d,a,f),{stage:`acquired`,acquisition:p}},{producer:Q})}catch(e){let t=x(e);return{stage:`failed`,failure:{kind:t.failureKind,code:t.failureCode,...t.details?{details:t.details}:{}}}}},close:async()=>{a||(a=!0,await n.close())}}}function qe(e){if(!e.target.udid.trim()||!e.target.runtime.trim()||!e.target.generation.trim()||!Number.isSafeInteger(e.target.pid)||e.target.pid<=0)throw new t(`INVALID_ARGS`,`Simulator snapshot source target identity is incomplete`);let n=e.hint;if(n.projection!==`raw`&&n.projection!==`regular`||![`full`,`surface-observation`].includes(n.acquisitionIntent)||typeof n.interactiveOnly!=`boolean`||typeof n.customActions!=`boolean`||!$(n.rawTraversalDepth)||!$(n.regularPresentedDepth))throw new t(`INVALID_ARGS`,`Simulator snapshot source capture hint is invalid`)}function Je(e,t,n,r,i,a,o){let s=ye(o),c=o.truncated===!0,l=t.learn(n,r,i,s);e.emitDiagnostic({level:`debug`,phase:`ios_snapshot_source_recovery`,data:{producer:Q,...n.targetId?{targetId:n.targetId}:{},generation:n.generation,requestedLevels:r,hint:a.reason,...a.nativeLevels===void 0?{}:{hintedLevels:a.nativeLevels},...s,truncated:c,learning:l}})}function Ye(e,n){let r=e.rawTraversalDepth??n;if(r>n)throw new t(`INVALID_ARGS`,`Simulator snapshot source depth exceeds its bound`,{requested:r,maximum:n});return r}function $(e){return e===null||Number.isSafeInteger(e)&&e>=0}function Xe(e,t,n,r,i){if(n.automationEnabled!==!0)throw b(`unsupported`,`automation-mode-unavailable`);let a=n.tree,o=n.truncated;if(typeof o!=`boolean`)throw b(`malformed-tree`,`truncated-invalid`);let s=ze(a,{truncated:o},r),c=n.generation;if(typeof c!=`string`||!c)throw b(`malformed-tree`,`generation-invalid`);if(s.opaqueRemoteElements>0)throw b(`unsupported`,`remote-content-boundary`,{remoteElements:s.opaqueRemoteElements});let l=Object.freeze(s.nodes.map(e=>Object.freeze({...e,pid:t.pid}))),u=Ze(e,o,s,r,i,l.length),d=Object.freeze({...t.targetId?{targetId:t.targetId}:{},generation:c}),f={producer:Q,nodes:l,truncated:o,viewport:s.viewport,lineage:d,residue:u};return e.acquisitionIntent===`full`?{...f,intent:`full`,hint:{...e,acquisitionIntent:`full`}}:{...f,intent:`surface-observation`,hint:{...e,acquisitionIntent:`surface-observation`}}}function Ze(e,t,n,r,i,a){return Object.freeze([{kind:`unavailable-fact`,fact:`hittability`},...e.interactiveOnly?[{kind:`unavailable-fact`,fact:`interactive-query`}]:[],...t?[Qe(n.maxTraversalDepth,a,r,i)]:[],...n.viewport.kind===`missing`?[{kind:`missing-viewport`,reason:n.viewport.reason}]:[]])}function Qe(e,t,n,r){return t>=n.maxNodes?{kind:`truncated`,dimension:`nodes`,limit:n.maxNodes}:e>=r?{kind:`truncated`,dimension:`depth`,limit:r}:{kind:`truncated`,dimension:`payload`,limit:n.maxResponseBytes}}export{Ke as createSimulatorSnapshotSource};
|
|
1
|
+
import{A as e,C as t}from"./sdk-contracts.js";import{Br as n,zr as r}from"./sdk-batch.js";import{c as i,r as a}from"./diagnostics.js";import{C as o,f as s,x as c}from"./owner-identity.js";import{c as l,l as u,r as d}from"./exec.js";import{t as f}from"./file.js";import"./diagnostics2.js";import"./command.js";import{n as p}from"./retry.js";import{n as m}from"./version.js";import"./process.js";import{C as ee,D as te,c as ne,f as re,h as ie,n as ae,o as oe,w as se,y as ce}from"./host-file.js";import{t as le}from"./apple-runner-platform.js";import{t as ue}from"./snapshot-process.js";import h from"node:path";import{createHash as g,randomUUID as _}from"node:crypto";import de from"node:net";import{Buffer as v}from"node:buffer";const fe={unsupported:`UNSUPPORTED_OPERATION`,"malformed-tree":`COMMAND_FAILED`,"stale-target":`COMMAND_FAILED`,timeout:`COMMAND_FAILED`,cancelled:`COMMAND_FAILED`,"process-crash":`COMMAND_FAILED`,"transport-failure":`COMMAND_FAILED`};var y=class extends t{failureKind;failureCode;constructor(e,t,n=`iOS Simulator snapshot source ${e}: ${t}`,r={},i){super(fe[e],n,{...r,bridgeFailure:e,bridgeFailureCode:t,...e===`cancelled`?{reason:`request_canceled`}:{}},i),this.name=`SnapshotSourceError`,this.failureKind=e,this.failureCode=t}};function b(e,t,n={},r){return new y(e,t,void 0,n,r)}function x(n){return n instanceof y?n:e(n)?b(`cancelled`,`abort-signal`,{},n):n instanceof t&&typeof n.details?.timeoutMs==`number`?b(`timeout`,`host-operation-timeout`,{timeoutMs:n.details.timeoutMs},n):b(`transport-failure`,`unexpected-host-error`,{error:n instanceof Error?n.message:String(n)},n)}function pe(e,t,n=Date.now){if(t?.aborted)throw b(`cancelled`,`abort-signal`);return{clock:p.fromTimeoutMs(e,n()),now:n,signal:t}}function S(e,t){if(e.signal?.aborted)throw b(`cancelled`,`abort-signal`);let n=e.clock.remainingMs(e.now());if(n<=0)throw b(`timeout`,t);return Math.max(1,Math.floor(n))}async function C(e,t,n){let r=Math.min(t,S(e,n));await new Promise((t,n)=>{let i=!1,a=setTimeout(()=>s(t),r),o=()=>{s(()=>n(b(`cancelled`,`abort-signal`)))},s=t=>{i||(i=!0,clearTimeout(a),e.signal?.removeEventListener(`abort`,o),t())};e.signal?.addEventListener(`abort`,o,{once:!0}),e.signal?.aborted&&o()})}const w=[`SnapshotBridge.m`,`SnapshotBridgeRuntime.m`,`SnapshotBridgeRuntime.h`,`SnapshotBridgeCapture.h`,`SnapshotBridgeCapture.m`],me=[`SnapshotBridge.m`,`SnapshotBridgeRuntime.m`,`SnapshotBridgeCapture.m`];async function he(e,t,n){let r=g(`sha256`);for(let i of w){let a=h.join(t,i);if(S(n,`native-source-fingerprint-deadline`),!e.exists(a))throw b(`unsupported`,`native-source-missing`,{filePath:a});r.update(i),r.update(`\0`),r.update(await e.readBinary(a)),r.update(`\0`)}return r.digest(`hex`)}async function ge(e,t,n){let r=await T(e,`xcodebuild`,[`-version`],n),i=await T(e,`sw_vers`,[`-productVersion`],n),a=await T(e,`sw_vers`,[`-buildVersion`],n),o=await T(e,`uname`,[`-m`],n),s=await T(e,`xcrun`,[`--sdk`,`iphonesimulator`,`--show-sdk-version`],n),c=t.trim();if(!c)throw b(`unsupported`,`simulator-runtime-missing`);if(o!==`arm64`&&o!==`x86_64`)throw b(`unsupported`,`simulator-architecture-unsupported`,{architecture:o});return{xcode:r,macosProductVersion:i,macosBuild:a,architecture:o,simulatorSdk:s,simulatorRuntime:c}}async function T(e,t,n,r){let i=await _e(e,t,n,r);if(i.exitCode!==0)throw b(`unsupported`,`toolchain-probe-failed`,{command:t,exitCode:i.exitCode,stderr:i.stderr.slice(0,1024)});let a=(i.stdout||i.stderr).trim();if(!a)throw b(`unsupported`,`toolchain-probe-empty`,{command:t});return a}async function _e(e,t,n,r){try{return await E(e,t,n,r)}catch(i){if(!d(i))throw i;if(r.signal?.aborted)throw b(`cancelled`,`abort-signal`);if(r.clock.remainingMs(r.now())<=0)throw i;return await E(e,t,n,r)}}function E(e,t,n,r){return e.run(t,n,{allowFailure:!0,signal:r.signal,timeoutMs:Math.min(le,S(r,`toolchain-probe-deadline`))})}const D=`agent-device-simulator-ax-v1.5.5`;Object.freeze([`verb`,`requestId`,`pid`,`generation`,`snapshotTree`,`automationMode`,`maxDepth`,`maxNodes`,`maxDurationMs`,`maxResponseBytes`,`nativeLevelsHint`]),Object.freeze([`protocolVersion`,`sourceVersion`,`requestId`,`generation`,`ok`,`pid`,`tree`,`truncated`,`automationEnabled`,`recovery`,`error_kind`,`error_code`,`error`]),Object.freeze([`XC_kAXXCAttributeElementType`,`XC_kAXXCAttributeElementBaseType`,`XC_kAXXCAttributeLabel`,`XC_kAXXCAttributeValue`,`XC_kAXXCAttributeIdentifier`,`XC_kAXXCAttributeFrame`,`XC_kAXXCAttributeAutomationType`,`XC_kAXXCAttributeChildren`]);const ve=[`requests`,`rejected`,`continuations`,`acceptedLevels`];function ye(e){let t=e.recovery;if(!P(t))throw b(`malformed-tree`,`recovery-invalid`);let n=ve.map(e=>[e,t[e]]);if(n.some(([,e])=>!Number.isSafeInteger(e)||e<0))throw b(`malformed-tree`,`recovery-invalid`);return Object.freeze(Object.fromEntries(n))}function be(e,t){let n;try{n=v.from(JSON.stringify(e),`utf8`)}catch(e){throw b(`malformed-tree`,`request-not-json`,{},e)}let r=n.length+4;if(r>t.maxRequestBytes)throw b(`transport-failure`,`request-limit-exceeded`,{frameBytes:r,maxRequestBytes:t.maxRequestBytes});let i=v.alloc(4);return i.writeUInt32BE(n.length,0),v.concat([i,n])}var O=class{header=v.alloc(4);headerBytes=0;chunks=[];payloadBytes=0;expectedBodyBytes;frame;maxFrameBytes;constructor(e){if(!Number.isSafeInteger(e)||e<=0)throw b(`malformed-tree`,`frame-limit-invalid`,{maxFrameBytes:e});this.maxFrameBytes=e}push(e){if(this.frame)return this.acceptTrailingChunk(e);let t=this.readHeader(e);if(t&&(this.appendPayload(e,t.offset,t.bodyBytes),this.payloadBytes===t.bodyBytes))return this.frame=v.concat(this.chunks,t.bodyBytes),this.frame}acceptTrailingChunk(e){if(e.length>0)throw b(`malformed-tree`,`multiple-frames`,{trailingBytes:e.length});return this.frame}readHeader(e){if(this.headerBytes===4)return{offset:0,bodyBytes:this.expectedBodyBytes};let t=Math.min(4-this.headerBytes,e.length);if(e.copy(this.header,this.headerBytes,0,t),this.headerBytes+=t,this.headerBytes<4)return;let n=this.header.readUInt32BE(0);if(n===0||n>this.maxFrameBytes)throw b(`malformed-tree`,`frame-limit-exceeded`,{bodyBytes:n,maxFrameBytes:this.maxFrameBytes});return this.expectedBodyBytes=n,{offset:t,bodyBytes:n}}appendPayload(e,t,n){let r=n-this.payloadBytes,i=e.length-t;if(i>r)throw b(`malformed-tree`,`multiple-frames`,{trailingBytes:i-r});i!==0&&(this.chunks.push(e.subarray(t)),this.payloadBytes+=i)}finish(){if(this.frame)return this.frame;throw b(`transport-failure`,`bridge-frame-incomplete`,{headerBytes:this.headerBytes,payloadBytes:this.payloadBytes,expectedBodyBytes:this.expectedBodyBytes})}};function k(e){let t;try{t=JSON.parse(e.toString(`utf8`))}catch(e){throw b(`malformed-tree`,`response-not-json`,{},e)}if(!P(t))throw b(`malformed-tree`,`response-not-object`);return t}function A(e){return Object.freeze({verb:`describe`,requestId:e.requestId,pid:e.pid,generation:e.generation,snapshotTree:!0,automationMode:!0,maxDepth:e.maxDepth,maxNodes:e.maxNodes,maxDurationMs:e.maxDurationMs,maxResponseBytes:e.maxResponseBytes,...e.nativeLevelsHint===void 0?{}:{nativeLevelsHint:e.nativeLevelsHint}})}function j(e,t){if(e.protocolVersion!==1)throw b(`transport-failure`,`protocol-version-mismatch`,{expected:1,observed:e.protocolVersion});if(e.sourceVersion!==`agent-device-simulator-ax-v1.5.5`)throw b(`transport-failure`,`source-version-mismatch`,{expected:D,observed:e.sourceVersion});if(e.requestId!==t)throw b(`transport-failure`,`request-id-mismatch`,{expected:t,observed:e.requestId})}function M(e,t){if(typeof e.pid!=`number`||e.pid!==t.pid)throw b(`stale-target`,`bridge-pid-mismatch`,{expectedPid:t.pid,observedPid:e.pid});if(e.generation!==t.generation)throw b(`stale-target`,`bridge-generation-mismatch`,{expectedGeneration:t.generation,observedGeneration:e.generation})}function N(e){let t=e.error_kind,n=typeof e.error_code==`string`?e.error_code:`guest-error`,r=typeof e.error==`string`?e.error:void 0,i=r?{guestMessage:r.slice(0,1024)}:{};throw b(t===`unsupported`?`unsupported`:t===`malformed_tree`?`malformed-tree`:t===`application_not_responding`?`timeout`:t===`application_unavailable`?`transport-failure`:t===`bad_request`?`malformed-tree`:`transport-failure`,n,i)}function P(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}const F=`snapshot-bridge`,I=`manifest.json`;async function xe(e){let t=e.deadline,n=e.sourceRoot??Se(e.host),r=await he(e.host,n,t),i=await ge(e.host,e.runtime,t),a=we({schemaVersion:1,protocolVersion:1,sourceVersion:D,sourceHash:r,toolchain:i}),o=e.cacheRoot??h.join(e.host.homeDirectory(),`.agent-device`,`snapshot-source`),s=h.join(o,a),c=await e.host.acquireLock(h.join(o,`${a}.lock`),{deadline:t});try{let c=await Ce(e.host,s,{sourceHash:r,cacheKey:a,toolchain:i},t);if(c)return c;S(t,`native-build-deadline`),e.host.exists(s)&&await e.host.remove(s),S(t,`native-build-deadline`),await e.host.ensureDirectory(o);let l=h.join(o,`.${a}.${e.host.processId()}.tmp`);S(t,`native-build-deadline`),await e.host.remove(l);try{S(t,`native-build-deadline`),await e.host.ensureDirectory(l);let o=h.join(l,F),c=await e.host.run(`xcrun`,[`--sdk`,`iphonesimulator`,`clang`,`-arch`,i.architecture,`-mios-simulator-version-min=15.0`,`-fobjc-arc`,`-Werror`,`-Wall`,`-Wextra`,`-framework`,`Foundation`,`-framework`,`CoreGraphics`,...me.map(e=>h.join(n,e)),`-o`,o],{signal:t.signal,timeoutMs:Math.min(12e4,S(t,`native-build-deadline`)),allowFailure:!0});if(c.exitCode!==0||!e.host.exists(o))throw b(`unsupported`,`native-build-failed`,{exitCode:c.exitCode,stderr:c.stderr.slice(0,4096)});S(t,`native-build-deadline`),await e.host.chmod(o,493);let u=await L(e.host,o,t),d={schemaVersion:1,protocolVersion:1,sourceVersion:D,sourceHash:r,cacheKey:a,toolchain:i,binarySha256:u};return await e.host.writeText(h.join(l,I),`${JSON.stringify(d,null,2)}\n`),S(t,`native-build-deadline`),await e.host.rename(l,s),{path:h.join(s,F),sourceHash:r,cacheKey:a,protocolVersion:1,sourceVersion:D}}catch(t){throw await e.host.remove(l),t}}finally{await c()}}function Se(e){let t=e.projectRoot(),n=h.join(t,`apple`,`snapshot-bridge`);if(w.every(t=>e.exists(h.join(n,t))))return n;let r=h.join(t,`dist`,`apple`,`snapshot-bridge`);if(w.every(t=>e.exists(h.join(r,t))))return r;throw b(`unsupported`,`native-source-missing`,{projectRoot:t})}async function Ce(e,t,n,r){let i=h.join(t,F);if(!(!e.exists(i)||!e.exists(h.join(t,I))))try{let a=JSON.parse(await e.readText(h.join(t,I)));return a.schemaVersion!==1||a.protocolVersion!==1||a.sourceVersion!==`agent-device-simulator-ax-v1.5.5`||a.sourceHash!==n.sourceHash||a.cacheKey!==n.cacheKey||JSON.stringify(a.toolchain)!==JSON.stringify(n.toolchain)||typeof a.binarySha256!=`string`||await L(e,i,r)!==a.binarySha256?void 0:{path:i,sourceHash:n.sourceHash,cacheKey:n.cacheKey,protocolVersion:1,sourceVersion:D}}catch(e){if(e instanceof y&&(e.failureKind===`cancelled`||e.failureKind===`timeout`))throw e;return}}async function L(e,t,n){return S(n,`native-cache-hash-deadline`),g(`sha256`).update(await e.readBinary(t)).digest(`hex`)}function we(e){return g(`sha256`).update(JSON.stringify(e)).digest(`hex`).slice(0,32)}var Te=class{entries=new Map;probeBackAfterUses;constructor(e=8){this.probeBackAfterUses=e}consume(e,t,n){if(n)return{nativeLevels:void 0,reason:`explicit-depth`};let r=this.currentEntry(e);return r===`unidentified`?{nativeLevels:void 0,reason:`unidentified-target`}:!r||r.nativeLevels>=t?{nativeLevels:void 0,reason:`no-hint`}:r.remainingUses<=0?{nativeLevels:void 0,reason:`probe-back`}:(--r.remainingUses,{nativeLevels:r.nativeLevels,reason:`hinted`})}learn(e,t,n,r){return n||!e.targetId?`ignored`:r.rejected>0&&r.acceptedLevels<t?(this.remember(e.targetId,{generation:e.generation,nativeLevels:r.acceptedLevels,remainingUses:this.probeBackAfterUses}),`learned`):r.rejected===0&&r.acceptedLevels>=t?this.entries.delete(e.targetId)?`forgotten`:`ignored`:this.currentEntry(e)?`kept`:`ignored`}currentEntry(e){if(!e.targetId)return`unidentified`;let t=this.entries.get(e.targetId);if(t){if(t.generation!==e.generation){this.entries.delete(e.targetId);return}return t}}remember(e,t){if(this.entries.delete(e),this.entries.size>=32){let e=this.entries.keys().next().value;e!==void 0&&this.entries.delete(e)}this.entries.set(e,t)}};const R=65536;function Ee(){return{projectRoot:m,homeDirectory:re,run:async(e,t,n)=>await l(e,t,n),start:De,connect:z,readText:ce,readBinary:ie,writeText:te,ensureDirectory:oe,chmod:ae,exists:ne,rename:se,remove:ee,acquireLock:Oe,emitDiagnostic:a,withDiagnosticTimer:i,processId:s,readTargetProcessStartTime:ue}}function De(e,t,n,r={}){if(r.signal?.aborted)throw b(`cancelled`,`abort-signal`);let i=u(`xcrun`,[`simctl`,`spawn`,e,t,`serve`,n,`--idle-timeout`,`60`,`--exit-on-disconnect`,`false`],{allowFailure:!0,captureOutput:!1,detached:!0}),a=i.child.pid??0;if(a<=0)throw b(`transport-failure`,`bridge-process-pid-missing`);let s=``;return i.child.stderr?.setEncoding(`utf8`),i.child.stderr?.on(`data`,e=>{s=ke(s,String(e))}),{pid:a,wait:i.wait,isAlive:()=>i.child.exitCode===null&&i.child.signalCode===null,signal:e=>{o(a,e)||i.child.kill(e)},readLog:()=>s}}async function z(e,t){if(t.signal?.aborted)throw b(`cancelled`,`abort-signal`);let n=Math.max(1,Math.floor(t.timeoutMs));return await new Promise((r,i)=>{let a=de.createConnection({path:e}),o=!1,s=!1,c=setTimeout(()=>{p(b(`timeout`,`bridge-connect-timeout`)),a.destroy()},n),l=()=>{p(b(`cancelled`,`abort-signal`)),a.destroy()},u=()=>{o=!0,clearTimeout(c),t.signal?.removeEventListener(`abort`,l),a.off(`error`,d),a.off(`close`,f),a.setTimeout(0),r(a)},d=e=>{p(e),a.destroy()},f=()=>{o||p(b(`transport-failure`,`bridge-closed-before-connect`))},p=e=>{s||o||(s=!0,clearTimeout(c),t.signal?.removeEventListener(`abort`,l),a.off(`connect`,u),a.off(`error`,d),a.off(`close`,f),i(e))};a.once(`connect`,u),a.once(`error`,d),a.once(`close`,f),t.signal?.addEventListener(`abort`,l,{once:!0}),t.signal?.aborted&&l()})}async function Oe(e,t){let n=s(),r=t.deadline,i=f({lockDirPath:e,owner:{pid:n,startTime:c(n),acquiredAtMs:Date.now()},timeoutMs:S(r,`cache-lock-deadline`),pollMs:100,ownerGraceMs:5e3,description:`iOS Simulator snapshot bridge cache`}),a=r.signal;if(!a)return await i;let o=!1,l,u=new Promise((e,t)=>{l=()=>{o=!0,t(b(`cancelled`,`abort-signal`))},a.addEventListener(`abort`,l,{once:!0}),a.aborted&&l()});try{return await Promise.race([i,u])}catch(e){throw o&&i.then(e=>e(),()=>void 0),r.clock.isExpired()&&!(e instanceof y&&e.failureKind===`cancelled`)?b(`timeout`,`cache-lock-deadline`):e}finally{a.removeEventListener(`abort`,l)}}function ke(e,t){let n=e+t;return n.length<=R?n:n.slice(n.length-R)}function Ae(e,t,n){let r=g(`sha256`).update(t).digest(`hex`).slice(0,12),i=g(`sha256`).update(n).digest(`hex`).slice(0,12);return h.join(`/tmp`,`agent-device-ax-${r}-${e.processId()}-${i}`,`snapshot.sock`)}const B=new WeakSet;async function V(e,t){let n;try{n=(await t.wait).exitCode}catch{n=void 0}return B.has(t)||(B.add(t),e.emitDiagnostic({level:`error`,phase:`ios.snapshot-source.bridge-process-exit`,data:{pid:t.pid,...n===void 0?{}:{exitCode:n},stderr:je(t.readLog())}})),b(`process-crash`,`bridge-exited`,{pid:t.pid,...n===void 0?{}:{exitCode:n}})}function je(e){let t=v.from(e);return t.length<=65536?e:t.subarray(-65536).toString(`utf8`)}async function Me(e){let t=new O(e.limits.maxResponseBytes-4),n=S(e.deadline,`bridge-request-deadline`);return await new Promise((r,i)=>{let a=!1,o=!1,s=setTimeout(()=>{p(b(`timeout`,`bridge-request-deadline`,{dispatched:o})),e.socket.destroy()},n),c=()=>{p(b(`cancelled`,`abort-signal`,{dispatched:o})),e.socket.destroy()},l=n=>{try{if(!Buffer.isBuffer(n))throw b(`transport-failure`,`bridge-data-invalid`);let r=t.push(n);if(r){let t=k(r);if(j(t,e.requestId),M(t,{pid:e.expectedPid,generation:e.expectedGeneration}),t.ok!==!0&&N(t),typeof t.truncated!=`boolean`)throw b(`malformed-tree`,`truncated-invalid`);f(t);return}}catch(t){p(t),e.socket.destroy()}},u=e=>p(x(e)),d=()=>{a||(e.process.isAlive()?p(b(`transport-failure`,`bridge-connection-closed`)):V(e.host,e.process).then(p))};e.process.wait.then(()=>{a||V(e.host,e.process).then(p)},e=>{a||p(x(e))});let f=e=>m(()=>r(e)),p=e=>m(()=>i(e)),m=t=>{a||(a=!0,clearTimeout(s),e.deadline.signal?.removeEventListener(`abort`,c),e.socket.off(`data`,l),e.socket.off(`error`,u),e.socket.off(`close`,d),t())};e.socket.on(`data`,l),e.socket.on(`error`,u),e.socket.on(`close`,d),e.deadline.signal?.addEventListener(`abort`,c,{once:!0});try{if(e.deadline.signal?.aborted)throw b(`cancelled`,`abort-signal`);o=!0,e.socket.write(e.frame)}catch(t){p(x(t)),e.socket.destroy()}})}var Ne=class{sessions=new Map;requestQueues=new Map;ownerId=_();closed=!1;host;constructor(e){this.host=e}async request(e){if(this.closed)throw b(`unsupported`,`source-closed`);return await this.withSimulatorLock(e.target.udid,e.deadline,()=>this.requestInSimulator(e))}async requestInSimulator(e){if(this.closed)throw b(`unsupported`,`source-closed`);let t=e.deadline;S(t,`bridge-request-deadline`);let n=this.sessions.get(e.target.udid),r=await this.ensureSession(e,t);try{let n=await this.readTargetStartTime(e.target,t),i=await this.exchange(r,e,t);return await this.assertTargetStillCurrent(e.target,n,t),i}catch(e){throw await this.handleRequestFailure(e,r,n)}}async handleRequestFailure(e,t,n){let r=x(e);return Fe(r,t,n)?await this.removeSession(t,!0):r.failureKind===`process-crash`?await this.removeSession(t,!1):r.failureKind===`transport-failure`&&(t.socket?.destroy(),t.socket=void 0),r}async withSimulatorLock(e,t,n){let r=this.requestQueues.get(e)??Promise.resolve(),i,a=new Promise(e=>{i=e}),o=r.then(()=>a);this.requestQueues.set(e,o);try{return await Pe(r,t),await n()}finally{i(),this.requestQueues.get(e)===o&&this.requestQueues.delete(e)}}async close(){if(this.closed)return;this.closed=!0;let e=[...this.sessions.values()];this.sessions.clear(),await Promise.all(e.map(async e=>await this.dispose(e,!0)))}async ensureSession(e,t){let n=e.target.udid,r=this.sessions.get(n);if(r&&r.bridgePath===e.bridge.path&&r.process.isAlive())return(!r.socket||r.socket.destroyed)&&(r.socket=await this.connectUntilReady(r,t)),r;r&&await this.removeSession(r,!0);let i=Ae(this.host,e.target.udid,this.ownerId);await this.host.ensureDirectory(h.dirname(i)),await this.host.remove(i);let a=this.host.start(e.target.udid,e.bridge.path,i,{signal:t.signal}),o={udid:e.target.udid,bridgePath:e.bridge.path,socketPath:i,process:a};this.sessions.set(n,o);try{return o.socket=await this.connectUntilReady(o,t),o}catch(e){throw await this.removeSession(o,!0),x(e)}}async connectUntilReady(e,t){let n;for(;;){let r=S(t,`bridge-connect-deadline`);if(!e.process.isAlive())throw await V(this.host,e.process);try{return await this.host.connect(e.socketPath,{signal:t.signal,timeoutMs:Math.min(250,r)})}catch(e){if(n=e,e instanceof y&&e.failureKind===`cancelled`)throw e;let r=Math.min(20,S(t,`bridge-connect-deadline`));try{await C(t,r,`bridge-connect-deadline`)}catch(e){throw x(e)}}if(n instanceof y&&n.failureKind===`timeout`)throw n}}async exchange(e,t,n){(!e.socket||e.socket.destroyed)&&(e.socket=await this.connectUntilReady(e,n));let r=_(),i=be(A({requestId:r,pid:t.target.pid,generation:t.target.generation,maxDepth:Math.min(t.limits.maxTraversalDepth,t.maxDepth),maxNodes:t.limits.maxNodes,maxDurationMs:S(n,`bridge-request-deadline`),maxResponseBytes:t.limits.maxResponseBytes,...t.nativeLevelsHint===void 0?{}:{nativeLevelsHint:t.nativeLevelsHint}}),t.limits);return await Me({process:e.process,socket:e.socket,frame:i,requestId:r,deadline:n,limits:t.limits,expectedPid:t.target.pid,expectedGeneration:t.target.generation,host:this.host})}async readTargetStartTime(e,t){let n=await this.host.readTargetProcessStartTime(e.pid,{signal:t.signal,timeoutMs:S(t,`target-identity-deadline`)});if(!n)throw b(`stale-target`,`target-process-unavailable`,{pid:e.pid,generation:e.generation});if(e.processStartTime!==void 0&&e.processStartTime!==n)throw b(`stale-target`,`target-process-changed`,{pid:e.pid,generation:e.generation,expectedStartTime:e.processStartTime,observedStartTime:n});return n}async assertTargetStillCurrent(e,t,n){let r=await this.host.readTargetProcessStartTime(e.pid,{signal:n.signal,timeoutMs:S(n,`target-identity-deadline`)});if(r!==t)throw b(`stale-target`,`target-process-changed`,{pid:e.pid,generation:e.generation,expectedStartTime:t,observedStartTime:r})}async removeSession(e,t){this.sessions.get(e.udid)===e&&this.sessions.delete(e.udid),await this.dispose(e,t)}async dispose(e,t){e.socket?.destroy(),e.socket=void 0,t&&e.process.isAlive()&&(e.process.signal(`SIGTERM`),await H(e.process,500),e.process.isAlive()&&(e.process.signal(`SIGKILL`),await H(e.process,500))),await this.host.remove(e.socketPath)}};async function Pe(e,t){let n=S(t,`bridge-request-deadline`);await Promise.race([e,C(t,n,`bridge-request-deadline`).then(()=>{throw b(`timeout`,`bridge-request-deadline`)})])}function Fe(e,t,n){return(e.failureKind===`cancelled`||e.failureKind===`timeout`)&&(e.details?.dispatched===!0||n!==t)}async function H(e,t){await Promise.race([e.wait.catch(()=>void 0),new Promise(e=>setTimeout(e,t))])}const U=16777216,W=12e4,G=1e4,Ie=Object.freeze({maxRequestBytes:65536,maxResponseBytes:4194304,maxNodes:5e3,maxTraversalDepth:64,maxDurationMs:5e3});function Le(e){let n={...Ie,...e??{}};for(let[e,r]of Object.entries(n))if(!Number.isSafeInteger(r)||r<=0)throw new t(`INVALID_ARGS`,`Snapshot source limit ${e} must be a positive integer`,{name:e,value:r});if(n.maxRequestBytes>n.maxResponseBytes)throw new t(`INVALID_ARGS`,`Snapshot source request bytes cannot exceed response bytes`,{maxRequestBytes:n.maxRequestBytes,maxResponseBytes:n.maxResponseBytes});if(n.maxRequestBytes>U||n.maxResponseBytes>U)throw new t(`INVALID_ARGS`,`Snapshot source frame limits exceed the bridge bound`,{maxRequestBytes:n.maxRequestBytes,maxResponseBytes:n.maxResponseBytes,maximumFrameBytes:U});if(n.maxNodes>G||n.maxTraversalDepth>128)throw new t(`INVALID_ARGS`,`Snapshot source tree limits exceed the bridge bound`,{maxNodes:n.maxNodes,maxTraversalDepth:n.maxTraversalDepth,maximumNodes:G,maximumDepth:128});if(n.maxDurationMs>W)throw new t(`INVALID_ARGS`,`Snapshot source duration exceeds the bridge bound`,{maxDurationMs:n.maxDurationMs,maximumDurationMs:W});if(n.maxRequestBytes<=4||n.maxResponseBytes<=4)throw new t(`INVALID_ARGS`,`Snapshot source frame limits must leave room for a body`,{maxRequestBytes:n.maxRequestBytes,maxResponseBytes:n.maxResponseBytes});return Object.freeze(n)}const K=Object.freeze({elementType:`XC_kAXXCAttributeElementType`,elementBaseType:`XC_kAXXCAttributeElementBaseType`,label:`XC_kAXXCAttributeLabel`,value:`XC_kAXXCAttributeValue`,identifier:`XC_kAXXCAttributeIdentifier`,frame:`XC_kAXXCAttributeFrame`,automationType:`XC_kAXXCAttributeAutomationType`,children:`XC_kAXXCAttributeChildren`}),q=`Other.Other.Application.Group.Window.Sheet.Drawer.Alert.Dialog.Button.RadioButton.RadioGroup.CheckBox.DisclosureTriangle.PopUpButton.ComboBox.MenuButton.ToolbarButton.Popover.Keyboard.Key.NavigationBar.TabBar.TabGroup.Toolbar.StatusBar.Table.TableRow.TableColumn.Outline.OutlineRow.Browser.CollectionView.Slider.PageIndicator.ProgressIndicator.ActivityIndicator.SegmentedControl.Picker.PickerWheel.Switch.Toggle.Link.Image.Icon.SearchField.ScrollView.ScrollBar.StaticText.TextField.SecureTextField.DatePicker.TextView.Menu.MenuItem.MenuBar.MenuBarItem.Map.WebView.IncrementArrow.DecrementArrow.Timeline.RatingIndicator.ValueIndicator.SplitGroup.Splitter.RelevanceIndicator.ColorWell.HelpTag.Matte.DockItem.Ruler.RulerMarker.Grid.LevelIndicator.Cell.LayoutArea.LayoutItem.Handle.Stepper.Tab.TouchBar.StatusItem`.split(`.`),J={UIApplication:`Application`,UIWindow:`Window`},Re=new Set(Object.values(K));function ze(e,t,n){let r=Array.isArray(e)?e:[e];if(r.length===0||r.some(e=>!P(e)))throw b(`malformed-tree`,`guest-tree-root-invalid`);let i=[],a=[],o=0;for(let e of r)c(e,void 0,0,!1);if(i.length>n.maxNodes)throw b(`malformed-tree`,`node-limit-exceeded`,{nodeCount:i.length,maxNodes:n.maxNodes});if(o>n.maxTraversalDepth)throw b(`malformed-tree`,`traversal-depth-exceeded`,{maxTraversalDepth:o,maxAllowedDepth:n.maxTraversalDepth});if(typeof t.truncated!=`boolean`)throw b(`malformed-tree`,`truncated-invalid`);let s=We(i.find(e=>e.type===`Application`||e.type===`Window`));return{nodes:i,maxTraversalDepth:o,viewport:s,opaqueRemoteElements:a.filter(e=>He(e,s)).length};function c(e,t,r,s){if(i.length>=n.maxNodes)throw b(`malformed-tree`,`node-limit-exceeded`,{maxNodes:n.maxNodes});for(let t of Object.keys(e))if(!Re.has(t))throw b(`malformed-tree`,`node-contains-unknown-field`,{key:t});let l=e[K.children];if(!Array.isArray(l))throw b(`malformed-tree`,`children-invalid`);let u=i.length,d=Be(e,u,t,r);i.push(d),o=Math.max(o,r),Ve(d,l.length,s)&&a.push(d.rect);let f=s||d.type===`WebView`;for(let e of l){if(!P(e))throw b(`malformed-tree`,`child-invalid`);c(e,u,r+1,f)}}}function Be(e,t,n,r){let i=X(e[K.elementType]),a=X(e[K.elementBaseType]),o=Ge(e[K.automationType]),s=Ue(e[K.frame]);return{index:t,...n===void 0?{}:{parentIndex:n},...Y(i,o)?{type:Y(i,o)}:{},...i?{role:i}:{},...a&&a!==i?{subrole:a}:{},...X(e[K.label])?{label:X(e[K.label])}:{},...Z(e[K.value])?{value:Z(e[K.value])}:{},...X(e[K.identifier])?{identifier:X(e[K.identifier])}:{},...s?{rect:s}:{},depth:r}}function Y(e,t){if(e!==void 0&&J[e])return J[e];if(e!==void 0&&q.includes(e))return e;if(t!==void 0)return q[t]??`Other`}function Ve(e,t,n){return n&&e.role===`AXRemoteElement`&&t===0}function He(e,t){return e===void 0?!0:r(e)?t.kind!==`reported`||n(e,t.rect):!1}function Ue(e){if(e===void 0)return;if(!P(e))throw b(`malformed-tree`,`frame-invalid`);let t=[`X`,`Y`,`Width`,`Height`].map(t=>e[t]);if(!t.every(e=>typeof e==`number`&&Number.isFinite(e)))throw b(`malformed-tree`,`frame-invalid`);let[n,r,i,a]=t;if(i<0||a<0)throw b(`malformed-tree`,`frame-invalid`);return{x:n,y:r,width:i,height:a}}function We(e){return!e||e.type!==`Application`&&e.type!==`Window`?{kind:`missing`,reason:`not-provided`}:r(e.rect)?{kind:`reported`,rect:e.rect}:{kind:`missing`,reason:e.rect?`invalid`:`not-provided`}}function X(e){return typeof e==`string`&&e.length>0?e:void 0}function Z(e){if(typeof e==`string`)return e.length>0?e:void 0;if(typeof e==`number`||typeof e==`boolean`)return String(e);if(e!=null)throw b(`malformed-tree`,`scalar-invalid`)}function Ge(e){if(e!=null){if(!Number.isSafeInteger(e))throw b(`malformed-tree`,`automation-type-invalid`);return e}}const Q=`simulator-ax-bridge`;function Ke(e={}){let t=e.host??Ee(),n=new Ne(t),r=new Te,i=new Map,a=!1,o=async n=>{if(a)throw b(`unsupported`,`source-closed`);let r=i.get(n.runtime);if(r)return r;let o=await t.withDiagnosticTimer(`ios.snapshot-source.prepare`,async()=>await xe({host:t,runtime:n.runtime,limits:n.limits,deadline:n.deadline,sourceRoot:e.sourceRoot,cacheRoot:e.cacheRoot}),{producer:Q});return i.set(n.runtime,o),o};return{acquire:async i=>{try{if(a)throw b(`unsupported`,`source-closed`);qe(i);let s=Le({...e.limits,...i.limits}),c=pe(s.maxDurationMs,i.signal),l=Ye(i.hint,s.maxTraversalDepth),u=l+1,d=i.hint.rawTraversalDepth!==null;return await t.withDiagnosticTimer(`ios.snapshot-source.acquire`,async()=>{let e=await o({runtime:i.target.runtime,limits:s,deadline:c}),a=r.consume(i.target,u,d),f=await n.request({target:i.target,bridge:e,limits:s,maxDepth:l,nativeLevelsHint:a.nativeLevels,deadline:c});S(c,`snapshot-decode-deadline`);let p=Xe(i.hint,i.target,f,s);return Je(t,r,i.target,u,d,a,f),{stage:`acquired`,acquisition:p}},{producer:Q})}catch(e){let t=x(e);return{stage:`failed`,failure:{kind:t.failureKind,code:t.failureCode,...t.details?{details:t.details}:{}}}}},close:async()=>{a||(a=!0,await n.close())}}}function qe(e){if(!e.target.udid.trim()||!e.target.runtime.trim()||!e.target.generation.trim()||!Number.isSafeInteger(e.target.pid)||e.target.pid<=0)throw new t(`INVALID_ARGS`,`Simulator snapshot source target identity is incomplete`);let n=e.hint;if(n.projection!==`raw`&&n.projection!==`regular`||![`full`,`surface-observation`].includes(n.acquisitionIntent)||typeof n.interactiveOnly!=`boolean`||typeof n.customActions!=`boolean`||!$(n.rawTraversalDepth)||!$(n.regularPresentedDepth))throw new t(`INVALID_ARGS`,`Simulator snapshot source capture hint is invalid`)}function Je(e,t,n,r,i,a,o){let s=ye(o),c=o.truncated===!0,l=t.learn(n,r,i,s);e.emitDiagnostic({level:`debug`,phase:`ios_snapshot_source_recovery`,data:{producer:Q,...n.targetId?{targetId:n.targetId}:{},generation:n.generation,requestedLevels:r,hint:a.reason,...a.nativeLevels===void 0?{}:{hintedLevels:a.nativeLevels},...s,truncated:c,learning:l}})}function Ye(e,n){let r=e.rawTraversalDepth??n;if(r>n)throw new t(`INVALID_ARGS`,`Simulator snapshot source depth exceeds its bound`,{requested:r,maximum:n});return r}function $(e){return e===null||Number.isSafeInteger(e)&&e>=0}function Xe(e,t,n,r){if(n.automationEnabled!==!0)throw b(`unsupported`,`automation-mode-unavailable`);let i=n.tree,a=n.truncated;if(typeof a!=`boolean`)throw b(`malformed-tree`,`truncated-invalid`);let o=ze(i,{truncated:a},r),s=n.generation;if(typeof s!=`string`||!s)throw b(`malformed-tree`,`generation-invalid`);if(o.opaqueRemoteElements>0)throw b(`unsupported`,`remote-content-boundary`,{remoteElements:o.opaqueRemoteElements});let c=Object.freeze(o.nodes.map(e=>Object.freeze({...e,pid:t.pid}))),l=Ze(e,a,o.viewport),u=Object.freeze({...t.targetId?{targetId:t.targetId}:{},generation:s}),d={producer:Q,nodes:c,truncated:a,viewport:o.viewport,lineage:u,residue:l};return e.acquisitionIntent===`full`?{...d,intent:`full`,hint:{...e,acquisitionIntent:`full`}}:{...d,intent:`surface-observation`,hint:{...e,acquisitionIntent:`surface-observation`}}}function Ze(e,t,n){return Object.freeze([{kind:`unavailable-fact`,fact:`hittability`},...e.interactiveOnly?[{kind:`unavailable-fact`,fact:`interactive-query`}]:[],...t?[{kind:`truncated`}]:[],...n.kind===`missing`?[{kind:`missing-viewport`,reason:n.reason}]:[]])}export{Ke as createSimulatorSnapshotSource};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime.js";import{
|
|
1
|
+
import{r as e}from"./rolldown-runtime.js";import{rr as t}from"./sdk-batch.js";import{r as n}from"./diagnostics.js";import{c as r}from"./owner-identity.js";import"./diagnostics2.js";import{n as i}from"./process.js";import{_ as a,d as o}from"./host-file.js";import"./agent-browser-process-record.js";import s from"node:path";var c=e({DEFAULT_AGENT_BROWSER_IDLE_TIMEOUT_MS:()=>l,cleanupManagedAgentBrowserOrphans:()=>f,cleanupManagedAgentBrowserOrphansForProviderStartup:()=>p,resolveAgentBrowserIdleTimeoutMs:()=>d});const l=3e5,u=new Map;function d(e){return m(e.AGENT_BROWSER_IDLE_TIMEOUT_MS)??m(e.AGENT_DEVICE_WEB_IDLE_TIMEOUT_MS)??3e5}async function f(e,a,o={}){let s=t((o.openWebSessionNames??[]).filter(e=>e.length>0));if(s.length>0)return h(`open-web-session`,{openWebSessionNames:s});let c=d(r()),l=_(e);if(l!==void 0&&Date.now()-l<c)return h(`recent-browser-activity`,{idleTimeoutMs:c,latestActivityMs:l});let u=o.ownedProcessRecords;if(!u)return g();let f=await i(u,{openWebSessionNames:s,purposes:[`managed-web-browser`],termTimeoutMs:1500,killTimeoutMs:1e3}),p=[...f.terminatedPids];return f.inspected>0&&n({level:`warn`,phase:`web_agent_browser_orphan_cleanup`,data:{reason:a,count:f.inspected,pids:[...f.inspectedPids],signalPids:p,ownershipLostPids:[...f.ownershipLostPids],stateDir:e.stateDir,installDir:e.installDir}}),{count:f.inspected,pids:[...f.inspectedPids],processes:[],signalPids:p}}async function p(e,t={}){let n=Date.now(),r=s.resolve(e.stateDir),i=u.get(r);if(!(i!==void 0&&n-i<3e4))return u.set(r,n),await f(e,`provider-startup`,t)}function m(e){if(e===void 0||e.trim()===``)return;let t=Number.parseInt(e,10);return Number.isInteger(t)&&t>0?t:void 0}function h(e,t){return{count:0,pids:[],processes:[],signalPids:[],skipped:{reason:e,...t}}}function g(){return{count:0,pids:[],processes:[],signalPids:[]}}function _(e){let t=v(e.socketDir).map(e=>y(e)).filter(e=>e!==void 0);return t.length>0?Math.max(...t):void 0}function v(e){try{return a(e).map(t=>s.join(e,t))}catch{return[]}}function y(e){try{return o(e).mtimeMs}catch{return}}export{p as n,d as r,c as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime.js";import{
|
|
1
|
+
import{r as e}from"./rolldown-runtime.js";import{rr as t}from"./sdk-batch.js";import{f as n,g as r,o as i,x as a,y as o}from"./owner-identity.js";import{g as s}from"./exec.js";import"./command.js";import"./process.js";import c from"node:path";import l from"node:crypto";var u=e({agentBrowserChromeLaunchMarker:()=>d,appendAgentDeviceChromeArgs:()=>f,inspectManagedAgentBrowserProcesses:()=>_,matchAgentBrowserChromeProcess:()=>p,recordManagedAgentBrowserProcesses:()=>v,summarizeAgentBrowserProcesses:()=>m,summarizeManagedAgentBrowserProcesses:()=>g});function d(e){let t=l.createHash(`sha256`);return t.update(c.resolve(e.stateDir)),t.update(`\0`),t.update(c.resolve(e.installDir)),`--agent-device-managed-web=${t.digest(`hex`).slice(0,16)}`}function f(e,t){let n=d(t),r=e?.trim();return r?x(r).includes(n)?r:`${r},${n}`:n}function p(e,t){if(!(e.pid===n()||!S(e.command))){if(e.command.includes(d(t)))return{process:e,reason:`launch-marker`};if(w(t).some(t=>T(e,t)))return{process:e,reason:`managed-browser-home`}}}function m(e,t){return b(e,e=>p(e,t))}function h(e,t){return p(e,t)??C(e,t)}function g(e,t){return b(e,e=>h(e,t))}async function _(e){return m(await y(),e)}async function v(e,t){let n=await y(),r=g(n,e),s=i(r.pids,n),c={count:s.length,pids:s.map(({pid:e})=>e),processes:s.map(t=>({process:t,reason:h(t,e)?.reason??`descendant`}))},l=c.processes.flatMap(({process:e})=>{let t=a(e.pid),n=o(e.pid);return t&&n?[{pid:e.pid,startTime:t,command:n,purpose:`managed-web-browser`}]:[]});return l.length>0&&t.replace({kind:`daemon`},l),c}async function y(){return await s(async()=>await r({timeoutMs:1500}))}function b(e,t){let n=e.flatMap(e=>{let n=t(e);return n?[n]:[]});return{count:n.length,pids:n.map(e=>e.process.pid),processes:n}}function x(e){return e.split(/[,\n]/).map(e=>e.trim()).filter(Boolean)}function S(e){return/\b(?:Google Chrome for Testing|Chrome for Testing|Chromium|chrome|chrome\.exe|chromium|chromium-browser|headless_shell)\b/i.test(e)}function C(e,t){if(e.pid===n()||S(e.command))return;let r=E(e.command),i=E(c.resolve(t.installDir));return r.includes(`${i}/`)?{process:e,reason:`agent-browser-daemon`}:void 0}function w(e){return t([c.join(e.homeDir,`.agent-browser`,`browsers`),c.join(e.runtimeHomeDir,`.agent-browser`,`browsers`)])}function T(e,t){let n=E(e.command),r=`${E(c.resolve(t)).replace(/\/+$/,``)}/`;return n.includes(r)}function E(e){return e.replaceAll(`\\`,`/`)}export{v as i,f as n,_ as r,u as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime.js";import{C as t,w as n}from"./sdk-contracts.js";import{
|
|
1
|
+
import{r as e}from"./rolldown-runtime.js";import{C as t,w as n}from"./sdk-contracts.js";import{c as r,d as i,f as a,l as o,s,u as c,x as l}from"./owner-identity.js";import{c as u}from"./exec.js";import{t as d}from"./file.js";import"./command.js";import"./process.js";import{O as f,S as p,a as m,b as h,c as g,d as _,l as v,p as y,s as b,v as x}from"./host-file.js";import{n as S}from"./agent-browser-process-record.js";import{r as C}from"./agent-browser-lifecycle.js";import w from"node:path";import T from"node:crypto";async function E(e){b(e.packageRoot);let t=ee([`install`,`--prefix`,e.packageRoot,`--no-global`,`--no-audit`,`--no-fund`,`--no-save`,e.packageSpec]);await u(t.command,t.args,{env:r(),timeoutMs:e.timeoutMs})}function D(e){f(w.join(e.installDir,`manifest.json`),JSON.stringify({package:e.packageName,version:e.version,node:c(),installedAt:new Date().toISOString()},null,2))}function ee(e){if(i()!==`win32`)return{command:`npm`,args:e};let n=O(r());if(!n)throw new t(`TOOL_MISSING`,`npm not found in PATH`,{nodeExecPath:o(),hint:"Install Node.js with npm, or add npm to PATH, and run `agent-device web setup` again."});return{command:o(),args:[n,...e]}}function O(e){let t=e.npm_execpath?.trim();if(t){let e=w.resolve(t);if(w.basename(e)===`npm-cli.js`&&k(e))return e}let n=w.join(w.dirname(o()),`node_modules`,`npm`,`bin`,`npm-cli.js`);return k(n)?n:void 0}function k(e){try{return _(e).isFile()}catch{return!1}}var A=e({doctorManagedAgentBrowser:()=>L,getManagedAgentBrowserStatus:()=>R,mapManagedAgentBrowserError:()=>$,runManagedAgentBrowser:()=>F,setupManagedAgentBrowser:()=>I});const j=`0.27.1`,M=`agent-browser`,N=3e5,P=6e4;async function F(e,t){let n=R({stateDir:t.stateDir});if(!n.installed)throw q(n);return await z(n,e,t)}async function I(e){let t=R(e);Y(t.nodeMajor);let n=a(),r=await d({lockDirPath:w.join(t.installDir,`..`,`.agent-browser-install.lock`),owner:{pid:n,startTime:l(n),acquiredAtMs:Date.now()},timeoutMs:N,description:`managed agent-browser setup`});try{let t=R(e);if(t.installed)return t;b(t.installDir),await E({packageRoot:w.join(t.installDir,`package`),packageSpec:`${M}@${j}`,timeoutMs:N});let n=R(e);if(!n.entryScript)throw J(n);return await z(n,[`install`],{timeoutMs:N}),await z(n,[`doctor`,`--offline`,`--quick`],{timeoutMs:P}),D({installDir:n.installDir,packageName:M,version:j}),R(e)}finally{await r()}}async function L(e){let t=R(e);if(!t.installed)throw q(t);return{status:t,...await z(t,[`doctor`,`--offline`,`--quick`],{timeoutMs:P,allowFailure:!0})}}function R(e){let t=e.stateDir??r().AGENT_DEVICE_STATE_DIR??te(),n=w.join(t,`tools`,`agent-browser`,j),i=G(n),a=K(n),o=U(i),s=w.join(n,`home`),l=X(n),u=Z(n),d=o!==void 0&&H(n),f=Number.parseInt(c().replace(/^v/,``).split(`.`)[0]??`0`,10);return{version:j,stateDir:t,installDir:n,packageDir:i,binaryPath:a,entryScript:o,homeDir:s,runtimeHomeDir:l,socketDir:u,installed:d,nodeMajor:f,nodeSupported:f>=24}}async function z(e,t,n){if(!e.entryScript)throw q(e);return await u(o(),[e.entryScript,...t],{allowFailure:n.allowFailure,env:B(e,r()),timeoutMs:n.timeoutMs,signal:n.signal})}function B(e,t){return b(e.homeDir),V(e),b(e.socketDir),{...t,HOME:e.runtimeHomeDir,AGENT_BROWSER_SOCKET_DIR:e.socketDir,AGENT_BROWSER_IDLE_TIMEOUT_MS:String(C(t)),AGENT_BROWSER_ARGS:S(t.AGENT_BROWSER_ARGS,e)}}function V(e){if(e.runtimeHomeDir!==e.homeDir){b(w.dirname(e.runtimeHomeDir));try{let t=v(e.runtimeHomeDir);if(t.isSymbolicLink()&&x(e.runtimeHomeDir)===e.homeDir||t.isDirectory())return;t.isSymbolicLink()&&p(e.runtimeHomeDir)}catch(e){if(!Q(e))throw e}try{m(e.homeDir,e.runtimeHomeDir)}catch{b(e.runtimeHomeDir)}}}function H(e){return g(w.join(e,`manifest.json`))}function U(e){let t;try{let n=JSON.parse(h(w.join(e,`package.json`)));t=typeof n==`object`&&n?n.bin:void 0}catch{return}let n=typeof t==`string`?t:typeof t==`object`&&t?t[M]:void 0;if(typeof n!=`string`)return;let r=w.resolve(e,n);return W(r)?r:void 0}function W(e){try{return _(e).isFile()}catch{return!1}}function G(e){return w.join(e,`package`,`node_modules`,M)}function K(e){let t=i()===`win32`?`${M}.cmd`:M;return w.join(e,`package`,`node_modules`,`.bin`,t)}function q(e){return new t(`TOOL_MISSING`,`Managed web browser backend is not installed.`,{version:j,installDir:e.installDir,hint:e.nodeSupported===!1?`Web automation requires Node 24+; current Node is ${c()}.`:"Run `agent-device web setup` to install the managed web backend."})}function J(e){return new t(`TOOL_MISSING`,`Managed web backend install produced no runnable entry.`,{version:j,installDir:e.installDir,packageDir:e.packageDir,hint:`Remove ${e.installDir} and run \`agent-device web setup\` again.`})}function Y(e){if(!(e>=24))throw new t(`UNSUPPORTED_OPERATION`,`Web automation requires Node 24 or newer.`,{currentNode:c(),requiredNodeMajor:24,hint:`Run agent-device with Node 24+ for web setup and web automation.`})}function X(e){if(i()===`win32`)return w.join(e,`home`);let t=T.createHash(`sha1`).update(e).digest(`hex`).slice(0,12);return w.join(y(),`agent-device-web`,t)}function Z(e){let t=T.createHash(`sha1`).update(e).digest(`hex`).slice(0,12);return w.join(y(),`adw`,t)}function Q(e){return typeof e==`object`&&!!e&&`code`in e&&e.code===`ENOENT`}function te(){return w.join(r().HOME??s(),`.agent-device`)}function $(e){let r=n(e);return r.code===`TOOL_MISSING`?new t(r.code,r.message,{...r.details??{},hint:typeof r.details?.hint==`string`?r.details.hint:"Run `agent-device web setup` to install the managed web backend."}):r}export{F as i,R as n,$ as r,A as t};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime.js";import{B as t,C as n,L as r,a as i,o as a}from"./sdk-contracts.js";import"./capture.js";import{n as o}from"./snapshot-capture-annotations.js";import{C as s,D as c,S as l,T as u,b as d,g as f,h as p,w as m,x as h,y as g}from"./sdk-batch-runner.js";import{n as _}from"./snapshot-diagnostics.js";import{
|
|
1
|
+
import{r as e}from"./rolldown-runtime.js";import{B as t,C as n,L as r,a as i,o as a}from"./sdk-contracts.js";import"./capture.js";import{n as o}from"./snapshot-capture-annotations.js";import{C as s,D as c,S as l,T as u,b as d,g as f,h as p,w as m,x as h,y as g}from"./sdk-batch-runner.js";import{n as _}from"./snapshot-diagnostics.js";import{c as v,m as y,p as ee,s as te}from"./sdk-device.js";import{f as ne,i as b}from"./lease-scope.js";import{tn as x,w as S}from"./sdk-batch.js";import{n as C,t as w}from"./catalog.js";import{T as re,i as ie,m as ae,w as oe}from"./registry.js";import{c as T,n as se,r as ce}from"./diagnostics.js";import{t as E}from"./command-metadata.js";import"./diagnostics2.js";import{a as le,c as ue,i as de,l as fe,n as pe,o as me,r as he,s as ge,t as _e}from"./daemon-client-lifecycle.js";import{n as D}from"./config.js";import{r as ve}from"./session-paths.js";import{n as ye,t as be}from"./client-metro.js";import{t as xe}from"./screenshot-result.js";import O from"node:path";import k from"node:fs";function A(e){let t=e.appId??e.bundleId??e.packageName;return{session:e.session,appId:t,appBundleId:e.bundleId,package:e.packageName}}function j(e,t,n){return{deviceId:t,deviceName:n,...y(e)?{serial:t}:e===`ios`?{udid:t}:{}}}function M(e,t){let n=h(e,`bundleId`),r=h(e,`package`);return{app:u(e,`app`),appPath:u(e,`appPath`),platform:m(e,`platform`),appId:n??r,bundleId:n,package:r,identifiers:A({session:t,bundleId:n,packageName:r})}}function Se(e,t){let r=h(e,`bundleId`),i=h(e,`packageName`),a=r??i??h(e,`appId`),o=h(e,`launchTarget`)??i??r??a;if(!o)throw new n(`COMMAND_FAILED`,`Daemon response is missing "launchTarget".`,{response:e});return{appName:h(e,`appName`),appId:a,bundleId:r,packageName:i,launchTarget:o,installablePath:h(e,`installablePath`),archivePath:h(e,`archivePath`),materializationId:h(e,`materializationId`),materializationExpiresAt:h(e,`materializationExpiresAt`),identifiers:A({session:t,bundleId:r,packageName:i,appId:a})}}function Ce(e){return{released:e.released===!0,materializationId:u(e,`materializationId`),identifiers:{}}}function N(e){let{record:t,platform:n,id:r,name:i,target:a}=F(e,`name`),o=P(t);return{platform:n,target:a,kind:l(t,`kind`),id:r,name:i,booted:typeof t.booted==`boolean`?t.booted:void 0,...v(n)&&o?{appleOs:o}:{},identifiers:j(n,r,i),...we(t),...I(n,r)}}function we(e){let t=e.claimedBy;if(!t||typeof t!=`object`||Array.isArray(t))return{};let n=t,r=n.session,i=n.workspace;return typeof r!=`string`||typeof i!=`string`?{}:{claimedBy:{session:r,workspace:i}}}function Te(e){let{record:t,platform:n,id:r,name:i,target:a}=F(e,`name`),o=u(t,`device`),c=P(t),l={session:i,...j(n,r,o)};return{name:i,address:h(t,`address`),createdAt:s(t,`createdAt`),sessionStateDir:h(t,`sessionStateDir`),runnerLogPath:h(t,`runnerLogPath`),device:{platform:n,target:a,id:r,name:o,...c?{appleOs:c}:{},identifiers:l,...I(n,r,{simulatorSetPath:d(t,`ios_simulator_device_set`)})},identifiers:l}}function P(e){let t=e.appleOs;return te(t)?t:void 0}function F(e,t){let n=p(e);return{record:n,platform:m(n,`platform`),id:u(n,`id`),name:u(n,t),target:g(n,`target`)}}function I(e,t,n={}){if(e===`ios`)return{ios:{udid:t,...n.simulatorSetPath===void 0?{}:{simulatorSetPath:n.simulatorSetPath}}};if(!y(e))return{};let r=n.serial??t;return e===`android`?{android:{serial:r}}:e===`harmonyos`?{harmonyos:{serial:r}}:{vega:{serial:r}}}function Ee(e){if(!f(e))return;let t=e.platform,n=h(e,`metroHost`),r=typeof e.metroPort==`number`?e.metroPort:void 0,i=h(e,`bundleUrl`),o=h(e,`launchUrl`);return{platform:a(t)?t:void 0,metroHost:n,metroPort:r,bundleUrl:i,launchUrl:o}}function De(e){let t=e.platform,n=h(e,`id`),r=h(e,`device`);if(!ee(t)||!n||!r)return;let i=g(e,`target`),a=y(t)?h(e,`serial`)??n:void 0;return{platform:t,target:i,id:n,name:r,identifiers:{...j(t,n,r),...a?{serial:a}:{}},...I(t,t===`ios`?h(e,`device_udid`)??n:n,{simulatorSetPath:d(e,`ios_simulator_device_set`),serial:a})}}const Oe=[`explicit-selector`,`existing-session`,`single-booted-local`,`single-bootable-local`,`single-app-installed-local`,`preferred-local`,`single-provider-device`],ke=[`session`,`local`,`provider`];function Ae(e){if(!f(e))return;let{reason:t,source:n,candidateCount:r,bootOccurred:i}=e;if(!(!Oe.includes(t)||!ke.includes(n)||typeof r!=`number`||!Number.isInteger(r)||r<0||typeof i!=`boolean`))return{reason:t,source:n,candidateCount:r,bootOccurred:i}}function je(e){if(f(e)&&typeof e.durationMs==`number`&&typeof e.measuredAt==`string`&&typeof e.method==`string`)return{durationMs:e.durationMs,measuredAt:e.measuredAt,method:e.method,appTarget:h(e,`appTarget`),appBundleId:h(e,`appBundleId`)}}function L(e){if(!f(e)||typeof e.success!=`boolean`||typeof e.exitCode!=`number`||typeof e.stdout!=`string`||typeof e.stderr!=`string`)return;let t=R(e.error);return{success:e.success,exitCode:e.exitCode,stdout:e.stdout,stderr:e.stderr,...t?{error:t}:{}}}const Me=[`hint`,`diagnosticId`,`logPath`,`supportedOn`];function R(e){if(!f(e)||typeof e.code!=`string`||typeof e.message!=`string`)return;let t={code:e.code,message:e.message};Object.assign(t,Ne(e.cause));for(let n of Me){let r=e[n];typeof r==`string`&&(t[n]=r)}return f(e.details)&&(t.details=e.details),typeof e.retriable==`boolean`&&(t.retriable=e.retriable),t}function Ne(e){let n=t(e);return n?{cause:n}:void 0}function Pe(e){let t=R(e.initialSnapshotError);return{...e.snapshot&&typeof e.snapshot==`object`?{snapshot:e.snapshot}:{},...t?{initialSnapshotError:t}:{}}}function Fe(e){return Array.isArray(e)?e:[]}function Ie(e){let t=b(e);return c({requestId:e.requestId,cwd:e.cwd,sessionExplicit:e.session!==void 0,debug:e.debug,includeCost:e.cost,responseLevel:e.responseLevel,lockPolicy:e.lockPolicy,lockPlatform:e.lockPlatform,...ne(t),sessionIsolation:e.sessionIsolation,installSource:e.installSource,retainMaterializedPaths:e.retainMaterializedPaths,materializedPathRetentionMs:e.materializedPathRetentionMs,materializationId:e.materializationId})}function z(e){return e??`default`}const B={...ie(),batch:ae(Le)};async function Le(e,t,r){let i=B[e];if(!i)throw Error(`Missing daemon writer for batch command: ${e}`);let a=E(e);if(!a)throw Error(`Missing command metadata for batch command: ${e}`);try{return await V(i,a,a.readInput(t))}catch(t){let i=t instanceof Error?t.message:String(t);throw new n(`INVALID_ARGS`,`Batch step ${r} ${e} input is invalid: ${i}`,void 0,t)}}async function Re(e,t){let n=B[e];if(!n)throw Error(`Missing daemon writer for command: ${e}`);return await V(n,E(e),t)}async function V(e,t,n){let r=await e(n);return{...r,...t?{metadataFlags:re(t,r.options)}:{}}}async function H(e,t={}){let n=e.meta?.requestId??se(),r=!!(e.meta?.debug||e.flags?.verbose),i=e.flags,{daemonAuthToken:a,...o}=i??{},s=i?{...e,flags:o}:e,c=ge(s,t.authToken??a),l=x(S(s.command),s),u=await T(`daemon_startup`,async()=>await de(c),{requestId:n,session:e.session}),d=u.info,f=await fe(s,d);Ke(s.command);let p=ze(s,f,d.token,n,r);return ce({level:`info`,phase:`daemon_request_prepare`,data:{requestId:n,command:s.command,session:s.session}}),await Ue(s,u,c,async()=>Ge(We(await T(`daemon_request`,async()=>await ue(d,p,c.transportPreference,c.paths,l,t.onProgress?{onProgress:t.onProgress}:void 0),{requestId:n,command:e.command}),c),s,c))}function ze(e,t,n,r,i){return{...e,positionals:t.positionals,flags:t.flags,token:n,meta:Be(e,t,r,i)}}function Be(e,t,n,r){let i=e.meta??{};return{...i,requestId:n,debug:r,...Ve(i,e.flags),...He(t)}}function Ve(e,t){return{includeCost:e.includeCost,cwd:e.cwd,sessionExplicit:e.sessionExplicit,tenantId:e.tenantId??t?.tenant,runId:e.runId??t?.runId,leaseId:e.leaseId??t?.leaseId,sessionIsolation:e.sessionIsolation??t?.sessionIsolation,lockPolicy:e.lockPolicy,lockPlatform:e.lockPlatform}}function He(e){return{...e.uploadedArtifactId?{uploadedArtifactId:e.uploadedArtifactId}:{},...e.clientArtifactPaths?{clientArtifactPaths:e.clientArtifactPaths}:{},...e.installSource?{installSource:e.installSource}:{}}}async function Ue(e,t,r,i){let a,o=!1,s;try{a=await i()}catch(e){o=!0,s=e}let c=await he(e,t,r,a);if(o)throw s;if(!c)throw new n(`COMMAND_FAILED`,`Daemon request produced no response after cleanup`);return c}function We(e,t){return e.ok||!t.ownedStateDir||!me(e)?e:pe(e,t.paths.baseDir)}function Ge(e,t,n){return!e.ok||!le(t,e)?e:_e(e,n.ownedStateDir?n.paths.baseDir:void 0)}function Ke(e){!qe(e)||process.stderr.isTTY!==!0||process.env.CI||process.stderr.write(e===C.reinstall?`Reinstalling...
|
|
2
2
|
`:`Installing...
|
|
3
|
-
`)}function qe(e){return e===C.install||e===C.reinstall||e===w.installSource}function U(e,t){return O.join(e,`metro-sessions`,`${ve(t)}.json`)}function W(e){let t=U(e.stateDir,e.session);k.mkdirSync(O.dirname(t),{recursive:!0}),k.writeFileSync(t,`${JSON.stringify(e.hints,null,2)}\n`,`utf8`)}function Je(e){let t=U(e.stateDir,e.session),n;try{n=k.readFileSync(t,`utf8`)}catch{return}let r;try{r=JSON.parse(n)}catch{return}if(!r||typeof r!=`object`||Array.isArray(r))return;let i=r,a={};return typeof i.metroHost==`string`&&i.metroHost&&(a.metroHost=i.metroHost),typeof i.metroPort==`number`&&Number.isInteger(i.metroPort)&&(a.metroPort=i.metroPort),typeof i.bundleUrl==`string`&&i.bundleUrl&&(a.bundleUrl=i.bundleUrl),Object.keys(a).length>0?a:void 0}function G(e){k.rmSync(U(e.stateDir,e.session),{force:!0})}function Ye(e){let t=async(t,n)=>await e(w.humanControl,t,n);return{allocate:async t=>q(await e(w.leaseAllocate,[],{...t,leaseId:void 0})),heartbeat:async t=>q(await e(w.leaseHeartbeat,[],t)),release:async t=>{let n=await e(w.leaseRelease,[],t);return{released:n.released===!0,provider:f(n.provider)?n.provider:void 0}},humanControl:{list:async e=>{let r=await t([`list`],e);if(!Array.isArray(r.holds))throw new n(`COMMAND_FAILED`,`Daemon did not return human-control holds.`);return r.holds.map(K)},put:async(e,n={},r)=>K((await t([`put`,e,JSON.stringify(n)],r)).hold),remove:async(e,n)=>(await t([`remove`,e],n)).released===!0}}}function K(e){if(!f(e)||!f(e.scope)||e.state!==`active`&&e.state!==`activating`||typeof e.createdAt!=`number`||typeof e.updatedAt!=`number`)throw new n(`COMMAND_FAILED`,`Daemon returned an invalid human-control hold.`);return{id:u(e,`id`),scope:{backend:u(e.scope,`backend`),leaseProvider:h(e.scope,`leaseProvider`),deviceKey:u(e.scope,`deviceKey`)},state:e.state,reason:h(e,`reason`),createdAt:e.createdAt,updatedAt:e.updatedAt,...typeof e.expiresAt==`number`?{expiresAt:e.expiresAt}:{}}}function q(e){let t=e.lease;if(!f(t))throw Error(`Invalid lease response from daemon`);return{leaseId:u(t,`leaseId`),tenantId:u(t,`tenantId`),runId:u(t,`runId`),backend:u(t,`backend`),leaseProvider:h(t,`leaseProvider`),clientId:h(t,`clientId`),deviceKey:h(t,`deviceKey`),createdAt:typeof t.createdAt==`number`?t.createdAt:void 0,heartbeatAt:typeof t.heartbeatAt==`number`?t.heartbeatAt:void 0,expiresAt:typeof t.expiresAt==`number`?t.expiresAt:void 0}}var Xe=e({createAgentDeviceClient:()=>J});function J(e={},t={}){let a=t.transport??H,o=t=>i(t.responseLevel??e.responseLevel),s=async(t,n=[],i={},o,s)=>{let c=Q(e,i),l={session:z(c.session),command:t,positionals:n,...s?{input:s}:{},flags:te(c,o),runtime:c.runtime,meta:Ie(c)},u=await a(l,{authToken:c.daemonAuthToken});return u.ok||r(u.error),u.data??{}},c=async(e={})=>{let t=await s(w.sessionList,[],e);return(Array.isArray(t.sessions)?t.sessions:[]).map(Te)},l=async(e,t={})=>{let n=await Re(e,t);return await s(n.command,n.positionals,n.options,n.metadataFlags,n.input)},d=(t={})=>z(Q(e,t).session);return{command:{wait:async e=>await l(`wait`,e),alert:async(e={})=>await l(`alert`,e),appState:async(e={})=>await l(`appstate`,e),back:async(e={})=>await l(`back`,e),home:async(e={})=>await l(`home`,e),orientation:async e=>await l(`orientation`,e),appSwitcher:async(e={})=>await l(`app-switcher`,e),keyboard:async(e={})=>await l(`keyboard`,e),clipboard:async e=>await l(`clipboard`,e),tvRemote:async e=>await l(`tv-remote`,e),reactNative:async e=>await l(`react-native`,e),doctor:async(e={})=>await l(`doctor`,e),prepare:async e=>await l(`prepare`,e),viewport:async e=>await l(`viewport`,e)},devices:{list:async(e={})=>{let t=await l(`devices`,e);return(Array.isArray(t.devices)?t.devices:[]).map(N)},capabilities:async(e={})=>{let t=await l(`capabilities`,e),n=Array.isArray(t.availableCommands)?t.availableCommands.filter(e=>typeof e==`string`):[];return{device:N(t.device),availableCommands:n}},boot:async(e={})=>await l(`boot`,e),shutdown:async(e={})=>await l(`shutdown`,e)},sessions:{list:async(e={})=>await c(e),stateDir:async(t={})=>{let n=Q(e,t);return D(n.stateDir??process.env.AGENT_DEVICE_STATE_DIR).baseDir},close:async(t={})=>{let n=d(t);try{let e=await l(`close`,t);return{session:n,shutdown:L(e.shutdown),provider:Z(e.provider),savedScript:h(e,`savedScript`),identifiers:{session:n}}}finally{lt(e,t)}},saveScript:async(e={})=>{let t=await s(w.sessionSaveScript,e.path===void 0?[]:[e.path],e,{force:e.force}),r=t.actionCount;if(typeof r!=`number`||!Number.isInteger(r)||r<0)throw new n(`COMMAND_FAILED`,`Daemon returned an invalid saved-script action count.`);let i=u(t,`session`);return{session:i,savedScript:u(t,`savedScript`),actionCount:r,identifiers:{session:i}}},artifacts:async(e={})=>await l(`artifacts`,e)},apps:{install:async e=>M(await l(`install`,e),d(e)),reinstall:async e=>M(await l(`reinstall`,e),d(e)),installFromSource:async e=>Se(await l(`install-from-source`,e),d(e)),list:async(e={})=>{let t=await l(`apps`,e);return Array.isArray(t.apps)?t.apps.filter(e=>typeof e==`string`):[]},open:async t=>{let n=d(t),r=await l(`open`,t);ct({config:e,options:t,runtime:Q(e,t).runtime,sessionReused:r.sessionReused===!0});let i=De(r),a=h(r,`appBundleId`),o=a,s=Array.isArray(r.warnings)?r.warnings.filter(e=>typeof e==`string`):[];return{session:n,...s.length>0?{warnings:s}:{},sessionStateDir:h(r,`sessionStateDir`),runnerLogPath:h(r,`runnerLogPath`),requestLogPath:h(r,`requestLogPath`),eventLogPath:h(r,`eventLogPath`),appName:h(r,`appName`),appBundleId:a,appId:o,selection:Ae(r.selection),startup:je(r.startup),runtime:Ee(r.runtime),device:i,...Pe(r),identifiers:{session:n,deviceId:i?.id,deviceName:i?.name,udid:i?.ios?.udid,serial:i?.android?.serial,appId:o,appBundleId:a}}},close:async(e={})=>{let t=d(e),n=await l(`close`,e);return{session:t,closedApp:e.app,shutdown:L(n.shutdown),savedScript:h(n,`savedScript`),identifiers:{session:t}}},push:async e=>await l(`push`,e),triggerEvent:async e=>await l(`trigger-app-event`,e)},materializations:{release:async e=>Ce(await s(w.releaseMaterializedPaths,[],{...e,materializationId:e.materializationId}))},leases:Ye(s),metro:{prepare:async t=>{let n=await be({projectRoot:t.projectRoot??e.cwd,kind:t.kind,publicBaseUrl:t.publicBaseUrl,proxyBaseUrl:t.proxyBaseUrl,proxyBearerToken:t.bearerToken,bridgeScope:t.bridgeScope,launchUrl:t.launchUrl,companionProfileKey:t.companionProfileKey,companionConsumerKey:t.companionConsumerKey,metroPort:t.port,listenHost:t.listenHost,statusHost:t.statusHost,startupTimeoutMs:t.startupTimeoutMs,probeTimeoutMs:t.probeTimeoutMs,reuseExisting:t.reuseExisting,installDependenciesIfNeeded:t.installDependenciesIfNeeded,runtimeFilePath:t.runtimeFilePath,logPath:t.logPath});return at(e,n),n},reload:async(t={})=>await ye({metroHost:t.metroHost,metroPort:t.metroPort,bundleUrl:t.bundleUrl,runtime:e.runtime??ot(e),timeoutMs:t.timeoutMs})},capture:{snapshot:async(e={})=>{let t=d(e),n=await l(`snapshot`,e);return o(e)?n:rt(n,t)},screenshot:async(e={})=>{let t=d(e),n=await l(`screenshot`,e);return o(e)?n:xe(n,t)},diff:async e=>await l(`diff`,e)},interactions:{click:async e=>await l(`click`,e),press:async e=>await l(`press`,e),longPress:async e=>await l(`longpress`,e),hover:async e=>await l(`hover`,e),swipe:async e=>await l(`swipe`,e),pan:async e=>await l(`gesture`,Ze(e)),drag:async e=>await l(`gesture`,Qe(e)),fling:async e=>await l(`gesture`,Y(e)),swipeGesture:async e=>await l(`gesture`,$e(e)),focus:async e=>await l(`focus`,e),type:async e=>await l(`type`,e),fill:async e=>await l(`fill`,e),scroll:async e=>await l(`scroll`,e),pinch:async e=>await l(`gesture`,et(e)),rotateGesture:async e=>await l(`gesture`,tt(e)),transformGesture:async e=>await l(`gesture`,nt(e)),get:async e=>await l(`get`,e),is:async e=>await l(`is`,e),find:async e=>await l(`find`,e)},replay:{run:async e=>await l(`replay`,e),test:async e=>await l(`test`,e)},batch:{run:async e=>await l(`batch`,e)},observability:{perf:async e=>await l(`perf`,e),logs:async(e={})=>await l(`logs`,e),events:async(e={})=>await l(`events`,e),network:async(e={})=>await l(`network`,e),audio:async(e={})=>await l(`audio`,e)},debug:{symbols:async t=>{let{symbolicateCrashArtifact:n}=await import(`./debug-symbols-facade.js`);return n({cwd:t.cwd??e.cwd,...t})}},recording:{record:async e=>await l(`record`,e),trace:async e=>await l(`trace`,e)},settings:{update:async e=>await l(`settings`,e)}}}function Ze(e){let{x:t,y:n,dx:r,dy:i,...a}=e;return{...a,kind:`pan`,origin:{x:t,y:n},delta:{x:r,y:i}}}function Qe(e){return{...e,kind:`drag`}}function Y(e){let{x:t,y:n,...r}=e;return{...r,kind:`fling`,origin:{x:t,y:n}}}function $e(e){return{...e,kind:`swipe`}}function et(e){let{x:t,y:n,...r}=e;return X(t,n,`pinch`),{...r,kind:`pinch`,...t===void 0&&n===void 0?{}:{origin:{x:t,y:n}}}}function tt(e){let{x:t,y:n,...r}=e;return X(t,n,`rotate`),{...r,kind:`rotate`,...t===void 0&&n===void 0?{}:{origin:{x:t,y:n}}}}function nt(e){let{x:t,y:n,dx:r,dy:i,...a}=e;return{...a,kind:`transform`,origin:{x:t,y:n},delta:{x:r,y:i}}}function X(e,t,r){if(e===void 0!=(t===void 0))throw new n(`INVALID_ARGS`,`gesture ${r} center requires both x and y`)}function rt(e,t){let n=h(e,`appBundleId`);return{nodes:Fe(e.nodes),...typeof e.truncated==`boolean`?{truncated:e.truncated}:{},appName:h(e,`appName`),appBundleId:n,...it(e),identifiers:{session:t,appId:n,appBundleId:n}}}function it(e){let t=Z(e.visibility),n=Z(e.unchanged),r=_(e.snapshotDiagnostics);return{...t?{visibility:t}:{},...o(e),...n?{unchanged:n}:{},...r?{snapshotDiagnostics:r}:{},...typeof e.fallbackScreenshotPath==`string`?{fallbackScreenshotPath:e.fallbackScreenshotPath}:{},...typeof e.refsGeneration==`number`?{refsGeneration:e.refsGeneration}:{}}}function Z(e){return f(e)?e:void 0}function Q(e,t){return{...e,...t}}function $(e,t={}){let n=Q(e,t);return{stateDir:D(n.stateDir??process.env.AGENT_DEVICE_STATE_DIR).baseDir,session:z(n.session)}}function at(e,t){try{let n=new URL(t.statusUrl),r=Number.parseInt(n.port,10);if(!n.hostname||!Number.isInteger(r))return;let i=t.bridge?void 0:t.iosRuntime.bundleUrl??t.androidRuntime.bundleUrl;W({...$(e),hints:{metroHost:n.hostname,metroPort:r,bundleUrl:i}})}catch{}}function ot(e){try{return Je($(e))}catch{return}}function st(e){if(!e)return;let{metroHost:t,metroPort:n,bundleUrl:r}=e;if(t!==void 0||n!==void 0||r!==void 0)return{metroHost:t,metroPort:n,bundleUrl:r}}function ct(e){try{let t=$(e.config,e.options),n=st(e.runtime);if(n){W({...t,hints:n});return}e.sessionReused||G(t)}catch{}}function lt(e,t){try{G($(e,t))}catch{}}export{J as n,H as r,Xe as t};
|
|
3
|
+
`)}function qe(e){return e===C.install||e===C.reinstall||e===w.installSource}function U(e,t){return O.join(e,`metro-sessions`,`${ve(t)}.json`)}function W(e){let t=U(e.stateDir,e.session);k.mkdirSync(O.dirname(t),{recursive:!0}),k.writeFileSync(t,`${JSON.stringify(e.hints,null,2)}\n`,`utf8`)}function Je(e){let t=U(e.stateDir,e.session),n;try{n=k.readFileSync(t,`utf8`)}catch{return}let r;try{r=JSON.parse(n)}catch{return}if(!r||typeof r!=`object`||Array.isArray(r))return;let i=r,a={};return typeof i.metroHost==`string`&&i.metroHost&&(a.metroHost=i.metroHost),typeof i.metroPort==`number`&&Number.isInteger(i.metroPort)&&(a.metroPort=i.metroPort),typeof i.bundleUrl==`string`&&i.bundleUrl&&(a.bundleUrl=i.bundleUrl),Object.keys(a).length>0?a:void 0}function G(e){k.rmSync(U(e.stateDir,e.session),{force:!0})}function Ye(e){let t=async(t,n)=>await e(w.humanControl,t,n);return{allocate:async t=>q(await e(w.leaseAllocate,[],{...t,leaseId:void 0})),heartbeat:async t=>q(await e(w.leaseHeartbeat,[],t)),release:async t=>{let n=await e(w.leaseRelease,[],t);return{released:n.released===!0,provider:f(n.provider)?n.provider:void 0}},humanControl:{list:async e=>{let r=await t([`list`],e);if(!Array.isArray(r.holds))throw new n(`COMMAND_FAILED`,`Daemon did not return human-control holds.`);return r.holds.map(K)},put:async(e,n={},r)=>K((await t([`put`,e,JSON.stringify(n)],r)).hold),remove:async(e,n)=>(await t([`remove`,e],n)).released===!0}}}function K(e){if(!f(e)||!f(e.scope)||e.state!==`active`&&e.state!==`activating`||typeof e.createdAt!=`number`||typeof e.updatedAt!=`number`)throw new n(`COMMAND_FAILED`,`Daemon returned an invalid human-control hold.`);return{id:u(e,`id`),scope:{backend:u(e.scope,`backend`),leaseProvider:h(e.scope,`leaseProvider`),deviceKey:u(e.scope,`deviceKey`)},state:e.state,reason:h(e,`reason`),createdAt:e.createdAt,updatedAt:e.updatedAt,...typeof e.expiresAt==`number`?{expiresAt:e.expiresAt}:{}}}function q(e){let t=e.lease;if(!f(t))throw Error(`Invalid lease response from daemon`);return{leaseId:u(t,`leaseId`),tenantId:u(t,`tenantId`),runId:u(t,`runId`),backend:u(t,`backend`),leaseProvider:h(t,`leaseProvider`),clientId:h(t,`clientId`),deviceKey:h(t,`deviceKey`),createdAt:typeof t.createdAt==`number`?t.createdAt:void 0,heartbeatAt:typeof t.heartbeatAt==`number`?t.heartbeatAt:void 0,expiresAt:typeof t.expiresAt==`number`?t.expiresAt:void 0}}var Xe=e({createAgentDeviceClient:()=>J});function J(e={},t={}){let a=t.transport??H,o=t=>i(t.responseLevel??e.responseLevel),s=async(t,n=[],i={},o,s)=>{let c=Q(e,i),l={session:z(c.session),command:t,positionals:n,...s?{input:s}:{},flags:oe(c,o),runtime:c.runtime,meta:Ie(c)},u=await a(l,{authToken:c.daemonAuthToken});return u.ok||r(u.error),u.data??{}},c=async(e={})=>{let t=await s(w.sessionList,[],e);return(Array.isArray(t.sessions)?t.sessions:[]).map(Te)},l=async(e,t={})=>{let n=await Re(e,t);return await s(n.command,n.positionals,n.options,n.metadataFlags,n.input)},d=(t={})=>z(Q(e,t).session);return{command:{wait:async e=>await l(`wait`,e),alert:async(e={})=>await l(`alert`,e),appState:async(e={})=>await l(`appstate`,e),back:async(e={})=>await l(`back`,e),home:async(e={})=>await l(`home`,e),orientation:async e=>await l(`orientation`,e),appSwitcher:async(e={})=>await l(`app-switcher`,e),keyboard:async(e={})=>await l(`keyboard`,e),clipboard:async e=>await l(`clipboard`,e),tvRemote:async e=>await l(`tv-remote`,e),reactNative:async e=>await l(`react-native`,e),doctor:async(e={})=>await l(`doctor`,e),prepare:async e=>await l(`prepare`,e),viewport:async e=>await l(`viewport`,e)},devices:{list:async(e={})=>{let t=await l(`devices`,e);return(Array.isArray(t.devices)?t.devices:[]).map(N)},capabilities:async(e={})=>{let t=await l(`capabilities`,e),n=Array.isArray(t.availableCommands)?t.availableCommands.filter(e=>typeof e==`string`):[];return{device:N(t.device),availableCommands:n}},boot:async(e={})=>await l(`boot`,e),shutdown:async(e={})=>await l(`shutdown`,e)},sessions:{list:async(e={})=>await c(e),stateDir:async(t={})=>{let n=Q(e,t);return D(n.stateDir??process.env.AGENT_DEVICE_STATE_DIR).baseDir},close:async(t={})=>{let n=d(t);try{let e=await l(`close`,t);return{session:n,shutdown:L(e.shutdown),provider:Z(e.provider),savedScript:h(e,`savedScript`),identifiers:{session:n}}}finally{lt(e,t)}},saveScript:async(e={})=>{let t=await s(w.sessionSaveScript,e.path===void 0?[]:[e.path],e,{force:e.force}),r=t.actionCount;if(typeof r!=`number`||!Number.isInteger(r)||r<0)throw new n(`COMMAND_FAILED`,`Daemon returned an invalid saved-script action count.`);let i=u(t,`session`);return{session:i,savedScript:u(t,`savedScript`),actionCount:r,identifiers:{session:i}}},artifacts:async(e={})=>await l(`artifacts`,e)},apps:{install:async e=>M(await l(`install`,e),d(e)),reinstall:async e=>M(await l(`reinstall`,e),d(e)),installFromSource:async e=>Se(await l(`install-from-source`,e),d(e)),list:async(e={})=>{let t=await l(`apps`,e);return Array.isArray(t.apps)?t.apps.filter(e=>typeof e==`string`):[]},open:async t=>{let n=d(t),r=await l(`open`,t);ct({config:e,options:t,runtime:Q(e,t).runtime,sessionReused:r.sessionReused===!0});let i=De(r),a=h(r,`appBundleId`),o=a,s=Array.isArray(r.warnings)?r.warnings.filter(e=>typeof e==`string`):[];return{session:n,...s.length>0?{warnings:s}:{},sessionStateDir:h(r,`sessionStateDir`),runnerLogPath:h(r,`runnerLogPath`),requestLogPath:h(r,`requestLogPath`),eventLogPath:h(r,`eventLogPath`),appName:h(r,`appName`),appBundleId:a,appId:o,selection:Ae(r.selection),startup:je(r.startup),runtime:Ee(r.runtime),device:i,...Pe(r),identifiers:{session:n,deviceId:i?.id,deviceName:i?.name,udid:i?.ios?.udid,serial:i?.android?.serial,appId:o,appBundleId:a}}},close:async(e={})=>{let t=d(e),n=await l(`close`,e);return{session:t,closedApp:e.app,shutdown:L(n.shutdown),savedScript:h(n,`savedScript`),identifiers:{session:t}}},push:async e=>await l(`push`,e),triggerEvent:async e=>await l(`trigger-app-event`,e)},materializations:{release:async e=>Ce(await s(w.releaseMaterializedPaths,[],{...e,materializationId:e.materializationId}))},leases:Ye(s),metro:{prepare:async t=>{let n=await be({projectRoot:t.projectRoot??e.cwd,kind:t.kind,publicBaseUrl:t.publicBaseUrl,proxyBaseUrl:t.proxyBaseUrl,proxyBearerToken:t.bearerToken,bridgeScope:t.bridgeScope,launchUrl:t.launchUrl,companionProfileKey:t.companionProfileKey,companionConsumerKey:t.companionConsumerKey,metroPort:t.port,listenHost:t.listenHost,statusHost:t.statusHost,startupTimeoutMs:t.startupTimeoutMs,probeTimeoutMs:t.probeTimeoutMs,reuseExisting:t.reuseExisting,installDependenciesIfNeeded:t.installDependenciesIfNeeded,runtimeFilePath:t.runtimeFilePath,logPath:t.logPath});return at(e,n),n},reload:async(t={})=>await ye({metroHost:t.metroHost,metroPort:t.metroPort,bundleUrl:t.bundleUrl,runtime:e.runtime??ot(e),timeoutMs:t.timeoutMs})},capture:{snapshot:async(e={})=>{let t=d(e),n=await l(`snapshot`,e);return o(e)?n:rt(n,t)},screenshot:async(e={})=>{let t=d(e),n=await l(`screenshot`,e);return o(e)?n:xe(n,t)},diff:async e=>await l(`diff`,e)},interactions:{click:async e=>await l(`click`,e),press:async e=>await l(`press`,e),longPress:async e=>await l(`longpress`,e),hover:async e=>await l(`hover`,e),swipe:async e=>await l(`swipe`,e),pan:async e=>await l(`gesture`,Ze(e)),drag:async e=>await l(`gesture`,Qe(e)),fling:async e=>await l(`gesture`,Y(e)),swipeGesture:async e=>await l(`gesture`,$e(e)),focus:async e=>await l(`focus`,e),type:async e=>await l(`type`,e),fill:async e=>await l(`fill`,e),scroll:async e=>await l(`scroll`,e),pinch:async e=>await l(`gesture`,et(e)),rotateGesture:async e=>await l(`gesture`,tt(e)),transformGesture:async e=>await l(`gesture`,nt(e)),get:async e=>await l(`get`,e),is:async e=>await l(`is`,e),find:async e=>await l(`find`,e)},replay:{run:async e=>await l(`replay`,e),test:async e=>await l(`test`,e)},batch:{run:async e=>await l(`batch`,e)},observability:{perf:async e=>await l(`perf`,e),logs:async(e={})=>await l(`logs`,e),events:async(e={})=>await l(`events`,e),network:async(e={})=>await l(`network`,e),audio:async(e={})=>await l(`audio`,e)},debug:{symbols:async t=>{let{symbolicateCrashArtifact:n}=await import(`./debug-symbols-facade.js`);return n({cwd:t.cwd??e.cwd,...t})}},recording:{record:async e=>await l(`record`,e),trace:async e=>await l(`trace`,e)},settings:{update:async e=>await l(`settings`,e)}}}function Ze(e){let{x:t,y:n,dx:r,dy:i,...a}=e;return{...a,kind:`pan`,origin:{x:t,y:n},delta:{x:r,y:i}}}function Qe(e){return{...e,kind:`drag`}}function Y(e){let{x:t,y:n,...r}=e;return{...r,kind:`fling`,origin:{x:t,y:n}}}function $e(e){return{...e,kind:`swipe`}}function et(e){let{x:t,y:n,...r}=e;return X(t,n,`pinch`),{...r,kind:`pinch`,...t===void 0&&n===void 0?{}:{origin:{x:t,y:n}}}}function tt(e){let{x:t,y:n,...r}=e;return X(t,n,`rotate`),{...r,kind:`rotate`,...t===void 0&&n===void 0?{}:{origin:{x:t,y:n}}}}function nt(e){let{x:t,y:n,dx:r,dy:i,...a}=e;return{...a,kind:`transform`,origin:{x:t,y:n},delta:{x:r,y:i}}}function X(e,t,r){if(e===void 0!=(t===void 0))throw new n(`INVALID_ARGS`,`gesture ${r} center requires both x and y`)}function rt(e,t){let n=h(e,`appBundleId`);return{nodes:Fe(e.nodes),...typeof e.truncated==`boolean`?{truncated:e.truncated}:{},appName:h(e,`appName`),appBundleId:n,...it(e),identifiers:{session:t,appId:n,appBundleId:n}}}function it(e){let t=Z(e.visibility),n=Z(e.unchanged),r=_(e.snapshotDiagnostics);return{...t?{visibility:t}:{},...o(e),...n?{unchanged:n}:{},...r?{snapshotDiagnostics:r}:{},...typeof e.fallbackScreenshotPath==`string`?{fallbackScreenshotPath:e.fallbackScreenshotPath}:{},...typeof e.refsGeneration==`number`?{refsGeneration:e.refsGeneration}:{}}}function Z(e){return f(e)?e:void 0}function Q(e,t){return{...e,...t}}function $(e,t={}){let n=Q(e,t);return{stateDir:D(n.stateDir??process.env.AGENT_DEVICE_STATE_DIR).baseDir,session:z(n.session)}}function at(e,t){try{let n=new URL(t.statusUrl),r=Number.parseInt(n.port,10);if(!n.hostname||!Number.isInteger(r))return;let i=t.bridge?void 0:t.iosRuntime.bundleUrl??t.androidRuntime.bundleUrl;W({...$(e),hints:{metroHost:n.hostname,metroPort:r,bundleUrl:i}})}catch{}}function ot(e){try{return Je($(e))}catch{return}}function st(e){if(!e)return;let{metroHost:t,metroPort:n,bundleUrl:r}=e;if(t!==void 0||n!==void 0||r!==void 0)return{metroHost:t,metroPort:n,bundleUrl:r}}function ct(e){try{let t=$(e.config,e.options),n=st(e.runtime);if(n){W({...t,hints:n});return}e.sessionReused||G(t)}catch{}}function lt(e,t){try{G($(e,t))}catch{}}export{J as n,H as r,Xe as t};
|
package/dist/src/ai-sdk.d.ts
CHANGED
package/dist/src/ai-sdk.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{C as e}from"./sdk-contracts.js";import{n as t}from"./agent-device-client.js";import{
|
|
1
|
+
import{C as e}from"./sdk-contracts.js";import{n as t}from"./agent-device-client.js";import{b as n}from"./sdk-batch.js";import{i as r,n as i,o as a,r as o}from"./command-tools.js";const s=[`session`,...a];async function c(a){let{jsonSchema:c,tool:f}=await l(),{session:p,platform:m,set:h=`core`,approval:g}=a,_=t({session:p,...m?{lockPlatform:m}:{}}),v=i(),y=new Set(s);m&&y.add(`platform`);let b={};for(let t of o())(h!==`core`||n(t.name)===`core`)&&(b[t.name]=f({description:t.description,inputSchema:c(u(t.inputSchema,y)),...t.outputSchema?{outputSchema:c(t.outputSchema)}:{},execute:async n=>{let i={...d(n,y),session:p,...m?{platform:m}:{}},a=await v.execute(t.name,i);if(a.isError){let t=a.structuredContent,n=r(t);throw new e(t.code,n,t.details)}return a.structuredContent??{}}}));return{tools:b,client:_,...g?{toolApproval:g}:{}}}async function l(){try{return await import(`ai`)}catch(t){throw new e(`MISSING_PEER_DEPENDENCY`,"createAgentDeviceTools() requires the optional peer dependency 'ai'. Install it with `pnpm add ai` (or npm/yarn equivalent).",void 0,t)}}function u(e,t){if(!e.properties)return e;let n=e.required?.filter(e=>!t.has(e));return{...e,properties:d(e.properties,t),...n?{required:n}:{}}}function d(e,t){let n={};for(let[r,i]of Object.entries(e))t.has(r)||(n[r]=i);return n}export{c as createAgentDeviceTools};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{C as e}from"./sdk-contracts.js";import{
|
|
1
|
+
import{C as e}from"./sdk-contracts.js";import{Qt as t}from"./sdk-batch.js";import{a as n,o as r}from"./touch-runtime.js";function i(e){return Object.freeze({captureScreenshot:e.capture})}function a(e,t){return Object.freeze({captureScreenshot:async n=>{await(await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})).screenshot(n.outPath,n.options)}})}function o(e){return a(e.signal,n(e))}function s(e){return a(e.signal,r({...e,operation:`screenshot`}))}function c(e,t){return t.signal===void 0?e:AbortSignal.any([e,t.signal])}function l(e){return Object.freeze({captureSnapshot:e.capture,captureSnapshotWithCustomActions:e.customActions,captureSnapshotWithoutActiveApp:e.withoutActiveApp})}function u(t){let n=async n=>{let r=c(t.signal,n),i={...n.execution,appBundleId:n.options?.appBundleId,signal:r},a=t.ownership===`local`?await t.resolveInteractor(t.device,i):t.resolveInteractor(i);if(!a)throw new e(`UNSUPPORTED_OPERATION`,`Provider-owned snapshot operation has no bound provider interactor.`,{reason:`provider-runtime-interactor-missing`,deviceId:t.device.id});let o=await a.snapshot({...n.options,signal:r});if(!p(o))return o;if(!t.presentIosAcquisition)throw new e(`COMMAND_FAILED`,`Acquired iOS snapshot has no host presentation owner.`,{reason:`ios-snapshot-presenter-missing`,deviceId:t.device.id});return await t.presentIosAcquisition(o,n.options)};return Object.freeze({captureSnapshot:n,captureSnapshotWithCustomActions:n,captureSnapshotWithoutActiveApp:n})}function d(e){return u({...e,ownership:`local`})}function f(e){return u({...e,ownership:`provider`})}function p(e){return`stage`in e&&e.stage===`acquired`}function m(e){return Object.freeze({findText:e.findText})}function h(e){return Object.freeze({setViewport:e.setViewport})}function g(e){return Object.freeze({focusPoint:e.focus})}function _(e,t){return Object.freeze({focusPoint:async n=>{e.throwIfAborted(),await(await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})).focus(n.point.x,n.point.y)}})}function v(e){return _(e.signal,n(e))}function y(e){return _(e.signal,r({...e,operation:`focus`}))}function b(e){let t=t=>t??e.unsupported;return Object.freeze({performGesturePlan:t(e.plan),performDirectionalFlingPlan:t(e.directionalFling),performMultiTouchGesturePlan:t(e.multiTouch),performTargetAuthoredDrag:t(e.targetAuthoredDrag),gestureViewport:t(e.viewport)})}function x(e,n,r){let i=async e=>{let i=await S(n,r,e);if(typeof i.performGesture!=`function`)throw t(`Runtime owner advertised gesture execution without an interactor implementation`);return await i.performGesture(e.plan)};return Object.freeze({...e.performGesturePlan.available?{performGesturePlan:i}:{},...e.performDirectionalFlingPlan.available?{performDirectionalFlingPlan:i}:{},...e.performMultiTouchGesturePlan.available?{performMultiTouchGesturePlan:i}:{},...e.performTargetAuthoredDrag.available?{performTargetAuthoredDrag:i}:{},...e.gestureViewport.available?{gestureViewport:async e=>{let i=await S(n,r,e);if(typeof i.gestureViewport!=`function`)throw t(`Runtime owner advertised gestureViewport without an interactor implementation`);return await i.gestureViewport()}}:{}})}async function S(e,t,n){return e.throwIfAborted(),await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})}function C(e){return x(e.facts,e.signal,n(e))}function w(e){return x(e.facts,e.signal,r({...e,operation:`gesture`}))}function T(e){return Object.freeze({scrollDirection:e.scroll})}function E(e,t){return Object.freeze({scrollDirection:async n=>(e.throwIfAborted(),await(await t({...n.execution,appBundleId:n.target?.appBundleId,signal:e})).scroll(n.direction,n.options))})}function D(e){return E(e.signal,n(e))}function O(e){return E(e.signal,r({...e,operation:`scroll`}))}function k(e){return Object.freeze({typeText:e.type})}function A(e,t){return Object.freeze({typeText:async n=>(e.throwIfAborted(),await(await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})).type(n.text,n.delayMs))})}function j(e){return A(e.signal,n(e))}function M(e){return A(e.signal,r({...e,operation:`type`}))}function N(e){return typeof e!=`string`||e.trim().length===0?Object.freeze({status:`unreadable`,reason:`no-text-at-point`}):Object.freeze({status:`read`,text:e})}function P(e){return Object.freeze({readTextAtPoint:e.readTextAtPoint})}function F(e){return Object.freeze({readTextAtPoint:async n=>{let r=e.signal;r.throwIfAborted();let i=await e.resolveInteractor(e.device,{...n.execution,appBundleId:n.options?.appBundleId,signal:r});if(typeof i.readTextAtPoint!=`function`)throw t(`Runtime owner advertised readTextAtPoint without an interactor implementation`);return N(await i.readTextAtPoint(n.point,{appBundleId:n.options?.appBundleId,surface:n.options?.surface,signal:r}))}})}function I(e){return Object.freeze({back:e.back})}function ee(e,t){return Object.freeze({back:async n=>{e.throwIfAborted(),await(await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})).back(n.mode)}})}function L(e){return Object.freeze({home:e.home})}function R(e,t){return Object.freeze({home:async n=>{e.throwIfAborted(),await(await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})).home()}})}function z(e){return Object.freeze({setOrientation:e.orientation})}function B(e,t){return Object.freeze({setOrientation:async n=>(e.throwIfAborted(),await(await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})).setOrientation(n.rotation))})}function V(e){return Object.freeze({tvRemote:e.tvRemote})}function H(e,t){return Object.freeze({tvRemote:async n=>{e.throwIfAborted(),await(await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})).tvRemote(n.button,n.durationMs)}})}function U(e){let t=t=>t??e.unsupported;return Object.freeze({keyboardStatus:t(e.status),keyboardDismiss:t(e.dismiss),keyboardEnter:t(e.enter)})}function W(t,n){if(t)return t;throw new e(`COMMAND_FAILED`,`${n} was admitted but its bound interactor has no implementation.`,{reason:`interactor-method-missing`})}async function G(e,t,n){return e.throwIfAborted(),await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})}const K={keyboardStatus:`keyboard status`,keyboardDismiss:`keyboard dismiss`,keyboardEnter:`keyboard enter`};function q(e,t,n){let r=async r=>{let i=await G(t,n,r);return await W(i[e],K[e]).call(i)};return Object.freeze({[e]:r})}function J(e){let t=t=>t??e.unsupported;return Object.freeze({readClipboard:t(e.read),writeClipboard:t(e.write)})}async function Y(e,t,n){return e.throwIfAborted(),await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})}function X(e,t){return Object.freeze({readClipboard:async n=>await(await Y(e,t,n)).readClipboard()})}function Z(e,t){return Object.freeze({writeClipboard:async n=>{await(await Y(e,t,n)).writeClipboard(n.text)}})}function Q(e){return Object.freeze({appSwitcher:e.appSwitcher})}function $(e,t){return Object.freeze({appSwitcher:async n=>{e.throwIfAborted(),await(await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})).appSwitcher()}})}function te(e){return Object.freeze({triggerAppEvent:e.triggerAppEvent})}function ne(e,t){return Object.freeze({triggerAppEvent:async n=>{e.throwIfAborted(),await(await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})).open(n.eventUrl,{appBundleId:n.options?.appBundleId})}})}function re(e){return Object.freeze({setSetting:e.setSetting})}function ie(e,t){return Object.freeze({setSetting:async n=>(e.throwIfAborted(),await(await t({...n.execution,appBundleId:n.appBundleId,signal:e})).setSetting(n.setting,n.state,n.appBundleId,n.options))})}function ae(e){return Object.freeze({readAlert:e.read,awaitAlert:e.wait,acceptAlert:e.accept,dismissAlert:e.dismiss})}async function oe(e,t,n){return e.throwIfAborted(),await t({...n.execution,appBundleId:n.appBundleId,signal:e})}function se(e){return{...e.timeoutMs===void 0?{}:{timeoutMs:e.timeoutMs},...e.appBundleId===void 0?{}:{appBundleId:e.appBundleId},...e.surface===void 0?{}:{surface:e.surface}}}function ce(e,t,n){return Object.freeze({[e]:async r=>await(await oe(t,n,r))[e](se(r))})}export{T as A,f as B,F as C,k as D,M as E,y as F,i as G,l as H,g as I,h as L,w as M,b as N,D as O,v as P,m as R,ee as S,j as T,o as U,c as V,s as W,B as _,te as a,L as b,$ as c,J as d,K as f,V as g,H as h,re as i,C as j,O as k,X as l,U as m,ce as n,ne as o,q as p,ie as r,Q as s,ae as t,Z as u,z as v,P as w,I as x,R as y,d as z};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{p as e}from"./sdk-contracts.js";import{
|
|
1
|
+
import{p as e}from"./sdk-contracts.js";import{Er as t,Mr as n,Rr as r}from"./sdk-batch.js";import{n as i,t as a}from"./rect-center.js";const o=new WeakMap;function s(e,t){return o.set(e,{...o.get(e),...t}),e}function c(e,t){return s(e,{clickability:t})}function l(e){return e?o.get(e)?.clickability:void 0}function u(e,t){let n=l(e);return n?c(t,n):t}function d(e,t){return s(e,{occlusionContext:t})}function f(e){return e?o.get(e)?.occlusionContext:void 0}const p=[`tabbar`,`toolbar`,`navigationbar`,`bottomnavigation`,`bottomnavigationview`,`sheet`,`dialog`,`alert`,`popover`,`menu`],m=[`tabbar`,`toolbar`,`navigationbar`],h=[`button`,`link`,`menuitem`,`tabitem`,`textfield`,`searchfield`,`edittext`,`checkbox`,`radio`,`switch`,`cell`];function g(e,t={}){if(e.length<2)return e;let n=new Map(e.map(e=>[e.index,e])),r={nodes:e,byIndex:n,overlayPositions:e.flatMap((e,r)=>E(e,n,t)?[r]:[]),coverCache:new Map},i=[];for(let[n,a]of e.entries())T(a)&&b(r,n,a,t)&&i.push(n);return v(e,i)}function _(e,t){let n=[];for(let[r,i]of e.entries())T(i)&&t(i)&&n.push(r);return v(e,n)}function v(e,t){if(t.length===0)return e;let n=[...e];for(let r of t){let t=e[r];n[r]={...t,hittable:!1,interactionBlocked:`covered`,presentationHints:L(t.presentationHints)}}return n}function y(e){return e.interactionBlocked!==void 0}function b(t,n,r,i){let a=t.coverCache.get(n);if(a!==void 0)return a;t.coverCache.set(n,null);let o=I(r.rect);if(!o)return S(t,n,null);let s=e(o),c=i.isAdditionalOverlayNode?.(r)===!0;for(let e of t.overlayPositions){if(!x(t,e,n,c,i))continue;let a=t.nodes[e];if(C(t,e,r,o,s,i))return S(t,n,a)}return S(t,n,null)}function x(e,t,n,r,i){let a=e.nodes[t];return a?t>n?!0:t===n||r?!1:i.isAdditionalOverlayNode?.(a)===!0:!1}function S(e,t,n){return e.coverCache.set(t,n),n}function C(e,t,n,i,a,o){if(!e.nodes[t])return!1;let s=w(e,t,n,i,o);return!!(s&&r(s,a.x,a.y))}function w(e,t,n,r,i){let o=e.nodes[t];if(!o||!E(o,e.byIndex,i)||P(n,o,e.byIndex))return null;let s=I(o.rect);return!s||a(r,s)||b(e,t,o,i)?null:s}function T(e){return I(e.rect)?e.hittable===!0||j(e)?!0:!!(e.label?.trim()||e.value?.trim()||e.identifier?.trim()):!1}function E(e,n,r){return!I(e.rect)||t(e)||D(e,n)?!1:M(e,p)||O(e,n,r)}function D(e,n){if(!M(e,m))return!1;let r=I(e.rect);if(!r)return!1;let i=typeof e.parentIndex==`number`?n.get(e.parentIndex):void 0,o=new Set;for(;i&&!o.has(i.index);){if(t(i)){let e=I(i.rect);return!!(e&&a(r,e))}o.add(i.index),i=typeof i.parentIndex==`number`?n.get(i.parentIndex):void 0}return!1}function O(e,t,n){return n.isAdditionalOverlayNode?.(e)===!0&&!k(e,t,n)}function k(e,t,n){let r=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0,i=new Set;for(;r&&!i.has(r.index);){if(A(r,n))return!0;i.add(r.index),r=typeof r.parentIndex==`number`?t.get(r.parentIndex):void 0}return!1}function A(e,n){return n.isAdditionalOverlayNode?.(e)===!0&&I(e.rect)!==null&&!t(e)}function j(e){return M(e,h)}function M(e,t){let n=N(e);return t.some(e=>n.includes(e))}function N(e){return[e.type,e.role,e.subrole].map(e=>n(e??``)).join(` `)}function P(e,t,n){return F(e,t,n)||F(t,e,n)}function F(e,t,n){let r=typeof t.parentIndex==`number`?n.get(t.parentIndex):void 0,i=new Set;for(;r&&!i.has(r.index);){if(r.index===e.index)return!0;i.add(r.index),r=typeof r.parentIndex==`number`?n.get(r.parentIndex):void 0}return!1}function I(e){let t=i(e);return t&&t.width>0&&t.height>0?t:null}function L(e){return Array.from(new Set([...e??[],`covered`]))}const R=new Set([`com.google.android.inputmethod.latin`,`com.samsung.android.honeyboard`,`com.touchtype.swiftkey`,`com.microsoft.swiftkey`]);function z(e){let t=J(e.packageName),n=(e.resourceId??``).toLowerCase(),r=J(e.activeInputMethodPackage);if(t&&r&&t===r)return{inputMethodOwned:!0,source:`active-input-method`};if(r&&n.startsWith(`${r}:id/`))return{inputMethodOwned:!0,source:`active-input-method-resource`};if(t&&R.has(t))return{inputMethodOwned:!0,source:`known-ime-package`};for(let e of R)if(n.startsWith(`${e}:id/`))return{inputMethodOwned:!0,source:`known-ime-resource`};return{inputMethodOwned:!1,source:`app`}}function B(e,t,n){return z({packageName:e,resourceId:t,activeInputMethodPackage:n}).inputMethodOwned}function V(e){return z(e).inputMethodOwned}function H(e){return V({packageName:e.bundleId,resourceId:e.identifier})}function U(e){let t=J(e);return!!(t&&R.has(t))}function W(e){let t=(e??``).toLowerCase();for(let e of R)if(t.startsWith(`${e}:id/`))return!0;return!1}function G(e,t,n){return!e&&!t?`unknown`:B(e,t,n)?`ime`:`app`}function K(e){for(let t of[/\bmCurMethodId=([^\s]+)/i,/\bmCurId=([^\s]+)/i,/\bmCurrentInputMethodId=([^\s]+)/i,/\bcurMethodId=([^\s]+)/i]){let n=q(e.match(t)?.[1]);if(n)return n}}function q(e){let t=(e??``).trim();if(t)return J((t.split(`/`)[0]??``).match(/[a-zA-Z0-9_.]+/)?.[0])}function J(e){return(e??``).trim().toLowerCase()||void 0}export{W as a,_ as c,d,u as f,U as i,y as l,f as m,H as n,K as o,l as p,V as r,g as s,G as t,c as u};
|
package/dist/src/app-helpers.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{n as e}from"./app-inventory.js";import"./device.js";import{n as t}from"./adb-failure.js";import"./adb-executor.js";import{n}from"./app-deployment-resolution.js";import{a as r,i}from"./app-parsers.js";const a=`android.intent.category.LAUNCHER`,o=`android.intent.category.LEANBACK_LAUNCHER`;async function s(t,r={}){let i=await c(t,r.target??`auto`);return(e(r.filter)===`user-installed`?(await f(t)).filter(e=>i.has(e)):Array.from(i)).map(e=>({package:e,name:n(e)})).sort((e,t)=>e.package.localeCompare(t.package))}async function c(e,t){let n=(await Promise.all(l(t).map(async t=>{let n=await e(u(t),{allowFailure:!0});return n.exitCode===0?d(n.stdout):[]}))).flat();return new Set(n)}function l(e){switch(e){case`mobile`:return[a];case`tv`:return[o];default:return[a,o]}}function u(e){return[`shell`,`cmd`,`package`,`query-activities`,`--brief`,`-a`,`android.intent.action.MAIN`,`-c`,e]}function d(e){return e.trim().length===0?[]:i(e)}async function f(e){let n=await e([`shell`,`pm`,`list`,`packages`,`-3`],{allowFailure:!0});if(n.exitCode!==0)throw t(`Failed to list Android user-installed apps`,n);return r(n.stdout)}export{s as listAndroidAppsWithAdb};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import
|
|
1
|
+
import"./device.js";export{};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{C as e}from"./sdk-contracts.js";
|
|
1
|
+
import{C as e}from"./sdk-contracts.js";function t(e){return e??`user-installed`}function n(t){if(t===void 0)throw new e(`INVALID_ARGS`,`appsFilter must be resolved before executing the apps command`);return t}export{t as n,n as t};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{C as e}from"./sdk-contracts.js";import{l as t}from"./sdk-device.js";import{
|
|
1
|
+
import{C as e}from"./sdk-contracts.js";import{l as t}from"./sdk-device.js";import{Jt as n,Xt as r}from"./sdk-batch.js";import{n as i,o as a,r as o,s}from"./request-cancellation.js";import{n as c,t as l}from"./application-lifecycle-runtime.js";import{i as u,n as d}from"./touch-runtime.js";import{A as ee,B as te,D as ne,E as re,F as ie,G as f,H as p,I as ae,L as m,M as oe,N as h,R as g,W as se,a as ce,b as _,d as v,g as y,i as le,k as ue,m as de,s as fe,t as pe,v as b,w as me,x}from"./alert-runtime.js";import{n as he}from"./audio-probe-runtime.js";import{n as ge}from"./perf-runtime.js";import{r as _e}from"./platform-runtime-unavailable.js";import{a as ve,n as ye}from"./durable-resource.js";import{t as be}from"./async-lifecycle.js";import{a as S,d as xe,f as Se,n as Ce,o as we,u as Te}from"./src7.js";import{i as Ee,t as De}from"./gesture-admission.js";import{n as Oe}from"./interactor-operation-catalog.js";import{t as C}from"./app-log-runtime.js";import{r as ke,t as Ae}from"./application-lifecycle-interaction.js";import{setTimeout as je}from"node:timers/promises";const w=Object.freeze({available:!0}),Me=Object.freeze({available:!1,reason:`unsupported-provider-mode`,hint:`Limrun iOS direct sessions do not expose portable gesture execution yet.`}),Ne=Object.freeze({available:!1,reason:`unsupported-provider-mode`}),Pe=Object.freeze({available:!1,reason:`unsupported-provider-mode`}),Fe=Object.freeze({available:!1,reason:`unsupported-platform-leaf`,hint:De}),Ie=Object.freeze({available:!1,reason:`unsupported-platform-leaf`,hint:Ee});function T(e,t){if(!t.available)return h({unsupported:t});if(e.platform!==`android`)return h({unsupported:Me});let n=e.target===`tv`;return h({unsupported:Ne,plan:w,directionalFling:w,multiTouch:n?Fe:w,targetAuthoredDrag:n?Ie:w,viewport:w})}const Le=Object.freeze({available:!1,reason:`unsupported-provider-mode`,hint:`Limrun iOS direct sessions do not expose home yet.`}),Re=Object.freeze({available:!1,reason:`unsupported-provider-mode`,hint:`Limrun iOS direct sessions do not expose tv remote control.`}),ze=Object.freeze({available:!1,reason:`unsupported-device-kind`,hint:`tv-remote is supported only on Android TV targets.`}),Be=Object.freeze({available:!1,reason:`unsupported-provider-mode`,hint:`Limrun iOS direct sessions do not expose keyboard actions.`}),Ve=Object.freeze({available:!1,reason:`unsupported-provider-mode`,hint:`Limrun iOS direct sessions do not expose clipboard access yet.`}),He=Object.freeze({available:!1,reason:`unsupported-provider-mode`,hint:`Limrun iOS direct sessions do not expose settings changes yet.`}),Ue=Object.freeze({available:!1,reason:`unsupported-provider-mode`,hint:`Limrun iOS direct sessions do not expose app switcher yet.`});function E(e,n){let r=n??w,i=Object.freeze({available:!1,reason:`unsupported-provider-mode`});return Object.freeze({...ae({focus:r}),...ne({type:r}),...u({unsupported:i,tap:r,longPress:n??(t(e)?i:r),hover:n??i,fill:r,tapElementSelector:n??(t(e)?r:i)}),...T(e,r),...ee({scroll:r})})}function We(e){let{device:t,signal:n}=e,r=n=>e.getInteractor(t,n);return Object.freeze({...te({device:t,signal:n,resolveInteractor:r,presentIosAcquisition:e.presentIosAcquisition}),...ie({device:t,signal:n,resolveInteractor:r}),...re({device:t,signal:n,resolveInteractor:r}),...d({device:t,signal:n,resolveInteractor:r,facts:E(t),pause:async e=>await je(e,void 0,{signal:n})}),...se({device:t,signal:n,resolveInteractor:r}),...oe({device:t,signal:n,facts:T(t,w),resolveInteractor:r}),...ue({device:t,signal:n,resolveInteractor:r})})}function D(e,t){return t?Object.freeze({...x({back:t}),..._({home:t}),...b({orientation:t}),...y({tvRemote:t})}):e.platform===`android`?Object.freeze({...x({back:w}),..._({home:w}),...b({orientation:w}),...y({tvRemote:e.target===`tv`?w:ze})}):Object.freeze({...x({back:w}),..._({home:Le}),...b({orientation:w}),...y({tvRemote:Re})})}function O(e,t){return t?Object.freeze({...v({unsupported:t})}):e.platform===`android`?Object.freeze({...v({unsupported:Pe,read:w,write:w})}):Object.freeze({...v({unsupported:Ve})})}const Ge=Object.freeze({available:!1,reason:`unsupported-provider-mode`,hint:`Limrun iOS direct sessions do not expose alert inspection yet.`});function k(e,t){let n=t??(e.platform===`android`?w:Ge);return Object.freeze({...pe({read:n,wait:n,accept:n,dismiss:n})})}function A(e,t){let n=t??(e.platform===`android`?w:Ue);return Object.freeze({...fe({appSwitcher:n})})}function j(e,t){return Object.freeze({...ce({triggerAppEvent:t??w})})}function M(e,t){let n=t??(e.platform===`android`?w:He);return Object.freeze({...le({setSetting:n})})}function N(e,t){let n=t??Be,r=t===void 0&&e.platform===`android`;return Object.freeze({...de(r?{unsupported:n,status:w,dismiss:w,enter:w}:{unsupported:n})})}const P=Object.freeze({resourceKind:C,version:1,encode:e=>({...e}),decode:e=>e.transport!==`limrun-log-poller`||e.platform!==`ios`&&e.platform!==`android`||!F(e.leaseId)||!F(e.instanceId)||!F(e.appBundleId)||!F(e.outputPath)?{status:`invalid`,message:`Invalid Limrun app-log descriptor`}:{status:`decoded`,descriptor:Object.freeze({transport:`limrun-log-poller`,platform:e.platform,leaseId:e.leaseId,instanceId:e.instanceId,appBundleId:e.appBundleId,outputPath:e.outputPath})}});function Ke(e){if(e.device.platform===`apple`&&!e.device.appleOs)throw TypeError(`Limrun Apple app-log persistence requires an explicit appleOs identity`);return ye({resourceKind:C,sessionId:e.sessionId,device:{id:e.device.id,family:e.device.platform,...e.device.appleOs===void 0?{}:{appleOs:e.device.appleOs},kind:e.device.kind,...e.device.target===void 0?{}:{target:e.device.target},...e.device.iosPhysicalDeviceBackend===void 0?{}:{iosPhysicalDeviceBackend:e.device.iosPhysicalDeviceBackend}},owner:e.owner,fence:e.fence,lifecycle:`open`,descriptor:ve(P,e.descriptor)})}function F(e){return typeof e==`string`&&e.trim().length>0}async function I(e){let t=new be,n=!1;t.defer(async()=>{n||await e.reader[Symbol.asyncDispose]()});try{let r=await e.host.outputs.readTail(e.outputPath,262144),i=await e.host.outputs.openAppend(e.outputPath);t.defer(async()=>{n||await i[Symbol.asyncDispose]()});let a=qe(e,i,Qe(r));return n=!0,a}finally{await t[Symbol.asyncDispose]()}}function qe(e,t,n){let r=et(e.reader),i=e.host.clock.now(),a=`active`,o=!1,s=n,c=(async()=>{for(;!o;){try{let n=await Je(e);if(n.status===`timeout`){a=`failed`;return}if(o)return;let r=Ye(s,n.text);s=n.text,r&&await t.write(r.endsWith(`
|
|
2
2
|
`)?r:`${r}\n`),a=`active`}catch{if(o)return;a=`recovering`}await e.host.clock.sleep(1e3)}})(),l;return Te({inspect:()=>({backend:r,state:a,startedAt:i}),finish:async()=>l??=(async()=>(o=!0,await c,(await $e([e.reader,t])).length>0?(a=`failed`,{status:`cleanup-pending`,reason:`transport-failed`,message:`Limrun app-log cleanup did not settle every owned resource`}):(a=`ended`,{status:`completed`,result:{backend:r,outputPath:e.outputPath,completedAt:e.host.clock.now()}})))()})}async function Je(e){let t=new AbortController,n=i(e.reader.readLogs(e.appBundleId,1e3),t.signal,`App-log provider read aborted`).then(e=>({status:`read`,text:e}));try{let r=await Promise.race([n,e.host.clock.sleep(5e3,t.signal).then(()=>({status:`timeout`}))]);return r.status===`timeout`&&(t.abort(),await n.catch(()=>void 0)),r}finally{t.abort()}}function Ye(e,t){if(!e||!t)return t;let n=Xe(t),r=Math.min(e.length,t.length),i=e.slice(e.length-r);return t.slice(Ze(i,t,n))}function Xe(e){let t=new Uint32Array(e.length),n=0;for(let r=1;r<e.length;r+=1){for(;n>0&&e[r]!==e[n];)n=t[n-1];e[r]===e[n]&&(n+=1),t[r]=n}return t}function Ze(e,t,n){let r=0;for(let i=0;i<e.length;i+=1){for(;r>0&&e[i]!==t[r];)r=n[r-1];e[i]===t[r]&&(r+=1),r===t.length&&i<e.length-1&&(r=n[r-1])}return r}function Qe(e){return e.split(`
|
|
3
3
|
`).filter(e=>!e.startsWith(`[agent-device][mark]`)).join(`
|
|
4
|
-
`)}async function $e(e){return(await Promise.allSettled(e.map(async e=>await e[Symbol.asyncDispose]()))).flatMap(e=>e.status===`rejected`?[e.reason]:[])}function et(e){return e.platform===`ios`?`ios-simulator`:`android`}function tt(e){let t=Ae({owner:`Limrun`,openTargetIdentity:`bundle-id`,closeBeforeRelaunch:!0,configureProviderPortReverse:async t=>await e.configurePortReverse(t),binding:ke({device:e.device,signal:e.signal,resolveInteractor:t=>e.getInteractor(e.device,t)})}),n=e.resolveAppReference;return n?Object.freeze({...t,resolveOpenTarget:async e=>await t.resolveOpenTarget(nt(e,n)),openApplication:async e=>await t.openApplication(rt(e,n)),closeApplication:async e=>await t.closeApplication(it(e,n))}):t}function nt(e,t){return e.target===void 0?e:{...e,target:t(e.target)}}function rt(e,t){return{...e,target:R(e.target,t),positionals:L(e.positionals,t),appBundleId:R(e.appBundleId,t)}}function it(e,t){return{...e,positionals:L(e.positionals,t),appBundleId:R(e.appBundleId,t)}}function L(e,t){let n=e[0];return n===void 0?e:[t(n),...e.slice(1)]}function R(e,t){return e===void 0?void 0:t(e)}function at(e){let t=s(e.id);return!t||e.target!==`mobile`?!1:t.platform===`ios`?e.platform===`apple`&&e.appleOs===`ios`&&e.kind===`simulator`&&e.iosPhysicalDeviceBackend===void 0:e.platform===`android`&&e.appleOs===void 0&&e.kind===`emulator`&&e.iosPhysicalDeviceBackend===void 0}const ot=Object.freeze({available:!0}),z=Object.freeze({available:!1,reason:`owner-capability-missing`,hint:`The Limrun provider session is no longer active for this device.`}),st=Object.freeze({available:!1,reason:`unsupported-provider-mode`,hint:`Push notifications are unavailable for Limrun provider-owned devices.`});function B(e,t){let n=lt(e,t);return Object.freeze({deployApp:n,materializeAppSource:n,deployMaterializedApp:n,sendPushNotification:V(e,t)?st:z})}function ct(e,t,n,r){let i=e.deployApp,a=e.deployMaterializedApp;return!B(e,t).deployApp.available||!i||!a?Object.freeze({}):Object.freeze({deployApp:async e=>H(await i(t,e,n,r)),materializeAppSource:async r=>await ut(e.host,t,r,n),deployMaterializedApp:async e=>H(await a(t,e,n,r))})}function lt(e,t){return at(t)&&V(e,t)&&e.deployApp&&e.deployMaterializedApp?ot:z}function V(e,t){return e.isSessionActive?.(t)??e.ownsDevice(t)}async function ut(e,t,n,r){return await(t.platform===`apple`?e.appleDeployment:e.androidDeployment).prepareArtifact(n,{signal:r})}function H(t){if(!t)throw new e(`UNSUPPORTED_OPERATION`,`The Limrun provider session is no longer active.`);return t}const U=Object.freeze({available:!0}),W=Object.freeze({available:!1,reason:`unsupported-provider-mode`,hint:`Custom snapshot actions are available only for Limrun iOS simulator sessions.`}),dt=Object.freeze({available:!1,reason:`unsupported-provider-mode`,hint:`Limrun does not expose viewport resizing.`}),G=Object.freeze({available:!1,reason:`unsupported-provider-mode`,hint:`Limrun-owned devices read element text from the captured tree only.`}),K=Object.freeze({available:!1,reason:`unsupported-provider-mode`,hint:`Limrun does not expose an exact-owner screen-recording runtime.`}),ft=Object.freeze({available:!1,reason:`unsupported-provider-mode`,hint:`Headless boot is unavailable for provider-owned devices.`}),q=Object.freeze({available:!1,reason:`owner-capability-missing`,hint:`Limrun requires a matching live provider session for this device.`}),pt=Object.freeze({available:!1,reason:`unsupported-provider-mode`,hint:`Apple runner preparation is unavailable for Limrun-owned devices.`}),mt=Object.freeze({available:!1,reason:`unsupported-provider-mode`,hint:`Limrun iOS appstate is session-owned; no sessionless provider foreground probe is exposed.`}),ht=Object.freeze({available:!1,reason:`unsupported-provider-mode`,hint:`Limrun open requires a Limrun-owned iOS simulator or Android emulator.`}),gt=Object.freeze({available:!1,reason:`unsupported-provider-mode`,hint:`Limrun close requires a Limrun-owned iOS simulator or Android emulator.`}),J=Object.freeze({available:!1,reason:`unsupported-provider-mode`,hint:`Runtime hints are not applied to provider-owned devices.`}),_t=Object.freeze({available:!1,reason:`unsupported-provider-mode`,hint:`Limrun port reverse requires an active Android Limrun session.`}),Y=Object.freeze({available:!1,reason:`unsupported-provider-mode`,hint:`Limrun does not expose the audio probe.`});function vt(e){return{...e,isSessionActive:e.hasLiveSession}}function X(e,t){let n=yt(e,t),r=bt(e,t),i=xt(e,t);return l({resolveOpenTarget:n,prepareApplicationOpen:n,openApplication:n,applyRuntimeHints:J,clearRuntimeHints:J,closeApplication:r,finalizeApplicationClose:r,prepareAppleRunner:pt,configureProviderPortReverse:i})}function yt(e,t){return a(e)?t?U:q:ht}function bt(e,t){return a(e)?t?U:q:gt}function xt(e,t){return t?e.platform===`android`?U:_t:q}function Z(e,n){let r=B(vt(e),n),i=n.platform===`android`,a=t(n)&&n.kind===`simulator`?U:W;return Object.freeze({device:{family:n.platform,...n.appleOs===void 0?{}:{appleOs:n.appleOs},kind:n.kind,...n.target===void 0?{}:{target:n.target},...n.iosPhysicalDeviceBackend===void 0?{}:{iosPhysicalDeviceBackend:n.iosPhysicalDeviceBackend},providerMode:`provider-runtime`},operations:{appLogInspect:U,appLogDoctor:U,appLogStart:U,appLogReattach:U,appLogCleanup:U,...r,appState:i?U:mt,networkDump:U,screenRecordingStart:K,screenRecordingReattach:K,screenRecordingCleanup:K,...p({capture:U,customActions:a,withoutActiveApp:U}),...f({capture:U}),...g({findText:W}),...m({setViewport:dt}),...E(n),...me({readTextAtPoint:G}),...D(n),...N(n),...O(n),...A(n),...j(n),...M(n),...k(n),...he({capture:Y,query:Y}),...ge({frames:G,memorySample:G,memorySnapshot:G,nativeCapture:G,profileReport:G}),ensureReady:U,bootTarget:U,bootTargetHeadless:ft,listApps:U,shutdownTarget:{available:!1,reason:`unsupported-provider-mode`,hint:`Limrun owns the target lifecycle for provider-owned devices.`},...X(n,!0)}})}function St(e,t){let n=Z(e,t);return Object.freeze({device:n.device,operations:{...n.operations,appLogInspect:q,appLogDoctor:q,appLogStart:q,appLogReattach:U,appLogCleanup:U,appState:q,networkDump:q,screenRecordingStart:q,screenRecordingReattach:q,screenRecordingCleanup:q,...p({capture:q,customActions:q,withoutActiveApp:q}),...f({capture:q}),...g({findText:q}),...m({setViewport:q}),...E(t,q),...D(t,q),...N(t,q),...O(t,q),...A(t,q),...j(t,q),...M(t,q),...k(t,q),ensureReady:q,bootTarget:q,bootTargetHeadless:q,listApps:q,deployApp:q,materializeAppSource:q,deployMaterializedApp:q,sendPushNotification:q,shutdownTarget:q,...X(t,!1)}})}function Ct(t){let i=r(`limrun`,t.runtimeInstance),o=e=>a(e)&&t.ownsDevice(e),s=e=>o(e)&&t.hasLiveSession(e);return Object.freeze({owner:i,ownsDevice:o,inspectFacts:async e=>s(e)?Z(t,e):_e(e,i,{appLog:q,appState:q,appDeployment:q,network:q,screenshot:q,viewport:q,focus:q,gesture:q,scroll:q,typeText:q,touch:q,elementText:q,back:q,home:q,orientation:q,tvRemote:q,keyboard:q,clipboard:q,appSwitcher:q,triggerAppEvent:q,setSetting:q,readAlert:q,awaitAlert:q,acceptAlert:q,dismissAlert:q,audioProbeCapture:q,audioProbeQuery:q,perf:q,readiness:q,shutdown:q,lifecycle:X(e,!1)}),bind:async r=>{if(r.intent.kind===`exact-owner`&&!n(r.intent.owner,i))throw new e(`UNSUPPORTED_OPERATION`,`Limrun app-log owner identity does not match`);if(!a(r.device))throw new e(`UNSUPPORTED_PLATFORM`,`Limrun app logs require an iOS simulator or Android emulator device identity`);let o=s(r.device);if(r.intent.kind!==`exact-owner`&&!o)throw new e(`UNSUPPORTED_OPERATION`,`Limrun provider session is no longer live for the selected device`,{reason:`provider-session-unavailable`});return wt(t,i,r.device,r.scope.signal,!o)},shutdown:async()=>void 0})}function wt(t,n,r,i,a){let s=a?St(t,r):Z(t,r),l=o(),u=xe({codec:P,reattach:async(e,n)=>{if(!$(e,r)||!S(t.host,n.sessionId,e))return{status:`unreattachable`,reason:`descriptor-invalid`,message:`Limrun app-log descriptor does not match the bound device or owning session`};let a=await t.reconnect(e,i);return a.status===`missing`?{status:`missing`}:a.status===`ownership-lost`?{status:`unreattachable`,reason:`ownership-fence-lost`}:{status:`active`,handle:await I({host:t.host,reader:a.reader,appBundleId:e.appBundleId,outputPath:e.outputPath})}},cleanup:async(e,n)=>$(e,r)&&S(t.host,n.sessionId,e)?{status:`cleaned`}:{status:`cleanup-pending`,reason:`ownership-fence-lost`,message:`Limrun app-log descriptor does not match the bound device or owning session`}}),d={appLogInspect:async()=>({backend:Q(r)}),appLogDoctor:async()=>({backend:Q(r),checks:{limrunSessionAvailable:await Tt(t,r,i)},notes:[]}),appLogStart:async a=>{we(t.host,a),i.throwIfAborted();let o=await t.openCurrent(r);if(!o)throw new e(`UNSUPPORTED_OPERATION`,`Limrun app logs require an active instance`);let s={transport:`limrun-log-poller`,platform:o.platform,leaseId:o.leaseId,instanceId:o.instanceId,appBundleId:a.appBundleId,outputPath:a.outputPath},c=!1;try{i.throwIfAborted();let e=Ke({sessionId:a.sessionId,device:r,owner:n,fence:a.fence,descriptor:s});c=!0;let l=await I({host:t.host,reader:o,appBundleId:a.appBundleId,outputPath:a.outputPath});return Se(l,e)}catch(e){throw c||await o[Symbol.asyncDispose](),e}},...u,networkDump:async e=>{let n=await t.host.appLogs.readRecent(e.sessionId,e.maxScanLines),i=Q(r),{dump:a}=Ce(n.text,{...e,path:n.path,exists:n.exists,lineNumberOffset:n.skippedLines,backend:i}),o=a.entries.length===0?[`No HTTP(s) entries were found in recent session app logs.`]:[];return Object.freeze({source:`app-log`,backend:i,dump:a,notes:o})},ensureReady:async()=>({...r,booted:!0}),bootTarget:async()=>({...r,booted:!0}),listApps:async e=>await t.listApps(e.device,e.filter,i),...r.platform===`android`?{appState:async()=>await t.getAppState(r,i)}:{},...c(tt({device:r,signal:i,getInteractor:t.getInteractor,resolveAppReference:e=>t.resolveAppReference?.(r,e)??e,configurePortReverse:t.configurePortReverse}),s.operations),...We({device:r,signal:i,getInteractor:t.getInteractor,presentIosAcquisition:t.host.snapshot.presentIosAcquisition}),...Oe({device:r,signal:i,resolveInteractor:e=>t.getInteractor(r,e),facts:s.operations}),...ct(vt(t),r,i,l)};return Object.freeze({device:r,owner:n,facts:s,operations:Object.freeze(a?{appLogReattach:u.appLogReattach,appLogCleanup:u.appLogCleanup}:d),[Symbol.asyncDispose]:async()=>await l[Symbol.asyncDispose]()})}async function Tt(e,t,n){n.throwIfAborted();let r=await e.openCurrent(t);if(!r)return!1;try{n.throwIfAborted()}finally{await r[Symbol.asyncDispose]()}return!0}function Q(e){return e.platform===`apple`?`ios-simulator`:`android`}function $(e,t){if(!a(t))return!1;let n=s(t.id);return n!==void 0&&n.leaseId===e.leaseId&&n.platform===e.platform&&(t.platform===`apple`?e.platform===`ios`:e.platform===`android`)}export{Ct as createLimrunPlatformRuntimeOwner};
|
|
4
|
+
`)}async function $e(e){return(await Promise.allSettled(e.map(async e=>await e[Symbol.asyncDispose]()))).flatMap(e=>e.status===`rejected`?[e.reason]:[])}function et(e){return e.platform===`ios`?`ios-simulator`:`android`}function tt(e){let t=Ae({owner:`Limrun`,openTargetIdentity:`bundle-id`,closeBeforeRelaunch:!0,configureProviderPortReverse:async t=>await e.configurePortReverse(t),binding:ke({device:e.device,signal:e.signal,resolveInteractor:t=>e.getInteractor(e.device,t)})}),n=e.resolveAppReference;return n?Object.freeze({...t,resolveOpenTarget:async e=>await t.resolveOpenTarget(nt(e,n)),openApplication:async e=>await t.openApplication(rt(e,n)),closeApplication:async e=>await t.closeApplication(it(e,n))}):t}function nt(e,t){return e.target===void 0?e:{...e,target:t(e.target)}}function rt(e,t){return{...e,target:R(e.target,t),positionals:L(e.positionals,t),appBundleId:R(e.appBundleId,t)}}function it(e,t){return{...e,positionals:L(e.positionals,t),appBundleId:R(e.appBundleId,t)}}function L(e,t){let n=e[0];return n===void 0?e:[t(n),...e.slice(1)]}function R(e,t){return e===void 0?void 0:t(e)}function at(e){let t=s(e.id);return!t||e.target!==`mobile`?!1:t.platform===`ios`?e.platform===`apple`&&e.appleOs===`ios`&&e.kind===`simulator`&&e.iosPhysicalDeviceBackend===void 0:e.platform===`android`&&e.appleOs===void 0&&e.kind===`emulator`&&e.iosPhysicalDeviceBackend===void 0}const ot=Object.freeze({available:!0}),z=Object.freeze({available:!1,reason:`owner-capability-missing`,hint:`The Limrun provider session is no longer active for this device.`}),st=Object.freeze({available:!1,reason:`unsupported-provider-mode`,hint:`Push notifications are unavailable for Limrun provider-owned devices.`});function B(e,t){let n=lt(e,t);return Object.freeze({deployApp:n,materializeAppSource:n,deployMaterializedApp:n,sendPushNotification:V(e,t)?st:z})}function ct(e,t,n,r){let i=e.deployApp,a=e.deployMaterializedApp;return!B(e,t).deployApp.available||!i||!a?Object.freeze({}):Object.freeze({deployApp:async e=>H(await i(t,e,n,r)),materializeAppSource:async r=>await ut(e.host,t,r,n),deployMaterializedApp:async e=>H(await a(t,e,n,r))})}function lt(e,t){return at(t)&&V(e,t)&&e.deployApp&&e.deployMaterializedApp?ot:z}function V(e,t){return e.isSessionActive?.(t)??e.ownsDevice(t)}async function ut(e,t,n,r){return await(t.platform===`apple`?e.appleDeployment:e.androidDeployment).prepareArtifact(n,{signal:r})}function H(t){if(!t)throw new e(`UNSUPPORTED_OPERATION`,`The Limrun provider session is no longer active.`);return t}const U=Object.freeze({available:!0}),W=Object.freeze({available:!1,reason:`unsupported-provider-mode`,hint:`Custom snapshot actions are available only for Limrun iOS simulator sessions.`}),dt=Object.freeze({available:!1,reason:`unsupported-provider-mode`,hint:`Limrun does not expose viewport resizing.`}),G=Object.freeze({available:!1,reason:`unsupported-provider-mode`,hint:`Limrun-owned devices read element text from the captured tree only.`}),K=Object.freeze({available:!1,reason:`unsupported-provider-mode`,hint:`Limrun does not expose an exact-owner screen-recording runtime.`}),ft=Object.freeze({available:!1,reason:`unsupported-provider-mode`,hint:`Headless boot is unavailable for provider-owned devices.`}),q=Object.freeze({available:!1,reason:`owner-capability-missing`,hint:`Limrun requires a matching live provider session for this device.`}),pt=Object.freeze({available:!1,reason:`unsupported-provider-mode`,hint:`Apple runner preparation is unavailable for Limrun-owned devices.`}),mt=Object.freeze({available:!1,reason:`unsupported-provider-mode`,hint:`Limrun iOS appstate is session-owned; no sessionless provider foreground probe is exposed.`}),ht=Object.freeze({available:!1,reason:`unsupported-provider-mode`,hint:`Limrun open requires a Limrun-owned iOS simulator or Android emulator.`}),gt=Object.freeze({available:!1,reason:`unsupported-provider-mode`,hint:`Limrun close requires a Limrun-owned iOS simulator or Android emulator.`}),J=Object.freeze({available:!1,reason:`unsupported-provider-mode`,hint:`Runtime hints are not applied to provider-owned devices.`}),_t=Object.freeze({available:!1,reason:`unsupported-provider-mode`,hint:`Limrun port reverse requires an active Android Limrun session.`}),Y=Object.freeze({available:!1,reason:`unsupported-provider-mode`,hint:`Limrun does not expose the audio probe.`});function vt(e){return{...e,isSessionActive:e.hasLiveSession}}function X(e,t){let n=yt(e,t),r=bt(e,t),i=xt(e,t);return l({resolveOpenTarget:n,prepareApplicationOpen:n,openApplication:n,applyRuntimeHints:J,clearRuntimeHints:J,closeApplication:r,finalizeApplicationClose:r,prepareAppleRunner:pt,configureProviderPortReverse:i})}function yt(e,t){return a(e)?t?U:q:ht}function bt(e,t){return a(e)?t?U:q:gt}function xt(e,t){return t?e.platform===`android`?U:_t:q}function Z(e,n){let r=B(vt(e),n),i=n.platform===`android`,a=t(n)&&n.kind===`simulator`?U:W;return Object.freeze({device:{family:n.platform,...n.appleOs===void 0?{}:{appleOs:n.appleOs},kind:n.kind,...n.target===void 0?{}:{target:n.target},...n.iosPhysicalDeviceBackend===void 0?{}:{iosPhysicalDeviceBackend:n.iosPhysicalDeviceBackend},providerMode:`provider-runtime`},operations:{appLogInspect:U,appLogDoctor:U,appLogStart:U,appLogReattach:U,appLogCleanup:U,...r,appState:i?U:mt,networkDump:U,screenRecordingStart:K,screenRecordingReattach:K,screenRecordingCleanup:K,...p({capture:U,customActions:a,withoutActiveApp:U}),...f({capture:U}),...g({findText:W}),...m({setViewport:dt}),...E(n),...me({readTextAtPoint:G}),...D(n),...N(n),...O(n),...A(n),...j(n),...M(n),...k(n),...he({capture:Y,query:Y}),...ge({frames:G,memorySample:G,memorySnapshot:G,nativeCapture:G,profileReport:G}),ensureReady:U,bootTarget:U,bootTargetHeadless:ft,listApps:U,shutdownTarget:{available:!1,reason:`unsupported-provider-mode`,hint:`Limrun owns the target lifecycle for provider-owned devices.`},...X(n,!0)}})}function St(e,t){let n=Z(e,t);return Object.freeze({device:n.device,operations:{...n.operations,appLogInspect:q,appLogDoctor:q,appLogStart:q,appLogReattach:U,appLogCleanup:U,appState:q,networkDump:q,screenRecordingStart:q,screenRecordingReattach:q,screenRecordingCleanup:q,...p({capture:q,customActions:q,withoutActiveApp:q}),...f({capture:q}),...g({findText:q}),...m({setViewport:q}),...E(t,q),...D(t,q),...N(t,q),...O(t,q),...A(t,q),...j(t,q),...M(t,q),...k(t,q),ensureReady:q,bootTarget:q,bootTargetHeadless:q,listApps:q,deployApp:q,materializeAppSource:q,deployMaterializedApp:q,sendPushNotification:q,shutdownTarget:q,...X(t,!1)}})}function Ct(t){let i=n(`limrun`,t.runtimeInstance),o=e=>a(e)&&t.ownsDevice(e),s=e=>o(e)&&t.hasLiveSession(e);return Object.freeze({owner:i,ownsDevice:o,inspectFacts:async e=>s(e)?Z(t,e):_e(e,i,{appLog:q,appState:q,appDeployment:q,network:q,screenshot:q,viewport:q,focus:q,gesture:q,scroll:q,typeText:q,touch:q,elementText:q,back:q,home:q,orientation:q,tvRemote:q,keyboard:q,clipboard:q,appSwitcher:q,triggerAppEvent:q,setSetting:q,readAlert:q,awaitAlert:q,acceptAlert:q,dismissAlert:q,audioProbeCapture:q,audioProbeQuery:q,perf:q,readiness:q,shutdown:q,lifecycle:X(e,!1)}),bind:async n=>{if(n.intent.kind===`exact-owner`&&!r(n.intent.owner,i))throw new e(`UNSUPPORTED_OPERATION`,`Limrun app-log owner identity does not match`);if(!a(n.device))throw new e(`UNSUPPORTED_PLATFORM`,`Limrun app logs require an iOS simulator or Android emulator device identity`);let o=s(n.device);if(n.intent.kind!==`exact-owner`&&!o)throw new e(`UNSUPPORTED_OPERATION`,`Limrun provider session is no longer live for the selected device`,{reason:`provider-session-unavailable`});return wt(t,i,n.device,n.scope.signal,!o)},shutdown:async()=>void 0})}function wt(t,n,r,i,a){let s=a?St(t,r):Z(t,r),l=o(),u=xe({codec:P,reattach:async(e,n)=>{if(!$(e,r)||!S(t.host,n.sessionId,e))return{status:`unreattachable`,reason:`descriptor-invalid`,message:`Limrun app-log descriptor does not match the bound device or owning session`};let a=await t.reconnect(e,i);return a.status===`missing`?{status:`missing`}:a.status===`ownership-lost`?{status:`unreattachable`,reason:`ownership-fence-lost`}:{status:`active`,handle:await I({host:t.host,reader:a.reader,appBundleId:e.appBundleId,outputPath:e.outputPath})}},cleanup:async(e,n)=>$(e,r)&&S(t.host,n.sessionId,e)?{status:`cleaned`}:{status:`cleanup-pending`,reason:`ownership-fence-lost`,message:`Limrun app-log descriptor does not match the bound device or owning session`}}),d={appLogInspect:async()=>({backend:Q(r)}),appLogDoctor:async()=>({backend:Q(r),checks:{limrunSessionAvailable:await Tt(t,r,i)},notes:[]}),appLogStart:async a=>{we(t.host,a),i.throwIfAborted();let o=await t.openCurrent(r);if(!o)throw new e(`UNSUPPORTED_OPERATION`,`Limrun app logs require an active instance`);let s={transport:`limrun-log-poller`,platform:o.platform,leaseId:o.leaseId,instanceId:o.instanceId,appBundleId:a.appBundleId,outputPath:a.outputPath},c=!1;try{i.throwIfAborted();let e=Ke({sessionId:a.sessionId,device:r,owner:n,fence:a.fence,descriptor:s});c=!0;let l=await I({host:t.host,reader:o,appBundleId:a.appBundleId,outputPath:a.outputPath});return Se(l,e)}catch(e){throw c||await o[Symbol.asyncDispose](),e}},...u,networkDump:async e=>{let n=await t.host.appLogs.readRecent(e.sessionId,e.maxScanLines),i=Q(r),{dump:a}=Ce(n.text,{...e,path:n.path,exists:n.exists,lineNumberOffset:n.skippedLines,backend:i}),o=a.entries.length===0?[`No HTTP(s) entries were found in recent session app logs.`]:[];return Object.freeze({source:`app-log`,backend:i,dump:a,notes:o})},ensureReady:async()=>({...r,booted:!0}),bootTarget:async()=>({...r,booted:!0}),listApps:async e=>await t.listApps(e.device,e.filter,i),...r.platform===`android`?{appState:async()=>await t.getAppState(r,i)}:{},...c(tt({device:r,signal:i,getInteractor:t.getInteractor,resolveAppReference:e=>t.resolveAppReference?.(r,e)??e,configurePortReverse:t.configurePortReverse}),s.operations),...We({device:r,signal:i,getInteractor:t.getInteractor,presentIosAcquisition:t.host.snapshot.presentIosAcquisition}),...Oe({device:r,signal:i,resolveInteractor:e=>t.getInteractor(r,e),facts:s.operations}),...ct(vt(t),r,i,l)};return Object.freeze({device:r,owner:n,facts:s,operations:Object.freeze(a?{appLogReattach:u.appLogReattach,appLogCleanup:u.appLogCleanup}:d),[Symbol.asyncDispose]:async()=>await l[Symbol.asyncDispose]()})}async function Tt(e,t,n){n.throwIfAborted();let r=await e.openCurrent(t);if(!r)return!1;try{n.throwIfAborted()}finally{await r[Symbol.asyncDispose]()}return!0}function Q(e){return e.platform===`apple`?`ios-simulator`:`android`}function $(e,t){if(!a(t))return!1;let n=s(t.id);return n!==void 0&&n.leaseId===e.leaseId&&n.platform===e.platform&&(t.platform===`apple`?e.platform===`ios`:e.platform===`android`)}export{Ct as createLimrunPlatformRuntimeOwner};
|