agent-device 0.21.17 → 0.21.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.17.apk → agent-device-android-ime-helper-0.21.19.apk} +0 -0
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.19.apk.sha256 +1 -0
- package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.17.manifest.json → agent-device-android-ime-helper-0.21.19.manifest.json} +4 -4
- package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.17.apk → agent-device-android-snapshot-helper-0.21.19.apk} +0 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.19.apk.sha256 +1 -0
- package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.17.manifest.json → agent-device-android-snapshot-helper-0.21.19.manifest.json} +6 -6
- package/dist/src/adapter.js +1 -1
- package/dist/src/adb-executor.js +2 -2
- package/dist/src/adb-failure.js +2 -1
- package/dist/src/agent-browser-lifecycle.js +1 -1
- package/dist/src/agent-browser-process-record.js +1 -1
- package/dist/src/agent-browser-provider.js +1 -1
- package/dist/src/agent-device-client.js +2 -2
- package/dist/src/ai-sdk.js +1 -1
- package/dist/src/alert-runtime.js +1 -1
- package/dist/src/android-input-ownership.js +1 -1
- package/dist/src/android.js +1 -1
- package/dist/src/app-log-runtime2.js +1 -1
- package/dist/src/cache.js +1 -1
- package/dist/src/catalog.js +1 -1
- package/dist/src/cli-help.js +1 -1
- package/dist/src/cli.js +4 -4
- package/dist/src/client-types.d.ts +11 -4
- package/dist/src/command-metadata.js +1 -1
- package/dist/src/command-tools.js +2 -2
- package/dist/src/contracts.js +1 -1
- package/dist/src/daemon-client-lease-beat.js +1 -1
- package/dist/src/daemon-client-lifecycle.js +1 -1
- package/dist/src/daemon-client-transport.js +1 -1
- package/dist/src/daemon-policy-file.js +1 -1
- package/dist/src/device-claim-inspection.js +1 -1
- package/dist/src/device-claim-rule.js +1 -1
- package/dist/src/device-inventory-context.js +1 -1
- package/dist/src/device-session.js +1 -1
- package/dist/src/diagnostics.js +1 -1
- package/dist/src/diagnostics2.js +1 -1
- package/dist/src/durable-resource.js +1 -1
- package/dist/src/engine-eval-script.js +1 -1
- package/dist/src/error.js +1 -1
- package/dist/src/find.js +1 -1
- package/dist/src/finders.js +1 -1
- package/dist/src/generic-settle.js +1 -1
- package/dist/src/gesture-runtime.js +1 -1
- package/dist/src/index.d.ts +2 -2
- package/dist/src/index.js +1 -1
- package/dist/src/input-actions2.js +2 -2
- package/dist/src/install-source-network-transport.js +1 -1
- package/dist/src/interaction-positionals.js +1 -1
- package/dist/src/interaction-ref-policy.js +1 -1
- package/dist/src/interaction.js +1 -1
- package/dist/src/interaction2.js +1 -1
- package/dist/src/interactor.js +5 -5
- package/dist/src/internal/bin.js +1 -1
- package/dist/src/internal/daemon.js +2 -2
- package/dist/src/internal/png-worker.js +1 -1
- package/dist/src/ios-snapshot-acquisition.js +1 -1
- package/dist/src/ios-snapshot-engine.js +1 -1
- package/dist/src/lease.js +1 -1
- package/dist/src/local-interactor-operation-set.js +1 -1
- package/dist/src/mechanics.js +16 -17
- package/dist/src/mobile-snapshot-semantics.js +1 -1
- package/dist/src/observe-until.js +1 -0
- package/dist/src/overlay.js +2 -2
- package/dist/src/parameterized-recorded-fill.js +1 -1
- package/dist/src/perf-facade.js +1 -1
- package/dist/src/perf-runtime-operation-builder.js +1 -1
- package/dist/src/perf-runtime-plan.js +1 -1
- package/dist/src/physical-device-control.js +1 -1
- package/dist/src/platform-request-scope.js +1 -1
- package/dist/src/platform-runtime-managed-owner.js +1 -1
- package/dist/src/platform-runtime-operation-host.js +1 -1
- package/dist/src/platform-runtime-screen-recording-process-host.js +1 -1
- package/dist/src/platform-runtime.js +1 -1
- package/dist/src/platform-runtime2.js +1 -1
- package/dist/src/png-worker-client.js +1 -1
- package/dist/src/provider-device-admission.js +1 -0
- package/dist/src/provider-webdriver.js +1 -1
- package/dist/src/proxy.js +1 -1
- package/dist/src/react-native.js +1 -1
- package/dist/src/record-runtime.js +1 -1
- package/dist/src/registry.js +36 -36
- package/dist/src/replay-divergence.js +1 -1
- package/dist/src/replay.js +1 -1
- package/dist/src/request-admission.js +1 -1
- package/dist/src/request-runtime-binding.js +1 -1
- package/dist/src/runner-cache-metadata.js +2 -2
- package/dist/src/runner-client.js +1 -1
- package/dist/src/runner-dev-tools-security.js +1 -1
- package/dist/src/runner-disposal.js +1 -1
- package/dist/src/runner-error-classification.js +3 -3
- package/dist/src/runner-exchange.js +1 -1
- package/dist/src/runner-start-budget.js +1 -1
- package/dist/src/runner-startup-transport.js +1 -1
- package/dist/src/runner-xctestrun.js +1 -1
- package/dist/src/runner.js +1 -1
- package/dist/src/runtime-admission.js +1 -0
- package/dist/src/runtime.js +1 -1
- package/dist/src/runtime10.js +2 -2
- package/dist/src/runtime2.js +1 -1
- package/dist/src/runtime3.js +1 -1
- package/dist/src/runtime4.js +4 -4
- package/dist/src/runtime5.js +1 -1
- package/dist/src/runtime6.js +1 -1
- package/dist/src/runtime7.js +1 -1
- package/dist/src/runtime8.js +1 -1
- package/dist/src/runtime9.js +1 -1
- package/dist/src/screen-recording-resource-recovery.js +1 -1
- package/dist/src/screenshot-runtime.js +1 -1
- package/dist/src/script.js +1 -1
- package/dist/src/scroll-gesture.js +1 -1
- package/dist/src/sdk-batch-runner.js +2 -2
- package/dist/src/sdk-batch.js +1 -1
- package/dist/src/sdk-contracts.d.ts +16 -2
- package/dist/src/sdk-contracts.js +2 -2
- package/dist/src/sdk-finders.js +1 -1
- package/dist/src/sdk-selectors.d.ts +9 -0
- package/dist/src/sdk-selectors.js +1 -1
- package/dist/src/selection.js +0 -0
- package/dist/src/selector-pipeline-policy.js +1 -0
- package/dist/src/selector-runtime.js +1 -1
- package/dist/src/selectors.js +1 -1
- package/dist/src/server.js +1 -1
- package/dist/src/session-runtime-admission.js +1 -1
- package/dist/src/session-snapshot.js +1 -1
- package/dist/src/session-store.js +3 -3
- package/dist/src/session2.js +5 -5
- package/dist/src/snapshot-desktop-projection.js +1 -1
- package/dist/src/snapshot-runtime-binding.js +1 -1
- package/dist/src/snapshot-runtime.js +1 -1
- package/dist/src/snapshot-state.js +1 -1
- package/dist/src/snapshot4.js +1 -1
- package/dist/src/src.js +1 -1
- package/dist/src/src7.js +1 -1
- package/dist/src/target-evidence.js +1 -1
- package/dist/src/text-entry-focus.js +1 -1
- package/dist/src/touch-runtime.js +1 -1
- package/dist/src/touch-runtime2.js +1 -0
- package/dist/src/tree.js +1 -1
- package/dist/src/type-text-runtime.js +1 -1
- package/dist/src/video.js +1 -1
- package/package.json +1 -1
- package/server.json +2 -2
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.17.apk.sha256 +0 -1
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.17.apk.sha256 +0 -1
- package/dist/src/runner-command-traits.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{Ur as e,Vr as t,Wr as n}from"./sdk-batch.js";const r=[`button`,`menu`,`textfield`,`searchfield`,`checkbox`,`radio`,`switch`];function i(e,t){let n=e.nodes??[];return t.scope&&(n=a(n,t.scope,e=>!t.interactiveOnly||n.slice(e.start,e.end).some(c))),t.interactiveOnly&&(n=o(n)),typeof t.depth==`number`&&(n=s(n,t.depth)),{...e,nodes:n}}function a(r,i,a){let o=e(i);if(!o)return n(r);let s=t(r,o,a);if(!s)return[];let c=r.slice(s.start,s.end);return n(c,c[0]?.depth??0)}function o(e){if(e.length===0)return e;let t=new Map(e.map(e=>[e.index,e])),r=new Set;for(let n of e){if(!c(n))continue;let e=n;for(;e&&!r.has(e.index);)r.add(e.index),e=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0}return r.size===0?e:n(e.filter(e=>r.has(e.index)))}function s(e,t){return n(e.filter(e=>(e.depth??0)<=t))}function c(e){if([e.focused,e.hittable,e.rect].some(Boolean))return!0;let t=`${e.type??``} ${e.role??``} ${e.subrole??``}`.toLowerCase();return r.some(e=>t.includes(e))}export{i as n,a as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{o as e}from"./sdk-contracts.js";import{p as t}from"./sdk-device.js";import{
|
|
1
|
+
import{o as e}from"./sdk-contracts.js";import{p as t}from"./sdk-device.js";import{Bt as n}from"./sdk-batch.js";import"./session-store.js";import{s as r}from"./device-shell.js";import{n as i}from"./provider-device-admission.js";import{d as a,l as o,p as s}from"./session-snapshot.js";import{n as c}from"./dispatch-resolve.js";import{n as l}from"./request-runtime-binding.js";import{a as u,i as d,n as f,t as p}from"./session-runtime-admission.js";async function m(e,t,n){let r=e.get(t);return{session:r,device:r?.device??await c(n??{})}}async function h(e,t,n,r){if(!e&&!r)throw Error(`Platform resource cleanup was not injected`);try{return await n()}finally{!e&&!i(t)&&await r.cleanupSessionlessExecutionHost(t)}}function g(e,t,n,r){t&&e.recordAction(t,{command:n.command,positionals:n.positionals??[],flags:n.flags??{},result:r})}function _(e){let{session:t,sessionName:n,sessionScope:r,device:i,snapshot:a,appBundleId:o}=e;return t?{...t,snapshot:a,lastComparisonSafeSnapshot:a?.comparisonSafe===!0?a:t.lastComparisonSafeSnapshot}:{name:n,sessionScope:r,device:i,createdAt:Date.now(),appBundleId:o,snapshot:a,...a?.comparisonSafe===!0?{lastComparisonSafeSnapshot:a}:{},actions:[]}}async function v(e){if(!t(e)||e.kind!==`simulator`)return;let n=await s.resolveSoleForegroundApp({simulatorSetPath:e.simulatorSetPath});if(!n)return;let r=y(n.device,n.app.bundleId),i=`One booted device found ("${n.device.name}", udid ${n.device.id}) with ${n.app.bundleId} running. Run: ${r}`;return i.length<=350?i:void 0}function y(e,t){let n=e.simulatorSetPath?` --ios-simulator-device-set ${r(e.simulatorSetPath)}`:``;return`agent-device open ${t} --platform ios --udid ${e.id}${n}`}function b(e){let{readTextAtPoint:t}=e.operations,n=t?{operations:{readTextAtPoint:t}}:void 0;return Object.freeze(n?{readTextAtPoint:async e=>await n.operations.readTextAtPoint(e)}:{})}function x(e){let{findText:t}=e.operations;return Object.freeze(t?{findText:async e=>{e.signal?.throwIfAborted();try{let n=await t(e);return e.signal?.throwIfAborted(),n}catch{return e.signal?.throwIfAborted(),{found:!1}}}}:{})}function S(e){let{focusPoint:t,typeText:n}=e.operations;return Object.freeze({...t?{focusPoint:t}:{},...n?{typeText:n}:{}})}async function C(e){let{command:t,device:n,session:r,plan:i}=e,a=await p({device:n,plan:i,inspectFacts:e.inspectFacts});if(!a.admitted)return{ok:!1,response:await j({operation:a.operation,fact:a.fact,session:r,device:n,command:t})};let o=await T(e.bindDevice,a,e.readiness);return Object.freeze({ok:!0,capture:async e=>await o.captureSnapshot(e),...o.readTextAtPoint?{readTextAtPoint:o.readTextAtPoint}:{},...o.findText?{findText:o.findText}:{},...o.focusPoint?{focusPoint:o.focusPoint}:{},...o.typeText?{typeText:o.typeText}:{}})}async function w(e,t){let{req:r,sessionName:i,sessionStore:s}=e,{session:c,device:l}=await m(s,i,r.flags),u=o(r.flags?.snapshotScope,c);if(!u.ok)return{ok:!1,response:u};let d=await C({command:t,device:l,session:c,plan:n({customActions:r.flags?.snapshotCustomActions===!0,hasActiveApp:c?.appBundleId!==void 0}),inspectFacts:e.inspectFacts,bindDevice:e.bindDevice,readiness:!c});if(!d.ok)return d;let f=a({flags:r.flags,logPath:e.logPath,meta:r.meta,session:c,snapshotScope:u.scope});return Object.freeze({ok:!0,session:c,device:l,snapshotScope:u.scope,captureSnapshot:async()=>await d.capture(f)})}async function T(e,t,n){let r=f(e),i=async(e,t)=>{let i=await r(e,t);return n&&await l(i),i},{device:a,plan:o}=u(t);switch(o.kind){case`active-app`:return O(await i(a,o.use));case`selector-active-app`:return await E(i,a,o);case`custom-actions-active-app`:return k(await i(a,o.use));case`without-active-app`:return A(await i(a,o.use));case`selector-without-active-app`:return await D(i,a,o);case`custom-actions-without-active-app`:return k(await i(a,o.use))}}async function E(e,t,n){switch(n.intent){case`capture-only`:return O(await e(t,n.use));case`element-text`:{let r=await e(t,n.use);return{...O(r),...b(r)}}case`wait-observation`:{let r=await e(t,n.use);return{...O(r),...x(r)}}case`find-focus`:{let r=await e(t,n.use);return{...O(r),...S(r)}}case`find-type`:{let r=await e(t,n.use);return{...O(r),...S(r)}}}}async function D(e,t,n){switch(n.intent){case`capture-only`:return A(await e(t,n.use));case`element-text`:{let r=await e(t,n.use);return{...A(r),...b(r)}}case`wait-observation`:{let r=await e(t,n.use);return{...A(r),...x(r)}}case`find-focus`:{let r=await e(t,n.use);return{...A(r),...S(r)}}case`find-type`:{let r=await e(t,n.use);return{...A(r),...S(r)}}}}function O(e){return Object.freeze({captureSnapshot:async t=>await e.operations.captureSnapshot(t)})}function k(e){return Object.freeze({captureSnapshot:async t=>await e.operations.captureSnapshotWithCustomActions(t)})}function A(e){return Object.freeze({captureSnapshot:async t=>await e.operations.captureSnapshotWithoutActiveApp(t)})}async function j(t){if(t.operation===`captureSnapshot`||t.operation===`focusPoint`||t.operation===`typeText`)return d(t.command,t.fact);if(t.operation===`captureSnapshotWithCustomActions`)return M(t);let n=await v(t.device);return e(`SESSION_NOT_FOUND`,`iOS ${t.command} requires an active app session on the target device. Run open first (for example: open --session ${t.session?.name??`sim`} --platform ios --device "<name>" <app>).`,{reason:`ios_app_session_required`,...n?{hint:n}:{}})}function M(t){let n=t.command===`diff`?`--actions requires an iOS simulator: custom actions are read through the private accessibility snapshot backend, which ${t.device.platform}/${t.device.kind} targets do not have.`:`--actions requires an iOS simulator: custom actions are unavailable on this ${t.device.platform}/${t.device.kind} target.`;return e(`UNSUPPORTED_OPERATION`,n,{reason:t.fact.available?void 0:t.fact.reason},{hint:t.command===`diff`||t.fact.available||!t.fact.hint?`Re-run without --actions, or target an iOS simulator.`:t.fact.hint})}export{m as a,g as i,w as n,h as o,_ as r,C as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{N as e,O as t,
|
|
1
|
+
import{N as e,O as t,g as n,q as r}from"./sdk-contracts.js";import"./capture.js";import{r as i}from"./snapshot-capture-annotations.js";import{i as a}from"./snapshot-diagnostics.js";import{f as o}from"./android-input-ownership.js";import{C as s}from"./sdk-device.js";import{s as c}from"./session-store.js";import{l,u}from"./target-evidence.js";import{n as d}from"./success-text.js";import{r as f}from"./diagnostics.js";import"./diagnostics2.js";import{n as p}from"./android-snapshot-quality.js";import{i as m}from"./android-system-chrome.js";import{r as h}from"./request-cancel.js";import"./request.js";import{D as g,a as _,h as v,o as y,s as b,u as x}from"./session-snapshot.js";import{a as S,i as C,r as w,t as T}from"./screenshot-runtime.js";import{a as E}from"./session-routing.js";import{s as D,t as O}from"./quality-warnings.js";import{n as k,o as A,r as j}from"./snapshot-runtime-binding.js";import M from"node:path";import{promises as N}from"node:fs";import P from"node:os";function F(e){return{captureFailed:!0,error:e}}function I(e){return{path:e,overlayRefsRequested:!0,overlayRefsAnnotated:!1,overlayRefSource:`unavailable`}}function L(e,t){let n={path:e,overlayRefsRequested:!0,overlayRefSource:`session-snapshot`};return R(t)?{...n,overlayRefsAnnotated:!0,overlayRefs:t}:{...n,overlayRefsAnnotated:!1,overlayRefs:[]}}function R(e){return e.length>0}function z(e,t){return{path:e,overlayRefsRequested:!0,overlayRefsAnnotated:!1,overlayRefSource:`session-snapshot`,overlayAnnotationError:t}}function B(e){return`captureFailed`in e?{overlayRefCount:void 0,overlayRefsAnnotated:void 0}:{overlayRefCount:`overlayRefs`in e?e.overlayRefs.length:0,overlayRefsAnnotated:e.overlayRefsAnnotated}}function ee(e){return p(e)===`accessibility-timeout`}async function V(e){if(e.command!==`snapshot`||e.device.platform!==`android`)return;let t=r(e.error);if(ee(t))return{ok:!1,error:{...t,details:{...t.details??{},androidSnapshotTimeoutScreenshot:await H(e)}}}}async function H(t){try{let n=await C({device:t.device,overlayRefs:!1,inspectFacts:t.inspectFacts,bindDevice:t.bindDevice});if(!n.ok)throw new e(`UNSUPPORTED_OPERATION`,`The target does not support screenshot capture, so no timeout evidence was taken.`);let r=await N.mkdtemp(M.join(P.tmpdir(),`agent-device-android-snapshot-timeout-`)),i=M.join(r,`snapshot-timeout-overlay-refs.png`);await n.runtime.captureScreenshot({outPath:i,options:{appBundleId:t.session?.appBundleId,stabilize:!1,surface:t.session?.surface},execution:w(v(t.logPath,{screenshotNoStabilize:!0},t.session?.appBundleId,t.session?.trace?.outPath))}),await N.access(i);let a=await U(i,t.session);return f({level:`warn`,phase:`android_snapshot_timeout_screenshot_captured`,data:{path:i,...B(a)}}),a}catch(e){let t=r(e);return f({level:`warn`,phase:`android_snapshot_timeout_screenshot_failed`,data:{error:t.message}}),F(t.message)}}async function U(e,t){if(!t?.snapshot)return I(e);try{return L(e,await S({screenshotPath:e,snapshot:t.snapshot}))}catch(t){let n=r(t);return f({level:`warn`,phase:`android_snapshot_timeout_screenshot_overlay_failed`,data:{path:e,error:n.message}}),z(e,n.message)}}function W(e){let{verdict:t,appBundleId:n,latch:r}=e;return!t||t.backend===`android-helper`?{latch:r}:t.state===`healthy`?{latch:void 0}:t.state!==`recovered`||t.reasonCode===`requested-backend`?{latch:r}:t.reasonCode===`deferred`?r!==void 0&&r.appBundleId===n?{latch:r}:{warning:O(t.backend),latch:{appBundleId:n}}:{latch:{appBundleId:n}}}function G(e){let{session:t,data:n,verdict:r,internalObservation:i}=e;if(i||!t)return n;let a=W({verdict:r,appBundleId:t.appBundleId,latch:t.recoveredSnapshotWarningLatch});return t.recoveredSnapshotWarningLatch=a.latch,a.warning?{...n,warnings:[a.warning,...d(n)]}:n}async function K(e){let t=await k(e,e.command);if(!t.ok)return t.response;let{session:n,device:r,snapshotScope:i}=t;return await A(n,r,async()=>{let{req:a,sessionName:s,logPath:c,sessionStore:l}=e,u={},d=q({req:a,sessionName:s,logPath:c,sessionStore:l,session:n,device:r,snapshotScope:i,capturedQuality:u,captureSnapshotData:t.captureSnapshot}),f;try{f=await e.execute({runtime:d,sessionName:s,req:a,snapshotScope:i})}catch(t){let i=await V({error:t,command:e.command,logPath:c,session:n,device:r,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(!i)throw t;return i}te({req:a,sessionName:s,sessionStore:l,result:f.record});let p=G({session:l.get(s),data:f.data,verdict:u.value,internalObservation:a.internal?.observationOnly===!0});return{ok:!0,data:o(f.data,p)}},e.platformResourceCleanup)}function q(e){let{req:t,sessionName:n,logPath:r,sessionStore:i,session:a,device:o,snapshotScope:s}=e;return x({backend:$({req:t,logPath:r,session:a,device:o,snapshotScope:s,capturedQuality:e.capturedQuality,captureSnapshotData:e.captureSnapshotData}),...u(`snapshot`),signal:h(t.meta?.requestId),sessions:y({sessionName:n,getSession:()=>i.get(n),recordOptions:{includeSnapshot:!0},setRecord:e=>{let r=ne(e),a=i.get(n);i.set(n,J({current:a,sessionName:n,sessionScope:E(t),device:o,record:r,refScopedSnapshot:Y(t),issuesRefsToClient:t.command===`snapshot`&&t.internal?.observationOnly!==!0}))}})})}function J(e){let{current:t,sessionName:n,sessionScope:r,device:i,record:a,refScopedSnapshot:o}=e,s=X(t,a,o),c=s?t.snapshot:a.snapshot,l=j({session:t,sessionName:n,sessionScope:r,device:i,snapshot:c,appBundleId:a.appBundleId});return _(l,{scopeSource:Q({current:t,keepCurrentSnapshot:s,refScopedSnapshot:o}),keptCurrentSnapshot:s,previousGeneration:t?.snapshotGeneration}),Z(l,s,e.issuesRefsToClient),a.appName&&(l.appName=a.appName),l}function Y(e){return e.flags?.snapshotScope?.trim().startsWith(`@`)===!0}function X(e,t,n){return n&&t.snapshot?.nodes.length===0&&e?.snapshot!==void 0}function Z(e,t,n){!t&&n&&g(e)}function Q(e){let{current:t,keepCurrentSnapshot:n,refScopedSnapshot:r}=e;if(r)return n?t?.snapshotScopeSource:t?.snapshotScopeSource??t?.snapshot}function $(e){let{req:t,logPath:n,session:r,device:o,snapshotScope:c}=e;return{platform:s(o),captureSnapshot:async(s,l)=>{let u=await b({device:o,session:r,flags:t.flags,outPath:l?.outPath??t.flags?.out,logPath:n,snapshotScope:c,signal:s.signal,captureData:e.captureSnapshotData}),d=i(u);e.capturedQuality.value=d.quality;let f=a(r);return{snapshot:u.snapshot,...d,...f?{snapshotDiagnostics:f}:{},appName:r?.appBundleId?r.appName??r.appBundleId:void 0,appBundleId:r?.appBundleId}}}}function te(e){let t=e.sessionStore.get(e.sessionName);t&&e.sessionStore.recordAction(t,{command:e.req.command,positionals:e.req.positionals??[],flags:e.req.flags??{},result:re(e.result),interactiveObservation:c(e.req)})}function ne(t){if(!t.snapshot)throw new e(`UNKNOWN`,`snapshot runtime did not produce session state`);return t}function re(e){return e.kind===`snapshot`?{nodes:e.nodes,truncated:e.truncated}:{mode:e.mode,baselineInitialized:e.baselineInitialized,summary:e.summary}}async function ie(e){let t=e.session;if(!t||!D(e.verdict)||e.req.internal?.observationOnly===!0)return;let n=await ae({...e,session:t});if(n!==void 0)return{path:n,artifact:{field:`fallbackScreenshotPath`,artifactType:`screenshot`,path:n,fileName:`snapshot-fallback.png`}}}async function ae(e){let{req:t,session:n}=e;try{let r=await C({device:n.device,overlayRefs:!1,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});return r.ok?(await T({session:n,sessionName:e.sessionName,captureScreenshot:r.runtime.captureScreenshot,dispatchContext:v(e.logPath,t.flags,n.appBundleId,n.trace?.outPath,t.meta?.requestId,t.meta)})).path:void 0}catch{return}}async function oe(e){let r={},i=await K({...e,command:`snapshot`,execute:async({runtime:i,sessionName:a,req:s,snapshotScope:c})=>{let l=await i.capture.snapshot({session:a,...t(s.flags,n),scope:c});l.targetActivation&&(r.targetActivation??=l.targetActivation);let u=se(s,e.sessionStore.get(a)),d=m(l.nodes),f=o(l,d===l.nodes?l:{...l,nodes:d}),p=await ie({req:s,session:e.sessionStore.get(a),sessionName:a,logPath:e.logPath,verdict:l.snapshotQuality,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice}),h=o(f,p?{...f,fallbackScreenshotPath:p.path,artifacts:[p.artifact]}:f);return{data:u===void 0?h:o(h,{...h,refsGeneration:u}),record:{kind:`snapshot`,nodes:l.nodes.length,truncated:l.truncated}}}});return l(i,r)}function se(e,t){return e.internal?.observationOnly===!0?void 0:t?.snapshotGeneration}export{K as n,oe as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime.js";import{A as t,_ as n,k as r,v as i}from"./sdk-contracts.js";import"./capture.js";import{r as a}from"./snapshot-capture-annotations.js";import{c as o,m as s,n as c,s as l}from"./android-input-ownership.js";import{
|
|
1
|
+
import{r as e}from"./rolldown-runtime.js";import{A as t,_ as n,k as r,v as i}from"./sdk-contracts.js";import"./capture.js";import{r as a}from"./snapshot-capture-annotations.js";import{c as o,m as s,n as c,s as l}from"./android-input-ownership.js";import{Fr as u,Kr as d,Lr as f,Nr as p,Yr as m}from"./sdk-batch.js";import{t as h}from"./snapshot-desktop-projection.js";import{a as g}from"./ios-snapshot-planning.js";function _(e,t,n){if(n?.(e.length+t.length)===!1)return;let r=v(t);if(r.length===0)return 0;let i=1/0,a=-1/0;for(let e of r)i=Math.min(i,e.x),a=Math.max(a,e.endX);let o=v(e).filter(e=>e.x<a&&e.endX>i);if(o.length===0)return 0;let s=[...r.flatMap(e=>[e.x,e.endX]),...o.flatMap(e=>[Math.max(e.x,i),Math.min(e.endX,a)])];if(n?.(r.length+o.length+s.length)===!1)return;r.sort(y),o.sort(y);let c=[...new Set(s)].sort((e,t)=>e-t),l=[],u=[],d=0,f=0,p=0,m=0;for(let e=0;e<c.length-1;e+=1){let t=c[e],i=c[e+1];for(l=l.filter(e=>e.endX>t),u=u.filter(e=>e.endX>t);d<r.length&&r[d].x<=t;)l.push(r[d]),d+=1;for(;f<o.length&&o[f].x<=t;)u.push(o[f]),f+=1;if(n?.(1+l.length+u.length)===!1)return;let a=b(l),s=b(u),h=i-t;p+=h*x(a),m+=h*S(a,s)}return p<=0?0:m/p}function v(e){return e.filter(m).map(e=>({...e,endX:e.x+e.width}))}function y(e,t){return e.x-t.x||e.endX-t.endX}function b(e){let t=e.map(e=>({start:e.y,end:e.y+e.height})).sort((e,t)=>e.start-t.start||e.end-t.end),n=[];for(let e of t){let t=n.at(-1);!t||e.start>t.end?n.push({...e}):t.end=Math.max(t.end,e.end)}return n}function x(e){return e.reduce((e,t)=>e+t.end-t.start,0)}function S(e,t){let n=0,r=0,i=0;for(;r<e.length&&i<t.length;){let a=e[r],o=t[i];n+=Math.max(0,Math.min(a.end,o.end)-Math.max(a.start,o.start)),a.end<=o.end?r+=1:i+=1}return n}function C(e,t=new Map){if(t.size===0)return new Set;let n=D(e),r=O(e,n),i={remaining:Math.max(1024,e.length*128),exhausted:!1},a=w(n,{footprints:r,siblingOrders:t,budget:i});return i.exhausted?new Set:L(a,n)}function w(e,t){let n=new Set;for(let r of e.values())for(let e of r)if(T(e,r,t)&&n.add(e.index),t.budget.exhausted)return n;return n}function T(e,t,n){let r=n.siblingOrders.get(e.index),i=n.footprints.get(e.index);if(!r||!i)return!1;for(let e of t){if(!F(n.budget))return!1;if(E(r,i,e,n))return!0}return!1}function E(e,t,n,r){let i=r.siblingOrders.get(n.index),a=r.footprints.get(n.index);if(!i||!a?.hasAction||i.group!==e.group||i.order<=e.order)return!1;let o=P(a,`paint`,r.budget),s=P(t,`show`,r.budget);if(r.budget.exhausted)return!1;let c=_(o,s,e=>I(r.budget,e));return c!==void 0&&c>=.9}function D(e){let t=new Map;for(let n of e){if(typeof n.parentIndex!=`number`)continue;let e=t.get(n.parentIndex)??[];e.push(n),t.set(n.parentIndex,e)}return t}function O(e,t){let n=new Map;for(let r=e.length-1;r>=0;--r){let i=e[r],a=t.get(i.index)??[],o=a.flatMap(e=>n.get(e.index)??[]);n.set(i.index,k(i,a.length,o))}return n}function k(e,t,n){let r=j(e,t),i=r??M(e);return{...i?{showRect:i}:{},showChildren:r?[]:n,...r?{paintRect:r}:{},paintChildren:r?[]:n,hasAction:e.hittable===!0||n.some(A)}}function A(e){return e.hasAction}function j(e,t){if(m(e.rect))return e.hittable===!0||d(e.type)||t===0&&N(e)?e.rect:void 0}function M(e){return m(e.rect)&&N(e)?e.rect:void 0}function N(e){return!!(e.label?.trim()||e.value?.trim()||e.identifier?.trim())}function P(e,t,n){let r=[],i=[e];for(;i.length>0;){if(!F(n))return r;let e=i.pop(),a=t===`paint`?e.paintRect:e.showRect;a&&r.push(a),i.push(...t===`paint`?e.paintChildren:e.showChildren)}return r}function F(e){return I(e,1)}function I(e,t){return t>e.remaining?(e.exhausted=!0,!1):(e.remaining-=t,!0)}function L(e,t){let n=new Set,r=[...e];for(;r.length>0;){let e=r.pop();if(!n.has(e)){n.add(e);for(let n of t.get(e)??[])r.push(n.index)}}return n}function R(e){let t=new Map;for(let[n,r]of e.entries())t.set(r.index,n);let n=[],r=[];for(let[i,a]of e.entries()){let e=Math.max(0,a.depth??0);for(;r.length>0&&e<=r.at(-1).depth;)r.pop();let o=i,s=typeof a.parentIndex==`number`?t.get(a.parentIndex):void 0,c=typeof s==`number`&&s<o?s:r.at(-1)?.index;n.push({...a,index:o,depth:e,parentIndex:c}),r.push({depth:e,index:o})}return n}function z(e){let t=[],n=[];for(let r of e){let e=r.depth??0;for(;t.length>0&&e<=t.at(-1);)t.pop();let i=f(r.type??``),a=u(p(r));if((i===`group`||i===`ioscontentgroup`)&&!a){t.push(e);continue}let o=Math.max(0,e-t.length);n.push({...r,depth:o})}return n}var B=e({buildSnapshotState:()=>V});function V(e,o){let s=e?.nodes??[],c=o?.snapshotRaw,u=H(e,s,c===!0),d=R(c?u:z(u)),f=o?.snapshotScope&&G(e?.backend)?h(d,o.snapshotScope):d,p=a(e).quality;return{nodes:n(c?f:l(f,U(e?.backend))),truncated:e?.truncated,createdAt:Date.now(),...t(e),...p?{snapshotQuality:p}:{},...e.comparisonIdentity?{comparisonKey:g(e.comparisonIdentity)}:{},...e.systemSurface?{iosSystemSurfaceBundleId:e.systemSurface.bundleId}:{},...e.targetActivation?{targetActivation:e.targetActivation}:{},...e.keyboard?{keyboard:e.keyboard}:{},presentationKey:i(r(o)),comparisonSafe:K(e?.backend,o)}}function H(e,t,n){return e.backend===`android`&&!n?W(e,t):t}function U(e){return e===`android`?{isAdditionalOverlayNode:c}:{}}function W(e,t){let n=s(e),r=C(n?.nodes??t,n?.androidSiblingOrderByNodeIndex);return o(t,e=>{let t=n?.sourceIndexByNodeIndex.get(e.index)??e.index;return r.has(t)})}function G(e){return e===void 0||e===`linux-atspi`||e===`harmonyos-arkui`||e===`web`}function K(e,t){return e===`android`&&t?.snapshotInteractiveOnly!==!0&&typeof t?.snapshotDepth!=`number`&&!t?.snapshotScope}export{B as n,V as t};
|
package/dist/src/snapshot4.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{N as e,o as t}from"./sdk-contracts.js";import{D as n,d as r,f as i,m as a}from"./sdk-device.js";import{$ as o,Ht as s,Ir as c,Rt as l,Vt as u,et as d,nt as f,on as p,pr as m,sn as h,tt as g}from"./sdk-batch.js";import"./session-store.js";import{c as ee,s as te}from"./target-evidence.js";import{l as _}from"./runtime.js";import{i as v,r as y}from"./success-text.js";import"./alert-contract.js";import{S as b,c as x,f as ne,g as re,h as ie,m as ae,p as oe,r as S}from"./settings.js";import{t as C}from"./location-coordinates.js";import{r as se,s as w}from"./overlay.js";import{r as T}from"./diagnostics.js";import"./diagnostics2.js";import{P as E,g as D,j as O,m as k,p as A,r as j,s as M}from"./session-snapshot.js";import{h as N}from"./screenshot-runtime.js";import{n as P,t as F}from"./snapshot-runtime.js";import{a as I,i as L,o as R}from"./snapshot-runtime-binding.js";import{a as z,c as B,f as V,g as H,h as U,m as W,o as G,p as K,s as ce,t as le}from"./selector-runtime.js";async function ue(e){let{device:t,action:n,inspectFacts:r,bindDevice:i}=e,a={command:`alert`,device:t,inspectFacts:r,bindDevice:i,readiness:!e.session};if(n===`wait`){let e=await D({...a,use:f});if(e.type===`response`)return{ok:!1,response:e.response};let t=e.runtime;return{ok:!0,execute:e=>fe(t,e)}}if(n===`accept`){let e=await D({...a,use:o});if(e.type===`response`)return{ok:!1,response:e.response};let t=e.runtime;return{ok:!0,execute:e=>pe(t,e)}}if(n===`dismiss`){let e=await D({...a,use:d});if(e.type===`response`)return{ok:!1,response:e.response};let t=e.runtime;return{ok:!0,execute:e=>me(t,e)}}let s=await D({...a,use:g});if(s.type===`response`)return{ok:!1,response:s.response};let c=s.runtime;return{ok:!0,execute:e=>de(c,e)}}async function de(e,t){return await e.operations.readAlert(t)}async function fe(e,t){return await e.operations.awaitAlert(t)}async function pe(e,t){return await e.operations.acceptAlert(t)}async function me(e,t){return await e.operations.dismissAlert(t)}async function he(e){let{req:t,logPath:n,sessionStore:r,session:i,device:a,inspectFacts:o,bindDevice:s}=e,c=await ue({device:a,action:_e(t.positionals?.[0]),session:i,inspectFacts:o,bindDevice:s});if(!c.ok)return c.response;i&&N(t)===`may-invalidate`&&E(i);let l=O(n,t.flags,i?.appBundleId,i?.trace?.outPath),u=await c.execute({timeoutMs:h(t.positionals?.[1])??1e4,...ge(i),execution:k(l)});return L(r,i,t,u),{ok:!0,data:u}}function ge(e){return{...e?.appBundleId===void 0?{}:{appBundleId:e.appBundleId},...e?.surface===void 0?{}:{surface:e.surface}}}function _e(e){return e===`accept`||e===`dismiss`||e===`wait`?e:`get`}function ve(e){let n=e.positionals?.[0]?.toLowerCase(),r=e.positionals?.[1]?.toLowerCase(),i=e.positionals?.[2]?.toLowerCase();if(n===`clear-app-state`)return{ok:!0,parsed:{leg:`write`,args:{setting:n,state:`clear`,appBundleId:r===`clear`?e.positionals?.[2]:e.positionals?.[1]}}};let a=l(e.positionals);if(a.kind===`read`)return{ok:!0,parsed:{leg:`read`,setting:a.setting}};if(!n||!r||n===`permission`&&!i||n===`location`&&r===`set`&&(!e.positionals?.[2]||!e.positionals?.[3])||n===`reset-keychain`&&e.positionals?.[2]!==void 0)return t(`INVALID_ARGS`,x);let o=r;if(n===`text-size`){let e=b(r);if(e===void 0)return t(`INVALID_ARGS`,ie(r));o=e}return{ok:!0,parsed:{leg:`write`,args:{setting:n,state:o,permissionTarget:i,permissionMode:e.positionals?.[3],latitude:e.positionals?.[2],longitude:e.positionals?.[3]}}}}function ye(e){if(e.setting===`permission`)return{permissionTarget:e.permissionTarget,permissionMode:e.permissionMode};if(e.setting===`location`&&e.state===`set`)return{latitude:C(e.latitude,`latitude`),longitude:C(e.longitude,`longitude`)}}function be(e,t,n){let{setting:r,state:i}=e;return r===`clear-app-state`?{setting:`clear-app-state`,state:`clear`,appBundleId:t,platform:n}:r===`location`&&i===`set`?{setting:r,state:i,latitude:e.latitude,longitude:e.longitude,platform:n}:r===`permission`?{setting:r,state:i,permissionTarget:e.permissionTarget,permissionMode:e.permissionMode,platform:n}:{setting:r,state:i,appBundleId:t,platform:n}}function xe(e){return typeof e.message==`string`&&e.message.length>0?e.message:void 0}async function Se(e,t,n){let{setting:r,state:i}=t,a=await e.operations.setSetting(t);return a&&typeof a==`object`?v({setting:r,state:i,...a},xe(a)??n):{setting:r,state:i,...y(n)}}async function Ce(e){return e.parsed.leg===`read`?await we(e,e.parsed.setting):await Te(e,e.parsed.args)}async function we(e,t){let{req:n,logPath:r,sessionStore:i,session:a,device:o,inspectFacts:s,bindDevice:c}=e,l=q(o,t);if(l!==void 0)return l;let d=await D({command:`settings ${t}`,device:o,use:u,inspectFacts:s,bindDevice:c,readiness:!a});if(d.type===`response`)return d.response;T({level:`debug`,phase:`settings_read`,data:{setting:t,platform:o.platform}});let f=O(r,n.flags,a?.appBundleId,a?.trace?.outPath),p=await d.runtime.operations.readSetting({setting:t,execution:k(f)}),m={...p,...y(ne(p))};return L(i,a,n,m),{ok:!0,data:m}}async function Te(e,t){let{req:n,logPath:r,sessionStore:i,session:a,device:o,inspectFacts:c,bindDevice:l}=e,{setting:u,state:d}=t,f=q(o,u);if(f!==void 0)return f;let p=await D({command:`settings`,device:o,use:s,inspectFacts:c,bindDevice:l,readiness:!a}),m=Ee(n,t,a);if(p.type===`response`)return p.response;let h=De(t,m);if(h!==void 0)return h;a&&E(a),T({level:`debug`,phase:`settings_apply`,data:be(t,m,o.platform)});let g=await Se(p.runtime,Oe(t,m,O(r,n.flags,m,a?.trace?.outPath)),oe(u,d,m));return L(i,a,n,g),{ok:!0,data:g}}function q(e,o){if(a(e)&&!re(o))return t(`INVALID_ARGS`,ae(o));if(o===`text-size`&&r(e.platform)&&!i(e))return t(`UNSUPPORTED_OPERATION`,S.message,{deviceKind:e.kind,appleOs:n(e),reason:S.reason},{hint:S.hint})}function Ee(e,t,n){return t.appBundleId??e.internal?.settingsAppBundleId??n?.appBundleId}function De(e,n){if(e.setting===`clear-app-state`&&!n)return t(`INVALID_ARGS`,`settings clear-app-state requires an app id when no app is bound to the session`)}function Oe(e,t,n){let r=ye(e);return{setting:e.setting,state:e.state,...t===void 0?{}:{appBundleId:t},...r===void 0?{}:{options:r},execution:k(n)}}async function ke(e){return await P({...e,command:`diff`,execute:async({runtime:e,sessionName:t,req:n,snapshotScope:r})=>{let i=await e.capture.diffSnapshot({session:t,interactiveOnly:n.flags?.snapshotInteractiveOnly,depth:n.flags?.snapshotDepth,scope:r,raw:n.flags?.snapshotRaw});return{data:i,record:{kind:`diff`,mode:`snapshot`,baselineInitialized:i.baselineInitialized,summary:i.summary}}}})}function Ae(e){return e!==`sleep`}const je=[`application`,`window`,`tabbar`,`scrollbar`,`image`],Me=new Set([`tab bar`]);async function Ne(e,n){if(n.ok||!Pe(n.error.details?.reason)||n.error.details?.captureStalled===!0||n.error.details?.captureTruncated===!0)return n;let r=await Fe(e).catch(()=>null);return r?t(n.error.code,`${n.error.message}. Current surface: ${r.summary}.`,{...n.error.details??{},currentSurface:r.details}):n}function Pe(e){return e===_.targetAbsent||e===_.stableTimeout}async function Fe(e){let t={...e.req.flags,snapshotInteractiveOnly:!0},n=await M({device:e.device,session:e.session,flags:t,logPath:e.logPath??``,captureData:async()=>await e.capture(A({flags:t,logPath:e.logPath??``,meta:e.req.meta,session:e.session,snapshotScope:void 0}))});te(e.captureProof,n.snapshot);let r=[...n.snapshot.nodes].sort(Ie),i=J(r,6,{includeIdentifiers:!0});if(i.length===0)return null;let a=J(r.filter(e=>!Z(e)),4,{includeIdentifiers:!1}),o=J(r.filter(Re),4,{includeIdentifiers:!0});return{summary:(a.length>0?a:i.slice(0,4)).join(`, `),details:{labels:i,...o.length>0?{buttons:o}:{}}}}function J(e,t,n){let r=new Set,i=[];for(let a of e){let e=X(a,n);if(!(!e||r.has(e))&&(r.add(e),i.push(e),i.length>=t))break}return i}function Ie(e,t){return Y(e)-Y(t)||Le(e,t)}function Y(e){let t=!!X(e,{includeIdentifiers:!1});return(Z(e)?2:0)+ +!t}function Le(e,t){return e.rect&&t.rect?e.rect.y-t.rect.y||e.rect.x-t.rect.x:e.rect?-1:t.rect?1:(e.depth??0)-(t.depth??0)||e.index-t.index}function X(e,t){let n=(t.includeIdentifiers?[e.label,e.value,e.identifier]:[e.label,e.value]).map(e=>typeof e==`string`?e.trim():``).find(e=>e.length>0);return n?n.replaceAll(/\s+/g,` `).slice(0,80):``}function Z(e){let t=c(`${e.type??``} ${e.role??``} ${e.subrole??``}`),n=`${e.label??``} ${e.value??``}`.trim().toLowerCase();return je.some(e=>t.includes(e))||Me.has(n)||n.endsWith(`.fill`)}function Re(e){let t=`${e.type??``} ${e.role??``} ${e.subrole??``}`;return c(t).includes(`button`)}async function ze(e){let{req:t,sessionName:n,sessionStore:r}=e,i=Be(t);if(`ok`in i)return i;let a=i,{session:o,device:s}=await I(r,n,t.flags),c=await Ve(e,a,o,s);if(c&&`ok`in c)return c;let l=c,u=t.internal?.replayLandmarkGuard,d=He(a,o);if(`ok`in d)return d;let{waitParsed:f,staleRefsWarning:p}=d;return e.consumedSnapshot??={},e.captureProof??={},a.kind===`sleep`?await Q(e,f,o,s,l,p,u):ee({response:await R(o,s,()=>Q(e,f,o,s,l,p,u),e.platformResourceCleanup),consumedTree:le(e),captureProof:e.captureProof})}function Be(e){let n=p(e.positionals??[]);if(!n)return t(`INVALID_ARGS`,`wait requires a duration or text`);if(n.kind===`invalid`)return t(`INVALID_ARGS`,n.message);if(n.kind!==`absent`)return n;let r=w({depth:e.flags?.snapshotDepth,scope:e.flags?.snapshotScope});if(!r)return n;let i=se(r,`wait`);return t(i.code,i.message,i.details)}async function Ve(e,t,n,r){if(!Ae(t.kind))return;let i=await V({command:`wait`,device:r,session:n,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});return i.ok?i.operations:i.response}function He(e,t){if(e.kind!==`ref`)return{waitParsed:e};let n=H(e.rawRef);return n.ok?{waitParsed:{...e,rawRef:n.ref},staleRefsWarning:j({session:t,ref:n.ref,mintedGeneration:n.generation})}:n.response}async function Q(e,t,n,r,i,a,o){let{req:s,sessionName:c,sessionStore:l}=e,u=B({...e,session:n,device:r,bound:i}),d=await ce(async()=>{let e=await u.selectors.wait({session:c,requestId:s.meta?.requestId,target:$(t,n,o)}),r=G(e);K(l,c,s,W(e),r,`landmark`);let i=U(e);return a?{...i,warning:a}:i}),f=i?await Ne({req:s,logPath:e.logPath,session:n,device:r,capture:i.capture,captureProof:e.captureProof},d):d;return await z(e,f,`wait`)}function $(e,t,n){switch(e.kind){case`sleep`:return{kind:`sleep`,durationMs:e.durationMs};case`selector`:return{kind:`selector`,selector:e.selectorExpression,timeoutMs:e.timeoutMs,...n?{recordedLandmark:n}:{}};case`absent`:return{kind:`absent`,selector:e.selectorExpression,timeoutMs:e.timeoutMs};case`ref`:return We(e,t);case`stable`:return{kind:`stable`,quietMs:e.quietMs,timeoutMs:e.timeoutMs};case`text`:return Ge(e);default:return Ue(e)}}function Ue(e){throw Error(`Unsupported wait positional target: ${String(e)}`)}function We(t,n){if(!n?.snapshot)throw new e(`INVALID_ARGS`,`Ref wait requires an existing snapshot in session.`);return{kind:`ref`,ref:t.rawRef,timeoutMs:t.timeoutMs}}function Ge(t){let n=m(t.text);if(!n.ok)throw new e(n.code,n.message);return{kind:`text`,text:n.text,timeoutMs:t.timeoutMs}}const Ke={snapshot:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a,platformResourceCleanup:o})=>await F({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a,platformResourceCleanup:o}),diff:async({req:e,sessionName:n,logPath:r,sessionStore:i,inspectFacts:a,bindDevice:o,platformResourceCleanup:s})=>e.positionals?.[0]===`snapshot`?await ke({req:e,sessionName:n,logPath:r,sessionStore:i,inspectFacts:a,bindDevice:o,platformResourceCleanup:s}):t(`INVALID_ARGS`,`diff currently supports only: diff snapshot`),wait:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a,platformResourceCleanup:o})=>await ze({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a,platformResourceCleanup:o}),alert:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a,platformResourceCleanup:o})=>{let{session:s,device:c}=await I(r,t,e.flags);return await R(s,c,async()=>await he({req:e,logPath:n,sessionStore:r,session:s,device:c,inspectFacts:i,bindDevice:a}),o)},settings:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a,platformResourceCleanup:o})=>{let s=ve(e);if(!s.ok)return s;let{session:c,device:l}=await I(r,t,e.flags);return await R(c,l,async()=>await Ce({req:e,logPath:n,sessionStore:r,session:c,device:l,parsed:s.parsed,inspectFacts:i,bindDevice:a}),o)}};async function qe(e){let t=e.req.command,n=Ke[t];return n?await n(e):null}export{qe as handleSnapshotCommands};
|
|
1
|
+
import{N as e,o as t}from"./sdk-contracts.js";import{D as n,d as r,f as i,m as a}from"./sdk-device.js";import{Ht as o,Lr as s,Ut as c,cn as l,et as u,mr as d,nt as f,rt as p,sn as m,tt as h,zt as g}from"./sdk-batch.js";import"./session-store.js";import{c as ee,s as te}from"./target-evidence.js";import{l as _}from"./runtime.js";import{i as v,r as y}from"./success-text.js";import"./alert-contract.js";import{S as b,c as x,f as ne,g as re,h as ie,m as ae,p as oe,r as S}from"./settings.js";import{t as C}from"./location-coordinates.js";import{r as w,s as T}from"./overlay.js";import{r as E}from"./diagnostics.js";import"./diagnostics2.js";import{O as D,d as se,f as O,h as k,r as A,s as j}from"./session-snapshot.js";import{h as M}from"./screenshot-runtime.js";import{n as N}from"./runtime-admission.js";import{n as P,t as F}from"./snapshot-runtime.js";import{a as I,i as L,o as R}from"./snapshot-runtime-binding.js";import{a as z,c as B,f as V,g as H,h as U,m as W,o as G,p as K,s as ce,t as le}from"./selector-runtime.js";async function ue(e){let{device:t,action:n,inspectFacts:r,bindDevice:i}=e,a={command:`alert`,device:t,inspectFacts:r,bindDevice:i,readiness:!e.session};if(n===`wait`){let e=await N({...a,use:p});if(e.type===`response`)return{ok:!1,response:e.response};let t=e.runtime;return{ok:!0,execute:e=>fe(t,e)}}if(n===`accept`){let e=await N({...a,use:u});if(e.type===`response`)return{ok:!1,response:e.response};let t=e.runtime;return{ok:!0,execute:e=>pe(t,e)}}if(n===`dismiss`){let e=await N({...a,use:h});if(e.type===`response`)return{ok:!1,response:e.response};let t=e.runtime;return{ok:!0,execute:e=>me(t,e)}}let o=await N({...a,use:f});if(o.type===`response`)return{ok:!1,response:o.response};let s=o.runtime;return{ok:!0,execute:e=>de(s,e)}}async function de(e,t){return await e.operations.readAlert(t)}async function fe(e,t){return await e.operations.awaitAlert(t)}async function pe(e,t){return await e.operations.acceptAlert(t)}async function me(e,t){return await e.operations.dismissAlert(t)}async function he(e){let{req:t,logPath:n,sessionStore:r,session:i,device:a,inspectFacts:o,bindDevice:s}=e,c=await ue({device:a,action:_e(t.positionals?.[0]),session:i,inspectFacts:o,bindDevice:s});if(!c.ok)return c.response;i&&M(t)===`may-invalidate`&&D(i);let u=k(n,t.flags,i?.appBundleId,i?.trace?.outPath),d=await c.execute({timeoutMs:l(t.positionals?.[1])??1e4,...ge(i),execution:O(u)});return L(r,i,t,d),{ok:!0,data:d}}function ge(e){return{...e?.appBundleId===void 0?{}:{appBundleId:e.appBundleId},...e?.surface===void 0?{}:{surface:e.surface}}}function _e(e){return e===`accept`||e===`dismiss`||e===`wait`?e:`get`}function ve(e){let n=e.positionals?.[0]?.toLowerCase(),r=e.positionals?.[1]?.toLowerCase(),i=e.positionals?.[2]?.toLowerCase();if(n===`clear-app-state`)return{ok:!0,parsed:{leg:`write`,args:{setting:n,state:`clear`,appBundleId:r===`clear`?e.positionals?.[2]:e.positionals?.[1]}}};let a=g(e.positionals);if(a.kind===`read`)return{ok:!0,parsed:{leg:`read`,setting:a.setting}};if(!n||!r||n===`permission`&&!i||n===`location`&&r===`set`&&(!e.positionals?.[2]||!e.positionals?.[3])||n===`reset-keychain`&&e.positionals?.[2]!==void 0)return t(`INVALID_ARGS`,x);let o=r;if(n===`text-size`){let e=b(r);if(e===void 0)return t(`INVALID_ARGS`,ie(r));o=e}return{ok:!0,parsed:{leg:`write`,args:{setting:n,state:o,permissionTarget:i,permissionMode:e.positionals?.[3],latitude:e.positionals?.[2],longitude:e.positionals?.[3]}}}}function ye(e){if(e.setting===`permission`)return{permissionTarget:e.permissionTarget,permissionMode:e.permissionMode};if(e.setting===`location`&&e.state===`set`)return{latitude:C(e.latitude,`latitude`),longitude:C(e.longitude,`longitude`)}}function be(e,t,n){let{setting:r,state:i}=e;return r===`clear-app-state`?{setting:`clear-app-state`,state:`clear`,appBundleId:t,platform:n}:r===`location`&&i===`set`?{setting:r,state:i,latitude:e.latitude,longitude:e.longitude,platform:n}:r===`permission`?{setting:r,state:i,permissionTarget:e.permissionTarget,permissionMode:e.permissionMode,platform:n}:{setting:r,state:i,appBundleId:t,platform:n}}function xe(e){return typeof e.message==`string`&&e.message.length>0?e.message:void 0}async function Se(e,t,n){let{setting:r,state:i}=t,a=await e.operations.setSetting(t);return a&&typeof a==`object`?v({setting:r,state:i,...a},xe(a)??n):{setting:r,state:i,...y(n)}}async function Ce(e){return e.parsed.leg===`read`?await we(e,e.parsed.setting):await Te(e,e.parsed.args)}async function we(e,t){let{req:n,logPath:r,sessionStore:i,session:a,device:s,inspectFacts:c,bindDevice:l}=e,u=q(s,t);if(u!==void 0)return u;let d=await N({command:`settings ${t}`,device:s,use:o,inspectFacts:c,bindDevice:l,readiness:!a});if(d.type===`response`)return d.response;E({level:`debug`,phase:`settings_read`,data:{setting:t,platform:s.platform}});let f=k(r,n.flags,a?.appBundleId,a?.trace?.outPath),p=await d.runtime.operations.readSetting({setting:t,execution:O(f)}),m={...p,...y(ne(p))};return L(i,a,n,m),{ok:!0,data:m}}async function Te(e,t){let{req:n,logPath:r,sessionStore:i,session:a,device:o,inspectFacts:s,bindDevice:l}=e,{setting:u,state:d}=t,f=q(o,u);if(f!==void 0)return f;let p=await N({command:`settings`,device:o,use:c,inspectFacts:s,bindDevice:l,readiness:!a}),m=Ee(n,t,a);if(p.type===`response`)return p.response;let h=De(t,m);if(h!==void 0)return h;a&&D(a),E({level:`debug`,phase:`settings_apply`,data:be(t,m,o.platform)});let g=await Se(p.runtime,Oe(t,m,k(r,n.flags,m,a?.trace?.outPath)),oe(u,d,m));return L(i,a,n,g),{ok:!0,data:g}}function q(e,o){if(a(e)&&!re(o))return t(`INVALID_ARGS`,ae(o));if(o===`text-size`&&r(e.platform)&&!i(e))return t(`UNSUPPORTED_OPERATION`,S.message,{deviceKind:e.kind,appleOs:n(e),reason:S.reason},{hint:S.hint})}function Ee(e,t,n){return t.appBundleId??e.internal?.settingsAppBundleId??n?.appBundleId}function De(e,n){if(e.setting===`clear-app-state`&&!n)return t(`INVALID_ARGS`,`settings clear-app-state requires an app id when no app is bound to the session`)}function Oe(e,t,n){let r=ye(e);return{setting:e.setting,state:e.state,...t===void 0?{}:{appBundleId:t},...r===void 0?{}:{options:r},execution:O(n)}}async function ke(e){return await P({...e,command:`diff`,execute:async({runtime:e,sessionName:t,req:n,snapshotScope:r})=>{let i=await e.capture.diffSnapshot({session:t,interactiveOnly:n.flags?.snapshotInteractiveOnly,depth:n.flags?.snapshotDepth,scope:r,raw:n.flags?.snapshotRaw});return{data:i,record:{kind:`diff`,mode:`snapshot`,baselineInitialized:i.baselineInitialized,summary:i.summary}}}})}function Ae(e){return e!==`sleep`}const je=[`application`,`window`,`tabbar`,`scrollbar`,`image`],Me=new Set([`tab bar`]);async function Ne(e,n){if(n.ok||!Pe(n.error.details?.reason)||n.error.details?.captureStalled===!0||n.error.details?.captureTruncated===!0)return n;let r=await Fe(e).catch(()=>null);return r?t(n.error.code,`${n.error.message}. Current surface: ${r.summary}.`,{...n.error.details??{},currentSurface:r.details}):n}function Pe(e){return e===_.targetAbsent||e===_.stableTimeout}async function Fe(e){let t={...e.req.flags,snapshotInteractiveOnly:!0},n=await j({device:e.device,session:e.session,flags:t,logPath:e.logPath??``,captureData:async()=>await e.capture(se({flags:t,logPath:e.logPath??``,meta:e.req.meta,session:e.session,snapshotScope:void 0}))});te(e.captureProof,n.snapshot);let r=[...n.snapshot.nodes].sort(Ie),i=J(r,6,{includeIdentifiers:!0});if(i.length===0)return null;let a=J(r.filter(e=>!Z(e)),4,{includeIdentifiers:!1}),o=J(r.filter(Re),4,{includeIdentifiers:!0});return{summary:(a.length>0?a:i.slice(0,4)).join(`, `),details:{labels:i,...o.length>0?{buttons:o}:{}}}}function J(e,t,n){let r=new Set,i=[];for(let a of e){let e=X(a,n);if(!(!e||r.has(e))&&(r.add(e),i.push(e),i.length>=t))break}return i}function Ie(e,t){return Y(e)-Y(t)||Le(e,t)}function Y(e){let t=!!X(e,{includeIdentifiers:!1});return(Z(e)?2:0)+ +!t}function Le(e,t){return e.rect&&t.rect?e.rect.y-t.rect.y||e.rect.x-t.rect.x:e.rect?-1:t.rect?1:(e.depth??0)-(t.depth??0)||e.index-t.index}function X(e,t){let n=(t.includeIdentifiers?[e.label,e.value,e.identifier]:[e.label,e.value]).map(e=>typeof e==`string`?e.trim():``).find(e=>e.length>0);return n?n.replaceAll(/\s+/g,` `).slice(0,80):``}function Z(e){let t=s(`${e.type??``} ${e.role??``} ${e.subrole??``}`),n=`${e.label??``} ${e.value??``}`.trim().toLowerCase();return je.some(e=>t.includes(e))||Me.has(n)||n.endsWith(`.fill`)}function Re(e){let t=`${e.type??``} ${e.role??``} ${e.subrole??``}`;return s(t).includes(`button`)}async function ze(e){let{req:t,sessionName:n,sessionStore:r}=e,i=Be(t);if(`ok`in i)return i;let a=i,{session:o,device:s}=await I(r,n,t.flags),c=await Ve(e,a,o,s);if(c&&`ok`in c)return c;let l=c,u=t.internal?.replayLandmarkGuard,d=He(a,o);if(`ok`in d)return d;let{waitParsed:f,staleRefsWarning:p}=d;return e.consumedSnapshot??={},e.captureProof??={},a.kind===`sleep`?await Q(e,f,o,s,l,p,u):ee({response:await R(o,s,()=>Q(e,f,o,s,l,p,u),e.platformResourceCleanup),consumedTree:le(e),captureProof:e.captureProof})}function Be(e){let n=m(e.positionals??[]);if(!n)return t(`INVALID_ARGS`,`wait requires a duration or text`);if(n.kind===`invalid`)return t(`INVALID_ARGS`,n.message);if(n.kind!==`absent`)return n;let r=T({depth:e.flags?.snapshotDepth,scope:e.flags?.snapshotScope});if(!r)return n;let i=w(r,`wait`);return t(i.code,i.message,i.details)}async function Ve(e,t,n,r){if(!Ae(t.kind))return;let i=await V({command:`wait`,device:r,session:n,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});return i.ok?i.operations:i.response}function He(e,t){if(e.kind!==`ref`)return{waitParsed:e};let n=H(e.rawRef);return n.ok?{waitParsed:{...e,rawRef:n.ref},staleRefsWarning:A({session:t,ref:n.ref,mintedGeneration:n.generation})}:n.response}async function Q(e,t,n,r,i,a,o){let{req:s,sessionName:c,sessionStore:l}=e,u=B({...e,session:n,device:r,bound:i}),d=await ce(async()=>{let e=await u.selectors.wait({session:c,requestId:s.meta?.requestId,target:$(t,n,o)}),r=G(e);K(l,c,s,W(e),r,`landmark`);let i=U(e);return a?{...i,warning:a}:i}),f=i?await Ne({req:s,logPath:e.logPath,session:n,device:r,capture:i.capture,captureProof:e.captureProof},d):d;return await z(e,f,`wait`)}function $(e,t,n){switch(e.kind){case`sleep`:return{kind:`sleep`,durationMs:e.durationMs};case`selector`:return{kind:`selector`,selector:e.selectorExpression,timeoutMs:e.timeoutMs,...n?{recordedLandmark:n}:{}};case`absent`:return{kind:`absent`,selector:e.selectorExpression,timeoutMs:e.timeoutMs};case`ref`:return We(e,t);case`stable`:return{kind:`stable`,quietMs:e.quietMs,timeoutMs:e.timeoutMs};case`text`:return Ge(e);default:return Ue(e)}}function Ue(e){throw Error(`Unsupported wait positional target: ${String(e)}`)}function We(t,n){if(!n?.snapshot)throw new e(`INVALID_ARGS`,`Ref wait requires an existing snapshot in session.`);return{kind:`ref`,ref:t.rawRef,timeoutMs:t.timeoutMs}}function Ge(t){let n=d(t.text);if(!n.ok)throw new e(n.code,n.message);return{kind:`text`,text:n.text,timeoutMs:t.timeoutMs}}const Ke={snapshot:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a,platformResourceCleanup:o})=>await F({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a,platformResourceCleanup:o}),diff:async({req:e,sessionName:n,logPath:r,sessionStore:i,inspectFacts:a,bindDevice:o,platformResourceCleanup:s})=>e.positionals?.[0]===`snapshot`?await ke({req:e,sessionName:n,logPath:r,sessionStore:i,inspectFacts:a,bindDevice:o,platformResourceCleanup:s}):t(`INVALID_ARGS`,`diff currently supports only: diff snapshot`),wait:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a,platformResourceCleanup:o})=>await ze({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a,platformResourceCleanup:o}),alert:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a,platformResourceCleanup:o})=>{let{session:s,device:c}=await I(r,t,e.flags);return await R(s,c,async()=>await he({req:e,logPath:n,sessionStore:r,session:s,device:c,inspectFacts:i,bindDevice:a}),o)},settings:async({req:e,sessionName:t,logPath:n,sessionStore:r,inspectFacts:i,bindDevice:a,platformResourceCleanup:o})=>{let s=ve(e);if(!s.ok)return s;let{session:c,device:l}=await I(r,t,e.flags);return await R(c,l,async()=>await Ce({req:e,logPath:n,sessionStore:r,session:c,device:l,parsed:s.parsed,inspectFacts:i,bindDevice:a}),o)}};async function qe(e){let t=e.req.command,n=Ke[t];return n?await n(e):null}export{qe as handleSnapshotCommands};
|
package/dist/src/src.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime.js";import{N as t}from"./sdk-contracts.js";import{
|
|
1
|
+
import{r as e}from"./rolldown-runtime.js";import{N as t}from"./sdk-contracts.js";import{$t as n}from"./sdk-batch.js";import{c as r,i,s as a}from"./request-cancellation.js";import{t as o}from"./api.js";import{a as s,i as c,l,n as u,o as d,s as f,t as p}from"./device-session.js";import{scryptSync as m}from"node:crypto";const h=`agent-device-cli`;function g(e){return{apiKey:e.apiKey,defaultHeaders:{"x-agent-device-client":h,"x-agent-device-version":e.clientVersion}}}function _(e){if(e.runtimeInstance!==void 0){let t=e.runtimeInstance.trim();if(!t)throw TypeError(`Limrun runtimeInstance must be a non-empty string`);return t}let t=JSON.stringify({provider:`limrun`,region:e.region?.trim().toLowerCase()||`default`,apiKey:e.apiKey});return`principal-${m(t,`agent-device:limrun-runtime-owner:v1`,32,{N:16384,r:8,p:1,maxmem:67108864}).toString(`hex`)}`}function v(e,t,r){let a=new y(e,t);if(!r?.includePlatformModule)return a;let o=n(i,_(e));if(o.kind!==`provider-runtime`)throw TypeError(`Invalid Limrun runtime owner`);return Object.freeze({runtime:a,platformModule:Object.freeze({owner:o,loadRuntime:async e=>await b(a,o.instance,e)})})}var y=class{limrun;sessions=new Map;appAliases=new Map;options;dependencies;provider=i;leaseLifecycle={allocate:async(e,t)=>await this.allocate(e,t),release:async e=>await this.release(e)};appCatalog=async(e,t)=>{let{assertLimrunUploadedAppAccess:n,listLimrunAppAssets:r}=await import(`./app-catalog.js`);return n(e.publicNetworkOnly),(await r(this.limrun,e.platform,t)).map(e=>e.name)};recoverExpiredLease=async e=>{if(e.leaseProvider!==this.provider||!r(e.backend))throw new t(`UNSUPPORTED_OPERATION`,`Limrun cannot recover this expired lease.`,{leaseId:e.leaseId,leaseProvider:e.leaseProvider,leaseBackend:e.backend});await this.release(e)};deviceInventoryProvider=async e=>{if(e.leaseProvider!==this.provider||!e.leaseId)return null;let t=this.sessions.get(e.leaseId);return t?e.platform&&e.platform!==t.platform?[]:[t.device]:null};constructor(e,t){this.options=e,this.dependencies=t,this.limrun=new o(g({apiKey:e.apiKey,clientVersion:t.clientVersion}))}ownsDevice(e){return a(e.id)!==void 0}hasLiveSession(e){return this.getSessionForDevice(e)!==void 0}getInteractor(e,t){let n=this.getSessionForDevice(e);if(n)return n.platform===`ios`?u(n):f(n)}getDeviceSession(e){let t=this.getSessionForDevice(e);return t?p(t):void 0}async installApp(e,t,n,r,i,a){return await this.installInstallablePath(e,n,{...r,appIdentifierHint:r?.appIdentifierHint??t,packageNameHint:r?.packageNameHint??t},i,a)}async installInstallablePath(e,t,n,r,i){let a=this.getSessionForDevice(e);if(a)return a.platform===`ios`?await c(this.limrun,a,t,n,r,i):await l(this.limrun,a,t,n,r,i)}async configurePortReverse(e){let t=this.requireAndroidPortReverseSession(e.leaseId);if(t)return await d(t,e),x(e)}async shutdown(){let e=[...this.sessions.values()];await Promise.allSettled(e.map(async e=>await this.terminateSession(e))),this.sessions.clear(),this.appAliases.clear()}async allocate(e,t){if(e.leaseProvider!==this.provider)return;let n=r(e.backend);if(!n)return;let i=this.sessions.get(e.leaseId);if(i)return{limrunInstanceId:i.instanceId,device:i.device};let{allocateLimrunAndroidSession:a,allocateLimrunIosSession:o,resolvePreinstalledAppId:s,resolveRequestedLimrunAppAsset:c}=await import(`./session-allocation.js`),l=await c(this.limrun,n,t),u=n===`ios`?await o(this.sessionAllocationParams(e,l)):await a(this.sessionAllocationParams(e,l));if(l)try{let t=await s(u,l);this.appAliases.set(e.leaseId,{assetName:l.name,installedAppId:t})}catch(e){throw await this.terminateSession(u),e}return this.sessions.set(e.leaseId,u),{limrunInstanceId:u.instanceId,device:u.device}}sessionAllocationParams(e,t){return{limrun:this.limrun,lease:e,metadata:this.buildInstanceMetadata(e),region:this.options.region,app:t,dependencies:this.dependencies}}buildInstanceMetadata(e){return{displayName:`agent-device-${e.tenantId}-${e.runId}`,labels:{tenantId:e.tenantId,runId:e.runId,leaseId:e.leaseId,provider:e.leaseProvider??`limrun`,source:h}}}async release(e){let t=this.sessions.get(e.leaseId);return t?(await this.terminateSession(t),this.sessions.delete(e.leaseId),this.appAliases.delete(e.leaseId),{limrunInstanceId:t.instanceId}):await this.releaseRecoveredSession(e)}async releaseRecoveredSession(e){let t=r(e.backend);if(!t)return;let n=`provider=${i},leaseId=${e.leaseId}`,a=(t===`ios`?await this.limrun.iosInstances.list({labelSelector:n}):await this.limrun.androidInstances.list({labelSelector:n})).getPaginatedItems().map(e=>e.metadata.id);for(let e of a)t===`ios`?await this.limrun.iosInstances.delete(e):await this.limrun.androidInstances.delete(e);if(a.length!==0)return{limrunInstanceId:a[0],limrunInstanceCount:a.length}}async terminateSession(e){if(e.client.disconnect(),e.platform===`ios`){await this.limrun.iosInstances.delete(e.instanceId);return}await s(e),await this.limrun.androidInstances.delete(e.instanceId)}getSessionForDevice(e){let t=a(e.id);if(!t)return;let n=this.sessions.get(t.leaseId);return n?.platform===t.platform?n:void 0}resolveAppReference(e,t){let n=a(e.id);if(!n)return t;let r=this.appAliases.get(n.leaseId);return r?.assetName===t?r.installedAppId:t}currentAppLogReader(e){let t=this.getSessionForDevice(e);if(!t)return;let n=p(t);return{platform:t.platform,leaseId:t.lease.leaseId,instanceId:t.instanceId,readLogs:async(e,t)=>n.platform===`ios`?await n.readLogs(e,t):await n.readLogs(t),[Symbol.asyncDispose]:async()=>void 0}}async reconnectAppLogReader(e,t){let{reconnectLimrunAppLogReader:n}=await import(`./app-log-reconnect.js`);return await n({limrun:this.limrun,descriptor:e,dependencies:this.dependencies,signal:t})}requireAndroidPortReverseSession(e){let t=this.sessions.get(e);if(!t||t.platform===`android`)return t;throw S(`port reverse`,`Direct Limrun iOS sessions cannot reach local host ports; use a bridge public URL.`)}};async function b(e,n,r){let{createLimrunPlatformRuntimeOwner:i}=await import(`./app-log-runtime2.js`);return i({host:r,runtimeInstance:n,ownsDevice:t=>e.ownsDevice(t),hasLiveSession:t=>e.hasLiveSession(t),getInteractor:(t,n)=>e.getInteractor(t,n),getDeviceSession:t=>e.getDeviceSession(t),resolveAppReference:(t,n)=>e.resolveAppReference(t,n),openCurrent:async t=>e.currentAppLogReader(t),reconnect:async(t,n)=>await e.reconnectAppLogReader(t,n),listApps:async(n,r,i)=>{i.throwIfAborted();let a=e.getDeviceSession(n);if(!a)throw new t(`DEVICE_NOT_FOUND`,`Limrun app inventory session is unavailable`,{deviceId:n.id});return(await a.listApps(r)).map(e=>({id:e.id,name:e.name??e.id}))},getAppState:async(n,r)=>{r.throwIfAborted();let i=e.getDeviceSession(n);if(i?.platform!==`android`)throw new t(`UNSUPPORTED_OPERATION`,`Limrun Android appstate requires an active provider session`);let a=await i.getForegroundApp(r);return r.throwIfAborted(),{package:a?.appId,activity:a?.activity}},deployApp:async(t,n,r,i)=>await e.installApp(t,n.app,n.appPath,{relaunch:n.replaceExisting,appIdentifierHint:n.app,packageNameHint:n.app},r,i),deployMaterializedApp:async(t,n,r,i)=>await e.installInstallablePath(t,n.artifact.installablePath,{appIdentifierHint:n.artifact.bundleId,packageNameHint:n.artifact.packageName},r,i),configurePortReverse:async t=>await e.configurePortReverse(t)})}function x(e){return{leaseId:e.leaseId,devicePort:e.devicePort,hostPort:e.hostPort,name:e.name}}function S(e,n){throw new t(`UNSUPPORTED_OPERATION`,n,{command:e})}async function C(e){let n=new o({...g(e),timeout:15e3,maxRetries:0}),r={limit:1,...e.region?{region:e.region}:{}};try{e.platform===`android`?await n.androidInstances.list(r):await n.iosInstances.list(r)}catch(e){let n=w(e);throw n===401||n===403?new t(`UNAUTHORIZED`,`Limrun rejected connection verification.`,{status:n,hint:`Check LIMRUN_API_KEY and its organization access.`}):new t(`COMMAND_FAILED`,`Limrun connection verification failed.`,{hint:`Check Limrun service access, LIMRUN_REGION, and network connectivity, then retry.`},e)}let i=e.platform===`android`?`Android`:`iOS`,a=e.platform===`android`?`emulator`:`simulator`;return{provider:`limrun`,service:`Limrun`,verificationMessage:`Credentials and ${i} instance access verified.`,device:{status:`deferred`,name:`Provider-selected ${i} ${a}`,platform:e.platform},app:{status:`missing`,message:`Run apps to choose an uploaded asset before allocation.`}}}function w(e){if(!e||typeof e!=`object`)return;let t=e.status;return typeof t==`number`?t:void 0}var T=e({LIMRUN_PROVIDER:()=>i,createLimrunRuntime:()=>v,verifyLimrunConnection:()=>C});export{C as n,v as r,T as t};
|
package/dist/src/src7.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{N as e}from"./sdk-contracts.js";import{A as t}from"./sdk-device.js";import{Yt as n,en as r}from"./sdk-batch.js";import{t as i}from"./audio-probe-runtime.js";import{a,n as o,t as s}from"./durable-resource.js";import{n as c}from"./async-lifecycle.js";import{n as l,t as u}from"./audio-probe-result.js";import d from"node:fs/promises";function f(e,t){if(e.resourceKind!==t.resourceKind)return{status:`unreattachable`,reason:`descriptor-invalid`,message:`Durable resource kind ${e.resourceKind} does not match ${t.resourceKind}`};if(e.descriptor.version!==t.version)return{status:`unreattachable`,reason:`descriptor-version-unsupported`,message:`Unsupported ${t.resourceKind} descriptor version: ${e.descriptor.version}`,version:e.descriptor.version};try{let n=t.decode(e.descriptor.body);return n.status===`decoded`?n:{status:`unreattachable`,reason:`descriptor-invalid`,message:n.message}}catch(e){return{status:`unreattachable`,reason:`descriptor-invalid`,message:e instanceof Error?e.message:`Descriptor codec rejected the body`}}}function p(e,t){return Object.freeze({pendingHandle:new c(e),envelope:t})}function m(e){return Object.freeze({appLogReattach:async({envelope:t})=>{let n=f(t,e.codec);return n.status===`unreattachable`?n:await e.reattach(n.descriptor,h(t))},appLogCleanup:async({envelope:t})=>{let n=f(t,e.codec);return n.status===`decoded`?await e.cleanup(n.descriptor,h(t)):{status:`cleanup-pending`,reason:`manual-recovery-required`,message:n.message}}})}function h(e){return Object.freeze({sessionId:e.sessionId,fence:e.fence})}function g(e){if(typeof e!=`object`||!e||Array.isArray(e))return{status:`invalid`,message:`App-log process marker must be an object`};let t=e;return!Number.isInteger(t.pid)||Number(t.pid)<=0?{status:`invalid`,message:`App-log process marker pid must be a positive integer`}:typeof t.startTime!=`string`||t.startTime.trim().length===0?{status:`invalid`,message:`App-log process marker startTime must be a non-empty string`}:typeof t.command!=`string`||t.command.trim().length===0?{status:`invalid`,message:`App-log process marker command must be a non-empty string`}:{status:`decoded`,marker:Object.freeze({pid:Number(t.pid),startTime:t.startTime,command:t.command})}}function _(e){let t,n,r,i=()=>n??=e.forceCleanup();return Object.freeze({inspect:()=>e.inspect(),finish:()=>t??=e.finish(),forceCleanup:i,[Symbol.asyncDispose]:async()=>{r??=i().then(ee),await r}})}function v(e){return _({inspect:e.inspect,finish:e.finish,forceCleanup:async()=>{let t=await e.finish();return t.status===`completed`?{status:`cleaned`}:{status:`cleanup-pending`,reason:t.reason,message:t.message}}})}function ee(t){if(!s(t))throw new e(`COMMAND_FAILED`,t.message??`Durable resource cleanup could not be confirmed`,{reason:t.reason,retriable:t.reason!==`ownership-fence-lost`,hint:t.reason===`ownership-fence-lost`?`Use the current resource owner or recovery record before retrying cleanup.`:`Keep the recovery record and retry cleanup through the exact runtime owner.`})}const te=e=>b(e.backend)&&(e.source===`system-audio`||e.source===`media-elements`)&&x(e.sourceCount,0)&&re(e.notes)&&b(e.statusPath)&&x(e.startedAt,1)&&x(e.durationMs,1)&&x(e.bucketMs,1),y=Object.freeze({resourceKind:i,version:1,encode:e=>({...e,notes:[...e.notes],marker:{...e.marker}}),decode:e=>{let t=te(e)?ne(e.marker):`invalid`;if(t===`invalid`)return{status:`invalid`,message:`Audio probe descriptor body is invalid`};let n=e;return{status:`decoded`,descriptor:Object.freeze({backend:n.backend,source:n.source,sourceCount:n.sourceCount,notes:Object.freeze([...n.notes]),statusPath:n.statusPath,startedAt:n.startedAt,durationMs:n.durationMs,bucketMs:n.bucketMs,marker:t})}}});function ne(e){if(typeof e!=`object`||!e)return`invalid`;let t=e;return!x(t.pid,1)||!b(t.startTime)||!b(t.command)?`invalid`:Object.freeze({pid:t.pid,startTime:t.startTime,command:t.command})}function b(e){return typeof e==`string`&&e.length>0}function x(e,t){return typeof e==`number`&&Number.isInteger(e)&&e>=t}function re(e){return Array.isArray(e)&&e.every(e=>typeof e==`string`)}async function S(e){try{let t=await d.readFile(e.statusPath,`utf8`);return l(JSON.parse(t),{source:e.source,backend:e.backend,durationMs:e.durationMs,elapsedMs:Date.now()-e.startedAt,bucketMs:e.bucketMs,activeFallback:!0,sourceCount:e.sourceCount,notes:[...e.notes]})}catch(e){if(e.code===`ENOENT`)return;throw e}}function C(e,t,n){let r=Math.min(e.durationMs,Math.max(0,Date.now()-e.startedAt));return{...t??u({source:e.source,backend:e.backend,durationMs:e.durationMs,bucketMs:e.bucketMs,sourceCount:e.sourceCount,notes:[...e.notes]}),state:`stopped`,active:!1,elapsedMs:r,stoppedAt:new Date().toISOString(),reason:n}}function ie(e){let{host:t}=e;return Object.freeze({audioProbeReattach:async e=>{let n=f(e.envelope,y);if(n.status!==`decoded`)return n;let r=n.descriptor,i=await t.inspectProcess(r.marker);if(i===`owned-alive`)return{status:`unreattachable`,reason:`transport-not-reattachable`};if(i===`ownership-lost`)return{status:`unreattachable`,reason:`ownership-fence-lost`};let a=await S(r);return a===void 0||a.state!==`stopped`?{status:`missing`}:{status:`completed`,result:C(r,a,`daemon-recovery`)}},audioProbeCleanup:async e=>{let n=f(e.envelope,y);if(n.status!==`decoded`)return{status:`cleanup-pending`,reason:`manual-recovery-required`,message:n.message};let r=n.descriptor,i=await t.inspectProcess(r.marker);if(i===`ownership-lost`)return{status:`cleanup-pending`,reason:`ownership-fence-lost`};if(i===`missing`)return{status:`already-missing`};let a=await t.terminateProcess(r.marker);return a===`ownership-lost`?{status:`cleanup-pending`,reason:`ownership-fence-lost`}:{status:a===`terminated`?`cleaned`:`already-missing`}}})}async function ae(n){let{host:r,device:s,owner:l,input:u}=n,f=Date.now(),p=r.info,m=Object.freeze([...p.notes(s)]),h=Object.freeze({source:p.source,backend:p.backend,sourceCount:p.sourceCount,notes:m,statusPath:u.statusPath,startedAt:f,durationMs:u.durationMs,bucketMs:u.bucketMs});await d.rm(u.statusPath,{force:!0});let g=await r.start({durationMs:u.durationMs,bucketMs:u.bucketMs,statusPath:u.statusPath});g.wait.catch(()=>{});let _=g.marker;try{if(_===void 0)throw new e(`COMMAND_FAILED`,`failed to start host audio probe: the helper process exposed no exact identity, so the capture could not be recovered after daemon loss and was terminated`);await ue(h,g)}catch(e){throw await g.terminate().catch(()=>{}),e}return Object.freeze({pendingHandle:new c(oe(h,g)),envelope:o({resourceKind:i,sessionId:u.sessionId,device:t(s),owner:l,fence:u.fence,lifecycle:`open`,descriptor:a(y,{backend:p.backend,source:p.source,sourceCount:p.sourceCount,notes:m,statusPath:u.statusPath,startedAt:f,durationMs:u.durationMs,bucketMs:u.bucketMs,marker:_})})})}function oe(e,t){let n,r,i,a;t.wait.then(e=>{a={message:se(e)}},e=>{a={message:e instanceof Error?e.message:`audio probe helper wait failed`}});let o=()=>n??=(async()=>{let n=await S(e);if(n?.state!==`stopped`&&a)throw w(a);return await t.terminate().catch(()=>{}),await t.wait.catch(()=>{}),{status:`completed`,result:C(e,n,`stopped`)}})(),s=()=>r??=n?n.then(async()=>({status:`cleaned`}),async()=>await T(t)):T(t);return Object.freeze({inspect:()=>e,status:async()=>{let t=await S(e);if(t?.state===`stopped`)return t;if(a)throw w(a);return t??C(e,void 0,`not-started`)},finish:o,forceCleanup:s,[Symbol.asyncDispose]:async()=>{i??=s().then(ce),await i}})}function se(e){return e.stderr?.trim()||e.stdout?.trim()||`audio probe helper exited with code ${e.exitCode??1}`}function w(t){return new e(`COMMAND_FAILED`,`host audio probe helper exited before completing the capture: ${t.message}`,{hint:`Keep audio-probe.resource.json; stop resolves the record through descriptor cleanup.`})}async function T(e){try{return await e.terminate(),await e.wait.catch(()=>{}),{status:`cleaned`}}catch(e){return{status:`cleanup-pending`,reason:`cleanup-unconfirmed`,message:e instanceof Error?e.message:`Audio probe termination failed`}}}function ce(t){if(!s(t))throw new e(`COMMAND_FAILED`,t.message??`Audio probe cleanup could not be confirmed`,{reason:t.reason,retriable:t.reason!==`ownership-fence-lost`,hint:`Keep audio-probe.resource.json and retry stop through its exact runtime owner.`})}function le(e){let{host:t,device:n,owner:r}=e,i=ie({host:t});return Object.freeze({audioProbeStart:async e=>await ae({host:t,device:n,owner:r,input:e}),audioProbeReattach:i.audioProbeReattach,audioProbeCleanup:i.audioProbeCleanup})}async function ue(t,n){let r=Date.now()+5e3;for(;Date.now()<r;){if(await S(t))return;let r=await Promise.race([n.wait.then(e=>e,e=>e),de(100).then(()=>void 0)]);if(r instanceof Error)throw r;if(r){let t=r,n=t.stderr?.trim()||t.stdout?.trim()||`host audio probe helper exited with code ${t.exitCode??1}`;throw new e(`COMMAND_FAILED`,`failed to start host audio probe: ${n}`)}}throw new e(`COMMAND_FAILED`,`failed to start host audio probe`)}function de(e){return new Promise(t=>setTimeout(t,e))}async function E(e,t){let n=await O(e,t);if(n.status===`missing`)return{status:`missing`};if(n.status===`invalid`)return{status:`unreattachable`,reason:`ownership-fence-lost`,message:n.message};let r=await e.processes.inspect(n.marker);return r===`missing`?(t&&await e.processes.clearMarker(t),{status:`missing`}):r===`ownership-lost`?{status:`unreattachable`,reason:`ownership-fence-lost`}:{status:`unreattachable`,reason:`transport-not-reattachable`}}async function D(e,t){if(!t)return{status:`cleanup-pending`,reason:`manual-recovery-required`,message:`App-log process marker path is missing`};let n=await O(e,t);if(n.status===`missing`)return{status:`already-missing`};if(n.status===`invalid`)return{status:`cleanup-pending`,reason:`manual-recovery-required`,message:n.message};let r=await e.processes.inspect(n.marker);if(r===`ownership-lost`)return k();if(r===`missing`)return await e.processes.clearMarker(t),{status:`already-missing`};let i=await e.processes.terminate(n.marker);return i===`ownership-lost`?k():(await e.processes.clearMarker(t),{status:i===`terminated`?`cleaned`:`already-missing`})}async function O(e,t){return t?await e.processes.readMarker(t):{status:`invalid`,message:`App-log process marker path is missing`}}function k(){return{status:`cleanup-pending`,reason:`ownership-fence-lost`}}async function fe(e){let t=e.initialProcess;for(;!e.stopped();){if(t){await pe(e,t),t=void 0,await be(e);continue}let n=await xe(e);if(n.status===`stopped`)return;n.status!==`waiting`&&(t=n.process)}}async function pe(e,t){let{process:n}=t;e.setActive(n);try{e.setState(`active`),await me(e,t)}finally{await A(e,n)}}async function me(e,t){let n=he(t.process);try{await ge(e,t,n),await ve(e,t.process,n),await ye(n.outcome)}finally{n.controller.abort()}}function he(e){let t=new AbortController,n=!1,r=()=>{n=!0,t.abort()};return{controller:t,outcome:e.wait.then(()=>(r(),{status:`exited`}),e=>(r(),{status:`failed`,error:e})),settled:()=>n}}async function ge(e,t,n){for(;!e.stopped()&&!n.settled();){if(!await _e(e,n))return;let r=await e.resolvePid();if(e.stopped())return;if(r!==t.pid){await t.process.terminate();return}}}async function _e(e,t){try{await e.sleep(500,t.controller.signal)}catch(e){if(!t.settled())throw e}return!t.settled()}async function ve(e,t,n){e.stopped()&&!n.settled()&&await t.terminate()}async function ye(e){let t=await e;if(t.status===`failed`)throw t.error}async function be(e){e.stopped()||(e.setState(`recovering`),await e.sleep(500))}async function xe(e){let t=await e.resolvePid();if(e.stopped())return{status:`stopped`};if(!t)return e.setState(`recovering`),await e.sleep(1e3),{status:`waiting`};let n=await e.startProcess(t);return e.setActive(n),e.stopped()?(await Se(e,n),{status:`stopped`}):{status:`started`,process:{pid:t,process:n}}}async function Se(e,t){try{await t.terminate(),await t.wait}finally{await A(e,t)}}async function A(e,t){try{await t[Symbol.asyncDispose]()}finally{e.setActive(void 0)}}async function Ce(e){let t=await e.resolvePid(e.setupSignal);e.setupSignal.throwIfAborted();let n=await e.host.outputs.openAppend(e.outputPath),r=`recovering`,i=!1,a;try{if(e.setupSignal.throwIfAborted(),t){e.setupSignal.throwIfAborted();let i=new AbortController,o=()=>i.abort(e.setupSignal.reason);e.setupSignal.addEventListener(`abort`,o,{once:!0});try{a=await e.processStart({command:e.command(t),output:n,markerPath:e.pidPath},i.signal)}finally{e.setupSignal.removeEventListener(`abort`,o)}e.setupSignal.throwIfAborted(),r=`active`}}catch(e){throw await j([async()=>await a?.terminate(),async()=>{await a?.wait},async()=>await a?.[Symbol.asyncDispose](),async()=>await n[Symbol.asyncDispose]()]),e}let o=fe({initialProcess:a&&t?{pid:t,process:a}:void 0,stopped:()=>i,setActive:e=>{a=e},setState:e=>{r=e},resolvePid:async()=>await e.resolvePid(),startProcess:async t=>await e.processStart({command:e.command(t),output:n,markerPath:e.pidPath}),sleep:async(t,n)=>await e.host.clock.sleep(t,n)}).catch(()=>{r=`failed`}),s,c=async()=>s??=we({options:e,monitor:o,active:()=>a,stop:()=>{i=!0},setState:e=>{r=e},output:n}),l=e.host.clock.now();return v({inspect:()=>({backend:e.backend,state:r,startedAt:l}),finish:c})}async function we(e){return e.stop(),(await j([async()=>await e.active()?.terminate(),async()=>await e.monitor,async()=>await e.output[Symbol.asyncDispose]()])).length>0?(e.setState(`failed`),{status:`cleanup-pending`,reason:`transport-failed`,message:e.options.cleanupFailureMessage}):(e.setState(`ended`),{status:`completed`,result:{backend:e.options.backend,outputPath:e.options.outputPath,completedAt:e.options.host.clock.now()}})}async function j(e){let t=[];for(let n of e)try{await n()}catch(e){t.push(e)}return t}function M(e,t,n){let r=e.artifacts.resolveSession(t);return n.outputPath===r.outputPath&&(n.pidPath===void 0||n.pidPath===r.pidPath)}function N(t,n){if(!M(t,n.sessionId,n))throw new e(`INVALID_ARGS`,`App-log paths do not match the owning session`)}const P=Object.freeze({available:!0});async function Te(e,t,n){let r=(await e.commands.run(t,n)).stdout.trim().split(/\s+/)[0]??``;return/^\d+$/.test(r)?r:``}function Ee(t,i){let a=n(i.family);return Object.freeze({owner:a,ownsDevice:e=>e.platform===i.family,inspectFacts:async e=>F(e,await t.processTransports.resolve(e),i),bind:async n=>{if(n.intent.kind===`exact-owner`&&!r(n.intent.owner,a))throw new e(`UNSUPPORTED_OPERATION`,`${i.label} app-log owner identity does not match`);if(n.device.platform!==i.family)throw new e(`UNSUPPORTED_PLATFORM`,`${i.label} app-log owner cannot bind ${n.device.platform}`);let o=await t.processTransports.resolve(n.device);return De(t,n.device,n.scope.signal,o,a,i)},shutdown:async()=>void 0})}function De(e,t,n,r,i,a){let o=m({codec:a.codec,reattach:async(t,n)=>M(e,n.sessionId,t)?await E(e,t.pidPath):{status:`unreattachable`,reason:`descriptor-invalid`,message:`${a.label} app-log descriptor paths do not match the owning session`},cleanup:async(t,n)=>M(e,n.sessionId,t)?await D(e,t.pidPath):{status:`cleanup-pending`,reason:`ownership-fence-lost`,message:`${a.label} app-log descriptor paths do not match the owning session`}}),s=Object.freeze({appLogInspect:async()=>({backend:a.backend}),appLogDoctor:async({appBundleId:r})=>await a.doctor({host:e,device:t,signal:n},r),...r.start?{appLogStart:async o=>await Oe(e,t,n,r,i,o,a)}:{},...o});return Object.freeze({device:t,owner:i,facts:F(t,r,a),operations:s,[Symbol.asyncDispose]:async()=>void 0})}function F(e,t,n){let r=t.start?P:{available:!1,reason:`owner-capability-missing`,hint:n.startUnavailableHint};return Object.freeze({device:{family:n.family,kind:e.kind,...e.target===void 0?{}:{target:e.target},providerMode:t.mode},operations:{appLogInspect:P,appLogDoctor:P,appLogStart:r,appLogReattach:P,appLogCleanup:P}})}async function Oe(t,n,r,i,a,o,s){if(!i.start)throw new e(`UNSUPPORTED_OPERATION`,s.startUnavailableHint);N(t,o);let c=t.artifacts.resolveSession(o.sessionId),l={host:t,device:n,signal:r,input:o,artifacts:c,transport:i};s.validateStart?.(l),r.throwIfAborted();let u=await s.process(l);r.throwIfAborted();let d=await Ce({host:t,backend:s.backend,outputPath:c.outputPath,pidPath:c.pidPath,processStart:i.start,setupSignal:r,resolvePid:u.resolvePid,command:u.command,cleanupFailureMessage:s.cleanupFailureMessage}),f=s.descriptor({artifacts:c,transport:i});return p(d,s.envelope({input:o,device:n,owner:a,descriptor:f}))}function I(e){for(let t of[/\bstatus(?:Code)?["'=: ]+([1-5]\d{2})\b/i,/\bresponse(?:\s+code)?["'=: ]+([1-5]\d{2})\b/i,/\bHTTP\/[0-9.]+\s+([1-5]\d{2})\b/i]){let n=t.exec(e);if(!n)continue;let r=Number.parseInt(n[1]??``,10);if(Number.isInteger(r))return r}return null}function L(e){return/\b\d{4}-\d{2}-\d{2}[ T]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z)?\b/.exec(e)?.[0]??/\b\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d+\b/.exec(e)?.[0]}function ke(e){let t=e.indexOf(`{`),n=e.lastIndexOf(`}`);if(t<0||n<=t)return null;try{let r=JSON.parse(e.slice(t,n+1));return r&&typeof r==`object`&&!Array.isArray(r)?r:null}catch{return null}}function R(e,t){for(let n of t){let t=e?.[n];if(typeof t==`string`&&t.trim())return t.trim()}}function Ae(e,t){for(let n of t){let t=e?.[n];if(typeof t==`number`&&Number.isInteger(t))return t;if(typeof t==`string`&&/^\d{3}$/.test(t.trim()))return Number.parseInt(t,10)}return null}function je(e,t){let n=t?.headers??t?.requestHeaders??t?.responseHeaders;return n===void 0?/\bheaders?["'=: ]+(\{.*\})/i.exec(e)?.[1]?.trim():B(n)}function z(e,t,n){for(let r of n){if(t?.[r]!==void 0)return B(t[r]);let n=r.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`),i=RegExp(`\\b${n}["'=: ]+(.+)$`,`i`).exec(e);if(i?.[1])return i[1].trim()}}function B(e){if(typeof e==`string`)return e;try{return JSON.stringify(e)}catch{return String(e)}}function Me(e,t,n){let r=U(t,n,5),i=e.packetId??r.map(V).find(e=>typeof e==`string`&&e.length>0);i&&(e.packetId=i);let a=i?U(t,n,12).filter(e=>V(e)===i):r;e.timestamp??=a.map(L).find(e=>typeof e==`string`&&e.length>0),e.status??=a.map(I).find(e=>typeof e==`number`)??void 0,e.durationMs??=a.map(H).find(e=>typeof e==`number`)??void 0}function V(e){return/\bpacket id (\d+)\b/i.exec(e)?.[1]??null}function H(e){let t=/\b(?:duration|elapsed request\/response time, ms)[:= ]+(\d+)\b/i.exec(e);return t?Number.parseInt(t[1]??``,10):null}function U(e,t,n){return e.slice(Math.max(0,t-n),Math.min(e.length,t+n+1)).map(e=>e.trim()).filter(Boolean)}const Ne=RegExp(`\\b(${[`GET`,`POST`,`PUT`,`PATCH`,`DELETE`,`HEAD`,`OPTIONS`].join(`|`)})\\b\\s+https?:\\/\\/`,`i`),Pe=/https?:\/\/[^\s"'<>\])]+/i,Fe=/\[C(\d+)\b[^\]]*?\burl:\s*([^\s,\]]+)/,W=/\bsummary for task (?:success|failure)\s*\{([^}]*)\}/,Ie=/\bTask\s+<([0-9A-Fa-f-]+)>\.<(\d+)>/,G=/(?:^|\s)(\S+)\[(\d+):[0-9a-f]+\]/,Le=/\burl:\s*(https?:\/\/[^\s,\]]+)/i;function Re(e,t,n=e.dump.limits.maxEntries){let r=[...e.dump.entries],i=new Set(r.map(K));for(let e of t.dump.entries){let t=K(e);if(!i.has(t)&&(i.add(t),r.push(e),r.length>=n))break}let a=new Set([...e.dump.entries,...t.dump.entries].map(e=>e.packetId).filter(e=>e!==void 0)),o=[...new Set([...e.unnamedRequestIds,...t.unnamedRequestIds])].filter(e=>!a.has(e));return Object.freeze({dump:Object.freeze({...e.dump,matchedLines:r.length,entries:Object.freeze(r),unnamedRequests:o.length}),unnamedRequestIds:Object.freeze(o)})}function ze(e,t){let n=J(t.maxEntries,25,1,200),r=t.include??`summary`,i=J(t.maxPayloadChars,2048,64,16384),a=J(t.maxScanLines,4e3,100,2e4),o=Ve(t.lineNumberOffset);if(!t.exists)return Object.freeze({dump:Object.freeze({path:t.path,exists:!1,scannedLines:0,matchedLines:0,entries:Object.freeze([]),unnamedRequests:0,include:r,limits:Object.freeze({maxEntries:n,maxPayloadChars:i,maxScanLines:a})}),unnamedRequestIds:Object.freeze([])});let s=e.split(`
|
|
1
|
+
import{N as e}from"./sdk-contracts.js";import{A as t}from"./sdk-device.js";import{Xt as n,tn as r}from"./sdk-batch.js";import{t as i}from"./audio-probe-runtime.js";import{a,n as o,t as s}from"./durable-resource.js";import{n as c}from"./async-lifecycle.js";import{n as l,t as u}from"./audio-probe-result.js";import d from"node:fs/promises";function f(e,t){if(e.resourceKind!==t.resourceKind)return{status:`unreattachable`,reason:`descriptor-invalid`,message:`Durable resource kind ${e.resourceKind} does not match ${t.resourceKind}`};if(e.descriptor.version!==t.version)return{status:`unreattachable`,reason:`descriptor-version-unsupported`,message:`Unsupported ${t.resourceKind} descriptor version: ${e.descriptor.version}`,version:e.descriptor.version};try{let n=t.decode(e.descriptor.body);return n.status===`decoded`?n:{status:`unreattachable`,reason:`descriptor-invalid`,message:n.message}}catch(e){return{status:`unreattachable`,reason:`descriptor-invalid`,message:e instanceof Error?e.message:`Descriptor codec rejected the body`}}}function p(e,t){return Object.freeze({pendingHandle:new c(e),envelope:t})}function m(e){return Object.freeze({appLogReattach:async({envelope:t})=>{let n=f(t,e.codec);return n.status===`unreattachable`?n:await e.reattach(n.descriptor,h(t))},appLogCleanup:async({envelope:t})=>{let n=f(t,e.codec);return n.status===`decoded`?await e.cleanup(n.descriptor,h(t)):{status:`cleanup-pending`,reason:`manual-recovery-required`,message:n.message}}})}function h(e){return Object.freeze({sessionId:e.sessionId,fence:e.fence})}function g(e){if(typeof e!=`object`||!e||Array.isArray(e))return{status:`invalid`,message:`App-log process marker must be an object`};let t=e;return!Number.isInteger(t.pid)||Number(t.pid)<=0?{status:`invalid`,message:`App-log process marker pid must be a positive integer`}:typeof t.startTime!=`string`||t.startTime.trim().length===0?{status:`invalid`,message:`App-log process marker startTime must be a non-empty string`}:typeof t.command!=`string`||t.command.trim().length===0?{status:`invalid`,message:`App-log process marker command must be a non-empty string`}:{status:`decoded`,marker:Object.freeze({pid:Number(t.pid),startTime:t.startTime,command:t.command})}}function _(e){let t,n,r,i=()=>n??=e.forceCleanup();return Object.freeze({inspect:()=>e.inspect(),finish:()=>t??=e.finish(),forceCleanup:i,[Symbol.asyncDispose]:async()=>{r??=i().then(ee),await r}})}function v(e){return _({inspect:e.inspect,finish:e.finish,forceCleanup:async()=>{let t=await e.finish();return t.status===`completed`?{status:`cleaned`}:{status:`cleanup-pending`,reason:t.reason,message:t.message}}})}function ee(t){if(!s(t))throw new e(`COMMAND_FAILED`,t.message??`Durable resource cleanup could not be confirmed`,{reason:t.reason,retriable:t.reason!==`ownership-fence-lost`,hint:t.reason===`ownership-fence-lost`?`Use the current resource owner or recovery record before retrying cleanup.`:`Keep the recovery record and retry cleanup through the exact runtime owner.`})}const te=e=>b(e.backend)&&(e.source===`system-audio`||e.source===`media-elements`)&&x(e.sourceCount,0)&&re(e.notes)&&b(e.statusPath)&&x(e.startedAt,1)&&x(e.durationMs,1)&&x(e.bucketMs,1),y=Object.freeze({resourceKind:i,version:1,encode:e=>({...e,notes:[...e.notes],marker:{...e.marker}}),decode:e=>{let t=te(e)?ne(e.marker):`invalid`;if(t===`invalid`)return{status:`invalid`,message:`Audio probe descriptor body is invalid`};let n=e;return{status:`decoded`,descriptor:Object.freeze({backend:n.backend,source:n.source,sourceCount:n.sourceCount,notes:Object.freeze([...n.notes]),statusPath:n.statusPath,startedAt:n.startedAt,durationMs:n.durationMs,bucketMs:n.bucketMs,marker:t})}}});function ne(e){if(typeof e!=`object`||!e)return`invalid`;let t=e;return!x(t.pid,1)||!b(t.startTime)||!b(t.command)?`invalid`:Object.freeze({pid:t.pid,startTime:t.startTime,command:t.command})}function b(e){return typeof e==`string`&&e.length>0}function x(e,t){return typeof e==`number`&&Number.isInteger(e)&&e>=t}function re(e){return Array.isArray(e)&&e.every(e=>typeof e==`string`)}async function S(e){try{let t=await d.readFile(e.statusPath,`utf8`);return l(JSON.parse(t),{source:e.source,backend:e.backend,durationMs:e.durationMs,elapsedMs:Date.now()-e.startedAt,bucketMs:e.bucketMs,activeFallback:!0,sourceCount:e.sourceCount,notes:[...e.notes]})}catch(e){if(e.code===`ENOENT`)return;throw e}}function C(e,t,n){let r=Math.min(e.durationMs,Math.max(0,Date.now()-e.startedAt));return{...t??u({source:e.source,backend:e.backend,durationMs:e.durationMs,bucketMs:e.bucketMs,sourceCount:e.sourceCount,notes:[...e.notes]}),state:`stopped`,active:!1,elapsedMs:r,stoppedAt:new Date().toISOString(),reason:n}}function ie(e){let{host:t}=e;return Object.freeze({audioProbeReattach:async e=>{let n=f(e.envelope,y);if(n.status!==`decoded`)return n;let r=n.descriptor,i=await t.inspectProcess(r.marker);if(i===`owned-alive`)return{status:`unreattachable`,reason:`transport-not-reattachable`};if(i===`ownership-lost`)return{status:`unreattachable`,reason:`ownership-fence-lost`};let a=await S(r);return a===void 0||a.state!==`stopped`?{status:`missing`}:{status:`completed`,result:C(r,a,`daemon-recovery`)}},audioProbeCleanup:async e=>{let n=f(e.envelope,y);if(n.status!==`decoded`)return{status:`cleanup-pending`,reason:`manual-recovery-required`,message:n.message};let r=n.descriptor,i=await t.inspectProcess(r.marker);if(i===`ownership-lost`)return{status:`cleanup-pending`,reason:`ownership-fence-lost`};if(i===`missing`)return{status:`already-missing`};let a=await t.terminateProcess(r.marker);return a===`ownership-lost`?{status:`cleanup-pending`,reason:`ownership-fence-lost`}:{status:a===`terminated`?`cleaned`:`already-missing`}}})}async function ae(n){let{host:r,device:s,owner:l,input:u}=n,f=Date.now(),p=r.info,m=Object.freeze([...p.notes(s)]),h=Object.freeze({source:p.source,backend:p.backend,sourceCount:p.sourceCount,notes:m,statusPath:u.statusPath,startedAt:f,durationMs:u.durationMs,bucketMs:u.bucketMs});await d.rm(u.statusPath,{force:!0});let g=await r.start({durationMs:u.durationMs,bucketMs:u.bucketMs,statusPath:u.statusPath});g.wait.catch(()=>{});let _=g.marker;try{if(_===void 0)throw new e(`COMMAND_FAILED`,`failed to start host audio probe: the helper process exposed no exact identity, so the capture could not be recovered after daemon loss and was terminated`);await ue(h,g)}catch(e){throw await g.terminate().catch(()=>{}),e}return Object.freeze({pendingHandle:new c(oe(h,g)),envelope:o({resourceKind:i,sessionId:u.sessionId,device:t(s),owner:l,fence:u.fence,lifecycle:`open`,descriptor:a(y,{backend:p.backend,source:p.source,sourceCount:p.sourceCount,notes:m,statusPath:u.statusPath,startedAt:f,durationMs:u.durationMs,bucketMs:u.bucketMs,marker:_})})})}function oe(e,t){let n,r,i,a;t.wait.then(e=>{a={message:se(e)}},e=>{a={message:e instanceof Error?e.message:`audio probe helper wait failed`}});let o=()=>n??=(async()=>{let n=await S(e);if(n?.state!==`stopped`&&a)throw w(a);return await t.terminate().catch(()=>{}),await t.wait.catch(()=>{}),{status:`completed`,result:C(e,n,`stopped`)}})(),s=()=>r??=n?n.then(async()=>({status:`cleaned`}),async()=>await T(t)):T(t);return Object.freeze({inspect:()=>e,status:async()=>{let t=await S(e);if(t?.state===`stopped`)return t;if(a)throw w(a);return t??C(e,void 0,`not-started`)},finish:o,forceCleanup:s,[Symbol.asyncDispose]:async()=>{i??=s().then(ce),await i}})}function se(e){return e.stderr?.trim()||e.stdout?.trim()||`audio probe helper exited with code ${e.exitCode??1}`}function w(t){return new e(`COMMAND_FAILED`,`host audio probe helper exited before completing the capture: ${t.message}`,{hint:`Keep audio-probe.resource.json; stop resolves the record through descriptor cleanup.`})}async function T(e){try{return await e.terminate(),await e.wait.catch(()=>{}),{status:`cleaned`}}catch(e){return{status:`cleanup-pending`,reason:`cleanup-unconfirmed`,message:e instanceof Error?e.message:`Audio probe termination failed`}}}function ce(t){if(!s(t))throw new e(`COMMAND_FAILED`,t.message??`Audio probe cleanup could not be confirmed`,{reason:t.reason,retriable:t.reason!==`ownership-fence-lost`,hint:`Keep audio-probe.resource.json and retry stop through its exact runtime owner.`})}function le(e){let{host:t,device:n,owner:r}=e,i=ie({host:t});return Object.freeze({audioProbeStart:async e=>await ae({host:t,device:n,owner:r,input:e}),audioProbeReattach:i.audioProbeReattach,audioProbeCleanup:i.audioProbeCleanup})}async function ue(t,n){let r=Date.now()+5e3;for(;Date.now()<r;){if(await S(t))return;let r=await Promise.race([n.wait.then(e=>e,e=>e),de(100).then(()=>void 0)]);if(r instanceof Error)throw r;if(r){let t=r,n=t.stderr?.trim()||t.stdout?.trim()||`host audio probe helper exited with code ${t.exitCode??1}`;throw new e(`COMMAND_FAILED`,`failed to start host audio probe: ${n}`)}}throw new e(`COMMAND_FAILED`,`failed to start host audio probe`)}function de(e){return new Promise(t=>setTimeout(t,e))}async function E(e,t){let n=await O(e,t);if(n.status===`missing`)return{status:`missing`};if(n.status===`invalid`)return{status:`unreattachable`,reason:`ownership-fence-lost`,message:n.message};let r=await e.processes.inspect(n.marker);return r===`missing`?(t&&await e.processes.clearMarker(t),{status:`missing`}):r===`ownership-lost`?{status:`unreattachable`,reason:`ownership-fence-lost`}:{status:`unreattachable`,reason:`transport-not-reattachable`}}async function D(e,t){if(!t)return{status:`cleanup-pending`,reason:`manual-recovery-required`,message:`App-log process marker path is missing`};let n=await O(e,t);if(n.status===`missing`)return{status:`already-missing`};if(n.status===`invalid`)return{status:`cleanup-pending`,reason:`manual-recovery-required`,message:n.message};let r=await e.processes.inspect(n.marker);if(r===`ownership-lost`)return k();if(r===`missing`)return await e.processes.clearMarker(t),{status:`already-missing`};let i=await e.processes.terminate(n.marker);return i===`ownership-lost`?k():(await e.processes.clearMarker(t),{status:i===`terminated`?`cleaned`:`already-missing`})}async function O(e,t){return t?await e.processes.readMarker(t):{status:`invalid`,message:`App-log process marker path is missing`}}function k(){return{status:`cleanup-pending`,reason:`ownership-fence-lost`}}async function fe(e){let t=e.initialProcess;for(;!e.stopped();){if(t){await pe(e,t),t=void 0,await be(e);continue}let n=await xe(e);if(n.status===`stopped`)return;n.status!==`waiting`&&(t=n.process)}}async function pe(e,t){let{process:n}=t;e.setActive(n);try{e.setState(`active`),await me(e,t)}finally{await A(e,n)}}async function me(e,t){let n=he(t.process);try{await ge(e,t,n),await ve(e,t.process,n),await ye(n.outcome)}finally{n.controller.abort()}}function he(e){let t=new AbortController,n=!1,r=()=>{n=!0,t.abort()};return{controller:t,outcome:e.wait.then(()=>(r(),{status:`exited`}),e=>(r(),{status:`failed`,error:e})),settled:()=>n}}async function ge(e,t,n){for(;!e.stopped()&&!n.settled();){if(!await _e(e,n))return;let r=await e.resolvePid();if(e.stopped())return;if(r!==t.pid){await t.process.terminate();return}}}async function _e(e,t){try{await e.sleep(500,t.controller.signal)}catch(e){if(!t.settled())throw e}return!t.settled()}async function ve(e,t,n){e.stopped()&&!n.settled()&&await t.terminate()}async function ye(e){let t=await e;if(t.status===`failed`)throw t.error}async function be(e){e.stopped()||(e.setState(`recovering`),await e.sleep(500))}async function xe(e){let t=await e.resolvePid();if(e.stopped())return{status:`stopped`};if(!t)return e.setState(`recovering`),await e.sleep(1e3),{status:`waiting`};let n=await e.startProcess(t);return e.setActive(n),e.stopped()?(await Se(e,n),{status:`stopped`}):{status:`started`,process:{pid:t,process:n}}}async function Se(e,t){try{await t.terminate(),await t.wait}finally{await A(e,t)}}async function A(e,t){try{await t[Symbol.asyncDispose]()}finally{e.setActive(void 0)}}async function Ce(e){let t=await e.resolvePid(e.setupSignal);e.setupSignal.throwIfAborted();let n=await e.host.outputs.openAppend(e.outputPath),r=`recovering`,i=!1,a;try{if(e.setupSignal.throwIfAborted(),t){e.setupSignal.throwIfAborted();let i=new AbortController,o=()=>i.abort(e.setupSignal.reason);e.setupSignal.addEventListener(`abort`,o,{once:!0});try{a=await e.processStart({command:e.command(t),output:n,markerPath:e.pidPath},i.signal)}finally{e.setupSignal.removeEventListener(`abort`,o)}e.setupSignal.throwIfAborted(),r=`active`}}catch(e){throw await j([async()=>await a?.terminate(),async()=>{await a?.wait},async()=>await a?.[Symbol.asyncDispose](),async()=>await n[Symbol.asyncDispose]()]),e}let o=fe({initialProcess:a&&t?{pid:t,process:a}:void 0,stopped:()=>i,setActive:e=>{a=e},setState:e=>{r=e},resolvePid:async()=>await e.resolvePid(),startProcess:async t=>await e.processStart({command:e.command(t),output:n,markerPath:e.pidPath}),sleep:async(t,n)=>await e.host.clock.sleep(t,n)}).catch(()=>{r=`failed`}),s,c=async()=>s??=we({options:e,monitor:o,active:()=>a,stop:()=>{i=!0},setState:e=>{r=e},output:n}),l=e.host.clock.now();return v({inspect:()=>({backend:e.backend,state:r,startedAt:l}),finish:c})}async function we(e){return e.stop(),(await j([async()=>await e.active()?.terminate(),async()=>await e.monitor,async()=>await e.output[Symbol.asyncDispose]()])).length>0?(e.setState(`failed`),{status:`cleanup-pending`,reason:`transport-failed`,message:e.options.cleanupFailureMessage}):(e.setState(`ended`),{status:`completed`,result:{backend:e.options.backend,outputPath:e.options.outputPath,completedAt:e.options.host.clock.now()}})}async function j(e){let t=[];for(let n of e)try{await n()}catch(e){t.push(e)}return t}function M(e,t,n){let r=e.artifacts.resolveSession(t);return n.outputPath===r.outputPath&&(n.pidPath===void 0||n.pidPath===r.pidPath)}function N(t,n){if(!M(t,n.sessionId,n))throw new e(`INVALID_ARGS`,`App-log paths do not match the owning session`)}const P=Object.freeze({available:!0});async function Te(e,t,n){let r=(await e.commands.run(t,n)).stdout.trim().split(/\s+/)[0]??``;return/^\d+$/.test(r)?r:``}function Ee(t,i){let a=n(i.family);return Object.freeze({owner:a,ownsDevice:e=>e.platform===i.family,inspectFacts:async e=>F(e,await t.processTransports.resolve(e),i),bind:async n=>{if(n.intent.kind===`exact-owner`&&!r(n.intent.owner,a))throw new e(`UNSUPPORTED_OPERATION`,`${i.label} app-log owner identity does not match`);if(n.device.platform!==i.family)throw new e(`UNSUPPORTED_PLATFORM`,`${i.label} app-log owner cannot bind ${n.device.platform}`);let o=await t.processTransports.resolve(n.device);return De(t,n.device,n.scope.signal,o,a,i)},shutdown:async()=>void 0})}function De(e,t,n,r,i,a){let o=m({codec:a.codec,reattach:async(t,n)=>M(e,n.sessionId,t)?await E(e,t.pidPath):{status:`unreattachable`,reason:`descriptor-invalid`,message:`${a.label} app-log descriptor paths do not match the owning session`},cleanup:async(t,n)=>M(e,n.sessionId,t)?await D(e,t.pidPath):{status:`cleanup-pending`,reason:`ownership-fence-lost`,message:`${a.label} app-log descriptor paths do not match the owning session`}}),s=Object.freeze({appLogInspect:async()=>({backend:a.backend}),appLogDoctor:async({appBundleId:r})=>await a.doctor({host:e,device:t,signal:n},r),...r.start?{appLogStart:async o=>await Oe(e,t,n,r,i,o,a)}:{},...o});return Object.freeze({device:t,owner:i,facts:F(t,r,a),operations:s,[Symbol.asyncDispose]:async()=>void 0})}function F(e,t,n){let r=t.start?P:{available:!1,reason:`owner-capability-missing`,hint:n.startUnavailableHint};return Object.freeze({device:{family:n.family,kind:e.kind,...e.target===void 0?{}:{target:e.target},providerMode:t.mode},operations:{appLogInspect:P,appLogDoctor:P,appLogStart:r,appLogReattach:P,appLogCleanup:P}})}async function Oe(t,n,r,i,a,o,s){if(!i.start)throw new e(`UNSUPPORTED_OPERATION`,s.startUnavailableHint);N(t,o);let c=t.artifacts.resolveSession(o.sessionId),l={host:t,device:n,signal:r,input:o,artifacts:c,transport:i};s.validateStart?.(l),r.throwIfAborted();let u=await s.process(l);r.throwIfAborted();let d=await Ce({host:t,backend:s.backend,outputPath:c.outputPath,pidPath:c.pidPath,processStart:i.start,setupSignal:r,resolvePid:u.resolvePid,command:u.command,cleanupFailureMessage:s.cleanupFailureMessage}),f=s.descriptor({artifacts:c,transport:i});return p(d,s.envelope({input:o,device:n,owner:a,descriptor:f}))}function I(e){for(let t of[/\bstatus(?:Code)?["'=: ]+([1-5]\d{2})\b/i,/\bresponse(?:\s+code)?["'=: ]+([1-5]\d{2})\b/i,/\bHTTP\/[0-9.]+\s+([1-5]\d{2})\b/i]){let n=t.exec(e);if(!n)continue;let r=Number.parseInt(n[1]??``,10);if(Number.isInteger(r))return r}return null}function L(e){return/\b\d{4}-\d{2}-\d{2}[ T]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z)?\b/.exec(e)?.[0]??/\b\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d+\b/.exec(e)?.[0]}function ke(e){let t=e.indexOf(`{`),n=e.lastIndexOf(`}`);if(t<0||n<=t)return null;try{let r=JSON.parse(e.slice(t,n+1));return r&&typeof r==`object`&&!Array.isArray(r)?r:null}catch{return null}}function R(e,t){for(let n of t){let t=e?.[n];if(typeof t==`string`&&t.trim())return t.trim()}}function Ae(e,t){for(let n of t){let t=e?.[n];if(typeof t==`number`&&Number.isInteger(t))return t;if(typeof t==`string`&&/^\d{3}$/.test(t.trim()))return Number.parseInt(t,10)}return null}function je(e,t){let n=t?.headers??t?.requestHeaders??t?.responseHeaders;return n===void 0?/\bheaders?["'=: ]+(\{.*\})/i.exec(e)?.[1]?.trim():B(n)}function z(e,t,n){for(let r of n){if(t?.[r]!==void 0)return B(t[r]);let n=r.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`),i=RegExp(`\\b${n}["'=: ]+(.+)$`,`i`).exec(e);if(i?.[1])return i[1].trim()}}function B(e){if(typeof e==`string`)return e;try{return JSON.stringify(e)}catch{return String(e)}}function Me(e,t,n){let r=U(t,n,5),i=e.packetId??r.map(V).find(e=>typeof e==`string`&&e.length>0);i&&(e.packetId=i);let a=i?U(t,n,12).filter(e=>V(e)===i):r;e.timestamp??=a.map(L).find(e=>typeof e==`string`&&e.length>0),e.status??=a.map(I).find(e=>typeof e==`number`)??void 0,e.durationMs??=a.map(H).find(e=>typeof e==`number`)??void 0}function V(e){return/\bpacket id (\d+)\b/i.exec(e)?.[1]??null}function H(e){let t=/\b(?:duration|elapsed request\/response time, ms)[:= ]+(\d+)\b/i.exec(e);return t?Number.parseInt(t[1]??``,10):null}function U(e,t,n){return e.slice(Math.max(0,t-n),Math.min(e.length,t+n+1)).map(e=>e.trim()).filter(Boolean)}const Ne=RegExp(`\\b(${[`GET`,`POST`,`PUT`,`PATCH`,`DELETE`,`HEAD`,`OPTIONS`].join(`|`)})\\b\\s+https?:\\/\\/`,`i`),Pe=/https?:\/\/[^\s"'<>\])]+/i,Fe=/\[C(\d+)\b[^\]]*?\burl:\s*([^\s,\]]+)/,W=/\bsummary for task (?:success|failure)\s*\{([^}]*)\}/,Ie=/\bTask\s+<([0-9A-Fa-f-]+)>\.<(\d+)>/,G=/(?:^|\s)(\S+)\[(\d+):[0-9a-f]+\]/,Le=/\burl:\s*(https?:\/\/[^\s,\]]+)/i;function Re(e,t,n=e.dump.limits.maxEntries){let r=[...e.dump.entries],i=new Set(r.map(K));for(let e of t.dump.entries){let t=K(e);if(!i.has(t)&&(i.add(t),r.push(e),r.length>=n))break}let a=new Set([...e.dump.entries,...t.dump.entries].map(e=>e.packetId).filter(e=>e!==void 0)),o=[...new Set([...e.unnamedRequestIds,...t.unnamedRequestIds])].filter(e=>!a.has(e));return Object.freeze({dump:Object.freeze({...e.dump,matchedLines:r.length,entries:Object.freeze(r),unnamedRequests:o.length}),unnamedRequestIds:Object.freeze(o)})}function ze(e,t){let n=J(t.maxEntries,25,1,200),r=t.include??`summary`,i=J(t.maxPayloadChars,2048,64,16384),a=J(t.maxScanLines,4e3,100,2e4),o=Ve(t.lineNumberOffset);if(!t.exists)return Object.freeze({dump:Object.freeze({path:t.path,exists:!1,scannedLines:0,matchedLines:0,entries:Object.freeze([]),unnamedRequests:0,include:r,limits:Object.freeze({maxEntries:n,maxPayloadChars:i,maxScanLines:a})}),unnamedRequestIds:Object.freeze([])});let s=e.split(`
|
|
2
2
|
`),c=Math.max(0,s.length-a),l=s.slice(c),u=[],d=Be(t.backend)?Qe(l):void 0,f=d?et(l,d):[];for(let e=l.length-1;e>=0&&u.length<n;--e){if(!l[e]?.trim())continue;let n=He(l,e,o+c+e+1,t.backend,r,i,d);n&&u.push(n)}return Object.freeze({dump:Object.freeze({path:t.path,exists:!0,scannedLines:l.length,matchedLines:u.length,entries:Object.freeze(u),unnamedRequests:f.length,include:r,limits:Object.freeze({maxEntries:n,maxPayloadChars:i,maxScanLines:a})}),unnamedRequestIds:Object.freeze(f)})}function Be(e){return e===`ios-simulator`||e===`ios-device`||e===`macos`}function Ve(e){if(e===void 0)return 0;if(!Number.isInteger(e)||e<0)throw TypeError(`Network line number offset must be a non-negative integer`);return e}function He(e,t,n,r,i,a,o){let s=e[t]?.trim();if(!s)return null;let c=ke(s),l=Ue(s,c)??(o?$e(s,o,t):null);if(!l)return null;let u=Je(s,n,l,a);return r===`android`&&Me(u,e,t),Ye(u,s,c,i,a),u}function Ue(e,t){let n=We(e,t),r=Ge(e,t);if(!r)return null;let i=Ke(e,t);return qe(e,n.explicit,i)?{method:n.value,url:r,status:i}:null}function We(e,t){let n=R(t,[`method`,`httpMethod`]),r=/\bmethod["'=: ]+([A-Z]+)\b/i.exec(e)?.[1],i=Ne.exec(e)?.[1],a=n??r??i;return{value:a?.toUpperCase(),explicit:!!a}}function Ge(e,t){return R(t,[`url`,`requestUrl`])||(Le.exec(e)?.[1]??Pe.exec(e)?.[0])}function Ke(e,t){return Ae(t,[`status`,`statusCode`,`responseCode`])??I(e)??void 0}function qe(e,t,n){return t||n!==void 0||/\bURL["'=: ]+https?:\/\//i.test(e)||/\bheaders?["'=: ]+/i.test(e)||/\b(?:requestBody|responseBody|payload|request|response)["'=: ]+/i.test(e)}function Je(e,t,n,r){return{...n,timestamp:L(e),packetId:n.packetId??V(e)??void 0,durationMs:n.durationMs??H(e)??void 0,raw:q(e,r),line:t}}function Ye(e,t,n,r,i){if(Xe(r)){let r=je(t,n);r&&(e.headers=q(r,i))}if(Ze(r)){let r=z(t,n,[`requestBody`,`body`,`payload`,`request`]),a=z(t,n,[`responseBody`,`response`]);r&&(e.requestBody=q(r,i)),a&&(e.responseBody=q(a,i))}}function Xe(e){return e===`headers`||e===`all`}function Ze(e){return e===`body`||e===`all`}function K(e){return`${e.timestamp??``}|${e.method??``}|${e.url}|${e.status??``}|${e.raw}`}function q(e,t){return e.length<=t?e:`${e.slice(0,t)}...<truncated>`}function J(e,t,n,r){return e===void 0||!Number.isInteger(e)?t:Math.max(n,Math.min(r,e))}function Qe(e){let t=new Map;for(let[n,r]of e.entries()){let e=Fe.exec(r);if(!e)continue;let i=Y(r,e[1]),a=i===void 0?void 0:nt(e[2]);if(!a||i===void 0)continue;let o=t.get(i);o?o.push({lineIndex:n,origin:a}):t.set(i,[{lineIndex:n,origin:a}])}return t}function Y(e,t){let n=G.exec(e);if(n)return`${n[1]}[${n[2]}]#${t}`}function $e(e,t,n){let r=W.exec(e);if(!r)return null;let i=Q(r[1]);if(i.get(`reused`)!==`1`)return null;let a=i.get(`connection`),o=a===void 0?void 0:Y(e,a),s=o===void 0?void 0:Z(t,o,n);return s?{url:s,status:rt(i.get(`response_status`)),durationMs:$(i.get(`transaction_duration_ms`)),pathUnavailable:!0,packetId:X(e)}:null}function et(e,t){let n=new Set;for(let[r,i]of e.entries()){let e=tt(i,t,r);e!==void 0&&n.add(e)}return[...n]}function tt(e,t,n){if(!e.includes(`summary for task`))return;let r=W.exec(e);if(!r)return;let i=Q(r[1]);if(i.get(`reused`)!==`1`)return;let a=i.get(`connection`),o=a===void 0?void 0:Y(e,a);if(!(o!==void 0&&Z(t,o,n)))return X(e)}function X(e){let t=Ie.exec(e);if(!t)return;let n=G.exec(e);return`${n?`${n[1]}[${n[2]}]`:``}#${t[1]}.${t[2]}`}function Z(e,t,n){let r=e.get(t);if(!r)return;let i;for(let e of r){if(e.lineIndex>n)break;i=e.origin}return i}function Q(e){let t=new Map;for(let n of e.split(`,`)){let e=n.indexOf(`=`);e!==-1&&t.set(n.slice(0,e).trim(),n.slice(e+1).trim())}return t}function nt(e){try{return new URL(e).origin}catch{return}}function rt(e){let t=$(e);return t!==void 0&&t>0?t:void 0}function $(e){if(e===void 0)return;let t=Number(e);return Number.isFinite(t)?t:void 0}export{M as a,E as c,m as d,p as f,Te as i,le as l,f as m,ze as n,N as o,g as p,Ee as r,D as s,Re as t,v as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{N as e}from"./sdk-contracts.js";import{
|
|
1
|
+
import{N as e}from"./sdk-contracts.js";import{Hn as t,Jn as n,Qn as r,Xn as i,ar as a,qn as o,rr as s}from"./sdk-batch.js";import{F as c,N as l,P as u,T as d,k as f,n as p}from"./runtime.js";import{i as m}from"./rect-center.js";import{n as h}from"./ios-system-surface.js";import{s as g}from"./tree.js";import{t as _}from"./ios-target-activation.js";function v(e){return e.matchedRefs.length===0?{path:2,outcome:`unverifiable`,reason:`selector-miss`}:e.identitySetRefs.length===0?{path:3,outcome:`unverifiable`,reason:`identity-set-empty`}:e.identitySetRefs.length===1?e.identitySetRefs[0]===e.winnerRef?{path:4,outcome:`verified`}:{path:5,outcome:`unverifiable`,reason:`unique-but-wrong`}:e.siblingMatchRefs.length===1?e.siblingMatchRefs[0]===e.winnerRef?{path:6,outcome:`verified`}:{path:6,outcome:`unverifiable`,reason:`signal-isolated-wrong`}:e.regionMemberRefs!==void 0&&e.regionMemberRefs.length>0&&e.viewportCandidateRef!==void 0?e.viewportCandidateRef===e.winnerRef?{path:6,outcome:`verified`}:{path:6,outcome:`unverifiable`,reason:`signal-isolated-wrong`}:{path:6,outcome:`unverifiable`,reason:`no-signal-isolation`}}function y(t,n={}){let r=n.plural===!0?`do`:`does`;return{resolveInput:async()=>{throw new e(`UNSUPPORTED_OPERATION`,`${t} ${r} not resolve input artifacts`)},reserveOutput:async()=>{throw new e(`UNSUPPORTED_OPERATION`,`${t} ${r} not reserve output artifacts`)},createTempFile:async()=>{throw new e(`UNSUPPORTED_OPERATION`,`${t} ${r} not create temporary files`)}}}function b(e,t={}){return{artifacts:y(e,t),policy:d()}}function x(e,t){return e===void 0?t:(e.targetActivation??=t.targetActivation,e.postGestureOutcome??=t.postGestureOutcome,t)}function S(e,t){let n=t?.iosSystemSurfaceBundleId?h(t.iosSystemSurfaceBundleId):p(t);return n?E(e,n,`warning`):e}function C(e,t,n,r){if(!n)return e;let i=E(e,r(n),`warnings`);return i.ok?{...i,data:{...i.data,[t]:n}}:{...i,error:{...i.error,details:{...i.error.details,[t]:n}}}}function w(e,t){return C(e,`targetActivation`,t?.targetActivation,_)}function T(e){let{response:t,consumedTree:n,captureProof:r}=e;return w(C(S(t,n),`postGestureOutcome`,n?.postGestureOutcome,f),r)}function E(e,t,n){if(D(e,t))return e;if(!e.ok){let n=e.error.hint??e.error.details?.hint;return{...e,error:{...e.error,hint:O(n,t)}}}return n===`warnings`?{...e,data:{...e.data,warnings:[...k(e.data?.warnings),t]}}:{...e,data:{...e.data,warning:O(e.data?.warning,t)}}}function D(e,t){return(e.ok?[e.data?.warning,...k(e.data?.warnings)]:[e.error.hint]).some(e=>typeof e==`string`&&e.includes(t))}function O(e,t){return typeof e==`string`&&e.trim()!==``?`${e}\n${t}`:t}function k(e){return Array.isArray(e)?e.filter(e=>e!==void 0):[]}function A(e,n={}){let r=n.mode??`action`,{node:i,preActionNodes:a}=e;if(typeof i.index!=`number`)return;let o=u(a),s=t(P(i),a);if(r===`landmark`&&s.id===void 0&&s.label===void 0)return;let c=l(i,o,8),d=c.chain,f=F(a,i),p=I(i,o),m=R(i),h=+(d.length>0),g=e=>{let t=d.slice(0,e),n=z({nodes:a,byIndex:o,node:i,identity:s,ancestry:t,sibling:f,scrollRegion:p});return{candidate:{...s,ancestry:t,sibling:f,viewportOrder:n.viewportOrder,...p?{scrollRegion:p}:{},...m?{rect:m}:{},verification:`verified`},domain:n}};for(let e=d.length;e>=h;--e){let{candidate:t,domain:n}=g(e);if(M(t))return t.verification=j({node:i,domain:n,mode:r,brokenWalk:c.broken}),t;if(e===h)return N(t)}}function j(e){return e.brokenWalk?`unverifiable`:e.mode===`landmark`?`verified`:V({node:e.node,domain:e.domain})}function M(e){return a(s({...e,verification:`unverifiable`}))<=r}function N(e){return e.verification=`unverifiable`,a(s(e))>4096&&delete e.rect,e}const P=n;function F(e,t){return i(e,t)}function I(e,t){let n=g(e,t);if(!n)return;let r=P(n);return{role:r.role,...r.id===void 0?r.label===void 0?{}:{label:r.label}:{id:r.id}}}function L(e,t){return!e&&!t?!0:!e||!t?!1:o(e,t)}function R(e){let t=e.rect;if(t)return{x:t.x,y:t.y,width:t.width,height:t.height}}function z(e){let{nodes:t,byIndex:n,node:r,identity:i,ancestry:a,sibling:o,scrollRegion:s}=e,l=c(t,n,i,a),u=l.filter(e=>F(t,e)===o),d=l.length>0?l.filter(e=>L(I(e,n),s)):void 0,f=d?B(d):[];return{identitySet:l,siblingMatches:u,regionMembers:d,orderedRegion:f,viewportOrder:Math.max(f.findIndex(e=>e.index===r.index),0)}}function B(e){return e.map((e,t)=>({node:e,documentOrder:t,center:m(e.rect)})).sort((e,t)=>!e.center&&!t.center?e.documentOrder-t.documentOrder:e.center?t.center?e.center.y===t.center.y?e.center.x===t.center.x?e.documentOrder-t.documentOrder:e.center.x-t.center.x:e.center.y-t.center.y:-1:1).map(e=>e.node)}function V(e){let{node:t,domain:n}=e,r=t.ref,i=n.identitySet.map(e=>e.ref);return v({winnerRef:r,matchedRefs:i,identitySetRefs:i,siblingMatchRefs:n.siblingMatches.map(e=>e.ref),regionMemberRefs:n.regionMembers?.map(e=>e.ref),viewportCandidateRef:n.orderedRegion[n.viewportOrder]?.ref}).outcome}export{B as a,T as c,v as d,A as i,w as l,I as n,L as o,F as r,x as s,P as t,b as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{N as e}from"./sdk-contracts.js";import{
|
|
1
|
+
import{N as e}from"./sdk-contracts.js";import{Qr as t,Yr as n,qr as r}from"./sdk-batch.js";import{n as i,r as a}from"./snapshot.js";function o(t,n,r,i){return new e(`COMMAND_FAILED`,`fill tapped (${t}, ${n}) but ${r}`,{reason:`text_entry_focus_not_observed`,x:t,y:n,...i,hint:`The tap most likely missed the field. Re-check the target with snapshot -i and fill the element it reports, rather than retrying the same coordinates.`})}function s(e){let t=[];for(let r of p(e)){let e=a(r);n(e)&&t.push({node:r,identity:m(r),rect:e})}return t}function c(e){let t=new Map;for(let n of e)t.set(n.identity,(t.get(n.identity)??0)+1);return t}function l(e){let n=s(e),r=c(n),i=null,a=1/0;for(let e of n){if(!e.node.traits?.includes(`IsEditing`))continue;let n=t(e.rect);n>=a||(i=r.get(e.identity)===1?{identity:e.identity,rect:e.rect}:{rect:e.rect},a=n)}return i}function u(e,t,n){let i=s(e),a=c(i),o=new Set;for(let e of i)a.get(e.identity)===1&&r(e.rect,t,n)&&o.add(e.identity);return o}async function d(e){let t=Date.now()+(e.timeoutMs??3e3),n=0,r=!1;for(;;){let i=await e.readFocus();if(n+=1,i&&(r=!0,f(i,e.targetsAtPoint,e.x,e.y)))return`focused-element`;if(Date.now()>=t)break;await e.sleep(150)}throw o(e.x,e.y,`nothing there took text-entry focus, so the text was not sent`,{samples:n,editingElementObserved:r})}function f(e,t,n,i){return r(e.rect,n,i)?!0:e.identity!==void 0&&t.has(e.identity)}function p(e){let t=[],n=e=>{t.push(e);for(let t of i(e))n(t)};for(let t of Array.isArray(e)?e:[e])n(t);return t}function m(e){return[e.pid??``,e.type??e.elementType??``,e.AXUniqueId??e.identifier??``,e.AXLabel??e.label??``].join(`\0`)}export{d as awaitLimrunTextEntryFocus,l as readLimrunTextEntryFocus,u as readLimrunUnambiguousTapTargets};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{N as e}from"./sdk-contracts.js";import{n
|
|
1
|
+
import{N as e,z as t}from"./sdk-contracts.js";import{n,r}from"./interactor-operation-binding.js";function i(e){let t=t=>t??e.unsupported;return Object.freeze({tapPoint:e.tap,tapRef:t(e.tapRef),longPressPoint:e.longPress,hoverPoint:a(t(e.hover)),hoverRef:a(t(e.hoverRef)),fillPoint:e.fill,fillRef:t(e.fillRef),tapElementSelector:t(e.tapElementSelector)})}function a(e){return e.available?e:Object.freeze({...e,hint:e.hint??`hover raises pointer hover state and is available on web targets only. On touch platforms use longpress for hold gestures.`})}function o(e,t){return{...e.execution,appBundleId:e.appBundleId,signal:t}}function s(t,n,r,i){let a=async e=>(t.throwIfAborted(),await n(o(e,t))),s=async e=>{t.throwIfAborted(),l(e.options,r.longPressPoint);let n=await a(e);return e.options.button!==`primary`&&n.alternateClick?await n.alternateClick(e.point,e.options.button):n.pressPoint?await n.pressPoint(e.point,e.options):await d(n,e.point,e.options,i)},u=async t=>{let n=await a(t);if(!n.hover)throw new e(`UNSUPPORTED_OPERATION`,`Bound runtime advertised hover without an interactor.`);return await n.hover(t.point.x,t.point.y)},f=async e=>await(await a(e)).fill(e.point.x,e.point.y,e.text,e.delayMs,{allowNonHittableCoordinateFallback:e.allowNonHittableCoordinateFallback});return Object.freeze({...r.tapPoint.available?{tapPoint:s}:{},...r.tapRef.available?{tapRef:async e=>{let t=await a(e);return t.tapRef?await t.tapRef(e.ref):c(`tapRef`)}}:{},...r.longPressPoint.available?{longPressPoint:async e=>await(await a(e)).longPress(e.point.x,e.point.y,e.durationMs)}:{},...r.hoverPoint.available?{hoverPoint:u}:{},...r.hoverRef.available?{hoverRef:async e=>{let t=await a(e);return t.hoverRef?await t.hoverRef(e.ref):c(`hoverRef`)}}:{},...r.fillPoint.available?{fillPoint:f}:{},...r.fillRef.available?{fillRef:async e=>{let t=await a(e);return t.fillRef?await t.fillRef(e.ref,e.text,e.delayMs):c(`fillRef`)}}:{},...r.tapElementSelector.available?{tapElementSelector:async e=>{let t=await a(e);return t.tapElementSelector?await t.tapElementSelector(e.selector):c(`tapElementSelector`)}}:{}})}function c(t){throw new e(`UNSUPPORTED_OPERATION`,`Bound runtime advertised ${t} without an interactor.`)}function l(t,n){if(!(t.holdMs<=0||n.available))throw new e(`UNSUPPORTED_OPERATION`,`press-and-hold is not supported by this runtime.`,{reason:n.reason,...n.hint===void 0?{}:{hint:n.hint}})}function u(t){if(t.doubleTap)return t.doubleTap;throw new e(`UNSUPPORTED_OPERATION`,`double-tap is not supported by this runtime.`,{reason:`owner-capability-missing`,hint:`This runtime drives single presses; use --count to repeat them.`})}async function d(n,r,i,a){if(i.button!==`primary`)throw new e(`UNSUPPORTED_OPERATION`,`Bound runtime does not implement ${i.button} click.`);let o=i.doubleTap?u(n):void 0,s,c=0;try{for(let e=0;e<i.count;e+=1){let[t,l]=m(e,i.jitterPx),u=await f(n,o,r.x+t,r.y+l,i);c+=1,s??=u,e<i.count-1&&i.intervalMs>0&&await a(i.intervalMs)}}catch(e){throw t(e,c)}return s}async function f(e,t,n,r,i){return t?await t.call(e,n,r):i.holdMs>0?await e.longPress(n,r,i.holdMs):await e.tap(n,r)}const p=[[0,0],[1,0],[0,1],[-1,0],[0,-1],[1,1],[-1,1],[1,-1],[-1,-1]];function m(e,t){if(t<=0)return[0,0];let[n,r]=p[e%p.length];return[n*t,r*t]}function h(e){return s(e.signal,n(e),e.facts,e.pause)}function g(e){return s(e.signal,r({...e,operation:`touch`}),e.facts,e.pause)}export{i,g as n,m as r,h as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{N as e}from"./sdk-contracts.js";import{Et as t,Gt as n,St as r,Vt as i,dt as a,ft as o,gt as s,lt as c,ut as l}from"./sdk-batch.js";import{O as u}from"./runtime.js";import{r as d}from"./success-text.js";import{i as f}from"./click-button.js";import{f as p}from"./session-snapshot.js";import{t as m}from"./runtime-admission.js";import{t as h}from"./interactor-types.js";function g(e){let t=e?e.textEntryReadiness:void 0,n=x(t)?{textEntryReadiness:t}:{},r=_(e);return r?{...n,...r}:n}function _(e){if(!v(e))return null;let t=y(e.target);return t?{verification:`unconfirmed`,requested:e.requested,before:e.before,after:e.after,target:t}:null}function v(e){return!!(e&&e.verification===`unconfirmed`&&typeof e.requested==`string`&&S(e.before)&&S(e.after))}function y(e){if(!w(e)||!b(e))return null;let t=C(e.rect);return t?{resourceId:e.resourceId,className:e.className,packageName:e.packageName,rect:t}:null}function b(e){return S(e.resourceId)&&S(e.className)&&S(e.packageName)}function x(e){return typeof e==`string`&&h.includes(e)}function S(e){return e===null||typeof e==`string`}function C(e){return!w(e)||![e.x,e.y,e.width,e.height].every(e=>typeof e==`number`)?null:e}function w(e){return!!e&&typeof e==`object`}async function T(e){let u={device:e.device,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice},d=i(e.command,e.requiresCapture),f=await m({command:e.command,required:d.use.required,...e.unavailableResponse?{unavailableResponse:e.unavailableResponse}:{},...u});if(f.type===`response`)return{ok:!1,response:f.response};let p=f.bind;switch(d.kind){case`tap-point`:return{ok:!0,runtime:{kind:`tap`,captured:!1,runtime:await p(e.device,n)}};case`captured-tap`:return{ok:!0,runtime:{kind:`tap`,captured:!0,runtime:await p(e.device,o)}};case`long-press-point`:return{ok:!0,runtime:{kind:`long-press`,captured:!1,runtime:await p(e.device,t)}};case`captured-long-press`:return{ok:!0,runtime:{kind:`long-press`,captured:!0,runtime:await p(e.device,a)}};case`hover-point`:return{ok:!0,runtime:{kind:`hover`,captured:!1,runtime:await p(e.device,r)}};case`captured-hover`:return{ok:!0,runtime:{kind:`hover`,captured:!0,runtime:await p(e.device,l)}};case`fill-point`:return{ok:!0,runtime:{kind:`fill`,captured:!1,runtime:await p(e.device,s)}};case`captured-fill`:return{ok:!0,runtime:{kind:`fill`,captured:!0,runtime:await p(e.device,c)}}}}function E(e,t){let n={execution:p(t),appBundleId:t.appBundleId},r=e.captured?M(e.runtime):void 0;switch(e.kind){case`tap`:return D(e,t,n,r);case`long-press`:return O(e,n,r);case`hover`:return k(e,n,r);case`fill`:return A(e,t,n,r)}}function D(e,t,n,r){let i=e.captured?e.runtime.operations.tapRef:void 0,a=e.captured?e.runtime.operations.tapElementSelector:void 0;return Object.freeze({captureSnapshot:r,tapPoint:async(r,i={})=>{let a=N(i,t),o=await e.runtime.operations.tapPoint({point:r,options:a,...n});return{x:r.x,y:r.y,count:a.count,intervalMs:a.intervalMs,holdMs:a.holdMs,jitterPx:a.jitterPx,doubleTap:a.doubleTap,...a.button===`primary`?{}:{button:a.button},...o??{},...d(L(r,a.button))}},tapRef:i?async e=>await i({ref:e,...n}):void 0,tapElementSelector:e.captured&&a?async t=>{let r=await e.runtime.operations.tapElementSelector?.({selector:t,...n}),i=r?.maestroNonHittableCoordinateFallbackUsed===!0;return{selector:t.raw,...r??{},...d(i?`tapped via non-hittable coordinate fallback`:`Tapped ${t.raw}`)}}:void 0})}function O(e,t,n){return Object.freeze({captureSnapshot:n,longPressPoint:async(n,r)=>{let i=await e.runtime.operations.longPressPoint({point:n,durationMs:r,...t});return{x:n.x,y:n.y,durationMs:r,...i??{},...d(`Long pressed (${n.x}, ${n.y})`)}}})}function k(e,t,n){let r=e.captured?e.runtime.operations.hoverRef:void 0;return Object.freeze({captureSnapshot:n,hoverPoint:async n=>{let r=await e.runtime.operations.hoverPoint({point:n,...t});return{x:n.x,y:n.y,...r??{},...d(`Hovered (${n.x}, ${n.y})`)}},hoverRef:r?async e=>await r({ref:e,...t}):void 0})}function A(e,t,n,r){let i=e.captured?e.runtime.operations.fillRef:void 0,a=e=>u(e??t.delayMs??0,`delay-ms`,0,1e4);return Object.freeze({captureSnapshot:r,fillPoint:async(t,r,i={})=>{let o=a(i.delayMs),s=await e.runtime.operations.fillPoint({point:t,text:r,delayMs:o,allowNonHittableCoordinateFallback:i.allowNonHittableCoordinateFallback===!0,...n});return{x:t.x,y:t.y,text:r,delayMs:o,...j(s)?{maestroNonHittableCoordinateFallbackUsed:!0}:{},...g(s),...d(`Filled ${Array.from(r).length} chars`)}},fillRef:i?async(e,t,r={})=>await i({ref:e,text:t,delayMs:a(r.delayMs),...n}):void 0})}function j(e){return typeof e==`object`&&!!e&&`maestroNonHittableCoordinateFallbackUsed`in e&&e.maestroNonHittableCoordinateFallbackUsed===!0}function M(e){return async t=>await e.operations.captureSnapshot(t)}function N(e,t){let n=P(e,t);return I(n),{button:e.button??f(t),...n,surface:e.surface??t.surface}}function P(e,t){return{count:F(e.count,t.count,1,`count`,1,200),intervalMs:F(e.intervalMs,t.intervalMs,0,`interval-ms`,0,1e4),holdMs:F(e.holdMs,t.holdMs,0,`hold-ms`,0,1e4),jitterPx:F(e.jitterPx,t.jitterPx,0,`jitter-px`,0,100),doubleTap:e.doubleTap??t.doubleTap??!1}}function F(e,t,n,r,i,a){return u(e??t??n,r,i,a)}function I(t){if(t.doubleTap&&t.holdMs>0)throw new e(`INVALID_ARGS`,`double-tap cannot be combined with hold-ms`);if(t.doubleTap&&t.jitterPx>0)throw new e(`INVALID_ARGS`,`double-tap cannot be combined with jitter-px`)}function L(e,t){return t===`primary`?`Pressed (${e.x}, ${e.y})`:`${t===`secondary`?`Right`:`Middle`} clicked (${e.x}, ${e.y})`}export{T as n,E as t};
|
package/dist/src/tree.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{Lr as e}from"./sdk-batch.js";import"./rect-center.js";function t(e){let t=new Map;for(let n of e){if(typeof n.parentIndex!=`number`)continue;let e=t.get(n.parentIndex)??[];e.push(n),t.set(n.parentIndex,e)}return t}function n(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}const r=new WeakMap;function i(e,t){if(!e[t])return[];let n=s(e)[t]??t+1;return e.slice(t+1,n)}function a(e,t,n){let r=s(e)[t]??t+1;for(let i=t+1;i<r;i+=1){let t=e[i];if(t&&n(t))return t}}function o(e,t,n){let r=s(e)[t]??t+1;for(let i=t+1;i<r;i+=1){let t=e[i];t&&n(t)}}function s(e){let t=r.get(e);if(t)return t;let n=Array(e.length),i=[];for(let[t,r]of e.entries()){let e=r?.depth??0;for(;i.length>0&&e<=i.at(-1).depth;){let e=i.pop();n[e.position]=t}i.push({depth:e,position:t})}for(let t of i)n[t.position]=e.length;return r.set(e,n),n}function c(e,t){let n=[],r=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0,i=new Set;for(;r&&!i.has(r.index);)i.add(r.index),n.push(r),r=typeof r.parentIndex==`number`?t.get(r.parentIndex):void 0;return n}function l(e,t,n){for(let r of c(e,t))if(n(r))return r;return null}function u(e,t,n={}){return(n.includeSelf===!0&&m(e.type)?e:null)??l(e,t,e=>m(e.type))}function d(t,n){let r=e(t.type??``),i=t.label?.trim();return!!(p(t)||r===`other`&&!i&&!t.value||(r===`other`||r===`statictext`)&&i&&n.includes(i)||r===`image`)}function f(t){let n=e(t.type??``);return n===`button`||n===`link`||n===`switch`||n===`searchfield`||n===`textfield`}function p(t){return e(t.type??``)===`button`&&t.label?.trim()===`chevron`&&t.enabled===!1}function m(t){let n=e(t??``);return n===`collectionview`||n===`table`||n===`scrollview`||n===`scrollarea`}function h(t,n){let r=t.label?.trim();if(!r||r!==n)return!1;let i=e(t.type??``);return i===`other`||i===`statictext`||i===`link`}function g(e,t,n){e.set(t.index,v(y(e,t),n))}function _(e,t,n){let r=y(e,t);e.set(t.index,v(r,n(r)))}function v(e,t){let n={...e,...t};for(let[e,r]of Object.entries(t))r===void 0&&delete n[e];return n}function y(e,t){return e.get(t.index)??t}function b(t){let n;for(let r of t){let t=e(r.type??``);(t===`application`||t===`window`)&&S(r.rect,n)&&(n=r.rect)}return n}function x(e,t,n=.8){let r=C(e),i=C(t);return r>0&&i>0&&r/i>=n}function S(e,t){return!!(e&&(!t||C(e)>C(t)))}function C(e){return e?e.width*e.height:0}function w(e,t,n){let r=new Map(n.map(e=>[e.index,e])),i=new Map;for(let[t,n]of e.entries())i.set(n.index,t);return e.map((e,n)=>{let a=typeof e.parentIndex==`number`?i.get(e.parentIndex):void 0;return a===void 0&&typeof e.parentIndex==`number`&&(a=T(e.parentIndex,t,r,i)),{...e,index:n,parentIndex:a}})}function T(e,t,n,r){let i=e,a=new Set;for(;typeof i==`number`&&!a.has(i);){if(a.add(i),!t.has(i))return r.get(i);i=n.get(i)?.parentIndex}}export{_,b as a,o as c,h as d,m as f,d as g,w as h,a as i,p as l,g as m,i as n,l as o,f as p,n as r,u as s,t,x as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{N as e}from"./sdk-contracts.js";import{
|
|
1
|
+
import{N as e}from"./sdk-contracts.js";import{qt as t}from"./sdk-batch.js";import{O as n}from"./runtime.js";import{r}from"./success-text.js";import{f as i}from"./session-snapshot.js";import{n as a}from"./runtime-admission.js";function o(e){let t=e?.trim().split(/\s+/,1)[0];if(!t||!t.startsWith(`@`)||t.length<3)return null;let n=t.slice(1);return/^[A-Za-z_-]*\d[\w-]*$/i.test(n)||/^(?:ref|node|element|el)[\w-]*$/i.test(n)?t:null}async function s(e){let n=await a({command:`type`,device:e.device,use:t,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(n.type===`response`)return{ok:!1,response:n.response};let r=n.runtime;return{ok:!0,typeText:async(e,t)=>await c(r,e,t)}}async function c(t,i,a){let s=o(i[0]);if(s)throw new e(`INVALID_ARGS`,`type does not accept a target ref like "${s}"`,{hint:`Use fill ${s} "text" to target that field, or press ${s} then type "text" to append.`});let c=i.join(` `);if(!c)throw new e(`INVALID_ARGS`,`type requires text`);let u=n(a.delayMs??0,`delay-ms`,0,1e4),d=(await t.operations.typeText(l(c,u,a)))?.textEntryRoute;return{...d===void 0?{}:{textEntryRoute:d},text:c,delayMs:u,...r(`Typed ${Array.from(c).length} chars`)}}function l(e,t,n){return{text:e,delayMs:t,...n.appBundleId===void 0?{}:{options:{appBundleId:n.appBundleId}},execution:i(n)}}export{s as n,c as t};
|
package/dist/src/video.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{N as e}from"./sdk-contracts.js";import{
|
|
1
|
+
import{N as e}from"./sdk-contracts.js";import{sr as t}from"./sdk-batch.js";import{C as n}from"./owner-identity.js";import{c as r}from"./exec.js";import{t as i}from"./timeouts.js";import{n as a,t as o}from"./file.js";import"./command.js";import"./process.js";import"./retry.js";import s from"node:path";import c from"node:fs";import{createHash as l}from"node:crypto";import u from"node:os";import{fileURLToPath as d}from"node:url";const f=`apple/runner/AgentDeviceRunner/RecordingScripts`;function p(e,t,n,r){let i=`${f}/${e}`,a=`dist/${i}`;return[s.resolve(t,e),s.resolve(n,i),s.resolve(t,`../${i}`),s.resolve(t,`../../${i}`),s.resolve(t,`../../../${i}`),s.resolve(n,a),s.resolve(r,i)]}function m(t,n,r=s.dirname(d(import.meta.url)),i=process.cwd()){let a=p(t,r,n,i);for(let e of a)if(c.existsSync(e))return e;throw new e(`COMMAND_FAILED`,`Missing recording helper script: ${t}`,{hint:`Ensure ${f} is present in this checkout or bundled under dist/${f} in the package.`,scriptName:t,searchedPaths:a})}function h(e=process.env){let t=v(),n=s.join(t,`home`),r=s.join(t,`module-cache`);return c.mkdirSync(n,{recursive:!0}),c.mkdirSync(r,{recursive:!0}),{...e,HOME:n,CLANG_MODULE_CACHE_PATH:r}}async function g(e){let t=[e.sourcePath,...e.extraSourcePaths??[]],n=t.map(e=>({sourcePath:e,stat:c.statSync(e),source:c.readFileSync(e)})),r=S(e.cacheName??s.basename(e.sourcePath,s.extname(e.sourcePath))),i=C([`2`,process.platform,process.arch,...n.flatMap(({sourcePath:e,stat:t,source:n})=>[s.resolve(e),t.size,n])]),a=s.join(v(),`bin`,`${r}-${i}`);return await y({sourcePaths:t,executablePath:a,timeoutMs:e.timeoutMs}),a}async function _(e){let t=S(e.cacheName),n=C([`2`,process.platform,process.arch,e.source]),r=s.join(v(),`sources`,`${t}-${n}.swift`),i=s.join(v(),`bin`,`${t}-${n}`);return await y({sourcePaths:[r],executablePath:i,sourceText:e.source,timeoutMs:e.timeoutMs}),i}function v(){let e=process.env.AGENT_DEVICE_SWIFT_CACHE_DIR?.trim();return e?s.resolve(e):s.join(u.tmpdir(),`agent-device-swift-cache`)}async function y(e){if(x(e.executablePath))return;let t=s.dirname(e.executablePath);c.mkdirSync(t,{recursive:!0});let n=e.timeoutMs??12e4;await a({acquire:()=>b(`${e.executablePath}.lock`,n),task:async()=>{if(x(e.executablePath))return;let i=c.mkdtempSync(s.join(t,`.${s.basename(e.executablePath)}.${process.pid}.`)),a=s.join(i,s.basename(e.executablePath));try{let[t]=e.sourcePaths;e.sourceText!==void 0&&t&&!c.existsSync(t)&&(c.mkdirSync(s.dirname(t),{recursive:!0}),c.writeFileSync(t,e.sourceText)),await r(`xcrun`,[`swiftc`,...e.sourcePaths,`-o`,a],{timeoutMs:n,env:h()}),c.renameSync(a,e.executablePath)}finally{c.rmSync(i,{recursive:!0,force:!0})}}})}async function b(t,r){try{return await o({lockDirPath:t,owner:{pid:process.pid,startTime:n(process.pid),acquiredAtMs:Date.now()},timeoutMs:r,pollMs:25,ownerGraceMs:r,description:`Swift cache lock: ${t} (${r}ms)`})}catch(n){throw n instanceof e&&n.message.startsWith(`Timed out waiting for Swift cache lock:`)?new e(`COMMAND_FAILED`,n.message,{...n.details,lockDir:t,timeoutMs:r,hint:`Another agent-device process may still be compiling this Swift helper. Retry shortly; if no agent-device process is active, remove "${t}" and retry.`}):n}}function x(e){try{return c.accessSync(e,c.constants.X_OK),c.statSync(e).isFile()}catch{return!1}}function S(e){return t(e.replaceAll(/[^A-Za-z0-9._-]/g,`-`))||`swift-helper`}function C(e){let t=l(`sha256`);for(let n of e)t.update(Buffer.isBuffer(n)?n:String(n)),t.update(`\0`);return t.digest(`hex`).slice(0,16)}const w={block:161,blockGroup:160,cluster:524531317,codecId:134,documentType:17026,ebml:440786851,segment:408125543,simpleBlock:163,trackEntry:174,trackNumber:215,tracks:374648427,trackType:131};function T(e){let t=E(e);if(!t)return!1;let{bytes:n,fileSize:r}=t,i=L(n,0,n.length,r);if(!i||i.id!==w.ebml||!i.complete||i.unknownSize||!D(n,i))return!1;let a=L(n,i.nextOffset,n.length,r);return!a||a.id!==w.segment||!V(a,r)?!1:O(n,a,r)}function E(e){try{let t=c.openSync(e,`r`);try{let e=c.fstatSync(t).size;if(e<=0)return;let n=Buffer.alloc(Math.min(e,1048576));return c.readSync(t,n,0,n.length,0)===n.length?{bytes:n,fileSize:e}:void 0}finally{c.closeSync(t)}}catch{return}}function D(e,t){let n=I(e,t)?.find(e=>e.id===w.documentType);return n!==void 0&&e.toString(`ascii`,n.dataStart,n.dataEnd)===`webm`}function O(e,t,n){let r=new Set,i=new Set;for(let a=t.dataStart;a<t.dataEnd;){let o=L(e,a,t.dataEnd,n);if(!o||!V(o,n))return!1;if(o.id===w.tracks&&k(e,o,r),o.id===w.cluster&&j(e,o,n,i),H(r,i))return!0;if(!o.complete||o.unknownSize)return!1;a=o.nextOffset}return!1}function k(e,t,n){let r=I(e,t);if(r){for(let t of r)if(t.id===w.trackEntry){let r=A(e,t);r!==void 0&&n.add(r)}}}function A(e,t){let n=I(e,t),r=F(e,n,w.trackNumber),i=F(e,n,w.trackType),a=n?.find(e=>e.id===w.codecId),o=a?e.toString(`ascii`,a.dataStart,a.dataEnd):void 0;return i===1&&o?.startsWith(`V_`)?r:void 0}function j(e,t,n,r){for(let i=t.dataStart;i<t.dataEnd;){let a=L(e,i,t.dataEnd,n);if(!a||!V(a,n)||(a.id===w.simpleBlock&&N(e,a,r),a.id===w.blockGroup&&M(e,a,r),!a.complete||a.unknownSize))return;i=a.nextOffset}}function M(e,t,n){let r=I(e,t)?.find(e=>e.id===w.block);r&&N(e,r,n)}function N(e,t,n){if(!t.complete||t.unknownSize)return;let r=z(e,t.dataStart);!r||r.unknown||t.dataEnd-t.dataStart<r.length+4||n.add(r.value)}function P(e,t){let n=t.dataEnd-t.dataStart;if(n<1||n>6)return;let r=0;for(let n=t.dataStart;n<t.dataEnd;n+=1)r=r*256+e[n];return Number.isSafeInteger(r)?r:void 0}function F(e,t,n){let r=t?.find(e=>e.id===n);return r?P(e,r):void 0}function I(e,t){if(!t.complete||t.unknownSize)return;let n=[];for(let r=t.dataStart;r<t.dataEnd;){let i=L(e,r,t.dataEnd,e.length);if(!i||!i.complete||i.unknownSize)return;n.push(i),r=i.nextOffset}return n}function L(e,t,n,r){let i=R(e,t);if(!i)return;let a=z(e,t+i.length);if(!a)return;let o=t+i.length+a.length;if(o>n)return;let s=a.unknown?r:o+a.value;if(!(!Number.isSafeInteger(s)||s<o))return{id:i.value,dataStart:o,dataEnd:Math.min(s,n),nextOffset:s,complete:s<=n,unknownSize:a.unknown}}function R(e,t){let n=B(e,t,4);if(!n)return;let r=0;for(let i=0;i<n;i+=1)r=r*256+e[t+i];return{length:n,value:r}}function z(e,t){let n=B(e,t,8);if(!n)return;let r=e[t],i=128>>n-1;if((r&i-1)==i-1&&e.subarray(t+1,t+n).every(e=>e===255))return{length:n,value:0,unknown:!0};let a=r&i-1;for(let r=1;r<n;r+=1)a=a*256+e[t+r];return Number.isSafeInteger(a)?{length:n,value:a,unknown:!1}:void 0}function B(e,t,n){let r=e[t];if(r===void 0||r===0)return;let i=128,a=1;for(;(r&i)===0;)i>>=1,a+=1;return a<=n&&t+a<=e.length?a:void 0}function V(e,t){return e.unknownSize||e.nextOffset<=t}function H(e,t){for(let n of e)if(t.has(n))return!0;return!1}let U;async function W(e,t={}){let n=t.pollMs??150,r=t.attempts??12,a,o=0;for(let t=0;t<r;t+=1){let t=0;try{t=c.statSync(e).size}catch{t=0}if(t>0&&t===a){if(o+=1,o>=2)return}else o=0;a=t,await i(n)}}async function G(e){let t=await Z(e);if(!t)return!1;if(t===`webm`)return!0;try{let t=await K(),n=await r(t,[e],{allowFailure:!0,timeoutMs:1e4,env:h()});return n.exitCode===0||Y(n.stderr,n.stdout)}catch(e){if(q(e))return!0;throw e}}async function K(){U??=_({source:`import Foundation
|
|
2
2
|
import AVFoundation
|
|
3
3
|
|
|
4
4
|
let url = URL(fileURLWithPath: CommandLine.arguments[1])
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agent-device",
|
|
3
|
-
"version": "0.21.
|
|
3
|
+
"version": "0.21.19",
|
|
4
4
|
"description": "Mobile app automation and verification for AI coding agents. CLI, MCP server, and typed Node.js API for iOS, Android, HarmonyOS, TV, web, macOS, and Linux.",
|
|
5
5
|
"mcpName": "io.github.callstack/agent-device",
|
|
6
6
|
"license": "MIT",
|
package/server.json
CHANGED
|
@@ -7,12 +7,12 @@
|
|
|
7
7
|
"url": "https://github.com/callstack/agent-device",
|
|
8
8
|
"source": "github"
|
|
9
9
|
},
|
|
10
|
-
"version": "0.21.
|
|
10
|
+
"version": "0.21.19",
|
|
11
11
|
"packages": [
|
|
12
12
|
{
|
|
13
13
|
"registryType": "npm",
|
|
14
14
|
"identifier": "agent-device",
|
|
15
|
-
"version": "0.21.
|
|
15
|
+
"version": "0.21.19",
|
|
16
16
|
"transport": {
|
|
17
17
|
"type": "stdio"
|
|
18
18
|
},
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
8217a388cb181b785090b23258a1c412319d03869d9627f9ee5a81f6746fbe48 agent-device-android-ime-helper-0.21.17.apk
|
package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.17.apk.sha256
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
b8801f4de4f76f9ed646694b0b0785c511a7a3cfef2744bdd746055176e1bf06 agent-device-android-snapshot-helper-0.21.17.apk
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
const e={readOnly:!1,readinessProbe:!1,readinessPreflightExempt:!1,readinessPreflightSkipEligibleAfterHealthyMutation:!1},t={...e,readinessPreflightExempt:!0},n={...e,readOnly:!0},r={...n,readinessProbe:!0},i={...e,readinessPreflightSkipEligibleAfterHealthyMutation:!0},a={tap:i,mouseClick:e,longPress:i,drag:i,remotePress:e,type:e,swipe:i,scroll:i,desktopScroll:i,findText:n,querySelector:n,readText:n,snapshot:n,screenshot:n,backInApp:e,backSystem:e,home:e,rotate:e,gesture:i,gestureViewport:n,appSwitcher:e,actionButton:e,keyboardDismiss:e,keyboardReturn:e,alert:t=>(t.action??`get`).toLowerCase()===`get`?n:e,sequence:i,recordStart:e,recordStop:e,status:r,uptime:r,appState:n,pasteboardWrite:e,activate:t,terminate:t,targetReset:t,shutdown:e};function o(e){return u(e).readOnly}function s(e){return u(e).readinessProbe}function c(e){return u(e).readinessPreflightExempt}function l(e){return u(e).readinessPreflightSkipEligibleAfterHealthyMutation}function u(e){let t=a[e.command];return typeof t==`function`?t(e):t}export{s as i,o as n,c as r,l as t};
|