agent-device 0.21.17 → 0.21.19
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.17.apk → agent-device-android-ime-helper-0.21.19.apk} +0 -0
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.19.apk.sha256 +1 -0
- package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.17.manifest.json → agent-device-android-ime-helper-0.21.19.manifest.json} +4 -4
- package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.17.apk → agent-device-android-snapshot-helper-0.21.19.apk} +0 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.19.apk.sha256 +1 -0
- package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.17.manifest.json → agent-device-android-snapshot-helper-0.21.19.manifest.json} +6 -6
- package/dist/src/adapter.js +1 -1
- package/dist/src/adb-executor.js +2 -2
- package/dist/src/adb-failure.js +2 -1
- package/dist/src/agent-browser-lifecycle.js +1 -1
- package/dist/src/agent-browser-process-record.js +1 -1
- package/dist/src/agent-browser-provider.js +1 -1
- package/dist/src/agent-device-client.js +2 -2
- package/dist/src/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/android.js +1 -1
- package/dist/src/app-log-runtime2.js +1 -1
- package/dist/src/cache.js +1 -1
- package/dist/src/catalog.js +1 -1
- package/dist/src/cli-help.js +1 -1
- package/dist/src/cli.js +4 -4
- package/dist/src/client-types.d.ts +11 -4
- package/dist/src/command-metadata.js +1 -1
- package/dist/src/command-tools.js +2 -2
- package/dist/src/contracts.js +1 -1
- package/dist/src/daemon-client-lease-beat.js +1 -1
- package/dist/src/daemon-client-lifecycle.js +1 -1
- package/dist/src/daemon-client-transport.js +1 -1
- package/dist/src/daemon-policy-file.js +1 -1
- package/dist/src/device-claim-inspection.js +1 -1
- package/dist/src/device-claim-rule.js +1 -1
- package/dist/src/device-inventory-context.js +1 -1
- package/dist/src/device-session.js +1 -1
- package/dist/src/diagnostics.js +1 -1
- package/dist/src/diagnostics2.js +1 -1
- package/dist/src/durable-resource.js +1 -1
- package/dist/src/engine-eval-script.js +1 -1
- package/dist/src/error.js +1 -1
- package/dist/src/find.js +1 -1
- package/dist/src/finders.js +1 -1
- package/dist/src/generic-settle.js +1 -1
- package/dist/src/gesture-runtime.js +1 -1
- package/dist/src/index.d.ts +2 -2
- package/dist/src/index.js +1 -1
- package/dist/src/input-actions2.js +2 -2
- package/dist/src/install-source-network-transport.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.js +1 -1
- package/dist/src/ios-snapshot-acquisition.js +1 -1
- package/dist/src/ios-snapshot-engine.js +1 -1
- package/dist/src/lease.js +1 -1
- package/dist/src/local-interactor-operation-set.js +1 -1
- package/dist/src/mechanics.js +16 -17
- package/dist/src/mobile-snapshot-semantics.js +1 -1
- package/dist/src/observe-until.js +1 -0
- package/dist/src/overlay.js +2 -2
- package/dist/src/parameterized-recorded-fill.js +1 -1
- package/dist/src/perf-facade.js +1 -1
- package/dist/src/perf-runtime-operation-builder.js +1 -1
- package/dist/src/perf-runtime-plan.js +1 -1
- package/dist/src/physical-device-control.js +1 -1
- package/dist/src/platform-request-scope.js +1 -1
- package/dist/src/platform-runtime-managed-owner.js +1 -1
- package/dist/src/platform-runtime-operation-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-worker-client.js +1 -1
- package/dist/src/provider-device-admission.js +1 -0
- package/dist/src/provider-webdriver.js +1 -1
- package/dist/src/proxy.js +1 -1
- package/dist/src/react-native.js +1 -1
- package/dist/src/record-runtime.js +1 -1
- package/dist/src/registry.js +36 -36
- package/dist/src/replay-divergence.js +1 -1
- package/dist/src/replay.js +1 -1
- package/dist/src/request-admission.js +1 -1
- package/dist/src/request-runtime-binding.js +1 -1
- package/dist/src/runner-cache-metadata.js +2 -2
- package/dist/src/runner-client.js +1 -1
- package/dist/src/runner-dev-tools-security.js +1 -1
- package/dist/src/runner-disposal.js +1 -1
- package/dist/src/runner-error-classification.js +3 -3
- package/dist/src/runner-exchange.js +1 -1
- package/dist/src/runner-start-budget.js +1 -1
- package/dist/src/runner-startup-transport.js +1 -1
- package/dist/src/runner-xctestrun.js +1 -1
- package/dist/src/runner.js +1 -1
- package/dist/src/runtime-admission.js +1 -0
- package/dist/src/runtime.js +1 -1
- package/dist/src/runtime10.js +2 -2
- package/dist/src/runtime2.js +1 -1
- package/dist/src/runtime3.js +1 -1
- package/dist/src/runtime4.js +4 -4
- package/dist/src/runtime5.js +1 -1
- package/dist/src/runtime6.js +1 -1
- package/dist/src/runtime7.js +1 -1
- package/dist/src/runtime8.js +1 -1
- package/dist/src/runtime9.js +1 -1
- package/dist/src/screen-recording-resource-recovery.js +1 -1
- package/dist/src/screenshot-runtime.js +1 -1
- package/dist/src/script.js +1 -1
- package/dist/src/scroll-gesture.js +1 -1
- package/dist/src/sdk-batch-runner.js +2 -2
- package/dist/src/sdk-batch.js +1 -1
- package/dist/src/sdk-contracts.d.ts +16 -2
- package/dist/src/sdk-contracts.js +2 -2
- package/dist/src/sdk-finders.js +1 -1
- package/dist/src/sdk-selectors.d.ts +9 -0
- package/dist/src/sdk-selectors.js +1 -1
- package/dist/src/selection.js +0 -0
- package/dist/src/selector-pipeline-policy.js +1 -0
- package/dist/src/selector-runtime.js +1 -1
- package/dist/src/selectors.js +1 -1
- package/dist/src/server.js +1 -1
- package/dist/src/session-runtime-admission.js +1 -1
- package/dist/src/session-snapshot.js +1 -1
- package/dist/src/session-store.js +3 -3
- package/dist/src/session2.js +5 -5
- package/dist/src/snapshot-desktop-projection.js +1 -1
- package/dist/src/snapshot-runtime-binding.js +1 -1
- package/dist/src/snapshot-runtime.js +1 -1
- package/dist/src/snapshot-state.js +1 -1
- package/dist/src/snapshot4.js +1 -1
- package/dist/src/src.js +1 -1
- package/dist/src/src7.js +1 -1
- package/dist/src/target-evidence.js +1 -1
- package/dist/src/text-entry-focus.js +1 -1
- package/dist/src/touch-runtime.js +1 -1
- package/dist/src/touch-runtime2.js +1 -0
- package/dist/src/tree.js +1 -1
- package/dist/src/type-text-runtime.js +1 -1
- package/dist/src/video.js +1 -1
- package/package.json +1 -1
- package/server.json +2 -2
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.17.apk.sha256 +0 -1
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.17.apk.sha256 +0 -1
- package/dist/src/runner-command-traits.js +0 -1
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
69c852c47ebd70daa25bf2260d379fb67e740e429441c2cf204960937f5ff548 agent-device-android-ime-helper-0.21.19.apk
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "android-ime-helper",
|
|
3
|
-
"version": "0.21.
|
|
4
|
-
"assetName": "agent-device-android-ime-helper-0.21.
|
|
5
|
-
"sha256": "
|
|
3
|
+
"version": "0.21.19",
|
|
4
|
+
"assetName": "agent-device-android-ime-helper-0.21.19.apk",
|
|
5
|
+
"sha256": "69c852c47ebd70daa25bf2260d379fb67e740e429441c2cf204960937f5ff548",
|
|
6
6
|
"packageName": "com.callstack.agentdevice.imehelper",
|
|
7
|
-
"versionCode":
|
|
7
|
+
"versionCode": 21019,
|
|
8
8
|
"serviceComponent": "com.callstack.agentdevice.imehelper/.TestInputMethodService",
|
|
9
9
|
"broadcastProtocol": "android-ime-helper-v1"
|
|
10
10
|
}
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
e807254a5ba4b2d408bd5b309a4a9968aa0106f96b2631575f3a6901ea3f968d agent-device-android-snapshot-helper-0.21.19.apk
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "android-snapshot-helper",
|
|
3
|
-
"version": "0.21.
|
|
4
|
-
"releaseTag": "v0.21.
|
|
5
|
-
"assetName": "agent-device-android-snapshot-helper-0.21.
|
|
3
|
+
"version": "0.21.19",
|
|
4
|
+
"releaseTag": "v0.21.19",
|
|
5
|
+
"assetName": "agent-device-android-snapshot-helper-0.21.19.apk",
|
|
6
6
|
"apkUrl": null,
|
|
7
|
-
"sha256": "
|
|
8
|
-
"checksumName": "agent-device-android-snapshot-helper-0.21.
|
|
7
|
+
"sha256": "e807254a5ba4b2d408bd5b309a4a9968aa0106f96b2631575f3a6901ea3f968d",
|
|
8
|
+
"checksumName": "agent-device-android-snapshot-helper-0.21.19.apk.sha256",
|
|
9
9
|
"packageName": "com.callstack.agentdevice.snapshothelper",
|
|
10
|
-
"versionCode":
|
|
10
|
+
"versionCode": 21019,
|
|
11
11
|
"instrumentationRunner": "com.callstack.agentdevice.snapshothelper/.SnapshotInstrumentation",
|
|
12
12
|
"minSdk": 23,
|
|
13
13
|
"targetSdk": 36,
|
package/dist/src/adapter.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{N as e,V as t}from"./sdk-contracts.js";import{Jr as n,Yr as r,qr as i}from"./sdk-batch.js";import{c as a,r as o}from"./diagnostics.js";import{c as s,l as c,m as l}from"./exec.js";import"./diagnostics2.js";import"./command.js";import"./process.js";import{r as u}from"./version.js";import{f as d}from"./host-file.js";import{t as f}from"./apple-runner-platform.js";import{t as p}from"./simctl.js";import{a as m,c as ee,d as te,i as ne,l as re,n as ie,o as ae,r as oe,s as se,t as ce,u as le}from"./cache.js";import h from"node:path";import{createHash as g,randomUUID as _}from"node:crypto";import ue from"node:net";import{Buffer as v}from"node:buffer";const de={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`,preparing:`COMMAND_FAILED`};var y=class extends e{failureKind;failureCode;constructor(e,t,n=`iOS Simulator snapshot source ${e}: ${t}`,r={},i){super(de[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(e){return e instanceof ee?new y(e.buildFailureKind,e.buildFailureCode,void 0,e.buildDetails,e.cause):e}function S(n){return n instanceof y||(n=x(n),n instanceof y)?n:t(n)?b(`cancelled`,`abort-signal`,{},n):n instanceof e&&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 C(e,t,n=Date.now){if(t?.aborted)throw b(`cancelled`,`abort-signal`);return ae(e,t,n)}function w(e,t){try{return se(e,t)}catch(e){throw x(e)}}async function T(e,t,n,r){let i=Math.min(t,w(e,n));await te({waitMs:i,signal:e.signal,stop:r,cancelled:()=>b(`cancelled`,`abort-signal`)})}var fe=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 E=65536;function pe(){return{...m(async(e,t,n)=>await s(e,t,n)),projectRoot:u,homeDirectory:d,start:me,connect:he,emitDiagnostic:o,withDiagnosticTimer:a,readTargetProcessStartTime:re}}function me(e,t,n,r={}){if(r.signal?.aborted)throw b(`cancelled`,`abort-signal`);let i=c(`xcrun`,p(e,[`spawn`,e.udid,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 o=``;return i.child.stderr?.setEncoding(`utf8`),i.child.stderr?.on(`data`,e=>{o=ge(o,String(e))}),{pid:a,wait:i.wait,isAlive:()=>i.child.exitCode===null&&i.child.signalCode===null,signal:e=>{l(a,e)||i.child.kill(e)},readLog:()=>o}}async function he(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=ue.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()})}function ge(e,t){let n=e+t;return n.length<=E?n:n.slice(n.length-E)}function _e(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 D=new WeakSet;async function O(e,t){let n;try{n=(await t.wait).exitCode}catch{n=void 0}return D.has(t)||(D.add(t),e.emitDiagnostic({level:`error`,phase:`ios.snapshot-source.bridge-process-exit`,data:{pid:t.pid,...n===void 0?{}:{exitCode:n},stderr:ve(t.readLog())}})),b(`process-crash`,`bridge-exited`,{pid:t.pid,...n===void 0?{}:{exitCode:n}})}function ve(e){let t=v.from(e);return t.length<=65536?e:t.subarray(-65536).toString(`utf8`)}const k=`agent-device-simulator-ax-v1.8.0`;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_kAXXCAttributePlaceholderValue`,`XC_kAXXCAttributeIdentifier`,`XC_kAXXCAttributeFrame`,`XC_kAXXCAttributeAutomationType`,`XC_kAXXCAttributeTraits`,`XC_kAXXCAttributeIsUserInteractionEnabled`,`XC_kAXXCAttributeChildren`]);const ye=[`requests`,`rejected`,`continuations`,`acceptedLevels`];function A(e){let t=e.recovery;if(!F(t))throw b(`malformed-tree`,`recovery-invalid`);let n=ye.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 j(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 M=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 N(e){let t;try{t=JSON.parse(e.toString(`utf8`))}catch(e){throw b(`malformed-tree`,`response-not-json`,{},e)}if(!F(t))throw b(`malformed-tree`,`response-not-object`);return t}function P(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 be(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.8.0`)throw b(`transport-failure`,`source-version-mismatch`,{expected:k,observed:e.sourceVersion});if(e.requestId!==t)throw b(`transport-failure`,`request-id-mismatch`,{expected:t,observed:e.requestId})}function xe(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 Se(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 F(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}async function Ce(e){let t=new M(e.limits.maxResponseBytes-4),n=w(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=N(r);if(be(t,e.requestId),xe(t,{pid:e.expectedPid,generation:e.expectedGeneration}),t.ok!==!0&&Se(t),typeof t.truncated!=`boolean`)throw b(`malformed-tree`,`truncated-invalid`);f(t);return}}catch(t){p(t),e.socket.destroy()}},u=e=>p(S(e)),d=()=>{a||(e.process.isAlive()?p(b(`transport-failure`,`bridge-connection-closed`)):O(e.host,e.process).then(p))};e.process.wait.then(()=>{a||O(e.host,e.process).then(p)},e=>{a||p(S(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(S(t)),e.socket.destroy()}})}var we=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.simulator.udid,e.deadline,()=>this.requestInSimulator(e))}async requestInSimulator(e){if(this.closed)throw b(`unsupported`,`source-closed`);let t=e.deadline;w(t,`bridge-request-deadline`);let n=this.sessions.get(e.target.simulator.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=S(e);return Ee(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 Te(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.simulator.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=_e(this.host,e.target.simulator.udid,this.ownerId);await this.host.ensureDirectory(h.dirname(i)),await this.host.remove(i);let a=this.host.start(e.target.simulator,e.bridge.path,i,{signal:t.signal}),o={udid:e.target.simulator.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),S(e)}}async connectUntilReady(e,t){let n;for(;;){let r=w(t,`bridge-connect-deadline`);if(!e.process.isAlive())throw await O(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,w(t,`bridge-connect-deadline`));try{await T(t,r,`bridge-connect-deadline`)}catch(e){throw S(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=j(P({requestId:r,pid:t.target.pid,generation:t.target.generation,maxDepth:Math.min(t.limits.maxTraversalDepth,t.maxDepth),maxNodes:t.limits.maxNodes,maxDurationMs:w(n,`bridge-request-deadline`),maxResponseBytes:t.limits.maxResponseBytes,...t.nativeLevelsHint===void 0?{}:{nativeLevelsHint:t.nativeLevelsHint}}),t.limits);return await Ce({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:w(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:w(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 I(e.process,500),e.process.isAlive()&&(e.process.signal(`SIGKILL`),await I(e.process,500))),await this.host.remove(e.socketPath)}};async function Te(e,t){let n=w(t,`bridge-request-deadline`);await Promise.race([e,T(t,n,`bridge-request-deadline`).then(()=>{throw b(`timeout`,`bridge-request-deadline`)})])}function Ee(e,t,n){return(e.failureKind===`cancelled`||e.failureKind===`timeout`)&&(e.details?.dispatched===!0||n!==t)}async function I(e,t){await Promise.race([e.wait.catch(()=>void 0),new Promise(e=>setTimeout(e,t))])}const L=16777216,R=12e4,z=1e4,De=Object.freeze({maxRequestBytes:65536,maxResponseBytes:4194304,maxNodes:5e3,maxTraversalDepth:64,maxDurationMs:5e3});function B(t){let n={...De,...t??{}};for(let[t,r]of Object.entries(n))if(!Number.isSafeInteger(r)||r<=0)throw new e(`INVALID_ARGS`,`Snapshot source limit ${t} must be a positive integer`,{name:t,value:r});if(n.maxRequestBytes>n.maxResponseBytes)throw new e(`INVALID_ARGS`,`Snapshot source request bytes cannot exceed response bytes`,{maxRequestBytes:n.maxRequestBytes,maxResponseBytes:n.maxResponseBytes});if(n.maxRequestBytes>L||n.maxResponseBytes>L)throw new e(`INVALID_ARGS`,`Snapshot source frame limits exceed the bridge bound`,{maxRequestBytes:n.maxRequestBytes,maxResponseBytes:n.maxResponseBytes,maximumFrameBytes:L});if(n.maxNodes>z||n.maxTraversalDepth>128)throw new e(`INVALID_ARGS`,`Snapshot source tree limits exceed the bridge bound`,{maxNodes:n.maxNodes,maxTraversalDepth:n.maxTraversalDepth,maximumNodes:z,maximumDepth:128});if(n.maxDurationMs>R)throw new e(`INVALID_ARGS`,`Snapshot source duration exceeds the bridge bound`,{maxDurationMs:n.maxDurationMs,maximumDurationMs:R});if(n.maxRequestBytes<=4||n.maxResponseBytes<=4)throw new e(`INVALID_ARGS`,`Snapshot source frame limits must leave room for a body`,{maxRequestBytes:n.maxRequestBytes,maxResponseBytes:n.maxResponseBytes});return Object.freeze(n)}const V=[`SnapshotBridge.m`,`SnapshotBridgeRuntime.m`,`SnapshotBridgeRuntime.h`,`SnapshotBridgeCapture.h`,`SnapshotBridgeCapture.m`],Oe=[`SnapshotBridge.m`,`SnapshotBridgeRuntime.m`,`SnapshotBridgeCapture.m`];async function ke(e,t,n){let r=await ne(e,n).catch(e=>{throw x(e)}),i=t.trim();if(!i)throw b(`unsupported`,`simulator-runtime-missing`);return{...r,simulatorRuntime:i}}const H=12e4;async function Ae(e){let t=e.deadline,n=e.sourceRoot??je(e.host);try{let r=await oe(e.host,n,V,t),i=await ke(e.host,e.runtime,t),a=e.cacheRoot??h.join(e.host.homeDirectory(),`.agent-device`,`snapshot-source`),o=await ce({host:e.host,deadline:t,cacheRoot:a,binaryFilename:`snapshot-bridge`,lockDescription:`iOS Simulator snapshot bridge cache`,keyInputs:{schemaVersion:1,protocolVersion:1,sourceVersion:k,sourceHash:r,toolchain:i,compileArgv:U({architecture:i.architecture,sourceRoot:``,outputPath:``})},build:async r=>{let a=await ie({host:e.host,deadline:t,argv:U({architecture:i.architecture,sourceRoot:n,outputPath:r}),budgetMs:H,label:`bridge`});if(a.exitCode!==0||!e.host.exists(r))throw b(`unsupported`,`native-build-failed`,{exitCode:a.exitCode,stderr:a.stderr.slice(0,4096)})}});return{path:o.path,sourceHash:r,cacheKey:o.cacheKey,protocolVersion:1,sourceVersion:k}}catch(e){throw x(e)}}function U(e){return[`--sdk`,`iphonesimulator`,`clang`,`-arch`,e.architecture,`-mios-simulator-version-min=15.0`,`-fobjc-arc`,`-Wall`,`-Wextra`,`-framework`,`Foundation`,`-framework`,`CoreGraphics`,...Oe.map(t=>h.join(e.sourceRoot,t)),`-o`,e.outputPath]}function je(e){let t=e.projectRoot(),n=h.join(t,`apple`,`snapshot-bridge`);if(V.every(t=>e.exists(h.join(n,t))))return n;let r=h.join(t,`dist`,`apple`,`snapshot-bridge`);if(V.every(t=>e.exists(h.join(r,t))))return r;throw b(`unsupported`,`native-source-missing`,{projectRoot:t})}const Me=f+H;function Ne(e){let t=e.now??Date.now,n=new Map,r=le({waitMs:2e3,waitGrant:`first-caller`,retryAfterMs:6e4,now:t}),i=async(r,i)=>{let a=C(Me,i,t);try{let t=await e.host.withDiagnosticTimer(`ios.snapshot-source.prepare`,async()=>await Ae({host:e.host,runtime:r,limits:e.limits,deadline:a,sourceRoot:e.sourceRoot,cacheRoot:e.cacheRoot}),{producer:e.producer});return n.set(r,t),t}catch(e){throw S(e)}};return{readyBinary:async(e,t,a)=>n.get(e)||await r.value(e,{start:t=>i(e,t),wait:(e,n)=>T(t,e,a,n),pending:()=>b(`preparing`,`bridge-preparation-pending`)}),close:()=>{n.clear(),r.close()}}}function Pe(e,t){return!n(e)||!n(t)||Math.abs(t.width-t.height)<=1?!1:Math.abs(e.width-t.height)<=1&&Math.abs(e.height-t.width)<=1}const W=Object.freeze({elementType:`XC_kAXXCAttributeElementType`,elementBaseType:`XC_kAXXCAttributeElementBaseType`,label:`XC_kAXXCAttributeLabel`,value:`XC_kAXXCAttributeValue`,placeholder:`XC_kAXXCAttributePlaceholderValue`,identifier:`XC_kAXXCAttributeIdentifier`,frame:`XC_kAXXCAttributeFrame`,automationType:`XC_kAXXCAttributeAutomationType`,traits:`XC_kAXXCAttributeTraits`,userInteractionEnabled:`XC_kAXXCAttributeIsUserInteractionEnabled`,children:`XC_kAXXCAttributeChildren`}),G=`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(`.`),K={UIApplication:`Application`,UIWindow:`Window`},Fe=new Set(Object.values(W)),Ie=1n<<8n,Le=1n<<3n,Re={x:0,y:0,width:0,height:0};function ze(e,t,n){let r=Array.isArray(e)?e:[e];if(r.length===0||r.some(e=>!F(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.filter(J)[0]);return s.kind===`reported`&&Ge(i,s.rect),{nodes:i,maxTraversalDepth:o,viewport:s,opaqueRemoteElements:a.filter(e=>He(e,s)).length,unresolvedCoordinateSpaceWindows:Y(i,s)};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(!Fe.has(t))throw b(`malformed-tree`,`node-contains-unknown-field`,{key:t});let l=e[W.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(!F(e))throw b(`malformed-tree`,`child-invalid`);c(e,u,r+1,f)}}}function Be(e,t,n,r){let i=X(e[W.elementType]),a=X(e[W.elementBaseType]),o=Ye(e[W.automationType]),s=Ue(e[W.frame]),c=qe(e[W.traits]),l=c===void 0?void 0:(c&Ie)===0n,u=c===void 0||(c&Le)===0n?void 0:!0,d=Je(e[W.userInteractionEnabled]),f=X(e[W.placeholder])?.trim();return{index:t,...n===void 0?{}:{parentIndex:n},...q(i,o)?{type:q(i,o)}:{},...i?{role:i}:{},...a&&a!==i?{subrole:a}:{},...X(e[W.label])?{label:X(e[W.label])}:{},...Z(e[W.value])?{value:Z(e[W.value])}:{},...f?{placeholder:f}:{},...X(e[W.identifier])?{identifier:X(e[W.identifier])}:{},...s?{rect:s}:{},...l===void 0?{}:{enabled:l},...u===void 0?{}:{selected:u},...d===void 0?{}:{userInteractionEnabled:d},depth:r}}function q(e,t){if(e!==void 0&&K[e])return K[e];if(e!==void 0&&G.includes(e))return e;if(t!==void 0)return G[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(!F(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||!J(e)?{kind:`missing`,reason:`not-provided`}:n(e.rect)?{kind:`reported`,rect:e.rect}:{kind:`missing`,reason:e.rect?`invalid`:`not-provided`}}function J(e){return e.type===`Application`||e.type===`Window`}function Ge(e,t){for(let n of e)n.hittable=n.parentIndex!==void 0&&i(n.enabled!==!1,n.rect,t)}function Y(e,t){return t.kind===`reported`?e.filter(n=>Ke(n,e)&&Pe(n.rect??Re,t.rect)).length:0}function Ke(e,t){return J(e)?!0:e.parentIndex!==void 0&&J(t[e.parentIndex]??e)}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 qe(e){if(e!=null){if(typeof e!=`string`||!/^\d{1,20}$/.test(e))throw b(`malformed-tree`,`traits-invalid`);return BigInt(e)}}function Je(e){if(e!=null){if(typeof e!=`boolean`)throw b(`malformed-tree`,`user-interaction-invalid`);return e}}function Ye(e){if(e!=null){if(!Number.isSafeInteger(e))throw b(`malformed-tree`,`automation-type-invalid`);return e}}const Q=`simulator-ax-bridge`;function Xe(e={}){let t=e.host??pe(),n=new we(t),r=new fe,i=Ne({host:t,limits:B(e.limits),producer:Q,sourceRoot:e.sourceRoot,cacheRoot:e.cacheRoot}),a=!1;return{acquire:async o=>{try{if(a)throw b(`unsupported`,`source-closed`);Ze(o);let s=B({...e.limits,...o.limits}),c=C(s.maxDurationMs,o.signal),l=$e(o.hint,s.maxTraversalDepth),u=l+1,d=o.hint.rawTraversalDepth!==null;return await t.withDiagnosticTimer(`ios.snapshot-source.acquire`,async()=>{let e=await i.readyBinary(o.target.runtime,c,`bridge-preparation-deadline`),a=r.consume(o.target,u,d),f=await n.request({target:o.target,bridge:e,limits:s,maxDepth:l,nativeLevelsHint:a.nativeLevels,deadline:c});w(c,`snapshot-decode-deadline`);let p=et(o.hint,o.target,f,s);return Qe(t,r,o.target,u,d,a,f),{stage:`acquired`,acquisition:p}},{producer:Q})}catch(e){let t=S(e);return{stage:`failed`,failure:{kind:t.failureKind,code:t.failureCode,...t.details?{details:t.details}:{}}}}},close:async()=>{a||(a=!0,i.close(),await n.close())}}}function Ze(t){if(!t.target.simulator.udid.trim()||!t.target.runtime.trim()||!t.target.generation.trim()||!Number.isSafeInteger(t.target.pid)||t.target.pid<=0)throw new e(`INVALID_ARGS`,`Simulator snapshot source target identity is incomplete`);let n=t.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 e(`INVALID_ARGS`,`Simulator snapshot source capture hint is invalid`)}function Qe(e,t,n,r,i,a,o){let s=A(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 $e(t,n){let r=t.rawTraversalDepth??n;if(r>n)throw new e(`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 et(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});if(o.unresolvedCoordinateSpaceWindows>0)throw b(`unsupported`,`window-coordinate-space-unresolved`,{windows:o.unresolvedCoordinateSpaceWindows});let c=Object.freeze(o.nodes.map(e=>Object.freeze({...e,pid:t.pid}))),l=tt(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 tt(e,t,n){let r=n.kind===`reported`?[]:[{kind:`unavailable-fact`,fact:`hittability`}];return Object.freeze([...r,...e.interactiveOnly?[{kind:`unavailable-fact`,fact:`interactive-query`}]:[],...t?[{kind:`truncated`}]:[],...n.kind===`missing`?[{kind:`missing-viewport`,reason:n.reason}]:[]])}export{Xe as createSimulatorSnapshotSource};
|
|
1
|
+
import{G as e,N as t}from"./sdk-contracts.js";import{Jr as n,Xr as r,Yr as i}from"./sdk-batch.js";import{c as a,r as o}from"./diagnostics.js";import{c as s,l as c,m as l}from"./exec.js";import"./diagnostics2.js";import"./command.js";import"./process.js";import{r as u}from"./version.js";import{f as d}from"./host-file.js";import{t as f}from"./apple-runner-platform.js";import{t as p}from"./simctl.js";import{a as m,c as ee,d as te,i as ne,l as re,n as ie,o as ae,r as oe,s as se,t as ce,u as le}from"./cache.js";import h from"node:path";import{createHash as g,randomUUID as _}from"node:crypto";import ue from"node:net";import{Buffer as v}from"node:buffer";const de={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`,preparing:`COMMAND_FAILED`};var y=class extends t{failureKind;failureCode;constructor(e,t,n=`iOS Simulator snapshot source ${e}: ${t}`,r={},i){super(de[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(e){return e instanceof ee?new y(e.buildFailureKind,e.buildFailureCode,void 0,e.buildDetails,e.cause):e}function S(n){return n instanceof y||(n=x(n),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 C(e,t,n=Date.now){if(t?.aborted)throw b(`cancelled`,`abort-signal`);return ae(e,t,n)}function w(e,t){try{return se(e,t)}catch(e){throw x(e)}}async function T(e,t,n,r){let i=Math.min(t,w(e,n));await te({waitMs:i,signal:e.signal,stop:r,cancelled:()=>b(`cancelled`,`abort-signal`)})}var fe=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 E=65536;function pe(){return{...m(async(e,t,n)=>await s(e,t,n)),projectRoot:u,homeDirectory:d,start:me,connect:he,emitDiagnostic:o,withDiagnosticTimer:a,readTargetProcessStartTime:re}}function me(e,t,n,r={}){if(r.signal?.aborted)throw b(`cancelled`,`abort-signal`);let i=c(`xcrun`,p(e,[`spawn`,e.udid,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 o=``;return i.child.stderr?.setEncoding(`utf8`),i.child.stderr?.on(`data`,e=>{o=ge(o,String(e))}),{pid:a,wait:i.wait,isAlive:()=>i.child.exitCode===null&&i.child.signalCode===null,signal:e=>{l(a,e)||i.child.kill(e)},readLog:()=>o}}async function he(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=ue.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()})}function ge(e,t){let n=e+t;return n.length<=E?n:n.slice(n.length-E)}function _e(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 D=new WeakSet;async function O(e,t){let n;try{n=(await t.wait).exitCode}catch{n=void 0}return D.has(t)||(D.add(t),e.emitDiagnostic({level:`error`,phase:`ios.snapshot-source.bridge-process-exit`,data:{pid:t.pid,...n===void 0?{}:{exitCode:n},stderr:ve(t.readLog())}})),b(`process-crash`,`bridge-exited`,{pid:t.pid,...n===void 0?{}:{exitCode:n}})}function ve(e){let t=v.from(e);return t.length<=65536?e:t.subarray(-65536).toString(`utf8`)}const k=`agent-device-simulator-ax-v1.8.0`;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_kAXXCAttributePlaceholderValue`,`XC_kAXXCAttributeIdentifier`,`XC_kAXXCAttributeFrame`,`XC_kAXXCAttributeAutomationType`,`XC_kAXXCAttributeTraits`,`XC_kAXXCAttributeIsUserInteractionEnabled`,`XC_kAXXCAttributeChildren`]);const ye=[`requests`,`rejected`,`continuations`,`acceptedLevels`];function A(e){let t=e.recovery;if(!F(t))throw b(`malformed-tree`,`recovery-invalid`);let n=ye.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 j(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 M=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 N(e){let t;try{t=JSON.parse(e.toString(`utf8`))}catch(e){throw b(`malformed-tree`,`response-not-json`,{},e)}if(!F(t))throw b(`malformed-tree`,`response-not-object`);return t}function P(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 be(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.8.0`)throw b(`transport-failure`,`source-version-mismatch`,{expected:k,observed:e.sourceVersion});if(e.requestId!==t)throw b(`transport-failure`,`request-id-mismatch`,{expected:t,observed:e.requestId})}function xe(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 Se(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 F(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}async function Ce(e){let t=new M(e.limits.maxResponseBytes-4),n=w(e.deadline,`bridge-request-deadline`);return await new Promise((r,i)=>{let a=!1,o=!1,s=setTimeout(()=>{p(b(`timeout`,`bridge-request-deadline`,{bridgeRequestSent:o})),e.socket.destroy()},n),c=()=>{p(b(`cancelled`,`abort-signal`,{bridgeRequestSent: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=N(r);if(be(t,e.requestId),xe(t,{pid:e.expectedPid,generation:e.expectedGeneration}),t.ok!==!0&&Se(t),typeof t.truncated!=`boolean`)throw b(`malformed-tree`,`truncated-invalid`);f(t);return}}catch(t){p(t),e.socket.destroy()}},u=e=>p(S(e)),d=()=>{a||(e.process.isAlive()?p(b(`transport-failure`,`bridge-connection-closed`)):O(e.host,e.process).then(p))};e.process.wait.then(()=>{a||O(e.host,e.process).then(p)},e=>{a||p(S(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(S(t)),e.socket.destroy()}})}var we=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.simulator.udid,e.deadline,()=>this.requestInSimulator(e))}async requestInSimulator(e){if(this.closed)throw b(`unsupported`,`source-closed`);let t=e.deadline;w(t,`bridge-request-deadline`);let n=this.sessions.get(e.target.simulator.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=S(e);return Ee(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 Te(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.simulator.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=_e(this.host,e.target.simulator.udid,this.ownerId);await this.host.ensureDirectory(h.dirname(i)),await this.host.remove(i);let a=this.host.start(e.target.simulator,e.bridge.path,i,{signal:t.signal}),o={udid:e.target.simulator.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),S(e)}}async connectUntilReady(e,t){let n;for(;;){let r=w(t,`bridge-connect-deadline`);if(!e.process.isAlive())throw await O(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,w(t,`bridge-connect-deadline`));try{await T(t,r,`bridge-connect-deadline`)}catch(e){throw S(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=j(P({requestId:r,pid:t.target.pid,generation:t.target.generation,maxDepth:Math.min(t.limits.maxTraversalDepth,t.maxDepth),maxNodes:t.limits.maxNodes,maxDurationMs:w(n,`bridge-request-deadline`),maxResponseBytes:t.limits.maxResponseBytes,...t.nativeLevelsHint===void 0?{}:{nativeLevelsHint:t.nativeLevelsHint}}),t.limits);return await Ce({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:w(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:w(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 I(e.process,500),e.process.isAlive()&&(e.process.signal(`SIGKILL`),await I(e.process,500))),await this.host.remove(e.socketPath)}};async function Te(e,t){let n=w(t,`bridge-request-deadline`);await Promise.race([e,T(t,n,`bridge-request-deadline`).then(()=>{throw b(`timeout`,`bridge-request-deadline`)})])}function Ee(e,t,n){return(e.failureKind===`cancelled`||e.failureKind===`timeout`)&&(e.details?.bridgeRequestSent===!0||n!==t)}async function I(e,t){await Promise.race([e.wait.catch(()=>void 0),new Promise(e=>setTimeout(e,t))])}const L=16777216,R=12e4,z=1e4,De=Object.freeze({maxRequestBytes:65536,maxResponseBytes:4194304,maxNodes:5e3,maxTraversalDepth:64,maxDurationMs:5e3});function B(e){let n={...De,...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>L||n.maxResponseBytes>L)throw new t(`INVALID_ARGS`,`Snapshot source frame limits exceed the bridge bound`,{maxRequestBytes:n.maxRequestBytes,maxResponseBytes:n.maxResponseBytes,maximumFrameBytes:L});if(n.maxNodes>z||n.maxTraversalDepth>128)throw new t(`INVALID_ARGS`,`Snapshot source tree limits exceed the bridge bound`,{maxNodes:n.maxNodes,maxTraversalDepth:n.maxTraversalDepth,maximumNodes:z,maximumDepth:128});if(n.maxDurationMs>R)throw new t(`INVALID_ARGS`,`Snapshot source duration exceeds the bridge bound`,{maxDurationMs:n.maxDurationMs,maximumDurationMs:R});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 V=[`SnapshotBridge.m`,`SnapshotBridgeRuntime.m`,`SnapshotBridgeRuntime.h`,`SnapshotBridgeCapture.h`,`SnapshotBridgeCapture.m`],Oe=[`SnapshotBridge.m`,`SnapshotBridgeRuntime.m`,`SnapshotBridgeCapture.m`];async function ke(e,t,n){let r=await ne(e,n).catch(e=>{throw x(e)}),i=t.trim();if(!i)throw b(`unsupported`,`simulator-runtime-missing`);return{...r,simulatorRuntime:i}}const H=12e4;async function Ae(e){let t=e.deadline,n=e.sourceRoot??je(e.host);try{let r=await oe(e.host,n,V,t),i=await ke(e.host,e.runtime,t),a=e.cacheRoot??h.join(e.host.homeDirectory(),`.agent-device`,`snapshot-source`),o=await ce({host:e.host,deadline:t,cacheRoot:a,binaryFilename:`snapshot-bridge`,lockDescription:`iOS Simulator snapshot bridge cache`,keyInputs:{schemaVersion:1,protocolVersion:1,sourceVersion:k,sourceHash:r,toolchain:i,compileArgv:U({architecture:i.architecture,sourceRoot:``,outputPath:``})},build:async r=>{let a=await ie({host:e.host,deadline:t,argv:U({architecture:i.architecture,sourceRoot:n,outputPath:r}),budgetMs:H,label:`bridge`});if(a.exitCode!==0||!e.host.exists(r))throw b(`unsupported`,`native-build-failed`,{exitCode:a.exitCode,stderr:a.stderr.slice(0,4096)})}});return{path:o.path,sourceHash:r,cacheKey:o.cacheKey,protocolVersion:1,sourceVersion:k}}catch(e){throw x(e)}}function U(e){return[`--sdk`,`iphonesimulator`,`clang`,`-arch`,e.architecture,`-mios-simulator-version-min=15.0`,`-fobjc-arc`,`-Wall`,`-Wextra`,`-framework`,`Foundation`,`-framework`,`CoreGraphics`,...Oe.map(t=>h.join(e.sourceRoot,t)),`-o`,e.outputPath]}function je(e){let t=e.projectRoot(),n=h.join(t,`apple`,`snapshot-bridge`);if(V.every(t=>e.exists(h.join(n,t))))return n;let r=h.join(t,`dist`,`apple`,`snapshot-bridge`);if(V.every(t=>e.exists(h.join(r,t))))return r;throw b(`unsupported`,`native-source-missing`,{projectRoot:t})}const Me=f+H;function Ne(e){let t=e.now??Date.now,n=new Map,r=le({waitMs:2e3,waitGrant:`first-caller`,retryAfterMs:6e4,now:t}),i=async(r,i)=>{let a=C(Me,i,t);try{let t=await e.host.withDiagnosticTimer(`ios.snapshot-source.prepare`,async()=>await Ae({host:e.host,runtime:r,limits:e.limits,deadline:a,sourceRoot:e.sourceRoot,cacheRoot:e.cacheRoot}),{producer:e.producer});return n.set(r,t),t}catch(e){throw S(e)}};return{readyBinary:async(e,t,a)=>n.get(e)||await r.value(e,{start:t=>i(e,t),wait:(e,n)=>T(t,e,a,n),pending:()=>b(`preparing`,`bridge-preparation-pending`)}),close:()=>{n.clear(),r.close()}}}function Pe(e,t){return!i(e)||!i(t)||Math.abs(t.width-t.height)<=1?!1:Math.abs(e.width-t.height)<=1&&Math.abs(e.height-t.width)<=1}const W=Object.freeze({elementType:`XC_kAXXCAttributeElementType`,elementBaseType:`XC_kAXXCAttributeElementBaseType`,label:`XC_kAXXCAttributeLabel`,value:`XC_kAXXCAttributeValue`,placeholder:`XC_kAXXCAttributePlaceholderValue`,identifier:`XC_kAXXCAttributeIdentifier`,frame:`XC_kAXXCAttributeFrame`,automationType:`XC_kAXXCAttributeAutomationType`,traits:`XC_kAXXCAttributeTraits`,userInteractionEnabled:`XC_kAXXCAttributeIsUserInteractionEnabled`,children:`XC_kAXXCAttributeChildren`}),G=`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(`.`),K={UIApplication:`Application`,UIWindow:`Window`},Fe=new Set(Object.values(W)),Ie=1n<<8n,Le=1n<<3n,Re={x:0,y:0,width:0,height:0};function ze(e,t,n){let r=Array.isArray(e)?e:[e];if(r.length===0||r.some(e=>!F(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.filter(J)[0]);return s.kind===`reported`&&Ge(i,s.rect),{nodes:i,maxTraversalDepth:o,viewport:s,opaqueRemoteElements:a.filter(e=>He(e,s)).length,unresolvedCoordinateSpaceWindows:Y(i,s)};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(!Fe.has(t))throw b(`malformed-tree`,`node-contains-unknown-field`,{key:t});let l=e[W.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(!F(e))throw b(`malformed-tree`,`child-invalid`);c(e,u,r+1,f)}}}function Be(e,t,n,r){let i=X(e[W.elementType]),a=X(e[W.elementBaseType]),o=Ye(e[W.automationType]),s=Ue(e[W.frame]),c=qe(e[W.traits]),l=c===void 0?void 0:(c&Ie)===0n,u=c===void 0||(c&Le)===0n?void 0:!0,d=Je(e[W.userInteractionEnabled]),f=X(e[W.placeholder])?.trim();return{index:t,...n===void 0?{}:{parentIndex:n},...q(i,o)?{type:q(i,o)}:{},...i?{role:i}:{},...a&&a!==i?{subrole:a}:{},...X(e[W.label])?{label:X(e[W.label])}:{},...Z(e[W.value])?{value:Z(e[W.value])}:{},...f?{placeholder:f}:{},...X(e[W.identifier])?{identifier:X(e[W.identifier])}:{},...s?{rect:s}:{},...l===void 0?{}:{enabled:l},...u===void 0?{}:{selected:u},...d===void 0?{}:{userInteractionEnabled:d},depth:r}}function q(e,t){if(e!==void 0&&K[e])return K[e];if(e!==void 0&&G.includes(e))return e;if(t!==void 0)return G[t]??`Other`}function Ve(e,t,n){return n&&e.role===`AXRemoteElement`&&t===0}function He(e,t){return e===void 0?!0:i(e)?t.kind!==`reported`||r(e,t.rect):!1}function Ue(e){if(e===void 0)return;if(!F(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||!J(e)?{kind:`missing`,reason:`not-provided`}:i(e.rect)?{kind:`reported`,rect:e.rect}:{kind:`missing`,reason:e.rect?`invalid`:`not-provided`}}function J(e){return e.type===`Application`||e.type===`Window`}function Ge(e,t){for(let r of e)r.hittable=r.parentIndex!==void 0&&n(r.enabled!==!1,r.rect,t)}function Y(e,t){return t.kind===`reported`?e.filter(n=>Ke(n,e)&&Pe(n.rect??Re,t.rect)).length:0}function Ke(e,t){return J(e)?!0:e.parentIndex!==void 0&&J(t[e.parentIndex]??e)}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 qe(e){if(e!=null){if(typeof e!=`string`||!/^\d{1,20}$/.test(e))throw b(`malformed-tree`,`traits-invalid`);return BigInt(e)}}function Je(e){if(e!=null){if(typeof e!=`boolean`)throw b(`malformed-tree`,`user-interaction-invalid`);return e}}function Ye(e){if(e!=null){if(!Number.isSafeInteger(e))throw b(`malformed-tree`,`automation-type-invalid`);return e}}const Q=`simulator-ax-bridge`;function Xe(e={}){let t=e.host??pe(),n=new we(t),r=new fe,i=Ne({host:t,limits:B(e.limits),producer:Q,sourceRoot:e.sourceRoot,cacheRoot:e.cacheRoot}),a=!1;return{acquire:async o=>{try{if(a)throw b(`unsupported`,`source-closed`);Ze(o);let s=B({...e.limits,...o.limits}),c=C(s.maxDurationMs,o.signal),l=$e(o.hint,s.maxTraversalDepth),u=l+1,d=o.hint.rawTraversalDepth!==null;return await t.withDiagnosticTimer(`ios.snapshot-source.acquire`,async()=>{let e=await i.readyBinary(o.target.runtime,c,`bridge-preparation-deadline`),a=r.consume(o.target,u,d),f=await n.request({target:o.target,bridge:e,limits:s,maxDepth:l,nativeLevelsHint:a.nativeLevels,deadline:c});w(c,`snapshot-decode-deadline`);let p=et(o.hint,o.target,f,s);return Qe(t,r,o.target,u,d,a,f),{stage:`acquired`,acquisition:p}},{producer:Q})}catch(e){let t=S(e);return{stage:`failed`,failure:{kind:t.failureKind,code:t.failureCode,...t.details?{details:t.details}:{}}}}},close:async()=>{a||(a=!0,i.close(),await n.close())}}}function Ze(e){if(!e.target.simulator.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 Qe(e,t,n,r,i,a,o){let s=A(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 $e(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 et(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});if(o.unresolvedCoordinateSpaceWindows>0)throw b(`unsupported`,`window-coordinate-space-unresolved`,{windows:o.unresolvedCoordinateSpaceWindows});let c=Object.freeze(o.nodes.map(e=>Object.freeze({...e,pid:t.pid}))),l=tt(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 tt(e,t,n){let r=n.kind===`reported`?[]:[{kind:`unavailable-fact`,fact:`hittability`}];return Object.freeze([...r,...e.interactiveOnly?[{kind:`unavailable-fact`,fact:`interactive-query`}]:[],...t?[{kind:`truncated`}]:[],...n.kind===`missing`?[{kind:`missing-viewport`,reason:n.reason}]:[]])}export{Xe as createSimulatorSnapshotSource};
|
package/dist/src/adb-executor.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{N as e}from"./sdk-contracts.js";import{n as t,r as n,t as r}from"./device-shell.js";import{a as i,d as a,f as o,i as s,l as c,m as l,n as u,p as d,s as f,u as p}from"./adb-transport.js";import{
|
|
2
|
-
`).map(e=>e.trim().split(/\s+/)).filter(e=>e.length>=3).map(([,e,t])=>{let r=e;return{local:r,remote:t,ownerId:n.get(r)}})}function
|
|
1
|
+
import{N as e}from"./sdk-contracts.js";import{n as t,r as n,t as r}from"./device-shell.js";import{a as i,d as a,f as o,i as s,l as c,m as l,n as u,p as d,s as f,u as p}from"./adb-transport.js";import{i as m,n as ee,s as te,u as h}from"./adb-failure.js";import{AsyncLocalStorage as g}from"node:async_hooks";let _;const v=new g;function y(e){_=e}function b(){if(!_)throw Error(`Android adb host port is not bound; import the platform composition wiring (src/platform-runtime-android-adb-host.ts) before using the adb/IME cluster.`);return _}async function x(e,t){let n=b(),r=v.getStore(),i=n.coerceAdbResult(r?await r(e,t):await n.execAdb(e,{...t,allowFailure:!0}));if(!t?.allowFailure&&i.exitCode!==0){let{androidAdbResultError:t}=await import(`./adb-failure.js`).then(e=>e.t),{serializeAndroidAdbInvocation:n}=await import(`./adb-transport.js`).then(e=>e.t);throw t(`adb ${n(e).join(` `)} exited with code ${i.exitCode}`,i)}return i}async function S(e,t){return await v.run(e,t)}function C(e){b().emitDiagnostic(e)}const w=new WeakSet;function T(e){return ne(typeof e==`function`?{exec:e}:e)}function ne(e){if(w.has(e))return e;let t={...e,exec:h(E(e.exec)),...e.pull?{pull:h(E(e.pull))}:{},...e.install?{install:h(E(e.install))}:{},...e.installBundle?{installBundle:h(e.installBundle)}:{}};return w.add(t),t}function E(e){return async(...t)=>b().coerceAdbResult(await e(...t))}const D=new WeakSet;function O(t){let n=T(t);if(n.reverse&&D.has(n.reverse))return n.reverse;let r=n.reverse??k(n.exec),i=new Map,a={async ensure(t,n){let a=i.get(t.local);if(a&&a.ownerId!==t.ownerId)throw new e(`COMMAND_FAILED`,`Android port reverse ${t.local} is already owned by ${a.ownerId??`another session`}`,{current:a,requested:t});a?.remote!==t.remote&&(await r.ensure(t,n),i.set(t.local,{...t}))},async remove(e,t){if(!i.has(e)){await r.remove(e,t);return}await r.remove(e,t),i.delete(e)},async removeAllOwned(e,t){let n=[...i.values()].filter(t=>t.ownerId===e).map(e=>e.local);if(n.length===0){await r.removeAllOwned(e,t);return}for(let e of n)await r.remove(e,t),i.delete(e)},async list(e){return r.list?await r.list(e):[...i.values()]}};return D.add(a),a}function k(e){let t=new Map;return{async ensure(n,r){if(await e([`reverse`,n.local,n.remote],{allowFailure:!1,signal:r?.signal,timeoutMs:r?.timeoutMs}),n.ownerId){let e=t.get(n.ownerId)??new Set;e.add(n.local),t.set(n.ownerId,e)}},async remove(n,r){let i=await e([`reverse`,`--remove`,n],{allowFailure:!0,signal:r?.signal,timeoutMs:r?.timeoutMs});if(i.exitCode!==0&&!re(i.stdout,i.stderr))throw ee(`Failed to remove Android port reverse ${n}`,i,{local:n});for(let e of t.values())e.delete(n)},async removeAllOwned(e,n){let r=[...t.get(e)??[]];for(let e of r)await this.remove(e,n);t.delete(e)},async list(n){let r=await e([`reverse`,`--list`],{allowFailure:!0,signal:n?.signal,timeoutMs:n?.timeoutMs});return r.exitCode===0?A(r.stdout,t):[]}}}function A(e,t){let n=new Map;for(let[e,r]of t)for(let t of r)n.set(t,e);return e.split(`
|
|
2
|
+
`).map(e=>e.trim().split(/\s+/)).filter(e=>e.length>=3).map(([,e,t])=>{let r=e;return{local:r,remote:t,ownerId:n.get(r)}})}function re(e,t){let n=`${e}\n${t}`.toLowerCase();return n.includes(`listener`)&&n.includes(`not found`)}const j=new g;function M(e,t={}){return Q(ie(e.id,t.serverPort))}function ie(e,t){return h(async(n,r)=>{let i=b(),a=async(n,r)=>{let a=V(e,t,n,r);return await i.withoutAdbCommandExecutorOverride(async()=>await i.execAdb(a.invocation,a.options))};return await P(`${t??r?.serverPort??``}/${e}`,r,async e=>await a(n,e),async e=>{await a([`wait-for-device`],{allowFailure:!0,timeoutMs:e,signal:r?.signal,env:r?.env,serverPort:r?.serverPort}).catch(()=>void 0)})})}function ae(e,t=new Map){return{has:e=>(t.get(e)??0)>Date.now(),mark:n=>{let r=Date.now();for(let[e,n]of t)n<=r&&t.delete(e);t.set(n,r+e)},forget:e=>{t.delete(e)}}}const N=ae(3e4);async function P(e,t,n,r){let i=Date.now(),a=await F(e,async()=>await n(t));if(!a.offline||N.has(e))return a.outcome();let o=t?.timeoutMs,s=()=>o===void 0?1/0:Math.floor(o-(Date.now()-i)),c=Math.min(15e3,Math.floor(s()/2));if(c<1)return a.outcome();await r(c),t?.signal?.throwIfAborted();let l=s();if(l<1)return a.outcome();let u=await F(e,async()=>await n(o===void 0?t:{...t,timeoutMs:l}));return u.offline&&N.mark(e),u.outcome()}async function F(e,t){try{let n=await t(),r=I(n);return r||N.forget(e),{offline:r,outcome:()=>n}}catch(t){let n=m(t),r=L(n);return!r&&z(n)&&N.forget(e),{offline:r,outcome:()=>{throw n}}}}function I(e){if(e.exitCode===0)return!1;let t=te(e.stderr,e.stdout);return R(t?.reason,t?.hostRefusal)}function L(t){return t instanceof e&&R(t.details?.adbFailure,t.details?.adbHostRefusal)}function R(e,t){return e===`device_offline`&&t===!0}function z(t){if(!(t instanceof e)||t.details?.timeoutMs!==void 0)return!1;let n=t.details?.exitCode;return typeof n==`number`&&n>=0}function B(e,t){return $((n,r)=>{let i=V(e,t,n,r);return b().spawnAdb(i.invocation,i.options)})}function V(e,t,n,r){let{serverPort:i,...a}=r??{};return{invocation:H(e,n,U(e,t,i)),options:a}}function H(e,t,n){let r=p(t),i=u(r.target,e);if(n===void 0)return s(i,r.command,[`-s`,e,...t]);let a=f(r,{port:n});return s(o(a.target,e),a.command)}function U(e,t,n){let r=j.getStore();return r&&Z(r,{kind:`serial`,serial:e}),r?.serverPort===void 0?t??n:(d(t,r.serverPort),d(n,r.serverPort))}function W(e,t={}){let n=M(e,t);return{exec:n,spawn:B(e.id,t.serverPort),reverse:k(n),pull:async(e,t,r)=>await n([`pull`,e,t],r),install:async(e,t)=>{let{installArgs:r,execOptions:i}=c(t);return await n([`install`,...r,e],i)}}}function G(e,t){let n=X(e);return t?Q(t):n?.serial===e.id?Q(n.provider.exec):M(e)}function K(e,t){let n=X(e);return me(t?T(t):n?.serial===e.id?T(n.provider):W(e))}function q(e){let t=X(e);return t?.serial===e.id?{mode:`transport-composed`,...t.provider.spawn?{spawn:$(t.provider.spawn)}:{}}:{mode:`local`}}function oe(e){let t=X(e);return t?.serial===e.id?t.provider.text:void 0}function se(e){let t=X(e);return t?.serial===e.id&&t.provider.touch?t.provider:void 0}function J(e,t){if(t)return T(t);if(e)return K(e);let n=j.getStore();if(n)return T(n.provider)}async function ce(e,t,n){if(!e)return await n();let r={provider:T(e),serial:t.serial,...t.serverPort===void 0?{}:{serverPort:t.serverPort}},i=le(r),a=async()=>await j.run(r,async()=>await b().withAdbCommandExecutorOverride(i,n));return t.serverPort===void 0?await a():await S(ue(r,t.serverPort),a)}function le(e){return(t,n,r)=>{if(!de(t)||e.serverPort===void 0&&t!==`adb`)return;let o=p(n);if(Z(e,o.target.selector),o.target.selector.kind===`serial`){if(o.target.selector.serial!==e.serial)return;e.serverPort!==void 0&&a(o.target,e.serverPort);let t=i(n,e.serial);return t===void 0?void 0:b().withoutAdbCommandExecutorOverride(async()=>await e.provider.exec(t,r))}let s=e.serverPort;if(s!==void 0)return Y(e,s,o,r)}}function ue(e,t){return async(n,r)=>(Z(e,n.target.selector),Y(e,t,n,r))}async function Y(e,t,n,r){d(t,r?.serverPort);let{serverPort:i,...a}=r??{},c=o(n.target,e.serial),l=f(s(c,n.command),{port:t}),u=b();return await u.withoutAdbCommandExecutorOverride(async()=>await u.execAdb(l,{...a,allowFailure:!0}))}function X(e){let t=j.getStore();return t&&Z(t,{kind:`serial`,serial:e.id}),t}function Z(e,t){e?.serverPort!==void 0&&l(t,e.serial)}function de(e){return n(e)===`adb`}async function fe(e,n,r){return await e(t(`adb`,`shell`,n),r)}async function pe(e,n,r){return await e(t(`adb`,`exec-out`,n),r)}function Q(e){return async(t,n)=>(r(t,`adb`),await e(t,n))}function $(e){return(t,n)=>(r(t,`adb`),e(t,n))}function me(e){return{...e,exec:Q(e.exec),...e.spawn?{spawn:$(e.spawn)}:{}}}async function he(t,n,r){let{device:i,provider:a,...o}=r??{},s=J(i,a),c=s?.pull,l=b();if(c)return await l.withoutAdbCommandExecutorOverride(async()=>await c(t,n,o));let u=s?.exec;if(!u)throw new e(`COMMAND_FAILED`,`Android adb pull requires an adb provider`);return await l.withoutAdbCommandExecutorOverride(async()=>await u([`pull`,t,n],o))}async function ge(t,n){let{device:r,provider:i,...a}=n??{},o=J(r,i),s=o?.install,l=b();if(s)return await l.withoutAdbCommandExecutorOverride(async()=>await s(t,a));let u=o?.exec;if(!u)throw new e(`COMMAND_FAILED`,`Android adb install requires an adb provider`);let{installArgs:d,execOptions:f}=c(a);return await l.withoutAdbCommandExecutorOverride(async()=>await u([`install`,...d,t],f))}export{x as _,G as a,se as c,fe as d,ce as f,b as g,C as h,W as i,q as l,y as m,he as n,K as o,O as p,M as r,oe as s,ge as t,pe as u,S as v};
|
package/dist/src/adb-failure.js
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime.js";import{N as t}from"./sdk-contracts.js";import{r
|
|
1
|
+
import{r as e}from"./rolldown-runtime.js";import{N as t,R as n}from"./sdk-contracts.js";import{r}from"./exec.js";import"./command.js";var i=e({androidAdbResultError:()=>h,androidDiscoveryCommandError:()=>_,attachAdbFailureHint:()=>f,attachAndroidDiscoveryTimeout:()=>v,attachAndroidHelperInstallTimeoutHint:()=>p,classifyAndroidAdbFailure:()=>d,discloseAdbInputDispatch:()=>y,isAdbHostRefusal:()=>b,withAdbFailureHints:()=>g});const a=String.raw`(?:adb|error): `;function o(e){return RegExp(`^${a}${e}$`)}const s=[[/device unauthorized|device still authorizing/,{reason:`device_unauthorized`,hint:`USB debugging is not authorized — accept the authorization prompt on the device screen (re-plug the cable if none appears), then retry.`},{hostRefusal:o(String.raw`device (?:unauthorized|still authorizing)\.?`)}],[/device offline/,{reason:`device_offline`,hint:`The device is connected but offline — wait for it to finish booting or run adb reconnect, then retry.`,retriable:!0},{hostRefusal:o(String.raw`device (?:'[^']*' )?offline`)}],[/more than one (?:device\/emulator|device and emulator)/,{reason:`multiple_devices`,hint:`Multiple Android devices are connected — pass --serial <serial> (see adb devices) to select one.`},{hostRefusal:o(String.raw`more than one (?:device/emulator|device and emulator)`)}],[/no devices\/emulators found|no devices found/,{reason:`no_devices`,hint:`No Android devices detected — boot an emulator or connect a device and verify it appears in adb devices.`},{hostRefusal:o(String.raw`no devices(?:/emulators)? found`)}],[/device (?:'[^']*' )?not found/,{reason:`device_not_found`,hint:`The device disconnected or is restarting — verify it is listed in adb devices, then retry.`,retriable:!0},{hostRefusal:o(String.raw`device (?:'[^']*' )?not found`)}],[/adb server version \(\d+\) doesn't match this client/,{reason:`server_version_mismatch`,hint:`Multiple adb installs conflict — adb restarts its server automatically, so retry; align PATH to a single adb to stop recurrences.`,retriable:!0}],[/transport error|connection reset|broken pipe|protocol fault/,{reason:`connection_dropped`,hint:`The adb connection dropped — retry; if it persists, run adb kill-server and reconnect the device.`,retriable:!0}],[/install_failed_insufficient_storage/,{reason:`install_insufficient_storage`,hint:`The device is out of storage — free up space or uninstall unused apps, then retry the install.`},{matchStdout:!0}],[/install_failed_update_incompatible/,{reason:`install_update_incompatible`,hint:`The installed app has an incompatible signature — uninstall the existing app first, then retry the install.`},{matchStdout:!0}],[/install_failed_version_downgrade/,{reason:`install_version_downgrade`,hint:`The APK is older than the installed app — uninstall the app first (or install with downgrade allowed), then retry.`},{matchStdout:!0}],[/install_failed_\w+|install_parse_failed_\w+/,{reason:`install_failed`,hint:`The Android package installer rejected the APK — see the INSTALL_FAILED code in the error output for the exact cause.`},{matchStdout:!0}]],c=Object.freeze({reason:`timeout`,hint:`adb timed out — the adb server may be wedged. Run adb kill-server && adb start-server, check adb devices, then retry.`}),l=/^(?:this adb server's \$adb_vendor_keys is not set|try 'adb kill-server' if that seems wrong\.|(?:otherwise|please) check (?:for|the) (?:a )?confirmation dialog on your device\.)$/;function u(e,t){if(t!==``)return;let[n,...r]=e.split(`
|
|
2
|
+
`).map(e=>e.trim()).filter(e=>e!==``);if(n===void 0||!r.every(e=>l.test(e)))return;let i=s.find(([,,e])=>e?.hostRefusal?.test(n));return i&&{...i[1],hostRefusal:!0}}function d(e,t=``){let n=e.toLowerCase(),r=t.toLowerCase(),i=u(n,r);if(i)return i;for(let[e,t,i]of s)if(e.test(n)||i?.matchStdout&&e.test(r))return t}function f(e){if(!(e instanceof t)||e.code!==`COMMAND_FAILED`)return e;let n=m(e);return n&&(e.details={...e.details,adbFailure:n.reason,...n.hostRefusal?{adbHostRefusal:!0}:{},...typeof e.details?.hint==`string`?{}:{hint:n.hint},...n.retriable!==void 0&&e.details?.retriable===void 0?{retriable:n.retriable}:{}}),e}function p(e){if(!r(e))return e;let t=e.details?.hint;if(typeof t==`string`&&t!==c.hint)return e;let n=f(e);return n.details={...n.details,hint:`The helper install timed out — some OEM builds (ColorOS is one) hold the first install of each package behind a system install-confirmation dialog and adb waits for it. Check the device screen, confirm any pending install prompt, then retry; if none is showing, run adb kill-server && adb start-server and retry.`},n}function m(e){return typeof e.details?.timeoutMs==`number`?c:d(typeof e.details?.stderr==`string`?e.details.stderr:``,typeof e.details?.stdout==`string`?e.details.stdout:``)}function h(e,n,r){let i=n.exitCode===0?{stdout:n.stdout,stderr:n.stderr,exitCode:n.exitCode,...r}:{stdout:n.stdout,stderr:n.stderr,exitCode:n.exitCode,processExitError:!0,...r};return f(new t(`COMMAND_FAILED`,e,i))}function g(e){return async(...t)=>{try{return await e(...t)}catch(e){throw f(e)}}}function _(e,n,r){let i=d(n.stderr,n.stdout);return new t(`COMMAND_FAILED`,e,{stdout:n.stdout,stderr:n.stderr,exitCode:n.exitCode,processExitError:!0,hint:i?.hint??r,...i?{adbFailure:i.reason}:{},...i?.retriable===void 0?{}:{retriable:i.retriable}})}function v(e){return r(e)&&(e.details={...e.details,adbFailure:c.reason,...typeof e.details?.hint==`string`?{}:{hint:c.hint}}),e}function y(e){return e instanceof t?n(e,e.code===`TOOL_MISSING`||b(e)?`no`:`unknown`):e}function b(e){return e.details?.adbHostRefusal===!0}export{v as a,y as c,f as i,b as l,h as n,p as o,_ as r,d as s,i as t,g as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime.js";import{
|
|
1
|
+
import{r as e}from"./rolldown-runtime.js";import{cr 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{cr as t}from"./sdk-batch.js";import{C as n,f as r,g as i,o as a,x as o}from"./owner-identity.js";import{_ as s}from"./exec.js";import"./command.js";import"./process.js";import c from"node:path";import l from"node:crypto";var u=e({agentBrowserChromeLaunchMarker:()=>d,appendAgentDeviceChromeArgs:()=>f,inspectManagedAgentBrowserProcesses:()=>_,matchAgentBrowserChromeProcess:()=>p,recordManagedAgentBrowserProcesses:()=>v,summarizeAgentBrowserProcesses:()=>m,summarizeManagedAgentBrowserProcesses:()=>g});function d(e){let t=l.createHash(`sha256`);return t.update(c.resolve(e.stateDir)),t.update(`\0`),t.update(c.resolve(e.installDir)),`--agent-device-managed-web=${t.digest(`hex`).slice(0,16)}`}function f(e,t){let n=d(t),r=e?.trim();return r?x(r).includes(n)?r:`${r},${n}`:n}function p(e,t){if(!(e.pid===r()||!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 r=await y(),i=g(r,e),s=a(i.pids,r),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=n(e.pid),r=o(e.pid);return t&&r?[{pid:e.pid,startTime:t,command:r,purpose:`managed-web-browser`}]:[]});return l.length>0&&t.replace({kind:`daemon`},l),c}async function y(){return await s(async()=>await i({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===r()||S(e.command))return;let n=E(e.command),i=E(c.resolve(t.installDir));return n.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{N as e}from"./sdk-contracts.js";import{k as t}from"./sdk-batch-runner.js";import{t as n}from"./scroll-gesture.js";import{r}from"./diagnostics.js";import{d as i}from"./owner-identity.js";import{n as a}from"./exec.js";import{t as o}from"./timeouts.js";import"./diagnostics2.js";import"./command.js";import"./process.js";import"./retry.js";import{n as s}from"./audio-probe-result.js";import{i as c}from"./agent-browser-process-record.js";import{n as l}from"./agent-browser-lifecycle.js";import{i as ee,n as u,r as te}from"./agent-browser-tool.js";function d(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function f(e,t){return d(e)?e[t]:void 0}function p(e,t){let n=f(e,t);return typeof n==`string`?n:void 0}function ne(e,t){let n=f(e,t);return typeof n==`boolean`?n:void 0}function m(e,t){let n=e[t];return typeof n==`number`&&Number.isFinite(n)?n:void 0}const re=[g,_,v,y,b,x,S,C,w,T,E,D,O,k,A,j,M];function ie(e){let t=re.map(e=>`${e.toString()};`).join(``),n=oe(e.action),r=h(e.durationMs),i=h(e.bucketMs);return`(()=>{${t}return ${M.name}({action:${n},durationMs:${r},bucketMs:${i}})})()`}function ae(e){let t=s(se(e),{source:`media-elements`,backend:`agent-browser`,durationMs:0,elapsedMs:0,bucketMs:1e3,activeFallback:!1,mediaElementCount:0,sourceCount:0});return{...t,source:`media-elements`,mediaElementCount:t.mediaElementCount??0}}function oe(e){switch(e){case`start`:return`'start'`;case`stop`:return`'stop'`;default:return`'status'`}}function h(e){return e===void 0||!Number.isFinite(e)?`undefined`:String(Math.trunc(e))}function g(e){return!Number.isFinite(e)||e<=0?-90:Math.max(-90,Math.min(0,Math.round(20*Math.log10(e))))}function _(e,t){e.notes.includes(t)||e.notes.push(t)}function v(){return Array.from(document.querySelectorAll(`audio,video`))}function y(e,t){if(!e||e.state===`stopped`)return e;clearInterval(e.timer),clearTimeout(e.timeout),e.timer=void 0,e.timeout=void 0,e.state=`stopped`,e.active=!1,e.reason=t,e.stoppedAt=Date.now();for(let t of e.analysers)try{t.analyser.disconnect(),t.source.disconnect(),t.audible&&t.source.connect(e.context.destination)}catch{}if(e.resumeOnGesture){for(let t of[`click`,`pointerdown`,`keydown`])window.removeEventListener(t,e.resumeOnGesture,!0);e.resumeOnGesture=void 0}return e}function b(e){let t=window.AudioContext||window.webkitAudioContext;if(!t)return;let n=window[e];if(n&&n.state!==`closed`)return n;let r=new t;return window[e]=r,r}function x(e,t,n){if(!(!t.currentSrc&&!t.src&&t.readyState===0))try{window[n]||(window[n]=new WeakMap);let r=window[n].get(t);return r||(r=e.context.createMediaElementSource(t),window[n].set(t,r)),r.disconnect(),{source:r,audible:!0}}catch{return}}function S(e,t){if(!(!t||typeof t.getAudioTracks!=`function`)&&t.getAudioTracks().length!==0)return{source:e.context.createMediaStreamSource(t),audible:!1}}function C(e,t){if(typeof t.captureStream==`function`)return S(e,t.captureStream())}function w(e,t){let n=e.context.createAnalyser();n.fftSize=2048,t.source.connect(n),n.connect(t.audible?e.context.destination:e.sink),e.analysers.push({...t,analyser:n,buffer:new Float32Array(n.fftSize)})}function T(e,t){let n=v();e.mediaElementCount=n.length;for(let r of n){if(e.seen.has(r))continue;let n=S(e,r.srcObject)??C(e,r)??x(e,r,t);if(!n){_(e,`Some media elements do not expose capturable audio to Web Audio.`);continue}e.seen.add(r),w(e,n)}e.sourceCount=e.analysers.length,e.sourceCount===0&&_(e,`No capturable page media audio sources were found yet.`)}function E(e){let t=0,n=0,r=0;for(let i of e.analysers){i.analyser.getFloatTimeDomainData(i.buffer);for(let e of i.buffer)t+=e*e,n+=1,r=Math.max(r,Math.abs(e))}return{rms:n>0?Math.sqrt(t/n):0,peak:r}}function D(e){let t=Math.ceil(e.durationMs/e.bucketMs)+2;e.rmsDbfs.length>t&&e.rmsDbfs.splice(0,e.rmsDbfs.length-t),e.peakDbfs.length>t&&e.peakDbfs.splice(0,e.peakDbfs.length-t)}function O(e,t){if(!e||e.state!==`running`)return;T(e,t);let n=E(e),r=g(n.rms),i=g(n.peak);e.rmsDbfs.push(r),e.peakDbfs.push(i),e.heard=e.heard||r>-90||i>-90,D(e),Date.now()-e.startedAt>=e.durationMs&&y(e,`duration`)}function k(e,t){return{audio:`probe`,state:`stopped`,active:!1,heard:!1,source:`media-elements`,backend:`agent-browser`,durationMs:Number(e.durationMs)||1e4,elapsedMs:0,bucketMs:Number(e.bucketMs)||1e3,sampleCount:0,mediaElementCount:v().length,sourceCount:0,rmsDbfs:[],peakDbfs:[],notes:t}}function A(e,t,n,r){return e?{audio:`probe`,state:e.state,active:e.state===`running`,heard:e.heard,source:`media-elements`,backend:`agent-browser`,durationMs:e.durationMs,elapsedMs:Math.max(0,Math.min((e.stoppedAt||Date.now())-e.startedAt,e.durationMs)),bucketMs:e.bucketMs,sampleCount:e.rmsDbfs.length,mediaElementCount:v().length,sourceCount:e.sourceCount,rmsDbfs:e.rmsDbfs.slice(),peakDbfs:e.peakDbfs.slice(),startedAt:new Date(e.startedAt).toISOString(),stoppedAt:e.stoppedAt?new Date(e.stoppedAt).toISOString():void 0,reason:e.reason,notes:[n,r,...e.notes]}:k(t,[n,r])}function j(e,t,n,r,i,a,o){t&&y(t,`restarted`);let s=b(r);if(!s)return k(e,[`Web Audio API is not available in this browser context.`]);let c=s.createGain();c.gain.value=0,c.connect(s.destination);let l={state:`running`,active:!0,context:s,sink:c,seen:new WeakSet,analysers:[],mediaElementCount:0,sourceCount:0,durationMs:Math.max(100,Number(e.durationMs)||1e4),bucketMs:Math.max(100,Number(e.bucketMs)||1e3),startedAt:Date.now(),stoppedAt:void 0,reason:void 0,heard:!1,rmsDbfs:[],peakDbfs:[],notes:[]};try{s.resume()}catch{_(l,`AudioContext could not be resumed by the probe.`)}l.resumeOnGesture=()=>{try{s.resume()}catch{_(l,`AudioContext could not be resumed from a user gesture.`)}};for(let e of[`click`,`pointerdown`,`keydown`])window.addEventListener(e,l.resumeOnGesture,{capture:!0,once:!0});return T(l,i),l.timer=setInterval(()=>O(l,i),l.bucketMs),l.timeout=setTimeout(()=>y(l,`duration`),l.durationMs),window[n]=l,A(l,e,a,o)}function M(e){let t=`__agentDeviceAudioProbe`,n=`__agentDeviceAudioProbeSources`,r=`Audio probe samples HTML media elements exposed to Web Audio; it is not whole-tab or system audio capture.`,i=`URL-backed media elements may be routed through the probe AudioContext while they are observed.`,a=window[t];return a&&a.state===`running`&&Date.now()-a.startedAt>=a.durationMs&&(O(a,n),y(a,`duration`)),e.action===`start`?j(e,a,t,`__agentDeviceAudioProbeContext`,n,r,i):e.action===`stop`?(a&&O(a,n),y(a,`manual`),A(a,e,r,i)):(a&&O(a,n),A(a,e,r,i))}function se(e){return d(e)?d(e.result)?e.result:e:{}}function ce(e,t={}){let n=le(e),r=pe(t.limit),i=t.include===`headers`||t.include===`all`,a=n.slice(-r).reverse().map(e=>de(e,i)),o=t.include===`body`||t.include===`all`?[`agent-browser network requests does not expose request or response bodies.`]:void 0;return{entries:a,backend:`agent-browser`,redacted:!1,...o?{notes:o}:{}}}function le(e){let t=d(e)&&Array.isArray(e.requests)?e.requests:e;return Array.isArray(t)?t.filter(ue).map(e=>({headers:N(e.headers),method:p(e,`method`),mimeType:p(e,`mimeType`),requestId:p(e,`requestId`),resourceType:p(e,`resourceType`),responseHeaders:N(e.responseHeaders),status:m(e,`status`),timestamp:fe(e.timestamp),url:p(e,`url`)})):[]}function ue(e){return d(e)}function de(e,n){let r=e.timestamp===void 0?void 0:P(e.timestamp),i=t({requestId:e.requestId,resourceType:e.resourceType,mimeType:e.mimeType});return t({timestamp:r,method:e.method,url:e.url,status:e.status,requestHeaders:n?e.headers:void 0,responseHeaders:n?e.responseHeaders:void 0,metadata:Object.keys(i).length>0?i:void 0})}function N(e){if(!d(e))return;let t={};for(let[n,r]of Object.entries(e))typeof r==`string`&&(t[n]=r);return Object.keys(t).length>0?t:void 0}function fe(e){if(typeof e==`number`||typeof e==`string`)return e}function P(e){if(typeof e==`string`){let t=Number(e);return Number.isFinite(t)?P(t):e}let t=e>1e10?e:e*1e3,n=new Date(t);return Number.isNaN(n.getTime())?String(e):n.toISOString()}function pe(e){return typeof e!=`number`||!Number.isInteger(e)?25:Math.max(1,Math.min(e,200))}async function me(e,t){let n=F(p(e,`snapshot`)??``,R(f(e,`refs`)));return t&&await he(n,t),{nodes:n.map((e,t)=>({...e.node,index:t,ref:e.ref})),truncated:ne(e,`truncated`)}}async function he(e,t){for(let n=0;n<e.length;n+=8){let r=e.slice(n,n+8),i=await Promise.all(r.map(e=>t(e.ref)));for(let[e,t]of i.entries())t&&(r[e].node.rect=t)}}function F(e,t){let n=new Map(t.map(e=>[e.ref,e])),r=[],i=new Set,a=new Map;for(let t of e.split(/\r?\n/)){let e=ve(t);if(!e)continue;i.add(e);let o=n.get(e)?.data,s=ge(t),c=I(t,o,s),l=_e(a,s);l!==void 0&&(c.parentIndex=l),r.push({ref:e,node:{...c,index:r.length}}),a.set(s,r.length-1)}for(let e of t)i.has(e.ref)||r.push({ref:e.ref,node:{...L(e.data),index:r.length}});return r}function I(e,t,n){let r=ye(e)??V(t,[`role`,`type`]);return{index:0,type:r,role:r,label:be(e)??V(t,[`label`,`name`,`text`]),value:Se(e)??V(t,[`value`]),depth:n,enabled:H(t,[`enabled`])??(!xe(e)&&void 0),focused:H(t,[`focused`])}}function L(e){let t=V(e,[`role`,`type`]);return{index:0,type:t,role:t,label:V(e,[`label`,`name`,`text`]),value:V(e,[`value`]),enabled:H(e,[`enabled`]),focused:H(e,[`focused`])}}function R(e){return Array.isArray(e)?e.flatMap(e=>{let t=d(e)?e:void 0,n=B(V(t,[`ref`,`id`])??String(e));return n?[{ref:n,data:t}]:[]}):d(e)?Object.entries(e).flatMap(([e,t])=>{let n=B(e);return n?[{ref:n,data:d(t)?t:void 0}]:[]}):[]}function ge(e){let t=e.match(/^\s*/)?.[0].length??0;return Math.floor(t/2)}function _e(e,t){for(let n=t-1;n>=0;--n){let t=e.get(n);if(t!==void 0)return t}}function ve(e){return B(z(e)?.match(/\bref\s*=\s*['"]?(@?e\d+)['"]?/i)?.[1]??e.match(/@?(e\d+)\b/i)?.[1])}function z(e){return e.replaceAll(/"(?:[^"\\]|\\.)*"/g,`""`).replaceAll(/'(?:[^'\\]|\\.)*'/g,`''`).match(/\[([^\]]*\bref\s*=\s*['"]?@?e\d+[^\]]*)\]\s*(?=:|$)/i)?.[1]}function B(e){let t=e?.trim().replace(/^@/,``);return t&&/^e\d+$/i.test(t)?t.toLowerCase():null}function ye(e){return e.replaceAll(/\[[^\]]*ref[^\]]*\]/gi,``).replaceAll(/@?e\d+\b/gi,``).replaceAll(/^[\s|├└─>*-]+/g,``).trim().match(/^([A-Za-z][\w-]*)\b/)?.[1]}function be(e){return e.match(/"([^"]+)"/)?.[1]??e.match(/'([^']+)'/)?.[1]}function xe(e){return/\bdisabled\b/i.test(z(e)??``)}function Se(e){return Ce(e)??e.match(/\bvalue=(?:"([^"]*)"|'([^']*)'|([^\s\]]+))/i)?.slice(1).find(U)??e.match(/\bvalue:\s*(?:"([^"]*)"|'([^']*)'|([^\s\]]+))/i)?.slice(1).find(U)}function Ce(e){return e.match(/\]\s*:\s*(.+)$/)?.[1]?.trim()||void 0}function V(e,t){if(e)for(let n of t){let t=e[n];if(typeof t==`string`&&t.length>0)return t}}function H(e,t){if(e)for(let n of t){let t=e[n];if(typeof t==`boolean`)return t}}function U(e){return typeof e==`string`}const W=`agent-browser`,G="Run `agent-device web setup` to install the managed web backend.";function we(e={}){let t=e.session?.trim(),n=async(n,r)=>await Pe(n,{session:t,options:e,signal:r});return{async open(e){await n([`open`,e])},async close(){await n([`close`])},async startRecording(e){await n([`record`,`start`,e])},async stopRecording(){await n([`record`,`stop`])},async snapshot(e){return await Ae(t=>n(t,e?.signal),e)},async screenshot(e,t){await n([`screenshot`,...t?.fullscreen?[`--full`]:[],e])},async setViewport(e,t){await n([`set`,`viewport`,String(e),String(t)])},async click(e,t){await K(n,e,t)},async hover(e,t){await q(n,e,t)},async hoverRef(e){await n([`hover`,Z(e)])},async clickRef(e){await n([`click`,Z(e)])},async fill(e,t,r){if(await K(n,e,t),await n([`press`,He()]),r.length===0){await n([`press`,`Backspace`]);return}await n([`keyboard`,`type`,r])},async fillRef(e,t){await n([`fill`,Z(e),t])},async typeText(e){await n([`keyboard`,`type`,e])},async scroll(e,t){return await Te(n,e,t),t?.durationMs===void 0?{}:{durationMs:t.durationMs}},async dumpNetwork(e){return ce(await n([`network`,`requests`]),e)},async probeAudio(e){return ae(await n([`eval`,ie(e)]))}}}async function Te(e,t,n){let r=De(Ee(n));for(let n of r)await e(ke(t,n.distance)),n.delayAfterMs>0&&await o(n.delayAfterMs)}function Ee(e){let t=e?.durationMs,r=t===void 0?{}:{durationMs:t};return e?.pixels===void 0?e?.amount===void 0?r:{distance:Math.max(1,Math.round(300*e.amount/n)),...r}:{distance:e.pixels,...r}}function De(e){let{distance:t,durationMs:n}=e;if(n===void 0||n<=0)return[{distance:t,delayAfterMs:0}];let r=Math.max(1,Math.min(20,Math.ceil(n/50))),i=n/Math.max(1,r-1);return Oe(Math.round(t??300),r).map((e,t)=>({distance:e,delayAfterMs:t<r-1?i:0}))}function Oe(e,t){let n=Math.floor(e/t),r=e-n*t;return Array.from({length:t},(e,t)=>t<r?n+1:n)}function ke(e,t){return[`scroll`,e,...t===void 0?[]:[String(t)]]}async function K(e,t,n){await q(e,t,n),await e([`mouse`,`down`]),await e([`mouse`,`up`])}async function q(e,t,n){await e([`mouse`,`move`,String(Math.round(t)),String(Math.round(n))])}async function Ae(e,t){return await me(await e(je(t)),t?.includeRects?async t=>await Me(e,t):void 0)}function je(e){return[`snapshot`,...e?.interactiveOnly?[`--interactive`]:[],...e?.raw?[]:[`--compact`],...typeof e?.depth==`number`?[`--depth`,String(e.depth)]:[],...e?.scope?[`--selector`,e.scope]:[]]}async function Me(e,t){try{return Ue(await e([`get`,`box`,Z(t)]))}catch(e){if(Ne(e))return;throw e}}function Ne(e){let t=e instanceof Error?e.message:String(e);return!/\bstale\b/i.test(t)&&/\bbox\b|not visible|not found|no element/i.test(t)}async function Pe(e,t){let{session:n,options:r,signal:i}=t,a=[...e,`--json`,...n?[`--session`,n]:[]];return await Fe(a,r,e=>Re(ze(e.stdout,e.stderr,a,e.exitCode),e,a),i)}async function Fe(e,t,n,r){let i=``,a=``,o=0,s=!1,c=!1,l=u({stateDir:t.stateDir});try{await Le(t);let n=await ee(e,{stateDir:t.stateDir,allowFailure:!0,timeoutMs:3e4,signal:r});i=n.stdout,a=n.stderr,o=n.exitCode,s=!0}catch(n){throw await J({cliArgs:e,commandCompleted:s,exitCode:o,semanticSuccess:c,options:t,status:l}),Be(n,e)}try{let e=n({stdout:i,stderr:a,exitCode:o});return c=!0,e}finally{await J({cliArgs:e,commandCompleted:s,exitCode:o,semanticSuccess:c,options:t,status:l})}}async function J(e){let t=e.options.ownedProcessRecords;if(!(!t||!e.status.installed))try{let n=e.options.openWebSessionNames?.()??[],r=e.options.session?.trim();Ie(e,n.filter(e=>e!==r).length)?t.clear({kind:`daemon`}):await c(e.status,t)}catch(e){r({level:`warn`,phase:`web_agent_browser_process_record_failed`,data:{error:e instanceof Error?e.message:String(e)}})}}function Ie(e,t){return e.commandCompleted&&e.semanticSuccess&&e.cliArgs[0]===`close`&&e.exitCode===0&&t===0}async function Le(e){if(!e.openWebSessionNames)return;let t=u({stateDir:e.stateDir});if(t.installed)try{await l(t,{openWebSessionNames:e.openWebSessionNames(),...e.ownedProcessRecords===void 0?{}:{ownedProcessRecords:e.ownedProcessRecords}})}catch(e){r({level:`warn`,phase:`web_agent_browser_provider_orphan_cleanup_failed`,data:{error:e instanceof Error?e.message:String(e)}})}}function Re(t,n,r){if(!d(t))return t;if((t.success??t.ok)===!1)throw new e(Ve(t.code),X(t),{cmd:W,args:r,hint:p(t,`hint`)??G,agentBrowserError:t.error});if(n.exitCode!==0)throw new e(`COMMAND_FAILED`,`agent-browser command failed`,a(n,{cmd:W,args:r,stdout:n.stdout.slice(0,500),stderr:n.stderr.slice(0,500),hint:p(t,`hint`)??G}));return Object.hasOwn(t,`data`)?t.data:t}function ze(t,n,r,i){try{return JSON.parse(t)}catch(a){let o=i!==0;throw new e(`COMMAND_FAILED`,o?`agent-browser command failed`:`agent-browser returned invalid JSON`,{cmd:W,args:r,...o?{exitCode:i}:{},stdout:t.slice(0,500),stderr:n.slice(0,500),hint:G},a instanceof Error?a:void 0)}}function Be(t,n){let r=te(t);return r.code===`TOOL_MISSING`?new e(`TOOL_MISSING`,r.message,{...r.details??{},cmd:W,args:n,hint:Y(r)},r):r.code===`COMMAND_FAILED`?new e(`COMMAND_FAILED`,r.message,{...r.details??{},cmd:W,args:n,hint:Y(r)},r):r}function Y(e){return typeof e.details?.hint==`string`?e.details.hint:G}function X(e){let t=e.error;if(typeof t==`string`&&t.trim())return t.trim();if(d(t)){let e=p(t,`message`)??p(t,`error`);if(e)return e}return p(e,`message`)??`agent-browser command failed`}function Ve(e){return typeof e==`string`&&e.length>0?e:`COMMAND_FAILED`}function Z(e){return e.startsWith(`@`)?e:`@${e}`}function He(){return i()===`darwin`?`Meta+a`:`Control+a`}function Ue(e){let t=d(e)&&d(e.box)?e.box:e;if(d(t))return We(t)??Ge(t)}function We(e){return Q(m(e,`x`),m(e,`y`),m(e,`width`),m(e,`height`))}function Ge(e){let t=m(e,`left`),n=m(e,`top`),r=m(e,`right`),i=m(e,`bottom`);return Q(t,n,$(r,t),$(i,n))}function Q(e,t,n,r){if(e!==void 0&&t!==void 0&&n!==void 0&&r!==void 0)return{x:e,y:t,width:n,height:r}}function $(e,t){return e===void 0||t===void 0?void 0:e-t}export{we as createAgentBrowserWebProvider};
|
|
1
|
+
import{N as e,z as t}from"./sdk-contracts.js";import{k as n}from"./sdk-batch-runner.js";import{t as r}from"./scroll-gesture.js";import{r as i}from"./diagnostics.js";import{d as a}from"./owner-identity.js";import{n as o}from"./exec.js";import{t as s}from"./timeouts.js";import"./diagnostics2.js";import"./command.js";import"./process.js";import"./retry.js";import{n as c}from"./audio-probe-result.js";import{i as l}from"./agent-browser-process-record.js";import{n as ee}from"./agent-browser-lifecycle.js";import{i as te,n as u,r as ne}from"./agent-browser-tool.js";function d(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function f(e,t){return d(e)?e[t]:void 0}function p(e,t){let n=f(e,t);return typeof n==`string`?n:void 0}function re(e,t){let n=f(e,t);return typeof n==`boolean`?n:void 0}function m(e,t){let n=e[t];return typeof n==`number`&&Number.isFinite(n)?n:void 0}const ie=[g,_,v,y,b,x,S,C,w,T,E,D,O,k,A,j,M];function ae(e){let t=ie.map(e=>`${e.toString()};`).join(``),n=se(e.action),r=h(e.durationMs),i=h(e.bucketMs);return`(()=>{${t}return ${M.name}({action:${n},durationMs:${r},bucketMs:${i}})})()`}function oe(e){let t=c(ce(e),{source:`media-elements`,backend:`agent-browser`,durationMs:0,elapsedMs:0,bucketMs:1e3,activeFallback:!1,mediaElementCount:0,sourceCount:0});return{...t,source:`media-elements`,mediaElementCount:t.mediaElementCount??0}}function se(e){switch(e){case`start`:return`'start'`;case`stop`:return`'stop'`;default:return`'status'`}}function h(e){return e===void 0||!Number.isFinite(e)?`undefined`:String(Math.trunc(e))}function g(e){return!Number.isFinite(e)||e<=0?-90:Math.max(-90,Math.min(0,Math.round(20*Math.log10(e))))}function _(e,t){e.notes.includes(t)||e.notes.push(t)}function v(){return Array.from(document.querySelectorAll(`audio,video`))}function y(e,t){if(!e||e.state===`stopped`)return e;clearInterval(e.timer),clearTimeout(e.timeout),e.timer=void 0,e.timeout=void 0,e.state=`stopped`,e.active=!1,e.reason=t,e.stoppedAt=Date.now();for(let t of e.analysers)try{t.analyser.disconnect(),t.source.disconnect(),t.audible&&t.source.connect(e.context.destination)}catch{}if(e.resumeOnGesture){for(let t of[`click`,`pointerdown`,`keydown`])window.removeEventListener(t,e.resumeOnGesture,!0);e.resumeOnGesture=void 0}return e}function b(e){let t=window.AudioContext||window.webkitAudioContext;if(!t)return;let n=window[e];if(n&&n.state!==`closed`)return n;let r=new t;return window[e]=r,r}function x(e,t,n){if(!(!t.currentSrc&&!t.src&&t.readyState===0))try{window[n]||(window[n]=new WeakMap);let r=window[n].get(t);return r||(r=e.context.createMediaElementSource(t),window[n].set(t,r)),r.disconnect(),{source:r,audible:!0}}catch{return}}function S(e,t){if(!(!t||typeof t.getAudioTracks!=`function`)&&t.getAudioTracks().length!==0)return{source:e.context.createMediaStreamSource(t),audible:!1}}function C(e,t){if(typeof t.captureStream==`function`)return S(e,t.captureStream())}function w(e,t){let n=e.context.createAnalyser();n.fftSize=2048,t.source.connect(n),n.connect(t.audible?e.context.destination:e.sink),e.analysers.push({...t,analyser:n,buffer:new Float32Array(n.fftSize)})}function T(e,t){let n=v();e.mediaElementCount=n.length;for(let r of n){if(e.seen.has(r))continue;let n=S(e,r.srcObject)??C(e,r)??x(e,r,t);if(!n){_(e,`Some media elements do not expose capturable audio to Web Audio.`);continue}e.seen.add(r),w(e,n)}e.sourceCount=e.analysers.length,e.sourceCount===0&&_(e,`No capturable page media audio sources were found yet.`)}function E(e){let t=0,n=0,r=0;for(let i of e.analysers){i.analyser.getFloatTimeDomainData(i.buffer);for(let e of i.buffer)t+=e*e,n+=1,r=Math.max(r,Math.abs(e))}return{rms:n>0?Math.sqrt(t/n):0,peak:r}}function D(e){let t=Math.ceil(e.durationMs/e.bucketMs)+2;e.rmsDbfs.length>t&&e.rmsDbfs.splice(0,e.rmsDbfs.length-t),e.peakDbfs.length>t&&e.peakDbfs.splice(0,e.peakDbfs.length-t)}function O(e,t){if(!e||e.state!==`running`)return;T(e,t);let n=E(e),r=g(n.rms),i=g(n.peak);e.rmsDbfs.push(r),e.peakDbfs.push(i),e.heard=e.heard||r>-90||i>-90,D(e),Date.now()-e.startedAt>=e.durationMs&&y(e,`duration`)}function k(e,t){return{audio:`probe`,state:`stopped`,active:!1,heard:!1,source:`media-elements`,backend:`agent-browser`,durationMs:Number(e.durationMs)||1e4,elapsedMs:0,bucketMs:Number(e.bucketMs)||1e3,sampleCount:0,mediaElementCount:v().length,sourceCount:0,rmsDbfs:[],peakDbfs:[],notes:t}}function A(e,t,n,r){return e?{audio:`probe`,state:e.state,active:e.state===`running`,heard:e.heard,source:`media-elements`,backend:`agent-browser`,durationMs:e.durationMs,elapsedMs:Math.max(0,Math.min((e.stoppedAt||Date.now())-e.startedAt,e.durationMs)),bucketMs:e.bucketMs,sampleCount:e.rmsDbfs.length,mediaElementCount:v().length,sourceCount:e.sourceCount,rmsDbfs:e.rmsDbfs.slice(),peakDbfs:e.peakDbfs.slice(),startedAt:new Date(e.startedAt).toISOString(),stoppedAt:e.stoppedAt?new Date(e.stoppedAt).toISOString():void 0,reason:e.reason,notes:[n,r,...e.notes]}:k(t,[n,r])}function j(e,t,n,r,i,a,o){t&&y(t,`restarted`);let s=b(r);if(!s)return k(e,[`Web Audio API is not available in this browser context.`]);let c=s.createGain();c.gain.value=0,c.connect(s.destination);let l={state:`running`,active:!0,context:s,sink:c,seen:new WeakSet,analysers:[],mediaElementCount:0,sourceCount:0,durationMs:Math.max(100,Number(e.durationMs)||1e4),bucketMs:Math.max(100,Number(e.bucketMs)||1e3),startedAt:Date.now(),stoppedAt:void 0,reason:void 0,heard:!1,rmsDbfs:[],peakDbfs:[],notes:[]};try{s.resume()}catch{_(l,`AudioContext could not be resumed by the probe.`)}l.resumeOnGesture=()=>{try{s.resume()}catch{_(l,`AudioContext could not be resumed from a user gesture.`)}};for(let e of[`click`,`pointerdown`,`keydown`])window.addEventListener(e,l.resumeOnGesture,{capture:!0,once:!0});return T(l,i),l.timer=setInterval(()=>O(l,i),l.bucketMs),l.timeout=setTimeout(()=>y(l,`duration`),l.durationMs),window[n]=l,A(l,e,a,o)}function M(e){let t=`__agentDeviceAudioProbe`,n=`__agentDeviceAudioProbeSources`,r=`Audio probe samples HTML media elements exposed to Web Audio; it is not whole-tab or system audio capture.`,i=`URL-backed media elements may be routed through the probe AudioContext while they are observed.`,a=window[t];return a&&a.state===`running`&&Date.now()-a.startedAt>=a.durationMs&&(O(a,n),y(a,`duration`)),e.action===`start`?j(e,a,t,`__agentDeviceAudioProbeContext`,n,r,i):e.action===`stop`?(a&&O(a,n),y(a,`manual`),A(a,e,r,i)):(a&&O(a,n),A(a,e,r,i))}function ce(e){return d(e)?d(e.result)?e.result:e:{}}function le(e,t={}){let n=ue(e),r=me(t.limit),i=t.include===`headers`||t.include===`all`,a=n.slice(-r).reverse().map(e=>fe(e,i)),o=t.include===`body`||t.include===`all`?[`agent-browser network requests does not expose request or response bodies.`]:void 0;return{entries:a,backend:`agent-browser`,redacted:!1,...o?{notes:o}:{}}}function ue(e){let t=d(e)&&Array.isArray(e.requests)?e.requests:e;return Array.isArray(t)?t.filter(de).map(e=>({headers:N(e.headers),method:p(e,`method`),mimeType:p(e,`mimeType`),requestId:p(e,`requestId`),resourceType:p(e,`resourceType`),responseHeaders:N(e.responseHeaders),status:m(e,`status`),timestamp:pe(e.timestamp),url:p(e,`url`)})):[]}function de(e){return d(e)}function fe(e,t){let r=e.timestamp===void 0?void 0:P(e.timestamp),i=n({requestId:e.requestId,resourceType:e.resourceType,mimeType:e.mimeType});return n({timestamp:r,method:e.method,url:e.url,status:e.status,requestHeaders:t?e.headers:void 0,responseHeaders:t?e.responseHeaders:void 0,metadata:Object.keys(i).length>0?i:void 0})}function N(e){if(!d(e))return;let t={};for(let[n,r]of Object.entries(e))typeof r==`string`&&(t[n]=r);return Object.keys(t).length>0?t:void 0}function pe(e){if(typeof e==`number`||typeof e==`string`)return e}function P(e){if(typeof e==`string`){let t=Number(e);return Number.isFinite(t)?P(t):e}let t=e>1e10?e:e*1e3,n=new Date(t);return Number.isNaN(n.getTime())?String(e):n.toISOString()}function me(e){return typeof e!=`number`||!Number.isInteger(e)?25:Math.max(1,Math.min(e,200))}async function he(e,t){let n=I(p(e,`snapshot`)??``,ge(f(e,`refs`)));return t&&await F(n,t),{nodes:n.map((e,t)=>({...e.node,index:t,ref:e.ref})),truncated:re(e,`truncated`)}}async function F(e,t){for(let n=0;n<e.length;n+=8){let r=e.slice(n,n+8),i=await Promise.all(r.map(e=>t(e.ref)));for(let[e,t]of i.entries())t&&(r[e].node.rect=t)}}function I(e,t){let n=new Map(t.map(e=>[e.ref,e])),r=[],i=new Set,a=new Map;for(let t of e.split(/\r?\n/)){let e=ye(t);if(!e)continue;i.add(e);let o=n.get(e)?.data,s=_e(t),c=L(t,o,s),l=ve(a,s);l!==void 0&&(c.parentIndex=l),r.push({ref:e,node:{...c,index:r.length}}),a.set(s,r.length-1)}for(let e of t)i.has(e.ref)||r.push({ref:e.ref,node:{...R(e.data),index:r.length}});return r}function L(e,t,n){let r=be(e)??V(t,[`role`,`type`]);return{index:0,type:r,role:r,label:xe(e)??V(t,[`label`,`name`,`text`]),value:Ce(e)??V(t,[`value`]),depth:n,enabled:H(t,[`enabled`])??(!Se(e)&&void 0),focused:H(t,[`focused`])}}function R(e){let t=V(e,[`role`,`type`]);return{index:0,type:t,role:t,label:V(e,[`label`,`name`,`text`]),value:V(e,[`value`]),enabled:H(e,[`enabled`]),focused:H(e,[`focused`])}}function ge(e){return Array.isArray(e)?e.flatMap(e=>{let t=d(e)?e:void 0,n=B(V(t,[`ref`,`id`])??String(e));return n?[{ref:n,data:t}]:[]}):d(e)?Object.entries(e).flatMap(([e,t])=>{let n=B(e);return n?[{ref:n,data:d(t)?t:void 0}]:[]}):[]}function _e(e){let t=e.match(/^\s*/)?.[0].length??0;return Math.floor(t/2)}function ve(e,t){for(let n=t-1;n>=0;--n){let t=e.get(n);if(t!==void 0)return t}}function ye(e){return B(z(e)?.match(/\bref\s*=\s*['"]?(@?e\d+)['"]?/i)?.[1]??e.match(/@?(e\d+)\b/i)?.[1])}function z(e){return e.replaceAll(/"(?:[^"\\]|\\.)*"/g,`""`).replaceAll(/'(?:[^'\\]|\\.)*'/g,`''`).match(/\[([^\]]*\bref\s*=\s*['"]?@?e\d+[^\]]*)\]\s*(?=:|$)/i)?.[1]}function B(e){let t=e?.trim().replace(/^@/,``);return t&&/^e\d+$/i.test(t)?t.toLowerCase():null}function be(e){return e.replaceAll(/\[[^\]]*ref[^\]]*\]/gi,``).replaceAll(/@?e\d+\b/gi,``).replaceAll(/^[\s|├└─>*-]+/g,``).trim().match(/^([A-Za-z][\w-]*)\b/)?.[1]}function xe(e){return e.match(/"([^"]+)"/)?.[1]??e.match(/'([^']+)'/)?.[1]}function Se(e){return/\bdisabled\b/i.test(z(e)??``)}function Ce(e){return we(e)??e.match(/\bvalue=(?:"([^"]*)"|'([^']*)'|([^\s\]]+))/i)?.slice(1).find(U)??e.match(/\bvalue:\s*(?:"([^"]*)"|'([^']*)'|([^\s\]]+))/i)?.slice(1).find(U)}function we(e){return e.match(/\]\s*:\s*(.+)$/)?.[1]?.trim()||void 0}function V(e,t){if(e)for(let n of t){let t=e[n];if(typeof t==`string`&&t.length>0)return t}}function H(e,t){if(e)for(let n of t){let t=e[n];if(typeof t==`boolean`)return t}}function U(e){return typeof e==`string`}const W=`agent-browser`,G="Run `agent-device web setup` to install the managed web backend.";function Te(e={}){let t=e.session?.trim(),n=async(n,r)=>await Fe(n,{session:t,options:e,signal:r});return{async open(e){await n([`open`,e])},async close(){await n([`close`])},async startRecording(e){await n([`record`,`start`,e])},async stopRecording(){await n([`record`,`stop`])},async snapshot(e){return await je(t=>n(t,e?.signal),e)},async screenshot(e,t){await n([`screenshot`,...t?.fullscreen?[`--full`]:[],e])},async setViewport(e,t){await n([`set`,`viewport`,String(e),String(t)])},async click(e,t){await K(n,e,t)},async hover(e,t){await q(n,e,t)},async hoverRef(e){await n([`hover`,Z(e)])},async clickRef(e){await n([`click`,Z(e)])},async fill(e,t,r){if(await K(n,e,t),await n([`press`,Ue()]),r.length===0){await n([`press`,`Backspace`]);return}await n([`keyboard`,`type`,r])},async fillRef(e,t){await n([`fill`,Z(e),t])},async typeText(e){await n([`keyboard`,`type`,e])},async scroll(e,t){return await Ee(n,e,t),t?.durationMs===void 0?{}:{durationMs:t.durationMs}},async dumpNetwork(e){return le(await n([`network`,`requests`]),e)},async probeAudio(e){return oe(await n([`eval`,ae(e)]))}}}async function Ee(e,n,r){let i=Oe(De(r)),a=0;try{for(let t of i)await e(Ae(n,t.distance)),a+=1,t.delayAfterMs>0&&await s(t.delayAfterMs)}catch(e){throw t(e,a)}}function De(e){let t=e?.durationMs,n=t===void 0?{}:{durationMs:t};return e?.pixels===void 0?e?.amount===void 0?n:{distance:Math.max(1,Math.round(300*e.amount/r)),...n}:{distance:e.pixels,...n}}function Oe(e){let{distance:t,durationMs:n}=e;if(n===void 0||n<=0)return[{distance:t,delayAfterMs:0}];let r=Math.max(1,Math.min(20,Math.ceil(n/50))),i=n/Math.max(1,r-1);return ke(Math.round(t??300),r).map((e,t)=>({distance:e,delayAfterMs:t<r-1?i:0}))}function ke(e,t){let n=Math.floor(e/t),r=e-n*t;return Array.from({length:t},(e,t)=>t<r?n+1:n)}function Ae(e,t){return[`scroll`,e,...t===void 0?[]:[String(t)]]}async function K(e,t,n){await q(e,t,n),await e([`mouse`,`down`]),await e([`mouse`,`up`])}async function q(e,t,n){await e([`mouse`,`move`,String(Math.round(t)),String(Math.round(n))])}async function je(e,t){return await he(await e(Me(t)),t?.includeRects?async t=>await Ne(e,t):void 0)}function Me(e){return[`snapshot`,...e?.interactiveOnly?[`--interactive`]:[],...e?.raw?[]:[`--compact`],...typeof e?.depth==`number`?[`--depth`,String(e.depth)]:[],...e?.scope?[`--selector`,e.scope]:[]]}async function Ne(e,t){try{return We(await e([`get`,`box`,Z(t)]))}catch(e){if(Pe(e))return;throw e}}function Pe(e){let t=e instanceof Error?e.message:String(e);return!/\bstale\b/i.test(t)&&/\bbox\b|not visible|not found|no element/i.test(t)}async function Fe(e,t){let{session:n,options:r,signal:i}=t,a=[...e,`--json`,...n?[`--session`,n]:[]];return await Ie(a,r,e=>Y(ze(e.stdout,e.stderr,a,e.exitCode),e,a),i)}async function Ie(e,t,n,r){let i=``,a=``,o=0,s=!1,c=!1,l=u({stateDir:t.stateDir});try{await Re(t);let n=await te(e,{stateDir:t.stateDir,allowFailure:!0,timeoutMs:3e4,signal:r});i=n.stdout,a=n.stderr,o=n.exitCode,s=!0}catch(n){throw await J({cliArgs:e,commandCompleted:s,exitCode:o,semanticSuccess:c,options:t,status:l}),Be(n,e)}try{let e=n({stdout:i,stderr:a,exitCode:o});return c=!0,e}finally{await J({cliArgs:e,commandCompleted:s,exitCode:o,semanticSuccess:c,options:t,status:l})}}async function J(e){let t=e.options.ownedProcessRecords;if(!(!t||!e.status.installed))try{let n=e.options.openWebSessionNames?.()??[],r=e.options.session?.trim();Le(e,n.filter(e=>e!==r).length)?t.clear({kind:`daemon`}):await l(e.status,t)}catch(e){i({level:`warn`,phase:`web_agent_browser_process_record_failed`,data:{error:e instanceof Error?e.message:String(e)}})}}function Le(e,t){return e.commandCompleted&&e.semanticSuccess&&e.cliArgs[0]===`close`&&e.exitCode===0&&t===0}async function Re(e){if(!e.openWebSessionNames)return;let t=u({stateDir:e.stateDir});if(t.installed)try{await ee(t,{openWebSessionNames:e.openWebSessionNames(),...e.ownedProcessRecords===void 0?{}:{ownedProcessRecords:e.ownedProcessRecords}})}catch(e){i({level:`warn`,phase:`web_agent_browser_provider_orphan_cleanup_failed`,data:{error:e instanceof Error?e.message:String(e)}})}}function Y(t,n,r){if(!d(t))return t;if((t.success??t.ok)===!1)throw new e(He(t.code),Ve(t),{cmd:W,args:r,hint:p(t,`hint`)??G,agentBrowserError:t.error});if(n.exitCode!==0)throw new e(`COMMAND_FAILED`,`agent-browser command failed`,o(n,{cmd:W,args:r,stdout:n.stdout.slice(0,500),stderr:n.stderr.slice(0,500),hint:p(t,`hint`)??G}));return Object.hasOwn(t,`data`)?t.data:t}function ze(t,n,r,i){try{return JSON.parse(t)}catch(a){let o=i!==0;throw new e(`COMMAND_FAILED`,o?`agent-browser command failed`:`agent-browser returned invalid JSON`,{cmd:W,args:r,...o?{exitCode:i}:{},stdout:t.slice(0,500),stderr:n.slice(0,500),hint:G},a instanceof Error?a:void 0)}}function Be(t,n){let r=ne(t);return r.code===`TOOL_MISSING`?new e(`TOOL_MISSING`,r.message,{...r.details??{},cmd:W,args:n,hint:X(r)},r):r.code===`COMMAND_FAILED`?new e(`COMMAND_FAILED`,r.message,{...r.details??{},cmd:W,args:n,hint:X(r)},r):r}function X(e){return typeof e.details?.hint==`string`?e.details.hint:G}function Ve(e){let t=e.error;if(typeof t==`string`&&t.trim())return t.trim();if(d(t)){let e=p(t,`message`)??p(t,`error`);if(e)return e}return p(e,`message`)??`agent-browser command failed`}function He(e){return typeof e==`string`&&e.length>0?e:`COMMAND_FAILED`}function Z(e){return e.startsWith(`@`)?e:`@${e}`}function Ue(){return a()===`darwin`?`Meta+a`:`Control+a`}function We(e){let t=d(e)&&d(e.box)?e.box:e;if(d(t))return Ge(t)??Ke(t)}function Ge(e){return Q(m(e,`x`),m(e,`y`),m(e,`width`),m(e,`height`))}function Ke(e){let t=m(e,`left`),n=m(e,`top`),r=m(e,`right`),i=m(e,`bottom`);return Q(t,n,$(r,t),$(i,n))}function Q(e,t,n,r){if(e!==void 0&&t!==void 0&&n!==void 0&&r!==void 0)return{x:e,y:t,width:n,height:r}}function $(e,t){return e===void 0||t===void 0?void 0:e-t}export{Te as createAgentBrowserWebProvider};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime.js";import{
|
|
1
|
+
import{r as e}from"./rolldown-runtime.js";import{$ as t,N as n,c as r,nt as i,s as a}from"./sdk-contracts.js";import"./capture.js";import{n as o}from"./snapshot-capture-annotations.js";import{C as s,D as c,E as l,S as u,T as d,_ as f,b as p,g as ee,k as m,w as te,x as h}from"./sdk-batch-runner.js";import{n as ne}from"./snapshot-diagnostics.js";import{_ as re,d as ie,u as ae,v as g}from"./sdk-device.js";import{a as oe,o as se,p as ce}from"./lease-scope.js";import{T as le,on as ue}from"./sdk-batch.js";import{n as _,t as v}from"./catalog.js";import{B as de,T as fe,i as pe,z as me}from"./registry.js";import{n as he}from"./success-text.js";import{c as y,n as ge,r as _e}from"./diagnostics.js";import{t as b}from"./command-metadata.js";import"./diagnostics2.js";import{g as x,i as ve,l as ye}from"./daemon-client-transport.js";import{t as S}from"./daemon-resolution.js";import{a as be,i as xe,n as Se,o as Ce,r as we,s as Te,t as C}from"./daemon-client-lifecycle.js";import{r as w}from"./session-paths.js";import{n as T,t as E}from"./client-metro.js";import{t as D}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,...g(e)?{serial:t}:e===`ios`?{udid:t}:{}}}function M(e,t){let n=u(e,`bundleId`),r=u(e,`package`);return{app:l(e,`app`),appPath:l(e,`appPath`),platform:d(e,`platform`),appId:n??r,bundleId:n,package:r,identifiers:A({session:t,bundleId:n,packageName:r})}}function Ee(e,t){let r=u(e,`bundleId`),i=u(e,`packageName`),a=r??i??u(e,`appId`),o=u(e,`launchTarget`)??i??r??a;if(!o)throw new n(`COMMAND_FAILED`,`Daemon response is missing "launchTarget".`,{response:e});return{appName:u(e,`appName`),appId:a,bundleId:r,packageName:i,launchTarget:o,installablePath:u(e,`installablePath`),archivePath:u(e,`archivePath`),materializationId:u(e,`materializationId`),materializationExpiresAt:u(e,`materializationExpiresAt`),identifiers:A({session:t,bundleId:r,packageName:i,appId:a})}}function De(e){return{released:e.released===!0,materializationId:l(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:s(t,`kind`),id:r,name:i,booted:typeof t.booted==`boolean`?t.booted:void 0,...ie(n)&&o?{appleOs:o}:{},identifiers:j(n,r,i),...Oe(t),...I(n,r)}}function Oe(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 ke(e){let{record:t,platform:n,id:r,name:i,target:a}=F(e,`name`),o=l(t,`device`),s=P(t),c={session:i,...j(n,r,o)};return{name:i,address:u(t,`address`),createdAt:te(t,`createdAt`),sessionStateDir:u(t,`sessionStateDir`),runnerLogPath:u(t,`runnerLogPath`),device:{platform:n,target:a,id:r,name:o,...s?{appleOs:s}:{},identifiers:c,...I(n,r,{simulatorSetPath:h(t,`ios_simulator_device_set`)})},identifiers:c}}function P(e){let t=e.appleOs;return ae(t)?t:void 0}function F(e,t){let n=ee(e);return{record:n,platform:d(n,`platform`),id:l(n,`id`),name:l(n,t),target:p(n,`target`)}}function I(e,t,n={}){if(e===`ios`)return{ios:{udid:t,...n.simulatorSetPath===void 0?{}:{simulatorSetPath:n.simulatorSetPath}}};if(!g(e))return{};let r=n.serial??t;return e===`android`?{android:{serial:r}}:e===`harmonyos`?{harmonyos:{serial:r}}:{vega:{serial:r}}}function Ae(e){if(!f(e))return;let t=e.platform,n=u(e,`metroHost`),i=typeof e.metroPort==`number`?e.metroPort:void 0,a=u(e,`bundleUrl`),o=u(e,`launchUrl`);return{platform:r(t)?t:void 0,metroHost:n,metroPort:i,bundleUrl:a,launchUrl:o}}function je(e){let t=e.platform,n=u(e,`id`),r=u(e,`device`);if(!re(t)||!n||!r)return;let i=p(e,`target`),a=g(t)?u(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`?u(e,`device_udid`)??n:n,{simulatorSetPath:h(e,`ios_simulator_device_set`),serial:a})}}const Me=[`explicit-selector`,`existing-session`,`single-booted-local`,`single-bootable-local`,`single-app-installed-local`,`preferred-local`,`single-provider-device`],Ne=[`session`,`local`,`provider`];function Pe(e){if(!f(e))return;let{reason:t,source:n,candidateCount:r,bootOccurred:i}=e;if(!(!Me.includes(t)||!Ne.includes(n)||typeof r!=`number`||!Number.isInteger(r)||r<0||typeof i!=`boolean`))return{reason:t,source:n,candidateCount:r,bootOccurred:i}}function Fe(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:u(e,`appTarget`),appBundleId:u(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 Ie=[`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,Le(e.cause));for(let n of Ie){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 Le(e){let t=i(e);return t?{cause:t}:void 0}function Re(e){let t=R(e.initialSnapshotError);return{...e.snapshot&&typeof e.snapshot==`object`?{snapshot:e.snapshot}:{},...t?{initialSnapshotError:t}:{}}}function ze(e){return Array.isArray(e)?e:[]}function Be(e){let t=oe(e);return m({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,...ce(t),sessionIsolation:e.sessionIsolation,installSource:e.installSource,retainMaterializedPaths:e.retainMaterializedPaths,materializedPathRetentionMs:e.materializedPathRetentionMs,materializationId:e.materializationId})}function z(e){return e??`default`}const B={...pe(),batch:fe(Ve)};async function Ve(e,t,r){let i=B[e];if(!i)throw Error(`Missing daemon writer for batch command: ${e}`);let a=b(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 He(e,t){let n=B[e];if(!n)throw Error(`Missing daemon writer for command: ${e}`);return await V(n,b(e),t)}async function V(e,t,n){let r=await e(n);return{...r,...t?{metadataFlags:de(t,r.options)}:{}}}async function H(e,t={}){let n=e.meta?.requestId??ge(),r=!!(e.meta?.debug||e.flags?.verbose),i=e.flags,{daemonAuthToken:a,...o}=i??{},s=i?{...e,flags:o}:e,c=Te(s,t.authToken??a),l=ue(le(s.command),s),u=await y(`daemon_startup`,async()=>await xe(c),{requestId:n,session:e.session}),d=u.info,f=await Qe(d,c,s);Xe(s.command);let p=Ue(s,f,d.token,n,r);return _e({level:`info`,phase:`daemon_request_prepare`,data:{requestId:n,command:s.command,session:s.session}}),await qe(s,u,c,async()=>Ye(Je(await y(`daemon_request`,async()=>await ve(d,p,c.transportPreference,c.paths,l,{onProgress:t.onProgress}),{requestId:n,command:e.command}),c),s,c))}function Ue(e,t,n,r,i){return{...e,positionals:t.positionals,flags:t.flags,token:n,meta:We(e,t,r,i)}}function We(e,t,n,r){let i=e.meta??{};return{...i,requestId:n,debug:r,...Ge(i,e.flags),...Ke(t)}}function Ge(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 Ke(e){return{...e.uploadedArtifactId?{uploadedArtifactId:e.uploadedArtifactId}:{},...e.clientArtifactPaths?{clientArtifactPaths:e.clientArtifactPaths}:{},...e.installSource?{installSource:e.installSource}:{}}}async function qe(e,t,r,i){let a,o=!1,s;try{a=await i()}catch(e){o=!0,s=e}let c=await we(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 Je(e,t){return e.ok||!t.ownedStateDir||!Ce(e)?e:Se(e,t.paths.baseDir)}function Ye(e,t,n){return!e.ok||!be(t,e)?e:C(e,n.ownedStateDir?n.paths.baseDir:void 0)}function Xe(e){!Ze(e)||process.stderr.isTTY!==!0||process.env.CI||process.stderr.write(e===_.reinstall?`Reinstalling...
|
|
2
2
|
`:`Installing...
|
|
3
|
-
`)}function Ze(e){return e===_.install||e===_.reinstall||e===v.installSource}async function Qe(e,t,n){let r=se(n);if(!ye(e)||!r.leaseId)return await x(n,e,new AbortController().signal);let{buildUploadLeaseHeartbeat:i,runProtectedLeaseWork:a}=await import(`./daemon-client-lease-beat.js`);return await a({heartbeat:i(e,t,n),task:t=>x(n,e,t)})}function U(e,t){return O.join(e,`metro-sessions`,`${w(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 $e(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 et(e){let n=async(t,n)=>await e(v.humanControl,t,n);return{allocate:async t=>q(await e(v.leaseAllocate,[],{...t,leaseId:void 0})),heartbeat:async t=>q(await e(v.leaseHeartbeat,[],t)),release:async t=>{let n=await e(v.leaseRelease,[],t);return{released:n.released===!0,provider:f(n.provider)?n.provider:void 0}},humanControl:{list:async e=>{let r=await n([`list`],e);if(!Array.isArray(r.holds))throw new t(`COMMAND_FAILED`,`Daemon did not return human-control holds.`);return r.holds.map(K)},put:async(e,t={},r)=>K((await n([`put`,e,JSON.stringify(t)],r)).hold),remove:async(e,t)=>(await n([`remove`,e],t)).released===!0}}}function K(e){if(!f(e)||!f(e.scope)||e.state!==`active`&&e.state!==`activating`||typeof e.createdAt!=`number`||typeof e.updatedAt!=`number`)throw new t(`COMMAND_FAILED`,`Daemon returned an invalid human-control hold.`);return{id:l(e,`id`),scope:{backend:l(e.scope,`backend`),leaseProvider:u(e.scope,`leaseProvider`),deviceKey:l(e.scope,`deviceKey`)},state:e.state,reason:u(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:l(t,`leaseId`),tenantId:l(t,`tenantId`),runId:l(t,`runId`),backend:l(t,`backend`),leaseProvider:u(t,`leaseProvider`),clientId:u(t,`clientId`),deviceKey:u(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 tt=e({createAgentDeviceClient:()=>J});function J(e={},n={}){let i=n.transport??H,o=t=>a(t.responseLevel??e.responseLevel),s=async(t,n=[],a={},o,s)=>{let c=Q(e,a),l={session:z(c.session),command:t,positionals:n,...s?{input:s}:{},flags:me(c,o),runtime:c.runtime,meta:Be(c)},u=await i(l,{authToken:c.daemonAuthToken});return u.ok||r(u.error),u.data??{}},c=async(e={})=>{let t=await s(v.sessionList,[],e);return(Array.isArray(t.sessions)?t.sessions:[]).map(ke)},d=async(e,t={})=>{let n=await He(e,t);return await s(n.command,n.positionals,n.options,n.metadataFlags,n.input)},f=(t={})=>z(Q(e,t).session);return{command:{wait:async e=>await d(`wait`,e),alert:async(e={})=>await d(`alert`,e),appState:async(e={})=>await d(`appstate`,e),back:async(e={})=>await d(`back`,e),home:async(e={})=>await d(`home`,e),orientation:async e=>await d(`orientation`,e),fold:async e=>await d(`fold`,e),appSwitcher:async(e={})=>await d(`app-switcher`,e),actionButton:async(e={})=>await d(`action-button`,e),keyboard:async(e={})=>await d(`keyboard`,e),clipboard:async e=>await d(`clipboard`,e),tvRemote:async e=>await d(`tv-remote`,e),reactNative:async e=>await d(`react-native`,e),doctor:async(e={})=>await d(`doctor`,e),prepare:async e=>await d(`prepare`,e),viewport:async e=>await d(`viewport`,e)},devices:{list:async(e={})=>{let t=await d(`devices`,e);return(Array.isArray(t.devices)?t.devices:[]).map(N)},capabilities:async(e={})=>{let t=await d(`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 d(`boot`,e),shutdown:async(e={})=>await d(`shutdown`,e)},sessions:{list:async(e={})=>await c(e),stateDir:async(t={})=>{let n=Q(e,t);return S(n.stateDir??process.env.AGENT_DEVICE_STATE_DIR).baseDir},close:async(t={})=>{let n=f(t);try{let e=await d(`close`,t);return{session:n,shutdown:L(e.shutdown),provider:Z(e.provider),savedScript:u(e,`savedScript`),identifiers:{session:n}}}finally{mt(e,t)}},saveScript:async(e={})=>{let n=await s(v.sessionSaveScript,e.path===void 0?[]:[e.path],e,{force:e.force}),r=n.actionCount;if(typeof r!=`number`||!Number.isInteger(r)||r<0)throw new t(`COMMAND_FAILED`,`Daemon returned an invalid saved-script action count.`);let i=l(n,`session`);return{session:i,savedScript:l(n,`savedScript`),actionCount:r,identifiers:{session:i}}},artifacts:async(e={})=>await d(`artifacts`,e)},apps:{install:async e=>M(await d(`install`,e),f(e)),reinstall:async e=>M(await d(`reinstall`,e),f(e)),installFromSource:async e=>Ee(await d(`install-from-source`,e),f(e)),list:async(e={})=>{let t=await d(`apps`,e);return Array.isArray(t.apps)?t.apps.filter(e=>typeof e==`string`):[]},open:async t=>{let n=f(t),r=await d(`open`,t);pt({config:e,options:t,runtime:Q(e,t).runtime,sessionReused:r.sessionReused===!0});let i=je(r),a=u(r,`appBundleId`),o=a,s=he(r);return{session:n,...s.length>0?{warnings:s}:{},sessionStateDir:u(r,`sessionStateDir`),runnerLogPath:u(r,`runnerLogPath`),requestLogPath:u(r,`requestLogPath`),eventLogPath:u(r,`eventLogPath`),appName:u(r,`appName`),appBundleId:a,appId:o,selection:Pe(r.selection),startup:Fe(r.startup),runtime:Ae(r.runtime),device:i,...Re(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=f(e),n=await d(`close`,e);return{session:t,closedApp:e.app,shutdown:L(n.shutdown),savedScript:u(n,`savedScript`),identifiers:{session:t}}},push:async e=>await d(`push`,e),triggerEvent:async e=>await d(`trigger-app-event`,e)},materializations:{release:async e=>De(await s(v.releaseMaterializedPaths,[],{...e,materializationId:e.materializationId}))},leases:et(s),metro:{prepare:async t=>{let n=await E({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 ut(e,n),n},reload:async(t={})=>await T({metroHost:t.metroHost,metroPort:t.metroPort,bundleUrl:t.bundleUrl,runtime:e.runtime??dt(e),timeoutMs:t.timeoutMs})},capture:{snapshot:async(e={})=>{let t=f(e),n=await d(`snapshot`,e);return o(e)?n:ct(n,t)},screenshot:async(e={})=>{let t=f(e),n=await d(`screenshot`,e);return o(e)?n:D(n,t)},diff:async e=>await d(`diff`,e)},interactions:{click:async e=>await d(`click`,e),press:async e=>await d(`press`,e),longPress:async e=>await d(`longpress`,e),hover:async e=>await d(`hover`,e),swipe:async e=>await d(`swipe`,e),pan:async e=>await d(`gesture`,nt(e)),drag:async e=>await d(`gesture`,rt(e)),fling:async e=>await d(`gesture`,it(e)),swipeGesture:async e=>await d(`gesture`,at(e)),focus:async e=>await d(`focus`,e),type:async e=>await d(`type`,e),fill:async e=>await d(`fill`,e),scroll:async e=>await d(`scroll`,e),pinch:async e=>await d(`gesture`,Y(e)),rotateGesture:async e=>await d(`gesture`,ot(e)),transformGesture:async e=>await d(`gesture`,st(e)),get:async e=>await d(`get`,e),is:async e=>await d(`is`,e),find:async e=>await d(`find`,e)},replay:{run:async e=>await d(`replay`,e),test:async e=>await d(`test`,e)},batch:{run:async e=>await d(`batch`,e)},observability:{perf:async e=>await d(`perf`,e),logs:async(e={})=>await d(`logs`,e),events:async(e={})=>await d(`events`,e),network:async(e={})=>await d(`network`,e),audio:async(e={})=>await d(`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 d(`record`,e),trace:async e=>await d(`trace`,e)},settings:{update:async e=>await d(`settings`,e)}}}function nt(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 rt(e){return{...e,kind:`drag`}}function it(e){let{x:t,y:n,...r}=e;return{...r,kind:`fling`,origin:{x:t,y:n}}}function at(e){return{...e,kind:`swipe`}}function Y(e){let{x:t,y:n,...r}=e;return X(t,n,`pinch`),{...r,kind:`pinch`,...t===void 0&&n===void 0?{}:{origin:{x:t,y:n}}}}function ot(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 st(e){let{x:t,y:n,dx:r,dy:i,...a}=e;return{...a,kind:`transform`,origin:{x:t,y:n},delta:{x:r,y:i}}}function X(e,n,r){if(e===void 0!=(n===void 0))throw new t(`INVALID_ARGS`,`gesture ${r} center requires both x and y`)}function ct(e,t){let n=u(e,`appBundleId`);return{nodes:ze(e.nodes),...typeof e.truncated==`boolean`?{truncated:e.truncated}:{},appName:u(e,`appName`),appBundleId:n,...lt(e),identifiers:{session:t,appId:n,appBundleId:n}}}function lt(e){let t=Z(e.visibility),n=Z(e.unchanged),r=c(e.keyboard),i=ne(e.snapshotDiagnostics);return{...r?{keyboard:r}:{},...t?{visibility:t}:{},...o(e),...n?{unchanged:n}:{},...i?{snapshotDiagnostics:i}:{},...typeof e.fallbackScreenshotPath==`string`?{fallbackScreenshotPath:e.fallbackScreenshotPath}:{},...typeof e.refsGeneration==`number`?{refsGeneration:e.refsGeneration}:{}}}function Z(e){return f(e)?e:void 0}function Q(e,t){return{...e,...t}}function $(e,t={}){let n=Q(e,t);return{stateDir:S(n.stateDir??process.env.AGENT_DEVICE_STATE_DIR).baseDir,session:z(n.session)}}function ut(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 dt(e){try{return $e($(e))}catch{return}}function ft(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 pt(e){try{let t=$(e.config,e.options),n=ft(e.runtime);if(n){W({...t,hints:n});return}e.sessionReused||G(t)}catch{}}function mt(e,t){try{G($(e,t))}catch{}}export{J as n,H as r,tt as t};
|
|
3
|
+
`)}function Ze(e){return e===_.install||e===_.reinstall||e===v.installSource}async function Qe(e,t,n){let r=se(n);if(!ye(e)||!r.leaseId)return await x(n,e,new AbortController().signal);let{buildUploadLeaseHeartbeat:i,runProtectedLeaseWork:a}=await import(`./daemon-client-lease-beat.js`);return await a({heartbeat:i(e,t,n),task:t=>x(n,e,t)})}function U(e,t){return O.join(e,`metro-sessions`,`${w(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 $e(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 et(e){let t=async(t,n)=>await e(v.humanControl,t,n);return{allocate:async t=>q(await e(v.leaseAllocate,[],{...t,leaseId:void 0})),heartbeat:async t=>q(await e(v.leaseHeartbeat,[],t)),release:async t=>{let n=await e(v.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:l(e,`id`),scope:{backend:l(e.scope,`backend`),leaseProvider:u(e.scope,`leaseProvider`),deviceKey:l(e.scope,`deviceKey`)},state:e.state,reason:u(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:l(t,`leaseId`),tenantId:l(t,`tenantId`),runId:l(t,`runId`),backend:l(t,`backend`),leaseProvider:u(t,`leaseProvider`),clientId:u(t,`clientId`),deviceKey:u(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 tt=e({createAgentDeviceClient:()=>J});function J(e={},r={}){let i=r.transport??H,o=t=>a(t.responseLevel??e.responseLevel),s=async(n,r=[],a={},o,s)=>{let c=Q(e,a),l={session:z(c.session),command:n,positionals:r,...s?{input:s}:{},flags:me(c,o),runtime:c.runtime,meta:Be(c)},u=await i(l,{authToken:c.daemonAuthToken});return u.ok||t(u.error),u.data??{}},c=async(e={})=>{let t=await s(v.sessionList,[],e);return(Array.isArray(t.sessions)?t.sessions:[]).map(ke)},d=async(e,t={})=>{let n=await He(e,t);return await s(n.command,n.positionals,n.options,n.metadataFlags,n.input)},f=(t={})=>z(Q(e,t).session);return{command:{wait:async e=>await d(`wait`,e),alert:async(e={})=>await d(`alert`,e),appState:async(e={})=>await d(`appstate`,e),back:async(e={})=>await d(`back`,e),home:async(e={})=>await d(`home`,e),orientation:async e=>await d(`orientation`,e),fold:async e=>await d(`fold`,e),appSwitcher:async(e={})=>await d(`app-switcher`,e),actionButton:async(e={})=>await d(`action-button`,e),keyboard:async(e={})=>await d(`keyboard`,e),clipboard:async e=>await d(`clipboard`,e),tvRemote:async e=>await d(`tv-remote`,e),reactNative:async e=>await d(`react-native`,e),doctor:async(e={})=>await d(`doctor`,e),prepare:async e=>await d(`prepare`,e),viewport:async e=>await d(`viewport`,e)},devices:{list:async(e={})=>{let t=await d(`devices`,e);return(Array.isArray(t.devices)?t.devices:[]).map(N)},capabilities:async(e={})=>{let t=await d(`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 d(`boot`,e),shutdown:async(e={})=>await d(`shutdown`,e)},sessions:{list:async(e={})=>await c(e),stateDir:async(t={})=>{let n=Q(e,t);return S(n.stateDir??process.env.AGENT_DEVICE_STATE_DIR).baseDir},close:async(t={})=>{let n=f(t);try{let e=await d(`close`,t);return{session:n,shutdown:L(e.shutdown),provider:Z(e.provider),savedScript:u(e,`savedScript`),identifiers:{session:n}}}finally{mt(e,t)}},saveScript:async(e={})=>{let t=await s(v.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=l(t,`session`);return{session:i,savedScript:l(t,`savedScript`),actionCount:r,identifiers:{session:i}}},artifacts:async(e={})=>await d(`artifacts`,e)},apps:{install:async e=>M(await d(`install`,e),f(e)),reinstall:async e=>M(await d(`reinstall`,e),f(e)),installFromSource:async e=>Ee(await d(`install-from-source`,e),f(e)),list:async(e={})=>{let t=await d(`apps`,e);return Array.isArray(t.apps)?t.apps.filter(e=>typeof e==`string`):[]},open:async t=>{let n=f(t),r=await d(`open`,t);pt({config:e,options:t,runtime:Q(e,t).runtime,sessionReused:r.sessionReused===!0});let i=je(r),a=u(r,`appBundleId`),o=a,s=he(r);return{session:n,...s.length>0?{warnings:s}:{},sessionStateDir:u(r,`sessionStateDir`),runnerLogPath:u(r,`runnerLogPath`),requestLogPath:u(r,`requestLogPath`),eventLogPath:u(r,`eventLogPath`),appName:u(r,`appName`),appBundleId:a,appId:o,selection:Pe(r.selection),startup:Fe(r.startup),runtime:Ae(r.runtime),device:i,...Re(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=f(e),n=await d(`close`,e);return{session:t,closedApp:e.app,shutdown:L(n.shutdown),savedScript:u(n,`savedScript`),identifiers:{session:t}}},push:async e=>await d(`push`,e),triggerEvent:async e=>await d(`trigger-app-event`,e)},materializations:{release:async e=>De(await s(v.releaseMaterializedPaths,[],{...e,materializationId:e.materializationId}))},leases:et(s),metro:{prepare:async t=>{let n=await E({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 ut(e,n),n},reload:async(t={})=>await T({metroHost:t.metroHost,metroPort:t.metroPort,bundleUrl:t.bundleUrl,runtime:e.runtime??dt(e),timeoutMs:t.timeoutMs})},capture:{snapshot:async(e={})=>{let t=f(e),n=await d(`snapshot`,e);return o(e)?n:ct(n,t)},screenshot:async(e={})=>{let t=f(e),n=await d(`screenshot`,e);return o(e)?n:D(n,t)},diff:async e=>await d(`diff`,e)},interactions:{click:async e=>await d(`click`,e),press:async e=>await d(`press`,e),longPress:async e=>await d(`longpress`,e),hover:async e=>await d(`hover`,e),swipe:async e=>await d(`swipe`,e),pan:async e=>await d(`gesture`,nt(e)),drag:async e=>await d(`gesture`,rt(e)),fling:async e=>await d(`gesture`,it(e)),swipeGesture:async e=>await d(`gesture`,at(e)),focus:async e=>await d(`focus`,e),type:async e=>await d(`type`,e),fill:async e=>await d(`fill`,e),scroll:async e=>await d(`scroll`,e),pinch:async e=>await d(`gesture`,Y(e)),rotateGesture:async e=>await d(`gesture`,ot(e)),transformGesture:async e=>await d(`gesture`,st(e)),get:async e=>await d(`get`,e),is:async e=>await d(`is`,e),find:async e=>await d(`find`,e)},replay:{run:async e=>await d(`replay`,e),test:async e=>await d(`test`,e)},batch:{run:async e=>await d(`batch`,e)},observability:{perf:async e=>await d(`perf`,e),logs:async(e={})=>await d(`logs`,e),events:async(e={})=>await d(`events`,e),network:async(e={})=>await d(`network`,e),audio:async(e={})=>await d(`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 d(`record`,e),trace:async e=>await d(`trace`,e)},settings:{update:async e=>await d(`settings`,e)}}}function nt(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 rt(e){return{...e,kind:`drag`}}function it(e){let{x:t,y:n,...r}=e;return{...r,kind:`fling`,origin:{x:t,y:n}}}function at(e){return{...e,kind:`swipe`}}function Y(e){let{x:t,y:n,...r}=e;return X(t,n,`pinch`),{...r,kind:`pinch`,...t===void 0&&n===void 0?{}:{origin:{x:t,y:n}}}}function ot(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 st(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 ct(e,t){let n=u(e,`appBundleId`);return{nodes:ze(e.nodes),...typeof e.truncated==`boolean`?{truncated:e.truncated}:{},appName:u(e,`appName`),appBundleId:n,...lt(e),identifiers:{session:t,appId:n,appBundleId:n}}}function lt(e){let t=Z(e.visibility),n=Z(e.unchanged),r=c(e.keyboard),i=ne(e.snapshotDiagnostics);return{...r?{keyboard:r}:{},...t?{visibility:t}:{},...o(e),...n?{unchanged:n}:{},...i?{snapshotDiagnostics:i}:{},...typeof e.fallbackScreenshotPath==`string`?{fallbackScreenshotPath:e.fallbackScreenshotPath}:{},...typeof e.refsGeneration==`number`?{refsGeneration:e.refsGeneration}:{}}}function Z(e){return f(e)?e:void 0}function Q(e,t){return{...e,...t}}function $(e,t={}){let n=Q(e,t);return{stateDir:S(n.stateDir??process.env.AGENT_DEVICE_STATE_DIR).baseDir,session:z(n.session)}}function ut(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 dt(e){try{return $e($(e))}catch{return}}function ft(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 pt(e){try{let t=$(e.config,e.options),n=ft(e.runtime);if(n){W({...t,hints:n});return}e.sessionReused||G(t)}catch{}}function mt(e,t){try{G($(e,t))}catch{}}export{J as n,H as r,tt as t};
|
package/dist/src/ai-sdk.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{N as e}from"./sdk-contracts.js";import{n as t}from"./agent-device-client.js";import{
|
|
1
|
+
import{N as e}from"./sdk-contracts.js";import{n as t}from"./agent-device-client.js";import{x 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{N as e}from"./sdk-contracts.js";import{
|
|
1
|
+
import{N as e}from"./sdk-contracts.js";import{rn as t}from"./sdk-batch.js";import{i as n,n as r,r as i}from"./interactor-operation-binding.js";function a(e){return Object.freeze({captureScreenshot:e.capture})}function o(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 s(e){return o(e.signal,r(e))}function c(e){return o(e.signal,i({...e,operation:`screenshot`}))}function l(e,t){return t.signal===void 0?e:AbortSignal.any([e,t.signal])}function ee(e){return Object.freeze({captureSnapshot:e.capture,captureSnapshotWithCustomActions:e.customActions,captureSnapshotWithoutActiveApp:e.withoutActiveApp})}function u(t){let n=async n=>{let r=l(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 te(e){return _(e.signal,r(e))}function ne(e){return _(e.signal,i({...e,operation:`focus`}))}function re(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 v(e,n,r){let i=async e=>{let i=await y(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 y(n,r,e);if(typeof i.gestureViewport!=`function`)throw t(`Runtime owner advertised gestureViewport without an interactor implementation`);return await i.gestureViewport()}}:{}})}async function y(e,t,n){return e.throwIfAborted(),await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})}function b(e){return v(e.facts,e.signal,r(e))}function x(e){return v(e.facts,e.signal,i({...e,operation:`gesture`}))}function S(e){return Object.freeze({scrollDirection:e.scroll})}function C(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 w(e){return C(e.signal,r(e))}function T(e){return C(e.signal,i({...e,operation:`scroll`}))}function E(e){return Object.freeze({typeText:e.type})}function D(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 O(e){return D(e.signal,r(e))}function k(e){return D(e.signal,i({...e,operation:`type`}))}function A(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 j(e){return Object.freeze({readTextAtPoint:e.readTextAtPoint})}function M(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 A(await i.readTextAtPoint(n.point,{appBundleId:n.options?.appBundleId,surface:n.options?.surface,signal:r}))}})}function N(e){return Object.freeze({back:e.back})}function P(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 F(e){return Object.freeze({setOrientation:e.orientation})}function I(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 L(e){return Object.freeze({tvRemote:e.tvRemote})}const R=`tv-remote`;function ie(e,t){return Object.freeze({tvRemote:async n=>{e.throwIfAborted();let r=await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e}),{requireInteractorMethod:i}=await import(`./interactor-operation-binding.js`).then(e=>e.t);await i(r.tvRemote,R).call(r,n.button,n.durationMs)}})}function z(e){let t=t=>t??e.unsupported;return Object.freeze({keyboardStatus:t(e.status),keyboardDismiss:t(e.dismiss),keyboardEnter:t(e.enter)})}async function B(e,t,n){return e.throwIfAborted(),await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})}const V={keyboardStatus:`keyboard status`,keyboardDismiss:`keyboard dismiss`,keyboardEnter:`keyboard enter`};function H(e,t,n){let r=async r=>{let i=await B(t,n,r),{requireInteractorMethod:a}=await import(`./interactor-operation-binding.js`).then(e=>e.t);return await a(i[e],V[e]).call(i)};return Object.freeze({[e]:r})}function U(e){let t=t=>t??e.unsupported;return Object.freeze({readClipboard:t(e.read),writeClipboard:t(e.write)})}const W={readClipboard:`clipboard read`,writeClipboard:`clipboard write`};async function G(e,t,n){return e.throwIfAborted(),await t({...n.execution,appBundleId:n.options?.appBundleId,signal:e})}async function K(e,t){let{requireInteractorMethod:n}=await import(`./interactor-operation-binding.js`).then(e=>e.t);return n(e[t],W[t])}function q(e,t){return Object.freeze({readClipboard:async n=>{let r=await G(e,t,n);return await(await K(r,`readClipboard`)).call(r)}})}function J(e,t){return Object.freeze({writeClipboard:async n=>{let r=await G(e,t,n);await(await K(r,`writeClipboard`)).call(r,n.text)}})}const Y=[`home`,`appSwitcher`,`actionButton`],X={home:`home`,appSwitcher:`app-switcher`,actionButton:`action-button`};function ae(e){let t={};for(let n of Y)t[n]=e[n]??e.unsupported;return Object.freeze(t)}function oe(e,t,r){let i=async i=>{t.throwIfAborted();let a=await r({...i.execution,appBundleId:i.options?.appBundleId,signal:t});await n(a[e],X[e]).call(a)};return Object.freeze({[e]:i})}function se(e){return Object.freeze({triggerAppEvent:e.triggerAppEvent})}function ce(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 Z(e){return Object.freeze({setSetting:e.setSetting,readSetting:e.readSetting})}async function Q(e,t,n){return e.throwIfAborted(),await t({...n.execution,appBundleId:n.appBundleId,signal:e})}function le(e,t){return Object.freeze({setSetting:async n=>await(await Q(e,t,n)).setSetting(n.setting,n.state,n.appBundleId,n.options)})}function ue(e,t){return Object.freeze({readSetting:async n=>{let r=await Q(e,t,n),{requireInteractorMethod:i}=await import(`./interactor-operation-binding.js`).then(e=>e.t);return await i(r.readSetting,`settings read`).call(r,n.setting)}})}function de(e){return Object.freeze({readAlert:e.read,awaitAlert:e.wait,acceptAlert:e.accept,dismissAlert:e.dismiss})}async function fe(e,t,n){return e.throwIfAborted(),await t({...n.execution,appBundleId:n.appBundleId,signal:e})}function pe(e){return{...e.timeoutMs===void 0?{}:{timeoutMs:e.timeoutMs},...e.appBundleId===void 0?{}:{appBundleId:e.appBundleId},...e.surface===void 0?{}:{surface:e.surface}}}const $={readAlert:`alert get`,awaitAlert:`alert wait`,acceptAlert:`alert accept`,dismissAlert:`alert dismiss`};function me(e,t,n){return Object.freeze({[e]:async r=>{let i=await fe(t,n,r),{requireInteractorMethod:a}=await import(`./interactor-operation-binding.js`).then(e=>e.t);return await a(i[e],$[e]).call(i,pe(r))}})}export{E as A,h as B,F as C,j as D,M as E,x as F,ee as G,d as H,re as I,a as J,s as K,te as L,T as M,S as N,O,b as P,ne as R,I as S,P as T,f as U,m as V,l as W,H as _,le as a,ie as b,ce as c,ae as d,W as f,V as g,U as h,ue as i,w as j,k,X as l,J as m,de as n,Z as o,q as p,c as q,me as r,se as s,$ as t,oe as u,z as v,N as w,L as x,R as y,g as z};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{y as e}from"./sdk-contracts.js";import{
|
|
1
|
+
import{y as e}from"./sdk-contracts.js";import{Lr as t,jr as n,qr 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,t,r){return!I(e.rect)||n(e)||D(e,t)?!1:M(e,p)||O(e,t,r)}function D(e,t){if(!M(e,m))return!1;let r=I(e.rect);if(!r)return!1;let i=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0,o=new Set;for(;i&&!o.has(i.index);){if(n(i)){let e=I(i.rect);return!!(e&&a(r,e))}o.add(i.index),i=typeof i.parentIndex==`number`?t.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,t){return t.isAdditionalOverlayNode?.(e)===!0&&I(e.rect)!==null&&!n(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=>t(e??``)).join(` `)}function P(e,t,n){return F(e,t,n)||F(t,e,n)}function F(e,t,n){let r=typeof t.parentIndex==`number`?n.get(t.parentIndex):void 0,i=new Set;for(;r&&!i.has(r.index);){if(r.index===e.index)return!0;i.add(r.index),r=typeof r.parentIndex==`number`?n.get(r.parentIndex):void 0}return!1}function I(e){let t=i(e);return t&&t.width>0&&t.height>0?t:null}function L(e){return Array.from(new Set([...e??[],`covered`]))}const R=new Set([`com.google.android.inputmethod.latin`,`com.samsung.android.honeyboard`,`com.touchtype.swiftkey`,`com.microsoft.swiftkey`]);function z(e){let t=J(e.packageName),n=(e.resourceId??``).toLowerCase(),r=J(e.activeInputMethodPackage);if(t&&r&&t===r)return{inputMethodOwned:!0,source:`active-input-method`};if(r&&n.startsWith(`${r}:id/`))return{inputMethodOwned:!0,source:`active-input-method-resource`};if(t&&R.has(t))return{inputMethodOwned:!0,source:`known-ime-package`};for(let e of R)if(n.startsWith(`${e}:id/`))return{inputMethodOwned:!0,source:`known-ime-resource`};return{inputMethodOwned:!1,source:`app`}}function B(e,t,n){return z({packageName:e,resourceId:t,activeInputMethodPackage:n}).inputMethodOwned}function V(e){return z(e).inputMethodOwned}function H(e){return V({packageName:e.bundleId,resourceId:e.identifier})}function U(e){let t=J(e);return!!(t&&R.has(t))}function W(e){let t=(e??``).toLowerCase();for(let e of R)if(t.startsWith(`${e}:id/`))return!0;return!1}function G(e,t,n){return!e&&!t?`unknown`:B(e,t,n)?`ime`:`app`}function K(e){for(let t of[/\bmCurMethodId=([^\s]+)/i,/\bmCurId=([^\s]+)/i,/\bmCurrentInputMethodId=([^\s]+)/i,/\bcurMethodId=([^\s]+)/i]){let n=q(e.match(t)?.[1]);if(n)return n}}function q(e){let t=(e??``).trim();if(t)return J((t.split(`/`)[0]??``).match(/[a-zA-Z0-9_.]+/)?.[0])}function J(e){return(e??``).trim().toLowerCase()||void 0}export{W as a,_ as c,d,u as f,U as i,y as l,f as m,H as n,K as o,l as p,V as r,g as s,G as t,c as u};
|
package/dist/src/android.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime.js";import{c as t}from"./diagnostics.js";import"./diagnostics2.js";import{f as n}from"./adb-executor.js";import{A as r,C as i,D as a,E as o,M as s,N as c,O as l,
|
|
1
|
+
import{r as e}from"./rolldown-runtime.js";import{c as t}from"./diagnostics.js";import"./diagnostics2.js";import{f as n}from"./adb-executor.js";import{A as r,C as i,D as a,E as o,M as s,N as c,O as l,P as u,S as d,T as f,_ as p,a as m,c as h,d as g,h as _,i as v,j as y,k as b,l as x,o as S,p as C,s as w,u as T,w as E,x as D}from"./mechanics.js";import{a as O,i as k,n as A}from"./app-lifecycle.js";import"./platform-runtime-android-adb-host.js";import{n as j}from"./scoped-provider.js";import{t as M}from"./snapshot-state.js";var N=e({createAndroidInteractor:()=>F});function P(e){return e?`daemon-session`:`command`}function F(e,N,F){let I=P(F?.appBundleId),L=t=>({...t===void 0?{}:{timeoutMs:t},captureNodes:async()=>{let t=await x(e,{includeHiddenContentHints:!1});return M(T(t),void 0).nodes}}),R={open:(t,n)=>k(e,t,{activity:n?.activity,appBundleId:n?.appBundleId,launchArgs:n?.launchArgs,url:n?.url}),openDevice:()=>O(e),close:t=>A(e,t),tap:(t,n)=>l(e,t,n),doubleTap:(t,n)=>E(e,t,n),longPress:(t,n,r)=>a(e,t,n,r),focus:(t,n)=>f(e,t,n),type:(t,n)=>m(e,t,n),fill:(t,n,r,i)=>v(e,t,n,r,i,{helperSessionScope:I}),scroll:(t,n)=>y(e,t,{...n,helperSessionScope:I}),performGesture:t=>c(e,t),gestureViewport:()=>u(e,{helperSessionScope:I}),screenshot:(t,n)=>S(e,t,n),readTextAtPoint:async(t,n)=>{let{readAndroidTextAtPoint:r}=await import(`./mechanics.js`).then(e=>e.r);return await r(e,t.x,t.y,{helperSessionScope:P(n?.appBundleId)})??void 0},snapshot:async n=>{let r=n??{},i=await t(`snapshot_capture`,async()=>await x(e,{appBundleId:r.appBundleId,signal:r.signal??F?.signal,interactiveOnly:r.interactiveOnly,depth:r.depth,scope:r.scope,raw:r.raw,includeHiddenContentHints:r.includeHiddenContentHints,helperSessionScope:P(r.appBundleId),transient:r.transient}),{backend:`android`});return T(i)},back:t=>i(e),home:()=>o(e),setOrientation:t=>s(e,t),appSwitcher:()=>d(e),tvRemote:(t,n)=>r(e,t,n),keyboardStatus:async()=>({kind:`ime-probe`,...await C(e)}),keyboardDismiss:async()=>({kind:`ime-probe`,...await g(e)}),keyboardEnter:async()=>(await b(e),{kind:`android-acknowledged`}),readClipboard:()=>_(e),writeClipboard:t=>p(e,t),setSetting:(t,n,r,i)=>h(e,t,n,r,i),readSetting:t=>w(e,t),readAlert:async()=>await D(e,`get`,L()),awaitAlert:async t=>await D(e,`wait`,L(t?.timeoutMs)),acceptAlert:async()=>await D(e,`accept`,L()),dismissAlert:async()=>await D(e,`dismiss`,L())};return N?j(R,t=>n(N,{serial:e.id},t)):R}export{F as n,N as t};
|