@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,17 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{UP,i,er,$i,Ld,Q,l,st,e}from"./chunk-r0vp315h.js";import{h}from"./chunk-5wk1t46v.js";import{$l}from"./chunk-r6pvhj33.js";import{tn,ir,t_,bi,cu,Ho,lc,HZ,qZ,uc,x4,Ln,f0,tl,BS,$S,xa,US,rl,Mq,O4,Nq,YZ,M4,JZ,sp,s_,Lq,F4,XZ,Bq,Sm,ZZ,QZ,eQ,Ci,L4,h0,av,pc,wm,$q,tQ,f_,h_,D0,J4,kQ,L0,y_,Yc,B0,$0,dp,U0}from"./chunk-8nj68t1v.js";import{yc,Ch,Dh,JA,Q0,nw,eF,Ns,Oh,S5}from"./chunk-z8tvs8nk.js";import{Ic,jv,Yw,ci,Jw,ze,ps,Ag,Bt,Sr,wz,nR,Qv,AB,ms,SD,TB,Eg,wD,RD,kp,one,Pz,EB,sR,dk,IB,cne,lk,_B,Xe,Yo,ID,sb,cb,ao,mt,zs,at,El,Yi,Il,It,ui,h$,ki,Sf,KR,Ks,wf,Vk,r9,g$,Kj,Yj,Nb,Jj,Jie,oE,yO,Fb,aE,O,E}from"./chunk-sfqe223f.js";import{Vo,gc,ro,Ms,ge,Mr,Da,G}from"./chunk-jvstjnqm.js";import{y,T,te,yr,g,ne,A,t8}from"./chunk-w5yypt53.js";import{oi,$w,HT,Sp}from"./chunk-4vxeq0vd.js";import{ni,Xd,ru,KI,GI,wq,wr,cc,mh,c0}from"./chunk-tx4f0h9c.js";import{pv,b_,Am}from"./chunk-yqfz4vts.js";import{Hc}from"./chunk-khejfph4.js";import{r,t,u}from"./chunk-2b39zyxc.js";async function EZ(s,n,o,a=G){let c=await a.cancelSessionUuidExecutions(s,n);return o(c)}function VI(s,n,o){return Ge(s,n,o,o.releaseReason)}var ae="plan-auto-release";function qs(s,n){return Ge(s,n,`Session ${n.sessionId} was released when its plan finished (${ae}) while this call was in flight; the session UUID is not terminal and may be named again`,ae)}function Ge(s,n,o,a){let{sessionId:c,baseSessionId:d,deviceId:m,excludeExecutionId:p}=n,f=[s.cancelDeviceSessionExecutions(c,o,{excludeExecutionId:p})];if(d!==void 0&&d!==c&&m)f.push(s.cancelDeviceExecutions(m,`Session ${c} was released (${a}), so device ${m} is no longer reachable through session ${d}`,{onlySessionUuid:d,excludeExecutionId:p}));return Promise.all(f).then((S)=>S.reduce((w,R)=>w+R,0))}async function _A(s,n,o,a=G){qs(a,o).catch((c)=>{e.warn(`Failed to cancel executions of plan-released session ${o.sessionId}: ${r(c)}`,c)}),await Ds({manager:s,pool:n},o.deviceId,o.sessionId,{reason:ae})}function Zy(s,n,o){return s.releaseDevice(n,o)}function VN(s){return{releaseDevice:(n,o)=>s().releaseDevice(n,o)}}async function Ds({manager:s,pool:n},o,a,c={}){let{reason:d}=c,m=o;try{if(c.release)m=await c.release();else if(d===void 0)await s.releaseSession(a);else await s.releaseSession(a,d)}catch(p){if(!c.deferFailureFallback&&o&&!s.hasSession(a))try{await n.releaseDevice(o,a)}catch(f){e.warn(`Failed to free device ${o} after session ${a} release`,f)}throw p}if(m)await n.releaseDevice(m,a)}async function uq(s,n,o){let a=s.forceStuckRelease(o);if(a)await n.releaseDevice(a.deviceId,o)}function hm(s,n){return s?.resolveAndroidCanonicalId?.(n)??n}async function WN(s,n,o,a){if(!s||n!=="android")return{devices:[...o],deviceId:a};let c=s.mapAndroidDiscovery?.(o)??[...o];if(s.normalizeAndroidDiscovery&&$s(s,c,a))c=await s.normalizeAndroidDiscovery(o,!1,()=>!0,!1);return{devices:c,deviceId:a===void 0?void 0:hm(s,a)}}function $s(s,n,o){let a=new Set((s.getAllDevices?.()??[]).map((c)=>c.id));return n.some((c)=>c.platform==="android"&&(o===void 0||c.deviceId===o)&&Yo(c.deviceId)&&!a.has(c.deviceId))}function Ye(s,n,o){return s?.androidTransportMayAliasDevice?.(n,o)!==!1}function xA(s){return s.getHeldDeviceSessions?s.getHeldDeviceSessions().map(({deviceId:n,...o})=>({...o,assignedDevice:n})):s.getAllSessions?.()??[]}async function Hs(s,n,o){let a=o.filter((d)=>d.platform==="android"),c=await s?.androidBindingHold?.(a.flatMap((d)=>d.stableDeviceId?[d.assignedDevice,d.stableDeviceId]:[d.assignedDevice]));return{sessions:a.filter((d)=>Ye(s,n,d.assignedDevice)),managed:c&&Ye(s,n)?c:void 0}}async function f4(s,n,o,a){if(o||n.platform!=="android"||s?.isAndroidTransportAssignable?.(n)!==!1)return;let c=await Hs(s,n,a);return c.sessions.length>0||c.managed?c:void 0}async function zN(s,n,o,a){let c=await f4(s,n,a.heldBySession,a.sessions);if(!c)return;let{sessions:d,managed:m}=c,p=a.requester?.()??a.requesterSessionUuid;if(!m&&d.every((f)=>El(f.sessionId,p,a.sessionManager)))throw new t(`${o} refused: Android transport '${n.deviceId}' has no proven identity, so it cannot be told apart from a device another session holds; nothing was sent. The device pool does not pool this transport either. Address the device by a transport whose serial can be read (its USB serial or emulator-NNNN id), or reconnect it and refresh devices.`);throw Us(o,n.deviceId,p,m)}function Us(s,n,o,a){if(a?.entry)return new oi(s,n,a.entry);return new mt(s,n,o,{remedy:"This transport cannot be told apart from a device another session holds; address the device by its USB serial or emulator-NNNN id. Nothing was sent."})}function h4(s,n,o={}){let a={name:n.deviceId,platform:"android",deviceId:n.deviceId},c=Xe(async()=>Jie(n,(o.clientFactory??Yj())(a),{timer:o.timer??i,forgetRememberedUnlock:o.forgetRememberedUnlock??Jj})).catch((d)=>{let m=Kj(r(d),[n.credential]);return e.warn(`[screenLock] Clearing session ${n.sessionId}'s lock threw: ${m}`),{status:"failed",deviceId:n.deviceId,type:n.type,error:m,leftover:`Device ${n.deviceId} may still have the ${n.type} lock this session set.`}});return(o.registry??Nb).noteRestore(n.sessionId,c),s.registerPendingDeviceCleanup(n.deviceId,c,{name:"clear session screen lock",leftover:"the released session's lock-screen credential"}),c}function IZ(s,n={}){let o=n.registry??Nb,a=(c,d,m)=>{let p=o.takeOwnedBy(d,c);if(!p)return;if(m?.deviceIdentityReplaced){e.info(`[screenLock] Session ${c}'s ${d} was replaced; not clearing`),o.noteRestore(c,Promise.resolve({status:"skipped",deviceId:d,type:p.type,error:"The device was replaced before its lock could be cleared."}));return}h4(s,p,n)};s.onSessionRelease((c,d,m,p)=>{if(p?.upgradeOnly)return;a(c,d,p)}),s.onSessionDeviceUnbound(a)}var Je=Symbol("screen lock report wait");async function jN(s,n={}){let o=(n.registry??Nb).restoreReport(s);if(!o)return{};return{screenLockRestore:await l(o,{timer:n.timer??i,timeoutMs:wr,unref:!0,label:"screen lock restore report",timeoutError:()=>Je}).catch((c)=>{if(c!==Je)throw c;return{status:"pending"}})}}var Qe=2,js=1000,Vs=3000;function Ze(s){return yO.includes(s)}function Ws(s,n){let o=s.baseline.battery;if(!o?.faked)return{apply:()=>n.resetBattery(),verify:async()=>!(await n.readBattery()).faked};return{apply:async()=>{await n.setBatteryCharging(o.charging),await n.setBatteryLevel(o.level)},verify:async()=>{let a=await n.readBattery();return a.level===o.level&&a.charging===o.charging}}}async function pq(s,n){if(s.screenSlept&&!await n.isScreenOn())await n.wakeScreen()}function Gs(s,n,o){let a=s.baseline.doze??"off";return{apply:async()=>{await n.unforceDoze();try{await pq(s,n)}catch(c){e.warn(`[power] Could not wake the screen before the Doze read-back: ${r(c)}`,c)}if(a!=="off")await n.forceDoze(a)},verify:async()=>(await aE(n,a,{timer:o.timer,budgetMs:Vs,backoff:o.dozeBackoff??Q({initialDelayMs:250,multiplier:2,maxDelayMs:1000}),reading:await n.readDoze()})).settled}}function Ys(s,n){let o=s.baseline.thermal;return{apply:()=>o?.override?n.overrideThermal(o.status):n.resetThermal(),verify:async()=>{let a=await n.readThermal();return o?.override?a.override&&a.status===o.status:!a.override}}}function Js(s,n){let o=s.baseline.batterySaver===!0;return{apply:()=>n.setBatterySaver(o),verify:async()=>(await n.readBatterySaver()??!1)===o}}function Qs(s,n){let o=s.baseline.dataSaver===!0;return{apply:()=>n.setDataSaver(o),verify:async()=>await n.readDataSaver()===o}}function Xs(s,n){let o=Object.entries(s.baseline.standby??{}),a=o.filter(([,d])=>!Ze(d)),c=o.filter((d)=>Ze(d[1]));return{skip:c.length===0&&a.length>0?`A shell cannot set a ${a.map(([d,m])=>`${d} (${m})`).join(", ")} bucket back.`:void 0,apply:async()=>{for(let[d,m]of c)await n.setStandbyBucket(d,m)},verify:async()=>(await Promise.all(c.map(async([m,p])=>await n.readStandbyBucket(m)===p))).every(Boolean)}}function Zs(s,n){let o=Object.entries(s.baseline.inactive??{});return{apply:async()=>{for(let[a,c]of o)await n.setInactive(a,c)},verify:async()=>(await Promise.all(o.map(async([c,d])=>await n.readInactive(c)===d))).every(Boolean)}}function en(s,n){return{apply:()=>pq(s,n),verify:()=>n.isScreenOn()}}function sn(s,n,o,a){switch(s){case"battery":return Ws(n,o);case"screen":return n.screenSlept?en(n,o):void 0;case"doze":return Gs(n,o,a);case"batterySaver":return Js(n,o);case"dataSaver":return Qs(n,o);case"thermal":return Ys(n,o);case"standby":return Xs(n,o);case"inactive":return Zs(n,o)}}async function nn(s,n,o){if(n.skip)return{field:s,status:"skipped",error:n.skip};let a="";for(let c=1;c<=Qe;c++){try{await n.apply();let d=await rn(s,n);if(d!==!1)return{field:s,status:"restored",...d===!0?{verified:!0}:{}};a="the device still differs from the value read before the session's change"}catch(d){a=r(d),e.warn(`[power] Restoring ${s} failed (attempt ${c}): ${a}`,d)}if(c<Qe)await o.timer.sleep(js)}return{field:s,status:"failed",error:a}}async function rn(s,n){try{return await n.verify()}catch(o){e.warn(`[power] Could not read back restored ${s}: ${r(o)}`,o);return}}function on(s,n){let o=s.deviceId,a={battery:"dumpsys battery reset",screen:"input keyevent KEYCODE_WAKEUP",doze:"dumpsys deviceidle unforce",batterySaver:"settings put global low_power 0",dataSaver:"cmd netpolicy set restrict-background false",thermal:"cmd thermalservice reset",standby:"am set-standby-bucket <appId> <bucket>",inactive:"am set-inactive <appId> false"};return`Device ${o} may still carry power state session ${s.sessionId} changed: `+n.map((c)=>`${c} (adb -s ${o} shell ${a[c]})`).join("; ")+". Fix it with those commands or setDeviceState power."}async function et(s,n,o){let a=[];for(let p of[...s.changed].reverse()){let f=sn(p,s,n,o);if(f)a.push(await nn(p,f,o))}let c=a.filter((p)=>p.status==="failed"),d=a.filter((p)=>p.status==="restored"),m=c.length===0?d.length>0?"restored":"skipped":d.length>0?"partial":"failed";if(c.length>0)e.warn(`[power] Session ${s.sessionId} left ${c.map((p)=>p.field).join(", ")} changed on ${s.deviceId}`);return{status:m,deviceId:s.deviceId,fields:a,...c.length>0?{leftover:on(s,c.map((p)=>p.field))}:{}}}function g4(s,n,o={}){let a={name:n.deviceId,platform:"android",deviceId:n.deviceId},c=Xe(async()=>et(n,(o.clientFactory??oE())(a),{timer:o.timer??i})).catch((d)=>{let m=r(d);return e.warn(`[power] Restoring session ${n.sessionId}'s power state threw: ${m}`,d),{status:"failed",deviceId:n.deviceId,fields:[],error:m,leftover:`Device ${n.deviceId} may still carry power state (${n.changed.join(", ")}) session ${n.sessionId} changed.`}});return(o.registry??Fb).noteRestore(n.sessionId,c),s.registerPendingDeviceCleanup(n.deviceId,c,{name:"restore session power state",leftover:"the released session's battery, Doze, standby, saver or thermal changes"}),c}function _Z(s,n={}){let o=n.registry??Fb,a=(c,d,m)=>{let p=o.takeOwnedBy(d,c);if(!p)return;if(m?.deviceIdentityReplaced){e.info(`[power] Session ${c}'s ${d} was replaced; not restoring`),o.noteRestore(c,Promise.resolve({status:"skipped",deviceId:d,fields:[],error:"The device was replaced before its power state could be restored."}));return}g4(s,p,n)};s.onSessionRelease((c,d,m,p)=>{if(p?.upgradeOnly)return;a(c,d,p)}),s.onSessionDeviceUnbound(a)}var tt=Symbol("power restore report wait");async function KN(s,n={}){let o=(n.registry??Fb).restoreReport(s);if(!o)return{};return{powerRestore:await l(o,{timer:n.timer??i,timeoutMs:wr,unref:!0,label:"power restore report",timeoutError:()=>tt}).catch((c)=>{if(c!==tt)throw c;return{status:"pending"}})}}var an=[[/junit/i,"junit"],[/\b(ide|intellij|android studio|plugin)\b/i,"ide"],[/desktop/i,"desktop"]];function ln(s){if(s.livenessPolicy==="cli-idle")return"cli";let n=s.clientName,o=n===void 0?void 0:an.find(([a])=>a.test(n));if(o)return o[1];return s.livenessOwnerToken===void 0?"unknown":"stdio-proxy"}function cn(s,n){if(Xd(s.livenessPolicy,n))return null;return mh(s)}function U(s,n,o){let a=cn(s,o);if(a===null||n===void 0)return a;return Math.max(a,wq({vetoedSince:a,latestDeadlineMs:n.latestDeadlineMs}))}function le(s,n,o,{toWall:a=(d)=>d,leasePhase:c}={}){let d=U(s,o,c);return{lastToolActivityAt:a(s.lastUsedAt),lastOwnerHeartbeatAt:s.lastOwnerHeartbeat===void 0?null:a(s.lastOwnerHeartbeat),idleReleaseAt:d===null?null:a(d),holderKind:ln(s),activeExecutions:n}}function nt(s){let n=[s.keepAwakeRestore?.status,s.screenLockRestore?.status,s.powerRestore?.status];if(n.includes("failed")||n.includes("partial"))return"failed";return n.includes("pending")?"pending":void 0}import{lstat as dn,realpath as un,rm as mn}from"fs/promises";import{resolve as lt,join as rt,basename as pn,dirname as fn}from"path";var xZ={listNames:er,lstat:dn,realpath:un,removeDirectory:(s)=>mn(s,{recursive:!0})};function ct(s){if(!uc(s.avdName))return"Not a broker-created AVD name";if(s.referencedAvdNames===null)return"Registry unavailable";if(s.referencedAvdNames.some((n)=>n.toLowerCase()===s.avdName.toLowerCase()))return"Registry references this AVD (including case aliases)";if(s.unsafeReason)return s.unsafeReason;if(s.running!==!1)return s.running?"AVD is running":"AVD liveness uncertain";return}function gn(s){let n=[],o=[],a=ct(s);for(let c of s.snapshotNames){let d=a;if(c.toLowerCase()===Am||b_(c))d="Reserved boot or broker baseline snapshot";if(d??=s.unsafeSnapshotReasons?.get(c),d)o.push({snapshotName:c,reason:d});else n.push(c)}return{deleteNames:n,keptSnapshots:o}}async function ce(s,n){let o=await n.lstat(s);if(!o.isDirectory()||o.isSymbolicLink()||await n.realpath(s)!==s)throw Error(`Not an exact real directory: ${s}`);if(!(await n.listNames(fn(s))).includes(pn(s)))throw Error(`Directory name case mismatch: ${s}`)}async function ot(s,n){pv("AVD name",s);let o=await n.filesystem.realpath(n.resolver.getAvdHome()),a=await n.resolver.resolveAvdDirectory(s),c=rt(o,`${s}.avd`);if(!a||lt(a)!==c)throw Error("AVD resolver did not find the exact owned conventional directory");await ce(c,n.filesystem);let d=rt(c,Jw);return await ce(d,n.filesystem),d}async function it(s,n){return await n.hasLiveProcess(s)||await n.findLiveEmulatorSerial(s)!==null}function hn(s,n){let o=new Map;for(let a of s)try{pv("snapshot name",a)}catch(c){let d=r(c);n.warn(`[AvdSnapshotCleanup] Keeping invalid snapshot name: ${d}`,c),o.set(a,d)}return o}async function Sn(s,n,o,a){let c={avdName:s,deletedSnapshotNames:[],keptSnapshots:[],...o?{error:o}:{}},d=a.log??e,m=[];try{let p=await ot(s,a);m=await a.filesystem.listNames(p);let S=ct({avdName:s,snapshotNames:m,referencedAvdNames:n,running:!1})?null:await it(s,a.liveness),w=hn(m,d);if(w.size>0)c.error=[...w.values()].join("; ");let R=gn({avdName:s,snapshotNames:m,referencedAvdNames:n,running:S,unsafeSnapshotReasons:w});c.keptSnapshots=R.keptSnapshots;for(let v of R.keptSnapshots)d.warn(`[AvdSnapshotCleanup] Keeping ${s}/${v.snapshotName}: ${v.reason}`);for(let v of R.deleteNames){if(await ot(s,a)!==p||await it(s,a.liveness))throw Error("AVD directory changed or AVD started before deletion");pv("snapshot name",v);let k=lt(p,v);if(!Hc(p,k,{allowEqual:!1}))throw Error("Snapshot path escapes the snapshots root");await ce(k,a.filesystem),await a.filesystem.listNames(k),await a.filesystem.removeDirectory(k),c.deletedSnapshotNames.push(v)}}catch(p){let f=r(p);d.warn(`[AvdSnapshotCleanup] Keeping remaining snapshots for ${s}: ${f}`,p),c.error=o?`${o}; ${f}`:f;let S=new Set([...c.deletedSnapshotNames,...c.keptSnapshots.map((w)=>w.snapshotName)]);c.keptSnapshots.push(...m.filter((w)=>!S.has(w)).map((w)=>({snapshotName:w,reason:f})))}return c}async function dt(s,n){let o=null,a;try{if(!n.registry)throw Error("Registry unavailable");o=await n.registry.listReferencedAvdNames()}catch(d){a=r(d),(n.log??e).warn(`[AvdSnapshotCleanup] Keeping all snapshots: ${a}`,d)}let c=[];for(let d of new Set(s))c.push(await Sn(d,o,a,n));return c}class x extends t{code="session_broker_maintenance";retryable=!0;retryAfterMs=tl;constructor(){super("Session broker snapshot maintenance is running; retry shortly");this.name="SessionBrokerMaintenanceError"}}function de(s,n){let o=Promise.resolve().then(n).finally(()=>s.delete(o));return s.add(o),o}class ue{broker;running=!1;activeRun;constructor(s){this.broker=s}get inProgress(){return this.running}async run(s){if(this.broker.isStopping())throw new rl;if(this.running)throw new x;this.running=!0;let n=this.runAfterPreparations(s);return this.activeRun=n,n}async join(){await Promise.allSettled(this.activeRun?[this.activeRun]:[])}async runAfterPreparations(s){try{if(await Promise.allSettled([...this.broker.preparations(),...this.broker.poolOperations()]),this.broker.isStopping())throw new rl;return await s()}finally{this.running=!1,this.activeRun=void 0}}}function ut(s,n){if(s.platform!=="android"||n.platform!=="android")return(d)=>Mq(s,f0(d)).kind==="match";let o=s.effective.hardware;if(o.kind==="archetype"&&o.archetype==="foldable")US(Nq(s,n));let a=YZ(s,n),c=a.ok?a.value:void 0;return(d)=>{let m=f0(d);return Mq(s,m).kind==="match"&&m.platform==="android"&&m.memoryMb===c}}function J(s){return s.device.platform==="android"?s.device.deviceProfile:void 0}function pt(s){if(!s?.requires?.length)return;let n=Sp[s.manufacturerProfile],o=s.requires.filter((a)=>n.nonEmulatable.includes(a));if(o.length===0)return;throw new xa({code:"requires_real_device",message:`Manufacturer profile ${n.id} cannot emulate ${o.join(", ")} (${o.map((a)=>HT[a]).join(" ")}); run this task on a real ${n.displayName} device.`,retryable:!1})}async function ft(s,n,{fingerprint:o,signal:a,exportIdentity:c}){if(a.throwIfAborted(),n.device.platform==="watchos")return JZ(s,n,{fingerprint:o,signal:a,exportIdentity:c});let d=await s.catalog(n.device.platform,a),m=s.defaults(n.device.platform),p=US(O4(n.device,m,d));return pt(J(n)),{requestId:n.requestId,fingerprint:o,parameters:n,owner:s.owner,export:c,limits:s.limits,matches:ut(p,m),resolveCreation:()=>US(M4(p,m,d))}}class me{concurrency;waitMs;timer;inFlight=new Map;stopping=new AbortController;constructor(s=4,n=5000,o=i){this.concurrency=s;this.waitMs=n;this.timer=o;if(!Number.isSafeInteger(s)||s<1)throw new t("Recovery cleanup concurrency must be a positive integer");if(!Number.isFinite(n)||n<=0)throw new t("Recovery cleanup wait must be positive and finite")}async run(s){let n=new Set,o=0;while(!this.stopping.signal.aborted){while(o<s.length&&this.inFlight.size<this.concurrency){let a=s[o++];if(!this.inFlight.has(a.resourceId)){let c=this.start(a).then(()=>{n.delete(c)});n.add(c)}}if(n.size===0){let a=s.slice(o).filter((c)=>!this.inFlight.has(c.resourceId));if(a.length>0&&this.inFlight.size>=this.concurrency)e.warn(`recovery cleanup slots saturated, ${a.length} items deferred`);return}await l([...n],{timer:this.timer,label:"Recovery cleanup slot"})}}stop(){this.stopping.abort(new t("Session broker cleanup is stopping"))}async join(){await Promise.allSettled([...this.inFlight.values()])}async start(s){let n=this.stopping.signal,o=Promise.resolve().then(async()=>{n.throwIfAborted(),await s.run(n)}).catch((c)=>{e.warn(`Session resource ${s.resourceId} recovery cleanup remains pending: ${r(c)}`,c)}).finally(()=>{this.inFlight.delete(s.resourceId)});this.inFlight.set(s.resourceId,o);let a=new t("Recovery cleanup pass wait elapsed");try{await l(o,{timer:this.timer,timeoutMs:this.waitMs,signal:n,label:`Session resource ${s.resourceId} recovery cleanup`,timeoutError:()=>a})}catch(c){if(c===a){e.debug(`Session resource ${s.resourceId} cleanup wait ended: ${r(c)}`,c);return}e.warn(`Session resource ${s.resourceId} cleanup wait ended: ${r(c)}`,c)}}}class X extends t{constructor(s,n){super(`Session request ${s} committed its session, but its receipt could not be read (${r(n)}); replay the same request ID to recover it`,{cause:n})}}class pe{store;devices;destroys=new Map;drains=new Set;constructor(s,n){this.store=s;this.devices=n}async destroy(s,n){if(await this.devices.destroy(s,n)!=="absent")return!1;return n?.throwIfAborted(),this.store.confirmDestroyed(pc(s))}tryCleanup(s,n){let o=this.destroys.get(s.resourceId);if(o)return o;let a=this.cleanupOnce(s,n).finally(()=>{this.destroys.delete(s.resourceId)});return this.destroys.set(s.resourceId,a),a}async joinAll(){while(this.drains.size>0||this.destroys.size>0)await Promise.allSettled([...this.drains,...this.destroys.values()])}drainIdlePool(){return this.trackedDrain(()=>this.store.drainIdle())}expireIdle(s){return this.trackedDrain(()=>this.store.drainIdle(s))}trackedDrain(s){let n=this.drainOnce(s).finally(()=>{this.drains.delete(n)});return this.drains.add(n),n}async drainOnce(s){let n=[];for(let o of await s()){await this.tryCleanup(o);let a=await this.store.getResource(o.resourceId),c=!a||a.state==="destroyed";n.push({resourceId:o.resourceId,outcome:c?"destroyed":"cleanup_pending",cleanupPending:!c})}return{resources:n}}async cleanupOnce(s,n){let o=await this.store.getResource(s.resourceId);if(o?.state==="destroying"&&o.revision===s.revision)try{n?.throwIfAborted(),await this.destroy(o,n)}catch(a){e.warn(`Session resource ${o.resourceId} cleanup remains pending: ${r(a)}`)}}}class fe{ttlMs;store;destructions;now;observed=new Map;constructor(s,n,o,a){this.ttlMs=s;this.store=n;this.destructions=o;this.now=a}get enabled(){return this.ttlMs.ios!==void 0||this.ttlMs.android!==void 0}async sweep(){if(!this.enabled)return{resources:[]};let s=this.now(),n=(await this.store.listLiveResources()).filter((d)=>d.state==="idle"),o=[],a=new Set;for(let d of n){let m=this.ttlFor(d);if(m===void 0)continue;a.add(d.resourceId);let p=this.observed.get(d.resourceId);if(!p||p.revision!==d.revision)this.observed.set(d.resourceId,{revision:d.revision,idleSinceMs:s});else if(s-p.idleSinceMs>=m)o.push(pc(d))}for(let d of[...this.observed.keys()])if(!a.has(d))this.observed.delete(d);if(o.length===0)return{resources:[]};for(let d of o)this.observed.delete(d.resourceId);let c=await this.destructions.expireIdle(o);if(c.resources.length>0)e.info(`Session broker expired ${c.resources.length} idle pooled device(s): ${c.resources.map((d)=>`${d.resourceId} ${d.outcome}`).join(", ")}`);return c}ttlFor(s){try{let n=Ln(s).platform;return this.ttlMs[n==="watchos"?"ios":n]}catch(n){e.warn(`Idle expiry skipped session resource ${s.resourceId}: ${r(n)}`,n);return}}}var _=2592000000;async function Z(s,n,o,a){if(!Number.isFinite(o)||o<0||o>_||!Number.isInteger(a)||a<1||a>1e4)throw new t(`Broker stats needs a window of 0 to ${_/86400000} days and a limit of 1 to 10000`);let c=n(),d=c-o,m=await s.timingSamples(d,c,a+1);return{sinceMs:d,untilMs:c,limit:a,truncated:m.length>a,groups:vn(m.slice(0,a),d,c)}}function vn(s,n,o){let a=new Map;for(let c of s){let d=JSON.stringify(c.profile),m=a.get(d)??[];m.push(c),a.set(d,m)}return[...a.values()].map((c)=>{let d=(v)=>v!==void 0&&v>=n&&v<=o,m=c.flatMap((v)=>v.timing.acquisition?.outcome==="ready"&&d(v.timing.acquisition.completedAtMs)?[v.timing.acquisition]:[]),p=c.flatMap((v)=>v.timing.reset&&d(v.timing.reset.completedAtMs)?[v.timing.reset]:[]),f={},S={},w=(v,b,k)=>{if(k!==void 0&&Number.isFinite(k)&&k>=0)(v[b]??=[]).push(k)};for(let v of m)for(let b of["queueMs","admissionWaitMs","createMs","bootMs","automationReadyMs","totalMs"])w(f,b,v[b]);for(let v of p){for(let[b,k]of Object.entries(v.phases))w(S,b,k);w(S,"totalMs",v.totalMs)}let R=(v)=>Object.fromEntries(Object.entries(v).map(([b,k])=>(k.sort((Fs,Ls)=>Fs-Ls),[b,{count:k.length,p50:ui(k,50),p90:ui(k,90)}])));return{profile:c[0].profile,acquisitions:m.length,resets:p.length,reuseHitRate:m.length?m.filter((v)=>v.admission==="reuse").length/m.length:0,fallbackRate:p.length?p.filter((v)=>v.outcome.startsWith("fallback:")).length/p.length:0,retirements:c.filter(({timing:v})=>v.reset&&(v.reset.retired||v.reset.outcome==="destroyed")&&d(v.reset.completedAtMs??v.reset.startedAtMs)).length,acquisitionPhases:R(f),resetPhases:R(S)}}).filter((c)=>c.acquisitions>0||c.resets>0||c.retirements>0)}function gt(s,n){switch(s){case"android":return n.reuseAndroidCleanDevices===!0;case"ios":case"watchos":return n.reuseCleanDevices===!0}}class he{limit;timer;now;active=0;pending=[];constructor(s=Number.POSITIVE_INFINITY,n=i,o=()=>i.now()){this.limit=s;this.timer=n;this.now=o}async run(s,n,o){n?.throwIfAborted();let a=this.now();if(this.active>=this.limit){let c=Promise.withResolvers(),d=()=>{this.active+=1,c.resolve()};this.pending.push(d);try{await l(()=>c.promise,{timer:this.timer,signal:n,label:"Reset boot cleanup queue"})}catch(m){let p=this.pending.indexOf(d);if(p>=0)this.pending.splice(p,1);else this.release();throw u(m,"Reset boot cleanup queue was cancelled")}}else this.active+=1;try{return n?.throwIfAborted(),o?.(this.now()-a),await s()}finally{this.release()}}release(){this.active-=1,this.pending.shift()?.()}}class Se{options;timing;now;hooks;resetBoots;async releaseStatus(s,n){let o=s.resourceId?await this.options.store.getResource(s.resourceId):void 0,a=o?.requestId===s.requestId&&o.state!=="idle"&&o.state!=="destroyed",c=await this.options.store.getRequest(s.requestId);return{sessionUuid:n,outcome:a?"cleanup_pending":"released",...c?.timing?{timing:c.timing}:{}}}constructor(s,n,o,a){this.options=s;this.timing=n;this.now=o;this.hooks=a;this.resetBoots=new he(s.limits.maxConcurrentResetBoots,s.timer,o)}async drainAndReset(s,n,o,a){let c=!1,d=this.timing.initialResetTiming(s,n),m=()=>this.timing.recordResetTiming(s,n,d);try{await m();let p=this.now();if(!(await this.options.devices.release(o)).settled)return d.phases.drain=this.now()-p,await m(),"pending";if(d.phases.drain=this.now()-p,a?.throwIfAborted(),!gt(Ln(n).platform,this.options)||!this.options.devices.reset||n.state!=="resetting")return await m(),"destroy";let f=this.now(),S=(v)=>{d.phases.bootQueue=(d.phases.bootQueue??0)+v},w=async()=>{this.hooks.setResetActive?.(n.resourceId,!0);try{let v=this.options.devices.managesResetBootSlots?async(b)=>(this.hooks.setResetActive?.(n.resourceId,!1),this.resetBoots.run(async()=>(this.hooks.setResetActive?.(n.resourceId,!0),b()),a,S)):void 0;return await this.options.devices.reset(n,void 0,v)}finally{this.hooks.setResetActive?.(n.resourceId,!1)}},R=await(this.needsResetBootSlot(n)?this.resetBoots.run(w,a,S):w());if(d.phases.reset=this.now()-f,d=this.timing.mergeResetTiming(d,R),!["clean","fallback:keep-booted","fallback:erase","fallback:snapshot","fallback:wipe-data"].includes(d.outcome))return d.outcome="pending",await m(),"destroy";return a?.throwIfAborted(),c=!0,await this.completeCleanReset(s,n,d,a),"idle"}catch(p){return d=c?d:this.timing.failedResetTiming(d,p),await m(),ZZ(p instanceof Ci?p.cause:p,o,c)}}needsResetBootSlot(s){return Ln(s).platform!=="android"&&!this.options.devices.managesResetBootSlots}async completeCleanReset(s,n,o,a){let c=await this.options.store.completeCleanRelease(s.requestId,this.options.owner,this.options.limits);if(this.hooks.notifyReady?.(n.resourceId),c.some((m)=>m.resourceId===n.resourceId))o.outcome="pending",o.retired=!0,await this.timing.recordResetTiming(s,n,o);for(let m of c)a?.throwIfAborted(),await this.hooks.tryCleanup(m,a);if((await this.options.store.getResource(n.resourceId))?.state==="destroyed")o.outcome="destroyed";await this.timing.recordResetTiming(s,n,o)}}function yn(s){return{...s,timing:{acquisition:s.timing.acquisition?.admission==="reuse"?void 0:s.timing.acquisition,reset:s.timing.reset?.outcome==="clean"||s.timing.reset?.outcome.startsWith("fallback:")?s.timing.reset:void 0}}}function wn(s,n){let o=s.acquisitionPhases;return Math.max(n+(o.automationReadyMs?.p50??0),o.totalMs?.p50??0)}function Rn(s){let n=s?.resetPhases.totalMs?.p90,o=s?.acquisitionPhases.createMs?.p50,a=s?.acquisitionPhases.bootMs?.p50;if(n===void 0||o===void 0||a===void 0||o+a<=0)return;return{resetMs:n,thresholdMs:wn(s,o+a)}}class ve{store;timer;listeners=new Map;activeResets=new Set;waiters=new Map;constructor(s,n=i){this.store=s;this.timer=n}async snapshot(s){try{return await this.readSnapshot(s)}catch(n){e.warn("Could not estimate resetting simulator readiness",n);return}}setResetActive(s,n){if(n)this.activeResets.add(s);else this.activeResets.delete(s)}releaseWait(s){this.waiters.delete(s)}canWait(s){return this.activeResets.has(s)&&![...this.waiters.values()].includes(s)}async readSnapshot(s){let n=(await this.store.listLiveResources()).filter((d)=>d.state==="resetting"&&this.canWait(d.resourceId)&&s(d.profile)&&Ln(d).platform!=="android");if(n.length===0)return;let o=await Z({timingSamples:async(d,m,p)=>(await this.store.timingSamples(d,m,p)).map(yn)},()=>this.timer.now(),86400000,5000),a=new Map,c=Number.POSITIVE_INFINITY;for(let d of n){let m=o.groups.find((S)=>JSON.stringify(S.profile)===JSON.stringify(Ln(d))),p=Rn(m);if(!p)continue;let f=await this.remainingMs(d,p.resetMs);if(f===void 0)continue;a.set(d.resourceId,f),c=Math.min(c,p.thresholdMs)}return a.size>0?{thresholdMs:c,expectedReadyMs:a,canWait:(d)=>this.canWait(d),reserveWait:(d,m)=>this.waiters.set(d,m)}:void 0}async remainingMs(s,n){let a=(s.requestId?await this.store.getRequest(s.requestId):void 0)?.timing?.reset;if(!a||a.outcome!=="pending")return;let c=n-(this.timer.now()-a.startedAtMs);return c<0?void 0:c}notify(s){for(let n of this.listeners.get(s)??[])n()}async continueAfterWait(s,n,o,a){if(s.kind!=="wait")return{admission:s,preparationTimeoutMs:o};let c=(n.timingStartedAtMs??this.timer.now())+(o??ao),d=n.resetReadiness?.thresholdMs??0;try{if(await this.wait(s.resourceId,Math.max(0,Math.min(s.waitMs,c-this.timer.now())),a),d>0&&(await this.store.getResource(s.resourceId))?.state==="resetting"&&this.activeResets.has(s.resourceId)&&this.timer.now()<c)await this.wait(s.resourceId,Math.max(0,Math.min(d,c-this.timer.now())),a)}finally{this.releaseWait(n.requestId)}a.throwIfAborted();let m=c-this.timer.now();if(m<=0)throw new xa({code:"session_preparation_failed",message:"Session preparation deadline expired waiting for a resetting simulator",retryable:!0});return n.resetReadiness=void 0,{admission:await this.store.continueAdmission(n),preparationTimeoutMs:m}}async wait(s,n,o){let a=Promise.withResolvers(),c=this.listeners.get(s)??new Set;this.listeners.set(s,c),c.add(a.resolve);let d=this.timer.setTimeout(a.resolve,n);try{if((await this.store.getResource(s))?.state!=="resetting"||!this.activeResets.has(s))return;await l(()=>a.promise,{timer:this.timer,signal:o,label:"Waiting for resetting simulator"})}finally{if(this.timer.clearTimeout(d),c.delete(a.resolve),c.size===0)this.listeners.delete(s)}}}var j=30000;function ye(s,n,o,a){let c={pending:o,committed:a};return s.set(n,c),o.then(()=>s.delete(n),(d)=>{s.delete(n),e.warn(`Session ${n} release failed: ${r(d)}`,d)}),c}function bn(s,n){return s!==void 0&&Number.isFinite(s)?Math.max(0,Math.min(s,j)):n??j}async function ht(s,n,o,a){await n.committed;let c=new t("Session release reply budget elapsed");try{return await l(n.pending,{timer:a.timer??i,timeoutMs:bn(o,a.releaseReplyBudgetMs),label:`Release session ${s}`,timeoutError:()=>c})}catch(d){if(d===c)return{sessionUuid:s,outcome:"cleanup_pending"};throw d}}var y4=500;class v4{options;releases=new Map;preparations=new Map;preparationOwners=new Map;stopping=!1;poolOperations=new Set;snapshotCleanup=new ue({isStopping:()=>this.stopping,preparations:()=>this.preparationOwners.keys(),poolOperations:()=>this.poolOperations});cleanup;destructions;idleExpiry;queuedRecoveryReleases=new Set;timing;resetRelease;resetReadiness;constructor(s){this.options=s;this.destructions=new pe(s.store,s.devices),this.idleExpiry=new fe(s.idleTtlMs??{},s.store,this.destructions,()=>this.now()),this.cleanup=new me(s.cleanupConcurrency,s.cleanupWaitMs,s.timer),this.timing=new L4(s.store,{now:()=>this.now()}),this.resetReadiness=new ve(s.store,{now:()=>this.now(),setTimeout:(n,o)=>(s.timer??i).setTimeout(n,o),clearTimeout:(n)=>(s.timer??i).clearTimeout(n)}),this.resetRelease=new Se(s,this.timing,()=>this.now(),{tryCleanup:(n,o)=>this.tryCleanup(n,o),notifyReady:(n)=>this.resetReadiness.notify(n),setResetActive:(n,o)=>this.resetReadiness.setResetActive(n,o)})}now(){return this.options.timer?.now?.()??i.now()}stats(s=86400000,n=5000){return Z(this.options.store,()=>this.now(),s,n)}async drainIdlePool(){if(this.stopping)throw new rl;if(this.snapshotCleanup.inProgress)throw new x;return de(this.poolOperations,()=>this.destructions.drainIdlePool())}async cleanupAvdSnapshots(s){return this.snapshotCleanup.run(s)}async expireIdlePool(){if(this.stopping||this.snapshotCleanup.inProgress)return{resources:[]};return de(this.poolOperations,()=>this.idleExpiry.sweep())}prepare(s,n,o,a){if(this.stopping)return Promise.reject(new rl);if(this.snapshotCleanup.inProgress)return Promise.reject(new x);let c=new AbortController,d=o?AbortSignal.any([o,c.signal]):c.signal,m=this.prepareOnce(s,n,d,a);return this.preparationOwners.set(m,{controller:c,requestId:s.requestId}),m.then(()=>this.preparationOwners.delete(m),()=>this.preparationOwners.delete(m)),m}async prepareOnce(s,n,o,a){let c=!1,d=this.now(),m=s_(s,n);this.preparations.set(s.requestId,(this.preparations.get(s.requestId)??0)+1);try{let p=await this.options.store.getRequest(s.requestId);if(p)return this.replay(p,{config:s,fingerprint:m,livenessOwnerToken:n,signal:o,exportIdentity:a});let f=await ft(this.options,s,{fingerprint:m,signal:o,exportIdentity:a});if(f.timingStartedAtMs=d,this.options.reuseCleanDevices&&s.device.platform!=="android")f.resetReadiness=await this.resetReadiness.snapshot(f.matches);let S=await this.options.store.admit(f);if(S.kind==="existing"||S.kind==="refused")return this.resultUnlessAborted(S.request,o);return c=!0,await this.prepareAdmission(S,f,s,{livenessOwnerToken:n,signal:o})}catch(p){if(p instanceof av)throw p;if(p instanceof X)throw e.warn(p.message,p.cause),p;if(!c&&F4(o))throw e.debug(`Session request ${s.requestId} refused while stopping`,p),new rl;return e.warn(`Session request ${s.requestId} preparation failed: ${r(p)}`,p),this.handlePreparationFailure(s,n,m,{admitted:c,error:XZ(p,o),exportIdentity:a})}finally{this.finishPreparation(s.requestId)}}async handlePreparationFailure(s,n,o,{admitted:a,error:c,exportIdentity:d}){let m=Lq(c);if(a)return this.failAdmittedPreparation(s,m);if(c instanceof tn)return Bq(s,m);let p=await this.options.store.getRequest(s.requestId);if(p?.errorCode===sp&&this.consumerOwns(p,n)){if(d)await this.options.store.linkRequestExport(s.requestId,p.fingerprint,d);return this.result(p)}let f;try{f=await this.options.store.recordPreAdmissionFailure({requestId:s.requestId,fingerprint:o,parameters:s,owner:this.options.owner,export:d},m)}catch(S){if(!(S instanceof tn))throw S;return e.warn(`Session request ${s.requestId} receipt refused: ${S.message}`,S),Bq(s,Lq(S))}return this.result(f)}async failAdmittedPreparation(s,n){let o=await this.options.store.fail(s.requestId,this.options.owner,n.message,{errorCode:n.code,retryable:n.retryable});if(o)await this.tryCleanup(o);let a=await this.options.store.getRequest(s.requestId);if(!a)throw new t("Admitted session request lost its durable receipt; cleanup cannot be acknowledged");await this.timing.recordFailedAcquisition(a);let c=await this.result(a);return eQ(a,c,n)}finishPreparation(s){let n=(this.preparations.get(s)??1)-1;if(n===0)this.resetReadiness.releaseWait(s),this.preparations.delete(s);else this.preparations.set(s,n)}async replay(s,n){let{config:o,fingerprint:a,livenessOwnerToken:c,signal:d,exportIdentity:m}=n,p=s.errorCode===sp&&this.consumerOwns(s,c);if(s.fingerprint!==a&&!p)return Bq(o,Lq(new t("Session request identity was already used with different parameters")));if(m)await this.options.store.linkRequestExport(s.requestId,s.fingerprint,m);return this.resultUnlessAborted(s,d)}async prepareAdmission(s,n,o,{livenessOwnerToken:a,signal:c}){let d=await this.resetReadiness.continueAfterWait(s,n,o.preparationTimeoutMs,c),{admission:m,preparationTimeoutMs:p}=d;while(m.kind==="evict"){if(!await this.destructions.destroy(m.resource).catch((R)=>{if($S(R)!=="retryable")throw R;return e.warn(`Device eviction remains pending: ${r(R)}`,R),!1}))throw new xa({code:"eviction_pending",message:"Device eviction remains unresolved; its capacity is still reserved",retryable:!0,retryAfterMs:1000});c.throwIfAborted(),m=await this.options.store.continueAdmission(n)}if(await this.timing.recordRefusedAdmission(m),m.kind==="refused"||m.kind==="existing"||m.kind==="wait")return this.result(m.request);c.throwIfAborted();let f=await this.options.devices.prepare(m.resource,{livenessOwnerToken:a,signal:c,preparationTimeoutMs:p,idleTimeoutMs:o.idleTimeoutMs,executionOwnerPid:o.executionOwnerPid,deviceProfile:J(o)});c.throwIfAborted();let S=await this.options.store.activate(o.requestId,this.options.owner,f.sessionId,{...f.timing,profile:f.profile});if(this.stopping)try{await this.options.store.relinquishForRestart(o.requestId,this.options.owner)}catch(w){e.warn(`Session request ${o.requestId} could not be kept for restart: ${r(w)}`,w)}try{this.timing.logReadyAcquisition(S,m.resource);let w=await this.result(c.aborted?await this.options.store.getRequest(o.requestId)??S:S);return w.outcome==="ready"?await this.rereadIfSuperseded(w,o):w}catch(w){throw new X(o.requestId,w)}}async rereadIfSuperseded(s,n){let o=await this.options.store.getRequest(n.requestId);return o&&o.state!=="active"?this.result(o):s}async status(s){let n=await this.options.store.getRequest(s);return n&&this.result(n)}async ownedStatus(s,n){let o=await this.options.store.getRequest(s);if(!o)return;return this.assertConsumerOwner(o,n),this.result(o)}async abandon(s,n){if(this.stopping)throw new rl;let o=await this.options.store.abandon(s,this.options.owner,n);for(let a of this.preparationOwners.values())if(a.requestId===s)a.controller.abort(new t("Session request was abandoned by its liveness owner"));if(o.request.sessionId)await this.drainAbandonedSession(o.request.sessionId);if(o.ticket&&!this.hasPendingPreparation(s))await this.tryCleanup(o.ticket);return this.result(await this.options.store.getRequest(s)??o.request)}async ownedSessionRequest(s,n){let o=await this.options.store.getSession(s);if(o)this.assertConsumerOwner(o,n);return o}async hasActiveSession(s){let n=await this.options.store.getSession(s);return n?.state==="active"&&Sm(n.owner,this.options.owner)}async getExport(s,n,o){let a=await this.authorizedExport(s,n,o);if(!a)return;return{contractVersion:1,prepareId:s,requestDigest:n,acknowledged:a.record.acknowledgedAtMs!==null,result:await this.result(a.request)}}async acknowledgeExport(s,n,o){let c=await this.authorizedExport(s,n,o)&&await this.options.store.acknowledgeExport(s);return{prepareId:s,outcome:c?"acknowledged":"unknown_export"}}async authorizedExport(s,n,o){let a=await this.options.store.getExport(s);if(!a)return;let c=await this.options.store.getRequest(a.requestId);if(a.requestDigest!==n||!c||!this.consumerOwns(c,o))throw new av;return{record:a,request:c}}assertConsumerOwner(s,n){if(!this.consumerOwns(s,n))throw new t("Session request belongs to another liveness owner")}consumerOwns(s,n){return Boolean(n)&&s.fingerprint===s_(s.parameters,n)}release(s,n,o={}){if(n===wm&&!this.releases.has(s))return this.releaseAfterOwnerExit(s);return ht(s,this.releaseTracked(s),o.replyBudgetMs,this.options)}releaseTracked(s,n){let o=this.releases.get(s);if(o)return o;let a=this.options.store.beginRelease(s,this.options.owner);return ye(this.releases,s,a.then((c)=>this.releaseOnce(s,c,n)),a)}releaseAfterOwnerExit(s){let n=this.commitOwnerExit(s);return ye(this.releases,s,n.then((o)=>o?this.finishOwnerExit(s,o):{sessionUuid:s,outcome:"unknown_session"}),n),n.then(async(o)=>o?this.resetRelease.releaseStatus(o.request,s):{sessionUuid:s,outcome:"unknown_session"})}async commitOwnerExit(s){let n=await this.options.store.getSession(s);if(!n)return;let o=await this.options.store.fail(n.requestId,this.options.owner,$q,{errorCode:wm});return e.info(`Session ${s} lost its execution owner; request ${n.requestId} is terminal (${wm})`),{request:await this.options.store.getRequest(n.requestId)??n,...o?{ticket:o}:{}}}async finishOwnerExit(s,n){try{await this.options.devices.release(s)}catch(o){e.warn(`Session ${s} drain after owner exit remains pending: ${r(o)}`)}if(n.ticket)await this.tryCleanup(n.ticket);return this.resetRelease.releaseStatus(n.request,s)}async joinReleases(){await Promise.allSettled([...this.releases.values()].map((s)=>s.pending))}async close(){try{await this.markRestartHandoff()}catch(n){e.warn(`Session broker restart handoff failed: ${r(n)}`,n)}await Promise.allSettled([...this.preparationOwners.keys()]),await this.markRestartHandoff();let s=await this.options.store.listRecoverableRequests();await Promise.allSettled(s.filter((n)=>Sm(n.owner,this.options.owner)&&n.sessionId&&n.state==="releasing"&&!this.queuedRecoveryReleases.has(n.requestId)).map((n)=>this.releaseTracked(n.sessionId).pending)),await this.joinReleases(),await this.cleanup.join(),await this.destructions.joinAll(),await this.snapshotCleanup.join()}async markRestartHandoff(){this.stopping=!0,this.cleanup.stop();for(let n of this.preparationOwners.values())n.controller.abort(new rl);let s=await this.options.store.listRecoverableRequests();await Promise.allSettled(s.filter((n)=>Sm(n.owner,this.options.owner)&&n.sessionId&&n.state==="active").map((n)=>this.options.store.relinquishForRestart(n.requestId,this.options.owner).catch((o)=>{e.warn(`Session request ${n.requestId} could not be kept for restart: ${r(o)}`,o)})))}async recover(){await this.recoverReceipts(),await this.recoverCleanup()}async recoverReceipts(){for(let s of await this.options.store.listRecoverableRequests()){if(this.stopping)return;try{await this.recoverOneRequest(s)}catch(n){e.warn(`Session request ${s.requestId} recovery remains pending: ${r(n)}`,n)}}}async recoverCleanup(){if(this.stopping)return;let s=new Map((await this.options.store.listRecoverableRequests()).filter((o)=>Sm(o.owner,this.options.owner)).map((o)=>[o.requestId,o])),n=[];for(let o of await this.options.store.listLiveResources()){if(o.requestId&&this.hasPendingPreparation(o.requestId))continue;let a=o.requestId?s.get(o.requestId):void 0;if(o.state!=="destroying"&&a?.state!=="releasing")continue;if(a?.state==="releasing")this.queuedRecoveryReleases.add(a.requestId);n.push({resourceId:o.resourceId,run:(c)=>this.recoverResource(o,a,c)})}await this.cleanup.run(n)}async recoverResource(s,n,o){if(n?.state==="releasing"&&n.sessionId){let a=n.sessionId;await this.releaseTracked(a,o).pending;return}if(n?.state==="failed"&&n.errorCode===sp&&n.sessionId)await this.drainAbandonedSession(n.sessionId);o.throwIfAborted(),await this.tryCleanup(pc(s),o)}async recoverOneRequest(s){if(Sm(s.owner,this.options.owner)){await this.recoverOwnedRequest(s);return}if(await this.recoverRestartHandoff(s)!=="terminal")return;if(await this.options.store.recoverRequest(s.requestId,this.options.owner),s.state==="acquiring")await this.timing.recordFailedAcquisition(s)}async recoverOwnedRequest(s){if(s.state==="active"&&s.sessionId&&this.options.sessionDisposition&&await this.options.sessionDisposition(s.sessionId)==="gone"&&!this.stopping)await this.options.store.beginRelease(s.sessionId,this.options.owner);if(s.state==="acquiring"&&!this.preparations.has(s.requestId))await this.options.store.failInterruptedAcquisition(s.requestId,this.options.owner,"Acquisition ended without committing a session; cleanup is pending"),await this.timing.recordFailedAcquisition(s)}async recoverRestartHandoff(s){if(!s.restartHandoff||s.state!=="active"||!s.sessionId)return"terminal";if((this.options.sessionDisposition?await this.options.sessionDisposition(s.sessionId):"gone")==="gone")return"terminal";let o=await this.options.store.adoptRestartHandoff(s.requestId,this.options.owner);if(o==="adopted")e.info(`Session request ${s.requestId} adopted session ${s.sessionId} after a provider restart`);return o==="not-handoff"?"terminal":o}pruneReceipts(){return this.options.store.pruneTerminalRequests(this.options.receiptRetentionMs??_,y4,this.options.exportRetentionMs??h0)}async releaseOnce(s,n,o){if(!n)return{sessionUuid:s,outcome:"unknown_session"};if(n.state==="released"||n.state==="failed")return this.resetRelease.releaseStatus(n,s);let a=await this.requestResource(n);if(!a)throw new t("Session has no durable resource; cannot acknowledge cleanup");o?.throwIfAborted();try{if(n.state==="releasing"&&a.state==="destroying")return await this.tryCleanup(pc(a),o),this.resetRelease.releaseStatus(n,s);let c=await this.resetRelease.drainAndReset(n,a,s,o);if(o?.throwIfAborted(),c==="pending")return{...await this.resetRelease.releaseStatus(n,s),outcome:"cleanup_pending"};if(c==="idle")return this.resetRelease.releaseStatus(n,s);let d=await this.options.store.releaseByDestruction(n.requestId,this.options.owner);if(this.resetReadiness.notify(a.resourceId),d)await this.tryCleanup(d,o);return this.resetRelease.releaseStatus(n,s)}finally{this.resetReadiness.notify(a.resourceId)}}async drainAbandonedSession(s){try{let n=this.releases.get(s);if(n)await n.pending;else await this.options.devices.release(s)}catch(n){e.warn(`Abandoned session ${s} release remains pending: ${r(n)}`)}}async requestResource(s){return s.resourceId?this.options.store.getResource(s.resourceId):void 0}async result(s){let n=await this.requestResource(s);return QZ(s,n,this.hasPendingPreparation(s.requestId))}async resultUnlessAborted(s,n){let o=await this.result(s);return n.throwIfAborted(),o}hasPendingPreparation(s){return(this.preparations.get(s)??0)>0}tryCleanup(s,n){return this.destructions.tryCleanup(s,n)}}var ee=y().min(1),St=g({prepareId:y().min(1).max(256),requestDigest:y().min(1).max(256)}).strict(),kn=St.extend({livenessOwnerToken:ee}).strict(),Dn=g({config:yr(),livenessOwnerToken:ee,export:St.optional()}).strict(),vt=g({requestId:y().min(1),livenessOwnerToken:ee}).strict(),An=vt,En=g({sessionId:y().uuid(),livenessOwnerToken:ee,reason:ne(wm).optional(),replyBudgetMs:t8((s)=>typeof s==="number"&&!Number.isFinite(s)?void 0:s,T().transform((s)=>Math.max(0,Math.min(s,j))).nullish())}).strict();async function Pn(s,n,o,a){let c=n.getSessionBrokerService?.();if(!c)return M(n);F(n,a,c.scopeKey,[]);let d=Dn.safeParse(s.params);if(!d.success)return{success:!1,code:"session_config_invalid",error:"config and livenessOwnerToken are required"};let m;try{m=J4(d.data.config)}catch(f){return e.warn(`Session broker rejected invalid configuration: ${r(f)}`),{success:!1,code:"session_config_invalid",error:r(f)}}let p;try{p=await c.broker.prepare(m,d.data.livenessOwnerToken,o,d.data.export)}catch(f){return L(f)}if(!o?.aborted)F(n,a,c.scopeKey,p.outcome==="ready"&&p.sessionUuid?[p.sessionUuid]:[]);return{success:!0,result:{...p}}}async function On(s,n){return yt(s,n,!1)}async function In(s,n){return yt(s,n,!0)}async function yt(s,n,o){let a=n.getSessionBrokerService?.();if(!a)return M(n);let c=kn.safeParse(s.params);if(!c.success)return{success:!1,code:"session_config_invalid",error:"prepareId, requestDigest and livenessOwnerToken are required"};let{prepareId:d,requestDigest:m,livenessOwnerToken:p}=c.data;try{let f=o?await a.broker.acknowledgeExport(d,m,p):await a.broker.getExport(d,m,p);return f?{success:!0,result:{...f}}:{success:!1,code:"session_export_not_found",error:"No session export has that prepare identity"}}catch(f){return L(f)}}function L(s){if(s instanceof BS||s instanceof rl||s instanceof x){let n=`Session broker rejected request: ${r(s)}`;if(s.retryable)e.debug(n);else e.warn(n);return{success:!1,code:s.code,error:r(s),retryable:s.retryable,...s.retryAfterMs===void 0?{}:{retryAfterMs:s.retryAfterMs}}}if(!(s instanceof av))throw s;return e.warn(`Session broker rejected export identity: ${r(s)}`),{success:!1,code:s.code,error:r(s)}}async function Mn(s,n,o){let a=n.getSessionBrokerService?.();if(!a)return M(n);F(n,o,a.scopeKey,[]);let c=vt.safeParse(s.params);if(!c.success)return{success:!1,error:"requestId and livenessOwnerToken are required"};let d=await a.broker.ownedStatus(c.data.requestId,c.data.livenessOwnerToken);return F(n,o,a.scopeKey,d?.outcome==="ready"&&d.sessionUuid?[d.sessionUuid]:[]),d?{success:!0,result:{...d}}:{success:!1,code:"session_request_not_found",error:"No committed session request has that identity"}}async function Tn(s,n){let o=n.getSessionBrokerService?.();if(!o)return M(n);let a=An.safeParse(s.params);if(!a.success)return{success:!1,error:"requestId and livenessOwnerToken are required"};try{return{success:!0,result:{...await o.broker.abandon(a.data.requestId,a.data.livenessOwnerToken)}}}catch(c){return L(c)}}async function Cn(s,n){let o=n.getSessionBrokerService?.();if(!o)return M(n);let a=En.safeParse(s.params);if(!a.success)return{success:!1,error:"sessionId and livenessOwnerToken are required"};try{if(!await o.broker.ownedSessionRequest(a.data.sessionId,a.data.livenessOwnerToken))return{success:!0,result:{sessionUuid:a.data.sessionId,outcome:"unknown_session"}};return{success:!0,result:{...await o.broker.release(a.data.sessionId,a.data.reason,{replyBudgetMs:a.data.replyBudgetMs??void 0})}}}catch(c){return L(c)}}async function wt(s,n,o,a){let c=s.getSessionBrokerService?.();if(!c)return M(s);F(s,a,c.scopeKey,[]);let d=await c.broker.ownedStatus(o.requestId,o.livenessOwnerToken);if(!d||d.outcome!=="ready"||d.sessionUuid!==n)return{success:!1,code:"session_ownership_lost",error:"That request no longer grants this session; no replacement was acquired"};if(s.getSessionManager().getSessionLivenessOwnerToken?.(n)!==o.livenessOwnerToken)return{success:!1,code:"session_ownership_lost",error:"This provider no longer holds the requested session for that owner"};F(s,a,c.scopeKey,[n]);return}function F(s,n,o,a){if(n)s.getBrokerConnectionScopes?.().bind(n,{scopeKey:o,sessionUuids:a})}function M(s){let n=s.isSessionBrokerMode?.()===!0;return{success:!1,code:"session_broker_unavailable",error:"Session-broker mode is not available in this provider",retryable:n,...n?{retryAfterMs:tl}:{}}}var Rt=[["daemon/sessionBrokerStats",async(s,n)=>{let o=n.getSessionBrokerService?.();if(!o)return M(n);let a=g({windowMs:T().finite().min(0).max(_).optional(),limit:T().int().min(1).max(1e4).optional()}).strict().safeParse(s.params??{});if(!a.success)return{success:!1,code:"session_config_invalid",error:"Invalid broker stats window or limit"};return{success:!0,result:{...await o.broker.stats(a.data.windowMs,a.data.limit)}}}],["daemon/prepareSession",(s,n,{signal:o,context:a})=>Pn(s,n,o,a.socketSessionId)],["daemon/getSessionExport",(s,n)=>On(s,n)],["daemon/acknowledgeSessionExport",(s,n)=>In(s,n)],["daemon/sessionRequestStatus",(s,n,{context:o})=>Mn(s,n,o.socketSessionId)],["daemon/abandonSessionRequest",(s,n)=>Tn(s,n)],["daemon/releaseBrokerSession",(s,n)=>Cn(s,n)],["daemon/drainBrokerPool",(s,n,{context:o})=>xn(s,n,o.socketSessionId)],["daemon/cleanupBrokerAvdSnapshots",(s,n,{context:o})=>_n(s,n,o.socketSessionId)]];async function xn(s,n,o){let a=Yw({binding:n.getBrokerConnectionScopes?.().get(o),action:"daemon/drainBrokerPool"});if(a)return{success:!1,code:a.code,error:a.message};let c=n.getSessionBrokerService?.();if(!c)return M(n);if(!g({}).strict().safeParse(s.params??{}).success)return{success:!1,code:"session_config_invalid",error:"Drain takes no parameters"};try{return{success:!0,result:{...await c.broker.drainIdlePool()}}}catch(m){return L(m)}}async function _n(s,n,o){let a=Yw({binding:n.getBrokerConnectionScopes?.().get(o),action:"daemon/cleanupBrokerAvdSnapshots"});if(a)return{success:!1,code:a.code,error:a.message};let c=n.getSessionBrokerService?.();if(!c)return M(n);if(!g({}).strict().safeParse(s.params??{}).success)return{success:!1,code:"session_config_invalid",error:"Snapshot cleanup takes no parameters"};try{return{success:!0,result:{reports:await c.broker.cleanupAvdSnapshots(async()=>{let m=c.avdSnapshotCleanup,f=(await m.filesystem.listNames(m.resolver.getAvdHome())).filter((S)=>S.endsWith(".avd")&&S.length>4).map((S)=>S.slice(0,-4));return dt(f,m)})}}}catch(d){return L(u(d,"Snapshot cleanup failed; verify AVD home access and retry"))}}function Bn(s,n){if(s===null)return n;return n===null?s:Math.min(s,n)}function GN(s,n){let o=s.clientActivity(n);return{sessionId:s.sessionForDevice(n),activeExecutions:s.activeExecutionCount(n),inFlightRequests:o.inFlightRequests,streaming:s.hasStreamSubscriber(n),idleForMs:Bn(s.toolIdleForMs(n),o.idleForMs)}}function CZ(s){return s.sessionId!==null||s.activeExecutions>0||s.inFlightRequests>0||s.streaming}function mq(s){return{sessionForDevice:s,activeExecutionCount:(n)=>G.getActiveDeviceExecutionCount(n),toolIdleForMs:(n)=>G.getDeviceIdleForMs(n),hasStreamSubscriber:(n)=>It()?.hasSubscriberForDevice(n)??!1,clientActivity:(n)=>E.getForwardLeaseActivity(n)}}function bt(){return{idleMs:IB(),release:async(s)=>{if(!E.getForwardLeaseHeldDeviceIds().includes(s))return;await E.releaseIdleForwardLease(s)}}}function P(s,n){return s.sessionClockToReportedWall?.(n)??s.sessionClockToWall?.(n)??n}async function se(s,n,o){return we(n,await W(s,n),o)}function we(s,n,o){return{success:!1,error:`Session not found: ${s}`,code:yc,...Oh(n.releaseReason,n.idleTimeoutMs),...o!==void 0?{daemonInstance:o}:{}}}async function W(s,n){let o=await Re(s,n),a=await Nn(s,n,o);return a===void 0?{releaseReason:o}:{releaseReason:o,idleTimeoutMs:a}}async function Nn(s,n,o){if(o!=="cli-idle-timeout")return;try{return await s.getReleasedSessionIdleTimeoutMs?.(n)}catch(a){e.warn(`Idle window lookup failed for ${n}: ${r(a)}`,a);return}}async function Re(s,n){try{return await s.getReleasedSessionReason?.(n)}catch(o){e.warn(`Release reason lookup failed for ${n}: ${r(o)}`,o);return}}var kt=32,Dt=128,At=128;function Fn(s){return s===null}class b4{timer;heartbeatTimeoutMs;onObserverGone;sessions=new Map;disposed=!1;sweepHandle=null;sweepAtMs=Number.POSITIVE_INFINITY;clock;stallProbe;constructor(s=i,n=cc()+ps,o){this.timer=s;this.heartbeatTimeoutMs=n;this.onObserverGone=o;this.clock=new UP(s)}register(s,n){if(this.purgeExpired(),this.disposed)return{accepted:!1,error:"Observer session registry is closed; reconnect to the daemon"};if(!this.sessions.has(s)&&this.sessions.size>=kt)return{accepted:!1,error:`Observer session limit (${kt}) reached; release a session or wait for heartbeat expiry before retrying`};let o=this.clock.now(),a=o+this.heartbeatTimeoutMs;return this.sessions.set(s,{sessionId:s,clientName:n,lastHeartbeat:o,expiresAtMs:a}),this.scheduleSweep(),e.debug(`Registered observer session ${s} (${n})`),{accepted:!0,heartbeatTimeoutMs:this.heartbeatTimeoutMs,expiresAtMs:this.clock.toWall(a)}}heartbeat(s){this.purgeExpired();let n=this.sessions.get(s);if(!n)return!1;return n.lastHeartbeat=this.clock.now(),n.expiresAtMs=n.lastHeartbeat+this.heartbeatTimeoutMs,!0}release(s,n="explicit-release"){return this.purgeExpired(),this.remove(s,n)}list(){return this.purgeExpired(),Array.from(this.sessions.values(),(s)=>({...s,lastHeartbeat:this.clock.toWall(s.lastHeartbeat),expiresAtMs:this.clock.toWall(s.expiresAtMs)}))}resolveObserverScope(s){return this.purgeExpired(),this.sessions.has(s)?{kind:"unowned-devices-only"}:{kind:"denied"}}canObserveDevice(s,n,o){return this.resolveObserverScope(s).kind!=="denied"&&Fn(o.getSessionForDevice(n))}setStallProbe(s){this.stallProbe=s}forgiveStall({lostMs:s,sleptMs:n,gapAgeMs:o}){let a=this.clock.now(),c=0;for(let d of this.sessions.values()){if(o!==void 0&&!KI(d.lastHeartbeat,this.heartbeatTimeoutMs,a-o))continue;let m=d.expiresAtMs-this.heartbeatTimeoutMs;d.expiresAtMs=GI(m,a,s+n)+this.heartbeatTimeoutMs,c++}return c}dispose(){this.disposed=!0,this.sessions.clear(),this.cancelSweep()}remove(s,n){let o=this.sessions.delete(s);if(o){if(e.debug(`Removed observer session ${s}: ${n}`),n!=="promotion")this.onObserverGone?.(s)}return o}scheduleSweep(){if(this.disposed)return;let s=Math.min(...Array.from(this.sessions.values(),(n)=>n.expiresAtMs));if(!Number.isFinite(s)||this.sweepHandle&&this.sweepAtMs<=s)return;this.cancelSweep(),this.sweepAtMs=s,this.sweepHandle=this.timer.setTimeout(()=>{this.sweepHandle=null,this.sweepAtMs=Number.POSITIVE_INFINITY,this.purgeExpired(),this.scheduleSweep()},Math.max(0,s-this.clock.now())),this.sweepHandle?.unref?.()}cancelSweep(){if(this.sweepHandle)this.timer.clearTimeout(this.sweepHandle),this.sweepHandle=null;this.sweepAtMs=Number.POSITIVE_INFINITY}purgeExpired(){this.stallProbe?.();let s=this.clock.now();for(let n of this.sessions.values())if(n.expiresAtMs<=s)this.remove(n.sessionId,"heartbeat-timeout")}}var qn=g({sessionId:y().max(At).uuid(),clientName:y().max(Dt).trim().min(1),sessionBroker:g({requestId:y().min(1),livenessOwnerToken:y().min(1)}).strict().optional()});function $n(s,n){if(s&&!s.sessionUuids.has(n)){let o=new Ic(nR,"session",s.scopeKey,{sessionUuid:n});return{success:!1,code:o.code,retryable:!1,error:o.message}}return}async function Hn(s,n){return await s.waitForSessionReleaseWithin?.(n,Qv)===!1?{success:!1,error:`Session ${n} release is still in progress after ${Qv}ms; retry registration`}:void 0}async function Un(s,n){let o=Ot(s,n),a;if(!o)try{a=await s.getExpiredReleaseSnapshot?.(n)}catch(d){e.warn(`Expired snapshot lookup failed for ${n}: ${r(d)}`,d)}let c=o??a??await jn(s,n);return Mt(n,c,a!==void 0)}function Ot(s,n){return s.getTerminalReleaseSnapshot?.(n)??s.peekTerminalAnswerForEndedSession?.(n)?.release}function Mt(s,n,o=!1){if(!n?.terminal||!o&&!t_(n.releaseReason))return;let{releaseReason:a,ownerPid:c,cliIdleTimeoutMs:d}=n;return{success:!1,code:Ho,retryable:!1,nextAction:ci,error:`Session ${s} is terminal after ${a} and cannot be registered again. Acquire a new device with getAndroid or getApple, or register a new session UUID to observe.`,details:{sessionUuid:s,reason:a,...bi(a),...cu(a,d),...c===void 0?{}:{ownerPid:c}},...Oh(a,d)}}async function jn(s,n){let{releaseReason:o,idleTimeoutMs:a}=await W(s,n);return o===void 0?void 0:{releaseReason:o,terminal:ir(o),...a===void 0?{}:{cliIdleTimeoutMs:a}}}function Et(s,n,o){let a=Il(s,n);if(!a)return;return s.recordSessionClientName?.(n,o),{success:!0,result:{accepted:!0,heartbeatTimeoutMs:a.heartbeatTimeoutMs,expiresAtMs:P(s,a.lastHeartbeat+a.heartbeatTimeoutMs)}}}function Pt(s,n,o){return s.terminalAnswerForEndedSession?.(n),o}async function Tt(s,n,{context:o={}}={}){let a=s.params,c=qn.safeParse(a);if(!c.success)return{success:!1,error:`Invalid registerSession parameters: ${c.error.message}`};let{sessionId:d,clientName:m}=c.data,p=await Wn(n,c.data,o);if(p)return p;let f=n.getSessionManager(),S=await Hn(f,d);if(S)return S;let w=Et(f,d,m);if(w)return w;let R=await Un(f,d);if(R)return Pt(f,d,R);let v=Et(f,d,m);if(v)return v;let b=Mt(d,Ot(f,d));if(b)return Pt(f,d,b);return Vn(n.getObserverSessionRegistry?.(),d,m)}function Vn(s,n,o){if(!s)return{success:!1,error:"Observer session registration is unavailable"};let a=s.register(n,o);return a.accepted?{success:!0,result:{...a}}:{success:!1,error:a.error}}async function Wn(s,n,o){let{sessionId:a,sessionBroker:c}=n;if(c){let m=await wt(s,a,c,o.socketSessionId);if(m)return m}let d=$n(s.getBrokerConnectionScopes?.().get(o.socketSessionId),a);if(d)return d;return}var Kn=`${process.pid}:${performance.timeOrigin}`;async function Ct(s,n){let o=g({sessionId:y().min(1),livenessOwnerToken:y().refine((m)=>m.trim().length>0)}).safeParse(s.params);if(!o.success)return{success:!1,error:`Invalid releaseLivenessOwnership parameters: ${o.error.message}`};let{sessionId:a,livenessOwnerToken:c}=o.data,d=await n.getSessionManager().releaseLivenessOwnership?.(a,c);if(d==="not-found")return{success:!1,code:yc,error:`Session not found: ${a}`};if(d==="not-owner"||d===void 0)return{success:!1,code:JA,error:`Session ${a}'s liveness can only be released by its current owner token; nothing changed.`};return{success:!0,result:{sessionId:a,alreadyUnowned:d==="already-unowned"}}}function xt(s,n){let o=g({livenessOwnerToken:y().refine((m)=>m.trim().length>0)}).safeParse(s.params);if(!o.success)return{success:!1,error:"livenessOwnerToken parameter required"};let{livenessOwnerToken:a}=o.data,c=n.getSessionManager();return{success:!0,result:{sessions:(c.getAllSessions?.()??[]).filter((m)=>m.livenessOwnerToken===a&&!Yi(c,m.sessionId,m)).map((m)=>({sessionId:m.sessionId,deviceId:m.assignedDevice,platform:m.platform,lastUsedAt:P(c,m.lastUsedAt)}))}}}function fq(s){return s.livenessOwnerToken!==void 0||!!s.livenessOwnershipClaims?.size}async function hq(s,n,o,a){if(a!==void 0)s.creditOwnerHeartbeatDuringRelease?.(o,a);if(n?.heartbeat(o))return{kind:"observer"};return{kind:"notFound",recorded:await W(s,o)}}async function _t(s,n){let o=zn(s),a=o?.sessionId;if(!a)return{success:!1,error:"sessionId parameter required"};let c=n.getDaemonInstance?.()??Kn,d=Zn(o?.expectedDaemonInstance,c,a);if(d)return d;let m=or(o,c),p=n.getSessionManager(),f=Il(p,a);if(!f||Yi(p,a,f))return Gn(n,p,a,{params:o,report:m});return Jn({manager:p,session:f,sessionId:a,params:o,report:m})}function zn(s){return s.params}async function Gn(s,n,o,{params:a,report:c}){let d=await hq(n,s.getObserverSessionRegistry?.(),o,typeof a?.livenessOwnerToken==="string"?a.livenessOwnerToken:void 0);if(d.kind==="observer")return{success:!0,result:{sessionId:o}};return we(o,d.recorded,c.daemonInstance)}function Yn(s){return re(s.params?.livenessOwnerKind,s.session)??(Nt(s.params?.livenessOwnerKind,s.session)?Ft(s.sessionId):void 0)}async function Jn(s){let{manager:n,sessionId:o,report:a}=s,c=Yn(s);if(c)return c;let d=ar(s.params),m=s.params?.claimLivenessOwnership===!0;if(!d&&fq(s.session))return{success:!0,result:{sessionId:o}};if(d){if(n.hasLivenessOwnership?.(o,d))n.recordHeartbeat?.(o);let p=await nr(n,o,d,m),f=Qn(s,d,p);if(f)return f;if(!m)return n.recordHeartbeat?.(o),K(n,o,a)}return Xn(s)}function Qn(s,n,o){let{manager:a,sessionId:c,report:d}=s,m=sr(a,s.session,c,{livenessOwnerToken:n,outcome:o});if(m?.code===yc)return se(a,c,d.daemonInstance);if(m){let p=Il(a,c);return m.code===Ch&&p&&Nt(s.params?.livenessOwnerKind,p)?Ft(c):m}return}function Xn(s){let{manager:n,sessionId:o,report:a}=s,c=lr(s);if(c)return c;if(s.params?.livenessPolicy===wD||s.params?.livenessPolicy===void 0){if(n.restoreHeartbeatLivenessPolicy?.(o))return K(n,o,a,{livenessPolicy:wD})}return n.recordHeartbeat?.(o),K(n,o,a)}function Zn(s,n,o){if(typeof s!=="string"||s===n)return;return{success:!1,code:Q0,error:`The daemon was restarted since this heartbeat's owner last heard from it, so the heartbeat for session ${o} was refused and nothing changed. Resume the session by naming its sessionUuid in a tool call.`}}function K(s,n,o,a={}){let c=Il(s,n),d=o.daemonInstance===void 0?{}:{daemonInstance:o.daemonInstance},m=o.idleRelease&&c?U(c,s.getIdleReleaseExecutionVeto?.(n),s.getSessionLeaseState?.(n)?.phase):null,p=o.idleRelease&&c?{idleReleaseAt:m===null?null:P(s,m)}:{};return{success:!0,result:{sessionId:n,...a,...p,...d}}}function tr(s){return ru(s.livenessPolicy)&&s.livenessOwnerToken!==void 0}function re(s,n){if(s!==RD||!tr(n))return;return{success:!1,code:eF,error:`Session ${n.sessionId} is owned by an MCP proxy, which is the only liveness owner for its sessions, so this heartbeat was rejected and nothing changed. The external heartbeat keeper is for one-shot CLI sessions only. Let the harness's proxy keep the session alive and check its state with \`--daemon session-info ${n.sessionId}\`.`}}function Nt(s,n){return s===RD&&n.livenessPolicy==="cli-idle"}function Ft(s){return{success:!0,result:{sessionId:s,livenessPolicy:"cli-idle",livenessUnchanged:!0}}}function sr(s,n,o,{livenessOwnerToken:a,outcome:c}){let d=Il(s,o);if(c==="not-found"||!d||d!==n||Yi(s,o,d))return{success:!1,error:`Session not found: ${o}`,code:yc};let m=s.hasLivenessOwnership?.(o,a)??d.livenessOwnerToken===a;return rr(c==="claimed"&&!m?"superseded":c,o,d.livenessOwnerToken!==void 0,()=>s.getOwnerLeaseHold?.(o))}async function nr(s,n,o,a){if(a)return await s.claimLivenessOwnership?.(n,o)??"superseded";return(s.hasLivenessOwnership?.(n,o)??!1)||(s.claimUnownedLivenessOwnership?.(n,o)??!1)?"claimed":"superseded"}function rr(s,n,o,a){if(s==="conflict"){let c=a();return{success:!1,code:nw,error:`Session ${n} is owned by another liveness owner whose lease is still live, so this claim was rejected and nothing changed. Retry after the owner's lease expires, or claim with the owner's stable token.`,...c?{result:{liveness:c}}:{}}}if(s==="superseded"&&!o)return{success:!1,code:Dh,error:`Session ${n}'s liveness is unowned. Explicitly claim ownership before sending keeper ticks; nothing changed.`};if(s==="superseded")return{success:!1,code:Ch,error:`The token no longer owns session ${n}'s liveness. Another token has claimed it since. Re-claim with a fresh token and --claim-liveness-ownership once that owner's lease expires, or stop the keeper.`};return}function or(s,n){return{idleRelease:s?.reportIdleRelease===!0,...s?.reportDaemonInstance===!0?{daemonInstance:n}:{}}}function ar(s){return typeof s?.livenessOwnerToken==="string"&&s.livenessOwnerToken.length>0?s.livenessOwnerToken:void 0}function lr(s){if(s.params?.livenessPolicy===Eg&&Il(s.manager,s.sessionId)?.livenessPolicy===ni)return s.manager.recordHeartbeat?.(s.sessionId),K(s.manager,s.sessionId,s.report,{livenessPolicy:ni,livenessUnchanged:!0});if(s.params?.livenessPolicy===Eg)return s.manager.adoptCliLivenessPolicy?.(s.sessionId,s.params.idleTimeoutMs),K(s.manager,s.sessionId,s.report,{livenessPolicy:"cli-idle",idleTimeoutMs:Il(s.manager,s.sessionId)?.heartbeatTimeoutMs});return}var be="daemon/capabilities",cr="input/typeText.mode:append",dr="input/gestureStream";async function YN(s,n,o={}){if(!s.method.startsWith("daemon/"))return{success:!1,error:`Unsupported daemon method: ${s.method}`};if(s.method===be)return ur(n);if(!n.isInitialized())return{success:!1,error:"Daemon not initialized"};return fr(s,n,o)}async function ur(s){let n=await mr(s);return{success:!0,result:{...n?{bindingRegistry:n}:{},capabilities:[cr,dr,nR,...s.isSessionBrokerMode?.()?[qZ,HZ]:[]]}}}async function mr(s){if(!s.isSessionBrokerMode?.())return;try{return await s.getBindingRegistrySchemaProbe?.()?.describeSchema()}catch(n){if(e.warn("[Bindings] Cannot describe the open registry schema",n),n instanceof tn)return{schemaVersion:null,knownSchemaVersion:x4,supported:!1,writerVersion:null};return}}var pr=new Map([...Rt,[nR,Tt],[AB,Ct],[ms,_t],[TB,xt],["daemon/refreshDevices",(s,n,{context:o})=>gr(s,n,o)],["daemon/availableDevices",hr],["daemon/sessionInfo",(s,n)=>vr(s,n)],["daemon/activeSessions",(s,n)=>br(s,n)],[SD,(s,n,{executions:o,context:a})=>kr(s,n,o,a)],[one,Or],[Pz,Ir],[EB,Tr]]);async function fr(s,n,o){let a=pr.get(s.method);if(!a)return{success:!1,error:`Unsupported daemon method: ${s.method}`};return await a(s,n,{...o,context:o.context??{}})}async function qt(s){try{if(s.getRefreshedInventory){let{stats:n,deviceIds:o}=await s.getRefreshedInventory();return{ok:!0,stats:n,deviceIds:o}}return{ok:!0,stats:s.getRefreshedStats?await s.getRefreshedStats():s.getStats()}}catch(n){return e.warn(`[Daemon] Could not refresh device ownership: ${r(n)}`,n),{ok:!1,refusal:{success:!1,error:`Could not determine which devices are available: ${r(n)}. Resolve the cause and retry.`,...n instanceof ze?{code:n.code,retryable:n.retryable}:{}}}}}async function gr(s,n,o){let a=Yw({binding:n.getBrokerConnectionScopes?.().get(o.socketSessionId),action:s.method});if(a)return{success:!1,code:a.code,error:a.message};let c=n.getDevicePool(),d=c.refreshDevicesWithOutcome?await c.refreshDevicesWithOutcome():{addedCount:await c.refreshDevices()};if(d.failure!==void 0)return{success:!1,error:`Could not refresh device list: ${d.failure}. Resolve the cause and retry.`};let m=await qt(c);if(!m.ok)return m.refusal;let p=m.stats;return{success:!0,result:{addedDevices:d.addedCount,totalDevices:p.total,availableDevices:p.idle,stats:p}}}async function hr(s,n){let o=n.getDevicePool(),a=await qt(o);if(!a.ok)return a.refusal;let c=a.stats,d=o.getRecoveryPolicy?.(),m=o.getAllDevices?.().filter((p)=>!a.deviceIds||a.deviceIds.has(p.id)).map((p)=>({deviceId:p.id,platform:p.platform,recoveryEligibility:o.getRecoveryEligibility?.(p.id),...o.getDeviceHealthMarker?.(p.id)?{unhealthy:o.getDeviceHealthMarker(p.id)}:{}}));return{success:!0,result:{availableDevices:c.idle,totalDevices:c.total,assignedDevices:c.assigned,errorDevices:c.error,stats:c,...d?{recoveryPolicy:d}:{},...m?{devices:m}:{}}}}async function vr(s,n,o=G){let a=s.params?.sessionId;if(!a)return{success:!1,error:"sessionId parameter required"};let c=n.getSessionManager(),d=Il(c,a);if(!d)return se(c,a);return{success:!0,result:{sessionId:d.sessionId,assignedDevice:d.assignedDevice,...c0(d),platform:d.platform,createdAt:P(c,d.createdAt),lastUsedAt:P(c,d.lastUsedAt),expiresAt:P(c,d.expiresAt),cacheSize:JSON.stringify(d.cacheData).length,...le(d,o.getActiveDeviceSessionExecutionCount(a),c.getIdleReleaseExecutionVeto?.(a),{toWall:(m)=>P(c,m),leasePhase:c.getSessionLeaseState?.(a)?.phase}),...Rr(c.getSessionLeaseState?.(a)),...Yi(c,a,d)?{releasing:!0}:{}}}}function Rr(s){return s?{liveness:{state:s.phase,remainingMs:s.remainingMs}}:{}}async function br(s,n,o=G){let a=n.getSessionManager(),c=a.getAllSessions?.()??[],d=c.filter((p)=>Yi(a,p.sessionId,p)).length,m=s.params?.includeSessions===!0;return{success:!0,result:{activeSessions:c.length,activeExecutions:o.getActiveExecutionCount(),...d>0?{releasingSessions:d}:{},...m?{sessions:c.map((p)=>({sessionId:p.sessionId,assignedDevice:p.assignedDevice,...c0(p),platform:p.platform,...le(p,o.getActiveDeviceSessionExecutionCount(p.sessionId),a.getIdleReleaseExecutionVeto?.(p.sessionId),{toWall:(f)=>P(a,f),leasePhase:a.getSessionLeaseState?.(p.sessionId)?.phase}),...Yi(a,p.sessionId,p)?{releasing:!0}:{}}))}:{}}}}function $t(s,n,o,a){let c=s.getSessionManager(),d=jv({binding:s.getBrokerConnectionScopes?.().get(n.socketSessionId),action:o,deviceId:a.deviceId===void 0?void 0:hm(s.getDevicePool(),a.deviceId),requesterSessionUuid:a.sessionUuid,grantedDeviceOf:(m)=>c.getSession(m)?.assignedDevice??void 0});return d?{success:!1,code:d.code,error:d.message}:void 0}async function kr(s,n,o,a={}){let c=s.params,d=c?.sessionId;if(!d)return{success:!1,error:"sessionId parameter required"};let m=$t(n,a,SD,{sessionUuid:d});if(m)return m;let p=n.getSessionManager(),f=Dr(p,d,c?.livenessOwnerToken);if(f)return f;let S=p.getSession(d)??p.getReleasingSession?.(d);if(!S&&!p.hasSession(d))return await Ar(n,d,c?.requireKnown===!0,o);return Ut(n,p,d,{session:S,executions:o})}function Dr(s,n,o){if(typeof o!=="string"||o.length===0)return;if(!s.hasSession(n)&&!s.getReleasingSession?.(n))return;if((s.getSessionLivenessOwnerToken?s.getSessionLivenessOwnerToken(n):(s.getSession(n)??s.getReleasingSession?.(n))?.livenessOwnerToken)===o)return;return{success:!1,code:JA,error:`Session ${n} can only be released by its current liveness owner; nothing changed.`}}async function Ar(s,n,o,a){if(typeof n==="string"&&s.getObserverSessionRegistry?.()?.release(n))return{success:!0,result:{message:`Session ${n} released`,alreadyReleased:!1}};return await Er(s,s.getSessionManager(),n,{requireKnown:o,executions:a})}async function Ht(s,n,o){let a=n.getKeepAwakeRestoreReport?.(o),c={...a?{keepAwakeRestore:a}:{},...await jN(o,{registry:s.getScreenLockRegistry?.()}),...await KN(o,{registry:s.getPowerRegistry?.()})},d=nt(c);return{...c,...d?{cleanup:d}:{}}}async function Er(s,n,o,{requireKnown:a,executions:c}){if(!n.getTerminalReleaseSnapshot?.(o)){let d=await n.releaseSession(o),m=n.getSession(o)??n.getReleasingSession?.(o);if(m||n.hasSession(o))return Ut(s,n,o,{session:m,executions:c});if(d!==null&&d!==void 0){let p=s.getDevicePool();return p.releaseRehydrationReservation?.(o),await Zy(p,d,o),{success:!0,result:{message:`Session ${o} released`,device:d,alreadyReleased:!1}}}}return Pr(s,n,o,a)}async function Pr(s,n,o,a){let c=Boolean(n.getTerminalReleaseSnapshot?.(o))||await Re(n,o)!==void 0;if(a&&!c)return{success:!1,error:`Session ${o} is not a known session (never issued by this daemon, or its release record has expired). Run --daemon active-sessions to list held sessions.`,code:yc};let d=await Ht(s,n,o),m=d.cleanup==="failed"?"; cleanup failed":d.cleanup==="pending"?"; cleanup still pending":"";return{success:!0,result:{message:c?`Session ${o} already released${m}`:`Session ${o} is not known to this daemon (never issued, or its release record expired); nothing was released`,alreadyReleased:c,known:c,...d}}}async function Ut(s,n,o,{session:a,executions:c=G}){let d=s.getDevicePool(),m=a?.assignedDevice??n.getTerminalReleaseSnapshot?.(o)?.deviceId??null;return VI(c,{sessionId:o,baseSessionId:at(o,n),deviceId:m},new lc(o,"explicit-release")).catch((p)=>{e.warn(`Failed to cancel executions of explicitly released session ${o}: ${r(p)}`,p)}),await Ds({manager:n,pool:d},m,o,{release:async()=>(m=await n.releaseSession(o),m)}),{success:!0,result:{message:`Session ${o} released`,device:m,alreadyReleased:!1,...await Ht(s,n,o)}}}async function Or(s,n){let o=n.getDeviceSessionRegistry(),a=n.getDevicePool(),c=o.list().map((d)=>({deviceSessionUuid:d.deviceSessionUuid,deviceId:d.deviceId,platform:d.platform,epochStartedAt:d.epochStartedAt,...a.getDeviceHealthMarker?.(d.deviceId)?{unhealthy:a.getDeviceHealthMarker(d.deviceId)}:{},...a.isPooledIdentityUnresolved?.(d.deviceId)===!0?{identityUnresolved:!0}:{}}));return{success:!0,result:{deviceSessions:c,totalDeviceSessions:c.length}}}function jt(s){let n=s.getDevicePool(),o=s.getDeviceLeaseActivitySources?.();if(o)return Lt(o,n);let a=s.getSessionManager();return Lt(mq((c)=>a.getSessionForDevice?.(c)??O(n.getDevice?.(c))??null),n)}function Lt(s,n){return{...s,activeExecutionCount:(o)=>s.activeExecutionCount(o)+(n.isUnderShutdownReservation?.(o)?1:0)}}async function Ir(s,n){let o=g({deviceId:y().min(1)}).safeParse(s.params);if(!o.success)return{success:!1,error:`Invalid deviceLeaseStatus parameters: ${o.error.message}`};let{deviceId:a}=o.data,c=jt(n);return{success:!0,result:{pid:process.pid,deviceId:a,...GN(c,a)}}}async function Tr(s,n,{context:o}){let a=g({deviceId:y().min(1)}).safeParse(s.params);if(!a.success)return{success:!1,error:`Invalid relinquishDeviceLease parameters: ${a.error.message}`};let{deviceId:c}=a.data,d=$t(n,o,EB,{deviceId:c});if(d)return d;let m=jt(n),p=n.getDeviceLeaseRelinquishPort?.()??bt(),f={pid:process.pid,deviceId:c,...GN(m,c)},S=cne(f,p.idleMs);if(!S.release)return{success:!0,result:{...f,released:!1,reason:S.reason,...S.transient?{transient:!0}:{}}};return await p.release(c),{success:!0,result:{...f,released:!0,reason:S.reason}}}import{existsSync as ke}from"fs";import{platform as Vt}from"os";import{readFile as Cr}from"fs/promises";async function WI(s=i,n={}){let o=n.socketPath??Bt,a=n.pidFilePath??Sr,c=(n.platform??Vt())==="win32",d={timestamp:new Date().toISOString(),daemonRunning:!1,socketExists:!1,socketAccessible:!1,pidFileExists:!1,pidFileValid:!1,socketConnectable:!1,recommendations:[]};if(!c)if(d.socketExists=ke(o),!d.socketExists)d.recommendations.push("Socket file not found. Daemon may not be running.");else d.socketAccessible=!0;if(d.pidFileExists=ke(a),!d.pidFileExists){if(d.socketExists)d.recommendations.push("Socket exists but PID file missing. Daemon may be in bad state.")}else await xr(d,a,s);if(c||d.socketExists)await _r(d,o,c,{timer:s,...n});return Br(d),d}async function xr(s,n,o){try{let a=await Cr(n,"utf-8"),c=JSON.parse(a);s.pidFileValid=!0,s.daemonPid=c.pid,s.daemonPort=c.port;try{if(process.kill(c.pid,0),s.daemonRunning=!0,c.startedAt)s.daemonUptime=o.now()-new Date(c.startedAt).getTime()}catch(d){e.debug(`Daemon PID liveness probe failed: ${r(d)}`),s.recommendations.push(`PID file references process ${c.pid} which is not running. Daemon may have crashed. Stale PID file should be cleaned up.`)}}catch(a){if(a instanceof SyntaxError)e.warn("Daemon PID file check failed: invalid JSON");else e.warn(`Daemon PID file check failed: ${r(a)}`,a);s.recommendations.push(`PID file exists but is invalid or unreadable: ${a}`)}}async function _r(s,n,o,{timer:a,...c}){try{let d=await Da.isAvailable(n,{signal:c.signal,timeoutMs:c.timeoutMs,timer:a});if(s.socketConnectable=d,o)s.socketExists=d,s.socketAccessible=d;if(!d)s.recommendations.push(o?"Named pipe not found or not responding. Daemon may not be running.":"Socket file exists, but socket is not responding. Daemon may be stuck or unresponsive.");else if(!s.daemonRunning)s.daemonRunning=!0,s.recommendations.push("Daemon socket is responsive, but PID bookkeeping is stale or missing.")}catch(d){s.lastError=r(d),s.recommendations.push("Socket connection test failed. Daemon may be unresponsive or socket may be corrupted.")}}function Br(s){if(s.recommendations.length===0){if(s.daemonRunning&&s.socketConnectable)s.recommendations.push("Daemon is healthy and responsive.");else if(!s.daemonRunning&&!s.socketExists&&!s.pidFileExists)s.recommendations.push(`Daemon is not running. Start it with: bunx ${zs()} --daemon start`)}}function De(s){let n=[`
|
|
3
|
+
=== AutoMobile Daemon Health Report ===`,`Timestamp: ${s.timestamp}`,"","Status Summary:",` Daemon Running: ${s.daemonRunning?"\u2713 YES":"\u2717 NO"}`,` Socket File: ${s.socketExists?"\u2713 EXISTS":"\u2717 MISSING"}`,` Socket Accessible: ${s.socketAccessible?"\u2713 YES":"\u2717 NO"}`,` PID File: ${s.pidFileExists?"\u2713 EXISTS":"\u2717 MISSING"}`,` Socket Connectable: ${s.socketConnectable?"\u2713 YES":"\u2717 NO"}`,"","Details:"];if(s.daemonPid)n.push(` Daemon PID: ${s.daemonPid}`);if(s.daemonPort)n.push(` HTTP Port: ${s.daemonPort}`);if(s.daemonUptime){let o=Math.floor(s.daemonUptime/1000),a=Math.floor(o/60),c=Math.floor(a/60);if(c>0)n.push(` Uptime: ${c}h ${a%60}m ${o%60}s`);else if(a>0)n.push(` Uptime: ${a}m ${o%60}s`);else n.push(` Uptime: ${o}s`)}if(s.lastError)n.push(` Last Error: ${s.lastError}`);return n.push("","Recommendations:"),n.push(...s.recommendations.map((o)=>` \u2022 ${o}`)),n.push("","File Locations:"),n.push(` Socket: ${Bt}`),n.push(` PID: ${Sr}`),n.push("",`=== End Report ===
|
|
4
|
+
`),n.join(`
|
|
5
|
+
`)}async function Nr(s,n){try{return await(await import("fs/promises")).stat(s),n.socketReadable=!0,n.socketWritable=!0,!0}catch(o){return n.issues.push(`Cannot access socket file: ${o}`),!1}}async function Fr(s,n,o,a){try{let c=n.now(),d=await Da.isAvailable(s),m=n.now()-c;if(o)a.socketExists=d,a.socketReadable=d,a.socketWritable=d;if(d)a.socketConnectable=!0,a.connectionLatency=m;else a.issues.push(o?"Named pipe not found or not responding":"Socket connection test returned false")}catch(c){a.issues.push(`Connection failed: ${c}`)}}async function Wt(s=i,n={}){let o=n.socketPath??Bt,a=(n.platform??Vt())==="win32",c={socketExists:!a&&ke(o),socketReadable:!1,socketWritable:!1,socketConnectable:!1,issues:[],lastTestTime:new Date().toISOString()};if(!a&&!c.socketExists)return c.issues.push("Socket file does not exist"),c;if(!a&&!await Nr(o,c))return c;return await Fr(o,s,a,c),c}function Kt(s){let n=[`
|
|
6
|
+
=== Socket Diagnostics ===`,`Test Time: ${s.lastTestTime}`,"","Results:",` Socket Exists: ${s.socketExists?"\u2713":"\u2717"}`,` Socket Readable: ${s.socketReadable?"\u2713":"\u2717"}`,` Socket Writable: ${s.socketWritable?"\u2713":"\u2717"}`,` Socket Connectable: ${s.socketConnectable?"\u2713":"\u2717"}`];if(s.connectionLatency!==void 0)n.push(` Connection Latency: ${s.connectionLatency}ms`);if(s.issues.length>0)n.push("","Issues Found:"),n.push(...s.issues.map((o)=>` \u26A0 ${o}`));return n.push("","Socket Path:",` ${Bt}`),n.push("",`=== End Diagnostics ===
|
|
7
|
+
`),n.join(`
|
|
8
|
+
`)}var Ae={"--video-target-bitrate-kbps":{field:"videoTargetBitrateKbps",label:"video target bitrate",allowFloat:!1},"--video-max-throughput-mbps":{field:"videoMaxThroughputMbps",label:"video max throughput",allowFloat:!0},"--video-fps":{field:"videoFps",label:"video fps",allowFloat:!1},"--video-archive-size-mb":{field:"videoMaxArchiveSizeMb",label:"video max archive size",allowFloat:!0}},Ee={"--video-quality":"videoQualityPreset","--video-quality-preset":"videoQualityPreset","--video-format":"videoFormat","--accessibility-level":"accessibilityLevel","--a11y-level":"accessibilityLevel","--accessibility-failure-mode":"accessibilityFailureMode","--a11y-failure-mode":"accessibilityFailureMode","--accessibility-min-severity":"accessibilityMinSeverity","--a11y-min-severity":"accessibilityMinSeverity"},Pe={"--strict-port":"strictPort","--debug":"debug","--debug-perf":"debugPerf","--ui-perf-debug":"debugPerf","--network-mockable":"networkMockable","--embedded-sdk":"embeddedSdk","--dismiss-keyboard-after-input":"dismissKeyboardAfterInput","--no-ui-perf-mode":"noUiPerfMode","--no-navigation-screenshots":"noNavigationScreenshots","--no-waitfor-polling-overhead":"noWaitForPollingOverhead","--no-occlusion":"noOcclusion","--no-include-not-important-views":"noA11yIncludeNotImportantViews","--no-report-view-ids":"noA11yReportViewIds","--no-retrieve-interactive-windows":"noA11yRetrieveInteractiveWindows","--mem-perf-audit":"memPerfAudit","--accessibility-audit":"accessibilityAudit","--accessibility-use-baseline":"accessibilityUseBaseline","--a11y-use-baseline":"accessibilityUseBaseline","--predictive-ui":"predictiveUi","--predictive":"predictiveUi","--raw-element-search":"rawElementSearch","--skip-ctrl-proxy-download":"skipCtrlProxyDownload","--skip-accessibility-download":"skipCtrlProxyDownload","--tool-call-recording":"toolCallRecording","--observe-result-include-elements":"observeResultIncludeElements","--tool-results-no-structured-content":"toolResultsNoStructuredContent","--actions-diff-observe":"actionsDiffObserve","--actions-no-observe":"actionsNoObserve"};function Lr(s){return s!==void 0&&!s.startsWith("--")}function qr(s,n){if(!n)return!1;return s.host=n,!0}function $r(s,n){if(n!=="global"&&n!=="session")return!1;return s.planExecutionLockScope=n,!0}function Hr(s,n){let o=cb(n);if(o===void 0)return!1;return s.runnerReadinessTimeoutMs=o,!0}function zt(s,n){if(!n)return!1;return s.toolOutputsDir=n,!0}function Gt(s,n,o){if(!n)return!1;return s[o]=[...s[o]??[],n],!0}var Oe={"--host":qr,"--plan-execution-lock-scope":$r,[sb]:Hr,[f_]:zt,[h_]:zt,"--enable-tool":(s,n)=>Gt(s,n,"enabledTools"),"--disable-tool":(s,n)=>Gt(s,n,"disabledTools")};function Yt({value:s,inline:n}){return s!==void 0&&(n||Lr(s))}function Ur(s,n,o,a){let{value:c}=n,d=Yt(n),m=Object.hasOwn(Ae,s)?Ae[s]:void 0;if(m)return o[m.field]=y_(c,m.label,m.allowFloat,a),d;let p=Object.hasOwn(Ee,s)?Ee[s]:void 0;if(p){if(d)o[p]=c;return d}if(s==="--port")return o.port=L0(c,a),d;return}function jr(s,n,o,a){let c=Ur(s,n,o,a);if(c!==void 0)return c;let d=Object.hasOwn(Oe,s)?Oe[s]:void 0;if(!d)return;let{value:m}=n,p=Yt(n),f=d(o,p?m:void 0);if(!f&&p)a.warn(`Ignoring invalid value for ${s}: ${m}`);return f}function Vr(s,n,o,a){let c=jr(s,n,o,a);if(c!==void 0)return c;let d=Object.hasOwn(Pe,s)?Pe[s]:void 0;if(d){let m=Ks(n.inline?n.value:void 0);if(m===void 0)a.warn(`Invalid value for ${s}: ${n.value}; expected true or false`);else o[d]=m}return!1}function Wr(s,n,o){for(let a=0;a<s.length&&s[a]!==h$;a++){let c=Sf(s,a);if(Vr(c.flag,c,n,o))a=c.last}}function Jt(s,n=process.env,o=e){let a=g$(s,n)?{skipCtrlProxyDownload:!0}:{},c=U0(s,n).actionsCompactMetadata;if(c!==void 0)a.actionsCompactMetadata=c;a.toolOutputsDir=D0([],n,Ld());let d=$0(s,n),m=B0(s);if(d.length>0||m)a.eventAllMarkers=d,a.eventAllMarkersCliOverride=m;let p=cb(n[ID]??n.AUTO_MOBILE_RUNNER_READINESS_TIMEOUT_MS);if(p!==void 0)a.runnerReadinessTimeoutMs=p;return Wr(s,a,o),a}var Kr=[Yc,"--daemon-socket-path"],zr=[Vk,r9,"--headless",...dp.flatMap((s)=>s.disableCli?[s.cli,s.disableCli]:[s.cli])],Gr=new Set(["--port",...Object.keys(Ae),...Object.keys(Ee),...Object.keys(Oe),...Kr]),Yr=new Set([...Object.keys(Pe),...zr]);function Jr(s,n){let{flag:o,inlineValue:a}=ki(s);if(!n(o))return{kind:"option",argument:s};return Ks(a)===void 0?{kind:"value",argument:s}:void 0}function Qt(s,n){let o=(p)=>n.launchFlags&&Gr.has(p)||(n.valueFlags?.includes(p)??!1),a=(p)=>n.launchFlags&&Yr.has(p)||(n.booleanFlags?.includes(p)??!1),c=n.positionals??0,d=0,m=!1;for(let p=0;p<s.length;p++){let f=s[p];if(f==="")continue;if(f===h$&&!m)m=!0;else if(m||!f.startsWith("-")){if(d++,d>c)return{kind:"positional",argument:f}}else if(o(ki(f).flag))p=Sf(s,p).last;else{let S=Jr(f,a);if(S)return S}}return}var Qr="ide/setFeatureFlag",Xr="Usage: set-feature-flag <key> <true|false> [--json]";function Zr(s){return $w.some((n)=>n.key===s)}function Xt(s){if(s.length!==2)throw new t(Xr);let[n,o]=s;if(!Zr(n)){let c=$w.map((d)=>d.key).join(", ");throw new t(`Unknown feature flag: ${n}. Known flags: ${c}`)}let a=Ks(o);if(a===void 0)throw new t(`Invalid value for feature flag ${n}: ${o}; expected true or false`);return{key:n,enabled:a}}async function Zt(s,n){try{return await n.connect(),await n.callDaemonMethod(Qr,{key:s.key,enabled:s.enabled})}finally{await n.close()}}import{join as eo}from"path";var to={lockDir:lk,listFiles:(s)=>$i(s),readLock:$l,isProcessRunning:(s)=>st(s)};function S4(s=to){let n,o;try{n=s.lockDir(),o=s.listFiles(n)}catch(a){return e.warn(`Cannot list CtrlProxy forwarding leases: ${r(a)}`,a),[]}return o.flatMap((a)=>{let c=_B(a),d=c===void 0?void 0:s.readLock(eo(n,a));if(c===void 0||!d||Number.isNaN(d.pid))return[];let m=dk(d.metadata);return[{deviceId:c,pid:d.pid,alive:s.isProcessRunning(d.pid),...m?{socketPath:m.socketPath,acquiredAt:m.acquiredAt}:{}}]})}function so(s){if(!s)return"session unknown (no socket recorded)";switch(s.kind){case"status":return s.status.sessionId===null?"no live session":`live session ${s.status.sessionId}`;case"unreachable":return`socket unreachable (${s.detail})`;case"no-response":case"unsupported":return`session unknown (${s.detail})`}}async function es(s,n=S4(),o=new sR,a=i){let c=n.filter((m)=>m.pid!==s),d=await Promise.all(c.map(async(m)=>{let p=m.alive&&m.socketPath?await o.query(m.socketPath,m.deviceId):void 0,f=m.acquiredAt===void 0?"age unknown":`held ${Math.max(0,Math.round((a.now()-m.acquiredAt)/1000))}s`,S=m.alive?so(p):"process gone (reclaimable)";return` - ${m.deviceId}: PID ${m.pid}, socket ${m.socketPath??"unknown"}, ${f}, ${S}`}));return d.length===0?[]:["CtrlProxy forwarding leases held by other processes:",...d]}var q="--allow-shared-namespace",ss=h.ALLOW_SHARED_DAEMON_NAMESPACE.name,ts="shared_daemon_namespace",no=[["AUTOMOBILE_DATA_DIR","AUTO_MOBILE_DATA_DIR"],["AUTOMOBILE_DB_DIR","AUTO_MOBILE_DB_DIR"],["AUTOMOBILE_DB_PATH","AUTO_MOBILE_DB_PATH"]];function oo(s){return no.flatMap(([n,o])=>{if(s[n]?.trim())return[n];return s[o]?.trim()?[o]:[]})}function w4(s){return Ag("sock",s)!==Ag("sock",{})}class ns extends t{code=ts;nextAction;constructor(s,n,o){let a=`Set AUTOMOBILE_AUX_SOCKET_DIR (or AUTOMOBILE_DAEMON_SOCKET_PATH, AUTOMOBILE_DAEMON_PID_FILE_PATH and AUTOMOBILE_DAEMON_LOCK_FILE_PATH) to target a private daemon, or pass ${q} (or set ${ss}=1) to act on the shared daemon deliberately.`;super(`Refusing to ${s}: ${n.join(", ")} ${n.length===1?"is":"are"} set, but AUTOMOBILE_AUX_SOCKET_DIR and AUTOMOBILE_DAEMON_SOCKET_PATH are not, so this would act on the shared daemon at ${o}, which runs on different state. ${a} [${ts}]`);this.nextAction=a}}function gq(s,n,o=!1){if(o||n[ss]?.trim()==="1")return;let a=oo(n);if(a.length===0||w4(n))return;throw new ns(s,a,Ag("sock",n))}class CA extends ge{attemptTimeoutMs;constructor(s){super(`Daemon connection attempt did not settle within ${s}ms`);this.attemptTimeoutMs=s;this.name="DaemonConnectAttemptStalledError"}}class gm extends ge{cause;constructor(s){super(s.message);this.cause=s;this.name="DaemonPreflightConnectionError"}}var io="daemon/prepareSession",xe="daemon/sessionRequestStatus",is="daemon/abandonSessionRequest",yq="daemon/releaseBrokerSession",lo="daemon/capabilities",Me=5000,co=250,uo=15000,mo=1000;function C(s,n,o){return{code:s,message:n,retryable:o}}function B(s,n,o=!1){return{contractVersion:1,requestId:s.requestId,outcome:"failed",sessionUuid:null,profile:null,cleanupPending:o,failure:n}}function oe(s,n){return{contractVersion:1,requestId:s.requestId,outcome:"pending",sessionUuid:null,profile:null,cleanupPending:!0,failure:C("session_status_unresolved",n,!0)}}function po(s,n){if(!s||typeof s!=="object")return!1;let o=s;return!(o.contractVersion!==1||o.requestId!==n||!["ready","pending","released","failed"].includes(String(o.outcome))||typeof o.cleanupPending!=="boolean"||!(o.sessionUuid===null||typeof o.sessionUuid==="string")||!(o.profile===null||typeof o.profile==="object"))}function as(s,n){if(!po(s,n))return!1;if(s.outcome==="ready")return typeof s.sessionUuid==="string"&&s.sessionUuid.trim().length>0&&typeof s.profile==="object"&&s.profile!==null;return!0}function fo(s,n){if(!s||typeof s!=="object")return!1;let o=s;return o.sessionUuid===n&&["released","cleanup_pending","unknown_session"].includes(String(o.outcome))}function ls(s,n){return B(s,C("timeout",`Session preparation did not finish within its deadline: ${r(n)}`,!0))}function go(s){return s instanceof ge&&(s.constructor===ge||s instanceof CA||s instanceof gm)}async function cs(s,n,o,a){let c=Math.min(n,s.timer.now()+wz);for(;;)try{await l(()=>s.ensureConnected(),{timer:s.timer,timeoutMs:Math.max(1,c-s.timer.now()),signal:o,label:a});return}catch(d){let m=Math.min(mo,c-s.timer.now());if(o?.aborted||!go(d)||m<=0)throw d;e.debug(`[SessionBroker] ${a} failed; retrying: ${r(d)}`,d),await us(s.timer,m,o)}}async function ho(s,n,o,a){try{let c=await n.callDaemonMethod(xe,{requestId:s.requestId,livenessOwnerToken:n.livenessOwnerToken},{timeoutMs:o,signal:a});return as(c,s.requestId)?c:void 0}catch(c){if(!a?.aborted)e.debug(`[SessionBroker] Same-request status check failed: ${r(c)}`,c);return}}var ds=Symbol("daemon-unreachable");async function So(s,n,o,a){let c=o-n.timer.now();try{await l(()=>n.ensureConnected(),{timer:n.timer,timeoutMs:Math.max(1,Math.min(Me,c)),signal:a,label:"session broker status connection"})}catch(d){if(!a?.aborted)e.debug(`[SessionBroker] Status reconnect failed: ${r(d)}`,d);return ds}if(a?.aborted||n.timer.now()>=o)return;return ho(s,n,Math.max(1,Math.min(Me,o-n.timer.now())),a)}function vo(s,n,o,a){if(n!==ds){if(s.unreachableSinceMs=void 0,n&&n.outcome!=="pending")return n;s.last=n??s.last;return}if(s.unreachableSinceMs??=a.timer.now(),a.timer.now()-s.unreachableSinceMs<wz)return;return s.last??oe(o,`The daemon stayed unreachable for ${wz}ms; status recovery must keep the same requestId and liveness owner token.`)}async function rs(s,n,o,{signal:a,initial:c}={}){let d={last:c,unreachableSinceMs:void 0};while(!a?.aborted&&n.timer.now()<o){let m=await So(s,n,o,a);if(a?.aborted)break;let p=vo(d,m,s,n);if(p)return p;let f=Math.min(co,o-n.timer.now());if(f>0)await n.timer.sleep(f)}return d.last??oe(s,"The daemon may still be preparing this request; status recovery must keep the same requestId and liveness owner token.")}async function _e(s,n,o){try{let a=n.releaseSession(s),c=o===void 0?await a:await l(a,{timer:n.timer,timeoutMs:Math.max(1,o-n.timer.now()),label:`session broker release of unheld session ${s}`});return!fo(c,s)||c.outcome!=="released"}catch(a){return e.warn(`[SessionBroker] Releasing unheld session ${s} failed: ${r(a)}`,a),!0}}class Te extends Error{constructor(s){super(`Session ownership was not established within the remaining ${s}ms`);this.name="OwnershipHoldDeadlineError"}}function yo(s,n,o){s.then(async()=>{e.warn(`[SessionBroker] Ownership of ${n} was established after acquisition ended; releasing it.`),await _e(n,o)},(a)=>{e.debug(`[SessionBroker] Late hold of ${n} failed after acquisition ended: ${r(a)}`)})}function os(s,n,o){if(o?.aborted)return"cancelled";return s.timer.now()>=n?"timeout":void 0}async function Ie(s,n,o,{end:a,deadlineMs:c}){let d=s.sessionUuid;if(n)yo(n,d,o);let m=await _e(d,o,c);return B({requestId:s.requestId},a==="cancelled"?C("cancelled","The proxy shut down before session ownership was established.",!0):C("timeout","Session preparation did not finish within its deadline: ownership was not established.",!0),m)}async function wo(s,n,o,a){let c=s.sessionUuid;return e.warn(`[SessionBroker] Holding session ${c} failed: ${r(o)}`,o),B({requestId:s.requestId},C("session_hold_failed",`The prepared session could not be held: ${r(o)}`,!0),await _e(c,n,a))}async function Ro(s,n,o,a){if(s.outcome!=="ready")return s;let c=s.sessionUuid,d=os(n,o,a);if(d)return Ie(s,void 0,n,{end:d,deadlineMs:o});let m=o-n.timer.now(),p=n.holdSession(s.requestId,c);try{await l(p,{timer:n.timer,timeoutMs:m,signal:a,label:`session broker ownership hold for ${c}`,timeoutError:()=>new Te(m)})}catch(S){let w=a?.aborted?"cancelled":S instanceof Te?"timeout":void 0;if(!w)return wo(s,n,S,o);return e.warn(`[SessionBroker] Holding session ${c} did not finish before acquisition ended: ${r(S)}`,S),Ie(s,p,n,{end:w,deadlineMs:o})}let f=os(n,o,a);return f?Ie(s,void 0,n,{end:f,deadlineMs:o}):s}async function bo(s,n,o){let a=await s.callDaemonMethod(lo,{},{timeoutMs:n,signal:o}),c=Array.isArray(a?.capabilities)?a.capabilities.filter((d)=>typeof d==="string"):[];return kQ(c)}function ko(s){if(typeof s!=="object"||s===null||!("code"in s)||s.code!=="session_broker_stopping"&&s.code!=="session_broker_maintenance")return;let n="retryAfterMs"in s?s.retryAfterMs:void 0;return typeof n==="number"&&Number.isFinite(n)&&n>=0?Math.max(1,n):tl}function us(s,n,o){return new Promise((a,c)=>{o?.throwIfAborted();let d=()=>{s.clearTimeout(m),o?.removeEventListener("abort",d),c(o?.reason)},m=s.setTimeout(()=>{o?.removeEventListener("abort",d),a()},n);if(o?.addEventListener("abort",d,{once:!0}),o?.aborted)d()})}async function Do(s,n,o,{deadlineMs:a,signal:c,retryAfterMs:d}){let m=Math.floor(a-n.timer.now()-o);if(d!==void 0&&m>0){let p=Math.min(d,Math.max(0,a-n.timer.now()));if(await us(n.timer,p,c),m=Math.floor(a-n.timer.now()-o),m<=0)return Ce(s,d);try{await cs(n,a-o,c,"session broker retry daemon connection")}catch(f){if(c?.aborted)return e.debug("[SessionBroker] Retry reconnect cancelled during proxy shutdown.",f),oe(s,"Session preparation was cancelled during proxy shutdown.");if(n.timer.now()>=a-o)return e.debug("[SessionBroker] Retry reconnect exhausted the preparation budget.",f),Ce(s,d);let S=`Session preparation could not reconnect to the daemon after a stopping refusal: ${r(f)}`;return e.warn(S,f),B(s,C("daemon_unavailable",S,!0))}m=Math.floor(a-n.timer.now()-o)}return m}function Ce(s,n){return n===void 0?ls(s,Error(tQ)):B(s,C("session_broker_stopping","The session broker kept stopping until no preparation budget remained.",!0))}async function Ao(s,n,o,{deadlineMs:a,signal:c}){let{executionOwnerStartIdentity:d,...m}=s,p={config:m,livenessOwnerToken:n.livenessOwnerToken},f;while(!0){let S;try{let R=await Do(s,n,o,{deadlineMs:a,signal:c,retryAfterMs:f});if(typeof R!=="number")return R;if(R<=0)return Ce(s,f);S=await n.callDaemonMethod(io,p,{timeoutMs:Math.max(1,R),signal:c,cancelOnTimeout:!1})}catch(R){if(c?.aborted)return oe(s,"Session preparation was cancelled during proxy shutdown.");if(f=ko(R),f!==void 0){e.debug(`[SessionBroker] Prepare refused while stopping or maintaining snapshots; retrying in ${f}ms.`,R);continue}return e.warn(`[SessionBroker] Prepare reply was not received; checking request ${s.requestId}: ${r(R)}`,R),rs(s,n,a,{signal:c})}let w=as(S,s.requestId)?S:void 0;return w!==void 0&&w.outcome!=="pending"?w:await rs(s,n,a,{signal:c,initial:w})}}function Eo(s,n,o){if(n instanceof Mr)return ls(s,n);let a=o?.aborted===!0;return B(s,C(a?"cancelled":"daemon_unavailable",a?"The proxy shut down while preparing its session.":`Session preparation could not reach the daemon: ${r(n)}`,!0))}async function DZ(s,n,o){let a=s.preparationTimeoutMs??ao,c=n.timer.now()+a,d=()=>c-n.timer.now();try{if(await cs(n,c,o,"session broker daemon connection"),!await bo(n,Math.max(1,Math.min(Me,d())),o))return B(s,C("contract_unsupported","The running daemon does not advertise session-broker/v1; nothing was changed.",!1));let m=Math.min(uo,Math.max(1,Math.floor(a/4))),p=await Ao(s,n,m,{deadlineMs:c,signal:o});return await Ro(p,n,c,o)}catch(m){let p=Eo(s,m,o);return e.warn(`[SessionBroker] Acquisition failed (${p.failure?.code})`,m),p}}var Po=5000,fs=240000,Oo=y().uuid();function ie(s){return`Usage: ${s} ${s==="release-broker-session"?"<session-uuid>":"<request-id>"} --liveness-owner-token <token> --json`}function Io(s,n,o){let a=s[n];if(!a||a==="--")return;let{flag:c,inlineValue:d}=ki(a);if(c==="--json"){if(o.json||Ks(d)!==!0)return;return o.json=!0,n}if(c==="--liveness-owner-token"){let p=Sf(s,n),f=p.value?.trim();if(o.livenessOwnerToken!==void 0||!f)return;return o.livenessOwnerToken=f,p.last}let m=a.trim();if([a.startsWith("-"),o.identity!==void 0,!m].some(Boolean))return;return o.identity=m,n}function gs(s,n){let o={json:!1};for(let a=0;a<n.length;a++){let c=Io(n,a,o);if(c===void 0)return;a=c}if(!o.identity||!o.livenessOwnerToken||!o.json||s==="release-broker-session"&&!Oo.safeParse(o.identity).success)return;return{identity:o.identity,livenessOwnerToken:o.livenessOwnerToken}}function hs(s,n){return gs(s,n)!==void 0}function Be(s,n){let o=gs(s,n);if(!o)throw new t(ie(s));return o}function H(s){return s!==null&&typeof s==="object"&&!Array.isArray(s)}function Mo(s){return s===void 0||H(s)&&typeof s.code==="string"&&s.code.length>0&&typeof s.message==="string"&&typeof s.retryable==="boolean"}function Ss(s,n){if(!H(s))return!1;let{outcome:o,sessionUuid:a,profile:c}=s;if(![s.contractVersion===1,s.requestId===n,["ready","pending","released","failed"].includes(String(o)),a===null||typeof a==="string"&&a.length>0,c===null||H(c),typeof s.cleanupPending==="boolean",Mo(s.failure)].every(Boolean))return!1;return o!=="ready"||typeof a==="string"&&H(c)}function To(s,n){if(!H(s))return!1;return[s.sessionUuid===n,["released","cleanup_pending","unknown_session"].includes(String(s.outcome))].every(Boolean)}function Ne(s,n){let o=(c)=>typeof c==="string"?c.replaceAll(n,"[REDACTED]"):c,a=H(s)?s:{};return Object.assign(new t(String(o(r(s)))),{code:o(a.code),nextAction:o(a.nextAction),retryable:a.retryable,retryAfterMs:a.retryAfterMs,releaseReason:o(a.releaseReason),idle:a.idle})}async function Fe(s,n,o,a){let c=s();try{return await c.connect(),await c.callDaemonMethod(n,o,{timeoutMs:a})}finally{await c.close()}}async function vs(s,n){let o=Be("session-request-status",s);try{let a=await Fe(n,xe,{requestId:o.identity,livenessOwnerToken:o.livenessOwnerToken},Po);if(!Ss(a,o.identity))throw new t("Invalid daemon session-request-status result");return a}catch(a){throw Ne(a,o.livenessOwnerToken)}}async function ys(s,n){let o=Be("abandon-session-request",s);try{let a=await Fe(n,is,{requestId:o.identity,livenessOwnerToken:o.livenessOwnerToken},fs);if(!Ss(a,o.identity))throw new t("Invalid daemon abandon-session-request result");return a}catch(a){throw Ne(a,o.livenessOwnerToken)}}async function ws(s,n){let o=Be("release-broker-session",s);try{let a=await Fe(n,yq,{sessionId:o.identity,livenessOwnerToken:o.livenessOwnerToken},fs);if(!To(a,o.identity))throw new t("Invalid daemon release-broker-session result");return a}catch(a){throw Ne(a,o.livenessOwnerToken)}}var Co=5000,Le="Usage: capabilities --json";function qe(s){if(s.length!==1)return!1;let{flag:n,inlineValue:o}=ki(s[0]);return n==="--json"&&Ks(o)===!0}function xo(s){if(s===null||typeof s!=="object"||Array.isArray(s))return!1;let n=s.capabilities;return Array.isArray(n)&&n.every((o)=>typeof o==="string")}async function Rs(s,n){if(!qe(s))throw new t(Le);let o=n();try{await o.connect();let a=await o.callDaemonMethod(be,{},{timeoutMs:Co});if(!xo(a))throw new t("Invalid daemon capabilities result");return a}finally{await o.close()}}var D="--json";function $e(s){let n=s[0];if(!n)throw new t("heartbeat requires a session ID argument");let o,a=!1;for(let c=1;c<s.length;c++){let{flag:d,inlineValue:m}=ki(s[c]);switch(d){case"--liveness-owner-token":{let p=Sf(s,c);if(!p.value)throw new t("--liveness-owner-token requires a non-empty value");o=p.value,c=p.last;break}case"--claim-liveness-ownership":{let p=Ks(m);if(p===void 0)throw new t(`Invalid value for --claim-liveness-ownership: ${m}; expected true or false`);a=p;break}default:throw new t(`Unknown heartbeat option: ${s[c]}`)}}if(a&&!o)throw new t("--claim-liveness-ownership requires --liveness-owner-token");return{sessionId:n,livenessOwnerToken:o,claimLivenessOwnership:a}}function As(s){let n=KR(s,["--maintenance-token"])?.value;if(!n)throw new t("--maintenance-token requires a non-empty value");return n}function Es(s){let n=(c)=>{let d=KR(s,[c])?.value;if(!d)throw new t(`${c} requires a non-empty value`);return d},o=n("--platform");if(o!=="android"&&o!=="ios")throw new t("--platform must be android or ios");let a=Number(n("--expires-at"));if(!Number.isFinite(a)||a<=0)throw new t("--expires-at must be a positive finite timestamp");return{sessionUuid:n("--session-uuid"),platform:o,stableDeviceId:n("--stable-device-id"),controls:{androidSiblingAvdName:n("--android-sibling-avd-name"),androidDuplicateSerial:n("--android-duplicate-serial"),iosSameNameSiblingUdid:n("--ios-same-name-sibling-uuid")},expiresAt:a}}function He(s){if(s.length!==3||!s[0]||s[1]!=="--liveness-owner-token"||!s[2]?.trim()||s[2].startsWith("--"))throw new t("Usage: release-liveness-ownership <session> --liveness-owner-token <token>");return{sessionId:s[0],livenessOwnerToken:s[2]}}function R4(s){je(s===void 0?"Missing daemon command.":`Unknown daemon command: ${s}`)}var _o=["--session-uuid","--platform","--stable-device-id","--android-sibling-avd-name","--android-duplicate-serial","--ios-same-name-sibling-uuid","--expires-at"],bs={start:{launchFlags:!0},stop:{launchFlags:!0},restart:{launchFlags:!0},"restart-admitted":{launchFlags:!0,valueFlags:["--maintenance-token"]},"restart-acceptance-session":{launchFlags:!1,valueFlags:_o},status:{launchFlags:!0,booleanFlags:[D]},capabilities:{launchFlags:!1,booleanFlags:[D]},health:{launchFlags:!0},diagnose:{launchFlags:!0},"available-devices":{launchFlags:!0,booleanFlags:[D]},"active-sessions":{launchFlags:!0,booleanFlags:[D]},"session-info":{launchFlags:!1,booleanFlags:[D],positionals:1},"release-session":{launchFlags:!1,booleanFlags:[D],positionals:1},"set-feature-flag":{launchFlags:!1,booleanFlags:[D],positionals:2},"session-request-status":{launchFlags:!1,valueFlags:["--liveness-owner-token"],booleanFlags:[D],positionals:1},"abandon-session-request":{launchFlags:!1,valueFlags:["--liveness-owner-token"],booleanFlags:[D],positionals:1},"release-broker-session":{launchFlags:!1,valueFlags:["--liveness-owner-token"],booleanFlags:[D],positionals:1}};function ks(s){return["session-request-status","abandon-session-request","release-broker-session"].includes(s)}function Ue(s,n){let o=Object.hasOwn(bs,s)?bs[s]:void 0;if(!o)return;let a=Qt(n,o);if(!a){if(s==="capabilities"&&!qe(n))return Le;if(ks(s)&&!hs(s,n))return ie(s);return}if(ks(s))return ie(s);if(a.kind==="positional")return`Unexpected argument for daemon ${s}: ${a.argument}`;return a.kind==="value"?`Invalid value for daemon ${s} option ${a.argument}; expected true or false`:`Unknown option for daemon ${s}: ${a.argument}`}function je(s){try{console.error(s),console.log(`
|
|
9
|
+
Available commands:`),console.log(" start Start the daemon"),console.log(" stop Stop the daemon"),console.log(" status Check daemon status"),console.log(" capabilities --json Query the existing daemon's capability contract"),console.log(" restart Restart the daemon"),console.log(" health Check daemon health"),console.log(" diagnose Run full diagnostics"),console.log(" available-devices Query device pool status"),console.log(" active-sessions List held sessions and why each holds its device"),console.log(" session-info <id> Get information about a session"),console.log(" release-session <id> Release a session and free its device"),console.log(" set-feature-flag <key> <true|false> Set a feature flag (e.g. device-condition) without the IDE"),console.log(" session-request-status <request-id> --liveness-owner-token <token> --json"),console.log(" abandon-session-request <request-id> --liveness-owner-token <token> --json"),console.log(" release-broker-session <session-uuid> --liveness-owner-token <token> --json"),console.log(" (capabilities requires --json; status, available-devices, active-sessions, session-info and release-session accept --json)"),console.log(" release-liveness-ownership <id> --liveness-owner-token <token> Hand off liveness; keep the device"),console.log(" heartbeat <id> Heartbeat a session (one-shot CLI: no-op; proxy-owned: refused)"),console.log(`
|
|
10
|
+
Options:`),console.log(` ${q} Let start/stop/restart/release act on the shared daemon while AUTOMOBILE_DATA_DIR or DB dirs are set without AUTOMOBILE_AUX_SOCKET_DIR`),process.exit(1)}catch(n){if(n instanceof t)console.error(`Error: ${n.message}`);else console.error(`Unexpected error: ${r(n)}`);process.exit(1)}}function Ve(s,n){let o=Jt(s);if(!n.startupToolDefaults)return o;return{...o,...n.startupToolDefaults.enabledTools!==void 0?{enabledTools:[...n.startupToolDefaults.enabledTools]}:{},...n.startupToolDefaults.disabledTools!==void 0?{disabledTools:[...n.startupToolDefaults.disabledTools]}:{}}}function Bo(s,n){let o=Ms(s),a=[` Build ID: ${o.buildId||"unknown"}`,` Entry Script: ${o.entryScript||"unknown"}`];if(!gc(n,o))a.push(`
|
|
11
|
+
\u26A0\uFE0F WARNING: the running daemon is a different build than this checkout:`,` daemon build=${ro(o)}`,` client build=${ro(n)}`,"\nRestart the daemon from this checkout (run `--daemon restart` with this same CLI) to align them.");return a}var Ts=(s,n,o)=>JSON.stringify({availableDevices:s?.idle??0,totalDevices:s?.total??0,assignedDevices:s?.assigned??0,errorDevices:s?.error??0,...n?{recoveryPolicy:n}:{},...o?{devices:o}:{}});function Ps(s){return Object.assign(new t(s),{code:"discovery_incomplete",retryable:!0})}function No(s){let n=s.poolStatus?.countUnknown;if(n)return`Device discovery for ${n.platforms?.join(", ")||"a pooled platform"} did not complete, so the pooled device count is unknown`;if(s.observationComplete===!1&&(s.devices?.length??0)===0)return"The booted-devices resource reports incomplete discovery and the pool has no devices, so the count is unknown";return}function Fo(s){let n=null;try{n=s?JSON.parse(s):null}catch(a){throw new t(`The booted-devices resource was not valid JSON: ${r(a)}`)}if(typeof n?.error==="string")throw new t(`The booted-devices resource reported an error: ${n.error}`);if(!n?.poolStatus)throw Ps("The booted-devices resource carried no pool status, so the device count is unknown (discovery_incomplete); retry once the daemon finishes discovery.");let o=No(n);if(o)throw Ps(`${o} (discovery_incomplete); retry once the daemon finishes discovery.`);console.log(Ts(n.poolStatus,n.poolStatus.recoveryPolicy,n.devices?.map((a)=>({deviceId:a.runtime?.deviceId??"unknown",platform:a.platform,recoveryEligibility:a.recoveryEligibility}))))}function Os(s){return!s.running&&s.recovery!==void 0}function Lo(s,n){if(s.recovery)console.log(` Identity recovery: ${s.recovery.state}${s.recovery.reason?` (${s.recovery.reason})`:""}`);if(s.running){console.log("Daemon is running"),console.log(` PID: ${s.pid}`),console.log(` Port: ${s.port}`),console.log(` Socket: ${s.socketPath}`),console.log(` Database: ${s.dbPath||"unknown"}`),console.log(` Version: ${s.version||"unknown"}`),console.log(` Started: ${s.startedAt?new Date(s.startedAt).toISOString():"unknown"}`);for(let a of Bo(s,Vo()))console.log(a);let o=n.findOtherDaemonProcesses(s.pid);if(o.length>0){console.log(`
|
|
12
|
+
\u26A0\uFE0F WARNING: Found ${o.length} other daemon process(es) from other worktrees:`);for(let a of o)console.log(` - PID ${a}`);console.log(`
|
|
13
|
+
These can cause device pool conflicts. Run 'bunx ${zs()} --daemon restart' to stop them.`)}}else if(s.recovery)console.log("Daemon socket is held by a process that is not an authenticated daemon");else console.log("Daemon is not running")}function Cs(s,n){let o=s.getSession(n);if(!o)throw new t(`Session not found: ${n}`);return o}function Is(s){return`Session ${s} is a one-shot CLI session: its idle window runs from tool calls, so this heartbeat changed nothing (no keeper is needed).`}function qo(s,n){let o=s.getSessionManager(),a=o.getSession(n)??o.getReleasingSession(n);if(!a||Yi(o,n,a))throw new t(`Session not found: ${n}`);let c=re(RD,a);if(c)throw new t(Bs(n,Object.assign(Error(c.error),{code:c.code})));if(a.livenessPolicy==="cli-idle")return!1;return o.recordHeartbeat(n),!0}async function z(s,n,o,a){try{switch(s){case"start":{await a.start(Ve(n,o));break}case"stop":await a.stop();break;case"restart":{await a.restart(Ve(n,o));break}case"restart-admitted":{await a.restartAdmitted(Ve(n,o),As(n));break}case"restart-acceptance-session":{await a.restartAcceptanceSession(Es(n));break}}}catch(c){if(c instanceof t)console.error(`Error: ${c.message}`);else console.error(`Unexpected error: ${r(c)}`);process.exit(1)}}async function $o(s,n){let o=await n.status();if(wf(s,[D])===!0)return console.log(JSON.stringify(o)),Os(o);Lo(o,n);for(let a of await es(o.running?o.pid:void 0))console.log(a);return Os(o)}async function We(s,n,o){let a=!1;try{switch(s){case"status":{a=await $o(n,o);break}case"health":{let c=await WI();if(console.log(De(c)),!c.daemonRunning||!c.socketConnectable)process.exit(1);break}case"diagnose":{console.log(`Running daemon diagnostics...
|
|
14
|
+
`);let c=await WI();console.log(De(c));let d=await Wt();if(console.log(Kt(d)),c.recommendations.length>0||d.issues.length>0)process.exit(1);break}}}catch(c){if(c instanceof t)console.error(`Error: ${c.message}`);else console.error(`Unexpected error: ${r(c)}`);process.exit(1)}if(a)process.exit(1)}function xs(s,n,o){let a=[s,n?"idle":void 0,o===void 0?void 0:`idle timeout ${o} ms`].filter(Boolean).join(", ");return a?` (released: ${a})`:""}function _s(s){return s!==null&&typeof s==="object"&&!Array.isArray(s)?s:void 0}class I extends t{code;nextAction;retryable;retryAfterMs;releaseReason;idle;idleTimeoutMs;details;detail;constructor(s,n){let o=(b)=>n!==null&&typeof n==="object"&&(b in n)?n[b]:void 0,a=o("code"),c=o("nextAction"),d=o("retryable"),m=o("retryAfterMs"),p=Ns(n),f=o("idle")===!0,S=S5(n),w=r(n),R=typeof a==="string"||typeof a==="number"?String(a):void 0,v=typeof c==="string"?c:void 0;super(`${s}: ${w}${xs(p,f,S)}${R?` [${R}]`:""}${v?` Next: ${v}`:""}`,{cause:n});this.detail=w,this.code=R,this.nextAction=v,this.retryable=typeof d==="boolean"?d:void 0,this.retryAfterMs=typeof m==="number"?m:void 0,this.releaseReason=p,this.idle=f?!0:void 0,this.idleTimeoutMs=S,this.details=_s(o("details"))}}function Uo(s){if(!(s instanceof I))return{ok:!1,error:r(s)};let n={code:s.code,nextAction:s.nextAction,retryable:s.retryable,retryAfterMs:s.retryAfterMs,releaseReason:s.releaseReason,idle:s.idle,idleTimeoutMs:s.idleTimeoutMs,details:s.details};return{ok:!1,error:s.detail,...Object.fromEntries(Object.entries(n).filter(([,o])=>o!==void 0))}}function N(s,n){if(n)console.log(JSON.stringify(Uo(s)));else if(s instanceof t)console.error(`Error: ${s.message}`);else console.error(`Unexpected error: ${r(s)}`);process.exit(1)}function Y(s){let n=s.indexOf("--"),o=n===-1?s:s.slice(0,n),a=n===-1?[]:s.slice(n+1);return{json:wf(o,[D])===!0,rest:[...o.filter((c)=>ki(c).flag!==D),...a]}}async function jo(s,n){let{json:o}=Y(s);try{let a=n.getDaemonState();if(a.isInitialized()){let c=a.getDevicePool(),{stats:d,deviceIds:m}=await c.getRefreshedInventory().catch((p)=>{throw new I("Failed to query available devices",p)});console.log(Ts(d,c.getRecoveryPolicy(),c.getAllDevices().filter((p)=>m.has(p.id)).map((p)=>({deviceId:p.id,platform:p.platform,recoveryEligibility:c.getRecoveryEligibility(p.id)}))));return}{let c=n.createClient();try{await c.connect();let m=(await c.readResource("automobile:devices/booted"))?.contents?.[0]?.text;Fo(m),await c.close()}catch(d){throw new I("Failed to query available devices",d)}}return}catch(a){N(a,o)}}async function Wo(s,n){let{json:o,rest:a}=Y(s);try{if(a.length===0)throw new t("session-info requires a session ID argument");let c=a[0],d=n.getDaemonState();if(d.isInitialized()){let m=d.getSessionManager(),p=Cs(m,c),f=U(p,m.getIdleReleaseExecutionVeto(c),m.getSessionLeaseState(c)?.phase);console.log(JSON.stringify({sessionId:p.sessionId,assignedDevice:p.assignedDevice,...c0(p),createdAt:p.createdAt,lastUsedAt:p.lastUsedAt,expiresAt:p.expiresAt,cacheSize:JSON.stringify(p.cacheData).length,idleReleaseAt:f===null?null:m.sessionClockToReportedWall(f)}));return}{let m=n.createClient();try{await m.connect();let p=await m.callDaemonMethod("daemon/sessionInfo",{sessionId:c});console.log(JSON.stringify(p)),await m.close()}catch(p){throw new I("Failed to get session info",p)}}return}catch(c){N(c,o)}}async function Ko(s,n){let{json:o}=Y(s);try{let a=n.createClient();try{await a.connect();let c=await a.callDaemonMethod("daemon/activeSessions",{includeSessions:!0});console.log(JSON.stringify(c)),await a.close()}catch(c){throw new I("Failed to query active sessions",c)}}catch(a){N(a,o)}}async function zo(s,n){let{json:o,rest:a}=Y(s);try{let c=Xt(a.filter((m)=>m!=="")),d;try{d=await Zt(c,n.createClient())}catch(m){throw new I(`Failed to set feature flag ${c.key}`,m)}if(o){console.log(JSON.stringify({ok:!0,flag:d}));return}console.log(`Feature flag ${c.key} is now ${c.enabled?"enabled":"disabled"}`)}catch(c){N(c,o)}}async function Go(s,n){try{let o=await Rs(s,()=>n.createClient());console.log(JSON.stringify(o))}catch(o){N(new I("Failed to query daemon capabilities",o),!0)}}var Jo=g({message:y(),alreadyReleased:te(),device:y().optional(),known:te().optional(),cleanup:A(["pending","failed"]).optional()});async function Qo(s,n){let{json:o,rest:a}=Y(s),c=(d,m,{device:p,known:f,cleanup:S}={})=>{if(o){console.log(JSON.stringify({ok:!0,sessionId:a[0],alreadyReleased:d,message:m,...p!==void 0?{device:p}:{},...f!==void 0?{known:f}:{},...S!==void 0?{cleanup:S}:{}}));return}if(console.log(m),S!==void 0)console.log(`Cleanup ${S}: the device may not be fully restored`);if(!d&&p!==void 0)console.log(`Device ${p} is now available`)};try{if(a.length===0)throw new t("release-session requires a session ID argument");let d=a[0],m=n.getDaemonState();if(m.isInitialized()){let p=m.getSessionManager(),f=m.getDevicePool(),w=Cs(p,d).assignedDevice;await Ds({manager:p,pool:f},w,d,{deferFailureFallback:!0}),c(!1,`Session ${d} released`,{device:w});return}{let p=n.createClient(),f=(S)=>Jo.safeParse(S).success;try{await p.connect(),await p.callDaemonMethod("daemon/releaseSession",{sessionId:d,requireKnown:!0}).then(async(S)=>{if(await p.close(),!f(S))throw new t("Invalid daemon release-session result");c(S.alreadyReleased,S.alreadyReleased?S.message:`Session ${d} released`,{device:S.device,known:S.known,cleanup:S.cleanup})})}catch(S){throw new I("Failed to release session",S)}}return}catch(d){N(d,o)}}async function Ke(s,n,o){try{let a=()=>o.createClient(),c=s==="session-request-status"?await vs(n,a):s==="abandon-session-request"?await ys(n,a):await ws(n,a);console.log(JSON.stringify(c))}catch(a){N(new I(s==="session-request-status"?"Failed to query broker session request status":s==="abandon-session-request"?"Failed to abandon broker session request":"Failed to release broker session",a),!0)}}function Bs(s,n){let o=n!==null&&typeof n==="object"&&"code"in n?n.code:void 0;if(o===Ch)return`The token no longer owns session ${s}'s liveness. Re-claim with a fresh --liveness-owner-token and --claim-liveness-ownership, or stop the keeper.`;if(o===Dh)return`Session ${s}'s liveness is unowned. Explicitly claim with --claim-liveness-ownership before sending keeper ticks, or stop the keeper. [${Dh}]`;if(o===eF)return`${r(n)} [${eF}] Stop this keeper; heartbeat only works for one-shot CLI sessions.`;return`Failed to record session heartbeat: ${r(n)}${Xo(n)}`}function Xo(s){let n=Ns(s),o=_s(s)?.idle===!0;return n?xs(n,o,S5(s)):""}async function Zo(s,n){try{let{sessionId:o,livenessOwnerToken:a,claimLivenessOwnership:c}=$e(s),d=n.getDaemonState();if(d.isInitialized()){let m=qo(d,o);console.log(m?`Session ${o} heartbeat recorded`:Is(o));return}{let m=n.createClient();try{if(await m.connect(),(await m.callDaemonMethod("daemon/heartbeat",{sessionId:o,livenessPolicy:Eg,livenessOwnerKind:RD,idleTimeoutMs:kp(),...a?{livenessOwnerToken:a}:{},...c?{claimLivenessOwnership:!0}:{}}))?.livenessUnchanged===!0){console.log(Is(o));return}}catch(p){throw new t(Bs(o,p))}finally{await m.close()}}console.log(`Session ${o} heartbeat recorded`);return}catch(o){if(o instanceof t)console.error(`Error: ${o.message}`);else console.error(`Unexpected error: ${r(o)}`);process.exit(1)}}async function ei(s,n){try{let o=He(s),a=n.getDaemonState();if(a.isInitialized()){let d=await YN({id:"release-liveness-ownership",type:"daemon_request",method:AB,params:o},a);if(!d.success)throw new t(`${d.error} [${d.code}]`);console.log(JSON.stringify(d.result));return}let c=n.createClient();try{await c.connect(),console.log(JSON.stringify(await c.callDaemonMethod(AB,o)))}finally{await c.close()}}catch(o){let a=o!==null&&typeof o==="object"&&"code"in o?o.code:void 0;console.error(`Failed to release liveness ownership: ${r(o)}${typeof a==="string"?` [${a}]`:""}`),process.exit(1)}}var ti=new Set(["start","stop","restart","restart-admitted","restart-acceptance-session","release-session","set-feature-flag","abandon-session-request","release-broker-session","release-liveness-ownership"]);function si(s,n,o){if(!ti.has(s))return!1;try{return gq(`run daemon ${s}`,n,o),!1}catch(a){return console.error(`Error: ${r(a)}`),process.exit(1),!0}}async function P4(s,n,o,a){let c=wf(n,[q])===!0,d=n.filter((w)=>ki(w).flag!==q),m=new a({clientFactory:o.clientFactory,stateProvider:o.stateProvider}),p={start:()=>z(s,d,o,m),stop:()=>z(s,d,o,m),restart:()=>z(s,d,o,m),"restart-admitted":()=>z(s,d,o,m),"restart-acceptance-session":()=>z(s,d,o,m),status:()=>We(s,d,m),capabilities:()=>Go(d,m),health:()=>We(s,d,m),diagnose:()=>We(s,d,m),"available-devices":()=>jo(d,m),"active-sessions":()=>Ko(d,m),"session-info":()=>Wo(d,m),"release-session":()=>Qo(d,m),"set-feature-flag":()=>zo(d,m),"session-request-status":()=>Ke("session-request-status",d,m),"abandon-session-request":()=>Ke("abandon-session-request",d,m),"release-broker-session":()=>Ke("release-broker-session",d,m),heartbeat:()=>Zo(d,m),"release-liveness-ownership":()=>ei(d,m)},f=Object.hasOwn(p,s)?p[s]:void 0;if(!f)return R4(s);let S=Ue(s,d);if(S!==void 0)return je(S);if(o.namespaceEnv&&si(s,o.namespaceEnv,c))return;return f()}
|
|
15
|
+
export{EZ,VI,_A,Zy,VN,Ds,uq,hm,WN,xA,f4,zN,h4,IZ,jN,pq,g4,_Z,KN,xZ,y4,v4,GN,CZ,mq,b4,fq,hq,YN,WI,S4,w4,gq,CA,gm,yq,DZ,R4,P4};
|
|
16
|
+
|
|
17
|
+
//# debugId=83B1C39F7A55068E64756E2164756E21
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var d=Object.create;var{getPrototypeOf:a,defineProperty:s,getOwnPropertyNames:T}=Object;var l=Object.prototype.hasOwnProperty;function f(n){return this[n]}var y,m,
|
|
3
|
-
export{
|
|
2
|
+
var d=Object.create;var{getPrototypeOf:a,defineProperty:s,getOwnPropertyNames:T}=Object;var l=Object.prototype.hasOwnProperty;function f(n){return this[n]}var y,m,Ft=(n,r,e)=>{var o=n!=null&&typeof n==="object";if(o){var u=r?y??=new WeakMap:m??=new WeakMap,c=u.get(n);if(c)return c}e=n!=null?d(a(n)):{};let t=r||!n||!n.__esModule||!l.call(n,"default")?s(e,"default",{value:n,enumerable:!0}):e;if(n&&typeof n==="object"||typeof n==="function"){for(let i of T(n))if(!l.call(t,i))s(t,i,{get:f.bind(n,i),enumerable:!0})}if(o)u.set(n,t);return t};var M=(n,r)=>()=>(r||n((r={exports:{}}).exports,r),r.exports);var x=(n)=>n;function g(n,r){this[n]=x.bind(null,r)}var ue=(n,r)=>{for(var e in r)s(n,e,{get:r[e],enumerable:!0,configurable:!0,set:g.bind(r,e)})};var Pt=import.meta.require;function z8(n){let r=n.findIndex((o)=>o==="--cli"||o==="--daemon"),e=r>=0?n.slice(0,r):n;return e.includes("--version")||e.includes("-v")}function ice(n,r){return z8(n)?r:void 0}function Kl(n,r){try{return n()}catch(e){return r(e)}}async function oce(n,r){try{return await n()}catch(e){return r(e)}}
|
|
3
|
+
export{Ft,M,ue,Pt,z8,ice,Kl,oce};
|
|
4
4
|
|
|
5
|
-
//# debugId=
|
|
5
|
+
//# debugId=F7FBA90B630B941564756E2164756E21
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{B}from"./chunk-r6pvhj33.js";import{Ur,i,l,st,e}from"./chunk-r0vp315h.js";import{mee,fee,nw,Xc,Oh,rF,gee,iw,nF,yee}from"./chunk-z8tvs8nk.js";import{gn,eS}from"./chunk-aewdveet.js";import{qre,dd,SB,Wre,Bt,Sr,PB,kg,nk,ck,iR,di,bl,Sl,_o,dY,sn,St,nb,hs,vne,Cg,mt,_l}from"./chunk-sfqe223f.js";import{RV,Sv,fu,Ir,fp,gt,ct,See,CF,bT,ye,kV,OF,ww,Mm,jh,Kh,T5,EV,Ree,Pee,Aee,MF,Tee,Eee,k5,E5,gC,NF,_5,x5,C5,D5,Cee,Dee,Oee,Gh,FF,Nee,O5,Fee}from"./chunk-6hrj3jt6.js";import{y,T,te,j,g,Dt,ne,A,kP}from"./chunk-w5yypt53.js";import{KA,rw,X0,xh}from"./chunk-xezekwwn.js";import{r,t}from"./chunk-2b39zyxc.js";var Q=new Map;function cV(n,o){if(o===void 0)Q.delete(n);else Q.set(n,o)}function ke(n){return Q.get(n)}function qQ(){Q.clear()}var s5=50;function ae(n){return{...n,...n.processExit?{processExit:{...n.processExit}}:{},...n.session?{session:{...n.session}}:{},recovery:{...n.recovery,policy:{...n.recovery.policy},attempts:n.recovery.attempts.map((o)=>({...o}))}}}class a5{timer;idGenerator;maxRetained;incidents=new Map;constructor(n=i,o=B,s=s5){this.timer=n;this.idGenerator=o;this.maxRetained=s}async open(n){let o=this.timer.now(),s={id:`emulator-loss-${this.idGenerator.next()}`,observedAtMs:o,updatedAtMs:o,deviceId:n.deviceId,...n.avdName?{avdName:n.avdName}:{},detectionPath:n.detectionPath,...n.processExit?{processExit:{...n.processExit}}:{},...n.outputTail?{outputTail:n.outputTail}:{},...n.outputUnavailable==="adopted"?{outputUnavailable:n.outputUnavailable}:{},...n.lastAdbState?{lastAdbState:n.lastAdbState}:{},...n.session?{session:{...n.session}}:{},recovery:{policy:{...n.recoveryPolicy},attempts:[]}};return this.incidents.set(s.id,s),this.prune(),ae(s)}async recordRecoveryAttempt(n,o){let s=this.incidents.get(n);if(!s)return;s.recovery.attempts.push({...o}),s.updatedAtMs=this.timer.now()}async completeRecovery(n,o,s={}){let a=this.incidents.get(n);if(!a)return;if(a.recovery.outcome=o,s.replacementDeviceId)a.replacementDeviceId=s.replacementDeviceId;if(a.session&&s.sessionState)a.session.state=s.sessionState;a.updatedAtMs=this.timer.now()}async get(n){let o=this.incidents.get(n);return o?ae(o):void 0}async list(n=this.maxRetained){let o=Array.from(this.incidents.values());return(n<=0?[]:o.slice(-n)).reverse().map(ae)}prune(){while(this.incidents.size>this.maxRetained){let n=this.incidents.keys().next().value;if(n===void 0)return;this.incidents.delete(n)}}}var et=1000;function Te(n){if(!Cg(n))return;let o=n.slice(vne.length),s=";incident=",a=o.indexOf(s),c=a===-1?o:o.slice(0,a),d=a===-1?void 0:o.slice(a+s.length)||void 0;return c?new sn(c,n,d):void 0}function S_(n){if(!n)return;let o=hs(n);if(o)throw o}function VQ(n,o){return n===void 0?void 0:Math.max(0,n-Math.max(0,o)-et)}function c5(n,o){if(!St(n))return;return{code:dY,deviceId:n.deviceId,...o?{sessionUuid:o}:{},...n.incidentId?{incidentId:n.incidentId}:{},reason:"confirmed-unavailable"}}function WQ(n,o){if(!o)return n;let s=o.session?.state;return{...n,detectionPath:o.detectionPath,...o.avdName?{avdName:o.avdName}:{},...o.replacementDeviceId?{replacementDeviceId:o.replacementDeviceId}:{},...s?{sessionState:s}:{},...o.session?{heartbeat:{lastHeartbeatMs:o.session.lastHeartbeatMs,hasReceivedHeartbeat:o.session.hasReceivedHeartbeat,timeoutMs:o.session.heartbeatTimeoutMs}}:{},recovery:{status:o.recovery.outcome??"pending",attempts:o.recovery.attempts.length},retry:{sameSession:s==="active"||s==="awaiting-device",requiresNewSession:s==="released"}}}function zQ(n,o){if(!o||o.assignedDevice===n.deviceId||n.sessionState==="released")return n;return{...n,sessionState:n.sessionState===void 0||n.sessionState==="recovering"?"active":n.sessionState,retry:{sameSession:!0,requiresNewSession:!1},replacementDeviceId:n.replacementDeviceId??o.assignedDevice,recovery:n.recovery??{status:"recovered",attempts:0}}}function d5(n,o,s){let a=()=>n.markRequestCancelled(o);if(s.aborted)a();else s.addEventListener("abort",a,{once:!0});return()=>s.removeEventListener("abort",a)}class zA extends t{failure;constructor(n){super(rF(n));this.failure=n;this.name="DaemonBoundSessionLostError"}}import{createHash as tt}from"crypto";import{readFileSync as nt}from"fs";import{resolve as ot}from"path";var W="unknown";function rt(n){let o=nt(n);return tt("sha256").update(o).digest("hex").slice(0,16)}function it(n,o=rt){if(!n)return{entryScript:"",buildId:W};let s=ot(n);try{return{entryScript:s,buildId:o(s)}}catch(a){return e.warn(`Failed to compute build identity: ${r(a)}`,a),{entryScript:s,buildId:W}}}var ce=null;function Vo(){if(!ce)ce=it(process.argv[1]);return ce}function we(n){return n.length>0&&n!==W}function gc(n,o){if(we(n.buildId)&&we(o.buildId))return n.buildId===o.buildId;if(n.entryScript.length>0&&o.entryScript.length>0)return n.entryScript===o.entryScript;return!0}function ro(n){return`${n.buildId} (${n.entryScript||"unknown"})`}function Ms(n){return{entryScript:n.entryScript??"",buildId:n.buildId??W}}function dV(){return{get version(){return di},build:Vo()}}var dt=g({code:ne("daemon_identity_mismatch"),phase:ne("daemon-preflight"),executionStarted:ne(!1),reason:A(["version","build"]),daemon:g({version:y(),build:g({buildId:y(),entryScript:y()})}),client:g({clientVersion:y().optional(),clientBuildId:y().optional(),clientEntryScript:y().optional()})});function Ae(n){return dt.safeParse(n).success}function de(n){if(typeof n!=="string")return;let o=n.trim();return o.length>0?o:void 0}function l5(n){return{clientVersion:de(n.clientVersion),clientBuildId:de(n.clientBuildId),clientEntryScript:de(n.clientEntryScript)}}function lt(n){return(n.clientVersion?.length??0)>0||(n.clientBuildId?.length??0)>0}function jQ(n,o){if(!lt(o))return{ok:!0};let s={entryScript:o.clientEntryScript??"",buildId:o.clientBuildId??"unknown"};if(!gc(n.build,s))return{ok:!1,reason:"build",message:`AutoMobile daemon build mismatch: the shared daemon socket is served by a different build than this client. daemon build=${ro(n.build)}, client build=${ro(s)}. Restart the daemon from this client's checkout to resolve the skew.`};let a=o.clientVersion;if(a){let c=n.version.trim();if(gn(a)!==a?c.length>0&&eS(c)!==eS(a):(()=>{let m=gn(a),p=gn(c);return m.length>0&&p.length>0&&m!==p})())return{ok:!1,reason:"version",message:`AutoMobile daemon version mismatch: the shared daemon socket is served by daemon=${n.version||"unknown"} but this client is ${a}. Restart the daemon from this client's build (e.g. \`auto-mobile --daemon restart\`) so the per-uid socket serves a matching version.`}}return{ok:!0}}class w_ extends t{failure;constructor(n,o){super(`Daemon preflight failed; no device operation started. ${o}`);this.failure=n;this.name="DaemonHandshakeMismatchError"}}function W0(n=!1){return{code:nk,retryable:!0,...n?{requestMayHaveDispatched:!0}:{}}}function z0(n){return{code:n.code,retryable:!0,daemonShuttingDown:n}}function R_(n=!1){return{error:{code:nk,message:kg,retryable:!0,...n?{requestMayHaveDispatched:!0}:{}}}}function le(n){return typeof n==="object"&&n!==null}function ue(n){return le(n)&&n.code===nk&&n.retryable===!0}function ut(n){return le(n)&&ue(n.error)}function u5(n){return le(n)&&ut(n.structuredContent)}function KQ(n){return W0(u5(n)&&_l(n)?.error.requestMayHaveDispatched===!0)}class ge extends Error{constructor(n,o){super(n,o);this.name="DaemonUnavailableError"}}function Y(n){if(n instanceof ge)return n;return new ge(`Daemon socket connection lost: ${n.message}`,{cause:n})}class al extends ge{requestMayHaveDispatched;constructor(n=!1){super(kg);this.requestMayHaveDispatched=n;this.name="DaemonShuttingDownError"}}var Ce="device_control_transport_failure";class Ph extends Error{failure;constructor(n,o){super(n);this.failure=o;this.name="DeviceControlTransportError"}}function pt(n){return n.code===Ce&&n.transport==="daemon_loopback_http"&&typeof n.toolName==="string"&&n.toolName.length>0}function ft(n){let o={};if(n.deviceId!==void 0){if(typeof n.deviceId!=="string")return;o.deviceId=n.deviceId}if(n.deviceSessionUuid!==void 0){if(typeof n.deviceSessionUuid!=="string")return;o.deviceSessionUuid=n.deviceSessionUuid}if(n.sessionUuid!==void 0){if(typeof n.sessionUuid!=="string")return;o.sessionUuid=n.sessionUuid}if(n.routingSessionUuid!==void 0){if(typeof n.routingSessionUuid!=="string")return;o.routingSessionUuid=n.routingSessionUuid}return o}function ht(n){return typeof n.sessionValid==="boolean"&&typeof n.deviceSessionValid==="boolean"&&(n.phase==="connect"||n.phase==="response")&&typeof n.retryable==="boolean"&&typeof n.reconnectAttempted==="boolean"&&typeof n.replayAttempted==="boolean"}function lV(n){if(!n||typeof n!=="object"||Array.isArray(n))return;let o=n,s=ft(o);if(!pt(o)||!s||!ht(o))return;return{code:Ce,transport:"daemon_loopback_http",toolName:o.toolName,...s,sessionValid:o.sessionValid,deviceSessionValid:o.deviceSessionValid,phase:o.phase,retryable:o.retryable,reconnectAttempted:o.reconnectAttempted,replayAttempted:o.replayAttempted}}function GQ(n){return typeof n==="string"&&ke(n)==="replay"}var X="daemon_overloaded";class ia extends Error{failure;constructor(n,o){super(n);this.failure=o;this.name="McpOverloadError"}}var up="daemon_queue_timeout";function uV(n){return n instanceof Error&&"code"in n&&n.code===up}class Mr extends Error{toolName;timeoutMs;origin;code;constructor(n){let o=n.detail?` (${n.detail})`:"";super(`MCP timeout: ${n.toolName} exceeded ${n.timeoutMs}ms at ${n.origin}${o}`);if(this.name="McpTimeoutError",this.toolName=n.toolName,this.timeoutMs=n.timeoutMs,this.origin=n.origin,n.code!==void 0)this.code=n.code}}function vt(n){return typeof n==="number"&&Number.isFinite(n)&&n>=0}function Ie(n){if(!n||typeof n!=="object"||Array.isArray(n))return;let o=n;if(o.code!==X||o.retryable!==!0||o.reason!=="insufficient_forward_budget"||![o.retryAfterMs,o.queueWaitMs,o.remainingTimeoutMs].every(vt))return;return{code:X,retryable:!0,retryAfterMs:o.retryAfterMs,reason:"insufficient_forward_budget",queueWaitMs:o.queueWaitMs,remainingTimeoutMs:o.remainingTimeoutMs}}async function Et(n,o,s){let a=new _5({classification:s.classification,...s.responseMode!==void 0&&{responseMode:s.responseMode},...s.keepAliveMs!==void 0&&{keepAliveMs:s.keepAliveMs}});return await n.connect(a),a.handleMessage(o,{...s.request!==void 0&&{request:s.request},...s.authInfo!==void 0&&{authInfo:s.authInfo}})}var fe=4194304,me=100;function Oe(n){return`Payload Too Large: Request body must not exceed ${n} bytes`}function Pe(n){if(n===void 0)return fe;if(typeof n!=="number"||!Number.isFinite(n)||n<=0)throw RangeError(`maxRequestBodySize must be a positive number of bytes, got ${String(n)}`);return n}async function qe(n,o=fe){if(Number(n.headers.get("content-length"))>o)return{tooLarge:!0};if(n.body===null)return{tooLarge:!1,text:""};let s=n.body.getReader(),a=new TextDecoder,c=0,d="";try{for(;;){let{done:u,value:m}=await s.read();if(u)break;if(c+=m.byteLength,c>o)return{tooLarge:!0};d+=a.decode(m,{stream:!0})}}finally{s.releaseLock()}return{tooLarge:!1,text:d+a.decode()}}var p5=class{sessionIdGenerator;_started=!1;_hasHandledRequest=!1;_closed=!1;_streamMapping=new Map;_requestToStreamMapping=new Map;_requestResponseMap=new Map;_initialized=!1;_enableJsonResponse=!1;_standaloneSseStreamId="_GET_stream";_eventStore;_onsessioninitialized;_onsessionclosed;_allowedHosts;_allowedOrigins;_enableDnsRebindingProtection;_retryInterval;_supportedProtocolVersions;_keepAliveMs;_maxRequestBodySize;_scopeChallengeResolver;sessionId;onclose;onerror;onmessage;constructor(n={}){this.sessionIdGenerator=n.sessionIdGenerator,this._enableJsonResponse=n.enableJsonResponse??!1,this._eventStore=n.eventStore,this._onsessioninitialized=n.onsessioninitialized,this._onsessionclosed=n.onsessionclosed,this._allowedHosts=n.allowedHosts,this._allowedOrigins=n.allowedOrigins,this._enableDnsRebindingProtection=n.enableDnsRebindingProtection??!1,this._retryInterval=n.retryInterval,this._supportedProtocolVersions=n.supportedProtocolVersions??Sv,this._keepAliveMs=n.keepAliveMs??gC,this._maxRequestBodySize=Pe(n.maxRequestBodySize)}startKeepAlive(n,o){if(this._closed)return;let s=NF(this._keepAliveMs,()=>{try{n.enqueue(o.encode(`: keepalive
|
|
3
|
+
|
|
4
|
+
`))}catch{if(s!==void 0)clearInterval(s)}});return s}setScopeChallengeResolver(n){this._scopeChallengeResolver=n}async start(){if(this._started)throw Error("Transport already started");this._started=!0}setSupportedProtocolVersions(n){this._supportedProtocolVersions=n}createJsonErrorResponse(n,o,s,a){let c={code:o,message:s};if(a?.data!==void 0)c.data=a.data;return Response.json({jsonrpc:"2.0",error:c,id:null},{status:n,headers:{"Content-Type":"application/json",...a?.headers}})}async _checkScopeChallenge(n,o){if(!this._scopeChallengeResolver)return;let s=await x5(n.filter((a)=>Mm(a)),o,this._scopeChallengeResolver);return s===void 0?void 0:D5(s,C5(o))}validateRequestHeaders(n){if(!this._enableDnsRebindingProtection)return;if(this._allowedHosts&&this._allowedHosts.length>0){let o=n.headers.get("host");if(!o||!this._allowedHosts.includes(o)){let s=`Invalid Host header: ${o}`;return this.onerror?.(Error(s)),this.createJsonErrorResponse(403,-32000,s)}}if(this._allowedOrigins&&this._allowedOrigins.length>0){let o=n.headers.get("origin");if(o&&!this._allowedOrigins.includes(o)){let s=`Invalid Origin header: ${o}`;return this.onerror?.(Error(s)),this.createJsonErrorResponse(403,-32000,s)}}}async handleRequest(n,o){if(this._closed)return this.createJsonErrorResponse(404,-32001,"Session not found");if(!this.sessionIdGenerator&&this._hasHandledRequest)throw Error("Stateless transport cannot be reused across requests. Create a new transport per request.");this._hasHandledRequest=!0;let s=this.validateRequestHeaders(n);if(s)return s;switch(n.method){case"POST":return this.handlePostRequest(n,o);case"GET":return this.handleGetRequest(n);case"DELETE":return this.handleDeleteRequest(n);default:return this.handleUnsupportedRequest()}}supportsEmptySSEData(n){return this._supportedProtocolVersions.includes(n)&&n>="2025-11-25"}async writePrimingEvent(n,o,s,a){if(!this._eventStore)return;if(!this.supportsEmptySSEData(a))return;let c=await this._eventStore.storeEvent(s,{}),d=`id: ${c}
|
|
5
|
+
data:
|
|
6
|
+
|
|
7
|
+
`;if(this._retryInterval!==void 0)d=`id: ${c}
|
|
8
|
+
retry: ${this._retryInterval}
|
|
9
|
+
data:
|
|
10
|
+
|
|
11
|
+
`;n.enqueue(o.encode(d))}async handleGetRequest(n){if(!n.headers.get("accept")?.includes("text/event-stream"))return this.onerror?.(Error("Not Acceptable: Client must accept text/event-stream")),this.createJsonErrorResponse(406,-32000,"Not Acceptable: Client must accept text/event-stream");let o=this.validateSession(n);if(o)return o;let s=this.validateProtocolVersion(n);if(s)return s;if(this._eventStore){let p=n.headers.get("last-event-id");if(p)return this.replayEvents(p)}if(this._streamMapping.get(this._standaloneSseStreamId)!==void 0)return this.onerror?.(Error("Conflict: Only one SSE stream is allowed per session")),this.createJsonErrorResponse(409,-32000,"Conflict: Only one SSE stream is allowed per session");let a=new TextEncoder,c,d,u=new ReadableStream({start:(p)=>{c=p},cancel:()=>{if(d!==void 0)clearInterval(d);if(this._streamMapping.get(this._standaloneSseStreamId)?.controller===c)this._streamMapping.delete(this._standaloneSseStreamId)}}),m={"Content-Type":"text/event-stream","Cache-Control":"no-cache, no-transform",Connection:"keep-alive","X-Accel-Buffering":"no"};if(this.sessionId!==void 0)m["mcp-session-id"]=this.sessionId;return this._streamMapping.set(this._standaloneSseStreamId,{controller:c,encoder:a,cleanup:()=>{if(d!==void 0)clearInterval(d);this._streamMapping.delete(this._standaloneSseStreamId);try{c.close()}catch{}}}),d=this.startKeepAlive(c,a),new Response(u,{headers:m})}async replayEvents(n){if(!this._eventStore)return this.onerror?.(Error("Event store not configured")),this.createJsonErrorResponse(400,-32000,"Event store not configured");try{let o;if(this._eventStore.getStreamIdForEventId){if(o=await this._eventStore.getStreamIdForEventId(n),!o)return this.onerror?.(Error("Invalid event ID format")),this.createJsonErrorResponse(400,-32000,"Invalid event ID format");if(this._streamMapping.get(o)!==void 0)return this.onerror?.(Error("Conflict: Stream already has an active connection")),this.createJsonErrorResponse(409,-32000,"Conflict: Stream already has an active connection")}let s={"Content-Type":"text/event-stream","Cache-Control":"no-cache, no-transform",Connection:"keep-alive","X-Accel-Buffering":"no"};if(this.sessionId!==void 0)s["mcp-session-id"]=this.sessionId;let a=new TextEncoder,c,d,u=!1,m,p=new ReadableStream({start:(b)=>{c=b},cancel:()=>{if(u=!0,d!==void 0)clearInterval(d);if(m!==void 0&&this._streamMapping.get(m)?.controller===c)this._streamMapping.delete(m)}}),h=new Set;if(m=await this._eventStore.replayEventsAfter(n,{send:async(b,R)=>{if(h.add(b),!this.writeSSEEvent(c,a,R,b))try{c.close()}catch{}}}),this._closed||u){try{c.close()}catch{}return this.createJsonErrorResponse(404,-32001,"Session not found")}if(this._streamMapping.get(m)?.cleanup(),this._streamMapping.set(m,{controller:c,encoder:a,replayedEventIds:h,cleanup:()=>{if(d!==void 0)clearInterval(d);this._streamMapping.delete(m);try{c.close()}catch{}}}),m!==this._standaloneSseStreamId){if(![...this._requestToStreamMapping.values()].includes(m)){this._streamMapping.delete(m);try{c.close()}catch{}}}if(this._streamMapping.get(m)?.controller===c)d=this.startKeepAlive(c,a);return new Response(p,{headers:s})}catch(o){return this.onerror?.(o),this.createJsonErrorResponse(500,-32000,"Error replaying events")}}writeSSEEvent(n,o,s,a){try{let c=`event: message
|
|
12
|
+
`;if(a)c+=`id: ${a}
|
|
13
|
+
`;return c+=`data: ${JSON.stringify(s)}
|
|
14
|
+
|
|
15
|
+
`,n.enqueue(o.encode(c)),!0}catch(c){return this.onerror?.(c),!1}}handleUnsupportedRequest(){return this.onerror?.(Error("Method not allowed.")),Response.json({jsonrpc:"2.0",error:{code:-32000,message:"Method not allowed."},id:null},{status:405,headers:{Allow:"GET, POST, DELETE","Content-Type":"application/json"}})}async handlePostRequest(n,o){try{let s=n.headers.get("accept");if(!s?.includes("application/json")||!s.includes("text/event-stream"))return this.onerror?.(Error("Not Acceptable: Client must accept both application/json and text/event-stream")),this.createJsonErrorResponse(406,-32000,"Not Acceptable: Client must accept both application/json and text/event-stream");if(!E5(n.headers.get("content-type")))return this.onerror?.(Error("Unsupported Media Type: Content-Type must be application/json")),this.createJsonErrorResponse(415,-32000,"Unsupported Media Type: Content-Type must be application/json");let a=n,c;if(o?.parsedBody===void 0)try{let S=await qe(n,this._maxRequestBodySize);if(S.tooLarge){let f=Oe(this._maxRequestBodySize);return this.onerror?.(Error(f)),this.createJsonErrorResponse(413,-32000,f)}c=JSON.parse(S.text)}catch(S){return this.onerror?.(S),this.createJsonErrorResponse(400,-32700,"Parse error: Invalid JSON")}else c=o.parsedBody;if(Array.isArray(c)&&c.length>me)return this.onerror?.(Error(`Invalid Request: Batch must not exceed ${me} messages`)),this.createJsonErrorResponse(400,-32600,`Invalid Request: Batch must not exceed ${me} messages`);let d;try{d=Array.isArray(c)?c.map((S)=>fp.parse(S)):[fp.parse(c)]}catch(S){return this.onerror?.(S),this.createJsonErrorResponse(400,-32700,"Parse error: Invalid JSON-RPC message")}if(this._closed)return this.createJsonErrorResponse(404,-32001,"Session not found");let u=d.some((S)=>T5(S));if(u){if(this._initialized&&this.sessionId!==void 0)return this.onerror?.(Error("Invalid Request: Server already initialized")),this.createJsonErrorResponse(400,-32600,"Invalid Request: Server already initialized");if(d.length>1)return this.onerror?.(Error("Invalid Request: Only one initialization request is allowed")),this.createJsonErrorResponse(400,-32600,"Invalid Request: Only one initialization request is allowed");if(this.sessionId=this.sessionIdGenerator?.(),this._initialized=!0,this.sessionId&&this._onsessioninitialized)await Promise.resolve(this._onsessioninitialized(this.sessionId))}if(!u){let S=this.validateSession(n);if(S)return S;let f=this.validateProtocolVersion(n);if(f)return f}if(this._closed)return this.createJsonErrorResponse(404,-32001,"Session not found");let m;try{m=await this._checkScopeChallenge(d,o?.authInfo)}catch(S){return this.onerror?.(S),this.createJsonErrorResponse(500,-32603,"Internal server error")}if(m)return m;if(!d.some((S)=>Mm(S))){for(let S of d)this.onmessage?.(S,{authInfo:o?.authInfo,request:a});return new Response(null,{status:202})}let p=crypto.randomUUID(),h=d.find((S)=>T5(S)),b=h?h.params.protocolVersion:n.headers.get("mcp-protocol-version")??RV;if(this._enableJsonResponse)return new Promise((S)=>{this._streamMapping.set(p,{resolveJson:S,cleanup:()=>{this._streamMapping.delete(p)}});for(let f of d)if(Mm(f))this._requestToStreamMapping.set(f.id,p);for(let f of d)this.onmessage?.(f,{authInfo:o?.authInfo,request:a})});let R=new TextEncoder,v,E,O=new ReadableStream({start:(S)=>{v=S},cancel:()=>{if(E!==void 0)clearInterval(E);if(this._streamMapping.get(p)?.controller===v)this._streamMapping.delete(p)}}),w={"Content-Type":"text/event-stream","Cache-Control":"no-cache, no-transform",Connection:"keep-alive","X-Accel-Buffering":"no"};if(this.sessionId!==void 0)w["mcp-session-id"]=this.sessionId;for(let S of d)if(Mm(S))this._streamMapping.set(p,{controller:v,encoder:R,cleanup:()=>{if(E!==void 0)clearInterval(E);this._streamMapping.delete(p);try{v.close()}catch{}}}),this._requestToStreamMapping.set(S.id,p);await this.writePrimingEvent(v,R,p,b);for(let S of d){let f,D;if(Mm(S)&&this._eventStore&&this.supportsEmptySSEData(b))f=()=>{this.closeSSEStream(S.id)},D=()=>{this.closeStandaloneSSEStream()};this.onmessage?.(S,{authInfo:o?.authInfo,request:a,closeSSEStream:f,closeStandaloneSSEStream:D})}if(this._streamMapping.get(p)?.controller===v)E=this.startKeepAlive(v,R);return new Response(O,{status:200,headers:w})}catch(s){return this.onerror?.(s),this.createJsonErrorResponse(400,-32700,"Parse error",{data:String(s)})}}async handleDeleteRequest(n){let o=this.validateSession(n);if(o)return o;let s=this.validateProtocolVersion(n);if(s)return s;try{return await Promise.resolve(this._onsessionclosed?.(this.sessionId)),new Response(null,{status:200})}finally{await this.close()}}validateSession(n){if(this.sessionIdGenerator===void 0)return;if(!this._initialized)return this.onerror?.(Error("Bad Request: Server not initialized")),this.createJsonErrorResponse(400,-32000,"Bad Request: Server not initialized");let o=n.headers.get("mcp-session-id");if(!o)return this.onerror?.(Error("Bad Request: Mcp-Session-Id header is required")),this.createJsonErrorResponse(400,-32000,"Bad Request: Mcp-Session-Id header is required");if(o!==this.sessionId)return this.onerror?.(Error("Session not found")),this.createJsonErrorResponse(404,-32001,"Session not found")}validateProtocolVersion(n){let o=n.headers.get("mcp-protocol-version");if(o!==null&&!this._supportedProtocolVersions.includes(o)){let s=`Bad Request: Unsupported protocol version: ${o} (supported versions: ${this._supportedProtocolVersions.join(", ")})`;return this.onerror?.(Error(s)),this.createJsonErrorResponse(400,-32000,s)}}async close(){if(this._closed)return;this._closed=!0;for(let{cleanup:n}of this._streamMapping.values())n();this._streamMapping.clear(),this._requestResponseMap.clear(),this.onclose?.()}closeSSEStream(n){let o=this._requestToStreamMapping.get(n);if(!o)return;let s=this._streamMapping.get(o);if(s)s.cleanup()}closeStandaloneSSEStream(){let n=this._streamMapping.get(this._standaloneSseStreamId);if(n)n.cleanup()}async send(n,o){let s=o?.relatedRequestId;if(jh(n)||Kh(n))s=n.id;if(s===void 0){if(jh(n)||Kh(n))throw Error("Cannot send a response on a standalone SSE stream unless resuming a previous client request");let d;if(this._eventStore)d=await this._eventStore.storeEvent(this._standaloneSseStreamId,n);let u=this._streamMapping.get(this._standaloneSseStreamId);if(u===void 0)return;if(u.controller&&u.encoder&&(d===void 0||!u.replayedEventIds?.has(d)))this.writeSSEEvent(u.controller,u.encoder,n,d);return}let a=this._requestToStreamMapping.get(s);if(!a)throw Error(`No connection established for request ID: ${String(s)}`);let c=this._streamMapping.get(a);if(!this._enableJsonResponse){let d;if(this._eventStore)d=await this._eventStore.storeEvent(a,n),c=this._streamMapping.get(a);if(c?.controller&&c?.encoder&&(d===void 0||!c.replayedEventIds?.has(d)))this.writeSSEEvent(c.controller,c.encoder,n,d)}if(jh(n)||Kh(n)){this._requestResponseMap.set(s,n);let d=[...this._requestToStreamMapping.entries()].filter(([u,m])=>m===a).map(([u])=>u);if(d.every((u)=>this._requestResponseMap.has(u))){if(!c){if(this._enableJsonResponse)throw Error(`No connection established for request ID: ${String(s)}`);if(!this._eventStore){this.onerror?.(Error(`Response for request ID ${String(s)} is undeliverable: per-request stream is disconnected and no eventStore is configured`));for(let u of d)this._requestResponseMap.delete(u),this._requestToStreamMapping.delete(u);return}for(let u of d)this._requestResponseMap.delete(u),this._requestToStreamMapping.delete(u);return}if(this._enableJsonResponse&&c.resolveJson){let u={"Content-Type":"application/json"};if(this.sessionId!==void 0)u["mcp-session-id"]=this.sessionId;let m=d.map((p)=>this._requestResponseMap.get(p));if(m.length===1)c.resolveJson(Response.json(m[0],{status:200,headers:u}));else c.resolveJson(Response.json(m,{status:200,headers:u}));c.cleanup()}else c.cleanup();for(let u of d)this._requestResponseMap.delete(u),this._requestToStreamMapping.delete(u)}}}};function L(n){if(n===null||typeof n!=="object"||Array.isArray(n))return null;let{method:o,id:s}=n;if(typeof o!=="string")return null;return typeof s==="string"||typeof s==="number"?s:null}function q(n,o,s,a,c=null){return Response.json({jsonrpc:"2.0",error:{code:o,message:s,...a!==void 0&&{data:a}},id:c},{status:n,...n===405&&{headers:{Allow:"POST"}}})}function Z(n,o=null){return q(n.httpStatus,n.code,n.message,n.data,o)}function H(n){return n instanceof Error?n:Error(String(n))}function J(n=null){return q(500,-32603,"Internal server error",void 0,n)}function _e(n){if(n.transport!==void 0)throw Error("The factory returned an instance that is still serving another request. Return a new instance for each request.")}function yt(n,o,s,a){return async(c,d)=>{if(c.method.toUpperCase()!=="POST")return q(405,-32000,"Method not allowed.");try{let u=await n({era:"legacy",...d?.authInfo!==void 0&&{authInfo:d.authInfo},requestInfo:c}),m=new p5({sessionIdGenerator:void 0,...s!==void 0&&{keepAliveMs:s},...a!==void 0&&{maxRequestBodySize:a}});await u.connect(m);let p=()=>{m.close().catch(()=>{}),u.close().catch(()=>{})};c.signal?.addEventListener("abort",p,{once:!0});let h=await m.handleRequest(c,{...d?.authInfo!==void 0&&{authInfo:d.authInfo},...d?.parsedBody!==void 0&&{parsedBody:d.parsedBody}});if(h.body===null||k5(h.headers.get("content-type"))!=="text/event-stream")return p(),h;let b=h.body.getReader(),R=!1,v=()=>{if(!R)R=!0,p()},E=new ReadableStream({pull:async(O)=>{try{let{done:w,value:S}=await b.read();if(w){v(),O.close();return}if(S!==void 0)O.enqueue(S)}catch(w){v(),O.error(w)}},cancel:(O)=>(v(),b.cancel(O).catch(()=>{}))});return new Response(E,{status:h.status,statusText:h.statusText,headers:h.headers})}catch(u){try{o?.(H(u))}catch{}return J(L(d?.parsedBody))}}}function Ne(n){return{protocolVersionHeader:n.headers.get("mcp-protocol-version")??void 0,mcpMethodHeader:n.headers.get("mcp-method")??void 0,mcpNameHeader:n.headers.get("mcp-name")??void 0}}async function bt(n,o,s=!0,a=fe){let c=n.method.toUpperCase(),d,u=o,m=n,p=!1;if(c==="POST"){if(u===void 0){if(s)m=n.clone();let h;try{let b=await qe(n,a);if(b.tooLarge)return{step:"body-too-large"};h=b.text}catch{return{step:"unreadable-body"}}try{d=h.length===0?void 0:JSON.parse(h)}catch{p=!0}if(!p&&d!==void 0)u=d}else d=u;if(p||d===void 0)return{step:"no-json-body",forwardRequest:m}}return{step:"classified",outcome:MF({httpMethod:c,...Ne(n),...d!==void 0&&{body:d}}),body:d,parsedBody:u,forwardRequest:m}}function YQ(n,o={}){let{legacy:s,onerror:a,responseMode:c}=o,d=Pe(o.maxRequestBodySize);if(typeof s==="function")throw TypeError("The 'legacy' option only accepts 'stateless' or 'reject', not a handler function. To serve 2025-era traffic with your own handler, route in user land with the exported isLegacyRequest(request) predicate in front of a strict (legacy: 'reject') handler.");let u=new Set,m=!1,p=(f)=>{try{a?.(f)}catch{}},h=o.bus??new FF(p),b=Nee(h),R=Fee({bus:h,maxSubscriptions:o.maxSubscriptions??O5,keepAliveMs:o.keepAliveMs??gC,onerror:p});if(c==="json")console.warn("responseMode: 'json' drops mid-call notifications. subscriptions/listen streams are always served over SSE regardless; other notifications emitted before a result are dropped.");let v=s==="reject"?void 0:yt(n,p,o.keepAliveMs,d);async function E(f,D,C){let _=f.classification.revision;if(_===void 0||!bT.includes(_)){let x=new kV({supported:[...bT],requested:_??"unknown"});return p(x),q(400,x.code,x.message,x.data,L(f.message))}let I=Aee({httpMethod:D.method,...Ne(D)},f);if(I!==void 0)return p(Error(`Rejected inbound request (${I.cell}): ${I.message}`)),Z(I,L(f.message));let F=f.messageKind==="request"?ww(f.message.params):void 0,z=F?.[Ir];if(f.messageKind==="request"){let x=See(f.message.method);if(x!==void 0){let P=CF(x,z);if(P!==void 0){let N=new OF({requiredCapabilities:P});return p(N),q(Pee(N.code,"ladder"),N.code,N.message,N.data,f.message.id)}}}let M=await n({era:"modern",...C!==void 0&&{authInfo:C},requestInfo:D}),k=M instanceof Gh?M.server:M;if(_e(k),f.messageKind==="request"&&f.message.method==="subscriptions/listen"){let x=k.getCapabilities(),P=Oee(k);return M.close().catch(p),R.serve(f.message,D.signal,x,P)}if(f.messageKind==="request"&&f.message.method==="tools/call"&&M instanceof Gh){let x=f.message.params,P=typeof x?.name==="string"?x.name:void 0,N=P===void 0?void 0:M.toolInputSchemaJson(P);if(N!==void 0){let ie=EV(N);if(ie.declarations!==void 0&&ie.declarations.length>0){let K=Ree(ie.declarations,x?.arguments,D.headers);if(K!==void 0)return M.close().catch(p),p(Error(`Rejected inbound request (${K.cell}): ${K.message}`)),Z(K,f.message.id)}}}if(f.messageKind==="request"&&M instanceof Gh)try{let x=await x5([f.message],C,(P)=>M.resolveScopeChallenge(P));if(x!==void 0)return M.close().catch(p),D5(x,C5(C))}catch(x){return M.close().catch(p),p(H(x)),J(f.message.id)}if(_e(k),Eee(k,_),Dee(k,bT),F!==void 0)Cee(k,{clientInfo:F[fu],clientCapabilities:z});let xe=k.onclose;u.add(k);let De=()=>{if(u.delete(k),k.onclose===De)k.onclose=xe;xe?.()};k.onclose=De;try{let x=await Et(M,f.message,{classification:f.classification,request:D,...C!==void 0&&{authInfo:C},...c!==void 0&&{responseMode:c},...o.keepAliveMs!==void 0&&{keepAliveMs:o.keepAliveMs}});if(f.messageKind==="notification")queueMicrotask(()=>void k.close().catch(()=>{}));return x}catch(x){if(x instanceof ct&&x.code===gt.ConnectionClosed)return new Response(null,{status:499});return await k.close().catch(()=>{}),u.delete(k),p(H(x)),J(L(f.message))}}async function O(f,D,C,_){if(v!==void 0)return v(D,{...C!==void 0&&{authInfo:C},..._!==void 0&&{parsedBody:_}});let I=Tee(f,bT);if(I===void 0)return new Response(null,{status:202});return p(Error(`Rejected 2025-era request on a modern-only endpoint (${I.cell}): ${I.message}`)),Z(I,L(_))}async function w(f,D){let C=D?.authInfo;if(f.method.toUpperCase()==="POST"&&!E5(f.headers.get("content-type")))return p(Error("Unsupported Media Type: Content-Type must be application/json")),q(415,-32000,"Unsupported Media Type: Content-Type must be application/json");let _=await bt(f,D?.parsedBody,!0,d);if(_.step==="unreadable-body")return q(400,-32700,"Parse error: the request body could not be read");if(_.step==="body-too-large")return q(413,-32000,Oe(d));if(_.step==="no-json-body"){if(v!==void 0)return v(_.forwardRequest,{...C!==void 0&&{authInfo:C}});return q(400,-32700,"Parse error: the request body is not valid JSON")}let{outcome:I,body:F,parsedBody:z,forwardRequest:M}=_;try{switch(I.kind){case"reject":return p(Error(`Rejected inbound request (${I.cell}): ${I.message}`)),Z(I,L(F));case"modern":return await E(I,f,C);case"legacy":return await O(I,M,C,z)}}catch(k){return p(H(k)),J(L(F))}}return{fetch:async(f,D)=>{if(m)throw Error("This MCP handler has been closed");try{return await w(f,D)}catch(C){return p(H(C)),J(L(D?.parsedBody))}},notify:b,bus:h,close:async()=>{m=!0,R.closeAll();let f=[...u].map((D)=>D.close().catch(()=>{}));u.clear(),await Promise.all(f)}}}var ee="v1.";function pe(n){let o="";for(let s of n)o+=String.fromCodePoint(s);return btoa(o).replaceAll("+","-").replaceAll("/","_").replace(/=+$/,"")}function Rt(n,o){if(n.length!==o.length)return!1;let s=0;for(let a=0;a<n.length;a++)s|=n.codePointAt(a)^o.codePointAt(a);return s===0}function Me(n){let o=n.replaceAll("-","+").replaceAll("_","/"),s=atob(o),a=new Uint8Array(s.length);for(let c=0;c<s.length;c++)a[c]=s.codePointAt(c);return a}function JQ(n){let o=globalThis.crypto?.subtle;if(o===void 0)throw TypeError("createRequestStateCodec requires the Web Crypto API (globalThis.crypto.subtle); see https://ts.sdk.modelcontextprotocol.io/v2/troubleshooting for the Node.js polyfill instructions");let s=typeof n.key==="string"?new TextEncoder().encode(n.key):Uint8Array.from(n.key);if(s.byteLength<32)throw RangeError(`createRequestStateCodec: key must be at least 32 bytes (got ${s.byteLength})`);let a=n.ttlSeconds??600;if(!Number.isFinite(a))throw RangeError("createRequestStateCodec: ttlSeconds must be a finite number");let c=n.bind,d,u=()=>d??=o.importKey("raw",s,{name:"HMAC",hash:"SHA-256"},!1,["sign","verify"]),m=new TextEncoder,p="mcp.requestState.bind:",h=async(b)=>pe(new Uint8Array(await o.sign("HMAC",await u(),m.encode(p+b))).slice(0,16));return{async mint(b,R){let v={p:b,exp:Math.floor(Date.now()/1000)+a};if(c!==void 0){if(R===void 0)throw TypeError("createRequestStateCodec: mint() requires ctx when a bind callback is configured");v.b=await h(c(R))}let E=pe(m.encode(JSON.stringify(v)));return`${ee}${E}.${pe(new Uint8Array(await o.sign("HMAC",await u(),m.encode(ee+E))))}`},async verify(b,R){let v=b.lastIndexOf(".");if(!b.startsWith(ee)||v<=3)throw Error("malformed");let E=b.slice(3,v),O;try{O=Me(b.slice(v+1))}catch{throw Error("malformed")}if(!await o.verify("HMAC",await u(),O,m.encode(ee+E)))throw Error("mac");let w;try{w=JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(Me(E)))}catch{throw Error("malformed")}if(typeof w.exp!=="number"||w.exp<Math.floor(Date.now()/1000))throw Error("expired");if(c!==void 0){let S=await h(c(R));if(w.b===void 0||!Rt(w.b,S))throw Error("bind")}else if(w.b!==void 0)throw Error("bind");return w.p}}}var mv="io.modelcontextprotocol/tasks",xt=-32021,kt=-32602,m5={resultType:"complete"};function V(n){return typeof n==="object"&&n!==null&&!Array.isArray(n)}function Le(n){return V(n)&&f5(n[Ir])}function fv(n){return Le(n.envelope)||Le(n.meta)}function f5(n){if(!V(n)||!V(n.extensions))return!1;return V(n.extensions[mv])}function Ah(n){return V(n)&&n.resultType==="task"&&typeof n.taskId==="string"}function j0(){return new ye(xt,"Missing required client capability",{requiredCapabilities:{extensions:{[mv]:{}}}})}function P_(n){return new ye(kt,n==="expired"?"Failed to retrieve task: Task has expired":"Failed to retrieve task: Task not found")}function Fe(n){return new Date(n).toISOString()}function Ue(n){return{taskId:n.taskId,status:n.status,...n.statusMessage!==null&&{statusMessage:n.statusMessage},createdAt:Fe(n.createdAtMs),lastUpdatedAt:Fe(n.lastUpdatedAtMs),ttlMs:n.expiresAtMs===null?null:n.expiresAtMs-n.createdAtMs,pollIntervalMs:n.pollIntervalMs}}function XQ(n){return{resultType:"task",...Ue(n)}}function ZQ(n){let o=Ue(n);switch(n.status){case"input_required":return{resultType:"complete",...o,inputRequests:n.inputRequests??{}};case"completed":return{resultType:"complete",...o,result:n.result??{content:[]}};case"failed":return{resultType:"complete",...o,error:n.error??{code:-32603,message:"Internal error"}};default:return{resultType:"complete",...o}}}var Tt=["tasks/get","tasks/update","tasks/cancel"];function pV(n){return Tt.includes(n)}function K0(n){if(!oe(n)||typeof n.ownerKey!=="string"||n.ownerKey.trim().length===0||typeof n.declared!=="boolean")return;return{ownerKey:n.ownerKey,declared:n.declared}}function h5(){return{[Ir]:{extensions:{[mv]:{}}}}}function oe(n){return typeof n==="object"&&n!==null&&!Array.isArray(n)}var QQ=kP({});function eee(n){return{resultType:"complete",...oe(n)?n:{}}}function tee(n){if(!oe(n)||typeof n.taskId!=="string"||typeof n.status!=="string"||typeof n.createdAt!=="string"||"isError"in n||"structuredContent"in n||n.content!==void 0&&!(Array.isArray(n.content)&&n.content.length===0))return;let o={resultType:"task",...n};return delete o.content,o}function ree(n){if(!(n instanceof ye)||typeof n.code!=="number")return;let o=`MCP error ${n.code}: `,s=n.message.startsWith(o)?n.message.slice(o.length):n.message;return{code:n.code,message:s,...n.data!==void 0&&{data:n.data}}}function mV(n){return oe(n)&&typeof n.code==="number"&&typeof n.message==="string"}function nee(n){return new ye(n.code,n.message,n.data)}var A_=g({port:T().finite().optional(),host:y().optional(),strictPort:te().optional(),debug:te().optional(),debugPerf:te().optional(),planExecutionLockScope:A(["session","global"]).optional(),runnerReadinessTimeoutMs:T().finite().optional(),videoQualityPreset:y().optional(),videoTargetBitrateKbps:T().finite().optional(),videoMaxThroughputMbps:T().finite().optional(),videoFps:T().finite().optional(),videoFormat:y().optional(),videoMaxArchiveSizeMb:T().finite().optional(),toolOutputsDir:y().optional(),networkMockable:te().optional(),embeddedSdk:te().optional(),enabledTools:j(y()).optional(),disabledTools:j(y()).optional(),dismissKeyboardAfterInput:te().optional(),eventAllMarkers:j(y()).optional(),eventAllMarkersCliOverride:te().optional(),noUiPerfMode:te().optional(),memPerfAudit:te().optional(),accessibilityAudit:te().optional(),accessibilityLevel:y().optional(),accessibilityFailureMode:y().optional(),accessibilityMinSeverity:y().optional(),accessibilityUseBaseline:te().optional(),predictiveUi:te().optional(),rawElementSearch:te().optional(),skipCtrlProxyDownload:te().optional(),toolCallRecording:te().optional(),noNavigationScreenshots:te().optional(),noWaitForPollingOverhead:te().optional(),noA11yIncludeNotImportantViews:te().optional(),noA11yReportViewIds:te().optional(),noA11yRetrieveInteractiveWindows:te().optional(),noOcclusion:te().optional(),observeResultIncludeElements:te().optional(),toolResultsNoStructuredContent:te().optional(),actionsDiffObserve:te().optional(),actionsNoObserve:te().optional(),actionsCompactMetadata:te().optional()});var Be=256,U=2000,wt=g({unavailableSockets:j(g({code:ne("AUXILIARY_SOCKET_UNAVAILABLE"),holderPid:T().int().positive().optional(),holderVersion:y().optional(),holderVerified:te().optional(),name:y(),socketPath:y().min(1)})).optional(),reportedPidFilePath:y().min(1).optional(),reportedSocketPath:y().min(1).optional(),reportedSockets:Dt(y(),y().min(1)).optional(),launchNonce:y().optional(),processStartedAt:T().finite().optional(),dbPath:y().min(1).optional(),pid:T().int().positive().optional(),version:y().trim().min(1),buildId:y().optional(),entryScript:y().optional(),releaseVersion:y().optional(),startedAt:T().finite().optional(),processGenerationToken:y().optional(),processGenerationTokenUtc:y().optional(),activeProvisioning:te().optional(),structuredSessionNotFound:te().optional(),structuredToolErrorCodes:te().optional(),acceptanceCapabilityFingerprint:y().nullable().optional()}),At=g({options:A_.optional(),effectiveDebug:te().optional()});function Ct(n){if(Ae(n.handshakeFailure))return new w_(n.handshakeFailure,n.error||"Daemon identity mismatch");if(ue(n.daemonShuttingDown))return new al(n.daemonShuttingDown.requestMayHaveDispatched===!0);let o=Ie(n.overloadFailure);if(o)return new ia(n.error||"Daemon rejected overloaded MCP work",o);return}function It(n){let o=gee(n.boundSessionLoss);if(o)return new zA(o);let s=lV(n.transportFailure);if(s)return new Ph(n.error||"Device-control transport failure",s);return}function _t(n){let o=fee(n.requestFailureCause),s=o?Error(o.message):void 0;if(s&&o)s.name=o.name;return new t(n.error||"Unknown error from daemon",{cause:s})}var Mt=g({state:A(["live","suspect","lapsed"]),remainingMs:T().finite().nonnegative(),holdRemainingMs:T().finite().nonnegative()});function Ot(n){let o=Mt.safeParse(n.result?.liveness);return o.success?o.data:void 0}function Pt(n){if(typeof n.releaseReason!=="string"||n.releaseReason.length===0)return{};return Oh(n.releaseReason,typeof n.idleTimeoutMs==="number"?n.idleTimeoutMs:void 0)}function qt(n){return{...typeof n.retryable==="boolean"?{retryable:n.retryable}:{},...typeof n.retryAfterMs==="number"?{retryAfterMs:n.retryAfterMs}:{},...typeof n.nextAction==="string"?{nextAction:n.nextAction}:{},...n.details&&typeof n.details==="object"?{details:n.details}:{}}}function He(n){return n===void 0?{}:{tasks:n}}function Nt(n){return mV(n.jsonRpcError)?{jsonRpcError:n.jsonRpcError}:{}}function he(n){let o=Ct(n)??It(n)??_t(n),s=[n.code,n.handshakeFailure?.code,n.daemonShuttingDown?.code,n.overloadFailure?.code,n.boundSessionLoss?.code,n.transportFailure?.code].find((d)=>d!==void 0),a=Xc(n);if(a!==void 0)Object.assign(o,{daemonInstance:a});if(s===void 0)return o;let c=s===nw?Ot(n):void 0;return Object.assign(o,{code:s,...Nt(n),...qt(n),...c?{livenessOwnerHold:c}:{},...Pt(n)})}function fV(n,o){let s=wt.safeParse(n);if(!s.success)throw new t("Daemon preflight failed: the socket owner returned no version identity; no device operation started. Restart the daemon from this client installation.");let a=At.safeParse(n);if(!a.success)throw new t("Daemon preflight failed: the socket owner returned a valid identity but malformed startup options; no device operation started. Restart the daemon from this client installation.");let{releaseVersion:c,...d}=s.data;return{running:!0,...d,socketPath:o,...a.data.options?{options:a.data.options}:{},...a.data.effectiveDebug!==void 0?{effectiveDebug:a.data.effectiveDebug}:{},...c?{assetVersion:c}:{}}}function $e(n,o){if(!o.trim()||n.inboundClosed)return;let s;try{s=JSON.parse(o)}catch(d){e.error(`Error parsing daemon response: ${d}`);return}let a=yee.safeParse(s);if(a.success){Lt(n,a.data);return}let c=mee.safeParse(s);if(c.success){n.handleResponse(c.data);return}e.warn("Dropped daemon frame: invalid response or notification envelope")}function Lt(n,o){if(o.method===nF&&o.requestId!==void 0&&typeof o.timeoutMs==="number"){n.adoptPendingRequestBudget(o.requestId,o.timeoutMs);return}if(o.method===iw&&o.progressToken!==void 0){if(o.requestId!==void 0)n.extendPendingRequestOnProgress(o.requestId,o.progressToken)}for(let s of n.notificationHandlers)try{s(o)}catch(a){e.warn(`Daemon notification handler failed for ${o.method}: ${a}`)}}function Je(n,o){if(o.id===null){if(n.pendingRequests.size!==1){e.warn(`Received uncorrelatable daemon response with ${n.pendingRequests.size} pending requests; dropping response`);return}let a=new t(o.error??"Daemon could not parse a socket request"),c=n.pendingRequests.values().next().value;if(!c)return;n.timer.clearTimeout(c.timeout),c.removeAbortListener?.(),c.reject(a),n.pendingRequests.clear();return}let s=n.pendingRequests.get(o.id);if(!s&&n.cancelledRequestIds.delete(o.id)){e.debug(`Dropped daemon response for cancelled request ID: ${o.id}`);return}if(!s){e.warn(`Received response for unknown request ID: ${o.id}`);return}if(n.timer.clearTimeout(s.timeout),s.removeAbortListener?.(),n.pendingRequests.delete(o.id),o.success)s.resolve(o);else s.reject(he(o))}function je(n,o,s,a){let{signal:c}=a,d=()=>{},u=()=>{d(),n.timedOutRequestAbortCleanups.delete(o)};return new Promise((m,p)=>{let h=a.armTimeout(p,u);n.pendingRequests.set(o,{...a.entry,resolve:(E)=>{m(E.result)},reject:p,timeout:h,removeAbortListener:u}),a.onRegistered?.();let b=(E)=>{n.timer.clearTimeout(h),u(),n.pendingRequests.delete(o),p(E)},R=n.socket();if(!R||c?.aborted){b(c?.aborted?a.abortError():a.socketLostError());return}try{R.write(s)}catch(E){b(a.writeError(E));return}if(!c)return;let v=()=>{let E=n.pendingRequests.get(o);if(!E&&!n.timedOutRequestAbortCleanups.has(o))return;if(n.timer.clearTimeout(E?.timeout??h),n.pendingRequests.delete(o),u(),n.sendCancelFrame(o),a.destroyOnAbort)n.socket()?.destroy();if(E)p(a.abortError())};if(c.addEventListener("abort",v,{once:!0}),d=()=>c.removeEventListener("abort",v),c.aborted)v()})}import{existsSync as Jt}from"fs";import{platform as jt}from"os";function se(n){let{value:o,encoded:s}=Wre(n);if(s&&n.type==="mcp_request"&&n.method==="tools/call"){let a=o.params;if(a&&typeof a==="object"){let c=a.arguments&&typeof a.arguments==="object"&&!Array.isArray(a.arguments)?a.arguments:{};a.arguments={...c,[SB]:!0}}}return JSON.stringify(o)+`
|
|
16
|
+
`}function Ve(n,o){for(let s=o+1;s<n.length;s++)if(n[s]==="\\")s++;else if(n[s]==='"')return s;return-1}function ze(n,o){let s=n?.toString("utf8");if(!s?.startsWith('{"'))return;try{let a=Ve(s,1);if(JSON.parse(s.slice(1,a+1))!=="id")return null;if(!s.slice(a+1).startsWith(':"'))return;let d=a+2,u=Ve(s,d),m=JSON.parse(s.slice(d,u+1));return o(m)?m:null}catch{e.debug("Oversized daemon frame head contained no complete response id");return}}import{createConnection as Ft}from"net";function Ge(n,o,s){return new Promise((a,c)=>{let d=!1,u=void 0,m=()=>{},p=()=>n.getSocket()!==null&&n.getSocket()!==u,h=(v)=>{if(p())return;n.timer.clearTimeout(b),m(),n.setConnected(!1),n.setSocket(null),u?.destroy();let E=Y(v);if(n.rejectPendingRequests(E,!0),!d)d=!0,c(E)},b=n.timer.setTimeout(()=>{h(new ge(`Failed to connect to daemon within ${o}ms`))},o);if(s){let v=()=>h(new ge("Daemon connection attempt aborted",{cause:s.reason}));s.addEventListener("abort",v,{once:!0}),m=()=>s.removeEventListener("abort",v)}let R=Ft(n.socketPath,()=>{if(d||!u||u.destroyed||p())return;if(n.timer.clearTimeout(b),m(),n.resetInbound(),n.setConnected(!0),e.info(`Connected to daemon at ${n.socketPath}`),!d)d=!0,a()});if(u=R,d){u.on("error",()=>{}),u.destroy();return}n.setSocket(u),u.on("data",(v)=>{if(p())return;n.handleData(typeof v==="string"?Buffer.from(v):v)}),u.on("error",(v)=>{if(p())return;e.error(`Daemon socket error: ${v.message}`),h(v)}),u.once("close",()=>ve(n,R))})}function ve(n,o){let s=n.getSocket();if(s!==null&&s!==o||n.hasClosedSocket(o))return;if(n.handleSocketClosed(o),n.hasPendingRequests())n.rejectPendingRequests(new ge("Daemon socket connection lost: connection closed"),!0)}import{createConnection as Ut}from"net";import{statSync as Ht}from"fs";import{platform as $t}from"os";async function Ke(n,o={}){let s=o.timer??i;if($t()!=="win32")try{if(!Ht(n).isSocket())return!1}catch(a){return e.debug(`src/daemon/client/client.ts fallback failed: ${a}`,a),!1}return new Promise((a)=>{let c=!1,d=(h)=>{if(!c)c=!0,o.signal?.removeEventListener("abort",u),a(h)},u=()=>{s.clearTimeout(p),m.destroy(),d(!1)},m=Ut(n,()=>{s.clearTimeout(p),m.destroy(),d(!0)});m.on("error",()=>{s.clearTimeout(p),m.destroy(),d(!1)});let p=s.setTimeout(()=>{m.destroy(),d(!1)},o.timeoutMs??1000);if(o.signal?.aborted)u();else o.signal?.addEventListener("abort",u,{once:!0})})}function Qe(n,o){let s=n instanceof Error?n:new ge(String(n)),a=o.pidFilePath??Sr,c=_o(a);if(!c||typeof c.pid!=="number")return s;if((o.isProcessRunning??((u)=>st(u,{debugLog:e.debug})))(c.pid))return s;return new ge(`${s.message} \u2014 the recorded daemon PID ${c.pid} is not running; the socket may be stale and will be reclaimed automatically the next time the daemon starts (run \`--daemon restart\` if this persists)`)}class hv extends Error{toolName;origin;constructor(n){let o=n.detail?` (${n.detail})`:"";super(`Daemon disconnected before ${n.toolName} responded at ${n.origin}${o}`);this.name="DaemonDisconnectError",this.toolName=n.toolName,this.origin=n.origin}}class gv extends ge{constructor(n,o){super(n,o);this.name="DaemonRequestNotDeliveredError"}}function We(n,o,s=process.env){let a=X0(n,s);return KA(n,s)!==void 0?a:Math.max(a,rw(o)??0)}class Ee extends t{limitBytes;constructor(n){super(`Daemon response frame exceeded ${n} bytes; the daemon connection was closed.`);this.limitBytes=n;this.name="DaemonFrameTooLargeError"}}class Da{socket=null;socketPath;connectionTimeout;timer;pendingRequests=new Map;cancelledRequestIds=new Set;timedOutRequestAbortCleanups=new Map;framer;inboundClosed=!1;closedSockets=new WeakSet;connected=!1;connectInFlight=null;notificationHandlers=new Set;connectionClosedHandlers=new Set;recoveryOptions;clientIdentity;idGenerator;platform;maxInboundFrameBytes;env;constructor(n=Bt,o=PB,s=i,{recoveryOptions:a={},clientIdentity:c,idGenerator:d=B,platformOverride:u=jt(),maxInboundFrameBytes:m=qre,env:p=process.env}={}){this.socketPath=n,this.connectionTimeout=o,this.timer=s,this.recoveryOptions=a,this.clientIdentity=c===void 0?dV():c,this.idGenerator=d,this.platform=u,this.maxInboundFrameBytes=m,this.env=p,this.framer=this.createInboundFramer()}get testHooks(){return{attachSocket:(n)=>{this.socket=n,this.connected=!0,this.inboundClosed=!1,this.framer=this.createInboundFramer()},simulateIncomingData:(n)=>this.handleData(n),findPendingRequestIdByProgressToken:(n)=>[...this.pendingRequests].find(([,o])=>o.progressToken===n)?.[0],hasPendingRequest:(n)=>this.pendingRequests.has(n),connection:()=>({connected:this.connected,socket:this.socket}),socketClosed:(n)=>ve(this.connectorHost(),n),declaredIdentity:()=>this.clientIdentity,socketPathObservable:()=>this.socketPathObservable()}}handshakeFields(){if(!this.clientIdentity)return{};return{clientVersion:this.clientIdentity.version,clientBuildId:this.clientIdentity.build.buildId,clientEntryScript:this.clientIdentity.build.entryScript}}static async isAvailable(n=Bt,o={}){return Ke(n,o)}async connect(n=this.connectionTimeout,o){if(this.connected)return;if(this.connectInFlight)try{await l(this.connectInFlight,{timer:this.timer,timeoutMs:n,signal:o,label:"Daemon connection attempt",timeoutError:()=>this.annotateStaleSocketHint(new ge(`Failed to connect to daemon within ${n}ms`))});return}catch(a){if(o?.aborted&&a===o.reason)throw this.annotateStaleSocketHint(new ge("Daemon connection attempt aborted",{cause:o.reason}));throw a}let s=(async()=>{let a=this.timer.now()+n;try{if(this.clientIdentity!==null&&!Sl())await bl();await this.connectOnce(this.remainingConnectTimeout(a,n),o)}catch(c){throw this.annotateStaleSocketHint(c)}})();this.connectInFlight=s;try{await s}finally{this.connectInFlight=null}}annotateStaleSocketHint(n){return Qe(n,this.recoveryOptions)}remainingConnectTimeout(n,o){let s=n-this.timer.now();if(s<=0)throw new ge(`Failed to connect to daemon within ${o}ms`);return s}socketPathObservable(){return this.platform==="win32"||Jt(this.socketPath)}async connectOnce(n,o){if(this.connected)return;if(o?.aborted)throw new ge("Daemon connection attempt aborted",{cause:o.reason});if(!this.socketPathObservable())throw new ge(`Daemon socket not found: ${this.socketPath}`);return Ge(this.connectorHost(),n,o)}connectorHost(){return{timer:this.timer,socketPath:this.socketPath,getSocket:()=>this.socket,setSocket:(n)=>{this.socket=n},setConnected:(n)=>{this.connected=n},resetInbound:()=>{this.framer=this.createInboundFramer(),this.inboundClosed=!1},handleData:(n)=>this.handleData(n),handleSocketClosed:(n)=>this.handleSocketClosed(n),hasClosedSocket:(n)=>this.closedSockets.has(n),hasPendingRequests:()=>this.pendingRequests.size>0,rejectPendingRequests:(n,o)=>this.rejectPendingRequests(n,o)}}rejectPendingRequests(n,o){for(let s of this.timedOutRequestAbortCleanups.values())s();for(let[,{reject:s,timeout:a,removeAbortListener:c,disconnectCause:d}]of this.pendingRequests)this.timer.clearTimeout(a),c?.(),s(o?new ge(n.message,{cause:d}):n);this.pendingRequests.clear()}handleData(n){if(!this.inboundClosed)this.framer.push(n)}createInboundFramer(){return new dd(this.maxInboundFrameBytes,{onLine:(n)=>this.handleInboundLine(n),onOverflow:(n)=>this.handleInboundOverflow(n)})}handleInboundLine(n){return $e({inboundClosed:this.inboundClosed,handleResponse:this.handleResponse.bind(this),extendPendingRequestOnProgress:this.extendPendingRequestOnProgress.bind(this),adoptPendingRequestBudget:this.adoptPendingRequestBudget.bind(this),notificationHandlers:this.notificationHandlers,pendingRequests:this.pendingRequests,timer:this.timer,cancelledRequestIds:this.cancelledRequestIds},n)}handleResponse(n){if(n.id!==null)this.timedOutRequestAbortCleanups.get(n.id)?.();Je({pendingRequests:this.pendingRequests,timer:this.timer,cancelledRequestIds:this.cancelledRequestIds},n)}handleInboundOverflow(n){let o=new Ee(this.maxInboundFrameBytes);e.warn(o.message);let s=ze(n,(d)=>this.pendingRequests.has(d)),a=s===void 0&&this.pendingRequests.size===1?this.pendingRequests.keys().next().value:s,c=this.socket;for(let[d,u]of this.pendingRequests)this.timer.clearTimeout(u.timeout),u.removeAbortListener?.(),u.reject(d===a?o:new ge(`Daemon socket connection lost: another frame on the connection exceeded ${this.maxInboundFrameBytes} bytes`,{cause:o}));this.pendingRequests.clear();try{this.handleSocketClosed(c)}finally{c?.destroy()}}handleSocketClosed(n){for(let o of this.timedOutRequestAbortCleanups.values())o();if(n)this.closedSockets.add(n);this.connected=!1,this.socket=null,this.inboundClosed=!0,this.framer=this.createInboundFramer(),e.info("Daemon socket connection closed");for(let o of this.connectionClosedHandlers)o()}extendPendingRequestOnProgress(n,o){let s=this.pendingRequests.get(n);if(s?.progressToken!==o||!s.deadline||s.requestTimeoutMs===void 0)return;let a=this.timer.now();s.deadline.extendOnProgress(a,s.requestTimeoutMs);let c=s.deadline.value-a;if(c<=0)return;this.timer.clearTimeout(s.timeout),s.timeout=this.scheduleRequestTimeout(n,s.toolName,c,s.reject)}adoptPendingRequestBudget(n,o){let s=this.pendingRequests.get(n);if(!s||s.requestTimeoutMs===void 0||!Number.isFinite(o)||o<=0||o===s.requestTimeoutMs)return;let a=this.timer.now();if(s.deadline)s.deadline=new xh(a,o);s.requestTimeoutMs=o,this.timer.clearTimeout(s.timeout),s.timeout=this.scheduleRequestTimeout(n,s.toolName,o,s.reject)}scheduleResponseBackstop(n,o,s){let a=Math.min(s,Ur);return this.timer.setTimeout(()=>{if(s>a){let c=this.pendingRequests.get(n);if(c)c.timeout=this.scheduleResponseBackstop(n,o,s-a)}else o()},a)}scheduleRequestTimeout(n,o,s,a){return this.scheduleResponseBackstop(n,()=>{this.pendingRequests.get(n)?.removeAbortListener?.(),this.pendingRequests.delete(n),this.sendCancelFrame(n),a(new Mr({toolName:o,timeoutMs:s,origin:"DaemonClient.sendRequest",detail:`no response from the daemon within budget + grace (${s}ms + ${U}ms)`}))},s+U)}sendCancelFrame(n){let o=this.socket;if(!o||o.destroyed)return;let s=this.idGenerator.next();this.rememberCancelledRequestId(n),this.rememberCancelledRequestId(s);let a={id:s,type:"daemon_request",method:iR,params:{requestId:n},...this.handshakeFields()};try{o.write(se(a))}catch(c){e.debug(`Daemon cancel frame for ${n} not sent: ${c}`)}}rememberCancelledRequestId(n){if(this.cancelledRequestIds.add(n),this.cancelledRequestIds.size>Be){let o=this.cancelledRequestIds.values().next().value;if(o!==void 0)this.timedOutRequestAbortCleanups.get(o)?.(),this.cancelledRequestIds.delete(o)}}onNotification(n){return this.notificationHandlers.add(n),()=>{this.notificationHandlers.delete(n)}}onConnectionClosed(n){return this.connectionClosedHandlers.add(n),()=>{this.connectionClosedHandlers.delete(n)}}async subscribeToNotifications(n){await this.callDaemonMethod(ck,{},{...n,abortMode:"request"})}async getDaemonStatus(n){let o=new Da(this.socketPath,this.connectionTimeout,this.timer,{recoveryOptions:{},clientIdentity:null});try{let s=await o.callDaemonMethod("ide/status",{},{timeoutMs:n});return fV(s,this.socketPath)}finally{await o.close()}}async callTool(n,o,s,a={}){return this.sendRequest("tools/call",{name:n,arguments:o},s,a)}async relayTaskMethod(n,o,s,{signal:a}={}){return this.sendRequest(n,o,void 0,{signal:a,tasks:s})}async readResource(n,o={},{signal:s}={}){return this.sendRequest("resources/read",{uri:n,...o},void 0,{signal:s})}async sendRequest(n,o,s,{onRequestId:a,signal:c,tasks:d}={}){if(c?.throwIfAborted(),!this.connected)try{await l(()=>this.connect(),{timer:this.timer,signal:c,label:`Daemon request ${n} connection`})}catch(E){if(E instanceof ge)throw new gv(E.message,{cause:E});throw E}c?.throwIfAborted();let u=this.idGenerator.next(),m={id:u,type:"mcp_request",method:n,params:o,...s!==void 0?{progressToken:s}:{},acceptsRequestBudget:!0,...He(d),...this.handshakeFields()},p=We(m,this.connectionTimeout,this.env);m.timeoutMs=p,m.requestedTimeoutMs=rw(KA(m,this.env));let h=se(m),b=n==="tools/call"?o?.name??n:n,R=new hv({toolName:b,origin:"DaemonClient.sendRequest"}),v=s!==void 0?new xh(this.timer.now(),p):void 0;return this.send(u,h,{entry:{toolName:b,progressToken:s,deadline:v,requestTimeoutMs:p,disconnectCause:R},signal:c,armTimeout:(E)=>this.scheduleRequestTimeout(u,b,p,E),onRegistered:()=>a?.(u),socketLostError:()=>new gv("Socket connection lost"),writeError:(E)=>new gv(`Daemon socket write failed: ${r(E)}`,{cause:E}),abortError:()=>c?.reason,destroyOnAbort:!1})}async callDaemonMethod(n,o={},s={}){let a=s.timeoutMs??this.connectionTimeout;if(!Number.isFinite(a)||a<=0)throw new ge(`Daemon request ${n} has no remaining timeout`);if(s.signal?.aborted)throw new ge(`Daemon request ${n} aborted`,{cause:s.signal.reason});let c=this.timer.now()+a;if(!this.connected)await this.connect(this.remainingConnectTimeout(c,a),s.signal);if(s.signal?.aborted)throw new ge(`Daemon request ${n} aborted`,{cause:s.signal.reason});let d=c-this.timer.now();if(d<=0)throw new Mr({toolName:n,timeoutMs:a,origin:"DaemonClient.callDaemonMethod"});let u=this.idGenerator.next(),m=new hv({toolName:n,origin:"DaemonClient.callDaemonMethod"}),p={id:u,type:"daemon_request",method:n,params:o,timeoutMs:d,...this.handshakeFields()};return this.send(u,se(p),{entry:{toolName:n,disconnectCause:m},signal:s.signal,armTimeout:(h,b)=>this.scheduleResponseBackstop(u,()=>{if(this.pendingRequests.delete(u),s.cancelOnTimeout!==!1)b(),this.sendCancelFrame(u);else{if(s.signal)this.timedOutRequestAbortCleanups.set(u,b);this.rememberCancelledRequestId(u)}h(new Mr({toolName:n,timeoutMs:a,origin:"DaemonClient.callDaemonMethod",detail:`no response from the daemon within budget + grace (${d}ms + ${U}ms)`}))},d+U),socketLostError:()=>new ge("Socket connection lost"),writeError:(h)=>Y(h instanceof Error?h:Error(String(h))),abortError:()=>new ge(`Daemon request ${n} aborted`,{cause:s.signal?.reason}),destroyOnAbort:s.abortMode!=="request"})}send(n,o,s){let a={socket:()=>this.socket,pendingRequests:this.pendingRequests,timedOutRequestAbortCleanups:this.timedOutRequestAbortCleanups,timer:this.timer,sendCancelFrame:(c)=>this.sendCancelFrame(c)};return je(a,n,o,s)}async close(){this.connected=!1,this.rejectPendingRequests(new ge("Socket connection closed"),!0);let n=this.socket;if(n)await new Promise((o)=>{let s=(d)=>{if(n.off("close",a),this.timer.clearTimeout(c),d)e.warn("Daemon socket close did not complete before the bounded teardown timeout; proceeding safely");o()},a=()=>s(!1),c=this.timer.setTimeout(()=>s(!0),1000);n.once("close",a),n.destroy()}),this.socket=null;this.notificationHandlers.clear(),this.connectionClosedHandlers.clear()}}class ZS extends ge{code="daemon_restart_pending";retryable=!0;constructor(){super("Daemon restart is pending; retry provisionDevice after the replacement becomes ready.");this.name="DaemonRestartPendingError"}}function g5(n){return{error:{code:n.code,message:n.message,retryable:n.retryable}}}function iee(n){let o=g5(n);return{content:[{type:"text",text:JSON.stringify(o)}],structuredContent:o,isError:!0}}var Ye="another session acquired it while this call was in flight, so the call was cancelled. Acquire the device (setActiveDevice) and retry with that session's sessionUuid, or wait for the holder to release it.";function pu(n){return{executionId:n.id,startTime:n.startTime,sessionClockStartTime:n.sessionClockStartTime}}function re(n,o){return o?.sessionPreserving===!0&&n?.survivesSessionPreservingRecovery===!0}function Se(n){return n.deviceControlCall!==!0&&(n.readOnlySessionAccess===!0||n.deviceReadCall===!0)}function be(n,o){let s=n.readDeadlineMs?.()??Number.POSITIVE_INFINITY;return o?s+(n.sessionClockOffsetMs??0):s}function Vt(n,o){if(n===void 0||n.requestCancelled===!0||n.abortController.signal.aborted)return!1;let s=be(n,!0),a=Number.isFinite(s)?s:n.sessionClockStartTime+o.undatedForMs;return o.at<=a}function Re(n,o,s){if(s===void 0)return!1;if(n===s.excludeExecutionId||re(o,s))return!0;if(s.sessionClockStartedAtOrBefore!==void 0&&(o===void 0||o.sessionClockStartTime>s.sessionClockStartedAtOrBefore))return!0;if(s.liveOnSessionClock&&!Vt(o,s.liveOnSessionClock))return!0;return s.excludeReads===!0&&o!==void 0&&Se(o)}function Xe(n){if(n===void 0)return!0;return n.startedAtOrBefore===void 0&&n.sessionClockStartedAtOrBefore===void 0&&n.liveOnSessionClock===void 0&&n.excludeExecutionId===void 0&&n.onlyToolName===void 0&&n.onlySessionUuid===void 0&&!n.excludeReads&&!n.sessionPreserving}class Ze{executions=new Map;sessionExecutions=new Map;deviceExecutions=new Map;deviceLastActivityAt=new Map;sessionUuidExecutions=new Map;autolockSessionExecutions=new Map;executionEndListeners=new Set;sessionExecutionEndListeners=new Set;timer;idGenerator;daemonRestartPrepared=!1;daemonMaintenancePrepared=!1;activeProvisionDeviceQuery;autolockSessionResolver;sessionClockOffsetProvider=()=>0;constructor(n=i,o=B){this.timer=n,this.idGenerator=o}setSessionClockOffsetProvider(n){this.sessionClockOffsetProvider=n}setActiveProvisionDeviceQuery(n){this.activeProvisionDeviceQuery=n}setAutolockSessionResolver(n){this.autolockSessionResolver=n}startExecution(n,o,s,{transportSessionId:a,unresolvedAutolockMcpSessionId:c}={}){if(this.isDaemonRestartPrepared()||this.isDaemonMaintenancePrepared())throw new ZS;let d=this.idGenerator.next(),u=this.timer.now(),m={id:d,toolName:n,sessionId:o,transportSessionId:a,sessionUuid:s,provisionalAutolockSessionUuid:c?this.autolockSessionResolver?.autolockSessionForMcpSession(c):void 0,startTime:u,sessionClockStartTime:u+this.sessionClockOffsetProvider(u),abortController:new AbortController};if(this.executions.set(d,m),o)this.registerSessionExecution(o,d);if(a&&a!==o)this.registerSessionExecution(a,d);if(s){let p=this.sessionUuidExecutions.get(s)??new Set;p.add(d),this.sessionUuidExecutions.set(s,p)}return m}prepareForDaemonRestart(){return this.prepareForDaemonRestartAdmission(!1)}prepareForAdmittedDaemonRestart(){if(!this.daemonMaintenancePrepared)return"restart_pending";return this.prepareForDaemonRestartAdmission(!0)}prepareForDaemonRestartAdmission(n){if(this.daemonRestartPrepared)return"restart_pending";if(this.daemonMaintenancePrepared&&!n)return"restart_pending";if(this.executions.size>0||this.activeProvisionDeviceQuery?.hasActiveProvisionDeviceOperation())return"active_operations";return this.daemonRestartPrepared=!0,"accepted"}clearDaemonRestartPreparation(){this.daemonRestartPrepared=!1}prepareForDaemonMaintenance(n){if(this.daemonMaintenancePrepared)return"maintenance_pending";if(n>0)return"active_sessions";if(this.executions.size>0||this.daemonRestartPrepared)return"active_operations";return this.daemonMaintenancePrepared=!0,"accepted"}clearDaemonMaintenancePreparation(){this.daemonMaintenancePrepared=!1}isDaemonRestartPrepared(){return this.daemonRestartPrepared}isDaemonMaintenancePrepared(){return this.daemonMaintenancePrepared}endExecution(n){let o=this.executions.get(n);if(!o)return;if(this.executions.delete(n),o.unsubscribeDeadlineExtensions?.(),this.unregisterDeviceExecutions(n,o.deviceIds),o.sessionId)this.unregisterSessionExecution(o.sessionId,n);if(o.transportSessionId&&o.transportSessionId!==o.sessionId)this.unregisterSessionExecution(o.transportSessionId,n);if(o.sessionUuid){let s=this.sessionUuidExecutions.get(o.sessionUuid);if(s?.delete(n),s?.size===0)this.sessionUuidExecutions.delete(o.sessionUuid)}if(o.resolvedAutolockSessionUuid)this.unregisterAutolockSessionExecution(o.resolvedAutolockSessionUuid,n);this.notifySessionExecutionEnded(o);for(let s of this.executionEndListeners)s()}onSessionExecutionEnded(n){return this.sessionExecutionEndListeners.add(n),()=>{this.sessionExecutionEndListeners.delete(n)}}getSessionClockStartTime(n){return this.executions.get(n)?.sessionClockStartTime}setExecutionDeadline(n,o,s){let a=this.executions.get(n);if(a)a.readDeadlineMs=o,a.sessionClockOffsetMs=this.sessionClockOffsetProvider(),a.unsubscribeDeadlineExtensions?.(),a.unsubscribeDeadlineExtensions=s?.(()=>{a.sessionClockOffsetMs=this.sessionClockOffsetProvider()})}getLatestSessionExecutionDeadlineMs(n,o={}){let s=this.sessionUuidExecutions.get(n),a=this.autolockSessionExecutions.get(n),c;for(let d of this.executions.values())if((d.provisionalAutolockSessionUuid===n||s?.has(d.id)||a?.has(d.id))&&!(o.excludeReads&&Se(d))){let m=be(d,o.onSessionClock);c=c===void 0?m:Math.max(c,m)}return c}markSessionAdmitted(n){let o=this.executions.get(n);if(o)o.sessionAdmitted=!0}unmarkSessionAdmitted(n){let o=this.executions.get(n);if(o)o.sessionAdmitted=!1}markSessionlessDeviceUse(n,o){let s=this.executions.get(n);if(s)s.sessionlessDeviceUse??=new Set,s.sessionlessDeviceUse.add(o),s.sessionlessControlUse??=new Set,s.sessionlessControlUse.add(o)}unmarkSessionlessDeviceUse(n,o){let s=this.executions.get(n);if(s?.sessionlessControlUse?.delete(o),!s?.sessionlessReadReadiness?.has(o))s?.sessionlessDeviceUse?.delete(o)}markSessionlessReadReadiness(n,o,s){let a=this.executions.get(n);if(!a)return;a.sessionlessDeviceUse??=new Set,a.sessionlessDeviceUse.add(o),a.sessionlessReadReadiness??=new Map;let c=a.sessionlessReadReadiness.get(o)??new Set;c.add(s),a.sessionlessReadReadiness.set(o,c)}unmarkSessionlessReadReadiness(n,o,s){let a=this.executions.get(n);if(!a)return;let c=a.sessionlessReadReadiness?.get(o);if(c?.delete(s),!c?.size){if(a.sessionlessReadReadiness?.delete(o),!a.sessionlessControlUse?.has(o))a.sessionlessDeviceUse?.delete(o)}}cancelSessionlessDeviceUse(n,o={}){let s=0;for(let a of this.executions.values()){if(a.id===o.excludeExecutionId||!a.sessionlessDeviceUse?.has(n)||a.abortController.signal.aborted)continue;let c=new mt(a.toolName,n,void 0,{remedy:Ye});if(a.sessionlessControlUse?.has(n))this.abortExecution(a,c);else if(!this.cancelReadReadiness(a,n,c))continue;s++,e.info(`[ExecutionTracker] Cancelled sessionless execution ${a.id} on ${n}: a session acquired the device (tool=${a.toolName})`)}return s}cancelReadReadiness(n,o,s){let a=[...n.sessionlessReadReadiness?.get(o)??[]].filter((c)=>!c.signal.aborted);for(let c of a)c.abort(s);return a.length>0}markDeviceReadCall(n,o){let s=this.executions.get(n);if(s&&s.toolName===o&&!s.deviceControlCall)s.deviceReadCall=!0}markDeviceControlCall(n){let o=this.executions.get(n);if(o)o.deviceControlCall=!0,o.deviceReadCall=!1}getAdmittedSessionUse(n){let o=this.executions.get(n);if(!o?.sessionAdmitted||o.deviceReadCall||o.readOnlySessionAccess)return;return o.sessionUuid??o.resolvedAutolockSessionUuid}markReadOnlySessionAccess(n){let o=this.executions.get(n);if(o)o.readOnlySessionAccess=!0}markRequestCancelled(n){let o=this.executions.get(n);if(o)o.requestCancelled=!0}notifySessionExecutionEnded(n){let o=[...new Set([n.sessionUuid,n.resolvedAutolockSessionUuid,n.provisionalAutolockSessionUuid].filter((a)=>typeof a==="string"&&a.length>0))];if(o.length===0)return;let s=n.sessionAdmitted===!0&&!n.readOnlySessionAccess;for(let a of this.sessionExecutionEndListeners)try{a(o,{admitted:s,toolName:n.toolName})}catch(c){e.warn(`[ExecutionTracker] Session execution-end listener failed: ${r(c)}`)}}getActiveExecutionCount(){return this.executions.size}getActiveDeviceSessionExecutionCount(n){return new Set([...this.sessionUuidExecutions.get(n)??[],...this.autolockSessionExecutions.get(n)??[],...this.unresolvedAutolockExecutionIds(n)]).size}async cancelSessionExecutions(n,o="unspecified"){return this.cancelExecutionsForKey(n,this.sessionExecutions,"sessionId",{cancelReason:o})}async cancelToolExecutions(n,o="unspecified"){let s=Array.from(this.executions.values()).filter((a)=>a.toolName===n).map((a)=>a.id);return this.cancelExecutionIds(s,"toolName",n,{cancelReason:o})}async waitForToolExecutionsToEnd(n,o){return await this.waitUntilNoneActive(()=>this.hasActiveToolExecutionGlobal(n),o)}async waitForSessionExecutionsToEnd(n,o){return await this.waitUntilNoneActive(()=>this.hasActiveSessionExecutions(n),o)}async waitUntilNoneActive(n,o){if(!n())return!0;return await new Promise((s)=>{let a=!1,c={},d=(m)=>{if(a)return;if(a=!0,this.executionEndListeners.delete(u),c.handle!==void 0)this.timer.clearTimeout(c.handle);s(m)},u=()=>{if(!n())d(!0)};this.executionEndListeners.add(u),c.handle=this.timer.setTimeout(()=>d(!1),o),u()})}async cancelSessionUuidExecutions(n,o="unspecified",s={}){return this.cancelExecutionsForKey(n,this.sessionUuidExecutions,"sessionUuid",{cancelReason:o,...s})}bindDeviceExecution(n,o,s={}){let a=this.executions.get(n);if(!a)return;let c=a.revokedDeviceBindings?.get(o);if(c){if(s.skipRevoked)return;throw new t(c.message,{cause:c})}a.deviceIds??=new Set,a.deviceIds.add(o);let d=this.deviceExecutions.get(o)??new Set;d.add(n),this.deviceExecutions.set(o,d),this.deviceLastActivityAt.set(o,this.timer.now())}getActiveDeviceExecutionCount(n){return this.deviceExecutions.get(n)?.size??0}getDeviceIdleForMs(n){let o=this.deviceLastActivityAt.get(n);return o===void 0?null:Math.max(0,this.timer.now()-o)}async cancelDeviceExecutions(n,o="unspecified",s={}){if(s.onlySessionUuid!==void 0)this.revokeSessionDeviceBindings(n,o,s);return this.cancelExecutionIds(this.deviceExecutions.get(n),"deviceId",n,{cancelReason:o,...s})}revokeSessionDeviceBindings(n,o,s){let a=o instanceof Error?o:new t(o);for(let c of this.executions.values())if(c.id!==s.excludeExecutionId&&!re(c,s)&&(s.onlyToolName===void 0||c.toolName===s.onlyToolName)&&(s.onlyToolName===void 0||c.deviceIds?.has(n))&&this.isInCancellationScope(c,s))c.revokedDeviceBindings??=new Map,c.revokedDeviceBindings.set(n,a)}hasActiveDeviceExecutions(n,o){return this.hasActiveExecutionsForKey(this.deviceExecutions,n,o)}async waitForDeviceExecutionsToEnd(n,o,s){return this.waitForExecutionsToEnd(()=>this.hasActiveDeviceExecutions(n,s),o)}async cancelDeviceSessionExecutions(n,o="unspecified",s={}){let a=new Set([...this.sessionUuidExecutions.get(n)??[],...this.autolockSessionExecutions.get(n)??[],...this.unresolvedAutolockExecutionIds(n)]);return this.cancelExecutionIds(a,"deviceSessionUuid",n,{cancelReason:o,...s})}async waitForDeviceSessionExecutionsToEnd(n,o,s){return this.waitForExecutionsToEnd(()=>this.hasActiveDeviceSessionExecutions(n,s),o)}async waitForExecutionsToEnd(n,o){if(!n())return!0;return await new Promise((s)=>{let a=!1,c={},d=(m)=>{if(a)return;if(a=!0,this.executionEndListeners.delete(u),c.handle!==void 0)this.timer.clearTimeout(c.handle);s(m)},u=()=>{if(!n())d(!0)};this.executionEndListeners.add(u),c.handle=this.timer.setTimeout(()=>d(!1),o),u()})}hasActiveDeviceSessionExecutions(n,o){return this.hasActiveSessionUuidExecutions(n,o)||this.hasActiveAutolockSessionExecutions(n,o)}hasActiveSessionUuidExecutions(n,o){return this.hasActiveExecutionsForKey(this.sessionUuidExecutions,n,o)}hasActiveSessionExecutions(n,o){return this.hasActiveExecutionsForKey(this.sessionExecutions,n,o)}setResolvedAutolockSessionUuid(n,o){let s=this.executions.get(n);if(!s)return;let a=s.provisionalAutolockSessionUuid;if(s.provisionalAutolockSessionUuid=void 0,s.resolvedAutolockSessionUuid===o){if(a&&a!==o)for(let c of this.executionEndListeners)c();return}if(s.resolvedAutolockSessionUuid)this.unregisterAutolockSessionExecution(s.resolvedAutolockSessionUuid,n);if(s.resolvedAutolockSessionUuid=o,o){let c=this.autolockSessionExecutions.get(o)??new Set;c.add(n),this.autolockSessionExecutions.set(o,c)}for(let c of this.executionEndListeners)c()}hasActiveAutolockSessionExecutions(n,o){return this.hasActiveExecutionsForKey(this.autolockSessionExecutions,n,o)||this.unresolvedAutolockExecutionIds(n).some((s)=>{let a=this.executions.get(s);return!Re(s,a,o)&&(o?.onlyToolName===void 0||a?.toolName===o.onlyToolName)&&(o?.startedAtOrBefore===void 0||a!==void 0&&a.startTime<=o.startedAtOrBefore)})}unresolvedAutolockExecutionIds(n){let o=[];for(let s of this.executions.values())if(s.provisionalAutolockSessionUuid===n)o.push(s.id);return o}hasActiveToolExecution(n,o){if(o.scope==="global")return this.hasActiveToolExecutionGlobal(n);if(o.sessionUuid)return this.hasActiveToolExecutionForKey(n,this.sessionUuidExecutions,o.sessionUuid);if(o.sessionId)return this.hasActiveToolExecutionForKey(n,this.sessionExecutions,o.sessionId);return this.hasActiveToolExecutionGlobal(n)}hasActiveToolExecutionGlobal(n){for(let o of this.executions.values())if(o.toolName===n)return!0;return!1}unregisterDeviceExecutions(n,o){for(let s of o??[]){this.deviceLastActivityAt.set(s,this.timer.now());let a=this.deviceExecutions.get(s);if(a?.delete(n),a?.size===0)this.deviceExecutions.delete(s)}}registerSessionExecution(n,o){let s=this.sessionExecutions.get(n)??new Set;s.add(o),this.sessionExecutions.set(n,s)}unregisterSessionExecution(n,o){let s=this.sessionExecutions.get(n);if(s?.delete(o),s?.size===0)this.sessionExecutions.delete(n)}unregisterAutolockSessionExecution(n,o){let s=this.autolockSessionExecutions.get(n);if(s?.delete(o),s?.size===0)this.autolockSessionExecutions.delete(n)}hasActiveExecutionsForKey(n,o,s){let a=n.get(o);if(!a||a.size===0)return!1;if(Xe(s))return!0;return Array.from(a).some((c)=>{let d=this.executions.get(c);return d!==void 0&&!Re(c,d,s)&&(s?.onlyToolName===void 0||d.toolName===s.onlyToolName)&&this.belongsToSessionFilter(d,s?.onlySessionUuid)&&(s?.startedAtOrBefore===void 0||d.startTime<=s.startedAtOrBefore)})}isInCancellationScope(n,o){return this.belongsToSessionFilter(n,o.onlySessionUuid)||o.includeExecutionIds?.includes(n.id)===!0}belongsToSessionFilter(n,o){return o===void 0||n.sessionUuid===o||n.resolvedAutolockSessionUuid===o||n.provisionalAutolockSessionUuid===o}hasActiveToolExecutionForKey(n,o,s){let a=o.get(s);if(!a||a.size===0)return!1;for(let c of a)if(this.executions.get(c)?.toolName===n)return!0;return!1}async cancelExecutionsForKey(n,o,s,{cancelReason:a="unspecified",...c}={}){return this.cancelExecutionIds(o.get(n),s,n,{cancelReason:a,...c})}async cancelExecutionIds(n,o,s,{cancelReason:a="unspecified",...c}={}){if(!n)return 0;let d=0;for(let u of n){let m=this.executions.get(u);if(!m)continue;if(m.id===c.excludeExecutionId||re(m,c)||c.onlyToolName!==void 0&&m.toolName!==c.onlyToolName||!this.isInCancellationScope(m,c))continue;this.abortExecution(m,a),d++,e.info(`[ExecutionTracker] Cancelled execution ${u} for ${o}=${s} (tool=${m.toolName}, reason=${r(a)})`)}return d}abortExecution(n,o){if(Cg(o)){let s=Te(o)??Error(o);if(n.cancelReason=s,St(s))nb(n.abortController.signal,s);n.abortController.abort(s)}else if(o instanceof Error)n.cancelReason=o,n.abortController.abort(o);else n.abortController.abort()}}var G=new Ze;
|
|
17
|
+
export{cV,qQ,s5,a5,S_,VQ,c5,WQ,zQ,d5,zA,Vo,gc,ro,Ms,dV,l5,jQ,w_,W0,z0,R_,u5,KQ,ge,al,Ph,lV,GQ,ia,up,uV,Mr,p5,YQ,JQ,mv,m5,fv,f5,Ah,j0,P_,XQ,ZQ,pV,K0,h5,QQ,eee,tee,ree,mV,nee,A_,fV,hv,gv,Da,ZS,g5,iee,pu,G};
|
|
18
|
+
|
|
19
|
+
//# debugId=9EA376D7005B215464756E2164756E21
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{e}from"./chunk-r0vp315h.js";import"./chunk-5wk1t46v.js";import{Gp}from"./chunk-r6pvhj33.js";import"./chunk-8nj68t1v.js";import{_o}from"./chunk-sfqe223f.js";import"./chunk-z8tvs8nk.js";import"./chunk-aewdveet.js";import"./chunk-jvstjnqm.js";import"./chunk-6hrj3jt6.js";import"./chunk-w5yypt53.js";import"./chunk-4vxeq0vd.js";import"./chunk-xn9m3xc2.js";import"./chunk-xezekwwn.js";import"./chunk-9xgnrv5w.js";import"./chunk-e0870khr.js";import"./chunk-cqhw4yr6.js";import{op}from"./chunk-3h5jz1vb.js";import"./chunk-hpzxdp1k.js";import"./chunk-tx4f0h9c.js";import"./chunk-yqfz4vts.js";import"./chunk-sqdrxjw5.js";import"./chunk-c27yv1dx.js";import"./chunk-vdqag3fj.js";import"./chunk-cb1ga9rd.js";import{r,t}from"./chunk-2b39zyxc.js";import{realpathSync as p}from"fs";import{basename as h,dirname as g,resolve as f}from"path";function b(o){let n=f(o);try{return p(n)}catch(a){e.debug(`Direct-mode DB realpath unavailable: ${r(a)}`);try{return f(p(g(n)),h(n))}catch(D){return e.debug(`Direct-mode DB parent realpath unavailable: ${r(D)}`),n}}}function P(o,n){return o.filter((a)=>a.dbPath!==void 0&&b(a.dbPath)===n)}function _(o){let n=b(o.resolveDbPath()),a=o.findLiveDaemonDbOwners(),D=P(a,n);if(D.length>0){let i=D.map((c)=>c.pid).join(", ");throw new t(`A live AutoMobile daemon (pid ${i}) already owns the database at ${n}. Direct mode (--no-proxy/--direct) would open a second writer on the same SQLite file, causing SQLITE_BUSY stalls and competing migrations. Resolve this by either running without --no-proxy/--direct to share the daemon, stopping the daemon, or setting AUTOMOBILE_DB_PATH (or AUTOMOBILE_DB_DIR) to an isolated database for this direct-mode instance.`)}let d=a.filter((i)=>i.dbPath===void 0);if(d.length>0){let i=d.map((c)=>c.pid).join(", ");throw new t(`Cannot safely start direct mode (--no-proxy/--direct): a live AutoMobile daemon (pid ${i}) is running but its database path could not be determined (it may still be starting up, or is using a non-default PID file), so a collision on ${n} cannot be ruled out. Wait for the daemon to finish starting and retry, stop the daemon, or set AUTOMOBILE_DB_PATH (or AUTOMOBILE_DB_DIR) to an isolated database for this direct-mode instance.`)}}function I(o={}){let n=o.manager??new op,a=o.readPidFileData??_o;return{resolveDbPath:o.resolveDbPath??Gp,findLiveDaemonDbOwners:()=>{let d;try{d=n.findLiveDaemonProcesses()}catch(l){let u=r(l);throw e.warn(`Direct-mode guard: process-table scan failed; refusing direct mode because same-DB daemon ownership cannot be verified. ${u}`,l),new t(`Cannot verify daemon ownership before starting direct mode (--no-proxy/--direct): failed to inspect the process table (${u}). Retry, stop any running daemon, or set AUTOMOBILE_DB_PATH (or AUTOMOBILE_DB_DIR) to an isolated database.`)}if(d.length===0)return[];let i=[],c=new Set,s=a();if(s&&typeof s.pid==="number"&&s.dbPath!==void 0&&d.includes(s.pid))i.push({pid:s.pid,dbPath:s.dbPath}),c.add(s.pid);let m=d.filter((l)=>!c.has(l));if(m.length>0){e.debug(`Direct-mode guard: ${m.length} live daemon(s) could not be mapped to a DB path (starting up or non-default PID file); direct mode will refuse to be safe: ${m.join(", ")}`);for(let l of m)i.push({pid:l,dbPath:void 0})}return i}}}export{_ as assertDirectModeDbOwnership,I as createDefaultDirectModeGuardDeps};
|
|
3
|
+
|
|
4
|
+
//# debugId=A0EE791DED86703464756E2164756E21
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{XK,ZK,QK}from"./chunk-s4g43k75.js";import"./chunk-13qxf7ym.js";import"./chunk-yqfz4vts.js";import"./chunk-4vxeq0vd.js";import"./chunk-9xgnrv5w.js";import"./chunk-69pmjdf2.js";import"./chunk-sfqe223f.js";import"./chunk-r6pvhj33.js";import"./chunk-w5yypt53.js";import"./chunk-aewdveet.js";import"./chunk-r0vp315h.js";import"./chunk-5wk1t46v.js";export{XK as getDeviceSnapshotSocketPath,ZK as startDeviceSnapshotSocketServer,QK as stopDeviceSnapshotSocketServer};
|
|
3
|
+
|
|
4
|
+
//# debugId=17F7D57B7E1A969764756E2164756E21
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{gD,ki,Sf,Ks,Xn}from"./chunk-sfqe223f.js";import"./chunk-5wk1t46v.js";import"./chunk-r0vp315h.js";import"./chunk-r6pvhj33.js";import"./chunk-aewdveet.js";import{cv}from"./chunk-8nj68t1v.js";import{Yh}from"./chunk-c3ewxm4x.js";import{Mw,Fw,Ote,Lw}from"./chunk-4vxeq0vd.js";import{t}from"./chunk-2b39zyxc.js";function m(r,o,e){let i=Sf(r,o);if(!i.value)throw new t(`${e} requires a value.`);return{value:i.value,consumed:i.last-o}}function v(r,o){let e=Ks(ki(r).inlineValue);if(e===void 0)throw new t(`${o} must be true or false.`);return e}function d(r){let o={preferRunning:!0};for(let e=0;e<r.length;e++)e+=f(o,r,e,ki(r[e]).flag);if(o.platform!=="android"&&o.platform!=="ios")throw new t("--platform must be android or ios.");return o}function f(r,o,e,i){let u={"--platform":"platform","--device-id":"deviceId","--name":"name","--min-os-version":"minOsVersion","--max-os-version":"maxOsVersion"}[i];if(u){let{value:s,consumed:a}=m(o,e,i);return r[u]=s,a}if(i==="--timeout-ms"){let{value:s,consumed:a}=m(o,e,i),c=Number(s);if(!Number.isFinite(c)||c<=0)throw new t("--timeout-ms must be a positive number.");return r.timeoutMs=c,a}if(i==="--create-if-missing")return r.createIfMissing=v(o[e],i),0;if(i==="--no-prefer-running")return r.preferRunning=!v(o[e],i),0;throw new t(`Unknown boot-device argument: ${i}`)}async function I(r){let o=d(r),e=await Ote(o),n=await new Lw({deviceManager:e?.deviceManager??new Xn,deviceMatcher:new gD,deviceCreationGate:Mw(),deviceProvisioner:e?.deviceProvisioner??Fw(void 0,void 0,cv()),matchingStrategy:Yh,bootRecovery:e?.recovery}).boot(e?.request??o);console.log(JSON.stringify({deviceId:n.device.deviceId,name:n.device.name,platform:n.device.platform,osVersion:n.device.osVersion,source:n.source,processId:n.processId,provisioned:n.provisioned}))}export{I as runBootDeviceCommand};
|
|
3
|
+
|
|
4
|
+
//# debugId=42D681EFF9AF7B6C64756E2164756E21
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{i,dr,l,e}from"./chunk-r0vp315h.js";import{w,$t,xz,H,In,YB,_n,za}from"./chunk-sfqe223f.js";import{bm,dv,hQ,VA,WA,lv}from"./chunk-8nj68t1v.js";import{$U,cG}from"./chunk-r54cxxze.js";import{Jd}from"./chunk-gadtna7s.js";import{pu,G}from"./chunk-jvstjnqm.js";import{Ro,bte}from"./chunk-cqhw4yr6.js";var f=new Set(["light","dark","auto"]),v="Automatic appearance sync is disabled by AUTOMOBILE_APPEARANCE_SYNC.",m="No device was targeted: the configuration is stored, but no device was changed. Name a session or start a device first.",d={getPooledDevices:()=>{let n=w.devicePool();if(!n)return[];return n.getAllDevices().filter((t)=>dr(t.platform)).map((t)=>({deviceId:t.id,name:t.name,platform:t.platform}))},getSessionDevice:(n)=>{let t=n?.trim();if(!t)return;let o=w.sessionManager();if(!o)return Ro(t)?.device;let a=o.getDeviceForSession(t),r=a?w.devicePool()?.getDevice(a):void 0;return r&&dr(r.platform)?{deviceId:r.id,name:r.name,platform:r.platform}:void 0},getSessionForDevice:(n,t)=>{let o=w.sessionManager();if(o)return o.getSessionForDevice(n);let a=t?.trim(),r=a?Ro(a):void 0;return r?.device.deviceId===n?r.sessionUuid:null},getSessionManager:()=>w.sessionManager()};function vce(n){return{...d,getSessionlessDevices:()=>[...n(),...bte()]}}var S={getConfig:dv,updateConfig:hQ,resolveMode:VA,applyToDevice:WA,triggerSync:cG,isSyncEnabled:lv};class g extends za{authenticator;deviceSource;dependencies;constructor(n=$t(xz),t=i,o=_n("appearance",{allowObserverSessions:!0}),{deviceSource:a=d,dependencies:r=S}={}){super(n,t,"Appearance");this.authenticator=o;this.deviceSource=a,this.dependencies=r}bypassesRequestChain(n){return(n.command??n.method)==="get_appearance_config"}async handleRequest(n){let t=n.command??n.method;switch(t){case"get_appearance_config":{let o=await this.dependencies.getConfig(this.configKey(n.sessionUuid));return{id:n.id,type:"appearance_response",success:!0,result:{config:o}}}case"set_appearance_sync":return this.handleSetAppearanceSync(n);case"set_appearance":return this.handleSetAppearance(n);default:throw Error(`Unsupported appearance command: ${t}`)}}async handleSetAppearanceSync(n){this.authenticator.authorize({sessionUuid:n.sessionUuid});let t=n.params?.enabled??n.enabled;if(typeof t!=="boolean")throw Error("set_appearance_sync requires enabled boolean");return this.asControlCall("set_appearance_sync",n.sessionUuid,async(o)=>{let a=await this.dependencies.updateConfig({syncWithHost:t},this.configKey(n.sessionUuid)),r=await this.applyToTargets(a,o);return await this.dependencies.triggerSync(),{id:n.id,type:"appearance_response",success:!0,result:{config:a,appliedMode:r??void 0,...this.warningFor(t,o)}}})}async handleSetAppearance(n){this.authenticator.authorize({sessionUuid:n.sessionUuid});let t=n.params?.mode??n.mode;if(!t||!f.has(String(t).toLowerCase()))throw Error("set_appearance requires mode: light | dark | auto");let o=String(t).toLowerCase();return this.asControlCall("set_appearance",n.sessionUuid,async(a)=>{let r=await this.dependencies.updateConfig({defaultMode:o,syncWithHost:o==="auto"},this.configKey(n.sessionUuid)),s=await this.applyToTargets(r,a,o);return await this.dependencies.triggerSync(),{id:n.id,type:"appearance_response",success:!0,result:{config:r,appliedMode:s??void 0,...this.warningFor(o==="auto",a)}}})}async asControlCall(n,t,o){let a=[];try{for(let r of this.getTargets(t)){let s={device:r};a.push(s),await this.admitOnHolderSession(n,s)}return await o(a)}finally{for(let{execution:r}of a)if(r)G.endExecution(r.id)}}async admitOnHolderSession(n,t){let o=t.device.deviceId,a=this.deviceSource.getSessionManager?.();if(!a||this.authenticator.isAuthenticationEnforced?.()===!1)return;let r=this.deviceSource.getSessionForDevice(o);if(!r)return;let s=G.startExecution(n,void 0,r);t.execution=s,G.bindDeviceExecution(s.id,o);let c=s.abortController.signal;if(await YB({deviceId:o,holderSessionUuid:r,sessionManager:a,execution:pu(s),signal:c}),c.aborted)throw bm(s.cancelReason)??c.reason;G.markSessionAdmitted(s.id)}createErrorResponse(n,t){return{id:n??"unknown",type:"appearance_response",success:!1,error:t}}warningFor(n,t){let o=[this.automaticSyncWarning(n),t.length===0&&this.authenticator.isAuthenticationEnforced?.()===!1?{warning:m}:{}].flatMap((a)=>("warning"in a)?[a.warning]:[]);return o.length>0?{warning:o.join(" ")}:{}}automaticSyncWarning(n){return n&&!(this.dependencies.isSyncEnabled??lv)()?{warning:v}:{}}async applyToTargets(n,t,o){let a=o&&o!=="auto"?o:await this.dependencies.resolveMode(n);if(t.length===0)return null;for(let r of t){let{device:s}=r;try{await l(()=>this.applyToTarget(r,a),{timer:this.timer,timeoutMs:this.dependencies.applyDeadlineMs??$U,label:`Appearance apply for ${s.deviceId}`})}catch(c){let p=bm(r.execution?.cancelReason);if(p)throw p;e.warn(`[Appearance] Failed to apply appearance to ${s.deviceId}: ${c}`)}}return a}async applyToTarget(n,t){let o=async()=>{await Jd(n.device,["nightMode"]),await this.dependencies.applyToDevice(n.device,t)},a=n.execution?.abortController.signal;await(a?H(a,o):o())}configKey(n){if(this.authenticator.isAuthenticationEnforced?.()===!1)return;return this.authenticator.resolveSessionIdentity?.(n)??(n?.trim()||void 0)}sessionlessDevices(n){return!n&&this.authenticator.isAuthenticationEnforced?.()===!1?this.deviceSource.getSessionlessDevices?.()??[]:[]}getTargets(n){let t=n?.trim()||void 0,o=new Map;for(let c of this.deviceSource.getPooledDevices())o.set(c.deviceId,c);let a=this.deviceSource.getSessionDevice(t);if(a)o.set(a.deviceId,a);for(let c of this.sessionlessDevices(t))o.set(c.deviceId,c);if(this.authenticator.isAuthenticationEnforced?.()===!1)return[...o.values()];let r=this.configKey(t),s=[...o.values()].filter((c)=>{let p=this.deviceSource.getSessionForDevice(c.deviceId,t);if(!r||!p)return!1;return(this.authenticator.resolveSessionIdentity?.(p)??p)===r});if(s.length===0)e.info(`[Appearance] Session ${r??"unknown"} owns no device; config stored`);return s}}var u=new In;function eG(){return u.instance?.getSocketPath()??$t(xz)}async function tG(n=d){await u.start(()=>new g(void 0,void 0,void 0,{deviceSource:n}))}async function rG(){await u.stop()}
|
|
3
|
+
export{vce,eG,tG,rG};
|
|
4
|
+
|
|
5
|
+
//# debugId=1F2AD7C9B7C2F00B64756E2164756E21
|