agent-device 0.21.3 → 0.21.5
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.3.apk → agent-device-android-ime-helper-0.21.5.apk} +0 -0
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.5.apk.sha256 +1 -0
- package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.3.manifest.json → agent-device-android-ime-helper-0.21.5.manifest.json} +4 -4
- package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.3.apk → agent-device-android-snapshot-helper-0.21.5.apk} +0 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.5.apk.sha256 +1 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.5.manifest.json +16 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +39 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSystemSurfaceHostPolicy.swift +9 -1
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+AXSnapshotFallback.swift +2 -1
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Alert.swift +10 -1
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +26 -124
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandJournal.swift +46 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Lifecycle.swift +36 -4
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+MainThreadWork.swift +229 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +15 -0
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Snapshot.swift +4 -40
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCapturePlan.swift +6 -40
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Transport.swift +30 -9
- package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +22 -6
- package/dist/src/adapter.js +1 -1
- package/dist/src/adb-executor.js +2 -2
- package/dist/src/adb-failure.js +1 -1
- package/dist/src/agent-browser-process-record.js +1 -1
- package/dist/src/agent-device-client.js +2 -2
- package/dist/src/api.js +3 -11
- package/dist/src/app-launch.js +1 -1
- package/dist/src/app-lifecycle.js +1 -1
- package/dist/src/app-log-reconnect.js +1 -1
- package/dist/src/app-log-runtime2.js +1 -1
- package/dist/src/archive.js +2 -2
- package/dist/src/cli-help.js +2 -2
- package/dist/src/cli.js +4 -4
- package/dist/src/client-metro-companion.js +1 -1
- package/dist/src/client-metro.js +1 -1
- package/dist/src/client-types.d.ts +69 -4
- package/dist/src/code-signature-cache.js +1 -1
- package/dist/src/command-tools.js +2 -2
- package/dist/src/command.js +1 -1
- package/dist/src/connection-runtime.js +1 -1
- package/dist/src/contracts.js +1 -1
- package/dist/src/daemon-client-lifecycle.js +1 -1
- package/dist/src/daemon-shutdown-report.js +1 -1
- package/dist/src/device-claim-rule.js +1 -1
- package/dist/src/device-input-state.d.ts +10 -8
- 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/error.js +2 -2
- package/dist/src/exec.js +1 -1
- package/dist/src/file.js +1 -1
- package/dist/src/find.js +1 -1
- package/dist/src/gesture-runtime.js +1 -1
- package/dist/src/helper.js +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/install-source-network-transport.js +1 -1
- package/dist/src/interaction2.js +1 -1
- package/dist/src/interactor.js +4 -4
- 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-client.js +121 -7
- package/dist/src/ios-snapshot-adapter.js +1 -1
- package/dist/src/ios-system-surface.js +1 -1
- package/dist/src/limrun-delta-sync-omitted.js +1 -0
- package/dist/src/limrun.d.ts +0 -1598
- package/dist/src/location-coordinates.js +1 -1
- package/dist/src/mechanics.js +16 -16
- package/dist/src/output-common.js +2 -0
- package/dist/src/owner-identity.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/platform-runtime-android-adb-host.js +1 -1
- package/dist/src/platform-runtime-app-log-android-transport.js +1 -1
- package/dist/src/platform-runtime-app-log-process.js +1 -1
- package/dist/src/platform-runtime-host.js +1 -1
- package/dist/src/platform-runtime-operation-host.js +2 -2
- package/dist/src/platform-runtime-screen-recording-android-host.js +1 -1
- package/dist/src/platform-runtime-screen-recording-finalizer-host.js +1 -1
- package/dist/src/platform-runtime-screen-recording-output-host.js +1 -1
- package/dist/src/platform-runtime-screen-recording-process-host.js +1 -1
- package/dist/src/process.js +1 -1
- package/dist/src/proxy.js +1 -1
- package/dist/src/quality-warnings.js +1 -1
- package/dist/src/react-native.js +1 -1
- package/dist/src/record-runtime.js +1 -1
- package/dist/src/recording-stop-observation.js +1 -0
- package/dist/src/registry.js +35 -36
- package/dist/src/replay-divergence.js +1 -1
- package/dist/src/reporting.js +11 -9
- package/dist/src/result-serialization.js +1 -1
- package/dist/src/runner-cache-metadata.js +1 -1
- package/dist/src/runner-client.js +1 -1
- package/dist/src/runner-disposal.js +1 -1
- package/dist/src/runner-operations-facade.js +1 -1
- package/dist/src/runner.js +1 -1
- package/dist/src/runtime.js +3 -3
- package/dist/src/runtime10.js +1 -1
- package/dist/src/runtime2.js +4 -4
- 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/runtime9.js +1 -1
- package/dist/src/screen-recording-completion.js +1 -1
- package/dist/src/screen-recording-resource-recovery.js +1 -1
- package/dist/src/screenshot-result.js +1 -1
- package/dist/src/sdk-contracts.js +2 -2
- package/dist/src/sdk-selectors.d.ts +36 -24
- package/dist/src/selector-runtime.js +1 -1
- package/dist/src/semantic-index.js +1 -1
- package/dist/src/session-observation.js +1 -1
- package/dist/src/session-snapshot.js +1 -1
- package/dist/src/session-store.js +2 -2
- package/dist/src/session2.js +5 -5
- package/dist/src/snapshot-process.js +1 -1
- package/dist/src/snapshot-runtime.js +1 -1
- package/dist/src/snapshot.js +1 -1
- package/dist/src/snapshot4.js +1 -1
- package/dist/src/stop-sequence.js +1 -0
- package/dist/src/success-text.js +1 -1
- package/dist/src/text-entry-focus.js +1 -0
- package/dist/src/tool-provider.js +1 -1
- package/dist/src/tool-provider2.js +1 -1
- package/dist/src/tool-provider3.js +1 -1
- package/dist/src/type-text-runtime.js +1 -1
- package/dist/src/video.js +2 -2
- package/dist/src/yauzl.js +1 -0
- package/package.json +2 -2
- package/server.json +2 -2
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.3.apk.sha256 +0 -1
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.3.apk.sha256 +0 -1
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.3.manifest.json +0 -17
- package/dist/src/audio-probe-support.js +0 -1
- package/dist/src/screen-recording-live-handle.js +0 -1
package/dist/src/runtime5.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{N as e}from"./sdk-contracts.js";import{l as t}from"./sdk-device.js";import{n,t as r}from"./simulator-state.js";const i=15e3;function a(e){return Object.freeze({canShutdownTarget:o,shutdownTarget:async(t,n)=>await s(e.appleTools,t,n)})}function o(e){return t(e)&&e.appleOs!==`watchos`&&e.kind===`simulator`}async function s(t,r,a){a.throwIfAborted();try{let e=await t.run({tool:`simctl`,args:n(r,[`shutdown`,r.id]),allowFailure:!0,timeoutMs:i},a);a.throwIfAborted();let o=l(e);return o.success?o:await c(t,r,a)===`Shutdown`?{...o,success:!0,exitCode:0}:o}catch(t){a.throwIfAborted();let n=e(t);return{success:!1,exitCode:-1,stdout:``,stderr:n.message,error:n}}}async function c(e,t,n){try{return await r(e,t,n,i)}catch{return n.throwIfAborted(),null}}function l(e){let t=e.exitCode??-1;return{success:t===0,exitCode:t,stdout:e.stdout,stderr:e.stderr}}export{a as createAppleShutdownRuntime};
|
package/dist/src/runtime6.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{C as e}from"./sdk-contracts.js";import{w as t}from"./sdk-device.js";import{Gt as n,Zt as r}from"./sdk-batch.js";import{n as i,t as a}from"./application-lifecycle-runtime.js";import{i as o,t as s}from"./touch-runtime.js";import{A as c,D as l,G as u,H as d,I as f,L as p,N as ee,O as te,P as m,R as h,T as g,U as ne,a as re,b as ie,d as ae,g as oe,i as se,j as ce,m as le,s as ue,t as de,v as fe,w as pe,x as me,z as he}from"./alert-runtime.js";import{n as ge}from"./audio-probe-runtime.js";import{n as _e}from"./perf-runtime.js";import{a as _,n as v}from"./durable-resource.js";import{n as ve}from"./async-lifecycle.js";import{i as ye,r as be}from"./src7.js";import{t as xe}from"./screen-recording-live-handle.js";import{t as y}from"./screen-recording-completion.js";import{t as b}from"./screen-recording-options.js";import{n as x}from"./screen-recording-runtime.js";import{i as S}from"./gesture-admission.js";import{t as C}from"./interactor-operation-catalog.js";import{i as w,n as T}from"./perf-runtime-operation-builder.js";import{t as E}from"./app-log-runtime.js";import{n as D,t as O}from"./application-lifecycle-interaction.js";import{randomUUID as k}from"node:crypto";import{setTimeout as A}from"node:timers/promises";const j=Object.freeze({resourceKind:E,version:1,encode:e=>({...e}),decode:e=>e.transport!==`harmony-hilog`||!N(e.outputPath)||!N(e.pidPath)?{status:`invalid`,message:`Invalid HarmonyOS app-log descriptor`}:{status:`decoded`,descriptor:Object.freeze({transport:`harmony-hilog`,outputPath:e.outputPath,pidPath:e.pidPath})}});function M(e){return v({resourceKind:E,sessionId:e.sessionId,device:{id:e.device.id,family:`harmonyos`,kind:e.device.kind,...e.device.target===void 0?{}:{target:e.device.target}},owner:e.owner,fence:e.fence,lifecycle:`open`,descriptor:_(j,e.descriptor)})}function N(e){return typeof e==`string`&&e.trim().length>0}function Se(e){return be(e,{family:`harmonyos`,backend:`harmonyos`,label:`HarmonyOS`,codec:j,startUnavailableHint:`The selected HarmonyOS transport cannot start a background hilog stream.`,cleanupFailureMessage:`HarmonyOS app-log cleanup did not settle every owned resource`,doctor:async(e,t)=>({backend:`harmonyos`,checks:{},notes:t?[]:[`No app bundle is tracked in this session. Run open <app> first for app-scoped logs.`]}),process:async({host:e,device:t,input:n,signal:r})=>{let i=await Ce(e,r);return{resolvePid:async r=>await ye(e,{executable:i,args:[`-t`,t.id,`shell`,`pidof`,n.appBundleId],allowFailure:!0,timeoutMs:5e3},r),command:e=>({kind:`host`,request:{executable:i,args:[`-t`,t.id,`shell`,`hilog`,`-P`,e],allowFailure:!0}})}},descriptor:({artifacts:e})=>({transport:`harmony-hilog`,...e}),envelope:({input:e,device:t,owner:n,descriptor:r})=>M({sessionId:e.sessionId,device:t,owner:n,fence:e.fence,descriptor:r})})}async function Ce(t,n){n.throwIfAborted(),await P(async()=>await t.toolchains.prepare(`harmonyos`),n),n.throwIfAborted();let r=await P(async()=>await t.commands.which(`hdc`),n);if(n.throwIfAborted(),!r)throw new e(`TOOL_MISSING`,`hdc not found in PATH`,{hint:`Install HarmonyOS Command Line Tools, then add its sdk/default/openharmony/toolchains directory to PATH.`});return r}async function P(e,t){try{return await e()}catch(e){throw t.throwIfAborted(),e}}function we(e){let{resolveHost:t,device:n}=e,r={available:!1,reason:`Dropped-frame sampling is currently available only on Android app sessions and connected iOS device app sessions.`};return Object.freeze({perfFrames:async()=>({metric:r,sampling:r}),perfMemorySample:async({appId:e})=>({metric:e?await w(t().sampleMemory(n,e)):T(`HarmonyOS`,`bundle`),sampling:{method:`hdc-shell-proc-status`,description:`Resident memory snapshot from HarmonyOS /proc/<pid>/status. Values are reported in kilobytes.`,unit:`kB`,topConsumerLimit:1}}),perfMemorySnapshot:async({kind:e})=>({artifact:{available:!1,kind:e??`memgraph`,reason:`Memory snapshot artifacts are not supported on harmonyos.`,hint:`Use perf memory sample where supported, or run the snapshot against Android, iOS simulator, or macOS.`,support:{platform:`harmonyos`,defaultKind:`memgraph`,androidHprof:!1,memgraph:!1,heapprofd:!1}},sampling:{method:`unsupported`,description:`HarmonyOS memory snapshot capture is not available through HDC.`,artifactOnly:!0}})})}const F=Object.freeze({resourceKind:x,version:1,encode:e=>({...e}),decode:e=>e.backend===`harmony-screen-recorder`&&typeof e.fileName==`string`&&De(e.fileName)&&e.remotePath===`/data/local/tmp/${e.fileName}`?{status:`decoded`,descriptor:Object.freeze({backend:`harmony-screen-recorder`,fileName:e.fileName,remotePath:e.remotePath})}:{status:`invalid`,message:`Invalid HarmonyOS screen-recording descriptor`}});function Te(e){let{device:n,owner:r,input:i,descriptor:a}=e;return v({resourceKind:x,sessionId:i.sessionId,device:t(n),owner:r,fence:i.fence,lifecycle:`open`,descriptor:_(F,a)})}function Ee(e){return F.decode(e).status===`decoded`?{status:`cleanup-pending`,reason:`manual-recovery-required`,message:`HarmonyOS recorder ownership cannot be proven after daemon restart; no recorder was stopped.`}:{status:`cleanup-pending`,reason:`manual-recovery-required`}}function De(e){return/^agent-device-recording-[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}\.mp4$/i.test(e)}function Oe(e){return e.kind===`device`?Object.freeze({available:!0}):Object.freeze({available:!1,reason:`unsupported-device-kind`,hint:`HarmonyOS recording is supported on physical devices only.`})}function ke(e){let{host:t,device:n,owner:r,signal:i}=e;return Object.freeze({screenRecordingStart:async e=>await Ae({host:t,device:n,owner:r,input:e,signal:i}),screenRecordingReattach:async()=>({status:`unreattachable`,reason:`transport-not-reattachable`,message:`HarmonyOS recordings cannot be reattached after daemon restart.`}),screenRecordingCleanup:async e=>Ee(e.envelope.descriptor.body)})}async function Ae(t){let{host:n,device:r,owner:i,input:a,signal:o}=t;if(a.scope===`app`)throw new e(`INVALID_ARGS`,`HarmonyOS recording captures the whole physical-device screen; use --scope device or --scope system`);b(a,{scopes:[`device`,`system`],fps:!1,exportQuality:!1,hideTouches:!1},e=>`HarmonyOS recordings do not support ${e.join(`, `)}`),o.throwIfAborted(),await n.screenRecording.outputs.prepare(a.outputPath);let s=`agent-device-recording-${k()}.mp4`,c={backend:`harmony-screen-recorder`,fileName:s,remotePath:`/data/local/tmp/${s}`},l;try{l=await n.screenRecording.harmony.start(r,s,o),o.throwIfAborted()}catch(e){throw o.aborted?(await L(n,r,c).catch(()=>{}),o.reason):e}z(l,`start`);try{o.throwIfAborted()}catch(e){throw await L(n,r,c).catch(()=>{}),e}let u=je(a),d=!1,f=async()=>{d||=(z(await n.screenRecording.harmony.stop(r),`stop`),!0)},p=xe(u,{finish:async e=>await Me(n,r,e,c,f),forceCleanup:async()=>await L(n,r,c,f)});return Object.freeze({pendingHandle:new ve(p),envelope:Te({device:r,owner:i,input:a,descriptor:c})})}function je(e){return Object.freeze({backend:`HarmonyOS ScreenRecorder`,outPath:e.outputPath,...e.clientOutputPath===void 0?{}:{clientOutPath:e.clientOutputPath},startedAt:Date.now(),scope:e.scope,showTouches:!1,recordOnlySession:e.recordOnlySession,...e.activeSessionApp===void 0?{}:{activeSessionApp:e.activeSessionApp},gestureEvents:[]})}async function Me(e,t,n,r,i){await i();let a=await e.screenRecording.harmony.findMedia(t,r.fileName);if(!a)throw Error(`failed to find finalized HarmonyOS recording '${r.fileName}'`);if(!await Fe(e,t,r,a))throw Error(`failed to finalize HarmonyOS recording: ${r.fileName} did not produce a non-empty media file`);try{if((await e.screenRecording.harmony.pull(t,{remotePath:r.remotePath,outputPath:n.outPath})).exitCode!==0)throw Error(`failed to retrieve HarmonyOS recording`);let i=await e.screenRecording.finalize.complete({outputPath:n.outPath,showTouches:!1,gestureEvents:n.gestureEvents,targetLabel:`HarmonyOS recording`}),o=await Ne(e,t,r,a);return y(n,{...i,...Pe(i.warning,o)},!1)}catch(n){throw await e.screenRecording.harmony.remove(t,r.remotePath).catch(()=>{}),n}}async function Ne(e,t,n,r){let i=[];return await I(()=>e.screenRecording.harmony.remove(t,n.remotePath))||i.push(`staging artifact`),await I(()=>e.screenRecording.harmony.removeMedia(t,r))||i.push(`media-library artifact`),i.length===0?void 0:`HarmonyOS recording completed, but cleanup was not confirmed for the ${i.join(` and `)}.`}async function I(e){try{return await e()}catch{return!1}}function Pe(e,t){let n=[e,t].filter(e=>e!==void 0).join(` `);return n.length===0?{}:{warning:n}}async function Fe(e,t,n,r){let i;for(let a=0;a<40;a+=1){if(await e.screenRecording.harmony.remove(t,n.remotePath).catch(()=>{}),await e.screenRecording.harmony.stageMedia(t,{mediaUri:r,remotePath:n.remotePath})){let r=await e.screenRecording.harmony.stagedFileSize(t,n.remotePath);if(r!==void 0&&r>0&&r===i)return!0;i=r!==void 0&&r>0?r:void 0}else i=void 0;a<39&&await e.clock.sleep(250)}return!1}async function L(e,t,n,r=async()=>{z(await e.screenRecording.harmony.stop(t),`stop`)}){let i=[await R(r),await R(async()=>{if(!await e.screenRecording.harmony.remove(t,n.remotePath))throw Error(`HarmonyOS recording staging artifact removal was not confirmed`)}),await R(async()=>await Ie(e,t,n.fileName))].find(e=>e!==void 0);return i===void 0?{status:`cleaned`}:{status:`cleanup-pending`,reason:`transport-failed`,message:i instanceof Error?i.message:`HarmonyOS recording cleanup failed`}}async function Ie(e,t,n){let r=await e.screenRecording.harmony.findMedia(t,n);if(r&&!await e.screenRecording.harmony.removeMedia(t,r))throw Error(`HarmonyOS recording media removal was not confirmed`)}async function R(e){try{await e();return}catch(e){return e}}function z(e,t){if(e.exitCode===0&&e.stdout.includes(`start ability successfully`))return;let n=e.stdout.trim()||e.stderr.trim()||`hdc exit ${e.exitCode}`;throw Error(`failed to ${t} HarmonyOS screen recording: ${n}`)}async function Le(t,n){n.throwIfAborted();let{runHarmonyHdc:r}=await import(`./hdc.js`),i=await r(t,[`shell`,`aa`,`dump`,`-l`],{timeoutMs:15e3,signal:n});n.throwIfAborted();let a=Re(i.stdout);if(!a)throw new e(`COMMAND_FAILED`,`Could not determine the foreground HarmonyOS app`,{hint:`Open an app on the target, then retry appstate.`});return a}function Re(e){let t=e.split(/(?=^\s*Mission ID #)/m);for(let e of t){if(!/\bstate #FOREGROUND\b/.test(e))continue;let t=e.match(/mission name #\[#([^:]+):[^:]*:([^\]]+)]/);if(!t)continue;let[,n,r]=t;if(!(!n||!r))return{package:n,activity:r}}}function ze(e){return O({owner:`HarmonyOS`,openTargetIdentity:`bundle-id`,binding:D({device:e.device,signal:e.signal,resolveInteractor:e.host.resolve})})}const Be=Object.freeze({available:!0}),Ve=Object.freeze({available:!1,reason:`unsupported-device-kind`}),B=Object.freeze({available:!1,reason:`unsupported-platform-leaf`});function V(e){let t=e.kind===`emulator`||e.kind===`device`?Be:Ve;return Object.freeze({deployApp:t,materializeAppSource:B,deployMaterializedApp:B,sendPushNotification:B})}function He(e){return V(e.device).deployApp.available?Object.freeze({deployApp:async t=>await Ue(e.commands,e.device,t,e.signal)}):Object.freeze({})}async function Ue(t,n,r,i){let a=await We(t,r.appPath,i)??r.app.trim();if(!a)throw new e(`INVALID_ARGS`,`Could not determine the bundle name from the HAP archive`,{hint:`Pass the HarmonyOS bundle name before the HAP path, or provide a valid HAP containing module.json.`});return await H(t,n,[`install`,`-r`,r.appPath],i,18e4),r.replaceExisting&&(await A(1e3,void 0,{signal:i}),await Ge(t,n,a,i)),{packageName:a,launchTarget:a}}async function We(e,t,n){let r=await e.run({executable:`unzip`,args:[`-p`,t,`module.json`],allowFailure:!0,timeoutMs:15e3},n);if(r.exitCode===0&&r.stdout.trim().length!==0)try{return JSON.parse(r.stdout).app?.bundleName?.trim()||void 0}catch{return}}async function Ge(t,n,r,i){let a=Ke((await H(t,n,[`shell`,`bm`,`dump`,`-n`,r],i)).stdout);if(!a)throw new e(`COMMAND_FAILED`,`Could not determine a launchable ability for ${r}`,{hint:`Check that the HarmonyOS bundle exposes a main ability.`});await H(t,n,[`shell`,`aa`,`start`,`-b`,r,...a.module?[`-m`,a.module]:[],`-a`,a.ability],i)}function Ke(e){let t=e.indexOf(`{`);if(t!==-1)try{let n=JSON.parse(e.slice(t)).hapModuleInfos?.find(e=>e.mainElementName);return n?.mainElementName?{ability:n.mainElementName,...n.moduleName?{module:n.moduleName}:{}}:void 0}catch{return}}async function H(e,t,n,r,i=15e3){return await e.run({executable:`hdc`,args:[`-t`,t.id,...n],timeoutMs:i},r)}const U=n(`harmonyos`),qe=Object.freeze({available:!1,reason:`unsupported-platform-leaf`,hint:`HarmonyOS reads element text from the captured tree only.`}),Je=Object.freeze({available:!1,reason:`unsupported-device-kind`,hint:`focus is supported on HarmonyOS emulators and physical devices.`}),W=Object.freeze({available:!0}),G=Object.freeze({available:!1,reason:`unsupported-platform-leaf`}),Ye=Object.freeze({available:!1,reason:`unsupported-device-kind`,hint:`HarmonyOS appstate is supported only for HarmonyOS emulators and devices.`}),Xe=Object.freeze({available:!1,reason:`unsupported-platform-leaf`,hint:`Apple runner preparation is supported only for Apple targets.`}),K=Object.freeze({available:!0}),Ze=Object.freeze({available:!1,reason:`unsupported-device-kind`,hint:`open is supported only for HarmonyOS emulators and devices.`}),Qe=Object.freeze({available:!1,reason:`unsupported-device-kind`,hint:`close is supported only for HarmonyOS emulators and devices.`}),$e=Object.freeze({available:!1,reason:`unsupported-provider-mode`,hint:`Port reverse is supported only by an owning provider runtime.`}),q=Object.freeze({available:!1,reason:`unsupported-device-kind`,hint:`snapshot is supported only for HarmonyOS emulators and devices.`}),J=Object.freeze({available:!1,reason:`unsupported-device-kind`,hint:`screenshot is supported only for HarmonyOS emulators and devices.`}),et=Object.freeze({available:!1,reason:`unsupported-platform-leaf`,hint:`Re-run without --actions, or target an iOS simulator.`}),tt=Object.freeze({available:!1,reason:`unsupported-platform-leaf`,hint:`viewport resizes web targets only (--platform web).`});function nt(e){let t=rt(e),n=it(e);return a({resolveOpenTarget:t,prepareApplicationOpen:t,openApplication:t,applyRuntimeHints:G,clearRuntimeHints:G,closeApplication:n,finalizeApplicationClose:n,prepareAppleRunner:Xe,configureProviderPortReverse:$e})}function rt(e){return e.kind===`emulator`||e.kind===`device`?K:Ze}function it(e){return e.kind===`emulator`||e.kind===`device`?K:Qe}const Y=Object.freeze({available:!1,reason:`unsupported-device-kind`,hint:`Gestures are supported on HarmonyOS emulators and physical devices.`}),at=Object.freeze({available:!1,reason:`unsupported-platform-leaf`}),ot=Object.freeze({available:!1,reason:`unsupported-platform-leaf`,hint:S});function X(e){return e.kind===`emulator`||e.kind===`device`?W:Y}function Z(e){return e.kind===`emulator`||e.kind===`device`?W:Je}const Q=Object.freeze({available:!1,reason:`unsupported-platform-leaf`}),st=Object.freeze({available:!1,reason:`unsupported-platform-leaf`,hint:`keyboard status/get is not available through the public HarmonyOS HDC API; use keyboard dismiss or enter`}),$=Object.freeze({available:!1,reason:`unsupported-platform-leaf`,hint:`audio is supported for web browser sessions, macOS sessions, iOS simulators, and Android emulators on macOS hosts`});function ct(e){let t=Se(e),n=async e=>{let n=await t.inspectFacts(e),r=V(e),i=Oe(e);return Object.freeze({device:n.device,operations:{...n.operations,...r,appState:e.kind===`simulator`?Ye:W,networkDump:G,screenRecordingStart:i,screenRecordingReattach:i,screenRecordingCleanup:i,...d({capture:e.kind===`emulator`||e.kind===`device`?W:q,customActions:et,withoutActiveApp:e.kind===`emulator`||e.kind===`device`?W:q}),...u({capture:e.kind===`emulator`||e.kind===`device`?W:J}),...h({findText:q}),...p({setViewport:tt}),...f({focus:Z(e)}),...ee({unsupported:Y,plan:X(e),directionalFling:X(e),multiTouch:at,targetAuthoredDrag:ot,viewport:X(e)}),...c({scroll:X(e)}),...l({type:Z(e)}),...o({unsupported:G,tap:Z(e),longPress:Z(e),fill:Z(e)}),...pe({readTextAtPoint:qe}),...me({back:Z(e)}),...ie({home:Z(e)}),...ue({appSwitcher:Z(e)}),...re({triggerAppEvent:Q}),...se({setSetting:Z(e)}),...de({read:Q,wait:Q,accept:Q,dismiss:Q}),...fe({orientation:Q}),...oe({tvRemote:Q}),...le({unsupported:Q,status:st,dismiss:Z(e),enter:Z(e)}),...ae({unsupported:Q}),...ge({capture:$,query:$}),..._e({frames:Z(e),memorySample:Z(e),memorySnapshot:Z(e),nativeCapture:Q,profileReport:Q}),ensureReady:W,bootTarget:G,bootTargetHeadless:G,listApps:W,...nt(e),shutdownTarget:G}})};return Object.freeze({owner:U,ownsDevice:e=>e.platform===`harmonyos`,inspectFacts:n,bind:async a=>{let o=await t.bind(a),c=await n(a.device),l=c.operations.screenRecordingStart;return Object.freeze({device:o.device,owner:U,facts:c,operations:Object.freeze({...o.operations,...He({commands:e.commands,device:a.device,signal:a.scope.signal}),...c.operations.appState.available?{appState:async()=>await Le(a.device,a.scope.signal)}:{},ensureReady:async()=>({...a.device,booted:!0}),...l.available?ke({host:e,device:a.device,owner:U,signal:a.scope.signal}):{},...c.operations.captureSnapshot.available?he({device:a.device,signal:a.scope.signal,resolveInteractor:e.localInteractors.resolve}):{},...c.operations.captureScreenshot.available?ne({device:a.device,signal:a.scope.signal,resolveInteractor:e.localInteractors.resolve}):{},...c.operations.focusPoint.available?m({device:a.device,signal:a.scope.signal,resolveInteractor:e.localInteractors.resolve}):{},...c.operations.typeText.available?g({device:a.device,signal:a.scope.signal,resolveInteractor:e.localInteractors.resolve}):{},...ce({device:a.device,signal:a.scope.signal,facts:c.operations,resolveInteractor:e.localInteractors.resolve}),...c.operations.scrollDirection.available?te({device:a.device,signal:a.scope.signal,resolveInteractor:e.localInteractors.resolve}):{},...C({device:a.device,signal:a.scope.signal,resolveInteractor:e.localInteractors.resolve,facts:c.operations}),...r(c.operations.perfFrames,()=>we({resolveHost:()=>e.perf.harmony,device:a.device})),...r(c.operations.tapPoint,()=>s({device:a.device,signal:a.scope.signal,resolveInteractor:e.localInteractors.resolve,facts:c.operations,pause:async t=>await e.clock.sleep(t,a.scope.signal)})),listApps:async e=>{a.scope.signal.throwIfAborted();let{listHarmonyApps:t}=await import(`./app-lifecycle2.js`);return(await t(e.device,e.filter,{signal:a.scope.signal})).map(e=>({id:e.package,name:e.name}))},...i(ze({host:e.localInteractors,device:a.device,signal:a.scope.signal}),c.operations)}),[Symbol.asyncDispose]:async()=>await o[Symbol.asyncDispose]()})},shutdown:async()=>await t.shutdown()})}export{ct as createHarmonyPlatformRuntime};
|
|
1
|
+
import{C as e}from"./sdk-contracts.js";import{w as t}from"./sdk-device.js";import{Gt as n,Zt as r}from"./sdk-batch.js";import{n as i,t as a}from"./application-lifecycle-runtime.js";import{i as o,t as s}from"./touch-runtime.js";import{A as c,D as l,G as u,H as d,I as f,L as p,N as ee,O as te,P as m,R as h,T as g,U as ne,a as re,b as ie,d as ae,g as oe,i as se,j as ce,m as le,s as ue,t as de,v as fe,w as pe,x as me,z as he}from"./alert-runtime.js";import{n as ge}from"./audio-probe-runtime.js";import{n as _e}from"./perf-runtime.js";import{a as _,n as v}from"./durable-resource.js";import{n as ve}from"./async-lifecycle.js";import{i as ye,r as be}from"./src7.js";import{n as xe,t as y}from"./screen-recording-completion.js";import{t as b}from"./screen-recording-options.js";import{n as x}from"./screen-recording-runtime.js";import{i as S}from"./gesture-admission.js";import{t as C}from"./interactor-operation-catalog.js";import{i as w,n as T}from"./perf-runtime-operation-builder.js";import{t as E}from"./app-log-runtime.js";import{n as D,t as O}from"./application-lifecycle-interaction.js";import{randomUUID as k}from"node:crypto";import{setTimeout as A}from"node:timers/promises";const j=Object.freeze({resourceKind:E,version:1,encode:e=>({...e}),decode:e=>e.transport!==`harmony-hilog`||!N(e.outputPath)||!N(e.pidPath)?{status:`invalid`,message:`Invalid HarmonyOS app-log descriptor`}:{status:`decoded`,descriptor:Object.freeze({transport:`harmony-hilog`,outputPath:e.outputPath,pidPath:e.pidPath})}});function M(e){return v({resourceKind:E,sessionId:e.sessionId,device:{id:e.device.id,family:`harmonyos`,kind:e.device.kind,...e.device.target===void 0?{}:{target:e.device.target}},owner:e.owner,fence:e.fence,lifecycle:`open`,descriptor:_(j,e.descriptor)})}function N(e){return typeof e==`string`&&e.trim().length>0}function Se(e){return be(e,{family:`harmonyos`,backend:`harmonyos`,label:`HarmonyOS`,codec:j,startUnavailableHint:`The selected HarmonyOS transport cannot start a background hilog stream.`,cleanupFailureMessage:`HarmonyOS app-log cleanup did not settle every owned resource`,doctor:async(e,t)=>({backend:`harmonyos`,checks:{},notes:t?[]:[`No app bundle is tracked in this session. Run open <app> first for app-scoped logs.`]}),process:async({host:e,device:t,input:n,signal:r})=>{let i=await Ce(e,r);return{resolvePid:async r=>await ye(e,{executable:i,args:[`-t`,t.id,`shell`,`pidof`,n.appBundleId],allowFailure:!0,timeoutMs:5e3},r),command:e=>({kind:`host`,request:{executable:i,args:[`-t`,t.id,`shell`,`hilog`,`-P`,e],allowFailure:!0}})}},descriptor:({artifacts:e})=>({transport:`harmony-hilog`,...e}),envelope:({input:e,device:t,owner:n,descriptor:r})=>M({sessionId:e.sessionId,device:t,owner:n,fence:e.fence,descriptor:r})})}async function Ce(t,n){n.throwIfAborted(),await P(async()=>await t.toolchains.prepare(`harmonyos`),n),n.throwIfAborted();let r=await P(async()=>await t.commands.which(`hdc`),n);if(n.throwIfAborted(),!r)throw new e(`TOOL_MISSING`,`hdc not found in PATH`,{hint:`Install HarmonyOS Command Line Tools, then add its sdk/default/openharmony/toolchains directory to PATH.`});return r}async function P(e,t){try{return await e()}catch(e){throw t.throwIfAborted(),e}}function we(e){let{resolveHost:t,device:n}=e,r={available:!1,reason:`Dropped-frame sampling is currently available only on Android app sessions and connected iOS device app sessions.`};return Object.freeze({perfFrames:async()=>({metric:r,sampling:r}),perfMemorySample:async({appId:e})=>({metric:e?await w(t().sampleMemory(n,e)):T(`HarmonyOS`,`bundle`),sampling:{method:`hdc-shell-proc-status`,description:`Resident memory snapshot from HarmonyOS /proc/<pid>/status. Values are reported in kilobytes.`,unit:`kB`,topConsumerLimit:1}}),perfMemorySnapshot:async({kind:e})=>({artifact:{available:!1,kind:e??`memgraph`,reason:`Memory snapshot artifacts are not supported on harmonyos.`,hint:`Use perf memory sample where supported, or run the snapshot against Android, iOS simulator, or macOS.`,support:{platform:`harmonyos`,defaultKind:`memgraph`,androidHprof:!1,memgraph:!1,heapprofd:!1}},sampling:{method:`unsupported`,description:`HarmonyOS memory snapshot capture is not available through HDC.`,artifactOnly:!0}})})}const F=Object.freeze({resourceKind:x,version:1,encode:e=>({...e}),decode:e=>e.backend===`harmony-screen-recorder`&&typeof e.fileName==`string`&&De(e.fileName)&&e.remotePath===`/data/local/tmp/${e.fileName}`?{status:`decoded`,descriptor:Object.freeze({backend:`harmony-screen-recorder`,fileName:e.fileName,remotePath:e.remotePath})}:{status:`invalid`,message:`Invalid HarmonyOS screen-recording descriptor`}});function Te(e){let{device:n,owner:r,input:i,descriptor:a}=e;return v({resourceKind:x,sessionId:i.sessionId,device:t(n),owner:r,fence:i.fence,lifecycle:`open`,descriptor:_(F,a)})}function Ee(e){return F.decode(e).status===`decoded`?{status:`cleanup-pending`,reason:`manual-recovery-required`,message:`HarmonyOS recorder ownership cannot be proven after daemon restart; no recorder was stopped.`}:{status:`cleanup-pending`,reason:`manual-recovery-required`}}function De(e){return/^agent-device-recording-[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}\.mp4$/i.test(e)}function Oe(e){return e.kind===`device`?Object.freeze({available:!0}):Object.freeze({available:!1,reason:`unsupported-device-kind`,hint:`HarmonyOS recording is supported on physical devices only.`})}function ke(e){let{host:t,device:n,owner:r,signal:i}=e;return Object.freeze({screenRecordingStart:async e=>await Ae({host:t,device:n,owner:r,input:e,signal:i}),screenRecordingReattach:async()=>({status:`unreattachable`,reason:`transport-not-reattachable`,message:`HarmonyOS recordings cannot be reattached after daemon restart.`}),screenRecordingCleanup:async e=>Ee(e.envelope.descriptor.body)})}async function Ae(t){let{host:n,device:r,owner:i,input:a,signal:o}=t;if(a.scope===`app`)throw new e(`INVALID_ARGS`,`HarmonyOS recording captures the whole physical-device screen; use --scope device or --scope system`);b(a,{scopes:[`device`,`system`],fps:!1,exportQuality:!1,hideTouches:!1},e=>`HarmonyOS recordings do not support ${e.join(`, `)}`),o.throwIfAborted(),await n.screenRecording.outputs.prepare(a.outputPath);let s=`agent-device-recording-${k()}.mp4`,c={backend:`harmony-screen-recorder`,fileName:s,remotePath:`/data/local/tmp/${s}`},l;try{l=await n.screenRecording.harmony.start(r,s,o),o.throwIfAborted()}catch(e){throw o.aborted?(await L(n,r,c).catch(()=>{}),o.reason):e}z(l,`start`);try{o.throwIfAborted()}catch(e){throw await L(n,r,c).catch(()=>{}),e}let u=je(a),d=!1,f=async()=>{d||=(z(await n.screenRecording.harmony.stop(r),`stop`),!0)},p=xe(u,{finish:async e=>await Me(n,r,e,c,f),forceCleanup:async()=>await L(n,r,c,f)});return Object.freeze({pendingHandle:new ve(p),envelope:Te({device:r,owner:i,input:a,descriptor:c})})}function je(e){return Object.freeze({backend:`HarmonyOS ScreenRecorder`,outPath:e.outputPath,...e.clientOutputPath===void 0?{}:{clientOutPath:e.clientOutputPath},startedAt:Date.now(),scope:e.scope,showTouches:!1,recordOnlySession:e.recordOnlySession,...e.activeSessionApp===void 0?{}:{activeSessionApp:e.activeSessionApp},gestureEvents:[]})}async function Me(e,t,n,r,i){await i();let a=await e.screenRecording.harmony.findMedia(t,r.fileName);if(!a)throw Error(`failed to find finalized HarmonyOS recording '${r.fileName}'`);if(!await Fe(e,t,r,a))throw Error(`failed to finalize HarmonyOS recording: ${r.fileName} did not produce a non-empty media file`);try{if((await e.screenRecording.harmony.pull(t,{remotePath:r.remotePath,outputPath:n.outPath})).exitCode!==0)throw Error(`failed to retrieve HarmonyOS recording`);let i=await e.screenRecording.finalize.complete({outputPath:n.outPath,showTouches:!1,gestureEvents:n.gestureEvents,targetLabel:`HarmonyOS recording`}),o=await Ne(e,t,r,a);return y(n,{...i,...Pe(i.warning,o)},{stopObservation:{recorder:`confirmed`},nativePathDisposition:o===void 0?`retired`:`retirable`,showTouches:!1})}catch(n){throw await e.screenRecording.harmony.remove(t,r.remotePath).catch(()=>{}),n}}async function Ne(e,t,n,r){let i=[];return await I(()=>e.screenRecording.harmony.remove(t,n.remotePath))||i.push(`staging artifact`),await I(()=>e.screenRecording.harmony.removeMedia(t,r))||i.push(`media-library artifact`),i.length===0?void 0:`HarmonyOS recording completed, but cleanup was not confirmed for the ${i.join(` and `)}.`}async function I(e){try{return await e()}catch{return!1}}function Pe(e,t){let n=[e,t].filter(e=>e!==void 0).join(` `);return n.length===0?{}:{warning:n}}async function Fe(e,t,n,r){let i;for(let a=0;a<40;a+=1){if(await e.screenRecording.harmony.remove(t,n.remotePath).catch(()=>{}),await e.screenRecording.harmony.stageMedia(t,{mediaUri:r,remotePath:n.remotePath})){let r=await e.screenRecording.harmony.stagedFileSize(t,n.remotePath);if(r!==void 0&&r>0&&r===i)return!0;i=r!==void 0&&r>0?r:void 0}else i=void 0;a<39&&await e.clock.sleep(250)}return!1}async function L(e,t,n,r=async()=>{z(await e.screenRecording.harmony.stop(t),`stop`)}){let i=[await R(r),await R(async()=>{if(!await e.screenRecording.harmony.remove(t,n.remotePath))throw Error(`HarmonyOS recording staging artifact removal was not confirmed`)}),await R(async()=>await Ie(e,t,n.fileName))].find(e=>e!==void 0);return i===void 0?{status:`cleaned`}:{status:`cleanup-pending`,reason:`transport-failed`,message:i instanceof Error?i.message:`HarmonyOS recording cleanup failed`}}async function Ie(e,t,n){let r=await e.screenRecording.harmony.findMedia(t,n);if(r&&!await e.screenRecording.harmony.removeMedia(t,r))throw Error(`HarmonyOS recording media removal was not confirmed`)}async function R(e){try{await e();return}catch(e){return e}}function z(e,t){if(e.exitCode===0&&e.stdout.includes(`start ability successfully`))return;let n=e.stdout.trim()||e.stderr.trim()||`hdc exit ${e.exitCode}`;throw Error(`failed to ${t} HarmonyOS screen recording: ${n}`)}async function Le(t,n){n.throwIfAborted();let{runHarmonyHdc:r}=await import(`./hdc.js`),i=await r(t,[`shell`,`aa`,`dump`,`-l`],{timeoutMs:15e3,signal:n});n.throwIfAborted();let a=Re(i.stdout);if(!a)throw new e(`COMMAND_FAILED`,`Could not determine the foreground HarmonyOS app`,{hint:`Open an app on the target, then retry appstate.`});return a}function Re(e){let t=e.split(/(?=^\s*Mission ID #)/m);for(let e of t){if(!/\bstate #FOREGROUND\b/.test(e))continue;let t=e.match(/mission name #\[#([^:]+):[^:]*:([^\]]+)]/);if(!t)continue;let[,n,r]=t;if(!(!n||!r))return{package:n,activity:r}}}function ze(e){return O({owner:`HarmonyOS`,openTargetIdentity:`bundle-id`,binding:D({device:e.device,signal:e.signal,resolveInteractor:e.host.resolve})})}const Be=Object.freeze({available:!0}),Ve=Object.freeze({available:!1,reason:`unsupported-device-kind`}),B=Object.freeze({available:!1,reason:`unsupported-platform-leaf`});function V(e){let t=e.kind===`emulator`||e.kind===`device`?Be:Ve;return Object.freeze({deployApp:t,materializeAppSource:B,deployMaterializedApp:B,sendPushNotification:B})}function He(e){return V(e.device).deployApp.available?Object.freeze({deployApp:async t=>await Ue(e.commands,e.device,t,e.signal)}):Object.freeze({})}async function Ue(t,n,r,i){let a=await We(t,r.appPath,i)??r.app.trim();if(!a)throw new e(`INVALID_ARGS`,`Could not determine the bundle name from the HAP archive`,{hint:`Pass the HarmonyOS bundle name before the HAP path, or provide a valid HAP containing module.json.`});return await H(t,n,[`install`,`-r`,r.appPath],i,18e4),r.replaceExisting&&(await A(1e3,void 0,{signal:i}),await Ge(t,n,a,i)),{packageName:a,launchTarget:a}}async function We(e,t,n){let r=await e.run({executable:`unzip`,args:[`-p`,t,`module.json`],allowFailure:!0,timeoutMs:15e3},n);if(r.exitCode===0&&r.stdout.trim().length!==0)try{return JSON.parse(r.stdout).app?.bundleName?.trim()||void 0}catch{return}}async function Ge(t,n,r,i){let a=Ke((await H(t,n,[`shell`,`bm`,`dump`,`-n`,r],i)).stdout);if(!a)throw new e(`COMMAND_FAILED`,`Could not determine a launchable ability for ${r}`,{hint:`Check that the HarmonyOS bundle exposes a main ability.`});await H(t,n,[`shell`,`aa`,`start`,`-b`,r,...a.module?[`-m`,a.module]:[],`-a`,a.ability],i)}function Ke(e){let t=e.indexOf(`{`);if(t!==-1)try{let n=JSON.parse(e.slice(t)).hapModuleInfos?.find(e=>e.mainElementName);return n?.mainElementName?{ability:n.mainElementName,...n.moduleName?{module:n.moduleName}:{}}:void 0}catch{return}}async function H(e,t,n,r,i=15e3){return await e.run({executable:`hdc`,args:[`-t`,t.id,...n],timeoutMs:i},r)}const U=n(`harmonyos`),qe=Object.freeze({available:!1,reason:`unsupported-platform-leaf`,hint:`HarmonyOS reads element text from the captured tree only.`}),Je=Object.freeze({available:!1,reason:`unsupported-device-kind`,hint:`focus is supported on HarmonyOS emulators and physical devices.`}),W=Object.freeze({available:!0}),G=Object.freeze({available:!1,reason:`unsupported-platform-leaf`}),Ye=Object.freeze({available:!1,reason:`unsupported-device-kind`,hint:`HarmonyOS appstate is supported only for HarmonyOS emulators and devices.`}),Xe=Object.freeze({available:!1,reason:`unsupported-platform-leaf`,hint:`Apple runner preparation is supported only for Apple targets.`}),K=Object.freeze({available:!0}),Ze=Object.freeze({available:!1,reason:`unsupported-device-kind`,hint:`open is supported only for HarmonyOS emulators and devices.`}),Qe=Object.freeze({available:!1,reason:`unsupported-device-kind`,hint:`close is supported only for HarmonyOS emulators and devices.`}),$e=Object.freeze({available:!1,reason:`unsupported-provider-mode`,hint:`Port reverse is supported only by an owning provider runtime.`}),q=Object.freeze({available:!1,reason:`unsupported-device-kind`,hint:`snapshot is supported only for HarmonyOS emulators and devices.`}),J=Object.freeze({available:!1,reason:`unsupported-device-kind`,hint:`screenshot is supported only for HarmonyOS emulators and devices.`}),et=Object.freeze({available:!1,reason:`unsupported-platform-leaf`,hint:`Re-run without --actions, or target an iOS simulator.`}),tt=Object.freeze({available:!1,reason:`unsupported-platform-leaf`,hint:`viewport resizes web targets only (--platform web).`});function nt(e){let t=rt(e),n=it(e);return a({resolveOpenTarget:t,prepareApplicationOpen:t,openApplication:t,applyRuntimeHints:G,clearRuntimeHints:G,closeApplication:n,finalizeApplicationClose:n,prepareAppleRunner:Xe,configureProviderPortReverse:$e})}function rt(e){return e.kind===`emulator`||e.kind===`device`?K:Ze}function it(e){return e.kind===`emulator`||e.kind===`device`?K:Qe}const Y=Object.freeze({available:!1,reason:`unsupported-device-kind`,hint:`Gestures are supported on HarmonyOS emulators and physical devices.`}),at=Object.freeze({available:!1,reason:`unsupported-platform-leaf`}),ot=Object.freeze({available:!1,reason:`unsupported-platform-leaf`,hint:S});function X(e){return e.kind===`emulator`||e.kind===`device`?W:Y}function Z(e){return e.kind===`emulator`||e.kind===`device`?W:Je}const Q=Object.freeze({available:!1,reason:`unsupported-platform-leaf`}),st=Object.freeze({available:!1,reason:`unsupported-platform-leaf`,hint:`keyboard status/get is not available through the public HarmonyOS HDC API; use keyboard dismiss or enter`}),$=Object.freeze({available:!1,reason:`unsupported-platform-leaf`,hint:`audio is supported for web browser sessions, macOS sessions, iOS simulators, and Android emulators on macOS hosts`});function ct(e){let t=Se(e),n=async e=>{let n=await t.inspectFacts(e),r=V(e),i=Oe(e);return Object.freeze({device:n.device,operations:{...n.operations,...r,appState:e.kind===`simulator`?Ye:W,networkDump:G,screenRecordingStart:i,screenRecordingReattach:i,screenRecordingCleanup:i,...d({capture:e.kind===`emulator`||e.kind===`device`?W:q,customActions:et,withoutActiveApp:e.kind===`emulator`||e.kind===`device`?W:q}),...u({capture:e.kind===`emulator`||e.kind===`device`?W:J}),...h({findText:q}),...p({setViewport:tt}),...f({focus:Z(e)}),...ee({unsupported:Y,plan:X(e),directionalFling:X(e),multiTouch:at,targetAuthoredDrag:ot,viewport:X(e)}),...c({scroll:X(e)}),...l({type:Z(e)}),...o({unsupported:G,tap:Z(e),longPress:Z(e),fill:Z(e)}),...pe({readTextAtPoint:qe}),...me({back:Z(e)}),...ie({home:Z(e)}),...ue({appSwitcher:Z(e)}),...re({triggerAppEvent:Q}),...se({setSetting:Z(e)}),...de({read:Q,wait:Q,accept:Q,dismiss:Q}),...fe({orientation:Q}),...oe({tvRemote:Q}),...le({unsupported:Q,status:st,dismiss:Z(e),enter:Z(e)}),...ae({unsupported:Q}),...ge({capture:$,query:$}),..._e({frames:Z(e),memorySample:Z(e),memorySnapshot:Z(e),nativeCapture:Q,profileReport:Q}),ensureReady:W,bootTarget:G,bootTargetHeadless:G,listApps:W,...nt(e),shutdownTarget:G}})};return Object.freeze({owner:U,ownsDevice:e=>e.platform===`harmonyos`,inspectFacts:n,bind:async a=>{let o=await t.bind(a),c=await n(a.device),l=c.operations.screenRecordingStart;return Object.freeze({device:o.device,owner:U,facts:c,operations:Object.freeze({...o.operations,...He({commands:e.commands,device:a.device,signal:a.scope.signal}),...c.operations.appState.available?{appState:async()=>await Le(a.device,a.scope.signal)}:{},ensureReady:async()=>({...a.device,booted:!0}),...l.available?ke({host:e,device:a.device,owner:U,signal:a.scope.signal}):{},...c.operations.captureSnapshot.available?he({device:a.device,signal:a.scope.signal,resolveInteractor:e.localInteractors.resolve}):{},...c.operations.captureScreenshot.available?ne({device:a.device,signal:a.scope.signal,resolveInteractor:e.localInteractors.resolve}):{},...c.operations.focusPoint.available?m({device:a.device,signal:a.scope.signal,resolveInteractor:e.localInteractors.resolve}):{},...c.operations.typeText.available?g({device:a.device,signal:a.scope.signal,resolveInteractor:e.localInteractors.resolve}):{},...ce({device:a.device,signal:a.scope.signal,facts:c.operations,resolveInteractor:e.localInteractors.resolve}),...c.operations.scrollDirection.available?te({device:a.device,signal:a.scope.signal,resolveInteractor:e.localInteractors.resolve}):{},...C({device:a.device,signal:a.scope.signal,resolveInteractor:e.localInteractors.resolve,facts:c.operations}),...r(c.operations.perfFrames,()=>we({resolveHost:()=>e.perf.harmony,device:a.device})),...r(c.operations.tapPoint,()=>s({device:a.device,signal:a.scope.signal,resolveInteractor:e.localInteractors.resolve,facts:c.operations,pause:async t=>await e.clock.sleep(t,a.scope.signal)})),listApps:async e=>{a.scope.signal.throwIfAborted();let{listHarmonyApps:t}=await import(`./app-lifecycle2.js`);return(await t(e.device,e.filter,{signal:a.scope.signal})).map(e=>({id:e.package,name:e.name}))},...i(ze({host:e.localInteractors,device:a.device,signal:a.scope.signal}),c.operations)}),[Symbol.asyncDispose]:async()=>await o[Symbol.asyncDispose]()})},shutdown:async()=>await t.shutdown()})}export{ct as createHarmonyPlatformRuntime};
|
package/dist/src/runtime9.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{C as e}from"./sdk-contracts.js";import{w as t}from"./sdk-device.js";import{Gt as n,Xt as r,Zt as i}from"./sdk-batch.js";import{n as a,t as o}from"./application-lifecycle-runtime.js";import{i as s,t as c}from"./touch-runtime.js";import{A as l,D as u,G as d,H as f,I as p,L as m,N as ee,O as te,P as ne,R as re,T as ie,U as h,a as g,b as _,d as v,g as ae,i as y,m as oe,s as b,t as x,v as S,w as C,x as w,z as T}from"./alert-runtime.js";import{n as E}from"./audio-probe-runtime.js";import{n as D}from"./perf-runtime.js";import{a as O,n as k}from"./durable-resource.js";import{n as A}from"./async-lifecycle.js";import"./src7.js";import{
|
|
1
|
+
import{C as e}from"./sdk-contracts.js";import{w as t}from"./sdk-device.js";import{Gt as n,Xt as r,Zt as i}from"./sdk-batch.js";import{n as a,t as o}from"./application-lifecycle-runtime.js";import{i as s,t as c}from"./touch-runtime.js";import{A as l,D as u,G as d,H as f,I as p,L as m,N as ee,O as te,P as ne,R as re,T as ie,U as h,a as g,b as _,d as v,g as ae,i as y,m as oe,s as b,t as x,v as S,w as C,x as w,z as T}from"./alert-runtime.js";import{n as E}from"./audio-probe-runtime.js";import{n as D}from"./perf-runtime.js";import{a as O,n as k}from"./durable-resource.js";import{n as A}from"./async-lifecycle.js";import"./src7.js";import{n as j,t as M}from"./screen-recording-completion.js";import{t as N}from"./screen-recording-options.js";import{n as P}from"./screen-recording-runtime.js";import{i as F}from"./gesture-admission.js";import{n as I,t as L}from"./application-lifecycle-interaction.js";const R=Object.freeze({resourceKind:P,version:1,encode:e=>({...e}),decode:e=>e.backend===`agent-browser`&&typeof e.outputPath==`string`?{status:`decoded`,descriptor:Object.freeze({backend:`agent-browser`,outputPath:e.outputPath})}:{status:`invalid`,message:`Invalid web screen-recording descriptor`}});async function z(e){let{host:t,device:n,owner:r,signal:i}=e,a=await t.screenRecording.web.resolve(n);return a?{available:!0,operations:{screenRecordingStart:async e=>await B({host:t,transport:a,device:n,owner:r,input:e,signal:i}),screenRecordingReattach:async()=>({status:`unreattachable`,reason:`transport-not-reattachable`,message:`Web recordings cannot be reattached after daemon restart.`}),screenRecordingCleanup:async()=>V()}}:{available:!1,operations:{}}}async function B(n){let{host:r,transport:i,device:a,owner:o,input:s,signal:c}=n;if(s.recordOnlySession)throw new e(`INVALID_ARGS`,`record on web requires an active browser session; run open <url> --platform web first`);if(!s.outputPath.toLowerCase().endsWith(`.webm`))throw new e(`INVALID_ARGS`,`web recordings require a .webm output path; agent-browser records WebM directly`);N(s,{scopes:[`app`],fps:!1,exportQuality:!1,hideTouches:!1},e=>`web recordings do not support ${e.join(`, `)}; agent-browser records WebM directly`),c.throwIfAborted(),await r.screenRecording.outputs.prepare(s.outputPath);let l=!1;try{await i.start(s.outputPath,c),l=!0,c.throwIfAborted()}catch(e){throw l&&await i.stop().catch(()=>{}),c.throwIfAborted(),e}let u=!1,d=async()=>{u||=(await i.stop(),!0)},f=j({backend:`agent-browser`,outPath:s.outputPath,...s.clientOutputPath===void 0?{}:{clientOutPath:s.clientOutputPath},startedAt:Date.now(),scope:s.scope,showTouches:!1,recordOnlySession:s.recordOnlySession,...s.activeSessionApp===void 0?{}:{activeSessionApp:s.activeSessionApp},gestureEvents:[]},{finish:async e=>{await d();let t=await r.screenRecording.finalize.complete({outputPath:e.outPath,showTouches:!1,gestureEvents:e.gestureEvents,targetLabel:`web recording`});return M(e,t,{stopObservation:{recorder:`confirmed`},showTouches:!1})},forceCleanup:async()=>{try{return await d(),{status:`cleaned`}}catch(e){return{status:`cleanup-pending`,reason:`transport-failed`,message:e instanceof Error?e.message:`Web recording cleanup failed`}}}});return Object.freeze({pendingHandle:new A(f),envelope:k({resourceKind:P,sessionId:s.sessionId,device:t(a),owner:o,fence:s.fence,lifecycle:`open`,descriptor:O(R,{backend:`agent-browser`,outputPath:s.outputPath})})})}function V(){return{status:`cleanup-pending`,reason:`manual-recovery-required`,message:`Web recordings cannot be cleaned after daemon restart.`}}function H(e){return L({owner:`web`,openTargetIdentity:`app-name`,binding:I({device:e.device,signal:e.signal,resolveInteractor:e.host.resolve})})}const U=n(`web`),W=Object.freeze({available:!0}),G=Object.freeze({available:!1,reason:`unsupported-platform-leaf`,hint:`Web targets read element text from the captured tree only.`}),K=Object.freeze({available:!1,reason:`unsupported-platform-leaf`}),q=Object.freeze({available:!1,reason:`owner-capability-missing`,hint:`record is not supported by this web provider`}),se=Object.freeze({available:!1,reason:`unsupported-platform-leaf`,hint:`Re-run without --actions, or target an iOS simulator.`}),J=Object.freeze({available:!1,reason:`unsupported-platform-leaf`}),ce=Object.freeze({available:!1,reason:`unsupported-platform-leaf`,hint:`apps is not supported on web targets.`}),le=Object.freeze({available:!1,reason:`unsupported-platform-leaf`}),Y=Object.freeze({available:!1,reason:`unsupported-platform-leaf`}),ue=Object.freeze({available:!1,reason:`unsupported-platform-leaf`,hint:`Apple runner preparation is supported only for Apple targets.`}),de=Object.freeze({available:!1,reason:`owner-capability-missing`}),fe=Object.freeze({available:!1,reason:`unsupported-platform-leaf`,hint:`audio on web sessions is the stateless page probe; host capture is a macOS-host operation.`});function X(e,t){return typeof e==`function`?t:de}function Z(e,t){return e?W:t}const pe=Object.freeze({available:!1,reason:`unsupported-platform-leaf`}),me=Object.freeze({available:!1,reason:`unsupported-platform-leaf`,hint:F}),Q=Object.freeze({available:!1,reason:`unsupported-device-kind`,hint:`open is supported only for web browser devices.`}),he=Object.freeze({available:!1,reason:`unsupported-device-kind`,hint:`close is supported only for web browser devices.`}),ge=Object.freeze({available:!1,reason:`unsupported-provider-mode`,hint:`Port reverse is supported only by an owning provider runtime.`});function _e(e){let t=ve(e),n=ye(e);return o({resolveOpenTarget:t,prepareApplicationOpen:t,openApplication:t,applyRuntimeHints:J,clearRuntimeHints:J,closeApplication:n,finalizeApplicationClose:n,prepareAppleRunner:ue,configureProviderPortReverse:ge})}function ve(e){return e.kind===`device`?W:Q}function ye(e){return e.kind===`device`?W:he}function be(t){return Object.freeze({owner:U,ownsDevice:e=>e.platform===`web`,inspectFacts:async e=>{let n=await t.networkTransports.resolve(e),r=await z({host:t,device:e,owner:U,signal:new AbortController().signal}),i=e.kind===`device`?await t.localInteractors.resolve(e,{}):void 0;return $(e,n,r.available,i)},bind:async n=>{if(n.intent.kind===`exact-owner`&&!r(n.intent.owner,U))throw new e(`UNSUPPORTED_OPERATION`,`Web runtime owner identity does not match`);if(n.device.platform!==`web`)throw new e(`UNSUPPORTED_PLATFORM`,`Web runtime owner cannot bind ${n.device.platform}`);let i=await t.networkTransports.resolve(n.device),a=await z({host:t,device:n.device,owner:U,signal:n.scope.signal}),o=n.device.kind===`device`?await t.localInteractors.resolve(n.device,{signal:n.scope.signal}):void 0;return xe(t,n.device,n.scope.signal,i,a,$(n.device,i,a.available,o))},shutdown:async()=>void 0})}function xe(t,n,r,o,s,l){let u=o.dump,d={...u?{networkDump:async e=>{let t=await u({maxEntries:e.maxEntries,include:e.include},r);return Object.freeze({source:`provider`,...t})}}:{},...s.operations,...l.operations.captureSnapshot.available?T({device:n,signal:r,resolveInteractor:t.localInteractors.resolve}):{},...l.operations.captureScreenshot.available?h({device:n,signal:r,resolveInteractor:t.localInteractors.resolve}):{},...l.operations.focusPoint.available?ne({device:n,signal:r,resolveInteractor:t.localInteractors.resolve}):{},...l.operations.typeText.available?ie({device:n,signal:r,resolveInteractor:t.localInteractors.resolve}):{},...i(l.operations.tapPoint,()=>c({device:n,signal:r,resolveInteractor:t.localInteractors.resolve,facts:l.operations,pause:async e=>await t.clock.sleep(e,r)})),...l.operations.scrollDirection.available?te({device:n,signal:r,resolveInteractor:t.localInteractors.resolve}):{},...l.operations.setViewport.available?{setViewport:async i=>{r.throwIfAborted();let a=await t.localInteractors.resolve(n,{signal:r});if(!a.setViewport)throw new e(`UNSUPPORTED_OPERATION`,`viewport is not supported by the bound web interactor`);await a.setViewport(i.width,i.height),r.throwIfAborted()}}:{},...i(l.operations.audioProbeQuery,()=>({audioProbeQuery:async r=>{let i=await t.audioProbe.web.resolve(n);if(i===void 0)throw new e(`UNSUPPORTED_OPERATION`,`audio is not supported by this web provider`);return await i.probe(r)}})),...a(H({host:t.localInteractors,device:n,signal:r}),l.operations)};return Object.freeze({device:n,owner:U,facts:l,operations:Object.freeze(d),[Symbol.asyncDispose]:async()=>void 0})}function $(e,t,n,r){let i=Object.freeze({available:!1,reason:`owner-capability-missing`,hint:`network is not supported by this web provider`}),a=Z(e.kind===`device`,Q);return Object.freeze({device:{family:`web`,kind:e.kind,...e.target===void 0?{}:{target:e.target},providerMode:t.mode},operations:{appLogInspect:K,appLogDoctor:K,appLogStart:K,appLogReattach:K,appLogCleanup:K,appState:le,networkDump:Z(!!t.dump,i),screenRecordingStart:Z(n,q),screenRecordingReattach:Z(n,q),screenRecordingCleanup:Z(n,q),...f({capture:a,customActions:se,withoutActiveApp:a}),...re({findText:Q}),...d({capture:a}),...p({focus:a}),...u({type:a}),...s({unsupported:J,tap:a,tapRef:X(r?.tapRef,a),longPress:J,hover:X(r?.hover,a),hoverRef:X(r?.hoverRef,a),fill:a,fillRef:X(r?.fillRef,a)}),...l({scroll:a}),...ee({unsupported:pe,targetAuthoredDrag:me}),...m({setViewport:a}),...C({readTextAtPoint:G}),...w({back:Y}),..._({home:Y}),...S({orientation:Y}),...ae({tvRemote:Y}),...oe({unsupported:Y}),...v({unsupported:Y}),...E({capture:fe,query:W}),...D({frames:Y,memorySample:Y,memorySnapshot:Y,nativeCapture:Y,profileReport:Y}),...b({appSwitcher:Y}),...g({triggerAppEvent:Y}),...y({setSetting:Y}),...x({read:Y,wait:Y,accept:Y,dismiss:Y}),ensureReady:J,bootTarget:J,bootTargetHeadless:J,listApps:ce,deployApp:J,materializeAppSource:J,deployMaterializedApp:J,sendPushNotification:J,shutdownTarget:J,..._e(e)}})}export{be as createWebPlatformRuntime};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
function e(e,t,n=e.
|
|
1
|
+
import{C as e}from"./sdk-contracts.js";import{t}from"./durable-resource.js";function n(e,t){let n=r(e),a,o=!1,s,c,l=()=>o||s!==void 0,u=e=>(o=!0,a??=t.finish(n,e).catch(e=>{throw a=void 0,e}),a),d=()=>s??=a?a.then(async e=>e.status===`completed`?{status:`cleaned`}:await t.forceCleanup(n),async()=>await t.forceCleanup(n)):t.forceCleanup(n);return Object.freeze({inspect:()=>n,appendGestureEvents:e=>{e.length===0||l()||(n=r({...n,gestureEvents:[...n.gestureEvents,...e]}))},setTouchReferenceFrame:e=>{l()||(n=r({...n,...e?{touchReferenceFrame:e}:{}}))},setRunnerSessionId:e=>{l()||e.trim().length===0||(n=r({...n,runnerSessionId:e}))},invalidate:e=>{l()||n.invalidatedReason||(n=r({...n,invalidatedReason:e}))},finish:u,forceCleanup:d,[Symbol.asyncDispose]:async()=>{c??=d().then(i),await c}})}function r(e){return Object.freeze({...e,gestureEvents:Object.freeze([...e.gestureEvents])})}function i(n){if(!t(n))throw new e(`COMMAND_FAILED`,n.message??`Screen recording cleanup could not be confirmed`,{reason:n.reason,retriable:n.reason!==`ownership-fence-lost`,hint:n.reason===`ownership-fence-lost`?`Use the current recording owner or recovery record before retrying cleanup.`:`Keep the recovery record and retry cleanup through the exact runtime owner.`})}function a(e,t,n){let{stopObservation:r,nativePathDisposition:i,showTouches:a=e.showTouches}=n;return Object.freeze({status:`completed`,result:Object.freeze({backend:e.backend,outPath:e.outPath,...e.clientOutPath===void 0?{}:{clientOutPath:e.clientOutPath},startedAt:e.startedAt,completedAt:Date.now(),stopObservation:r,...i===void 0?{}:{nativePathDisposition:i},scope:e.scope,showTouches:a,recordOnlySession:e.recordOnlySession,...e.activeSessionApp===void 0?{}:{activeSessionApp:e.activeSessionApp},...t})})}export{n,a as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{C as e}from"./sdk-contracts.js";import{D as t,T as n,w as r}from"./sdk-device.js";import{O as i,Yt as a,qt as o}from"./sdk-batch.js";import{r as s}from"./diagnostics.js";import{D as c}from"./owner-identity.js";import{i as l}from"./verified-file.js";import"./file.js";import"./diagnostics2.js";import{r as u}from"./session-paths.js";import{i as d,n as f,t as p}from"./durable-resource.js";import{n as m}from"./screen-recording-runtime.js";import h from"node:path";import g from"node:fs";import ee from"node:crypto";function _(e){return e.length===0?e:e[0].toUpperCase()+e.slice(1)}function v(e){return e.replaceAll(`-`,`_`)}async function te(e,t,n){let r={kind:`pending`};try{let i=ce(ae(e,t),`active`);e.store.write(n,i),r={kind:`persisted`},t.throwIfCanceled();let a=t.pendingHandle.transfer();r={kind:`transferred`,handle:a},t.sessionStore.set(t.sessionName,e.sessionSlot.replace(t.session,{handle:a,envelope:i}))}catch(i){throw await ne(e,t,n,r,i),i}}async function ne(e,t,n,r,i){let a=r.kind!==`pending`||ie(e,t,n),o=re(e,t,n,await y(t,r));t.reportUndurableCleanup(t.device,!a&&o.cleanupError===void 0||o.confirmed?{confirmed:!0}:{confirmed:!1,reason:o.cleanupError instanceof Error?o.cleanupError.message:`The durable cleanup transition could not be confirmed`}),o.cleanupError!==void 0&&x(e,t,i,o.cleanupError)}function re(e,t,n,r){try{return{confirmed:se(e,n,t.fence,r),cleanupError:r}}catch(n){return s({level:`error`,phase:`${v(e.resourceKind)}_pending_adoption_transition_failed`,data:{session:t.sessionName,transitionError:n instanceof Error?n.message:String(n)}}),{confirmed:!1,cleanupError:r??n}}}async function y(e,t){try{t.kind===`transferred`?await t.handle[Symbol.asyncDispose]():await e.pendingHandle[Symbol.asyncDispose]();return}catch(e){return e}}function ie(e,t,n){try{return e.store.write(n,b(e,t,t.envelope.descriptor)),!0}catch(r){try{return e.store.write(n,b(e,t,{version:0,body:{reason:`runtime-contract-invalid`}})),!0}catch(n){return s({level:`error`,phase:`${v(e.resourceKind)}_runtime_contract_tombstone_failed`,data:{session:t.sessionName,descriptorError:r instanceof Error?r.message:String(r),persistenceError:n instanceof Error?n.message:String(n)}}),!1}}}function b(e,t,n){return f({resourceKind:e.resourceKind,sessionId:t.sessionName,device:r(t.device),owner:t.owner,fence:t.fence,lifecycle:`open`,descriptor:n,metadata:{phase:`runtime-contract-invalid`,runtimeContractInvalid:!0}})}function ae(t,n){let r=d(n.envelope);if(r.status===`decoded`&&oe(r.envelope,n,t.resourceKind))return r.envelope;throw new e(`COMMAND_FAILED`,`${_(t.displayName)} runtime returned an incoherent durable envelope`,{reason:`runtime-contract-invalid`,hint:`Retain the runtime diagnostics and report the selected device and owner.`})}function oe(e,n,i){return e.resourceKind===i&&e.sessionId===n.sessionName&&t(e.device,r(n.device))&&a(e.owner)===a(n.owner)&&e.fence.token===n.fence.token&&e.fence.generation===n.fence.generation&&e.lifecycle===`open`}function se(e,t,n,r){let i=e.store.read(t);return i.status!==`decoded`||i.envelope.fence.token!==n.token||i.envelope.fence.generation!==n.generation?!1:(e.store.write(t,{...i.envelope,lifecycle:r===void 0?`completed`:`open`,metadata:{...i.envelope.metadata??{},phase:r===void 0?`completed`:`cleanup-pending`,cleanupStatus:r===void 0?`cleaned`:`cleanup-pending`}}),!0)}function x(e,t,n,r){s({level:`error`,phase:`${v(e.resourceKind)}_pending_adoption_cleanup_failed`,data:{session:t.sessionName,primaryError:n instanceof Error?n.message:String(n),cleanupError:r instanceof Error?r.message:String(r)}})}function ce(e,t){return Object.freeze({...e,lifecycle:`open`,metadata:{...e.metadata??{},phase:t}})}async function S(e){e.scope.signal.throwIfAborted();let t=new AbortController,n={...e.scope,signal:AbortSignal.any([e.scope.signal,t.signal])},r=()=>{},i=new Promise((e,t)=>{r=t}),a=()=>{},o=new Promise((t,n)=>{let r=()=>{try{e.scope.signal.throwIfAborted()}catch(e){n(e)}};if(e.scope.signal.aborted){r();return}e.scope.signal.addEventListener(`abort`,r,{once:!0}),a=()=>e.scope.signal.removeEventListener(`abort`,r)}),s=setTimeout(()=>{let n=new w(e.displayName,e.deadlineMs);t.abort(n),r(n)},e.deadlineMs);s.unref?.();let c=ue(e,n),l,u=c.then(e=>(l??={kind:`acquisition`},e),e=>{throw l??={kind:`acquisition-error`},e}),d=i.catch(e=>{throw l??={kind:`deadline`,error:e},e}),f=o.catch(e=>{throw l??={kind:`cancellation`,error:e},e});try{return await Promise.race([u,d,f])}finally{if(clearTimeout(s),a(),l?.kind===`deadline`||l?.kind===`cancellation`){let t=l.error;c.then(n=>le(e,n,t),()=>{}).catch(()=>{})}else c.catch(()=>{})}}async function le(e,t,n){try{t.reattached.status===`active`&&await C(e,t.reattached.handle,`late_handle_cleanup_failed`,n)}finally{await C(e,t.control,`late_control_cleanup_failed`,n)}}async function ue(e,t){let n,r;try{return n=await e.acquireControl(e.envelope,t),t.signal.throwIfAborted(),r=await n.reattach(e.envelope),t.signal.throwIfAborted(),{control:n,reattached:r}}catch(t){try{r?.status===`active`&&await C(e,r.handle,`late_handle_cleanup_failed`,t)}finally{n&&await C(e,n,`late_control_cleanup_failed`,t)}throw t}}async function C(e,t,n,r){try{await t[Symbol.asyncDispose]()}catch(t){e.onLateCleanupFailure(n,t,r)}}var w=class extends Error{deadlineMs;constructor(e,t){super(`${_(e)} recovery exceeded its ${t}ms deadline`),this.name=`DurableCaptureRecoveryDeadlineError`,this.deadlineMs=t}};const T=new Map;async function E(e){return await de(e.resourcePath,async()=>{let t=e.store.read(e.resourcePath);if(t.status!==`decoded`)throw O(e.store,t.status===`missing`?`${e.store.displayName} resource record is missing`:`${e.store.displayName} resource record is unreattachable: ${t.message}`);if(!D(t.envelope.fence,e.expected))throw O(e.store,`${e.store.displayName} resource ownership fence was lost`);let n=t.envelope;return await e.run({get envelope(){return n},transition(t,r={}){return n=Object.freeze({...n,lifecycle:t,...r.descriptor===void 0?{}:{descriptor:r.descriptor},...r.metadata===void 0?{}:{metadata:r.metadata}}),e.store.write(e.resourcePath,n),n}})})}function D(e,t){return e.token===t.token&&e.generation===t.generation}async function de(e,t){let n=T.get(e)??Promise.resolve(),r,i=new Promise(e=>{r=e}),a=n.catch(()=>{}).then(()=>i);T.set(e,a),await n.catch(()=>{});try{return await t()}finally{r(),T.get(e)===a&&T.delete(e)}}function O(t,n){return new e(`COMMAND_FAILED`,n,{reason:`ownership-fence-lost`,retriable:!1,hint:`Use the current ${t.displayName.toLowerCase()} resource owner or retain the recovery record for manual recovery.`})}async function fe(t,n,r){let i=t.sessionSlot.read(n.session);if(!i)throw new e(`INVALID_ARGS`,t.messages.noActive);try{let e=await k(t,{handle:i.handle,fence:i.envelope.fence,resourcePath:r,intent:n.intent});return M(t,n),e}catch(e){let i=t.store.read(r);throw i.status===`decoded`&&i.envelope.lifecycle===`completed`&&M(t,n),e}}async function k(e,t){return await E({store:e.store,resourcePath:t.resourcePath,expected:t.fence,run:async n=>{R(n);let r;try{r=await t.handle.finish()}catch(r){throw await A(e,n,t,r,t.intent),r}if(r.status===`completed`)return L(e,n,r),r.result;L(e,n,r);let i=I(e,r);throw await A(e,n,t,i,t.intent),i}})}async function A(e,t,n,r,i){if(i===`capture`&&e.failedFinishPolicy===`preserve-retry-material`){me(e,n,r);return}let a;try{a=await n.handle.forceCleanup()}catch(i){j(e,n,r,i,pe(t,i));return}try{P(t,a)}catch(t){j(e,n,r,a.status===`cleanup-pending`?a.message??a.reason:`cleanup returned ${a.status}`,t);return}p(a)||j(e,n,r,a.message)}function pe(e,t){try{P(e,{status:`cleanup-pending`,reason:`cleanup-unconfirmed`,message:N(t)});return}catch(e){return e}}function me(e,t,n){s({level:`error`,phase:`${v(e.resourceKind)}_finish_evidence_preserved`,data:{resourcePath:t.resourcePath,finishError:N(n),failedFinishPolicy:e.failedFinishPolicy}})}function j(e,t,n,r,i){s({level:`error`,phase:`${v(e.resourceKind)}_finish_cleanup_failed`,data:{resourcePath:t.resourcePath,finishError:N(n),cleanupError:r===void 0?`cleanup could not be confirmed`:N(r),...i===void 0?{}:{transitionError:N(i)}}})}function M(e,t){t.sessionStore.set(t.sessionName,e.sessionSlot.replace(t.session,void 0))}function N(e){return e instanceof Error?e.message:String(e)}async function he(e,t){let n=e.sessionSlot.read(t.session);n&&(F(e,await E({store:e.store,resourcePath:t.resourcePath,expected:n.envelope.fence,run:async e=>{R(e);let t=await n.handle.forceCleanup();return P(e,t),t}})),t.sessionStore&&t.sessionName&&t.sessionStore.set(t.sessionName,e.sessionSlot.replace(t.session,void 0)))}function P(e,t){e.transition(p(t)?`completed`:`open`,{metadata:{...e.envelope.metadata??{},phase:p(t)?`completed`:`cleanup-pending`,cleanupStatus:t.status,...t.status===`cleanup-pending`?{cleanupPendingReason:t.reason,...t.message?{cleanupPendingMessage:t.message}:{}}:{}}})}function F(e,t){if(!p(t))throw I(e,t)}function I(t,n){return new e(`COMMAND_FAILED`,n.message??`${_(t.displayName)} cleanup could not be confirmed`,{reason:n.reason,retriable:n.reason!==`ownership-fence-lost`,hint:t.messages.cleanupPendingHint})}function L(e,t,n){if(n.status===`completed`){t.transition(`completed`,{metadata:{...t.envelope.metadata??{},...e.completionMetadata(n.result),phase:`completed`}});return}P(t,n)}function R(e){e.transition(`open`,{metadata:{...e.envelope.metadata??{},phase:`completing`}})}async function ge(e){let t=e.definition.store.list(e.sessionsDir),n=[];for(let r of t)n.push(await z(e,r));return{scanned:t.length,recovered:n.filter(e=>e===`recovered`).length,retained:n.filter(e=>e===`retained`).length}}async function z(e,t){let n=_e(e,t);if(n.status!==`recoverable`)return n.status;try{return await ve(e,t,n.envelope,e.perRecordDeadlineMs??5e3)?`recovered`:`retained`}catch(n){return H(e,n instanceof w?`timed_out`:`failed`,t,{error:n instanceof Error?n.message:String(n),...n instanceof w?{deadlineMs:n.deadlineMs}:{}}),`retained`}}function _e(e,t){let n=e.definition.store.read(t);if(n.status===`unreattachable`)return H(e,`record_unreattachable`,t,{reason:n.reason,message:n.message,version:n.version}),{status:`retained`};if(n.status===`missing`||n.envelope.lifecycle===`completed`)return{status:`ignored`};let r=e.definition.store.resolvePath(e.resolveSessionDir(n.envelope.sessionId));return h.resolve(t)===h.resolve(r)?{status:`recoverable`,envelope:n.envelope}:(H(e,`session_path_mismatch`,t,{envelopeSessionId:n.envelope.sessionId,canonicalPath:r}),{status:`retained`})}async function ve(e,t,n,r){return await ye(e,t,n,await S({displayName:e.definition.displayName,envelope:n,scope:e.scope,deadlineMs:r,acquireControl:e.acquireControl,onLateCleanupFailure:(n,r,i)=>H(e,n,t,{error:r instanceof Error?r.message:String(r),primaryError:i instanceof Error?i.message:String(i)})}))}async function ye(e,t,n,r){try{switch(r.reattached.status){case`active`:{let i=r.reattached.handle,a=await E({store:e.definition.store,resourcePath:t,expected:n.fence,run:async e=>{be(e);let t=await i.forceCleanup();return P(e,t),t}});return p(a)}case`completed`:return await B(e,t,n,{...e.definition.completionMetadata(r.reattached.result)}),!0;case`missing`:return await B(e,t,n,{recoveryStatus:`already-missing`}),!0;case`unreattachable`:{if(!V(r.reattached.reason))return H(e,`retained`,t,{reason:r.reattached.reason,message:r.reattached.message}),!1;let i=await r.control.cleanup(n);return await E({store:e.definition.store,resourcePath:t,expected:n.fence,run:async e=>P(e,i)}),p(i)}}}finally{await r.control[Symbol.asyncDispose]()}}async function B(e,t,n,r){await E({store:e.definition.store,resourcePath:t,expected:n.fence,run:async e=>{e.transition(`completed`,{metadata:{...e.envelope.metadata??{},phase:`completed`,...r}})}})}function be(e){e.transition(`open`,{metadata:{...e.envelope.metadata??{},phase:`completing`}})}function V(e){switch(e){case`descriptor-invalid`:case`descriptor-version-unsupported`:case`ownership-fence-lost`:return!1;case`owner-unavailable`:case`transport-not-reattachable`:return!0}}function H(e,t,n,r){let i={phase:`${v(e.definition.resourceKind)}_recovery_${t}`,resourcePath:n,data:r};e.onDiagnostic?e.onDiagnostic(i):s({level:`warn`,phase:i.phase,data:{resourcePath:n,...r}})}async function xe(t,n){let r=t.store.read(n.resourcePath);if(r.status!==`decoded`||r.envelope.lifecycle!==`open`)throw Se(t,r.status);let i=r.envelope,a=await S({displayName:t.displayName,envelope:i,scope:n.scope,deadlineMs:n.deadlineMs??5e3,acquireControl:n.acquireControl,onLateCleanupFailure:(e,r,i)=>n.scope.diagnostics.emit({level:`error`,phase:`${v(t.resourceKind)}_recovery_${e}`,data:{resourcePath:n.resourcePath,error:U(r),primaryError:U(i)}})});try{switch(a.reattached.status){case`active`:return await k(t,{handle:a.reattached.handle,fence:i.fence,resourcePath:n.resourcePath,intent:`capture`});case`completed`:{let e=a.reattached.result;return await E({store:t.store,resourcePath:n.resourcePath,expected:i.fence,run:async n=>{L(t,n,{status:`completed`,result:e,alreadyCompleted:!0})}}),e}case`missing`:throw new e(`COMMAND_FAILED`,`${_(t.displayName)} is missing`,{reason:`resource-missing`,hint:t.messages.cleanupPendingHint});case`unreattachable`:if(V(a.reattached.reason)){let e=await a.control.cleanup(i);await E({store:t.store,resourcePath:n.resourcePath,expected:i.fence,run:async t=>P(t,e)}),F(t,e)}throw new e(`COMMAND_FAILED`,a.reattached.message??`${_(t.displayName)} cannot be reattached`,{reason:a.reattached.reason,hint:t.messages.cleanupPendingHint})}}finally{await a.control[Symbol.asyncDispose]()}}function Se(t,n){return new e(`INVALID_ARGS`,n===`missing`?t.messages.noActive:`${_(t.displayName)} recovery record is not open`)}function U(e){return e instanceof Error?e.message:String(e)}function W(e){we(e.fileName);let t=t=>h.join(t,e.fileName);return Object.freeze({resourceKind:e.resourceKind,displayName:e.displayName,resolvePath:t,read(t){let n,r;try{if(n=l(t),n===void 0)return{status:`missing`};r=JSON.parse(g.readFileSync(n,`utf8`))}catch(t){return K(t)?{status:`missing`}:G(Ee(t,e.displayName))}finally{n!==void 0&&g.closeSync(n)}return Ce(d(r),e.resourceKind)},write(e,t){let n=h.dirname(e);g.mkdirSync(n,{recursive:!0}),c({destination:e,contents:`${JSON.stringify(t)}\n`})},list(e){let n;try{n=g.readdirSync(e,{withFileTypes:!0})}catch{return[]}return n.filter(e=>e.isDirectory()).map(n=>t(h.join(e,n.name))).filter(Te).sort()}})}function Ce(e,t){return e.status===`decoded`?e.envelope.resourceKind===t?{status:`decoded`,envelope:e.envelope}:G(`Expected ${t} resource record, received ${e.envelope.resourceKind}`):e}function we(e){if(e.length===0||h.basename(e)!==e)throw TypeError(`Durable capture resource fileName must be one file name`)}function Te(e){try{return g.lstatSync(e),!0}catch(e){return!K(e)}}function G(e){return{status:`unreattachable`,reason:`descriptor-invalid`,message:e}}function K(e){return typeof e==`object`&&!!e&&`code`in e&&e.code===`ENOENT`}function Ee(e,t){return e instanceof Error?e.message:`${t} resource record is invalid`}function De(e,t){t.admissionLedger.assertStartAllowed(t.device),Oe(e,t.resourcePath,t.device);let n=e.store.read(t.resourcePath);return Object.freeze({token:ee.randomUUID(),generation:n.status===`decoded`?n.envelope.fence.generation+1:1})}function Oe(t,i,a){let o=n(r(a));for(let r of t.store.list(h.dirname(h.dirname(i)))){let a=t.store.read(r);if(a.status===`unreattachable`)throw new e(`COMMAND_FAILED`,`${_(q(t.displayName))} ${t.displayName} recovery record is unreattachable: ${a.message}`,{reason:a.reason,retriable:!1,hint:`Retain the corrupt or future-version ${t.displayName} manifest for manual recovery; no replacement capture is safe.`});if(a.status===`decoded`&&a.envelope.lifecycle!==`completed`&&(r===i||n(a.envelope.device)===o))throw new e(`COMMAND_FAILED`,`${_(q(t.displayName))} ${t.displayName} resource for this device has not reached a confirmed terminal state`,{reason:`cleanup-unconfirmed`,hint:`Retry exact-owner cleanup using the existing ${t.displayName} manifest before starting a replacement.`})}}function q(e){return/^[aeiou]/i.test(e)?`an`:`a`}function J(e){let t=(t,n)=>e.store.resolvePath(t.resolveSessionDir(n)),n=t=>({definition:e,resolveSessionDir:e=>h.join(t.sessionsDir,u(e)),...t});return Object.freeze({store:e.store,resourcePath:t,createNextFence(t){return De(e,t)},adoptStarted(n){return te(e,{...n,reportUndurableCleanup:(e,t)=>{t.confirmed?n.admissionLedger.clearUndurableCleanup(e):n.admissionLedger.blockUndurableCleanup(e,t.reason)}},t(n.sessionStore,n.sessionName))},finishLive(n){return fe(e,n,t(n.sessionStore,n.sessionName))},finishRecovered(t){return xe(e,t)},forceCleanupLive(t){return he(e,t)},recoverAll(e){return ge(n(e))},recoverOne(e,t){return z(n(e),t)}})}const Y=J({resourceKind:`screen-recording`,displayName:`screen recording`,store:W({resourceKind:m,fileName:`screen-recording.resource.json`,displayName:`screen recording`}),sessionSlot:{read:e=>e.screenRecording,replace:(e,t)=>({...e,screenRecording:t})},completionMetadata:je,failedFinishPolicy:`preserve-retry-material`,messages:{noActive:`no active recording`,cleanupPendingHint:`Keep screen-recording.resource.json and retry stop through its exact runtime owner.`}});function ke(e){return Y.adoptStarted(e)}function Ae(e){return Y.finishLive(e)}const X=`completion`;function je(e){return{[X]:{backend:e.backend,outPath:e.outPath,startedAt:e.startedAt,completedAt:e.completedAt,...e.capturedDurationMs===void 0?{}:{capturedDurationMs:e.capturedDurationMs},scope:e.scope,showTouches:e.showTouches,recordOnlySession:e.recordOnlySession,...e.clientOutPath===void 0?{}:{clientOutPath:e.clientOutPath},...e.telemetryPath===void 0?{}:{telemetryPath:e.telemetryPath},...e.warning===void 0?{}:{warning:e.warning},...e.overlayWarning===void 0?{}:{overlayWarning:e.overlayWarning},...e.activeSessionApp===void 0?{}:{activeSessionApp:Me(e.activeSessionApp)},...e.chunks===void 0?{}:{chunks:e.chunks.map(Ne)}}}}function Me(e){return{bundleId:e.bundleId,...e.name===void 0?{}:{name:e.name}}}function Ne(e){return{index:e.index,path:e.path,...e.clientOutPath===void 0?{}:{clientOutPath:e.clientOutPath}}}function Pe(e){return Y.finishRecovered(e)}async function Z(e){let t;try{return t=await e.gateway.bind({device:Q(e.envelope),intent:{kind:`exact-owner`,owner:e.envelope.owner,fence:e.envelope.fence},scope:e.scope}),e.scope.signal.throwIfAborted(),e.create(t)}catch(e){throw t&&await t[Symbol.asyncDispose](),e}}function Q(e){return{platform:e.device.family,id:e.device.id,name:e.device.id,kind:e.device.kind,...e.device.target===void 0?{}:{target:e.device.target},...e.device.appleOs===void 0?{}:{appleOs:e.device.appleOs},...e.device.iosPhysicalDeviceBackend===void 0?{}:{iosPhysicalDeviceBackend:e.device.iosPhysicalDeviceBackend}}}function Fe(e){return Y.recoverOne({sessionsDir:e.sessionsDir,scope:e.scope,perRecordDeadlineMs:e.perRecordDeadlineMs,onDiagnostic:e.onDiagnostic,acquireControl:async(t,n)=>await Ie(e.gateway,t,n)},e.resourcePath)}async function Ie(e,t,n){return await Z({gateway:e,envelope:t,scope:n,create:e=>$({runtime:o(e,i),dispose:async()=>await e[Symbol.asyncDispose]()})})}function $(e){return Object.freeze({reattach:async t=>await e.runtime.operations.screenRecordingReattach({envelope:t}),cleanup:async t=>await e.runtime.operations.screenRecordingCleanup({envelope:t}),[Symbol.asyncDispose]:e.dispose})}export{ke as a,Y as c,X as i,J as l,Fe as n,Ae as o,Z as r,Pe as s,$ as t,W as u};
|
|
1
|
+
import{C as e}from"./sdk-contracts.js";import{D as t,T as n,w as r}from"./sdk-device.js";import{O as i,Yt as a,qt as o}from"./sdk-batch.js";import{r as s}from"./diagnostics.js";import{E as c}from"./owner-identity.js";import{i as l}from"./verified-file.js";import"./file.js";import"./diagnostics2.js";import{r as u}from"./session-paths.js";import{i as d,n as f,t as p}from"./durable-resource.js";import{n as m}from"./screen-recording-runtime.js";import h from"node:path";import g from"node:fs";import ee from"node:crypto";function _(e){return e.length===0?e:e[0].toUpperCase()+e.slice(1)}function v(e){return e.replaceAll(`-`,`_`)}async function te(e,t,n){let r={kind:`pending`};try{let i=ce(ie(e,t),`active`);e.store.write(n,i),r={kind:`persisted`},t.throwIfCanceled();let a=t.pendingHandle.transfer();r={kind:`transferred`,handle:a},t.sessionStore.set(t.sessionName,e.sessionSlot.replace(t.session,{handle:a,envelope:i}))}catch(i){throw await ne(e,t,n,r,i),i}}async function ne(e,t,n,r,i){let a=r.kind!==`pending`||b(e,t,n),o=re(e,t,n,await y(t,r));t.reportUndurableCleanup(t.device,!a&&o.cleanupError===void 0||o.confirmed?{confirmed:!0}:{confirmed:!1,reason:o.cleanupError instanceof Error?o.cleanupError.message:`The durable cleanup transition could not be confirmed`}),o.cleanupError!==void 0&&se(e,t,i,o.cleanupError)}function re(e,t,n,r){try{return{confirmed:oe(e,n,t.fence,r),cleanupError:r}}catch(n){return s({level:`error`,phase:`${v(e.resourceKind)}_pending_adoption_transition_failed`,data:{session:t.sessionName,transitionError:n instanceof Error?n.message:String(n)}}),{confirmed:!1,cleanupError:r??n}}}async function y(e,t){try{t.kind===`transferred`?await t.handle[Symbol.asyncDispose]():await e.pendingHandle[Symbol.asyncDispose]();return}catch(e){return e}}function b(e,t,n){try{return e.store.write(n,x(e,t,t.envelope.descriptor)),!0}catch(r){try{return e.store.write(n,x(e,t,{version:0,body:{reason:`runtime-contract-invalid`}})),!0}catch(n){return s({level:`error`,phase:`${v(e.resourceKind)}_runtime_contract_tombstone_failed`,data:{session:t.sessionName,descriptorError:r instanceof Error?r.message:String(r),persistenceError:n instanceof Error?n.message:String(n)}}),!1}}}function x(e,t,n){return f({resourceKind:e.resourceKind,sessionId:t.sessionName,device:r(t.device),owner:t.owner,fence:t.fence,lifecycle:`open`,descriptor:n,metadata:{phase:`runtime-contract-invalid`,runtimeContractInvalid:!0}})}function ie(t,n){let r=d(n.envelope);if(r.status===`decoded`&&ae(r.envelope,n,t.resourceKind))return r.envelope;throw new e(`COMMAND_FAILED`,`${_(t.displayName)} runtime returned an incoherent durable envelope`,{reason:`runtime-contract-invalid`,hint:`Retain the runtime diagnostics and report the selected device and owner.`})}function ae(e,n,i){return e.resourceKind===i&&e.sessionId===n.sessionName&&t(e.device,r(n.device))&&a(e.owner)===a(n.owner)&&e.fence.token===n.fence.token&&e.fence.generation===n.fence.generation&&e.lifecycle===`open`}function oe(e,t,n,r){let i=e.store.read(t);return i.status!==`decoded`||i.envelope.fence.token!==n.token||i.envelope.fence.generation!==n.generation?!1:(e.store.write(t,{...i.envelope,lifecycle:r===void 0?`completed`:`open`,metadata:{...i.envelope.metadata??{},phase:r===void 0?`completed`:`cleanup-pending`,cleanupStatus:r===void 0?`cleaned`:`cleanup-pending`}}),!0)}function se(e,t,n,r){s({level:`error`,phase:`${v(e.resourceKind)}_pending_adoption_cleanup_failed`,data:{session:t.sessionName,primaryError:n instanceof Error?n.message:String(n),cleanupError:r instanceof Error?r.message:String(r)}})}function ce(e,t){return Object.freeze({...e,lifecycle:`open`,metadata:{...e.metadata??{},phase:t}})}async function S(e){e.scope.signal.throwIfAborted();let t=new AbortController,n={...e.scope,signal:AbortSignal.any([e.scope.signal,t.signal])},r=()=>{},i=new Promise((e,t)=>{r=t}),a=()=>{},o=new Promise((t,n)=>{let r=()=>{try{e.scope.signal.throwIfAborted()}catch(e){n(e)}};if(e.scope.signal.aborted){r();return}e.scope.signal.addEventListener(`abort`,r,{once:!0}),a=()=>e.scope.signal.removeEventListener(`abort`,r)}),s=setTimeout(()=>{let n=new w(e.displayName,e.deadlineMs);t.abort(n),r(n)},e.deadlineMs);s.unref?.();let c=ue(e,n),l,u=c.then(e=>(l??={kind:`acquisition`},e),e=>{throw l??={kind:`acquisition-error`},e}),d=i.catch(e=>{throw l??={kind:`deadline`,error:e},e}),f=o.catch(e=>{throw l??={kind:`cancellation`,error:e},e});try{return await Promise.race([u,d,f])}finally{if(clearTimeout(s),a(),l?.kind===`deadline`||l?.kind===`cancellation`){let t=l.error;c.then(n=>le(e,n,t),()=>{}).catch(()=>{})}else c.catch(()=>{})}}async function le(e,t,n){try{t.reattached.status===`active`&&await C(e,t.reattached.handle,`late_handle_cleanup_failed`,n)}finally{await C(e,t.control,`late_control_cleanup_failed`,n)}}async function ue(e,t){let n,r;try{return n=await e.acquireControl(e.envelope,t),t.signal.throwIfAborted(),r=await n.reattach(e.envelope),t.signal.throwIfAborted(),{control:n,reattached:r}}catch(t){try{r?.status===`active`&&await C(e,r.handle,`late_handle_cleanup_failed`,t)}finally{n&&await C(e,n,`late_control_cleanup_failed`,t)}throw t}}async function C(e,t,n,r){try{await t[Symbol.asyncDispose]()}catch(t){e.onLateCleanupFailure(n,t,r)}}var w=class extends Error{deadlineMs;constructor(e,t){super(`${_(e)} recovery exceeded its ${t}ms deadline`),this.name=`DurableCaptureRecoveryDeadlineError`,this.deadlineMs=t}};const T=new Map;async function E(e){return await fe(e.resourcePath,async()=>{let t=e.store.read(e.resourcePath);if(t.status!==`decoded`)throw D(e.store,t.status===`missing`?`${e.store.displayName} resource record is missing`:`${e.store.displayName} resource record is unreattachable: ${t.message}`);if(!de(t.envelope.fence,e.expected))throw D(e.store,`${e.store.displayName} resource ownership fence was lost`);let n=t.envelope;return await e.run({get envelope(){return n},transition(t,r={}){return n=Object.freeze({...n,lifecycle:t,...r.descriptor===void 0?{}:{descriptor:r.descriptor},...r.metadata===void 0?{}:{metadata:r.metadata}}),e.store.write(e.resourcePath,n),n}})})}function de(e,t){return e.token===t.token&&e.generation===t.generation}async function fe(e,t){let n=T.get(e)??Promise.resolve(),r,i=new Promise(e=>{r=e}),a=n.catch(()=>{}).then(()=>i);T.set(e,a),await n.catch(()=>{});try{return await t()}finally{r(),T.get(e)===a&&T.delete(e)}}function D(t,n){return new e(`COMMAND_FAILED`,n,{reason:`ownership-fence-lost`,retriable:!1,hint:`Use the current ${t.displayName.toLowerCase()} resource owner or retain the recovery record for manual recovery.`})}async function pe(t,n,r){let i=t.sessionSlot.read(n.session);if(!i)throw new e(`INVALID_ARGS`,t.messages.noActive);try{let e=await O(t,{handle:i.handle,fence:i.envelope.fence,resourcePath:r,intent:n.intent});return j(t,n),e}catch(e){let i=t.store.read(r);throw i.status===`decoded`&&i.envelope.lifecycle===`completed`&&j(t,n),e}}async function O(e,t){return await E({store:e.store,resourcePath:t.resourcePath,expected:t.fence,run:async n=>{R(n);let r=L(n),i;try{i=await t.handle.finish(r)}catch(r){throw await k(e,n,t,r,t.intent),r}if(i.status===`completed`)return I(e,n,i),i.result;I(e,n,i);let a=F(e,i);throw await k(e,n,t,a,t.intent),a}})}async function k(e,t,n,r,i){if(i===`capture`&&e.failedFinishPolicy===`preserve-retry-material`){he(e,n,r);return}let a;try{a=await n.handle.forceCleanup()}catch(i){A(e,n,r,i,me(t,i));return}try{N(t,a)}catch(t){A(e,n,r,a.status===`cleanup-pending`?a.message??a.reason:`cleanup returned ${a.status}`,t);return}p(a)||A(e,n,r,a.message)}function me(e,t){try{N(e,{status:`cleanup-pending`,reason:`cleanup-unconfirmed`,message:M(t)});return}catch(e){return e}}function he(e,t,n){s({level:`error`,phase:`${v(e.resourceKind)}_finish_evidence_preserved`,data:{resourcePath:t.resourcePath,finishError:M(n),failedFinishPolicy:e.failedFinishPolicy}})}function A(e,t,n,r,i){s({level:`error`,phase:`${v(e.resourceKind)}_finish_cleanup_failed`,data:{resourcePath:t.resourcePath,finishError:M(n),cleanupError:r===void 0?`cleanup could not be confirmed`:M(r),...i===void 0?{}:{transitionError:M(i)}}})}function j(e,t){t.sessionStore.set(t.sessionName,e.sessionSlot.replace(t.session,void 0))}function M(e){return e instanceof Error?e.message:String(e)}async function ge(e,t){let n=e.sessionSlot.read(t.session);n&&(P(e,await E({store:e.store,resourcePath:t.resourcePath,expected:n.envelope.fence,run:async e=>{R(e);let t=await n.handle.forceCleanup();return N(e,t),t}})),t.sessionStore&&t.sessionName&&t.sessionStore.set(t.sessionName,e.sessionSlot.replace(t.session,void 0)))}function N(e,t){e.transition(p(t)?`completed`:`open`,{metadata:{...e.envelope.metadata??{},phase:p(t)?`completed`:`cleanup-pending`,cleanupStatus:t.status,...t.status===`cleanup-pending`?{cleanupPendingReason:t.reason,...t.message?{cleanupPendingMessage:t.message}:{}}:{}}})}function P(e,t){if(!p(t))throw F(e,t)}function F(t,n){return new e(`COMMAND_FAILED`,n.message??`${_(t.displayName)} cleanup could not be confirmed`,{reason:n.reason,retriable:n.reason!==`ownership-fence-lost`,hint:t.messages.cleanupPendingHint})}function I(e,t,n){if(n.status===`completed`){t.transition(`completed`,{metadata:{...t.envelope.metadata??{},...e.completionMetadata(n.result),phase:`completed`}});return}N(t,n)}function L(e){return Object.freeze({learned:e.envelope.metadata,record:t=>{e.transition(`open`,{metadata:{...e.envelope.metadata??{},...t}})}})}function R(e){e.transition(`open`,{metadata:{...e.envelope.metadata??{},phase:`completing`}})}async function _e(e){let t=e.definition.store.list(e.sessionsDir),n=[];for(let r of t)n.push(await z(e,r));return{scanned:t.length,recovered:n.filter(e=>e===`recovered`).length,retained:n.filter(e=>e===`retained`).length}}async function z(e,t){let n=ve(e,t);if(n.status!==`recoverable`)return n.status;try{return await ye(e,t,n.envelope,e.perRecordDeadlineMs??5e3)?`recovered`:`retained`}catch(n){return H(e,n instanceof w?`timed_out`:`failed`,t,{error:n instanceof Error?n.message:String(n),...n instanceof w?{deadlineMs:n.deadlineMs}:{}}),`retained`}}function ve(e,t){let n=e.definition.store.read(t);if(n.status===`unreattachable`)return H(e,`record_unreattachable`,t,{reason:n.reason,message:n.message,version:n.version}),{status:`retained`};if(n.status===`missing`||n.envelope.lifecycle===`completed`)return{status:`ignored`};let r=e.definition.store.resolvePath(e.resolveSessionDir(n.envelope.sessionId));return h.resolve(t)===h.resolve(r)?{status:`recoverable`,envelope:n.envelope}:(H(e,`session_path_mismatch`,t,{envelopeSessionId:n.envelope.sessionId,canonicalPath:r}),{status:`retained`})}async function ye(e,t,n,r){return await be(e,t,n,await S({displayName:e.definition.displayName,envelope:n,scope:e.scope,deadlineMs:r,acquireControl:e.acquireControl,onLateCleanupFailure:(n,r,i)=>H(e,n,t,{error:r instanceof Error?r.message:String(r),primaryError:i instanceof Error?i.message:String(i)})}))}async function be(e,t,n,r){try{switch(r.reattached.status){case`active`:{let i=r.reattached.handle,a=await E({store:e.definition.store,resourcePath:t,expected:n.fence,run:async e=>{xe(e);let t=await i.forceCleanup();return N(e,t),t}});return p(a)}case`completed`:return await B(e,t,n,{...e.definition.completionMetadata(r.reattached.result)}),!0;case`missing`:return await B(e,t,n,{recoveryStatus:`already-missing`}),!0;case`unreattachable`:{if(!V(r.reattached.reason))return H(e,`retained`,t,{reason:r.reattached.reason,message:r.reattached.message}),!1;let i=await r.control.cleanup(n);return await E({store:e.definition.store,resourcePath:t,expected:n.fence,run:async e=>N(e,i)}),p(i)}}}finally{await r.control[Symbol.asyncDispose]()}}async function B(e,t,n,r){await E({store:e.definition.store,resourcePath:t,expected:n.fence,run:async e=>{e.transition(`completed`,{metadata:{...e.envelope.metadata??{},phase:`completed`,...r}})}})}function xe(e){e.transition(`open`,{metadata:{...e.envelope.metadata??{},phase:`completing`}})}function V(e){switch(e){case`descriptor-invalid`:case`descriptor-version-unsupported`:case`ownership-fence-lost`:return!1;case`owner-unavailable`:case`transport-not-reattachable`:return!0}}function H(e,t,n,r){let i={phase:`${v(e.definition.resourceKind)}_recovery_${t}`,resourcePath:n,data:r};e.onDiagnostic?e.onDiagnostic(i):s({level:`warn`,phase:i.phase,data:{resourcePath:n,...r}})}async function Se(t,n){let r=t.store.read(n.resourcePath);if(r.status!==`decoded`||r.envelope.lifecycle!==`open`)throw Ce(t,r.status);let i=r.envelope,a=await S({displayName:t.displayName,envelope:i,scope:n.scope,deadlineMs:n.deadlineMs??5e3,acquireControl:n.acquireControl,onLateCleanupFailure:(e,r,i)=>n.scope.diagnostics.emit({level:`error`,phase:`${v(t.resourceKind)}_recovery_${e}`,data:{resourcePath:n.resourcePath,error:U(r),primaryError:U(i)}})});try{switch(a.reattached.status){case`active`:return await O(t,{handle:a.reattached.handle,fence:i.fence,resourcePath:n.resourcePath,intent:`capture`});case`completed`:{let e=a.reattached.result;return await E({store:t.store,resourcePath:n.resourcePath,expected:i.fence,run:async n=>{I(t,n,{status:`completed`,result:e,alreadyCompleted:!0})}}),e}case`missing`:throw new e(`COMMAND_FAILED`,`${_(t.displayName)} is missing`,{reason:`resource-missing`,hint:t.messages.cleanupPendingHint});case`unreattachable`:if(V(a.reattached.reason)){let e=await a.control.cleanup(i);await E({store:t.store,resourcePath:n.resourcePath,expected:i.fence,run:async t=>N(t,e)}),P(t,e)}throw new e(`COMMAND_FAILED`,a.reattached.message??`${_(t.displayName)} cannot be reattached`,{reason:a.reattached.reason,hint:t.messages.cleanupPendingHint})}}finally{await a.control[Symbol.asyncDispose]()}}function Ce(t,n){return new e(`INVALID_ARGS`,n===`missing`?t.messages.noActive:`${_(t.displayName)} recovery record is not open`)}function U(e){return e instanceof Error?e.message:String(e)}function W(e){Te(e.fileName);let t=t=>h.join(t,e.fileName);return Object.freeze({resourceKind:e.resourceKind,displayName:e.displayName,resolvePath:t,read(t){let n,r;try{if(n=l(t),n===void 0)return{status:`missing`};r=JSON.parse(g.readFileSync(n,`utf8`))}catch(t){return K(t)?{status:`missing`}:G(De(t,e.displayName))}finally{n!==void 0&&g.closeSync(n)}return we(d(r),e.resourceKind)},write(e,t){let n=h.dirname(e);g.mkdirSync(n,{recursive:!0}),c({destination:e,contents:`${JSON.stringify(t)}\n`})},list(e){let n;try{n=g.readdirSync(e,{withFileTypes:!0})}catch{return[]}return n.filter(e=>e.isDirectory()).map(n=>t(h.join(e,n.name))).filter(Ee).sort()}})}function we(e,t){return e.status===`decoded`?e.envelope.resourceKind===t?{status:`decoded`,envelope:e.envelope}:G(`Expected ${t} resource record, received ${e.envelope.resourceKind}`):e}function Te(e){if(e.length===0||h.basename(e)!==e)throw TypeError(`Durable capture resource fileName must be one file name`)}function Ee(e){try{return g.lstatSync(e),!0}catch(e){return!K(e)}}function G(e){return{status:`unreattachable`,reason:`descriptor-invalid`,message:e}}function K(e){return typeof e==`object`&&!!e&&`code`in e&&e.code===`ENOENT`}function De(e,t){return e instanceof Error?e.message:`${t} resource record is invalid`}function Oe(e,t){t.admissionLedger.assertStartAllowed(t.device),ke(e,t.resourcePath,t.device);let n=e.store.read(t.resourcePath);return Object.freeze({token:ee.randomUUID(),generation:n.status===`decoded`?n.envelope.fence.generation+1:1})}function ke(t,i,a){let o=n(r(a));for(let r of t.store.list(h.dirname(h.dirname(i)))){let a=t.store.read(r);if(a.status===`unreattachable`)throw new e(`COMMAND_FAILED`,`${_(q(t.displayName))} ${t.displayName} recovery record is unreattachable: ${a.message}`,{reason:a.reason,retriable:!1,hint:`Retain the corrupt or future-version ${t.displayName} manifest for manual recovery; no replacement capture is safe.`});if(a.status===`decoded`&&a.envelope.lifecycle!==`completed`&&(r===i||n(a.envelope.device)===o))throw new e(`COMMAND_FAILED`,`${_(q(t.displayName))} ${t.displayName} resource for this device has not reached a confirmed terminal state`,{reason:`cleanup-unconfirmed`,hint:`Retry exact-owner cleanup using the existing ${t.displayName} manifest before starting a replacement.`})}}function q(e){return/^[aeiou]/i.test(e)?`an`:`a`}function J(e){let t=(t,n)=>e.store.resolvePath(t.resolveSessionDir(n)),n=t=>({definition:e,resolveSessionDir:e=>h.join(t.sessionsDir,u(e)),...t});return Object.freeze({store:e.store,resourcePath:t,createNextFence(t){return Oe(e,t)},adoptStarted(n){return te(e,{...n,reportUndurableCleanup:(e,t)=>{t.confirmed?n.admissionLedger.clearUndurableCleanup(e):n.admissionLedger.blockUndurableCleanup(e,t.reason)}},t(n.sessionStore,n.sessionName))},finishLive(n){return pe(e,n,t(n.sessionStore,n.sessionName))},finishRecovered(t){return Se(e,t)},forceCleanupLive(t){return ge(e,t)},recoverAll(e){return _e(n(e))},recoverOne(e,t){return z(n(e),t)}})}const Y=J({resourceKind:`screen-recording`,displayName:`screen recording`,store:W({resourceKind:m,fileName:`screen-recording.resource.json`,displayName:`screen recording`}),sessionSlot:{read:e=>e.screenRecording,replace:(e,t)=>({...e,screenRecording:t})},completionMetadata:Me,failedFinishPolicy:`preserve-retry-material`,messages:{noActive:`no active recording`,cleanupPendingHint:`Keep screen-recording.resource.json and retry stop through its exact runtime owner.`}});function Ae(e){return Y.adoptStarted(e)}function je(e){return Y.finishLive(e)}const X=`completion`;function Me(e){return{[X]:{backend:e.backend,outPath:e.outPath,startedAt:e.startedAt,completedAt:e.completedAt,...e.capturedDurationMs===void 0?{}:{capturedDurationMs:e.capturedDurationMs},...e.stopObservation===void 0?{}:{stopObservation:Pe(e.stopObservation)},...e.nativePathDisposition===void 0?{}:{nativePathDisposition:e.nativePathDisposition},scope:e.scope,showTouches:e.showTouches,recordOnlySession:e.recordOnlySession,...e.clientOutPath===void 0?{}:{clientOutPath:e.clientOutPath},...e.telemetryPath===void 0?{}:{telemetryPath:e.telemetryPath},...e.warning===void 0?{}:{warning:e.warning},...e.overlayWarning===void 0?{}:{overlayWarning:e.overlayWarning},...e.activeSessionApp===void 0?{}:{activeSessionApp:Ne(e.activeSessionApp)},...e.chunks===void 0?{}:{chunks:e.chunks.map(Fe)}}}}function Ne(e){return{bundleId:e.bundleId,...e.name===void 0?{}:{name:e.name}}}function Pe(e){return e.recorder===`confirmed`?{recorder:e.recorder}:{recorder:e.recorder,why:e.why}}function Fe(e){return{index:e.index,path:e.path,...e.clientOutPath===void 0?{}:{clientOutPath:e.clientOutPath}}}function Z(e){return Y.finishRecovered(e)}async function Q(e){let t;try{return t=await e.gateway.bind({device:Ie(e.envelope),intent:{kind:`exact-owner`,owner:e.envelope.owner,fence:e.envelope.fence},scope:e.scope}),e.scope.signal.throwIfAborted(),e.create(t)}catch(e){throw t&&await t[Symbol.asyncDispose](),e}}function Ie(e){return{platform:e.device.family,id:e.device.id,name:e.device.id,kind:e.device.kind,...e.device.target===void 0?{}:{target:e.device.target},...e.device.appleOs===void 0?{}:{appleOs:e.device.appleOs},...e.device.iosPhysicalDeviceBackend===void 0?{}:{iosPhysicalDeviceBackend:e.device.iosPhysicalDeviceBackend}}}function Le(e){return Y.recoverOne({sessionsDir:e.sessionsDir,scope:e.scope,perRecordDeadlineMs:e.perRecordDeadlineMs,onDiagnostic:e.onDiagnostic,acquireControl:async(t,n)=>await Re(e.gateway,t,n)},e.resourcePath)}async function Re(e,t,n){return await Q({gateway:e,envelope:t,scope:n,create:e=>$({runtime:o(e,i),dispose:async()=>await e[Symbol.asyncDispose]()})})}function $(e){return Object.freeze({reattach:async t=>await e.runtime.operations.screenRecordingReattach({envelope:t}),cleanup:async t=>await e.runtime.operations.screenRecordingCleanup({envelope:t}),[Symbol.asyncDispose]:e.dispose})}export{Ae as a,Y as c,X as i,J as l,Le as n,je as o,Q as r,Z as s,$ as t,W as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{T as e,_ as t,g as n,v as r}from"./sdk-batch-runner.js";function
|
|
1
|
+
import{T as e,_ as t,g as n,v as r}from"./sdk-batch-runner.js";import{n as i}from"./success-text.js";function a(e){return{...typeof e.path==`string`?{path:e.path}:{},...typeof e.width==`number`?{width:e.width}:{},...typeof e.height==`number`?{height:e.height}:{},...typeof e.logicalWidth==`number`?{logicalWidth:e.logicalWidth}:{},...typeof e.logicalHeight==`number`?{logicalHeight:e.logicalHeight}:{},...typeof e.pixelDensity==`number`?{pixelDensity:e.pixelDensity}:{},...e.overlayRefs?{overlayRefs:e.overlayRefs}:{},...e.warnings&&e.warnings.length>0?{warnings:e.warnings}:{}}}function o(t,n){let r=s(t);return{path:e(t,`path`),width:r?.width,height:r?.height,logicalWidth:r?.logicalWidth,logicalHeight:r?.logicalHeight,pixelDensity:r?.pixelDensity,overlayRefs:r?.overlayRefs,...r?.warnings?{warnings:r.warnings}:{},identifiers:{session:n}}}function s(e){if(!n(e))return;let t=d(e);return a({path:l(e,`path`),width:c(e,`width`),height:c(e,`height`),logicalWidth:c(e,`logicalWidth`),logicalHeight:c(e,`logicalHeight`),pixelDensity:c(e,`pixelDensity`),overlayRefs:u(e.overlayRefs),...t===void 0?{}:{warnings:t}})}function c(e,t){let n=e[t];return typeof n==`number`?n:void 0}function l(e,t){let n=e[t];return typeof n==`string`?n:void 0}function u(e){if(Array.isArray(e))return e.filter(h).flatMap(e=>{let t=f(e);return t?[t]:[]})}function d(e){if(Array.isArray(e.warnings))return i(e).filter(e=>e.length>0)}function f(e){if(typeof e.ref!=`string`||e.ref.length===0)return;let t=p(e);if(t)return{ref:e.ref,...m(e),...t}}function p(e){let n=r(e.rect);if(!n)return;let i=r(e.overlayRect);if(!i)return;let a=t(e.center);return a?{rect:n,overlayRect:i,center:a}:void 0}function m(e){return typeof e.label==`string`&&e.label.length>0?{label:e.label}:{}}function h(e){return n(e)}export{a as n,o as t};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime.js";const t=/(token|secret|password|authorization|cookie|api[_-]?key|access[_-]?key|private[_-]?key|user[_-]?code|device[_-]?code|refresh[_-]?credential)/i,n=/\b(?:bearer\s+[a-z0-9._-]+|adc_(?:agent|live|refresh|cli)_[a-z0-9._-]+)\b/gi,r=/\b([a-z0-9_-]*(?:api[_-]?key|token|secret|password|user[_-]?code|device[_-]?code|refresh[_-]?credential)[a-z0-9_-]*)(\s*[=:]\s*)("[^"]*"|'[^']*'|\S+)/gi,i=/https?:\/\/[^\s"'<>]+/gi;function a(e){return s(e,new WeakSet)}function o(e){if(!e||typeof e!=`object`)return;let t=e;if(typeof t.message==`string`&&t.message.length!==0)return a({message:t.message,...typeof t.code==`string`&&t.code.length>0?{code:t.code}:{}})}function s(e,n,r){if(e==null)return e;if(typeof e==`string`)return c(e,r);if(typeof e!=`object`)return e;if(n.has(e))return`[Circular]`;if(n.add(e),Array.isArray(e))return e.map(e=>s(e,n));let i={};for(let[r,a]of Object.entries(e)){if(t.test(r)){i[r]=`[REDACTED]`;continue}i[r]=s(a,n,r)}return i}function c(e,i){let a=e.trim();if(!a)return l(e);if(i&&t.test(i))return`[REDACTED]`;let o=u(a);return o=o.replace(n,`[REDACTED]`),o=o.replace(r,(e,t,n,r,i,a)=>f({key:t,separator:n,rawValue:r,offset:i,input:a})||d(r)?e:`${t}${n}[REDACTED]`),l(o)}function l(e){return e.length<=400?e:`${e.slice(0,386)}...<truncated>`}function u(e){return e.replace(i,e=>p(e)??e)}function d(e){return/^adc_(?:agent|live|refresh|cli)_\.\.\.$/i.test(e)}function f(e){if(e.key.toLowerCase()!==`token`||!e.separator.includes(`:`))return!1;try{return new URL(e.rawValue).pathname.replace(/\/+$/,``)===`/api-keys`&&/(?:^|\b)(?:service\/)?api\s+$/i.test(e.input.slice(0,e.offset))}catch{return!1}}function p(e){try{let t=new URL(e);return t.search&&=`?REDACTED`,(t.username||t.password)&&(t.username=`REDACTED`,t.password=`REDACTED`),t.toString()}catch{return null}}var m=e({AppError:()=>b,KNOWN_APP_ERROR_CODES:()=>h,asAppError:()=>
|
|
2
|
-
`)){let e=t.trim();if(!e||re.some(t=>t.test(e)))continue;let n=e.replace(ie,``).trim();if(n)return n.length>200?`${n.slice(0,200)}...`:n}return null}function
|
|
1
|
+
import{r as e}from"./rolldown-runtime.js";const t=/(token|secret|password|authorization|cookie|api[_-]?key|access[_-]?key|private[_-]?key|user[_-]?code|device[_-]?code|refresh[_-]?credential)/i,n=/\b(?:bearer\s+[a-z0-9._-]+|adc_(?:agent|live|refresh|cli)_[a-z0-9._-]+)\b/gi,r=/\b([a-z0-9_-]*(?:api[_-]?key|token|secret|password|user[_-]?code|device[_-]?code|refresh[_-]?credential)[a-z0-9_-]*)(\s*[=:]\s*)("[^"]*"|'[^']*'|\S+)/gi,i=/https?:\/\/[^\s"'<>]+/gi;function a(e){return s(e,new WeakSet)}function o(e){if(!e||typeof e!=`object`)return;let t=e;if(typeof t.message==`string`&&t.message.length!==0)return a({message:t.message,...typeof t.code==`string`&&t.code.length>0?{code:t.code}:{}})}function s(e,n,r){if(e==null)return e;if(typeof e==`string`)return c(e,r);if(typeof e!=`object`)return e;if(n.has(e))return`[Circular]`;if(n.add(e),Array.isArray(e))return e.map(e=>s(e,n));let i={};for(let[r,a]of Object.entries(e)){if(t.test(r)){i[r]=`[REDACTED]`;continue}i[r]=s(a,n,r)}return i}function c(e,i){let a=e.trim();if(!a)return l(e);if(i&&t.test(i))return`[REDACTED]`;let o=u(a);return o=o.replace(n,`[REDACTED]`),o=o.replace(r,(e,t,n,r,i,a)=>f({key:t,separator:n,rawValue:r,offset:i,input:a})||d(r)?e:`${t}${n}[REDACTED]`),l(o)}function l(e){return e.length<=400?e:`${e.slice(0,386)}...<truncated>`}function u(e){return e.replace(i,e=>p(e)??e)}function d(e){return/^adc_(?:agent|live|refresh|cli)_\.\.\.$/i.test(e)}function f(e){if(e.key.toLowerCase()!==`token`||!e.separator.includes(`:`))return!1;try{return new URL(e.rawValue).pathname.replace(/\/+$/,``)===`/api-keys`&&/(?:^|\b)(?:service\/)?api\s+$/i.test(e.input.slice(0,e.offset))}catch{return!1}}function p(e){try{let t=new URL(e);return t.search&&=`?REDACTED`,(t.username||t.password)&&(t.username=`REDACTED`,t.password=`REDACTED`),t.toString()}catch{return null}}var m=e({AppError:()=>b,KNOWN_APP_ERROR_CODES:()=>h,asAppError:()=>O,createRequestCanceledError:()=>w,defaultHintForCode:()=>I,errorMessage:()=>D,isAgentDeviceError:()=>k,isRequestCanceledDetails:()=>T,isRequestCanceledError:()=>E,normalizeAgentDeviceError:()=>A,normalizeError:()=>j,readDiagnosticsRecordRef:()=>P,readElementMatchCandidateRefs:()=>v,readErrorCandidateViews:()=>_,retriableForErrorCode:()=>F,throwDaemonError:()=>x,toAppErrorCode:()=>g});const h=[`INVALID_ARGS`,`DEVICE_NOT_FOUND`,`DEVICE_IN_USE`,`TOOL_MISSING`,`APP_NOT_INSTALLED`,`UNSUPPORTED_PLATFORM`,`UNSUPPORTED_OPERATION`,`NOT_IMPLEMENTED`,`COMMAND_FAILED`,`SESSION_NOT_FOUND`,`UNAUTHORIZED`,`AMBIGUOUS_MATCH`,`REPLAY_DIVERGENCE`,`REPAIR_SESSION_EXPIRED`,`REPAIR_COMMIT_FAILED`,`UNKNOWN`];function g(e,t=`COMMAND_FAILED`){return typeof e==`string`&&e.length>0?e:t}function _(e){let t=y(e?.candidates),n=[];if(t.length>0){let r=typeof e?.matches==`number`?e.matches:t.length,i=typeof e?.refsGeneration==`number`?e.refsGeneration:void 0;n.push({kind:`element-match`,candidates:t,matches:r,...i===void 0?{}:{refsGeneration:i}})}let r=ee(e?.devices);return r.length>0&&n.push({kind:`device`,devices:r}),n}function v(e){return y(e?.candidates).flatMap(e=>{let t=/^@(e\d+)(?:~s\d+)?(?:\s|$)/.exec(e);return t?.[1]?[t[1]]:[]})}function y(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function ee(e){return Array.isArray(e)?e.filter(e=>typeof e==`object`&&!!e&&typeof e.id==`string`&&typeof e.name==`string`):[]}var b=class extends Error{code;details;cause;constructor(e,t,n,r){super(t),this.code=e,this.details=n,this.cause=r}};function x(e){throw new b(g(e.code),e.message,{...e.details??{},hint:e.hint,diagnosticId:e.diagnosticId,logPath:e.logPath,logPathUnavailable:e.logPathUnavailable,diagnosticsRecord:e.diagnosticsRecord,retriable:e.retriable,supportedOn:e.supportedOn},e.cause)}const S=`request_canceled`,C=`request canceled`;function w(e,t){return new b(`COMMAND_FAILED`,C,{hint:`The request was canceled intentionally (explicit cancel or client disconnect) — no retry is needed unless the cancellation was unintended.`,...e,reason:S},t)}function T(e){return e?.reason===S}function E(e){return!(e instanceof b)||e.code!==`COMMAND_FAILED`?!1:T(e.details)?!0:e.message===C}function D(e){return e instanceof Error?e.message:String(e)}function O(e,t=`UNKNOWN`){return e instanceof b?e:e instanceof Error?new b(t,e.message,void 0,e):new b(t,`Unknown error`,{err:e})}function k(e){return e instanceof b}function A(e,t={}){return j(e,t)}function j(e,t={}){let n=O(e),r=n.details?a(n.details):void 0,i=N(r,`diagnosticId`)??t.diagnosticId,s=N(r,`logPath`)??t.logPath,c=N(r,`logPathUnavailable`),l=P(r?.diagnosticsRecord)??t.diagnosticsRecord,u=N(r,`hint`)??I(n.code),d=ae(r,`retriable`)??F(n.code),f=N(r,`supportedOn`),p=oe(r),m=ne(n.code,n.message,r),h=o(n.cause);return{code:n.code,message:m,...h===void 0?{}:{cause:h},hint:u,diagnosticId:i,logPath:s,...c===void 0?{}:{logPathUnavailable:c},...l===void 0?{}:{diagnosticsRecord:l},...d===void 0?{}:{retriable:d},...f===void 0?{}:{supportedOn:f},details:p}}const te=/^\S+ exited with code -?\d+$/;function ne(e,t,n){if(e!==`COMMAND_FAILED`||n?.processExitError!==!0)return t;let r=M(typeof n?.stderr==`string`?n.stderr:``);return r?te.test(t)?r:t.includes(r)?t:`${t}: ${r}`:t}const re=[/^an error was encountered processing the command/i,/^underlying error\b/i,/^simulator device failed to complete the requested operation/i],ie=/^(?:(?:adb|xcrun|simctl):\s*)?(?:error:\s*)?/i;function M(e){for(let t of e.split(`
|
|
2
|
+
`)){let e=t.trim();if(!e||re.some(t=>t.test(e)))continue;let n=e.replace(ie,``).trim();if(n)return n.length>200?`${n.slice(0,200)}...`:n}return null}function N(e,t){let n=e?.[t];return typeof n==`string`?n:void 0}function P(e){if(!e||typeof e!=`object`)return;let{session:t,requestId:n}=e;if(typeof t==`string`&&typeof n==`string`&&t.length!==0&&n.length!==0)return{session:t,requestId:n}}function ae(e,t){let n=e?.[t];return typeof n==`boolean`?n:void 0}function oe(e){if(!e)return;let t={...e};return delete t.hint,delete t.diagnosticId,delete t.logPath,delete t.logPathUnavailable,delete t.diagnosticsRecord,delete t.retriable,delete t.supportedOn,Object.keys(t).length>0?t:void 0}const se={DEVICE_IN_USE:!0};function ce(e){return h.includes(e)}function F(e){return ce(e)?se[e]:void 0}function I(e){switch(e){case`INVALID_ARGS`:return`Check command arguments and run --help for usage examples.`;case`SESSION_NOT_FOUND`:return`Run open first or pass an explicit device selector.`;case`TOOL_MISSING`:return`Install required platform tooling and ensure it is available in PATH.`;case`DEVICE_NOT_FOUND`:return`Verify the target device is booted/connected and selectors match.`;case`APP_NOT_INSTALLED`:return`Run apps to discover the exact installed package or bundle id, or install the app before open.`;case`UNSUPPORTED_OPERATION`:return`This command is not available for the selected platform/device.`;case`UNSUPPORTED_PLATFORM`:return`This platform is not supported for the requested operation; run devices to inspect available targets.`;case`AMBIGUOUS_MATCH`:return`Multiple candidates matched. Narrow the query or pass an exact identifier.`;case`DEVICE_IN_USE`:return`The device is busy with another agent-device request; retry once it frees up.`;case`REPLAY_DIVERGENCE`:return`Read details.divergence (screen/suggestions) for repair context, or rerun with --json for the full report.`;case`REPAIR_SESSION_EXPIRED`:return`The --save-script repair session was reaped before it was finalized; re-run replay <script> --save-script from the start.`;case`REPAIR_COMMIT_FAILED`:return`The repair transaction completed, but committing its healed script failed at teardown (no-clobber refusal or a filesystem error); inspect the target path/permissions, then re-run replay <script> --save-script to retry.`;case`NOT_IMPLEMENTED`:return`This command is part of the planned API but is not implemented yet.`;case`COMMAND_FAILED`:return`Retry with --debug and inspect diagnostics log for details.`;case`UNAUTHORIZED`:return`Refresh daemon metadata and retry the command.`;case`UNKNOWN`:return`Unexpected internal error. Retry with --debug and report the diagnostics log if it persists.`;default:return`Retry with --debug and inspect diagnostics log for details.`}}const L={interactiveOnly:`snapshotInteractiveOnly`,depth:`snapshotDepth`,scope:`snapshotScope`,raw:`snapshotRaw`,customActions:`snapshotCustomActions`,forceFull:`snapshotForceFull`,includeHiddenContentHints:`snapshotIncludeHiddenContentHints`,preferredBackend:`snapshotPreferredBackend`},le=[`interactiveOnly`,`depth`,`scope`,`raw`,`customActions`,`forceFull`],R=[`interactiveOnly`,`preferredBackend`,`depth`,`scope`,`raw`,`customActions`,`includeHiddenContentHints`],z=[`depth`,`interactiveOnly`,`raw`,`scope`,`customActions`];function B(e,t){return Object.fromEntries(t.map(t=>[t,e?.[L[t]]]))}function V(e,t){return Object.fromEntries(t.flatMap(t=>{let n=e?.[t];return n===void 0?[]:[[L[t],n]]}))}function H(e){if(e===void 0||e.backend===void 0)return{};switch(e.backend){case`xctest`:return{backend:e.backend,producer:e.producer};case`android`:return{backend:e.backend,producer:e.producer};case`harmonyos-arkui`:return{backend:e.backend,producer:e.producer};case`macos-helper`:return{backend:e.backend,producer:e.producer};case`linux-atspi`:return{backend:e.backend,producer:e.producer};case`web`:return{backend:e.backend,producer:e.producer}}}function U(e){return e===`xctest`||e===`android`||e===`harmonyos-arkui`||e===`macos-helper`||e===`linux-atspi`||e===`web`}function W(e){return e===void 0||e===`xctest`||e===`android`||e===`harmonyos-arkui`}function ue(e){return e.map((e,t)=>({...e,ref:e.ref??`e${t+1}`}))}const de=/^~s(\d+)$/,fe=`Refs look like @e12, optionally pinned to the snapshot generation that minted them: @e12~s3 (the ref, then "~s" and the refsGeneration reported by the issuing snapshot/find response).`;function G(e){let t=e.trim(),n=t.indexOf(`~`);if(n===-1)return{base:t};let r=de.exec(t.slice(n));return!r||n===0?null:{base:t.slice(0,n),generation:Number(r[1])}}function pe(e){let t=G(e);if(!t)return null;let n=t.base;return n.startsWith(`@`)?n.slice(1)||null:n.startsWith(`e`)?n:null}function me(e,t){return e.find(e=>e.ref===t)??null}function he(e){return JSON.stringify({interactiveOnly:e?.interactiveOnly===!0,depth:typeof e?.depth==`number`?e.depth:null,scope:e?.scope?.trim()||null,raw:e?.raw===!0,customActions:e?.customActions===!0})}function ge(e){if(e)return B(e,z)}function _e(e){return{x:Math.round(e.x+e.width/2),y:Math.round(e.y+e.height/2)}}const K=[`ios`,`android`,`harmonyos`];function ve(e){return K.some(t=>t===e)}const ye=[`summary`,`headers`,`body`,`all`],be=[`digest`,`default`,`full`];function xe(e){return e!==void 0&&e!=="default"}function q(e){return{parse(t){return e(t,`$`)}}}function J(e,t){throw Error(`${e}: ${t}`)}function Y(e,t){return(!e||typeof e!=`object`||Array.isArray(e))&&J(t,`Expected an object`),e}function X(e,t){return typeof e!=`string`&&J(t,`Expected a string`),e}function Se(e,t){return Number.isInteger(e)||J(t,`Expected an integer`),e}function Ce(e,t){return Array.isArray(e)||J(t,`Expected an array`),e}function Z(e,t,n){let r=e[t];return r===void 0?void 0:X(r,`${n}.${t}`)}function we(e,t,n){let r=e[t];if(r!==void 0)return Ce(r,`${n}.${t}`).map((e,r)=>X(e,`${n}.${t}[${String(r)}]`))}function Q(e,t,n){let r=e[t];return r===void 0?void 0:Se(r,`${n}.${t}`)}function $(e,t,n){let r=e[t];return r===void 0?void 0:Y(r,`${n}.${t}`)}function Te(e,t,n,r){let i=e[t];if(i!==void 0)return(typeof i!=`string`||!n.includes(i))&&J(`${r}.${t}`,`Expected one of: ${n.join(`, `)}`),i}const Ee=q((e,t)=>{let n=Y(e,t);return{platform:Te(n,`platform`,K,t),metroHost:Z(n,`metroHost`,t),metroPort:Q(n,`metroPort`,t),bundleUrl:Z(n,`bundleUrl`,t),launchUrl:Z(n,`launchUrl`,t)}});function De(e,t){let n=e.id;return n==null||typeof n!=`string`&&typeof n!=`number`&&J(`${t}.id`,`Expected a string, number, or null`),n}const Oe=q((e,t)=>{let n=Y(e,t);return{jsonrpc:Z(n,`jsonrpc`,t),id:De(n,t),method:Z(n,`method`,t),params:n.params}}),ke=q((e,t)=>{let n=Y(e,t);return{token:Z(n,`token`,t),session:Z(n,`session`,t),command:Z(n,`command`,t),positionals:we(n,`positionals`,t),input:$(n,`input`,t),flags:$(n,`flags`,t),runtime:$(n,`runtime`,t),meta:$(n,`meta`,t)}});export{T as A,a as B,b as C,D,I as E,v as F,_ as I,F as L,A as M,j as N,m as O,P,x as R,W as S,w as T,o as V,V as _,xe as a,H as b,fe as c,ue as d,he as f,pe as g,U as h,Ee as i,E as j,k,R as l,me as m,be as n,ve as o,_e as p,ke as r,Oe as s,ye as t,le as u,B as v,O as w,G as x,ge as y,g as z};
|
|
@@ -140,6 +140,31 @@ type GesturePlan = SinglePointerGesturePlan | MultiTouchGesturePlan;
|
|
|
140
140
|
declare const BACK_MODES: readonly ['in-app', 'system'];
|
|
141
141
|
type BackMode = (typeof BACK_MODES)[number];
|
|
142
142
|
//#endregion
|
|
143
|
+
//#region packages/contracts/src/settings.d.ts
|
|
144
|
+
/**
|
|
145
|
+
* The `settings permission` vocabulary, declared once. These collections are what the parsers
|
|
146
|
+
* below, the public client permission types, the CLI's membership sets, and the permission-name
|
|
147
|
+
* fragments of `settings` help and its invalid-args message are built from, and their order is
|
|
148
|
+
* the order `settings` help lists the names in.
|
|
149
|
+
*
|
|
150
|
+
* Acceptance is not support: each backend keeps its own target mapping and its own support check,
|
|
151
|
+
* so a name accepted here never promises that the selected platform serves it.
|
|
152
|
+
*/
|
|
153
|
+
declare const PERMISSION_ACTIONS: readonly ['grant', 'deny', 'reset'];
|
|
154
|
+
declare const PERMISSION_MODES: readonly ['full', 'limited'];
|
|
155
|
+
/** The app-scoped targets, the only ones `parsePermissionTarget` accepts. */
|
|
156
|
+
declare const MOBILE_PERMISSION_TARGETS: readonly ['camera', 'microphone', 'photos', 'contacts', 'contacts-limited', 'notifications', 'calendar', 'location', 'location-always', 'media-library', 'motion', 'reminders', 'siri'];
|
|
157
|
+
/** The desktop targets the CLI and the public client accept; `parsePermissionTarget` refuses them. */
|
|
158
|
+
declare const MACOS_PERMISSION_TARGETS: readonly ['accessibility', 'screen-recording', 'input-monitoring'];
|
|
159
|
+
type PermissionAction = (typeof PERMISSION_ACTIONS)[number];
|
|
160
|
+
type PermissionMode = (typeof PERMISSION_MODES)[number];
|
|
161
|
+
type SettingOptions = {
|
|
162
|
+
permissionTarget?: string;
|
|
163
|
+
permissionMode?: string;
|
|
164
|
+
latitude?: number;
|
|
165
|
+
longitude?: number;
|
|
166
|
+
};
|
|
167
|
+
//#endregion
|
|
143
168
|
//#region packages/contracts/src/device-rotation.d.ts
|
|
144
169
|
declare const DEVICE_ROTATIONS: readonly ['portrait', 'portrait-upside-down', 'landscape-left', 'landscape-right'];
|
|
145
170
|
type DeviceRotation = (typeof DEVICE_ROTATIONS)[number];
|
|
@@ -201,20 +226,15 @@ type TvRemoteButton = (typeof TV_REMOTE_BUTTONS)[number];
|
|
|
201
226
|
//#region packages/contracts/src/ios-system-surface.d.ts
|
|
202
227
|
/**
|
|
203
228
|
* iOS out-of-process system surfaces that agent-device observes and drives IN PLACE, never by
|
|
204
|
-
* activation
|
|
205
|
-
*
|
|
206
|
-
*
|
|
207
|
-
*
|
|
208
|
-
* `
|
|
209
|
-
*
|
|
210
|
-
* `open` path refuses to launch it. The set is deliberately closed and tiny; add a host only with
|
|
211
|
-
* live evidence that it presents out of process and dies on activation.
|
|
212
|
-
*
|
|
213
|
-
* The canonical membership lives in `contracts/fixtures/ios-system-surface-hosts.json`; this module
|
|
214
|
-
* and the Swift `SystemSurfaceHostRegistry` both mirror it, each guarded by a parity test.
|
|
229
|
+
* activation: launching or activating the host cancels what it presents (issue #2438), so the
|
|
230
|
+
* runner addresses the host process while it is foreground and the `open` path refuses it. The set
|
|
231
|
+
* is deliberately closed and tiny; add a host only with live evidence that it presents out of
|
|
232
|
+
* process and dies on activation. Rationale per host lives in the canonical fixture
|
|
233
|
+
* `contracts/fixtures/ios-system-surface-hosts.json` (see also docs/adr/0004); this module and the
|
|
234
|
+
* Swift `SystemSurfaceHostRegistry` both mirror it, each guarded by a parity test.
|
|
215
235
|
*/
|
|
216
236
|
/** Why a system surface is served in place; carried at snapshot-response level as provenance. */
|
|
217
|
-
type IosSystemSurfaceKind = 'web-auth';
|
|
237
|
+
type IosSystemSurfaceKind = 'web-auth' | 'payment';
|
|
218
238
|
/**
|
|
219
239
|
* Whole-snapshot provenance: the capture describes a system surface presented over the session app,
|
|
220
240
|
* not the app itself. Carried at response level (it applies to the entire snapshot) and folded into
|
|
@@ -274,9 +294,9 @@ type ResolutionDisclosure = {
|
|
|
274
294
|
};
|
|
275
295
|
/**
|
|
276
296
|
* A post-action capture that describes a DIFFERENT surface than the pre-action baseline (#2438): an
|
|
277
|
-
* in-place iOS system surface (a web sign-in sheet, hosted out of the app's process)
|
|
278
|
-
* over the app, or left it. `from`/`to` name the two surfaces — a host bundle id, or
|
|
279
|
-
* ordinary app content.
|
|
297
|
+
* in-place iOS system surface (a web sign-in or Apple Pay sheet, hosted out of the app's process)
|
|
298
|
+
* was presented over the app, or left it. `from`/`to` name the two surfaces — a host bundle id, or
|
|
299
|
+
* `APP_SURFACE` (`@agent-device/contracts/ios-system-surface`) for ordinary app content.
|
|
280
300
|
*
|
|
281
301
|
* Its presence IS the refusal of a same-surface claim: the two captures are not one presentation,
|
|
282
302
|
* so `--verify` reports `changedFromBefore` from this transition instead of from a digest
|
|
@@ -545,14 +565,6 @@ type ScrollCommandResult = {
|
|
|
545
565
|
keyboardMinY?: number;
|
|
546
566
|
};
|
|
547
567
|
//#endregion
|
|
548
|
-
//#region packages/contracts/src/settings.d.ts
|
|
549
|
-
type SettingOptions = {
|
|
550
|
-
permissionTarget?: string;
|
|
551
|
-
permissionMode?: string;
|
|
552
|
-
latitude?: number;
|
|
553
|
-
longitude?: number;
|
|
554
|
-
};
|
|
555
|
-
//#endregion
|
|
556
568
|
//#region packages/contracts/src/runner-lease-context.d.ts
|
|
557
569
|
type RunnerLogicalLeaseContext = {
|
|
558
570
|
leaseId?: string;
|
|
@@ -1006,4 +1018,4 @@ declare function formatSelectorFailure(chain: SelectorChain | string, diagnostic
|
|
|
1006
1018
|
unique?: boolean;
|
|
1007
1019
|
}): string;
|
|
1008
1020
|
//#endregion
|
|
1009
|
-
export {
|
|
1021
|
+
export { PointerTrajectory as A, FindLocator as B, MACOS_PERMISSION_TARGETS as C, BackMode as D, PermissionMode as E, SwipePattern as F, SnapshotDiagnosticsSummary as H, SwipePreset as I, TransformGestureParams as L, SinglePointerGesturePlan as M, ScrollDirection as N, GesturePointerCount as O, ScrollInputDirection as P, ClickButton as R, DeviceRotation as S, PermissionAction as T, SessionSurface as U, ScreenshotResultData as V, HoverCommandResponseData as _, resolveSelectorChain as a, SettleObservation as b, isSelectorToken as c, Interactor as d, RunnerContext as f, FindCommandResponseData as g, FillCommandResponseData as h, findSelectorChainMatch as i, PointerTrajectorySample as j, MultiTouchGesturePlan as k, parseSelectorChain as l, ClickCommandResponseData as m, isNodeEditable as n, SelectorDiagnostics as o, ScrollCommandResult as p, isNodeVisible as r, SelectorChain as s, formatSelectorFailure as t, tryParseSelectorChain as u, LongPressCommandResponseData as v, MOBILE_PERMISSION_TARGETS as w, TvRemoteButton as x, PressCommandResponseData as y, AndroidSnapshotBackendMetadata as z };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{C as e,c as t,f as n,w as r,x as i,y as a}from"./sdk-contracts.js";import{l as o,v as s}from"./sdk-device.js";import{An as c,Ft as l,On as u,cr as d,or as f,sr as p}from"./sdk-batch.js";import{s as m}from"./session-store.js";import{i as ee,s as h}from"./session-target-evidence.js";import{f as g}from"./parameterized-recorded-fill.js";import{n as te}from"./runtime.js";import{a as ne,m as re,p as ie,s as ae,t as oe}from"./absence-observation-errors.js";import{r as se}from"./diagnostics.js";import"./diagnostics2.js";import{i as ce}from"./rect-center.js";import{a as _}from"./android-system-chrome.js";import{r as le}from"./request-cancel.js";import"./request.js";import{a as ue,i as v,s as y}from"./request-runtime-binding.js";import{C as de,b as fe,f as pe,i as b,m as me,n as he,o as ge,p as x,r as _e,s as ve,w as S}from"./session-snapshot.js";import{n as C}from"./dispatch-resolve.js";import{p as w}from"./quality-warnings.js";import{t as T}from"./ios-system-surface.js";import{t as E}from"./backend-snapshot-options.js";import{t as D}from"./snapshot-runtime-binding.js";function O(e){let n=i(e);return n?{ok:!0,ref:n.base,generation:n.generation}:{ok:!1,response:v(`INVALID_ARGS`,`Invalid ref "${e}" — malformed generation suffix.`,{hint:t})}}function k(e,t){if(t===`exists`)return{found:!0};if(t===`wait`)return{found:!0,waitedMs:e.waitedMs};if(t===`list`)return{action:`list`,matches:Array.isArray(e.matches)?e.matches.length:0};let n=typeof e.ref==`string`?e.ref:void 0;return t===`get_attrs`?{ref:n,action:`get attrs`}:{ref:n,action:`get text`,text:typeof e.text==`string`?e.text:``}}function A(e){return e.kind===`found`?{found:!0,...typeof e.waitedMs==`number`?{waitedMs:e.waitedMs}:{}}:e.kind===`list`?{matches:e.matches.map(e=>({ref:e.ref,node:_(e.node)}))}:{ref:e.ref,...e.kind===`text`?{text:e.text}:{},node:_(e.node)}}function j(e,t){let n=Array.isArray(e.selectorChain)?e.selectorChain:void 0,r=be(e),i=r?.kind===`ref`?L(r.ref):void 0,a=r?.kind===`selector`?r.selector:void 0,o={...i?{ref:i}:{},...a?{selector:a}:{},...n?{selectorChain:n}:{}};if(t===`attrs`)return o;let s=typeof e.text==`string`?e.text:``;return{...o,text:s,refLabel:ye(s)}}function M(e){let{target:t}=e;return{...t.kind===`ref`?{ref:L(t.ref)}:{},...t.kind===`selector`?{selector:t.selector}:{},...typeof e.text==`string`?{text:e.text}:{},node:_(e.node)}}function N(e){let{node:t,preActionNodes:n,...r}=e;return r}function P(e){return{waitedMs:e.waitedMs,...typeof e.text==`string`?{text:e.text}:{},...typeof e.selector==`string`?{selector:e.selector}:{},...typeof e.captures==`number`?{captures:e.captures}:{},...typeof e.nodeCount==`number`?{nodeCount:e.nodeCount}:{},...typeof e.hint==`string`?{hint:e.hint}:{}}}function F(e){let{selectorChain:t,...n}=e;return n}function I(e,t,n,r,i,a){let o=e.get(t);if(!o)return;let s=g(o)&&i?ee(i,{mode:a}):void 0;e.recordAction(o,{command:n.command,positionals:n.positionals??[],flags:n.flags??{},result:r,interactiveObservation:m(n),...s?{targetEvidence:s,targetEvidenceMode:a??`action`}:{}})}function ye(e){let t=e.trim();if(!(!t||t.length>80||/[\r\n]/.test(t)))return t}function be(e){let t=e.target;if(!t||typeof t!=`object`)return;let n=t;if(n.kind===`ref`&&typeof n.ref==`string`)return{kind:`ref`,ref:n.ref};if(n.kind===`selector`&&typeof n.selector==`string`)return{kind:`selector`,selector:n.selector}}function L(e){return e.startsWith(`@`)?e.slice(1):e}async function R(e){let t=await D({...e,plan:l({hasActiveApp:e.session?.appBundleId!==void 0,intent:xe(e.command)}),...e.session?{}:{readiness:{}}});return t.ok?{ok:!0,operations:{capture:t.capture,...t.readTextAtPoint?{readText:t.readTextAtPoint}:{},...t.findText?{findText:t.findText}:{}}}:t}function xe(e){switch(e){case`is`:return`capture-only`;case`find`:case`get`:return`element-text`;case`wait`:return`wait-observation`}}const Se=[[`snapshotDepth`,`--depth`],[`snapshotScope`,`--scope`],[`snapshotRaw`,`--raw`]];function z(e,t){let n=Se.filter(([e])=>t?.[e]!==void 0).map(([,e])=>e);return n.length===0?null:v(`INVALID_ARGS`,`${e} @ref does not support ${n.join(`, `)}.`)}async function B(t,n){if(t.device.platform!==`android`||!t.appBundleId||t.lease?.leaseProvider||y(t.device))return null;if(!n)throw new e(`INTERNAL_ERROR`,`Android observation was not supplied by root runtime composition`);let r=await n.readAppState(t.device),i=r.package?.trim();if(!i||i===t.appBundleId)return null;let a=await n.isPermissionPackage(i);return!we(i)&&!a?null:{expectedPackage:t.appBundleId,foregroundPackage:i,activity:r.activity,hint:Ce(a),...a?{permissionDialog:!0}:{}}}function V(e){return e.permissionDialog?`Android permission dialog is blocking ${e.expectedPackage}`:`${e.foregroundPackage} is foreground instead of ${e.expectedPackage}`}function Ce(e){return e?`Use "alert get" to inspect it, then "alert accept" or "alert dismiss" to respond.`:`Use screenshot as visual truth, then take a fresh snapshot -i before retrying.`}function we(e){return e===`com.android.settings`||e===`com.android.systemui`||e.includes(`launcher`)}function H(e,t){let n=t?.iosSystemSurfaceBundleId?T:te(t);if(!n)return e;if(e.ok){let t=U(e.data?.warning,n);return{...e,data:{...e.data,warning:t}}}let r=e.error.details??{};return{...e,error:{...e.error,details:{...r,hint:U(r.hint,n)}}}}function U(e,t){return typeof e==`string`&&e.trim()!==``?`${e}\n${t}`:t}async function Te(e){let{device:t,node:n,flags:r,appBundleId:i,traceOutPath:a,surface:s,contextFromFlags:c}=e,l=ie(n),u=e.readTextAtPoint;if(!u)return l;let d=ce(n.rect);if(!d||o(t)&&l&&!re(n.type??``))return l;let f=c(r,i,a),p=await u({point:d,options:{appBundleId:i,surface:s},execution:me(f)});return p.status===`read`?p.text:(se({level:`warn`,phase:`interaction_read_fallback`,data:{reason:Ee(p.reason),nodeRef:n.ref,surface:s,platform:t.platform}}),l)}function Ee(e){switch(e){case`no-text-at-point`:return`no_text_at_point`;default:return e}}function W(e){let{session:t,sessionStore:n,sessionName:r}=e,i=0,a,o,s=t=>(e.consumedSnapshot&&(e.consumedSnapshot.state=t.snapshot),t);return{capture:async c=>{let l=Date.now(),u=Pe(c,e.req.flags?.out),d=Ae({timestamp:l,lastSnapshotAt:i,lastSnapshotResult:a,lastSnapshotCacheKey:o,session:t,request:c,cacheKey:u});if(d)return s(d);let f=je({session:t,timestamp:l,request:c});if(f)return i=f.createdAt,a={snapshot:f},o=u,s(a);let p=await De({params:e,request:c});c.signal?.throwIfAborted();let m={snapshot:p};return Ie({session:t,sessionStore:n,sessionName:r,snapshot:p}),i=l,a=m,o=u,s(m)}}}async function De(e){let{params:t,request:n}=e,r=await G(t,n,n.snapshotScope);return n.recovery?.legacyIosSparse&&ae(r)?await Oe({runtimeParams:t,request:n,policy:n.recovery.legacyIosSparse}):n.recovery?.sparseVerdictQueryScope?.shouldScope&&w(r.snapshotQuality)?await ke({runtimeParams:t,request:n,policy:n.recovery.sparseVerdictQueryScope,snapshot:r}):r}async function Oe(e){let{runtimeParams:t,request:n,policy:r}=e;try{return await G(t,n,void 0,!1)}catch(e){if(!r.shouldScope)throw e;return await G(t,n,r.query,!1)}}async function ke(e){let{runtimeParams:t,request:n,policy:r,snapshot:i}=e;try{return await G(t,n,r.query,!1)}catch{return i}}async function G(e,t,n,r=t.flags?.snapshotInteractiveOnly){let i={...t.flags,snapshotInteractiveOnly:r},a=e.capture;return(await ve({device:e.device,session:e.session,flags:i,outPath:t.outPath??e.req.flags?.out,logPath:e.logPath??``,snapshotScope:n,includeRects:t.includeRects,signal:t.signal,captureData:async()=>await a(x({flags:i,logPath:e.logPath??``,meta:e.req.meta,session:e.session,snapshotScope:n,includeRects:t.includeRects,signal:t.signal}))})).snapshot}function Ae(e){let{timestamp:t,lastSnapshotAt:n,lastSnapshotResult:r,lastSnapshotCacheKey:i,session:a,request:o,cacheKey:s}=e;if(o.cache?.forceFresh!==!0&&r&&i===s&&!(t-n>=750)&&!S(a)&&!K(a,o))return r}function je(e){let{session:t,timestamp:n,request:r}=e,i=t?.snapshot;if(i&&Me(t,r)&&Ne(i,n)&&i.presentationKey===q(r))return i}function Me(e,t){return!(t.cache?.forceFresh===!0||t.cache?.useSessionSnapshot!==!0||S(e)||K(e,t))}function Ne(e,t){return t-e.createdAt<750}function K(e,t){return t.cache?.bypassForPostGestureStabilization===!0&&fe(e)}function q(e){return n(a(Fe(e)))}function Pe(e,t){return JSON.stringify({presentationKey:q(e),includeRects:e.includeRects===!0,outPath:e.outPath??t??null})}function Fe(e){return e.snapshotScope===void 0?e.flags:{...e.flags,snapshotScope:e.snapshotScope}}function Ie(e){let{session:t,sessionStore:n,sessionName:r,snapshot:i}=e;!t||w(i.snapshotQuality)||(b(t,i),n.set(r,t))}function J(e){return pe({backend:Re(e),...h(`selector commands`,{plural:!0}),sessions:ge({sessionName:e.sessionName,getSession:()=>e.session,recordOptions:{includeSnapshot:!0},setRecord:t=>{!e.session||!t.snapshot||(b(e.session,t.snapshot),e.sessionStore.set(e.sessionName,e.session))}}),signal:e.signal??le(e.req.meta?.requestId)})}async function Le(e,t){e.consumedSnapshot??={};let n=e.sessionStore.get(e.sessionName);return!n&&t?{ok:!1,response:ue()}:{ok:!0,session:n,device:n?.device??await C(e.req.flags??{})}}async function Y(e,t){let n=await Le(e,t.requireSession);if(!n.ok)return n;let r=await R({command:t.command,device:n.device,session:n.session,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});return r.ok?{ok:!0,runtime:J({...e,session:n.session,device:n.device,bound:r.operations})}:{ok:!1,response:r.response}}function Re(e){let{req:t,session:n,device:r,logPath:i,sessionName:a,sessionStore:o}=e,c=e.contextFromFlags??((e,t,n)=>de(i??``,e,t,n)),l=e.bound?.readText,u=e.bound?.findText,d=x({flags:t.flags,logPath:i??``,meta:t.meta,session:n,snapshotScope:void 0}).execution,f=e.bound,p=f===void 0?void 0:W({device:r,session:n,sessionStore:o,sessionName:a,req:t,consumedSnapshot:e.consumedSnapshot,logPath:i,capture:f.capture});return{platform:s(r),captureSnapshot:p&&(async(e,n)=>{let i={...t.flags,...E(n)},a=n?.includeRects===!0,o=n?.scope??t.flags?.snapshotScope,s=t.command===`wait`||t.command===`find`||ze(t)||a&&r.platform===`web`;return await p.capture({flags:i,signal:e.signal,snapshotScope:o,includeRects:a,cache:{forceFresh:s,useSessionSnapshot:!0,bypassForPostGestureStabilization:!0}})}),readText:async(e,i)=>({text:await Te({readTextAtPoint:l,device:r,node:i,flags:t.flags,appBundleId:n?.appBundleId,traceOutPath:n?.trace?.outPath,surface:n?.surface,contextFromFlags:c})}),...u?{findText:async(e,t)=>({found:(await u({text:t,options:{appBundleId:n?.appBundleId,surface:n?.surface},execution:d,...e.signal?{signal:e.signal}:{}})).found})}:{}}}function ze(e){if(e.command!==`is`)return!1;let t=d(e.positionals??[]);return t.ok&&t.predicate===`absent`}async function Be(e){let{req:t}=e;if(t.command!==`find`)return null;let n=t.positionals??[],r=u(n,t.flags);if(!r.ok)return v(r.code,r.message);let i=r.parsed,a=i.action;if(!c(a))return null;let o=await Y(e,{requireSession:!1,command:`find`});return o.ok?H(await Q(async()=>{let n=await o.runtime.selectors.find({session:e.sessionName,requestId:t.meta?.requestId,locator:i.locator,query:i.query,action:a,timeoutMs:i.timeoutMs});I(e.sessionStore,e.sessionName,t,k(n,a));let r=A(n),s=typeof r.ref==`string`?[r.ref]:Array.isArray(r.matches)?r.matches.map(e=>e.ref).filter(e=>typeof e==`string`):[];if(s.length>0){let t=e.sessionStore.get(e.sessionName);if(t&&(he(t,s),e.sessionStore.set(e.sessionName,t),t.snapshotGeneration!==void 0))return{...r,refsGeneration:t.snapshotGeneration}}return r}),X(e)):o.response}function X(e){return e.consumedSnapshot?.state??e.sessionStore.get(e.sessionName)?.snapshot}async function Ve(e){let{req:t}=e;if(t.command!==`get`)return null;let n=p(t.positionals?.[0]);if(!n.ok)return v(n.code,n.message);let r=n.format,i=Ue(t);if(!i.ok)return i.response;if(i.target.kind===`ref`){let e=z(`get`,t.flags);if(e)return e}let a=t.internal?.replayTargetGuard,o=await Y(e,{requireSession:!0,command:`get`});if(!o.ok)return o.response;let s=o.runtime,c=i.target.kind===`ref`?_e({session:e.sessionStore.get(e.sessionName),ref:i.target.ref,mintedGeneration:i.refGeneration}):void 0;return H(await Q(async()=>{let n=await s.selectors.get({session:e.sessionName,requestId:t.meta?.requestId,property:r,target:i.target,expectedResolvedTarget:a});I(e.sessionStore,e.sessionName,t,j(n,r),{node:n.node,preActionNodes:n.preActionNodes});let o=M(n);return c?{...o,warning:c}:o}),X(e))}async function He(e){let{req:t}=e;if(t.command!==`is`)return null;let n=d(t.positionals??[]);if(!n.ok)return v(n.code,n.message,n.hint?{hint:n.hint}:void 0);let{predicate:r,selectorExpression:i,expectedText:a}=n;if(r===`absent`){let e=ne({depth:t.flags?.snapshotDepth,scope:t.flags?.snapshotScope});if(e){let t=oe(e);return v(t.code,t.message,t.details)}}let o=t.internal?.replayTargetGuard,s=await Y(e,{requireSession:!0,command:`is`});return s.ok?H(await $(e,await Q(async()=>{let n=await s.runtime.selectors.is({session:e.sessionName,requestId:t.meta?.requestId,predicate:r,selector:i,expectedText:a,expectedResolvedTarget:o}),c=Z(n),l=N(n);return I(e.sessionStore,e.sessionName,t,l,c),F(l)}),`is ${r}`),X(e)):s.response}function Z(e){let t=e.node,n=e.preActionNodes;if(!(!t||typeof t!=`object`||!Array.isArray(n)))return{node:t,preActionNodes:n}}function Ue(e){let t=e.positionals?.[1]??``;if(t.startsWith(`@`)){let n=O(t);return n.ok?{ok:!0,target:{kind:`ref`,ref:n.ref,fallbackLabel:e.positionals.length>2?e.positionals.slice(2).join(` `).trim():``},refGeneration:n.generation}:{ok:!1,response:n.response}}let n=f(e.positionals?.slice(1)??[]);return n.ok?{ok:!0,target:{kind:`selector`,selector:`selector`in n?n.selector:``}}:{ok:!1,response:v(n.code,n.message)}}async function Q(e){try{return{ok:!0,data:await e()}}catch(e){let t=r(e);return v(t.code,t.message,t.details)}}async function $(e,t,n){if(t.ok)return t;let r=e.sessionStore.get(e.sessionName);if(!r)return t;let i;try{if(!e.androidObservation)return t;i=await B(r,e.androidObservation)}catch{return t}return i?v(t.error.code,`${n} failed because ${V(i)}.`,{...t.error.details??{},...i,blockedBy:`android_foreground_surface`,originalMessage:t.error.message}):t}export{O as _,$ as a,J as c,B as d,z as f,P as g,N as h,He as i,W as l,I as m,Be as n,Z as o,R as p,Ve as r,Q as s,X as t,H as u};
|
|
1
|
+
import{C as e,c as t,f as n,w as r,x as i,y as a}from"./sdk-contracts.js";import{l as o,v as s}from"./sdk-device.js";import{An as c,Ft as l,On as u,cr as d,or as f,sr as p}from"./sdk-batch.js";import{s as m}from"./session-store.js";import{i as ee,s as h}from"./session-target-evidence.js";import{f as g}from"./parameterized-recorded-fill.js";import{n as te}from"./runtime.js";import{a as ne,m as re,p as ie,s as ae,t as oe}from"./absence-observation-errors.js";import{r as se}from"./diagnostics.js";import"./diagnostics2.js";import{i as ce}from"./rect-center.js";import{a as _}from"./android-system-chrome.js";import{r as le}from"./request-cancel.js";import"./request.js";import{a as ue,i as v,s as y}from"./request-runtime-binding.js";import{C as de,b as fe,f as pe,i as b,m as me,n as he,o as ge,p as x,r as _e,s as ve,w as S}from"./session-snapshot.js";import{n as C}from"./dispatch-resolve.js";import{p as w}from"./quality-warnings.js";import{n as T}from"./ios-system-surface.js";import{t as E}from"./backend-snapshot-options.js";import{t as D}from"./snapshot-runtime-binding.js";function O(e){let n=i(e);return n?{ok:!0,ref:n.base,generation:n.generation}:{ok:!1,response:v(`INVALID_ARGS`,`Invalid ref "${e}" — malformed generation suffix.`,{hint:t})}}function k(e,t){if(t===`exists`)return{found:!0};if(t===`wait`)return{found:!0,waitedMs:e.waitedMs};if(t===`list`)return{action:`list`,matches:Array.isArray(e.matches)?e.matches.length:0};let n=typeof e.ref==`string`?e.ref:void 0;return t===`get_attrs`?{ref:n,action:`get attrs`}:{ref:n,action:`get text`,text:typeof e.text==`string`?e.text:``}}function A(e){return e.kind===`found`?{found:!0,...typeof e.waitedMs==`number`?{waitedMs:e.waitedMs}:{}}:e.kind===`list`?{matches:e.matches.map(e=>({ref:e.ref,node:_(e.node)}))}:{ref:e.ref,...e.kind===`text`?{text:e.text}:{},node:_(e.node)}}function j(e,t){let n=Array.isArray(e.selectorChain)?e.selectorChain:void 0,r=be(e),i=r?.kind===`ref`?L(r.ref):void 0,a=r?.kind===`selector`?r.selector:void 0,o={...i?{ref:i}:{},...a?{selector:a}:{},...n?{selectorChain:n}:{}};if(t===`attrs`)return o;let s=typeof e.text==`string`?e.text:``;return{...o,text:s,refLabel:ye(s)}}function M(e){let{target:t}=e;return{...t.kind===`ref`?{ref:L(t.ref)}:{},...t.kind===`selector`?{selector:t.selector}:{},...typeof e.text==`string`?{text:e.text}:{},node:_(e.node)}}function N(e){let{node:t,preActionNodes:n,...r}=e;return r}function P(e){return{waitedMs:e.waitedMs,...typeof e.text==`string`?{text:e.text}:{},...typeof e.selector==`string`?{selector:e.selector}:{},...typeof e.captures==`number`?{captures:e.captures}:{},...typeof e.nodeCount==`number`?{nodeCount:e.nodeCount}:{},...typeof e.hint==`string`?{hint:e.hint}:{}}}function F(e){let{selectorChain:t,...n}=e;return n}function I(e,t,n,r,i,a){let o=e.get(t);if(!o)return;let s=g(o)&&i?ee(i,{mode:a}):void 0;e.recordAction(o,{command:n.command,positionals:n.positionals??[],flags:n.flags??{},result:r,interactiveObservation:m(n),...s?{targetEvidence:s,targetEvidenceMode:a??`action`}:{}})}function ye(e){let t=e.trim();if(!(!t||t.length>80||/[\r\n]/.test(t)))return t}function be(e){let t=e.target;if(!t||typeof t!=`object`)return;let n=t;if(n.kind===`ref`&&typeof n.ref==`string`)return{kind:`ref`,ref:n.ref};if(n.kind===`selector`&&typeof n.selector==`string`)return{kind:`selector`,selector:n.selector}}function L(e){return e.startsWith(`@`)?e.slice(1):e}async function R(e){let t=await D({...e,plan:l({hasActiveApp:e.session?.appBundleId!==void 0,intent:xe(e.command)}),...e.session?{}:{readiness:{}}});return t.ok?{ok:!0,operations:{capture:t.capture,...t.readTextAtPoint?{readText:t.readTextAtPoint}:{},...t.findText?{findText:t.findText}:{}}}:t}function xe(e){switch(e){case`is`:return`capture-only`;case`find`:case`get`:return`element-text`;case`wait`:return`wait-observation`}}const Se=[[`snapshotDepth`,`--depth`],[`snapshotScope`,`--scope`],[`snapshotRaw`,`--raw`]];function z(e,t){let n=Se.filter(([e])=>t?.[e]!==void 0).map(([,e])=>e);return n.length===0?null:v(`INVALID_ARGS`,`${e} @ref does not support ${n.join(`, `)}.`)}async function B(t,n){if(t.device.platform!==`android`||!t.appBundleId||t.lease?.leaseProvider||y(t.device))return null;if(!n)throw new e(`INTERNAL_ERROR`,`Android observation was not supplied by root runtime composition`);let r=await n.readAppState(t.device),i=r.package?.trim();if(!i||i===t.appBundleId)return null;let a=await n.isPermissionPackage(i);return!we(i)&&!a?null:{expectedPackage:t.appBundleId,foregroundPackage:i,activity:r.activity,hint:Ce(a),...a?{permissionDialog:!0}:{}}}function V(e){return e.permissionDialog?`Android permission dialog is blocking ${e.expectedPackage}`:`${e.foregroundPackage} is foreground instead of ${e.expectedPackage}`}function Ce(e){return e?`Use "alert get" to inspect it, then "alert accept" or "alert dismiss" to respond.`:`Use screenshot as visual truth, then take a fresh snapshot -i before retrying.`}function we(e){return e===`com.android.settings`||e===`com.android.systemui`||e.includes(`launcher`)}function H(e,t){let n=t?.iosSystemSurfaceBundleId?T(t.iosSystemSurfaceBundleId):te(t);if(!n)return e;if(e.ok){let t=U(e.data?.warning,n);return{...e,data:{...e.data,warning:t}}}let r=e.error.details??{};return{...e,error:{...e.error,details:{...r,hint:U(r.hint,n)}}}}function U(e,t){return typeof e==`string`&&e.trim()!==``?`${e}\n${t}`:t}async function Te(e){let{device:t,node:n,flags:r,appBundleId:i,traceOutPath:a,surface:s,contextFromFlags:c}=e,l=ie(n),u=e.readTextAtPoint;if(!u)return l;let d=ce(n.rect);if(!d||o(t)&&l&&!re(n.type??``))return l;let f=c(r,i,a),p=await u({point:d,options:{appBundleId:i,surface:s},execution:me(f)});return p.status===`read`?p.text:(se({level:`warn`,phase:`interaction_read_fallback`,data:{reason:Ee(p.reason),nodeRef:n.ref,surface:s,platform:t.platform}}),l)}function Ee(e){switch(e){case`no-text-at-point`:return`no_text_at_point`;default:return e}}function W(e){let{session:t,sessionStore:n,sessionName:r}=e,i=0,a,o,s=t=>(e.consumedSnapshot&&(e.consumedSnapshot.state=t.snapshot),t);return{capture:async c=>{let l=Date.now(),u=Pe(c,e.req.flags?.out),d=Ae({timestamp:l,lastSnapshotAt:i,lastSnapshotResult:a,lastSnapshotCacheKey:o,session:t,request:c,cacheKey:u});if(d)return s(d);let f=je({session:t,timestamp:l,request:c});if(f)return i=f.createdAt,a={snapshot:f},o=u,s(a);let p=await De({params:e,request:c});c.signal?.throwIfAborted();let m={snapshot:p};return Ie({session:t,sessionStore:n,sessionName:r,snapshot:p}),i=l,a=m,o=u,s(m)}}}async function De(e){let{params:t,request:n}=e,r=await G(t,n,n.snapshotScope);return n.recovery?.legacyIosSparse&&ae(r)?await Oe({runtimeParams:t,request:n,policy:n.recovery.legacyIosSparse}):n.recovery?.sparseVerdictQueryScope?.shouldScope&&w(r.snapshotQuality)?await ke({runtimeParams:t,request:n,policy:n.recovery.sparseVerdictQueryScope,snapshot:r}):r}async function Oe(e){let{runtimeParams:t,request:n,policy:r}=e;try{return await G(t,n,void 0,!1)}catch(e){if(!r.shouldScope)throw e;return await G(t,n,r.query,!1)}}async function ke(e){let{runtimeParams:t,request:n,policy:r,snapshot:i}=e;try{return await G(t,n,r.query,!1)}catch{return i}}async function G(e,t,n,r=t.flags?.snapshotInteractiveOnly){let i={...t.flags,snapshotInteractiveOnly:r},a=e.capture;return(await ve({device:e.device,session:e.session,flags:i,outPath:t.outPath??e.req.flags?.out,logPath:e.logPath??``,snapshotScope:n,includeRects:t.includeRects,signal:t.signal,captureData:async()=>await a(x({flags:i,logPath:e.logPath??``,meta:e.req.meta,session:e.session,snapshotScope:n,includeRects:t.includeRects,signal:t.signal}))})).snapshot}function Ae(e){let{timestamp:t,lastSnapshotAt:n,lastSnapshotResult:r,lastSnapshotCacheKey:i,session:a,request:o,cacheKey:s}=e;if(o.cache?.forceFresh!==!0&&r&&i===s&&!(t-n>=750)&&!S(a)&&!K(a,o))return r}function je(e){let{session:t,timestamp:n,request:r}=e,i=t?.snapshot;if(i&&Me(t,r)&&Ne(i,n)&&i.presentationKey===q(r))return i}function Me(e,t){return!(t.cache?.forceFresh===!0||t.cache?.useSessionSnapshot!==!0||S(e)||K(e,t))}function Ne(e,t){return t-e.createdAt<750}function K(e,t){return t.cache?.bypassForPostGestureStabilization===!0&&fe(e)}function q(e){return n(a(Fe(e)))}function Pe(e,t){return JSON.stringify({presentationKey:q(e),includeRects:e.includeRects===!0,outPath:e.outPath??t??null})}function Fe(e){return e.snapshotScope===void 0?e.flags:{...e.flags,snapshotScope:e.snapshotScope}}function Ie(e){let{session:t,sessionStore:n,sessionName:r,snapshot:i}=e;!t||w(i.snapshotQuality)||(b(t,i),n.set(r,t))}function J(e){return pe({backend:Re(e),...h(`selector commands`,{plural:!0}),sessions:ge({sessionName:e.sessionName,getSession:()=>e.session,recordOptions:{includeSnapshot:!0},setRecord:t=>{!e.session||!t.snapshot||(b(e.session,t.snapshot),e.sessionStore.set(e.sessionName,e.session))}}),signal:e.signal??le(e.req.meta?.requestId)})}async function Le(e,t){e.consumedSnapshot??={};let n=e.sessionStore.get(e.sessionName);return!n&&t?{ok:!1,response:ue()}:{ok:!0,session:n,device:n?.device??await C(e.req.flags??{})}}async function Y(e,t){let n=await Le(e,t.requireSession);if(!n.ok)return n;let r=await R({command:t.command,device:n.device,session:n.session,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});return r.ok?{ok:!0,runtime:J({...e,session:n.session,device:n.device,bound:r.operations})}:{ok:!1,response:r.response}}function Re(e){let{req:t,session:n,device:r,logPath:i,sessionName:a,sessionStore:o}=e,c=e.contextFromFlags??((e,t,n)=>de(i??``,e,t,n)),l=e.bound?.readText,u=e.bound?.findText,d=x({flags:t.flags,logPath:i??``,meta:t.meta,session:n,snapshotScope:void 0}).execution,f=e.bound,p=f===void 0?void 0:W({device:r,session:n,sessionStore:o,sessionName:a,req:t,consumedSnapshot:e.consumedSnapshot,logPath:i,capture:f.capture});return{platform:s(r),captureSnapshot:p&&(async(e,n)=>{let i={...t.flags,...E(n)},a=n?.includeRects===!0,o=n?.scope??t.flags?.snapshotScope,s=t.command===`wait`||t.command===`find`||ze(t)||a&&r.platform===`web`;return await p.capture({flags:i,signal:e.signal,snapshotScope:o,includeRects:a,cache:{forceFresh:s,useSessionSnapshot:!0,bypassForPostGestureStabilization:!0}})}),readText:async(e,i)=>({text:await Te({readTextAtPoint:l,device:r,node:i,flags:t.flags,appBundleId:n?.appBundleId,traceOutPath:n?.trace?.outPath,surface:n?.surface,contextFromFlags:c})}),...u?{findText:async(e,t)=>({found:(await u({text:t,options:{appBundleId:n?.appBundleId,surface:n?.surface},execution:d,...e.signal?{signal:e.signal}:{}})).found})}:{}}}function ze(e){if(e.command!==`is`)return!1;let t=d(e.positionals??[]);return t.ok&&t.predicate===`absent`}async function Be(e){let{req:t}=e;if(t.command!==`find`)return null;let n=t.positionals??[],r=u(n,t.flags);if(!r.ok)return v(r.code,r.message);let i=r.parsed,a=i.action;if(!c(a))return null;let o=await Y(e,{requireSession:!1,command:`find`});return o.ok?H(await Q(async()=>{let n=await o.runtime.selectors.find({session:e.sessionName,requestId:t.meta?.requestId,locator:i.locator,query:i.query,action:a,timeoutMs:i.timeoutMs});I(e.sessionStore,e.sessionName,t,k(n,a));let r=A(n),s=typeof r.ref==`string`?[r.ref]:Array.isArray(r.matches)?r.matches.map(e=>e.ref).filter(e=>typeof e==`string`):[];if(s.length>0){let t=e.sessionStore.get(e.sessionName);if(t&&(he(t,s),e.sessionStore.set(e.sessionName,t),t.snapshotGeneration!==void 0))return{...r,refsGeneration:t.snapshotGeneration}}return r}),X(e)):o.response}function X(e){return e.consumedSnapshot?.state??e.sessionStore.get(e.sessionName)?.snapshot}async function Ve(e){let{req:t}=e;if(t.command!==`get`)return null;let n=p(t.positionals?.[0]);if(!n.ok)return v(n.code,n.message);let r=n.format,i=Ue(t);if(!i.ok)return i.response;if(i.target.kind===`ref`){let e=z(`get`,t.flags);if(e)return e}let a=t.internal?.replayTargetGuard,o=await Y(e,{requireSession:!0,command:`get`});if(!o.ok)return o.response;let s=o.runtime,c=i.target.kind===`ref`?_e({session:e.sessionStore.get(e.sessionName),ref:i.target.ref,mintedGeneration:i.refGeneration}):void 0;return H(await Q(async()=>{let n=await s.selectors.get({session:e.sessionName,requestId:t.meta?.requestId,property:r,target:i.target,expectedResolvedTarget:a});I(e.sessionStore,e.sessionName,t,j(n,r),{node:n.node,preActionNodes:n.preActionNodes});let o=M(n);return c?{...o,warning:c}:o}),X(e))}async function He(e){let{req:t}=e;if(t.command!==`is`)return null;let n=d(t.positionals??[]);if(!n.ok)return v(n.code,n.message,n.hint?{hint:n.hint}:void 0);let{predicate:r,selectorExpression:i,expectedText:a}=n;if(r===`absent`){let e=ne({depth:t.flags?.snapshotDepth,scope:t.flags?.snapshotScope});if(e){let t=oe(e);return v(t.code,t.message,t.details)}}let o=t.internal?.replayTargetGuard,s=await Y(e,{requireSession:!0,command:`is`});return s.ok?H(await $(e,await Q(async()=>{let n=await s.runtime.selectors.is({session:e.sessionName,requestId:t.meta?.requestId,predicate:r,selector:i,expectedText:a,expectedResolvedTarget:o}),c=Z(n),l=N(n);return I(e.sessionStore,e.sessionName,t,l,c),F(l)}),`is ${r}`),X(e)):s.response}function Z(e){let t=e.node,n=e.preActionNodes;if(!(!t||typeof t!=`object`||!Array.isArray(n)))return{node:t,preActionNodes:n}}function Ue(e){let t=e.positionals?.[1]??``;if(t.startsWith(`@`)){let n=O(t);return n.ok?{ok:!0,target:{kind:`ref`,ref:n.ref,fallbackLabel:e.positionals.length>2?e.positionals.slice(2).join(` `).trim():``},refGeneration:n.generation}:{ok:!1,response:n.response}}let n=f(e.positionals?.slice(1)??[]);return n.ok?{ok:!0,target:{kind:`selector`,selector:`selector`in n?n.selector:``}}:{ok:!1,response:v(n.code,n.message)}}async function Q(e){try{return{ok:!0,data:await e()}}catch(e){let t=r(e);return v(t.code,t.message,t.details)}}async function $(e,t,n){if(t.ok)return t;let r=e.sessionStore.get(e.sessionName);if(!r)return t;let i;try{if(!e.androidObservation)return t;i=await B(r,e.androidObservation)}catch{return t}return i?v(t.error.code,`${n} failed because ${V(i)}.`,{...t.error.details??{},...i,blockedBy:`android_foreground_surface`,originalMessage:t.error.message}):t}export{O as _,$ as a,J as c,B as d,z as f,P as g,N as h,He as i,W as l,I as m,Be as n,Z as o,R as p,Ve as r,Q as s,X as t,H as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Br as e,Hr as t,Mr as n,Or as r,Ur as i,zr as a}from"./sdk-batch.js";import{n as o,t as s}from"./scroll-indicator.js";import{a as c,i as l,o as ee,r as u}from"./react-native-overlay.js";import{t as d}from"./rect-center.js";import{a as f,c as te,d as p,f as m,g as ne,h,i as g,l as re,m as _,n as v,o as y,p as b,r as x,s as S,t as C,u as ie}from"./tree.js";function ae(e,t){let n=g(t.sourceNodesByIndex.values());for(let r of e)oe(r,t.sourceNodesByIndex,n)&&b(t.replacements,r,{type:`Cell`})}function oe(e,t,r){return!(n(e.type??``)!==`other`||e.enabled===!1||!e.rect||!le(e.label)||!f(e,t,ce)||!se(e)||re(e.rect,r))}function se(e){return e.rect?e.rect.height>=44&&e.rect.height<=160&&e.rect.width>=120:!1}function ce(e){let t=n(e.type??``);return t===`scrollview`||t===`scrollarea`}function le(e){let t=e?.trim();return!(!t||/^(toolbar|window|application)$/i.test(t)||t.startsWith(`!,`)||/debugger|fast refresh/i.test(t))}function ue(e,t){let n=new Set;for(let r of e)de(t.replacements.get(r.index)??r)&&fe(r,t.sourceNodesByIndex,t,n);pe(e,t,n)}function de(e){let t=e.label?.trim();return!!(t&&o(t))}function fe(e,t,n,r){let i=!p(e.type)||n.isSuppressed(e),a=s(e.label?.trim()??``,e.value),o=a?y(e,t,{includeSelf:!0}):void 0;i&&n.suppressNode(e,o?[o]:[]),o&&a&&j(n,o,e,a)&&r.add(o.index)}function pe(e,t,n){let r=new Map;for(let i of e){let e=r.get(i.parentIndex??-1),a=e?.clip,o=t.replacements.get(i.index)??i,s=k(o.rect,a),c=me(o,a,s),l=w(e,c,o);T(t,i,o,a,s,c,l),r.set(i.index,E(i,o,a,s,l,n))}}function me(e,t,n){return!!(t&&a(e.rect)&&!a(n))}function w(e,t,n){return!!(e?.projectedOut||t&&O(n))}function T(e,t,n,r,i,a,o){o||a?e.suppressNode(t,[]):r&&i&&!A(n.rect,i)&&b(e.replacements,t,{rect:i})}function E(e,t,n,r,i,a){return{projectedOut:i,...D(e,t,n,r,a)?{clip:r}:n?{clip:n}:{}}}function D(e,t,n,r,i){return!!(a(r)&&(i.has(e.index)||n!==void 0&&p(t.type)))}function O(e){return e.type?.trim().toLowerCase()===`cell`||p(e.type)}function k(e,t){if(!e||!t)return e;let n=Math.max(e.x,t.x),r=Math.max(e.y,t.y),i=Math.min(e.x+e.width,t.x+t.width),a=Math.min(e.y+e.height,t.y+t.height);return{x:n,y:r,width:Math.max(0,i-n),height:Math.max(0,a-r)}}function A(e,t){return!!(e&&e.x===t.x&&e.y===t.y&&e.width===t.width&&e.height===t.height)}function j(e,t,n,r){let i=N((e.replacements.get(t.index)??t).rect,n.rect);return ne(e.replacements,t,e=>({rect:i??e.rect,hiddenContentAbove:M(e.hiddenContentAbove,r.above),hiddenContentBelow:M(e.hiddenContentBelow,r.below)})),!!i}function M(e,t){return e===!0||t?!0:void 0}function N(e,t){if(!(!e||!t)&&!(t.height<=0||t.height>=e.height)&&!(t.y<e.y||t.y>e.y+e.height))return{...e,y:t.y,height:Math.min(t.height,e.y+e.height-t.y)}}function P(e,t){for(let r=0;r<e.length;r+=1){let i=e[r],a=i?.label?.trim();i&&a&&n(i.type??``)===`other`&&t(i,a,r)}}function F(e,t){P(e,(n,r,i)=>{if(!c(r)||!n.rect)return;let a=x(e,i,e=>!!e.rect&&ee(e.label?.trim()??``));if(!a?.rect)return;let o=L(n.rect,a.rect);if(!o)return;let s=I(e,i,o);b(t,n,{rect:s}),S(e,i,e=>{c(e.label?.trim()??``)&&b(t,e,{rect:s})})})}function I(e,n,r){let a=r;return S(e,n,e=>{let n=e.label?.trim()??``;!e.rect||!c(n)||i(r,e.rect)&&t(e.rect)<t(a)&&(a=e.rect)}),a}function L(e,t){let n=e.x+e.width,r=t.x+t.width,i={x:t.x,y:e.y,width:n-t.x,height:e.height};if(t.x>e.x&&d(t,i))return{...e,width:t.x-e.x};let a={x:e.x,y:e.y,width:r-e.x,height:e.height};if(r<n&&d(t,a))return{...e,x:r,width:n-r}}function R(e,t){P(e,(n,r,i)=>{u(n)&&l(n,z(e,i))&&t.suppressNode(n,z(e,i))})}function z(e,t){let n=[];return S(e,t,e=>{n.push(e)}),n}function he(e,t){let n=g(e),r=n?n.y+n.height:null;if(r!==null)for(let n=0;n<e.length;n+=1){let i=e[n];!i||!ge(i,r)||(t.suppressNode(i,[]),_e(i,t,r),S(e,n,e=>{t.suppressNode(e,[])}))}}function ge(e,t){return!e.rect||n(e.type??``)!==`keyboard`?!1:e.rect.y>=t}function _e(e,t,n){let r=typeof e.parentIndex==`number`?t.sourceNodesByIndex.get(e.parentIndex):void 0;for(;r?.rect&&r.rect.y>=n;)t.suppressNode(r,[]),r=typeof r.parentIndex==`number`?t.sourceNodesByIndex.get(r.parentIndex):void 0}function ve(e,t){for(let r=0;r<e.length;r+=1){let i=e[r];if(!i)continue;if(ye(i)){B(e,r,i,t);continue}if(!be(i))continue;let a=x(e,r,e=>n(e.type??``)===`searchfield`&&e.label===`Search`);a&&(t.suppressNode(i,[a]),xe(i,a,t),B(e,r,a,t))}}function ye(e){return n(e.type??``)===`searchfield`&&e.label===`Search`}function be(e){let t=n(e.type??``);return e.label===`Toolbar`&&(t===`toolbar`||t===`searchfield`)}function B(e,t,n,r){S(e,t,e=>{e.index!==n.index&&Se(e)&&r.suppressNode(e,[n])})}function xe(e,t,n){let r=e;for(;typeof r.parentIndex==`number`;){let e=n.sourceNodesByIndex.get(r.parentIndex);if(!e||e.label!==`Toolbar`)return;n.suppressNode(e,[t]),r=e}}function Se(e){let t=n(e.type??``);return t===`button`?!1:t===`image`||e.label===`Search`}function Ce(e,t){for(let n=0;n<e.length;n+=1){let r=e[n],i=r?.label?.trim();!r||t.isSuppressed(r)||!i||we(e,n,r,i,t)}}function we(e,t,r,i,a){let o=n(r.type??``);if(o===`statictext`||o===`link`){V(e,t,i,r,a);return}if(o!==`other`)return;let s=Te(e,t,i);if(s){a.suppressNode(r,[s]);return}V(e,t,i,r,a)}function Te(e,t,r){return x(e,t,e=>{let t=n(e.type??``);return(t===`link`||t===`searchfield`||p(e.type))&&e.label?.trim()===r})}function V(e,t,n,r,i){S(e,t,e=>{!i.semanticRepresentativeIndexes.has(e.index)&&ie(e,n)&&i.suppressNode(e,[r])})}function Ee(e,t){P(e,(n,r,i)=>{let a=x(e,i,e=>m(e)&&e.label?.trim()===r&&(d(e.rect,n.rect)||De(n,e)));a&&t.suppressNode(n,[a])})}function De(e,t){if(t.label?.trim()!==e.label?.trim())return!1;let r=n(t.type??``);return Oe(e,r)||r===`textfield`||ke(e,r,t)}function Oe(e,t){let n=e.label?.trim();return t===`button`&&(n===`Dismiss`||n===`Back`)}function ke(e,t,n){return t!==`button`||!e.rect||!n.rect?!1:e.rect.x===0&&e.rect.y===0&&e.rect.width>=300&&e.rect.height>=600&&n.rect.width<e.rect.width}function Ae(e,t){let r=C(e);for(let i of e)n(i.type??``)===`other`&&(i.hittable===!0||i.label?.trim()||i.value?.trim()||i.identifier?.trim()&&t.suppressNode(i,je(i,r)))}function je(e,t){let n=[],r=new Set([e.index]),i=[...t.get(e.index)??[]];for(;i.length>0;){let e=i.pop();if(!e||r.has(e.index))continue;r.add(e.index),n.push(e);let a=t.get(e.index);a&&i.push(...a)}return n}function Me(e,t){he(e,t),Ae(e,t),ue(e,t),ve(e,t),Ee(e,t),F(e,t.replacements),R(e,t),Ce(e,t)}function Ne(e,t){for(let n=0;n<e.length;n+=1){let r=e[n],i=r?Pe(e,n,r,t):void 0;!r?.rect||!i||Le(e,n,r,i,t)}}function Pe(e,t,r,i){let a=r.label?.trim();if(n(r.type??``)!==`cell`||a&&!Fe(a,r.identifier)&&!o(a))return a;let s=v(e,t).find(Ie),c=s?.label?.trim();return!s||!c?a:(b(i.replacements,r,{label:c}),i.suppressNode(s,[r]),c)}function Fe(e,t){return t?.trim()===e&&/^[A-Z_$][A-Za-z0-9_$]*Cell$/.test(e)}function Ie(e){if(!e.label?.trim())return!1;let t=n(e.type??``);return t===`statictext`||t===`text`||t===`textview`}function Le(e,t,r,i,a){let o=n(r.type??``);if(o===`button`){H(v(e,t),i,a,r);return}if(o!==`cell`)return;let s=v(e,t);Re(s,r,i,a)||ze(s,r,i,a)}function Re(e,t,n,r){let i=e.find(e=>Ve(e,t,n));if(!i)return!1;let a=e.find(e=>U(e,t,n)),o=i.identifier?void 0:a?.identifier??t.identifier;return o&&b(r.replacements,i,{identifier:o}),r.suppressNode(t,[i]),Be(e,t,n,i,r),!0}function ze(e,t,n,r){let i=e.find(e=>U(e,t,n));if(!i){e.some(te)&&H(e,n,r,t);return}!t.identifier&&i.identifier&&b(r.replacements,t,{identifier:i.identifier}),r.suppressNode(i,[t]),H(e.filter(e=>e.index!==i.index),n,r,t)}function Be(e,t,n,r,i){for(let a of e)a.index!==r.index&&(U(a,t,n)||W(a,t)||He(a,r)||h(a,n))&&i.suppressNode(a,[r])}function H(e,t,n,r){for(let i of e)(h(i,t)||r&&W(i,r))&&n.suppressNode(i,r?[r]:[])}function U(e,t,r){if(n(e.type??``)!==`button`)return!1;let i=t.identifier?.trim(),a=e.identifier?.trim();return i&&a&&i===a?!0:e.label?.trim()===r&&d(e.rect,t.rect)}function W(e,t){return n(e.type??``)===`button`&&!e.label?.trim()&&!e.value?.trim()&&d(e.rect,t.rect)}function Ve(e,t,r){if(n(e.type??``)!==`switch`)return!1;let i=t.identifier?.trim(),a=e.identifier?.trim();return i&&a&&i===a?!0:e.label?.trim()===r}function He(e,t){if(n(e.type??``)!==`switch`||e.index===t.index)return!1;let r=e.label?.trim();return r===t.value?.trim()||r===`0`||r===`1`}const G=1.15;function Ue(t,n,r){let i=new Map(t.map((e,t)=>[e.index,t]));for(let[a,o]of t.entries()){let s=We(t,i,n,o,r);if(!s)continue;q(t,a,r);let c=J(s.shelfRect,2);for(let n of s.intermediateSiblings){if($e(n)||!n.rect||!e(n.rect,c))continue;let a=i.get(n.index);a!==void 0&&q(t,a,r)}}}function We(e,t,n,r,i){let a=Ge(r,n,i.sourceNodesByIndex);if(!a)return;let o=Je(e,t,a.siblings,a.position,a.parent);if(!(o<0))return{shelfRect:a.rect,intermediateSiblings:a.siblings.slice(a.position+1,o)}}function Ge(e,t,n){let r=Ye(e,K(t,e.index));if(!r)return;let i=qe(e,n);if(!i||!i.rect)return;let a=K(t,i.index),o=a.findIndex(t=>t.index===e.index);if(Ke(a,o,e,r))return{rect:r.rect,parent:i,siblings:a,position:o}}function K(e,t){return e.get(t)??[]}function Ke(e,t,n,r){if(t<1)return!1;let i=Xe(e,t,n);return i?!r.childActionsPresented||!Ze(i,r.actionButtons):!1}function qe(e,t){return typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0}function Je(e,t,n,r,i){return n.findIndex((n,a)=>a>r&&Qe(e,t.get(n.index),n,i))}function Ye(e,t){if(!p(e.type)||!e.rect)return;let r=e.rect,a=t.filter(e=>n(e.type??``)===`button`&&e.rect);if(a.length===0&&e.hiddenContentBelow===!0)return{rect:r,childActionsPresented:!1,actionButtons:a};if(a.length<3)return;let o=a.map(e=>e.rect.x+e.rect.width/2);if(o.every((e,t)=>t===0||e>o[t-1]))return{rect:r,childActionsPresented:a.some(e=>i(r,e.rect)),actionButtons:a}}function Xe(e,t,n){if(!(!n.rect||t<1))for(let r=t-1;r>=0;--r){let t=e[r];if(!(!t.rect||!m(t))&&t.rect.x+t.rect.width/2<n.rect.x&&et(t.rect,J(n.rect,2)))return t}}function Ze(e,t){if(!e.rect||t.length===0)return!1;let n=Math.max(...t.map(e=>e.rect?.width??0)),r=Math.max(...t.map(e=>e.rect?.height??0));return e.rect.width>n*G||e.rect.height>r*G}function Qe(e,t,r,i){return t!==void 0&&n(r.type??``)===`other`&&d(r.rect,i.rect)&&!!x(e,t,m)}function q(e,t,n){let r=e[t];if(r){n.suppressNode(r,[]);for(let r of v(e,t))n.suppressNode(r,[])}}function $e(e){let t=n(e.type??``);return t===`textfield`||t===`securetextfield`||t===`searchfield`||t===`textview`}function J(e,t){return{x:e.x-t,y:e.y-t,width:e.width+t*2,height:e.height+t*2}}function et(e,t){return Math.max(e.y,t.y)<=Math.min(e.y+e.height,t.y+t.height)}function tt(e,t){let n=C(e);Ue(e,n,t),nt(e,n,t)}function nt(e,t,r){for(let i of e){if(n(i.type??``)!==`navigationbar`||!i.rect)continue;let e=t.get(i.index)??[],a=e.flatMap(t=>rt(t,e,i.rect));if(a.length!==1)continue;let{field:o,title:s,image:c,label:l}=a[0];b(r.replacements,o,{type:`Button`,label:l,enabled:!0,rect:st([c.rect,o.rect,s.rect])}),r.semanticRepresentativeIndexes.add(o.index),r.suppressNode(s,[o]),r.suppressNode(c,[o])}}function rt(e,t,n){let i=r(e);if(!it(e,i))return[];let a=X(t,e=>at(e,i)),o=X(t,Y);return a?.rect&&o?.rect&&ot(o.rect,e.rect,a.rect,n)?[{field:e,title:a,image:o,label:i}]:[]}function it(e,t){return n(e.type??``)===`textfield`&&e.enabled===!1&&!!e.rect&&!!t&&e.value?.trim()===t}function at(e,t){return n(e.type??``)===`statictext`&&e.label?.trim()===t&&!!e.rect}function Y(e){return n(e.type??``)===`image`&&!!e.identifier?.trim()&&!!e.rect}function X(e,t){let n=e.filter(t);return n.length===1?n[0]:void 0}function ot(e,t,n,r){let a=t.x-(e.x+e.width),o=n.x-(t.x+t.width);return i(r,e)&&i(r,t)&&i(r,n)&&a>=0&&a<=12&&o>=0&&o<=12&&Z(e,t)&&Z(t,n)}function Z(e,t){return Math.max(e.y,t.y)<=Math.min(e.y+e.height,t.y+t.height)}function st(e){let t=Math.min(...e.map(e=>e.x)),n=Math.min(...e.map(e=>e.y)),r=Math.max(...e.map(e=>e.x+e.width)),i=Math.max(...e.map(e=>e.y+e.height));return{x:t,y:n,width:r-t,height:i-n}}function ct(e,t){let r=C(e);for(let i of e){if(n(i.type??``)===`element(58)`){b(t.replacements,i,{type:`WebView`});continue}let e=lt(i,t.sourceNodesByIndex,r);if(e?.kind===`suppress`){t.suppressNode(i,[]);continue}e&&(b(t.replacements,i,{type:e.type,...e.type===`Heading`?{value:void 0}:{}}),t.semanticRepresentativeIndexes.add(i.index))}}function lt(e,t,r){if(n(e.type??``)!==`other`)return null;let i=f(e,t,ft),a=e.label?.trim();return!i||!a?null:dt(e,i,a)?{kind:`suppress`}:ut(e,a,r)?{kind:`semantic`,type:Q(e.value)?`Heading`:`StaticText`}:null}function ut(e,t,r){let i=r.get(e.index);if(i?.length!==1)return!1;let a=i[0];return n(a.type??``)===`statictext`&&a.label?.trim()===t&&!r.has(a.index)}function dt(e,t,n){return e.parentIndex===t.index&&t.label?.trim()===n&&!Q(e.value)}function ft(e){let t=n(e.type??``);return t===`webview`||t===`element(58)`}function Q(e){return/^[1-6]$/.test(e?.trim()??``)}const pt=[ct,tt,ae,Ne,Me];function mt(e){if(e.length===0)return{nodes:e,presentedIndexesBySourceIndex:new Map};let t=new Map,n=new Map,r=new Set,i=new Map(e.map(e=>[e.index,e])),a=new Set,o={replacements:t,semanticRepresentativeIndexes:r,sourceNodesByIndex:i,isSuppressed:e=>a.has(e.index),suppressNode(e,t){if(a.add(e.index),t.length===0)return;let r=n.get(e.index)??new Set;for(let e of t)r.add(e.index);n.set(e.index,r)}};for(let t of pt)t(e,o);if(a.size===0&&t.size===0)return{nodes:e,presentedIndexesBySourceIndex:new Map(e.map(e=>[e.index,[e.index]]))};let s=e.filter(e=>!a.has(e.index)).map(e=>t.get(e.index)??e),c=_(s,a,e),l=new Map(s.map((e,t)=>[e.index,c[t].index]));return{nodes:c,presentedIndexesBySourceIndex:new Map(e.map(e=>[e.index,$(e.index,l,n)]))}}function $(e,t,n,r=new Set){let i=t.get(e);if(i!==void 0)return[i];if(r.has(e))return[];r.add(e);let a=new Set;for(let i of n.get(e)??[])for(let e of $(i,t,n,r))a.add(e);return[...a].sort((e,t)=>e-t)}export{mt as t};
|
|
1
|
+
import{Br as e,Hr as t,Mr as n,Or as r,Ur as i,zr as a}from"./sdk-batch.js";import{n as o,t as s}from"./scroll-indicator.js";import{a as c,i as l,o as ee,r as u}from"./react-native-overlay.js";import{t as d}from"./rect-center.js";import{a as f,c as te,d as p,f as m,g as ne,h,i as g,l as re,m as _,n as v,o as y,p as b,r as x,s as S,t as C,u as ie}from"./tree.js";function ae(e,t){let n=g(t.sourceNodesByIndex.values());for(let r of e)oe(r,t.sourceNodesByIndex,n)&&b(t.replacements,r,{type:`Cell`})}function oe(e,t,r){return!(n(e.type??``)!==`other`||e.enabled===!1||!e.rect||!le(e.label)||!f(e,t,ce)||!se(e)||re(e.rect,r))}function se(e){return e.rect?e.rect.height>=44&&e.rect.height<=160&&e.rect.width>=120:!1}function ce(e){let t=n(e.type??``);return t===`scrollview`||t===`scrollarea`}function le(e){let t=e?.trim();return!(!t||/^(toolbar|window|application)$/i.test(t)||t.startsWith(`!,`)||/debugger|fast refresh/i.test(t))}function ue(e,t){let n=new Set;for(let r of e)de(t.replacements.get(r.index)??r)&&fe(r,t.sourceNodesByIndex,t,n);pe(e,t,n)}function de(e){let t=e.label?.trim();return!!(t&&o(t))}function fe(e,t,n,r){let i=!p(e.type)||n.isSuppressed(e),a=s(e.label?.trim()??``,e.value),o=a?y(e,t,{includeSelf:!0}):void 0;i&&n.suppressNode(e,o?[o]:[]),o&&a&&j(n,o,e,a)&&r.add(o.index)}function pe(e,t,n){let r=new Map;for(let i of e){let e=r.get(i.parentIndex??-1),a=e?.clip,o=t.replacements.get(i.index)??i,s=k(o.rect,a),c=me(o,a,s),l=w(e,c,o);T(t,i,o,a,s,c,l),r.set(i.index,E(i,o,a,s,l,n))}}function me(e,t,n){return!!(t&&a(e.rect)&&!a(n))}function w(e,t,n){return!!(e?.projectedOut||t&&O(n))}function T(e,t,n,r,i,a,o){o||a?e.suppressNode(t,[]):r&&i&&!A(n.rect,i)&&b(e.replacements,t,{rect:i})}function E(e,t,n,r,i,a){return{projectedOut:i,...D(e,t,n,r,a)?{clip:r}:n?{clip:n}:{}}}function D(e,t,n,r,i){return!!(a(r)&&(i.has(e.index)||n!==void 0&&p(t.type)))}function O(e){return e.type?.trim().toLowerCase()===`cell`||p(e.type)}function k(e,t){if(!e||!t)return e;let n=Math.max(e.x,t.x),r=Math.max(e.y,t.y),i=Math.min(e.x+e.width,t.x+t.width),a=Math.min(e.y+e.height,t.y+t.height);return{x:n,y:r,width:Math.max(0,i-n),height:Math.max(0,a-r)}}function A(e,t){return!!(e&&e.x===t.x&&e.y===t.y&&e.width===t.width&&e.height===t.height)}function j(e,t,n,r){let i=N((e.replacements.get(t.index)??t).rect,n.rect);return ne(e.replacements,t,e=>({rect:i??e.rect,hiddenContentAbove:M(e.hiddenContentAbove,r.above),hiddenContentBelow:M(e.hiddenContentBelow,r.below)})),!!i}function M(e,t){return e===!0||t?!0:void 0}function N(e,t){if(!(!e||!t)&&!(t.height<=0||t.height>=e.height)&&!(t.y<e.y||t.y>e.y+e.height))return{...e,y:t.y,height:Math.min(t.height,e.y+e.height-t.y)}}function P(e,t){for(let r=0;r<e.length;r+=1){let i=e[r],a=i?.label?.trim();i&&a&&n(i.type??``)===`other`&&t(i,a,r)}}function F(e,t){P(e,(n,r,i)=>{if(!c(r)||!n.rect)return;let a=x(e,i,e=>!!e.rect&&ee(e.label?.trim()??``));if(!a?.rect)return;let o=L(n.rect,a.rect);if(!o)return;let s=I(e,i,o);b(t,n,{rect:s}),S(e,i,e=>{c(e.label?.trim()??``)&&b(t,e,{rect:s})})})}function I(e,n,r){let a=r;return S(e,n,e=>{let n=e.label?.trim()??``;!e.rect||!c(n)||i(r,e.rect)&&t(e.rect)<t(a)&&(a=e.rect)}),a}function L(e,t){let n=e.x+e.width,r=t.x+t.width,i={x:t.x,y:e.y,width:n-t.x,height:e.height};if(t.x>e.x&&d(t,i))return{...e,width:t.x-e.x};let a={x:e.x,y:e.y,width:r-e.x,height:e.height};if(r<n&&d(t,a))return{...e,x:r,width:n-r}}function R(e,t){P(e,(n,r,i)=>{u(n)&&l(n,z(e,i))&&t.suppressNode(n,z(e,i))})}function z(e,t){let n=[];return S(e,t,e=>{n.push(e)}),n}function he(e,t){let n=g(e),r=n?n.y+n.height:null;if(r!==null)for(let n=0;n<e.length;n+=1){let i=e[n];!i||!ge(i,r)||(t.suppressNode(i,[]),_e(i,t,r),S(e,n,e=>{t.suppressNode(e,[])}))}}function ge(e,t){return!e.rect||n(e.type??``)!==`keyboard`?!1:e.rect.y>=t}function _e(e,t,n){let r=typeof e.parentIndex==`number`?t.sourceNodesByIndex.get(e.parentIndex):void 0;for(;r?.rect&&r.rect.y>=n;)t.suppressNode(r,[]),r=typeof r.parentIndex==`number`?t.sourceNodesByIndex.get(r.parentIndex):void 0}function ve(e,t){for(let r=0;r<e.length;r+=1){let i=e[r];if(!i)continue;if(ye(i)){B(e,r,i,t);continue}if(!be(i))continue;let a=x(e,r,e=>n(e.type??``)===`searchfield`&&e.label===`Search`);a&&(t.suppressNode(i,[a]),xe(i,a,t),B(e,r,a,t))}}function ye(e){return n(e.type??``)===`searchfield`&&e.label===`Search`}function be(e){let t=n(e.type??``);return e.label===`Toolbar`&&(t===`toolbar`||t===`searchfield`)}function B(e,t,n,r){S(e,t,e=>{e.index!==n.index&&Se(e)&&r.suppressNode(e,[n])})}function xe(e,t,n){let r=e;for(;typeof r.parentIndex==`number`;){let e=n.sourceNodesByIndex.get(r.parentIndex);if(!e||e.label!==`Toolbar`)return;n.suppressNode(e,[t]),r=e}}function Se(e){let t=n(e.type??``);return t===`button`?!1:t===`image`||e.label===`Search`}function Ce(e,t){for(let n=0;n<e.length;n+=1){let r=e[n],i=r?.label?.trim();!r||t.isSuppressed(r)||!i||we(e,n,r,i,t)}}function we(e,t,r,i,a){let o=n(r.type??``);if(o===`statictext`||o===`link`){V(e,t,i,r,a);return}if(o!==`other`)return;let s=Te(e,t,i);if(s){a.suppressNode(r,[s]);return}V(e,t,i,r,a)}function Te(e,t,r){return x(e,t,e=>{let t=n(e.type??``);return(t===`link`||t===`searchfield`||p(e.type))&&e.label?.trim()===r})}function V(e,t,n,r,i){S(e,t,e=>{!i.semanticRepresentativeIndexes.has(e.index)&&ie(e,n)&&i.suppressNode(e,[r])})}function Ee(e,t){P(e,(n,r,i)=>{let a=x(e,i,e=>m(e)&&e.label?.trim()===r&&(d(e.rect,n.rect)||De(n,e)));a&&t.suppressNode(n,[a])})}function De(e,t){if(t.label?.trim()!==e.label?.trim())return!1;let r=n(t.type??``);return Oe(e,r)||r===`textfield`||ke(e,r,t)}function Oe(e,t){let n=e.label?.trim();return t===`button`&&(n===`Dismiss`||n===`Back`)}function ke(e,t,n){return t!==`button`||!e.rect||!n.rect?!1:e.rect.x===0&&e.rect.y===0&&e.rect.width>=300&&e.rect.height>=600&&n.rect.width<e.rect.width}function Ae(e,t){let r=C(e);for(let i of e){if(n(i.type??``)!==`other`||i.hittable===!0||i.label?.trim()||i.value?.trim()||!i.identifier?.trim())continue;let e=je(i,r);(e.length!==0||i.hittable===!1)&&t.suppressNode(i,e)}}function je(e,t){let n=[],r=new Set([e.index]),i=[...t.get(e.index)??[]];for(;i.length>0;){let e=i.pop();if(!e||r.has(e.index))continue;r.add(e.index),n.push(e);let a=t.get(e.index);a&&i.push(...a)}return n}function Me(e,t){he(e,t),Ae(e,t),ue(e,t),ve(e,t),Ee(e,t),F(e,t.replacements),R(e,t),Ce(e,t)}function Ne(e,t){for(let n=0;n<e.length;n+=1){let r=e[n],i=r?Pe(e,n,r,t):void 0;!r?.rect||!i||Le(e,n,r,i,t)}}function Pe(e,t,r,i){let a=r.label?.trim();if(n(r.type??``)!==`cell`||a&&!Fe(a,r.identifier)&&!o(a))return a;let s=v(e,t).find(Ie),c=s?.label?.trim();return!s||!c?a:(b(i.replacements,r,{label:c}),i.suppressNode(s,[r]),c)}function Fe(e,t){return t?.trim()===e&&/^[A-Z_$][A-Za-z0-9_$]*Cell$/.test(e)}function Ie(e){if(!e.label?.trim())return!1;let t=n(e.type??``);return t===`statictext`||t===`text`||t===`textview`}function Le(e,t,r,i,a){let o=n(r.type??``);if(o===`button`){H(v(e,t),i,a,r);return}if(o!==`cell`)return;let s=v(e,t);Re(s,r,i,a)||ze(s,r,i,a)}function Re(e,t,n,r){let i=e.find(e=>Ve(e,t,n));if(!i)return!1;let a=e.find(e=>U(e,t,n)),o=i.identifier?void 0:a?.identifier??t.identifier;return o&&b(r.replacements,i,{identifier:o}),r.suppressNode(t,[i]),Be(e,t,n,i,r),!0}function ze(e,t,n,r){let i=e.find(e=>U(e,t,n));if(!i){e.some(te)&&H(e,n,r,t);return}!t.identifier&&i.identifier&&b(r.replacements,t,{identifier:i.identifier}),r.suppressNode(i,[t]),H(e.filter(e=>e.index!==i.index),n,r,t)}function Be(e,t,n,r,i){for(let a of e)a.index!==r.index&&(U(a,t,n)||W(a,t)||He(a,r)||h(a,n))&&i.suppressNode(a,[r])}function H(e,t,n,r){for(let i of e)(h(i,t)||r&&W(i,r))&&n.suppressNode(i,r?[r]:[])}function U(e,t,r){if(n(e.type??``)!==`button`)return!1;let i=t.identifier?.trim(),a=e.identifier?.trim();return i&&a&&i===a?!0:e.label?.trim()===r&&d(e.rect,t.rect)}function W(e,t){return n(e.type??``)===`button`&&!e.label?.trim()&&!e.value?.trim()&&d(e.rect,t.rect)}function Ve(e,t,r){if(n(e.type??``)!==`switch`)return!1;let i=t.identifier?.trim(),a=e.identifier?.trim();return i&&a&&i===a?!0:e.label?.trim()===r}function He(e,t){if(n(e.type??``)!==`switch`||e.index===t.index)return!1;let r=e.label?.trim();return r===t.value?.trim()||r===`0`||r===`1`}const G=1.15;function Ue(t,n,r){let i=new Map(t.map((e,t)=>[e.index,t]));for(let[a,o]of t.entries()){let s=We(t,i,n,o,r);if(!s)continue;q(t,a,r);let c=J(s.shelfRect,2);for(let n of s.intermediateSiblings){if($e(n)||!n.rect||!e(n.rect,c))continue;let a=i.get(n.index);a!==void 0&&q(t,a,r)}}}function We(e,t,n,r,i){let a=Ge(r,n,i.sourceNodesByIndex);if(!a)return;let o=Je(e,t,a.siblings,a.position,a.parent);if(!(o<0))return{shelfRect:a.rect,intermediateSiblings:a.siblings.slice(a.position+1,o)}}function Ge(e,t,n){let r=Ye(e,K(t,e.index));if(!r)return;let i=qe(e,n);if(!i||!i.rect)return;let a=K(t,i.index),o=a.findIndex(t=>t.index===e.index);if(Ke(a,o,e,r))return{rect:r.rect,parent:i,siblings:a,position:o}}function K(e,t){return e.get(t)??[]}function Ke(e,t,n,r){if(t<1)return!1;let i=Xe(e,t,n);return i?!r.childActionsPresented||!Ze(i,r.actionButtons):!1}function qe(e,t){return typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0}function Je(e,t,n,r,i){return n.findIndex((n,a)=>a>r&&Qe(e,t.get(n.index),n,i))}function Ye(e,t){if(!p(e.type)||!e.rect)return;let r=e.rect,a=t.filter(e=>n(e.type??``)===`button`&&e.rect);if(a.length===0&&e.hiddenContentBelow===!0)return{rect:r,childActionsPresented:!1,actionButtons:a};if(a.length<3)return;let o=a.map(e=>e.rect.x+e.rect.width/2);if(o.every((e,t)=>t===0||e>o[t-1]))return{rect:r,childActionsPresented:a.some(e=>i(r,e.rect)),actionButtons:a}}function Xe(e,t,n){if(!(!n.rect||t<1))for(let r=t-1;r>=0;--r){let t=e[r];if(!(!t.rect||!m(t))&&t.rect.x+t.rect.width/2<n.rect.x&&et(t.rect,J(n.rect,2)))return t}}function Ze(e,t){if(!e.rect||t.length===0)return!1;let n=Math.max(...t.map(e=>e.rect?.width??0)),r=Math.max(...t.map(e=>e.rect?.height??0));return e.rect.width>n*G||e.rect.height>r*G}function Qe(e,t,r,i){return t!==void 0&&n(r.type??``)===`other`&&d(r.rect,i.rect)&&!!x(e,t,m)}function q(e,t,n){let r=e[t];if(r){n.suppressNode(r,[]);for(let r of v(e,t))n.suppressNode(r,[])}}function $e(e){let t=n(e.type??``);return t===`textfield`||t===`securetextfield`||t===`searchfield`||t===`textview`}function J(e,t){return{x:e.x-t,y:e.y-t,width:e.width+t*2,height:e.height+t*2}}function et(e,t){return Math.max(e.y,t.y)<=Math.min(e.y+e.height,t.y+t.height)}function tt(e,t){let n=C(e);Ue(e,n,t),nt(e,n,t)}function nt(e,t,r){for(let i of e){if(n(i.type??``)!==`navigationbar`||!i.rect)continue;let e=t.get(i.index)??[],a=e.flatMap(t=>rt(t,e,i.rect));if(a.length!==1)continue;let{field:o,title:s,image:c,label:l}=a[0];b(r.replacements,o,{type:`Button`,label:l,enabled:!0,rect:st([c.rect,o.rect,s.rect])}),r.semanticRepresentativeIndexes.add(o.index),r.suppressNode(s,[o]),r.suppressNode(c,[o])}}function rt(e,t,n){let i=r(e);if(!it(e,i))return[];let a=X(t,e=>at(e,i)),o=X(t,Y);return a?.rect&&o?.rect&&ot(o.rect,e.rect,a.rect,n)?[{field:e,title:a,image:o,label:i}]:[]}function it(e,t){return n(e.type??``)===`textfield`&&e.enabled===!1&&!!e.rect&&!!t&&e.value?.trim()===t}function at(e,t){return n(e.type??``)===`statictext`&&e.label?.trim()===t&&!!e.rect}function Y(e){return n(e.type??``)===`image`&&!!e.identifier?.trim()&&!!e.rect}function X(e,t){let n=e.filter(t);return n.length===1?n[0]:void 0}function ot(e,t,n,r){let a=t.x-(e.x+e.width),o=n.x-(t.x+t.width);return i(r,e)&&i(r,t)&&i(r,n)&&a>=0&&a<=12&&o>=0&&o<=12&&Z(e,t)&&Z(t,n)}function Z(e,t){return Math.max(e.y,t.y)<=Math.min(e.y+e.height,t.y+t.height)}function st(e){let t=Math.min(...e.map(e=>e.x)),n=Math.min(...e.map(e=>e.y)),r=Math.max(...e.map(e=>e.x+e.width)),i=Math.max(...e.map(e=>e.y+e.height));return{x:t,y:n,width:r-t,height:i-n}}function ct(e,t){let r=C(e);for(let i of e){if(n(i.type??``)===`element(58)`){b(t.replacements,i,{type:`WebView`});continue}let e=lt(i,t.sourceNodesByIndex,r);if(e?.kind===`suppress`){t.suppressNode(i,[]);continue}e&&(b(t.replacements,i,{type:e.type,...e.type===`Heading`?{value:void 0}:{}}),t.semanticRepresentativeIndexes.add(i.index))}}function lt(e,t,r){if(n(e.type??``)!==`other`)return null;let i=f(e,t,ft),a=e.label?.trim();return!i||!a?null:dt(e,i,a)?{kind:`suppress`}:ut(e,a,r)?{kind:`semantic`,type:Q(e.value)?`Heading`:`StaticText`}:null}function ut(e,t,r){let i=r.get(e.index);if(i?.length!==1)return!1;let a=i[0];return n(a.type??``)===`statictext`&&a.label?.trim()===t&&!r.has(a.index)}function dt(e,t,n){return e.parentIndex===t.index&&t.label?.trim()===n&&!Q(e.value)}function ft(e){let t=n(e.type??``);return t===`webview`||t===`element(58)`}function Q(e){return/^[1-6]$/.test(e?.trim()??``)}const pt=[ct,tt,ae,Ne,Me];function mt(e){if(e.length===0)return{nodes:e,presentedIndexesBySourceIndex:new Map};let t=new Map,n=new Map,r=new Set,i=new Map(e.map(e=>[e.index,e])),a=new Set,o={replacements:t,semanticRepresentativeIndexes:r,sourceNodesByIndex:i,isSuppressed:e=>a.has(e.index),suppressNode(e,t){if(a.add(e.index),t.length===0)return;let r=n.get(e.index)??new Set;for(let e of t)r.add(e.index);n.set(e.index,r)}};for(let t of pt)t(e,o);if(a.size===0&&t.size===0)return{nodes:e,presentedIndexesBySourceIndex:new Map(e.map(e=>[e.index,[e.index]]))};let s=e.filter(e=>!a.has(e.index)).map(e=>t.get(e.index)??e),c=_(s,a,e),l=new Map(s.map((e,t)=>[e.index,c[t].index]));return{nodes:c,presentedIndexesBySourceIndex:new Map(e.map(e=>[e.index,$(e.index,l,n)]))}}function $(e,t,n,r=new Set){let i=t.get(e);if(i!==void 0)return[i];if(r.has(e))return[];r.add(e);let a=new Set;for(let i of n.get(e)??[])for(let e of $(i,t,n,r))a.add(e);return[...a].sort((e,t)=>e-t)}export{mt as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
function e(e){return Object.freeze({async observeRunnerSession(e){let{getRunnerSessionSnapshot:t}=await import(`./runner-client.js`).then(e=>e.
|
|
1
|
+
function e(e){return Object.freeze({async observeRunnerSession(e){let{getRunnerSessionSnapshot:t}=await import(`./runner-client.js`).then(e=>e.g),n=await t(e);return n?{alive:n.alive,sessionId:n.sessionId}:void 0},async resolveSoleForegroundApp(t={}){try{let n=await e.listLocalDevices({platform:`ios`,iosSimulatorSetPath:t.simulatorSetPath,kind:`simulator`,booted:!0});if(n.length!==1)return;let[r]=n;if(!r)return;let{detectSoleRunningIosSimulatorApp:i}=await import(`./app-resolution.js`).then(e=>e.t),a=await i(r);return a?{device:r,app:{bundleId:a.bundleId}}:void 0}catch(t){if(e.shouldPropagateProbeError(t))throw t;return}}})}export{e as createAppleSessionObservation};
|