agent-device 0.21.22 → 0.21.23
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.22.apk → agent-device-android-ime-helper-0.21.23.apk} +0 -0
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.23.apk.sha256 +1 -0
- package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.22.manifest.json → agent-device-android-ime-helper-0.21.23.manifest.json} +4 -4
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.23.apk +0 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.23.apk.sha256 +1 -0
- package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.22.manifest.json → agent-device-android-snapshot-helper-0.21.23.manifest.json} +6 -6
- package/dist/src/android-input-ownership.js +1 -1
- package/dist/src/app-log-reconnect.js +1 -1
- package/dist/src/app-log-runtime2.js +3 -3
- package/dist/src/back-mode.js +1 -1
- package/dist/src/client-metro-companion.js +1 -1
- package/dist/src/client-metro.js +1 -1
- package/dist/src/client-options.js +3 -3
- package/dist/src/cloud-artifacts.d.ts +6 -0
- package/dist/src/code-signature-cache.js +1 -1
- package/dist/src/connection-runtime.js +1 -1
- package/dist/src/daemon-registration-owner.js +1 -1
- package/dist/src/device-session.js +3 -1
- package/dist/src/dispatch-resolve.js +1 -1
- package/dist/src/doctor-facade.js +1 -1
- package/dist/src/durable-capture-resource.js +1 -1
- package/dist/src/file.js +1 -1
- package/dist/src/helper.js +2 -2
- package/dist/src/ime-rebind.js +1 -0
- package/dist/src/ime-state.js +1 -0
- package/dist/src/instance-client.js +1 -1
- package/dist/src/internal/bin.js +1 -1
- package/dist/src/internal/daemon.js +1 -1
- package/dist/src/ios-client.js +4 -4
- package/dist/src/ios-snapshot-engine.js +1 -1
- package/dist/src/log-stream.js +33 -0
- package/dist/src/mechanics.js +16 -16
- package/dist/src/node-http.js +1 -0
- package/dist/src/owner-identity.js +1 -1
- package/dist/src/perf-runtime-plan.js +1 -1
- package/dist/src/platform-runtime-app-log-process.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/process.js +1 -1
- package/dist/src/proxy.js +2 -2
- package/dist/src/registry.js +1 -1
- package/dist/src/runner-client.js +1 -1
- package/dist/src/runner-disposal.js +1 -1
- package/dist/src/runner-operations-facade.js +1 -1
- package/dist/src/runner-start-budget.js +1 -1
- package/dist/src/runtime10.js +1 -1
- package/dist/src/screenshot-overlay-draw.js +1 -1
- package/dist/src/screenshot-runtime.js +1 -1
- package/dist/src/script.js +1 -1
- package/dist/src/sdk-batch.js +2 -2
- package/dist/src/sdk-contracts.d.ts +5 -4
- package/dist/src/store.js +1 -1
- package/package.json +11 -8
- package/server.json +2 -2
- package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.22.apk.sha256 +0 -1
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.22.apk +0 -0
- package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.22.apk.sha256 +0 -1
- package/dist/src/session-stream.js +0 -27
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{Readable as e}from"node:stream";import{pipeline as t}from"node:stream/promises";import{TLSSocket as n}from"node:tls";async function r(n,r,s){if(r.method===`TRACE`){i(s,404);return}let c=a(r);if(!c){i(s,400);return}let l=await n.handle(o(c,r,s));s.statusCode=l.status;for(let[e,t]of l.headers)s.setHeader(e,t);if(!l.body){s.end();return}await t(e.fromWeb(l.body),s)}function i(e,t){e.statusCode=t,e.end()}function a(e){let t=e.socket instanceof n?`https`:`http`,r=URL.parse(e.url??`/`,`${t}://${e.headers.host??`127.0.0.1`}`);return!r||r.username||r.password?null:r}function o(t,n,r){let i=n.method??`GET`,a=i!==`GET`&&i!==`HEAD`;return new Request(t,{method:i,headers:s(n),signal:c(n,r),...a?{body:e.toWeb(n),duplex:`half`}:{}})}function s(e){let t=new Headers;for(let[n,r]of Object.entries(e.headers))if(r!==void 0)for(let e of Array.isArray(r)?r:[r])t.append(n,e);return t}function c(e,t){let n=new AbortController,r=()=>{t.writableFinished||n.signal.aborted||n.abort(Error(`Proxy client disconnected before the response ended`))};return e.on(`aborted`,r),t.on(`close`,r),t.closed&&r(),n.signal}export{r as serveProxyRequest};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import{r as e}from"./diagnostics.js";import{l as t,m as n}from"./exec.js";import{t as r}from"./timeouts.js";import i from"node:crypto";import a from"node:fs";import o from"node:path";function s(e){l(e.destination,t=>{let n={encoding:typeof e.contents==`string`?`utf8`:void 0,...e.mode===void 0?{}:{mode:e.mode}};a.writeFileSync(t,e.contents,n),e.publish===`link-exclusive`?a.linkSync(t,e.destination):a.renameSync(t,e.destination)})}function c(e){let t=o.dirname(e.destination);l(e.destination,n=>{let r,i=!1,o;try{f(e.destination),r=a.openSync(n,`wx`,e.mode??384),a.writeFileSync(r,e.contents,`utf8`),a.fsyncSync(r),a.closeSync(r),r=void 0,f(e.destination),e.publish===`link-exclusive`?a.linkSync(n,e.destination):a.renameSync(n,e.destination),u(t)}catch(e){i=!0,o=e}if(r!==void 0)try{a.closeSync(r)}catch(e){i||(i=!0,o=e)}if(i)throw o})}function l(t,n){let r=d(t);try{return n(r)}finally{try{a.rmSync(r,{force:!0})}catch(n){e({level:`warn`,phase:`atomic_file_cleanup_failed`,data:{destination:t,temporaryPath:r,error:n instanceof Error?n.message:String(n)}})}}}function u(e){let t;try{t=a.openSync(e,`r`),a.fsyncSync(t)}catch{}finally{if(t!==void 0)try{a.closeSync(t)}catch{}}}function d(e){return o.join(o.dirname(e),`.${o.basename(e)}.${process.pid}-${i.randomUUID()}.tmp`)}function f(e){let t=p(e);if(t?.isSymbolicLink())throw Error(`Refusing to replace a durable file symbolic link: ${e}`);if(t&&!t.isFile())throw Error(`Refusing to replace a durable path that is not a regular file: ${e}`)}function p(e){try{return a.lstatSync(e)}catch(e){if(e.code===`ENOENT`)return;throw e}}const m=1e3,h=process.platform===`win32`?`ps`:`/bin/ps`;function g(){return process.env}function _(e){return g()[e]}function v(e){process.stderr.write(e)}function ee(){return process.cwd()}function y(){return process.execPath}function b(){return process.version}function x(){return process.platform}function S(){return process.pid}function C(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(e){return e.code===`EPERM`}}function w(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(-e,0),!0}catch(e){return e.code===`EPERM`}}async function T(e,t=m){let[n,r,i]=await Promise.all([A(e,`lstart=`,t),A(e,`command=`,t),A(e,`state=`,t)]);return{startTime:n,command:r,zombie:i===null?null:i.startsWith(`Z`)}}function E(e){return k(e,`lstart=`)}function D(e){return k(e,`command=`)}function O(e){return k(e,`state=`)?.startsWith(`Z`)??!1}function te(e){let t=new Map,r=F(e);if(r.length===0)return t;try{let e=n(`ps`,[`-p`,r.join(`,`),`-o`,`pid=,state=,lstart=`],{allowFailure:!0,timeoutMs:m});if(e.exitCode!==0)return t;for(let n of e.stdout.split(`
|
|
2
2
|
`)){let e=/^\s*(\d+)\s+(\S+)\s+(.+?)\s*$/.exec(n);if(!e)continue;let r=Number.parseInt(e[1],10);!Number.isInteger(r)||r<=0||t.set(r,{state:e[2],startTime:e[3]})}}catch{}return t}function k(e,t){if(!Number.isInteger(e)||e<=0)return null;try{return j(n(h,[`-p`,String(e),`-o`,t],{allowFailure:!0,timeoutMs:m}))}catch{return null}}async function A(e,n,r){if(!Number.isInteger(e)||e<=0)return null;try{return j(await t(h,[`-p`,String(e),`-o`,n],{allowFailure:!0,timeoutMs:r}))}catch{return null}}function j(e){if(e.exitCode!==0)return null;let t=e.stdout.trim();return t.length>0?t:null}function M(e){let t=[];for(let n of e.split(`
|
|
3
|
-
`)){let e=/^\s*(\d+)\s+(\d+)\s+(.+?)\s*$/.exec(n);if(!e)continue;let r=Number.parseInt(e[1],10),i=Number.parseInt(e[2],10),a=e[3];!Number.isInteger(r)||r<=0||t.push({pid:r,ppid:Number.isInteger(i)&&i>0?i:void 0,command:a})}return t}async function N(e){let n=await(e.runCommand??t)(e.runCommand?`ps`:h,[`-ax`,`-o`,`pid=,ppid=,command=`],{allowFailure:!0,timeoutMs:e.timeoutMs});return n.exitCode===0?M(n.stdout):[]}function P(e,t){let n=new Set(F(e)),r=!0;for(;r;){r=!1;for(let e of t)e.ppid===void 0||!n.has(e.ppid)||n.has(e.pid)||(n.add(e.pid),r=!0)}return t.filter(e=>n.has(e.pid))}function F(e,t={}){return[...new Set(e)].filter(e=>Number.isInteger(e)&&e>0&&e!==t.excludePid)}function I(e,t){let n=F(e,{excludePid:process.pid}),r=0;for(let e of n)try{process.kill(e,t),r+=1}catch{}return r}async function L(e,t){if(!C(e))return!0;let n=Date.now();for(;Date.now()-n<t;)if(await r(50),!C(e))return!0;return!C(e)}async function R(e){let t=F(e.pids,{excludePid:process.pid});t.length!==0&&(I(t,`SIGTERM`),await Promise.all(t.map(async t=>await L(t,e.termTimeoutMs))),I(t.filter(e=>C(e)),`SIGKILL`),await Promise.all(t.map(async t=>await L(t,e.killTimeoutMs))))}const z=1e3,B=[`-n`,`hw.optional.arm64`];let V,H;function U(){return H===void 0?(V??=K(process.platform,process.arch).then(G),V):Promise.resolve(H)}function W(){return H??G(q(process.platform===`darwin`&&Y(),process.arch))}function G(e){return H??=e,H}async function K(e,t){return q(e===`darwin`&&await J(),t)}function q(e,t){return e?`arm64`:t===`x64`?`x86_64`:t}async function J(){try{let e=await t(`/usr/sbin/sysctl`,B,{allowFailure:!0,timeoutMs:z});return e.exitCode===0&&e.stdout.trim()===`1`}catch{return!1}}function Y(){try{let e=n(`/usr/sbin/sysctl`,B,{allowFailure:!0,timeoutMs:z});return e.exitCode===0&&e.stdout.trim()===`1`}catch{return!1}}function X(e){return typeof e==`number`&&Number.isInteger(e)&&e>0&&e<=2147483647}function Z(){return{pid:process.pid,startTime:E(process.pid)}}function Q(e,t){return e.pid===t.pid&&e.startTime===t.startTime}function ne(e,t){return e.pid!==t.pid||!!(e.startTime&&t.startTime&&e.startTime!==t.startTime)}function re(e){return $(e)}function $(e,t){let{owner:n,stateDir:r}=e;if(!X(n.pid))return`unknown`;if(!C(n.pid)||(t===void 0?O(n.pid):t?.state.startsWith(`Z`)))return`owner-process-dead`;if(n.startTime){let e=t===void 0?E(n.pid):t?.startTime??null;if(e!==null&&e!==n.startTime)return`owner-process-reused`}return r?ie(r):`live`}function ie(e){try{return a.statSync(e),`live`}catch(e){let t=e?.code;return t===`ENOENT`||t===`ENOTDIR`?`owner-state-dir-gone`:`unknown`}}export{
|
|
3
|
+
`)){let e=/^\s*(\d+)\s+(\d+)\s+(.+?)\s*$/.exec(n);if(!e)continue;let r=Number.parseInt(e[1],10),i=Number.parseInt(e[2],10),a=e[3];!Number.isInteger(r)||r<=0||t.push({pid:r,ppid:Number.isInteger(i)&&i>0?i:void 0,command:a})}return t}async function N(e){let n=await(e.runCommand??t)(e.runCommand?`ps`:h,[`-ax`,`-o`,`pid=,ppid=,command=`],{allowFailure:!0,timeoutMs:e.timeoutMs});return n.exitCode===0?M(n.stdout):[]}function P(e,t){let n=new Set(F(e)),r=!0;for(;r;){r=!1;for(let e of t)e.ppid===void 0||!n.has(e.ppid)||n.has(e.pid)||(n.add(e.pid),r=!0)}return t.filter(e=>n.has(e.pid))}function F(e,t={}){return[...new Set(e)].filter(e=>Number.isInteger(e)&&e>0&&e!==t.excludePid)}function I(e,t){let n=F(e,{excludePid:process.pid}),r=0;for(let e of n)try{process.kill(e,t),r+=1}catch{}return r}async function L(e,t){if(!C(e))return!0;let n=Date.now();for(;Date.now()-n<t;)if(await r(50),!C(e))return!0;return!C(e)}async function R(e){let t=F(e.pids,{excludePid:process.pid});t.length!==0&&(I(t,`SIGTERM`),await Promise.all(t.map(async t=>await L(t,e.termTimeoutMs))),I(t.filter(e=>C(e)),`SIGKILL`),await Promise.all(t.map(async t=>await L(t,e.killTimeoutMs))))}const z=1e3,B=[`-n`,`hw.optional.arm64`];let V,H;function U(){return H===void 0?(V??=K(process.platform,process.arch).then(G),V):Promise.resolve(H)}function W(){return H??G(q(process.platform===`darwin`&&Y(),process.arch))}function G(e){return H??=e,H}async function K(e,t){return q(e===`darwin`&&await J(),t)}function q(e,t){return e?`arm64`:t===`x64`?`x86_64`:t}async function J(){try{let e=await t(`/usr/sbin/sysctl`,B,{allowFailure:!0,timeoutMs:z});return e.exitCode===0&&e.stdout.trim()===`1`}catch{return!1}}function Y(){try{let e=n(`/usr/sbin/sysctl`,B,{allowFailure:!0,timeoutMs:z});return e.exitCode===0&&e.stdout.trim()===`1`}catch{return!1}}function X(e){return typeof e==`number`&&Number.isInteger(e)&&e>0&&e<=2147483647}function Z(){return{pid:process.pid,startTime:E(process.pid)}}function Q(e,t){return e.pid===t.pid&&e.startTime===t.startTime}function ne(e,t){return e.pid!==t.pid||!!(e.startTime&&t.startTime&&e.startTime!==t.startTime)}function re(e){return $(e)}function $(e,t){let{owner:n,stateDir:r}=e;if(!X(n.pid))return`unknown`;if(!C(n.pid)||(t===void 0?O(n.pid):t?.state.startsWith(`Z`)))return`owner-process-dead`;if(n.startTime){let e=t===void 0?E(n.pid):t?.startTime??null;if(e!==null&&e!==n.startTime)return`owner-process-reused`}return r?ie(r):`live`}function ie(e){try{return a.statSync(e),`live`}catch(e){let t=e?.code;return t===`ENOENT`||t===`ENOTDIR`?`owner-state-dir-gone`:`unknown`}}export{c as A,T as C,F as D,R as E,l as M,L as O,D as S,I as T,N as _,Q as a,_ as b,ee as c,b as d,x as f,O as g,w as h,ne as i,s as j,v as k,g as l,C as m,$ as n,Z as o,S as p,X as r,P as s,re as t,y as u,U as v,E as w,te as x,W as y};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{P as e}from"./sdk-contracts.js";import{r as t}from"./diagnostics.js";import"./diagnostics2.js";import{O as n,d as r,j as i}from"./sdk-device.js";import{At as a,Mt as o,Nt as s,Ot as c,kt as l}from"./sdk-batch.js";import{m as u}from"./observability.js";import{A as d,a as f,o as p}from"./owner-identity.js";import{a as ee,t as m}from"./file.js";import"./process.js";import{c as h,i as g,l as _,r as v,s as y,t as b,u as x}from"./device-claim-inspection.js";import{n as S,t as C}from"./durable-capture-resource.js";import w from"node:crypto";import T from"node:fs";import E from"node:path";async function D(e){let t=await e.observeDeviceBoot?.observeBootTimeMs(e.device);if(t?.observed!==!0||t.bootedAtMs<=e.claim.updatedAtMs)return;let{session:n,workspace:r,stateDir:i}=e.claim;return{session:n,workspace:r,stateDir:i,bootedAtMs:t.bootedAtMs}}function O(e){t({level:`info`,phase:`device_claim_reboot_released`,data:{deviceKey:e.deviceKey,ownerSession:e.claim.session,ownerStateDir:e.claim.stateDir,ownerWorkspace:e.claim.workspace,claimUpdatedAtMs:e.claim.updatedAtMs,deviceBootedAtMs:e.bootedAtMs}})}function k(e){let t=_(e.deviceKey);T.mkdirSync(E.dirname(t),{recursive:!0,mode:448}),d({destination:t,contents:`${JSON.stringify(e)}\n`,mode:384})}async function A(e,t){let n=p();return await ee({acquire:()=>m({lockDirPath:`${_(e)}.lock`,owner:{pid:n.pid,startTime:n.startTime,acquiredAtMs:Date.now()},timeoutMs:3e4,description:`device claim for ${e}`}),task:t})}async function te(e){let t=v(_(e.deviceKey));return t?t.claim&&P(t.claim,e.stateDir,e.owner)?(R(e.deviceKey,t.claim),{status:`available`}):t.claim&&F(t.claim,e,e.owner)?{status:`held`,ownership:ne(t.claim)}:await re(t,e):{status:`available`}}function ne(e){if(e.updatedAtMs>=Date.now())return y(e);let t={...e,updatedAtMs:Date.now()};return k(t),y(t)}async function re(e,t){let n=e.claim;if(!n)return I(t.deviceKey,e),{status:`conflict`,conflict:e};let r=await ie({classification:e.classification,claim:n,device:t.device,observeDeviceBoot:t.observeDeviceBoot});if(!r.settles)return I(t.deviceKey,e),{status:`conflict`,conflict:e};let i=await j(n,t.reconcileOrphanedDeviceClaim);return i.status===`retained`?(I(t.deviceKey,e,i.reason),{status:`conflict`,conflict:e}):r.tookOver?(O({deviceKey:t.deviceKey,claim:n,bootedAtMs:r.tookOver.bootedAtMs}),{status:`available`,tookOver:r.tookOver}):{status:`available`}}async function ie(e){if(b(e.classification))return{settles:!0};let t=await D(e);return t?{settles:!0,tookOver:t}:{settles:!1}}async function j(e,t){let n=await t(e);if(n.status===`retained`)return n;try{T.unlinkSync(_(e.deviceKey))}catch(e){if(e.code!==`ENOENT`)throw e}return{status:`reconciled`}}function M(e,t,n){return e.stateDir===t&&f({pid:e.ownerPid,startTime:e.ownerStartTime},n)}function N(e){return e.abandonedAtMs!==void 0}function P(e,t,n){return N(e)&&M(e,t,n)}function F(e,t,n){return e.session===t.session&&e.workspace===t.workspace&&M(e,t.stateDir,n)}function I(e,n,r){t({level:`warn`,phase:`device_claim_conflict`,data:{deviceKey:e,classification:n.classification,...L(n),...r?{reconciliationReason:r}:{}}})}function L(e){return e.allocatorClaim?{ownerStateDir:e.allocatorClaim.stateDir,allocatorInstanceId:e.allocatorClaim.allocator.instanceId,identityIncarnationId:e.allocatorClaim.allocator.identityIncarnationId}:{ownerSession:e.claim?.session,ownerStateDir:e.claim?.stateDir}}function R(e,n){t({level:`info`,phase:`device_claim_abandoned_superseded`,data:{deviceKey:e,abandonedSession:n.session,abandonedAtMs:n.abandonedAtMs}})}function z(e){return`transient:${e}`}async function B(e){let t=W(e.device),n=h(t);return await A(n,async()=>await H({...e,deviceKey:n,identity:t}))}async function V(e){let t=W(e.device),n=h(t);return await A(n,async()=>{let r=v(_(n));return r?.claim&&!N(r.claim)&&M(r.claim,e.stateDir,p())?{status:`covered-by-owned-claim`}:await H({device:e.device,deviceKey:n,identity:t,session:z(e.command),workspace:e.workspace,stateDir:e.stateDir,reconcileOrphanedDeviceClaim:e.reconcileOrphanedDeviceClaim})})}async function H(e){let{deviceKey:t,identity:n}=e,r=p(),i=await te({...e,owner:r});if(i.status===`conflict`)return i;if(i.status===`held`)return{status:`acquired`,ownership:i.ownership};let a=Date.now(),o={schemaVersion:2,deviceKey:t,device:{...n,name:e.device.name},session:e.session,workspace:e.workspace,stateDir:e.stateDir,ownerPid:r.pid,ownerStartTime:r.startTime,ownerToken:w.randomUUID(),createdAtMs:a,updatedAtMs:a};return k(o),{status:`acquired`,ownership:y(o),...i.tookOver?{tookOver:i.tookOver}:{}}}function U(e){let t=h(W(e)),n=v(_(t))?.claim;return n!==void 0&&n.deviceKey===t&&!N(n)&&f({pid:n.ownerPid,startTime:n.ownerStartTime},p())}function W(e){return i({...e,...r(e.platform)?{appleOs:n(e)}:{}})}async function G(e){let t=[];for(let n of g(e.selectors))t.push(await K(n,e.reconcile));return t}async function K(e,n){let r=e.claim,i={fileName:e.fileName,classification:e.classification,...e.deviceKey?{deviceKey:e.deviceKey}:{},...r?{device:r.device,session:r.session,workspace:r.workspace,stateDir:r.stateDir}:{},...e.allocatorClaim?{device:e.allocatorClaim.device,stateDir:e.allocatorClaim.stateDir,allocator:e.allocatorClaim.allocator}:{}};if(!r||!b(e.classification))return{...i,status:`refused`,reason:ae(e.classification)};if(_(r.deviceKey)!==E.join(x(),e.fileName))return{...i,status:`refused`,reason:`claim-file-name-mismatch`};let{deviceKey:a,ownerToken:o}=r;return await A(a,async()=>{let e=v(_(a));if(!e?.claim||e.claim.ownerToken!==o||!b(e.classification))return{...i,status:`changed`,reason:`claim-changed-during-release`};let s=await j(e.claim,n);return s.status===`retained`?{...i,status:`retained`,reason:s.reason}:(t({level:`info`,phase:`device_claim_stale_released`,data:{deviceKey:a,ownerSession:r.session,ownerStateDir:r.stateDir}}),{...i,status:`released`})})}const q=Object.freeze({live:`live-owner`,"owner-process-reused":`owner-pid-reused`,"owner-state-dir-gone":`owner-process-still-running`,unknown:`owner-liveness-unknown`,inconsistent:`claim-record-inconsistent`,"allocator-inconsistent":`allocator-claim-record-inconsistent`,"allocator-held":`allocator-held-owner`,"owner-process-dead":`claim-record-unreadable`,"owner-daemon-superseded":`claim-record-unreadable`});function ae(e){return q[e]}async function J(e){return e?await Y(e,(e,t)=>{try{T.unlinkSync(t)}catch(e){if(e.code!==`ENOENT`)throw e;return`absent`}return`deleted`},e=>e?e.claim?`ownership-changed`:`unattributable`:`absent`):`absent`}async function oe(e){return e?await Y(e,e=>{let t=Date.now();return k({...e,abandonedAtMs:t,updatedAtMs:t}),`abandoned`},e=>e?`ownership-changed`:`absent`):`absent`}async function se(e){return e?await Y(e,e=>(k({...e,updatedAtMs:Date.now()}),{status:`renewed`}),e=>({status:`lost`,conflict:e})):{status:`lost`,conflict:void 0}}async function Y(e,t,n){return await A(e.deviceKey,async()=>{let r=_(e.deviceKey),i=v(r);if(!i)return n(void 0);let a=i.claim;return!a||!ce(a,e)?n(i):t(a,r)})}function ce(e,t){return e.ownerToken===t.ownerToken&&f({pid:e.ownerPid,startTime:e.ownerStartTime},{pid:t.ownerPid,startTime:t.ownerStartTime})}async function le(e,t){let n=x(),r;try{r=T.readdirSync(n,{withFileTypes:!0})}catch{return{examined:0,reconciled:0,retained:0,changed:0}}let i=0,a=0,o=0,s=0;for(let c of r){if(!c.isFile()||!c.name.endsWith(`.json`))continue;let r=E.join(n,c.name),l=v(r);if(!l?.claim||!X(l.classification,l.claim.stateDir,t))continue;i+=1;let{deviceKey:u,ownerToken:d}=l.claim;if(_(u)!==r){o+=1;continue}await A(u,async()=>{let n=v(r);if(!n?.claim||!X(n.classification,n.claim.stateDir,t)||n.claim.ownerToken!==d){s+=1;return}if((await j(n.claim,e)).status===`retained`){o+=1;return}a+=1})}return{examined:i,reconciled:a,retained:o,changed:s}}function X(e,t,n){return b(e)?e!==`owner-daemon-superseded`||E.resolve(t)===E.resolve(n):!1}const ue=S({resourceKind:`audio-probe`,fileName:`audio-probe.resource.json`,displayName:`Audio probe`}),Z=C({resourceKind:`audio-probe`,displayName:`audio probe`,store:ue,completionMetadata:e=>({backend:e.backend??`unknown`,source:e.source,durationMs:e.durationMs,elapsedMs:e.elapsedMs,bucketMs:e.bucketMs,sampleCount:e.sampleCount,heard:e.heard}),failedFinishPolicy:`dispose-on-failed-finish`,messages:{noActive:`no active audio probe`,cleanupPendingHint:`Keep audio-probe.resource.json and retry stop through its exact runtime owner.`}});function de(e){return Z.adoptStarted(e)}function fe(e){return Z.finishLive(e)}const pe=S({resourceKind:`perf-capture`,fileName:`perf-capture.resource.json`,displayName:`Perf capture`}),Q=C({resourceKind:`perf-capture`,displayName:`perf capture`,store:pe,completionMetadata:e=>({kind:typeof e.kind==`string`?e.kind:`unknown`,mode:typeof e.mode==`string`?e.mode:`unknown`,...typeof e.outPath==`string`?{outPath:e.outPath}:{}}),failedFinishPolicy:`preserve-retry-material`,messages:{noActive:`no active native perf capture`,cleanupPendingHint:`Keep perf-capture.resource.json and retry stop through its exact runtime owner.`}});function $(e){return Q.adoptStarted(e)}function me(e){return Q.finishLive(e)}function he(e){if(e.area===`frames`)return Object.freeze({kind:`frames`,request:e,use:c});if(e.area===`memory`)return e.action===`snapshot`?Object.freeze({kind:`memory-snapshot`,request:e,use:a}):Object.freeze({kind:`memory-sample`,request:e,use:l});if(e.area===`trace`)return e.action===`start`?Object.freeze({kind:`capture-start`,request:e,use:o}):Object.freeze({kind:`capture-stop`,request:e});switch(e.action){case`start`:return Object.freeze({kind:`capture-start`,request:e,use:o});case`stop`:return Object.freeze({kind:`capture-stop`,request:e});case`report`:return Object.freeze({kind:`profile-report`,request:e,use:s})}}function ge(t){let n=t.positionals??[],r=n[0]?.toLowerCase();if(r===`frames`){let i=n[1]?.toLowerCase();if(i!==void 0&&i!==`sample`||n.length>2||t.kind!==void 0)throw new e(`INVALID_ARGS`,`perf action must be frames, memory sample|snapshot, cpu profile start|stop|report, or trace start|stop`);return Object.freeze({area:r,action:`sample`})}if(r===`memory`)return _e(n,t);if(r===`cpu`)return ve(n,t.outPath);if(r===`trace`)return ye(n,t.outPath);throw new e(`INVALID_ARGS`,`perf requires frames, memory, cpu, or trace`)}function _e(t,n){let r=(t[1]??`sample`).toLowerCase();if(r!==`sample`&&r!==`snapshot`)throw new e(`INVALID_ARGS`,`perf memory requires sample or snapshot`);if(n.kind!==void 0&&r!==`snapshot`)throw new e(`INVALID_ARGS`,`--kind is only supported with perf memory snapshot`);if(r===`sample`&&t.length>2)throw new e(`INVALID_ARGS`,`perf memory sample does not accept additional positionals`);if(r===`snapshot`&&t.length>3)throw new e(`INVALID_ARGS`,`perf memory snapshot accepts at most one positional kind`);let i=n.kind??t[2];if(i!==void 0&&!u(i))throw new e(`INVALID_ARGS`,`perf memory snapshot --kind must be android-hprof or memgraph`);return Object.freeze({area:`memory`,action:r,...i===void 0?{}:{kind:i},...n.outPath===void 0?{}:{outPath:n.outPath}})}function ve(t,n){if(t[1]?.toLowerCase()!==`profile`)throw new e(`INVALID_ARGS`,`perf cpu requires profile`);let r=t[2]?.toLowerCase();if(r!==`start`&&r!==`stop`&&r!==`report`)throw new e(`INVALID_ARGS`,`perf cpu profile action must be start, stop, or report`);let i=t[3]?.toLowerCase();if(i!==`xctrace`&&i!==`simpleperf`)throw new e(`INVALID_ARGS`,`perf cpu profile requires --kind xctrace or simpleperf`);let a=n??t[5];return Object.freeze({area:`cpu`,subject:`profile`,action:r,kind:i,...t[4]?{template:t[4]}:{},...a?{outPath:a}:{},...t[6]?{tracePath:t[6]}:{}})}function ye(t,n){let r=t[1]?.toLowerCase();if(r!==`start`&&r!==`stop`)throw new e(`INVALID_ARGS`,`perf trace action must be start or stop`);let i=t[2]?.toLowerCase();if(i!==`xctrace`&&i!==`perfetto`)throw new e(`INVALID_ARGS`,`perf trace requires --kind xctrace or perfetto`);let a=n??t[4];return Object.freeze({area:`trace`,action:r,kind:i,...t[3]?{template:t[3]}:{},...a?{outPath:a}:{}})}export{se as _,Q as a,fe as c,V as d,J as f,G as g,le as h,me as i,oe as l,U as m,he as n,de as o,W as p,$ as r,Z as s,ge as t,B as u};
|
|
1
|
+
import{P as e}from"./sdk-contracts.js";import{r as t}from"./diagnostics.js";import"./diagnostics2.js";import{O as n,d as r,j as i}from"./sdk-device.js";import{At as a,Mt as o,Nt as s,Ot as c,kt as l}from"./sdk-batch.js";import{m as u}from"./observability.js";import{a as d,j as ee,o as f}from"./owner-identity.js";import{a as p,t as m}from"./file.js";import"./process.js";import{c as h,i as g,l as _,r as v,s as y,t as b,u as x}from"./device-claim-inspection.js";import{n as S,t as C}from"./durable-capture-resource.js";import w from"node:crypto";import T from"node:fs";import E from"node:path";async function D(e){let t=await e.observeDeviceBoot?.observeBootTimeMs(e.device);if(t?.observed!==!0||t.bootedAtMs<=e.claim.updatedAtMs)return;let{session:n,workspace:r,stateDir:i}=e.claim;return{session:n,workspace:r,stateDir:i,bootedAtMs:t.bootedAtMs}}function O(e){t({level:`info`,phase:`device_claim_reboot_released`,data:{deviceKey:e.deviceKey,ownerSession:e.claim.session,ownerStateDir:e.claim.stateDir,ownerWorkspace:e.claim.workspace,claimUpdatedAtMs:e.claim.updatedAtMs,deviceBootedAtMs:e.bootedAtMs}})}function k(e){let t=_(e.deviceKey);T.mkdirSync(E.dirname(t),{recursive:!0,mode:448}),ee({destination:t,contents:`${JSON.stringify(e)}\n`,mode:384})}async function A(e,t){let n=f();return await p({acquire:()=>m({lockDirPath:`${_(e)}.lock`,owner:{pid:n.pid,startTime:n.startTime,acquiredAtMs:Date.now()},timeoutMs:3e4,description:`device claim for ${e}`}),task:t})}async function te(e){let t=v(_(e.deviceKey));return t?t.claim&&P(t.claim,e.stateDir,e.owner)?(R(e.deviceKey,t.claim),{status:`available`}):t.claim&&F(t.claim,e,e.owner)?{status:`held`,ownership:ne(t.claim)}:await re(t,e):{status:`available`}}function ne(e){if(e.updatedAtMs>=Date.now())return y(e);let t={...e,updatedAtMs:Date.now()};return k(t),y(t)}async function re(e,t){let n=e.claim;if(!n)return I(t.deviceKey,e),{status:`conflict`,conflict:e};let r=await ie({classification:e.classification,claim:n,device:t.device,observeDeviceBoot:t.observeDeviceBoot});if(!r.settles)return I(t.deviceKey,e),{status:`conflict`,conflict:e};let i=await j(n,t.reconcileOrphanedDeviceClaim);return i.status===`retained`?(I(t.deviceKey,e,i.reason),{status:`conflict`,conflict:e}):r.tookOver?(O({deviceKey:t.deviceKey,claim:n,bootedAtMs:r.tookOver.bootedAtMs}),{status:`available`,tookOver:r.tookOver}):{status:`available`}}async function ie(e){if(b(e.classification))return{settles:!0};let t=await D(e);return t?{settles:!0,tookOver:t}:{settles:!1}}async function j(e,t){let n=await t(e);if(n.status===`retained`)return n;try{T.unlinkSync(_(e.deviceKey))}catch(e){if(e.code!==`ENOENT`)throw e}return{status:`reconciled`}}function M(e,t,n){return e.stateDir===t&&d({pid:e.ownerPid,startTime:e.ownerStartTime},n)}function N(e){return e.abandonedAtMs!==void 0}function P(e,t,n){return N(e)&&M(e,t,n)}function F(e,t,n){return e.session===t.session&&e.workspace===t.workspace&&M(e,t.stateDir,n)}function I(e,n,r){t({level:`warn`,phase:`device_claim_conflict`,data:{deviceKey:e,classification:n.classification,...L(n),...r?{reconciliationReason:r}:{}}})}function L(e){return e.allocatorClaim?{ownerStateDir:e.allocatorClaim.stateDir,allocatorInstanceId:e.allocatorClaim.allocator.instanceId,identityIncarnationId:e.allocatorClaim.allocator.identityIncarnationId}:{ownerSession:e.claim?.session,ownerStateDir:e.claim?.stateDir}}function R(e,n){t({level:`info`,phase:`device_claim_abandoned_superseded`,data:{deviceKey:e,abandonedSession:n.session,abandonedAtMs:n.abandonedAtMs}})}function z(e){return`transient:${e}`}async function B(e){let t=W(e.device),n=h(t);return await A(n,async()=>await H({...e,deviceKey:n,identity:t}))}async function V(e){let t=W(e.device),n=h(t);return await A(n,async()=>{let r=v(_(n));return r?.claim&&!N(r.claim)&&M(r.claim,e.stateDir,f())?{status:`covered-by-owned-claim`}:await H({device:e.device,deviceKey:n,identity:t,session:z(e.command),workspace:e.workspace,stateDir:e.stateDir,reconcileOrphanedDeviceClaim:e.reconcileOrphanedDeviceClaim})})}async function H(e){let{deviceKey:t,identity:n}=e,r=f(),i=await te({...e,owner:r});if(i.status===`conflict`)return i;if(i.status===`held`)return{status:`acquired`,ownership:i.ownership};let a=Date.now(),o={schemaVersion:2,deviceKey:t,device:{...n,name:e.device.name},session:e.session,workspace:e.workspace,stateDir:e.stateDir,ownerPid:r.pid,ownerStartTime:r.startTime,ownerToken:w.randomUUID(),createdAtMs:a,updatedAtMs:a};return k(o),{status:`acquired`,ownership:y(o),...i.tookOver?{tookOver:i.tookOver}:{}}}function U(e){let t=h(W(e)),n=v(_(t))?.claim;return n!==void 0&&n.deviceKey===t&&!N(n)&&d({pid:n.ownerPid,startTime:n.ownerStartTime},f())}function W(e){return i({...e,...r(e.platform)?{appleOs:n(e)}:{}})}async function G(e){let t=[];for(let n of g(e.selectors))t.push(await K(n,e.reconcile));return t}async function K(e,n){let r=e.claim,i={fileName:e.fileName,classification:e.classification,...e.deviceKey?{deviceKey:e.deviceKey}:{},...r?{device:r.device,session:r.session,workspace:r.workspace,stateDir:r.stateDir}:{},...e.allocatorClaim?{device:e.allocatorClaim.device,stateDir:e.allocatorClaim.stateDir,allocator:e.allocatorClaim.allocator}:{}};if(!r||!b(e.classification))return{...i,status:`refused`,reason:q(e.classification)};if(_(r.deviceKey)!==E.join(x(),e.fileName))return{...i,status:`refused`,reason:`claim-file-name-mismatch`};let{deviceKey:a,ownerToken:o}=r;return await A(a,async()=>{let e=v(_(a));if(!e?.claim||e.claim.ownerToken!==o||!b(e.classification))return{...i,status:`changed`,reason:`claim-changed-during-release`};let s=await j(e.claim,n);return s.status===`retained`?{...i,status:`retained`,reason:s.reason}:(t({level:`info`,phase:`device_claim_stale_released`,data:{deviceKey:a,ownerSession:r.session,ownerStateDir:r.stateDir}}),{...i,status:`released`})})}const ae=Object.freeze({live:`live-owner`,"owner-process-reused":`owner-pid-reused`,"owner-state-dir-gone":`owner-process-still-running`,unknown:`owner-liveness-unknown`,inconsistent:`claim-record-inconsistent`,"allocator-inconsistent":`allocator-claim-record-inconsistent`,"allocator-held":`allocator-held-owner`,"owner-process-dead":`claim-record-unreadable`,"owner-daemon-superseded":`claim-record-unreadable`});function q(e){return ae[e]}async function J(e){return e?await Y(e,(e,t)=>{try{T.unlinkSync(t)}catch(e){if(e.code!==`ENOENT`)throw e;return`absent`}return`deleted`},e=>e?e.claim?`ownership-changed`:`unattributable`:`absent`):`absent`}async function oe(e){return e?await Y(e,e=>{let t=Date.now();return k({...e,abandonedAtMs:t,updatedAtMs:t}),`abandoned`},e=>e?`ownership-changed`:`absent`):`absent`}async function se(e){return e?await Y(e,e=>(k({...e,updatedAtMs:Date.now()}),{status:`renewed`}),e=>({status:`lost`,conflict:e})):{status:`lost`,conflict:void 0}}async function Y(e,t,n){return await A(e.deviceKey,async()=>{let r=_(e.deviceKey),i=v(r);if(!i)return n(void 0);let a=i.claim;return!a||!ce(a,e)?n(i):t(a,r)})}function ce(e,t){return e.ownerToken===t.ownerToken&&d({pid:e.ownerPid,startTime:e.ownerStartTime},{pid:t.ownerPid,startTime:t.ownerStartTime})}async function le(e,t){let n=x(),r;try{r=T.readdirSync(n,{withFileTypes:!0})}catch{return{examined:0,reconciled:0,retained:0,changed:0}}let i=0,a=0,o=0,s=0;for(let c of r){if(!c.isFile()||!c.name.endsWith(`.json`))continue;let r=E.join(n,c.name),l=v(r);if(!l?.claim||!X(l.classification,l.claim.stateDir,t))continue;i+=1;let{deviceKey:u,ownerToken:d}=l.claim;if(_(u)!==r){o+=1;continue}await A(u,async()=>{let n=v(r);if(!n?.claim||!X(n.classification,n.claim.stateDir,t)||n.claim.ownerToken!==d){s+=1;return}if((await j(n.claim,e)).status===`retained`){o+=1;return}a+=1})}return{examined:i,reconciled:a,retained:o,changed:s}}function X(e,t,n){return b(e)?e!==`owner-daemon-superseded`||E.resolve(t)===E.resolve(n):!1}const ue=S({resourceKind:`audio-probe`,fileName:`audio-probe.resource.json`,displayName:`Audio probe`}),Z=C({resourceKind:`audio-probe`,displayName:`audio probe`,store:ue,completionMetadata:e=>({backend:e.backend??`unknown`,source:e.source,durationMs:e.durationMs,elapsedMs:e.elapsedMs,bucketMs:e.bucketMs,sampleCount:e.sampleCount,heard:e.heard}),failedFinishPolicy:`dispose-on-failed-finish`,messages:{noActive:`no active audio probe`,cleanupPendingHint:`Keep audio-probe.resource.json and retry stop through its exact runtime owner.`}});function de(e){return Z.adoptStarted(e)}function fe(e){return Z.finishLive(e)}const pe=S({resourceKind:`perf-capture`,fileName:`perf-capture.resource.json`,displayName:`Perf capture`}),Q=C({resourceKind:`perf-capture`,displayName:`perf capture`,store:pe,completionMetadata:e=>({kind:typeof e.kind==`string`?e.kind:`unknown`,mode:typeof e.mode==`string`?e.mode:`unknown`,...typeof e.outPath==`string`?{outPath:e.outPath}:{}}),failedFinishPolicy:`preserve-retry-material`,messages:{noActive:`no active native perf capture`,cleanupPendingHint:`Keep perf-capture.resource.json and retry stop through its exact runtime owner.`}});function $(e){return Q.adoptStarted(e)}function me(e){return Q.finishLive(e)}function he(e){if(e.area===`frames`)return Object.freeze({kind:`frames`,request:e,use:c});if(e.area===`memory`)return e.action===`snapshot`?Object.freeze({kind:`memory-snapshot`,request:e,use:a}):Object.freeze({kind:`memory-sample`,request:e,use:l});if(e.area===`trace`)return e.action===`start`?Object.freeze({kind:`capture-start`,request:e,use:o}):Object.freeze({kind:`capture-stop`,request:e});switch(e.action){case`start`:return Object.freeze({kind:`capture-start`,request:e,use:o});case`stop`:return Object.freeze({kind:`capture-stop`,request:e});case`report`:return Object.freeze({kind:`profile-report`,request:e,use:s})}}function ge(t){let n=t.positionals??[],r=n[0]?.toLowerCase();if(r===`frames`){let i=n[1]?.toLowerCase();if(i!==void 0&&i!==`sample`||n.length>2||t.kind!==void 0)throw new e(`INVALID_ARGS`,`perf action must be frames, memory sample|snapshot, cpu profile start|stop|report, or trace start|stop`);return Object.freeze({area:r,action:`sample`})}if(r===`memory`)return _e(n,t);if(r===`cpu`)return ve(n,t.outPath);if(r===`trace`)return ye(n,t.outPath);throw new e(`INVALID_ARGS`,`perf requires frames, memory, cpu, or trace`)}function _e(t,n){let r=(t[1]??`sample`).toLowerCase();if(r!==`sample`&&r!==`snapshot`)throw new e(`INVALID_ARGS`,`perf memory requires sample or snapshot`);if(n.kind!==void 0&&r!==`snapshot`)throw new e(`INVALID_ARGS`,`--kind is only supported with perf memory snapshot`);if(r===`sample`&&t.length>2)throw new e(`INVALID_ARGS`,`perf memory sample does not accept additional positionals`);if(r===`snapshot`&&t.length>3)throw new e(`INVALID_ARGS`,`perf memory snapshot accepts at most one positional kind`);let i=n.kind??t[2];if(i!==void 0&&!u(i))throw new e(`INVALID_ARGS`,`perf memory snapshot --kind must be android-hprof or memgraph`);return Object.freeze({area:`memory`,action:r,...i===void 0?{}:{kind:i},...n.outPath===void 0?{}:{outPath:n.outPath}})}function ve(t,n){if(t[1]?.toLowerCase()!==`profile`)throw new e(`INVALID_ARGS`,`perf cpu requires profile`);let r=t[2]?.toLowerCase();if(r!==`start`&&r!==`stop`&&r!==`report`)throw new e(`INVALID_ARGS`,`perf cpu profile action must be start, stop, or report`);let i=t[3]?.toLowerCase();if(i!==`xctrace`&&i!==`simpleperf`)throw new e(`INVALID_ARGS`,`perf cpu profile requires --kind xctrace or simpleperf`);let a=n??t[5];return Object.freeze({area:`cpu`,subject:`profile`,action:r,kind:i,...t[4]?{template:t[4]}:{},...a?{outPath:a}:{},...t[6]?{tracePath:t[6]}:{}})}function ye(t,n){let r=t[1]?.toLowerCase();if(r!==`start`&&r!==`stop`)throw new e(`INVALID_ARGS`,`perf trace action must be start or stop`);let i=t[2]?.toLowerCase();if(i!==`xctrace`&&i!==`perfetto`)throw new e(`INVALID_ARGS`,`perf trace requires --kind xctrace or perfetto`);let a=n??t[4];return Object.freeze({area:`trace`,action:r,kind:i,...t[3]?{template:t[3]}:{},...a?{outPath:a}:{}})}export{se as _,Q as a,fe as c,V as d,J as f,G as g,le as h,me as i,oe as l,U as m,he as n,de as o,W as p,$ as r,Z as s,ge as t,B as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{O as e,S as t,m as n,w as r}from"./owner-identity.js";import{i}from"./verified-file.js";import{u as a}from"./exec.js";import"./file.js";import"./command.js";import"./process.js";import{p as o}from"./src7.js";import s from"node:fs";import c from"node:path";function l(e){let t=c.resolve(e.sessionsDir),n=c.resolve(e.pathname);if(c.basename(n)!==e.basename)throw Error(`${e.label} is outside the daemon-owned sessions directory`);if(s.existsSync(t)&&s.existsSync(c.dirname(n))){let r=s.realpathSync.native(t),i=s.realpathSync.native(c.dirname(n));if(i!==r&&!i.startsWith(`${r}${c.sep}`))throw Error(`${e.label} resolves outside the daemon-owned sessions directory`);return c.join(i,e.basename)}if(n!==t&&!n.startsWith(`${t}${c.sep}`))throw Error(`${e.label} is outside the daemon-owned sessions directory`);return n}const u=`app-log.pid`;function d(e,t={}){let n=c.resolve(e),r=t.launch??h;return Object.freeze({start:async(e,t)=>await m(n,e,r,t),readMarker:async e=>T(n,e),clearMarker:async e=>D(n,e),inspect:async e=>k(e),terminate:async e=>await A(e)})}async function f(e){let t=[],n=[];if(!s.existsSync(e))return{recovered:t,retained:n};let r=c.resolve(e);for(let e of s.readdirSync(r,{withFileTypes:!0})){if(!e.isDirectory())continue;let i=c.join(r,e.name);if(s.existsSync(c.join(i,`app-log.resource.json`)))continue;let a=c.join(i,u),o=T(r,a);if(o.status!==`missing`){if(o.status===`invalid`){n.push({markerPath:a,reason:`invalid`,message:o.message});continue}if(await A(o.marker)===`ownership-lost`){let e=p(o.marker.command);n.push({markerPath:a,reason:`ownership-lost`,...e?{device:e}:{}});continue}D(r,a),t.push(a)}}return Object.freeze({recovered:Object.freeze(t),retained:Object.freeze(n)})}function p(e){let t=/(?:^|\s)(?:\S*\/)?adb\s+-s\s+([^\s]+)/.exec(e)?.[1];if(t)return Object.freeze({id:t,family:`android`,kind:t.startsWith(`emulator-`)?`emulator`:`device`,target:`mobile`});let n=/(?:^|\s)xcrun\s+(?:--set\s+\S+\s+)?simctl\s+spawn\s+([^\s]+)/.exec(e)?.[1];if(n)return Object.freeze({id:n,family:`apple`,appleOs:`ios`,kind:`simulator`,target:`mobile`});let r=/(?:^|\s)xcrun\s+devicectl\b[^\n]*?\s--device\s+([^\s]+)/.exec(e)?.[1];if(r)return Object.freeze({id:r,family:`apple`,appleOs:`ios`,kind:`device`,target:`mobile`,iosPhysicalDeviceBackend:`coredevice`})}async function m(e,t,n,r){_(e,t.markerPath),r?.throwIfAborted();let i=await n(t.command,r),a=i.child,o=v(a,t.output),s=await y(e,t.markerPath,i),c=i.wait.then(async e=>(await o(),e)).finally(()=>{t.markerPath&&s&&S(e,t.markerPath,s)}),l=b(a,c);return{marker:s,wait:c,terminate:l,[Symbol.asyncDispose]:l}}function h(e,t){let n=g(e);return a(n.executable,[...n.args],{allowFailure:n.allowFailure,cwd:n.cwd,env:n.env?{...process.env,...n.env}:void 0,captureOutput:!1,signal:t})}function g(e){return e.kind===`host`?e.request:{executable:`adb`,args:[`-s`,e.serial,...e.args],...e.options}}function _(e,t){if(t&&T(e,t).status!==`missing`)throw Error(`Existing app-log process marker evidence must be recovered before start`)}function v(e,t){let n=Promise.resolve(),r,i=i=>{n=n.then(async()=>await t.write(i)).catch(t=>{r??=t,typeof e.exitCode!=`number`&&e.kill(`SIGKILL`)})};return e.stdout?.on(`data`,i),e.stderr?.on(`data`,i),async()=>{if(await n,r!==void 0)throw r}}async function y(e,t,n){let r=n.child.pid?await w(n.child.pid):void 0;try{if(!r)throw Error(`Managed app-log process did not expose a complete ownership marker`);return t&&E(e,t,r),r}catch(e){throw n.child.kill(`SIGKILL`),await n.wait.catch(()=>void 0),e}}function b(e,t){let n;return async()=>await(n??=(async()=>{typeof e.exitCode!=`number`&&(e.kill(`SIGINT`),await x(t,2e3)||e.kill(`SIGKILL`),await t.catch(()=>void 0))})())}async function x(e,t){return await new Promise(n=>{let r=setTimeout(()=>n(!1),t),i=()=>{clearTimeout(r),n(!0)};e.then(i,i)})}function S(e,t,n){let r=T(e,t);r.status===`decoded`&&r.marker.pid===n.pid&&r.marker.startTime===n.startTime&&r.marker.command===n.command&&D(e,t)}function C(e){let n=r(e),i=t(e);if(!(!n||!i))return Object.freeze({pid:e,startTime:n,command:i})}async function w(e){for(let t=0;t<5;t+=1){let t=C(e);if(t)return t;await new Promise(e=>setTimeout(e,10))}}function T(e,t){let n=O(e,t),r;try{let e=i(n);if(e===void 0)return{status:`missing`};r=e}catch(e){return{status:`invalid`,message:e instanceof Error?e.message:`App-log process marker is invalid`}}try{let e=JSON.parse(s.readFileSync(r,`utf8`));return o(e)}catch(e){return{status:`invalid`,message:e instanceof Error?e.message:`App-log process marker is invalid`}}finally{s.closeSync(r)}}function E(e,t,n){let r=O(e,t);if(T(e,r).status!==`missing`)throw Error(`Existing app-log process marker evidence must be recovered before replacement`);s.mkdirSync(c.dirname(r),{recursive:!0});let i=`${r}.${process.pid}.${Date.now()}.tmp`,a,o=!1,l=!1;try{a=s.openSync(i,`wx`,384),s.writeFileSync(a,`${JSON.stringify(n)}\n`),s.fsyncSync(a),s.closeSync(a),a=void 0,s.linkSync(i,r),o=!0,s.unlinkSync(i);let e=s.openSync(c.dirname(r),`r`);try{s.fsyncSync(e)}finally{s.closeSync(e)}l=!0}finally{if(a!==void 0)try{s.closeSync(a)}catch{}if(!l)for(let e of o?[r,i]:[i])try{s.unlinkSync(e)}catch{}}}function D(e,t){let n=O(e,t);try{s.unlinkSync(n)}catch(e){if(e.code!==`ENOENT`)throw e}}function O(e,t){return l({sessionsDir:e,pathname:t,basename:u,label:`App-log process marker`})}function k(e){return n(e.pid)?j(e)?`owned-alive`:`ownership-lost`:`missing`}async function A(t){if(!n(t.pid))return`already-missing`;if(!j(t))return`ownership-lost`;try{process.kill(t.pid,`SIGTERM`)}catch{return`already-missing`}if(!await e(t.pid,2e3)){if(!j(t))return`ownership-lost`;try{process.kill(t.pid,`SIGKILL`)}catch{return`already-missing`}await e(t.pid,2e3)}return n(t.pid)?`ownership-lost`:`terminated`}function j(e){return!e.startTime||!e.command?!1:r(e.pid)===e.startTime&&t(e.pid)===e.command}export{f as n,l as r,d as t};
|
|
@@ -2,4 +2,4 @@ import{P as e}from"./sdk-contracts.js";import{r as t}from"./diagnostics.js";impo
|
|
|
2
2
|
`);o=t.pop()??``;for(let e of t)await T(r,w(`${e}\n`,a))};return{write:async e=>await u(async()=>await d(pe(e))),[Symbol.asyncDispose]:async()=>{c??=u(async()=>{if(o&&=(await T(r,w(o,a)),``),await me(r),i)throw i}),await c}}}async function de(e,t,n){if(t=C(e,t),!Number.isInteger(n)||n<1||n>1048576)throw TypeError(`App-log tail size must be between 1 byte and 1 MiB`);let r=c(t);if(r===void 0)return``;let i=S.fstatSync(r).size,a=Math.min(i,n),o=i-a,s=+(o>0),l=Buffer.alloc(a+s);try{S.readSync(r,l,0,l.length,o-s)}finally{S.closeSync(r)}let u=l.subarray(s).toString(`utf8`);if(s===0||l[0]===10)return u;let d=u.indexOf(`
|
|
3
3
|
`);return d<0?``:u.slice(d+1)}function C(e,t){return ae({sessionsDir:e,pathname:t,basename:`app.log`,label:`App-log output`})}function fe(){return(process.env.AGENT_DEVICE_APP_LOG_REDACT_PATTERNS??``).split(`,`).map(e=>e.trim()).filter(Boolean).flatMap(e=>{try{return[new RegExp(e,`gi`)]}catch{return[]}})}function w(e,t){return t.reduce((e,t)=>e.replace(t,`[REDACTED]`),e)}function pe(e){return typeof e==`string`?e:Buffer.from(e).toString(`utf8`)}async function T(e,t){t&&await new Promise((n,r)=>{e.write(t,e=>e?r(e):n())})}async function me(e){e.closed||await new Promise((t,n)=>{e.once(`error`,n),e.end(()=>{e.off(`error`,n),t()})})}function he(e){return Object.freeze({appLogs:Object.freeze({resolveSession:e.resolveSessionArtifacts,readRecent:async(t,n)=>{let{outputPath:r}=e.resolveSessionArtifacts(t);return ge(r,n)},readProcessMarker:async t=>{let{pidPath:n}=e.resolveSessionArtifacts(t);return await e.processes.readMarker(n)}}),networkTransports:Object.freeze({resolve:e.resolveTransport})})}function ge(e,t){if(!Number.isInteger(t)||t<1||t>2e4)throw TypeError(`Network app-log scan lines must be between 1 and 20000`);let n=c(e);if(n===void 0)return Object.freeze({path:e,exists:!1,text:``,skippedLines:0});try{let r=E(S.readFileSync(n,`utf8`),t);return Object.freeze({path:e,exists:!0,...r})}finally{S.closeSync(n)}}function E(e,t){let n=e.split(`
|
|
4
4
|
`),r=Math.max(0,n.length-t);return Object.freeze({text:n.slice(r).join(`
|
|
5
|
-
`),skippedLines:r})}function D(e={}){let t=Object.freeze({resolve:async e=>{let{createAndroidScreenRecordingTransport:t}=await import(`./platform-runtime-screen-recording-android-host.js`);return await t(e)}}),n=Object.freeze({resolve:async e=>{let{resolveWebScreenRecordingTransport:t}=await import(`./platform-runtime-screen-recording-web-host.js`);return await t(e)}}),r=Object.freeze({prepare:async e=>{let{createScreenRecordingOutputHost:t}=await import(`./platform-runtime-screen-recording-output-host.js`);await t().prepare(e)},copy:async e=>{let{createScreenRecordingOutputHost:t}=await import(`./platform-runtime-screen-recording-output-host.js`);await t().copy(e)},remove:async e=>{let{createScreenRecordingOutputHost:t}=await import(`./platform-runtime-screen-recording-output-host.js`);return await t().remove(e)}}),i=Object.freeze({sniff:async e=>{let{createScreenRecordingFinalizer:t}=await import(`./platform-runtime-screen-recording-finalizer-host.js`);await t().sniff(e)},complete:async(e,t)=>{let{createScreenRecordingFinalizer:n}=await import(`./platform-runtime-screen-recording-finalizer-host.js`);return await n().complete(e,t)}}),a=e.ownedProcesses??Object.freeze({replace:()=>{},clear:()=>{}});return Object.freeze({apple:O(),android:t,harmony:k(),web:n,outputs:r,finalize:i,ownedProcesses:a})}function O(){let e=async()=>{let{createAppleScreenRecordingHost:e}=await import(`./platform-runtime-screen-recording-apple-host.js`);return e()};return Object.freeze({availability:async t=>(await e()).availability(t),runRunner:async(t,n,r)=>await(await e()).runRunner(t,n,r),startSimulator:async(t,n,r)=>await(await e()).startSimulator(t,n,r),inspectProcess:async t=>await(await e()).inspectProcess(t),terminateProcess:async t=>await(await e()).terminateProcess(t),inspectRunner:async(t,n,r)=>await(await e()).inspectRunner(t,n,r),retrieveRunnerRecording:async(t,n,r,i)=>await(await e()).retrieveRunnerRecording(t,n,r,i),captureClockAnchor:async(t,n,r)=>await(await e()).captureClockAnchor(t,n,r),isRunnerBundleId:async t=>await(await e()).isRunnerBundleId(t)})}function k(){let e=async()=>{let{createHarmonyScreenRecordingHost:e}=await import(`./platform-runtime-screen-recording-harmony-host.js`);return e()};return Object.freeze({start:async(t,n,r)=>await(await e()).start(t,n,r),stop:async(t,n)=>await(await e()).stop(t,n),findMedia:async(t,n,r)=>await(await e()).findMedia(t,n,r),stageMedia:async(t,n,r)=>await(await e()).stageMedia(t,n,r),stagedFileSize:async(t,n,r)=>await(await e()).stagedFileSize(t,n,r),pull:async(t,n,r)=>await(await e()).pull(t,n,r),remove:async(t,n,r)=>await(await e()).remove(t,n,r),removeMedia:async(t,n,r)=>await(await e()).removeMedia(t,n,r)})}function A(e={}){let t=e.ownedProcesses??Object.freeze({replace:()=>{},clear:()=>{}});return Object.freeze({hostCapture:Object.freeze({info:Object.freeze({source:`system-audio`,backend:`macos-screencapturekit`,sourceCount:1,notes:j}),start:async e=>{let{startMacOsAudioProbeProcess:t}=await import(`./macos-facade.js`),n=await t(e),r=await b(n.child.pid??void 0);return Object.freeze({...r===void 0?{}:{marker:r},wait:n.wait,terminate:async()=>{n.child.kill(`SIGTERM`),await n.wait.catch(()=>{})}})},inspectProcess:async e=>x(e),terminateProcess:async e=>await y([e])}),web:Object.freeze({resolve:async e=>{if(e.platform!==`web`)return;let{resolveWebProvider:t}=await import(`./src6.js`).then(e=>e.i),n=await t(),r=n.probeAudio?.bind(n);if(r)return Object.freeze({probe:async e=>await r({action:e.action,durationMs:e.durationMs,bucketMs:e.bucketMs})})}}),ownedProcesses:t})}function j(e){return[`Audio probe samples host system audio through ScreenCaptureKit for this ${a(e)?`iOS simulator`:e.platform===`android`?`Android emulator`:`macOS session`}; it is not app-instrumented audio.`,`Screen Recording permission is required for host system audio capture.`,`Other audible host apps can contribute to the measured buckets.`]}const M=f,N=async()=>await import(`./perf-facade.js`),P=Object.freeze({resourceKind:p,version:1,encode:e=>e,decode:Te});async function F(t,n,r){if(r.kind!==`xctrace`)throw H(`Apple`,`xctrace`,r.kind);let i=r.template??(r.mode===`cpu-profile`?`Time Profiler`:`Animation Hitches`),a=await N(),o=await a.startAppleXctracePerfCapture({device:t,appBundleId:r.appId,mode:r.mode,template:i,outPath:r.outPath}),s=await b(o.child.pid??void 0);if(!s)throw await a.cleanupAppleXctracePerfCapture(o).catch(()=>{}),new e(`COMMAND_FAILED`,`Apple xctrace exposed no exact process identity`);return L(t,n,r,{family:`apple`,marker:s,capture:Ce(o)},_e(o),z(`started`,o))}async function I(e,t,n){let r=await M(),i;if(n.mode===`cpu-profile`){if(n.kind!==`simpleperf`)throw H(`Android`,`simpleperf`,n.kind);i=await r.startAndroidSimpleperfProfile(e,n.appId,n.outPath)}else{if(n.kind!==`perfetto`)throw H(`Android`,`perfetto`,n.kind);i=await r.startAndroidPerfettoTrace(e,n.appId,n.outPath)}return L(e,t,n,{family:`android`,capture:i},ve(e,i),B(i))}function L(e,t,n,i,a,o){return Object.freeze({pendingHandle:new te(a),envelope:h({resourceKind:p,sessionId:n.sessionId,device:r(e),owner:t,fence:n.fence,lifecycle:`open`,descriptor:m(P,i)}),response:o})}function _e(e){return R({initialOutPath:e.outPath,inspect:()=>z(`started`,e),finish:async t=>await N().then(async n=>z(`stopped`,await n.stopAppleXctracePerfCapture(e,t))),cleanup:async()=>await N().then(async t=>{await t.cleanupAppleXctracePerfCapture(e)})})}function ve(e,t){return R({initialOutPath:t.outPath,inspect:()=>B(t),finish:async n=>{let r=await M();return B(t.kind===`simpleperf`?await r.stopAndroidSimpleperfProfile(e,t,n):await r.stopAndroidPerfettoTrace(e,t,n))},cleanup:async()=>{await(await M()).cleanupAndroidNativePerfSession(e,t)}})}function R(e){let t=e.initialOutPath,n,r,i=async()=>await e.cleanup().then(()=>({status:`cleaned`}),V);return Object.freeze({inspect:e.inspect,setOutputPath:e=>{t=e},finish:async()=>n??=e.finish(t).then(e=>({status:`completed`,result:e}),e=>{throw n=void 0,e}),forceCleanup:async()=>r??=i(),[Symbol.asyncDispose]:async()=>{we(await(r??=i()))}})}async function ye(e){let t=g(e,P);if(t.status!==`decoded`||t.descriptor.family!==`apple`)return{status:`cleanup-pending`,reason:`manual-recovery-required`};let n=await x(t.descriptor.marker);if(n===`ownership-lost`)return{status:`cleanup-pending`,reason:`ownership-fence-lost`};if(n===`missing`)return{status:`already-missing`};let r=await y([t.descriptor.marker]);return r===`terminated`?{status:`cleaned`}:r===`already-missing`?{status:`already-missing`}:{status:`cleanup-pending`,reason:`ownership-fence-lost`}}async function be(e){let t=g(e,P);if(t.status!==`decoded`)return t;if(t.descriptor.family!==`apple`)return{status:`unreattachable`,reason:`descriptor-invalid`};let n=await x(t.descriptor.marker);return n===`owned-alive`?{status:`unreattachable`,reason:`transport-not-reattachable`}:n===`ownership-lost`?{status:`unreattachable`,reason:`ownership-fence-lost`}:{status:`missing`}}async function xe(e){let t=g(e,P);return t.status===`decoded`?t.descriptor.family===`android`?{status:`unreattachable`,reason:`transport-not-reattachable`}:{status:`unreattachable`,reason:`descriptor-invalid`}:t}async function Se(e,t){let n=g(t,P);if(n.status!==`decoded`||n.descriptor.family!==`android`)return{status:`cleanup-pending`,reason:`manual-recovery-required`};try{return await(await M()).cleanupAndroidNativePerfSession(e,n.descriptor.capture),{status:`cleaned`}}catch(e){return V(e)}}function Ce(e){let{child:t,wait:n,...r}=e;return r}function z(e,t){return{perf:e,kind:t.kind,mode:t.mode,template:t.template,outPath:t.outPath,appBundleId:t.appBundleId,deviceId:t.deviceId,platform:t.platform,targetPids:t.targetPids,targetProcesses:t.targetProcesses,startedAt:t.startedAt,endedAt:t.endedAt}}function B(e){let t={action:e.action,platform:`android`,type:e.type,packageName:e.packageName,appPid:e.appPid,profilerPid:e.profilerPid,state:e.state,startedAt:new Date(e.startedAt).toISOString(),stoppedAt:typeof e.stoppedAt==`number`?new Date(e.stoppedAt).toISOString():void 0,outPath:e.outPath,sizeBytes:e.sizeBytes,remotePath:e.remotePath,method:e.method,message:e.message,...e.action===`stop`?{durationMs:e.durationMs,summary:e.summary}:{}};return e.kind===`simpleperf`?{...t,kind:`simpleperf`,mode:`cpu-profile`}:{...t,kind:`perfetto`,mode:`trace`}}function V(e){return{status:`cleanup-pending`,reason:`cleanup-unconfirmed`,message:e instanceof Error?e.message:String(e)}}function we(t){if(t.status===`cleanup-pending`)throw new e(`COMMAND_FAILED`,t.message??`Perf capture cleanup could not be confirmed`,{reason:t.reason})}function H(t,n,r){return new e(`INVALID_ARGS`,`${t} native perf requires --kind ${n}, not ${r}`)}function Te(e){return e.family===`android`&&Ee(e.capture)?{status:`decoded`,descriptor:{family:`android`,capture:e.capture}}:e.family===`apple`&&ke(e.capture)&&Me(e.marker)?{status:`decoded`,descriptor:{family:`apple`,capture:e.capture,marker:e.marker}}:{status:`invalid`,message:`Perf capture descriptor body is invalid`}}function Ee(e){return G(e)?De(e.kind,e.type)&&U(e,[`packageName`,`appPid`,`profilerPid`,`remotePath`,`outPath`])&&typeof e.startedAt==`number`&&Oe(e.state)&&Ae(e,[`stoppedAt`,`sizeBytes`]):!1}function De(e,t){return e===`simpleperf`&&t===`cpu-profile`||e===`perfetto`&&t===`trace`}function Oe(e){return e===`running`||e===`stopped`}function ke(e){return G(e)&&e.kind===`xctrace`&&(e.mode===`cpu-profile`||e.mode===`trace`)&&U(e,[`template`,`outPath`,`appBundleId`,`deviceId`,`startedAt`])&&n(e.platform)&&je(e.targetProcesses)&&W(e.targetPids)}function U(e,t){return t.every(t=>typeof e[t]==`string`)}function Ae(e,t){return t.every(t=>e[t]===void 0||typeof e[t]==`number`)}function je(e){return Array.isArray(e)&&e.every(e=>typeof e==`string`)}function W(e){return Array.isArray(e)&&e.every(e=>typeof e==`number`)}function G(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Me(e){return G(e)&&typeof e.pid==`number`&&typeof e.startTime==`string`&&typeof e.command==`string`}const K=f,Ne=f,Pe=f,q=async()=>await import(`./perf-facade.js`),J=async()=>await import(`./perf-facade.js`),Fe=async()=>await import(`./perf-facade.js`),Ie=async()=>await import(`./src4.js`).then(e=>e.b);function Le(){let e=Object.freeze({sampleFrames:async(e,t)=>await(await q()).sampleAppleFramePerf(e,t),frameSampling:async e=>(await J()).buildAppleFrameSamplingMetadata(e),sampleMemory:async(e,t)=>await(await q()).sampleAppleMemoryPerf(e,t),memorySampling:async e=>(await J()).buildAppleMemorySamplingMetadata(e),memorySnapshotSupport:async e=>(await J()).buildAppleMemorySnapshotSupport(e),captureMemorySnapshot:async(e,t,n)=>await(await q()).captureAppleMemorySnapshot(e,t,n),start:async(e,t,n)=>await F(e,t,n),reattach:async(e,{envelope:t})=>await be(t),cleanup:async(e,{envelope:t})=>await ye(t),writeProfileReport:async e=>await(await Fe()).writeAppleXctracePerfReport({tracePath:e.tracePath,outPath:e.outPath,template:e.template,appBundleId:e.appId})}),t=Object.freeze({sampleFrames:async(e,t)=>await(await Ne()).sampleAndroidFramePerf(e,t),sampleMemory:async(e,t)=>await(await K()).sampleAndroidMemoryPerf(e,t),captureMemorySnapshot:async(e,t,n)=>await(await K()).captureAndroidHeapSnapshot(e,t,n),start:async(e,t,n)=>await I(e,t,n),reattach:async(e,{envelope:t})=>await xe(t),cleanup:async(e,{envelope:t})=>await Se(e,t),writeProfileReport:async(e,t)=>await(await Pe()).writeAndroidSimpleperfReport(e,Re(t.profile,t.tracePath),t.outPath)}),n=Object.freeze({sampleMemory:async(e,t)=>await(await Ie()).sampleHarmonyMemoryPerf(e,t)});return Object.freeze({apple:e,android:t,harmony:n})}function Re(t,n){if(t?.kind!==`simpleperf`||t.type!==`cpu-profile`||t.mode!==`cpu-profile`)throw new e(`INVALID_ARGS`,`Stopped Simpleperf profile metadata is malformed.`);return{type:`cpu-profile`,kind:`simpleperf`,packageName:t.packageName,appPid:t.appPid,profilerPid:t.profilerPid,remotePath:t.remotePath,outPath:n,startedAt:t.startedAt?Date.parse(t.startedAt):Date.now(),state:`stopped`,...t.stoppedAt?{stoppedAt:Date.parse(t.stoppedAt)}:{},...t.sizeBytes===void 0?{}:{sizeBytes:t.sizeBytes}}}function ze(){return Object.freeze({ensureConnected:async(e,t)=>{t.throwIfAborted();try{let{resolveIosPhysicalDeviceControl:n}=await import(`./physical-device-facade.js`);await n(e).ensureReady(e,t),t.throwIfAborted()}catch(e){throw t.throwIfAborted(),e}}})}function Be(){return Object.freeze({keepHot:e=>{import(`./runner-operations-facade.js`).then(({prewarmAppleRunnerCache:t})=>t(e,{})).catch(()=>{})},wasRecentlyObservedBooted:async e=>{let{wasSimulatorRecentlyObservedBooted:t}=await import(`./simulator-facade.js`);return t(e)},markBooted:e=>{import(`./simulator-facade.js`).then(({markSimulatorBooted:t})=>t(e)).catch(()=>{})}})}function Ve(){return Object.freeze({discover:async(e,t)=>{t.throwIfAborted();let n=await ne(e);return t.throwIfAborted(),n},launch:(e,t)=>{let n=[`-avd`,e];return t&&n.push(`-no-window`,`-no-audio`),u(`emulator`,n)},terminate:async e=>{await s({pids:[e],termTimeoutMs:1500,killTimeoutMs:1500})}})}function He(e,t,n=()=>{}){let r,i,a=async()=>(r??=t.apple({appleTools:e.appleTools}),await r),o=async()=>(i??=t.android({commands:e.commands}),await i),s=Object.freeze({shutdownTarget:async(e,t)=>(n(),await(await a()).shutdownTarget(e,t))}),c=Object.freeze({shutdownTarget:async(e,t)=>(n(),await(await o()).shutdownTarget(e,t))}),l=Object.freeze({canShutdownTarget:async e=>await Ue(e,a,o),shutdownTarget:async e=>(n(),await We(e,a,o))});return Object.freeze({apple:s,android:c,close:l})}async function Ue(e,t,n){return e.platform===`apple`?(await t()).canShutdownTarget(e):e.platform===`android`&&(await n()).canShutdownTarget(e)}async function We(e,t,n){let r=new AbortController().signal;return e.platform===`apple`?await(await t()).shutdownTarget(e,r):e.platform===`android`?await(await n()).shutdownTarget(e,r):{success:!1,exitCode:-1,stdout:``,stderr:`Cannot shut down unsupported device ${e.platform}/${e.kind}`}}function Ge(){return Object.freeze({withInvalidatedAppResolutionCache:async(e,t)=>{let{invalidateIosAppResolutionCache:n}=await import(`./app-resolution-facade.js`);return await n(e,t)},prepareArtifact:async(e,t)=>{let{prepareIosInstallArtifact:n}=await import(`./install-artifact-facade.js`);return await n(e.source,t)},resolveAppBundleId:async(e,t)=>{let{resolveIosApp:n}=await import(`./app-resolution-facade.js`);return await n(e,t)}})}function Ke(){return Object.freeze({bundletoolJar:process.env.AGENT_DEVICE_BUNDLETOOL_JAR?.trim()||void 0,withInvalidatedAppResolutionCache:async(e,t)=>{let{withAndroidAppResolutionCacheInvalidated:n}=await f();return await n(e,t)},prepareArtifact:async(e,t)=>{let{prepareAndroidInstallArtifact:n}=await f();return await n(e.source,t)},resolveAppPackage:async(e,t)=>{let{resolveAndroidApp:n}=await f(),r=await n(e,t);if(r.type===`intent`){let{AppError:e}=await import(`./sdk-contracts.js`).then(e=>e.U);throw new e(`INVALID_ARGS`,`App uninstall requires a package name, not an intent`)}return r.value}})}function qe(){return Object.freeze({probeClipboardShellSupport:async(e,t)=>{try{let{runAndroidShell:n,androidClipboardShellSupportForResult:r}=await f();return await r(await n(e,[`cmd`,`clipboard`,`get`,`text`],{allowFailure:!0,signal:t}))}catch{return`probe-failed`}},runAdb:async(e,t,n,r)=>{let{runAndroidAdb:i}=await f(),a=await i(e,t,{allowFailure:n.allowFailure,timeoutMs:n.timeoutMs,signal:r});return{stdout:a.stdout,stderr:a.stderr,exitCode:a.exitCode}},installPackage:async(e,t,n,r)=>{let{resolveAndroidAdbProvider:i}=await f(),a=i(e),o=a.install?await a.install(t,{replace:n.replace,signal:r}):await a.exec([`install`,...n.replace?[`-r`]:[],t],{signal:r});return{stdout:o.stdout,stderr:o.stderr,exitCode:o.exitCode}},installBundle:async(e,t,n,r)=>{let{resolveAndroidAdbProvider:i}=await f(),a=i(e).installBundle;return a?(await a(t,{mode:n,signal:r}),!0):!1}})}let Je;const Y=()=>Je??=import(`./runner-operations-facade.js`);let Ye;const X=()=>Ye??=import(`./platform-runtime-runtime-hints.js`);let Xe;const Ze=()=>Xe??=import(`./platform-runtime-open-target.js`).then(e=>e.t);let Qe;const $e=()=>Qe??=import(`./app-resolution-facade.js`);let et;const Z=()=>et??=import(`./macos-facade.js`);let tt;const nt=()=>tt??=import(`./retry.js`).then(e=>e.t);function rt(){return Object.freeze({resolveOpenTarget:async(e,t)=>await it(e,t),prewarmRunnerCache:async(e,t,n)=>{let{prewarmAppleRunnerCache:r}=await Y();await r(e,Q(t,n))},prewarmRunnerSession:async(e,t,n,r,i)=>{let{prewarmIosRunnerSession:a}=await Y();await a(e,{...Q(t,n),propagateError:r,...i})},notifyRunnerAppRelaunched:async(e,t,n)=>{let{notifyIosRunnerAppRelaunched:r}=await Y();await r(e,Q(t,n))},stopRunnerSession:async e=>{let{stopIosRunnerSession:t}=await Y();await t(e)},hasLiveRunnerSession:async(e,t)=>{let{hasLiveIosRunnerSession:n}=await Y();return n(e,{requestId:t.requestId})},releaseSpeculativeRunner:async(e,t)=>{let{releaseSpeculativeIosRunnerSessionFor:n}=await Y();return await n(e,{requestId:t.requestId})},releaseRunnerOnClose:async(e,t)=>{let{releaseIosRunnerOnClose:n}=await Y();await n(e,t)},prepareRunner:async(e,t,n)=>{let{Deadline:r}=await nt(),{prepareIosRunner:i}=await Y(),a=Date.now();return await i(e,{...Q(t.execution,n),cleanStaleBundles:!0,buildTimeoutMs:t.timeoutMs,healthTimeoutMs:t.timeoutMs,prepareDeadline:r.fromTimeoutMs(t.timeoutMs,a),startupTimeoutMs:t.timeoutMs})},applyRuntimeHints:async(e,t)=>{let{applyRuntimeHintValues:n}=await X();await n({device:e,...t})},clearRuntimeHints:async(e,t)=>{let{clearRuntimeHintValues:n}=await X();await n({device:e,...t})},dismissCloseAlerts:async(e,t)=>await st(e,t),detachRunnerSessionsForShutdown:async()=>{let{detachIosRunnerSessionsForShutdown:e}=await Y();await e()},finalizeRunnerSessionsForShutdown:async()=>{let{stopAllIosRunnerSessions:e}=await Y();await e()}})}async function it(t,n){if(n.foreground){let n=await at(t);if(n)return n;throw new e(`AMBIGUOUS_MATCH`,`open --foreground requires exactly one running app on the selected iOS simulator.`,{reason:`foreground_app_ambiguous`,hint:`Pass an explicit app instead: agent-device open <app> --platform ios.`})}let r=await ot(t,n.surface),{resolveSessionAppBundleIdForTarget:i}=await Ze();return{appBundleId:r.appBundleId??await i(t,n.target,n.currentAppBundleId),appName:r.appName??n.target}}async function at(e){if(!a(e)||e.kind!==`simulator`)return;let{detectSoleRunningIosSimulatorApp:t}=await $e(),n=await t(e);return n?{appBundleId:n.bundleId,appName:n.name}:void 0}async function ot(e,t){if(!i(e)||t===`app`||t===`desktop`||t===`menubar`)return{};let{resolveFrontmostMacOsApp:n}=await Z(),r=await n();return{appBundleId:r.bundleId,appName:r.appName}}function Q(e,t){return{requestId:e.requestId,logPath:e.logPath,traceLogPath:e.traceLogPath,verbose:e.verbose,iosXctestrunFile:e.iosXctestrunFile,iosXctestDerivedDataPath:e.iosXctestDerivedDataPath,iosXctestEnvDir:e.iosXctestEnvDir,runnerLeaseContext:e.runnerLeaseContext,signal:t}}async function st(e,t){if(!i(e))return;let{runMacOsAlertAction:n}=await Z();await n(`dismiss`,t.surface===`frontmost-app`?{surface:`frontmost-app`}:t.appBundleId?{bundleId:t.appBundleId}:{})}let ct;const lt=()=>ct??=import(`./platform-runtime-open-target.js`).then(e=>e.t);let ut;const $=()=>ut??=import(`./platform-runtime-runtime-hints.js`);function dt(){return Object.freeze({resolveOpenTarget:async(e,t)=>await ft(e,t),inferOpenedAppBundleId:async(e,t,n)=>{if(n)return n;try{let{inferAndroidPackageAfterOpen:r}=await f();return await r(e,t,n)}catch{return n}},resetFramePerfStats:async(e,t)=>{let{resetAndroidFramePerfStats:n}=await f();await n(e,t)},applyRuntimeHints:async(e,t)=>{let{applyRuntimeHintValues:n}=await $();await n({device:e,...t})},clearRuntimeHints:async(e,t)=>{let{clearRuntimeHintValues:n}=await $();await n({device:e,...t})},activateTestIme:async(n,r)=>{let{activateAndroidTestIme:i}=await f(),a=await i(n,r);if(a.outcome===`helper-unavailable`){t({level:`warn`,phase:`android_test_ime_activate_failed`,data:{device:n.id,error:a.reason,...a.hint===void 0?{}:{hint:a.hint}}});return}if(a.persistFailed&&!(!a.alreadyActive&&!a.activated))throw new e(`COMMAND_FAILED`,`Android test IME recovery records could not be persisted for ${n.name??n.id}.`,{reason:`android_test_ime_recovery_fence_failed`,deviceId:n.id})},restoreTestIme:async(t,n)=>{let{restoreAndroidTestIme:r}=await f();if((await r(t,{stateDir:n.stateDir})).reason===`set-failed`)throw new e(`COMMAND_FAILED`,`Android test IME could not be restored on ${t.name??t.id}.`,{reason:`android_test_ime_restore_incomplete`,deviceId:t.id})},recoverTestImeStartup:async e=>{let{listAndroidAdbSerialsQuick:t,restoreOrphanedAndroidTestImeOnDaemonStartup:n}=await f();await n({stateDir:e.stateDir,listSerials:t})},hasTestImeRecoveryEvidence:async e=>{let{readAndroidTestImeRecoveryMarkers:t}=await f();return(await t(e)).length>0}})}async function ft(e,t){let{resolveSessionAppBundleIdForTarget:n}=await lt();return{appBundleId:await n(e,t.target,t.currentAppBundleId),appName:t.target}}function pt(){return Object.freeze({resolve:async(e,t)=>{let{getLocalInteractor:n}=await import(`./interactors.js`).then(e=>e.n);return await n(e,t)}})}function mt(e){return Object.freeze({recoverStartupResources:async t=>{await e.android.hasTestImeRecoveryEvidence(t.stateDir)&&await e.android.recoverTestImeStartup(t)},detachForDaemonShutdown:async()=>await e.apple.detachRunnerSessionsForShutdown(),finalizeDaemonShutdown:async()=>await e.apple.finalizeRunnerSessionsForShutdown()})}function ht(e){return Object.freeze({captureSurface:async(t,n,r)=>t.platform===`linux`?await e.linux(n,r):(gt(t),await e.macos(n,r)),presentIosAcquisition:async(e,t)=>{let{presentIosSnapshotAcquisition:n}=await import(`./ios-snapshot-runtime.js`);return await n(e,t)}})}function gt(e){if(e.platform!==`apple`||e.appleOs!==`macos`)throw TypeError(`Apple surface capture requires a non-app macOS surface`)}async function _t(e,t){let n=e?.surface===void 0?void 0:o(e.surface,`native`);if(!n)throw TypeError(`Apple surface capture requires a helper-routed macOS surface`);let{captureMacOsSurfaceSnapshot:r}=await import(`./macos-facade.js`);return await r({...e,surface:n},t)}function vt(e){let t=_(e.sessionsDir),n=Object.freeze({mode:`local`,start:t.start}),r=se(),i=Object.freeze({which:async e=>await d(e)?e:void 0,run:async(e,t)=>{let n=await ee(e.executable,ce(e),{allowFailure:e.allowFailure,cwd:e.cwd,env:e.env?{...process.env,...e.env}:void 0,signal:t,timeoutMs:e.timeoutMs});return{stdout:n.stdout,stderr:n.stderr,exitCode:n.exitCode}}}),a=he({resolveSessionArtifacts:e.resolveSessionArtifacts,processes:t,resolveTransport:async e=>{if(e.platform!==`web`)return Object.freeze({mode:`local`});let{resolveWebNetworkTransport:t}=await import(`./platform-runtime-network-web-transport.js`);return await t(e)}}),o=rt(),s=dt();return Object.freeze({commands:i,appleTools:r,toolchains:oe(),artifacts:Object.freeze({resolveSession:e.resolveSessionArtifacts}),outputs:Object.freeze({openAppend:async t=>await ue(e.sessionsDir,t),readTail:async(t,n)=>await de(e.sessionsDir,t,n)}),processes:t,processTransports:Object.freeze({resolve:async t=>{if(t.platform!==`android`)return n;let{resolveAndroidAppLogProcessTransport:r}=await import(`./platform-runtime-app-log-android-transport.js`);return r(e.sessionsDir,t,n)}}),...a,appleDeployment:Ge(),androidDeployment:Ke(),androidTools:qe(),temporaryFiles:Object.freeze({create:async e=>await v(e)}),deviceReadiness:Object.freeze({applePhysical:ze(),appleAutomation:Be(),androidEmulator:Ve()}),deviceShutdown:He({appleTools:r,commands:i},e.shutdownLoaders,e.assertShutdownAllowed),screenRecording:D({ownedProcesses:e.ownedProcesses}),audioProbe:A({ownedProcesses:e.ownedProcesses}),perf:Le(),snapshot:e.snapshot,localInteractors:pt(),appleApplications:o,androidApplications:s,applicationResources:mt({android:s,apple:o}),clock:Object.freeze({now:()=>Date.now(),sleep:async(e,t)=>{await le(e,void 0,t?{signal:t}:void 0)}})})}export{vt as createPlatformRuntimeHost,ht as createSnapshotRuntimeHost,_t as loadMacOsSurfaceSnapshot,ie as recoverLegacyAppLogMarkersAfterDaemonLock};
|
|
5
|
+
`),skippedLines:r})}function D(e={}){let t=Object.freeze({resolve:async e=>{let{createAndroidScreenRecordingTransport:t}=await import(`./platform-runtime-screen-recording-android-host.js`);return await t(e)}}),n=Object.freeze({resolve:async e=>{let{resolveWebScreenRecordingTransport:t}=await import(`./platform-runtime-screen-recording-web-host.js`);return await t(e)}}),r=Object.freeze({prepare:async e=>{let{createScreenRecordingOutputHost:t}=await import(`./platform-runtime-screen-recording-output-host.js`);await t().prepare(e)},copy:async e=>{let{createScreenRecordingOutputHost:t}=await import(`./platform-runtime-screen-recording-output-host.js`);await t().copy(e)},remove:async e=>{let{createScreenRecordingOutputHost:t}=await import(`./platform-runtime-screen-recording-output-host.js`);return await t().remove(e)}}),i=Object.freeze({sniff:async e=>{let{createScreenRecordingFinalizer:t}=await import(`./platform-runtime-screen-recording-finalizer-host.js`);await t().sniff(e)},complete:async(e,t)=>{let{createScreenRecordingFinalizer:n}=await import(`./platform-runtime-screen-recording-finalizer-host.js`);return await n().complete(e,t)}}),a=e.ownedProcesses??Object.freeze({replace:()=>{},clear:()=>{}});return Object.freeze({apple:O(),android:t,harmony:k(),web:n,outputs:r,finalize:i,ownedProcesses:a})}function O(){let e=async()=>{let{createAppleScreenRecordingHost:e}=await import(`./platform-runtime-screen-recording-apple-host.js`);return e()};return Object.freeze({availability:async t=>(await e()).availability(t),runRunner:async(t,n,r)=>await(await e()).runRunner(t,n,r),startSimulator:async(t,n,r)=>await(await e()).startSimulator(t,n,r),inspectProcess:async t=>await(await e()).inspectProcess(t),terminateProcess:async t=>await(await e()).terminateProcess(t),inspectRunner:async(t,n,r)=>await(await e()).inspectRunner(t,n,r),retrieveRunnerRecording:async(t,n,r,i)=>await(await e()).retrieveRunnerRecording(t,n,r,i),captureClockAnchor:async(t,n,r)=>await(await e()).captureClockAnchor(t,n,r),isRunnerBundleId:async t=>await(await e()).isRunnerBundleId(t)})}function k(){let e=async()=>{let{createHarmonyScreenRecordingHost:e}=await import(`./platform-runtime-screen-recording-harmony-host.js`);return e()};return Object.freeze({start:async(t,n,r)=>await(await e()).start(t,n,r),stop:async(t,n)=>await(await e()).stop(t,n),findMedia:async(t,n,r)=>await(await e()).findMedia(t,n,r),stageMedia:async(t,n,r)=>await(await e()).stageMedia(t,n,r),stagedFileSize:async(t,n,r)=>await(await e()).stagedFileSize(t,n,r),pull:async(t,n,r)=>await(await e()).pull(t,n,r),remove:async(t,n,r)=>await(await e()).remove(t,n,r),removeMedia:async(t,n,r)=>await(await e()).removeMedia(t,n,r)})}function A(e={}){let t=e.ownedProcesses??Object.freeze({replace:()=>{},clear:()=>{}});return Object.freeze({hostCapture:Object.freeze({info:Object.freeze({source:`system-audio`,backend:`macos-screencapturekit`,sourceCount:1,notes:j}),start:async e=>{let{startMacOsAudioProbeProcess:t}=await import(`./macos-facade.js`),n=await t(e),r=await b(n.child.pid??void 0);return Object.freeze({...r===void 0?{}:{marker:r},wait:n.wait,terminate:async()=>{n.child.kill(`SIGTERM`),await n.wait.catch(()=>{})}})},inspectProcess:async e=>x(e),terminateProcess:async e=>await y([e])}),web:Object.freeze({resolve:async e=>{if(e.platform!==`web`)return;let{resolveWebProvider:t}=await import(`./src6.js`).then(e=>e.i),n=await t(),r=n.probeAudio?.bind(n);if(r)return Object.freeze({probe:async e=>await r({action:e.action,durationMs:e.durationMs,bucketMs:e.bucketMs})})}}),ownedProcesses:t})}function j(e){return[`Audio probe samples host system audio through ScreenCaptureKit for this ${a(e)?`iOS simulator`:e.platform===`android`?`Android emulator`:`macOS session`}; it is not app-instrumented audio.`,`Screen Recording permission is required for host system audio capture.`,`Other audible host apps can contribute to the measured buckets.`]}const M=f,N=async()=>await import(`./perf-facade.js`),P=Object.freeze({resourceKind:p,version:1,encode:e=>e,decode:Te});async function F(t,n,r){if(r.kind!==`xctrace`)throw H(`Apple`,`xctrace`,r.kind);let i=r.template??(r.mode===`cpu-profile`?`Time Profiler`:`Animation Hitches`),a=await N(),o=await a.startAppleXctracePerfCapture({device:t,appBundleId:r.appId,mode:r.mode,template:i,outPath:r.outPath}),s=await b(o.child.pid??void 0);if(!s)throw await a.cleanupAppleXctracePerfCapture(o).catch(()=>{}),new e(`COMMAND_FAILED`,`Apple xctrace exposed no exact process identity`);return L(t,n,r,{family:`apple`,marker:s,capture:Ce(o)},_e(o),z(`started`,o))}async function I(e,t,n){let r=await M(),i;if(n.mode===`cpu-profile`){if(n.kind!==`simpleperf`)throw H(`Android`,`simpleperf`,n.kind);i=await r.startAndroidSimpleperfProfile(e,n.appId,n.outPath)}else{if(n.kind!==`perfetto`)throw H(`Android`,`perfetto`,n.kind);i=await r.startAndroidPerfettoTrace(e,n.appId,n.outPath)}return L(e,t,n,{family:`android`,capture:i},ve(e,i),B(i))}function L(e,t,n,i,a,o){return Object.freeze({pendingHandle:new te(a),envelope:h({resourceKind:p,sessionId:n.sessionId,device:r(e),owner:t,fence:n.fence,lifecycle:`open`,descriptor:m(P,i)}),response:o})}function _e(e){return R({initialOutPath:e.outPath,inspect:()=>z(`started`,e),finish:async t=>await N().then(async n=>z(`stopped`,await n.stopAppleXctracePerfCapture(e,t))),cleanup:async()=>await N().then(async t=>{await t.cleanupAppleXctracePerfCapture(e)})})}function ve(e,t){return R({initialOutPath:t.outPath,inspect:()=>B(t),finish:async n=>{let r=await M();return B(t.kind===`simpleperf`?await r.stopAndroidSimpleperfProfile(e,t,n):await r.stopAndroidPerfettoTrace(e,t,n))},cleanup:async()=>{await(await M()).cleanupAndroidNativePerfSession(e,t)}})}function R(e){let t=e.initialOutPath,n,r,i=async()=>await e.cleanup().then(()=>({status:`cleaned`}),V);return Object.freeze({inspect:e.inspect,setOutputPath:e=>{t=e},finish:async()=>n??=e.finish(t).then(e=>({status:`completed`,result:e}),e=>{throw n=void 0,e}),forceCleanup:async()=>r??=i(),[Symbol.asyncDispose]:async()=>{we(await(r??=i()))}})}async function ye(e){let t=g(e,P);if(t.status!==`decoded`||t.descriptor.family!==`apple`)return{status:`cleanup-pending`,reason:`manual-recovery-required`};let n=await x(t.descriptor.marker);if(n===`ownership-lost`)return{status:`cleanup-pending`,reason:`ownership-fence-lost`};if(n===`missing`)return{status:`already-missing`};let r=await y([t.descriptor.marker]);return r===`terminated`?{status:`cleaned`}:r===`already-missing`?{status:`already-missing`}:{status:`cleanup-pending`,reason:`ownership-fence-lost`}}async function be(e){let t=g(e,P);if(t.status!==`decoded`)return t;if(t.descriptor.family!==`apple`)return{status:`unreattachable`,reason:`descriptor-invalid`};let n=await x(t.descriptor.marker);return n===`owned-alive`?{status:`unreattachable`,reason:`transport-not-reattachable`}:n===`ownership-lost`?{status:`unreattachable`,reason:`ownership-fence-lost`}:{status:`missing`}}async function xe(e){let t=g(e,P);return t.status===`decoded`?t.descriptor.family===`android`?{status:`unreattachable`,reason:`transport-not-reattachable`}:{status:`unreattachable`,reason:`descriptor-invalid`}:t}async function Se(e,t){let n=g(t,P);if(n.status!==`decoded`||n.descriptor.family!==`android`)return{status:`cleanup-pending`,reason:`manual-recovery-required`};try{return await(await M()).cleanupAndroidNativePerfSession(e,n.descriptor.capture),{status:`cleaned`}}catch(e){return V(e)}}function Ce(e){let{child:t,wait:n,...r}=e;return r}function z(e,t){return{perf:e,kind:t.kind,mode:t.mode,template:t.template,outPath:t.outPath,appBundleId:t.appBundleId,deviceId:t.deviceId,platform:t.platform,targetPids:t.targetPids,targetProcesses:t.targetProcesses,startedAt:t.startedAt,endedAt:t.endedAt}}function B(e){let t={action:e.action,platform:`android`,type:e.type,packageName:e.packageName,appPid:e.appPid,profilerPid:e.profilerPid,state:e.state,startedAt:new Date(e.startedAt).toISOString(),stoppedAt:typeof e.stoppedAt==`number`?new Date(e.stoppedAt).toISOString():void 0,outPath:e.outPath,sizeBytes:e.sizeBytes,remotePath:e.remotePath,method:e.method,message:e.message,...e.action===`stop`?{durationMs:e.durationMs,summary:e.summary}:{}};return e.kind===`simpleperf`?{...t,kind:`simpleperf`,mode:`cpu-profile`}:{...t,kind:`perfetto`,mode:`trace`}}function V(e){return{status:`cleanup-pending`,reason:`cleanup-unconfirmed`,message:e instanceof Error?e.message:String(e)}}function we(t){if(t.status===`cleanup-pending`)throw new e(`COMMAND_FAILED`,t.message??`Perf capture cleanup could not be confirmed`,{reason:t.reason})}function H(t,n,r){return new e(`INVALID_ARGS`,`${t} native perf requires --kind ${n}, not ${r}`)}function Te(e){return e.family===`android`&&Ee(e.capture)?{status:`decoded`,descriptor:{family:`android`,capture:e.capture}}:e.family===`apple`&&ke(e.capture)&&Me(e.marker)?{status:`decoded`,descriptor:{family:`apple`,capture:e.capture,marker:e.marker}}:{status:`invalid`,message:`Perf capture descriptor body is invalid`}}function Ee(e){return G(e)?De(e.kind,e.type)&&U(e,[`packageName`,`appPid`,`profilerPid`,`remotePath`,`outPath`])&&typeof e.startedAt==`number`&&Oe(e.state)&&Ae(e,[`stoppedAt`,`sizeBytes`]):!1}function De(e,t){return e===`simpleperf`&&t===`cpu-profile`||e===`perfetto`&&t===`trace`}function Oe(e){return e===`running`||e===`stopped`}function ke(e){return G(e)&&e.kind===`xctrace`&&(e.mode===`cpu-profile`||e.mode===`trace`)&&U(e,[`template`,`outPath`,`appBundleId`,`deviceId`,`startedAt`])&&n(e.platform)&&je(e.targetProcesses)&&W(e.targetPids)}function U(e,t){return t.every(t=>typeof e[t]==`string`)}function Ae(e,t){return t.every(t=>e[t]===void 0||typeof e[t]==`number`)}function je(e){return Array.isArray(e)&&e.every(e=>typeof e==`string`)}function W(e){return Array.isArray(e)&&e.every(e=>typeof e==`number`)}function G(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Me(e){return G(e)&&typeof e.pid==`number`&&typeof e.startTime==`string`&&typeof e.command==`string`}const K=f,Ne=f,Pe=f,q=async()=>await import(`./perf-facade.js`),J=async()=>await import(`./perf-facade.js`),Fe=async()=>await import(`./perf-facade.js`),Ie=async()=>await import(`./src4.js`).then(e=>e.b);function Le(){let e=Object.freeze({sampleFrames:async(e,t)=>await(await q()).sampleAppleFramePerf(e,t),frameSampling:async e=>(await J()).buildAppleFrameSamplingMetadata(e),sampleMemory:async(e,t)=>await(await q()).sampleAppleMemoryPerf(e,t),memorySampling:async e=>(await J()).buildAppleMemorySamplingMetadata(e),memorySnapshotSupport:async e=>(await J()).buildAppleMemorySnapshotSupport(e),captureMemorySnapshot:async(e,t,n)=>await(await q()).captureAppleMemorySnapshot(e,t,n),start:async(e,t,n)=>await F(e,t,n),reattach:async(e,{envelope:t})=>await be(t),cleanup:async(e,{envelope:t})=>await ye(t),writeProfileReport:async e=>await(await Fe()).writeAppleXctracePerfReport({tracePath:e.tracePath,outPath:e.outPath,template:e.template,appBundleId:e.appId})}),t=Object.freeze({sampleFrames:async(e,t)=>await(await Ne()).sampleAndroidFramePerf(e,t),sampleMemory:async(e,t)=>await(await K()).sampleAndroidMemoryPerf(e,t),captureMemorySnapshot:async(e,t,n)=>await(await K()).captureAndroidHeapSnapshot(e,t,n),start:async(e,t,n)=>await I(e,t,n),reattach:async(e,{envelope:t})=>await xe(t),cleanup:async(e,{envelope:t})=>await Se(e,t),writeProfileReport:async(e,t)=>await(await Pe()).writeAndroidSimpleperfReport(e,Re(t.profile,t.tracePath),t.outPath)}),n=Object.freeze({sampleMemory:async(e,t)=>await(await Ie()).sampleHarmonyMemoryPerf(e,t)});return Object.freeze({apple:e,android:t,harmony:n})}function Re(t,n){if(t?.kind!==`simpleperf`||t.type!==`cpu-profile`||t.mode!==`cpu-profile`)throw new e(`INVALID_ARGS`,`Stopped Simpleperf profile metadata is malformed.`);return{type:`cpu-profile`,kind:`simpleperf`,packageName:t.packageName,appPid:t.appPid,profilerPid:t.profilerPid,remotePath:t.remotePath,outPath:n,startedAt:t.startedAt?Date.parse(t.startedAt):Date.now(),state:`stopped`,...t.stoppedAt?{stoppedAt:Date.parse(t.stoppedAt)}:{},...t.sizeBytes===void 0?{}:{sizeBytes:t.sizeBytes}}}function ze(){return Object.freeze({ensureConnected:async(e,t)=>{t.throwIfAborted();try{let{resolveIosPhysicalDeviceControl:n}=await import(`./physical-device-facade.js`);await n(e).ensureReady(e,t),t.throwIfAborted()}catch(e){throw t.throwIfAborted(),e}}})}function Be(){return Object.freeze({keepHot:e=>{import(`./runner-operations-facade.js`).then(({prewarmAppleRunnerCache:t})=>t(e,{})).catch(()=>{})},wasRecentlyObservedBooted:async e=>{let{wasSimulatorRecentlyObservedBooted:t}=await import(`./simulator-facade.js`);return t(e)},markBooted:e=>{import(`./simulator-facade.js`).then(({markSimulatorBooted:t})=>t(e)).catch(()=>{})}})}function Ve(){return Object.freeze({discover:async(e,t)=>{t.throwIfAborted();let n=await ne(e);return t.throwIfAborted(),n},launch:(e,t)=>{let n=[`-avd`,e];return t&&n.push(`-no-window`,`-no-audio`),u(`emulator`,n)},terminate:async e=>{await s({pids:[e],termTimeoutMs:1500,killTimeoutMs:1500})}})}function He(e,t,n=()=>{}){let r,i,a=async()=>(r??=t.apple({appleTools:e.appleTools}),await r),o=async()=>(i??=t.android({commands:e.commands}),await i),s=Object.freeze({shutdownTarget:async(e,t)=>(n(),await(await a()).shutdownTarget(e,t))}),c=Object.freeze({shutdownTarget:async(e,t)=>(n(),await(await o()).shutdownTarget(e,t))}),l=Object.freeze({canShutdownTarget:async e=>await Ue(e,a,o),shutdownTarget:async e=>(n(),await We(e,a,o))});return Object.freeze({apple:s,android:c,close:l})}async function Ue(e,t,n){return e.platform===`apple`?(await t()).canShutdownTarget(e):e.platform===`android`&&(await n()).canShutdownTarget(e)}async function We(e,t,n){let r=new AbortController().signal;return e.platform===`apple`?await(await t()).shutdownTarget(e,r):e.platform===`android`?await(await n()).shutdownTarget(e,r):{success:!1,exitCode:-1,stdout:``,stderr:`Cannot shut down unsupported device ${e.platform}/${e.kind}`}}function Ge(){return Object.freeze({withInvalidatedAppResolutionCache:async(e,t)=>{let{invalidateIosAppResolutionCache:n}=await import(`./app-resolution-facade.js`);return await n(e,t)},prepareArtifact:async(e,t)=>{let{prepareIosInstallArtifact:n}=await import(`./install-artifact-facade.js`);return await n(e.source,t)},resolveAppBundleId:async(e,t)=>{let{resolveIosApp:n}=await import(`./app-resolution-facade.js`);return await n(e,t)}})}function Ke(){return Object.freeze({bundletoolJar:process.env.AGENT_DEVICE_BUNDLETOOL_JAR?.trim()||void 0,withInvalidatedAppResolutionCache:async(e,t)=>{let{withAndroidAppResolutionCacheInvalidated:n}=await f();return await n(e,t)},prepareArtifact:async(e,t)=>{let{prepareAndroidInstallArtifact:n}=await f();return await n(e.source,t)},resolveAppPackage:async(e,t)=>{let{resolveAndroidApp:n}=await f(),r=await n(e,t);if(r.type===`intent`){let{AppError:e}=await import(`./sdk-contracts.js`).then(e=>e.U);throw new e(`INVALID_ARGS`,`App uninstall requires a package name, not an intent`)}return r.value}})}function qe(){return Object.freeze({probeClipboardShellSupport:async(e,t)=>{try{let{runAndroidShell:n,androidClipboardShellSupportForResult:r}=await f();return await r(await n(e,[`cmd`,`clipboard`,`get`,`text`],{allowFailure:!0,signal:t}))}catch{return`probe-failed`}},runAdb:async(e,t,n,r)=>{let{runAndroidAdb:i}=await f(),a=await i(e,t,{allowFailure:n.allowFailure,timeoutMs:n.timeoutMs,signal:r});return{stdout:a.stdout,stderr:a.stderr,exitCode:a.exitCode}},installPackage:async(e,t,n,r)=>{let{resolveAndroidAdbProvider:i}=await f(),a=i(e),o=a.install?await a.install(t,{replace:n.replace,signal:r}):await a.exec([`install`,...n.replace?[`-r`]:[],t],{signal:r});return{stdout:o.stdout,stderr:o.stderr,exitCode:o.exitCode}},installBundle:async(e,t,n,r)=>{let{resolveAndroidAdbProvider:i}=await f(),a=i(e).installBundle;return a?(await a(t,{mode:n,signal:r}),!0):!1}})}let Je;const Y=()=>Je??=import(`./runner-operations-facade.js`);let Ye;const X=()=>Ye??=import(`./platform-runtime-runtime-hints.js`);let Xe;const Ze=()=>Xe??=import(`./platform-runtime-open-target.js`).then(e=>e.t);let Qe;const $e=()=>Qe??=import(`./app-resolution-facade.js`);let et;const Z=()=>et??=import(`./macos-facade.js`);let tt;const nt=()=>tt??=import(`./retry.js`).then(e=>e.t);function rt(){return Object.freeze({resolveOpenTarget:async(e,t)=>await it(e,t),prewarmRunnerCache:async(e,t,n)=>{let{prewarmAppleRunnerCache:r}=await Y();await r(e,Q(t,n))},prewarmRunnerSession:async(e,t,n,r,i)=>{let{prewarmIosRunnerSession:a}=await Y();await a(e,{...Q(t,n),propagateError:r,...i})},notifyRunnerAppRelaunched:async(e,t,n)=>{let{notifyIosRunnerAppRelaunched:r}=await Y();await r(e,Q(t,n))},stopRunnerSession:async e=>{let{stopIosRunnerSession:t}=await Y();await t(e)},hasLiveRunnerSession:async(e,t)=>{let{hasLiveIosRunnerSession:n}=await Y();return n(e,{requestId:t.requestId})},releaseSpeculativeRunner:async(e,t)=>{let{releaseSpeculativeIosRunnerSessionFor:n}=await Y();return await n(e,{requestId:t.requestId})},releaseRunnerOnClose:async(e,t)=>{let{releaseIosRunnerOnClose:n}=await Y();await n(e,t)},prepareRunner:async(e,t,n)=>{let{Deadline:r}=await nt(),{prepareIosRunner:i}=await Y(),a=Date.now();return await i(e,{...Q(t.execution,n),cleanStaleBundles:!0,buildTimeoutMs:t.timeoutMs,healthTimeoutMs:t.timeoutMs,prepareDeadline:r.fromTimeoutMs(t.timeoutMs,a),startupTimeoutMs:t.timeoutMs})},applyRuntimeHints:async(e,t)=>{let{applyRuntimeHintValues:n}=await X();await n({device:e,...t})},clearRuntimeHints:async(e,t)=>{let{clearRuntimeHintValues:n}=await X();await n({device:e,...t})},dismissCloseAlerts:async(e,t)=>await st(e,t),detachRunnerSessionsForShutdown:async()=>{let{detachIosRunnerSessionsForShutdown:e}=await Y();await e()},finalizeRunnerSessionsForShutdown:async()=>{let{stopAllIosRunnerSessions:e}=await Y();await e()}})}async function it(t,n){if(n.foreground){let n=await at(t);if(n)return n;throw new e(`AMBIGUOUS_MATCH`,`open --foreground requires exactly one running app on the selected iOS simulator.`,{reason:`foreground_app_ambiguous`,hint:`Pass an explicit app instead: agent-device open <app> --platform ios.`})}let r=await ot(t,n.surface),{resolveSessionAppBundleIdForTarget:i}=await Ze();return{appBundleId:r.appBundleId??await i(t,n.target,n.currentAppBundleId),appName:r.appName??n.target}}async function at(e){if(!a(e)||e.kind!==`simulator`)return;let{detectSoleRunningIosSimulatorApp:t}=await $e(),n=await t(e);return n?{appBundleId:n.bundleId,appName:n.name}:void 0}async function ot(e,t){if(!i(e)||t===`app`||t===`desktop`||t===`menubar`)return{};let{resolveFrontmostMacOsApp:n}=await Z(),r=await n();return{appBundleId:r.bundleId,appName:r.appName}}function Q(e,t){return{requestId:e.requestId,logPath:e.logPath,traceLogPath:e.traceLogPath,verbose:e.verbose,iosXctestrunFile:e.iosXctestrunFile,iosXctestDerivedDataPath:e.iosXctestDerivedDataPath,iosXctestEnvDir:e.iosXctestEnvDir,runnerLeaseContext:e.runnerLeaseContext,signal:t}}async function st(e,t){if(!i(e))return;let{runMacOsAlertAction:n}=await Z();await n(`dismiss`,t.surface===`frontmost-app`?{surface:`frontmost-app`}:t.appBundleId?{bundleId:t.appBundleId}:{})}let ct;const lt=()=>ct??=import(`./platform-runtime-open-target.js`).then(e=>e.t);let ut;const $=()=>ut??=import(`./platform-runtime-runtime-hints.js`);function dt(){return Object.freeze({resolveOpenTarget:async(e,t)=>await ft(e,t),inferOpenedAppBundleId:async(e,t,n)=>{if(n)return n;try{let{inferAndroidPackageAfterOpen:r}=await f();return await r(e,t,n)}catch{return n}},resetFramePerfStats:async(e,t)=>{let{resetAndroidFramePerfStats:n}=await f();await n(e,t)},applyRuntimeHints:async(e,t)=>{let{applyRuntimeHintValues:n}=await $();await n({device:e,...t})},clearRuntimeHints:async(e,t)=>{let{clearRuntimeHintValues:n}=await $();await n({device:e,...t})},activateTestIme:async(n,r)=>{let{activateAndroidTestIme:i}=await f(),a=await i(n,r);if(a.outcome===`helper-unavailable`){t({level:`warn`,phase:`android_test_ime_activate_failed`,data:{device:n.id,error:a.reason,...a.hint===void 0?{}:{hint:a.hint}}});return}if(a.persistFailed&&!(!a.alreadyActive&&!a.activated))throw new e(`COMMAND_FAILED`,`Android test IME recovery records could not be persisted for ${n.name??n.id}.`,{reason:`android_test_ime_recovery_fence_failed`,deviceId:n.id})},restoreTestIme:async(t,n)=>{let{restoreAndroidTestIme:r}=await f(),i=await r(t,{stateDir:n.stateDir});if(i.reason===`set-failed`||i.reason===`record-unreadable`)throw new e(`COMMAND_FAILED`,`Android test IME could not be restored on ${t.name??t.id}.`,{reason:`android_test_ime_restore_incomplete`,deviceId:t.id})},recoverTestImeStartup:async e=>{let{listAndroidAdbSerialsQuick:t,restoreOrphanedAndroidTestImeOnDaemonStartup:n}=await f();await n({stateDir:e.stateDir,listSerials:t})},hasTestImeRecoveryEvidence:async e=>{let{readAndroidTestImeRecoveryMarkers:t}=await f();return(await t(e)).length>0}})}async function ft(e,t){let{resolveSessionAppBundleIdForTarget:n}=await lt();return{appBundleId:await n(e,t.target,t.currentAppBundleId),appName:t.target}}function pt(){return Object.freeze({resolve:async(e,t)=>{let{getLocalInteractor:n}=await import(`./interactors.js`).then(e=>e.n);return await n(e,t)}})}function mt(e){return Object.freeze({recoverStartupResources:async t=>{await e.android.hasTestImeRecoveryEvidence(t.stateDir)&&await e.android.recoverTestImeStartup(t)},detachForDaemonShutdown:async()=>await e.apple.detachRunnerSessionsForShutdown(),finalizeDaemonShutdown:async()=>await e.apple.finalizeRunnerSessionsForShutdown()})}function ht(e){return Object.freeze({captureSurface:async(t,n,r)=>t.platform===`linux`?await e.linux(n,r):(gt(t),await e.macos(n,r)),presentIosAcquisition:async(e,t)=>{let{presentIosSnapshotAcquisition:n}=await import(`./ios-snapshot-runtime.js`);return await n(e,t)}})}function gt(e){if(e.platform!==`apple`||e.appleOs!==`macos`)throw TypeError(`Apple surface capture requires a non-app macOS surface`)}async function _t(e,t){let n=e?.surface===void 0?void 0:o(e.surface,`native`);if(!n)throw TypeError(`Apple surface capture requires a helper-routed macOS surface`);let{captureMacOsSurfaceSnapshot:r}=await import(`./macos-facade.js`);return await r({...e,surface:n},t)}function vt(e){let t=_(e.sessionsDir),n=Object.freeze({mode:`local`,start:t.start}),r=se(),i=Object.freeze({which:async e=>await d(e)?e:void 0,run:async(e,t)=>{let n=await ee(e.executable,ce(e),{allowFailure:e.allowFailure,cwd:e.cwd,env:e.env?{...process.env,...e.env}:void 0,signal:t,timeoutMs:e.timeoutMs});return{stdout:n.stdout,stderr:n.stderr,exitCode:n.exitCode}}}),a=he({resolveSessionArtifacts:e.resolveSessionArtifacts,processes:t,resolveTransport:async e=>{if(e.platform!==`web`)return Object.freeze({mode:`local`});let{resolveWebNetworkTransport:t}=await import(`./platform-runtime-network-web-transport.js`);return await t(e)}}),o=rt(),s=dt();return Object.freeze({commands:i,appleTools:r,toolchains:oe(),artifacts:Object.freeze({resolveSession:e.resolveSessionArtifacts}),outputs:Object.freeze({openAppend:async t=>await ue(e.sessionsDir,t),readTail:async(t,n)=>await de(e.sessionsDir,t,n)}),processes:t,processTransports:Object.freeze({resolve:async t=>{if(t.platform!==`android`)return n;let{resolveAndroidAppLogProcessTransport:r}=await import(`./platform-runtime-app-log-android-transport.js`);return r(e.sessionsDir,t,n)}}),...a,appleDeployment:Ge(),androidDeployment:Ke(),androidTools:qe(),temporaryFiles:Object.freeze({create:async e=>await v(e)}),deviceReadiness:Object.freeze({applePhysical:ze(),appleAutomation:Be(),androidEmulator:Ve()}),deviceShutdown:He({appleTools:r,commands:i},e.shutdownLoaders,e.assertShutdownAllowed),screenRecording:D({ownedProcesses:e.ownedProcesses}),audioProbe:A({ownedProcesses:e.ownedProcesses}),perf:Le(),snapshot:e.snapshot,localInteractors:pt(),appleApplications:o,androidApplications:s,applicationResources:mt({android:s,apple:o}),clock:Object.freeze({now:()=>Date.now(),sleep:async(e,t)=>{await le(e,void 0,t?{signal:t}:void 0)}})})}export{vt as createPlatformRuntimeHost,ht as createSnapshotRuntimeHost,_t as loadMacOsSurfaceSnapshot,ie as recoverLegacyAppLogMarkersAfterDaemonLock};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{H as e}from"./sdk-contracts.js";import{r as t}from"./diagnostics.js";import"./diagnostics2.js";import{C as n,
|
|
1
|
+
import{H as e}from"./sdk-contracts.js";import{r as t}from"./diagnostics.js";import"./diagnostics2.js";import{C as n,O as r,S as i,T as a,_ as o,g as s,m as c,s as l,w as u}from"./owner-identity.js";import"./process.js";const d=2e3,f=(e,t)=>e===t;async function p(e){if(e===void 0)return;let[t,n]=await Promise.all([Promise.resolve(u(e)),Promise.resolve(i(e))]);return t&&n?Object.freeze({pid:e,startTime:t,command:n}):void 0}async function m(e){let t=await h(e.pid),n=l([e.pid],t),r=(await Promise.all(n.map(async e=>await p(e.pid)))).filter(e=>e!==void 0);return Object.freeze([e,...r.filter(t=>t.pid!==e.pid)])}async function h(n){try{return await o({timeoutMs:5e3})}catch(r){return t({level:`warn`,phase:`screen_recording_process_tree_unreadable`,data:{rootPid:n,reason:e(r)}}),[]}}function g(e,t=f){return!c(e.pid)||s(e.pid)?`missing`:S(e,t)?`owned-alive`:`ownership-lost`}async function _(e,t){if(!c(e.pid))return`gone`;let r=await n(e.pid,5e3);return r.zombie===!0?`gone`:e.startTime.length===0||e.command.length===0?`not-ours`:r.startTime===null||r.command===null?`unprovable`:r.startTime===e.startTime&&t(e.command,r.command)?`ours`:`not-ours`}async function v(e,t,n=f){let r=t?.child.pid,i=async e=>({marker:e,evidence:await _(e,n)}),a=({marker:e,evidence:t})=>t===`ours`||t===`unprovable`&&e.pid===r,o=await Promise.all(e.map(i)),s=o[0],c=new Set(e.map(({pid:e})=>e)),l=s!==void 0&&a(s)?await m(s.marker):[],u=await Promise.all(l.filter(({pid:e})=>!c.has(e)).map(async e=>await i(e))),p=[...o,...u],h=p.filter(a).map(({marker:e})=>e);if(h.length===0)return y(p.map(({evidence:e})=>e));let g=new Set(h.map(({pid:e})=>e)),v=p.filter(({marker:e,evidence:t})=>!g.has(e.pid)&&t!==`gone`);for(let[e,r]of[[`SIGINT`,5e3],[`SIGTERM`,d],[`SIGKILL`,d]])if(b(h,e,t),await x(h,r,t,n))return v.length===0?`terminated`:`ownership-lost`;return`ownership-lost`}function y(e){return e.every(e=>e===`gone`)?`already-missing`:`ownership-lost`}function b(e,t,n){let r=n?.child.pid;a(e.map(({pid:e})=>e).filter(e=>e!==r),t),r!==void 0&&e.some(({pid:e})=>e===r)&&n?.child.kill(t)}async function x(e,t,n,i){let a=n?.child.pid,o=n?await C(n.wait,t):!1;return await Promise.all(e.filter(({pid:e})=>!o||e!==a).map(async({pid:e})=>await r(e,t))),e.every(e=>o&&e.pid===a||g(e,i)===`missing`)}function S(e,t){let n=i(e.pid);return e.startTime.length>0&&e.command.length>0&&u(e.pid)===e.startTime&&n!==null&&t(e.command,n)}async function C(e,t){return await Promise.race([e.then(()=>!0,()=>!0),new Promise(e=>setTimeout(()=>e(!1),t))])}export{v as i,p as n,m as r,g as t};
|
package/dist/src/process.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime.js";import{
|
|
1
|
+
import{r as e}from"./rolldown-runtime.js";import{C as t,D as n,E as r,M as i,O as a,S as o,T as ee,_ as s,a as c,b as l,c as u,d,f,g as p,h as m,i as h,k as g,l as _,m as v,n as y,o as b,p as x,r as S,s as te,t as ne,u as re,v as ie,w as C,x as w,y as T}from"./owner-identity.js";import{h as E}from"./exec.js";import D from"node:fs";import O from"node:path";async function k(e,t={}){let n=j(),r=M(t);for(let t of e.read()){if(!A(t))continue;let i=await N(t,r,n);i.length===0?e.clear(t.scope):i.length!==t.records.length&&e.replace(t.scope,i)}return Object.freeze(n)}function A(e){return e.status===`decoded`}function j(){return{inspected:0,inspectedPids:[],terminated:0,terminatedPids:[],missing:0,missingPids:[],ownershipLost:0,ownershipLostPids:[],skippedForOpenWebSession:!1}}function M(e){return{openWebSession:(e.openWebSessionNames??[]).length>0,purposes:e.purposes?new Set(e.purposes):void 0,termTimeoutMs:e.termTimeoutMs??1500,killTimeoutMs:e.killTimeoutMs??1e3}}async function N(e,t,n){let r=[];for(let i of e.records){if(P(e.scope.kind,i,t)){r.push(i),I(e.scope.kind,i,t)&&(n.skippedForOpenWebSession=!0);continue}n.inspected+=1,n.inspectedPids.push(i.pid),L(n,i,await ae(i,t),r)}return r}function P(e,t,n){return!F(t,n)||I(e,t,n)}function F(e,t){return t.purposes===void 0||t.purposes.has(e.purpose)}function I(e,t,n){return e===`daemon`&&t.purpose===`managed-web-browser`&&n.openWebSession}function L(e,t,n,r){if(n===`terminated`){e.terminated+=1,e.terminatedPids.push(t.pid);return}if(n===`missing`){e.missing+=1,e.missingPids.push(t.pid);return}e.ownershipLost+=1,e.ownershipLostPids.push(t.pid),r.push(t)}async function ae(e,t){let n=R(e);return n===void 0?(U(e.pid,z(e)),await B(e,t)):n}function R(e){return e.pid===process.pid||!v(e.pid)||p(e.pid)?`missing`:H(e)?void 0:`ownership-lost`}function z(e){return e.purpose===`simctl-screen-recording`?`SIGINT`:`SIGTERM`}async function B(e,t){let n=await V(e,t.termTimeoutMs);return n===`exited`?`terminated`:n===`ownership-lost`?`ownership-lost`:(U(e.pid,`SIGKILL`),await V(e,t.killTimeoutMs)===`exited`?`terminated`:`ownership-lost`)}async function V(e,t){return await a(e.pid,t),!v(e.pid)||p(e.pid)?`exited`:H(e)?`owned-alive`:`ownership-lost`}function H(e){return C(e.pid)===e.startTime&&o(e.pid)===e.command}function U(e,t){try{process.kill(e,t)}catch{}}const W=`owned-processes.json`;function G(e){let t=O.resolve(e.stateDir),n=O.resolve(e.sessionsDir),r=O.join(t,W),a=t=>{if(t.kind===`daemon`)return r;let i=O.resolve(e.resolveSessionDir(t.sessionId));if(O.dirname(i)!==n)throw TypeError(`owned process session scope must resolve directly under the sessions dir`);return O.join(i,W)};return Object.freeze({replace(e,t){let n=J(t),r=a(e);if(n.length===0){Y(r);return}let o=O.dirname(r);D.mkdirSync(o,{recursive:!0}),i(r,e=>{let t=D.openSync(e,`wx`,384);try{D.writeFileSync(t,`${JSON.stringify({version:1,processes:n})}\n`,`utf8`),D.fsyncSync(t)}finally{D.closeSync(t)}X(r),D.renameSync(e,r)})},clear(e){Y(a(e))},read(){return q(n,r)}})}function K(e,t){let n;try{X(e),n=JSON.parse(D.readFileSync(e,`utf8`))}catch(n){return{scope:t,path:e,status:`invalid`,records:[],message:$(n)}}if(!se(n))return{scope:t,path:e,status:`invalid`,records:[],message:`owned process record must contain version 1 and a processes array`};try{return{scope:t,path:e,status:`decoded`,records:J(n.processes)}}catch(n){return{scope:t,path:e,status:`invalid`,records:[],message:$(n)}}}function q(e,t){let n=[];if(Z(t)&&n.push(K(t,{kind:`daemon`})),!D.existsSync(e))return n;for(let t of D.readdirSync(e,{withFileTypes:!0}).sort((e,t)=>e.name.localeCompare(t.name))){if(!t.isDirectory())continue;let r=O.join(e,t.name,W);Z(r)&&n.push(K(r,{kind:`session`,sessionId:t.name}))}return n}function J(e){let t=new Set,n=[];for(let r of e){if(!oe(r))throw TypeError(`owned process record has an invalid identity or purpose`);if(t.has(r.pid))throw TypeError(`duplicate owned process pid ${r.pid}`);t.add(r.pid),n.push(Object.freeze({pid:r.pid,startTime:r.startTime,command:r.command,purpose:r.purpose}))}return n.sort((e,t)=>e.pid-t.pid)}function oe(e){return Number.isInteger(e.pid)&&e.pid>0&&typeof e.startTime==`string`&&e.startTime.length>0&&typeof e.command==`string`&&e.command.length>0&&typeof e.purpose==`string`&&e.purpose.length>0}function se(e){return typeof e==`object`&&!!e&&`version`in e&&e.version===1&&`processes`in e&&Array.isArray(e.processes)}function Y(e){try{X(e),D.unlinkSync(e)}catch(e){if(!Q(e))throw e}}function X(e){try{let t=D.lstatSync(e);if(t.isSymbolicLink())throw Error(`Refusing to follow an owned process record symlink`);if(!t.isFile())throw Error(`Owned process record is not a regular file`)}catch(e){if(!Q(e))throw e}}function Z(e){try{return D.lstatSync(e).isFile()}catch{return!1}}function Q(e){return!!(e&&typeof e==`object`&&`code`in e&&e.code===`ENOENT`)}function $(e){return e instanceof Error?e.message:`owned process record is invalid`}var ce=e({classifyOwnerLiveness:()=>ne,classifyOwnerLivenessFromObservation:()=>y,createOwnedProcessRecordStore:()=>G,expandProcessTree:()=>te,hostCurrentWorkingDirectory:()=>u,hostEnvironment:()=>_,hostNodeExecutablePath:()=>re,hostNodeVersion:()=>d,hostPlatform:()=>f,hostProcessId:()=>x,isProcessAlive:()=>v,isProcessGroupAlive:()=>m,isProcessPid:()=>S,isProcessZombie:()=>p,listHostProcesses:()=>s,ownerIdentityDiffers:()=>h,ownerIdentityMatches:()=>c,readCurrentOwnerIdentity:()=>b,readHostCpuArch:()=>ie,readHostCpuArchSync:()=>T,readHostEnvironmentVariable:()=>l,readHostProcessIdentityObservations:()=>w,readOwnedProcessRecordFile:()=>K,readProcessCommand:()=>o,readProcessIdentityFacts:()=>t,readProcessStartTime:()=>C,reapOwnedProcessRecordsAtStartup:()=>k,signalPidsBestEffort:()=>ee,signalProcessGroupBestEffort:()=>E,stopPidsWithEscalation:()=>r,uniquePositivePids:()=>n,waitForProcessExit:()=>a,writeHostStderr:()=>g});export{G as n,k as r,ce as t};
|
package/dist/src/proxy.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{J as e,P as t}from"./sdk-contracts.js";import{
|
|
2
|
-
`)}function $(e,t,n){return n?
|
|
1
|
+
import{J as e,P as t}from"./sdk-contracts.js";import{a as n,c as r,f as i,i as a,l as o,n as s,o as c,p as l,r as u,s as d,t as f,u as p}from"./daemon-http.js";import{a as m}from"./transport.js";import{t as h}from"./shared.js";import{ensureDaemon as g,resolveClientSettings as _}from"./daemon-client-lifecycle.js";import{n as ee,t as te}from"./color.js";import{randomBytes as ne,randomUUID as v}from"node:crypto";import y from"node:http";function b(e){let t=S(e);if(!t)return!1;let n=T(t.meta);return C(n)?!1:w(t.source)||w(n?.installSource)}function x(n){let r=new t(`INVALID_ARGS`,`Invalid params: an install source of kind "path" names a file on the daemon host and is not accepted through the proxy`,{hint:`Upload the artifact, or use a "url" or "github-actions-artifact" source.`});return Response.json({jsonrpc:`2.0`,id:n,error:{code:-32602,message:r.message,data:e(r)}},{status:400})}function S(e){if(e)try{return T(T(JSON.parse(e))?.params)}catch{return}}function C(e){let t=e?.uploadedArtifactId;return typeof t==`string`&&t.trim().length>0}function w(e){return T(e)?.kind===`path`}function T(e){return e&&typeof e==`object`&&!Array.isArray(e)?e:void 0}const E=`${f}/`,D=[`content-type`,`content-range`,`x-artifact-type`,`x-artifact-filename`,`x-artifact-hash`,`x-artifact-hash-algorithm`,c],O=[`content-type`,`content-disposition`,`x-request-id`,u];function k(e){let t=V(e),n=v();return{instanceId:n,handle:async e=>{try{return await M(e,t,n)}catch(e){return me(e)}}}}function A(e){return y.createServer(j(k(e)))}function j(e){return(t,n)=>{import(`./node-http.js`).then(({serveProxyRequest:r})=>r(e,t,n)).catch(e=>{n.destroyed||n.destroy(e instanceof Error?e:void 0)})}}async function M(e,t,n){let r=U(e.url);if(e.method===`GET`&&r===`/health`)return await N(e,t,n);if(!W(r,e.method))return new Response(new TextEncoder().encode(`Not found`),{status:404});let i;return r===`/rpc`&&(i=await ae(e,t.maxRpcBodyBytes,`Proxy request body is too large.`)),oe(e,t.clientToken,i)?de(e,r,Z(i),n)||(b(i)?x(Z(i)):await F({request:e,route:r,options:t,rpcBody:i})):pe(r,Z(i))}async function N(e,t,n){let[i,{readVersion:a},{readHostCpuArch:o}]=await Promise.all([P(e,t),import(`./version.js`).then(e=>e.t),import(`./process.js`).then(e=>e.t)]);return Response.json(r(`agent-device-proxy`,a(),{upstream:i,instanceId:n,hostArch:await o()}))}async function P(e,t){let n=await t.upstreamFetch(new Request(i(t.upstreamBaseUrl,`health`),{method:`GET`,headers:X(new Headers,t.upstreamToken,`/health`),signal:I(e,t)})),r=await n.text();try{return r?JSON.parse(r):{ok:n.ok,status:n.status}}catch{return{ok:n.ok,status:n.status}}}async function F(e){let{request:t,route:n,options:r,rpcBody:i}=e,a=ie(t,n,i,r.upstreamToken),o=await r.upstreamFetch(new Request(J(r.upstreamBaseUrl,n,t.url),{method:t.method,headers:X(t.headers,r.upstreamToken,n),signal:I(t,r),...a?{body:a,duplex:`half`}:{}})),s=L(o,t);return q(n)?await R({request:t,upstreamResponse:o,headers:s,clientToken:r.clientToken}):new Response(o.body,{status:o.status,headers:s})}function I(e,t){return AbortSignal.any([e.signal,AbortSignal.timeout(t.upstreamTimeoutMs)])}function L(e,t){let n=new Headers;for(let t of O){let r=e.headers.get(t);r&&n.set(t,r)}return n.has(`x-request-id`)||n.set(`x-request-id`,ue(t)),n}async function R(e){let{request:t,upstreamResponse:n,headers:r,clientToken:i}=e,a=await n.text();return r.set(`content-type`,n.headers.get(`content-type`)??`application/json`),new Response(z(a,t,i),{status:n.status,headers:r})}function z(e,t,n){let r;try{r=JSON.parse(e)}catch{return e}if(!r||typeof r!=`object`)return e;let i=r;if(!i.upload||typeof i.upload.url!=`string`)return e;let a=B(i.upload.url,t);if(!a)return e;let s=i.upload.headers&&typeof i.upload.headers==`object`?{...i.upload.headers}:{};return Object.assign(s,o(n)),JSON.stringify({...r,upload:{...i.upload,url:a,headers:s}})}function B(e,t){let n;try{n=new URL(e)}catch{return null}if(!n.pathname.startsWith(`/upload/`))return null;let r=new URL(t.url),i=r.pathname.lastIndexOf(`/upload/preflight`),a=i>=0?r.pathname.slice(0,i):``,o=t.headers.get(`x-forwarded-proto`)?.split(`,`)[0]?.trim(),s=new URL(`${o||r.protocol.replace(/:$/,``)}://${r.host}`);return s.pathname=`${a}${n.pathname}`,s.search=n.search,s.toString()}function V(e){return{upstreamBaseUrl:re(e.upstreamBaseUrl,`upstreamBaseUrl`),upstreamToken:H(e.upstreamToken,`upstreamToken`),clientToken:H(e.clientToken,`clientToken`),maxRpcBodyBytes:e.maxRpcBodyBytes??1048576,upstreamTimeoutMs:e.upstreamTimeoutMs??3e5,upstreamFetch:e.upstreamFetch??(e=>fetch(e))}}function re(e,n){try{let t=new URL(e);if(t.protocol!==`http:`&&t.protocol!==`https:`)throw Error(`unsupported protocol`);return t.toString().replace(/\/+$/,``)}catch(r){throw new t(`INVALID_ARGS`,`Invalid ${n}`,{[n]:e},r)}}function H(e,n){let r=e.trim();if(!r)throw new t(`INVALID_ARGS`,`Proxy ${n} is required.`);return r}function U(e){let t=new URL(e).pathname;return t===`/agent-device`?`/`:t.startsWith(E)?`/${t.slice(E.length)}`:t}function W(e,t){return e===`/rpc`?t===`POST`:K(e,t)?!0:e===`/artifacts`||e===`/artifacts/`||e.startsWith(`/artifacts/`)||G(e)?t===`GET`:!1}function G(e){let t=e.split(`/`);return t.length===6&&t[1]===`sessions`&&t[3]===`requests`&&t[5]===`diagnostics`&&t[2]!==``&&t[4]!==``}function K(e,t){return e===`/upload`||q(e)||e===`/upload/finalize`?t===`POST`:e.startsWith(`/upload/direct/`)?t===`PUT`:!1}function q(e){return e===`/upload/preflight`}function J(e,t,n){let r=new URL(i(e,t));return r.search=new URL(n).search,r}function Y(e){let t=e.get(d);return t===null?{}:{[s]:t}}function X(e,t,r){let i=new Headers;for(let t of D){let n=e.get(t);n?.trim()&&i.set(t,n)}if(r===`/rpc`&&!i.has(`content-type`)&&i.set(`content-type`,`application/json`),r===`/rpc`){i.set(a,n);for(let[t,n]of Object.entries(Y(e)))i.set(t,n)}for(let[e,n]of Object.entries(o(t)))i.set(e,n);return i}function ie(e,t,n,r){return e.method===`GET`||e.method===`HEAD`?null:t===`/rpc`?ce(n??``,r):e.body}async function ae(e,n,r){if(!e.body)return``;let i=e.body.getReader(),a=[],o=0;for(;;){let{done:e,value:s}=await i.read();if(e)break;if(o+=s.byteLength,o>n)throw await i.cancel(),new t(`INVALID_ARGS`,r);a.push(s)}return Buffer.concat(a).toString(`utf8`)}function oe(e,t,n){let r=se(e,n);return r.length>0&&m(r,t)}function se(e,t){let n=e.headers.get(`authorization`)??``;if(n.toLowerCase().startsWith(`bearer `))return n.slice(7);let r=e.headers.get(`x-agent-device-token`);if(r!==null)return r;if(t){let e=le(t);if(e)return e}return``}function ce(e,t){let n=JSON.parse(e);return n.params={...n.params??{},token:t},JSON.stringify(n)}function le(e){try{let t=JSON.parse(e);return typeof t.params?.token==`string`?t.params.token:``}catch{return``}}function Z(e){if(!e)return null;try{return JSON.parse(e).id??null}catch{return null}}function ue(e){let t=e.headers.get(`x-request-id`);return t?.trim()?t.trim().slice(0,128):v()}function de(e,t,n,r){if(t!==`/rpc`)return null;let i=e.headers.get(s);return i===null||i===r?null:fe(n)}function fe(n){return Response.json(l(n,`Proxy instance changed`,e(new t(`COMMAND_FAILED`,`Proxy instance changed`,{reason:`remote_instance_mismatch`}))),{status:409,headers:{[u]:`true`}})}function pe(n,r){return n===`/rpc`?Response.json({jsonrpc:`2.0`,id:r,error:{code:-32001,message:`Invalid proxy token`,data:e(new t(`UNAUTHORIZED`,`Invalid proxy token`))}},{status:401}):Response.json({ok:!1,error:`Invalid proxy token`,code:`UNAUTHORIZED`},{status:401})}function me(t){let n=e(t);return Response.json({ok:!1,error:n.message,code:n.code},{status:n.code===`INVALID_ARGS`?400:500})}const Q=async({positionals:e,flags:n})=>{if(e.length>0)throw new t(`INVALID_ARGS`,`proxy does not accept positional arguments.`);let r=await he(n);return await h(n,r,()=>be(r)),await xe(),!0};async function he(e){let n=_({session:`default`,command:`proxy`,positionals:[],flags:{stateDir:e.stateDir,daemonBaseUrl:``,daemonTransport:`http`,daemonServerMode:`http`}}),r=await g(n),i=ge(r.info.httpPort),a=_e(e),o=A({upstreamBaseUrl:i,upstreamToken:r.info.token,clientToken:a});await ve(o,e.proxyHost?.trim()||`127.0.0.1`,e.proxyPort??0);let s=o.address();if(!s||typeof s==`string`)throw new t(`COMMAND_FAILED`,`Proxy did not bind to a TCP address.`);let c=`http://${ye(s.address)}:${s.port}`;return{proxyBaseUrl:c,agentDeviceBaseUrl:p(c),token:a,upstreamBaseUrl:i,stateDir:n.paths.baseDir}}function ge(e){if(!e)throw new t(`COMMAND_FAILED`,`Local daemon HTTP endpoint is unavailable.`,{hint:`Retry after cleaning daemon state, or run proxy with a fresh --state-dir.`});return`http://127.0.0.1:${e}`}function _e(e){return e.daemonAuthToken?.trim()||ne(32).toString(`hex`)}function ve(e,t,n){return new Promise((r,i)=>{e.once(`error`,i),e.listen(n,t,()=>{e.off(`error`,i),r()})})}function ye(e){return e.includes(`:`)&&!e.startsWith(`[`)?`[${e}]`:e}function be(e,t={}){let n=t.useColor??ee(),r=$(`✓`,`green`,n),i=$(e.proxyBaseUrl,`cyan`,n),a=$(`<tunnel URL>`,`cyan`,n),o=$(e.token,`yellow`,n);return[`${r} Proxy listening at ${i}`,``,`Provide this to the agent-device instance connecting:`,``,`Daemon base URL: ${a}`,`Daemon auth token: ${o}`].join(`
|
|
2
|
+
`)}function $(e,t,n){return n?te(e,t,{validateStream:!1}):e}function xe(){return new Promise(()=>{})}export{Q as proxyCommand};
|
package/dist/src/registry.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{E as e,N as t,O as n,P as r,S as i,_ as a,k as o,m as s,n as c}from"./sdk-contracts.js";import{a as ee,d as te,f as ne,m as re,n as ie,p as ae,t as oe,u as se}from"./capture.js";import{A as ce,c as le,d as ue,f as de,h as fe,l as pe,m as me,s as he,u as ge,v as l}from"./sdk-batch-runner.js";import{t as _e}from"./viewport.js";import{a as ve,i as ye,n as be,t as xe}from"./sdk-device.js";import{a as Se,c as Ce}from"./lease-scope.js";import{An as we,Cr as Te,In as Ee,Mn as De,Nr as Oe,Rr as ke,_r as Ae,d as je,dr as Me,fr as Ne,h as Pe,hr as Fe,i as Ie,ln as Le,m as Re,ni as ze,s as Be,sn as Ve,ur as He}from"./sdk-batch.js";import{n as Ue}from"./recording-export-quality.js";import{t as We}from"./recording-scope.js";import{a as Ge,n as Ke,o as qe,r as Je,s as Ye}from"./scroll-gesture.js";import{E as Xe,T as Ze,b as Qe,v as $e,w as et}from"./script.js";import{a as tt,i as nt,r as rt}from"./vars.js";import{n as it,r as at,t as ot}from"./format.js";import{n as u,t as st}from"./catalog.js";import{i as ct,r as lt,t as ut}from"./back-mode.js";import{a as dt}from"./sdk-remote-config.js";import{t as ft}from"./session.js";import{a as pt,c as mt,d as ht,f as gt,g as _t,h as vt,i as yt,l as bt,n as xt,o as St,p as Ct,s as wt,t as Tt,u as Et}from"./observability.js";import{n as Dt,t as Ot}from"./success-text.js";import{a as d,i as kt,n as At,r as f}from"./output-common.js";import{t as jt}from"./alert-contract.js";import{a as Mt,i as Nt,l as Pt,o as Ft,s as It,t as Lt,u as Rt,x as zt}from"./settings.js";import{t as Bt}from"./location-coordinates.js";import{t as Vt}from"./snapshot-quality-backend-capabilities.js";import{f as Ht,m as Ut,p as Wt,r as Gt,s as Kt}from"./overlay.js";import{t as qt}from"./mobile-snapshot-semantics.js";import{t as Jt}from"./click-button.js";import{n as Yt}from"./scroll-command.js";import{n as Xt,t as Zt}from"./interaction-positionals.js";import{t as Qt}from"./app-inventory.js";import"./device.js";import{a as $t,f as en,i as tn,m as nn,o as rn,p as an,r as on,t as sn}from"./device-rotation.js";import"./app-inventory-contract.js";import{t as cn}from"./prepare-kind.js";import{n as ln,t as un}from"./path-resolution.js";import"./file.js";import{n as dn,r as fn,s as pn,t as mn}from"./tv-remote.js";import hn from"node:fs";import p from"node:path";const gn=[`path`,`start`,`stop`,`doctor`,`mark`,`clear`],_n=new Set(lt().map(e=>e.key));function vn(e){let t=Se(e);return ce({stateDir:e.stateDir,daemonBaseUrl:e.daemonBaseUrl,daemonTransport:e.daemonTransport,daemonServerMode:e.daemonServerMode,...Ce(t),provider:e.provider,providerSessionId:e.providerSessionId,providerApp:e.providerApp,providerOsVersion:e.providerOsVersion,providerProject:e.providerProject,providerBuild:e.providerBuild,providerSessionName:e.providerSessionName,providerDeviceOrientation:e.providerDeviceOrientation,providerGeoLocation:e.providerGeoLocation,providerTimezone:e.providerTimezone,providerAppiumVersion:e.providerAppiumVersion,providerLanguage:e.providerLanguage,providerLocale:e.providerLocale,providerNetworkProfile:e.providerNetworkProfile,providerCustomNetwork:e.providerCustomNetwork,providerNoResignApp:e.providerNoResignApp,awsProjectArn:e.awsProjectArn,awsDeviceArn:e.awsDeviceArn,awsAppArn:e.awsAppArn,awsRegion:e.awsRegion,awsInteractionMode:e.awsInteractionMode,sessionIsolation:e.sessionIsolation,platform:e.platform,target:e.target,device:e.device,udid:e.udid,serial:e.serial,iosSimulatorDeviceSet:e.iosSimulatorDeviceSet,iosXctestrunFile:e.iosXctestrunFile,iosXctestDerivedDataPath:e.iosXctestDerivedDataPath,iosXctestEnvDir:e.iosXctestEnvDir,androidDeviceAllowlist:e.androidDeviceAllowlist,surface:e.surface,activity:e.activity,launchConsole:e.launchConsole,launchArgs:e.launchArgs,relaunch:e.relaunch,shutdown:e.shutdown,saveScript:e.saveScript,testIme:e.testIme,noRecord:e.noRecord,recordAs:e.recordAs,record:e.record,backMode:e.backMode,metroHost:e.metroHost,metroPort:e.metroPort,bundleUrl:e.bundleUrl,launchUrl:e.launchUrl,...n(e,a),...se(e),appsFilter:e.appsFilter,kind:e.kind,out:e.out,count:e.count,fps:e.fps,quality:e.quality,hideTouches:e.hideTouches,recordingScope:e.recordingScope,intervalMs:e.intervalMs,delayMs:e.delayMs,durationMs:e.durationMs,holdMs:e.holdMs,jitterPx:e.jitterPx,readinessTimeoutMs:e.readinessTimeoutMs,pixels:e.pixels,until:e.until,doubleTap:e.doubleTap,verify:e.verify,settle:e.settle,settleQuietMs:e.settleQuietMs,clickButton:e.clickButton,pauseMs:e.pauseMs,pattern:e.pattern,headless:e.headless,restart:e.restart,replayUpdate:e.replayUpdate,replayBackend:e.replayBackend,replayEnv:e.replayEnv,replayShellEnv:e.replayShellEnv,replayScriptSource:e.replayScriptSource,replayScriptSources:e.replayScriptSources,replayFrom:e.replayFrom,replayPlanDigest:e.replayPlanDigest,replayKeepSession:e.replayKeepSession,failFast:e.failFast,timeoutMs:e.timeoutMs,retries:e.retries,recordVideo:e.recordVideo,artifactsDir:e.artifactsDir,shardAll:e.shardAll,shardSplit:e.shardSplit,findFirst:e.findFirst,findLast:e.findLast,networkInclude:e.networkInclude,batchOnError:e.batchOnError,batchMaxSteps:e.batchMaxSteps,batchSteps:e.batchSteps,verbose:e.debug})}function yn(e,t){return{...vn(e),...t}}function bn(e,t){let n=e.inputSchema.properties;if(!n)return{};let r={},i=t;for(let e of Object.keys(n)){if(!_n.has(e))continue;let t=i[e];xn(t)&&(r[e]=t)}return r}function xn(e){return typeof e==`boolean`||typeof e==`number`||typeof e==`string`}function Sn(e){return{kind:`operator`,source:e}}function Cn(e,t){return`${e} is not accepted as a tool argument. ${wn(e,t)}`}function wn(e,t){if(`operatorPath`in t)return t.operatorPath;let n=`for the process serving these tools.`,r=(t.envFlagKeys??[e]).map(dt).join(` or `);return r===``?`Set ${e} in ~/.agent-device/config.json ${n}`:`Set the ${r} environment variable${t.operatorConfig?` (or ${e} in ~/.agent-device/config.json)`:``} ${n}`}function Tn(e){if(e==null)return{};if(!e||typeof e!=`object`||Array.isArray(e))throw new r(`INVALID_ARGS`,`Expected object arguments.`);return e}function En(e,t){let n=e[t];if(!n||typeof n!=`object`||Array.isArray(n))throw new r(`INVALID_ARGS`,`Expected ${t} to be an object.`);return n}function Dn(e,t){let n=e[t];if(typeof n!=`string`||n.length===0)throw new r(`INVALID_ARGS`,`Expected ${t} to be a non-empty string.`);return n}function On(e,t){let n=e[t];if(n!==void 0){if(typeof n!=`string`)throw new r(`INVALID_ARGS`,`Expected ${t} to be a string.`);return n}}function m(e,t){let n=e[t];if(n!==void 0){if(typeof n!=`string`||n.length===0)throw new r(`INVALID_ARGS`,`Expected ${t} to be a non-empty string.`);return n}}function kn(e,t){let n=e[t];if(typeof n!=`number`||!Number.isFinite(n))throw new r(`INVALID_ARGS`,`Expected ${t} to be a finite number.`);return n}function An(e,t){let n=e[t];if(n!==void 0){if(typeof n!=`boolean`)throw new r(`INVALID_ARGS`,`Expected ${t} to be a boolean.`);return n}}function jn(e,t,n){let i=e[t];if(typeof i!=`string`||!n.includes(i))throw new r(`INVALID_ARGS`,`Expected ${t} to be one of: ${n.join(`, `)}.`);return i}function Mn(e,t,n){let i=e[t];if(i!==void 0){if(typeof i!=`string`||!n.includes(i))throw new r(`INVALID_ARGS`,`Expected ${t} to be one of: ${n.join(`, `)}.`);return i}}function Nn(e,t){let n=e[t];if(n!==void 0){if(!n||typeof n!=`object`||Array.isArray(n))throw new r(`INVALID_ARGS`,`Expected ${t} to be an object.`);return n}}function Pn(e,t){let n=e[t];if(n!==void 0){if(!Array.isArray(n)||n.some(e=>typeof e!=`string`))throw new r(`INVALID_ARGS`,`Expected ${t} to be an array of strings.`);return n}}function Fn(e,t,n,i){let a=new Set(t),o=Object.keys(e).filter(e=>!a.has(e));if(o.length>0)throw new r(`INVALID_ARGS`,`${n} has unknown field(s): ${o.join(`, `)}.`,i===void 0?void 0:{hint:i})}function h(e){return Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0))}const In=Sn({operatorConfig:!0}),Ln={session:{schema:{type:`string`,description:`Agent-device session name.`},read:e=>m(e,`session`),flagKey:`session`,flagIn:[`input`]},platform:{schema:{type:`string`,enum:ye,description:`Platform selector used to resolve a device.`},read:e=>Mn(e,`platform`,ye),flagKey:`platform`,flagIn:[`input`,`selection`]},deviceTarget:{schema:{type:`string`,enum:be,description:`Device target form. Maps to the CLI --target flag.`},read:Un,clientKey:`target`,flagKey:`target`,flagIn:[`input`,`selection`]},target:{schema:{type:`string`,enum:be,description:`Alias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.`}},device:{schema:{type:`string`,description:`Device name selector (a UDID belongs in udid, a serial in serial).`},read:e=>m(e,`device`),flagKey:`device`,flagIn:[`input`,`selection`]},udid:{schema:{type:`string`,description:`Apple device or simulator UDID; the selector that pins one device when several share a name.`},read:e=>m(e,`udid`),flagKey:`udid`,flagIn:[`input`,`selection`]},serial:{schema:{type:`string`,description:`Android, HarmonyOS, or Vega VVD serial selector.`},read:e=>m(e,`serial`),flagKey:`serial`,flagIn:[`input`,`selection`]},iosSimulatorDeviceSet:{schema:{type:`string`,description:`iOS simulator device-set path used for device resolution.`},read:e=>m(e,`iosSimulatorDeviceSet`),audience:Sn({envFlagKeys:[],operatorConfig:!0}),flagKey:`iosSimulatorDeviceSet`,flagIn:[`input`,`selection`]},iosXctestrunFile:{schema:{type:`string`,description:`Externally built iOS XCTest runner .xctestrun artifact path.`},read:e=>m(e,`iosXctestrunFile`),audience:In,flagKey:`iosXctestrunFile`,flagIn:[`input`]},iosXctestDerivedDataPath:{schema:{type:`string`,description:`Derived data path for external iOS XCTest runner execution.`},read:e=>m(e,`iosXctestDerivedDataPath`),audience:In,flagKey:`iosXctestDerivedDataPath`,flagIn:[`input`]},iosXctestEnvDir:{schema:{type:`string`,description:`Writable directory for iOS XCTest runner env overlays.`},read:e=>m(e,`iosXctestEnvDir`),audience:In,flagKey:`iosXctestEnvDir`,flagIn:[`input`]},androidDeviceAllowlist:{schema:{type:`string`,description:`Android serial allowlist used for device resolution.`},read:e=>m(e,`androidDeviceAllowlist`),flagKey:`androidDeviceAllowlist`,flagIn:[`input`,`selection`]},noRecord:{read:e=>An(e,`noRecord`),flagKey:`noRecord`,flagIn:[`input`,`selection`]},readinessTimeoutMs:{read:Wn},daemonBaseUrl:{schema:{type:`string`,description:`Remote daemon base URL.`},read:e=>m(e,`daemonBaseUrl`),audience:In},daemonAuthToken:{schema:{type:`string`,description:`Remote daemon auth token.`},read:e=>m(e,`daemonAuthToken`),audience:In},tenant:{schema:{type:`string`,description:`Remote tenant identifier.`},read:e=>m(e,`tenant`)},runId:{schema:{type:`string`,description:`Lease run identifier.`},read:e=>m(e,`runId`)},leaseId:{schema:{type:`string`,description:`Existing lease identifier.`},read:e=>m(e,`leaseId`)},cwd:{schema:{type:`string`,description:`Working directory for command execution.`},read:e=>m(e,`cwd`),audience:Sn({operatorPath:`Start the process serving these tools in the desired working directory, or pass absolute paths.`})},debug:{schema:{type:`boolean`,description:`Enable debug diagnostics.`},read:e=>An(e,`debug`)}},Rn=Object.entries(Ln),zn=Object.fromEntries(Rn.flatMap(([e,t])=>t.audience?[[e,t.audience]]:[]));function Bn(){return Object.fromEntries(Rn.flatMap(([e,t])=>t.schema?[[e,t.schema]]:[]))}function Vn(e,t={}){let n={};for(let[r,i]of Rn)i.read&&(n[r]=i.read(e,t));return n}function g(e){let t={};for(let[n,r]of Rn)r.read&&(t[r.clientKey??n]=e[n]);return h(t)}function Hn(e,t){let n={};for(let[r,i]of Rn){if(i.flagIn===void 0||!i.flagIn.includes(t))continue;let a=t===`selection`?i.clientKey??r:r;n[a]=e[i.flagKey]}return n}function Un(e,t){let n=Mn(e,`deviceTarget`,be);if(t.readTargetAlias===!1||e.target===void 0)return n;let i=Mn(e,`target`,be);if(n!==void 0&&i!==n)throw new r(`INVALID_ARGS`,`Expected target alias to match deviceTarget when both are set.`);return n??i}function Wn(e,t){if(!(t.readinessBudgetDeclared===!0||!Object.hasOwn(e,`readinessTimeoutMs`)))throw new r(`INVALID_ARGS`,`readinessTimeoutMs applies only to commands that wait for their target: press, click, and longpress.`)}function _(e,t){return n=>v(e,t?t(n):[],n)}function v(e,t,n,r){return{command:e,positionals:t,...r?{input:r}:{},options:Gn(n)}}function Gn(e){let t=Kn(e.deviceTarget??e.target);if(t===void 0&&e.target===void 0)return e;let{target:n,...r}=e;return t===void 0?r:{...r,target:t}}function Kn(e){return e===`mobile`||e===`tv`||e===`desktop`?e:void 0}function y(e){return h(Hn(e,`input`))}function qn(e){return h({record:e.record})}function Jn(e){return Hn(e,`selection`)}function Yn(e){return h({depth:e.snapshotDepth,scope:e.snapshotScope,raw:e.snapshotRaw})}function Xn(e){return{depth:e.snapshotDepth,scope:e.snapshotScope,raw:e.snapshotRaw}}function Zn(e){return h({settle:e.settle,settleQuietMs:e.settleQuietMs,timeoutMs:e.timeoutMs})}function Qn(e){return h({count:e.count,intervalMs:e.intervalMs,holdMs:e.holdMs,jitterPx:e.jitterPx,doubleTap:e.doubleTap})}function $n(e){if(`ref`in e&&e.ref!==void 0)return h({kind:`ref`,ref:e.ref,label:e.label});if(`selector`in e&&e.selector!==void 0)return{kind:`selector`,selector:e.selector};let t=e;return{kind:`point`,x:t.x,y:t.y}}function er(e){let t=nr(e);if(typeof t.ref==`string`)return[t.ref,...ir(t.label)];if(typeof t.selector==`string`)return[t.selector];if(t.kind===`point`||t.x!==void 0||t.y!==void 0)return[String(rr(t.x,`x`)),String(rr(t.y,`y`))];throw new r(`INVALID_ARGS`,`interaction requires @ref, selector, or point target`)}function tr(e){let t=nr(e);if(typeof t.ref==`string`)return[t.ref,...ir(t.label)];if(typeof t.selector==`string`)return[t.selector];throw new r(`INVALID_ARGS`,`element command requires @ref or selector target`)}function nr(e){if(!e||typeof e!=`object`||Array.isArray(e))throw new r(`INVALID_ARGS`,`Expected target object.`);let t=e,n=t.target;return n&&typeof n==`object`&&!Array.isArray(n)?n:t}function rr(e,t){if(typeof e!=`number`||!Number.isFinite(e))throw new r(`INVALID_ARGS`,`point target requires numeric ${t}.`);return e}function ir(e){return typeof e==`string`&&e.length>0?[e]:[]}function ar(e){let t=Me(e);if(!t.ok)throw new r(t.code,t.message);return`ref`in t?{ref:t.ref,label:lr(e.slice(1))}:{selector:t.selector}}function or(e){let t=Ne(e);if(!t.ok)throw new r(t.code,t.message);return t.format}function sr(e,t={}){let n=Te(e,t);if(!n)throw new r(`INVALID_ARGS`,He);return n}function cr(e,t){try{let t=JSON.parse(e);if(t&&typeof t==`object`&&!Array.isArray(t))return t}catch{}throw new r(`INVALID_ARGS`,`${t} must be a JSON object`)}function lr(e){return e.join(` `).trim()||void 0}function b(...e){return new Set(e)}function x(e,t){return e!==void 0&&t.has(e)}function ur(e){return e===void 0||e.trim()===``?!1:Number.isFinite(Number(e))}function dr(e,t){if(e===void 0)return;let n=Number(e);if(Number.isFinite(n))return n;throw new r(`INVALID_ARGS`,`${t} must be a finite number.`)}function fr(e){return e===void 0?void 0:Number(e)}function S(e){return e===void 0?[]:[e]}function C(e){return e===void 0?[]:[String(e)]}function w(e,t){if(e===void 0||e===``)throw new r(`INVALID_ARGS`,t);return e}function T(e,t){if(typeof e!=`string`||e.length===0)throw new r(`INVALID_ARGS`,t);return e}function pr(e){return gr(e.description,e.cliDetail)}function mr(e){return gr(e.description,e.mcpDetail)}function hr(e,t){return{...e,description:t}}function gr(e,t){return t?`${e} ${t}`:e}function _r(e){return e}const vr=[`ref`,`selector`,`point`];function yr(e,t=[]){return{type:`object`,properties:{...Bn(),...e},...t.length>0?{required:t}:{},additionalProperties:!1}}function E(e,t=[],n){return{type:`object`,...n?{description:n}:{},properties:e,...t.length>0?{required:t}:{}}}function br(e){return{type:`object`,description:e,properties:{x:{type:`number`},y:{type:`number`}},required:[`x`,`y`],additionalProperties:!1}}function D(e,t){return{type:`string`,enum:e,...t?{description:t}:{}}}function O(e){return{type:`string`,const:e}}function k(e){return{type:`string`,...e?{description:e}:{}}}function xr(e){return{type:[`string`,`null`],...e?{description:e}:{}}}function A(e,t={}){return{type:`number`,...e?{description:e}:{},...t.min===void 0?{}:{minimum:t.min},...t.max===void 0?{}:{maximum:t.max}}}function Sr(e){return{type:`integer`,...e?{description:e}:{}}}function j(e){return{type:`boolean`,...e?{description:e}:{}}}function Cr(e){return{type:`array`,items:{type:`string`},...e?{description:e}:{}}}function M(e){return{type:`object`,additionalProperties:!0,...e?{description:e}:{}}}function N(e){return{...e,required:!0}}function P(e,t={}){return B(k(e),t.allowEmpty===!0?On:m)}function wr(e){return{schema:{type:`null`},required:!1,audience:{kind:`retired`,message:e},read:(t,n)=>{if(Object.hasOwn(t,n))throw new r(`INVALID_ARGS`,e)}}}function Tr(e,t){return{...e,audience:{kind:`operator`,source:t}}}function F(e,t={}){return B(A(e,t),(e,n)=>fe(e,n,t))}function I(e,t={}){return B(qr(e,t),(e,n)=>me(e,n,t))}function L(e){return B(j(e),An)}function Er(e){return Or(Dr(e))}function Dr(e){let[t,...n]=ct(e).filter(e=>e.inputDescription!==void 0);if(!t)throw Error(`Flag ${e} declares no inputDescription; optionField cannot derive a field`);if(n.length>0)throw Error(`Flag ${e} declares inputDescription more than once`);return t}function Or(e){let t=e.inputDescription,n={min:e.min,max:e.max};switch(e.type){case`boolean`:return L(t);case`int`:return I(t,n);case`number`:return F(t,n);case`string`:return P(t);case`enum`:return R(kr(e),t);case`booleanOrString`:throw Error(`Flag ${e.key} is booleanOrString; declare its field shape explicitly with jsonSchemaField`)}}function kr(e){let t=e.enumValues;if(!t)throw Error(`Flag ${e.key} is an enum with no enumValues`);return t}function R(e,t){return B(D(e,t),(t,n)=>Mn(t,n,e))}function Ar(e){return B(M(e),Nn)}function jr(e){return B(Cr(e),Pn)}function z(e){return B(e,(e,t)=>e[t])}function Mr(e,t){return B(e,t)}function Nr(){return B(Zr(),(e,t)=>e[t]===void 0?void 0:Br(e,t))}function Pr(){return B(Qr(),(e,t)=>e[t]===void 0?void 0:Vr(e,t))}function Fr(e){return B(br(e),(e,t)=>e[t]===void 0?void 0:Hr(e,t))}function Ir(){return{depth:I(`Snapshot traversal depth.`,{min:0}),scope:P(`Snapshot scope selector used before resolution.`),raw:L(`Use raw snapshot data during selector resolution.`)}}function Lr(){return{count:I(`Number of press/click repetitions.`,{min:1}),intervalMs:I(`Delay between repeated press/click actions.`,{min:0}),holdMs:I(`Hold duration for each action.`,{min:0}),jitterPx:I(`Randomization radius in pixels.`,{min:0}),doubleTap:L(`Request a double-tap action.`)}}function Rr(e){return yr(Jr(e),Yr(e))}function zr(e,t){let n=Tn(e),i=Object.fromEntries(Object.entries(t).flatMap(([e,t])=>{let i=t.read(n,e);if(t.required&&i===void 0)throw new r(`INVALID_ARGS`,`Expected ${e} to be set.`);return i===void 0?[]:[[e,i]]})),a=Vn(n,{readTargetAlias:!Object.hasOwn(t,`target`),readinessBudgetDeclared:Object.hasOwn(t,`readinessTimeoutMs`)});return h({...a,...g(a),...i})}function Br(e,t){let n=En(e,t),r=jn(n,`kind`,vr);switch(r){case`ref`:return{kind:r,ref:Dn(n,`ref`),label:m(n,`label`)};case`selector`:return{kind:r,selector:Dn(n,`selector`)};case`point`:return{kind:r,x:kn(n,`x`),y:kn(n,`y`)}}}function Vr(e,t){let n=En(e,t),r=jn(n,`kind`,[`ref`,`selector`]);return r===`ref`?{kind:r,ref:Dn(n,`ref`),label:m(n,`label`)}:{kind:r,selector:Dn(n,`selector`)}}function Hr(e,t){let n=En(e,t);return{x:kn(n,`x`),y:kn(n,`y`)}}function Ur(e){switch(e.kind){case`ref`:return{ref:e.ref,label:e.label};case`selector`:return{selector:e.selector};case`point`:return{x:e.x,y:e.y}}}function Wr(e){switch(e.kind){case`ref`:return{ref:e.ref,label:e.label};case`selector`:return{selector:e.selector}}}function Gr(e){return{count:e.count,intervalMs:e.intervalMs,holdMs:e.holdMs,jitterPx:e.jitterPx,doubleTap:e.doubleTap}}function Kr(e){return{depth:e.depth,scope:e.scope,raw:e.raw}}function B(e,t){return{schema:e,required:!1,read:t}}function qr(e,t){return{...Sr(e),...t.min===void 0?{}:{minimum:t.min},...t.max===void 0?{}:{maximum:t.max}}}function Jr(e){return Object.fromEntries(Object.entries(e).filter(([,e])=>e.audience?.kind!==`retired`).map(([e,t])=>[e,t.schema]))}function Yr(e){return Object.entries(e).flatMap(([e,t])=>t.required?[e]:[])}function Xr(e){return Object.fromEntries(Object.entries(e).flatMap(([e,t])=>t.audience?[[e,t.audience]]:[]))}function Zr(){return{oneOf:[...$r(),{type:`object`,properties:{kind:{type:`string`,const:`point`},x:{type:`number`},y:{type:`number`}},required:[`kind`,`x`,`y`],additionalProperties:!1}],description:`UI target. This is separate from deviceTarget, which selects the device form.`}}function Qr(){return{oneOf:$r(),description:`UI element target by snapshot ref or selector expression.`}}function $r(){return[{type:`object`,properties:{kind:{type:`string`,const:`ref`},ref:{type:`string`,description:`Snapshot element ref such as @e12.`},label:{type:`string`,description:`Optional human label for the ref.`}},required:[`kind`,`ref`],additionalProperties:!1},{type:`object`,properties:{kind:{type:`string`,const:`selector`},selector:{type:`string`,description:`Agent-device selector expression.`}},required:[`kind`,`selector`],additionalProperties:!1}]}function V(e,t,n,r){return _r({name:e,description:t,inputSchema:Rr(n),readInput:r?.readInput??(e=>zr(e,n)),inputAudience:Xr(n),...r?.parseableOutput?{parseableOutput:!0}:{}})}function H(e){let t=hr(e.text,e.metadata.description),n=t.mcpDetail?{mcpDetail:t.mcpDetail}:{},r={...e.metadata,...n},i={name:r.name,description:r.description,inputSchema:r.inputSchema,...n,invoke:async(t,n)=>await e.run(t,r.readInput(n))};return{name:e.name,metadata:r,definition:i,cliSchema:{...e.cliSchema,text:t},cliReader:e.cliReader,daemonWriter:e.daemonWriter,cliOutputFormatter:e.cliOutputFormatter,text:t}}function ei(e){return H({name:e.name,text:e.text,metadata:V(e.name,e.description,{}),run:e.run,cliSchema:{},cliReader:(e,t)=>y(t),daemonWriter:_(e.name),cliOutputFormatter:e.cliOutputFormatter})}function U(e){let t={},n={},r={},i={};for(let a of e.commands)ti(t,`CLI schema`,a.name,a.cliSchema),ti(n,`CLI reader`,a.name,a.cliReader),a.daemonWriter&&ti(r,`daemon writer`,a.name,a.daemonWriter),a.cliOutputFormatter&&ti(i,`CLI output formatter`,a.name,a.cliOutputFormatter);return{name:e.name,clientSurface:e.clientSurface,metadata:e.commands.map(e=>e.metadata),definitions:e.commands.map(e=>e.definition),cliSchemas:t,cliReaders:n,daemonWriters:r,cliOutputFormatters:i}}function ti(e,t,n,r){if(Object.hasOwn(e,n))throw Error(`Duplicate command family ${t}: ${n}`);e[n]=r}function ni(e){let t=[`Batch completed: ${e.executed}/${e.total} steps in ${e.totalDurationMs}ms`];for(let n of e.results)t.push(ii(n));return{data:e,text:t.join(`
|
|
1
|
+
import{E as e,N as t,O as n,P as r,S as i,_ as a,k as o,m as s,n as c}from"./sdk-contracts.js";import{a as ee,d as te,f as ne,m as re,n as ie,p as ae,t as oe,u as se}from"./capture.js";import{A as ce,c as le,d as ue,f as de,h as fe,l as pe,m as me,s as he,u as ge,v as l}from"./sdk-batch-runner.js";import{t as _e}from"./viewport.js";import{a as ve,i as ye,n as be,t as xe}from"./sdk-device.js";import{a as Se,c as Ce}from"./lease-scope.js";import{An as we,Cr as Te,In as Ee,Mn as De,Nr as Oe,Rr as ke,_r as Ae,d as je,dr as Me,fr as Ne,h as Pe,hr as Fe,i as Ie,ln as Le,m as Re,ri as ze,s as Be,sn as Ve,ur as He}from"./sdk-batch.js";import{n as Ue}from"./recording-export-quality.js";import{t as We}from"./recording-scope.js";import{a as Ge,n as Ke,o as qe,r as Je,s as Ye}from"./scroll-gesture.js";import{E as Xe,T as Ze,b as Qe,v as $e,w as et}from"./script.js";import{a as tt,i as nt,r as rt}from"./vars.js";import{n as it,r as at,t as ot}from"./format.js";import{n as u,t as st}from"./catalog.js";import{i as ct,r as lt,t as ut}from"./back-mode.js";import{a as dt}from"./sdk-remote-config.js";import{t as ft}from"./session.js";import{a as pt,c as mt,d as ht,f as gt,g as _t,h as vt,i as yt,l as bt,n as xt,o as St,p as Ct,s as wt,t as Tt,u as Et}from"./observability.js";import{n as Dt,t as Ot}from"./success-text.js";import{a as d,i as kt,n as At,r as f}from"./output-common.js";import{t as jt}from"./alert-contract.js";import{a as Mt,i as Nt,l as Pt,o as Ft,s as It,t as Lt,u as Rt,x as zt}from"./settings.js";import{t as Bt}from"./location-coordinates.js";import{t as Vt}from"./snapshot-quality-backend-capabilities.js";import{f as Ht,m as Ut,p as Wt,r as Gt,s as Kt}from"./overlay.js";import{t as qt}from"./mobile-snapshot-semantics.js";import{t as Jt}from"./click-button.js";import{n as Yt}from"./scroll-command.js";import{n as Xt,t as Zt}from"./interaction-positionals.js";import{t as Qt}from"./app-inventory.js";import"./device.js";import{a as $t,f as en,i as tn,m as nn,o as rn,p as an,r as on,t as sn}from"./device-rotation.js";import"./app-inventory-contract.js";import{t as cn}from"./prepare-kind.js";import{n as ln,t as un}from"./path-resolution.js";import"./file.js";import{n as dn,r as fn,s as pn,t as mn}from"./tv-remote.js";import hn from"node:fs";import p from"node:path";const gn=[`path`,`start`,`stop`,`doctor`,`mark`,`clear`],_n=new Set(lt().map(e=>e.key));function vn(e){let t=Se(e);return ce({stateDir:e.stateDir,daemonBaseUrl:e.daemonBaseUrl,daemonTransport:e.daemonTransport,daemonServerMode:e.daemonServerMode,...Ce(t),provider:e.provider,providerSessionId:e.providerSessionId,providerApp:e.providerApp,providerOsVersion:e.providerOsVersion,providerProject:e.providerProject,providerBuild:e.providerBuild,providerSessionName:e.providerSessionName,providerDeviceOrientation:e.providerDeviceOrientation,providerGeoLocation:e.providerGeoLocation,providerTimezone:e.providerTimezone,providerAppiumVersion:e.providerAppiumVersion,providerLanguage:e.providerLanguage,providerLocale:e.providerLocale,providerNetworkProfile:e.providerNetworkProfile,providerCustomNetwork:e.providerCustomNetwork,providerNoResignApp:e.providerNoResignApp,awsProjectArn:e.awsProjectArn,awsDeviceArn:e.awsDeviceArn,awsAppArn:e.awsAppArn,awsRegion:e.awsRegion,awsInteractionMode:e.awsInteractionMode,sessionIsolation:e.sessionIsolation,platform:e.platform,target:e.target,device:e.device,udid:e.udid,serial:e.serial,iosSimulatorDeviceSet:e.iosSimulatorDeviceSet,iosXctestrunFile:e.iosXctestrunFile,iosXctestDerivedDataPath:e.iosXctestDerivedDataPath,iosXctestEnvDir:e.iosXctestEnvDir,androidDeviceAllowlist:e.androidDeviceAllowlist,surface:e.surface,activity:e.activity,launchConsole:e.launchConsole,launchArgs:e.launchArgs,relaunch:e.relaunch,shutdown:e.shutdown,saveScript:e.saveScript,testIme:e.testIme,noRecord:e.noRecord,recordAs:e.recordAs,record:e.record,backMode:e.backMode,metroHost:e.metroHost,metroPort:e.metroPort,bundleUrl:e.bundleUrl,launchUrl:e.launchUrl,...n(e,a),...se(e),appsFilter:e.appsFilter,kind:e.kind,out:e.out,count:e.count,fps:e.fps,quality:e.quality,hideTouches:e.hideTouches,recordingScope:e.recordingScope,intervalMs:e.intervalMs,delayMs:e.delayMs,durationMs:e.durationMs,holdMs:e.holdMs,jitterPx:e.jitterPx,readinessTimeoutMs:e.readinessTimeoutMs,pixels:e.pixels,until:e.until,doubleTap:e.doubleTap,verify:e.verify,settle:e.settle,settleQuietMs:e.settleQuietMs,clickButton:e.clickButton,pauseMs:e.pauseMs,pattern:e.pattern,headless:e.headless,restart:e.restart,replayUpdate:e.replayUpdate,replayBackend:e.replayBackend,replayEnv:e.replayEnv,replayShellEnv:e.replayShellEnv,replayScriptSource:e.replayScriptSource,replayScriptSources:e.replayScriptSources,replayFrom:e.replayFrom,replayPlanDigest:e.replayPlanDigest,replayKeepSession:e.replayKeepSession,failFast:e.failFast,timeoutMs:e.timeoutMs,retries:e.retries,recordVideo:e.recordVideo,artifactsDir:e.artifactsDir,shardAll:e.shardAll,shardSplit:e.shardSplit,findFirst:e.findFirst,findLast:e.findLast,networkInclude:e.networkInclude,batchOnError:e.batchOnError,batchMaxSteps:e.batchMaxSteps,batchSteps:e.batchSteps,verbose:e.debug})}function yn(e,t){return{...vn(e),...t}}function bn(e,t){let n=e.inputSchema.properties;if(!n)return{};let r={},i=t;for(let e of Object.keys(n)){if(!_n.has(e))continue;let t=i[e];xn(t)&&(r[e]=t)}return r}function xn(e){return typeof e==`boolean`||typeof e==`number`||typeof e==`string`}function Sn(e){return{kind:`operator`,source:e}}function Cn(e,t){return`${e} is not accepted as a tool argument. ${wn(e,t)}`}function wn(e,t){if(`operatorPath`in t)return t.operatorPath;let n=`for the process serving these tools.`,r=(t.envFlagKeys??[e]).map(dt).join(` or `);return r===``?`Set ${e} in ~/.agent-device/config.json ${n}`:`Set the ${r} environment variable${t.operatorConfig?` (or ${e} in ~/.agent-device/config.json)`:``} ${n}`}function Tn(e){if(e==null)return{};if(!e||typeof e!=`object`||Array.isArray(e))throw new r(`INVALID_ARGS`,`Expected object arguments.`);return e}function En(e,t){let n=e[t];if(!n||typeof n!=`object`||Array.isArray(n))throw new r(`INVALID_ARGS`,`Expected ${t} to be an object.`);return n}function Dn(e,t){let n=e[t];if(typeof n!=`string`||n.length===0)throw new r(`INVALID_ARGS`,`Expected ${t} to be a non-empty string.`);return n}function On(e,t){let n=e[t];if(n!==void 0){if(typeof n!=`string`)throw new r(`INVALID_ARGS`,`Expected ${t} to be a string.`);return n}}function m(e,t){let n=e[t];if(n!==void 0){if(typeof n!=`string`||n.length===0)throw new r(`INVALID_ARGS`,`Expected ${t} to be a non-empty string.`);return n}}function kn(e,t){let n=e[t];if(typeof n!=`number`||!Number.isFinite(n))throw new r(`INVALID_ARGS`,`Expected ${t} to be a finite number.`);return n}function An(e,t){let n=e[t];if(n!==void 0){if(typeof n!=`boolean`)throw new r(`INVALID_ARGS`,`Expected ${t} to be a boolean.`);return n}}function jn(e,t,n){let i=e[t];if(typeof i!=`string`||!n.includes(i))throw new r(`INVALID_ARGS`,`Expected ${t} to be one of: ${n.join(`, `)}.`);return i}function Mn(e,t,n){let i=e[t];if(i!==void 0){if(typeof i!=`string`||!n.includes(i))throw new r(`INVALID_ARGS`,`Expected ${t} to be one of: ${n.join(`, `)}.`);return i}}function Nn(e,t){let n=e[t];if(n!==void 0){if(!n||typeof n!=`object`||Array.isArray(n))throw new r(`INVALID_ARGS`,`Expected ${t} to be an object.`);return n}}function Pn(e,t){let n=e[t];if(n!==void 0){if(!Array.isArray(n)||n.some(e=>typeof e!=`string`))throw new r(`INVALID_ARGS`,`Expected ${t} to be an array of strings.`);return n}}function Fn(e,t,n,i){let a=new Set(t),o=Object.keys(e).filter(e=>!a.has(e));if(o.length>0)throw new r(`INVALID_ARGS`,`${n} has unknown field(s): ${o.join(`, `)}.`,i===void 0?void 0:{hint:i})}function h(e){return Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0))}const In=Sn({operatorConfig:!0}),Ln={session:{schema:{type:`string`,description:`Agent-device session name.`},read:e=>m(e,`session`),flagKey:`session`,flagIn:[`input`]},platform:{schema:{type:`string`,enum:ye,description:`Platform selector used to resolve a device.`},read:e=>Mn(e,`platform`,ye),flagKey:`platform`,flagIn:[`input`,`selection`]},deviceTarget:{schema:{type:`string`,enum:be,description:`Device target form. Maps to the CLI --target flag.`},read:Un,clientKey:`target`,flagKey:`target`,flagIn:[`input`,`selection`]},target:{schema:{type:`string`,enum:be,description:`Alias for deviceTarget on commands without a UI target field. Interaction commands reserve target for the UI element.`}},device:{schema:{type:`string`,description:`Device name selector (a UDID belongs in udid, a serial in serial).`},read:e=>m(e,`device`),flagKey:`device`,flagIn:[`input`,`selection`]},udid:{schema:{type:`string`,description:`Apple device or simulator UDID; the selector that pins one device when several share a name.`},read:e=>m(e,`udid`),flagKey:`udid`,flagIn:[`input`,`selection`]},serial:{schema:{type:`string`,description:`Android, HarmonyOS, or Vega VVD serial selector.`},read:e=>m(e,`serial`),flagKey:`serial`,flagIn:[`input`,`selection`]},iosSimulatorDeviceSet:{schema:{type:`string`,description:`iOS simulator device-set path used for device resolution.`},read:e=>m(e,`iosSimulatorDeviceSet`),audience:Sn({envFlagKeys:[],operatorConfig:!0}),flagKey:`iosSimulatorDeviceSet`,flagIn:[`input`,`selection`]},iosXctestrunFile:{schema:{type:`string`,description:`Externally built iOS XCTest runner .xctestrun artifact path.`},read:e=>m(e,`iosXctestrunFile`),audience:In,flagKey:`iosXctestrunFile`,flagIn:[`input`]},iosXctestDerivedDataPath:{schema:{type:`string`,description:`Derived data path for external iOS XCTest runner execution.`},read:e=>m(e,`iosXctestDerivedDataPath`),audience:In,flagKey:`iosXctestDerivedDataPath`,flagIn:[`input`]},iosXctestEnvDir:{schema:{type:`string`,description:`Writable directory for iOS XCTest runner env overlays.`},read:e=>m(e,`iosXctestEnvDir`),audience:In,flagKey:`iosXctestEnvDir`,flagIn:[`input`]},androidDeviceAllowlist:{schema:{type:`string`,description:`Android serial allowlist used for device resolution.`},read:e=>m(e,`androidDeviceAllowlist`),flagKey:`androidDeviceAllowlist`,flagIn:[`input`,`selection`]},noRecord:{read:e=>An(e,`noRecord`),flagKey:`noRecord`,flagIn:[`input`,`selection`]},readinessTimeoutMs:{read:Wn},daemonBaseUrl:{schema:{type:`string`,description:`Remote daemon base URL.`},read:e=>m(e,`daemonBaseUrl`),audience:In},daemonAuthToken:{schema:{type:`string`,description:`Remote daemon auth token.`},read:e=>m(e,`daemonAuthToken`),audience:In},tenant:{schema:{type:`string`,description:`Remote tenant identifier.`},read:e=>m(e,`tenant`)},runId:{schema:{type:`string`,description:`Lease run identifier.`},read:e=>m(e,`runId`)},leaseId:{schema:{type:`string`,description:`Existing lease identifier.`},read:e=>m(e,`leaseId`)},cwd:{schema:{type:`string`,description:`Working directory for command execution.`},read:e=>m(e,`cwd`),audience:Sn({operatorPath:`Start the process serving these tools in the desired working directory, or pass absolute paths.`})},debug:{schema:{type:`boolean`,description:`Enable debug diagnostics.`},read:e=>An(e,`debug`)}},Rn=Object.entries(Ln),zn=Object.fromEntries(Rn.flatMap(([e,t])=>t.audience?[[e,t.audience]]:[]));function Bn(){return Object.fromEntries(Rn.flatMap(([e,t])=>t.schema?[[e,t.schema]]:[]))}function Vn(e,t={}){let n={};for(let[r,i]of Rn)i.read&&(n[r]=i.read(e,t));return n}function g(e){let t={};for(let[n,r]of Rn)r.read&&(t[r.clientKey??n]=e[n]);return h(t)}function Hn(e,t){let n={};for(let[r,i]of Rn){if(i.flagIn===void 0||!i.flagIn.includes(t))continue;let a=t===`selection`?i.clientKey??r:r;n[a]=e[i.flagKey]}return n}function Un(e,t){let n=Mn(e,`deviceTarget`,be);if(t.readTargetAlias===!1||e.target===void 0)return n;let i=Mn(e,`target`,be);if(n!==void 0&&i!==n)throw new r(`INVALID_ARGS`,`Expected target alias to match deviceTarget when both are set.`);return n??i}function Wn(e,t){if(!(t.readinessBudgetDeclared===!0||!Object.hasOwn(e,`readinessTimeoutMs`)))throw new r(`INVALID_ARGS`,`readinessTimeoutMs applies only to commands that wait for their target: press, click, and longpress.`)}function _(e,t){return n=>v(e,t?t(n):[],n)}function v(e,t,n,r){return{command:e,positionals:t,...r?{input:r}:{},options:Gn(n)}}function Gn(e){let t=Kn(e.deviceTarget??e.target);if(t===void 0&&e.target===void 0)return e;let{target:n,...r}=e;return t===void 0?r:{...r,target:t}}function Kn(e){return e===`mobile`||e===`tv`||e===`desktop`?e:void 0}function y(e){return h(Hn(e,`input`))}function qn(e){return h({record:e.record})}function Jn(e){return Hn(e,`selection`)}function Yn(e){return h({depth:e.snapshotDepth,scope:e.snapshotScope,raw:e.snapshotRaw})}function Xn(e){return{depth:e.snapshotDepth,scope:e.snapshotScope,raw:e.snapshotRaw}}function Zn(e){return h({settle:e.settle,settleQuietMs:e.settleQuietMs,timeoutMs:e.timeoutMs})}function Qn(e){return h({count:e.count,intervalMs:e.intervalMs,holdMs:e.holdMs,jitterPx:e.jitterPx,doubleTap:e.doubleTap})}function $n(e){if(`ref`in e&&e.ref!==void 0)return h({kind:`ref`,ref:e.ref,label:e.label});if(`selector`in e&&e.selector!==void 0)return{kind:`selector`,selector:e.selector};let t=e;return{kind:`point`,x:t.x,y:t.y}}function er(e){let t=nr(e);if(typeof t.ref==`string`)return[t.ref,...ir(t.label)];if(typeof t.selector==`string`)return[t.selector];if(t.kind===`point`||t.x!==void 0||t.y!==void 0)return[String(rr(t.x,`x`)),String(rr(t.y,`y`))];throw new r(`INVALID_ARGS`,`interaction requires @ref, selector, or point target`)}function tr(e){let t=nr(e);if(typeof t.ref==`string`)return[t.ref,...ir(t.label)];if(typeof t.selector==`string`)return[t.selector];throw new r(`INVALID_ARGS`,`element command requires @ref or selector target`)}function nr(e){if(!e||typeof e!=`object`||Array.isArray(e))throw new r(`INVALID_ARGS`,`Expected target object.`);let t=e,n=t.target;return n&&typeof n==`object`&&!Array.isArray(n)?n:t}function rr(e,t){if(typeof e!=`number`||!Number.isFinite(e))throw new r(`INVALID_ARGS`,`point target requires numeric ${t}.`);return e}function ir(e){return typeof e==`string`&&e.length>0?[e]:[]}function ar(e){let t=Me(e);if(!t.ok)throw new r(t.code,t.message);return`ref`in t?{ref:t.ref,label:lr(e.slice(1))}:{selector:t.selector}}function or(e){let t=Ne(e);if(!t.ok)throw new r(t.code,t.message);return t.format}function sr(e,t={}){let n=Te(e,t);if(!n)throw new r(`INVALID_ARGS`,He);return n}function cr(e,t){try{let t=JSON.parse(e);if(t&&typeof t==`object`&&!Array.isArray(t))return t}catch{}throw new r(`INVALID_ARGS`,`${t} must be a JSON object`)}function lr(e){return e.join(` `).trim()||void 0}function b(...e){return new Set(e)}function x(e,t){return e!==void 0&&t.has(e)}function ur(e){return e===void 0||e.trim()===``?!1:Number.isFinite(Number(e))}function dr(e,t){if(e===void 0)return;let n=Number(e);if(Number.isFinite(n))return n;throw new r(`INVALID_ARGS`,`${t} must be a finite number.`)}function fr(e){return e===void 0?void 0:Number(e)}function S(e){return e===void 0?[]:[e]}function C(e){return e===void 0?[]:[String(e)]}function w(e,t){if(e===void 0||e===``)throw new r(`INVALID_ARGS`,t);return e}function T(e,t){if(typeof e!=`string`||e.length===0)throw new r(`INVALID_ARGS`,t);return e}function pr(e){return gr(e.description,e.cliDetail)}function mr(e){return gr(e.description,e.mcpDetail)}function hr(e,t){return{...e,description:t}}function gr(e,t){return t?`${e} ${t}`:e}function _r(e){return e}const vr=[`ref`,`selector`,`point`];function yr(e,t=[]){return{type:`object`,properties:{...Bn(),...e},...t.length>0?{required:t}:{},additionalProperties:!1}}function E(e,t=[],n){return{type:`object`,...n?{description:n}:{},properties:e,...t.length>0?{required:t}:{}}}function br(e){return{type:`object`,description:e,properties:{x:{type:`number`},y:{type:`number`}},required:[`x`,`y`],additionalProperties:!1}}function D(e,t){return{type:`string`,enum:e,...t?{description:t}:{}}}function O(e){return{type:`string`,const:e}}function k(e){return{type:`string`,...e?{description:e}:{}}}function xr(e){return{type:[`string`,`null`],...e?{description:e}:{}}}function A(e,t={}){return{type:`number`,...e?{description:e}:{},...t.min===void 0?{}:{minimum:t.min},...t.max===void 0?{}:{maximum:t.max}}}function Sr(e){return{type:`integer`,...e?{description:e}:{}}}function j(e){return{type:`boolean`,...e?{description:e}:{}}}function Cr(e){return{type:`array`,items:{type:`string`},...e?{description:e}:{}}}function M(e){return{type:`object`,additionalProperties:!0,...e?{description:e}:{}}}function N(e){return{...e,required:!0}}function P(e,t={}){return B(k(e),t.allowEmpty===!0?On:m)}function wr(e){return{schema:{type:`null`},required:!1,audience:{kind:`retired`,message:e},read:(t,n)=>{if(Object.hasOwn(t,n))throw new r(`INVALID_ARGS`,e)}}}function Tr(e,t){return{...e,audience:{kind:`operator`,source:t}}}function F(e,t={}){return B(A(e,t),(e,n)=>fe(e,n,t))}function I(e,t={}){return B(qr(e,t),(e,n)=>me(e,n,t))}function L(e){return B(j(e),An)}function Er(e){return Or(Dr(e))}function Dr(e){let[t,...n]=ct(e).filter(e=>e.inputDescription!==void 0);if(!t)throw Error(`Flag ${e} declares no inputDescription; optionField cannot derive a field`);if(n.length>0)throw Error(`Flag ${e} declares inputDescription more than once`);return t}function Or(e){let t=e.inputDescription,n={min:e.min,max:e.max};switch(e.type){case`boolean`:return L(t);case`int`:return I(t,n);case`number`:return F(t,n);case`string`:return P(t);case`enum`:return R(kr(e),t);case`booleanOrString`:throw Error(`Flag ${e.key} is booleanOrString; declare its field shape explicitly with jsonSchemaField`)}}function kr(e){let t=e.enumValues;if(!t)throw Error(`Flag ${e.key} is an enum with no enumValues`);return t}function R(e,t){return B(D(e,t),(t,n)=>Mn(t,n,e))}function Ar(e){return B(M(e),Nn)}function jr(e){return B(Cr(e),Pn)}function z(e){return B(e,(e,t)=>e[t])}function Mr(e,t){return B(e,t)}function Nr(){return B(Zr(),(e,t)=>e[t]===void 0?void 0:Br(e,t))}function Pr(){return B(Qr(),(e,t)=>e[t]===void 0?void 0:Vr(e,t))}function Fr(e){return B(br(e),(e,t)=>e[t]===void 0?void 0:Hr(e,t))}function Ir(){return{depth:I(`Snapshot traversal depth.`,{min:0}),scope:P(`Snapshot scope selector used before resolution.`),raw:L(`Use raw snapshot data during selector resolution.`)}}function Lr(){return{count:I(`Number of press/click repetitions.`,{min:1}),intervalMs:I(`Delay between repeated press/click actions.`,{min:0}),holdMs:I(`Hold duration for each action.`,{min:0}),jitterPx:I(`Randomization radius in pixels.`,{min:0}),doubleTap:L(`Request a double-tap action.`)}}function Rr(e){return yr(Jr(e),Yr(e))}function zr(e,t){let n=Tn(e),i=Object.fromEntries(Object.entries(t).flatMap(([e,t])=>{let i=t.read(n,e);if(t.required&&i===void 0)throw new r(`INVALID_ARGS`,`Expected ${e} to be set.`);return i===void 0?[]:[[e,i]]})),a=Vn(n,{readTargetAlias:!Object.hasOwn(t,`target`),readinessBudgetDeclared:Object.hasOwn(t,`readinessTimeoutMs`)});return h({...a,...g(a),...i})}function Br(e,t){let n=En(e,t),r=jn(n,`kind`,vr);switch(r){case`ref`:return{kind:r,ref:Dn(n,`ref`),label:m(n,`label`)};case`selector`:return{kind:r,selector:Dn(n,`selector`)};case`point`:return{kind:r,x:kn(n,`x`),y:kn(n,`y`)}}}function Vr(e,t){let n=En(e,t),r=jn(n,`kind`,[`ref`,`selector`]);return r===`ref`?{kind:r,ref:Dn(n,`ref`),label:m(n,`label`)}:{kind:r,selector:Dn(n,`selector`)}}function Hr(e,t){let n=En(e,t);return{x:kn(n,`x`),y:kn(n,`y`)}}function Ur(e){switch(e.kind){case`ref`:return{ref:e.ref,label:e.label};case`selector`:return{selector:e.selector};case`point`:return{x:e.x,y:e.y}}}function Wr(e){switch(e.kind){case`ref`:return{ref:e.ref,label:e.label};case`selector`:return{selector:e.selector}}}function Gr(e){return{count:e.count,intervalMs:e.intervalMs,holdMs:e.holdMs,jitterPx:e.jitterPx,doubleTap:e.doubleTap}}function Kr(e){return{depth:e.depth,scope:e.scope,raw:e.raw}}function B(e,t){return{schema:e,required:!1,read:t}}function qr(e,t){return{...Sr(e),...t.min===void 0?{}:{minimum:t.min},...t.max===void 0?{}:{maximum:t.max}}}function Jr(e){return Object.fromEntries(Object.entries(e).filter(([,e])=>e.audience?.kind!==`retired`).map(([e,t])=>[e,t.schema]))}function Yr(e){return Object.entries(e).flatMap(([e,t])=>t.required?[e]:[])}function Xr(e){return Object.fromEntries(Object.entries(e).flatMap(([e,t])=>t.audience?[[e,t.audience]]:[]))}function Zr(){return{oneOf:[...$r(),{type:`object`,properties:{kind:{type:`string`,const:`point`},x:{type:`number`},y:{type:`number`}},required:[`kind`,`x`,`y`],additionalProperties:!1}],description:`UI target. This is separate from deviceTarget, which selects the device form.`}}function Qr(){return{oneOf:$r(),description:`UI element target by snapshot ref or selector expression.`}}function $r(){return[{type:`object`,properties:{kind:{type:`string`,const:`ref`},ref:{type:`string`,description:`Snapshot element ref such as @e12.`},label:{type:`string`,description:`Optional human label for the ref.`}},required:[`kind`,`ref`],additionalProperties:!1},{type:`object`,properties:{kind:{type:`string`,const:`selector`},selector:{type:`string`,description:`Agent-device selector expression.`}},required:[`kind`,`selector`],additionalProperties:!1}]}function V(e,t,n,r){return _r({name:e,description:t,inputSchema:Rr(n),readInput:r?.readInput??(e=>zr(e,n)),inputAudience:Xr(n),...r?.parseableOutput?{parseableOutput:!0}:{}})}function H(e){let t=hr(e.text,e.metadata.description),n=t.mcpDetail?{mcpDetail:t.mcpDetail}:{},r={...e.metadata,...n},i={name:r.name,description:r.description,inputSchema:r.inputSchema,...n,invoke:async(t,n)=>await e.run(t,r.readInput(n))};return{name:e.name,metadata:r,definition:i,cliSchema:{...e.cliSchema,text:t},cliReader:e.cliReader,daemonWriter:e.daemonWriter,cliOutputFormatter:e.cliOutputFormatter,text:t}}function ei(e){return H({name:e.name,text:e.text,metadata:V(e.name,e.description,{}),run:e.run,cliSchema:{},cliReader:(e,t)=>y(t),daemonWriter:_(e.name),cliOutputFormatter:e.cliOutputFormatter})}function U(e){let t={},n={},r={},i={};for(let a of e.commands)ti(t,`CLI schema`,a.name,a.cliSchema),ti(n,`CLI reader`,a.name,a.cliReader),a.daemonWriter&&ti(r,`daemon writer`,a.name,a.daemonWriter),a.cliOutputFormatter&&ti(i,`CLI output formatter`,a.name,a.cliOutputFormatter);return{name:e.name,clientSurface:e.clientSurface,metadata:e.commands.map(e=>e.metadata),definitions:e.commands.map(e=>e.definition),cliSchemas:t,cliReaders:n,daemonWriters:r,cliOutputFormatters:i}}function ti(e,t,n,r){if(Object.hasOwn(e,n))throw Error(`Duplicate command family ${t}: ${n}`);e[n]=r}function ni(e){let t=[`Batch completed: ${e.executed}/${e.total} steps in ${e.totalDurationMs}ms`];for(let n of e.results)t.push(ii(n));return{data:e,text:t.join(`
|
|
2
2
|
`)}}const ri={batch:d(ni)};function ii(e){let t=Ot(e.data)??e.command;return`${e.step}. OK ${t} (${e.durationMs}ms)`}function ai(e=Ie){let t=oi(e);return V(`batch`,`Execute multiple commands in one daemon request.`,t,{readInput:e=>ci(e,t)})}function oi(e){return{steps:N(Mr({type:`array`,description:`Structured batch steps. Each step uses a command name and the same input object as that command tool.`,items:si(e)},(t,n)=>li(t[n],e))),onError:R([`stop`],`Batch failure policy.`),maxSteps:I(`Maximum number of steps accepted for this batch.`,{min:1,max:1e3}),out:P(`Optional output path for command artifacts.`)}}function si(e){return{type:`object`,properties:{command:{type:`string`,enum:e,description:`Command name to run with structured input.`},input:{type:`object`,additionalProperties:!0,commandInputFor:`command`,description:`Structured command input for the nested command. Use the matching MCP tool schema for this object.`},runtime:{type:`object`,additionalProperties:!0,description:`Optional per-step runtime payload.`}},required:[`command`,`input`],additionalProperties:!1}}function ci(e,t){let n=zr(e,t),i=n.maxSteps??100;if(!pe(i))throw new r(`INVALID_ARGS`,`Invalid batch maxSteps: ${String(n.maxSteps)}`);return le(n.steps.length,i),{...n}}function li(e,t){if(!Array.isArray(e))throw new r(`INVALID_ARGS`,`Expected steps to be an array.`);return e.map((e,n)=>ui(e,n+1,t))}function ui(e,t,n){let r=de(e,t);return Fn(r,[`command`,`input`,`runtime`],`Batch step ${t}`,he),{command:di(r,t,n),input:ue(r,t),...fi(r,t)}}function di(e,t,n){if(n===Ie)return Be(e.command,t);let i=e.command;if(typeof i!=`string`||!n.includes(i))throw new r(`INVALID_ARGS`,`Expected command to be one of: ${n.join(`, `)}.`);return i}function fi(e,t){let n=ge(e.runtime,t);return n===void 0?{}:{runtime:n}}function pi(e){return async t=>v(u.batch,[],{...t,batchSteps:await mi(t.steps,e),batchOnError:t.onError,batchMaxSteps:t.maxSteps})}async function mi(e,t){if(!Array.isArray(e)||e.length===0)throw new r(`INVALID_ARGS`,`batch requires a non-empty steps array.`);let n=[];for(let[r,i]of e.entries())n.push(await hi(i,r+1,t));return n}async function hi(e,t,n){let r=de(e,t),i=gi(r,t),a=ue(r,t),o=ge(r.runtime,t),s=await n(i,a,t);return{command:s.command,positionals:s.positionals,...s.input?{input:s.input}:{},flags:yn(s.options,s.metadataFlags),runtime:o??s.options.runtime}}function gi(e,t){return Be(e.command,t)}const _i=ai(),vi={usageOverride:`batch [--steps <json> | --steps-file <path>]`,usageFlags:[],listUsageOverride:`batch --steps <json> | --steps-file <path>`,allowedFlags:[`steps`,`stepsFile`,`batchOnError`,`batchMaxSteps`,`out`]},yi=(e,t)=>({...y(t),steps:t.batchSteps??[],onError:t.batchOnError,maxSteps:t.batchMaxSteps,out:t.out}),bi=[{command:`snapshot`,input:{interactiveOnly:!0}},{command:`press`,input:{target:{kind:`ref`,ref:`@e12`},settle:!0}},{command:`fill`,input:{target:{kind:`selector`,selector:`id="field-email"`},text:`qa@example.com`}}];function xi(){return`${[`Each step is {"command":"<name>","input":{...}}, and input is that command's structured input object rather than its terminal spelling: a CLI positional becomes a named field (target, text, direction) and a CLI flag becomes a camelCase key (--settle -> "settle":true, -i -> "interactiveOnly":true). There is no positional step form; args, argv, positionals, and flags are not step fields. agent-device help <command> lists arguments in CLI spelling only. The examples below carry the structured spelling; over MCP, the command tool schema states it in full.`,`Steps run serially in one daemon request against the same session, in order. Mutating UI verbs are included (press, click, fill, longpress, scroll, back), which is where the round-trip saving is; --on-error stop halts at the first failing step.`,`Available through batch: ${[...Ie].sort().join(`, `)}.`,`Every other command is excluded: batch and replay never nest, and session, daemon, connection, and host tooling commands own lifecycle a batch request cannot carry. Run those on their own.`].join(` `)}\n\nExamples:\n${[` agent-device batch --steps '${JSON.stringify(bi)}'`,` agent-device batch --steps-file ./steps.json --json`].join(`
|
|
3
3
|
`)}`}const Si=U({name:`batch`,clientSurface:!1,commands:[H({name:`batch`,text:{summary:`Run multiple commands`,cliDetail:xi()},metadata:_i,run:(e,t)=>e.batch.run(Ci(t)),cliSchema:vi,cliReader:yi,cliOutputFormatter:ri.batch})]});function Ci(e){return{...g(e),steps:e.steps,onError:e.onError,maxSteps:e.maxSteps,out:e.out}}const wi=`alert`,Ti=H({name:wi,text:{summary:`Inspect, accept, or dismiss a platform alert`},metadata:V(wi,`Inspect, wait for, accept, or dismiss a platform alert. Use get before acting when the alert content matters; accept and dismiss change the active alert state. Each iOS XCTest execution activates once, then only observes. Inspect again after an unconfirmed action; never assume a timeout means nothing happened.`,{action:R(jt),timeoutMs:I()}),run:(e,t)=>e.command.alert(t),cliSchema:{usageOverride:`alert [get|accept|dismiss|wait] [timeout]`,positionalArgs:[`action?`,`timeout?`]},cliReader:(e,t)=>({...y(t),...Di(e)}),daemonWriter:_(u.alert,e=>Ei(e)),cliOutputFormatter:f});function Ei(e){return[e.action??`get`,...C(e.timeoutMs)]}function Di(e){if(e.length>2)throw new r(`INVALID_ARGS`,`alert accepts at most action and timeout arguments.`);return h({action:Oi(e[0]),timeoutMs:dr(e[1],`alert timeout`)})}function Oi(e){let t=e?.toLowerCase();if(t===void 0||t===`get`||t===`accept`||t===`dismiss`||t===`wait`)return t;throw new r(`INVALID_ARGS`,`alert action must be get, accept, dismiss, or wait.`)}function W(...e){return e}const ki=W(`keyframes`),Ai=W(`snapshotInteractiveOnly`,`snapshotDepth`,`snapshotScope`,`snapshotRaw`),ji=W(`snapshotDepth`,`snapshotScope`,`snapshotRaw`),Mi=W(`metroProjectRoot`,`kind`,`metroKind`,`metroPublicBaseUrl`,`metroProxyBaseUrl`,`metroBearerToken`,`metroPreparePort`,`metroListenHost`,`metroStatusHost`,`metroStartupTimeoutMs`,`metroProbeTimeoutMs`,`metroRuntimeFile`,`metroNoReuseExisting`,`metroNoInstallDeps`),Ni=W(`metroHost`,`metroPort`,`bundleUrl`),Pi=W(`count`,`intervalMs`,`holdMs`,`jitterPx`,`doubleTap`),Fi=W(`settle`,`settleQuietMs`,`timeoutMs`),Ii=W(`replayUpdate`,`replayEnv`),Li=W(`remoteConfig`,`stateDir`,`daemonBaseUrl`,`daemonAuthToken`,`daemonTransport`,`daemonServerMode`,`tenant`,`sessionIsolation`,`runId`,`leaseId`,`leaseBackend`,`sessionLock`,`platform`,`target`,`device`,`providerApp`,`providerOsVersion`,`providerProject`,`providerBuild`,`providerSessionName`,`providerDeviceOrientation`,`providerGeoLocation`,`providerTimezone`,`providerAppiumVersion`,`providerLanguage`,`providerLocale`,`providerNetworkProfile`,`providerCustomNetwork`,`providerNoResignApp`,`awsProjectArn`,`awsDeviceArn`,`awsAppArn`,`awsRegion`,`awsInteractionMode`,`udid`,`serial`,`iosSimulatorDeviceSet`,`iosXctestrunFile`,`iosXctestDerivedDataPath`,`iosXctestEnvDir`,`androidDeviceAllowlist`,`session`,`noRecord`),Ri=new Set([`platform`,`device`,`udid`,`serial`,`session`]),zi=new Set([`json`,`config`,`help`,`version`,`verbose`,`cost`,`responseLevel`]),Bi=`diff`,Vi={diff:E({mode:O(`snapshot`),baselineInitialized:j(),summary:E({additions:A(),removals:A(),unchanged:A()},[`additions`,`removals`,`unchanged`]),lines:{type:`array`,items:E({kind:D([`added`,`removed`,`unchanged`]),text:k(),ref:k()},[`kind`,`text`])},warnings:Cr()},[`mode`,`baselineInitialized`,`summary`,`lines`])},Hi=H({name:Bi,text:{summary:`Diff snapshot or screenshot`,cliDetail:`Screenshot --threshold is a per-pixel RGB tolerance: 0 requires exact colors and 1 ignores color differences; image dimensions must still match. Both screenshot inputs are decoded from their bytes, so a baseline or current image may be PNG or JPEG, and the diff image is always PNG. JPEG is lossy, so keep --threshold above 0 whenever either input is JPEG. Live iOS simulator screenshot diffs normalize status-bar chrome by default; use screenshot --normalize-status-bar when capturing reusable baselines.`},metadata:V(Bi,`Compare accessibility snapshots or screenshots to identify UI changes. Use snapshot comparisons for semantic tree changes and screenshot comparisons for pixel differences.`,{kind:N(z({type:`string`,const:`snapshot`})),out:P(),interactiveOnly:L(),depth:I(),scope:P(),raw:L()}),run:(e,t)=>e.capture.diff(t),cliSchema:{usageOverride:`diff snapshot | diff screenshot --baseline <path> [current.png] [--out <diff.png>] [--threshold <0-1>] [--overlay-refs]`,usageFlags:[],positionalArgs:[`kind`,`current?`],allowedFlags:[...Ai,`baseline`,`threshold`,`out`,`overlayRefs`]},cliReader:(e,t)=>{if(e[0]!==`snapshot`)throw new r(`INVALID_ARGS`,`Only diff snapshot is available through this parser.`);return{...y(t),kind:`snapshot`,out:t.out,interactiveOnly:t.snapshotInteractiveOnly,depth:t.snapshotDepth,scope:t.snapshotScope,raw:t.snapshotRaw}},daemonWriter:_(u.diff,e=>[T(e.kind,`diff requires kind`)])}),Ui=`screenshot`,Wi=H({name:Ui,text:{summary:`Capture a screenshot`,cliDetail:`Web defaults to the viewport; use --fullscreen, --full, or -f for the entire page. iOS simulators default to 1x logical-point output; use --pixel-density to request a different screenshot density. macOS app sessions default to the app window; use --fullscreen for full desktop, --scale to downscale, --crop-on <selector> to crop the capture to the frame the selector resolves on the same screen (currently iOS simulators and Android emulators), --overlay-refs to annotate current refs, --normalize-status-bar for deterministic iOS simulator chrome, or --no-stabilize for low-latency Android capture loops. On macOS, any --surface other than app (desktop, menubar, frontmost-app) always captures the main display and refuses an explicit --fullscreen. On single-display iOS simulators and Android devices, the result reports displayRotation, the rotation the display rendered the capture in, when the device returns a reading in time; otherwise the field is absent.`},metadata:V(Ui,`Capture a screenshot of the active app or web session. Choose the capture scope, density, size, or annotations through the corresponding input fields when needed.`,{path:P(`Output path.`),cropOn:P(`Selector expression; the capture is cropped to the frame the selector resolves on the same screen.`),overlayRefs:L(),pixelDensity:I(`Output screenshot pixel density in pixels per logical point.`,{min:1}),fullscreen:L(),scale:F(`Screenshot scale factor.`,ee),maxSize:wr(oe.migration.screenshot),stabilize:L(),normalizeStatusBar:L(),surface:R(ft)}),run:(e,t)=>e.capture.screenshot(t),cliSchema:{positionalArgs:[`path?`],allowedFlags:ie},cliReader:(e,t)=>({...y(t),path:e[0]??t.out,...ne(t)}),daemonWriter:e=>(ae(`screenshot`,e),re(e),v(u.screenshot,S(e.path),{...e,...te(e)}))}),Gi=`settings`,Ki=V(Gi,`Read or change supported operating-system settings, animation scales, appearance, or app permissions on the selected target. Platform support varies by setting and action.`,{setting:N(P()),state:P(),app:P("App the change targets, by bundle id or package name: the app `clear-app-state` clears, or the app a `permission` change (or an iOS-simulator `location on|off` privacy change) lands on. An app named here needs no session and need not be running (Android `deny|reset` of a held permission does kill a running one); without it those changes use the session app, and a change that is device-wide refuses one with `setting_app_not_consumed` (`location set` on any target, the Android `location on|off` toggle, macOS permissions). The CLI consumes it only when this invocation passes it: an `AGENT_DEVICE_TARGET_APP` or config `targetApp` never retargets a settings mutation."),latitude:F(),longitude:F(),permission:P(),mode:R([...It])}),qi={usageOverride:Rt,listUsageOverride:`settings [area] [options]`,positionalArgs:[`setting`,`state?`,`target?`,`mode?`],allowedFlags:[`targetApp`],explicitOnlyFlags:[`targetApp`]},Ji=(e,t)=>{let n=Qi(e,t);return n.setting===`clear-app-state`||t.targetApp===void 0?n:{...n,app:t.targetApp}},Yi=e=>{let t=e,n=h({app:Xi(t)});return v(u.settings,ea(t),e,Object.keys(n).length===0?void 0:n)};function Xi(e){if(e.setting===`permission`||e.setting===`location`)return e.app}const Zi=H({name:Gi,text:{summary:`Change OS settings and app permissions`,cliDetail:`macOS supports only settings appearance <light|dark|toggle> and settings ${Pt}; wifi|airplane|location|animations|text-size remain unsupported on macOS. Mobile permission actions default to the active session app; pass --app <id> (or the app input) to aim a permission change, or an iOS-simulator location on|off, at an installed app no session has opened; no app needs to be running, and the CLI consumes the app only when this invocation names it, never from AGENT_DEVICE_TARGET_APP or config targetApp. clear-app-state takes its app positionally or with --app, and refuses two different apps. A device-wide change refuses an app with setting_app_not_consumed: location set moves the device's own coordinates on every target, the Android location toggle writes the device's location_mode, and a macOS permission is a host-level TCC grant. On Android, deny|reset of a permission the app currently holds kills a running app; the response reports priorGrantState (granted|not_granted|unknown) and warns for granted and unknown, with open <app> --relaunch to restore it. Permission changes require a resolvable foreground user and fail without mutating if adb cannot report one. Android settings airplane on|off is applied by the connectivity service (Android 11+) and reports the airplaneMode that service holds; older builds fail without changing device state. settings reset-keychain clear is iOS-simulator-only and resets the whole simulator keychain, not just the selected app: simctl exposes no per-app keychain reset, so every app on that simulator loses its keychain-backed credentials (e.g. Firebase auth). clear-app-state does not touch the keychain, so a full fresh-install reset needs both; relaunch the app afterward to observe the signed-out state. settings text-size reads the preferred text size the target holds and settings text-size <category> applies one, on iPhone and iPad simulators (simctl content size) and on Android targets (system font_scale); tvOS and visionOS simulators, physical Apple devices, and the macOS host refuse it. Android has no category ladder of its own, so the read names the nearest rung and reports the exact multiplier as platformValue; an already-running app adopts a changed size at its next configuration change, so relaunch the app under test to observe it.`},metadata:Ki,run:(e,t)=>e.settings.update(t),cliSchema:qi,cliReader:Ji,daemonWriter:Yi,cliOutputFormatter:f});function Qi(e,t){let n=Jn(t),i=e[0],a=e[1];if(x(i,ra)&&x(a,ia))return{...n,setting:i,state:a};if(i===`location`&&a===`set`)return{...n,setting:i,state:a,latitude:Bt(e[2],`latitude`),longitude:Bt(e[3],`longitude`)};if(i===`appearance`&&x(a,aa))return{...n,setting:i,state:a};if(i===`text-size`)return a===void 0?{...n,setting:i}:{...n,setting:i,state:zt(a)};if(x(i,oa)&&x(a,sa)||i===`fingerprint`&&x(a,ca))return{...n,setting:i,state:a};if(i===`permission`&&x(a,ua))return{...n,setting:i,state:a,permission:ta(e[2]),mode:na(e[3])};if(i===`clear-app-state`)return{...n,setting:i,state:`clear`,app:$i(e,t)};if(i===`reset-keychain`&&a===`clear`&&e.length===2)return{...n,setting:i,state:a};throw new r(`INVALID_ARGS`,`Invalid settings arguments.`)}function $i(e,t){let n=e[1]===`clear`?e[2]:e[1],i=t.targetApp;if(n!==void 0&&i!==void 0&&n!==i)throw new r(`INVALID_ARGS`,`settings clear-app-state names two apps: ${n} and ${i}. Name one.`);return n??i}function ea(e){return e.setting===`clear-app-state`?[e.setting,...S(e.app)]:e.setting===`text-size`?[e.setting,...S(e.state)]:e.setting===`location`&&e.state===`set`?[e.setting,e.state,String(e.latitude),String(e.longitude)]:e.setting===`permission`?[e.setting,e.state,e.permission,...S(e.mode)]:[e.setting,e.state]}function ta(e){if(x(e,da))return e;throw new r(`INVALID_ARGS`,`settings permission requires a permission target.`)}function na(e){if(e===void 0||x(e,la))return e;throw new r(`INVALID_ARGS`,`settings permission mode must be full or limited.`)}const ra=b(`wifi`,`airplane`,`location`,`animations`),ia=b(`on`,`off`),aa=b(...Lt),oa=b(`faceid`,`touchid`),sa=b(`match`,`nonmatch`,`enroll`,`unenroll`),ca=b(`match`,`nonmatch`),la=b(...It),ua=b(...Ft),da=b(...Mt,...Nt);function fa(e){if(!Array.isArray(e)||e.length===0)return e;let t=ke(e);return e.map(e=>{let n=pa(e,t,e=>e.label),r=pa(e,t,e=>e.identifier),i=typeof e.label==`string`&&e.label.length>=24&&e.label===n,a=typeof e.identifier==`string`&&e.identifier.length>=24&&e.identifier===r;if(!i&&!a)return e;let o={...e};return i&&(delete o.label,o.inheritsLabel=!0),a&&(delete o.identifier,o.inheritsIdentifier=!0),o})}function pa(e,t,n){let r=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0;for(;r;){let e=n(r);if(typeof e==`string`&&e.length>0)return e;r=typeof r.parentIndex==`number`?t.get(r.parentIndex):void 0}}function ma(e){return e.width>0&&e.height>0}function ha(e,t){return!e||!t?!1:e.x>=t.x-2&&e.y>=t.y-2&&e.x+e.width<=t.x+t.width+2&&e.y+e.height<=t.y+t.height+2}function ga(e,t){if(!e||!t)return!0;let n=e.y+e.height/2,r=t.y+t.height/2;return Math.abs(n-r)<=Math.max(e.height,t.height,1)}function _a(e){return typeof e.parentIndex!=`number`}function va(e){let t=(e.type??``).toLowerCase(),n=(e.identifier??``).trim().toLowerCase();return t.includes(`edittext`)||t.includes(`textfield`)||n===`composer`}function ya(e){let t=(e.type??``).toLowerCase();return t.includes(`scroll`)||t.includes(`list`)||t.includes(`recyclerview`)}function ba(e){let t=Oe(e);if(!t||t!==e.identifier?.trim()||!Sa(t))return t;let n=(e.type??``).toLowerCase();return n.includes(`view`)||n.includes(`layout`)||n.includes(`image`)||n.includes(`list`)||n.includes(`recyclerview`)||n.includes(`collection`)?``:t}function xa(e){let t=e.trim().replaceAll(/\s+/g,` `).toLowerCase();return!t||/^(true|false|\d+)$/.test(t)?null:t}function Sa(e){return/^[\w.]+:id\/[\w.-]+$/i.test(e)}function Ca(e,t,n){let r=e;for(;typeof r.parentIndex==`number`;){let e=t.get(r.parentIndex);if(!e)return null;if(n(e))return e;r=e}return null}function wa(e,t){let n=[],r=[t];for(;r.length>0;){let t=r.pop();for(let i of e)i.parentIndex===t&&(n.push(i),r.push(i.index))}return n}function Ta(e,t,n){let r=[t];for(;r.length>0;){let t=r.pop();if(!n.has(t)){n.add(t);for(let i of e)i.parentIndex!==t||n.has(i.index)||r.push(i.index)}}}const Ea=[`button`,`switch`,`checkbox`,`radio`],Da=[`button`,`image`,`textview`,`view`];function Oa(e,t,n){for(let r of e){if(t.has(r.index)||!ja(r))continue;let i=Ma(wa(e,r.index),r,t);if(i.label){n.set(r.index,{...r,...n.get(r.index),label:i.label});for(let n of i.removableIndexes)Ta(e,n,t)}}}function ka(e,t,n){let r=new Map;for(let i of e){if(t.has(i.index)||!Ba(i))continue;let a=xa(ba(i));if(!a)continue;let o=r.get(a);if(o&&La(o,i,t)){let s=Ra(e,o,i,t,n);r.set(a,s);continue}r.set(a,i)}}function Aa(e,t){for(let n of e){if(t.has(n.index)||!Fa(n))continue;let r=xa(ba(n));if(!r)continue;let i=wa(e,n.index).filter(e=>!t.has(e.index)&&Ia(n,e,r));for(let n of i.filter(Pa))Ta(e,n.index,t);let a=i.filter(e=>!Pa(e)),o=new Set(a.map(e=>xa(ba(e))).filter(e=>!!e));if(!(a.length<2||o.size<2))for(let n of a)Ta(e,n.index,t)}}function ja(e){return e.hittable===!0&&!va(e)&&!!(e.rect&&ma(e.rect))&&ba(e).trim().length===0}function Ma(e,t,n){let r=[],i=[],a=new Set;for(let o of e){if(n.has(o.index)||!Na(o,e)||!ha(o.rect,t.rect))continue;let s=ba(o).trim().replaceAll(/\s+/g,` `),c=xa(s);i.push(o.index),!(!s||!c||a.has(c))&&(a.add(c),r.push(s))}return{label:r.join(`, `),removableIndexes:i}}function Na(e,t){if(Pa(e))return!0;let n=(e.type??``).toLowerCase();return e.hittable!==!0&&!va(e)&&n.includes(`view`)&&ba(e).trim().length>0&&!t.some(t=>t.parentIndex===e.index)}function Pa(e){if(e.hittable===!0||va(e))return!1;let t=(e.type??``).toLowerCase();return t.includes(`text`)||t.includes(`image`)||t.includes(`icon`)}function Fa(e){return e.hittable===!0&&!va(e)&&!!(e.rect&&ma(e.rect))&&!!xa(ba(e))}function Ia(e,t,n){if(!Ba(t)||!ha(t.rect,e.rect))return!1;let r=xa(ba(t));return!!(r&&n!==r&&n.includes(r))}function La(e,t,n){return!n.has(e.index)&&ga(e.rect,t.rect)&&(Ga(e,t)||Wa(e,t))}function Ra(e,t,n,r,i){let a=Va(t,n),o=a.index===t.index?n:t,s=(o.type??``).toLowerCase().includes(`image`)?`has image`:null,c=i.get(a.index)??a,ee=i.get(o.index)?.presentationHints??o.presentationHints;return i.set(a.index,{...c,presentationHints:za(c.presentationHints,ee,s)}),Ta(e,o.index,r),i.get(a.index)??a}function za(e,t,n){return[...new Set([...Array.isArray(e)?e:[],...Array.isArray(t)?t:[],...n?[n]:[]])]}function Ba(e){if(!e.rect||!ma(e.rect)||_a(e)||va(e))return!1;let t=(e.type??``).toLowerCase();return t===`text`||Ua(t,Da)}function Va(e,t){let n=Ha(e);return Ha(t)>n?t:e}function Ha(e){let t=(e.type??``).toLowerCase(),n=0;return Ua(t,Ea)?n+=100:t.includes(`image`)?n+=30:t.includes(`textview`)||t===`text`?n+=20:t.includes(`view`)&&(n+=10),e.hittable===!0&&(n+=20),e.enabled!==!1&&(n+=5),n}function Ua(e,t){return t.some(t=>e.includes(t))}function Wa(e,t){let n=e.parentIndex===t.index?t:t.parentIndex===e.index?e:null,r=n?.index===e.index?t:n?.index===t.index?e:null;return!n||!r?!1:Va(n,r).index===n.index}function Ga(e,t){return e.parentIndex===t.parentIndex?Math.abs(e.index-t.index)<=3:e.parentIndex===t.index||t.parentIndex===e.index?!1:Math.abs((e.depth??0)-(t.depth??0))<=1&&Math.abs(e.index-t.index)<=2}function Ka(e,t,n){if(n.raw||!qa(e))return{nodes:t,filteredCount:0};let r=Ja(t);return{nodes:r,filteredCount:t.length-r.length}}function qa(e){let t=e.androidSnapshot;return!t||typeof t!=`object`?!1:t.backend===`android-helper`}function Ja(e){if(e.length===0)return e;let t=new Set,n=new Map,r=new Map(e.map(e=>[e.index,e]));return Ya(e,t),Xa(e,r,t,n),Oa(e,t,n),Aa(e,t),ka(e,t,n),e.filter(e=>!t.has(e.index)).map(e=>n.get(e.index)??e)}function Ya(e,t){for(let n of e)!n.rect||ma(n.rect)||_a(n)||Ta(e,n.index,t)}function Xa(e,t,n,r){for(let i of e){if(n.has(i.index)||i.rect||_a(i))continue;let a=Ca(i,t,ya);a&&Qa(r,a,Za(i,e)),Ta(e,i.index,n)}}function Za(e,t){let n=t.filter(t=>t.parentIndex===e.parentIndex&&t.rect&&ma(t.rect)).map(e=>e.index);return n.length===0?null:e.index<Math.min(...n)?`above`:e.index>Math.max(...n)?`below`:null}function Qa(e,t,n){if(!n)return;let r=e.get(t.index)??t;e.set(t.index,{...r,hiddenContentAbove:r.hiddenContentAbove===!0||n===`above`||void 0,hiddenContentBelow:r.hiddenContentBelow===!0||n===`below`||void 0})}function $a(e){if(e.length<20)return!1;let t=new Map;for(let n of e){let e=(n.type??``).toLowerCase(),r=eo(Oe(n));if(!r)continue;let i=`${e}|${r}`,a=t.get(i)??[];a.push(n),t.set(i,a)}let n=0;for(let e of t.values())e.length<=1||!no(e)||(n+=e.length);return n>=8}function eo(e){let t=e.trim().replaceAll(/\s+/g,` `).toLowerCase();return!t||to(t)?null:t}function to(e){return/\S+@\S+\.\S+/.test(e)}function no(e){for(let t=0;t<e.length;t+=1)for(let n=t+1;n<e.length;n+=1)if(ro(e[t]?.rect,e[n]?.rect))return!0;return!1}function ro(e,t){if(!e||!t)return!0;let n=.5;return!(e.x+e.width<=t.x+n||t.x+t.width<=e.x+n||e.y+e.height<=t.y+n||t.y+t.height<=e.y+n)}function io(n,r={}){let i=n.nodes,a=Array.isArray(i)?i:[],o=e(n.backend)?n.backend:void 0,s=t(o),c=Ka(n,a,r),ee=co(n),te=vo(n,a,r,c),ne=te.length>0?`${te.join(`
|
|
4
4
|
`)}\n`:``,re=r.raw?null:ao(n);if(re)return`${ee}${ne}${oo(re)}\n`;let ie=r.raw||!s?null:qt(c.nodes),ae=!!n.truncated,oe=ie?.nodes??a,se=r.raw||!s?null:ho(n,ie,oe.length,a.length,c.filteredCount),ce=lo(a.length,se,ae);return a.length===0?`${ee}${ce}\n${ne}`:r.raw?`${ee}${ce}\n${ne}${uo(a)}\n`:r.flatten?`${ee}${ce}\n${ne}${fo(oe)}${mo(ie)}\n`:`${ee}${ce}\n${ne}${po(oe)}${mo(ie)}\n`}function ao(e){let t=e.unchanged;if(!t||typeof t!=`object`)return null;let n=t;return typeof n.ageMs!=`number`||typeof n.nodeCount!=`number`?null:{ageMs:n.ageMs,nodeCount:n.nodeCount,interactiveOnly:n.interactiveOnly===!0||void 0,scope:typeof n.scope==`string`?n.scope:void 0}}function oo(e){let t=so(e.ageMs);return e.scope?[`Scoped snapshot unchanged for scope "${e.scope}" since previous read ${t} ago.`,`Previous refs in this scope remain valid. Use find/get/is for a targeted query, or --force-full to re-emit.`].join(`
|