agent-device 0.21.26 → 0.21.27

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.
Files changed (26) hide show
  1. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.26.apk → agent-device-android-ime-helper-0.21.27.apk} +0 -0
  2. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.27.apk.sha256 +1 -0
  3. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.26.manifest.json → agent-device-android-ime-helper-0.21.27.manifest.json} +4 -4
  4. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.26.apk → agent-device-android-snapshot-helper-0.21.27.apk} +0 -0
  5. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.27.apk.sha256 +1 -0
  6. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.26.manifest.json → agent-device-android-snapshot-helper-0.21.27.manifest.json} +7 -7
  7. package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/recording-overlay.swift +11 -4
  8. package/dist/src/app-log-reconnect.js +1 -1
  9. package/dist/src/app-log-runtime2.js +3 -3
  10. package/dist/src/cli-help.js +1 -1
  11. package/dist/src/client-types.d.ts +3 -3
  12. package/dist/src/command-metadata.js +4 -4
  13. package/dist/src/connection.js +5 -5
  14. package/dist/src/internal/bin.js +1 -1
  15. package/dist/src/internal/daemon.js +4 -4
  16. package/dist/src/ios-snapshot-adapter.js +1 -1
  17. package/dist/src/limrun.js +1 -1
  18. package/dist/src/proxy.js +2 -2
  19. package/dist/src/session-allocation.js +1 -1
  20. package/dist/src/session2.js +5 -5
  21. package/dist/src/src.js +1 -1
  22. package/dist/src/text-entry-focus.js +1 -1
  23. package/package.json +4 -1
  24. package/server.json +2 -2
  25. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.26.apk.sha256 +0 -1
  26. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.26.apk.sha256 +0 -1
@@ -1,5 +1,5 @@
1
- import{r as e}from"../rolldown-runtime.js";import{$ as t,B as n,I as r,L as i,P as a,U as o,Y as s,a as c,at as l,b as u,f as d,g as f,it as p,k as m,l as h,s as g,t as _,z as v}from"../sdk-contracts.js";import{F as ee,H as y,I as te,L as ne,M as b,N as x,P as S,S as re,U as C,b as w,j as ie,ot as T,r as E,tt as ae,v as D,vt as oe,x as se,y as ce}from"../tv-remote.js";import{A as le,m as ue,v as O}from"../sdk-batch-runner.js";import{A as de,B as fe,E as pe,F as me,H as he,I as ge,J as _e,K as k,L as ve,M as ye,N as be,P as xe,Q as A,S as Se,U as Ce,V as we,W as Te,X as Ee,Y as De,_ as Oe,_t as ke,a as Ae,bt as je,dt as Me,f as Ne,ht as Pe,ot as Fe,q as Ie,st as Le,w as Re,yt as ze,z as Be}from"../back-mode.js";import{a as j,i as Ve,l as He,o as Ue,r as M,s as We,t as Ge}from"../diagnostics.js";import"../diagnostics2.js";import{E as N,N as Ke,P as qe,S as Je,T as Ye,_ as Xe,b as Ze,f as Qe,g as $e,h as et,i as tt,u as nt,w as rt}from"../sdk-device.js";import{$ as it,$n as at,Ar as ot,Dt as st,Er as ct,H as lt,Jt as ut,Kr as dt,Kt as ft,Lt as pt,Qn as mt,S as ht,U as gt,Xt as _t,b as vt,cn as yt,ct as bt,f as xt,hr as St,l as Ct,m as wt,o as Tt,on as Et,ot as Dt,pn as Ot,u as kt,vt as At,xt as jt,yt as Mt}from"../sdk-batch.js";import{a as Nt}from"../session.js";import{C as Pt,T as Ft,d as It,y as Lt,z as Rt}from"../file.js";import{n as zt}from"../app-log-files.js";import{l as Bt,v as Vt}from"../exec.js";import{i as Ht,n as Ut,t as Wt}from"../retry.js";import{A as Gt,B as Kt,D as qt,E as Jt,L as Yt,M as Xt,O as Zt,S as Qt,_ as $t,a as en,b as tn,c as nn,d as rn,f as an,g as on,l as sn,n as cn,o as ln,p as un,s as dn,t as fn,u as pn,v as mn,w as hn,y as gn}from"../daemon-resolution.js";import"../command.js";import{r as _n}from"../process.js";import{a as vn}from"../version.js";import{r as yn}from"../runtime-transport-hints.js";import"../retry2.js";import{a as bn,r as xn}from"../archive.js";import{t as Sn}from"../byte-limit-stream.js";import{c as Cn}from"../device-shell.js";import{t as wn}from"../keyed-lock.js";import{r as Tn}from"../snapshot-occlusion.js";import{t as En}from"../snapshot-state.js";import{c as P,d as Dn,l as On,s as kn,t as An,u as jn}from"../daemon-registration-owner.js";import{t as Mn}from"../snapshot-chrome.js";import{_ as Nn,d as Pn,h as Fn,i as In,l as Ln,m as Rn,n as zn,o as Bn,p as Vn,r as Hn,s as Un,t as Wn,v as Gn}from"../replay-script-selection.js";import{a as Kn,c as qn,i as Jn,o as Yn,s as Xn,t as Zn}from"../request-cancel.js";import{n as Qn,t as $n}from"../request.js";import{n as er,t as tr}from"../provider-device-admission.js";import{n as nr,r as rr}from"../daemon-policy-file.js";import{i as ir}from"../daemon-registration.js";import{n as ar,t as or}from"../device-claim-inspection.js";import{F as sr,I as cr,M as lr,N as ur,T as dr,k as fr,n as pr,r as mr,s as hr,t as gr,x as _r}from"../platform-request-scope.js";import{t as vr}from"../device-isolation.js";import{o as yr}from"../device-inventory-context.js";import{C as br,D as xr,E as Sr,a as Cr,g as wr,h as Tr,k as Er,t as Dr,v as Or,w as kr,x as Ar,y as jr}from"../selector-pipeline-policy.js";import{i as Mr,o as Nr,s as Pr}from"../durable-capture-resource.js";import{r as Fr}from"../application-lifecycle-runtime.js";import{i as Ir,n as Lr,r as Rr,t as zr}from"../request-runtime-binding.js";import{i as Br,o as Vr}from"../code-signature.js";import{c as Hr,l as Ur}from"../png-worker-client.js";import F,{createHash as Wr,randomUUID as Gr}from"node:crypto";import I from"node:fs";import Kr from"node:os";import L from"node:path";import R from"node:fs/promises";import{pipeline as qr}from"node:stream/promises";import Jr from"node:net";import{pathToFileURL as Yr}from"node:url";import Xr from"node:http";import{once as Zr}from"node:events";import{StringDecoder as Qr}from"node:string_decoder";function $r(e,t={}){let n=[e.command];return e.command===`snapshot`?Te(n,e):e.command===`open`?ve(n,e):e.command===`runtime`?we(n,e,{includeAllPositionals:t.runtimeIncludeAllPositionals}):e.command===`record`?fe(n,e):e.command===`screenshot`?he(n,e):Be(n,e),n.join(` `)}function ei(e){return e.targetEvidences?[mt(e.targetEvidences)]:e.targetEvidence?[at(e.targetEvidence)]:[]}const ti=/^\$\{([A-Z_][A-Z0-9_]*)\}$/;function ni(e){if(e!==e.trim()||!xe.test(e))throw new a(`INVALID_ARGS`,`Invalid --record-as variable "${e}": use uppercase letters, digits, and underscores (for example PASSWORD).`);if(e.startsWith(`AD_`))throw new a(`INVALID_ARGS`,`Invalid --record-as variable "${e}": the AD_* namespace is reserved for built-in replay variables.`);return e}function ri(e){return typeof e?.recordAs==`string`||e?.textStdin===!0}function ii(e){return typeof e?.recordAs==`string`?ai(e.recordAs):`[REDACTED]`}function ai(e){return`\${${e}}`}function oi(e){let t=ti.exec(e);if(!(!t?.[1]||t[1].startsWith(`AD_`)))return t[1]}function si(e){let t=e.result?.text;if(typeof t==`string`)return t;let n=e.positionals??[];return n.length===0?``:n[0]?.startsWith(`@`)?n.length>=3?n.slice(2).join(` `):n.slice(1).join(` `):n.length>=3&&!Number.isNaN(Number(n[0]))&&!Number.isNaN(Number(n[1]))?n.slice(2).join(` `):n.slice(1).join(` `)}function ci(e,t){if(t?.replayBackend&&!de(t.replayBackend))throw new a(`INVALID_ARGS`,be(t.replayBackend));return{...me(e),metadata:ge(e)}}const z={kind:`none`};function li(e,t){if(t.path===void 0){let n=e??{kind:`default`,force:!1};return t.force?{...n,force:!0}:n}let n=e?.force===!0&&(e.kind==="default"||e.path===t.path);return{kind:`explicit`,path:t.path,force:t.force||n}}function ui(e){return e.kind===`repair`?{...e,status:`armed`}:e}function di(e){return e.kind===`none`?void 0:e.target}function fi(e){return e.kind===`repair`&&(e.status===`complete`||e.status===`close-succeeded`)}function pi(e){return e.kind===`authoring`&&e.status===`aborted`}function mi(e){return e.kind===`authoring`?e.status===`armed`:e.kind===`repair`}function hi(e){return e.kind===`repair`?e.status===`committed`:e.kind===`authoring`&&e.status===`published`}function gi(e){return{kind:`authoring`,status:`armed`,target:li(void 0,e)}}function _i(e){return e.kind!==`authoring`||e.status!==`armed`?e:{...e,status:`aborted`}}function vi(e,t){return e.kind===`authoring`?{kind:`authoring`,status:`published`,target:{kind:`explicit`,path:t,force:e.target.force}}:e}function yi(e,t){let n=e.kind===`repair`?e:void 0,r=n?.sourcePath??t.sourcePath;return{kind:`repair`,status:n?.status??`armed`,target:li(n?.target,t.requested),boundary:n?.boundary??t.boundary,...r===void 0?{}:{sourcePath:r},...n?.closeReceipt===void 0?{}:{closeReceipt:n.closeReceipt}}}function bi(e){return e.kind!==`repair`||e.status!==`armed`?e:{...e,status:`complete`}}function xi(e,t){return e.kind===`repair`?{...e,status:e.status===`complete`?`close-succeeded`:e.status,closeReceipt:t}:e}function Si(e){if(e.kind!==`repair`)return e;let{closeReceipt:t,...n}=e;return{...n,status:`committed`}}function Ci(e){if(e.kind!==`repair`)return e;let{closeReceipt:t,...n}=e;return{...n,status:`aborted`}}function wi(e){return e.kind===`repair`?e.boundary:void 0}function Ti(e){return e.kind===`repair`?e.sourcePath:void 0}function Ei(e){return e.kind===`repair`&&e.status!==`committed`}function Di(e){let t=di(e);return t?.kind===`explicit`?t.path:void 0}function Oi(e){return di(e)?.force===!0}function B(e){return e?.scriptPublication??z}function ki(e){let t=B(e);return t.kind===`authoring`&&t.status===`armed`}function Ai(e,t){e.scriptPublication=gi({path:t.path===void 0?void 0:rn(t.path),force:t.force===!0})}function ji(e){e.scriptPublication=_i(B(e))}function Mi(e){return mi(B(e))}function Ni(e,t){if(!t.saveScript||pi(B(e)))return;let n={path:typeof t.saveScript==`string`?rn(t.saveScript):void 0,force:t.force===!0},r=B(e);if(r.kind===`repair`){e.scriptPublication=yi(r,{requested:n,boundary:r.boundary,sourcePath:r.sourcePath});return}if(r.kind===`authoring`){e.scriptPublication={...r,target:li(r.target,n)};return}e.scriptPublication=gi(n)}function Pi(e,t){let n=B(e);n.kind===`authoring`&&(e.scriptPublication={...n,target:li(n.target,{path:t.explicitPath===void 0?void 0:rn(t.explicitPath),force:t.liveForce===!0})})}function Fi(e,t){e.scriptPublication=vi(B(e),t)}function Ii(e,t){let n=B(e);n.kind===`authoring`&&(e.scriptPublication=vi(n,t))}function Li(e,t){return t===!0||Oi(B(e))}function Ri(e){return hi(B(e))}function V(e){return e?.scriptPublication??z}function zi(e,t){let n=V(e);e.scriptPublication=yi(n,{requested:{path:typeof t.saveScript==`string`?rn(t.saveScript):n.kind===`repair`?void 0:t.healedSiblingPath,force:t.force===!0},boundary:t.firstArm?e.actions.length:0,sourcePath:t.sourcePath})}function Bi(e){e.scriptPublication=ui(V(e))}function Vi(e){e.scriptPublication=bi(V(e))}function Hi(e,t){e.scriptPublication=xi(V(e),t)}function Ui(e){e.scriptPublication=Ci(V(e))}function Wi(e,t){let n=V(e);return n.kind===`repair`&&n.closeReceipt===t}function Gi(e){return V(e).kind===`repair`}function Ki(e){return Ei(V(e))}function qi(e){return wi(V(e))}function Ji(e){return Ti(V(e))}const Yi=new Set(`action.backend.cost.delayMs.evidence.gesture.hint.kind.maestroFallbackReason.maestroNonHittableCoordinateFallbackAllowed.maestroNonHittableCoordinateFallbackUsed.message.platform.ref.referenceHeight.referenceWidth.refLabel.resolution.selector.selectorChain.settle.targetHittable.targetKind.text.warning.x.y`.split(`.`)),Xi=new Set([`action`,`backend`,`gesture`,`kind`,`platform`,`ref`,`selector`,`targetKind`]),Zi=new Set([`cost`,`evidence`,`resolution`,`settle`]),Qi=new Map([[`cost`,new Set([`nodeCount`,`runnerRoundTrips`,`wallClockMs`])],[`evidence`,new Set([`changedFromBefore`,`digest`,`foregroundApp`,`interactiveNodeCount`,`nodeCount`])],[`resolution`,new Set([`alternatives`,`kind`,`matchCount`,`phase`,`source`,`tiebreak`,`winnerDiagnostic`])],[`resolution.alternatives`,new Set([`diagnosticRef`,`label`,`role`])],[`resolution.winnerDiagnostic`,new Set([`diagnosticRef`,`label`,`role`])],[`settle`,new Set([`captures`,`diff`,`hint`,`quietMs`,`refs`,`refsGeneration`,`settled`,`tail`,`tailTruncated`,`timeoutMs`,`waitedMs`])],[`settle.diff`,new Set([`lines`,`summary`,`truncated`])],[`settle.diff.lines`,new Set([`kind`,`ref`,`text`])],[`settle.diff.summary`,new Set([`additions`,`removals`,`unchanged`])],[`settle.refs`,new Set([`ref`])],[`settle.tail`,new Set([`label`,`ref`,`role`])]]),$i=new Set([`evidence.digest`,`evidence.foregroundApp`,`resolution.alternatives.diagnosticRef`,`resolution.alternatives.role`,`resolution.kind`,`resolution.phase`,`resolution.source`,`resolution.tiebreak`,`resolution.winnerDiagnostic.diagnosticRef`,`resolution.winnerDiagnostic.role`,`settle.diff.lines.kind`,`settle.diff.lines.ref`,`settle.refs.ref`,`settle.tail.ref`,`settle.tail.role`]);function ea(e,t,n){if(!e)return e;let r=va(e.selectorChain),i=e=>sa(e,t);return{...ca(e,e=>fa(e,t,n),i),...typeof e.text==`string`?{text:n}:{},...r?{selectorChain:r.filter(e=>!i(e))}:{}}}function ta(e,t){if(!e)return e;let n=ha(t);return ca(e,e=>ga(e,n),e=>aa(e,t))}function na(e,t){if(!e)return e;let n=ha(t);return{...e,...e.label===void 0?{}:{label:ga(e.label,n)},ancestry:e.ancestry.map(e=>({...e,...e.label===void 0?{}:{label:ga(e.label,n)}})),...e.scrollRegion?{scrollRegion:{...e.scrollRegion,...e.scrollRegion.label===void 0?{}:{label:ga(e.scrollRegion.label,n)}}}:{}}}function ra(e,t){return!!(e.label!==void 0&&ia(e.label,t)||e.ancestry.some(e=>e.label&&ia(e.label,t))||e.scrollRegion?.label&&ia(e.scrollRegion.label,t))}function ia(e,t){for(let n of t.keys())if(e.includes(n))return!0;return!1}function aa(e,t){for(let n of t.keys())if(sa(e,n))return!0;return!1}function oa(e,t,n){return!e||!t?e:{...e,...e.label===t?{label:n}:{},ancestry:e.ancestry.map(e=>({...e,...e.label===t?{label:n}:{}})),...e.scrollRegion?{scrollRegion:{...e.scrollRegion,...e.scrollRegion.label===t?{label:n}:{}}}:{}}}function sa(e,t){return Ot(e,t)}function ca(e,t,n){return Object.fromEntries(Object.entries(e).map(([e,r])=>[Yi.has(e)?e:t(e),la(r,e,t,n)]))}function la(e,t,n,r){return typeof e==`string`&&Xi.has(t)?e:t===`selectorChain`&&_a(e)?da(e,r):ua(e,n,r,Zi.has(t)?t:void 0)}function ua(e,t,n,r){if(typeof e==`string`)return r&&$i.has(r)?e:t(e);if(Array.isArray(e))return e.map(e=>ua(e,t,n,r));if(!e||typeof e!=`object`)return e;let i=r?Qi.get(r):void 0;return Object.fromEntries(Object.entries(e).map(([e,a])=>{let o=i?.has(e)===!0;return[o?e:t(e),ua(a,t,n,o?`${r}.${e}`:void 0)]}))}function da(e,t){return e.filter(e=>!t(e))}function fa(e,t,n){if(!t)return e;let r=n?e.split(n):[e];return r.every(e=>!e.includes(t))?pa(e,t,n):t.trim()?pa(r.map(e=>e.replaceAll(t,n)).join(n),t,n):n}function pa(e,t,n){let r=[];if(n)for(let t=e.indexOf(n);t!==-1;t=e.indexOf(n,t+n.length))r.push(t);let i=0;for(let a=e.indexOf(t);a!==-1;a=e.indexOf(t,a+1)){for(;i<r.length&&r[i]+n.length<a+t.length;)i+=1;if(i===r.length||r[i]>a)return n}return e}const ma=/\$\{[A-Z_][A-Z0-9_]*\}/y;function ha(e){return[...e].sort(([e],[t])=>t.length-e.length)}function ga(e,t){if(!e||t.length===0)return e;let n=``,r=0;scan:for(;r<e.length;){for(let[i,a]of t)if(e.startsWith(i,r)){n+=a,r+=i.length;continue scan}if(e[r]===`$`){ma.lastIndex=r;let t=ma.exec(e);if(t){n+=t[0],r+=t[0].length;continue}}n+=e[r],r+=1}return n}function _a(e){return Array.isArray(e)&&e.every(e=>typeof e==`string`)}function va(e){return _a(e)?e:void 0}function ya(e,t){if(t.flags?.noRecord||ri(t.flags)&&t.flags.recordAs===void 0||Aa(e,t))return;t.flags&&Ni(e,t.flags);let n=xa(t),r=wa(e,Sa(t,n));n&&Ca(e,n);let i={ts:Date.now(),command:r.command,positionals:r.positionals,runtime:r.runtime,flags:Ma(r.flags),result:r.result,...r.targetEvidence?{targetEvidence:r.targetEvidence}:{},...r.targetEvidences?{targetEvidences:r.targetEvidences}:{}};return e.actions.push(i),M({level:`debug`,phase:`record_action`,data:{command:t.command,session:e.name}}),i}function ba(e,t,n,r,i,a){!t||!e.resolveCurrent(t)||e.recordAction(t,{command:r,positionals:a?.positionals??n.positionals??[],flags:a?.flags??n.flags??{},result:i??{}})}function xa(e){if(e.command!==`fill`||typeof e.flags.recordAs!=`string`)return;let t=ai(ni(e.flags.recordAs));return{literal:si({ts:0,command:e.command,positionals:e.positionals,flags:e.flags}),placeholder:t}}function Sa(e,t){if(!t)return e;let{literal:n,placeholder:r}=t;return{...e,positionals:Da(e.positionals,r),result:ea(e.result,n,r),targetEvidence:oa(e.targetEvidence,n,r)}}function Ca(e,t){t.literal.trim()&&(e.recordedFillLiterals??=new Map,!e.recordedFillLiterals.has(t.literal)&&e.recordedFillLiterals.set(t.literal,t.placeholder))}function wa(e,t){let n=e.recordedFillLiterals;if(!n||n.size===0)return t;let r=ta(t.result,n),i=(t.targetEvidenceMode??`action`)===`landmark`?Ta(t.targetEvidence,n):Ea(t.targetEvidence,n),a=t.targetEvidences?{source:Ea(t.targetEvidences.source,n),destination:Ea(t.targetEvidences.destination,n)}:t.targetEvidences;return{...t,result:r,targetEvidence:i,targetEvidences:a}}function Ta(e,t){return e&&(ra(e,t)?void 0:e)}function Ea(e,t){return!e||!ra(e,t)?e:{...na(e,t),verification:`unverifiable`}}function Da(e,t){let n=e[0];return n?.startsWith(`@`)?e.length>=3?[n,e[1],t]:[n,t]:e.length>=3&&Number.isFinite(Number(e[0]))&&Number.isFinite(Number(e[1]))?[e[0],e[1],t]:n===void 0?[t]:[n,t]}const Oa=new Set([`snapshot`,`get`,`is`,`find`]);function ka(e){return e.internal?.replayPlanStep!==!0&&Oa.has(e.command)}function Aa(e,t){return!t.interactiveObservation||qi(e)===void 0?!1:t.flags?.record!==!0}const ja=Re();function Ma(e){if(!e)return{};let t={};for(let n of ja){let r=e[n];r!==void 0&&(t[n]=r)}return t}function Na(e){return L.join(e,`idle-expiry.json`)}function Pa(e){let t;try{t=I.readFileSync(e,`utf8`)}catch{return}let n;try{n=JSON.parse(t)}catch{return}if(!(typeof n?.expiresAt!=`number`||!Number.isFinite(n.expiresAt))&&!(n.expiresAt<=Date.now())&&typeof n.owner==`string`&&!(!Fa(n.expiredAtMs)||!Fa(n.idleExpiryMs))&&(n.deviceKey===void 0||typeof n.deviceKey==`string`))return n}function Fa(e){return typeof e==`number`&&Number.isFinite(e)&&e>=0}function Ia(e){let t=e.flatMap((e,t)=>e.command===`open`?[t]:[]);if(t.length!==1||t[0]!==0)throw new a(`COMMAND_FAILED`,`Cannot publish this session: an open-to-destination script requires exactly one initial recorded open.`,{retriable:!1,hint:`Close this session and start a fresh one with open <app> --save-script[=<path>].`});if(e.some(e=>e.command===`close`))throw new a(`COMMAND_FAILED`,`Cannot publish an active-session script containing close.`,{retriable:!1,hint:`Close this session and record the journey again from a fresh open --save-script session.`});let n=-1;for(let[t,r]of e.entries())ht({command:r.command,positionals:r.positionals,flags:r.flags})===`mutates-app`&&(n=t);if(!e.slice(n+1).some(Ha))throw new a(`COMMAND_FAILED`,`Cannot publish this session without a portable destination guard after the final mutating action.`,{retriable:!0,hint:`Record a selector-targeted wait on a labeled or id-bearing landmark, for example wait 'role="heading" label="Screen X"', so its recorded identity is captured, then retry session save-script.`})}function La(e){for(let t of e){if(Ra(t)){za(t);continue}let e=Ua(t),n=e??(t.command===`wait`?t.positionals[0]:void 0);if(n?.startsWith(`@`))throw new a(`COMMAND_FAILED`,`Cannot publish recorded step "${t.command} ${n}": the session-local ref was not converted to a portable selector.`,{retriable:!1,hint:`Close this session and record the journey again using selectors or resolvable refs.`});if(t.command===`find`&&ht(t)===`mutates-app`)throw new a(`COMMAND_FAILED`,`Cannot publish a recorded mutating find step because its target identity is not replay-verifiable.`,{retriable:!1,hint:`Close this session and record the journey again with an explicit selector-targeted click, press, fill, or focus action.`});let r=e;if(!(!r||!yt(r)||t.targetEvidence))throw new a(`COMMAND_FAILED`,`Cannot publish recorded step "${t.command} ${r}": recording-time target identity evidence is missing.`,{retriable:!1,hint:`Close this session and record the journey again from open --save-script so target-v1 evidence is captured before each interaction.`})}}function Ra(e){return Ba(e)!==void 0}function za(e){let t=Ba(e);if(!t)return;let n=[t.source,t.destination];for(let t of n){if(t?.startsWith(`@`))throw new a(`COMMAND_FAILED`,`Cannot publish recorded drag endpoint "${t}": the session-local ref was not converted to a portable selector.`,{retriable:!1});if(!(!t||!yt(t))&&!e.targetEvidences)throw new a(`COMMAND_FAILED`,`Cannot publish recorded drag endpoint "${t}": recording-time target identity evidence is missing.`,{retriable:!1,hint:`Close this session and record the journey again so targets-v1 evidence is captured for both drag endpoints.`})}}function Ba(e){return e.command===`gesture`?A(e.positionals):void 0}function Va(e,t){if(e instanceof a){if(e.details?.reason===`script_target_exists`)return new a(e.code,`A file already exists at ${String(e.details.path)}.`,{...e.details,retriable:!0,hint:`Retry session save-script with another path, or pass --force to replace the existing file. The session remains armed.`});let t=e.details?.retriable===!0;return new a(e.code,e.message,{...e.details,retriable:t,hint:e.details?.hint??(t?`Fix the recorded journey or target, then retry session save-script. The session remains armed.`:`Close this session and start a fresh one with open <app> --save-script[=<path>].`)})}let n=e instanceof Error?e.message:String(e);return new a(`COMMAND_FAILED`,`Failed to publish the active session script${t?` to ${t}`:``}: ${n}`,{retriable:!0,hint:`Check the target path and permissions, then retry session save-script. The session remains armed.`})}function Ha(e){if(e.command!==`wait`)return!1;let t=Et(e.positionals);return t?.kind!==`selector`||!yt(t.selectorExpression)?!1:e.targetEvidence?.verification===`verified`}function Ua(e){if(e.command===`get`)return e.positionals[1];if(De(e.command)||e.command===`fill`){let[t,n]=e.positionals;return t!==void 0&&n!==void 0&&Wa(t)&&Wa(n)?void 0:t}}function Wa(e){return e.trim().length>0&&Number.isFinite(Number(e))}function Ga(e){let t=e.scriptPublication??z;return t.kind===`repair`?t.status===`committed`||!fi(t):!1}function Ka(e){return!mi(e.scriptPublication??z)||Ga(e)}var qa=class{sessionsDir;constructor(e){this.sessionsDir=e}write(e,t){let n=Gi(e),r=t?.publication===`active`,i;try{if(Ka(e))return{written:!1};let a=Ja(e,{appendCompleteSentinel:n,activePublication:r});i=this.resolveScriptPath(e);let o=L.dirname(i);return I.existsSync(o)||I.mkdirSync(o,{recursive:!0}),Za({scriptPath:i,script:a.script,force:t?.force}),n&&(e.scriptPublication=Si(e.scriptPublication??z)),{written:!0,path:i,actionCount:a.actionCount}}catch(t){return Ya({session:e,error:t,scriptPath:i,repairArmed:n,activePublication:r})}}resolveScriptPath(e){let t=Di(e.scriptPublication??z);if(t)return rn(t);let n=un(e.name),r=new Date(e.createdAt).toISOString().replaceAll(/[:.]/g,`-`);return L.join(this.sessionsDir,`${n}-${r}.ad`)}};function Ja(e,t){let n=Qa(e,{strictPortableRefs:t.activePublication});return t.activePublication&&Ia(n),{script:lo(e,n,t.appendCompleteSentinel),actionCount:n.length}}function Ya(e){let{session:t,error:n,scriptPath:r,repairArmed:i,activePublication:o}=e;if(M({level:`warn`,phase:`session_script_write_failed`,data:{session:t.name,path:r,error:n instanceof Error?n.message:String(n)}}),i)return{written:!1,error:Xa(n,r)};if(o)return{written:!1,error:Va(n,r)};if(n instanceof a)throw n;return{written:!1}}function Xa(e,t){if(e instanceof a)return e;let n=e instanceof Error?e.message:String(e);return new a(`COMMAND_FAILED`,`Failed to write the healed script${t?` to ${t}`:``}: ${n}`,{hint:`The repair transaction completed but the healed .ad could not be published; check the target path and permissions, then retry close --save-script.`})}function Za(e){let{scriptPath:t,script:n,force:r}=e;try{Rt({destination:t,contents:n,publish:r?`replace`:`link-exclusive`})}catch(e){throw e.code===`EEXIST`?new a(`COMMAND_FAILED`,`A file already exists at ${t}; remove it, pass replay --save-script=<other-path>, or pass --force/--overwrite to replace it.`,{reason:`script_target_exists`,path:t}):e}}function Qa(e,t={}){let n=qi(e),r=n!==void 0,i=e.actions.slice(n??0),a=[];for(let n of i){if(n.command===`snapshot`)continue;let i=to(n);if(i){a.push(i);continue}(r||t.strictPortableRefs)&&$a(n);let o=co(e,n);o&&a.push(o),a.push(n)}return t.strictPortableRefs&&La(a),a}function $a(e){let t=e.command===`gesture`?A(e.positionals??[]):void 0;if(t){eo(t);return}if(!ro(e.command))return;let n=e.command===`get`?e.positionals?.[1]:e.positionals?.[0];if(n?.startsWith(`@`))throw new a(`COMMAND_FAILED`,`Cannot write recorded step "${e.command} ${n}" to a script: it never resolved to a selector, so the ref would not resolve in a fresh replay session.`)}function eo(e){let t=[e.source,e.destination].find(e=>e.startsWith(`@`));if(t)throw new a(`COMMAND_FAILED`,`Cannot write recorded drag endpoint "${t}" to a script: it never resolved to a selector, so the ref would not resolve in a fresh replay session.`)}function to(e){let t=no(e);if(!(!t||!ro(e.command)))return _e(e.command)||e.command===`hover`?{...e,positionals:[t]}:e.command===`longpress`?ao(e,t):e.command===`fill`?io(e,t):oo(e,t)}function no(e){let t=Array.isArray(e.result?.selectorChain)&&e.result.selectorChain.every(e=>typeof e==`string`)?e.result.selectorChain:[];return t.length>0?t.join(` || `):void 0}function ro(e){return De(e)||e===`fill`||e===`get`}function io(e,t){let n=si(e);return n.length>0?{...e,positionals:[t,n]}:void 0}function ao(e,t){let n=typeof e.result?.durationMs==`number`?String(e.result.durationMs):so(e.positionals??[]);return{...e,positionals:n?[t,n]:[t]}}function oo(e,t){let n=e.positionals?.[0];return n===`text`||n===`attrs`?{...e,positionals:[n,t]}:void 0}function so(e){let t=e.at(-1);if(!(e.length<=1||t===void 0||t.trim()===``))return Number.isFinite(Number(t))?t:void 0}function co(e,t){if(!ro(t.command))return;let n=t.result?.refLabel;if(typeof n!=`string`||n.trim().length===0)return;let r=n.trim();return{ts:t.ts,command:`snapshot`,positionals:[],flags:{platform:e.device.platform,snapshotInteractiveOnly:!0,snapshotScope:r},result:{scope:r}}}function lo(e,t,n){let r=[],i=e.device.kind?` kind=${e.device.kind}`:``;r.push(`context platform=${N(e.device)} device=${Ie(e.device.name)}${i} theme=unknown`);for(let e of t)e.flags?.noRecord||(r.push(...ei(e)),r.push(uo(e)));return n&&r.push(`# agent-device:heal-complete`),`${r.join(`
2
- `)}\n`}function uo(e){return fo([e.command],e)||$r(e)}function fo(e,t){if(_e(t.command))return po(e,t);if(t.command===`fill`)return mo(e,t);if(t.command===`get`)return ho(e,t)}function po(e,t){let n=t.positionals?.[0];if(n){if(n.startsWith(`@`))return e.push(k(Ee(n))),go(e,t),Ce(e,t),e.join(` `);if(t.positionals.length===1)return e.push(k(n)),Ce(e,t),e.join(` `)}}function mo(e,t){let n=t.positionals?.[0];if(!n?.startsWith(`@`))return;e.push(k(Ee(n))),go(e,t);let r=t.positionals.slice(1).join(` `);return t.positionals.length>1&&e.push(k(r)),Ce(e,t),e.join(` `)}function ho(e,t){let n=t.positionals?.[0],r=t.positionals?.[1];if(!(!n||!r))return e.push(k(n)),e.push(k(Ee(r))),r.startsWith(`@`)&&go(e,t),e.join(` `)}function go(e,t){let n=t.result?.refLabel;typeof n==`string`&&n.trim().length>0&&e.push(k(n))}const _o=65536;function vo(e){return Wr(`sha256`).update(e,`utf8`).digest(`hex`).slice(0,32)}function yo(e,t){let n=wo(e);if(n===void 0)return!1;try{let e=So(t),r=Buffer.allocUnsafe(_o),i=0;do if(i=I.readSync(n,r,0,r.length,null),!e.push(r.subarray(0,i)))return!0;while(i>0);return e.end(),!0}finally{I.closeSync(n)}}async function bo(e){let t=await To(e);if(t===void 0)return{lineCount:0,firstLineDigest:void 0};let n={lineCount:0,firstLineDigest:void 0};try{let e=So(e=>{n.lineCount===0&&(n.firstLineDigest=vo(e)),n.lineCount+=1}),r=Buffer.allocUnsafe(_o);for(;;){let{bytesRead:n}=await t.read(r,0,r.length,null);if(e.push(r.subarray(0,n)),n===0)break}return e.end(),n}finally{await t.close()}}function xo(e){let t;return yo(e,e=>(t=vo(e),!1)),t}function So(e){let t=new Qr(`utf8`),n=``,r=!1;return{push(i){if(r)return!1;let a=`${n}${t.write(i)}`,o=0;for(let t=a.indexOf(`
1
+ import{r as e}from"../rolldown-runtime.js";import{$ as t,B as n,I as r,L as i,P as a,U as o,Y as s,a as c,at as l,b as u,f as d,g as f,it as p,k as m,l as h,s as g,t as _,z as v}from"../sdk-contracts.js";import{F as ee,H as y,I as te,L as ne,M as b,N as x,P as re,S as ie,U as S,b as C,j as ae,ot as w,r as T,tt as oe,v as E,vt as se,x as ce,y as le}from"../tv-remote.js";import{A as ue,m as de,v as D}from"../sdk-batch-runner.js";import{A as fe,B as pe,E as me,F as he,H as ge,I as _e,J as ve,K as O,L as ye,M as be,N as xe,P as Se,Q as k,S as Ce,U as we,V as Te,W as Ee,X as De,Y as Oe,_ as ke,_t as Ae,a as je,bt as Me,dt as Ne,f as Pe,ht as Fe,ot as Ie,q as Le,st as Re,w as ze,yt as Be,z as Ve}from"../back-mode.js";import{a as A,i as He,l as Ue,o as We,r as j,s as Ge,t as Ke}from"../diagnostics.js";import"../diagnostics2.js";import{E as M,N as qe,P as Je,S as Ye,T as Xe,_ as Ze,b as Qe,f as $e,g as et,h as tt,i as nt,u as rt,w as it}from"../sdk-device.js";import{$ as at,$n as ot,Ar as st,Dt as ct,Er as lt,H as ut,Jt as dt,Kr as ft,Kt as pt,Lt as mt,Qn as ht,S as gt,U as _t,Xt as vt,b as yt,cn as bt,ct as xt,f as St,hr as Ct,l as wt,m as Tt,o as Et,on as Dt,ot as Ot,pn as kt,u as At,vt as jt,xt as Mt,yt as Nt}from"../sdk-batch.js";import{a as Pt}from"../session.js";import{C as Ft,T as It,d as Lt,y as Rt,z as zt}from"../file.js";import{n as Bt}from"../app-log-files.js";import{l as Vt,v as Ht}from"../exec.js";import{i as Ut,n as Wt,t as Gt}from"../retry.js";import{A as Kt,B as qt,D as Jt,E as Yt,L as Xt,M as Zt,O as Qt,S as $t,_ as en,a as tn,b as nn,c as rn,d as an,f as on,g as sn,l as cn,n as ln,o as un,p as dn,s as fn,t as pn,u as mn,v as hn,w as gn,y as _n}from"../daemon-resolution.js";import"../command.js";import{r as vn}from"../process.js";import{a as yn}from"../version.js";import{r as bn}from"../runtime-transport-hints.js";import"../retry2.js";import{a as xn,r as Sn}from"../archive.js";import{t as Cn}from"../byte-limit-stream.js";import{c as wn}from"../device-shell.js";import{t as Tn}from"../keyed-lock.js";import{r as En}from"../snapshot-occlusion.js";import{t as Dn}from"../snapshot-state.js";import{c as N,d as On,l as kn,s as An,t as jn,u as Mn}from"../daemon-registration-owner.js";import{t as Nn}from"../snapshot-chrome.js";import{_ as Pn,d as Fn,h as In,i as Ln,l as Rn,m as zn,n as Bn,o as Vn,p as Hn,r as Un,s as Wn,t as Gn,v as Kn}from"../replay-script-selection.js";import{a as qn,c as Jn,i as Yn,o as Xn,s as Zn,t as Qn}from"../request-cancel.js";import{n as $n,t as er}from"../request.js";import{n as tr,t as nr}from"../provider-device-admission.js";import{n as rr,r as ir}from"../daemon-policy-file.js";import{i as ar}from"../daemon-registration.js";import{n as or,t as sr}from"../device-claim-inspection.js";import{F as cr,I as lr,M as ur,N as dr,T as fr,k as pr,n as mr,r as hr,s as gr,t as _r,x as vr}from"../platform-request-scope.js";import{t as yr}from"../device-isolation.js";import{o as br}from"../device-inventory-context.js";import{C as xr,D as Sr,E as Cr,a as wr,g as Tr,h as Er,k as Dr,t as Or,v as kr,w as Ar,x as jr,y as Mr}from"../selector-pipeline-policy.js";import{i as Nr,o as Pr,s as Fr}from"../durable-capture-resource.js";import{r as Ir}from"../application-lifecycle-runtime.js";import{i as Lr,n as Rr,r as zr,t as Br}from"../request-runtime-binding.js";import{i as Vr,o as Hr}from"../code-signature.js";import{c as Ur,l as Wr}from"../png-worker-client.js";import P,{createHash as Gr,randomUUID as Kr}from"node:crypto";import F from"node:fs";import qr from"node:os";import I from"node:path";import L from"node:fs/promises";import{pipeline as Jr}from"node:stream/promises";import Yr from"node:net";import{pathToFileURL as Xr}from"node:url";import Zr from"node:http";import{once as Qr}from"node:events";import{StringDecoder as $r}from"node:string_decoder";function ei(e,t={}){let n=[e.command];return e.command===`snapshot`?Ee(n,e):e.command===`open`?ye(n,e):e.command===`runtime`?Te(n,e,{includeAllPositionals:t.runtimeIncludeAllPositionals}):e.command===`record`?pe(n,e):e.command===`screenshot`?ge(n,e):Ve(n,e),n.join(` `)}function ti(e){return e.targetEvidences?[ht(e.targetEvidences)]:e.targetEvidence?[ot(e.targetEvidence)]:[]}const ni=/^\$\{([A-Z_][A-Z0-9_]*)\}$/;function ri(e){if(e!==e.trim()||!Se.test(e))throw new a(`INVALID_ARGS`,`Invalid --record-as variable "${e}": use uppercase letters, digits, and underscores (for example PASSWORD).`);if(e.startsWith(`AD_`))throw new a(`INVALID_ARGS`,`Invalid --record-as variable "${e}": the AD_* namespace is reserved for built-in replay variables.`);return e}function ii(e){return typeof e?.recordAs==`string`||e?.textStdin===!0}function ai(e){return typeof e?.recordAs==`string`?oi(e.recordAs):`[REDACTED]`}function oi(e){return`\${${e}}`}function si(e){let t=ni.exec(e);if(!(!t?.[1]||t[1].startsWith(`AD_`)))return t[1]}function ci(e){let t=e.result?.text;if(typeof t==`string`)return t;let n=e.positionals??[];return n.length===0?``:n[0]?.startsWith(`@`)?n.length>=3?n.slice(2).join(` `):n.slice(1).join(` `):n.length>=3&&!Number.isNaN(Number(n[0]))&&!Number.isNaN(Number(n[1]))?n.slice(2).join(` `):n.slice(1).join(` `)}function li(e,t){if(t?.replayBackend&&!fe(t.replayBackend))throw new a(`INVALID_ARGS`,xe(t.replayBackend));return{...he(e),metadata:_e(e)}}const R={kind:`none`};function ui(e,t){if(t.path===void 0){let n=e??{kind:`default`,force:!1};return t.force?{...n,force:!0}:n}let n=e?.force===!0&&(e.kind==="default"||e.path===t.path);return{kind:`explicit`,path:t.path,force:t.force||n}}function di(e){return e.kind===`repair`?{...e,status:`armed`}:e}function fi(e){return e.kind===`none`?void 0:e.target}function pi(e){return e.kind===`repair`&&(e.status===`complete`||e.status===`close-succeeded`)}function mi(e){return e.kind===`authoring`&&e.status===`aborted`}function hi(e){return e.kind===`authoring`?e.status===`armed`:e.kind===`repair`}function gi(e){return e.kind===`repair`?e.status===`committed`:e.kind===`authoring`&&e.status===`published`}function _i(e){return{kind:`authoring`,status:`armed`,target:ui(void 0,e)}}function vi(e){return e.kind!==`authoring`||e.status!==`armed`?e:{...e,status:`aborted`}}function yi(e,t){return e.kind===`authoring`?{kind:`authoring`,status:`published`,target:{kind:`explicit`,path:t,force:e.target.force}}:e}function bi(e,t){let n=e.kind===`repair`?e:void 0,r=n?.sourcePath??t.sourcePath;return{kind:`repair`,status:n?.status??`armed`,target:ui(n?.target,t.requested),boundary:n?.boundary??t.boundary,...r===void 0?{}:{sourcePath:r},...n?.closeReceipt===void 0?{}:{closeReceipt:n.closeReceipt}}}function xi(e){return e.kind!==`repair`||e.status!==`armed`?e:{...e,status:`complete`}}function Si(e,t){return e.kind===`repair`?{...e,status:e.status===`complete`?`close-succeeded`:e.status,closeReceipt:t}:e}function Ci(e){if(e.kind!==`repair`)return e;let{closeReceipt:t,...n}=e;return{...n,status:`committed`}}function wi(e){if(e.kind!==`repair`)return e;let{closeReceipt:t,...n}=e;return{...n,status:`aborted`}}function Ti(e){return e.kind===`repair`?e.boundary:void 0}function Ei(e){return e.kind===`repair`?e.sourcePath:void 0}function Di(e){return e.kind===`repair`&&e.status!==`committed`}function Oi(e){let t=fi(e);return t?.kind===`explicit`?t.path:void 0}function ki(e){return fi(e)?.force===!0}function z(e){return e?.scriptPublication??R}function Ai(e){let t=z(e);return t.kind===`authoring`&&t.status===`armed`}function ji(e,t){e.scriptPublication=_i({path:t.path===void 0?void 0:an(t.path),force:t.force===!0})}function Mi(e){e.scriptPublication=vi(z(e))}function Ni(e){return hi(z(e))}function Pi(e,t){if(!t.saveScript||mi(z(e)))return;let n={path:typeof t.saveScript==`string`?an(t.saveScript):void 0,force:t.force===!0},r=z(e);if(r.kind===`repair`){e.scriptPublication=bi(r,{requested:n,boundary:r.boundary,sourcePath:r.sourcePath});return}if(r.kind===`authoring`){e.scriptPublication={...r,target:ui(r.target,n)};return}e.scriptPublication=_i(n)}function Fi(e,t){let n=z(e);n.kind===`authoring`&&(e.scriptPublication={...n,target:ui(n.target,{path:t.explicitPath===void 0?void 0:an(t.explicitPath),force:t.liveForce===!0})})}function Ii(e,t){e.scriptPublication=yi(z(e),t)}function Li(e,t){let n=z(e);n.kind===`authoring`&&(e.scriptPublication=yi(n,t))}function Ri(e,t){return t===!0||ki(z(e))}function zi(e){return gi(z(e))}function B(e){return e?.scriptPublication??R}function Bi(e,t){let n=B(e);e.scriptPublication=bi(n,{requested:{path:typeof t.saveScript==`string`?an(t.saveScript):n.kind===`repair`?void 0:t.healedSiblingPath,force:t.force===!0},boundary:t.firstArm?e.actions.length:0,sourcePath:t.sourcePath})}function Vi(e){e.scriptPublication=di(B(e))}function Hi(e){e.scriptPublication=xi(B(e))}function Ui(e,t){e.scriptPublication=Si(B(e),t)}function Wi(e){e.scriptPublication=wi(B(e))}function Gi(e,t){let n=B(e);return n.kind===`repair`&&n.closeReceipt===t}function Ki(e){return B(e).kind===`repair`}function qi(e){return Di(B(e))}function Ji(e){return Ti(B(e))}function Yi(e){return Ei(B(e))}const Xi=new Set(`action.backend.cost.delayMs.evidence.gesture.hint.kind.maestroFallbackReason.maestroNonHittableCoordinateFallbackAllowed.maestroNonHittableCoordinateFallbackUsed.message.platform.ref.referenceHeight.referenceWidth.refLabel.resolution.selector.selectorChain.settle.targetHittable.targetKind.text.warning.x.y`.split(`.`)),Zi=new Set([`action`,`backend`,`gesture`,`kind`,`platform`,`ref`,`selector`,`targetKind`]),Qi=new Set([`cost`,`evidence`,`resolution`,`settle`]),$i=new Map([[`cost`,new Set([`nodeCount`,`runnerRoundTrips`,`wallClockMs`])],[`evidence`,new Set([`changedFromBefore`,`digest`,`foregroundApp`,`interactiveNodeCount`,`nodeCount`])],[`resolution`,new Set([`alternatives`,`kind`,`matchCount`,`phase`,`source`,`tiebreak`,`winnerDiagnostic`])],[`resolution.alternatives`,new Set([`diagnosticRef`,`label`,`role`])],[`resolution.winnerDiagnostic`,new Set([`diagnosticRef`,`label`,`role`])],[`settle`,new Set([`captures`,`diff`,`hint`,`quietMs`,`refs`,`refsGeneration`,`settled`,`tail`,`tailTruncated`,`timeoutMs`,`waitedMs`])],[`settle.diff`,new Set([`lines`,`summary`,`truncated`])],[`settle.diff.lines`,new Set([`kind`,`ref`,`text`])],[`settle.diff.summary`,new Set([`additions`,`removals`,`unchanged`])],[`settle.refs`,new Set([`ref`])],[`settle.tail`,new Set([`label`,`ref`,`role`])]]),ea=new Set([`evidence.digest`,`evidence.foregroundApp`,`resolution.alternatives.diagnosticRef`,`resolution.alternatives.role`,`resolution.kind`,`resolution.phase`,`resolution.source`,`resolution.tiebreak`,`resolution.winnerDiagnostic.diagnosticRef`,`resolution.winnerDiagnostic.role`,`settle.diff.lines.kind`,`settle.diff.lines.ref`,`settle.refs.ref`,`settle.tail.ref`,`settle.tail.role`]);function ta(e,t,n){if(!e)return e;let r=ya(e.selectorChain),i=e=>ca(e,t);return{...la(e,e=>pa(e,t,n),i),...typeof e.text==`string`?{text:n}:{},...r?{selectorChain:r.filter(e=>!i(e))}:{}}}function na(e,t){if(!e)return e;let n=ga(t);return la(e,e=>_a(e,n),e=>oa(e,t))}function ra(e,t){if(!e)return e;let n=ga(t);return{...e,...e.label===void 0?{}:{label:_a(e.label,n)},ancestry:e.ancestry.map(e=>({...e,...e.label===void 0?{}:{label:_a(e.label,n)}})),...e.scrollRegion?{scrollRegion:{...e.scrollRegion,...e.scrollRegion.label===void 0?{}:{label:_a(e.scrollRegion.label,n)}}}:{}}}function ia(e,t){return!!(e.label!==void 0&&aa(e.label,t)||e.ancestry.some(e=>e.label&&aa(e.label,t))||e.scrollRegion?.label&&aa(e.scrollRegion.label,t))}function aa(e,t){for(let n of t.keys())if(e.includes(n))return!0;return!1}function oa(e,t){for(let n of t.keys())if(ca(e,n))return!0;return!1}function sa(e,t,n){return!e||!t?e:{...e,...e.label===t?{label:n}:{},ancestry:e.ancestry.map(e=>({...e,...e.label===t?{label:n}:{}})),...e.scrollRegion?{scrollRegion:{...e.scrollRegion,...e.scrollRegion.label===t?{label:n}:{}}}:{}}}function ca(e,t){return kt(e,t)}function la(e,t,n){return Object.fromEntries(Object.entries(e).map(([e,r])=>[Xi.has(e)?e:t(e),ua(r,e,t,n)]))}function ua(e,t,n,r){return typeof e==`string`&&Zi.has(t)?e:t===`selectorChain`&&va(e)?fa(e,r):da(e,n,r,Qi.has(t)?t:void 0)}function da(e,t,n,r){if(typeof e==`string`)return r&&ea.has(r)?e:t(e);if(Array.isArray(e))return e.map(e=>da(e,t,n,r));if(!e||typeof e!=`object`)return e;let i=r?$i.get(r):void 0;return Object.fromEntries(Object.entries(e).map(([e,a])=>{let o=i?.has(e)===!0;return[o?e:t(e),da(a,t,n,o?`${r}.${e}`:void 0)]}))}function fa(e,t){return e.filter(e=>!t(e))}function pa(e,t,n){if(!t)return e;let r=n?e.split(n):[e];return r.every(e=>!e.includes(t))?ma(e,t,n):t.trim()?ma(r.map(e=>e.replaceAll(t,n)).join(n),t,n):n}function ma(e,t,n){let r=[];if(n)for(let t=e.indexOf(n);t!==-1;t=e.indexOf(n,t+n.length))r.push(t);let i=0;for(let a=e.indexOf(t);a!==-1;a=e.indexOf(t,a+1)){for(;i<r.length&&r[i]+n.length<a+t.length;)i+=1;if(i===r.length||r[i]>a)return n}return e}const ha=/\$\{[A-Z_][A-Z0-9_]*\}/y;function ga(e){return[...e].sort(([e],[t])=>t.length-e.length)}function _a(e,t){if(!e||t.length===0)return e;let n=``,r=0;scan:for(;r<e.length;){for(let[i,a]of t)if(e.startsWith(i,r)){n+=a,r+=i.length;continue scan}if(e[r]===`$`){ha.lastIndex=r;let t=ha.exec(e);if(t){n+=t[0],r+=t[0].length;continue}}n+=e[r],r+=1}return n}function va(e){return Array.isArray(e)&&e.every(e=>typeof e==`string`)}function ya(e){return va(e)?e:void 0}function ba(e,t){if(t.flags?.noRecord||ii(t.flags)&&t.flags.recordAs===void 0||ja(e,t))return;t.flags&&Pi(e,t.flags);let n=Sa(t),r=Ta(e,Ca(t,n));n&&wa(e,n);let i={ts:Date.now(),command:r.command,positionals:r.positionals,runtime:r.runtime,flags:Na(r.flags),result:r.result,...r.targetEvidence?{targetEvidence:r.targetEvidence}:{},...r.targetEvidences?{targetEvidences:r.targetEvidences}:{}};return e.actions.push(i),j({level:`debug`,phase:`record_action`,data:{command:t.command,session:e.name}}),i}function xa(e,t,n,r,i,a){!t||!e.resolveCurrent(t)||e.recordAction(t,{command:r,positionals:a?.positionals??n.positionals??[],flags:a?.flags??n.flags??{},result:i??{}})}function Sa(e){if(e.command!==`fill`||typeof e.flags.recordAs!=`string`)return;let t=oi(ri(e.flags.recordAs));return{literal:ci({ts:0,command:e.command,positionals:e.positionals,flags:e.flags}),placeholder:t}}function Ca(e,t){if(!t)return e;let{literal:n,placeholder:r}=t;return{...e,positionals:Oa(e.positionals,r),result:ta(e.result,n,r),targetEvidence:sa(e.targetEvidence,n,r)}}function wa(e,t){t.literal.trim()&&(e.recordedFillLiterals??=new Map,!e.recordedFillLiterals.has(t.literal)&&e.recordedFillLiterals.set(t.literal,t.placeholder))}function Ta(e,t){let n=e.recordedFillLiterals;if(!n||n.size===0)return t;let r=na(t.result,n),i=(t.targetEvidenceMode??`action`)===`landmark`?Ea(t.targetEvidence,n):Da(t.targetEvidence,n),a=t.targetEvidences?{source:Da(t.targetEvidences.source,n),destination:Da(t.targetEvidences.destination,n)}:t.targetEvidences;return{...t,result:r,targetEvidence:i,targetEvidences:a}}function Ea(e,t){return e&&(ia(e,t)?void 0:e)}function Da(e,t){return!e||!ia(e,t)?e:{...ra(e,t),verification:`unverifiable`}}function Oa(e,t){let n=e[0];return n?.startsWith(`@`)?e.length>=3?[n,e[1],t]:[n,t]:e.length>=3&&Number.isFinite(Number(e[0]))&&Number.isFinite(Number(e[1]))?[e[0],e[1],t]:n===void 0?[t]:[n,t]}const ka=new Set([`snapshot`,`get`,`is`,`find`]);function Aa(e){return e.internal?.replayPlanStep!==!0&&ka.has(e.command)}function ja(e,t){return!t.interactiveObservation||Ji(e)===void 0?!1:t.flags?.record!==!0}const Ma=ze();function Na(e){if(!e)return{};let t={};for(let n of Ma){let r=e[n];r!==void 0&&(t[n]=r)}return t}function Pa(e){return I.join(e,`idle-expiry.json`)}function Fa(e){let t;try{t=F.readFileSync(e,`utf8`)}catch{return}let n;try{n=JSON.parse(t)}catch{return}if(!(typeof n?.expiresAt!=`number`||!Number.isFinite(n.expiresAt))&&!(n.expiresAt<=Date.now())&&typeof n.owner==`string`&&!(!Ia(n.expiredAtMs)||!Ia(n.idleExpiryMs))&&(n.deviceKey===void 0||typeof n.deviceKey==`string`))return n}function Ia(e){return typeof e==`number`&&Number.isFinite(e)&&e>=0}function La(e){let t=e.flatMap((e,t)=>e.command===`open`?[t]:[]);if(t.length!==1||t[0]!==0)throw new a(`COMMAND_FAILED`,`Cannot publish this session: an open-to-destination script requires exactly one initial recorded open.`,{retriable:!1,hint:`Close this session and start a fresh one with open <app> --save-script[=<path>].`});if(e.some(e=>e.command===`close`))throw new a(`COMMAND_FAILED`,`Cannot publish an active-session script containing close.`,{retriable:!1,hint:`Close this session and record the journey again from a fresh open --save-script session.`});let n=-1;for(let[t,r]of e.entries())gt({command:r.command,positionals:r.positionals,flags:r.flags})===`mutates-app`&&(n=t);if(!e.slice(n+1).some(Ua))throw new a(`COMMAND_FAILED`,`Cannot publish this session without a portable destination guard after the final mutating action.`,{retriable:!0,hint:`Record a selector-targeted wait on a labeled or id-bearing landmark, for example wait 'role="heading" label="Screen X"', so its recorded identity is captured, then retry session save-script.`})}function Ra(e){for(let t of e){if(za(t)){Ba(t);continue}let e=Wa(t),n=e??(t.command===`wait`?t.positionals[0]:void 0);if(n?.startsWith(`@`))throw new a(`COMMAND_FAILED`,`Cannot publish recorded step "${t.command} ${n}": the session-local ref was not converted to a portable selector.`,{retriable:!1,hint:`Close this session and record the journey again using selectors or resolvable refs.`});if(t.command===`find`&&gt(t)===`mutates-app`)throw new a(`COMMAND_FAILED`,`Cannot publish a recorded mutating find step because its target identity is not replay-verifiable.`,{retriable:!1,hint:`Close this session and record the journey again with an explicit selector-targeted click, press, fill, or focus action.`});let r=e;if(!(!r||!bt(r)||t.targetEvidence))throw new a(`COMMAND_FAILED`,`Cannot publish recorded step "${t.command} ${r}": recording-time target identity evidence is missing.`,{retriable:!1,hint:`Close this session and record the journey again from open --save-script so target-v1 evidence is captured before each interaction.`})}}function za(e){return Va(e)!==void 0}function Ba(e){let t=Va(e);if(!t)return;let n=[t.source,t.destination];for(let t of n){if(t?.startsWith(`@`))throw new a(`COMMAND_FAILED`,`Cannot publish recorded drag endpoint "${t}": the session-local ref was not converted to a portable selector.`,{retriable:!1});if(!(!t||!bt(t))&&!e.targetEvidences)throw new a(`COMMAND_FAILED`,`Cannot publish recorded drag endpoint "${t}": recording-time target identity evidence is missing.`,{retriable:!1,hint:`Close this session and record the journey again so targets-v1 evidence is captured for both drag endpoints.`})}}function Va(e){return e.command===`gesture`?k(e.positionals):void 0}function Ha(e,t){if(e instanceof a){if(e.details?.reason===`script_target_exists`)return new a(e.code,`A file already exists at ${String(e.details.path)}.`,{...e.details,retriable:!0,hint:`Retry session save-script with another path, or pass --force to replace the existing file. The session remains armed.`});let t=e.details?.retriable===!0;return new a(e.code,e.message,{...e.details,retriable:t,hint:e.details?.hint??(t?`Fix the recorded journey or target, then retry session save-script. The session remains armed.`:`Close this session and start a fresh one with open <app> --save-script[=<path>].`)})}let n=e instanceof Error?e.message:String(e);return new a(`COMMAND_FAILED`,`Failed to publish the active session script${t?` to ${t}`:``}: ${n}`,{retriable:!0,hint:`Check the target path and permissions, then retry session save-script. The session remains armed.`})}function Ua(e){if(e.command!==`wait`)return!1;let t=Dt(e.positionals);return t?.kind!==`selector`||!bt(t.selectorExpression)?!1:e.targetEvidence?.verification===`verified`}function Wa(e){if(e.command===`get`)return e.positionals[1];if(Oe(e.command)||e.command===`fill`){let[t,n]=e.positionals;return t!==void 0&&n!==void 0&&Ga(t)&&Ga(n)?void 0:t}}function Ga(e){return e.trim().length>0&&Number.isFinite(Number(e))}function Ka(e){let t=e.scriptPublication??R;return t.kind===`repair`?t.status===`committed`||!pi(t):!1}function qa(e){return!hi(e.scriptPublication??R)||Ka(e)}var Ja=class{sessionsDir;constructor(e){this.sessionsDir=e}write(e,t){let n=Ki(e),r=t?.publication===`active`,i;try{if(qa(e))return{written:!1};let a=Ya(e,{appendCompleteSentinel:n,activePublication:r});i=this.resolveScriptPath(e);let o=I.dirname(i);return F.existsSync(o)||F.mkdirSync(o,{recursive:!0}),Qa({scriptPath:i,script:a.script,force:t?.force}),n&&(e.scriptPublication=Ci(e.scriptPublication??R)),{written:!0,path:i,actionCount:a.actionCount}}catch(t){return Xa({session:e,error:t,scriptPath:i,repairArmed:n,activePublication:r})}}resolveScriptPath(e){let t=Oi(e.scriptPublication??R);if(t)return an(t);let n=dn(e.name),r=new Date(e.createdAt).toISOString().replaceAll(/[:.]/g,`-`);return I.join(this.sessionsDir,`${n}-${r}.ad`)}};function Ya(e,t){let n=$a(e,{strictPortableRefs:t.activePublication});return t.activePublication&&La(n),{script:uo(e,n,t.appendCompleteSentinel),actionCount:n.length}}function Xa(e){let{session:t,error:n,scriptPath:r,repairArmed:i,activePublication:o}=e;if(j({level:`warn`,phase:`session_script_write_failed`,data:{session:t.name,path:r,error:n instanceof Error?n.message:String(n)}}),i)return{written:!1,error:Za(n,r)};if(o)return{written:!1,error:Ha(n,r)};if(n instanceof a)throw n;return{written:!1}}function Za(e,t){if(e instanceof a)return e;let n=e instanceof Error?e.message:String(e);return new a(`COMMAND_FAILED`,`Failed to write the healed script${t?` to ${t}`:``}: ${n}`,{hint:`The repair transaction completed but the healed .ad could not be published; check the target path and permissions, then retry close --save-script.`})}function Qa(e){let{scriptPath:t,script:n,force:r}=e;try{zt({destination:t,contents:n,publish:r?`replace`:`link-exclusive`})}catch(e){throw e.code===`EEXIST`?new a(`COMMAND_FAILED`,`A file already exists at ${t}; remove it, pass replay --save-script=<other-path>, or pass --force/--overwrite to replace it.`,{reason:`script_target_exists`,path:t}):e}}function $a(e,t={}){let n=Ji(e),r=n!==void 0,i=e.actions.slice(n??0),a=[];for(let n of i){if(n.command===`snapshot`)continue;let i=no(n);if(i){a.push(i);continue}(r||t.strictPortableRefs)&&eo(n);let o=lo(e,n);o&&a.push(o),a.push(n)}return t.strictPortableRefs&&Ra(a),a}function eo(e){let t=e.command===`gesture`?k(e.positionals??[]):void 0;if(t){to(t);return}if(!io(e.command))return;let n=e.command===`get`?e.positionals?.[1]:e.positionals?.[0];if(n?.startsWith(`@`))throw new a(`COMMAND_FAILED`,`Cannot write recorded step "${e.command} ${n}" to a script: it never resolved to a selector, so the ref would not resolve in a fresh replay session.`)}function to(e){let t=[e.source,e.destination].find(e=>e.startsWith(`@`));if(t)throw new a(`COMMAND_FAILED`,`Cannot write recorded drag endpoint "${t}" to a script: it never resolved to a selector, so the ref would not resolve in a fresh replay session.`)}function no(e){let t=ro(e);if(!(!t||!io(e.command)))return ve(e.command)||e.command===`hover`?{...e,positionals:[t]}:e.command===`longpress`?oo(e,t):e.command===`fill`?ao(e,t):so(e,t)}function ro(e){let t=Array.isArray(e.result?.selectorChain)&&e.result.selectorChain.every(e=>typeof e==`string`)?e.result.selectorChain:[];return t.length>0?t.join(` || `):void 0}function io(e){return Oe(e)||e===`fill`||e===`get`}function ao(e,t){let n=ci(e);return n.length>0?{...e,positionals:[t,n]}:void 0}function oo(e,t){let n=typeof e.result?.durationMs==`number`?String(e.result.durationMs):co(e.positionals??[]);return{...e,positionals:n?[t,n]:[t]}}function so(e,t){let n=e.positionals?.[0];return n===`text`||n===`attrs`?{...e,positionals:[n,t]}:void 0}function co(e){let t=e.at(-1);if(!(e.length<=1||t===void 0||t.trim()===``))return Number.isFinite(Number(t))?t:void 0}function lo(e,t){if(!io(t.command))return;let n=t.result?.refLabel;if(typeof n!=`string`||n.trim().length===0)return;let r=n.trim();return{ts:t.ts,command:`snapshot`,positionals:[],flags:{platform:e.device.platform,snapshotInteractiveOnly:!0,snapshotScope:r},result:{scope:r}}}function uo(e,t,n){let r=[],i=e.device.kind?` kind=${e.device.kind}`:``;r.push(`context platform=${M(e.device)} device=${Le(e.device.name)}${i} theme=unknown`);for(let e of t)e.flags?.noRecord||(r.push(...ti(e)),r.push(fo(e)));return n&&r.push(`# agent-device:heal-complete`),`${r.join(`
2
+ `)}\n`}function fo(e){return po([e.command],e)||ei(e)}function po(e,t){if(ve(t.command))return mo(e,t);if(t.command===`fill`)return ho(e,t);if(t.command===`get`)return go(e,t)}function mo(e,t){let n=t.positionals?.[0];if(n){if(n.startsWith(`@`))return e.push(O(De(n))),_o(e,t),we(e,t),e.join(` `);if(t.positionals.length===1)return e.push(O(n)),we(e,t),e.join(` `)}}function ho(e,t){let n=t.positionals?.[0];if(!n?.startsWith(`@`))return;e.push(O(De(n))),_o(e,t);let r=t.positionals.slice(1).join(` `);return t.positionals.length>1&&e.push(O(r)),we(e,t),e.join(` `)}function go(e,t){let n=t.positionals?.[0],r=t.positionals?.[1];if(!(!n||!r))return e.push(O(n)),e.push(O(De(r))),r.startsWith(`@`)&&_o(e,t),e.join(` `)}function _o(e,t){let n=t.result?.refLabel;typeof n==`string`&&n.trim().length>0&&e.push(O(n))}const vo=65536;function yo(e){return Gr(`sha256`).update(e,`utf8`).digest(`hex`).slice(0,32)}function bo(e,t){let n=To(e);if(n===void 0)return!1;try{let e=Co(t),r=Buffer.allocUnsafe(vo),i=0;do if(i=F.readSync(n,r,0,r.length,null),!e.push(r.subarray(0,i)))return!0;while(i>0);return e.end(),!0}finally{F.closeSync(n)}}async function xo(e){let t=await Eo(e);if(t===void 0)return{lineCount:0,firstLineDigest:void 0};let n={lineCount:0,firstLineDigest:void 0};try{let e=Co(e=>{n.lineCount===0&&(n.firstLineDigest=yo(e)),n.lineCount+=1}),r=Buffer.allocUnsafe(vo);for(;;){let{bytesRead:n}=await t.read(r,0,r.length,null);if(e.push(r.subarray(0,n)),n===0)break}return e.end(),n}finally{await t.close()}}function So(e){let t;return bo(e,e=>(t=yo(e),!1)),t}function Co(e){let t=new $r(`utf8`),n=``,r=!1;return{push(i){if(r)return!1;let a=`${n}${t.write(i)}`,o=0;for(let t=a.indexOf(`
3
3
  `);t!==-1;t=a.indexOf(`
4
- `,o)){if(Co(a.slice(o,t),e)===!1)return r=!0,!1;o=t+1}return n=a.slice(o),!0},end(){r||Co(`${n}${t.end()}`,e)}}}function Co(e,t){let n=e.endsWith(`\r`)?e.slice(0,-1):e;if(n.trim().length!==0)return t(n)}function wo(e){try{return I.openSync(e,`r`)}catch(e){if(e.code===`ENOENT`)return;throw e}}async function To(e){try{return await I.promises.open(e,`r`)}catch(e){if(e.code===`ENOENT`)return;throw e}}const Eo=5242880;function Do(e=process.env){let t=e.AGENT_DEVICE_EVENT_LOG_MAX_BYTES?.trim();if(t===void 0||!/^\d+$/.test(t))return Eo;let n=Number(t);return Number.isSafeInteger(n)&&n>0?n:Eo}function Oo(e){return`${e}.1`}function ko(e){return`${e}.window.json`}function Ao(e){let t;for(let n=0;n<3;n+=1){let n=Ro(e);try{let t=jo(e);if(Ro(e)===n)return t}catch(r){if(t=r,Ro(e)===n)throw r}}throw t??H(e,`the window did not settle while reading`)}function jo(e){let t=Oo(e),n=Bo(e);if(n===`unverifiable`)throw H(e,`window file is invalid`);if(n===void 0)return Mo(e,t);let r=n.at(-1);if(!r)throw H(e,`window file records no generation`);let i=Uo(e),a=No(e,r),o=[],s=Po({eventLogPath:e,rotatedPath:t,sidecar:n,activeStart:a,activeExists:i});return s!==void 0&&o.push({path:t,firstLineIndex:s}),i&&o.push({path:e,firstLineIndex:a}),{files:o,earliestCursor:o[0]?.firstLineIndex??a}}function Mo(e,t){if(xo(t)!==void 0)throw H(e,`a rotated event log exists with no window record`);return{files:Uo(e)?[{path:e,firstLineIndex:0}]:[],earliestCursor:0}}function No(e,t){let n=xo(e);return n!==void 0&&n===t.firstLineDigest?t.firstLineIndex:t.firstLineIndex+t.lineCount}function Po(e){let{eventLogPath:t,rotatedPath:n,sidecar:r,activeStart:i,activeExists:a}=e,o=xo(n);if(o===void 0)return;let s=r.find(e=>e.firstLineDigest===o);if(!s)throw H(t,`the rotated event log matches no window record`);let c=Lo(n);if(c!==s.lineCount)throw H(t,`the rotated event log holds ${c} lines, the window recorded ${s.lineCount}`);if(a&&s.firstLineIndex+s.lineCount!==i)throw H(t,`retained event log generations are not contiguous`);return s.firstLineIndex}async function Fo(e,t){let n=Wo(e);if(!n||n.size<t)return!1;let r=Bo(e);if(r===`unverifiable`)return await I.promises.rename(e,Oo(e)),!0;let i=await bo(e);if(i.firstLineDigest!==void 0){let t=r??[],n=t.at(-1),a=n&&n.firstLineDigest===i.firstLineDigest?n:{firstLineIndex:n?n.firstLineIndex+n.lineCount:0,lineCount:i.lineCount,firstLineDigest:i.firstLineDigest};await Ho(e,(a===n?t:[...t,a]).slice(-2))}return await I.promises.rename(e,Oo(e)),!0}function Io(e,t){if(!(e>=t))throw new a(`COMMAND_FAILED`,`events cursor ${e} precedes the retained event log window; events before cursor ${t} were rotated out.`,{reason:`EVENT_LOG_CURSOR_EXPIRED`,cursor:e,earliestCursor:t,hint:`Resume with cursor ${t}, the oldest retained event; earlier events are no longer available.`})}function H(e,t){return new a(`COMMAND_FAILED`,`Session event log window cannot be verified: ${t}.`,{reason:`EVENT_LOG_WINDOW_UNVERIFIED`,path:e,hint:`Cursor positions for this session cannot be resolved. Delete ${e}, ${Oo(e)}, and ${ko(e)} to restart the timeline, or read the files directly.`})}function Lo(e){let t=0;return yo(e,()=>{t+=1}),t}function Ro(e){return[zo(ko(e)),zo(e),zo(Oo(e))].join(`|`)}function zo(e){try{let t=I.lstatSync(e);return`${t.ino}:${t.size}:${t.mtimeMs}`}catch{return`absent`}}function Bo(e){let t;try{t=I.readFileSync(ko(e),`utf8`)}catch(e){return e.code===`ENOENT`?void 0:`unverifiable`}try{let e=JSON.parse(t);if(!O(e)||e.version!==2)return`unverifiable`;let{generations:n}=e;if(!Array.isArray(n)||n.length===0)return`unverifiable`;let r=n.map(Vo);return r.every(e=>e!==void 0)?r:`unverifiable`}catch{return`unverifiable`}}function Vo(e){if(!O(e))return;let{firstLineIndex:t,lineCount:n,firstLineDigest:r}=e;if(!(!Number.isSafeInteger(t)||t<0)&&!(!Number.isSafeInteger(n)||n<0)&&typeof r==`string`&&r.length!==0)return{firstLineIndex:t,lineCount:n,firstLineDigest:r}}async function Ho(e,t){let n=ko(e),r=`${n}.${process.pid}.tmp`;await I.promises.writeFile(r,JSON.stringify({version:2,generations:t}),`utf8`),await I.promises.rename(r,n)}function Uo(e){return Wo(e)!==void 0}function Wo(e){try{let t=I.lstatSync(e);if(t.isSymbolicLink())throw new a(`COMMAND_FAILED`,`Session event log must not be a symbolic link: ${e}`);return t}catch(e){if(e.code===`ENOENT`)return;throw e}}const Go=new Map,Ko=new Set;function qo(e){return L.join(e,`events.ndjson`)}function Jo(e){return e.command!==pe.events}function Yo(e,t,n){let r=l({version:1,ts:n.ts??new Date().toISOString(),session:t,...n});Zo(e,`${JSON.stringify(r)}\n`)}async function Xo(e){await(e?Go.get(e):Promise.all(Go.values()))}function Zo(e,t){let n=(Go.get(e)??Promise.resolve()).catch(()=>void 0).then(async()=>{await Qo(e),await Fo(e,Do()),await I.promises.appendFile(e,t,`utf8`)}).catch(t=>{M({level:`warn`,phase:`session_event_log_write_failed`,data:{path:e,error:t instanceof Error?t.message:String(t)}})}).finally(()=>{Go.get(e)===n&&Go.delete(e)});Go.set(e,n)}async function Qo(e){let t=L.dirname(e);if(!Ko.has(t))try{await I.promises.mkdir(t,{recursive:!0}),Ko.add(t)}catch(t){throw M({level:`warn`,phase:`session_event_log_dir_failed`,data:{path:e,error:t instanceof Error?t.message:String(t)}}),t}}function $o(e,t,n){Yo(e,t,{kind:`action.recorded`,requestId:j().requestId,command:n.command,summary:Fn(n),details:Rn(n)})}function es(e){let{req:t}=e;return{kind:`request.started`,requestId:t.meta?.requestId??j().requestId,command:t.command,summary:`Started ${t.command}`}}function ts(e){let{req:t,response:n,durationMs:r}=e;if(n.ok){let e=Gn(t,n.data);return{kind:`request.finished`,requestId:t.meta?.requestId??j().requestId,command:t.command,status:`ok`,summary:e.summary??`Finished ${t.command}`,details:{durationMs:r,...e.details}}}return{kind:`request.finished`,requestId:t.meta?.requestId??j().requestId,command:t.command,status:`error`,summary:`Failed ${t.command}: ${n.error.code}`,details:{durationMs:r,code:n.error.code,diagnosticId:n.error.diagnosticId}}}function ns(e,t={}){let n=is(t.cursor),r=as(t.limit),i=Ao(e);Io(n,i.earliestCursor);let a=rs(i.files,n,r),o=a.lines.flatMap(e=>{let t=os(e);return t?[t]:[]});return{path:e,cursor:String(n),limit:r,events:o,...a.nextCursor===void 0?{}:{nextCursor:String(a.nextCursor)}}}function rs(e,t,n){let r=[],i;for(let a of e){let e=a.firstLineIndex;if(yo(a.path,a=>{if(e>=t+n)return i=t+n,!1;e>=t&&r.push(a),e+=1}),i!==void 0)break}return{lines:r,...i===void 0?{}:{nextCursor:i}}}function is(e){if(e===void 0||e.trim()===``)return 0;let t=Number(e);if(Number.isInteger(t)&&t>=0)return t;throw new a(`INVALID_ARGS`,`events cursor must be a non-negative integer string.`)}function as(e){if(e===void 0||typeof e==`string`&&e.trim()===``)return 100;let t=typeof e==`string`?Number(e):e;if(Number.isInteger(t)&&t>=1&&t<=500)return t;throw new a(`INVALID_ARGS`,`events limit must be between 1 and 500.`)}function os(e){try{let t=ss(JSON.parse(e));return t?cs(t):void 0}catch{return}}function ss(e){if(O(e)&&e.version===1&&typeof e.ts==`string`&&typeof e.session==`string`&&ls(e.kind))return e}function cs(e){let t=O(e.details)?e.details:void 0;return{version:1,ts:e.ts,session:e.session,kind:e.kind,...typeof e.requestId==`string`?{requestId:e.requestId}:{},...typeof e.command==`string`?{command:e.command}:{},...us(e.status)?{status:e.status}:{},...typeof e.summary==`string`?{summary:e.summary}:{},...t?{details:t}:{}}}function ls(e){return e===`request.started`||e===`request.finished`||e===`action.recorded`}function us(e){return e===`ok`||e===`error`}const ds=36e5;var fs=class{sessions=new Map;acceptingSessions=!0;runtimeHints=new Map;sessionsDir;scriptWriter;constructor(e){this.sessionsDir=e,this.scriptWriter=new qa(e)}get(e){return this.sessions.get(e)?.current}closeAdmission(){this.acceptingSessions=!1}assertAdmissionOpen(e){if(!this.acceptingSessions)throw new a(`COMMAND_FAILED`,`Daemon is shutting down`,{reason:`daemon_shutting_down`,session:e})}assertPublishable(e){if(this.assertAdmissionOpen(e),this.sessions.has(e))throw new a(`COMMAND_FAILED`,`Session address is already occupied`,{reason:`session_address_occupied`,session:e})}publish(e,t){this.assertPublishable(e);let n={current:t};return this.sessions.set(e,n),this.clearIdleExpiryTombstone(e),this.captureRef(e,n)}resolveCurrent(e){let t=this.sessions.get(e.address);return t===e.lifetime?t.current:void 0}refresh(e){let t=this.sessions.get(e.address);return t===e.lifetime?this.captureRef(e.address,t):e}requireCurrent(e){let t=this.resolveCurrent(e);if(!t)throw new a(`COMMAND_FAILED`,`Session lifetime has ended`,{reason:`session_lifetime_ended`,session:e.address,hint:`Open a new session before retrying the command.`});return t}update(e,t){let n=this.requireCurrent(e),r=this.sessions.get(e.address),i=typeof t==`function`?t(n):t,a={...n,...i};return r.current=a,a}retire(e){return this.resolveCurrent(e)?(this.runtimeHints.delete(e.address),this.sessions.delete(e.address)):!1}captureRef(e,t){return Object.freeze({address:e,session:t.current,lifetime:t})}*values(){for(let e of this.sessions.values())yield e.current}toArray(){return Array.from(this.values())}lookup(e){let t=this.sessions.get(e);return t?this.captureRef(e,t):void 0}findByDevice(e){for(let[t,n]of this.sessions)if(n.current.device.id===e)return this.captureRef(t,n)}listRefs(){return Array.from(this.sessions,([e,t])=>this.captureRef(e,t))}getRuntimeHints(e){return this.runtimeHints.get(e)}setRuntimeHints(e,t){t?this.runtimeHints.set(e,t):this.runtimeHints.delete(e)}clearRuntimeHints(e){return this.requireCurrent(e),this.runtimeHints.delete(e.address)}recordAction(e,t){let n=ya(this.requireCurrent(e),t);n&&$o(this.resolveEventLogPath(e.address),e.address,n)}recordEvent(e,t){Yo(this.resolveEventLogPath(e),e,t)}readEvents(e,t={}){return ns(this.resolveEventLogPath(e),t)}async flushEvents(e){await Xo(e?this.resolveEventLogPath(e):void 0)}writeSessionLog(e,t){let n=this.requireCurrent(e),r=this.scriptWriter.write(n,t);return r.written&&M({level:`info`,phase:`session_script_written`,data:{session:n.name,path:r.path}}),r}finalizeRepairTeardown(e){let t=this.resolveCurrent(e);if(!t)return;this.recordRepairFinalizeCloseIfCommitting(e);let n=this.writeSessionLog(e,{force:Li(t,void 0)});Ki(t)&&(!n.written&&n.error?this.writeRepairTombstone(e,ds,{code:String(n.error.code),message:n.error.message}):this.writeRepairTombstone(e))}recordRepairFinalizeCloseIfCommitting(e){let t=this.requireCurrent(e);fi(t.scriptPublication??z)&&this.recordAction(e,{command:`close`,positionals:[],flags:{},result:{session:t.name,...y(`Closed: ${t.name}`)}})}writeRepairTombstone(e,t=ds,n){let r=this.resolveCurrent(e);if(r)try{let i=this.resolveSessionDir(e.address);I.mkdirSync(i,{recursive:!0});let a={owner:e.address,reapedAt:Date.now(),expiresAt:Date.now()+t,...Ji(r)?{sourcePath:Ji(r)}:{},...n?{commitFailure:n}:{}};I.writeFileSync(this.repairTombstonePath(e.address),`${JSON.stringify(a)}\n`)}catch(t){M({level:`warn`,phase:`repair_tombstone_write_failed`,data:{session:e.address,error:t instanceof Error?t.message:String(t)}})}}readRepairTombstone(e){return jn(this.repairTombstonePath(e),e)}clearRepairTombstone(e){On(this.repairTombstonePath(e),e)}noteSessionActivity(e,t=Date.now()){let n=this.get(e);n&&(n.lastActivityAtMs=t)}writeIdleExpiryTombstone(e,t){try{I.mkdirSync(this.resolveSessionDir(e),{recursive:!0}),I.writeFileSync(Na(this.resolveSessionDir(e)),`${JSON.stringify(t)}\n`)}catch(t){M({level:`warn`,phase:`idle_expiry_tombstone_write_failed`,data:{session:e,error:t instanceof Error?t.message:String(t)}})}}readIdleExpiryTombstone(e){if(!an(e))return;let t=Pa(Na(this.resolveSessionDir(e)));return t?.owner===e?t:void 0}clearIdleExpiryTombstone(e){try{I.rmSync(Na(this.resolveSessionDir(e)),{force:!0})}catch(t){M({level:`warn`,phase:`idle_expiry_tombstone_clear_failed`,data:{session:e,error:t instanceof Error?t.message:String(t)}})}}repairTombstonePath(e){return Dn(this.resolveSessionDir(e))}defaultTracePath(e){let t=un(e.name),n=new Date().toISOString().replaceAll(/[:.]/g,`-`);return L.join(this.sessionsDir,`${t}-${n}.trace.log`)}resolveSessionDir(e){return dn(this.sessionsDir,e)}resolveDaemonStateDir(){return L.dirname(this.sessionsDir)}ensureSessionDir(e){let t=this.resolveSessionDir(e);return I.mkdirSync(t,{recursive:!0}),t}resolveAppLogPath(e){return en(this.sessionsDir,e)}resolveAppLogPidPath(e){return ln(this.sessionsDir,e)}resolveEventLogPath(e){return qo(this.resolveSessionDir(e))}};function ps(e){switch(e){case`INVALID_ARGS`:return 400;case`UNAUTHORIZED`:return 401;case`SESSION_NOT_FOUND`:case`REPAIR_SESSION_EXPIRED`:return 404;default:return 500}}function U(e,t){e.statusCode=ps(t.code),e.setHeader(`content-type`,`application/json`),e.end(JSON.stringify({ok:!1,error:t.message,code:t.code}))}function ms(e,t){if(e.headersSent){e.destroy(t);return}let n=s(t);e.statusCode=ps(n.code),e.end(n.message)}function hs(e,t){return new a(`COMMAND_FAILED`,`${e.label} not found or expired: ${t}`,{reason:`RESOURCE_EXPIRED`,hint:e.expiredHint})}function gs(e,t,n,r){let i=e.get(t);if(!i)throw hs(r,t);if(i.tenantId&&i.tenantId!==n)throw new a(`UNAUTHORIZED`,`${r.label} ${r.plural?`belong`:`belongs`} to a different tenant`);return i}const _s=9e5,vs={label:`Artifact`,expiredHint:`Downloadable artifacts are removed after download or after ${_s/6e4} minutes. Re-run the command that produced the artifact and download it again.`},ys=new Map;function bs(e){let t=F.randomUUID(),n=Date.now(),r=setTimeout(()=>{Ms(t)},_s);return r.unref(),ys.set(t,{artifactPath:e.artifactPath,tenantId:e.tenantId,artifactType:e.artifactType,fileName:e.fileName,...e.displayRotation===void 0?{}:{displayRotation:e.displayRotation},deleteAfterDownload:e.deleteAfterDownload!==!1,createdAt:n,timer:r}),t}async function xs(e,t){let{entry:n,stat:r}=ws(e,t),i=await Ts(e,n,r);if(!i)throw new a(`COMMAND_FAILED`,`Artifact path is not a regular file or directory: ${n.artifactPath}`);return i}async function Ss(e){let t=[];for(let[n,r]of ys){if(!ks(r,e))continue;let i;try{i=I.statSync(r.artifactPath)}catch{Ms(n);continue}let a=await Cs(n,r,i);a&&t.push({id:n,...r.artifactType===void 0?{}:{artifactType:r.artifactType},filename:a.fileName??n,mimeType:a.mimeType,sizeBytes:a.sizeBytes,createdAt:new Date(r.createdAt).toISOString(),expiresAt:new Date(r.createdAt+_s).toISOString(),...r.displayRotation===void 0?{}:{displayRotation:r.displayRotation}})}return t}async function Cs(e,t,n){try{return await Ts(e,t,n)}catch{return null}}function ws(e,t){let n=gs(ys,e,t,vs),r;try{r=I.statSync(n.artifactPath)}catch{throw Ms(e),new a(`COMMAND_FAILED`,`Artifact file is missing: ${n.artifactPath}`)}return{entry:n,stat:r}}async function Ts(e,t,n){if(n.isFile())return{artifactPath:t.artifactPath,fileName:As(t.fileName,e),mimeType:`application/octet-stream`,sizeBytes:n.size};if(!n.isDirectory())return null;let r=await Es(e,t);return{artifactPath:r.archivePath,fileName:r.fileName,mimeType:`application/gzip`,sizeBytes:r.sizeBytes}}async function Es(e,t){if(t.directoryArchive&&I.existsSync(t.directoryArchive.archivePath))return t.directoryArchive;if(t.directoryArchivePromise)return await t.directoryArchivePromise;let n=Ds(e,t);t.directoryArchivePromise=n;try{return await n}finally{t.directoryArchivePromise===n&&(t.directoryArchivePromise=void 0)}}async function Ds(e,t){Ns(t);let n=Os(As(t.fileName,L.basename(t.artifactPath)||e)),r=I.mkdtempSync(L.join(Kr.tmpdir(),`agent-device-download-${F.randomUUID()}-`)),i=L.join(r,n);try{await Bt(`tar`,[`czf`,i,`-C`,L.dirname(t.artifactPath),`--`,L.basename(t.artifactPath)],{env:{...process.env,COPYFILE_DISABLE:`1`}});let a={archivePath:i,tempDir:r,fileName:n,sizeBytes:I.statSync(i).size};if(ys.get(e)!==t)throw I.rmSync(r,{recursive:!0,force:!0}),hs(vs,e);return t.directoryArchive=a,a}catch(e){throw I.rmSync(r,{recursive:!0,force:!0}),e instanceof a?e:new a(`COMMAND_FAILED`,`Failed to archive downloadable artifact: ${t.artifactPath}`,{artifactPath:t.artifactPath},e instanceof Error?e:void 0)}}function Os(e){let t=e.toLowerCase();return t.endsWith(`.tar.gz`)||t.endsWith(`.tgz`)?e:`${e}.tar.gz`}function ks(e,t){return!e.tenantId||e.tenantId===t}function As(e,t){let n=e?.trim();return n&&!js(n)?n:t}function js(e){return e.includes(`/`)||e.includes(`\\`)||e.includes(`\0`)||e.includes(`\r`)||e.includes(`
5
- `)}function Ms(e){let t=ys.get(e);if(t&&(clearTimeout(t.timer),ys.delete(e),Ns(t),t.deleteAfterDownload))try{I.rmSync(t.artifactPath,{recursive:!0,force:!0})}catch{}}function Ns(e){if(e.directoryArchive)try{I.rmSync(e.directoryArchive.tempDir,{recursive:!0,force:!0})}catch{}finally{e.directoryArchive=void 0}}const Ps=3e5,Fs={label:`Uploaded artifact`,expiredHint:`Uploaded artifacts expire ${Ps/6e4} minutes after upload. Upload the file again and retry with the new upload id.`},Is=new Map;function Ls(e){let t=F.randomUUID(),n=setTimeout(()=>{zs(t)},Ps);return n.unref(),Is.set(t,{artifactPath:e.artifactPath,tempDir:e.tempDir,tenantId:e.tenantId,timer:n}),t}function Rs(e,t){let n=gs(Is,e,t,Fs);return clearTimeout(n.timer),n.artifactPath}function zs(e){let t=Is.get(e);t&&(clearTimeout(t.timer),Is.delete(e),I.rmSync(t.tempDir,{recursive:!0,force:!0}))}async function Bs(e){let t=L.join(e.tempDir,`extracted`),n=``,r=await Vs(e.archivePath);await xn({archivePath:e.archivePath,outputRoot:t,type:r,validateManifest:t=>{n=Hs(t,e.platform,e.expectedRootName)}});let i=L.join(t,n);if(!I.existsSync(i))throw I.rmSync(t,{recursive:!0,force:!0}),new a(`INVALID_ARGS`,`Expected extracted bundle "${n}" not found in archive`);return i}async function Vs(e){let t=await I.promises.open(e,`r`);try{let e=Buffer.alloc(2),{bytesRead:n}=await t.read(e,0,e.length,0);return n===e.length&&e[0]===31&&e[1]===139?`tgz`:`tar`}finally{await t.close()}}function Hs(e,t,n){if(e.length===0)throw new a(`INVALID_ARGS`,`Uploaded app bundle archive is empty`);let r=new Set(e.map(e=>e.name.split(`/`)[0]).filter(e=>!!e)),i=n??Us([...r],t);if(!r.has(i))throw new a(`INVALID_ARGS`,`Uploaded archive must contain a top-level "${i}" bundle`);for(let t of e)if(t.name!==i&&!t.name.startsWith(`${i}/`))throw new a(`INVALID_ARGS`,`Archive entry must stay inside top-level "${i}" bundle: ${t.name}`);return i}function Us(e,t){if(t===`ios`){let t=e.filter(e=>e.toLowerCase().endsWith(`.app`));if(t.length===1)return t[0];throw t.length===0?new a(`INVALID_ARGS`,`iOS app bundle archives must contain a single top-level .app directory`):new a(`INVALID_ARGS`,`iOS app bundle archives must contain exactly one top-level .app directory, found: ${t.join(`, `)}`)}if(e.length===1)return e[0];throw new a(`INVALID_ARGS`,`Archive must contain a single top-level bundle, found: ${e.join(`, `)}`)}const Ws=6e4;function Gs(e){let t=e.trim(),n=L.basename(t);if(!n||n===`.`||n===`..`)throw new a(`INVALID_ARGS`,`Invalid artifact filename: ${e}`);return n}function Ks(e){let t=Xs(e);return I.mkdtempSync(L.join(Kr.tmpdir(),`agent-device-artifact-${t}-`))}function qs(e){if(e===void 0)return;let t=String(e);if(!/^\d+$/.test(t))throw new a(`INVALID_ARGS`,`Invalid content-length header`);let n=Number(t);if(!Number.isSafeInteger(n))throw new a(`INVALID_ARGS`,`Invalid content-length header`);if(n>2147483648)throw new a(`INVALID_ARGS`,`Upload exceeds maximum size of ${bn} bytes`)}function Js(e,t){return new Promise((n,r)=>{let i=!1,o,s=I.createWriteStream(t),c=e=>{if(!i){if(i=!0,o&&clearTimeout(o),e){Ys(s,t).finally(()=>r(e));return}n()}},l=()=>{o&&clearTimeout(o),o=setTimeout(()=>{let t=new a(`COMMAND_FAILED`,`Artifact transfer timed out due to inactivity`,{timeoutMs:Ws});`destroy`in e&&typeof e.destroy==`function`&&e.destroy(t),u.destroy(t),c(t)},Ws)},u=Sn({maxBytes:bn,createLimitError:()=>new a(`INVALID_ARGS`,`Upload exceeds maximum size of ${bn} bytes`)});u.on(`data`,l),e.on(`aborted`,()=>{c(new a(`COMMAND_FAILED`,`Artifact transfer was interrupted`))}),l(),qr(e,u,s).then(()=>c(),e=>c(e))})}async function Ys(e,t){if(e.destroy(),!e.closed)try{await Zr(e,`close`)}catch{}await I.promises.rm(t,{force:!0}).catch(()=>{})}function Xs(e){let t=e?.trim();if(!t)return`request`;let n=t.replaceAll(/[^a-zA-Z0-9._-]+/g,`-`).replaceAll(/^-+|-+$/g,``);return n.length>0?n.slice(0,48):`request`}function Zs(e,t){let n=Array.isArray(e)?e[0]:e;if(!n)return;let r=n.match(/^bytes (\d+)-(\d+)\/(\d+)$/);r||$s();let i=Number(r[1]),a=Number(r[2]),o=Number(r[3]);return(!Number.isSafeInteger(i)||!Number.isSafeInteger(a)||!Number.isSafeInteger(o)||i<0||a<i||a>=o||o<1||o!==t)&&$s(),{start:i,end:a,size:o,span:a-i+1}}function Qs(e){if(e===void 0)return;if(!/^\d+$/.test(e))throw new a(`INVALID_ARGS`,`Invalid content-length header`);let t=Number(e);if(!Number.isSafeInteger(t)||t<0)throw new a(`INVALID_ARGS`,`Invalid content-length header`);return t}function $s(){throw new a(`INVALID_ARGS`,`Invalid content-range header`)}async function ec(e){let t=await nc(e.entry),n=Zs(e.req.headers[`content-range`],e.entry.sizeBytes);if(n&&n.start!==t||!n&&t>0)return{complete:!1,offset:t,appended:!1};let r=e.entry.sizeBytes-t,i=n?.span??r,o=Qs(e.req.headers[`content-length`]);if(o!==void 0&&o>i)throw new a(`INVALID_ARGS`,`Upload chunk exceeds its permitted byte range`);if(n&&o!==void 0&&o!==n.span)throw new a(`INVALID_ARGS`,`Upload chunk length does not match content-range`);let s=Sn({maxBytes:i,createLimitError:()=>new a(`INVALID_ARGS`,`Upload chunk exceeds its permitted byte range`)});try{if(await qr(e.req,s,I.createWriteStream(e.entry.payloadPath,{flags:`a`})),n&&s.bytesSeen!==n.span)throw new a(`INVALID_ARGS`,`Upload chunk length does not match content-range`);if(o!==void 0&&s.bytesSeen!==o)throw new a(`INVALID_ARGS`,`Upload chunk length does not match content-length`)}catch(n){throw await rc(e.entry.payloadPath,t,n,e.invalidate),n}let c=await nc(e.entry);return{complete:c===e.entry.sizeBytes,offset:c,appended:c>t}}async function tc(e){let t=F.createHash(`sha256`);for await(let n of I.createReadStream(e))t.update(n);return t.digest(`hex`)}async function nc(e){let t=(await I.promises.stat(e.payloadPath).catch(e=>{if(e.code!==`ENOENT`)throw e}))?.size??0;if(t>e.sizeBytes)throw new a(`COMMAND_FAILED`,`Upload state is corrupt`,{reason:`UPLOAD_STATE_CORRUPT`});return t}async function rc(e,t,n,r){try{await I.promises.truncate(e,t)}catch(e){let t=new a(`COMMAND_FAILED`,`Upload rollback failed; the upload ticket was invalidated`,{reason:`UPLOAD_ROLLBACK_FAILED`,originalError:String(n)},e);throw await r(t),t}}const ic=3e5,ac={label:`Upload`,expiredHint:`Resumable uploads expire ${ic/6e4} minutes after the last received chunk. Start the upload again from the beginning.`},oc=new Map,sc=new Map;function cc(e){xc(e);let t=Sc(e),n=sc.get(t),r=(n?oc.get(n):void 0)??dc(e,t);return{uploadId:r.id,cacheHit:!1,upload:{url:new URL(`upload/direct/${r.id}`,e.baseUrl.endsWith(`/`)?e.baseUrl:`${e.baseUrl}/`).toString(),headers:{...e.tokenHeaders,"content-type":e.contentType||`application/octet-stream`}}}}async function lc(e){let t=bc(e.uploadId,e.tenantId);return await mc(t,`receive`,e.req,async()=>{let{appended:n,...r}=await ec({entry:t,req:e.req,invalidate:async()=>await vc(t)});return n&&!t.closed&&fc(t),r})}async function uc(e,t){let n=bc(e,t);return await mc(n,`finalize`,void 0,async()=>{let t=I.statSync(n.payloadPath).size;if(t!==n.sizeBytes)throw new a(`INVALID_ARGS`,`Upload is incomplete`,{uploadId:e,offset:t,sizeBytes:n.sizeBytes});try{let t=await tc(n.payloadPath);if(t!==n.sha256)throw new a(`INVALID_ARGS`,`Upload hash mismatch`,{uploadId:e,expectedSha256:n.sha256,actualSha256:t});let r=await hc(n);return gc(n),{artifactPath:r,tempDir:n.tempDir}}catch(e){throw await _c(n,e)}})}function dc(e,t){let n=F.randomUUID(),r=Ks(`upload`),i=L.join(r,`payload`);I.writeFileSync(i,``);let a={id:n,key:t,tempDir:r,payloadPath:i,fileName:Gs(e.fileName),sizeBytes:e.sizeBytes,sha256:e.sha256.toLowerCase(),artifactType:e.artifactType,platform:e.platform,tenantId:e.tenantId,generation:0,tail:Promise.resolve(),closed:!1,finalized:!1};return oc.set(n,a),sc.set(t,n),fc(a),a}function fc(e){e.timer&&clearTimeout(e.timer),e.generation+=1;let t=e.generation;e.timer=setTimeout(()=>pc(e,t),ic),e.timer.unref()}function pc(e,t){if(e.generation!==t||e.closed)return;yc(e);let n=e.activeReceive;n?.once(`error`,()=>{}),n?.destroy(new a(`COMMAND_FAILED`,`Upload expired while receiving data`,{reason:`RESOURCE_EXPIRED`})),e.tail=e.tail.then(async()=>{e.finalized||await I.promises.rm(e.tempDir,{recursive:!0,force:!0})}).catch(()=>{})}async function mc(e,t,n,r){let i=e.tail.catch(()=>{}).then(async()=>{e.closed&&bc(e.id,e.tenantId),t===`receive`&&(e.activeReceive=n);try{return await r()}finally{t===`receive`&&(e.activeReceive=void 0)}});return e.tail=i.then(()=>{},()=>{}),await i}async function hc(e){if(e.artifactType===`file`){let t=L.join(e.tempDir,e.fileName);return await I.promises.rename(e.payloadPath,t),t}let t=await Bs({archivePath:e.payloadPath,tempDir:e.tempDir,platform:e.platform===`android`?`android`:`ios`,expectedRootName:e.fileName});return await I.promises.rm(e.payloadPath,{force:!0}),t}function gc(e){e.finalized=!0,yc(e)}async function _c(e,t){yc(e);try{return await I.promises.rm(e.tempDir,{recursive:!0,force:!0}),t}catch(e){return new a(`COMMAND_FAILED`,`Upload finalize cleanup failed`,{reason:`UPLOAD_FINALIZE_CLEANUP_FAILED`,originalError:String(t)},e)}}async function vc(e){yc(e),await I.promises.rm(e.tempDir,{recursive:!0,force:!0}).catch(()=>{})}function yc(e){e.closed=!0,e.timer&&clearTimeout(e.timer),oc.delete(e.id),sc.delete(e.key)}function bc(e,t){return gs(oc,e,t,ac)}function xc(e){if(!/^[a-f0-9]{64}$/i.test(e.sha256))throw new a(`INVALID_ARGS`,`Invalid upload sha256`);if(!Number.isSafeInteger(e.sizeBytes)||e.sizeBytes<0)throw new a(`INVALID_ARGS`,`Invalid upload sizeBytes`);if(qs(String(e.sizeBytes)),Gs(e.fileName),!e.uploadAttemptId.trim())throw new a(`INVALID_ARGS`,`uploadAttemptId is required`)}function Sc(e){return[e.tenantId??``,e.uploadAttemptId,e.sha256.toLowerCase(),String(e.sizeBytes),Gs(e.fileName),e.artifactType,e.platform??``].join(`\0`)}async function Cc(e){let t=e.headers[`x-artifact-type`],n=e.headers[`x-artifact-filename`];if(!t||!n)throw new a(`INVALID_ARGS`,`Missing required headers: x-artifact-type and x-artifact-filename`);if(t!==`file`&&t!==`app-bundle`)throw new a(`INVALID_ARGS`,`Invalid x-artifact-type: ${t}. Must be "file" or "app-bundle".`);qs(e.headers[`content-length`]);let r=Gs(n),i=Ks(`upload`);try{if(t===`file`){let t=L.join(i,r);return await Js(e,t),{artifactPath:t,tempDir:i}}let n=L.join(i,`artifact.tar`);await Js(e,n);let a=await Bs({archivePath:n,tempDir:i,platform:`ios`,expectedRootName:r});return I.rmSync(n,{force:!0}),{artifactPath:a,tempDir:i}}catch(e){throw I.rmSync(i,{recursive:!0,force:!0}),e}}function wc(e){let{req:t,res:n,authorize:r,token:i}=e,a=Ec(t);return a!==null&&(Tc(a,t,n,r,i),!0)}async function Tc(e,t,n,r,i){switch(e.kind){case`preflight`:await Oc(t,n,r,i);return;case`direct`:await kc(e.uploadId,t,n,r);return;case`finalize`:await Ac(t,n,r);return;case`upload`:await Dc(t,n,r);return}}function Ec(e){return e.method===`POST`&&e.url===`/upload/preflight`?{kind:`preflight`}:e.method===`PUT`&&e.url?.startsWith(`/upload/direct/`)?{kind:`direct`,uploadId:e.url.slice(15).replace(/\?.*$/,``)}:e.method===`POST`&&e.url===`/upload/finalize`?{kind:`finalize`}:e.method===`POST`&&e.url===`/upload`?{kind:`upload`}:null}async function Dc(e,t,n){try{let r=await n({req:e,res:t,daemonRequest:{command:`upload`,positionals:[]}});if(!r)return;Mc(t,await Cc(e),r.tenantId)}catch(e){U(t,s(e))}}async function Oc(e,t,n,r){try{let i=await n({req:e,res:t,daemonRequest:{command:`upload`,positionals:[`preflight`]}});if(!i)return;let a=Pc(await Nc(e,65536));jc(t,{ok:!0,...cc({baseUrl:Vc(e),tokenHeaders:Bc(r),...a,tenantId:i.tenantId})})}catch(e){U(t,s(e))}}async function kc(e,t,n,r){try{let i=await r({req:t,res:n,daemonRequest:{command:`upload`,positionals:[`direct`,e]}});if(!i)return;let a=await lc({uploadId:e,req:t,tenantId:i.tenantId});if(a.complete){n.statusCode=200,n.end(`ok`);return}n.statusCode=308,a.offset>0&&n.setHeader(`range`,`bytes=0-${a.offset-1}`),n.setHeader(`x-upload-offset`,String(a.offset)),n.end()}catch(e){U(n,s(e))}}async function Ac(e,t,n){try{let r=await n({req:e,res:t,daemonRequest:{command:`upload`,positionals:[`finalize`]}});if(!r)return;Mc(t,await uc(Fc(await Nc(e,65536)).uploadId,r.tenantId),r.tenantId)}catch(e){U(t,s(e))}}function jc(e,t){e.statusCode=200,e.setHeader(`content-type`,`application/json`),e.end(JSON.stringify(t))}function Mc(e,t,n){jc(e,{ok:!0,uploadId:Ls({artifactPath:t.artifactPath,tempDir:t.tempDir,tenantId:n})})}async function Nc(e,t){let n=(await Qt(e,t,`Request body is too large.`)).toString(`utf8`);try{let e=JSON.parse(n);if(!e||typeof e!=`object`||Array.isArray(e))throw Error(`expected object`);return e}catch(e){throw new a(`INVALID_ARGS`,`Invalid JSON request body`,{},e)}}function Pc(e){return{sha256:Ic(e,`sha256`),uploadAttemptId:Ic(e,`uploadAttemptId`),fileName:Ic(e,`fileName`),sizeBytes:Rc(e,`sizeBytes`),artifactType:zc(e),platform:Lc(e,`platform`),contentType:Lc(e,`contentType`)}}function Fc(e){return{uploadId:Ic(e,`uploadId`)}}function Ic(e,t){let n=Lc(e,t)?.trim();if(!n)throw new a(`INVALID_ARGS`,`${t} is required`);return n}function Lc(e,t){let n=e[t];return typeof n==`string`?n:void 0}function Rc(e,t){let n=e[t];if(typeof n!=`number`||!Number.isSafeInteger(n))throw new a(`INVALID_ARGS`,`${t} must be an integer`);return n}function zc(e){let t=Ic(e,`artifactType`);if(t===`file`||t===`app-bundle`)return t;throw new a(`INVALID_ARGS`,`artifactType must be "file" or "app-bundle"`)}function Bc(e){return{authorization:`Bearer ${e}`,"x-agent-device-token":e}}function Vc(e){let t=typeof e.headers.host==`string`?e.headers.host:``;if(!t)throw new a(`INVALID_ARGS`,`Missing host header`);let n=e.headers[`x-forwarded-proto`];return`${(Array.isArray(n)?n[0]:n)||`http`}://${t}`}function Hc(e){try{return decodeURIComponent(e)}catch{return``}}function Uc(e){let{req:t,res:n,authorize:r,retainArtifacts:i}=e,a=Gc(t);return a!==null&&(Wc(a,t,n,r,{retainArtifacts:i}),!0)}async function Wc(e,t,n,r,i){switch(e.kind){case`inventory`:await qc(t,n,r);return;case`download`:await Kc(e.artifactId,t,n,r,i);return}}function Gc(e){if(e.method!==`GET`)return null;let t=Yc(e.url);return t===`/artifacts`||t===`/artifacts/`?{kind:`inventory`}:t.startsWith(`/artifacts/`)?{kind:`download`,artifactId:Jc(t)}:null}async function Kc(e,t,n,r,i){if(!e){n.statusCode=400,n.end(`Missing artifact id`);return}try{let a=await r({req:t,res:n,daemonRequest:{command:`download_artifact`,positionals:[e]}});if(!a)return;let o=await xs(e,a.tenantId),s=i.retainArtifacts===!0,c=I.createReadStream(o.artifactPath);n.statusCode=200,n.setHeader(`content-type`,o.mimeType),n.setHeader(`content-length`,String(o.sizeBytes)),o.fileName&&n.setHeader(`content-disposition`,`attachment; filename="${o.fileName.replace(/"/g,``)}"`),c.on(`error`,e=>{ms(n,e)});let l=!1,u=()=>{l||s||(l=!0,Ms(e))},d=0;c.on(`data`,e=>{d+=e.length,d>=o.sizeBytes&&u()}),c.on(`end`,u),n.on(`finish`,u),n.on(`close`,()=>{n.writableFinished&&u()}),c.pipe(n)}catch(e){U(n,s(e))}}async function qc(e,t,n){try{let r=await n({req:e,res:t,daemonRequest:{command:`list_artifacts`,positionals:[]}});if(!r)return;t.statusCode=200,t.setHeader(`content-type`,`application/json`),t.end(JSON.stringify({artifacts:await Ss(r.tenantId)}))}catch(e){U(t,s(e))}}function Jc(e){let t=e.slice(11);return!t||t.includes(`/`)?``:Hc(t)}function Yc(e){let t=e||`/`,n=t.indexOf(`?`);return n>=0?t.slice(0,n)||`/`:t}function Xc(e,t){return Zc(e,t)?t:`${e}:${t}`}function Zc(e,t){return t.startsWith(`${e}:`)}function Qc(e,t){return!e.partitioned||Zc(e.tenant,t)}const $c=[``,`sessions`,null,`requests`,null,`diagnostics`];function el(e){let t=tl(e.req);return t!==null&&(nl(t,e),!0)}function tl(e){if(e.method!==`GET`)return null;let t=(e.url??``).split(`?`,1)[0].split(`/`);return t.length!==$c.length||!$c.every((e,n)=>e===null||t[n]===e)?null:{session:Hc(t[2]??``),requestId:Hc(t[4]??``)}}async function nl(e,t){let{req:n,res:r,authorize:i,resolveRecordPath:o}=t;try{if(!an(e.session)||!an(e.requestId)){U(r,s(new a(`INVALID_ARGS`,`Invalid session or request id in diagnostics route`)));return}let t=await i({req:n,res:r,daemonRequest:{command:`request_diagnostics`,positionals:[e.session,e.requestId]}});if(!t)return;if(t.sessionNamespace&&!Qc(t.sessionNamespace,e.session)){U(r,s(new a(`UNAUTHORIZED`,`Session is outside this tenant`,{session:e.session})));return}let c=o(e),l=await rl(c);if(!l){U(r,s(new a(`SESSION_NOT_FOUND`,`No diagnostics record for request ${e.requestId} in session ${e.session}`,{hint:`The daemon keeps a request record only for the session it ran in; re-run the command against this daemon to produce a fresh one.`})));return}let u=I.createReadStream(c);r.statusCode=200,r.setHeader(`content-type`,`application/x-ndjson`),r.setHeader(`content-length`,String(l.size)),u.on(`error`,e=>{ms(r,e)}),u.pipe(r)}catch(e){U(r,s(e))}}async function rl(e){try{let t=await I.promises.stat(e);return t.isFile()?t:null}catch{return null}}function il(e){return(e??``).trim().toLowerCase()===`tenant`?`tenant`:`none`}function al(e){if(!e)return;let t=e.trim();if(t&&/^[a-zA-Z0-9._-]{1,128}$/.test(t))return t}const ol=`default`;function sl(e){let t=Number.isInteger(e.defaultLeaseTtlMs)?Math.max(1,Number(e.defaultLeaseTtlMs)):6e4,n=Number.isInteger(e.minLeaseTtlMs)?Math.max(1,Number(e.minLeaseTtlMs)):Fe,r=Number.isInteger(e.maxLeaseTtlMs)?Math.max(n,Number(e.maxLeaseTtlMs)):6e5;return e=>{if(!Number.isInteger(e))return t;let i=Number(e);if(i<n||i>r)throw new a(`INVALID_ARGS`,`Lease ttlMs must be between ${n} and ${r}.`);return i}}function cl(e){if(!e)return;let t=e.trim();if(t&&/^[a-zA-Z0-9._-]{1,128}$/.test(t))return t}function ll(e){if(!e)return;let t=e.trim();if(t&&/^[a-f0-9]{16,128}$/i.test(t))return t.toLowerCase()}function ul(e){let t=ll(e);if(!t)throw new a(`INVALID_ARGS`,`Invalid lease id.`);return t}function dl(e){let t=(e??``).trim().toLowerCase();if(!t)return`ios-simulator`;let n=_.find(e=>e===t);if(n)return n;throw new a(`INVALID_ARGS`,`Unsupported lease backend: ${e??``}`)}function fl(e){if(e===void 0)return;let t=e.trim();if(!t||t.length>256||!/^[\u0020-\u007E]+$/.test(t))throw new a(`INVALID_ARGS`,`Invalid device key. Use 1-256 printable characters.`);return t}function pl(e){return hl(e,`client id`,128)}function ml(e){return hl(e,`lease provider`,64)}function hl(e,t,n){if(e===void 0)return;let r=e.trim();if(!r||r.length>n||!/^[a-zA-Z0-9._-]+$/.test(r))throw new a(`INVALID_ARGS`,`Invalid ${t}. Use 1-${String(n)} chars: letters, numbers, dot, underscore, hyphen.`);return r}function gl(e){let t=al(e);if(!t)throw new a(`INVALID_ARGS`,`Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.`);return t}function _l(e){let t=cl(e);if(!t)throw new a(`INVALID_ARGS`,`Invalid run id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.`);return t}function vl(e){return{backend:dl(e.leaseBackend),leaseProvider:ml(e.leaseProvider),deviceKey:fl(e.deviceKey),clientId:pl(e.clientId),tenantId:gl(e.tenantId),runId:_l(e.runId),ttlMs:e.ttlMs,retainOnClose:e.retainOnClose}}function yl(e){return!!(e.leaseProvider??e.deviceKey??e.clientId)}function bl(e,t){return!t.tenantId||!t.runId?!1:[[e.leaseProvider,t.leaseProvider],[e.deviceKey,t.deviceKey],[e.clientId,t.clientId]].every(([e,t])=>!e||!!t)}function xl(e,t){let n=Cl(t);if(n.tenantId&&e.tenantId!==n.tenantId||n.runId&&e.runId!==n.runId||n.leaseBackend&&e.backend!==n.leaseBackend||n.leaseProvider&&e.leaseProvider!==n.leaseProvider||n.deviceKey&&e.deviceKey!==n.deviceKey||n.clientId&&e.clientId!==n.clientId)throw new a(`UNAUTHORIZED`,`Lease does not match tenant/run scope`,{reason:`LEASE_SCOPE_MISMATCH`})}function Sl(e){let t=dl(e.leaseBackend),n=al(e.tenantId);if(!n)throw new a(`INVALID_ARGS`,`tenant isolation requires tenant id.`);let r=cl(e.runId);if(!r)throw new a(`INVALID_ARGS`,`tenant isolation requires run id.`);let i=ll(e.leaseId);if(!i)throw new a(`INVALID_ARGS`,`tenant isolation requires lease id.`);return{...e,tenantId:n,runId:r,leaseId:i,leaseBackend:t}}function Cl(e){let t=al(e.tenantId),n=cl(e.runId);if(e.tenantId&&!t)throw new a(`INVALID_ARGS`,`Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.`);if(e.runId&&!n)throw new a(`INVALID_ARGS`,`Invalid run id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.`);return{tenantId:t,runId:n,leaseBackend:e.leaseBackend?dl(e.leaseBackend):void 0,leaseProvider:ml(e.leaseProvider),deviceKey:fl(e.deviceKey),clientId:pl(e.clientId)}}function wl(e,t){if(yl(e)&&!bl(e,t))throw new a(`UNAUTHORIZED`,`Lease owner scope is required`,{reason:`LEASE_SCOPE_REQUIRED`})}function Tl(e,t){return e.tenantId===t.tenantId&&e.runId===t.runId&&e.backend===t.backend&&e.leaseProvider===t.leaseProvider&&e.deviceKey===t.deviceKey&&e.clientId===t.clientId}function W(e){if(e.deviceKey)return JSON.stringify([e.backend,e.leaseProvider??ol,e.deviceKey])}function El(e){return JSON.stringify([e.tenantId,e.runId,e.backend,e.leaseProvider??ol,e.deviceKey??`*`])}function Dl(e,t,n){return{leaseId:F.randomBytes(16).toString(`hex`),tenantId:e.tenantId,runId:e.runId,backend:e.backend,...e.leaseProvider?{leaseProvider:e.leaseProvider}:{},...e.deviceKey?{deviceKey:e.deviceKey}:{},...e.clientId?{clientId:e.clientId}:{},...e.retainOnClose?{retainOnClose:!0}:{},createdAt:n,heartbeatAt:n,expiresAt:n+t}}function Ol(e){return e.expiresAt-e.heartbeatAt}function kl(e){return new a(`DEVICE_IN_USE`,`Device is already leased`,{reason:`DEVICE_LEASE_BUSY`,deviceKey:e.deviceKey,backend:e.backend,leaseProvider:e.leaseProvider,expiresAt:e.expiresAt,hint:`Retry after the lease expires or close the owning session.`})}function Al(e){return ke({leaseId:e.leaseId,tenantId:e.tenantId,runId:e.runId,leaseBackend:e.backend,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey,clientId:e.clientId})}function jl(e){let t=Nl(e,`Human-control request body`),n=t.reason;if(n!==void 0&&(typeof n!=`string`||n.trim().length>512))throw new a(`INVALID_ARGS`,`Human-control reason must be at most 512 characters.`);let r=t.ttlMs;if(r!==void 0&&(typeof r!=`number`||!Number.isInteger(r)||r<1e3||r>864e5))throw new a(`INVALID_ARGS`,`Human-control ttlMs must be between 1000 and 86400000.`);return{...t.scope===void 0?{}:{scope:Ml(t.scope)},...typeof n==`string`&&n.trim()?{reason:n.trim()}:{},...typeof r==`number`?{ttlMs:r}:{}}}function Ml(e){let t=Nl(e,`Host human-control scope`);if(typeof t.backend!=`string`||!t.backend.trim()||typeof t.deviceKey!=`string`)throw new a(`INVALID_ARGS`,`Host human control requires scope.backend and scope.deviceKey.`);if(t.leaseProvider!==void 0&&typeof t.leaseProvider!=`string`)throw new a(`INVALID_ARGS`,`scope.leaseProvider must be a string.`);let n=ml(t.leaseProvider);return{backend:dl(t.backend),deviceKey:fl(t.deviceKey),...n?{leaseProvider:n}:{}}}function Nl(e,t){if(!e||typeof e!=`object`||Array.isArray(e))throw new a(`INVALID_ARGS`,`${t} must be an object.`);return e}function Pl(e){let t=typeof e==`string`?e.trim():``;if(!/^[a-zA-Z0-9._-]{1,128}$/.test(t))throw new a(`INVALID_ARGS`,`Invalid human-control hold id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.`);return t}function Fl(e){return{...e,scope:{...e.scope}}}function Il(e){return new a(`DEVICE_IN_USE`,`A human is interacting with this simulator or device; agent interactions are temporarily disabled.`,{reason:`human_control_active`,blockedBy:`human_control`,holdId:e.id,deviceKey:e.scope.deviceKey,pausedAt:new Date(e.createdAt).toISOString(),...e.expiresAt===void 0?{}:{expiresAt:new Date(e.expiresAt).toISOString()},...e.reason?{humanReason:e.reason}:{},hint:`Wait until the human-control hold is released before retrying.`})}function Ll(e){let t=Ul(e.req);return t?(Rl(t,e),!0):!1}async function Rl(e,t){let{req:n,res:r,expectedToken:i}=t;try{ql(n,i),await zl(e,t)}catch(e){U(r,s(e))}}async function zl(e,t){switch(e.kind){case`list`:G(t.res,{ok:!0,holds:t.registry.listHumanControlHolds({kind:`host`})});return;case`upsert`:await Bl(e.holdId,t);return;case`remove`:Vl(e.holdId,t);return;case`unsupported`:Hl(t.res);return;case`invalid`:throw new a(`INVALID_ARGS`,`Invalid request URL.`)}}async function Bl(e,t){let{req:n,res:r}=t,a=new AbortController,o=()=>{r.writableFinished||a.abort(i())};n.once(`aborted`,o),r.once(`close`,o),(n.aborted||r.destroyed)&&o();try{let i=await Kl(n);G(r,{ok:!0,hold:await t.registry.putHumanControlHold({kind:`host`},e,i,a.signal),state:`active`})}finally{n.off(`aborted`,o),r.off(`close`,o)}}function Vl(e,t){let n=t.registry.removeHumanControlHold({kind:`host`},e);G(t.res,{ok:!0,released:!!n,...n?{hold:n}:{}})}function Hl(e){e.statusCode=405,e.setHeader(`allow`,`GET, PUT, DELETE`),G(e,{ok:!1,error:`Method not allowed`,code:`INVALID_ARGS`})}function Ul(e){let t=Gl(e.url);return t===null?{kind:`invalid`}:Wl(t,e.method)}function Wl(e,t){if(e===`/admin/human-control/holds`)return t===`GET`?{kind:`list`}:{kind:`unsupported`};if(!e.startsWith(`/admin/human-control/holds/`))return null;let n=e.slice(27);return!n||n.includes(`/`)?{kind:`unsupported`}:t===`PUT`?{kind:`upsert`,holdId:n}:t===`DELETE`?{kind:`remove`,holdId:n}:{kind:`unsupported`}}function Gl(e){try{return new URL(e??`/`,`http://127.0.0.1`).pathname}catch{return null}}async function Kl(e){return jl(await Jl(e,`Human-control`))}function ql(e,t){let n=typeof e.headers.authorization==`string`?e.headers.authorization:``,r=n.toLowerCase().startsWith(`bearer `)?n.slice(7):``,i=(typeof e.headers[`x-agent-device-token`]==`string`?e.headers[`x-agent-device-token`]:``)||r;if(!i||!hn(i,t))throw new a(`UNAUTHORIZED`,`Invalid token`)}async function Jl(e,t){let n=await Qt(e,16384,`${t} request body is too large.`);try{return JSON.parse(n.toString(`utf8`))}catch(e){throw new a(`INVALID_ARGS`,`${t} request body must be valid JSON.`,{},e)}}function G(e,t){e.statusCode||=200,e.setHeader(`content-type`,`application/json`),e.end(JSON.stringify(t))}const Yl=Ct(xt),Xl=hu(Yl);function Zl(e){return K(e)?.route??`generic`}function Ql(e){return K(e)?.sessionKind}function $l(e){return K(e)?.leaseAdmissionExempt===!0}function eu(e){return K(e)?.appLease===`allowed`}function tu(e){return K(e)?.selectorValidationExempt!==!0}function nu(e){return K(e)?.sessionExecutionLockExempt!==!0}function ru(e){return K(e)?.replayScopedAction===!0}function iu(e){return K(e)?.allowInvalidRecording!==!0}function au(e){return K(e)?.saveScriptFlagOwner===!0}function ou(){return Yl.filter(e=>e.saveScriptFlagOwner===!0).map(e=>e.command).sort()}function su(e){return K(e)?.lockPolicySelectorOverride===!0}function cu(e){return K(e)?.androidBlockingDialogGuard===!0}function lu(e){if(e.command===`human_control`||e.command===`lease_heartbeat`)return!1;let t=ht(e);return t===void 0?Ql(e.command)!==`observability`&&vt(e.command)!==`observe`:t!==`observes-app`}function uu(e){return K(e.command)?.preferExplicitDeviceOverExistingSession===!0}function du(e){let t=K(e.command)?.allowSessionlessDefaultDevice;return typeof t==`function`&&t(e)}function fu(e){return K(e.command)?.sessionlessLeaseAdmissionExemption?.(e)}function pu(e){let t=K(e.command)?.refFrameEffect;return typeof t==`function`?t(e):t}function mu(e,t){return t.hasExistingSession?uu(e)&&t.hasExplicitDeviceIdentity?`explicit-device`:`existing-session`:gu(e)?`skip`:t.hasDeviceSelectionInput?`explicit-device`:du(e)?`sessionless-default-device`:`skip`}function K(e){return Xl.descriptorsByCommand.get(e)}function hu(e){let t=new Map;for(let n of e){if(t.has(n.command))throw Error(`Duplicate daemon command descriptor: ${n.command}`);t.set(n.command,n)}return{descriptorsByCommand:t}}function gu(e){let t=K(e.command);if(t?.route===`lease`)return!0;let n=t?.skipSessionlessProviderDevice;return typeof n==`function`&&n(e)}const _u=/^[A-Za-z0-9_-]+(?:\.[A-Za-z0-9_-]+)+$/,vu=/^[1-9][0-9]{0,9}$/;function yu(e){let t=e?.trim()??``,n=t.lastIndexOf(`@`),r=n<0?t:t.slice(0,n),i=n<0?void 0:t.slice(n+1);if(!_u.test(r)||i!==void 0&&!vu.test(i))throw new a(`INVALID_ARGS`,`A macos-app lease device key must be <bundleId> or <bundleId>@<pid>.`,{deviceKey:t});return i===void 0?{bundleId:r}:{bundleId:r,pid:Number(i)}}const bu=new Set([`open`,`batch`]),xu=[`out`,`saveScript`,`sessionSaveScript`,`baseline`,`launchConsole`,`launchArgs`,`launchUrl`,`bundleUrl`,`artifactsDir`,`stepsFile`,`searchPath`,`retainPaths`,`installSource`,`metroProjectRoot`,`metroRuntimeFile`,`iosXctestrunFile`,`iosXctestDerivedDataPath`,`iosXctestEnvDir`],Su=[`device`,`udid`,`serial`,`target`,`iosSimulatorDeviceSet`,`androidDeviceAllowlist`];function q(e,t,n={}){return new a(`UNAUTHORIZED`,t,{...n,reason:`MACOS_APP_LEASE_DENIED`,rule:e,retriable:!1,hint:`This lease is limited to one macOS app; retrying will not help. Use an allowed command on the leased app.`})}function Cu(e,t,n){if(e.backend!==`macos-app`)return;let r=yu(e.deviceKey);if(Tu(r,t.command,t.positionals??[],wu(t.runtime,{...t.input,...t.flags})),(t.command===`open`||t.command===`batch`)&&t.flags?.platform!==`macos`)throw q(`device`,`A macos-app lease needs platform macos on ${t.command}.`);if(t.command===`batch`)for(let e of t.flags?.batchSteps??[]){let t=Array.isArray(e.positionals)?e.positionals.map(String):[];Tu(r,Tt(e.command),t,wu(e.runtime,{...e.input,...e.flags}))}if(n)Mu(r,n);else if(!bu.has(t.command))throw q(`session`,`A macos-app lease runs ${t.command} only in a session of ${r.bundleId}; open it first.`,{command:t.command,bundleId:r.bundleId})}function wu(e,t){return{...t,...e?.launchUrl?{launchUrl:e.launchUrl}:{},...e?.bundleUrl?{bundleUrl:e.bundleUrl}:{}}}function Tu(e,t,n,r){if(!eu(t))throw q(`command`,`A macos-app lease does not allow ${t}.`,{command:t});if(ku(r),Ou(r),t===`screenshot`?Eu(n,r):Du(r),t===`open`&&Au(e,n),t===`close`&&n.length>0&&n[0]!==e.bundleId)throw q(`app`,`A macos-app lease only closes ${e.bundleId}.`,{bundleId:e.bundleId})}function Eu(e,t){if(t.screenshotFullscreen===!0)throw q(`capture`,`A macos-app lease captures only the app window.`);let{out:n,...r}=t;Du(r);for(let t of[e[0],n])if(!(t===void 0||typeof t==`string`&&Kt(t,`screenshot`,`.png`)))throw q(`host-path`,`A macos-app lease does not write files on the host.`)}function Du(e){let t=xu.find(t=>e[t]!==void 0&&e[t]!==!1);if(t)throw q(`host-path`,`A macos-app lease does not accept ${t}, which names a host path or launch.`,{field:t})}function Ou(e){let t=Su.find(t=>e[t]!==void 0&&e[t]!==``);if(t)throw q(`device`,`A macos-app lease does not accept the ${t} device selector.`,{field:t})}function ku(e){if(e.surface!==void 0&&e.surface!==`app`)throw q(`surface`,`A macos-app lease is limited to the app surface, not ${String(e.surface)}.`,{surface:e.surface});if(e.platform!==void 0&&e.platform!==`macos`)throw q(`app`,`A macos-app lease only drives a macOS app.`,{platform:e.platform})}function Au(e,t){if(t.length!==1||t[0]!==e.bundleId)throw q(`app`,`A macos-app lease only opens ${e.bundleId}.`,{bundleId:e.bundleId});ju()}function ju(){if(Nt(Ft)!==`native`)throw q(`backend`,`A macos-app lease needs the native macOS app backend (AGENT_DEVICE_MACOS_APP_BACKEND=native).`)}function Mu(e,t){if(!$e(t.device)||(t.surface??`app`)!==`app`||t.appBundleId!==e.bundleId)throw q(`app`,`This session is not the leased app ${e.bundleId}.`,{bundleId:e.bundleId})}const Nu=/bundleID="([^"]+)"/,Pu=async e=>{if(!Lt(e))return;let t=await Bt(`/usr/bin/lsappinfo`,[`info`,`-only`,`bundleid`,String(e)],{allowFailure:!0,timeoutMs:5e3});return Nu.exec(t.stdout)?.[1]};async function Fu(e,t=Pu){if(e.backend!==`macos-app`)return;let n=yu(e.deviceKey);if(n.pid!==void 0&&await t(n.pid)!==n.bundleId)throw q(`process`,`The leased app process ${n.bundleId}@${n.pid} is no longer running.`,{bundleId:n.bundleId,pid:n.pid})}const Iu=[`sessionStateDir`,`runnerLogPath`,`requestLogPath`,`eventLogPath`,`device`,`id`,`kind`,`serial`,`device_udid`,`ios_simulator_device_set`],Lu=/(?<![\p{L}\p{N}_./])\/(?:Users|home|private|var|tmp|Volumes|Library|Applications|opt|System|usr|etc|Network|cores)(?:\/[\p{L}\p{N}_.@%+~-]+)*\/?/gu;function Ru(){return{hostName:Kr.hostname(),homeDirectory:Kr.homedir()}}function zu(e,t,n=Ru()){return t.ok?{ok:!0,data:Bu(e,t.data,n)}:{ok:!1,error:Vu(t.error,n)}}function Bu(e,t,n){if(!t)return t;let{fallbackScreenshotPath:r,...i}=t;if(e!==`open`)return i;for(let e of Iu)delete i[e];let{snapshot:a,initialSnapshotError:o,warnings:s,...c}=i;return{...c,...a===void 0?{}:{snapshot:Bu(`snapshot`,a,n)},...o===void 0?{}:{initialSnapshotError:Vu(o,n)},...s===void 0?{}:{warnings:Hu(s,n)}}}function Vu(e,t){let{logPath:n,diagnosticsRecord:r,...i}=e;return Hu(i,t)}function Hu(e,t){return typeof e==`string`?Uu(e,t):Array.isArray(e)?e.map(e=>Hu(e,t)):typeof e!=`object`||!e?e:Object.fromEntries(Object.entries(e).map(([e,n])=>[e,Hu(n,t)]))}function Uu(e,t){let n=e;if(t.homeDirectory.length>1){let e=t.homeDirectory.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`);n=n.replaceAll(RegExp(`${e}[\\w.@%+~/-]*`,`g`),`<host-path>`)}for(let e of new Set([t.hostName,t.hostName.split(`.`)[0]]))e.length>=4&&(n=n.replaceAll(e,`<host>`));return n.replace(Lu,`<host-path>`)}function Wu(e,t){if(!(t===void 0||!e.hasHeldMacOsAppLease(t)))throw q(`diagnostics`,`A macos-app lease does not serve request diagnostics.`)}const Gu=new Set([`tenantId`,`runId`,`clientId`,`leaseBackend`,`leaseProvider`,`deviceKey`,`ttlMs`,`retainOnClose`]);function Ku(e){return qu(e)||Ll(e)}function qu(e){let t=Xu(e.req);return t?(Ju(t,e).catch(t=>{U(e.res,s(t))}),!0):!1}async function Ju(e,t){let{req:n,res:r,registry:i}=t;switch(ql(n,t.expectedToken),e.kind){case`list`:G(r,{ok:!0,leases:i.listActiveLeases().filter(Yu)});return;case`put`:{let t=$u(await Jl(n,`Host lease`));G(r,{ok:!0,lease:i.putHostLease(e.leaseId,t)});return}case`remove`:{let t=ul(e.leaseId),n=i.listActiveLeases().find(e=>e.leaseId===t),a=n?i.releaseLease(Al(n)).released:!1;G(r,{ok:!0,released:a,...n&&a?{lease:n}:{}});return}case`unsupported`:r.statusCode=405,r.setHeader(`allow`,`GET, PUT, DELETE`),G(r,{ok:!1,error:`Method not allowed`,code:`INVALID_ARGS`});return}}function Yu(e){return e.backend===`macos-app`}function Xu(e){let t=URL.parse(e.url??`/`,`http://127.0.0.1`)?.pathname??``;return t===`/admin/leases`?e.method===`GET`?{kind:`list`}:{kind:`unsupported`}:t.startsWith(`/admin/leases/`)?Zu(t.slice(14),e.method):null}function Zu(e,t){let n=Qu[t??``];return!n||!e||e.includes(`/`)?{kind:`unsupported`}:{kind:n,leaseId:e}}const Qu={PUT:`put`,DELETE:`remove`};function $u(e){let t=ed(e);return yu(rd(t,`deviceKey`)),{tenantId:rd(t,`tenantId`)??``,runId:rd(t,`runId`)??``,clientId:rd(t,`clientId`),leaseBackend:`macos-app`,leaseProvider:rd(t,`leaseProvider`),deviceKey:rd(t,`deviceKey`),ttlMs:td(t),retainOnClose:nd(t)}}function ed(e){if(typeof e!=`object`||!e||Array.isArray(e))throw new a(`INVALID_ARGS`,`Host lease request body must be a JSON object.`);let t=e,n=Object.keys(t).filter(e=>!Gu.has(e));if(n.length>0)throw new a(`INVALID_ARGS`,`Unknown host lease field(s): ${n.join(`, `)}.`);if(t.leaseBackend!==`macos-app`)throw new a(`INVALID_ARGS`,`The host lease route allocates only macos-app leases.`);return t}function td(e){if(e.ttlMs===void 0||Number.isInteger(e.ttlMs))return e.ttlMs;throw new a(`INVALID_ARGS`,`Host lease ttlMs must be an integer.`)}function nd(e){if(e.retainOnClose===void 0)return!0;if(typeof e.retainOnClose==`boolean`)return e.retainOnClose;throw new a(`INVALID_ARGS`,`Host lease retainOnClose must be a boolean.`)}function rd(e,t){let n=e[t];if(n!==void 0){if(typeof n!=`string`)throw new a(`INVALID_ARGS`,`Host lease ${t} must be a string.`);return n}}function id(e){let{hookConfigured:t,hookAttestedTenant:n,clientDeclaredTenant:r}=e;return n?{trusted:!0,tenantId:n,attested:!0}:t?{trusted:!1}:{trusted:!0,tenantId:r,attested:!1}}function ad(){return s(new a(`UNAUTHORIZED`,`Request tenant is not attested by the auth hook`))}function od(e,t,n,r){return{jsonrpc:`2.0`,id:e,error:{code:t,message:n,data:r}}}function sd(e,t,n=200){e.statusCode=n,e.setHeader(`content-type`,`application/json`),e.end(JSON.stringify(t))}function cd(e,t){e.destroyed||e.writableEnded||e.write(on(t))}function ld(e,t){e.destroyed||(e.write(mn(t)),e.end())}function ud(e){return e===`INVALID_ARGS`?-32602:-32e3}function dd(e){return e.code===`DEVICE_IN_USE`&&e.details?.reason===`human_control_active`?423:ps(e.code)}function fd(e,t,n){if(n!==void 0&&n!==`public-only`)throw new a(`INVALID_ARGS`,`Invalid daemon HTTP network access marker`);if(!t&&n===void 0)return e;let r=e.meta?.installSource,i=e.meta?.uploadedArtifactId;if(r?.kind===`path`&&!(typeof i==`string`&&i.length>0))throw new a(`INVALID_ARGS`,`Invalid params: path install sources are disabled on the remote HTTP surface`);let{developerDir:o,providerCredentialFingerprint:s,...c}=e.meta??{};return{...e,...e.meta?{meta:c}:{},internal:{...e.internal,publicNetworkOnly:!0}}}async function pd(e,t){if(!e)return{ok:!0};let n=await e(t);if(n===void 0||n===!0)return{ok:!0};let r=(e,n,r)=>{let i=s(r);return{ok:!1,statusCode:e,response:od(t.rpcRequest.id??null,n,i.message,i)}};if(n===!1||n.ok===!1){let e=n===!1?{}:n;return r(401,-32001,new a(p(e.code,`UNAUTHORIZED`),e.message??`Request rejected by auth hook`,e.details))}if(typeof n.tenantId==`string`&&n.tenantId.length>0){let e=al(n.tenantId);return e?{ok:!0,tenantId:e}:r(500,-32e3,new a(`INVALID_ARGS`,`Auth hook returned invalid tenantId`))}return{ok:!0}}async function md(e=process.env){let t=e.AGENT_DEVICE_HTTP_AUTH_HOOK;if(!t)return null;let n=e.AGENT_DEVICE_HTTP_AUTH_EXPORT||`default`,r=L.isAbsolute(t)?t:L.resolve(t),i;try{i=await import(Yr(r).href)}catch(e){throw new a(`COMMAND_FAILED`,`Failed to load AGENT_DEVICE_HTTP_AUTH_HOOK module`,{hookPath:r,error:e instanceof Error?e.message:String(e)})}let o=i[n];if(typeof o!=`function`)throw new a(`INVALID_ARGS`,`Auth hook export ${n} is not a function`,{hookPath:r,exportName:n});return o}function hd(e,t){let n=typeof t.authorization==`string`?t.authorization:``,r=n.toLowerCase().startsWith(`bearer `)?n.slice(7):void 0,i=typeof t[`x-agent-device-token`]==`string`?t[`x-agent-device-token`]:void 0;return(typeof e.token==`string`?e.token:void 0)??i??r??``}async function gd(e){let{req:t,res:n,authHook:r,expectedToken:i,daemonRequest:a}=e,o=hd({},t.headers),s=al(yd(t.headers,Gt)),c=bd(o,i);if(c)return U(n,c),null;let l=await pd(r,{headers:t.headers,rpcRequest:{jsonrpc:`2.0`,id:null,method:`agent_device.command`},daemonRequest:{token:o,session:`default`,command:a.command,positionals:a.positionals,...s?{meta:{tenantId:s}}:{}}});if(!l.ok)return vd(n,l),null;let u=id({hookConfigured:r!==null,hookAttestedTenant:l.tenantId,clientDeclaredTenant:s});if(!u.trusted)return U(n,ad()),null;let d=u.tenantId;return{tenantId:d,...d?{sessionNamespace:{tenant:d,partitioned:u.attested}}:{}}}async function _d(e){let{leaseRegistry:t,...n}=e,r=await gd(n);if(!r||!t)return r;try{Wu(t,r.tenantId)}catch(e){return U(n.res,s(e)),null}return r}function vd(e,t){e.statusCode=t.statusCode,e.setHeader(`content-type`,`application/json`),e.end(JSON.stringify({ok:!1,error:t.response.error?.data?.message??t.response.error?.message??`Unauthorized`}))}function yd(e,t){let n=e[t];return typeof n==`string`?n:void 0}function bd(e,t){return!t||hn(e,t)?null:s(new a(`UNAUTHORIZED`,`Invalid token`))}const xd=new Set([`agent_device.command`,`agent-device.command`]),Sd=new Set([`agent_device.install_from_source`,`agent-device.install_from_source`]),Cd=new Set([`agent_device.release_materialized_paths`,`agent-device.release_materialized_paths`]),wd={"agent_device.lease.allocate":`lease_allocate`,"agent-device.lease.allocate":`lease_allocate`,"agent_device.lease.heartbeat":`lease_heartbeat`,"agent-device.lease.heartbeat":`lease_heartbeat`,"agent_device.lease.release":`lease_release`,"agent-device.lease.release":`lease_release`},Td=new Set([...xd,...Sd,...Cd,...Object.keys(wd)]);function Ed(e,t){return{token:hd(e,t),session:e.session??`default`,command:e.command??``,positionals:e.positionals??[],input:e.input,flags:e.flags,runtime:e.runtime,meta:e.meta}}function J(e,t){let n=e[t];return typeof n==`string`?n:void 0}function Dd(e,t){let n=e[t];return Number.isInteger(n)?Number(n):void 0}function Od(e,t){let n=e[t];return typeof n==`boolean`?n:void 0}function kd(e,t){let n=typeof e[t]==`string`?e[t].trim():``;if(!n)throw new a(`INVALID_ARGS`,`Invalid params: source.${t} is required for github-actions-artifact sources`);return n}function Ad(e,t){let n=e[t],r=typeof n==`number`?n:typeof n==`string`?Number(n):NaN;if(!Number.isInteger(r))throw new a(`INVALID_ARGS`,`Invalid params: source.${t} must be an integer`);return r}function jd(e){let t=kd(e,`owner`),n=kd(e,`repo`),r=e.artifactId!==void 0,i=e.runId!==void 0,o=e.artifactName!==void 0;if(r&&(i||o))throw new a(`INVALID_ARGS`,`Invalid params: source must specify either artifactId or artifactName, not both`);if(!r&&i&&!o)throw new a(`INVALID_ARGS`,`Invalid params: source.artifactName is required when source.runId is specified`);if(!r&&!o)throw new a(`INVALID_ARGS`,`Invalid params: source must specify artifactId or artifactName`);if(r)return{kind:`github-actions-artifact`,owner:t,repo:n,artifactId:Ad(e,`artifactId`)};let s;return i&&(s=Ad(e,`runId`)),{kind:`github-actions-artifact`,owner:t,repo:n,...i?{runId:s}:{},artifactName:kd(e,`artifactName`)}}function Md(e,t,n){return{token:hd(t,n),session:J(t,`session`)??`default`,command:e,positionals:[],flags:e===`lease_allocate`?ze(t):void 0,meta:{tenantId:J(t,`tenantId`)??J(t,`tenant`),runId:J(t,`runId`),leaseId:J(t,`leaseId`),leaseTtlMs:Dd(t,`ttlMs`),leaseRetainOnClose:Od(t,`retainOnClose`),leaseBackend:J(t,`backend`),leaseProvider:J(t,`leaseProvider`)??J(t,`provider`),deviceKey:J(t,`deviceKey`),clientId:J(t,`clientId`),providerCredentialFingerprint:e===`lease_allocate`?J(t,`providerCredentialFingerprint`):void 0}}}function Nd(e){let t=e.source;if(!t||typeof t!=`object`)throw new a(`INVALID_ARGS`,`Invalid params: source is required`);let n=t;if(n.kind===`url`){let e=typeof n.url==`string`?n.url.trim():``;if(!e)throw new a(`INVALID_ARGS`,`Invalid params: source.url is required for url sources`);let t=n.headers,r={};if(t!==void 0){if(!t||typeof t!=`object`||Array.isArray(t))throw new a(`INVALID_ARGS`,`Invalid params: source.headers must be a string map`);for(let[e,n]of Object.entries(t)){if(typeof n!=`string`)throw new a(`INVALID_ARGS`,`Invalid params: source.headers values must be strings`);r[e]=n}}return Object.keys(r).length>0?{kind:`url`,url:e,headers:r}:{kind:`url`,url:e}}if(n.kind===`path`)throw new a(`INVALID_ARGS`,`Invalid params: source.kind "path" names a file on the daemon host and is not accepted over HTTP`,{hint:`Use a "url" or "github-actions-artifact" source.`});if(n.kind===`github-actions-artifact`)return jd(n);throw new a(`INVALID_ARGS`,`Invalid params: source.kind must be "url" or "github-actions-artifact"`)}function Pd(e,t){let n=J(e,`platform`);if(n!==`ios`&&n!==`android`)throw new a(`INVALID_ARGS`,`Invalid params: platform must be "ios" or "android"`);return{token:hd(e,t),session:J(e,`session`)??`default`,command:`install_source`,positionals:[],flags:{platform:n},meta:{requestId:J(e,`requestId`),installSource:Nd(e),retainMaterializedPaths:Od(e,`retainPaths`),materializedPathRetentionMs:Dd(e,`retentionMs`)}}}function Fd(e,t){let n=J(e,`materializationId`)?.trim();if(!n)throw new a(`INVALID_ARGS`,`Invalid params: materializationId is required`);return{token:hd(e,t),session:J(e,`session`)??`default`,command:`release_materialized_paths`,positionals:[],meta:{requestId:J(e,`requestId`),materializationId:n}}}function Id(e){let t=e.indexOf(`: `);if(t===-1||!e.startsWith(`$`))return e;let n=e.slice(0,t).replace(/^\$\.?/,``),r=e.slice(t+2);return n?`${n}: ${r}`:r}function Ld(e){try{return c.parse(e)}catch(e){let t=e instanceof Error?Id(e.message):`invalid command params`;throw new a(`INVALID_ARGS`,`Invalid params: ${t}`)}}function Rd(e,t,n){if(xd.has(e))return Ed(Ld(t),n);if(Sd.has(e))return Pd(t,n);if(Cd.has(e))return Fd(t,n);let r=wd[e];if(r)return Md(r,t,n);throw new a(`INVALID_ARGS`,`Method not found: ${e}`)}function zd(e){return xd.has(e)}function Bd(e,t,n,r){let i=e.headers[Jt];return typeof i!=`string`||!i||i===r?!1:(t.statusCode=409,t.setHeader(`content-type`,`application/json`),t.setHeader(qt,`true`),t.end(JSON.stringify(Yt(n,`Daemon instance changed`,s(new a(`COMMAND_FAILED`,`Daemon instance changed`,{reason:`remote_instance_mismatch`}))))),!0)}async function Vd(e){let t=Gr(),n=await Pt(),r=_.filter(e=>e!==`macos-app`||process.platform===`darwin`),i=await md(e.env??process.env),{handleRequest:a,token:o,retainArtifacts:s=!1,resolveRequestDiagnosticsPath:c}=e;return Xr.createServer((l,u)=>{if(l.method===`GET`&&l.url===`/health`){u.statusCode=200,u.setHeader(`content-type`,`application/json`),u.end(JSON.stringify(Xt(`agent-device-daemon`,vn(),{instanceId:t,hostArch:n,leaseBackends:r})));return}if(!(o&&e.leaseRegistry&&Ku({req:l,res:u,expectedToken:o,registry:e.leaseRegistry}))&&!wc({req:l,res:u,token:hd({},l.headers),authorize:async e=>await gd({req:e.req,res:e.res,authHook:i,expectedToken:o,daemonRequest:e.daemonRequest})})&&!Uc({req:l,res:u,retainArtifacts:s,authorize:async e=>await gd({req:e.req,res:e.res,authHook:i,expectedToken:o,daemonRequest:e.daemonRequest})})&&!(c&&el({req:l,res:u,resolveRecordPath:c,authorize:async t=>await _d({...t,authHook:i,expectedToken:o,leaseRegistry:e.leaseRegistry})}))){if(l.method!==`POST`||l.url!==`/rpc`){u.statusCode=404,u.end(`Not found`);return}Hd(l,u,e=>{Ud({req:l,res:u,body:e,authHook:i,expectedToken:o,instanceId:t,handleRequest:a})})}})}function Hd(e,t,n){let r=``;e.setEncoding(`utf8`),e.on(`data`,t=>{r+=t,r.length>1048576&&e.destroy(Error(`request too large`))}),e.on(`error`,()=>{t.headersSent||qd(t,Gd())}),e.on(`end`,()=>{n(r)})}async function Ud(e){let{req:t,res:n,body:r,authHook:i,expectedToken:a,instanceId:o,handleRequest:s}=e,c=Wd(r);if(!c.ok){qd(n,c.refusal);return}let l=Jd({req:t,res:n,rpcId:c.rpcRequest.id});try{let e=await Yd({req:t,res:n,authHook:i,expectedToken:a,instanceId:o,rpcRequest:c.rpcRequest,method:c.method,params:c.params,lifetime:l});if(e.outcome!==`admitted`){e.outcome===`rejected`&&qd(n,e.refusal);return}l.watchForClientDisconnect(),await $d({res:n,rpcRequest:c.rpcRequest,daemonRequest:e.daemonRequest,handleRequest:s,lifetime:l})}catch(e){l.markHandlerCompleted(),ef(n,c.rpcRequest,e)}finally{l.release()}}function Wd(e){let t;try{t=JSON.parse(e)}catch{return{ok:!1,refusal:Gd()}}let n=(e,n,r)=>({ok:!1,refusal:Kd(t.id??null,e,n,r)});return t.jsonrpc!==`2.0`||typeof t.method!=`string`?n(-32600,`Invalid Request`,400):Td.has(t.method)?!t.params||typeof t.params!=`object`?n(-32602,`Invalid params`,400):{ok:!0,rpcRequest:t,method:t.method,params:t.params}:n(-32601,`Method not found: ${t.method}`,404)}function Gd(){return Kd(null,-32700,`Parse error`,400)}function Kd(e,t,n,r,i){return{response:od(e??null,t,n,i),statusCode:r}}function qd(e,t){sd(e,t.response,t.statusCode)}function Jd(e){let{req:t,res:n,rpcId:r}=e,i,a,o=!1,s=!1,c=()=>{o||n.writableFinished||s||(s=!0,Kn(i),M({level:`warn`,phase:`request_client_disconnected`,data:{requestId:i}}))};return{admit(e){return i=Xn(e.meta?.requestId,r),a=Yn(i),{...e,meta:{...e.meta,requestId:i}}},watchForClientDisconnect(){t.on(`aborted`,c),n.on(`close`,c),(t.aborted||n.destroyed)&&c()},markHandlerCompleted(){o=!0},release(){Zn(a)}}}async function Yd(e){let{req:t,res:n,authHook:r,expectedToken:i,instanceId:a,rpcRequest:o,method:s,lifetime:c}=e,l=Rd(s,e.params,t.headers);if(Xd(s,l))return{outcome:`rejected`,refusal:Kd(o.id??null,-32602,`Invalid params: command is required`,400)};let u=c.admit(l),d=u.meta?.tenantId??u.flags?.tenant,f=await pd(r,{headers:t.headers,rpcRequest:o,daemonRequest:u});if(!f.ok)return{outcome:`rejected`,refusal:{response:f.response,statusCode:f.statusCode}};let p=id({hookConfigured:r!==null,hookAttestedTenant:f.tenantId,clientDeclaredTenant:d});if(!p.trusted)return Zd(o,-32001,ad(),401);let m=bd(u.token,i);return m?Zd(o,-32e3,m,401):Bd(t,n,o.id??null,a)?{outcome:`answered`}:{outcome:`admitted`,daemonRequest:Qd(u,p,r,t)}}function Xd(e,t){return zd(e)&&!(typeof t.command==`string`&&t.command.length>0)}function Zd(e,t,n,r){return{outcome:`rejected`,refusal:Kd(e.id??null,t,n.message,r,n)}}function Qd(e,t,n,r){let i={...e,meta:{...e.meta,tenantId:t.tenantId,sessionIsolation:t.attested?`tenant`:e.meta?.sessionIsolation}};return i.flags?.tenant!==void 0&&(i={...i,flags:{...i.flags,tenant:t.tenantId}}),t.attested&&i.flags?.sessionIsolation!==void 0&&(i={...i,flags:{...i.flags,sessionIsolation:`tenant`}}),fd(i,n!==null,r.headers[Zt])}async function $d(e){let{res:t,rpcRequest:n,daemonRequest:r,handleRequest:i,lifetime:a}=e;try{if(!gn(r)){let e=await i(r);a.markHandlerCompleted(),sd(t,tf(n,e),nf(e));return}t.statusCode=200,t.setHeader(`content-type`,`application/x-ndjson`);let e=await Qn(e=>cd(t,e),async()=>await i(r));a.markHandlerCompleted(),ld(t,tf(n,e))}catch(e){a.markHandlerCompleted(),ef(t,n,e)}finally{a.release()}}function ef(e,t,n){let r=s(n),i=od(t.id??null,ud(r.code),r.message,r);if(e.headersSent){ld(e,i);return}sd(e,i,ps(r.code))}function tf(e,t){return t.ok?{jsonrpc:`2.0`,id:e.id??null,result:t}:od(e.id??null,-32e3,t.error.message,t.error)}function nf(e){return e.ok?200:dd(e.error)}function rf(e,t){if(af(e,t.command,t.flags??{}),t.command===`batch`)for(let n of t.flags?.batchSteps??[])af(e,Tt(n.command),{...n.input,...n.flags})}function af(e,t,n){if(df(e,t),t===`close`&&n.shutdown===!0&&cf(e,`device-shutdown`),e.deviceIds)for(let t of[n.udid,n.serial]){let n=typeof t==`string`?t.trim():``;if(!(!n||e.deviceIds.has(n)))throw ff(e,`device`,`Device ${n} is outside this daemon's policy.`,{deviceId:n})}}function of(e,t){return!e.deviceIds||e.deviceIds.has(t.id)}function sf(e,t){if(!of(e,t))throw ff(e,`device`,`Device ${t.id} is outside this daemon's policy.`,{deviceId:t.id})}function cf(e,t){if(e.deniedCapabilities.has(t))throw ff(e,`capability`,`This daemon's policy denies ${t}.`,{capability:t})}function lf(e,t){let n=e.requiredLeaseBackend;if(!(!n||t?.backend===n))throw ff(e,`lease`,`This daemon's policy requires a ${n} lease.`,{leaseBackend:n})}function uf(e,t){if(!t.deviceIds)return e;let n=e=>e.filter(e=>of(t,e)),r=Object.freeze({discover:async(t,r)=>n(await e.localOnly.discover(t,r))}),i=async(t,i)=>{let a=await e.providerFirst.discoverWithSource(t,i),o=n(a.devices);return o.length>0||a.source===`local`?{...a,devices:o}:{devices:await r.discover(t,i),source:`local`}},a=Object.freeze({discover:async(e,t)=>(await i(e,t)).devices,discoverWithSource:i});return Object.freeze({...e,localOnly:r,providerFirst:a})}function df(e,t){let n=e.commands;if(!n)return;let r=rr(t);if(r===void 0)return;let i=n.names.has(r);if(!(n.mode===`allow`?i:!i))throw ff(e,`command`,`This daemon's policy denies the ${r} command.`,{command:r})}function ff(e,t,n,r){return new a(`UNAUTHORIZED`,n,{...r,reason:`DAEMON_POLICY_DENIED`,rule:t,policyDigest:e.digest,retriable:!1,hint:`The daemon operator's policy denies this request; retrying will not help. Use an allowed command and device, or ask the operator to change the policy.`})}let pf={resolve:async()=>{throw new a(`COMMAND_FAILED`,`Interactor resolution is not composed for this process.`,{reason:`interactor-resolution-missing`})}};function mf(e){pf=e}function hf(){return pf}function gf(e){let t=e?.providerSessionId;return typeof t==`string`&&t.trim().length>0?t.trim():void 0}var _f=class{records=new Map;now;retentionMs;constructor(e={}){this.now=e.now??(()=>Date.now()),this.retentionMs=Number.isInteger(e.retentionMs)?Math.max(0,Number(e.retentionMs)):3e5}record(e,t){let n=e.leaseProvider?.trim(),r=t.trim();if(!n||!r)return;this.prune();let i={provider:n,providerSessionId:r,leaseId:e.leaseId,tenantId:e.tenantId};this.records.set(this.key(n,r),i)}markLeaseReleased(e,t=this.now()){let n=e.leaseProvider?.trim();if(!n)return;this.prune();let r=t+this.retentionMs;for(let[t,i]of this.records)i.provider===n&&i.leaseId===e.leaseId&&this.records.set(t,{...i,retainedUntil:r})}resolve(e){let t=e.provider?.trim(),n=e.providerSessionId?.trim(),r=e.tenantId?.trim();if(!t||!n||!r)return;this.prune();let i=this.records.get(this.key(t,n));if(!(!i||i.tenantId!==r))return{...i}}prune(){let e=this.now();for(let[t,n]of this.records)n.retainedUntil!==void 0&&n.retainedUntil<=e&&this.records.delete(t)}key(e,t){return JSON.stringify([e,t])}},vf=class{active=new Map;waiters=new Map;async run(e,t){this.active.set(e,(this.active.get(e)??0)+1);try{return await t()}finally{let t=(this.active.get(e)??1)-1;if(t>0)this.active.set(e,t);else{this.active.delete(e);let t=this.waiters.get(e);this.waiters.delete(e);for(let e of t??[])e()}}}async wait(e,t){if(t?.throwIfAborted(),!this.active.has(e))return;let n=this.waiters.get(e)??new Set,r=()=>{},i=()=>{};try{await new Promise((a,o)=>{r=a,i=()=>o(t?.reason),n.add(r),this.waiters.set(e,n),t?.addEventListener(`abort`,i,{once:!0})})}finally{t?.removeEventListener(`abort`,i),n.delete(r),n.size===0&&this.waiters.get(e)===n&&this.waiters.delete(e)}}},yf=class{entriesByLeaseId=new Map;retain(e,t){let n={wanted:t,released:!1},r=this.entriesByLeaseId.get(e)??new Set;return r.add(n),this.entriesByLeaseId.set(e,r),{leaseId:e,release:()=>this.releasePass(e,r,n)}}forget(e){let t=this.entriesByLeaseId.get(e);if(t){for(let e of t)e.released=!0;this.entriesByLeaseId.delete(e)}}isDeferred(e){let t=this.entriesByLeaseId.get(e);if(!t)return!1;for(let e of t)e.wanted()||t.delete(e);return t.size>0||(this.entriesByLeaseId.delete(e),!1)}releasePass(e,t,n){return!n.released&&(n.released=!0,t.delete(n),t.size===0&&this.entriesByLeaseId.delete(e),n.wanted())}},bf=class{holdsByDevice=new Map;mutations=new vf;inFlightWork=new yf;leases=new Map;runBindings=new Map;deviceBindings=new Map;hostTtlMsByLeaseId=new Map;macOsAppTenantIds=new Set;maxActiveSimulatorLeases;resolveLeaseTtlMs;now;onLeaseExpired;providerSessionOwnership;constructor(e={}){this.maxActiveSimulatorLeases=Number.isInteger(e.maxActiveSimulatorLeases)?Math.max(0,Number(e.maxActiveSimulatorLeases)):0,this.resolveLeaseTtlMs=sl(e),this.now=e.now??(()=>Date.now()),this.onLeaseExpired=e.onLeaseExpired,this.providerSessionOwnership=new _f({now:this.now,retentionMs:e.providerSessionRetentionMs})}allocateLease(e){let t=vl(e);this.cleanupExpiredLeases();let n=this.resolveLeaseTtlMs(t.ttlMs);this.assertHumanControlAdmission(t);let r=this.refreshExistingRunBinding(t,n);if(r)return r;this.assertDeviceAvailable(t),this.enforceCapacity(t.backend);let i=Dl(t,n,this.now());return this.leases.set(i.leaseId,i),this.bindLease(i),{...i}}putHostLease(e,t){let n=ul(e),r=vl(t);this.cleanupExpiredLeases();let i=this.resolveLeaseTtlMs(r.ttlMs),o=this.leases.get(n);if(o){if(!Tl(o,r))throw new a(`INVALID_ARGS`,`Lease id already names a lease with another scope.`,{reason:`LEASE_SCOPE_MISMATCH`});return this.hostTtlMsByLeaseId.set(n,i),this.refreshLease(o,i)}if(this.assertHumanControlAdmission(r),this.assertDeviceAvailable(r),r.backend===`macos-app`&&this.macOsAppTenantIds.add(r.tenantId),this.runBindings.has(El(r)))throw new a(`DEVICE_IN_USE`,`This tenant run already holds a lease for the device.`,{reason:`DEVICE_LEASE_BUSY`});this.enforceCapacity(r.backend);let s={...Dl(r,i,this.now()),leaseId:n};return this.leases.set(s.leaseId,s),this.hostTtlMsByLeaseId.set(n,i),this.bindLease(s),{...s}}refreshExistingRunBinding(e,t){let n=El(e),r=this.runBindings.get(n);if(!r)return;let i=this.leases.get(r);if(!i){this.runBindings.delete(n);return}if(i.clientId===e.clientId)return this.refreshLease(e.retainOnClose?{...i,retainOnClose:!0}:i,t);if(i.deviceKey)throw kl(i);return xl(i,e),this.refreshLease(i,t)}heartbeatLease(e){let t=ul(e.leaseId);this.cleanupExpiredLeases();let n=this.getActiveLease(t);wl(n,e),xl(n,e);let r=e.ttlMs===void 0?Ol(n):this.resolveLeaseTtlMs(e.ttlMs),i=this.hostTtlMsByLeaseId.get(t);return this.refreshLease(n,i===void 0?r:Math.min(r,i))}retainLeaseWork(e,t){let n=this.inFlightWork.retain(e.leaseId,t);return{leaseId:n.leaseId,release:()=>{let t=n.release();return t&&this.refreshProtectedLease(e.leaseId,this.now()),t}}}releaseLease(e){let t=this.getLease(e);return t?(this.leases.delete(t.leaseId),this.unbindLease(t),this.inFlightWork.forget(t.leaseId),{released:!0,lease:t}):{released:!1}}getLease(e){let t=ul(e.leaseId);this.cleanupExpiredLeases();let n=this.leases.get(t);if(n)return wl(n,e),xl(n,e),{...n}}assertLeaseAdmission(e){let t=Sl(e);this.cleanupExpiredLeases(),xl(this.getActiveLease(t.leaseId),t)}hasHeldMacOsAppLease(e){return this.macOsAppTenantIds.has(e)}findActiveLeaseBackend(e){let t=ll(e);if(t)return this.cleanupExpiredLeases(),this.leases.get(t)?.backend}hasRetainedLeases(){let e=this.now();return this.listActiveLeases().some(t=>t.retainOnClose===!0&&t.expiresAt>e)}listActiveLeases(){return this.cleanupExpiredLeases(),Array.from(this.leases.values()).map(e=>({...e}))}recordProviderSession(e,t){this.cleanupExpiredLeases();let n=e.expiresAt<=this.now()?e.expiresAt:void 0;this.providerSessionOwnership.record(e,t),this.leases.has(e.leaseId)||this.providerSessionOwnership.markLeaseReleased(e,n)}resolveProviderSession(e){return this.cleanupExpiredLeases(),this.providerSessionOwnership.resolve(e)}listHumanControlHolds(e){this.cleanupExpiredLeases();let t=e.kind===`lease`?W(this.requireHumanControlLease(e.leaseId)):void 0;return[...this.holdsByDevice.entries()].filter(([e])=>t===void 0||t===e).flatMap(([,e])=>[...e.values()].map(({hold:e})=>Fl(e))).sort((e,t)=>e.id.localeCompare(t.id))}async putHumanControlHold(e,t,n,r){r?.throwIfAborted();let i=Pl(t),o=jl(n);this.cleanupExpiredLeases();let s=this.resolveHumanControlScope(e,o),c=W(s),l=this.findHumanControlHold(i);if(l&&(this.assertHoldAuthority(e,l),W(l.hold.scope)!==c))throw new a(`INVALID_ARGS`,`Release a hold before changing its device scope.`);let u=this.now(),d={...e.kind===`lease`?{ownerLeaseId:e.leaseId}:{},hold:{id:i,scope:s,state:`activating`,...o.reason?{reason:o.reason}:{},createdAt:l?.hold.createdAt??u,updatedAt:u}},f=this.holdsByDevice.get(c)??new Map;return this.holdsByDevice.set(c,f),f.set(i,d),await this.activateHumanControlHold(c,d,o.ttlMs,r)}async activateHumanControlHold(e,t,n,r){let i=this.holdsByDevice.get(e),{id:o}=t.hold;try{if(await this.mutations.wait(e,r),r?.throwIfAborted(),i.get(o)!==t)throw new a(`COMMAND_FAILED`,`Human-control hold changed before activation completed.`,{holdId:o});let s=this.now();return t.hold={...t.hold,state:`active`,updatedAt:s,...n===void 0?{}:{expiresAt:s+n}},this.refreshHeldLease(e,s),Fl(t.hold)}catch(n){throw i.get(o)===t&&this.deleteHumanControlHold(e,o),n}}removeHumanControlHold(e,t){let n=Pl(t);this.cleanupExpiredLeases();let r=this.findHumanControlHold(n);if(!r)return;this.assertHoldAuthority(e,r);let i=W(r.hold.scope);return this.deleteHumanControlHold(i,n),Fl(r.hold)}deleteHumanControlHold(e,t){let n=this.holdsByDevice.get(e);n.delete(t),n.size===0&&(this.holdsByDevice.delete(e),this.refreshHeldLease(e,this.now()))}assertHumanControlAdmission(e){this.expireHumanControlHolds();let t=W(e),n=t===void 0?void 0:this.holdsByDevice.get(t)?.values().next().value;if(n)throw Il(n.hold)}async runDeviceMutation(e,t){if(!e)return await t();this.cleanupExpiredLeases();let n=this.getActiveLease(e.leaseId);this.assertHumanControlAdmission(n);let r=W(n);return r===void 0?await t():await this.mutations.run(r,t)}requireHumanControlLease(e){let t=this.getActiveLease(e);if(!t.deviceKey)throw new a(`UNSUPPORTED_OPERATION`,`Human control requires a device-scoped remote lease.`);return{...t,deviceKey:t.deviceKey}}resolveHumanControlScope(e,t){if(e.kind===`host`){if(!t.scope)throw new a(`INVALID_ARGS`,`Host human control requires a lease device scope.`);return t.scope}if(t.scope)throw new a(`INVALID_ARGS`,`Lease-owner human control uses the admitted lease device; do not supply scope.`);let n=this.requireHumanControlLease(e.leaseId);return{backend:n.backend,leaseProvider:n.leaseProvider,deviceKey:n.deviceKey}}assertHoldAuthority(e,t){if(e.kind===`host`)return;let n=this.requireHumanControlLease(e.leaseId);if(t.ownerLeaseId!==n.leaseId||W(n)!==W(t.hold.scope))throw new a(`UNAUTHORIZED`,`Human-control hold does not belong to the admitted lease.`,{reason:`LEASE_SCOPE_MISMATCH`})}findHumanControlHold(e){for(let t of this.holdsByDevice.values()){let n=t.get(e);if(n)return n}}hasHumanControl(e){let t=W(e);return t!==void 0&&this.holdsByDevice.has(t)}isLeaseProtected(e,t){return e.expiresAt>t||this.hasHumanControl(e)||this.inFlightWork.isDeferred(e.leaseId)}expireHumanControlHolds(){let e=this.now();for(let[t,n]of this.holdsByDevice){let r=0;for(let[t,{hold:i}]of n)i.expiresAt===void 0||i.expiresAt>e||(r=Math.max(r,i.expiresAt),n.delete(t));n.size===0&&(this.holdsByDevice.delete(t),this.refreshHeldLease(t,r))}}refreshHeldLease(e,t){this.refreshProtectedLease(this.deviceBindings.get(e),t)}refreshProtectedLease(e,t){let n=e?this.leases.get(e):void 0;n&&this.refreshLease(n,Ol(n),Math.max(t,n.heartbeatAt))}consumeExpiredLeases(){this.expireHumanControlHolds();let e=this.now(),t=[];for(let n of this.leases.values()){if(this.isLeaseProtected(n,e))continue;this.leases.delete(n.leaseId),this.unbindLease(n,n.expiresAt);let r={...n};t.push(r),this.onLeaseExpired?.(r)}return t}consumeExpiredLease(e){this.expireHumanControlHolds();let t=ll(e);if(!t)return;let n=this.leases.get(t);if(!n||this.isLeaseProtected(n,this.now()))return;this.leases.delete(n.leaseId),this.unbindLease(n,n.expiresAt);let r={...n};return this.onLeaseExpired?.(r),r}cleanupExpiredLeases(){this.consumeExpiredLeases()}enforceCapacity(e){if(e!==`ios-simulator`||this.maxActiveSimulatorLeases<=0)return;let t=Array.from(this.leases.values()).filter(e=>e.backend===`ios-simulator`).length;if(!(t<this.maxActiveSimulatorLeases))throw new a(`DEVICE_IN_USE`,`No simulator lease capacity available`,{reason:`LEASE_CAPACITY_EXCEEDED`,activeLeases:t,maxActiveLeases:this.maxActiveSimulatorLeases,backend:e,hint:`Retry after releasing another simulator lease.`})}getActiveLease(e){let t=this.leases.get(e);if(t)return t;throw new a(`UNAUTHORIZED`,`Lease is not active`,{reason:`LEASE_NOT_FOUND`})}refreshLease(e,t,n=this.now()){let r={...e,heartbeatAt:n,expiresAt:n+t};return this.leases.set(r.leaseId,r),this.bindLease(r),{...r}}bindLease(e){this.runBindings.set(El(e),e.leaseId);let t=W(e);t&&this.deviceBindings.set(t,e.leaseId)}unbindLease(e,t=this.now()){this.hostTtlMsByLeaseId.delete(e.leaseId),this.runBindings.delete(El(e));let n=W(e);n&&this.deviceBindings.delete(n),this.providerSessionOwnership.markLeaseReleased(e,t)}assertDeviceAvailable(e){let t=W({backend:e.backend,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey});if(!t)return;let n=this.deviceBindings.get(t);if(!n)return;let r=this.leases.get(n);if(!r){this.deviceBindings.delete(t);return}throw kl(r)}};function xf(e){return Me(e)}function Sf(e,t){let n=xf(e),r=n.leaseId??t?.leaseId,i=n.tenantId??t?.tenantId,a=n.runId??t?.runId;if(!(!i||!a||!r))return le({tenantId:i,runId:a,leaseId:r,leaseBackend:n.leaseBackend??t?.backend,leaseProvider:n.leaseProvider??t?.leaseProvider,deviceKey:n.deviceKey??t?.deviceKey,clientId:n.clientId??t?.clientId,expiresAt:t?.expiresAt})}function Cf(e,t){let n=xf(e),r=t?.lease??t?.deviceLease??void 0;return le({tenantId:n.tenantId??r?.tenantId,runId:n.runId??r?.runId,leaseId:n.leaseId??r?.leaseId,leaseTtlMs:n.leaseTtlMs,leaseBackend:n.leaseBackend??r?.leaseBackend,leaseProvider:n.leaseProvider??r?.leaseProvider,deviceKey:n.deviceKey??r?.deviceKey,clientId:n.clientId??r?.clientId})}function wf(e){let t=e.meta,n=le({leaseId:Tf(t?.leaseId),clientId:Tf(t?.clientId),tenantId:Tf(t?.tenantId),runId:Tf(t?.runId),leaseProvider:Tf(t?.leaseProvider),deviceKey:Tf(t?.deviceKey)});return Object.keys(n).length>0?n:void 0}function Tf(e){return typeof e==`string`&&e.trim().length>0?e.trim():void 0}function Ef(e){let t=il(e.meta?.sessionIsolation??e.flags?.sessionIsolation),n=e.meta?.tenantId??e.flags?.tenant,r=al(n);if(n&&!r)throw new a(`INVALID_ARGS`,`Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.`);if(t!==`tenant`)return e;if(!r)throw new a(`INVALID_ARGS`,`session isolation mode tenant requires --tenant (or meta.tenantId).`);let i=e.session||`default`;return Zc(r,i)?{...e,meta:{...e.meta,tenantId:r,sessionIsolation:t}}:{...e,session:Xc(r,i),meta:{...e.meta,tenantId:r,sessionIsolation:t}}}function Df(e,t,n,r={}){if(kf(e,t,n,r.daemonPolicy))return;let i=xf(e);Nf(e,i);let o=n?.lease;if(r.daemonPolicy?.requiredLeaseBackend){let i=Cf(e,n).leaseId?Of(e,t,n):void 0;return lf(r.daemonPolicy,i),i}if(!(n===void 0&&!i.leaseId&&jf(e,r.providerAppCatalog))){if(e.command===`human_control`&&!o&&!i.leaseId)throw new a(`UNSUPPORTED_OPERATION`,`Takeover requires an active remote device lease. Local takeover is not supported.`);if(!(e.command!==`human_control`&&!o&&e.meta?.sessionIsolation!==`tenant`&&(!i.leaseId||!i.tenantId&&!i.runId)))return Of(e,t,n)}}function Of(e,t,n){Pf(xf(e),n?.lease);let r=Cf(e,n);t.assertLeaseAdmission(Pe(r));let i=t.heartbeatLease(Pe(r));return Cu(i,e,n),lu(e)&&t.assertHumanControlAdmission(i),i}function kf(e,t,n,r){return $l(e.command)?eu(e.command)?!0:!Af(e,t,n,r):!1}function Af(e,t,n,r){if(r?.requiredLeaseBackend)return!0;let i=Cf(e,n);return i.leaseBackend===`macos-app`||i.leaseId!==void 0&&t.findActiveLeaseBackend(i.leaseId)===`macos-app`}function jf(e,t){let n=fu(e);return n?.kind===`unconditional`||n?.kind===`provider-app-catalog`&&t?.supports(n.provider)===!0}function Mf(e){$l(e.command)||Nf(e,xf(e))}function Nf(e,t){if(e.command!==`open`)return;let n=Le(t);if(n.length!==0)throw new a(`INVALID_ARGS`,`Proxy open requires leaseId, tenantId, runId, clientId, and deviceKey lease metadata.`,{missing:n})}function Pf(e,t){t&&(Ff(`leaseId`,e.leaseId,t.leaseId),Ff(`tenantId`,e.tenantId,t.tenantId),Ff(`runId`,e.runId,t.runId),Ff(`leaseProvider`,e.leaseProvider,t.leaseProvider),Ff(`clientId`,e.clientId,t.clientId),Ff(`deviceKey`,e.deviceKey,t.deviceKey))}function Ff(e,t,n){if(!(!t||!n||t===n))throw new a(`UNAUTHORIZED`,`Lease does not match session owner (${e})`,{reason:`LEASE_SESSION_MISMATCH`,field:e})}async function If(e,t){if(!t.leaseProvider||!e)return!1;try{return await e(t),M({level:`info`,phase:`provider_lease_expired_released`,data:{leaseId:t.leaseId,provider:t.leaseProvider}}),!0}catch(e){return M({level:`error`,phase:`provider_lease_expiry_release_failed`,data:{leaseId:t.leaseId,provider:t.leaseProvider,error:e instanceof Error?e.message:String(e)}}),!1}}async function Lf(e){let t=e.sessionStore.lookup(e.sessionName),n=t?.session,r=n?.lease;return!t||!n||!r||!e.leaseRegistry.consumeExpiredLease(r.leaseId)?!1:(M({level:`info`,phase:`leased_session_expired`,data:{reason:`LEASE_EXPIRED`,leaseId:r.leaseId,session:n.name,deviceKey:r.deviceKey}}),await e.teardownSession(t).catch(e=>{M({level:`debug`,phase:`leased_session_expiry_cleanup_failed`,data:{reason:`LEASE_EXPIRED`,leaseId:r.leaseId,session:n.name,error:e instanceof Error?e.message:String(e)}})}),await ur(n.deviceClaim).catch(e=>{M({level:`warn`,phase:`leased_session_expiry_device_claim_clear_failed`,data:{session:n.name,deviceKey:n.deviceClaim?.deviceKey,error:e instanceof Error?e.message:String(e)}})}),e.sessionStore.retire(t),!0)}function Rf(e){let{sessionName:t,sessionStore:n,leaseRegistry:r}=e,i=n.lookup(t),a=i?.session,o=Df(e.req,r,a,{providerAppCatalog:e.providerAppCatalog,daemonPolicy:e.daemonPolicy});if(!o)return e.req;let s={...e.req,internal:{...e.req.internal,admittedLease:o}};return i&&a?.lease&&n.update(i,e=>({lease:{...e.lease,leaseBackend:o.backend,expiresAt:o.expiresAt}})),s}function zf(e){return Sf(e.req,e.req.internal?.admittedLease)??e.existingLease}async function Bf(e){let t=e.session.lease;if(!t)return;let n=ke({leaseId:t.leaseId,tenantId:t.tenantId,runId:t.runId,leaseBackend:t.leaseBackend,leaseProvider:t.leaseProvider,deviceKey:t.deviceKey,clientId:t.clientId}),r=e.leaseRegistry.getLease(n);if(r?.retainOnClose){M({level:`info`,phase:`session_lease_released`,data:{session:e.session.name,leaseId:t.leaseId,released:!1,retained:!0}});return}let i=r?await e.leaseLifecycleProvider?.release?.(r):void 0,a=gf(i);r&&a&&e.leaseRegistry.recordProviderSession(r,a);let o=e.leaseRegistry.releaseLease(n);return M({level:`info`,phase:`session_lease_released`,data:{session:e.session.name,leaseId:t.leaseId,released:o.released}}),i}const Vf=[`leaseId`,`tenantId`,`runId`,`backend`,`leaseProvider`],Hf=[`createdAt`,`heartbeatAt`,`expiresAt`];function Uf(e){let t=new Map,n=Xf(e.stateDir),r=new Set(n.keys()),i=e.retryDelayMs??1e3,a,o=new Map,s=!1,c=new Map,l=e=>{s&&c.set(e.leaseId,e)},u=()=>{if(!e.stateDir)return Yf(n.size,Error(`daemon state directory is unavailable`)),!1;let t=Qf(e.stateDir);try{if(n.size===0)I.rmSync(t,{force:!0});else{I.mkdirSync(e.stateDir,{recursive:!0,mode:448});let r={version:1,leases:[...n.values()]};Rt({destination:t,contents:`${JSON.stringify(r)}\n`,mode:384}),I.chmodSync(t,384)}r.clear();for(let e of n.keys())r.add(e);return!0}catch(e){return Yf(n.size,e),!1}},d=()=>{a||!Gf(t,e.providerRuntimeIds)&&!Kf(n,e.recoverableProviderIds)||(a=setTimeout(()=>{a=void 0,h()},i),a.unref?.(),M({level:`warn`,phase:`provider_lease_expiry_retry_scheduled`,data:{pendingLiveLeaseCount:t.size,pendingRecoveryLeaseCount:n.size,retryDelayMs:i}}))},f=(e,r)=>{o.set(e,r);let i=()=>{o.get(e)===r&&o.delete(e),t.size===0&&n.size===0&&a?(clearTimeout(a),a=void 0):d()};return r.then(i,i),r},p=n=>{if(!qf(n,e.providerRuntimeIds))return;let r=`live:${n.leaseId}`,i=o.get(r);if(i)return i;let a=(async()=>{await Wf(e.leaseLifecycleProvider,n)&&(t.delete(n.leaseId),l(n))})();return f(r,a)},m=t=>{if(!Jf(t,e.recoverableProviderIds)||!r.has(t.leaseId)&&!u())return;let i=`recovery:${t.leaseId}`,a=o.get(i);if(a)return a;let s=(async()=>{await If(e.recoverExpiredLease,t)&&(n.delete(t.leaseId),l(t),u())})();return f(i,s)},h=async()=>{let e=[...[...t.values()].map(p),...[...n.values()].map(m)].filter(e=>e!==void 0);if(e.length===0){d();return}await Promise.all(e)};return{beginShutdown:()=>{c.clear(),s=!0},release:async r=>{if(r.leaseProvider){if(Jf(r,e.recoverableProviderIds)){n.set(r.leaseId,r),u()?await m(r):d();return}qf(r,e.providerRuntimeIds)&&e.leaseLifecycleProvider?.release&&(t.set(r.leaseId,r),await p(r),t.has(r.leaseId)&&d())}},retryPending:h,drain:async e=>{await Promise.race([h(),Ht(Math.max(0,e))]);let r={pending:[...t.values(),...n.values()],released:[...c.values()]};return s=!1,c.clear(),r},shutdown:()=>{a&&clearTimeout(a),a=void 0}}}async function Wf(e,t){return await If(e?.release?async t=>{await e.release?.(t)}:void 0,t)}function Gf(e,t){return[...e.values()].some(e=>qf(e,t))}function Kf(e,t){return[...e.values()].some(e=>Jf(e,t))}function qf(e,t){return e.leaseProvider!==void 0&&t?.includes(e.leaseProvider)===!0}function Jf(e,t){return e.leaseProvider!==void 0&&t?.includes(e.leaseProvider)===!0}function Yf(e,t){M({level:`error`,phase:`provider_lease_expiry_record_write_failed`,data:{pendingLeaseCount:e,error:t instanceof Error?t.message:String(t)}})}function Xf(e){if(!e)return new Map;let t=Qf(e);try{let e=JSON.parse(I.readFileSync(t,`utf8`));if(e.version!==1||!Array.isArray(e.leases))throw Error(`unsupported expiry release record`);return new Map(e.leases.filter(Zf).map(e=>[e.leaseId,e]))}catch(e){return e.code===`ENOENT`||M({level:`warn`,phase:`provider_lease_expiry_record_read_failed`,data:{error:e instanceof Error?e.message:String(e)}}),new Map}}function Zf(e){if(!e||typeof e!=`object`)return!1;let t=e;return Vf.every(e=>typeof t[e]==`string`)&&Hf.every(e=>typeof t[e]==`number`)}function Qf(e){return L.join(e,`expired-provider-leases.json`)}function $f(e,t){if(t!==`digest`)return e;let n=Array.isArray(e.nodes)?e.nodes:[],r=n.filter(e=>e.hittable===!0&&e.interactionBlocked!==`covered`).slice(0,12).map(e=>({ref:e.ref,label:e.label??e.value??e.identifier})),i=Object.fromEntries([`visibility`,`viewport`,`snapshotQuality`,`targetActivation`,`observation`,`warnings`,`fallbackScreenshotPath`,`artifacts`,`refsGeneration`].filter(t=>e[t]!==void 0).map(t=>[t,e[t]]));return{nodeCount:n.length,refs:r,truncated:e.truncated,...i}}const ep=[`width`,`height`,`logicalWidth`,`logicalHeight`,`pixelDensity`];function tp(e,t){if(t!==`digest`)return e;let n=Array.isArray(e.overlayRefs)?e.overlayRefs:[],r=n.slice(0,12).map(e=>({ref:e.ref,label:e.label}));return{...np(e),overlayCount:n.length,overlayRefs:r,...e.warnings===void 0?{}:{warnings:e.warnings},...e.artifacts===void 0?{}:{artifacts:e.artifacts}}}function np(e){let t={};typeof e.path==`string`&&(t.path=e.path),D(e.displayRotation)&&(t.displayRotation=e.displayRotation);for(let n of ep)typeof e[n]==`number`&&(t[n]=e[n]);return t}const rp=[`role`,`type`,`subrole`,`label`,`value`,`contentDescription`,`identifier`,`enabled`,`selected`,`checked`,`focused`,`heading`,`roleDescription`,`editable`,`password`,`hintShowing`,`placeholder`,`selectionStart`,`selectionEnd`,`hittable`];function ip(e){let t={ref:e.ref};for(let n of rp){let r=e[n];r!==void 0&&(t[n]=r)}return t}function ap(e,t){if(t!==`digest`)return e;let n=e.node;if(!n||typeof n!=`object`)return e;if(typeof e.text==`string`){let{node:t,...n}=e;return n}return{...e,node:ip(n)}}function op(e,t){return t===`digest`?cp(sp(e)):e}function sp(e){let t=e.resolution;if(!t||typeof t!=`object`||Array.isArray(t))return e;let n=t;if(n.kind!==`disambiguated`)return e;let{alternatives:r,...i}=n;return{...e,resolution:i}}function cp(e){let t=e.settle;if(!t||typeof t!=`object`||Array.isArray(t))return e;let{diff:n,tail:r,...i}=t;if(!n||typeof n!=`object`||Array.isArray(n))return e;let a=n,o=a.summary,s=up(a.lines);return{...e,settle:{...i,...s.length>0?{refs:s}:{},...lp(r),diff:{summary:o}}}}function lp(e){return!Array.isArray(e)||e.length===0?{}:{tail:e.slice(0,12)}}function up(e){return Array.isArray(e)?e.flatMap(dp).slice(0,12):[]}function dp(e){let t=pp(e);return t?.kind===`added`?fp(t.ref):[]}function fp(e){return typeof e==`string`&&e.length>0?[{ref:e}]:[]}function pp(e){return e&&typeof e==`object`&&!Array.isArray(e)?e:void 0}const mp=[`headers`,`requestHeaders`,`responseHeaders`,`requestBody`,`responseBody`,`raw`];function hp(e,t){if(t!==`digest`)return e;let n=e.entries;return Array.isArray(n)?{...e,entries:n.map(gp)}:e}function gp(e){let t=pp(e);if(!t)return e;let n={};for(let[e,r]of Object.entries(t))mp.includes(e)||(n[e]=r);return n}const _p={snapshot:$f,screenshot:tp,find:ap,get:ap,press:op,click:op,fill:op,longpress:op,hover:op,network:hp},vp=[`platform`,`target`],yp=[`iosSimulatorDeviceSet`,`androidDeviceAllowlist`];function bp(e){return nt({deviceName:e?.device,udid:e?.udid,serial:e?.serial})}function xp(e){return bp(e)||wp(e,vp)}function Sp(e){return xp(e)||wp(e,yp)}function Cp(e){return typeof e==`string`&&e.trim().length>0}function wp(e,t){return e?t.some(t=>Cp(e[t])):!1}async function Tp(e){let t=await Ep(e.req,e.existingSession);if(t)return{device:t,...e.req.session===void 0?{}:{requestedSession:e.req.session},...e.req.meta?.requestId===void 0?{}:{requestId:e.req.meta.requestId},...e.existingSession?{session:{name:e.existingSession.name,device:e.existingSession.device,...e.existingSession.appBundleId?{appBundleId:e.existingSession.appBundleId}:{},...e.existingSession.appName?{appName:e.existingSession.appName}:{},...e.existingSession.surface?{surface:e.existingSession.surface}:{}}}:{},...e.useDefaultWebProvider?{useDefaultWebProvider:!0}:{}}}async function Ep(e,t){switch(mu(e,{hasExistingSession:!!t,hasExplicitDeviceIdentity:bp(e.flags),hasDeviceSelectionInput:xp(e.flags)})){case`existing-session`:return t?.device;case`explicit-device`:case`sessionless-default-device`:try{return await Dp(e)}catch{return}case`skip`:return}}async function Dp(e){let t=e.command===`open`?Ln(e.positionals?.[0]):void 0;return await Pn(e.flags??{},t)}var Op=class e{#e;constructor(e){this.#e=e}get state(){return this.#e.state}get scope(){return this.#e.scope}get tree(){return this.#e.tree}get generation(){return this.#e.generation}static expire(t){return t.#e.state===`expired`?t:new e({...t.#e,state:`expired`})}};const kp=new Op({state:`active`,scope:`all`,tree:void 0,generation:void 0});function Ap(e){return new Op({state:`active`,...e})}function jp(e){return Op.expire(e)}const Mp=new WeakMap,Np=new WeakSet;function Pp(e){return e.refFrame??kp}function Fp(e){return Pp(e).generation??e.snapshotGeneration}function Ip(e){return Pp(e).tree}function Lp(e){Bp(e),Rp(e),e.refFrame=jp(Pp(e)),e.snapshotScopeSource=void 0}function Rp(e){e.snapshot&&Np.add(e.snapshot)}function zp(e){return Np.has(e)}function Bp(e){let t=Vp(e)+1;return Mp.set(e,t),t}function Vp(e){return Mp.get(e)??0}function Hp(e){Wp(e,`all`)}function Up(e,t){Wp(e,t)}function Wp(e,t){e.refFrame=Ap({scope:t,tree:e.snapshot,generation:e.snapshotGeneration})}function Gp(e){return Pp(e).state}function Kp(e){return Pp(e).scope}function qp(e){let t=e.ref.startsWith(`@`)?e.ref.slice(1):e.ref;return{admission:Jp({session:e.session,refBody:t,mintedGeneration:e.mintedGeneration}),scope:Kp(e.session),currentGeneration:Fp(e.session)}}function Jp(e){let{session:t,refBody:n,mintedGeneration:r}=e;if(Gp(t)===`expired`)return{admitted:!1,reason:`ref_frame_expired`};if(r!==void 0&&r!==Fp(t))return{admitted:!1,reason:`ref_generation_mismatch`};let i=Kp(t);if(i!==`all`){if(r===void 0)return{admitted:!1,reason:`plain_ref_requires_complete_frame`};if(!i.has(n))return{admitted:!1,reason:`ref_not_issued`}}return{admitted:!0}}const Yp=/\bis(?:n(?:'|&apos;|&#39;)?t| not)\s+responding\b/i,Xp=/^close app$/i,Zp=`Wait for Android to recover, close the dialog, restart the app, or reboot the emulator, then retry.`;function Qp(e){if(!e)throw new a(`INTERNAL_ERROR`,`Android observation was not supplied by root runtime composition`);return e}async function $p(e){let{session:t}=e;if(t.device.platform!==`android`||!t.screenRecording||hm(t))return{status:`absent`};let n=Qp(e.observation),r;try{r=await cm(t,n)}catch(e){let n=s(e);return M({level:`warn`,phase:`android_blocking_dialog_inspection_failed`,data:{session:t.name,deviceId:t.device.id,error:e instanceof Error?e.message:String(e)}}),{status:`unknown`,reason:`inspection-failed`,warning:om(n)}}let i=um(r);if(!i?.rect)return{status:`absent`};try{let e=await lm(t,i,n);return e.ok?await fm(t,n)?t.appBundleId&&(await n.openApp(t.device,t.appBundleId),!await pm(t,t.appBundleId,n))?(M({level:`warn`,phase:`android_blocking_dialog_relaunch_unfocused`,data:{session:t.name,deviceId:t.device.id,appBundleId:t.appBundleId}}),{status:`failed`,reason:`relaunch-failed`}):(M({level:`warn`,phase:`android_blocking_dialog_recovered`,data:{session:t.name,deviceId:t.device.id,appBundleId:t.appBundleId,x:e.x,y:e.y}}),{status:`recovered`}):(M({level:`warn`,phase:`android_blocking_dialog_still_present`,data:{session:t.name,deviceId:t.device.id}}),{status:`failed`,reason:`dismiss-failed`}):(M({level:`warn`,phase:`android_blocking_dialog_tap_failed`,data:{session:t.name,deviceId:t.device.id,exitCode:e.exitCode,stdout:e.stdout.trim(),stderr:e.stderr.trim()}}),{status:`failed`,reason:`tap-failed`})}catch(e){return M({level:`warn`,phase:`android_blocking_dialog_recovery_failed`,data:{session:t.name,deviceId:t.device.id,error:e instanceof Error?e.message:String(e)}}),{status:`failed`,reason:`error`}}}async function em(e){let{session:t,command:n}=e;if(t.device.platform!==`android`||hm(t))return{status:`clear`};let r=Qp(e.observation),i=await r.readBlockingDialog(t.device);if(i.status!==`dialog`)return i.status===`unknown`&&M({level:`warn`,phase:`android_blocking_dialog_unobserved`,data:{session:t.name,deviceId:t.device.id,command:n,commandPhase:e.phase}}),{status:`clear`};let a=i.focus;if(nm(t,a)){if(await tm(t,r)){let r=`Recovered Android app ANR before ${n}: closed and relaunched ${t.appBundleId}.`;if(e.phase===`before-command`)return{status:`recovered`,warning:r};throw im({session:t,command:n,focus:a,message:`Android app ANR appeared after ${n}; ${t.appBundleId} was closed and relaunched. Retry the command against the fresh app session.`,hint:`Retry the command. If the ANR returns, inspect app logs or restart the emulator.`})}throw im({session:t,command:n,focus:a,message:`Android app ANR blocked ${n}: ${am(a)}. Automatic recovery failed.`,hint:Zp})}throw im({session:t,command:n,focus:a,message:`Android system dialog is blocking ${n}: ${am(a)}.`,hint:Zp})}async function tm(e,t){try{return await rm(e,t)}catch(t){return M({level:`warn`,phase:`android_app_anr_recovery_failed`,data:{session:e.name,deviceId:e.device.id,appBundleId:e.appBundleId,error:t instanceof Error?t.message:String(t)}}),!1}}function nm(e,t){return!!(e.appBundleId&&t.package===e.appBundleId)}async function rm(e,t){if(!e.appBundleId)return!1;let n=um(await cm(e,t),{requireDialogSignal:!1});if(!n?.rect)return!1;let r=await lm(e,n,t);if(!r.ok)return!1;await t.openApp(e.device,e.appBundleId);let i=await pm(e,e.appBundleId,t,{requireNoBlockingDialog:!0});return i&&M({level:`warn`,phase:`android_app_anr_recovered`,data:{session:e.name,deviceId:e.device.id,appBundleId:e.appBundleId,x:r.x,y:r.y}}),i}function im(e){let{session:t,command:n,focus:r,message:i,hint:o}=e;return new a(`COMMAND_FAILED`,i,{command:n,expectedPackage:t.appBundleId,focusedPackage:r.package,focusedWindow:r.focusedWindow,rawFocus:r.raw,hint:o})}function am(e){return e.package?`${e.focusedWindow} (package ${e.package})`:e.focusedWindow}function om(e){let t=[`Inspection error: ${sm(e.message)}`];return e.hint&&t.push(`Hint: ${sm(e.hint)}`),[`Android blocking-dialog readiness could not be inspected; the command continued.`,...t].join(` `)}function sm(e){let t=e.replaceAll(/\s+/g,` `).trim();return t.length<=240?t:`${t.slice(0,239)}…`}async function cm(e,t){return await t.readSnapshotNodes(e.device)}async function lm(e,t,n){if(!t.rect)return{ok:!1,exitCode:1,stdout:``,stderr:`button has no rect`};let{x:r,y:i}=u(t.rect);Lp(e);let a=await n.tap(e.device,r,i);return a.exitCode===0?{ok:!0,x:r,y:i}:{ok:!1,exitCode:a.exitCode,stdout:a.stdout.trim(),stderr:a.stderr.trim()}}function um(e,t={}){if(!(t.requireDialogSignal!==!1&&!vm(e)))return e.filter(dm).find(e=>_m(e).some(e=>Xp.test(e))&&e.rect)}function dm(e){return!Tn(e)}async function fm(e,t){for(let n=0;n<12;n+=1){if(!vm(await cm(e,t)))return!0;await Ht(500)}return!vm(await cm(e,t))}async function pm(e,t,n,r={}){for(let i=0;i<12;i+=1){if(await mm(e,t,n,r))return!0;await Ht(500)}return await mm(e,t,n,r)}async function mm(e,t,n,r){return await n.readAppFocus(e.device,t,r)}function hm(e){return!!e.lease?.leaseProvider||er(e.device)}function gm(e){return _m(e).join(` `).trim()}function _m(e){let t=[e.label,e.identifier];return typeof e.value==`string`&&e.value.trim().length>0&&t.push(e.value),t.filter(e=>typeof e==`string`&&e.trim().length>0).map(e=>e.trim())}function vm(e){return e.filter(dm).some(e=>{let t=gm(e);return t.length>0&&Yp.test(t)})}function ym(e,t,n=e.snapshot){if(e.device.platform!==`android`)return;let r=bm(e,n),i=r?.comparisonSafe===!0;e.androidSnapshotFreshness={action:t,markedAt:Date.now(),baselineCount:(r??n)?.nodes.length??0,baselineSignatures:i?xr(r?.nodes??[]):void 0,routeComparable:i}}function bm(e,t){if(t?.comparisonSafe===!0)return t;let n=e.lastComparisonSafeSnapshot;return!n||n.comparisonSafe!==!0?t:Date.now()-n.createdAt<=5e3?n:t}function xm(e){if(!e||e.device.platform!==`android`)return;let t=e.androidSnapshotFreshness;if(t){if(Date.now()-t.markedAt>2500){delete e.androidSnapshotFreshness;return}return t}}function Sm(e){!e||e.device.platform!==`android`||delete e.androidSnapshotFreshness}async function Cm(e,t){return Ar({capture:e.capture,classify:n=>Sr({snapshot:n.snapshot,rawNodeCount:n.annotations.analysis?.rawNodeCount},t,{interactiveOnly:e.interactiveOnly,mode:e.androidFreshnessMode}),window:t,retry:{retryBudgetMs:br,delaysMs:kr},onTrustworthyCapture:()=>Sm(e.session)})}function wm(e){let t=new Map,n=[],r=Mn(e);for(let i of e){let e=Fm(i,t,r);e&&n.push(e)}return n}function Tm(e){return e?.comparisonKey??e?.snapshotQuality?.backend}function Em(e,t){return Math.abs(e.x-t.x)<=1&&Math.abs(e.y-t.y)<=1&&Math.abs(e.width-t.width)<=1&&Math.abs(e.height-t.height)<=1}function Dm(e,t){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n+=1){let r=e[n],i=t[n];if(!r||!i||r.key!==i.key||!Em(r,i))return!1}return!0}function Om(e,t){let n=km(e),r=km(t);if(n.size===0||r.size===0)return`ambiguous`;let i=0,a=!1;for(let[e,t]of n){let n=r.get(e);if(!n){a=!0;continue}if(i+=1,!Em(t,n))return`changed`}if(i===0)return`ambiguous`;let o=r.size>i;return a&&o?`changed`:`unchanged`}function km(e){let t=new Map;for(let n of e)!n.identity||!n.discriminating||t.has(n.identity)||t.set(n.identity,n);return t}function Am(e,t){let n=e.filter(e=>e.discriminating),r=t.filter(e=>e.discriminating);if(n.length===0||n.length!==r.length)return!1;let i=new Map(r.map(e=>[e.key,e]));for(let e of n){let t=i.get(e.key);if(!t||!Em(e,t))return!1}return!0}function jm(e,t){let n=new Map(t.filter(e=>e.discriminating).map(e=>[e.key,e])),r=0,i=0,a=0;for(let t of e){if(!t.discriminating)continue;let e=n.get(t.key);if(!e){r+=1;continue}n.delete(t.key),a+=1,Em(t,e)||(i+=1)}return{onlyInBaseline:r,onlyInCurrent:n.size,rectMismatched:i,shared:a}}function Mm(e,t,n){let r=Nm(Pm(e,n)),i=Nm(Pm(t,n));for(let[e,t]of r){let n=i.get(e);if(!n||!Em(t,n))return!0;i.delete(e)}return i.size>0}function Nm(e){let t=new Map,n=new Map;for(let r of e){let e=t.get(r.content)??0;t.set(r.content,e+1),n.set(`${r.content}|#${e}`,r)}return n}function Pm(e,t){return e.filter(e=>e.discriminating&&e.x<t.x+t.width&&t.x<e.x+e.width&&e.y<t.y+t.height&&t.y<e.y+e.height)}function Fm(e,t,n){if(!e.rect||!Bm(e.rect)||Vm(e))return;let r=zm(e);if(!r)return;let i=t.get(r)??0;t.set(r,i+1);let a=Lm(e);return{key:`${r}|#${i}`,...a?{identity:a}:{},content:Im(e,a),x:Math.round(e.rect.x),y:Math.round(e.rect.y),width:Math.round(e.rect.width),height:Math.round(e.rect.height),discriminating:!Rm(e,n)}}function Im(e,t){return t??`${e.type??``}|${e.role??``}`}function Lm(e){let t=[e.identifier,e.label,e.value].map(e=>typeof e==`string`?e.trim():``).join(`|`);if(t.replaceAll(`|`,``))return`${t}|${e.type??``}`}function Rm(e,t){return ot(e)||e.ref!==void 0&&t.has(e.ref)}function zm(e){let t=[e.identifier,e.label,e.value,e.type,e.role,...Oe(e),e.hittable===!0?`hittable`:`not-hittable`].map(e=>typeof e==`string`?e.trim():``).join(`|`);return t.replaceAll(`|`,``)?t:void 0}function Bm(e){return[e.x,e.y,e.width,e.height].every(e=>Number.isFinite(e))&&e.width>0&&e.height>0}function Vm(e){return`${e.label??``} ${e.identifier??``}`.toLowerCase().includes(`scroll bar`)}function Hm(e){let{session:t,command:n,action:r=n,positionals:i,flags:a,androidFreshnessBaseline:o}=e;Er(r)&&ym(t,r,o??t.snapshot),Um(t,r,i,a)}function Um(e,t,n=[],r){if(!eh(e.device)||!$m(t,n,r))return;let i=th(e.device)?wm(e.snapshot?.nodes??[]):void 0;e.postGestureStabilization={action:t,positionals:n,markedAt:Date.now(),...i?.length?{baselineSignature:i,baselineBackend:Tm(e.snapshot)}:{}}}function Wm(e,t){Qe(e.device.platform)&&eh(e.device)&&t!==void 0&&t!==`observable`&&(e.postGestureStabilization={action:`open`,positionals:[],markedAt:Date.now()})}function Gm(e){e?.postGestureStabilization&&(e.postGestureStabilization=void 0)}function Km(e){return!!e?.postGestureStabilization}async function qm(e){if(Xe(e.device)&&e.session&&Km(e.session))return await Jm({...e,session:e.session});let t=xm(e.session);if(t&&e.device.platform===`android`){let n=await Cm(e,t);return{snapshot:n.snapshot,...n.annotations}}}async function Jm(e){return Zm(await Xm({session:e.session,capture:async()=>await Ym(e),readSnapshot:e=>e.snapshot}))}async function Ym(e){let t=xm(e.session);return t&&e.device.platform===`android`?await Cm(e,t):await e.capture()}async function Xm(e){let{session:t,capture:n,readSnapshot:r}=e,i=t?.postGestureStabilization;if(!t||!eh(t.device)||!i)return{value:e.initial??await n()};try{return await Or({pending:{action:i.action,positionals:i.positionals??[],baselineSignature:i.baselineSignature,baselineBackend:i.baselineBackend},needsBaselineDistrust:th(t.device),initial:e.initial,hooks:{capture:n,readSurface:e=>{let t=r(e);return{signature:wm(t.nodes),backend:Tm(t)}},signaturesStable:Dm,classifyBaselineEvidence:Om,surfacesIdentical:Am,summarizeDivergence:jm}})}finally{Gm(t)}}function Zm(e){let{snapshot:t,annotations:n}=e.value;return e.postGestureOutcome&&(t.postGestureOutcome=e.postGestureOutcome),{snapshot:t,...n}}function Qm(e){if(!e?.postGestureStabilization)return e;let{postGestureStabilization:t,...n}=e;return n}function $m(e,t,n){return n?.postGestureStabilization===!1?!1:n?.postGestureStabilization===!0||e===`swipe`||e===`scroll`||e===`gesture`&&t[0]===`swipe`}function eh(e){return Xe(e)}function th(e){return Qe(e.platform)}function nh(e){if(typeof e.gestureClockOriginAtMs==`number`&&typeof e.gestureClockOriginUptimeMs==`number`&&typeof e.gestureStartUptimeMs==`number`){let t=e.gestureClockOriginAtMs+(e.gestureStartUptimeMs-e.gestureClockOriginUptimeMs);return Math.max(0,t-e.recordingStartedAt)}if(typeof e.runnerStartedAtUptimeMs==`number`&&typeof e.gestureStartUptimeMs==`number`)return Math.max(0,e.gestureStartUptimeMs-e.runnerStartedAtUptimeMs);if(typeof e.gestureStartUptimeMs==`number`&&typeof e.gestureEndUptimeMs==`number`){let t=e.fallbackFinishedAtMs-(e.gestureEndUptimeMs-e.gestureStartUptimeMs);return Math.max(0,t-e.recordingStartedAt)}return Math.max(0,e.fallbackStartedAtMs-e.recordingStartedAt)}function rh(e){return typeof e.gestureStartUptimeMs==`number`&&typeof e.gestureEndUptimeMs==`number`?Math.max(0,e.gestureEndUptimeMs-e.gestureStartUptimeMs):typeof e.reportedDurationMs==`number`?Math.max(0,e.reportedDurationMs):Math.max(0,e.fallbackFinishedAtMs-e.fallbackStartedAtMs)}function ih(e){let t=Math.max(0,e.gestureDurationMs);if(t<600)return nh(e);let n=Math.min(Math.max(t*.15,120),260);return Math.max(0,e.fallbackFinishedAtMs-n-e.recordingStartedAt)}function Y(e){if(typeof e==`number`&&Number.isFinite(e))return e;if(typeof e!=`string`||e.trim().length===0)return;let t=Number(e);return Number.isFinite(t)?t:void 0}function ah(e,t,n){for(let r of[e,...t,n]){let e=Y(r);if(e!==void 0&&e>=1)return Math.floor(e)}return n}function oh(e,t,n,r,i){switch(t.kind){case`pan`:case`fling`:case`rotate`:case`transform`:{let e=uh(t.from),a=uh(t.to);if(!e||!a)return[];let o=(t.kind===`pan`||t.kind===`fling`)&&Y(t.pointerCount)!==2;return[sh(n,e.x,e.y,a.x,a.y,ah(r,[t.durationMs],250),{referenceFrame:i,classifyBackSwipe:o})]}case`pinch`:{let a=uh(t.from),o=Y(t.scale)??Y(e[1]);return!a||o===void 0||o<=0?[]:[{kind:`pinch`,tMs:n,x:a.x,y:a.y,...i,scale:o,durationMs:ah(r,[t.durationMs],280)}]}default:return[]}}function sh(e,t,n,r,i,a,o={}){let{referenceFrame:s,classifyBackSwipe:c=!0}=o,l=c?ch(t,n,r,i,s):`swipe`;return l===`back-swipe`?{kind:l,tMs:e,x:t,y:n,x2:r,y2:i,...s,durationMs:a,edge:lh(t,r,s)}:{kind:l,tMs:e,x:t,y:n,x2:r,y2:i,...s,durationMs:a}}function ch(e,t,n,r,i){if(!i||Math.abs(n-e)<=Math.abs(r-t)*1.25)return`swipe`;let a=i.referenceWidth*.08;return e<=a&&n>e||e>=i.referenceWidth-a&&n<e?`back-swipe`:`swipe`}function lh(e,t,n){if(n){let t=n.referenceWidth*.08;if(e<=t)return`left`;if(e>=n.referenceWidth-t)return`right`}return t>=e?`left`:`right`}function uh(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e,n=Y(t.x),r=Y(t.y);if(n!==void 0&&r!==void 0)return{x:n,y:r}}const dh={referenceWidth:1e3,referenceHeight:1e3};function fh(e,t,n,r,i={},a=Date.now(),o=Date.now()){let s=e.screenRecording?.handle;if(!s)return;let c=s.inspect(),l={...i,...r??{}},u=Y(l.effectiveDurationMs)??Y(l.durationMs),d={recordingStartedAt:c.startedAt,gestureClockOriginAtMs:c.gestureClockOriginAtMs,gestureClockOriginUptimeMs:c.gestureClockOriginUptimeMs,runnerStartedAtUptimeMs:c.runnerStartedAtUptimeMs,gestureStartUptimeMs:Y(l.gestureStartUptimeMs),gestureEndUptimeMs:Y(l.gestureEndUptimeMs),fallbackStartedAtMs:a,fallbackFinishedAtMs:o},f=rh({gestureStartUptimeMs:Y(l.gestureStartUptimeMs),gestureEndUptimeMs:Y(l.gestureEndUptimeMs),reportedDurationMs:u,fallbackStartedAtMs:a,fallbackFinishedAtMs:o}),p=et(e.device)&&Y(l.gestureStartUptimeMs)===void 0&&_h(t,l)?ih({...d,gestureDurationMs:f}):nh(d),m=hh(t,n,l,p,f,Eh(e.snapshot,l));m.length!==0&&(s.appendGestureEvents(m),M({level:`debug`,phase:`record_touch_visualization_event`,data:{session:e.name,command:t,count:m.length,tMs:p,gestureDurationMs:f,kinds:m.map(e=>e.kind)}}))}function ph(e,t,n,r){if(t!==`scroll`)return r;let i=Un(e.snapshot),a={...r??{}},o=Dh(a.direction)??Dh(n[0]);if(!o)return r;let s=Y(a.amount)??Y(n[1]),c=Y(a.pixels),l=Y(a.durationMs)??mh(e),u=kh(a,[]),d=Y(a.referenceWidth),f=Y(a.referenceHeight),p=d!==void 0&&d>0&&f!==void 0&&f>0?{referenceWidth:d,referenceHeight:f}:i??dh;if(u&&(u.x1!==u.x2||u.y1!==u.y2))return{...a,x1:u.x1,y1:u.y1,x2:u.x2,y2:u.y2,contentDirection:o,...s===void 0?{}:{amount:s},...c===void 0?{}:{pixels:c},referenceWidth:p.referenceWidth,referenceHeight:p.referenceHeight,durationMs:l};let m=ae({direction:o,amount:s,pixels:c,referenceWidth:p.referenceWidth,referenceHeight:p.referenceHeight});return{...a,x1:m.x1,y1:m.y1,x2:m.x2,y2:m.y2,contentDirection:o,...s===void 0?{}:{amount:s},...m.pixels===void 0?{}:{pixels:m.pixels},referenceWidth:p.referenceWidth,referenceHeight:p.referenceHeight,durationMs:l}}function mh(e){return e.device.target===`desktop`||e.device.target===`tv`?250:300}function hh(e,t,n,r,i,a){let o=gh[e];return o?.(t,n,r,i,a)??[]}const gh={click:(e,t,n,r,i)=>vh(e,t,n,i),press:(e,t,n,r,i)=>vh(e,t,n,i),"react-native":(e,t,n,r,i)=>e[0]===`dismiss-overlay`?vh(e,t,n,i):[],fill:(e,t,n,r,i)=>yh(e,t,n,i),focus:(e,t,n,r,i)=>yh(e,t,n,i),longpress:bh,scroll:Ch,gesture:oh,swipe:xh};function _h(e,t){switch(e){case`click`:case`fill`:case`focus`:return!0;case`press`:{let e=X(Y(t.count),1)??1,n=t.doubleTap===!0,r=X(Y(t.holdMs),1);return e===1&&!n&&r===void 0}case`react-native`:return t.action===`dismiss-overlay`;default:return!1}}function vh(e,t,n,r){let i=Oh(t,e);if(!i)return[];let{x:a,y:o}=i,s=X(Y(t.count),1)??1,c=X(Y(t.intervalMs),0)??0,l=t.doubleTap===!0,u=X(Y(t.holdMs),1),d=[];for(let e=0;e<s;e+=1){let t=n+e*c;if(u!==void 0&&u>0){d.push(Th(t,a,o,u,r));continue}d.push(wh(t,a,o,r)),l&&d.push(wh(t+90,a,o,r))}return d}function yh(e,t,n,r){let i=Oh(t,e);if(!i)return[];let{x:a,y:o}=i;return[wh(n,a,o,r)]}function bh(e,t,n,r,i){let a=Oh(t,e);if(!a)return[];let{x:o,y:s}=a;return[Th(n,o,s,ah(r,[Y(t.durationMs),Y(e[2])],800),i)]}function xh(e,t,n,r,i){let a=kh(t,e);if(!a)return[];let{x1:o,y1:s,x2:c,y2:l}=a,u=ah(r,[Y(t.effectiveDurationMs),Y(t.durationMs)],250),d=X(Y(t.count),1)??1,f=X(Y(t.pauseMs),0)??0,p=t.pattern===`ping-pong`?`ping-pong`:`one-way`;return Array.from({length:d},(e,t)=>{let{startX:r,startY:a,endX:d,endY:m}=Sh(t,p,o,s,c,l);return sh(n+t*(u+f),r,a,d,m,u,{referenceFrame:i})})}function Sh(e,t,n,r,i,a){return t===`ping-pong`&&e%2==1?{startX:i,startY:a,endX:n,endY:r}:{startX:n,startY:r,endX:i,endY:a}}function Ch(e,t,n,r,i){let a=kh(t,e),o=Dh(t.contentDirection)??Dh(t.direction);if(!a||!o)return[];let{x1:s,y1:c,x2:l,y2:u}=a,d=ah(r,[],250),f=Y(t.amount)??Y(e[1]),p=Y(t.pixels);return[{kind:`scroll`,tMs:n,x:s,y:c,x2:l,y2:u,...i,durationMs:d,contentDirection:o,...f===void 0?{}:{amount:f},...p===void 0?{}:{pixels:p}}]}function wh(e,t,n,r){return{kind:`tap`,tMs:e,x:t,y:n,...r}}function Th(e,t,n,r,i){return{kind:`longpress`,tMs:e,x:t,y:n,...i,durationMs:r}}function Eh(e,t){let n=Y(t.referenceWidth),r=Y(t.referenceHeight);return n!==void 0&&n>0&&r!==void 0&&r>0?{referenceWidth:n,referenceHeight:r}:Un(e)}function Dh(e){if(typeof e!=`string`)return;let t=e.trim().toLowerCase();switch(t){case`up`:case`down`:case`left`:case`right`:return t;default:return}}function X(e,t){if(e===void 0)return;let n=Math.floor(e);return n>=t?n:void 0}function Oh(e,t,n=0){let r=Y(e.x)??Y(t[n]),i=Y(e.y)??Y(t[n+1]);if(r!==void 0&&i!==void 0)return{x:r,y:i}}function kh(e,t){let n=Ah(e.x1,e.x,t[0]),r=Ah(e.y1,e.y,t[1]),i=Ah(e.x2,t[2]),a=Ah(e.y2,t[3]);if(n!==void 0&&r!==void 0&&i!==void 0&&a!==void 0)return{x1:n,y1:r,x2:i,y2:a}}function Ah(...e){return e.map(Y).find(e=>e!==void 0)}var jh=e({dispatchGenericCommand:()=>Mh});async function Mh(e){let{req:t,ref:n,logPath:r,sessionStore:i,contextFromFlags:a}=e,o=i.requireCurrent(n),s=t.command,c=await Rh(o,s,e.androidObservation);if(c.response)return c.response;let l=await Fh({sessionRef:n,req:t,session:o,sessionName:e.sessionName,logPath:r,sessionStore:i,contextFromFlags:a,platformServices:e.platformServices,command:s,flags:t.flags,createCommandSurface:e.createCommandSurface});if(`response`in l)return l.response;let u=await Lh(o,s,e.androidObservation);if(`response`in u)return u.response;let d=t.positionals??[],f=e.recordedRequest??{positionals:d,flags:t.flags??{}},p=Date.now(),m=i.requireCurrent(n),h={...a(t.flags,m.appBundleId,m.trace?.outPath),surface:m.surface};return pu(t)===`may-invalidate`&&Lp(m),await Nh({req:t,ref:n,sessionStore:i,command:s,resolvedPositionals:d,recorded:f,data:await e.executePlatformCommand({session:m,sessionName:e.sessionName,logPath:r,command:s,request:t,positionals:d,out:t.flags?.out,dispatchContext:h}),actionStartedAt:p,readinessWarnings:[c.warning,u.status===`recovered`?u.warning:void 0],observeSettle:l.observe,androidObservation:e.androidObservation})}async function Nh(e){let{req:t,ref:n,sessionStore:r,command:i}=e,a=await Lh(r.requireCurrent(n),i,e.androidObservation,`after-command`);if(`response`in a)return a.response;let o=Ph(e.data,e.readinessWarnings);if(zh({ref:n,sessionStore:r,command:i,resolvedPositionals:e.resolvedPositionals,recorded:e.recorded,data:o,actionStartedAt:e.actionStartedAt,actionFinishedAt:Date.now(),flags:t.flags??{},clientArtifactPaths:t.meta?.clientArtifactPaths}),Hm({session:r.requireCurrent(n),command:i,positionals:e.resolvedPositionals,flags:t.flags}),e.observeSettle){let t=await e.observeSettle();t&&(o={...o??{},settle:t})}return{ok:!0,data:o??{}}}function Ph(e,t){let n=t.filter(e=>typeof e==`string`&&e.length>0);if(n.length===0||e&&typeof e!=`object`)return e;let r=e&&typeof e.warning==`string`&&e.warning.length>0?[e.warning]:[];return{...e??{},warning:[...r,...n].join(` `)}}async function Fh(e){return!wt(e.command)||!Ih(e.flags)?{}:(await import(`../generic-settle.js`)).planGenericSettleObservation(e)}function Ih(e){return e?.settle===!0||e?.settleQuietMs!==void 0}async function Lh(e,t,n,r=`before-command`){if(e.device.platform!==`android`||!cu(t)||er(e.device))return{status:`clear`};try{return await em({session:e,command:t,phase:r,observation:n})}catch(e){return{response:{ok:!1,error:s(e)}}}}async function Rh(e,t,n){if(e.device.platform!==`android`||er(e.device)||!e.screenRecording||t===`record`)return{};let r=await $p({session:e,observation:n});return r.status===`failed`?{response:{ok:!1,error:{code:`COMMAND_FAILED`,message:`Android system dialog blocked the recording session`}}}:r.status===`unknown`?{warning:r.warning}:{}}function zh(e){let{ref:t,sessionStore:n,command:r,resolvedPositionals:i,recorded:a,data:o,actionStartedAt:s,actionFinishedAt:c,flags:l,clientArtifactPaths:u}=e,d=n.requireCurrent(t);fh(d,r,i,ph(d,r,i,o),l,s,c),n.recordAction(t,{command:r,positionals:a.positionals,flags:a.flags,result:Nn({command:r,meta:{clientArtifactPaths:u}},o??{})})}function Bh(e){let t=e.now??Date.now,n=e.undurableCleanupTtlMs??3e5,r=new Map;return Object.freeze({blockUndurableCleanup(e,i){let a=Ke(e);r.set(qe(a),{device:a,reason:i,expiresAt:t()+n})},clearUndurableCleanup(e){r.delete(qe(Ke(e)))},assertStartAllowed(n){let i=qe(Ke(n)),o=r.get(i);if(o){if(t()>o.expiresAt){r.delete(i),e.onUndurableCleanupExpired?.({device:o.device,reason:o.reason});return}throw new a(`COMMAND_FAILED`,`The existing ${e.displayName.toLowerCase()} resource has process-local unconfirmed ownership`,{reason:`cleanup-unconfirmed`,hint:`Do not start a replacement in this daemon process: ${o.reason}`})}}})}function Vh(){return Bh({displayName:`audio probe`})}function Hh(){return Bh({displayName:`perf capture`})}function Uh(){return Bh({displayName:`screen recording`})}const Wh={humanControl:Z({load:()=>import(`../human-control.js`),run:qh}),lease:Z({load:()=>import(`../lease.js`),run:Jh}),session:Z({load:()=>import(`../session2.js`),run:Yh}),snapshot:Z({load:()=>import(`../snapshot3.js`),run:Xh}),reactNative:Z({load:()=>import(`../react-native.js`),run:Zh}),recordTrace:Z({load:()=>import(`../record-trace.js`),run:Qh}),find:Z({load:()=>import(`../interaction.js`),run:$h}),interaction:Z({load:()=>import(`../interaction.js`),run:eg}),generic:Z({load:async()=>jh,run:async()=>null})};async function Gh(e){let t=Zl(e.req.command);return await Wh[t].run(e)}async function Kh(){return await Wh.generic.loadModule()}async function qh({handleHumanControlCommand:e},t){return await e({req:t.req,registry:t.leaseRegistry})}async function Jh({handleLeaseCommands:e},t){return ng(t.req.command,`lease`,await e({req:t.req,sessionName:t.sessionName,sessionStore:t.sessionStore,leaseRegistry:t.leaseRegistry,providerRuntimeIds:t.providerRuntimeIds,providerRuntimeRequiredIds:t.providerRuntimeRequiredIds,providerCredentials:t.providerCredentials,leaseLifecycleProvider:t.leaseLifecycleProvider,cloudArtifactProvider:t.cloudArtifactProvider}))}async function Yh({handleSessionCommands:e},t){return ng(t.req.command,`session`,await e({req:t.req,sessionName:t.sessionName,logPath:t.logPath,sessionStore:t.sessionStore,createCommandSurface:t.createCommandSurface,leaseRegistry:t.leaseRegistry,leaseLifecycleProvider:t.leaseLifecycleProvider,providerAppCatalog:t.providerAppCatalog,invoke:t.invoke,invokeReplayAction:t.invokeReplayAction,androidAdbExecutor:t.providerScope.androidAdbExecutor,bindDevice:t.bindDevice,platformServices:t.platformServices,inspectFacts:t.inspectFacts,bindExactDevice:t.bindExactDevice,reconcileOrphanedDeviceClaim:t.reconcileOrphanedDeviceClaim,appLogAdmissionLedger:t.appLogAdmissionLedger,audioProbeAdmissionLedger:t.audioProbeAdmissionLedger,perfCaptureAdmissionLedger:t.perfCaptureAdmissionLedger,screenRecordingAdmissionLedger:t.screenRecordingAdmissionLedger,hostDiagnostics:t.hostDiagnostics,requestScope:t.requestScope,retainDeviceExecutionLock:t.retainDeviceExecutionLock,throwIfCanceled:t.throwIfCanceled,platformResourceCleanup:t.platformResourceCleanup}))}async function Xh({handleSnapshotCommands:e},t){return ng(t.req.command,`snapshot`,await e({req:t.req,sessionName:t.sessionName,logPath:t.logPath,sessionStore:t.sessionStore,createCommandSurface:t.createCommandSurface,inspectFacts:t.inspectFacts,platformServices:t.platformServices,bindDevice:t.bindDevice,platformResourceCleanup:t.platformResourceCleanup}))}async function Zh({handleReactNativeCommands:e},t){return ng(t.req.command,`react-native`,await e({req:t.req,createCommandSurface:t.createCommandSurface,sessionName:t.sessionName,logPath:t.logPath,sessionStore:t.sessionStore,contextFromFlags:t.contextFromFlags,inspectFacts:t.inspectFacts,platformServices:t.platformServices,bindDevice:t.bindDevice}))}async function Qh({handleRecordTraceCommands:e},t){return ng(t.req.command,`record-trace`,await e({req:t.req,sessionName:t.sessionName,sessionStore:t.sessionStore,logPath:t.logPath,bindDevice:t.bindDevice,platformServices:t.platformServices,bindExactDevice:t.bindExactDevice,admissionLedger:t.screenRecordingAdmissionLedger,requestScope:t.requestScope,retainDeviceExecutionLock:t.retainDeviceExecutionLock,throwIfCanceled:t.throwIfCanceled}))}async function $h({handleFindCommands:e},t){return ng(t.req.command,`find`,await e({req:t.req,sessionName:t.sessionName,logPath:t.logPath,sessionStore:t.sessionStore,createCommandSurface:t.createCommandSurface,invoke:t.invoke,inspectFacts:t.inspectFacts,platformServices:t.platformServices,bindDevice:t.bindDevice}))}async function eg({handleInteractionCommands:e},t){return ng(t.req.command,`interaction`,await e({req:t.req,sessionName:t.sessionName,logPath:t.logPath,sessionStore:t.sessionStore,createCommandSurface:t.createCommandSurface,contextFromFlags:t.contextFromFlags,inspectFacts:t.inspectFacts,platformServices:t.platformServices,bindDevice:t.bindDevice,androidObservation:t.androidObservation}))}function Z(e){let t=tg(e.load);return{loadModule:t,run:async n=>await e.run(await t(),n)}}function tg(e){let t;return()=>(t??=e(),t)}function ng(e,t,n){if(n)return n;throw new a(`UNKNOWN`,`Daemon handler routing mismatch: ${t} handler matched command "${e}" but returned no response.`,{hint:`This is a daemon-internal routing bug in agent-device — please report it.`})}const rg=`activity.launchConsole.launchArgs.clearAppState.verbose.iosXctestrunFile.iosXctestDerivedDataPath.iosXctestEnvDir.snapshotInteractiveOnly.snapshotPreferredBackend.snapshotDepth.snapshotScope.snapshotRaw.snapshotCustomActions.snapshotIncludeHiddenContentHints.count.intervalMs.delayMs.durationMs.holdMs.jitterPx.pixels.until.doubleTap.backMode.pauseMs.pattern`.split(`.`);function ig(e){return Object.fromEntries(rg.map(t=>[t,e?.[t]]))}function ag(e,t,n,r,i,a){return{requestId:i??j().requestId,appBundleId:n,runnerLeaseContext:wf({meta:a}),logPath:e,traceLogPath:r,...ig(t),screenshotCaptureBackend:t?.maestro?.screenshotCaptureBackend,...oe(t),clickButton:Ae(t)}}function og(e){return`${e.device.platform} device "${e.device.name.trim()}" (${e.device.id})`}function sg(e,t,n={}){return e.session.screenRecording?ug(e.address,t):fg(e,t,n)}function cg(e,t,n={}){return g(`DEVICE_IN_USE`,`Device is already in use by session "${e.address}".`,{session:e.address,deviceId:t.id,deviceName:t.name,...n.waitedMs===void 0?{}:{waitedMs:n.waitedMs},hint:sg(e,`device-in-use`,n)})}function lg(e,t,n={}){return g(`DEVICE_IN_USE`,`Device is already in use by workspace session "${e.address}".`,{reason:`WORKSPACE_SESSION_SCOPE_CONFLICT`,session:e.address,deviceId:t.id,deviceName:t.name,...n.waitedMs===void 0?{}:{waitedMs:n.waitedMs},hint:dg(e.address,n)})}function ug(e,t){let n=Cn(e),r=`agent-device close --session ${n}`;return`Recording session "${e}" owns this device. Run ${`agent-device record stop --session ${n}`}; if the session still appears in agent-device session list, run ${r}. ${t===`selector-conflict`?`To keep using this device, rerun the command with --session ${n} and remove conflicting device selectors.`:`To keep using this device, reuse --session ${n} for commands that should attach to the recording session.`} Run agent-device session list to inspect active sessions.`}function dg(e,t){let n=Cn(e);return`${pg(t)}Session "${e}" belongs to another workspace. Run agent-device close --session ${n} to release this device from that workspace, agent-device devices to choose another device. ${mg(t)}Run agent-device session list to inspect active sessions.`}function fg(e,t,n){let r=e.address,i=Cn(r),a=`agent-device close --session ${i}`;return t===`selector-conflict`?`Run agent-device session list to inspect active sessions. To reuse this device, rerun the command with --session ${i} and remove conflicting device selectors. To switch devices, first run ${a}, then open the desired device with a different --session name.`+hg(e,n):`${pg(n)}Run agent-device session list to inspect active sessions. To reuse this device, rerun the command with --session ${i}. To open a new session on this device, first run ${a}. `+`${mg(n)}`.trimEnd()}function pg(e){return e.waitedMs===void 0?``:`Waited ${Math.round(e.waitedMs)}ms for this device and it stayed busy. `}function mg(e){return e.offersDeviceWait&&e.waitedMs===void 0?`To wait for the device to free up, run the same open with --wait <ms>. `:``}function hg(e,t){return t.offersPlatformSession===!0&&e.session.sessionScope?.kind===`cwd`?` Or name the other platform with --platform to open its own session for this workspace.`:``}function gg(e,t){let{address:n,session:r}=e,i=_g(r,t);if(i.length!==0)throw new a(`INVALID_ARGS`,`Session "${n}" is already bound to ${og(r)}, but this request selected ${i.map(vg).join(`, `)}.`,{session:n,conflicts:i.map(vg),hint:sg(e,`selector-conflict`,{offersPlatformSession:i.some(e=>e.key===`platform`)})})}function _g(e,t){if(!t)return[];let n=[],r=e.device,i=t.platform;if(i&&!rt(r,i)&&n.push({key:`platform`,value:t.platform}),t.target&&t.target!==(r.target??`mobile`)&&n.push({key:`target`,value:t.target}),t.udid&&(!et(r)||t.udid!==r.id)&&n.push({key:`udid`,value:t.udid}),t.serial&&(!Ze(r.platform)||t.serial!==r.id)&&n.push({key:`serial`,value:t.serial}),t.device&&!Je(r,t.device)&&n.push({key:`device`,value:t.device}),t.iosSimulatorDeviceSet){let e=t.iosSimulatorDeviceSet.trim(),i=r.simulatorSetPath?.trim();(!et(r)||r.kind!==`simulator`||e!==i)&&n.push({key:`iosSimulatorDeviceSet`,value:t.iosSimulatorDeviceSet})}if(t.androidDeviceAllowlist){let e=vr(t.androidDeviceAllowlist);(r.platform!==`android`||!e.has(r.id))&&n.push({key:`androidDeviceAllowlist`,value:t.androidDeviceAllowlist})}return n}function vg(e){return`${yg(e.key)}=${e.value}`}function yg(e){switch(e){case`iosSimulatorDeviceSet`:return`--ios-simulator-device-set`;case`androidDeviceAllowlist`:return`--android-device-allowlist`;default:return`--${e}`}}const bg=`default`,xg=new Set(tt);function Sg(e,t,n={}){let r=e.session||bg;if(Og(e))return r;let i=Tg(e);return i.kind===`cwd`?Ag(e,t,i.id,n):r}function Cg(e){return e.session||bg}function wg(e){let t=Tg(e);return t.kind===`cwd`?t:void 0}function Tg(e){if(e.meta?.sessionIsolation===`tenant`||e.flags?.sessionIsolation===`tenant`){let t=e.meta?.tenantId;if(!t)throw new a(`INTERNAL_ERROR`,`Tenant-scoped request reached session routing without an admitted tenant id`);return{kind:`tenant`,id:t}}if(Og(e)||(e.session||bg)!==bg)return{kind:`named-local`};let t=Hg(e.meta?.cwd);return t?{kind:`cwd`,id:Vg(t)}:{kind:`global-default`}}function Eg(e,t){let n=e.sessionScope;return n?t.kind===`tenant`?n.kind===`tenant`&&n.id===t.id:n.kind===`tenant`?!1:t.kind!==`cwd`||n.kind===`named-local`||n.kind===`cwd`&&n.id===t.id:!1}function Dg(e,t){let n=wg(e);return!n||t.sessionScope?.kind!==`cwd`?!1:t.sessionScope.id!==n.id}function Og(e){if(e.meta?.sessionExplicit===!0)return!0;let t=e.flags?.session;return typeof t==`string`&&t.trim().length>0}function kg(e,t){return`cwd:${e}:${t}`}function Ag(e,t,n,r){let i=Ig(t,n),a=Lg(e);return a?jg(e,t,n,a,i,r):Fg(n,i,r)}function jg(e,t,n,r,i,a){let o=kg(n,r);if(t.get(o))return o;let s=Pg(e.flags,r),c=i.map(e=>({ref:e,conflicts:_g(e.session,s)})),l=c.filter(e=>e.conflicts.length===0),[u]=l;return u&&l.length===1?u.ref.address:l.length>1?(zg(a,l.map(e=>e.ref)),o):Mg(c)?.address??o}function Mg(e){return e.find(e=>!Ng(e.conflicts))?.ref}function Ng(e){return e.some(e=>e.key===`platform`)}function Pg(e,t){return{...e,platform:t}}function Fg(e,t,n){let[r]=t;return r&&t.length===1?r.address:(zg(n,t),kg(e,bg))}function Ig(e,t){let n=new Set,r=[];for(let i of e.listRefs()){let e=i.session.sessionScope;e?.kind===`cwd`&&e.id===t&&(n.has(i.session)||(n.add(i.session),r.push(i)))}return r}function Lg(e){return Rg(e.flags?.platform)??Rg(e.meta?.lockPlatform)}function Rg(e){if(typeof e!=`string`)return;let t=e.trim().toLowerCase();return xg.has(t)?t:void 0}function zg(e,t){if(t.length>1&&e.attachesToSession===!0)throw Bg(t)}function Bg(e){let t=e.map(e=>e.address),n=e.map(e=>N(e.session.device)),r=n.map(e=>`--platform ${e}`).join(` or `);return new a(`AMBIGUOUS_MATCH`,`This workspace has ${e.length} implicit sessions (${t.join(`, `)}); select one explicitly.`,{sessions:t,platforms:n,hint:`Run agent-device session list to inspect them. Add ${r} to run in that platform's session, or pass --session <address> copied from that list.`})}function Vg(e){return F.createHash(`sha256`).update(e).digest(`hex`).slice(0,16)}function Hg(e){if(!e||e.trim().length===0)return;let t=Ug(e);return Wg(t)??t}function Ug(e){let t=L.resolve(e);try{return I.realpathSync.native(t)}catch{return t}}function Wg(e){let t=e;for(;;){if(I.existsSync(L.join(t,`.git`)))return t;let e=L.dirname(t);if(e===t)return;t=e}}const Gg=new Set([`udid`,`serial`,`device`]);function Kg(e){return Gg.has(e.key)}function qg(e,t){let n=e.meta?.lockPolicy;if(!n)return e;let r={...e.flags??{}},i=su(e.command),o=i?[]:t?_g(t.session,r):$g(r,e.meta?.lockPlatform),s=e.meta?.lockPlatform;if(o.length===0)return Zg(i,t,r,s)&&(r.platform=s),{...e,flags:r};let c=o.filter(Kg);if(n===`strip`&&c.length===0)return Qg(r,o,s,t?.session),{...e,flags:r};throw new a(`INVALID_ARGS`,Yg(e,o,t),{session:t?.address??e.session,conflicts:o.map(vg),...Jg(c,t?.session),hint:Xg(e,t,c)})}function Jg(e,t){return e.length===0?{}:{requestedDevice:Object.fromEntries(e.map(e=>[e.key,e.value])),...t?{boundDevice:{platform:t.device.platform,name:t.device.name,id:t.device.id}}:{}}}function Yg(e,t,n){let r=t.map(vg).join(`, `);if(n)return`Session "${n.address}" is already bound to ${og(n.session)}, but ${e.command} selected ${r}.`;let i=e.meta?.lockPlatform,a=i?` for ${i}`:``;return`${e.command} is using a bound-session lock${a}, but this request selected ${r}.`}function Xg(e,t,n){if(t)return sg(t,`selector-conflict`);let r=e.meta?.lockPlatform,i=e.session?` --session ${Cn(e.session)}`:``,a=r?`Run agent-device open <app>${i} --platform ${r} first if no session is active. `:`Run agent-device open <app>${i} first if no session is active. `;return n.length>0?`Remove ${n.map(vg).join(`, `)} and rerun to use the session-lock device, or drop --session so this command binds to the device you selected. `+a+`Run agent-device session list to inspect active sessions.`:`Remove conflicting device selectors from this command, or use --session-lock strip to let agent-device ignore them. `+a+`Run agent-device session list to inspect active sessions.`}function Zg(e,t,n,r){return!r||t||n.platform!==void 0?!1:!e||!Sp(n)}function Qg(e,t,n,r){if(r){o_(e,t),e.platform=N(r.device);return}o_(e,t),n&&e.platform===void 0&&(e.platform=n)}function $g(e,t){let n=[],r=t;return e.platform!==void 0&&r&&Ye(e.platform,r)&&n.push({key:`platform`,value:e.platform}),r?(e_(n,e,r),n_(n,e,r),n):n}function e_(e,t,n){let r=t.target;r&&t_(r,n)&&e.push({key:`target`,value:r})}function t_(e,t){switch(t){case`android`:case`harmonyos`:case`ios`:return e===`desktop`;case`vega`:return e!==`tv`;case`macos`:case`linux`:case`web`:return e!==`desktop`;case`apple`:return!1;default:return s_(t)}}function n_(e,t,n){for(let r of r_(n,t)){let n=t[r];Cp(n)&&e.push({key:r,value:n})}}function r_(e,t){if(i_(e))return[`udid`,`iosSimulatorDeviceSet`];switch(e){case`vega`:return[`udid`,`iosSimulatorDeviceSet`,`androidDeviceAllowlist`];case`ios`:return[`serial`,`androidDeviceAllowlist`];case`apple`:return a_(t)?[`udid`,`serial`,`androidDeviceAllowlist`,`iosSimulatorDeviceSet`]:[`serial`,`androidDeviceAllowlist`];case`macos`:case`linux`:case`web`:return[`udid`,`serial`,`iosSimulatorDeviceSet`,`androidDeviceAllowlist`];default:return s_(e)}}function i_(e){return e===`android`||e===`harmonyos`}function a_(e){return e.target===`desktop`||e.platform===`macos`}function o_(e,t){for(let n of t)delete e[n.key]}function s_(e){throw Error(`Unhandled lock platform: ${String(e)}`)}async function c_(e){if(e.command!==`replay`||e.flags?.replayFrom!==void 0)return;let t=e.flags?.replayScriptSource;if(t)return d_(async()=>{let n=t.entry,r=Bn(t,n),i=ye(n,e.flags?.replayBackend);return i===`ad`?u_(r,e.flags):await l_(i,r,n,e.flags)})}async function l_(e,t,n,r){let i=await(await import(`../replay-backend-registry.js`).then(e=>e.n)).getReplayBackend(e);return{flags:r??{},options:zn(i.inspectSource(t,n).appTarget,r?.platform)}}function u_(e,t){let n=ci(e,t),r=In(n.actions);if(!r.appTarget)return;let i=Hn(t,n.actions),a=i.platform??n.metadata.platform;return{flags:a&&i.platform===void 0?{...i,platform:a}:i,options:a===`ios`?Wn(r.appTarget):void 0}}async function d_(e){try{return await e()}catch{return}}function f_(e,t){return C_([x_(e),S_(t)])}async function p_(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n);if(i)return{keys:f_(n,i.device.id),deviceId:i.device.id};let a=new Set([x_(n)]),o=await __(t);return o&&a.add(S_(o.id)),{keys:C_(a),deviceId:o?.id}}function m_(e){let{existingRef:t}=e;return{req:qg(e.req,t),existingRef:t}}function h_(e){if(!e.meta?.lockPolicy)return e;try{return qg(e)}catch{return e}}async function g_(e){return e.command===`open`?v_(e):e.command===`replay`?await y_(e):b_(e)}async function __(e){let t=await g_(h_(e));if(t)try{return await Pn(t.flags,t.options)}catch{return}}function v_(e){let t=Ln(e.positionals?.[0]);return t?{flags:e.flags??{},options:t}:void 0}async function y_(e){return await c_(e)??b_(e)}function b_(e){return xp(e.flags)?{flags:e.flags??{},options:{}}:void 0}function x_(e){return`session:${e}`}function S_(e){return`device:${e}`}function C_(e){return Array.from(e).sort((e,t)=>{let n=w_(e)-w_(t);return n===0?e.localeCompare(t):n})}function w_(e){return+!e.startsWith(`session:`)}function T_(e){let t=e.flags??{};if(t.waitMs===void 0)return;let[n]=Se(`waitMs`);if(!n)throw new a(`INTERNAL_ERROR`,`The waitMs option has no flag declaration whose bounds the daemon can enforce.`);return ue(t,`waitMs`,{min:n.min,max:n.max})}function E_(e){let t=e.internal?.openDeviceWait?.waitedMs;return t===void 0?{}:{waitedMs:t}}function D_(e){return{...E_(e),offersDeviceWait:e.command===`open`&&typeof e.flags?.waitMs!=`number`}}function O_(e){let{req:t,budgetMs:n,sessionName:r,sessionStore:i,deviceId:a}=e;if(t.command===`open`&&n!==void 0&&!(a===void 0||i.get(r)))return A_({req:t,sessionName:r,sessionStore:i,deviceId:a,budgetMs:n})}function k_(e,t,n){let r=e.findByDevice(t);if(!(!r||r.address===n))return r}function A_(e){let{req:t,sessionName:n,sessionStore:r,deviceId:i,budgetMs:a}=e,o=Wt.fromTimeoutMs(a),s=()=>k_(r,i,n),c=async()=>{for(;;){let e=s();if(!e||o.isExpired())return;$n({type:`command`,status:`progress`,message:`Waiting for ${e.session.device.name}: held by session "${e.address}" (${Math.round(o.elapsedMs())}ms of the ${Math.round(a)}ms wait budget used)`}),await Ht(Math.min(250,o.remainingMs())),qn(t.meta?.requestId)}};return{waitForDeviceOutsideLocks:c,runWhenDeviceIsUnheld:async e=>{let{acquireLocks:n,task:r}=e;for(;;){let e=await n(async()=>{if(s()){if(!o.isExpired())return{ran:!1};j_(t,o.elapsedMs())}return{ran:!0,outcome:await r()}});if(e.ran)return e.outcome;await c()}}}}function j_(e,t){if(t<=0)return;let n=e.internal??={};n.openDeviceWait={waitedMs:t}}function M_(e){let{locks:t,initialKeys:n}=e,r=new Set(n),i=new Map,a=!1,o=async()=>{let e=[...i.values()];for(let t of e)t.release();await Promise.all(e.map(async e=>await e.completion)),i.clear()};return{run:async e=>{if(a)throw Error(`Request execution locks cannot run the same scope concurrently.`);a=!0;try{return await N_(t,n,e)}finally{try{await o()}finally{a=!1}}},retainDevice:async e=>{if(!a)throw Error(`A device execution lock can only be retained by a running request.`);let n=`device:${e}`;if(r.has(n))return;let o=i.get(n);o||(o=P_(t,n),i.set(n,o)),await o.acquired}}}async function N_(e,t,n){let[r,...i]=t;return r?await wn(e,r,async()=>await N_(e,i,n)):await n()}function P_(e,t){let n=()=>{},r=()=>{},i=new Promise(e=>{n=e}),a=new Promise(e=>{r=e});return{acquired:i,completion:wn(e,t,async()=>{n(),await a}),release:r}}function F_(e,t,n){let r=j();if(!t.ok){M({level:`error`,phase:`request_failed`,data:{code:t.error.code,message:t.error.message}});let e=Ve({force:!0});return{ok:!1,error:s(new a(p(t.error.code),t.error.message,{...t.error.details??{},hint:t.error.hint??(typeof t.error.details?.hint==`string`?t.error.details.hint:void 0),diagnosticId:t.error.diagnosticId,logPath:t.error.logPath,diagnosticsRecord:t.error.diagnosticsRecord,retriable:t.error.retriable??(typeof t.error.details?.retriable==`boolean`?t.error.details.retriable:void 0),supportedOn:t.error.supportedOn??(typeof t.error.details?.supportedOn==`string`?t.error.details.supportedOn:void 0)}),{diagnosticId:r.diagnosticId,logPath:e?.path,diagnosticsRecord:e?.ref})}}return M({level:`info`,phase:`request_success`}),Ve(),{ok:!0,data:I_(e,t.data,n)}}function I_(e,t,n){if(!t)return t;let r=L_(e,t);return r.length===0?t:{...t,artifacts:r.map(t=>{let r=t.path;return{field:t.field,...t.artifactType===void 0?{}:{artifactType:t.artifactType},artifactId:n({artifactPath:r,tenantId:e.meta?.tenantId,artifactType:t.artifactType,fileName:t.fileName,...D(t.displayRotation)?{displayRotation:t.displayRotation}:{}}),fileName:t.fileName,localPath:t.localPath}})}}function L_(e,t){let n=Array.isArray(t.artifacts)?[...t.artifacts]:[];return e.command===`screenshot`&&!(e=>n.some(t=>t?.field===e))(`path`)&&typeof t.path==`string`&&n.push({field:`path`,artifactType:`screenshot`,path:t.path,localPath:e.meta?.clientArtifactPaths?.path,fileName:L.basename(e.meta?.clientArtifactPaths?.path??t.path),...D(t.displayRotation)?{displayRotation:t.displayRotation}:{}}),n.filter(e=>!!(e&&typeof e.field==`string`&&typeof e.path==`string`&&(typeof e.localPath==`string`&&e.localPath.length>0||e.field===`fallbackScreenshotPath`&&e.artifactType===`screenshot`)))}async function R_(e,t,n){let r=e.requireCurrent(t);if(!z_(r))return;let i=r.screenRecording,a=i.handle,o=await n.appleSessionObservation.observeRunnerSession(r.device.id);if(e.resolveCurrent(t)?.screenRecording!==i)return;let s=a.inspect();if(!s.runnerSessionId){o?.alive&&a.setRunnerSessionId(o.sessionId);return}if(!o?.alive){a.invalidate(`iOS runner session exited during recording`);return}o.sessionId!==s.runnerSessionId&&a.invalidate(`iOS runner session restarted during recording`)}function z_(e){let t=e.screenRecording?.handle.inspect();return!t||!et(e.device)?!1:t.backend===`runner AVAssetWriter`&&t.showTouches!==!1}async function B_(e){let{leaseRegistry:t,req:n,task:r}=e,i=n.internal?.admittedLease;if(!i)return await r();let a=n.meta?.requestId,o=t.retainLeaseWork(i,()=>!Jn(a));try{return await(lu(n)?t.runDeviceMutation(i,r):r())}finally{o.release()}}const V_={label:`Materialized paths`,plural:!0,expiredHint:`Materialized paths are released automatically when their TTL expires; re-run the command that materialized them if the paths are still needed.`},H_=new Map;async function U_(e){let t=await R.mkdtemp(L.join(Kr.tmpdir(),`agent-device-materialized-`));try{let n=await J_(e.installablePath,L.join(t,`installable`)),r=e.archivePath?await J_(e.archivePath,L.join(t,`archive`)):void 0,i=F.randomUUID(),a=e.ttlMs??9e5,o=Date.now()+a,s=setTimeout(()=>{K_(i)},a);return H_.set(i,{rootPath:t,installablePath:n,archivePath:r,tenantId:e.tenantId,sessionName:e.sessionName,expiresAt:o,timer:s}),{materializationId:i,installablePath:n,...r?{archivePath:r}:{},expiresAt:new Date(o).toISOString()}}catch(e){throw await R.rm(t,{recursive:!0,force:!0}),e}}async function W_(e,t){await q_(e,gs(H_,e,t,V_))}async function G_(e){let t=Array.from(H_.entries()).filter(([,t])=>t.sessionName===e);await Promise.all(t.map(async([e,t])=>{await q_(e,t)}))}async function K_(e){let t=H_.get(e);if(t)try{await q_(e,t)}catch{}}async function q_(e,t){clearTimeout(t.timer),H_.delete(e),await R.rm(t.rootPath,{recursive:!0,force:!0})}async function J_(e,t){let n=await R.stat(e);await R.mkdir(t,{recursive:!0});let r=L.join(t,L.basename(e));return n.isDirectory()?(await R.cp(e,r,{recursive:!0}),r):(await R.copyFile(e,r),r)}function Y_(e){return e.device.platform===`web`}function X_(e){return e.toArray().filter(e=>e.device.platform===`web`).map(e=>e.name)}async function Z_(e){let t=e.sessionStore.refresh(e.ref);if(!t.session.appLog)return;let{forceCleanupSessionAppLog:n}=await import(`../platform-request-scope.js`).then(e=>e.u);await n({...e,ref:t})}async function Q_(e){let t=Nr(e.sessionStore,e.ref);t.read()&&await dr({binding:t,intent:`disposal`})}async function $_(e,t){await t.stopSnapshotHelper(e.device)}async function ev(e){let{ref:t,sessionStore:n,platformCleanup:r}=e,i=n.resolveCurrent(t)??t.session,a=t.address;await r.closeManagedBrowser({device:i.device,sessionName:a,stateDir:n.resolveDaemonStateDir(),openSessionNames:()=>X_(n)})}async function tv(e){let t=[];for(let{step:n,run:r}of e)try{await r()}catch(e){t.push({step:n,error:e})}return t}function nv(e){if(e.failures.length===0)return;let t=e.failures.map(({step:e})=>e),n=e.failures.map(({step:e,error:t})=>`${e}: ${t instanceof Error?t.message:String(t)}`);return M({level:`error`,phase:e.phase,data:{session:e.sessionName,failedSteps:t,errors:n}}),new a(`COMMAND_FAILED`,`Session cleanup left ${e.failures.length} resource(s) unreleased: ${n.join(`; `)}`,{reason:`session_cleanup_incomplete`,session:e.sessionName,failedSteps:t,hint:`Some session resources failed to release; inspect the session log for per-resource diagnostics. The session was still deleted, so retrying is safe.`})}async function rv(e){let{ref:t,sessionStore:n}=e,r=n.resolveCurrent(t)??t.session,i=t.address;if(!e.platformCleanup)throw new a(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`);let o=e.platformCleanup,s=[{step:`recording`,run:()=>iv({ref:t,sessionStore:n})},...e.appLog===`run`?[{step:`app_log`,run:()=>Z_({ref:t,sessionStore:n})}]:[],{step:`audio_probe`,run:()=>av({ref:t,sessionStore:n})},{step:`perf_capture`,run:()=>Q_({ref:t,sessionStore:n})},{step:`platform_snapshot_helper`,run:()=>$_(r,o)},{step:`web_browser`,run:()=>ev({ref:t,sessionStore:n,platformCleanup:o})}];s.push({step:`materialized_paths`,run:()=>G_(i)});let c=nv({sessionName:i,phase:`session_teardown_cleanup_failed`,failures:await tv(s)});if(c)throw c}async function iv(e){let t=Pr(e.sessionStore,e.ref);t.read()&&await _r({binding:t,intent:`disposal`})}async function av(e){let t=Mr(e.sessionStore,e.ref);t.read()&&await fr({binding:t,intent:`disposal`})}async function ov(e){let{inspectFacts:t,bind:n,session:r,stateDir:i,runtimeHints:a}=e,o={...uv(r,i),...e.daemonShutdown?{daemonShutdown:!0}:{}};if(!dv(r,a)){let e=lt;lv(await t(r.device),e.required,r),await(await n(r.device,e)).operations.finalizeApplicationClose(o);return}let s=gt;lv(await t(r.device),s.required,r);let c=await n(r.device,s);await c.operations.finalizeApplicationClose(o),await c.operations.clearRuntimeHints({appId:r.appBundleId,values:a})}async function sv(e){await ov({...e,bind:e.bindDevice})}async function cv(e){let{gateway:t,scope:n,session:r,stateDir:i,runtimeHints:a}=e,s;try{await ov({inspectFacts:async e=>await t.inspectFacts(e),bind:async(e,r)=>(s??=await t.bind({device:e,intent:{kind:`ordinary`},scope:n}),_t(s,r)),session:r,stateDir:i,runtimeHints:a,...e.daemonLeaving===!1?{}:{daemonShutdown:!0}})}catch(e){try{await s?.[Symbol.asyncDispose]()}catch(t){n.diagnostics.emit({level:`error`,phase:`daemon_lifecycle_binding_cleanup_failed`,data:{session:r.name,error:o(t),operationError:o(e)}})}throw e}await s?.[Symbol.asyncDispose]()}function lv(e,t,n){for(let r of t){let t=e.operations[r];if(!t?.available)throw new a(`UNSUPPORTED_OPERATION`,`Session lifecycle ${r} is not supported on this device.`,{reason:t?.reason,...t?.hint===void 0?{}:{hint:t.hint},deviceId:n.device.id})}}function uv(e,t){return{appBundleId:e.appBundleId,surface:e.surface??`app`,retainRunner:!1,stateDir:t}}function dv(e,t){return e.appBundleId!==void 0&&Fr(t)}function fv(e){return et(e)&&e.kind===`simulator`}function pv(e){return e.platform===`android`&&e.kind===`emulator`}const mv=[`platform`,`metroHost`,`metroPort`,`bundleUrl`,`launchUrl`];function hv(e){return e?[e.metroHost,e.metroPort,e.bundleUrl,e.launchUrl].filter(e=>e!==void 0&&e!==``).length:0}function gv(e){if(!e)return{};let t={};return e.metroHost!==void 0&&(t.metroHost=e.metroHost),e.metroPort!==void 0&&(t.metroPort=String(e.metroPort)),e.bundleUrl!==void 0&&(t.bundleUrl=e.bundleUrl),e.launchUrl!==void 0&&(t.launchUrl=e.launchUrl),t}function _v(e){return Fr(gv(e))}function vv(e,t){if(e!==void 0){if(typeof e!=`string`)throw new a(`INVALID_ARGS`,`Invalid open runtime ${t}: expected string.`);return yn(e)}}function yv(e){if(e!==void 0){if(!Number.isInteger(e)||e<1||e>65535)throw new a(`INVALID_ARGS`,`Invalid runtime metroPort: ${String(e)}. Use an integer between 1 and 65535.`);return e}}function bv(e){if(e!==void 0){if(typeof e!=`number`)throw new a(`INVALID_ARGS`,`Invalid open runtime metroPort: expected integer.`);return yv(e)}}function xv(e,t,n){if(e===void 0)return n;if(!h(e))throw new a(`INVALID_ARGS`,`Invalid open runtime platform: ${String(e)}. Use "ios", "android", or "harmonyos".`);if(n&&e!==n)throw new a(`INVALID_ARGS`,`open runtime targets ${e}, but session "${t}" is bound to ${n}.`);return e}function Sv(e){if(h(e))return e}function Cv(e,t){return{platform:t,metroHost:yn(e?.metroHost),metroPort:yv(e?.metroPort),bundleUrl:yn(e?.bundleUrl),launchUrl:yn(e?.launchUrl)}}function wv(e,t){return{platform:t.platform??e?.platform,metroHost:t.metroHost??e?.metroHost,metroPort:t.metroPort??e?.metroPort,bundleUrl:t.bundleUrl??e?.bundleUrl,launchUrl:t.launchUrl??e?.launchUrl}}function Tv(e){if(pv(e))return`10.0.2.2`;if(fv(e))return`127.0.0.1`}function Ev(e,t){if(!e||yn(e.metroHost)||yn(e.bundleUrl)||e.metroPort===void 0)return e;let n=Tv(t);return n?{...e,metroHost:n}:e}function Dv(e){let{runtime:t,sessionName:n,platform:r}=e;if(t===void 0)return;if(!t||typeof t!=`object`||Array.isArray(t))throw new a(`INVALID_ARGS`,`open runtime must be an object.`);let i=t,o=Object.keys(i).find(e=>!mv.includes(e));if(o)throw new a(`INVALID_ARGS`,`Invalid open runtime field: ${o}. Supported fields are ${mv.join(`, `)}.`);return{platform:xv(i.platform,n,r),metroHost:vv(i.metroHost,`metroHost`),metroPort:bv(i.metroPort),bundleUrl:vv(i.bundleUrl,`bundleUrl`),launchUrl:vv(i.launchUrl,`launchUrl`)}}function Ov(e,t,n){if(n){if(hv(n)===0){e.setRuntimeHints(t,void 0);return}return e.setRuntimeHints(t,n),n}}function kv(e,t,n,r){let i=e.getRuntimeHints(t);if(!i)return;let o=n?N(n):void 0,s=Sv(o)??r;if(i.platform&&n&&!s)throw new a(`INVALID_ARGS`,`Session runtime hints are only supported on iOS, Android, and HarmonyOS sessions, but session "${t}" is bound to ${o}.`);if(i.platform&&s&&i.platform!==s)throw new a(`INVALID_ARGS`,`Session runtime hints target ${i.platform}, but session "${t}" is bound to ${o}. Clear the runtime hints or use a different session.`);return s&&i.platform!==s?{...i,platform:s}:i}function Av(e){let{req:t,sessionStore:n,sessionName:r,device:i}=e,a=i?Sv(N(i)):e.platform,o=n.getRuntimeHints(r),s=Dv({runtime:t.runtime,sessionName:r,platform:a});if(t.runtime===void 0){let e=kv(n,r,i,a);return{runtime:i?Ev(e,i):e,previousRuntime:o,replacedStoredRuntime:!1}}let c=s&&hv(s)>0?s:void 0;return{runtime:i?Ev(c,i):c,previousRuntime:o,replacedStoredRuntime:!0}}function jv(e){return Av(e).runtime}function Mv(e){try{return{ok:!0,data:Av(e)}}catch(e){let t=r(e);return g(t.code,t.message,t.details)}}async function Nv(e){let{previousRuntime:t,clearRuntimeHints:n}=e;if(!Pv(e))return;let r=e.session;r?.appBundleId&&await n({appId:r.appBundleId,values:gv(t)})}function Pv(e){return e.replacedStoredRuntime&&!!e.session?.appBundleId&&_v(e.previousRuntime)&&!_v(e.runtime)}function Fv(e,t,n=`status`){let r=t.claim,i=N(r?{platform:r.device.family,appleOs:r.device.appleOs}:e),a=Qe(e.platform)?`--udid`:`--serial`;return[`agent-device device ${n}`,`--platform ${Cn(i)}`,`${a} ${Cn(e.id)}`,...n===`release`||ar(t.classification)?[`--stale`]:[]].join(` `)}function Iv(e,t){let n=t.claim,r=Fv(e,t,or(t.classification)?`release`:`status`),i=N(n?{platform:n.device.family,appleOs:n.device.appleOs}:e);return new a(`DEVICE_IN_USE`,n?`${i} device ${e.id} is owned by session "${n.session}" in workspace "${n.workspace}".`:`${e.name} has an ownership claim that could not be verified.`,{reason:zv(t.classification),classification:t.classification,deviceKey:t.deviceKey,...n?{owner:{session:n.session,workspace:n.workspace,stateDir:n.stateDir}}:{},recovery:{command:r},hint:or(t.classification)?`The recorded owner can no longer release this device; settle its resources and release the claim with: ${r}`:`Inspect the owner with: ${r}`,retriable:!1})}function Lv(e,t){return Rv(Iv(e,t))}function Rv(e){let{hint:t,retriable:n,...r}=e.details??{};return g(e.code,e.message,r,{hint:t,retriable:n})}function zv(e){switch(e){case`live`:return`DEVICE_CLAIM_LIVE_OWNER`;case`owner-process-dead`:case`owner-daemon-superseded`:return`DEVICE_CLAIM_RECOVERY_PENDING`;case`owner-process-reused`:case`owner-state-dir-gone`:case`unknown`:case`inconsistent`:return`DEVICE_CLAIM_OWNER_UNCERTAIN`}}function Bv(e,t){if(t?.backend===`macos-app`)return`none`;switch(e.kind){case`local-family`:return`ordinary`;case`provider-runtime`:return`none`}}function Vv(e){let t=[];async function n(n){if(e.policy!==`transient-exclusive`)return;let r=await lr({device:n,command:e.command,workspace:e.workspace,stateDir:e.stateDir,reconcileOrphanedDeviceClaim:e.reconcileOrphanedDeviceClaim});if(r.status===`conflict`)throw Iv(n,r.conflict);r.status===`acquired`&&t.push(r.ownership)}return{admit:async(e,t)=>{switch(Bv(t)){case`none`:return;case`ordinary`:return await n(e)}},[Symbol.asyncDispose]:async()=>{for(let n of t.splice(0))try{await ur(n)}catch(t){M({level:`error`,phase:`transient_device_claim_release_failed`,data:{command:e.command,deviceKey:n.deviceKey,error:t instanceof Error?t.message:String(t)}})}}}}const Hv=new WeakMap,Uv=new WeakMap,Wv=async()=>{throw new a(`COMMAND_FAILED`,`Device runtime gateway is not configured for this request scope`,{reason:`runtime-gateway-missing`})};async function Gv(e){let{sessionStore:t,leaseRegistry:n}=e,r=Yv(Ef(e.req)),i=r.command,a=Date.now(),o=nu(i),c=Sg(r,t,{attachesToSession:Ql(i)!==`inventory`}),l=j(),u=t.resolveSessionDir(c),d=nn({sessionDir:u,session:c,requestId:r.meta?.requestId??l.requestId}),f=d.path,p=pn(u);We({session:c,logPath:d.path,logRecord:d.ref}),M({level:`info`,phase:`request_start`,data:{publicSession:r.session,effectiveSession:c,command:r.command,tenant:r.meta?.tenantId,isolation:r.meta?.sessionIsolation,requestLogPath:f,runnerLogPath:p}});let m=Jo(r);m&&t.recordEvent(c,es({req:r}));try{e.daemonPolicy&&rf(e.daemonPolicy,r),Mf(r);let s=r.command===`open`?T_(r):void 0,l=nu(i)?await p_({req:r,sessionName:c,sessionStore:t}):{keys:[],deviceId:void 0},u=O_({req:r,budgetMs:s,sessionName:c,sessionStore:t,deviceId:l.deviceId});await u?.waitForDeviceOutsideLocks();let d=M_({locks:$v(n),initialKeys:l.keys}),h=Ir(r),{claimAdmission:g,runtimeBindings:_}=Kv({command:i,dispatchLedger:h,workspace:r.meta?.cwd??process.cwd(),stateDir:t.resolveDaemonStateDir(),deviceRuntimeGateway:e.deviceRuntimeGateway,platformRequestScope:e.platformRequestScope,daemonPolicy:e.daemonPolicy,claimRecoveryGateway:e.claimRecoveryGateway}),v={req:r,command:i,sessionName:c,requestLogPath:f,runnerLogPath:p,startedAtMs:a,retainDeviceExecutionLock:async e=>await d.retainDevice(e),bindDevice:_?.bindDevice??Wv,inspectFacts:_?.inspectFacts??Wv,bindExactDevice:_?.bindExactDevice??Wv,platformServices:e.platformServices,dispatchLedger:h,throwIfCanceled:()=>qn(r.meta?.requestId),runAdmitted:async i=>{qn(r.meta?.requestId);try{await Lf({sessionName:c,sessionStore:t,leaseRegistry:n,teardownSession:async n=>await qv({ref:n,sessionStore:t,inspectFacts:v.inspectFacts,bindDevice:v.bindDevice,platformCleanup:Jv(e.platformResourceCleanup)})}),r=Rf({req:r,sessionName:c,sessionStore:t,leaseRegistry:n,providerAppCatalog:e.providerAppCatalog,daemonPolicy:e.daemonPolicy}),v.req=r;let a=r.internal?.admittedLease;return a&&await Fu(a),await B_({leaseRegistry:n,req:r,task:i})}finally{o&&!Jn(r.meta?.requestId)&&t.noteSessionActivity(c)}},runLocked:async e=>(qn(r.meta?.requestId),u?await u.runWhenDeviceIsUnheld({acquireLocks:d.run,task:async()=>await v.runAdmitted(e)}):await d.run(async()=>await v.runAdmitted(e))),[Symbol.asyncDispose]:async()=>{try{await _?.[Symbol.asyncDispose]()}finally{await g?.[Symbol.asyncDispose]()}}};return Uv.set(v,e=>(m&&t.recordEvent(c,ts({req:r,response:e,durationMs:Math.max(0,Date.now()-a)})),e)),v}catch(e){throw m&&t.recordEvent(c,ts({req:r,response:{ok:!1,error:s(e,{diagnosticId:j().diagnosticId,logPath:f})},durationMs:Math.max(0,Date.now()-a)})),e}}function Kv(e){let{deviceRuntimeGateway:t,platformRequestScope:n,daemonPolicy:r}=e;if(!t||!n)return{claimAdmission:void 0,runtimeBindings:void 0};let i=Vv({policy:vt(e.command),command:e.command,workspace:e.workspace,stateDir:e.stateDir,reconcileOrphanedDeviceClaim:mr({scope:n,composeGateway:e.claimRecoveryGateway})});return{claimAdmission:i,runtimeBindings:zr({gateway:t,scope:n,dispatchLedger:e.dispatchLedger,admitDeviceClaim:i.admit,admitDevice:r?e=>sf(r,e):void 0})}}async function qv(e){let{ref:t,sessionStore:n,inspectFacts:r,bindDevice:i,platformCleanup:a}=e,o=n.resolveCurrent(t)??t.session,s=t.address,c=gv(n.getRuntimeHints(t.address)),l;try{await rv({appLog:`run`,ref:t,sessionStore:n,platformCleanup:a})}catch(e){l=e}try{await sv({inspectFacts:r,bindDevice:i,session:o,stateDir:n.resolveDaemonStateDir(),runtimeHints:c})}catch(e){if(l!==void 0)M({level:`error`,phase:`expired_session_lifecycle_cleanup_failed`,data:{session:s,error:e instanceof Error?e.message:String(e),primaryError:l instanceof Error?l.message:String(l)}});else throw e}if(l!==void 0)throw l}function Jv(e){if(!e)throw new a(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`);return e}function Yv(e){let t={...e.flags??{}};return kt(e.command,t)?{...e,flags:t}:e}async function Xv(e){let{scope:t,sessionStore:n,trackDownloadableArtifact:r}=e,i=t.runnerLogPath;t.throwIfCanceled();let a=n.lookup(t.sessionName);a&&(await R_(n,a,t.platformServices),t.throwIfCanceled(),n.requireCurrent(a));let o=m_({req:t.req,existingRef:a?n.refresh(a):void 0}),s=o.req,c=o.existingRef,l=c?.session;We({traceLogPath:l?.trace?.outPath}),Uv.set(t,e=>{let i=F_(s,e,r);return Jo(s)&&n.recordEvent(t.sessionName,ts({req:s,response:i,durationMs:Math.max(0,Date.now()-t.startedAtMs)})),i});let u=l?.screenRecording?.handle.inspect().invalidatedReason;if(u&&iu(t.command))return{type:`response`,response:{ok:!1,error:{code:`COMMAND_FAILED`,message:u}}};c&&!s.meta?.lockPolicy&&tu(t.command)&&gg(c,s.flags);let d=(e,t,n)=>Qv(i,e,t,n,s.meta);return{type:`scope`,scope:{req:s,sessionName:t.sessionName,logPath:i,existingSession:l,retainDeviceExecutionLock:t.retainDeviceExecutionLock,bindDevice:t.bindDevice,platformServices:t.platformServices,inspectFacts:t.inspectFacts,bindExactDevice:t.bindExactDevice,dispatchLedger:t.dispatchLedger,throwIfCanceled:t.throwIfCanceled,contextFromFlags:d,handlerContextFromFlags:(e,r,i)=>({...d(e,r,i),surface:(a?n.resolveCurrent(a):n.get(t.sessionName))?.surface})}}}function Zv(e,t){let n=Uv.get(e);return Uv.delete(e),n?n(t):t}function Qv(e,t,n,r,i){let a=j().requestId;return{...ag(e,t,n,r,a,i),requestId:a}}function $v(e){let t=Hv.get(e);return t||(t=new Map,Hv.set(e,t)),t}const ey=`--save-script is supported only by ${ou().join(`, `)}.`;function ty(e){if(e.flags?.saveScript===void 0||au(e.command))return;M({level:`warn`,phase:`save_script_flag_rejected`,data:{command:e.command}});let t=j(),n=Ve({force:!0});return{ok:!1,error:s(new a(`INVALID_ARGS`,ey,{hint:`Arm publication on the session instead: open/close --save-script, replay --save-script, or session save-script to publish an armed recording without closing its session.`}),{diagnosticId:t.diagnosticId,logPath:n?.path,diagnosticsRecord:n?.ref})}}const ny=`AGENT_DEVICE_SESSION_IDLE_TIMEOUT_MS`;function ry(e=process.env){let t=e[ny]?.trim();if(!t)return 0;let n=Number(t);return!Number.isFinite(n)||n<=0?0:Math.max(1,Math.floor(n))}function iy(e){return e.lastActivityAtMs??e.createdAt}function ay(e){return e.deviceClaim!==void 0&&e.lease===void 0&&e.screenRecording===void 0&&e.appLog===void 0&&e.audioProbe===void 0&&e.perfCapture===void 0&&e.trace===void 0}function oy(e,t,n=Date.now()){return t<=0?!1:n-iy(e)>=t}function sy(e,t,n=Date.now()){return ay(e)&&oy(e,t,n)}function cy(e,t){if(!(!ay(e)||t<=0))return iy(e)+t}function ly(e,t){return{owner:e,expiredAtMs:t.expiredAtMs,expiresAt:t.expiredAtMs+36e5,idleExpiryMs:t.idleExpiryMs,...t.deviceKey?{deviceKey:t.deviceKey}:{}}}function uy(e,t,n=Date.now()){let r=Math.max(0,n-t.expiredAtMs);return new a(`SESSION_NOT_FOUND`,`Session "${t.owner}" expired ${dy(r)} ago for idleness (window ${dy(t.idleExpiryMs)}). Run open again to start a new session.`,{reason:`SESSION_IDLE_EXPIRED`,session:e,idleExpiryMs:t.idleExpiryMs,...t.deviceKey?{deviceKey:t.deviceKey}:{},hint:t.deviceKey?`Run open again to claim ${t.deviceKey} and start a new session. Set ${ny}=0 to keep sessions open indefinitely.`:`Run open again to start a new session. Set ${ny}=0 to keep sessions open indefinitely.`})}function dy(e){let t=e/1e3;if(t<90)return`${Math.round(t)}s`;let n=t/60;return n<90?`${Math.round(n)}m`:`${Math.round(n/60)}h`}function fy(e,t,n){let r;for(let[i,a]of e)if(!(!a.device||qe(a.device)!==t)){if(!n(i)){e.delete(i);continue}r??=a}return r}function py(e={}){let t=e.markerExists??I.existsSync,n=Bh({displayName:`app-log`,now:e.now,undurableCleanupTtlMs:e.undurableCleanupTtlMs,onUndurableCleanupExpired:e.onUndurableCleanupExpired}),r=new Map;return Object.freeze({...n,retainLegacyMarkers(e){for(let t of e)t.device&&r.set(t.markerPath,t)},assertStartAllowed(e){let i=qe(Ke(e));if(fy(r,i,t))throw new a(`COMMAND_FAILED`,`A retained legacy app-log marker prevents replacement capture`,{reason:`cleanup-unconfirmed`,hint:`Inspect and remove the retained app-log.pid only after manually confirming its process is gone.`});n.assertStartAllowed(e)}})}function my(e,t){return g(`UNSUPPORTED_OPERATION`,`${e} is not supported on this device`,{reason:t.reason},t.hint?{hint:t.hint}:void 0)}async function hy(e){let t=await _y(e.inspectFacts)(e.device);for(let n of e.required){let r=t.operations[n];if(!r.available)return{type:`response`,response:e.unavailableResponse?e.unavailableResponse(r):my(e.command,r)}}return{type:`admitted`,bind:vy(e.bindDevice)}}async function gy(e){let t=await hy({...e,required:e.use.required});if(t.type===`response`)return t;let n=await t.bind(e.device,e.use);return e.readiness&&await Lr(n,e.platformServices),{type:`runtime`,runtime:n}}async function Q(e,t){let n=await gy(e);if(n.type===`response`)return{ok:!1,response:n.response};let r=n.runtime;return{ok:!0,execute:async({dispatchContext:e})=>await t(r,e)}}function _y(e){if(e)return e;throw new a(`COMMAND_FAILED`,`Device runtime facts inspection is unavailable.`,{reason:`runtime-gateway-missing`})}function vy(e){if(e)return e;throw new a(`COMMAND_FAILED`,`Device runtime binding is unavailable.`,{reason:`runtime-gateway-missing`})}function yy(e){let{flags:t,logPath:n,meta:r,session:i,snapshotScope:a}=e,{appBundleId:o,trace:s,surface:c}=i??{},l=e.context??ag(n??``,t,o,s?.outPath,r?.requestId,r);return{options:{appBundleId:o,...m(t,f),scope:a,includeRects:e.includeRects,surface:c},execution:$(l),...e.signal===void 0?{}:{signal:e.signal}}}function $(e){return{requestId:e.requestId,verbose:e.verbose,logPath:e.logPath,traceLogPath:e.traceLogPath,iosXctestrunFile:e.iosXctestrunFile,iosXctestDerivedDataPath:e.iosXctestDerivedDataPath,iosXctestEnvDir:e.iosXctestEnvDir,runnerLeaseContext:e.runnerLeaseContext}}function by(e){return Tr(e,`focus requires x y`)}function xy(e,t){return{point:e,...t.appBundleId===void 0?{}:{options:{appBundleId:t.appBundleId}},execution:$(t)}}async function Sy(e){let t=by(e.positionals);return await Q({command:`focus`,device:e.device,use:At,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice},(e,n)=>Cy(e,t,n))}async function Cy(e,t,n){return await e.operations.focusPoint(xy(t,n)),{x:t.x,y:t.y,...y(`Focused (${t.x}, ${t.y})`)}}function wy(e){if(e===`down`)return`bottom`;if(e===`up`)return`top`}async function Ty(e){let{edge:t,target:n={},scope:r,captureNodes:i}=e;try{let e=await i(r),{analyzeScrollEdgeState:a}=await import(`../selection.js`),o=a(e,t,n);return r&&o.emptySnapshot?await Ty({edge:t,target:n,captureNodes:i}):o}catch(e){throw Fy(t,r,e)}}async function Ey(e,t,n={}){let{analyzeScrollEdgeState:r}=await import(`../selection.js`);return r(e,t,n)}async function Dy(e,t){return(await Ey(e,t)).canScroll}async function Oy(e,t){let{analyzeScrollEdgeState:n}=await import(`../selection.js`);return n(e,t).fingerprint??``}function ky(e){if(e.length<4)return!1;let t=e.slice(-6);if(new Set(t).size>2)return!1;let n=t.at(-1);return n!==void 0&&t.slice(0,-1).includes(n)}function Ay(e,t,n){t&&(e.push(t),e.length>n&&e.shift())}async function jy(e){let{edge:t,captureState:n,scroll:r,settleAfterPass:i=async()=>{}}=e,o=await n();o.scope&&(o=await n(o.scope));let s=0,c,l=[];for(Ay(l,o.fingerprint,6);o.canScroll;){if(s>=40)throw new a(`COMMAND_FAILED`,`scroll ${t} reached the safety limit before the snapshot showed the edge`,{reason:`scroll_edge_pass_limit`,edge:t,passes:s,hint:`The scoped scroll container still reports hidden content. Run scroll <dir> --until <selector> to stop on the element you are after, or snapshot -i to inspect the current state.`});if(c=await r(),s+=1,await i(),o=await n(o.scope),Ay(l,o.fingerprint,6),o.canScroll&&ky(l))throw Ny(t,s)}return{passes:s,result:c}}function My(e){let{direction:t,edge:n,passes:r,amount:i,pixels:a,honoredPixels:o,movement:s}=e;if(n&&r===0)return`Already at ${n}; no hidden content ${n===`bottom`?`below`:`above`} detected`;if(n)return`Scrolled to ${n} with ${r} ${t} passes`;let c=wy(t);return s===`at-edge`&&c?`Scrolled ${t} and no hidden content ${c===`bottom`?`below`:`above`} was detected`:s===`unchanged`?`Scrolled ${t} and the visible content did not change`:a===void 0?i===void 0?`Scrolled ${t}`:o===void 0?`Scrolled ${t} by ${i}`:`Scrolled ${t} by ${i} of the viewport (${o}px)`:`Scrolled ${t} by ${o??a}px`}function Ny(e,t){let n=`${t} ${t===1?`pass`:`passes`}`;return new a(`COMMAND_FAILED`,`scroll ${e} moved nothing across ${n}: the container still reports hidden content but its contents never shifted`,{reason:`scroll_edge_no_progress`,edge:e,passes:t,hint:Py({targetDirectly:`with scroll <dir> --until <selector>`})})}function Py(e={}){let t=`The scroll is not reaching this container. If a field is focused, dismiss the keyboard first; if it is nested inside another scroller, ${e.targetDirectly===void 0?`target it directly`:`target it directly ${e.targetDirectly}`}.`;return e.rawDrag===!1?t:t+` Some lists ignore synthesized scrolls — a raw drag moves them: swipe x1 y1 x2 y2 started inside the list.`}function Fy(e,t,n){return t?new a(`COMMAND_FAILED`,`Failed to verify scroll ${e} state for scoped container`,{scope:t,hint:`scroll ${e} could not verify the scoped scroll container. Run snapshot -i for the current screen and retry with a visible scroll target.`},n):new a(`COMMAND_FAILED`,`Failed to verify scroll ${e} state`,{hint:`scroll ${e} needs a snapshot showing hidden content ${e===`bottom`?`below`:`above`} before it will move.`},n)}async function Iy(e){let{selector:t,direction:r,platform:i,capture:o,scroll:s}=e,c=e.passLimit??12,l=wy(r),u=0,d,f=[],p=!1;try{for(;;){if((await Ly({captured:await o(),selector:t,direction:r,platform:i,edge:l,passes:u,passLimit:c,recentSignatures:f})).visible)return{passes:u,...d===void 0?{}:{result:d}};p=!0,d=await s(),p=!1,u+=1}}catch(e){throw u===0&&!p&&e instanceof a?n(e,`no`):e}}async function Ly(e){let{captured:t,selector:n,direction:r,platform:i,edge:a,passes:o,passLimit:s,recentSignatures:c}=e,l=By(t);if(l)throw Uy(r,n,l);let u=t.nodes??[];if(await zy(u,n,i))return{visible:!0};if(a&&!await Dy(u,a))throw Vy(r,n,`edge-reached`,o);if(o>=s)throw Vy(r,n,`pass-limit`,o);if(a&&(Ay(c,await Oy(u,a),6),ky(c)))throw Hy(r,n,o);return{visible:!1}}function Ry(e,t,n){return n===0?`${t} was already visible; no ${e} scroll needed`:`Scrolled ${e} ${n} ${n===1?`pass`:`passes`} until ${t} was visible`}async function zy(e,t,n){let r=await Cr(Dr.wait,e,t,{platform:n}),i=r.kind===`target`||r.kind===`ambiguous`?r.matchedNodes:r.kind===`occluded`?[r.node]:[],a=ct(e);return i.some(e=>St({predicate:`visible`,node:e,visibility:a,platform:n}).pass)}function By(e){let t=e.nodes;if(t===void 0)return{reason:`no-capture`,detail:`the capture returned no accessibility tree`};if(t.length===0)return{reason:`no-capture`,detail:`the capture returned an empty accessibility tree`};let n=Ne({backend:e.backend,nodes:t,...e.quality?{snapshotQuality:e.quality}:{}});if(n)return{reason:`sparse-tree`,detail:n.reason??`the capture backend reported a sparse tree`}}function Vy(e,t,n,r){let i=`${r} ${r===1?`pass`:`passes`}`;return n===`edge-reached`?new a(`COMMAND_FAILED`,`scroll ${e} reached the end of the scrollable content after ${i} without ${t} becoming visible`,{reason:`scroll_until_edge_reached`,selector:t,direction:e,passes:r,hint:`The content ends here, so no further ${e} scroll can reveal it. Run snapshot -i to see what is on screen, scroll the opposite direction, or check the selector — the element may be on another screen.`}):new a(`COMMAND_FAILED`,`scroll ${e} spent its ${r}-pass budget without ${t} becoming visible`,{reason:`scroll_until_pass_limit`,selector:t,direction:e,passes:r,hint:`Raise the step with an amount (scroll ${e} 0.8 --until <selector>), or run snapshot -i to confirm the selector matches something on this screen.`})}function Hy(e,t,n){let r=`${n} ${n===1?`pass`:`passes`}`;return new a(`COMMAND_FAILED`,`scroll ${e} --until ${t} moved nothing across ${r}: the on-screen content never shifted`,{reason:`scroll_until_no_progress`,selector:t,direction:e,passes:n,hint:Py()})}function Uy(e,t,n){return new a(`COMMAND_FAILED`,`scroll ${e} --until ${t} could not read the screen: ${n.detail}`,{reason:`scroll_until_capture_unreadable`,selector:t,direction:e,captureRefusal:n.reason,hint:n.reason===`no-capture`?`Run snapshot -i to see whether the app is producing an accessibility tree at all, and retry once it does.`:`The accessibility tree came back sparse, so its refs and selectors are not trustworthy. Run screenshot, inspect the image, and navigate by coordinates until snapshot -i reports a full tree.`})}const Wy={intervalMs:200,budgetMs:1500};function Gy(e){return Xe(e.device)?e.flags?.postGestureStabilization===!1?{kind:`declined`,reason:`caller-declined-observation`}:e.flags?.settle===!0?{kind:`declined`,reason:`settle-observer-owns-outcome`}:qy(e.session):{kind:`declined`,reason:`non-swipe-platform`}}function Ky(e){if(!e||e.nodes.length===0)return;let t=wm(e.nodes);if(t.length!==0)return{signature:t,presentationKey:e.presentationKey,comparisonKey:Tm(e),nodes:e.nodes}}function qy(e){let t=Ky(e.snapshot);return t?Gp(e)===`active`?Km(e)?{kind:`unobservable`,reason:`prior-gesture-unsettled`}:{kind:`observe`,baseline:t}:{kind:`unobservable`,reason:`stored-surface-not-current`}:{kind:`unobservable`,reason:`stored-surface-unusable`}}async function Jy(e){let{direction:t,baseline:n,swipe:r}=e,i=await Xy(n,e);switch(i.kind){case`moved`:return await rb({...i,direction:t,baseline:n,swipe:r});case`blind`:return ub(t,i.reason,{swipe:r});case`settled`:return await ib({...i,direction:t,baseline:n,swipe:r})}}function Yy(e,t){if(e.presentationKey!==t.presentationKey)return`baseline-presentation-drift`;if(e.comparisonKey!==t.comparisonKey)return`capture-lineage-drift`}async function Xy(e,t){let n,r,i=await jr({capture:async()=>{let n=await $y(e,t.capture);return n.kind===`changed`&&(r??=await Qy(e,t.direction,t.swipe)),n},schedule:{intervalMs:t.pollMs??Wy.intervalMs,budgetMs:t.budgetMs??Wy.budgetMs},verdict:e=>{if(e.kind===`blind`)return{kind:`done`,result:{kind:`blind`,reason:e.reason}};let t=Zy(e,{previous:n,changeNeedsRest:r===!0});return n=e.observed.signature,t?{kind:`done`,result:t}:{kind:`continue`}},...t.clock?{clock:t.clock}:{}}),a=i.polls.length;if(i.kind===`failed`)throw i.error;if(i.kind!==`done`)return eb(t,a,i.waitedMs);let o=Date.now()-i.waitedMs;return i.result.kind===`blind`?i.result:{...i.result,attempts:a,startedAt:o}}function Zy(e,t){let n=tb(t.previous,e.observed.signature);if(e.kind===`changed`)return!t.changeNeedsRest||n?{kind:`moved`,observed:e.observed}:void 0;if(n)return{kind:`settled`,observed:e.observed,evidence:e.evidence}}async function Qy(e,t,n){let r=wy(t);if(!r)return!1;let i=await Ey(e.nodes,r,{point:n.midpoint}),a=i.containerRect!==void 0&&!i.canScroll;return a&&M({level:`debug`,phase:`scroll_movement_edge_rest_required`,data:{direction:t,containerRect:i.containerRect}}),a}async function $y(e,t){let n=await nb(t);if(!n)return{kind:`blind`,reason:`capture-unreadable`};let r=Yy(e,n);if(r)return{kind:`blind`,reason:r};let i=Om(e.signature,n.signature);return i===`changed`?{kind:`changed`,observed:n}:{kind:`unchanged`,observed:n,evidence:i}}function eb(e,t,n){return M({level:`warn`,phase:`scroll_movement_budget_expired`,data:{direction:e.direction,attempts:t,durationMs:n,...e.swipe.pixels===void 0?{}:{requestedPixels:e.swipe.pixels}}}),{kind:`blind`,reason:`surface-unsettled`}}function tb(e,t){return e!==void 0&&Dm(e,t)}async function nb(e){let t;try{t=await e()}catch{return}let n=En(t,void 0);return{signature:wm(n.nodes),presentationKey:n.presentationKey,comparisonKey:Tm(n),nodes:n.nodes}}async function rb(e){let{direction:t,baseline:n,swipe:r,observed:i}=e,a=wy(t),o=a?(await Ey(i.nodes,a)).containerRect:void 0;return o&&!Mm(n.signature,i.signature,o)?ub(t,`change-outside-container`,{swipe:r,containerRect:o}):db(t,`moved`,r,e.attempts,e.startedAt)}async function ib(e){let{direction:t,baseline:n,observed:r,evidence:i,swipe:a}=e,o=ab(n,r,i);return o?ub(t,o.reason,{swipe:a,divergence:o.divergence}):await ob(e)}function ab(e,t,n){if(n===`ambiguous`)return{reason:`no-comparable-content`};if(!Am(e.signature,t.signature))return{reason:`surface-divergence`,divergence:jm(e.signature,t.signature)}}async function ob(e){let{direction:t,observed:n,swipe:r}=e,i=wy(t);if(!i)return db(t,`unchanged`,r,e.attempts,e.startedAt);let a=await Ey(n.nodes,i),o=a.containerRect;if(!o)return ub(t,`no-scroll-container`,{swipe:r});if(r.midpoint&&!sb(o,r.midpoint))return ub(t,`container-outside-swipe`,{swipe:r,containerRect:o});if(a.canScroll)throw cb(t,i,r,o);return db(t,`at-edge`,r,e.attempts,e.startedAt)}function sb(e,t){return dt(e,t.x,t.y)}function cb(e,t,r,i){let o=new a(`COMMAND_FAILED`,`scroll ${e} moved nothing: the container still reports hidden content ${t===`bottom`?`below`:`above`} and its contents never shifted`,{reason:`scroll_no_progress`,direction:e,hiddenContentAt:t,containerRect:i,...r.pixels===void 0?{}:{requestedPixels:r.pixels},hint:Py({targetDirectly:`with scroll ${e} --until <selector>`,rawDrag:r.midpoint!==void 0})});return n(o,`unknown`)}function lb(e,t){M({level:`debug`,phase:`scroll_movement_not_applicable`,data:{direction:e,reason:t}})}function ub(e,t,n){return M({level:`info`,phase:`scroll_movement_unobserved`,data:{direction:e,reason:t,...n.swipe.pixels===void 0?{}:{requestedPixels:n.swipe.pixels},...n.divergence??{},...n.containerRect===void 0?{}:{containerRect:n.containerRect}}}),`unobserved`}function db(e,t,n,r,i){return M({level:t===`moved`?`debug`:`info`,phase:`scroll_movement_observed`,data:{direction:e,movement:t,attempts:r,durationMs:Date.now()-i,...n.pixels===void 0?{}:{requestedPixels:n.pixels}}}),t}function fb(e){return e===`bottom`?{direction:`down`,edge:`bottom`}:e===`top`?{direction:`up`,edge:`top`}:{direction:T(e)}}function pb(e,t,n){if(e!==void 0&&!Number.isFinite(e))throw new a(`INVALID_ARGS`,`scroll amount must be a number`);te(n),ie({amount:e,pixels:t})}async function mb(e){let t=e.positionals[0],n=e.positionals[1]?Number(e.positionals[1]):void 0,r=e.context.pixels,i=e.context.durationMs,o=e.context.until;if(!t)throw new a(`INVALID_ARGS`,`scroll requires direction`);pb(n,r,i);let s=fb(t),c={...s.edge===void 0?{}:{edge:s.edge},...o===void 0?{}:{until:o}};b(c);let l=ne({amount:n,pixels:r,durationMs:i},s.edge),u=pt(c),d={command:`scroll`,device:e.device,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice};switch(u.kind){case`direction`:{let t=Gy({device:e.device,flags:e.flags,session:e.session});return await Q({...d,use:u.use},async(e,n)=>await gb(e,s,l,n,t))}case`edge`:{let e=u.edge;return await Q({...d,unavailableResponse:t=>hb(`scroll ${e}, which verifies hidden content before scrolling,`,t.hint),use:u.use},async(t,n)=>await bb(t,e,s,l,n))}case`until`:{let t=u.until;return await Q({...d,unavailableResponse:e=>hb(`scroll --until, which checks whether the selector became visible,`,e.hint),use:u.use},async(n,r)=>await xb(n,e.device,t,s,l,r))}}}function hb(e,t){return g(`UNSUPPORTED_OPERATION`,`${e} requires snapshot support`,void 0,t===void 0?void 0:{hint:t})}async function gb(e,t,n,r,i){let a=await Cb(e,t,n,r)??{};return Tb(t,n,1,a,await _b(e,t.direction,r,i,a))}async function _b(e,t,n,r,i){if(r.kind===`declined`){lb(t,r.reason);return}let a=e.operations.captureSnapshot;if(!a){lb(t,`owner-without-capture`);return}return r.kind===`unobservable`?ub(t,r.reason,{swipe:yb(i)}):await Jy({direction:t,baseline:r.baseline,swipe:yb(i),capture:async()=>await a(vb(n))})}function vb(e,t){return{options:{...e.appBundleId===void 0?{}:{appBundleId:e.appBundleId},...t},execution:$(e)}}function yb(e){let t=ee(e),n=S(e);return{...t===void 0?{}:{midpoint:t},...n===void 0?{}:{pixels:n}}}async function bb(e,t,n,r,i){let a,o=await jy({edge:t,captureState:async n=>{let r=await Sb(e,t,n,i);return a=r.scope??a,r},scroll:async()=>await Cb(e,n,r,i),settleAfterPass:async()=>{await wb(async()=>(await e.operations.captureSnapshot(vb(i,{scope:a}))).nodes??[],t)}});return Tb(n,r,o.passes,o.result??{})}async function xb(e,t,n,r,i,a){let o=await Iy({selector:n,direction:r.direction,platform:N(t),capture:async()=>await e.operations.captureSnapshot(vb(a)),scroll:async()=>await Cb(e,r,i,a)});return C({direction:r.direction,until:n,passes:o.passes,...i.amount===void 0?{}:{amount:i.amount},...i.pixels===void 0?{}:{pixels:i.pixels},...o.result??{}},Ry(r.direction,n,o.passes))}async function Sb(e,t,n,r){return await Ty({edge:t,scope:n,captureNodes:async t=>(await e.operations.captureSnapshot(vb(r,{scope:t}))).nodes??[]})}async function Cb(e,t,n,r){return await e.operations.scrollDirection(Eb(t.direction,n,r))}async function wb(e,t,n=1200,r=120){let i,a=Date.now()+n;for(;Date.now()<a;){let n=await Oy(await e(),t);if(n===i)return;i=n,await new Promise(e=>setTimeout(e,r))}}function Tb(e,t,n,r,i){let a=x(r),o=S(r);return C({direction:e.direction,...e.edge?{edge:e.edge,passes:n}:{},...t.amount===void 0?{}:{amount:t.amount},...t.pixels===void 0?{}:{pixels:t.pixels},...a===void 0?{}:{durationMs:a},...r,...i===void 0?{}:{movement:i}},My({direction:e.direction,edge:e.edge,passes:n,amount:t.amount,pixels:t.pixels,honoredPixels:o,...i===void 0?{}:{movement:i}}))}function Eb(e,t,n){return{direction:e,options:t,...n.appBundleId===void 0?{}:{target:{appBundleId:n.appBundleId}},execution:$(n)}}async function Db(e){let t=je(e.positionals),n=await gy({command:`viewport`,device:e.device,use:ut,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});return n.type===`response`?{ok:!1,response:n.response}:{ok:!0,execute:async()=>(await n.runtime.operations.setViewport(t),{...t,message:`Viewport set: ${t.width}x${t.height}`})}}function Ob(e,t){return{mode:e,...t.appBundleId===void 0?{}:{options:{appBundleId:t.appBundleId}},execution:$(t)}}async function kb(e){return await Q({command:`back`,device:e.device,use:bt,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice},Ab)}async function Ab(e,t){return await e.operations.back(Ob(t.backMode,t)),{action:`back`,mode:t.backMode??`in-app`,...y(`Back`)}}const jb={home:{use:jt,message:`Home`},"app-switcher":{use:Dt,message:`Opened app switcher`},"action-button":{use:it,message:`Pressed Action Button`}};function Mb(e){return Object.hasOwn(jb,e)}function Nb(e){return{...e.appBundleId===void 0?{}:{options:{appBundleId:e.appBundleId}},execution:$(e)}}async function Pb(e,t){let n=jb[e];return await Q({command:e,device:t.device,use:n.use,inspectFacts:t.inspectFacts,platformServices:t.platformServices,bindDevice:t.bindDevice},async(t,r)=>{let[i]=n.use.required;return await t.operations[i](Nb(r)),{action:e,...y(n.message)}})}function Fb(e){return ce(e[0])}function Ib(e,t){return{rotation:e,...t.appBundleId===void 0?{}:{options:{appBundleId:t.appBundleId}},execution:$(t)}}async function Lb(e){let t=Fb(e.positionals);return await Q({command:`orientation`,device:e.device,use:st,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice},(e,n)=>Rb(e,t,n))}async function Rb(e,t,n){let r=(await e.operations.setOrientation(Ib(t,n)))?.orientation;return r?{action:`orientation`,orientation:r,...y(`Rotated to ${r}`)}:{action:`orientation`,orientation:t,confirmed:!1,warning:`Requested ${t}; the device owner reported no resulting orientation, so the rotation is unconfirmed.`,...y(`Rotation requested: ${t} (unconfirmed)`)}}function zb(e){return re(e[0])}async function Bb(e){let t=e.keyframes===void 0?{pose:zb(e.positionals)}:w({pose:e.positionals[0],keyframes:se(e.keyframes)});return await Q({command:`fold`,device:e.device,use:Mt,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice},e=>Vb(e,t))}async function Vb(e,t){let n=await e.operations.setFoldPose(t),r=n.screen;return{action:`fold`,pose:n.pose,hingeAngleDegrees:n.hingeAngleDegrees,...r?{screen:r}:{},...y(r?`Folded to ${n.pose} (hinge ${n.hingeAngleDegrees}°, ${r.display} native panel ${r.widthPt}x${r.heightPt}pt, not snapshot coordinates); refs from before the pose change are stale`:`Folded to ${n.pose} (hinge ${n.hingeAngleDegrees}°); refs from before the pose change are stale`)}}function Hb(e){if(e.length!==1)throw new a(`INVALID_ARGS`,`tv-remote requires exactly one button`);return E(e[0])}function Ub(e,t,n){return{button:e,durationMs:t,...n.appBundleId===void 0?{}:{options:{appBundleId:n.appBundleId}},execution:$(n)}}async function Wb(e){let t=Hb(e.positionals),n=e.durationMs===void 0?void 0:wr(e.durationMs,`durationMs`,0,1e4);return await Q({command:`tv-remote`,device:e.device,use:ft,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice},(e,r)=>Gb(e,t,n,r))}async function Gb(e,t,n,r){return await e.operations.tvRemote(Ub(t,n,r)),{action:`tv-remote`,button:t,...n===void 0?{}:{durationMs:n},...y(`Pressed TV remote ${t}`)}}async function Kb(e){if(Mb(e.req.command))return await Pb(e.req.command,{device:e.session.device,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});switch(e.req.command){case`screenshot`:{let{resolveScreenshotGenericExecution:t}=await import(`../screenshot-runtime.js`).then(e=>e.r);return await t(e)}case`focus`:return await Sy({device:e.session.device,positionals:e.req.positionals??[],inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});case`scroll`:return await mb({device:e.session.device,positionals:e.req.positionals??[],context:e.context,session:e.session,flags:e.req.flags,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});case`viewport`:return await Db({device:e.session.device,positionals:e.req.positionals??[],inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});case`back`:return await kb({device:e.session.device,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});case`orientation`:return await Lb({device:e.session.device,positionals:e.req.positionals??[],inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});case`fold`:return await Bb({keyframes:e.req.flags?.keyframes,device:e.session.device,positionals:e.req.positionals??[],inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});case`tv-remote`:return await Wb({device:e.session.device,positionals:e.req.positionals??[],durationMs:e.req.flags?.durationMs,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});default:return{ok:!1,response:g(`COMMAND_FAILED`,`${e.req.command} has no runtime execution on the generic route`,{reason:`generic-route-runtime-missing`})}}}async function qb(e,t,n){let i=ht(e);try{let e=await n();if(!e||e.ok)return e;let r=Jb(i,e.error.details,t);return r===e.error.details?e:{...e,error:{...e.error,details:r}}}catch(e){let n=r(e),a=Jb(i,n.details,t);throw a===n.details?e:(n.details=a,n)}}function Jb(e,t,n){return n.dispatchedSteps>0?v(t,n.dispatchedSteps):e===void 0?t:e===`observes-app`?t?.dispatched===`no`?t:{...t,dispatched:`no`}:t?.dispatched===void 0?{...t,dispatched:`unknown`}:t}function Yb(e){return e.ok?e:{...e,error:{...e.error,details:{...e.error.details,dispatched:`no`}}}}function Xb(e){return n(r(e),`no`)}const Zb=new Proxy({},{get(){return async()=>{throw new a(`INTERNAL_ERROR`,`Android observation was not supplied by root runtime composition`)}}});function Qb(){return new a(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`)}const $b=Object.freeze({stopSnapshotHelper:async()=>{throw Qb()},closeManagedBrowser:async()=>{throw Qb()},cleanupSessionlessExecutionHost:async()=>{throw Qb()},retainExecutionHostAfterClose:()=>{throw Qb()}});function ex(e){let{logPath:t,token:n,requestPlatformProviders:r=nx,deviceRuntimeGateway:i,platformServices:a,claimRecoveryGateway:o,appLogAdmissionLedger:s=py(),audioProbeAdmissionLedger:c=Vh(),perfCaptureAdmissionLedger:l=Hh(),screenRecordingAdmissionLedger:u=Uh(),hostDiagnostics:d,providerRuntimeIds:f,providerRuntimeRequiredIds:p,providerCredentials:m,leaseLifecycleProvider:h,cloudArtifactProvider:g,providerAppCatalog:_,androidObservation:v=Zb,createCommandSurface:ee,platformResourceCleanup:y=$b,providerDeviceRuntimeScope:te,trackDownloadableArtifact:ne,daemonPolicy:b}=e,{sessionStore:x,leaseRegistry:S}=e,re=b?uf(e.deviceInventoryGateways,b):e.deviceInventoryGateways;async function C(e){let n=Date.now(),r=!!(e.meta?.debug||e.flags?.verbose);return await He({session:e.session,requestId:e.meta?.requestId,command:e.command,debug:r,logPath:t},async()=>{let t=await Vt(tx(e),async()=>await w(e));return t.ok?Ex(e,t,n):{ok:!1,error:px(e,Tx(Sx(e,xx(e,t.error,x),x)))}})}async function w(e){if(!hn(e.token,n))return ix();dx(e);let t=sx(e);if(t)return t;let r=lx(e);if(r)return r;let s=ty(e);if(s)return s;let c,l,u=pr(e);try{l=await yr({...re,requestScope:u},async()=>await Vn(async()=>(c=await Gv({req:e,sessionStore:x,leaseRegistry:S,deviceRuntimeGateway:i,platformServices:a,claimRecoveryGateway:o,platformRequestScope:u,platformResourceCleanup:y,providerAppCatalog:_,daemonPolicy:b}),await T(c))))}catch(e){l=yx(e)}return ie(e,c,await bx(c,l))}function ie(e,t,n){let r=t?x.lookup(t.sessionName)?.session:void 0;return Af(t?.req??e,S,r,b)?zu(e.command,n):n}async function T(e,t){let n=async()=>{let n=await Xv({scope:e,sessionStore:x,trackDownloadableArtifact:ne});if(n.type===`response`)return n.response;let i=n.scope,a=async e=>{let n=async()=>await E({lockedScope:i,providerScope:e,allowReplayActions:t===void 0});return te?await te(n):await n()};if(t)return await a(t);let o=rx(i);if(!r.hasConfiguredResolvers&&!o)return await a({});let s=await Tp({req:i.req,existingSession:i.existingSession,useDefaultWebProvider:o});return s?await r.run(s,a):await a({})};return t?await e.runAdmitted(n):await e.runLocked(n)}async function E(e){let{lockedScope:t,providerScope:n,allowReplayActions:r}=e;return await qb(t.req,t.dispatchLedger,async()=>await ae({lockedScope:t,providerScope:n,allowReplayActions:r}))}async function ae(e){let{lockedScope:t,providerScope:n,allowReplayActions:r}=e,{dispatchLedger:i}=t,a=pr(t.req);return await Gh({req:t.req,sessionName:t.sessionName,logPath:t.logPath,sessionStore:x,leaseRegistry:S,leaseLifecycleProvider:h,providerRuntimeIds:f,providerRuntimeRequiredIds:p,providerCredentials:m,cloudArtifactProvider:g,providerAppCatalog:_,invoke:Rr(C,i),invokeReplayAction:r?Rr(D(t,n),i):void 0,providerScope:n,androidObservation:v,createCommandSurface:ee,platformResourceCleanup:y,bindDevice:t.bindDevice,platformServices:t.platformServices,inspectFacts:t.inspectFacts,bindExactDevice:t.bindExactDevice,reconcileOrphanedDeviceClaim:mr({scope:a,composeGateway:o}),appLogAdmissionLedger:s,audioProbeAdmissionLedger:c,perfCaptureAdmissionLedger:l,screenRecordingAdmissionLedger:u,hostDiagnostics:d,requestScope:a,retainDeviceExecutionLock:t.retainDeviceExecutionLock,throwIfCanceled:t.throwIfCanceled,contextFromFlags:t.handlerContextFromFlags})||await gx({lockedScope:t,logPath:t.logPath,sessionStore:x,androidObservation:v,createCommandSurface:ee})}function D(e,t){return async r=>{if(!vx(r,e))return await C(r);if(!hn(r.token,n))return ix();dx(r);let s,c;try{let n=_x(r,e);s=await Gv({req:n,sessionStore:x,leaseRegistry:S,deviceRuntimeGateway:i,platformServices:a,claimRecoveryGateway:o,platformRequestScope:pr(n),platformResourceCleanup:y,providerAppCatalog:_,daemonPolicy:b}),c=s.sessionName===e.sessionName?await T(s,t):await T(s)}catch(e){c=yx(e)}return hx(r,await bx(s,c))}}return C}function tx(e){let t=e.meta?.developerDir;return typeof t==`string`?{DEVELOPER_DIR:t}:void 0}const nx=Object.freeze({hasConfiguredResolvers:!1,run:async(e,t)=>await t({})});function rx(e){return e.existingSession!==void 0&&Y_(e.existingSession)||e.req.flags?.platform===`web`}function ix(){return{ok:!1,error:s(new a(`UNAUTHORIZED`,`Invalid token`))}}function ax(){return g(`INVALID_ARGS`,`--record and --no-record are mutually exclusive; pass at most one.`)}const ox=[[`recordAs`,`--record-as`,`string`],[`textStdin`,`--text-stdin`,`boolean`]];function sx(e){if(e.flags?.record&&e.flags?.noRecord)return ax();if(e.command===`fill`)return cx(e);let t=ox.find(([t])=>e.flags?.[t]!==void 0);if(t)return g(`INVALID_ARGS`,`${t[1]} is supported only by fill.`)}function cx(e){let t=ox.find(([t,,n])=>{let r=e.flags?.[t];return r!==void 0&&typeof r!==n});if(t)return g(`INVALID_ARGS`,`${t[1]} must be a ${t[2]}.`)}function lx(e){if(e.flags?.snapshotCustomActions===!0&&e.flags?.snapshotRaw===!0)return g(`INVALID_ARGS`,`--actions and --raw are mutually exclusive: custom actions are only readable through the private-AX snapshot path, which a raw capture does not use.`)}function ux(e){if(!(e.command!==`fill`||!ri(e.flags)))return si({ts:0,command:`fill`,positionals:e.positionals??[],flags:e.flags})}function dx(e){let t=ux(e);t!==void 0&&Ue(t)}const fx=new Set([`message`,`hint`,`cause`,`details`]);function px(e,t){let n=ux(e);if(!n)return t;let r=ii(e.flags),i=e=>fa(e,n,r);return Object.fromEntries(Object.entries(t).map(([e,t])=>[e,fx.has(e)?mx(t,i):t]))}function mx(e,t){return typeof e==`string`?t(e):Array.isArray(e)?e.map(e=>mx(e,t)):!e||typeof e!=`object`?e:Object.fromEntries(Object.entries(e).map(([e,n])=>[t(e),mx(n,t)]))}function hx(e,t){return t.ok?t:{...t,error:px(e,t.error)}}async function gx(e){let{lockedScope:t,logPath:n,sessionStore:r,androidObservation:i,createCommandSurface:a}=e,o=r.lookup(t.sessionName);if(!o)return d();let s=r.requireCurrent(o),c=await Kb({req:t.req,session:s,context:t.contextFromFlags(t.req.flags,s.appBundleId,s.trace?.outPath),inspectFacts:t.inspectFacts,platformServices:t.platformServices,bindDevice:t.bindDevice,createCommandSurface:a});if(!c.ok)return Yb(c.response);let{dispatchGenericCommand:l}=await Kh();return await l({req:t.req,ref:o,sessionName:t.sessionName,logPath:n,sessionStore:r,contextFromFlags:t.contextFromFlags,platformServices:t.platformServices,executePlatformCommand:c.execute,androidObservation:i,createCommandSurface:a,...c.recorded?{recordedRequest:c.recorded}:{}})}function _x(e,t){if(e.command!==`open`)return e;let n=e.internal?.retainDeviceExecutionLock;return{...e,internal:{...e.internal,retainDeviceExecutionLock:async e=>{await t.retainDeviceExecutionLock(e),await n?.(e)}}}}function vx(e,t){return e.session===t.sessionName&&ru(e.command)}function yx(e){M({level:`error`,phase:`request_failed`,data:{error:e instanceof Error?e.message:String(e)}});let t=j(),n=Ve({force:!0});return{ok:!1,error:s(e,{diagnosticId:t.diagnosticId,logPath:n?.path,diagnosticsRecord:n?.ref})}}async function bx(e,t){if(!e)return t;let n=t;try{await e[Symbol.asyncDispose]()}catch(e){t.ok?n=yx(e):(M({level:`error`,phase:`request_binding_cleanup_failed`,data:{primaryCode:t.error.code,cleanupError:e instanceof Error?e.message:String(e)}}),Ve({force:!0}))}return Zv(e,n)}function xx(e,t,n){if(t.code!==`SESSION_NOT_FOUND`)return t;let r=Cx(e,n);if(r===void 0)return t;let i=n.readRepairTombstone(r);if(!i)return t;let o=i.sourcePath?`re-run: replay ${i.sourcePath} --save-script`:`re-run your replay <script> --save-script from the start`;return i.commitFailure?s(new a(`REPAIR_COMMIT_FAILED`,`The repair transaction for session "${e.session}" completed, but committing its healed script failed at teardown: ${i.commitFailure.message}. ${o}.`)):s(new a(`REPAIR_SESSION_EXPIRED`,`The --save-script repair session "${e.session}" was reaped before it was finalized (idle-reap); ${o}.`))}function Sx(e,t,n){if(t.code!==`SESSION_NOT_FOUND`)return t;let r=wx(e,n);return r?s(uy(r.owner,r)):t}function Cx(e,t){try{return Sg(Ef(e),t,{attachesToSession:!1})}catch{return}}function wx(e,t){let n=Cx(e,t);if(n!==void 0)try{return t.readIdleExpiryTombstone(n)}catch{return}}function Tx(e){let n=e.retriable??t(e.code);return n===void 0?e:{...e,retriable:n}}function Ex(e,t,n){let r=Dx(e,t);if(!e.meta?.includeCost)return r;let i=kx(t.data,n);return{ok:!0,data:{...r.data??{},cost:i}}}function Dx(e,t){let n=e.meta?.responseLevel??`default`;if(n==="default")return t;let r=_p[e.command];return r?{ok:!0,data:r(t.data??{},n)}:t}const Ox=[`ios_runner_command_send`,`ios_runner_readiness_preflight`];function kx(e,t){let n={wallClockMs:Date.now()-t,runnerRoundTrips:Ge(Ox)},r=e?.nodes;return Array.isArray(r)&&(n.nodeCount=r.length),n}function Ax(e){let t=5e3;return e.screenRecording&&(t+=11e3),Y_(e)&&(t+=3e4),t}function jx(e){e.destroyConnections?.();let t=`closeAllConnections`in e?e.closeAllConnections:void 0;if(typeof t==`function`){t.call(e);return}let n=`closeIdleConnections`in e?e.closeIdleConnections:void 0;typeof n==`function`&&n.call(e)}async function Mx(e,t=5e3){await Promise.all(e.map(async e=>{let n;await new Promise(r=>{n=setTimeout(()=>{jx(e),r()},t);try{e.close(()=>r())}catch{r()}}),n&&clearTimeout(n)}))}function Nx(e=process.env){let t=e.AGENT_DEVICE_DAEMON_IDLE_TIMEOUT_MS?.trim();if(t){let e=Number(t);if(Number.isFinite(e)&&e>=0)return Math.floor(e)}return 3e5}function Px(e){return e.toArray().some(e=>!Fx(e))}function Fx(e){return Ki(e)}function Ix(e){return e.toArray().some(e=>!!e.screenRecording)}function Lx(e){return e.inFlightRequestCount>0||Px(e.sessionStore)?!1:!Ix(e.sessionStore)}function Rx(e){let t=Nx(e.env),n,r=()=>Lx({sessionStore:e.sessionStore,inFlightRequestCount:e.getInFlightRequestCount()}),i=()=>{n&&=(clearTimeout(n),void 0)},a=()=>{i(),!(t<=0)&&(n=setTimeout(()=>{if(n=void 0,r()){if(e.hasRetainedLeases()){a();return}M({level:`info`,phase:`daemon_idle_reap`,data:{idleMs:t}}),e.onIdleReap()}},t),n.unref?.())};return{noteActivity:()=>{r()?a():i()},cancel:i,idleMs:t}}const zx=`claim-clear-failed`,Bx=Object.freeze({deleted:!0,absent:!0,"ownership-changed":!0,unattributable:!1}),Vx=2147483647;function Hx(e){let{sessionStore:t,idleExpiryMs:n}=e,r=e.now??Date.now,i,a=!1,o=!1,s=new Set,c=new Map,l=()=>{i&&=(clearTimeout(i),void 0)},u=()=>{o=!0,l()},d=()=>{let e,r=new Set;for(let i of t.listRefs()){r.add(i.address);let t=cy(i.session,n);if(t===void 0)continue;let a=c.get(i.address),o=a===void 0?t:Math.max(t,a);(e===void 0||o<e)&&(e=o)}for(let e of c.keys())r.has(e)||c.delete(e);return e},f=()=>{if(l(),o||n<=0||a)return;let e=r(),t=d();if(t===void 0)return;let s=Math.max(0,t-e),c=s>Vx;i=setTimeout(()=>{i=void 0,c?f():p()},Math.min(s,Vx)),i.unref?.()},p=async()=>{a=!0;let t=async()=>{try{await Ux({...e,now:r,retryNotBeforeMs:c,settling:s,closing:()=>o,notifyExpired:e.onSessionExpired})}catch(e){M({level:`warn`,phase:`session_idle_expiry_sweep_failed`,data:{idleExpiryMs:n,error:e instanceof Error?e.message:String(e)}})}};try{await(e.withinDiagnosticsScope?e.withinDiagnosticsScope(t):t())}finally{a=!1,f()}};return{noteSessionsChanged:f,cancel:u,idleExpiryMs:n}}async function Ux(e){for(let t of e.sessionStore.listRefs())if(ay(t.session)){if(e.closing())return;await Wx({...e,ref:t})}}async function Wx(e){let{address:t}=e.ref;if(e.settling.has(t)){e.retryNotBeforeMs.set(t,e.now()+e.idleExpiryMs);return}let n=f_(t,e.ref.session.device.id),r=qx({...e,lockKeys:n}),i=e.settleBudgetMs?.(e.ref.session);if(i===void 0)return void await r;let a=Kx(i);try{if(await Promise.race([r,a.promise])!==Gx)return}finally{a.cancel()}M({level:`warn`,phase:`session_idle_expiry_settle_timeout`,data:{session:t,idleExpiryMs:e.idleExpiryMs,settleBudgetMs:i,...e.ref.session.deviceClaim?{deviceKey:e.ref.session.deviceClaim.deviceKey}:{}}}),e.retryNotBeforeMs.set(t,e.now()+e.idleExpiryMs)}const Gx=Symbol(`session-idle-settle-budget-elapsed`);function Kx(e){let t;return{promise:new Promise(n=>{t=setTimeout(()=>n(Gx),e),t.unref?.()}),cancel:()=>clearTimeout(t)}}async function qx(e){let{address:t,session:n}=e.ref;e.settling.add(t);let r;try{r=await N_(e.executionLocks,e.lockKeys,async()=>{if(e.closing())return Jx;let t=e.sessionStore.resolveCurrent(e.ref);if(!t||t.device.id!==n.device.id)return Jx;let r=e.now();return sy(t,e.idleExpiryMs,r)?{outcome:await Xx({ref:e.sessionStore.refresh(e.ref),idleExpiryMs:e.idleExpiryMs,expiredAtMs:r,sessionStore:e.sessionStore,settleSession:e.settleSession}),retry:!0}:Jx}),r.retry?Yx(e,t,r.outcome):e.retryNotBeforeMs.delete(t)}catch(n){M({level:`warn`,phase:`session_idle_expiry_settle_failed`,data:{session:t,idleExpiryMs:e.idleExpiryMs,error:n instanceof Error?n.message:String(n)}}),Yx(e,t,void 0);return}finally{e.settling.delete(t)}return r.outcome&&e.notifyExpired?.(r.outcome),r.outcome}const Jx=Object.freeze({outcome:void 0,retry:!1});function Yx(e,t,n){if(n){e.retryNotBeforeMs.delete(t);return}e.retryNotBeforeMs.set(t,e.now()+e.idleExpiryMs)}async function Xx(e){let{ref:t,idleExpiryMs:n,expiredAtMs:r}=e,{address:i,session:a}=t,o=a.deviceClaim?.deviceKey,s={session:i,idleExpiryMs:n,...o?{deviceKey:o}:{}};if(!await Zx(e,s))return;let c=await Qx(i,a.deviceClaim);if(c===zx||!Bx[c]){M({level:`warn`,phase:`session_idle_expiry_device_claim_unconfirmed`,data:s});return}if(e.sessionStore.finalizeRepairTeardown(t),!e.sessionStore.retire(t)){M({level:`info`,phase:`session_idle_expiry_superseded`,data:s});return}e.sessionStore.writeIdleExpiryTombstone(i,ly(i,{expiredAtMs:r,idleExpiryMs:n,deviceKey:o}));let l=r-iy(a);return M({level:`info`,phase:`session_idle_expired`,data:{...s,idleForMs:l,claim:c}}),{sessionName:i,idleExpiryMs:n,idleForMs:l,claim:c,...o?{deviceKey:o}:{}}}async function Zx(e,t){try{return await e.settleSession(e.ref),!0}catch(e){return M({level:`warn`,phase:`session_idle_expiry_cleanup_failed`,data:{...t,error:e instanceof Error?e.message:String(e)}}),!1}}async function Qx(e,t){if(!t)return`absent`;try{return await ur(t)}catch(n){return M({level:`warn`,phase:`session_idle_expiry_device_claim_clear_failed`,data:{session:e,deviceKey:t.deviceKey,error:n instanceof Error?n.message:String(n)}}),zx}}async function $x(e){let{leaseRegistry:t,expiredProviderLeaseReleaser:n,timeoutMs:r}=e;await Promise.all(t.listActiveLeases().map(async e=>{try{let i=await eS(n.release(e),r);t.releaseLease(Al(e)),i||M({level:`warn`,phase:`daemon_shutdown_lease_release_timed_out`,data:{leaseId:e.leaseId,timeoutMs:r}})}catch(t){M({level:`warn`,phase:`daemon_shutdown_lease_release_failed`,data:{leaseId:e.leaseId,error:t instanceof Error?t.message:String(t)}})}}))}async function eS(e,t){return await new Promise((n,r)=>{let i=setTimeout(()=>n(!1),t);e.then(()=>{clearTimeout(i),n(!0)},e=>{clearTimeout(i),r(e)})})}const tS=`clear-unrecorded`;function nS(){let e={released:[],orphaned:[],superseded:[],unattributable:[]},t=new Map;return{claims:e,releaseClaim:async e=>{if(e.deviceClaim)try{t.set(e.name,await ur(e.deviceClaim))}catch(n){t.set(e.name,tS),M({level:`warn`,phase:`daemon_shutdown_device_claim_release_failed`,data:{session:e.name,deviceKey:e.deviceClaim.deviceKey,error:n instanceof Error?n.message:String(n)}})}},finalize:n=>{let r=n.deviceClaim;if(!r)return;let i={deviceKey:r.deviceKey,session:n.name,platform:N(n.device),deviceId:n.device.id},a=t.get(n.name);switch(a){case`deleted`:case`absent`:e.released.push(i);return;case`ownership-changed`:e.superseded.push(i);return;case`unattributable`:e.unattributable.push(i);return;case tS:case void 0:e.orphaned.push(i);return;default:rS(a)}}}}function rS(e){throw Error(`Undeclared device-claim outcome: ${String(e)}`)}function iS(e){if(e===void 0)return;let t=Number(e);if(Number.isInteger(t))return t}const aS=Object.freeze({match:!1,replaced:!0,absent:!0,unreadable:!1,ownerless:!1,unproven:!1});function oS(e){let t=ir(e.infoPath,e.owner);if(aS[t.state]&&!(t.state===`absent`&&cS(e.stateDir)))return t.state===`replaced`?{state:`replaced`,registeredPid:t.identity.pid}:{state:`absent`}}function sS(e){let t,n=()=>{t&&=(clearInterval(t),void 0)};return t=setInterval(()=>{if(cS(e.stateDir)){n();return}let t=oS(e);t&&(n(),e.onLoss(t))},15e3),t.unref?.(),n}function cS(e){try{return zt(e)===void 0}catch{return!1}}function lS(e){let t=new Set,n=Jr.createServer(n=>{t.add(n),n.on(`close`,()=>t.delete(n));let r=``,a=0,o=new Set,c=!1,l=()=>{if(!(c||a===0)){c=!0;for(let e of o)Kn(e);M({level:`warn`,phase:`request_client_disconnected`,data:{inFlightRequests:a}})}};n.setEncoding(`utf8`),n.on(`close`,l),n.on(`error`,l),n.on(`data`,async t=>{let c=tn(r,t);r=c.buffer;for(let t of c.lines){let r;a+=1;let c,l,u=!1;try{let a=uS(t);if(u=gn(a),c=Xn(a.meta?.requestId,`socket`),a.meta={...a.meta,requestId:c},l=Yn(c),o.add(c),Jn(c))throw i();r=await Qn(u?e=>{n.destroyed||n.write(on(e))}:void 0,async()=>await e(a))}catch(e){r={ok:!1,error:s(e)}}finally{--a,l&&o.delete(l.requestId),Zn(l)}n.destroyed||n.write(u?$t(r):`${JSON.stringify(r)}\n`)}})});return n.destroyConnections=()=>{for(let e of t)e.destroy();t.clear()},n}function uS(e){let t=JSON.parse(e);if(!t||typeof t!=`object`||Array.isArray(t))return t;let{internal:n,...r}=t;return r}function dS(e){return pS(e,`Failed to bind socket server`)}function fS(e){return pS(e,`Failed to bind HTTP server`)}function pS(e,t){return new Promise((n,r)=>{e.once(`error`,r),e.listen(0,`127.0.0.1`,()=>{e.off(`error`,r);let i=e.address();if(typeof i==`object`&&i?.port){n(i.port);return}r(new a(`COMMAND_FAILED`,t))})})}async function mS(e,t){t.length!==0&&await P({logPath:e,command:`daemon-startup`,debug:!1},()=>{for(let e of t)M({level:`warn`,phase:e.phase,data:{resourcePath:e.resourcePath,...e.data}})})}async function hS(e,t,n){await P({logPath:e},()=>{M({level:`warn`,phase:t,data:n})})}async function gS(e){try{let t=await e.registration.finish(e.outcome);t.state!==`removed`&&t.state!==`absent`&&await hS(e.logPath,`daemon_info_removal_declined`,{infoPath:e.infoPath,removed:!1,reason:t.state,...t.state===`replaced`?{registeredPid:t.identity.pid}:{}})}catch(t){await hS(e.logPath,`daemon_registration_finish_failed`,{error:s(t)})}}function _S(e,t,n,r){return sS({infoPath:t,stateDir:e,owner:r,onLoss:e=>void hS(n,`daemon_metadata_lost`,{infoPath:t,...e}).catch(()=>{})})}async function vS(e){let{session:t,stderr:n,resource:r,teardown:i}=e;try{return await i(),!0}catch(e){return n.write(`Daemon ${r} teardown error (${t.name}): ${e instanceof Error?e.message:String(e)}\n`),!1}}async function yS(e){let{ref:t,sessionStore:n,stderr:r,platformCleanup:i,finalizeApplicationLifecycle:a,afterSuccessfulTeardown:o}=e,s=n.resolveCurrent(t),c=s??t.session,l=gv(s?n.getRuntimeHints(t.address):void 0),u=Ax(c),d=await vS({session:c,stderr:r,resource:`app-log`,teardown:async()=>await Z_({ref:t,sessionStore:n})}),f=n.resolveCurrent(t)??c,p=(async()=>{let e=await vS({session:c,stderr:r,resource:`session`,teardown:async()=>await rv({appLog:`already-settled`,ref:t,sessionStore:n,platformCleanup:i})}),o=!a||await vS({session:c,stderr:r,resource:`lifecycle`,teardown:async()=>await a(f,l)});return e&&o})(),m=await Promise.race([p,Ht(u).then(()=>(r.write(`Daemon session teardown timed out (${c.name}).\n`),!1))]),h=d&&m;n.finalizeRepairTeardown(t),h&&await o?.(c),n.retire(t)}async function bS(e){let t=e.env??process.env,n=e.stdout??process.stdout,i=e.stderr??process.stderr,o=e.exit??(e=>process.exit(e)),s=fn(t.AGENT_DEVICE_STATE_DIR),{baseDir:c,infoPath:l,logPath:u,sessionsDir:d}=s,f=cn(t.AGENT_DEVICE_DAEMON_SERVER_MODE),p=Ut(t.AGENT_DEVICE_RETAIN_ARTIFACTS),m;try{m=nr(t)}catch(e){return i.write(`Daemon error: ${r(e).message}\n`),o(1),null}let h=m?()=>cf(m,`device-shutdown`):void 0,g=new fs(d),_=await e.composeDeps({env:t,baseDir:c,sessionsDir:d,assertShutdownAllowed:h,resolveSessionDir:e=>g.resolveSessionDir(e),resolveSessionArtifacts:e=>({outputPath:g.resolveAppLogPath(e),pidPath:g.resolveAppLogPidPath(e)}),openWebSessionNames:()=>X_(g)}),v=py(),ee=Vh(),y=Hh(),te=Uh(),ne=vn(),b=F.randomBytes(24).toString(`hex`),x=It(),S=Br(),re=Vr(),C=_.providerDeviceRuntimes,w=_.deviceRuntimeGateway,ie=w.applicationLifecycle;if(!ie)throw new a(`COMMAND_FAILED`,`Platform lifecycle gateway is not configured.`,{reason:`runtime-gateway-missing`});tr(_.providerDeviceAdmission),mf(_.interactorResolution);let T=Uf({leaseLifecycleProvider:_.leaseLifecycleProvider,providerRuntimeIds:_.providerRuntimeIds,recoverExpiredLease:_.recoverExpiredLease,stateDir:c,recoverableProviderIds:_.recoverableProviderIds});T.retryPending();let E=new bf({maxActiveSimulatorLeases:iS(t.AGENT_DEVICE_MAX_SIMULATOR_LEASES),defaultLeaseTtlMs:iS(t.AGENT_DEVICE_LEASE_TTL_MS),minLeaseTtlMs:iS(t.AGENT_DEVICE_LEASE_MIN_TTL_MS),maxLeaseTtlMs:iS(t.AGENT_DEVICE_LEASE_MAX_TTL_MS),onLeaseExpired:e=>{T.release(e)}}),ae=ex({logPath:u,token:b,sessionStore:g,leaseRegistry:E,appLogAdmissionLedger:v,audioProbeAdmissionLedger:ee,perfCaptureAdmissionLedger:y,hostDiagnostics:_.hostDiagnostics,screenRecordingAdmissionLedger:te,daemonPolicy:m,trackDownloadableArtifact:bs,deviceRuntimeGateway:w,claimRecoveryGateway:_.claimRecoveryGateway,platformResourceCleanup:_.platformResourceCleanup,leaseLifecycleProvider:_.leaseLifecycleProvider,providerRuntimeIds:_.providerRuntimeIds,..._.requestRouter}),D=()=>{},oe=async e=>{await P({logPath:u},()=>{M({level:`error`,phase:`daemon_fatal`,data:{error:e instanceof Error?e.message:String(e)}})})},se=nS(),ce=async e=>{let t=g.resolveCurrent(e)??e.session;try{await yS({ref:e,sessionStore:g,stderr:i,platformCleanup:_.platformResourceCleanup,finalizeApplicationLifecycle:async(e,t)=>await cv({gateway:w,scope:gr(),session:e,stateDir:c,runtimeHints:t}),afterSuccessfulTeardown:se.releaseClaim})}finally{se.finalize(t)}},le=async()=>{g.closeAdmission();let e=g.listRefs();await Promise.all(e.map(ce))},ue=Hx({sessionStore:g,idleExpiryMs:ry(t),executionLocks:$v(E),settleSession:async e=>{let t=g.resolveCurrent(e)??e.session,n=e.address,r=gv(g.getRuntimeHints(n));await rv({appLog:`run`,ref:e,sessionStore:g,platformCleanup:_.platformResourceCleanup}),await cv({gateway:w,scope:gr(),session:t,stateDir:c,runtimeHints:r,daemonLeaving:!1})},settleBudgetMs:e=>Ax(e),withinDiagnosticsScope:async e=>await P({logPath:u},e),onSessionExpired:()=>{fe.noteActivity()}}),O=!1,de=new Set,fe=Rx({sessionStore:g,getInFlightRequestCount:()=>de.size,hasRetainedLeases:()=>E.hasRetainedLeases(),onIdleReap:()=>{A()},env:t}),pe=async e=>{if(O)return{ok:!1,error:{code:`COMMAND_FAILED`,message:`Daemon is shutting down.`,details:{reason:`daemon_shutting_down`}}};fe.cancel();let t=ae(e);de.add(t);try{return await t}finally{de.delete(t),fe.noteActivity(),ue.noteSessionsChanged()}},me=async()=>{let e=[],n,r,i=f!==`http`,a=f!==`socket`;if(i){let t=lS(pe);e.push(t),n=await dS(t)}if(a){let n=await Vd({handleRequest:pe,leaseRegistry:E,token:b,retainArtifacts:p,env:t,resolveRequestDiagnosticsPath:m?.requiredLeaseBackend?void 0:e=>sn(g.resolveSessionDir(e.session),e.requestId)});e.push(n),r=await fS(n)}return{servers:e,socketPort:n,httpPort:r}},he=(e,t)=>{k.publish({socketPort:e,httpPort:t,token:b,version:ne,codeOrigin:S,codeSignature:re,policyDigest:m?.digest}),e&&n.write(`AGENT_DEVICE_DAEMON_PORT=${e}\n`),t&&n.write(`AGENT_DEVICE_DAEMON_HTTP_PORT=${t}\n`)},ge=e=>{for(let t of e)try{t.close(()=>{})}catch{}},_e=await kn(s);if(_e.status!==`acquired`)return await Promise.allSettled(C.map(async e=>await e.shutdown())),i.write(`Daemon registration ${_e.status}; exiting.\n`),o(An[_e.status]),null;let k=_e.owner,ve=[],ye,be,xe=[];try{await _.ownerLifecycle.configureForDaemonLock({stateDir:c,hasDeviceClaimAuthority:sr,onDiagnostic:e=>xe.push(e)});let e=await _.ownerLifecycle.recoverLegacyAppLogMarkers(d);v.retainLegacyMarkers(e.retained);for(let t of e.recovered)xe.push({phase:`app_log_legacy_marker_recovered`,resourcePath:t,data:{}});for(let t of e.retained)xe.push({phase:`app_log_legacy_marker_retained`,resourcePath:t.markerPath,data:{reason:t.reason,...t.message===void 0?{}:{message:t.message}}});await hr({sessionsDir:d,gateway:w,scope:gr(),onDiagnostic:e=>xe.push(e)}),await _n(_.ownedProcessRecords,{openWebSessionNames:X_(g),purposes:[`simctl-screen-recording`],termTimeoutMs:5e3}),await _.cleanupManagedWebOrphans({stateDir:c,openWebSessionNames:X_(g),ownedProcessRecords:_.ownedProcessRecords}),ie.recoverStartupResources({stateDir:c}).catch(e=>{M({level:`warn`,phase:`daemon_lifecycle_startup_recovery_failed`,data:{error:e instanceof Error?e.message:String(e)}})});let t=await me();ve=t.servers,ye=t.socketPort,be=t.httpPort,he(ye,be),D=_S(c,l,u,x),await mS(u,xe);for(let e of _.skippedProviderRuntimes)await hS(u,`provider_runtime_skipped`,{provider:e.provider,code:e.error.code,message:e.error.message,hint:e.error.details?.hint});await xS(u,mr({scope:gr(),composeGateway:_.claimRecoveryGateway}),c),fe.noteActivity()}catch(e){let t=r(e);return i.write(`Daemon error: ${t.message}\n`),ge(ve),D(),await Promise.allSettled(C.map(async e=>await e.shutdown())),await gS({registration:k,infoPath:l,logPath:u}),await _.ownerLifecycle.clearDaemonLockConfiguration(),o(1),null}Hr();let A=async(e={})=>{if(fe.cancel(),ue.cancel(),O)return;O=!0,D(),e.cause&&await oe(e.cause),await Mx(ve),await Promise.allSettled(de);try{await P({logPath:u},async()=>{await ie.detachForDaemonShutdown()})}catch{}T.beginShutdown(),await le(),await P({logPath:u},async()=>{await $x({leaseRegistry:E,expiredProviderLeaseReleaser:T,timeoutMs:1e3})});try{await _.ownerLifecycle.resetAndroidSnapshotHelper()}catch(e){M({level:`warn`,phase:`daemon_shutdown_android_snapshot_helper_cleanup_failed`,data:{error:e instanceof Error?e.message:String(e)}})}let t=await T.drain(2e3);M({level:t.pending.length===0?`info`:`warn`,phase:`daemon_shutdown_provider_release_drain`,data:{releasedLeaseIds:t.released.map(e=>e.leaseId),pendingLeaseIds:t.pending.map(e=>e.leaseId),releasedDeviceKeys:se.claims.released.map(e=>e.deviceKey),orphanedDeviceKeys:se.claims.orphaned.map(e=>e.deviceKey)}}),T.shutdown(),await w.shutdown(),await Promise.allSettled(C.map(async e=>await e.shutdown())),await ie.finalizeDaemonShutdown(),await Promise.race([Ur().catch(()=>{}),Ht(1e3)]),await gS({registration:k,infoPath:l,logPath:u,outcome:{providerReleases:t,claims:se.claims}}),await _.ownerLifecycle.clearDaemonLockConfiguration(),o(e.exitCode??0)};return e.registerProcessHandlers!==!1&&(process.on(`SIGINT`,()=>{A()}),process.on(`SIGTERM`,()=>{A()}),process.on(`SIGHUP`,()=>{A()}),process.on(`uncaughtException`,e=>{let t=e instanceof a?e:r(e);i.write(`Daemon error: ${t.message}\n`),A({exitCode:1,cause:e})}),process.on(`unhandledRejection`,e=>{let t=e instanceof Error?e:Error(String(e)),n=t instanceof a?t:r(t);i.write(`Daemon error: ${n.message}\n`),A({exitCode:1,cause:t})})),{httpPort:be,shutdown:A,socketPort:ye,token:b}}async function xS(e,t,n){await P({logPath:e},async()=>{try{let e=await cr(t,n);e.examined>0&&M({phase:`device_claim_reconcile`,data:e})}catch(e){M({level:`warn`,phase:`device_claim_reconcile_failed`,data:{error:e instanceof Error?e.message:String(e)}})}})}bS({composeDeps:async e=>(await import(`../daemon-composition.js`)).createDaemonRuntimeDeps(e)}).catch(e=>{let t=r(e);process.stderr.write(`Daemon error: ${t.message}\n`),process.exit(1)});export{Hp as $,oi as $t,G_ as A,Ui as At,cg as B,Ai as Bt,iv as C,dl as Ct,$_ as D,ka as Dt,Q_ as E,Rs as Et,Cg as F,Vi as Ft,Hm as G,Fi as Gt,ag as H,ki as Ht,Tg as I,Hi as It,Qm as J,z as Jt,Wm as K,Ii as Kt,Eg as L,qi as Lt,D_ as M,Wi as Mt,Og as N,Gi as Nt,Y_ as O,ba as Ot,Dg as P,Ki as Pt,$p as Q,ri as Qt,gg as R,Bi as Rt,av as S,Al as St,Z_ as T,Ss as Tt,fh as U,Mi as Ut,lg as V,Li as Vt,Km as W,Ri as Wt,xm as X,Di as Xt,Sm as Y,Oi as Yt,em as Z,si as Zt,gv as _,bf as _t,$ as a,Vp as at,Sv as b,pu as bt,my as c,Gp as ct,Cv as d,bp as dt,ii as en,Up as et,hv as f,Bf as ft,jv as g,wf as gt,wv as h,Cf as ht,yy as i,qp as it,U_ as j,zi as jt,W_ as k,ea as kt,Bv as l,Ip as lt,Nv as m,xf as mt,Xb as n,zp as nt,hy as o,Pp as ot,_v as p,zf as pt,qm as q,Pi as qt,Cy as r,Rp as rt,gy as s,Fp as st,Yb as t,ni as tn,Lp as tt,Lv as u,xp as ut,Ov as v,gf as vt,nv as w,zs as wt,Mv as x,jl as xt,Pv as y,hf as yt,_g as z,ji as zt};
4
+ `,o)){if(wo(a.slice(o,t),e)===!1)return r=!0,!1;o=t+1}return n=a.slice(o),!0},end(){r||wo(`${n}${t.end()}`,e)}}}function wo(e,t){let n=e.endsWith(`\r`)?e.slice(0,-1):e;if(n.trim().length!==0)return t(n)}function To(e){try{return F.openSync(e,`r`)}catch(e){if(e.code===`ENOENT`)return;throw e}}async function Eo(e){try{return await F.promises.open(e,`r`)}catch(e){if(e.code===`ENOENT`)return;throw e}}const Do=5242880;function Oo(e=process.env){let t=e.AGENT_DEVICE_EVENT_LOG_MAX_BYTES?.trim();if(t===void 0||!/^\d+$/.test(t))return Do;let n=Number(t);return Number.isSafeInteger(n)&&n>0?n:Do}function ko(e){return`${e}.1`}function Ao(e){return`${e}.window.json`}function jo(e){let t;for(let n=0;n<3;n+=1){let n=zo(e);try{let t=Mo(e);if(zo(e)===n)return t}catch(r){if(t=r,zo(e)===n)throw r}}throw t??V(e,`the window did not settle while reading`)}function Mo(e){let t=ko(e),n=Vo(e);if(n===`unverifiable`)throw V(e,`window file is invalid`);if(n===void 0)return No(e,t);let r=n.at(-1);if(!r)throw V(e,`window file records no generation`);let i=Wo(e),a=Po(e,r),o=[],s=Fo({eventLogPath:e,rotatedPath:t,sidecar:n,activeStart:a,activeExists:i});return s!==void 0&&o.push({path:t,firstLineIndex:s}),i&&o.push({path:e,firstLineIndex:a}),{files:o,earliestCursor:o[0]?.firstLineIndex??a}}function No(e,t){if(So(t)!==void 0)throw V(e,`a rotated event log exists with no window record`);return{files:Wo(e)?[{path:e,firstLineIndex:0}]:[],earliestCursor:0}}function Po(e,t){let n=So(e);return n!==void 0&&n===t.firstLineDigest?t.firstLineIndex:t.firstLineIndex+t.lineCount}function Fo(e){let{eventLogPath:t,rotatedPath:n,sidecar:r,activeStart:i,activeExists:a}=e,o=So(n);if(o===void 0)return;let s=r.find(e=>e.firstLineDigest===o);if(!s)throw V(t,`the rotated event log matches no window record`);let c=Ro(n);if(c!==s.lineCount)throw V(t,`the rotated event log holds ${c} lines, the window recorded ${s.lineCount}`);if(a&&s.firstLineIndex+s.lineCount!==i)throw V(t,`retained event log generations are not contiguous`);return s.firstLineIndex}async function Io(e,t){let n=Go(e);if(!n||n.size<t)return!1;let r=Vo(e);if(r===`unverifiable`)return await F.promises.rename(e,ko(e)),!0;let i=await xo(e);if(i.firstLineDigest!==void 0){let t=r??[],n=t.at(-1),a=n&&n.firstLineDigest===i.firstLineDigest?n:{firstLineIndex:n?n.firstLineIndex+n.lineCount:0,lineCount:i.lineCount,firstLineDigest:i.firstLineDigest};await Uo(e,(a===n?t:[...t,a]).slice(-2))}return await F.promises.rename(e,ko(e)),!0}function Lo(e,t){if(!(e>=t))throw new a(`COMMAND_FAILED`,`events cursor ${e} precedes the retained event log window; events before cursor ${t} were rotated out.`,{reason:`EVENT_LOG_CURSOR_EXPIRED`,cursor:e,earliestCursor:t,hint:`Resume with cursor ${t}, the oldest retained event; earlier events are no longer available.`})}function V(e,t){return new a(`COMMAND_FAILED`,`Session event log window cannot be verified: ${t}.`,{reason:`EVENT_LOG_WINDOW_UNVERIFIED`,path:e,hint:`Cursor positions for this session cannot be resolved. Delete ${e}, ${ko(e)}, and ${Ao(e)} to restart the timeline, or read the files directly.`})}function Ro(e){let t=0;return bo(e,()=>{t+=1}),t}function zo(e){return[Bo(Ao(e)),Bo(e),Bo(ko(e))].join(`|`)}function Bo(e){try{let t=F.lstatSync(e);return`${t.ino}:${t.size}:${t.mtimeMs}`}catch{return`absent`}}function Vo(e){let t;try{t=F.readFileSync(Ao(e),`utf8`)}catch(e){return e.code===`ENOENT`?void 0:`unverifiable`}try{let e=JSON.parse(t);if(!D(e)||e.version!==2)return`unverifiable`;let{generations:n}=e;if(!Array.isArray(n)||n.length===0)return`unverifiable`;let r=n.map(Ho);return r.every(e=>e!==void 0)?r:`unverifiable`}catch{return`unverifiable`}}function Ho(e){if(!D(e))return;let{firstLineIndex:t,lineCount:n,firstLineDigest:r}=e;if(!(!Number.isSafeInteger(t)||t<0)&&!(!Number.isSafeInteger(n)||n<0)&&typeof r==`string`&&r.length!==0)return{firstLineIndex:t,lineCount:n,firstLineDigest:r}}async function Uo(e,t){let n=Ao(e),r=`${n}.${process.pid}.tmp`;await F.promises.writeFile(r,JSON.stringify({version:2,generations:t}),`utf8`),await F.promises.rename(r,n)}function Wo(e){return Go(e)!==void 0}function Go(e){try{let t=F.lstatSync(e);if(t.isSymbolicLink())throw new a(`COMMAND_FAILED`,`Session event log must not be a symbolic link: ${e}`);return t}catch(e){if(e.code===`ENOENT`)return;throw e}}const Ko=new Map,qo=new Set;function Jo(e){return I.join(e,`events.ndjson`)}function Yo(e){return e.command!==me.events}function Xo(e,t,n){let r=l({version:1,ts:n.ts??new Date().toISOString(),session:t,...n});Qo(e,`${JSON.stringify(r)}\n`)}async function Zo(e){await(e?Ko.get(e):Promise.all(Ko.values()))}function Qo(e,t){let n=(Ko.get(e)??Promise.resolve()).catch(()=>void 0).then(async()=>{await $o(e),await Io(e,Oo()),await F.promises.appendFile(e,t,`utf8`)}).catch(t=>{j({level:`warn`,phase:`session_event_log_write_failed`,data:{path:e,error:t instanceof Error?t.message:String(t)}})}).finally(()=>{Ko.get(e)===n&&Ko.delete(e)});Ko.set(e,n)}async function $o(e){let t=I.dirname(e);if(!qo.has(t))try{await F.promises.mkdir(t,{recursive:!0}),qo.add(t)}catch(t){throw j({level:`warn`,phase:`session_event_log_dir_failed`,data:{path:e,error:t instanceof Error?t.message:String(t)}}),t}}function es(e,t,n){Xo(e,t,{kind:`action.recorded`,requestId:A().requestId,command:n.command,summary:In(n),details:zn(n)})}function ts(e){let{req:t}=e;return{kind:`request.started`,requestId:t.meta?.requestId??A().requestId,command:t.command,summary:`Started ${t.command}`}}function ns(e){let{req:t,response:n,durationMs:r}=e;if(n.ok){let e=Kn(t,n.data);return{kind:`request.finished`,requestId:t.meta?.requestId??A().requestId,command:t.command,status:`ok`,summary:e.summary??`Finished ${t.command}`,details:{durationMs:r,...e.details}}}return{kind:`request.finished`,requestId:t.meta?.requestId??A().requestId,command:t.command,status:`error`,summary:`Failed ${t.command}: ${n.error.code}`,details:{durationMs:r,code:n.error.code,diagnosticId:n.error.diagnosticId}}}function rs(e,t={}){let n=as(t.cursor),r=os(t.limit),i=jo(e);Lo(n,i.earliestCursor);let a=is(i.files,n,r),o=a.lines.flatMap(e=>{let t=ss(e);return t?[t]:[]});return{path:e,cursor:String(n),limit:r,events:o,...a.nextCursor===void 0?{}:{nextCursor:String(a.nextCursor)}}}function is(e,t,n){let r=[],i;for(let a of e){let e=a.firstLineIndex;if(bo(a.path,a=>{if(e>=t+n)return i=t+n,!1;e>=t&&r.push(a),e+=1}),i!==void 0)break}return{lines:r,...i===void 0?{}:{nextCursor:i}}}function as(e){if(e===void 0||e.trim()===``)return 0;let t=Number(e);if(Number.isInteger(t)&&t>=0)return t;throw new a(`INVALID_ARGS`,`events cursor must be a non-negative integer string.`)}function os(e){if(e===void 0||typeof e==`string`&&e.trim()===``)return 100;let t=typeof e==`string`?Number(e):e;if(Number.isInteger(t)&&t>=1&&t<=500)return t;throw new a(`INVALID_ARGS`,`events limit must be between 1 and 500.`)}function ss(e){try{let t=cs(JSON.parse(e));return t?ls(t):void 0}catch{return}}function cs(e){if(D(e)&&e.version===1&&typeof e.ts==`string`&&typeof e.session==`string`&&us(e.kind))return e}function ls(e){let t=D(e.details)?e.details:void 0;return{version:1,ts:e.ts,session:e.session,kind:e.kind,...typeof e.requestId==`string`?{requestId:e.requestId}:{},...typeof e.command==`string`?{command:e.command}:{},...ds(e.status)?{status:e.status}:{},...typeof e.summary==`string`?{summary:e.summary}:{},...t?{details:t}:{}}}function us(e){return e===`request.started`||e===`request.finished`||e===`action.recorded`}function ds(e){return e===`ok`||e===`error`}const fs=36e5;var ps=class{sessions=new Map;acceptingSessions=!0;runtimeHints=new Map;sessionsDir;scriptWriter;constructor(e){this.sessionsDir=e,this.scriptWriter=new Ja(e)}get(e){return this.sessions.get(e)?.current}closeAdmission(){this.acceptingSessions=!1}assertAdmissionOpen(e){if(!this.acceptingSessions)throw new a(`COMMAND_FAILED`,`Daemon is shutting down`,{reason:`daemon_shutting_down`,session:e})}assertPublishable(e){if(this.assertAdmissionOpen(e),this.sessions.has(e))throw new a(`COMMAND_FAILED`,`Session address is already occupied`,{reason:`session_address_occupied`,session:e})}publish(e,t){this.assertPublishable(e);let n={current:t};return this.sessions.set(e,n),this.clearIdleExpiryTombstone(e),this.captureRef(e,n)}resolveCurrent(e){let t=this.sessions.get(e.address);return t===e.lifetime?t.current:void 0}refresh(e){let t=this.sessions.get(e.address);return t===e.lifetime?this.captureRef(e.address,t):e}requireCurrent(e){let t=this.resolveCurrent(e);if(!t)throw new a(`COMMAND_FAILED`,`Session lifetime has ended`,{reason:`session_lifetime_ended`,session:e.address,hint:`Open a new session before retrying the command.`});return t}update(e,t){let n=this.requireCurrent(e),r=this.sessions.get(e.address),i=typeof t==`function`?t(n):t,a={...n,...i};return r.current=a,a}retire(e){return this.resolveCurrent(e)?(this.runtimeHints.delete(e.address),this.sessions.delete(e.address)):!1}captureRef(e,t){return Object.freeze({address:e,session:t.current,lifetime:t})}*values(){for(let e of this.sessions.values())yield e.current}toArray(){return Array.from(this.values())}lookup(e){let t=this.sessions.get(e);return t?this.captureRef(e,t):void 0}findByDevice(e){for(let[t,n]of this.sessions)if(n.current.device.id===e)return this.captureRef(t,n)}listRefs(){return Array.from(this.sessions,([e,t])=>this.captureRef(e,t))}getRuntimeHints(e){return this.runtimeHints.get(e)}setRuntimeHints(e,t){t?this.runtimeHints.set(e,t):this.runtimeHints.delete(e)}clearRuntimeHints(e){return this.requireCurrent(e),this.runtimeHints.delete(e.address)}recordAction(e,t){let n=ba(this.requireCurrent(e),t);n&&es(this.resolveEventLogPath(e.address),e.address,n)}recordEvent(e,t){Xo(this.resolveEventLogPath(e),e,t)}readEvents(e,t={}){return rs(this.resolveEventLogPath(e),t)}async flushEvents(e){await Zo(e?this.resolveEventLogPath(e):void 0)}writeSessionLog(e,t){let n=this.requireCurrent(e),r=this.scriptWriter.write(n,t);return r.written&&j({level:`info`,phase:`session_script_written`,data:{session:n.name,path:r.path}}),r}finalizeRepairTeardown(e){let t=this.resolveCurrent(e);if(!t)return;this.recordRepairFinalizeCloseIfCommitting(e);let n=this.writeSessionLog(e,{force:Ri(t,void 0)});qi(t)&&(!n.written&&n.error?this.writeRepairTombstone(e,fs,{code:String(n.error.code),message:n.error.message}):this.writeRepairTombstone(e))}recordRepairFinalizeCloseIfCommitting(e){let t=this.requireCurrent(e);pi(t.scriptPublication??R)&&this.recordAction(e,{command:`close`,positionals:[],flags:{},result:{session:t.name,...y(`Closed: ${t.name}`)}})}writeRepairTombstone(e,t=fs,n){let r=this.resolveCurrent(e);if(r)try{let i=this.resolveSessionDir(e.address);F.mkdirSync(i,{recursive:!0});let a={owner:e.address,reapedAt:Date.now(),expiresAt:Date.now()+t,...Yi(r)?{sourcePath:Yi(r)}:{},...n?{commitFailure:n}:{}};F.writeFileSync(this.repairTombstonePath(e.address),`${JSON.stringify(a)}\n`)}catch(t){j({level:`warn`,phase:`repair_tombstone_write_failed`,data:{session:e.address,error:t instanceof Error?t.message:String(t)}})}}readRepairTombstone(e){return Mn(this.repairTombstonePath(e),e)}clearRepairTombstone(e){kn(this.repairTombstonePath(e),e)}noteSessionActivity(e,t=Date.now()){let n=this.get(e);n&&(n.lastActivityAtMs=t)}writeIdleExpiryTombstone(e,t){try{F.mkdirSync(this.resolveSessionDir(e),{recursive:!0}),F.writeFileSync(Pa(this.resolveSessionDir(e)),`${JSON.stringify(t)}\n`)}catch(t){j({level:`warn`,phase:`idle_expiry_tombstone_write_failed`,data:{session:e,error:t instanceof Error?t.message:String(t)}})}}readIdleExpiryTombstone(e){if(!on(e))return;let t=Fa(Pa(this.resolveSessionDir(e)));return t?.owner===e?t:void 0}clearIdleExpiryTombstone(e){try{F.rmSync(Pa(this.resolveSessionDir(e)),{force:!0})}catch(t){j({level:`warn`,phase:`idle_expiry_tombstone_clear_failed`,data:{session:e,error:t instanceof Error?t.message:String(t)}})}}repairTombstonePath(e){return On(this.resolveSessionDir(e))}defaultTracePath(e){let t=dn(e.name),n=new Date().toISOString().replaceAll(/[:.]/g,`-`);return I.join(this.sessionsDir,`${t}-${n}.trace.log`)}resolveSessionDir(e){return fn(this.sessionsDir,e)}resolveDaemonStateDir(){return I.dirname(this.sessionsDir)}ensureSessionDir(e){let t=this.resolveSessionDir(e);return F.mkdirSync(t,{recursive:!0}),t}resolveAppLogPath(e){return tn(this.sessionsDir,e)}resolveAppLogPidPath(e){return un(this.sessionsDir,e)}resolveEventLogPath(e){return Jo(this.resolveSessionDir(e))}};function ms(e){switch(e){case`INVALID_ARGS`:return 400;case`UNAUTHORIZED`:return 401;case`SESSION_NOT_FOUND`:case`REPAIR_SESSION_EXPIRED`:return 404;default:return 500}}function H(e,t){e.statusCode=ms(t.code),e.setHeader(`content-type`,`application/json`),e.end(JSON.stringify({ok:!1,error:t.message,code:t.code}))}function hs(e,t){if(e.headersSent){e.destroy(t);return}let n=s(t);e.statusCode=ms(n.code),e.end(n.message)}function gs(e,t){return new a(`COMMAND_FAILED`,`${e.label} not found or expired: ${t}`,{reason:`RESOURCE_EXPIRED`,hint:e.expiredHint})}function _s(e,t,n,r){let i=e.get(t);if(!i)throw gs(r,t);if(i.tenantId&&i.tenantId!==n)throw new a(`UNAUTHORIZED`,`${r.label} ${r.plural?`belong`:`belongs`} to a different tenant`);return i}const vs=9e5,ys={label:`Artifact`,expiredHint:`Downloadable artifacts are removed after download or after ${vs/6e4} minutes. Re-run the command that produced the artifact and download it again.`},bs=new Map;function xs(e){let t=P.randomUUID(),n=Date.now(),r=setTimeout(()=>{Ns(t)},vs);return r.unref(),bs.set(t,{artifactPath:e.artifactPath,tenantId:e.tenantId,artifactType:e.artifactType,fileName:e.fileName,...e.displayRotation===void 0?{}:{displayRotation:e.displayRotation},deleteAfterDownload:e.deleteAfterDownload!==!1,createdAt:n,timer:r}),t}async function Ss(e,t){let{entry:n,stat:r}=Ts(e,t),i=await Es(e,n,r);if(!i)throw new a(`COMMAND_FAILED`,`Artifact path is not a regular file or directory: ${n.artifactPath}`);return i}async function Cs(e){let t=[];for(let[n,r]of bs){if(!As(r,e))continue;let i;try{i=F.statSync(r.artifactPath)}catch{Ns(n);continue}let a=await ws(n,r,i);a&&t.push({id:n,...r.artifactType===void 0?{}:{artifactType:r.artifactType},filename:a.fileName??n,mimeType:a.mimeType,sizeBytes:a.sizeBytes,createdAt:new Date(r.createdAt).toISOString(),expiresAt:new Date(r.createdAt+vs).toISOString(),...r.displayRotation===void 0?{}:{displayRotation:r.displayRotation}})}return t}async function ws(e,t,n){try{return await Es(e,t,n)}catch{return null}}function Ts(e,t){let n=_s(bs,e,t,ys),r;try{r=F.statSync(n.artifactPath)}catch{throw Ns(e),new a(`COMMAND_FAILED`,`Artifact file is missing: ${n.artifactPath}`)}return{entry:n,stat:r}}async function Es(e,t,n){if(n.isFile())return{artifactPath:t.artifactPath,fileName:js(t.fileName,e),mimeType:`application/octet-stream`,sizeBytes:n.size};if(!n.isDirectory())return null;let r=await Ds(e,t);return{artifactPath:r.archivePath,fileName:r.fileName,mimeType:`application/gzip`,sizeBytes:r.sizeBytes}}async function Ds(e,t){if(t.directoryArchive&&F.existsSync(t.directoryArchive.archivePath))return t.directoryArchive;if(t.directoryArchivePromise)return await t.directoryArchivePromise;let n=Os(e,t);t.directoryArchivePromise=n;try{return await n}finally{t.directoryArchivePromise===n&&(t.directoryArchivePromise=void 0)}}async function Os(e,t){Ps(t);let n=ks(js(t.fileName,I.basename(t.artifactPath)||e)),r=F.mkdtempSync(I.join(qr.tmpdir(),`agent-device-download-${P.randomUUID()}-`)),i=I.join(r,n);try{await Vt(`tar`,[`czf`,i,`-C`,I.dirname(t.artifactPath),`--`,I.basename(t.artifactPath)],{env:{...process.env,COPYFILE_DISABLE:`1`}});let a={archivePath:i,tempDir:r,fileName:n,sizeBytes:F.statSync(i).size};if(bs.get(e)!==t)throw F.rmSync(r,{recursive:!0,force:!0}),gs(ys,e);return t.directoryArchive=a,a}catch(e){throw F.rmSync(r,{recursive:!0,force:!0}),e instanceof a?e:new a(`COMMAND_FAILED`,`Failed to archive downloadable artifact: ${t.artifactPath}`,{artifactPath:t.artifactPath},e instanceof Error?e:void 0)}}function ks(e){let t=e.toLowerCase();return t.endsWith(`.tar.gz`)||t.endsWith(`.tgz`)?e:`${e}.tar.gz`}function As(e,t){return!e.tenantId||e.tenantId===t}function js(e,t){let n=e?.trim();return n&&!Ms(n)?n:t}function Ms(e){return e.includes(`/`)||e.includes(`\\`)||e.includes(`\0`)||e.includes(`\r`)||e.includes(`
5
+ `)}function Ns(e){let t=bs.get(e);if(t&&(clearTimeout(t.timer),bs.delete(e),Ps(t),t.deleteAfterDownload))try{F.rmSync(t.artifactPath,{recursive:!0,force:!0})}catch{}}function Ps(e){if(e.directoryArchive)try{F.rmSync(e.directoryArchive.tempDir,{recursive:!0,force:!0})}catch{}finally{e.directoryArchive=void 0}}const Fs=3e5,Is={label:`Uploaded artifact`,expiredHint:`Uploaded artifacts expire ${Fs/6e4} minutes after upload. Upload the file again and retry with the new upload id.`},Ls=new Map;function Rs(e){let t=P.randomUUID(),n=setTimeout(()=>{Bs(t)},Fs);return n.unref(),Ls.set(t,{artifactPath:e.artifactPath,tempDir:e.tempDir,tenantId:e.tenantId,timer:n}),t}function zs(e,t){let n=_s(Ls,e,t,Is);return clearTimeout(n.timer),n.artifactPath}function Bs(e){let t=Ls.get(e);t&&(clearTimeout(t.timer),Ls.delete(e),F.rmSync(t.tempDir,{recursive:!0,force:!0}))}async function Vs(e){let t=I.join(e.tempDir,`extracted`),n=``,r=await Hs(e.archivePath);await Sn({archivePath:e.archivePath,outputRoot:t,type:r,validateManifest:t=>{n=Us(t,e.platform,e.expectedRootName)}});let i=I.join(t,n);if(!F.existsSync(i))throw F.rmSync(t,{recursive:!0,force:!0}),new a(`INVALID_ARGS`,`Expected extracted bundle "${n}" not found in archive`);return i}async function Hs(e){let t=await F.promises.open(e,`r`);try{let e=Buffer.alloc(2),{bytesRead:n}=await t.read(e,0,e.length,0);return n===e.length&&e[0]===31&&e[1]===139?`tgz`:`tar`}finally{await t.close()}}function Us(e,t,n){if(e.length===0)throw new a(`INVALID_ARGS`,`Uploaded app bundle archive is empty`);let r=new Set(e.map(e=>e.name.split(`/`)[0]).filter(e=>!!e)),i=n??Ws([...r],t);if(!r.has(i))throw new a(`INVALID_ARGS`,`Uploaded archive must contain a top-level "${i}" bundle`);for(let t of e)if(t.name!==i&&!t.name.startsWith(`${i}/`))throw new a(`INVALID_ARGS`,`Archive entry must stay inside top-level "${i}" bundle: ${t.name}`);return i}function Ws(e,t){if(t===`ios`){let t=e.filter(e=>e.toLowerCase().endsWith(`.app`));if(t.length===1)return t[0];throw t.length===0?new a(`INVALID_ARGS`,`iOS app bundle archives must contain a single top-level .app directory`):new a(`INVALID_ARGS`,`iOS app bundle archives must contain exactly one top-level .app directory, found: ${t.join(`, `)}`)}if(e.length===1)return e[0];throw new a(`INVALID_ARGS`,`Archive must contain a single top-level bundle, found: ${e.join(`, `)}`)}const Gs=6e4;function Ks(e){let t=e.trim(),n=I.basename(t);if(!n||n===`.`||n===`..`)throw new a(`INVALID_ARGS`,`Invalid artifact filename: ${e}`);return n}function qs(e){let t=Zs(e);return F.mkdtempSync(I.join(qr.tmpdir(),`agent-device-artifact-${t}-`))}function Js(e){if(e===void 0)return;let t=String(e);if(!/^\d+$/.test(t))throw new a(`INVALID_ARGS`,`Invalid content-length header`);let n=Number(t);if(!Number.isSafeInteger(n))throw new a(`INVALID_ARGS`,`Invalid content-length header`);if(n>2147483648)throw new a(`INVALID_ARGS`,`Upload exceeds maximum size of ${xn} bytes`)}function Ys(e,t){return new Promise((n,r)=>{let i=!1,o,s=F.createWriteStream(t),c=e=>{if(!i){if(i=!0,o&&clearTimeout(o),e){Xs(s,t).finally(()=>r(e));return}n()}},l=()=>{o&&clearTimeout(o),o=setTimeout(()=>{let t=new a(`COMMAND_FAILED`,`Artifact transfer timed out due to inactivity`,{timeoutMs:Gs});`destroy`in e&&typeof e.destroy==`function`&&e.destroy(t),u.destroy(t),c(t)},Gs)},u=Cn({maxBytes:xn,createLimitError:()=>new a(`INVALID_ARGS`,`Upload exceeds maximum size of ${xn} bytes`)});u.on(`data`,l),e.on(`aborted`,()=>{c(new a(`COMMAND_FAILED`,`Artifact transfer was interrupted`))}),l(),Jr(e,u,s).then(()=>c(),e=>c(e))})}async function Xs(e,t){if(e.destroy(),!e.closed)try{await Qr(e,`close`)}catch{}await F.promises.rm(t,{force:!0}).catch(()=>{})}function Zs(e){let t=e?.trim();if(!t)return`request`;let n=t.replaceAll(/[^a-zA-Z0-9._-]+/g,`-`).replaceAll(/^-+|-+$/g,``);return n.length>0?n.slice(0,48):`request`}function Qs(e,t){let n=Array.isArray(e)?e[0]:e;if(!n)return;let r=n.match(/^bytes (\d+)-(\d+)\/(\d+)$/);r||ec();let i=Number(r[1]),a=Number(r[2]),o=Number(r[3]);return(!Number.isSafeInteger(i)||!Number.isSafeInteger(a)||!Number.isSafeInteger(o)||i<0||a<i||a>=o||o<1||o!==t)&&ec(),{start:i,end:a,size:o,span:a-i+1}}function $s(e){if(e===void 0)return;if(!/^\d+$/.test(e))throw new a(`INVALID_ARGS`,`Invalid content-length header`);let t=Number(e);if(!Number.isSafeInteger(t)||t<0)throw new a(`INVALID_ARGS`,`Invalid content-length header`);return t}function ec(){throw new a(`INVALID_ARGS`,`Invalid content-range header`)}async function tc(e){let t=await rc(e.entry),n=Qs(e.req.headers[`content-range`],e.entry.sizeBytes);if(n&&n.start!==t||!n&&t>0)return{complete:!1,offset:t,appended:!1};let r=e.entry.sizeBytes-t,i=n?.span??r,o=$s(e.req.headers[`content-length`]);if(o!==void 0&&o>i)throw new a(`INVALID_ARGS`,`Upload chunk exceeds its permitted byte range`);if(n&&o!==void 0&&o!==n.span)throw new a(`INVALID_ARGS`,`Upload chunk length does not match content-range`);let s=Cn({maxBytes:i,createLimitError:()=>new a(`INVALID_ARGS`,`Upload chunk exceeds its permitted byte range`)});try{if(await Jr(e.req,s,F.createWriteStream(e.entry.payloadPath,{flags:`a`})),n&&s.bytesSeen!==n.span)throw new a(`INVALID_ARGS`,`Upload chunk length does not match content-range`);if(o!==void 0&&s.bytesSeen!==o)throw new a(`INVALID_ARGS`,`Upload chunk length does not match content-length`)}catch(n){throw await ic(e.entry.payloadPath,t,n,e.invalidate),n}let c=await rc(e.entry);return{complete:c===e.entry.sizeBytes,offset:c,appended:c>t}}async function nc(e){let t=P.createHash(`sha256`);for await(let n of F.createReadStream(e))t.update(n);return t.digest(`hex`)}async function rc(e){let t=(await F.promises.stat(e.payloadPath).catch(e=>{if(e.code!==`ENOENT`)throw e}))?.size??0;if(t>e.sizeBytes)throw new a(`COMMAND_FAILED`,`Upload state is corrupt`,{reason:`UPLOAD_STATE_CORRUPT`});return t}async function ic(e,t,n,r){try{await F.promises.truncate(e,t)}catch(e){let t=new a(`COMMAND_FAILED`,`Upload rollback failed; the upload ticket was invalidated`,{reason:`UPLOAD_ROLLBACK_FAILED`,originalError:String(n)},e);throw await r(t),t}}const ac=3e5,oc={label:`Upload`,expiredHint:`Resumable uploads expire ${ac/6e4} minutes after the last received chunk. Start the upload again from the beginning.`},sc=new Map,cc=new Map;function lc(e){Sc(e);let t=Cc(e),n=cc.get(t),r=(n?sc.get(n):void 0)??fc(e,t);return{uploadId:r.id,cacheHit:!1,upload:{url:new URL(`upload/direct/${r.id}`,e.baseUrl.endsWith(`/`)?e.baseUrl:`${e.baseUrl}/`).toString(),headers:{...e.tokenHeaders,"content-type":e.contentType||`application/octet-stream`}}}}async function uc(e){let t=xc(e.uploadId,e.tenantId);return await hc(t,`receive`,e.req,async()=>{let{appended:n,...r}=await tc({entry:t,req:e.req,invalidate:async()=>await yc(t)});return n&&!t.closed&&pc(t),r})}async function dc(e,t){let n=xc(e,t);return await hc(n,`finalize`,void 0,async()=>{let t=F.statSync(n.payloadPath).size;if(t!==n.sizeBytes)throw new a(`INVALID_ARGS`,`Upload is incomplete`,{uploadId:e,offset:t,sizeBytes:n.sizeBytes});try{let t=await nc(n.payloadPath);if(t!==n.sha256)throw new a(`INVALID_ARGS`,`Upload hash mismatch`,{uploadId:e,expectedSha256:n.sha256,actualSha256:t});let r=await gc(n);return _c(n),{artifactPath:r,tempDir:n.tempDir}}catch(e){throw await vc(n,e)}})}function fc(e,t){let n=P.randomUUID(),r=qs(`upload`),i=I.join(r,`payload`);F.writeFileSync(i,``);let a={id:n,key:t,tempDir:r,payloadPath:i,fileName:Ks(e.fileName),sizeBytes:e.sizeBytes,sha256:e.sha256.toLowerCase(),artifactType:e.artifactType,platform:e.platform,tenantId:e.tenantId,generation:0,tail:Promise.resolve(),closed:!1,finalized:!1};return sc.set(n,a),cc.set(t,n),pc(a),a}function pc(e){e.timer&&clearTimeout(e.timer),e.generation+=1;let t=e.generation;e.timer=setTimeout(()=>mc(e,t),ac),e.timer.unref()}function mc(e,t){if(e.generation!==t||e.closed)return;bc(e);let n=e.activeReceive;n?.once(`error`,()=>{}),n?.destroy(new a(`COMMAND_FAILED`,`Upload expired while receiving data`,{reason:`RESOURCE_EXPIRED`})),e.tail=e.tail.then(async()=>{e.finalized||await F.promises.rm(e.tempDir,{recursive:!0,force:!0})}).catch(()=>{})}async function hc(e,t,n,r){let i=e.tail.catch(()=>{}).then(async()=>{e.closed&&xc(e.id,e.tenantId),t===`receive`&&(e.activeReceive=n);try{return await r()}finally{t===`receive`&&(e.activeReceive=void 0)}});return e.tail=i.then(()=>{},()=>{}),await i}async function gc(e){if(e.artifactType===`file`){let t=I.join(e.tempDir,e.fileName);return await F.promises.rename(e.payloadPath,t),t}let t=await Vs({archivePath:e.payloadPath,tempDir:e.tempDir,platform:e.platform===`android`?`android`:`ios`,expectedRootName:e.fileName});return await F.promises.rm(e.payloadPath,{force:!0}),t}function _c(e){e.finalized=!0,bc(e)}async function vc(e,t){bc(e);try{return await F.promises.rm(e.tempDir,{recursive:!0,force:!0}),t}catch(e){return new a(`COMMAND_FAILED`,`Upload finalize cleanup failed`,{reason:`UPLOAD_FINALIZE_CLEANUP_FAILED`,originalError:String(t)},e)}}async function yc(e){bc(e),await F.promises.rm(e.tempDir,{recursive:!0,force:!0}).catch(()=>{})}function bc(e){e.closed=!0,e.timer&&clearTimeout(e.timer),sc.delete(e.id),cc.delete(e.key)}function xc(e,t){return _s(sc,e,t,oc)}function Sc(e){if(!/^[a-f0-9]{64}$/i.test(e.sha256))throw new a(`INVALID_ARGS`,`Invalid upload sha256`);if(!Number.isSafeInteger(e.sizeBytes)||e.sizeBytes<0)throw new a(`INVALID_ARGS`,`Invalid upload sizeBytes`);if(Js(String(e.sizeBytes)),Ks(e.fileName),!e.uploadAttemptId.trim())throw new a(`INVALID_ARGS`,`uploadAttemptId is required`)}function Cc(e){return[e.tenantId??``,e.uploadAttemptId,e.sha256.toLowerCase(),String(e.sizeBytes),Ks(e.fileName),e.artifactType,e.platform??``].join(`\0`)}async function wc(e){let t=e.headers[`x-artifact-type`],n=e.headers[`x-artifact-filename`];if(!t||!n)throw new a(`INVALID_ARGS`,`Missing required headers: x-artifact-type and x-artifact-filename`);if(t!==`file`&&t!==`app-bundle`)throw new a(`INVALID_ARGS`,`Invalid x-artifact-type: ${t}. Must be "file" or "app-bundle".`);Js(e.headers[`content-length`]);let r=Ks(n),i=qs(`upload`);try{if(t===`file`){let t=I.join(i,r);return await Ys(e,t),{artifactPath:t,tempDir:i}}let n=I.join(i,`artifact.tar`);await Ys(e,n);let a=await Vs({archivePath:n,tempDir:i,platform:`ios`,expectedRootName:r});return F.rmSync(n,{force:!0}),{artifactPath:a,tempDir:i}}catch(e){throw F.rmSync(i,{recursive:!0,force:!0}),e}}function Tc(e){let{req:t,res:n,authorize:r,token:i}=e,a=Dc(t);return a!==null&&(Ec(a,t,n,r,i),!0)}async function Ec(e,t,n,r,i){switch(e.kind){case`preflight`:await kc(t,n,r,i);return;case`direct`:await Ac(e.uploadId,t,n,r);return;case`finalize`:await jc(t,n,r);return;case`upload`:await Oc(t,n,r);return}}function Dc(e){return e.method===`POST`&&e.url===`/upload/preflight`?{kind:`preflight`}:e.method===`PUT`&&e.url?.startsWith(`/upload/direct/`)?{kind:`direct`,uploadId:e.url.slice(15).replace(/\?.*$/,``)}:e.method===`POST`&&e.url===`/upload/finalize`?{kind:`finalize`}:e.method===`POST`&&e.url===`/upload`?{kind:`upload`}:null}async function Oc(e,t,n){try{let r=await n({req:e,res:t,daemonRequest:{command:`upload`,positionals:[]}});if(!r)return;Nc(t,await wc(e),r.tenantId)}catch(e){H(t,s(e))}}async function kc(e,t,n,r){try{let i=await n({req:e,res:t,daemonRequest:{command:`upload`,positionals:[`preflight`]}});if(!i)return;let a=Fc(await Pc(e,65536));Mc(t,{ok:!0,...lc({baseUrl:Hc(e),tokenHeaders:Vc(r),...a,tenantId:i.tenantId})})}catch(e){H(t,s(e))}}async function Ac(e,t,n,r){try{let i=await r({req:t,res:n,daemonRequest:{command:`upload`,positionals:[`direct`,e]}});if(!i)return;let a=await uc({uploadId:e,req:t,tenantId:i.tenantId});if(a.complete){n.statusCode=200,n.end(`ok`);return}n.statusCode=308,a.offset>0&&n.setHeader(`range`,`bytes=0-${a.offset-1}`),n.setHeader(`x-upload-offset`,String(a.offset)),n.end()}catch(e){H(n,s(e))}}async function jc(e,t,n){try{let r=await n({req:e,res:t,daemonRequest:{command:`upload`,positionals:[`finalize`]}});if(!r)return;Nc(t,await dc(Ic(await Pc(e,65536)).uploadId,r.tenantId),r.tenantId)}catch(e){H(t,s(e))}}function Mc(e,t){e.statusCode=200,e.setHeader(`content-type`,`application/json`),e.end(JSON.stringify(t))}function Nc(e,t,n){Mc(e,{ok:!0,uploadId:Rs({artifactPath:t.artifactPath,tempDir:t.tempDir,tenantId:n})})}async function Pc(e,t){let n=(await $t(e,t,`Request body is too large.`)).toString(`utf8`);try{let e=JSON.parse(n);if(!e||typeof e!=`object`||Array.isArray(e))throw Error(`expected object`);return e}catch(e){throw new a(`INVALID_ARGS`,`Invalid JSON request body`,{},e)}}function Fc(e){return{sha256:Lc(e,`sha256`),uploadAttemptId:Lc(e,`uploadAttemptId`),fileName:Lc(e,`fileName`),sizeBytes:zc(e,`sizeBytes`),artifactType:Bc(e),platform:Rc(e,`platform`),contentType:Rc(e,`contentType`)}}function Ic(e){return{uploadId:Lc(e,`uploadId`)}}function Lc(e,t){let n=Rc(e,t)?.trim();if(!n)throw new a(`INVALID_ARGS`,`${t} is required`);return n}function Rc(e,t){let n=e[t];return typeof n==`string`?n:void 0}function zc(e,t){let n=e[t];if(typeof n!=`number`||!Number.isSafeInteger(n))throw new a(`INVALID_ARGS`,`${t} must be an integer`);return n}function Bc(e){let t=Lc(e,`artifactType`);if(t===`file`||t===`app-bundle`)return t;throw new a(`INVALID_ARGS`,`artifactType must be "file" or "app-bundle"`)}function Vc(e){return{authorization:`Bearer ${e}`,"x-agent-device-token":e}}function Hc(e){let t=typeof e.headers.host==`string`?e.headers.host:``;if(!t)throw new a(`INVALID_ARGS`,`Missing host header`);let n=e.headers[`x-forwarded-proto`];return`${(Array.isArray(n)?n[0]:n)||`http`}://${t}`}function Uc(e){try{return decodeURIComponent(e)}catch{return``}}function Wc(e){let{req:t,res:n,authorize:r,retainArtifacts:i}=e,a=Kc(t);return a!==null&&(Gc(a,t,n,r,{retainArtifacts:i}),!0)}async function Gc(e,t,n,r,i){switch(e.kind){case`inventory`:await Jc(t,n,r);return;case`download`:await qc(e.artifactId,t,n,r,i);return}}function Kc(e){if(e.method!==`GET`)return null;let t=Xc(e.url);return t===`/artifacts`||t===`/artifacts/`?{kind:`inventory`}:t.startsWith(`/artifacts/`)?{kind:`download`,artifactId:Yc(t)}:null}async function qc(e,t,n,r,i){if(!e){n.statusCode=400,n.end(`Missing artifact id`);return}try{let a=await r({req:t,res:n,daemonRequest:{command:`download_artifact`,positionals:[e]}});if(!a)return;let o=await Ss(e,a.tenantId),s=i.retainArtifacts===!0,c=F.createReadStream(o.artifactPath);n.statusCode=200,n.setHeader(`content-type`,o.mimeType),n.setHeader(`content-length`,String(o.sizeBytes)),o.fileName&&n.setHeader(`content-disposition`,`attachment; filename="${o.fileName.replace(/"/g,``)}"`),c.on(`error`,e=>{hs(n,e)});let l=!1,u=()=>{l||s||(l=!0,Ns(e))},d=0;c.on(`data`,e=>{d+=e.length,d>=o.sizeBytes&&u()}),c.on(`end`,u),n.on(`finish`,u),n.on(`close`,()=>{n.writableFinished&&u()}),c.pipe(n)}catch(e){H(n,s(e))}}async function Jc(e,t,n){try{let r=await n({req:e,res:t,daemonRequest:{command:`list_artifacts`,positionals:[]}});if(!r)return;t.statusCode=200,t.setHeader(`content-type`,`application/json`),t.end(JSON.stringify({artifacts:await Cs(r.tenantId)}))}catch(e){H(t,s(e))}}function Yc(e){let t=e.slice(11);return!t||t.includes(`/`)?``:Uc(t)}function Xc(e){let t=e||`/`,n=t.indexOf(`?`);return n>=0?t.slice(0,n)||`/`:t}function Zc(e,t){return Qc(e,t)?t:`${e}:${t}`}function Qc(e,t){return t.startsWith(`${e}:`)}function $c(e,t){return!e.partitioned||Qc(e.tenant,t)}const el=[``,`sessions`,null,`requests`,null,`diagnostics`];function tl(e){let t=nl(e.req);return t!==null&&(rl(t,e),!0)}function nl(e){if(e.method!==`GET`)return null;let t=(e.url??``).split(`?`,1)[0].split(`/`);return t.length!==el.length||!el.every((e,n)=>e===null||t[n]===e)?null:{session:Uc(t[2]??``),requestId:Uc(t[4]??``)}}async function rl(e,t){let{req:n,res:r,authorize:i,resolveRecordPath:o}=t;try{if(!on(e.session)||!on(e.requestId)){H(r,s(new a(`INVALID_ARGS`,`Invalid session or request id in diagnostics route`)));return}let t=await i({req:n,res:r,daemonRequest:{command:`request_diagnostics`,positionals:[e.session,e.requestId]}});if(!t)return;if(t.sessionNamespace&&!$c(t.sessionNamespace,e.session)){H(r,s(new a(`UNAUTHORIZED`,`Session is outside this tenant`,{session:e.session})));return}let c=o(e),l=await il(c);if(!l){H(r,s(new a(`SESSION_NOT_FOUND`,`No diagnostics record for request ${e.requestId} in session ${e.session}`,{hint:`The daemon keeps a request record only for the session it ran in; re-run the command against this daemon to produce a fresh one.`})));return}let u=F.createReadStream(c);r.statusCode=200,r.setHeader(`content-type`,`application/x-ndjson`),r.setHeader(`content-length`,String(l.size)),u.on(`error`,e=>{hs(r,e)}),u.pipe(r)}catch(e){H(r,s(e))}}async function il(e){try{let t=await F.promises.stat(e);return t.isFile()?t:null}catch{return null}}function al(e){return(e??``).trim().toLowerCase()===`tenant`?`tenant`:`none`}function ol(e){if(!e)return;let t=e.trim();if(t&&/^[a-zA-Z0-9._-]{1,128}$/.test(t))return t}const sl=`default`;function cl(e){let t=Number.isInteger(e.defaultLeaseTtlMs)?Math.max(1,Number(e.defaultLeaseTtlMs)):6e4,n=Number.isInteger(e.minLeaseTtlMs)?Math.max(1,Number(e.minLeaseTtlMs)):Ie,r=Number.isInteger(e.maxLeaseTtlMs)?Math.max(n,Number(e.maxLeaseTtlMs)):6e5;return e=>{if(!Number.isInteger(e))return t;let i=Number(e);if(i<n||i>r)throw new a(`INVALID_ARGS`,`Lease ttlMs must be between ${n} and ${r}.`);return i}}function ll(e){if(!e)return;let t=e.trim();if(t&&/^[a-zA-Z0-9._-]{1,128}$/.test(t))return t}function ul(e){if(!e)return;let t=e.trim();if(t&&/^[a-f0-9]{16,128}$/i.test(t))return t.toLowerCase()}function dl(e){let t=ul(e);if(!t)throw new a(`INVALID_ARGS`,`Invalid lease id.`);return t}function fl(e){let t=(e??``).trim().toLowerCase();if(!t)return`ios-simulator`;let n=_.find(e=>e===t);if(n)return n;throw new a(`INVALID_ARGS`,`Unsupported lease backend: ${e??``}`)}function pl(e){if(e===void 0)return;let t=e.trim();if(!t||t.length>256||!/^[\u0020-\u007E]+$/.test(t))throw new a(`INVALID_ARGS`,`Invalid device key. Use 1-256 printable characters.`);return t}function ml(e){return gl(e,`client id`,128)}function hl(e){return gl(e,`lease provider`,64)}function gl(e,t,n){if(e===void 0)return;let r=e.trim();if(!r||r.length>n||!/^[a-zA-Z0-9._-]+$/.test(r))throw new a(`INVALID_ARGS`,`Invalid ${t}. Use 1-${String(n)} chars: letters, numbers, dot, underscore, hyphen.`);return r}function _l(e){let t=ol(e);if(!t)throw new a(`INVALID_ARGS`,`Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.`);return t}function vl(e){let t=ll(e);if(!t)throw new a(`INVALID_ARGS`,`Invalid run id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.`);return t}function yl(e){return{backend:fl(e.leaseBackend),leaseProvider:hl(e.leaseProvider),deviceKey:pl(e.deviceKey),clientId:ml(e.clientId),tenantId:_l(e.tenantId),runId:vl(e.runId),ttlMs:e.ttlMs,retainOnClose:e.retainOnClose}}function bl(e){return!!(e.leaseProvider??e.deviceKey??e.clientId)}function xl(e,t){return!t.tenantId||!t.runId?!1:[[e.leaseProvider,t.leaseProvider],[e.deviceKey,t.deviceKey],[e.clientId,t.clientId]].every(([e,t])=>!e||!!t)}function Sl(e,t){let n=wl(t);if(n.tenantId&&e.tenantId!==n.tenantId||n.runId&&e.runId!==n.runId||n.leaseBackend&&e.backend!==n.leaseBackend||n.leaseProvider&&e.leaseProvider!==n.leaseProvider||n.deviceKey&&e.deviceKey!==n.deviceKey||n.clientId&&e.clientId!==n.clientId)throw new a(`UNAUTHORIZED`,`Lease does not match tenant/run scope`,{reason:`LEASE_SCOPE_MISMATCH`})}function Cl(e){let t=fl(e.leaseBackend),n=ol(e.tenantId);if(!n)throw new a(`INVALID_ARGS`,`tenant isolation requires tenant id.`);let r=ll(e.runId);if(!r)throw new a(`INVALID_ARGS`,`tenant isolation requires run id.`);let i=ul(e.leaseId);if(!i)throw new a(`INVALID_ARGS`,`tenant isolation requires lease id.`);return{...e,tenantId:n,runId:r,leaseId:i,leaseBackend:t}}function wl(e){let t=ol(e.tenantId),n=ll(e.runId);if(e.tenantId&&!t)throw new a(`INVALID_ARGS`,`Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.`);if(e.runId&&!n)throw new a(`INVALID_ARGS`,`Invalid run id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.`);return{tenantId:t,runId:n,leaseBackend:e.leaseBackend?fl(e.leaseBackend):void 0,leaseProvider:hl(e.leaseProvider),deviceKey:pl(e.deviceKey),clientId:ml(e.clientId)}}function Tl(e,t){if(bl(e)&&!xl(e,t))throw new a(`UNAUTHORIZED`,`Lease owner scope is required`,{reason:`LEASE_SCOPE_REQUIRED`})}function El(e,t){return e.tenantId===t.tenantId&&e.runId===t.runId&&e.backend===t.backend&&e.leaseProvider===t.leaseProvider&&e.deviceKey===t.deviceKey&&e.clientId===t.clientId}function U(e){if(e.deviceKey)return JSON.stringify([e.backend,e.leaseProvider??sl,e.deviceKey])}function Dl(e){return JSON.stringify([e.tenantId,e.runId,e.backend,e.leaseProvider??sl,e.deviceKey??`*`])}function Ol(e,t,n){return{leaseId:P.randomBytes(16).toString(`hex`),tenantId:e.tenantId,runId:e.runId,backend:e.backend,...e.leaseProvider?{leaseProvider:e.leaseProvider}:{},...e.deviceKey?{deviceKey:e.deviceKey}:{},...e.clientId?{clientId:e.clientId}:{},...e.retainOnClose?{retainOnClose:!0}:{},createdAt:n,heartbeatAt:n,expiresAt:n+t}}function kl(e){return e.expiresAt-e.heartbeatAt}function Al(e){return new a(`DEVICE_IN_USE`,`Device is already leased`,{reason:`DEVICE_LEASE_BUSY`,deviceKey:e.deviceKey,backend:e.backend,leaseProvider:e.leaseProvider,expiresAt:e.expiresAt,hint:`Retry after the lease expires or close the owning session.`})}function jl(e){return Ae({leaseId:e.leaseId,tenantId:e.tenantId,runId:e.runId,leaseBackend:e.backend,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey,clientId:e.clientId})}function Ml(e){let t=Pl(e,`Human-control request body`),n=t.reason;if(n!==void 0&&(typeof n!=`string`||n.trim().length>512))throw new a(`INVALID_ARGS`,`Human-control reason must be at most 512 characters.`);let r=t.ttlMs;if(r!==void 0&&(typeof r!=`number`||!Number.isInteger(r)||r<1e3||r>864e5))throw new a(`INVALID_ARGS`,`Human-control ttlMs must be between 1000 and 86400000.`);return{...t.scope===void 0?{}:{scope:Nl(t.scope)},...typeof n==`string`&&n.trim()?{reason:n.trim()}:{},...typeof r==`number`?{ttlMs:r}:{}}}function Nl(e){let t=Pl(e,`Host human-control scope`);if(typeof t.backend!=`string`||!t.backend.trim()||typeof t.deviceKey!=`string`)throw new a(`INVALID_ARGS`,`Host human control requires scope.backend and scope.deviceKey.`);if(t.leaseProvider!==void 0&&typeof t.leaseProvider!=`string`)throw new a(`INVALID_ARGS`,`scope.leaseProvider must be a string.`);let n=hl(t.leaseProvider);return{backend:fl(t.backend),deviceKey:pl(t.deviceKey),...n?{leaseProvider:n}:{}}}function Pl(e,t){if(!e||typeof e!=`object`||Array.isArray(e))throw new a(`INVALID_ARGS`,`${t} must be an object.`);return e}function Fl(e){let t=typeof e==`string`?e.trim():``;if(!/^[a-zA-Z0-9._-]{1,128}$/.test(t))throw new a(`INVALID_ARGS`,`Invalid human-control hold id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.`);return t}function Il(e){return{...e,scope:{...e.scope}}}function Ll(e){return new a(`DEVICE_IN_USE`,`A human is interacting with this simulator or device; agent interactions are temporarily disabled.`,{reason:`human_control_active`,blockedBy:`human_control`,holdId:e.id,deviceKey:e.scope.deviceKey,pausedAt:new Date(e.createdAt).toISOString(),...e.expiresAt===void 0?{}:{expiresAt:new Date(e.expiresAt).toISOString()},...e.reason?{humanReason:e.reason}:{},hint:`Wait until the human-control hold is released before retrying.`})}function Rl(e){let t=Wl(e.req);return t?(zl(t,e),!0):!1}async function zl(e,t){let{req:n,res:r,expectedToken:i}=t;try{Jl(n,i),await Bl(e,t)}catch(e){H(r,s(e))}}async function Bl(e,t){switch(e.kind){case`list`:W(t.res,{ok:!0,holds:t.registry.listHumanControlHolds({kind:`host`})});return;case`upsert`:await Vl(e.holdId,t);return;case`remove`:Hl(e.holdId,t);return;case`unsupported`:Ul(t.res);return;case`invalid`:throw new a(`INVALID_ARGS`,`Invalid request URL.`)}}async function Vl(e,t){let{req:n,res:r}=t,a=new AbortController,o=()=>{r.writableFinished||a.abort(i())};n.once(`aborted`,o),r.once(`close`,o),(n.aborted||r.destroyed)&&o();try{let i=await ql(n);W(r,{ok:!0,hold:await t.registry.putHumanControlHold({kind:`host`},e,i,a.signal),state:`active`})}finally{n.off(`aborted`,o),r.off(`close`,o)}}function Hl(e,t){let n=t.registry.removeHumanControlHold({kind:`host`},e);W(t.res,{ok:!0,released:!!n,...n?{hold:n}:{}})}function Ul(e){e.statusCode=405,e.setHeader(`allow`,`GET, PUT, DELETE`),W(e,{ok:!1,error:`Method not allowed`,code:`INVALID_ARGS`})}function Wl(e){let t=Kl(e.url);return t===null?{kind:`invalid`}:Gl(t,e.method)}function Gl(e,t){if(e===`/admin/human-control/holds`)return t===`GET`?{kind:`list`}:{kind:`unsupported`};if(!e.startsWith(`/admin/human-control/holds/`))return null;let n=e.slice(27);return!n||n.includes(`/`)?{kind:`unsupported`}:t===`PUT`?{kind:`upsert`,holdId:n}:t===`DELETE`?{kind:`remove`,holdId:n}:{kind:`unsupported`}}function Kl(e){try{return new URL(e??`/`,`http://127.0.0.1`).pathname}catch{return null}}async function ql(e){return Ml(await Yl(e,`Human-control`))}function Jl(e,t){let n=typeof e.headers.authorization==`string`?e.headers.authorization:``,r=n.toLowerCase().startsWith(`bearer `)?n.slice(7):``,i=(typeof e.headers[`x-agent-device-token`]==`string`?e.headers[`x-agent-device-token`]:``)||r;if(!i||!gn(i,t))throw new a(`UNAUTHORIZED`,`Invalid token`)}async function Yl(e,t){let n=await $t(e,16384,`${t} request body is too large.`);try{return JSON.parse(n.toString(`utf8`))}catch(e){throw new a(`INVALID_ARGS`,`${t} request body must be valid JSON.`,{},e)}}function W(e,t){e.statusCode||=200,e.setHeader(`content-type`,`application/json`),e.end(JSON.stringify(t))}const Xl=wt(St),Zl=gu(Xl);function Ql(e){return G(e)?.route??`generic`}function $l(e){return G(e)?.sessionKind}function eu(e){return G(e)?.leaseAdmissionExempt===!0}function tu(e){return G(e)?.appLease===`allowed`}function nu(e){return G(e)?.selectorValidationExempt!==!0}function ru(e){return G(e)?.sessionExecutionLockExempt!==!0}function iu(e){return G(e)?.replayScopedAction===!0}function au(e){return G(e)?.allowInvalidRecording!==!0}function ou(e){return G(e)?.saveScriptFlagOwner===!0}function su(){return Xl.filter(e=>e.saveScriptFlagOwner===!0).map(e=>e.command).sort()}function cu(e){return G(e)?.lockPolicySelectorOverride===!0}function lu(e){return G(e)?.androidBlockingDialogGuard===!0}function uu(e){if(e.command===`human_control`||e.command===`lease_heartbeat`)return!1;let t=gt(e);return t===void 0?$l(e.command)!==`observability`&&yt(e.command)!==`observe`:t!==`observes-app`}function du(e){return G(e.command)?.preferExplicitDeviceOverExistingSession===!0}function fu(e){let t=G(e.command)?.allowSessionlessDefaultDevice;return typeof t==`function`&&t(e)}function pu(e){return G(e.command)?.sessionlessLeaseAdmissionExemption?.(e)}function mu(e){let t=G(e.command)?.refFrameEffect;return typeof t==`function`?t(e):t}function hu(e,t){return t.hasExistingSession?du(e)&&t.hasExplicitDeviceIdentity?`explicit-device`:`existing-session`:_u(e)?`skip`:t.hasDeviceSelectionInput?`explicit-device`:fu(e)?`sessionless-default-device`:`skip`}function G(e){return Zl.descriptorsByCommand.get(e)}function gu(e){let t=new Map;for(let n of e){if(t.has(n.command))throw Error(`Duplicate daemon command descriptor: ${n.command}`);t.set(n.command,n)}return{descriptorsByCommand:t}}function _u(e){let t=G(e.command);if(t?.route===`lease`)return!0;let n=t?.skipSessionlessProviderDevice;return typeof n==`function`&&n(e)}const vu=/^[A-Za-z0-9_-]+(?:\.[A-Za-z0-9_-]+)+$/,yu=/^[1-9][0-9]{0,9}$/;function bu(e){let t=e?.trim()??``,n=t.lastIndexOf(`@`),r=n<0?t:t.slice(0,n),i=n<0?void 0:t.slice(n+1);if(!vu.test(r)||i!==void 0&&!yu.test(i))throw new a(`INVALID_ARGS`,`A macos-app lease device key must be <bundleId> or <bundleId>@<pid>.`,{deviceKey:t});return i===void 0?{bundleId:r}:{bundleId:r,pid:Number(i)}}const xu=new Set([`open`,`batch`]),Su=[`out`,`saveScript`,`sessionSaveScript`,`baseline`,`launchConsole`,`launchArgs`,`launchUrl`,`bundleUrl`,`artifactsDir`,`stepsFile`,`searchPath`,`retainPaths`,`installSource`,`metroProjectRoot`,`metroRuntimeFile`,`iosXctestrunFile`,`iosXctestDerivedDataPath`,`iosXctestEnvDir`],Cu=[`device`,`udid`,`serial`,`target`,`iosSimulatorDeviceSet`,`androidDeviceAllowlist`];function K(e,t,n={}){return new a(`UNAUTHORIZED`,t,{...n,reason:`MACOS_APP_LEASE_DENIED`,rule:e,retriable:!1,hint:`This lease is limited to one macOS app; retrying will not help. Use an allowed command on the leased app.`})}function wu(e,t,n){if(e.backend!==`macos-app`)return;let r=bu(e.deviceKey);if(Eu(r,t.command,t.positionals??[],Tu(t.runtime,{...t.input,...t.flags})),(t.command===`open`||t.command===`batch`)&&t.flags?.platform!==`macos`)throw K(`device`,`A macos-app lease needs platform macos on ${t.command}.`);if(t.command===`batch`)for(let e of t.flags?.batchSteps??[]){let t=Array.isArray(e.positionals)?e.positionals.map(String):[];Eu(r,Et(e.command),t,Tu(e.runtime,{...e.input,...e.flags}))}if(n)Nu(r,n);else if(!xu.has(t.command))throw K(`session`,`A macos-app lease runs ${t.command} only in a session of ${r.bundleId}; open it first.`,{command:t.command,bundleId:r.bundleId})}function Tu(e,t){return{...t,...e?.launchUrl?{launchUrl:e.launchUrl}:{},...e?.bundleUrl?{bundleUrl:e.bundleUrl}:{}}}function Eu(e,t,n,r){if(!tu(t))throw K(`command`,`A macos-app lease does not allow ${t}.`,{command:t});if(Au(r),ku(r),t===`screenshot`?Du(n,r):Ou(r),t===`open`&&ju(e,n),t===`close`&&n.length>0&&n[0]!==e.bundleId)throw K(`app`,`A macos-app lease only closes ${e.bundleId}.`,{bundleId:e.bundleId})}function Du(e,t){if(t.screenshotFullscreen===!0)throw K(`capture`,`A macos-app lease captures only the app window.`);let{out:n,...r}=t;Ou(r);for(let t of[e[0],n])if(!(t===void 0||typeof t==`string`&&qt(t,`screenshot`,`.png`)))throw K(`host-path`,`A macos-app lease does not write files on the host.`)}function Ou(e){let t=Su.find(t=>e[t]!==void 0&&e[t]!==!1);if(t)throw K(`host-path`,`A macos-app lease does not accept ${t}, which names a host path or launch.`,{field:t})}function ku(e){let t=Cu.find(t=>e[t]!==void 0&&e[t]!==``);if(t)throw K(`device`,`A macos-app lease does not accept the ${t} device selector.`,{field:t})}function Au(e){if(e.surface!==void 0&&e.surface!==`app`)throw K(`surface`,`A macos-app lease is limited to the app surface, not ${String(e.surface)}.`,{surface:e.surface});if(e.platform!==void 0&&e.platform!==`macos`)throw K(`app`,`A macos-app lease only drives a macOS app.`,{platform:e.platform})}function ju(e,t){if(t.length!==1||t[0]!==e.bundleId)throw K(`app`,`A macos-app lease only opens ${e.bundleId}.`,{bundleId:e.bundleId});Mu()}function Mu(){if(Pt(It)!==`native`)throw K(`backend`,`A macos-app lease needs the native macOS app backend (AGENT_DEVICE_MACOS_APP_BACKEND=native).`)}function Nu(e,t){if(!et(t.device)||(t.surface??`app`)!==`app`||t.appBundleId!==e.bundleId)throw K(`app`,`This session is not the leased app ${e.bundleId}.`,{bundleId:e.bundleId})}const Pu=/bundleID="([^"]+)"/,Fu=async e=>{if(!Rt(e))return;let t=await Vt(`/usr/bin/lsappinfo`,[`info`,`-only`,`bundleid`,String(e)],{allowFailure:!0,timeoutMs:5e3});return Pu.exec(t.stdout)?.[1]};async function Iu(e,t=Fu){if(e.backend!==`macos-app`)return;let n=bu(e.deviceKey);if(n.pid!==void 0&&await t(n.pid)!==n.bundleId)throw K(`process`,`The leased app process ${n.bundleId}@${n.pid} is no longer running.`,{bundleId:n.bundleId,pid:n.pid})}const Lu=[`sessionStateDir`,`runnerLogPath`,`requestLogPath`,`eventLogPath`,`device`,`id`,`kind`,`serial`,`device_udid`,`ios_simulator_device_set`],Ru=/(?<![\p{L}\p{N}_./])\/(?:Users|home|private|var|tmp|Volumes|Library|Applications|opt|System|usr|etc|Network|cores)(?:\/[\p{L}\p{N}_.@%+~-]+)*\/?/gu;function zu(){return{hostName:qr.hostname(),homeDirectory:qr.homedir()}}function Bu(e,t,n=zu()){return t.ok?{ok:!0,data:Vu(e,t.data,n)}:{ok:!1,error:Hu(t.error,n)}}function Vu(e,t,n){if(!t)return t;let{fallbackScreenshotPath:r,...i}=t;if(e!==`open`)return i;for(let e of Lu)delete i[e];let{snapshot:a,initialSnapshotError:o,warnings:s,...c}=i;return{...c,...a===void 0?{}:{snapshot:Vu(`snapshot`,a,n)},...o===void 0?{}:{initialSnapshotError:Hu(o,n)},...s===void 0?{}:{warnings:Uu(s,n)}}}function Hu(e,t){let{logPath:n,diagnosticsRecord:r,...i}=e;return Uu(i,t)}function Uu(e,t){return typeof e==`string`?Wu(e,t):Array.isArray(e)?e.map(e=>Uu(e,t)):typeof e!=`object`||!e?e:Object.fromEntries(Object.entries(e).map(([e,n])=>[e,Uu(n,t)]))}function Wu(e,t){let n=e;if(t.homeDirectory.length>1){let e=t.homeDirectory.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`);n=n.replaceAll(RegExp(`${e}[\\w.@%+~/-]*`,`g`),`<host-path>`)}for(let e of new Set([t.hostName,t.hostName.split(`.`)[0]]))e.length>=4&&(n=n.replaceAll(e,`<host>`));return n.replace(Ru,`<host-path>`)}function Gu(e,t){if(!(t===void 0||!e.hasHeldMacOsAppLease(t)))throw K(`diagnostics`,`A macos-app lease does not serve request diagnostics.`)}const Ku=new Set([`tenantId`,`runId`,`clientId`,`leaseBackend`,`leaseProvider`,`deviceKey`,`ttlMs`,`retainOnClose`]);function qu(e){return Ju(e)||Rl(e)}function Ju(e){let t=Zu(e.req);return t?(Yu(t,e).catch(t=>{H(e.res,s(t))}),!0):!1}async function Yu(e,t){let{req:n,res:r,registry:i}=t;switch(Jl(n,t.expectedToken),e.kind){case`list`:W(r,{ok:!0,leases:i.listActiveLeases().filter(Xu)});return;case`put`:{let t=ed(await Yl(n,`Host lease`));W(r,{ok:!0,lease:i.putHostLease(e.leaseId,t)});return}case`remove`:{let t=dl(e.leaseId),n=i.listActiveLeases().find(e=>e.leaseId===t),a=n?i.releaseLease(jl(n)).released:!1;W(r,{ok:!0,released:a,...n&&a?{lease:n}:{}});return}case`unsupported`:r.statusCode=405,r.setHeader(`allow`,`GET, PUT, DELETE`),W(r,{ok:!1,error:`Method not allowed`,code:`INVALID_ARGS`});return}}function Xu(e){return e.backend===`macos-app`}function Zu(e){let t=URL.parse(e.url??`/`,`http://127.0.0.1`)?.pathname??``;return t===`/admin/leases`?e.method===`GET`?{kind:`list`}:{kind:`unsupported`}:t.startsWith(`/admin/leases/`)?Qu(t.slice(14),e.method):null}function Qu(e,t){let n=$u[t??``];return!n||!e||e.includes(`/`)?{kind:`unsupported`}:{kind:n,leaseId:e}}const $u={PUT:`put`,DELETE:`remove`};function ed(e){let t=td(e);return bu(id(t,`deviceKey`)),{tenantId:id(t,`tenantId`)??``,runId:id(t,`runId`)??``,clientId:id(t,`clientId`),leaseBackend:`macos-app`,leaseProvider:id(t,`leaseProvider`),deviceKey:id(t,`deviceKey`),ttlMs:nd(t),retainOnClose:rd(t)}}function td(e){if(typeof e!=`object`||!e||Array.isArray(e))throw new a(`INVALID_ARGS`,`Host lease request body must be a JSON object.`);let t=e,n=Object.keys(t).filter(e=>!Ku.has(e));if(n.length>0)throw new a(`INVALID_ARGS`,`Unknown host lease field(s): ${n.join(`, `)}.`);if(t.leaseBackend!==`macos-app`)throw new a(`INVALID_ARGS`,`The host lease route allocates only macos-app leases.`);return t}function nd(e){if(e.ttlMs===void 0||Number.isInteger(e.ttlMs))return e.ttlMs;throw new a(`INVALID_ARGS`,`Host lease ttlMs must be an integer.`)}function rd(e){if(e.retainOnClose===void 0)return!0;if(typeof e.retainOnClose==`boolean`)return e.retainOnClose;throw new a(`INVALID_ARGS`,`Host lease retainOnClose must be a boolean.`)}function id(e,t){let n=e[t];if(n!==void 0){if(typeof n!=`string`)throw new a(`INVALID_ARGS`,`Host lease ${t} must be a string.`);return n}}function ad(e){let{hookConfigured:t,hookAttestedTenant:n,clientDeclaredTenant:r}=e;return n?{trusted:!0,tenantId:n,attested:!0}:t?{trusted:!1}:{trusted:!0,tenantId:r,attested:!1}}function od(){return s(new a(`UNAUTHORIZED`,`Request tenant is not attested by the auth hook`))}function sd(e,t,n,r){return{jsonrpc:`2.0`,id:e,error:{code:t,message:n,data:r}}}function cd(e,t,n=200){e.statusCode=n,e.setHeader(`content-type`,`application/json`),e.end(JSON.stringify(t))}function ld(e,t){e.destroyed||e.writableEnded||e.write(sn(t))}function ud(e,t){e.destroyed||(e.write(hn(t)),e.end())}function dd(e){return e===`INVALID_ARGS`?-32602:-32e3}function fd(e){return e.code===`DEVICE_IN_USE`&&e.details?.reason===`human_control_active`?423:ms(e.code)}function pd(e,t,n){if(n!==void 0&&n!==`public-only`)throw new a(`INVALID_ARGS`,`Invalid daemon HTTP network access marker`);if(!t&&n===void 0)return e;let r=e.meta?.installSource,i=e.meta?.uploadedArtifactId;if(r?.kind===`path`&&!(typeof i==`string`&&i.length>0))throw new a(`INVALID_ARGS`,`Invalid params: path install sources are disabled on the remote HTTP surface`);let{developerDir:o,providerCredentialFingerprint:s,...c}=e.meta??{};return{...e,...e.meta?{meta:c}:{},internal:{...e.internal,publicNetworkOnly:!0}}}async function md(e,t){if(!e)return{ok:!0};let n=await e(t);if(n===void 0||n===!0)return{ok:!0};let r=(e,n,r)=>{let i=s(r);return{ok:!1,statusCode:e,response:sd(t.rpcRequest.id??null,n,i.message,i)}};if(n===!1||n.ok===!1){let e=n===!1?{}:n;return r(401,-32001,new a(p(e.code,`UNAUTHORIZED`),e.message??`Request rejected by auth hook`,e.details))}if(typeof n.tenantId==`string`&&n.tenantId.length>0){let e=ol(n.tenantId);return e?{ok:!0,tenantId:e}:r(500,-32e3,new a(`INVALID_ARGS`,`Auth hook returned invalid tenantId`))}return{ok:!0}}async function hd(e=process.env){let t=e.AGENT_DEVICE_HTTP_AUTH_HOOK;if(!t)return null;let n=e.AGENT_DEVICE_HTTP_AUTH_EXPORT||`default`,r=I.isAbsolute(t)?t:I.resolve(t),i;try{i=await import(Xr(r).href)}catch(e){throw new a(`COMMAND_FAILED`,`Failed to load AGENT_DEVICE_HTTP_AUTH_HOOK module`,{hookPath:r,error:e instanceof Error?e.message:String(e)})}let o=i[n];if(typeof o!=`function`)throw new a(`INVALID_ARGS`,`Auth hook export ${n} is not a function`,{hookPath:r,exportName:n});return o}function gd(e,t){let n=typeof t.authorization==`string`?t.authorization:``,r=n.toLowerCase().startsWith(`bearer `)?n.slice(7):void 0,i=typeof t[`x-agent-device-token`]==`string`?t[`x-agent-device-token`]:void 0;return(typeof e.token==`string`?e.token:void 0)??i??r??``}async function _d(e){let{req:t,res:n,authHook:r,expectedToken:i,daemonRequest:a}=e,o=gd({},t.headers),s=ol(bd(t.headers,Kt)),c=xd(o,i);if(c)return H(n,c),null;let l=await md(r,{headers:t.headers,rpcRequest:{jsonrpc:`2.0`,id:null,method:`agent_device.command`},daemonRequest:{token:o,session:`default`,command:a.command,positionals:a.positionals,...s?{meta:{tenantId:s}}:{}}});if(!l.ok)return yd(n,l),null;let u=ad({hookConfigured:r!==null,hookAttestedTenant:l.tenantId,clientDeclaredTenant:s});if(!u.trusted)return H(n,od()),null;let d=u.tenantId;return{tenantId:d,...d?{sessionNamespace:{tenant:d,partitioned:u.attested}}:{}}}async function vd(e){let{leaseRegistry:t,...n}=e,r=await _d(n);if(!r||!t)return r;try{Gu(t,r.tenantId)}catch(e){return H(n.res,s(e)),null}return r}function yd(e,t){e.statusCode=t.statusCode,e.setHeader(`content-type`,`application/json`),e.end(JSON.stringify({ok:!1,error:t.response.error?.data?.message??t.response.error?.message??`Unauthorized`}))}function bd(e,t){let n=e[t];return typeof n==`string`?n:void 0}function xd(e,t){return!t||gn(e,t)?null:s(new a(`UNAUTHORIZED`,`Invalid token`))}const Sd=new Set([`agent_device.command`,`agent-device.command`]),Cd=new Set([`agent_device.install_from_source`,`agent-device.install_from_source`]),wd=new Set([`agent_device.release_materialized_paths`,`agent-device.release_materialized_paths`]),Td={"agent_device.lease.allocate":`lease_allocate`,"agent-device.lease.allocate":`lease_allocate`,"agent_device.lease.heartbeat":`lease_heartbeat`,"agent-device.lease.heartbeat":`lease_heartbeat`,"agent_device.lease.release":`lease_release`,"agent-device.lease.release":`lease_release`},Ed=new Set([...Sd,...Cd,...wd,...Object.keys(Td)]);function Dd(e,t){return{token:gd(e,t),session:e.session??`default`,command:e.command??``,positionals:e.positionals??[],input:e.input,flags:e.flags,runtime:e.runtime,meta:e.meta}}function q(e,t){let n=e[t];return typeof n==`string`?n:void 0}function Od(e,t){let n=e[t];return Number.isInteger(n)?Number(n):void 0}function kd(e,t){let n=e[t];return typeof n==`boolean`?n:void 0}function Ad(e,t){let n=typeof e[t]==`string`?e[t].trim():``;if(!n)throw new a(`INVALID_ARGS`,`Invalid params: source.${t} is required for github-actions-artifact sources`);return n}function jd(e,t){let n=e[t],r=typeof n==`number`?n:typeof n==`string`?Number(n):NaN;if(!Number.isInteger(r))throw new a(`INVALID_ARGS`,`Invalid params: source.${t} must be an integer`);return r}function Md(e){let t=Ad(e,`owner`),n=Ad(e,`repo`),r=e.artifactId!==void 0,i=e.runId!==void 0,o=e.artifactName!==void 0;if(r&&(i||o))throw new a(`INVALID_ARGS`,`Invalid params: source must specify either artifactId or artifactName, not both`);if(!r&&i&&!o)throw new a(`INVALID_ARGS`,`Invalid params: source.artifactName is required when source.runId is specified`);if(!r&&!o)throw new a(`INVALID_ARGS`,`Invalid params: source must specify artifactId or artifactName`);if(r)return{kind:`github-actions-artifact`,owner:t,repo:n,artifactId:jd(e,`artifactId`)};let s;return i&&(s=jd(e,`runId`)),{kind:`github-actions-artifact`,owner:t,repo:n,...i?{runId:s}:{},artifactName:Ad(e,`artifactName`)}}function Nd(e,t,n){return{token:gd(t,n),session:q(t,`session`)??`default`,command:e,positionals:[],flags:e===`lease_allocate`?Be(t):void 0,meta:{tenantId:q(t,`tenantId`)??q(t,`tenant`),runId:q(t,`runId`),leaseId:q(t,`leaseId`),leaseTtlMs:Od(t,`ttlMs`),leaseRetainOnClose:kd(t,`retainOnClose`),leaseBackend:q(t,`backend`),leaseProvider:q(t,`leaseProvider`)??q(t,`provider`),deviceKey:q(t,`deviceKey`),clientId:q(t,`clientId`),providerCredentialFingerprint:e===`lease_allocate`?q(t,`providerCredentialFingerprint`):void 0}}}function Pd(e){let t=e.source;if(!t||typeof t!=`object`)throw new a(`INVALID_ARGS`,`Invalid params: source is required`);let n=t;if(n.kind===`url`){let e=typeof n.url==`string`?n.url.trim():``;if(!e)throw new a(`INVALID_ARGS`,`Invalid params: source.url is required for url sources`);let t=n.headers,r={};if(t!==void 0){if(!t||typeof t!=`object`||Array.isArray(t))throw new a(`INVALID_ARGS`,`Invalid params: source.headers must be a string map`);for(let[e,n]of Object.entries(t)){if(typeof n!=`string`)throw new a(`INVALID_ARGS`,`Invalid params: source.headers values must be strings`);r[e]=n}}return Object.keys(r).length>0?{kind:`url`,url:e,headers:r}:{kind:`url`,url:e}}if(n.kind===`path`)throw new a(`INVALID_ARGS`,`Invalid params: source.kind "path" names a file on the daemon host and is not accepted over HTTP`,{hint:`Use a "url" or "github-actions-artifact" source.`});if(n.kind===`github-actions-artifact`)return Md(n);throw new a(`INVALID_ARGS`,`Invalid params: source.kind must be "url" or "github-actions-artifact"`)}function Fd(e,t){let n=q(e,`platform`);if(n!==`ios`&&n!==`android`)throw new a(`INVALID_ARGS`,`Invalid params: platform must be "ios" or "android"`);return{token:gd(e,t),session:q(e,`session`)??`default`,command:`install_source`,positionals:[],flags:{platform:n},meta:{requestId:q(e,`requestId`),installSource:Pd(e),retainMaterializedPaths:kd(e,`retainPaths`),materializedPathRetentionMs:Od(e,`retentionMs`)}}}function Id(e,t){let n=q(e,`materializationId`)?.trim();if(!n)throw new a(`INVALID_ARGS`,`Invalid params: materializationId is required`);return{token:gd(e,t),session:q(e,`session`)??`default`,command:`release_materialized_paths`,positionals:[],meta:{requestId:q(e,`requestId`),materializationId:n}}}function Ld(e){let t=e.indexOf(`: `);if(t===-1||!e.startsWith(`$`))return e;let n=e.slice(0,t).replace(/^\$\.?/,``),r=e.slice(t+2);return n?`${n}: ${r}`:r}function Rd(e){try{return c.parse(e)}catch(e){let t=e instanceof Error?Ld(e.message):`invalid command params`;throw new a(`INVALID_ARGS`,`Invalid params: ${t}`)}}function zd(e,t,n){if(Sd.has(e))return Dd(Rd(t),n);if(Cd.has(e))return Fd(t,n);if(wd.has(e))return Id(t,n);let r=Td[e];if(r)return Nd(r,t,n);throw new a(`INVALID_ARGS`,`Method not found: ${e}`)}function Bd(e){return Sd.has(e)}function Vd(e,t,n,r){let i=e.headers[Yt];return typeof i!=`string`||!i||i===r?!1:(t.statusCode=409,t.setHeader(`content-type`,`application/json`),t.setHeader(Jt,`true`),t.end(JSON.stringify(Xt(n,`Daemon instance changed`,s(new a(`COMMAND_FAILED`,`Daemon instance changed`,{reason:`remote_instance_mismatch`}))))),!0)}async function Hd(e){let t=Kr(),n=await Ft(),r=_.filter(e=>e!==`macos-app`||process.platform===`darwin`),i=await hd(e.env??process.env),{handleRequest:a,token:o,retainArtifacts:c=!1,resolveRequestDiagnosticsPath:l}=e;return Zr.createServer((u,d)=>{if(u.method===`GET`&&u.url===`/health`){d.statusCode=200,d.setHeader(`content-type`,`application/json`),d.end(JSON.stringify(Zt(`agent-device-daemon`,yn(),{instanceId:t,hostArch:n,leaseBackends:r})));return}if(!(o&&e.leaseRegistry&&qu({req:u,res:d,expectedToken:o,registry:e.leaseRegistry}))&&!Tc({req:u,res:d,token:gd({},u.headers),authorize:async e=>await _d({req:e.req,res:e.res,authHook:i,expectedToken:o,daemonRequest:e.daemonRequest})})&&!Wc({req:u,res:d,retainArtifacts:c,authorize:async e=>await _d({req:e.req,res:e.res,authHook:i,expectedToken:o,daemonRequest:e.daemonRequest})})&&!(l&&tl({req:u,res:d,resolveRecordPath:l,authorize:async t=>await vd({...t,authHook:i,expectedToken:o,leaseRegistry:e.leaseRegistry})}))){if(u.method!==`POST`||u.url!==`/rpc`){d.statusCode=404,d.end(`Not found`);return}Ud(u,d,e=>{Wd({req:u,res:d,body:e,authHook:i,expectedToken:o,instanceId:t,handleRequest:a}).catch(e=>{rf(d,s(e))})})}})}function Ud(e,t,n){let r=``;e.setEncoding(`utf8`),e.on(`data`,t=>{r+=t,r.length>1048576&&e.destroy(Error(`request too large`))}),e.on(`error`,()=>{t.headersSent||Xd(t,Jd())}),e.on(`end`,()=>{n(r)})}async function Wd(e){let{req:t,res:n,body:r,authHook:i,expectedToken:a,instanceId:o,handleRequest:c}=e,l=qd(r);if(!l.ok){Xd(n,l.refusal);return}let u=Zd({req:t,res:n,rpcId:l.rpcRequest.id});try{let e=await Qd({req:t,res:n,authHook:i,expectedToken:a,instanceId:o,rpcRequest:l.rpcRequest,method:l.method,params:l.params,lifetime:u});if(e.outcome!==`admitted`){e.outcome===`rejected`&&Xd(n,e.refusal);return}u.watchForClientDisconnect(),await nf({res:n,rpcRequest:l.rpcRequest,daemonRequest:e.daemonRequest,handleRequest:c,lifetime:u})}catch(e){u.markHandlerCompleted(),af(n,l.rpcRequest.id,s(e))}finally{u.release()}}const Gd=-32600,Kd=-32602;function qd(e){let t;try{t=JSON.parse(e)}catch{return{ok:!1,refusal:Jd()}}if(!D(t))return{ok:!1,refusal:Yd(null,Gd,`Invalid Request`,400)};let n=t,r=(e,t,r)=>({ok:!1,refusal:Yd(n.id??null,e,t,r)});return n.jsonrpc!==`2.0`||typeof n.method!=`string`?r(Gd,`Invalid Request`,400):Ed.has(n.method)?!n.params||typeof n.params!=`object`?r(Kd,`Invalid params`,400):{ok:!0,rpcRequest:n,method:n.method,params:n.params}:r(-32601,`Method not found: ${n.method}`,404)}function Jd(){return Yd(null,-32700,`Parse error`,400)}function Yd(e,t,n,r,i){return{response:sd(e??null,t,n,i),statusCode:r}}function Xd(e,t){cd(e,t.response,t.statusCode)}function Zd(e){let{req:t,res:n,rpcId:r}=e,i,a,o=!1,s=!1,c=()=>{o||n.writableFinished||s||(s=!0,qn(i),j({level:`warn`,phase:`request_client_disconnected`,data:{requestId:i}}))};return{admit(e){return i=Zn(e.meta?.requestId,r),a=Xn(i),{...e,meta:{...e.meta,requestId:i}}},watchForClientDisconnect(){t.on(`aborted`,c),n.on(`close`,c),(t.aborted||n.destroyed)&&c()},markHandlerCompleted(){o=!0},release(){Qn(a)}}}async function Qd(e){let{req:t,res:n,authHook:r,expectedToken:i,instanceId:a,rpcRequest:o,method:s,lifetime:c}=e,l=zd(s,e.params,t.headers);if($d(s,l))return{outcome:`rejected`,refusal:Yd(o.id??null,Kd,`Invalid params: command is required`,400)};let u=c.admit(l),d=u.meta?.tenantId??u.flags?.tenant,f=await md(r,{headers:t.headers,rpcRequest:o,daemonRequest:u});if(!f.ok)return{outcome:`rejected`,refusal:{response:f.response,statusCode:f.statusCode}};let p=ad({hookConfigured:r!==null,hookAttestedTenant:f.tenantId,clientDeclaredTenant:d});if(!p.trusted)return ef(o,-32001,od(),401);let m=xd(u.token,i);return m?ef(o,-32e3,m,401):Vd(t,n,o.id??null,a)?{outcome:`answered`}:{outcome:`admitted`,daemonRequest:tf(u,p,r,t)}}function $d(e,t){return Bd(e)&&!(typeof t.command==`string`&&t.command.length>0)}function ef(e,t,n,r){return{outcome:`rejected`,refusal:Yd(e.id??null,t,n.message,r,n)}}function tf(e,t,n,r){let i={...e,meta:{...e.meta,tenantId:t.tenantId,sessionIsolation:t.attested?`tenant`:e.meta?.sessionIsolation}};return i.flags?.tenant!==void 0&&(i={...i,flags:{...i.flags,tenant:t.tenantId}}),t.attested&&i.flags?.sessionIsolation!==void 0&&(i={...i,flags:{...i.flags,sessionIsolation:`tenant`}}),pd(i,n!==null,r.headers[Qt])}async function nf(e){let{res:t,rpcRequest:n,daemonRequest:r,handleRequest:i,lifetime:a}=e;try{if(!_n(r)){let e=await i(r);a.markHandlerCompleted(),cd(t,of(n,e),sf(e));return}t.statusCode=200,t.setHeader(`content-type`,`application/x-ndjson`);let e=await $n(e=>ld(t,e),async()=>await i(r));a.markHandlerCompleted(),ud(t,of(n,e))}catch(e){a.markHandlerCompleted(),af(t,n.id,s(e))}finally{a.release()}}function rf(e,t){process.stderr.write(`Daemon error: ${t.message}\n`),e.writableEnded||af(e,null,t)}function af(e,t,n){let r=sd(t??null,dd(n.code),n.message,n);if(e.headersSent){ud(e,r);return}cd(e,r,ms(n.code))}function of(e,t){return t.ok?{jsonrpc:`2.0`,id:e.id??null,result:t}:sd(e.id??null,-32e3,t.error.message,t.error)}function sf(e){return e.ok?200:fd(e.error)}function cf(e,t){if(lf(e,t.command,t.flags??{}),t.command===`batch`)for(let n of t.flags?.batchSteps??[])lf(e,Et(n.command),{...n.input,...n.flags})}function lf(e,t,n){if(hf(e,t),t===`close`&&n.shutdown===!0&&ff(e,`device-shutdown`),e.deviceIds)for(let t of[n.udid,n.serial]){let n=typeof t==`string`?t.trim():``;if(!(!n||e.deviceIds.has(n)))throw gf(e,`device`,`Device ${n} is outside this daemon's policy.`,{deviceId:n})}}function uf(e,t){return!e.deviceIds||e.deviceIds.has(t.id)}function df(e,t){if(!uf(e,t))throw gf(e,`device`,`Device ${t.id} is outside this daemon's policy.`,{deviceId:t.id})}function ff(e,t){if(e.deniedCapabilities.has(t))throw gf(e,`capability`,`This daemon's policy denies ${t}.`,{capability:t})}function pf(e,t){let n=e.requiredLeaseBackend;if(!(!n||t?.backend===n))throw gf(e,`lease`,`This daemon's policy requires a ${n} lease.`,{leaseBackend:n})}function mf(e,t){if(!t.deviceIds)return e;let n=e=>e.filter(e=>uf(t,e)),r=Object.freeze({discover:async(t,r)=>n(await e.localOnly.discover(t,r))}),i=async(t,i)=>{let a=await e.providerFirst.discoverWithSource(t,i),o=n(a.devices);return o.length>0||a.source===`local`?{...a,devices:o}:{devices:await r.discover(t,i),source:`local`}},a=Object.freeze({discover:async(e,t)=>(await i(e,t)).devices,discoverWithSource:i});return Object.freeze({...e,localOnly:r,providerFirst:a})}function hf(e,t){let n=e.commands;if(!n)return;let r=ir(t);if(r===void 0)return;let i=n.names.has(r);if(!(n.mode===`allow`?i:!i))throw gf(e,`command`,`This daemon's policy denies the ${r} command.`,{command:r})}function gf(e,t,n,r){return new a(`UNAUTHORIZED`,n,{...r,reason:`DAEMON_POLICY_DENIED`,rule:t,policyDigest:e.digest,retriable:!1,hint:`The daemon operator's policy denies this request; retrying will not help. Use an allowed command and device, or ask the operator to change the policy.`})}let _f={resolve:async()=>{throw new a(`COMMAND_FAILED`,`Interactor resolution is not composed for this process.`,{reason:`interactor-resolution-missing`})}};function vf(e){_f=e}function yf(){return _f}function bf(e){let t=e?.providerSessionId;return typeof t==`string`&&t.trim().length>0?t.trim():void 0}var xf=class{records=new Map;now;retentionMs;constructor(e={}){this.now=e.now??(()=>Date.now()),this.retentionMs=Number.isInteger(e.retentionMs)?Math.max(0,Number(e.retentionMs)):3e5}record(e,t){let n=e.leaseProvider?.trim(),r=t.trim();if(!n||!r)return;this.prune();let i={provider:n,providerSessionId:r,leaseId:e.leaseId,tenantId:e.tenantId};this.records.set(this.key(n,r),i)}markLeaseReleased(e,t=this.now()){let n=e.leaseProvider?.trim();if(!n)return;this.prune();let r=t+this.retentionMs;for(let[t,i]of this.records)i.provider===n&&i.leaseId===e.leaseId&&this.records.set(t,{...i,retainedUntil:r})}resolve(e){let t=e.provider?.trim(),n=e.providerSessionId?.trim(),r=e.tenantId?.trim();if(!t||!n||!r)return;this.prune();let i=this.records.get(this.key(t,n));if(!(!i||i.tenantId!==r))return{...i}}prune(){let e=this.now();for(let[t,n]of this.records)n.retainedUntil!==void 0&&n.retainedUntil<=e&&this.records.delete(t)}key(e,t){return JSON.stringify([e,t])}},Sf=class{active=new Map;waiters=new Map;async run(e,t){this.active.set(e,(this.active.get(e)??0)+1);try{return await t()}finally{let t=(this.active.get(e)??1)-1;if(t>0)this.active.set(e,t);else{this.active.delete(e);let t=this.waiters.get(e);this.waiters.delete(e);for(let e of t??[])e()}}}async wait(e,t){if(t?.throwIfAborted(),!this.active.has(e))return;let n=this.waiters.get(e)??new Set,r=()=>{},i=()=>{};try{await new Promise((a,o)=>{r=a,i=()=>o(t?.reason),n.add(r),this.waiters.set(e,n),t?.addEventListener(`abort`,i,{once:!0})})}finally{t?.removeEventListener(`abort`,i),n.delete(r),n.size===0&&this.waiters.get(e)===n&&this.waiters.delete(e)}}},Cf=class{entriesByLeaseId=new Map;retain(e,t){let n={wanted:t,released:!1},r=this.entriesByLeaseId.get(e)??new Set;return r.add(n),this.entriesByLeaseId.set(e,r),{leaseId:e,release:()=>this.releasePass(e,r,n)}}forget(e){let t=this.entriesByLeaseId.get(e);if(t){for(let e of t)e.released=!0;this.entriesByLeaseId.delete(e)}}isDeferred(e){let t=this.entriesByLeaseId.get(e);if(!t)return!1;for(let e of t)e.wanted()||t.delete(e);return t.size>0||(this.entriesByLeaseId.delete(e),!1)}releasePass(e,t,n){return!n.released&&(n.released=!0,t.delete(n),t.size===0&&this.entriesByLeaseId.delete(e),n.wanted())}},wf=class{holdsByDevice=new Map;mutations=new Sf;inFlightWork=new Cf;leases=new Map;runBindings=new Map;deviceBindings=new Map;hostTtlMsByLeaseId=new Map;macOsAppTenantIds=new Set;maxActiveSimulatorLeases;resolveLeaseTtlMs;now;onLeaseExpired;providerSessionOwnership;constructor(e={}){this.maxActiveSimulatorLeases=Number.isInteger(e.maxActiveSimulatorLeases)?Math.max(0,Number(e.maxActiveSimulatorLeases)):0,this.resolveLeaseTtlMs=cl(e),this.now=e.now??(()=>Date.now()),this.onLeaseExpired=e.onLeaseExpired,this.providerSessionOwnership=new xf({now:this.now,retentionMs:e.providerSessionRetentionMs})}allocateLease(e){let t=yl(e);this.cleanupExpiredLeases();let n=this.resolveLeaseTtlMs(t.ttlMs);this.assertHumanControlAdmission(t);let r=this.refreshExistingRunBinding(t,n);if(r)return r;this.assertDeviceAvailable(t),this.enforceCapacity(t.backend);let i=Ol(t,n,this.now());return this.leases.set(i.leaseId,i),this.bindLease(i),{...i}}putHostLease(e,t){let n=dl(e),r=yl(t);this.cleanupExpiredLeases();let i=this.resolveLeaseTtlMs(r.ttlMs),o=this.leases.get(n);if(o){if(!El(o,r))throw new a(`INVALID_ARGS`,`Lease id already names a lease with another scope.`,{reason:`LEASE_SCOPE_MISMATCH`});return this.hostTtlMsByLeaseId.set(n,i),this.refreshLease(o,i)}if(this.assertHumanControlAdmission(r),this.assertDeviceAvailable(r),r.backend===`macos-app`&&this.macOsAppTenantIds.add(r.tenantId),this.runBindings.has(Dl(r)))throw new a(`DEVICE_IN_USE`,`This tenant run already holds a lease for the device.`,{reason:`DEVICE_LEASE_BUSY`});this.enforceCapacity(r.backend);let s={...Ol(r,i,this.now()),leaseId:n};return this.leases.set(s.leaseId,s),this.hostTtlMsByLeaseId.set(n,i),this.bindLease(s),{...s}}refreshExistingRunBinding(e,t){let n=Dl(e),r=this.runBindings.get(n);if(!r)return;let i=this.leases.get(r);if(!i){this.runBindings.delete(n);return}if(i.clientId===e.clientId)return this.refreshLease(e.retainOnClose?{...i,retainOnClose:!0}:i,t);if(i.deviceKey)throw Al(i);return Sl(i,e),this.refreshLease(i,t)}heartbeatLease(e){let t=dl(e.leaseId);this.cleanupExpiredLeases();let n=this.getActiveLease(t);Tl(n,e),Sl(n,e);let r=e.ttlMs===void 0?kl(n):this.resolveLeaseTtlMs(e.ttlMs),i=this.hostTtlMsByLeaseId.get(t);return this.refreshLease(n,i===void 0?r:Math.min(r,i))}retainLeaseWork(e,t){let n=this.inFlightWork.retain(e.leaseId,t);return{leaseId:n.leaseId,release:()=>{let t=n.release();return t&&this.refreshProtectedLease(e.leaseId,this.now()),t}}}releaseLease(e){let t=this.getLease(e);return t?(this.leases.delete(t.leaseId),this.unbindLease(t),this.inFlightWork.forget(t.leaseId),{released:!0,lease:t}):{released:!1}}getLease(e){let t=dl(e.leaseId);this.cleanupExpiredLeases();let n=this.leases.get(t);if(n)return Tl(n,e),Sl(n,e),{...n}}assertLeaseAdmission(e){let t=Cl(e);this.cleanupExpiredLeases(),Sl(this.getActiveLease(t.leaseId),t)}hasHeldMacOsAppLease(e){return this.macOsAppTenantIds.has(e)}findActiveLeaseBackend(e){let t=ul(e);if(t)return this.cleanupExpiredLeases(),this.leases.get(t)?.backend}hasRetainedLeases(){let e=this.now();return this.listActiveLeases().some(t=>t.retainOnClose===!0&&t.expiresAt>e)}listActiveLeases(){return this.cleanupExpiredLeases(),Array.from(this.leases.values()).map(e=>({...e}))}recordProviderSession(e,t){this.cleanupExpiredLeases();let n=e.expiresAt<=this.now()?e.expiresAt:void 0;this.providerSessionOwnership.record(e,t),this.leases.has(e.leaseId)||this.providerSessionOwnership.markLeaseReleased(e,n)}resolveProviderSession(e){return this.cleanupExpiredLeases(),this.providerSessionOwnership.resolve(e)}listHumanControlHolds(e){this.cleanupExpiredLeases();let t=e.kind===`lease`?U(this.requireHumanControlLease(e.leaseId)):void 0;return[...this.holdsByDevice.entries()].filter(([e])=>t===void 0||t===e).flatMap(([,e])=>[...e.values()].map(({hold:e})=>Il(e))).sort((e,t)=>e.id.localeCompare(t.id))}async putHumanControlHold(e,t,n,r){r?.throwIfAborted();let i=Fl(t),o=Ml(n);this.cleanupExpiredLeases();let s=this.resolveHumanControlScope(e,o),c=U(s),l=this.findHumanControlHold(i);if(l&&(this.assertHoldAuthority(e,l),U(l.hold.scope)!==c))throw new a(`INVALID_ARGS`,`Release a hold before changing its device scope.`);let u=this.now(),d={...e.kind===`lease`?{ownerLeaseId:e.leaseId}:{},hold:{id:i,scope:s,state:`activating`,...o.reason?{reason:o.reason}:{},createdAt:l?.hold.createdAt??u,updatedAt:u}},f=this.holdsByDevice.get(c)??new Map;return this.holdsByDevice.set(c,f),f.set(i,d),await this.activateHumanControlHold(c,d,o.ttlMs,r)}async activateHumanControlHold(e,t,n,r){let i=this.holdsByDevice.get(e),{id:o}=t.hold;try{if(await this.mutations.wait(e,r),r?.throwIfAborted(),i.get(o)!==t)throw new a(`COMMAND_FAILED`,`Human-control hold changed before activation completed.`,{holdId:o});let s=this.now();return t.hold={...t.hold,state:`active`,updatedAt:s,...n===void 0?{}:{expiresAt:s+n}},this.refreshHeldLease(e,s),Il(t.hold)}catch(n){throw i.get(o)===t&&this.deleteHumanControlHold(e,o),n}}removeHumanControlHold(e,t){let n=Fl(t);this.cleanupExpiredLeases();let r=this.findHumanControlHold(n);if(!r)return;this.assertHoldAuthority(e,r);let i=U(r.hold.scope);return this.deleteHumanControlHold(i,n),Il(r.hold)}deleteHumanControlHold(e,t){let n=this.holdsByDevice.get(e);n.delete(t),n.size===0&&(this.holdsByDevice.delete(e),this.refreshHeldLease(e,this.now()))}assertHumanControlAdmission(e){this.expireHumanControlHolds();let t=U(e),n=t===void 0?void 0:this.holdsByDevice.get(t)?.values().next().value;if(n)throw Ll(n.hold)}async runDeviceMutation(e,t){if(!e)return await t();this.cleanupExpiredLeases();let n=this.getActiveLease(e.leaseId);this.assertHumanControlAdmission(n);let r=U(n);return r===void 0?await t():await this.mutations.run(r,t)}requireHumanControlLease(e){let t=this.getActiveLease(e);if(!t.deviceKey)throw new a(`UNSUPPORTED_OPERATION`,`Human control requires a device-scoped remote lease.`);return{...t,deviceKey:t.deviceKey}}resolveHumanControlScope(e,t){if(e.kind===`host`){if(!t.scope)throw new a(`INVALID_ARGS`,`Host human control requires a lease device scope.`);return t.scope}if(t.scope)throw new a(`INVALID_ARGS`,`Lease-owner human control uses the admitted lease device; do not supply scope.`);let n=this.requireHumanControlLease(e.leaseId);return{backend:n.backend,leaseProvider:n.leaseProvider,deviceKey:n.deviceKey}}assertHoldAuthority(e,t){if(e.kind===`host`)return;let n=this.requireHumanControlLease(e.leaseId);if(t.ownerLeaseId!==n.leaseId||U(n)!==U(t.hold.scope))throw new a(`UNAUTHORIZED`,`Human-control hold does not belong to the admitted lease.`,{reason:`LEASE_SCOPE_MISMATCH`})}findHumanControlHold(e){for(let t of this.holdsByDevice.values()){let n=t.get(e);if(n)return n}}hasHumanControl(e){let t=U(e);return t!==void 0&&this.holdsByDevice.has(t)}isLeaseProtected(e,t){return e.expiresAt>t||this.hasHumanControl(e)||this.inFlightWork.isDeferred(e.leaseId)}expireHumanControlHolds(){let e=this.now();for(let[t,n]of this.holdsByDevice){let r=0;for(let[t,{hold:i}]of n)i.expiresAt===void 0||i.expiresAt>e||(r=Math.max(r,i.expiresAt),n.delete(t));n.size===0&&(this.holdsByDevice.delete(t),this.refreshHeldLease(t,r))}}refreshHeldLease(e,t){this.refreshProtectedLease(this.deviceBindings.get(e),t)}refreshProtectedLease(e,t){let n=e?this.leases.get(e):void 0;n&&this.refreshLease(n,kl(n),Math.max(t,n.heartbeatAt))}consumeExpiredLeases(){this.expireHumanControlHolds();let e=this.now(),t=[];for(let n of this.leases.values()){if(this.isLeaseProtected(n,e))continue;this.leases.delete(n.leaseId),this.unbindLease(n,n.expiresAt);let r={...n};t.push(r),this.onLeaseExpired?.(r)}return t}consumeExpiredLease(e){this.expireHumanControlHolds();let t=ul(e);if(!t)return;let n=this.leases.get(t);if(!n||this.isLeaseProtected(n,this.now()))return;this.leases.delete(n.leaseId),this.unbindLease(n,n.expiresAt);let r={...n};return this.onLeaseExpired?.(r),r}cleanupExpiredLeases(){this.consumeExpiredLeases()}enforceCapacity(e){if(e!==`ios-simulator`||this.maxActiveSimulatorLeases<=0)return;let t=Array.from(this.leases.values()).filter(e=>e.backend===`ios-simulator`).length;if(!(t<this.maxActiveSimulatorLeases))throw new a(`DEVICE_IN_USE`,`No simulator lease capacity available`,{reason:`LEASE_CAPACITY_EXCEEDED`,activeLeases:t,maxActiveLeases:this.maxActiveSimulatorLeases,backend:e,hint:`Retry after releasing another simulator lease.`})}getActiveLease(e){let t=this.leases.get(e);if(t)return t;throw new a(`UNAUTHORIZED`,`Lease is not active`,{reason:`LEASE_NOT_FOUND`})}refreshLease(e,t,n=this.now()){let r={...e,heartbeatAt:n,expiresAt:n+t};return this.leases.set(r.leaseId,r),this.bindLease(r),{...r}}bindLease(e){this.runBindings.set(Dl(e),e.leaseId);let t=U(e);t&&this.deviceBindings.set(t,e.leaseId)}unbindLease(e,t=this.now()){this.hostTtlMsByLeaseId.delete(e.leaseId),this.runBindings.delete(Dl(e));let n=U(e);n&&this.deviceBindings.delete(n),this.providerSessionOwnership.markLeaseReleased(e,t)}assertDeviceAvailable(e){let t=U({backend:e.backend,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey});if(!t)return;let n=this.deviceBindings.get(t);if(!n)return;let r=this.leases.get(n);if(!r){this.deviceBindings.delete(t);return}throw Al(r)}};function Tf(e){return Ne(e)}function Ef(e,t){let n=Tf(e),r=n.leaseId??t?.leaseId,i=n.tenantId??t?.tenantId,a=n.runId??t?.runId;if(!(!i||!a||!r))return ue({tenantId:i,runId:a,leaseId:r,leaseBackend:n.leaseBackend??t?.backend,leaseProvider:n.leaseProvider??t?.leaseProvider,deviceKey:n.deviceKey??t?.deviceKey,clientId:n.clientId??t?.clientId,expiresAt:t?.expiresAt})}function Df(e,t){let n=Tf(e),r=t?.lease??t?.deviceLease??void 0;return ue({tenantId:n.tenantId??r?.tenantId,runId:n.runId??r?.runId,leaseId:n.leaseId??r?.leaseId,leaseTtlMs:n.leaseTtlMs,leaseBackend:n.leaseBackend??r?.leaseBackend,leaseProvider:n.leaseProvider??r?.leaseProvider,deviceKey:n.deviceKey??r?.deviceKey,clientId:n.clientId??r?.clientId})}function Of(e){let t=e.meta,n=ue({leaseId:kf(t?.leaseId),clientId:kf(t?.clientId),tenantId:kf(t?.tenantId),runId:kf(t?.runId),leaseProvider:kf(t?.leaseProvider),deviceKey:kf(t?.deviceKey)});return Object.keys(n).length>0?n:void 0}function kf(e){return typeof e==`string`&&e.trim().length>0?e.trim():void 0}function Af(e){let t=al(e.meta?.sessionIsolation??e.flags?.sessionIsolation),n=e.meta?.tenantId??e.flags?.tenant,r=ol(n);if(n&&!r)throw new a(`INVALID_ARGS`,`Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.`);if(t!==`tenant`)return e;if(!r)throw new a(`INVALID_ARGS`,`session isolation mode tenant requires --tenant (or meta.tenantId).`);let i=e.session||`default`;return Qc(r,i)?{...e,meta:{...e.meta,tenantId:r,sessionIsolation:t}}:{...e,session:Zc(r,i),meta:{...e.meta,tenantId:r,sessionIsolation:t}}}function jf(e,t,n,r={}){if(Nf(e,t,n,r.daemonPolicy))return;let i=Tf(e);Lf(e,i);let o=n?.lease;if(r.daemonPolicy?.requiredLeaseBackend){let i=Df(e,n).leaseId?Mf(e,t,n):void 0;return pf(r.daemonPolicy,i),i}if(!(n===void 0&&!i.leaseId&&Ff(e,r.providerAppCatalog))){if(e.command===`human_control`&&!o&&!i.leaseId)throw new a(`UNSUPPORTED_OPERATION`,`Takeover requires an active remote device lease. Local takeover is not supported.`);if(!(e.command!==`human_control`&&!o&&e.meta?.sessionIsolation!==`tenant`&&(!i.leaseId||!i.tenantId&&!i.runId)))return Mf(e,t,n)}}function Mf(e,t,n){Rf(Tf(e),n?.lease);let r=Df(e,n);t.assertLeaseAdmission(Fe(r));let i=t.heartbeatLease(Fe(r));return wu(i,e,n),uu(e)&&t.assertHumanControlAdmission(i),i}function Nf(e,t,n,r){return eu(e.command)?tu(e.command)?!0:!Pf(e,t,n,r):!1}function Pf(e,t,n,r){if(r?.requiredLeaseBackend)return!0;let i=Df(e,n);return i.leaseBackend===`macos-app`||i.leaseId!==void 0&&t.findActiveLeaseBackend(i.leaseId)===`macos-app`}function Ff(e,t){let n=pu(e);return n?.kind===`unconditional`||n?.kind===`provider-app-catalog`&&t?.supports(n.provider)===!0}function If(e){eu(e.command)||Lf(e,Tf(e))}function Lf(e,t){if(e.command!==`open`)return;let n=Re(t);if(n.length!==0)throw new a(`INVALID_ARGS`,`Proxy open requires leaseId, tenantId, runId, clientId, and deviceKey lease metadata.`,{missing:n})}function Rf(e,t){t&&(zf(`leaseId`,e.leaseId,t.leaseId),zf(`tenantId`,e.tenantId,t.tenantId),zf(`runId`,e.runId,t.runId),zf(`leaseProvider`,e.leaseProvider,t.leaseProvider),zf(`clientId`,e.clientId,t.clientId),zf(`deviceKey`,e.deviceKey,t.deviceKey))}function zf(e,t,n){if(!(!t||!n||t===n))throw new a(`UNAUTHORIZED`,`Lease does not match session owner (${e})`,{reason:`LEASE_SESSION_MISMATCH`,field:e})}async function Bf(e,t){if(!t.leaseProvider||!e)return!1;try{return await e(t),j({level:`info`,phase:`provider_lease_expired_released`,data:{leaseId:t.leaseId,provider:t.leaseProvider}}),!0}catch(e){return j({level:`error`,phase:`provider_lease_expiry_release_failed`,data:{leaseId:t.leaseId,provider:t.leaseProvider,error:e instanceof Error?e.message:String(e)}}),!1}}async function Vf(e){let t=e.sessionStore.lookup(e.sessionName),n=t?.session,r=n?.lease;return!t||!n||!r||!e.leaseRegistry.consumeExpiredLease(r.leaseId)?!1:(j({level:`info`,phase:`leased_session_expired`,data:{reason:`LEASE_EXPIRED`,leaseId:r.leaseId,session:n.name,deviceKey:r.deviceKey}}),await e.teardownSession(t).catch(e=>{j({level:`debug`,phase:`leased_session_expiry_cleanup_failed`,data:{reason:`LEASE_EXPIRED`,leaseId:r.leaseId,session:n.name,error:e instanceof Error?e.message:String(e)}})}),await dr(n.deviceClaim).catch(e=>{j({level:`warn`,phase:`leased_session_expiry_device_claim_clear_failed`,data:{session:n.name,deviceKey:n.deviceClaim?.deviceKey,error:e instanceof Error?e.message:String(e)}})}),e.sessionStore.retire(t),!0)}function Hf(e){let{sessionName:t,sessionStore:n,leaseRegistry:r}=e,i=n.lookup(t),a=i?.session,o=jf(e.req,r,a,{providerAppCatalog:e.providerAppCatalog,daemonPolicy:e.daemonPolicy});if(!o)return e.req;let s={...e.req,internal:{...e.req.internal,admittedLease:o}};return i&&a?.lease&&n.update(i,e=>({lease:{...e.lease,leaseBackend:o.backend,expiresAt:o.expiresAt}})),s}function Uf(e){return Ef(e.req,e.req.internal?.admittedLease)??e.existingLease}async function Wf(e){let t=e.session.lease;if(!t)return;let n=Ae({leaseId:t.leaseId,tenantId:t.tenantId,runId:t.runId,leaseBackend:t.leaseBackend,leaseProvider:t.leaseProvider,deviceKey:t.deviceKey,clientId:t.clientId}),r=e.leaseRegistry.getLease(n);if(r?.retainOnClose){j({level:`info`,phase:`session_lease_released`,data:{session:e.session.name,leaseId:t.leaseId,released:!1,retained:!0}});return}let i=r?await e.leaseLifecycleProvider?.release?.(r):void 0,a=bf(i);r&&a&&e.leaseRegistry.recordProviderSession(r,a);let o=e.leaseRegistry.releaseLease(n);return j({level:`info`,phase:`session_lease_released`,data:{session:e.session.name,leaseId:t.leaseId,released:o.released}}),i}const Gf=[`leaseId`,`tenantId`,`runId`,`backend`,`leaseProvider`],Kf=[`createdAt`,`heartbeatAt`,`expiresAt`];function qf(e){let t=new Map,n=ep(e.stateDir),r=new Set(n.keys()),i=e.retryDelayMs??1e3,a,o=new Map,s=!1,c=new Map,l=e=>{s&&c.set(e.leaseId,e)},u=()=>{if(!e.stateDir)return $f(n.size,Error(`daemon state directory is unavailable`)),!1;let t=np(e.stateDir);try{if(n.size===0)F.rmSync(t,{force:!0});else{F.mkdirSync(e.stateDir,{recursive:!0,mode:448});let r={version:1,leases:[...n.values()]};zt({destination:t,contents:`${JSON.stringify(r)}\n`,mode:384}),F.chmodSync(t,384)}r.clear();for(let e of n.keys())r.add(e);return!0}catch(e){return $f(n.size,e),!1}},d=()=>{a||!Yf(t,e.providerRuntimeIds)&&!Xf(n,e.recoverableProviderIds)||(a=setTimeout(()=>{a=void 0,h()},i),a.unref?.(),j({level:`warn`,phase:`provider_lease_expiry_retry_scheduled`,data:{pendingLiveLeaseCount:t.size,pendingRecoveryLeaseCount:n.size,retryDelayMs:i}}))},f=(e,r)=>{o.set(e,r);let i=()=>{o.get(e)===r&&o.delete(e),t.size===0&&n.size===0&&a?(clearTimeout(a),a=void 0):d()};return r.then(i,i),r},p=n=>{if(!Zf(n,e.providerRuntimeIds))return;let r=`live:${n.leaseId}`,i=o.get(r);if(i)return i;let a=(async()=>{await Jf(e.leaseLifecycleProvider,n)&&(t.delete(n.leaseId),l(n))})();return f(r,a)},m=t=>{if(!Qf(t,e.recoverableProviderIds)||!r.has(t.leaseId)&&!u())return;let i=`recovery:${t.leaseId}`,a=o.get(i);if(a)return a;let s=(async()=>{await Bf(e.recoverExpiredLease,t)&&(n.delete(t.leaseId),l(t),u())})();return f(i,s)},h=async()=>{let e=[...[...t.values()].map(p),...[...n.values()].map(m)].filter(e=>e!==void 0);if(e.length===0){d();return}await Promise.all(e)};return{beginShutdown:()=>{c.clear(),s=!0},release:async r=>{if(r.leaseProvider){if(Qf(r,e.recoverableProviderIds)){n.set(r.leaseId,r),u()?await m(r):d();return}Zf(r,e.providerRuntimeIds)&&e.leaseLifecycleProvider?.release&&(t.set(r.leaseId,r),await p(r),t.has(r.leaseId)&&d())}},retryPending:h,drain:async e=>{await Promise.race([h(),Ut(Math.max(0,e))]);let r={pending:[...t.values(),...n.values()],released:[...c.values()]};return s=!1,c.clear(),r},shutdown:()=>{a&&clearTimeout(a),a=void 0}}}async function Jf(e,t){return await Bf(e?.release?async t=>{await e.release?.(t)}:void 0,t)}function Yf(e,t){return[...e.values()].some(e=>Zf(e,t))}function Xf(e,t){return[...e.values()].some(e=>Qf(e,t))}function Zf(e,t){return e.leaseProvider!==void 0&&t?.includes(e.leaseProvider)===!0}function Qf(e,t){return e.leaseProvider!==void 0&&t?.includes(e.leaseProvider)===!0}function $f(e,t){j({level:`error`,phase:`provider_lease_expiry_record_write_failed`,data:{pendingLeaseCount:e,error:t instanceof Error?t.message:String(t)}})}function ep(e){if(!e)return new Map;let t=np(e);try{let e=JSON.parse(F.readFileSync(t,`utf8`));if(e.version!==1||!Array.isArray(e.leases))throw Error(`unsupported expiry release record`);return new Map(e.leases.filter(tp).map(e=>[e.leaseId,e]))}catch(e){return e.code===`ENOENT`||j({level:`warn`,phase:`provider_lease_expiry_record_read_failed`,data:{error:e instanceof Error?e.message:String(e)}}),new Map}}function tp(e){if(!e||typeof e!=`object`)return!1;let t=e;return Gf.every(e=>typeof t[e]==`string`)&&Kf.every(e=>typeof t[e]==`number`)}function np(e){return I.join(e,`expired-provider-leases.json`)}function rp(e,t){if(t!==`digest`)return e;let n=Array.isArray(e.nodes)?e.nodes:[],r=n.filter(e=>e.hittable===!0&&e.interactionBlocked!==`covered`).slice(0,12).map(e=>({ref:e.ref,label:e.label??e.value??e.identifier})),i=Object.fromEntries([`visibility`,`viewport`,`snapshotQuality`,`targetActivation`,`observation`,`warnings`,`fallbackScreenshotPath`,`artifacts`,`refsGeneration`].filter(t=>e[t]!==void 0).map(t=>[t,e[t]]));return{nodeCount:n.length,refs:r,truncated:e.truncated,...i}}const ip=[`width`,`height`,`logicalWidth`,`logicalHeight`,`pixelDensity`];function ap(e,t){if(t!==`digest`)return e;let n=Array.isArray(e.overlayRefs)?e.overlayRefs:[],r=n.slice(0,12).map(e=>({ref:e.ref,label:e.label}));return{...op(e),overlayCount:n.length,overlayRefs:r,...e.warnings===void 0?{}:{warnings:e.warnings},...e.artifacts===void 0?{}:{artifacts:e.artifacts}}}function op(e){let t={};typeof e.path==`string`&&(t.path=e.path),E(e.displayRotation)&&(t.displayRotation=e.displayRotation);for(let n of ip)typeof e[n]==`number`&&(t[n]=e[n]);return t}const sp=[`role`,`type`,`subrole`,`label`,`value`,`contentDescription`,`identifier`,`enabled`,`selected`,`checked`,`focused`,`heading`,`roleDescription`,`editable`,`password`,`hintShowing`,`placeholder`,`selectionStart`,`selectionEnd`,`hittable`];function cp(e){let t={ref:e.ref};for(let n of sp){let r=e[n];r!==void 0&&(t[n]=r)}return t}function lp(e,t){if(t!==`digest`)return e;let n=e.node;if(!n||typeof n!=`object`)return e;if(typeof e.text==`string`){let{node:t,...n}=e;return n}return{...e,node:cp(n)}}function up(e,t){return t===`digest`?fp(dp(e)):e}function dp(e){let t=e.resolution;if(!t||typeof t!=`object`||Array.isArray(t))return e;let n=t;if(n.kind!==`disambiguated`)return e;let{alternatives:r,...i}=n;return{...e,resolution:i}}function fp(e){let t=e.settle;if(!t||typeof t!=`object`||Array.isArray(t))return e;let{diff:n,tail:r,...i}=t;if(!n||typeof n!=`object`||Array.isArray(n))return e;let a=n,o=a.summary,s=mp(a.lines);return{...e,settle:{...i,...s.length>0?{refs:s}:{},...pp(r),diff:{summary:o}}}}function pp(e){return!Array.isArray(e)||e.length===0?{}:{tail:e.slice(0,12)}}function mp(e){return Array.isArray(e)?e.flatMap(hp).slice(0,12):[]}function hp(e){let t=_p(e);return t?.kind===`added`?gp(t.ref):[]}function gp(e){return typeof e==`string`&&e.length>0?[{ref:e}]:[]}function _p(e){return e&&typeof e==`object`&&!Array.isArray(e)?e:void 0}const vp=[`headers`,`requestHeaders`,`responseHeaders`,`requestBody`,`responseBody`,`raw`];function yp(e,t){if(t!==`digest`)return e;let n=e.entries;return Array.isArray(n)?{...e,entries:n.map(bp)}:e}function bp(e){let t=_p(e);if(!t)return e;let n={};for(let[e,r]of Object.entries(t))vp.includes(e)||(n[e]=r);return n}const xp={snapshot:rp,screenshot:ap,find:lp,get:lp,press:up,click:up,fill:up,longpress:up,hover:up,network:yp},Sp=[`platform`,`target`],Cp=[`iosSimulatorDeviceSet`,`androidDeviceAllowlist`];function wp(e){return rt({deviceName:e?.device,udid:e?.udid,serial:e?.serial})}function Tp(e){return wp(e)||Op(e,Sp)}function Ep(e){return Tp(e)||Op(e,Cp)}function Dp(e){return typeof e==`string`&&e.trim().length>0}function Op(e,t){return e?t.some(t=>Dp(e[t])):!1}async function kp(e){let t=await Ap(e.req,e.existingSession);if(t)return{device:t,...e.req.session===void 0?{}:{requestedSession:e.req.session},...e.req.meta?.requestId===void 0?{}:{requestId:e.req.meta.requestId},...e.existingSession?{session:{name:e.existingSession.name,device:e.existingSession.device,...e.existingSession.appBundleId?{appBundleId:e.existingSession.appBundleId}:{},...e.existingSession.appName?{appName:e.existingSession.appName}:{},...e.existingSession.surface?{surface:e.existingSession.surface}:{}}}:{},...e.useDefaultWebProvider?{useDefaultWebProvider:!0}:{}}}async function Ap(e,t){switch(hu(e,{hasExistingSession:!!t,hasExplicitDeviceIdentity:wp(e.flags),hasDeviceSelectionInput:Tp(e.flags)})){case`existing-session`:return t?.device;case`explicit-device`:case`sessionless-default-device`:try{return await jp(e)}catch{return}case`skip`:return}}async function jp(e){let t=e.command===`open`?Rn(e.positionals?.[0]):void 0;return await Fn(e.flags??{},t)}var Mp=class e{#e;constructor(e){this.#e=e}get state(){return this.#e.state}get scope(){return this.#e.scope}get tree(){return this.#e.tree}get generation(){return this.#e.generation}static expire(t){return t.#e.state===`expired`?t:new e({...t.#e,state:`expired`})}};const Np=new Mp({state:`active`,scope:`all`,tree:void 0,generation:void 0});function Pp(e){return new Mp({state:`active`,...e})}function Fp(e){return Mp.expire(e)}const Ip=new WeakMap,Lp=new WeakSet;function Rp(e){return e.refFrame??Np}function zp(e){return Rp(e).generation??e.snapshotGeneration}function Bp(e){return Rp(e).tree}function Vp(e){Wp(e),Hp(e),e.refFrame=Fp(Rp(e)),e.snapshotScopeSource=void 0}function Hp(e){e.snapshot&&Lp.add(e.snapshot)}function Up(e){return Lp.has(e)}function Wp(e){let t=Gp(e)+1;return Ip.set(e,t),t}function Gp(e){return Ip.get(e)??0}function Kp(e){Jp(e,`all`)}function qp(e,t){Jp(e,t)}function Jp(e,t){e.refFrame=Pp({scope:t,tree:e.snapshot,generation:e.snapshotGeneration})}function Yp(e){return Rp(e).state}function Xp(e){return Rp(e).scope}function Zp(e){let t=e.ref.startsWith(`@`)?e.ref.slice(1):e.ref;return{admission:Qp({session:e.session,refBody:t,mintedGeneration:e.mintedGeneration}),scope:Xp(e.session),currentGeneration:zp(e.session)}}function Qp(e){let{session:t,refBody:n,mintedGeneration:r}=e;if(Yp(t)===`expired`)return{admitted:!1,reason:`ref_frame_expired`};if(r!==void 0&&r!==zp(t))return{admitted:!1,reason:`ref_generation_mismatch`};let i=Xp(t);if(i!==`all`){if(r===void 0)return{admitted:!1,reason:`plain_ref_requires_complete_frame`};if(!i.has(n))return{admitted:!1,reason:`ref_not_issued`}}return{admitted:!0}}const $p=/\bis(?:n(?:'|&apos;|&#39;)?t| not)\s+responding\b/i,em=/^close app$/i,tm=`Wait for Android to recover, close the dialog, restart the app, or reboot the emulator, then retry.`;function nm(e){if(!e)throw new a(`INTERNAL_ERROR`,`Android observation was not supplied by root runtime composition`);return e}async function rm(e){let{session:t}=e;if(t.device.platform!==`android`||!t.screenRecording||ym(t))return{status:`absent`};let n=nm(e.observation),r;try{r=await fm(t,n)}catch(e){let n=s(e);return j({level:`warn`,phase:`android_blocking_dialog_inspection_failed`,data:{session:t.name,deviceId:t.device.id,error:e instanceof Error?e.message:String(e)}}),{status:`unknown`,reason:`inspection-failed`,warning:um(n)}}let i=mm(r);if(!i?.rect)return{status:`absent`};try{let e=await pm(t,i,n);return e.ok?await gm(t,n)?t.appBundleId&&(await n.openApp(t.device,t.appBundleId),!await _m(t,t.appBundleId,n))?(j({level:`warn`,phase:`android_blocking_dialog_relaunch_unfocused`,data:{session:t.name,deviceId:t.device.id,appBundleId:t.appBundleId}}),{status:`failed`,reason:`relaunch-failed`}):(j({level:`warn`,phase:`android_blocking_dialog_recovered`,data:{session:t.name,deviceId:t.device.id,appBundleId:t.appBundleId,x:e.x,y:e.y}}),{status:`recovered`}):(j({level:`warn`,phase:`android_blocking_dialog_still_present`,data:{session:t.name,deviceId:t.device.id}}),{status:`failed`,reason:`dismiss-failed`}):(j({level:`warn`,phase:`android_blocking_dialog_tap_failed`,data:{session:t.name,deviceId:t.device.id,exitCode:e.exitCode,stdout:e.stdout.trim(),stderr:e.stderr.trim()}}),{status:`failed`,reason:`tap-failed`})}catch(e){return j({level:`warn`,phase:`android_blocking_dialog_recovery_failed`,data:{session:t.name,deviceId:t.device.id,error:e instanceof Error?e.message:String(e)}}),{status:`failed`,reason:`error`}}}async function im(e){let{session:t,command:n}=e;if(t.device.platform!==`android`||ym(t))return{status:`clear`};let r=nm(e.observation),i=await r.readBlockingDialog(t.device);if(i.status!==`dialog`)return i.status===`unknown`&&j({level:`warn`,phase:`android_blocking_dialog_unobserved`,data:{session:t.name,deviceId:t.device.id,command:n,commandPhase:e.phase}}),{status:`clear`};let a=i.focus;if(om(t,a)){if(await am(t,r)){let r=`Recovered Android app ANR before ${n}: closed and relaunched ${t.appBundleId}.`;if(e.phase===`before-command`)return{status:`recovered`,warning:r};throw cm({session:t,command:n,focus:a,message:`Android app ANR appeared after ${n}; ${t.appBundleId} was closed and relaunched. Retry the command against the fresh app session.`,hint:`Retry the command. If the ANR returns, inspect app logs or restart the emulator.`})}throw cm({session:t,command:n,focus:a,message:`Android app ANR blocked ${n}: ${lm(a)}. Automatic recovery failed.`,hint:tm})}throw cm({session:t,command:n,focus:a,message:`Android system dialog is blocking ${n}: ${lm(a)}.`,hint:tm})}async function am(e,t){try{return await sm(e,t)}catch(t){return j({level:`warn`,phase:`android_app_anr_recovery_failed`,data:{session:e.name,deviceId:e.device.id,appBundleId:e.appBundleId,error:t instanceof Error?t.message:String(t)}}),!1}}function om(e,t){return!!(e.appBundleId&&t.package===e.appBundleId)}async function sm(e,t){if(!e.appBundleId)return!1;let n=mm(await fm(e,t),{requireDialogSignal:!1});if(!n?.rect)return!1;let r=await pm(e,n,t);if(!r.ok)return!1;await t.openApp(e.device,e.appBundleId);let i=await _m(e,e.appBundleId,t,{requireNoBlockingDialog:!0});return i&&j({level:`warn`,phase:`android_app_anr_recovered`,data:{session:e.name,deviceId:e.device.id,appBundleId:e.appBundleId,x:r.x,y:r.y}}),i}function cm(e){let{session:t,command:n,focus:r,message:i,hint:o}=e;return new a(`COMMAND_FAILED`,i,{command:n,expectedPackage:t.appBundleId,focusedPackage:r.package,focusedWindow:r.focusedWindow,rawFocus:r.raw,hint:o})}function lm(e){return e.package?`${e.focusedWindow} (package ${e.package})`:e.focusedWindow}function um(e){let t=[`Inspection error: ${dm(e.message)}`];return e.hint&&t.push(`Hint: ${dm(e.hint)}`),[`Android blocking-dialog readiness could not be inspected; the command continued.`,...t].join(` `)}function dm(e){let t=e.replaceAll(/\s+/g,` `).trim();return t.length<=240?t:`${t.slice(0,239)}…`}async function fm(e,t){return await t.readSnapshotNodes(e.device)}async function pm(e,t,n){if(!t.rect)return{ok:!1,exitCode:1,stdout:``,stderr:`button has no rect`};let{x:r,y:i}=u(t.rect);Vp(e);let a=await n.tap(e.device,r,i);return a.exitCode===0?{ok:!0,x:r,y:i}:{ok:!1,exitCode:a.exitCode,stdout:a.stdout.trim(),stderr:a.stderr.trim()}}function mm(e,t={}){if(!(t.requireDialogSignal!==!1&&!Sm(e)))return e.filter(hm).find(e=>xm(e).some(e=>em.test(e))&&e.rect)}function hm(e){return!En(e)}async function gm(e,t){for(let n=0;n<12;n+=1){if(!Sm(await fm(e,t)))return!0;await Ut(500)}return!Sm(await fm(e,t))}async function _m(e,t,n,r={}){for(let i=0;i<12;i+=1){if(await vm(e,t,n,r))return!0;await Ut(500)}return await vm(e,t,n,r)}async function vm(e,t,n,r){return await n.readAppFocus(e.device,t,r)}function ym(e){return!!e.lease?.leaseProvider||tr(e.device)}function bm(e){return xm(e).join(` `).trim()}function xm(e){let t=[e.label,e.identifier];return typeof e.value==`string`&&e.value.trim().length>0&&t.push(e.value),t.filter(e=>typeof e==`string`&&e.trim().length>0).map(e=>e.trim())}function Sm(e){return e.filter(hm).some(e=>{let t=bm(e);return t.length>0&&$p.test(t)})}function Cm(e,t,n=e.snapshot){if(e.device.platform!==`android`)return;let r=wm(e,n),i=r?.comparisonSafe===!0;e.androidSnapshotFreshness={action:t,markedAt:Date.now(),baselineCount:(r??n)?.nodes.length??0,baselineSignatures:i?Sr(r?.nodes??[]):void 0,routeComparable:i}}function wm(e,t){if(t?.comparisonSafe===!0)return t;let n=e.lastComparisonSafeSnapshot;return!n||n.comparisonSafe!==!0?t:Date.now()-n.createdAt<=5e3?n:t}function Tm(e){if(!e||e.device.platform!==`android`)return;let t=e.androidSnapshotFreshness;if(t){if(Date.now()-t.markedAt>2500){delete e.androidSnapshotFreshness;return}return t}}function Em(e){!e||e.device.platform!==`android`||delete e.androidSnapshotFreshness}async function Dm(e,t){return jr({capture:e.capture,classify:n=>Cr({snapshot:n.snapshot,rawNodeCount:n.annotations.analysis?.rawNodeCount},t,{interactiveOnly:e.interactiveOnly,mode:e.androidFreshnessMode}),window:t,retry:{retryBudgetMs:xr,delaysMs:Ar},onTrustworthyCapture:()=>Em(e.session)})}function Om(e){let t=new Map,n=[],r=Nn(e);for(let i of e){let e=zm(i,t,r);e&&n.push(e)}return n}function km(e){return e?.comparisonKey??e?.snapshotQuality?.backend}function Am(e,t){return Math.abs(e.x-t.x)<=1&&Math.abs(e.y-t.y)<=1&&Math.abs(e.width-t.width)<=1&&Math.abs(e.height-t.height)<=1}function jm(e,t){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n+=1){let r=e[n],i=t[n];if(!r||!i||r.key!==i.key||!Am(r,i))return!1}return!0}function Mm(e,t){let n=Nm(e),r=Nm(t);if(n.size===0||r.size===0)return`ambiguous`;let i=0,a=!1;for(let[e,t]of n){let n=r.get(e);if(!n){a=!0;continue}if(i+=1,!Am(t,n))return`changed`}if(i===0)return`ambiguous`;let o=r.size>i;return a&&o?`changed`:`unchanged`}function Nm(e){let t=new Map;for(let n of e)!n.identity||!n.discriminating||t.has(n.identity)||t.set(n.identity,n);return t}function Pm(e,t){let n=e.filter(e=>e.discriminating),r=t.filter(e=>e.discriminating);if(n.length===0||n.length!==r.length)return!1;let i=new Map(r.map(e=>[e.key,e]));for(let e of n){let t=i.get(e.key);if(!t||!Am(e,t))return!1}return!0}function Fm(e,t){let n=new Map(t.filter(e=>e.discriminating).map(e=>[e.key,e])),r=0,i=0,a=0;for(let t of e){if(!t.discriminating)continue;let e=n.get(t.key);if(!e){r+=1;continue}n.delete(t.key),a+=1,Am(t,e)||(i+=1)}return{onlyInBaseline:r,onlyInCurrent:n.size,rectMismatched:i,shared:a}}function Im(e,t,n){let r=Lm(Rm(e,n)),i=Lm(Rm(t,n));for(let[e,t]of r){let n=i.get(e);if(!n||!Am(t,n))return!0;i.delete(e)}return i.size>0}function Lm(e){let t=new Map,n=new Map;for(let r of e){let e=t.get(r.content)??0;t.set(r.content,e+1),n.set(`${r.content}|#${e}`,r)}return n}function Rm(e,t){return e.filter(e=>e.discriminating&&e.x<t.x+t.width&&t.x<e.x+e.width&&e.y<t.y+t.height&&t.y<e.y+e.height)}function zm(e,t,n){if(!e.rect||!Wm(e.rect)||Gm(e))return;let r=Um(e);if(!r)return;let i=t.get(r)??0;t.set(r,i+1);let a=Vm(e);return{key:`${r}|#${i}`,...a?{identity:a}:{},content:Bm(e,a),x:Math.round(e.rect.x),y:Math.round(e.rect.y),width:Math.round(e.rect.width),height:Math.round(e.rect.height),discriminating:!Hm(e,n)}}function Bm(e,t){return t??`${e.type??``}|${e.role??``}`}function Vm(e){let t=[e.identifier,e.label,e.value].map(e=>typeof e==`string`?e.trim():``).join(`|`);if(t.replaceAll(`|`,``))return`${t}|${e.type??``}`}function Hm(e,t){return st(e)||e.ref!==void 0&&t.has(e.ref)}function Um(e){let t=[e.identifier,e.label,e.value,e.type,e.role,...ke(e),e.hittable===!0?`hittable`:`not-hittable`].map(e=>typeof e==`string`?e.trim():``).join(`|`);return t.replaceAll(`|`,``)?t:void 0}function Wm(e){return[e.x,e.y,e.width,e.height].every(e=>Number.isFinite(e))&&e.width>0&&e.height>0}function Gm(e){return`${e.label??``} ${e.identifier??``}`.toLowerCase().includes(`scroll bar`)}function Km(e){let{session:t,command:n,action:r=n,positionals:i,flags:a,androidFreshnessBaseline:o}=e;Dr(r)&&Cm(t,r,o??t.snapshot),qm(t,r,i,a)}function qm(e,t,n=[],r){if(!ih(e.device)||!rh(t,n,r))return;let i=ah(e.device)?Om(e.snapshot?.nodes??[]):void 0;e.postGestureStabilization={action:t,positionals:n,markedAt:Date.now(),...i?.length?{baselineSignature:i,baselineBackend:km(e.snapshot)}:{}}}function Jm(e,t){$e(e.device.platform)&&ih(e.device)&&t!==void 0&&t!==`observable`&&(e.postGestureStabilization={action:`open`,positionals:[],markedAt:Date.now()})}function Ym(e){e?.postGestureStabilization&&(e.postGestureStabilization=void 0)}function Xm(e){return!!e?.postGestureStabilization}async function Zm(e){if(Ze(e.device)&&e.session&&Xm(e.session))return await Qm({...e,session:e.session});let t=Tm(e.session);if(t&&e.device.platform===`android`){let n=await Dm(e,t);return{snapshot:n.snapshot,...n.annotations}}}async function Qm(e){return th(await eh({session:e.session,capture:async()=>await $m(e),readSnapshot:e=>e.snapshot}))}async function $m(e){let t=Tm(e.session);return t&&e.device.platform===`android`?await Dm(e,t):await e.capture()}async function eh(e){let{session:t,capture:n,readSnapshot:r}=e,i=t?.postGestureStabilization;if(!t||!ih(t.device)||!i)return{value:e.initial??await n()};try{return await kr({pending:{action:i.action,positionals:i.positionals??[],baselineSignature:i.baselineSignature,baselineBackend:i.baselineBackend},needsBaselineDistrust:ah(t.device),initial:e.initial,hooks:{capture:n,readSurface:e=>{let t=r(e);return{signature:Om(t.nodes),backend:km(t)}},signaturesStable:jm,classifyBaselineEvidence:Mm,surfacesIdentical:Pm,summarizeDivergence:Fm}})}finally{Ym(t)}}function th(e){let{snapshot:t,annotations:n}=e.value;return e.postGestureOutcome&&(t.postGestureOutcome=e.postGestureOutcome),{snapshot:t,...n}}function nh(e){if(!e?.postGestureStabilization)return e;let{postGestureStabilization:t,...n}=e;return n}function rh(e,t,n){return n?.postGestureStabilization===!1?!1:n?.postGestureStabilization===!0||e===`swipe`||e===`scroll`||e===`gesture`&&t[0]===`swipe`}function ih(e){return Ze(e)}function ah(e){return $e(e.platform)}function oh(e){if(typeof e.gestureClockOriginAtMs==`number`&&typeof e.gestureClockOriginUptimeMs==`number`&&typeof e.gestureStartUptimeMs==`number`){let t=e.gestureClockOriginAtMs+(e.gestureStartUptimeMs-e.gestureClockOriginUptimeMs);return Math.max(0,t-e.recordingStartedAt)}if(typeof e.runnerStartedAtUptimeMs==`number`&&typeof e.gestureStartUptimeMs==`number`)return Math.max(0,e.gestureStartUptimeMs-e.runnerStartedAtUptimeMs);if(typeof e.gestureStartUptimeMs==`number`&&typeof e.gestureEndUptimeMs==`number`){let t=e.fallbackFinishedAtMs-(e.gestureEndUptimeMs-e.gestureStartUptimeMs);return Math.max(0,t-e.recordingStartedAt)}return Math.max(0,e.fallbackStartedAtMs-e.recordingStartedAt)}function sh(e){return typeof e.gestureStartUptimeMs==`number`&&typeof e.gestureEndUptimeMs==`number`?Math.max(0,e.gestureEndUptimeMs-e.gestureStartUptimeMs):typeof e.reportedDurationMs==`number`?Math.max(0,e.reportedDurationMs):Math.max(0,e.fallbackFinishedAtMs-e.fallbackStartedAtMs)}function ch(e){let t=Math.max(0,e.gestureDurationMs);if(t<600)return oh(e);let n=Math.min(Math.max(t*.15,120),260);return Math.max(0,e.fallbackFinishedAtMs-n-e.recordingStartedAt)}function J(e){if(typeof e==`number`&&Number.isFinite(e))return e;if(typeof e!=`string`||e.trim().length===0)return;let t=Number(e);return Number.isFinite(t)?t:void 0}function lh(e,t,n){for(let r of[e,...t,n]){let e=J(r);if(e!==void 0&&e>=1)return Math.floor(e)}return n}function uh(e,t,n,r,i){switch(t.kind){case`pan`:case`fling`:case`rotate`:case`transform`:{let e=mh(t.from),a=mh(t.to);if(!e||!a)return[];let o=(t.kind===`pan`||t.kind===`fling`)&&J(t.pointerCount)!==2;return[dh(n,e.x,e.y,a.x,a.y,lh(r,[t.durationMs],250),{referenceFrame:i,classifyBackSwipe:o})]}case`pinch`:{let a=mh(t.from),o=J(t.scale)??J(e[1]);return!a||o===void 0||o<=0?[]:[{kind:`pinch`,tMs:n,x:a.x,y:a.y,...i,scale:o,durationMs:lh(r,[t.durationMs],280)}]}default:return[]}}function dh(e,t,n,r,i,a,o={}){let{referenceFrame:s,classifyBackSwipe:c=!0}=o,l=c?fh(t,n,r,i,s):`swipe`;return l===`back-swipe`?{kind:l,tMs:e,x:t,y:n,x2:r,y2:i,...s,durationMs:a,edge:ph(t,r,s)}:{kind:l,tMs:e,x:t,y:n,x2:r,y2:i,...s,durationMs:a}}function fh(e,t,n,r,i){if(!i||Math.abs(n-e)<=Math.abs(r-t)*1.25)return`swipe`;let a=i.referenceWidth*.08;return e<=a&&n>e||e>=i.referenceWidth-a&&n<e?`back-swipe`:`swipe`}function ph(e,t,n){if(n){let t=n.referenceWidth*.08;if(e<=t)return`left`;if(e>=n.referenceWidth-t)return`right`}return t>=e?`left`:`right`}function mh(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e,n=J(t.x),r=J(t.y);if(n!==void 0&&r!==void 0)return{x:n,y:r}}const hh={referenceWidth:1e3,referenceHeight:1e3};function gh(e,t,n,r,i={},a=Date.now(),o=Date.now()){let s=e.screenRecording?.handle;if(!s)return;let c=s.inspect(),l={...i,...r??{}},u=J(l.effectiveDurationMs)??J(l.durationMs),d={recordingStartedAt:c.startedAt,gestureClockOriginAtMs:c.gestureClockOriginAtMs,gestureClockOriginUptimeMs:c.gestureClockOriginUptimeMs,runnerStartedAtUptimeMs:c.runnerStartedAtUptimeMs,gestureStartUptimeMs:J(l.gestureStartUptimeMs),gestureEndUptimeMs:J(l.gestureEndUptimeMs),fallbackStartedAtMs:a,fallbackFinishedAtMs:o},f=sh({gestureStartUptimeMs:J(l.gestureStartUptimeMs),gestureEndUptimeMs:J(l.gestureEndUptimeMs),reportedDurationMs:u,fallbackStartedAtMs:a,fallbackFinishedAtMs:o}),p=tt(e.device)&&J(l.gestureStartUptimeMs)===void 0&&xh(t,l)?ch({...d,gestureDurationMs:f}):oh(d),m=yh(t,n,l,p,f,Ah(e.snapshot,l));m.length!==0&&(s.appendGestureEvents(m),j({level:`debug`,phase:`record_touch_visualization_event`,data:{session:e.name,command:t,count:m.length,tMs:p,gestureDurationMs:f,kinds:m.map(e=>e.kind)}}))}function _h(e,t,n,r){if(t!==`scroll`)return r;let i=Wn(e.snapshot),a={...r??{}},o=jh(a.direction)??jh(n[0]);if(!o)return r;let s=J(a.amount)??J(n[1]),c=J(a.pixels),l=J(a.durationMs)??vh(e),u=Nh(a,[]),d=J(a.referenceWidth),f=J(a.referenceHeight),p=d!==void 0&&d>0&&f!==void 0&&f>0?{referenceWidth:d,referenceHeight:f}:i??hh;if(u&&(u.x1!==u.x2||u.y1!==u.y2))return{...a,x1:u.x1,y1:u.y1,x2:u.x2,y2:u.y2,contentDirection:o,...s===void 0?{}:{amount:s},...c===void 0?{}:{pixels:c},referenceWidth:p.referenceWidth,referenceHeight:p.referenceHeight,durationMs:l};let m=oe({direction:o,amount:s,pixels:c,referenceWidth:p.referenceWidth,referenceHeight:p.referenceHeight});return{...a,x1:m.x1,y1:m.y1,x2:m.x2,y2:m.y2,contentDirection:o,...s===void 0?{}:{amount:s},...m.pixels===void 0?{}:{pixels:m.pixels},referenceWidth:p.referenceWidth,referenceHeight:p.referenceHeight,durationMs:l}}function vh(e){return e.device.target===`desktop`||e.device.target===`tv`?250:300}function yh(e,t,n,r,i,a){let o=bh[e];return o?.(t,n,r,i,a)??[]}const bh={click:(e,t,n,r,i)=>Sh(e,t,n,i),press:(e,t,n,r,i)=>Sh(e,t,n,i),"react-native":(e,t,n,r,i)=>e[0]===`dismiss-overlay`?Sh(e,t,n,i):[],fill:(e,t,n,r,i)=>Ch(e,t,n,i),focus:(e,t,n,r,i)=>Ch(e,t,n,i),longpress:wh,scroll:Dh,gesture:uh,swipe:Th};function xh(e,t){switch(e){case`click`:case`fill`:case`focus`:return!0;case`press`:{let e=Y(J(t.count),1)??1,n=t.doubleTap===!0,r=Y(J(t.holdMs),1);return e===1&&!n&&r===void 0}case`react-native`:return t.action===`dismiss-overlay`;default:return!1}}function Sh(e,t,n,r){let i=Mh(t,e);if(!i)return[];let{x:a,y:o}=i,s=Y(J(t.count),1)??1,c=Y(J(t.intervalMs),0)??0,l=t.doubleTap===!0,u=Y(J(t.holdMs),1),d=[];for(let e=0;e<s;e+=1){let t=n+e*c;if(u!==void 0&&u>0){d.push(kh(t,a,o,u,r));continue}d.push(Oh(t,a,o,r)),l&&d.push(Oh(t+90,a,o,r))}return d}function Ch(e,t,n,r){let i=Mh(t,e);if(!i)return[];let{x:a,y:o}=i;return[Oh(n,a,o,r)]}function wh(e,t,n,r,i){let a=Mh(t,e);if(!a)return[];let{x:o,y:s}=a;return[kh(n,o,s,lh(r,[J(t.durationMs),J(e[2])],800),i)]}function Th(e,t,n,r,i){let a=Nh(t,e);if(!a)return[];let{x1:o,y1:s,x2:c,y2:l}=a,u=lh(r,[J(t.effectiveDurationMs),J(t.durationMs)],250),d=Y(J(t.count),1)??1,f=Y(J(t.pauseMs),0)??0,p=t.pattern===`ping-pong`?`ping-pong`:`one-way`;return Array.from({length:d},(e,t)=>{let{startX:r,startY:a,endX:d,endY:m}=Eh(t,p,o,s,c,l);return dh(n+t*(u+f),r,a,d,m,u,{referenceFrame:i})})}function Eh(e,t,n,r,i,a){return t===`ping-pong`&&e%2==1?{startX:i,startY:a,endX:n,endY:r}:{startX:n,startY:r,endX:i,endY:a}}function Dh(e,t,n,r,i){let a=Nh(t,e),o=jh(t.contentDirection)??jh(t.direction);if(!a||!o)return[];let{x1:s,y1:c,x2:l,y2:u}=a,d=lh(r,[],250),f=J(t.amount)??J(e[1]),p=J(t.pixels);return[{kind:`scroll`,tMs:n,x:s,y:c,x2:l,y2:u,...i,durationMs:d,contentDirection:o,...f===void 0?{}:{amount:f},...p===void 0?{}:{pixels:p}}]}function Oh(e,t,n,r){return{kind:`tap`,tMs:e,x:t,y:n,...r}}function kh(e,t,n,r,i){return{kind:`longpress`,tMs:e,x:t,y:n,...i,durationMs:r}}function Ah(e,t){let n=J(t.referenceWidth),r=J(t.referenceHeight);return n!==void 0&&n>0&&r!==void 0&&r>0?{referenceWidth:n,referenceHeight:r}:Wn(e)}function jh(e){if(typeof e!=`string`)return;let t=e.trim().toLowerCase();switch(t){case`up`:case`down`:case`left`:case`right`:return t;default:return}}function Y(e,t){if(e===void 0)return;let n=Math.floor(e);return n>=t?n:void 0}function Mh(e,t,n=0){let r=J(e.x)??J(t[n]),i=J(e.y)??J(t[n+1]);if(r!==void 0&&i!==void 0)return{x:r,y:i}}function Nh(e,t){let n=Ph(e.x1,e.x,t[0]),r=Ph(e.y1,e.y,t[1]),i=Ph(e.x2,t[2]),a=Ph(e.y2,t[3]);if(n!==void 0&&r!==void 0&&i!==void 0&&a!==void 0)return{x1:n,y1:r,x2:i,y2:a}}function Ph(...e){return e.map(J).find(e=>e!==void 0)}var Fh=e({dispatchGenericCommand:()=>Ih});async function Ih(e){let{req:t,ref:n,logPath:r,sessionStore:i,contextFromFlags:a}=e,o=i.requireCurrent(n),s=t.command,c=await Hh(o,s,e.androidObservation);if(c.response)return c.response;let l=await zh({sessionRef:n,req:t,session:o,sessionName:e.sessionName,logPath:r,sessionStore:i,contextFromFlags:a,platformServices:e.platformServices,command:s,flags:t.flags,createCommandSurface:e.createCommandSurface});if(`response`in l)return l.response;let u=await Vh(o,s,e.androidObservation);if(`response`in u)return u.response;let d=t.positionals??[],f=e.recordedRequest??{positionals:d,flags:t.flags??{}},p=Date.now(),m=i.requireCurrent(n),h={...a(t.flags,m.appBundleId,m.trace?.outPath),surface:m.surface};return mu(t)===`may-invalidate`&&Vp(m),await Lh({req:t,ref:n,sessionStore:i,command:s,resolvedPositionals:d,recorded:f,data:await e.executePlatformCommand({session:m,sessionName:e.sessionName,logPath:r,command:s,request:t,positionals:d,out:t.flags?.out,dispatchContext:h}),actionStartedAt:p,readinessWarnings:[c.warning,u.status===`recovered`?u.warning:void 0],observeSettle:l.observe,androidObservation:e.androidObservation})}async function Lh(e){let{req:t,ref:n,sessionStore:r,command:i}=e,a=await Vh(r.requireCurrent(n),i,e.androidObservation,`after-command`);if(`response`in a)return a.response;let o=Rh(e.data,e.readinessWarnings);if(Uh({ref:n,sessionStore:r,command:i,resolvedPositionals:e.resolvedPositionals,recorded:e.recorded,data:o,actionStartedAt:e.actionStartedAt,actionFinishedAt:Date.now(),flags:t.flags??{},clientArtifactPaths:t.meta?.clientArtifactPaths}),Km({session:r.requireCurrent(n),command:i,positionals:e.resolvedPositionals,flags:t.flags}),e.observeSettle){let t=await e.observeSettle();t&&(o={...o??{},settle:t})}return{ok:!0,data:o??{}}}function Rh(e,t){let n=t.filter(e=>typeof e==`string`&&e.length>0);if(n.length===0||e&&typeof e!=`object`)return e;let r=e&&typeof e.warning==`string`&&e.warning.length>0?[e.warning]:[];return{...e??{},warning:[...r,...n].join(` `)}}async function zh(e){return!Tt(e.command)||!Bh(e.flags)?{}:(await import(`../generic-settle.js`)).planGenericSettleObservation(e)}function Bh(e){return e?.settle===!0||e?.settleQuietMs!==void 0}async function Vh(e,t,n,r=`before-command`){if(e.device.platform!==`android`||!lu(t)||tr(e.device))return{status:`clear`};try{return await im({session:e,command:t,phase:r,observation:n})}catch(e){return{response:{ok:!1,error:s(e)}}}}async function Hh(e,t,n){if(e.device.platform!==`android`||tr(e.device)||!e.screenRecording||t===`record`)return{};let r=await rm({session:e,observation:n});return r.status===`failed`?{response:{ok:!1,error:{code:`COMMAND_FAILED`,message:`Android system dialog blocked the recording session`}}}:r.status===`unknown`?{warning:r.warning}:{}}function Uh(e){let{ref:t,sessionStore:n,command:r,resolvedPositionals:i,recorded:a,data:o,actionStartedAt:s,actionFinishedAt:c,flags:l,clientArtifactPaths:u}=e,d=n.requireCurrent(t);gh(d,r,i,_h(d,r,i,o),l,s,c),n.recordAction(t,{command:r,positionals:a.positionals,flags:a.flags,result:Pn({command:r,meta:{clientArtifactPaths:u}},o??{})})}function Wh(e){let t=e.now??Date.now,n=e.undurableCleanupTtlMs??3e5,r=new Map;return Object.freeze({blockUndurableCleanup(e,i){let a=qe(e);r.set(Je(a),{device:a,reason:i,expiresAt:t()+n})},clearUndurableCleanup(e){r.delete(Je(qe(e)))},assertStartAllowed(n){let i=Je(qe(n)),o=r.get(i);if(o){if(t()>o.expiresAt){r.delete(i),e.onUndurableCleanupExpired?.({device:o.device,reason:o.reason});return}throw new a(`COMMAND_FAILED`,`The existing ${e.displayName.toLowerCase()} resource has process-local unconfirmed ownership`,{reason:`cleanup-unconfirmed`,hint:`Do not start a replacement in this daemon process: ${o.reason}`})}}})}function Gh(){return Wh({displayName:`audio probe`})}function Kh(){return Wh({displayName:`perf capture`})}function qh(){return Wh({displayName:`screen recording`})}const Jh={humanControl:X({load:()=>import(`../human-control.js`),run:Zh}),lease:X({load:()=>import(`../lease.js`),run:Qh}),session:X({load:()=>import(`../session2.js`),run:$h}),snapshot:X({load:()=>import(`../snapshot3.js`),run:eg}),reactNative:X({load:()=>import(`../react-native.js`),run:tg}),recordTrace:X({load:()=>import(`../record-trace.js`),run:ng}),find:X({load:()=>import(`../interaction.js`),run:rg}),interaction:X({load:()=>import(`../interaction.js`),run:ig}),generic:X({load:async()=>Fh,run:async()=>null})};async function Yh(e){let t=Ql(e.req.command);return await Jh[t].run(e)}async function Xh(){return await Jh.generic.loadModule()}async function Zh({handleHumanControlCommand:e},t){return await e({req:t.req,registry:t.leaseRegistry})}async function Qh({handleLeaseCommands:e},t){return Z(t.req.command,`lease`,await e({req:t.req,sessionName:t.sessionName,sessionStore:t.sessionStore,leaseRegistry:t.leaseRegistry,providerRuntimeIds:t.providerRuntimeIds,providerRuntimeRequiredIds:t.providerRuntimeRequiredIds,providerCredentials:t.providerCredentials,leaseLifecycleProvider:t.leaseLifecycleProvider,cloudArtifactProvider:t.cloudArtifactProvider}))}async function $h({handleSessionCommands:e},t){return Z(t.req.command,`session`,await e({req:t.req,sessionName:t.sessionName,logPath:t.logPath,sessionStore:t.sessionStore,createCommandSurface:t.createCommandSurface,leaseRegistry:t.leaseRegistry,leaseLifecycleProvider:t.leaseLifecycleProvider,providerAppCatalog:t.providerAppCatalog,invoke:t.invoke,invokeReplayAction:t.invokeReplayAction,androidAdbExecutor:t.providerScope.androidAdbExecutor,bindDevice:t.bindDevice,platformServices:t.platformServices,inspectFacts:t.inspectFacts,bindExactDevice:t.bindExactDevice,reconcileOrphanedDeviceClaim:t.reconcileOrphanedDeviceClaim,appLogAdmissionLedger:t.appLogAdmissionLedger,audioProbeAdmissionLedger:t.audioProbeAdmissionLedger,perfCaptureAdmissionLedger:t.perfCaptureAdmissionLedger,screenRecordingAdmissionLedger:t.screenRecordingAdmissionLedger,hostDiagnostics:t.hostDiagnostics,requestScope:t.requestScope,retainDeviceExecutionLock:t.retainDeviceExecutionLock,throwIfCanceled:t.throwIfCanceled,platformResourceCleanup:t.platformResourceCleanup}))}async function eg({handleSnapshotCommands:e},t){return Z(t.req.command,`snapshot`,await e({req:t.req,sessionName:t.sessionName,logPath:t.logPath,sessionStore:t.sessionStore,createCommandSurface:t.createCommandSurface,inspectFacts:t.inspectFacts,platformServices:t.platformServices,bindDevice:t.bindDevice,platformResourceCleanup:t.platformResourceCleanup}))}async function tg({handleReactNativeCommands:e},t){return Z(t.req.command,`react-native`,await e({req:t.req,createCommandSurface:t.createCommandSurface,sessionName:t.sessionName,logPath:t.logPath,sessionStore:t.sessionStore,contextFromFlags:t.contextFromFlags,inspectFacts:t.inspectFacts,platformServices:t.platformServices,bindDevice:t.bindDevice}))}async function ng({handleRecordTraceCommands:e},t){return Z(t.req.command,`record-trace`,await e({req:t.req,sessionName:t.sessionName,sessionStore:t.sessionStore,logPath:t.logPath,bindDevice:t.bindDevice,platformServices:t.platformServices,bindExactDevice:t.bindExactDevice,admissionLedger:t.screenRecordingAdmissionLedger,requestScope:t.requestScope,retainDeviceExecutionLock:t.retainDeviceExecutionLock,throwIfCanceled:t.throwIfCanceled}))}async function rg({handleFindCommands:e},t){return Z(t.req.command,`find`,await e({req:t.req,sessionName:t.sessionName,logPath:t.logPath,sessionStore:t.sessionStore,createCommandSurface:t.createCommandSurface,invoke:t.invoke,inspectFacts:t.inspectFacts,platformServices:t.platformServices,bindDevice:t.bindDevice}))}async function ig({handleInteractionCommands:e},t){return Z(t.req.command,`interaction`,await e({req:t.req,sessionName:t.sessionName,logPath:t.logPath,sessionStore:t.sessionStore,createCommandSurface:t.createCommandSurface,contextFromFlags:t.contextFromFlags,inspectFacts:t.inspectFacts,platformServices:t.platformServices,bindDevice:t.bindDevice,androidObservation:t.androidObservation}))}function X(e){let t=ag(e.load);return{loadModule:t,run:async n=>await e.run(await t(),n)}}function ag(e){let t;return()=>(t??=e(),t)}function Z(e,t,n){if(n)return n;throw new a(`UNKNOWN`,`Daemon handler routing mismatch: ${t} handler matched command "${e}" but returned no response.`,{hint:`This is a daemon-internal routing bug in agent-device — please report it.`})}const og=`activity.launchConsole.launchArgs.clearAppState.verbose.iosXctestrunFile.iosXctestDerivedDataPath.iosXctestEnvDir.snapshotInteractiveOnly.snapshotPreferredBackend.snapshotDepth.snapshotScope.snapshotRaw.snapshotCustomActions.snapshotIncludeHiddenContentHints.count.intervalMs.delayMs.durationMs.holdMs.jitterPx.pixels.until.doubleTap.backMode.pauseMs.pattern`.split(`.`);function sg(e){return Object.fromEntries(og.map(t=>[t,e?.[t]]))}function cg(e,t,n,r,i,a){return{requestId:i??A().requestId,appBundleId:n,runnerLeaseContext:Of({meta:a}),logPath:e,traceLogPath:r,...sg(t),screenshotCaptureBackend:t?.maestro?.screenshotCaptureBackend,...se(t),clickButton:je(t)}}function lg(e){return`${e.device.platform} device "${e.device.name.trim()}" (${e.device.id})`}function ug(e,t,n={}){return e.session.screenRecording?pg(e.address,t):hg(e,t,n)}function dg(e,t,n={}){return g(`DEVICE_IN_USE`,`Device is already in use by session "${e.address}".`,{session:e.address,deviceId:t.id,deviceName:t.name,...n.waitedMs===void 0?{}:{waitedMs:n.waitedMs},hint:ug(e,`device-in-use`,n)})}function fg(e,t,n={}){return g(`DEVICE_IN_USE`,`Device is already in use by workspace session "${e.address}".`,{reason:`WORKSPACE_SESSION_SCOPE_CONFLICT`,session:e.address,deviceId:t.id,deviceName:t.name,...n.waitedMs===void 0?{}:{waitedMs:n.waitedMs},hint:mg(e.address,n)})}function pg(e,t){let n=wn(e),r=`agent-device close --session ${n}`;return`Recording session "${e}" owns this device. Run ${`agent-device record stop --session ${n}`}; if the session still appears in agent-device session list, run ${r}. ${t===`selector-conflict`?`To keep using this device, rerun the command with --session ${n} and remove conflicting device selectors.`:`To keep using this device, reuse --session ${n} for commands that should attach to the recording session.`} Run agent-device session list to inspect active sessions.`}function mg(e,t){let n=wn(e);return`${gg(t)}Session "${e}" belongs to another workspace. Run agent-device close --session ${n} to release this device from that workspace, agent-device devices to choose another device. ${_g(t)}Run agent-device session list to inspect active sessions.`}function hg(e,t,n){let r=e.address,i=wn(r),a=`agent-device close --session ${i}`;return t===`selector-conflict`?`Run agent-device session list to inspect active sessions. To reuse this device, rerun the command with --session ${i} and remove conflicting device selectors. To switch devices, first run ${a}, then open the desired device with a different --session name.`+vg(e,n):`${gg(n)}Run agent-device session list to inspect active sessions. To reuse this device, rerun the command with --session ${i}. To open a new session on this device, first run ${a}. `+`${_g(n)}`.trimEnd()}function gg(e){return e.waitedMs===void 0?``:`Waited ${Math.round(e.waitedMs)}ms for this device and it stayed busy. `}function _g(e){return e.offersDeviceWait&&e.waitedMs===void 0?`To wait for the device to free up, run the same open with --wait <ms>. `:``}function vg(e,t){return t.offersPlatformSession===!0&&e.session.sessionScope?.kind===`cwd`?` Or name the other platform with --platform to open its own session for this workspace.`:``}function yg(e,t){let{address:n,session:r}=e,i=bg(r,t);if(i.length!==0)throw new a(`INVALID_ARGS`,`Session "${n}" is already bound to ${lg(r)}, but this request selected ${i.map(xg).join(`, `)}.`,{session:n,conflicts:i.map(xg),hint:ug(e,`selector-conflict`,{offersPlatformSession:i.some(e=>e.key===`platform`)})})}function bg(e,t){if(!t)return[];let n=[],r=e.device,i=t.platform;if(i&&!it(r,i)&&n.push({key:`platform`,value:t.platform}),t.target&&t.target!==(r.target??`mobile`)&&n.push({key:`target`,value:t.target}),t.udid&&(!tt(r)||t.udid!==r.id)&&n.push({key:`udid`,value:t.udid}),t.serial&&(!Qe(r.platform)||t.serial!==r.id)&&n.push({key:`serial`,value:t.serial}),t.device&&!Ye(r,t.device)&&n.push({key:`device`,value:t.device}),t.iosSimulatorDeviceSet){let e=t.iosSimulatorDeviceSet.trim(),i=r.simulatorSetPath?.trim();(!tt(r)||r.kind!==`simulator`||e!==i)&&n.push({key:`iosSimulatorDeviceSet`,value:t.iosSimulatorDeviceSet})}if(t.androidDeviceAllowlist){let e=yr(t.androidDeviceAllowlist);(r.platform!==`android`||!e.has(r.id))&&n.push({key:`androidDeviceAllowlist`,value:t.androidDeviceAllowlist})}return n}function xg(e){return`${Sg(e.key)}=${e.value}`}function Sg(e){switch(e){case`iosSimulatorDeviceSet`:return`--ios-simulator-device-set`;case`androidDeviceAllowlist`:return`--android-device-allowlist`;default:return`--${e}`}}const Cg=`default`,wg=new Set(nt);function Tg(e,t,n={}){let r=e.session||Cg;if(jg(e))return r;let i=Og(e);return i.kind===`cwd`?Ng(e,t,i.id,n):r}function Eg(e){return e.session||Cg}function Dg(e){let t=Og(e);return t.kind===`cwd`?t:void 0}function Og(e){if(e.meta?.sessionIsolation===`tenant`||e.flags?.sessionIsolation===`tenant`){let t=e.meta?.tenantId;if(!t)throw new a(`INTERNAL_ERROR`,`Tenant-scoped request reached session routing without an admitted tenant id`);return{kind:`tenant`,id:t}}if(jg(e)||(e.session||Cg)!==Cg)return{kind:`named-local`};let t=Gg(e.meta?.cwd);return t?{kind:`cwd`,id:Wg(t)}:{kind:`global-default`}}function kg(e,t){let n=e.sessionScope;return n?t.kind===`tenant`?n.kind===`tenant`&&n.id===t.id:n.kind===`tenant`?!1:t.kind!==`cwd`||n.kind===`named-local`||n.kind===`cwd`&&n.id===t.id:!1}function Ag(e,t){let n=Dg(e);return!n||t.sessionScope?.kind!==`cwd`?!1:t.sessionScope.id!==n.id}function jg(e){if(e.meta?.sessionExplicit===!0)return!0;let t=e.flags?.session;return typeof t==`string`&&t.trim().length>0}function Mg(e,t){return`cwd:${e}:${t}`}function Ng(e,t,n,r){let i=zg(t,n),a=Bg(e);return a?Pg(e,t,n,a,i,r):Rg(n,i,r)}function Pg(e,t,n,r,i,a){let o=Mg(n,r);if(t.get(o))return o;let s=Lg(e.flags,r),c=i.map(e=>({ref:e,conflicts:bg(e.session,s)})),l=c.filter(e=>e.conflicts.length===0),[u]=l;return u&&l.length===1?u.ref.address:l.length>1?(Hg(a,l.map(e=>e.ref)),o):Fg(c)?.address??o}function Fg(e){return e.find(e=>!Ig(e.conflicts))?.ref}function Ig(e){return e.some(e=>e.key===`platform`)}function Lg(e,t){return{...e,platform:t}}function Rg(e,t,n){let[r]=t;return r&&t.length===1?r.address:(Hg(n,t),Mg(e,Cg))}function zg(e,t){let n=new Set,r=[];for(let i of e.listRefs()){let e=i.session.sessionScope;e?.kind===`cwd`&&e.id===t&&(n.has(i.session)||(n.add(i.session),r.push(i)))}return r}function Bg(e){return Vg(e.flags?.platform)??Vg(e.meta?.lockPlatform)}function Vg(e){if(typeof e!=`string`)return;let t=e.trim().toLowerCase();return wg.has(t)?t:void 0}function Hg(e,t){if(t.length>1&&e.attachesToSession===!0)throw Ug(t)}function Ug(e){let t=e.map(e=>e.address),n=e.map(e=>M(e.session.device)),r=n.map(e=>`--platform ${e}`).join(` or `);return new a(`AMBIGUOUS_MATCH`,`This workspace has ${e.length} implicit sessions (${t.join(`, `)}); select one explicitly.`,{sessions:t,platforms:n,hint:`Run agent-device session list to inspect them. Add ${r} to run in that platform's session, or pass --session <address> copied from that list.`})}function Wg(e){return P.createHash(`sha256`).update(e).digest(`hex`).slice(0,16)}function Gg(e){if(!e||e.trim().length===0)return;let t=Kg(e);return qg(t)??t}function Kg(e){let t=I.resolve(e);try{return F.realpathSync.native(t)}catch{return t}}function qg(e){let t=e;for(;;){if(F.existsSync(I.join(t,`.git`)))return t;let e=I.dirname(t);if(e===t)return;t=e}}const Jg=new Set([`udid`,`serial`,`device`]);function Yg(e){return Jg.has(e.key)}function Xg(e,t){let n=e.meta?.lockPolicy;if(!n)return e;let r={...e.flags??{}},i=cu(e.command),o=i?[]:t?bg(t.session,r):n_(r,e.meta?.lockPlatform),s=e.meta?.lockPlatform;if(o.length===0)return e_(i,t,r,s)&&(r.platform=s),{...e,flags:r};let c=o.filter(Yg);if(n===`strip`&&c.length===0)return t_(r,o,s,t?.session),{...e,flags:r};throw new a(`INVALID_ARGS`,Qg(e,o,t),{session:t?.address??e.session,conflicts:o.map(xg),...Zg(c,t?.session),hint:$g(e,t,c)})}function Zg(e,t){return e.length===0?{}:{requestedDevice:Object.fromEntries(e.map(e=>[e.key,e.value])),...t?{boundDevice:{platform:t.device.platform,name:t.device.name,id:t.device.id}}:{}}}function Qg(e,t,n){let r=t.map(xg).join(`, `);if(n)return`Session "${n.address}" is already bound to ${lg(n.session)}, but ${e.command} selected ${r}.`;let i=e.meta?.lockPlatform,a=i?` for ${i}`:``;return`${e.command} is using a bound-session lock${a}, but this request selected ${r}.`}function $g(e,t,n){if(t)return ug(t,`selector-conflict`);let r=e.meta?.lockPlatform,i=e.session?` --session ${wn(e.session)}`:``,a=r?`Run agent-device open <app>${i} --platform ${r} first if no session is active. `:`Run agent-device open <app>${i} first if no session is active. `;return n.length>0?`Remove ${n.map(xg).join(`, `)} and rerun to use the session-lock device, or drop --session so this command binds to the device you selected. `+a+`Run agent-device session list to inspect active sessions.`:`Remove conflicting device selectors from this command, or use --session-lock strip to let agent-device ignore them. `+a+`Run agent-device session list to inspect active sessions.`}function e_(e,t,n,r){return!r||t||n.platform!==void 0?!1:!e||!Ep(n)}function t_(e,t,n,r){if(r){l_(e,t),e.platform=M(r.device);return}l_(e,t),n&&e.platform===void 0&&(e.platform=n)}function n_(e,t){let n=[],r=t;return e.platform!==void 0&&r&&Xe(e.platform,r)&&n.push({key:`platform`,value:e.platform}),r?(r_(n,e,r),a_(n,e,r),n):n}function r_(e,t,n){let r=t.target;r&&i_(r,n)&&e.push({key:`target`,value:r})}function i_(e,t){switch(t){case`android`:case`harmonyos`:case`ios`:return e===`desktop`;case`vega`:return e!==`tv`;case`macos`:case`linux`:case`web`:return e!==`desktop`;case`apple`:return!1;default:return u_(t)}}function a_(e,t,n){for(let r of o_(n,t)){let n=t[r];Dp(n)&&e.push({key:r,value:n})}}function o_(e,t){if(s_(e))return[`udid`,`iosSimulatorDeviceSet`];switch(e){case`vega`:return[`udid`,`iosSimulatorDeviceSet`,`androidDeviceAllowlist`];case`ios`:return[`serial`,`androidDeviceAllowlist`];case`apple`:return c_(t)?[`udid`,`serial`,`androidDeviceAllowlist`,`iosSimulatorDeviceSet`]:[`serial`,`androidDeviceAllowlist`];case`macos`:case`linux`:case`web`:return[`udid`,`serial`,`iosSimulatorDeviceSet`,`androidDeviceAllowlist`];default:return u_(e)}}function s_(e){return e===`android`||e===`harmonyos`}function c_(e){return e.target===`desktop`||e.platform===`macos`}function l_(e,t){for(let n of t)delete e[n.key]}function u_(e){throw Error(`Unhandled lock platform: ${String(e)}`)}async function d_(e){if(e.command!==`replay`||e.flags?.replayFrom!==void 0)return;let t=e.flags?.replayScriptSource;if(t)return m_(async()=>{let n=t.entry,r=Vn(t,n),i=be(n,e.flags?.replayBackend);return i===`ad`?p_(r,e.flags):await f_(i,r,n,e.flags)})}async function f_(e,t,n,r){let i=await(await import(`../replay-backend-registry.js`).then(e=>e.n)).getReplayBackend(e);return{flags:r??{},options:Bn(i.inspectSource(t,n).appTarget,r?.platform)}}function p_(e,t){let n=li(e,t),r=Ln(n.actions);if(!r.appTarget)return;let i=Un(t,n.actions),a=i.platform??n.metadata.platform;return{flags:a&&i.platform===void 0?{...i,platform:a}:i,options:a===`ios`?Gn(r.appTarget):void 0}}async function m_(e){try{return await e()}catch{return}}function h_(e,t){return E_([w_(e),T_(t)])}async function g_(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n);if(i)return{keys:h_(n,i.device.id),deviceId:i.device.id};let a=new Set([w_(n)]),o=await b_(t);return o&&a.add(T_(o.id)),{keys:E_(a),deviceId:o?.id}}function __(e){let{existingRef:t}=e;return{req:Xg(e.req,t),existingRef:t}}function v_(e){if(!e.meta?.lockPolicy)return e;try{return Xg(e)}catch{return e}}async function y_(e){return e.command===`open`?x_(e):e.command===`replay`?await S_(e):C_(e)}async function b_(e){let t=await y_(v_(e));if(t)try{return await Fn(t.flags,t.options)}catch{return}}function x_(e){let t=Rn(e.positionals?.[0]);return t?{flags:e.flags??{},options:t}:void 0}async function S_(e){return await d_(e)??C_(e)}function C_(e){return Tp(e.flags)?{flags:e.flags??{},options:{}}:void 0}function w_(e){return`session:${e}`}function T_(e){return`device:${e}`}function E_(e){return Array.from(e).sort((e,t)=>{let n=D_(e)-D_(t);return n===0?e.localeCompare(t):n})}function D_(e){return+!e.startsWith(`session:`)}function O_(e){let t=e.flags??{};if(t.waitMs===void 0)return;let[n]=Ce(`waitMs`);if(!n)throw new a(`INTERNAL_ERROR`,`The waitMs option has no flag declaration whose bounds the daemon can enforce.`);return de(t,`waitMs`,{min:n.min,max:n.max})}function k_(e){let t=e.internal?.openDeviceWait?.waitedMs;return t===void 0?{}:{waitedMs:t}}function A_(e){return{...k_(e),offersDeviceWait:e.command===`open`&&typeof e.flags?.waitMs!=`number`}}function j_(e){let{req:t,budgetMs:n,sessionName:r,sessionStore:i,deviceId:a}=e;if(t.command===`open`&&n!==void 0&&!(a===void 0||i.get(r)))return N_({req:t,sessionName:r,sessionStore:i,deviceId:a,budgetMs:n})}function M_(e,t,n){let r=e.findByDevice(t);if(!(!r||r.address===n))return r}function N_(e){let{req:t,sessionName:n,sessionStore:r,deviceId:i,budgetMs:a}=e,o=Gt.fromTimeoutMs(a),s=()=>M_(r,i,n),c=async()=>{for(;;){let e=s();if(!e||o.isExpired())return;er({type:`command`,status:`progress`,message:`Waiting for ${e.session.device.name}: held by session "${e.address}" (${Math.round(o.elapsedMs())}ms of the ${Math.round(a)}ms wait budget used)`}),await Ut(Math.min(250,o.remainingMs())),Jn(t.meta?.requestId)}};return{waitForDeviceOutsideLocks:c,runWhenDeviceIsUnheld:async e=>{let{acquireLocks:n,task:r}=e;for(;;){let e=await n(async()=>{if(s()){if(!o.isExpired())return{ran:!1};P_(t,o.elapsedMs())}return{ran:!0,outcome:await r()}});if(e.ran)return e.outcome;await c()}}}}function P_(e,t){if(t<=0)return;let n=e.internal??={};n.openDeviceWait={waitedMs:t}}function F_(e){let{locks:t,initialKeys:n}=e,r=new Set(n),i=new Map,a=!1,o=async()=>{let e=[...i.values()];for(let t of e)t.release();await Promise.all(e.map(async e=>await e.completion)),i.clear()};return{run:async e=>{if(a)throw Error(`Request execution locks cannot run the same scope concurrently.`);a=!0;try{return await I_(t,n,e)}finally{try{await o()}finally{a=!1}}},retainDevice:async e=>{if(!a)throw Error(`A device execution lock can only be retained by a running request.`);let n=`device:${e}`;if(r.has(n))return;let o=i.get(n);o||(o=L_(t,n),i.set(n,o)),await o.acquired}}}async function I_(e,t,n){let[r,...i]=t;return r?await Tn(e,r,async()=>await I_(e,i,n)):await n()}function L_(e,t){let n=()=>{},r=()=>{},i=new Promise(e=>{n=e}),a=new Promise(e=>{r=e});return{acquired:i,completion:Tn(e,t,async()=>{n(),await a}),release:r}}function R_(e,t,n){let r=A();if(!t.ok){j({level:`error`,phase:`request_failed`,data:{code:t.error.code,message:t.error.message}});let e=He({force:!0});return{ok:!1,error:s(new a(p(t.error.code),t.error.message,{...t.error.details??{},hint:t.error.hint??(typeof t.error.details?.hint==`string`?t.error.details.hint:void 0),diagnosticId:t.error.diagnosticId,logPath:t.error.logPath,diagnosticsRecord:t.error.diagnosticsRecord,retriable:t.error.retriable??(typeof t.error.details?.retriable==`boolean`?t.error.details.retriable:void 0),supportedOn:t.error.supportedOn??(typeof t.error.details?.supportedOn==`string`?t.error.details.supportedOn:void 0)}),{diagnosticId:r.diagnosticId,logPath:e?.path,diagnosticsRecord:e?.ref})}}return j({level:`info`,phase:`request_success`}),He(),{ok:!0,data:z_(e,t.data,n)}}function z_(e,t,n){if(!t)return t;let r=B_(e,t);return r.length===0?t:{...t,artifacts:r.map(t=>{let r=t.path;return{field:t.field,...t.artifactType===void 0?{}:{artifactType:t.artifactType},artifactId:n({artifactPath:r,tenantId:e.meta?.tenantId,artifactType:t.artifactType,fileName:t.fileName,...E(t.displayRotation)?{displayRotation:t.displayRotation}:{}}),fileName:t.fileName,localPath:t.localPath}})}}function B_(e,t){let n=Array.isArray(t.artifacts)?[...t.artifacts]:[];return e.command===`screenshot`&&!(e=>n.some(t=>t?.field===e))(`path`)&&typeof t.path==`string`&&n.push({field:`path`,artifactType:`screenshot`,path:t.path,localPath:e.meta?.clientArtifactPaths?.path,fileName:I.basename(e.meta?.clientArtifactPaths?.path??t.path),...E(t.displayRotation)?{displayRotation:t.displayRotation}:{}}),n.filter(e=>!!(e&&typeof e.field==`string`&&typeof e.path==`string`&&(typeof e.localPath==`string`&&e.localPath.length>0||e.field===`fallbackScreenshotPath`&&e.artifactType===`screenshot`)))}async function V_(e,t,n){let r=e.requireCurrent(t);if(!H_(r))return;let i=r.screenRecording,a=i.handle,o=await n.appleSessionObservation.observeRunnerSession(r.device.id);if(e.resolveCurrent(t)?.screenRecording!==i)return;let s=a.inspect();if(!s.runnerSessionId){o?.alive&&a.setRunnerSessionId(o.sessionId);return}if(!o?.alive){a.invalidate(`iOS runner session exited during recording`);return}o.sessionId!==s.runnerSessionId&&a.invalidate(`iOS runner session restarted during recording`)}function H_(e){let t=e.screenRecording?.handle.inspect();return!t||!tt(e.device)?!1:t.backend===`runner AVAssetWriter`&&t.showTouches!==!1}async function U_(e){let{leaseRegistry:t,req:n,task:r}=e,i=n.internal?.admittedLease;if(!i)return await r();let a=n.meta?.requestId,o=t.retainLeaseWork(i,()=>!Yn(a));try{return await(uu(n)?t.runDeviceMutation(i,r):r())}finally{o.release()}}const W_={label:`Materialized paths`,plural:!0,expiredHint:`Materialized paths are released automatically when their TTL expires; re-run the command that materialized them if the paths are still needed.`},G_=new Map;async function K_(e){let t=await L.mkdtemp(I.join(qr.tmpdir(),`agent-device-materialized-`));try{let n=await Z_(e.installablePath,I.join(t,`installable`)),r=e.archivePath?await Z_(e.archivePath,I.join(t,`archive`)):void 0,i=P.randomUUID(),a=e.ttlMs??9e5,o=Date.now()+a,s=setTimeout(()=>{Y_(i)},a);return G_.set(i,{rootPath:t,installablePath:n,archivePath:r,tenantId:e.tenantId,sessionName:e.sessionName,expiresAt:o,timer:s}),{materializationId:i,installablePath:n,...r?{archivePath:r}:{},expiresAt:new Date(o).toISOString()}}catch(e){throw await L.rm(t,{recursive:!0,force:!0}),e}}async function q_(e,t){await X_(e,_s(G_,e,t,W_))}async function J_(e){let t=Array.from(G_.entries()).filter(([,t])=>t.sessionName===e);await Promise.all(t.map(async([e,t])=>{await X_(e,t)}))}async function Y_(e){let t=G_.get(e);if(t)try{await X_(e,t)}catch{}}async function X_(e,t){clearTimeout(t.timer),G_.delete(e),await L.rm(t.rootPath,{recursive:!0,force:!0})}async function Z_(e,t){let n=await L.stat(e);await L.mkdir(t,{recursive:!0});let r=I.join(t,I.basename(e));return n.isDirectory()?(await L.cp(e,r,{recursive:!0}),r):(await L.copyFile(e,r),r)}function Q_(e){return e.device.platform===`web`}function $_(e){return e.toArray().filter(e=>e.device.platform===`web`).map(e=>e.name)}async function ev(e){let t=e.sessionStore.refresh(e.ref);if(!t.session.appLog)return;let{forceCleanupSessionAppLog:n}=await import(`../platform-request-scope.js`).then(e=>e.u);await n({...e,ref:t})}async function tv(e){let t=Pr(e.sessionStore,e.ref);t.read()&&await fr({binding:t,intent:`disposal`})}async function nv(e,t){await t.stopSnapshotHelper(e.device)}async function rv(e){let{ref:t,sessionStore:n,platformCleanup:r}=e,i=n.resolveCurrent(t)??t.session,a=t.address;await r.closeManagedBrowser({device:i.device,sessionName:a,stateDir:n.resolveDaemonStateDir(),openSessionNames:()=>$_(n)})}async function iv(e){let t=[];for(let{step:n,run:r}of e)try{await r()}catch(e){t.push({step:n,error:e})}return t}function av(e){if(e.failures.length===0)return;let t=e.failures.map(({step:e})=>e),n=e.failures.map(({step:e,error:t})=>`${e}: ${t instanceof Error?t.message:String(t)}`);return j({level:`error`,phase:e.phase,data:{session:e.sessionName,failedSteps:t,errors:n}}),new a(`COMMAND_FAILED`,`Session cleanup left ${e.failures.length} resource(s) unreleased: ${n.join(`; `)}`,{reason:`session_cleanup_incomplete`,session:e.sessionName,failedSteps:t,hint:`Some session resources failed to release; inspect the session log for per-resource diagnostics. The session was still deleted, so retrying is safe.`})}async function ov(e){let{ref:t,sessionStore:n}=e,r=n.resolveCurrent(t)??t.session,i=t.address;if(!e.platformCleanup)throw new a(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`);let o=e.platformCleanup,s=[{step:`recording`,run:()=>sv({ref:t,sessionStore:n})},...e.appLog===`run`?[{step:`app_log`,run:()=>ev({ref:t,sessionStore:n})}]:[],{step:`audio_probe`,run:()=>cv({ref:t,sessionStore:n})},{step:`perf_capture`,run:()=>tv({ref:t,sessionStore:n})},{step:`platform_snapshot_helper`,run:()=>nv(r,o)},{step:`web_browser`,run:()=>rv({ref:t,sessionStore:n,platformCleanup:o})}];s.push({step:`materialized_paths`,run:()=>J_(i)});let c=av({sessionName:i,phase:`session_teardown_cleanup_failed`,failures:await iv(s)});if(c)throw c}async function sv(e){let t=Fr(e.sessionStore,e.ref);t.read()&&await vr({binding:t,intent:`disposal`})}async function cv(e){let t=Nr(e.sessionStore,e.ref);t.read()&&await pr({binding:t,intent:`disposal`})}async function lv(e){let{inspectFacts:t,bind:n,session:r,stateDir:i,runtimeHints:a}=e,o={...pv(r,i),...e.daemonShutdown?{daemonShutdown:!0}:{}};if(!mv(r,a)){let e=ut;fv(await t(r.device),e.required,r),await(await n(r.device,e)).operations.finalizeApplicationClose(o);return}let s=_t;fv(await t(r.device),s.required,r);let c=await n(r.device,s);await c.operations.finalizeApplicationClose(o),await c.operations.clearRuntimeHints({appId:r.appBundleId,values:a})}async function uv(e){await lv({...e,bind:e.bindDevice})}async function dv(e){let{gateway:t,scope:n,session:r,stateDir:i,runtimeHints:a}=e,s;try{await lv({inspectFacts:async e=>await t.inspectFacts(e),bind:async(e,r)=>(s??=await t.bind({device:e,intent:{kind:`ordinary`},scope:n}),vt(s,r)),session:r,stateDir:i,runtimeHints:a,...e.daemonLeaving===!1?{}:{daemonShutdown:!0}})}catch(e){try{await s?.[Symbol.asyncDispose]()}catch(t){n.diagnostics.emit({level:`error`,phase:`daemon_lifecycle_binding_cleanup_failed`,data:{session:r.name,error:o(t),operationError:o(e)}})}throw e}await s?.[Symbol.asyncDispose]()}function fv(e,t,n){for(let r of t){let t=e.operations[r];if(!t?.available)throw new a(`UNSUPPORTED_OPERATION`,`Session lifecycle ${r} is not supported on this device.`,{reason:t?.reason,...t?.hint===void 0?{}:{hint:t.hint},deviceId:n.device.id})}}function pv(e,t){return{appBundleId:e.appBundleId,surface:e.surface??`app`,retainRunner:!1,stateDir:t}}function mv(e,t){return e.appBundleId!==void 0&&Ir(t)}function hv(e){return tt(e)&&e.kind===`simulator`}function gv(e){return e.platform===`android`&&e.kind===`emulator`}const _v=[`platform`,`metroHost`,`metroPort`,`bundleUrl`,`launchUrl`];function vv(e){return e?[e.metroHost,e.metroPort,e.bundleUrl,e.launchUrl].filter(e=>e!==void 0&&e!==``).length:0}function yv(e){if(!e)return{};let t={};return e.metroHost!==void 0&&(t.metroHost=e.metroHost),e.metroPort!==void 0&&(t.metroPort=String(e.metroPort)),e.bundleUrl!==void 0&&(t.bundleUrl=e.bundleUrl),e.launchUrl!==void 0&&(t.launchUrl=e.launchUrl),t}function bv(e){return Ir(yv(e))}function xv(e,t){if(e!==void 0){if(typeof e!=`string`)throw new a(`INVALID_ARGS`,`Invalid open runtime ${t}: expected string.`);return bn(e)}}function Sv(e){if(e!==void 0){if(!Number.isInteger(e)||e<1||e>65535)throw new a(`INVALID_ARGS`,`Invalid runtime metroPort: ${String(e)}. Use an integer between 1 and 65535.`);return e}}function Cv(e){if(e!==void 0){if(typeof e!=`number`)throw new a(`INVALID_ARGS`,`Invalid open runtime metroPort: expected integer.`);return Sv(e)}}function wv(e,t,n){if(e===void 0)return n;if(!h(e))throw new a(`INVALID_ARGS`,`Invalid open runtime platform: ${String(e)}. Use "ios", "android", or "harmonyos".`);if(n&&e!==n)throw new a(`INVALID_ARGS`,`open runtime targets ${e}, but session "${t}" is bound to ${n}.`);return e}function Tv(e){if(h(e))return e}function Ev(e,t){return{platform:t,metroHost:bn(e?.metroHost),metroPort:Sv(e?.metroPort),bundleUrl:bn(e?.bundleUrl),launchUrl:bn(e?.launchUrl)}}function Dv(e,t){return{platform:t.platform??e?.platform,metroHost:t.metroHost??e?.metroHost,metroPort:t.metroPort??e?.metroPort,bundleUrl:t.bundleUrl??e?.bundleUrl,launchUrl:t.launchUrl??e?.launchUrl}}function Ov(e){if(gv(e))return`10.0.2.2`;if(hv(e))return`127.0.0.1`}function kv(e,t){if(!e||bn(e.metroHost)||bn(e.bundleUrl)||e.metroPort===void 0)return e;let n=Ov(t);return n?{...e,metroHost:n}:e}function Av(e){let{runtime:t,sessionName:n,platform:r}=e;if(t===void 0)return;if(!t||typeof t!=`object`||Array.isArray(t))throw new a(`INVALID_ARGS`,`open runtime must be an object.`);let i=t,o=Object.keys(i).find(e=>!_v.includes(e));if(o)throw new a(`INVALID_ARGS`,`Invalid open runtime field: ${o}. Supported fields are ${_v.join(`, `)}.`);return{platform:wv(i.platform,n,r),metroHost:xv(i.metroHost,`metroHost`),metroPort:Cv(i.metroPort),bundleUrl:xv(i.bundleUrl,`bundleUrl`),launchUrl:xv(i.launchUrl,`launchUrl`)}}function jv(e,t,n){if(n){if(vv(n)===0){e.setRuntimeHints(t,void 0);return}return e.setRuntimeHints(t,n),n}}function Mv(e,t,n,r){let i=e.getRuntimeHints(t);if(!i)return;let o=n?M(n):void 0,s=Tv(o)??r;if(i.platform&&n&&!s)throw new a(`INVALID_ARGS`,`Session runtime hints are only supported on iOS, Android, and HarmonyOS sessions, but session "${t}" is bound to ${o}.`);if(i.platform&&s&&i.platform!==s)throw new a(`INVALID_ARGS`,`Session runtime hints target ${i.platform}, but session "${t}" is bound to ${o}. Clear the runtime hints or use a different session.`);return s&&i.platform!==s?{...i,platform:s}:i}function Nv(e){let{req:t,sessionStore:n,sessionName:r,device:i}=e,a=i?Tv(M(i)):e.platform,o=n.getRuntimeHints(r),s=Av({runtime:t.runtime,sessionName:r,platform:a});if(t.runtime===void 0){let e=Mv(n,r,i,a);return{runtime:i?kv(e,i):e,previousRuntime:o,replacedStoredRuntime:!1}}let c=s&&vv(s)>0?s:void 0;return{runtime:i?kv(c,i):c,previousRuntime:o,replacedStoredRuntime:!0}}function Pv(e){return Nv(e).runtime}function Fv(e){try{return{ok:!0,data:Nv(e)}}catch(e){let t=r(e);return g(t.code,t.message,t.details)}}async function Iv(e){let{previousRuntime:t,clearRuntimeHints:n}=e;if(!Lv(e))return;let r=e.session;r?.appBundleId&&await n({appId:r.appBundleId,values:yv(t)})}function Lv(e){return e.replacedStoredRuntime&&!!e.session?.appBundleId&&bv(e.previousRuntime)&&!bv(e.runtime)}function Rv(e,t,n=`status`){let r=t.claim,i=M(r?{platform:r.device.family,appleOs:r.device.appleOs}:e),a=$e(e.platform)?`--udid`:`--serial`;return[`agent-device device ${n}`,`--platform ${wn(i)}`,`${a} ${wn(e.id)}`,...n===`release`||or(t.classification)?[`--stale`]:[]].join(` `)}function zv(e,t){let n=t.claim,r=Rv(e,t,sr(t.classification)?`release`:`status`),i=M(n?{platform:n.device.family,appleOs:n.device.appleOs}:e);return new a(`DEVICE_IN_USE`,n?`${i} device ${e.id} is owned by session "${n.session}" in workspace "${n.workspace}".`:`${e.name} has an ownership claim that could not be verified.`,{reason:Hv(t.classification),classification:t.classification,deviceKey:t.deviceKey,...n?{owner:{session:n.session,workspace:n.workspace,stateDir:n.stateDir}}:{},recovery:{command:r},hint:sr(t.classification)?`The recorded owner can no longer release this device; settle its resources and release the claim with: ${r}`:`Inspect the owner with: ${r}`,retriable:!1})}function Bv(e,t){return Vv(zv(e,t))}function Vv(e){let{hint:t,retriable:n,...r}=e.details??{};return g(e.code,e.message,r,{hint:t,retriable:n})}function Hv(e){switch(e){case`live`:return`DEVICE_CLAIM_LIVE_OWNER`;case`owner-process-dead`:case`owner-daemon-superseded`:return`DEVICE_CLAIM_RECOVERY_PENDING`;case`owner-process-reused`:case`owner-state-dir-gone`:case`unknown`:case`inconsistent`:return`DEVICE_CLAIM_OWNER_UNCERTAIN`}}function Uv(e,t){if(t?.backend===`macos-app`)return`none`;switch(e.kind){case`local-family`:return`ordinary`;case`provider-runtime`:return`none`}}function Wv(e){let t=[];async function n(n){if(e.policy!==`transient-exclusive`)return;let r=await ur({device:n,command:e.command,workspace:e.workspace,stateDir:e.stateDir,reconcileOrphanedDeviceClaim:e.reconcileOrphanedDeviceClaim});if(r.status===`conflict`)throw zv(n,r.conflict);r.status===`acquired`&&t.push(r.ownership)}return{admit:async(e,t)=>{switch(Uv(t)){case`none`:return;case`ordinary`:return await n(e)}},[Symbol.asyncDispose]:async()=>{for(let n of t.splice(0))try{await dr(n)}catch(t){j({level:`error`,phase:`transient_device_claim_release_failed`,data:{command:e.command,deviceKey:n.deviceKey,error:t instanceof Error?t.message:String(t)}})}}}}const Gv=new WeakMap,Kv=new WeakMap,qv=async()=>{throw new a(`COMMAND_FAILED`,`Device runtime gateway is not configured for this request scope`,{reason:`runtime-gateway-missing`})};async function Jv(e){let{sessionStore:t,leaseRegistry:n}=e,r=Qv(Af(e.req)),i=r.command,a=Date.now(),o=ru(i),c=Tg(r,t,{attachesToSession:$l(i)!==`inventory`}),l=A(),u=t.resolveSessionDir(c),d=rn({sessionDir:u,session:c,requestId:r.meta?.requestId??l.requestId}),f=d.path,p=mn(u);Ge({session:c,logPath:d.path,logRecord:d.ref}),j({level:`info`,phase:`request_start`,data:{publicSession:r.session,effectiveSession:c,command:r.command,tenant:r.meta?.tenantId,isolation:r.meta?.sessionIsolation,requestLogPath:f,runnerLogPath:p}});let m=Yo(r);m&&t.recordEvent(c,ts({req:r}));try{e.daemonPolicy&&cf(e.daemonPolicy,r),If(r);let s=r.command===`open`?O_(r):void 0,l=ru(i)?await g_({req:r,sessionName:c,sessionStore:t}):{keys:[],deviceId:void 0},u=j_({req:r,budgetMs:s,sessionName:c,sessionStore:t,deviceId:l.deviceId});await u?.waitForDeviceOutsideLocks();let d=F_({locks:ny(n),initialKeys:l.keys}),h=Lr(r),{claimAdmission:g,runtimeBindings:_}=Yv({command:i,dispatchLedger:h,workspace:r.meta?.cwd??process.cwd(),stateDir:t.resolveDaemonStateDir(),deviceRuntimeGateway:e.deviceRuntimeGateway,platformRequestScope:e.platformRequestScope,daemonPolicy:e.daemonPolicy,claimRecoveryGateway:e.claimRecoveryGateway}),v={req:r,command:i,sessionName:c,requestLogPath:f,runnerLogPath:p,startedAtMs:a,retainDeviceExecutionLock:async e=>await d.retainDevice(e),bindDevice:_?.bindDevice??qv,inspectFacts:_?.inspectFacts??qv,bindExactDevice:_?.bindExactDevice??qv,platformServices:e.platformServices,dispatchLedger:h,throwIfCanceled:()=>Jn(r.meta?.requestId),runAdmitted:async i=>{Jn(r.meta?.requestId);try{await Vf({sessionName:c,sessionStore:t,leaseRegistry:n,teardownSession:async n=>await Xv({ref:n,sessionStore:t,inspectFacts:v.inspectFacts,bindDevice:v.bindDevice,platformCleanup:Zv(e.platformResourceCleanup)})}),r=Hf({req:r,sessionName:c,sessionStore:t,leaseRegistry:n,providerAppCatalog:e.providerAppCatalog,daemonPolicy:e.daemonPolicy}),v.req=r;let a=r.internal?.admittedLease;return a&&await Iu(a),await U_({leaseRegistry:n,req:r,task:i})}finally{o&&!Yn(r.meta?.requestId)&&t.noteSessionActivity(c)}},runLocked:async e=>(Jn(r.meta?.requestId),u?await u.runWhenDeviceIsUnheld({acquireLocks:d.run,task:async()=>await v.runAdmitted(e)}):await d.run(async()=>await v.runAdmitted(e))),[Symbol.asyncDispose]:async()=>{try{await _?.[Symbol.asyncDispose]()}finally{await g?.[Symbol.asyncDispose]()}}};return Kv.set(v,e=>(m&&t.recordEvent(c,ns({req:r,response:e,durationMs:Math.max(0,Date.now()-a)})),e)),v}catch(e){throw m&&t.recordEvent(c,ns({req:r,response:{ok:!1,error:s(e,{diagnosticId:A().diagnosticId,logPath:f})},durationMs:Math.max(0,Date.now()-a)})),e}}function Yv(e){let{deviceRuntimeGateway:t,platformRequestScope:n,daemonPolicy:r}=e;if(!t||!n)return{claimAdmission:void 0,runtimeBindings:void 0};let i=Wv({policy:yt(e.command),command:e.command,workspace:e.workspace,stateDir:e.stateDir,reconcileOrphanedDeviceClaim:hr({scope:n,composeGateway:e.claimRecoveryGateway})});return{claimAdmission:i,runtimeBindings:Br({gateway:t,scope:n,dispatchLedger:e.dispatchLedger,admitDeviceClaim:i.admit,admitDevice:r?e=>df(r,e):void 0})}}async function Xv(e){let{ref:t,sessionStore:n,inspectFacts:r,bindDevice:i,platformCleanup:a}=e,o=n.resolveCurrent(t)??t.session,s=t.address,c=yv(n.getRuntimeHints(t.address)),l;try{await ov({appLog:`run`,ref:t,sessionStore:n,platformCleanup:a})}catch(e){l=e}try{await uv({inspectFacts:r,bindDevice:i,session:o,stateDir:n.resolveDaemonStateDir(),runtimeHints:c})}catch(e){if(l!==void 0)j({level:`error`,phase:`expired_session_lifecycle_cleanup_failed`,data:{session:s,error:e instanceof Error?e.message:String(e),primaryError:l instanceof Error?l.message:String(l)}});else throw e}if(l!==void 0)throw l}function Zv(e){if(!e)throw new a(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`);return e}function Qv(e){let t={...e.flags??{}};return At(e.command,t)?{...e,flags:t}:e}async function $v(e){let{scope:t,sessionStore:n,trackDownloadableArtifact:r}=e,i=t.runnerLogPath;t.throwIfCanceled();let a=n.lookup(t.sessionName);a&&(await V_(n,a,t.platformServices),t.throwIfCanceled(),n.requireCurrent(a));let o=__({req:t.req,existingRef:a?n.refresh(a):void 0}),s=o.req,c=o.existingRef,l=c?.session;Ge({traceLogPath:l?.trace?.outPath}),Kv.set(t,e=>{let i=R_(s,e,r);return Yo(s)&&n.recordEvent(t.sessionName,ns({req:s,response:i,durationMs:Math.max(0,Date.now()-t.startedAtMs)})),i});let u=l?.screenRecording?.handle.inspect().invalidatedReason;if(u&&au(t.command))return{type:`response`,response:{ok:!1,error:{code:`COMMAND_FAILED`,message:u}}};c&&!s.meta?.lockPolicy&&nu(t.command)&&yg(c,s.flags);let d=(e,t,n)=>ty(i,e,t,n,s.meta);return{type:`scope`,scope:{req:s,sessionName:t.sessionName,logPath:i,existingSession:l,retainDeviceExecutionLock:t.retainDeviceExecutionLock,bindDevice:t.bindDevice,platformServices:t.platformServices,inspectFacts:t.inspectFacts,bindExactDevice:t.bindExactDevice,dispatchLedger:t.dispatchLedger,throwIfCanceled:t.throwIfCanceled,contextFromFlags:d,handlerContextFromFlags:(e,r,i)=>({...d(e,r,i),surface:(a?n.resolveCurrent(a):n.get(t.sessionName))?.surface})}}}function ey(e,t){let n=Kv.get(e);return Kv.delete(e),n?n(t):t}function ty(e,t,n,r,i){let a=A().requestId;return{...cg(e,t,n,r,a,i),requestId:a}}function ny(e){let t=Gv.get(e);return t||(t=new Map,Gv.set(e,t)),t}const ry=`--save-script is supported only by ${su().join(`, `)}.`;function iy(e){if(e.flags?.saveScript===void 0||ou(e.command))return;j({level:`warn`,phase:`save_script_flag_rejected`,data:{command:e.command}});let t=A(),n=He({force:!0});return{ok:!1,error:s(new a(`INVALID_ARGS`,ry,{hint:`Arm publication on the session instead: open/close --save-script, replay --save-script, or session save-script to publish an armed recording without closing its session.`}),{diagnosticId:t.diagnosticId,logPath:n?.path,diagnosticsRecord:n?.ref})}}const ay=`AGENT_DEVICE_SESSION_IDLE_TIMEOUT_MS`;function oy(e=process.env){let t=e[ay]?.trim();if(!t)return 0;let n=Number(t);return!Number.isFinite(n)||n<=0?0:Math.max(1,Math.floor(n))}function sy(e){return e.lastActivityAtMs??e.createdAt}function cy(e){return e.deviceClaim!==void 0&&e.lease===void 0&&e.screenRecording===void 0&&e.appLog===void 0&&e.audioProbe===void 0&&e.perfCapture===void 0&&e.trace===void 0}function ly(e,t,n=Date.now()){return t<=0?!1:n-sy(e)>=t}function uy(e,t,n=Date.now()){return cy(e)&&ly(e,t,n)}function dy(e,t){if(!(!cy(e)||t<=0))return sy(e)+t}function fy(e,t){return{owner:e,expiredAtMs:t.expiredAtMs,expiresAt:t.expiredAtMs+36e5,idleExpiryMs:t.idleExpiryMs,...t.deviceKey?{deviceKey:t.deviceKey}:{}}}function py(e,t,n=Date.now()){let r=Math.max(0,n-t.expiredAtMs);return new a(`SESSION_NOT_FOUND`,`Session "${t.owner}" expired ${my(r)} ago for idleness (window ${my(t.idleExpiryMs)}). Run open again to start a new session.`,{reason:`SESSION_IDLE_EXPIRED`,session:e,idleExpiryMs:t.idleExpiryMs,...t.deviceKey?{deviceKey:t.deviceKey}:{},hint:t.deviceKey?`Run open again to claim ${t.deviceKey} and start a new session. Set ${ay}=0 to keep sessions open indefinitely.`:`Run open again to start a new session. Set ${ay}=0 to keep sessions open indefinitely.`})}function my(e){let t=e/1e3;if(t<90)return`${Math.round(t)}s`;let n=t/60;return n<90?`${Math.round(n)}m`:`${Math.round(n/60)}h`}function hy(e,t,n){let r;for(let[i,a]of e)if(!(!a.device||Je(a.device)!==t)){if(!n(i)){e.delete(i);continue}r??=a}return r}function gy(e={}){let t=e.markerExists??F.existsSync,n=Wh({displayName:`app-log`,now:e.now,undurableCleanupTtlMs:e.undurableCleanupTtlMs,onUndurableCleanupExpired:e.onUndurableCleanupExpired}),r=new Map;return Object.freeze({...n,retainLegacyMarkers(e){for(let t of e)t.device&&r.set(t.markerPath,t)},assertStartAllowed(e){let i=Je(qe(e));if(hy(r,i,t))throw new a(`COMMAND_FAILED`,`A retained legacy app-log marker prevents replacement capture`,{reason:`cleanup-unconfirmed`,hint:`Inspect and remove the retained app-log.pid only after manually confirming its process is gone.`});n.assertStartAllowed(e)}})}function _y(e,t){return g(`UNSUPPORTED_OPERATION`,`${e} is not supported on this device`,{reason:t.reason},t.hint?{hint:t.hint}:void 0)}async function vy(e){let t=await by(e.inspectFacts)(e.device);for(let n of e.required){let r=t.operations[n];if(!r.available)return{type:`response`,response:e.unavailableResponse?e.unavailableResponse(r):_y(e.command,r)}}return{type:`admitted`,bind:xy(e.bindDevice)}}async function yy(e){let t=await vy({...e,required:e.use.required});if(t.type===`response`)return t;let n=await t.bind(e.device,e.use);return e.readiness&&await Rr(n,e.platformServices),{type:`runtime`,runtime:n}}async function Q(e,t){let n=await yy(e);if(n.type===`response`)return{ok:!1,response:n.response};let r=n.runtime;return{ok:!0,execute:async({dispatchContext:e})=>await t(r,e)}}function by(e){if(e)return e;throw new a(`COMMAND_FAILED`,`Device runtime facts inspection is unavailable.`,{reason:`runtime-gateway-missing`})}function xy(e){if(e)return e;throw new a(`COMMAND_FAILED`,`Device runtime binding is unavailable.`,{reason:`runtime-gateway-missing`})}function Sy(e){let{flags:t,logPath:n,meta:r,session:i,snapshotScope:a}=e,{appBundleId:o,trace:s,surface:c}=i??{},l=e.context??cg(n??``,t,o,s?.outPath,r?.requestId,r);return{options:{appBundleId:o,...m(t,f),scope:a,includeRects:e.includeRects,surface:c},execution:$(l),...e.signal===void 0?{}:{signal:e.signal}}}function $(e){return{requestId:e.requestId,verbose:e.verbose,logPath:e.logPath,traceLogPath:e.traceLogPath,iosXctestrunFile:e.iosXctestrunFile,iosXctestDerivedDataPath:e.iosXctestDerivedDataPath,iosXctestEnvDir:e.iosXctestEnvDir,runnerLeaseContext:e.runnerLeaseContext}}function Cy(e){return Er(e,`focus requires x y`)}function wy(e,t){return{point:e,...t.appBundleId===void 0?{}:{options:{appBundleId:t.appBundleId}},execution:$(t)}}async function Ty(e){let t=Cy(e.positionals);return await Q({command:`focus`,device:e.device,use:jt,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice},(e,n)=>Ey(e,t,n))}async function Ey(e,t,n){return await e.operations.focusPoint(wy(t,n)),{x:t.x,y:t.y,...y(`Focused (${t.x}, ${t.y})`)}}function Dy(e){if(e===`down`)return`bottom`;if(e===`up`)return`top`}async function Oy(e){let{edge:t,target:n={},scope:r,captureNodes:i}=e;try{let e=await i(r),{analyzeScrollEdgeState:a}=await import(`../selection.js`),o=a(e,t,n);return r&&o.emptySnapshot?await Oy({edge:t,target:n,captureNodes:i}):o}catch(e){throw Ry(t,r,e)}}async function ky(e,t,n={}){let{analyzeScrollEdgeState:r}=await import(`../selection.js`);return r(e,t,n)}async function Ay(e,t){return(await ky(e,t)).canScroll}async function jy(e,t){let{analyzeScrollEdgeState:n}=await import(`../selection.js`);return n(e,t).fingerprint??``}function My(e){if(e.length<4)return!1;let t=e.slice(-6);if(new Set(t).size>2)return!1;let n=t.at(-1);return n!==void 0&&t.slice(0,-1).includes(n)}function Ny(e,t,n){t&&(e.push(t),e.length>n&&e.shift())}async function Py(e){let{edge:t,captureState:n,scroll:r,settleAfterPass:i=async()=>{}}=e,o=await n();o.scope&&(o=await n(o.scope));let s=0,c,l=[];for(Ny(l,o.fingerprint,6);o.canScroll;){if(s>=40)throw new a(`COMMAND_FAILED`,`scroll ${t} reached the safety limit before the snapshot showed the edge`,{reason:`scroll_edge_pass_limit`,edge:t,passes:s,hint:`The scoped scroll container still reports hidden content. Run scroll <dir> --until <selector> to stop on the element you are after, or snapshot -i to inspect the current state.`});if(c=await r(),s+=1,await i(),o=await n(o.scope),Ny(l,o.fingerprint,6),o.canScroll&&My(l))throw Iy(t,s)}return{passes:s,result:c}}function Fy(e){let{direction:t,edge:n,passes:r,amount:i,pixels:a,honoredPixels:o,movement:s}=e;if(n&&r===0)return`Already at ${n}; no hidden content ${n===`bottom`?`below`:`above`} detected`;if(n)return`Scrolled to ${n} with ${r} ${t} passes`;let c=Dy(t);return s===`at-edge`&&c?`Scrolled ${t} and no hidden content ${c===`bottom`?`below`:`above`} was detected`:s===`unchanged`?`Scrolled ${t} and the visible content did not change`:a===void 0?i===void 0?`Scrolled ${t}`:o===void 0?`Scrolled ${t} by ${i}`:`Scrolled ${t} by ${i} of the viewport (${o}px)`:`Scrolled ${t} by ${o??a}px`}function Iy(e,t){let n=`${t} ${t===1?`pass`:`passes`}`;return new a(`COMMAND_FAILED`,`scroll ${e} moved nothing across ${n}: the container still reports hidden content but its contents never shifted`,{reason:`scroll_edge_no_progress`,edge:e,passes:t,hint:Ly({targetDirectly:`with scroll <dir> --until <selector>`})})}function Ly(e={}){let t=`The scroll is not reaching this container. If a field is focused, dismiss the keyboard first; if it is nested inside another scroller, ${e.targetDirectly===void 0?`target it directly`:`target it directly ${e.targetDirectly}`}.`;return e.rawDrag===!1?t:t+` Some lists ignore synthesized scrolls — a raw drag moves them: swipe x1 y1 x2 y2 started inside the list.`}function Ry(e,t,n){return t?new a(`COMMAND_FAILED`,`Failed to verify scroll ${e} state for scoped container`,{scope:t,hint:`scroll ${e} could not verify the scoped scroll container. Run snapshot -i for the current screen and retry with a visible scroll target.`},n):new a(`COMMAND_FAILED`,`Failed to verify scroll ${e} state`,{hint:`scroll ${e} needs a snapshot showing hidden content ${e===`bottom`?`below`:`above`} before it will move.`},n)}async function zy(e){let{selector:t,direction:r,platform:i,capture:o,scroll:s}=e,c=e.passLimit??12,l=Dy(r),u=0,d,f=[],p=!1;try{for(;;){if((await By({captured:await o(),selector:t,direction:r,platform:i,edge:l,passes:u,passLimit:c,recentSignatures:f})).visible)return{passes:u,...d===void 0?{}:{result:d}};p=!0,d=await s(),p=!1,u+=1}}catch(e){throw u===0&&!p&&e instanceof a?n(e,`no`):e}}async function By(e){let{captured:t,selector:n,direction:r,platform:i,edge:a,passes:o,passLimit:s,recentSignatures:c}=e,l=Uy(t);if(l)throw Ky(r,n,l);let u=t.nodes??[];if(await Hy(u,n,i))return{visible:!0};if(a&&!await Ay(u,a))throw Wy(r,n,`edge-reached`,o);if(o>=s)throw Wy(r,n,`pass-limit`,o);if(a&&(Ny(c,await jy(u,a),6),My(c)))throw Gy(r,n,o);return{visible:!1}}function Vy(e,t,n){return n===0?`${t} was already visible; no ${e} scroll needed`:`Scrolled ${e} ${n} ${n===1?`pass`:`passes`} until ${t} was visible`}async function Hy(e,t,n){let r=await wr(Or.wait,e,t,{platform:n}),i=r.kind===`target`||r.kind===`ambiguous`?r.matchedNodes:r.kind===`occluded`?[r.node]:[],a=lt(e);return i.some(e=>Ct({predicate:`visible`,node:e,visibility:a,platform:n}).pass)}function Uy(e){let t=e.nodes;if(t===void 0)return{reason:`no-capture`,detail:`the capture returned no accessibility tree`};if(t.length===0)return{reason:`no-capture`,detail:`the capture returned an empty accessibility tree`};let n=Pe({backend:e.backend,nodes:t,...e.quality?{snapshotQuality:e.quality}:{}});if(n)return{reason:`sparse-tree`,detail:n.reason??`the capture backend reported a sparse tree`}}function Wy(e,t,n,r){let i=`${r} ${r===1?`pass`:`passes`}`;return n===`edge-reached`?new a(`COMMAND_FAILED`,`scroll ${e} reached the end of the scrollable content after ${i} without ${t} becoming visible`,{reason:`scroll_until_edge_reached`,selector:t,direction:e,passes:r,hint:`The content ends here, so no further ${e} scroll can reveal it. Run snapshot -i to see what is on screen, scroll the opposite direction, or check the selector — the element may be on another screen.`}):new a(`COMMAND_FAILED`,`scroll ${e} spent its ${r}-pass budget without ${t} becoming visible`,{reason:`scroll_until_pass_limit`,selector:t,direction:e,passes:r,hint:`Raise the step with an amount (scroll ${e} 0.8 --until <selector>), or run snapshot -i to confirm the selector matches something on this screen.`})}function Gy(e,t,n){let r=`${n} ${n===1?`pass`:`passes`}`;return new a(`COMMAND_FAILED`,`scroll ${e} --until ${t} moved nothing across ${r}: the on-screen content never shifted`,{reason:`scroll_until_no_progress`,selector:t,direction:e,passes:n,hint:Ly()})}function Ky(e,t,n){return new a(`COMMAND_FAILED`,`scroll ${e} --until ${t} could not read the screen: ${n.detail}`,{reason:`scroll_until_capture_unreadable`,selector:t,direction:e,captureRefusal:n.reason,hint:n.reason===`no-capture`?`Run snapshot -i to see whether the app is producing an accessibility tree at all, and retry once it does.`:`The accessibility tree came back sparse, so its refs and selectors are not trustworthy. Run screenshot, inspect the image, and navigate by coordinates until snapshot -i reports a full tree.`})}const qy={intervalMs:200,budgetMs:1500};function Jy(e){return Ze(e.device)?e.flags?.postGestureStabilization===!1?{kind:`declined`,reason:`caller-declined-observation`}:e.flags?.settle===!0?{kind:`declined`,reason:`settle-observer-owns-outcome`}:Xy(e.session):{kind:`declined`,reason:`non-swipe-platform`}}function Yy(e){if(!e||e.nodes.length===0)return;let t=Om(e.nodes);if(t.length!==0)return{signature:t,presentationKey:e.presentationKey,comparisonKey:km(e),nodes:e.nodes}}function Xy(e){let t=Yy(e.snapshot);return t?Yp(e)===`active`?Xm(e)?{kind:`unobservable`,reason:`prior-gesture-unsettled`}:{kind:`observe`,baseline:t}:{kind:`unobservable`,reason:`stored-surface-not-current`}:{kind:`unobservable`,reason:`stored-surface-unusable`}}async function Zy(e){let{direction:t,baseline:n,swipe:r}=e,i=await $y(n,e);switch(i.kind){case`moved`:return await ob({...i,direction:t,baseline:n,swipe:r});case`blind`:return pb(t,i.reason,{swipe:r});case`settled`:return await sb({...i,direction:t,baseline:n,swipe:r})}}function Qy(e,t){if(e.presentationKey!==t.presentationKey)return`baseline-presentation-drift`;if(e.comparisonKey!==t.comparisonKey)return`capture-lineage-drift`}async function $y(e,t){let n,r,i=await Mr({capture:async()=>{let n=await nb(e,t.capture);return n.kind===`changed`&&(r??=await tb(e,t.direction,t.swipe)),n},schedule:{intervalMs:t.pollMs??qy.intervalMs,budgetMs:t.budgetMs??qy.budgetMs},verdict:e=>{if(e.kind===`blind`)return{kind:`done`,result:{kind:`blind`,reason:e.reason}};let t=eb(e,{previous:n,changeNeedsRest:r===!0});return n=e.observed.signature,t?{kind:`done`,result:t}:{kind:`continue`}},...t.clock?{clock:t.clock}:{}}),a=i.polls.length;if(i.kind===`failed`)throw i.error;if(i.kind!==`done`)return rb(t,a,i.waitedMs);let o=Date.now()-i.waitedMs;return i.result.kind===`blind`?i.result:{...i.result,attempts:a,startedAt:o}}function eb(e,t){let n=ib(t.previous,e.observed.signature);if(e.kind===`changed`)return!t.changeNeedsRest||n?{kind:`moved`,observed:e.observed}:void 0;if(n)return{kind:`settled`,observed:e.observed,evidence:e.evidence}}async function tb(e,t,n){let r=Dy(t);if(!r)return!1;let i=await ky(e.nodes,r,{point:n.midpoint}),a=i.containerRect!==void 0&&!i.canScroll;return a&&j({level:`debug`,phase:`scroll_movement_edge_rest_required`,data:{direction:t,containerRect:i.containerRect}}),a}async function nb(e,t){let n=await ab(t);if(!n)return{kind:`blind`,reason:`capture-unreadable`};let r=Qy(e,n);if(r)return{kind:`blind`,reason:r};let i=Mm(e.signature,n.signature);return i===`changed`?{kind:`changed`,observed:n}:{kind:`unchanged`,observed:n,evidence:i}}function rb(e,t,n){return j({level:`warn`,phase:`scroll_movement_budget_expired`,data:{direction:e.direction,attempts:t,durationMs:n,...e.swipe.pixels===void 0?{}:{requestedPixels:e.swipe.pixels}}}),{kind:`blind`,reason:`surface-unsettled`}}function ib(e,t){return e!==void 0&&jm(e,t)}async function ab(e){let t;try{t=await e()}catch{return}let n=Dn(t,void 0);return{signature:Om(n.nodes),presentationKey:n.presentationKey,comparisonKey:km(n),nodes:n.nodes}}async function ob(e){let{direction:t,baseline:n,swipe:r,observed:i}=e,a=Dy(t),o=a?(await ky(i.nodes,a)).containerRect:void 0;return o&&!Im(n.signature,i.signature,o)?pb(t,`change-outside-container`,{swipe:r,containerRect:o}):mb(t,`moved`,r,e.attempts,e.startedAt)}async function sb(e){let{direction:t,baseline:n,observed:r,evidence:i,swipe:a}=e,o=cb(n,r,i);return o?pb(t,o.reason,{swipe:a,divergence:o.divergence}):await lb(e)}function cb(e,t,n){if(n===`ambiguous`)return{reason:`no-comparable-content`};if(!Pm(e.signature,t.signature))return{reason:`surface-divergence`,divergence:Fm(e.signature,t.signature)}}async function lb(e){let{direction:t,observed:n,swipe:r}=e,i=Dy(t);if(!i)return mb(t,`unchanged`,r,e.attempts,e.startedAt);let a=await ky(n.nodes,i),o=a.containerRect;if(!o)return pb(t,`no-scroll-container`,{swipe:r});if(r.midpoint&&!ub(o,r.midpoint))return pb(t,`container-outside-swipe`,{swipe:r,containerRect:o});if(a.canScroll)throw db(t,i,r,o);return mb(t,`at-edge`,r,e.attempts,e.startedAt)}function ub(e,t){return ft(e,t.x,t.y)}function db(e,t,r,i){let o=new a(`COMMAND_FAILED`,`scroll ${e} moved nothing: the container still reports hidden content ${t===`bottom`?`below`:`above`} and its contents never shifted`,{reason:`scroll_no_progress`,direction:e,hiddenContentAt:t,containerRect:i,...r.pixels===void 0?{}:{requestedPixels:r.pixels},hint:Ly({targetDirectly:`with scroll ${e} --until <selector>`,rawDrag:r.midpoint!==void 0})});return n(o,`unknown`)}function fb(e,t){j({level:`debug`,phase:`scroll_movement_not_applicable`,data:{direction:e,reason:t}})}function pb(e,t,n){return j({level:`info`,phase:`scroll_movement_unobserved`,data:{direction:e,reason:t,...n.swipe.pixels===void 0?{}:{requestedPixels:n.swipe.pixels},...n.divergence??{},...n.containerRect===void 0?{}:{containerRect:n.containerRect}}}),`unobserved`}function mb(e,t,n,r,i){return j({level:t===`moved`?`debug`:`info`,phase:`scroll_movement_observed`,data:{direction:e,movement:t,attempts:r,durationMs:Date.now()-i,...n.pixels===void 0?{}:{requestedPixels:n.pixels}}}),t}function hb(e){return e===`bottom`?{direction:`down`,edge:`bottom`}:e===`top`?{direction:`up`,edge:`top`}:{direction:w(e)}}function gb(e,t,n){if(e!==void 0&&!Number.isFinite(e))throw new a(`INVALID_ARGS`,`scroll amount must be a number`);te(n),ae({amount:e,pixels:t})}async function _b(e){let t=e.positionals[0],n=e.positionals[1]?Number(e.positionals[1]):void 0,r=e.context.pixels,i=e.context.durationMs,o=e.context.until;if(!t)throw new a(`INVALID_ARGS`,`scroll requires direction`);gb(n,r,i);let s=hb(t),c={...s.edge===void 0?{}:{edge:s.edge},...o===void 0?{}:{until:o}};b(c);let l=ne({amount:n,pixels:r,durationMs:i},s.edge),u=mt(c),d={command:`scroll`,device:e.device,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice};switch(u.kind){case`direction`:{let t=Jy({device:e.device,flags:e.flags,session:e.session});return await Q({...d,use:u.use},async(e,n)=>await yb(e,s,l,n,t))}case`edge`:{let e=u.edge;return await Q({...d,unavailableResponse:t=>vb(`scroll ${e}, which verifies hidden content before scrolling,`,t.hint),use:u.use},async(t,n)=>await Cb(t,e,s,l,n))}case`until`:{let t=u.until;return await Q({...d,unavailableResponse:e=>vb(`scroll --until, which checks whether the selector became visible,`,e.hint),use:u.use},async(n,r)=>await wb(n,e.device,t,s,l,r))}}}function vb(e,t){return g(`UNSUPPORTED_OPERATION`,`${e} requires snapshot support`,void 0,t===void 0?void 0:{hint:t})}async function yb(e,t,n,r,i){let a=await Eb(e,t,n,r)??{};return Ob(t,n,1,a,await bb(e,t.direction,r,i,a))}async function bb(e,t,n,r,i){if(r.kind===`declined`){fb(t,r.reason);return}let a=e.operations.captureSnapshot;if(!a){fb(t,`owner-without-capture`);return}return r.kind===`unobservable`?pb(t,r.reason,{swipe:Sb(i)}):await Zy({direction:t,baseline:r.baseline,swipe:Sb(i),capture:async()=>await a(xb(n))})}function xb(e,t){return{options:{...e.appBundleId===void 0?{}:{appBundleId:e.appBundleId},...t},execution:$(e)}}function Sb(e){let t=ee(e),n=re(e);return{...t===void 0?{}:{midpoint:t},...n===void 0?{}:{pixels:n}}}async function Cb(e,t,n,r,i){let a,o=await Py({edge:t,captureState:async n=>{let r=await Tb(e,t,n,i);return a=r.scope??a,r},scroll:async()=>await Eb(e,n,r,i),settleAfterPass:async()=>{await Db(async()=>(await e.operations.captureSnapshot(xb(i,{scope:a}))).nodes??[],t)}});return Ob(n,r,o.passes,o.result??{})}async function wb(e,t,n,r,i,a){let o=await zy({selector:n,direction:r.direction,platform:M(t),capture:async()=>await e.operations.captureSnapshot(xb(a)),scroll:async()=>await Eb(e,r,i,a)});return S({direction:r.direction,until:n,passes:o.passes,...i.amount===void 0?{}:{amount:i.amount},...i.pixels===void 0?{}:{pixels:i.pixels},...o.result??{}},Vy(r.direction,n,o.passes))}async function Tb(e,t,n,r){return await Oy({edge:t,scope:n,captureNodes:async t=>(await e.operations.captureSnapshot(xb(r,{scope:t}))).nodes??[]})}async function Eb(e,t,n,r){return await e.operations.scrollDirection(kb(t.direction,n,r))}async function Db(e,t,n=1200,r=120){let i,a=Date.now()+n;for(;Date.now()<a;){let n=await jy(await e(),t);if(n===i)return;i=n,await new Promise(e=>setTimeout(e,r))}}function Ob(e,t,n,r,i){let a=x(r),o=re(r);return S({direction:e.direction,...e.edge?{edge:e.edge,passes:n}:{},...t.amount===void 0?{}:{amount:t.amount},...t.pixels===void 0?{}:{pixels:t.pixels},...a===void 0?{}:{durationMs:a},...r,...i===void 0?{}:{movement:i}},Fy({direction:e.direction,edge:e.edge,passes:n,amount:t.amount,pixels:t.pixels,honoredPixels:o,...i===void 0?{}:{movement:i}}))}function kb(e,t,n){return{direction:e,options:t,...n.appBundleId===void 0?{}:{target:{appBundleId:n.appBundleId}},execution:$(n)}}async function Ab(e){let t=Me(e.positionals),n=await yy({command:`viewport`,device:e.device,use:dt,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});return n.type===`response`?{ok:!1,response:n.response}:{ok:!0,execute:async()=>(await n.runtime.operations.setViewport(t),{...t,message:`Viewport set: ${t.width}x${t.height}`})}}function jb(e,t){return{mode:e,...t.appBundleId===void 0?{}:{options:{appBundleId:t.appBundleId}},execution:$(t)}}async function Mb(e){return await Q({command:`back`,device:e.device,use:xt,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice},Nb)}async function Nb(e,t){return await e.operations.back(jb(t.backMode,t)),{action:`back`,mode:t.backMode??`in-app`,...y(`Back`)}}const Pb={home:{use:Mt,message:`Home`},"app-switcher":{use:Ot,message:`Opened app switcher`},"action-button":{use:at,message:`Pressed Action Button`}};function Fb(e){return Object.hasOwn(Pb,e)}function Ib(e){return{...e.appBundleId===void 0?{}:{options:{appBundleId:e.appBundleId}},execution:$(e)}}async function Lb(e,t){let n=Pb[e];return await Q({command:e,device:t.device,use:n.use,inspectFacts:t.inspectFacts,platformServices:t.platformServices,bindDevice:t.bindDevice},async(t,r)=>{let[i]=n.use.required;return await t.operations[i](Ib(r)),{action:e,...y(n.message)}})}function Rb(e){return le(e[0])}function zb(e,t){return{rotation:e,...t.appBundleId===void 0?{}:{options:{appBundleId:t.appBundleId}},execution:$(t)}}async function Bb(e){let t=Rb(e.positionals);return await Q({command:`orientation`,device:e.device,use:ct,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice},(e,n)=>Vb(e,t,n))}async function Vb(e,t,n){let r=(await e.operations.setOrientation(zb(t,n)))?.orientation;return r?{action:`orientation`,orientation:r,...y(`Rotated to ${r}`)}:{action:`orientation`,orientation:t,confirmed:!1,warning:`Requested ${t}; the device owner reported no resulting orientation, so the rotation is unconfirmed.`,...y(`Rotation requested: ${t} (unconfirmed)`)}}function Hb(e){return ie(e[0])}async function Ub(e){let t=e.keyframes===void 0?{pose:Hb(e.positionals)}:C({pose:e.positionals[0],keyframes:ce(e.keyframes)});return await Q({command:`fold`,device:e.device,use:Nt,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice},e=>Wb(e,t))}async function Wb(e,t){let n=await e.operations.setFoldPose(t),r=n.screen;return{action:`fold`,pose:n.pose,hingeAngleDegrees:n.hingeAngleDegrees,...r?{screen:r}:{},...y(r?`Folded to ${n.pose} (hinge ${n.hingeAngleDegrees}°, ${r.display} native panel ${r.widthPt}x${r.heightPt}pt, not snapshot coordinates); refs from before the pose change are stale`:`Folded to ${n.pose} (hinge ${n.hingeAngleDegrees}°); refs from before the pose change are stale`)}}function Gb(e){if(e.length!==1)throw new a(`INVALID_ARGS`,`tv-remote requires exactly one button`);return T(e[0])}function Kb(e,t,n){return{button:e,durationMs:t,...n.appBundleId===void 0?{}:{options:{appBundleId:n.appBundleId}},execution:$(n)}}async function qb(e){let t=Gb(e.positionals),n=e.durationMs===void 0?void 0:Tr(e.durationMs,`durationMs`,0,1e4);return await Q({command:`tv-remote`,device:e.device,use:pt,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice},(e,r)=>Jb(e,t,n,r))}async function Jb(e,t,n,r){return await e.operations.tvRemote(Kb(t,n,r)),{action:`tv-remote`,button:t,...n===void 0?{}:{durationMs:n},...y(`Pressed TV remote ${t}`)}}async function Yb(e){if(Fb(e.req.command))return await Lb(e.req.command,{device:e.session.device,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});switch(e.req.command){case`screenshot`:{let{resolveScreenshotGenericExecution:t}=await import(`../screenshot-runtime.js`).then(e=>e.r);return await t(e)}case`focus`:return await Ty({device:e.session.device,positionals:e.req.positionals??[],inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});case`scroll`:return await _b({device:e.session.device,positionals:e.req.positionals??[],context:e.context,session:e.session,flags:e.req.flags,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});case`viewport`:return await Ab({device:e.session.device,positionals:e.req.positionals??[],inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});case`back`:return await Mb({device:e.session.device,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});case`orientation`:return await Bb({device:e.session.device,positionals:e.req.positionals??[],inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});case`fold`:return await Ub({keyframes:e.req.flags?.keyframes,device:e.session.device,positionals:e.req.positionals??[],inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});case`tv-remote`:return await qb({device:e.session.device,positionals:e.req.positionals??[],durationMs:e.req.flags?.durationMs,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});default:return{ok:!1,response:g(`COMMAND_FAILED`,`${e.req.command} has no runtime execution on the generic route`,{reason:`generic-route-runtime-missing`})}}}async function Xb(e,t,n){let i=gt(e);try{let e=await n();if(!e||e.ok)return e;let r=Zb(i,e.error.details,t);return r===e.error.details?e:{...e,error:{...e.error,details:r}}}catch(e){let n=r(e),a=Zb(i,n.details,t);throw a===n.details?e:(n.details=a,n)}}function Zb(e,t,n){return n.dispatchedSteps>0?v(t,n.dispatchedSteps):e===void 0?t:e===`observes-app`?t?.dispatched===`no`?t:{...t,dispatched:`no`}:t?.dispatched===void 0?{...t,dispatched:`unknown`}:t}function Qb(e){return e.ok?e:{...e,error:{...e.error,details:{...e.error.details,dispatched:`no`}}}}function $b(e){return n(r(e),`no`)}const ex=new Proxy({},{get(){return async()=>{throw new a(`INTERNAL_ERROR`,`Android observation was not supplied by root runtime composition`)}}});function tx(){return new a(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`)}const nx=Object.freeze({stopSnapshotHelper:async()=>{throw tx()},closeManagedBrowser:async()=>{throw tx()},cleanupSessionlessExecutionHost:async()=>{throw tx()},retainExecutionHostAfterClose:()=>{throw tx()}});function rx(e){let{logPath:t,token:n,requestPlatformProviders:r=ax,deviceRuntimeGateway:i,platformServices:a,claimRecoveryGateway:o,appLogAdmissionLedger:s=gy(),audioProbeAdmissionLedger:c=Gh(),perfCaptureAdmissionLedger:l=Kh(),screenRecordingAdmissionLedger:u=qh(),hostDiagnostics:d,providerRuntimeIds:f,providerRuntimeRequiredIds:p,providerCredentials:m,leaseLifecycleProvider:h,cloudArtifactProvider:g,providerAppCatalog:_,androidObservation:v=ex,createCommandSurface:ee,platformResourceCleanup:y=nx,providerDeviceRuntimeScope:te,trackDownloadableArtifact:ne,daemonPolicy:b}=e,{sessionStore:x,leaseRegistry:re}=e,ie=b?mf(e.deviceInventoryGateways,b):e.deviceInventoryGateways;async function S(e){let n=Date.now(),r=!!(e.meta?.debug||e.flags?.verbose);return await Ue({session:e.session,requestId:e.meta?.requestId,command:e.command,debug:r,logPath:t},async()=>{let t=await Ht(ix(e),async()=>await C(e));return t.ok?kx(e,t,n):{ok:!1,error:gx(e,Ox(Tx(e,wx(e,t.error,x),x)))}})}async function C(e){if(!gn(e.token,n))return sx();mx(e);let t=ux(e);if(t)return t;let r=fx(e);if(r)return r;let s=iy(e);if(s)return s;let c,l,u=mr(e);try{l=await br({...ie,requestScope:u},async()=>await Hn(async()=>(c=await Jv({req:e,sessionStore:x,leaseRegistry:re,deviceRuntimeGateway:i,platformServices:a,claimRecoveryGateway:o,platformRequestScope:u,platformResourceCleanup:y,providerAppCatalog:_,daemonPolicy:b}),await w(c))))}catch(e){l=Sx(e)}return ae(e,c,await Cx(c,l))}function ae(e,t,n){let r=t?x.lookup(t.sessionName)?.session:void 0;return Pf(t?.req??e,re,r,b)?Bu(e.command,n):n}async function w(e,t){let n=async()=>{let n=await $v({scope:e,sessionStore:x,trackDownloadableArtifact:ne});if(n.type===`response`)return n.response;let i=n.scope,a=async e=>{let n=async()=>await T({lockedScope:i,providerScope:e,allowReplayActions:t===void 0});return te?await te(n):await n()};if(t)return await a(t);let o=ox(i);if(!r.hasConfiguredResolvers&&!o)return await a({});let s=await kp({req:i.req,existingSession:i.existingSession,useDefaultWebProvider:o});return s?await r.run(s,a):await a({})};return t?await e.runAdmitted(n):await e.runLocked(n)}async function T(e){let{lockedScope:t,providerScope:n,allowReplayActions:r}=e;return await Xb(t.req,t.dispatchLedger,async()=>await oe({lockedScope:t,providerScope:n,allowReplayActions:r}))}async function oe(e){let{lockedScope:t,providerScope:n,allowReplayActions:r}=e,{dispatchLedger:i}=t,a=mr(t.req);return await Yh({req:t.req,sessionName:t.sessionName,logPath:t.logPath,sessionStore:x,leaseRegistry:re,leaseLifecycleProvider:h,providerRuntimeIds:f,providerRuntimeRequiredIds:p,providerCredentials:m,cloudArtifactProvider:g,providerAppCatalog:_,invoke:zr(S,i),invokeReplayAction:r?zr(E(t,n),i):void 0,providerScope:n,androidObservation:v,createCommandSurface:ee,platformResourceCleanup:y,bindDevice:t.bindDevice,platformServices:t.platformServices,inspectFacts:t.inspectFacts,bindExactDevice:t.bindExactDevice,reconcileOrphanedDeviceClaim:hr({scope:a,composeGateway:o}),appLogAdmissionLedger:s,audioProbeAdmissionLedger:c,perfCaptureAdmissionLedger:l,screenRecordingAdmissionLedger:u,hostDiagnostics:d,requestScope:a,retainDeviceExecutionLock:t.retainDeviceExecutionLock,throwIfCanceled:t.throwIfCanceled,contextFromFlags:t.handlerContextFromFlags})||await yx({lockedScope:t,logPath:t.logPath,sessionStore:x,androidObservation:v,createCommandSurface:ee})}function E(e,t){return async r=>{if(!xx(r,e))return await S(r);if(!gn(r.token,n))return sx();mx(r);let s,c;try{let n=bx(r,e);s=await Jv({req:n,sessionStore:x,leaseRegistry:re,deviceRuntimeGateway:i,platformServices:a,claimRecoveryGateway:o,platformRequestScope:mr(n),platformResourceCleanup:y,providerAppCatalog:_,daemonPolicy:b}),c=s.sessionName===e.sessionName?await w(s,t):await w(s)}catch(e){c=Sx(e)}return vx(r,await Cx(s,c))}}return S}function ix(e){let t=e.meta?.developerDir;return typeof t==`string`?{DEVELOPER_DIR:t}:void 0}const ax=Object.freeze({hasConfiguredResolvers:!1,run:async(e,t)=>await t({})});function ox(e){return e.existingSession!==void 0&&Q_(e.existingSession)||e.req.flags?.platform===`web`}function sx(){return{ok:!1,error:s(new a(`UNAUTHORIZED`,`Invalid token`))}}function cx(){return g(`INVALID_ARGS`,`--record and --no-record are mutually exclusive; pass at most one.`)}const lx=[[`recordAs`,`--record-as`,`string`],[`textStdin`,`--text-stdin`,`boolean`]];function ux(e){if(e.flags?.record&&e.flags?.noRecord)return cx();if(e.command===`fill`)return dx(e);let t=lx.find(([t])=>e.flags?.[t]!==void 0);if(t)return g(`INVALID_ARGS`,`${t[1]} is supported only by fill.`)}function dx(e){let t=lx.find(([t,,n])=>{let r=e.flags?.[t];return r!==void 0&&typeof r!==n});if(t)return g(`INVALID_ARGS`,`${t[1]} must be a ${t[2]}.`)}function fx(e){if(e.flags?.snapshotCustomActions===!0&&e.flags?.snapshotRaw===!0)return g(`INVALID_ARGS`,`--actions and --raw are mutually exclusive: custom actions are only readable through the private-AX snapshot path, which a raw capture does not use.`)}function px(e){if(!(e.command!==`fill`||!ii(e.flags)))return ci({ts:0,command:`fill`,positionals:e.positionals??[],flags:e.flags})}function mx(e){let t=px(e);t!==void 0&&We(t)}const hx=new Set([`message`,`hint`,`cause`,`details`]);function gx(e,t){let n=px(e);if(!n)return t;let r=ai(e.flags),i=e=>pa(e,n,r);return Object.fromEntries(Object.entries(t).map(([e,t])=>[e,hx.has(e)?_x(t,i):t]))}function _x(e,t){return typeof e==`string`?t(e):Array.isArray(e)?e.map(e=>_x(e,t)):!e||typeof e!=`object`?e:Object.fromEntries(Object.entries(e).map(([e,n])=>[t(e),_x(n,t)]))}function vx(e,t){return t.ok?t:{...t,error:gx(e,t.error)}}async function yx(e){let{lockedScope:t,logPath:n,sessionStore:r,androidObservation:i,createCommandSurface:a}=e,o=r.lookup(t.sessionName);if(!o)return d();let s=r.requireCurrent(o),c=await Yb({req:t.req,session:s,context:t.contextFromFlags(t.req.flags,s.appBundleId,s.trace?.outPath),inspectFacts:t.inspectFacts,platformServices:t.platformServices,bindDevice:t.bindDevice,createCommandSurface:a});if(!c.ok)return Qb(c.response);let{dispatchGenericCommand:l}=await Xh();return await l({req:t.req,ref:o,sessionName:t.sessionName,logPath:n,sessionStore:r,contextFromFlags:t.contextFromFlags,platformServices:t.platformServices,executePlatformCommand:c.execute,androidObservation:i,createCommandSurface:a,...c.recorded?{recordedRequest:c.recorded}:{}})}function bx(e,t){if(e.command!==`open`)return e;let n=e.internal?.retainDeviceExecutionLock;return{...e,internal:{...e.internal,retainDeviceExecutionLock:async e=>{await t.retainDeviceExecutionLock(e),await n?.(e)}}}}function xx(e,t){return e.session===t.sessionName&&iu(e.command)}function Sx(e){j({level:`error`,phase:`request_failed`,data:{error:e instanceof Error?e.message:String(e)}});let t=A(),n=He({force:!0});return{ok:!1,error:s(e,{diagnosticId:t.diagnosticId,logPath:n?.path,diagnosticsRecord:n?.ref})}}async function Cx(e,t){if(!e)return t;let n=t;try{await e[Symbol.asyncDispose]()}catch(e){t.ok?n=Sx(e):(j({level:`error`,phase:`request_binding_cleanup_failed`,data:{primaryCode:t.error.code,cleanupError:e instanceof Error?e.message:String(e)}}),He({force:!0}))}return ey(e,n)}function wx(e,t,n){if(t.code!==`SESSION_NOT_FOUND`)return t;let r=Ex(e,n);if(r===void 0)return t;let i=n.readRepairTombstone(r);if(!i)return t;let o=i.sourcePath?`re-run: replay ${i.sourcePath} --save-script`:`re-run your replay <script> --save-script from the start`;return i.commitFailure?s(new a(`REPAIR_COMMIT_FAILED`,`The repair transaction for session "${e.session}" completed, but committing its healed script failed at teardown: ${i.commitFailure.message}. ${o}.`)):s(new a(`REPAIR_SESSION_EXPIRED`,`The --save-script repair session "${e.session}" was reaped before it was finalized (idle-reap); ${o}.`))}function Tx(e,t,n){if(t.code!==`SESSION_NOT_FOUND`)return t;let r=Dx(e,n);return r?s(py(r.owner,r)):t}function Ex(e,t){try{return Tg(Af(e),t,{attachesToSession:!1})}catch{return}}function Dx(e,t){let n=Ex(e,t);if(n!==void 0)try{return t.readIdleExpiryTombstone(n)}catch{return}}function Ox(e){let n=e.retriable??t(e.code);return n===void 0?e:{...e,retriable:n}}function kx(e,t,n){let r=Ax(e,t);if(!e.meta?.includeCost)return r;let i=Mx(t.data,n);return{ok:!0,data:{...r.data??{},cost:i}}}function Ax(e,t){let n=e.meta?.responseLevel??`default`;if(n==="default")return t;let r=xp[e.command];return r?{ok:!0,data:r(t.data??{},n)}:t}const jx=[`ios_runner_command_send`,`ios_runner_readiness_preflight`];function Mx(e,t){let n={wallClockMs:Date.now()-t,runnerRoundTrips:Ke(jx)},r=e?.nodes;return Array.isArray(r)&&(n.nodeCount=r.length),n}function Nx(e){let t=5e3;return e.screenRecording&&(t+=11e3),Q_(e)&&(t+=3e4),t}function Px(e){e.destroyConnections?.();let t=`closeAllConnections`in e?e.closeAllConnections:void 0;if(typeof t==`function`){t.call(e);return}let n=`closeIdleConnections`in e?e.closeIdleConnections:void 0;typeof n==`function`&&n.call(e)}async function Fx(e,t=5e3){await Promise.all(e.map(async e=>{let n;await new Promise(r=>{n=setTimeout(()=>{Px(e),r()},t);try{e.close(()=>r())}catch{r()}}),n&&clearTimeout(n)}))}function Ix(e=process.env){let t=e.AGENT_DEVICE_DAEMON_IDLE_TIMEOUT_MS?.trim();if(t){let e=Number(t);if(Number.isFinite(e)&&e>=0)return Math.floor(e)}return 3e5}function Lx(e){return e.toArray().some(e=>!Rx(e))}function Rx(e){return qi(e)}function zx(e){return e.toArray().some(e=>!!e.screenRecording)}function Bx(e){return e.inFlightRequestCount>0||Lx(e.sessionStore)?!1:!zx(e.sessionStore)}function Vx(e){let t=Ix(e.env),n,r=()=>Bx({sessionStore:e.sessionStore,inFlightRequestCount:e.getInFlightRequestCount()}),i=()=>{n&&=(clearTimeout(n),void 0)},a=()=>{i(),!(t<=0)&&(n=setTimeout(()=>{if(n=void 0,r()){if(e.hasRetainedLeases()){a();return}j({level:`info`,phase:`daemon_idle_reap`,data:{idleMs:t}}),e.onIdleReap()}},t),n.unref?.())};return{noteActivity:()=>{r()?a():i()},cancel:i,idleMs:t}}const Hx=`claim-clear-failed`,Ux=Object.freeze({deleted:!0,absent:!0,"ownership-changed":!0,unattributable:!1}),Wx=2147483647;function Gx(e){let{sessionStore:t,idleExpiryMs:n}=e,r=e.now??Date.now,i,a=!1,o=!1,s=new Set,c=new Map,l=()=>{i&&=(clearTimeout(i),void 0)},u=()=>{o=!0,l()},d=()=>{let e,r=new Set;for(let i of t.listRefs()){r.add(i.address);let t=dy(i.session,n);if(t===void 0)continue;let a=c.get(i.address),o=a===void 0?t:Math.max(t,a);(e===void 0||o<e)&&(e=o)}for(let e of c.keys())r.has(e)||c.delete(e);return e},f=()=>{if(l(),o||n<=0||a)return;let e=r(),t=d();if(t===void 0)return;let s=Math.max(0,t-e),c=s>Wx;i=setTimeout(()=>{i=void 0,c?f():p()},Math.min(s,Wx)),i.unref?.()},p=async()=>{a=!0;let t=async()=>{try{await Kx({...e,now:r,retryNotBeforeMs:c,settling:s,closing:()=>o,notifyExpired:e.onSessionExpired})}catch(e){j({level:`warn`,phase:`session_idle_expiry_sweep_failed`,data:{idleExpiryMs:n,error:e instanceof Error?e.message:String(e)}})}};try{await(e.withinDiagnosticsScope?e.withinDiagnosticsScope(t):t())}finally{a=!1,f()}};return{noteSessionsChanged:f,cancel:u,idleExpiryMs:n}}async function Kx(e){for(let t of e.sessionStore.listRefs())if(cy(t.session)){if(e.closing())return;await qx({...e,ref:t})}}async function qx(e){let{address:t}=e.ref;if(e.settling.has(t)){e.retryNotBeforeMs.set(t,e.now()+e.idleExpiryMs);return}let n=h_(t,e.ref.session.device.id),r=Xx({...e,lockKeys:n}),i=e.settleBudgetMs?.(e.ref.session);if(i===void 0)return void await r;let a=Yx(i);try{if(await Promise.race([r,a.promise])!==Jx)return}finally{a.cancel()}j({level:`warn`,phase:`session_idle_expiry_settle_timeout`,data:{session:t,idleExpiryMs:e.idleExpiryMs,settleBudgetMs:i,...e.ref.session.deviceClaim?{deviceKey:e.ref.session.deviceClaim.deviceKey}:{}}}),e.retryNotBeforeMs.set(t,e.now()+e.idleExpiryMs)}const Jx=Symbol(`session-idle-settle-budget-elapsed`);function Yx(e){let t;return{promise:new Promise(n=>{t=setTimeout(()=>n(Jx),e),t.unref?.()}),cancel:()=>clearTimeout(t)}}async function Xx(e){let{address:t,session:n}=e.ref;e.settling.add(t);let r;try{r=await I_(e.executionLocks,e.lockKeys,async()=>{if(e.closing())return Zx;let t=e.sessionStore.resolveCurrent(e.ref);if(!t||t.device.id!==n.device.id)return Zx;let r=e.now();return uy(t,e.idleExpiryMs,r)?{outcome:await $x({ref:e.sessionStore.refresh(e.ref),idleExpiryMs:e.idleExpiryMs,expiredAtMs:r,sessionStore:e.sessionStore,settleSession:e.settleSession}),retry:!0}:Zx}),r.retry?Qx(e,t,r.outcome):e.retryNotBeforeMs.delete(t)}catch(n){j({level:`warn`,phase:`session_idle_expiry_settle_failed`,data:{session:t,idleExpiryMs:e.idleExpiryMs,error:n instanceof Error?n.message:String(n)}}),Qx(e,t,void 0);return}finally{e.settling.delete(t)}return r.outcome&&e.notifyExpired?.(r.outcome),r.outcome}const Zx=Object.freeze({outcome:void 0,retry:!1});function Qx(e,t,n){if(n){e.retryNotBeforeMs.delete(t);return}e.retryNotBeforeMs.set(t,e.now()+e.idleExpiryMs)}async function $x(e){let{ref:t,idleExpiryMs:n,expiredAtMs:r}=e,{address:i,session:a}=t,o=a.deviceClaim?.deviceKey,s={session:i,idleExpiryMs:n,...o?{deviceKey:o}:{}};if(!await eS(e,s))return;let c=await tS(i,a.deviceClaim);if(c===Hx||!Ux[c]){j({level:`warn`,phase:`session_idle_expiry_device_claim_unconfirmed`,data:s});return}if(e.sessionStore.finalizeRepairTeardown(t),!e.sessionStore.retire(t)){j({level:`info`,phase:`session_idle_expiry_superseded`,data:s});return}e.sessionStore.writeIdleExpiryTombstone(i,fy(i,{expiredAtMs:r,idleExpiryMs:n,deviceKey:o}));let l=r-sy(a);return j({level:`info`,phase:`session_idle_expired`,data:{...s,idleForMs:l,claim:c}}),{sessionName:i,idleExpiryMs:n,idleForMs:l,claim:c,...o?{deviceKey:o}:{}}}async function eS(e,t){try{return await e.settleSession(e.ref),!0}catch(e){return j({level:`warn`,phase:`session_idle_expiry_cleanup_failed`,data:{...t,error:e instanceof Error?e.message:String(e)}}),!1}}async function tS(e,t){if(!t)return`absent`;try{return await dr(t)}catch(n){return j({level:`warn`,phase:`session_idle_expiry_device_claim_clear_failed`,data:{session:e,deviceKey:t.deviceKey,error:n instanceof Error?n.message:String(n)}}),Hx}}async function nS(e){let{leaseRegistry:t,expiredProviderLeaseReleaser:n,timeoutMs:r}=e;await Promise.all(t.listActiveLeases().map(async e=>{try{let i=await rS(n.release(e),r);t.releaseLease(jl(e)),i||j({level:`warn`,phase:`daemon_shutdown_lease_release_timed_out`,data:{leaseId:e.leaseId,timeoutMs:r}})}catch(t){j({level:`warn`,phase:`daemon_shutdown_lease_release_failed`,data:{leaseId:e.leaseId,error:t instanceof Error?t.message:String(t)}})}}))}async function rS(e,t){return await new Promise((n,r)=>{let i=setTimeout(()=>n(!1),t);e.then(()=>{clearTimeout(i),n(!0)},e=>{clearTimeout(i),r(e)})})}const iS=`clear-unrecorded`;function aS(){let e={released:[],orphaned:[],superseded:[],unattributable:[]},t=new Map;return{claims:e,releaseClaim:async e=>{if(e.deviceClaim)try{t.set(e.name,await dr(e.deviceClaim))}catch(n){t.set(e.name,iS),j({level:`warn`,phase:`daemon_shutdown_device_claim_release_failed`,data:{session:e.name,deviceKey:e.deviceClaim.deviceKey,error:n instanceof Error?n.message:String(n)}})}},finalize:n=>{let r=n.deviceClaim;if(!r)return;let i={deviceKey:r.deviceKey,session:n.name,platform:M(n.device),deviceId:n.device.id},a=t.get(n.name);switch(a){case`deleted`:case`absent`:e.released.push(i);return;case`ownership-changed`:e.superseded.push(i);return;case`unattributable`:e.unattributable.push(i);return;case iS:case void 0:e.orphaned.push(i);return;default:oS(a)}}}}function oS(e){throw Error(`Undeclared device-claim outcome: ${String(e)}`)}function sS(e){if(e===void 0)return;let t=Number(e);if(Number.isInteger(t))return t}const cS=Object.freeze({match:!1,replaced:!0,absent:!0,unreadable:!1,ownerless:!1,unproven:!1});function lS(e){let t=ar(e.infoPath,e.owner);if(cS[t.state]&&!(t.state===`absent`&&dS(e.stateDir)))return t.state===`replaced`?{state:`replaced`,registeredPid:t.identity.pid}:{state:`absent`}}function uS(e){let t,n=()=>{t&&=(clearInterval(t),void 0)};return t=setInterval(()=>{if(dS(e.stateDir)){n();return}let t=lS(e);t&&(n(),e.onLoss(t))},15e3),t.unref?.(),n}function dS(e){try{return Bt(e)===void 0}catch{return!1}}function fS(e){let t=new Set,n=Yr.createServer(n=>{t.add(n),n.on(`close`,()=>t.delete(n));let r=``,a=0,o=new Set,c=!1,l=()=>{if(!(c||a===0)){c=!0;for(let e of o)qn(e);j({level:`warn`,phase:`request_client_disconnected`,data:{inFlightRequests:a}})}};n.setEncoding(`utf8`),n.on(`close`,l),n.on(`error`,l),n.on(`data`,async t=>{let c=nn(r,t);r=c.buffer;for(let t of c.lines){let r;a+=1;let c,l,u=!1;try{let a=pS(t);if(u=_n(a),c=Zn(a.meta?.requestId,`socket`),a.meta={...a.meta,requestId:c},l=Xn(c),o.add(c),Yn(c))throw i();r=await $n(u?e=>{n.destroyed||n.write(sn(e))}:void 0,async()=>await e(a))}catch(e){r={ok:!1,error:s(e)}}finally{--a,l&&o.delete(l.requestId),Qn(l)}n.destroyed||n.write(u?en(r):`${JSON.stringify(r)}\n`)}})});return n.destroyConnections=()=>{for(let e of t)e.destroy();t.clear()},n}function pS(e){let t=JSON.parse(e);if(!t||typeof t!=`object`||Array.isArray(t))return t;let{internal:n,...r}=t;return r}function mS(e){return gS(e,`Failed to bind socket server`)}function hS(e){return gS(e,`Failed to bind HTTP server`)}function gS(e,t){return new Promise((n,r)=>{e.once(`error`,r),e.listen(0,`127.0.0.1`,()=>{e.off(`error`,r);let i=e.address();if(typeof i==`object`&&i?.port){n(i.port);return}r(new a(`COMMAND_FAILED`,t))})})}async function _S(e,t){t.length!==0&&await N({logPath:e,command:`daemon-startup`,debug:!1},()=>{for(let e of t)j({level:`warn`,phase:e.phase,data:{resourcePath:e.resourcePath,...e.data}})})}async function vS(e,t,n){await N({logPath:e},()=>{j({level:`warn`,phase:t,data:n})})}async function yS(e){try{let t=await e.registration.finish(e.outcome);t.state!==`removed`&&t.state!==`absent`&&await vS(e.logPath,`daemon_info_removal_declined`,{infoPath:e.infoPath,removed:!1,reason:t.state,...t.state===`replaced`?{registeredPid:t.identity.pid}:{}})}catch(t){await vS(e.logPath,`daemon_registration_finish_failed`,{error:s(t)})}}function bS(e,t,n,r){return uS({infoPath:t,stateDir:e,owner:r,onLoss:e=>void vS(n,`daemon_metadata_lost`,{infoPath:t,...e}).catch(()=>{})})}async function xS(e){let{session:t,stderr:n,resource:r,teardown:i}=e;try{return await i(),!0}catch(e){return n.write(`Daemon ${r} teardown error (${t.name}): ${e instanceof Error?e.message:String(e)}\n`),!1}}async function SS(e){let{ref:t,sessionStore:n,stderr:r,platformCleanup:i,finalizeApplicationLifecycle:a,afterSuccessfulTeardown:o}=e,s=n.resolveCurrent(t),c=s??t.session,l=yv(s?n.getRuntimeHints(t.address):void 0),u=Nx(c),d=await xS({session:c,stderr:r,resource:`app-log`,teardown:async()=>await ev({ref:t,sessionStore:n})}),f=n.resolveCurrent(t)??c,p=(async()=>{let e=await xS({session:c,stderr:r,resource:`session`,teardown:async()=>await ov({appLog:`already-settled`,ref:t,sessionStore:n,platformCleanup:i})}),o=!a||await xS({session:c,stderr:r,resource:`lifecycle`,teardown:async()=>await a(f,l)});return e&&o})(),m=await Promise.race([p,Ut(u).then(()=>(r.write(`Daemon session teardown timed out (${c.name}).\n`),!1))]),h=d&&m;n.finalizeRepairTeardown(t),h&&await o?.(c),n.retire(t)}async function CS(e){let t=e.env??process.env,n=e.stdout??process.stdout,i=e.stderr??process.stderr,o=e.exit??(e=>process.exit(e)),s=pn(t.AGENT_DEVICE_STATE_DIR),{baseDir:c,infoPath:l,logPath:u,sessionsDir:d}=s,f=ln(t.AGENT_DEVICE_DAEMON_SERVER_MODE),p=Wt(t.AGENT_DEVICE_RETAIN_ARTIFACTS),m;try{m=rr(t)}catch(e){return i.write(`Daemon error: ${r(e).message}\n`),o(1),null}let h=m?()=>ff(m,`device-shutdown`):void 0,g=new ps(d),_=await e.composeDeps({env:t,baseDir:c,sessionsDir:d,assertShutdownAllowed:h,resolveSessionDir:e=>g.resolveSessionDir(e),resolveSessionArtifacts:e=>({outputPath:g.resolveAppLogPath(e),pidPath:g.resolveAppLogPidPath(e)}),openWebSessionNames:()=>$_(g)}),v=gy(),ee=Gh(),y=Kh(),te=qh(),ne=yn(),b=P.randomBytes(24).toString(`hex`),x=Lt(),re=Vr(),ie=Hr(),S=_.providerDeviceRuntimes,C=_.deviceRuntimeGateway,ae=C.applicationLifecycle;if(!ae)throw new a(`COMMAND_FAILED`,`Platform lifecycle gateway is not configured.`,{reason:`runtime-gateway-missing`});nr(_.providerDeviceAdmission),vf(_.interactorResolution);let w=qf({leaseLifecycleProvider:_.leaseLifecycleProvider,providerRuntimeIds:_.providerRuntimeIds,recoverExpiredLease:_.recoverExpiredLease,stateDir:c,recoverableProviderIds:_.recoverableProviderIds});w.retryPending();let T=new wf({maxActiveSimulatorLeases:sS(t.AGENT_DEVICE_MAX_SIMULATOR_LEASES),defaultLeaseTtlMs:sS(t.AGENT_DEVICE_LEASE_TTL_MS),minLeaseTtlMs:sS(t.AGENT_DEVICE_LEASE_MIN_TTL_MS),maxLeaseTtlMs:sS(t.AGENT_DEVICE_LEASE_MAX_TTL_MS),onLeaseExpired:e=>{w.release(e)}}),oe=rx({logPath:u,token:b,sessionStore:g,leaseRegistry:T,appLogAdmissionLedger:v,audioProbeAdmissionLedger:ee,perfCaptureAdmissionLedger:y,hostDiagnostics:_.hostDiagnostics,screenRecordingAdmissionLedger:te,daemonPolicy:m,trackDownloadableArtifact:xs,deviceRuntimeGateway:C,claimRecoveryGateway:_.claimRecoveryGateway,platformResourceCleanup:_.platformResourceCleanup,leaseLifecycleProvider:_.leaseLifecycleProvider,providerRuntimeIds:_.providerRuntimeIds,..._.requestRouter}),E=()=>{},se=async e=>{await N({logPath:u},()=>{j({level:`error`,phase:`daemon_fatal`,data:{error:e instanceof Error?e.message:String(e)}})})},ce=aS(),le=async e=>{let t=g.resolveCurrent(e)??e.session;try{await SS({ref:e,sessionStore:g,stderr:i,platformCleanup:_.platformResourceCleanup,finalizeApplicationLifecycle:async(e,t)=>await dv({gateway:C,scope:_r(),session:e,stateDir:c,runtimeHints:t}),afterSuccessfulTeardown:ce.releaseClaim})}finally{ce.finalize(t)}},ue=async()=>{g.closeAdmission();let e=g.listRefs();await Promise.all(e.map(le))},de=Gx({sessionStore:g,idleExpiryMs:oy(t),executionLocks:ny(T),settleSession:async e=>{let t=g.resolveCurrent(e)??e.session,n=e.address,r=yv(g.getRuntimeHints(n));await ov({appLog:`run`,ref:e,sessionStore:g,platformCleanup:_.platformResourceCleanup}),await dv({gateway:C,scope:_r(),session:t,stateDir:c,runtimeHints:r,daemonLeaving:!1})},settleBudgetMs:e=>Nx(e),withinDiagnosticsScope:async e=>await N({logPath:u},e),onSessionExpired:()=>{pe.noteActivity()}}),D=!1,fe=new Set,pe=Vx({sessionStore:g,getInFlightRequestCount:()=>fe.size,hasRetainedLeases:()=>T.hasRetainedLeases(),onIdleReap:()=>{k()},env:t}),me=async e=>{if(D)return{ok:!1,error:{code:`COMMAND_FAILED`,message:`Daemon is shutting down.`,details:{reason:`daemon_shutting_down`}}};pe.cancel();let t=oe(e);fe.add(t);try{return await t}finally{fe.delete(t),pe.noteActivity(),de.noteSessionsChanged()}},he=async()=>{let e=[],n,r,i=f!==`http`,a=f!==`socket`;if(i){let t=fS(me);e.push(t),n=await mS(t)}if(a){let n=await Hd({handleRequest:me,leaseRegistry:T,token:b,retainArtifacts:p,env:t,resolveRequestDiagnosticsPath:m?.requiredLeaseBackend?void 0:e=>cn(g.resolveSessionDir(e.session),e.requestId)});e.push(n),r=await hS(n)}return{servers:e,socketPort:n,httpPort:r}},ge=(e,t)=>{O.publish({socketPort:e,httpPort:t,token:b,version:ne,codeOrigin:re,codeSignature:ie,policyDigest:m?.digest}),e&&n.write(`AGENT_DEVICE_DAEMON_PORT=${e}\n`),t&&n.write(`AGENT_DEVICE_DAEMON_HTTP_PORT=${t}\n`)},_e=e=>{for(let t of e)try{t.close(()=>{})}catch{}},ve=await An(s);if(ve.status!==`acquired`)return await Promise.allSettled(S.map(async e=>await e.shutdown())),i.write(`Daemon registration ${ve.status}; exiting.\n`),o(jn[ve.status]),null;let O=ve.owner,ye=[],be,xe,Se=[];try{await _.ownerLifecycle.configureForDaemonLock({stateDir:c,hasDeviceClaimAuthority:cr,onDiagnostic:e=>Se.push(e)});let e=await _.ownerLifecycle.recoverLegacyAppLogMarkers(d);v.retainLegacyMarkers(e.retained);for(let t of e.recovered)Se.push({phase:`app_log_legacy_marker_recovered`,resourcePath:t,data:{}});for(let t of e.retained)Se.push({phase:`app_log_legacy_marker_retained`,resourcePath:t.markerPath,data:{reason:t.reason,...t.message===void 0?{}:{message:t.message}}});await gr({sessionsDir:d,gateway:C,scope:_r(),onDiagnostic:e=>Se.push(e)}),await vn(_.ownedProcessRecords,{openWebSessionNames:$_(g),purposes:[`simctl-screen-recording`],termTimeoutMs:5e3}),await _.cleanupManagedWebOrphans({stateDir:c,openWebSessionNames:$_(g),ownedProcessRecords:_.ownedProcessRecords}),ae.recoverStartupResources({stateDir:c}).catch(e=>{j({level:`warn`,phase:`daemon_lifecycle_startup_recovery_failed`,data:{error:e instanceof Error?e.message:String(e)}})});let t=await he();ye=t.servers,be=t.socketPort,xe=t.httpPort,ge(be,xe),E=bS(c,l,u,x),await _S(u,Se);for(let e of _.skippedProviderRuntimes)await vS(u,`provider_runtime_skipped`,{provider:e.provider,code:e.error.code,message:e.error.message,hint:e.error.details?.hint});await wS(u,hr({scope:_r(),composeGateway:_.claimRecoveryGateway}),c),pe.noteActivity()}catch(e){let t=r(e);return i.write(`Daemon error: ${t.message}\n`),_e(ye),E(),await Promise.allSettled(S.map(async e=>await e.shutdown())),await yS({registration:O,infoPath:l,logPath:u}),await _.ownerLifecycle.clearDaemonLockConfiguration(),o(1),null}Ur();let k=async(e={})=>{if(pe.cancel(),de.cancel(),D)return;D=!0,E(),e.cause&&await se(e.cause),await Fx(ye),await Promise.allSettled(fe);try{await N({logPath:u},async()=>{await ae.detachForDaemonShutdown()})}catch{}w.beginShutdown(),await ue(),await N({logPath:u},async()=>{await nS({leaseRegistry:T,expiredProviderLeaseReleaser:w,timeoutMs:1e3})});try{await _.ownerLifecycle.resetAndroidSnapshotHelper()}catch(e){j({level:`warn`,phase:`daemon_shutdown_android_snapshot_helper_cleanup_failed`,data:{error:e instanceof Error?e.message:String(e)}})}let t=await w.drain(2e3);j({level:t.pending.length===0?`info`:`warn`,phase:`daemon_shutdown_provider_release_drain`,data:{releasedLeaseIds:t.released.map(e=>e.leaseId),pendingLeaseIds:t.pending.map(e=>e.leaseId),releasedDeviceKeys:ce.claims.released.map(e=>e.deviceKey),orphanedDeviceKeys:ce.claims.orphaned.map(e=>e.deviceKey)}}),w.shutdown(),await C.shutdown(),await Promise.allSettled(S.map(async e=>await e.shutdown())),await ae.finalizeDaemonShutdown(),await Promise.race([Wr().catch(()=>{}),Ut(1e3)]),await yS({registration:O,infoPath:l,logPath:u,outcome:{providerReleases:t,claims:ce.claims}}),await _.ownerLifecycle.clearDaemonLockConfiguration(),o(e.exitCode??0)};return e.registerProcessHandlers!==!1&&(process.on(`SIGINT`,()=>{k()}),process.on(`SIGTERM`,()=>{k()}),process.on(`SIGHUP`,()=>{k()}),process.on(`uncaughtException`,e=>{let t=e instanceof a?e:r(e);i.write(`Daemon error: ${t.message}\n`),k({exitCode:1,cause:e})}),process.on(`unhandledRejection`,e=>{let t=e instanceof Error?e:Error(String(e)),n=t instanceof a?t:r(t);i.write(`Daemon error: ${n.message}\n`),k({exitCode:1,cause:t})})),{httpPort:xe,shutdown:k,socketPort:be,token:b}}async function wS(e,t,n){await N({logPath:e},async()=>{try{let e=await lr(t,n);e.examined>0&&j({phase:`device_claim_reconcile`,data:e})}catch(e){j({level:`warn`,phase:`device_claim_reconcile_failed`,data:{error:e instanceof Error?e.message:String(e)}})}})}CS({composeDeps:async e=>(await import(`../daemon-composition.js`)).createDaemonRuntimeDeps(e)}).catch(e=>{let t=r(e);process.stderr.write(`Daemon error: ${t.message}\n`),process.exit(1)});export{Kp as $,si as $t,J_ as A,Wi as At,dg as B,ji as Bt,sv as C,fl as Ct,nv as D,Aa as Dt,tv as E,zs as Et,Eg as F,Hi as Ft,Km as G,Ii as Gt,cg as H,Ai as Ht,Og as I,Ui as It,nh as J,R as Jt,Jm as K,Li as Kt,kg as L,Ji as Lt,A_ as M,Gi as Mt,jg as N,Ki as Nt,Q_ as O,xa as Ot,Ag as P,qi as Pt,rm as Q,ii as Qt,yg as R,Vi as Rt,cv as S,jl as St,ev as T,Cs as Tt,gh as U,Ni as Ut,fg as V,Ri as Vt,Xm as W,zi as Wt,Tm as X,Oi as Xt,Em as Y,ki as Yt,im as Z,ci as Zt,yv as _,wf as _t,$ as a,Gp as at,Tv as b,mu as bt,_y as c,Yp as ct,Ev as d,wp as dt,ai as en,qp as et,vv as f,Wf as ft,Pv as g,Of as gt,Dv as h,Df as ht,Sy as i,Zp as it,K_ as j,Bi as jt,q_ as k,ta as kt,Uv as l,Bp as lt,Iv as m,Tf as mt,$b as n,Up as nt,vy as o,Rp as ot,bv as p,Uf as pt,Zm as q,Fi as qt,Ey as r,Hp as rt,yy as s,zp as st,Qb as t,ri as tn,Vp as tt,Bv as u,Tp as ut,jv as v,bf as vt,av as w,Bs as wt,Fv as x,Ml as xt,Lv as y,yf as yt,bg as z,Mi as zt};