@kaeawc/auto-mobile 0.0.93 → 0.0.94
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/build-info.json +12 -12
- package/dist/src/ble-peripheral.py +153 -0
- package/dist/src/{chunk-r6z1eztj.js → chunk-026y62r9.js} +11 -11
- package/dist/src/chunk-0jyfg947.js +4 -0
- package/dist/src/{chunk-8g1922rp.js → chunk-0zfpp1wh.js} +4 -4
- package/dist/src/{chunk-qf6nynk6.js → chunk-13qxf7ym.js} +5 -5
- package/dist/src/chunk-1scenrk7.js +4 -0
- package/dist/src/chunk-1vb5ph1k.js +4 -0
- package/dist/src/{chunk-710rxz9y.js → chunk-20g565q7.js} +3 -3
- package/dist/src/chunk-21h6dhdm.js +5 -0
- package/dist/src/chunk-25mfpthk.js +78 -0
- package/dist/src/{chunk-rbpdk7m0.js → chunk-2b39zyxc.js} +3 -3
- package/dist/src/chunk-2gzd6wbd.js +4 -0
- package/dist/src/{chunk-xgan0qqp.js → chunk-3dntffy9.js} +1 -1
- package/dist/src/chunk-3gfczcsn.js +4 -0
- package/dist/src/{chunk-dgrbdpb7.js → chunk-3h5jz1vb.js} +6 -6
- package/dist/src/{chunk-t6c8akcm.js → chunk-41zcy6b3.js} +3 -3
- package/dist/src/chunk-47n9m2de.js +4 -0
- package/dist/src/chunk-4vxeq0vd.js +58 -0
- package/dist/src/chunk-59dx6qaf.js +4 -0
- package/dist/src/chunk-5sdf9y92.js +4 -0
- package/dist/src/{chunk-58wzr3mt.js → chunk-5wk1t46v.js} +3 -3
- package/dist/src/{chunk-vy3bwm1d.js → chunk-661c50hh.js} +5 -5
- package/dist/src/chunk-68n6bjjd.js +21 -0
- package/dist/src/{chunk-v6pya0dm.js → chunk-69pmjdf2.js} +3 -3
- package/dist/src/{chunk-e98dqnc9.js → chunk-6hrj3jt6.js} +20 -20
- package/dist/src/{chunk-wbh8spm5.js → chunk-6myr26wx.js} +8 -8
- package/dist/src/chunk-6n96k09n.js +4 -0
- package/dist/src/chunk-6vwrbkre.js +4 -0
- package/dist/src/chunk-6wk0yrab.js +4 -0
- package/dist/src/chunk-6yhm9een.js +4 -0
- package/dist/src/{chunk-mjrps0ac.js → chunk-7k7gjg2t.js} +5 -5
- package/dist/src/chunk-7n5fz68h.js +4 -0
- package/dist/src/chunk-8cvnpnbp.js +4 -0
- package/dist/src/chunk-8kzv7rk7.js +4 -0
- package/dist/src/chunk-8nj68t1v.js +167 -0
- package/dist/src/{chunk-g7tmjbkt.js → chunk-96r3bpg7.js} +3 -3
- package/dist/src/chunk-97x887te.js +4 -0
- package/dist/src/{chunk-8ph29g99.js → chunk-99a6tbvd.js} +1 -1
- package/dist/src/chunk-9p5d2994.js +5 -0
- package/dist/src/{chunk-aabchzxk.js → chunk-9q265er0.js} +4 -4
- package/dist/src/{chunk-jh6vhqzx.js → chunk-9xgnrv5w.js} +3 -3
- package/dist/src/chunk-9xgsmshb.js +5 -0
- package/dist/src/chunk-a02d1wgv.js +4 -0
- package/dist/src/{chunk-ndt1ccxm.js → chunk-a9ps00a1.js} +10 -10
- package/dist/src/{chunk-5d2hft6c.js → chunk-aewdveet.js} +3 -3
- package/dist/src/{chunk-ycaj2sgf.js → chunk-b3tdtq7r.js} +6 -6
- package/dist/src/chunk-bn7jx7a2.js +4 -0
- package/dist/src/{chunk-3y6eykz9.js → chunk-bnyw27ja.js} +2 -2
- package/dist/src/{chunk-rqc9ap3x.js → chunk-bpwsg76p.js} +2 -2
- package/dist/src/chunk-bvranw3g.js +4 -0
- package/dist/src/chunk-c25a84zb.js +4 -0
- package/dist/src/chunk-c27yv1dx.js +5 -0
- package/dist/src/chunk-c3ewxm4x.js +5 -0
- package/dist/src/{chunk-rvvy1bte.js → chunk-cb1ga9rd.js} +5 -5
- package/dist/src/chunk-cn7fwy7k.js +4 -0
- package/dist/src/chunk-cnvy4a64.js +4 -0
- package/dist/src/{chunk-7rz9898k.js → chunk-cqhw4yr6.js} +3 -3
- package/dist/src/{chunk-g04bwyj3.js → chunk-ctmfshjc.js} +2 -2
- package/dist/src/chunk-ctwmhz13.js +4 -0
- package/dist/src/{chunk-waqwcjyn.js → chunk-d3jx9bz5.js} +2 -2
- package/dist/src/{chunk-ayp07wbb.js → chunk-d6rb08ga.js} +1 -1
- package/dist/src/chunk-ddqhj4eg.js +5 -0
- package/dist/src/{chunk-r7bpkgff.js → chunk-ddrhs1c3.js} +2 -2
- package/dist/src/chunk-dnjnh9p6.js +4 -0
- package/dist/src/{chunk-wyrkw6hw.js → chunk-dw5rwgya.js} +3 -3
- package/dist/src/{chunk-3xkpk44w.js → chunk-e0870khr.js} +3 -3
- package/dist/src/chunk-ea3k10kj.js +4 -0
- package/dist/src/chunk-emv82m1w.js +7 -0
- package/dist/src/chunk-f3m6pdnx.js +4 -0
- package/dist/src/chunk-f84z32cb.js +4 -0
- package/dist/src/chunk-fpczgf0z.js +4 -0
- package/dist/src/{chunk-2tqzq5qh.js → chunk-g2js4c2v.js} +18 -18
- package/dist/src/chunk-g3af2qbk.js +5 -0
- package/dist/src/{chunk-3qwrzxh0.js → chunk-gadtna7s.js} +6 -6
- package/dist/src/{chunk-ybbtagbt.js → chunk-gcyx407v.js} +3 -3
- package/dist/src/{chunk-bfw6125s.js → chunk-gfpntwc1.js} +3 -3
- package/dist/src/chunk-gmnm5e3e.js +4 -0
- package/dist/src/chunk-gp6vb5gf.js +4 -0
- package/dist/src/chunk-gppgy7pa.js +4 -0
- package/dist/src/chunk-hegfz0ae.js +5 -0
- package/dist/src/chunk-hpzxdp1k.js +17 -0
- package/dist/src/{chunk-qcxzr2my.js → chunk-j69g8b50.js} +3 -3
- package/dist/src/chunk-jvstjnqm.js +19 -0
- package/dist/src/chunk-jzqrv78s.js +4 -0
- package/dist/src/chunk-k2948b8d.js +4 -0
- package/dist/src/chunk-k4ftd40d.js +4 -0
- package/dist/src/{chunk-bxmsax22.js → chunk-kd9vfaxh.js} +3 -3
- package/dist/src/{chunk-s3jc6cwp.js → chunk-kdczmgwk.js} +3 -3
- package/dist/src/{chunk-t6bfvfkg.js → chunk-ke3wn14v.js} +1 -1
- package/dist/src/chunk-kh5n7m6w.js +4 -0
- package/dist/src/{chunk-6wt9rgjf.js → chunk-khejfph4.js} +3 -3
- package/dist/src/chunk-kny2xemh.js +4 -0
- package/dist/src/chunk-knyzw9md.js +4 -0
- package/dist/src/chunk-mbzpt2hp.js +4 -0
- package/dist/src/chunk-mm8rcxad.js +4 -0
- package/dist/src/chunk-nc4516tx.js +4 -0
- package/dist/src/{chunk-6bznss4t.js → chunk-ntfrqrqn.js} +5 -5
- package/dist/src/chunk-nz5h2j52.js +4 -0
- package/dist/src/chunk-p22s97qy.js +4 -0
- package/dist/src/chunk-p9kt1sgr.js +6 -0
- package/dist/src/{chunk-yb97j25b.js → chunk-pf282r5g.js} +4 -4
- package/dist/src/chunk-pnd4mrxy.js +4 -0
- package/dist/src/chunk-pqqteyj6.js +4 -0
- package/dist/src/{chunk-6xmss8er.js → chunk-qj1tbnv2.js} +6 -6
- package/dist/src/chunk-qnh9egwr.js +4 -0
- package/dist/src/chunk-qy3khhf8.js +8 -0
- package/dist/src/{chunk-z637nqg8.js → chunk-r0vp315h.js} +6 -6
- package/dist/src/chunk-r4j43b9s.js +237 -0
- package/dist/src/{chunk-1p7xf5kb.js → chunk-r54cxxze.js} +3 -3
- package/dist/src/{chunk-yf7ympyz.js → chunk-r6pvhj33.js} +92 -92
- package/dist/src/chunk-rb7aa5gr.js +54 -0
- package/dist/src/chunk-rdj50kb4.js +4 -0
- package/dist/src/chunk-rnd4vcas.js +4 -0
- package/dist/src/{chunk-w5b2jwk3.js → chunk-s3y3zfcx.js} +8 -8
- package/dist/src/chunk-s4g43k75.js +5 -0
- package/dist/src/chunk-sfqe223f.js +311 -0
- package/dist/src/{chunk-284ptqa4.js → chunk-sqdrxjw5.js} +5 -5
- package/dist/src/{chunk-zgja5f3p.js → chunk-t54k47em.js} +4 -4
- package/dist/src/{chunk-3sy6ahhz.js → chunk-tek4pnvv.js} +10 -10
- package/dist/src/chunk-tn74y7af.js +4 -0
- package/dist/src/{chunk-thbh3jew.js → chunk-tvq0nzam.js} +3 -3
- package/dist/src/{chunk-0jrrsnc9.js → chunk-tx4f0h9c.js} +4 -4
- package/dist/src/chunk-vdqag3fj.js +5 -0
- package/dist/src/chunk-vz5zzs57.js +4 -0
- package/dist/src/chunk-w4s2vfpj.js +4 -0
- package/dist/src/{chunk-4hw3665t.js → chunk-w5yypt53.js} +11 -11
- package/dist/src/{chunk-8037tzzj.js → chunk-w68v64vh.js} +3 -3
- package/dist/src/chunk-whwj0pdk.js +5 -0
- package/dist/src/chunk-wnmqt1dc.js +4 -0
- package/dist/src/{chunk-cyy71ggq.js → chunk-wpe46vsa.js} +3 -3
- package/dist/src/{chunk-w3vs79ex.js → chunk-wxdjeb4k.js} +19 -19
- package/dist/src/chunk-xcqzwf9j.js +247 -0
- package/dist/src/chunk-xezekwwn.js +5 -0
- package/dist/src/chunk-xf19m15s.js +4 -0
- package/dist/src/chunk-xghbxha4.js +4 -0
- package/dist/src/{chunk-00167wan.js → chunk-xn9m3xc2.js} +5 -5
- package/dist/src/{chunk-26k317v5.js → chunk-yqfz4vts.js} +3 -3
- package/dist/src/chunk-z8tvs8nk.js +5 -0
- package/dist/src/chunk-zm2rehqb.js +5 -0
- package/dist/src/chunk-zs6dqm35.js +4 -0
- package/dist/src/daemon/processEntry.js +2 -2
- package/dist/src/index.js +4 -4
- package/dist/src/runtime/bunRuntimeGuard.js +2 -2
- package/dist/src/utils/workers/iosBundleExtractWorker.js +2 -2
- package/package.json +2 -2
- package/dist/src/chunk-0n6swkwg.js +0 -5
- package/dist/src/chunk-0qsy1qsx.js +0 -57
- package/dist/src/chunk-11m8wj8j.js +0 -237
- package/dist/src/chunk-23p5f095.js +0 -4
- package/dist/src/chunk-28re4xrg.js +0 -4
- package/dist/src/chunk-2f9rkmhx.js +0 -5
- package/dist/src/chunk-2fxdh48t.js +0 -4
- package/dist/src/chunk-2tbdrbt6.js +0 -4
- package/dist/src/chunk-32gvv9b4.js +0 -21
- package/dist/src/chunk-3f3t1x97.js +0 -8
- package/dist/src/chunk-3fspkbc7.js +0 -4
- package/dist/src/chunk-3vg455e6.js +0 -4
- package/dist/src/chunk-49bsqdx3.js +0 -4
- package/dist/src/chunk-5snsn9cf.js +0 -4
- package/dist/src/chunk-5tm9mn47.js +0 -54
- package/dist/src/chunk-5zc77a5t.js +0 -4
- package/dist/src/chunk-64j0majr.js +0 -19
- package/dist/src/chunk-65y8v4td.js +0 -17
- package/dist/src/chunk-6awz7vhq.js +0 -5
- package/dist/src/chunk-6ep7f5ge.js +0 -4
- package/dist/src/chunk-7cs2da62.js +0 -5
- package/dist/src/chunk-7g103b54.js +0 -4
- package/dist/src/chunk-7j5vj4pa.js +0 -4
- package/dist/src/chunk-7tw8x05v.js +0 -4
- package/dist/src/chunk-7zy586cb.js +0 -4
- package/dist/src/chunk-84nanf8s.js +0 -5
- package/dist/src/chunk-8gvwcv2p.js +0 -4
- package/dist/src/chunk-8thrmfat.js +0 -4
- package/dist/src/chunk-8zgzzs7k.js +0 -78
- package/dist/src/chunk-97b1zmaq.js +0 -4
- package/dist/src/chunk-9fth9ayh.js +0 -4
- package/dist/src/chunk-9j6anhjr.js +0 -4
- package/dist/src/chunk-bfjwqk8q.js +0 -4
- package/dist/src/chunk-bnhscm2n.js +0 -4
- package/dist/src/chunk-c1vs4g1n.js +0 -4
- package/dist/src/chunk-ct3e7yng.js +0 -4
- package/dist/src/chunk-ddzkz92z.js +0 -4
- package/dist/src/chunk-drdz8hee.js +0 -5
- package/dist/src/chunk-eersndy7.js +0 -5
- package/dist/src/chunk-eggq53ks.js +0 -4
- package/dist/src/chunk-f2dya7cs.js +0 -4
- package/dist/src/chunk-fbakd6cw.js +0 -4
- package/dist/src/chunk-fgb98zjj.js +0 -5
- package/dist/src/chunk-fmpad823.js +0 -5
- package/dist/src/chunk-g0xr8zw0.js +0 -4
- package/dist/src/chunk-g3rjs80x.js +0 -4
- package/dist/src/chunk-g78rtrfv.js +0 -4
- package/dist/src/chunk-gabgv3y5.js +0 -4
- package/dist/src/chunk-gmr45m8f.js +0 -4
- package/dist/src/chunk-gsyfebqj.js +0 -4
- package/dist/src/chunk-h5rpn9wr.js +0 -247
- package/dist/src/chunk-hb1x7v55.js +0 -4
- package/dist/src/chunk-hrfytkxh.js +0 -168
- package/dist/src/chunk-j4yjzbak.js +0 -4
- package/dist/src/chunk-jd6a5v6p.js +0 -5
- package/dist/src/chunk-kn5spq15.js +0 -4
- package/dist/src/chunk-m94qs0f0.js +0 -4
- package/dist/src/chunk-n03dmn5q.js +0 -5
- package/dist/src/chunk-n72qhwd9.js +0 -4
- package/dist/src/chunk-nr6y0n4y.js +0 -5
- package/dist/src/chunk-pcsen2vs.js +0 -4
- package/dist/src/chunk-ppfr0b8h.js +0 -4
- package/dist/src/chunk-q10bdnat.js +0 -4
- package/dist/src/chunk-q9xmq595.js +0 -4
- package/dist/src/chunk-qyqypn28.js +0 -5
- package/dist/src/chunk-r2epb56s.js +0 -4
- package/dist/src/chunk-r5bxavdx.js +0 -311
- package/dist/src/chunk-r8jf3d92.js +0 -4
- package/dist/src/chunk-rc0dbypm.js +0 -4
- package/dist/src/chunk-rhcty4ms.js +0 -4
- package/dist/src/chunk-rpvckv3p.js +0 -4
- package/dist/src/chunk-ry0mz41y.js +0 -4
- package/dist/src/chunk-sfv61xjb.js +0 -6
- package/dist/src/chunk-t7w8rctc.js +0 -4
- package/dist/src/chunk-v2wd4n3e.js +0 -5
- package/dist/src/chunk-w4zga19f.js +0 -4
- package/dist/src/chunk-w7hkv422.js +0 -5
- package/dist/src/chunk-xa73x2cx.js +0 -5
- package/dist/src/chunk-y2vs6jwg.js +0 -4
- package/dist/src/chunk-yattm52s.js +0 -4
- package/dist/src/chunk-yjawdzk8.js +0 -4
- package/dist/src/chunk-zs1sghs9.js +0 -4
|
@@ -1,168 +0,0 @@
|
|
|
1
|
-
// @bun
|
|
2
|
-
import{f,Y,I,RJ,Be,bU}from"./chunk-58wzr3mt.js";import{mn,Fr,i,Qt,Rr,Li,Se,Qe,wP,yK,$u,ec,di,fn,Q,No,gE,Zi,Dd,Ll,If,Bi,cr,te,l,at,e}from"./chunk-z637nqg8.js";import{Cn}from"./chunk-5d2hft6c.js";import{B,ot,Ts,Oc,tr,xb,Gn,Ir,Mc,m,RO,rE,Ya,Gg,Yg,bf,Sa,Ht,Jg,ks,Fi,K$,xl,nE,ki,iE,d2,Ja,Cl,PO,G$,_e,Vr}from"./chunk-yf7ympyz.js";import{Ns,_v,R,ti,FT,qW,da,cl,ire,M3,Br,ze,en,ko,Cw,tn,Dv,jW,la,yu,N3,og,are,Dr,sg,B3,Hw,rz,jT,nz,$3,Um,pB,Vw,mg,Ww,nn,H,oD,re,GT,Ba,J,fg,Xt,gz,ce,mp,Hv,v,yg,Rn,$a,hs,vg,j3,K3,G3,Y3,qv,Xw,jre,gp,Ua,Ve,Kr,ZT,QT,Kre,jm,id,od,eR,Km,L,ys,pD,Yre,Pz,Jre,Az,Sg,Go,vp,sd,Gt,De,eY,ene,tne,sne,ane,an,bi,Jm,so,le,st,ld,zn,o,P,N,ws,OD,ND,jn,_R,af,pb,ye,fj,En,Iu,$D,UD,mb,oi,Mk,cf,_u,HD,gb,Ng,l$,yb,vj,ga,si,lo,$g,Il,x,E}from"./chunk-r5bxavdx.js";import{wL,xe}from"./chunk-0qsy1qsx.js";import{y,T,ee,gr,j,g,Fe,Rd,Ct,ne,A,O9,oE,n,a,h,S,s,ts,Ne,p,_,Op}from"./chunk-4hw3665t.js";import{Id}from"./chunk-6wt9rgjf.js";import{r,t,u}from"./chunk-rbpdk7m0.js";import{Nt,ue,wt}from"./chunk-qcxzr2my.js";var pr={};ue(pr,{down:()=>Fu,up:()=>Lu});var fr={};ue(fr,{down:()=>qu,up:()=>Uu});var vr={};ue(vr,{down:()=>Vu,up:()=>Hu});var hr={};ue(hr,{down:()=>ju,up:()=>Wu});var yr={};ue(yr,{down:()=>zu,up:()=>Ju});var wr={};ue(wr,{down:()=>Qu,up:()=>Xu});var br={};ue(br,{down:()=>um,up:()=>lm});var Nr={};ue(Nr,{deleteLegacyBindingRows:()=>Yt,down:()=>Bm,legacyJournalPredicate:()=>St,up:()=>Tm});var Lr={};ue(Lr,{down:()=>Om,up:()=>km});var Ur={};ue(Ur,{down:()=>Nm,up:()=>Mm});var qr={};ue(qr,{down:()=>Fm,up:()=>Lm});var Hr={};ue(Hr,{down:()=>qm,up:()=>$m});var Wr={};ue(Wr,{down:()=>Vm,up:()=>Hm});var Gr={};ue(Gr,{down:()=>Gm,up:()=>Wm});var jr={};ue(jr,{down:()=>Xm,up:()=>zm});var Jr={};ue(Jr,{down:()=>Qm,up:()=>Ym});var zr={};ue(zr,{down:()=>ep,up:()=>Zm});var Xr={};ue(Xr,{down:()=>ip,up:()=>tp});var Ds="registry_schema_unsupported";class Zr extends t{dbPath;unknownMigrations;writerVersions;code=Ds;retryable=!1;remedy;constructor(d,c,w={}){super(`The binding registry at ${d} contains migrations unknown to this daemon: ${c.join(", ")}; nothing was changed.`);this.dbPath=d;this.unknownMigrations=c;this.writerVersions=w;this.name="BindingRegistrySchemaUnsupportedError";let b=[...new Set(Object.values(w))];this.remedy=b.length>0?`Upgrade the daemons sharing managed devices to a release that includes these migrations, recorded by writer version(s): ${b.join(", ")}.`:"Upgrade the daemons sharing managed devices to a release that includes these migrations."}toPayload(){return{code:this.code,retryable:this.retryable,dbPath:this.dbPath,unknownMigrations:this.unknownMigrations,writerVersions:this.writerVersions,remedy:this.remedy}}}async function Lu(d){await d.schema.createTable("binding_registry_migration_writers").addColumn("migration_name","text",(c)=>c.primaryKey()).addColumn("writer_version","text",(c)=>c.notNull()).addColumn("recorded_at","text",(c)=>c.notNull()).execute()}async function Fu(d){await d.schema.dropTable("binding_registry_migration_writers").ifExists().execute()}async function Uu(d){await d.schema.createIndex("session_broker_resources_request_id").ifNotExists().on("session_broker_resources").column("request_id").execute(),await d.schema.createIndex("session_broker_requests_resource_id").ifNotExists().on("session_broker_requests").column("resource_id").execute()}async function qu(d){await d.schema.dropIndex("session_broker_requests_resource_id").ifExists().execute(),await d.schema.dropIndex("session_broker_resources_request_id").ifExists().execute()}async function Hu(d){await d.schema.createTable("device_mutation_journal").addColumn("sequence","integer",(c)=>c.primaryKey().autoIncrement()).addColumn("session_uuid","text",(c)=>c.notNull()).addColumn("device_id","text",(c)=>c.notNull()).addColumn("incarnation","text",(c)=>c.notNull()).addColumn("kind","text",(c)=>c.notNull()).addColumn("mutation_key","text",(c)=>c.notNull()).addColumn("prior_value_json","text",(c)=>c.notNull()).addColumn("applied_at_ms","integer",(c)=>c.notNull()).addColumn("tool_name","text",(c)=>c.notNull()).addUniqueConstraint("device_mutation_original",["session_uuid","device_id","incarnation","kind","mutation_key"]).addCheckConstraint("device_mutation_scope_nonempty",m`
|
|
3
|
-
length(trim(session_uuid)) > 0 AND length(trim(device_id)) > 0
|
|
4
|
-
AND length(trim(incarnation)) > 0 AND length(trim(kind)) > 0
|
|
5
|
-
AND length(trim(mutation_key)) > 0 AND length(trim(tool_name)) > 0
|
|
6
|
-
`).execute(),await d.schema.createTable("device_mutation_baselines").addColumn("device_id","text",(c)=>c.notNull()).addColumn("incarnation","text",(c)=>c.notNull()).addColumn("baseline_json","text",(c)=>c.notNull()).addColumn("captured_at_ms","integer",(c)=>c.notNull()).addPrimaryKeyConstraint("device_mutation_baseline_identity",["device_id","incarnation"]).addCheckConstraint("device_mutation_baseline_nonempty",m`
|
|
7
|
-
length(trim(device_id)) > 0 AND length(trim(incarnation)) > 0
|
|
8
|
-
`).execute()}async function Vu(d){await d.schema.dropTable("device_mutation_baselines").ifExists().execute(),await d.schema.dropTable("device_mutation_journal").ifExists().execute()}async function Wu(d){await d.schema.alterTable("session_broker_requests").addColumn("timing_json","text").execute(),await d.schema.alterTable("session_broker_requests").addColumn("timing_profile_json","text").execute(),await d.schema.alterTable("session_broker_requests").addColumn("timing_updated_at_ms","integer").execute(),await d.schema.alterTable("session_broker_resources").addColumn("reuse_count","integer",(c)=>c.notNull().defaultTo(0)).execute(),await d.schema.createIndex("session_broker_timing_window_idx").on("session_broker_requests").column("timing_updated_at_ms").execute()}async function ju(d){await d.schema.dropIndex("session_broker_timing_window_idx").execute(),await d.schema.alterTable("session_broker_resources").dropColumn("reuse_count").execute(),await d.schema.alterTable("session_broker_requests").dropColumn("timing_updated_at_ms").execute(),await d.schema.alterTable("session_broker_requests").dropColumn("timing_profile_json").execute(),await d.schema.alterTable("session_broker_requests").dropColumn("timing_json").execute()}async function Ju(d){await d.schema.createTable("device_claims").addColumn("platform","text",(c)=>c.notNull()).addColumn("device_id","text",(c)=>c.notNull()).addColumn("kind","text",(c)=>c.notNull()).addColumn("daemon_session_id","text").addColumn("pid","integer",(c)=>c.notNull()).addColumn("owner_token","text",(c)=>c.notNull()).addColumn("process_generation_token","text").addColumn("session_uuid","text").addColumn("claimed_at_ms","integer",(c)=>c.notNull()).addColumn("updated_at_ms","integer",(c)=>c.notNull()).addPrimaryKeyConstraint("device_claims_device",["platform","device_id"]).addCheckConstraint("device_claims_platform",m`platform IN ('android', 'ios')`).addCheckConstraint("device_claims_kind",m`kind IN ('allocation', 'forward', 'slot')`).addCheckConstraint("device_claims_nonempty",m`length(trim(device_id)) > 0 AND length(trim(owner_token)) > 0 AND pid > 0`).execute()}async function zu(d){await d.schema.dropTable("device_claims").ifExists().execute()}async function Xu(d){await d.schema.alterTable("device_claims").addColumn("metadata","text").execute()}async function Qu(d){await d.schema.alterTable("device_claims").dropColumn("metadata").execute()}var Zu=m`platform IN ('android', 'ios', 'watchos')`,em=m`platform IN ('android', 'ios')`,Ps=m.raw(["scope_key","slot_index","role","platform","generation","stable_device_id","device_name","requested_spec_json","resolved_spec_json","spec_fingerprint","state","exec_owner_daemon_id","exec_owner_pid","exec_owner_process_token","exec_session_uuid","settler_daemon_id","settler_pid","settler_process_token","updated_at_ms"].join(", ")),Is=m.raw(["id","scope_key","slot_index","kind","phase","platform","from_generation","to_generation","binding_generation","binding_stable_device_id","target_json","owner_daemon_id","owner_pid","owner_process_token","attempts","last_error","next_attempt_at_ms","created_at_ms","updated_at_ms"].join(", ")),Cs=m.raw(["platform","device_id","kind","daemon_session_id","pid","owner_token","process_generation_token","session_uuid","claimed_at_ms","updated_at_ms","metadata"].join(", "));async function tm(d,c){await m`CREATE TABLE slot_assignments_next (
|
|
9
|
-
scope_key TEXT NOT NULL REFERENCES slot_scopes (scope_key),
|
|
10
|
-
slot_index INTEGER NOT NULL CHECK (slot_index >= 0),
|
|
11
|
-
role TEXT NOT NULL,
|
|
12
|
-
platform TEXT NOT NULL CHECK (${c}),
|
|
13
|
-
generation INTEGER NOT NULL CHECK (generation >= 0),
|
|
14
|
-
stable_device_id TEXT,
|
|
15
|
-
device_name TEXT,
|
|
16
|
-
requested_spec_json TEXT NOT NULL,
|
|
17
|
-
resolved_spec_json TEXT,
|
|
18
|
-
spec_fingerprint TEXT,
|
|
19
|
-
state TEXT NOT NULL
|
|
20
|
-
CHECK (state IN ('provisioning', 'ready', 'replacing', 'settling', 'cleanup_pending')),
|
|
21
|
-
exec_owner_daemon_id TEXT,
|
|
22
|
-
exec_owner_pid INTEGER,
|
|
23
|
-
exec_owner_process_token TEXT,
|
|
24
|
-
exec_session_uuid TEXT,
|
|
25
|
-
settler_daemon_id TEXT,
|
|
26
|
-
settler_pid INTEGER,
|
|
27
|
-
settler_process_token TEXT,
|
|
28
|
-
updated_at_ms INTEGER NOT NULL,
|
|
29
|
-
CONSTRAINT slot_assignments_pk PRIMARY KEY (scope_key, slot_index)
|
|
30
|
-
)`.execute(d),await m`INSERT INTO slot_assignments_next (${Ps})
|
|
31
|
-
SELECT ${Ps} FROM slot_assignments`.execute(d),await m`DROP TABLE slot_assignments`.execute(d),await m`ALTER TABLE slot_assignments_next RENAME TO slot_assignments`.execute(d),await m`CREATE UNIQUE INDEX slot_assignments_device
|
|
32
|
-
ON slot_assignments (platform, stable_device_id)
|
|
33
|
-
WHERE stable_device_id IS NOT NULL`.execute(d)}async function rm(d,c){let w=await m`SELECT seq FROM sqlite_sequence WHERE name = 'slot_journal'`.execute(d);await m`CREATE TABLE slot_journal_next (
|
|
34
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
35
|
-
scope_key TEXT NOT NULL REFERENCES slot_scopes (scope_key),
|
|
36
|
-
slot_index INTEGER NOT NULL CHECK (slot_index >= 0),
|
|
37
|
-
kind TEXT NOT NULL CHECK (kind IN ('create', 'replace', 'release')),
|
|
38
|
-
phase TEXT NOT NULL CHECK (
|
|
39
|
-
phase IN ('intent', 'deleting', 'deleted', 'creating', 'created', 'committed', 'rolled_back')
|
|
40
|
-
),
|
|
41
|
-
platform TEXT NOT NULL CHECK (${c}),
|
|
42
|
-
from_generation INTEGER NOT NULL,
|
|
43
|
-
to_generation INTEGER,
|
|
44
|
-
binding_generation INTEGER NOT NULL,
|
|
45
|
-
binding_stable_device_id TEXT,
|
|
46
|
-
target_json TEXT NOT NULL,
|
|
47
|
-
owner_daemon_id TEXT NOT NULL,
|
|
48
|
-
owner_pid INTEGER NOT NULL,
|
|
49
|
-
owner_process_token TEXT,
|
|
50
|
-
attempts INTEGER NOT NULL DEFAULT 0,
|
|
51
|
-
last_error TEXT,
|
|
52
|
-
next_attempt_at_ms INTEGER NOT NULL,
|
|
53
|
-
created_at_ms INTEGER NOT NULL,
|
|
54
|
-
updated_at_ms INTEGER NOT NULL
|
|
55
|
-
)`.execute(d),await m`INSERT INTO slot_journal_next (${Is})
|
|
56
|
-
SELECT ${Is} FROM slot_journal`.execute(d),await m`DROP TABLE slot_journal`.execute(d),await m`ALTER TABLE slot_journal_next RENAME TO slot_journal`.execute(d);let b=w.rows[0]?.seq;if(b!==void 0)await m`DELETE FROM sqlite_sequence WHERE name = 'slot_journal'`.execute(d),await m`INSERT INTO sqlite_sequence (name, seq)
|
|
57
|
-
VALUES ('slot_journal', MAX(${b}, COALESCE((SELECT MAX(id) FROM slot_journal), 0)))`.execute(d);await m`CREATE UNIQUE INDEX slot_journal_open_slot
|
|
58
|
-
ON slot_journal (scope_key, slot_index)
|
|
59
|
-
WHERE phase NOT IN ('committed', 'rolled_back')`.execute(d)}async function nm(d,c){await m`CREATE TABLE device_claims_next (
|
|
60
|
-
platform TEXT NOT NULL,
|
|
61
|
-
device_id TEXT NOT NULL,
|
|
62
|
-
kind TEXT NOT NULL,
|
|
63
|
-
daemon_session_id TEXT,
|
|
64
|
-
pid INTEGER NOT NULL,
|
|
65
|
-
owner_token TEXT NOT NULL,
|
|
66
|
-
process_generation_token TEXT,
|
|
67
|
-
session_uuid TEXT,
|
|
68
|
-
claimed_at_ms INTEGER NOT NULL,
|
|
69
|
-
updated_at_ms INTEGER NOT NULL,
|
|
70
|
-
metadata TEXT,
|
|
71
|
-
CONSTRAINT device_claims_device PRIMARY KEY (platform, device_id),
|
|
72
|
-
CONSTRAINT device_claims_platform CHECK (${c}),
|
|
73
|
-
CONSTRAINT device_claims_kind CHECK (kind IN ('allocation', 'forward', 'slot')),
|
|
74
|
-
CONSTRAINT device_claims_nonempty
|
|
75
|
-
CHECK (length(trim(device_id)) > 0 AND length(trim(owner_token)) > 0 AND pid > 0)
|
|
76
|
-
)`.execute(d),await m`INSERT INTO device_claims_next (${Cs})
|
|
77
|
-
SELECT ${Cs} FROM device_claims`.execute(d),await m`DROP TABLE device_claims`.execute(d),await m`ALTER TABLE device_claims_next RENAME TO device_claims`.execute(d)}async function As(d,c){await tm(d,c),await rm(d,c),await nm(d,c)}async function lm(d){await As(d,Zu)}async function um(d){if((await m`SELECT
|
|
78
|
-
EXISTS(SELECT 1 FROM slot_assignments WHERE platform = 'watchos')
|
|
79
|
-
OR EXISTS(SELECT 1 FROM slot_journal WHERE platform = 'watchos')
|
|
80
|
-
OR EXISTS(SELECT 1 FROM device_claims WHERE platform = 'watchos') AS present`.execute(d)).rows[0]?.present)throw new t("The binding registry holds Apple Watch rows; release those bindings and claims before downgrading.");await As(d,em)}var Sr="device_assigned_to_binding";class mi extends t{deviceId;code=Sr;retryable=!1;platform;stableId;scopeKey;declaredBinding;constructor(d,c,w){super(`${d} refused: device '${c}' (${w.platform} ${w.stableDeviceId}) is `+(w.holder==="session_broker"?`assigned to binding ${w.bindingIndex}`:"reserved for bindings")+` (code ${Sr}). It stays reserved while idle; use another device, or reset the binding's scope to release it.`);this.deviceId=c;this.name="DeviceAssignedToBindingError",this.platform=w.platform,this.stableId=w.stableDeviceId,this.scopeKey=w.scopeKey,this.declaredBinding=w.bindingIndex}toPayload(){return{code:this.code,deviceId:this.deviceId,platform:this.platform,stableId:this.stableId,scopeKey:this.scopeKey,declaredBinding:this.declaredBinding,retryable:!1}}}var Es=1000,mm=5000;class yA extends t{sessionUuid;code="binding_ownership_unconfirmed";retryable=!0;retryAfterMs;constructor(d,c=0){super(`Session '${d}' binding ownership is not recorded for this daemon yet (the binding registry is busy or the binding is not ready); retry shortly.`);this.sessionUuid=d;this.name="BindingOwnershipUnconfirmedError",this.retryAfterMs=Math.min(mm,Es*(1+Math.floor(Math.max(0,c)/1000)))}toPayload(){return{code:this.code,sessionUuid:this.sessionUuid,retryable:this.retryable,retryAfterMs:this.retryAfterMs}}}var $I="daemon-restart",jN="cleanup-expired",We={idle:!1,expiry:!1,terminal:!1,recoverable:!1,reissuableByName:!1,releasedBeforeHandout:!1},Pr={...We,releasedBeforeHandout:!0},Ce={...We,terminal:!0},ht={...Ce,expiry:!0},_r={...ht,idle:!0},pm={...We,idle:!0},Cr={...We,recoverable:!0,reissuableByName:!0},fm={...We,reissuableByName:!0},yt={"explicit-release":Ce,"lazy-expiry":_r,"cleanup-expired":_r,"cli-idle-timeout":_r,"missing-first-heartbeat":ht,"heartbeat-timeout":ht,"rehydration-owner-timeout":ht,"restart-recovery-timeout":ht,"owner-disconnected":Ce,"binding-ownership-lost":Ce,"managed-slot-ownership-lost":Ce,"device-killed":Ce,"session-creation-cancelled":Ce,"session-creation-timeout":Pr,"allocation-rollback":Pr,"plan-auto-release":fm,superseded:We,"daemon-shutdown":Cr,"daemon-restart":Cr,expired:pm},bt={"identity-recovery-":Ce,"device-disconnected:":Ce,"device-disconnected-during-session-create:":Pr,"device-restart:":Cr},gm=We;function vm(d){return Object.hasOwn(yt,d)}function vA(d){return Object.keys(bt).find((c)=>d.startsWith(c)&&d.length>c.length)}function d4(d){return d==="plan-auto-release"||vA(d)==="device-restart:"}function im(d){if(vm(d))return yt[d];let c=vA(d);return c===void 0?gm:bt[c]}function rr(d){return im(d).terminal}function UI(d){return im(d).expiry}function HI(d){return im(d).idle||Object.hasOwn(xs,d)&&xs[d].idle}function fi(d){return d&&HI(d)?{idle:!0}:{}}function Ql(d,c){return d==="cli-idle-timeout"&&c!==void 0&&Number.isSafeInteger(c)&&c>0?{idleTimeoutMs:c}:{}}function Ys(d){return im(d).recoverable}var KN="session-not-found",l4="replay-lease-expired",xs={[l4]:{idle:!0},[KN]:{idle:!1},"liveness-owner-conflict":{idle:!1},released:{idle:!1}};function f7(d){return Ys(d)&&!d.startsWith("device-restart:")}function u4(d,c){let w=im(d);if(!w.terminal)return!1;let b=im(c);return!b.terminal||b.idle&&!w.idle}function h7(d,c){if(c==="device-killed")return c;if(d==="device-killed")return d;if(c==="daemon-shutdown"&&!rr(d))return c;return u4(c,d)?c:d}function mq(d){return im(d).reissuableByName}function GN(d){let c=im(d);if(!c.terminal)return 0;return c.idle?1:2}function Hy(d){return UI(d)?"expired":"released"}function fq(d){return Object.keys(yt).filter((c)=>yt[c][d])}function hq(d){return Object.keys(bt).filter((c)=>bt[c][d])}function g7(d){return Object.keys(yt).filter((c)=>GN(c)>d)}function y7(d){return Object.keys(bt).filter((c)=>GN(`${c}x`)>d)}var $o="session_ownership_lost";class ac extends t{sessionUuid;releaseReason;code=$o;retryable=!1;nextAction=ti;details;constructor(d,c,w){super(`Session ${d} is terminal after ${c} and cannot be reused; it was released while this call was in flight, so the call was cancelled. Acquire a new device with getAndroid or getApple.`);this.sessionUuid=d;this.releaseReason=c;this.name="SessionReleasedDuringCallError",this.details={sessionUuid:d,reason:c,...fi(c),...Ql(c,w)}}}function om(d){return d instanceof ac?d:void 0}class gq extends ac{constructor(d){super(d,"binding-ownership-lost");this.message=`Session ${d} is terminal after binding-ownership-lost and cannot be reused. Acquire a new device with getAndroid or getApple.`,this.name="BindingOwnershipLostError"}}var Ar="discovery_incomplete",Bs=2000;class is extends t{code=Ar;retryable=!0;retryAfterMs=Bs;constructor(d){super(`The binding registry is unreadable (${d}), so assigned devices cannot be told apart from free ones (code ${Ar}); retry shortly.`);this.name="BindingDiscoveryIncompleteError"}toPayload(){return{code:this.code,retryable:!0,retryAfterMs:this.retryAfterMs}}}import{readFile as hm}from"fs/promises";var Kb=f.SESSION_BROKER_CONFIG.name,v7="session-broker-export/v1",b7="session-broker/v1",qy={managedHostScope:"auto-mobile-host",runnerNamespace:"session-broker",runnerIncarnation:"private-pool-v1"},Er=Rd("family",[g({family:ne("iphone"),variant:A(["standard","pro","pro-max","air"])}).strict(),g({family:ne("ipad"),variant:A(["standard","mini","air","pro"]),sizeInches:y().regex(/^\d+(?:\.\d+)?$/).optional()}).strict(),g({family:ne("duo"),variant:ne("duo")}).strict()]),ym=g({namespace:A(["product-model","simulator-device-type","alias"]),value:y().min(1)}).strict(),xr=A(["phone","tablet","duo"]),Tr=A(["phone","tablet","foldable"]),kr=y().regex(/^\d+(?:\.\d+)*$/),wm=Rd("kind",[g({kind:ne("exact"),version:kr}).strict(),g({kind:ne("major"),major:T().int().positive().max(Number.MAX_SAFE_INTEGER)}).strict(),g({kind:ne("minimum"),version:kr}).strict()]),Or=g({selector:wm,preferredVersion:kr}).strict(),bm=Or.extend({archetypes:j(Or.extend({archetype:xr}).strict()).refine((d)=>new Set(d.map((c)=>c.archetype)).size===d.length,{message:"defaults.ios.os.archetypes must list each archetype at most once"}).optional()}).strict(),Sm=g({platform:ne("ios"),policyVersion:y().min(1),hardware:g({omitted:xr,archetypes:j(g({archetype:xr,modelType:Er}).strict()),modelTypes:j(g({modelType:Er,model:ym}).strict())}).strict(),os:bm}).strict(),_m=g({platform:ne("android"),policyVersion:y().min(1),hardware:g({omitted:Tr,profiles:j(g({archetype:Tr,profileId:y().min(1),memoryMb:T().int().min(cl,`memoryMb must be at least ${cl} MB`).optional()}).strict())}).strict(),os:Or}).strict(),Ge=T().int().nonnegative().max(Number.MAX_SAFE_INTEGER),Rm=O9((d)=>{if(typeof d==="object"&&d!==null&&"iosDuo"in d){e.warn("capabilities.iosDuo is deprecated and ignored; Duo support follows installed hardware.");let c={...d};return delete c.iosDuo,c}return d},g({}).strict()),Dm=10,Pm=5,Im=Rd("mode",[g({mode:ne("off")}).strict(),g({mode:ne("erase"),maxUses:Ge.positive().default(20),fallback:ne("erase").default("erase")}).strict(),g({mode:ne("keep-booted"),maxUses:Ge.positive().default(Dm),fallback:A(["erase","destroy"]).default("erase")}).strict(),g({mode:ne("minimal"),maxUses:Ge.positive().default(Pm)}).strict()]),Cm=g({contractVersion:ne(1),limits:g({totalDeviceCap:Ge.optional(),sessionCap:Ge.optional(),idlePoolCap:Ge.optional(),maxConcurrentResetBoots:Ge.positive().optional()}).strict(),defaults:g({ios:Sm.optional(),android:_m.optional()}).strict(),androidProfileArchetypes:Ct(y(),Tr).default({}),iosClassifications:j(g({simulatorDeviceTypeIdentifier:y().min(1),modelType:Er,aliases:j(y().min(1)).optional()}).strict()).default([]),reuseCleanDevices:ee().default(!1),reuseAndroidCleanDevices:ee().default(!1),androidResetMode:A(["snapshot","keep-booted"]).optional(),androidResetTimeoutMs:T().int().positive().max(Fr).optional(),androidKeepBootedMaxUses:T().int().positive().max(Number.MAX_SAFE_INTEGER).optional(),androidKeepBootedFallback:A(["snapshot","destroy"]).optional(),androidIdleTtlMs:T().int("androidIdleTtlMs must be a whole number of milliseconds").positive("androidIdleTtlMs must be a positive number of milliseconds").max(Number.MAX_SAFE_INTEGER).optional(),reuse:g({ios:Im}).strict().optional(),capabilities:Rm.default({})}).strict().refine((d)=>d.defaults.ios!==void 0||d.defaults.android!==void 0,{message:"At least one platform must have an explicit default policy"}).refine((d)=>d.androidResetMode===void 0||d.reuseAndroidCleanDevices&&d.defaults.android!==void 0,{message:"Android reset mode requires Android defaults and reuseAndroidCleanDevices"}).refine((d)=>d.androidKeepBootedMaxUses===void 0&&d.androidKeepBootedFallback===void 0||d.androidResetMode==="keep-booted",{message:"Android keep-booted keys require keep-booted mode"}).refine((d)=>d.androidIdleTtlMs===void 0||d.androidResetMode!==void 0,{path:["androidIdleTtlMs"],message:"androidIdleTtlMs requires androidResetMode; without a reset mode no Android device is pooled"}).refine((d)=>d.androidResetTimeoutMs===void 0||d.androidResetMode==="snapshot"||d.androidResetMode==="keep-booted"&&d.androidKeepBootedFallback==="snapshot",{path:["androidResetTimeoutMs"],message:"androidResetTimeoutMs requires snapshot mode or keep-booted snapshot fallback"}).refine((d)=>!d.reuseCleanDevices||!d.reuse||d.reuse.ios.mode==="erase",{message:"reuseCleanDevices: true selects iOS erase; remove it to select minimal, keep-booted or off"}).refine((d)=>d.defaults.ios!==void 0||!d.reuse||d.reuse.ios.mode==="off",{message:"iOS reuse requires an explicit defaults.ios policy"});function YN(d){if(!d.defaults.ios)return{mode:"off"};return d.reuse?.ios??(d.reuseCleanDevices?{mode:"erase",maxUses:20,fallback:"erase"}:{mode:"off"})}function Am(d){let c=Cm.safeParse(d);if(!c.success)throw new t(`Invalid session broker host configuration: ${c.error.message}`);return c.data}async function S7(d){try{return Am(JSON.parse(await hm(d,"utf8")))}catch(c){throw u(c,`Cannot load session broker host configuration at ${d}`)}}function w7(d){if(d===void 0)return!1;return d.androidResetMode===void 0||d.androidResetMode==="keep-booted"&&d.androidKeepBootedFallback!=="snapshot"}var Os="managed-slots",R7="ambroker-",P7="amslot-";function cc(d){return typeof d==="string"&&(d.startsWith("ambroker-")||d.startsWith("amslot-"))}var eh="session-broker-device";import{createHash as Em}from"crypto";var xm=new Set(["replacing","settling","cleanup_pending"]);function Ms(d,c){return d!==c&&xm.has(c)}var rt=["committed","rolled_back"];function bA(d){return!rt.includes(d)}var Ls=604800000;function zd(d){return Em("sha256").update(JSON.stringify([d.managedHostScope,d.runnerNamespace,d.runnerIncarnation])).digest("hex")}function Ae(d){if(!Number.isInteger(d.bindingIndex)||d.bindingIndex<0)throw new t(`Binding index must be a non-negative integer, got ${d.bindingIndex}`);if(d.scopeKey.length===0)throw new t("Binding scope key must not be empty")}function Mr(d,c){if(d!=="settling")return null;if(!c?.settler)throw new t("Marking a binding settling requires the settling daemon");return c.settler}function yq(d,c){return d.generation===c.generation&&d.stableDeviceId===c.stableDeviceId}function Uc(d,c){return d.daemonId===c.daemonId&&d.pid===c.pid&&(d.processGenerationToken??null)===(c.processGenerationToken??null)}function jd(d,c){return d.generation===c.generation&&d.stableDeviceId===c.stableDeviceId}function qI(d){return d.target.newStableId??d.target.newName}function Fs(d,c){let w=new Set(c.map((b)=>JSON.stringify([b.platform,b.stableDeviceId])));return d.flatMap((b)=>{let D=qI(b),C=Js(b);if(D===null||w.has(JSON.stringify([C,D])))return[];return w.add(JSON.stringify([C,D])),[{platform:C,stableDeviceId:D,holder:"session_broker",scopeKey:b.scopeKey,bindingIndex:b.bindingIndex,scopeState:null,execSessionUuid:null}]})}function $s(d,c){return d?.state==="valid"||c&&d?.state==="invalidating"}function Us(d,c,w){return d?.state==="invalidating"&&c?.execOwner?.sessionUuid===w}function qs(d,c){let w=c.platform??d.platform;if(w!==d.platform&&c.stableDeviceId!==null)throw new t(`A binding moves from ${d.platform} to ${w} only with an empty binding`);return w}function Js(d){return d.target.newPlatform??d.platform}var St=m`NOT EXISTS (
|
|
81
|
-
SELECT 1 FROM slot_assignments a WHERE a.scope_key = slot_journal.scope_key
|
|
82
|
-
AND a.slot_index = slot_journal.slot_index AND a.role = ${eh})`;async function Tm(d){if((await m`SELECT
|
|
83
|
-
EXISTS(SELECT 1 FROM slot_assignments WHERE role <> ${eh}
|
|
84
|
-
AND (stable_device_id IS NOT NULL OR device_name IS NOT NULL))
|
|
85
|
-
OR EXISTS(SELECT 1 FROM slot_journal WHERE ${St}
|
|
86
|
-
AND phase NOT IN ('committed', 'rolled_back'))
|
|
87
|
-
OR EXISTS(SELECT 1 FROM slot_free_devices) AS unsafe`.execute(d)).rows[0].unsafe)throw new t("Legacy slot devices must be retired first. Restart the daemon to confirm their shutdown before upgrading the binding registry.");await Yt(d),await d.schema.dropTable("slot_free_devices").execute()}async function Yt(d,c={hasJournal:!0,hasBrokerResources:!0}){if(c.hasJournal)await m`DELETE FROM slot_journal WHERE ${St}`.execute(d);await m`DELETE FROM slot_assignments WHERE role <> ${eh}`.execute(d);let w=c.hasJournal?m`AND NOT EXISTS (SELECT 1 FROM slot_journal j WHERE j.scope_key = slot_scopes.scope_key)`:m``,b=c.hasBrokerResources?m`AND NOT EXISTS (SELECT 1 FROM session_broker_resources r WHERE r.scope_key = slot_scopes.scope_key)`:m``;await m`DELETE FROM slot_scopes WHERE scope_key <> ${zd(qy)}
|
|
88
|
-
AND NOT EXISTS (SELECT 1 FROM slot_assignments a WHERE a.scope_key = slot_scopes.scope_key)
|
|
89
|
-
${w} ${b}`.execute(d)}async function Bm(){throw new t("Legacy slot retirement is irreversible; restore a pre-upgrade backup instead.")}async function km(d){await d.schema.createTable("slot_scopes").ifNotExists().addColumn("scope_key","text",(c)=>c.primaryKey()).addColumn("managed_host_scope","text",(c)=>c.notNull()).addColumn("runner_namespace","text",(c)=>c.notNull()).addColumn("runner_incarnation","text",(c)=>c.notNull()).addColumn("state","text",(c)=>c.notNull().check(m`state IN ('valid', 'invalidating', 'invalidated')`)).addColumn("invalidation_reason","text",(c)=>c.check(m`invalidation_reason IS NULL OR invalidation_reason IN ('incarnation_reset', 'operator_reset', 'abandoned')`)).addColumn("created_at_ms","integer",(c)=>c.notNull()).addColumn("last_acquired_at_ms","integer",(c)=>c.notNull()).addColumn("invalidating_at_ms","integer").addColumn("invalidated_at_ms","integer").execute(),await m`CREATE UNIQUE INDEX IF NOT EXISTS slot_scopes_live_namespace
|
|
90
|
-
ON slot_scopes (managed_host_scope, runner_namespace)
|
|
91
|
-
WHERE state <> 'invalidated'`.execute(d),await d.schema.createTable("slot_assignments").ifNotExists().addColumn("scope_key","text",(c)=>c.notNull().references("slot_scopes.scope_key")).addColumn("slot_index","integer",(c)=>c.notNull().check(m`slot_index >= 0`)).addColumn("role","text",(c)=>c.notNull()).addColumn("platform","text",(c)=>c.notNull().check(m`platform IN ('android', 'ios')`)).addColumn("generation","integer",(c)=>c.notNull().check(m`generation >= 0`)).addColumn("stable_device_id","text").addColumn("device_name","text").addColumn("requested_spec_json","text",(c)=>c.notNull()).addColumn("resolved_spec_json","text").addColumn("spec_fingerprint","text").addColumn("state","text",(c)=>c.notNull().check(m`state IN ('provisioning', 'ready', 'replacing', 'cleanup_pending')`)).addColumn("exec_owner_daemon_id","text").addColumn("exec_owner_pid","integer").addColumn("exec_session_uuid","text").addColumn("updated_at_ms","integer",(c)=>c.notNull()).addPrimaryKeyConstraint("slot_assignments_pk",["scope_key","slot_index"]).execute(),await m`CREATE UNIQUE INDEX IF NOT EXISTS slot_assignments_device
|
|
92
|
-
ON slot_assignments (platform, stable_device_id)
|
|
93
|
-
WHERE stable_device_id IS NOT NULL`.execute(d),await d.schema.createTable("slot_free_devices").ifNotExists().addColumn("platform","text",(c)=>c.notNull().check(m`platform IN ('android', 'ios')`)).addColumn("stable_device_id","text",(c)=>c.notNull()).addColumn("spec_fingerprint","text").addColumn("from_scope_key","text",(c)=>c.notNull()).addColumn("freed_at_ms","integer",(c)=>c.notNull()).addPrimaryKeyConstraint("slot_free_devices_pk",["platform","stable_device_id"]).execute()}async function Om(d){await d.schema.dropTable("slot_free_devices").ifExists().execute(),await d.schema.dropTable("slot_assignments").ifExists().execute(),await d.schema.dropTable("slot_scopes").ifExists().execute()}var $r=m.raw(["scope_key","slot_index","role","platform","generation","stable_device_id","device_name","requested_spec_json","resolved_spec_json","spec_fingerprint","state","exec_owner_daemon_id","exec_owner_pid","exec_session_uuid","updated_at_ms"].join(", "));async function Mm(d){await m`ALTER TABLE slot_scopes ADD COLUMN last_released_at_ms INTEGER`.execute(d),await m`CREATE TABLE slot_assignments_v2 (
|
|
94
|
-
scope_key TEXT NOT NULL REFERENCES slot_scopes (scope_key),
|
|
95
|
-
slot_index INTEGER NOT NULL CHECK (slot_index >= 0),
|
|
96
|
-
role TEXT NOT NULL,
|
|
97
|
-
platform TEXT NOT NULL CHECK (platform IN ('android', 'ios')),
|
|
98
|
-
generation INTEGER NOT NULL CHECK (generation >= 0),
|
|
99
|
-
stable_device_id TEXT,
|
|
100
|
-
device_name TEXT,
|
|
101
|
-
requested_spec_json TEXT NOT NULL,
|
|
102
|
-
resolved_spec_json TEXT,
|
|
103
|
-
spec_fingerprint TEXT,
|
|
104
|
-
state TEXT NOT NULL
|
|
105
|
-
CHECK (state IN ('provisioning', 'ready', 'replacing', 'settling', 'cleanup_pending')),
|
|
106
|
-
exec_owner_daemon_id TEXT,
|
|
107
|
-
exec_owner_pid INTEGER,
|
|
108
|
-
exec_owner_process_token TEXT,
|
|
109
|
-
exec_session_uuid TEXT,
|
|
110
|
-
settler_daemon_id TEXT,
|
|
111
|
-
settler_pid INTEGER,
|
|
112
|
-
settler_process_token TEXT,
|
|
113
|
-
updated_at_ms INTEGER NOT NULL,
|
|
114
|
-
CONSTRAINT slot_assignments_pk PRIMARY KEY (scope_key, slot_index)
|
|
115
|
-
)`.execute(d),await m`INSERT INTO slot_assignments_v2 (${$r})
|
|
116
|
-
SELECT ${$r} FROM slot_assignments`.execute(d),await m`DROP TABLE slot_assignments`.execute(d),await m`ALTER TABLE slot_assignments_v2 RENAME TO slot_assignments`.execute(d),await m`CREATE UNIQUE INDEX IF NOT EXISTS slot_assignments_device
|
|
117
|
-
ON slot_assignments (platform, stable_device_id)
|
|
118
|
-
WHERE stable_device_id IS NOT NULL`.execute(d)}async function Nm(d){await m`ALTER TABLE slot_scopes DROP COLUMN last_released_at_ms`.execute(d),await m`CREATE TABLE slot_assignments_v1 (
|
|
119
|
-
scope_key TEXT NOT NULL REFERENCES slot_scopes (scope_key),
|
|
120
|
-
slot_index INTEGER NOT NULL CHECK (slot_index >= 0),
|
|
121
|
-
role TEXT NOT NULL,
|
|
122
|
-
platform TEXT NOT NULL CHECK (platform IN ('android', 'ios')),
|
|
123
|
-
generation INTEGER NOT NULL CHECK (generation >= 0),
|
|
124
|
-
stable_device_id TEXT,
|
|
125
|
-
device_name TEXT,
|
|
126
|
-
requested_spec_json TEXT NOT NULL,
|
|
127
|
-
resolved_spec_json TEXT,
|
|
128
|
-
spec_fingerprint TEXT,
|
|
129
|
-
state TEXT NOT NULL CHECK (state IN ('provisioning', 'ready', 'replacing', 'cleanup_pending')),
|
|
130
|
-
exec_owner_daemon_id TEXT,
|
|
131
|
-
exec_owner_pid INTEGER,
|
|
132
|
-
exec_session_uuid TEXT,
|
|
133
|
-
updated_at_ms INTEGER NOT NULL,
|
|
134
|
-
CONSTRAINT slot_assignments_pk PRIMARY KEY (scope_key, slot_index)
|
|
135
|
-
)`.execute(d),await m`INSERT INTO slot_assignments_v1 (${$r})
|
|
136
|
-
SELECT scope_key, slot_index, role, platform, generation, stable_device_id, device_name,
|
|
137
|
-
requested_spec_json, resolved_spec_json, spec_fingerprint,
|
|
138
|
-
CASE state WHEN 'settling' THEN 'ready' ELSE state END,
|
|
139
|
-
exec_owner_daemon_id, exec_owner_pid, exec_session_uuid, updated_at_ms
|
|
140
|
-
FROM slot_assignments`.execute(d),await m`DROP TABLE slot_assignments`.execute(d),await m`ALTER TABLE slot_assignments_v1 RENAME TO slot_assignments`.execute(d),await m`CREATE UNIQUE INDEX IF NOT EXISTS slot_assignments_device
|
|
141
|
-
ON slot_assignments (platform, stable_device_id)
|
|
142
|
-
WHERE stable_device_id IS NOT NULL`.execute(d)}async function Lm(d){await d.schema.createTable("slot_journal").ifNotExists().addColumn("id","integer",(c)=>c.primaryKey().autoIncrement()).addColumn("scope_key","text",(c)=>c.notNull().references("slot_scopes.scope_key")).addColumn("slot_index","integer",(c)=>c.notNull().check(m`slot_index >= 0`)).addColumn("kind","text",(c)=>c.notNull().check(m`kind IN ('create', 'replace', 'release')`)).addColumn("phase","text",(c)=>c.notNull().check(m`phase IN ('intent', 'deleting', 'deleted', 'creating', 'created', 'committed', 'rolled_back')`)).addColumn("platform","text",(c)=>c.notNull().check(m`platform IN ('android', 'ios')`)).addColumn("from_generation","integer",(c)=>c.notNull()).addColumn("to_generation","integer").addColumn("binding_generation","integer",(c)=>c.notNull()).addColumn("binding_stable_device_id","text").addColumn("target_json","text",(c)=>c.notNull()).addColumn("owner_daemon_id","text",(c)=>c.notNull()).addColumn("owner_pid","integer",(c)=>c.notNull()).addColumn("owner_process_token","text").addColumn("attempts","integer",(c)=>c.notNull().defaultTo(0)).addColumn("last_error","text").addColumn("next_attempt_at_ms","integer",(c)=>c.notNull()).addColumn("created_at_ms","integer",(c)=>c.notNull()).addColumn("updated_at_ms","integer",(c)=>c.notNull()).execute(),await m`CREATE UNIQUE INDEX IF NOT EXISTS slot_journal_open_slot
|
|
143
|
-
ON slot_journal (scope_key, slot_index)
|
|
144
|
-
WHERE phase NOT IN ('committed', 'rolled_back')`.execute(d)}async function Fm(d){await m`DROP INDEX IF EXISTS slot_journal_open_slot`.execute(d),await d.schema.dropTable("slot_journal").ifExists().execute()}var Hs={deletion_owner_daemon_id:"text",deletion_owner_pid:"integer",deletion_owner_process_token:"text",deletion_started_at_ms:"integer",deletion_attempts:"integer",deletion_last_error:"text",deletion_next_attempt_at_ms:"integer"};async function $m(d){for(let[c,w]of Object.entries(Hs))await m`ALTER TABLE slot_free_devices ADD COLUMN ${m.id(c)} ${m.raw(w)}`.execute(d)}async function qm(d){for(let c of Object.keys(Hs).reverse())await m`ALTER TABLE slot_free_devices DROP COLUMN ${m.id(c)}`.execute(d)}async function Hm(d){await m`ALTER TABLE slot_free_devices ADD COLUMN deletion_failed_deletes integer`.execute(d)}async function Vm(d){await m`ALTER TABLE slot_free_devices DROP COLUMN deletion_failed_deletes`.execute(d)}async function Wm(d){await m`ALTER TABLE slot_free_devices
|
|
145
|
-
ADD COLUMN state TEXT NOT NULL DEFAULT 'free'
|
|
146
|
-
CHECK (state IN ('free', 'stopping', 'stopped'))`.execute(d),await m`ALTER TABLE slot_free_devices ADD COLUMN stop_claimed_by TEXT`.execute(d),await m`ALTER TABLE slot_free_devices ADD COLUMN stop_claimed_at_ms INTEGER`.execute(d)}async function Gm(d){await m`ALTER TABLE slot_free_devices DROP COLUMN stop_claimed_at_ms`.execute(d),await m`ALTER TABLE slot_free_devices DROP COLUMN stop_claimed_by`.execute(d),await m`ALTER TABLE slot_free_devices DROP COLUMN state`.execute(d)}async function zm(d){await d.schema.alterTable("session_broker_requests").addColumn("retryable","integer",(c)=>c.check(m`retryable IN (0, 1)`)).execute()}async function Xm(d){await d.schema.alterTable("session_broker_requests").dropColumn("retryable").execute()}async function Ym(d){await d.schema.createTable("session_broker_requests").addColumn("request_id","text",(c)=>c.primaryKey()).addColumn("fingerprint","text",(c)=>c.notNull()).addColumn("parameters_json","text",(c)=>c.notNull()).addColumn("owner_json","text",(c)=>c.notNull()).addColumn("state","text",(c)=>c.notNull().check(m`state IN ('acquiring', 'active', 'releasing', 'released', 'failed')`)).addColumn("resource_id","text").addColumn("session_id","text",(c)=>c.unique()).addColumn("error","text").addColumn("error_code","text").execute(),await d.schema.createTable("session_broker_resources").addColumn("allocation_index","integer",(c)=>c.primaryKey().autoIncrement()).addColumn("resource_id","text",(c)=>c.notNull().unique()).addColumn("scope_key","text",(c)=>c.notNull()).addColumn("profile_json","text",(c)=>c.notNull()).addColumn("state","text",(c)=>c.notNull().check(m`state IN ('reserved', 'active', 'idle', 'resetting', 'destroying', 'unknown', 'destroyed')`)).addColumn("request_id","text",(c)=>c.references("session_broker_requests.request_id")).addColumn("revision","integer",(c)=>c.notNull().check(m`revision > 0`)).addColumn("idle_order","integer",(c)=>c.notNull()).execute()}async function Qm(d){await d.schema.dropTable("session_broker_resources").execute(),await d.schema.dropTable("session_broker_requests").execute()}async function Zm(d){await d.schema.createTable("session_broker_exports").addColumn("prepare_id","text",(c)=>c.primaryKey()).addColumn("request_id","text",(c)=>c.notNull().unique().references("session_broker_requests.request_id")).addColumn("request_digest","text",(c)=>c.notNull()).addColumn("created_at_ms","integer",(c)=>c.notNull()).addColumn("acknowledged_at_ms","integer").execute()}async function ep(d){await d.schema.dropTable("session_broker_exports").execute()}async function tp(d){await d.schema.alterTable("session_broker_requests").addColumn("terminal_at_ms","integer").execute(),await d.schema.createIndex("session_broker_requests_state_idx").on("session_broker_requests").column("state").execute()}async function ip(d){await d.schema.dropIndex("session_broker_requests_state_idx").execute(),await d.schema.alterTable("session_broker_requests").dropColumn("terminal_at_ms").execute()}var rp="2026_10_21_013_session_broker_timing",Vs="2026_10_31_017_binding_registry_writers",_t={"2026_10_09_000_slot_registry":Lr,"2026_10_09_001_slot_owner_fencing":Ur,"2026_10_09_002_slot_journal":qr,"2026_10_10_003_free_device_stop_state":Gr,"2026_10_12_004_free_device_deletion":Hr,"2026_10_13_005_free_device_deletion_failed_deletes":Wr,"2026_10_15_006_session_broker":Jr,"2026_10_15_007_session_broker_failure_retryable":jr,"2026_10_16_008_retire_slot_features":Nr,"2026_10_16_009_session_broker_receipt_retention":Xr,"2026_10_19_010_session_broker_exports":zr,"2026_10_20_011_session_broker_resource_indexes":fr,"2026_10_21_012_device_mutation_journal":vr,[rp]:hr,"2026_10_26_014_device_claims":yr,"2026_10_27_015_device_claims_metadata":wr,"2026_10_30_016_watchos_binding_platform":br,[Vs]:pr},p4=Object.keys(_t).at(-1);function np(d,c=Cn){return Object.fromEntries(Object.entries(d).map(([w,b])=>{if(w<Vs)return[w,b];return[w,{async up(C){await b.up(C),await m`INSERT OR IGNORE INTO binding_registry_migration_writers
|
|
147
|
-
(migration_name, writer_version, recorded_at)
|
|
148
|
-
VALUES (${w}, ${c()}, ${new Date().toISOString()})`.execute(C)},async down(C){await m`DELETE FROM binding_registry_migration_writers
|
|
149
|
-
WHERE migration_name = ${w}`.execute(C),await b.down?.(C)}}]}))}function Ws(d){return{getMigrations:async()=>np(_t,()=>d??Cn())}}var op=Ws();async function Pt(d,c){let w=await Gs(d),b=js(w);if(b.length>0)throw new Zr(c,b,await Xs(d,b))}async function Qr(d,c){return(await m`
|
|
150
|
-
SELECT name FROM sqlite_master WHERE type = 'table' AND name = ${c}
|
|
151
|
-
`.execute(d)).rows.length>0}async function Gs(d){return(await m`SELECT name FROM kysely_migration ORDER BY name`.execute(d)).rows.map(({name:w})=>w)}function js(d){return d.filter((c)=>!Object.hasOwn(_t,c))}function Ks(d){return m`
|
|
152
|
-
SELECT migration_name, writer_version FROM binding_registry_migration_writers
|
|
153
|
-
WHERE migration_name IN (${m.join(d)})
|
|
154
|
-
`}function zs(d,c,w){if(w.length===0)return{};try{let b=c.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?");try{if(!b.get("binding_registry_migration_writers"))return{}}finally{b.finalize()}let D=Ks(w).compile(d),C=c.prepare(D.sql);try{return Object.fromEntries(C.all(...D.parameters).map((k)=>{if(typeof k!=="object"||k===null||!("migration_name"in k)||typeof k.migration_name!=="string"||!("writer_version"in k)||typeof k.writer_version!=="string")throw new t("Invalid binding registry migration writer version");return[k.migration_name,k.writer_version]}))}finally{C.finalize()}}catch(b){return e.warn("[Bindings] Cannot read registry migration writer versions",b),{}}}async function Xs(d,c){if(c.length===0)return{};try{if(!await Qr(d,"binding_registry_migration_writers"))return{};let w=await Ks(c).execute(d);return Object.fromEntries(w.rows.map((b)=>[b.migration_name,b.writer_version]))}catch(w){return e.warn("[Bindings] Cannot read registry migration writer versions",w),{}}}async function Qs(d){let c=await Qr(d,"kysely_migration")?await Gs(d):[],w=c.at(-1)??null,b=await Xs(d,w===null?[]:[w]);return{schemaVersion:w,knownSchemaVersion:p4,supported:js(c).length===0,writerVersion:w===null?null:b[w]??null}}async function Yr(d,c){if(await Qr(d,"kysely_migration"))await Pt(d,c)}class Zt extends t{}async function Zs(d,c){if(await Yr(d,c),(await new RO({db:d,provider:op}).getMigrations()).some((b)=>b.executedAt===void 0))throw new Zt("Binding registry upgrade pending; exclusion will retry after retirement")}async function ea(d,c,w,b={}){await Yr(d,c);let D=new RO({db:d,provider:Ws(b.writerVersion)});if((await D.getMigrations()).every((k)=>k.executedAt!==void 0))return;let C=d2(c);await C.acquire();try{if(await Yr(d,c),(await D.getMigrations()).some((M)=>M.name==="2026_10_16_008_retire_slot_features"&&M.executedAt===void 0))await w?.();let{error:O}=await D.migrateToLatest();if(O)throw new t(`Failed to migrate the binding registry at ${c}: ${r(O)}`)}finally{await C.release()}}import{AsyncLocalStorage as Hf}from"async_hooks";function At(d){return{scopeKey:d.scope_key,managedHostScope:d.managed_host_scope,runnerNamespace:d.runner_namespace,runnerIncarnation:d.runner_incarnation,state:d.state,createdAtMs:d.created_at_ms,lastAcquiredAtMs:d.last_acquired_at_ms,lastReleasedAtMs:d.last_released_at_ms,invalidationReason:d.invalidation_reason,invalidatingAtMs:d.invalidating_at_ms,invalidatedAtMs:d.invalidated_at_ms}}function ta(d){if(d===null)return null;return JSON.parse(d)}function sp(d){if(d.exec_owner_daemon_id===null||d.exec_owner_pid===null||d.exec_session_uuid===null)return null;return{daemonId:d.exec_owner_daemon_id,pid:d.exec_owner_pid,sessionUuid:d.exec_session_uuid,processGenerationToken:d.exec_owner_process_token}}function ap(d){if(d.settler_daemon_id===null||d.settler_pid===null)return null;return{daemonId:d.settler_daemon_id,pid:d.settler_pid,processGenerationToken:d.settler_process_token}}function Et(d){return{settler_daemon_id:d?.daemonId??null,settler_pid:d?.pid??null,settler_process_token:d?.processGenerationToken??null}}function de(d){return{scopeKey:d.scope_key,bindingIndex:d.slot_index,role:d.role,platform:d.platform,generation:d.generation,stableDeviceId:d.stable_device_id,deviceName:d.device_name,requestedSpec:ta(d.requested_spec_json),resolvedSpec:ta(d.resolved_spec_json),specFingerprint:d.spec_fingerprint,state:d.state,execOwner:sp(d),settler:ap(d),updatedAtMs:d.updated_at_ms}}function It(d,c){let w=d[c];if(w===null||w===void 0)return null;if(typeof w!=="string")throw new t(`Binding journal target field '${c}' is not a string`);return w}function m4(d){return d==="android"||d==="ios"||d==="watchos"}function nt(d){let c=JSON.parse(d);if(typeof c!=="object"||c===null)throw new t("Binding journal target is not an object");let w=c,b=w.newPlatform;if(b!==void 0&&b!==null&&!m4(b))throw new t("Binding journal target field 'newPlatform' is not a platform");return{...b?{newPlatform:b}:{},...w.removalRequested===!0?{removalRequested:!0}:{},...typeof w.quarantinedAtMs==="number"&&Number.isFinite(w.quarantinedAtMs)?{quarantinedAtMs:w.quarantinedAtMs}:{},oldStableId:It(w,"oldStableId"),oldName:It(w,"oldName"),newName:It(w,"newName"),newStableId:It(w,"newStableId"),requestedSpec:w.requestedSpec??null,resolvedSpec:w.resolvedSpec??null,specFingerprint:It(w,"specFingerprint")}}function be(d){return{id:d.id,scopeKey:d.scope_key,bindingIndex:d.slot_index,kind:d.kind,phase:d.phase,platform:d.platform,fromGeneration:d.from_generation,toGeneration:d.to_generation,binding:{generation:d.binding_generation,stableDeviceId:d.binding_stable_device_id},target:nt(d.target_json),owner:{daemonId:d.owner_daemon_id,pid:d.owner_pid,processGenerationToken:d.owner_process_token},attempts:d.attempts,lastError:d.last_error,nextAttemptAtMs:d.next_attempt_at_ms,createdAtMs:d.created_at_ms,updatedAtMs:d.updated_at_ms}}function dt(d){let c=JSON.stringify(d??null);if(c===void 0)throw new t("Binding spec must be JSON-serializable");return c}function ia(d,c,w,b){return{phase:c.phase,target_json:dt({...d.target,...c.target}),to_generation:w&&w.generation!==d.binding.generation?w.generation:d.toGeneration,...w?{binding_generation:w.generation,binding_stable_device_id:w.stableDeviceId}:{},...c.attempt?{attempts:d.attempts+1,last_error:c.attempt.error,next_attempt_at_ms:c.attempt.nextAttemptAtMs}:{},updated_at_ms:b}}function ra(d){if(!bA(d))throw new t(`A binding journal entry cannot open at phase '${d}'`)}class rn{db;constructor(d){this.db=d}async listReferencedAvdNames(){return this.db.transaction().execute(async(d)=>{let c=await d.selectFrom("slot_assignments").select(["device_name","stable_device_id"]).execute(),w=await d.selectFrom("slot_journal").select(["binding_stable_device_id","target_json"]).execute(),b=c.flatMap((D)=>[D.device_name,D.stable_device_id]);for(let D of w){let C=nt(D.target_json);b.push(D.binding_stable_device_id,C.oldName,C.oldStableId,C.newName,C.newStableId)}return[...new Set(b.filter((D)=>D!==null))]})}}class on{db;write;constructor(d,c=(w)=>w(d)){this.db=d;this.write=c}async upsert(d){let c=na(d);await this.write((w)=>w.insertInto("device_claims").values(c).onConflict((b)=>b.columns(["platform","device_id"]).doUpdateSet({...c,claimed_at_ms:m`CASE WHEN device_claims.pid = excluded.pid
|
|
155
|
-
AND device_claims.owner_token = excluded.owner_token
|
|
156
|
-
THEN device_claims.claimed_at_ms ELSE excluded.claimed_at_ms END`}).where("device_claims.updated_at_ms","<=",c.updated_at_ms)).execute())}async replaceIf(d,c){let w=na(c);return this.write(async(b)=>{if(!d){let C=await b.insertInto("device_claims").values(w).onConflict((k)=>k.columns(["platform","device_id"]).doNothing()).executeTakeFirst();return Number(C.numInsertedOrUpdatedRows??0)>0}let D=await b.updateTable("device_claims").set(w).where("platform","=",c.platform).where("device_id","=",c.deviceId).where("pid","=",d.pid).where("owner_token","=",d.ownerToken).where("updated_at_ms","=",d.updatedAtMs).executeTakeFirst();return Number(D.numUpdatedRows)>0})}async release(d,c,w){await this.write((b)=>b.deleteFrom("device_claims").where("platform","=",d).where("device_id","=",c).where("pid","=",w.pid).where("owner_token","=",w.ownerToken).execute())}async releaseOwnedBy(d){await this.write((c)=>c.deleteFrom("device_claims").where("pid","=",d.pid).where("owner_token","=",d.ownerToken).execute())}async get(d,c){let w=await this.db.selectFrom("device_claims").selectAll().where("platform","=",d).where("device_id","=",c).executeTakeFirst();return w?oa(w):void 0}async list(){return(await this.db.selectFrom("device_claims").selectAll().orderBy("platform").orderBy("device_id").execute()).map(oa)}}function na(d){return{platform:d.platform,device_id:d.deviceId,kind:d.kind,daemon_session_id:d.daemonSessionId??null,pid:d.pid,owner_token:d.ownerToken,process_generation_token:d.processGenerationToken??null,session_uuid:d.sessionUuid??null,metadata:d.metadata??null,claimed_at_ms:d.claimedAtMs,updated_at_ms:d.updatedAtMs}}function oa(d){return{platform:d.platform,deviceId:d.device_id,kind:d.kind,...d.daemon_session_id===null?{}:{daemonSessionId:d.daemon_session_id},pid:d.pid,ownerToken:d.owner_token,...d.process_generation_token===null?{}:{processGenerationToken:d.process_generation_token},...d.session_uuid===null?{}:{sessionUuid:d.session_uuid},...d.metadata===null?{}:{metadata:d.metadata},claimedAtMs:d.claimed_at_ms,updatedAtMs:d.updated_at_ms}}function sa(d,c){let w=[];for(let{selection:b}of d.selections??[])if(xb.is(b)&&tr.is(b.column))w.push(sn(b.column.column.name),dn(c,b.column.column.name));else if(tr.is(b))w.push(sn(b.column.name),dn(c,b.column.name));else if(Ts.is(b)&&ot.is(b.alias))w.push(sn(b.alias.name),dn(c,b.alias.name));else throw Error("can't extract column names from the select query node");return w}function sn(d){return new Ir(Gn.createImmediate(d))}function dn(d,c){return new Ir(xb.create(tr.create(c),Oc.create(d)))}function cn(d){return m`(select coalesce(json_group_array(json_object(${m.join(dp(d.toOperationNode(),"agg"))})), '[]') from ${d} as agg)`}function dp(d,c){try{return sa(d,c)}catch{throw Error("SQLite jsonArrayFrom and jsonObjectFrom functions can only handle explicit selections due to limitations of the json_object function. selectAll() is not allowed in the subquery.")}}import{existsSync as Nf}from"fs";import{dirname as Lf,join as Ff}from"path";var cp=Rd("family",[g({family:ne("iphone"),variant:A(["standard","pro","pro-max","air"])}),g({family:ne("ipad"),variant:A(["standard","mini","air","pro"]),sizeInches:y().optional()}),g({family:ne("duo"),variant:ne("duo")})]),ln=Rd("platform",[g({platform:ne("ios"),metadataState:ne("current"),simulatorDeviceTypeIdentifier:y().min(1),modelIdentifier:y().min(1).optional(),archetype:A(["phone","tablet","duo"]),modelType:cp,runtimeId:y().min(1),osVersion:y().regex(/^\d+(?:\.\d+)*$/),compatibility:A(["supported","unknown"])}),g({platform:ne("android"),metadataState:ne("current"),profileId:y().min(1),archetype:A(["phone","tablet","foldable"]),memoryMb:T().int().positive().optional(),effectiveRamMb:T().positive().nullable().optional(),effectiveCpuCores:T().int().positive().nullable().optional(),systemImagePackage:y().min(1),osVersion:y().regex(/^\d+(?:\.\d+)*$/),versionPrecision:A(["major","minor","patch"]),apiLevel:T().int().positive(),abi:y().min(1),flavor:y().min(1)}),g({platform:ne("watchos"),metadataState:ne("current"),runtime:y().min(1),deviceType:y().min(1)})]);function Mn(d){let c=g({profile:ln}).safeParse(d.profile);if(!c.success)throw new t("Stored session device profile is incomplete; retain its reservation for recovery");return c.data.profile}function JN(d){return Mn({profile:d})}async function A7(d,c,w){let b;if(d.platform==="android"&&c?.device)try{b=await w?.readConfig(c.device.name)}catch(C){e.warn(`Cannot read effective Android hardware for broker receipt: ${r(C)}`,C)}return d.platform==="android"?{...d,effectiveRamMb:b?.effectiveRamMb??null,effectiveCpuCores:b?.effectiveCpuCores??null}:d}function aa(d,c){if(c?.platform!=="android")return{};return{profile_json:JSON.stringify({...typeof d.profile==="object"&&d.profile!==null?d.profile:{},profile:{...Mn(d),effectiveRamMb:c.effectiveRamMb??null,effectiveCpuCores:c.effectiveCpuCores??null}})}}class VI extends t{code="reset_capacity_wait_exceeded";details;constructor(d,c,w){let{platform:b,limit:D,booted:C,externalDevices:k,heldDevices:O}=w.details,M=k?.length?` Simulators with no AutoMobile owner still counting toward the limit: ${k.join(", ")}.`:"";super(`Gave up after ${c/1000}s waiting for iOS simulator capacity to re-boot reset simulator ${d}: ${C} simulator(s) booted, limit is ${D}.${M} Shut them down (xcrun simctl shutdown <udid>) or raise AUTOMOBILE_IOS_SIM_MAX_BOOTED.`,{cause:w});this.name="ResetCapacityWaitExceededError",this.details={platform:b,deviceId:d,waitedMs:c,limit:D,booted:C,externalDevices:k,heldDevices:O}}}class Ee extends t{code="session_broker_invariant_failed"}var T7=5000,Kd=5000;class RS extends t{code;retryable;retryAfterMs;constructor(d){super("Session request belongs to another daemon process generation");if(this.name="SessionRequestOwnerMismatchError",this.code=d?"session_restart_handoff_pending":"session_owner_mismatch",this.retryable=d,d)this.retryAfterMs=Kd}}function lp(d){return d instanceof ko||d instanceof ze&&d.platform==="ios"&&d.discoveryError?.retryable!==!1||"name"in d&&(d.name==="AbortError"||d.name==="TimeoutError")}function up(d){if(d instanceof Ee||d instanceof RS)return"permanent";if(typeof d!=="object"||d===null)return"unknown";if(lp(d))return"retryable";if("code"in d&&typeof d.code==="string"&&d.code.startsWith("SQLITE_"))return Ja({code:d.code})==="retryable"?"retryable":"permanent";return"unknown"}function PS(d){let c=new Set,w="unknown";while(!c.has(d)){c.add(d);let b=up(d);if(b==="permanent")return b;if(b==="retryable")w=b;d=typeof d==="object"&&d!==null&&"cause"in d?d.cause:void 0}return w}var ca="capacity_exhausted";class Un extends t{code=ca;retryable=!0;details;constructor(d,c){super(c);this.name="BootCapacityExhaustedError",this.details={...d,code:ca,retryable:!0}}get retryAfterMs(){return this.details.retryAfterMs}get limit(){return this.details.limit}get booted(){return this.details.booted}get platform(){return this.details.platform}}class ka extends t{failure;constructor(d){super(d.message);this.failure=d}}function AS(d){if(!d.ok)throw new ka({code:d.error.code,message:d.error.message,retryable:d.error.transient});return d.value}class Gd extends t{code="session_broker_stopping";retryable=!0;retryAfterMs=Kd;constructor(){super("Session broker is stopping");this.name="SessionBrokerStoppingError"}}function z(d){return{ok:!0,value:d}}function K(d,c,w={}){return{ok:!1,error:{code:d,message:c,transient:w.transient??!1,...w.field===void 0?{}:{field:w.field}}}}function xt(d){if(d.family==="duo")return"duo";return d.family==="ipad"?"tablet":"phone"}function ei(d){if(d===void 0)return;let[c,w]=d.split("."),b=c.replace(/^0+(?=\d)/,""),D=w?.replace(/0+$/,"");return D?`${b}.${D}`:b}function un(d,c){if(d.family!==c.family||d.variant!==c.variant)return!1;if(d.family!=="ipad"||c.family!=="ipad")return!0;return ei(d.sizeInches)===ei(c.sizeInches)}function ua(d,c){if(d.family!==c.family||d.variant!==c.variant)return!1;if(d.family!=="ipad"||c.family!=="ipad")return!0;return d.sizeInches===void 0||ei(d.sizeInches)===ei(c.sizeInches)}function ct(d){if(d.family==="duo")return"Duo";if(d.family==="iphone")return`iPhone ${d.variant}`;let c=d.sizeInches===void 0?"":` ${d.sizeInches}-inch`;return`iPad ${d.variant}${c}`}function pp(d,c){if(c.namespace==="product-model")return d.modelIdentifier===c.value;if(c.namespace==="simulator-device-type")return d.simulatorDeviceTypeIdentifier===c.value;return d.aliases?.includes(c.value)===!0}function ii(d,c,w="hardware.model"){let b=c.models.filter((C)=>pp(C,d));if(b.length>1)return K(d.namespace==="alias"?"ambiguous_model_alias":"catalog_metadata_invalid",`${w} '${d.value}' resolves to more than one catalog model.`,{field:w});let D=b[0];if(!D)return K("unsupported_hardware",`${w} '${d.value}' is not present in the installed iOS catalog.`,{field:w});if(D.metadataState!=="current")return K("catalog_metadata_invalid",`${w} '${d.value}' has stale catalog metadata.`,{field:w});if(!D.archetype||!D.modelType)return K("catalog_metadata_invalid",`${w} '${d.value}' lacks explicit archetype or model-type metadata.`,{field:w});if(xt(D.modelType)!==D.archetype)return K("catalog_metadata_invalid",`${w} '${d.value}' has conflicting archetype and model-type metadata.`,{field:w});return z(D)}function ri(d,c){let w=c.profiles.filter((D)=>D.profileId===d);if(w.length===0){let D=c.profiles.map((C)=>C.profileId).join(", ")||"none";return K("unsupported_hardware",`Android profile '${d}' is not installed. Installed profiles: ${D}.`,{field:"hardware.profileId"})}if(w.length>1)return K("catalog_metadata_invalid",`Android profile '${d}' is duplicated in the catalog.`);let[b]=w;if(b.metadataState!=="current")return K("catalog_metadata_invalid",`Android profile '${d}' lacks current catalog metadata.`);if(b.archetype===void 0)return K("unsupported_hardware",`Android profile '${d}' has no archetype classification. Classify it as phone, tablet or foldable in androidProfileArchetypes.`,{field:"hardware.profileId"});return z({...b,archetype:b.archetype,metadataState:"current"})}function ni(d){let c=d.effective.hardware;return c.kind==="archetype"?c.archetype:d.exactProfile?.archetype}function ma(d,c,w){if(c.platform!==d||w.platform!==d)return K("invalid_config",`Requirement, defaults, and catalog must all target ${d}.`);if(!c.policyVersion)return K("invalid_config","Default policy version must be non-empty.",{field:"policyVersion"});if(w.provenance.state!=="ready")return K("catalog_unavailable",w.provenance.message??`${d} catalog is unavailable.`,{transient:!0});if(!w.provenance.source||!w.provenance.revision)return K("catalog_metadata_invalid","Catalog provenance is incomplete.");return z(!0)}function fp(d){return d.replace(/^0+(?=\d)/,"")}function Uo(d,c="os.version"){if(!/^\d+(?:\.\d+)*$/.test(d))return K("invalid_request",`${c} must be a dotted numeric release.`,{field:c});let w=d.split(".").map(fp);while(w.length>1&&w.at(-1)==="0")w.pop();if(w.every((b)=>b==="0"))return K("invalid_request",`${c} must be greater than zero.`,{field:c});return z({value:w.join("."),components:w,precision:w.length})}function je(d,c){return la(d,c)}function lt(d,c="os"){if(d.kind==="major"){if(!Number.isSafeInteger(d.major)||d.major<=0)return K("invalid_request",`${c}.major must be a positive safe integer.`,{field:`${c}.major`});return z(d)}let w=Uo(d.version,`${c}.version`);return w.ok?z({kind:d.kind,version:w.value.value}):w}function ke(d,c){let w=Uo(c);if(!w.ok)return!1;if(d.kind==="major")return w.value.components[0]===String(d.major);let b=je(w.value.value,d.version);return d.kind==="exact"?b===0:b>=0}function ai(d){return d==="major"?1:d==="minor"?2:3}function ci(d,c,w){if(!w)return!1;let b=Uo(c);if(!b.ok)return!1;let D=ai(w),C=b.value.components.slice(0,D).join(".");if(d.kind==="exact"){let k=Uo(d.version);if(!k.ok||k.value.precision>D||b.value.precision>D)return!1}return ke(d,C)}var Ke={kind:"match"};function oe(d){return{kind:"mismatch",reason:d}}function hp(d,c){let w=d.effective.hardware;if(w.kind==="exact-model"){let b=d.exactModel;if(!b||!c.simulatorDeviceTypeIdentifier)return oe("unknown-hardware-metadata");return c.simulatorDeviceTypeIdentifier===b.simulatorDeviceTypeIdentifier?Ke:oe("hardware")}if(w.kind==="model-type"){if(!c.modelType)return oe("unknown-hardware-metadata");return ua(w.modelType,c.modelType)?Ke:oe("hardware")}if(!c.archetype)return oe("unknown-hardware-metadata");return c.archetype===w.archetype?Ke:oe("hardware")}function yp(d,c){let w=d.effective.hardware;if(w.kind==="exact-profile"){if(!c.profileId)return oe("unknown-hardware-metadata");return c.profileId===w.profileId?Ke:oe("hardware")}if(!c.archetype)return oe("unknown-hardware-metadata");return c.archetype===ni(d)?Ke:oe("hardware")}function pa(d,c){if(!c.osVersion||!Uo(c.osVersion).ok)return oe("unknown-os-metadata");if(c.platform==="android"){if(!c.versionPrecision)return oe("unknown-os-metadata");return ci(d.effective.os,c.osVersion,c.versionPrecision)?Ke:oe("os")}return ke(d.effective.os,c.osVersion)?Ke:oe("os")}function vq(d,c){if(d.platform!==c.platform)return oe("platform");if(c.metadataState!=="current")return oe("stale-metadata");if(d.platform==="ios"&&c.platform==="ios"){let w=hp(d,c);return w.kind==="match"?pa(d,c):w}if(d.platform==="android"&&c.platform==="android"){let w=yp(d,c);return w.kind==="match"?pa(d,c):w}return oe("platform")}var fa=["none","notch","dynamic_island","hole_punch","any"],wp=new Set(["iphone-se","iphone-se-2nd-generation","iphone-se-3rd-generation","iphone-6","iphone-6-plus","iphone-6s","iphone-6s-plus","iphone-7","iphone-7-plus","iphone-8","iphone-8-plus","ipod-touch-7th-generation"]),bp=new Set(["iphone-x","iphone-xr","iphone-xs","iphone-xs-max","iphone-11","iphone-11-pro","iphone-11-pro-max","iphone-12","iphone-12-mini","iphone-12-pro","iphone-12-pro-max","iphone-13","iphone-13-mini","iphone-13-pro","iphone-13-pro-max","iphone-14","iphone-14-plus","iphone-16e"]),Sp=new Set(["iphone-14-pro","iphone-14-pro-max","iphone-15","iphone-15-plus","iphone-15-pro","iphone-15-pro-max","iphone-16","iphone-16-plus","iphone-16-pro","iphone-16-pro-max","iphone-17","iphone-17-pro","iphone-17-pro-max","iphone-air","iphone-17e"]),_p=new Set(["pixel","pixel_2","pixel_2_xl","pixel_3","pixel_3a","pixel_3a_xl","pixel_4","pixel_4_xl","pixel_c","pixel_tablet","nexus 5x","medium phone","small phone"]),Rp=new Set(["pixel_3_xl"]),Dp=new Set(["pixel_4a","pixel_4a_5g","pixel_5","pixel_5a","pixel_6","pixel_6_pro","pixel_6a","pixel_7","pixel_7_pro","pixel_7a","pixel_8","pixel_8_pro","pixel_8a","pixel_9","pixel_9_pro","pixel_9_pro_xl","pixel_9_pro_fold"]);function Pp(d){return d.startsWith("com.apple.CoreSimulator.SimDeviceType.")?d.slice(38).toLowerCase().replaceAll(/-+/g,"-").replaceAll(/(^-|-$)/g,""):""}function TS(d,c){if(d==="ios"){let b=Pp(c);if(wp.has(b)||b.startsWith("ipad-"))return"none";if(bp.has(b))return"notch";if(Sp.has(b))return"dynamic_island";return"unknown"}let w=c.toLowerCase();if(_p.has(w))return"none";if(Rp.has(w))return"notch";if(Dp.has(w))return"hole_punch";return"unknown"}var va=30,li="com.apple.CoreSimulator.",Ip="system-images;",Cp=["phone","tablet","foldable","tv","watch","automotive","xr-headset","xr-glasses"],ha=p(Cp).optional().describe("Required device family, independent of the exact model and creation default");function Ap(d){let c=tn(d);return c?.tag==="google_apis_playstore"&&c.apiLevel>=va}var ya=n().min(1).describe("Installed Android system-image package identifier"),wa=n().min(1).describe("Android avdmanager device profile identifier"),vo={ios:{platform:"ios",catalog:"automobile:devices/images/ios",example:{runtime:"com.apple.CoreSimulator.SimRuntime.iOS-26-5",deviceType:"com.apple.CoreSimulator.SimDeviceType.iPhone-17-Pro"}},watchos:{platform:"watchos",catalog:"automobile:devices/images/watchos",example:{runtime:"com.apple.CoreSimulator.SimRuntime.watchOS-11-0",deviceType:"com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-10-46mm"}},tvos:{platform:"tvos",catalog:"automobile:devices/images/tvos",example:{runtime:"com.apple.CoreSimulator.SimRuntime.tvOS-26-5",deviceType:"com.apple.CoreSimulator.SimDeviceType.Apple-TV-4K-3rd-generation-4K"}},visionos:{platform:"visionos",catalog:"automobile:devices/images/visionos",example:{runtime:"com.apple.CoreSimulator.SimRuntime.xrOS-26-5",deviceType:"com.apple.CoreSimulator.SimDeviceType.Apple-Vision-Pro-4K"}}};function Ep(d){return`pass spec { runtime, deviceType } with exact CoreSimulator identifiers, e.g. ${JSON.stringify(d.example)}; list the host's identifiers with ${d.catalog}`}function ba(d){return(c)=>c.input===void 0?d:void 0}function Oe(d,c,w){return n({error:ba(`is required: a CoreSimulator ${d==="runtime"?"runtime":"device-type"} identifier such as '${c.example[d]}'; list the host's identifiers with `+c.catalog)}).min(1).describe(w)}function ui(d){return{error:ba(`is required for ${d.platform}: ${Ep(d)}`)}}var xp=n().min(1).describe("CoreSimulator runtime identifier"),Tp=n().min(1).describe("CoreSimulator device-type identifier"),pi=p(fa).optional().describe("Required display cutout class for the exact device type; 'any' accepts every class");function f4(d,c){if(d.runtime.startsWith(li))c.addIssue({code:"custom",message:"Android runtime must be an Android system-image identifier",path:["runtime"]});if(d.deviceType?.startsWith(li))c.addIssue({code:"custom",message:"Android deviceType must be an Android avdmanager device profile identifier",path:["deviceType"]});let w=d.configuration?.memoryMb;if(w!==void 0&&w<cl&&Ap(d.runtime))c.addIssue({code:"custom",message:`memoryMb must be at least ${cl} for Android API ${va}+ Play Store images`,path:["configuration","memoryMb"]})}function _a(d,c){if(d.runtime.startsWith(Ip))c.addIssue({code:"custom",message:"iOS runtime must be a CoreSimulator runtime identifier",path:["runtime"]});if(d.deviceType!==void 0&&!d.deviceType.startsWith(li)){let w=vo.ios;c.addIssue({code:"custom",message:`iOS deviceType must be a full CoreSimulator device-type identifier (${li}SimDeviceType.${d.deviceType}, not '${d.deviceType}'), e.g. '${w.example.deviceType}'; list the host's identifiers with ${w.catalog}`,path:["deviceType"]})}}var k7={runtime:ya,deviceType:wa,displayCutout:pi,configuration:FT.optional()},E7=s({runtime:Oe("runtime",vo.ios,"CoreSimulator runtime identifier"),deviceType:Oe("deviceType",vo.ios,"CoreSimulator device-type identifier"),displayCutout:pi},ui(vo.ios)).strict().superRefine(_a),I7=s({runtime:ya,deviceType:wa.optional(),deviceFamily:ha,displayCutout:pi,configuration:FT.optional()}).strict().superRefine(f4),_7=s({runtime:xp,deviceType:Tp.optional(),deviceFamily:ha,displayCutout:pi}).strict().superRefine(_a),XN=s({runtime:Oe("runtime",vo.watchos,"watchOS CoreSimulator runtime identifier"),deviceType:Oe("deviceType",vo.watchos,"Apple Watch CoreSimulator device-type identifier")},ui(vo.watchos)).strict(),bq=XN,x7=s({runtime:Oe("runtime",vo.tvos,"tvOS CoreSimulator runtime identifier"),deviceType:Oe("deviceType",vo.tvos,"Apple TV CoreSimulator device-type identifier")},ui(vo.tvos)).strict(),C7=s({runtime:Oe("runtime",vo.visionos,"visionOS CoreSimulator runtime identifier"),deviceType:Oe("deviceType",vo.visionos,"Apple Vision Pro CoreSimulator device-type identifier")},ui(vo.visionos)).strict();function Da(d){let c=XN.safeParse(d.spec);if(!c.success)return K("invalid_request",`spec must name exactly a watchOS runtime and an Apple Watch deviceType: ${oE(c.error)}`,{field:"spec"});return z({schemaVersion:1,platform:"watchos",spec:c.data})}function Ra(d){return d.length>0?d.join(", "):"none installed"}function gn(d,c){if(c.platform!=="watchos")return K("invalid_config","Requirement and catalog must both target watchos.");if(c.provenance.state==="not-installed")return K("unsupported_hardware",c.provenance.message??"Apple Watch simulators exist only on macOS hosts with Xcode's simctl.",{field:"platform"});if(c.provenance.state!=="ready")return K("catalog_unavailable",c.provenance.message??"The Apple Watch simulator catalog is unavailable.",{transient:!0});let{runtime:w,deviceType:b}=d.spec;if(!c.deviceTypes.some((C)=>C.deviceType===b))return K("unsupported_hardware",`Unknown Apple Watch device type '${b}'. Available: `+Ra(c.deviceTypes.map((C)=>C.deviceType)),{field:"spec.deviceType"});let D=c.runtimes.filter((C)=>C.installed);if(!D.some((C)=>C.runtime===w)){let C=c.runtimes.some((k)=>k.runtime===w);return K("missing_installed_runtime",`${C?"Unavailable":"Unknown"} watchOS runtime '${w}'. Available: `+Ra(D.map((k)=>k.runtime)),{field:"spec.runtime"})}return z({platform:"watchos",original:d,profile:{platform:"watchos",metadataState:"current",runtime:w,deviceType:b},catalogSource:c.provenance.source,catalogRevision:c.provenance.revision})}function vn(d,c){if(c.platform!=="watchos")return{kind:"mismatch",reason:"platform"};if(c.metadataState!=="current")return{kind:"mismatch",reason:"stale-metadata"};if(c.deviceType!==d.profile.deviceType)return{kind:"mismatch",reason:"hardware"};return c.runtime===d.profile.runtime?{kind:"match"}:{kind:"mismatch",reason:"os"}}var ZN=["pixel-baseline","samsung-oneui","xiaomi-hyperos","oneplus-oxygenos","oppo-coloros","motorola","huawei-emui","vivo-funtouch","realme-ui","meizu-flyme","asus-zenui","sony-xperia","tecno-hios"],Vy=["samsung-dex","knox","flip-cover-screen","spen-air-actions","oem-systemui","oem-unused-app-triggers","firmware-update-exemption-reset","xiaomi-proprietary-appops"];function Je(d){return typeof d==="object"&&d!==null&&!Array.isArray(d)}function se(d,c){let w=Object.keys(d).filter((b)=>!c.includes(b));return w.length===0?z(!0):K("invalid_request",`Unexpected field(s): ${w.join(", ")}.`)}function Pa(d,c){return typeof d==="string"&&d.length>0?z(d):K("invalid_request",`${c} must be a non-empty string.`,{field:c})}function Bp(d){if(!Je(d))return K("invalid_request","hardware.model must be an exact model reference.",{field:"hardware.model"});let c=se(d,["namespace","value"]);if(!c.ok)return c;if(d.namespace!=="product-model"&&d.namespace!=="simulator-device-type"&&d.namespace!=="alias")return K("invalid_request","hardware.model.namespace must be product-model, simulator-device-type, or alias.",{field:"hardware.model.namespace"});let w=Pa(d.value,"hardware.model.value");return w.ok?z({namespace:d.namespace,value:w.value}):w}function kp(d){let c=se(d,["family","variant"]);if(!c.ok)return c;let w=d.variant;if(w==="standard"||w==="pro"||w==="pro-max"||w==="air")return z({family:"iphone",variant:w});return K("invalid_request","Unsupported iPhone model type.",{field:"hardware.modelType.variant"})}function Mp(d){let c=se(d,["family","variant"]);if(!c.ok)return c;return d.variant==="duo"?z({family:"duo",variant:"duo"}):K("invalid_request","Unsupported Duo model type.",{field:"hardware.modelType.variant"})}function Np(d){if(!Je(d))return K("invalid_request","hardware.modelType must be an object.",{field:"hardware.modelType"});if(d.family==="iphone")return kp(d);if(d.family==="ipad")return Lp(d);if(d.family==="duo")return Mp(d);return K("invalid_request","Unsupported iOS model family.",{field:"hardware.modelType.family"})}function Lp(d){let c=se(d,["family","variant","sizeInches"]);if(!c.ok)return c;let w=d.variant;if(w!=="standard"&&w!=="mini"&&w!=="air"&&w!=="pro")return K("invalid_request","Unsupported iPad model type.",{field:"hardware.modelType.variant"});if(d.sizeInches===void 0)return z({family:"ipad",variant:w});if(typeof d.sizeInches!=="string"||!/^\d+(?:\.\d+)?$/.test(d.sizeInches))return K("invalid_request","hardware.modelType.sizeInches must be numeric.",{field:"hardware.modelType.sizeInches"});return z({family:"ipad",variant:w,sizeInches:d.sizeInches})}function Fp(d){let c=se(d,["kind","archetype"]);if(!c.ok)return c;if(d.archetype==="phone"||d.archetype==="tablet"||d.archetype==="duo")return z({kind:"archetype",archetype:d.archetype});return K("invalid_request","Unsupported iOS hardware archetype.",{field:"hardware.archetype"})}function $p(d){let c=se(d,["kind","modelType"]);if(!c.ok)return c;let w=Np(d.modelType);return w.ok?z({kind:"model-type",modelType:w.value}):w}function Up(d){let c=se(d,["kind","model"]);if(!c.ok)return c;let w=Bp(d.model);return w.ok?z({kind:"exact-model",model:w.value}):w}function qp(d){if(!Je(d)||typeof d.kind!=="string")return K("invalid_request","hardware must have an explicit selector kind.",{field:"hardware"});if(d.kind==="omitted"){let c=se(d,["kind"]);return c.ok?z({kind:"omitted"}):c}if(d.kind==="archetype")return Fp(d);if(d.kind==="model-type")return $p(d);if(d.kind==="exact-model")return Up(d);return K("invalid_request",`Unsupported iOS hardware selector '${d.kind}'.`,{field:"hardware.kind"})}function Hp(d){let c=se(d,["kind","archetype"]);if(!c.ok)return c;return d.archetype==="phone"||d.archetype==="tablet"||d.archetype==="foldable"?z({kind:"archetype",archetype:d.archetype}):K("invalid_request","Android hardware supports only phone, tablet or foldable.",{field:"hardware.archetype"})}function Vp(d){let c=se(d,["kind","profileId"]);if(!c.ok)return c;let w=Pa(d.profileId,"hardware.profileId");return w.ok?z({kind:"exact-profile",profileId:w.value}):w}function Wp(d){if(!Je(d)||typeof d.kind!=="string")return K("invalid_request","hardware must have an explicit selector kind.",{field:"hardware"});if(d.kind==="omitted"){let c=se(d,["kind"]);return c.ok?z({kind:"omitted"}):c}if(d.kind==="archetype")return Hp(d);if(d.kind==="exact-profile")return Vp(d);return K("invalid_request",`Unsupported Android hardware selector '${d.kind}'.`,{field:"hardware.kind"})}function Gp(d){let c=se(d,["kind","major"]);if(!c.ok)return c;if(typeof d.major!=="number")return K("invalid_request","os.major must be a number.",{field:"os.major"});let w={kind:"major",major:d.major},b=lt(w);return b.ok?z(w):b}function jp(d,c){let w=se(d,["kind","version"]);if(!w.ok)return w;if(typeof d.version!=="string")return K("invalid_request","os.version must be a string.",{field:"os.version"});let b={kind:c,version:d.version},D=lt(b);return D.ok?z(b):D}function Ia(d){if(!Je(d)||typeof d.kind!=="string")return K("invalid_request","os must have an explicit selector kind.",{field:"os"});if(d.kind==="omitted"){let c=se(d,["kind"]);return c.ok?z({kind:"omitted"}):c}if(d.kind==="major")return Gp(d);if(d.kind==="exact"||d.kind==="minimum")return jp(d,d.kind);return K("invalid_request",`Unsupported OS selector '${d.kind}'.`,{field:"os.kind"})}function Kp(d){let c=qp(d.hardware);if(!c.ok)return c;let w=Ia(d.os);return w.ok?z({schemaVersion:1,platform:"ios",hardware:c.value,os:w.value}):w}function h4(d){return ZN.includes(d)}function Jp(d){return Vy.includes(d)}function zp(d){if(d===void 0)return z(void 0);if(!Array.isArray(d)||!d.every(Jp))return K("invalid_request",`deviceProfile.requires must list capabilities from: ${Vy.join(", ")}.`,{field:"deviceProfile.requires"});return z([...d])}function Xp(d){if(d===void 0)return z(void 0);if(!Je(d))return K("invalid_request","deviceProfile must be an object.",{field:"deviceProfile"});let c=se(d,["manufacturerProfile","requires"]);if(!c.ok)return c;if(!h4(d.manufacturerProfile))return K("invalid_request",`deviceProfile.manufacturerProfile must be one of: ${ZN.join(", ")}.`,{field:"deviceProfile.manufacturerProfile"});let w=zp(d.requires);if(!w.ok)return w;return z({manufacturerProfile:d.manufacturerProfile,...w.value?{requires:w.value}:{}})}function Yp(d){let c=Wp(d.hardware);if(!c.ok)return c;let w=Ia(d.os);if(!w.ok)return w;let b=Xp(d.deviceProfile);if(!b.ok)return b;return z({schemaVersion:1,platform:"android",hardware:c.value,os:w.value,...b.value?{deviceProfile:b.value}:{}})}function Tt(d){if(!Je(d))return K("invalid_request","Session device requirement must be an object.");let c=se(d,d.platform==="android"?["schemaVersion","platform","hardware","os","deviceProfile"]:d.platform==="watchos"?["schemaVersion","platform","spec"]:["schemaVersion","platform","hardware","os"]);if(!c.ok)return c;if(d.schemaVersion!==1)return K("invalid_request","schemaVersion must be 1.",{field:"schemaVersion"});if(d.platform==="ios")return Kp(d);if(d.platform==="android")return Yp(d);if(d.platform==="watchos")return Da(d);return K("invalid_request","platform must be ios, android or watchos.",{field:"platform"})}function Xe(d,c){return K("invalid_config",d,c===void 0?{}:{field:c})}function hn(d,c="defaults.os"){let w=lt(d.selector,`${c}.selector`);if(!w.ok)return Xe(w.error.message,w.error.field);let b=Uo(d.preferredVersion,`${c}.preferredVersion`);if(!b.ok)return Xe(b.error.message,b.error.field);if(!ke(w.value,b.value.value))return Xe(`Preferred OS release '${d.preferredVersion}' does not satisfy the configured default predicate.`,`${c}.preferredVersion`);return z(w.value)}function Qp(d,c){if(d.kind==="archetype")return d.archetype;return d.kind==="model-type"?xt(d.modelType):c?.archetype}function yn(d,c){let w=d.os.archetypes??[],b=c===void 0?-1:w.findIndex((D)=>D.archetype===c);return b===-1?void 0:{policy:w[b],index:b}}function Ca(d,c){return d.kind==="omitted"?z(c):lt(d)}function Aa(d,c,w,b){return{policyVersion:d.policyVersion,catalogSource:c.provenance.source,catalogRevision:c.provenance.revision,defaultsApplied:w,...b===void 0?{}:{osDefaultArchetype:b}}}function Zp(d,c){if(c.hardware.omitted!=="phone"&&c.hardware.omitted!=="tablet"&&c.hardware.omitted!=="duo")return Xe("The omitted iOS hardware default is invalid.","defaults.hardware.omitted");return z(d.hardware.kind==="omitted"?{kind:"archetype",archetype:c.hardware.omitted}:d.hardware)}function ef(d,c){return d.kind==="exact-model"?ii(d.model,c):z(void 0)}function xa(d){let c=[];if(d.hardware.kind==="omitted")c.push("hardware-archetype");if(d.os.kind==="omitted")c.push("os-predicate");return c}function tf(d,c,w){let b=Zp(d,c);if(!b.ok)return b;let D=hn(c.os);if(!D.ok)return D;let C=ef(b.value,w);if(!C.ok)return C;let k=d.os.kind==="omitted"?yn(c,Qp(b.value,C.value)):void 0,O=k===void 0?D:hn(k.policy,`defaults.os.archetypes[${k.index}]`);if(!O.ok)return O;let M=Ca(d.os,O.value);if(!M.ok)return M;return z({platform:"ios",original:d,effective:{hardware:b.value,os:M.value},...C.value===void 0?{}:{exactModel:C.value},provenance:Aa(c,w,xa(d),k?.policy.archetype)})}function rf(d,c,w){if(c.hardware.omitted!=="phone"&&c.hardware.omitted!=="tablet"&&c.hardware.omitted!=="foldable")return Xe("The omitted Android hardware default must be phone, tablet or foldable.","defaults.hardware.omitted");let b=hn(c.os);if(!b.ok)return b;let D=d.hardware.kind==="omitted"?{kind:"archetype",archetype:c.hardware.omitted}:d.hardware,C=Ca(d.os,b.value);if(!C.ok)return C;let k=D.kind==="exact-profile"?ri(D.profileId,w):z(void 0);if(!k.ok)return k;return z({platform:"android",original:d,effective:{hardware:D,os:C.value},...k.value===void 0?{}:{exactProfile:k.value},provenance:Aa(c,w,xa(d))})}function g4(d,c,w){let b=Tt(d);if(!b.ok)return b;if(b.value.platform==="watchos")return Xe("A watchOS requirement is not resolved through host defaults.");let D=ma(b.value.platform,c,w);if(!D.ok)return D;if(b.value.platform==="ios"&&c.platform==="ios"&&w.platform==="ios")return tf(b.value,c,w);if(b.value.platform==="android"&&c.platform==="android"&&w.platform==="android")return rf(b.value,c,w);return Xe("Requirement context could not be narrowed to one platform.")}function Me(d,c){return K("invalid_config",d,c===void 0?{}:{field:c})}function bn(d,c,w){let b=d.filter(c);if(b.length===0)return Me(`Missing ${w}.`);if(b.length>1)return Me(`Conflicting ${w} entries.`);return z(b[0])}function Ta(d,c,w){let b=bn(c.hardware.modelTypes,(C)=>un(C.modelType,d),`exact-model default for ${ct(d)}`);if(!b.ok)return b;let D=ii(b.value.model,w,"defaults.hardware.modelTypes.model");if(!D.ok)return Me(D.error.message,D.error.field);if(!D.value.modelType||!un(D.value.modelType,d))return Me(`Configured model '${D.value.name}' does not belong to ${ct(d)}.`,"defaults.hardware.modelTypes");return z(D.value)}function nf(d,c,w){let b=d.effective.hardware;if(b.kind==="exact-model")return d.exactModel?z({model:d.exactModel,by:"explicit-model",path:[]}):K("catalog_metadata_invalid","Normalized exact iOS model is missing.");if(b.kind==="model-type"){let k=Ta(b.modelType,c,w);return k.ok?z({model:k.value,by:"model-type-default",path:[ct(b.modelType),k.value.simulatorDeviceTypeIdentifier]}):k}let D=bn(c.hardware.archetypes,(k)=>k.archetype===b.archetype,`model-type default for iOS ${b.archetype}`);if(!D.ok)return D;if(xt(D.value.modelType)!==b.archetype)return Me(`The ${b.archetype} default points to ${ct(D.value.modelType)}.`,"defaults.hardware.archetypes");let C=Ta(D.value.modelType,c,w);return C.ok?z({model:C.value,by:"archetype-default",path:[b.archetype,ct(D.value.modelType),C.value.simulatorDeviceTypeIdentifier]}):C}function Sq(d,c){let w=ni(d);if(w===void 0)return K("unsupported_hardware","The Android request has no classified archetype.");if(w==="foldable"&&!c.hardware.profiles.some((b)=>b.archetype===w))return K("unsupported_hardware","This host has no foldable profile mapped. Configure defaults.android.hardware.profiles with a foldable profileId and classify it in androidProfileArchetypes.");return bn(c.hardware.profiles,(b)=>b.archetype===w,`Android ${w} profile default`)}function Oa(d,c){let w=c.hardware.profiles.filter((D)=>D.profileId===d.profileId),b=w.length>0?w:c.hardware.profiles.filter((D)=>D.archetype===d.archetype);if(b.length>1)return Me(`Conflicting Android ${d.archetype} profile default entries.`,"defaults.hardware.profiles");return z(b[0])}function D7(d,c){let w=d.exactProfile?Oa(d.exactProfile,c):Sq(d,c);return w.ok?z(w.value?.memoryMb):w}function of(d,c,w){let b=ri(d.profileId,w);if(!b.ok)return b;let D=Oa(b.value,c);if(!D.ok)return D;return z({profile:b.value,by:"explicit-model",path:["exact-profile",b.value.profileId],...D.value?.memoryMb===void 0?{}:{memoryMb:D.value.memoryMb}})}function sf(d,c,w){if(d.exactProfile)return of(d.exactProfile,c,w);let b=Sq(d,c);if(!b.ok)return b;let D=b.value.archetype,C=w.profiles.filter((O)=>O.profileId===b.value.profileId);if(C.length===0)return K("unsupported_hardware",`Configured Android ${D} profile '${b.value.profileId}' is not installed. Install it and configure defaults.android.hardware.profiles.`,{field:"defaults.hardware.profiles"});if(C.length>1)return K("catalog_metadata_invalid",`Android profile '${b.value.profileId}' is duplicated in the catalog.`);let k=C[0];if(k.metadataState!=="current"||!k.archetype)return K("catalog_metadata_invalid",`Android profile '${k.profileId}' lacks current archetype metadata.`);if(k.archetype!==D)return Me(`Configured Android profile '${k.profileId}' is ${k.archetype}, not ${D}. Configure defaults.android.hardware.profiles with an installed ${D} profile and check androidProfileArchetypes.`,"defaults.hardware.profiles");return z({profile:{...k,archetype:D},by:"archetype-default",path:[D,k.profileId],...b.value.memoryMb===void 0?{}:{memoryMb:b.value.memoryMb}})}function df(d){return d.filter((c)=>c.installed&&c.metadataState==="current"&&c.osVersion!==void 0&&Uo(c.osVersion).ok)}function lf(d){return d.filter((c)=>c.installed&&c.metadataState==="current"&&c.osVersion!==void 0&&c.apiLevel>0&&c.abi.length>0&&c.flavor.length>0&&Uo(c.osVersion).ok)}function Ma(d,c,w){return d.sort((b,D)=>je(c(D),c(b))||w(b).localeCompare(w(D)))}function uf(d,c,w,b){let C=df(w).filter((M)=>ke(d,M.osVersion));if(C.length===0)return Na(d,w,"ios");if(d.kind!=="exact"){let M=gi(b.minOsVersion,b,"minimum"),F=gi(b.maxOsVersion,b,"maximum");if(M.ok&&F.ok){let q=C.filter((V)=>!La(V.osVersion,M.value,F.value));if(q.length>0)C=q}}let k=Ma(C,(M)=>M.osVersion,(M)=>M.runtimeId);if(d.kind==="exact")return z({release:k[0],by:"exact"});let O=k.find((M)=>je(M.osVersion,c)===0);return z(O?{release:O,by:"preferred-default"}:{release:k[0],by:"highest-satisfying"})}function mf(d,c){let w=Uo(d);if(!w.ok)return!1;return c.some((b)=>{let D=Uo(b.osVersion);if(!D.ok||ai(b.versionPrecision)>=w.value.precision)return!1;let C=ai(b.versionPrecision);return w.value.components.slice(0,C).every((k,O)=>k===(D.value.components[O]??"0"))})}function pf(d){return(c)=>{let w=d.indexOf(c.abi),b=w===-1?d.length:w,D=c.flavor==="google_apis"?"0":"1";return`${String(b).padStart(3,"0")}|${D}|${c.systemImagePackage}`}}function ff(d,c){let w=d.kind==="major"?d.major:Uo(d.version),b=typeof w==="number"?w:w.ok?Number(w.value.components[0]):void 0,D=c.find((C)=>C.apiLevel===b&&Number(C.osVersion.split(".")[0])!==b);return D?K("missing_installed_runtime",`No installed runtime satisfies ${wn(d)}. Android os selectors use the release version (for example 16), not the API level; API level ${D.apiLevel} is Android ${D.osVersion}.`,{field:"os"}):void 0}function gf(d,c,w,b=[]){let D=lf(w),C=D.filter((M)=>ci(d,M.osVersion,M.versionPrecision));if(C.length===0){if(d.kind==="exact"&&mf(d.version,D))return K("unsupported_version_precision",`Installed Android metadata cannot prove exact release '${d.version}'.`,{field:"os.version"});return ff(d,D)??Na(d,w,"android")}let k=Ma(C,(M)=>M.osVersion,pf(b));if(d.kind==="exact")return z({release:k[0],by:"exact"});let O=k.find((M)=>je(M.osVersion,c)===0);return z(O?{release:O,by:"preferred-default"}:{release:k[0],by:"highest-satisfying"})}function wn(d){return d.kind==="major"?`major ${d.major}`:`${d.kind} ${d.version}`}function Na(d,c,w){let b=c.some((C)=>C.installed&&(C.osVersion!==void 0||w==="ios")&&(C.osVersion===void 0||!Uo(C.osVersion).ok||C.metadataState!=="current"&&ke(d,C.osVersion))),D=c.filter((C)=>w==="android"&&C.installed&&C.osVersion===void 0).length;return b?K("catalog_metadata_invalid",`Installed release metadata is stale or incomplete for ${wn(d)}.`):K("missing_installed_runtime",`No installed runtime satisfies ${wn(d)}.${D>0?` ${D} installed system image(s) were skipped because their Android release is not recognized.`:""}`)}function gi(d,c,w){if(d===void 0||d===null)return z(void 0);let b=Uo(d);if(!b.ok)return K("catalog_metadata_invalid",`Model '${c.name}' has a malformed ${w} runtime version.`);return z(b.value.value)}function La(d,c,w){if(c!==void 0&&je(d,c)<0)return!0;return w!==void 0&&je(d,w)>0}function vf(d,c){let w=gi(d.minOsVersion,d,"minimum");if(!w.ok)return w;let b=gi(d.maxOsVersion,d,"maximum");if(!b.ok)return b;if(La(c,w.value,b.value))return K("runtime_incompatible",`Model '${d.name}' is incompatible with iOS ${c}; the exact pair was preserved.`);return z(w.value!==void 0||b.value!==void 0?"supported":"unknown")}function Fa(d,c,w,b){return{original:d.original,effective:d.effective,resolvedHardwareBy:c,resolvedOsBy:b,hardwareDefaultPath:w,...d.provenance.osDefaultArchetype===void 0?{}:{osDefaultArchetype:d.provenance.osDefaultArchetype},policyVersion:d.provenance.policyVersion,catalogSource:d.provenance.catalogSource,catalogRevision:d.provenance.catalogRevision}}function hf(d,c,w){if(d.ok||d.error.code!=="runtime_incompatible"||c.original.os.kind!=="omitted"||c.provenance.osDefaultArchetype!==void 0||w.archetype===void 0)return d;return{ok:!1,error:{...d.error,message:`${d.error.message} The request omitted the OS, so the host's platform default applied; add a defaults.ios.os.archetypes entry for "${w.archetype}" to give that hardware its own OS default, or pass an os selector in the request.`}}}function yf(d,c,w){let b=nf(d,c,w);if(!b.ok)return b;let D=d.provenance.osDefaultArchetype,C=uf(d.effective.os,yn(c,D)?.policy.preferredVersion??c.os.preferredVersion,w.releases,b.value.model);if(!C.ok)return C;let k=vf(b.value.model,C.value.release.osVersion);if(!k.ok)return hf(k,d,b.value.model);let O=b.value.model;if(!O.archetype||!O.modelType)return K("catalog_metadata_invalid",`Model '${O.name}' lost classification.`);let M={platform:"ios",metadataState:"current",simulatorDeviceTypeIdentifier:O.simulatorDeviceTypeIdentifier,...O.modelIdentifier===void 0?{}:{modelIdentifier:O.modelIdentifier},archetype:O.archetype,modelType:O.modelType,runtimeId:C.value.release.runtimeId,osVersion:C.value.release.osVersion,compatibility:k.value};return z({platform:"ios",requirement:d,profile:M,provenance:Fa(d,b.value.by,b.value.path,C.value.by)})}function wf(d,c,w){let b=sf(d,c,w);if(!b.ok)return b;let D=gf(d.effective.os,c.os.preferredVersion,w.releases,w.hostAbis);if(!D.ok)return D;let C=D.value.release,k={platform:"android",metadataState:"current",profileId:b.value.profile.profileId,...b.value.memoryMb===void 0?{}:{memoryMb:b.value.memoryMb},archetype:b.value.profile.archetype,systemImagePackage:C.systemImagePackage,osVersion:C.osVersion,versionPrecision:C.versionPrecision,apiLevel:C.apiLevel,abi:C.abi,flavor:C.flavor};return z({platform:"android",requirement:d,profile:k,provenance:Fa(d,b.value.by,b.value.path,D.value.by)})}function y4(d,c,w){if(d.platform==="ios"&&c.platform==="ios"&&w.platform==="ios")return yf(d,c,w);if(d.platform==="android"&&c.platform==="android"&&w.platform==="android")return wf(d,c,w);return Me("Normalized requirement, defaults, and catalog platforms differ.")}var WI={mode:"none",status:"device_ready"};function v4(d,c){if(c.sessionUuid.length===0)return!1;let{mode:w,status:b}=c.readiness;return d==="watchos"?w===WI.mode&&b===WI.status:w==="automation"&&b==="automation_ready"}function wq(d){return d==="watchos"?"a booted, session-bound state":"automation readiness"}async function O7(d,c,{fingerprint:w,signal:b,exportIdentity:D}){let C=c.device;if(C.platform!=="watchos")throw new t("Watch admission requires a watchOS session request");let k=await d.catalog("watchos",b);if(k.platform!=="watchos")throw new t("The session broker's watch catalog reader returned another platform");let O=AS(gn(C,k));return{requestId:c.requestId,fingerprint:w,parameters:c,owner:d.owner,export:D,limits:d.limits,matches:(M)=>vn(O,JN(M)).kind==="match",resolveCreation:()=>({platform:"watchos",requirement:O,profile:O.profile})}}function qa(d,c){return d&&c&&Mn(c).platform==="watchos"?{readiness:{...WI}}:{}}import{createHash as Sf}from"crypto";var Ku="session_request_abandoned",Sn="Session request was abandoned by its liveness owner",Ha=Object.freeze({internalReceipt:Ku});function zI(d,c){return Sf("sha256").update(Dr({config:d,livenessOwnerToken:c})).digest("hex")}function Va(d){return{fingerprint:zI(Ha,d),parameters:Ha}}function _f(d,c){let w=d.errorCode??"session_preparation_failed",b=d.retryable&&(["eviction_pending","session_broker_stopping"].includes(w)||!c);return{code:w,message:d.error??"",retryable:b,...b&&w==="eviction_pending"?{retryAfterMs:1000}:{},...b&&w==="session_broker_stopping"?{retryAfterMs:Kd}:{},...b&&["capacity_exhausted","cancelled","eviction_pending","session_broker_stopping"].includes(w)?{retryRequires:"new_request_id"}:{}}}function Rq(d){if(d instanceof Zr)return{code:d.code,message:d.message,retryable:d.retryable,remedy:d.remedy,writerVersions:d.writerVersions};return d instanceof ka?d.failure:{code:"session_preparation_failed",message:r(d),retryable:!1}}function b4(d){return d.aborted&&d.reason instanceof Gd}function M7(d,c){if(b4(c))return new ka({code:"session_broker_stopping",retryable:!0,retryAfterMs:Kd,retryRequires:"new_request_id",message:"Session preparation was interrupted because the session broker is stopping; retry with a new request ID against the restarted daemon."});if(d instanceof ka||!c.aborted)return d;return new ka({code:"cancelled",retryable:!0,message:`Session preparation was cancelled: ${r(c.reason)}`})}function Pq(d,c){return{contractVersion:1,requestId:d.requestId,outcome:"failed",sessionUuid:null,profile:null,cleanupPending:!1,failure:c}}function sm(d,c){return d.daemonId===c.daemonId&&d.pid===c.pid&&d.processGenerationToken===c.processGenerationToken}function N7(d,c,w){if(d instanceof VI)return e.warn(`Session ${c} clean release exhausted capacity wait: ${d.message}`),"destroy";if(d instanceof Un)return e.warn(`Session ${c} clean release awaits boot capacity: ${r(d)}`),"pending";e.warn(`Session ${c} could not finish its clean release: ${r(d)}`);let b=PS(d);if(b==="permanent"||!w&&b==="unknown")return"destroy";return"pending"}function F7(d,c,w){let b=c?.requestId===d.requestId&&["destroying","resetting","unknown"].includes(c.state),D=d.errorCode===Ku&&w,C=Boolean(b||D);return{contractVersion:1,requestId:d.requestId,outcome:d.state==="active"?"ready":d.state==="failed"?"failed":d.state==="released"?"released":"pending",sessionUuid:d.sessionId,profile:c?Mn(c):null,...qa(d.state==="active",c),cleanupPending:C,...d.timing?{timing:d.timing}:{},...d.error?{failure:_f(d,C)}:{}}}function L7(d,c,w){return d.errorCode===Ku?c:{...c,failure:{...w,retryable:Boolean(c.failure?.retryable),...c.failure?.retryAfterMs!==void 0?{retryAfterMs:c.failure.retryAfterMs}:{},...c.failure?.retryRequires?{retryRequires:c.failure.retryRequires}:{}}}}async function Wa(d,c){return(await d.selectFrom("session_broker_requests").select(({fn:b})=>b.countAll().as("count")).where("state","!=","released").where("request_id","!=",c).where(({or:b,eb:D,exists:C,selectFrom:k})=>b([D("state","!=","failed"),C(k("session_broker_resources").select("resource_id").whereRef("session_broker_resources.resource_id","=","session_broker_requests.resource_id").whereRef("session_broker_resources.request_id","=","session_broker_requests.request_id").where("session_broker_resources.state","!=","destroyed"))])).executeTakeFirstOrThrow()).count}function _n(d){return d.filter((c)=>c.state!=="destroyed").map((c)=>({id:c.resourceId,state:c.state,idleOrder:c.idleOrder,compatible:!1}))}class _i extends t{reset;constructor(d,c,w){super(d,w);this.reset=c}}function Rf(d,c,w,{kind:b,now:D,creationProfile:C}){if(b==="wait"||d.admission!=="wait"&&d.admission!=="reuse"&&(b!=="reuse"||d.admission!=="evict-then-create"))return{};let k={...d,admission:b==="evict"?"evict-then-create":b,reuseCount:b==="reuse"?w.reuseCount??0:0,admissionWaitMs:D-d.startedAtMs,totalMs:D-d.startedAtMs,...b==="reuse"?{createMs:0,bootMs:0}:{}};return{timing_json:JSON.stringify({...c.timing,acquisition:k}),timing_profile_json:JSON.stringify(Mn(b==="evict"?{profile:C}:w)),timing_updated_at_ms:D}}function Dn(d,c,w,b){let{kind:D,now:C,creationProfile:k}=b;if(d.timingStartedAtMs===void 0)return{};let O=c.timing?.acquisition;if(O)return Rf(O,c,w,b);let M={admission:D==="evict"?"evict-then-create":D,reuseCount:D==="reuse"?w.reuseCount??0:0,outcome:"pending",startedAtMs:d.timingStartedAtMs,queueMs:0,admissionWaitMs:C-d.timingStartedAtMs,totalMs:C-d.timingStartedAtMs,...D==="reuse"?{createMs:0,bootMs:0}:{}};return{timing_json:JSON.stringify({acquisition:M}),timing_profile_json:JSON.stringify(Mn(D==="evict"?{profile:k}:w)),timing_updated_at_ms:C}}function Ga(d,c,w,b){let D=d.timing?.acquisition;if(!D)return{};let C={...D,...w,...D.admission==="reuse"?{createMs:0,bootMs:0}:{},reuseCount:c.reuseCount??0,outcome:"ready",completedAtMs:b,totalMs:b-D.startedAtMs};return{timing_json:JSON.stringify({...d.timing,acquisition:C}),timing_profile_json:JSON.stringify(Mn(c)),timing_updated_at_ms:b}}class S4{store;timer;constructor(d,c){this.store=d;this.timer=c}async recordFailedAcquisition(d){try{let c=d.timing?.acquisition;if(!c||c.outcome!=="pending")return!0;let w={...c,outcome:"failed",completedAtMs:this.timer.now(),totalMs:this.timer.now()-c.startedAtMs};return await this.store.recordTiming(d.requestId,{acquisition:w}),d.timing={...d.timing,acquisition:w},e.info(`[SessionBroker] acquisition ${JSON.stringify({requestId:d.requestId,profile:d.timingProfile,...w})}`),!0}catch(c){return e.warn(`Could not record failed acquisition ${d.requestId}`,c),!1}}async recordRefusedAdmission(d){if(d.kind==="refused")await this.recordFailedAcquisition(d.request)}logReadyAcquisition(d,c){let w=d.timing?.acquisition;if(!w)return;e.info(`[SessionBroker] acquisition ${JSON.stringify({requestId:d.requestId,profile:Mn(c),...w})}`)}initialResetTiming(d,c){return{mode:"none",outcome:"pending",phases:{},reuseCount:c.reuseCount??0,startedAtMs:this.timer.now(),totalMs:0}}async recordResetTiming(d,c,w){try{if((await this.store.getResource(c.resourceId))?.state==="destroyed")w=vi(w,this.timer.now());if(w.totalMs=this.timer.now()-w.startedAtMs,w.outcome!=="pending")w.completedAtMs=this.timer.now();return await this.store.recordTiming(d.requestId,{reset:w},Mn(c)),e.info(`[SessionBroker] reset ${JSON.stringify({requestId:d.requestId,profile:Mn(c),...w})}`),!0}catch(b){return e.warn(`Could not record reset timing ${d.requestId}`,b),!1}}mergeResetTiming(d,c){return typeof c==="object"?{...d,...c,phases:{...d.phases,...c.phases}}:{...d,outcome:c}}failedResetTiming(d,c){return{...c instanceof _i?this.mergeResetTiming(d,c.reset):d,outcome:"pending",fallbackReason:r(c)}}}function vi(d,c){return{...d,outcome:"destroyed",retired:!0,completedAtMs:c,totalMs:c-d.startedAtMs}}var Re=T().finite().nonnegative(),yi=T().finite(),Df=g({acquisition:g({admission:A(["reuse","create","evict-then-create","wait"]),reuseCount:Re.int(),outcome:A(["pending","ready","failed"]),startedAtMs:yi,completedAtMs:yi.optional(),queueMs:Re,admissionWaitMs:Re,createMs:Re.optional(),bootMs:Re.optional(),automationReadyMs:Re.optional(),totalMs:Re}).optional(),reset:g({mode:A(["keep-booted","minimal","erase","snapshot","wipe-data","none"]),outcome:A(["clean","pending","destroyed","fallback:keep-booted","fallback:minimal","fallback:erase","fallback:snapshot","fallback:wipe-data"]),retired:ee().optional(),phases:Ct(y(),Re),fallbackReason:y().optional(),reuseCount:Re.int(),startedAtMs:yi,completedAtMs:yi.optional(),totalMs:Re}).optional()}),Pf=g({timing:Df,profile:ln.optional()});function wi(d,c){try{let w=Pf.safeParse({timing:JSON.parse(d),...c?{profile:JSON.parse(c)}:{}});if(w.success)return w.data;e.warn("Ignoring invalid session broker timing receipt",w.error);return}catch(w){e.warn("Ignoring corrupt session broker timing JSON",w);return}}async function ge(d,c){let w=await d.selectFrom("session_broker_requests").selectAll().where("request_id","=",c).executeTakeFirst();return w&&Pe(w)}async function Le(d,c){let w=await d.selectFrom("session_broker_resources").selectAll().where("resource_id","=",c).executeTakeFirst();return w&&Bt(w)}function Pe(d){let c=d.timing_json?wi(d.timing_json,d.timing_profile_json):void 0,{restartHandoff:w,...b}=JSON.parse(d.owner_json);return{requestId:d.request_id,fingerprint:d.fingerprint,parameters:JSON.parse(d.parameters_json),owner:b,...w===!0?{restartHandoff:!0}:{},state:d.state,resourceId:d.resource_id,sessionId:d.session_id,error:d.error,errorCode:d.error_code,retryable:d.retryable===1,...c?{timing:c.timing,timingProfile:c.profile}:{}}}function Bt(d){return{resourceId:d.resource_id,allocationIndex:d.allocation_index,scopeKey:d.scope_key,profile:JSON.parse(d.profile_json),state:d.state,requestId:d.request_id,revision:d.revision,idleOrder:d.idle_order,reuseCount:d.reuse_count}}class Si{db;clock;constructor(d,c){this.db=d;this.clock=c}async recordTiming(d,c,w){let b=async(D)=>{let C=await ge(D,d);if(!C)return;if(c.acquisition?.outcome==="failed"&&(C.state!=="failed"||C.timing?.acquisition?.outcome==="ready"))return;let k=await this.finalResetTiming(D,C,c.reset);await D.updateTable("session_broker_requests").set({timing_json:JSON.stringify({...C.timing,...c,...k?{reset:k}:{}}),...w?{timing_profile_json:JSON.stringify(w)}:{},timing_updated_at_ms:this.clock.now()}).where("request_id","=",d).execute()};await(this.db.isTransaction?b(this.db):this.db.transaction().execute(b))}async finalResetTiming(d,c,w){if(!w||!c.resourceId)return w;let b=await Le(d,c.resourceId);return b?.requestId===c.requestId&&b.state==="destroyed"?vi(w,this.clock.now()):w}async timingSamples(d,c,w){return(await this.db.selectFrom("session_broker_requests").select(["timing_json","timing_profile_json"]).where("timing_updated_at_ms",">=",d).where("timing_updated_at_ms","<=",c).where("timing_json","is not",null).where("timing_profile_json","is not",null).orderBy("timing_updated_at_ms","desc").orderBy("request_id").limit(w).execute()).flatMap((D)=>{let C=wi(D.timing_json,D.timing_profile_json);return C?.profile?[{timing:C.timing,profile:C.profile}]:[]})}async confirmDestroyed(d,c){if(!c)return;let w=await ge(d,c);if(w?.timing?.reset&&w.timing.reset.outcome!=="destroyed")await d.updateTable("session_broker_requests").set({timing_json:JSON.stringify({...w.timing,reset:vi(w.timing.reset,this.clock.now())}),timing_updated_at_ms:this.clock.now()}).where("request_id","=",w.requestId).execute()}}function ja(d){return d==="released"||d==="failed"}function Pn(d,c,w){return Boolean(d?.stable_device_id&&d.state==="ready"&&d.exec_session_uuid===c&&d.exec_owner_daemon_id===w.daemonId&&d.exec_owner_pid===w.pid&&d.exec_owner_process_token===(w.processGenerationToken??null))}function In(d){return{daemonId:d.daemonId,pid:d.pid,...d.processGenerationToken===void 0?{}:{processGenerationToken:d.processGenerationToken}}}function pe(d,c){if(d===void 0||d===null)throw new Ee(c);return d}var QN=15552000000;class Wy extends t{code="session_export_identity_mismatch";constructor(){super("Session export identity, digest, or liveness owner does not match the request")}}function dc(d){return{resourceId:d.resourceId,revision:d.revision}}function Ka(d,c){return d.state==="idle"&&(!c||c.some((w)=>w.resourceId===d.resourceId&&w.revision===d.revision))}var za=["released","failed"];async function An(d,c){let w=await d.selectFrom("session_broker_exports").selectAll().where("prepare_id","=",c).executeTakeFirst();return w&&{prepareId:w.prepare_id,requestId:w.request_id,requestDigest:w.request_digest,createdAtMs:w.created_at_ms,acknowledgedAtMs:w.acknowledged_at_ms}}async function Xa(d,c,w){return await d.updateTable("session_broker_exports").set({acknowledged_at_ms:w}).where("prepare_id","=",c).where("acknowledged_at_ms","is",null).execute(),An(d,c)}async function Qa(d,c,w,{fingerprint:b,identity:D}){let C=async(k)=>{let O=await k.selectFrom("session_broker_requests").select("fingerprint").where("request_id","=",w).executeTakeFirst();if(!O||O.fingerprint!==b)throw new Wy;await ut(k,w,D,c)};await(d.isTransaction?C(d):d.transaction().execute(C))}async function ut(d,c,w,b){if(!w)return;let D=await d.selectFrom("session_broker_exports").selectAll().where((C)=>C.or([C("request_id","=",c),C("prepare_id","=",w.prepareId)])).execute();if(D.length>0){if(D.length!==1||D[0].request_id!==c||D[0].prepare_id!==w.prepareId||D[0].request_digest!==w.requestDigest)throw new Wy;return}await d.insertInto("session_broker_exports").values({prepare_id:w.prepareId,request_id:c,request_digest:w.requestDigest,created_at_ms:b,acknowledged_at_ms:null}).execute()}async function Za(d,c,w,{limit:b,exportRetentionMs:D=QN}){if(!Number.isFinite(w)||w<0||!Number.isFinite(D)||D<0||!Number.isInteger(b)||b<1)throw new t("Receipt retention needs a non-negative window and a positive limit");let C=async(k)=>{let O=c.now();await k.updateTable("session_broker_requests").set({terminal_at_ms:O}).where("state","in",za).where("terminal_at_ms","is",null).execute();let F=(await k.selectFrom("session_broker_requests").select("request_id").where("state","in",za).where("terminal_at_ms","<=",O-w).where(({not:q,exists:V,selectFrom:U})=>q(V(U("session_broker_exports").select("prepare_id").whereRef("session_broker_exports.request_id","=","session_broker_requests.request_id").where("acknowledged_at_ms","is",null).where("created_at_ms",">",O-D)))).where(({not:q,exists:V,selectFrom:U})=>q(V(U("session_broker_resources").select("session_broker_resources.resource_id").whereRef("session_broker_resources.request_id","=","session_broker_requests.request_id").where("session_broker_resources.state","!=","destroyed")))).orderBy("terminal_at_ms").orderBy("request_id").limit(b).execute()).map((q)=>q.request_id);if(F.length===0)return await Ri(k),0;return await k.updateTable("session_broker_resources").set({request_id:null}).where("request_id","in",F).execute(),await k.deleteFrom("session_broker_exports").where("request_id","in",F).execute(),await k.deleteFrom("session_broker_requests").where("request_id","in",F).execute(),await Ri(k),F.length};return d.isTransaction?C(d):d.transaction().execute(C)}async function Ri(d,c){await d.deleteFrom("session_broker_resources").where("state","=","destroyed").where("request_id","is",null).$if(c!==void 0,(w)=>w.where("resource_id","=",c)).where(({not:w,exists:b,selectFrom:D})=>w(b(D("session_broker_requests").select("request_id").whereRef("session_broker_requests.resource_id","=","session_broker_resources.resource_id")))).execute()}var am="session_owner_exited",Aq="Session owner exited before relinquishing its device; cleanup remains owned by the broker",B7="No preparation budget remains";var Cf=new Set(["reserved","active","idle","resetting","destroying","unknown"]);function Di(d,c){if(!Number.isInteger(d)||d<0)throw TypeError(`${c} must be an integer greater than or equal to zero`)}function td(d){if(typeof d!=="object"||d===null)throw TypeError("limits must be an object");if(d.sessionCap!==void 0)Di(d.sessionCap,"limits.sessionCap");if(d.totalDeviceCap!==void 0)Di(d.totalDeviceCap,"limits.totalDeviceCap");if(d.idlePoolCap!==void 0)Di(d.idlePoolCap,"limits.idlePoolCap");if(d.maxConcurrentResetBoots!==void 0&&(!Number.isSafeInteger(d.maxConcurrentResetBoots)||d.maxConcurrentResetBoots<1))throw TypeError("limits.maxConcurrentResetBoots must be a positive integer")}function Af(d,c){let w=`snapshot.resources[${c}]`;if(typeof d!=="object"||d===null)throw TypeError(`${w} must be an object`);if(typeof d.id!=="string"||d.id.trim().length===0)throw TypeError(`${w}.id must be a non-blank string`);if(!Cf.has(d.state))throw TypeError(`${w}.state is invalid`);if(typeof d.idleOrder!=="number"||!Number.isFinite(d.idleOrder))throw TypeError(`${w}.idleOrder must be a finite number`);if(typeof d.compatible!=="boolean")throw TypeError(`${w}.compatible must be a boolean`);if(d.expectedReadyMs!==void 0&&(!Number.isFinite(d.expectedReadyMs)||d.expectedReadyMs<0))throw TypeError(`${w}.expectedReadyMs must be nonnegative and finite`)}function rd(d){if(typeof d!=="object"||d===null)throw TypeError("snapshot must be an object");if(Di(d.activeOrAcquiringSessions,"snapshot.activeOrAcquiringSessions"),!Array.isArray(d.resources))throw TypeError("snapshot.resources must be an array");if(d.resetWaitThresholdMs!==void 0&&(!Number.isFinite(d.resetWaitThresholdMs)||d.resetWaitThresholdMs<0))throw TypeError("snapshot.resetWaitThresholdMs must be nonnegative and finite");let c=new Set;for(let w=0;w<d.resources.length;w+=1){let b=d.resources[w];if(Af(b,w),c.has(b.id))throw TypeError(`snapshot.resources contains duplicate id '${b.id}'`);c.add(b.id)}}function Ef(d,c){return d.idleOrder-c.idleOrder||d.id.localeCompare(c.id)}function xn(d){return d.resources.filter((c)=>c.state==="idle").sort(Ef)}function ed(d){return xn(d)[0]}function xf(d){return xn(d).filter((c)=>c.compatible).sort((c,w)=>w.idleOrder-c.idleOrder||c.id.localeCompare(w.id))[0]}function Tf(d,c){return c.totalDeviceCap===0?void 0:xf(d)}function nd(d,c){if(td(c),rd(d),c.sessionCap!==void 0&&d.activeOrAcquiringSessions>=c.sessionCap)return{kind:"refuse",reason:"session-cap-reached"};let w=Tf(d,c);if(w)return{kind:"reuse",resourceId:w.id};return Bf(d,c)??kf(d,c)}function Bf(d,c){if(c.totalDeviceCap===0)return;let w=d.resources.filter((b)=>b.state==="resetting"&&b.compatible&&d.resetWaitThresholdMs!==void 0&&d.resetWaitThresholdMs>0&&b.expectedReadyMs!==void 0&&b.expectedReadyMs>0&&b.expectedReadyMs<=d.resetWaitThresholdMs).sort((b,D)=>b.expectedReadyMs-D.expectedReadyMs||b.id.localeCompare(D.id))[0];if(w&&d.resetWaitThresholdMs>0)return{kind:"wait",resourceId:w.id,waitMs:Math.min(w.expectedReadyMs,d.resetWaitThresholdMs)};return}function kf(d,c){let w=d.resources.length;if(c.totalDeviceCap!==void 0&&w>c.totalDeviceCap){let D=ed(d);return D?{kind:"evict",resourceId:D.id}:{kind:"refuse",reason:"total-device-cap-exceeded"}}if(c.totalDeviceCap===void 0||w<c.totalDeviceCap)return{kind:"create"};let b=ed(d);return b?{kind:"evict",resourceId:b.id}:{kind:"refuse",reason:"total-device-cap-reached"}}function ad(d,c){td(c),rd(d);let w=xn(d),b=c.totalDeviceCap===void 0?0:Math.max(0,d.resources.length-c.totalDeviceCap),D=c.idlePoolCap===void 0?0:Math.max(0,w.length-c.idlePoolCap),C=Math.max(b,D);return w.slice(0,C).map((k)=>k.id)}class Tn{db;scopeKey;isOwnerLive;timingStore;ids;clock;write;constructor(d,c,w,{ids:b=B,clock:D=i,write:C=(k)=>k(d)}={}){this.db=d;this.scopeKey=c;this.isOwnerLive=w;this.ids=b,this.clock=D,this.write=C,this.timingStore=new Si(d,D)}async getRequest(d){return ge(this.db,d)}recordTiming(d,c,w){return this.write((b)=>new Si(b,this.clock).recordTiming(d,c,w))}timingSamples(d,c,w){return this.timingStore.timingSamples(d,c,w)}getExport(d){return An(this.db,d)}acknowledgeExport(d,c=this.clock.now()){return this.write((w)=>Xa(w,d,c))}linkRequestExport(d,c,w){return this.write((b)=>Qa(b,this.clock.now(),d,{fingerprint:c,identity:w}))}async getSession(d){let c=await this.db.selectFrom("session_broker_requests").selectAll().where("session_id","=",d).executeTakeFirst();return c&&Pe(c)}async listResources(d){if(d!==void 0){let c=await Le(this.db,d);return c?[c]:[]}return this.readResources(this.db)}async getResource(d){return(await this.listResources(d))[0]}listLiveResources(){return this.readResources(this.db,!0)}async listRequests(){return(await this.db.selectFrom("session_broker_requests").selectAll().execute()).map(Pe)}async listRecoverableRequests(){return(await this.db.selectFrom("session_broker_requests").selectAll().where((c)=>c.or([c("state","in",["acquiring","active","releasing"]),c.and([c("state","=","failed"),c("error_code","=",Ku),c("session_id","is not",null),c.exists(c.selectFrom("session_broker_resources").select("session_broker_resources.resource_id").whereRef("session_broker_resources.resource_id","=","session_broker_requests.resource_id").where("session_broker_resources.state","!=","destroyed"))])])).execute()).map(Pe)}pruneTerminalRequests(d,c,w){return this.write((b)=>Za(b,this.clock,d,{limit:c,exportRetentionMs:w}))}writeTransaction(d){return this.write((c)=>c.isTransaction?d(c):c.transaction().execute(d))}async recordPreAdmissionFailure(d,c){if(!d.requestId.trim()||!d.fingerprint.trim())throw new t("Session request identity and fingerprint must be non-empty");return this.writeTransaction(async(w)=>{let b=await ge(w,d.requestId);if(b){if(b.fingerprint!==d.fingerprint)throw new t("Session request identity was already used with different parameters");return await ut(w,d.requestId,d.export,this.clock.now()),b}let D=await w.insertInto("session_broker_requests").values({request_id:d.requestId,fingerprint:d.fingerprint,parameters_json:JSON.stringify(d.parameters),owner_json:JSON.stringify(d.owner),state:"failed",resource_id:null,session_id:null,error:c.message,error_code:c.code,retryable:c.retryable?1:0,terminal_at_ms:this.clock.now()}).returningAll().executeTakeFirstOrThrow();return await ut(w,d.requestId,d.export,this.clock.now()),Pe(D)})}async admit(d){if(!d.requestId.trim()||!d.fingerprint.trim())throw new t("Session request identity and fingerprint must be non-empty");return this.writeTransaction(async(c)=>{let w=await ge(c,d.requestId);if(w){if(w.fingerprint!==d.fingerprint)throw new t("Session request identity was already used with different parameters");return await ut(c,d.requestId,d.export,this.clock.now()),{kind:"existing",request:w}}let b=await c.insertInto("session_broker_requests").values({request_id:d.requestId,fingerprint:d.fingerprint,parameters_json:JSON.stringify(d.parameters),owner_json:JSON.stringify(d.owner),state:"acquiring",resource_id:null,session_id:null,error:null,error_code:null,retryable:null,terminal_at_ms:null}).returningAll().executeTakeFirstOrThrow();return await ut(c,d.requestId,d.export,this.clock.now()),this.reserve(c,Pe(b),d)})}async abandon(d,c,w){if(!d.trim()||!w)throw new t("Session request identity and liveness owner token are required");return this.writeTransaction(async(b)=>{let D=await ge(b,d);if(!D){let O=Va(w),M=await b.insertInto("session_broker_requests").values({request_id:d,fingerprint:O.fingerprint,parameters_json:JSON.stringify(O.parameters),owner_json:JSON.stringify(c),state:"failed",resource_id:null,session_id:null,error:Sn,error_code:Ku,retryable:0,terminal_at_ms:this.clock.now()}).returningAll().executeTakeFirstOrThrow();return{request:Pe(M)}}if(D.fingerprint!==zI(D.parameters,w))throw new t("Session request belongs to another liveness owner");if(D.state==="released"||D.state==="failed")return{request:D,...await this.currentDestructionTicket(b,D)};if(!sm(D.owner,c))throw new RS(D.restartHandoff===!0);let C;if(D.resourceId){let O=await this.ownedResource(b,D);if(O.state!=="destroyed"){let M=O.state==="destroying"?O:await this.updateResource(b,O,{state:"destroying"});C=dc(M)}}return{request:await this.updateRequest(b,d,{state:"failed",error:Sn,error_code:Ku,retryable:0}),...C?{ticket:C}:{}}})}async continueAdmission(d){return this.writeTransaction(async(c)=>{let w=await this.ownedRequest(c,d.requestId,d.owner);if(w.fingerprint!==d.fingerprint||w.state!=="acquiring")throw new t("Cannot continue a changed or terminal session request");if(w.resourceId===null)return this.reserve(c,w,d);let b=pe(await Le(c,pe(w.resourceId,"No admission eviction to resume")),"Admission resource disappeared");if(b.state!=="destroyed"||b.requestId!==w.requestId)throw new t("Admission must wait for confirmed eviction before reserving another device");return this.reserve(c,w,d)})}async activate(d,c,w,b){if(!w.trim())throw new t("A prepared session must have a non-empty session UUID");return this.writeTransaction(async(D)=>{let C=await this.ownedRequest(D,d,c);if(C.state==="active"&&C.sessionId===w)return C;let k=await this.ownedResource(D,C);if(C.state!=="acquiring"||k.state!=="reserved")throw new t("Only the current acquiring request can activate a reservation");let O=await D.selectFrom("slot_assignments").selectAll().where("scope_key","=",k.scopeKey).where("slot_index","=",k.allocationIndex).executeTakeFirst();if(!Pn(O,w,c))throw new t("Prepared session does not own the current physical device binding");return await this.updateResource(D,k,{state:"active",...aa(k,b?.profile)}),this.updateRequest(D,d,{state:"active",session_id:w,...Ga(C,k,b,this.clock.now())})})}async beginRelease(d,c){return this.writeTransaction(async(w)=>{let b=await w.selectFrom("session_broker_requests").selectAll().where("session_id","=",d).executeTakeFirst();if(!b)return;if(b.state==="released"||b.state==="failed")return Pe(b);let D=await this.ownedRequest(w,b.request_id,c);if(D.state!=="active")return D;let C=await this.ownedResource(w,D);if(C.state!=="active")throw new t("Active session lost its resource ownership");return await this.updateResource(w,C,{state:"resetting"}),this.updateRequest(w,D.requestId,{state:"releasing"})})}async completeCleanRelease(d,c,w){return this.writeTransaction(async(b)=>{let D=await this.ownedRequest(b,d,c);if(D.state==="released")return[];let C=await this.ownedResource(b,D);if(D.state!=="releasing"||C.state!=="resetting")throw new Ee("Only a joined, resetting session can return a clean device");let k=await b.selectFrom("slot_assignments").selectAll().where("scope_key","=",C.scopeKey).where("slot_index","=",C.allocationIndex).executeTakeFirst(),O=await this.openJournal(b,C);if(!k?.stable_device_id||k.state!=="ready"||k.exec_session_uuid||O)throw new Ee("Physical device still has execution or journal work; it cannot enter the idle pool");let F=(await this.readResources(b,!0)).reduce((q,V)=>Math.max(q,V.idleOrder),0)+1;return await this.updateResource(b,C,{state:"idle",request_id:null,idle_order:F}),await this.updateRequest(b,d,{state:"released"}),this.trimIdle(b,w,C.resourceId,d)})}async fail(d,c,w,{errorCode:b="session_preparation_failed",retryable:D=!1}={}){return this.failWhere(d,c,{error:w,errorCode:b,retryable:D})}async failInterruptedAcquisition(d,c,w){return this.failWhere(d,c,{error:w,errorCode:"session_preparation_failed",retryable:!1,onlyFrom:"acquiring"})}async failWhere(d,c,w){let{error:b,errorCode:D,retryable:C,onlyFrom:k}=w;return this.writeTransaction(async(O)=>{let M=await this.ownedRequest(O,d,c);if(M.state==="released"||M.state==="failed"||k!==void 0&&M.state!==k)return;let F;if(M.resourceId){let q=await this.ownedResource(O,M);if(q.state!=="destroyed")F=dc(await this.updateResource(O,q,{state:"destroying"}))}return await this.updateRequest(O,d,{state:"failed",error:b,error_code:D,retryable:C?1:0}),F})}async releaseByDestruction(d,c){return this.writeTransaction(async(w)=>{let b=await this.ownedRequest(w,d,c);if(b.state==="released"||b.state==="failed")return;if(b.state!=="releasing")throw new t("Session must relinquish its execution before destruction");let D=await this.ownedResource(w,b);if(D.state==="destroying")return dc(D);return dc(await this.updateResource(w,D,{state:"destroying"}))})}async drainIdle(d){return this.writeTransaction(async(c)=>{let w=await this.readResources(c,!0),b=[];for(let D of w.filter((C)=>Ka(C,d)))b.push(dc(await this.updateResource(c,D,{state:"destroying"})));return b})}async confirmDestroyed(d){return this.writeTransaction(async(c)=>{let w=await Le(c,d.resourceId);if(!w||w.revision!==d.revision)return!1;if(w.state==="destroyed")return!0;if(w.state!=="destroying")return!1;if(await this.physicalWorkPending(c,w))return!1;if(await c.updateTable("session_broker_resources").set({state:"destroyed"}).where("resource_id","=",w.resourceId).execute(),w.requestId)await this.settleRequestAfterDestruction(c,w);else await Ri(c,w.resourceId);return await this.timingStore.confirmDestroyed(c,w.requestId),!0})}async recoverRequest(d,c){return this.writeTransaction(async(w)=>{let b=pe(await ge(w,d),"Unknown session request");if(sm(b.owner,c)||this.isOwnerLive(b.owner))return;if(b.state==="released"||b.state==="failed")return;let D;if(b.resourceId){let C=await this.ownedResource(w,b);if(C.state!=="destroyed")D=dc(b.state==="releasing"&&C.state==="destroying"?C:await this.updateResource(w,C,{state:"destroying"}))}return await this.updateRequest(w,d,{owner_json:JSON.stringify(c),state:b.state==="releasing"?"releasing":"failed",error:b.state==="releasing"?null:Aq,error_code:b.state==="releasing"?null:am}),D})}async relinquishForRestart(d,c){return this.writeTransaction(async(w)=>{let b=await this.ownedRequest(w,d,c);if(b.state!=="active"||b.restartHandoff)return b;return this.updateRequest(w,d,{owner_json:JSON.stringify({...In(b.owner),restartHandoff:!0})})})}async adoptRestartHandoff(d,c){return this.writeTransaction(async(w)=>{let b=pe(await ge(w,d),"Unknown session request");if(!b.restartHandoff||b.state!=="active"||!b.sessionId)return"not-handoff";if(sm(b.owner,c))return"adopted";if(this.isOwnerLive(b.owner))return"pending";let D=await this.ownedResource(w,b),C=await w.selectFrom("slot_assignments").selectAll().where("scope_key","=",D.scopeKey).where("slot_index","=",D.allocationIndex).executeTakeFirst();if(D.state!=="active"||!Pn(C,b.sessionId,c))return"pending";return await this.updateRequest(w,d,{owner_json:JSON.stringify(In(c))}),"adopted"})}async settleRequestAfterDestruction(d,c){let w=await ge(d,pe(c.requestId,"No request"));if(w?.resourceId!==c.resourceId)return;if(w.state==="releasing")await this.updateRequest(d,w.requestId,{state:"released"});else if(w.state==="failed")await d.updateTable("session_broker_requests").set({terminal_at_ms:this.clock.now()}).where("request_id","=",w.requestId).execute()}async reserve(d,c,w){let b=await this.readResources(d,!0),D=await Wa(d,c.requestId),C=nd({activeOrAcquiringSessions:D,resetWaitThresholdMs:w.resetReadiness?.thresholdMs,resources:_n(b).map((M)=>({...M,compatible:(M.state==="idle"||M.state==="resetting")&&w.matches(pe(b.find((F)=>F.resourceId===M.id),"Missing resource").profile),expectedReadyMs:w.resetReadiness?.canWait?.(M.id)===!1?void 0:w.resetReadiness?.expectedReadyMs.get(M.id)}))},w.limits);if(C.kind==="wait"){w.resetReadiness?.reserveWait?.(c.requestId,C.resourceId);let M=pe(b.find((F)=>F.resourceId===C.resourceId),"Waiting resource disappeared");return{...C,request:await this.updateRequest(d,c.requestId,{...Dn(w,c,M,{kind:"wait",now:this.clock.now()})})}}if(C.kind==="refuse")return{kind:"refused",reason:C.reason,request:await this.updateRequest(d,c.requestId,{state:"failed",error:C.reason,error_code:"capacity_exhausted",retryable:1})};let k,O=C.kind==="reuse"?void 0:w.resolveCreation();if(C.kind==="create"){let M=await d.insertInto("session_broker_resources").values({resource_id:this.ids.next(),scope_key:this.scopeKey,profile_json:JSON.stringify(O),state:"reserved",request_id:c.requestId,revision:1,idle_order:0}).returningAll().executeTakeFirstOrThrow();k=Bt(M)}else{let M=pe(b.find((F)=>F.resourceId===C.resourceId),"Admission resource disappeared");k=await this.updateResource(d,M,{state:C.kind==="reuse"?"reserved":"destroying",request_id:c.requestId,reuse_count:(M.reuseCount??0)+(C.kind==="reuse"?1:0)})}return{kind:C.kind,resource:k,request:await this.updateRequest(d,c.requestId,{resource_id:k.resourceId,...Dn(w,c,k,{kind:C.kind,now:this.clock.now(),creationProfile:O})})}}async trimIdle(d,c,w,b){let D=await this.readResources(d,!0),C=ad({activeOrAcquiringSessions:0,resources:_n(D)},c),k=[];for(let O of C){let M=pe(D.find((q)=>q.resourceId===O),"Idle resource disappeared"),F=M.resourceId===w&&b?{state:"destroying",request_id:b}:{state:"destroying"};k.push(dc(await this.updateResource(d,M,F)))}return k}async currentDestructionTicket(d,c){if(!c.resourceId)return{};let w=await Le(d,c.resourceId);return w?.requestId===c.requestId&&w.state==="destroying"?{ticket:dc(w)}:{}}async openJournal(d,c){return d.selectFrom("slot_journal").select("id").where("scope_key","=",c.scopeKey).where("slot_index","=",c.allocationIndex).where("phase","not in",["committed","rolled_back"]).executeTakeFirst()}async physicalWorkPending(d,c){let w=await d.selectFrom("slot_assignments").select(["stable_device_id","exec_session_uuid","state"]).where("scope_key","=",c.scopeKey).where("slot_index","=",c.allocationIndex).executeTakeFirst(),b=await this.openJournal(d,c);return Boolean(w?.stable_device_id||w?.exec_session_uuid||w?.state==="settling"||w?.state==="cleanup_pending"||b)}async readResources(d,c=!1){return(await d.selectFrom("session_broker_resources").selectAll().$if(c,(b)=>b.where("state","!=","destroyed")).orderBy("allocation_index").execute()).map(Bt)}async ownedRequest(d,c,w){let b=pe(await ge(d,c),"Unknown session request");if(!sm(b.owner,w))throw new RS(b.restartHandoff===!0);return b}async ownedResource(d,c){let w=pe(await Le(d,pe(c.resourceId,"Request has no device reservation")),"Request resource disappeared");if(w.requestId!==c.requestId)throw new Ee("Session request no longer owns this device reservation");return w}async updateResource(d,c,w){let b=await d.updateTable("session_broker_resources").set({...w,revision:c.revision+1}).where("resource_id","=",c.resourceId).returningAll().executeTakeFirstOrThrow();return Bt(b)}async updateRequest(d,c,w){let b=ja(w.state)?{terminal_at_ms:this.clock.now()}:{},D=await d.updateTable("session_broker_requests").set({...w,...b}).where("request_id","=",c).returningAll().executeTakeFirstOrThrow();return Pe(D)}}var kt=ts("state",[s({state:_("absent")}),s({state:_("present"),value:Op()}),s({state:_("unobservable")})]);function xi(d){let c=kt.safeParse({state:"present",value:d});return c.success?c.data:{state:"unobservable"}}function eu(d,c){if([d.deviceId,d.incarnation,...c===void 0?[]:[c]].some((b)=>b.trim().length===0))throw new t("Device mutation journal requires a durable, non-empty identity")}var Bn=s({completeKinds:S(n().min(1)),observations:S(s({kind:n().min(1),key:n().min(1),value:kt})),unobservable:S(n().min(1)),unobservableReasons:Ne(n(),n()).optional()}),kS=["installed-app","app-group","keychain","permission","device-setting","keep-awake","rotation","screen-reader","clipboard","location","status-bar","notification","media","contact","calendar","keyboard","clock","network-condition","biometric-enrollment","profile","certificate","opened-url","preference","shared-file","account"];var Tq="fallback:";function Nn(...d){return`${Tq}${JSON.stringify(d)}`}function ES(d){return d.kind==="opaque"&&d.key.startsWith(Tq)}class kn{db;timer;constructor(d,c){this.db=d;this.timer=c}async record(d,c){eu(d,d.sessionUuid),await this.db.insertInto("device_mutation_journal").values({session_uuid:d.sessionUuid,device_id:d.deviceId,incarnation:d.incarnation,kind:c.kind,mutation_key:c.key,prior_value_json:JSON.stringify(kt.parse(c.priorValue)),applied_at_ms:this.timer.now(),tool_name:c.toolName}).onConflict((w)=>w.columns(["session_uuid","device_id","incarnation","kind","mutation_key"]).doNothing()).execute()}list(d){return this.listIncarnations(d,"=")}listStrayIncarnations(d){return this.listIncarnations(d,"!=")}async listIncarnations(d,c){return eu(d,d.sessionUuid),(await this.db.selectFrom("device_mutation_journal").selectAll().where("session_uuid","=",d.sessionUuid).where("device_id","=",d.deviceId).where("incarnation",c,d.incarnation).orderBy("sequence","asc").execute()).map((b)=>({sequence:b.sequence,kind:b.kind,key:b.mutation_key,priorValue:kt.parse(JSON.parse(b.prior_value_json)),appliedAt:b.applied_at_ms,toolName:b.tool_name}))}async deleteSession(d){eu(d,d.sessionUuid),await this.db.deleteFrom("device_mutation_journal").where("session_uuid","=",d.sessionUuid).where("device_id","=",d.deviceId).where("incarnation","=",d.incarnation).execute()}async captureBaseline(d,c){eu(d),await this.db.insertInto("device_mutation_baselines").values({device_id:d.deviceId,incarnation:d.incarnation,baseline_json:JSON.stringify(Bn.parse(c)),captured_at_ms:this.timer.now()}).onConflict((w)=>w.columns(["device_id","incarnation"]).doNothing()).execute()}async getBaseline(d){eu(d);let c=await this.db.selectFrom("device_mutation_baselines").select("baseline_json").where("device_id","=",d.deviceId).where("incarnation","=",d.incarnation).executeTakeFirst();return c?Bn.parse(JSON.parse(c.baseline_json)):null}async deleteResource(d){eu({deviceId:d,incarnation:d});let c=m`incarnation = ${d} OR CASE WHEN json_valid(incarnation) THEN json_extract(incarnation, '$[0]') = ${d} ELSE 0 END`;await this.db.transaction().execute(async(w)=>{await w.deleteFrom("device_mutation_journal").where(c).execute(),await w.deleteFrom("device_mutation_baselines").where(c).execute()})}}class On{db;constructor(d){this.db=d}async withLegacyRows(d){let c=await this.db.introspection.getTables();if(!c.some((U)=>U.name==="slot_free_devices"))return;let w=c.some((U)=>U.name==="slot_journal"),b=async(U)=>{let W=(await m`SELECT * FROM slot_scopes ORDER BY scope_key`.execute(U)).rows,G=(await m`SELECT * FROM slot_assignments WHERE role <> ${eh} ORDER BY scope_key, slot_index`.execute(U)).rows,Z=(await m`SELECT * FROM slot_free_devices ORDER BY platform, stable_device_id`.execute(U)).rows,ie=w?(await m`SELECT * FROM slot_journal WHERE ${St}
|
|
157
|
-
ORDER BY id`.execute(U)).rows:[],fe=(await m`
|
|
158
|
-
SELECT * FROM slot_assignments WHERE role = ${eh} ORDER BY scope_key, slot_index`.execute(U)).rows;return{scopes:W,assignments:G,free:Z,journals:ie,brokerDevices:fe}},D=await b(this.db),{assignments:C,free:k,journals:O,brokerDevices:M}=D,F=[],q=[],V=(U,W,G)=>{if(W!==null&&W!==void 0)q.push({daemonId:U??"legacy",pid:W,processGenerationToken:G??null})};for(let U of C){if(U.stable_device_id!==null||U.device_name!==null)F.push({platform:U.platform,stableId:U.stable_device_id,name:U.device_name});V(U.exec_owner_daemon_id,U.exec_owner_pid,U.exec_owner_process_token),V(U.settler_daemon_id,U.settler_pid,U.settler_process_token)}for(let U of k)F.push({platform:U.platform,stableId:U.stable_device_id,name:null}),V(U.deletion_owner_daemon_id,U.deletion_owner_pid,U.deletion_owner_process_token);for(let U of O.filter((W)=>!["committed","rolled_back"].includes(W.phase))){V(U.owner_daemon_id,U.owner_pid,U.owner_process_token);let W=nt(U.target_json);for(let G of[{platform:U.platform,stableId:U.binding_stable_device_id,name:W.oldName},{platform:U.platform,stableId:W.oldStableId,name:W.oldName},{platform:W.newPlatform??U.platform,stableId:W.newStableId,name:W.newName}])if(G.stableId||G.name)F.push(G)}if(F.some((U)=>M.some((W)=>Of(U,W))))throw new t("Legacy retirement overlaps a broker device; reconcile the duplicate legacy row before retrying");await d({devices:F,owners:q},async()=>{await this.db.transaction().execute(async(U)=>{if(JSON.stringify(await b(U))!==JSON.stringify(D))throw new t("Legacy registry rows changed during retirement; retry daemon startup");await m`DELETE FROM slot_free_devices`.execute(U),await Yt(U,{hasJournal:w,hasBrokerResources:c.some((W)=>W.name==="session_broker_resources")})})})}}function Of(d,c){if(d.platform!==c.platform)return!1;if(d.stableId)return d.stableId===c.stable_device_id;return d.name!==null&&d.name===c.device_name}async function dd(d,c,w){if(w.migrate===!1)await Zs(d,c);else await ea(d,c,()=>w.legacyDeviceRetirement?.retire(new On(d))??Promise.resolve(),{writerVersion:w.writerVersion??Cn()})}function Mf(d=process.platform){return{isRunning:(c)=>at(c),readGenerationToken:(c)=>{if(d==="linux")return Gg(c);if(d==="darwin")return Yg(c);return}}}function w4(d=Mf()){return(c)=>{if(!d.isRunning(c.pid))return!1;let w=c.processGenerationToken;if(!w)return!0;let b=d.readGenerationToken(c.pid);if(b===void 0)return!0;return Ya(w,b)!=="different"}}var lc=w4();class cd{ids=new Set;add(d){this.ids.add(d)}delete(d){this.ids.delete(d)}has(d){return this.ids.has(d)}}var e0=new cd;function kq(d,c,w={}){let b=(w.thisProcess??{pid:process.pid}).pid,D=w.reservations??e0;return(C)=>{let k="sessionUuid"in C&&typeof C.sessionUuid==="string"?C.sessionUuid:null;if(k!==null&&D.has(k))return!0;if(k!==null&&C.pid===b)return c.isLiveManagedExecutionSession(k)||(c.hasSession?.(k)??!1);return d(C)||k!==null&&c.isLiveManagedExecutionSession(k)}}function Eq(d=bf,c=process.pid){return{pid:c,processGenerationToken:d()??null}}function ud(d){let{Database:c}=wt("bun:sqlite");class w extends c{exec(b){if(b==="PRAGMA optimize;"||b==="PRAGMA wal_checkpoint(TRUNCATE);")return;super.exec(b)}}return new w(d)}class Ln extends rE{get supportsTransactionalDdl(){return!0}}class Fn extends PO{createAdapter(){return new Ln}}function md({db:d,sqlite:c,dbPath:w}){return(b)=>{if(c)return d.transaction().execute((D)=>{let C=c.prepare("SELECT name FROM kysely_migration ORDER BY name");try{let k=C.all().map((O)=>{if(typeof O!=="object"||O===null||!("name"in O)||typeof O.name!=="string")throw Error("Invalid binding registry migration name");return O.name}).filter((O)=>!Object.hasOwn(_t,O));if(k.length>0)throw new Zr(w,k,zs(D,c,k))}finally{C.finalize()}return b(D)});return d.transaction().execute(async(D)=>(await Pt(D,w),b(D)))}}var $f="registry",Uf="slots.sqlite";function IS(d=process.env,c){return Ff($u(Os,$f,d,c),Uf)}function th(d=IS()){return Nf(d)}var R4=Math.min(250,G$);function qf(d){let c=ud(d);try{c.exec(`PRAGMA busy_timeout = ${R4};`),c.exec("PRAGMA journal_mode = WAL;"),c.exec("PRAGMA synchronous = FULL;"),c.exec("PRAGMA foreign_keys = ON;")}catch(w){throw c.close(),w}return c}async function _S(d={}){let c=d.dbPath??IS();if(!iE(c))ec(Lf(c));let w,b=new Mc({dialect:new Fn({database:()=>w=qf(c),retry:{maxAttempts:1}})});try{await dd(b,c,d)}catch(D){if(await b.destroy(),Ja(D)==="retryable")throw new is(r(D));throw D}return new pd(b,d,c,w)}class pd{db;dbPath;timer;isExecOwnerLive;claims;writeTransaction;constructor(d,c={},w=":memory:",b){this.db=d;this.dbPath=w;this.timer=c.timer??i,this.isExecOwnerLive=c.isExecOwnerLive??lc,this.writeTransaction=md({db:d,sqlite:b,dbPath:w}),this.claims=new on(this.db,(D)=>this.writeTransaction(D))}assertSupportedSchema(){return Pt(this.db,this.dbPath)}describeSchema(){return Qs(this.db)}sessionBrokerStore(d,c){return new Tn(this.db,d,this.isExecOwnerLive,{ids:c,clock:this.timer,write:(w)=>this.writeTransaction(w)})}avdSnapshotCleanupRegistry(){return new rn(this.db)}deviceMutationJournal(){return new kn(this.db,this.timer)}deviceClaims(){return this.claims}async ensureScope(d){let c=zd(d);return this.writeTransaction(async(w)=>{let b=this.timer.now(),D=await this.readScope(w,c);if(D?.state==="valid")return await w.updateTable("slot_scopes").set({last_acquired_at_ms:b}).where("scope_key","=",c).execute(),{kind:"ready",scope:{...D,lastAcquiredAtMs:b},created:!1,revived:!1};if(D&&D.invalidationReason!=="abandoned")return{kind:"scope_invalidated",scope:D};let C=await w.selectFrom("slot_scopes").selectAll().where("managed_host_scope","=",d.managedHostScope).where("runner_namespace","=",d.runnerNamespace).where("state","<>","invalidated").where("scope_key","<>",c).executeTakeFirst();if(C)return{kind:"incarnation_conflict",current:At(C)};if(D){let O=await w.updateTable("slot_scopes").set({state:"valid",invalidation_reason:null,invalidating_at_ms:null,invalidated_at_ms:null,last_acquired_at_ms:b}).where("scope_key","=",c).returningAll().executeTakeFirstOrThrow();return{kind:"ready",scope:At(O),created:!1,revived:!0}}let k={scope_key:c,managed_host_scope:d.managedHostScope,runner_namespace:d.runnerNamespace,runner_incarnation:d.runnerIncarnation,state:"valid",invalidation_reason:null,created_at_ms:b,last_acquired_at_ms:b,last_released_at_ms:null,invalidating_at_ms:null,invalidated_at_ms:null};return await w.insertInto("slot_scopes").values(k).execute(),{kind:"ready",scope:At(k),created:!0,revived:!1}})}async getScope(d){return this.readScope(this.db,d)}async initBinding(d,c){Ae(d);let w=dt(c.requestedSpec);return this.writeTransaction(async(b)=>{let D=await this.readScope(b,d.scopeKey);if(D?.state!=="valid")return{kind:"scope_not_valid",scope:D};let C=await this.readAssignment(b,d);if(C)return{kind:"ready",assignment:C,created:!1};let k={scope_key:d.scopeKey,slot_index:d.bindingIndex,role:c.role,platform:c.platform,generation:0,stable_device_id:null,device_name:null,requested_spec_json:w,resolved_spec_json:null,spec_fingerprint:null,state:"provisioning",exec_owner_daemon_id:null,exec_owner_pid:null,exec_owner_process_token:null,exec_session_uuid:null,...Et(null),updated_at_ms:this.timer.now()};return await b.insertInto("slot_assignments").values(k).execute(),{kind:"ready",assignment:de(k),created:!0}})}async removeUnboundBinding(d,c){return Ae(d),this.writeTransaction(async(w)=>{if(await this.readOpenJournal(w,d))return!1;return(await w.deleteFrom("slot_assignments").where("scope_key","=",d.scopeKey).where("slot_index","=",d.bindingIndex).where("generation","=",c.generation).where("stable_device_id","is",null).where("state","=","provisioning").where("exec_owner_daemon_id","is",null).where("exec_owner_pid","is",null).where("exec_owner_process_token","is",null).where("exec_session_uuid","is",null).executeTakeFirst()).numDeletedRows>0n})}async commitBinding(d,c,w){return Ae(d),this.writeTransaction((b)=>this.commitBindingIn(b,d,c,{next:w}))}async commitBindingIn(d,c,w,{next:b,journaled:D=!1}){let C=b.resolvedSpec===null||b.resolvedSpec===void 0?null:dt(b.resolvedSpec),k=b.requestedSpec===void 0?void 0:dt(b.requestedSpec),O=await this.checkBinding(d,c,w,{journaled:D});if("kind"in O)return O;let M=qs(O,b);if(b.stableDeviceId!==null){let V=await d.selectFrom("slot_assignments").selectAll().where("platform","=",M).where("stable_device_id","=",b.stableDeviceId).where((U)=>U.or([U("scope_key","<>",c.scopeKey),U("slot_index","<>",c.bindingIndex)])).executeTakeFirst();if(V)return{kind:"device_assigned_elsewhere",holder:de(V)}}let F=b.stableDeviceId!==O.stableDeviceId||M!==O.platform,q=await d.updateTable("slot_assignments").set({generation:O.generation+1,platform:M,stable_device_id:b.stableDeviceId,device_name:b.deviceName,resolved_spec_json:C,spec_fingerprint:b.specFingerprint,state:b.state,...Et(null),...k===void 0?{}:{requested_spec_json:k},...F?{exec_owner_daemon_id:null,exec_owner_pid:null,exec_owner_process_token:null,exec_session_uuid:null}:{},updated_at_ms:this.timer.now()}).where("scope_key","=",c.scopeKey).where("slot_index","=",c.bindingIndex).returningAll().executeTakeFirstOrThrow();return{kind:"committed",assignment:de(q)}}async updateBindingState(d,c,w,b){Ae(d);let D=Mr(w,b);return this.writeTransaction((C)=>this.updateBindingStateIn(C,d,c,{state:w,settler:D}))}async updateBindingStateIn(d,c,w,{state:b,settler:D,journaled:C=!1}){let k=await this.checkBinding(d,c,w,{journaled:C});if("kind"in k)return k;let O=k.execOwner;if(b==="replacing"&&O&&this.isExecOwnerLive(O))return{kind:"binding_in_use",owner:O,assignment:k};let M=Ms(k.state,b)?k.generation+1:k.generation,F=await d.updateTable("slot_assignments").set({state:b,generation:M,...Et(D),updated_at_ms:this.timer.now()}).where("scope_key","=",c.scopeKey).where("slot_index","=",c.bindingIndex).returningAll().executeTakeFirstOrThrow();return{kind:"updated",assignment:de(F)}}async claimExecution(d,c,w,b={}){return Ae(d),this.writeTransaction(async(D)=>{let C=await this.checkBinding(D,d,c,{journaled:!1,claimingSessionUuid:w.sessionUuid});if("kind"in C)return C;if(C.state!=="ready"||C.stableDeviceId===null)return{kind:"binding_not_ready",assignment:C};let k=C.execOwner;if(k&&k.sessionUuid!==w.sessionUuid&&k.sessionUuid!==b.supersedesSessionUuid&&this.isExecOwnerLive(k))return{kind:"binding_in_use",owner:k,assignment:C};let O=await D.updateTable("slot_assignments").set({exec_owner_daemon_id:w.daemonId,exec_owner_pid:w.pid,exec_owner_process_token:w.processGenerationToken??null,exec_session_uuid:w.sessionUuid,updated_at_ms:this.timer.now()}).where("scope_key","=",d.scopeKey).where("slot_index","=",d.bindingIndex).returningAll().executeTakeFirstOrThrow();return{kind:"claimed",assignment:de(O)}})}async releaseExecution(d,c){return Ae(d),this.writeTransaction(async(w)=>{let b=await w.updateTable("slot_assignments").set({exec_owner_daemon_id:null,exec_owner_pid:null,exec_owner_process_token:null,exec_session_uuid:null,updated_at_ms:this.timer.now()}).where("scope_key","=",d.scopeKey).where("slot_index","=",d.bindingIndex).where("exec_session_uuid","=",c).returningAll().executeTakeFirst();if(b)return await w.updateTable("slot_scopes").set({last_released_at_ms:b.updated_at_ms}).where("scope_key","=",d.scopeKey).execute(),{released:!0,assignment:de(b)};return{released:!1,assignment:await this.readAssignment(w,d)}})}async recoverSettledBindings(d){return this.writeTransaction(async(c)=>{let w=c.selectFrom("slot_assignments").selectAll().where("state","=","settling");if(d!==void 0)w=w.where("scope_key","=",d);let b=(await w.orderBy("scope_key").orderBy("slot_index").execute()).map(de).filter((C)=>this.isSettled(C)),D=[];for(let C of b){let k=await c.updateTable("slot_assignments").set({state:"ready",...Et(null),updated_at_ms:this.timer.now()}).where("scope_key","=",C.scopeKey).where("slot_index","=",C.bindingIndex).where("generation","=",C.generation).where("state","=","settling").returningAll().executeTakeFirstOrThrow();D.push(de(k))}return D})}async getAssignment(d){return Ae(d),this.readAssignment(this.db,d)}async listAssignments(d){return(await this.db.selectFrom("slot_assignments").selectAll().where("scope_key","=",d).orderBy("slot_index").execute()).map(de)}async findExecutionAssignments(d){return(await this.db.selectFrom("slot_assignments").selectAll().where("exec_session_uuid","=",d).orderBy("scope_key").orderBy("slot_index").execute()).map(de)}async findDeviceHolder(d,c){let w=await this.db.selectFrom("slot_assignments").selectAll().where("platform","=",d).where("stable_device_id","=",c).executeTakeFirst();if(w){let b=await this.readScope(this.db,w.scope_key);if(b)return{kind:"binding",scope:b,assignment:de(w)}}return null}async isDeviceAssignedToValidBinding(d,c){return await this.db.selectFrom("slot_assignments").innerJoin("slot_scopes","slot_scopes.scope_key","slot_assignments.scope_key").select("slot_assignments.slot_index").where("slot_assignments.platform","=",d).where("slot_assignments.stable_device_id","=",c).where("slot_scopes.state","=","valid").executeTakeFirst()!==void 0}async snapshotManagedDevices(){return(await this.snapshotResources()).managed}async snapshotBindingResources(){return this.snapshotResources()}async snapshotResources(){let d=this.db.selectFrom("slot_assignments").innerJoin("slot_scopes","slot_scopes.scope_key","slot_assignments.scope_key").select(["slot_assignments.platform as platform","slot_assignments.stable_device_id as stable_device_id","slot_assignments.scope_key as scope_key","slot_assignments.slot_index as slot_index","slot_assignments.exec_session_uuid as exec_session_uuid","slot_scopes.state as scope_state"]).where("slot_assignments.stable_device_id","is not",null).where((k)=>k.or([k("slot_scopes.state","<>","invalidated"),k("slot_scopes.invalidation_reason","=","abandoned")])),c=await this.db.selectNoFrom([cn(d).$castTo().as("assigned"),cn(this.db.selectFrom("slot_journal").select(["id","scope_key","slot_index","kind","phase","platform","from_generation","to_generation","binding_generation","binding_stable_device_id","target_json","owner_daemon_id","owner_pid","owner_process_token","attempts","last_error","next_attempt_at_ms","created_at_ms","updated_at_ms"]).where("phase","not in",rt)).$castTo().as("pending")]).executeTakeFirstOrThrow(),w=JSON.parse(c.assigned),D=JSON.parse(c.pending).map(be),C=[...w.flatMap((k)=>k.stable_device_id===null?[]:[{platform:k.platform,stableDeviceId:k.stable_device_id,holder:"session_broker",scopeKey:k.scope_key,bindingIndex:k.slot_index,scopeState:k.scope_state,execSessionUuid:k.exec_session_uuid}])];return{managed:[...C,...Fs(D,C)],openJournal:D}}async openBindingJournal(d,c){Ae(d),ra(c.phase);let w=dt(c.target);return this.writeTransaction(async(b)=>{let D=this.timer.now();await b.deleteFrom("slot_journal").where("phase","in",[...rt]).where("updated_at_ms","<",D-Ls).execute();let C=await this.readOpenJournal(b,d);if(C)return{kind:"journal_open",entry:C};let k=await this.applyJournalAssignmentChange(b,d,c.assignment);if("kind"in k)return k;let O=await b.insertInto("slot_journal").values({scope_key:d.scopeKey,slot_index:d.bindingIndex,kind:c.kind,phase:c.phase,platform:k.platform,from_generation:c.assignment.expected.generation,to_generation:k.generation===c.assignment.expected.generation?null:k.generation,binding_generation:k.generation,binding_stable_device_id:k.stableDeviceId,target_json:w,owner_daemon_id:c.owner.daemonId,owner_pid:c.owner.pid,owner_process_token:c.owner.processGenerationToken??null,attempts:0,last_error:null,next_attempt_at_ms:D,created_at_ms:D,updated_at_ms:D}).returningAll().executeTakeFirstOrThrow();return{kind:"opened",entry:be(O),assignment:k}})}async advanceBindingJournal(d,c){return this.writeTransaction(async(w)=>{let b=await w.selectFrom("slot_journal").selectAll().where("id","=",d).executeTakeFirst(),D=b?be(b):null;if(!D||!bA(D.phase)||D.phase!==c.expectedPhase||!Uc(D.owner,c.owner))return{kind:"journal_conflict",entry:D};let C=null;if(c.assignment){if(!jd(D.binding,c.assignment.expected))return{kind:"journal_conflict",entry:D};let O=await this.applyJournalAssignmentChange(w,D,c.assignment);if("kind"in O)return O;C=O}let k=await w.updateTable("slot_journal").set(ia(D,c,C,this.timer.now())).where("id","=",d).returningAll().executeTakeFirstOrThrow();return{kind:"advanced",entry:be(k),assignment:C}})}async claimBindingJournal(d,c,w){return this.writeTransaction(async(b)=>{let D=await b.selectFrom("slot_journal").selectAll().where("id","=",d).executeTakeFirst(),C=D?be(D):null;if(!C||!bA(C.phase)||!Uc(C.owner,c))return{kind:"journal_conflict",entry:C};let k=await b.updateTable("slot_journal").set({owner_daemon_id:w.daemonId,owner_pid:w.pid,owner_process_token:w.processGenerationToken??null,updated_at_ms:this.timer.now()}).where("id","=",d).returningAll().executeTakeFirstOrThrow();return{kind:"claimed",entry:be(k)}})}async getBindingJournal(d){let c=await this.db.selectFrom("slot_journal").selectAll().where("id","=",d).executeTakeFirst();return c?be(c):null}async listOpenBindingJournal(d){let c=this.db.selectFrom("slot_journal").selectAll().where("phase","not in",[...rt]);if(d)c=c.where("scope_key","=",d.scopeKey).where("slot_index","=",d.bindingIndex);return(await c.orderBy("next_attempt_at_ms").orderBy("id").execute()).map(be)}async close(){await this.db.destroy()}async readOpenJournal(d,c){let w=await d.selectFrom("slot_journal").selectAll().where("scope_key","=",c.scopeKey).where("slot_index","=",c.bindingIndex).where("phase","not in",[...rt]).executeTakeFirst();return w?be(w):null}async applyJournalAssignmentChange(d,c,w){let b=w.kind==="commit"?await this.commitBindingIn(d,c,w.expected,{next:w.next,journaled:!0}):await this.updateBindingStateIn(d,c,w.expected,{state:w.state,settler:Mr(w.state,w.options),journaled:!0});return b.kind==="committed"||b.kind==="updated"?b.assignment:b}async readScope(d,c){let w=await d.selectFrom("slot_scopes").selectAll().where("scope_key","=",c).executeTakeFirst();return w?At(w):null}async readAssignment(d,c){let w=await d.selectFrom("slot_assignments").selectAll().where("scope_key","=",c.scopeKey).where("slot_index","=",c.bindingIndex).executeTakeFirst();return w?de(w):null}async checkBinding(d,c,w,{journaled:b=!1,claimingSessionUuid:D}={}){let C=await this.readScope(d,c.scopeKey),k=await this.readAssignment(d,c);if(!$s(C,b)&&!(D!==void 0&&Us(C,k,D)))return{kind:"scope_not_valid",scope:C};if(!k)return{kind:"binding_missing"};if(!yq(k,w))return{kind:"stale_binding",current:k};return k}async hasLiveExecOwner(d,c){return(await d.selectFrom("slot_assignments").selectAll().where("scope_key","=",c).where((b)=>b.or([b("exec_session_uuid","is not",null),b("state","=","settling")])).execute()).some((b)=>!this.isSettled(de(b)))}isSettled(d){let{settler:c,execOwner:w}=d;return(c===null||!this.isExecOwnerLive(c))&&(w===null||!this.isExecOwnerLive(w))}}var qn=new Hf;function t0(d,c){return qn.run({scopeKey:d.scopeKey,bindingIndex:d.bindingIndex},c)}function SA(){return qn.getStore()}function Vf(d){let c=qn.getStore();if(!c)return!1;return d.scopeKey===c.scopeKey&&d.bindingIndex===c.bindingIndex}function $7(d,c){let w=d?.holderOf(c.device);if(!w)return;if(w.holder==="session_broker"&&w.execSessionUuid!==null&&c.requesterSessionUuid===w.execSessionUuid)return;if(Vf(w))return;return new mi(c.action,c.deviceId,w)}function fd(d,c){return JSON.stringify([d,c])}var gd=new Set,$n=new WeakMap;async function Yd(d,c={}){try{await d.refresh({...c,requireCurrent:!0})}catch(w){if(!(w instanceof Zr))throw w;e.debug(`[Bindings] Allocation using claim files: ${r(w)}`),await d.refresh(c)}}class vd{openRegistry;timer;registryExists;snapshot;readFailed=!1;inFlight;registry;warnedUpgradePending=!1;unsupportedSchema;constructor(d,c,w=()=>!0){this.openRegistry=d;this.timer=c;this.registryExists=w}async refresh(d={}){if(this.unsupportedSchema&&(d.requireCurrent||d.refuseUpgradePending))throw this.unsupportedSchema;if(d.fresh||!this.snapshotIsYoung(d.maxAgeMs??0))await this.reload(d);if(d.refuseUpgradePending&&this.snapshot?.kind==="absent"&&this.snapshot.upgradePending)throw new is("registry upgrade pending")}async reload(d){try{await(d.fresh?this.refreshFresh():this.loadShared())}catch(c){if(c instanceof Zr){if(d.requireCurrent||d.refuseUpgradePending)throw c;let w={code:c.code,retryable:c.retryable,mode:"files_only",dbPath:c.dbPath,unknownMigrations:c.unknownMigrations,writerVersions:c.writerVersions,remedy:c.remedy};if(this.snapshot={kind:"files_only",loadedAtMs:this.timer.now(),diagnostic:w},this.readFailed=!1,!gd.has(c.dbPath))gd.add(c.dbPath),e.warn(`[Bindings] Registry at ${c.dbPath} has migrations unknown to this daemon: ${c.unknownMigrations.join(", ")}. Bindings and device_claims rows are not consulted or written; allocation claim files decide ownership. Managed bindings are not enforced in this mode, so this daemon can allocate a device held only by a managed binding. ${c.remedy}`);return}if(d.requireCurrent||this.snapshot?.kind!=="loaded"||!(c instanceof is))throw c;e.debug(`[Bindings] Using retained exclusion snapshot: ${r(c)}`)}}snapshotIsYoung(d){return this.unsupportedSchema===void 0&&d>0&&this.snapshot!==void 0&&this.snapshot.kind!=="unreadable"&&this.timer.now()-this.snapshot.loadedAtMs<d}loadShared(){return this.inFlight??=this.load().finally(()=>{this.inFlight=void 0}),this.inFlight}freshWaiter;refreshFresh(){if(this.freshWaiter)return this.freshWaiter;let d=this.inFlight;if(!d)return this.loadShared();let c=()=>(this.freshWaiter=void 0,this.loadShared()),w=d.then(c,c);return this.freshWaiter=w,w}degraded(){return this.snapshot?.kind==="files_only"?this.snapshot.diagnostic:void 0}lastReadFailed(){return this.readFailed}holderOf(d){if(this.snapshot?.kind!=="loaded")return;let c=this.snapshot.byDevice;for(let w of d.stableIds){let b=w?c.get(fd(d.platform,w)):void 0;if(b)return b}return}stableIdsFor(d){return this.snapshot?.kind==="loaded"?this.snapshot.byPlatform.get(d)??new Set:new Set}async load(){if(this.unsupportedSchema)throw this.unsupportedSchema;let d,c;if(this.registry===void 0&&!this.registryExists()){this.snapshot={kind:"absent",loadedAtMs:this.timer.now()},this.readFailed=!1;return}try{c=await this.openRegistryOnce(),await c.assertSupportedSchema(),d=await c.snapshotManagedDevices()}catch(D){if(D instanceof Zr)throw this.unsupportedSchema=D,await this.dropUnsupportedRegistry(c,D),D;if(D instanceof Zt){if(!this.warnedUpgradePending)e.warn("[Bindings] Registry upgrade pending; treating exclusion as absent until retirement completes",D),this.warnedUpgradePending=!0;this.snapshot={kind:"absent",loadedAtMs:this.timer.now(),upgradePending:!0},this.readFailed=!1;return}if(this.readFailed=!0,this.snapshot?.kind==="loaded")e.warn(`[Bindings] Registry unreadable; keeping the last snapshot: ${r(D)}`,D);else this.snapshot={kind:"unreadable"};throw new is(r(D))}let w=new Map,b=new Map;for(let D of d){w.set(fd(D.platform,D.stableDeviceId),D);let C=b.get(D.platform)??new Set;C.add(D.stableDeviceId),b.set(D.platform,C)}this.snapshot={kind:"loaded",byDevice:w,byPlatform:b,loadedAtMs:this.timer.now()},this.readFailed=!1}async openRegistryOnce(){this.registry??=this.openRegistry().catch((w)=>{throw this.registry=void 0,w});let d=await this.registry,c=$n.get(d);if(c)throw c;return d}async dropUnsupportedRegistry(d,c){if(this.registry=void 0,!d)return;if(Ue?.handle===d)Ue=void 0;if($n.has(d))return;$n.set(d,c);try{await d.close()}catch(w){e.warn("[Bindings] Failed to close unsupported registry",w)}}}var Ue;function wA(d,c={}){return new vd(()=>{if(!Ue){let w={promise:(c.openRegistry?.()??_S({migrate:!1})).then((b)=>(w.handle=b,b),(b)=>{if(Ue===w)Ue=void 0;throw b})};Ue=w}return Ue.promise},d,()=>Ue!==void 0||(c.registryExists??th)())}import{join as bv}from"path";import{closeSync as Wf,linkSync as Gf,openSync as jf,readFileSync as Kf,unlinkSync as Jf,writeSync as zf}from"fs";import{dirname as Xf,join as mt}from"path";var Yf=60000,hd=300000,yd=15*B3,Qf=Math.ceil(hd/yd)+1,Ot="device-allocations";function P4(d,c=process.env,w){return mt($u(sg(c),Ot,c,w),Um(d))}function Zf(d){let c;try{c=Kf(d,"utf-8").trim()}catch(w){return e.debug(`claim file ${d} not readable: ${r(w)}`),!1}return c.length===0||Number.isNaN(ks(c).pid)}var eg=0;function tg(d,c){let w=`${d}.${c.pid}.${++eg}.tmp`,b=jf(w,"wx",384);try{zf(b,Jg(c.pid,c.ownerToken,c.metadata))}finally{Wf(b)}try{return Gf(w,d),!0}catch(D){if(D.code==="EEXIST")return!1;throw D}finally{try{Jf(w)}catch(D){e.debug(`claim temp ${w} cleanup failed: ${r(D)}`)}}}var wd={leasePath:(d)=>mt(wP($3),Um(d)),claimPath:(d)=>P4(d),read:(d)=>xl(d),isUnreadable:(d)=>Zf(d),isProcessRunning:(d)=>at(d),tryAcquire:(d,c)=>(ec(Xf(d)),tg(d,c)),takeOver:(d,c,w)=>nE(d,c,w),release:(d,c)=>ki(d,c.pid,c.ownerToken)},ig="ios-simulators";function A4(d,c=process.env,w){return mt($u(ig,Ot,c,w),Um(d))}var r0={...wd,leasePath:()=>{return},claimPath:(d)=>A4(d)},rg="watch-simulators";function ng(d,c=process.env,w){return mt($u(rg,Ot,c,w),Um(d))}var U7={...r0,claimPath:(d)=>ng(d)},ag="tv-simulators";function dg(d,c=process.env,w){return mt($u(ag,Ot,c,w),Um(d))}var H7={...r0,claimPath:(d)=>dg(d)},cg="vision-simulators";function lg(d,c=process.env,w){return mt($u(cg,Ot,c,w),Um(d))}var q7={...r0,claimPath:(d)=>lg(d)};class rh{selfPid;source;probe;owners=new Map;unreadable=new Set;idleLeaseHolders=new Map;unanswered=new Map;ownerToken=B.next();claimMirror;timer;forwardEvidence;ownerSocketPath;constructor(d=process.pid,c=wd,w=new Hw,{ownerSocketPath:b=nz,timer:D=i,forwardEvidence:C}={}){this.selfPid=d;this.source=c;this.probe=w;this.ownerSocketPath=b,this.timer=D,this.forwardEvidence=C}async refresh(d,c){c?.throwIfAborted();let w=await l(Promise.all(d.map(async(b)=>[b,await this.readOwnerWithForwardEvidence(b,c)])),{timer:this.timer,signal:c,label:"Foreign ownership refresh"});c?.throwIfAborted();for(let[b,{pid:D,forwardUnreadable:C}]of w){if(D===void 0)this.owners.delete(b);else this.owners.set(b,D);if(D===void 0&&(C||this.hasUnreadableClaim(b)))this.unreadable.add(b);else this.unreadable.delete(b)}}async readOwnerWithForwardEvidence(d,c){let w=await l(this.readForeignOwner(d),{timer:this.timer,signal:c,label:"Foreign ownership files"});if(c?.throwIfAborted(),w!==void 0)return{pid:w,forwardUnreadable:!1};return this.readForwardEvidence(d,c)}async readForwardEvidence(d,c){let w=await this.forwardEvidence?.read(d,c);if(!w||w.kind==="none")return{pid:void 0,forwardUnreadable:!1};if(w.ports.length===0){if(w.kind==="unknown")e.warn(`[DevicePool] Cannot inspect CtrlProxy forwards for ${d}: ${w.message}`);return{pid:void 0,forwardUnreadable:!1}}if(this.idleLeaseHolders.delete(d),w.kind==="foreign")return{pid:w.clientPids[0],forwardUnreadable:!1};return{pid:void 0,forwardUnreadable:!0}}foreignClaimUnreadable(d){return this.unreadable.has(d)}attachClaimMirror(d){this.claimMirror=d}async relinquishIdleLease(d){let c=this.idleLeaseHolders.get(d);if(c===void 0||!this.probe.requestRelinquish)return;let w=await this.probe.requestRelinquish(c,d);e.info(`[DevicePool] Asked the idle forwarding-lease holder of ${d} to relinquish it: `+(w.kind==="relinquish"?`${w.result.released?"released":"kept"} (${w.result.reason})`:`${w.kind} (${w.detail})`)),await this.refresh([d])}hasUnreadableClaim(d){let c=this.resolvePath(()=>this.source.claimPath(d),d);return c!==void 0&&this.source.isUnreadable?.(c)===!0}foreignOwnerPid(d){return this.owners.get(d)}async claim(d){let c=this.claimOwner(),w=await this.claimInTable(d,c);if(w!==void 0)return w;let b=await this.claimFile(d,c);if(b==="claimed")this.claimMirror?.claimed(d,c,()=>this.claimFileIsOurs(d,c),(D)=>this.isLiveTableOwner(d,D));return b!=="refused"}async claimInTable(d,c){let w=this.claimMirror?.acquire?.bind(this.claimMirror);if(!w)return;if(await this.fileClaimOwner(d)!==void 0||this.hasUnreadableClaim(d))return!1;let b=await w(d,c,(D)=>this.isLiveTableOwner(d,D));if(b.outcome==="unavailable")return;if(b.outcome==="refused")return this.owners.set(d,b.ownerPid),!1;if(await this.claimFile(d,c)==="refused")return this.claimMirror?.released(d,c),!1;return!0}async isLiveTableOwner(d,c){return await this.evaluateContent({pid:c.pid,metadata:c.metadata},d,"claim")!==void 0}async fileClaimOwner(d){let c=this.resolvePath(()=>this.source.claimPath(d),d),w=c===void 0?void 0:this.source.read(c);return c!==void 0&&w!==void 0&&w.pid!==this.selfPid?this.evaluateOwner(c,d,"claim"):void 0}claimFileIsOurs(d,c){let w=this.resolvePath(()=>this.source.claimPath(d),d);if(w===void 0)return!1;let b=this.source.read(w);return b?.pid===c.pid&&b.token===c.ownerToken}async claimFile(d,c){let w=this.resolvePath(()=>this.source.claimPath(d),d);if(w===void 0)return"unpublished";let b;try{b=this.source.tryAcquire(w,c)}catch(C){return e.warn(`Cannot publish the allocation claim for ${d} at ${w}: ${r(C)}`,C),"unpublished"}if(b)return this.unlessHeldInTable(d,w,c);let D=this.source.read(w);if(!D||Number.isNaN(D.pid)||D.pid===this.selfPid)return D?.pid===this.selfPid?"claimed":"refused";if(await this.evaluateOwner(w,d,"claim")!==void 0)return"refused";return this.source.takeOver(w,D,c)?this.unlessHeldInTable(d,w,c):"refused"}async unlessHeldInTable(d,c,w){let b=await this.tableClaimOwner(d);if(b===void 0)return"claimed";this.owners.set(d,b);try{this.source.release(c,w)}catch(D){e.warn(`Cannot give back the claim on ${d} another daemon holds in the host-wide table: ${r(D)}`,D)}return"refused"}release(d){let c={pid:this.selfPid,ownerToken:this.ownerToken};this.claimMirror?.released(d,c);let w=this.resolvePath(()=>this.source.claimPath(d),d);if(w===void 0)return;try{this.source.release(w,c)}catch(b){e.warn(`Cannot release the allocation claim on ${d}: ${r(b)}`,b)}}claimOwner(){let d=this.ownerSocketPath();return{pid:this.selfPid,ownerToken:this.ownerToken,...d===void 0?{}:{metadata:rz({socketPath:d,acquiredAt:this.timer.now()})}}}async readForeignOwner(d){let c=this.resolvePath(()=>this.source.leasePath(d),d),w=this.resolvePath(()=>this.source.claimPath(d),d),[b,D]=await Promise.all([c===void 0?void 0:this.evaluateLock(c,d,"lease"),w===void 0?void 0:this.evaluateOwner(w,d,"claim")]),C=await this.tableOwnerUnlessAFileDecides(d,b,D);return this.noteIdleLeaseHolder(d,b?.idleSocketPath,D??C),b?.pid??D??C}noteIdleLeaseHolder(d,c,w){if(c!==void 0&&w===void 0)this.idleLeaseHolders.set(d,c);else this.idleLeaseHolders.delete(d)}async tableOwnerUnlessAFileDecides(d,c,w){let b=c?.idleSocketPath===void 0?c?.pid:void 0;return(w??b)===void 0?this.tableClaimOwner(d):void 0}async tableClaimOwner(d){if(!this.claimMirror?.read)return;try{let c=await this.claimMirror.read(d);if(!c)return;return(await this.evaluateContent({pid:c.pid,metadata:c.metadata},d,"claim"))?.pid}catch(c){e.warn(`Cannot read the host-wide claim on ${d}; the claim files decide: ${r(c)}`,c);return}}resolvePath(d,c){try{return d()}catch(w){e.warn(`Cannot resolve the device ownership files for ${c}: ${r(w)}`,w);return}}async evaluateOwner(d,c,w){return(await this.evaluateLock(d,c,w))?.pid}async evaluateLock(d,c,w){return this.evaluateContent(this.source.read(d),c,w)}async evaluateContent(d,c,w){let b=this.liveForeignLock(d);if(!b)return;let{pid:D,metadata:C}=b;if(!C)return{pid:D};let k=await this.probe.query(C.socketPath,c);if(this.wedgedOwnerLapsed(k,D,c,w))return;let O=w==="claim"&&this.timer.now()-C.acquiredAt<Yf;if(!pg(k,D,w,{deviceId:c,startingUp:O}))return;return ug(k)?{pid:D,idleSocketPath:C.socketPath}:{pid:D}}liveForeignLock(d){let c=d?.pid;if(c===void 0||Number.isNaN(c)||c===this.selfPid)return;if(!this.source.isProcessRunning(c)){this.unanswered.delete(c);return}return{pid:c,metadata:jT(d?.metadata)}}wedgedOwnerLapsed(d,c,w,b){if(d.kind!=="no-response")return this.unanswered.delete(c),!1;let D=this.timer.monotonicNow?.()??this.timer.now(),C=this.unansweredRun(c,D),k=D-C.since;if(k<hd||C.samples<Qf)return!1;if(!C.warnedDevices.has(w))C.warnedDevices.add(w),e.warn(`[DevicePool] ${b} owner PID ${c} of ${w} is alive but has not answered on its control socket for ${Math.round(k/1000)}s; treating its hold on the device as lapsed`);return!0}unansweredRun(d,c){let w=this.unanswered.get(d);if(!w||c-w.lastAt>yd){let b={since:c,lastAt:c,samples:1,warnedDevices:new Set};return this.unanswered.set(d,b),b}if(c>w.lastAt)w.samples+=1,w.lastAt=c;return w}}function ug(d){return d.kind==="status"&&d.status.sessionId===null&&d.status.activeExecutions===0}function pg(d,c,w,{deviceId:b,startingUp:D}){switch(d.kind){case"unreachable":if(D)return e.debug(`[DevicePool] ${w} owner PID ${c} of ${b} is live but not yet reachable; treating its fresh claim as held`),!0;return e.debug(`[DevicePool] ${w} owner PID ${c} of ${b} is orphaned: ${d.detail}`),!1;case"no-response":case"unsupported":return!0;case"status":if(d.status.pid!==c)return e.debug(`[DevicePool] ${w} owner PID ${c} of ${b} is orphaned: its socket is served by PID ${d.status.pid}`),!1;return w==="lease"||d.status.sessionId!==null||d.status.activeExecutions>0}}import{readFileSync as bd,renameSync as gg,statSync as hg,unlinkSync as wg,writeFileSync as bg}from"fs";import{join as Pi}from"path";class Ye extends t{code;constructor(d,c){super(c);this.code=d}}var _g=g({id:y().min(1),ownerPid:T().int().positive(),ownerGenerationToken:y().optional(),deviceId:y().optional(),replacement:ee().optional(),processId:T().int().positive().optional(),processGenerationToken:y().optional(),admittedUntilMs:T().finite().optional(),handedOffUntilMs:T().finite().optional()}),Rg=600000,Dg=60000;class Hn{options;timer;pid;running;ids;constructor(d){this.options=d;this.timer=d.timer??i,this.pid=d.pid??process.pid,this.running=d.isProcessRunning??at,this.ids=d.idGenerator??B}async withAdmissionLock(d,c){d.signal?.throwIfAborted();let w=this.perform((D)=>Pi(ec(D),"admission.lock")),b=this.ids.next();await this.acquire(w,b,d);try{return d.signal?.throwIfAborted(),await c()}finally{ki(w,this.pid,b)}}async acquire(d,c,w){let b=this.timer.now()+w.timeoutMs;for(;;){if(w.signal?.throwIfAborted(),this.tryAcquire(d,c))return;let D=b-this.timer.now();if(D<=0)throw this.timeout(d);if(await l(()=>this.timer.sleep(Math.min(25,D)),{timer:this.timer,timeoutMs:D,signal:w.signal,label:d,timeoutError:()=>this.timeout(d)}),this.timer.now()>=b)throw this.timeout(d)}}timeout(d){return e.warn(`[BootAdmission] Timed out waiting for ${d}`),new Ye("timeout",`Timed out waiting for host admission lock at ${d}`)}tryAcquire(d,c){try{let w=Fi(d,{pid:this.pid,now:()=>this.timer.now(),ownerToken:c,isProcessRunning:this.running,ownerGeneration:this.options.ownerGeneration??Ht});if(!w)return this.checkReadableLock(d),this.takeOverStaleLock(d,c);return w}catch(w){throw this.failed(d,w)}}takeOverStaleLock(d,c){let w=xl(d);if(!w||!this.olderThan(d,this.options.lockMaxAgeMs??Dg))return!1;let b=nE(d,w,{ownerGeneration:this.options.ownerGeneration??Ht,pid:this.pid,ownerToken:c});if(b)e.warn(`[BootAdmission] Took over stale host admission lock at ${d} from PID ${w.pid}`);return b}olderThan(d,c){try{return this.timer.now()-hg(d).mtimeMs>c}catch(w){if(!this.missing(w,d))throw this.failed(d,w);return!1}}checkReadableLock(d){try{bd(d)}catch(c){if(!this.missing(c,d))throw this.failed(d,c)}}readPeerAdmissions(){return this.perform((d)=>this.listFiles(d).flatMap((c)=>{let w=this.readRecord(d,c);return w&&w.ownerPid!==this.pid?[w]:[]}))}listFiles(d){try{return Li(d).filter((c)=>c.endsWith(".json"))}catch(c){if(!this.missing(c,d))throw c;return[]}}readRecord(d,c){let w=Pi(d,c),b;try{b=bd(w,"utf8")}catch(C){if(!this.missing(C,w))throw C;return}let D=this.parseRecord(w,c,b);if(D&&this.isStale(D)){this.cleanup(w);return}return D}parseRecord(d,c,w){let b=Number(c.split(".",1)[0]);try{let D=_g.parse(JSON.parse(w));if(c!==`${D.ownerPid}.${D.id}.json`)throw Error("Mismatched admission record identity");return D}catch(D){if(!Number.isInteger(b)||b<=0)throw this.failed(d,D);if(this.running(b)){if(!this.olderThan(d,Rg))throw this.failed(d,D);e.warn(`[BootAdmission] Dropping old invalid record at ${d} from PID ${b}: ${r(D)}`,D),this.cleanup(d);return}e.debug(`[BootAdmission] Dropping dead owner's invalid record at ${d}: ${r(D)}`),this.cleanup(d);return}}isStale(d){if(d.handedOffUntilMs!==void 0)return this.timer.now()>=d.handedOffUntilMs||d.processId!==void 0&&this.isProvablyGone(d.ownerPid,d.ownerGenerationToken)&&this.isProvablyGone(d.processId,d.processGenerationToken);return!this.running(d.ownerPid)||d.admittedUntilMs!==void 0&&this.timer.now()>=d.admittedUntilMs}isProvablyGone(d,c){return!this.running(d)||Vw(d,{processGenerationToken:c},this.options.readProcessGenerationToken??Sa,"host boot admission record")}readToken(d){try{return(this.options.readProcessGenerationToken??Sa)(d)}catch(c){e.warn(`[BootAdmission] Failed to capture process generation token for PID ${d}: ${r(c)}`,c);return}}publish(d={}){let c={id:this.ids.next(),ownerPid:this.pid,ownerGenerationToken:this.readToken(this.pid),...d};this.write(c);let w=!1;return{clearDeviceId:()=>{if(w)return;let b={...c};delete b.deviceId,this.write(b),c=b},update:(b)=>{if(w)return;let D={...c,...Object.fromEntries(Object.entries(b).filter(([,C])=>C!==void 0))};if(b.processId!==void 0)D.processGenerationToken=this.readToken(b.processId);this.write(D),c=D},remove:()=>{if(w)return;this.perform((b)=>this.unlink(Pi(b,`${c.ownerPid}.${c.id}.json`))),w=!0}}}write(d){this.perform((c)=>{ec(c);let w=Pi(c,`${d.ownerPid}.${d.id}.json`),b=`${w}.${this.ids.next()}.tmp`;try{bg(b,JSON.stringify(d),{flag:"wx",mode:384}),gg(b,w)}finally{this.cleanup(b)}})}unlink(d){try{wg(d)}catch(c){if(!this.missing(c,d))throw c}}cleanup(d){try{this.unlink(d)}catch(c){e.warn(`[BootAdmission] Registry cleanup failed at ${d}: ${r(c)}`,c)}}missing(d,c){if(d?.code!=="ENOENT")return!1;return e.debug(`[BootAdmission] Registry path already absent: ${c}`),!0}perform(d){let c="boot-admissions/android (unresolved registry directory)";try{return c=this.options.directory(),d(c)}catch(w){throw this.failed(c,w)}}failed(d,c){if(c instanceof Ye)return c;return e.warn(`[BootAdmission] Host registry failed at ${d}: ${r(c)}`,c),new Ye("failed",`Host boot registry failed at ${d}: ${r(c)}`)}}class RA{maxSamples;samples=[];constructor(d=200){this.maxSamples=d}record(d){if(!Number.isFinite(d.durationMs)||d.durationMs<0)return;this.samples=[...this.samples,d].slice(-this.maxSamples)}latestFor(d){return this.samples.findLast((c)=>c.udid===d)}recentForProfile(d,c=10,w){return this.samples.filter((b)=>b.profileId===d&&(w===void 0||(b.reason??"create")===w)).slice(-c).reverse()}}class Ii{onClose;ended=[];constructor(d){this.onClose=d}close(){this.onClose(this)}}var Sd=f.BOOT_CAPACITY_GATE.name,_d=f.IOS_SIM_CAPACITY_GATE.name,jI=5000;function Ci(d,c){if(d==="ios"){let w=c[_d]?.trim();if(w==="0"||w==="1")return w==="1"}return c[Sd]?.trim()!=="0"}function T4(d){let c=d.externalDevices??[],w=d.heldDevices??[],b=w.length>0?` ${w.length} of them are held by AutoMobile: ${w.join(", ")}.`:"";return`${c.length>0?` ${c.length} of them ${d.ownershipUnknown?"have unconfirmed AutoMobile ownership":d.heldDevices?"have no AutoMobile owner":"were not started by AutoMobile"} but still count toward the limit: ${c.join(", ")}.`:""}${b}`}function Ai(d,c,w,b){if(d<c.maxBooted)return;let D=b.externalDevices??[],C=b.heldDevices??[],k=D.length>0?` or disable the gate with ${Sd}=0`:"";return{outcome:"refuse",reason:"at-capacity",limits:c,bootedCount:d,retryAfterMs:w,...D.length>0?{externalDevices:[...D]}:{},...C.length>0?{heldDevices:[...C]}:{},...b.ownershipUnknown?{ownershipUnknown:!0}:{},message:`${d} ${b.noun}(s) booted; limit is ${c.maxBooted} (${c.source}).${T4(b)} Shut one down, raise the limit with ${b.envName}${k}.`}}var uc=15000;async function Mt(d){d.signal?.throwIfAborted();let c=d.ledger.beginSample(),w;try{w=await Pg(d)}finally{c.close()}d.signal?.throwIfAborted();let b=d.decide(w,c);if(Pd(b))return{decision:b};return{decision:b,releaseAdmission:d.admit(b)}}function Pd(d){return d.outcome==="refuse"}async function Pg(d){let{timer:c}=d,w=d.sampleTimeoutMs??uc;return await l(d.sample,{timer:c,timeoutMs:w,signal:d.signal,label:`Collecting ${d.label}`,timeoutError:()=>Vn(d.platform,w,d.label,d.timeoutRetryAfterMs)})}function Vn(d,c,w,b){let D={code:"timeout",message:`timed out after ${c}ms collecting ${w}`,retryable:!0};return d==="android"?new en(D):new ze(d,D,void 0,b)}function Lt(d,c,w){let{decision:b}=d;if(!Pd(b))return;throw new Un({platform:c,limit:b.limits.maxBooted,booted:b.bootedCount,retryAfterMs:b.retryAfterMs,...b.externalDevices?{externalDevices:b.externalDevices}:{},...b.heldDevices?{heldDevices:b.heldDevices}:{},...b.ownershipUnknown?{ownershipUnknown:!0}:{}},`Refused to boot: no ${w} capacity (code capacity_exhausted, retryable; retry after ${b.retryAfterMs}ms): ${b.message}`)}class Ft{timer;entries=new Map;openWindows=new Set;constructor(d){this.timer=d}admit(d,c=!1,w="create"){let b=Symbol("boot-admission");return this.entries.set(b,{deviceId:d,replacement:c,reason:w}),{bind:(D)=>{let C=this.entries.get(b);if(C)this.entries.set(b,{...C,deviceId:D,replacement:!1})},release:()=>this.end(b),handOff:(D,C,k)=>{let O=this.entries.get(b);if(O)this.entries.set(b,{deviceId:D??O.deviceId,processId:k??O.processId,handedOffUntilMs:C,handedOff:!0})}}}admissionsByReason(){let d={reset:0,create:0,restart:0};for(let c of this.entries.values())d[c.reason??"create"]+=1;return d}end(d,c=!1){let w=this.entries.get(d);if(!w)return;this.entries.delete(d);let b=c?{deviceId:w.deviceId,processId:w.processId,handedOff:w.handedOff,replacement:w.replacement,reason:w.reason}:w;for(let D of this.openWindows)D.ended.push(b)}beginSample(){let d=new Ii((c)=>this.openWindows.delete(c));return this.openWindows.add(d),d}inFlightCount(d,c,w){return this.inFlight(d,c,w).count}inFlight(d,c,w,b=new Set){let{count:D,withListedProcess:C,listedWithoutProcess:k}=this.inFlightView(d,c,w,b);return{count:D,withListedProcess:C,listedWithoutProcess:k}}inFlightView(d,c,w,b=new Set){let D=this.timer.now(),C=(U)=>U.processId!==void 0&&b.has(U.processId),k=(U)=>U.deviceId!==void 0&&d.has(U.deviceId),O=this.endedDuringSample(w,d,c,D),M=[...O],F=O.filter(C).length,V=[...this.windowEnded(w),...this.entries.values()].filter((U)=>k(U)&&!C(U)&&U.deviceId!==c&&!U.replacement).length;for(let[U,W]of[...this.entries]){let G=k(W);if(W.handedOffUntilMs!==void 0&&(G||D>=W.handedOffUntilMs))this.end(U,G);else if(!G&&(c===void 0||W.deviceId!==c))M.push(W),F+=C(W)?1:0}return{count:M.length,boots:M.map((U)=>({deviceId:U.deviceId,replacement:U.replacement,processId:U.processId,handedOff:U.handedOff===!0})),withListedProcess:F,listedWithoutProcess:V}}windowEnded(d){return d instanceof Ii?d.ended:[]}endedDuringSample(d,c,w,b){return this.windowEnded(d).filter((D)=>!(D.handedOffUntilMs!==void 0&&b>=D.handedOffUntilMs)&&!(D.deviceId!==void 0&&c.has(D.deviceId))&&(w===void 0||D.deviceId!==w))}}import{AsyncLocalStorage as Ig}from"async_hooks";class Ze{scope=new Ig;hasPending(){return this.scope.getStore()?.active===!0}take(d){let c=this.scope.getStore();if(!c?.active)return;return c.active=!1,c.consume(d)}hold(d,c,w=()=>{}){let b={active:!0,consume:d};return{run:async(D)=>{if(!b.active)throw new t("Boot reservation was already consumed or released");let C=!1;try{let k=await this.scope.run(b,D);return C=!0,k}finally{if(!C&&b.active)b.active=!1,c()}},markReplacedDeviceGone:()=>{if(b.active)w()},release:()=>{if(b.active)b.active=!1,c()}}}}var Ei="Booted",k4=new Set([Ei,"Booting","Shutting Down"]);function xS(d,c){return d.simulators.filter((w)=>k4.has(w.state)&&w.udid!==c).map((w)=>w.udid)}class PA{source;history;timer;inFlight=null;pendingFresh=null;constructor(d,c,w){this.source=d;this.history=c;this.timer=w}collect(d={}){if(this.inFlight)return this.inFlight;return this.startRun(d)}collectFresh(d={}){if(this.pendingFresh)return this.pendingFresh;let c=Promise.resolve().then(()=>(this.pendingFresh=null,this.startRun(d)));return this.pendingFresh=c,c}startRun(d){let c=this.collectOnce(this.runBudget(d)).finally(()=>{if(this.inFlight===c)this.inFlight=null});return this.inFlight=c,c}runBudget(d){let c=d.deadlineMs??(d.timeoutMs===void 0?void 0:this.timer.now()+d.timeoutMs);return{signal:d.signal,deadlineMs:c}}async withinBudget(d,c){if(d.deadlineMs===void 0)return await c({signal:d.signal});return await ys(d.deadlineMs,this.timer,d.signal,(w,b)=>c({signal:w,timeoutMs:b}))}async collectOnce(d){let c=this.timer.now(),w;try{w=await this.withinBudget(d,(M)=>this.source.readInventory(M))}catch(M){return e.warn(`simulator inventory failed: ${r(M)}`,M),Cg(c,[`inventory: ${r(M)}`])}let b=w.filter((M)=>M.state===Ei),D=await this.readSnapshot(d,b.length>0),C=D.value?Jre(D.value.processes,b.map((M)=>M.udid)):new Map,k=w.map((M)=>this.costFor(M,D,C)),O=[...D.error?[`host snapshot: ${D.error}`]:[],...D.value?.footprintError&&b.length>0?[`memory footprint: ${D.value.footprintError}`]:[]];return{collectedAtMs:c,host:D.value?.resources,simulators:k,totals:Cd(k),errors:O}}async readSnapshot(d,c){try{let w=await this.withinBudget(d,(b)=>this.source.readHostSnapshot(b));return c&&w.processesError?{value:w,error:w.processesError}:{value:w}}catch(w){return e.warn(`host snapshot failed: ${r(w)}`,w),c?{error:r(w)}:{}}}costFor(d,c,w){let b={udid:d.udid,name:d.name,state:d.state,runtime:d.runtime,deviceTypeIdentifier:d.deviceTypeIdentifier,diskBytes:d.dataPathSizeBytes,lastBoot:this.history.latestFor(d.udid)};if(d.state!==Ei)return{...b,quality:"not-running"};if(!c.value||c.value.processesError)return{...b,quality:"unavailable",error:c.error??c.value?.processesError??"no host snapshot"};let D=w.get(d.udid);return D?{...b,quality:"measured",process:D}:{...b,quality:"no-processes"}}}function Cg(d,c){return{collectedAtMs:d,simulators:[],totals:Cd([]),errors:c,inventoryFailed:!0}}function Cd(d){let c=d.filter((b)=>b.quality==="measured"),w=c.flatMap((b)=>b.process?.footprintBytes===void 0?[]:[b.process.footprintBytes]);return{bootedCount:d.filter((b)=>b.state===Ei).length,measuredCount:c.length,rssBytes:c.reduce((b,D)=>b+(D.process?.rssBytes??0),0),...w.length>0?{footprintBytes:w.reduce((b,D)=>b+D,0)}:{},cpuPercent:c.reduce((b,D)=>b+(D.process?.cpuPercent??0),0),diskBytes:d.reduce((b,D)=>b+(D.diskBytes??0),0)}}var Ti={defaultBytes:2684354560,minBytes:1610612736,maxBytes:6442450944},Wn={defaultBytes:4294967296,minBytes:1610612736,maxBytes:8589934592};function Kn(d,c){if(d.length===0)return c.defaultBytes;let w=d.reduce((b,D)=>b+D,0)/d.length;return Math.min(c.maxBytes,Math.max(c.minBytes,w))}function Ad(d,c,w){if(c===void 0||!Number.isFinite(c))return d;return Math.min(w.maxBytes,Math.max(d,c))}function Oi(d,c,w){if(d===void 0)return w.defaultBytes;let b=c.map((W)=>{let G=W.processId===void 0?0:d.reduce((Z,ie)=>ie.pid===W.processId||ie.ppid===W.processId?Z+ie.rssBytes:Z,0);return Math.max(G,w.defaultBytes)}),D=new Set(c.map((W)=>W.processId));D.delete(void 0);let C=d.filter((W)=>!D.has(W.pid)&&!D.has(W.ppid)).map((W)=>W.rssBytes).sort((W,G)=>W-G);if(C.length===0)return Kn(b,w);let k=d.some((W)=>W.pid!==void 0||W.ppid!==void 0),O=c.filter((W)=>W.handedOff&&(W.processId===void 0||!k)).length,M=C.slice(Math.min(O,C.length-1)),F=M.reduce((W,G)=>W+G,0),q=F/M.length,V=(F+b.reduce((W,G)=>W+G,0))/(M.length+c.length),U=O>=C.length?w.defaultBytes:w.minBytes;return Math.min(w.maxBytes,Math.max(w.minBytes,U,q,V))}function Ed(d,c,w,{perDeviceBytes:b,coresPerDevice:D=2}){let C=d[c],k=Mi(C);if(k!==void 0)return{maxBooted:k,source:"env"};let O=Math.floor(w.totalMemoryBytes*0.5/b),M=Math.floor(w.cpuCount/Math.max(1,D)),F={maxBooted:Math.max(1,Math.min(O,M)),source:"derived"};return C===void 0||C.trim()===""?F:{...F,warning:`${c}=${JSON.stringify(C)} is not a positive integer; using the derived limit`}}function Mi(d){if(d===void 0||!/^\d+$/.test(d.trim()))return;let c=Number(d.trim());return c>=1?c:void 0}var Ni=f.IOS_SIM_MAX_BOOTED.name,Ag=0.1,Eg=0.6,xg=0.5,Tg=13,Bg=2,xd=f.IOS_SIM_BOOT_CONCURRENCY.name,kg=1.5;function Iq(d,c=[]){let w=d?.simulators??[],b=w.flatMap((M)=>M.quality==="measured"&&M.process?.footprintBytes!==void 0?[{udid:M.udid,footprintBytes:M.process.footprintBytes}]:[]),D=new Set(c.flatMap((M)=>M.deviceId&&!M.replacement?[M.deviceId]:[]));for(let M of w)if(M.state==="Booting")D.add(M.udid);let C=c.filter((M)=>M.deviceId===void 0||M.replacement);if(D.size===0&&C.length===0)return Kn(b.map((M)=>M.footprintBytes),Ti);let k=new Map(b.map((M,F)=>[M.udid,F])),O=[...C.map(({handedOff:M})=>({handedOff:M})),...[...D].map((M)=>({processId:k.get(M),handedOff:!1}))];return Oi(b.map((M,F)=>({rssBytes:M.footprintBytes,pid:F})),O,Ti)}function n0(d,c,w=Ti.defaultBytes){let b=d[Ni],D=Mi(b),C=Math.floor(c.totalMemoryBytes*Eg/w),k=Math.floor(c.cpuCount*xg/Ag),O=d[xd],M=Mi(O),F=Number.isSafeInteger(M)?M:void 0,q=Td(Ni,b,D),V=Td(xd,O,F);return{maxBooted:D??Math.max(1,Math.min(C,k)),source:D===void 0?"derived":"env",...q?{warning:q}:{},bootConcurrency:F??Og(c.cpuCount),bootConcurrencySource:F===void 0?"derived":"env",...V?{bootConcurrencyWarning:V}:{}}}function Og(d){return d>0?Math.max(Bg,Math.ceil(d/Tg)):1}function Td(d,c,w){return w===void 0&&c?.trim()?`${d}=${JSON.stringify(c)} is not a positive integer; using the derived limit`:void 0}function _q(d){if(!d)return!1;if(d.memoryPressure==="warn"||d.memoryPressure==="critical")return!0;return d.loadAverage1m!==null&&d.cpuCount>0&&d.loadAverage1m/d.cpuCount>=kg}function Bd(d,c){if(c.deviceTypeIdentifier===void 0&&c.runtime===void 0&&c.profileId===void 0)return[];let w=new Set(c.excludeUdids??[]);return(d?.simulators??[]).filter((b)=>b.state==="Booted"&&!w.has(b.udid)&&(c.deviceTypeIdentifier===void 0||b.deviceTypeIdentifier===c.deviceTypeIdentifier)&&(c.runtime===void 0||b.runtime===c.runtime)&&(c.profileId===void 0||b.lastBoot?.profileId===c.profileId))}class i0{limit;running=0;waiters=[];constructor(d=1){this.limit=d;this.setLimit(d)}status(){return{limit:this.limit,running:this.running,queued:this.waiters.length}}setLimit(d){if(!Number.isSafeInteger(d)||d<1)throw RangeError("Boot concurrency limit must be a positive integer");this.limit=d,this.drain()}async acquire(d,c){return d?.throwIfAborted(),new Promise((w,b)=>{let D=()=>{let k=this.waiters.indexOf(C);if(k>=0)this.waiters.splice(k,1);b(d?.reason)},C={owner:c,grant:()=>{d?.removeEventListener("abort",D),this.running++;let k=!1;w({release:()=>{if(k)return;k=!0,this.running--,this.drain()}})}};this.waiters.push(C),d?.addEventListener("abort",D,{once:!0}),this.drain()})}drain(){while(this.running<this.limit&&this.waiters.length>0)this.waiters.shift().grant()}}var Mg=3,$i="iOS simulator capacity";class Jn{fleet;timer;optionsOwnership;env;retryAfterMs;sustainedSamples;random;pressuredStreak=0;bootGate;warnedBootConcurrency;warnedLimit;warnedHostUnreadable=!1;latestReport;startedUdids=new Set;seenStartedUdids=new Set;bootsByUdid=new Map;admittedBoots;reservations=new Ze;constructor(d,c,w={}){this.fleet=d;this.timer=c;this.bootGate=w.bootGate??new i0,this.optionsOwnership=w.ownership,this.env=w.env??process.env,this.retryAfterMs=w.retryAfterMs??jI,this.sustainedSamples=w.sustainedSamples??Mg,this.random=w.random??Cl,this.admittedBoots=w.ledger??new Ft(c)}async refresh(d={}){let c=await(d.fresh?this.fleet.collectFresh({deadlineMs:this.timer.now()+(d.sampleTimeoutMs??uc)}):this.fleet.collect());return this.foldIntoPressureHistory(c),c}foldIntoPressureHistory(d){if(d!==this.latestReport)this.latestReport=d,this.pressuredStreak=_q(d.host)?this.pressuredStreak+1:0}async evaluateBoot(d={}){return this.decide(await this.refresh(),d,"substitute")}async refreshOwnership(d){try{return await this.optionsOwnership?.refresh(),d}catch(c){return e.warn("[BootAdmission] iOS ownership could not be read; using retained ownership labels",c),{...d,ownershipReadFailed:!0}}}decide(d,c,w,{bootUdid:b,window:D,carriesOwnSlot:C}={}){this.assertCountKnown(d);let k=d.simulators.filter((G)=>this.optionsOwnership?.isAutoMobileOwned(G.udid)).map((G)=>G.udid),O=w==="hint"?{...c,excludeUdids:[...c?.excludeUdids??[],...k]}:c??{},M=Bd(d,O)[0];if(M&&w==="substitute")return{outcome:"reuse-warm",udid:M.udid};let F=this.limitsFor(d,D),q=xS(d,b);this.forgetExitedStarted(d);let V=q.length+this.inFlightBootCount(d,b,D);if(C)return{outcome:"allow",limits:F,bootedCount:V};let U=new Set([...this.startedUdids,...k]),W=Ai(V,this.countLimits(F),this.retryAfterMs,{noun:"simulator",envName:Ni,externalDevices:q.filter((G)=>!U.has(G)),heldDevices:q.filter((G)=>U.has(G)),ownershipUnknown:d.ownershipReadFailed});if(W)return d.ownershipReadFailed?{...W,message:`${W.message} Ownership could not be read; labels use the last good snapshot and current in-memory ownership, so external devices may also be held by AutoMobile.`}:W;return M?{outcome:"reuse-warm",udid:M.udid}:{outcome:"allow",limits:F,bootedCount:V}}async admitBoot(d,c){c.signal?.throwIfAborted();let w=this.reservations.take(c.bootUdid);if(w)return this.withBootPermit(w,c);let b=await Mt({timer:this.timer,platform:"ios",signal:c.signal,label:$i,timeoutRetryAfterMs:this.jitteredRetryAfterMs(),sample:async()=>this.refreshOwnership(await this.refresh({fresh:!0})),ledger:this.admittedBoots,decide:(D,C)=>this.decide(D,d,"hint",{bootUdid:c.bootUdid,window:C}),admit:()=>this.recordAdmission(c.bootUdid,void 0,c.reason)});return this.withBootPermit(b,c)}async withBootPermit(d,c){let w=d.releaseAdmission;if(!w||d.decision.outcome==="refuse")return d;let b=this.bootGate.status(),D=b.running>=b.limit||b.queued>0,C=this.timer.now();if(D)e.info(`[BootAdmission] iOS simulator boot queued behind ${b.running} running boots (limit ${b.limit})`);let k=!1;try{let O=await this.bootGate.acquire(c.signal,c.bootUdid);if(k=!0,D)e.info(`[BootAdmission] iOS simulator boot granted after ${this.timer.now()-C}ms queued`);let M=!1;return{...d,releaseAdmission:(F)=>{if(M)return;M=!0;try{w(F)}finally{O.release()}}}}finally{if(!k)w({bootFailed:!0})}}async reserveBoot(d){let c,w=Math.min(d.timeoutMs,uc),b=await Mt({timer:this.timer,platform:"ios",signal:d.signal,sampleTimeoutMs:w,label:$i,timeoutRetryAfterMs:this.jitteredRetryAfterMs(),sample:async()=>this.refreshOwnership(await this.refresh({fresh:!0,sampleTimeoutMs:w})),ledger:this.admittedBoots,decide:(k,O)=>this.decide(k,void 0,"hint",{bootUdid:d.replacingDeviceId,window:O,carriesOwnSlot:d.reason==="reset"&&d.replacingDeviceId!==void 0&&xS(k).includes(d.replacingDeviceId)}),admit:()=>(c=this.admittedBoots.admit(d.replacingDeviceId,!0,d.reason),c.release)});Ui(b);let D=c,C=D.release;return this.reservations.hold((k)=>(D.bind(k),C=this.recordAdmission(k,D),{decision:b.decision,releaseAdmission:C}),()=>C({bootFailed:!0}),()=>D.bind())}recordAdmission(d,c,w){let b=d?this.bootsByUdid.get(d)??{unreleased:0,succeeded:!1}:void 0;if(d&&b)this.startedUdids.add(d),b.unreleased+=1,this.bootsByUdid.set(d,b);let D=c??this.admittedBoots.admit(d,!1,w),C=!1;return(k)=>{if(C)return;if(C=!0,D.release(),!d||!b||this.bootsByUdid.get(d)!==b)return;if(b.unreleased-=1,b.succeeded||=!k?.bootFailed,b.unreleased===0&&!b.succeeded&&!this.seenStartedUdids.has(d))this.forgetStarted(d)}}async assertCapacityAvailable(d={}){if(d.signal?.throwIfAborted(),this.reservations.hasPending())return;return this.sampleInWindow({...d,ownership:!0},(c,w)=>{Ui({decision:this.decide(c,void 0,"hint",{window:w})})})}async describeCapacity(d={}){return this.sampleInWindow(d,(c,w)=>(this.assertCountKnown(c),{limit:this.limitsFor(c,w).maxBooted,booted:xS(c).length,inFlight:this.inFlightBootCount(c,void 0,w),admissionsByReason:this.admittedBoots.admissionsByReason(),hostPressure:{sustained:this.pressuredStreak>=this.sustainedSamples,consecutiveSamples:this.pressuredStreak,memoryPressure:c.host?.memoryPressure??"unknown"}}))}async sampleInWindow(d,c){d.signal?.throwIfAborted();let w=this.admittedBoots.beginSample();try{let b=this.timer.now()+uc,D=this.jitteredRetryAfterMs(),C=await l(async()=>{let k=await this.fleet.collectFresh({deadlineMs:b});return d.ownership?this.refreshOwnership(k):k},{timer:this.timer,timeoutMs:uc,signal:d.signal,label:`Collecting ${$i}`,timeoutError:()=>new ze("ios",{code:"timeout",message:`timed out after ${uc}ms collecting ${$i}`,retryable:!0,retryAfterMs:D},void 0,D)});return d.signal?.throwIfAborted(),c(C,w)}finally{w.close()}}jitteredRetryAfterMs(){return Math.round(this.retryAfterMs*(1+this.random.next()))}assertCountKnown(d){if(!d.inventoryFailed)return;let c=d.errors.join("; ")||"simctl list failed";throw e.warn(`[BootAdmission] iOS simulator count unknown; refusing to boot: ${c}`),new ze("ios",{code:"failed",message:`simulator count unknown (${c})`,retryable:!0})}forgetExitedStarted(d){let c=new Set(xS(d));for(let w of this.startedUdids)if(c.has(w))this.seenStartedUdids.add(w);else if(this.seenStartedUdids.delete(w))this.forgetStarted(w)}forgetStarted(d){this.startedUdids.delete(d),this.seenStartedUdids.delete(d),this.bootsByUdid.delete(d)}inFlightBootCount(d,c,w){return this.admittedBoots.inFlightCount(new Set(xS(d)),c,w)}countLimits({maxBooted:d,source:c,warning:w}){return{maxBooted:d,source:c,...w?{warning:w}:{}}}limitsFor(d,c){if(!d.host){if(!this.warnedHostUnreadable)this.warnedHostUnreadable=!0,e.warn("[BootAdmission] host resources unreadable; limiting simulator boots to 1");return this.warnOnUnusableLimit(n0(this.env,{totalMemoryBytes:0,cpuCount:0}))}let{boots:w}=this.admittedBoots.inFlightView(new Set,void 0,c);return this.warnOnUnusableLimit(n0(this.env,d.host,Iq(d,w)))}warnOnUnusableLimit(d){if(d.warning&&d.warning!==this.warnedLimit)this.warnedLimit=d.warning,e.warn(`[BootAdmission] ${d.warning}`);if(d.bootConcurrencyWarning&&d.bootConcurrencyWarning!==this.warnedBootConcurrency)this.warnedBootConcurrency=d.bootConcurrencyWarning,e.warn(`[BootAdmission] ${d.bootConcurrencyWarning}`);return this.bootGate.setLimit(d.bootConcurrency),d}}function Ui(d){Lt(d,"ios","simulator")}import{totalmem as Qg}from"os";async function qi(d,c={}){let w=await d.executeCommand("ps",pD,{signal:c.signal,timeoutMs:c.timeoutMs,maxBuffer:Yre}),{rows:b,skipped:D}=Pz(w.stdout);if(b.length===0)throw Error(`ps returned no parseable processes (${D} unparseable rows)`);return b}var kd=["list","devices","--json"];function Od(d){let c=Km(d).devices;if(c===null||typeof c!=="object")throw Error("simctl list output has no devices map");return Object.entries(c).flatMap(([w,b])=>(Array.isArray(b)?b:[]).flatMap((D)=>Lg(w,D)))}function Lg(d,c){if(typeof c.udid!=="string"||typeof c.state!=="string")return[];return[{udid:c.udid,name:typeof c.name==="string"?c.name:c.udid,state:c.state,runtime:d,deviceTypeIdentifier:typeof c.deviceTypeIdentifier==="string"?c.deviceTypeIdentifier:void 0,dataPathSizeBytes:typeof c.dataPathSize==="number"?c.dataPathSize:void 0,isAvailable:c.isAvailable!==!1}]}var Fg=["-l","1","-stats","pid,mem"],Ug=16777216,qg={B:1,K:1024,M:1048576,G:1073741824,T:1099511627776},Hg=/^\s*(\d+)\s+(\d+(?:[.,]\d+)?)([BKMGT])?[+-]?\s*$/;function Vg(d){let c=new Map,w=0,b=!1;for(let D of d.split(`
|
|
159
|
-
`)){if(!b){b=/^\s*PID\s+MEM\b/.test(D);continue}if(D.trim()==="")continue;let C=Hg.exec(D);if(C)c.set(Number(C[1]),Math.round(Number(C[2].replace(",","."))*qg[C[3]??"B"]));else w+=1}return{footprints:c,skipped:w}}async function Wg(d,c={}){let w=await d.executeCommand("top",Fg,{signal:c.signal,timeoutMs:c.timeoutMs,maxBuffer:Ug}),{footprints:b,skipped:D}=Vg(w.stdout);if(b.size===0)throw Error(`top returned no parseable footprints (${D} unparseable rows)`);return b}var jg=20000,Kg=60000,zg=5000,Xg=300000;class Xn{executor;timer;limits;cached;inFlight;constructor(d,c,w={}){this.executor=d;this.timer=c;this.limits=w}async read(d={}){d.signal?.throwIfAborted();let c=this.cachedWithin(this.limits.ttlMs??jg);if(c)return c;let w=Math.min(d.timeoutMs??Number.POSITIVE_INFINITY,this.limits.maxWaitMs??zg);try{return await l(()=>this.run(),{timer:this.timer,timeoutMs:w,signal:d.signal,label:"Reading host memory footprints"})}catch(b){d.signal?.throwIfAborted();let D=this.cachedWithin(this.limits.staleMaxAgeMs??Xg);if(D)return e.warn(`using stale host footprints: ${r(b)}`),D;throw b}}cachedWithin(d){return this.cached&&this.timer.now()-this.cached.takenAtMs<d?this.cached.footprints:void 0}run(){if(!this.inFlight){let d=Wg(this.executor,{timeoutMs:this.limits.runTimeoutMs??Kg}).then((c)=>(this.cached={takenAtMs:this.timer.now(),footprints:c},c)).finally(()=>{if(this.inFlight===d)this.inFlight=void 0});this.inFlight=d,d.catch((c)=>{e.debug(`host footprint run failed: ${r(c)}`)})}return this.inFlight}}function Md(d,c){return d.map((w)=>{let b=c.get(w.pid);return b===void 0?w:{...w,footprintBytes:b}})}var Yn={totalMemoryBytes:()=>Qg(),cpuCount:()=>Az.cpuCount(),loadAverage1m:()=>Az.loadAverage1m()},Zg=["-n","kern.memorystatus_vm_pressure_level"];function ev(d){switch(d.trim()){case"1":return"normal";case"2":return"warn";case"4":return"critical";default:return"unknown"}}class AA{executor;timer;os;simctl;footprintReader;constructor(d,c,w=Yn,{simctl:b=new L(null),footprintReader:D=new Xn(d,c)}={}){this.executor=d,this.timer=c,this.os=w,this.simctl=b,this.footprintReader=D}async readHostSnapshot(d={}){let[c,w]=await Promise.all([this.readProcesses(d),this.readResources(d)]);return{takenAtMs:this.timer.now(),resources:w,...c}}async readInventory(d={}){let c=await this.simctl.executeCommandArgs([...kd],d.timeoutMs,d.signal);return Od(c.stdout)}async readProcesses(d){let[c,w]=await Promise.allSettled([qi(this.executor,d),this.footprintReader.read(d)]);if(c.status==="rejected")return e.warn(`host process table read failed: ${r(c.reason)}`,c.reason),{processes:[],processesError:r(c.reason)};if(w.status==="rejected")return e.warn(`host footprint read failed: ${r(w.reason)}`,w.reason),{processes:c.value,footprintError:r(w.reason)};return{processes:Md(c.value,w.value)}}async readResources(d){return{totalMemoryBytes:this.os.totalMemoryBytes(),cpuCount:this.os.cpuCount(),loadAverage1m:this.os.loadAverage1m(),memoryPressure:await this.readMemoryPressure(d)}}async readMemoryPressure(d){try{let c=await this.executor.executeCommand("sysctl",Zg,{signal:d.signal,timeoutMs:d.timeoutMs});return ev(c.stdout)}catch(c){return e.debug(`memory pressure read failed: ${r(c)}`),"unknown"}}}import{createHash as tv}from"crypto";function Hi(d){return Object.keys(d).flatMap((c)=>{let w=d[c];return w===void 0?[]:[[c,w]]})}function KI(d){return tv("sha256").update(Dr(Object.fromEntries(Hi(d.resources)))).digest("hex")}var iv={state:"unknown",reason:"The observation did not report this resource."};function o0(d,c,w={}){let b=[];for(let[D,C]of Hi(d)){let k=c[D]??iv;if(k.state===C)continue;let O=k.state==="unsupported"?"unsupported":k.state==="unknown"?"commandFailure":"missingRequested";b.push({resource:D,kind:O,expected:C,observed:k})}for(let[D,C]of Hi(w)){let k=c[D];if(d[D]===void 0&&k?.state===C)b.push({resource:D,kind:"ownedExtra",expected:C,observed:k})}return b}function xq(d,c,w,b){let D={...d};for(let C of w)if(c[C]==="disabled")D[C]="disabled";else if(c[C]==="enabled")delete D[C];return Object.fromEntries(Hi(D).filter(([C,k])=>{let O=b[C]?.state;return k==="disabled"&&O!=="enabled"&&O!=="unsupported"}))}function rv(d){return KI(d??{resources:{}})}class Qn{options;constructor(d){this.options=d}async reserveBoot(d){return this.options.gate?this.options.gate.reserveBoot(d):new Ze().hold(()=>{},()=>{})}async run(d,c){let{history:w,timer:b,gate:D}=this.options,C=rv(d.profile),k=D?await this.admit(D,d,C):void 0,O=b.now(),M,F=!0;try{M=await c(d.timeoutMs),F=!1}finally{k?.(F?{bootFailed:!0}:void 0)}let q=b.now();return w.record({reason:d.reason??"create",udid:d.udid,profileId:C,durationMs:q-O,recordedAtMs:q}),M}async admit(d,c,w){let b=await d.admitBoot({runtime:c.runtime,profileId:w,excludeUdids:[c.udid]},{signal:c.signal,bootUdid:c.udid,reason:c.reason});if(Ui(b),b.decision.outcome==="reuse-warm")(this.options.logger??e).info(`compatible warm simulator ${b.decision.udid} is booted; booting ${c.udid} as requested`);return b.releaseAdmission}}function Nd(d){let c=d.env??process.env;if(!Ci("ios",c))return;let{timer:w}=d;return new Jn(new PA(new AA(d.executor??new re,w,void 0,{simctl:d.simctl}),d.history,w),w,{env:c,ownership:d.ownership})}function GI(d){return new Qn({history:d.history??new RA,timer:d.timer,gate:d.gate})}var Ld=f.ANDROID_MAX_BOOTED.name,Fd="binding replacement",nv=2000;class Zn{source;timer;env;retryAfterMs;resolvedHardware;ledger;reservations=new Ze;hostRegistry;publications=new Map;lastProcessTableFailure;admissionsWithoutProcessTable=0;lastAdmissionWithoutProcessTableAtMs;warnedLimit;startedSerials=new Set;listedStartedSerials=new Set;constructor(d,c,w={}){this.source=d;this.timer=c;this.env=w.env??process.env,this.retryAfterMs=w.retryAfterMs??jI,this.resolvedHardware=w.resolvedHardware,this.ledger=new Ft(c),this.hostRegistry=w.hostRegistry}async admit(d){return d.signal?.throwIfAborted(),this.reservations.take()??(await this.admitNew(d)).admission}async reserveBoot(d){let c=await this.admitNew({...d,avdName:Fd},d.replacingDeviceId);return this.reservations.hold(()=>(c.bind(),c.admission),c.admission.release,c.markReplacedDeviceGone)}async admitNew(d,c){let w=this.timer.now()+d.timeoutMs,b=this.resolvedHardware?await this.candidateHardware(d):void 0,D,C,k=[],O,M=()=>Mt({timer:this.timer,platform:"android",signal:d.signal,sampleTimeoutMs:Math.min(d.timeoutMs,uc),label:"Android emulator capacity",sample:async()=>{let G=this.timer.now()+Math.min(d.timeoutMs,uc)-500,Z=this.readPeers(),ie=await this.sampleKnownCount({signal:d.signal,deadlineMs:G});return O=ie,k=this.unionPeers(Z,this.readPeers()),ie},ledger:this.ledger,decide:(G,Z)=>this.decide(G,{window:Z,peers:k,replacingDeviceId:c,candidate:b}),admit:()=>{D=this.ledger.admit(c,c!==void 0);try{if(C=this.hostRegistry?.publish({admittedUntilMs:w,...c!==void 0?{deviceId:c,replacement:!0}:{}}),C)this.publications.set(C,{})}catch(G){throw D.release(),this.registryFailure(G)}return D.release}}),F=await this.runWithHostLock(d,M).catch((G)=>{throw D?.release(),this.removePublication(C),G});Lt(F,"android","emulator");let q=D;if(!q)throw new t(`Boot admission for AVD '${d.avdName}' ended without a slot`);if(O?.processTableFailure)this.recordAdmissionWithoutProcessTable(d.avdName,O);let V=new Set,U=!1;return{admission:{release:()=>{U=!0,q.release(),this.removePublication(C);for(let G of V)if(!this.listedStartedSerials.has(G))this.startedSerials.delete(G);V.clear()},handOff:(G,Z)=>{if(U)return;if(G!==void 0)this.startedSerials.add(G),V.add(G);q.handOff(G,w,Z);let ie=C?this.publications.get(C):void 0;if(ie)ie.deviceId=G??ie.deviceId,ie.handedOffUntilMs=w;this.updatePublication(C,()=>C?.update({deviceId:G,processId:Z,handedOffUntilMs:w,...c!==void 0?{replacement:!1}:{}}))}},markReplacedDeviceGone:()=>{q.bind();try{C?.clearDeviceId()}catch(G){e.warn(`[BootAdmission] Failed to clear replaced device '${c}' from the host registry; continuing replacement with the reservation held. The stale record keeps the replaced device id until boot hand-off; peers may undercount only if that serial is reused: ${r(G)}`,G)}},bind:()=>q.bind()}}async assertCapacityAvailable(d={}){if(d.signal?.throwIfAborted(),this.reservations.hasPending())return;let{sample:c,window:w,peers:b}=await this.sampleInWindow(d);Lt({decision:this.decide(c,{window:w,peers:b})},"android","emulator")}async describeCapacity(d={}){let{sample:c,window:w,peers:b}=await this.sampleInWindow(d),D=this.count(c,w,b);return{limit:D.limits.maxBooted,booted:D.booted,inFlight:D.inFlight,...this.describeProcessTable(c)}}recordAdmissionWithoutProcessTable(d,c){let w=c.processTableFailure;this.admissionsWithoutProcessTable+=1,this.lastAdmissionWithoutProcessTableAtMs=this.timer.now();let b=`[BootAdmission] Admitted AVD '${d}' on adb-only count ${c.emulatorSerials.length}: ${w.reason}, attempts=${w.attempts}: ${w.detail}`;if(w.reason==="unsupported-platform")e.debug(b);else e.warn(b)}describeProcessTable(d){let c=d.processTableFailure??this.lastProcessTableFailure;if(!c||!d.processTableFailure&&this.admissionsWithoutProcessTable===0)return{};return{processTable:{unavailable:d.processTableFailure!==void 0,reason:c.reason,detail:c.detail,attempts:c.attempts,admissionsWithoutProcessTable:this.admissionsWithoutProcessTable,...this.lastAdmissionWithoutProcessTableAtMs!==void 0?{lastAdmissionWithoutProcessTableAtMs:this.lastAdmissionWithoutProcessTableAtMs}:{}}}}async sampleInWindow(d){d.signal?.throwIfAborted();let c=this.ledger.beginSample(),w=new AbortController,b=d.signal?AbortSignal.any([d.signal,w.signal]):w.signal;try{let D=this.readPeers(),C=await l(()=>this.sampleKnownCount({signal:b}),{timer:this.timer,timeoutMs:uc,signal:d.signal,label:"Collecting Android emulator capacity",timeoutError:()=>Vn("android",uc,"Android emulator capacity"),onTimeout:()=>w.abort()});return d.signal?.throwIfAborted(),{sample:C,window:c,peers:this.unionPeers(D,this.readPeers())}}finally{c.close()}}async sampleKnownCount(d){let c=await this.source.sample({...d,deadlineMs:d.deadlineMs??this.timer.now()+uc-500});if(c.processTableFailure)this.lastProcessTableFailure=c.processTableFailure;if(c.errors.length===0)return c;let w=c.errors.join("; ");if(c.serialListingFailed&&c.emulatorProcessRssBytes===void 0)throw e.warn(`[BootAdmission] Android emulator count unknown; refusing to boot: ${w}`),new en({code:"failed",message:`emulator count unknown (${w})`,retryable:!0});return e.debug(`[BootAdmission] Android capacity sample partially failed: ${w}`),c}decide(d,{window:c,peers:w=[],replacingDeviceId:b,candidate:D}={}){this.forgetExitedSerials(d);let{limits:C,effective:k}=this.count(d,c,w,D),O=b!==void 0&&d.emulatorSerials.includes(b)?1:0;if(k-O<C.maxBooted)return{outcome:"allow",limits:C,bootedCount:k};return Ai(k,C,this.retryAfterMs,{noun:"emulator",envName:Ld,externalDevices:d.emulatorSerials.filter((M)=>!this.startedSerials.has(M))})??{outcome:"allow",limits:C,bootedCount:k}}forgetExitedSerials(d){if(d.serialListingFailed)return;let c=new Set(d.emulatorSerials);for(let w of this.startedSerials)if(c.has(w))this.listedStartedSerials.add(w);else if(this.listedStartedSerials.delete(w))this.startedSerials.delete(w)}count(d,c,w=[],b){this.removeListedPublications(d);let D=d.emulatorSerials.length,C=d.emulatorProcessRssBytes?.length??0,k=new Set((d.emulatorProcessIds??[]).flatMap((Z)=>[Z.pid,Z.ppid])),O=this.ledger.inFlightView(new Set(d.emulatorSerials),void 0,c,k),M=this.countPeers(w,new Set(d.emulatorSerials),k),F=O.count+M.count,q=Math.max(D,C),V=F-O.withListedProcess-M.withListedProcess,U=Math.max(D+F,C+V),W=Math.max(D+F,C+V+O.listedWithoutProcess+M.listedWithoutProcess),G=this.limitsFor(d,[...O.boots,...M.boots],b);return{booted:q,inFlight:U-q,effective:W,limits:G}}async runWithHostLock(d,c){if(!this.hostRegistry)return c();let w=!1,b=async()=>{try{return await c()}catch(D){throw w=!0,D}};try{return await this.hostRegistry.withAdmissionLock({timeoutMs:Math.min(d.timeoutMs,uc),signal:d.signal},b)}catch(D){if(d.signal?.aborted)throw d.signal.reason;if(w)throw D;throw this.registryFailure(D)}}readPeers(){try{return this.hostRegistry?.readPeerAdmissions()??[]}catch(d){throw this.registryFailure(d)}}registryFailure(d){return e.warn(`[BootAdmission] Android host registry refused admission: ${r(d)}`,d),new en({code:d instanceof Ye?d.code:"failed",message:`Host boot registry: ${r(d)}`,retryable:!0})}unionPeers(d,c){return[...new Map([...d,...c].map((w)=>[w.id,w])).values()]}countPeers(d,c,w){let b=d.filter((O)=>{let M=O.handedOffUntilMs??O.admittedUntilMs;return M===void 0||this.timer.now()<M}),D=(O)=>O.deviceId!==void 0&&c.has(O.deviceId),C=(O)=>O.processId!==void 0&&w.has(O.processId),k=b.filter((O)=>!D(O));return{count:k.length,boots:k.map((O)=>({processId:O.processId,handedOff:O.handedOffUntilMs!==void 0})),withListedProcess:k.filter(C).length,listedWithoutProcess:b.filter((O)=>D(O)&&!C(O)&&!O.replacement).length}}updatePublication(d,c){if(!d)return!1;try{return c(),!0}catch(w){return e.warn(`[BootAdmission] Host registry update/remove failed: ${r(w)}`,w),!1}}removePublication(d){if(!d)return;let c=this.publications.get(d);if(c)c.pendingRemoval=!0;if(this.updatePublication(d,()=>d.remove()))this.publications.delete(d)}removeListedPublications(d){for(let[c,w]of this.publications){let b=w.deviceId!==void 0&&d.emulatorSerials.includes(w.deviceId),D=w.handedOffUntilMs!==void 0&&this.timer.now()>=w.handedOffUntilMs;if(w.pendingRemoval||b||D)this.removePublication(c)}}coresPerDevice(d){return I(f.ANDROID_BOOT_BUDGET_VCPUS,this.env)?.trim().toLowerCase()==="configured"?d?.cpuCores:void 0}async candidateHardware(d){let c=this.resolvedHardware;if(!c||d.avdName===Fd)return;try{return await l(()=>c(d.avdName,d.signal),{timer:this.timer,timeoutMs:nv,signal:d.signal,label:"Reading resolved AVD hardware"})}catch(w){if(d.signal?.aborted)throw w;e.warn(`[BootAdmission] Could not read resolved hardware for '${d.avdName}': ${r(w)}`,w);return}}limitsFor(d,c,w){let b=Ed(this.env,Ld,d.host,{perDeviceBytes:Ad(Oi(d.emulatorProcessRssBytes?.map((D,C)=>({rssBytes:D,...d.emulatorProcessIds?.[C]})),c,Wn),w?.guestBytes,Wn),coresPerDevice:this.coresPerDevice(w)});if(b.warning&&b.warning!==this.warnedLimit)this.warnedLimit=b.warning,e.warn(`[BootAdmission] ${b.warning}`);return b}}import{readFile as ov}from"fs/promises";var zy={listEntries:()=>Qt("/proc"),readText:(d)=>ov(d,"utf8")},$d=32;function sv(d){let c=new Map;for(let w of d.split(`
|
|
160
|
-
`)){let b=w.indexOf(":");if(b>=0)c.set(w.slice(0,b).trim(),w.slice(b+1).trim())}return c}function Ud(d){if(d===void 0||!/^\d+$/.test(d))return;let c=Number(d);return Number.isSafeInteger(c)?c:void 0}function av(d){if(d===void 0)return 0;let[c,w,b]=d.split(/\s+/),D=Ud(c);if(D===void 0||w!=="kB"||b!==void 0)return;let C=D*1024;return Number.isSafeInteger(C)?C:void 0}function dv(d,c,w){let b=sv(c),D=Ud(b.get("PPid")),C=av(b.get("VmRSS"));if(D===void 0||C===void 0)return;let k=w.split("\x00");if(k.at(-1)==="")k.pop();return{pid:d,ppid:D,rssBytes:C,command:w===""?`[${b.get("Name")??""}]`:k.join(" ")}}function cv(d){return d instanceof Error&&"code"in d&&(d.code==="ENOENT"||d.code==="ESRCH")}function lv(d){return typeof d==="object"&&d!==null&&"code"in d&&(d.code==="EACCES"||d.code==="EPERM")}async function uv(d,c){try{let w=await d.readText(`/proc/${c}/status`),b=await d.readText(`/proc/${c}/cmdline`),D=dv(Number(c),w,b);return{row:D,incomplete:D===void 0}}catch(w){if(lv(w))return e.debug(`[BootAdmission] skipping denied /proc/${c}: ${r(w)}`),{deniedError:w,incomplete:!0};if(!cv(w))throw u(w,`Reading /proc/${c}`);return e.debug(`[BootAdmission] skipping exited /proc/${c}: ${r(w)}`),{}}}async function qd(d,{signal:c}={}){c?.throwIfAborted();let w=(await d.listEntries()).filter((O)=>/^\d+$/.test(O)),b=[],D=0,C=!1,k;for(let O=0;O<w.length;O+=$d){c?.throwIfAborted();let M=await Promise.all(w.slice(O,O+$d).map((q)=>uv(d,q))),F=M.flatMap(({row:q})=>q?[q]:[]);b.push(...F),D+=M.length-F.length,C||=M.some((q)=>q.incomplete),k??=M.find((q)=>q.deniedError!==void 0)?.deniedError}if(c?.throwIfAborted(),D>0)e.debug(`[BootAdmission] /proc skipped ${D} exited, denied or unparseable rows`);if(b.length===0){if(k!==void 0)throw u(k,"Reading /proc: no readable processes");throw Error(`/proc returned no parseable processes (${D} unparseable rows)`)}return{value:b,incomplete:C}}var mv=new Map([["EAGAIN","spawn-resources"],["EMFILE","spawn-resources"],["ENFILE","spawn-resources"],["ENOMEM","spawn-resources"],["ENOENT","not-found"],["ENOTDIR","not-found"],["EACCES","denied"],["EPERM","denied"],["ERR_CHILD_PROCESS_STDIO_MAXBUFFER","output-too-large"]]),Hd=new Set(["timeout","spawn-resources","exit","killed"]),pv=/operation not permitted|permission denied/i,fv=/illegal option|invalid option|unrecognized option|usage:/i,Vd=250,gv=3;function Qd(d){return Buffer.isBuffer(d)?d.toString():typeof d==="string"?d:""}function vv(d,c){if(d===0)return"unknown";let w=Qd(c);if(d===126||pv.test(w))return"denied";if(d===127)return"not-found";return fv.test(w)?"unsupported-flags":"exit"}function hv(d,c,w){return"killed"in d&&d.killed===!0&&c==="SIGTERM"&&w===null?"timeout":"killed"}function yv(d){let c="code"in d?d.code:void 0;if(typeof c==="string")return mv.get(c)??"unknown";if(typeof c==="number")return vv(c,"stderr"in d?d.stderr:void 0);if("signal"in d&&typeof d.signal==="string")return hv(d,d.signal,c);return/^(?:ps|\/proc) returned no parseable processes/.test(r(d))?"unparseable":"unknown"}function wv(d,c,w){if(c==="timeout")return`timed out after ${w}ms`;if(c==="killed"&&"signal"in d)return`killed by ${String(d.signal)}`;let b="code"in d?d.code:void 0;if(typeof b==="number"){let C=Qd("stderr"in d?d.stderr:void 0).split(/\r?\n/).find((k)=>k.trim());return C?`exit ${b}: ${C}`:`exit ${b}`}let D=r(d);return typeof b==="string"?`${b}: ${D}`:D}function Wd(d,c){let w=new Set,b="unknown",D=r(d);for(let C=d;typeof C==="object"&&C!==null&&!w.has(C);){if(w.add(C),"name"in C&&C.name==="AbortError")throw d;let k=yv(C);if(k!=="unknown")b=k,D=wv(C,k,c);C="cause"in C?C.cause:void 0}return{reason:b,detail:D.split(/\r?\n/,1)[0].slice(0,200)}}class nh{executor;timer;attemptTimeoutMs;maxAttempts;backoff;budgetMs;supported;warnedReasons=new Set;warnedProcReasons=new Set;procFs;exitDeterministicAfterSamples;consecutiveExitSamples=0;exitLatched=!1;procLatched=!1;constructor(d,c={}){this.executor=d;this.timer=c.timer??i,this.attemptTimeoutMs=c.attemptTimeoutMs??5000,this.maxAttempts=c.maxAttempts??4,this.backoff=No(c.backoff??Q({initialDelayMs:100,maxDelayMs:800})),this.budgetMs=c.budgetMs??9000,this.supported=c.processTableSupported??!0,this.procFs=c.procFs,this.exitDeterministicAfterSamples=c.exitDeterministicAfterSamples??gv}async read(d){try{return await this.readSupported(d)}catch(c){throw this.consecutiveExitSamples=0,e.debug(`[BootAdmission] process table read cancelled: ${r(c)}`),c}}async readSupported(d){if(d.signal?.throwIfAborted(),!this.supported)return this.failed({reason:"unsupported-platform",transient:!1,attempts:0,detail:"Host platform has no ps process table"});let c=d.deadlineMs??this.timer.now()+this.budgetMs;if(this.procLatched)return this.readProc(d,c);return this.readPs(d,c)}async readPs(d,c){let w;for(let b=1;;b++){d.signal?.throwIfAborted();let D=b===1?this.attemptTimeoutMs:Math.min(this.attemptTimeoutMs,c-this.timer.now());try{let C=await this.attempt((k)=>qi(this.executor,{signal:k,timeoutMs:D}),D,d.signal,"ps");if(this.resetExitLatch(),w)e.info(`[BootAdmission] emulator process snapshot succeeded on attempt ${b} after ${w}`);return{value:C}}catch(C){d.signal?.throwIfAborted();let{reason:k,detail:O}=Wd(C,D),M=Hd.has(k)&&!(k==="exit"&&this.exitLatched),F={reason:k,transient:M,attempts:b,detail:O},q=this.retryDelay(F,c);if(q===void 0)return this.finishPsFailure(F,C,d,c);if(w=k,await l(()=>this.timer.sleep(q),{timer:this.timer,signal:d.signal,label:"Android process table retry backoff"}),c-this.timer.now()<Vd)return this.finishPsFailure(F,C,d,c)}}}async attempt(d,c,w,b){let D=new AbortController,C=w?AbortSignal.any([w,D.signal]):D.signal;return l(()=>d(C),{timer:this.timer,timeoutMs:c,signal:w,label:`Android ${b} process table`,timeoutError:()=>{let k=Object.assign(Error(`timed out after ${c}ms`),{killed:!0,signal:"SIGTERM",code:null});return b==="ps"?oD(k,{command:"ps",args:pD}):k},onTimeout:()=>D.abort()})}resetExitLatch(){this.consecutiveExitSamples=0,this.exitLatched=!1,this.warnedReasons.delete("exit")}recordPsFailure(d){if(d.reason!=="exit"){this.consecutiveExitSamples=0;return}if(this.exitLatched)return;if(this.consecutiveExitSamples+=1,this.consecutiveExitSamples<this.exitDeterministicAfterSamples)return;this.exitLatched=!0,this.warnedReasons.add("exit"),e.warn(`[BootAdmission] ps exit repeated for ${this.consecutiveExitSamples} exhausted samples; retries stop until ps succeeds: ${d.detail}`)}finishPsFailure(d,c,w,b){if(this.recordPsFailure(d),!d.transient&&this.procFs)return this.readProc(w,b,d);return this.failed(d,r(c))}async readProc(d,c,w){let b=Math.max(0,Math.min(this.attemptTimeoutMs,c-this.timer.now()));try{let D=await this.attempt((C)=>qd(this.procFs,{signal:C}),b,d.signal,"/proc");if(!this.procLatched)e.info(`[BootAdmission] ps unavailable (${w?.reason}: ${w?.detail}); using /proc process table instead`),this.procLatched=!0;return D}catch(D){d.signal?.throwIfAborted();let C=Wd(D,b),k=w?`; ps ${w.reason}`:"",O=`/proc: ${C.detail.slice(0,193-k.length)}${k}`,M={...C,detail:O,transient:Hd.has(C.reason),attempts:w?.attempts??0},F=this.failed(M,O,this.warnedProcReasons);return this.warnedProcReasons.add(M.reason),F}}retryDelay(d,c){if(!d.transient||d.attempts>=this.maxAttempts)return;let w=this.backoff.delayForAttempt(d.attempts);return this.timer.now()+w+Vd<=c?w:void 0}failed(d,c=d.detail,w=this.warnedReasons){let b=`[BootAdmission] emulator process snapshot unavailable: ${d.reason}, attempts=${d.attempts}: ${d.detail}`;if(d.reason==="unsupported-platform"||w.has(d.reason))e.debug(b);else e.warn(b);if(!d.transient)w.add(d.reason);return{failure:d,error:`ps: ${c}`}}}function Zd(d,c){return async(w)=>{let D=(await d.getDeviceStates({timeoutMs:c,signal:w,throwOnMissingAdb:!0})).map((C)=>C.deviceId).filter((C)=>C.startsWith("emulator-"));return[...new Set(D)]}}class eo{listEmulatorSerials;os;processTable;constructor(d,c,w=Yn,b={}){this.listEmulatorSerials=d;this.os=w;this.processTable=new nh(c,b)}async sample(d={}){let c=await this.readSerials(d.signal),w=await this.processTable.read(d),b=w.value?.filter(Sg);return{emulatorSerials:c.value??[],emulatorProcessRssBytes:b?.map((D)=>D.rssBytes),emulatorProcessIds:b?.map((D)=>({pid:D.pid,ppid:D.ppid})),host:{totalMemoryBytes:this.os.totalMemoryBytes(),cpuCount:this.os.cpuCount()},errors:[c.error,w.error].filter((D)=>D!==void 0),...w.failure?{processTableFailure:w.failure}:{},...c.error!==void 0?{serialListingFailed:!0}:{}}}async readSerials(d){try{return{value:await this.listEmulatorSerials(d)}}catch(c){return d?.throwIfAborted(),e.warn(`[BootAdmission] adb emulator listing failed: ${r(c)}`,c),{error:`adb: ${r(c)}`}}}}var Sv=5000;function Rv(d=process.env,c){return bv($u(sg(d),"boot-admissions",d,c),"android")}var tc,to;function V7(d){to=d}var Pv={refresh:async()=>{await to?.refresh()},isAutoMobileOwned:(d)=>to?.isAutoMobileOwned(d)??!1};function ih(d={}){return tc??=Iv(d),tc}function Iv(d={}){let c=d.env??process.env,w=d.timer??i,b=new RA,D=!mn.bootAdmissionGatesDisabled&&Ci("android",c),C=new re;return{android:D?new Zn(new eo(Zd({getDeviceStates:async(k)=>{let O=v.create(null);if(!O.getDeviceStates)throw new t("adb client cannot list raw device states");return O.getDeviceStates(k)}},Sv),C,void 0,{timer:w,processTableSupported:(d.hostPlatform??process.platform)!=="win32",procFs:(d.hostPlatform??process.platform)==="linux"?zy:void 0}),w,{env:c,resolvedHardware:async(k)=>{let O=await new Br().readConfig(k);return O?{...O.effectiveRamMb===void 0?{}:{guestBytes:O.effectiveRamMb*1024*1024},...O.effectiveCpuCores===void 0?{}:{cpuCores:O.effectiveCpuCores}}:void 0},hostRegistry:new Hn({timer:w,directory:()=>Rv(c)})}):void 0,ios:mn.bootAdmissionGatesDisabled||(d.hostPlatform??process.platform)!=="darwin"?void 0:Nd({simctl:new L(null),timer:w,history:b,ownership:Pv,env:c,executor:C}),iosBootHistory:b}}function s0(d){return d==="android"?"android":"ios"}async function CS(d,c={},w=ih()){await w[s0(d)]?.assertCapacityAvailable(c)}async function Cq(d,c,w=ih()){return c.signal?.throwIfAborted(),await w[s0(d)]?.reserveBoot(c)??{run:(b)=>b(),release:()=>{},markReplacedDeviceGone:()=>{}}}var Cv=3000;async function W7(d,c=Av(ih()),w=i){let b=await Promise.all(d.map(async(C)=>{let k=c[C];if(!k)return[];let O=new AbortController;try{let M=await l(()=>k.describeCapacity({signal:O.signal}),{timer:w,timeoutMs:Cv,label:`Reporting ${C} boot capacity`,onTimeout:()=>O.abort()});return[[C,M]]}catch(M){return e.warn(`[BootAdmission] ${C} capacity report failed: ${r(M)}`,M),[]}})),D=Object.fromEntries(b.flat());return Object.keys(D).length>0?D:void 0}function Av(d){return{...d.android?{android:d.android}:{},...d.ios?{ios:d.ios}:{}}}import{performance as Ev}from"perf_hooks";import xv from"fs";import Tv from"path";var Bv="STARTUP_BENCHMARK";function kv(d,c){if(d.includes("--startup-benchmark"))return!0;return d.includes("--daemon-mode")&&Be(f.STARTUP_BENCHMARK,c)}var Ov=kv(process.argv,process.env),Mv=I(f.STARTUP_BENCHMARK_OUTPUT),Nv=I(f.STARTUP_BENCHMARK_LABEL);class ic{marks=new Map;phaseStarts=new Map;phases=new Map;emitted=!1;emittedReport;enabled;outputPath;label;now;fileSystem;constructor(d,c={}){this.enabled=d;let w=c.outputPath??Mv;this.outputPath=w?Se(w):void 0,this.label=c.label??Nv,this.now=c.now??Ev.now,this.fileSystem=c.fileSystem??xv}isEnabled(){return this.enabled}mark(d){if(!this.enabled||this.marks.has(d))return;this.marks.set(d,this.now()),this.persistCheckpoint()}startPhase(d){if(!this.enabled||this.phases.has(d)||this.phaseStarts.has(d))return;this.phaseStarts.set(d,this.now()),this.persistCheckpoint()}async runPhase(d,c){this.startPhase(d);let w=await c();return this.endPhase(d),w}endPhase(d){if(!this.enabled||this.phases.has(d))return;let c=this.phaseStarts.get(d);if(c===void 0)return;this.phases.set(d,this.now()-c),this.phaseStarts.delete(d),this.persistCheckpoint()}recordPhase(d,c){if(!this.enabled||this.phases.has(d))return;this.phases.set(d,c),this.persistCheckpoint()}emit(d,c={}){if(!this.enabled||this.emitted)return;this.emitted=!0,this.emittedReport={type:d,meta:c};let w=this.createReport(d,"ready",c),b=JSON.stringify(w);if(this.writeReport(b),gE()==="json"){e.info(b);return}process.stderr.write(`${Bv} ${b}
|
|
161
|
-
`)}persistCheckpoint(){if(!this.enabled)return;let d=this.emittedReport?this.createReport(this.emittedReport.type,"ready",this.emittedReport.meta):this.createReport("startup-checkpoint","in_progress");this.writeReport(JSON.stringify(d))}createReport(d,c,w={}){let b=Object.fromEntries(this.marks.entries()),D=Object.fromEntries(this.phases.entries());return{type:d,state:c,timestamp:new Date().toISOString(),pid:process.pid,label:this.label,marks:b,phases:D,activePhases:[...this.phaseStarts.keys()],memoryUsage:process.memoryUsage(),meta:w}}writeReport(d){if(!this.outputPath)return;let c=Tv.dirname(this.outputPath);if(!this.fileSystem.existsSync(c))this.fileSystem.mkdirSync(c,{recursive:!0});let w=`${this.outputPath}.${process.pid}.tmp`;this.fileSystem.writeFileSync(w,d,"utf-8"),this.fileSystem.renameSync(w,this.outputPath)}}var Dt=new ic(Ov);var a0=9000,Lv=100;class rc{lifecycleProcess;timer;shutdownTimeoutMs;installed=!1;stdinShutdownHandlersInstalled=!1;stdoutShutdownHandlerInstalled=!1;stderrErrorGuardInstalled=!1;hangupShutdownHandlerInstalled=!1;shutdownInProgress=!1;shutdownStarted=Promise.withResolvers();shutdownHandler;shutdownExitCode;shutdownTimeoutHandler;fatalProcessHandler;constructor(d,c=i,w=a0){this.lifecycleProcess=d;this.timer=c;this.shutdownTimeoutMs=w}install(){if(this.installed)return;this.installed=!0,this.lifecycleProcess.on("SIGINT",()=>{this.shutdown("SIGINT")}),this.lifecycleProcess.on("SIGTERM",()=>{this.shutdown("SIGTERM")}),this.lifecycleProcess.on("uncaughtException",(d)=>{this.handleFatalProcessEvent({type:"uncaughtException",error:d})}),this.lifecycleProcess.on("unhandledRejection",(d,c)=>{this.handleFatalProcessEvent({type:"unhandledRejection",reason:d,promise:c})})}setShutdownHandler(d,c){this.shutdownHandler=d,this.shutdownTimeoutHandler=c}setFatalProcessHandler(d){this.fatalProcessHandler=d}setShutdownExitCode(d){this.shutdownExitCode=d}installHangupShutdownHandler(){if(this.hangupShutdownHandlerInstalled)return;this.hangupShutdownHandlerInstalled=!0,this.lifecycleProcess.on("SIGHUP",()=>{this.shutdown("SIGHUP")})}installStdinShutdownHandlers(d,c,w=a0){if(this.stdinShutdownHandlersInstalled)return;this.stdinShutdownHandlersInstalled=!0;let b=!1,D=()=>{if(b)return;b=!0;let C=void 0;try{C=c?.()}catch(k){Zi("Error in stdin client-gone callback",k)}if(C){if(this.shutdownInProgress){C.catch((k)=>Zi("Error in stdin answer wait",k));return}this.waitForStdinAnswers(C,w)}else this.shutdown("stdin")};d.on("end",D),d.on("error",D),d.on("close",D)}async waitForStdinAnswers(d,c){try{await l([d,this.shutdownStarted.promise],{timer:this.timer,timeoutMs:c,label:"stdin answer wait"})}catch(w){Zi("Error in stdin answer wait",w)}await this.shutdown("stdin")}installStdoutShutdownHandler(d,c){if(this.stdoutShutdownHandlerInstalled)return;this.stdoutShutdownHandlerInstalled=!0;let w=!1,b=()=>{if(w)return;w=!0;try{c?.()}catch(D){Zi("Error in stdout client-gone callback",D)}this.shutdown("stdout")};d.on("error",b),d.on("close",b)}installStderrErrorGuard(d){if(this.stderrErrorGuardInstalled)return;this.stderrErrorGuardInstalled=!0,d.on("error",()=>{})}requestShutdown(d){return this.shutdown(d)}async shutdown(d){if(this.shutdownInProgress)return;this.shutdownInProgress=!0,this.shutdownStarted.resolve();try{let c=await this.runShutdownHandler(d),w=this.shutdownExitCode??0;if(!c)Zi(`Shutdown timed out after ${this.shutdownTimeoutMs}ms; forcing exit`),w=(await this.runShutdownTimeoutHandler())?.exitCode??1;this.lifecycleProcess.exit(w)}catch(c){Zi(`Error during ${d} shutdown`,c),this.lifecycleProcess.exit(1)}}async runShutdownHandler(d){let c=this.shutdownHandler;if(!c)return!0;let w=Symbol("shutdown timeout");try{return await l(()=>Promise.resolve(c(d)),{timer:this.timer,timeoutMs:this.shutdownTimeoutMs,label:"Process shutdown",timeoutError:()=>w}),!0}catch(b){if(b!==w)throw b;return!1}}async runShutdownTimeoutHandler(){let d=this.shutdownTimeoutHandler;if(!d)return;let c=Math.min(this.shutdownTimeoutMs,Lv),w=Symbol("shutdown finalization timeout");try{return await l(Promise.resolve(d()),{timer:this.timer,timeoutMs:c,label:"Shutdown finalization",timeoutError:()=>w})}catch(b){if(b!==w)throw b;Zi(`Shutdown finalization timed out after ${c}ms; forcing exit`);return}}async handleFatalProcessEvent(d){let c=this.fatalProcessHandler;if(!c){if(d.type==="uncaughtException")Zi("Uncaught exception",d.error);else Zi("Unhandled rejection",d.reason);this.lifecycleProcess.exit(1);return}try{await c(d)}catch(w){Zi("Error in fatal process handler",w),this.lifecycleProcess.exit(1)}}}var Te=new rc(process);function c0(){Fv(),Te.install()}function z7(){Te.installHangupShutdownHandler()}function j7(d=process.stdin,c,w){Te.installStdinShutdownHandlers(d,c,w)}function K7(d=process.stdout,c){Te.installStdoutShutdownHandler(d,c)}function Fv(d=process.stderr){Te.installStderrErrorGuard(d)}function G7(d){return Te.requestShutdown(d)}function DS(d,c){Te.setShutdownHandler(d,c)}function Y7(d){Te.setShutdownExitCode(d)}function d0(d){Te.setFatalProcessHandler(d)}function P0(d,c){let w=parseInt(d??"",10);if(!isNaN(w)&&w>0&&w<65536)return w;c.warn(`Invalid port: ${d}`);return}function a_(d,c,w,b){if(!d)return;let D=w?Number(d):parseInt(d,10);if(!Number.isFinite(D)||D<=0){b.warn(`Invalid ${c}: ${d}`);return}return w?D:Math.round(D)}function nc(d,c,w){if(c===void 0)return;let b;try{b=w(d,c)}catch(D){return e.warn(`executionOwnerPid ${d} start identity could not be compared; trusting the PID alone: ${r(D)}`,D),"unknown"}if(b==="unknown")e.warn(`executionOwnerPid ${d} start identity could not be compared; trusting the PID alone`);return b}var R0="--session-config",aQ=f.SESSION_CONFIG.name,$v="session-broker/v1",cQ="automobile/session";class dm extends t{code="session_config_invalid";constructor(d,c){super(`session_config_invalid: ${d}`,c);this.name="SessionConfigError"}}var Uv=g({contractVersion:ne(1),requestId:y().trim().min(1).max(256),device:gr(),preparationTimeoutMs:T().int().positive().optional(),idleTimeoutMs:T().int().min(120000).max(3600000).optional(),executionOwnerPid:T().int().positive().optional(),executionOwnerStartIdentity:y().min(1).max(256).optional()}).strict().refine((d)=>d.executionOwnerStartIdentity===void 0||d.executionOwnerPid!==void 0,{message:"executionOwnerStartIdentity requires executionOwnerPid",path:["executionOwnerStartIdentity"]});function N4(d){let c=Uv.safeParse(d);if(!c.success)throw new dm(`Invalid session configuration: ${c.error.message}`);let w=Tt(c.data.device);if(!w.ok)throw new dm(`${w.error.code}: ${w.error.message}`);return{...c.data,device:w.value}}function Vv(d,c){let w=d.trim();if(w.length===0)throw new dm("session config value is empty; pass inline JSON or a file path");let b=w;if(!w.startsWith("{"))try{b=c(w)}catch(C){throw new dm(`cannot read session config file ${w}: ${r(C)}`,{cause:C})}let D;try{D=JSON.parse(b)}catch{throw new dm(`session config ${w.startsWith("{")?"inline value":`file ${w}`} is not valid JSON`)}return N4(D)}function dQ(d){let c=d.flagValue??d.envValue;if(c===void 0)return;if(d.hasInitialSessionUuid||d.noProxy)throw new dm("session config is incompatible with --initial-session-uuid, and --no-proxy");return Vv(c,d.readFile)}function Wv(d,c){let w=d?.executionOwnerPid;if(w!==void 0&&!c(w))throw new dm(`executionOwnerPid ${w} is not a running process`)}function Gv(d,c){let w=d?.executionOwnerPid;if(w===void 0)return;let b=nc(w,d?.executionOwnerStartIdentity,c);if(b==="different")throw new dm(`executionOwnerPid ${w} no longer names the process described by executionOwnerStartIdentity (the PID was reused)`);return b}function lQ(d,c){let w=d?.executionOwnerPid;if(w===void 0)return;return Wv(d,c.isProcessRunning),Gv(d,(D,C)=>c.probe.compare(D,C))==="same"?d?.executionOwnerStartIdentity:c.probe.current(w)}function uQ(d){return d.includes($v)}function Vi(d,c){let w=_R(d,c);return w&&(w.inline||w.value)?w.value:void 0}var Vc="--event-all-markers",jv=f.EVENT_ALL_MARKERS.name;function A0(d){return _R(d,[Vc])?.value!==void 0}function Kv(d){return d.split(",").map((c)=>c.trim()).filter((c)=>c.length>0)}function T0(d,c){let w=Vi(d,[Vc])??c[jv];if(!w)return[];return Kv(w)}var Yu=[{field:"observeResultIncludeElements",cli:"--observe-result-include-elements",env:f.OBSERVE_RESULT_INCLUDE_ELEMENTS.name,featureFlagKey:"observe-result-include-elements",label:"--observe-result-include-elements"},{field:"toolResultsNoStructuredContent",cli:"--tool-results-no-structured-content",env:f.TOOL_RESULTS_NO_STRUCTURED_CONTENT.name,featureFlagKey:"tool-results-no-structured-content",label:"--tool-results-no-structured-content"},{field:"actionsDiffObserve",cli:"--actions-diff-observe",env:f.ACTIONS_DIFF_OBSERVE.name,featureFlagKey:"actions-diff-observe",label:"--actions-diff-observe"},{field:"actionsNoObserve",cli:"--actions-no-observe",env:f.ACTIONS_NO_OBSERVE.name,featureFlagKey:"actions-no-observe",label:"--actions-no-observe"},{field:"actionsCompactMetadata",cli:"--actions-compact-metadata",disableCli:"--no-actions-compact-metadata",env:f.ACTIONS_COMPACT_METADATA.name,featureFlagKey:"actions-compact-metadata",label:"--actions-compact-metadata"}];function k0(d,c){let w={observeResultIncludeElements:!1,toolResultsNoStructuredContent:!1,actionsDiffObserve:!1,actionsNoObserve:!1};for(let b of Yu)if(b.field==="actionsCompactMetadata"){let D=b.disableCli?af(d,[b.disableCli]):void 0,C=af(d,[b.cli]);if(D===!0)w.actionsCompactMetadata=!1;else if(C!==void 0)w.actionsCompactMetadata=C;else if(c[b.env]==="0"||c[b.env]==="1")w.actionsCompactMetadata=c[b.env]==="1"}else w[b.field]=af(d,[b.cli])??c[b.env]==="1";return w}function Vq(d,c){return d??c??!0}function pQ(d){let c=[];for(let w of Yu)if(d[w.field])c.push(w.cli);else if(d[w.field]===!1&&w.disableCli)c.push(w.disableCli);return c}import oc from"path";var i_="--tool-outputs-dir",o_="--tool-output-dir",O4=f.TOOL_OUTPUTS_DIR.name,Jv=f.TOOL_OUTPUTS_DIR.legacyName;function zv(d,c){let w=d?.trim();if(!w)return;return oc.isAbsolute(w)?w:oc.resolve(c,w)}function v0(d,c,w){let b=Vi(d,[i_,o_]);return zv(b??c[O4]??c[Jv],w)}function ch(){return Qe(fn.TOOL_OUTPUTS)}var Rt="setToolEnabled";function sh(d){return d==="setToolEnabled"||d==="getAndroid"||d==="getApple"}var D4="ide/setSessionToolEnabled";function Xv(d){if(!d||typeof d!=="object")return[];let c=d.content;if(!Array.isArray(c))return[];return c.flatMap((w)=>{if(!w||typeof w!=="object"||w.type!=="text")return[];let b=w.text;return typeof b==="string"?[b]:[]})}function Yv(d){try{let c=JSON.parse(d);if(!c||typeof c!=="object")return;let{sessionUuid:w,scope:b}=c;return typeof w==="string"&&w.trim().length>0&&b==="connection-profile"?w:void 0}catch(c){if(!(c instanceof SyntaxError))throw c;return}}function ah(d){return Xv(d).map(Yv).find((c)=>c!==void 0)}var io;function iQ(d){io=d}function sc(){if(!io)throw new t("No configurable tool name source is registered; the MCP tool registry has not been loaded.");return io.getConfigurableToolNames()}class gc{repository;startupDefaults;pendingLists=new Map;constructor(d,c=new Map){this.repository=d;this.startupDefaults=c}async isEnabled(d,c,w){let b=this.startupDefaults.get(c)??w;if(!d)return b;return(await this.listOverrides(d)).get(c)??b}async getOverride(d,c){return(await this.listOverrides(d)).get(c)}listOverrides(d){let c=this.pendingLists.get(d);if(c)return c;let w=this.repository.list(d);this.pendingLists.set(d,w);let b=()=>{if(this.pendingLists.get(d)===w)this.pendingLists.delete(d)};return w.then(b,b),w}async setEnabled(d,c,w){this.pendingLists.delete(d),await this.repository.set(d,c,w)}async setEnabledMany(d,c,w){this.pendingLists.delete(d);let b=c.map((D)=>({toolName:D,enabled:w}));if(this.repository.setMany){await this.repository.setMany(d,b);return}for(let D of b)await this.repository.set(d,D.toolName,D.enabled)}async deleteSession(d){this.pendingLists.delete(d),await this.repository.deleteSession(d)}}function fc(d){return d?.split(",").map((c)=>c.trim()).filter(Boolean)??[]}function vc(d,c,w){let b=[],D=new Set,C;for(let k of d)if(c.has(k))b.push(k);else if(sh(k))D.add(k);else if(C===void 0)C=k;if(D.size>0)e.info(`Ignoring always-on tool name(s) ${[...D].join(", ")} from ${w}; they have no configurable enable/disable state.`);if(C!==void 0)throw Error(`Tool '${C}' is not a session-configurable tool name; ${w} accept session-configurable tools only (see the automobile:tools resource).`);return b}function Qv(d,c){let w=Object.keys(d).find((q)=>bU(q));if(w)throw Error(`${w} is retired; use AUTOMOBILE_ENABLED_TOOLS or AUTOMOBILE_DISABLED_TOOLS with exact tool names.`);let b=fc(I(f.ENABLED_TOOLS,d)),D=fc(I(f.DISABLED_TOOLS,d)),C=vc([...b,...D],c,"AUTOMOBILE_ENABLED_TOOLS/AUTOMOBILE_DISABLED_TOOLS"),k=b.filter((q)=>C.includes(q)),O=D.filter((q)=>C.includes(q)),M=new Set(O),F=k.find((q)=>M.has(q));if(F)throw Error(`Tool '${F}' cannot be both enabled and disabled in environment defaults.`);return new Map([...k.map((q)=>[q,!0]),...O.map((q)=>[q,!1])])}function Zv(d,c,w){return vc(d,c,w)}function zq(d,c,w=[],b=[]){let C=Zv([...w,...b],c,"CLI startup defaults (--enable-tool/--disable-tool)"),k=new Set(C),O=w.filter((V)=>k.has(V)),M=b.filter((V)=>k.has(V)),F=new Set(M),q=O.find((V)=>F.has(V));if(q)throw Error(`Tool '${q}' cannot be both enabled and disabled in CLI defaults.`);return new Map([...Qv(d,c),...O.map((V)=>[V,!0]),...M.map((V)=>[V,!1])])}var Wi,ro=[],no=[],oo=!0;function vQ(d,c,w={}){ro=[...d],no=[...c],oo=w.includeEnvironment??!0,Wi=void 0}function bQ(d,c=process.env){zq(oo?c:{},d,ro,no)}function mc(){if(!Wi){let{SqliteSessionToolSelectionRepository:d}=import.meta.require("./chunk-waqwcjyn.js"),c=new Set(sc());Wi=new gc(new d,zq(oo?process.env:{},c,ro,no))}return Wi}function E0(d=process.env){return Be(f.HEADLESS,d)}function mQ(d){d[f.HEADLESS.name]="1"}var ao="automobile-virtual-prototype",fQ=Object.freeze({name:"AutoMobile virtual prototype device",platform:"android",deviceId:ao});function Wq(d){return d.deviceId===ao}var hQ=["prototype_patch_v1","prototype_persistence_replay_v1","prototype_show_in_place_v1","prototype_adaptive_v1","prototype_bar_scroll_v1","prototype_chart_v1","prototype_chat_scroll_v1","prototype_checks_v1","prototype_choreography_v1","prototype_content_transition_v1","prototype_data_actions_v1","prototype_data_model_v1","prototype_drawer_v1","prototype_effects_v1","prototype_emit_context_v1","prototype_flow_grid_v1","prototype_format_v1","prototype_icon_effects_v1","prototype_keyframes_v1","prototype_lazy_list_v1","prototype_linkify_v1","prototype_loops_v1","prototype_menus_v1","prototype_motion_tokens_v1","prototype_motion_v2","prototype_motion_v3","prototype_network_v1","prototype_pager_options_v1","prototype_pager_state_key_v1","prototype_reduced_motion_v1","prototype_refresh_v1","prototype_rich_text_v1","prototype_routes_v1","prototype_scroll_motion_v1","prototype_search_bar_v1","prototype_semantics_v1","prototype_shared_element_v1","prototype_shared_element_v2","prototype_stack_transitions_v1","prototype_stack_v1","prototype_string_conditions_v1","prototype_strings_v1","prototype_text_field_leading_icon_v1","prototype_text_field_options_v1","prototype_theme_modes_v1","prototype_tooltip_v1","prototype_window_motion_v1"],dh=["prototype_anchor_v1","prototype_appearance_v1","prototype_backdrop_v1","prototype_custom_shaders_v1","prototype_dead_tap_v1","prototype_display_id_v1","prototype_display_id_v2","prototype_hide_keyboard_v1","prototype_multi_surface_v1","prototype_network_device_v1","prototype_platform_v1","prototype_platform_window_controls_v1","prototype_saved_v1","prototype_storage_v1","prototype_timers_v1","prototype_window_chrome_v1","prototype_window_options_v1"],lh=new Set(["save","listSaved","deleteSaved","open","clearStorage","simulate"]);function gQ(d){if(lh.has(d.action))return`${d.action} needs a real device: the headless virtual device has no saved prototypes, storage or prototype clock. Run without AUTOMOBILE_HEADLESS/--headless on an Android device or iOS simulator.`;if(d.display!==void 0)return"display needs a real Android device: the headless virtual device has one display. Omit display.";return}function yQ(){return{deviceId:ao,renderer:"web",unsupportedCapabilities:[...dh]}}var bc=Nt(Id());import*as me from"fs/promises";import $t from"path";var hc="screen-capture-helper",uh=448,yc=384,wc=448,mh=30000,ph=eY,Gi="screen-capture-helper",fh="screen-capture-helper.json";class qc{static instance=null;downloader;checksumCalculator;cacheDir;usesDefaultCacheDir;timer;cache;env;expectedChecksumOverride;releaseUrlOverride;downloadTimeoutMs;platform;inFlight=null;constructor(d={}){this.downloader=d.downloader??new bi,this.checksumCalculator=d.checksumCalculator??new an,this.cacheDir=d.cacheDir??Qe(hc),this.usesDefaultCacheDir=d.cacheDir===void 0,this.timer=d.timer??i,this.cache=new so({downloader:this.downloader,checksumCalculator:this.checksumCalculator,timer:this.timer}),this.env=d.env??process.env,this.expectedChecksumOverride=d.expectedChecksum,this.releaseUrlOverride=d.releaseUrl,this.downloadTimeoutMs=d.downloadTimeoutMs??mh,this.platform=d.platform??process.platform}static getInstance(){return qc.instance??=new qc,qc.instance}static resetInstances(){qc.instance=null}async ensure(){if(this.inFlight)return this.inFlight;return this.inFlight=this.doEnsure().finally(()=>{this.inFlight=null}),this.inFlight}async doEnsure(){let d=this.expectedChecksumOverride??ane(this.env);if(d.length===0)return e.info("[SCREEN_CAPTURE_HELPER] Expected checksum unknown for the pinned version; no release helper can be trusted."),null;let c=await this.tryCache(d);if(c)return e.info("[SCREEN_CAPTURE_HELPER] Reusing verified release helper",{path:c}),c;return this.download(d)}get helperPath(){return $t.join(this.cacheDir,Gi)}get metadataPath(){return $t.join(this.cacheDir,fh)}async tryCache(d){return await this.cache.isCached({label:"[SCREEN_CAPTURE_HELPER]",subject:"helper",expectedSha256:d,metadataPath:this.metadataPath,parseMetadata:(w)=>gh(w)?w:null,verifyArtifact:(w)=>this.isHelperExecutable(w.size)})?this.helperPath:null}async isHelperExecutable(d){try{let c=await me.stat(this.helperPath);return!(!c.isFile()||c.size!==d||this.platform!=="win32"&&(c.mode&73)===0)}catch(c){return e.debug("[SCREEN_CAPTURE_HELPER] No usable cached helper executable",{error:r(c)}),!1}}async ensureSecureCacheDir(){if(this.usesDefaultCacheDir)return di(hc);return await me.mkdir(this.cacheDir,{recursive:!0,mode:uh}),this.cacheDir}async download(d){let c=await this.ensureSecureCacheDir(),w=$t.join(c,`${ph}.download`),b=$t.join(c,`${Gi}.download`);return await this.cache.fetch({label:"[SCREEN_CAPTURE_HELPER]",expectedSha256:d,url:this.releaseUrlOverride??sne(this.env),archivePath:w,metadataPath:this.metadataPath,metadataMode:yc,downloadTimeoutMs:this.downloadTimeoutMs,afterDownload:(D)=>me.chmod(D,yc),mismatchError:(D,C)=>new t(`screen-capture-helper checksum verification failed. Expected: ${D}, Got: ${C}. The downloaded release asset is corrupted or tampered.`),timeoutError:()=>new t(`Timed out downloading screen-capture-helper after ${this.downloadTimeoutMs}ms. Check GitHub Release asset availability or set AUTOMOBILE_IOS_SCREEN_CAPTURE_HELPER for local development.`),publish:async(D,C)=>{await me.writeFile(b,vh(D),{mode:wc}),await me.chmod(b,wc);let{size:k}=await me.stat(b);return await me.rename(b,this.helperPath),e.info("[SCREEN_CAPTURE_HELPER] Downloaded and verified release helper",{path:this.helperPath,sha256:C}),{version:De(this.env),sha256:C??d,size:k,downloadedAt:this.timer.now()}},discard:()=>me.rm(b,{force:!0})}),this.helperPath}}function gh(d){return typeof d==="object"&&d!==null&&"sha256"in d&&typeof d.sha256==="string"&&"size"in d&&typeof d.size==="number"}function vh(d){let c;try{c=new bc.default(d)}catch(b){throw new t(`screen-capture-helper release asset is not a valid zip archive: ${r(b)}`)}let w=c.getEntries().filter((b)=>!b.isDirectory&&$t.posix.basename(b.entryName)===Gi);if(w.length!==1)throw new t(`screen-capture-helper release asset must contain exactly one ${Gi}.`);try{return w[0].getData()}catch(b){if(b instanceof t)throw b;throw new t(`Unable to extract screen-capture-helper release asset: ${r(b)}`)}}import{existsSync as Yc}from"fs";import ny from"path";var Pc=Nt(Id());import*as Ie from"fs/promises";import ji from"path";var Sc=384,hh=448,_c="video-server",Rc="automobile-video.jar",Dc="video-server-jar.json",yh="classes.dex";class Jd{static instance=null;static expectedChecksumOverride=null;downloader;checksumCalculator;cacheDir;usesDefaultCacheDir;timer;cache;env;inFlight=null;constructor(d={}){this.downloader=d.downloader??new bi,this.checksumCalculator=d.checksumCalculator??new an,this.timer=d.timer??i,this.cache=new so({downloader:this.downloader,checksumCalculator:this.checksumCalculator,timer:this.timer}),this.env=d.env??process.env,this.usesDefaultCacheDir=d.cacheDir===void 0,this.cacheDir=d.cacheDir??Qe(_c)}static getInstance(){if(Jd.instance===null)Jd.instance=new Jd;return Jd.instance}static resetInstances(){Jd.instance=null,Jd.expectedChecksumOverride=null}static setExpectedChecksumForTesting(d){Jd.expectedChecksumOverride=d}async computeLocalJarIntegrity(d){let[{checksum:c},w]=await Promise.all([this.checksumCalculator.computeFileSha256(d),Ie.stat(d)]);return{sha256:c.toLowerCase(),size:w.size}}get cachedJarPath(){return ji.join(this.cacheDir,Rc)}get metadataPath(){return ji.join(this.cacheDir,Dc)}expectedChecksum(){return Jd.expectedChecksumOverride??tne(this.env)}async ensure(){if(this.inFlight!==null)return this.inFlight;return this.inFlight=this.doEnsure().finally(()=>{this.inFlight=null}),this.inFlight}async doEnsure(){let d=this.expectedChecksum();if(d.length===0)return e.info("[VIDEO_JAR] Expected checksum unknown for the pinned version; returning null without touching the network (jar is integrity-unverifiable)"),null;let c=await this.tryCache(d);if(c)return e.info("[VIDEO_JAR] Reusing verified cached jar",{path:c}),c;return this.download(d)}async tryCache(d){return await this.cache.isCached({label:"[VIDEO_JAR]",subject:"jar",expectedSha256:d,metadataPath:this.metadataPath,parseMetadata:(w)=>wh(w)?w:null,verifyArtifact:(w)=>this.isCachedJarIntact(w)})?this.cachedJarPath:null}async isCachedJarIntact(d){let c;try{c=await Ie.stat(this.cachedJarPath)}catch(w){return e.debug(`[VIDEO_JAR] Cached jar file missing despite metadata: ${w}`),!1}if(c.size!==d.size)return e.warn("[VIDEO_JAR] Cached jar size differs from sidecar; will re-download",{expected:d.size,actual:c.size}),!1;return!0}async ensureSecureCacheDir(){if(this.usesDefaultCacheDir)return di(_c);return await Ie.mkdir(this.cacheDir,{recursive:!0,mode:hh}),this.cacheDir}async download(d){let c=ene(this.env),w=await this.ensureSecureCacheDir(),b=ji.join(w,Rc),D=`${b}.download`;return e.info("[VIDEO_JAR] Downloading persistent-encoder jar",{url:c,destination:D}),await this.cache.fetch({label:"[VIDEO_JAR]",expectedSha256:d,url:c,archivePath:D,metadataPath:ji.join(w,Dc),metadataMode:Sc,afterDownload:(C)=>Ie.chmod(C,Sc),mismatchError:(C,k)=>new t(`video-server jar checksum verification failed. Expected: ${C}, Got: ${k}. The downloaded automobile-video.jar does not match the pinned release checksum; this indicates a corrupted or tampered download and is never silently accepted.`),publish:async(C,k)=>{if(!this.hasClassesDex(C))throw new t("video-server jar is not a valid zip containing classes.dex (truncated or error-page download).");let{size:O}=await Ie.stat(C);return await Ie.rename(C,b),e.info("[VIDEO_JAR] Downloaded, verified, and cached jar",{path:b,sha256:k}),{version:De(this.env),sha256:k??d,size:O,downloadedAt:this.timer.now()}}}),b}hasClassesDex(d){try{return new Pc.default(d).getEntries().some((w)=>w.entryName===yh)}catch(c){return e.warn("[VIDEO_JAR] Structural check failed (not a valid zip)",{path:d,error:r(c)}),!1}}}function wh(d){return typeof d==="object"&&d!==null&&"sha256"in d&&typeof d.sha256==="string"&&"size"in d&&typeof d.size==="number"}var SQ="constrained-baseline";var F4=42,I0=8192;function wQ(d){return d==="main"?"4d002a":"42e02a"}function jq(d,c){return Math.ceil(d/16)*Math.ceil(c/16)}function Ic(d){return d.length>=4&&(d[0]&31)===7?d.subarray(1,4).toString("hex"):void 0}function bh(d){let c=Ic(d);return c?Number.parseInt(c.slice(4,6),16):void 0}function RQ(d,c="constrained-baseline"){let w=Ic(d);if(w&&!L4(w,c))return{compatible:!1,reason:`H.264 SPS profile ${w.slice(0,4)} is incompatible with negotiated ${c}.`};let b=bh(d);if(b!==void 0&&b>42)return{compatible:!1,reason:`H.264 SPS level ${b} exceeds negotiated level 42.`};return{compatible:!0}}function L4(d,c){return c==="main"?_h(d):Sh(d)}function Sh(d){return Number.parseInt(d.slice(0,2),16)===66}function _h(d){return Number.parseInt(d.slice(0,2),16)===77}import{EventEmitter as Oh}from"events";class b0{chunks=[];headChunk=0;headOffset=0;length=0;compactionWork=0;get retainedChunkCount(){return this.chunks.length}get compactionWorkUnits(){return this.compactionWork}append(d){if(d.length===0)return;this.chunks.push(d),this.length+=d.length}peek(d){if(d>this.length)throw RangeError(`cannot peek ${d} bytes from ${this.length}-byte queue`);if(d===0)return Buffer.alloc(0);let c=this.chunks[this.headChunk];if(c.length-this.headOffset>=d)return c.subarray(this.headOffset,this.headOffset+d);let b=Buffer.allocUnsafe(d);return this.copyTo(b,d),b}takeDetached(d){if(d>this.length)throw RangeError(`cannot take ${d} bytes from ${this.length}-byte queue`);if(d===0)return Buffer.alloc(0);let c=Buffer.allocUnsafe(d);return this.copyTo(c,d),this.discard(d),c}discard(d){if(d>this.length)throw RangeError(`cannot discard ${d} bytes from ${this.length}-byte queue`);let c=d;while(c>0){let b=this.chunks[this.headChunk].length-this.headOffset;if(c<b){this.headOffset+=c,this.length-=c,c=0;break}this.headChunk++,this.headOffset=0,this.length-=b,c-=b}this.compact()}toBuffer(){if(this.length===0)return Buffer.alloc(0);let d=this.chunks[this.headChunk];if(this.headChunk===this.chunks.length-1)return d.subarray(this.headOffset);let c=Buffer.allocUnsafe(this.length);return this.copyTo(c,this.length),c}replace(d){this.chunks=d.length===0?[]:[d],this.headChunk=0,this.headOffset=0,this.length=d.length}compact(){if(this.headChunk===this.chunks.length){this.chunks.length=0,this.headChunk=0;return}if(this.headChunk*2>=this.chunks.length)this.chunks.splice(0,this.headChunk),this.compactionWork+=this.chunks.length,this.headChunk=0}copyTo(d,c){let w=0;for(let b=this.headChunk;w<c;b++){let D=this.chunks[b],C=b===this.headChunk?this.headOffset:0,k=D.length-C,O=Math.min(k,c-w);D.copy(d,w,C,C+O),w+=O}}}var Rh=826690881,co=Buffer.from([65,77,70,49]),et=24,Dh=8,Ec=16777216,xc=16777216,Cc=Math.max(Ec,xc),Ph=3798204416,Ih=4294967294,Ch=1;class mo{buffer=new b0;pendingHeader=null;highWaterMarkBytes=0;resynchronizing=!1;push(d,{onMalformed:c,onAudio:w,onEncodedVideo:b}={}){let D=0;while(D<d.length){let C=et+Cc-this.buffer.length;if(C===0){if(!this.decodeAvailable({onMalformed:c,onAudio:w,onEncodedVideo:b}))throw Error("FrameDecoder reached its buffer limit without a complete record");continue}let k=Math.min(d.length,D+C);this.buffer.append(d.subarray(D,k)),this.highWaterMarkBytes=Math.max(this.highWaterMarkBytes,this.buffer.length),D=k,this.decodeAvailable({onMalformed:c,onAudio:w,onEncodedVideo:b})}}getMetrics(){return{bufferedBytes:this.buffer.length,highWaterMarkBytes:this.highWaterMarkBytes,maxBufferedBytes:et+Cc}}decodeAvailable({onMalformed:d,onAudio:c,onEncodedVideo:w}={}){let b=!1;while(!0){if(this.resynchronizing&&!this.resynchronize())return b;if(this.pendingHeader===null){let O=this.takeHeader(d);if(O==="starved")return b;if(O==="malformed"){b=!0;continue}this.pendingHeader=O,b=!0}let D=this.pendingHeader,C=Eh(D);if(this.buffer.length<C)return b;let k=this.buffer.takeDetached(C);this.emitRecord(D,k,{onAudio:c,onEncodedVideo:w}),this.pendingHeader=null,b=!0}}emitRecord(d,c,{onAudio:w,onEncodedVideo:b}){if(po(d)){w?.({pcm16le:c});return}b?.({keyframe:(d.height&Ch)!==0,presentationTimestampMs:d.timestampMs,payload:c})}takeHeader(d){if(this.buffer.length<et)return"starved";let c=this.buffer.peek(et),w=Ac(c,0);if(w)return this.resynchronizing=!0,d?.({reason:w,header:uo(c,0)}),"malformed";let b=uo(c,0);return this.buffer.discard(et),b}resynchronize(){let d=this.buffer.toBuffer(),c=0;while(c<=d.length-co.length){let w=d.indexOf(co,c);if(w<0)break;if(w+et>d.length)return this.replaceBuffer(d.subarray(w)),!1;if(Ac(d,w)===null)return this.replaceBuffer(d.subarray(w)),this.resynchronizing=!1,!0;c=w+1}return this.replaceBuffer(d.subarray(Math.max(0,d.length-(co.length-1)))),!1}replaceBuffer(d){this.buffer.replace(d.length===0?Buffer.alloc(0):Buffer.from(d))}}function po(d){return d.width===0&&d.height===8000&&d.bytesPerRow===1}function Ah(d){return d.width===0&&(d.height&Ih)>>>0===Ph}function Eh(d){if(po(d))return d.timestampMs;return d.bytesPerRow}function uo(d,c){return{width:d.readUInt32LE(c+8),height:d.readUInt32LE(c+12),bytesPerRow:d.readUInt32LE(c+16),timestampMs:d.readUInt32LE(c+20)}}function Ac(d,c){if(d.readUInt32LE(c)!==Rh)return"header_magic_mismatch";if(d.readUInt32LE(c+4)!==kh(d.subarray(c+Dh,c+et)))return"header_checksum_mismatch";return xh(uo(d,c))}function xh(d){if(po(d))return d.timestampMs>Ec?"audio_payload_too_large":null;if(Ah(d))return d.bytesPerRow>xc?"encoded_video_payload_too_large":null;return"header_unsupported_record"}var Th=Bh();function Bh(){let d=new Uint32Array(256);for(let c=0;c<256;c++){let w=c;for(let b=0;b<8;b++)w=(w&1)!==0?3988292384^w>>>1:w>>>1;d[c]=w>>>0}return d}function kh(d){let c=4294967295;for(let w=0;w<d.length;w++)c=c>>>8^Th[(c^d[w])&255];return(c^4294967295)>>>0}var S0="automobile-frame-metrics:",Tc="capture-capability:",s_="encoded-video-h264",oQ="simulator-idle-evidence",qq="capture-permission:",w0="capture-permission-target:",Ki=5,Ji=60,sQ=5;class Yy extends Oh{binaryPath;target;spawner;timer;stopGraceMs;processGroupKiller;decoder=new mo;process=null;controlChannelErrored=!1;helperCapabilities=new Set;stderrBuffer="";exitPromise=null;nativeHelperRegistry;constructor(d){super();this.nativeHelperRegistry=d.nativeHelperRegistry,this.binaryPath=d.binaryPath,this.target=d.target,this.spawner=d.spawner??Vh,this.timer=d.timer??i,this.stopGraceMs=d.stopGraceMs??qh,this.processGroupKiller=d.processGroupKiller??Wh}on(d,c){return super.on(d,c)}emit(d,...c){return super.emit(d,...c)}get isRunning(){return this.process!==null&&this.process.exitCode===null&&!this.process.killed}start(){if(this.process!==null)throw Error("IOSScreenCaptureHelper already started");let d=Gh(this.target);this.emitReadiness("helper-executable-found",this.binaryPath);let c=this.spawner(this.binaryPath,d,{detached:process.platform==="darwin",stdio:["pipe","pipe","pipe"]});(this.nativeHelperRegistry??GT()).track(c,{kind:"ios-capture-helper",processGroup:process.platform==="darwin"}),this.process=c,this.controlChannelErrored=!1,this.emitReadiness("helper-process-spawned",`pid=${c.pid??"?"}`),c.stdout.on("data",(w)=>{let b=Buffer.isBuffer(w)?w:Buffer.from(w);this.decoder.push(b,{onMalformed:(D)=>this.emit("malformed",D),onAudio:(D)=>this.emit("audio",D),onEncodedVideo:(D)=>this.emit("encodedVideo",D)})}),c.stderr.on("data",(w)=>{let b=Buffer.isBuffer(w)?w.toString("utf8"):String(w);this.appendStderr(b)}),c.stdin.on("error",(w)=>{this.controlChannelErrored=!0,e.warn("[IOSScreenCaptureHelper] stdin control channel failed",w)}),this.exitPromise=new Promise((w)=>{c.once("error",(b)=>{w({code:c.exitCode,signal:c.signalCode}),this.emit("error",b instanceof Error?b:Error(String(b)))}),c.once("exit",(b,D)=>{if(this.stderrBuffer.length>0)this.handleStderrLine(this.stderrBuffer),this.stderrBuffer="";let C={code:b,signal:D};this.emit("exit",C),w(C)})}),e.debug(`[IOSScreenCaptureHelper] spawned ${this.binaryPath} pid=${c.pid??"?"}`)}async stop(){let d=this.process;if(d===null)return null;if(d.exitCode!==null||d.killed){let w=await this.waitForExitWithinGrace();return this.cleanupProcess(d),w??{code:d.exitCode,signal:d.signalCode}}d.kill("SIGTERM");let c=await this.waitForExitWithinGrace();if(c!==null)return this.cleanupProcess(d),c;if(e.warn(`[IOSScreenCaptureHelper] helper pid=${d.pid??"?"} did not exit after SIGTERM; escalating to SIGKILL`),d.kill("SIGKILL"),process.platform==="darwin")if(d.pid!==void 0)try{this.processGroupKiller(d.pid,"SIGKILL")}catch(w){e.warn(`[IOSScreenCaptureHelper] process-group cleanup failed for pid=${d.pid}; detached children may leak: ${w}`)}else e.warn("[IOSScreenCaptureHelper] helper pid unknown after SIGKILL; cannot group-kill, detached children may leak");return this.cleanupProcess(d),{code:d.exitCode,signal:d.signalCode??"SIGKILL"}}appendStderr(d){if(this.stderrBuffer+=d,this.stderrBuffer.length>Yy.STDERR_BUFFER_MAX){this.emit("stderr",this.stderrBuffer),this.stderrBuffer="";return}let c=this.stderrBuffer.split(`
|
|
162
|
-
`);this.stderrBuffer=c.pop()??"";for(let w of c)this.handleStderrLine(w)}handleStderrLine(d){let c=Mh(d);if(c!==null){if(this.target.kind==="simulator"&&c===this.target.windowID)this.emit("idle",{windowID:c});return}let w=Fh(d);if(w!==null){this.emit("captureMetrics",w);return}let b=M4(d);if(b!==null){this.helperCapabilities.add(b),this.emit("capability",b);return}let D=Nh(d);if(D!==null){this.emit("permission",D);return}let C=Lh(d);if(C!==null){this.emit("permissionTarget",C);return}this.emit("stderr",d),this.emitReadinessFromMarker(d)}get capabilities(){return this.helperCapabilities}supportsEncodedVideo(){return this.helperCapabilities.has(s_)}requestKeyFrame(){let d=this.process;if(d===null||!this.isRunning||this.controlChannelErrored||d.stdin.destroyed||d.stdin.writableEnded||d.stdin.errored)return!1;try{return d.stdin.write(`${JSON.stringify({cmd:"forceKeyFrame"})}
|
|
163
|
-
`),!0}catch(c){return e.debug(`[IOSScreenCaptureHelper] forceKeyFrame control write failed: ${c}`),!1}}assertSupportsEncodedVideo(){if(this.supportsEncodedVideo())return;throw new t("The screen-capture-helper did not advertise the '"+s_+"' capability at startup, so it cannot emit encoded H.264 video. This is an outdated helper. Unset AUTOMOBILE_IOS_SCREEN_CAPTURE_HELPER to use the checksum-pinned release helper, or point it at a build that advertises '"+s_+"'.")}async waitForExitWithinGrace(){let d=this.exitPromise??Promise.resolve(null),c=Error("Screen capture helper stop grace expired");try{return await l(d,{timer:this.timer,timeoutMs:this.stopGraceMs,label:"Screen capture helper stop",timeoutError:()=>c})}catch(w){if(w===c)return null;throw w}}cleanupProcess(d){if(d.stdout.removeAllListeners(),d.stderr.removeAllListeners(),d.removeAllListeners(),this.process===d)this.process=null}emitReadinessFromMarker(d){let c=d.trim();if(c.startsWith("capture-phase: permission-ready"))this.emitReadiness("permission-ready");else if(c.startsWith("capture-phase: resolved-window"))this.emitReadiness("target-resolved",c);else if(c.startsWith("capture-phase: capture-started"))this.emitReadiness("capture-started",c);else if(c.startsWith("capture-phase: first-frame"))this.emitReadiness("first-frame",c)}emitReadiness(d,c){this.emit("readiness",{phase:d,atMs:this.timer.now(),detail:c})}static STDERR_BUFFER_MAX=65536}function Mh(d){let c=/^capture-idle: windowID=(\d+)$/.exec(d.trim());if(!c)return null;let w=Number(c[1]);return Number.isSafeInteger(w)&&w>0?w:null}function M4(d){let c=d.trim();if(!c.startsWith(Tc))return null;let w=c.slice(Tc.length).trim();return w.length>0?w:null}function Nh(d){let c=d.trim();if(!c.startsWith(qq))return null;let w=c.slice(qq.length).trim();return w==="screen-recording"?w:null}function Lh(d){let c=d.trim();if(!c.startsWith(w0))return null;let w=c.slice(w0.length).trim();return w.length>0?w:null}function Fh(d){if(!d.startsWith(S0))return null;try{let c=JSON.parse(d.slice(S0.length));if(!$h(c))return null;return{...c,captureTimestampMs:c.captureTimestampMs??null,frameQueueAgeMs:c.frameQueueAgeMs??null,lastOutputWriteDurationMs:c.lastOutputWriteDurationMs??null}}catch(c){return e.debug(`[IOSScreenCaptureHelper] ignored malformed native frame metrics: ${r(c)}`),null}}function $h(d){if(d===null||typeof d!=="object")return!1;let c=d;return fo(c.captureTimestampMs)&&fo(c.frameQueueAgeMs)&&(c.frameQueueDepth===0||c.frameQueueDepth===1)&&go(c.droppedFrames)&&go(c.bytesQueued)&&go(c.highWaterMarkBytes)&&fo(c.lastOutputWriteDurationMs)}function fo(d){return d===void 0||Uh(d)}function Uh(d){return d===null||typeof d==="number"&&Number.isFinite(d)}function go(d){return typeof d==="number"&&Number.isFinite(d)&&d>=0}var qh=2000,Hh=new re,Vh=(d,c,w)=>Hh.spawn(d,c,w),Wh=(d,c)=>{process.kill(-d,c)};function Gh(d){switch(d.kind){case"device":{let c=d.deviceId!==void 0?["--device-id",d.deviceId]:[];return Bc(c,d.encode),c}case"simulator":{let c=["--simulator-window",String(d.windowID)];if(d.fps!==void 0){if(!Number.isInteger(d.fps)||d.fps<Ki||d.fps>Ji)throw RangeError(`simulator fps must be an integer in [${Ki}, ${Ji}]; got ${d.fps}`);c.push("--simulator-fps",String(d.fps))}if(d.audio===!0)c.push("--audio");return Bc(c,d.encode),c}}}function Bc(d,c){if(c===void 0)return;if(d.push("--encode",c.codec),c.maxLongSide!==void 0)d.push("--max-long-side",String(c.maxLongSide));switch(c.bitrate.kind){case"explicitBps":d.push("--bitrate-bps",String(Math.round(c.bitrate.bps)));break;case"bitsPerPixel":d.push("--bits-per-pixel",String(c.bitrate.bpp));break;case"videoToolboxDefault":break}}var kc=Ki,Nc=Ji,B4=15,Lc=1,Fc=60,$4=30,ve={WHIP_ENDPOINT:f.WEBRTC_WHIP_ENDPOINT.name,WHIP_TOKEN:f.WEBRTC_WHIP_TOKEN.name,ICE_SERVERS:f.WEBRTC_ICE_SERVERS.name,BITRATE_KBPS:f.WEBRTC_BITRATE_KBPS.name,MAX_SIZE:f.WEBRTC_MAX_SIZE.name,IOS_SIMULATOR_FPS:f.WEBRTC_IOS_SIMULATOR_FPS.name,ANDROID_FPS:f.WEBRTC_ANDROID_FPS.name,TRICKLE_ICE:f.WEBRTC_TRICKLE_ICE.name,AUDIO:f.WEBRTC_AUDIO.name,ALLOW_INSECURE_WHIP:f.WEBRTC_ALLOW_INSECURE_WHIP.name,WHIP_ALLOWED_ORIGINS:f.WEBRTC_WHIP_ALLOWED_ORIGINS.name},jh=[{urls:"stun:stun.l.google.com:19302"}];function Kh(d){if(!d||!d.trim())return;let c=d.trim();if(c.startsWith("[")){let w;try{w=JSON.parse(c)}catch{throw new t(`Invalid JSON in ${ve.ICE_SERVERS}.`)}if(!Array.isArray(w))throw new t(`${ve.ICE_SERVERS} JSON must be an array of { urls } objects.`);let b=[];for(let D of w)Jh(b,D);return b}return c.split(",").map((w)=>w.trim()).filter((w)=>w.length>0).map((w)=>({urls:w}))}function Jh(d,c){let{username:w,credential:b}=c??{};if(typeof c?.urls==="string")d.push({urls:c.urls,username:w,credential:b});else if(Array.isArray(c?.urls)&&c.urls.every((D)=>typeof D==="string"))for(let D of c.urls)d.push({urls:D,username:w,credential:b});else throw new t(`${ve.ICE_SERVERS} JSON entries must have a string or string[] "urls".`)}function zh(d){if(!d||!d.trim())return;let c=/^(\d+)\s*x\s*(\d+)$/i.exec(d.trim());if(!c)throw new t(`Invalid size "${d}"; expected WIDTHxHEIGHT (e.g. 1280x720).`);return jc({width:Number(c[1]),height:Number(c[2])})}function Xh(d){if(!d||!d.trim())return;let c=Number(d.trim());if(!Number.isFinite(c)||c<=0)throw new t(`Invalid bitrate "${d}"; expected a positive number of kbps.`);return Math.round(c)}function Kq(d={},c=process.env){let w=d.whipEndpoint??I(f.WEBRTC_WHIP_ENDPOINT,c);if(!w||!w.trim())throw new t(`No WHIP endpoint configured. Set ${ve.WHIP_ENDPOINT} or pass whipEndpoint.`);let b=d.iceServers??Kh(I(f.WEBRTC_ICE_SERVERS,c))??jh,{bitrateKbps:D,size:C,iosSimulatorFps:k,androidFps:O}=Yh(d,c),M=d.trickleIce??Be(f.WEBRTC_TRICKLE_ICE,c),F=d.audioEnabled??Be(f.WEBRTC_AUDIO,c);return{whipEndpoint:iy(w,c),bearerToken:d.bearerToken??I(f.WEBRTC_WHIP_TOKEN,c)??void 0,iceServers:b,bitrateKbps:D,size:C,iosSimulatorFps:k,androidFps:O,trickleIce:M,audioEnabled:F}}function Yh(d,c){let w=d.bitrateKbps===void 0?Xh(I(f.WEBRTC_BITRATE_KBPS,c)):ey(d.bitrateKbps),b=d.size===void 0?zh(I(f.WEBRTC_MAX_SIZE,c)):jc(d.size),D=d.iosSimulatorFps===void 0?Qh(I(f.WEBRTC_IOS_SIMULATOR_FPS,c))??B4:Wc(d.iosSimulatorFps),C=d.androidFps===void 0?Zh(I(f.WEBRTC_ANDROID_FPS,c))??$4:Gc(d.androidFps);return{bitrateKbps:w,size:b,iosSimulatorFps:D,androidFps:C}}function Qh(d){if(!d||!d.trim())return;return Wc(Number(d.trim()),d.trim())}function Wc(d,c=String(d)){if(!Number.isInteger(d)||d<kc||d>Nc)throw new t(`Invalid iOS Simulator capture fps "${c}"; expected an integer in [${kc}, ${Nc}]. Set ${ve.IOS_SIMULATOR_FPS} or pass iosSimulatorFps.`);return d}function Zh(d){if(!d||!d.trim())return;return Gc(Number(d.trim()),d.trim())}function Gc(d,c=String(d)){if(!Number.isInteger(d)||d<Lc||d>Fc)throw new t(`Invalid Android capture fps "${c}"; expected an integer in [${Lc}, ${Fc}]. Set ${ve.ANDROID_FPS} or pass androidFps.`);return d}function ey(d){if(!Number.isFinite(d)||d<=0)throw new t(`Invalid bitrate "${d}"; expected a positive number of kbps.`);return Math.round(d)}function jc(d){let{width:c,height:w}=d;if(!Number.isSafeInteger(c)||!Number.isSafeInteger(w)||c<=0||w<=0||c%2!==0||w%2!==0||jq(c,w)>I0)throw new t(`Invalid size "${c}x${w}"; width and height must be positive even integers within the H.264 Level 4.2 frame limit.`);return{width:c,height:w}}var ty=new Set(["localhost","127.0.0.1","::1"]);function Kc(d){let c=d.toLowerCase().replace(/^\[/,"").replace(/\]$/,"");if(ty.has(c))return!0;return/^127(?:\.\d{1,3}){3}$/.test(c)}function Jc(d=process.env){return Be(f.WEBRTC_ALLOW_INSECURE_WHIP,d)}function zc(d){let c=d.trim(),w;try{w=new URL(c)}catch{throw new t(`Invalid WHIP endpoint "${c}"; expected an absolute http(s) URL.`)}if(w.protocol!=="http:"&&w.protocol!=="https:")throw new t(`Invalid WHIP endpoint "${c}"; expected an absolute http(s) URL.`);return w}function iy(d,c=process.env){let w=zc(d);if(w.protocol==="http:"&&!Kc(w.hostname)&&!Jc(c))throw new t(`Refusing plaintext WHIP endpoint "${d.trim()}": http:// is only permitted for loopback (127.0.0.1/localhost/::1) because the bearer token and SDP would travel in cleartext. Use https://, or set ${ve.ALLOW_INSECURE_WHIP}=1 to allow insecure endpoints (not recommended).`);return d.trim()}function ry(d){if(!d||!d.trim())return[];return d.split(",").map((c)=>c.trim()).filter((c)=>c.length>0)}function $c(d){let c=d.includes("://")?d:`https://${d}`;if(!URL.canParse(c))return;let w=new URL(c).origin;return w==="null"?void 0:w}function PQ(d,c=process.env){if(Jc(c))return;let w=zc(d);if(Kc(w.hostname))return;let b=new Set,D=I(f.WEBRTC_WHIP_ENDPOINT,c);if(D&&D.trim()){let C=$c(D.trim());if(C)b.add(C)}for(let C of ry(I(f.WEBRTC_WHIP_ALLOWED_ORIGINS,c))){let k=$c(C);if(k)b.add(k)}if(!b.has(w.origin))throw new t(`Refusing WHIP endpoint override "${d.trim()}": its origin ${w.origin} is not allow-listed. Add it to ${ve.WHIP_ALLOWED_ORIGINS} (comma-separated origins), align it with the daemon's ${ve.WHIP_ENDPOINT}, or set ${ve.ALLOW_INSECURE_WHIP}=1 to accept arbitrary destinations (not recommended).`)}var Qc=f.VIDEO_SERVER_JAR.name,Xc=f.REQUIRE_VIDEO_SERVER.name,oy=f.SKIP_VIDEO_SERVER_DOWNLOAD.name;function Zc(d){let c=d[Qc];return c&&Yc(c)?c:null}function sy(d){let c=ny.resolve(d,"android","video-server","build","libs","automobile-video.jar");return Yc(c)?c:null}async function _0(d={}){let c=d.env??process.env,w=d.cwd??process.cwd(),b=Zc(c);if(b)return e.info("[VIDEO_JAR] Using AUTOMOBILE_VIDEO_SERVER_JAR override",{path:b}),b;let D=Be(f.SKIP_VIDEO_SERVER_DOWNLOAD,c),C=Be(f.REQUIRE_VIDEO_SERVER,c);if(!D){let M=await(d.provider??Jd.getInstance()).ensure();if(M)return M}else e.info("[VIDEO_JAR] AUTOMOBILE_SKIP_VIDEO_SERVER_DOWNLOAD set; resolving local sources only");let k=sy(w);if(k)return e.info("[VIDEO_JAR] Using local Gradle build output",{path:k}),k;if(C)throw new t(`${Xc} is set but no verifiable automobile-video.jar is available (no override, no ${D?"":"downloadable or "}locally-built jar). Provide ${Qc}, build \`:video-server:d8Dex\`, pin a release whose checksum registry includes videoJarSha256, or unset ${Xc} to allow the screenrecord fallback.`);return e.info("[VIDEO_JAR] No verifiable jar available; degrading to screenrecord"),null}async function AQ(d={}){let c=d.env??process.env;if(!c[ve.WHIP_ENDPOINT]?.trim()){e.debug("[VIDEO_JAR] No WHIP endpoint configured; skipping background jar prefetch");return}if(Be(f.SKIP_VIDEO_SERVER_DOWNLOAD,c)){e.debug(`[VIDEO_JAR] ${oy} set; skipping background jar prefetch`);return}if(Zc(c)){e.debug("[VIDEO_JAR] Local override present; skipping background jar prefetch (download unused)");return}let b=d.provider??Jd.getInstance();e.info("[VIDEO_JAR] Prefetching video-server jar in the background (WebRTC streaming configured)");try{let D=await b.ensure();if(D)e.info("[VIDEO_JAR] Background prefetch warmed the jar cache",{path:D})}catch(D){e.warn(`[VIDEO_JAR] Background jar prefetch failed: ${r(D)}`,D)}}import{homedir as Sy}from"os";class ho{client;constructor(d){this.client=d}createSimulator(...d){return this.client.createSimulator(...d)}cloneSimulator(...d){return this.client.cloneSimulator(...d)}getCatalogChecked(...d){return this.client.getCatalogChecked(...d)}listSimulators(...d){return this.client.listSimulators(...d)}async deleteSimulator(d,c={}){let w=await this.client.listSimulators(void 0,c.signal);if(!Object.values(w.devices).flat().some((D)=>D.udid===d))return;await this.client.deleteSimulator(d,c);let b=await this.client.listSimulators(void 0,c.signal);if(Object.values(b.devices).flat().some((D)=>D.udid===d))throw new t(`Template simulator ${d} still exists after deletion. Retry template cleanup.`)}async boot(d,c){await H(c,()=>this.client.bootSimulator(d))}shutdownSimulator(d,c){return this.client.shutdownSimulator(d,c)}}class zi extends t{constructor(d){super("Could not remove a partial simulator clone. Retry simulator cleanup before creating again.",{cause:d})}}class yo{creator;enabled;dependencies;cloneFailures=new Map;lifetime=new AbortController;async stop(){this.lifetime.abort(),await Promise.allSettled(this.flights.values())}flights=new Map;constructor(d,c,w){this.creator=d;this.enabled=c;this.dependencies=w}async create(d,c){if(d.signal?.throwIfAborted(),this.enabled())try{let w=await this.tryClone(d,c?.dependencies());if(w)return{udid:w,source:"clone"}}catch(w){if(w instanceof zi)throw w;e.warn(`Template lookup failed; creating simulator: ${r(w)}`,w),d.signal?.throwIfAborted()}return{udid:await(c?.creator??this.creator).createSimulator(d.name,d.deviceType,d.runtime,d.signal),source:"create"}}async tryClone(d,c=this.dependencies()){let w=await this.resolveKey(c,d);if(!w)return;let b=await c.store.read(w);if(b&&!this.buildsMatch(b,w))await this.markStale(c,b,d.signal);if(b?.state==="ready"&&this.buildsMatch(b,w)){let D=await this.cloneReady(c,b,d);if(D.preserveTemplate)return D.udid;await this.markStale(c,b,d.signal)}if((b?.nextAttemptAtMs??0)<=c.timer.now())this.requestBuild(c,w);return}buildsMatch(d,c){return d.xcodeBuild===c.xcodeBuild&&d.runtimeBuild===c.runtimeBuild}async resolveKey(d,c){let w=(await d.client.getCatalogChecked(c.signal)).runtimes.find((D)=>D.identifier===c.runtime);if(!w?.buildversion)return;let b=await d.xcode.readBuild(c.signal);if(b==="unknown")return;return{xcodeBuild:b,runtime:c.runtime,runtimeBuild:w.buildversion,deviceType:c.deviceType,profile:d.profile(),...d.apsdLogSuppressed?.()?{apsdLogSuppressed:!0}:{}}}async cloneReady(d,c,w){let b=await d.client.listSimulators(void 0,w.signal),D=Object.values(b.devices).flat().find((k)=>k.udid===c.udid);if(D?.state!=="Shutdown"||D.name!==id(c.key))return{preserveTemplate:D?.name===id(c.key)};let C=new Set(Object.values(b.devices).flat().map((k)=>k.udid));try{let k=await d.client.cloneSimulator(c.udid,w.name,w.signal);return await d.relocator.relocate({templateUdid:c.udid,cloneUdid:k,signal:w.signal}),this.cloneFailures.delete(c.udid),{udid:k,preserveTemplate:!0}}catch(k){e.warn(`Template clone failed: ${r(k)}`,k);let O=this.cloneFailures.get(c.udid)??0;if(!w.signal?.aborted)O++,this.cloneFailures.set(c.udid,O);let M=await H(void 0,async()=>{await this.removeFailedClone(d,{...w,signal:void 0},C);let F=await d.client.listSimulators(),q=Object.values(F.devices).flat().find((V)=>V.udid===c.udid);return q?.name===id(c.key)&&(q.state!=="Shutdown"||w.signal?.aborted===!0||O<2)});if(w.signal?.aborted){if(!M)await H(void 0,()=>this.markStale(d,c));w.signal.throwIfAborted()}return{preserveTemplate:M}}}async removeFailedClone(d,c,w){try{let b=await d.client.listSimulators(void 0,c.signal);for(let D of Object.values(b.devices).flat())if(D.name===c.name&&!w.has(D.udid))await d.client.deleteSimulator(D.udid,{signal:c.signal})}catch(b){throw new zi(b)}}async markStale(d,c,w){let b=await d.lock.acquire(c.key,w);if(!b)return;try{let D=await d.store.read(c.key);if(D?.udid===c.udid&&D.state==="ready")await d.store.write({...D,state:"stale"}),this.cloneFailures.delete(c.udid)}finally{b()}}requestBuild(d,c){let w=jm(c);if(this.flights.has(w))return;let b=fg(()=>H(this.lifetime.signal,()=>Promise.resolve().then(()=>d.builder.build(c,this.lifetime.signal)).catch((D)=>{e.warn(`Background template build failed: ${r(D)}`,D)}).finally(()=>{this.flights.delete(w)})));this.flights.set(w,b)}}import{readFileSync as ay,rmSync as dy}from"fs";import{join as wo}from"path";var el=g({key:g({runtime:y(),runtimeBuild:y(),xcodeBuild:y(),deviceType:y(),profile:A(Object.keys(j3)),apsdLogSuppressed:ne(!0).optional()}),udid:Fe([ne(""),y().regex(yg)]),state:A(["building","ready","failed","stale"]),xcodeBuild:y(),runtimeBuild:y(),builtAtMs:T(),settledAtMs:T().optional(),failure:g({atMs:T(),reason:y()}).optional(),attempt:T().int().nonnegative().optional(),nextAttemptAtMs:T().optional()}).refine((d)=>d.state!=="ready"||d.udid!=="",{message:"Ready templates require a simulator UDID"});var cy={read:(d)=>{try{return ay(d,"utf8")}catch(c){if(c instanceof Error&&"code"in c&&c.code==="ENOENT"){e.debug(`Template manifest is absent: ${d}`,c);return}throw u(c,`Could not read template manifest ${d}`)}},write:(d,c)=>pB(d,c),remove:(d)=>dy(d,{force:!0}),list:(d)=>Li(d).filter((c)=>/^[a-f0-9]{8}\.json$/.test(c))};class So{files;directory;constructor(d=cy,c=()=>ec(yK("ios-sim-templates"))){this.files=d;this.directory=c}path(d){return wo(this.directory(),`${jm(d)}.json`)}async read(d){let c=this.files.read(this.path(d));if(c===void 0)return;let w=this.parse(c,`${jm(d)}.json`);if(w&&Object.entries(d).some(([b,D])=>Reflect.get(w.key,b)!==D)){e.warn("Ignoring template manifest with mismatched key inputs");return}return w}parse(d,c){try{let w=el.safeParse(JSON.parse(d));if(!w.success||`${jm(w.data.key)}.json`!==c){e.warn(`Ignoring invalid template manifest ${c}`);return}return w.data}catch(w){e.warn(`Ignoring unreadable template manifest ${c}`,w);return}}async write(d){this.files.write(this.path(d.key),d)}async remove(d){this.files.remove(this.path(d))}async removeInvalid(d){let c=this.directory();for(let w of this.files.list(c)){let b=wo(c,w),D=this.files.read(b);if(D===void 0||this.parse(D,w))continue;if(d&&!this.matchesRuntime(D,d))continue;this.files.remove(b)}}matchesRuntime(d,c){try{let w=g({key:g({runtime:y()})}).safeParse(JSON.parse(d)).data?.key.runtime;return w===void 0||w===c}catch(w){return e.warn("Removing corrupt template manifest with unreadable runtime metadata",w),!0}}async list(){let d=this.directory();return this.files.list(d).flatMap((c)=>{let w=this.files.read(wo(d,c)),b=w===void 0?void 0:this.parse(w,c);return b?[b]:[]})}}import{join as tl}from"path";class _o{timer;directory;options;constructor(d,c=()=>ec(yK("ios-sim-templates")),w={}){this.timer=d;this.directory=c;this.options=w}path(d){return tl(this.directory(),`${jm(d)}.lock`)}async acquire(d,c){return this.acquirePath(this.path(d),c)}acquireName(d,c){let w=/^automobile-template-([a-f0-9]{8})$/.exec(d)?.[1];if(!w)throw Error("Invalid template name");return this.acquirePath(tl(this.directory(),`${w}.lock`),c)}async acquirePath(d,c){let w=(this.options.idGenerator??B).next();for(let b=0;b<2;b++){if(c?.throwIfAborted(),Fi(d,{...this.options,ownerToken:w,ownerGeneration:this.options.ownerGeneration??Ht}))return()=>ki(d,this.options.pid??process.pid,w,this.options.fileSystem);if(K$(d,this.options.isProcessRunning,this.options.ownerGeneration??Ht,this.options.fileSystem)!==void 0||b===1)return;await this.timer.sleep(25)}return}}class Ro{client;cached;constructor(d=new jn){this.client=d}readBuild(d){return this.cached??=this.probe(d).catch((c)=>(e.warn("Xcode build is unknown; template cloning disabled for this process",c),"unknown")),this.cached}async probe(d){let{stdout:c}=await this.client.executeCommand(["-version"],{signal:d,timeoutMs:5000}),b=c.split(`
|
|
164
|
-
`).find((D)=>D.startsWith("Build version "))?.slice(14).trim();if(!b)throw new t("Xcode did not report a build version. Check xcode-select.");return b}}async function Ut(d,c,w,b){let D=await d.listSimulators(void 0,b),C=Object.values(D.devices).flat().find((k)=>k.udid===w);if(!C)return;if(C.name!==id(c)){e.warn(`Refusing template deletion: ${w} is named ${C.name}`);return}await d.deleteSimulator(w,{signal:b})}var il=15,rl=60000,nl=120000,Do=900000;class Po{source;timer;pollMs;constructor(d,c,w=5000){this.source=d;this.timer=c;this.pollMs=w}async waitUntilSettled(d,c){let w=this.timer.now()+c.maxWaitMs,b,D=[];while(this.timer.now()<=w){c.signal?.throwIfAborted();let C=w-this.timer.now();if(C<=0)break;let k=await l(()=>this.source.collectFresh({signal:c.signal,deadlineMs:w}),{timer:this.timer,timeoutMs:C,signal:c.signal,label:"Template settle collection"}),O=uy(k,d),M=this.timer.now();if(D=O===void 0?[]:[...D,{atMs:M,cpu:O}].filter((V)=>M-V.atMs<=(c.cpuMeanWindowMs??0)),b=O!==void 0&&ly(D)<c.cpuThresholdPercent?b??this.timer.now():void 0,b!==void 0&&this.timer.now()-b>=c.quietWindowMs)return;let q=w-this.timer.now();if(q<=0)break;await l(this.timer.sleep(Math.min(this.pollMs,q)),{timer:this.timer,signal:c.signal,label:"Template settle poll"})}throw Error(`Simulator ${d} did not settle before the deadline`)}}function ly(d){return d.reduce((c,w)=>c+w.cpu,0)/d.length}function uy(d,c){let w=d.simulators.find((D)=>D.udid===c);if(w?.state!=="Booted"||w.quality!=="measured")return;let b=w.process?.cpuPercent;return b!==void 0&&Number.isFinite(b)?b:void 0}class Io{deps;flights=new Map;constructor(d){this.deps=d}build(d,c){let w=jm(d),b=this.flights.get(w);if(b)return b;let D=this.buildLocked(d,c).finally(()=>{this.flights.delete(w)});return this.flights.set(w,D),D}async buildLocked(d,c){let w=await this.deps.lock.acquire(d,c);if(!w)return"building elsewhere";try{if(c?.throwIfAborted(),!await this.inputsAvailable(d,c))return"retry later";let b=await this.deps.store.read(d);if((b?.nextAttemptAtMs??0)>this.deps.timer.now())return"retry later";let D=d.xcodeBuild,C=await this.scanUntracked(d,b,c),k=await this.readyStatus(b,D,c);if(k)return k;if(b?.udid)await Ut(this.deps.client,d,b.udid,c);let O={attempt:b?.attempt??0,key:d,udid:"",state:"building",xcodeBuild:D,runtimeBuild:d.runtimeBuild,builtAtMs:this.deps.timer.now()};return await this.populate(O,C,c)}finally{w()}}async inputsAvailable(d,c){if(this.deps.hasSpareCapacity&&!await this.deps.hasSpareCapacity())return!1;let{runtimes:w}=await this.deps.client.getCatalogChecked(c);if(!w.some((D)=>D.identifier===d.runtime&&D.buildversion===d.runtimeBuild))return!1;let b=await this.deps.xcode.readBuild(c);return b!=="unknown"&&b===d.xcodeBuild}async scanUntracked(d,c,w){let b=new Set,D=await this.deps.client.listSimulators(void 0,w);for(let C of Object.values(D.devices).flat())if(C.name===id(d)&&C.udid!==c?.udid)b.add(C.udid),e.warn(`leaving untracked template simulator ${C.udid} (${C.state}); not owned by this manifest, remove with the ios-templates clean command`);return b}async readyStatus(d,c,w){if(!d)return;let b=await this.deps.client.listSimulators(void 0,w),D=Object.values(b.devices).flat().find((C)=>C.udid===d.udid&&C.name===id(d.key));if(D&&D.state!=="Shutdown"){if(d.state==="ready"||d.state==="stale")return e.warn(`Template ${D.udid} is ${D.state}; possibly in use, retry later`),"retry later";try{await this.deps.client.shutdownSimulator(D.udid,w)}catch(C){e.warn(`Could not shut down interrupted template ${D.udid}: ${r(C)}`,C)}}return D&&d.state==="ready"&&d.xcodeBuild===c&&d.runtimeBuild===d.key.runtimeBuild&&d.xcodeBuild===d.key.xcodeBuild?"ready":void 0}async populate(d,c,w){let{client:b,store:D,timer:C}=this.deps;await D.write(d);try{d.udid=await b.createSimulator(id(d.key),d.key.deviceType,d.key.runtime,w),await D.write(d);let k=await this.deps.profile(d.key).apply(d.udid,{},w);if(!k.applied&&d.key.profile!=="none")throw Error(`Template preboot profile was not applied: ${k.reason??"unknown reason"}`);w?.throwIfAborted(),await this.deps.instrumentation.run({udid:d.udid,runtime:d.key.runtime,reason:"create",timeoutMs:Do,signal:w},async()=>{await b.boot(d.udid,w)}),await this.deps.settle.waitUntilSettled(d.udid,{quietWindowMs:nl,cpuThresholdPercent:il,cpuMeanWindowMs:rl,maxWaitMs:Do,signal:w}),d.settledAtMs=C.now(),await b.shutdownSimulator(d.udid,w);let O=await b.listSimulators(void 0,w);if(!Object.values(O.devices).flat().some((M)=>M.udid===d.udid&&M.name===id(d.key)&&M.state==="Shutdown"))throw Error("Template did not shut down");return w?.throwIfAborted(),await D.write({...d,state:"ready",attempt:0,failure:void 0,nextAttemptAtMs:void 0}),"ready"}catch(k){return this.recordFailure(d,c,k,w?.aborted===!0)}}async recordFailure(d,c,w,b=!1){let{store:D,timer:C}=this.deps;e.warn(`Template build did not complete: ${r(w)}`,w);let k=await H(void 0,()=>this.removePartial(d,c)),O=w instanceof Un;if(b)return await D.write({...d,udid:k,state:"failed",failure:void 0}),"failed";let M=(d.attempt??0)+(O?0:1),F=O?60000:(this.deps.backoff??Q({initialDelayMs:60000,maxDelayMs:21600000})).delayForAttempt(M),q=C.now()+F;return await D.write({...d,udid:k,attempt:M,state:O?"stale":"failed",nextAttemptAtMs:q,failure:O?void 0:{atMs:C.now(),reason:r(w)}}),O?"retry later":"failed"}async removePartial(d,c){let w=d.udid;try{if(!w){let b=await this.deps.client.listSimulators();w=Object.values(b.devices).flat().find((D)=>D.name===id(d.key)&&!c.has(D.udid))?.udid??""}if(w)await Ut(this.deps.client,d.key,w);return""}catch(b){return e.warn(`Could not delete partial template ${w}: ${r(b)}`,b),w}}}class Co{client;store;lock;isStale;constructor(d,c,w,b){this.client=d;this.store=c;this.lock=w;this.isStale=b}async clean(d){let c=await this.keys(d),w=new Set,b=[];for(let D of c){let C=id(D);w.add(C);let k=await this.lock.acquire(D,d.signal);if(!k&&!d.force){b.push(C);continue}try{await this.cleanKey(D,Boolean(k),d.signal)}finally{k?.()}}if(d.all)await this.removeOrphans(w,d,b);if(d.all||d.runtime)await this.store.removeInvalid?.(d.runtime);if(b.length)throw new t(`Templates under a live lock: ${b.join(", ")}. Retry later or use --force.`)}async cleanKey(d,c,w){let b=await this.store.read(d);if(b?.udid)await Ut(this.client,d,b.udid,w);if(c)await this.removeNamed(id(d),w);await this.store.remove(d)}async keys(d){if(d.key)return[d.key];let c=await this.store.list(),w=[];for(let b of c){if(d.runtime&&b.key.runtime!==d.runtime)continue;if(d.stale&&!await this.isStale?.(b))continue;w.push(b.key)}return w}async removeNamed(d,c){let w=await this.client.listSimulators(void 0,c);for(let b of Object.values(w.devices).flat())if(b.name===d)await this.client.deleteSimulator(b.udid,{signal:c})}async removeOrphans(d,c,w){let b=await this.client.listSimulators(void 0,c.signal);for(let D of Object.values(b.devices).flat()){if(!od(D.name)){if(D.name.startsWith("automobile-template-"))e.warn(`Skipping unrecognized template name ${D.name}`);continue}if(d.has(D.name))continue;d.add(D.name);let C=await this.lock.acquireName(D.name,c.signal);if(!C){w.push(D.name);continue}try{await this.removeNamed(D.name,c.signal)}finally{C()}}}}import{join as my}from"path";var ol=/^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i,py=["var/db/diagnostics"],sl="-wal";class Ao{deps;constructor(d){this.deps=d}async relocate(d){let{templateUdid:c,cloneUdid:w,signal:b}=d;if(!ol.test(c)||!ol.test(w))throw new t(`Cannot relocate clone ${w} from template ${c}: both must be simulator UDIDs`);let{fs:D}=this.deps,C=my(this.deps.deviceSetRoot(),w,"data"),k=await D.scan(C,c,py,b),O=await this.checkpointWals(k.files,b),M=await this.withCheckpointedDatabases(k.files,O,c);for(let F of M)b?.throwIfAborted(),await D.replaceInFile(F,c,w);for(let F of k.links)b?.throwIfAborted(),await D.retargetLink(F,c,w);return{rewrittenFiles:M.length,retargetedLinks:k.links.length,checkpointedDatabases:O.length}}async checkpointWals(d,c){let w=[];for(let b of d.filter((D)=>D.endsWith(sl))){c?.throwIfAborted();let D=b.slice(0,-sl.length);if(!await this.deps.fs.exists(D))continue;try{await this.deps.checkpointer.checkpoint(D,c),w.push(D)}catch(C){c?.throwIfAborted(),e.warn(`WAL checkpoint failed for ${D}: ${r(C)}`,C)}}return w}async withCheckpointedDatabases(d,c,w){let b=new Set(d),D=[...d];for(let C of c)if(!b.has(C)&&await this.deps.fs.fileContains(C,w))D.push(C);return D}}import{open as fy,readFile as gy,readlink as al,stat as vy,symlink as hy,unlink as yy,writeFile as wy}from"fs/promises";import{join as dl,relative as by}from"path";var ll=1048576,ul=32;async function ml(d,c){let w=await fy(d,"r");try{let b=Buffer.allocUnsafe(ll+c.length-1),D=0;for(;;){let{bytesRead:C}=await w.read(b,D,ll,null);if(C===0)return!1;let k=D+C;if(b.subarray(0,k).includes(c))return!0;D=Math.min(c.length-1,k),b.copy(b,0,k-D,k)}}finally{await w.close()}}class Eo{async scan(d,c,w,b){let D=Buffer.from(c),C=new Set(w.map((F)=>dl(d,F))),k=[],O=[],M=async(F)=>{b?.throwIfAborted();let q=await Rr(F),V=[],U=[];for(let W of q){let G=dl(F,W.name);if(W.isSymbolicLink()){if((await al(G)).includes(c))O.push(G)}else if(W.isDirectory()){if(!C.has(G))V.push(G)}else if(W.isFile())U.push(G)}for(let W=0;W<U.length;W+=ul){let G=U.slice(W,W+ul),Z=await Promise.all(G.map((ie)=>ml(ie,D)));k.push(...G.filter((ie,fe)=>Z[fe]))}for(let W of V)await M(W)};return await M(d),{files:k,links:O}}async exists(d){try{return(await vy(d)).isFile()}catch(c){if(c instanceof Error&&"code"in c&&c.code==="ENOENT")return e.debug(`no database beside ${d}`),!1;throw c}}fileContains(d,c){return ml(d,Buffer.from(c))}async replaceInFile(d,c,w){let b=Buffer.from(c),D=Buffer.from(w);if(b.length!==D.length)throw Error(`Refusing a length-changing rewrite of ${by(".",d)}`);let C=await gy(d),k=C.indexOf(b);if(k<0)return;while(k>=0)D.copy(C,k),k=C.indexOf(b,k+b.length);await wy(d,C)}async retargetLink(d,c,w){let b=(await al(d)).split(c).join(w);await yy(d),await hy(b,d)}}class xo{async checkpoint(d){let{Database:c}=wt("bun:sqlite"),w=new c(d,{create:!1});try{w.exec("PRAGMA busy_timeout = 0;"),w.exec("PRAGMA wal_checkpoint(TRUNCATE);")}finally{w.close()}}}var pl=new WeakMap,_y=new Ro,Ry,fl=()=>Ry??=new L(null);function To(d=fl()){let c=pl.get(d);if(c)return c;let w=new ho(d),b=i,D=new So,C=new _o(b),k=_y,O=ih(),M=GI({timer:b,gate:O.ios,history:O.iosBootHistory}),F=new PA(new AA(new re,b,void 0,{simctl:d}),O.iosBootHistory,b),q=new Io({client:w,timer:b,store:D,lock:C,xcode:k,instrumentation:M,hasSpareCapacity:async()=>!O.ios||(await O.ios.evaluateBoot()).outcome==="allow",settle:new Po(F,b),profile:(U)=>new qv(void 0,()=>U.profile,void 0,Y3(()=>U.apsdLogSuppressed===!0))}),V={client:w,store:D,lock:C,xcode:k,timer:b,profile:()=>K3(process.env),apsdLogSuppressed:()=>G3(process.env),builder:{build:(U,W)=>H(W,()=>q.build(U,W))},relocator:new Ao({fs:new Eo,checkpointer:new xo,deviceSetRoot:()=>vg(Sy())})};return pl.set(d,V),V}function qae(){let d=To();return{dependencies:d,cleanup:new Co(d.client,d.store,d.lock,async(c)=>{let w=await d.xcode.readBuild();if(w==="unknown")return!1;let{runtimes:b}=await d.client.getCatalogChecked(),D=b.find((C)=>C.identifier===c.key.runtime);return c.xcodeBuild!==w||c.runtimeBuild!==D?.buildversion})}}var Bo;function jy(d){Bo??=new yo({createSimulator:(...w)=>fl().createSimulator(...w)},()=>Kre(process.env),To);let c=Bo;return d?{create:(w)=>{let b=d();if(!b)throw new t("iOS simulator creation is unavailable");if(!(b instanceof L))return b.createSimulator(w.name,w.deviceType,w.runtime,w.signal).then((D)=>({udid:D,source:"create"}));return c.create(w,{creator:b,dependencies:()=>To(b)})}}:c}async function E4(){await Bo?.stop()}import{AsyncLocalStorage as nb}from"async_hooks";class Oo{explicitDevicePins=new Map;getPin(d="direct-stdio"){return this.explicitDevicePins.get(d)}setPin(d,c="direct-stdio"){this.explicitDevicePins.set(c,d)}clearConnection(d){this.explicitDevicePins.delete(d)}clearPinFor(d){for(let[c,w]of this.explicitDevicePins)if(w.deviceId===d)this.clearConnection(c)}}class TA{ports;firstObservationMs;attempt=0;backoff;budgetMs;constructor(d){this.ports=d;this.backoff=d.backoff??Q({initialDelayMs:100,maxDelayMs:1000}),this.budgetMs=d.budgetMs??5000}remainingMs(){return this.firstObservationMs??=this.ports.timer.now(),Math.max(0,this.budgetMs-(this.ports.timer.now()-this.firstObservationMs))}async waitForNextAttempt(){let{timer:d,getSignal:c}=this.ports,w=c();w?.throwIfAborted();let b=this.remainingMs();if(b<=0)return!1;let D=Math.min(this.backoff.delayForAttempt(++this.attempt),b);if(D<=0)return!1;let C;try{await l(()=>new Promise((k)=>{C=d.setTimeout(k,D)}),{timer:d,signal:w,label:"Exact device adb transport wait"})}finally{if(C!==void 0)d.clearTimeout(C)}return w?.throwIfAborted(),!0}}class YI extends t{operation;phase;elapsedMs;code="timeout";retryable=!0;budgetMs;device;constructor(d,c,w,{budgetMs:b,device:D}){super(`${d} timeout exhausted while ${c}; `+(D?`device=${D}; `:"")+`remainingBudgetMs=0; elapsedMs=${w}; budgetMs=${b}; origin=DeviceBootService`);this.operation=d;this.phase=c;this.elapsedMs=w;this.budgetMs=b,this.device=D}}function he(d,c){return{...d,...Dy(d,c),...Py(d,c),capabilityInventory:d.capabilityInventory??c.capabilityInventory}}function Dy(d,c){return{iosVersion:d.iosVersion??c.iosVersion,apiLevel:d.apiLevel??c.apiLevel,osVersion:d.osVersion??c.osVersion,runtimeId:d.runtimeId??c.runtimeId,runtime:d.runtime??c.runtime}}function Py(d,c){return{deviceType:d.deviceType??c.deviceType,formFactor:d.formFactor??c.formFactor,screenWidth:d.screenWidth??c.screenWidth,screenHeight:d.screenHeight??c.screenHeight,screenDensity:d.screenDensity??c.screenDensity,model:d.model??c.model,architecture:d.architecture??c.architecture}}function Xi(d,c){return c.find((w)=>w.platform===d.platform&&(w.deviceId===d.deviceId||d.platform==="android"&&ce(d.deviceId)&&w.name===d.name))}var Mo=1000,gl=5000;function l0(d,c,w){let b=typeof d.once!=="function"||d.exitCode!==null||d.signalCode!==null,D=b?Promise.resolve():new Promise((C)=>{d.once("exit",()=>C())});try{d.kill()}catch(C){e.warn(`[ColdBoot] Failed to cancel cold boot ${c}: ${r(C)}`,C)}return{exited:D,confirmed:d.terminationConfirmed??(b?Promise.resolve(!0):Iy(D,d,c,w))}}async function Iy(d,c,w,b){if(await vl(d,b))return!0;e.warn(`[ColdBoot] Cold boot ${w} did not exit within ${Mo}ms; escalating to SIGKILL`);try{c.kill("SIGKILL")}catch(C){e.debug(`[ColdBoot] SIGKILL for cold boot ${w} failed: ${r(C)}`)}let D=await vl(d,b);if(!D)e.warn(`[ColdBoot] Cold boot ${w} did not exit within ${Mo}ms of SIGKILL`);return D}async function vl(d,c){let w=Error("Cold boot exit wait timed out");try{return await l(d.then(()=>!0),{timer:c,timeoutMs:Mo,label:"Cold boot exit",timeoutError:()=>w})}catch(b){if(b===w)return!1;throw b}}function hl(d){if(typeof d==="object"&&d!==null&&typeof d.unref==="function")d.unref()}function Cy(d,c,w,{timer:b,isProcessRunning:D=at,processGeneration:C=Ht}){let k=d.pid,O=k===void 0?void 0:C.current(k);return new Promise((M)=>{let F,q=!1,V=()=>{if(q=!0,F!==void 0)b.clearTimeout(F),F=void 0;M()};if(c.then(V,V),k===void 0)return;let U=()=>{if(F=void 0,q)return;if(O!==void 0&&C.compare(k,O)==="different"){e.warn(`[ColdBoot] Cold boot ${w} process ${k} now names a different process; releasing its AVD`),V();return}if(!D(k)){e.warn(`[ColdBoot] Cold boot ${w} process ${k} is gone; releasing its AVD`),V();return}F=b.setTimeout(U,gl),hl(F)};F=b.setTimeout(U,gl),hl(F)})}async function Yi(d,c,w,b={}){let{exited:D,confirmed:C}=l0(d,c,w);try{if(await C)return{state:"confirmed"}}catch(O){if(d.terminationConfirmed!==void 0)return e.warn(`[startDevice] Resource cleanup for ${c} was unconfirmed: ${r(O)}`,O),{state:"cleanup-unconfirmed"};return e.warn(`[startDevice] Could not observe exit of emulator process ${d.pid??"unknown"}: ${r(O)}`,O),{state:"unobservable"}}if(d.terminationConfirmed!==void 0)return e.warn(`[startDevice] Resource cleanup for ${c} was unconfirmed`),{state:"cleanup-unconfirmed"};e.warn(`[startDevice] Emulator process ${d.pid??"unknown"} for ${c} survived SIGTERM and SIGKILL; holding the AVD lifecycle lease until it is gone`);let k=Cy(d,D,c,{timer:w,isProcessRunning:b.isProcessRunning,processGeneration:b.processGeneration});return b.markHeldByUnkillableProcess?.(d.pid),{state:"survived",gone:k}}async function yl(d,c){let w=c.deadlineMs-c.timer.now();if(c.signal?.aborted||w<=0)return"pending";let b=Error("Request ended before the emulator termination settled");try{return(await l(d,{timer:c.timer,timeoutMs:w,signal:c.signal,label:"Cold boot termination",timeoutError:()=>b})).state}catch(D){if(D===b||c.signal?.aborted)return"pending";throw D}}var Ay=1000;class Fo{dependencies;timer;constructor(d,c){this.dependencies=d;this.timer=c}async discoverBootedDevices(d,c,w,{bypassAndroidCache:b=!1,awaitAbortSettlement:D=!0,presentationOrder:C}={}){let k=d==="android"||C!==void 0,O={skipForeignEnrichment:!0,...b?{bypassAndroidDeviceListCache:!0}:{},...C!==void 0?{presentationOrder:C}:{}};if(k){let M=await this.runPhase(c,w,(F)=>this.dependencies.deviceManager.getBootedDevicesDetailed(d,{...O,signal:F}),D);if(d==="android"&&!M.succeededPlatforms.has("android"))throw new en(M.discoveryErrors?.android);return M.devices.filter((F)=>!F.foreignOwned)}return await this.runPhase(c,w,()=>this.dependencies.deviceManager.getBootedDevices(d),D)}async enrichBootedDeviceFromImage(d,c){let w=await this.runPhase(c,`resolving ${d.platform} device metadata`,(D)=>this.dependencies.deviceManager.listDeviceImages(d.platform,D)),b=Xi(d,w);return{device:b?he(d,b):d,image:b}}async recheckRunningState(d,c){if(d.platform!=="android")return d;let w=new TA({timer:this.timer,getSignal:()=>c.signal,budgetMs:Math.min(5000,Math.max(0,c.deadlineMs-this.timer.now()))});while(await w.waitForNextAttempt()){if(c.deadlineMs<=this.timer.now())break;let D=(await this.runPhase(c,"rechecking Android image running state",(C)=>((this.dependencies.invalidateAndroidDeviceList??Hv)(),this.dependencies.deviceManager.listDeviceImages("android",C)))).find((C)=>C.name===d.name);if(!D)break;if(D.isRunningStateKnown===!1)continue;if(D.isRunning)throw new en(void 0,`Cannot safely cold-boot Android AVD '${d.name}': it turned out to be running. Retry the request.`);return D}return d}async bootImageOnceWithOwnedLaunchTracking(d,c,w,b){let D=()=>{},C=await this.runPhase(c,"starting the device",async(V)=>{let U=await this.startDeviceOwningCancelledLaunch(d,c),W=()=>{if(U)l0(U,d.name,this.timer).confirmed.catch((G)=>{e.warn(`[startDevice] Late start handle cleanup failed for ${d.name}: ${r(G)}`,G)})};if(V.aborted)W();else V.addEventListener("abort",W,{once:!0}),D=()=>V.removeEventListener("abort",W);return U});D();let k,O,M=()=>{if(!C)return Promise.resolve({state:"confirmed"});return k??=this.terminateOwnedHandle(C,d,c),k},F=()=>(O??=this.awaitOwnedCleanup(M(),c),O),q=()=>{M()};c.signal?.addEventListener("abort",q,{once:!0});try{await this.reportProgress(c,w,60,"Device started, waiting for readiness...");let V=await this.runPhase(c,"waiting for device boot readiness",()=>Ng(this.dependencies.deviceManager,d,C,{timeoutMs:this.remaining(c,"waiting for device boot readiness"),signal:c.signal,timer:this.timer,cancelOwnedBoot:async()=>{await F()},createTimeoutError:()=>this.timeoutError(c,"waiting for device boot readiness"),readinessOptions:d.platform==="android"&&(b||c.freshProvision===!0)?{freshProvision:!0}:void 0}));return await this.reportProgress(c,w,100,"Device is ready for use"),{device:he(V,d),source:"cold-boot",sourceImage:d,processHandle:C,processId:C?.pid,provisioned:b}}catch(V){let U=await F();throw Ey(V,U,C)}finally{c.signal?.removeEventListener("abort",q)}}async terminateOwnedHandle(d,c,w){let b=await Yi(d,c.name,this.timer,{markHeldByUnkillableProcess:(D)=>w.lifecycleLease?.markHeldByUnkillableProcess?.(D),isProcessRunning:this.dependencies.isProcessRunning});if(b.state==="survived")w.unconfirmedProcessExits.push(b.gone),this.dependencies.retainLeaseUntil?.(b.gone);return b}async awaitOwnedCleanup(d,c){if(!this.canHoldCleanup(c))return(await d).state;let w=await yl(d,{timer:this.timer,deadlineMs:c.deadlineMs,signal:c.signal});if(w==="pending")this.holdLeaseUntilSettled(d,c);return w}canHoldCleanup(d){return this.dependencies.cleanupMayOutliveRequest===!0&&(d.ownsLifecycleLease||this.dependencies.retainLeaseUntil!==void 0)}holdLeaseUntilSettled(d,c){let w=d.then((b)=>b.state==="survived"?b.gone:void 0,()=>{return});c.pendingTerminations.push(w),this.dependencies.retainLeaseUntil?.(w)}async startDeviceOwningCancelledLaunch(d,c){try{return await this.dependencies.deviceManager.startDevice(d,this.remaining(c,"starting the device"),c.request.cameraPosterPath===void 0&&c.request.discardSnapshotOnExit!==!0?void 0:{...c.request.cameraPosterPath===void 0?{}:{cameraPosterPath:c.request.cameraPosterPath},...c.request.discardSnapshotOnExit===!0?{discardSnapshotOnExit:!0}:{}})}catch(w){if(mb(w)&&w.process)this.ownCancelledLaunchTermination(this.terminateOwnedHandle(w.process,d,c),c);throw w}}ownCancelledLaunchTermination(d,c){if(this.canHoldCleanup(c)){this.holdLeaseUntilSettled(d,c);return}c.unheldLaunchTermination=d}async reportProgress(d,c,w,b){if(!c)return;await this.runPhase(d,`reporting ${w}% device boot progress`,()=>c.report(w,100,b),!1)}remaining(d,c){let w=Math.floor(d.deadlineMs-this.timer.now());if(w<=0)throw this.timeoutError(d,c);return w}async runPhase(d,c,w,b=!0){let D=this.remaining(d,c);if(d.signal?.aborted)throw new t(`startDevice cancelled while ${c}`);return await Jm({timer:this.timer,timeoutMs:D,signal:d.signal,graceMs:Ay,label:c,timeoutError:()=>this.timeoutError(d,c),defaultAbortError:()=>new t(`startDevice cancelled while ${c}`),awaitAbortSettlement:b,preferOperationFailureOnTimeout:!0},(C)=>H(C,()=>w(C)))}timeoutError(d,c){return new YI(d.operationName,c,this.timer.now()-d.startedAtMs,{budgetMs:Math.max(0,d.deadlineMs-d.startedAtMs),device:d.deviceLabel??d.request.name??d.request.deviceId})}}function Ey(d,c,w){let b=w?.pid??"unknown";if(c==="cleanup-unconfirmed")return Lo(d,"Cleanup also failed: device shutdown could not be confirmed.");if(c==="survived")return Lo(d,`Cleanup also failed: emulator process ${b} did not exit after SIGTERM and SIGKILL, so its AVD stays reserved until the process is gone (its liveness is re-checked periodically); terminate that process manually if it does not.`);if(c==="unobservable")return Lo(d,`Cleanup also failed: the exit of emulator process ${b} could not be observed, so its AVD was released; terminate that process manually if it is still running.`);return d}function Lo(d,c){if(d instanceof Error&&!(d instanceof DOMException)){let w=Object.create(Object.getPrototypeOf(d),Object.getOwnPropertyDescriptors(d));return Object.defineProperty(w,"message",{value:`${d.message} ${c}`,writable:!0,configurable:!0}),w}return new t(`${r(d)} ${c}`,{cause:d})}var xy=["android","ios","watchos","tvos","visionos"],Ty=["watchos","tvos","visionos"],By=` startDevice platforms: ${xy.join(", ")}. The iOS images above never include Apple Watch, Apple TV or Apple Vision Pro simulators: start a watch with platform: "watchos" (an Apple TV with "tvos", a Vision Pro with "visionos") and its UDID or exact name. To create a simulator, enable provisionDevice (enableTools) and call it with device {"platform":"ios","name":"<name>","spec":{"runtime":"<runtime identifier>","deviceType":"<device type identifier>","displayCutout":"any"}} (for a watch, "platform":"watchos" with a watchOS runtime and Apple Watch device type); remove it with deleteDevice.`;async function wl(d,{deviceId:c,platform:w},b){if(w!=="ios")return;return(await Promise.all(Ty.map(async(C)=>{try{return(await d.listDeviceImages(C,b)).some((O)=>O.deviceId===c)?C:void 0}catch(k){b?.throwIfAborted(),e.warn(`[DeviceBoot] ${C} simulator lookup for '${c}' failed: ${r(k)}`,k);return}}))).find((C)=>C!==void 0)}function bl(d,c,w,b){if(b)return new t(`Device '${d.deviceId}' is a ${Bi[b]} simulator, not an iOS simulator. Call startDevice with platform: "${b}" and the same deviceId.`);return new t(`Device '${d.deviceId}' not found. Available booted: ${c.map((D)=>D.deviceId).join(", ")||"none"}. Available images: ${w.map((D)=>D.name).join(", ")||"none"}.`+(d.platform==="ios"?By:""))}class qt extends t{candidateSerials;code="target_identity_unresolved";retryable=!0;retryAfterMs=sd;deviceId;constructor(d,c){super(d);this.candidateSerials=c;if(c.length===1)this.deviceId=c[0]}toPayload(){return{code:this.code,retryable:this.retryable,retryAfterMs:this.retryAfterMs,candidateSerials:this.candidateSerials,...this.deviceId!==void 0?{deviceId:this.deviceId}:{}}}}class JI extends qt{avdName;constructor(d,c){super(`target_identity_unresolved: Cannot prove whether Android AVD '${d}' is already running; AVD name is unavailable for ${c.join(", ")}. Retry after identity discovery recovers.`,c);this.avdName=d}toPayload(){return{...super.toPayload(),avdName:this.avdName}}}function Qi(d,c){let w=d.filter((b)=>!b.foreignOwned&&b.platform==="android"&&ce(b.deviceId)&&b.name===`Unknown (${b.deviceId})`).map((b)=>b.deviceId);if(w.length>0)throw new JI(c,[...new Set(w)].toSorted())}function Sl(d,c,w,b){if(!w||d.platform!=="android")return;if(!b)Qi(c,d.name);let D=d.deviceId&&ce(d.deviceId)?c.find((C)=>!C.foreignOwned&&C.deviceId===d.deviceId&&C.name!==d.name):void 0;if(D)throw new t(`target_identity_mismatch: Configured Android AVD '${d.name}' lists serial '${d.deviceId}', but that serial is running '${D.name}'. Refresh device inventory and retry.`)}class qo{get(d){return gz(d)}}var u0=f.ALLOW_DEVICE_CREATE.name,_l="AutoMobile";class Rl{environment;constructor(d=new qo){this.environment=d}isCreationAllowed(d){if(typeof d==="boolean")return d;return RJ(this.environment.get(u0))}describeSource(d){if(typeof d==="boolean")return`--create-if-missing=${d}`;let c=this.environment.get(u0);if(c===void 0)return"default (off)";return`${u0}=${c}`}}var Ho=null;function kA(){if(!Ho)Ho=new Rl;return Ho}var Dl={cleanup_failed:!1,creation_not_allowed:!1,device_lost:!0,device_owned_by_other_session:!0,device_owned_by_other_daemon:!0,device_cleanup_in_progress:!0,session_creation_timeout:!0,device_shutting_down:!0,device_assigned_to_binding:!1,device_offline:!0,discovery_incomplete:!0,capacity_exhausted:!0,identity_conflict:!1,timeout:!0,unsupported:!1,platform_command_failed:!1,resource_profile_unproven:!1,unsafe_device_resource_combination:!1,runtime_incompatible:!1,requires_real_device:!1};class $e extends t{code;retryable;diagnostics;constructor(d,c,w=Dl[d],b={}){super(c);this.code=d;this.retryable=w;this.diagnostics=b;this.name="ProvisionDeviceError"}}class oh extends $e{constructor(d){super("platform_command_failed",d);this.name="ProvisionDeviceCreateRejectedError"}}function Pl(d){return`${d[0]}.${d[1]}.${d[2]}`}function XI(d){return d.minRuntimeVersionString!==void 0||d.maxRuntimeVersionString!==void 0||d.minRuntimeVersion!==0||d.maxRuntimeVersion!==0}function Al(d,c){return d!==void 0?Xw(d):jre(c)}function El(d){if(!XI(d))return;let c=Al(d.minRuntimeVersionString,d.minRuntimeVersion),w=Al(d.maxRuntimeVersionString,d.maxRuntimeVersion);return c&&w&&gp(c,w)<=0?{min:c,max:w}:void 0}var ky=[65535,255,255];function Oy(d){return!Number.isFinite(d[0])||gp(d,ky)>=0}function Tl(d){return{minVersion:Pl(d.min),maxVersion:Oy(d.max)?null:Pl(d.max)}}function ZI(d){let c=El(d);return c?Tl(c):void 0}function pc(d,c){let w=El(d);if(!w)return{status:"unknown",reason:XI(d)?"device type runtime range is malformed":"device type has no runtime range metadata"};let b=Tl(w),D=Xw(c);if(!D)return{status:"unknown",bounds:b,reason:"runtime version is missing or malformed"};return{status:gp(D,w.min)>=0&&gp(D,w.max)<=0?"supported":"unsupported",bounds:b}}function Bl(d){let c=Dd(d);return{kind:d,accepts:(w)=>c.includes(w),rank:(w)=>c.indexOf(w),deviceProfile:Ll(d),namePrefix:`android-${d}`}}var Vo={"xr-headset":Bl("xr-headset"),"xr-glasses":Bl("xr-glasses")},kl={"xr-headset":"google-xr","xr-glasses":"ai-glasses"},My={"xr-headset":34,"xr-glasses":36};function Ol(d,{bounds:c,range:w,installed:b,abi:D}){let C=d==="xr-headset"?"Android XR headset":"Android XR glasses",k=My[d],O=`No installed ${C} system image (${Dd(d).join(", ")}) matches the requested API range ${w}. Installed images: ${b}. `;if(k<c.min||c.max!==void 0&&k>c.max)return O+`No ${C} system image is available in the requested API range: the known image is API ${k} (${kl[d]}). Widen minOsVersion/maxOsVersion to include API ${k}, then retry. 'sdkmanager --list --channel=3' shows the XR API levels published.`;return O+`AutoMobile does not download system images. Install one with 'sdkmanager --channel=3 --install "system-images;android-${k};${kl[d]};${D}"', then retry. XR images are published on the canary channel: 'sdkmanager --list --channel=3' shows the API levels and ABIs available.`}function Ml(d,c){let w=Dd("watch");return{kind:"watch",accepts:(b)=>w.includes(b),rank:(b)=>w.indexOf(b),deviceProfile:If({profileId:c})==="watch"?c?.trim():Ll("watch",d),namePrefix:"android-watch"}}function Nl(d,c,w){let b=Dd("watch");return`No installed Wear OS system image (${b.join(", ")}) matches the requested API range ${d} and host ABIs ${w.join(" or ")}. Installed images: ${c}. AutoMobile does not download system images. Install one with 'sdkmanager "system-images;android-<api>;${b[0]};${w[0]}"', then retry.`}function Fl(d,c=B){let w=d.replace(/[^A-Za-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"device",b=c.next().replace(/-/g,"").slice(0,8);return`${_l}-${w}-${b}`}var Ko={phone:"iPhone",tablet:"iPad"};function Hl(d){switch(d){case void 0:case"phone":return"phone";case"tablet":return"tablet";case"foldable":case"tv":case"watch":case"automotive":case"xr-headset":case"xr-glasses":case"unknown":throw new t(`iOS provisioning supports only phone or tablet form factors, not '${d}'.`)}}function Vl(d,c="phone"){if(c==="phone"&&hs(d.identifier))return!1;let w=Ko[c];return d.productFamily===w||d.name.startsWith(w)}function $l(d){let c=d.match(/\d+/g);if(!c)return-1;return c.reduce((w,b)=>Math.max(w,Number.parseInt(b,10)),-1)}function Ny(d,c){if(d.length===0)throw new t("No iOS simulator device types are available from 'xcrun simctl list devicetypes'. Install an iOS platform via Xcode > Settings > Components.");let w=Hl(c.formFactor);if(c.name){let C=c.name.trim().toLowerCase(),k=d.find((O)=>O.name.toLowerCase()===C);if(k)return k}let b=Ko[w],D=d.filter((C)=>Vl(C,w));if(D.length===0)throw new t(`No ${b} simulator device type is available. Available device types: ${d.map((C)=>C.name).join(", ")}.`);return[...D].sort((C,k)=>{let O=$l(k.name)-$l(C.name);if(O!==0)return O;let M=C.name.length-k.name.length;if(M!==0)return M;return C.name.localeCompare(k.name)})[0]}function Ly(d,c){let{status:w}=pc(d,c);return w==="supported"||w==="unknown"&&!XI(d)}function Fy(d,c,w,b){let D=b?Ko[w]:"iOS";return new t(`No installed ${D} simulator device type supports the matching runtime(s) ${c.join(", ")}. Available device types: ${d.map((C)=>C.name).join(", ")}.`)}async function Jo(d,c,w){let b=Hl(c.formFactor),D=await d.getDeviceTypes(w);if(D.length===0)throw new t("No iOS simulator device types are available from 'xcrun simctl list devicetypes'. Install an iOS platform via Xcode > Settings > Components.");let C=await d.resolveRuntimeIdentifiersForBounds(c.minOsVersion,c.maxOsVersion,w),k=c.name?.trim().toLowerCase(),O=k?D.find((q)=>q.name.toLowerCase()===k):void 0,M=[],F=0;for(let q of C){let V=_v(q);if(!V)throw new t(`Cannot determine the iOS version from resolved runtime '${q}'.`);M.push(V);let U=D.filter((W)=>Ly(W,V));if(F+=U.length,O){if(U.includes(O))return{deviceType:O,runtime:q};continue}if(U.some((W)=>Vl(W,b)))return{deviceType:Ny(U,{...c,formFactor:b}),runtime:q}}if(O)throw new t(`Requested iOS device type '${O.name}' does not support runtime ${M.join(", ")}. Choose a compatible device type or adjust the requested OS range.`);throw Fy(D,M,b,F>0)}var Wo=["google_apis","default","google_apis_playstore"],$y=new Set([...Wo,"google_apis_ps16k","google_apis_playstore_ps16k","google_apis_tablet","google_apis_playstore_tablet","google_atd","aosp_atd"]);function Uy(d){let c=Wo.indexOf(d);return c===-1?Wo.length:c}var Wl={kind:"handheld",accepts:(d)=>$y.has(d),rank:Uy,namePrefix:"android"},Vt=Dd("tv"),Gl={kind:"tv",accepts:(d)=>Vt.includes(d),rank:(d)=>Vt.indexOf(d),deviceProfile:Ll("tv"),namePrefix:"android-tv"},jo=Dd("automotive"),jl={kind:"automotive",accepts:(d)=>jo.includes(d),rank:(d)=>jo.indexOf(d),deviceProfile:Ll("automotive"),namePrefix:"android-automotive"};function Kl(d,c,w){if(d==="tv")return Gl;if(d==="automotive")return jl;if(d==="xr-headset"||d==="xr-glasses")return Vo[d];if(d==="watch")return Ml(c?.screenRound,w);return Wl}var Jy=36,Jl=34;function OS(d){return d==="arm64"?["arm64-v8a","x86_64"]:["x86_64","x86"]}function Ul(d,c){let w=c.indexOf(d);return w===-1?c.length:w}var Xy=/^\d+(?:\.\d+)*[A-Za-z]?$/;function Qy(d){let c=/^(\d+)/.exec(d);return c?Number(c[1]):void 0}function ql(d,c){if(!d)return;let w=d.trim(),b=jW(w);if(b!==void 0)return e.debug(`[DeviceProvisioner] Treating ${c}OsVersion '${w}' as an API level`),b;let D=ire(w);if(D)return c==="min"?D.min:D.max;if(!Xy.test(w)){let C=Qy(w);if(C!==void 0)return e.debug(`[DeviceProvisioner] ${c}OsVersion '${w}' carries a qualifier the release table doesn't parse; falling back to its leading major ${C} as an API level (pre-#6132 lenient behavior; full qualifier ordering is tracked in #6182).`),C}throw new t(`Unrecognized Android ${c}OsVersion '${d}'. Pass a release version such as '14' (Android 14) or an API level such as 34.`)}function Wt(d,c){if(d===void 0||c===void 0)return"any";return d.trim()===String(c)?d:`${d} (API ${c})`}function pt(d){let{criteria:c,requestedMin:w,min:b,max:D}=d;return`(min=${w!==void 0&&w>=Dv?Wt(c.minOsVersion,b):`API ${Dv} (CtrlProxy runner minSdk)`}, max=${Wt(c.maxOsVersion,D)})`}function qe(d){return d.map((c)=>c.packageName).join(", ")||"none"}function Zy(d,c,w){if(c.length===0)throw new t(`No installed Android system image matches the requested API range ${pt(w)}. Installed images: ${qe(d)}. Install one with 'sdkmanager "system-images;android-<api>;google_apis;<abi>"'.`);let b=c.filter((D)=>Wl.accepts(D.tag));if(b.length===0){let{criteria:D,min:C,max:k}=w;throw new t(`No installed handheld (phone) Android system image matches the requested API range (min=${Wt(D.minOsVersion,C)}, max=${Wt(D.maxOsVersion,k)}). Only non-handheld images (Wear OS, TV, Automotive, XR or similar) are installed in that range: ${qe(c)}. Default provisioning never creates an AVD from them. Install a phone image with 'sdkmanager "system-images;android-<api>;google_apis;<abi>"'.`)}return b}var ew={handheld:"google_apis_playstore",tv:"google-tv",automotive:"android-automotive-playstore","xr-headset":"android-xr-v3-playstore"};function tw(d,c){let w=d.filter((b)=>Cw(b.tag));if(w.length===0){let b=ew[c.kind],D=b===void 0?`No Google Play ${c.kind} image is known; remove requires.playStore for this form factor. `:`Install one with 'sdkmanager "system-images;android-<api>;${b};<abi>"'. `;throw new t(`requires.playStore needs a Google Play system image, and none is installed for this request: ${qe(d)}. `+D+"Play Store images refuse adb root, so root-dependent features will report that they need a non-Play image.")}return w}function iw(d,c,w,b){let D=d.filter((O)=>N3(O.tag));if(D.length>0)return D;let C=Math.min(Math.max(w.min,Jl),w.max??Number.POSITIVE_INFINITY),k=OS(b);throw new t(`requires.vehicle.motion needs a non-Play Android Automotive system image (android-automotive), and none is installed in the requested API range ${pt(w)}: ${qe(c)}. Play Store car images are user builds that refuse driving-state simulation. AutoMobile does not download system images. Install one with 'sdkmanager "system-images;android-${C};android-automotive;${k[0]}"', then retry.`)}function zo(d){return`AutoMobile does not download system images. Install one with 'sdkmanager "${d}"'`}function rw(d,c,w,b){let D=c.filter((O)=>Gl.accepts(O.tag));if(D.length>0)return D;let C=w.max??Math.max(w.min,Jy),k=OS(b);throw new t(`No installed Android TV system image (${Vt.join(", ")}) matches the requested API range ${pt(w)}. Installed images: ${qe(d)}. `+zo(`system-images;android-${C};android-tv;${k[0]}`)+` (or google-tv in place of android-tv), then retry. This host runs ${k.join(" or ")} images; 'sdkmanager --list' shows the ABIs published for each API level.`)}function nw(d,c,w,b){let D=c.filter((O)=>jl.accepts(O.tag));if(D.length>0)return D;let C=Math.min(Math.max(w.min,Jl),w.max??Number.POSITIVE_INFINITY),k=OS(b);throw new t(`No installed Android Automotive system image (${jo.join(", ")}) matches the requested API range ${pt(w)}. Installed images: ${qe(d)}. AutoMobile does not download system images. Install one with 'sdkmanager "system-images;android-${C};android-automotive;${k[0]}"', then retry. This host runs ${k.join(" or ")} images; 'sdkmanager --list' shows the ABIs published for each API level.`)}function ow(d,{images:c,inRange:w,bounds:b,architecture:D}){let C=w.filter((F)=>Vo[d].accepts(F.tag));if(C.length>0)return C;let[k]=OS(D),[O,M]=[pt(b),qe(c)];throw new t(Ol(d,{bounds:b,range:O,installed:M,abi:k}))}function sw(d,c){let{images:w,inRange:b,bounds:D,architecture:C}=c;switch(d.kind){case"watch":{let k=OS(C),O=b.filter((M)=>d.accepts(M.tag)&&k.includes(M.abi));if(O.length>0)return O;throw new t(Nl(pt(D),qe(w),k))}case"tv":return rw(w,b,D,C);case"automotive":return nw(w,b,D,C);case"xr-headset":case"xr-glasses":return ow(d.kind,c);case"handheld":return Zy(w,b,D)}}function aw(d,c,w){let b=Kl(c.formFactor,c.requires),D=ql(c.minOsVersion,"min"),C=ql(c.maxOsVersion,"max");if(C!==void 0&&C<Dv)throw new t(`Requested Android maxOsVersion ${Wt(c.maxOsVersion,C)} is below API ${Dv}, the minimum SDK the AutoMobile CtrlProxy runner APK supports. A lower AVD would boot but never install the runner and become automation-ready. Request Android 7.0 (API 24) or newer.`);let k=Math.max(D??Dv,Dv),O=d.filter((Z)=>{if(Z.apiLevel<k)return!1;if(C!==void 0&&Z.apiLevel>C)return!1;return!0}),M={criteria:c,requestedMin:D,min:k,max:C},F=sw(b,{images:d,inRange:O,bounds:M,architecture:w}),q=OS(w),V=c.requires?.playStore?tw(F,b):F,U=c.requires?.vehicle?.motion==="supported"?iw(V,d,M,w):V,W=U.filter((Z)=>q.includes(Z.abi));return[...W.length>0?W:U].sort((Z,ie)=>{let fe=ie.apiLevel-Z.apiLevel;if(fe!==0)return fe;let ae=Ul(Z.abi,q)-Ul(ie.abi,q);if(ae!==0)return ae;let He=b.rank(Z.tag)-b.rank(ie.tag);if(He!==0)return He;let we=la(ie.apiIdentifier,Z.apiIdentifier);if(we!==0)return we;let Rs=(ie.extensionLevel??0)-(Z.extensionLevel??0);if(Rs!==0)return Rs;return Z.packageName.localeCompare(ie.packageName)})[0]}function dw(d,c){let w=d?.trim();return w&&w.toLowerCase()!==c.toLowerCase()?w:c}class er{dependencies;idGenerator;architecture;constructor(d){this.dependencies=d;this.idGenerator=d.idGenerator??B,this.architecture=d.architecture??process.arch}async provision(d,c,w=this.dependencies.identityHooks){if(d.platform==="ios")return this.provisionIos(d,c,w);if(d.platform==="android")return this.provisionAndroid(d,c,w);throw new t(`Device creation requires an explicit platform; got '${d.platform}'.`)}async provisionIos(d,c,w){let b=this.dependencies.iosCreator();if(!b)throw new t("Cannot create an iOS simulator: iOS simulator tools (xcrun simctl) are not available.");let{deviceType:D,runtime:C}=await Jo(b,d,c),k=dw(d.name,D.name),O=this.dependencies.createdDeviceName?.(k)??Fl(k,this.idGenerator),M=await w?.reserveBeforeCreate({platform:"ios",name:O,deviceType:D.identifier,runtimeId:C,runtime:C}),F=c&&M?AbortSignal.any([c,M]):c??M,q;try{q=this.dependencies.simulatorCreation?(await this.dependencies.simulatorCreation.create({name:O,deviceType:D.identifier,runtime:C,signal:F})).udid:await b.createSimulator(O,D.identifier,C,F)}catch(U){throw u(U,`Failed to create iOS simulator '${O}' (deviceType=${D.identifier}, runtime=${C})`)}let V={platform:"ios",name:O,deviceId:q,deviceType:D.identifier,runtimeId:C,runtime:C};return e.info(`[DeviceProvisioner] Created iOS simulator '${O}' (udid=${q}, deviceType=${D.identifier}, runtime=${C}). Delete it with 'xcrun simctl delete `+q+"' when no longer needed."),await w?.bindAfterCreate(V),this.applyPrebootProfile(q,V,F)}async applyPrebootProfile(d,c,w){let b=await this.dependencies.prebootProfile?.apply(d,{},w);return{...c,...b?.applied&&b.resources.length?{prebootDisabledResources:b.resources}:{}}}async provisionAndroid(d,c,w){let b=Kl(d.formFactor,d.requires,d.name),D=this.dependencies.androidCreator(),C;try{C=await D.listInstalledSystemImages(c)}catch(U){throw u(U,"Failed to list installed Android system images for AVD creation")}let k=aw(C,d,this.architecture),O=Fl(d.name??`${b.namePrefix}-${k.apiLevel}`,this.idGenerator),M=await w?.reserveBeforeCreate({platform:"android",name:O,deviceType:b.deviceProfile,runtimeId:k.packageName,runtime:`android-${k.apiIdentifier}`}),F=c&&M?AbortSignal.any([c,M]):c??M,q=await D.createAvd({name:O,package:k.packageName,...b.deviceProfile?{device:b.deviceProfile}:{}},F);if(!q.success)throw new oh(`Failed to create Android AVD '${O}' from ${k.packageName}: ${q.message}`);let V=await this.androidCreatedDevice(O,k,b.deviceProfile);return e.info(`[DeviceProvisioner] Created Android AVD '${O}' (systemImage=${k.packageName}, api=${k.apiIdentifier}, tag=${k.tag}, abi=${k.abi}${b.deviceProfile?`, device=${b.deviceProfile}`:""}). Delete it with 'avdmanager delete avd -n ${O}' when no longer needed.`),await w?.bindAfterCreate(V),V}async androidCreatedDevice(d,c,w){let b={platform:"android",name:d,isRunning:!1,deviceType:w,runtimeId:c.packageName},D=this.dependencies.androidConfigReader?(await UD(this.dependencies.androidConfigReader,[b]))[0]:void 0;return{...D?{configuredImage:D}:{},platform:"android",name:d,deviceType:D?.deviceType??w,runtimeId:c.packageName,runtime:`android-${c.apiIdentifier}`}}}function Xo(){return{listInstalledSystemImages:(d)=>_u(void 0,void 0,d),createAvd:(d,c)=>HD(d,void 0,c)}}function EA(d=()=>new L(null),c,w){return new er({iosCreator:d,simulatorCreation:w,prebootProfile:new qv,androidCreator:Xo,androidConfigReader:new Br,identityHooks:c})}class ir{run(d,c,w){return c()}}var cw="AutoMobile CI iPhone";class zl{dependencies;constructor(d){this.dependencies=d}async run(d,c,w){if(!this.isOwnedTarget(d))return c();let b;try{return await c()}catch(D){if(w?.aborted||D instanceof Un)throw D;b=D}this.throwIfCancelled(w);try{await this.recover(w,()=>this.dependencies.shutdown(d),!0)}catch(D){if(D instanceof ZT)throw e.warn("[CI iOS boot] simulator shutdown remains pending; skipping erase and boot retry",D),b;throw D}this.throwIfCancelled(w),await this.recover(w,()=>this.dependencies.erase(d.deviceId)),this.throwIfCancelled(w);try{return await c()}catch{throw this.throwIfCancelled(w),b}}isOwnedTarget(d){return d.platform==="ios"&&d.name===this.dependencies.ownedSimulatorName&&Boolean(d.deviceId)}throwIfCancelled(d){if(d?.aborted)throw new t("startDevice cancelled while recovering the CI iOS simulator")}async recover(d,c,w=!1){let b=Promise.resolve().then(c).catch((D)=>{if(w&&D instanceof ZT)throw D;e.debug(`[CI iOS boot] recovery command failed: ${D}`)});if(!d){await b;return}this.throwIfCancelled(d);try{await l(b,{timer:i,signal:d,label:"CI iOS simulator recovery"})}catch(D){if(d.aborted)throw new t("startDevice cancelled while recovering the CI iOS simulator");throw D}}}function lw(d){return I(Y.CI,d)==="true"&&I(Y.GITHUB_ACTIONS,d)==="true"}function uw(d,c){return d.platform==="ios"&&!d.name&&!d.deviceId&&lw(c)}function mw(d,c){return{...d,name:c,matchNamedDeviceIgnoringOsVersion:!0}}async function J7(d,c=process.env,w){if(!uw(d,c))return;let b=w?.simctl??new L,{runtime:D}=await Jo(b,d),C=_v(D)??D,k=`${cw} (${C})`,O=new si(null,b);return{request:mw(d,k),deviceManager:O,deviceProvisioner:new er({iosCreator:()=>b,androidCreator:Xo,createdDeviceName:()=>k}),recovery:new zl({ownedSimulatorName:k,shutdown:async(M)=>{await O.killDevice({name:M.name,platform:"ios",deviceId:M.deviceId})},erase:(M)=>b.eraseSimulator(M)})}}class QI extends t{avdName;candidateSerials;code="identity_conflict";constructor(d,c){super(`identity_conflict: Android AVD '${d}' is claimed by multiple running emulators: ${c.join(", ")}. Pass an explicit deviceId (ADB serial) to select one.`);this.avdName=d;this.candidateSerials=c}}var Yo=5000;function Yl(d){return d.name!==void 0&&d.matchExactName!==!0||d.minOsVersion!==void 0||d.maxOsVersion!==void 0||d.formFactor!==void 0||d.requires!==void 0||d.screenSize!==void 0}function Qo(d,c){if(c.platform!=="android")return;if(d.platform!==c.platform||d.name!==c.name)throw new t(`target_identity_mismatch: Configured ${c.platform} image '${c.name}' (${c.deviceId??"no runtime ID"}) resolved to '${d.name}' (${d.deviceId}). Retry after device discovery refreshes.`)}function Zl(d,c){if(d.name!==void 0&&d.matchExactName!==!0)Qi([c],d.name)}function iu(d,c){if(d.matchExactName&&d.name&&d.platform==="android")Qi(c,d.name)}function ru(d,c){if(d.matchExactName&&d.name&&c.name!==d.name)throw new t(`target_identity_mismatch: Requested ${d.platform} device '${d.name}' resolved to '${c.name}' (${c.deviceId}).`)}function IA(d,c){let w=new Map(d.filter((D)=>!D.foreignOwned&&D.platform==="android"&&D.name===c&&ce(D.deviceId)).map((D)=>[D.deviceId,D])),b=[...w.values()];if(b.length>1)throw new QI(c,[...w.keys()].toSorted());return b[0]}var jt=new WeakMap;function I4(d=ga()){return{listInFlightAndroidColdBootAvdNames:()=>[...jt.get(d)?.keys()??[]]}}function Xl(d,c,w){try{d?.(c,w)}catch(b){e.warn(`[DeviceBootService] Android cold-boot tracking listener failed: ${r(b)}`,b)}}function pw(d,c,w){let b=jt.get(d)??new Map;jt.set(d,b);let D=b.get(c)??0;if(b.set(c,D+1),D===0)Xl(w,c,"claimed");return()=>{let C=(b.get(c)??1)-1;if(C>0){b.set(c,C);return}if(b.delete(c),b.size===0)jt.delete(d);Xl(w,c,"released")}}function nr(d,c){return(jt.get(d)?.get(c)??0)>0}function Zo(d,c,w){return c.platform==="android"?pw(d,c.name,w):void 0}function or(d,c){if(d.platform==="android")return IA(c,d.name);return d.deviceId?c.find((w)=>w.deviceId===d.deviceId):void 0}function nu(d,c,w,b){let D=d==="android"?IA(c,w):c.find((C)=>C.name===w);return D&&yu(D,b)?D:null}function ou(d,c,w,b){return new t(`No ${d.platform} device matching criteria found. ${d.minOsVersion?`minOsVersion>=${d.minOsVersion} `:""}${d.maxOsVersion?`maxOsVersion<=${d.maxOsVersion} `:""}${d.name?`name=${d.name} `:""}${og(c,b)} Available images: ${w.map((D)=>`${D.name}${D.osVersion?` (v${D.osVersion})`:""}`).join(", ")||"none"}.`)}function sr(d,c){return{..."configuredImage"in d?d.configuredImage:{},name:d.name,platform:d.platform,deviceId:"deviceId"in d?d.deviceId:void 0,isRunning:!1,formFactor:c.formFactor,runtimeId:d.runtimeId,runtime:d.runtime,deviceType:d.deviceType}}function es(d,c){let w=new Map(c.filter((D)=>D.deviceId).map((D)=>[D.deviceId,D])),b=new Map(c.map((D)=>[D.name,D]));return d.map((D)=>{let C=D.platform==="android"&&ce(D.deviceId),k=(D.deviceId?w.get(D.deviceId):void 0)??(C?b.get(D.name):void 0);return k?.platform===D.platform?he(D,k):D})}function ar(d,c,w){return c?.has(d.name)===!0||d.deviceId!==void 0&&w?.has(d.deviceId)===!0}async function su(d,c,w){let D=(await d.execution.discoverBootedDevices(te(c.platform,"Starting a device"),w,"revalidating the running device after lifecycle wait",{bypassAndroidCache:c.platform==="android"})).find((C)=>C.deviceId===c.deviceId);if(!D)throw new t("Selected running device disappeared during lifecycle wait; retry device selection");return{platform:D.platform,stableId:D.platform==="android"?D.name:D.deviceId}}async function au(d,c,w){let b=await d.execution.runPhase(w,"revalidating the device image after lifecycle wait",(M)=>d.dependencies.deviceManager.listDeviceImages(c.platform,M)),D=w.request,C={platform:D.platform,name:D.name,minOsVersion:D.matchNamedDeviceIgnoringOsVersion?void 0:D.minOsVersion,maxOsVersion:D.matchNamedDeviceIgnoringOsVersion?void 0:D.maxOsVersion,formFactor:D.formFactor,requires:D.requires,screenSize:D.screenSize},k=b.filter((M)=>!ar(M,D.excludeDeviceNames,D.excludeDeviceIds)&&yu(M,C)),O=D.deviceId?k.find((M)=>M.deviceId===D.deviceId||M.name===D.deviceId):D.matchExactName&&D.name?k.find((M)=>M.name===D.name):d.dependencies.deviceMatcher.matchDeviceImage(C,k,d.dependencies.matchingStrategy);if(!O)throw new t("Selected device image disappeared during lifecycle wait; retry device selection");return{platform:O.platform,stableId:O.platform==="android"?O.name:O.deviceId}}async function du(d,c,w,b=!0){if(c.platform==="android"){let O=await d.execution.discoverBootedDevices(c.platform,w,"re-checking the running device after the shared lifecycle lease settled",{bypassAndroidCache:!0,awaitAbortSettlement:!0}),M=IA(O,c.name);return M&&!nr(d.lifecycleCoordinator,c.name)?M:void 0}let C=(O)=>d.dependencies.deviceManager.getBootedDevicesDetailed(c.platform,{bypassIosDeviceListCache:!0,skipPhysicalIosDiscovery:!0,signal:O}),k=await d.execution.runPhase(w,"re-checking the running device after the shared lifecycle lease settled",(O)=>b?rs(d,"re-checking the running device after the shared lifecycle lease settled",O,C):C(O));return k?.succeededPlatforms.has("ios")?or(c,k.devices):void 0}async function rs(d,c,w,b){let D=new AbortController,C=Error(`${c} timed out`);try{return await l(b(AbortSignal.any([w,D.signal])),{timer:d.timer,timeoutMs:Yo,signal:w,label:c,timeoutError:()=>C,onTimeout:()=>D.abort(C)})}catch(k){if(k!==C)throw k;e.warn(`[startDevice] Simulator re-check did not answer within ${Yo}ms; continuing to the boot path`);return}}import{promises as cu}from"fs";import{homedir as fw}from"os";import{join as gw}from"path";function vw(){return{readFile:(d,c)=>cu.readFile(d,c),writeFile:(d,c,w)=>cu.writeFile(d,c,w),environment:process.env,homeDirectory:fw}}function hw(d){return d?.signal}class dr{dependencies;constructor(d=vw()){this.dependencies=d}async setMemoryMb(d,c,w){if(!Number.isInteger(c)||c<=0)throw new $e("platform_command_failed",`Android AVD memoryMb must be a positive integer; got ${c}.`);return this.setConfiguration(d,{memoryMb:c},w)}async setConfiguration(d,c,w){let b=hw(w);o(b);let D=FT.parse(c),C=new Map;for(let U of Object.keys(D)){let W=D[U];if(W!==void 0)C.set(qW[U],typeof W==="boolean"?W?"yes":"no":String(W))}if(D.gpuMode!==void 0)C.set("hw.gpu.enabled","yes");let k=M3(this.dependencies.environment,this.dependencies.homeDirectory()),O=gw(k,`${d}.avd`,"config.ini"),M=await P(this.dependencies.readFile(O,"utf8"),b);o(b);let F=M.split(/\r?\n/),q=new Set,V=F.map((U)=>{let W=U.slice(0,U.indexOf("=")).trim();if(C.has(W))return q.add(W),`${W}=${C.get(W)}`;return U});for(let[U,W]of C){if(q.has(U))continue;if(V.at(-1)!=="")V.push("");V.push(`${U}=${W}`,"")}o(b),await this.dependencies.writeFile(O,V.join(`
|
|
165
|
-
`),"utf8")}}function yw(d,c){let w=tn(d.runtime);if(!w||!c)return!1;return c.apiLevel===w.apiLevel&&c.tag===w.tag&&c.architecture===w.architecture&&c.deviceName===d.deviceType&&c.systemImagePackage===w.systemImagePackage}function Dq(d,c){return yw(d,c)&&(d.configuration?.memoryMb===void 0||c?.ramSizeMb===d.configuration.memoryMb)&&Object.entries(d.configuration??{}).every(([w,b])=>w==="memoryMb"||b===void 0||(w!=="gpuMode"||c?.gpuEnabled===!0)&&c?.hardware?.[w]===b)}function Oq(d,c){if(c.isAvailable===!1)return"unavailable";if(c.runtime!==d.runtime||c.deviceType!==d.deviceType)return"mismatch";return}function Mq(d,c){let w=TS(d,c.deviceType),b=c.displayCutout;if(b===void 0||b==="any")return{kind:"resolved",displayCutout:w};if(w==="unknown")return{kind:"unsupported",message:`Display cutout preference '${b}' is unsupported for ${d} device type '${c.deviceType}' because its cutout class is unknown.`};if(w!==b)return{kind:"identity_conflict",message:`Exact ${d} device type '${c.deviceType}' has display cutout '${w}', not requested '${b}'.`};return{kind:"resolved",displayCutout:w}}function Nq(d,c,w){let b=c.find((O)=>O.identifier===d.runtime),D=w.find((O)=>O.identifier===d.deviceType);if(!b||!D)return;let C=pc(D,b.version),k=!b.isAvailable;if(!k&&C.status!=="unsupported")return;return{unavailable:k,runtime:b,bounds:C.bounds,compatibleRuntimes:c.filter((O)=>O.isAvailable&&pc(D,O.version).status==="supported").map((O)=>({id:O.identifier,version:O.version}))}}function _4(d,c){return new $e("device_assigned_to_binding",`${c}: ${d.message}`,!1,{deviceId:d.deviceId,binding:{scopeKey:d.scopeKey,declaredBinding:d.declaredBinding,stableId:d.stableId}})}class lu{dependencies;async configureAndroid(d,c,w){let b=this.dependencies.androidConfigWriter;if(b.setConfiguration)await b.setConfiguration(d,c,{signal:w});else if(Object.keys(c).some((D)=>D!=="memoryMb"))throw new $e("unsupported","The configured AVD writer does not support emulator hardware controls.");else if(c.memoryMb!==void 0)await b.setMemoryMb(d,c.memoryMb,{signal:w})}lifecycleCoordinator;timer;constructor(d){this.dependencies=d;this.lifecycleCoordinator=d.lifecycleCoordinator??ga(),this.timer=d.timer??i}async provision(d){let c=this.resolveDisplayCutout(d),w=d.lifecycleLease===void 0,b=d.lifecycleLease??await this.lifecycleCoordinator.reserve(this.initialLifecycleIdentity(d),{operation:"provision",deadlineMs:d.deadlineMs??this.timer.now()+300000,signal:d.signal}),D=[d.signal,b.signal].filter((k)=>k!==void 0),C={...d,signal:D.length===1?D[0]:AbortSignal.any(D)};try{o(C.signal);let k=await this.provisionLocked(C,c),O=k.device.platform==="android"?k.device.name:k.device.deviceId;if(!O)throw new $e("identity_conflict",`Exact iOS simulator '${d.name}' has no UDID.`);return await b.bindCanonicalIdentity({platform:k.device.platform,stableId:O},async()=>{let F=(await this.dependencies.listDeviceImages(k.device.platform)).find((q)=>q.platform===k.device.platform&&(k.device.platform==="android"?q.name===d.name:q.deviceId===O));if(!F)throw new t(`Provisioned device '${O}' disappeared during lifecycle wait`);return{platform:F.platform,stableId:F.platform==="android"?F.name:F.deviceId}}),k}finally{if(w)b.release()}}async assertAdoptable(d,c){let w=c.platform==="android"?c.name:c.deviceId;if(!this.dependencies.assertAdoptable||!w)return;try{await this.dependencies.assertAdoptable({platform:te(c.platform,"Adopting an existing device"),stableId:w})}catch(b){if(b instanceof mi)throw _4(b,`Cannot adopt existing ${d.platform} device '${d.name}'`);throw b}}initialLifecycleIdentity(d){if(d.platform==="android"||d.deviceId)return{kind:"stable",platform:d.platform,stableId:d.platform==="android"?d.name:d.deviceId};return{kind:"selector",platform:"ios",selector:d.name}}async provisionLocked(d,c){let w=await Xt("provision:listDeviceImages",()=>this.dependencies.listDeviceImages(d.platform)),b=this.findExisting(w,d);if(b)return await this.assertAdoptable(d,b),await Xt("provision:matchExisting",()=>this.assertExistingMatches(d,b)),{device:b,created:!1,resolvedSpec:this.withResolvedDisplayCutout(d.spec,c)};if(d.platform==="ios"&&d.deviceId!==void 0)throw new $e("identity_conflict",`Exact iOS simulator '${d.name}' with UDID '${d.deviceId}' was not found.`);if(!this.dependencies.isCreationAllowed(!0))throw new $e("creation_not_allowed",`Device creation is disabled; cannot provision exact ${d.platform} device '${d.name}'.`);if(d.platform==="android")await this.assertAndroidTvImageInstalled(d,d.spec);else await this.assertIosPairCompatible(d,d.spec);if(await d.assertCapacityBeforeCreate?.(d.signal),d.onBeforeCreate?.(),d.platform==="android")return await Xt("provision:createAndroid",()=>this.createAndroid(d,d.spec,c));return await Xt("provision:createIos",()=>this.createIos(d,d.spec,c))}async readIosCompatibilityCatalog(d,c){try{let[w,b]=await Promise.all([d.getRuntimesChecked(void 0,c),d.getDeviceTypesChecked(c)]);return{runtimes:w,deviceTypes:b}}catch(w){o(c),e.warn(`iOS runtime compatibility check skipped: ${r(w)}`,w);return}}async assertIosPairCompatible(d,c){let w=this.dependencies.iosRuntimeCatalog;if(!w)return;let b=await this.readIosCompatibilityCatalog(w,d.signal);if(!b)return;let D=Nq(c,b.runtimes,b.deviceTypes);if(!D)return;let{runtime:C,bounds:k,compatibleRuntimes:O,unavailable:M}=D;throw bw(d,c,{reason:M?`Runtime '${c.runtime}' is not available (${C.availabilityError??"CoreSimulator marked it unavailable"}), so iOS simulator '${d.name}' with device type '${c.deviceType}' cannot be created.`:`Device type '${c.deviceType}' does not support runtime '${c.runtime}' (version ${C.version}; supported ${ww(k)}), so iOS simulator '${d.name}' was not created.`,bounds:k,compatibleRuntimes:O})}resolveDisplayCutout(d){let c=Mq(d.platform,d.spec);if(c.kind!=="resolved")throw new $e(c.kind,c.message);return c.displayCutout}withResolvedDisplayCutout(d,c){return{...d,displayCutout:c}}findExisting(d,c){if(c.platform!=="ios")return d.find((D)=>D.name===c.name||c.deviceId!==void 0&&D.deviceId===c.deviceId);if(c.deviceId!==void 0)return d.find((D)=>D.deviceId===c.deviceId);let w=d.filter((D)=>D.name===c.name),b=c.spec;return w.find((D)=>D.isAvailable!==!1&&D.runtime===b.runtime&&D.deviceType===b.deviceType)??w.find((D)=>D.runtime===b.runtime&&D.deviceType===b.deviceType)??w[0]}async assertExistingMatches(d,c){if(c.platform!==d.platform)throw new $e("identity_conflict",`Requested ${d.platform} device '${d.name}' conflicts with existing ${c.platform} device.`);if(c.name!==d.name)throw new $e("identity_conflict",`Requested device name '${d.name}' conflicts with existing '${c.name}' for the supplied identity.`);if(d.platform==="android"){await this.assertAndroidExistingMatches(d,c);return}this.assertIosExistingMatches(d,c)}async assertAndroidExistingMatches(d,c){let w=d.spec,b=await this.dependencies.androidConfigReader.readConfig(c.name);if(Dq(w,b))return;throw new $e("identity_conflict",`Existing Android AVD '${c.name}' does not match the requested runtime, device type, and configuration.`)}assertIosExistingMatches(d,c){let w=d.spec,b=Oq(w,c);if(b==="unavailable")throw new $e("identity_conflict",`Existing iOS simulator '${c.name}' is unavailable: ${c.availabilityError??"CoreSimulator marked it unavailable"}.`);if(b==="mismatch")throw new $e("identity_conflict",`Existing iOS simulator '${c.name}' does not match the requested runtime and device type.`)}async assertAndroidTvImageInstalled(d,c){let w=tn(c.runtime);if(w&&Vt.includes(w.tag)){let b;try{b=await this.dependencies.avdManager.listInstalledSystemImages(d.signal)}catch(D){throw u(D,"Failed to list installed Android system images for AVD creation")}if(!b.some((D)=>D.packageName===c.runtime))throw new t(`No installed Android TV system image matches the requested package '${c.runtime}'. `+zo(c.runtime)+", then retry.")}}async createAndroid(d,c,w){let b;try{b=await this.dependencies.avdManager.createAvd({name:d.name,package:c.runtime,device:c.deviceType},{signal:d.signal})}catch(D){throw cf(),D}if(!b.success)throw new oh(`Failed to create Android AVD '${d.name}': ${b.message}`);if(cf(),c.configuration)await this.configureAndroid(d.name,c.configuration,d.signal);return{created:!0,device:(await UD(this.dependencies.androidConfigReader,[{name:d.name,platform:"android",isRunning:!1,deviceType:c.deviceType,runtimeId:c.runtime}]))[0],resolvedSpec:this.withResolvedDisplayCutout(c,w)}}async createIos(d,c,w){let b=this.dependencies.simulatorCreation?(await this.dependencies.simulatorCreation.create({name:d.name,deviceType:c.deviceType,runtime:c.runtime,resources:d.resources,signal:d.signal})).udid:await this.dependencies.iosSimulator.createSimulator(d.name,c.deviceType,c.runtime,d.signal),D=await this.dependencies.prebootProfile?.apply(b,{resources:d.resources},d.signal);return{...D?.applied&&D.resources.length?{prebootDisabledResources:D.resources}:{},created:!0,device:{name:d.name,platform:"ios",deviceId:b,isRunning:!1,runtime:c.runtime,deviceType:c.deviceType},resolvedSpec:this.withResolvedDisplayCutout(c,w)}}}function ww(d){return d?`${d.minVersion} to ${d.maxVersion??"no maximum"}`:"unknown bounds"}function bw(d,c,w){let b=w.compatibleRuntimes.length?w.compatibleRuntimes.map((D)=>D.id).join(", "):"none installed";return new $e("runtime_incompatible",`${w.reason} Compatible installed runtimes: ${b}.`,void 0,{runtimeCompatibility:{requestedRuntime:c.runtime,requestedDeviceType:c.deviceType,...w.bounds?{bounds:w.bounds}:{},compatibleRuntimes:w.compatibleRuntimes}})}function X7(d,c,{androidConfigWriter:w=new dr,assertAdoptable:b,simulatorCreation:D,ios:C}={}){let k=new Mk;return new lu({assertAdoptable:b,listDeviceImages:d.listDeviceImages.bind(d),isCreationAllowed:c.isCreationAllowed.bind(c),avdManager:{listInstalledSystemImages:(O)=>_u(void 0,void 0,O),createAvd:(O,M)=>k.createAvd(O,M)},androidConfigReader:new Br,androidConfigWriter:w,simulatorCreation:D,prebootProfile:new qv,iosSimulator:new L(null),iosRuntimeCatalog:new L(null),...C})}class _A extends qt{constructor(d){super(`target_identity_unresolved: Android emulator '${d}' is listed by adb but did not answer its AVD-name probe, so it cannot be resolved for lifecycle coordination. Retry once it responds; if it stays unresponsive, call killDevice for it and then startDevice.`,[d])}}class MS{dependencies;execution;bootRecovery;timer;lifecycleCoordinator;constructor(d){this.dependencies=d;this.bootRecovery=d.bootRecovery??new ir,this.timer=d.timer??i,this.execution=new Fo(d,this.timer),this.lifecycleCoordinator=d.lifecycleCoordinator??(d.timer?new vj(d.timer):ga())}async boot(d,c){fj(d,d.cameraPosterPath);let w=d.timeoutMs??Ve,b={request:d,operationName:d.operationName??"startDevice",startedAtMs:this.timer.now(),deadlineMs:d.totalDeadlineMs??this.timer.now()+w,signal:d.signal,lifecycleLease:this.dependencies.lifecycleLease,ownsLifecycleLease:!1,unconfirmedProcessExits:[],pendingTerminations:[],freshProvision:d.freshProvision===!0};if(!b.lifecycleLease&&!this.dependencies.onIdentityResolved)b.lifecycleLease=await this.lifecycleCoordinator.reserve(yb(d.platform,d),{operation:"start",deadlineMs:b.deadlineMs,signal:d.signal}),b.ownsLifecycleLease=!0,b.signal=d.signal?AbortSignal.any([d.signal,b.lifecycleLease.signal]):b.lifecycleLease.signal;try{if(d.deviceId)return await this.bootKnownDevice({...d,deviceId:d.deviceId},b,c);return await this.bootMatchingDevice(d,b,c)}finally{this.releaseOwnedLifecycleLease(b)}}releaseOwnedLifecycleLease(d){if(!d.ownsLifecycleLease)return;let c=d.lifecycleLease;if(d.unconfirmedProcessExits.length===0&&d.pendingTerminations.length===0){c?.release();return}this.releaseOnceProcessesSettle(d,c)}async releaseOnceProcessesSettle(d,c){await Promise.allSettled(d.pendingTerminations),await Promise.allSettled(d.unconfirmedProcessExits),c?.release()}async bindLifecycleIdentity(d,c,w=async()=>c){if(d.lifecycleLease)await d.lifecycleLease.bindCanonicalIdentity(c,w);await this.dependencies.onIdentityResolved?.(c)}async bootKnownDevice(d,c,w){let{deviceManager:b}=this.dependencies,D={platform:d.platform,minOsVersion:d.minOsVersion,maxOsVersion:d.maxOsVersion,name:d.name,formFactor:d.formFactor,requires:d.requires,screenSize:d.screenSize},C=await this.execution.discoverBootedDevices(d.platform,c,"discovering running devices",{bypassAndroidCache:d.platform==="android",awaitAbortSettlement:!0,presentationOrder:d.presentationOrder}),k=Yl(d),O=C.find((U)=>U.deviceId===d.deviceId);if(O)return await this.waitForKnownRunningDevice(O,d,D,{context:c,hasExplicitConstraints:k,progress:w});let M=this.dependencies.assertExplicitDeviceNotForeignOwned;if(M)await this.execution.runPhase(c,"checking explicit device ownership",()=>M(d.deviceId,d.platform));let F=await this.execution.runPhase(c,"listing device images",()=>b.listDeviceImages(d.platform)),q=F.find((U)=>U.deviceId===d.deviceId||d.platform==="android"&&U.name===d.deviceId);if(!q){let U=await this.execution.runPhase(c,"checking simulator platform",(W)=>wl(b,d,W));throw bl(d,C,F,U)}if(k&&!yu(q,D))throw new t(`Device '${d.deviceId}' does not satisfy the requested constraints. ${og(D,[q])}`);let V=await this.bootMatchedImage(q,c,w,{presentationOrder:d.presentationOrder,preferRunning:d.preferRunning,exactTarget:d.platform==="android"&&d.deviceId===q.name});return Qo(V.device,q),V}async waitForKnownRunningDevice(d,c,w,{context:b,hasExplicitConstraints:D,progress:C}){Zl(c,d);let k=await this.enrichKnownRunningDevice(d,c.deviceId,D,b);Ww.bindDeviceExecution(k.device.deviceId);let[O]=await OD([k.device],w.requires,this.dependencies.displayInventory??ws,b.signal);if(D&&!yu(O,w))throw new t(`Device '${c.deviceId}' does not satisfy the requested constraints. ${og(w,[{...O,booted:!0}])}`);let M=await this.waitForRunningDevice(O,b,C);return k.image?{...M,device:he(M.device,k.image),sourceImage:k.image}:M}async enrichKnownRunningDevice(d,c,w,b){let D=d.platform==="ios"&&d.iosVersion===void 0&&d.osVersion===void 0,C=d.platform==="android"?ce(d.deviceId):d.deviceId.includes("-")&&d.deviceId.length>30;if(w||D||C)try{return await this.execution.enrichBootedDeviceFromImage(d,b)}catch(k){if(w)throw k;e.warn(`[DeviceBootService] Exact device '${c}' metadata enrichment failed; adopting discovered device: ${r(k)}`,k)}return{device:d,image:void 0}}async bootMatchingDevice(d,c,w){let{deviceManager:b,deviceMatcher:D,matchingStrategy:C}=this.dependencies,k={platform:d.platform,minOsVersion:d.minOsVersion,maxOsVersion:d.maxOsVersion,name:d.name,formFactor:d.formFactor,requires:d.requires,screenSize:d.screenSize},O=d.matchNamedDeviceIgnoringOsVersion?{...k,minOsVersion:void 0,maxOsVersion:void 0}:k,F=(await this.execution.runPhase(c,"listing device images",()=>b.listDeviceImages(d.platform))).filter((G)=>!ar(G,d.excludeDeviceNames,d.excludeDeviceIds)),q=[],V=await this.findRunningMatch(d,O,F,{context:c,progress:w,candidates:q});if(V)return V;let U=d.matchExactName&&d.name?F.find((G)=>G.name===d.name&&yu(G,O))??null:D.matchDeviceImage(O,F,C);if(U){let G=await this.bootMatchedImage(U,c,w,{presentationOrder:d.presentationOrder,preferRunning:d.preferRunning,exactTarget:d.matchExactName===!0});if(d.matchExactName)Qo(G.device,U);return G}if(d.matchExactName&&d.name){if(F.some((G)=>G.name===d.name))throw new t(`No ${d.platform} device matching criteria found for exact target '${d.name}'. `+og(O,F));throw new t(`target_not_found: Configured ${d.platform} device '${d.name}' was not found; an exact target cannot be replaced or created by acquisition.`)}let W=[...q,...F.filter((G)=>!q.some((Z)=>Z.name===G.name))];return this.provisionAndBoot(d,k,F,{context:c,progress:w,candidates:W})}async findRunningMatch(d,c,w,{context:b,progress:D,candidates:C}){if(d.preferRunning===!1)return;let k=await this.execution.discoverBootedDevices(d.platform,b,"discovering running devices",{bypassAndroidCache:d.matchExactName&&d.name!==void 0,awaitAbortSettlement:!1,presentationOrder:d.presentationOrder});iu(d,k);let{excludeDeviceNames:O,excludeDeviceIds:M}=d,F=O||M?k.filter((G)=>!O?.has(G.name)&&!M?.has(G.deviceId)):k,q=await mg(void 0,()=>OD(es(F,w),c.requires,this.dependencies.displayInventory??ws,b.signal));C?.push(...q);let V=d.matchExactName&&d.name?nu(d.platform,q,d.name,c):this.matchBootedPreferringUndeferred(c,q,d.deferDeviceIds);if(!V)return;await this.execution.reportProgress(b,D,100,"Found matching running device");let U=Xi(V,w),W=await this.waitForRunningDevice(V,b,D);return ru(d,W.device),U?{...W,device:he(W.device,U),sourceImage:U}:W}matchBootedPreferringUndeferred(d,c,w){let{deviceMatcher:b,matchingStrategy:D}=this.dependencies,C=w?.size?c.filter((k)=>!w.has(k.deviceId)):c;return b.matchBootedDevice(d,C,D)??(C.length<c.length?b.matchBootedDevice(d,c,D):null)}adoptAfterLeasePolicy(d,c,w,b){let D=d.ownsLifecycleLease||this.dependencies.allowExternalLeaseAdoptionRecheck===!0,C=w===!1&&!c.isRunning;if(!D||C)return"never";return c.platform==="ios"||b?"always":"if-queued"}async bootMatchedImage(d,c,w,{presentationOrder:b,preferRunning:D,exactTarget:C}){let k=te(d.platform,"Starting a device");if(!d.isRunning&&d.platform!=="android")return this.bootImage(d,c,w,{provisioned:!1,adoptAfterLease:this.adoptAfterLeasePolicy(c,d,D,!1)});let O=await this.execution.discoverBootedDevices(k,c,"resolving the running device image",{bypassAndroidCache:d.platform==="android",awaitAbortSettlement:!0,presentationOrder:b});Sl(d,O,C===!0,c.freshProvision===!0);let M=or(d,O),F=d.platform==="android"&&nr(this.lifecycleCoordinator,d.name),q=D===!1&&!d.isRunning,V=this.adoptAfterLeasePolicy(c,d,D,F);if(!M)return this.bootImage(d,c,w,{provisioned:!1,adoptAfterLease:V});if(F||q)return this.bootImage(d,c,w,{provisioned:!1,adoptAfterLease:V});let U=await this.waitForRunningDevice(he(M,d),c,w);return{...U,device:he(U.device,d),sourceImage:d}}async provisionAndBoot(d,c,w,{context:b,progress:D,candidates:C=w}){let k=C.map((U)=>({...U,booted:"isRunning"in U?U.isRunning:!0}));if(!this.dependencies.deviceCreationGate.isCreationAllowed(d.createIfMissing))throw ou(d,c,w,k);are(c,k);let O=this.dependencies.checkBootCapacity??((U,W)=>Go.assertBootCapacityAvailable(U,{signal:W}));await this.execution.runPhase(b,"checking boot capacity",(U)=>O(c.platform,U));let M,F,q,V=this.provisioningIdentityHooks(b,(U)=>{M=U},(U)=>{F=U});try{let U=await this.execution.runPhase(b,"provisioning a device",(G)=>(q=this.dependencies.deviceProvisioner.provision(c,G,V),q));return M=U,{...await this.bootImage(sr(U,d),b,D,{provisioned:!0}),...U.prebootDisabledResources?{prebootDisabledResources:U.prebootDisabledResources}:{}}}catch(U){throw await this.rollbackFailedProvisioning(d,U,{created:M,creationStarted:F,provisioning:q}),U}}async rollbackFailedProvisioning(d,c,{created:w,creationStarted:b,provisioning:D}){if(w)await this.dependencies.rollbackCreatedDevice?.(sr(w,d),c);else if(b&&!(c instanceof oh))await this.dependencies.rollbackCreatedDevice?.(sr(b,d),c,{pendingCreation:D})}provisioningIdentityHooks(d,c,w){return{reserveBeforeCreate:async(b)=>{if(b.platform==="android")await this.bindLifecycleIdentity(d,{platform:"android",stableId:b.name});return w(b),d.signal},bindAfterCreate:async(b)=>{if(c(b),b.platform==="ios"){if(!b.deviceId)throw new t(`Created iOS simulator '${b.name}' has no lifecycle identity.`);await this.bindLifecycleIdentity(d,{platform:"ios",stableId:b.deviceId})}}}}async waitForRunningDevice(d,c,w){if(fj(d,c.request.cameraPosterPath),c.request.cameraPosterPath!==void 0&&d.platform==="android")throw new t(!ce(d.deviceId)?"cameraPosterPath is unsupported on physical Android devices. Use a stopped Android emulator.":"cameraPosterPath is unsupported on a running Android emulator. Stop it before requesting a poster.");if(d.platform==="ios")await this.bindLifecycleIdentity(c,{platform:"ios",stableId:d.deviceId},async()=>await this.revalidateRunningIdentity(d,c));else if(d.deviceId.startsWith("emulator-")&&d.name!==`Unknown (${d.deviceId})`)await this.bindLifecycleIdentity(c,{platform:"android",stableId:d.name},async()=>await this.revalidateRunningIdentity(d,c));let b={...d,isRunning:!0},D=0;return this.bootRecovery.run(b,async()=>{if(D++,D>1)return this.bootImageOnce(b,c,w,!1);let C=await this.execution.runPhase(c,"waiting for a running device",(k)=>this.dependencies.deviceManager.waitForDeviceReady({...d,isRunning:!0},this.execution.remaining(c,"waiting for a running device"),void 0,{signal:k}));return{device:{...d,...C},source:"booted",provisioned:!1}},c.signal)}async revalidateRunningIdentity(d,c){return su({execution:this.execution},d,c)}async revalidateImageIdentity(d,c){return au({execution:this.execution,dependencies:this.dependencies},d,c)}async findRunningImageAfterLease(d,c,w=!0){return du({execution:this.execution,dependencies:this.dependencies,lifecycleCoordinator:this.lifecycleCoordinator,timer:this.timer},d,c,w)}async boundedIosRecheck(d,c,w){return rs({timer:this.timer},d,c,w)}async bootImage(d,c,w,{provisioned:b,adoptAfterLease:D="never"}){if(c.deviceLabel=d.deviceId?`${d.name} (${d.deviceId})`:d.name,d.isRunningStateKnown===!1)d=await this.execution.recheckRunningState(d,c);if(gb(d),d.platform==="ios"&&!d.deviceId)throw new t("iOS simulator deviceId (UDID) is required to start a simulator.");let C=!1;await this.bindLifecycleIdentity(c,{platform:d.platform,stableId:d.platform==="android"?d.name:d.deviceId},async()=>(C=!0,await this.revalidateImageIdentity(d,c)));let k=D==="always"||D==="if-queued"&&C;if(k){let M=await this.adoptRunningImageAfterLease(d,c,w);if(M)return M}let O=Zo(this.lifecycleCoordinator,d,this.dependencies.onAndroidColdBootTrackingChanged);try{return await this.bootRecovery.run(d,async()=>this.bootImageAdoptingAlreadyRunning(d,c,w,{provisioned:b,adoptRunningAfterLease:k}),c.signal)}finally{O?.()}}async adoptRunningImageAfterLease(d,c,w,b=!0){let D=await this.findRunningImageAfterLease(d,c,b);if(!D)return;return{...await this.waitForRunningDevice(he(D,d),c,w),sourceImage:d}}async bootImageAdoptingAlreadyRunning(d,c,w,{provisioned:b,adoptRunningAfterLease:D}){try{return await this.bootImageOnce(d,c,w,b)}catch(C){if(!D||d.platform!=="ios"||!(C instanceof eR))throw C;let k=await this.adoptRunningImageAfterLease(d,c,w,!1);if(!k)throw C;return k}}async bootImageOnce(d,c,w,b){let D=Zo(this.lifecycleCoordinator,d,this.dependencies.onAndroidColdBootTrackingChanged);try{return await this.execution.bootImageOnceWithOwnedLaunchTracking(d,c,w,b)}catch(C){throw await c.unheldLaunchTermination,C}finally{D?.()}}}function e_(d,c){if(c!=="either")return c;return $a(d)?"ios":ce(d)?"android":c}function xA(d,c,w="either"){let b=d.filter((k)=>w==="either"||k.platform===w),D=b.find((k)=>k.deviceId===c);if(D)return D;let C=b.filter((k)=>k.name===c);if(C.length>1)throw new t(`Ambiguous running device name '${c}'. Candidates: ${C.map((k)=>k.deviceId).sort().join(", ")}. Provide a deviceId.`);return C[0]}class ns extends t{}function Z7(d){return d instanceof ns}function p0(d,c,w){return new ns(`Device ${d} not found on ${c} platform. Available ${c} devices: ${os(w.filter((b)=>c==="either"||b.platform===c))}`)}function os(d){return d.map((c)=>c.name&&c.name!==c.deviceId?`${c.name} (${c.deviceId})`:c.deviceId).join(", ")||"none"}class uu{resumeAfterDeviceStart(d,c){switch(d){case"android":E.resumeAfterDeviceStart(c);return;case"ios":x.resumeAfterDeviceStart(c);return;case"watchos":return}}async retireForShutdown(d,c){switch(d){case"android":E.retireForShutdown(c);return;case"ios":await x.retireInstance(c);return;case"watchos":return}}}var NS=new uu;function t_(d,c=R){let w=d?.trim();if(!w)return;let b=c.sessionManager();return b?st(w,b)??w:w}var r_=30000,n_=1800000,x4=30000;var Ea={includeAppData:!0,includeSettings:!0,useVmSnapshot:!0,strictBackupMode:!1,vmSnapshotTimeoutMs:r_,maxVmSnapshotsPerAvd:3,maxVmArchiveSizeMb:void 0,maxArchiveSizeMb:100};var ss="global",Sw=s({syncWithHost:h(),defaultMode:p(["light","dark","auto"]),applyOnConnect:h()}),_w=s({includeAppData:h().default(Ea.includeAppData),includeSettings:h().default(Ea.includeSettings),useVmSnapshot:h().default(Ea.useVmSnapshot),strictBackupMode:h().default(Ea.strictBackupMode),vmSnapshotTimeoutMs:a().default(Ea.vmSnapshotTimeoutMs),maxVmSnapshotsPerAvd:a().default(Ea.maxVmSnapshotsPerAvd),maxVmArchiveSizeMb:a().optional(),maxArchiveSizeMb:a().default(Ea.maxArchiveSizeMb)}),Rw=s({qualityPreset:p(["low","medium","high"]),targetBitrateKbps:a(),maxThroughputMbps:a(),fps:a(),maxArchiveSizeMb:a(),format:_("mp4"),resolution:s({width:a(),height:a()}).optional()}),as={appearance:{tableName:"appearance_configs",loggerTag:"AppearanceConfigRepository",schema:Sw},deviceSnapshot:{tableName:"device_snapshot_configs",loggerTag:"DeviceSnapshotConfigRepository",schema:_w},videoRecording:{tableName:"video_recording_configs",loggerTag:"VideoRecordingConfigRepository",schema:Rw}};class mu{tableName;loggerTag;db;logger;timer;schema;constructor(d){this.schema=d.schema,this.tableName=d.tableName,this.loggerTag=d.loggerTag??"KeyedJsonConfigRepository",this.db=d.db??null,this.logger=d.logger??e,this.timer=d.timer??i}getDb(){return this.db??_e()}async getConfig(d=ss){let w=await(await this.getDb()).selectFrom(this.tableName).select(["config_json"]).where("key","=",d).executeTakeFirst();if(!w)return null;let b;try{b=JSON.parse(w.config_json)}catch(C){return this.logger.warn(`[${this.loggerTag}] Failed to parse config JSON: ${r(C)}`),null}let D=this.schema.safeParse(b);if(!D.success)return this.logger.warn(`[${this.loggerTag}] Config JSON failed validation: ${D.error.message}`),null;return D.data}async setConfig(d,c=ss){let w=await this.getDb(),b=Vr(this.timer),D={key:c,config_json:JSON.stringify(d),updated_at:b};await w.insertInto(this.tableName).values(D).onConflict((C)=>C.column("key").doUpdateSet({config_json:D.config_json,updated_at:D.updated_at})).execute()}async clearConfig(d=ss){await(await this.getDb()).deleteFrom(this.tableName).where("key","=",d).execute()}async listKeys(d){return(await(await this.getDb()).selectFrom(this.tableName).select(["key"]).execute()).map((b)=>b.key).filter((b)=>b.startsWith(d))}}function ds(d,c){return new mu({...d,db:c})}function pu(d){return ds(as.appearance,d)}function Q7(d){return ds(as.deviceSnapshot,d)}function C4(d){return ds(as.videoRecording,d)}var Kt={syncWithHost:!0,defaultMode:"auto",applyOnConnect:!0},Dw=new Set(["light","dark","auto"]);function ft(d){let c=d&&typeof d==="object"?d:{},w=Pw(c.defaultMode),b=typeof c.syncWithHost==="boolean"?c.syncWithHost:Kt.syncWithHost,D=typeof c.applyOnConnect==="boolean"?c.applyOnConnect:Kt.applyOnConnect;return{syncWithHost:b,defaultMode:w,applyOnConnect:D}}function Pw(d){if(!d)return Kt.defaultMode;let c=String(d).trim().toLowerCase();if(Dw.has(c))return c;return Kt.defaultMode}var Iw="defaults",Aw="-g",Ew=2000;function xw(){return{executor:new re,platform:process.platform,logger:e}}class cs{dependencies;constructor(d=xw()){this.dependencies=d}isSupported(){return this.dependencies.platform==="darwin"}async readGlobal(d,c={}){if(!this.isSupported())return null;try{let b=(await this.dependencies.executor.executeCommand(Iw,["read",Aw,d],{timeoutMs:c.timeoutMs??Ew,signal:c.signal})).stdout.trim();return b.length>0?b:null}catch(w){return this.dependencies.logger.debug(`host defaults read -g ${d} failed: ${w}`,w),null}}}async function lr(d,c,w){try{let b=await w.executeCommand(d,c,{timeoutMs:2000});return{stdout:b.stdout?b.stdout.toString():"",stderr:b.stderr?b.stderr.toString():""}}catch(b){return e.debug(`src/utils/hostAppearance.ts fallback failed: ${b}`,b),null}}function ls(d){let c=d.trim().toLowerCase();return c.includes("dark")||c.includes("prefer-dark")}async function fu(d=new cs,c=new re){if(d.isSupported())return(await d.readGlobal("AppleInterfaceStyle"))?.toLowerCase()==="dark"?"dark":"light";if(process.platform==="linux"){let w=await Tw(c);if(w!==null)return w}return e.debug("[HostAppearance] Falling back to light appearance (unsupported host)"),"light"}async function Tw(d){let c=await lr("gsettings",["get","org.gnome.desktop.interface","color-scheme"],d);if(c?.stdout)return ls(c.stdout)?"dark":"light";let w=await lr("gsettings",["get","org.gnome.desktop.interface","gtk-theme"],d);if(w?.stdout)return ls(w.stdout)?"dark":"light";let b=await lr("kreadconfig5",["--group","General","--key","ColorScheme"],d)??await lr("kreadconfig6",["--group","General","--key","ColorScheme"],d);if(b?.stdout)return ls(b.stdout)?"dark":"light";return null}var gt=pu(),us="session:";function ur(d){return d?`${us}${d}`:void 0}function Bw(d,c){return{syncWithHost:c.syncWithHost??d.syncWithHost,defaultMode:c.defaultMode??d.defaultMode,applyOnConnect:c.applyOnConnect??d.applyOnConnect}}function kw(d){return{syncWithHost:d.syncWithHost,defaultMode:d.defaultMode,applyOnConnect:d.applyOnConnect}}async function Ky(d){let c=(d?await gt.getConfig(ur(d)):null)??await gt.getConfig();if(c)return ft(c);return ft(N.getAppearanceDefaults())}async function eQ(d,c){if(d===null)return await gt.clearConfig(ur(c)),ft(N.getAppearanceDefaults());let w=await Ky(c),b=Bw(kw(w),d),D=ft(b);return await gt.setConfig(D,ur(c)),D}async function Fq(d){await gt.clearConfig(ur(d))}async function tQ(d,c=gt){let w=[];for(let b of await c.listKeys(us)){let D=b.slice(us.length);if(!await d(D))await c.clearConfig(b),w.push(D)}return w}async function CA(d){let c=d??await Ky();if(c.syncWithHost||c.defaultMode==="auto")return fu();return c.defaultMode==="dark"?"dark":"light"}import{existsSync as Ow}from"fs";import{join as Mw}from"path";async function DA(d,c){if(d.platform==="android"){let w=process.platform==="win32"?"adb.exe":"adb";if(!da(process.env,(k)=>Ow(Mw(k,"platform-tools",w)))){e.debug("Skipping Android host appearance sync because configured SDK adb was not found");return}let D=v.create(d),C=c==="dark"?"yes":"no";await D.executeCommand(`shell cmd uimode night ${C}`),e.info(`[Appearance] Set Android appearance to ${c} for ${d.deviceId}`);return}if(d.platform==="ios")await new L(d).setAppearance(c),e.info(`[Appearance] Set iOS appearance to ${c} for ${d.deviceId}`)}function Lq(d){return!["0","false","off","no"].includes(d?.trim().toLowerCase()??"")}function Gy(){return Lq(I(f.APPEARANCE_SYNC))}var Nw={isSyncEnabled:Gy,getConfig:Ky,resolveMode:CA,apply:DA};async function gu(d,c={},w){let{isSyncEnabled:b,getConfig:D,resolveMode:C,apply:k}={...Nw,...c};if(!b())return null;try{let O=await D(w);if(!O.applyOnConnect)return null;let M=await C(O);if(!b())return null;return await k(d,M),M}catch(O){return e.warn("[Appearance] Failed to apply appearance on connect",O),null}}var tt=new Map,Lw=256;function hu(){return R.sessionManager()}function m0(d,c,w,b=hu()){if(w){let D=b?.getSession(w);if(D&&D.assignedDevice===d){D.cacheData.pendingSetupTiming=c;return}if(b&&!D)return}if(tt.delete(d),tt.set(d,{timing:c,sessionId:w}),tt.size>Lw){let D=tt.keys().next().value;if(D!==void 0)tt.delete(D)}}function vu(d,c){let w=tt.get(d);if(!w||w.sessionId!==c)return null;return tt.delete(d),w.timing}function rQ(d,c,w=hu()){if(c){let b=w?.getSession(c);if(!b||b.assignedDevice!==d){if(w&&!b)return null;return vu(d,c)}let D=b.cacheData.pendingSetupTiming;return delete b.cacheData.pendingSetupTiming,D??null}return vu(d)}function Bq(d,c){return cc(d.name)||od(d.name)||c?.holderOf({platform:d.platform,stableIds:[d.name,d.deviceId]})!==void 0}async function ms(d,c){await Yd(c);let w=d.filter((b)=>!Bq(b,c));if(w.length===0)throw new t("Cannot automatically start a device: all available images are broker-managed or held by a binding. Pass a deviceId to select an explicit target, or start a non-broker device and retry.");return w[0]}class mr extends t{}class ps{dependencies;constructor(d){this.dependencies=d}async ensureReady(d,c,w){let b=Ba(!0);b.serial("ensureAccessibilityService");let D={didSetup:!1,needsSetup:!1};try{await this.ensureService(c,d,w,{perf:b,state:D})}catch(C){this.handleSetupFailure(C,d,w)}finally{this.finishSetupTiming(d,b,D,w)}}skipCtrlProxyDownload(d){return d?.skipCtrlProxyDownload??d?.skipAccessibilityDownload??d?.skipAccessibilitySetup}warnDeprecatedAccessibilityOptions(d){if(d?.skipAccessibilitySetup!==void 0)if(d?.skipAccessibilityDownload!==void 0)e.warn("[DeviceReadiness] skipAccessibilityDownload is deprecated; use skipCtrlProxyDownload instead.");else e.warn("[DeviceReadiness] skipAccessibilitySetup is deprecated; use skipCtrlProxyDownload instead.")}async verifyConnectedAndroidService(d,c,w){if(e.info(`[DeviceReadiness] WebSocket connected for ${d}, verifying service is responsive`),await w.track("verifyConnectedService",()=>c.verifyServiceReady(2,200,2000)))return e.info(`[DeviceReadiness] Accessibility service verified responsive for ${d}`),w.end(),!0;return e.warn(`[DeviceReadiness] WebSocket connected but service not responsive for ${d}, terminating stale connection and checking status`),c.terminateStaleConnection(),!1}async verifyEnabledAndroidService(d,c,w,{perf:b,step:D}){let{setupState:C,skipCtrlProxyDownload:k,verifyCompatibilityWhenSkipping:O,signal:M}=D;if(e.info(`[DeviceReadiness] Accessibility service already enabled for ${d}, verifying WebSocket connection`),await b.track("verifyConnection",()=>w.waitForConnection(3,200))){if(k)return await O(),!0;e.info(`[DeviceReadiness] Accessibility service enabled and connected for ${d}, verifying version compatibility`),await this.upgradeStaleInstall(d,c,C)}else await this.throwAndroidForwardConflictIfPresent(d,c,w,M),e.warn(`[DeviceReadiness] Accessibility service cache stale for ${d} - marked as installed/enabled but WebSocket failed. Resetting setup state and forcing reinstall.`),c.resetSetupState(),C.needsSetup=!0;return!1}async upgradeStaleInstall(d,c,w){try{let b=await c.ensureCompatibleVersion();if(b.status==="upgraded"||b.status==="installed"||b.status==="reinstalled")e.info(`[DeviceReadiness] CtrlProxy APK on ${d} was ${b.status}; reconnecting`),w.needsSetup=!0}catch(b){if(b instanceof this.dependencies.errors.DeviceOwnedByOtherDaemonError)throw b;e.warn(`[DeviceReadiness] CtrlProxy APK check failed on ${d}: ${r(b)}`,b)}}async enableInstalledAndroidService(d,c,w,{perf:b,step:D}){let{DeviceOwnedByOtherDaemonError:C}=this.dependencies.errors,{setupState:k,skipCtrlProxyDownload:O,verifyCompatibilityWhenSkipping:M,signal:F}=D;e.info(`[DeviceReadiness] Accessibility service installed but not enabled for ${d}, enabling now`);try{if(await b.track("enableService",()=>c.enable()),k.didSetup=!0,w.resetConnectionBudget(),e.info(`[DeviceReadiness] Waiting for accessibility WebSocket connection for ${d}`),!await b.track("waitForConnection",()=>w.waitForConnection()))await this.throwAndroidForwardConflictIfPresent(d,c,w,F),e.warn(`[DeviceReadiness] WebSocket connection failed after enabling for ${d}, will attempt full setup`),c.resetSetupState(),k.needsSetup=!0;else{if(O)return await M(),!0;e.info(`[DeviceReadiness] Accessibility service enabled for ${d}, verifying version compatibility`)}}catch(q){if(q instanceof C||w.isLastConnectionFailureForwardingLeaseConflict?.())throw q;let V=r(q);if(e.warn(`[DeviceReadiness] Failed to enable accessibility service: ${V}`),O)return!0;k.needsSetup=!0}return!1}async setupAndroidService(d,c,w,{perf:b,state:D,signal:C}){let{DeviceOwnedByOtherDaemonError:k,CtrlProxyForwardOwnershipUnreadableError:O}=this.dependencies.errors,M=await c.setup(!1,b);if(!M.success){if(M.cause instanceof k||M.cause instanceof O)throw M.cause;throw new t(M.error??M.message)}D.didSetup=!0,w.resetConnectionBudget(),e.info(`[DeviceReadiness] Waiting for accessibility WebSocket connection after setup for ${d}`);let F=await b.track("waitForConnection",()=>w.waitForConnection());if(!F)await this.throwAndroidForwardConflictIfPresent(d,c,w,C);if(F){if(e.info(`[DeviceReadiness] Verifying accessibility service is responsive for ${d}`),!await b.track("verifyServiceReady",()=>w.verifyServiceReady(5,500,3000)))e.warn(`[DeviceReadiness] Accessibility service not responsive after setup for ${d}, observe may fall back to UIAutomator`)}}async throwAndroidForwardConflictIfPresent(d,c,w,b){if(!w.isLastConnectionFailureForwardingLeaseConflict?.())return;throw await c.assertNotDrivenByOtherDaemon?.(b),b?.throwIfAborted(),new mr(w.getLastConnectionFailureMessage?.()??`CtrlProxy forwarding lease conflict for Android device ${d}`)}async prepareService(d){let{deviceId:c,manager:w,accessibilityClient:b,perf:D,state:C,skipCtrlProxyDownload:k,options:O}=d,M=async()=>{if(await w.isVersionCompatible()){e.info(`[DeviceReadiness] Accessibility service version compatible for ${c}`);return}let U="Accessibility service version mismatch detected. Run without skipCtrlProxyDownload to install a compatible version.";throw e.warn(`[DeviceReadiness] ${U} Device: ${c}`),new t(U)},[F,q]=await D.track("checkStatus",()=>Promise.all([w.isInstalled(),w.isEnabled()]));if(O?.signal?.throwIfAborted(),C.needsSetup=!1,await this.useInstalledService(d,F,q,M))return;if(k&&!C.needsSetup){e.info(`[DeviceReadiness] Skipping accessibility service download/install for ${c}`);return}if(C.needsSetup||!F)O?.signal?.throwIfAborted(),await this.setupAndroidService(c,w,b,{perf:D,state:C,signal:O?.signal})}async ensureService(d,c,w,{perf:b,state:D}){let C=this.skipCtrlProxyDownload(w);this.warnDeprecatedAccessibilityOptions(w);let k=this.dependencies.provider.getAndroidCtrlProxyManager(d),O=this.dependencies.provider.getAndroidCtrlProxyClient(d);if(O.isConnected()){if(await this.verifyConnectedAndroidService(c,O,b)){w?.signal?.throwIfAborted(),this.dependencies.checkedAndroidOwnership.getStore()?.add(c);return}}await k.assertNotDrivenByOtherDaemon?.(w?.signal),w?.signal?.throwIfAborted(),this.dependencies.checkedAndroidOwnership.getStore()?.add(c),await this.prepareService({deviceId:c,manager:k,accessibilityClient:O,perf:b,state:D,skipCtrlProxyDownload:C,options:w})}finishSetupTiming(d,c,w,b){if(c.end(),w.didSetup){let D=c.getTimings();if(D)this.dependencies.storeSetupTiming(d,D,b?.sessionId)}}async useInstalledService(d,c,w,b){let{deviceId:D,manager:C,accessibilityClient:k,perf:O,state:M,skipCtrlProxyDownload:F,options:q}=d;if(c&&w){if(await this.verifyEnabledAndroidService(D,C,k,{perf:O,step:{setupState:M,skipCtrlProxyDownload:F,verifyCompatibilityWhenSkipping:b,signal:q?.signal}}))return!0}if(!c&&F)return e.info(`[DeviceReadiness] Accessibility service not installed for ${D}, skipping download/install`),!0;if(c&&!w&&!M.needsSetup){if(await this.enableInstalledAndroidService(D,C,k,{perf:O,step:{setupState:M,skipCtrlProxyDownload:F,verifyCompatibilityWhenSkipping:b,signal:q?.signal}}))return!0}return!1}handleSetupFailure(d,c,w){let{DeviceOwnedByOtherDaemonError:b,CtrlProxyForwardOwnershipUnreadableError:D}=this.dependencies.errors;w?.signal?.throwIfAborted();let C=r(d);if(w?.intent==="read"&&(d instanceof b||d instanceof D||d instanceof mr)){e.warn(`[DeviceReadiness] Skipping CtrlProxy readiness for read on ${c}: ${C}`);return}if(e.error(`[DeviceReadiness] Failed to setup accessibility service: ${C}`),d instanceof t||w?.signal?.aborted)throw d}}class fs{observeClients;_adb;_adbFactory;_simctl;_androidEmulator;_deviceUtils;_windows=new Map;constructor(d,c=v){this.observeClients=d;this._adbFactory=c}getAdb(){if(!this._adb)this._adb=this._adbFactory.create(null);return this._adb}getSimctl(){if(!this._simctl)this._simctl=new L(null);return this._simctl}getAndroidEmulator(){if(!this._androidEmulator)this._androidEmulator=new oi;return this._androidEmulator}getDeviceUtils(){if(!this._deviceUtils)this._deviceUtils=new si(this.getAdb(),this.getSimctl(),this.getAndroidEmulator());return this._deviceUtils}getIosPhysicalDeviceLister(){return ND()}getAndroidCtrlProxyManager(d){return le.getInstance(d)}getAndroidCtrlProxyClient(d){return this.observeClients.androidCtrlProxyClient(d)}getIOSCtrlProxyManager(d){return ye.getInstance(d)}getIOSCtrlProxyClient(d,c){return this.observeClients.iosCtrlProxyClient(d,c)}getWindow(d){let c=d.deviceId,w=$D(d,En(d)),b=this._windows.get(c);if(!b)return this.cacheWindow(c,d,w);if(w.unresolved)return b.window;let D=Iu(b.evidence,w);if(w.stableId===b.evidence.stableId){if(D==="newer")b.evidence=w;return b.window}if(D!=="newer")return b.window;return this.cacheWindow(c,d,w)}cacheWindow(d,c,w){let b=this.observeClients.createWindow(c,this._adbFactory);return this._windows.set(d,{window:b,evidence:w}),b}getObserveScreenCache(){return this.observeClients.observeScreenCache()}}var Fw={androidCtrlProxyClient:(d)=>E.getInstance(d),iosCtrlProxyClient:(d,c)=>x.getInstance(d,c),createWindow:(d,c)=>new Il(d,c),observeScreenCache:()=>xe.defaultObserveScreenCache};function gs(d){return new fs(Fw,d)}var wu=1000,bu=1e4,$w={booted:0,automationReady:1};function $q(d){return $w[d]}async function Su(d,c,w){let b=d.runnerReadinessTimer.now()+Kr,D=()=>{let M=b-d.runnerReadinessTimer.now();if(M<=0)throw new t("Created iOS simulator rollback budget exhausted.");return M};if(!c.deviceId){e.warn(`[DeviceReadiness] Cannot roll back created iOS simulator '${c.name}': no UDID.`);return}e.warn(`[DeviceReadiness] Rolling back created iOS simulator '${c.name}' (${c.deviceId}) after failure: ${r(w)}`);let C=new AbortController().signal,k={name:c.name,platform:"ios",deviceId:c.deviceId},O="retire runner";try{await Uw(d,k),O="shut down",await qw(d,k,C,D()),O="delete",await d.simctl().deleteSimulator(c.deviceId,{signal:C,timeoutMs:D()}),O="verify absence of",D(),await Gw(d,c.deviceId,C,b)}catch(M){let F=b-d.runnerReadinessTimer.now(),q=F>0?await jw(d,c.deviceId,C,F):"unknown";e.warn(`[DeviceReadiness] Failed to ${O} created iOS simulator '${c.name}' (${c.deviceId}, state: ${q}); it may be left behind: `+r(M),M)}}async function Uw(d,c){try{await x.retireInstance(c.deviceId),await d.provider.getIOSCtrlProxyManager(c).stop()}catch(w){e.warn(`[DeviceReadiness] Failed to stop CtrlProxy iOS for created simulator ${c.deviceId} before rollback: ${r(w)}`,w)}}async function qw(d,c,w,b=Kr){try{await d.simctl().killSimulator(c,{signal:w,timeoutMs:b})}catch(D){if(!QT(D)){e.warn(`[DeviceReadiness] Failed to shut down created iOS simulator ${c.deviceId}; attempting delete: ${r(D)}`,D);return}e.debug(`[DeviceReadiness] ${c.deviceId} was already shut down: ${r(D)}`)}}async function Gw(d,c,w,b=Number.POSITIVE_INFINITY){let D=Math.min(d.runnerReadinessTimer.now()+bu,b);for(;;){let C=D-d.runnerReadinessTimer.now();if(C<=0)throw new t(`iOS simulator ${c} is still listed after delete.`);if(!(await d.simctl().listSimulatorImages(C,{bypassCache:!0,signal:w})).some((O)=>O.deviceId===c))return;if(d.runnerReadinessTimer.now()>=D)throw new t(`iOS simulator ${c} is still listed after delete.`);await d.runnerReadinessTimer.sleep(Math.min(wu,D-d.runnerReadinessTimer.now()))}}async function jw(d,c,w,b){try{let C=(await d.simctl().listSimulatorImages(b,{bypassCache:!0,signal:w})).find((k)=>k.deviceId===c);return C?C.state??"unknown":"absent"}catch(D){return e.warn(`[DeviceReadiness] Could not read state of ${c}: ${r(D)}`,D),"unknown"}}async function Ru(d,c,w,b={}){b.signal?.throwIfAborted();let D=await d.getBootedDevicesDetailed("visionos",{signal:b.signal});if(b.signal?.throwIfAborted(),!D.succeededPlatforms.has("visionos"))throw new t(`visionOS simulator discovery failed: ${D.discoveryErrors?.visionos?.message??"unknown error"}. Retry the call.`);let C=Kw(D.devices,c,w);if(!C)throw new t("No booted Apple Vision Pro matches the request uniquely. Pass deviceId or boot it with startDevice and platform visionos.");if(b.intent==="read")await b.beforeReadReadiness?.(C);return C}function Kw(d,c,w){let b=d.filter((C)=>C.platform==="visionos"),D=c??(w?.platform==="visionos"?w.deviceId:void 0);return D?b.find((C)=>C.deviceId===D):b.length===1?b[0]:void 0}async function Du(d,c,w,b={}){b.signal?.throwIfAborted();let D=await d.getBootedDevicesDetailed("tvos",{signal:b.signal});if(b.signal?.throwIfAborted(),!D.succeededPlatforms.has("tvos"))throw new t(`tvOS simulator discovery failed: ${D.discoveryErrors?.tvos?.message??"unknown error"}. Retry the call.`);let C=Jw(D.devices,c,w);if(!C)throw new t("No booted Apple TV matches the request uniquely. Pass deviceId or boot it with startDevice and platform tvos.");if(b.intent==="read")await b.beforeReadReadiness?.(C);return C}function Jw(d,c,w){let b=d.filter((C)=>C.platform==="tvos"),D=c??(w?.platform==="tvos"?w.deviceId:void 0);return D?b.find((C)=>C.deviceId===D):b.length===1?b[0]:void 0}async function Pu(d,c,w){try{return await d.deviceUtils().startDevice(c)}catch(b){if(mb(b)&&b.process)w.holdLeaseUntil(Yi(b.process,c.name,d.runnerReadinessTimer,{markHeldByUnkillableProcess:(D)=>w.lease.markHeldByUnkillableProcess?.(D)}).then((D)=>D.state==="survived"?D.gone:void 0));throw b}}async function vs(d,c,w){let b=[c?.signal,d.signal].filter((D)=>D!==void 0);return await w(b.length===1?b[0]:AbortSignal.any(b))}function Cu(d,c,w){if(c?.intent==="read"&&w.precedingOperations?.some((b)=>b==="shutdown"||b==="teardown"))throw new t(`${d.platform} device '${d.name}': a shutdown or teardown ran while this read waited for it; a read does not boot it again. Call startDevice to boot it.`)}function Jt(d,c,w){return`iOS simulator '${d}' (${c}) is not booted${w?` (state: ${w})`:""}; a read never boots a simulator. Call startDevice (or acquire a session) to boot it.`}var FS="ambiguous_device_target";class cm extends t{code=FS;retryable=!1;candidates;constructor(d,c){super(`${d} (code ${FS})`);this.name="AmbiguousDeviceTargetError",this.candidates=c.map(({deviceId:w,platform:b})=>({deviceId:w,platform:b}))}toPayload(){return{code:this.code,candidates:this.candidates,retryable:!1}}}async function Au(d,c=v){if(d.platform!=="android")return;if(!d.deviceId.startsWith("emulator-"))return;try{await c.create(d).executeCommand("shell settings put secure stylus_handwriting_enabled 0"),e.info(`[StylusHandwriting] Disabled stylus handwriting on ${d.deviceId}`)}catch(w){e.warn(`[StylusHandwriting] Failed to disable stylus handwriting on ${d.deviceId}: ${w}`)}}class LS{retired=new Map;async retire(d){this.retired.set(d.deviceId,{...d})}async get(d){let c=this.retired.get(d);return c?{...c}:void 0}async clear(d){this.retired.delete(d)}}class Uq{store;memory;timer;constructor(d){this.store=d.store,this.memory=d.memory??new LS,this.timer=d.timer??i}async retire(d){await this.store.retire(d,this.timer.now()),await this.memory.retire(d)}async get(d){return await this.memory.get(d)??await this.store.get(d)}async clear(d){await this.store.clear(d),await this.memory.clear(d)}}var bs=I(Y.NODE_ENV)==="test"?new LS:void 0;function nQ(d){return bs??=d()}function f0(){if(!bs)throw new t("Provisioned device transport fence is not installed. Initialize the default fence during startup before using device sessions or provisioning.");return bs}async function Eu(d,c={}){let w=f0(),b=await w.get(d);if(!b)return;let D=await c.currentIdentity?.();if(D&&D!==b.stableId){await w.clear(d);return}throw new nn(d,`Provisioned Android device '${b.stableId}' was removed after ${b.reason}; transport '${d}' is retired and cannot identify a later emulator.`)}function bo(d,c){if(d==="android")return"android";if(d==="visionos")return"visionos-simulator";if(d==="tvos")return"tvos-simulator";if(d==="watchos")return"watchos-simulator";return c!==void 0&&Rn(c)?"ios-physical":"ios-simulator"}function BS(d){switch(d){case"android":return["android"];case"ios":return["ios-simulator","ios-physical"];case"watchos":return["watchos-simulator"];case"tvos":return["tvos-simulator"];case"visionos":return["visionos-simulator"]}}function zw(d){switch(d){case"android":return"android";case"visionos-simulator":return"visionos";case"tvos-simulator":return"tvos";case"watchos-simulator":return"watchos";case"ios-simulator":case"ios-physical":return"ios"}}function hi(d,c,w){let b=d.succeededSources;if(b)return b.has(bo(c,w));return d.succeededPlatforms.has(c)}function tu(d,c){let w=new Set(d.expectedSources);for(let b of c??[])w.add(bo(b.platform,b.id));return{...d,expectedSources:w}}function h0(d,c){let w=zw(c);if(d.succeededSources?d.succeededSources.has(c):d.succeededPlatforms.has(w))return"complete";return(d.sourceErrors?.[c]??d.discoveryErrors?.[w])?.code==="unavailable"&&!d.expectedSources?.has(c)?"not_applicable":"incomplete"}function xu(d,c,w){return c.flatMap((b)=>BS(b)).filter((b)=>h0(d,b)===w)}function Gu(d,c){return xu(d,c,"incomplete")}function Hq(d,c){return xu(d,c,"not_applicable")}function g0(d,c,w){return h0(d,bo(c,w))==="incomplete"}function zt(d){if(d.platform==="ios"||d.platform==="watchos")return{platform:d.platform,stableId:d.deviceId};return ce(d.deviceId)&&!En(d)?{platform:"android",stableId:d.name}:yb("android",{deviceId:d.deviceId})}function y0(d,c){if(!d.scannedSources)return d.scanned[c.platform];return d.scannedSources[bo(c.platform,c.deviceId)]===!0}async function Tu(d,c,w,b={}){let D=await Yw(d,b.signal),C=c??(w?.platform==="watchos"?w.deviceId:void 0),k=C?D.find((O)=>O.deviceId===C):Qw(D);if(!k)throw new t(Zw(C,D));if(b.intent==="read")await b.beforeReadReadiness?.(k);return k}async function Yw(d,c){c?.throwIfAborted();let w=await d.getBootedDevicesDetailed("watchos",{signal:c});if(c?.throwIfAborted(),!w.succeededPlatforms.has("watchos")){let b=w.discoveryErrors?.watchos?.message??"unknown error";throw new t(`watchOS simulator discovery failed: ${b}. Retry the call.`)}return w.devices.filter((b)=>b.platform==="watchos")}function Qw(d){return d.length===1?d[0]:void 0}function Zw(d,c){if(d)return`No booted Apple Watch simulator matches '${d}'. Boot it with startDevice { platform: "watchos", deviceId } first.`;if(c.length===0)return'No Apple Watch simulator is booted. Boot one with startDevice { platform: "watchos" } first.';return`${c.length} Apple Watch simulators are booted (${c.map((w)=>w.deviceId).join(", ")}). Pass deviceId or the watch's sessionUuid.`}var eb={watchos:Tu,tvos:Du,visionos:Ru};function Bu(d){let c=new Set(d.map((b)=>b.platform));return`${c.size>1?"Both Android and iOS devices are connected.":`Multiple ${c.has("android")?"Android":"iOS"} devices are connected.`} For a device tool call, pass sessionUuid (from getAndroid/getApple), platform, or a bound device label on this call to select the target. Alternatively, call setActiveDevice to select an active device.`}class Ss{dependencies;constructor(d){this.dependencies=d}async detectConnectedPlatformsWithStatus(d,c){let w=[],b={android:!1,"ios-simulator":!1,"ios-physical":!1,"watchos-simulator":!1,"tvos-simulator":!1,"visionos-simulator":!1},D=J();try{D.startOperation("androidDeviceScan");let M=this.mapAndroidReadinessRows(await this.dependencies.adb.getBootedAndroidDevices({signal:d,throwOnMissingAdb:!0}));D.endOperation("androidDeviceScan"),w.push(...M),b.android=!0}catch(M){if(D.endOperation("androidDeviceScan"),d?.throwIfAborted(),M instanceof mp)e.debug(`Android scan skipped: ${M.message}`);else e.warn(`Failed to detect Android devices: ${M}`)}let[C,k]=await Promise.all([this.scanBootedSimulators(D,d),this.scanPhysicalIosDevices(c?.platform,d)]);d?.throwIfAborted();let O=new Set(C.devices.map((M)=>M.deviceId));return w.push(...C.devices,...k.devices.filter((M)=>!O.has(M.deviceId))),b["ios-simulator"]=C.complete,b["ios-physical"]=k.complete,{devices:w,scanned:{android:b.android,ios:b["ios-simulator"]||b["ios-physical"],watchos:!1,tvos:!1,visionos:!1},scannedSources:b}}async scanBootedSimulators(d,c){if(!this.dependencies.simctl)return{devices:[],complete:!1};d.startOperation("iosSimulatorScan");try{return{devices:await this.dependencies.simctl.getBootedSimulatorsChecked(void 0,c),complete:!0}}catch(w){return c?.throwIfAborted(),e.warn(`Failed to detect iOS simulators: ${w}`),{devices:[],complete:!1}}finally{d.endOperation("iosSimulatorScan")}}async scanPhysicalIosDevices(d,c){let w=this.dependencies.provider.getIosPhysicalDeviceLister?.();if(!w||d==="android")return{devices:[],complete:!1};try{let b=await l(()=>w.listConnectedDevices(),{timer:this.dependencies.runnerReadinessTimer,timeoutMs:this.dependencies.physicalIosScanBudgetMs,signal:c,label:"Physical iOS device scan"});return{devices:b.devices,complete:b.complete}}catch(b){return c?.throwIfAborted(),e.warn(`Failed to detect physical iOS devices: ${r(b)}`),{devices:[],complete:!1}}}async ensureDeviceReadyInCall(d,c,w){e.info(`[DeviceReadiness] ensureDeviceReady called with platform=${d}, providedDeviceId=${c}`);let b=eb[d];if(b){let ie=this.dependencies.selection.getPin(w?.connectionId);return b(this.dependencies.deviceUtils,c,ie,w)}c=await this.resolveProvidedReadinessId(c);let D=await this.getReadinessScan(d,w),C=this.normalizeReadinessScan(D),k=C.devices;this.reconcileReadinessPin(C,w),e.info(`Found ${k.length} connectedPlatform devices`);let O=k.filter((ie)=>ie.platform==="android");e.info(`Found ${O.length} android devices`);let M=k.filter((ie)=>ie.platform==="ios");e.info(`Found ${M.length} ios devices`);let F=await this.resolveReadinessReadTarget(d,c,C,w);if(F.bootedDevice)return await this.finishReadinessSelection(F.bootedDevice,F.bootedDevice.platform,"provided",{scan:C,...w});c=F.providedDeviceId;let{platformDevices:q,resolvedPlatform:V}=this.resolveReadinessPlatform(d,O,M,{providedDeviceId:c,...w}),U,W=!1,G="auto";if(c){let ie=this.requireProvidedReadinessDevice(d,q,c);U=await this.resolveAndroidReadinessIdentity(ie,w?.signal),G="provided"}let Z=this.findPinnedReadinessDevice(q,w);if(this.shouldResolveReadinessPin(U,c,Z))U=await this.resolveAndroidReadinessIdentity(Z,w?.signal),G="provided";if(!U)e.info(`[DeviceReadiness] Finding or starting device for platform ${V}`),U=await this.findOrStartReadinessDevice(V,C,w),W=!0,G="auto";if(!W){if(!U)throw new t("No device was selected for readiness verification");let ie=U;await this.dependencies.withLifecycleStart(zt(ie),w,async(fe)=>await this.dependencies.verifyDevice(ie.deviceId,V,{...w,signal:fe},ie))}return await this.finishReadinessSelection(U,V,G,{scan:C,...w})}async finishReadinessSelection(d,c,w,{scan:b,...D}){if(d.platform!==c)e.warn(`[DeviceReadiness] Platform mismatch: selected device ${d.deviceId} has platform '${d.platform}' but resolved platform is '${c}'. Discarding and finding correct platform device.`),d=await this.findOrStartReadinessDevice(c,b,D);if(D?.signal?.throwIfAborted(),D?.intent!=="read")await this.assertAndroidSelectionAvailable(d,D?.signal),await this.dependencies.applyAppearanceOnConnect(d,D?.sessionId),D?.signal?.throwIfAborted(),await Au(d,this.dependencies.adbFactory);return e.info(`[DeviceReadiness] Using ${w} device: ${d.deviceId}`),d}async assertAndroidSelectionAvailable(d,c){if(d.platform!=="android"||this.dependencies.checkedAndroidOwnership.getStore()?.has(d.deviceId))return;await this.dependencies.provider.getAndroidCtrlProxyManager(d).assertNotDrivenByOtherDaemon?.(c),c?.throwIfAborted()}shouldResolveReadinessPin(d,c,w){return!d&&!c&&!!w}requireProvidedReadinessDevice(d,c,w){let b=c.find((D)=>D.deviceId===w);if(!b)throw p0(w,d,c);return b}assertReadinessDiscoveryComplete(d,c){let w=d==="either"?["android","ios"]:[d];for(let b of w)if(!c.scanned[b])throw new ze(b,void 0)}async resolveReadinessReadTarget(d,c,w,b){if(b?.intent!=="read")return{providedDeviceId:c};if(!c)return this.requireRunningReadinessDevice(d,w),{providedDeviceId:c};let D=xA(w.devices,c,d);if(D)return{providedDeviceId:D.deviceId};return{providedDeviceId:c,bootedDevice:await this.bootProvidedReadinessImage(d,c,w,b)}}requireRunningReadinessDevice(d,c){let w=c.devices.filter((C)=>d==="either"||C.platform===d);if(d==="ios")w.sort((C,k)=>C.deviceId.localeCompare(k.deviceId));let b=w[0];if(b)return b;if(d!=="either"||!Object.values(c.scanned).some(Boolean))this.assertReadinessDiscoveryComplete(d,c);throw new t(`No ${d==="either"?"Android or iOS":d==="android"?"Android":"iOS"} device is running, so there is nothing to read. Start one with startDevice or provisionDevice, or pass a deviceId.`)}async findOrStartReadinessDevice(d,c,w){let b=c.devices.filter((C)=>C.platform===d);if(b.length>1)throw new cm(Bu(b),b);if(w?.intent!=="read")return await this.dependencies.findOrStartDevice(d,w);let D=await this.resolveAndroidReadinessIdentity(this.requireRunningReadinessDevice(d,c),w.signal);return await this.dependencies.withLifecycleStart(zt(D),w,async(C)=>{this.dependencies.resumeAfterDeviceStart(d,D.deviceId),await this.dependencies.verifyDevice(D.deviceId,d,{...w,signal:C},D)}),D}async listProvidedReadinessImages(d,c){if(d==="ios"&&!this.dependencies.simctl)throw new ze("ios",{code:"unavailable",message:"iOS simulator tools not available",retryable:!0});let w=new AbortController,b=c.signal?AbortSignal.any([c.signal,w.signal]):w.signal,D=new ze(d,{code:"timeout",message:"Named device image discovery timed out",retryable:!0});try{return await l(()=>d==="android"?this.dependencies.deviceUtils.listDeviceImages("android",b):this.dependencies.simctl.listSimulatorImages(void 0,{bypassCache:!0,signal:b}),{timer:this.dependencies.runnerReadinessTimer,timeoutMs:Ve,signal:c.signal,label:"Named device image discovery",timeoutError:()=>D,onTimeout:()=>w.abort(D)})}catch(C){if(c.signal?.throwIfAborted(),C instanceof t)throw C;throw new ze(d,{code:"failed",message:r(C),retryable:!0})}}async findProvidedReadinessImage(d,c,w,b){if(d=e_(c,d),d!=="either")this.assertReadinessDiscoveryComplete(d,w);let D=d==="either"?["android","ios"]:[d],C=await Promise.allSettled(D.map((F)=>this.listProvidedReadinessImages(F,b)));b.signal?.throwIfAborted();let O=C.flatMap((F)=>F.status==="fulfilled"?F.value:[]).filter((F)=>F.platform==="android"?F.name===c:F.deviceId===c),M=O.length===1?O[0]:void 0;this.assertReadinessDiscoveryComplete(M?.platform??d,w);for(let[F,q]of C.entries())if(q.status==="rejected"&&w.scanned[D[F]])throw q.reason;return M}async bootProvidedReadinessImage(d,c,w,b){let D=await this.dependencies.findProvidedReadinessImage(d,c,w,b);if(D?.platform==="android"&&D.isRunning===!0)throw new en(void 0,`Android AVD '${D.name}' is running but its serial could not be resolved yet.`);if(!D||D.isRunning!==!1||D.platform==="ios"&&D.isAvailable===!1)return this.requireProvidedReadinessDevice(d,w.devices.filter((C)=>d==="either"||C.platform===d),c);if(D.platform==="android"){if(D.isRunningStateKnown===!1)throw new en(void 0,`Cannot safely cold-boot Android AVD '${D.name}': its running state is unknown.`);return await b.beforeReadBoot?.(D),await this.dependencies.bootAndroidReadinessImage(D,b)}throw new t(Jt(D.name,D.deviceId))}findPinnedReadinessDevice(d,c){let w=this.dependencies.selection.getPin(c?.connectionId);return d.find((b)=>b.deviceId===w?.deviceId)}async recheckReadBootImage(d,c){if(c?.intent!=="read")return;let w=await this.recheckAndroidReadBootImage(d,c);if(w)await c.beforeReadReadiness?.(w),c.signal?.throwIfAborted(),this.dependencies.resumeReadBootClient(d.platform,w.deviceId),await this.dependencies.verifyDevice(w.deviceId,d.platform,c,w);return w}async recheckAndroidReadBootImage(d,c){let w=await this.listBootedAndroidDevicesForSelection({bypassAndroidDeviceListCache:!0,signal:c.signal});c.signal?.throwIfAborted();let D=(await this.listProvidedReadinessImages("android",c)).filter((O)=>O.name===d.name),C=D.length===1?D[0]:void 0;if(!C)throw p0(d.name,"android",[]);let k=xA(w.filter((O)=>ce(O.deviceId)&&O.name===d.name),d.name,"android");if(k)return k;if(C.isRunning===!0)throw new en(void 0,`Android AVD '${d.name}' is running but its serial could not be resolved yet.`);if(gb(C),C.isRunning!==!1)throw new en(void 0,`Cannot safely cold-boot Android AVD '${d.name}': its running state is unknown.`);return}async listBootedAndroidDevicesForSelection(d){let c=await this.dependencies.deviceUtils.getBootedDevicesDetailed("android",d);if(d?.signal?.throwIfAborted(),!c.succeededPlatforms.has("android"))throw new en(c.discoveryErrors?.android);return c.devices}getReadinessScan(d,c){return c?.getConnectedPlatforms?c.getConnectedPlatforms():this.dependencies.detectConnectedPlatformsWithStatus(c?.signal,{platform:d})}reconcileReadinessPin(d,c){let w=this.dependencies.selection.getPin(c?.connectionId);if(w&&y0(d,w)&&!d.devices.some((b)=>b.deviceId===w.deviceId&&b.platform===w.platform))this.dependencies.clearExplicitDevicePin(w.deviceId)}resolveReadinessPlatform(d,c,w,{providedDeviceId:b,...D}={}){let C=[],k;switch(d){case"android":C=c,k="android";break;case"ios":C=w,k="ios";break;default:if(c.length>0&&w.length>0)return this.resolveMixedReadinessPlatform(c,w,b,D);if(c.length>0)C=c,k="android";else if(w.length>0)C=w,k="ios";else C=[],k="android"}return{platformDevices:C,resolvedPlatform:k}}resolveMixedReadinessPlatform(d,c,w,b){if(w){let O=[...d,...c].find((M)=>M.deviceId===w);if(O)return{platformDevices:O.platform==="android"?d:c,resolvedPlatform:O.platform}}let D=this.dependencies.selection.getPin(b?.connectionId),C=D&&cr(D.platform)?D.platform:void 0;if(C)return{platformDevices:C==="android"?d:c,resolvedPlatform:C};throw new cm(Bu([...d,...c]),[...d,...c])}async findLiveAndroidDevice(d){return(await this.dependencies.deviceUtils.getBootedDevices("android")).find((c)=>c.deviceId===d)}async resolveCurrentAndroidIdentity(d){try{let c=await this.findLiveAndroidDevice(d);return c&&!En(c)?c.name:void 0}catch(c){e.warn(`[DeviceReadiness] Could not resolve the live identity of ${d} for the retired-transport check: ${r(c)}`,c);return}}async resolveAndroidReadinessIdentity(d,c){if(!En(d))return d;c?.throwIfAborted();let w;try{w=await this.findLiveAndroidDevice(d.deviceId)}catch(b){return c?.throwIfAborted(),e.warn(`[DeviceReadiness] Could not resolve the AVD identity for ${d.deviceId}; keeping the raw serial identity: ${r(b)}`,b),d}return w&&!En(w)?w:d}async resolveProvidedReadinessId(d){if(!d)return;return await Eu(d,{currentIdentity:()=>this.resolveCurrentAndroidIdentity(d)}),this.canonicalAndroidId(d)}canonicalAndroidId(d){return this.dependencies.admissionGate.resolveAndroidCanonicalId?.(d)??d}mapAndroidReadinessRows(d){return this.dependencies.admissionGate.mapAndroidReadinessDiscovery?.(d)??d}normalizeReadinessScan(d){return Array.isArray(d)?{devices:d,scanned:{android:!0,ios:!0,watchos:!1,tvos:!1,visionos:!1}}:d}}function _s(d){if(d.present&&!d.usable)throw new t(`AUTOMOBILE_CTRL_PROXY_IOS_BUNDLE_PATH / _IPA_PATH is set but unusable: ${d.reason}`)}function tb(d,c){return c?.deviceId===d.deviceId?{...d,name:c.name,...c.observedAt===void 0?{}:{observedAt:c.observedAt}}:d}function ib(d,c){if(!c||!c.appId||!c.activityName){if(e.warn(`[DeviceReadiness] Android device ${d} is not fully ready`),c)e.warn(`[DeviceReadiness] activeWindow.appId: ${c.appId} | activeWindow.activityName: ${c.activityName}`);else e.warn(`[DeviceReadiness] activeWindow: ${c}`);throw new t(`Cannot get active window information from Android device ${d}. The device may not be fully booted or is in an unusual state.`)}}function ku(d,c){if(!c)throw new t(`iOS simulator ${d} is not available. Please check if it exists and is available.`);if(!c.isAvailable)throw new t(`iOS simulator ${d} is not available (state: ${c.state}). Please check simulator availability.`)}async function rb(d,c){try{return!await d.create(c).isScreenOn()}catch(w){return e.warn(`[DeviceReadiness] Could not read screen state of ${c.deviceId}`,w),!1}}async function Ou(d,c,w,b){let{deviceId:D}=c;try{e.info(`[DeviceReadiness] Verifying Android device ${D} readiness`);let C=d.getWindow(tb(c,w));ib(D,await C.getActive(!0))}catch(C){if(!(b?.readiness==="booted"&&await rb(d.adbFactory,c)))throw new t(`Failed to verify Android device ${D} readiness: ${r(C)}`);e.info(`[DeviceReadiness] Android device ${D} is asleep; booted readiness holds`)}}class Hc{selection=new Oo;admissionGate;executionBinding;readinessSelection;provider;adbFactory;runnerReadinessService;runnerReadinessTimer;bindingExclusion;physicalIosScanBudgetMs;runnerReadinessTimeoutMs;runnerProvisionTimeoutMs;lifecycleCoordinator;_adb;idGenerator;iosBootInstrumentationInstance;appearanceOnConnectDependencies;static pushUpdateListenersRegistered=new WeakSet;constructor(d,c=v,w={}){this.admissionGate=w.admissionGate??Ns,this.executionBinding=w.executionBinding??Ww,this.provider=d,this.androidCtrlProxyReadiness=new ps({provider:d,checkedAndroidOwnership:this.checkedAndroidOwnership,errors:{DeviceOwnedByOtherDaemonError:Gt,CtrlProxyForwardOwnershipUnreadableError:vp},storeSetupTiming:m0}),this.adbFactory=c,this.runnerReadinessTimer=w.runnerReadinessTimer??i,this.bindingExclusion=w.bindingExclusion??wA(this.runnerReadinessTimer),this.physicalIosScanBudgetMs=w.physicalIosScanBudgetMs??l$,this.idGenerator=w.idGenerator??B,this.iosBootInstrumentationInstance=w.iosBootInstrumentation,this.appearanceOnConnectDependencies=w.appearanceOnConnectDependencies,this.runnerReadinessTimeoutMs=w.runnerReadinessTimeoutMs,this.runnerProvisionTimeoutMs=w.runnerProvisionTimeoutMs,this.lifecycleCoordinator=w.lifecycleCoordinator??ga(),this.runnerReadinessService=new wL({timer:this.runnerReadinessTimer,getAndroidManager:(D)=>this.provider.getAndroidCtrlProxyManager(D),getAndroidClient:(D)=>this.provider.getAndroidCtrlProxyClient(D),getIosManager:(D)=>this.provider.getIOSCtrlProxyManager(D),getIosClient:(D,C)=>this.provider.getIOSCtrlProxyClient(D,C),checkIosOverride:pb,awaitIosStartupMaintenance:()=>ye.awaitStartupOrphanRunnerReap()});let b=this;this.readinessSelection=new Ss({detectConnectedPlatformsWithStatus:(...D)=>this.detectConnectedPlatformsWithStatus(...D),findProvidedReadinessImage:(...D)=>this.findProvidedReadinessImage(...D),get adb(){return b.adb},get simctl(){return b.simctl},provider:this.provider,runnerReadinessTimer:this.runnerReadinessTimer,physicalIosScanBudgetMs:this.physicalIosScanBudgetMs,selection:this.selection,withLifecycleStart:(...D)=>this.withLifecycleStart(...D),verifyDevice:(...D)=>this.verifyDevice(...D),applyAppearanceOnConnect:(D,C)=>gu(D,this.appearanceOnConnectDependencies,t_(C)),resumeAfterDeviceStart:(D,C)=>NS.resumeAfterDeviceStart(D,C),resumeReadBootClient:(D,C)=>{if(!cr(D))return;({android:E,ios:x})[D].resumeAfterDeviceStart(C)},adbFactory:this.adbFactory,checkedAndroidOwnership:this.checkedAndroidOwnership,findOrStartDevice:(...D)=>this.findOrStartDevice(...D),get deviceUtils(){return b.deviceUtils},bootAndroidReadinessImage:(...D)=>this.bootAndroidReadinessImage(...D),clearExplicitDevicePin:(...D)=>this.clearExplicitDevicePin(...D),admissionGate:this.admissionGate})}get adb(){if(!this._adb)this._adb=this.provider.getAdb();return this._adb}get simctl(){return this.provider.getSimctl()}get iosBootInstrumentation(){if(!this.iosBootInstrumentationInstance){let d=ih();this.iosBootInstrumentationInstance=GI({timer:i,history:d.iosBootHistory,gate:d.ios})}return this.iosBootInstrumentationInstance}async bootIosSimulatorAdmitted(d,c,w,{signal:b,reason:D="restart"}){return await this.iosBootInstrumentation.run({udid:w,reason:D,runtime:c.runtimeId,timeoutMs:Ve,signal:b},async()=>await H(b,async()=>await d.bootSimulator(w)))}get androidEmulator(){return this.provider.getAndroidEmulator()}get deviceUtils(){return this.provider.getDeviceUtils()}static createInstance(d=gs(),c,w){return new Hc(d,c,w)}getPlatformDeviceManager(){return this.deviceUtils}getExplicitDevicePin(d){return this.selection.getPin(d)}setExplicitDevicePin(d,c){this.selection.setPin(d,c)}clearConnectionDevicePin(d){this.selection.clearConnection(d)}clearExplicitDevicePin(d){this.selection.clearPinFor(d)}async detectConnectedPlatforms(d){return(await this.detectConnectedPlatformsWithStatus(d)).devices}detectConnectedPlatformsWithStatus(d,c){return this.readinessSelection.detectConnectedPlatformsWithStatus(d,c)}listBootedAndroidDevices(d){return this.readinessSelection.listBootedAndroidDevicesForSelection({...d,bypassAndroidDeviceListCache:!0})}verifyAndroidCtrlProxyServiceReady(d,c){let w=()=>this.provider.getAndroidCtrlProxyClient(d).verifyServiceReady(c?.noRetry?1:2,200,c?.timeoutMs??2000);return c?.signal?H(c.signal,w):w()}async readAndroidCtrlProxySnapshotIdentity(d,c){c.throwIfAborted();let w=this.provider.getAndroidCtrlProxyManager(d);if(!w.readSnapshotIdentity)throw new t("Android snapshot CtrlProxy identity provider is unavailable");return w.readSnapshotIdentity(c)}checkedAndroidOwnership=new nb;androidCtrlProxyReadiness;async ensureDeviceReady(d,c,w){return this.checkedAndroidOwnership.run(new Set,()=>this.readinessSelection.ensureDeviceReadyInCall(d,c,w))}assertCreatedIosReservation(d,c){if(!d||!c.deviceId)throw new t(`Created iOS simulator '${c.name}' has no lifecycle reservation.`)}findProvidedReadinessImage(d,c,w,b){return this.readinessSelection.findProvidedReadinessImage(d,c,w,b)}async verifyDevice(d,c,w,b){switch(te(c,"Device readiness verification")){case"android":await this.verifyAndroidDevice(d,w,b);return;case"ios":await this.verifyIosDevice(d,w)}}async verifyAndroidDevice(d,c,w){c?.signal?.throwIfAborted(),d=this.readinessSelection.canonicalAndroidId(d),this.admissionGate.assertDeviceActionable(d,"to verify Android device readiness"),this.executionBinding.bindDeviceExecution(d);let b=this.readinessSelection.mapAndroidReadinessRows(await this.adb.getBootedAndroidDevices()),D=b.find((C)=>C.deviceId===d);if(!D)throw new t(`Android device ${d} is not connected. Available devices: ${os(b)}`);if(await Ou({getWindow:(C)=>this.provider.getWindow(C),adbFactory:this.adbFactory},D,w,c),c?.signal?.throwIfAborted(),c?.readiness==="booted")return;await $g(lo("android",d),()=>this.androidCtrlProxyReadiness.ensureReady(d,D,c),{signal:c?.signal})}async verifyIosDevice(d,c){if(c?.signal?.throwIfAborted(),Rn(d))return await this.verifyPhysicalIosDevice(d,c?.readiness??"automationReady",c);return await this.verifySimulatorIosDevice(d,c)}async verifySimulatorIosDevice(d,c){let w=c?.readiness??"automationReady";if(w==="automationReady"){let C=await pb();_s(C)}if(!this.simctl)throw new t("iOS simulator tools not available");let b=await this.simctl.getDeviceInfo(d);if(c?.signal?.throwIfAborted(),ku(d,b),b.state!=="Booted"){if(c?.intent==="read")throw new t(Jt(b.name,d,b.state));e.info(`iOS simulator ${d} is not booted (state: ${b.state})`);return}if(w==="booted")return;let D={deviceId:d,name:b.name,platform:"ios"};await this.ensureIosRunnerReady(d,D,c)}async verifyPhysicalIosDevice(d,c,w){let b=await this.findConnectedPhysicalIosDevice(d,w?.signal);if(c==="automationReady"&&!w?.sessionId)throw new t(`Physical iPhone ${d} is connected but has no prepared CtrlProxy runner. Acquire the iPhone with getApple first; signed-runner setup cannot run on a sessionless call.`);if(c==="booted")return;_s(await pb()),await this.ensureIosRunnerReady(d,b,w)}async findConnectedPhysicalIosDevice(d,c){let w=await this.provider.getIosPhysicalDeviceLister?.()?.listConnectedDevices();c?.throwIfAborted();let b=w?.devices.find((C)=>C.deviceId===d);if(b)return b;let D=w&&!w.complete?` (devicectl: ${w.error.message})`:"";throw new t(`Physical iPhone ${d} is not connected or not reachable through devicectl${D}. Connect, unlock, and trust the device, then acquire it with getApple.`)}async ensureIosRunnerReady(d,c,w){let b=Ba(!0);b.serial("ensureCtrlProxy iOS");let D=!1,C=this.runnerReadinessTimeoutMs??N.getRunnerReadinessTimeoutMs(),k=this.runnerProvisionTimeoutMs??Ua;try{let O=this.runnerReadinessTimer.now()+Math.max(k,C);await this.runnerReadinessService.ensureReady({device:c,requestedIdentity:`platform=ios deviceId=${d}`,operationName:"legacy iOS session auto-start",totalDeadlineMs:O,readinessTimeoutMs:C,skipCtrlProxyDownload:this.androidCtrlProxyReadiness.skipCtrlProxyDownload(w),perf:b,signal:w?.signal,onRunnerSetup:()=>{D=!0}}),this.registerPushUpdateListener(c)}finally{if(b.end(),D){let O=b.getTimings();if(O)m0(d,O,w?.sessionId)}}}async findOrStartDevice(d,c){if(d==="android")return await this.findOrStartAndroidDevice(c);else return await this.findOrStartIosDevice(c)}async findOrStartAndroidDevice(d){let c=J();c.startOperation("listBootedDevices");let w=await this.readinessSelection.listBootedAndroidDevicesForSelection();if(c.endOperation("listBootedDevices"),w.length>0){let C=w[0],k=C.deviceId;return await this.withLifecycleStart(zt(C),d,async(O)=>(E.resumeAfterDeviceStart(k),c.startOperation("verifyDevice"),await this.verifyAndroidDevice(k,{...d,signal:O},C),c.endOperation("verifyDevice"),C))}c.startOperation("listImages");let b=await this.deviceUtils.listDeviceImages("android");if(c.endOperation("listImages"),b.length===0)throw new t("No devices are connected and no device images are available. Please connect a physical device or create a device image first.");let D=await ms(b,this.bindingExclusion);return await this.bootAndroidReadinessImage(D,d,c)}async bootAndroidReadinessImage(d,c,w=J()){return gb(d),e.info(`Starting Android emulator ${d}...`),await this.withLifecycleStart({platform:"android",stableId:d.name},c,async(b,D)=>{if(c?.beforeReadBoot)await c.beforeReadBoot(d),b.throwIfAborted();let C=await this.readinessSelection.recheckReadBootImage(d,{...c,signal:b});if(C)return C;Cu(d,c,D.lease),w.startOperation("startDevice");let k=await H(b,async()=>await this.startDeviceOwningCancelledLaunch(d,D)),O=k?ld(k):void 0;w.endOperation("startDevice"),w.startOperation("waitForReady");let M=await Ng(this.deviceUtils,d,k,{signal:b,timer:this.runnerReadinessTimer,cancelOwnedBoot:O?async()=>await zn(O.process,O.exitPromise,{signal:"SIGTERM",timer:this.runnerReadinessTimer}):void 0});if(w.endOperation("waitForReady"),!M)throw new t(`Failed to start Android emulator ${d}.`);if(c?.intent==="read")await c.beforeReadReadiness?.(M),b.throwIfAborted();return E.resumeAfterDeviceStart(M.deviceId),w.startOperation("verifyDevice"),await this.verifyAndroidDevice(M.deviceId,{...c,signal:b},M),w.endOperation("verifyDevice"),M})}async bindCreatedIosReadinessIdentity(d,c){if(!d||!c.deviceId)throw new t(`Created iOS simulator '${c.name}' has no lifecycle identity.`);let w=c.deviceId;await d.bindCanonicalIdentity({platform:"ios",stableId:w},async()=>this.revalidateCreatedIosDevice(w))}async rollBackCreatedIosOnFailure(d,c){try{return await c()}catch(w){let b=d();if(b)await this.rollBackCreatedIosSimulator(b,w);throw w}}async rollBackCreatedIosSimulator(d,c){return Su({simctl:()=>this.simctl,provider:this.provider,runnerReadinessTimer:this.runnerReadinessTimer},d,c)}async findOrStartIosDevice(d){if(!this.simctl)throw new t("iOS simulator tools not available");let c=J();c.startOperation("listSimulators");let w=await this.simctl.listSimulatorImages();c.endOperation("listSimulators");let b=w.filter((O)=>O.isAvailable===!1),D=w.filter((O)=>O.isAvailable!==!1).sort((O,M)=>(O.deviceId||"").localeCompare(M.deviceId||""));if(D.length===0){let O=kA();if(O.isCreationAllowed()){e.info(`[DeviceReadiness] No available iOS simulators found; creating one (gate: ${O.describeSource()})`);let M=this.runnerReadinessTimer.now()+300000,F,q;try{let V=EA(()=>this.simctl,{reserveBeforeCreate:async(G)=>(F=await this.lifecycleCoordinator.reserve({kind:"selector",platform:"ios",selector:G.name},{operation:"start",deadlineMs:M,signal:d?.signal}),F.signal),bindAfterCreate:async(G)=>{q=G,await this.bindCreatedIosReadinessIdentity(F,G)}},jy(()=>this.simctl)),{provisioned:U,lease:W}=await this.rollBackCreatedIosOnFailure(()=>q,async()=>{let G=await V.provision({platform:"ios"},d?.signal);return this.assertCreatedIosReservation(F,G),{provisioned:G,lease:F}});return await vs(W,d,async(G)=>{c.startOperation("bootSimulator");let Z=await this.bootIosSimulatorAdmitted(this.simctl,U,U.deviceId,{signal:G,reason:"create"});if(c.endOperation("bootSimulator"),Z.deviceId===U.deviceId)await this.simctl.presentSimulatorAfterStart(U.deviceId,this.idGenerator.next(),G);return x.resumeAfterDeviceStart(U.deviceId),c.startOperation("verifyDevice"),await this.verifyIosDevice(U.deviceId,{...d,signal:G}),c.endOperation("verifyDevice"),Z}).catch(async(G)=>{throw await this.rollBackCreatedIosSimulator(U,G),u(G,`Failed to boot/verify created iOS simulator '${U.name}' (${U.deviceId})`)})}finally{F?.release()}}if(b.length>0){let M=b.map((F)=>`${F.name} (${F.deviceId??"unknown ID"}): ${F.availabilityError??"unavailable"}`).join("; ");throw new t(`No available iOS simulators. Unavailable simulators: ${M}.`)}throw new t("No iOS simulators are available. Please create an iOS simulator using Xcode or the Simulator app.")}c.startOperation("checkBooted");let C=await this.listBootedSimulatorsForSelection();if(c.endOperation("checkBooted"),C.sort((O,M)=>O.deviceId.localeCompare(M.deviceId)),C.length>0){let O=C[0];return e.info(`[DeviceReadiness] Selected booted iOS simulator ${O.name} (${O.deviceId})`),await this.withLifecycleStart({platform:"ios",stableId:O.deviceId},d,async(M)=>(x.resumeAfterDeviceStart(O.deviceId),c.startOperation("verifyDevice"),await this.verifyIosDevice(O.deviceId,{...d,signal:M}),c.endOperation("verifyDevice"),O))}let k=await ms(D,this.bindingExclusion);return await this.bootIosReadinessImage(k,d,c)}async bootIosReadinessImage(d,c,w=J()){let b=d.deviceId;if(c?.intent==="read")throw new t(Jt(d.name,b));return e.info(`[DeviceReadiness] Booting iOS simulator ${d.name} (${b})...`),await this.withLifecycleStart({platform:"ios",stableId:b},c,async(D)=>{w.startOperation("bootSimulator");let C=await this.bootIosSimulatorAdmitted(this.simctl,d,b,{signal:D});if(w.endOperation("bootSimulator"),C.deviceId===b)await this.simctl.presentSimulatorAfterStart(b,this.idGenerator.next(),D);return x.resumeAfterDeviceStart(b),w.startOperation("verifyDevice"),await this.verifyIosDevice(b,{...c,signal:D}),w.endOperation("verifyDevice"),C})}async listBootedSimulatorsForSelection(){try{return await this.simctl.getBootedSimulatorsChecked()}catch(d){throw new ze("ios",{code:"failed",message:r(d),retryable:!0})}}async revalidateCreatedIosDevice(d){if(!(await this.simctl.listSimulatorImages()).find((b)=>b.deviceId===d))throw new t(`Created iOS simulator '${d}' disappeared during lifecycle wait`);return{platform:"ios",stableId:d}}async withLifecycleStart(d,c,w){let b=await this.lifecycleCoordinator.reserve("kind"in d?d:{kind:"stable",...d},{operation:"start",deadlineMs:this.runnerReadinessTimer.now()+300000,signal:c?.signal}),D=[];try{return await vs(b,c,(C)=>w(C,{lease:b,holdLeaseUntil:(k)=>{D.push(k)}}))}finally{if(D.length===0)b.release();else Promise.allSettled(D).then(()=>b.release())}}async startDeviceOwningCancelledLaunch(d,c){return Pu({deviceUtils:()=>this.deviceUtils,runnerReadinessTimer:this.runnerReadinessTimer},d,c)}registerPushUpdateListener(d){let c=d.deviceId;try{let w=this.provider.getIOSCtrlProxyManager(d),b=this.provider.getIOSCtrlProxyClient(d,w.getServicePort());if(Hc.pushUpdateListenersRegistered.has(b))return;let D=this.provider.getObserveScreenCache();b.onPushUpdate(()=>{e.info(`[DeviceReadiness] Received iOS UI change notification for ${c}, clearing ObserveScreen cache`),D.clearForDevice(c)}),Hc.pushUpdateListenersRegistered.add(b),e.info(`[DeviceReadiness] Registered push update listener for ${c}`)}catch(w){e.warn(`[DeviceReadiness] Failed to register push update listener for ${c}: ${w}`)}}}var X=(d)=>({budgetMs:d,mayWriteDatabase:!0}),vt=(d)=>({budgetMs:d,mayWriteDatabase:!1}),U4={"provisioning ingress quiesce":X(1050),"provisioning interruption":X(300),"shutdown release snapshot":X(50),"forward lease idle releaser":X(200),"managed execution release":X(200),"active capture and iOS CtrlProxy children":X(500),"health check timer":X(50),"location routes":X(50),"prototype preview server":X(25),"shutdown monitors":X(150),"ADB missing-device subscription":X(25),"session cleanup timer":X(25),"video recording socket server":X(30),"device gesture recording socket server":X(30),"device snapshot socket server":X(30),"appearance socket server":X(30),"performance stream socket server":X(30),"performance push socket server":X(30),"device data stream socket server":X(30),"failures stream socket server":X(30),"failures push socket server":X(30),"telemetry push socket server":X(30),"WebRTC stream socket server":X(200),"video stream socket server":vt(200),"iOS simulator capture helper pool":vt(150),"native helper registry":vt(10),"host adb children":vt(10),"appearance sync scheduler":X(25),"performance monitor":X(25),"active HTTP sessions":X(150),"active HTTP session registry":X(25),"HTTP server":X(100),"active device sessions":X(1500),"Unix socket server":X(1100),"pending device cleanups":X(300),"CtrlProxy forwarding leases":X(400),"device allocation claims":X(100),"managed ADB server":vt(300),"abandoned stage settle":X(50),"database write drain":X(200),"in-flight migrations":X(200),database:X(300),"late abandoned stage settle":X(25),logger:X(100),"daemon files":X(100)},NU=Nu(U4);var Mu={"direct-mode capture and iOS CtrlProxy children":X(2000),"direct-mode managed ADB server":vt(300),"video recording socket server":X(30),"device gesture recording socket server":X(30),"device snapshot socket server":X(30),"appearance socket server":X(30),"WebRTC stream socket server":X(200),"appearance sync scheduler":X(25),"prefetched Android CtrlProxy APK":X(50),"stdio proxy":X(2000),"abandoned stage settle":X(2955),"database write drain":X(200),"in-flight migrations":X(200),database:X(300),"late abandoned stage settle":X(25),logger:X(100)},LU=Nu(Mu);function Nu(d){let c={};for(let w of Object.keys(d))c[w]=d[w].budgetMs;return c}function H4(d,c,w,b){return{name:c,waitingOn:w,...d[c],run:b}}var ob=50;function Xd(d,c){return Math.max(0,Math.min(c,d.remainingMs()-ob))}var sb=100;function q4(d){let c=!1,w=async(C)=>{c=!1;let k=d.keepOpenReason?.();if(k!==void 0){d.warn(`Skipping database close because ${k}`);return}let O=C.unsettledDatabaseWriters();if(O.length>0){c=!0,d.warn(`Skipping database close because abandoned shutdown stage(s) are still running: ${O.join(", ")}`);return}await d.closeDatabase()},b=async(C)=>{if(C.unsettledStages().length===0&&!c)return;let k=c?sb:0;if(await C.waitForUnsettledStages(Math.max(0,Xd(C,Number.POSITIVE_INFINITY)-k)),!c||C.unsettledDatabaseWriters().length>0)return;await d.drainWrites(Xd(C,Number.POSITIVE_INFINITY)),await w(C)},D=async(C)=>{let k=await d.refusedAccessCount?.()??0;if(k===0)return;d.warn(`Refused ${k} database access(es) issued after the shutdown database close; `+(C.length>0?`abandoned shutdown stage(s) running since the close: ${C.join(", ")}`:"no abandoned shutdown stage was running (an in-flight request or a late timer callback)"))};return{settle:async(C)=>{let k=Xd(C,Number.POSITIVE_INFINITY);if(!await C.waitForUnsettledStages(k))d.warn(`Shutdown stage(s) still running ${k}ms after being abandoned: ${C.unsettledStages().join(", ")}`)},close:w,lateSettle:async(C)=>{let k=C.unsettledStages();try{await b(C)}finally{try{await D(k)}catch(O){try{d.warn(`Failed to report database accesses refused after shutdown: ${r(O)}`)}catch(M){Zi("Reporting refused database accesses after shutdown failed",M)}}}}}}var ab={remainingMs:()=>Number.POSITIVE_INFINITY,unsettledStages:()=>[],unsettledDatabaseWriters:()=>[],waitForUnsettledStages:async()=>!0};async function c_(d,c,w){let b=[],D=new Map,C=()=>[...D.values()].map((V)=>V.name),k=!1,O=()=>w?w.timer.monotonicNow?.()??w.timer.now():0,M=O(),F=0,q=(V,U)=>{let W=k?`Shutdown cleanup stage ${V} failed after shutdown finished`:`Shutdown cleanup stage ${V} failed after being abandoned at its deadline`;try{c(W,U)}catch(G){let Z=w?.emergencyLog??Zi;Z(W,U),Z(`Reporting the late failure of shutdown stage ${V} failed`,G)}};for(let V of d){if(!w||V.budgetMs===void 0){try{await V.run(ab)}catch(ae){b.push(ae),c(`Shutdown cleanup stage ${V.name} failed`,ae)}continue}let{timer:U}=w;F+=V.budgetMs;let W=M+F,G=Math.max(0,W-O()),Z=Symbol("shutdown stage deadline"),ie={remainingMs:()=>Math.max(0,W-O()),unsettledStages:C,unsettledDatabaseWriters:()=>[...D.values()].filter((ae)=>ae.mayWriteDatabase).map((ae)=>ae.name),waitForUnsettledStages:async(ae)=>{if(D.size===0)return!0;let He=Symbol("abandoned stage settle timeout");try{await l(Promise.all([...D.values()].map((we)=>we.settled)),{timer:U,timeoutMs:ae,label:"Abandoned shutdown stage settle",timeoutError:()=>He})}catch(we){if(we!==He)throw we}return D.size===0}},fe;try{await l(()=>(fe=(async()=>{await V.run(ie)})(),fe),{timer:U,timeoutMs:G,label:`Shutdown cleanup stage ${V.name}`,timeoutError:()=>Z})}catch(ae){if(ae!==Z){b.push(ae),c(`Shutdown cleanup stage ${V.name} failed`,ae);continue}let He=(fe??Promise.resolve()).then(()=>{D.delete(V)},(we)=>{if(D.delete(V),!k)b.push(we);q(V.name,we)});D.set(V,{name:V.name,settled:He,mayWriteDatabase:V.mayWriteDatabase!==!1}),c(`Shutdown cleanup stage ${V.name} timed out after ${G}ms waiting on ${V.waitingOn??"its cleanup"}; continuing shutdown`,Error(`Shutdown cleanup stage ${V.name} exceeded its ${G}ms deadline`))}}if(k=!0,D.size>0)b.push(Error(`Shutdown cleanup stage(s) still running when shutdown finished: ${C().join(", ")}`));if(b.length>0)throw AggregateError(b,"One or more shutdown cleanup stages failed")}function TQ(d){let c=(k,O,M)=>H4(Mu,k,O,M),w=(k)=>async()=>{await k()},b=(k)=>async(O)=>{if(d.directModeActive())await k(O)},D=q4({closeDatabase:()=>d.closeDatabase(),drainWrites:(k)=>d.drainDatabaseWrites(k),refusedAccessCount:async()=>d.directModeActive()?await d.refusedDatabaseAccessCount?.()??0:0,warn:(k)=>d.warn(k)}),C="its connections closing";return[c("direct-mode capture and iOS CtrlProxy children","recording stop/finalize and iOS CtrlProxy child exit",b(w(d.cleanupChildProcesses))),c("direct-mode managed ADB server","adb kill-server",b(w(d.stopManagedAdbServer))),c("video recording socket server","its connections closing",w(d.stopVideoRecordingSocketServer)),c("device gesture recording socket server","its connections closing",w(d.stopDeviceGestureRecordingSocketServer)),c("device snapshot socket server","its connections closing",w(d.stopDeviceSnapshotSocketServer)),c("appearance socket server","its connections closing",w(d.stopAppearanceSocketServer)),c("WebRTC stream socket server","WebRTC stream teardown (encoder stop, adb forward removal)",w(d.stopWebRtcStreamSocketServer)),c("appearance sync scheduler","an in-flight appearance sync",w(d.stopAppearanceSyncScheduler)),c("prefetched Android CtrlProxy APK","the prefetched APK directory removal",w(d.cleanupPrefetchedApk)),c("stdio proxy","the daemon releasing this proxy's managed execution and ordinary owned sessions",w(d.closeStdioProxy)),c("abandoned stage settle","earlier stages that passed their deadline",(k)=>D.settle(k)),c("database write drain","in-flight best-effort database writes",b((k)=>d.drainDatabaseWrites(Xd(k,Number.POSITIVE_INFINITY)))),c("in-flight migrations","a cold-start migration still running",b((k)=>d.settleMigrations(Xd(k,Number.POSITIVE_INFINITY)))),c("database","the database connection closing",b((k)=>D.close(k))),c("late abandoned stage settle","earlier stages that passed their deadline",(k)=>D.lateSettle(k)),c("logger","the log file flush",w(d.closeLogger))]}
|
|
166
|
-
export{Zr,mi,yA,$I,jN,vA,d4,im,rr,UI,HI,fi,Ql,Ys,KN,l4,f7,u4,h7,mq,GN,Hy,fq,hq,g7,y7,$o,ac,om,gq,is,v7,b7,qy,YN,S7,w7,R7,P7,cc,eh,bA,zd,yq,Uc,jd,qI,Js,p4,m4,Mn,JN,A7,VI,T7,Kd,RS,PS,Un,ka,AS,Gd,Uo,vq,TS,vo,f4,k7,E7,I7,_7,XN,bq,x7,C7,ZN,Vy,h4,g4,Sq,D7,y4,WI,v4,wq,O7,Ku,zI,Rq,b4,M7,Pq,sm,N7,F7,L7,_i,S4,QN,Wy,dc,am,Aq,B7,xi,eu,kS,Tq,Nn,ES,w4,lc,e0,kq,Eq,IS,th,R4,_S,t0,SA,$7,Yd,wA,P4,A4,r0,U7,H7,q7,rh,RA,jI,T4,uc,k4,xS,PA,Iq,n0,_q,i0,AA,KI,o0,xq,GI,zy,nh,V7,ih,s0,CS,Cq,W7,Dt,a0,c0,z7,j7,K7,G7,DS,Y7,d0,qae,jy,E4,TA,YI,l0,JI,u0,kA,$e,oh,XI,ZI,pc,OS,EA,J7,QI,IA,I4,Dq,Oq,Mq,Nq,_4,X7,_A,MS,e_,xA,Z7,p0,NS,t_,r_,n_,x4,Ea,Q7,C4,Ky,eQ,Fq,tQ,CA,DA,Lq,Gy,m0,rQ,Bq,$q,FS,cm,LS,Uq,nQ,f0,bo,BS,hi,tu,h0,Gu,Hq,g0,y0,Hc,Rt,sh,D4,ah,iQ,i_,o_,O4,v0,ch,b0,S0,s_,oQ,qq,w0,sQ,Yy,M4,qc,R0,aQ,cQ,dm,N4,dQ,lQ,uQ,P0,a_,Vc,A0,T0,Yu,k0,Vq,pQ,E0,mQ,fQ,Wq,hQ,gQ,yQ,zq,vQ,bQ,mc,SQ,F4,I0,wQ,jq,RQ,L4,B4,$4,Kq,PQ,Jd,_0,AQ,U4,H4,Xd,q4,c_,TQ};
|
|
167
|
-
|
|
168
|
-
//# debugId=374C82C9269B647064756E2164756E21
|