@kaeawc/auto-mobile 0.0.92 → 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/schemas/test-plan.schema.json +370 -52
- package/dist/src/ble-peripheral.py +153 -0
- package/dist/src/{chunk-r14wwk37.js → chunk-026y62r9.js} +12 -12
- package/dist/src/chunk-0jyfg947.js +4 -0
- package/dist/src/{chunk-950qcq1e.js → chunk-0zfpp1wh.js} +4 -4
- package/dist/src/chunk-13qxf7ym.js +7 -0
- package/dist/src/chunk-1scenrk7.js +4 -0
- package/dist/src/chunk-1vb5ph1k.js +4 -0
- package/dist/src/chunk-20g565q7.js +5 -0
- package/dist/src/chunk-21h6dhdm.js +5 -0
- package/dist/src/{chunk-2e6s75qv.js → chunk-25mfpthk.js} +8 -8
- package/dist/src/{chunk-9rkfyt6q.js → chunk-2b39zyxc.js} +3 -3
- package/dist/src/chunk-2gzd6wbd.js +4 -0
- package/dist/src/{chunk-eka89q3k.js → chunk-3dntffy9.js} +1 -1
- package/dist/src/chunk-3gfczcsn.js +4 -0
- package/dist/src/chunk-3h5jz1vb.js +9 -0
- package/dist/src/chunk-41zcy6b3.js +5 -0
- 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-5wk1t46v.js +5 -0
- package/dist/src/chunk-661c50hh.js +17 -0
- package/dist/src/chunk-68n6bjjd.js +21 -0
- package/dist/src/{chunk-zg67wjkh.js → chunk-69pmjdf2.js} +3 -3
- package/dist/src/chunk-6hrj3jt6.js +145 -0
- package/dist/src/{chunk-b4cxdzwy.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-7k7gjg2t.js +7 -0
- 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-r20pe1nv.js → chunk-96r3bpg7.js} +3 -3
- package/dist/src/chunk-97x887te.js +4 -0
- package/dist/src/{chunk-sz1a7p43.js → chunk-99a6tbvd.js} +1 -1
- package/dist/src/chunk-9p5d2994.js +5 -0
- package/dist/src/{chunk-w7zsh13a.js → chunk-9q265er0.js} +4 -4
- package/dist/src/chunk-9xgnrv5w.js +5 -0
- package/dist/src/chunk-9xgsmshb.js +5 -0
- package/dist/src/chunk-a02d1wgv.js +4 -0
- package/dist/src/{chunk-km0dy5vc.js → chunk-a9ps00a1.js} +10 -10
- package/dist/src/chunk-aewdveet.js +5 -0
- package/dist/src/chunk-b3tdtq7r.js +9 -0
- package/dist/src/chunk-bn7jx7a2.js +4 -0
- package/dist/src/chunk-bnyw27ja.js +4 -0
- package/dist/src/{chunk-s1zq65ny.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-cb1ga9rd.js +7 -0
- package/dist/src/chunk-cn7fwy7k.js +4 -0
- package/dist/src/chunk-cnvy4a64.js +4 -0
- package/dist/src/chunk-cqhw4yr6.js +5 -0
- package/dist/src/{chunk-v90es00d.js → chunk-ctmfshjc.js} +2 -2
- package/dist/src/chunk-ctwmhz13.js +4 -0
- package/dist/src/{chunk-qv2918jt.js → chunk-d3jx9bz5.js} +2 -2
- package/dist/src/{chunk-wry6skrm.js → chunk-d6rb08ga.js} +1 -1
- package/dist/src/chunk-ddqhj4eg.js +5 -0
- package/dist/src/{chunk-d57432wq.js → chunk-ddrhs1c3.js} +2 -2
- package/dist/src/chunk-dnjnh9p6.js +4 -0
- package/dist/src/{chunk-ajsrz473.js → chunk-dw5rwgya.js} +3 -3
- package/dist/src/chunk-e0870khr.js +5 -0
- 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-g2js4c2v.js +971 -0
- package/dist/src/chunk-g3af2qbk.js +5 -0
- package/dist/src/chunk-gadtna7s.js +11 -0
- package/dist/src/{chunk-c9nk1r78.js → chunk-gcyx407v.js} +3 -3
- package/dist/src/{chunk-jdqvcq0a.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-2v7tw1nj.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-kd9vfaxh.js +5 -0
- package/dist/src/{chunk-34zxqcmq.js → chunk-kdczmgwk.js} +3 -3
- package/dist/src/chunk-ke3wn14v.js +4 -0
- package/dist/src/chunk-kh5n7m6w.js +4 -0
- package/dist/src/{chunk-0dfnyfkh.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-stfzjr9y.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-9y5bcy28.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-qj1tbnv2.js +8 -0
- package/dist/src/chunk-qnh9egwr.js +4 -0
- package/dist/src/chunk-qy3khhf8.js +8 -0
- package/dist/src/chunk-r0vp315h.js +11 -0
- package/dist/src/chunk-r4j43b9s.js +237 -0
- package/dist/src/{chunk-4pfftt07.js → chunk-r54cxxze.js} +3 -3
- package/dist/src/chunk-r6pvhj33.js +325 -0
- 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-s3y3zfcx.js +14 -0
- package/dist/src/chunk-s4g43k75.js +5 -0
- package/dist/src/chunk-sfqe223f.js +311 -0
- package/dist/src/chunk-sqdrxjw5.js +7 -0
- package/dist/src/{chunk-0w1spptt.js → chunk-t54k47em.js} +4 -4
- package/dist/src/chunk-tek4pnvv.js +26 -0
- package/dist/src/chunk-tn74y7af.js +4 -0
- package/dist/src/chunk-tvq0nzam.js +5 -0
- package/dist/src/chunk-tx4f0h9c.js +6 -0
- 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-w5yypt53.js +42 -0
- package/dist/src/{chunk-r0f1q783.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-8en08r7q.js → chunk-wpe46vsa.js} +3 -3
- package/dist/src/chunk-wxdjeb4k.js +27 -0
- 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-jhnbfj19.js → chunk-xn9m3xc2.js} +5 -5
- package/dist/src/{chunk-a4k9rt7z.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/ios/CameraPosterInjection/Injection/CameraPosterInjection.m +466 -0
- package/package.json +4 -3
- package/schemas/test-plan.schema.json +370 -52
- package/dist/src/chunk-09442h7v.js +0 -4
- package/dist/src/chunk-0e4gm1kj.js +0 -5
- package/dist/src/chunk-0eb8576f.js +0 -4
- package/dist/src/chunk-0rjm4nx7.js +0 -5
- package/dist/src/chunk-1zmh2eak.js +0 -4
- package/dist/src/chunk-28k63ha3.js +0 -5
- package/dist/src/chunk-2d4wmp8b.js +0 -4
- package/dist/src/chunk-32jpxz2y.js +0 -323
- package/dist/src/chunk-3jmvqygr.js +0 -238
- package/dist/src/chunk-3swvfhqt.js +0 -5
- package/dist/src/chunk-44bt78m9.js +0 -5
- package/dist/src/chunk-488vt2bp.js +0 -4
- package/dist/src/chunk-4fgdhcwx.js +0 -5
- package/dist/src/chunk-4jp2se4w.js +0 -4
- package/dist/src/chunk-4vhr9e4t.js +0 -4
- package/dist/src/chunk-4xd6zs3y.js +0 -15
- package/dist/src/chunk-51567pg8.js +0 -4
- package/dist/src/chunk-5agqsfev.js +0 -4
- package/dist/src/chunk-5d706gmr.js +0 -4
- package/dist/src/chunk-5kd4rqk7.js +0 -5
- package/dist/src/chunk-61t538bm.js +0 -4
- package/dist/src/chunk-6d3mmqxt.js +0 -54
- package/dist/src/chunk-6hyt398x.js +0 -5
- package/dist/src/chunk-6mnr8kpm.js +0 -4
- package/dist/src/chunk-79q5xsdc.js +0 -42
- package/dist/src/chunk-7bdgand3.js +0 -4
- package/dist/src/chunk-84cp9dw5.js +0 -4
- package/dist/src/chunk-86f2h5ww.js +0 -5
- package/dist/src/chunk-8cghfzb2.js +0 -19
- package/dist/src/chunk-9tf2p9y9.js +0 -5
- package/dist/src/chunk-a2sc4jm0.js +0 -5
- package/dist/src/chunk-aa5ng3d1.js +0 -4
- package/dist/src/chunk-b3h0a6ca.js +0 -4
- package/dist/src/chunk-b6a737qt.js +0 -4
- package/dist/src/chunk-bn64x5z5.js +0 -5
- package/dist/src/chunk-bvh649za.js +0 -12
- package/dist/src/chunk-c9tyfg4j.js +0 -26
- package/dist/src/chunk-cfsdfqnm.js +0 -4
- package/dist/src/chunk-cxyf04jc.js +0 -7
- package/dist/src/chunk-da08tx5v.js +0 -4
- package/dist/src/chunk-f2tc08m2.js +0 -4
- package/dist/src/chunk-f8tnk179.js +0 -5
- package/dist/src/chunk-f9s1kkhx.js +0 -5
- package/dist/src/chunk-fbp8a4rx.js +0 -4
- package/dist/src/chunk-fd2z0sze.js +0 -4
- package/dist/src/chunk-fk927f4q.js +0 -54
- package/dist/src/chunk-fxmr3a0f.js +0 -4
- package/dist/src/chunk-gaqwhd44.js +0 -4
- package/dist/src/chunk-ggtd5x5a.js +0 -5
- package/dist/src/chunk-gndcfrm7.js +0 -4
- package/dist/src/chunk-h3n4adc6.js +0 -310
- package/dist/src/chunk-h5pjbb83.js +0 -4
- package/dist/src/chunk-hgnnh302.js +0 -4
- package/dist/src/chunk-hmke8nhx.js +0 -5
- package/dist/src/chunk-j2bx12hn.js +0 -4
- package/dist/src/chunk-j70y1a2g.js +0 -4
- package/dist/src/chunk-js1jpyxp.js +0 -6
- package/dist/src/chunk-kbjq0qvb.js +0 -4
- package/dist/src/chunk-kfwx57xd.js +0 -4
- package/dist/src/chunk-kzwctna2.js +0 -4
- package/dist/src/chunk-m9ehyehy.js +0 -4
- package/dist/src/chunk-mct91p1f.js +0 -4
- package/dist/src/chunk-mf9spd4g.js +0 -5
- package/dist/src/chunk-mgrcansb.js +0 -4
- package/dist/src/chunk-mqc1d0eb.js +0 -6
- package/dist/src/chunk-n1zmpk0z.js +0 -4
- package/dist/src/chunk-ncyjf63g.js +0 -4
- package/dist/src/chunk-nr64d21q.js +0 -973
- package/dist/src/chunk-nwm2pq5v.js +0 -168
- package/dist/src/chunk-pm06b05d.js +0 -9
- package/dist/src/chunk-q50s00ry.js +0 -4
- package/dist/src/chunk-qwye1958.js +0 -14
- package/dist/src/chunk-r8z9pfve.js +0 -5
- package/dist/src/chunk-rdpgkjf6.js +0 -4
- package/dist/src/chunk-rkr0dks9.js +0 -5
- package/dist/src/chunk-rn84t3sf.js +0 -11
- package/dist/src/chunk-s123kn7n.js +0 -4
- package/dist/src/chunk-s73qn3fx.js +0 -4
- package/dist/src/chunk-sjn0nj4p.js +0 -5
- package/dist/src/chunk-sns0c35v.js +0 -7
- package/dist/src/chunk-t4dr5c8v.js +0 -8
- package/dist/src/chunk-tc8k9c1j.js +0 -4
- package/dist/src/chunk-teznhase.js +0 -4
- package/dist/src/chunk-ty9xgmz4.js +0 -4
- package/dist/src/chunk-tyazf3sk.js +0 -145
- package/dist/src/chunk-v6npjrjm.js +0 -5
- package/dist/src/chunk-vbvtzkwz.js +0 -5
- package/dist/src/chunk-vefd8qee.js +0 -8
- package/dist/src/chunk-vs9r72ta.js +0 -17
- package/dist/src/chunk-w2mwa0jk.js +0 -4
- package/dist/src/chunk-w88k0bgr.js +0 -4
- package/dist/src/chunk-wzdt0enk.js +0 -4
- package/dist/src/chunk-xhhv854c.js +0 -4
- package/dist/src/chunk-y58270hd.js +0 -4
- package/dist/src/chunk-yk0hmbex.js +0 -4
- package/dist/src/chunk-ympy4fdz.js +0 -28
- package/dist/src/chunk-yw436axy.js +0 -4
- package/dist/src/chunk-z04jrpjy.js +0 -5
- package/dist/src/chunk-z2xznczw.js +0 -4
- package/dist/src/chunk-z4xnrgps.js +0 -4
- package/dist/src/chunk-z7csyszv.js +0 -4
- package/dist/src/chunk-z8t0v07j.js +0 -11
- package/dist/src/chunk-z916af47.js +0 -228
- package/dist/src/chunk-zcr8he8q.js +0 -5
- package/dist/src/chunk-zd9vmkzn.js +0 -9
- package/dist/src/chunk-zj939v0h.js +0 -5
- package/dist/src/chunk-zkdjwtc1.js +0 -4
- package/dist/src/chunk-zkv5kzt6.js +0 -4
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{h,Y,I,$e,FU}from"./chunk-5wk1t46v.js";import{yn,Ur,i,er,Tr,$i,Se,Je,HP,BK,Xu,nc,hi,vn,Q,Lo,DE,eo,dr,re,l,st,e}from"./chunk-r0vp315h.js";import{Nn}from"./chunk-aewdveet.js";import{B,ot,ks,$c,nr,zb,Qn,Cr,Uc,f,qO,bE,Za,py,my,Mf,Ta,kt,fy,Es,ti,lU,$l,SE,Wn,wE,x2,Qa,Ul,VO,uU,_e,jr}from"./chunk-r6pvhj33.js";import{$s,w,ci,ha,cd,Nr,ze,Gr,Io,Us,Fr,Rg,sY,sR,Az,dk,Tz,aY,nf,xB,cR,rb,sn,H,PD,ee,uk,qa,J,_g,ae,Ip,v,Dg,En,Va,Og,fY,hY,gY,yY,Ng,ga,Ve,Vr,gk,kne,lf,ud,pd,uf,L,vs,xD,Ine,zz,_ne,jz,Cu,Op,Yt,De,RY,One,Mne,$ne,Une,dn,Pi,co,le,at,vd,un,N,tO,Jn,KR,wf,xb,ve,Cn,Uu,oO,Zg,pi,Qg,Pf,E$,ey,Gs,Xn,po,iy,Bl,x,E}from"./chunk-sfqe223f.js";import{oi,$n,xL,CL,Um,DL,PW,Mw,Fw,xe}from"./chunk-4vxeq0vd.js";import{y,T,te,yr,j,g,Le,xd,Dt,ne,A,t8,RE,n,a,m,S,s,Fo,Ne,p,_,Yp}from"./chunk-w5yypt53.js";import{Fd}from"./chunk-khejfph4.js";import{r,t,u}from"./chunk-2b39zyxc.js";import{Ft,ue,Pt}from"./chunk-j69g8b50.js";var Dr={};ue(Dr,{down:()=>wl,up:()=>vl});var Ir={};ue(Ir,{down:()=>bl,up:()=>Sl});var kr={};ue(kr,{down:()=>Rl,up:()=>_l});var Br={};ue(Br,{down:()=>El,up:()=>Pl});var Or={};ue(Or,{down:()=>Cl,up:()=>xl});var Mr={};ue(Mr,{down:()=>Tl,up:()=>Al});var Lr={};ue(Lr,{down:()=>Fl,up:()=>Nl});var Zr={};ue(Zr,{deleteLegacyBindingRows:()=>Lt,down:()=>ac,legacyJournalPredicate:()=>mt,up:()=>sc});var ei={};ue(ei,{down:()=>cc,up:()=>dc});var ii={};ue(ii,{down:()=>yc,up:()=>gc});var ni={};ue(ni,{down:()=>wc,up:()=>vc});var si={};ue(si,{down:()=>bc,up:()=>Sc});var ai={};ue(ai,{down:()=>Rc,up:()=>_c});var di={};ue(di,{down:()=>Ec,up:()=>Pc});var li={};ue(li,{down:()=>Cc,up:()=>xc});var ui={};ue(ui,{down:()=>Tc,up:()=>Ac});var mi={};ue(mi,{down:()=>Ic,up:()=>Dc});var fi={};ue(fi,{down:()=>Bc,up:()=>kc});var wo="registry_schema_unsupported";class tn extends t{dbPath;unknownMigrations;writerVersions;code=wo;retryable=!1;remedy;constructor(o,d,c={}){super(`The binding registry at ${o} contains migrations unknown to this daemon: ${d.join(", ")}; nothing was changed.`);this.dbPath=o;this.unknownMigrations=d;this.writerVersions=c;this.name="BindingRegistrySchemaUnsupportedError";let b=[...new Set(Object.values(c))];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 vl(o){await o.schema.createTable("binding_registry_migration_writers").addColumn("migration_name","text",(d)=>d.primaryKey()).addColumn("writer_version","text",(d)=>d.notNull()).addColumn("recorded_at","text",(d)=>d.notNull()).execute()}async function wl(o){await o.schema.dropTable("binding_registry_migration_writers").ifExists().execute()}async function Sl(o){await o.schema.createIndex("session_broker_resources_request_id").ifNotExists().on("session_broker_resources").column("request_id").execute(),await o.schema.createIndex("session_broker_requests_resource_id").ifNotExists().on("session_broker_requests").column("resource_id").execute()}async function bl(o){await o.schema.dropIndex("session_broker_requests_resource_id").ifExists().execute(),await o.schema.dropIndex("session_broker_resources_request_id").ifExists().execute()}async function _l(o){await o.schema.createTable("device_mutation_journal").addColumn("sequence","integer",(d)=>d.primaryKey().autoIncrement()).addColumn("session_uuid","text",(d)=>d.notNull()).addColumn("device_id","text",(d)=>d.notNull()).addColumn("incarnation","text",(d)=>d.notNull()).addColumn("kind","text",(d)=>d.notNull()).addColumn("mutation_key","text",(d)=>d.notNull()).addColumn("prior_value_json","text",(d)=>d.notNull()).addColumn("applied_at_ms","integer",(d)=>d.notNull()).addColumn("tool_name","text",(d)=>d.notNull()).addUniqueConstraint("device_mutation_original",["session_uuid","device_id","incarnation","kind","mutation_key"]).addCheckConstraint("device_mutation_scope_nonempty",f`
|
|
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 o.schema.createTable("device_mutation_baselines").addColumn("device_id","text",(d)=>d.notNull()).addColumn("incarnation","text",(d)=>d.notNull()).addColumn("baseline_json","text",(d)=>d.notNull()).addColumn("captured_at_ms","integer",(d)=>d.notNull()).addPrimaryKeyConstraint("device_mutation_baseline_identity",["device_id","incarnation"]).addCheckConstraint("device_mutation_baseline_nonempty",f`
|
|
7
|
+
length(trim(device_id)) > 0 AND length(trim(incarnation)) > 0
|
|
8
|
+
`).execute()}async function Rl(o){await o.schema.dropTable("device_mutation_baselines").ifExists().execute(),await o.schema.dropTable("device_mutation_journal").ifExists().execute()}async function Pl(o){await o.schema.alterTable("session_broker_requests").addColumn("timing_json","text").execute(),await o.schema.alterTable("session_broker_requests").addColumn("timing_profile_json","text").execute(),await o.schema.alterTable("session_broker_requests").addColumn("timing_updated_at_ms","integer").execute(),await o.schema.alterTable("session_broker_resources").addColumn("reuse_count","integer",(d)=>d.notNull().defaultTo(0)).execute(),await o.schema.createIndex("session_broker_timing_window_idx").on("session_broker_requests").column("timing_updated_at_ms").execute()}async function El(o){await o.schema.dropIndex("session_broker_timing_window_idx").execute(),await o.schema.alterTable("session_broker_resources").dropColumn("reuse_count").execute(),await o.schema.alterTable("session_broker_requests").dropColumn("timing_updated_at_ms").execute(),await o.schema.alterTable("session_broker_requests").dropColumn("timing_profile_json").execute(),await o.schema.alterTable("session_broker_requests").dropColumn("timing_json").execute()}async function xl(o){await o.schema.createTable("device_claims").addColumn("platform","text",(d)=>d.notNull()).addColumn("device_id","text",(d)=>d.notNull()).addColumn("kind","text",(d)=>d.notNull()).addColumn("daemon_session_id","text").addColumn("pid","integer",(d)=>d.notNull()).addColumn("owner_token","text",(d)=>d.notNull()).addColumn("process_generation_token","text").addColumn("session_uuid","text").addColumn("claimed_at_ms","integer",(d)=>d.notNull()).addColumn("updated_at_ms","integer",(d)=>d.notNull()).addPrimaryKeyConstraint("device_claims_device",["platform","device_id"]).addCheckConstraint("device_claims_platform",f`platform IN ('android', 'ios')`).addCheckConstraint("device_claims_kind",f`kind IN ('allocation', 'forward', 'slot')`).addCheckConstraint("device_claims_nonempty",f`length(trim(device_id)) > 0 AND length(trim(owner_token)) > 0 AND pid > 0`).execute()}async function Cl(o){await o.schema.dropTable("device_claims").ifExists().execute()}async function Al(o){await o.schema.alterTable("device_claims").addColumn("metadata","text").execute()}async function Tl(o){await o.schema.alterTable("device_claims").dropColumn("metadata").execute()}var Dl=f`platform IN ('android', 'ios', 'watchos')`,Il=f`platform IN ('android', 'ios')`,bo=f.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(", ")),_o=f.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(", ")),Ro=f.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 kl(o,d){await f`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 (${d}),
|
|
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(o),await f`INSERT INTO slot_assignments_next (${bo})
|
|
31
|
+
SELECT ${bo} FROM slot_assignments`.execute(o),await f`DROP TABLE slot_assignments`.execute(o),await f`ALTER TABLE slot_assignments_next RENAME TO slot_assignments`.execute(o),await f`CREATE UNIQUE INDEX slot_assignments_device
|
|
32
|
+
ON slot_assignments (platform, stable_device_id)
|
|
33
|
+
WHERE stable_device_id IS NOT NULL`.execute(o)}async function Ol(o,d){let c=await f`SELECT seq FROM sqlite_sequence WHERE name = 'slot_journal'`.execute(o);await f`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 (${d}),
|
|
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(o),await f`INSERT INTO slot_journal_next (${_o})
|
|
56
|
+
SELECT ${_o} FROM slot_journal`.execute(o),await f`DROP TABLE slot_journal`.execute(o),await f`ALTER TABLE slot_journal_next RENAME TO slot_journal`.execute(o);let b=c.rows[0]?.seq;if(b!==void 0)await f`DELETE FROM sqlite_sequence WHERE name = 'slot_journal'`.execute(o),await f`INSERT INTO sqlite_sequence (name, seq)
|
|
57
|
+
VALUES ('slot_journal', MAX(${b}, COALESCE((SELECT MAX(id) FROM slot_journal), 0)))`.execute(o);await f`CREATE UNIQUE INDEX slot_journal_open_slot
|
|
58
|
+
ON slot_journal (scope_key, slot_index)
|
|
59
|
+
WHERE phase NOT IN ('committed', 'rolled_back')`.execute(o)}async function Ml(o,d){await f`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 (${d}),
|
|
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(o),await f`INSERT INTO device_claims_next (${Ro})
|
|
77
|
+
SELECT ${Ro} FROM device_claims`.execute(o),await f`DROP TABLE device_claims`.execute(o),await f`ALTER TABLE device_claims_next RENAME TO device_claims`.execute(o)}async function Po(o,d){await kl(o,d),await Ol(o,d),await Ml(o,d)}async function Nl(o){await Po(o,Dl)}async function Fl(o){if((await f`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(o)).rows[0]?.present)throw new t("The binding registry holds Apple Watch rows; release those bindings and claims before downgrading.");await Po(o,Il)}var Eo=1000,Ll=5000;class MA extends t{sessionUuid;code="binding_ownership_unconfirmed";retryable=!0;retryAfterMs;constructor(o,d=0){super(`Session '${o}' binding ownership is not recorded for this daemon yet (the binding registry is busy or the binding is not ready); retry shortly.`);this.sessionUuid=o;this.name="BindingOwnershipUnconfirmedError",this.retryAfterMs=Math.min(Ll,Eo*(1+Math.floor(Math.max(0,d)/1000)))}toPayload(){return{code:this.code,sessionUuid:this.sessionUuid,retryable:this.retryable,retryAfterMs:this.retryAfterMs}}}var e_="daemon-restart",l0="cleanup-expired",Be={idle:!1,expiry:!1,terminal:!1,recoverable:!1,reissuableByName:!1,releasedBeforeHandout:!1},$r={...Be,releasedBeforeHandout:!0},be={...Be,terminal:!0},lt={...be,expiry:!0},qr={...lt,idle:!0},ql={...Be,idle:!0},Hr={...Be,recoverable:!0,reissuableByName:!0},Hl={...Be,reissuableByName:!0},ct={"explicit-release":be,"lazy-expiry":qr,"cleanup-expired":qr,"cli-idle-timeout":qr,"missing-first-heartbeat":lt,"heartbeat-timeout":lt,"rehydration-owner-timeout":lt,"restart-recovery-timeout":lt,"owner-disconnected":be,"binding-ownership-lost":be,"managed-slot-ownership-lost":be,"device-killed":be,"session-creation-cancelled":be,"session-creation-timeout":$r,"allocation-rollback":$r,"plan-auto-release":Hl,superseded:Be,"daemon-shutdown":Hr,"daemon-restart":Hr,expired:ql},ut={"identity-recovery-":be,"device-disconnected:":be,"device-disconnected-during-session-create:":$r,"device-restart:":Hr},Wl=Be;function Vl(o){return Object.hasOwn(ct,o)}function NA(o){return Object.keys(ut).find((d)=>o.startsWith(d)&&o.length>d.length)}function E4(o){return o==="plan-auto-release"||NA(o)==="device-restart:"}function vm(o){if(Vl(o))return ct[o];let d=NA(o);return d===void 0?Wl:ut[d]}function ir(o){return vm(o).terminal}function t_(o){return vm(o).expiry}function r_(o){return vm(o).idle||Object.hasOwn(xo,o)&&xo[o].idle}function bi(o){return o&&r_(o)?{idle:!0}:{}}function cu(o,d){return o==="cli-idle-timeout"&&d!==void 0&&Number.isSafeInteger(d)&&d>0?{idleTimeoutMs:d}:{}}function ra(o){return vm(o).recoverable}var u0="session-not-found",I4="replay-lease-expired",xo={[I4]:{idle:!0},[u0]:{idle:!1},"liveness-owner-conflict":{idle:!1},released:{idle:!1}};function LZ(o){return ra(o)&&!o.startsWith("device-restart:")}function _4(o,d){let c=vm(o);if(!c.terminal)return!1;let b=vm(d);return!b.terminal||b.idle&&!c.idle}function BZ(o,d){if(d==="device-killed")return d;if(o==="device-killed")return o;if(d==="daemon-shutdown"&&!ir(o))return d;return _4(d,o)?d:o}function _q(o){return vm(o).reissuableByName}function p0(o){let d=vm(o);if(!d.terminal)return 0;return d.idle?1:2}function ov(o){return t_(o)?"expired":"released"}function xq(o){return Object.keys(ct).filter((d)=>ct[d][o])}function Cq(o){return Object.keys(ut).filter((d)=>ut[d][o])}function $Z(o){return Object.keys(ct).filter((d)=>p0(d)>o)}function UZ(o){return Object.keys(ut).filter((d)=>p0(`${d}x`)>o)}var Ho="session_ownership_lost";class lc extends t{sessionUuid;releaseReason;code=Ho;retryable=!1;nextAction=ci;details;constructor(o,d,c){super(`Session ${o} is terminal after ${d} 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=o;this.releaseReason=d;this.name="SessionReleasedDuringCallError",this.details={sessionUuid:o,reason:d,...bi(d),...cu(d,c)}}}function bm(o){return o instanceof lc?o:void 0}class Dq extends lc{constructor(o){super(o,"binding-ownership-lost");this.message=`Session ${o} is terminal after binding-ownership-lost and cannot be reused. Acquire a new device with getAndroid or getApple.`,this.name="BindingOwnershipLostError"}}var Wr="discovery_incomplete",Co=2000;class ss extends t{code=Wr;retryable=!0;retryAfterMs=Co;constructor(o){super(`The binding registry is unreadable (${o}), so assigned devices cannot be told apart from free ones (code ${Wr}); retry shortly.`);this.name="BindingDiscoveryIncompleteError"}toPayload(){return{code:this.code,retryable:!0,retryAfterMs:this.retryAfterMs}}}import{readFile as jl}from"fs/promises";var _y=h.SESSION_BROKER_CONFIG.name,HZ="session-broker-export/v1",qZ="session-broker/v1",sv={managedHostScope:"auto-mobile-host",runnerNamespace:"session-broker",runnerIncarnation:"private-pool-v1"},Kr=xd("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()]),Kl=g({namespace:A(["product-model","simulator-device-type","alias"]),value:y().min(1)}).strict(),Jr=A(["phone","tablet","duo"]),zr=A(["phone","tablet","foldable"]),Xr=y().regex(/^\d+(?:\.\d+)*$/),Gl=xd("kind",[g({kind:ne("exact"),version:Xr}).strict(),g({kind:ne("major"),major:T().int().positive().max(Number.MAX_SAFE_INTEGER)}).strict(),g({kind:ne("minimum"),version:Xr}).strict()]),Yr=g({selector:Gl,preferredVersion:Xr}).strict(),Jl=Yr.extend({archetypes:j(Yr.extend({archetype:Jr}).strict()).refine((o)=>new Set(o.map((d)=>d.archetype)).size===o.length,{message:"defaults.ios.os.archetypes must list each archetype at most once"}).optional()}).strict(),zl=g({platform:ne("ios"),policyVersion:y().min(1),hardware:g({omitted:Jr,archetypes:j(g({archetype:Jr,modelType:Kr}).strict()),modelTypes:j(g({modelType:Kr,model:Kl}).strict())}).strict(),os:Jl}).strict(),Xl=g({platform:ne("android"),policyVersion:y().min(1),hardware:g({omitted:zr,profiles:j(g({archetype:zr,profileId:y().min(1),memoryMb:T().int().min(cd,`memoryMb must be at least ${cd} MB`).optional()}).strict())}).strict(),os:Yr}).strict(),Oe=T().int().nonnegative().max(Number.MAX_SAFE_INTEGER),Yl=t8((o)=>{if(typeof o==="object"&&o!==null&&"iosDuo"in o){e.warn("capabilities.iosDuo is deprecated and ignored; Duo support follows installed hardware.");let d={...o};return delete d.iosDuo,d}return o},g({}).strict()),Ql=10,Zl=5,ec=xd("mode",[g({mode:ne("off")}).strict(),g({mode:ne("erase"),maxUses:Oe.positive().default(20),fallback:ne("erase").default("erase")}).strict(),g({mode:ne("keep-booted"),maxUses:Oe.positive().default(Ql),fallback:A(["erase","destroy"]).default("erase")}).strict(),g({mode:ne("minimal"),maxUses:Oe.positive().default(Zl)}).strict()]),tc=g({contractVersion:ne(1),limits:g({totalDeviceCap:Oe.optional(),sessionCap:Oe.optional(),idlePoolCap:Oe.optional(),maxConcurrentResetBoots:Oe.positive().optional()}).strict(),defaults:g({ios:zl.optional(),android:Xl.optional()}).strict(),androidProfileArchetypes:Dt(y(),zr).default({}),iosClassifications:j(g({simulatorDeviceTypeIdentifier:y().min(1),modelType:Kr,aliases:j(y().min(1)).optional()}).strict()).default([]),reuseCleanDevices:te().default(!1),reuseAndroidCleanDevices:te().default(!1),androidResetMode:A(["snapshot","keep-booted"]).optional(),androidResetTimeoutMs:T().int().positive().max(Ur).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:ec}).strict().optional(),capabilities:Yl.default({})}).strict().refine((o)=>o.defaults.ios!==void 0||o.defaults.android!==void 0,{message:"At least one platform must have an explicit default policy"}).refine((o)=>o.androidResetMode===void 0||o.reuseAndroidCleanDevices&&o.defaults.android!==void 0,{message:"Android reset mode requires Android defaults and reuseAndroidCleanDevices"}).refine((o)=>o.androidKeepBootedMaxUses===void 0&&o.androidKeepBootedFallback===void 0||o.androidResetMode==="keep-booted",{message:"Android keep-booted keys require keep-booted mode"}).refine((o)=>o.androidIdleTtlMs===void 0||o.androidResetMode!==void 0,{path:["androidIdleTtlMs"],message:"androidIdleTtlMs requires androidResetMode; without a reset mode no Android device is pooled"}).refine((o)=>o.androidResetTimeoutMs===void 0||o.androidResetMode==="snapshot"||o.androidResetMode==="keep-booted"&&o.androidKeepBootedFallback==="snapshot",{path:["androidResetTimeoutMs"],message:"androidResetTimeoutMs requires snapshot mode or keep-booted snapshot fallback"}).refine((o)=>!o.reuseCleanDevices||!o.reuse||o.reuse.ios.mode==="erase",{message:"reuseCleanDevices: true selects iOS erase; remove it to select minimal, keep-booted or off"}).refine((o)=>o.defaults.ios!==void 0||!o.reuse||o.reuse.ios.mode==="off",{message:"iOS reuse requires an explicit defaults.ios policy"});function m0(o){if(!o.defaults.ios)return{mode:"off"};return o.reuse?.ios??(o.reuseCleanDevices?{mode:"erase",maxUses:20,fallback:"erase"}:{mode:"off"})}function rc(o){let d=tc.safeParse(o);if(!d.success)throw new t(`Invalid session broker host configuration: ${d.error.message}`);return d.data}async function VZ(o){try{return rc(JSON.parse(await jl(o,"utf8")))}catch(d){throw u(d,`Cannot load session broker host configuration at ${o}`)}}function WZ(o){if(o===void 0)return!1;return o.androidResetMode===void 0||o.androidResetMode==="keep-booted"&&o.androidKeepBootedFallback!=="snapshot"}var Ao="managed-slots",zZ="ambroker-",jZ="amslot-";function uc(o){return typeof o==="string"&&(o.startsWith("ambroker-")||o.startsWith("amslot-"))}var fh="session-broker-device";import{createHash as ic}from"crypto";var oc=new Set(["replacing","settling","cleanup_pending"]);function To(o,d){return o!==d&&oc.has(d)}var Xe=["committed","rolled_back"];function FA(o){return!Xe.includes(o)}var Do=604800000;function Qd(o){return ic("sha256").update(JSON.stringify([o.managedHostScope,o.runnerNamespace,o.runnerIncarnation])).digest("hex")}function Re(o){if(!Number.isInteger(o.bindingIndex)||o.bindingIndex<0)throw new t(`Binding index must be a non-negative integer, got ${o.bindingIndex}`);if(o.scopeKey.length===0)throw new t("Binding scope key must not be empty")}function Qr(o,d){if(o!=="settling")return null;if(!d?.settler)throw new t("Marking a binding settling requires the settling daemon");return d.settler}function Oq(o,d){return o.generation===d.generation&&o.stableDeviceId===d.stableDeviceId}function jc(o,d){return o.daemonId===d.daemonId&&o.pid===d.pid&&(o.processGenerationToken??null)===(d.processGenerationToken??null)}function el(o,d){return o.generation===d.generation&&o.stableDeviceId===d.stableDeviceId}function n_(o){return o.target.newStableId??o.target.newName}function ko(o,d){let c=new Set(d.map((b)=>JSON.stringify([b.platform,b.stableDeviceId])));return o.flatMap((b)=>{let R=n_(b),P=na(b);if(R===null||c.has(JSON.stringify([P,R])))return[];return c.add(JSON.stringify([P,R])),[{platform:P,stableDeviceId:R,holder:"session_broker",scopeKey:b.scopeKey,bindingIndex:b.bindingIndex,scopeState:null,execSessionUuid:null}]})}function Bo(o,d){return o?.state==="valid"||d&&o?.state==="invalidating"}function Oo(o,d,c){return o?.state==="invalidating"&&d?.execOwner?.sessionUuid===c}function Mo(o,d){let c=d.platform??o.platform;if(c!==o.platform&&d.stableDeviceId!==null)throw new t(`A binding moves from ${o.platform} to ${c} only with an empty binding`);return c}function na(o){return o.target.newPlatform??o.platform}var mt=f`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 = ${fh})`;async function sc(o){if((await f`SELECT
|
|
83
|
+
EXISTS(SELECT 1 FROM slot_assignments WHERE role <> ${fh}
|
|
84
|
+
AND (stable_device_id IS NOT NULL OR device_name IS NOT NULL))
|
|
85
|
+
OR EXISTS(SELECT 1 FROM slot_journal WHERE ${mt}
|
|
86
|
+
AND phase NOT IN ('committed', 'rolled_back'))
|
|
87
|
+
OR EXISTS(SELECT 1 FROM slot_free_devices) AS unsafe`.execute(o)).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 Lt(o),await o.schema.dropTable("slot_free_devices").execute()}async function Lt(o,d={hasJournal:!0,hasBrokerResources:!0}){if(d.hasJournal)await f`DELETE FROM slot_journal WHERE ${mt}`.execute(o);await f`DELETE FROM slot_assignments WHERE role <> ${fh}`.execute(o);let c=d.hasJournal?f`AND NOT EXISTS (SELECT 1 FROM slot_journal j WHERE j.scope_key = slot_scopes.scope_key)`:f``,b=d.hasBrokerResources?f`AND NOT EXISTS (SELECT 1 FROM session_broker_resources r WHERE r.scope_key = slot_scopes.scope_key)`:f``;await f`DELETE FROM slot_scopes WHERE scope_key <> ${Qd(sv)}
|
|
88
|
+
AND NOT EXISTS (SELECT 1 FROM slot_assignments a WHERE a.scope_key = slot_scopes.scope_key)
|
|
89
|
+
${c} ${b}`.execute(o)}async function ac(){throw new t("Legacy slot retirement is irreversible; restore a pre-upgrade backup instead.")}async function dc(o){await o.schema.createTable("slot_scopes").ifNotExists().addColumn("scope_key","text",(d)=>d.primaryKey()).addColumn("managed_host_scope","text",(d)=>d.notNull()).addColumn("runner_namespace","text",(d)=>d.notNull()).addColumn("runner_incarnation","text",(d)=>d.notNull()).addColumn("state","text",(d)=>d.notNull().check(f`state IN ('valid', 'invalidating', 'invalidated')`)).addColumn("invalidation_reason","text",(d)=>d.check(f`invalidation_reason IS NULL OR invalidation_reason IN ('incarnation_reset', 'operator_reset', 'abandoned')`)).addColumn("created_at_ms","integer",(d)=>d.notNull()).addColumn("last_acquired_at_ms","integer",(d)=>d.notNull()).addColumn("invalidating_at_ms","integer").addColumn("invalidated_at_ms","integer").execute(),await f`CREATE UNIQUE INDEX IF NOT EXISTS slot_scopes_live_namespace
|
|
90
|
+
ON slot_scopes (managed_host_scope, runner_namespace)
|
|
91
|
+
WHERE state <> 'invalidated'`.execute(o),await o.schema.createTable("slot_assignments").ifNotExists().addColumn("scope_key","text",(d)=>d.notNull().references("slot_scopes.scope_key")).addColumn("slot_index","integer",(d)=>d.notNull().check(f`slot_index >= 0`)).addColumn("role","text",(d)=>d.notNull()).addColumn("platform","text",(d)=>d.notNull().check(f`platform IN ('android', 'ios')`)).addColumn("generation","integer",(d)=>d.notNull().check(f`generation >= 0`)).addColumn("stable_device_id","text").addColumn("device_name","text").addColumn("requested_spec_json","text",(d)=>d.notNull()).addColumn("resolved_spec_json","text").addColumn("spec_fingerprint","text").addColumn("state","text",(d)=>d.notNull().check(f`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",(d)=>d.notNull()).addPrimaryKeyConstraint("slot_assignments_pk",["scope_key","slot_index"]).execute(),await f`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(o),await o.schema.createTable("slot_free_devices").ifNotExists().addColumn("platform","text",(d)=>d.notNull().check(f`platform IN ('android', 'ios')`)).addColumn("stable_device_id","text",(d)=>d.notNull()).addColumn("spec_fingerprint","text").addColumn("from_scope_key","text",(d)=>d.notNull()).addColumn("freed_at_ms","integer",(d)=>d.notNull()).addPrimaryKeyConstraint("slot_free_devices_pk",["platform","stable_device_id"]).execute()}async function cc(o){await o.schema.dropTable("slot_free_devices").ifExists().execute(),await o.schema.dropTable("slot_assignments").ifExists().execute(),await o.schema.dropTable("slot_scopes").ifExists().execute()}var ri=f.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 gc(o){await f`ALTER TABLE slot_scopes ADD COLUMN last_released_at_ms INTEGER`.execute(o),await f`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(o),await f`INSERT INTO slot_assignments_v2 (${ri})
|
|
116
|
+
SELECT ${ri} FROM slot_assignments`.execute(o),await f`DROP TABLE slot_assignments`.execute(o),await f`ALTER TABLE slot_assignments_v2 RENAME TO slot_assignments`.execute(o),await f`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(o)}async function yc(o){await f`ALTER TABLE slot_scopes DROP COLUMN last_released_at_ms`.execute(o),await f`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(o),await f`INSERT INTO slot_assignments_v1 (${ri})
|
|
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(o),await f`DROP TABLE slot_assignments`.execute(o),await f`ALTER TABLE slot_assignments_v1 RENAME TO slot_assignments`.execute(o),await f`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(o)}async function vc(o){await o.schema.createTable("slot_journal").ifNotExists().addColumn("id","integer",(d)=>d.primaryKey().autoIncrement()).addColumn("scope_key","text",(d)=>d.notNull().references("slot_scopes.scope_key")).addColumn("slot_index","integer",(d)=>d.notNull().check(f`slot_index >= 0`)).addColumn("kind","text",(d)=>d.notNull().check(f`kind IN ('create', 'replace', 'release')`)).addColumn("phase","text",(d)=>d.notNull().check(f`phase IN ('intent', 'deleting', 'deleted', 'creating', 'created', 'committed', 'rolled_back')`)).addColumn("platform","text",(d)=>d.notNull().check(f`platform IN ('android', 'ios')`)).addColumn("from_generation","integer",(d)=>d.notNull()).addColumn("to_generation","integer").addColumn("binding_generation","integer",(d)=>d.notNull()).addColumn("binding_stable_device_id","text").addColumn("target_json","text",(d)=>d.notNull()).addColumn("owner_daemon_id","text",(d)=>d.notNull()).addColumn("owner_pid","integer",(d)=>d.notNull()).addColumn("owner_process_token","text").addColumn("attempts","integer",(d)=>d.notNull().defaultTo(0)).addColumn("last_error","text").addColumn("next_attempt_at_ms","integer",(d)=>d.notNull()).addColumn("created_at_ms","integer",(d)=>d.notNull()).addColumn("updated_at_ms","integer",(d)=>d.notNull()).execute(),await f`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(o)}async function wc(o){await f`DROP INDEX IF EXISTS slot_journal_open_slot`.execute(o),await o.schema.dropTable("slot_journal").ifExists().execute()}var No={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 Sc(o){for(let[d,c]of Object.entries(No))await f`ALTER TABLE slot_free_devices ADD COLUMN ${f.id(d)} ${f.raw(c)}`.execute(o)}async function bc(o){for(let d of Object.keys(No).reverse())await f`ALTER TABLE slot_free_devices DROP COLUMN ${f.id(d)}`.execute(o)}async function _c(o){await f`ALTER TABLE slot_free_devices ADD COLUMN deletion_failed_deletes integer`.execute(o)}async function Rc(o){await f`ALTER TABLE slot_free_devices DROP COLUMN deletion_failed_deletes`.execute(o)}async function Pc(o){await f`ALTER TABLE slot_free_devices
|
|
145
|
+
ADD COLUMN state TEXT NOT NULL DEFAULT 'free'
|
|
146
|
+
CHECK (state IN ('free', 'stopping', 'stopped'))`.execute(o),await f`ALTER TABLE slot_free_devices ADD COLUMN stop_claimed_by TEXT`.execute(o),await f`ALTER TABLE slot_free_devices ADD COLUMN stop_claimed_at_ms INTEGER`.execute(o)}async function Ec(o){await f`ALTER TABLE slot_free_devices DROP COLUMN stop_claimed_at_ms`.execute(o),await f`ALTER TABLE slot_free_devices DROP COLUMN stop_claimed_by`.execute(o),await f`ALTER TABLE slot_free_devices DROP COLUMN state`.execute(o)}async function xc(o){await o.schema.alterTable("session_broker_requests").addColumn("retryable","integer",(d)=>d.check(f`retryable IN (0, 1)`)).execute()}async function Cc(o){await o.schema.alterTable("session_broker_requests").dropColumn("retryable").execute()}async function Ac(o){await o.schema.createTable("session_broker_requests").addColumn("request_id","text",(d)=>d.primaryKey()).addColumn("fingerprint","text",(d)=>d.notNull()).addColumn("parameters_json","text",(d)=>d.notNull()).addColumn("owner_json","text",(d)=>d.notNull()).addColumn("state","text",(d)=>d.notNull().check(f`state IN ('acquiring', 'active', 'releasing', 'released', 'failed')`)).addColumn("resource_id","text").addColumn("session_id","text",(d)=>d.unique()).addColumn("error","text").addColumn("error_code","text").execute(),await o.schema.createTable("session_broker_resources").addColumn("allocation_index","integer",(d)=>d.primaryKey().autoIncrement()).addColumn("resource_id","text",(d)=>d.notNull().unique()).addColumn("scope_key","text",(d)=>d.notNull()).addColumn("profile_json","text",(d)=>d.notNull()).addColumn("state","text",(d)=>d.notNull().check(f`state IN ('reserved', 'active', 'idle', 'resetting', 'destroying', 'unknown', 'destroyed')`)).addColumn("request_id","text",(d)=>d.references("session_broker_requests.request_id")).addColumn("revision","integer",(d)=>d.notNull().check(f`revision > 0`)).addColumn("idle_order","integer",(d)=>d.notNull()).execute()}async function Tc(o){await o.schema.dropTable("session_broker_resources").execute(),await o.schema.dropTable("session_broker_requests").execute()}async function Dc(o){await o.schema.createTable("session_broker_exports").addColumn("prepare_id","text",(d)=>d.primaryKey()).addColumn("request_id","text",(d)=>d.notNull().unique().references("session_broker_requests.request_id")).addColumn("request_digest","text",(d)=>d.notNull()).addColumn("created_at_ms","integer",(d)=>d.notNull()).addColumn("acknowledged_at_ms","integer").execute()}async function Ic(o){await o.schema.dropTable("session_broker_exports").execute()}async function kc(o){await o.schema.alterTable("session_broker_requests").addColumn("terminal_at_ms","integer").execute(),await o.schema.createIndex("session_broker_requests_state_idx").on("session_broker_requests").column("state").execute()}async function Bc(o){await o.schema.dropIndex("session_broker_requests_state_idx").execute(),await o.schema.alterTable("session_broker_requests").dropColumn("terminal_at_ms").execute()}var Oc="2026_10_21_013_session_broker_timing",Uo="2026_10_31_017_binding_registry_writers",pt={"2026_10_09_000_slot_registry":ei,"2026_10_09_001_slot_owner_fencing":ii,"2026_10_09_002_slot_journal":ni,"2026_10_10_003_free_device_stop_state":di,"2026_10_12_004_free_device_deletion":si,"2026_10_13_005_free_device_deletion_failed_deletes":ai,"2026_10_15_006_session_broker":ui,"2026_10_15_007_session_broker_failure_retryable":li,"2026_10_16_008_retire_slot_features":Zr,"2026_10_16_009_session_broker_receipt_retention":fi,"2026_10_19_010_session_broker_exports":mi,"2026_10_20_011_session_broker_resource_indexes":Ir,"2026_10_21_012_device_mutation_journal":kr,[Oc]:Br,"2026_10_26_014_device_claims":Or,"2026_10_27_015_device_claims_metadata":Mr,"2026_10_30_016_watchos_binding_platform":Lr,[Uo]:Dr},x4=Object.keys(pt).at(-1);function Mc(o,d=Nn){return Object.fromEntries(Object.entries(o).map(([c,b])=>{if(c<Uo)return[c,b];return[c,{async up(P){await b.up(P),await f`INSERT OR IGNORE INTO binding_registry_migration_writers
|
|
147
|
+
(migration_name, writer_version, recorded_at)
|
|
148
|
+
VALUES (${c}, ${d()}, ${new Date().toISOString()})`.execute(P)},async down(P){await f`DELETE FROM binding_registry_migration_writers
|
|
149
|
+
WHERE migration_name = ${c}`.execute(P),await b.down?.(P)}}]}))}function $o(o){return{getMigrations:async()=>Mc(pt,()=>o??Nn())}}var Nc=$o();async function ft(o,d){let c=await Wo(o),b=Vo(c);if(b.length>0)throw new tn(d,b,await Go(o,b))}async function yi(o,d){return(await f`
|
|
150
|
+
SELECT name FROM sqlite_master WHERE type = 'table' AND name = ${d}
|
|
151
|
+
`.execute(o)).rows.length>0}async function Wo(o){return(await f`SELECT name FROM kysely_migration ORDER BY name`.execute(o)).rows.map(({name:c})=>c)}function Vo(o){return o.filter((d)=>!Object.hasOwn(pt,d))}function jo(o){return f`
|
|
152
|
+
SELECT migration_name, writer_version FROM binding_registry_migration_writers
|
|
153
|
+
WHERE migration_name IN (${f.join(o)})
|
|
154
|
+
`}function Ko(o,d,c){if(c.length===0)return{};try{let b=d.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?");try{if(!b.get("binding_registry_migration_writers"))return{}}finally{b.finalize()}let R=jo(c).compile(o),P=d.prepare(R.sql);try{return Object.fromEntries(P.all(...R.parameters).map((C)=>{if(typeof C!=="object"||C===null||!("migration_name"in C)||typeof C.migration_name!=="string"||!("writer_version"in C)||typeof C.writer_version!=="string")throw new t("Invalid binding registry migration writer version");return[C.migration_name,C.writer_version]}))}finally{P.finalize()}}catch(b){return e.warn("[Bindings] Cannot read registry migration writer versions",b),{}}}async function Go(o,d){if(d.length===0)return{};try{if(!await yi(o,"binding_registry_migration_writers"))return{};let c=await jo(d).execute(o);return Object.fromEntries(c.rows.map((b)=>[b.migration_name,b.writer_version]))}catch(c){return e.warn("[Bindings] Cannot read registry migration writer versions",c),{}}}async function Jo(o){let d=await yi(o,"kysely_migration")?await Wo(o):[],c=d.at(-1)??null,b=await Go(o,c===null?[]:[c]);return{schemaVersion:c,knownSchemaVersion:x4,supported:Vo(d).length===0,writerVersion:c===null?null:b[c]??null}}async function gi(o,d){if(await yi(o,"kysely_migration"))await ft(o,d)}class qt extends t{}async function zo(o,d){if(await gi(o,d),(await new qO({db:o,provider:Nc}).getMigrations()).some((b)=>b.executedAt===void 0))throw new qt("Binding registry upgrade pending; exclusion will retry after retirement")}async function Xo(o,d,c,b={}){await gi(o,d);let R=new qO({db:o,provider:$o(b.writerVersion)});if((await R.getMigrations()).every((C)=>C.executedAt!==void 0))return;let P=x2(d);await P.acquire();try{if(await gi(o,d),(await R.getMigrations()).some((k)=>k.name==="2026_10_16_008_retire_slot_features"&&k.executedAt===void 0))await c?.();let{error:D}=await R.migrateToLatest();if(D)throw new t(`Failed to migrate the binding registry at ${d}: ${r(D)}`)}finally{await P.release()}}import{AsyncLocalStorage as cm}from"async_hooks";function ht(o){return{scopeKey:o.scope_key,managedHostScope:o.managed_host_scope,runnerNamespace:o.runner_namespace,runnerIncarnation:o.runner_incarnation,state:o.state,createdAtMs:o.created_at_ms,lastAcquiredAtMs:o.last_acquired_at_ms,lastReleasedAtMs:o.last_released_at_ms,invalidationReason:o.invalidation_reason,invalidatingAtMs:o.invalidating_at_ms,invalidatedAtMs:o.invalidated_at_ms}}function Yo(o){if(o===null)return null;return JSON.parse(o)}function Fc(o){if(o.exec_owner_daemon_id===null||o.exec_owner_pid===null||o.exec_session_uuid===null)return null;return{daemonId:o.exec_owner_daemon_id,pid:o.exec_owner_pid,sessionUuid:o.exec_session_uuid,processGenerationToken:o.exec_owner_process_token}}function Lc(o){if(o.settler_daemon_id===null||o.settler_pid===null)return null;return{daemonId:o.settler_daemon_id,pid:o.settler_pid,processGenerationToken:o.settler_process_token}}function yt(o){return{settler_daemon_id:o?.daemonId??null,settler_pid:o?.pid??null,settler_process_token:o?.processGenerationToken??null}}function oe(o){return{scopeKey:o.scope_key,bindingIndex:o.slot_index,role:o.role,platform:o.platform,generation:o.generation,stableDeviceId:o.stable_device_id,deviceName:o.device_name,requestedSpec:Yo(o.requested_spec_json),resolvedSpec:Yo(o.resolved_spec_json),specFingerprint:o.spec_fingerprint,state:o.state,execOwner:Fc(o),settler:Lc(o),updatedAtMs:o.updated_at_ms}}function gt(o,d){let c=o[d];if(c===null||c===void 0)return null;if(typeof c!=="string")throw new t(`Binding journal target field '${d}' is not a string`);return c}function C4(o){return o==="android"||o==="ios"||o==="watchos"}function Ye(o){let d=JSON.parse(o);if(typeof d!=="object"||d===null)throw new t("Binding journal target is not an object");let c=d,b=c.newPlatform;if(b!==void 0&&b!==null&&!C4(b))throw new t("Binding journal target field 'newPlatform' is not a platform");return{...b?{newPlatform:b}:{},...c.removalRequested===!0?{removalRequested:!0}:{},...typeof c.quarantinedAtMs==="number"&&Number.isFinite(c.quarantinedAtMs)?{quarantinedAtMs:c.quarantinedAtMs}:{},oldStableId:gt(c,"oldStableId"),oldName:gt(c,"oldName"),newName:gt(c,"newName"),newStableId:gt(c,"newStableId"),requestedSpec:c.requestedSpec??null,resolvedSpec:c.resolvedSpec??null,specFingerprint:gt(c,"specFingerprint")}}function fe(o){return{id:o.id,scopeKey:o.scope_key,bindingIndex:o.slot_index,kind:o.kind,phase:o.phase,platform:o.platform,fromGeneration:o.from_generation,toGeneration:o.to_generation,binding:{generation:o.binding_generation,stableDeviceId:o.binding_stable_device_id},target:Ye(o.target_json),owner:{daemonId:o.owner_daemon_id,pid:o.owner_pid,processGenerationToken:o.owner_process_token},attempts:o.attempts,lastError:o.last_error,nextAttemptAtMs:o.next_attempt_at_ms,createdAtMs:o.created_at_ms,updatedAtMs:o.updated_at_ms}}function Qe(o){let d=JSON.stringify(o??null);if(d===void 0)throw new t("Binding spec must be JSON-serializable");return d}function Qo(o,d,c,b){return{phase:d.phase,target_json:Qe({...o.target,...d.target}),to_generation:c&&c.generation!==o.binding.generation?c.generation:o.toGeneration,...c?{binding_generation:c.generation,binding_stable_device_id:c.stableDeviceId}:{},...d.attempt?{attempts:o.attempts+1,last_error:d.attempt.error,next_attempt_at_ms:d.attempt.nextAttemptAtMs}:{},updated_at_ms:b}}function Zo(o){if(!FA(o))throw new t(`A binding journal entry cannot open at phase '${o}'`)}class vi{db;constructor(o){this.db=o}async listReferencedAvdNames(){return this.db.transaction().execute(async(o)=>{let d=await o.selectFrom("slot_assignments").select(["device_name","stable_device_id"]).execute(),c=await o.selectFrom("slot_journal").select(["binding_stable_device_id","target_json"]).execute(),b=d.flatMap((R)=>[R.device_name,R.stable_device_id]);for(let R of c){let P=Ye(R.target_json);b.push(R.binding_stable_device_id,P.oldName,P.oldStableId,P.newName,P.newStableId)}return[...new Set(b.filter((R)=>R!==null))]})}}class wi{db;write;constructor(o,d=(c)=>c(o)){this.db=o;this.write=d}async upsert(o){let d=es(o);await this.write((c)=>c.insertInto("device_claims").values(d).onConflict((b)=>b.columns(["platform","device_id"]).doUpdateSet({...d,claimed_at_ms:f`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","<=",d.updated_at_ms)).execute())}async replaceIf(o,d){let c=es(d);return this.write(async(b)=>{if(!o){let P=await b.insertInto("device_claims").values(c).onConflict((C)=>C.columns(["platform","device_id"]).doNothing()).executeTakeFirst();return Number(P.numInsertedOrUpdatedRows??0)>0}let R=await b.updateTable("device_claims").set(c).where("platform","=",d.platform).where("device_id","=",d.deviceId).where("pid","=",o.pid).where("owner_token","=",o.ownerToken).where("updated_at_ms","=",o.updatedAtMs).executeTakeFirst();return Number(R.numUpdatedRows)>0})}async release(o,d,c){await this.write((b)=>b.deleteFrom("device_claims").where("platform","=",o).where("device_id","=",d).where("pid","=",c.pid).where("owner_token","=",c.ownerToken).execute())}async releaseOwnedBy(o){await this.write((d)=>d.deleteFrom("device_claims").where("pid","=",o.pid).where("owner_token","=",o.ownerToken).execute())}async get(o,d){let c=await this.db.selectFrom("device_claims").selectAll().where("platform","=",o).where("device_id","=",d).executeTakeFirst();return c?ts(c):void 0}async list(){return(await this.db.selectFrom("device_claims").selectAll().orderBy("platform").orderBy("device_id").execute()).map(ts)}}function es(o){return{platform:o.platform,device_id:o.deviceId,kind:o.kind,daemon_session_id:o.daemonSessionId??null,pid:o.pid,owner_token:o.ownerToken,process_generation_token:o.processGenerationToken??null,session_uuid:o.sessionUuid??null,metadata:o.metadata??null,claimed_at_ms:o.claimedAtMs,updated_at_ms:o.updatedAtMs}}function ts(o){return{platform:o.platform,deviceId:o.device_id,kind:o.kind,...o.daemon_session_id===null?{}:{daemonSessionId:o.daemon_session_id},pid:o.pid,ownerToken:o.owner_token,...o.process_generation_token===null?{}:{processGenerationToken:o.process_generation_token},...o.session_uuid===null?{}:{sessionUuid:o.session_uuid},...o.metadata===null?{}:{metadata:o.metadata},claimedAtMs:o.claimed_at_ms,updatedAtMs:o.updated_at_ms}}function rs(o,d){let c=[];for(let{selection:b}of o.selections??[])if(zb.is(b)&&nr.is(b.column))c.push(_i(b.column.column.name),Ri(d,b.column.column.name));else if(nr.is(b))c.push(_i(b.column.name),Ri(d,b.column.name));else if(ks.is(b)&&ot.is(b.alias))c.push(_i(b.alias.name),Ri(d,b.alias.name));else throw Error("can't extract column names from the select query node");return c}function _i(o){return new Cr(Qn.createImmediate(o))}function Ri(o,d){return new Cr(zb.create(nr.create(d),$c.create(o)))}function Ei(o){return f`(select coalesce(json_group_array(json_object(${f.join(qc(o.toOperationNode(),"agg"))})), '[]') from ${o} as agg)`}function qc(o,d){try{return rs(o,d)}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 nm}from"fs";import{dirname as om,join as sm}from"path";var Hc=xd("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")})]),xi=xd("platform",[g({platform:ne("ios"),metadataState:ne("current"),simulatorDeviceTypeIdentifier:y().min(1),modelIdentifier:y().min(1).optional(),archetype:A(["phone","tablet","duo"]),modelType:Hc,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 Ln(o){let d=g({profile:xi}).safeParse(o.profile);if(!d.success)throw new t("Stored session device profile is incomplete; retain its reservation for recovery");return d.data.profile}function f0(o){return Ln({profile:o})}async function KZ(o,d,c){let b;if(o.platform==="android"&&d?.device)try{b=await c?.readConfig(d.device.name)}catch(P){e.warn(`Cannot read effective Android hardware for broker receipt: ${r(P)}`,P)}return o.platform==="android"?{...o,effectiveRamMb:b?.effectiveRamMb??null,effectiveCpuCores:b?.effectiveCpuCores??null}:o}function is(o,d){if(d?.platform!=="android")return{};return{profile_json:JSON.stringify({...typeof o.profile==="object"&&o.profile!==null?o.profile:{},profile:{...Ln(o),effectiveRamMb:d.effectiveRamMb??null,effectiveCpuCores:d.effectiveCpuCores??null}})}}class i_ extends t{code="reset_capacity_wait_exceeded";details;constructor(o,d,c){let{platform:b,limit:R,booted:P,externalDevices:C,heldDevices:D}=c.details,k=C?.length?` Simulators with no AutoMobile owner still counting toward the limit: ${C.join(", ")}.`:"";super(`Gave up after ${d/1000}s waiting for iOS simulator capacity to re-boot reset simulator ${o}: ${P} simulator(s) booted, limit is ${R}.${k} Shut them down (xcrun simctl shutdown <udid>) or raise AUTOMOBILE_IOS_SIM_MAX_BOOTED.`,{cause:c});this.name="ResetCapacityWaitExceededError",this.details={platform:b,deviceId:o,waitedMs:d,limit:R,booted:P,externalDevices:C,heldDevices:D}}}class Pe extends t{code="session_broker_invariant_failed"}var GZ=5000,tl=5000;class BS extends t{code;retryable;retryAfterMs;constructor(o){super("Session request belongs to another daemon process generation");if(this.name="SessionRequestOwnerMismatchError",this.code=o?"session_restart_handoff_pending":"session_owner_mismatch",this.retryable=o,o)this.retryAfterMs=tl}}function Wc(o){return o instanceof Io||o instanceof ze&&o.platform==="ios"&&o.discoveryError?.retryable!==!1||"name"in o&&(o.name==="AbortError"||o.name==="TimeoutError")}function Vc(o){if(o instanceof Pe||o instanceof BS)return"permanent";if(typeof o!=="object"||o===null)return"unknown";if(Wc(o))return"retryable";if("code"in o&&typeof o.code==="string"&&o.code.startsWith("SQLITE_"))return Qa({code:o.code})==="retryable"?"retryable":"permanent";return"unknown"}function $S(o){let d=new Set,c="unknown";while(!d.has(o)){d.add(o);let b=Vc(o);if(b==="permanent")return b;if(b==="retryable")c=b;o=typeof o==="object"&&o!==null&&"cause"in o?o.cause:void 0}return c}class xa extends t{failure;constructor(o){super(o.message);this.failure=o}}function US(o){if(!o.ok)throw new xa({code:o.error.code,message:o.error.message,retryable:o.error.transient});return o.value}class rl extends t{code="session_broker_stopping";retryable=!0;retryAfterMs=tl;constructor(){super("Session broker is stopping");this.name="SessionBrokerStoppingError"}}function K(o){return{ok:!0,value:o}}function V(o,d,c={}){return{ok:!1,error:{code:o,message:d,transient:c.transient??!1,...c.field===void 0?{}:{field:c.field}}}}function vt(o){if(o.family==="duo")return"duo";return o.family==="ipad"?"tablet":"phone"}function Ut(o){if(o===void 0)return;let[d,c]=o.split("."),b=d.replace(/^0+(?=\d)/,""),R=c?.replace(/0+$/,"");return R?`${b}.${R}`:b}function Ai(o,d){if(o.family!==d.family||o.variant!==d.variant)return!1;if(o.family!=="ipad"||d.family!=="ipad")return!0;return Ut(o.sizeInches)===Ut(d.sizeInches)}function ns(o,d){if(o.family!==d.family||o.variant!==d.variant)return!1;if(o.family!=="ipad"||d.family!=="ipad")return!0;return o.sizeInches===void 0||Ut(o.sizeInches)===Ut(d.sizeInches)}function Ze(o){if(o.family==="duo")return"Duo";if(o.family==="iphone")return`iPhone ${o.variant}`;let d=o.sizeInches===void 0?"":` ${o.sizeInches}-inch`;return`iPad ${o.variant}${d}`}function Jc(o,d){if(d.namespace==="product-model")return o.modelIdentifier===d.value;if(d.namespace==="simulator-device-type")return o.simulatorDeviceTypeIdentifier===d.value;return o.aliases?.includes(d.value)===!0}function $t(o,d,c="hardware.model"){let b=d.models.filter((P)=>Jc(P,o));if(b.length>1)return V(o.namespace==="alias"?"ambiguous_model_alias":"catalog_metadata_invalid",`${c} '${o.value}' resolves to more than one catalog model.`,{field:c});let R=b[0];if(!R)return V("unsupported_hardware",`${c} '${o.value}' is not present in the installed iOS catalog.`,{field:c});if(R.metadataState!=="current")return V("catalog_metadata_invalid",`${c} '${o.value}' has stale catalog metadata.`,{field:c});if(!R.archetype||!R.modelType)return V("catalog_metadata_invalid",`${c} '${o.value}' lacks explicit archetype or model-type metadata.`,{field:c});if(vt(R.modelType)!==R.archetype)return V("catalog_metadata_invalid",`${c} '${o.value}' has conflicting archetype and model-type metadata.`,{field:c});return K(R)}function Ht(o,d){let c=d.profiles.filter((R)=>R.profileId===o);if(c.length===0){let R=d.profiles.map((P)=>P.profileId).join(", ")||"none";return V("unsupported_hardware",`Android profile '${o}' is not installed. Installed profiles: ${R}.`,{field:"hardware.profileId"})}if(c.length>1)return V("catalog_metadata_invalid",`Android profile '${o}' is duplicated in the catalog.`);let[b]=c;if(b.metadataState!=="current")return V("catalog_metadata_invalid",`Android profile '${o}' lacks current catalog metadata.`);if(b.archetype===void 0)return V("unsupported_hardware",`Android profile '${o}' has no archetype classification. Classify it as phone, tablet or foldable in androidProfileArchetypes.`,{field:"hardware.profileId"});return K({...b,archetype:b.archetype,metadataState:"current"})}function Wt(o){let d=o.effective.hardware;return d.kind==="archetype"?d.archetype:o.exactProfile?.archetype}function os(o,d,c){if(d.platform!==o||c.platform!==o)return V("invalid_config",`Requirement, defaults, and catalog must all target ${o}.`);if(!d.policyVersion)return V("invalid_config","Default policy version must be non-empty.",{field:"policyVersion"});if(c.provenance.state!=="ready")return V("catalog_unavailable",c.provenance.message??`${o} catalog is unavailable.`,{transient:!0});if(!c.provenance.source||!c.provenance.revision)return V("catalog_metadata_invalid","Catalog provenance is incomplete.");return K(!0)}function zc(o){return o.replace(/^0+(?=\d)/,"")}function qo(o,d="os.version"){if(!/^\d+(?:\.\d+)*$/.test(o))return V("invalid_request",`${d} must be a dotted numeric release.`,{field:d});let c=o.split(".").map(zc);while(c.length>1&&c.at(-1)==="0")c.pop();if(c.every((b)=>b==="0"))return V("invalid_request",`${d} must be greater than zero.`,{field:d});return K({value:c.join("."),components:c,precision:c.length})}function Me(o,d){return Us(o,d)}function et(o,d="os"){if(o.kind==="major"){if(!Number.isSafeInteger(o.major)||o.major<=0)return V("invalid_request",`${d}.major must be a positive safe integer.`,{field:`${d}.major`});return K(o)}let c=qo(o.version,`${d}.version`);return c.ok?K({kind:o.kind,version:c.value.value}):c}function Ce(o,d){let c=qo(d);if(!c.ok)return!1;if(o.kind==="major")return c.value.components[0]===String(o.major);let b=Me(c.value.value,o.version);return o.kind==="exact"?b===0:b>=0}function Vt(o){return o==="major"?1:o==="minor"?2:3}function jt(o,d,c){if(!c)return!1;let b=qo(d);if(!b.ok)return!1;let R=Vt(c),P=b.value.components.slice(0,R).join(".");if(o.kind==="exact"){let C=qo(o.version);if(!C.ok||C.value.precision>R||b.value.precision>R)return!1}return Ce(o,P)}var Fe={kind:"match"};function Z(o){return{kind:"mismatch",reason:o}}function Xc(o,d){let c=o.effective.hardware;if(c.kind==="exact-model"){let b=o.exactModel;if(!b||!d.simulatorDeviceTypeIdentifier)return Z("unknown-hardware-metadata");return d.simulatorDeviceTypeIdentifier===b.simulatorDeviceTypeIdentifier?Fe:Z("hardware")}if(c.kind==="model-type"){if(!d.modelType)return Z("unknown-hardware-metadata");return ns(c.modelType,d.modelType)?Fe:Z("hardware")}if(!d.archetype)return Z("unknown-hardware-metadata");return d.archetype===c.archetype?Fe:Z("hardware")}function Qc(o,d){let c=o.effective.hardware;if(c.kind==="exact-profile"){if(!d.profileId)return Z("unknown-hardware-metadata");return d.profileId===c.profileId?Fe:Z("hardware")}if(!d.archetype)return Z("unknown-hardware-metadata");return d.archetype===Wt(o)?Fe:Z("hardware")}function as(o,d){if(!d.osVersion||!qo(d.osVersion).ok)return Z("unknown-os-metadata");if(d.platform==="android"){if(!d.versionPrecision)return Z("unknown-os-metadata");return jt(o.effective.os,d.osVersion,d.versionPrecision)?Fe:Z("os")}return Ce(o.effective.os,d.osVersion)?Fe:Z("os")}function Mq(o,d){if(o.platform!==d.platform)return Z("platform");if(d.metadataState!=="current")return Z("stale-metadata");if(o.platform==="ios"&&d.platform==="ios"){let c=Xc(o,d);return c.kind==="match"?as(o,d):c}if(o.platform==="android"&&d.platform==="android"){let c=Qc(o,d);return c.kind==="match"?as(o,d):c}return Z("platform")}function cs(o){let d=xL.safeParse(o.spec);if(!d.success)return V("invalid_request",`spec must name exactly a watchOS runtime and an Apple Watch deviceType: ${RE(d.error)}`,{field:"spec"});return K({schemaVersion:1,platform:"watchos",spec:d.data})}function ds(o){return o.length>0?o.join(", "):"none installed"}function Ti(o,d){if(d.platform!=="watchos")return V("invalid_config","Requirement and catalog must both target watchos.");if(d.provenance.state==="not-installed")return V("unsupported_hardware",d.provenance.message??"Apple Watch simulators exist only on macOS hosts with Xcode's simctl.",{field:"platform"});if(d.provenance.state!=="ready")return V("catalog_unavailable",d.provenance.message??"The Apple Watch simulator catalog is unavailable.",{transient:!0});let{runtime:c,deviceType:b}=o.spec;if(!d.deviceTypes.some((P)=>P.deviceType===b))return V("unsupported_hardware",`Unknown Apple Watch device type '${b}'. Available: `+ds(d.deviceTypes.map((P)=>P.deviceType)),{field:"spec.deviceType"});let R=d.runtimes.filter((P)=>P.installed);if(!R.some((P)=>P.runtime===c)){let P=d.runtimes.some((C)=>C.runtime===c);return V("missing_installed_runtime",`${P?"Unavailable":"Unknown"} watchOS runtime '${c}'. Available: `+ds(R.map((C)=>C.runtime)),{field:"spec.runtime"})}return K({platform:"watchos",original:o,profile:{platform:"watchos",metadataState:"current",runtime:c,deviceType:b},catalogSource:d.provenance.source,catalogRevision:d.provenance.revision})}function Ii(o,d){if(d.platform!=="watchos")return{kind:"mismatch",reason:"platform"};if(d.metadataState!=="current")return{kind:"mismatch",reason:"stale-metadata"};if(d.deviceType!==o.profile.deviceType)return{kind:"mismatch",reason:"hardware"};return d.runtime===o.profile.runtime?{kind:"match"}:{kind:"mismatch",reason:"os"}}function qe(o){return typeof o==="object"&&o!==null&&!Array.isArray(o)}function ie(o,d){let c=Object.keys(o).filter((b)=>!d.includes(b));return c.length===0?K(!0):V("invalid_request",`Unexpected field(s): ${c.join(", ")}.`)}function us(o,d){return typeof o==="string"&&o.length>0?K(o):V("invalid_request",`${d} must be a non-empty string.`,{field:d})}function Zc(o){if(!qe(o))return V("invalid_request","hardware.model must be an exact model reference.",{field:"hardware.model"});let d=ie(o,["namespace","value"]);if(!d.ok)return d;if(o.namespace!=="product-model"&&o.namespace!=="simulator-device-type"&&o.namespace!=="alias")return V("invalid_request","hardware.model.namespace must be product-model, simulator-device-type, or alias.",{field:"hardware.model.namespace"});let c=us(o.value,"hardware.model.value");return c.ok?K({namespace:o.namespace,value:c.value}):c}function eu(o){let d=ie(o,["family","variant"]);if(!d.ok)return d;let c=o.variant;if(c==="standard"||c==="pro"||c==="pro-max"||c==="air")return K({family:"iphone",variant:c});return V("invalid_request","Unsupported iPhone model type.",{field:"hardware.modelType.variant"})}function tu(o){let d=ie(o,["family","variant"]);if(!d.ok)return d;return o.variant==="duo"?K({family:"duo",variant:"duo"}):V("invalid_request","Unsupported Duo model type.",{field:"hardware.modelType.variant"})}function ru(o){if(!qe(o))return V("invalid_request","hardware.modelType must be an object.",{field:"hardware.modelType"});if(o.family==="iphone")return eu(o);if(o.family==="ipad")return iu(o);if(o.family==="duo")return tu(o);return V("invalid_request","Unsupported iOS model family.",{field:"hardware.modelType.family"})}function iu(o){let d=ie(o,["family","variant","sizeInches"]);if(!d.ok)return d;let c=o.variant;if(c!=="standard"&&c!=="mini"&&c!=="air"&&c!=="pro")return V("invalid_request","Unsupported iPad model type.",{field:"hardware.modelType.variant"});if(o.sizeInches===void 0)return K({family:"ipad",variant:c});if(typeof o.sizeInches!=="string"||!/^\d+(?:\.\d+)?$/.test(o.sizeInches))return V("invalid_request","hardware.modelType.sizeInches must be numeric.",{field:"hardware.modelType.sizeInches"});return K({family:"ipad",variant:c,sizeInches:o.sizeInches})}function nu(o){let d=ie(o,["kind","archetype"]);if(!d.ok)return d;if(o.archetype==="phone"||o.archetype==="tablet"||o.archetype==="duo")return K({kind:"archetype",archetype:o.archetype});return V("invalid_request","Unsupported iOS hardware archetype.",{field:"hardware.archetype"})}function ou(o){let d=ie(o,["kind","modelType"]);if(!d.ok)return d;let c=ru(o.modelType);return c.ok?K({kind:"model-type",modelType:c.value}):c}function su(o){let d=ie(o,["kind","model"]);if(!d.ok)return d;let c=Zc(o.model);return c.ok?K({kind:"exact-model",model:c.value}):c}function au(o){if(!qe(o)||typeof o.kind!=="string")return V("invalid_request","hardware must have an explicit selector kind.",{field:"hardware"});if(o.kind==="omitted"){let d=ie(o,["kind"]);return d.ok?K({kind:"omitted"}):d}if(o.kind==="archetype")return nu(o);if(o.kind==="model-type")return ou(o);if(o.kind==="exact-model")return su(o);return V("invalid_request",`Unsupported iOS hardware selector '${o.kind}'.`,{field:"hardware.kind"})}function mu(o){let d=ie(o,["kind","archetype"]);if(!d.ok)return d;return o.archetype==="phone"||o.archetype==="tablet"||o.archetype==="foldable"?K({kind:"archetype",archetype:o.archetype}):V("invalid_request","Android hardware supports only phone, tablet or foldable.",{field:"hardware.archetype"})}function pu(o){let d=ie(o,["kind","profileId"]);if(!d.ok)return d;let c=us(o.profileId,"hardware.profileId");return c.ok?K({kind:"exact-profile",profileId:c.value}):c}function fu(o){if(!qe(o)||typeof o.kind!=="string")return V("invalid_request","hardware must have an explicit selector kind.",{field:"hardware"});if(o.kind==="omitted"){let d=ie(o,["kind"]);return d.ok?K({kind:"omitted"}):d}if(o.kind==="archetype")return mu(o);if(o.kind==="exact-profile")return pu(o);return V("invalid_request",`Unsupported Android hardware selector '${o.kind}'.`,{field:"hardware.kind"})}function gu(o){let d=ie(o,["kind","major"]);if(!d.ok)return d;if(typeof o.major!=="number")return V("invalid_request","os.major must be a number.",{field:"os.major"});let c={kind:"major",major:o.major},b=et(c);return b.ok?K(c):b}function hu(o,d){let c=ie(o,["kind","version"]);if(!c.ok)return c;if(typeof o.version!=="string")return V("invalid_request","os.version must be a string.",{field:"os.version"});let b={kind:d,version:o.version},R=et(b);return R.ok?K(b):R}function ms(o){if(!qe(o)||typeof o.kind!=="string")return V("invalid_request","os must have an explicit selector kind.",{field:"os"});if(o.kind==="omitted"){let d=ie(o,["kind"]);return d.ok?K({kind:"omitted"}):d}if(o.kind==="major")return gu(o);if(o.kind==="exact"||o.kind==="minimum")return hu(o,o.kind);return V("invalid_request",`Unsupported OS selector '${o.kind}'.`,{field:"os.kind"})}function yu(o){let d=au(o.hardware);if(!d.ok)return d;let c=ms(o.os);return c.ok?K({schemaVersion:1,platform:"ios",hardware:d.value,os:c.value}):c}function D4(o){return CL.includes(o)}function vu(o){return Um.includes(o)}function wu(o){if(o===void 0)return K(void 0);if(!Array.isArray(o)||!o.every(vu))return V("invalid_request",`deviceProfile.requires must list capabilities from: ${Um.join(", ")}.`,{field:"deviceProfile.requires"});return K([...o])}function Su(o){if(o===void 0)return K(void 0);if(!qe(o))return V("invalid_request","deviceProfile must be an object.",{field:"deviceProfile"});let d=ie(o,["manufacturerProfile","requires"]);if(!d.ok)return d;if(!D4(o.manufacturerProfile))return V("invalid_request",`deviceProfile.manufacturerProfile must be one of: ${CL.join(", ")}.`,{field:"deviceProfile.manufacturerProfile"});let c=wu(o.requires);if(!c.ok)return c;return K({manufacturerProfile:o.manufacturerProfile,...c.value?{requires:c.value}:{}})}function bu(o){let d=fu(o.hardware);if(!d.ok)return d;let c=ms(o.os);if(!c.ok)return c;let b=Su(o.deviceProfile);if(!b.ok)return b;return K({schemaVersion:1,platform:"android",hardware:d.value,os:c.value,...b.value?{deviceProfile:b.value}:{}})}function wt(o){if(!qe(o))return V("invalid_request","Session device requirement must be an object.");let d=ie(o,o.platform==="android"?["schemaVersion","platform","hardware","os","deviceProfile"]:o.platform==="watchos"?["schemaVersion","platform","spec"]:["schemaVersion","platform","hardware","os"]);if(!d.ok)return d;if(o.schemaVersion!==1)return V("invalid_request","schemaVersion must be 1.",{field:"schemaVersion"});if(o.platform==="ios")return yu(o);if(o.platform==="android")return bu(o);if(o.platform==="watchos")return cs(o);return V("invalid_request","platform must be ios, android or watchos.",{field:"platform"})}function Ue(o,d){return V("invalid_config",o,d===void 0?{}:{field:d})}function ki(o,d="defaults.os"){let c=et(o.selector,`${d}.selector`);if(!c.ok)return Ue(c.error.message,c.error.field);let b=qo(o.preferredVersion,`${d}.preferredVersion`);if(!b.ok)return Ue(b.error.message,b.error.field);if(!Ce(c.value,b.value.value))return Ue(`Preferred OS release '${o.preferredVersion}' does not satisfy the configured default predicate.`,`${d}.preferredVersion`);return K(c.value)}function _u(o,d){if(o.kind==="archetype")return o.archetype;return o.kind==="model-type"?vt(o.modelType):d?.archetype}function Bi(o,d){let c=o.os.archetypes??[],b=d===void 0?-1:c.findIndex((R)=>R.archetype===d);return b===-1?void 0:{policy:c[b],index:b}}function ps(o,d){return o.kind==="omitted"?K(d):et(o)}function fs(o,d,c,b){return{policyVersion:o.policyVersion,catalogSource:d.provenance.source,catalogRevision:d.provenance.revision,defaultsApplied:c,...b===void 0?{}:{osDefaultArchetype:b}}}function Ru(o,d){if(d.hardware.omitted!=="phone"&&d.hardware.omitted!=="tablet"&&d.hardware.omitted!=="duo")return Ue("The omitted iOS hardware default is invalid.","defaults.hardware.omitted");return K(o.hardware.kind==="omitted"?{kind:"archetype",archetype:d.hardware.omitted}:o.hardware)}function Pu(o,d){return o.kind==="exact-model"?$t(o.model,d):K(void 0)}function gs(o){let d=[];if(o.hardware.kind==="omitted")d.push("hardware-archetype");if(o.os.kind==="omitted")d.push("os-predicate");return d}function Eu(o,d,c){let b=Ru(o,d);if(!b.ok)return b;let R=ki(d.os);if(!R.ok)return R;let P=Pu(b.value,c);if(!P.ok)return P;let C=o.os.kind==="omitted"?Bi(d,_u(b.value,P.value)):void 0,D=C===void 0?R:ki(C.policy,`defaults.os.archetypes[${C.index}]`);if(!D.ok)return D;let k=ps(o.os,D.value);if(!k.ok)return k;return K({platform:"ios",original:o,effective:{hardware:b.value,os:k.value},...P.value===void 0?{}:{exactModel:P.value},provenance:fs(d,c,gs(o),C?.policy.archetype)})}function xu(o,d,c){if(d.hardware.omitted!=="phone"&&d.hardware.omitted!=="tablet"&&d.hardware.omitted!=="foldable")return Ue("The omitted Android hardware default must be phone, tablet or foldable.","defaults.hardware.omitted");let b=ki(d.os);if(!b.ok)return b;let R=o.hardware.kind==="omitted"?{kind:"archetype",archetype:d.hardware.omitted}:o.hardware,P=ps(o.os,b.value);if(!P.ok)return P;let C=R.kind==="exact-profile"?Ht(R.profileId,c):K(void 0);if(!C.ok)return C;return K({platform:"android",original:o,effective:{hardware:R,os:P.value},...C.value===void 0?{}:{exactProfile:C.value},provenance:fs(d,c,gs(o))})}function O4(o,d,c){let b=wt(o);if(!b.ok)return b;if(b.value.platform==="watchos")return Ue("A watchOS requirement is not resolved through host defaults.");let R=os(b.value.platform,d,c);if(!R.ok)return R;if(b.value.platform==="ios"&&d.platform==="ios"&&c.platform==="ios")return Eu(b.value,d,c);if(b.value.platform==="android"&&d.platform==="android"&&c.platform==="android")return xu(b.value,d,c);return Ue("Requirement context could not be narrowed to one platform.")}function Ae(o,d){return V("invalid_config",o,d===void 0?{}:{field:d})}function Mi(o,d,c){let b=o.filter(d);if(b.length===0)return Ae(`Missing ${c}.`);if(b.length>1)return Ae(`Conflicting ${c} entries.`);return K(b[0])}function hs(o,d,c){let b=Mi(d.hardware.modelTypes,(P)=>Ai(P.modelType,o),`exact-model default for ${Ze(o)}`);if(!b.ok)return b;let R=$t(b.value.model,c,"defaults.hardware.modelTypes.model");if(!R.ok)return Ae(R.error.message,R.error.field);if(!R.value.modelType||!Ai(R.value.modelType,o))return Ae(`Configured model '${R.value.name}' does not belong to ${Ze(o)}.`,"defaults.hardware.modelTypes");return K(R.value)}function Au(o,d,c){let b=o.effective.hardware;if(b.kind==="exact-model")return o.exactModel?K({model:o.exactModel,by:"explicit-model",path:[]}):V("catalog_metadata_invalid","Normalized exact iOS model is missing.");if(b.kind==="model-type"){let C=hs(b.modelType,d,c);return C.ok?K({model:C.value,by:"model-type-default",path:[Ze(b.modelType),C.value.simulatorDeviceTypeIdentifier]}):C}let R=Mi(d.hardware.archetypes,(C)=>C.archetype===b.archetype,`model-type default for iOS ${b.archetype}`);if(!R.ok)return R;if(vt(R.value.modelType)!==b.archetype)return Ae(`The ${b.archetype} default points to ${Ze(R.value.modelType)}.`,"defaults.hardware.archetypes");let P=hs(R.value.modelType,d,c);return P.ok?K({model:P.value,by:"archetype-default",path:[b.archetype,Ze(R.value.modelType),P.value.simulatorDeviceTypeIdentifier]}):P}function Nq(o,d){let c=Wt(o);if(c===void 0)return V("unsupported_hardware","The Android request has no classified archetype.");if(c==="foldable"&&!d.hardware.profiles.some((b)=>b.archetype===c))return V("unsupported_hardware","This host has no foldable profile mapped. Configure defaults.android.hardware.profiles with a foldable profileId and classify it in androidProfileArchetypes.");return Mi(d.hardware.profiles,(b)=>b.archetype===c,`Android ${c} profile default`)}function ys(o,d){let c=d.hardware.profiles.filter((R)=>R.profileId===o.profileId),b=c.length>0?c:d.hardware.profiles.filter((R)=>R.archetype===o.archetype);if(b.length>1)return Ae(`Conflicting Android ${o.archetype} profile default entries.`,"defaults.hardware.profiles");return K(b[0])}function YZ(o,d){let c=o.exactProfile?ys(o.exactProfile,d):Nq(o,d);return c.ok?K(c.value?.memoryMb):c}function Tu(o,d,c){let b=Ht(o.profileId,c);if(!b.ok)return b;let R=ys(b.value,d);if(!R.ok)return R;return K({profile:b.value,by:"explicit-model",path:["exact-profile",b.value.profileId],...R.value?.memoryMb===void 0?{}:{memoryMb:R.value.memoryMb}})}function Du(o,d,c){if(o.exactProfile)return Tu(o.exactProfile,d,c);let b=Nq(o,d);if(!b.ok)return b;let R=b.value.archetype,P=c.profiles.filter((D)=>D.profileId===b.value.profileId);if(P.length===0)return V("unsupported_hardware",`Configured Android ${R} profile '${b.value.profileId}' is not installed. Install it and configure defaults.android.hardware.profiles.`,{field:"defaults.hardware.profiles"});if(P.length>1)return V("catalog_metadata_invalid",`Android profile '${b.value.profileId}' is duplicated in the catalog.`);let C=P[0];if(C.metadataState!=="current"||!C.archetype)return V("catalog_metadata_invalid",`Android profile '${C.profileId}' lacks current archetype metadata.`);if(C.archetype!==R)return Ae(`Configured Android profile '${C.profileId}' is ${C.archetype}, not ${R}. Configure defaults.android.hardware.profiles with an installed ${R} profile and check androidProfileArchetypes.`,"defaults.hardware.profiles");return K({profile:{...C,archetype:R},by:"archetype-default",path:[R,C.profileId],...b.value.memoryMb===void 0?{}:{memoryMb:b.value.memoryMb}})}function Iu(o){return o.filter((d)=>d.installed&&d.metadataState==="current"&&d.osVersion!==void 0&&qo(d.osVersion).ok)}function ku(o){return o.filter((d)=>d.installed&&d.metadataState==="current"&&d.osVersion!==void 0&&d.apiLevel>0&&d.abi.length>0&&d.flavor.length>0&&qo(d.osVersion).ok)}function ws(o,d,c){return o.sort((b,R)=>Me(d(R),d(b))||c(b).localeCompare(c(R)))}function Bu(o,d,c,b){let P=Iu(c).filter((k)=>Ce(o,k.osVersion));if(P.length===0)return Ss(o,c,"ios");if(o.kind!=="exact"){let k=Kt(b.minOsVersion,b,"minimum"),O=Kt(b.maxOsVersion,b,"maximum");if(k.ok&&O.ok){let F=P.filter((q)=>!bs(q.osVersion,k.value,O.value));if(F.length>0)P=F}}let C=ws(P,(k)=>k.osVersion,(k)=>k.runtimeId);if(o.kind==="exact")return K({release:C[0],by:"exact"});let D=C.find((k)=>Me(k.osVersion,d)===0);return K(D?{release:D,by:"preferred-default"}:{release:C[0],by:"highest-satisfying"})}function Ou(o,d){let c=qo(o);if(!c.ok)return!1;return d.some((b)=>{let R=qo(b.osVersion);if(!R.ok||Vt(b.versionPrecision)>=c.value.precision)return!1;let P=Vt(b.versionPrecision);return c.value.components.slice(0,P).every((C,D)=>C===(R.value.components[D]??"0"))})}function Mu(o){return(d)=>{let c=o.indexOf(d.abi),b=c===-1?o.length:c,R=d.flavor==="google_apis"?"0":"1";return`${String(b).padStart(3,"0")}|${R}|${d.systemImagePackage}`}}function Nu(o,d){let c=o.kind==="major"?o.major:qo(o.version),b=typeof c==="number"?c:c.ok?Number(c.value.components[0]):void 0,R=d.find((P)=>P.apiLevel===b&&Number(P.osVersion.split(".")[0])!==b);return R?V("missing_installed_runtime",`No installed runtime satisfies ${Oi(o)}. Android os selectors use the release version (for example 16), not the API level; API level ${R.apiLevel} is Android ${R.osVersion}.`,{field:"os"}):void 0}function Fu(o,d,c,b=[]){let R=ku(c),P=R.filter((k)=>jt(o,k.osVersion,k.versionPrecision));if(P.length===0){if(o.kind==="exact"&&Ou(o.version,R))return V("unsupported_version_precision",`Installed Android metadata cannot prove exact release '${o.version}'.`,{field:"os.version"});return Nu(o,R)??Ss(o,c,"android")}let C=ws(P,(k)=>k.osVersion,Mu(b));if(o.kind==="exact")return K({release:C[0],by:"exact"});let D=C.find((k)=>Me(k.osVersion,d)===0);return K(D?{release:D,by:"preferred-default"}:{release:C[0],by:"highest-satisfying"})}function Oi(o){return o.kind==="major"?`major ${o.major}`:`${o.kind} ${o.version}`}function Ss(o,d,c){let b=d.some((P)=>P.installed&&(P.osVersion!==void 0||c==="ios")&&(P.osVersion===void 0||!qo(P.osVersion).ok||P.metadataState!=="current"&&Ce(o,P.osVersion))),R=d.filter((P)=>c==="android"&&P.installed&&P.osVersion===void 0).length;return b?V("catalog_metadata_invalid",`Installed release metadata is stale or incomplete for ${Oi(o)}.`):V("missing_installed_runtime",`No installed runtime satisfies ${Oi(o)}.${R>0?` ${R} installed system image(s) were skipped because their Android release is not recognized.`:""}`)}function Kt(o,d,c){if(o===void 0||o===null)return K(void 0);let b=qo(o);if(!b.ok)return V("catalog_metadata_invalid",`Model '${d.name}' has a malformed ${c} runtime version.`);return K(b.value.value)}function bs(o,d,c){if(d!==void 0&&Me(o,d)<0)return!0;return c!==void 0&&Me(o,c)>0}function Lu(o,d){let c=Kt(o.minOsVersion,o,"minimum");if(!c.ok)return c;let b=Kt(o.maxOsVersion,o,"maximum");if(!b.ok)return b;if(bs(d,c.value,b.value))return V("runtime_incompatible",`Model '${o.name}' is incompatible with iOS ${d}; the exact pair was preserved.`);return K(c.value!==void 0||b.value!==void 0?"supported":"unknown")}function _s(o,d,c,b){return{original:o.original,effective:o.effective,resolvedHardwareBy:d,resolvedOsBy:b,hardwareDefaultPath:c,...o.provenance.osDefaultArchetype===void 0?{}:{osDefaultArchetype:o.provenance.osDefaultArchetype},policyVersion:o.provenance.policyVersion,catalogSource:o.provenance.catalogSource,catalogRevision:o.provenance.catalogRevision}}function qu(o,d,c){if(o.ok||o.error.code!=="runtime_incompatible"||d.original.os.kind!=="omitted"||d.provenance.osDefaultArchetype!==void 0||c.archetype===void 0)return o;return{ok:!1,error:{...o.error,message:`${o.error.message} The request omitted the OS, so the host's platform default applied; add a defaults.ios.os.archetypes entry for "${c.archetype}" to give that hardware its own OS default, or pass an os selector in the request.`}}}function $u(o,d,c){let b=Au(o,d,c);if(!b.ok)return b;let R=o.provenance.osDefaultArchetype,P=Bu(o.effective.os,Bi(d,R)?.policy.preferredVersion??d.os.preferredVersion,c.releases,b.value.model);if(!P.ok)return P;let C=Lu(b.value.model,P.value.release.osVersion);if(!C.ok)return qu(C,o,b.value.model);let D=b.value.model;if(!D.archetype||!D.modelType)return V("catalog_metadata_invalid",`Model '${D.name}' lost classification.`);let k={platform:"ios",metadataState:"current",simulatorDeviceTypeIdentifier:D.simulatorDeviceTypeIdentifier,...D.modelIdentifier===void 0?{}:{modelIdentifier:D.modelIdentifier},archetype:D.archetype,modelType:D.modelType,runtimeId:P.value.release.runtimeId,osVersion:P.value.release.osVersion,compatibility:C.value};return K({platform:"ios",requirement:o,profile:k,provenance:_s(o,b.value.by,b.value.path,P.value.by)})}function Hu(o,d,c){let b=Du(o,d,c);if(!b.ok)return b;let R=Fu(o.effective.os,d.os.preferredVersion,c.releases,c.hostAbis);if(!R.ok)return R;let P=R.value.release,C={platform:"android",metadataState:"current",profileId:b.value.profile.profileId,...b.value.memoryMb===void 0?{}:{memoryMb:b.value.memoryMb},archetype:b.value.profile.archetype,systemImagePackage:P.systemImagePackage,osVersion:P.osVersion,versionPrecision:P.versionPrecision,apiLevel:P.apiLevel,abi:P.abi,flavor:P.flavor};return K({platform:"android",requirement:o,profile:C,provenance:_s(o,b.value.by,b.value.path,R.value.by)})}function M4(o,d,c){if(o.platform==="ios"&&d.platform==="ios"&&c.platform==="ios")return $u(o,d,c);if(o.platform==="android"&&d.platform==="android"&&c.platform==="android")return Hu(o,d,c);return Ae("Normalized requirement, defaults, and catalog platforms differ.")}var o_={mode:"none",status:"device_ready"};function N4(o,d){if(d.sessionUuid.length===0)return!1;let{mode:c,status:b}=d.readiness;return o==="watchos"?c===o_.mode&&b===o_.status:c==="automation"&&b==="automation_ready"}function Fq(o){return o==="watchos"?"a booted, session-bound state":"automation readiness"}async function JZ(o,d,{fingerprint:c,signal:b,exportIdentity:R}){let P=d.device;if(P.platform!=="watchos")throw new t("Watch admission requires a watchOS session request");let C=await o.catalog("watchos",b);if(C.platform!=="watchos")throw new t("The session broker's watch catalog reader returned another platform");let D=US(Ti(P,C));return{requestId:d.requestId,fingerprint:c,parameters:d,owner:o.owner,export:R,limits:o.limits,matches:(k)=>Ii(D,f0(k)).kind==="match",resolveCreation:()=>({platform:"watchos",requirement:D,profile:D.profile})}}function Rs(o,d){return o&&d&&Ln(d).platform==="watchos"?{readiness:{...o_}}:{}}import{createHash as Wu}from"crypto";var sp="session_request_abandoned",Ni="Session request was abandoned by its liveness owner",Ps=Object.freeze({internalReceipt:sp});function s_(o,d){return Wu("sha256").update(Fr({config:o,livenessOwnerToken:d})).digest("hex")}function xs(o){return{fingerprint:s_(Ps,o),parameters:Ps}}function Vu(o,d){let c=o.errorCode??"session_preparation_failed",b=o.retryable&&(["eviction_pending","session_broker_stopping"].includes(c)||!d);return{code:c,message:o.error??"",retryable:b,...b&&c==="eviction_pending"?{retryAfterMs:1000}:{},...b&&c==="session_broker_stopping"?{retryAfterMs:tl}:{},...b&&["capacity_exhausted","cancelled","eviction_pending","session_broker_stopping"].includes(c)?{retryRequires:"new_request_id"}:{}}}function Lq(o){if(o instanceof tn)return{code:o.code,message:o.message,retryable:o.retryable,remedy:o.remedy,writerVersions:o.writerVersions};return o instanceof xa?o.failure:{code:"session_preparation_failed",message:r(o),retryable:!1}}function F4(o){return o.aborted&&o.reason instanceof rl}function XZ(o,d){if(F4(d))return new xa({code:"session_broker_stopping",retryable:!0,retryAfterMs:tl,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(o instanceof xa||!d.aborted)return o;return new xa({code:"cancelled",retryable:!0,message:`Session preparation was cancelled: ${r(d.reason)}`})}function Bq(o,d){return{contractVersion:1,requestId:o.requestId,outcome:"failed",sessionUuid:null,profile:null,cleanupPending:!1,failure:d}}function Sm(o,d){return o.daemonId===d.daemonId&&o.pid===d.pid&&o.processGenerationToken===d.processGenerationToken}function ZZ(o,d,c){if(o instanceof i_)return e.warn(`Session ${d} clean release exhausted capacity wait: ${o.message}`),"destroy";if(o instanceof $n)return e.warn(`Session ${d} clean release awaits boot capacity: ${r(o)}`),"pending";e.warn(`Session ${d} could not finish its clean release: ${r(o)}`);let b=$S(o);if(b==="permanent"||!c&&b==="unknown")return"destroy";return"pending"}function QZ(o,d,c){let b=d?.requestId===o.requestId&&["destroying","resetting","unknown"].includes(d.state),R=o.errorCode===sp&&c,P=Boolean(b||R);return{contractVersion:1,requestId:o.requestId,outcome:o.state==="active"?"ready":o.state==="failed"?"failed":o.state==="released"?"released":"pending",sessionUuid:o.sessionId,profile:d?Ln(d):null,...Rs(o.state==="active",d),cleanupPending:P,...o.timing?{timing:o.timing}:{},...o.error?{failure:Vu(o,P)}:{}}}function eQ(o,d,c){return o.errorCode===sp?d:{...d,failure:{...c,retryable:Boolean(d.failure?.retryable),...d.failure?.retryAfterMs!==void 0?{retryAfterMs:d.failure.retryAfterMs}:{},...d.failure?.retryRequires?{retryRequires:d.failure.retryRequires}:{}}}}async function Cs(o,d){return(await o.selectFrom("session_broker_requests").select(({fn:b})=>b.countAll().as("count")).where("state","!=","released").where("request_id","!=",d).where(({or:b,eb:R,exists:P,selectFrom:C})=>b([R("state","!=","failed"),P(C("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 Fi(o){return o.filter((d)=>d.state!=="destroyed").map((d)=>({id:d.resourceId,state:d.state,idleOrder:d.idleOrder,compatible:!1}))}class Ci extends t{reset;constructor(o,d,c){super(o,c);this.reset=d}}function ju(o,d,c,{kind:b,now:R,creationProfile:P}){if(b==="wait"||o.admission!=="wait"&&o.admission!=="reuse"&&(b!=="reuse"||o.admission!=="evict-then-create"))return{};let C={...o,admission:b==="evict"?"evict-then-create":b,reuseCount:b==="reuse"?c.reuseCount??0:0,admissionWaitMs:R-o.startedAtMs,totalMs:R-o.startedAtMs,...b==="reuse"?{createMs:0,bootMs:0}:{}};return{timing_json:JSON.stringify({...d.timing,acquisition:C}),timing_profile_json:JSON.stringify(Ln(b==="evict"?{profile:P}:c)),timing_updated_at_ms:R}}function Li(o,d,c,b){let{kind:R,now:P,creationProfile:C}=b;if(o.timingStartedAtMs===void 0)return{};let D=d.timing?.acquisition;if(D)return ju(D,d,c,b);let k={admission:R==="evict"?"evict-then-create":R,reuseCount:R==="reuse"?c.reuseCount??0:0,outcome:"pending",startedAtMs:o.timingStartedAtMs,queueMs:0,admissionWaitMs:P-o.timingStartedAtMs,totalMs:P-o.timingStartedAtMs,...R==="reuse"?{createMs:0,bootMs:0}:{}};return{timing_json:JSON.stringify({acquisition:k}),timing_profile_json:JSON.stringify(Ln(R==="evict"?{profile:C}:c)),timing_updated_at_ms:P}}function As(o,d,c,b){let R=o.timing?.acquisition;if(!R)return{};let P={...R,...c,...R.admission==="reuse"?{createMs:0,bootMs:0}:{},reuseCount:d.reuseCount??0,outcome:"ready",completedAtMs:b,totalMs:b-R.startedAtMs};return{timing_json:JSON.stringify({...o.timing,acquisition:P}),timing_profile_json:JSON.stringify(Ln(d)),timing_updated_at_ms:b}}class L4{store;timer;constructor(o,d){this.store=o;this.timer=d}async recordFailedAcquisition(o){try{let d=o.timing?.acquisition;if(!d||d.outcome!=="pending")return!0;let c={...d,outcome:"failed",completedAtMs:this.timer.now(),totalMs:this.timer.now()-d.startedAtMs};return await this.store.recordTiming(o.requestId,{acquisition:c}),o.timing={...o.timing,acquisition:c},e.info(`[SessionBroker] acquisition ${JSON.stringify({requestId:o.requestId,profile:o.timingProfile,...c})}`),!0}catch(d){return e.warn(`Could not record failed acquisition ${o.requestId}`,d),!1}}async recordRefusedAdmission(o){if(o.kind==="refused")await this.recordFailedAcquisition(o.request)}logReadyAcquisition(o,d){let c=o.timing?.acquisition;if(!c)return;e.info(`[SessionBroker] acquisition ${JSON.stringify({requestId:o.requestId,profile:Ln(d),...c})}`)}initialResetTiming(o,d){return{mode:"none",outcome:"pending",phases:{},reuseCount:d.reuseCount??0,startedAtMs:this.timer.now(),totalMs:0}}async recordResetTiming(o,d,c){try{if((await this.store.getResource(d.resourceId))?.state==="destroyed")c=Gt(c,this.timer.now());if(c.totalMs=this.timer.now()-c.startedAtMs,c.outcome!=="pending")c.completedAtMs=this.timer.now();return await this.store.recordTiming(o.requestId,{reset:c},Ln(d)),e.info(`[SessionBroker] reset ${JSON.stringify({requestId:o.requestId,profile:Ln(d),...c})}`),!0}catch(b){return e.warn(`Could not record reset timing ${o.requestId}`,b),!1}}mergeResetTiming(o,d){return typeof d==="object"?{...o,...d,phases:{...o.phases,...d.phases}}:{...o,outcome:d}}failedResetTiming(o,d){return{...d instanceof Ci?this.mergeResetTiming(o,d.reset):o,outcome:"pending",fallbackReason:r(d)}}}function Gt(o,d){return{...o,outcome:"destroyed",retired:!0,completedAtMs:d,totalMs:d-o.startedAtMs}}var ge=T().finite().nonnegative(),Jt=T().finite(),Ku=g({acquisition:g({admission:A(["reuse","create","evict-then-create","wait"]),reuseCount:ge.int(),outcome:A(["pending","ready","failed"]),startedAtMs:Jt,completedAtMs:Jt.optional(),queueMs:ge,admissionWaitMs:ge,createMs:ge.optional(),bootMs:ge.optional(),automationReadyMs:ge.optional(),totalMs:ge}).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:te().optional(),phases:Dt(y(),ge),fallbackReason:y().optional(),reuseCount:ge.int(),startedAtMs:Jt,completedAtMs:Jt.optional(),totalMs:ge}).optional()}),Gu=g({timing:Ku,profile:xi.optional()});function zt(o,d){try{let c=Gu.safeParse({timing:JSON.parse(o),...d?{profile:JSON.parse(d)}:{}});if(c.success)return c.data;e.warn("Ignoring invalid session broker timing receipt",c.error);return}catch(c){e.warn("Ignoring corrupt session broker timing JSON",c);return}}async function me(o,d){let c=await o.selectFrom("session_broker_requests").selectAll().where("request_id","=",d).executeTakeFirst();return c&&he(c)}async function Te(o,d){let c=await o.selectFrom("session_broker_resources").selectAll().where("resource_id","=",d).executeTakeFirst();return c&&St(c)}function he(o){let d=o.timing_json?zt(o.timing_json,o.timing_profile_json):void 0,{restartHandoff:c,...b}=JSON.parse(o.owner_json);return{requestId:o.request_id,fingerprint:o.fingerprint,parameters:JSON.parse(o.parameters_json),owner:b,...c===!0?{restartHandoff:!0}:{},state:o.state,resourceId:o.resource_id,sessionId:o.session_id,error:o.error,errorCode:o.error_code,retryable:o.retryable===1,...d?{timing:d.timing,timingProfile:d.profile}:{}}}function St(o){return{resourceId:o.resource_id,allocationIndex:o.allocation_index,scopeKey:o.scope_key,profile:JSON.parse(o.profile_json),state:o.state,requestId:o.request_id,revision:o.revision,idleOrder:o.idle_order,reuseCount:o.reuse_count}}class Xt{db;clock;constructor(o,d){this.db=o;this.clock=d}async recordTiming(o,d,c){let b=async(R)=>{let P=await me(R,o);if(!P)return;if(d.acquisition?.outcome==="failed"&&(P.state!=="failed"||P.timing?.acquisition?.outcome==="ready"))return;let C=await this.finalResetTiming(R,P,d.reset);await R.updateTable("session_broker_requests").set({timing_json:JSON.stringify({...P.timing,...d,...C?{reset:C}:{}}),...c?{timing_profile_json:JSON.stringify(c)}:{},timing_updated_at_ms:this.clock.now()}).where("request_id","=",o).execute()};await(this.db.isTransaction?b(this.db):this.db.transaction().execute(b))}async finalResetTiming(o,d,c){if(!c||!d.resourceId)return c;let b=await Te(o,d.resourceId);return b?.requestId===d.requestId&&b.state==="destroyed"?Gt(c,this.clock.now()):c}async timingSamples(o,d,c){return(await this.db.selectFrom("session_broker_requests").select(["timing_json","timing_profile_json"]).where("timing_updated_at_ms",">=",o).where("timing_updated_at_ms","<=",d).where("timing_json","is not",null).where("timing_profile_json","is not",null).orderBy("timing_updated_at_ms","desc").orderBy("request_id").limit(c).execute()).flatMap((R)=>{let P=zt(R.timing_json,R.timing_profile_json);return P?.profile?[{timing:P.timing,profile:P.profile}]:[]})}async confirmDestroyed(o,d){if(!d)return;let c=await me(o,d);if(c?.timing?.reset&&c.timing.reset.outcome!=="destroyed")await o.updateTable("session_broker_requests").set({timing_json:JSON.stringify({...c.timing,reset:Gt(c.timing.reset,this.clock.now())}),timing_updated_at_ms:this.clock.now()}).where("request_id","=",c.requestId).execute()}}function Ts(o){return o==="released"||o==="failed"}function qi(o,d,c){return Boolean(o?.stable_device_id&&o.state==="ready"&&o.exec_session_uuid===d&&o.exec_owner_daemon_id===c.daemonId&&o.exec_owner_pid===c.pid&&o.exec_owner_process_token===(c.processGenerationToken??null))}function Ui(o){return{daemonId:o.daemonId,pid:o.pid,...o.processGenerationToken===void 0?{}:{processGenerationToken:o.processGenerationToken}}}function de(o,d){if(o===void 0||o===null)throw new Pe(d);return o}var h0=15552000000;class av extends t{code="session_export_identity_mismatch";constructor(){super("Session export identity, digest, or liveness owner does not match the request")}}function pc(o){return{resourceId:o.resourceId,revision:o.revision}}function Ds(o,d){return o.state==="idle"&&(!d||d.some((c)=>c.resourceId===o.resourceId&&c.revision===o.revision))}var Is=["released","failed"];async function Hi(o,d){let c=await o.selectFrom("session_broker_exports").selectAll().where("prepare_id","=",d).executeTakeFirst();return c&&{prepareId:c.prepare_id,requestId:c.request_id,requestDigest:c.request_digest,createdAtMs:c.created_at_ms,acknowledgedAtMs:c.acknowledged_at_ms}}async function Bs(o,d,c){return await o.updateTable("session_broker_exports").set({acknowledged_at_ms:c}).where("prepare_id","=",d).where("acknowledged_at_ms","is",null).execute(),Hi(o,d)}async function Os(o,d,c,{fingerprint:b,identity:R}){let P=async(C)=>{let D=await C.selectFrom("session_broker_requests").select("fingerprint").where("request_id","=",c).executeTakeFirst();if(!D||D.fingerprint!==b)throw new av;await tt(C,c,R,d)};await(o.isTransaction?P(o):o.transaction().execute(P))}async function tt(o,d,c,b){if(!c)return;let R=await o.selectFrom("session_broker_exports").selectAll().where((P)=>P.or([P("request_id","=",d),P("prepare_id","=",c.prepareId)])).execute();if(R.length>0){if(R.length!==1||R[0].request_id!==d||R[0].prepare_id!==c.prepareId||R[0].request_digest!==c.requestDigest)throw new av;return}await o.insertInto("session_broker_exports").values({prepare_id:c.prepareId,request_id:d,request_digest:c.requestDigest,created_at_ms:b,acknowledged_at_ms:null}).execute()}async function Ms(o,d,c,{limit:b,exportRetentionMs:R=h0}){if(!Number.isFinite(c)||c<0||!Number.isFinite(R)||R<0||!Number.isInteger(b)||b<1)throw new t("Receipt retention needs a non-negative window and a positive limit");let P=async(C)=>{let D=d.now();await C.updateTable("session_broker_requests").set({terminal_at_ms:D}).where("state","in",Is).where("terminal_at_ms","is",null).execute();let O=(await C.selectFrom("session_broker_requests").select("request_id").where("state","in",Is).where("terminal_at_ms","<=",D-c).where(({not:F,exists:q,selectFrom:M})=>F(q(M("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",">",D-R)))).where(({not:F,exists:q,selectFrom:M})=>F(q(M("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((F)=>F.request_id);if(O.length===0)return await Qt(C),0;return await C.updateTable("session_broker_resources").set({request_id:null}).where("request_id","in",O).execute(),await C.deleteFrom("session_broker_exports").where("request_id","in",O).execute(),await C.deleteFrom("session_broker_requests").where("request_id","in",O).execute(),await Qt(C),O.length};return o.isTransaction?P(o):o.transaction().execute(P)}async function Qt(o,d){await o.deleteFrom("session_broker_resources").where("state","=","destroyed").where("request_id","is",null).$if(d!==void 0,(c)=>c.where("resource_id","=",d)).where(({not:c,exists:b,selectFrom:R})=>c(b(R("session_broker_requests").select("request_id").whereRef("session_broker_requests.resource_id","=","session_broker_resources.resource_id")))).execute()}var wm="session_owner_exited",$q="Session owner exited before relinquishing its device; cleanup remains owned by the broker",tQ="No preparation budget remains";var Ju=new Set(["reserved","active","idle","resetting","destroying","unknown"]);function Zt(o,d){if(!Number.isInteger(o)||o<0)throw TypeError(`${d} must be an integer greater than or equal to zero`)}function Fs(o){if(typeof o!=="object"||o===null)throw TypeError("limits must be an object");if(o.sessionCap!==void 0)Zt(o.sessionCap,"limits.sessionCap");if(o.totalDeviceCap!==void 0)Zt(o.totalDeviceCap,"limits.totalDeviceCap");if(o.idlePoolCap!==void 0)Zt(o.idlePoolCap,"limits.idlePoolCap");if(o.maxConcurrentResetBoots!==void 0&&(!Number.isSafeInteger(o.maxConcurrentResetBoots)||o.maxConcurrentResetBoots<1))throw TypeError("limits.maxConcurrentResetBoots must be a positive integer")}function zu(o,d){let c=`snapshot.resources[${d}]`;if(typeof o!=="object"||o===null)throw TypeError(`${c} must be an object`);if(typeof o.id!=="string"||o.id.trim().length===0)throw TypeError(`${c}.id must be a non-blank string`);if(!Ju.has(o.state))throw TypeError(`${c}.state is invalid`);if(typeof o.idleOrder!=="number"||!Number.isFinite(o.idleOrder))throw TypeError(`${c}.idleOrder must be a finite number`);if(typeof o.compatible!=="boolean")throw TypeError(`${c}.compatible must be a boolean`);if(o.expectedReadyMs!==void 0&&(!Number.isFinite(o.expectedReadyMs)||o.expectedReadyMs<0))throw TypeError(`${c}.expectedReadyMs must be nonnegative and finite`)}function Ls(o){if(typeof o!=="object"||o===null)throw TypeError("snapshot must be an object");if(Zt(o.activeOrAcquiringSessions,"snapshot.activeOrAcquiringSessions"),!Array.isArray(o.resources))throw TypeError("snapshot.resources must be an array");if(o.resetWaitThresholdMs!==void 0&&(!Number.isFinite(o.resetWaitThresholdMs)||o.resetWaitThresholdMs<0))throw TypeError("snapshot.resetWaitThresholdMs must be nonnegative and finite");let d=new Set;for(let c=0;c<o.resources.length;c+=1){let b=o.resources[c];if(zu(b,c),d.has(b.id))throw TypeError(`snapshot.resources contains duplicate id '${b.id}'`);d.add(b.id)}}function Yu(o,d){return o.idleOrder-d.idleOrder||o.id.localeCompare(d.id)}function Wi(o){return o.resources.filter((d)=>d.state==="idle").sort(Yu)}function Ns(o){return Wi(o)[0]}function Qu(o){return Wi(o).filter((d)=>d.compatible).sort((d,c)=>c.idleOrder-d.idleOrder||d.id.localeCompare(c.id))[0]}function Zu(o,d){return d.totalDeviceCap===0?void 0:Qu(o)}function qs(o,d){if(Fs(d),Ls(o),d.sessionCap!==void 0&&o.activeOrAcquiringSessions>=d.sessionCap)return{kind:"refuse",reason:"session-cap-reached"};let c=Zu(o,d);if(c)return{kind:"reuse",resourceId:c.id};return em(o,d)??tm(o,d)}function em(o,d){if(d.totalDeviceCap===0)return;let c=o.resources.filter((b)=>b.state==="resetting"&&b.compatible&&o.resetWaitThresholdMs!==void 0&&o.resetWaitThresholdMs>0&&b.expectedReadyMs!==void 0&&b.expectedReadyMs>0&&b.expectedReadyMs<=o.resetWaitThresholdMs).sort((b,R)=>b.expectedReadyMs-R.expectedReadyMs||b.id.localeCompare(R.id))[0];if(c&&o.resetWaitThresholdMs>0)return{kind:"wait",resourceId:c.id,waitMs:Math.min(c.expectedReadyMs,o.resetWaitThresholdMs)};return}function tm(o,d){let c=o.resources.length;if(d.totalDeviceCap!==void 0&&c>d.totalDeviceCap){let R=Ns(o);return R?{kind:"evict",resourceId:R.id}:{kind:"refuse",reason:"total-device-cap-exceeded"}}if(d.totalDeviceCap===void 0||c<d.totalDeviceCap)return{kind:"create"};let b=Ns(o);return b?{kind:"evict",resourceId:b.id}:{kind:"refuse",reason:"total-device-cap-reached"}}function Hs(o,d){Fs(d),Ls(o);let c=Wi(o),b=d.totalDeviceCap===void 0?0:Math.max(0,o.resources.length-d.totalDeviceCap),R=d.idlePoolCap===void 0?0:Math.max(0,c.length-d.idlePoolCap),P=Math.max(b,R);return c.slice(0,P).map((C)=>C.id)}class Vi{db;scopeKey;isOwnerLive;timingStore;ids;clock;write;constructor(o,d,c,{ids:b=B,clock:R=i,write:P=(C)=>C(o)}={}){this.db=o;this.scopeKey=d;this.isOwnerLive=c;this.ids=b,this.clock=R,this.write=P,this.timingStore=new Xt(o,R)}async getRequest(o){return me(this.db,o)}recordTiming(o,d,c){return this.write((b)=>new Xt(b,this.clock).recordTiming(o,d,c))}timingSamples(o,d,c){return this.timingStore.timingSamples(o,d,c)}getExport(o){return Hi(this.db,o)}acknowledgeExport(o,d=this.clock.now()){return this.write((c)=>Bs(c,o,d))}linkRequestExport(o,d,c){return this.write((b)=>Os(b,this.clock.now(),o,{fingerprint:d,identity:c}))}async getSession(o){let d=await this.db.selectFrom("session_broker_requests").selectAll().where("session_id","=",o).executeTakeFirst();return d&&he(d)}async listResources(o){if(o!==void 0){let d=await Te(this.db,o);return d?[d]:[]}return this.readResources(this.db)}async getResource(o){return(await this.listResources(o))[0]}listLiveResources(){return this.readResources(this.db,!0)}async listRequests(){return(await this.db.selectFrom("session_broker_requests").selectAll().execute()).map(he)}async listRecoverableRequests(){return(await this.db.selectFrom("session_broker_requests").selectAll().where((d)=>d.or([d("state","in",["acquiring","active","releasing"]),d.and([d("state","=","failed"),d("error_code","=",sp),d("session_id","is not",null),d.exists(d.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(he)}pruneTerminalRequests(o,d,c){return this.write((b)=>Ms(b,this.clock,o,{limit:d,exportRetentionMs:c}))}writeTransaction(o){return this.write((d)=>d.isTransaction?o(d):d.transaction().execute(o))}async recordPreAdmissionFailure(o,d){if(!o.requestId.trim()||!o.fingerprint.trim())throw new t("Session request identity and fingerprint must be non-empty");return this.writeTransaction(async(c)=>{let b=await me(c,o.requestId);if(b){if(b.fingerprint!==o.fingerprint)throw new t("Session request identity was already used with different parameters");return await tt(c,o.requestId,o.export,this.clock.now()),b}let R=await c.insertInto("session_broker_requests").values({request_id:o.requestId,fingerprint:o.fingerprint,parameters_json:JSON.stringify(o.parameters),owner_json:JSON.stringify(o.owner),state:"failed",resource_id:null,session_id:null,error:d.message,error_code:d.code,retryable:d.retryable?1:0,terminal_at_ms:this.clock.now()}).returningAll().executeTakeFirstOrThrow();return await tt(c,o.requestId,o.export,this.clock.now()),he(R)})}async admit(o){if(!o.requestId.trim()||!o.fingerprint.trim())throw new t("Session request identity and fingerprint must be non-empty");return this.writeTransaction(async(d)=>{let c=await me(d,o.requestId);if(c){if(c.fingerprint!==o.fingerprint)throw new t("Session request identity was already used with different parameters");return await tt(d,o.requestId,o.export,this.clock.now()),{kind:"existing",request:c}}let b=await d.insertInto("session_broker_requests").values({request_id:o.requestId,fingerprint:o.fingerprint,parameters_json:JSON.stringify(o.parameters),owner_json:JSON.stringify(o.owner),state:"acquiring",resource_id:null,session_id:null,error:null,error_code:null,retryable:null,terminal_at_ms:null}).returningAll().executeTakeFirstOrThrow();return await tt(d,o.requestId,o.export,this.clock.now()),this.reserve(d,he(b),o)})}async abandon(o,d,c){if(!o.trim()||!c)throw new t("Session request identity and liveness owner token are required");return this.writeTransaction(async(b)=>{let R=await me(b,o);if(!R){let D=xs(c),k=await b.insertInto("session_broker_requests").values({request_id:o,fingerprint:D.fingerprint,parameters_json:JSON.stringify(D.parameters),owner_json:JSON.stringify(d),state:"failed",resource_id:null,session_id:null,error:Ni,error_code:sp,retryable:0,terminal_at_ms:this.clock.now()}).returningAll().executeTakeFirstOrThrow();return{request:he(k)}}if(R.fingerprint!==s_(R.parameters,c))throw new t("Session request belongs to another liveness owner");if(R.state==="released"||R.state==="failed")return{request:R,...await this.currentDestructionTicket(b,R)};if(!Sm(R.owner,d))throw new BS(R.restartHandoff===!0);let P;if(R.resourceId){let D=await this.ownedResource(b,R);if(D.state!=="destroyed"){let k=D.state==="destroying"?D:await this.updateResource(b,D,{state:"destroying"});P=pc(k)}}return{request:await this.updateRequest(b,o,{state:"failed",error:Ni,error_code:sp,retryable:0}),...P?{ticket:P}:{}}})}async continueAdmission(o){return this.writeTransaction(async(d)=>{let c=await this.ownedRequest(d,o.requestId,o.owner);if(c.fingerprint!==o.fingerprint||c.state!=="acquiring")throw new t("Cannot continue a changed or terminal session request");if(c.resourceId===null)return this.reserve(d,c,o);let b=de(await Te(d,de(c.resourceId,"No admission eviction to resume")),"Admission resource disappeared");if(b.state!=="destroyed"||b.requestId!==c.requestId)throw new t("Admission must wait for confirmed eviction before reserving another device");return this.reserve(d,c,o)})}async activate(o,d,c,b){if(!c.trim())throw new t("A prepared session must have a non-empty session UUID");return this.writeTransaction(async(R)=>{let P=await this.ownedRequest(R,o,d);if(P.state==="active"&&P.sessionId===c)return P;let C=await this.ownedResource(R,P);if(P.state!=="acquiring"||C.state!=="reserved")throw new t("Only the current acquiring request can activate a reservation");let D=await R.selectFrom("slot_assignments").selectAll().where("scope_key","=",C.scopeKey).where("slot_index","=",C.allocationIndex).executeTakeFirst();if(!qi(D,c,d))throw new t("Prepared session does not own the current physical device binding");return await this.updateResource(R,C,{state:"active",...is(C,b?.profile)}),this.updateRequest(R,o,{state:"active",session_id:c,...As(P,C,b,this.clock.now())})})}async beginRelease(o,d){return this.writeTransaction(async(c)=>{let b=await c.selectFrom("session_broker_requests").selectAll().where("session_id","=",o).executeTakeFirst();if(!b)return;if(b.state==="released"||b.state==="failed")return he(b);let R=await this.ownedRequest(c,b.request_id,d);if(R.state!=="active")return R;let P=await this.ownedResource(c,R);if(P.state!=="active")throw new t("Active session lost its resource ownership");return await this.updateResource(c,P,{state:"resetting"}),this.updateRequest(c,R.requestId,{state:"releasing"})})}async completeCleanRelease(o,d,c){return this.writeTransaction(async(b)=>{let R=await this.ownedRequest(b,o,d);if(R.state==="released")return[];let P=await this.ownedResource(b,R);if(R.state!=="releasing"||P.state!=="resetting")throw new Pe("Only a joined, resetting session can return a clean device");let C=await b.selectFrom("slot_assignments").selectAll().where("scope_key","=",P.scopeKey).where("slot_index","=",P.allocationIndex).executeTakeFirst(),D=await this.openJournal(b,P);if(!C?.stable_device_id||C.state!=="ready"||C.exec_session_uuid||D)throw new Pe("Physical device still has execution or journal work; it cannot enter the idle pool");let O=(await this.readResources(b,!0)).reduce((F,q)=>Math.max(F,q.idleOrder),0)+1;return await this.updateResource(b,P,{state:"idle",request_id:null,idle_order:O}),await this.updateRequest(b,o,{state:"released"}),this.trimIdle(b,c,P.resourceId,o)})}async fail(o,d,c,{errorCode:b="session_preparation_failed",retryable:R=!1}={}){return this.failWhere(o,d,{error:c,errorCode:b,retryable:R})}async failInterruptedAcquisition(o,d,c){return this.failWhere(o,d,{error:c,errorCode:"session_preparation_failed",retryable:!1,onlyFrom:"acquiring"})}async failWhere(o,d,c){let{error:b,errorCode:R,retryable:P,onlyFrom:C}=c;return this.writeTransaction(async(D)=>{let k=await this.ownedRequest(D,o,d);if(k.state==="released"||k.state==="failed"||C!==void 0&&k.state!==C)return;let O;if(k.resourceId){let F=await this.ownedResource(D,k);if(F.state!=="destroyed")O=pc(await this.updateResource(D,F,{state:"destroying"}))}return await this.updateRequest(D,o,{state:"failed",error:b,error_code:R,retryable:P?1:0}),O})}async releaseByDestruction(o,d){return this.writeTransaction(async(c)=>{let b=await this.ownedRequest(c,o,d);if(b.state==="released"||b.state==="failed")return;if(b.state!=="releasing")throw new t("Session must relinquish its execution before destruction");let R=await this.ownedResource(c,b);if(R.state==="destroying")return pc(R);return pc(await this.updateResource(c,R,{state:"destroying"}))})}async drainIdle(o){return this.writeTransaction(async(d)=>{let c=await this.readResources(d,!0),b=[];for(let R of c.filter((P)=>Ds(P,o)))b.push(pc(await this.updateResource(d,R,{state:"destroying"})));return b})}async confirmDestroyed(o){return this.writeTransaction(async(d)=>{let c=await Te(d,o.resourceId);if(!c||c.revision!==o.revision)return!1;if(c.state==="destroyed")return!0;if(c.state!=="destroying")return!1;if(await this.physicalWorkPending(d,c))return!1;if(await d.updateTable("session_broker_resources").set({state:"destroyed"}).where("resource_id","=",c.resourceId).execute(),c.requestId)await this.settleRequestAfterDestruction(d,c);else await Qt(d,c.resourceId);return await this.timingStore.confirmDestroyed(d,c.requestId),!0})}async recoverRequest(o,d){return this.writeTransaction(async(c)=>{let b=de(await me(c,o),"Unknown session request");if(Sm(b.owner,d)||this.isOwnerLive(b.owner))return;if(b.state==="released"||b.state==="failed")return;let R;if(b.resourceId){let P=await this.ownedResource(c,b);if(P.state!=="destroyed")R=pc(b.state==="releasing"&&P.state==="destroying"?P:await this.updateResource(c,P,{state:"destroying"}))}return await this.updateRequest(c,o,{owner_json:JSON.stringify(d),state:b.state==="releasing"?"releasing":"failed",error:b.state==="releasing"?null:$q,error_code:b.state==="releasing"?null:wm}),R})}async relinquishForRestart(o,d){return this.writeTransaction(async(c)=>{let b=await this.ownedRequest(c,o,d);if(b.state!=="active"||b.restartHandoff)return b;return this.updateRequest(c,o,{owner_json:JSON.stringify({...Ui(b.owner),restartHandoff:!0})})})}async adoptRestartHandoff(o,d){return this.writeTransaction(async(c)=>{let b=de(await me(c,o),"Unknown session request");if(!b.restartHandoff||b.state!=="active"||!b.sessionId)return"not-handoff";if(Sm(b.owner,d))return"adopted";if(this.isOwnerLive(b.owner))return"pending";let R=await this.ownedResource(c,b),P=await c.selectFrom("slot_assignments").selectAll().where("scope_key","=",R.scopeKey).where("slot_index","=",R.allocationIndex).executeTakeFirst();if(R.state!=="active"||!qi(P,b.sessionId,d))return"pending";return await this.updateRequest(c,o,{owner_json:JSON.stringify(Ui(d))}),"adopted"})}async settleRequestAfterDestruction(o,d){let c=await me(o,de(d.requestId,"No request"));if(c?.resourceId!==d.resourceId)return;if(c.state==="releasing")await this.updateRequest(o,c.requestId,{state:"released"});else if(c.state==="failed")await o.updateTable("session_broker_requests").set({terminal_at_ms:this.clock.now()}).where("request_id","=",c.requestId).execute()}async reserve(o,d,c){let b=await this.readResources(o,!0),R=await Cs(o,d.requestId),P=qs({activeOrAcquiringSessions:R,resetWaitThresholdMs:c.resetReadiness?.thresholdMs,resources:Fi(b).map((k)=>({...k,compatible:(k.state==="idle"||k.state==="resetting")&&c.matches(de(b.find((O)=>O.resourceId===k.id),"Missing resource").profile),expectedReadyMs:c.resetReadiness?.canWait?.(k.id)===!1?void 0:c.resetReadiness?.expectedReadyMs.get(k.id)}))},c.limits);if(P.kind==="wait"){c.resetReadiness?.reserveWait?.(d.requestId,P.resourceId);let k=de(b.find((O)=>O.resourceId===P.resourceId),"Waiting resource disappeared");return{...P,request:await this.updateRequest(o,d.requestId,{...Li(c,d,k,{kind:"wait",now:this.clock.now()})})}}if(P.kind==="refuse")return{kind:"refused",reason:P.reason,request:await this.updateRequest(o,d.requestId,{state:"failed",error:P.reason,error_code:"capacity_exhausted",retryable:1})};let C,D=P.kind==="reuse"?void 0:c.resolveCreation();if(P.kind==="create"){let k=await o.insertInto("session_broker_resources").values({resource_id:this.ids.next(),scope_key:this.scopeKey,profile_json:JSON.stringify(D),state:"reserved",request_id:d.requestId,revision:1,idle_order:0}).returningAll().executeTakeFirstOrThrow();C=St(k)}else{let k=de(b.find((O)=>O.resourceId===P.resourceId),"Admission resource disappeared");C=await this.updateResource(o,k,{state:P.kind==="reuse"?"reserved":"destroying",request_id:d.requestId,reuse_count:(k.reuseCount??0)+(P.kind==="reuse"?1:0)})}return{kind:P.kind,resource:C,request:await this.updateRequest(o,d.requestId,{resource_id:C.resourceId,...Li(c,d,C,{kind:P.kind,now:this.clock.now(),creationProfile:D})})}}async trimIdle(o,d,c,b){let R=await this.readResources(o,!0),P=Hs({activeOrAcquiringSessions:0,resources:Fi(R)},d),C=[];for(let D of P){let k=de(R.find((F)=>F.resourceId===D),"Idle resource disappeared"),O=k.resourceId===c&&b?{state:"destroying",request_id:b}:{state:"destroying"};C.push(pc(await this.updateResource(o,k,O)))}return C}async currentDestructionTicket(o,d){if(!d.resourceId)return{};let c=await Te(o,d.resourceId);return c?.requestId===d.requestId&&c.state==="destroying"?{ticket:pc(c)}:{}}async openJournal(o,d){return o.selectFrom("slot_journal").select("id").where("scope_key","=",d.scopeKey).where("slot_index","=",d.allocationIndex).where("phase","not in",["committed","rolled_back"]).executeTakeFirst()}async physicalWorkPending(o,d){let c=await o.selectFrom("slot_assignments").select(["stable_device_id","exec_session_uuid","state"]).where("scope_key","=",d.scopeKey).where("slot_index","=",d.allocationIndex).executeTakeFirst(),b=await this.openJournal(o,d);return Boolean(c?.stable_device_id||c?.exec_session_uuid||c?.state==="settling"||c?.state==="cleanup_pending"||b)}async readResources(o,d=!1){return(await o.selectFrom("session_broker_resources").selectAll().$if(d,(b)=>b.where("state","!=","destroyed")).orderBy("allocation_index").execute()).map(St)}async ownedRequest(o,d,c){let b=de(await me(o,d),"Unknown session request");if(!Sm(b.owner,c))throw new BS(b.restartHandoff===!0);return b}async ownedResource(o,d){let c=de(await Te(o,de(d.resourceId,"Request has no device reservation")),"Request resource disappeared");if(c.requestId!==d.requestId)throw new Pe("Session request no longer owns this device reservation");return c}async updateResource(o,d,c){let b=await o.updateTable("session_broker_resources").set({...c,revision:d.revision+1}).where("resource_id","=",d.resourceId).returningAll().executeTakeFirstOrThrow();return St(b)}async updateRequest(o,d,c){let b=Ts(c.state)?{terminal_at_ms:this.clock.now()}:{},R=await o.updateTable("session_broker_requests").set({...c,...b}).where("request_id","=",d).returningAll().executeTakeFirstOrThrow();return he(R)}}var bt=Fo("state",[s({state:_("absent")}),s({state:_("present"),value:Yp()}),s({state:_("unobservable")})]);function Di(o){let d=bt.safeParse({state:"present",value:o});return d.success?d.data:{state:"unobservable"}}function du(o,d){if([o.deviceId,o.incarnation,...d===void 0?[]:[d]].some((b)=>b.trim().length===0))throw new t("Device mutation journal requires a durable, non-empty identity")}var ji=s({completeKinds:S(n().min(1)),observations:S(s({kind:n().min(1),key:n().min(1),value:bt})),unobservable:S(n().min(1)),unobservableReasons:Ne(n(),n()).optional()}),HS=["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 Uq="fallback:";function Bn(...o){return`${Uq}${JSON.stringify(o)}`}function qS(o){return o.kind==="opaque"&&o.key.startsWith(Uq)}class Ki{db;timer;constructor(o,d){this.db=o;this.timer=d}async record(o,d){du(o,o.sessionUuid),await this.db.insertInto("device_mutation_journal").values({session_uuid:o.sessionUuid,device_id:o.deviceId,incarnation:o.incarnation,kind:d.kind,mutation_key:d.key,prior_value_json:JSON.stringify(bt.parse(d.priorValue)),applied_at_ms:this.timer.now(),tool_name:d.toolName}).onConflict((c)=>c.columns(["session_uuid","device_id","incarnation","kind","mutation_key"]).doNothing()).execute()}list(o){return this.listIncarnations(o,"=")}listStrayIncarnations(o){return this.listIncarnations(o,"!=")}async listIncarnations(o,d){return du(o,o.sessionUuid),(await this.db.selectFrom("device_mutation_journal").selectAll().where("session_uuid","=",o.sessionUuid).where("device_id","=",o.deviceId).where("incarnation",d,o.incarnation).orderBy("sequence","asc").execute()).map((b)=>({sequence:b.sequence,kind:b.kind,key:b.mutation_key,priorValue:bt.parse(JSON.parse(b.prior_value_json)),appliedAt:b.applied_at_ms,toolName:b.tool_name}))}async deleteSession(o){du(o,o.sessionUuid),await this.db.deleteFrom("device_mutation_journal").where("session_uuid","=",o.sessionUuid).where("device_id","=",o.deviceId).where("incarnation","=",o.incarnation).execute()}async captureBaseline(o,d){du(o),await this.db.insertInto("device_mutation_baselines").values({device_id:o.deviceId,incarnation:o.incarnation,baseline_json:JSON.stringify(ji.parse(d)),captured_at_ms:this.timer.now()}).onConflict((c)=>c.columns(["device_id","incarnation"]).doNothing()).execute()}async getBaseline(o){du(o);let d=await this.db.selectFrom("device_mutation_baselines").select("baseline_json").where("device_id","=",o.deviceId).where("incarnation","=",o.incarnation).executeTakeFirst();return d?ji.parse(JSON.parse(d.baseline_json)):null}async deleteResource(o){du({deviceId:o,incarnation:o});let d=f`incarnation = ${o} OR CASE WHEN json_valid(incarnation) THEN json_extract(incarnation, '$[0]') = ${o} ELSE 0 END`;await this.db.transaction().execute(async(c)=>{await c.deleteFrom("device_mutation_journal").where(d).execute(),await c.deleteFrom("device_mutation_baselines").where(d).execute()})}}class Gi{db;constructor(o){this.db=o}async withLegacyRows(o){let d=await this.db.introspection.getTables();if(!d.some((M)=>M.name==="slot_free_devices"))return;let c=d.some((M)=>M.name==="slot_journal"),b=async(M)=>{let W=(await f`SELECT * FROM slot_scopes ORDER BY scope_key`.execute(M)).rows,U=(await f`SELECT * FROM slot_assignments WHERE role <> ${fh} ORDER BY scope_key, slot_index`.execute(M)).rows,X=(await f`SELECT * FROM slot_free_devices ORDER BY platform, stable_device_id`.execute(M)).rows,z=c?(await f`SELECT * FROM slot_journal WHERE ${mt}
|
|
157
|
+
ORDER BY id`.execute(M)).rows:[],we=(await f`
|
|
158
|
+
SELECT * FROM slot_assignments WHERE role = ${fh} ORDER BY scope_key, slot_index`.execute(M)).rows;return{scopes:W,assignments:U,free:X,journals:z,brokerDevices:we}},R=await b(this.db),{assignments:P,free:C,journals:D,brokerDevices:k}=R,O=[],F=[],q=(M,W,U)=>{if(W!==null&&W!==void 0)F.push({daemonId:M??"legacy",pid:W,processGenerationToken:U??null})};for(let M of P){if(M.stable_device_id!==null||M.device_name!==null)O.push({platform:M.platform,stableId:M.stable_device_id,name:M.device_name});q(M.exec_owner_daemon_id,M.exec_owner_pid,M.exec_owner_process_token),q(M.settler_daemon_id,M.settler_pid,M.settler_process_token)}for(let M of C)O.push({platform:M.platform,stableId:M.stable_device_id,name:null}),q(M.deletion_owner_daemon_id,M.deletion_owner_pid,M.deletion_owner_process_token);for(let M of D.filter((W)=>!["committed","rolled_back"].includes(W.phase))){q(M.owner_daemon_id,M.owner_pid,M.owner_process_token);let W=Ye(M.target_json);for(let U of[{platform:M.platform,stableId:M.binding_stable_device_id,name:W.oldName},{platform:M.platform,stableId:W.oldStableId,name:W.oldName},{platform:W.newPlatform??M.platform,stableId:W.newStableId,name:W.newName}])if(U.stableId||U.name)O.push(U)}if(O.some((M)=>k.some((W)=>rm(M,W))))throw new t("Legacy retirement overlaps a broker device; reconcile the duplicate legacy row before retrying");await o({devices:O,owners:F},async()=>{await this.db.transaction().execute(async(M)=>{if(JSON.stringify(await b(M))!==JSON.stringify(R))throw new t("Legacy registry rows changed during retirement; retry daemon startup");await f`DELETE FROM slot_free_devices`.execute(M),await Lt(M,{hasJournal:c,hasBrokerResources:d.some((W)=>W.name==="session_broker_resources")})})})}}function rm(o,d){if(o.platform!==d.platform)return!1;if(o.stableId)return o.stableId===d.stable_device_id;return o.name!==null&&o.name===d.device_name}async function Ws(o,d,c){if(c.migrate===!1)await zo(o,d);else await Xo(o,d,()=>c.legacyDeviceRetirement?.retire(new Gi(o))??Promise.resolve(),{writerVersion:c.writerVersion??Nn()})}function im(o=process.platform){return{isRunning:(d)=>st(d),readGenerationToken:(d)=>{if(o==="linux")return py(d);if(o==="darwin")return my(d);return}}}function B4(o=im()){return(d)=>{if(!o.isRunning(d.pid))return!1;let c=d.processGenerationToken;if(!c)return!0;let b=o.readGenerationToken(d.pid);if(b===void 0)return!0;return Za(c,b)!=="different"}}var mc=B4();class Vs{ids=new Set;add(o){this.ids.add(o)}delete(o){this.ids.delete(o)}has(o){return this.ids.has(o)}}var g0=new Vs;function Hq(o,d,c={}){let b=(c.thisProcess??{pid:process.pid}).pid,R=c.reservations??g0;return(P)=>{let C="sessionUuid"in P&&typeof P.sessionUuid==="string"?P.sessionUuid:null;if(C!==null&&R.has(C))return!0;if(C!==null&&P.pid===b)return d.isLiveManagedExecutionSession(C)||(d.hasSession?.(C)??!1);return o(P)||C!==null&&d.isLiveManagedExecutionSession(C)}}function qq(o=Mf,d=process.pid){return{pid:d,processGenerationToken:o()??null}}function js(o){let{Database:d}=Pt("bun:sqlite");class c extends d{exec(b){if(b==="PRAGMA optimize;"||b==="PRAGMA wal_checkpoint(TRUNCATE);")return;super.exec(b)}}return new c(o)}class Ji extends bE{get supportsTransactionalDdl(){return!0}}class zi extends VO{createAdapter(){return new Ji}}function Ks({db:o,sqlite:d,dbPath:c}){return(b)=>{if(d)return o.transaction().execute((R)=>{let P=d.prepare("SELECT name FROM kysely_migration ORDER BY name");try{let C=P.all().map((D)=>{if(typeof D!=="object"||D===null||!("name"in D)||typeof D.name!=="string")throw Error("Invalid binding registry migration name");return D.name}).filter((D)=>!Object.hasOwn(pt,D));if(C.length>0)throw new tn(c,C,Ko(R,d,C))}finally{P.finalize()}return b(R)});return o.transaction().execute(async(R)=>(await ft(R,c),b(R)))}}var am="registry",dm="slots.sqlite";function VS(o=process.env,d){return sm(Xu(Ao,am,o,d),dm)}function hh(o=VS()){return nm(o)}var $4=Math.min(250,uU);function lm(o){let d=js(o);try{d.exec(`PRAGMA busy_timeout = ${$4};`),d.exec("PRAGMA journal_mode = WAL;"),d.exec("PRAGMA synchronous = FULL;"),d.exec("PRAGMA foreign_keys = ON;")}catch(c){throw d.close(),c}return d}async function WS(o={}){let d=o.dbPath??VS();if(!wE(d))nc(om(d));let c,b=new Uc({dialect:new zi({database:()=>c=lm(d),retry:{maxAttempts:1}})});try{await Ws(b,d,o)}catch(R){if(await b.destroy(),Qa(R)==="retryable")throw new ss(r(R));throw R}return new Js(b,o,d,c)}class Js{db;dbPath;timer;isExecOwnerLive;claims;writeTransaction;constructor(o,d={},c=":memory:",b){this.db=o;this.dbPath=c;this.timer=d.timer??i,this.isExecOwnerLive=d.isExecOwnerLive??mc,this.writeTransaction=Ks({db:o,sqlite:b,dbPath:c}),this.claims=new wi(this.db,(R)=>this.writeTransaction(R))}assertSupportedSchema(){return ft(this.db,this.dbPath)}describeSchema(){return Jo(this.db)}sessionBrokerStore(o,d){return new Vi(this.db,o,this.isExecOwnerLive,{ids:d,clock:this.timer,write:(c)=>this.writeTransaction(c)})}avdSnapshotCleanupRegistry(){return new vi(this.db)}deviceMutationJournal(){return new Ki(this.db,this.timer)}deviceClaims(){return this.claims}async ensureScope(o){let d=Qd(o);return this.writeTransaction(async(c)=>{let b=this.timer.now(),R=await this.readScope(c,d);if(R?.state==="valid")return await c.updateTable("slot_scopes").set({last_acquired_at_ms:b}).where("scope_key","=",d).execute(),{kind:"ready",scope:{...R,lastAcquiredAtMs:b},created:!1,revived:!1};if(R&&R.invalidationReason!=="abandoned")return{kind:"scope_invalidated",scope:R};let P=await c.selectFrom("slot_scopes").selectAll().where("managed_host_scope","=",o.managedHostScope).where("runner_namespace","=",o.runnerNamespace).where("state","<>","invalidated").where("scope_key","<>",d).executeTakeFirst();if(P)return{kind:"incarnation_conflict",current:ht(P)};if(R){let D=await c.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","=",d).returningAll().executeTakeFirstOrThrow();return{kind:"ready",scope:ht(D),created:!1,revived:!0}}let C={scope_key:d,managed_host_scope:o.managedHostScope,runner_namespace:o.runnerNamespace,runner_incarnation:o.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 c.insertInto("slot_scopes").values(C).execute(),{kind:"ready",scope:ht(C),created:!0,revived:!1}})}async getScope(o){return this.readScope(this.db,o)}async initBinding(o,d){Re(o);let c=Qe(d.requestedSpec);return this.writeTransaction(async(b)=>{let R=await this.readScope(b,o.scopeKey);if(R?.state!=="valid")return{kind:"scope_not_valid",scope:R};let P=await this.readAssignment(b,o);if(P)return{kind:"ready",assignment:P,created:!1};let C={scope_key:o.scopeKey,slot_index:o.bindingIndex,role:d.role,platform:d.platform,generation:0,stable_device_id:null,device_name:null,requested_spec_json:c,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,...yt(null),updated_at_ms:this.timer.now()};return await b.insertInto("slot_assignments").values(C).execute(),{kind:"ready",assignment:oe(C),created:!0}})}async removeUnboundBinding(o,d){return Re(o),this.writeTransaction(async(c)=>{if(await this.readOpenJournal(c,o))return!1;return(await c.deleteFrom("slot_assignments").where("scope_key","=",o.scopeKey).where("slot_index","=",o.bindingIndex).where("generation","=",d.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(o,d,c){return Re(o),this.writeTransaction((b)=>this.commitBindingIn(b,o,d,{next:c}))}async commitBindingIn(o,d,c,{next:b,journaled:R=!1}){let P=b.resolvedSpec===null||b.resolvedSpec===void 0?null:Qe(b.resolvedSpec),C=b.requestedSpec===void 0?void 0:Qe(b.requestedSpec),D=await this.checkBinding(o,d,c,{journaled:R});if("kind"in D)return D;let k=Mo(D,b);if(b.stableDeviceId!==null){let q=await o.selectFrom("slot_assignments").selectAll().where("platform","=",k).where("stable_device_id","=",b.stableDeviceId).where((M)=>M.or([M("scope_key","<>",d.scopeKey),M("slot_index","<>",d.bindingIndex)])).executeTakeFirst();if(q)return{kind:"device_assigned_elsewhere",holder:oe(q)}}let O=b.stableDeviceId!==D.stableDeviceId||k!==D.platform,F=await o.updateTable("slot_assignments").set({generation:D.generation+1,platform:k,stable_device_id:b.stableDeviceId,device_name:b.deviceName,resolved_spec_json:P,spec_fingerprint:b.specFingerprint,state:b.state,...yt(null),...C===void 0?{}:{requested_spec_json:C},...O?{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).returningAll().executeTakeFirstOrThrow();return{kind:"committed",assignment:oe(F)}}async updateBindingState(o,d,c,b){Re(o);let R=Qr(c,b);return this.writeTransaction((P)=>this.updateBindingStateIn(P,o,d,{state:c,settler:R}))}async updateBindingStateIn(o,d,c,{state:b,settler:R,journaled:P=!1}){let C=await this.checkBinding(o,d,c,{journaled:P});if("kind"in C)return C;let D=C.execOwner;if(b==="replacing"&&D&&this.isExecOwnerLive(D))return{kind:"binding_in_use",owner:D,assignment:C};let k=To(C.state,b)?C.generation+1:C.generation,O=await o.updateTable("slot_assignments").set({state:b,generation:k,...yt(R),updated_at_ms:this.timer.now()}).where("scope_key","=",d.scopeKey).where("slot_index","=",d.bindingIndex).returningAll().executeTakeFirstOrThrow();return{kind:"updated",assignment:oe(O)}}async claimExecution(o,d,c,b={}){return Re(o),this.writeTransaction(async(R)=>{let P=await this.checkBinding(R,o,d,{journaled:!1,claimingSessionUuid:c.sessionUuid});if("kind"in P)return P;if(P.state!=="ready"||P.stableDeviceId===null)return{kind:"binding_not_ready",assignment:P};let C=P.execOwner;if(C&&C.sessionUuid!==c.sessionUuid&&C.sessionUuid!==b.supersedesSessionUuid&&this.isExecOwnerLive(C))return{kind:"binding_in_use",owner:C,assignment:P};let D=await R.updateTable("slot_assignments").set({exec_owner_daemon_id:c.daemonId,exec_owner_pid:c.pid,exec_owner_process_token:c.processGenerationToken??null,exec_session_uuid:c.sessionUuid,updated_at_ms:this.timer.now()}).where("scope_key","=",o.scopeKey).where("slot_index","=",o.bindingIndex).returningAll().executeTakeFirstOrThrow();return{kind:"claimed",assignment:oe(D)}})}async releaseExecution(o,d){return Re(o),this.writeTransaction(async(c)=>{let b=await c.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","=",o.scopeKey).where("slot_index","=",o.bindingIndex).where("exec_session_uuid","=",d).returningAll().executeTakeFirst();if(b)return await c.updateTable("slot_scopes").set({last_released_at_ms:b.updated_at_ms}).where("scope_key","=",o.scopeKey).execute(),{released:!0,assignment:oe(b)};return{released:!1,assignment:await this.readAssignment(c,o)}})}async recoverSettledBindings(o){return this.writeTransaction(async(d)=>{let c=d.selectFrom("slot_assignments").selectAll().where("state","=","settling");if(o!==void 0)c=c.where("scope_key","=",o);let b=(await c.orderBy("scope_key").orderBy("slot_index").execute()).map(oe).filter((P)=>this.isSettled(P)),R=[];for(let P of b){let C=await d.updateTable("slot_assignments").set({state:"ready",...yt(null),updated_at_ms:this.timer.now()}).where("scope_key","=",P.scopeKey).where("slot_index","=",P.bindingIndex).where("generation","=",P.generation).where("state","=","settling").returningAll().executeTakeFirstOrThrow();R.push(oe(C))}return R})}async getAssignment(o){return Re(o),this.readAssignment(this.db,o)}async listAssignments(o){return(await this.db.selectFrom("slot_assignments").selectAll().where("scope_key","=",o).orderBy("slot_index").execute()).map(oe)}async findExecutionAssignments(o){return(await this.db.selectFrom("slot_assignments").selectAll().where("exec_session_uuid","=",o).orderBy("scope_key").orderBy("slot_index").execute()).map(oe)}async findDeviceHolder(o,d){let c=await this.db.selectFrom("slot_assignments").selectAll().where("platform","=",o).where("stable_device_id","=",d).executeTakeFirst();if(c){let b=await this.readScope(this.db,c.scope_key);if(b)return{kind:"binding",scope:b,assignment:oe(c)}}return null}async isDeviceAssignedToValidBinding(o,d){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","=",o).where("slot_assignments.stable_device_id","=",d).where("slot_scopes.state","=","valid").executeTakeFirst()!==void 0}async snapshotManagedDevices(){return(await this.snapshotResources()).managed}async snapshotBindingResources(){return this.snapshotResources()}async snapshotResources(){let o=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((C)=>C.or([C("slot_scopes.state","<>","invalidated"),C("slot_scopes.invalidation_reason","=","abandoned")])),d=await this.db.selectNoFrom([Ei(o).$castTo().as("assigned"),Ei(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",Xe)).$castTo().as("pending")]).executeTakeFirstOrThrow(),c=JSON.parse(d.assigned),R=JSON.parse(d.pending).map(fe),P=[...c.flatMap((C)=>C.stable_device_id===null?[]:[{platform:C.platform,stableDeviceId:C.stable_device_id,holder:"session_broker",scopeKey:C.scope_key,bindingIndex:C.slot_index,scopeState:C.scope_state,execSessionUuid:C.exec_session_uuid}])];return{managed:[...P,...ko(R,P)],openJournal:R}}async openBindingJournal(o,d){Re(o),Zo(d.phase);let c=Qe(d.target);return this.writeTransaction(async(b)=>{let R=this.timer.now();await b.deleteFrom("slot_journal").where("phase","in",[...Xe]).where("updated_at_ms","<",R-Do).execute();let P=await this.readOpenJournal(b,o);if(P)return{kind:"journal_open",entry:P};let C=await this.applyJournalAssignmentChange(b,o,d.assignment);if("kind"in C)return C;let D=await b.insertInto("slot_journal").values({scope_key:o.scopeKey,slot_index:o.bindingIndex,kind:d.kind,phase:d.phase,platform:C.platform,from_generation:d.assignment.expected.generation,to_generation:C.generation===d.assignment.expected.generation?null:C.generation,binding_generation:C.generation,binding_stable_device_id:C.stableDeviceId,target_json:c,owner_daemon_id:d.owner.daemonId,owner_pid:d.owner.pid,owner_process_token:d.owner.processGenerationToken??null,attempts:0,last_error:null,next_attempt_at_ms:R,created_at_ms:R,updated_at_ms:R}).returningAll().executeTakeFirstOrThrow();return{kind:"opened",entry:fe(D),assignment:C}})}async advanceBindingJournal(o,d){return this.writeTransaction(async(c)=>{let b=await c.selectFrom("slot_journal").selectAll().where("id","=",o).executeTakeFirst(),R=b?fe(b):null;if(!R||!FA(R.phase)||R.phase!==d.expectedPhase||!jc(R.owner,d.owner))return{kind:"journal_conflict",entry:R};let P=null;if(d.assignment){if(!el(R.binding,d.assignment.expected))return{kind:"journal_conflict",entry:R};let D=await this.applyJournalAssignmentChange(c,R,d.assignment);if("kind"in D)return D;P=D}let C=await c.updateTable("slot_journal").set(Qo(R,d,P,this.timer.now())).where("id","=",o).returningAll().executeTakeFirstOrThrow();return{kind:"advanced",entry:fe(C),assignment:P}})}async claimBindingJournal(o,d,c){return this.writeTransaction(async(b)=>{let R=await b.selectFrom("slot_journal").selectAll().where("id","=",o).executeTakeFirst(),P=R?fe(R):null;if(!P||!FA(P.phase)||!jc(P.owner,d))return{kind:"journal_conflict",entry:P};let C=await b.updateTable("slot_journal").set({owner_daemon_id:c.daemonId,owner_pid:c.pid,owner_process_token:c.processGenerationToken??null,updated_at_ms:this.timer.now()}).where("id","=",o).returningAll().executeTakeFirstOrThrow();return{kind:"claimed",entry:fe(C)}})}async getBindingJournal(o){let d=await this.db.selectFrom("slot_journal").selectAll().where("id","=",o).executeTakeFirst();return d?fe(d):null}async listOpenBindingJournal(o){let d=this.db.selectFrom("slot_journal").selectAll().where("phase","not in",[...Xe]);if(o)d=d.where("scope_key","=",o.scopeKey).where("slot_index","=",o.bindingIndex);return(await d.orderBy("next_attempt_at_ms").orderBy("id").execute()).map(fe)}async close(){await this.db.destroy()}async readOpenJournal(o,d){let c=await o.selectFrom("slot_journal").selectAll().where("scope_key","=",d.scopeKey).where("slot_index","=",d.bindingIndex).where("phase","not in",[...Xe]).executeTakeFirst();return c?fe(c):null}async applyJournalAssignmentChange(o,d,c){let b=c.kind==="commit"?await this.commitBindingIn(o,d,c.expected,{next:c.next,journaled:!0}):await this.updateBindingStateIn(o,d,c.expected,{state:c.state,settler:Qr(c.state,c.options),journaled:!0});return b.kind==="committed"||b.kind==="updated"?b.assignment:b}async readScope(o,d){let c=await o.selectFrom("slot_scopes").selectAll().where("scope_key","=",d).executeTakeFirst();return c?ht(c):null}async readAssignment(o,d){let c=await o.selectFrom("slot_assignments").selectAll().where("scope_key","=",d.scopeKey).where("slot_index","=",d.bindingIndex).executeTakeFirst();return c?oe(c):null}async checkBinding(o,d,c,{journaled:b=!1,claimingSessionUuid:R}={}){let P=await this.readScope(o,d.scopeKey),C=await this.readAssignment(o,d);if(!Bo(P,b)&&!(R!==void 0&&Oo(P,C,R)))return{kind:"scope_not_valid",scope:P};if(!C)return{kind:"binding_missing"};if(!Oq(C,c))return{kind:"stale_binding",current:C};return C}async hasLiveExecOwner(o,d){return(await o.selectFrom("slot_assignments").selectAll().where("scope_key","=",d).where((b)=>b.or([b("exec_session_uuid","is not",null),b("state","=","settling")])).execute()).some((b)=>!this.isSettled(oe(b)))}isSettled(o){let{settler:d,execOwner:c}=o;return(d===null||!this.isExecOwnerLive(d))&&(c===null||!this.isExecOwnerLive(c))}}var Yi=new cm;function y0(o,d){return Yi.run({scopeKey:o.scopeKey,bindingIndex:o.bindingIndex},d)}function LA(){return Yi.getStore()}function um(o){let d=Yi.getStore();if(!d)return!1;return o.scopeKey===d.scopeKey&&o.bindingIndex===d.bindingIndex}function rQ(o,d){let c=o?.holderOf(d.device);if(!c)return;if(c.holder==="session_broker"&&c.execSessionUuid!==null&&d.requesterSessionUuid===c.execSessionUuid)return;if(um(c))return;return new oi(d.action,d.deviceId,c)}function zs(o,d){return JSON.stringify([o,d])}var Xs=new Set,Xi=new WeakMap;async function nl(o,d={}){try{await o.refresh({...d,requireCurrent:!0})}catch(c){if(!(c instanceof tn))throw c;e.debug(`[Bindings] Allocation using claim files: ${r(c)}`),await o.refresh(d)}}class Ys{openRegistry;timer;registryExists;snapshot;readFailed=!1;inFlight;registry;warnedUpgradePending=!1;unsupportedSchema;constructor(o,d,c=()=>!0){this.openRegistry=o;this.timer=d;this.registryExists=c}async refresh(o={}){if(this.unsupportedSchema&&(o.requireCurrent||o.refuseUpgradePending))throw this.unsupportedSchema;if(o.fresh||!this.snapshotIsYoung(o.maxAgeMs??0))await this.reload(o);if(o.refuseUpgradePending&&this.snapshot?.kind==="absent"&&this.snapshot.upgradePending)throw new ss("registry upgrade pending")}async reload(o){try{await(o.fresh?this.refreshFresh():this.loadShared())}catch(d){if(d instanceof tn){if(o.requireCurrent||o.refuseUpgradePending)throw d;let c={code:d.code,retryable:d.retryable,mode:"files_only",dbPath:d.dbPath,unknownMigrations:d.unknownMigrations,writerVersions:d.writerVersions,remedy:d.remedy};if(this.snapshot={kind:"files_only",loadedAtMs:this.timer.now(),diagnostic:c},this.readFailed=!1,!Xs.has(d.dbPath))Xs.add(d.dbPath),e.warn(`[Bindings] Registry at ${d.dbPath} has migrations unknown to this daemon: ${d.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. ${d.remedy}`);return}if(o.requireCurrent||this.snapshot?.kind!=="loaded"||!(d instanceof ss))throw d;e.debug(`[Bindings] Using retained exclusion snapshot: ${r(d)}`)}}snapshotIsYoung(o){return this.unsupportedSchema===void 0&&o>0&&this.snapshot!==void 0&&this.snapshot.kind!=="unreadable"&&this.timer.now()-this.snapshot.loadedAtMs<o}loadShared(){return this.inFlight??=this.load().finally(()=>{this.inFlight=void 0}),this.inFlight}freshWaiter;refreshFresh(){if(this.freshWaiter)return this.freshWaiter;let o=this.inFlight;if(!o)return this.loadShared();let d=()=>(this.freshWaiter=void 0,this.loadShared()),c=o.then(d,d);return this.freshWaiter=c,c}degraded(){return this.snapshot?.kind==="files_only"?this.snapshot.diagnostic:void 0}lastReadFailed(){return this.readFailed}holderOf(o){if(this.snapshot?.kind!=="loaded")return;let d=this.snapshot.byDevice;for(let c of o.stableIds){let b=c?d.get(zs(o.platform,c)):void 0;if(b)return b}return}stableIdsFor(o){return this.snapshot?.kind==="loaded"?this.snapshot.byPlatform.get(o)??new Set:new Set}async load(){if(this.unsupportedSchema)throw this.unsupportedSchema;let o,d;if(this.registry===void 0&&!this.registryExists()){this.snapshot={kind:"absent",loadedAtMs:this.timer.now()},this.readFailed=!1;return}try{d=await this.openRegistryOnce(),await d.assertSupportedSchema(),o=await d.snapshotManagedDevices()}catch(R){if(R instanceof tn)throw this.unsupportedSchema=R,await this.dropUnsupportedRegistry(d,R),R;if(R instanceof qt){if(!this.warnedUpgradePending)e.warn("[Bindings] Registry upgrade pending; treating exclusion as absent until retirement completes",R),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(R)}`,R);else this.snapshot={kind:"unreadable"};throw new ss(r(R))}let c=new Map,b=new Map;for(let R of o){c.set(zs(R.platform,R.stableDeviceId),R);let P=b.get(R.platform)??new Set;P.add(R.stableDeviceId),b.set(R.platform,P)}this.snapshot={kind:"loaded",byDevice:c,byPlatform:b,loadedAtMs:this.timer.now()},this.readFailed=!1}async openRegistryOnce(){this.registry??=this.openRegistry().catch((c)=>{throw this.registry=void 0,c});let o=await this.registry,d=Xi.get(o);if(d)throw d;return o}async dropUnsupportedRegistry(o,d){if(this.registry=void 0,!o)return;if(Ie?.handle===o)Ie=void 0;if(Xi.has(o))return;Xi.set(o,d);try{await o.close()}catch(c){e.warn("[Bindings] Failed to close unsupported registry",c)}}}var Ie;function BA(o,d={}){return new Ys(()=>{if(!Ie){let c={promise:(d.openRegistry?.()??WS({migrate:!1})).then((b)=>(c.handle=b,b),(b)=>{if(Ie===c)Ie=void 0;throw b})};Ie=c}return Ie.promise},o,()=>Ie!==void 0||(d.registryExists??hh)())}import{join as Wp}from"path";import{closeSync as mm,linkSync as pm,openSync as fm,readFileSync as gm,unlinkSync as hm,writeSync as ym}from"fs";import{dirname as _m,join as rt}from"path";var Em=60000,Qs=300000,Zs=15*sY,xm=Math.ceil(Qs/Zs)+1,_t="device-allocations";function U4(o,d=process.env,c){return rt(Xu(Rg(d),_t,d,c),nf(o))}function Cm(o){let d;try{d=gm(o,"utf-8").trim()}catch(c){return e.debug(`claim file ${o} not readable: ${r(c)}`),!1}return d.length===0||Number.isNaN(Es(d).pid)}var Am=0;function Tm(o,d){let c=`${o}.${d.pid}.${++Am}.tmp`,b=fm(c,"wx",384);try{ym(b,fy(d.pid,d.ownerToken,d.metadata))}finally{mm(b)}try{return pm(c,o),!0}catch(R){if(R.code==="EEXIST")return!1;throw R}finally{try{hm(c)}catch(R){e.debug(`claim temp ${c} cleanup failed: ${r(R)}`)}}}var ea={leasePath:(o)=>rt(HP(aY),nf(o)),claimPath:(o)=>U4(o),read:(o)=>$l(o),isUnreadable:(o)=>Cm(o),isProcessRunning:(o)=>st(o),tryAcquire:(o,d)=>(nc(_m(o)),Tm(o,d)),takeOver:(o,d,c)=>SE(o,d,c),release:(o,d)=>Wn(o,d.pid,d.ownerToken)},Dm="ios-simulators";function H4(o,d=process.env,c){return rt(Xu(Dm,_t,d,c),nf(o))}var v0={...ea,leasePath:()=>{return},claimPath:(o)=>H4(o)},Im="watch-simulators";function km(o,d=process.env,c){return rt(Xu(Im,_t,d,c),nf(o))}var nQ={...v0,claimPath:(o)=>km(o)},Bm="tv-simulators";function Om(o,d=process.env,c){return rt(Xu(Bm,_t,d,c),nf(o))}var iQ={...v0,claimPath:(o)=>Om(o)},Mm="vision-simulators";function Nm(o,d=process.env,c){return rt(Xu(Mm,_t,d,c),nf(o))}var oQ={...v0,claimPath:(o)=>Nm(o)};class gh{selfPid;source;probe;owners=new Map;unreadable=new Set;idleLeaseHolders=new Map;unanswered=new Map;ownerToken=B.next();claimMirror;timer;forwardEvidence;ownerSocketPath;constructor(o=process.pid,d=ea,c=new sR,{ownerSocketPath:b=Tz,timer:R=i,forwardEvidence:P}={}){this.selfPid=o;this.source=d;this.probe=c;this.ownerSocketPath=b,this.timer=R,this.forwardEvidence=P}async refresh(o,d){d?.throwIfAborted();let c=await l(Promise.all(o.map(async(b)=>[b,await this.readOwnerWithForwardEvidence(b,d)])),{timer:this.timer,signal:d,label:"Foreign ownership refresh"});d?.throwIfAborted();for(let[b,{pid:R,forwardUnreadable:P}]of c){if(R===void 0)this.owners.delete(b);else this.owners.set(b,R);if(R===void 0&&(P||this.hasUnreadableClaim(b)))this.unreadable.add(b);else this.unreadable.delete(b)}}async readOwnerWithForwardEvidence(o,d){let c=await l(this.readForeignOwner(o),{timer:this.timer,signal:d,label:"Foreign ownership files"});if(d?.throwIfAborted(),c!==void 0)return{pid:c,forwardUnreadable:!1};return this.readForwardEvidence(o,d)}async readForwardEvidence(o,d){let c=await this.forwardEvidence?.read(o,d);if(!c||c.kind==="none")return{pid:void 0,forwardUnreadable:!1};if(c.ports.length===0){if(c.kind==="unknown")e.warn(`[DevicePool] Cannot inspect CtrlProxy forwards for ${o}: ${c.message}`);return{pid:void 0,forwardUnreadable:!1}}if(this.idleLeaseHolders.delete(o),c.kind==="foreign")return{pid:c.clientPids[0],forwardUnreadable:!1};return{pid:void 0,forwardUnreadable:!0}}foreignClaimUnreadable(o){return this.unreadable.has(o)}attachClaimMirror(o){this.claimMirror=o}async relinquishIdleLease(o){let d=this.idleLeaseHolders.get(o);if(d===void 0||!this.probe.requestRelinquish)return;let c=await this.probe.requestRelinquish(d,o);e.info(`[DevicePool] Asked the idle forwarding-lease holder of ${o} to relinquish it: `+(c.kind==="relinquish"?`${c.result.released?"released":"kept"} (${c.result.reason})`:`${c.kind} (${c.detail})`)),await this.refresh([o])}hasUnreadableClaim(o){let d=this.resolvePath(()=>this.source.claimPath(o),o);return d!==void 0&&this.source.isUnreadable?.(d)===!0}foreignOwnerPid(o){return this.owners.get(o)}async claim(o){let d=this.claimOwner(),c=await this.claimInTable(o,d);if(c!==void 0)return c;let b=await this.claimFile(o,d);if(b==="claimed")this.claimMirror?.claimed(o,d,()=>this.claimFileIsOurs(o,d),(R)=>this.isLiveTableOwner(o,R));return b!=="refused"}async claimInTable(o,d){let c=this.claimMirror?.acquire?.bind(this.claimMirror);if(!c)return;if(await this.fileClaimOwner(o)!==void 0||this.hasUnreadableClaim(o))return!1;let b=await c(o,d,(R)=>this.isLiveTableOwner(o,R));if(b.outcome==="unavailable")return;if(b.outcome==="refused")return this.owners.set(o,b.ownerPid),!1;if(await this.claimFile(o,d)==="refused")return this.claimMirror?.released(o,d),!1;return!0}async isLiveTableOwner(o,d){return await this.evaluateContent({pid:d.pid,metadata:d.metadata},o,"claim")!==void 0}async fileClaimOwner(o){let d=this.resolvePath(()=>this.source.claimPath(o),o),c=d===void 0?void 0:this.source.read(d);return d!==void 0&&c!==void 0&&c.pid!==this.selfPid?this.evaluateOwner(d,o,"claim"):void 0}claimFileIsOurs(o,d){let c=this.resolvePath(()=>this.source.claimPath(o),o);if(c===void 0)return!1;let b=this.source.read(c);return b?.pid===d.pid&&b.token===d.ownerToken}async claimFile(o,d){let c=this.resolvePath(()=>this.source.claimPath(o),o);if(c===void 0)return"unpublished";let b;try{b=this.source.tryAcquire(c,d)}catch(P){return e.warn(`Cannot publish the allocation claim for ${o} at ${c}: ${r(P)}`,P),"unpublished"}if(b)return this.unlessHeldInTable(o,c,d);let R=this.source.read(c);if(!R||Number.isNaN(R.pid)||R.pid===this.selfPid)return R?.pid===this.selfPid?"claimed":"refused";if(await this.evaluateOwner(c,o,"claim")!==void 0)return"refused";return this.source.takeOver(c,R,d)?this.unlessHeldInTable(o,c,d):"refused"}async unlessHeldInTable(o,d,c){let b=await this.tableClaimOwner(o);if(b===void 0)return"claimed";this.owners.set(o,b);try{this.source.release(d,c)}catch(R){e.warn(`Cannot give back the claim on ${o} another daemon holds in the host-wide table: ${r(R)}`,R)}return"refused"}release(o){let d={pid:this.selfPid,ownerToken:this.ownerToken};this.claimMirror?.released(o,d);let c=this.resolvePath(()=>this.source.claimPath(o),o);if(c===void 0)return;try{this.source.release(c,d)}catch(b){e.warn(`Cannot release the allocation claim on ${o}: ${r(b)}`,b)}}claimOwner(){let o=this.ownerSocketPath();return{pid:this.selfPid,ownerToken:this.ownerToken,...o===void 0?{}:{metadata:Az({socketPath:o,acquiredAt:this.timer.now()})}}}async readForeignOwner(o){let d=this.resolvePath(()=>this.source.leasePath(o),o),c=this.resolvePath(()=>this.source.claimPath(o),o),[b,R]=await Promise.all([d===void 0?void 0:this.evaluateLock(d,o,"lease"),c===void 0?void 0:this.evaluateOwner(c,o,"claim")]),P=await this.tableOwnerUnlessAFileDecides(o,b,R);return this.noteIdleLeaseHolder(o,b?.idleSocketPath,R??P),b?.pid??R??P}noteIdleLeaseHolder(o,d,c){if(d!==void 0&&c===void 0)this.idleLeaseHolders.set(o,d);else this.idleLeaseHolders.delete(o)}async tableOwnerUnlessAFileDecides(o,d,c){let b=d?.idleSocketPath===void 0?d?.pid:void 0;return(c??b)===void 0?this.tableClaimOwner(o):void 0}async tableClaimOwner(o){if(!this.claimMirror?.read)return;try{let d=await this.claimMirror.read(o);if(!d)return;return(await this.evaluateContent({pid:d.pid,metadata:d.metadata},o,"claim"))?.pid}catch(d){e.warn(`Cannot read the host-wide claim on ${o}; the claim files decide: ${r(d)}`,d);return}}resolvePath(o,d){try{return o()}catch(c){e.warn(`Cannot resolve the device ownership files for ${d}: ${r(c)}`,c);return}}async evaluateOwner(o,d,c){return(await this.evaluateLock(o,d,c))?.pid}async evaluateLock(o,d,c){return this.evaluateContent(this.source.read(o),d,c)}async evaluateContent(o,d,c){let b=this.liveForeignLock(o);if(!b)return;let{pid:R,metadata:P}=b;if(!P)return{pid:R};let C=await this.probe.query(P.socketPath,d);if(this.wedgedOwnerLapsed(C,R,d,c))return;let D=c==="claim"&&this.timer.now()-P.acquiredAt<Em;if(!Lm(C,R,c,{deviceId:d,startingUp:D}))return;return Fm(C)?{pid:R,idleSocketPath:P.socketPath}:{pid:R}}liveForeignLock(o){let d=o?.pid;if(d===void 0||Number.isNaN(d)||d===this.selfPid)return;if(!this.source.isProcessRunning(d)){this.unanswered.delete(d);return}return{pid:d,metadata:dk(o?.metadata)}}wedgedOwnerLapsed(o,d,c,b){if(o.kind!=="no-response")return this.unanswered.delete(d),!1;let R=this.timer.monotonicNow?.()??this.timer.now(),P=this.unansweredRun(d,R),C=R-P.since;if(C<Qs||P.samples<xm)return!1;if(!P.warnedDevices.has(c))P.warnedDevices.add(c),e.warn(`[DevicePool] ${b} owner PID ${d} of ${c} is alive but has not answered on its control socket for ${Math.round(C/1000)}s; treating its hold on the device as lapsed`);return!0}unansweredRun(o,d){let c=this.unanswered.get(o);if(!c||d-c.lastAt>Zs){let b={since:d,lastAt:d,samples:1,warnedDevices:new Set};return this.unanswered.set(o,b),b}if(d>c.lastAt)c.samples+=1,c.lastAt=d;return c}}function Fm(o){return o.kind==="status"&&o.status.sessionId===null&&o.status.activeExecutions===0}function Lm(o,d,c,{deviceId:b,startingUp:R}){switch(o.kind){case"unreachable":if(R)return e.debug(`[DevicePool] ${c} owner PID ${d} of ${b} is live but not yet reachable; treating its fresh claim as held`),!0;return e.debug(`[DevicePool] ${c} owner PID ${d} of ${b} is orphaned: ${o.detail}`),!1;case"no-response":case"unsupported":return!0;case"status":if(o.status.pid!==d)return e.debug(`[DevicePool] ${c} owner PID ${d} of ${b} is orphaned: its socket is served by PID ${o.status.pid}`),!1;return c==="lease"||o.status.sessionId!==null||o.status.activeExecutions>0}}import{readFileSync as ta,renameSync as qm,statSync as $m,unlinkSync as Hm,writeFileSync as Wm}from"fs";import{join as tr}from"path";class He extends t{code;constructor(o,d){super(d);this.code=o}}var Vm=g({id:y().min(1),ownerPid:T().int().positive(),ownerGenerationToken:y().optional(),deviceId:y().optional(),replacement:te().optional(),processId:T().int().positive().optional(),processGenerationToken:y().optional(),admittedUntilMs:T().finite().optional(),handedOffUntilMs:T().finite().optional()}),jm=600000,Km=60000;class Qi{options;timer;pid;running;ids;constructor(o){this.options=o;this.timer=o.timer??i,this.pid=o.pid??process.pid,this.running=o.isProcessRunning??st,this.ids=o.idGenerator??B}async withAdmissionLock(o,d){o.signal?.throwIfAborted();let c=this.perform((R)=>tr(nc(R),"admission.lock")),b=this.ids.next();await this.acquire(c,b,o);try{return o.signal?.throwIfAborted(),await d()}finally{Wn(c,this.pid,b)}}async acquire(o,d,c){let b=this.timer.now()+c.timeoutMs;for(;;){if(c.signal?.throwIfAborted(),this.tryAcquire(o,d))return;let R=b-this.timer.now();if(R<=0)throw this.timeout(o);if(await l(()=>this.timer.sleep(Math.min(25,R)),{timer:this.timer,timeoutMs:R,signal:c.signal,label:o,timeoutError:()=>this.timeout(o)}),this.timer.now()>=b)throw this.timeout(o)}}timeout(o){return e.warn(`[BootAdmission] Timed out waiting for ${o}`),new He("timeout",`Timed out waiting for host admission lock at ${o}`)}tryAcquire(o,d){try{let c=ti(o,{pid:this.pid,now:()=>this.timer.now(),ownerToken:d,isProcessRunning:this.running,ownerGeneration:this.options.ownerGeneration??kt});if(!c)return this.checkReadableLock(o),this.takeOverStaleLock(o,d);return c}catch(c){throw this.failed(o,c)}}takeOverStaleLock(o,d){let c=$l(o);if(!c||!this.olderThan(o,this.options.lockMaxAgeMs??Km))return!1;let b=SE(o,c,{ownerGeneration:this.options.ownerGeneration??kt,pid:this.pid,ownerToken:d});if(b)e.warn(`[BootAdmission] Took over stale host admission lock at ${o} from PID ${c.pid}`);return b}olderThan(o,d){try{return this.timer.now()-$m(o).mtimeMs>d}catch(c){if(!this.missing(c,o))throw this.failed(o,c);return!1}}checkReadableLock(o){try{ta(o)}catch(d){if(!this.missing(d,o))throw this.failed(o,d)}}readPeerAdmissions(){return this.perform((o)=>this.listFiles(o).flatMap((d)=>{let c=this.readRecord(o,d);return c&&c.ownerPid!==this.pid?[c]:[]}))}listFiles(o){try{return $i(o).filter((d)=>d.endsWith(".json"))}catch(d){if(!this.missing(d,o))throw d;return[]}}readRecord(o,d){let c=tr(o,d),b;try{b=ta(c,"utf8")}catch(P){if(!this.missing(P,c))throw P;return}let R=this.parseRecord(c,d,b);if(R&&this.isStale(R)){this.cleanup(c);return}return R}parseRecord(o,d,c){let b=Number(d.split(".",1)[0]);try{let R=Vm.parse(JSON.parse(c));if(d!==`${R.ownerPid}.${R.id}.json`)throw Error("Mismatched admission record identity");return R}catch(R){if(!Number.isInteger(b)||b<=0)throw this.failed(o,R);if(this.running(b)){if(!this.olderThan(o,jm))throw this.failed(o,R);e.warn(`[BootAdmission] Dropping old invalid record at ${o} from PID ${b}: ${r(R)}`,R),this.cleanup(o);return}e.debug(`[BootAdmission] Dropping dead owner's invalid record at ${o}: ${r(R)}`),this.cleanup(o);return}}isStale(o){if(o.handedOffUntilMs!==void 0)return this.timer.now()>=o.handedOffUntilMs||o.processId!==void 0&&this.isProvablyGone(o.ownerPid,o.ownerGenerationToken)&&this.isProvablyGone(o.processId,o.processGenerationToken);return!this.running(o.ownerPid)||o.admittedUntilMs!==void 0&&this.timer.now()>=o.admittedUntilMs}isProvablyGone(o,d){return!this.running(o)||cR(o,{processGenerationToken:d},this.options.readProcessGenerationToken??Ta,"host boot admission record")}readToken(o){try{return(this.options.readProcessGenerationToken??Ta)(o)}catch(d){e.warn(`[BootAdmission] Failed to capture process generation token for PID ${o}: ${r(d)}`,d);return}}publish(o={}){let d={id:this.ids.next(),ownerPid:this.pid,ownerGenerationToken:this.readToken(this.pid),...o};this.write(d);let c=!1;return{clearDeviceId:()=>{if(c)return;let b={...d};delete b.deviceId,this.write(b),d=b},update:(b)=>{if(c)return;let R={...d,...Object.fromEntries(Object.entries(b).filter(([,P])=>P!==void 0))};if(b.processId!==void 0)R.processGenerationToken=this.readToken(b.processId);this.write(R),d=R},remove:()=>{if(c)return;this.perform((b)=>this.unlink(tr(b,`${d.ownerPid}.${d.id}.json`))),c=!0}}}write(o){this.perform((d)=>{nc(d);let c=tr(d,`${o.ownerPid}.${o.id}.json`),b=`${c}.${this.ids.next()}.tmp`;try{Wm(b,JSON.stringify(o),{flag:"wx",mode:384}),qm(b,c)}finally{this.cleanup(b)}})}unlink(o){try{Hm(o)}catch(d){if(!this.missing(d,o))throw d}}cleanup(o){try{this.unlink(o)}catch(d){e.warn(`[BootAdmission] Registry cleanup failed at ${o}: ${r(d)}`,d)}}missing(o,d){if(o?.code!=="ENOENT")return!1;return e.debug(`[BootAdmission] Registry path already absent: ${d}`),!0}perform(o){let d="boot-admissions/android (unresolved registry directory)";try{return d=this.options.directory(),o(d)}catch(c){throw this.failed(d,c)}}failed(o,d){if(d instanceof He)return d;return e.warn(`[BootAdmission] Host registry failed at ${o}: ${r(d)}`,d),new He("failed",`Host boot registry failed at ${o}: ${r(d)}`)}}class $A{maxSamples;samples=[];constructor(o=200){this.maxSamples=o}record(o){if(!Number.isFinite(o.durationMs)||o.durationMs<0)return;this.samples=[...this.samples,o].slice(-this.maxSamples)}latestFor(o){return this.samples.findLast((d)=>d.udid===o)}recentForProfile(o,d=10,c){return this.samples.filter((b)=>b.profileId===o&&(c===void 0||(b.reason??"create")===c)).slice(-d).reverse()}}class rr{onClose;ended=[];constructor(o){this.onClose=o}close(){this.onClose(this)}}var ia=h.BOOT_CAPACITY_GATE.name,oa=h.IOS_SIM_CAPACITY_GATE.name,a_=5000;function or(o,d){if(o==="ios"){let c=d[oa]?.trim();if(c==="0"||c==="1")return c==="1"}return d[ia]?.trim()!=="0"}function q4(o){let d=o.externalDevices??[],c=o.heldDevices??[],b=c.length>0?` ${c.length} of them are held by AutoMobile: ${c.join(", ")}.`:"";return`${d.length>0?` ${d.length} of them ${o.ownershipUnknown?"have unconfirmed AutoMobile ownership":o.heldDevices?"have no AutoMobile owner":"were not started by AutoMobile"} but still count toward the limit: ${d.join(", ")}.`:""}${b}`}function sr(o,d,c,b){if(o<d.maxBooted)return;let R=b.externalDevices??[],P=b.heldDevices??[],C=R.length>0?` or disable the gate with ${ia}=0`:"";return{outcome:"refuse",reason:"at-capacity",limits:d,bootedCount:o,retryAfterMs:c,...R.length>0?{externalDevices:[...R]}:{},...P.length>0?{heldDevices:[...P]}:{},...b.ownershipUnknown?{ownershipUnknown:!0}:{},message:`${o} ${b.noun}(s) booted; limit is ${d.maxBooted} (${d.source}).${q4(b)} Shut one down, raise the limit with ${b.envName}${C}.`}}var fc=15000;async function Rt(o){o.signal?.throwIfAborted();let d=o.ledger.beginSample(),c;try{c=await Gm(o)}finally{d.close()}o.signal?.throwIfAborted();let b=o.decide(c,d);if(sa(b))return{decision:b};return{decision:b,releaseAdmission:o.admit(b)}}function sa(o){return o.outcome==="refuse"}async function Gm(o){let{timer:d}=o,c=o.sampleTimeoutMs??fc;return await l(o.sample,{timer:d,timeoutMs:c,signal:o.signal,label:`Collecting ${o.label}`,timeoutError:()=>Zi(o.platform,c,o.label,o.timeoutRetryAfterMs)})}function Zi(o,d,c,b){let R={code:"timeout",message:`timed out after ${d}ms collecting ${c}`,retryable:!0};return o==="android"?new Gr(R):new ze(o,R,void 0,b)}function Et(o,d,c){let{decision:b}=o;if(!sa(b))return;throw new $n({platform:d,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 ${c} capacity (code capacity_exhausted, retryable; retry after ${b.retryAfterMs}ms): ${b.message}`)}class xt{timer;entries=new Map;openWindows=new Set;constructor(o){this.timer=o}admit(o,d=!1,c="create"){let b=Symbol("boot-admission");return this.entries.set(b,{deviceId:o,replacement:d,reason:c}),{bind:(R)=>{let P=this.entries.get(b);if(P)this.entries.set(b,{...P,deviceId:R,replacement:!1})},release:()=>this.end(b),handOff:(R,P,C)=>{let D=this.entries.get(b);if(D)this.entries.set(b,{deviceId:R??D.deviceId,processId:C??D.processId,handedOffUntilMs:P,handedOff:!0})}}}admissionsByReason(){let o={reset:0,create:0,restart:0};for(let d of this.entries.values())o[d.reason??"create"]+=1;return o}end(o,d=!1){let c=this.entries.get(o);if(!c)return;this.entries.delete(o);let b=d?{deviceId:c.deviceId,processId:c.processId,handedOff:c.handedOff,replacement:c.replacement,reason:c.reason}:c;for(let R of this.openWindows)R.ended.push(b)}beginSample(){let o=new rr((d)=>this.openWindows.delete(d));return this.openWindows.add(o),o}inFlightCount(o,d,c){return this.inFlight(o,d,c).count}inFlight(o,d,c,b=new Set){let{count:R,withListedProcess:P,listedWithoutProcess:C}=this.inFlightView(o,d,c,b);return{count:R,withListedProcess:P,listedWithoutProcess:C}}inFlightView(o,d,c,b=new Set){let R=this.timer.now(),P=(M)=>M.processId!==void 0&&b.has(M.processId),C=(M)=>M.deviceId!==void 0&&o.has(M.deviceId),D=this.endedDuringSample(c,o,d,R),k=[...D],O=D.filter(P).length,q=[...this.windowEnded(c),...this.entries.values()].filter((M)=>C(M)&&!P(M)&&M.deviceId!==d&&!M.replacement).length;for(let[M,W]of[...this.entries]){let U=C(W);if(W.handedOffUntilMs!==void 0&&(U||R>=W.handedOffUntilMs))this.end(M,U);else if(!U&&(d===void 0||W.deviceId!==d))k.push(W),O+=P(W)?1:0}return{count:k.length,boots:k.map((M)=>({deviceId:M.deviceId,replacement:M.replacement,processId:M.processId,handedOff:M.handedOff===!0})),withListedProcess:O,listedWithoutProcess:q}}windowEnded(o){return o instanceof rr?o.ended:[]}endedDuringSample(o,d,c,b){return this.windowEnded(o).filter((R)=>!(R.handedOffUntilMs!==void 0&&b>=R.handedOffUntilMs)&&!(R.deviceId!==void 0&&d.has(R.deviceId))&&(c===void 0||R.deviceId!==c))}}import{AsyncLocalStorage as Jm}from"async_hooks";class We{scope=new Jm;hasPending(){return this.scope.getStore()?.active===!0}take(o){let d=this.scope.getStore();if(!d?.active)return;return d.active=!1,d.consume(o)}hold(o,d,c=()=>{}){let b={active:!0,consume:o};return{run:async(R)=>{if(!b.active)throw new t("Boot reservation was already consumed or released");let P=!1;try{let C=await this.scope.run(b,R);return P=!0,C}finally{if(!P&&b.active)b.active=!1,d()}},markReplacedDeviceGone:()=>{if(b.active)c()},release:()=>{if(b.active)b.active=!1,d()}}}}var ar="Booted",V4=new Set([ar,"Booting","Shutting Down"]);function zS(o,d){return o.simulators.filter((c)=>V4.has(c.state)&&c.udid!==d).map((c)=>c.udid)}class UA{source;history;timer;inFlight=null;pendingFresh=null;constructor(o,d,c){this.source=o;this.history=d;this.timer=c}collect(o={}){if(this.inFlight)return this.inFlight;return this.startRun(o)}collectFresh(o={}){if(this.pendingFresh)return this.pendingFresh;let d=Promise.resolve().then(()=>(this.pendingFresh=null,this.startRun(o)));return this.pendingFresh=d,d}startRun(o){let d=this.collectOnce(this.runBudget(o)).finally(()=>{if(this.inFlight===d)this.inFlight=null});return this.inFlight=d,d}runBudget(o){let d=o.deadlineMs??(o.timeoutMs===void 0?void 0:this.timer.now()+o.timeoutMs);return{signal:o.signal,deadlineMs:d}}async withinBudget(o,d){if(o.deadlineMs===void 0)return await d({signal:o.signal});return await vs(o.deadlineMs,this.timer,o.signal,(c,b)=>d({signal:c,timeoutMs:b}))}async collectOnce(o){let d=this.timer.now(),c;try{c=await this.withinBudget(o,(k)=>this.source.readInventory(k))}catch(k){return e.warn(`simulator inventory failed: ${r(k)}`,k),zm(d,[`inventory: ${r(k)}`])}let b=c.filter((k)=>k.state===ar),R=await this.readSnapshot(o,b.length>0),P=R.value?_ne(R.value.processes,b.map((k)=>k.udid)):new Map,C=c.map((k)=>this.costFor(k,R,P)),D=[...R.error?[`host snapshot: ${R.error}`]:[],...R.value?.footprintError&&b.length>0?[`memory footprint: ${R.value.footprintError}`]:[]];return{collectedAtMs:d,host:R.value?.resources,simulators:C,totals:aa(C),errors:D}}async readSnapshot(o,d){try{let c=await this.withinBudget(o,(b)=>this.source.readHostSnapshot(b));return d&&c.processesError?{value:c,error:c.processesError}:{value:c}}catch(c){return e.warn(`host snapshot failed: ${r(c)}`,c),d?{error:r(c)}:{}}}costFor(o,d,c){let b={udid:o.udid,name:o.name,state:o.state,runtime:o.runtime,deviceTypeIdentifier:o.deviceTypeIdentifier,diskBytes:o.dataPathSizeBytes,lastBoot:this.history.latestFor(o.udid)};if(o.state!==ar)return{...b,quality:"not-running"};if(!d.value||d.value.processesError)return{...b,quality:"unavailable",error:d.error??d.value?.processesError??"no host snapshot"};let R=c.get(o.udid);return R?{...b,quality:"measured",process:R}:{...b,quality:"no-processes"}}}function zm(o,d){return{collectedAtMs:o,simulators:[],totals:aa([]),errors:d,inventoryFailed:!0}}function aa(o){let d=o.filter((b)=>b.quality==="measured"),c=d.flatMap((b)=>b.process?.footprintBytes===void 0?[]:[b.process.footprintBytes]);return{bootedCount:o.filter((b)=>b.state===ar).length,measuredCount:d.length,rssBytes:d.reduce((b,R)=>b+(R.process?.rssBytes??0),0),...c.length>0?{footprintBytes:c.reduce((b,R)=>b+R,0)}:{},cpuPercent:d.reduce((b,R)=>b+(R.process?.cpuPercent??0),0),diskBytes:o.reduce((b,R)=>b+(R.diskBytes??0),0)}}var lr={defaultBytes:2684354560,minBytes:1610612736,maxBytes:6442450944},en={defaultBytes:4294967296,minBytes:1610612736,maxBytes:8589934592};function rn(o,d){if(o.length===0)return d.defaultBytes;let c=o.reduce((b,R)=>b+R,0)/o.length;return Math.min(d.maxBytes,Math.max(d.minBytes,c))}function da(o,d,c){if(d===void 0||!Number.isFinite(d))return o;return Math.min(c.maxBytes,Math.max(o,d))}function cr(o,d,c){if(o===void 0)return c.defaultBytes;let b=d.map((W)=>{let U=W.processId===void 0?0:o.reduce((X,z)=>z.pid===W.processId||z.ppid===W.processId?X+z.rssBytes:X,0);return Math.max(U,c.defaultBytes)}),R=new Set(d.map((W)=>W.processId));R.delete(void 0);let P=o.filter((W)=>!R.has(W.pid)&&!R.has(W.ppid)).map((W)=>W.rssBytes).sort((W,U)=>W-U);if(P.length===0)return rn(b,c);let C=o.some((W)=>W.pid!==void 0||W.ppid!==void 0),D=d.filter((W)=>W.handedOff&&(W.processId===void 0||!C)).length,k=P.slice(Math.min(D,P.length-1)),O=k.reduce((W,U)=>W+U,0),F=O/k.length,q=(O+b.reduce((W,U)=>W+U,0))/(k.length+d.length),M=D>=P.length?c.defaultBytes:c.minBytes;return Math.min(c.maxBytes,Math.max(c.minBytes,M,F,q))}function la(o,d,c,{perDeviceBytes:b,coresPerDevice:R=2}){let P=o[d],C=ur(P);if(C!==void 0)return{maxBooted:C,source:"env"};let D=Math.floor(c.totalMemoryBytes*0.5/b),k=Math.floor(c.cpuCount/Math.max(1,R)),O={maxBooted:Math.max(1,Math.min(D,k)),source:"derived"};return P===void 0||P.trim()===""?O:{...O,warning:`${d}=${JSON.stringify(P)} is not a positive integer; using the derived limit`}}function ur(o){if(o===void 0||!/^\d+$/.test(o.trim()))return;let d=Number(o.trim());return d>=1?d:void 0}var mr=h.IOS_SIM_MAX_BOOTED.name,Xm=0.1,Ym=0.6,Qm=0.5,Zm=13,ep=2,ca=h.IOS_SIM_BOOT_CONCURRENCY.name,tp=1.5;function Vq(o,d=[]){let c=o?.simulators??[],b=c.flatMap((k)=>k.quality==="measured"&&k.process?.footprintBytes!==void 0?[{udid:k.udid,footprintBytes:k.process.footprintBytes}]:[]),R=new Set(d.flatMap((k)=>k.deviceId&&!k.replacement?[k.deviceId]:[]));for(let k of c)if(k.state==="Booting")R.add(k.udid);let P=d.filter((k)=>k.deviceId===void 0||k.replacement);if(R.size===0&&P.length===0)return rn(b.map((k)=>k.footprintBytes),lr);let C=new Map(b.map((k,O)=>[k.udid,O])),D=[...P.map(({handedOff:k})=>({handedOff:k})),...[...R].map((k)=>({processId:C.get(k),handedOff:!1}))];return cr(b.map((k,O)=>({rssBytes:k.footprintBytes,pid:O})),D,lr)}function b0(o,d,c=lr.defaultBytes){let b=o[mr],R=ur(b),P=Math.floor(d.totalMemoryBytes*Ym/c),C=Math.floor(d.cpuCount*Qm/Xm),D=o[ca],k=ur(D),O=Number.isSafeInteger(k)?k:void 0,F=ua(mr,b,R),q=ua(ca,D,O);return{maxBooted:R??Math.max(1,Math.min(P,C)),source:R===void 0?"derived":"env",...F?{warning:F}:{},bootConcurrency:O??rp(d.cpuCount),bootConcurrencySource:O===void 0?"derived":"env",...q?{bootConcurrencyWarning:q}:{}}}function rp(o){return o>0?Math.max(ep,Math.ceil(o/Zm)):1}function ua(o,d,c){return c===void 0&&d?.trim()?`${o}=${JSON.stringify(d)} is not a positive integer; using the derived limit`:void 0}function Wq(o){if(!o)return!1;if(o.memoryPressure==="warn"||o.memoryPressure==="critical")return!0;return o.loadAverage1m!==null&&o.cpuCount>0&&o.loadAverage1m/o.cpuCount>=tp}function ma(o,d){if(d.deviceTypeIdentifier===void 0&&d.runtime===void 0&&d.profileId===void 0)return[];let c=new Set(d.excludeUdids??[]);return(o?.simulators??[]).filter((b)=>b.state==="Booted"&&!c.has(b.udid)&&(d.deviceTypeIdentifier===void 0||b.deviceTypeIdentifier===d.deviceTypeIdentifier)&&(d.runtime===void 0||b.runtime===d.runtime)&&(d.profileId===void 0||b.lastBoot?.profileId===d.profileId))}class S0{limit;running=0;waiters=[];constructor(o=1){this.limit=o;this.setLimit(o)}status(){return{limit:this.limit,running:this.running,queued:this.waiters.length}}setLimit(o){if(!Number.isSafeInteger(o)||o<1)throw RangeError("Boot concurrency limit must be a positive integer");this.limit=o,this.drain()}async acquire(o,d){return o?.throwIfAborted(),new Promise((c,b)=>{let R=()=>{let C=this.waiters.indexOf(P);if(C>=0)this.waiters.splice(C,1);b(o?.reason)},P={owner:d,grant:()=>{o?.removeEventListener("abort",R),this.running++;let C=!1;c({release:()=>{if(C)return;C=!0,this.running--,this.drain()}})}};this.waiters.push(P),o?.addEventListener("abort",R,{once:!0}),this.drain()})}drain(){while(this.running<this.limit&&this.waiters.length>0)this.waiters.shift().grant()}}var ip=3,pr="iOS simulator capacity";class nn{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 We;constructor(o,d,c={}){this.fleet=o;this.timer=d;this.bootGate=c.bootGate??new S0,this.optionsOwnership=c.ownership,this.env=c.env??process.env,this.retryAfterMs=c.retryAfterMs??a_,this.sustainedSamples=c.sustainedSamples??ip,this.random=c.random??Ul,this.admittedBoots=c.ledger??new xt(d)}async refresh(o={}){let d=await(o.fresh?this.fleet.collectFresh({deadlineMs:this.timer.now()+(o.sampleTimeoutMs??fc)}):this.fleet.collect());return this.foldIntoPressureHistory(d),d}foldIntoPressureHistory(o){if(o!==this.latestReport)this.latestReport=o,this.pressuredStreak=Wq(o.host)?this.pressuredStreak+1:0}async evaluateBoot(o={}){return this.decide(await this.refresh(),o,"substitute")}async refreshOwnership(o){try{return await this.optionsOwnership?.refresh(),o}catch(d){return e.warn("[BootAdmission] iOS ownership could not be read; using retained ownership labels",d),{...o,ownershipReadFailed:!0}}}decide(o,d,c,{bootUdid:b,window:R,carriesOwnSlot:P}={}){this.assertCountKnown(o);let C=o.simulators.filter((U)=>this.optionsOwnership?.isAutoMobileOwned(U.udid)).map((U)=>U.udid),D=c==="hint"?{...d,excludeUdids:[...d?.excludeUdids??[],...C]}:d??{},k=ma(o,D)[0];if(k&&c==="substitute")return{outcome:"reuse-warm",udid:k.udid};let O=this.limitsFor(o,R),F=zS(o,b);this.forgetExitedStarted(o);let q=F.length+this.inFlightBootCount(o,b,R);if(P)return{outcome:"allow",limits:O,bootedCount:q};let M=new Set([...this.startedUdids,...C]),W=sr(q,this.countLimits(O),this.retryAfterMs,{noun:"simulator",envName:mr,externalDevices:F.filter((U)=>!M.has(U)),heldDevices:F.filter((U)=>M.has(U)),ownershipUnknown:o.ownershipReadFailed});if(W)return o.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 k?{outcome:"reuse-warm",udid:k.udid}:{outcome:"allow",limits:O,bootedCount:q}}async admitBoot(o,d){d.signal?.throwIfAborted();let c=this.reservations.take(d.bootUdid);if(c)return this.withBootPermit(c,d);let b=await Rt({timer:this.timer,platform:"ios",signal:d.signal,label:pr,timeoutRetryAfterMs:this.jitteredRetryAfterMs(),sample:async()=>this.refreshOwnership(await this.refresh({fresh:!0})),ledger:this.admittedBoots,decide:(R,P)=>this.decide(R,o,"hint",{bootUdid:d.bootUdid,window:P}),admit:()=>this.recordAdmission(d.bootUdid,void 0,d.reason)});return this.withBootPermit(b,d)}async withBootPermit(o,d){let c=o.releaseAdmission;if(!c||o.decision.outcome==="refuse")return o;let b=this.bootGate.status(),R=b.running>=b.limit||b.queued>0,P=this.timer.now();if(R)e.info(`[BootAdmission] iOS simulator boot queued behind ${b.running} running boots (limit ${b.limit})`);let C=!1;try{let D=await this.bootGate.acquire(d.signal,d.bootUdid);if(C=!0,R)e.info(`[BootAdmission] iOS simulator boot granted after ${this.timer.now()-P}ms queued`);let k=!1;return{...o,releaseAdmission:(O)=>{if(k)return;k=!0;try{c(O)}finally{D.release()}}}}finally{if(!C)c({bootFailed:!0})}}async reserveBoot(o){let d,c=Math.min(o.timeoutMs,fc),b=await Rt({timer:this.timer,platform:"ios",signal:o.signal,sampleTimeoutMs:c,label:pr,timeoutRetryAfterMs:this.jitteredRetryAfterMs(),sample:async()=>this.refreshOwnership(await this.refresh({fresh:!0,sampleTimeoutMs:c})),ledger:this.admittedBoots,decide:(C,D)=>this.decide(C,void 0,"hint",{bootUdid:o.replacingDeviceId,window:D,carriesOwnSlot:o.reason==="reset"&&o.replacingDeviceId!==void 0&&zS(C).includes(o.replacingDeviceId)}),admit:()=>(d=this.admittedBoots.admit(o.replacingDeviceId,!0,o.reason),d.release)});fr(b);let R=d,P=R.release;return this.reservations.hold((C)=>(R.bind(C),P=this.recordAdmission(C,R),{decision:b.decision,releaseAdmission:P}),()=>P({bootFailed:!0}),()=>R.bind())}recordAdmission(o,d,c){let b=o?this.bootsByUdid.get(o)??{unreleased:0,succeeded:!1}:void 0;if(o&&b)this.startedUdids.add(o),b.unreleased+=1,this.bootsByUdid.set(o,b);let R=d??this.admittedBoots.admit(o,!1,c),P=!1;return(C)=>{if(P)return;if(P=!0,R.release(),!o||!b||this.bootsByUdid.get(o)!==b)return;if(b.unreleased-=1,b.succeeded||=!C?.bootFailed,b.unreleased===0&&!b.succeeded&&!this.seenStartedUdids.has(o))this.forgetStarted(o)}}async assertCapacityAvailable(o={}){if(o.signal?.throwIfAborted(),this.reservations.hasPending())return;return this.sampleInWindow({...o,ownership:!0},(d,c)=>{fr({decision:this.decide(d,void 0,"hint",{window:c})})})}async describeCapacity(o={}){return this.sampleInWindow(o,(d,c)=>(this.assertCountKnown(d),{limit:this.limitsFor(d,c).maxBooted,booted:zS(d).length,inFlight:this.inFlightBootCount(d,void 0,c),admissionsByReason:this.admittedBoots.admissionsByReason(),hostPressure:{sustained:this.pressuredStreak>=this.sustainedSamples,consecutiveSamples:this.pressuredStreak,memoryPressure:d.host?.memoryPressure??"unknown"}}))}async sampleInWindow(o,d){o.signal?.throwIfAborted();let c=this.admittedBoots.beginSample();try{let b=this.timer.now()+fc,R=this.jitteredRetryAfterMs(),P=await l(async()=>{let C=await this.fleet.collectFresh({deadlineMs:b});return o.ownership?this.refreshOwnership(C):C},{timer:this.timer,timeoutMs:fc,signal:o.signal,label:`Collecting ${pr}`,timeoutError:()=>new ze("ios",{code:"timeout",message:`timed out after ${fc}ms collecting ${pr}`,retryable:!0,retryAfterMs:R},void 0,R)});return o.signal?.throwIfAborted(),d(P,c)}finally{c.close()}}jitteredRetryAfterMs(){return Math.round(this.retryAfterMs*(1+this.random.next()))}assertCountKnown(o){if(!o.inventoryFailed)return;let d=o.errors.join("; ")||"simctl list failed";throw e.warn(`[BootAdmission] iOS simulator count unknown; refusing to boot: ${d}`),new ze("ios",{code:"failed",message:`simulator count unknown (${d})`,retryable:!0})}forgetExitedStarted(o){let d=new Set(zS(o));for(let c of this.startedUdids)if(d.has(c))this.seenStartedUdids.add(c);else if(this.seenStartedUdids.delete(c))this.forgetStarted(c)}forgetStarted(o){this.startedUdids.delete(o),this.seenStartedUdids.delete(o),this.bootsByUdid.delete(o)}inFlightBootCount(o,d,c){return this.admittedBoots.inFlightCount(new Set(zS(o)),d,c)}countLimits({maxBooted:o,source:d,warning:c}){return{maxBooted:o,source:d,...c?{warning:c}:{}}}limitsFor(o,d){if(!o.host){if(!this.warnedHostUnreadable)this.warnedHostUnreadable=!0,e.warn("[BootAdmission] host resources unreadable; limiting simulator boots to 1");return this.warnOnUnusableLimit(b0(this.env,{totalMemoryBytes:0,cpuCount:0}))}let{boots:c}=this.admittedBoots.inFlightView(new Set,void 0,d);return this.warnOnUnusableLimit(b0(this.env,o.host,Vq(o,c)))}warnOnUnusableLimit(o){if(o.warning&&o.warning!==this.warnedLimit)this.warnedLimit=o.warning,e.warn(`[BootAdmission] ${o.warning}`);if(o.bootConcurrencyWarning&&o.bootConcurrencyWarning!==this.warnedBootConcurrency)this.warnedBootConcurrency=o.bootConcurrencyWarning,e.warn(`[BootAdmission] ${o.bootConcurrencyWarning}`);return this.bootGate.setLimit(o.bootConcurrency),o}}function fr(o){Et(o,"ios","simulator")}import{totalmem as wp}from"os";async function gr(o,d={}){let c=await o.executeCommand("ps",xD,{signal:d.signal,timeoutMs:d.timeoutMs,maxBuffer:Ine}),{rows:b,skipped:R}=zz(c.stdout);if(b.length===0)throw Error(`ps returned no parseable processes (${R} unparseable rows)`);return b}var pa=["list","devices","--json"];function fa(o){let d=uf(o).devices;if(d===null||typeof d!=="object")throw Error("simctl list output has no devices map");return Object.entries(d).flatMap(([c,b])=>(Array.isArray(b)?b:[]).flatMap((R)=>np(c,R)))}function np(o,d){if(typeof d.udid!=="string"||typeof d.state!=="string")return[];return[{udid:d.udid,name:typeof d.name==="string"?d.name:d.udid,state:d.state,runtime:o,deviceTypeIdentifier:typeof d.deviceTypeIdentifier==="string"?d.deviceTypeIdentifier:void 0,dataPathSizeBytes:typeof d.dataPathSize==="number"?d.dataPathSize:void 0,isAvailable:d.isAvailable!==!1}]}var op=["-l","1","-stats","pid,mem"],lp=16777216,up={B:1,K:1024,M:1048576,G:1073741824,T:1099511627776},mp=/^\s*(\d+)\s+(\d+(?:[.,]\d+)?)([BKMGT])?[+-]?\s*$/;function pp(o){let d=new Map,c=0,b=!1;for(let R of o.split(`
|
|
159
|
+
`)){if(!b){b=/^\s*PID\s+MEM\b/.test(R);continue}if(R.trim()==="")continue;let P=mp.exec(R);if(P)d.set(Number(P[1]),Math.round(Number(P[2].replace(",","."))*up[P[3]??"B"]));else c+=1}return{footprints:d,skipped:c}}async function fp(o,d={}){let c=await o.executeCommand("top",op,{signal:d.signal,timeoutMs:d.timeoutMs,maxBuffer:lp}),{footprints:b,skipped:R}=pp(c.stdout);if(b.size===0)throw Error(`top returned no parseable footprints (${R} unparseable rows)`);return b}var gp=20000,hp=60000,yp=5000,vp=300000;class on{executor;timer;limits;cached;inFlight;constructor(o,d,c={}){this.executor=o;this.timer=d;this.limits=c}async read(o={}){o.signal?.throwIfAborted();let d=this.cachedWithin(this.limits.ttlMs??gp);if(d)return d;let c=Math.min(o.timeoutMs??Number.POSITIVE_INFINITY,this.limits.maxWaitMs??yp);try{return await l(()=>this.run(),{timer:this.timer,timeoutMs:c,signal:o.signal,label:"Reading host memory footprints"})}catch(b){o.signal?.throwIfAborted();let R=this.cachedWithin(this.limits.staleMaxAgeMs??vp);if(R)return e.warn(`using stale host footprints: ${r(b)}`),R;throw b}}cachedWithin(o){return this.cached&&this.timer.now()-this.cached.takenAtMs<o?this.cached.footprints:void 0}run(){if(!this.inFlight){let o=fp(this.executor,{timeoutMs:this.limits.runTimeoutMs??hp}).then((d)=>(this.cached={takenAtMs:this.timer.now(),footprints:d},d)).finally(()=>{if(this.inFlight===o)this.inFlight=void 0});this.inFlight=o,o.catch((d)=>{e.debug(`host footprint run failed: ${r(d)}`)})}return this.inFlight}}function ya(o,d){return o.map((c)=>{let b=d.get(c.pid);return b===void 0?c:{...c,footprintBytes:b}})}var an={totalMemoryBytes:()=>wp(),cpuCount:()=>jz.cpuCount(),loadAverage1m:()=>jz.loadAverage1m()},Sp=["-n","kern.memorystatus_vm_pressure_level"];function bp(o){switch(o.trim()){case"1":return"normal";case"2":return"warn";case"4":return"critical";default:return"unknown"}}class HA{executor;timer;os;simctl;footprintReader;constructor(o,d,c=an,{simctl:b=new L(null),footprintReader:R=new on(o,d)}={}){this.executor=o,this.timer=d,this.os=c,this.simctl=b,this.footprintReader=R}async readHostSnapshot(o={}){let[d,c]=await Promise.all([this.readProcesses(o),this.readResources(o)]);return{takenAtMs:this.timer.now(),resources:c,...d}}async readInventory(o={}){let d=await this.simctl.executeCommandArgs([...pa],o.timeoutMs,o.signal);return fa(d.stdout)}async readProcesses(o){let[d,c]=await Promise.allSettled([gr(this.executor,o),this.footprintReader.read(o)]);if(d.status==="rejected")return e.warn(`host process table read failed: ${r(d.reason)}`,d.reason),{processes:[],processesError:r(d.reason)};if(c.status==="rejected")return e.warn(`host footprint read failed: ${r(c.reason)}`,c.reason),{processes:d.value,footprintError:r(c.reason)};return{processes:ya(d.value,c.value)}}async readResources(o){return{totalMemoryBytes:this.os.totalMemoryBytes(),cpuCount:this.os.cpuCount(),loadAverage1m:this.os.loadAverage1m(),memoryPressure:await this.readMemoryPressure(o)}}async readMemoryPressure(o){try{let d=await this.executor.executeCommand("sysctl",Sp,{signal:o.signal,timeoutMs:o.timeoutMs});return bp(d.stdout)}catch(d){return e.debug(`memory pressure read failed: ${r(d)}`),"unknown"}}}import{createHash as _p}from"crypto";function hr(o){return Object.keys(o).flatMap((d)=>{let c=o[d];return c===void 0?[]:[[d,c]]})}function c_(o){return _p("sha256").update(Fr(Object.fromEntries(hr(o.resources)))).digest("hex")}var Rp={state:"unknown",reason:"The observation did not report this resource."};function w0(o,d,c={}){let b=[];for(let[R,P]of hr(o)){let C=d[R]??Rp;if(C.state===P)continue;let D=C.state==="unsupported"?"unsupported":C.state==="unknown"?"commandFailure":"missingRequested";b.push({resource:R,kind:D,expected:P,observed:C})}for(let[R,P]of hr(c)){let C=d[R];if(o[R]===void 0&&C?.state===P)b.push({resource:R,kind:"ownedExtra",expected:P,observed:C})}return b}function zq(o,d,c,b){let R={...o};for(let P of c)if(d[P]==="disabled")R[P]="disabled";else if(d[P]==="enabled")delete R[P];return Object.fromEntries(hr(R).filter(([P,C])=>{let D=b[P]?.state;return C==="disabled"&&D!=="enabled"&&D!=="unsupported"}))}function Pp(o){return c_(o??{resources:{}})}class ln{options;constructor(o){this.options=o}async reserveBoot(o){return this.options.gate?this.options.gate.reserveBoot(o):new We().hold(()=>{},()=>{})}async run(o,d){let{history:c,timer:b,gate:R}=this.options,P=Pp(o.profile),C=R?await this.admit(R,o,P):void 0,D=b.now(),k,O=!0;try{k=await d(o.timeoutMs),O=!1}finally{C?.(O?{bootFailed:!0}:void 0)}let F=b.now();return c.record({reason:o.reason??"create",udid:o.udid,profileId:P,durationMs:F-D,recordedAtMs:F}),k}async admit(o,d,c){let b=await o.admitBoot({runtime:d.runtime,profileId:c,excludeUdids:[d.udid]},{signal:d.signal,bootUdid:d.udid,reason:d.reason});if(fr(b),b.decision.outcome==="reuse-warm")(this.options.logger??e).info(`compatible warm simulator ${b.decision.udid} is booted; booting ${d.udid} as requested`);return b.releaseAdmission}}function va(o){let d=o.env??process.env;if(!or("ios",d))return;let{timer:c}=o;return new nn(new UA(new HA(o.executor??new ee,c,void 0,{simctl:o.simctl}),o.history,c),c,{env:d,ownership:o.ownership})}function d_(o){return new ln({history:o.history??new $A,timer:o.timer,gate:o.gate})}var wa=h.ANDROID_MAX_BOOTED.name,Sa="binding replacement",Ep=2000;class cn{source;timer;env;retryAfterMs;resolvedHardware;ledger;reservations=new We;hostRegistry;publications=new Map;lastProcessTableFailure;admissionsWithoutProcessTable=0;lastAdmissionWithoutProcessTableAtMs;warnedLimit;startedSerials=new Set;listedStartedSerials=new Set;constructor(o,d,c={}){this.source=o;this.timer=d;this.env=c.env??process.env,this.retryAfterMs=c.retryAfterMs??a_,this.resolvedHardware=c.resolvedHardware,this.ledger=new xt(d),this.hostRegistry=c.hostRegistry}async admit(o){return o.signal?.throwIfAborted(),this.reservations.take()??(await this.admitNew(o)).admission}async reserveBoot(o){let d=await this.admitNew({...o,avdName:Sa},o.replacingDeviceId);return this.reservations.hold(()=>(d.bind(),d.admission),d.admission.release,d.markReplacedDeviceGone)}async admitNew(o,d){let c=this.timer.now()+o.timeoutMs,b=this.resolvedHardware?await this.candidateHardware(o):void 0,R,P,C=[],D,k=()=>Rt({timer:this.timer,platform:"android",signal:o.signal,sampleTimeoutMs:Math.min(o.timeoutMs,fc),label:"Android emulator capacity",sample:async()=>{let U=this.timer.now()+Math.min(o.timeoutMs,fc)-500,X=this.readPeers(),z=await this.sampleKnownCount({signal:o.signal,deadlineMs:U});return D=z,C=this.unionPeers(X,this.readPeers()),z},ledger:this.ledger,decide:(U,X)=>this.decide(U,{window:X,peers:C,replacingDeviceId:d,candidate:b}),admit:()=>{R=this.ledger.admit(d,d!==void 0);try{if(P=this.hostRegistry?.publish({admittedUntilMs:c,...d!==void 0?{deviceId:d,replacement:!0}:{}}),P)this.publications.set(P,{})}catch(U){throw R.release(),this.registryFailure(U)}return R.release}}),O=await this.runWithHostLock(o,k).catch((U)=>{throw R?.release(),this.removePublication(P),U});Et(O,"android","emulator");let F=R;if(!F)throw new t(`Boot admission for AVD '${o.avdName}' ended without a slot`);if(D?.processTableFailure)this.recordAdmissionWithoutProcessTable(o.avdName,D);let q=new Set,M=!1;return{admission:{release:()=>{M=!0,F.release(),this.removePublication(P);for(let U of q)if(!this.listedStartedSerials.has(U))this.startedSerials.delete(U);q.clear()},handOff:(U,X)=>{if(M)return;if(U!==void 0)this.startedSerials.add(U),q.add(U);F.handOff(U,c,X);let z=P?this.publications.get(P):void 0;if(z)z.deviceId=U??z.deviceId,z.handedOffUntilMs=c;this.updatePublication(P,()=>P?.update({deviceId:U,processId:X,handedOffUntilMs:c,...d!==void 0?{replacement:!1}:{}}))}},markReplacedDeviceGone:()=>{F.bind();try{P?.clearDeviceId()}catch(U){e.warn(`[BootAdmission] Failed to clear replaced device '${d}' 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(U)}`,U)}},bind:()=>F.bind()}}async assertCapacityAvailable(o={}){if(o.signal?.throwIfAborted(),this.reservations.hasPending())return;let{sample:d,window:c,peers:b}=await this.sampleInWindow(o);Et({decision:this.decide(d,{window:c,peers:b})},"android","emulator")}async describeCapacity(o={}){let{sample:d,window:c,peers:b}=await this.sampleInWindow(o),R=this.count(d,c,b);return{limit:R.limits.maxBooted,booted:R.booted,inFlight:R.inFlight,...this.describeProcessTable(d)}}recordAdmissionWithoutProcessTable(o,d){let c=d.processTableFailure;this.admissionsWithoutProcessTable+=1,this.lastAdmissionWithoutProcessTableAtMs=this.timer.now();let b=`[BootAdmission] Admitted AVD '${o}' on adb-only count ${d.emulatorSerials.length}: ${c.reason}, attempts=${c.attempts}: ${c.detail}`;if(c.reason==="unsupported-platform")e.debug(b);else e.warn(b)}describeProcessTable(o){let d=o.processTableFailure??this.lastProcessTableFailure;if(!d||!o.processTableFailure&&this.admissionsWithoutProcessTable===0)return{};return{processTable:{unavailable:o.processTableFailure!==void 0,reason:d.reason,detail:d.detail,attempts:d.attempts,admissionsWithoutProcessTable:this.admissionsWithoutProcessTable,...this.lastAdmissionWithoutProcessTableAtMs!==void 0?{lastAdmissionWithoutProcessTableAtMs:this.lastAdmissionWithoutProcessTableAtMs}:{}}}}async sampleInWindow(o){o.signal?.throwIfAborted();let d=this.ledger.beginSample(),c=new AbortController,b=o.signal?AbortSignal.any([o.signal,c.signal]):c.signal;try{let R=this.readPeers(),P=await l(()=>this.sampleKnownCount({signal:b}),{timer:this.timer,timeoutMs:fc,signal:o.signal,label:"Collecting Android emulator capacity",timeoutError:()=>Zi("android",fc,"Android emulator capacity"),onTimeout:()=>c.abort()});return o.signal?.throwIfAborted(),{sample:P,window:d,peers:this.unionPeers(R,this.readPeers())}}finally{d.close()}}async sampleKnownCount(o){let d=await this.source.sample({...o,deadlineMs:o.deadlineMs??this.timer.now()+fc-500});if(d.processTableFailure)this.lastProcessTableFailure=d.processTableFailure;if(d.errors.length===0)return d;let c=d.errors.join("; ");if(d.serialListingFailed&&d.emulatorProcessRssBytes===void 0)throw e.warn(`[BootAdmission] Android emulator count unknown; refusing to boot: ${c}`),new Gr({code:"failed",message:`emulator count unknown (${c})`,retryable:!0});return e.debug(`[BootAdmission] Android capacity sample partially failed: ${c}`),d}decide(o,{window:d,peers:c=[],replacingDeviceId:b,candidate:R}={}){this.forgetExitedSerials(o);let{limits:P,effective:C}=this.count(o,d,c,R),D=b!==void 0&&o.emulatorSerials.includes(b)?1:0;if(C-D<P.maxBooted)return{outcome:"allow",limits:P,bootedCount:C};return sr(C,P,this.retryAfterMs,{noun:"emulator",envName:wa,externalDevices:o.emulatorSerials.filter((k)=>!this.startedSerials.has(k))})??{outcome:"allow",limits:P,bootedCount:C}}forgetExitedSerials(o){if(o.serialListingFailed)return;let d=new Set(o.emulatorSerials);for(let c of this.startedSerials)if(d.has(c))this.listedStartedSerials.add(c);else if(this.listedStartedSerials.delete(c))this.startedSerials.delete(c)}count(o,d,c=[],b){this.removeListedPublications(o);let R=o.emulatorSerials.length,P=o.emulatorProcessRssBytes?.length??0,C=new Set((o.emulatorProcessIds??[]).flatMap((X)=>[X.pid,X.ppid])),D=this.ledger.inFlightView(new Set(o.emulatorSerials),void 0,d,C),k=this.countPeers(c,new Set(o.emulatorSerials),C),O=D.count+k.count,F=Math.max(R,P),q=O-D.withListedProcess-k.withListedProcess,M=Math.max(R+O,P+q),W=Math.max(R+O,P+q+D.listedWithoutProcess+k.listedWithoutProcess),U=this.limitsFor(o,[...D.boots,...k.boots],b);return{booted:F,inFlight:M-F,effective:W,limits:U}}async runWithHostLock(o,d){if(!this.hostRegistry)return d();let c=!1,b=async()=>{try{return await d()}catch(R){throw c=!0,R}};try{return await this.hostRegistry.withAdmissionLock({timeoutMs:Math.min(o.timeoutMs,fc),signal:o.signal},b)}catch(R){if(o.signal?.aborted)throw o.signal.reason;if(c)throw R;throw this.registryFailure(R)}}readPeers(){try{return this.hostRegistry?.readPeerAdmissions()??[]}catch(o){throw this.registryFailure(o)}}registryFailure(o){return e.warn(`[BootAdmission] Android host registry refused admission: ${r(o)}`,o),new Gr({code:o instanceof He?o.code:"failed",message:`Host boot registry: ${r(o)}`,retryable:!0})}unionPeers(o,d){return[...new Map([...o,...d].map((c)=>[c.id,c])).values()]}countPeers(o,d,c){let b=o.filter((D)=>{let k=D.handedOffUntilMs??D.admittedUntilMs;return k===void 0||this.timer.now()<k}),R=(D)=>D.deviceId!==void 0&&d.has(D.deviceId),P=(D)=>D.processId!==void 0&&c.has(D.processId),C=b.filter((D)=>!R(D));return{count:C.length,boots:C.map((D)=>({processId:D.processId,handedOff:D.handedOffUntilMs!==void 0})),withListedProcess:C.filter(P).length,listedWithoutProcess:b.filter((D)=>R(D)&&!P(D)&&!D.replacement).length}}updatePublication(o,d){if(!o)return!1;try{return d(),!0}catch(c){return e.warn(`[BootAdmission] Host registry update/remove failed: ${r(c)}`,c),!1}}removePublication(o){if(!o)return;let d=this.publications.get(o);if(d)d.pendingRemoval=!0;if(this.updatePublication(o,()=>o.remove()))this.publications.delete(o)}removeListedPublications(o){for(let[d,c]of this.publications){let b=c.deviceId!==void 0&&o.emulatorSerials.includes(c.deviceId),R=c.handedOffUntilMs!==void 0&&this.timer.now()>=c.handedOffUntilMs;if(c.pendingRemoval||b||R)this.removePublication(d)}}coresPerDevice(o){return I(h.ANDROID_BOOT_BUDGET_VCPUS,this.env)?.trim().toLowerCase()==="configured"?o?.cpuCores:void 0}async candidateHardware(o){let d=this.resolvedHardware;if(!d||o.avdName===Sa)return;try{return await l(()=>d(o.avdName,o.signal),{timer:this.timer,timeoutMs:Ep,signal:o.signal,label:"Reading resolved AVD hardware"})}catch(c){if(o.signal?.aborted)throw c;e.warn(`[BootAdmission] Could not read resolved hardware for '${o.avdName}': ${r(c)}`,c);return}}limitsFor(o,d,c){let b=la(this.env,wa,o.host,{perDeviceBytes:da(cr(o.emulatorProcessRssBytes?.map((R,P)=>({rssBytes:R,...o.emulatorProcessIds?.[P]})),d,en),c?.guestBytes,en),coresPerDevice:this.coresPerDevice(c)});if(b.warning&&b.warning!==this.warnedLimit)this.warnedLimit=b.warning,e.warn(`[BootAdmission] ${b.warning}`);return b}}import{readFile as xp}from"fs/promises";var ap={listEntries:()=>er("/proc"),readText:(o)=>xp(o,"utf8")},ba=32;function Cp(o){let d=new Map;for(let c of o.split(`
|
|
160
|
+
`)){let b=c.indexOf(":");if(b>=0)d.set(c.slice(0,b).trim(),c.slice(b+1).trim())}return d}function _a(o){if(o===void 0||!/^\d+$/.test(o))return;let d=Number(o);return Number.isSafeInteger(d)?d:void 0}function Ap(o){if(o===void 0)return 0;let[d,c,b]=o.split(/\s+/),R=_a(d);if(R===void 0||c!=="kB"||b!==void 0)return;let P=R*1024;return Number.isSafeInteger(P)?P:void 0}function Tp(o,d,c){let b=Cp(d),R=_a(b.get("PPid")),P=Ap(b.get("VmRSS"));if(R===void 0||P===void 0)return;let C=c.split("\x00");if(C.at(-1)==="")C.pop();return{pid:o,ppid:R,rssBytes:P,command:c===""?`[${b.get("Name")??""}]`:C.join(" ")}}function Dp(o){return o instanceof Error&&"code"in o&&(o.code==="ENOENT"||o.code==="ESRCH")}function kp(o){return typeof o==="object"&&o!==null&&"code"in o&&(o.code==="EACCES"||o.code==="EPERM")}async function Bp(o,d){try{let c=await o.readText(`/proc/${d}/status`),b=await o.readText(`/proc/${d}/cmdline`),R=Tp(Number(d),c,b);return{row:R,incomplete:R===void 0}}catch(c){if(kp(c))return e.debug(`[BootAdmission] skipping denied /proc/${d}: ${r(c)}`),{deniedError:c,incomplete:!0};if(!Dp(c))throw u(c,`Reading /proc/${d}`);return e.debug(`[BootAdmission] skipping exited /proc/${d}: ${r(c)}`),{}}}async function Ra(o,{signal:d}={}){d?.throwIfAborted();let c=(await o.listEntries()).filter((D)=>/^\d+$/.test(D)),b=[],R=0,P=!1,C;for(let D=0;D<c.length;D+=ba){d?.throwIfAborted();let k=await Promise.all(c.slice(D,D+ba).map((F)=>Bp(o,F))),O=k.flatMap(({row:F})=>F?[F]:[]);b.push(...O),R+=k.length-O.length,P||=k.some((F)=>F.incomplete),C??=k.find((F)=>F.deniedError!==void 0)?.deniedError}if(d?.throwIfAborted(),R>0)e.debug(`[BootAdmission] /proc skipped ${R} exited, denied or unparseable rows`);if(b.length===0){if(C!==void 0)throw u(C,"Reading /proc: no readable processes");throw Error(`/proc returned no parseable processes (${R} unparseable rows)`)}return{value:b,incomplete:P}}var Mp=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"]]),Pa=new Set(["timeout","spawn-resources","exit","killed"]),Np=/operation not permitted|permission denied/i,Fp=/illegal option|invalid option|unrecognized option|usage:/i,Ea=250,Lp=3;function Da(o){return Buffer.isBuffer(o)?o.toString():typeof o==="string"?o:""}function qp(o,d){if(o===0)return"unknown";let c=Da(d);if(o===126||Np.test(c))return"denied";if(o===127)return"not-found";return Fp.test(c)?"unsupported-flags":"exit"}function Up(o,d,c){return"killed"in o&&o.killed===!0&&d==="SIGTERM"&&c===null?"timeout":"killed"}function $p(o){let d="code"in o?o.code:void 0;if(typeof d==="string")return Mp.get(d)??"unknown";if(typeof d==="number")return qp(d,"stderr"in o?o.stderr:void 0);if("signal"in o&&typeof o.signal==="string")return Up(o,o.signal,d);return/^(?:ps|\/proc) returned no parseable processes/.test(r(o))?"unparseable":"unknown"}function Hp(o,d,c){if(d==="timeout")return`timed out after ${c}ms`;if(d==="killed"&&"signal"in o)return`killed by ${String(o.signal)}`;let b="code"in o?o.code:void 0;if(typeof b==="number"){let P=Da("stderr"in o?o.stderr:void 0).split(/\r?\n/).find((C)=>C.trim());return P?`exit ${b}: ${P}`:`exit ${b}`}let R=r(o);return typeof b==="string"?`${b}: ${R}`:R}function Aa(o,d){let c=new Set,b="unknown",R=r(o);for(let P=o;typeof P==="object"&&P!==null&&!c.has(P);){if(c.add(P),"name"in P&&P.name==="AbortError")throw o;let C=$p(P);if(C!=="unknown")b=C,R=Hp(P,C,d);P="cause"in P?P.cause:void 0}return{reason:b,detail:R.split(/\r?\n/,1)[0].slice(0,200)}}class lu{executor;timer;attemptTimeoutMs;maxAttempts;backoff;budgetMs;supported;warnedReasons=new Set;warnedProcReasons=new Set;procFs;exitDeterministicAfterSamples;consecutiveExitSamples=0;exitLatched=!1;procLatched=!1;constructor(o,d={}){this.executor=o;this.timer=d.timer??i,this.attemptTimeoutMs=d.attemptTimeoutMs??5000,this.maxAttempts=d.maxAttempts??4,this.backoff=Lo(d.backoff??Q({initialDelayMs:100,maxDelayMs:800})),this.budgetMs=d.budgetMs??9000,this.supported=d.processTableSupported??!0,this.procFs=d.procFs,this.exitDeterministicAfterSamples=d.exitDeterministicAfterSamples??Lp}async read(o){try{return await this.readSupported(o)}catch(d){throw this.consecutiveExitSamples=0,e.debug(`[BootAdmission] process table read cancelled: ${r(d)}`),d}}async readSupported(o){if(o.signal?.throwIfAborted(),!this.supported)return this.failed({reason:"unsupported-platform",transient:!1,attempts:0,detail:"Host platform has no ps process table"});let d=o.deadlineMs??this.timer.now()+this.budgetMs;if(this.procLatched)return this.readProc(o,d);return this.readPs(o,d)}async readPs(o,d){let c;for(let b=1;;b++){o.signal?.throwIfAborted();let R=b===1?this.attemptTimeoutMs:Math.min(this.attemptTimeoutMs,d-this.timer.now());try{let P=await this.attempt((C)=>gr(this.executor,{signal:C,timeoutMs:R}),R,o.signal,"ps");if(this.resetExitLatch(),c)e.info(`[BootAdmission] emulator process snapshot succeeded on attempt ${b} after ${c}`);return{value:P}}catch(P){o.signal?.throwIfAborted();let{reason:C,detail:D}=Aa(P,R),k=Pa.has(C)&&!(C==="exit"&&this.exitLatched),O={reason:C,transient:k,attempts:b,detail:D},F=this.retryDelay(O,d);if(F===void 0)return this.finishPsFailure(O,P,o,d);if(c=C,await l(()=>this.timer.sleep(F),{timer:this.timer,signal:o.signal,label:"Android process table retry backoff"}),d-this.timer.now()<Ea)return this.finishPsFailure(O,P,o,d)}}}async attempt(o,d,c,b){let R=new AbortController,P=c?AbortSignal.any([c,R.signal]):R.signal;return l(()=>o(P),{timer:this.timer,timeoutMs:d,signal:c,label:`Android ${b} process table`,timeoutError:()=>{let C=Object.assign(Error(`timed out after ${d}ms`),{killed:!0,signal:"SIGTERM",code:null});return b==="ps"?PD(C,{command:"ps",args:xD}):C},onTimeout:()=>R.abort()})}resetExitLatch(){this.consecutiveExitSamples=0,this.exitLatched=!1,this.warnedReasons.delete("exit")}recordPsFailure(o){if(o.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: ${o.detail}`)}finishPsFailure(o,d,c,b){if(this.recordPsFailure(o),!o.transient&&this.procFs)return this.readProc(c,b,o);return this.failed(o,r(d))}async readProc(o,d,c){let b=Math.max(0,Math.min(this.attemptTimeoutMs,d-this.timer.now()));try{let R=await this.attempt((P)=>Ra(this.procFs,{signal:P}),b,o.signal,"/proc");if(!this.procLatched)e.info(`[BootAdmission] ps unavailable (${c?.reason}: ${c?.detail}); using /proc process table instead`),this.procLatched=!0;return R}catch(R){o.signal?.throwIfAborted();let P=Aa(R,b),C=c?`; ps ${c.reason}`:"",D=`/proc: ${P.detail.slice(0,193-C.length)}${C}`,k={...P,detail:D,transient:Pa.has(P.reason),attempts:c?.attempts??0},O=this.failed(k,D,this.warnedProcReasons);return this.warnedProcReasons.add(k.reason),O}}retryDelay(o,d){if(!o.transient||o.attempts>=this.maxAttempts)return;let c=this.backoff.delayForAttempt(o.attempts);return this.timer.now()+c+Ea<=d?c:void 0}failed(o,d=o.detail,c=this.warnedReasons){let b=`[BootAdmission] emulator process snapshot unavailable: ${o.reason}, attempts=${o.attempts}: ${o.detail}`;if(o.reason==="unsupported-platform"||c.has(o.reason))e.debug(b);else e.warn(b);if(!o.transient)c.add(o.reason);return{failure:o,error:`ps: ${d}`}}}function Ia(o,d){return async(c)=>{let R=(await o.getDeviceStates({timeoutMs:d,signal:c,throwOnMissingAdb:!0})).map((P)=>P.deviceId).filter((P)=>P.startsWith("emulator-"));return[...new Set(R)]}}class mn{listEmulatorSerials;os;processTable;constructor(o,d,c=an,b={}){this.listEmulatorSerials=o;this.os=c;this.processTable=new lu(d,b)}async sample(o={}){let d=await this.readSerials(o.signal),c=await this.processTable.read(o),b=c.value?.filter(Cu);return{emulatorSerials:d.value??[],emulatorProcessRssBytes:b?.map((R)=>R.rssBytes),emulatorProcessIds:b?.map((R)=>({pid:R.pid,ppid:R.ppid})),host:{totalMemoryBytes:this.os.totalMemoryBytes(),cpuCount:this.os.cpuCount()},errors:[d.error,c.error].filter((R)=>R!==void 0),...c.failure?{processTableFailure:c.failure}:{},...d.error!==void 0?{serialListingFailed:!0}:{}}}async readSerials(o){try{return{value:await this.listEmulatorSerials(o)}}catch(d){return o?.throwIfAborted(),e.warn(`[BootAdmission] adb emulator listing failed: ${r(d)}`,d),{error:`adb: ${r(d)}`}}}}var Vp=5000;function jp(o=process.env,d){return Wp(Xu(Rg(o),"boot-admissions",o,d),"android")}var ka,pn;function sQ(o){pn=o}var Kp={refresh:async()=>{await pn?.refresh()},isAutoMobileOwned:(o)=>pn?.isAutoMobileOwned(o)??!1};function yh(o={}){return ka??=Gp(o),ka}function Gp(o={}){let d=o.env??process.env,c=o.timer??i,b=new $A,R=!yn.bootAdmissionGatesDisabled&&or("android",d),P=new ee;return{android:R?new cn(new mn(Ia({getDeviceStates:async(C)=>{let D=v.create(null);if(!D.getDeviceStates)throw new t("adb client cannot list raw device states");return D.getDeviceStates(C)}},Vp),P,void 0,{timer:c,processTableSupported:(o.hostPlatform??process.platform)!=="win32",procFs:(o.hostPlatform??process.platform)==="linux"?ap:void 0}),c,{env:d,resolvedHardware:async(C)=>{let D=await new Nr().readConfig(C);return D?{...D.effectiveRamMb===void 0?{}:{guestBytes:D.effectiveRamMb*1024*1024},...D.effectiveCpuCores===void 0?{}:{cpuCores:D.effectiveCpuCores}}:void 0},hostRegistry:new Qi({timer:c,directory:()=>jp(d)})}):void 0,ios:yn.bootAdmissionGatesDisabled||(o.hostPlatform??process.platform)!=="darwin"?void 0:va({simctl:new L(null),timer:c,history:b,ownership:Kp,env:d,executor:P}),iosBootHistory:b}}function R0(o){return o==="android"?"android":"ios"}async function jS(o,d={},c=yh()){await c[R0(o)]?.assertCapacityAvailable(d)}async function jq(o,d,c=yh()){return d.signal?.throwIfAborted(),await c[R0(o)]?.reserveBoot(d)??{run:(b)=>b(),release:()=>{},markReplacedDeviceGone:()=>{}}}var Jp=3000;async function aQ(o,d=zp(yh()),c=i){let b=await Promise.all(o.map(async(P)=>{let C=d[P];if(!C)return[];let D=new AbortController;try{let k=await l(()=>C.describeCapacity({signal:D.signal}),{timer:c,timeoutMs:Jp,label:`Reporting ${P} boot capacity`,onTimeout:()=>D.abort()});return[[P,k]]}catch(k){return e.warn(`[BootAdmission] ${P} capacity report failed: ${r(k)}`,k),[]}})),R=Object.fromEntries(b.flat());return Object.keys(R).length>0?R:void 0}function zp(o){return{...o.android?{android:o.android}:{},...o.ios?{ios:o.ios}:{}}}import{performance as Xp}from"perf_hooks";import Qp from"fs";import Zp from"path";var ef="STARTUP_BENCHMARK";function tf(o,d){if(o.includes("--startup-benchmark"))return!0;return o.includes("--daemon-mode")&&$e(h.STARTUP_BENCHMARK,d)}var rf=tf(process.argv,process.env),of=I(h.STARTUP_BENCHMARK_OUTPUT),sf=I(h.STARTUP_BENCHMARK_LABEL);class Ba{marks=new Map;phaseStarts=new Map;phases=new Map;emitted=!1;emittedReport;enabled;outputPath;label;now;fileSystem;constructor(o,d={}){this.enabled=o;let c=d.outputPath??of;this.outputPath=c?Se(c):void 0,this.label=d.label??sf,this.now=d.now??Xp.now,this.fileSystem=d.fileSystem??Qp}isEnabled(){return this.enabled}mark(o){if(!this.enabled||this.marks.has(o))return;this.marks.set(o,this.now()),this.persistCheckpoint()}startPhase(o){if(!this.enabled||this.phases.has(o)||this.phaseStarts.has(o))return;this.phaseStarts.set(o,this.now()),this.persistCheckpoint()}async runPhase(o,d){this.startPhase(o);let c=await d();return this.endPhase(o),c}endPhase(o){if(!this.enabled||this.phases.has(o))return;let d=this.phaseStarts.get(o);if(d===void 0)return;this.phases.set(o,this.now()-d),this.phaseStarts.delete(o),this.persistCheckpoint()}recordPhase(o,d){if(!this.enabled||this.phases.has(o))return;this.phases.set(o,d),this.persistCheckpoint()}emit(o,d={}){if(!this.enabled||this.emitted)return;this.emitted=!0,this.emittedReport={type:o,meta:d};let c=this.createReport(o,"ready",d),b=JSON.stringify(c);if(this.writeReport(b),DE()==="json"){e.info(b);return}process.stderr.write(`${ef} ${b}
|
|
161
|
+
`)}persistCheckpoint(){if(!this.enabled)return;let o=this.emittedReport?this.createReport(this.emittedReport.type,"ready",this.emittedReport.meta):this.createReport("startup-checkpoint","in_progress");this.writeReport(JSON.stringify(o))}createReport(o,d,c={}){let b=Object.fromEntries(this.marks.entries()),R=Object.fromEntries(this.phases.entries());return{type:o,state:d,timestamp:new Date().toISOString(),pid:process.pid,label:this.label,marks:b,phases:R,activePhases:[...this.phaseStarts.keys()],memoryUsage:process.memoryUsage(),meta:c}}writeReport(o){if(!this.outputPath)return;let d=Zp.dirname(this.outputPath);if(!this.fileSystem.existsSync(d))this.fileSystem.mkdirSync(d,{recursive:!0});let c=`${this.outputPath}.${process.pid}.tmp`;this.fileSystem.writeFileSync(c,o,"utf-8"),this.fileSystem.renameSync(c,this.outputPath)}}var Ot=new Ba(rf);var P0=9000,af=100;class Oa{lifecycleProcess;timer;shutdownTimeoutMs;installed=!1;stdinShutdownHandlersInstalled=!1;stdoutShutdownHandlerInstalled=!1;stderrErrorGuardInstalled=!1;hangupShutdownHandlerInstalled=!1;shutdownInProgress=!1;shutdownStarted=Promise.withResolvers();shutdownHandler;shutdownExitCode;shutdownTimeoutHandler;fatalProcessHandler;constructor(o,d=i,c=P0){this.lifecycleProcess=o;this.timer=d;this.shutdownTimeoutMs=c}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",(o)=>{this.handleFatalProcessEvent({type:"uncaughtException",error:o})}),this.lifecycleProcess.on("unhandledRejection",(o,d)=>{this.handleFatalProcessEvent({type:"unhandledRejection",reason:o,promise:d})})}setShutdownHandler(o,d){this.shutdownHandler=o,this.shutdownTimeoutHandler=d}setFatalProcessHandler(o){this.fatalProcessHandler=o}setShutdownExitCode(o){this.shutdownExitCode=o}installHangupShutdownHandler(){if(this.hangupShutdownHandlerInstalled)return;this.hangupShutdownHandlerInstalled=!0,this.lifecycleProcess.on("SIGHUP",()=>{this.shutdown("SIGHUP")})}installStdinShutdownHandlers(o,d,c=P0){if(this.stdinShutdownHandlersInstalled)return;this.stdinShutdownHandlersInstalled=!0;let b=!1,R=()=>{if(b)return;b=!0;let P=void 0;try{P=d?.()}catch(C){eo("Error in stdin client-gone callback",C)}if(P){if(this.shutdownInProgress){P.catch((C)=>eo("Error in stdin answer wait",C));return}this.waitForStdinAnswers(P,c)}else this.shutdown("stdin")};o.on("end",R),o.on("error",R),o.on("close",R)}async waitForStdinAnswers(o,d){try{await l([o,this.shutdownStarted.promise],{timer:this.timer,timeoutMs:d,label:"stdin answer wait"})}catch(c){eo("Error in stdin answer wait",c)}await this.shutdown("stdin")}installStdoutShutdownHandler(o,d){if(this.stdoutShutdownHandlerInstalled)return;this.stdoutShutdownHandlerInstalled=!0;let c=!1,b=()=>{if(c)return;c=!0;try{d?.()}catch(R){eo("Error in stdout client-gone callback",R)}this.shutdown("stdout")};o.on("error",b),o.on("close",b)}installStderrErrorGuard(o){if(this.stderrErrorGuardInstalled)return;this.stderrErrorGuardInstalled=!0,o.on("error",()=>{})}requestShutdown(o){return this.shutdown(o)}async shutdown(o){if(this.shutdownInProgress)return;this.shutdownInProgress=!0,this.shutdownStarted.resolve();try{let d=await this.runShutdownHandler(o),c=this.shutdownExitCode??0;if(!d)eo(`Shutdown timed out after ${this.shutdownTimeoutMs}ms; forcing exit`),c=(await this.runShutdownTimeoutHandler())?.exitCode??1;this.lifecycleProcess.exit(c)}catch(d){eo(`Error during ${o} shutdown`,d),this.lifecycleProcess.exit(1)}}async runShutdownHandler(o){let d=this.shutdownHandler;if(!d)return!0;let c=Symbol("shutdown timeout");try{return await l(()=>Promise.resolve(d(o)),{timer:this.timer,timeoutMs:this.shutdownTimeoutMs,label:"Process shutdown",timeoutError:()=>c}),!0}catch(b){if(b!==c)throw b;return!1}}async runShutdownTimeoutHandler(){let o=this.shutdownTimeoutHandler;if(!o)return;let d=Math.min(this.shutdownTimeoutMs,af),c=Symbol("shutdown finalization timeout");try{return await l(Promise.resolve(o()),{timer:this.timer,timeoutMs:d,label:"Shutdown finalization",timeoutError:()=>c})}catch(b){if(b!==c)throw b;eo(`Shutdown finalization timed out after ${d}ms; forcing exit`);return}}async handleFatalProcessEvent(o){let d=this.fatalProcessHandler;if(!d){if(o.type==="uncaughtException")eo("Uncaught exception",o.error);else eo("Unhandled rejection",o.reason);this.lifecycleProcess.exit(1);return}try{await d(o)}catch(c){eo("Error in fatal process handler",c),this.lifecycleProcess.exit(1)}}}var Ee=new Oa(process);function A0(){df(),Ee.install()}function cQ(){Ee.installHangupShutdownHandler()}function dQ(o=process.stdin,d,c){Ee.installStdinShutdownHandlers(o,d,c)}function lQ(o=process.stdout,d){Ee.installStdoutShutdownHandler(o,d)}function df(o=process.stderr){Ee.installStderrErrorGuard(o)}function uQ(o){return Ee.requestShutdown(o)}function KS(o,d){Ee.setShutdownHandler(o,d)}function pQ(o){Ee.setShutdownExitCode(o)}function T0(o){Ee.setFatalProcessHandler(o)}function L0(o,d){let c=parseInt(o??"",10);if(!isNaN(c)&&c>0&&c<65536)return c;d.warn(`Invalid port: ${o}`);return}function y_(o,d,c,b){if(!o)return;let R=c?Number(o):parseInt(o,10);if(!Number.isFinite(R)||R<=0){b.warn(`Invalid ${d}: ${o}`);return}return c?R:Math.round(R)}function Ma(o,d,c){if(d===void 0)return;let b;try{b=c(o,d)}catch(R){return e.warn(`executionOwnerPid ${o} start identity could not be compared; trusting the PID alone: ${r(R)}`,R),"unknown"}if(b==="unknown")e.warn(`executionOwnerPid ${o} start identity could not be compared; trusting the PID alone`);return b}var F0="--session-config",RQ=h.SESSION_CONFIG.name,cf="session-broker/v1",PQ="automobile/session";class Pm extends t{code="session_config_invalid";constructor(o,d){super(`session_config_invalid: ${o}`,d);this.name="SessionConfigError"}}var mf=g({contractVersion:ne(1),requestId:y().trim().min(1).max(256),device:yr(),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((o)=>o.executionOwnerStartIdentity===void 0||o.executionOwnerPid!==void 0,{message:"executionOwnerStartIdentity requires executionOwnerPid",path:["executionOwnerStartIdentity"]});function J4(o){let d=mf.safeParse(o);if(!d.success)throw new Pm(`Invalid session configuration: ${d.error.message}`);let c=wt(d.data.device);if(!c.ok)throw new Pm(`${c.error.code}: ${c.error.message}`);return{...d.data,device:c.value}}function pf(o,d){let c=o.trim();if(c.length===0)throw new Pm("session config value is empty; pass inline JSON or a file path");let b=c;if(!c.startsWith("{"))try{b=d(c)}catch(P){throw new Pm(`cannot read session config file ${c}: ${r(P)}`,{cause:P})}let R;try{R=JSON.parse(b)}catch{throw new Pm(`session config ${c.startsWith("{")?"inline value":`file ${c}`} is not valid JSON`)}return J4(R)}function AQ(o){let d=o.flagValue??o.envValue;if(d===void 0)return;if(o.hasInitialSessionUuid||o.noProxy)throw new Pm("session config is incompatible with --initial-session-uuid, and --no-proxy");return pf(d,o.readFile)}function ff(o,d){let c=o?.executionOwnerPid;if(c!==void 0&&!d(c))throw new Pm(`executionOwnerPid ${c} is not a running process`)}function gf(o,d){let c=o?.executionOwnerPid;if(c===void 0)return;let b=Ma(c,o?.executionOwnerStartIdentity,d);if(b==="different")throw new Pm(`executionOwnerPid ${c} no longer names the process described by executionOwnerStartIdentity (the PID was reused)`);return b}function TQ(o,d){let c=o?.executionOwnerPid;if(c===void 0)return;return ff(o,d.isProcessRunning),gf(o,(R,P)=>d.probe.compare(R,P))==="same"?o?.executionOwnerStartIdentity:d.probe.current(c)}function kQ(o){return o.includes(cf)}function vr(o,d){let c=KR(o,d);return c&&(c.inline||c.value)?c.value:void 0}var Yc="--event-all-markers",hf=h.EVENT_ALL_MARKERS.name;function B0(o){return KR(o,[Yc])?.value!==void 0}function yf(o){return o.split(",").map((d)=>d.trim()).filter((d)=>d.length>0)}function $0(o,d){let c=vr(o,[Yc])??d[hf];if(!c)return[];return yf(c)}var dp=[{field:"observeResultIncludeElements",cli:"--observe-result-include-elements",env:h.OBSERVE_RESULT_INCLUDE_ELEMENTS.name,featureFlagKey:"observe-result-include-elements",label:"--observe-result-include-elements"},{field:"toolResultsNoStructuredContent",cli:"--tool-results-no-structured-content",env:h.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:h.ACTIONS_DIFF_OBSERVE.name,featureFlagKey:"actions-diff-observe",label:"--actions-diff-observe"},{field:"actionsNoObserve",cli:"--actions-no-observe",env:h.ACTIONS_NO_OBSERVE.name,featureFlagKey:"actions-no-observe",label:"--actions-no-observe"},{field:"actionsCompactMetadata",cli:"--actions-compact-metadata",disableCli:"--no-actions-compact-metadata",env:h.ACTIONS_COMPACT_METADATA.name,featureFlagKey:"actions-compact-metadata",label:"--actions-compact-metadata"}];function U0(o,d){let c={observeResultIncludeElements:!1,toolResultsNoStructuredContent:!1,actionsDiffObserve:!1,actionsNoObserve:!1};for(let b of dp)if(b.field==="actionsCompactMetadata"){let R=b.disableCli?wf(o,[b.disableCli]):void 0,P=wf(o,[b.cli]);if(R===!0)c.actionsCompactMetadata=!1;else if(P!==void 0)c.actionsCompactMetadata=P;else if(d[b.env]==="0"||d[b.env]==="1")c.actionsCompactMetadata=d[b.env]==="1"}else c[b.field]=wf(o,[b.cli])??d[b.env]==="1";return c}function eV(o,d){return o??d??!0}function EQ(o){let d=[];for(let c of dp)if(o[c.field])d.push(c.cli);else if(o[c.field]===!1&&c.disableCli)d.push(c.disableCli);return d}import Na from"path";var f_="--tool-outputs-dir",h_="--tool-output-dir",G4=h.TOOL_OUTPUTS_DIR.name,vf=h.TOOL_OUTPUTS_DIR.legacyName;function Sf(o,d){let c=o?.trim();if(!c)return;return Na.isAbsolute(c)?c:Na.resolve(d,c)}function D0(o,d,c){let b=vr(o,[f_,h_]);return Sf(b??d[G4]??d[vf],c)}function Sh(){return Je(vn.TOOL_OUTPUTS)}var At="setToolEnabled";function vh(o){return o==="setToolEnabled"||o==="getAndroid"||o==="getApple"}var K4="ide/setSessionToolEnabled";function bf(o){if(!o||typeof o!=="object")return[];let d=o.content;if(!Array.isArray(d))return[];return d.flatMap((c)=>{if(!c||typeof c!=="object"||c.type!=="text")return[];let b=c.text;return typeof b==="string"?[b]:[]})}function _f(o){try{let d=JSON.parse(o);if(!d||typeof d!=="object")return;let{sessionUuid:c,scope:b}=d;return typeof c==="string"&&c.trim().length>0&&b==="connection-profile"?c:void 0}catch(d){if(!(d instanceof SyntaxError))throw d;return}}function bh(o){return bf(o).map(_f).find((d)=>d!==void 0)}var fn;function bQ(o){fn=o}function Fa(){if(!fn)throw new t("No configurable tool name source is registered; the MCP tool registry has not been loaded.");return fn.getConfigurableToolNames()}class Ua{repository;startupDefaults;pendingLists=new Map;constructor(o,d=new Map){this.repository=o;this.startupDefaults=d}async isEnabled(o,d,c){let b=this.startupDefaults.get(d)??c;if(!o)return b;return(await this.listOverrides(o)).get(d)??b}async getOverride(o,d){return(await this.listOverrides(o)).get(d)}listOverrides(o){let d=this.pendingLists.get(o);if(d)return d;let c=this.repository.list(o);this.pendingLists.set(o,c);let b=()=>{if(this.pendingLists.get(o)===c)this.pendingLists.delete(o)};return c.then(b,b),c}async setEnabled(o,d,c){this.pendingLists.delete(o),await this.repository.set(o,d,c)}async setEnabledMany(o,d,c){this.pendingLists.delete(o);let b=d.map((R)=>({toolName:R,enabled:c}));if(this.repository.setMany){await this.repository.setMany(o,b);return}for(let R of b)await this.repository.set(o,R.toolName,R.enabled)}async deleteSession(o){this.pendingLists.delete(o),await this.repository.deleteSession(o)}}function La(o){return o?.split(",").map((d)=>d.trim()).filter(Boolean)??[]}function $a(o,d,c){let b=[],R=new Set,P;for(let C of o)if(d.has(C))b.push(C);else if(vh(C))R.add(C);else if(P===void 0)P=C;if(R.size>0)e.info(`Ignoring always-on tool name(s) ${[...R].join(", ")} from ${c}; they have no configurable enable/disable state.`);if(P!==void 0)throw Error(`Tool '${P}' is not a session-configurable tool name; ${c} accept session-configurable tools only (see the automobile:tools resource).`);return b}function Rf(o,d){let c=Object.keys(o).find((F)=>FU(F));if(c)throw Error(`${c} is retired; use AUTOMOBILE_ENABLED_TOOLS or AUTOMOBILE_DISABLED_TOOLS with exact tool names.`);let b=La(I(h.ENABLED_TOOLS,o)),R=La(I(h.DISABLED_TOOLS,o)),P=$a([...b,...R],d,"AUTOMOBILE_ENABLED_TOOLS/AUTOMOBILE_DISABLED_TOOLS"),C=b.filter((F)=>P.includes(F)),D=R.filter((F)=>P.includes(F)),k=new Set(D),O=C.find((F)=>k.has(F));if(O)throw Error(`Tool '${O}' cannot be both enabled and disabled in environment defaults.`);return new Map([...C.map((F)=>[F,!0]),...D.map((F)=>[F,!1])])}function Ef(o,d,c){return $a(o,d,c)}function rV(o,d,c=[],b=[]){let P=Ef([...c,...b],d,"CLI startup defaults (--enable-tool/--disable-tool)"),C=new Set(P),D=c.filter((q)=>C.has(q)),k=b.filter((q)=>C.has(q)),O=new Set(k),F=D.find((q)=>O.has(q));if(F)throw Error(`Tool '${F}' cannot be both enabled and disabled in CLI defaults.`);return new Map([...Rf(o,d),...D.map((q)=>[q,!0]),...k.map((q)=>[q,!1])])}var wr,gn=[],hn=[],wn=!0;function OQ(o,d,c={}){gn=[...o],hn=[...d],wn=c.includeEnvironment??!0,wr=void 0}function MQ(o,d=process.env){rV(wn?d:{},o,gn,hn)}function hc(){if(!wr){let{SqliteSessionToolSelectionRepository:o}=import.meta.require("./chunk-d3jx9bz5.js"),d=new Set(Fa());wr=new Ua(new o,rV(wn?process.env:{},d,gn,hn))}return wr}function H0(o=process.env){return $e(h.HEADLESS,o)}function IQ(o){o[h.HEADLESS.name]="1"}var Sn="automobile-virtual-prototype",_Q=Object.freeze({name:"AutoMobile virtual prototype device",platform:"android",deviceId:Sn});function tV(o){return o.deviceId===Sn}var xQ=["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"],xf=["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"],Cf=new Set(["save","listSaved","deleteSaved","open","clearStorage","simulate"]);function CQ(o){if(Cf.has(o.action))return`${o.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(o.display!==void 0)return"display needs a real Android device: the headless virtual device has one display. Omit display.";return}function DQ(){return{deviceId:Sn,renderer:"web",unsupportedCapabilities:[...xf]}}var Ka=Ft(Fd());import*as se from"fs/promises";import Ct from"path";var Ha="screen-capture-helper",Af=448,Wa=384,ja=448,Tf=30000,Df=RY,Sr="screen-capture-helper",If="screen-capture-helper.json";class Gc{static instance=null;downloader;checksumCalculator;cacheDir;usesDefaultCacheDir;timer;cache;env;expectedChecksumOverride;releaseUrlOverride;downloadTimeoutMs;platform;inFlight=null;constructor(o={}){this.downloader=o.downloader??new Pi,this.checksumCalculator=o.checksumCalculator??new dn,this.cacheDir=o.cacheDir??Je(Ha),this.usesDefaultCacheDir=o.cacheDir===void 0,this.timer=o.timer??i,this.cache=new co({downloader:this.downloader,checksumCalculator:this.checksumCalculator,timer:this.timer}),this.env=o.env??process.env,this.expectedChecksumOverride=o.expectedChecksum,this.releaseUrlOverride=o.releaseUrl,this.downloadTimeoutMs=o.downloadTimeoutMs??Tf,this.platform=o.platform??process.platform}static getInstance(){return Gc.instance??=new Gc,Gc.instance}static resetInstances(){Gc.instance=null}async ensure(){if(this.inFlight)return this.inFlight;return this.inFlight=this.doEnsure().finally(()=>{this.inFlight=null}),this.inFlight}async doEnsure(){let o=this.expectedChecksumOverride??Une(this.env);if(o.length===0)return e.info("[SCREEN_CAPTURE_HELPER] Expected checksum unknown for the pinned version; no release helper can be trusted."),null;let d=await this.tryCache(o);if(d)return e.info("[SCREEN_CAPTURE_HELPER] Reusing verified release helper",{path:d}),d;return this.download(o)}get helperPath(){return Ct.join(this.cacheDir,Sr)}get metadataPath(){return Ct.join(this.cacheDir,If)}async tryCache(o){return await this.cache.isCached({label:"[SCREEN_CAPTURE_HELPER]",subject:"helper",expectedSha256:o,metadataPath:this.metadataPath,parseMetadata:(c)=>kf(c)?c:null,verifyArtifact:(c)=>this.isHelperExecutable(c.size)})?this.helperPath:null}async isHelperExecutable(o){try{let d=await se.stat(this.helperPath);return!(!d.isFile()||d.size!==o||this.platform!=="win32"&&(d.mode&73)===0)}catch(d){return e.debug("[SCREEN_CAPTURE_HELPER] No usable cached helper executable",{error:r(d)}),!1}}async ensureSecureCacheDir(){if(this.usesDefaultCacheDir)return hi(Ha);return await se.mkdir(this.cacheDir,{recursive:!0,mode:Af}),this.cacheDir}async download(o){let d=await this.ensureSecureCacheDir(),c=Ct.join(d,`${Df}.download`),b=Ct.join(d,`${Sr}.download`);return await this.cache.fetch({label:"[SCREEN_CAPTURE_HELPER]",expectedSha256:o,url:this.releaseUrlOverride??$ne(this.env),archivePath:c,metadataPath:this.metadataPath,metadataMode:Wa,downloadTimeoutMs:this.downloadTimeoutMs,afterDownload:(R)=>se.chmod(R,Wa),mismatchError:(R,P)=>new t(`screen-capture-helper checksum verification failed. Expected: ${R}, Got: ${P}. 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(R,P)=>{await se.writeFile(b,Bf(R),{mode:ja}),await se.chmod(b,ja);let{size:C}=await se.stat(b);return await se.rename(b,this.helperPath),e.info("[SCREEN_CAPTURE_HELPER] Downloaded and verified release helper",{path:this.helperPath,sha256:P}),{version:De(this.env),sha256:P??o,size:C,downloadedAt:this.timer.now()}},discard:()=>se.rm(b,{force:!0})}),this.helperPath}}function kf(o){return typeof o==="object"&&o!==null&&"sha256"in o&&typeof o.sha256==="string"&&"size"in o&&typeof o.size==="number"}function Bf(o){let d;try{d=new Ka.default(o)}catch(b){throw new t(`screen-capture-helper release asset is not a valid zip archive: ${r(b)}`)}let c=d.getEntries().filter((b)=>!b.isDirectory&&Ct.posix.basename(b.entryName)===Sr);if(c.length!==1)throw new t(`screen-capture-helper release asset must contain exactly one ${Sr}.`);try{return c[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 Rd}from"fs";import Pg from"path";var Ya=Ft(Fd());import*as ye from"fs/promises";import br from"path";var Ga=384,Of=448,Ja="video-server",za="automobile-video.jar",Xa="video-server-jar.json",Nf="classes.dex";class il{static instance=null;static expectedChecksumOverride=null;downloader;checksumCalculator;cacheDir;usesDefaultCacheDir;timer;cache;env;inFlight=null;constructor(o={}){this.downloader=o.downloader??new Pi,this.checksumCalculator=o.checksumCalculator??new dn,this.timer=o.timer??i,this.cache=new co({downloader:this.downloader,checksumCalculator:this.checksumCalculator,timer:this.timer}),this.env=o.env??process.env,this.usesDefaultCacheDir=o.cacheDir===void 0,this.cacheDir=o.cacheDir??Je(Ja)}static getInstance(){if(il.instance===null)il.instance=new il;return il.instance}static resetInstances(){il.instance=null,il.expectedChecksumOverride=null}static setExpectedChecksumForTesting(o){il.expectedChecksumOverride=o}async computeLocalJarIntegrity(o){let[{checksum:d},c]=await Promise.all([this.checksumCalculator.computeFileSha256(o),ye.stat(o)]);return{sha256:d.toLowerCase(),size:c.size}}get cachedJarPath(){return br.join(this.cacheDir,za)}get metadataPath(){return br.join(this.cacheDir,Xa)}expectedChecksum(){return il.expectedChecksumOverride??Mne(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 o=this.expectedChecksum();if(o.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 d=await this.tryCache(o);if(d)return e.info("[VIDEO_JAR] Reusing verified cached jar",{path:d}),d;return this.download(o)}async tryCache(o){return await this.cache.isCached({label:"[VIDEO_JAR]",subject:"jar",expectedSha256:o,metadataPath:this.metadataPath,parseMetadata:(c)=>Ff(c)?c:null,verifyArtifact:(c)=>this.isCachedJarIntact(c)})?this.cachedJarPath:null}async isCachedJarIntact(o){let d;try{d=await ye.stat(this.cachedJarPath)}catch(c){return e.debug(`[VIDEO_JAR] Cached jar file missing despite metadata: ${c}`),!1}if(d.size!==o.size)return e.warn("[VIDEO_JAR] Cached jar size differs from sidecar; will re-download",{expected:o.size,actual:d.size}),!1;return!0}async ensureSecureCacheDir(){if(this.usesDefaultCacheDir)return hi(Ja);return await ye.mkdir(this.cacheDir,{recursive:!0,mode:Of}),this.cacheDir}async download(o){let d=One(this.env),c=await this.ensureSecureCacheDir(),b=br.join(c,za),R=`${b}.download`;return e.info("[VIDEO_JAR] Downloading persistent-encoder jar",{url:d,destination:R}),await this.cache.fetch({label:"[VIDEO_JAR]",expectedSha256:o,url:d,archivePath:R,metadataPath:br.join(c,Xa),metadataMode:Ga,afterDownload:(P)=>ye.chmod(P,Ga),mismatchError:(P,C)=>new t(`video-server jar checksum verification failed. Expected: ${P}, Got: ${C}. 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(P,C)=>{if(!this.hasClassesDex(P))throw new t("video-server jar is not a valid zip containing classes.dex (truncated or error-page download).");let{size:D}=await ye.stat(P);return await ye.rename(P,b),e.info("[VIDEO_JAR] Downloaded, verified, and cached jar",{path:b,sha256:C}),{version:De(this.env),sha256:C??o,size:D,downloadedAt:this.timer.now()}}}),b}hasClassesDex(o){try{return new Ya.default(o).getEntries().some((c)=>c.entryName===Nf)}catch(d){return e.warn("[VIDEO_JAR] Structural check failed (not a valid zip)",{path:o,error:r(d)}),!1}}}function Ff(o){return typeof o==="object"&&o!==null&&"sha256"in o&&typeof o.sha256==="string"&&"size"in o&&typeof o.size==="number"}var NQ="constrained-baseline";var X4=42,q0=8192;function FQ(o){return o==="main"?"4d002a":"42e02a"}function nV(o,d){return Math.ceil(o/16)*Math.ceil(d/16)}function ed(o){return o.length>=4&&(o[0]&31)===7?o.subarray(1,4).toString("hex"):void 0}function Lf(o){let d=ed(o);return d?Number.parseInt(d.slice(4,6),16):void 0}function LQ(o,d="constrained-baseline"){let c=ed(o);if(c&&!Z4(c,d))return{compatible:!1,reason:`H.264 SPS profile ${c.slice(0,4)} is incompatible with negotiated ${d}.`};let b=Lf(o);if(b!==void 0&&b>42)return{compatible:!1,reason:`H.264 SPS level ${b} exceeds negotiated level 42.`};return{compatible:!0}}function Z4(o,d){return d==="main"?Uf(o):qf(o)}function qf(o){return Number.parseInt(o.slice(0,2),16)===66}function Uf(o){return Number.parseInt(o.slice(0,2),16)===77}import{EventEmitter as Qf}from"events";class O0{chunks=[];headChunk=0;headOffset=0;length=0;compactionWork=0;get retainedChunkCount(){return this.chunks.length}get compactionWorkUnits(){return this.compactionWork}append(o){if(o.length===0)return;this.chunks.push(o),this.length+=o.length}peek(o){if(o>this.length)throw RangeError(`cannot peek ${o} bytes from ${this.length}-byte queue`);if(o===0)return Buffer.alloc(0);let d=this.chunks[this.headChunk];if(d.length-this.headOffset>=o)return d.subarray(this.headOffset,this.headOffset+o);let b=Buffer.allocUnsafe(o);return this.copyTo(b,o),b}takeDetached(o){if(o>this.length)throw RangeError(`cannot take ${o} bytes from ${this.length}-byte queue`);if(o===0)return Buffer.alloc(0);let d=Buffer.allocUnsafe(o);return this.copyTo(d,o),this.discard(o),d}discard(o){if(o>this.length)throw RangeError(`cannot discard ${o} bytes from ${this.length}-byte queue`);let d=o;while(d>0){let b=this.chunks[this.headChunk].length-this.headOffset;if(d<b){this.headOffset+=d,this.length-=d,d=0;break}this.headChunk++,this.headOffset=0,this.length-=b,d-=b}this.compact()}toBuffer(){if(this.length===0)return Buffer.alloc(0);let o=this.chunks[this.headChunk];if(this.headChunk===this.chunks.length-1)return o.subarray(this.headOffset);let d=Buffer.allocUnsafe(this.length);return this.copyTo(d,this.length),d}replace(o){this.chunks=o.length===0?[]:[o],this.headChunk=0,this.headOffset=0,this.length=o.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(o,d){let c=0;for(let b=this.headChunk;c<d;b++){let R=this.chunks[b],P=b===this.headChunk?this.headOffset:0,C=R.length-P,D=Math.min(C,d-c);R.copy(o,c,P,P+D),c+=D}}}var $f=826690881,bn=Buffer.from([65,77,70,49]),je=24,Hf=8,id=16777216,nd=16777216,td=Math.max(id,nd),Wf=3798204416,Vf=4294967294,jf=1;class Rn{buffer=new O0;pendingHeader=null;highWaterMarkBytes=0;resynchronizing=!1;push(o,{onMalformed:d,onAudio:c,onEncodedVideo:b}={}){let R=0;while(R<o.length){let P=je+td-this.buffer.length;if(P===0){if(!this.decodeAvailable({onMalformed:d,onAudio:c,onEncodedVideo:b}))throw Error("FrameDecoder reached its buffer limit without a complete record");continue}let C=Math.min(o.length,R+P);this.buffer.append(o.subarray(R,C)),this.highWaterMarkBytes=Math.max(this.highWaterMarkBytes,this.buffer.length),R=C,this.decodeAvailable({onMalformed:d,onAudio:c,onEncodedVideo:b})}}getMetrics(){return{bufferedBytes:this.buffer.length,highWaterMarkBytes:this.highWaterMarkBytes,maxBufferedBytes:je+td}}decodeAvailable({onMalformed:o,onAudio:d,onEncodedVideo:c}={}){let b=!1;while(!0){if(this.resynchronizing&&!this.resynchronize())return b;if(this.pendingHeader===null){let D=this.takeHeader(o);if(D==="starved")return b;if(D==="malformed"){b=!0;continue}this.pendingHeader=D,b=!0}let R=this.pendingHeader,P=Gf(R);if(this.buffer.length<P)return b;let C=this.buffer.takeDetached(P);this.emitRecord(R,C,{onAudio:d,onEncodedVideo:c}),this.pendingHeader=null,b=!0}}emitRecord(o,d,{onAudio:c,onEncodedVideo:b}){if(Pn(o)){c?.({pcm16le:d});return}b?.({keyframe:(o.height&jf)!==0,presentationTimestampMs:o.timestampMs,payload:d})}takeHeader(o){if(this.buffer.length<je)return"starved";let d=this.buffer.peek(je),c=rd(d,0);if(c)return this.resynchronizing=!0,o?.({reason:c,header:_n(d,0)}),"malformed";let b=_n(d,0);return this.buffer.discard(je),b}resynchronize(){let o=this.buffer.toBuffer(),d=0;while(d<=o.length-bn.length){let c=o.indexOf(bn,d);if(c<0)break;if(c+je>o.length)return this.replaceBuffer(o.subarray(c)),!1;if(rd(o,c)===null)return this.replaceBuffer(o.subarray(c)),this.resynchronizing=!1,!0;d=c+1}return this.replaceBuffer(o.subarray(Math.max(0,o.length-(bn.length-1)))),!1}replaceBuffer(o){this.buffer.replace(o.length===0?Buffer.alloc(0):Buffer.from(o))}}function Pn(o){return o.width===0&&o.height===8000&&o.bytesPerRow===1}function Kf(o){return o.width===0&&(o.height&Vf)>>>0===Wf}function Gf(o){if(Pn(o))return o.timestampMs;return o.bytesPerRow}function _n(o,d){return{width:o.readUInt32LE(d+8),height:o.readUInt32LE(d+12),bytesPerRow:o.readUInt32LE(d+16),timestampMs:o.readUInt32LE(d+20)}}function rd(o,d){if(o.readUInt32LE(d)!==$f)return"header_magic_mismatch";if(o.readUInt32LE(d+4)!==Yf(o.subarray(d+Hf,d+je)))return"header_checksum_mismatch";return Jf(_n(o,d))}function Jf(o){if(Pn(o))return o.timestampMs>id?"audio_payload_too_large":null;if(Kf(o))return o.bytesPerRow>nd?"encoded_video_payload_too_large":null;return"header_unsupported_record"}var zf=Xf();function Xf(){let o=new Uint32Array(256);for(let d=0;d<256;d++){let c=d;for(let b=0;b<8;b++)c=(c&1)!==0?3988292384^c>>>1:c>>>1;o[d]=c>>>0}return o}function Yf(o){let d=4294967295;for(let c=0;c<o.length;c++)d=d>>>8^zf[(d^o[c])&255];return(d^4294967295)>>>0}var M0="automobile-frame-metrics:",od="capture-capability:",g_="encoded-video-h264",SQ="simulator-idle-evidence",Qq="capture-permission:",N0="capture-permission-target:",_r=5,Rr=60,wQ=5;class uv extends Qf{binaryPath;target;spawner;timer;stopGraceMs;processGroupKiller;decoder=new Rn;process=null;controlChannelErrored=!1;helperCapabilities=new Set;stderrBuffer="";exitPromise=null;nativeHelperRegistry;constructor(o){super();this.nativeHelperRegistry=o.nativeHelperRegistry,this.binaryPath=o.binaryPath,this.target=o.target,this.spawner=o.spawner??ag,this.timer=o.timer??i,this.stopGraceMs=o.stopGraceMs??og,this.processGroupKiller=o.processGroupKiller??dg}on(o,d){return super.on(o,d)}emit(o,...d){return super.emit(o,...d)}get isRunning(){return this.process!==null&&this.process.exitCode===null&&!this.process.killed}start(){if(this.process!==null)throw Error("IOSScreenCaptureHelper already started");let o=lg(this.target);this.emitReadiness("helper-executable-found",this.binaryPath);let d=this.spawner(this.binaryPath,o,{detached:process.platform==="darwin",stdio:["pipe","pipe","pipe"]});(this.nativeHelperRegistry??uk()).track(d,{kind:"ios-capture-helper",processGroup:process.platform==="darwin"}),this.process=d,this.controlChannelErrored=!1,this.emitReadiness("helper-process-spawned",`pid=${d.pid??"?"}`),d.stdout.on("data",(c)=>{let b=Buffer.isBuffer(c)?c:Buffer.from(c);this.decoder.push(b,{onMalformed:(R)=>this.emit("malformed",R),onAudio:(R)=>this.emit("audio",R),onEncodedVideo:(R)=>this.emit("encodedVideo",R)})}),d.stderr.on("data",(c)=>{let b=Buffer.isBuffer(c)?c.toString("utf8"):String(c);this.appendStderr(b)}),d.stdin.on("error",(c)=>{this.controlChannelErrored=!0,e.warn("[IOSScreenCaptureHelper] stdin control channel failed",c)}),this.exitPromise=new Promise((c)=>{d.once("error",(b)=>{c({code:d.exitCode,signal:d.signalCode}),this.emit("error",b instanceof Error?b:Error(String(b)))}),d.once("exit",(b,R)=>{if(this.stderrBuffer.length>0)this.handleStderrLine(this.stderrBuffer),this.stderrBuffer="";let P={code:b,signal:R};this.emit("exit",P),c(P)})}),e.debug(`[IOSScreenCaptureHelper] spawned ${this.binaryPath} pid=${d.pid??"?"}`)}async stop(){let o=this.process;if(o===null)return null;if(o.exitCode!==null||o.killed){let c=await this.waitForExitWithinGrace();return this.cleanupProcess(o),c??{code:o.exitCode,signal:o.signalCode}}o.kill("SIGTERM");let d=await this.waitForExitWithinGrace();if(d!==null)return this.cleanupProcess(o),d;if(e.warn(`[IOSScreenCaptureHelper] helper pid=${o.pid??"?"} did not exit after SIGTERM; escalating to SIGKILL`),o.kill("SIGKILL"),process.platform==="darwin")if(o.pid!==void 0)try{this.processGroupKiller(o.pid,"SIGKILL")}catch(c){e.warn(`[IOSScreenCaptureHelper] process-group cleanup failed for pid=${o.pid}; detached children may leak: ${c}`)}else e.warn("[IOSScreenCaptureHelper] helper pid unknown after SIGKILL; cannot group-kill, detached children may leak");return this.cleanupProcess(o),{code:o.exitCode,signal:o.signalCode??"SIGKILL"}}appendStderr(o){if(this.stderrBuffer+=o,this.stderrBuffer.length>uv.STDERR_BUFFER_MAX){this.emit("stderr",this.stderrBuffer),this.stderrBuffer="";return}let d=this.stderrBuffer.split(`
|
|
162
|
+
`);this.stderrBuffer=d.pop()??"";for(let c of d)this.handleStderrLine(c)}handleStderrLine(o){let d=Zf(o);if(d!==null){if(this.target.kind==="simulator"&&d===this.target.windowID)this.emit("idle",{windowID:d});return}let c=rg(o);if(c!==null){this.emit("captureMetrics",c);return}let b=Y4(o);if(b!==null){this.helperCapabilities.add(b),this.emit("capability",b);return}let R=eg(o);if(R!==null){this.emit("permission",R);return}let P=tg(o);if(P!==null){this.emit("permissionTarget",P);return}this.emit("stderr",o),this.emitReadinessFromMarker(o)}get capabilities(){return this.helperCapabilities}supportsEncodedVideo(){return this.helperCapabilities.has(g_)}requestKeyFrame(){let o=this.process;if(o===null||!this.isRunning||this.controlChannelErrored||o.stdin.destroyed||o.stdin.writableEnded||o.stdin.errored)return!1;try{return o.stdin.write(`${JSON.stringify({cmd:"forceKeyFrame"})}
|
|
163
|
+
`),!0}catch(d){return e.debug(`[IOSScreenCaptureHelper] forceKeyFrame control write failed: ${d}`),!1}}assertSupportsEncodedVideo(){if(this.supportsEncodedVideo())return;throw new t("The screen-capture-helper did not advertise the '"+g_+"' 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 '"+g_+"'.")}async waitForExitWithinGrace(){let o=this.exitPromise??Promise.resolve(null),d=Error("Screen capture helper stop grace expired");try{return await l(o,{timer:this.timer,timeoutMs:this.stopGraceMs,label:"Screen capture helper stop",timeoutError:()=>d})}catch(c){if(c===d)return null;throw c}}cleanupProcess(o){if(o.stdout.removeAllListeners(),o.stderr.removeAllListeners(),o.removeAllListeners(),this.process===o)this.process=null}emitReadinessFromMarker(o){let d=o.trim();if(d.startsWith("capture-phase: permission-ready"))this.emitReadiness("permission-ready");else if(d.startsWith("capture-phase: resolved-window"))this.emitReadiness("target-resolved",d);else if(d.startsWith("capture-phase: capture-started"))this.emitReadiness("capture-started",d);else if(d.startsWith("capture-phase: first-frame"))this.emitReadiness("first-frame",d)}emitReadiness(o,d){this.emit("readiness",{phase:o,atMs:this.timer.now(),detail:d})}static STDERR_BUFFER_MAX=65536}function Zf(o){let d=/^capture-idle: windowID=(\d+)$/.exec(o.trim());if(!d)return null;let c=Number(d[1]);return Number.isSafeInteger(c)&&c>0?c:null}function Y4(o){let d=o.trim();if(!d.startsWith(od))return null;let c=d.slice(od.length).trim();return c.length>0?c:null}function eg(o){let d=o.trim();if(!d.startsWith(Qq))return null;let c=d.slice(Qq.length).trim();return c==="screen-recording"?c:null}function tg(o){let d=o.trim();if(!d.startsWith(N0))return null;let c=d.slice(N0.length).trim();return c.length>0?c:null}function rg(o){if(!o.startsWith(M0))return null;try{let d=JSON.parse(o.slice(M0.length));if(!ig(d))return null;return{...d,captureTimestampMs:d.captureTimestampMs??null,frameQueueAgeMs:d.frameQueueAgeMs??null,lastOutputWriteDurationMs:d.lastOutputWriteDurationMs??null}}catch(d){return e.debug(`[IOSScreenCaptureHelper] ignored malformed native frame metrics: ${r(d)}`),null}}function ig(o){if(o===null||typeof o!=="object")return!1;let d=o;return xn(d.captureTimestampMs)&&xn(d.frameQueueAgeMs)&&(d.frameQueueDepth===0||d.frameQueueDepth===1)&&An(d.droppedFrames)&&An(d.bytesQueued)&&An(d.highWaterMarkBytes)&&xn(d.lastOutputWriteDurationMs)}function xn(o){return o===void 0||ng(o)}function ng(o){return o===null||typeof o==="number"&&Number.isFinite(o)}function An(o){return typeof o==="number"&&Number.isFinite(o)&&o>=0}var og=2000,sg=new ee,ag=(o,d,c)=>sg.spawn(o,d,c),dg=(o,d)=>{process.kill(-o,d)};function lg(o){switch(o.kind){case"device":{let d=o.deviceId!==void 0?["--device-id",o.deviceId]:[];return sd(d,o.encode),d}case"simulator":{let d=["--simulator-window",String(o.windowID)];if(o.fps!==void 0){if(!Number.isInteger(o.fps)||o.fps<_r||o.fps>Rr)throw RangeError(`simulator fps must be an integer in [${_r}, ${Rr}]; got ${o.fps}`);d.push("--simulator-fps",String(o.fps))}if(o.audio===!0)d.push("--audio");return sd(d,o.encode),d}}}function sd(o,d){if(d===void 0)return;if(o.push("--encode",d.codec),d.maxLongSide!==void 0)o.push("--max-long-side",String(d.maxLongSide));switch(d.bitrate.kind){case"explicitBps":o.push("--bitrate-bps",String(Math.round(d.bitrate.bps)));break;case"bitsPerPixel":o.push("--bits-per-pixel",String(d.bitrate.bpp));break;case"videoToolboxDefault":break}}var ad=_r,dd=Rr,Q4=15,ld=1,md=60,e5=30,pe={WHIP_ENDPOINT:h.WEBRTC_WHIP_ENDPOINT.name,WHIP_TOKEN:h.WEBRTC_WHIP_TOKEN.name,ICE_SERVERS:h.WEBRTC_ICE_SERVERS.name,BITRATE_KBPS:h.WEBRTC_BITRATE_KBPS.name,MAX_SIZE:h.WEBRTC_MAX_SIZE.name,IOS_SIMULATOR_FPS:h.WEBRTC_IOS_SIMULATOR_FPS.name,ANDROID_FPS:h.WEBRTC_ANDROID_FPS.name,TRICKLE_ICE:h.WEBRTC_TRICKLE_ICE.name,AUDIO:h.WEBRTC_AUDIO.name,ALLOW_INSECURE_WHIP:h.WEBRTC_ALLOW_INSECURE_WHIP.name,WHIP_ALLOWED_ORIGINS:h.WEBRTC_WHIP_ALLOWED_ORIGINS.name},cg=[{urls:"stun:stun.l.google.com:19302"}];function ug(o){if(!o||!o.trim())return;let d=o.trim();if(d.startsWith("[")){let c;try{c=JSON.parse(d)}catch{throw new t(`Invalid JSON in ${pe.ICE_SERVERS}.`)}if(!Array.isArray(c))throw new t(`${pe.ICE_SERVERS} JSON must be an array of { urls } objects.`);let b=[];for(let R of c)mg(b,R);return b}return d.split(",").map((c)=>c.trim()).filter((c)=>c.length>0).map((c)=>({urls:c}))}function mg(o,d){let{username:c,credential:b}=d??{};if(typeof d?.urls==="string")o.push({urls:d.urls,username:c,credential:b});else if(Array.isArray(d?.urls)&&d.urls.every((R)=>typeof R==="string"))for(let R of d.urls)o.push({urls:R,username:c,credential:b});else throw new t(`${pe.ICE_SERVERS} JSON entries must have a string or string[] "urls".`)}function pg(o){if(!o||!o.trim())return;let d=/^(\d+)\s*x\s*(\d+)$/i.exec(o.trim());if(!d)throw new t(`Invalid size "${o}"; expected WIDTHxHEIGHT (e.g. 1280x720).`);return yd({width:Number(d[1]),height:Number(d[2])})}function fg(o){if(!o||!o.trim())return;let d=Number(o.trim());if(!Number.isFinite(d)||d<=0)throw new t(`Invalid bitrate "${o}"; expected a positive number of kbps.`);return Math.round(d)}function iV(o={},d=process.env){let c=o.whipEndpoint??I(h.WEBRTC_WHIP_ENDPOINT,d);if(!c||!c.trim())throw new t(`No WHIP endpoint configured. Set ${pe.WHIP_ENDPOINT} or pass whipEndpoint.`);let b=o.iceServers??ug(I(h.WEBRTC_ICE_SERVERS,d))??cg,{bitrateKbps:R,size:P,iosSimulatorFps:C,androidFps:D}=gg(o,d),k=o.trickleIce??$e(h.WEBRTC_TRICKLE_ICE,d),O=o.audioEnabled??$e(h.WEBRTC_AUDIO,d);return{whipEndpoint:Sg(c,d),bearerToken:o.bearerToken??I(h.WEBRTC_WHIP_TOKEN,d)??void 0,iceServers:b,bitrateKbps:R,size:P,iosSimulatorFps:C,androidFps:D,trickleIce:k,audioEnabled:O}}function gg(o,d){let c=o.bitrateKbps===void 0?fg(I(h.WEBRTC_BITRATE_KBPS,d)):vg(o.bitrateKbps),b=o.size===void 0?pg(I(h.WEBRTC_MAX_SIZE,d)):yd(o.size),R=o.iosSimulatorFps===void 0?hg(I(h.WEBRTC_IOS_SIMULATOR_FPS,d))??Q4:gd(o.iosSimulatorFps),P=o.androidFps===void 0?yg(I(h.WEBRTC_ANDROID_FPS,d))??e5:hd(o.androidFps);return{bitrateKbps:c,size:b,iosSimulatorFps:R,androidFps:P}}function hg(o){if(!o||!o.trim())return;return gd(Number(o.trim()),o.trim())}function gd(o,d=String(o)){if(!Number.isInteger(o)||o<ad||o>dd)throw new t(`Invalid iOS Simulator capture fps "${d}"; expected an integer in [${ad}, ${dd}]. Set ${pe.IOS_SIMULATOR_FPS} or pass iosSimulatorFps.`);return o}function yg(o){if(!o||!o.trim())return;return hd(Number(o.trim()),o.trim())}function hd(o,d=String(o)){if(!Number.isInteger(o)||o<ld||o>md)throw new t(`Invalid Android capture fps "${d}"; expected an integer in [${ld}, ${md}]. Set ${pe.ANDROID_FPS} or pass androidFps.`);return o}function vg(o){if(!Number.isFinite(o)||o<=0)throw new t(`Invalid bitrate "${o}"; expected a positive number of kbps.`);return Math.round(o)}function yd(o){let{width:d,height:c}=o;if(!Number.isSafeInteger(d)||!Number.isSafeInteger(c)||d<=0||c<=0||d%2!==0||c%2!==0||nV(d,c)>q0)throw new t(`Invalid size "${d}x${c}"; width and height must be positive even integers within the H.264 Level 4.2 frame limit.`);return{width:d,height:c}}var wg=new Set(["localhost","127.0.0.1","::1"]);function wd(o){let d=o.toLowerCase().replace(/^\[/,"").replace(/\]$/,"");if(wg.has(d))return!0;return/^127(?:\.\d{1,3}){3}$/.test(d)}function Sd(o=process.env){return $e(h.WEBRTC_ALLOW_INSECURE_WHIP,o)}function bd(o){let d=o.trim(),c;try{c=new URL(d)}catch{throw new t(`Invalid WHIP endpoint "${d}"; expected an absolute http(s) URL.`)}if(c.protocol!=="http:"&&c.protocol!=="https:")throw new t(`Invalid WHIP endpoint "${d}"; expected an absolute http(s) URL.`);return c}function Sg(o,d=process.env){let c=bd(o);if(c.protocol==="http:"&&!wd(c.hostname)&&!Sd(d))throw new t(`Refusing plaintext WHIP endpoint "${o.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 ${pe.ALLOW_INSECURE_WHIP}=1 to allow insecure endpoints (not recommended).`);return o.trim()}function bg(o){if(!o||!o.trim())return[];return o.split(",").map((d)=>d.trim()).filter((d)=>d.length>0)}function fd(o){let d=o.includes("://")?o:`https://${o}`;if(!URL.canParse(d))return;let c=new URL(d).origin;return c==="null"?void 0:c}function BQ(o,d=process.env){if(Sd(d))return;let c=bd(o);if(wd(c.hostname))return;let b=new Set,R=I(h.WEBRTC_WHIP_ENDPOINT,d);if(R&&R.trim()){let P=fd(R.trim());if(P)b.add(P)}for(let P of bg(I(h.WEBRTC_WHIP_ALLOWED_ORIGINS,d))){let C=fd(P);if(C)b.add(C)}if(!b.has(c.origin))throw new t(`Refusing WHIP endpoint override "${o.trim()}": its origin ${c.origin} is not allow-listed. Add it to ${pe.WHIP_ALLOWED_ORIGINS} (comma-separated origins), align it with the daemon's ${pe.WHIP_ENDPOINT}, or set ${pe.ALLOW_INSECURE_WHIP}=1 to accept arbitrary destinations (not recommended).`)}var Pd=h.VIDEO_SERVER_JAR.name,_d=h.REQUIRE_VIDEO_SERVER.name,Eg=h.SKIP_VIDEO_SERVER_DOWNLOAD.name;function Ed(o){let d=o[Pd];return d&&Rd(d)?d:null}function xg(o){let d=Pg.resolve(o,"android","video-server","build","libs","automobile-video.jar");return Rd(d)?d:null}async function V0(o={}){let d=o.env??process.env,c=o.cwd??process.cwd(),b=Ed(d);if(b)return e.info("[VIDEO_JAR] Using AUTOMOBILE_VIDEO_SERVER_JAR override",{path:b}),b;let R=$e(h.SKIP_VIDEO_SERVER_DOWNLOAD,d),P=$e(h.REQUIRE_VIDEO_SERVER,d);if(!R){let k=await(o.provider??il.getInstance()).ensure();if(k)return k}else e.info("[VIDEO_JAR] AUTOMOBILE_SKIP_VIDEO_SERVER_DOWNLOAD set; resolving local sources only");let C=xg(c);if(C)return e.info("[VIDEO_JAR] Using local Gradle build output",{path:C}),C;if(P)throw new t(`${_d} is set but no verifiable automobile-video.jar is available (no override, no ${R?"":"downloadable or "}locally-built jar). Provide ${Pd}, build \`:video-server:d8Dex\`, pin a release whose checksum registry includes videoJarSha256, or unset ${_d} to allow the screenrecord fallback.`);return e.info("[VIDEO_JAR] No verifiable jar available; degrading to screenrecord"),null}async function $Q(o={}){let d=o.env??process.env;if(!d[pe.WHIP_ENDPOINT]?.trim()){e.debug("[VIDEO_JAR] No WHIP endpoint configured; skipping background jar prefetch");return}if($e(h.SKIP_VIDEO_SERVER_DOWNLOAD,d)){e.debug(`[VIDEO_JAR] ${Eg} set; skipping background jar prefetch`);return}if(Ed(d)){e.debug("[VIDEO_JAR] Local override present; skipping background jar prefetch (download unused)");return}let b=o.provider??il.getInstance();e.info("[VIDEO_JAR] Prefetching video-server jar in the background (WebRTC streaming configured)");try{let R=await b.ensure();if(R)e.info("[VIDEO_JAR] Background prefetch warmed the jar cache",{path:R})}catch(R){e.warn(`[VIDEO_JAR] Background jar prefetch failed: ${r(R)}`,R)}}import{homedir as Vg}from"os";class Tn{client;constructor(o){this.client=o}createSimulator(...o){return this.client.createSimulator(...o)}cloneSimulator(...o){return this.client.cloneSimulator(...o)}getCatalogChecked(...o){return this.client.getCatalogChecked(...o)}listSimulators(...o){return this.client.listSimulators(...o)}async deleteSimulator(o,d={}){let c=await this.client.listSimulators(void 0,d.signal);if(!Object.values(c.devices).flat().some((R)=>R.udid===o))return;await this.client.deleteSimulator(o,d);let b=await this.client.listSimulators(void 0,d.signal);if(Object.values(b.devices).flat().some((R)=>R.udid===o))throw new t(`Template simulator ${o} still exists after deletion. Retry template cleanup.`)}async boot(o,d){await H(d,()=>this.client.bootSimulator(o))}shutdownSimulator(o,d){return this.client.shutdownSimulator(o,d)}}class Pr extends t{constructor(o){super("Could not remove a partial simulator clone. Retry simulator cleanup before creating again.",{cause:o})}}class Dn{creator;enabled;dependencies;cloneFailures=new Map;lifetime=new AbortController;async stop(){this.lifetime.abort(),await Promise.allSettled(this.flights.values())}flights=new Map;constructor(o,d,c){this.creator=o;this.enabled=d;this.dependencies=c}async create(o,d){if(o.signal?.throwIfAborted(),this.enabled())try{let c=await this.tryClone(o,d?.dependencies());if(c)return{udid:c,source:"clone"}}catch(c){if(c instanceof Pr)throw c;e.warn(`Template lookup failed; creating simulator: ${r(c)}`,c),o.signal?.throwIfAborted()}return{udid:await(d?.creator??this.creator).createSimulator(o.name,o.deviceType,o.runtime,o.signal),source:"create"}}async tryClone(o,d=this.dependencies()){let c=await this.resolveKey(d,o);if(!c)return;let b=await d.store.read(c);if(b&&!this.buildsMatch(b,c))await this.markStale(d,b,o.signal);if(b?.state==="ready"&&this.buildsMatch(b,c)){let R=await this.cloneReady(d,b,o);if(R.preserveTemplate)return R.udid;await this.markStale(d,b,o.signal)}if((b?.nextAttemptAtMs??0)<=d.timer.now())this.requestBuild(d,c);return}buildsMatch(o,d){return o.xcodeBuild===d.xcodeBuild&&o.runtimeBuild===d.runtimeBuild}async resolveKey(o,d){let c=(await o.client.getCatalogChecked(d.signal)).runtimes.find((R)=>R.identifier===d.runtime);if(!c?.buildversion)return;let b=await o.xcode.readBuild(d.signal);if(b==="unknown")return;return{xcodeBuild:b,runtime:d.runtime,runtimeBuild:c.buildversion,deviceType:d.deviceType,profile:o.profile(),...o.apsdLogSuppressed?.()?{apsdLogSuppressed:!0}:{}}}async cloneReady(o,d,c){let b=await o.client.listSimulators(void 0,c.signal),R=Object.values(b.devices).flat().find((C)=>C.udid===d.udid);if(R?.state!=="Shutdown"||R.name!==ud(d.key))return{preserveTemplate:R?.name===ud(d.key)};let P=new Set(Object.values(b.devices).flat().map((C)=>C.udid));try{let C=await o.client.cloneSimulator(d.udid,c.name,c.signal);return await o.relocator.relocate({templateUdid:d.udid,cloneUdid:C,signal:c.signal}),this.cloneFailures.delete(d.udid),{udid:C,preserveTemplate:!0}}catch(C){e.warn(`Template clone failed: ${r(C)}`,C);let D=this.cloneFailures.get(d.udid)??0;if(!c.signal?.aborted)D++,this.cloneFailures.set(d.udid,D);let k=await H(void 0,async()=>{await this.removeFailedClone(o,{...c,signal:void 0},P);let O=await o.client.listSimulators(),F=Object.values(O.devices).flat().find((q)=>q.udid===d.udid);return F?.name===ud(d.key)&&(F.state!=="Shutdown"||c.signal?.aborted===!0||D<2)});if(c.signal?.aborted){if(!k)await H(void 0,()=>this.markStale(o,d));c.signal.throwIfAborted()}return{preserveTemplate:k}}}async removeFailedClone(o,d,c){try{let b=await o.client.listSimulators(void 0,d.signal);for(let R of Object.values(b.devices).flat())if(R.name===d.name&&!c.has(R.udid))await o.client.deleteSimulator(R.udid,{signal:d.signal})}catch(b){throw new Pr(b)}}async markStale(o,d,c){let b=await o.lock.acquire(d.key,c);if(!b)return;try{let R=await o.store.read(d.key);if(R?.udid===d.udid&&R.state==="ready")await o.store.write({...R,state:"stale"}),this.cloneFailures.delete(d.udid)}finally{b()}}requestBuild(o,d){let c=lf(d);if(this.flights.has(c))return;let b=_g(()=>H(this.lifetime.signal,()=>Promise.resolve().then(()=>o.builder.build(d,this.lifetime.signal)).catch((R)=>{e.warn(`Background template build failed: ${r(R)}`,R)}).finally(()=>{this.flights.delete(c)})));this.flights.set(c,b)}}import{readFileSync as Cg,rmSync as Ag}from"fs";import{join as In}from"path";var Cd=g({key:g({runtime:y(),runtimeBuild:y(),xcodeBuild:y(),deviceType:y(),profile:A(Object.keys(fY)),apsdLogSuppressed:ne(!0).optional()}),udid:Le([ne(""),y().regex(Dg)]),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((o)=>o.state!=="ready"||o.udid!=="",{message:"Ready templates require a simulator UDID"});var Tg={read:(o)=>{try{return Cg(o,"utf8")}catch(d){if(d instanceof Error&&"code"in d&&d.code==="ENOENT"){e.debug(`Template manifest is absent: ${o}`,d);return}throw u(d,`Could not read template manifest ${o}`)}},write:(o,d)=>xB(o,d),remove:(o)=>Ag(o,{force:!0}),list:(o)=>$i(o).filter((d)=>/^[a-f0-9]{8}\.json$/.test(d))};class kn{files;directory;constructor(o=Tg,d=()=>nc(BK("ios-sim-templates"))){this.files=o;this.directory=d}path(o){return In(this.directory(),`${lf(o)}.json`)}async read(o){let d=this.files.read(this.path(o));if(d===void 0)return;let c=this.parse(d,`${lf(o)}.json`);if(c&&Object.entries(o).some(([b,R])=>Reflect.get(c.key,b)!==R)){e.warn("Ignoring template manifest with mismatched key inputs");return}return c}parse(o,d){try{let c=Cd.safeParse(JSON.parse(o));if(!c.success||`${lf(c.data.key)}.json`!==d){e.warn(`Ignoring invalid template manifest ${d}`);return}return c.data}catch(c){e.warn(`Ignoring unreadable template manifest ${d}`,c);return}}async write(o){this.files.write(this.path(o.key),o)}async remove(o){this.files.remove(this.path(o))}async removeInvalid(o){let d=this.directory();for(let c of this.files.list(d)){let b=In(d,c),R=this.files.read(b);if(R===void 0||this.parse(R,c))continue;if(o&&!this.matchesRuntime(R,o))continue;this.files.remove(b)}}matchesRuntime(o,d){try{let c=g({key:g({runtime:y()})}).safeParse(JSON.parse(o)).data?.key.runtime;return c===void 0||c===d}catch(c){return e.warn("Removing corrupt template manifest with unreadable runtime metadata",c),!0}}async list(){let o=this.directory();return this.files.list(o).flatMap((d)=>{let c=this.files.read(In(o,d)),b=c===void 0?void 0:this.parse(c,d);return b?[b]:[]})}}import{join as Ad}from"path";class On{timer;directory;options;constructor(o,d=()=>nc(BK("ios-sim-templates")),c={}){this.timer=o;this.directory=d;this.options=c}path(o){return Ad(this.directory(),`${lf(o)}.lock`)}async acquire(o,d){return this.acquirePath(this.path(o),d)}acquireName(o,d){let c=/^automobile-template-([a-f0-9]{8})$/.exec(o)?.[1];if(!c)throw Error("Invalid template name");return this.acquirePath(Ad(this.directory(),`${c}.lock`),d)}async acquirePath(o,d){let c=(this.options.idGenerator??B).next();for(let b=0;b<2;b++){if(d?.throwIfAborted(),ti(o,{...this.options,ownerToken:c,ownerGeneration:this.options.ownerGeneration??kt}))return()=>Wn(o,this.options.pid??process.pid,c,this.options.fileSystem);if(lU(o,this.options.isProcessRunning,this.options.ownerGeneration??kt,this.options.fileSystem)!==void 0||b===1)return;await this.timer.sleep(25)}return}}class Mn{client;cached;constructor(o=new Jn){this.client=o}readBuild(o){return this.cached??=this.probe(o).catch((d)=>(e.warn("Xcode build is unknown; template cloning disabled for this process",d),"unknown")),this.cached}async probe(o){let{stdout:d}=await this.client.executeCommand(["-version"],{signal:o,timeoutMs:5000}),b=d.split(`
|
|
164
|
+
`).find((R)=>R.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 Tt(o,d,c,b){let R=await o.listSimulators(void 0,b),P=Object.values(R.devices).flat().find((C)=>C.udid===c);if(!P)return;if(P.name!==ud(d)){e.warn(`Refusing template deletion: ${c} is named ${P.name}`);return}await o.deleteSimulator(c,{signal:b})}var Td=15,Dd=60000,Id=120000,Fn=900000;class qn{source;timer;pollMs;constructor(o,d,c=5000){this.source=o;this.timer=d;this.pollMs=c}async waitUntilSettled(o,d){let c=this.timer.now()+d.maxWaitMs,b,R=[];while(this.timer.now()<=c){d.signal?.throwIfAborted();let P=c-this.timer.now();if(P<=0)break;let C=await l(()=>this.source.collectFresh({signal:d.signal,deadlineMs:c}),{timer:this.timer,timeoutMs:P,signal:d.signal,label:"Template settle collection"}),D=kg(C,o),k=this.timer.now();if(R=D===void 0?[]:[...R,{atMs:k,cpu:D}].filter((q)=>k-q.atMs<=(d.cpuMeanWindowMs??0)),b=D!==void 0&&Ig(R)<d.cpuThresholdPercent?b??this.timer.now():void 0,b!==void 0&&this.timer.now()-b>=d.quietWindowMs)return;let F=c-this.timer.now();if(F<=0)break;await l(this.timer.sleep(Math.min(this.pollMs,F)),{timer:this.timer,signal:d.signal,label:"Template settle poll"})}throw Error(`Simulator ${o} did not settle before the deadline`)}}function Ig(o){return o.reduce((d,c)=>d+c.cpu,0)/o.length}function kg(o,d){let c=o.simulators.find((R)=>R.udid===d);if(c?.state!=="Booted"||c.quality!=="measured")return;let b=c.process?.cpuPercent;return b!==void 0&&Number.isFinite(b)?b:void 0}class Un{deps;flights=new Map;constructor(o){this.deps=o}build(o,d){let c=lf(o),b=this.flights.get(c);if(b)return b;let R=this.buildLocked(o,d).finally(()=>{this.flights.delete(c)});return this.flights.set(c,R),R}async buildLocked(o,d){let c=await this.deps.lock.acquire(o,d);if(!c)return"building elsewhere";try{if(d?.throwIfAborted(),!await this.inputsAvailable(o,d))return"retry later";let b=await this.deps.store.read(o);if((b?.nextAttemptAtMs??0)>this.deps.timer.now())return"retry later";let R=o.xcodeBuild,P=await this.scanUntracked(o,b,d),C=await this.readyStatus(b,R,d);if(C)return C;if(b?.udid)await Tt(this.deps.client,o,b.udid,d);let D={attempt:b?.attempt??0,key:o,udid:"",state:"building",xcodeBuild:R,runtimeBuild:o.runtimeBuild,builtAtMs:this.deps.timer.now()};return await this.populate(D,P,d)}finally{c()}}async inputsAvailable(o,d){if(this.deps.hasSpareCapacity&&!await this.deps.hasSpareCapacity())return!1;let{runtimes:c}=await this.deps.client.getCatalogChecked(d);if(!c.some((R)=>R.identifier===o.runtime&&R.buildversion===o.runtimeBuild))return!1;let b=await this.deps.xcode.readBuild(d);return b!=="unknown"&&b===o.xcodeBuild}async scanUntracked(o,d,c){let b=new Set,R=await this.deps.client.listSimulators(void 0,c);for(let P of Object.values(R.devices).flat())if(P.name===ud(o)&&P.udid!==d?.udid)b.add(P.udid),e.warn(`leaving untracked template simulator ${P.udid} (${P.state}); not owned by this manifest, remove with the ios-templates clean command`);return b}async readyStatus(o,d,c){if(!o)return;let b=await this.deps.client.listSimulators(void 0,c),R=Object.values(b.devices).flat().find((P)=>P.udid===o.udid&&P.name===ud(o.key));if(R&&R.state!=="Shutdown"){if(o.state==="ready"||o.state==="stale")return e.warn(`Template ${R.udid} is ${R.state}; possibly in use, retry later`),"retry later";try{await this.deps.client.shutdownSimulator(R.udid,c)}catch(P){e.warn(`Could not shut down interrupted template ${R.udid}: ${r(P)}`,P)}}return R&&o.state==="ready"&&o.xcodeBuild===d&&o.runtimeBuild===o.key.runtimeBuild&&o.xcodeBuild===o.key.xcodeBuild?"ready":void 0}async populate(o,d,c){let{client:b,store:R,timer:P}=this.deps;await R.write(o);try{o.udid=await b.createSimulator(ud(o.key),o.key.deviceType,o.key.runtime,c),await R.write(o);let C=await this.deps.profile(o.key).apply(o.udid,{},c);if(!C.applied&&o.key.profile!=="none")throw Error(`Template preboot profile was not applied: ${C.reason??"unknown reason"}`);c?.throwIfAborted(),await this.deps.instrumentation.run({udid:o.udid,runtime:o.key.runtime,reason:"create",timeoutMs:Fn,signal:c},async()=>{await b.boot(o.udid,c)}),await this.deps.settle.waitUntilSettled(o.udid,{quietWindowMs:Id,cpuThresholdPercent:Td,cpuMeanWindowMs:Dd,maxWaitMs:Fn,signal:c}),o.settledAtMs=P.now(),await b.shutdownSimulator(o.udid,c);let D=await b.listSimulators(void 0,c);if(!Object.values(D.devices).flat().some((k)=>k.udid===o.udid&&k.name===ud(o.key)&&k.state==="Shutdown"))throw Error("Template did not shut down");return c?.throwIfAborted(),await R.write({...o,state:"ready",attempt:0,failure:void 0,nextAttemptAtMs:void 0}),"ready"}catch(C){return this.recordFailure(o,d,C,c?.aborted===!0)}}async recordFailure(o,d,c,b=!1){let{store:R,timer:P}=this.deps;e.warn(`Template build did not complete: ${r(c)}`,c);let C=await H(void 0,()=>this.removePartial(o,d)),D=c instanceof $n;if(b)return await R.write({...o,udid:C,state:"failed",failure:void 0}),"failed";let k=(o.attempt??0)+(D?0:1),O=D?60000:(this.deps.backoff??Q({initialDelayMs:60000,maxDelayMs:21600000})).delayForAttempt(k),F=P.now()+O;return await R.write({...o,udid:C,attempt:k,state:D?"stale":"failed",nextAttemptAtMs:F,failure:D?void 0:{atMs:P.now(),reason:r(c)}}),D?"retry later":"failed"}async removePartial(o,d){let c=o.udid;try{if(!c){let b=await this.deps.client.listSimulators();c=Object.values(b.devices).flat().find((R)=>R.name===ud(o.key)&&!d.has(R.udid))?.udid??""}if(c)await Tt(this.deps.client,o.key,c);return""}catch(b){return e.warn(`Could not delete partial template ${c}: ${r(b)}`,b),c}}}class Hn{client;store;lock;isStale;constructor(o,d,c,b){this.client=o;this.store=d;this.lock=c;this.isStale=b}async clean(o){let d=await this.keys(o),c=new Set,b=[];for(let R of d){let P=ud(R);c.add(P);let C=await this.lock.acquire(R,o.signal);if(!C&&!o.force){b.push(P);continue}try{await this.cleanKey(R,Boolean(C),o.signal)}finally{C?.()}}if(o.all)await this.removeOrphans(c,o,b);if(o.all||o.runtime)await this.store.removeInvalid?.(o.runtime);if(b.length)throw new t(`Templates under a live lock: ${b.join(", ")}. Retry later or use --force.`)}async cleanKey(o,d,c){let b=await this.store.read(o);if(b?.udid)await Tt(this.client,o,b.udid,c);if(d)await this.removeNamed(ud(o),c);await this.store.remove(o)}async keys(o){if(o.key)return[o.key];let d=await this.store.list(),c=[];for(let b of d){if(o.runtime&&b.key.runtime!==o.runtime)continue;if(o.stale&&!await this.isStale?.(b))continue;c.push(b.key)}return c}async removeNamed(o,d){let c=await this.client.listSimulators(void 0,d);for(let b of Object.values(c.devices).flat())if(b.name===o)await this.client.deleteSimulator(b.udid,{signal:d})}async removeOrphans(o,d,c){let b=await this.client.listSimulators(void 0,d.signal);for(let R of Object.values(b.devices).flat()){if(!pd(R.name)){if(R.name.startsWith("automobile-template-"))e.warn(`Skipping unrecognized template name ${R.name}`);continue}if(o.has(R.name))continue;o.add(R.name);let P=await this.lock.acquireName(R.name,d.signal);if(!P){c.push(R.name);continue}try{await this.removeNamed(R.name,d.signal)}finally{P()}}}}import{join as Bg}from"path";var kd=/^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i,Mg=["var/db/diagnostics"],Bd="-wal";class Vn{deps;constructor(o){this.deps=o}async relocate(o){let{templateUdid:d,cloneUdid:c,signal:b}=o;if(!kd.test(d)||!kd.test(c))throw new t(`Cannot relocate clone ${c} from template ${d}: both must be simulator UDIDs`);let{fs:R}=this.deps,P=Bg(this.deps.deviceSetRoot(),c,"data"),C=await R.scan(P,d,Mg,b),D=await this.checkpointWals(C.files,b),k=await this.withCheckpointedDatabases(C.files,D,d);for(let O of k)b?.throwIfAborted(),await R.replaceInFile(O,d,c);for(let O of C.links)b?.throwIfAborted(),await R.retargetLink(O,d,c);return{rewrittenFiles:k.length,retargetedLinks:C.links.length,checkpointedDatabases:D.length}}async checkpointWals(o,d){let c=[];for(let b of o.filter((R)=>R.endsWith(Bd))){d?.throwIfAborted();let R=b.slice(0,-Bd.length);if(!await this.deps.fs.exists(R))continue;try{await this.deps.checkpointer.checkpoint(R,d),c.push(R)}catch(P){d?.throwIfAborted(),e.warn(`WAL checkpoint failed for ${R}: ${r(P)}`,P)}}return c}async withCheckpointedDatabases(o,d,c){let b=new Set(o),R=[...o];for(let P of d)if(!b.has(P)&&await this.deps.fs.fileContains(P,c))R.push(P);return R}}import{open as Fg,readFile as Lg,readlink as Od,stat as qg,symlink as Ug,unlink as $g,writeFile as Hg}from"fs/promises";import{join as Md,relative as Wg}from"path";var Nd=1048576,Ld=32;async function qd(o,d){let c=await Fg(o,"r");try{let b=Buffer.allocUnsafe(Nd+d.length-1),R=0;for(;;){let{bytesRead:P}=await c.read(b,R,Nd,null);if(P===0)return!1;let C=R+P;if(b.subarray(0,C).includes(d))return!0;R=Math.min(d.length-1,C),b.copy(b,0,C-R,C)}}finally{await c.close()}}class jn{async scan(o,d,c,b){let R=Buffer.from(d),P=new Set(c.map((O)=>Md(o,O))),C=[],D=[],k=async(O)=>{b?.throwIfAborted();let F=await Tr(O),q=[],M=[];for(let W of F){let U=Md(O,W.name);if(W.isSymbolicLink()){if((await Od(U)).includes(d))D.push(U)}else if(W.isDirectory()){if(!P.has(U))q.push(U)}else if(W.isFile())M.push(U)}for(let W=0;W<M.length;W+=Ld){let U=M.slice(W,W+Ld),X=await Promise.all(U.map((z)=>qd(z,R)));C.push(...U.filter((z,we)=>X[we]))}for(let W of q)await k(W)};return await k(o),{files:C,links:D}}async exists(o){try{return(await qg(o)).isFile()}catch(d){if(d instanceof Error&&"code"in d&&d.code==="ENOENT")return e.debug(`no database beside ${o}`),!1;throw d}}fileContains(o,d){return qd(o,Buffer.from(d))}async replaceInFile(o,d,c){let b=Buffer.from(d),R=Buffer.from(c);if(b.length!==R.length)throw Error(`Refusing a length-changing rewrite of ${Wg(".",o)}`);let P=await Lg(o),C=P.indexOf(b);if(C<0)return;while(C>=0)R.copy(P,C),C=P.indexOf(b,C+b.length);await Hg(o,P)}async retargetLink(o,d,c){let b=(await Od(o)).split(d).join(c);await $g(o),await Ug(b,o)}}class Kn{async checkpoint(o){let{Database:d}=Pt("bun:sqlite"),c=new d(o,{create:!1});try{c.exec("PRAGMA busy_timeout = 0;"),c.exec("PRAGMA wal_checkpoint(TRUNCATE);")}finally{c.close()}}}var Ud=new WeakMap,jg=new Mn,Kg,$d=()=>Kg??=new L(null);function Gn(o=$d()){let d=Ud.get(o);if(d)return d;let c=new Tn(o),b=i,R=new kn,P=new On(b),C=jg,D=yh(),k=d_({timer:b,gate:D.ios,history:D.iosBootHistory}),O=new UA(new HA(new ee,b,void 0,{simctl:o}),D.iosBootHistory,b),F=new Un({client:c,timer:b,store:R,lock:P,xcode:C,instrumentation:k,hasSpareCapacity:async()=>!D.ios||(await D.ios.evaluateBoot()).outcome==="allow",settle:new qn(O,b),profile:(M)=>new Ng(void 0,()=>M.profile,void 0,yY(()=>M.apsdLogSuppressed===!0))}),q={client:c,store:R,lock:P,xcode:C,timer:b,profile:()=>hY(process.env),apsdLogSuppressed:()=>gY(process.env),builder:{build:(M,W)=>H(W,()=>F.build(M,W))},relocator:new Vn({fs:new jn,checkpointer:new Kn,deviceSetRoot:()=>Og(Vg())})};return Ud.set(o,q),q}function Rce(){let o=Gn();return{dependencies:o,cleanup:new Hn(o.client,o.store,o.lock,async(d)=>{let c=await o.xcode.readBuild();if(c==="unknown")return!1;let{runtimes:b}=await o.client.getCatalogChecked(),R=b.find((P)=>P.identifier===d.key.runtime);return d.xcodeBuild!==c||d.runtimeBuild!==R?.buildversion})}}var zn;function cv(o){zn??=new Dn({createSimulator:(...c)=>$d().createSimulator(...c)},()=>kne(process.env),Gn);let d=zn;return o?{create:(c)=>{let b=o();if(!b)throw new t("iOS simulator creation is unavailable");if(!(b instanceof L))return b.createSimulator(c.name,c.deviceType,c.runtime,c.signal).then((R)=>({udid:R,source:"create"}));return d.create(c,{creator:b,dependencies:()=>Gn(b)})}}:d}async function W4(){await zn?.stop()}import{AsyncLocalStorage as Oh}from"async_hooks";class Yn{explicitDevicePins=new Map;getPin(o="direct-stdio"){return this.explicitDevicePins.get(o)}setPin(o,d="direct-stdio"){this.explicitDevicePins.set(d,o)}clearConnection(o){this.explicitDevicePins.delete(o)}clearPinFor(o){for(let[d,c]of this.explicitDevicePins)if(c.deviceId===o)this.clearConnection(d)}}function l_(o,d){if(d!=="either")return d;return Va(o)?"ios":ae(o)?"android":d}function qA(o,d,c="either"){let b=o.filter((C)=>c==="either"||C.platform===c),R=b.find((C)=>C.deviceId===d);if(R)return R;let P=b.filter((C)=>C.name===d);if(P.length>1)throw new t(`Ambiguous running device name '${d}'. Candidates: ${P.map((C)=>C.deviceId).sort().join(", ")}. Provide a deviceId.`);return P[0]}class Zn extends t{}function mQ(o){return o instanceof Zn}function k0(o,d,c){return new Zn(`Device ${o} not found on ${d} platform. Available ${d} devices: ${to(c.filter((b)=>d==="either"||b.platform===d))}`)}function to(o){return o.map((d)=>d.name&&d.name!==d.deviceId?`${d.name} (${d.deviceId})`:d.deviceId).join(", ")||"none"}class Hd{resumeAfterDeviceStart(o,d){switch(o){case"android":E.resumeAfterDeviceStart(d);return;case"ios":x.resumeAfterDeviceStart(d);return;case"watchos":return}}async retireForShutdown(o,d){switch(o){case"android":E.retireForShutdown(d);return;case"ios":await x.retireInstance(d);return;case"watchos":return}}}var GS=new Hd;function u_(o,d=w){let c=o?.trim();if(!c)return;let b=d.sessionManager();return b?at(c,b)??c:c}var p_=30000,m_=1800000,z4=30000;var Ca={includeAppData:!0,includeSettings:!0,useVmSnapshot:!0,strictBackupMode:!1,vmSnapshotTimeoutMs:p_,maxVmSnapshotsPerAvd:3,maxVmArchiveSizeMb:void 0,maxArchiveSizeMb:100};var ro="global",Gg=s({syncWithHost:m(),defaultMode:p(["light","dark","auto"]),applyOnConnect:m()}),Jg=s({includeAppData:m().default(Ca.includeAppData),includeSettings:m().default(Ca.includeSettings),useVmSnapshot:m().default(Ca.useVmSnapshot),strictBackupMode:m().default(Ca.strictBackupMode),vmSnapshotTimeoutMs:a().default(Ca.vmSnapshotTimeoutMs),maxVmSnapshotsPerAvd:a().default(Ca.maxVmSnapshotsPerAvd),maxVmArchiveSizeMb:a().optional(),maxArchiveSizeMb:a().default(Ca.maxArchiveSizeMb)}),zg=s({qualityPreset:p(["low","medium","high"]),targetBitrateKbps:a(),maxThroughputMbps:a(),fps:a(),maxArchiveSizeMb:a(),format:_("mp4"),resolution:s({width:a(),height:a()}).optional()}),io={appearance:{tableName:"appearance_configs",loggerTag:"AppearanceConfigRepository",schema:Gg},deviceSnapshot:{tableName:"device_snapshot_configs",loggerTag:"DeviceSnapshotConfigRepository",schema:Jg},videoRecording:{tableName:"video_recording_configs",loggerTag:"VideoRecordingConfigRepository",schema:zg}};class Wd{tableName;loggerTag;db;logger;timer;schema;constructor(o){this.schema=o.schema,this.tableName=o.tableName,this.loggerTag=o.loggerTag??"KeyedJsonConfigRepository",this.db=o.db??null,this.logger=o.logger??e,this.timer=o.timer??i}getDb(){return this.db??_e()}async getConfig(o=ro){let c=await(await this.getDb()).selectFrom(this.tableName).select(["config_json"]).where("key","=",o).executeTakeFirst();if(!c)return null;let b;try{b=JSON.parse(c.config_json)}catch(P){return this.logger.warn(`[${this.loggerTag}] Failed to parse config JSON: ${r(P)}`),null}let R=this.schema.safeParse(b);if(!R.success)return this.logger.warn(`[${this.loggerTag}] Config JSON failed validation: ${R.error.message}`),null;return R.data}async setConfig(o,d=ro){let c=await this.getDb(),b=jr(this.timer),R={key:d,config_json:JSON.stringify(o),updated_at:b};await c.insertInto(this.tableName).values(R).onConflict((P)=>P.column("key").doUpdateSet({config_json:R.config_json,updated_at:R.updated_at})).execute()}async clearConfig(o=ro){await(await this.getDb()).deleteFrom(this.tableName).where("key","=",o).execute()}async listKeys(o){return(await(await this.getDb()).selectFrom(this.tableName).select(["key"]).execute()).map((b)=>b.key).filter((b)=>b.startsWith(o))}}function no(o,d){return new Wd({...o,db:d})}function Vd(o){return no(io.appearance,o)}function fQ(o){return no(io.deviceSnapshot,o)}function j4(o){return no(io.videoRecording,o)}var It={syncWithHost:!0,defaultMode:"auto",applyOnConnect:!0},Xg=new Set(["light","dark","auto"]);function it(o){let d=o&&typeof o==="object"?o:{},c=Yg(d.defaultMode),b=typeof d.syncWithHost==="boolean"?d.syncWithHost:It.syncWithHost,R=typeof d.applyOnConnect==="boolean"?d.applyOnConnect:It.applyOnConnect;return{syncWithHost:b,defaultMode:c,applyOnConnect:R}}function Yg(o){if(!o)return It.defaultMode;let d=String(o).trim().toLowerCase();if(Xg.has(d))return d;return It.defaultMode}var eh="defaults",th="-g",rh=2000;function ih(){return{executor:new ee,platform:process.platform,logger:e}}class oo{dependencies;constructor(o=ih()){this.dependencies=o}isSupported(){return this.dependencies.platform==="darwin"}async readGlobal(o,d={}){if(!this.isSupported())return null;try{let b=(await this.dependencies.executor.executeCommand(eh,["read",th,o],{timeoutMs:d.timeoutMs??rh,signal:d.signal})).stdout.trim();return b.length>0?b:null}catch(c){return this.dependencies.logger.debug(`host defaults read -g ${o} failed: ${c}`,c),null}}}async function Er(o,d,c){try{let b=await c.executeCommand(o,d,{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 so(o){let d=o.trim().toLowerCase();return d.includes("dark")||d.includes("prefer-dark")}async function jd(o=new oo,d=new ee){if(o.isSupported())return(await o.readGlobal("AppleInterfaceStyle"))?.toLowerCase()==="dark"?"dark":"light";if(process.platform==="linux"){let c=await nh(d);if(c!==null)return c}return e.debug("[HostAppearance] Falling back to light appearance (unsupported host)"),"light"}async function nh(o){let d=await Er("gsettings",["get","org.gnome.desktop.interface","color-scheme"],o);if(d?.stdout)return so(d.stdout)?"dark":"light";let c=await Er("gsettings",["get","org.gnome.desktop.interface","gtk-theme"],o);if(c?.stdout)return so(c.stdout)?"dark":"light";let b=await Er("kreadconfig5",["--group","General","--key","ColorScheme"],o)??await Er("kreadconfig6",["--group","General","--key","ColorScheme"],o);if(b?.stdout)return so(b.stdout)?"dark":"light";return null}var nt=Vd(),ao="session:";function xr(o){return o?`${ao}${o}`:void 0}function oh(o,d){return{syncWithHost:d.syncWithHost??o.syncWithHost,defaultMode:d.defaultMode??o.defaultMode,applyOnConnect:d.applyOnConnect??o.applyOnConnect}}function sh(o){return{syncWithHost:o.syncWithHost,defaultMode:o.defaultMode,applyOnConnect:o.applyOnConnect}}async function dv(o){let d=(o?await nt.getConfig(xr(o)):null)??await nt.getConfig();if(d)return it(d);return it(N.getAppearanceDefaults())}async function hQ(o,d){if(o===null)return await nt.clearConfig(xr(d)),it(N.getAppearanceDefaults());let c=await dv(d),b=oh(sh(c),o),R=it(b);return await nt.setConfig(R,xr(d)),R}async function Kq(o){await nt.clearConfig(xr(o))}async function gQ(o,d=nt){let c=[];for(let b of await d.listKeys(ao)){let R=b.slice(ao.length);if(!await o(R))await d.clearConfig(b),c.push(R)}return c}async function VA(o){let d=o??await dv();if(d.syncWithHost||d.defaultMode==="auto")return jd();return d.defaultMode==="dark"?"dark":"light"}import{existsSync as ah}from"fs";import{join as dh}from"path";async function WA(o,d){if(o.platform==="android"){let c=process.platform==="win32"?"adb.exe":"adb";if(!ha(process.env,(C)=>ah(dh(C,"platform-tools",c)))){e.debug("Skipping Android host appearance sync because configured SDK adb was not found");return}let R=v.create(o),P=d==="dark"?"yes":"no";await R.executeCommand(`shell cmd uimode night ${P}`),e.info(`[Appearance] Set Android appearance to ${d} for ${o.deviceId}`);return}if(o.platform==="ios")await new L(o).setAppearance(d),e.info(`[Appearance] Set iOS appearance to ${d} for ${o.deviceId}`)}function Gq(o){return!["0","false","off","no"].includes(o?.trim().toLowerCase()??"")}function lv(){return Gq(I(h.APPEARANCE_SYNC))}var lh={isSyncEnabled:lv,getConfig:dv,resolveMode:VA,apply:WA};async function Kd(o,d={},c){let{isSyncEnabled:b,getConfig:R,resolveMode:P,apply:C}={...lh,...d};if(!b())return null;try{let D=await R(c);if(!D.applyOnConnect)return null;let k=await P(D);if(!b())return null;return await C(o,k),k}catch(D){return e.warn("[Appearance] Failed to apply appearance on connect",D),null}}var Ke=new Map,ch=256;function Jd(){return w.sessionManager()}function E0(o,d,c,b=Jd()){if(c){let R=b?.getSession(c);if(R&&R.assignedDevice===o){R.cacheData.pendingSetupTiming=d;return}if(b&&!R)return}if(Ke.delete(o),Ke.set(o,{timing:d,sessionId:c}),Ke.size>ch){let R=Ke.keys().next().value;if(R!==void 0)Ke.delete(R)}}function Gd(o,d){let c=Ke.get(o);if(!c||c.sessionId!==d)return null;return Ke.delete(o),c.timing}function yQ(o,d,c=Jd()){if(d){let b=c?.getSession(d);if(!b||b.assignedDevice!==o){if(c&&!b)return null;return Gd(o,d)}let R=b.cacheData.pendingSetupTiming;return delete b.cacheData.pendingSetupTiming,R??null}return Gd(o)}function Yq(o,d){return uc(o.name)||pd(o.name)||d?.holderOf({platform:o.platform,stableIds:[o.name,o.deviceId]})!==void 0}async function lo(o,d){await nl(d);let c=o.filter((b)=>!Yq(b,d));if(c.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 c[0]}class Ar extends t{}class uo{dependencies;constructor(o){this.dependencies=o}async ensureReady(o,d,c){let b=qa(!0);b.serial("ensureAccessibilityService");let R={didSetup:!1,needsSetup:!1};try{await this.ensureService(d,o,c,{perf:b,state:R})}catch(P){this.handleSetupFailure(P,o,c)}finally{this.finishSetupTiming(o,b,R,c)}}skipCtrlProxyDownload(o){return o?.skipCtrlProxyDownload??o?.skipAccessibilityDownload??o?.skipAccessibilitySetup}warnDeprecatedAccessibilityOptions(o){if(o?.skipAccessibilitySetup!==void 0)if(o?.skipAccessibilityDownload!==void 0)e.warn("[DeviceReadiness] skipAccessibilityDownload is deprecated; use skipCtrlProxyDownload instead.");else e.warn("[DeviceReadiness] skipAccessibilitySetup is deprecated; use skipCtrlProxyDownload instead.")}async verifyConnectedAndroidService(o,d,c){if(e.info(`[DeviceReadiness] WebSocket connected for ${o}, verifying service is responsive`),await c.track("verifyConnectedService",()=>d.verifyServiceReady(2,200,2000)))return e.info(`[DeviceReadiness] Accessibility service verified responsive for ${o}`),c.end(),!0;return e.warn(`[DeviceReadiness] WebSocket connected but service not responsive for ${o}, terminating stale connection and checking status`),d.terminateStaleConnection(),!1}async verifyEnabledAndroidService(o,d,c,{perf:b,step:R}){let{setupState:P,skipCtrlProxyDownload:C,verifyCompatibilityWhenSkipping:D,signal:k}=R;if(e.info(`[DeviceReadiness] Accessibility service already enabled for ${o}, verifying WebSocket connection`),await b.track("verifyConnection",()=>c.waitForConnection(3,200))){if(C)return await D(),!0;e.info(`[DeviceReadiness] Accessibility service enabled and connected for ${o}, verifying version compatibility`),await this.upgradeStaleInstall(o,d,P)}else await this.throwAndroidForwardConflictIfPresent(o,d,c,k),e.warn(`[DeviceReadiness] Accessibility service cache stale for ${o} - marked as installed/enabled but WebSocket failed. Resetting setup state and forcing reinstall.`),d.resetSetupState(),P.needsSetup=!0;return!1}async upgradeStaleInstall(o,d,c){try{let b=await d.ensureCompatibleVersion();if(b.status==="upgraded"||b.status==="installed"||b.status==="reinstalled")e.info(`[DeviceReadiness] CtrlProxy APK on ${o} was ${b.status}; reconnecting`),c.needsSetup=!0}catch(b){if(b instanceof this.dependencies.errors.DeviceOwnedByOtherDaemonError)throw b;e.warn(`[DeviceReadiness] CtrlProxy APK check failed on ${o}: ${r(b)}`,b)}}async enableInstalledAndroidService(o,d,c,{perf:b,step:R}){let{DeviceOwnedByOtherDaemonError:P}=this.dependencies.errors,{setupState:C,skipCtrlProxyDownload:D,verifyCompatibilityWhenSkipping:k,signal:O}=R;e.info(`[DeviceReadiness] Accessibility service installed but not enabled for ${o}, enabling now`);try{if(await b.track("enableService",()=>d.enable()),C.didSetup=!0,c.resetConnectionBudget(),e.info(`[DeviceReadiness] Waiting for accessibility WebSocket connection for ${o}`),!await b.track("waitForConnection",()=>c.waitForConnection()))await this.throwAndroidForwardConflictIfPresent(o,d,c,O),e.warn(`[DeviceReadiness] WebSocket connection failed after enabling for ${o}, will attempt full setup`),d.resetSetupState(),C.needsSetup=!0;else{if(D)return await k(),!0;e.info(`[DeviceReadiness] Accessibility service enabled for ${o}, verifying version compatibility`)}}catch(F){if(F instanceof P||c.isLastConnectionFailureForwardingLeaseConflict?.())throw F;let q=r(F);if(e.warn(`[DeviceReadiness] Failed to enable accessibility service: ${q}`),D)return!0;C.needsSetup=!0}return!1}async setupAndroidService(o,d,c,{perf:b,state:R,signal:P}){let{DeviceOwnedByOtherDaemonError:C,CtrlProxyForwardOwnershipUnreadableError:D}=this.dependencies.errors,k=await d.setup(!1,b);if(!k.success){if(k.cause instanceof C||k.cause instanceof D)throw k.cause;throw new t(k.error??k.message)}R.didSetup=!0,c.resetConnectionBudget(),e.info(`[DeviceReadiness] Waiting for accessibility WebSocket connection after setup for ${o}`);let O=await b.track("waitForConnection",()=>c.waitForConnection());if(!O)await this.throwAndroidForwardConflictIfPresent(o,d,c,P);if(O){if(e.info(`[DeviceReadiness] Verifying accessibility service is responsive for ${o}`),!await b.track("verifyServiceReady",()=>c.verifyServiceReady(5,500,3000)))e.warn(`[DeviceReadiness] Accessibility service not responsive after setup for ${o}, observe may fall back to UIAutomator`)}}async throwAndroidForwardConflictIfPresent(o,d,c,b){if(!c.isLastConnectionFailureForwardingLeaseConflict?.())return;throw await d.assertNotDrivenByOtherDaemon?.(b),b?.throwIfAborted(),new Ar(c.getLastConnectionFailureMessage?.()??`CtrlProxy forwarding lease conflict for Android device ${o}`)}async prepareService(o){let{deviceId:d,manager:c,accessibilityClient:b,perf:R,state:P,skipCtrlProxyDownload:C,options:D}=o,k=async()=>{if(await c.isVersionCompatible()){e.info(`[DeviceReadiness] Accessibility service version compatible for ${d}`);return}let M="Accessibility service version mismatch detected. Run without skipCtrlProxyDownload to install a compatible version.";throw e.warn(`[DeviceReadiness] ${M} Device: ${d}`),new t(M)},[O,F]=await R.track("checkStatus",()=>Promise.all([c.isInstalled(),c.isEnabled()]));if(D?.signal?.throwIfAborted(),P.needsSetup=!1,await this.useInstalledService(o,O,F,k))return;if(C&&!P.needsSetup){e.info(`[DeviceReadiness] Skipping accessibility service download/install for ${d}`);return}if(P.needsSetup||!O)D?.signal?.throwIfAborted(),await this.setupAndroidService(d,c,b,{perf:R,state:P,signal:D?.signal})}async ensureService(o,d,c,{perf:b,state:R}){let P=this.skipCtrlProxyDownload(c);this.warnDeprecatedAccessibilityOptions(c);let C=this.dependencies.provider.getAndroidCtrlProxyManager(o),D=this.dependencies.provider.getAndroidCtrlProxyClient(o);if(D.isConnected()){if(await this.verifyConnectedAndroidService(d,D,b)){c?.signal?.throwIfAborted(),this.dependencies.checkedAndroidOwnership.getStore()?.add(d);return}}await C.assertNotDrivenByOtherDaemon?.(c?.signal),c?.signal?.throwIfAborted(),this.dependencies.checkedAndroidOwnership.getStore()?.add(d),await this.prepareService({deviceId:d,manager:C,accessibilityClient:D,perf:b,state:R,skipCtrlProxyDownload:P,options:c})}finishSetupTiming(o,d,c,b){if(d.end(),c.didSetup){let R=d.getTimings();if(R)this.dependencies.storeSetupTiming(o,R,b?.sessionId)}}async useInstalledService(o,d,c,b){let{deviceId:R,manager:P,accessibilityClient:C,perf:D,state:k,skipCtrlProxyDownload:O,options:F}=o;if(d&&c){if(await this.verifyEnabledAndroidService(R,P,C,{perf:D,step:{setupState:k,skipCtrlProxyDownload:O,verifyCompatibilityWhenSkipping:b,signal:F?.signal}}))return!0}if(!d&&O)return e.info(`[DeviceReadiness] Accessibility service not installed for ${R}, skipping download/install`),!0;if(d&&!c&&!k.needsSetup){if(await this.enableInstalledAndroidService(R,P,C,{perf:D,step:{setupState:k,skipCtrlProxyDownload:O,verifyCompatibilityWhenSkipping:b,signal:F?.signal}}))return!0}return!1}handleSetupFailure(o,d,c){let{DeviceOwnedByOtherDaemonError:b,CtrlProxyForwardOwnershipUnreadableError:R}=this.dependencies.errors;c?.signal?.throwIfAborted();let P=r(o);if(c?.intent==="read"&&(o instanceof b||o instanceof R||o instanceof Ar)){e.warn(`[DeviceReadiness] Skipping CtrlProxy readiness for read on ${d}: ${P}`);return}if(e.error(`[DeviceReadiness] Failed to setup accessibility service: ${P}`),o instanceof t||c?.signal?.aborted)throw o}}class mo{observeClients;_adb;_adbFactory;_simctl;_androidEmulator;_deviceUtils;_windows=new Map;constructor(o,d=v){this.observeClients=o;this._adbFactory=d}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 pi;return this._androidEmulator}getDeviceUtils(){if(!this._deviceUtils)this._deviceUtils=new Xn(this.getAdb(),this.getSimctl(),this.getAndroidEmulator());return this._deviceUtils}getIosPhysicalDeviceLister(){return tO()}getAndroidCtrlProxyManager(o){return le.getInstance(o)}getAndroidCtrlProxyClient(o){return this.observeClients.androidCtrlProxyClient(o)}getIOSCtrlProxyManager(o){return ve.getInstance(o)}getIOSCtrlProxyClient(o,d){return this.observeClients.iosCtrlProxyClient(o,d)}getWindow(o){let d=o.deviceId,c=oO(o,Cn(o)),b=this._windows.get(d);if(!b)return this.cacheWindow(d,o,c);if(c.unresolved)return b.window;let R=Uu(b.evidence,c);if(c.stableId===b.evidence.stableId){if(R==="newer")b.evidence=c;return b.window}if(R!=="newer")return b.window;return this.cacheWindow(d,o,c)}cacheWindow(o,d,c){let b=this.observeClients.createWindow(d,this._adbFactory);return this._windows.set(o,{window:b,evidence:c}),b}getObserveScreenCache(){return this.observeClients.observeScreenCache()}}var uh={androidCtrlProxyClient:(o)=>E.getInstance(o),iosCtrlProxyClient:(o,d)=>x.getInstance(o,d),createWindow:(o,d)=>new Bl(o,d),observeScreenCache:()=>xe.defaultObserveScreenCache};function fo(o){return new mo(uh,o)}var zd=1000,Xd=1e4,mh={booted:0,automationReady:1};function Jq(o){return mh[o]}async function Yd(o,d,c){let b=o.runnerReadinessTimer.now()+Vr,R=()=>{let k=b-o.runnerReadinessTimer.now();if(k<=0)throw new t("Created iOS simulator rollback budget exhausted.");return k};if(!d.deviceId){e.warn(`[DeviceReadiness] Cannot roll back created iOS simulator '${d.name}': no UDID.`);return}e.warn(`[DeviceReadiness] Rolling back created iOS simulator '${d.name}' (${d.deviceId}) after failure: ${r(c)}`);let P=new AbortController().signal,C={name:d.name,platform:"ios",deviceId:d.deviceId},D="retire runner";try{await ph(o,C),D="shut down",await wh(o,C,P,R()),D="delete",await o.simctl().deleteSimulator(d.deviceId,{signal:P,timeoutMs:R()}),D="verify absence of",R(),await _h(o,d.deviceId,P,b)}catch(k){let O=b-o.runnerReadinessTimer.now(),F=O>0?await Rh(o,d.deviceId,P,O):"unknown";e.warn(`[DeviceReadiness] Failed to ${D} created iOS simulator '${d.name}' (${d.deviceId}, state: ${F}); it may be left behind: `+r(k),k)}}async function ph(o,d){try{await x.retireInstance(d.deviceId),await o.provider.getIOSCtrlProxyManager(d).stop()}catch(c){e.warn(`[DeviceReadiness] Failed to stop CtrlProxy iOS for created simulator ${d.deviceId} before rollback: ${r(c)}`,c)}}async function wh(o,d,c,b=Vr){try{await o.simctl().killSimulator(d,{signal:c,timeoutMs:b})}catch(R){if(!gk(R)){e.warn(`[DeviceReadiness] Failed to shut down created iOS simulator ${d.deviceId}; attempting delete: ${r(R)}`,R);return}e.debug(`[DeviceReadiness] ${d.deviceId} was already shut down: ${r(R)}`)}}async function _h(o,d,c,b=Number.POSITIVE_INFINITY){let R=Math.min(o.runnerReadinessTimer.now()+Xd,b);for(;;){let P=R-o.runnerReadinessTimer.now();if(P<=0)throw new t(`iOS simulator ${d} is still listed after delete.`);if(!(await o.simctl().listSimulatorImages(P,{bypassCache:!0,signal:c})).some((D)=>D.deviceId===d))return;if(o.runnerReadinessTimer.now()>=R)throw new t(`iOS simulator ${d} is still listed after delete.`);await o.runnerReadinessTimer.sleep(Math.min(zd,R-o.runnerReadinessTimer.now()))}}async function Rh(o,d,c,b){try{let P=(await o.simctl().listSimulatorImages(b,{bypassCache:!0,signal:c})).find((C)=>C.deviceId===d);return P?P.state??"unknown":"absent"}catch(R){return e.warn(`[DeviceReadiness] Could not read state of ${d}: ${r(R)}`,R),"unknown"}}async function Zd(o,d,c,b={}){b.signal?.throwIfAborted();let R=await o.getBootedDevicesDetailed("visionos",{signal:b.signal});if(b.signal?.throwIfAborted(),!R.succeededPlatforms.has("visionos"))throw new t(`visionOS simulator discovery failed: ${R.discoveryErrors?.visionos?.message??"unknown error"}. Retry the call.`);let P=Ph(R.devices,d,c);if(!P)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?.(P);return P}function Ph(o,d,c){let b=o.filter((P)=>P.platform==="visionos"),R=d??(c?.platform==="visionos"?c.deviceId:void 0);return R?b.find((P)=>P.deviceId===R):b.length===1?b[0]:void 0}async function sl(o,d,c,b={}){b.signal?.throwIfAborted();let R=await o.getBootedDevicesDetailed("tvos",{signal:b.signal});if(b.signal?.throwIfAborted(),!R.succeededPlatforms.has("tvos"))throw new t(`tvOS simulator discovery failed: ${R.discoveryErrors?.tvos?.message??"unknown error"}. Retry the call.`);let P=Eh(R.devices,d,c);if(!P)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?.(P);return P}function Eh(o,d,c){let b=o.filter((P)=>P.platform==="tvos"),R=d??(c?.platform==="tvos"?c.deviceId:void 0);return R?b.find((P)=>P.deviceId===R):b.length===1?b[0]:void 0}async function al(o,d,c){try{return await o.deviceUtils().startDevice(d)}catch(b){if(Zg(b)&&b.process)c.holdLeaseUntil(PW(b.process,d.name,o.runnerReadinessTimer,{markHeldByUnkillableProcess:(R)=>c.lease.markHeldByUnkillableProcess?.(R)}).then((R)=>R.state==="survived"?R.gone:void 0));throw b}}async function go(o,d,c){let b=[d?.signal,o.signal].filter((R)=>R!==void 0);return await c(b.length===1?b[0]:AbortSignal.any(b))}function dl(o,d,c){if(d?.intent==="read"&&c.precedingOperations?.some((b)=>b==="shutdown"||b==="teardown"))throw new t(`${o.platform} device '${o.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 Bt(o,d,c){return`iOS simulator '${o}' (${d}) is not booted${c?` (state: ${c})`:""}; a read never boots a simulator. Call startDevice (or acquire a session) to boot it.`}var YS="ambiguous_device_target";class Rm extends t{code=YS;retryable=!1;candidates;constructor(o,d){super(`${o} (code ${YS})`);this.name="AmbiguousDeviceTargetError",this.candidates=d.map(({deviceId:c,platform:b})=>({deviceId:c,platform:b}))}toPayload(){return{code:this.code,candidates:this.candidates,retryable:!1}}}async function ll(o,d=v){if(o.platform!=="android")return;if(!o.deviceId.startsWith("emulator-"))return;try{await d.create(o).executeCommand("shell settings put secure stylus_handwriting_enabled 0"),e.info(`[StylusHandwriting] Disabled stylus handwriting on ${o.deviceId}`)}catch(c){e.warn(`[StylusHandwriting] Failed to disable stylus handwriting on ${o.deviceId}: ${c}`)}}class JS{retired=new Map;async retire(o){this.retired.set(o.deviceId,{...o})}async get(o){let d=this.retired.get(o);return d?{...d}:void 0}async clear(o){this.retired.delete(o)}}class Xq{store;memory;timer;constructor(o){this.store=o.store,this.memory=o.memory??new JS,this.timer=o.timer??i}async retire(o){await this.store.retire(o,this.timer.now()),await this.memory.retire(o)}async get(o){return await this.memory.get(o)??await this.store.get(o)}async clear(o){await this.store.clear(o),await this.memory.clear(o)}}var ho=I(Y.NODE_ENV)==="test"?new JS:void 0;function vQ(o){return ho??=o()}function I0(){if(!ho)throw new t("Provisioned device transport fence is not installed. Initialize the default fence during startup before using device sessions or provisioning.");return ho}async function cl(o,d={}){let c=I0(),b=await c.get(o);if(!b)return;let R=await d.currentIdentity?.();if(R&&R!==b.stableId){await c.clear(o);return}throw new sn(o,`Provisioned Android device '${b.stableId}' was removed after ${b.reason}; transport '${o}' is retired and cannot identify a later emulator.`)}function So(o,d){if(o==="android")return"android";if(o==="visionos")return"visionos-simulator";if(o==="tvos")return"tvos-simulator";if(o==="watchos")return"watchos-simulator";return d!==void 0&&En(d)?"ios-physical":"ios-simulator"}function XS(o){switch(o){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 xh(o){switch(o){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 Si(o,d,c){let b=o.succeededSources;if(b)return b.has(So(d,c));return o.succeededPlatforms.has(d)}function uu(o,d){let c=new Set(o.expectedSources);for(let b of d??[])c.add(So(b.platform,b.id));return{...o,expectedSources:c}}function _0(o,d){let c=xh(d);if(o.succeededSources?o.succeededSources.has(d):o.succeededPlatforms.has(c))return"complete";return(o.sourceErrors?.[d]??o.discoveryErrors?.[c])?.code==="unavailable"&&!o.expectedSources?.has(d)?"not_applicable":"incomplete"}function ul(o,d,c){return d.flatMap((b)=>XS(b)).filter((b)=>_0(o,b)===c)}function cp(o,d){return ul(o,d,"incomplete")}function Zq(o,d){return ul(o,d,"not_applicable")}function x0(o,d,c){return _0(o,So(d,c))==="incomplete"}function Mt(o){if(o.platform==="ios"||o.platform==="watchos")return{platform:o.platform,stableId:o.deviceId};return ae(o.deviceId)&&!Cn(o)?{platform:"android",stableId:o.name}:ey("android",{deviceId:o.deviceId})}function C0(o,d){if(!o.scannedSources)return o.scanned[d.platform];return o.scannedSources[So(d.platform,d.deviceId)]===!0}async function ml(o,d,c,b={}){let R=await Ch(o,b.signal),P=d??(c?.platform==="watchos"?c.deviceId:void 0),C=P?R.find((D)=>D.deviceId===P):Ah(R);if(!C)throw new t(Th(P,R));if(b.intent==="read")await b.beforeReadReadiness?.(C);return C}async function Ch(o,d){d?.throwIfAborted();let c=await o.getBootedDevicesDetailed("watchos",{signal:d});if(d?.throwIfAborted(),!c.succeededPlatforms.has("watchos")){let b=c.discoveryErrors?.watchos?.message??"unknown error";throw new t(`watchOS simulator discovery failed: ${b}. Retry the call.`)}return c.devices.filter((b)=>b.platform==="watchos")}function Ah(o){return o.length===1?o[0]:void 0}function Th(o,d){if(o)return`No booted Apple Watch simulator matches '${o}'. Boot it with startDevice { platform: "watchos", deviceId } first.`;if(d.length===0)return'No Apple Watch simulator is booted. Boot one with startDevice { platform: "watchos" } first.';return`${d.length} Apple Watch simulators are booted (${d.map((c)=>c.deviceId).join(", ")}). Pass deviceId or the watch's sessionUuid.`}var Dh={watchos:ml,tvos:sl,visionos:Zd};function pl(o){let d=new Set(o.map((b)=>b.platform));return`${d.size>1?"Both Android and iOS devices are connected.":`Multiple ${d.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 yo{dependencies;constructor(o){this.dependencies=o}async detectConnectedPlatformsWithStatus(o,d){let c=[],b={android:!1,"ios-simulator":!1,"ios-physical":!1,"watchos-simulator":!1,"tvos-simulator":!1,"visionos-simulator":!1},R=J();try{R.startOperation("androidDeviceScan");let k=this.mapAndroidReadinessRows(await this.dependencies.adb.getBootedAndroidDevices({signal:o,throwOnMissingAdb:!0}));R.endOperation("androidDeviceScan"),c.push(...k),b.android=!0}catch(k){if(R.endOperation("androidDeviceScan"),o?.throwIfAborted(),k instanceof Ip)e.debug(`Android scan skipped: ${k.message}`);else e.warn(`Failed to detect Android devices: ${k}`)}let[P,C]=await Promise.all([this.scanBootedSimulators(R,o),this.scanPhysicalIosDevices(d?.platform,o)]);o?.throwIfAborted();let D=new Set(P.devices.map((k)=>k.deviceId));return c.push(...P.devices,...C.devices.filter((k)=>!D.has(k.deviceId))),b["ios-simulator"]=P.complete,b["ios-physical"]=C.complete,{devices:c,scanned:{android:b.android,ios:b["ios-simulator"]||b["ios-physical"],watchos:!1,tvos:!1,visionos:!1},scannedSources:b}}async scanBootedSimulators(o,d){if(!this.dependencies.simctl)return{devices:[],complete:!1};o.startOperation("iosSimulatorScan");try{return{devices:await this.dependencies.simctl.getBootedSimulatorsChecked(void 0,d),complete:!0}}catch(c){return d?.throwIfAborted(),e.warn(`Failed to detect iOS simulators: ${c}`),{devices:[],complete:!1}}finally{o.endOperation("iosSimulatorScan")}}async scanPhysicalIosDevices(o,d){let c=this.dependencies.provider.getIosPhysicalDeviceLister?.();if(!c||o==="android")return{devices:[],complete:!1};try{let b=await l(()=>c.listConnectedDevices(),{timer:this.dependencies.runnerReadinessTimer,timeoutMs:this.dependencies.physicalIosScanBudgetMs,signal:d,label:"Physical iOS device scan"});return{devices:b.devices,complete:b.complete}}catch(b){return d?.throwIfAborted(),e.warn(`Failed to detect physical iOS devices: ${r(b)}`),{devices:[],complete:!1}}}async ensureDeviceReadyInCall(o,d,c){e.info(`[DeviceReadiness] ensureDeviceReady called with platform=${o}, providedDeviceId=${d}`);let b=Dh[o];if(b){let z=this.dependencies.selection.getPin(c?.connectionId);return b(this.dependencies.deviceUtils,d,z,c)}d=await this.resolveProvidedReadinessId(d);let R=await this.getReadinessScan(o,c),P=this.normalizeReadinessScan(R),C=P.devices;this.reconcileReadinessPin(P,c),e.info(`Found ${C.length} connectedPlatform devices`);let D=C.filter((z)=>z.platform==="android");e.info(`Found ${D.length} android devices`);let k=C.filter((z)=>z.platform==="ios");e.info(`Found ${k.length} ios devices`);let O=await this.resolveReadinessReadTarget(o,d,P,c);if(O.bootedDevice)return await this.finishReadinessSelection(O.bootedDevice,O.bootedDevice.platform,"provided",{scan:P,...c});d=O.providedDeviceId;let{platformDevices:F,resolvedPlatform:q}=this.resolveReadinessPlatform(o,D,k,{providedDeviceId:d,...c}),M,W=!1,U="auto";if(d){let z=this.requireProvidedReadinessDevice(o,F,d);M=await this.resolveAndroidReadinessIdentity(z,c?.signal),U="provided"}let X=this.findPinnedReadinessDevice(F,c);if(this.shouldResolveReadinessPin(M,d,X))M=await this.resolveAndroidReadinessIdentity(X,c?.signal),U="provided";if(!M)e.info(`[DeviceReadiness] Finding or starting device for platform ${q}`),M=await this.findOrStartReadinessDevice(q,P,c),W=!0,U="auto";if(!W){if(!M)throw new t("No device was selected for readiness verification");let z=M;await this.dependencies.withLifecycleStart(Mt(z),c,async(we)=>await this.dependencies.verifyDevice(z.deviceId,q,{...c,signal:we},z))}return await this.finishReadinessSelection(M,q,U,{scan:P,...c})}async finishReadinessSelection(o,d,c,{scan:b,...R}){if(o.platform!==d)e.warn(`[DeviceReadiness] Platform mismatch: selected device ${o.deviceId} has platform '${o.platform}' but resolved platform is '${d}'. Discarding and finding correct platform device.`),o=await this.findOrStartReadinessDevice(d,b,R);if(R?.signal?.throwIfAborted(),R?.intent!=="read")await this.assertAndroidSelectionAvailable(o,R?.signal),await this.dependencies.applyAppearanceOnConnect(o,R?.sessionId),R?.signal?.throwIfAborted(),await ll(o,this.dependencies.adbFactory);return e.info(`[DeviceReadiness] Using ${c} device: ${o.deviceId}`),o}async assertAndroidSelectionAvailable(o,d){if(o.platform!=="android"||this.dependencies.checkedAndroidOwnership.getStore()?.has(o.deviceId))return;await this.dependencies.provider.getAndroidCtrlProxyManager(o).assertNotDrivenByOtherDaemon?.(d),d?.throwIfAborted()}shouldResolveReadinessPin(o,d,c){return!o&&!d&&!!c}requireProvidedReadinessDevice(o,d,c){let b=d.find((R)=>R.deviceId===c);if(!b)throw k0(c,o,d);return b}assertReadinessDiscoveryComplete(o,d){let c=o==="either"?["android","ios"]:[o];for(let b of c)if(!d.scanned[b])throw new ze(b,void 0)}async resolveReadinessReadTarget(o,d,c,b){if(b?.intent!=="read")return{providedDeviceId:d};if(!d)return this.requireRunningReadinessDevice(o,c),{providedDeviceId:d};let R=qA(c.devices,d,o);if(R)return{providedDeviceId:R.deviceId};return{providedDeviceId:d,bootedDevice:await this.bootProvidedReadinessImage(o,d,c,b)}}requireRunningReadinessDevice(o,d){let c=d.devices.filter((P)=>o==="either"||P.platform===o);if(o==="ios")c.sort((P,C)=>P.deviceId.localeCompare(C.deviceId));let b=c[0];if(b)return b;if(o!=="either"||!Object.values(d.scanned).some(Boolean))this.assertReadinessDiscoveryComplete(o,d);throw new t(`No ${o==="either"?"Android or iOS":o==="android"?"Android":"iOS"} device is running, so there is nothing to read. Start one with startDevice or provisionDevice, or pass a deviceId.`)}async findOrStartReadinessDevice(o,d,c){let b=d.devices.filter((P)=>P.platform===o);if(b.length>1)throw new Rm(pl(b),b);if(c?.intent!=="read")return await this.dependencies.findOrStartDevice(o,c);let R=await this.resolveAndroidReadinessIdentity(this.requireRunningReadinessDevice(o,d),c.signal);return await this.dependencies.withLifecycleStart(Mt(R),c,async(P)=>{this.dependencies.resumeAfterDeviceStart(o,R.deviceId),await this.dependencies.verifyDevice(R.deviceId,o,{...c,signal:P},R)}),R}async listProvidedReadinessImages(o,d){if(o==="ios"&&!this.dependencies.simctl)throw new ze("ios",{code:"unavailable",message:"iOS simulator tools not available",retryable:!0});let c=new AbortController,b=d.signal?AbortSignal.any([d.signal,c.signal]):c.signal,R=new ze(o,{code:"timeout",message:"Named device image discovery timed out",retryable:!0});try{return await l(()=>o==="android"?this.dependencies.deviceUtils.listDeviceImages("android",b):this.dependencies.simctl.listSimulatorImages(void 0,{bypassCache:!0,signal:b}),{timer:this.dependencies.runnerReadinessTimer,timeoutMs:Ve,signal:d.signal,label:"Named device image discovery",timeoutError:()=>R,onTimeout:()=>c.abort(R)})}catch(P){if(d.signal?.throwIfAborted(),P instanceof t)throw P;throw new ze(o,{code:"failed",message:r(P),retryable:!0})}}async findProvidedReadinessImage(o,d,c,b){if(o=l_(d,o),o!=="either")this.assertReadinessDiscoveryComplete(o,c);let R=o==="either"?["android","ios"]:[o],P=await Promise.allSettled(R.map((O)=>this.listProvidedReadinessImages(O,b)));b.signal?.throwIfAborted();let D=P.flatMap((O)=>O.status==="fulfilled"?O.value:[]).filter((O)=>O.platform==="android"?O.name===d:O.deviceId===d),k=D.length===1?D[0]:void 0;this.assertReadinessDiscoveryComplete(k?.platform??o,c);for(let[O,F]of P.entries())if(F.status==="rejected"&&c.scanned[R[O]])throw F.reason;return k}async bootProvidedReadinessImage(o,d,c,b){let R=await this.dependencies.findProvidedReadinessImage(o,d,c,b);if(R?.platform==="android"&&R.isRunning===!0)throw new Gr(void 0,`Android AVD '${R.name}' is running but its serial could not be resolved yet.`);if(!R||R.isRunning!==!1||R.platform==="ios"&&R.isAvailable===!1)return this.requireProvidedReadinessDevice(o,c.devices.filter((P)=>o==="either"||P.platform===o),d);if(R.platform==="android"){if(R.isRunningStateKnown===!1)throw new Gr(void 0,`Cannot safely cold-boot Android AVD '${R.name}': its running state is unknown.`);return await b.beforeReadBoot?.(R),await this.dependencies.bootAndroidReadinessImage(R,b)}throw new t(Bt(R.name,R.deviceId))}findPinnedReadinessDevice(o,d){let c=this.dependencies.selection.getPin(d?.connectionId);return o.find((b)=>b.deviceId===c?.deviceId)}async recheckReadBootImage(o,d){if(d?.intent!=="read")return;let c=await this.recheckAndroidReadBootImage(o,d);if(c)await d.beforeReadReadiness?.(c),d.signal?.throwIfAborted(),this.dependencies.resumeReadBootClient(o.platform,c.deviceId),await this.dependencies.verifyDevice(c.deviceId,o.platform,d,c);return c}async recheckAndroidReadBootImage(o,d){let c=await this.listBootedAndroidDevicesForSelection({bypassAndroidDeviceListCache:!0,signal:d.signal});d.signal?.throwIfAborted();let R=(await this.listProvidedReadinessImages("android",d)).filter((D)=>D.name===o.name),P=R.length===1?R[0]:void 0;if(!P)throw k0(o.name,"android",[]);let C=qA(c.filter((D)=>ae(D.deviceId)&&D.name===o.name),o.name,"android");if(C)return C;if(P.isRunning===!0)throw new Gr(void 0,`Android AVD '${o.name}' is running but its serial could not be resolved yet.`);if(Qg(P),P.isRunning!==!1)throw new Gr(void 0,`Cannot safely cold-boot Android AVD '${o.name}': its running state is unknown.`);return}async listBootedAndroidDevicesForSelection(o){let d=await this.dependencies.deviceUtils.getBootedDevicesDetailed("android",o);if(o?.signal?.throwIfAborted(),!d.succeededPlatforms.has("android"))throw new Gr(d.discoveryErrors?.android);return d.devices}getReadinessScan(o,d){return d?.getConnectedPlatforms?d.getConnectedPlatforms():this.dependencies.detectConnectedPlatformsWithStatus(d?.signal,{platform:o})}reconcileReadinessPin(o,d){let c=this.dependencies.selection.getPin(d?.connectionId);if(c&&C0(o,c)&&!o.devices.some((b)=>b.deviceId===c.deviceId&&b.platform===c.platform))this.dependencies.clearExplicitDevicePin(c.deviceId)}resolveReadinessPlatform(o,d,c,{providedDeviceId:b,...R}={}){let P=[],C;switch(o){case"android":P=d,C="android";break;case"ios":P=c,C="ios";break;default:if(d.length>0&&c.length>0)return this.resolveMixedReadinessPlatform(d,c,b,R);if(d.length>0)P=d,C="android";else if(c.length>0)P=c,C="ios";else P=[],C="android"}return{platformDevices:P,resolvedPlatform:C}}resolveMixedReadinessPlatform(o,d,c,b){if(c){let D=[...o,...d].find((k)=>k.deviceId===c);if(D)return{platformDevices:D.platform==="android"?o:d,resolvedPlatform:D.platform}}let R=this.dependencies.selection.getPin(b?.connectionId),P=R&&dr(R.platform)?R.platform:void 0;if(P)return{platformDevices:P==="android"?o:d,resolvedPlatform:P};throw new Rm(pl([...o,...d]),[...o,...d])}async findLiveAndroidDevice(o){return(await this.dependencies.deviceUtils.getBootedDevices("android")).find((d)=>d.deviceId===o)}async resolveCurrentAndroidIdentity(o){try{let d=await this.findLiveAndroidDevice(o);return d&&!Cn(d)?d.name:void 0}catch(d){e.warn(`[DeviceReadiness] Could not resolve the live identity of ${o} for the retired-transport check: ${r(d)}`,d);return}}async resolveAndroidReadinessIdentity(o,d){if(!Cn(o))return o;d?.throwIfAborted();let c;try{c=await this.findLiveAndroidDevice(o.deviceId)}catch(b){return d?.throwIfAborted(),e.warn(`[DeviceReadiness] Could not resolve the AVD identity for ${o.deviceId}; keeping the raw serial identity: ${r(b)}`,b),o}return c&&!Cn(c)?c:o}async resolveProvidedReadinessId(o){if(!o)return;return await cl(o,{currentIdentity:()=>this.resolveCurrentAndroidIdentity(o)}),this.canonicalAndroidId(o)}canonicalAndroidId(o){return this.dependencies.admissionGate.resolveAndroidCanonicalId?.(o)??o}mapAndroidReadinessRows(o){return this.dependencies.admissionGate.mapAndroidReadinessDiscovery?.(o)??o}normalizeReadinessScan(o){return Array.isArray(o)?{devices:o,scanned:{android:!0,ios:!0,watchos:!1,tvos:!1,visionos:!1}}:o}}function vo(o){if(o.present&&!o.usable)throw new t(`AUTOMOBILE_CTRL_PROXY_IOS_BUNDLE_PATH / _IPA_PATH is set but unusable: ${o.reason}`)}function Ih(o,d){return d?.deviceId===o.deviceId?{...o,name:d.name,...d.observedAt===void 0?{}:{observedAt:d.observedAt}}:o}function kh(o,d){if(!d||!d.appId||!d.activityName){if(e.warn(`[DeviceReadiness] Android device ${o} is not fully ready`),d)e.warn(`[DeviceReadiness] activeWindow.appId: ${d.appId} | activeWindow.activityName: ${d.activityName}`);else e.warn(`[DeviceReadiness] activeWindow: ${d}`);throw new t(`Cannot get active window information from Android device ${o}. The device may not be fully booted or is in an unusual state.`)}}function fl(o,d){if(!d)throw new t(`iOS simulator ${o} is not available. Please check if it exists and is available.`);if(!d.isAvailable)throw new t(`iOS simulator ${o} is not available (state: ${d.state}). Please check simulator availability.`)}async function Bh(o,d){try{return!await o.create(d).isScreenOn()}catch(c){return e.warn(`[DeviceReadiness] Could not read screen state of ${d.deviceId}`,c),!1}}async function gl(o,d,c,b){let{deviceId:R}=d;try{e.info(`[DeviceReadiness] Verifying Android device ${R} readiness`);let P=o.getWindow(Ih(d,c));kh(R,await P.getActive(!0))}catch(P){if(!(b?.readiness==="booted"&&await Bh(o.adbFactory,d)))throw new t(`Failed to verify Android device ${R} readiness: ${r(P)}`);e.info(`[DeviceReadiness] Android device ${R} is asleep; booted readiness holds`)}}class Kc{selection=new Yn;admissionGate;executionBinding;readinessSelection;provider;adbFactory;runnerReadinessService;runnerReadinessTimer;bindingExclusion;physicalIosScanBudgetMs;runnerReadinessTimeoutMs;runnerProvisionTimeoutMs;lifecycleCoordinator;_adb;idGenerator;iosBootInstrumentationInstance;appearanceOnConnectDependencies;static pushUpdateListenersRegistered=new WeakSet;constructor(o,d=v,c={}){this.admissionGate=c.admissionGate??$s,this.executionBinding=c.executionBinding??rb,this.provider=o,this.androidCtrlProxyReadiness=new uo({provider:o,checkedAndroidOwnership:this.checkedAndroidOwnership,errors:{DeviceOwnedByOtherDaemonError:Yt,CtrlProxyForwardOwnershipUnreadableError:Op},storeSetupTiming:E0}),this.adbFactory=d,this.runnerReadinessTimer=c.runnerReadinessTimer??i,this.bindingExclusion=c.bindingExclusion??BA(this.runnerReadinessTimer),this.physicalIosScanBudgetMs=c.physicalIosScanBudgetMs??E$,this.idGenerator=c.idGenerator??B,this.iosBootInstrumentationInstance=c.iosBootInstrumentation,this.appearanceOnConnectDependencies=c.appearanceOnConnectDependencies,this.runnerReadinessTimeoutMs=c.runnerReadinessTimeoutMs,this.runnerProvisionTimeoutMs=c.runnerProvisionTimeoutMs,this.lifecycleCoordinator=c.lifecycleCoordinator??Gs(),this.runnerReadinessService=new DL({timer:this.runnerReadinessTimer,getAndroidManager:(R)=>this.provider.getAndroidCtrlProxyManager(R),getAndroidClient:(R)=>this.provider.getAndroidCtrlProxyClient(R),getIosManager:(R)=>this.provider.getIOSCtrlProxyManager(R),getIosClient:(R,P)=>this.provider.getIOSCtrlProxyClient(R,P),checkIosOverride:xb,awaitIosStartupMaintenance:()=>ve.awaitStartupOrphanRunnerReap()});let b=this;this.readinessSelection=new yo({detectConnectedPlatformsWithStatus:(...R)=>this.detectConnectedPlatformsWithStatus(...R),findProvidedReadinessImage:(...R)=>this.findProvidedReadinessImage(...R),get adb(){return b.adb},get simctl(){return b.simctl},provider:this.provider,runnerReadinessTimer:this.runnerReadinessTimer,physicalIosScanBudgetMs:this.physicalIosScanBudgetMs,selection:this.selection,withLifecycleStart:(...R)=>this.withLifecycleStart(...R),verifyDevice:(...R)=>this.verifyDevice(...R),applyAppearanceOnConnect:(R,P)=>Kd(R,this.appearanceOnConnectDependencies,u_(P)),resumeAfterDeviceStart:(R,P)=>GS.resumeAfterDeviceStart(R,P),resumeReadBootClient:(R,P)=>{if(!dr(R))return;({android:E,ios:x})[R].resumeAfterDeviceStart(P)},adbFactory:this.adbFactory,checkedAndroidOwnership:this.checkedAndroidOwnership,findOrStartDevice:(...R)=>this.findOrStartDevice(...R),get deviceUtils(){return b.deviceUtils},bootAndroidReadinessImage:(...R)=>this.bootAndroidReadinessImage(...R),clearExplicitDevicePin:(...R)=>this.clearExplicitDevicePin(...R),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 o=yh();this.iosBootInstrumentationInstance=d_({timer:i,history:o.iosBootHistory,gate:o.ios})}return this.iosBootInstrumentationInstance}async bootIosSimulatorAdmitted(o,d,c,{signal:b,reason:R="restart"}){return await this.iosBootInstrumentation.run({udid:c,reason:R,runtime:d.runtimeId,timeoutMs:Ve,signal:b},async()=>await H(b,async()=>await o.bootSimulator(c)))}get androidEmulator(){return this.provider.getAndroidEmulator()}get deviceUtils(){return this.provider.getDeviceUtils()}static createInstance(o=fo(),d,c){return new Kc(o,d,c)}getPlatformDeviceManager(){return this.deviceUtils}getExplicitDevicePin(o){return this.selection.getPin(o)}setExplicitDevicePin(o,d){this.selection.setPin(o,d)}clearConnectionDevicePin(o){this.selection.clearConnection(o)}clearExplicitDevicePin(o){this.selection.clearPinFor(o)}async detectConnectedPlatforms(o){return(await this.detectConnectedPlatformsWithStatus(o)).devices}detectConnectedPlatformsWithStatus(o,d){return this.readinessSelection.detectConnectedPlatformsWithStatus(o,d)}listBootedAndroidDevices(o){return this.readinessSelection.listBootedAndroidDevicesForSelection({...o,bypassAndroidDeviceListCache:!0})}verifyAndroidCtrlProxyServiceReady(o,d){let c=()=>this.provider.getAndroidCtrlProxyClient(o).verifyServiceReady(d?.noRetry?1:2,200,d?.timeoutMs??2000);return d?.signal?H(d.signal,c):c()}async readAndroidCtrlProxySnapshotIdentity(o,d){d.throwIfAborted();let c=this.provider.getAndroidCtrlProxyManager(o);if(!c.readSnapshotIdentity)throw new t("Android snapshot CtrlProxy identity provider is unavailable");return c.readSnapshotIdentity(d)}checkedAndroidOwnership=new Oh;androidCtrlProxyReadiness;async ensureDeviceReady(o,d,c){return this.checkedAndroidOwnership.run(new Set,()=>this.readinessSelection.ensureDeviceReadyInCall(o,d,c))}assertCreatedIosReservation(o,d){if(!o||!d.deviceId)throw new t(`Created iOS simulator '${d.name}' has no lifecycle reservation.`)}findProvidedReadinessImage(o,d,c,b){return this.readinessSelection.findProvidedReadinessImage(o,d,c,b)}async verifyDevice(o,d,c,b){switch(re(d,"Device readiness verification")){case"android":await this.verifyAndroidDevice(o,c,b);return;case"ios":await this.verifyIosDevice(o,c)}}async verifyAndroidDevice(o,d,c){d?.signal?.throwIfAborted(),o=this.readinessSelection.canonicalAndroidId(o),this.admissionGate.assertDeviceActionable(o,"to verify Android device readiness"),this.executionBinding.bindDeviceExecution(o);let b=this.readinessSelection.mapAndroidReadinessRows(await this.adb.getBootedAndroidDevices()),R=b.find((P)=>P.deviceId===o);if(!R)throw new t(`Android device ${o} is not connected. Available devices: ${to(b)}`);if(await gl({getWindow:(P)=>this.provider.getWindow(P),adbFactory:this.adbFactory},R,c,d),d?.signal?.throwIfAborted(),d?.readiness==="booted")return;await iy(po("android",o),()=>this.androidCtrlProxyReadiness.ensureReady(o,R,d),{signal:d?.signal})}async verifyIosDevice(o,d){if(d?.signal?.throwIfAborted(),En(o))return await this.verifyPhysicalIosDevice(o,d?.readiness??"automationReady",d);return await this.verifySimulatorIosDevice(o,d)}async verifySimulatorIosDevice(o,d){let c=d?.readiness??"automationReady";if(c==="automationReady"){let P=await xb();vo(P)}if(!this.simctl)throw new t("iOS simulator tools not available");let b=await this.simctl.getDeviceInfo(o);if(d?.signal?.throwIfAborted(),fl(o,b),b.state!=="Booted"){if(d?.intent==="read")throw new t(Bt(b.name,o,b.state));e.info(`iOS simulator ${o} is not booted (state: ${b.state})`);return}if(c==="booted")return;let R={deviceId:o,name:b.name,platform:"ios"};await this.ensureIosRunnerReady(o,R,d)}async verifyPhysicalIosDevice(o,d,c){let b=await this.findConnectedPhysicalIosDevice(o,c?.signal);if(d==="automationReady"&&!c?.sessionId)throw new t(`Physical iPhone ${o} is connected but has no prepared CtrlProxy runner. Acquire the iPhone with getApple first; signed-runner setup cannot run on a sessionless call.`);if(d==="booted")return;vo(await xb()),await this.ensureIosRunnerReady(o,b,c)}async findConnectedPhysicalIosDevice(o,d){let c=await this.provider.getIosPhysicalDeviceLister?.()?.listConnectedDevices();d?.throwIfAborted();let b=c?.devices.find((P)=>P.deviceId===o);if(b)return b;let R=c&&!c.complete?` (devicectl: ${c.error.message})`:"";throw new t(`Physical iPhone ${o} is not connected or not reachable through devicectl${R}. Connect, unlock, and trust the device, then acquire it with getApple.`)}async ensureIosRunnerReady(o,d,c){let b=qa(!0);b.serial("ensureCtrlProxy iOS");let R=!1,P=this.runnerReadinessTimeoutMs??N.getRunnerReadinessTimeoutMs(),C=this.runnerProvisionTimeoutMs??ga;try{let D=this.runnerReadinessTimer.now()+Math.max(C,P);await this.runnerReadinessService.ensureReady({device:d,requestedIdentity:`platform=ios deviceId=${o}`,operationName:"legacy iOS session auto-start",totalDeadlineMs:D,readinessTimeoutMs:P,skipCtrlProxyDownload:this.androidCtrlProxyReadiness.skipCtrlProxyDownload(c),perf:b,signal:c?.signal,onRunnerSetup:()=>{R=!0}}),this.registerPushUpdateListener(d)}finally{if(b.end(),R){let D=b.getTimings();if(D)E0(o,D,c?.sessionId)}}}async findOrStartDevice(o,d){if(o==="android")return await this.findOrStartAndroidDevice(d);else return await this.findOrStartIosDevice(d)}async findOrStartAndroidDevice(o){let d=J();d.startOperation("listBootedDevices");let c=await this.readinessSelection.listBootedAndroidDevicesForSelection();if(d.endOperation("listBootedDevices"),c.length>0){let P=c[0],C=P.deviceId;return await this.withLifecycleStart(Mt(P),o,async(D)=>(E.resumeAfterDeviceStart(C),d.startOperation("verifyDevice"),await this.verifyAndroidDevice(C,{...o,signal:D},P),d.endOperation("verifyDevice"),P))}d.startOperation("listImages");let b=await this.deviceUtils.listDeviceImages("android");if(d.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 R=await lo(b,this.bindingExclusion);return await this.bootAndroidReadinessImage(R,o,d)}async bootAndroidReadinessImage(o,d,c=J()){return Qg(o),e.info(`Starting Android emulator ${o}...`),await this.withLifecycleStart({platform:"android",stableId:o.name},d,async(b,R)=>{if(d?.beforeReadBoot)await d.beforeReadBoot(o),b.throwIfAborted();let P=await this.readinessSelection.recheckReadBootImage(o,{...d,signal:b});if(P)return P;dl(o,d,R.lease),c.startOperation("startDevice");let C=await H(b,async()=>await this.startDeviceOwningCancelledLaunch(o,R)),D=C?vd(C):void 0;c.endOperation("startDevice"),c.startOperation("waitForReady");let k=await Pf(this.deviceUtils,o,C,{signal:b,timer:this.runnerReadinessTimer,cancelOwnedBoot:D?async()=>await un(D.process,D.exitPromise,{signal:"SIGTERM",timer:this.runnerReadinessTimer}):void 0});if(c.endOperation("waitForReady"),!k)throw new t(`Failed to start Android emulator ${o}.`);if(d?.intent==="read")await d.beforeReadReadiness?.(k),b.throwIfAborted();return E.resumeAfterDeviceStart(k.deviceId),c.startOperation("verifyDevice"),await this.verifyAndroidDevice(k.deviceId,{...d,signal:b},k),c.endOperation("verifyDevice"),k})}async bindCreatedIosReadinessIdentity(o,d){if(!o||!d.deviceId)throw new t(`Created iOS simulator '${d.name}' has no lifecycle identity.`);let c=d.deviceId;await o.bindCanonicalIdentity({platform:"ios",stableId:c},async()=>this.revalidateCreatedIosDevice(c))}async rollBackCreatedIosOnFailure(o,d){try{return await d()}catch(c){let b=o();if(b)await this.rollBackCreatedIosSimulator(b,c);throw c}}async rollBackCreatedIosSimulator(o,d){return Yd({simctl:()=>this.simctl,provider:this.provider,runnerReadinessTimer:this.runnerReadinessTimer},o,d)}async findOrStartIosDevice(o){if(!this.simctl)throw new t("iOS simulator tools not available");let d=J();d.startOperation("listSimulators");let c=await this.simctl.listSimulatorImages();d.endOperation("listSimulators");let b=c.filter((D)=>D.isAvailable===!1),R=c.filter((D)=>D.isAvailable!==!1).sort((D,k)=>(D.deviceId||"").localeCompare(k.deviceId||""));if(R.length===0){let D=Mw();if(D.isCreationAllowed()){e.info(`[DeviceReadiness] No available iOS simulators found; creating one (gate: ${D.describeSource()})`);let k=this.runnerReadinessTimer.now()+300000,O,F;try{let q=Fw(()=>this.simctl,{reserveBeforeCreate:async(U)=>(O=await this.lifecycleCoordinator.reserve({kind:"selector",platform:"ios",selector:U.name},{operation:"start",deadlineMs:k,signal:o?.signal}),O.signal),bindAfterCreate:async(U)=>{F=U,await this.bindCreatedIosReadinessIdentity(O,U)}},cv(()=>this.simctl)),{provisioned:M,lease:W}=await this.rollBackCreatedIosOnFailure(()=>F,async()=>{let U=await q.provision({platform:"ios"},o?.signal);return this.assertCreatedIosReservation(O,U),{provisioned:U,lease:O}});return await go(W,o,async(U)=>{d.startOperation("bootSimulator");let X=await this.bootIosSimulatorAdmitted(this.simctl,M,M.deviceId,{signal:U,reason:"create"});if(d.endOperation("bootSimulator"),X.deviceId===M.deviceId)await this.simctl.presentSimulatorAfterStart(M.deviceId,this.idGenerator.next(),U);return x.resumeAfterDeviceStart(M.deviceId),d.startOperation("verifyDevice"),await this.verifyIosDevice(M.deviceId,{...o,signal:U}),d.endOperation("verifyDevice"),X}).catch(async(U)=>{throw await this.rollBackCreatedIosSimulator(M,U),u(U,`Failed to boot/verify created iOS simulator '${M.name}' (${M.deviceId})`)})}finally{O?.release()}}if(b.length>0){let k=b.map((O)=>`${O.name} (${O.deviceId??"unknown ID"}): ${O.availabilityError??"unavailable"}`).join("; ");throw new t(`No available iOS simulators. Unavailable simulators: ${k}.`)}throw new t("No iOS simulators are available. Please create an iOS simulator using Xcode or the Simulator app.")}d.startOperation("checkBooted");let P=await this.listBootedSimulatorsForSelection();if(d.endOperation("checkBooted"),P.sort((D,k)=>D.deviceId.localeCompare(k.deviceId)),P.length>0){let D=P[0];return e.info(`[DeviceReadiness] Selected booted iOS simulator ${D.name} (${D.deviceId})`),await this.withLifecycleStart({platform:"ios",stableId:D.deviceId},o,async(k)=>(x.resumeAfterDeviceStart(D.deviceId),d.startOperation("verifyDevice"),await this.verifyIosDevice(D.deviceId,{...o,signal:k}),d.endOperation("verifyDevice"),D))}let C=await lo(R,this.bindingExclusion);return await this.bootIosReadinessImage(C,o,d)}async bootIosReadinessImage(o,d,c=J()){let b=o.deviceId;if(d?.intent==="read")throw new t(Bt(o.name,b));return e.info(`[DeviceReadiness] Booting iOS simulator ${o.name} (${b})...`),await this.withLifecycleStart({platform:"ios",stableId:b},d,async(R)=>{c.startOperation("bootSimulator");let P=await this.bootIosSimulatorAdmitted(this.simctl,o,b,{signal:R});if(c.endOperation("bootSimulator"),P.deviceId===b)await this.simctl.presentSimulatorAfterStart(b,this.idGenerator.next(),R);return x.resumeAfterDeviceStart(b),c.startOperation("verifyDevice"),await this.verifyIosDevice(b,{...d,signal:R}),c.endOperation("verifyDevice"),P})}async listBootedSimulatorsForSelection(){try{return await this.simctl.getBootedSimulatorsChecked()}catch(o){throw new ze("ios",{code:"failed",message:r(o),retryable:!0})}}async revalidateCreatedIosDevice(o){if(!(await this.simctl.listSimulatorImages()).find((b)=>b.deviceId===o))throw new t(`Created iOS simulator '${o}' disappeared during lifecycle wait`);return{platform:"ios",stableId:o}}async withLifecycleStart(o,d,c){let b=await this.lifecycleCoordinator.reserve("kind"in o?o:{kind:"stable",...o},{operation:"start",deadlineMs:this.runnerReadinessTimer.now()+300000,signal:d?.signal}),R=[];try{return await go(b,d,(P)=>c(P,{lease:b,holdLeaseUntil:(C)=>{R.push(C)}}))}finally{if(R.length===0)b.release();else Promise.allSettled(R).then(()=>b.release())}}async startDeviceOwningCancelledLaunch(o,d){return al({deviceUtils:()=>this.deviceUtils,runnerReadinessTimer:this.runnerReadinessTimer},o,d)}registerPushUpdateListener(o){let d=o.deviceId;try{let c=this.provider.getIOSCtrlProxyManager(o),b=this.provider.getIOSCtrlProxyClient(o,c.getServicePort());if(Kc.pushUpdateListenersRegistered.has(b))return;let R=this.provider.getObserveScreenCache();b.onPushUpdate(()=>{e.info(`[DeviceReadiness] Received iOS UI change notification for ${d}, clearing ObserveScreen cache`),R.clearForDevice(d)}),Kc.pushUpdateListenersRegistered.add(b),e.info(`[DeviceReadiness] Registered push update listener for ${d}`)}catch(c){e.warn(`[DeviceReadiness] Failed to register push update listener for ${d}: ${c}`)}}}var G=(o)=>({budgetMs:o,mayWriteDatabase:!0}),dt=(o)=>({budgetMs:o,mayWriteDatabase:!1}),t5={"provisioning ingress quiesce":G(1050),"provisioning interruption":G(300),"shutdown release snapshot":G(50),"forward lease idle releaser":G(200),"managed execution release":G(200),"active capture and iOS CtrlProxy children":G(500),"health check timer":G(50),"location routes":G(50),"prototype preview server":G(25),"shutdown monitors":G(150),"ADB missing-device subscription":G(25),"session cleanup timer":G(25),"video recording socket server":G(30),"device gesture recording socket server":G(30),"device snapshot socket server":G(30),"appearance socket server":G(30),"performance stream socket server":G(30),"performance push socket server":G(30),"device data stream socket server":G(30),"failures stream socket server":G(30),"failures push socket server":G(30),"telemetry push socket server":G(30),"WebRTC stream socket server":G(200),"video stream socket server":dt(200),"iOS simulator capture helper pool":dt(150),"native helper registry":dt(10),"host adb children":dt(10),"appearance sync scheduler":G(25),"performance monitor":G(25),"active HTTP sessions":G(150),"active HTTP session registry":G(25),"HTTP server":G(100),"active device sessions":G(1500),"Unix socket server":G(1100),"pending device cleanups":G(300),"CtrlProxy forwarding leases":G(400),"device allocation claims":G(100),"managed ADB server":dt(300),"abandoned stage settle":G(50),"database write drain":G(200),"in-flight migrations":G(200),database:G(300),"late abandoned stage settle":G(25),logger:G(100),"daemon files":G(100)},WB=yl(t5);var hl={"direct-mode capture and iOS CtrlProxy children":G(2000),"direct-mode managed ADB server":dt(300),"video recording socket server":G(30),"device gesture recording socket server":G(30),"device snapshot socket server":G(30),"appearance socket server":G(30),"WebRTC stream socket server":G(200),"appearance sync scheduler":G(25),"prefetched Android CtrlProxy APK":G(50),"stdio proxy":G(2000),"abandoned stage settle":G(2955),"database write drain":G(200),"in-flight migrations":G(200),database:G(300),"late abandoned stage settle":G(25),logger:G(100)},VB=yl(hl);function yl(o){let d={};for(let c of Object.keys(o))d[c]=o[c].budgetMs;return d}function r5(o,d,c,b){return{name:d,waitingOn:c,...o[d],run:b}}var Mh=50;function ol(o,d){return Math.max(0,Math.min(d,o.remainingMs()-Mh))}var Nh=100;function n5(o){let d=!1,c=async(P)=>{d=!1;let C=o.keepOpenReason?.();if(C!==void 0){o.warn(`Skipping database close because ${C}`);return}let D=P.unsettledDatabaseWriters();if(D.length>0){d=!0,o.warn(`Skipping database close because abandoned shutdown stage(s) are still running: ${D.join(", ")}`);return}await o.closeDatabase()},b=async(P)=>{if(P.unsettledStages().length===0&&!d)return;let C=d?Nh:0;if(await P.waitForUnsettledStages(Math.max(0,ol(P,Number.POSITIVE_INFINITY)-C)),!d||P.unsettledDatabaseWriters().length>0)return;await o.drainWrites(ol(P,Number.POSITIVE_INFINITY)),await c(P)},R=async(P)=>{let C=await o.refusedAccessCount?.()??0;if(C===0)return;o.warn(`Refused ${C} database access(es) issued after the shutdown database close; `+(P.length>0?`abandoned shutdown stage(s) running since the close: ${P.join(", ")}`:"no abandoned shutdown stage was running (an in-flight request or a late timer callback)"))};return{settle:async(P)=>{let C=ol(P,Number.POSITIVE_INFINITY);if(!await P.waitForUnsettledStages(C))o.warn(`Shutdown stage(s) still running ${C}ms after being abandoned: ${P.unsettledStages().join(", ")}`)},close:c,lateSettle:async(P)=>{let C=P.unsettledStages();try{await b(P)}finally{try{await R(C)}catch(D){try{o.warn(`Failed to report database accesses refused after shutdown: ${r(D)}`)}catch(k){eo("Reporting refused database accesses after shutdown failed",k)}}}}}}var Fh={remainingMs:()=>Number.POSITIVE_INFINITY,unsettledStages:()=>[],unsettledDatabaseWriters:()=>[],waitForUnsettledStages:async()=>!0};async function v_(o,d,c){let b=[],R=new Map,P=()=>[...R.values()].map((q)=>q.name),C=!1,D=()=>c?c.timer.monotonicNow?.()??c.timer.now():0,k=D(),O=0,F=(q,M)=>{let W=C?`Shutdown cleanup stage ${q} failed after shutdown finished`:`Shutdown cleanup stage ${q} failed after being abandoned at its deadline`;try{d(W,M)}catch(U){let X=c?.emergencyLog??eo;X(W,M),X(`Reporting the late failure of shutdown stage ${q} failed`,U)}};for(let q of o){if(!c||q.budgetMs===void 0){try{await q.run(Fh)}catch(ce){b.push(ce),d(`Shutdown cleanup stage ${q.name} failed`,ce)}continue}let{timer:M}=c;O+=q.budgetMs;let W=k+O,U=Math.max(0,W-D()),X=Symbol("shutdown stage deadline"),z={remainingMs:()=>Math.max(0,W-D()),unsettledStages:P,unsettledDatabaseWriters:()=>[...R.values()].filter((ce)=>ce.mayWriteDatabase).map((ce)=>ce.name),waitForUnsettledStages:async(ce)=>{if(R.size===0)return!0;let Nt=Symbol("abandoned stage settle timeout");try{await l(Promise.all([...R.values()].map((ke)=>ke.settled)),{timer:M,timeoutMs:ce,label:"Abandoned shutdown stage settle",timeoutError:()=>Nt})}catch(ke){if(ke!==Nt)throw ke}return R.size===0}},we;try{await l(()=>(we=(async()=>{await q.run(z)})(),we),{timer:M,timeoutMs:U,label:`Shutdown cleanup stage ${q.name}`,timeoutError:()=>X})}catch(ce){if(ce!==X){b.push(ce),d(`Shutdown cleanup stage ${q.name} failed`,ce);continue}let Nt=(we??Promise.resolve()).then(()=>{R.delete(q)},(ke)=>{if(R.delete(q),!C)b.push(ke);F(q.name,ke)});R.set(q,{name:q.name,settled:Nt,mayWriteDatabase:q.mayWriteDatabase!==!1}),d(`Shutdown cleanup stage ${q.name} timed out after ${U}ms waiting on ${q.waitingOn??"its cleanup"}; continuing shutdown`,Error(`Shutdown cleanup stage ${q.name} exceeded its ${U}ms deadline`))}}if(C=!0,R.size>0)b.push(Error(`Shutdown cleanup stage(s) still running when shutdown finished: ${P().join(", ")}`));if(b.length>0)throw AggregateError(b,"One or more shutdown cleanup stages failed")}function UQ(o){let d=(C,D,k)=>r5(hl,C,D,k),c=(C)=>async()=>{await C()},b=(C)=>async(D)=>{if(o.directModeActive())await C(D)},R=n5({closeDatabase:()=>o.closeDatabase(),drainWrites:(C)=>o.drainDatabaseWrites(C),refusedAccessCount:async()=>o.directModeActive()?await o.refusedDatabaseAccessCount?.()??0:0,warn:(C)=>o.warn(C)}),P="its connections closing";return[d("direct-mode capture and iOS CtrlProxy children","recording stop/finalize and iOS CtrlProxy child exit",b(c(o.cleanupChildProcesses))),d("direct-mode managed ADB server","adb kill-server",b(c(o.stopManagedAdbServer))),d("video recording socket server","its connections closing",c(o.stopVideoRecordingSocketServer)),d("device gesture recording socket server","its connections closing",c(o.stopDeviceGestureRecordingSocketServer)),d("device snapshot socket server","its connections closing",c(o.stopDeviceSnapshotSocketServer)),d("appearance socket server","its connections closing",c(o.stopAppearanceSocketServer)),d("WebRTC stream socket server","WebRTC stream teardown (encoder stop, adb forward removal)",c(o.stopWebRtcStreamSocketServer)),d("appearance sync scheduler","an in-flight appearance sync",c(o.stopAppearanceSyncScheduler)),d("prefetched Android CtrlProxy APK","the prefetched APK directory removal",c(o.cleanupPrefetchedApk)),d("stdio proxy","the daemon releasing this proxy's managed execution and ordinary owned sessions",c(o.closeStdioProxy)),d("abandoned stage settle","earlier stages that passed their deadline",(C)=>R.settle(C)),d("database write drain","in-flight best-effort database writes",b((C)=>o.drainDatabaseWrites(ol(C,Number.POSITIVE_INFINITY)))),d("in-flight migrations","a cold-start migration still running",b((C)=>o.settleMigrations(ol(C,Number.POSITIVE_INFINITY)))),d("database","the database connection closing",b((C)=>R.close(C))),d("late abandoned stage settle","earlier stages that passed their deadline",(C)=>R.lateSettle(C)),d("logger","the log file flush",c(o.closeLogger))]}
|
|
165
|
+
export{tn,MA,e_,l0,NA,E4,vm,ir,t_,r_,bi,cu,ra,u0,I4,LZ,_4,BZ,_q,p0,ov,xq,Cq,$Z,UZ,Ho,lc,bm,Dq,ss,HZ,qZ,sv,m0,VZ,WZ,zZ,jZ,uc,fh,FA,Qd,Oq,jc,el,n_,na,x4,C4,Ln,f0,KZ,i_,GZ,tl,BS,$S,xa,US,rl,qo,Mq,D4,O4,Nq,YZ,M4,o_,N4,Fq,JZ,sp,s_,Lq,F4,XZ,Bq,Sm,ZZ,QZ,eQ,Ci,L4,h0,av,pc,wm,$q,tQ,Di,du,HS,Uq,Bn,qS,B4,mc,g0,Hq,qq,VS,hh,$4,WS,y0,LA,rQ,nl,BA,U4,H4,v0,nQ,iQ,oQ,gh,$A,a_,q4,fc,V4,zS,UA,Vq,b0,Wq,S0,HA,c_,w0,zq,d_,ap,lu,sQ,yh,R0,jS,jq,aQ,Ot,P0,A0,cQ,dQ,lQ,uQ,KS,pQ,T0,Rce,cv,W4,l_,qA,mQ,k0,GS,u_,p_,m_,z4,Ca,fQ,j4,dv,hQ,Kq,gQ,VA,WA,Gq,lv,E0,yQ,Yq,Jq,YS,Rm,JS,Xq,vQ,I0,So,XS,Si,uu,_0,cp,Zq,x0,C0,Kc,At,vh,K4,bh,bQ,f_,h_,G4,D0,Sh,O0,M0,g_,SQ,Qq,N0,wQ,uv,Y4,Gc,F0,RQ,PQ,Pm,J4,AQ,TQ,kQ,L0,y_,Yc,B0,$0,dp,U0,eV,EQ,H0,IQ,_Q,tV,xQ,CQ,DQ,rV,OQ,MQ,hc,NQ,X4,q0,FQ,nV,LQ,Z4,Q4,e5,iV,BQ,il,V0,$Q,t5,r5,ol,n5,v_,UQ};
|
|
166
|
+
|
|
167
|
+
//# debugId=87D43CCC165F53D064756E2164756E21
|