@kaeawc/auto-mobile 0.0.91 → 0.0.92

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (267) hide show
  1. package/dist/build-info.json +12 -12
  2. package/dist/schemas/README.md +16 -0
  3. package/dist/schemas/prototype-icon-names.json +302 -0
  4. package/dist/src/chunk-09442h7v.js +4 -0
  5. package/dist/src/chunk-0dfnyfkh.js +5 -0
  6. package/dist/src/chunk-0e4gm1kj.js +5 -0
  7. package/dist/src/chunk-0eb8576f.js +4 -0
  8. package/dist/src/chunk-0rjm4nx7.js +5 -0
  9. package/dist/src/chunk-0w1spptt.js +6 -0
  10. package/dist/src/chunk-1zmh2eak.js +4 -0
  11. package/dist/src/chunk-28k63ha3.js +5 -0
  12. package/dist/src/chunk-2d4wmp8b.js +4 -0
  13. package/dist/src/chunk-2e6s75qv.js +78 -0
  14. package/dist/src/chunk-2v7tw1nj.js +5 -0
  15. package/dist/src/chunk-32jpxz2y.js +323 -0
  16. package/dist/src/chunk-34zxqcmq.js +5 -0
  17. package/dist/src/chunk-3jmvqygr.js +238 -0
  18. package/dist/src/chunk-3swvfhqt.js +5 -0
  19. package/dist/src/chunk-44bt78m9.js +5 -0
  20. package/dist/src/chunk-488vt2bp.js +4 -0
  21. package/dist/src/chunk-4fgdhcwx.js +5 -0
  22. package/dist/src/chunk-4jp2se4w.js +4 -0
  23. package/dist/src/chunk-4pfftt07.js +5 -0
  24. package/dist/src/chunk-4vhr9e4t.js +4 -0
  25. package/dist/src/chunk-4xd6zs3y.js +15 -0
  26. package/dist/src/chunk-51567pg8.js +4 -0
  27. package/dist/src/chunk-5agqsfev.js +4 -0
  28. package/dist/src/chunk-5d706gmr.js +4 -0
  29. package/dist/src/chunk-5kd4rqk7.js +5 -0
  30. package/dist/src/chunk-5s645vr4.js +4 -0
  31. package/dist/src/chunk-61t538bm.js +4 -0
  32. package/dist/src/chunk-6d3mmqxt.js +54 -0
  33. package/dist/src/chunk-6hyt398x.js +5 -0
  34. package/dist/src/chunk-6mnr8kpm.js +4 -0
  35. package/dist/src/chunk-6pg7bqck.js +4 -0
  36. package/dist/src/chunk-79q5xsdc.js +42 -0
  37. package/dist/src/chunk-7bdgand3.js +4 -0
  38. package/dist/src/chunk-84cp9dw5.js +4 -0
  39. package/dist/src/chunk-86f2h5ww.js +5 -0
  40. package/dist/src/chunk-8cghfzb2.js +19 -0
  41. package/dist/src/chunk-8en08r7q.js +5 -0
  42. package/dist/src/chunk-950qcq1e.js +10 -0
  43. package/dist/src/chunk-9rkfyt6q.js +5 -0
  44. package/dist/src/chunk-9tf2p9y9.js +5 -0
  45. package/dist/src/chunk-9y5bcy28.js +6 -0
  46. package/dist/src/chunk-a2sc4jm0.js +5 -0
  47. package/dist/src/chunk-a4k9rt7z.js +5 -0
  48. package/dist/src/chunk-aa5ng3d1.js +4 -0
  49. package/dist/src/chunk-ajsrz473.js +5 -0
  50. package/dist/src/chunk-b3h0a6ca.js +4 -0
  51. package/dist/src/chunk-b4cxdzwy.js +20 -0
  52. package/dist/src/chunk-b6a737qt.js +4 -0
  53. package/dist/src/chunk-bn64x5z5.js +5 -0
  54. package/dist/src/chunk-bvh649za.js +12 -0
  55. package/dist/src/chunk-c9nk1r78.js +5 -0
  56. package/dist/src/chunk-c9tyfg4j.js +26 -0
  57. package/dist/src/chunk-cfsdfqnm.js +4 -0
  58. package/dist/src/chunk-cxyf04jc.js +7 -0
  59. package/dist/src/chunk-d57432wq.js +4 -0
  60. package/dist/src/chunk-da08tx5v.js +4 -0
  61. package/dist/src/chunk-eka89q3k.js +4 -0
  62. package/dist/src/chunk-f2tc08m2.js +4 -0
  63. package/dist/src/chunk-f8tnk179.js +5 -0
  64. package/dist/src/chunk-f9s1kkhx.js +5 -0
  65. package/dist/src/chunk-fbp8a4rx.js +4 -0
  66. package/dist/src/chunk-fd2z0sze.js +4 -0
  67. package/dist/src/chunk-fk927f4q.js +54 -0
  68. package/dist/src/chunk-fxmr3a0f.js +4 -0
  69. package/dist/src/chunk-gaqwhd44.js +4 -0
  70. package/dist/src/chunk-ggtd5x5a.js +5 -0
  71. package/dist/src/chunk-gndcfrm7.js +4 -0
  72. package/dist/src/chunk-h3n4adc6.js +310 -0
  73. package/dist/src/chunk-h5pjbb83.js +4 -0
  74. package/dist/src/chunk-hgnnh302.js +4 -0
  75. package/dist/src/chunk-hmke8nhx.js +5 -0
  76. package/dist/src/chunk-j2bx12hn.js +4 -0
  77. package/dist/src/chunk-j70y1a2g.js +4 -0
  78. package/dist/src/chunk-jdqvcq0a.js +5 -0
  79. package/dist/src/chunk-jhnbfj19.js +55 -0
  80. package/dist/src/chunk-js1jpyxp.js +6 -0
  81. package/dist/src/chunk-kbjq0qvb.js +4 -0
  82. package/dist/src/chunk-kfwx57xd.js +4 -0
  83. package/dist/src/chunk-km0dy5vc.js +71 -0
  84. package/dist/src/chunk-kzwctna2.js +4 -0
  85. package/dist/src/chunk-m9ehyehy.js +4 -0
  86. package/dist/src/chunk-mct91p1f.js +4 -0
  87. package/dist/src/chunk-mf9spd4g.js +5 -0
  88. package/dist/src/chunk-mgrcansb.js +4 -0
  89. package/dist/src/chunk-mqc1d0eb.js +6 -0
  90. package/dist/src/chunk-n1zmpk0z.js +4 -0
  91. package/dist/src/chunk-ncyjf63g.js +4 -0
  92. package/dist/src/chunk-nr64d21q.js +973 -0
  93. package/dist/src/chunk-nwm2pq5v.js +168 -0
  94. package/dist/src/chunk-pm06b05d.js +9 -0
  95. package/dist/src/chunk-q50s00ry.js +4 -0
  96. package/dist/src/chunk-qv2918jt.js +4 -0
  97. package/dist/src/chunk-qwye1958.js +14 -0
  98. package/dist/src/chunk-r0f1q783.js +5 -0
  99. package/dist/src/chunk-r14wwk37.js +18 -0
  100. package/dist/src/chunk-r20pe1nv.js +5 -0
  101. package/dist/src/chunk-r8z9pfve.js +5 -0
  102. package/dist/src/chunk-rdpgkjf6.js +4 -0
  103. package/dist/src/chunk-rkr0dks9.js +5 -0
  104. package/dist/src/chunk-rn84t3sf.js +11 -0
  105. package/dist/src/chunk-s123kn7n.js +4 -0
  106. package/dist/src/chunk-s1zq65ny.js +4 -0
  107. package/dist/src/chunk-s73qn3fx.js +4 -0
  108. package/dist/src/chunk-sjn0nj4p.js +5 -0
  109. package/dist/src/chunk-sns0c35v.js +7 -0
  110. package/dist/src/chunk-stfzjr9y.js +8 -0
  111. package/dist/src/chunk-sz1a7p43.js +4 -0
  112. package/dist/src/chunk-t4dr5c8v.js +8 -0
  113. package/dist/src/chunk-tc8k9c1j.js +4 -0
  114. package/dist/src/chunk-teznhase.js +4 -0
  115. package/dist/src/chunk-ty9xgmz4.js +4 -0
  116. package/dist/src/chunk-tyazf3sk.js +145 -0
  117. package/dist/src/chunk-v6npjrjm.js +5 -0
  118. package/dist/src/chunk-v90es00d.js +4 -0
  119. package/dist/src/chunk-vbvtzkwz.js +5 -0
  120. package/dist/src/chunk-vefd8qee.js +8 -0
  121. package/dist/src/chunk-vs9r72ta.js +17 -0
  122. package/dist/src/chunk-w2mwa0jk.js +4 -0
  123. package/dist/src/chunk-w7zsh13a.js +9 -0
  124. package/dist/src/chunk-w88k0bgr.js +4 -0
  125. package/dist/src/chunk-wry6skrm.js +4 -0
  126. package/dist/src/chunk-wzdt0enk.js +4 -0
  127. package/dist/src/chunk-xhhv854c.js +4 -0
  128. package/dist/src/chunk-y58270hd.js +4 -0
  129. package/dist/src/chunk-yk0hmbex.js +4 -0
  130. package/dist/src/chunk-ympy4fdz.js +28 -0
  131. package/dist/src/chunk-yw436axy.js +4 -0
  132. package/dist/src/chunk-z04jrpjy.js +5 -0
  133. package/dist/src/chunk-z2xznczw.js +4 -0
  134. package/dist/src/chunk-z4xnrgps.js +4 -0
  135. package/dist/src/chunk-z7csyszv.js +4 -0
  136. package/dist/src/chunk-z8t0v07j.js +11 -0
  137. package/dist/src/chunk-z916af47.js +228 -0
  138. package/dist/src/chunk-zcr8he8q.js +5 -0
  139. package/dist/src/chunk-zd9vmkzn.js +9 -0
  140. package/dist/src/chunk-zg67wjkh.js +5 -0
  141. package/dist/src/chunk-zj939v0h.js +5 -0
  142. package/dist/src/chunk-zkdjwtc1.js +4 -0
  143. package/dist/src/chunk-zkv5kzt6.js +4 -0
  144. package/dist/src/daemon/processEntry.js +4 -0
  145. package/dist/src/index.js +4 -2843
  146. package/dist/src/runtime/bunRuntimeGuard.js +4 -0
  147. package/dist/src/utils/workers/iosBundleExtractWorker.js +2 -3
  148. package/package.json +5 -5
  149. package/schemas/README.md +16 -0
  150. package/schemas/prototype-icon-names.json +302 -0
  151. package/node_modules/@borewit/text-codec/README.md +0 -87
  152. package/node_modules/@jimp/diff/node_modules/pixelmatch/README.md +0 -110
  153. package/node_modules/@jimp/diff/node_modules/pixelmatch/node_modules/pngjs/README.md +0 -433
  154. package/node_modules/@jimp/file-ops/dist/browser/index.js +0 -8
  155. package/node_modules/@jimp/js-png/README.md +0 -35
  156. package/node_modules/@jimp/js-png/src/__image_snapshots__/index-node-test-ts-png-should-use-png-options-1-snap.png +0 -0
  157. package/node_modules/@jimp/js-png/src/output.png +0 -0
  158. package/node_modules/@jimp/js-png/vitest.config.browser.mjs +0 -3
  159. package/node_modules/@jimp/plugin-resize/README.md +0 -12
  160. package/node_modules/@jimp/plugin-resize/vitest.config.browser.mjs +0 -3
  161. package/node_modules/@tokenizer/inflate/README.md +0 -114
  162. package/node_modules/@tokenizer/token/README.md +0 -19
  163. package/node_modules/await-to-js/README.md +0 -82
  164. package/node_modules/debug/README.md +0 -481
  165. package/node_modules/exif-parser/README.md +0 -83
  166. package/node_modules/file-type/readme.md +0 -667
  167. package/node_modules/ieee754/README.md +0 -51
  168. package/node_modules/mime/README.md +0 -178
  169. package/node_modules/ms/readme.md +0 -59
  170. package/node_modules/parse-bmfont-xml/README.md +0 -74
  171. package/node_modules/parse-bmfont-xml/lib/browser.js +0 -85
  172. package/node_modules/parse-bmfont-xml/node_modules/xml2js/README.md +0 -507
  173. package/node_modules/pngjs/README.md +0 -287
  174. package/node_modules/sax/README.md +0 -228
  175. package/node_modules/strtok3/README.md +0 -795
  176. package/node_modules/tinycolor2/README.md +0 -492
  177. package/node_modules/tinycolor2/cjs/test.js +0 -2191
  178. package/node_modules/tinycolor2/cjs/test_template.js +0 -26
  179. package/node_modules/tinycolor2/deno_asserts@0.168.0.mjs +0 -807
  180. package/node_modules/tinycolor2/esm/test.js +0 -2189
  181. package/node_modules/tinycolor2/esm/test_template.js +0 -24
  182. package/node_modules/tinycolor2/tinycolor.js +0 -1191
  183. package/node_modules/token-types/README.md +0 -160
  184. package/node_modules/uint8array-extras/readme.md +0 -318
  185. package/node_modules/xml-parse-from-string/README.md +0 -35
  186. package/node_modules/xmlbuilder/README.md +0 -86
  187. package/node_modules/zod/README.md +0 -208
  188. package/node_modules/zod/v4/locales/ar.d.cts +0 -4
  189. package/node_modules/zod/v4/locales/ar.d.ts +0 -4
  190. package/node_modules/zod/v4/locales/az.d.cts +0 -4
  191. package/node_modules/zod/v4/locales/az.d.ts +0 -4
  192. package/node_modules/zod/v4/locales/be.d.cts +0 -4
  193. package/node_modules/zod/v4/locales/be.d.ts +0 -4
  194. package/node_modules/zod/v4/locales/ca.d.cts +0 -4
  195. package/node_modules/zod/v4/locales/ca.d.ts +0 -4
  196. package/node_modules/zod/v4/locales/cs.d.cts +0 -4
  197. package/node_modules/zod/v4/locales/cs.d.ts +0 -4
  198. package/node_modules/zod/v4/locales/de.d.cts +0 -4
  199. package/node_modules/zod/v4/locales/de.d.ts +0 -4
  200. package/node_modules/zod/v4/locales/en.d.cts +0 -5
  201. package/node_modules/zod/v4/locales/en.d.ts +0 -5
  202. package/node_modules/zod/v4/locales/eo.d.cts +0 -5
  203. package/node_modules/zod/v4/locales/eo.d.ts +0 -5
  204. package/node_modules/zod/v4/locales/es.d.cts +0 -4
  205. package/node_modules/zod/v4/locales/es.d.ts +0 -4
  206. package/node_modules/zod/v4/locales/fa.d.cts +0 -4
  207. package/node_modules/zod/v4/locales/fa.d.ts +0 -4
  208. package/node_modules/zod/v4/locales/fi.d.cts +0 -4
  209. package/node_modules/zod/v4/locales/fi.d.ts +0 -4
  210. package/node_modules/zod/v4/locales/fr-CA.d.cts +0 -4
  211. package/node_modules/zod/v4/locales/fr-CA.d.ts +0 -4
  212. package/node_modules/zod/v4/locales/fr.d.cts +0 -4
  213. package/node_modules/zod/v4/locales/fr.d.ts +0 -4
  214. package/node_modules/zod/v4/locales/he.d.cts +0 -4
  215. package/node_modules/zod/v4/locales/he.d.ts +0 -4
  216. package/node_modules/zod/v4/locales/hu.d.cts +0 -4
  217. package/node_modules/zod/v4/locales/hu.d.ts +0 -4
  218. package/node_modules/zod/v4/locales/id.d.cts +0 -4
  219. package/node_modules/zod/v4/locales/id.d.ts +0 -4
  220. package/node_modules/zod/v4/locales/index.d.cts +0 -39
  221. package/node_modules/zod/v4/locales/index.d.ts +0 -39
  222. package/node_modules/zod/v4/locales/it.d.cts +0 -4
  223. package/node_modules/zod/v4/locales/it.d.ts +0 -4
  224. package/node_modules/zod/v4/locales/ja.d.cts +0 -4
  225. package/node_modules/zod/v4/locales/ja.d.ts +0 -4
  226. package/node_modules/zod/v4/locales/kh.d.cts +0 -4
  227. package/node_modules/zod/v4/locales/kh.d.ts +0 -4
  228. package/node_modules/zod/v4/locales/ko.d.cts +0 -4
  229. package/node_modules/zod/v4/locales/ko.d.ts +0 -4
  230. package/node_modules/zod/v4/locales/mk.d.cts +0 -4
  231. package/node_modules/zod/v4/locales/mk.d.ts +0 -4
  232. package/node_modules/zod/v4/locales/ms.d.cts +0 -4
  233. package/node_modules/zod/v4/locales/ms.d.ts +0 -4
  234. package/node_modules/zod/v4/locales/nl.d.cts +0 -4
  235. package/node_modules/zod/v4/locales/nl.d.ts +0 -4
  236. package/node_modules/zod/v4/locales/no.d.cts +0 -4
  237. package/node_modules/zod/v4/locales/no.d.ts +0 -4
  238. package/node_modules/zod/v4/locales/ota.d.cts +0 -4
  239. package/node_modules/zod/v4/locales/ota.d.ts +0 -4
  240. package/node_modules/zod/v4/locales/pl.d.cts +0 -4
  241. package/node_modules/zod/v4/locales/pl.d.ts +0 -4
  242. package/node_modules/zod/v4/locales/ps.d.cts +0 -4
  243. package/node_modules/zod/v4/locales/ps.d.ts +0 -4
  244. package/node_modules/zod/v4/locales/pt.d.cts +0 -4
  245. package/node_modules/zod/v4/locales/pt.d.ts +0 -4
  246. package/node_modules/zod/v4/locales/ru.d.cts +0 -4
  247. package/node_modules/zod/v4/locales/ru.d.ts +0 -4
  248. package/node_modules/zod/v4/locales/sl.d.cts +0 -4
  249. package/node_modules/zod/v4/locales/sl.d.ts +0 -4
  250. package/node_modules/zod/v4/locales/sv.d.cts +0 -4
  251. package/node_modules/zod/v4/locales/sv.d.ts +0 -4
  252. package/node_modules/zod/v4/locales/ta.d.cts +0 -4
  253. package/node_modules/zod/v4/locales/ta.d.ts +0 -4
  254. package/node_modules/zod/v4/locales/th.d.cts +0 -4
  255. package/node_modules/zod/v4/locales/th.d.ts +0 -4
  256. package/node_modules/zod/v4/locales/tr.d.cts +0 -5
  257. package/node_modules/zod/v4/locales/tr.d.ts +0 -5
  258. package/node_modules/zod/v4/locales/ua.d.cts +0 -4
  259. package/node_modules/zod/v4/locales/ua.d.ts +0 -4
  260. package/node_modules/zod/v4/locales/ur.d.cts +0 -4
  261. package/node_modules/zod/v4/locales/ur.d.ts +0 -4
  262. package/node_modules/zod/v4/locales/vi.d.cts +0 -4
  263. package/node_modules/zod/v4/locales/vi.d.ts +0 -4
  264. package/node_modules/zod/v4/locales/zh-CN.d.cts +0 -4
  265. package/node_modules/zod/v4/locales/zh-CN.d.ts +0 -4
  266. package/node_modules/zod/v4/locales/zh-TW.d.cts +0 -4
  267. package/node_modules/zod/v4/locales/zh-TW.d.ts +0 -4
@@ -0,0 +1,168 @@
1
+ // @bun
2
+ import{g,K,E,$Y,$e,b$}from"./chunk-mf9spd4g.js";import{cn,Nr,i,nr,wr,xi,Ae,Xe,VR,Qj,bu,Va,si,dn,te,xo,Uk,Wi,yd,wl,rf,dr,Q,l,nt,e}from"./chunk-z8t0v07j.js";import{kn}from"./chunk-ggtd5x5a.js";import{L,tt,bs,wc,Yt,tb,Wn,Er,Rc,m,ND,kk,Ba,wg,Rg,Gm,la,Nt,Pg,Ss,_i,jB,fl,Ek,vi,Ik,Wz,$a,hl,FD,KB,ke,$r}from"./chunk-32jpxz2y.js";import{_s,nv,w,Qn,oT,_V,Hc,Jd,qQ,r5,Kr,Ve,Gr,ns,ew,Yr,sv,OV,Qs,Ql,n5,Ch,zQ,Cr,Dh,s5,lw,VV,hT,WV,a5,hm,pL,pw,$h,mw,Xr,U,bC,ne,yT,ka,Y,Uh,jt,nW,le,zu,hv,v,Vh,yn,Ea,cs,f5,h5,gv,bw,Iee,Gu,Ia,qe,Hr,wT,RT,_ee,wm,Wc,zc,Rw,Rm,F,ls,kC,Cee,lW,Dee,uW,Wh,qo,Ju,jc,qt,Ce,S5,Fee,Lee,qee,Vee,tn,fi,Tm,Qi,ce,rt,Jc,Hn,o,R,Lw,M,ms,KC,YC,qn,Xw,Nm,Bv,ge,wn,lu,QC,eD,$v,ii,ok,Fm,uu,tD,qv,sg,dB,Vv,rz,sa,oi,ro,lg,pl,_,k}from"./chunk-h3n4adc6.js";import{y,A,Z,hr,z,f,Ne,cd,kt,ee,P,J3,_k,n,a,h,b,s,Ko,Me,p,I,pp}from"./chunk-79q5xsdc.js";import{RF,Ie}from"./chunk-6d3mmqxt.js";import{fd}from"./chunk-0dfnyfkh.js";import{r,t,u}from"./chunk-9rkfyt6q.js";import{Lt,de,vt}from"./chunk-2v7tw1nj.js";var ur={};de(ur,{down:()=>Nu,up:()=>Mu});var mr={};de(mr,{down:()=>Lu,up:()=>Fu});var pr={};de(pr,{down:()=>Uu,up:()=>$u});var fr={};de(fr,{down:()=>Hu,up:()=>qu});var gr={};de(gr,{down:()=>Wu,up:()=>Vu});var vr={};de(vr,{down:()=>Ku,up:()=>ju});var yr={};de(yr,{down:()=>im,up:()=>tm});var Tr={};de(Tr,{deleteLegacyBindingRows:()=>Qt,down:()=>Pm,legacyJournalPredicate:()=>_t,up:()=>Dm});var Br={};de(Br,{down:()=>Im,up:()=>Cm});var Or={};de(Or,{down:()=>Em,up:()=>Am});var Mr={};de(Mr,{down:()=>Bm,up:()=>xm});var Fr={};de(Fr,{down:()=>Om,up:()=>km});var Lr={};de(Lr,{down:()=>Lm,up:()=>Mm});var Ur={};de(Ur,{down:()=>Um,up:()=>$m});var qr={};de(qr,{down:()=>Hm,up:()=>qm});var Vr={};de(Vr,{down:()=>Wm,up:()=>Vm});var Wr={};de(Wr,{down:()=>Km,up:()=>jm});var jr={};de(jr,{down:()=>zm,up:()=>Jm});var ys="registry_schema_unsupported";class zr extends t{dbPath;unknownMigrations;writerVersions;code=ys;retryable=!1;remedy;constructor(d,c,S={}){super(`The binding registry at ${d} contains migrations unknown to this daemon: ${c.join(", ")}; nothing was changed.`);this.dbPath=d;this.unknownMigrations=c;this.writerVersions=S;this.name="BindingRegistrySchemaUnsupportedError";let D=[...new Set(Object.values(S))];this.remedy=D.length>0?`Upgrade the daemons sharing managed devices to a release that includes these migrations, recorded by writer version(s): ${D.join(", ")}.`:"Upgrade the daemons sharing managed devices to a release that includes these migrations."}toPayload(){return{code:this.code,retryable:this.retryable,dbPath:this.dbPath,unknownMigrations:this.unknownMigrations,writerVersions:this.writerVersions,remedy:this.remedy}}}async function Mu(d){await d.schema.createTable("binding_registry_migration_writers").addColumn("migration_name","text",(c)=>c.primaryKey()).addColumn("writer_version","text",(c)=>c.notNull()).addColumn("recorded_at","text",(c)=>c.notNull()).execute()}async function Nu(d){await d.schema.dropTable("binding_registry_migration_writers").ifExists().execute()}async function Fu(d){await d.schema.createIndex("session_broker_resources_request_id").ifNotExists().on("session_broker_resources").column("request_id").execute(),await d.schema.createIndex("session_broker_requests_resource_id").ifNotExists().on("session_broker_requests").column("resource_id").execute()}async function Lu(d){await d.schema.dropIndex("session_broker_requests_resource_id").ifExists().execute(),await d.schema.dropIndex("session_broker_resources_request_id").ifExists().execute()}async function $u(d){await d.schema.createTable("device_mutation_journal").addColumn("sequence","integer",(c)=>c.primaryKey().autoIncrement()).addColumn("session_uuid","text",(c)=>c.notNull()).addColumn("device_id","text",(c)=>c.notNull()).addColumn("incarnation","text",(c)=>c.notNull()).addColumn("kind","text",(c)=>c.notNull()).addColumn("mutation_key","text",(c)=>c.notNull()).addColumn("prior_value_json","text",(c)=>c.notNull()).addColumn("applied_at_ms","integer",(c)=>c.notNull()).addColumn("tool_name","text",(c)=>c.notNull()).addUniqueConstraint("device_mutation_original",["session_uuid","device_id","incarnation","kind","mutation_key"]).addCheckConstraint("device_mutation_scope_nonempty",m`
3
+ length(trim(session_uuid)) > 0 AND length(trim(device_id)) > 0
4
+ AND length(trim(incarnation)) > 0 AND length(trim(kind)) > 0
5
+ AND length(trim(mutation_key)) > 0 AND length(trim(tool_name)) > 0
6
+ `).execute(),await d.schema.createTable("device_mutation_baselines").addColumn("device_id","text",(c)=>c.notNull()).addColumn("incarnation","text",(c)=>c.notNull()).addColumn("baseline_json","text",(c)=>c.notNull()).addColumn("captured_at_ms","integer",(c)=>c.notNull()).addPrimaryKeyConstraint("device_mutation_baseline_identity",["device_id","incarnation"]).addCheckConstraint("device_mutation_baseline_nonempty",m`
7
+ length(trim(device_id)) > 0 AND length(trim(incarnation)) > 0
8
+ `).execute()}async function Uu(d){await d.schema.dropTable("device_mutation_baselines").ifExists().execute(),await d.schema.dropTable("device_mutation_journal").ifExists().execute()}async function qu(d){await d.schema.alterTable("session_broker_requests").addColumn("timing_json","text").execute(),await d.schema.alterTable("session_broker_requests").addColumn("timing_profile_json","text").execute(),await d.schema.alterTable("session_broker_requests").addColumn("timing_updated_at_ms","integer").execute(),await d.schema.alterTable("session_broker_resources").addColumn("reuse_count","integer",(c)=>c.notNull().defaultTo(0)).execute(),await d.schema.createIndex("session_broker_timing_window_idx").on("session_broker_requests").column("timing_updated_at_ms").execute()}async function Hu(d){await d.schema.dropIndex("session_broker_timing_window_idx").execute(),await d.schema.alterTable("session_broker_resources").dropColumn("reuse_count").execute(),await d.schema.alterTable("session_broker_requests").dropColumn("timing_updated_at_ms").execute(),await d.schema.alterTable("session_broker_requests").dropColumn("timing_profile_json").execute(),await d.schema.alterTable("session_broker_requests").dropColumn("timing_json").execute()}async function Vu(d){await d.schema.createTable("device_claims").addColumn("platform","text",(c)=>c.notNull()).addColumn("device_id","text",(c)=>c.notNull()).addColumn("kind","text",(c)=>c.notNull()).addColumn("daemon_session_id","text").addColumn("pid","integer",(c)=>c.notNull()).addColumn("owner_token","text",(c)=>c.notNull()).addColumn("process_generation_token","text").addColumn("session_uuid","text").addColumn("claimed_at_ms","integer",(c)=>c.notNull()).addColumn("updated_at_ms","integer",(c)=>c.notNull()).addPrimaryKeyConstraint("device_claims_device",["platform","device_id"]).addCheckConstraint("device_claims_platform",m`platform IN ('android', 'ios')`).addCheckConstraint("device_claims_kind",m`kind IN ('allocation', 'forward', 'slot')`).addCheckConstraint("device_claims_nonempty",m`length(trim(device_id)) > 0 AND length(trim(owner_token)) > 0 AND pid > 0`).execute()}async function Wu(d){await d.schema.dropTable("device_claims").ifExists().execute()}async function ju(d){await d.schema.alterTable("device_claims").addColumn("metadata","text").execute()}async function Ku(d){await d.schema.alterTable("device_claims").dropColumn("metadata").execute()}var Xu=m`platform IN ('android', 'ios', 'watchos')`,Yu=m`platform IN ('android', 'ios')`,ws=m.raw(["scope_key","slot_index","role","platform","generation","stable_device_id","device_name","requested_spec_json","resolved_spec_json","spec_fingerprint","state","exec_owner_daemon_id","exec_owner_pid","exec_owner_process_token","exec_session_uuid","settler_daemon_id","settler_pid","settler_process_token","updated_at_ms"].join(", ")),Rs=m.raw(["id","scope_key","slot_index","kind","phase","platform","from_generation","to_generation","binding_generation","binding_stable_device_id","target_json","owner_daemon_id","owner_pid","owner_process_token","attempts","last_error","next_attempt_at_ms","created_at_ms","updated_at_ms"].join(", ")),Ds=m.raw(["platform","device_id","kind","daemon_session_id","pid","owner_token","process_generation_token","session_uuid","claimed_at_ms","updated_at_ms","metadata"].join(", "));async function Qu(d,c){await m`CREATE TABLE slot_assignments_next (
9
+ scope_key TEXT NOT NULL REFERENCES slot_scopes (scope_key),
10
+ slot_index INTEGER NOT NULL CHECK (slot_index >= 0),
11
+ role TEXT NOT NULL,
12
+ platform TEXT NOT NULL CHECK (${c}),
13
+ generation INTEGER NOT NULL CHECK (generation >= 0),
14
+ stable_device_id TEXT,
15
+ device_name TEXT,
16
+ requested_spec_json TEXT NOT NULL,
17
+ resolved_spec_json TEXT,
18
+ spec_fingerprint TEXT,
19
+ state TEXT NOT NULL
20
+ CHECK (state IN ('provisioning', 'ready', 'replacing', 'settling', 'cleanup_pending')),
21
+ exec_owner_daemon_id TEXT,
22
+ exec_owner_pid INTEGER,
23
+ exec_owner_process_token TEXT,
24
+ exec_session_uuid TEXT,
25
+ settler_daemon_id TEXT,
26
+ settler_pid INTEGER,
27
+ settler_process_token TEXT,
28
+ updated_at_ms INTEGER NOT NULL,
29
+ CONSTRAINT slot_assignments_pk PRIMARY KEY (scope_key, slot_index)
30
+ )`.execute(d),await m`INSERT INTO slot_assignments_next (${ws})
31
+ SELECT ${ws} FROM slot_assignments`.execute(d),await m`DROP TABLE slot_assignments`.execute(d),await m`ALTER TABLE slot_assignments_next RENAME TO slot_assignments`.execute(d),await m`CREATE UNIQUE INDEX slot_assignments_device
32
+ ON slot_assignments (platform, stable_device_id)
33
+ WHERE stable_device_id IS NOT NULL`.execute(d)}async function Zu(d,c){let S=await m`SELECT seq FROM sqlite_sequence WHERE name = 'slot_journal'`.execute(d);await m`CREATE TABLE slot_journal_next (
34
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
35
+ scope_key TEXT NOT NULL REFERENCES slot_scopes (scope_key),
36
+ slot_index INTEGER NOT NULL CHECK (slot_index >= 0),
37
+ kind TEXT NOT NULL CHECK (kind IN ('create', 'replace', 'release')),
38
+ phase TEXT NOT NULL CHECK (
39
+ phase IN ('intent', 'deleting', 'deleted', 'creating', 'created', 'committed', 'rolled_back')
40
+ ),
41
+ platform TEXT NOT NULL CHECK (${c}),
42
+ from_generation INTEGER NOT NULL,
43
+ to_generation INTEGER,
44
+ binding_generation INTEGER NOT NULL,
45
+ binding_stable_device_id TEXT,
46
+ target_json TEXT NOT NULL,
47
+ owner_daemon_id TEXT NOT NULL,
48
+ owner_pid INTEGER NOT NULL,
49
+ owner_process_token TEXT,
50
+ attempts INTEGER NOT NULL DEFAULT 0,
51
+ last_error TEXT,
52
+ next_attempt_at_ms INTEGER NOT NULL,
53
+ created_at_ms INTEGER NOT NULL,
54
+ updated_at_ms INTEGER NOT NULL
55
+ )`.execute(d),await m`INSERT INTO slot_journal_next (${Rs})
56
+ SELECT ${Rs} FROM slot_journal`.execute(d),await m`DROP TABLE slot_journal`.execute(d),await m`ALTER TABLE slot_journal_next RENAME TO slot_journal`.execute(d);let D=S.rows[0]?.seq;if(D!==void 0)await m`DELETE FROM sqlite_sequence WHERE name = 'slot_journal'`.execute(d),await m`INSERT INTO sqlite_sequence (name, seq)
57
+ VALUES ('slot_journal', MAX(${D}, COALESCE((SELECT MAX(id) FROM slot_journal), 0)))`.execute(d);await m`CREATE UNIQUE INDEX slot_journal_open_slot
58
+ ON slot_journal (scope_key, slot_index)
59
+ WHERE phase NOT IN ('committed', 'rolled_back')`.execute(d)}async function em(d,c){await m`CREATE TABLE device_claims_next (
60
+ platform TEXT NOT NULL,
61
+ device_id TEXT NOT NULL,
62
+ kind TEXT NOT NULL,
63
+ daemon_session_id TEXT,
64
+ pid INTEGER NOT NULL,
65
+ owner_token TEXT NOT NULL,
66
+ process_generation_token TEXT,
67
+ session_uuid TEXT,
68
+ claimed_at_ms INTEGER NOT NULL,
69
+ updated_at_ms INTEGER NOT NULL,
70
+ metadata TEXT,
71
+ CONSTRAINT device_claims_device PRIMARY KEY (platform, device_id),
72
+ CONSTRAINT device_claims_platform CHECK (${c}),
73
+ CONSTRAINT device_claims_kind CHECK (kind IN ('allocation', 'forward', 'slot')),
74
+ CONSTRAINT device_claims_nonempty
75
+ CHECK (length(trim(device_id)) > 0 AND length(trim(owner_token)) > 0 AND pid > 0)
76
+ )`.execute(d),await m`INSERT INTO device_claims_next (${Ds})
77
+ SELECT ${Ds} FROM device_claims`.execute(d),await m`DROP TABLE device_claims`.execute(d),await m`ALTER TABLE device_claims_next RENAME TO device_claims`.execute(d)}async function Ps(d,c){await Qu(d,c),await Zu(d,c),await em(d,c)}async function tm(d){await Ps(d,Xu)}async function im(d){if((await m`SELECT
78
+ EXISTS(SELECT 1 FROM slot_assignments WHERE platform = 'watchos')
79
+ OR EXISTS(SELECT 1 FROM slot_journal WHERE platform = 'watchos')
80
+ OR EXISTS(SELECT 1 FROM device_claims WHERE platform = 'watchos') AS present`.execute(d)).rows[0]?.present)throw new t("The binding registry holds Apple Watch rows; release those bindings and claims before downgrading.");await Ps(d,Yu)}var br="device_assigned_to_binding";class li extends t{deviceId;code=br;retryable=!1;platform;stableId;scopeKey;declaredBinding;constructor(d,c,S){super(`${d} refused: device '${c}' (${S.platform} ${S.stableDeviceId}) is `+(S.holder==="session_broker"?`assigned to binding ${S.bindingIndex}`:"reserved for bindings")+` (code ${br}). It stays reserved while idle; use another device, or reset the binding's scope to release it.`);this.deviceId=c;this.name="DeviceAssignedToBindingError",this.platform=S.platform,this.stableId=S.stableDeviceId,this.scopeKey=S.scopeKey,this.declaredBinding=S.bindingIndex}toPayload(){return{code:this.code,deviceId:this.deviceId,platform:this.platform,stableId:this.stableId,scopeKey:this.scopeKey,declaredBinding:this.declaredBinding,retryable:!1}}}var Cs=1000,rm=5000;class $P extends t{sessionUuid;code="binding_ownership_unconfirmed";retryable=!0;retryAfterMs;constructor(d,c=0){super(`Session '${d}' binding ownership is not recorded for this daemon yet (the binding registry is busy or the binding is not ready); retry shortly.`);this.sessionUuid=d;this.name="BindingOwnershipUnconfirmedError",this.retryAfterMs=Math.min(rm,Cs*(1+Math.floor(Math.max(0,c)/1000)))}toPayload(){return{code:this.code,sessionUuid:this.sessionUuid,retryable:this.retryable,retryAfterMs:this.retryAfterMs}}}var cI="daemon-restart",tN="cleanup-expired",Ge={idle:!1,expiry:!1,terminal:!1,recoverable:!1,reissuableByName:!1,releasedBeforeHandout:!1},_r={...Ge,releasedBeforeHandout:!0},De={...Ge,terminal:!0},yt={...De,expiry:!0},Sr={...yt,idle:!0},nm={...Ge,idle:!0},Rr={...Ge,recoverable:!0,reissuableByName:!0},om={...Ge,reissuableByName:!0},wt={"explicit-release":De,"lazy-expiry":Sr,"cleanup-expired":Sr,"cli-idle-timeout":Sr,"missing-first-heartbeat":yt,"heartbeat-timeout":yt,"rehydration-owner-timeout":yt,"restart-recovery-timeout":yt,"owner-disconnected":De,"binding-ownership-lost":De,"managed-slot-ownership-lost":De,"device-killed":De,"session-creation-cancelled":De,"session-creation-timeout":_r,"allocation-rollback":_r,"plan-auto-release":om,superseded:Ge,"daemon-shutdown":Rr,"daemon-restart":Rr,expired:nm},St={"identity-recovery-":De,"device-disconnected:":De,"device-disconnected-during-session-create:":_r,"device-restart:":Rr},sm=Ge;function am(d){return Object.hasOwn(wt,d)}function UP(d){return Object.keys(St).find((c)=>d.startsWith(c)&&d.length>c.length)}function qG(d){return d==="plan-auto-release"||UP(d)==="device-restart:"}function Np(d){if(am(d))return wt[d];let c=UP(d);return c===void 0?sm:St[c]}function Jt(d){return Np(d).terminal}function dI(d){return Np(d).expiry}function lI(d){return Np(d).idle||Object.hasOwn(Is,d)&&Is[d].idle}function ui(d){return d&&lI(d)?{idle:!0}:{}}function Fl(d,c){return d==="cli-idle-timeout"&&c!==void 0&&Number.isSafeInteger(c)&&c>0?{idleTimeoutMs:c}:{}}function Vs(d){return Np(d).recoverable}var rN="session-not-found",VG="replay-lease-expired",Is={[VG]:{idle:!0},[rN]:{idle:!1},"liveness-owner-conflict":{idle:!1},released:{idle:!1}};function RX(d){return Vs(d)&&!d.startsWith("device-restart:")}function WG(d,c){let S=Np(d);if(!S.terminal)return!1;let D=Np(c);return!D.terminal||D.idle&&!S.idle}function PX(d,c){if(c==="device-killed")return c;if(d==="device-killed")return d;if(c==="daemon-shutdown"&&!Jt(d))return c;return WG(c,d)?c:d}function pH(d){return Np(d).reissuableByName}function nN(d){let c=Np(d);if(!c.terminal)return 0;return c.idle?1:2}function yy(d){return dI(d)?"expired":"released"}function mH(d){return Object.keys(wt).filter((c)=>wt[c][d])}function fH(d){return Object.keys(St).filter((c)=>St[c][d])}function AX(d){return Object.keys(wt).filter((c)=>nN(c)>d)}function TX(d){return Object.keys(St).filter((c)=>nN(`${c}x`)>d)}var Oo="session_ownership_lost";class Ja extends t{sessionUuid;releaseReason;code=Oo;retryable=!1;nextAction=Qn;details;constructor(d,c,S){super(`Session ${d} is terminal after ${c} and cannot be reused; it was released while this call was in flight, so the call was cancelled. Acquire a new device with getAndroid or getApple.`);this.sessionUuid=d;this.releaseReason=c;this.name="SessionReleasedDuringCallError",this.details={sessionUuid:d,reason:c,...ui(c),...Fl(c,S)}}}function Fp(d){return d instanceof Ja?d:void 0}class hH extends Ja{constructor(d){super(d,"binding-ownership-lost");this.message=`Session ${d} is terminal after binding-ownership-lost and cannot be reused. Acquire a new device with getAndroid or getApple.`,this.name="BindingOwnershipLostError"}}var Dr="discovery_incomplete",As=2000;class Jo extends t{code=Dr;retryable=!0;retryAfterMs=As;constructor(d){super(`The binding registry is unreadable (${d}), so assigned devices cannot be told apart from free ones (code ${Dr}); retry shortly.`);this.name="BindingDiscoveryIncompleteError"}toPayload(){return{code:this.code,retryable:!0,retryAfterMs:this.retryAfterMs}}}import{readFile as dm}from"fs/promises";var Mb=g.SESSION_BROKER_CONFIG.name,kX="session-broker-export/v1",EX="session-broker/v1",vy={managedHostScope:"auto-mobile-host",runnerNamespace:"session-broker",runnerIncarnation:"private-pool-v1"},Pr=cd("family",[f({family:ee("iphone"),variant:P(["standard","pro","pro-max","air"])}).strict(),f({family:ee("ipad"),variant:P(["standard","mini","air","pro"]),sizeInches:y().regex(/^\d+(?:\.\d+)?$/).optional()}).strict(),f({family:ee("duo"),variant:ee("duo")}).strict()]),cm=f({namespace:P(["product-model","simulator-device-type","alias"]),value:y().min(1)}).strict(),Es=P(["phone","tablet","duo"]),Ir=P(["phone","tablet","foldable"]),Ar=y().regex(/^\d+(?:\.\d+)*$/),lm=cd("kind",[f({kind:ee("exact"),version:Ar}).strict(),f({kind:ee("major"),major:A().int().positive().max(Number.MAX_SAFE_INTEGER)}).strict(),f({kind:ee("minimum"),version:Ar}).strict()]),xs=f({selector:lm,preferredVersion:Ar}).strict(),um=f({platform:ee("ios"),policyVersion:y().min(1),hardware:f({omitted:Es,archetypes:z(f({archetype:Es,modelType:Pr}).strict()),modelTypes:z(f({modelType:Pr,model:cm}).strict())}).strict(),os:xs}).strict(),mm=f({platform:ee("android"),policyVersion:y().min(1),hardware:f({omitted:Ir,profiles:z(f({archetype:Ir,profileId:y().min(1),memoryMb:A().int().min(Jd,`memoryMb must be at least ${Jd} MB`).optional()}).strict())}).strict(),os:xs}).strict(),je=A().int().nonnegative().max(Number.MAX_SAFE_INTEGER),pm=J3((d)=>{if(typeof d==="object"&&d!==null&&"iosDuo"in d){e.warn("capabilities.iosDuo is deprecated and ignored; Duo support follows installed hardware.");let c={...d};return delete c.iosDuo,c}return d},f({}).strict()),fm=10,gm=5,vm=cd("mode",[f({mode:ee("off")}).strict(),f({mode:ee("erase"),maxUses:je.positive().default(20),fallback:ee("erase").default("erase")}).strict(),f({mode:ee("keep-booted"),maxUses:je.positive().default(fm),fallback:P(["erase","destroy"]).default("erase")}).strict(),f({mode:ee("minimal"),maxUses:je.positive().default(gm)}).strict()]),ym=f({contractVersion:ee(1),limits:f({totalDeviceCap:je.optional(),sessionCap:je.optional(),idlePoolCap:je.optional(),maxConcurrentResetBoots:je.positive().optional()}).strict(),defaults:f({ios:um.optional(),android:mm.optional()}).strict(),androidProfileArchetypes:kt(y(),Ir).default({}),iosClassifications:z(f({simulatorDeviceTypeIdentifier:y().min(1),modelType:Pr,aliases:z(y().min(1)).optional()}).strict()).default([]),reuseCleanDevices:Z().default(!1),reuseAndroidCleanDevices:Z().default(!1),androidResetMode:P(["snapshot","keep-booted"]).optional(),androidResetTimeoutMs:A().int().positive().max(Nr).optional(),androidKeepBootedMaxUses:A().int().positive().max(Number.MAX_SAFE_INTEGER).optional(),androidKeepBootedFallback:P(["snapshot","destroy"]).optional(),androidIdleTtlMs:A().int("androidIdleTtlMs must be a whole number of milliseconds").positive("androidIdleTtlMs must be a positive number of milliseconds").max(Number.MAX_SAFE_INTEGER).optional(),reuse:f({ios:vm}).strict().optional(),capabilities:pm.default({})}).strict().refine((d)=>d.defaults.ios!==void 0||d.defaults.android!==void 0,{message:"At least one platform must have an explicit default policy"}).refine((d)=>d.androidResetMode===void 0||d.reuseAndroidCleanDevices&&d.defaults.android!==void 0,{message:"Android reset mode requires Android defaults and reuseAndroidCleanDevices"}).refine((d)=>d.androidKeepBootedMaxUses===void 0&&d.androidKeepBootedFallback===void 0||d.androidResetMode==="keep-booted",{message:"Android keep-booted keys require keep-booted mode"}).refine((d)=>d.androidIdleTtlMs===void 0||d.androidResetMode!==void 0,{path:["androidIdleTtlMs"],message:"androidIdleTtlMs requires androidResetMode; without a reset mode no Android device is pooled"}).refine((d)=>d.androidResetTimeoutMs===void 0||d.androidResetMode==="snapshot"||d.androidResetMode==="keep-booted"&&d.androidKeepBootedFallback==="snapshot",{path:["androidResetTimeoutMs"],message:"androidResetTimeoutMs requires snapshot mode or keep-booted snapshot fallback"}).refine((d)=>!d.reuseCleanDevices||!d.reuse||d.reuse.ios.mode==="erase",{message:"reuseCleanDevices: true selects iOS erase; remove it to select minimal, keep-booted or off"}).refine((d)=>d.defaults.ios!==void 0||!d.reuse||d.reuse.ios.mode==="off",{message:"iOS reuse requires an explicit defaults.ios policy"});function iN(d){if(!d.defaults.ios)return{mode:"off"};return d.reuse?.ios??(d.reuseCleanDevices?{mode:"erase",maxUses:20,fallback:"erase"}:{mode:"off"})}function bm(d){let c=ym.safeParse(d);if(!c.success)throw new t(`Invalid session broker host configuration: ${c.error.message}`);return c.data}async function IX(d){try{return bm(JSON.parse(await dm(d,"utf8")))}catch(c){throw u(c,`Cannot load session broker host configuration at ${d}`)}}function _X(d){if(d===void 0)return!1;return d.androidResetMode===void 0||d.androidResetMode==="keep-booted"&&d.androidKeepBootedFallback!=="snapshot"}var Ts="managed-slots",xX="ambroker-",CX="amslot-";function Xa(d){return typeof d==="string"&&(d.startsWith("ambroker-")||d.startsWith("amslot-"))}var _f="session-broker-device";import{createHash as Sm}from"crypto";var _m=new Set(["replacing","settling","cleanup_pending"]);function Bs(d,c){return d!==c&&_m.has(c)}var st=["committed","rolled_back"];function HP(d){return!st.includes(d)}var ks=604800000;function Cd(d){return Sm("sha256").update(JSON.stringify([d.managedHostScope,d.runnerNamespace,d.runnerIncarnation])).digest("hex")}function Pe(d){if(!Number.isInteger(d.bindingIndex)||d.bindingIndex<0)throw new t(`Binding index must be a non-negative integer, got ${d.bindingIndex}`);if(d.scopeKey.length===0)throw new t("Binding scope key must not be empty")}function xr(d,c){if(d!=="settling")return null;if(!c?.settler)throw new t("Marking a binding settling requires the settling daemon");return c.settler}function gH(d,c){return d.generation===c.generation&&d.stableDeviceId===c.stableDeviceId}function Ec(d,c){return d.daemonId===c.daemonId&&d.pid===c.pid&&(d.processGenerationToken??null)===(c.processGenerationToken??null)}function Dd(d,c){return d.generation===c.generation&&d.stableDeviceId===c.stableDeviceId}function uI(d){return d.target.newStableId??d.target.newName}function Os(d,c){let S=new Set(c.map((D)=>JSON.stringify([D.platform,D.stableDeviceId])));return d.flatMap((D)=>{let C=uI(D),x=Ws(D);if(C===null||S.has(JSON.stringify([x,C])))return[];return S.add(JSON.stringify([x,C])),[{platform:x,stableDeviceId:C,holder:"session_broker",scopeKey:D.scopeKey,bindingIndex:D.bindingIndex,scopeState:null,execSessionUuid:null}]})}function Ms(d,c){return d?.state==="valid"||c&&d?.state==="invalidating"}function Ns(d,c,S){return d?.state==="invalidating"&&c?.execOwner?.sessionUuid===S}function Fs(d,c){let S=c.platform??d.platform;if(S!==d.platform&&c.stableDeviceId!==null)throw new t(`A binding moves from ${d.platform} to ${S} only with an empty binding`);return S}function Ws(d){return d.target.newPlatform??d.platform}var _t=m`NOT EXISTS (
81
+ SELECT 1 FROM slot_assignments a WHERE a.scope_key = slot_journal.scope_key
82
+ AND a.slot_index = slot_journal.slot_index AND a.role = ${_f})`;async function Dm(d){if((await m`SELECT
83
+ EXISTS(SELECT 1 FROM slot_assignments WHERE role <> ${_f}
84
+ AND (stable_device_id IS NOT NULL OR device_name IS NOT NULL))
85
+ OR EXISTS(SELECT 1 FROM slot_journal WHERE ${_t}
86
+ AND phase NOT IN ('committed', 'rolled_back'))
87
+ OR EXISTS(SELECT 1 FROM slot_free_devices) AS unsafe`.execute(d)).rows[0].unsafe)throw new t("Legacy slot devices must be retired first. Restart the daemon to confirm their shutdown before upgrading the binding registry.");await Qt(d),await d.schema.dropTable("slot_free_devices").execute()}async function Qt(d,c={hasJournal:!0,hasBrokerResources:!0}){if(c.hasJournal)await m`DELETE FROM slot_journal WHERE ${_t}`.execute(d);await m`DELETE FROM slot_assignments WHERE role <> ${_f}`.execute(d);let S=c.hasJournal?m`AND NOT EXISTS (SELECT 1 FROM slot_journal j WHERE j.scope_key = slot_scopes.scope_key)`:m``,D=c.hasBrokerResources?m`AND NOT EXISTS (SELECT 1 FROM session_broker_resources r WHERE r.scope_key = slot_scopes.scope_key)`:m``;await m`DELETE FROM slot_scopes WHERE scope_key <> ${Cd(vy)}
88
+ AND NOT EXISTS (SELECT 1 FROM slot_assignments a WHERE a.scope_key = slot_scopes.scope_key)
89
+ ${S} ${D}`.execute(d)}async function Pm(){throw new t("Legacy slot retirement is irreversible; restore a pre-upgrade backup instead.")}async function Cm(d){await d.schema.createTable("slot_scopes").ifNotExists().addColumn("scope_key","text",(c)=>c.primaryKey()).addColumn("managed_host_scope","text",(c)=>c.notNull()).addColumn("runner_namespace","text",(c)=>c.notNull()).addColumn("runner_incarnation","text",(c)=>c.notNull()).addColumn("state","text",(c)=>c.notNull().check(m`state IN ('valid', 'invalidating', 'invalidated')`)).addColumn("invalidation_reason","text",(c)=>c.check(m`invalidation_reason IS NULL OR invalidation_reason IN ('incarnation_reset', 'operator_reset', 'abandoned')`)).addColumn("created_at_ms","integer",(c)=>c.notNull()).addColumn("last_acquired_at_ms","integer",(c)=>c.notNull()).addColumn("invalidating_at_ms","integer").addColumn("invalidated_at_ms","integer").execute(),await m`CREATE UNIQUE INDEX IF NOT EXISTS slot_scopes_live_namespace
90
+ ON slot_scopes (managed_host_scope, runner_namespace)
91
+ WHERE state <> 'invalidated'`.execute(d),await d.schema.createTable("slot_assignments").ifNotExists().addColumn("scope_key","text",(c)=>c.notNull().references("slot_scopes.scope_key")).addColumn("slot_index","integer",(c)=>c.notNull().check(m`slot_index >= 0`)).addColumn("role","text",(c)=>c.notNull()).addColumn("platform","text",(c)=>c.notNull().check(m`platform IN ('android', 'ios')`)).addColumn("generation","integer",(c)=>c.notNull().check(m`generation >= 0`)).addColumn("stable_device_id","text").addColumn("device_name","text").addColumn("requested_spec_json","text",(c)=>c.notNull()).addColumn("resolved_spec_json","text").addColumn("spec_fingerprint","text").addColumn("state","text",(c)=>c.notNull().check(m`state IN ('provisioning', 'ready', 'replacing', 'cleanup_pending')`)).addColumn("exec_owner_daemon_id","text").addColumn("exec_owner_pid","integer").addColumn("exec_session_uuid","text").addColumn("updated_at_ms","integer",(c)=>c.notNull()).addPrimaryKeyConstraint("slot_assignments_pk",["scope_key","slot_index"]).execute(),await m`CREATE UNIQUE INDEX IF NOT EXISTS slot_assignments_device
92
+ ON slot_assignments (platform, stable_device_id)
93
+ WHERE stable_device_id IS NOT NULL`.execute(d),await d.schema.createTable("slot_free_devices").ifNotExists().addColumn("platform","text",(c)=>c.notNull().check(m`platform IN ('android', 'ios')`)).addColumn("stable_device_id","text",(c)=>c.notNull()).addColumn("spec_fingerprint","text").addColumn("from_scope_key","text",(c)=>c.notNull()).addColumn("freed_at_ms","integer",(c)=>c.notNull()).addPrimaryKeyConstraint("slot_free_devices_pk",["platform","stable_device_id"]).execute()}async function Im(d){await d.schema.dropTable("slot_free_devices").ifExists().execute(),await d.schema.dropTable("slot_assignments").ifExists().execute(),await d.schema.dropTable("slot_scopes").ifExists().execute()}var kr=m.raw(["scope_key","slot_index","role","platform","generation","stable_device_id","device_name","requested_spec_json","resolved_spec_json","spec_fingerprint","state","exec_owner_daemon_id","exec_owner_pid","exec_session_uuid","updated_at_ms"].join(", "));async function Am(d){await m`ALTER TABLE slot_scopes ADD COLUMN last_released_at_ms INTEGER`.execute(d),await m`CREATE TABLE slot_assignments_v2 (
94
+ scope_key TEXT NOT NULL REFERENCES slot_scopes (scope_key),
95
+ slot_index INTEGER NOT NULL CHECK (slot_index >= 0),
96
+ role TEXT NOT NULL,
97
+ platform TEXT NOT NULL CHECK (platform IN ('android', 'ios')),
98
+ generation INTEGER NOT NULL CHECK (generation >= 0),
99
+ stable_device_id TEXT,
100
+ device_name TEXT,
101
+ requested_spec_json TEXT NOT NULL,
102
+ resolved_spec_json TEXT,
103
+ spec_fingerprint TEXT,
104
+ state TEXT NOT NULL
105
+ CHECK (state IN ('provisioning', 'ready', 'replacing', 'settling', 'cleanup_pending')),
106
+ exec_owner_daemon_id TEXT,
107
+ exec_owner_pid INTEGER,
108
+ exec_owner_process_token TEXT,
109
+ exec_session_uuid TEXT,
110
+ settler_daemon_id TEXT,
111
+ settler_pid INTEGER,
112
+ settler_process_token TEXT,
113
+ updated_at_ms INTEGER NOT NULL,
114
+ CONSTRAINT slot_assignments_pk PRIMARY KEY (scope_key, slot_index)
115
+ )`.execute(d),await m`INSERT INTO slot_assignments_v2 (${kr})
116
+ SELECT ${kr} FROM slot_assignments`.execute(d),await m`DROP TABLE slot_assignments`.execute(d),await m`ALTER TABLE slot_assignments_v2 RENAME TO slot_assignments`.execute(d),await m`CREATE UNIQUE INDEX IF NOT EXISTS slot_assignments_device
117
+ ON slot_assignments (platform, stable_device_id)
118
+ WHERE stable_device_id IS NOT NULL`.execute(d)}async function Em(d){await m`ALTER TABLE slot_scopes DROP COLUMN last_released_at_ms`.execute(d),await m`CREATE TABLE slot_assignments_v1 (
119
+ scope_key TEXT NOT NULL REFERENCES slot_scopes (scope_key),
120
+ slot_index INTEGER NOT NULL CHECK (slot_index >= 0),
121
+ role TEXT NOT NULL,
122
+ platform TEXT NOT NULL CHECK (platform IN ('android', 'ios')),
123
+ generation INTEGER NOT NULL CHECK (generation >= 0),
124
+ stable_device_id TEXT,
125
+ device_name TEXT,
126
+ requested_spec_json TEXT NOT NULL,
127
+ resolved_spec_json TEXT,
128
+ spec_fingerprint TEXT,
129
+ state TEXT NOT NULL CHECK (state IN ('provisioning', 'ready', 'replacing', 'cleanup_pending')),
130
+ exec_owner_daemon_id TEXT,
131
+ exec_owner_pid INTEGER,
132
+ exec_session_uuid TEXT,
133
+ updated_at_ms INTEGER NOT NULL,
134
+ CONSTRAINT slot_assignments_pk PRIMARY KEY (scope_key, slot_index)
135
+ )`.execute(d),await m`INSERT INTO slot_assignments_v1 (${kr})
136
+ SELECT scope_key, slot_index, role, platform, generation, stable_device_id, device_name,
137
+ requested_spec_json, resolved_spec_json, spec_fingerprint,
138
+ CASE state WHEN 'settling' THEN 'ready' ELSE state END,
139
+ exec_owner_daemon_id, exec_owner_pid, exec_session_uuid, updated_at_ms
140
+ FROM slot_assignments`.execute(d),await m`DROP TABLE slot_assignments`.execute(d),await m`ALTER TABLE slot_assignments_v1 RENAME TO slot_assignments`.execute(d),await m`CREATE UNIQUE INDEX IF NOT EXISTS slot_assignments_device
141
+ ON slot_assignments (platform, stable_device_id)
142
+ WHERE stable_device_id IS NOT NULL`.execute(d)}async function xm(d){await d.schema.createTable("slot_journal").ifNotExists().addColumn("id","integer",(c)=>c.primaryKey().autoIncrement()).addColumn("scope_key","text",(c)=>c.notNull().references("slot_scopes.scope_key")).addColumn("slot_index","integer",(c)=>c.notNull().check(m`slot_index >= 0`)).addColumn("kind","text",(c)=>c.notNull().check(m`kind IN ('create', 'replace', 'release')`)).addColumn("phase","text",(c)=>c.notNull().check(m`phase IN ('intent', 'deleting', 'deleted', 'creating', 'created', 'committed', 'rolled_back')`)).addColumn("platform","text",(c)=>c.notNull().check(m`platform IN ('android', 'ios')`)).addColumn("from_generation","integer",(c)=>c.notNull()).addColumn("to_generation","integer").addColumn("binding_generation","integer",(c)=>c.notNull()).addColumn("binding_stable_device_id","text").addColumn("target_json","text",(c)=>c.notNull()).addColumn("owner_daemon_id","text",(c)=>c.notNull()).addColumn("owner_pid","integer",(c)=>c.notNull()).addColumn("owner_process_token","text").addColumn("attempts","integer",(c)=>c.notNull().defaultTo(0)).addColumn("last_error","text").addColumn("next_attempt_at_ms","integer",(c)=>c.notNull()).addColumn("created_at_ms","integer",(c)=>c.notNull()).addColumn("updated_at_ms","integer",(c)=>c.notNull()).execute(),await m`CREATE UNIQUE INDEX IF NOT EXISTS slot_journal_open_slot
143
+ ON slot_journal (scope_key, slot_index)
144
+ WHERE phase NOT IN ('committed', 'rolled_back')`.execute(d)}async function Bm(d){await m`DROP INDEX IF EXISTS slot_journal_open_slot`.execute(d),await d.schema.dropTable("slot_journal").ifExists().execute()}var Ls={deletion_owner_daemon_id:"text",deletion_owner_pid:"integer",deletion_owner_process_token:"text",deletion_started_at_ms:"integer",deletion_attempts:"integer",deletion_last_error:"text",deletion_next_attempt_at_ms:"integer"};async function km(d){for(let[c,S]of Object.entries(Ls))await m`ALTER TABLE slot_free_devices ADD COLUMN ${m.id(c)} ${m.raw(S)}`.execute(d)}async function Om(d){for(let c of Object.keys(Ls).reverse())await m`ALTER TABLE slot_free_devices DROP COLUMN ${m.id(c)}`.execute(d)}async function Mm(d){await m`ALTER TABLE slot_free_devices ADD COLUMN deletion_failed_deletes integer`.execute(d)}async function Lm(d){await m`ALTER TABLE slot_free_devices DROP COLUMN deletion_failed_deletes`.execute(d)}async function $m(d){await m`ALTER TABLE slot_free_devices
145
+ ADD COLUMN state TEXT NOT NULL DEFAULT 'free'
146
+ CHECK (state IN ('free', 'stopping', 'stopped'))`.execute(d),await m`ALTER TABLE slot_free_devices ADD COLUMN stop_claimed_by TEXT`.execute(d),await m`ALTER TABLE slot_free_devices ADD COLUMN stop_claimed_at_ms INTEGER`.execute(d)}async function Um(d){await m`ALTER TABLE slot_free_devices DROP COLUMN stop_claimed_at_ms`.execute(d),await m`ALTER TABLE slot_free_devices DROP COLUMN stop_claimed_by`.execute(d),await m`ALTER TABLE slot_free_devices DROP COLUMN state`.execute(d)}async function qm(d){await d.schema.alterTable("session_broker_requests").addColumn("retryable","integer",(c)=>c.check(m`retryable IN (0, 1)`)).execute()}async function Hm(d){await d.schema.alterTable("session_broker_requests").dropColumn("retryable").execute()}async function Vm(d){await d.schema.createTable("session_broker_requests").addColumn("request_id","text",(c)=>c.primaryKey()).addColumn("fingerprint","text",(c)=>c.notNull()).addColumn("parameters_json","text",(c)=>c.notNull()).addColumn("owner_json","text",(c)=>c.notNull()).addColumn("state","text",(c)=>c.notNull().check(m`state IN ('acquiring', 'active', 'releasing', 'released', 'failed')`)).addColumn("resource_id","text").addColumn("session_id","text",(c)=>c.unique()).addColumn("error","text").addColumn("error_code","text").execute(),await d.schema.createTable("session_broker_resources").addColumn("allocation_index","integer",(c)=>c.primaryKey().autoIncrement()).addColumn("resource_id","text",(c)=>c.notNull().unique()).addColumn("scope_key","text",(c)=>c.notNull()).addColumn("profile_json","text",(c)=>c.notNull()).addColumn("state","text",(c)=>c.notNull().check(m`state IN ('reserved', 'active', 'idle', 'resetting', 'destroying', 'unknown', 'destroyed')`)).addColumn("request_id","text",(c)=>c.references("session_broker_requests.request_id")).addColumn("revision","integer",(c)=>c.notNull().check(m`revision > 0`)).addColumn("idle_order","integer",(c)=>c.notNull()).execute()}async function Wm(d){await d.schema.dropTable("session_broker_resources").execute(),await d.schema.dropTable("session_broker_requests").execute()}async function jm(d){await d.schema.createTable("session_broker_exports").addColumn("prepare_id","text",(c)=>c.primaryKey()).addColumn("request_id","text",(c)=>c.notNull().unique().references("session_broker_requests.request_id")).addColumn("request_digest","text",(c)=>c.notNull()).addColumn("created_at_ms","integer",(c)=>c.notNull()).addColumn("acknowledged_at_ms","integer").execute()}async function Km(d){await d.schema.dropTable("session_broker_exports").execute()}async function Jm(d){await d.schema.alterTable("session_broker_requests").addColumn("terminal_at_ms","integer").execute(),await d.schema.createIndex("session_broker_requests_state_idx").on("session_broker_requests").column("state").execute()}async function zm(d){await d.schema.dropIndex("session_broker_requests_state_idx").execute(),await d.schema.alterTable("session_broker_requests").dropColumn("terminal_at_ms").execute()}var Xm="2026_10_21_013_session_broker_timing",$s="2026_10_31_017_binding_registry_writers",Rt={"2026_10_09_000_slot_registry":Br,"2026_10_09_001_slot_owner_fencing":Or,"2026_10_09_002_slot_journal":Mr,"2026_10_10_003_free_device_stop_state":Ur,"2026_10_12_004_free_device_deletion":Fr,"2026_10_13_005_free_device_deletion_failed_deletes":Lr,"2026_10_15_006_session_broker":Vr,"2026_10_15_007_session_broker_failure_retryable":qr,"2026_10_16_008_retire_slot_features":Tr,"2026_10_16_009_session_broker_receipt_retention":jr,"2026_10_19_010_session_broker_exports":Wr,"2026_10_20_011_session_broker_resource_indexes":mr,"2026_10_21_012_device_mutation_journal":pr,[Xm]:fr,"2026_10_26_014_device_claims":gr,"2026_10_27_015_device_claims_metadata":vr,"2026_10_30_016_watchos_binding_platform":yr,[$s]:ur},zG=Object.keys(Rt).at(-1);function Ym(d,c=kn){return Object.fromEntries(Object.entries(d).map(([S,D])=>{if(S<$s)return[S,D];return[S,{async up(x){await D.up(x),await m`INSERT OR IGNORE INTO binding_registry_migration_writers
147
+ (migration_name, writer_version, recorded_at)
148
+ VALUES (${S}, ${c()}, ${new Date().toISOString()})`.execute(x)},async down(x){await m`DELETE FROM binding_registry_migration_writers
149
+ WHERE migration_name = ${S}`.execute(x),await D.down?.(x)}}]}))}function Us(d){return{getMigrations:async()=>Ym(Rt,()=>d??kn())}}var Qm=Us();async function Dt(d,c){let S=await qs(d),D=Hs(S);if(D.length>0)throw new zr(c,D,await Ks(d,D))}async function Qr(d,c){return(await m`
150
+ SELECT name FROM sqlite_master WHERE type = 'table' AND name = ${c}
151
+ `.execute(d)).rows.length>0}async function qs(d){return(await m`SELECT name FROM kysely_migration ORDER BY name`.execute(d)).rows.map(({name:S})=>S)}function Hs(d){return d.filter((c)=>!Object.hasOwn(Rt,c))}function Gs(d){return m`
152
+ SELECT migration_name, writer_version FROM binding_registry_migration_writers
153
+ WHERE migration_name IN (${m.join(d)})
154
+ `}function js(d,c,S){if(S.length===0)return{};try{let D=c.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?");try{if(!D.get("binding_registry_migration_writers"))return{}}finally{D.finalize()}let C=Gs(S).compile(d),x=c.prepare(C.sql);try{return Object.fromEntries(x.all(...C.parameters).map((T)=>{if(typeof T!=="object"||T===null||!("migration_name"in T)||typeof T.migration_name!=="string"||!("writer_version"in T)||typeof T.writer_version!=="string")throw new t("Invalid binding registry migration writer version");return[T.migration_name,T.writer_version]}))}finally{x.finalize()}}catch(D){return e.warn("[Bindings] Cannot read registry migration writer versions",D),{}}}async function Ks(d,c){if(c.length===0)return{};try{if(!await Qr(d,"binding_registry_migration_writers"))return{};let S=await Gs(c).execute(d);return Object.fromEntries(S.rows.map((D)=>[D.migration_name,D.writer_version]))}catch(S){return e.warn("[Bindings] Cannot read registry migration writer versions",S),{}}}async function Js(d){let c=await Qr(d,"kysely_migration")?await qs(d):[],S=c.at(-1)??null,D=await Ks(d,S===null?[]:[S]);return{schemaVersion:S,knownSchemaVersion:zG,supported:Hs(c).length===0,writerVersion:S===null?null:D[S]??null}}async function Jr(d,c){if(await Qr(d,"kysely_migration"))await Dt(d,c)}class Zt extends t{}async function zs(d,c){if(await Jr(d,c),(await new ND({db:d,provider:Qm}).getMigrations()).some((D)=>D.executedAt===void 0))throw new Zt("Binding registry upgrade pending; exclusion will retry after retirement")}async function Xs(d,c,S,D={}){await Jr(d,c);let C=new ND({db:d,provider:Us(D.writerVersion)});if((await C.getMigrations()).every((T)=>T.executedAt!==void 0))return;let x=Wz(c);await x.acquire();try{if(await Jr(d,c),(await C.getMigrations()).some((O)=>O.name==="2026_10_16_008_retire_slot_features"&&O.executedAt===void 0))await S?.();let{error:B}=await C.migrateToLatest();if(B)throw new t(`Failed to migrate the binding registry at ${c}: ${r(B)}`)}finally{await x.release()}}import{AsyncLocalStorage as Hf}from"async_hooks";function Ct(d){return{scopeKey:d.scope_key,managedHostScope:d.managed_host_scope,runnerNamespace:d.runner_namespace,runnerIncarnation:d.runner_incarnation,state:d.state,createdAtMs:d.created_at_ms,lastAcquiredAtMs:d.last_acquired_at_ms,lastReleasedAtMs:d.last_released_at_ms,invalidationReason:d.invalidation_reason,invalidatingAtMs:d.invalidating_at_ms,invalidatedAtMs:d.invalidated_at_ms}}function Ys(d){if(d===null)return null;return JSON.parse(d)}function Zm(d){if(d.exec_owner_daemon_id===null||d.exec_owner_pid===null||d.exec_session_uuid===null)return null;return{daemonId:d.exec_owner_daemon_id,pid:d.exec_owner_pid,sessionUuid:d.exec_session_uuid,processGenerationToken:d.exec_owner_process_token}}function ep(d){if(d.settler_daemon_id===null||d.settler_pid===null)return null;return{daemonId:d.settler_daemon_id,pid:d.settler_pid,processGenerationToken:d.settler_process_token}}function It(d){return{settler_daemon_id:d?.daemonId??null,settler_pid:d?.pid??null,settler_process_token:d?.processGenerationToken??null}}function ue(d){return{scopeKey:d.scope_key,bindingIndex:d.slot_index,role:d.role,platform:d.platform,generation:d.generation,stableDeviceId:d.stable_device_id,deviceName:d.device_name,requestedSpec:Ys(d.requested_spec_json),resolvedSpec:Ys(d.resolved_spec_json),specFingerprint:d.spec_fingerprint,state:d.state,execOwner:Zm(d),settler:ep(d),updatedAtMs:d.updated_at_ms}}function Pt(d,c){let S=d[c];if(S===null||S===void 0)return null;if(typeof S!=="string")throw new t(`Binding journal target field '${c}' is not a string`);return S}function jG(d){return d==="android"||d==="ios"||d==="watchos"}function at(d){let c=JSON.parse(d);if(typeof c!=="object"||c===null)throw new t("Binding journal target is not an object");let S=c,D=S.newPlatform;if(D!==void 0&&D!==null&&!jG(D))throw new t("Binding journal target field 'newPlatform' is not a platform");return{...D?{newPlatform:D}:{},...S.removalRequested===!0?{removalRequested:!0}:{},...typeof S.quarantinedAtMs==="number"&&Number.isFinite(S.quarantinedAtMs)?{quarantinedAtMs:S.quarantinedAtMs}:{},oldStableId:Pt(S,"oldStableId"),oldName:Pt(S,"oldName"),newName:Pt(S,"newName"),newStableId:Pt(S,"newStableId"),requestedSpec:S.requestedSpec??null,resolvedSpec:S.resolvedSpec??null,specFingerprint:Pt(S,"specFingerprint")}}function be(d){return{id:d.id,scopeKey:d.scope_key,bindingIndex:d.slot_index,kind:d.kind,phase:d.phase,platform:d.platform,fromGeneration:d.from_generation,toGeneration:d.to_generation,binding:{generation:d.binding_generation,stableDeviceId:d.binding_stable_device_id},target:at(d.target_json),owner:{daemonId:d.owner_daemon_id,pid:d.owner_pid,processGenerationToken:d.owner_process_token},attempts:d.attempts,lastError:d.last_error,nextAttemptAtMs:d.next_attempt_at_ms,createdAtMs:d.created_at_ms,updatedAtMs:d.updated_at_ms}}function dt(d){let c=JSON.stringify(d??null);if(c===void 0)throw new t("Binding spec must be JSON-serializable");return c}function Zs(d,c,S,D){return{phase:c.phase,target_json:dt({...d.target,...c.target}),to_generation:S&&S.generation!==d.binding.generation?S.generation:d.toGeneration,...S?{binding_generation:S.generation,binding_stable_device_id:S.stableDeviceId}:{},...c.attempt?{attempts:d.attempts+1,last_error:c.attempt.error,next_attempt_at_ms:c.attempt.nextAttemptAtMs}:{},updated_at_ms:D}}function ea(d){if(!HP(d))throw new t(`A binding journal entry cannot open at phase '${d}'`)}class Zr{db;constructor(d){this.db=d}async listReferencedAvdNames(){return this.db.transaction().execute(async(d)=>{let c=await d.selectFrom("slot_assignments").select(["device_name","stable_device_id"]).execute(),S=await d.selectFrom("slot_journal").select(["binding_stable_device_id","target_json"]).execute(),D=c.flatMap((C)=>[C.device_name,C.stable_device_id]);for(let C of S){let x=at(C.target_json);D.push(C.binding_stable_device_id,x.oldName,x.oldStableId,x.newName,x.newStableId)}return[...new Set(D.filter((C)=>C!==null))]})}}class en{db;write;constructor(d,c=(S)=>S(d)){this.db=d;this.write=c}async upsert(d){let c=ta(d);await this.write((S)=>S.insertInto("device_claims").values(c).onConflict((D)=>D.columns(["platform","device_id"]).doUpdateSet({...c,claimed_at_ms:m`CASE WHEN device_claims.pid = excluded.pid
155
+ AND device_claims.owner_token = excluded.owner_token
156
+ THEN device_claims.claimed_at_ms ELSE excluded.claimed_at_ms END`}).where("device_claims.updated_at_ms","<=",c.updated_at_ms)).execute())}async replaceIf(d,c){let S=ta(c);return this.write(async(D)=>{if(!d){let x=await D.insertInto("device_claims").values(S).onConflict((T)=>T.columns(["platform","device_id"]).doNothing()).executeTakeFirst();return Number(x.numInsertedOrUpdatedRows??0)>0}let C=await D.updateTable("device_claims").set(S).where("platform","=",c.platform).where("device_id","=",c.deviceId).where("pid","=",d.pid).where("owner_token","=",d.ownerToken).where("updated_at_ms","=",d.updatedAtMs).executeTakeFirst();return Number(C.numUpdatedRows)>0})}async release(d,c,S){await this.write((D)=>D.deleteFrom("device_claims").where("platform","=",d).where("device_id","=",c).where("pid","=",S.pid).where("owner_token","=",S.ownerToken).execute())}async releaseOwnedBy(d){await this.write((c)=>c.deleteFrom("device_claims").where("pid","=",d.pid).where("owner_token","=",d.ownerToken).execute())}async get(d,c){let S=await this.db.selectFrom("device_claims").selectAll().where("platform","=",d).where("device_id","=",c).executeTakeFirst();return S?ia(S):void 0}async list(){return(await this.db.selectFrom("device_claims").selectAll().orderBy("platform").orderBy("device_id").execute()).map(ia)}}function ta(d){return{platform:d.platform,device_id:d.deviceId,kind:d.kind,daemon_session_id:d.daemonSessionId??null,pid:d.pid,owner_token:d.ownerToken,process_generation_token:d.processGenerationToken??null,session_uuid:d.sessionUuid??null,metadata:d.metadata??null,claimed_at_ms:d.claimedAtMs,updated_at_ms:d.updatedAtMs}}function ia(d){return{platform:d.platform,deviceId:d.device_id,kind:d.kind,...d.daemon_session_id===null?{}:{daemonSessionId:d.daemon_session_id},pid:d.pid,ownerToken:d.owner_token,...d.process_generation_token===null?{}:{processGenerationToken:d.process_generation_token},...d.session_uuid===null?{}:{sessionUuid:d.session_uuid},...d.metadata===null?{}:{metadata:d.metadata},claimedAtMs:d.claimed_at_ms,updatedAtMs:d.updated_at_ms}}function ra(d,c){let S=[];for(let{selection:D}of d.selections??[])if(tb.is(D)&&Yt.is(D.column))S.push(rn(D.column.column.name),nn(c,D.column.column.name));else if(Yt.is(D))S.push(rn(D.column.name),nn(c,D.column.name));else if(bs.is(D)&&tt.is(D.alias))S.push(rn(D.alias.name),nn(c,D.alias.name));else throw Error("can't extract column names from the select query node");return S}function rn(d){return new Er(Wn.createImmediate(d))}function nn(d,c){return new Er(tb.create(Yt.create(c),wc.create(d)))}function on(d){return m`(select coalesce(json_group_array(json_object(${m.join(tp(d.toOperationNode(),"agg"))})), '[]') from ${d} as agg)`}function tp(d,c){try{return ra(d,c)}catch{throw Error("SQLite jsonArrayFrom and jsonObjectFrom functions can only handle explicit selections due to limitations of the json_object function. selectAll() is not allowed in the subquery.")}}import{existsSync as Tf}from"fs";import{dirname as Bf,join as kf}from"path";var ip=cd("family",[f({family:ee("iphone"),variant:P(["standard","pro","pro-max","air"])}),f({family:ee("ipad"),variant:P(["standard","mini","air","pro"]),sizeInches:y().optional()}),f({family:ee("duo"),variant:ee("duo")})]),sn=cd("platform",[f({platform:ee("ios"),metadataState:ee("current"),simulatorDeviceTypeIdentifier:y().min(1),modelIdentifier:y().min(1).optional(),archetype:P(["phone","tablet","duo"]),modelType:ip,runtimeId:y().min(1),osVersion:y().regex(/^\d+(?:\.\d+)*$/),compatibility:P(["supported","unknown"])}),f({platform:ee("android"),metadataState:ee("current"),profileId:y().min(1),archetype:P(["phone","tablet","foldable"]),memoryMb:A().int().positive().optional(),effectiveRamMb:A().positive().nullable().optional(),effectiveCpuCores:A().int().positive().nullable().optional(),systemImagePackage:y().min(1),osVersion:y().regex(/^\d+(?:\.\d+)*$/),versionPrecision:P(["major","minor","patch"]),apiLevel:A().int().positive(),abi:y().min(1),flavor:y().min(1)}),f({platform:ee("watchos"),metadataState:ee("current"),runtime:y().min(1),deviceType:y().min(1)})]);function In(d){let c=f({profile:sn}).safeParse(d.profile);if(!c.success)throw new t("Stored session device profile is incomplete; retain its reservation for recovery");return c.data.profile}function oN(d){return In({profile:d})}async function DX(d,c,S){let D;if(d.platform==="android"&&c?.device)try{D=await S?.readConfig(c.device.name)}catch(x){e.warn(`Cannot read effective Android hardware for broker receipt: ${r(x)}`,x)}return d.platform==="android"?{...d,effectiveRamMb:D?.effectiveRamMb??null,effectiveCpuCores:D?.effectiveCpuCores??null}:d}function na(d,c){if(c?.platform!=="android")return{};return{profile_json:JSON.stringify({...typeof d.profile==="object"&&d.profile!==null?d.profile:{},profile:{...In(d),effectiveRamMb:c.effectiveRamMb??null,effectiveCpuCores:c.effectiveCpuCores??null}})}}class pI extends t{code="reset_capacity_wait_exceeded";details;constructor(d,c,S){let{platform:D,limit:C,booted:x,externalDevices:T,heldDevices:B}=S.details,O=T?.length?` Simulators with no AutoMobile owner still counting toward the limit: ${T.join(", ")}.`:"";super(`Gave up after ${c/1000}s waiting for iOS simulator capacity to re-boot reset simulator ${d}: ${x} simulator(s) booted, limit is ${C}.${O} Shut them down (xcrun simctl shutdown <udid>) or raise AUTOMOBILE_IOS_SIM_MAX_BOOTED.`,{cause:S});this.name="ResetCapacityWaitExceededError",this.details={platform:D,deviceId:d,waitedMs:c,limit:C,booted:x,externalDevices:T,heldDevices:B}}}class Ee extends t{code="session_broker_invariant_failed"}var OX=5000,Od=5000;class jb extends t{code;retryable;retryAfterMs;constructor(d){super("Session request belongs to another daemon process generation");if(this.name="SessionRequestOwnerMismatchError",this.code=d?"session_restart_handoff_pending":"session_owner_mismatch",this.retryable=d,d)this.retryAfterMs=Od}}function rp(d){return d instanceof ns||d instanceof Ve&&d.platform==="ios"&&d.discoveryError?.retryable!==!1||"name"in d&&(d.name==="AbortError"||d.name==="TimeoutError")}function np(d){if(d instanceof Ee||d instanceof jb)return"permanent";if(typeof d!=="object"||d===null)return"unknown";if(rp(d))return"retryable";if("code"in d&&typeof d.code==="string"&&d.code.startsWith("SQLITE_"))return $a({code:d.code})==="retryable"?"retryable":"permanent";return"unknown"}function Kb(d){let c=new Set,S="unknown";while(!c.has(d)){c.add(d);let D=np(d);if(D==="permanent")return D;if(D==="retryable")S=D;d=typeof d==="object"&&d!==null&&"cause"in d?d.cause:void 0}return S}var oa="capacity_exhausted";class Nn extends t{code=oa;retryable=!0;details;constructor(d,c){super(c);this.name="BootCapacityExhaustedError",this.details={...d,code:oa,retryable:!0}}get retryAfterMs(){return this.details.retryAfterMs}get limit(){return this.details.limit}get booted(){return this.details.booted}get platform(){return this.details.platform}}class ha extends t{failure;constructor(d){super(d.message);this.failure=d}}function Gb(d){if(!d.ok)throw new ha({code:d.error.code,message:d.error.message,retryable:d.error.transient});return d.value}class Md extends t{code="session_broker_stopping";retryable=!0;retryAfterMs=Od;constructor(){super("Session broker is stopping");this.name="SessionBrokerStoppingError"}}function J(d){return{ok:!0,value:d}}function j(d,c,S={}){return{ok:!1,error:{code:d,message:c,transient:S.transient??!1,...S.field===void 0?{}:{field:S.field}}}}function an(d){if(d.family==="duo")return"duo";return d.family==="ipad"?"tablet":"phone"}function ei(d){if(d===void 0)return;let[c,S]=d.split("."),D=c.replace(/^0+(?=\d)/,""),C=S?.replace(/0+$/,"");return C?`${D}.${C}`:D}function ln(d,c){if(d.family!==c.family||d.variant!==c.variant)return!1;if(d.family!=="ipad"||c.family!=="ipad")return!0;return ei(d.sizeInches)===ei(c.sizeInches)}function aa(d,c){if(d.family!==c.family||d.variant!==c.variant)return!1;if(d.family!=="ipad"||c.family!=="ipad")return!0;return d.sizeInches===void 0||ei(d.sizeInches)===ei(c.sizeInches)}function ct(d){if(d.family==="duo")return"Duo";if(d.family==="iphone")return`iPhone ${d.variant}`;let c=d.sizeInches===void 0?"":` ${d.sizeInches}-inch`;return`iPad ${d.variant}${c}`}function op(d,c){if(c.namespace==="product-model")return d.modelIdentifier===c.value;if(c.namespace==="simulator-device-type")return d.simulatorDeviceTypeIdentifier===c.value;return d.aliases?.includes(c.value)===!0}function ti(d,c,S="hardware.model"){let D=c.models.filter((x)=>op(x,d));if(D.length>1)return j(d.namespace==="alias"?"ambiguous_model_alias":"catalog_metadata_invalid",`${S} '${d.value}' resolves to more than one catalog model.`,{field:S});let C=D[0];if(!C)return j("unsupported_hardware",`${S} '${d.value}' is not present in the installed iOS catalog.`,{field:S});if(C.metadataState!=="current")return j("catalog_metadata_invalid",`${S} '${d.value}' has stale catalog metadata.`,{field:S});if(!C.archetype||!C.modelType)return j("catalog_metadata_invalid",`${S} '${d.value}' lacks explicit archetype or model-type metadata.`,{field:S});if(an(C.modelType)!==C.archetype)return j("catalog_metadata_invalid",`${S} '${d.value}' has conflicting archetype and model-type metadata.`,{field:S});return J(C)}function ri(d,c){let S=c.profiles.filter((C)=>C.profileId===d);if(S.length===0){let C=c.profiles.map((x)=>x.profileId).join(", ")||"none";return j("unsupported_hardware",`Android profile '${d}' is not installed. Installed profiles: ${C}.`,{field:"hardware.profileId"})}if(S.length>1)return j("catalog_metadata_invalid",`Android profile '${d}' is duplicated in the catalog.`);let[D]=S;if(D.metadataState!=="current")return j("catalog_metadata_invalid",`Android profile '${d}' lacks current catalog metadata.`);if(D.archetype===void 0)return j("unsupported_hardware",`Android profile '${d}' has no archetype classification. Classify it as phone, tablet or foldable in androidProfileArchetypes.`,{field:"hardware.profileId"});return J({...D,archetype:D.archetype,metadataState:"current"})}function ni(d){let c=d.effective.hardware;return c.kind==="archetype"?c.archetype:d.exactProfile?.archetype}function da(d,c,S){if(c.platform!==d||S.platform!==d)return j("invalid_config",`Requirement, defaults, and catalog must all target ${d}.`);if(!c.policyVersion)return j("invalid_config","Default policy version must be non-empty.",{field:"policyVersion"});if(S.provenance.state!=="ready")return j("catalog_unavailable",S.provenance.message??`${d} catalog is unavailable.`,{transient:!0});if(!S.provenance.source||!S.provenance.revision)return j("catalog_metadata_invalid","Catalog provenance is incomplete.");return J(!0)}function sp(d){return d.replace(/^0+(?=\d)/,"")}function Mo(d,c="os.version"){if(!/^\d+(?:\.\d+)*$/.test(d))return j("invalid_request",`${c} must be a dotted numeric release.`,{field:c});let S=d.split(".").map(sp);while(S.length>1&&S.at(-1)==="0")S.pop();if(S.every((D)=>D==="0"))return j("invalid_request",`${c} must be greater than zero.`,{field:c});return J({value:S.join("."),components:S,precision:S.length})}function Ke(d,c){return Qs(d,c)}function lt(d,c="os"){if(d.kind==="major"){if(!Number.isSafeInteger(d.major)||d.major<=0)return j("invalid_request",`${c}.major must be a positive safe integer.`,{field:`${c}.major`});return J(d)}let S=Mo(d.version,`${c}.version`);return S.ok?J({kind:d.kind,version:S.value.value}):S}function Te(d,c){let S=Mo(c);if(!S.ok)return!1;if(d.kind==="major")return S.value.components[0]===String(d.major);let D=Ke(S.value.value,d.version);return d.kind==="exact"?D===0:D>=0}function ai(d){return d==="major"?1:d==="minor"?2:3}function di(d,c,S){if(!S)return!1;let D=Mo(c);if(!D.ok)return!1;let C=ai(S),x=D.value.components.slice(0,C).join(".");if(d.kind==="exact"){let T=Mo(d.version);if(!T.ok||T.value.precision>C||D.value.precision>C)return!1}return Te(d,x)}var Je={kind:"match"};function oe(d){return{kind:"mismatch",reason:d}}function ap(d,c){let S=d.effective.hardware;if(S.kind==="exact-model"){let D=d.exactModel;if(!D||!c.simulatorDeviceTypeIdentifier)return oe("unknown-hardware-metadata");return c.simulatorDeviceTypeIdentifier===D.simulatorDeviceTypeIdentifier?Je:oe("hardware")}if(S.kind==="model-type"){if(!c.modelType)return oe("unknown-hardware-metadata");return aa(S.modelType,c.modelType)?Je:oe("hardware")}if(!c.archetype)return oe("unknown-hardware-metadata");return c.archetype===S.archetype?Je:oe("hardware")}function dp(d,c){let S=d.effective.hardware;if(S.kind==="exact-profile"){if(!c.profileId)return oe("unknown-hardware-metadata");return c.profileId===S.profileId?Je:oe("hardware")}if(!c.archetype)return oe("unknown-hardware-metadata");return c.archetype===ni(d)?Je:oe("hardware")}function ca(d,c){if(!c.osVersion||!Mo(c.osVersion).ok)return oe("unknown-os-metadata");if(c.platform==="android"){if(!c.versionPrecision)return oe("unknown-os-metadata");return di(d.effective.os,c.osVersion,c.versionPrecision)?Je:oe("os")}return Te(d.effective.os,c.osVersion)?Je:oe("os")}function yH(d,c){if(d.platform!==c.platform)return oe("platform");if(c.metadataState!=="current")return oe("stale-metadata");if(d.platform==="ios"&&c.platform==="ios"){let S=ap(d,c);return S.kind==="match"?ca(d,c):S}if(d.platform==="android"&&c.platform==="android"){let S=dp(d,c);return S.kind==="match"?ca(d,c):S}return oe("platform")}var ua=["none","notch","dynamic_island","hole_punch","any"],cp=new Set(["iphone-se","iphone-se-2nd-generation","iphone-se-3rd-generation","iphone-6","iphone-6-plus","iphone-6s","iphone-6s-plus","iphone-7","iphone-7-plus","iphone-8","iphone-8-plus","ipod-touch-7th-generation"]),lp=new Set(["iphone-x","iphone-xr","iphone-xs","iphone-xs-max","iphone-11","iphone-11-pro","iphone-11-pro-max","iphone-12","iphone-12-mini","iphone-12-pro","iphone-12-pro-max","iphone-13","iphone-13-mini","iphone-13-pro","iphone-13-pro-max","iphone-14","iphone-14-plus","iphone-16e"]),up=new Set(["iphone-14-pro","iphone-14-pro-max","iphone-15","iphone-15-plus","iphone-15-pro","iphone-15-pro-max","iphone-16","iphone-16-plus","iphone-16-pro","iphone-16-pro-max","iphone-17","iphone-17-pro","iphone-17-pro-max","iphone-air","iphone-17e"]),mp=new Set(["pixel","pixel_2","pixel_2_xl","pixel_3","pixel_3a","pixel_3a_xl","pixel_4","pixel_4_xl","pixel_c","pixel_tablet","nexus 5x","medium phone","small phone"]),fp=new Set(["pixel_3_xl"]),gp=new Set(["pixel_4a","pixel_4a_5g","pixel_5","pixel_5a","pixel_6","pixel_6_pro","pixel_6a","pixel_7","pixel_7_pro","pixel_7a","pixel_8","pixel_8_pro","pixel_8a","pixel_9","pixel_9_pro","pixel_9_pro_xl","pixel_9_pro_fold"]);function vp(d){return d.startsWith("com.apple.CoreSimulator.SimDeviceType.")?d.slice(38).toLowerCase().replaceAll(/-+/g,"-").replaceAll(/(^-|-$)/g,""):""}function Yb(d,c){if(d==="ios"){let D=vp(c);if(cp.has(D)||D.startsWith("ipad-"))return"none";if(lp.has(D))return"notch";if(up.has(D))return"dynamic_island";return"unknown"}let S=c.toLowerCase();if(mp.has(S))return"none";if(fp.has(S))return"notch";if(gp.has(S))return"hole_punch";return"unknown"}var ma=30,ci="com.apple.CoreSimulator.",hp="system-images;",yp=["phone","tablet","foldable","tv","watch","automotive","xr-headset","xr-glasses"],pa=p(yp).optional().describe("Required device family, independent of the exact model and creation default");function wp(d){let c=Yr(d);return c?.tag==="google_apis_playstore"&&c.apiLevel>=ma}var fa=n().min(1).describe("Installed Android system-image package identifier"),va=n().min(1).describe("Android avdmanager device profile identifier"),mo={ios:{platform:"ios",catalog:"automobile:devices/images/ios",example:{runtime:"com.apple.CoreSimulator.SimRuntime.iOS-26-5",deviceType:"com.apple.CoreSimulator.SimDeviceType.iPhone-17-Pro"}},watchos:{platform:"watchos",catalog:"automobile:devices/images/watchos",example:{runtime:"com.apple.CoreSimulator.SimRuntime.watchOS-11-0",deviceType:"com.apple.CoreSimulator.SimDeviceType.Apple-Watch-Series-10-46mm"}},tvos:{platform:"tvos",catalog:"automobile:devices/images/tvos",example:{runtime:"com.apple.CoreSimulator.SimRuntime.tvOS-26-5",deviceType:"com.apple.CoreSimulator.SimDeviceType.Apple-TV-4K-3rd-generation-4K"}},visionos:{platform:"visionos",catalog:"automobile:devices/images/visionos",example:{runtime:"com.apple.CoreSimulator.SimRuntime.xrOS-26-5",deviceType:"com.apple.CoreSimulator.SimDeviceType.Apple-Vision-Pro-4K"}}};function bp(d){return`pass spec { runtime, deviceType } with exact CoreSimulator identifiers, e.g. ${JSON.stringify(d.example)}; list the host's identifiers with ${d.catalog}`}function ya(d){return(c)=>c.input===void 0?d:void 0}function Be(d,c,S){return n({error:ya(`is required: a CoreSimulator ${d==="runtime"?"runtime":"device-type"} identifier such as '${c.example[d]}'; list the host's identifiers with `+c.catalog)}).min(1).describe(S)}function mi(d){return{error:ya(`is required for ${d.platform}: ${bp(d)}`)}}var Sp=n().min(1).describe("CoreSimulator runtime identifier"),_p=n().min(1).describe("CoreSimulator device-type identifier"),gi=p(ua).optional().describe("Required display cutout class for the exact device type; 'any' accepts every class");function KG(d,c){if(d.runtime.startsWith(ci))c.addIssue({code:"custom",message:"Android runtime must be an Android system-image identifier",path:["runtime"]});if(d.deviceType?.startsWith(ci))c.addIssue({code:"custom",message:"Android deviceType must be an Android avdmanager device profile identifier",path:["deviceType"]});let S=d.configuration?.memoryMb;if(S!==void 0&&S<Jd&&wp(d.runtime))c.addIssue({code:"custom",message:`memoryMb must be at least ${Jd} for Android API ${ma}+ Play Store images`,path:["configuration","memoryMb"]})}function wa(d,c){if(d.runtime.startsWith(hp))c.addIssue({code:"custom",message:"iOS runtime must be a CoreSimulator runtime identifier",path:["runtime"]});if(d.deviceType!==void 0&&!d.deviceType.startsWith(ci)){let S=mo.ios;c.addIssue({code:"custom",message:`iOS deviceType must be a full CoreSimulator device-type identifier (${ci}SimDeviceType.${d.deviceType}, not '${d.deviceType}'), e.g. '${S.example.deviceType}'; list the host's identifiers with ${S.catalog}`,path:["deviceType"]})}}var MX={runtime:fa,deviceType:va,displayCutout:gi,configuration:oT.optional()},NX=s({runtime:Be("runtime",mo.ios,"CoreSimulator runtime identifier"),deviceType:Be("deviceType",mo.ios,"CoreSimulator device-type identifier"),displayCutout:gi},mi(mo.ios)).strict().superRefine(wa),FX=s({runtime:fa,deviceType:va.optional(),deviceFamily:pa,displayCutout:gi,configuration:oT.optional()}).strict().superRefine(KG),LX=s({runtime:Sp,deviceType:_p.optional(),deviceFamily:pa,displayCutout:gi}).strict().superRefine(wa),sN=s({runtime:Be("runtime",mo.watchos,"watchOS CoreSimulator runtime identifier"),deviceType:Be("deviceType",mo.watchos,"Apple Watch CoreSimulator device-type identifier")},mi(mo.watchos)).strict(),vH=sN,BX=s({runtime:Be("runtime",mo.tvos,"tvOS CoreSimulator runtime identifier"),deviceType:Be("deviceType",mo.tvos,"Apple TV CoreSimulator device-type identifier")},mi(mo.tvos)).strict(),$X=s({runtime:Be("runtime",mo.visionos,"visionOS CoreSimulator runtime identifier"),deviceType:Be("deviceType",mo.visionos,"Apple Vision Pro CoreSimulator device-type identifier")},mi(mo.visionos)).strict();function Sa(d){let c=sN.safeParse(d.spec);if(!c.success)return j("invalid_request",`spec must name exactly a watchOS runtime and an Apple Watch deviceType: ${_k(c.error)}`,{field:"spec"});return J({schemaVersion:1,platform:"watchos",spec:c.data})}function ba(d){return d.length>0?d.join(", "):"none installed"}function mn(d,c){if(c.platform!=="watchos")return j("invalid_config","Requirement and catalog must both target watchos.");if(c.provenance.state==="not-installed")return j("unsupported_hardware",c.provenance.message??"Apple Watch simulators exist only on macOS hosts with Xcode's simctl.",{field:"platform"});if(c.provenance.state!=="ready")return j("catalog_unavailable",c.provenance.message??"The Apple Watch simulator catalog is unavailable.",{transient:!0});let{runtime:S,deviceType:D}=d.spec;if(!c.deviceTypes.some((x)=>x.deviceType===D))return j("unsupported_hardware",`Unknown Apple Watch device type '${D}'. Available: `+ba(c.deviceTypes.map((x)=>x.deviceType)),{field:"spec.deviceType"});let C=c.runtimes.filter((x)=>x.installed);if(!C.some((x)=>x.runtime===S)){let x=c.runtimes.some((T)=>T.runtime===S);return j("missing_installed_runtime",`${x?"Unavailable":"Unknown"} watchOS runtime '${S}'. Available: `+ba(C.map((T)=>T.runtime)),{field:"spec.runtime"})}return J({platform:"watchos",original:d,profile:{platform:"watchos",metadataState:"current",runtime:S,deviceType:D},catalogSource:c.provenance.source,catalogRevision:c.provenance.revision})}function pn(d,c){if(c.platform!=="watchos")return{kind:"mismatch",reason:"platform"};if(c.metadataState!=="current")return{kind:"mismatch",reason:"stale-metadata"};if(c.deviceType!==d.profile.deviceType)return{kind:"mismatch",reason:"hardware"};return c.runtime===d.profile.runtime?{kind:"match"}:{kind:"mismatch",reason:"os"}}var aN=["pixel-baseline","samsung-oneui","xiaomi-hyperos","oneplus-oxygenos","oppo-coloros","motorola","huawei-emui","vivo-funtouch","realme-ui","meizu-flyme","asus-zenui","sony-xperia","tecno-hios"],by=["samsung-dex","knox","flip-cover-screen","spen-air-actions","oem-systemui","oem-unused-app-triggers","firmware-update-exemption-reset","xiaomi-proprietary-appops"];function ze(d){return typeof d==="object"&&d!==null&&!Array.isArray(d)}function se(d,c){let S=Object.keys(d).filter((D)=>!c.includes(D));return S.length===0?J(!0):j("invalid_request",`Unexpected field(s): ${S.join(", ")}.`)}function _a(d,c){return typeof d==="string"&&d.length>0?J(d):j("invalid_request",`${c} must be a non-empty string.`,{field:c})}function Rp(d){if(!ze(d))return j("invalid_request","hardware.model must be an exact model reference.",{field:"hardware.model"});let c=se(d,["namespace","value"]);if(!c.ok)return c;if(d.namespace!=="product-model"&&d.namespace!=="simulator-device-type"&&d.namespace!=="alias")return j("invalid_request","hardware.model.namespace must be product-model, simulator-device-type, or alias.",{field:"hardware.model.namespace"});let S=_a(d.value,"hardware.model.value");return S.ok?J({namespace:d.namespace,value:S.value}):S}function Dp(d){let c=se(d,["family","variant"]);if(!c.ok)return c;let S=d.variant;if(S==="standard"||S==="pro"||S==="pro-max"||S==="air")return J({family:"iphone",variant:S});return j("invalid_request","Unsupported iPhone model type.",{field:"hardware.modelType.variant"})}function Pp(d){let c=se(d,["family","variant"]);if(!c.ok)return c;return d.variant==="duo"?J({family:"duo",variant:"duo"}):j("invalid_request","Unsupported Duo model type.",{field:"hardware.modelType.variant"})}function Cp(d){if(!ze(d))return j("invalid_request","hardware.modelType must be an object.",{field:"hardware.modelType"});if(d.family==="iphone")return Dp(d);if(d.family==="ipad")return Ip(d);if(d.family==="duo")return Pp(d);return j("invalid_request","Unsupported iOS model family.",{field:"hardware.modelType.family"})}function Ip(d){let c=se(d,["family","variant","sizeInches"]);if(!c.ok)return c;let S=d.variant;if(S!=="standard"&&S!=="mini"&&S!=="air"&&S!=="pro")return j("invalid_request","Unsupported iPad model type.",{field:"hardware.modelType.variant"});if(d.sizeInches===void 0)return J({family:"ipad",variant:S});if(typeof d.sizeInches!=="string"||!/^\d+(?:\.\d+)?$/.test(d.sizeInches))return j("invalid_request","hardware.modelType.sizeInches must be numeric.",{field:"hardware.modelType.sizeInches"});return J({family:"ipad",variant:S,sizeInches:d.sizeInches})}function Ap(d){let c=se(d,["kind","archetype"]);if(!c.ok)return c;if(d.archetype==="phone"||d.archetype==="tablet"||d.archetype==="duo")return J({kind:"archetype",archetype:d.archetype});return j("invalid_request","Unsupported iOS hardware archetype.",{field:"hardware.archetype"})}function Ep(d){let c=se(d,["kind","modelType"]);if(!c.ok)return c;let S=Cp(d.modelType);return S.ok?J({kind:"model-type",modelType:S.value}):S}function xp(d){let c=se(d,["kind","model"]);if(!c.ok)return c;let S=Rp(d.model);return S.ok?J({kind:"exact-model",model:S.value}):S}function Tp(d){if(!ze(d)||typeof d.kind!=="string")return j("invalid_request","hardware must have an explicit selector kind.",{field:"hardware"});if(d.kind==="omitted"){let c=se(d,["kind"]);return c.ok?J({kind:"omitted"}):c}if(d.kind==="archetype")return Ap(d);if(d.kind==="model-type")return Ep(d);if(d.kind==="exact-model")return xp(d);return j("invalid_request",`Unsupported iOS hardware selector '${d.kind}'.`,{field:"hardware.kind"})}function kp(d){let c=se(d,["kind","archetype"]);if(!c.ok)return c;return d.archetype==="phone"||d.archetype==="tablet"||d.archetype==="foldable"?J({kind:"archetype",archetype:d.archetype}):j("invalid_request","Android hardware supports only phone, tablet or foldable.",{field:"hardware.archetype"})}function Op(d){let c=se(d,["kind","profileId"]);if(!c.ok)return c;let S=_a(d.profileId,"hardware.profileId");return S.ok?J({kind:"exact-profile",profileId:S.value}):S}function Mp(d){if(!ze(d)||typeof d.kind!=="string")return j("invalid_request","hardware must have an explicit selector kind.",{field:"hardware"});if(d.kind==="omitted"){let c=se(d,["kind"]);return c.ok?J({kind:"omitted"}):c}if(d.kind==="archetype")return kp(d);if(d.kind==="exact-profile")return Op(d);return j("invalid_request",`Unsupported Android hardware selector '${d.kind}'.`,{field:"hardware.kind"})}function qp(d){let c=se(d,["kind","major"]);if(!c.ok)return c;if(typeof d.major!=="number")return j("invalid_request","os.major must be a number.",{field:"os.major"});let S={kind:"major",major:d.major},D=lt(S);return D.ok?J(S):D}function Hp(d,c){let S=se(d,["kind","version"]);if(!S.ok)return S;if(typeof d.version!=="string")return j("invalid_request","os.version must be a string.",{field:"os.version"});let D={kind:c,version:d.version},C=lt(D);return C.ok?J(D):C}function Ra(d){if(!ze(d)||typeof d.kind!=="string")return j("invalid_request","os must have an explicit selector kind.",{field:"os"});if(d.kind==="omitted"){let c=se(d,["kind"]);return c.ok?J({kind:"omitted"}):c}if(d.kind==="major")return qp(d);if(d.kind==="exact"||d.kind==="minimum")return Hp(d,d.kind);return j("invalid_request",`Unsupported OS selector '${d.kind}'.`,{field:"os.kind"})}function Vp(d){let c=Tp(d.hardware);if(!c.ok)return c;let S=Ra(d.os);return S.ok?J({schemaVersion:1,platform:"ios",hardware:c.value,os:S.value}):S}function GG(d){return aN.includes(d)}function Wp(d){return by.includes(d)}function Gp(d){if(d===void 0)return J(void 0);if(!Array.isArray(d)||!d.every(Wp))return j("invalid_request",`deviceProfile.requires must list capabilities from: ${by.join(", ")}.`,{field:"deviceProfile.requires"});return J([...d])}function jp(d){if(d===void 0)return J(void 0);if(!ze(d))return j("invalid_request","deviceProfile must be an object.",{field:"deviceProfile"});let c=se(d,["manufacturerProfile","requires"]);if(!c.ok)return c;if(!GG(d.manufacturerProfile))return j("invalid_request",`deviceProfile.manufacturerProfile must be one of: ${aN.join(", ")}.`,{field:"deviceProfile.manufacturerProfile"});let S=Gp(d.requires);if(!S.ok)return S;return J({manufacturerProfile:d.manufacturerProfile,...S.value?{requires:S.value}:{}})}function Kp(d){let c=Mp(d.hardware);if(!c.ok)return c;let S=Ra(d.os);if(!S.ok)return S;let D=jp(d.deviceProfile);if(!D.ok)return D;return J({schemaVersion:1,platform:"android",hardware:c.value,os:S.value,...D.value?{deviceProfile:D.value}:{}})}function At(d){if(!ze(d))return j("invalid_request","Session device requirement must be an object.");let c=se(d,d.platform==="android"?["schemaVersion","platform","hardware","os","deviceProfile"]:d.platform==="watchos"?["schemaVersion","platform","spec"]:["schemaVersion","platform","hardware","os"]);if(!c.ok)return c;if(d.schemaVersion!==1)return j("invalid_request","schemaVersion must be 1.",{field:"schemaVersion"});if(d.platform==="ios")return Vp(d);if(d.platform==="android")return Kp(d);if(d.platform==="watchos")return Sa(d);return j("invalid_request","platform must be ios, android or watchos.",{field:"platform"})}function Ye(d,c){return j("invalid_config",d,c===void 0?{}:{field:c})}function Da(d){let c=lt(d.selector,"defaults.os.selector");if(!c.ok)return Ye(c.error.message,c.error.field);let S=Mo(d.preferredVersion,"defaults.os.preferredVersion");if(!S.ok)return Ye(S.error.message,S.error.field);if(!Te(c.value,S.value.value))return Ye(`Preferred OS release '${d.preferredVersion}' does not satisfy the configured default predicate.`,"defaults.os.preferredVersion");return J(c.value)}function Pa(d,c){return d.kind==="omitted"?J(c):lt(d)}function Ca(d,c,S){return{policyVersion:d.policyVersion,catalogSource:c.provenance.source,catalogRevision:c.provenance.revision,defaultsApplied:S}}function Jp(d,c){if(c.hardware.omitted!=="phone"&&c.hardware.omitted!=="tablet"&&c.hardware.omitted!=="duo")return Ye("The omitted iOS hardware default is invalid.","defaults.hardware.omitted");return J(d.hardware.kind==="omitted"?{kind:"archetype",archetype:c.hardware.omitted}:d.hardware)}function zp(d,c){return d.kind==="exact-model"?ti(d.model,c):J(void 0)}function Aa(d){let c=[];if(d.hardware.kind==="omitted")c.push("hardware-archetype");if(d.os.kind==="omitted")c.push("os-predicate");return c}function Xp(d,c,S){let D=Jp(d,c);if(!D.ok)return D;let C=Da(c.os);if(!C.ok)return C;let x=Pa(d.os,C.value);if(!x.ok)return x;let T=zp(D.value,S);if(!T.ok)return T;return J({platform:"ios",original:d,effective:{hardware:D.value,os:x.value},...T.value===void 0?{}:{exactModel:T.value},provenance:Ca(c,S,Aa(d))})}function Yp(d,c,S){if(c.hardware.omitted!=="phone"&&c.hardware.omitted!=="tablet"&&c.hardware.omitted!=="foldable")return Ye("The omitted Android hardware default must be phone, tablet or foldable.","defaults.hardware.omitted");let D=Da(c.os);if(!D.ok)return D;let C=d.hardware.kind==="omitted"?{kind:"archetype",archetype:c.hardware.omitted}:d.hardware,x=Pa(d.os,D.value);if(!x.ok)return x;let T=C.kind==="exact-profile"?ri(C.profileId,S):J(void 0);if(!T.ok)return T;return J({platform:"android",original:d,effective:{hardware:C,os:x.value},...T.value===void 0?{}:{exactProfile:T.value},provenance:Ca(c,S,Aa(d))})}function YG(d,c,S){let D=At(d);if(!D.ok)return D;if(D.value.platform==="watchos")return Ye("A watchOS requirement is not resolved through host defaults.");let C=da(D.value.platform,c,S);if(!C.ok)return C;if(D.value.platform==="ios"&&c.platform==="ios"&&S.platform==="ios")return Xp(D.value,c,S);if(D.value.platform==="android"&&c.platform==="android"&&S.platform==="android")return Yp(D.value,c,S);return Ye("Requirement context could not be narrowed to one platform.")}function Oe(d,c){return j("invalid_config",d,c===void 0?{}:{field:c})}function gn(d,c,S){let D=d.filter(c);if(D.length===0)return Oe(`Missing ${S}.`);if(D.length>1)return Oe(`Conflicting ${S} entries.`);return J(D[0])}function xa(d,c,S){let D=gn(c.hardware.modelTypes,(x)=>ln(x.modelType,d),`exact-model default for ${ct(d)}`);if(!D.ok)return D;let C=ti(D.value.model,S,"defaults.hardware.modelTypes.model");if(!C.ok)return Oe(C.error.message,C.error.field);if(!C.value.modelType||!ln(C.value.modelType,d))return Oe(`Configured model '${C.value.name}' does not belong to ${ct(d)}.`,"defaults.hardware.modelTypes");return J(C.value)}function Qp(d,c,S){let D=d.effective.hardware;if(D.kind==="exact-model")return d.exactModel?J({model:d.exactModel,by:"explicit-model",path:[]}):j("catalog_metadata_invalid","Normalized exact iOS model is missing.");if(D.kind==="model-type"){let T=xa(D.modelType,c,S);return T.ok?J({model:T.value,by:"model-type-default",path:[ct(D.modelType),T.value.simulatorDeviceTypeIdentifier]}):T}let C=gn(c.hardware.archetypes,(T)=>T.archetype===D.archetype,`model-type default for iOS ${D.archetype}`);if(!C.ok)return C;if(an(C.value.modelType)!==D.archetype)return Oe(`The ${D.archetype} default points to ${ct(C.value.modelType)}.`,"defaults.hardware.archetypes");let x=xa(C.value.modelType,c,S);return x.ok?J({model:x.value,by:"archetype-default",path:[D.archetype,ct(C.value.modelType),x.value.simulatorDeviceTypeIdentifier]}):x}function bH(d,c){let S=ni(d);if(S===void 0)return j("unsupported_hardware","The Android request has no classified archetype.");if(S==="foldable"&&!c.hardware.profiles.some((D)=>D.archetype===S))return j("unsupported_hardware","This host has no foldable profile mapped. Configure defaults.android.hardware.profiles with a foldable profileId and classify it in androidProfileArchetypes.");return gn(c.hardware.profiles,(D)=>D.archetype===S,`Android ${S} profile default`)}function Ta(d,c){let S=c.hardware.profiles.filter((C)=>C.profileId===d.profileId),D=S.length>0?S:c.hardware.profiles.filter((C)=>C.archetype===d.archetype);if(D.length>1)return Oe(`Conflicting Android ${d.archetype} profile default entries.`,"defaults.hardware.profiles");return J(D[0])}function UX(d,c){let S=d.exactProfile?Ta(d.exactProfile,c):bH(d,c);return S.ok?J(S.value?.memoryMb):S}function Zp(d,c,S){let D=ri(d.profileId,S);if(!D.ok)return D;let C=Ta(D.value,c);if(!C.ok)return C;return J({profile:D.value,by:"explicit-model",path:["exact-profile",D.value.profileId],...C.value?.memoryMb===void 0?{}:{memoryMb:C.value.memoryMb}})}function ef(d,c,S){if(d.exactProfile)return Zp(d.exactProfile,c,S);let D=bH(d,c);if(!D.ok)return D;let C=D.value.archetype,x=S.profiles.filter((B)=>B.profileId===D.value.profileId);if(x.length===0)return j("unsupported_hardware",`Configured Android ${C} profile '${D.value.profileId}' is not installed. Install it and configure defaults.android.hardware.profiles.`,{field:"defaults.hardware.profiles"});if(x.length>1)return j("catalog_metadata_invalid",`Android profile '${D.value.profileId}' is duplicated in the catalog.`);let T=x[0];if(T.metadataState!=="current"||!T.archetype)return j("catalog_metadata_invalid",`Android profile '${T.profileId}' lacks current archetype metadata.`);if(T.archetype!==C)return Oe(`Configured Android profile '${T.profileId}' is ${T.archetype}, not ${C}. Configure defaults.android.hardware.profiles with an installed ${C} profile and check androidProfileArchetypes.`,"defaults.hardware.profiles");return J({profile:{...T,archetype:C},by:"archetype-default",path:[C,T.profileId],...D.value.memoryMb===void 0?{}:{memoryMb:D.value.memoryMb}})}function tf(d){return d.filter((c)=>c.installed&&c.metadataState==="current"&&c.osVersion!==void 0&&Mo(c.osVersion).ok)}function nf(d){return d.filter((c)=>c.installed&&c.metadataState==="current"&&c.osVersion!==void 0&&c.apiLevel>0&&c.abi.length>0&&c.flavor.length>0&&Mo(c.osVersion).ok)}function Oa(d,c,S){return d.sort((D,C)=>Ke(c(C),c(D))||S(D).localeCompare(S(C)))}function of(d,c,S,D){let x=tf(S).filter((O)=>Te(d,O.osVersion));if(x.length===0)return Ma(d,S,"ios");if(d.kind!=="exact"){let O=hi(D.minOsVersion,D,"minimum"),N=hi(D.maxOsVersion,D,"maximum");if(O.ok&&N.ok){let H=x.filter((V)=>!Na(V.osVersion,O.value,N.value));if(H.length>0)x=H}}let T=Oa(x,(O)=>O.osVersion,(O)=>O.runtimeId);if(d.kind==="exact")return J({release:T[0],by:"exact"});let B=T.find((O)=>Ke(O.osVersion,c)===0);return J(B?{release:B,by:"preferred-default"}:{release:T[0],by:"highest-satisfying"})}function sf(d,c){let S=Mo(d);if(!S.ok)return!1;return c.some((D)=>{let C=Mo(D.osVersion);if(!C.ok||ai(D.versionPrecision)>=S.value.precision)return!1;let x=ai(D.versionPrecision);return S.value.components.slice(0,x).every((T,B)=>T===(C.value.components[B]??"0"))})}function af(d){return(c)=>{let S=d.indexOf(c.abi),D=S===-1?d.length:S,C=c.flavor==="google_apis"?"0":"1";return`${String(D).padStart(3,"0")}|${C}|${c.systemImagePackage}`}}function df(d,c){let S=d.kind==="major"?d.major:Mo(d.version),D=typeof S==="number"?S:S.ok?Number(S.value.components[0]):void 0,C=c.find((x)=>x.apiLevel===D&&Number(x.osVersion.split(".")[0])!==D);return C?j("missing_installed_runtime",`No installed runtime satisfies ${fn(d)}. Android os selectors use the release version (for example 16), not the API level; API level ${C.apiLevel} is Android ${C.osVersion}.`,{field:"os"}):void 0}function cf(d,c,S,D=[]){let C=nf(S),x=C.filter((O)=>di(d,O.osVersion,O.versionPrecision));if(x.length===0){if(d.kind==="exact"&&sf(d.version,C))return j("unsupported_version_precision",`Installed Android metadata cannot prove exact release '${d.version}'.`,{field:"os.version"});return df(d,C)??Ma(d,S,"android")}let T=Oa(x,(O)=>O.osVersion,af(D));if(d.kind==="exact")return J({release:T[0],by:"exact"});let B=T.find((O)=>Ke(O.osVersion,c)===0);return J(B?{release:B,by:"preferred-default"}:{release:T[0],by:"highest-satisfying"})}function fn(d){return d.kind==="major"?`major ${d.major}`:`${d.kind} ${d.version}`}function Ma(d,c,S){let D=c.some((x)=>x.installed&&(x.osVersion!==void 0||S==="ios")&&(x.osVersion===void 0||!Mo(x.osVersion).ok||x.metadataState!=="current"&&Te(d,x.osVersion))),C=c.filter((x)=>S==="android"&&x.installed&&x.osVersion===void 0).length;return D?j("catalog_metadata_invalid",`Installed release metadata is stale or incomplete for ${fn(d)}.`):j("missing_installed_runtime",`No installed runtime satisfies ${fn(d)}.${C>0?` ${C} installed system image(s) were skipped because their Android release is not recognized.`:""}`)}function hi(d,c,S){if(d===void 0||d===null)return J(void 0);let D=Mo(d);if(!D.ok)return j("catalog_metadata_invalid",`Model '${c.name}' has a malformed ${S} runtime version.`);return J(D.value.value)}function Na(d,c,S){if(c!==void 0&&Ke(d,c)<0)return!0;return S!==void 0&&Ke(d,S)>0}function lf(d,c){let S=hi(d.minOsVersion,d,"minimum");if(!S.ok)return S;let D=hi(d.maxOsVersion,d,"maximum");if(!D.ok)return D;if(Na(c,S.value,D.value))return j("runtime_incompatible",`Model '${d.name}' is incompatible with iOS ${c}; the exact pair was preserved.`);return J(S.value!==void 0||D.value!==void 0?"supported":"unknown")}function Fa(d,c,S,D){return{original:d.original,effective:d.effective,resolvedHardwareBy:c,resolvedOsBy:D,hardwareDefaultPath:S,policyVersion:d.provenance.policyVersion,catalogSource:d.provenance.catalogSource,catalogRevision:d.provenance.catalogRevision}}function uf(d,c,S){let D=Qp(d,c,S);if(!D.ok)return D;let C=of(d.effective.os,c.os.preferredVersion,S.releases,D.value.model);if(!C.ok)return C;let x=lf(D.value.model,C.value.release.osVersion);if(!x.ok)return x;let T=D.value.model;if(!T.archetype||!T.modelType)return j("catalog_metadata_invalid",`Model '${T.name}' lost classification.`);let B={platform:"ios",metadataState:"current",simulatorDeviceTypeIdentifier:T.simulatorDeviceTypeIdentifier,...T.modelIdentifier===void 0?{}:{modelIdentifier:T.modelIdentifier},archetype:T.archetype,modelType:T.modelType,runtimeId:C.value.release.runtimeId,osVersion:C.value.release.osVersion,compatibility:x.value};return J({platform:"ios",requirement:d,profile:B,provenance:Fa(d,D.value.by,D.value.path,C.value.by)})}function mf(d,c,S){let D=ef(d,c,S);if(!D.ok)return D;let C=cf(d.effective.os,c.os.preferredVersion,S.releases,S.hostAbis);if(!C.ok)return C;let x=C.value.release,T={platform:"android",metadataState:"current",profileId:D.value.profile.profileId,...D.value.memoryMb===void 0?{}:{memoryMb:D.value.memoryMb},archetype:D.value.profile.archetype,systemImagePackage:x.systemImagePackage,osVersion:x.osVersion,versionPrecision:x.versionPrecision,apiLevel:x.apiLevel,abi:x.abi,flavor:x.flavor};return J({platform:"android",requirement:d,profile:T,provenance:Fa(d,D.value.by,D.value.path,C.value.by)})}function JG(d,c,S){if(d.platform==="ios"&&c.platform==="ios"&&S.platform==="ios")return uf(d,c,S);if(d.platform==="android"&&c.platform==="android"&&S.platform==="android")return mf(d,c,S);return Oe("Normalized requirement, defaults, and catalog platforms differ.")}var mI={mode:"none",status:"device_ready"};function XG(d,c){if(c.sessionUuid.length===0)return!1;let{mode:S,status:D}=c.readiness;return d==="watchos"?S===mI.mode&&D===mI.status:S==="automation"&&D==="automation_ready"}function SH(d){return d==="watchos"?"a booted, session-bound state":"automation readiness"}async function HX(d,c,{fingerprint:S,signal:D,exportIdentity:C}){let x=c.device;if(x.platform!=="watchos")throw new t("Watch admission requires a watchOS session request");let T=await d.catalog("watchos",D);if(T.platform!=="watchos")throw new t("The session broker's watch catalog reader returned another platform");let B=Gb(mn(x,T));return{requestId:c.requestId,fingerprint:S,parameters:c,owner:d.owner,export:C,limits:d.limits,matches:(O)=>pn(B,oN(O)).kind==="match",resolveCreation:()=>({platform:"watchos",requirement:B,profile:B.profile})}}function La(d,c){return d&&c&&In(c).platform==="watchos"?{readiness:{...mI}}:{}}import{createHash as pf}from"crypto";var Eu="session_request_abandoned",vn="Session request was abandoned by its liveness owner",Ua=Object.freeze({internalReceipt:Eu});function fI(d,c){return pf("sha256").update(Cr({config:d,livenessOwnerToken:c})).digest("hex")}function qa(d){return{fingerprint:fI(Ua,d),parameters:Ua}}function ff(d,c){let S=d.errorCode??"session_preparation_failed",D=d.retryable&&(["eviction_pending","session_broker_stopping"].includes(S)||!c);return{code:S,message:d.error??"",retryable:D,...D&&S==="eviction_pending"?{retryAfterMs:1000}:{},...D&&S==="session_broker_stopping"?{retryAfterMs:Od}:{},...D&&["capacity_exhausted","cancelled","eviction_pending","session_broker_stopping"].includes(S)?{retryRequires:"new_request_id"}:{}}}function wH(d){if(d instanceof zr)return{code:d.code,message:d.message,retryable:d.retryable,remedy:d.remedy,writerVersions:d.writerVersions};return d instanceof ha?d.failure:{code:"session_preparation_failed",message:r(d),retryable:!1}}function ZG(d){return d.aborted&&d.reason instanceof Md}function qX(d,c){if(ZG(c))return new ha({code:"session_broker_stopping",retryable:!0,retryAfterMs:Od,retryRequires:"new_request_id",message:"Session preparation was interrupted because the session broker is stopping; retry with a new request ID against the restarted daemon."});if(d instanceof ha||!c.aborted)return d;return new ha({code:"cancelled",retryable:!0,message:`Session preparation was cancelled: ${r(c.reason)}`})}function RH(d,c){return{contractVersion:1,requestId:d.requestId,outcome:"failed",sessionUuid:null,profile:null,cleanupPending:!1,failure:c}}function Lp(d,c){return d.daemonId===c.daemonId&&d.pid===c.pid&&d.processGenerationToken===c.processGenerationToken}function VX(d,c,S){if(d instanceof pI)return e.warn(`Session ${c} clean release exhausted capacity wait: ${d.message}`),"destroy";if(d instanceof Nn)return e.warn(`Session ${c} clean release awaits boot capacity: ${r(d)}`),"pending";e.warn(`Session ${c} could not finish its clean release: ${r(d)}`);let D=Kb(d);if(D==="permanent"||!S&&D==="unknown")return"destroy";return"pending"}function WX(d,c,S){let D=c?.requestId===d.requestId&&["destroying","resetting","unknown"].includes(c.state),C=d.errorCode===Eu&&S,x=Boolean(D||C);return{contractVersion:1,requestId:d.requestId,outcome:d.state==="active"?"ready":d.state==="failed"?"failed":d.state==="released"?"released":"pending",sessionUuid:d.sessionId,profile:c?In(c):null,...La(d.state==="active",c),cleanupPending:x,...d.timing?{timing:d.timing}:{},...d.error?{failure:ff(d,x)}:{}}}function zX(d,c,S){return d.errorCode===Eu?c:{...c,failure:{...S,retryable:Boolean(c.failure?.retryable),...c.failure?.retryAfterMs!==void 0?{retryAfterMs:c.failure.retryAfterMs}:{},...c.failure?.retryRequires?{retryRequires:c.failure.retryRequires}:{}}}}async function Ha(d,c){return(await d.selectFrom("session_broker_requests").select(({fn:D})=>D.countAll().as("count")).where("state","!=","released").where("request_id","!=",c).where(({or:D,eb:C,exists:x,selectFrom:T})=>D([C("state","!=","failed"),x(T("session_broker_resources").select("resource_id").whereRef("session_broker_resources.resource_id","=","session_broker_requests.resource_id").whereRef("session_broker_resources.request_id","=","session_broker_requests.request_id").where("session_broker_resources.state","!=","destroyed"))])).executeTakeFirstOrThrow()).count}function hn(d){return d.filter((c)=>c.state!=="destroyed").map((c)=>({id:c.resourceId,state:c.state,idleOrder:c.idleOrder,compatible:!1}))}class wi extends t{reset;constructor(d,c,S){super(d,S);this.reset=c}}function gf(d,c,S,{kind:D,now:C,creationProfile:x}){if(D==="wait"||d.admission!=="wait"&&d.admission!=="reuse"&&(D!=="reuse"||d.admission!=="evict-then-create"))return{};let T={...d,admission:D==="evict"?"evict-then-create":D,reuseCount:D==="reuse"?S.reuseCount??0:0,admissionWaitMs:C-d.startedAtMs,totalMs:C-d.startedAtMs,...D==="reuse"?{createMs:0,bootMs:0}:{}};return{timing_json:JSON.stringify({...c.timing,acquisition:T}),timing_profile_json:JSON.stringify(In(D==="evict"?{profile:x}:S)),timing_updated_at_ms:C}}function bn(d,c,S,D){let{kind:C,now:x,creationProfile:T}=D;if(d.timingStartedAtMs===void 0)return{};let B=c.timing?.acquisition;if(B)return gf(B,c,S,D);let O={admission:C==="evict"?"evict-then-create":C,reuseCount:C==="reuse"?S.reuseCount??0:0,outcome:"pending",startedAtMs:d.timingStartedAtMs,queueMs:0,admissionWaitMs:x-d.timingStartedAtMs,totalMs:x-d.timingStartedAtMs,...C==="reuse"?{createMs:0,bootMs:0}:{}};return{timing_json:JSON.stringify({acquisition:O}),timing_profile_json:JSON.stringify(In(C==="evict"?{profile:T}:S)),timing_updated_at_ms:x}}function Wa(d,c,S,D){let C=d.timing?.acquisition;if(!C)return{};let x={...C,...S,...C.admission==="reuse"?{createMs:0,bootMs:0}:{},reuseCount:c.reuseCount??0,outcome:"ready",completedAtMs:D,totalMs:D-C.startedAtMs};return{timing_json:JSON.stringify({...d.timing,acquisition:x}),timing_profile_json:JSON.stringify(In(c)),timing_updated_at_ms:D}}class QG{store;timer;constructor(d,c){this.store=d;this.timer=c}async recordFailedAcquisition(d){try{let c=d.timing?.acquisition;if(!c||c.outcome!=="pending")return!0;let S={...c,outcome:"failed",completedAtMs:this.timer.now(),totalMs:this.timer.now()-c.startedAtMs};return await this.store.recordTiming(d.requestId,{acquisition:S}),d.timing={...d.timing,acquisition:S},e.info(`[SessionBroker] acquisition ${JSON.stringify({requestId:d.requestId,profile:d.timingProfile,...S})}`),!0}catch(c){return e.warn(`Could not record failed acquisition ${d.requestId}`,c),!1}}async recordRefusedAdmission(d){if(d.kind==="refused")await this.recordFailedAcquisition(d.request)}logReadyAcquisition(d,c){let S=d.timing?.acquisition;if(!S)return;e.info(`[SessionBroker] acquisition ${JSON.stringify({requestId:d.requestId,profile:In(c),...S})}`)}initialResetTiming(d,c){return{mode:"none",outcome:"pending",phases:{},reuseCount:c.reuseCount??0,startedAtMs:this.timer.now(),totalMs:0}}async recordResetTiming(d,c,S){try{if((await this.store.getResource(c.resourceId))?.state==="destroyed")S=yi(S,this.timer.now());if(S.totalMs=this.timer.now()-S.startedAtMs,S.outcome!=="pending")S.completedAtMs=this.timer.now();return await this.store.recordTiming(d.requestId,{reset:S},In(c)),e.info(`[SessionBroker] reset ${JSON.stringify({requestId:d.requestId,profile:In(c),...S})}`),!0}catch(D){return e.warn(`Could not record reset timing ${d.requestId}`,D),!1}}mergeResetTiming(d,c){return typeof c==="object"?{...d,...c,phases:{...d.phases,...c.phases}}:{...d,outcome:c}}failedResetTiming(d,c){return{...c instanceof wi?this.mergeResetTiming(d,c.reset):d,outcome:"pending",fallbackReason:r(c)}}}function yi(d,c){return{...d,outcome:"destroyed",retired:!0,completedAtMs:c,totalMs:c-d.startedAtMs}}var Se=A().finite().nonnegative(),bi=A().finite(),vf=f({acquisition:f({admission:P(["reuse","create","evict-then-create","wait"]),reuseCount:Se.int(),outcome:P(["pending","ready","failed"]),startedAtMs:bi,completedAtMs:bi.optional(),queueMs:Se,admissionWaitMs:Se,createMs:Se.optional(),bootMs:Se.optional(),automationReadyMs:Se.optional(),totalMs:Se}).optional(),reset:f({mode:P(["keep-booted","minimal","erase","snapshot","wipe-data","none"]),outcome:P(["clean","pending","destroyed","fallback:keep-booted","fallback:minimal","fallback:erase","fallback:snapshot","fallback:wipe-data"]),retired:Z().optional(),phases:kt(y(),Se),fallbackReason:y().optional(),reuseCount:Se.int(),startedAtMs:bi,completedAtMs:bi.optional(),totalMs:Se}).optional()}),hf=f({timing:vf,profile:sn.optional()});function Si(d,c){try{let S=hf.safeParse({timing:JSON.parse(d),...c?{profile:JSON.parse(c)}:{}});if(S.success)return S.data;e.warn("Ignoring invalid session broker timing receipt",S.error);return}catch(S){e.warn("Ignoring corrupt session broker timing JSON",S);return}}async function ve(d,c){let S=await d.selectFrom("session_broker_requests").selectAll().where("request_id","=",c).executeTakeFirst();return S&&_e(S)}async function Fe(d,c){let S=await d.selectFrom("session_broker_resources").selectAll().where("resource_id","=",c).executeTakeFirst();return S&&xt(S)}function _e(d){let c=d.timing_json?Si(d.timing_json,d.timing_profile_json):void 0,{restartHandoff:S,...D}=JSON.parse(d.owner_json);return{requestId:d.request_id,fingerprint:d.fingerprint,parameters:JSON.parse(d.parameters_json),owner:D,...S===!0?{restartHandoff:!0}:{},state:d.state,resourceId:d.resource_id,sessionId:d.session_id,error:d.error,errorCode:d.error_code,retryable:d.retryable===1,...c?{timing:c.timing,timingProfile:c.profile}:{}}}function xt(d){return{resourceId:d.resource_id,allocationIndex:d.allocation_index,scopeKey:d.scope_key,profile:JSON.parse(d.profile_json),state:d.state,requestId:d.request_id,revision:d.revision,idleOrder:d.idle_order,reuseCount:d.reuse_count}}class Di{db;clock;constructor(d,c){this.db=d;this.clock=c}async recordTiming(d,c,S){let D=async(C)=>{let x=await ve(C,d);if(!x)return;if(c.acquisition?.outcome==="failed"&&(x.state!=="failed"||x.timing?.acquisition?.outcome==="ready"))return;let T=await this.finalResetTiming(C,x,c.reset);await C.updateTable("session_broker_requests").set({timing_json:JSON.stringify({...x.timing,...c,...T?{reset:T}:{}}),...S?{timing_profile_json:JSON.stringify(S)}:{},timing_updated_at_ms:this.clock.now()}).where("request_id","=",d).execute()};await(this.db.isTransaction?D(this.db):this.db.transaction().execute(D))}async finalResetTiming(d,c,S){if(!S||!c.resourceId)return S;let D=await Fe(d,c.resourceId);return D?.requestId===c.requestId&&D.state==="destroyed"?yi(S,this.clock.now()):S}async timingSamples(d,c,S){return(await this.db.selectFrom("session_broker_requests").select(["timing_json","timing_profile_json"]).where("timing_updated_at_ms",">=",d).where("timing_updated_at_ms","<=",c).where("timing_json","is not",null).where("timing_profile_json","is not",null).orderBy("timing_updated_at_ms","desc").orderBy("request_id").limit(S).execute()).flatMap((C)=>{let x=Si(C.timing_json,C.timing_profile_json);return x?.profile?[{timing:x.timing,profile:x.profile}]:[]})}async confirmDestroyed(d,c){if(!c)return;let S=await ve(d,c);if(S?.timing?.reset&&S.timing.reset.outcome!=="destroyed")await d.updateTable("session_broker_requests").set({timing_json:JSON.stringify({...S.timing,reset:yi(S.timing.reset,this.clock.now())}),timing_updated_at_ms:this.clock.now()}).where("request_id","=",S.requestId).execute()}}function Ga(d){return d==="released"||d==="failed"}function Sn(d,c,S){return Boolean(d?.stable_device_id&&d.state==="ready"&&d.exec_session_uuid===c&&d.exec_owner_daemon_id===S.daemonId&&d.exec_owner_pid===S.pid&&d.exec_owner_process_token===(S.processGenerationToken??null))}function Rn(d){return{daemonId:d.daemonId,pid:d.pid,...d.processGenerationToken===void 0?{}:{processGenerationToken:d.processGenerationToken}}}function pe(d,c){if(d===void 0||d===null)throw new Ee(c);return d}var cN=15552000000;class Sy extends t{code="session_export_identity_mismatch";constructor(){super("Session export identity, digest, or liveness owner does not match the request")}}function Za(d){return{resourceId:d.resourceId,revision:d.revision}}function ja(d,c){return d.state==="idle"&&(!c||c.some((S)=>S.resourceId===d.resourceId&&S.revision===d.revision))}var Ka=["released","failed"];async function Dn(d,c){let S=await d.selectFrom("session_broker_exports").selectAll().where("prepare_id","=",c).executeTakeFirst();return S&&{prepareId:S.prepare_id,requestId:S.request_id,requestDigest:S.request_digest,createdAtMs:S.created_at_ms,acknowledgedAtMs:S.acknowledged_at_ms}}async function za(d,c,S){return await d.updateTable("session_broker_exports").set({acknowledged_at_ms:S}).where("prepare_id","=",c).where("acknowledged_at_ms","is",null).execute(),Dn(d,c)}async function Ya(d,c,S,{fingerprint:D,identity:C}){let x=async(T)=>{let B=await T.selectFrom("session_broker_requests").select("fingerprint").where("request_id","=",S).executeTakeFirst();if(!B||B.fingerprint!==D)throw new Sy;await ut(T,S,C,c)};await(d.isTransaction?x(d):d.transaction().execute(x))}async function ut(d,c,S,D){if(!S)return;let C=await d.selectFrom("session_broker_exports").selectAll().where((x)=>x.or([x("request_id","=",c),x("prepare_id","=",S.prepareId)])).execute();if(C.length>0){if(C.length!==1||C[0].request_id!==c||C[0].prepare_id!==S.prepareId||C[0].request_digest!==S.requestDigest)throw new Sy;return}await d.insertInto("session_broker_exports").values({prepare_id:S.prepareId,request_id:c,request_digest:S.requestDigest,created_at_ms:D,acknowledged_at_ms:null}).execute()}async function ed(d,c,S,{limit:D,exportRetentionMs:C=cN}){if(!Number.isFinite(S)||S<0||!Number.isFinite(C)||C<0||!Number.isInteger(D)||D<1)throw new t("Receipt retention needs a non-negative window and a positive limit");let x=async(T)=>{let B=c.now();await T.updateTable("session_broker_requests").set({terminal_at_ms:B}).where("state","in",Ka).where("terminal_at_ms","is",null).execute();let N=(await T.selectFrom("session_broker_requests").select("request_id").where("state","in",Ka).where("terminal_at_ms","<=",B-S).where(({not:H,exists:V,selectFrom:q})=>H(V(q("session_broker_exports").select("prepare_id").whereRef("session_broker_exports.request_id","=","session_broker_requests.request_id").where("acknowledged_at_ms","is",null).where("created_at_ms",">",B-C)))).where(({not:H,exists:V,selectFrom:q})=>H(V(q("session_broker_resources").select("session_broker_resources.resource_id").whereRef("session_broker_resources.request_id","=","session_broker_requests.request_id").where("session_broker_resources.state","!=","destroyed")))).orderBy("terminal_at_ms").orderBy("request_id").limit(D).execute()).map((H)=>H.request_id);if(N.length===0)return await Pi(T),0;return await T.updateTable("session_broker_resources").set({request_id:null}).where("request_id","in",N).execute(),await T.deleteFrom("session_broker_exports").where("request_id","in",N).execute(),await T.deleteFrom("session_broker_requests").where("request_id","in",N).execute(),await Pi(T),N.length};return d.isTransaction?x(d):d.transaction().execute(x)}async function Pi(d,c){await d.deleteFrom("session_broker_resources").where("state","=","destroyed").where("request_id","is",null).$if(c!==void 0,(S)=>S.where("resource_id","=",c)).where(({not:S,exists:D,selectFrom:C})=>S(D(C("session_broker_requests").select("request_id").whereRef("session_broker_requests.resource_id","=","session_broker_resources.resource_id")))).execute()}var Bp="session_owner_exited",PH="Session owner exited before relinquishing its device; cleanup remains owned by the broker",jX="No preparation budget remains";var yf=new Set(["reserved","active","idle","resetting","destroying","unknown"]);function Ci(d,c){if(!Number.isInteger(d)||d<0)throw TypeError(`${c} must be an integer greater than or equal to zero`)}function id(d){if(typeof d!=="object"||d===null)throw TypeError("limits must be an object");if(d.sessionCap!==void 0)Ci(d.sessionCap,"limits.sessionCap");if(d.totalDeviceCap!==void 0)Ci(d.totalDeviceCap,"limits.totalDeviceCap");if(d.idlePoolCap!==void 0)Ci(d.idlePoolCap,"limits.idlePoolCap");if(d.maxConcurrentResetBoots!==void 0&&(!Number.isSafeInteger(d.maxConcurrentResetBoots)||d.maxConcurrentResetBoots<1))throw TypeError("limits.maxConcurrentResetBoots must be a positive integer")}function wf(d,c){let S=`snapshot.resources[${c}]`;if(typeof d!=="object"||d===null)throw TypeError(`${S} must be an object`);if(typeof d.id!=="string"||d.id.trim().length===0)throw TypeError(`${S}.id must be a non-blank string`);if(!yf.has(d.state))throw TypeError(`${S}.state is invalid`);if(typeof d.idleOrder!=="number"||!Number.isFinite(d.idleOrder))throw TypeError(`${S}.idleOrder must be a finite number`);if(typeof d.compatible!=="boolean")throw TypeError(`${S}.compatible must be a boolean`);if(d.expectedReadyMs!==void 0&&(!Number.isFinite(d.expectedReadyMs)||d.expectedReadyMs<0))throw TypeError(`${S}.expectedReadyMs must be nonnegative and finite`)}function rd(d){if(typeof d!=="object"||d===null)throw TypeError("snapshot must be an object");if(Ci(d.activeOrAcquiringSessions,"snapshot.activeOrAcquiringSessions"),!Array.isArray(d.resources))throw TypeError("snapshot.resources must be an array");if(d.resetWaitThresholdMs!==void 0&&(!Number.isFinite(d.resetWaitThresholdMs)||d.resetWaitThresholdMs<0))throw TypeError("snapshot.resetWaitThresholdMs must be nonnegative and finite");let c=new Set;for(let S=0;S<d.resources.length;S+=1){let D=d.resources[S];if(wf(D,S),c.has(D.id))throw TypeError(`snapshot.resources contains duplicate id '${D.id}'`);c.add(D.id)}}function bf(d,c){return d.idleOrder-c.idleOrder||d.id.localeCompare(c.id)}function Pn(d){return d.resources.filter((c)=>c.state==="idle").sort(bf)}function td(d){return Pn(d)[0]}function Sf(d){return Pn(d).filter((c)=>c.compatible).sort((c,S)=>S.idleOrder-c.idleOrder||c.id.localeCompare(S.id))[0]}function Rf(d,c){return c.totalDeviceCap===0?void 0:Sf(d)}function nd(d,c){if(id(c),rd(d),c.sessionCap!==void 0&&d.activeOrAcquiringSessions>=c.sessionCap)return{kind:"refuse",reason:"session-cap-reached"};let S=Rf(d,c);if(S)return{kind:"reuse",resourceId:S.id};return Pf(d,c)??If(d,c)}function Pf(d,c){if(c.totalDeviceCap===0)return;let S=d.resources.filter((D)=>D.state==="resetting"&&D.compatible&&d.resetWaitThresholdMs!==void 0&&d.resetWaitThresholdMs>0&&D.expectedReadyMs!==void 0&&D.expectedReadyMs>0&&D.expectedReadyMs<=d.resetWaitThresholdMs).sort((D,C)=>D.expectedReadyMs-C.expectedReadyMs||D.id.localeCompare(C.id))[0];if(S&&d.resetWaitThresholdMs>0)return{kind:"wait",resourceId:S.id,waitMs:Math.min(S.expectedReadyMs,d.resetWaitThresholdMs)};return}function If(d,c){let S=d.resources.length;if(c.totalDeviceCap!==void 0&&S>c.totalDeviceCap){let C=td(d);return C?{kind:"evict",resourceId:C.id}:{kind:"refuse",reason:"total-device-cap-exceeded"}}if(c.totalDeviceCap===void 0||S<c.totalDeviceCap)return{kind:"create"};let D=td(d);return D?{kind:"evict",resourceId:D.id}:{kind:"refuse",reason:"total-device-cap-reached"}}function od(d,c){id(c),rd(d);let S=Pn(d),D=c.totalDeviceCap===void 0?0:Math.max(0,d.resources.length-c.totalDeviceCap),C=c.idlePoolCap===void 0?0:Math.max(0,S.length-c.idlePoolCap),x=Math.max(D,C);return S.slice(0,x).map((T)=>T.id)}class Cn{db;scopeKey;isOwnerLive;timingStore;ids;clock;write;constructor(d,c,S,{ids:D=L,clock:C=i,write:x=(T)=>T(d)}={}){this.db=d;this.scopeKey=c;this.isOwnerLive=S;this.ids=D,this.clock=C,this.write=x,this.timingStore=new Di(d,C)}async getRequest(d){return ve(this.db,d)}recordTiming(d,c,S){return this.write((D)=>new Di(D,this.clock).recordTiming(d,c,S))}timingSamples(d,c,S){return this.timingStore.timingSamples(d,c,S)}getExport(d){return Dn(this.db,d)}acknowledgeExport(d,c=this.clock.now()){return this.write((S)=>za(S,d,c))}linkRequestExport(d,c,S){return this.write((D)=>Ya(D,this.clock.now(),d,{fingerprint:c,identity:S}))}async getSession(d){let c=await this.db.selectFrom("session_broker_requests").selectAll().where("session_id","=",d).executeTakeFirst();return c&&_e(c)}async listResources(d){if(d!==void 0){let c=await Fe(this.db,d);return c?[c]:[]}return this.readResources(this.db)}async getResource(d){return(await this.listResources(d))[0]}listLiveResources(){return this.readResources(this.db,!0)}async listRequests(){return(await this.db.selectFrom("session_broker_requests").selectAll().execute()).map(_e)}async listRecoverableRequests(){return(await this.db.selectFrom("session_broker_requests").selectAll().where((c)=>c.or([c("state","in",["acquiring","active","releasing"]),c.and([c("state","=","failed"),c("error_code","=",Eu),c("session_id","is not",null),c.exists(c.selectFrom("session_broker_resources").select("session_broker_resources.resource_id").whereRef("session_broker_resources.resource_id","=","session_broker_requests.resource_id").where("session_broker_resources.state","!=","destroyed"))])])).execute()).map(_e)}pruneTerminalRequests(d,c,S){return this.write((D)=>ed(D,this.clock,d,{limit:c,exportRetentionMs:S}))}writeTransaction(d){return this.write((c)=>c.isTransaction?d(c):c.transaction().execute(d))}async recordPreAdmissionFailure(d,c){if(!d.requestId.trim()||!d.fingerprint.trim())throw new t("Session request identity and fingerprint must be non-empty");return this.writeTransaction(async(S)=>{let D=await ve(S,d.requestId);if(D){if(D.fingerprint!==d.fingerprint)throw new t("Session request identity was already used with different parameters");return await ut(S,d.requestId,d.export,this.clock.now()),D}let C=await S.insertInto("session_broker_requests").values({request_id:d.requestId,fingerprint:d.fingerprint,parameters_json:JSON.stringify(d.parameters),owner_json:JSON.stringify(d.owner),state:"failed",resource_id:null,session_id:null,error:c.message,error_code:c.code,retryable:c.retryable?1:0,terminal_at_ms:this.clock.now()}).returningAll().executeTakeFirstOrThrow();return await ut(S,d.requestId,d.export,this.clock.now()),_e(C)})}async admit(d){if(!d.requestId.trim()||!d.fingerprint.trim())throw new t("Session request identity and fingerprint must be non-empty");return this.writeTransaction(async(c)=>{let S=await ve(c,d.requestId);if(S){if(S.fingerprint!==d.fingerprint)throw new t("Session request identity was already used with different parameters");return await ut(c,d.requestId,d.export,this.clock.now()),{kind:"existing",request:S}}let D=await c.insertInto("session_broker_requests").values({request_id:d.requestId,fingerprint:d.fingerprint,parameters_json:JSON.stringify(d.parameters),owner_json:JSON.stringify(d.owner),state:"acquiring",resource_id:null,session_id:null,error:null,error_code:null,retryable:null,terminal_at_ms:null}).returningAll().executeTakeFirstOrThrow();return await ut(c,d.requestId,d.export,this.clock.now()),this.reserve(c,_e(D),d)})}async abandon(d,c,S){if(!d.trim()||!S)throw new t("Session request identity and liveness owner token are required");return this.writeTransaction(async(D)=>{let C=await ve(D,d);if(!C){let B=qa(S),O=await D.insertInto("session_broker_requests").values({request_id:d,fingerprint:B.fingerprint,parameters_json:JSON.stringify(B.parameters),owner_json:JSON.stringify(c),state:"failed",resource_id:null,session_id:null,error:vn,error_code:Eu,retryable:0,terminal_at_ms:this.clock.now()}).returningAll().executeTakeFirstOrThrow();return{request:_e(O)}}if(C.fingerprint!==fI(C.parameters,S))throw new t("Session request belongs to another liveness owner");if(C.state==="released"||C.state==="failed")return{request:C,...await this.currentDestructionTicket(D,C)};if(!Lp(C.owner,c))throw new jb(C.restartHandoff===!0);let x;if(C.resourceId){let B=await this.ownedResource(D,C);if(B.state!=="destroyed"){let O=B.state==="destroying"?B:await this.updateResource(D,B,{state:"destroying"});x=Za(O)}}return{request:await this.updateRequest(D,d,{state:"failed",error:vn,error_code:Eu,retryable:0}),...x?{ticket:x}:{}}})}async continueAdmission(d){return this.writeTransaction(async(c)=>{let S=await this.ownedRequest(c,d.requestId,d.owner);if(S.fingerprint!==d.fingerprint||S.state!=="acquiring")throw new t("Cannot continue a changed or terminal session request");if(S.resourceId===null)return this.reserve(c,S,d);let D=pe(await Fe(c,pe(S.resourceId,"No admission eviction to resume")),"Admission resource disappeared");if(D.state!=="destroyed"||D.requestId!==S.requestId)throw new t("Admission must wait for confirmed eviction before reserving another device");return this.reserve(c,S,d)})}async activate(d,c,S,D){if(!S.trim())throw new t("A prepared session must have a non-empty session UUID");return this.writeTransaction(async(C)=>{let x=await this.ownedRequest(C,d,c);if(x.state==="active"&&x.sessionId===S)return x;let T=await this.ownedResource(C,x);if(x.state!=="acquiring"||T.state!=="reserved")throw new t("Only the current acquiring request can activate a reservation");let B=await C.selectFrom("slot_assignments").selectAll().where("scope_key","=",T.scopeKey).where("slot_index","=",T.allocationIndex).executeTakeFirst();if(!Sn(B,S,c))throw new t("Prepared session does not own the current physical device binding");return await this.updateResource(C,T,{state:"active",...na(T,D?.profile)}),this.updateRequest(C,d,{state:"active",session_id:S,...Wa(x,T,D,this.clock.now())})})}async beginRelease(d,c){return this.writeTransaction(async(S)=>{let D=await S.selectFrom("session_broker_requests").selectAll().where("session_id","=",d).executeTakeFirst();if(!D)return;if(D.state==="released"||D.state==="failed")return _e(D);let C=await this.ownedRequest(S,D.request_id,c);if(C.state!=="active")return C;let x=await this.ownedResource(S,C);if(x.state!=="active")throw new t("Active session lost its resource ownership");return await this.updateResource(S,x,{state:"resetting"}),this.updateRequest(S,C.requestId,{state:"releasing"})})}async completeCleanRelease(d,c,S){return this.writeTransaction(async(D)=>{let C=await this.ownedRequest(D,d,c);if(C.state==="released")return[];let x=await this.ownedResource(D,C);if(C.state!=="releasing"||x.state!=="resetting")throw new Ee("Only a joined, resetting session can return a clean device");let T=await D.selectFrom("slot_assignments").selectAll().where("scope_key","=",x.scopeKey).where("slot_index","=",x.allocationIndex).executeTakeFirst(),B=await this.openJournal(D,x);if(!T?.stable_device_id||T.state!=="ready"||T.exec_session_uuid||B)throw new Ee("Physical device still has execution or journal work; it cannot enter the idle pool");let N=(await this.readResources(D,!0)).reduce((H,V)=>Math.max(H,V.idleOrder),0)+1;return await this.updateResource(D,x,{state:"idle",request_id:null,idle_order:N}),await this.updateRequest(D,d,{state:"released"}),this.trimIdle(D,S,x.resourceId,d)})}async fail(d,c,S,{errorCode:D="session_preparation_failed",retryable:C=!1}={}){return this.failWhere(d,c,{error:S,errorCode:D,retryable:C})}async failInterruptedAcquisition(d,c,S){return this.failWhere(d,c,{error:S,errorCode:"session_preparation_failed",retryable:!1,onlyFrom:"acquiring"})}async failWhere(d,c,S){let{error:D,errorCode:C,retryable:x,onlyFrom:T}=S;return this.writeTransaction(async(B)=>{let O=await this.ownedRequest(B,d,c);if(O.state==="released"||O.state==="failed"||T!==void 0&&O.state!==T)return;let N;if(O.resourceId){let H=await this.ownedResource(B,O);if(H.state!=="destroyed")N=Za(await this.updateResource(B,H,{state:"destroying"}))}return await this.updateRequest(B,d,{state:"failed",error:D,error_code:C,retryable:x?1:0}),N})}async releaseByDestruction(d,c){return this.writeTransaction(async(S)=>{let D=await this.ownedRequest(S,d,c);if(D.state==="released"||D.state==="failed")return;if(D.state!=="releasing")throw new t("Session must relinquish its execution before destruction");let C=await this.ownedResource(S,D);if(C.state==="destroying")return Za(C);return Za(await this.updateResource(S,C,{state:"destroying"}))})}async drainIdle(d){return this.writeTransaction(async(c)=>{let S=await this.readResources(c,!0),D=[];for(let C of S.filter((x)=>ja(x,d)))D.push(Za(await this.updateResource(c,C,{state:"destroying"})));return D})}async confirmDestroyed(d){return this.writeTransaction(async(c)=>{let S=await Fe(c,d.resourceId);if(!S||S.revision!==d.revision)return!1;if(S.state==="destroyed")return!0;if(S.state!=="destroying")return!1;if(await this.physicalWorkPending(c,S))return!1;if(await c.updateTable("session_broker_resources").set({state:"destroyed"}).where("resource_id","=",S.resourceId).execute(),S.requestId)await this.settleRequestAfterDestruction(c,S);else await Pi(c,S.resourceId);return await this.timingStore.confirmDestroyed(c,S.requestId),!0})}async recoverRequest(d,c){return this.writeTransaction(async(S)=>{let D=pe(await ve(S,d),"Unknown session request");if(Lp(D.owner,c)||this.isOwnerLive(D.owner))return;if(D.state==="released"||D.state==="failed")return;let C;if(D.resourceId){let x=await this.ownedResource(S,D);if(x.state!=="destroyed")C=Za(D.state==="releasing"&&x.state==="destroying"?x:await this.updateResource(S,x,{state:"destroying"}))}return await this.updateRequest(S,d,{owner_json:JSON.stringify(c),state:D.state==="releasing"?"releasing":"failed",error:D.state==="releasing"?null:PH,error_code:D.state==="releasing"?null:Bp}),C})}async relinquishForRestart(d,c){return this.writeTransaction(async(S)=>{let D=await this.ownedRequest(S,d,c);if(D.state!=="active"||D.restartHandoff)return D;return this.updateRequest(S,d,{owner_json:JSON.stringify({...Rn(D.owner),restartHandoff:!0})})})}async adoptRestartHandoff(d,c){return this.writeTransaction(async(S)=>{let D=pe(await ve(S,d),"Unknown session request");if(!D.restartHandoff||D.state!=="active"||!D.sessionId)return"not-handoff";if(Lp(D.owner,c))return"adopted";if(this.isOwnerLive(D.owner))return"pending";let C=await this.ownedResource(S,D),x=await S.selectFrom("slot_assignments").selectAll().where("scope_key","=",C.scopeKey).where("slot_index","=",C.allocationIndex).executeTakeFirst();if(C.state!=="active"||!Sn(x,D.sessionId,c))return"pending";return await this.updateRequest(S,d,{owner_json:JSON.stringify(Rn(c))}),"adopted"})}async settleRequestAfterDestruction(d,c){let S=await ve(d,pe(c.requestId,"No request"));if(S?.resourceId!==c.resourceId)return;if(S.state==="releasing")await this.updateRequest(d,S.requestId,{state:"released"});else if(S.state==="failed")await d.updateTable("session_broker_requests").set({terminal_at_ms:this.clock.now()}).where("request_id","=",S.requestId).execute()}async reserve(d,c,S){let D=await this.readResources(d,!0),C=await Ha(d,c.requestId),x=nd({activeOrAcquiringSessions:C,resetWaitThresholdMs:S.resetReadiness?.thresholdMs,resources:hn(D).map((O)=>({...O,compatible:(O.state==="idle"||O.state==="resetting")&&S.matches(pe(D.find((N)=>N.resourceId===O.id),"Missing resource").profile),expectedReadyMs:S.resetReadiness?.canWait?.(O.id)===!1?void 0:S.resetReadiness?.expectedReadyMs.get(O.id)}))},S.limits);if(x.kind==="wait"){S.resetReadiness?.reserveWait?.(c.requestId,x.resourceId);let O=pe(D.find((N)=>N.resourceId===x.resourceId),"Waiting resource disappeared");return{...x,request:await this.updateRequest(d,c.requestId,{...bn(S,c,O,{kind:"wait",now:this.clock.now()})})}}if(x.kind==="refuse")return{kind:"refused",reason:x.reason,request:await this.updateRequest(d,c.requestId,{state:"failed",error:x.reason,error_code:"capacity_exhausted",retryable:1})};let T,B=x.kind==="reuse"?void 0:S.resolveCreation();if(x.kind==="create"){let O=await d.insertInto("session_broker_resources").values({resource_id:this.ids.next(),scope_key:this.scopeKey,profile_json:JSON.stringify(B),state:"reserved",request_id:c.requestId,revision:1,idle_order:0}).returningAll().executeTakeFirstOrThrow();T=xt(O)}else{let O=pe(D.find((N)=>N.resourceId===x.resourceId),"Admission resource disappeared");T=await this.updateResource(d,O,{state:x.kind==="reuse"?"reserved":"destroying",request_id:c.requestId,reuse_count:(O.reuseCount??0)+(x.kind==="reuse"?1:0)})}return{kind:x.kind,resource:T,request:await this.updateRequest(d,c.requestId,{resource_id:T.resourceId,...bn(S,c,T,{kind:x.kind,now:this.clock.now(),creationProfile:B})})}}async trimIdle(d,c,S,D){let C=await this.readResources(d,!0),x=od({activeOrAcquiringSessions:0,resources:hn(C)},c),T=[];for(let B of x){let O=pe(C.find((H)=>H.resourceId===B),"Idle resource disappeared"),N=O.resourceId===S&&D?{state:"destroying",request_id:D}:{state:"destroying"};T.push(Za(await this.updateResource(d,O,N)))}return T}async currentDestructionTicket(d,c){if(!c.resourceId)return{};let S=await Fe(d,c.resourceId);return S?.requestId===c.requestId&&S.state==="destroying"?{ticket:Za(S)}:{}}async openJournal(d,c){return d.selectFrom("slot_journal").select("id").where("scope_key","=",c.scopeKey).where("slot_index","=",c.allocationIndex).where("phase","not in",["committed","rolled_back"]).executeTakeFirst()}async physicalWorkPending(d,c){let S=await d.selectFrom("slot_assignments").select(["stable_device_id","exec_session_uuid","state"]).where("scope_key","=",c.scopeKey).where("slot_index","=",c.allocationIndex).executeTakeFirst(),D=await this.openJournal(d,c);return Boolean(S?.stable_device_id||S?.exec_session_uuid||S?.state==="settling"||S?.state==="cleanup_pending"||D)}async readResources(d,c=!1){return(await d.selectFrom("session_broker_resources").selectAll().$if(c,(D)=>D.where("state","!=","destroyed")).orderBy("allocation_index").execute()).map(xt)}async ownedRequest(d,c,S){let D=pe(await ve(d,c),"Unknown session request");if(!Lp(D.owner,S))throw new jb(D.restartHandoff===!0);return D}async ownedResource(d,c){let S=pe(await Fe(d,pe(c.resourceId,"Request has no device reservation")),"Request resource disappeared");if(S.requestId!==c.requestId)throw new Ee("Session request no longer owns this device reservation");return S}async updateResource(d,c,S){let D=await d.updateTable("session_broker_resources").set({...S,revision:c.revision+1}).where("resource_id","=",c.resourceId).returningAll().executeTakeFirstOrThrow();return xt(D)}async updateRequest(d,c,S){let D=Ga(S.state)?{terminal_at_ms:this.clock.now()}:{},C=await d.updateTable("session_broker_requests").set({...S,...D}).where("request_id","=",c).returningAll().executeTakeFirstOrThrow();return _e(C)}}var Tt=Ko("state",[s({state:I("absent")}),s({state:I("present"),value:pp()}),s({state:I("unobservable")})]);function Ri(d){let c=Tt.safeParse({state:"present",value:d});return c.success?c.data:{state:"unobservable"}}function Ll(d,c){if([d.deviceId,d.incarnation,...c===void 0?[]:[c]].some((D)=>D.trim().length===0))throw new t("Device mutation journal requires a durable, non-empty identity")}var An=s({completeKinds:b(n().min(1)),observations:b(s({kind:n().min(1),key:n().min(1),value:Tt})),unobservable:b(n().min(1)),unobservableReasons:Me(n(),n()).optional()}),Jb=["installed-app","app-group","keychain","permission","device-setting","keep-awake","rotation","screen-reader","clipboard","location","status-bar","notification","media","contact","calendar","keyboard","clock","network-condition","biometric-enrollment","profile","certificate","opened-url","preference","shared-file","account"];var AH="fallback:";function _n(...d){return`${AH}${JSON.stringify(d)}`}function Xb(d){return d.kind==="opaque"&&d.key.startsWith(AH)}class En{db;timer;constructor(d,c){this.db=d;this.timer=c}async record(d,c){Ll(d,d.sessionUuid),await this.db.insertInto("device_mutation_journal").values({session_uuid:d.sessionUuid,device_id:d.deviceId,incarnation:d.incarnation,kind:c.kind,mutation_key:c.key,prior_value_json:JSON.stringify(Tt.parse(c.priorValue)),applied_at_ms:this.timer.now(),tool_name:c.toolName}).onConflict((S)=>S.columns(["session_uuid","device_id","incarnation","kind","mutation_key"]).doNothing()).execute()}list(d){return this.listIncarnations(d,"=")}listStrayIncarnations(d){return this.listIncarnations(d,"!=")}async listIncarnations(d,c){return Ll(d,d.sessionUuid),(await this.db.selectFrom("device_mutation_journal").selectAll().where("session_uuid","=",d.sessionUuid).where("device_id","=",d.deviceId).where("incarnation",c,d.incarnation).orderBy("sequence","asc").execute()).map((D)=>({sequence:D.sequence,kind:D.kind,key:D.mutation_key,priorValue:Tt.parse(JSON.parse(D.prior_value_json)),appliedAt:D.applied_at_ms,toolName:D.tool_name}))}async deleteSession(d){Ll(d,d.sessionUuid),await this.db.deleteFrom("device_mutation_journal").where("session_uuid","=",d.sessionUuid).where("device_id","=",d.deviceId).where("incarnation","=",d.incarnation).execute()}async captureBaseline(d,c){Ll(d),await this.db.insertInto("device_mutation_baselines").values({device_id:d.deviceId,incarnation:d.incarnation,baseline_json:JSON.stringify(An.parse(c)),captured_at_ms:this.timer.now()}).onConflict((S)=>S.columns(["device_id","incarnation"]).doNothing()).execute()}async getBaseline(d){Ll(d);let c=await this.db.selectFrom("device_mutation_baselines").select("baseline_json").where("device_id","=",d.deviceId).where("incarnation","=",d.incarnation).executeTakeFirst();return c?An.parse(JSON.parse(c.baseline_json)):null}async deleteResource(d){Ll({deviceId:d,incarnation:d});let c=m`incarnation = ${d} OR CASE WHEN json_valid(incarnation) THEN json_extract(incarnation, '$[0]') = ${d} ELSE 0 END`;await this.db.transaction().execute(async(S)=>{await S.deleteFrom("device_mutation_journal").where(c).execute(),await S.deleteFrom("device_mutation_baselines").where(c).execute()})}}class xn{db;constructor(d){this.db=d}async withLegacyRows(d){let c=await this.db.introspection.getTables();if(!c.some((q)=>q.name==="slot_free_devices"))return;let S=c.some((q)=>q.name==="slot_journal"),D=async(q)=>{let W=(await m`SELECT * FROM slot_scopes ORDER BY scope_key`.execute(q)).rows,G=(await m`SELECT * FROM slot_assignments WHERE role <> ${_f} ORDER BY scope_key, slot_index`.execute(q)).rows,ie=(await m`SELECT * FROM slot_free_devices ORDER BY platform, stable_device_id`.execute(q)).rows,re=S?(await m`SELECT * FROM slot_journal WHERE ${_t}
157
+ ORDER BY id`.execute(q)).rows:[],fe=(await m`
158
+ SELECT * FROM slot_assignments WHERE role = ${_f} ORDER BY scope_key, slot_index`.execute(q)).rows;return{scopes:W,assignments:G,free:ie,journals:re,brokerDevices:fe}},C=await D(this.db),{assignments:x,free:T,journals:B,brokerDevices:O}=C,N=[],H=[],V=(q,W,G)=>{if(W!==null&&W!==void 0)H.push({daemonId:q??"legacy",pid:W,processGenerationToken:G??null})};for(let q of x){if(q.stable_device_id!==null||q.device_name!==null)N.push({platform:q.platform,stableId:q.stable_device_id,name:q.device_name});V(q.exec_owner_daemon_id,q.exec_owner_pid,q.exec_owner_process_token),V(q.settler_daemon_id,q.settler_pid,q.settler_process_token)}for(let q of T)N.push({platform:q.platform,stableId:q.stable_device_id,name:null}),V(q.deletion_owner_daemon_id,q.deletion_owner_pid,q.deletion_owner_process_token);for(let q of B.filter((W)=>!["committed","rolled_back"].includes(W.phase))){V(q.owner_daemon_id,q.owner_pid,q.owner_process_token);let W=at(q.target_json);for(let G of[{platform:q.platform,stableId:q.binding_stable_device_id,name:W.oldName},{platform:q.platform,stableId:W.oldStableId,name:W.oldName},{platform:W.newPlatform??q.platform,stableId:W.newStableId,name:W.newName}])if(G.stableId||G.name)N.push(G)}if(N.some((q)=>O.some((W)=>Af(q,W))))throw new t("Legacy retirement overlaps a broker device; reconcile the duplicate legacy row before retrying");await d({devices:N,owners:H},async()=>{await this.db.transaction().execute(async(q)=>{if(JSON.stringify(await D(q))!==JSON.stringify(C))throw new t("Legacy registry rows changed during retirement; retry daemon startup");await m`DELETE FROM slot_free_devices`.execute(q),await Qt(q,{hasJournal:S,hasBrokerResources:c.some((W)=>W.name==="session_broker_resources")})})})}}function Af(d,c){if(d.platform!==c.platform)return!1;if(d.stableId)return d.stableId===c.stable_device_id;return d.name!==null&&d.name===c.device_name}async function sd(d,c,S){if(S.migrate===!1)await zs(d,c);else await Xs(d,c,()=>S.legacyDeviceRetirement?.retire(new xn(d))??Promise.resolve(),{writerVersion:S.writerVersion??kn()})}function Ef(d=process.platform){return{isRunning:(c)=>nt(c),readGenerationToken:(c)=>{if(d==="linux")return wg(c);if(d==="darwin")return Rg(c);return}}}function e6(d=Ef()){return(c)=>{if(!d.isRunning(c.pid))return!1;let S=c.processGenerationToken;if(!S)return!0;let D=d.readGenerationToken(c.pid);if(D===void 0)return!0;return Ba(S,D)!=="different"}}var Qa=e6();class ad{ids=new Set;add(d){this.ids.add(d)}delete(d){this.ids.delete(d)}has(d){return this.ids.has(d)}}var dN=new ad;function TH(d,c,S={}){let D=(S.thisProcess??{pid:process.pid}).pid,C=S.reservations??dN;return(x)=>{let T="sessionUuid"in x&&typeof x.sessionUuid==="string"?x.sessionUuid:null;if(T!==null&&C.has(T))return!0;if(T!==null&&x.pid===D)return c.isLiveManagedExecutionSession(T)||(c.hasSession?.(T)??!1);return d(x)||T!==null&&c.isLiveManagedExecutionSession(T)}}function kH(d=Gm,c=process.pid){return{pid:c,processGenerationToken:d()??null}}function dd(d){let{Database:c}=vt("bun:sqlite");class S extends c{exec(D){if(D==="PRAGMA optimize;"||D==="PRAGMA wal_checkpoint(TRUNCATE);")return;super.exec(D)}}return new S(d)}class Tn extends kk{get supportsTransactionalDdl(){return!0}}class Bn extends FD{createAdapter(){return new Tn}}function ld({db:d,sqlite:c,dbPath:S}){return(D)=>{if(c)return d.transaction().execute((C)=>{let x=c.prepare("SELECT name FROM kysely_migration ORDER BY name");try{let T=x.all().map((B)=>{if(typeof B!=="object"||B===null||!("name"in B)||typeof B.name!=="string")throw Error("Invalid binding registry migration name");return B.name}).filter((B)=>!Object.hasOwn(Rt,B));if(T.length>0)throw new zr(S,T,js(C,c,T))}finally{x.finalize()}return D(C)});return d.transaction().execute(async(C)=>(await Dt(C,S),D(C)))}}var $f="registry",Uf="slots.sqlite";function Zb(d=process.env,c){return kf(bu(Ts,$f,d,c),Uf)}function xf(d=Zb()){return Tf(d)}var t6=Math.min(250,KB);function qf(d){let c=dd(d);try{c.exec(`PRAGMA busy_timeout = ${t6};`),c.exec("PRAGMA journal_mode = WAL;"),c.exec("PRAGMA synchronous = FULL;"),c.exec("PRAGMA foreign_keys = ON;")}catch(S){throw c.close(),S}return c}async function Qb(d={}){let c=d.dbPath??Zb();if(!Ik(c))Va(Bf(c));let S,D=new Rc({dialect:new Bn({database:()=>S=qf(c),retry:{maxAttempts:1}})});try{await sd(D,c,d)}catch(C){if(await D.destroy(),$a(C)==="retryable")throw new Jo(r(C));throw C}return new ud(D,d,c,S)}class ud{db;dbPath;timer;isExecOwnerLive;claims;writeTransaction;constructor(d,c={},S=":memory:",D){this.db=d;this.dbPath=S;this.timer=c.timer??i,this.isExecOwnerLive=c.isExecOwnerLive??Qa,this.writeTransaction=ld({db:d,sqlite:D,dbPath:S}),this.claims=new en(this.db,(C)=>this.writeTransaction(C))}assertSupportedSchema(){return Dt(this.db,this.dbPath)}describeSchema(){return Js(this.db)}sessionBrokerStore(d,c){return new Cn(this.db,d,this.isExecOwnerLive,{ids:c,clock:this.timer,write:(S)=>this.writeTransaction(S)})}avdSnapshotCleanupRegistry(){return new Zr(this.db)}deviceMutationJournal(){return new En(this.db,this.timer)}deviceClaims(){return this.claims}async ensureScope(d){let c=Cd(d);return this.writeTransaction(async(S)=>{let D=this.timer.now(),C=await this.readScope(S,c);if(C?.state==="valid")return await S.updateTable("slot_scopes").set({last_acquired_at_ms:D}).where("scope_key","=",c).execute(),{kind:"ready",scope:{...C,lastAcquiredAtMs:D},created:!1,revived:!1};if(C&&C.invalidationReason!=="abandoned")return{kind:"scope_invalidated",scope:C};let x=await S.selectFrom("slot_scopes").selectAll().where("managed_host_scope","=",d.managedHostScope).where("runner_namespace","=",d.runnerNamespace).where("state","<>","invalidated").where("scope_key","<>",c).executeTakeFirst();if(x)return{kind:"incarnation_conflict",current:Ct(x)};if(C){let B=await S.updateTable("slot_scopes").set({state:"valid",invalidation_reason:null,invalidating_at_ms:null,invalidated_at_ms:null,last_acquired_at_ms:D}).where("scope_key","=",c).returningAll().executeTakeFirstOrThrow();return{kind:"ready",scope:Ct(B),created:!1,revived:!0}}let T={scope_key:c,managed_host_scope:d.managedHostScope,runner_namespace:d.runnerNamespace,runner_incarnation:d.runnerIncarnation,state:"valid",invalidation_reason:null,created_at_ms:D,last_acquired_at_ms:D,last_released_at_ms:null,invalidating_at_ms:null,invalidated_at_ms:null};return await S.insertInto("slot_scopes").values(T).execute(),{kind:"ready",scope:Ct(T),created:!0,revived:!1}})}async getScope(d){return this.readScope(this.db,d)}async initBinding(d,c){Pe(d);let S=dt(c.requestedSpec);return this.writeTransaction(async(D)=>{let C=await this.readScope(D,d.scopeKey);if(C?.state!=="valid")return{kind:"scope_not_valid",scope:C};let x=await this.readAssignment(D,d);if(x)return{kind:"ready",assignment:x,created:!1};let T={scope_key:d.scopeKey,slot_index:d.bindingIndex,role:c.role,platform:c.platform,generation:0,stable_device_id:null,device_name:null,requested_spec_json:S,resolved_spec_json:null,spec_fingerprint:null,state:"provisioning",exec_owner_daemon_id:null,exec_owner_pid:null,exec_owner_process_token:null,exec_session_uuid:null,...It(null),updated_at_ms:this.timer.now()};return await D.insertInto("slot_assignments").values(T).execute(),{kind:"ready",assignment:ue(T),created:!0}})}async removeUnboundBinding(d,c){return Pe(d),this.writeTransaction(async(S)=>{if(await this.readOpenJournal(S,d))return!1;return(await S.deleteFrom("slot_assignments").where("scope_key","=",d.scopeKey).where("slot_index","=",d.bindingIndex).where("generation","=",c.generation).where("stable_device_id","is",null).where("state","=","provisioning").where("exec_owner_daemon_id","is",null).where("exec_owner_pid","is",null).where("exec_owner_process_token","is",null).where("exec_session_uuid","is",null).executeTakeFirst()).numDeletedRows>0n})}async commitBinding(d,c,S){return Pe(d),this.writeTransaction((D)=>this.commitBindingIn(D,d,c,{next:S}))}async commitBindingIn(d,c,S,{next:D,journaled:C=!1}){let x=D.resolvedSpec===null||D.resolvedSpec===void 0?null:dt(D.resolvedSpec),T=D.requestedSpec===void 0?void 0:dt(D.requestedSpec),B=await this.checkBinding(d,c,S,{journaled:C});if("kind"in B)return B;let O=Fs(B,D);if(D.stableDeviceId!==null){let V=await d.selectFrom("slot_assignments").selectAll().where("platform","=",O).where("stable_device_id","=",D.stableDeviceId).where((q)=>q.or([q("scope_key","<>",c.scopeKey),q("slot_index","<>",c.bindingIndex)])).executeTakeFirst();if(V)return{kind:"device_assigned_elsewhere",holder:ue(V)}}let N=D.stableDeviceId!==B.stableDeviceId||O!==B.platform,H=await d.updateTable("slot_assignments").set({generation:B.generation+1,platform:O,stable_device_id:D.stableDeviceId,device_name:D.deviceName,resolved_spec_json:x,spec_fingerprint:D.specFingerprint,state:D.state,...It(null),...T===void 0?{}:{requested_spec_json:T},...N?{exec_owner_daemon_id:null,exec_owner_pid:null,exec_owner_process_token:null,exec_session_uuid:null}:{},updated_at_ms:this.timer.now()}).where("scope_key","=",c.scopeKey).where("slot_index","=",c.bindingIndex).returningAll().executeTakeFirstOrThrow();return{kind:"committed",assignment:ue(H)}}async updateBindingState(d,c,S,D){Pe(d);let C=xr(S,D);return this.writeTransaction((x)=>this.updateBindingStateIn(x,d,c,{state:S,settler:C}))}async updateBindingStateIn(d,c,S,{state:D,settler:C,journaled:x=!1}){let T=await this.checkBinding(d,c,S,{journaled:x});if("kind"in T)return T;let B=T.execOwner;if(D==="replacing"&&B&&this.isExecOwnerLive(B))return{kind:"binding_in_use",owner:B,assignment:T};let O=Bs(T.state,D)?T.generation+1:T.generation,N=await d.updateTable("slot_assignments").set({state:D,generation:O,...It(C),updated_at_ms:this.timer.now()}).where("scope_key","=",c.scopeKey).where("slot_index","=",c.bindingIndex).returningAll().executeTakeFirstOrThrow();return{kind:"updated",assignment:ue(N)}}async claimExecution(d,c,S,D={}){return Pe(d),this.writeTransaction(async(C)=>{let x=await this.checkBinding(C,d,c,{journaled:!1,claimingSessionUuid:S.sessionUuid});if("kind"in x)return x;if(x.state!=="ready"||x.stableDeviceId===null)return{kind:"binding_not_ready",assignment:x};let T=x.execOwner;if(T&&T.sessionUuid!==S.sessionUuid&&T.sessionUuid!==D.supersedesSessionUuid&&this.isExecOwnerLive(T))return{kind:"binding_in_use",owner:T,assignment:x};let B=await C.updateTable("slot_assignments").set({exec_owner_daemon_id:S.daemonId,exec_owner_pid:S.pid,exec_owner_process_token:S.processGenerationToken??null,exec_session_uuid:S.sessionUuid,updated_at_ms:this.timer.now()}).where("scope_key","=",d.scopeKey).where("slot_index","=",d.bindingIndex).returningAll().executeTakeFirstOrThrow();return{kind:"claimed",assignment:ue(B)}})}async releaseExecution(d,c){return Pe(d),this.writeTransaction(async(S)=>{let D=await S.updateTable("slot_assignments").set({exec_owner_daemon_id:null,exec_owner_pid:null,exec_owner_process_token:null,exec_session_uuid:null,updated_at_ms:this.timer.now()}).where("scope_key","=",d.scopeKey).where("slot_index","=",d.bindingIndex).where("exec_session_uuid","=",c).returningAll().executeTakeFirst();if(D)return await S.updateTable("slot_scopes").set({last_released_at_ms:D.updated_at_ms}).where("scope_key","=",d.scopeKey).execute(),{released:!0,assignment:ue(D)};return{released:!1,assignment:await this.readAssignment(S,d)}})}async recoverSettledBindings(d){return this.writeTransaction(async(c)=>{let S=c.selectFrom("slot_assignments").selectAll().where("state","=","settling");if(d!==void 0)S=S.where("scope_key","=",d);let D=(await S.orderBy("scope_key").orderBy("slot_index").execute()).map(ue).filter((x)=>this.isSettled(x)),C=[];for(let x of D){let T=await c.updateTable("slot_assignments").set({state:"ready",...It(null),updated_at_ms:this.timer.now()}).where("scope_key","=",x.scopeKey).where("slot_index","=",x.bindingIndex).where("generation","=",x.generation).where("state","=","settling").returningAll().executeTakeFirstOrThrow();C.push(ue(T))}return C})}async getAssignment(d){return Pe(d),this.readAssignment(this.db,d)}async listAssignments(d){return(await this.db.selectFrom("slot_assignments").selectAll().where("scope_key","=",d).orderBy("slot_index").execute()).map(ue)}async findExecutionAssignments(d){return(await this.db.selectFrom("slot_assignments").selectAll().where("exec_session_uuid","=",d).orderBy("scope_key").orderBy("slot_index").execute()).map(ue)}async findDeviceHolder(d,c){let S=await this.db.selectFrom("slot_assignments").selectAll().where("platform","=",d).where("stable_device_id","=",c).executeTakeFirst();if(S){let D=await this.readScope(this.db,S.scope_key);if(D)return{kind:"binding",scope:D,assignment:ue(S)}}return null}async isDeviceAssignedToValidBinding(d,c){return await this.db.selectFrom("slot_assignments").innerJoin("slot_scopes","slot_scopes.scope_key","slot_assignments.scope_key").select("slot_assignments.slot_index").where("slot_assignments.platform","=",d).where("slot_assignments.stable_device_id","=",c).where("slot_scopes.state","=","valid").executeTakeFirst()!==void 0}async snapshotManagedDevices(){return(await this.snapshotResources()).managed}async snapshotBindingResources(){return this.snapshotResources()}async snapshotResources(){let d=this.db.selectFrom("slot_assignments").innerJoin("slot_scopes","slot_scopes.scope_key","slot_assignments.scope_key").select(["slot_assignments.platform as platform","slot_assignments.stable_device_id as stable_device_id","slot_assignments.scope_key as scope_key","slot_assignments.slot_index as slot_index","slot_assignments.exec_session_uuid as exec_session_uuid","slot_scopes.state as scope_state"]).where("slot_assignments.stable_device_id","is not",null).where((T)=>T.or([T("slot_scopes.state","<>","invalidated"),T("slot_scopes.invalidation_reason","=","abandoned")])),c=await this.db.selectNoFrom([on(d).$castTo().as("assigned"),on(this.db.selectFrom("slot_journal").select(["id","scope_key","slot_index","kind","phase","platform","from_generation","to_generation","binding_generation","binding_stable_device_id","target_json","owner_daemon_id","owner_pid","owner_process_token","attempts","last_error","next_attempt_at_ms","created_at_ms","updated_at_ms"]).where("phase","not in",st)).$castTo().as("pending")]).executeTakeFirstOrThrow(),S=JSON.parse(c.assigned),C=JSON.parse(c.pending).map(be),x=[...S.flatMap((T)=>T.stable_device_id===null?[]:[{platform:T.platform,stableDeviceId:T.stable_device_id,holder:"session_broker",scopeKey:T.scope_key,bindingIndex:T.slot_index,scopeState:T.scope_state,execSessionUuid:T.exec_session_uuid}])];return{managed:[...x,...Os(C,x)],openJournal:C}}async openBindingJournal(d,c){Pe(d),ea(c.phase);let S=dt(c.target);return this.writeTransaction(async(D)=>{let C=this.timer.now();await D.deleteFrom("slot_journal").where("phase","in",[...st]).where("updated_at_ms","<",C-ks).execute();let x=await this.readOpenJournal(D,d);if(x)return{kind:"journal_open",entry:x};let T=await this.applyJournalAssignmentChange(D,d,c.assignment);if("kind"in T)return T;let B=await D.insertInto("slot_journal").values({scope_key:d.scopeKey,slot_index:d.bindingIndex,kind:c.kind,phase:c.phase,platform:T.platform,from_generation:c.assignment.expected.generation,to_generation:T.generation===c.assignment.expected.generation?null:T.generation,binding_generation:T.generation,binding_stable_device_id:T.stableDeviceId,target_json:S,owner_daemon_id:c.owner.daemonId,owner_pid:c.owner.pid,owner_process_token:c.owner.processGenerationToken??null,attempts:0,last_error:null,next_attempt_at_ms:C,created_at_ms:C,updated_at_ms:C}).returningAll().executeTakeFirstOrThrow();return{kind:"opened",entry:be(B),assignment:T}})}async advanceBindingJournal(d,c){return this.writeTransaction(async(S)=>{let D=await S.selectFrom("slot_journal").selectAll().where("id","=",d).executeTakeFirst(),C=D?be(D):null;if(!C||!HP(C.phase)||C.phase!==c.expectedPhase||!Ec(C.owner,c.owner))return{kind:"journal_conflict",entry:C};let x=null;if(c.assignment){if(!Dd(C.binding,c.assignment.expected))return{kind:"journal_conflict",entry:C};let B=await this.applyJournalAssignmentChange(S,C,c.assignment);if("kind"in B)return B;x=B}let T=await S.updateTable("slot_journal").set(Zs(C,c,x,this.timer.now())).where("id","=",d).returningAll().executeTakeFirstOrThrow();return{kind:"advanced",entry:be(T),assignment:x}})}async claimBindingJournal(d,c,S){return this.writeTransaction(async(D)=>{let C=await D.selectFrom("slot_journal").selectAll().where("id","=",d).executeTakeFirst(),x=C?be(C):null;if(!x||!HP(x.phase)||!Ec(x.owner,c))return{kind:"journal_conflict",entry:x};let T=await D.updateTable("slot_journal").set({owner_daemon_id:S.daemonId,owner_pid:S.pid,owner_process_token:S.processGenerationToken??null,updated_at_ms:this.timer.now()}).where("id","=",d).returningAll().executeTakeFirstOrThrow();return{kind:"claimed",entry:be(T)}})}async getBindingJournal(d){let c=await this.db.selectFrom("slot_journal").selectAll().where("id","=",d).executeTakeFirst();return c?be(c):null}async listOpenBindingJournal(d){let c=this.db.selectFrom("slot_journal").selectAll().where("phase","not in",[...st]);if(d)c=c.where("scope_key","=",d.scopeKey).where("slot_index","=",d.bindingIndex);return(await c.orderBy("next_attempt_at_ms").orderBy("id").execute()).map(be)}async close(){await this.db.destroy()}async readOpenJournal(d,c){let S=await d.selectFrom("slot_journal").selectAll().where("scope_key","=",c.scopeKey).where("slot_index","=",c.bindingIndex).where("phase","not in",[...st]).executeTakeFirst();return S?be(S):null}async applyJournalAssignmentChange(d,c,S){let D=S.kind==="commit"?await this.commitBindingIn(d,c,S.expected,{next:S.next,journaled:!0}):await this.updateBindingStateIn(d,c,S.expected,{state:S.state,settler:xr(S.state,S.options),journaled:!0});return D.kind==="committed"||D.kind==="updated"?D.assignment:D}async readScope(d,c){let S=await d.selectFrom("slot_scopes").selectAll().where("scope_key","=",c).executeTakeFirst();return S?Ct(S):null}async readAssignment(d,c){let S=await d.selectFrom("slot_assignments").selectAll().where("scope_key","=",c.scopeKey).where("slot_index","=",c.bindingIndex).executeTakeFirst();return S?ue(S):null}async checkBinding(d,c,S,{journaled:D=!1,claimingSessionUuid:C}={}){let x=await this.readScope(d,c.scopeKey),T=await this.readAssignment(d,c);if(!Ms(x,D)&&!(C!==void 0&&Ns(x,T,C)))return{kind:"scope_not_valid",scope:x};if(!T)return{kind:"binding_missing"};if(!gH(T,S))return{kind:"stale_binding",current:T};return T}async hasLiveExecOwner(d,c){return(await d.selectFrom("slot_assignments").selectAll().where("scope_key","=",c).where((D)=>D.or([D("exec_session_uuid","is not",null),D("state","=","settling")])).execute()).some((D)=>!this.isSettled(ue(D)))}isSettled(d){let{settler:c,execOwner:S}=d;return(c===null||!this.isExecOwnerLive(c))&&(S===null||!this.isExecOwnerLive(S))}}var Mn=new Hf;function lN(d,c){return Mn.run({scopeKey:d.scopeKey,bindingIndex:d.bindingIndex},c)}function qP(){return Mn.getStore()}function Vf(d){let c=Mn.getStore();if(!c)return!1;return d.scopeKey===c.scopeKey&&d.bindingIndex===c.bindingIndex}function KX(d,c){let S=d?.holderOf(c.device);if(!S)return;if(S.holder==="session_broker"&&S.execSessionUuid!==null&&c.requesterSessionUuid===S.execSessionUuid)return;if(Vf(S))return;return new li(c.action,c.deviceId,S)}function md(d,c){return JSON.stringify([d,c])}var pd=new Set,On=new WeakMap;async function Nd(d,c={}){try{await d.refresh({...c,requireCurrent:!0})}catch(S){if(!(S instanceof zr))throw S;e.debug(`[Bindings] Allocation using claim files: ${r(S)}`),await d.refresh(c)}}class gd{openRegistry;timer;registryExists;snapshot;readFailed=!1;inFlight;registry;warnedUpgradePending=!1;unsupportedSchema;constructor(d,c,S=()=>!0){this.openRegistry=d;this.timer=c;this.registryExists=S}async refresh(d={}){if(this.unsupportedSchema&&(d.requireCurrent||d.refuseUpgradePending))throw this.unsupportedSchema;if(d.fresh||!this.snapshotIsYoung(d.maxAgeMs??0))await this.reload(d);if(d.refuseUpgradePending&&this.snapshot?.kind==="absent"&&this.snapshot.upgradePending)throw new Jo("registry upgrade pending")}async reload(d){try{await(d.fresh?this.refreshFresh():this.loadShared())}catch(c){if(c instanceof zr){if(d.requireCurrent||d.refuseUpgradePending)throw c;let S={code:c.code,retryable:c.retryable,mode:"files_only",dbPath:c.dbPath,unknownMigrations:c.unknownMigrations,writerVersions:c.writerVersions,remedy:c.remedy};if(this.snapshot={kind:"files_only",loadedAtMs:this.timer.now(),diagnostic:S},this.readFailed=!1,!pd.has(c.dbPath))pd.add(c.dbPath),e.warn(`[Bindings] Registry at ${c.dbPath} has migrations unknown to this daemon: ${c.unknownMigrations.join(", ")}. Bindings and device_claims rows are not consulted or written; allocation claim files decide ownership. Managed bindings are not enforced in this mode, so this daemon can allocate a device held only by a managed binding. ${c.remedy}`);return}if(d.requireCurrent||this.snapshot?.kind!=="loaded"||!(c instanceof Jo))throw c;e.debug(`[Bindings] Using retained exclusion snapshot: ${r(c)}`)}}snapshotIsYoung(d){return this.unsupportedSchema===void 0&&d>0&&this.snapshot!==void 0&&this.snapshot.kind!=="unreadable"&&this.timer.now()-this.snapshot.loadedAtMs<d}loadShared(){return this.inFlight??=this.load().finally(()=>{this.inFlight=void 0}),this.inFlight}freshWaiter;refreshFresh(){if(this.freshWaiter)return this.freshWaiter;let d=this.inFlight;if(!d)return this.loadShared();let c=()=>(this.freshWaiter=void 0,this.loadShared()),S=d.then(c,c);return this.freshWaiter=S,S}degraded(){return this.snapshot?.kind==="files_only"?this.snapshot.diagnostic:void 0}lastReadFailed(){return this.readFailed}holderOf(d){if(this.snapshot?.kind!=="loaded")return;let c=this.snapshot.byDevice;for(let S of d.stableIds){let D=S?c.get(md(d.platform,S)):void 0;if(D)return D}return}stableIdsFor(d){return this.snapshot?.kind==="loaded"?this.snapshot.byPlatform.get(d)??new Set:new Set}async load(){if(this.unsupportedSchema)throw this.unsupportedSchema;let d,c;if(this.registry===void 0&&!this.registryExists()){this.snapshot={kind:"absent",loadedAtMs:this.timer.now()},this.readFailed=!1;return}try{c=await this.openRegistryOnce(),await c.assertSupportedSchema(),d=await c.snapshotManagedDevices()}catch(C){if(C instanceof zr)throw this.unsupportedSchema=C,await this.dropUnsupportedRegistry(c,C),C;if(C instanceof Zt){if(!this.warnedUpgradePending)e.warn("[Bindings] Registry upgrade pending; treating exclusion as absent until retirement completes",C),this.warnedUpgradePending=!0;this.snapshot={kind:"absent",loadedAtMs:this.timer.now(),upgradePending:!0},this.readFailed=!1;return}if(this.readFailed=!0,this.snapshot?.kind==="loaded")e.warn(`[Bindings] Registry unreadable; keeping the last snapshot: ${r(C)}`,C);else this.snapshot={kind:"unreadable"};throw new Jo(r(C))}let S=new Map,D=new Map;for(let C of d){S.set(md(C.platform,C.stableDeviceId),C);let x=D.get(C.platform)??new Set;x.add(C.stableDeviceId),D.set(C.platform,x)}this.snapshot={kind:"loaded",byDevice:S,byPlatform:D,loadedAtMs:this.timer.now()},this.readFailed=!1}async openRegistryOnce(){this.registry??=this.openRegistry().catch((S)=>{throw this.registry=void 0,S});let d=await this.registry,c=On.get(d);if(c)throw c;return d}async dropUnsupportedRegistry(d,c){if(this.registry=void 0,!d)return;if(Le?.handle===d)Le=void 0;if(On.has(d))return;On.set(d,c);try{await d.close()}catch(S){e.warn("[Bindings] Failed to close unsupported registry",S)}}}var Le;function VP(d,c={}){return new gd(()=>{if(!Le){let S={promise:(c.openRegistry?.()??Qb({migrate:!1})).then((D)=>(S.handle=D,D),(D)=>{if(Le===S)Le=void 0;throw D})};Le=S}return Le.promise},d,()=>Le!==void 0||(c.registryExists??xf)())}import{join as vv}from"path";import{closeSync as Wf,linkSync as Gf,openSync as jf,readFileSync as Kf,unlinkSync as Jf,writeSync as zf}from"fs";import{dirname as Xf,join as mt}from"path";var Yf=60000,vd=300000,hd=15*s5,Qf=Math.ceil(vd/hd)+1,Bt="device-allocations";function r6(d,c=process.env,S){return mt(bu(Dh(c),Bt,c,S),hm(d))}function Zf(d){let c;try{c=Kf(d,"utf-8").trim()}catch(S){return e.debug(`claim file ${d} not readable: ${r(S)}`),!1}return c.length===0||Number.isNaN(Ss(c).pid)}var eg=0;function tg(d,c){let S=`${d}.${c.pid}.${++eg}.tmp`,D=jf(S,"wx",384);try{zf(D,Pg(c.pid,c.ownerToken,c.metadata))}finally{Wf(D)}try{return Gf(S,d),!0}catch(C){if(C.code==="EEXIST")return!1;throw C}finally{try{Jf(S)}catch(C){e.debug(`claim temp ${S} cleanup failed: ${r(C)}`)}}}var wd={leasePath:(d)=>mt(VR(a5),hm(d)),claimPath:(d)=>r6(d),read:(d)=>fl(d),isUnreadable:(d)=>Zf(d),isProcessRunning:(d)=>nt(d),tryAcquire:(d,c)=>(Va(Xf(d)),tg(d,c)),takeOver:(d,c,S)=>Ek(d,c,S),release:(d,c)=>vi(d,c.pid,c.ownerToken)},ig="ios-simulators";function n6(d,c=process.env,S){return mt(bu(ig,Bt,c,S),hm(d))}var uN={...wd,leasePath:()=>{return},claimPath:(d)=>n6(d)},rg="watch-simulators";function ng(d,c=process.env,S){return mt(bu(rg,Bt,c,S),hm(d))}var GX={...uN,claimPath:(d)=>ng(d)},og="tv-simulators";function ag(d,c=process.env,S){return mt(bu(og,Bt,c,S),hm(d))}var YX={...uN,claimPath:(d)=>ag(d)},dg="vision-simulators";function cg(d,c=process.env,S){return mt(bu(dg,Bt,c,S),hm(d))}var JX={...uN,claimPath:(d)=>cg(d)};class Cf{selfPid;source;probe;owners=new Map;unreadable=new Set;idleLeaseHolders=new Map;unanswered=new Map;ownerToken=L.next();claimMirror;timer;forwardEvidence;ownerSocketPath;constructor(d=process.pid,c=wd,S=new lw,{ownerSocketPath:D=WV,timer:C=i,forwardEvidence:x}={}){this.selfPid=d;this.source=c;this.probe=S;this.ownerSocketPath=D,this.timer=C,this.forwardEvidence=x}async refresh(d,c){c?.throwIfAborted();let S=await l(Promise.all(d.map(async(D)=>[D,await this.readOwnerWithForwardEvidence(D,c)])),{timer:this.timer,signal:c,label:"Foreign ownership refresh"});c?.throwIfAborted();for(let[D,{pid:C,forwardUnreadable:x}]of S){if(C===void 0)this.owners.delete(D);else this.owners.set(D,C);if(C===void 0&&(x||this.hasUnreadableClaim(D)))this.unreadable.add(D);else this.unreadable.delete(D)}}async readOwnerWithForwardEvidence(d,c){let S=await l(this.readForeignOwner(d),{timer:this.timer,signal:c,label:"Foreign ownership files"});if(c?.throwIfAborted(),S!==void 0)return{pid:S,forwardUnreadable:!1};return this.readForwardEvidence(d,c)}async readForwardEvidence(d,c){let S=await this.forwardEvidence?.read(d,c);if(!S||S.kind==="none")return{pid:void 0,forwardUnreadable:!1};if(S.ports.length===0){if(S.kind==="unknown")e.warn(`[DevicePool] Cannot inspect CtrlProxy forwards for ${d}: ${S.message}`);return{pid:void 0,forwardUnreadable:!1}}if(this.idleLeaseHolders.delete(d),S.kind==="foreign")return{pid:S.clientPids[0],forwardUnreadable:!1};return{pid:void 0,forwardUnreadable:!0}}foreignClaimUnreadable(d){return this.unreadable.has(d)}attachClaimMirror(d){this.claimMirror=d}async relinquishIdleLease(d){let c=this.idleLeaseHolders.get(d);if(c===void 0||!this.probe.requestRelinquish)return;let S=await this.probe.requestRelinquish(c,d);e.info(`[DevicePool] Asked the idle forwarding-lease holder of ${d} to relinquish it: `+(S.kind==="relinquish"?`${S.result.released?"released":"kept"} (${S.result.reason})`:`${S.kind} (${S.detail})`)),await this.refresh([d])}hasUnreadableClaim(d){let c=this.resolvePath(()=>this.source.claimPath(d),d);return c!==void 0&&this.source.isUnreadable?.(c)===!0}foreignOwnerPid(d){return this.owners.get(d)}async claim(d){let c=this.claimOwner(),S=await this.claimInTable(d,c);if(S!==void 0)return S;let D=await this.claimFile(d,c);if(D==="claimed")this.claimMirror?.claimed(d,c,()=>this.claimFileIsOurs(d,c),(C)=>this.isLiveTableOwner(d,C));return D!=="refused"}async claimInTable(d,c){let S=this.claimMirror?.acquire?.bind(this.claimMirror);if(!S)return;if(await this.fileClaimOwner(d)!==void 0||this.hasUnreadableClaim(d))return!1;let D=await S(d,c,(C)=>this.isLiveTableOwner(d,C));if(D.outcome==="unavailable")return;if(D.outcome==="refused")return this.owners.set(d,D.ownerPid),!1;if(await this.claimFile(d,c)==="refused")return this.claimMirror?.released(d,c),!1;return!0}async isLiveTableOwner(d,c){return await this.evaluateContent({pid:c.pid,metadata:c.metadata},d,"claim")!==void 0}async fileClaimOwner(d){let c=this.resolvePath(()=>this.source.claimPath(d),d),S=c===void 0?void 0:this.source.read(c);return c!==void 0&&S!==void 0&&S.pid!==this.selfPid?this.evaluateOwner(c,d,"claim"):void 0}claimFileIsOurs(d,c){let S=this.resolvePath(()=>this.source.claimPath(d),d);if(S===void 0)return!1;let D=this.source.read(S);return D?.pid===c.pid&&D.token===c.ownerToken}async claimFile(d,c){let S=this.resolvePath(()=>this.source.claimPath(d),d);if(S===void 0)return"unpublished";let D;try{D=this.source.tryAcquire(S,c)}catch(x){return e.warn(`Cannot publish the allocation claim for ${d} at ${S}: ${r(x)}`,x),"unpublished"}if(D)return this.unlessHeldInTable(d,S,c);let C=this.source.read(S);if(!C||Number.isNaN(C.pid)||C.pid===this.selfPid)return C?.pid===this.selfPid?"claimed":"refused";if(await this.evaluateOwner(S,d,"claim")!==void 0)return"refused";return this.source.takeOver(S,C,c)?this.unlessHeldInTable(d,S,c):"refused"}async unlessHeldInTable(d,c,S){let D=await this.tableClaimOwner(d);if(D===void 0)return"claimed";this.owners.set(d,D);try{this.source.release(c,S)}catch(C){e.warn(`Cannot give back the claim on ${d} another daemon holds in the host-wide table: ${r(C)}`,C)}return"refused"}release(d){let c={pid:this.selfPid,ownerToken:this.ownerToken};this.claimMirror?.released(d,c);let S=this.resolvePath(()=>this.source.claimPath(d),d);if(S===void 0)return;try{this.source.release(S,c)}catch(D){e.warn(`Cannot release the allocation claim on ${d}: ${r(D)}`,D)}}claimOwner(){let d=this.ownerSocketPath();return{pid:this.selfPid,ownerToken:this.ownerToken,...d===void 0?{}:{metadata:VV({socketPath:d,acquiredAt:this.timer.now()})}}}async readForeignOwner(d){let c=this.resolvePath(()=>this.source.leasePath(d),d),S=this.resolvePath(()=>this.source.claimPath(d),d),[D,C]=await Promise.all([c===void 0?void 0:this.evaluateLock(c,d,"lease"),S===void 0?void 0:this.evaluateOwner(S,d,"claim")]),x=await this.tableOwnerUnlessAFileDecides(d,D,C);return this.noteIdleLeaseHolder(d,D?.idleSocketPath,C??x),D?.pid??C??x}noteIdleLeaseHolder(d,c,S){if(c!==void 0&&S===void 0)this.idleLeaseHolders.set(d,c);else this.idleLeaseHolders.delete(d)}async tableOwnerUnlessAFileDecides(d,c,S){let D=c?.idleSocketPath===void 0?c?.pid:void 0;return(S??D)===void 0?this.tableClaimOwner(d):void 0}async tableClaimOwner(d){if(!this.claimMirror?.read)return;try{let c=await this.claimMirror.read(d);if(!c)return;return(await this.evaluateContent({pid:c.pid,metadata:c.metadata},d,"claim"))?.pid}catch(c){e.warn(`Cannot read the host-wide claim on ${d}; the claim files decide: ${r(c)}`,c);return}}resolvePath(d,c){try{return d()}catch(S){e.warn(`Cannot resolve the device ownership files for ${c}: ${r(S)}`,S);return}}async evaluateOwner(d,c,S){return(await this.evaluateLock(d,c,S))?.pid}async evaluateLock(d,c,S){return this.evaluateContent(this.source.read(d),c,S)}async evaluateContent(d,c,S){let D=this.liveForeignLock(d);if(!D)return;let{pid:C,metadata:x}=D;if(!x)return{pid:C};let T=await this.probe.query(x.socketPath,c);if(this.wedgedOwnerLapsed(T,C,c,S))return;let B=S==="claim"&&this.timer.now()-x.acquiredAt<Yf;if(!mg(T,C,S,{deviceId:c,startingUp:B}))return;return ug(T)?{pid:C,idleSocketPath:x.socketPath}:{pid:C}}liveForeignLock(d){let c=d?.pid;if(c===void 0||Number.isNaN(c)||c===this.selfPid)return;if(!this.source.isProcessRunning(c)){this.unanswered.delete(c);return}return{pid:c,metadata:hT(d?.metadata)}}wedgedOwnerLapsed(d,c,S,D){if(d.kind!=="no-response")return this.unanswered.delete(c),!1;let C=this.timer.monotonicNow?.()??this.timer.now(),x=this.unansweredRun(c,C),T=C-x.since;if(T<vd||x.samples<Qf)return!1;if(!x.warnedDevices.has(S))x.warnedDevices.add(S),e.warn(`[DevicePool] ${D} owner PID ${c} of ${S} is alive but has not answered on its control socket for ${Math.round(T/1000)}s; treating its hold on the device as lapsed`);return!0}unansweredRun(d,c){let S=this.unanswered.get(d);if(!S||c-S.lastAt>hd){let D={since:c,lastAt:c,samples:1,warnedDevices:new Set};return this.unanswered.set(d,D),D}if(c>S.lastAt)S.samples+=1,S.lastAt=c;return S}}function ug(d){return d.kind==="status"&&d.status.sessionId===null&&d.status.activeExecutions===0}function mg(d,c,S,{deviceId:D,startingUp:C}){switch(d.kind){case"unreachable":if(C)return e.debug(`[DevicePool] ${S} owner PID ${c} of ${D} is live but not yet reachable; treating its fresh claim as held`),!0;return e.debug(`[DevicePool] ${S} owner PID ${c} of ${D} is orphaned: ${d.detail}`),!1;case"no-response":case"unsupported":return!0;case"status":if(d.status.pid!==c)return e.debug(`[DevicePool] ${S} owner PID ${c} of ${D} is orphaned: its socket is served by PID ${d.status.pid}`),!1;return S==="lease"||d.status.sessionId!==null||d.status.activeExecutions>0}}import{readFileSync as bd,renameSync as pg,statSync as fg,unlinkSync as gg,writeFileSync as vg}from"fs";import{join as Ii}from"path";class Qe extends t{code;constructor(d,c){super(c);this.code=d}}var hg=f({id:y().min(1),ownerPid:A().int().positive(),ownerGenerationToken:y().optional(),deviceId:y().optional(),replacement:Z().optional(),processId:A().int().positive().optional(),processGenerationToken:y().optional(),admittedUntilMs:A().finite().optional(),handedOffUntilMs:A().finite().optional()}),yg=600000,bg=60000;class Fn{options;timer;pid;running;ids;constructor(d){this.options=d;this.timer=d.timer??i,this.pid=d.pid??process.pid,this.running=d.isProcessRunning??nt,this.ids=d.idGenerator??L}async withAdmissionLock(d,c){d.signal?.throwIfAborted();let S=this.perform((C)=>Ii(Va(C),"admission.lock")),D=this.ids.next();await this.acquire(S,D,d);try{return d.signal?.throwIfAborted(),await c()}finally{vi(S,this.pid,D)}}async acquire(d,c,S){let D=this.timer.now()+S.timeoutMs;for(;;){if(S.signal?.throwIfAborted(),this.tryAcquire(d,c))return;let C=D-this.timer.now();if(C<=0)throw this.timeout(d);if(await l(()=>this.timer.sleep(Math.min(25,C)),{timer:this.timer,timeoutMs:C,signal:S.signal,label:d,timeoutError:()=>this.timeout(d)}),this.timer.now()>=D)throw this.timeout(d)}}timeout(d){return e.warn(`[BootAdmission] Timed out waiting for ${d}`),new Qe("timeout",`Timed out waiting for host admission lock at ${d}`)}tryAcquire(d,c){try{let S=_i(d,{pid:this.pid,now:()=>this.timer.now(),ownerToken:c,isProcessRunning:this.running,ownerGeneration:this.options.ownerGeneration??Nt});if(!S)return this.checkReadableLock(d),this.takeOverStaleLock(d,c);return S}catch(S){throw this.failed(d,S)}}takeOverStaleLock(d,c){let S=fl(d);if(!S||!this.olderThan(d,this.options.lockMaxAgeMs??bg))return!1;let D=Ek(d,S,{ownerGeneration:this.options.ownerGeneration??Nt,pid:this.pid,ownerToken:c});if(D)e.warn(`[BootAdmission] Took over stale host admission lock at ${d} from PID ${S.pid}`);return D}olderThan(d,c){try{return this.timer.now()-fg(d).mtimeMs>c}catch(S){if(!this.missing(S,d))throw this.failed(d,S);return!1}}checkReadableLock(d){try{bd(d)}catch(c){if(!this.missing(c,d))throw this.failed(d,c)}}readPeerAdmissions(){return this.perform((d)=>this.listFiles(d).flatMap((c)=>{let S=this.readRecord(d,c);return S&&S.ownerPid!==this.pid?[S]:[]}))}listFiles(d){try{return xi(d).filter((c)=>c.endsWith(".json"))}catch(c){if(!this.missing(c,d))throw c;return[]}}readRecord(d,c){let S=Ii(d,c),D;try{D=bd(S,"utf8")}catch(x){if(!this.missing(x,S))throw x;return}let C=this.parseRecord(S,c,D);if(C&&this.isStale(C)){this.cleanup(S);return}return C}parseRecord(d,c,S){let D=Number(c.split(".",1)[0]);try{let C=hg.parse(JSON.parse(S));if(c!==`${C.ownerPid}.${C.id}.json`)throw Error("Mismatched admission record identity");return C}catch(C){if(!Number.isInteger(D)||D<=0)throw this.failed(d,C);if(this.running(D)){if(!this.olderThan(d,yg))throw this.failed(d,C);e.warn(`[BootAdmission] Dropping old invalid record at ${d} from PID ${D}: ${r(C)}`,C),this.cleanup(d);return}e.debug(`[BootAdmission] Dropping dead owner's invalid record at ${d}: ${r(C)}`),this.cleanup(d);return}}isStale(d){if(d.handedOffUntilMs!==void 0)return this.timer.now()>=d.handedOffUntilMs||d.processId!==void 0&&this.isProvablyGone(d.ownerPid,d.ownerGenerationToken)&&this.isProvablyGone(d.processId,d.processGenerationToken);return!this.running(d.ownerPid)||d.admittedUntilMs!==void 0&&this.timer.now()>=d.admittedUntilMs}isProvablyGone(d,c){return!this.running(d)||pw(d,{processGenerationToken:c},this.options.readProcessGenerationToken??la,"host boot admission record")}readToken(d){try{return(this.options.readProcessGenerationToken??la)(d)}catch(c){e.warn(`[BootAdmission] Failed to capture process generation token for PID ${d}: ${r(c)}`,c);return}}publish(d={}){let c={id:this.ids.next(),ownerPid:this.pid,ownerGenerationToken:this.readToken(this.pid),...d};this.write(c);let S=!1;return{clearDeviceId:()=>{if(S)return;let D={...c};delete D.deviceId,this.write(D),c=D},update:(D)=>{if(S)return;let C={...c,...Object.fromEntries(Object.entries(D).filter(([,x])=>x!==void 0))};if(D.processId!==void 0)C.processGenerationToken=this.readToken(D.processId);this.write(C),c=C},remove:()=>{if(S)return;this.perform((D)=>this.unlink(Ii(D,`${c.ownerPid}.${c.id}.json`))),S=!0}}}write(d){this.perform((c)=>{Va(c);let S=Ii(c,`${d.ownerPid}.${d.id}.json`),D=`${S}.${this.ids.next()}.tmp`;try{vg(D,JSON.stringify(d),{flag:"wx",mode:384}),pg(D,S)}finally{this.cleanup(D)}})}unlink(d){try{gg(d)}catch(c){if(!this.missing(c,d))throw c}}cleanup(d){try{this.unlink(d)}catch(c){e.warn(`[BootAdmission] Registry cleanup failed at ${d}: ${r(c)}`,c)}}missing(d,c){if(d?.code!=="ENOENT")return!1;return e.debug(`[BootAdmission] Registry path already absent: ${c}`),!0}perform(d){let c="boot-admissions/android (unresolved registry directory)";try{return c=this.options.directory(),d(c)}catch(S){throw this.failed(c,S)}}failed(d,c){if(c instanceof Qe)return c;return e.warn(`[BootAdmission] Host registry failed at ${d}: ${r(c)}`,c),new Qe("failed",`Host boot registry failed at ${d}: ${r(c)}`)}}class WP{maxSamples;samples=[];constructor(d=200){this.maxSamples=d}record(d){if(!Number.isFinite(d.durationMs)||d.durationMs<0)return;this.samples=[...this.samples,d].slice(-this.maxSamples)}latestFor(d){return this.samples.findLast((c)=>c.udid===d)}recentForProfile(d,c=10,S){return this.samples.filter((D)=>D.profileId===d&&(S===void 0||(D.reason??"create")===S)).slice(-c).reverse()}}class Ai{onClose;ended=[];constructor(d){this.onClose=d}close(){this.onClose(this)}}var Sd=g.BOOT_CAPACITY_GATE.name,_d=g.IOS_SIM_CAPACITY_GATE.name,hI=5000;function Ei(d,c){if(d==="ios"){let S=c[_d]?.trim();if(S==="0"||S==="1")return S==="1"}return c[Sd]?.trim()!=="0"}function i6(d){let c=d.externalDevices??[],S=d.heldDevices??[],D=S.length>0?` ${S.length} of them are held by AutoMobile: ${S.join(", ")}.`:"";return`${c.length>0?` ${c.length} of them ${d.ownershipUnknown?"have unconfirmed AutoMobile ownership":d.heldDevices?"have no AutoMobile owner":"were not started by AutoMobile"} but still count toward the limit: ${c.join(", ")}.`:""}${D}`}function Ti(d,c,S,D){if(d<c.maxBooted)return;let C=D.externalDevices??[],x=D.heldDevices??[],T=C.length>0?` or disable the gate with ${Sd}=0`:"";return{outcome:"refuse",reason:"at-capacity",limits:c,bootedCount:d,retryAfterMs:S,...C.length>0?{externalDevices:[...C]}:{},...x.length>0?{heldDevices:[...x]}:{},...D.ownershipUnknown?{ownershipUnknown:!0}:{},message:`${d} ${D.noun}(s) booted; limit is ${c.maxBooted} (${c.source}).${i6(D)} Shut one down, raise the limit with ${D.envName}${T}.`}}var ec=15000;async function Ot(d){d.signal?.throwIfAborted();let c=d.ledger.beginSample(),S;try{S=await Sg(d)}finally{c.close()}d.signal?.throwIfAborted();let D=d.decide(S,c);if(Rd(D))return{decision:D};return{decision:D,releaseAdmission:d.admit(D)}}function Rd(d){return d.outcome==="refuse"}async function Sg(d){let{timer:c}=d,S=d.sampleTimeoutMs??ec;return await l(d.sample,{timer:c,timeoutMs:S,signal:d.signal,label:`Collecting ${d.label}`,timeoutError:()=>Ln(d.platform,S,d.label,d.timeoutRetryAfterMs)})}function Ln(d,c,S,D){let C={code:"timeout",message:`timed out after ${c}ms collecting ${S}`,retryable:!0};return d==="android"?new Gr(C):new Ve(d,C,void 0,D)}function Mt(d,c,S){let{decision:D}=d;if(!Rd(D))return;throw new Nn({platform:c,limit:D.limits.maxBooted,booted:D.bootedCount,retryAfterMs:D.retryAfterMs,...D.externalDevices?{externalDevices:D.externalDevices}:{},...D.heldDevices?{heldDevices:D.heldDevices}:{},...D.ownershipUnknown?{ownershipUnknown:!0}:{}},`Refused to boot: no ${S} capacity (code capacity_exhausted, retryable; retry after ${D.retryAfterMs}ms): ${D.message}`)}class Ft{timer;entries=new Map;openWindows=new Set;constructor(d){this.timer=d}admit(d,c=!1,S="create"){let D=Symbol("boot-admission");return this.entries.set(D,{deviceId:d,replacement:c,reason:S}),{bind:(C)=>{let x=this.entries.get(D);if(x)this.entries.set(D,{...x,deviceId:C,replacement:!1})},release:()=>this.end(D),handOff:(C,x,T)=>{let B=this.entries.get(D);if(B)this.entries.set(D,{deviceId:C??B.deviceId,processId:T??B.processId,handedOffUntilMs:x,handedOff:!0})}}}admissionsByReason(){let d={reset:0,create:0,restart:0};for(let c of this.entries.values())d[c.reason??"create"]+=1;return d}end(d,c=!1){let S=this.entries.get(d);if(!S)return;this.entries.delete(d);let D=c?{deviceId:S.deviceId,processId:S.processId,handedOff:S.handedOff,replacement:S.replacement,reason:S.reason}:S;for(let C of this.openWindows)C.ended.push(D)}beginSample(){let d=new Ai((c)=>this.openWindows.delete(c));return this.openWindows.add(d),d}inFlightCount(d,c,S){return this.inFlight(d,c,S).count}inFlight(d,c,S,D=new Set){let{count:C,withListedProcess:x,listedWithoutProcess:T}=this.inFlightView(d,c,S,D);return{count:C,withListedProcess:x,listedWithoutProcess:T}}inFlightView(d,c,S,D=new Set){let C=this.timer.now(),x=(q)=>q.processId!==void 0&&D.has(q.processId),T=(q)=>q.deviceId!==void 0&&d.has(q.deviceId),B=this.endedDuringSample(S,d,c,C),O=[...B],N=B.filter(x).length,V=[...this.windowEnded(S),...this.entries.values()].filter((q)=>T(q)&&!x(q)&&q.deviceId!==c&&!q.replacement).length;for(let[q,W]of[...this.entries]){let G=T(W);if(W.handedOffUntilMs!==void 0&&(G||C>=W.handedOffUntilMs))this.end(q,G);else if(!G&&(c===void 0||W.deviceId!==c))O.push(W),N+=x(W)?1:0}return{count:O.length,boots:O.map((q)=>({deviceId:q.deviceId,replacement:q.replacement,processId:q.processId,handedOff:q.handedOff===!0})),withListedProcess:N,listedWithoutProcess:V}}windowEnded(d){return d instanceof Ai?d.ended:[]}endedDuringSample(d,c,S,D){return this.windowEnded(d).filter((C)=>!(C.handedOffUntilMs!==void 0&&D>=C.handedOffUntilMs)&&!(C.deviceId!==void 0&&c.has(C.deviceId))&&(S===void 0||C.deviceId!==S))}}import{AsyncLocalStorage as _g}from"async_hooks";class Ze{scope=new _g;hasPending(){return this.scope.getStore()?.active===!0}take(d){let c=this.scope.getStore();if(!c?.active)return;return c.active=!1,c.consume(d)}hold(d,c,S=()=>{}){let D={active:!0,consume:d};return{run:async(C)=>{if(!D.active)throw new t("Boot reservation was already consumed or released");let x=!1;try{let T=await this.scope.run(D,C);return x=!0,T}finally{if(!x&&D.active)D.active=!1,c()}},markReplacedDeviceGone:()=>{if(D.active)S()},release:()=>{if(D.active)D.active=!1,c()}}}}var Bi="Booted",o6=new Set([Bi,"Booting","Shutting Down"]);function eS(d,c){return d.simulators.filter((S)=>o6.has(S.state)&&S.udid!==c).map((S)=>S.udid)}class zP{source;history;timer;inFlight=null;pendingFresh=null;constructor(d,c,S){this.source=d;this.history=c;this.timer=S}collect(d={}){if(this.inFlight)return this.inFlight;return this.startRun(d)}collectFresh(d={}){if(this.pendingFresh)return this.pendingFresh;let c=Promise.resolve().then(()=>(this.pendingFresh=null,this.startRun(d)));return this.pendingFresh=c,c}startRun(d){let c=this.collectOnce(this.runBudget(d)).finally(()=>{if(this.inFlight===c)this.inFlight=null});return this.inFlight=c,c}runBudget(d){let c=d.deadlineMs??(d.timeoutMs===void 0?void 0:this.timer.now()+d.timeoutMs);return{signal:d.signal,deadlineMs:c}}async withinBudget(d,c){if(d.deadlineMs===void 0)return await c({signal:d.signal});return await ls(d.deadlineMs,this.timer,d.signal,(S,D)=>c({signal:S,timeoutMs:D}))}async collectOnce(d){let c=this.timer.now(),S;try{S=await this.withinBudget(d,(O)=>this.source.readInventory(O))}catch(O){return e.warn(`simulator inventory failed: ${r(O)}`,O),Dg(c,[`inventory: ${r(O)}`])}let D=S.filter((O)=>O.state===Bi),C=await this.readSnapshot(d,D.length>0),x=C.value?Dee(C.value.processes,D.map((O)=>O.udid)):new Map,T=S.map((O)=>this.costFor(O,C,x)),B=[...C.error?[`host snapshot: ${C.error}`]:[],...C.value?.footprintError&&D.length>0?[`memory footprint: ${C.value.footprintError}`]:[]];return{collectedAtMs:c,host:C.value?.resources,simulators:T,totals:Pd(T),errors:B}}async readSnapshot(d,c){try{let S=await this.withinBudget(d,(D)=>this.source.readHostSnapshot(D));return c&&S.processesError?{value:S,error:S.processesError}:{value:S}}catch(S){return e.warn(`host snapshot failed: ${r(S)}`,S),c?{error:r(S)}:{}}}costFor(d,c,S){let D={udid:d.udid,name:d.name,state:d.state,runtime:d.runtime,deviceTypeIdentifier:d.deviceTypeIdentifier,diskBytes:d.dataPathSizeBytes,lastBoot:this.history.latestFor(d.udid)};if(d.state!==Bi)return{...D,quality:"not-running"};if(!c.value||c.value.processesError)return{...D,quality:"unavailable",error:c.error??c.value?.processesError??"no host snapshot"};let C=S.get(d.udid);return C?{...D,quality:"measured",process:C}:{...D,quality:"no-processes"}}}function Dg(d,c){return{collectedAtMs:d,simulators:[],totals:Pd([]),errors:c,inventoryFailed:!0}}function Pd(d){let c=d.filter((D)=>D.quality==="measured"),S=c.flatMap((D)=>D.process?.footprintBytes===void 0?[]:[D.process.footprintBytes]);return{bootedCount:d.filter((D)=>D.state===Bi).length,measuredCount:c.length,rssBytes:c.reduce((D,C)=>D+(C.process?.rssBytes??0),0),...S.length>0?{footprintBytes:S.reduce((D,C)=>D+C,0)}:{},cpuPercent:c.reduce((D,C)=>D+(C.process?.cpuPercent??0),0),diskBytes:d.reduce((D,C)=>D+(C.diskBytes??0),0)}}var ki={defaultBytes:2684354560,minBytes:1610612736,maxBytes:6442450944},$n={defaultBytes:4294967296,minBytes:1610612736,maxBytes:8589934592};function Un(d,c){if(d.length===0)return c.defaultBytes;let S=d.reduce((D,C)=>D+C,0)/d.length;return Math.min(c.maxBytes,Math.max(c.minBytes,S))}function Id(d,c,S){if(c===void 0||!Number.isFinite(c))return d;return Math.min(S.maxBytes,Math.max(d,c))}function Oi(d,c,S){if(d===void 0)return S.defaultBytes;let D=c.map((W)=>{let G=W.processId===void 0?0:d.reduce((ie,re)=>re.pid===W.processId||re.ppid===W.processId?ie+re.rssBytes:ie,0);return Math.max(G,S.defaultBytes)}),C=new Set(c.map((W)=>W.processId));C.delete(void 0);let x=d.filter((W)=>!C.has(W.pid)&&!C.has(W.ppid)).map((W)=>W.rssBytes).sort((W,G)=>W-G);if(x.length===0)return Un(D,S);let T=d.some((W)=>W.pid!==void 0||W.ppid!==void 0),B=c.filter((W)=>W.handedOff&&(W.processId===void 0||!T)).length,O=x.slice(Math.min(B,x.length-1)),N=O.reduce((W,G)=>W+G,0),H=N/O.length,V=(N+D.reduce((W,G)=>W+G,0))/(O.length+c.length),q=B>=x.length?S.defaultBytes:S.minBytes;return Math.min(S.maxBytes,Math.max(S.minBytes,q,H,V))}function Ad(d,c,S,{perDeviceBytes:D,coresPerDevice:C=2}){let x=d[c],T=Mi(x);if(T!==void 0)return{maxBooted:T,source:"env"};let B=Math.floor(S.totalMemoryBytes*0.5/D),O=Math.floor(S.cpuCount/Math.max(1,C)),N={maxBooted:Math.max(1,Math.min(B,O)),source:"derived"};return x===void 0||x.trim()===""?N:{...N,warning:`${c}=${JSON.stringify(x)} is not a positive integer; using the derived limit`}}function Mi(d){if(d===void 0||!/^\d+$/.test(d.trim()))return;let c=Number(d.trim());return c>=1?c:void 0}var Ni=g.IOS_SIM_MAX_BOOTED.name,Cg=0.1,Ig=0.6,Ag=0.5,Eg=13,xg=2,Ed=g.IOS_SIM_BOOT_CONCURRENCY.name,Tg=1.5;function EH(d,c=[]){let S=d?.simulators??[],D=S.flatMap((O)=>O.quality==="measured"&&O.process?.footprintBytes!==void 0?[{udid:O.udid,footprintBytes:O.process.footprintBytes}]:[]),C=new Set(c.flatMap((O)=>O.deviceId&&!O.replacement?[O.deviceId]:[]));for(let O of S)if(O.state==="Booting")C.add(O.udid);let x=c.filter((O)=>O.deviceId===void 0||O.replacement);if(C.size===0&&x.length===0)return Un(D.map((O)=>O.footprintBytes),ki);let T=new Map(D.map((O,N)=>[O.udid,N])),B=[...x.map(({handedOff:O})=>({handedOff:O})),...[...C].map((O)=>({processId:T.get(O),handedOff:!1}))];return Oi(D.map((O,N)=>({rssBytes:O.footprintBytes,pid:N})),B,ki)}function pN(d,c,S=ki.defaultBytes){let D=d[Ni],C=Mi(D),x=Math.floor(c.totalMemoryBytes*Ig/S),T=Math.floor(c.cpuCount*Ag/Cg),B=d[Ed],O=Mi(B),N=Number.isSafeInteger(O)?O:void 0,H=xd(Ni,D,C),V=xd(Ed,B,N);return{maxBooted:C??Math.max(1,Math.min(x,T)),source:C===void 0?"derived":"env",...H?{warning:H}:{},bootConcurrency:N??Bg(c.cpuCount),bootConcurrencySource:N===void 0?"derived":"env",...V?{bootConcurrencyWarning:V}:{}}}function Bg(d){return d>0?Math.max(xg,Math.ceil(d/Eg)):1}function xd(d,c,S){return S===void 0&&c?.trim()?`${d}=${JSON.stringify(c)} is not a positive integer; using the derived limit`:void 0}function IH(d){if(!d)return!1;if(d.memoryPressure==="warn"||d.memoryPressure==="critical")return!0;return d.loadAverage1m!==null&&d.cpuCount>0&&d.loadAverage1m/d.cpuCount>=Tg}function Td(d,c){if(c.deviceTypeIdentifier===void 0&&c.runtime===void 0&&c.profileId===void 0)return[];let S=new Set(c.excludeUdids??[]);return(d?.simulators??[]).filter((D)=>D.state==="Booted"&&!S.has(D.udid)&&(c.deviceTypeIdentifier===void 0||D.deviceTypeIdentifier===c.deviceTypeIdentifier)&&(c.runtime===void 0||D.runtime===c.runtime)&&(c.profileId===void 0||D.lastBoot?.profileId===c.profileId))}class mN{limit;running=0;waiters=[];constructor(d=1){this.limit=d;this.setLimit(d)}status(){return{limit:this.limit,running:this.running,queued:this.waiters.length}}setLimit(d){if(!Number.isSafeInteger(d)||d<1)throw RangeError("Boot concurrency limit must be a positive integer");this.limit=d,this.drain()}async acquire(d,c){return d?.throwIfAborted(),new Promise((S,D)=>{let C=()=>{let T=this.waiters.indexOf(x);if(T>=0)this.waiters.splice(T,1);D(d?.reason)},x={owner:c,grant:()=>{d?.removeEventListener("abort",C),this.running++;let T=!1;S({release:()=>{if(T)return;T=!0,this.running--,this.drain()}})}};this.waiters.push(x),d?.addEventListener("abort",C,{once:!0}),this.drain()})}drain(){while(this.running<this.limit&&this.waiters.length>0)this.waiters.shift().grant()}}var kg=3,Fi="iOS simulator capacity";class Vn{fleet;timer;optionsOwnership;env;retryAfterMs;sustainedSamples;random;pressuredStreak=0;bootGate;warnedBootConcurrency;warnedLimit;warnedHostUnreadable=!1;latestReport;startedUdids=new Set;seenStartedUdids=new Set;bootsByUdid=new Map;admittedBoots;reservations=new Ze;constructor(d,c,S={}){this.fleet=d;this.timer=c;this.bootGate=S.bootGate??new mN,this.optionsOwnership=S.ownership,this.env=S.env??process.env,this.retryAfterMs=S.retryAfterMs??hI,this.sustainedSamples=S.sustainedSamples??kg,this.random=S.random??hl,this.admittedBoots=S.ledger??new Ft(c)}async refresh(d={}){let c=await(d.fresh?this.fleet.collectFresh({deadlineMs:this.timer.now()+(d.sampleTimeoutMs??ec)}):this.fleet.collect());return this.foldIntoPressureHistory(c),c}foldIntoPressureHistory(d){if(d!==this.latestReport)this.latestReport=d,this.pressuredStreak=IH(d.host)?this.pressuredStreak+1:0}async evaluateBoot(d={}){return this.decide(await this.refresh(),d,"substitute")}async refreshOwnership(d){try{return await this.optionsOwnership?.refresh(),d}catch(c){return e.warn("[BootAdmission] iOS ownership could not be read; using retained ownership labels",c),{...d,ownershipReadFailed:!0}}}decide(d,c,S,{bootUdid:D,window:C,carriesOwnSlot:x}={}){this.assertCountKnown(d);let T=d.simulators.filter((G)=>this.optionsOwnership?.isAutoMobileOwned(G.udid)).map((G)=>G.udid),B=S==="hint"?{...c,excludeUdids:[...c?.excludeUdids??[],...T]}:c??{},O=Td(d,B)[0];if(O&&S==="substitute")return{outcome:"reuse-warm",udid:O.udid};let N=this.limitsFor(d,C),H=eS(d,D);this.forgetExitedStarted(d);let V=H.length+this.inFlightBootCount(d,D,C);if(x)return{outcome:"allow",limits:N,bootedCount:V};let q=new Set([...this.startedUdids,...T]),W=Ti(V,this.countLimits(N),this.retryAfterMs,{noun:"simulator",envName:Ni,externalDevices:H.filter((G)=>!q.has(G)),heldDevices:H.filter((G)=>q.has(G)),ownershipUnknown:d.ownershipReadFailed});if(W)return d.ownershipReadFailed?{...W,message:`${W.message} Ownership could not be read; labels use the last good snapshot and current in-memory ownership, so external devices may also be held by AutoMobile.`}:W;return O?{outcome:"reuse-warm",udid:O.udid}:{outcome:"allow",limits:N,bootedCount:V}}async admitBoot(d,c){c.signal?.throwIfAborted();let S=this.reservations.take(c.bootUdid);if(S)return this.withBootPermit(S,c);let D=await Ot({timer:this.timer,platform:"ios",signal:c.signal,label:Fi,timeoutRetryAfterMs:this.jitteredRetryAfterMs(),sample:async()=>this.refreshOwnership(await this.refresh({fresh:!0})),ledger:this.admittedBoots,decide:(C,x)=>this.decide(C,d,"hint",{bootUdid:c.bootUdid,window:x}),admit:()=>this.recordAdmission(c.bootUdid,void 0,c.reason)});return this.withBootPermit(D,c)}async withBootPermit(d,c){let S=d.releaseAdmission;if(!S||d.decision.outcome==="refuse")return d;let D=this.bootGate.status(),C=D.running>=D.limit||D.queued>0,x=this.timer.now();if(C)e.info(`[BootAdmission] iOS simulator boot queued behind ${D.running} running boots (limit ${D.limit})`);let T=!1;try{let B=await this.bootGate.acquire(c.signal,c.bootUdid);if(T=!0,C)e.info(`[BootAdmission] iOS simulator boot granted after ${this.timer.now()-x}ms queued`);let O=!1;return{...d,releaseAdmission:(N)=>{if(O)return;O=!0;try{S(N)}finally{B.release()}}}}finally{if(!T)S({bootFailed:!0})}}async reserveBoot(d){let c,S=Math.min(d.timeoutMs,ec),D=await Ot({timer:this.timer,platform:"ios",signal:d.signal,sampleTimeoutMs:S,label:Fi,timeoutRetryAfterMs:this.jitteredRetryAfterMs(),sample:async()=>this.refreshOwnership(await this.refresh({fresh:!0,sampleTimeoutMs:S})),ledger:this.admittedBoots,decide:(T,B)=>this.decide(T,void 0,"hint",{bootUdid:d.replacingDeviceId,window:B,carriesOwnSlot:d.reason==="reset"&&d.replacingDeviceId!==void 0&&eS(T).includes(d.replacingDeviceId)}),admit:()=>(c=this.admittedBoots.admit(d.replacingDeviceId,!0,d.reason),c.release)});Li(D);let C=c,x=C.release;return this.reservations.hold((T)=>(C.bind(T),x=this.recordAdmission(T,C),{decision:D.decision,releaseAdmission:x}),()=>x({bootFailed:!0}),()=>C.bind())}recordAdmission(d,c,S){let D=d?this.bootsByUdid.get(d)??{unreleased:0,succeeded:!1}:void 0;if(d&&D)this.startedUdids.add(d),D.unreleased+=1,this.bootsByUdid.set(d,D);let C=c??this.admittedBoots.admit(d,!1,S),x=!1;return(T)=>{if(x)return;if(x=!0,C.release(),!d||!D||this.bootsByUdid.get(d)!==D)return;if(D.unreleased-=1,D.succeeded||=!T?.bootFailed,D.unreleased===0&&!D.succeeded&&!this.seenStartedUdids.has(d))this.forgetStarted(d)}}async assertCapacityAvailable(d={}){if(d.signal?.throwIfAborted(),this.reservations.hasPending())return;return this.sampleInWindow({...d,ownership:!0},(c,S)=>{Li({decision:this.decide(c,void 0,"hint",{window:S})})})}async describeCapacity(d={}){return this.sampleInWindow(d,(c,S)=>(this.assertCountKnown(c),{limit:this.limitsFor(c,S).maxBooted,booted:eS(c).length,inFlight:this.inFlightBootCount(c,void 0,S),admissionsByReason:this.admittedBoots.admissionsByReason(),hostPressure:{sustained:this.pressuredStreak>=this.sustainedSamples,consecutiveSamples:this.pressuredStreak,memoryPressure:c.host?.memoryPressure??"unknown"}}))}async sampleInWindow(d,c){d.signal?.throwIfAborted();let S=this.admittedBoots.beginSample();try{let D=this.timer.now()+ec,C=this.jitteredRetryAfterMs(),x=await l(async()=>{let T=await this.fleet.collectFresh({deadlineMs:D});return d.ownership?this.refreshOwnership(T):T},{timer:this.timer,timeoutMs:ec,signal:d.signal,label:`Collecting ${Fi}`,timeoutError:()=>new Ve("ios",{code:"timeout",message:`timed out after ${ec}ms collecting ${Fi}`,retryable:!0,retryAfterMs:C},void 0,C)});return d.signal?.throwIfAborted(),c(x,S)}finally{S.close()}}jitteredRetryAfterMs(){return Math.round(this.retryAfterMs*(1+this.random.next()))}assertCountKnown(d){if(!d.inventoryFailed)return;let c=d.errors.join("; ")||"simctl list failed";throw e.warn(`[BootAdmission] iOS simulator count unknown; refusing to boot: ${c}`),new Ve("ios",{code:"failed",message:`simulator count unknown (${c})`,retryable:!0})}forgetExitedStarted(d){let c=new Set(eS(d));for(let S of this.startedUdids)if(c.has(S))this.seenStartedUdids.add(S);else if(this.seenStartedUdids.delete(S))this.forgetStarted(S)}forgetStarted(d){this.startedUdids.delete(d),this.seenStartedUdids.delete(d),this.bootsByUdid.delete(d)}inFlightBootCount(d,c,S){return this.admittedBoots.inFlightCount(new Set(eS(d)),c,S)}countLimits({maxBooted:d,source:c,warning:S}){return{maxBooted:d,source:c,...S?{warning:S}:{}}}limitsFor(d,c){if(!d.host){if(!this.warnedHostUnreadable)this.warnedHostUnreadable=!0,e.warn("[BootAdmission] host resources unreadable; limiting simulator boots to 1");return this.warnOnUnusableLimit(pN(this.env,{totalMemoryBytes:0,cpuCount:0}))}let{boots:S}=this.admittedBoots.inFlightView(new Set,void 0,c);return this.warnOnUnusableLimit(pN(this.env,d.host,EH(d,S)))}warnOnUnusableLimit(d){if(d.warning&&d.warning!==this.warnedLimit)this.warnedLimit=d.warning,e.warn(`[BootAdmission] ${d.warning}`);if(d.bootConcurrencyWarning&&d.bootConcurrencyWarning!==this.warnedBootConcurrency)this.warnedBootConcurrency=d.bootConcurrencyWarning,e.warn(`[BootAdmission] ${d.bootConcurrencyWarning}`);return this.bootGate.setLimit(d.bootConcurrency),d}}function Li(d){Mt(d,"ios","simulator")}import{totalmem as Gg}from"os";async function $i(d,c={}){let S=await d.executeCommand("ps",kC,{signal:c.signal,timeoutMs:c.timeoutMs,maxBuffer:Cee}),{rows:D,skipped:C}=lW(S.stdout);if(D.length===0)throw Error(`ps returned no parseable processes (${C} unparseable rows)`);return D}var Bd=["list","devices","--json"];function kd(d){let c=Rm(d).devices;if(c===null||typeof c!=="object")throw Error("simctl list output has no devices map");return Object.entries(c).flatMap(([S,D])=>(Array.isArray(D)?D:[]).flatMap((C)=>Og(S,C)))}function Og(d,c){if(typeof c.udid!=="string"||typeof c.state!=="string")return[];return[{udid:c.udid,name:typeof c.name==="string"?c.name:c.udid,state:c.state,runtime:d,deviceTypeIdentifier:typeof c.deviceTypeIdentifier==="string"?c.deviceTypeIdentifier:void 0,dataPathSizeBytes:typeof c.dataPathSize==="number"?c.dataPathSize:void 0,isAvailable:c.isAvailable!==!1}]}var Mg=["-l","1","-stats","pid,mem"],Ng=16777216,Fg={B:1,K:1024,M:1048576,G:1073741824,T:1099511627776},Lg=/^\s*(\d+)\s+(\d+(?:[.,]\d+)?)([BKMGT])?[+-]?\s*$/;function $g(d){let c=new Map,S=0,D=!1;for(let C of d.split(`
159
+ `)){if(!D){D=/^\s*PID\s+MEM\b/.test(C);continue}if(C.trim()==="")continue;let x=Lg.exec(C);if(x)c.set(Number(x[1]),Math.round(Number(x[2].replace(",","."))*Fg[x[3]??"B"]));else S+=1}return{footprints:c,skipped:S}}async function Ug(d,c={}){let S=await d.executeCommand("top",Mg,{signal:c.signal,timeoutMs:c.timeoutMs,maxBuffer:Ng}),{footprints:D,skipped:C}=$g(S.stdout);if(D.size===0)throw Error(`top returned no parseable footprints (${C} unparseable rows)`);return D}var qg=20000,Hg=60000,Vg=5000,Wg=300000;class Gn{executor;timer;limits;cached;inFlight;constructor(d,c,S={}){this.executor=d;this.timer=c;this.limits=S}async read(d={}){d.signal?.throwIfAborted();let c=this.cachedWithin(this.limits.ttlMs??qg);if(c)return c;let S=Math.min(d.timeoutMs??Number.POSITIVE_INFINITY,this.limits.maxWaitMs??Vg);try{return await l(()=>this.run(),{timer:this.timer,timeoutMs:S,signal:d.signal,label:"Reading host memory footprints"})}catch(D){d.signal?.throwIfAborted();let C=this.cachedWithin(this.limits.staleMaxAgeMs??Wg);if(C)return e.warn(`using stale host footprints: ${r(D)}`),C;throw D}}cachedWithin(d){return this.cached&&this.timer.now()-this.cached.takenAtMs<d?this.cached.footprints:void 0}run(){if(!this.inFlight){let d=Ug(this.executor,{timeoutMs:this.limits.runTimeoutMs??Hg}).then((c)=>(this.cached={takenAtMs:this.timer.now(),footprints:c},c)).finally(()=>{if(this.inFlight===d)this.inFlight=void 0});this.inFlight=d,d.catch((c)=>{e.debug(`host footprint run failed: ${r(c)}`)})}return this.inFlight}}function $d(d,c){return d.map((S)=>{let D=c.get(S.pid);return D===void 0?S:{...S,footprintBytes:D}})}var jn={totalMemoryBytes:()=>Gg(),cpuCount:()=>uW.cpuCount(),loadAverage1m:()=>uW.loadAverage1m()},jg=["-n","kern.memorystatus_vm_pressure_level"];function Kg(d){switch(d.trim()){case"1":return"normal";case"2":return"warn";case"4":return"critical";default:return"unknown"}}class jP{executor;timer;os;simctl;footprintReader;constructor(d,c,S=jn,{simctl:D=new F(null),footprintReader:C=new Gn(d,c)}={}){this.executor=d,this.timer=c,this.os=S,this.simctl=D,this.footprintReader=C}async readHostSnapshot(d={}){let[c,S]=await Promise.all([this.readProcesses(d),this.readResources(d)]);return{takenAtMs:this.timer.now(),resources:S,...c}}async readInventory(d={}){let c=await this.simctl.executeCommandArgs([...Bd],d.timeoutMs,d.signal);return kd(c.stdout)}async readProcesses(d){let[c,S]=await Promise.allSettled([$i(this.executor,d),this.footprintReader.read(d)]);if(c.status==="rejected")return e.warn(`host process table read failed: ${r(c.reason)}`,c.reason),{processes:[],processesError:r(c.reason)};if(S.status==="rejected")return e.warn(`host footprint read failed: ${r(S.reason)}`,S.reason),{processes:c.value,footprintError:r(S.reason)};return{processes:$d(c.value,S.value)}}async readResources(d){return{totalMemoryBytes:this.os.totalMemoryBytes(),cpuCount:this.os.cpuCount(),loadAverage1m:this.os.loadAverage1m(),memoryPressure:await this.readMemoryPressure(d)}}async readMemoryPressure(d){try{let c=await this.executor.executeCommand("sysctl",jg,{signal:d.signal,timeoutMs:d.timeoutMs});return Kg(c.stdout)}catch(c){return e.debug(`memory pressure read failed: ${r(c)}`),"unknown"}}}import{createHash as Jg}from"crypto";function Ui(d){return Object.keys(d).flatMap((c)=>{let S=d[c];return S===void 0?[]:[[c,S]]})}function gI(d){return Jg("sha256").update(Cr(Object.fromEntries(Ui(d.resources)))).digest("hex")}var zg={state:"unknown",reason:"The observation did not report this resource."};function fN(d,c,S={}){let D=[];for(let[C,x]of Ui(d)){let T=c[C]??zg;if(T.state===x)continue;let B=T.state==="unsupported"?"unsupported":T.state==="unknown"?"commandFailure":"missingRequested";D.push({resource:C,kind:B,expected:x,observed:T})}for(let[C,x]of Ui(S)){let T=c[C];if(d[C]===void 0&&T?.state===x)D.push({resource:C,kind:"ownedExtra",expected:x,observed:T})}return D}function _H(d,c,S,D){let C={...d};for(let x of S)if(c[x]==="disabled")C[x]="disabled";else if(c[x]==="enabled")delete C[x];return Object.fromEntries(Ui(C).filter(([x,T])=>{let B=D[x]?.state;return T==="disabled"&&B!=="enabled"&&B!=="unsupported"}))}function Xg(d){return gI(d??{resources:{}})}class Kn{options;constructor(d){this.options=d}async reserveBoot(d){return this.options.gate?this.options.gate.reserveBoot(d):new Ze().hold(()=>{},()=>{})}async run(d,c){let{history:S,timer:D,gate:C}=this.options,x=Xg(d.profile),T=C?await this.admit(C,d,x):void 0,B=D.now(),O,N=!0;try{O=await c(d.timeoutMs),N=!1}finally{T?.(N?{bootFailed:!0}:void 0)}let H=D.now();return S.record({reason:d.reason??"create",udid:d.udid,profileId:x,durationMs:H-B,recordedAtMs:H}),O}async admit(d,c,S){let D=await d.admitBoot({runtime:c.runtime,profileId:S,excludeUdids:[c.udid]},{signal:c.signal,bootUdid:c.udid,reason:c.reason});if(Li(D),D.decision.outcome==="reuse-warm")(this.options.logger??e).info(`compatible warm simulator ${D.decision.udid} is booted; booting ${c.udid} as requested`);return D.releaseAdmission}}function Ud(d){let c=d.env??process.env;if(!Ei("ios",c))return;let{timer:S}=d;return new Vn(new zP(new jP(d.executor??new ne,S,void 0,{simctl:d.simctl}),d.history,S),S,{env:c,ownership:d.ownership})}function yI(d){return new Kn({history:d.history??new WP,timer:d.timer,gate:d.gate})}var qd=g.ANDROID_MAX_BOOTED.name,Hd="binding replacement",Yg=2000;class Jn{source;timer;env;retryAfterMs;resolvedHardware;ledger;reservations=new Ze;hostRegistry;publications=new Map;lastProcessTableFailure;admissionsWithoutProcessTable=0;lastAdmissionWithoutProcessTableAtMs;warnedLimit;startedSerials=new Set;listedStartedSerials=new Set;constructor(d,c,S={}){this.source=d;this.timer=c;this.env=S.env??process.env,this.retryAfterMs=S.retryAfterMs??hI,this.resolvedHardware=S.resolvedHardware,this.ledger=new Ft(c),this.hostRegistry=S.hostRegistry}async admit(d){return d.signal?.throwIfAborted(),this.reservations.take()??(await this.admitNew(d)).admission}async reserveBoot(d){let c=await this.admitNew({...d,avdName:Hd},d.replacingDeviceId);return this.reservations.hold(()=>(c.bind(),c.admission),c.admission.release,c.markReplacedDeviceGone)}async admitNew(d,c){let S=this.timer.now()+d.timeoutMs,D=this.resolvedHardware?await this.candidateHardware(d):void 0,C,x,T=[],B,O=()=>Ot({timer:this.timer,platform:"android",signal:d.signal,sampleTimeoutMs:Math.min(d.timeoutMs,ec),label:"Android emulator capacity",sample:async()=>{let G=this.timer.now()+Math.min(d.timeoutMs,ec)-500,ie=this.readPeers(),re=await this.sampleKnownCount({signal:d.signal,deadlineMs:G});return B=re,T=this.unionPeers(ie,this.readPeers()),re},ledger:this.ledger,decide:(G,ie)=>this.decide(G,{window:ie,peers:T,replacingDeviceId:c,candidate:D}),admit:()=>{C=this.ledger.admit(c,c!==void 0);try{if(x=this.hostRegistry?.publish({admittedUntilMs:S,...c!==void 0?{deviceId:c,replacement:!0}:{}}),x)this.publications.set(x,{})}catch(G){throw C.release(),this.registryFailure(G)}return C.release}}),N=await this.runWithHostLock(d,O).catch((G)=>{throw C?.release(),this.removePublication(x),G});Mt(N,"android","emulator");let H=C;if(!H)throw new t(`Boot admission for AVD '${d.avdName}' ended without a slot`);if(B?.processTableFailure)this.recordAdmissionWithoutProcessTable(d.avdName,B);let V=new Set,q=!1;return{admission:{release:()=>{q=!0,H.release(),this.removePublication(x);for(let G of V)if(!this.listedStartedSerials.has(G))this.startedSerials.delete(G);V.clear()},handOff:(G,ie)=>{if(q)return;if(G!==void 0)this.startedSerials.add(G),V.add(G);H.handOff(G,S,ie);let re=x?this.publications.get(x):void 0;if(re)re.deviceId=G??re.deviceId,re.handedOffUntilMs=S;this.updatePublication(x,()=>x?.update({deviceId:G,processId:ie,handedOffUntilMs:S,...c!==void 0?{replacement:!1}:{}}))}},markReplacedDeviceGone:()=>{H.bind();try{x?.clearDeviceId()}catch(G){e.warn(`[BootAdmission] Failed to clear replaced device '${c}' from the host registry; continuing replacement with the reservation held. The stale record keeps the replaced device id until boot hand-off; peers may undercount only if that serial is reused: ${r(G)}`,G)}},bind:()=>H.bind()}}async assertCapacityAvailable(d={}){if(d.signal?.throwIfAborted(),this.reservations.hasPending())return;let{sample:c,window:S,peers:D}=await this.sampleInWindow(d);Mt({decision:this.decide(c,{window:S,peers:D})},"android","emulator")}async describeCapacity(d={}){let{sample:c,window:S,peers:D}=await this.sampleInWindow(d),C=this.count(c,S,D);return{limit:C.limits.maxBooted,booted:C.booted,inFlight:C.inFlight,...this.describeProcessTable(c)}}recordAdmissionWithoutProcessTable(d,c){let S=c.processTableFailure;this.admissionsWithoutProcessTable+=1,this.lastAdmissionWithoutProcessTableAtMs=this.timer.now();let D=`[BootAdmission] Admitted AVD '${d}' on adb-only count ${c.emulatorSerials.length}: ${S.reason}, attempts=${S.attempts}: ${S.detail}`;if(S.reason==="unsupported-platform")e.debug(D);else e.warn(D)}describeProcessTable(d){let c=d.processTableFailure??this.lastProcessTableFailure;if(!c||!d.processTableFailure&&this.admissionsWithoutProcessTable===0)return{};return{processTable:{unavailable:d.processTableFailure!==void 0,reason:c.reason,detail:c.detail,attempts:c.attempts,admissionsWithoutProcessTable:this.admissionsWithoutProcessTable,...this.lastAdmissionWithoutProcessTableAtMs!==void 0?{lastAdmissionWithoutProcessTableAtMs:this.lastAdmissionWithoutProcessTableAtMs}:{}}}}async sampleInWindow(d){d.signal?.throwIfAborted();let c=this.ledger.beginSample(),S=new AbortController,D=d.signal?AbortSignal.any([d.signal,S.signal]):S.signal;try{let C=this.readPeers(),x=await l(()=>this.sampleKnownCount({signal:D}),{timer:this.timer,timeoutMs:ec,signal:d.signal,label:"Collecting Android emulator capacity",timeoutError:()=>Ln("android",ec,"Android emulator capacity"),onTimeout:()=>S.abort()});return d.signal?.throwIfAborted(),{sample:x,window:c,peers:this.unionPeers(C,this.readPeers())}}finally{c.close()}}async sampleKnownCount(d){let c=await this.source.sample({...d,deadlineMs:d.deadlineMs??this.timer.now()+ec-500});if(c.processTableFailure)this.lastProcessTableFailure=c.processTableFailure;if(c.errors.length===0)return c;let S=c.errors.join("; ");if(c.serialListingFailed&&c.emulatorProcessRssBytes===void 0)throw e.warn(`[BootAdmission] Android emulator count unknown; refusing to boot: ${S}`),new Gr({code:"failed",message:`emulator count unknown (${S})`,retryable:!0});return e.debug(`[BootAdmission] Android capacity sample partially failed: ${S}`),c}decide(d,{window:c,peers:S=[],replacingDeviceId:D,candidate:C}={}){this.forgetExitedSerials(d);let{limits:x,effective:T}=this.count(d,c,S,C),B=D!==void 0&&d.emulatorSerials.includes(D)?1:0;if(T-B<x.maxBooted)return{outcome:"allow",limits:x,bootedCount:T};return Ti(T,x,this.retryAfterMs,{noun:"emulator",envName:qd,externalDevices:d.emulatorSerials.filter((O)=>!this.startedSerials.has(O))})??{outcome:"allow",limits:x,bootedCount:T}}forgetExitedSerials(d){if(d.serialListingFailed)return;let c=new Set(d.emulatorSerials);for(let S of this.startedSerials)if(c.has(S))this.listedStartedSerials.add(S);else if(this.listedStartedSerials.delete(S))this.startedSerials.delete(S)}count(d,c,S=[],D){this.removeListedPublications(d);let C=d.emulatorSerials.length,x=d.emulatorProcessRssBytes?.length??0,T=new Set((d.emulatorProcessIds??[]).flatMap((ie)=>[ie.pid,ie.ppid])),B=this.ledger.inFlightView(new Set(d.emulatorSerials),void 0,c,T),O=this.countPeers(S,new Set(d.emulatorSerials),T),N=B.count+O.count,H=Math.max(C,x),V=N-B.withListedProcess-O.withListedProcess,q=Math.max(C+N,x+V),W=Math.max(C+N,x+V+B.listedWithoutProcess+O.listedWithoutProcess),G=this.limitsFor(d,[...B.boots,...O.boots],D);return{booted:H,inFlight:q-H,effective:W,limits:G}}async runWithHostLock(d,c){if(!this.hostRegistry)return c();let S=!1,D=async()=>{try{return await c()}catch(C){throw S=!0,C}};try{return await this.hostRegistry.withAdmissionLock({timeoutMs:Math.min(d.timeoutMs,ec),signal:d.signal},D)}catch(C){if(d.signal?.aborted)throw d.signal.reason;if(S)throw C;throw this.registryFailure(C)}}readPeers(){try{return this.hostRegistry?.readPeerAdmissions()??[]}catch(d){throw this.registryFailure(d)}}registryFailure(d){return e.warn(`[BootAdmission] Android host registry refused admission: ${r(d)}`,d),new Gr({code:d instanceof Qe?d.code:"failed",message:`Host boot registry: ${r(d)}`,retryable:!0})}unionPeers(d,c){return[...new Map([...d,...c].map((S)=>[S.id,S])).values()]}countPeers(d,c,S){let D=d.filter((B)=>{let O=B.handedOffUntilMs??B.admittedUntilMs;return O===void 0||this.timer.now()<O}),C=(B)=>B.deviceId!==void 0&&c.has(B.deviceId),x=(B)=>B.processId!==void 0&&S.has(B.processId),T=D.filter((B)=>!C(B));return{count:T.length,boots:T.map((B)=>({processId:B.processId,handedOff:B.handedOffUntilMs!==void 0})),withListedProcess:T.filter(x).length,listedWithoutProcess:D.filter((B)=>C(B)&&!x(B)&&!B.replacement).length}}updatePublication(d,c){if(!d)return!1;try{return c(),!0}catch(S){return e.warn(`[BootAdmission] Host registry update/remove failed: ${r(S)}`,S),!1}}removePublication(d){if(!d)return;let c=this.publications.get(d);if(c)c.pendingRemoval=!0;if(this.updatePublication(d,()=>d.remove()))this.publications.delete(d)}removeListedPublications(d){for(let[c,S]of this.publications){let D=S.deviceId!==void 0&&d.emulatorSerials.includes(S.deviceId),C=S.handedOffUntilMs!==void 0&&this.timer.now()>=S.handedOffUntilMs;if(S.pendingRemoval||D||C)this.removePublication(c)}}coresPerDevice(d){return E(g.ANDROID_BOOT_BUDGET_VCPUS,this.env)?.trim().toLowerCase()==="configured"?d?.cpuCores:void 0}async candidateHardware(d){let c=this.resolvedHardware;if(!c||d.avdName===Hd)return;try{return await l(()=>c(d.avdName,d.signal),{timer:this.timer,timeoutMs:Yg,signal:d.signal,label:"Reading resolved AVD hardware"})}catch(S){if(d.signal?.aborted)throw S;e.warn(`[BootAdmission] Could not read resolved hardware for '${d.avdName}': ${r(S)}`,S);return}}limitsFor(d,c,S){let D=Ad(this.env,qd,d.host,{perDeviceBytes:Id(Oi(d.emulatorProcessRssBytes?.map((C,x)=>({rssBytes:C,...d.emulatorProcessIds?.[x]})),c,$n),S?.guestBytes,$n),coresPerDevice:this.coresPerDevice(S)});if(D.warning&&D.warning!==this.warnedLimit)this.warnedLimit=D.warning,e.warn(`[BootAdmission] ${D.warning}`);return D}}import{readFile as Qg}from"fs/promises";var wy={listEntries:()=>nr("/proc"),readText:(d)=>Qg(d,"utf8")},Vd=32;function Zg(d){let c=new Map;for(let S of d.split(`
160
+ `)){let D=S.indexOf(":");if(D>=0)c.set(S.slice(0,D).trim(),S.slice(D+1).trim())}return c}function Wd(d){if(d===void 0||!/^\d+$/.test(d))return;let c=Number(d);return Number.isSafeInteger(c)?c:void 0}function ev(d){if(d===void 0)return 0;let[c,S,D]=d.split(/\s+/),C=Wd(c);if(C===void 0||S!=="kB"||D!==void 0)return;let x=C*1024;return Number.isSafeInteger(x)?x:void 0}function tv(d,c,S){let D=Zg(c),C=Wd(D.get("PPid")),x=ev(D.get("VmRSS"));if(C===void 0||x===void 0)return;let T=S.split("\x00");if(T.at(-1)==="")T.pop();return{pid:d,ppid:C,rssBytes:x,command:S===""?`[${D.get("Name")??""}]`:T.join(" ")}}function iv(d){return d instanceof Error&&"code"in d&&(d.code==="ENOENT"||d.code==="ESRCH")}function rv(d){return typeof d==="object"&&d!==null&&"code"in d&&(d.code==="EACCES"||d.code==="EPERM")}async function ov(d,c){try{let S=await d.readText(`/proc/${c}/status`),D=await d.readText(`/proc/${c}/cmdline`),C=tv(Number(c),S,D);return{row:C,incomplete:C===void 0}}catch(S){if(rv(S))return e.debug(`[BootAdmission] skipping denied /proc/${c}: ${r(S)}`),{deniedError:S,incomplete:!0};if(!iv(S))throw u(S,`Reading /proc/${c}`);return e.debug(`[BootAdmission] skipping exited /proc/${c}: ${r(S)}`),{}}}async function Gd(d,{signal:c}={}){c?.throwIfAborted();let S=(await d.listEntries()).filter((B)=>/^\d+$/.test(B)),D=[],C=0,x=!1,T;for(let B=0;B<S.length;B+=Vd){c?.throwIfAborted();let O=await Promise.all(S.slice(B,B+Vd).map((H)=>ov(d,H))),N=O.flatMap(({row:H})=>H?[H]:[]);D.push(...N),C+=O.length-N.length,x||=O.some((H)=>H.incomplete),T??=O.find((H)=>H.deniedError!==void 0)?.deniedError}if(c?.throwIfAborted(),C>0)e.debug(`[BootAdmission] /proc skipped ${C} exited, denied or unparseable rows`);if(D.length===0){if(T!==void 0)throw u(T,"Reading /proc: no readable processes");throw Error(`/proc returned no parseable processes (${C} unparseable rows)`)}return{value:D,incomplete:x}}var av=new Map([["EAGAIN","spawn-resources"],["EMFILE","spawn-resources"],["ENFILE","spawn-resources"],["ENOMEM","spawn-resources"],["ENOENT","not-found"],["ENOTDIR","not-found"],["EACCES","denied"],["EPERM","denied"],["ERR_CHILD_PROCESS_STDIO_MAXBUFFER","output-too-large"]]),jd=new Set(["timeout","spawn-resources","exit","killed"]),dv=/operation not permitted|permission denied/i,cv=/illegal option|invalid option|unrecognized option|usage:/i,Kd=250,lv=3;function Xd(d){return Buffer.isBuffer(d)?d.toString():typeof d==="string"?d:""}function uv(d,c){if(d===0)return"unknown";let S=Xd(c);if(d===126||dv.test(S))return"denied";if(d===127)return"not-found";return cv.test(S)?"unsupported-flags":"exit"}function mv(d,c,S){return"killed"in d&&d.killed===!0&&c==="SIGTERM"&&S===null?"timeout":"killed"}function pv(d){let c="code"in d?d.code:void 0;if(typeof c==="string")return av.get(c)??"unknown";if(typeof c==="number")return uv(c,"stderr"in d?d.stderr:void 0);if("signal"in d&&typeof d.signal==="string")return mv(d,d.signal,c);return/^(?:ps|\/proc) returned no parseable processes/.test(r(d))?"unparseable":"unknown"}function fv(d,c,S){if(c==="timeout")return`timed out after ${S}ms`;if(c==="killed"&&"signal"in d)return`killed by ${String(d.signal)}`;let D="code"in d?d.code:void 0;if(typeof D==="number"){let x=Xd("stderr"in d?d.stderr:void 0).split(/\r?\n/).find((T)=>T.trim());return x?`exit ${D}: ${x}`:`exit ${D}`}let C=r(d);return typeof D==="string"?`${D}: ${C}`:C}function zd(d,c){let S=new Set,D="unknown",C=r(d);for(let x=d;typeof x==="object"&&x!==null&&!S.has(x);){if(S.add(x),"name"in x&&x.name==="AbortError")throw d;let T=pv(x);if(T!=="unknown")D=T,C=fv(x,T,c);x="cause"in x?x.cause:void 0}return{reason:D,detail:C.split(/\r?\n/,1)[0].slice(0,200)}}class Df{executor;timer;attemptTimeoutMs;maxAttempts;backoff;budgetMs;supported;warnedReasons=new Set;warnedProcReasons=new Set;procFs;exitDeterministicAfterSamples;consecutiveExitSamples=0;exitLatched=!1;procLatched=!1;constructor(d,c={}){this.executor=d;this.timer=c.timer??i,this.attemptTimeoutMs=c.attemptTimeoutMs??5000,this.maxAttempts=c.maxAttempts??4,this.backoff=xo(c.backoff??te({initialDelayMs:100,maxDelayMs:800})),this.budgetMs=c.budgetMs??9000,this.supported=c.processTableSupported??!0,this.procFs=c.procFs,this.exitDeterministicAfterSamples=c.exitDeterministicAfterSamples??lv}async read(d){try{return await this.readSupported(d)}catch(c){throw this.consecutiveExitSamples=0,e.debug(`[BootAdmission] process table read cancelled: ${r(c)}`),c}}async readSupported(d){if(d.signal?.throwIfAborted(),!this.supported)return this.failed({reason:"unsupported-platform",transient:!1,attempts:0,detail:"Host platform has no ps process table"});let c=d.deadlineMs??this.timer.now()+this.budgetMs;if(this.procLatched)return this.readProc(d,c);return this.readPs(d,c)}async readPs(d,c){let S;for(let D=1;;D++){d.signal?.throwIfAborted();let C=D===1?this.attemptTimeoutMs:Math.min(this.attemptTimeoutMs,c-this.timer.now());try{let x=await this.attempt((T)=>$i(this.executor,{signal:T,timeoutMs:C}),C,d.signal,"ps");if(this.resetExitLatch(),S)e.info(`[BootAdmission] emulator process snapshot succeeded on attempt ${D} after ${S}`);return{value:x}}catch(x){d.signal?.throwIfAborted();let{reason:T,detail:B}=zd(x,C),O=jd.has(T)&&!(T==="exit"&&this.exitLatched),N={reason:T,transient:O,attempts:D,detail:B},H=this.retryDelay(N,c);if(H===void 0)return this.finishPsFailure(N,x,d,c);if(S=T,await l(()=>this.timer.sleep(H),{timer:this.timer,signal:d.signal,label:"Android process table retry backoff"}),c-this.timer.now()<Kd)return this.finishPsFailure(N,x,d,c)}}}async attempt(d,c,S,D){let C=new AbortController,x=S?AbortSignal.any([S,C.signal]):C.signal;return l(()=>d(x),{timer:this.timer,timeoutMs:c,signal:S,label:`Android ${D} process table`,timeoutError:()=>{let T=Object.assign(Error(`timed out after ${c}ms`),{killed:!0,signal:"SIGTERM",code:null});return D==="ps"?bC(T,{command:"ps",args:kC}):T},onTimeout:()=>C.abort()})}resetExitLatch(){this.consecutiveExitSamples=0,this.exitLatched=!1,this.warnedReasons.delete("exit")}recordPsFailure(d){if(d.reason!=="exit"){this.consecutiveExitSamples=0;return}if(this.exitLatched)return;if(this.consecutiveExitSamples+=1,this.consecutiveExitSamples<this.exitDeterministicAfterSamples)return;this.exitLatched=!0,this.warnedReasons.add("exit"),e.warn(`[BootAdmission] ps exit repeated for ${this.consecutiveExitSamples} exhausted samples; retries stop until ps succeeds: ${d.detail}`)}finishPsFailure(d,c,S,D){if(this.recordPsFailure(d),!d.transient&&this.procFs)return this.readProc(S,D,d);return this.failed(d,r(c))}async readProc(d,c,S){let D=Math.max(0,Math.min(this.attemptTimeoutMs,c-this.timer.now()));try{let C=await this.attempt((x)=>Gd(this.procFs,{signal:x}),D,d.signal,"/proc");if(!this.procLatched)e.info(`[BootAdmission] ps unavailable (${S?.reason}: ${S?.detail}); using /proc process table instead`),this.procLatched=!0;return C}catch(C){d.signal?.throwIfAborted();let x=zd(C,D),T=S?`; ps ${S.reason}`:"",B=`/proc: ${x.detail.slice(0,193-T.length)}${T}`,O={...x,detail:B,transient:jd.has(x.reason),attempts:S?.attempts??0},N=this.failed(O,B,this.warnedProcReasons);return this.warnedProcReasons.add(O.reason),N}}retryDelay(d,c){if(!d.transient||d.attempts>=this.maxAttempts)return;let S=this.backoff.delayForAttempt(d.attempts);return this.timer.now()+S+Kd<=c?S:void 0}failed(d,c=d.detail,S=this.warnedReasons){let D=`[BootAdmission] emulator process snapshot unavailable: ${d.reason}, attempts=${d.attempts}: ${d.detail}`;if(d.reason==="unsupported-platform"||S.has(d.reason))e.debug(D);else e.warn(D);if(!d.transient)S.add(d.reason);return{failure:d,error:`ps: ${c}`}}}function Yd(d,c){return async(S)=>{let C=(await d.getDeviceStates({timeoutMs:c,signal:S,throwOnMissingAdb:!0})).map((x)=>x.deviceId).filter((x)=>x.startsWith("emulator-"));return[...new Set(C)]}}class zn{listEmulatorSerials;os;processTable;constructor(d,c,S=jn,D={}){this.listEmulatorSerials=d;this.os=S;this.processTable=new Df(c,D)}async sample(d={}){let c=await this.readSerials(d.signal),S=await this.processTable.read(d),D=S.value?.filter(Wh);return{emulatorSerials:c.value??[],emulatorProcessRssBytes:D?.map((C)=>C.rssBytes),emulatorProcessIds:D?.map((C)=>({pid:C.pid,ppid:C.ppid})),host:{totalMemoryBytes:this.os.totalMemoryBytes(),cpuCount:this.os.cpuCount()},errors:[c.error,S.error].filter((C)=>C!==void 0),...S.failure?{processTableFailure:S.failure}:{},...c.error!==void 0?{serialListingFailed:!0}:{}}}async readSerials(d){try{return{value:await this.listEmulatorSerials(d)}}catch(c){return d?.throwIfAborted(),e.warn(`[BootAdmission] adb emulator listing failed: ${r(c)}`,c),{error:`adb: ${r(c)}`}}}}var yv=5000;function wv(d=process.env,c){return vv(bu(Dh(d),"boot-admissions",d,c),"android")}var Qd,Xn;function XX(d){Xn=d}var bv={refresh:async()=>{await Xn?.refresh()},isAutoMobileOwned:(d)=>Xn?.isAutoMobileOwned(d)??!1};function Of(d={}){return Qd??=Sv(d),Qd}function Sv(d={}){let c=d.env??process.env,S=d.timer??i,D=new WP,C=!cn.bootAdmissionGatesDisabled&&Ei("android",c),x=new ne;return{android:C?new Jn(new zn(Yd({getDeviceStates:async(T)=>{let B=v.create(null);if(!B.getDeviceStates)throw new t("adb client cannot list raw device states");return B.getDeviceStates(T)}},yv),x,void 0,{timer:S,processTableSupported:(d.hostPlatform??process.platform)!=="win32",procFs:(d.hostPlatform??process.platform)==="linux"?wy:void 0}),S,{env:c,resolvedHardware:async(T)=>{let B=await new Kr().readConfig(T);return B?{...B.effectiveRamMb===void 0?{}:{guestBytes:B.effectiveRamMb*1024*1024},...B.effectiveCpuCores===void 0?{}:{cpuCores:B.effectiveCpuCores}}:void 0},hostRegistry:new Fn({timer:S,directory:()=>wv(c)})}):void 0,ios:cn.bootAdmissionGatesDisabled||(d.hostPlatform??process.platform)!=="darwin"?void 0:Ud({simctl:new F(null),timer:S,history:D,ownership:bv,env:c,executor:x}),iosBootHistory:D}}function hN(d){return d==="android"?"android":"ios"}async function tS(d,c={},S=Of()){await S[hN(d)]?.assertCapacityAvailable(c)}async function xH(d,c,S=Of()){return c.signal?.throwIfAborted(),await S[hN(d)]?.reserveBoot(c)??{run:(D)=>D(),release:()=>{},markReplacedDeviceGone:()=>{}}}var _v=3000;async function ZX(d,c=Rv(Of()),S=i){let D=await Promise.all(d.map(async(x)=>{let T=c[x];if(!T)return[];let B=new AbortController;try{let O=await l(()=>T.describeCapacity({signal:B.signal}),{timer:S,timeoutMs:_v,label:`Reporting ${x} boot capacity`,onTimeout:()=>B.abort()});return[[x,O]]}catch(O){return e.warn(`[BootAdmission] ${x} capacity report failed: ${r(O)}`,O),[]}})),C=Object.fromEntries(D.flat());return Object.keys(C).length>0?C:void 0}function Rv(d){return{...d.android?{android:d.android}:{},...d.ios?{ios:d.ios}:{}}}import{performance as Dv}from"perf_hooks";import Pv from"fs";import Cv from"path";var Iv="STARTUP_BENCHMARK";function Av(d,c){if(d.includes("--startup-benchmark"))return!0;return d.includes("--daemon-mode")&&$e(g.STARTUP_BENCHMARK,c)}var Ev=Av(process.argv,process.env),xv=E(g.STARTUP_BENCHMARK_OUTPUT),Tv=E(g.STARTUP_BENCHMARK_LABEL);class Zd{marks=new Map;phaseStarts=new Map;phases=new Map;emitted=!1;emittedReport;enabled;outputPath;label;now;fileSystem;constructor(d,c={}){this.enabled=d;let S=c.outputPath??xv;this.outputPath=S?Ae(S):void 0,this.label=c.label??Tv,this.now=c.now??Dv.now,this.fileSystem=c.fileSystem??Pv}isEnabled(){return this.enabled}mark(d){if(!this.enabled||this.marks.has(d))return;this.marks.set(d,this.now()),this.persistCheckpoint()}startPhase(d){if(!this.enabled||this.phases.has(d)||this.phaseStarts.has(d))return;this.phaseStarts.set(d,this.now()),this.persistCheckpoint()}async runPhase(d,c){this.startPhase(d);let S=await c();return this.endPhase(d),S}endPhase(d){if(!this.enabled||this.phases.has(d))return;let c=this.phaseStarts.get(d);if(c===void 0)return;this.phases.set(d,this.now()-c),this.phaseStarts.delete(d),this.persistCheckpoint()}recordPhase(d,c){if(!this.enabled||this.phases.has(d))return;this.phases.set(d,c),this.persistCheckpoint()}emit(d,c={}){if(!this.enabled||this.emitted)return;this.emitted=!0,this.emittedReport={type:d,meta:c};let S=this.createReport(d,"ready",c),D=JSON.stringify(S);if(this.writeReport(D),Uk()==="json"){e.info(D);return}process.stderr.write(`${Iv} ${D}
161
+ `)}persistCheckpoint(){if(!this.enabled)return;let d=this.emittedReport?this.createReport(this.emittedReport.type,"ready",this.emittedReport.meta):this.createReport("startup-checkpoint","in_progress");this.writeReport(JSON.stringify(d))}createReport(d,c,S={}){let D=Object.fromEntries(this.marks.entries()),C=Object.fromEntries(this.phases.entries());return{type:d,state:c,timestamp:new Date().toISOString(),pid:process.pid,label:this.label,marks:D,phases:C,activePhases:[...this.phaseStarts.keys()],memoryUsage:process.memoryUsage(),meta:S}}writeReport(d){if(!this.outputPath)return;let c=Cv.dirname(this.outputPath);if(!this.fileSystem.existsSync(c))this.fileSystem.mkdirSync(c,{recursive:!0});let S=`${this.outputPath}.${process.pid}.tmp`;this.fileSystem.writeFileSync(S,d,"utf-8"),this.fileSystem.renameSync(S,this.outputPath)}}var Et=new Zd(Ev);var gN=9000,kv=100;class ic{lifecycleProcess;timer;shutdownTimeoutMs;installed=!1;stdinShutdownHandlersInstalled=!1;stdoutShutdownHandlerInstalled=!1;stderrErrorGuardInstalled=!1;hangupShutdownHandlerInstalled=!1;shutdownInProgress=!1;shutdownStarted=Promise.withResolvers();shutdownHandler;shutdownExitCode;shutdownTimeoutHandler;fatalProcessHandler;constructor(d,c=i,S=gN){this.lifecycleProcess=d;this.timer=c;this.shutdownTimeoutMs=S}install(){if(this.installed)return;this.installed=!0,this.lifecycleProcess.on("SIGINT",()=>{this.shutdown("SIGINT")}),this.lifecycleProcess.on("SIGTERM",()=>{this.shutdown("SIGTERM")}),this.lifecycleProcess.on("uncaughtException",(d)=>{this.handleFatalProcessEvent({type:"uncaughtException",error:d})}),this.lifecycleProcess.on("unhandledRejection",(d,c)=>{this.handleFatalProcessEvent({type:"unhandledRejection",reason:d,promise:c})})}setShutdownHandler(d,c){this.shutdownHandler=d,this.shutdownTimeoutHandler=c}setFatalProcessHandler(d){this.fatalProcessHandler=d}setShutdownExitCode(d){this.shutdownExitCode=d}installHangupShutdownHandler(){if(this.hangupShutdownHandlerInstalled)return;this.hangupShutdownHandlerInstalled=!0,this.lifecycleProcess.on("SIGHUP",()=>{this.shutdown("SIGHUP")})}installStdinShutdownHandlers(d,c,S=gN){if(this.stdinShutdownHandlersInstalled)return;this.stdinShutdownHandlersInstalled=!0;let D=!1,C=()=>{if(D)return;D=!0;let x=void 0;try{x=c?.()}catch(T){Wi("Error in stdin client-gone callback",T)}if(x){if(this.shutdownInProgress){x.catch((T)=>Wi("Error in stdin answer wait",T));return}this.waitForStdinAnswers(x,S)}else this.shutdown("stdin")};d.on("end",C),d.on("error",C),d.on("close",C)}async waitForStdinAnswers(d,c){try{await l([d,this.shutdownStarted.promise],{timer:this.timer,timeoutMs:c,label:"stdin answer wait"})}catch(S){Wi("Error in stdin answer wait",S)}await this.shutdown("stdin")}installStdoutShutdownHandler(d,c){if(this.stdoutShutdownHandlerInstalled)return;this.stdoutShutdownHandlerInstalled=!0;let S=!1,D=()=>{if(S)return;S=!0;try{c?.()}catch(C){Wi("Error in stdout client-gone callback",C)}this.shutdown("stdout")};d.on("error",D),d.on("close",D)}installStderrErrorGuard(d){if(this.stderrErrorGuardInstalled)return;this.stderrErrorGuardInstalled=!0,d.on("error",()=>{})}requestShutdown(d){return this.shutdown(d)}async shutdown(d){if(this.shutdownInProgress)return;this.shutdownInProgress=!0,this.shutdownStarted.resolve();try{let c=await this.runShutdownHandler(d),S=this.shutdownExitCode??0;if(!c)Wi(`Shutdown timed out after ${this.shutdownTimeoutMs}ms; forcing exit`),S=(await this.runShutdownTimeoutHandler())?.exitCode??1;this.lifecycleProcess.exit(S)}catch(c){Wi(`Error during ${d} shutdown`,c),this.lifecycleProcess.exit(1)}}async runShutdownHandler(d){let c=this.shutdownHandler;if(!c)return!0;let S=Symbol("shutdown timeout");try{return await l(()=>Promise.resolve(c(d)),{timer:this.timer,timeoutMs:this.shutdownTimeoutMs,label:"Process shutdown",timeoutError:()=>S}),!0}catch(D){if(D!==S)throw D;return!1}}async runShutdownTimeoutHandler(){let d=this.shutdownTimeoutHandler;if(!d)return;let c=Math.min(this.shutdownTimeoutMs,kv),S=Symbol("shutdown finalization timeout");try{return await l(Promise.resolve(d()),{timer:this.timer,timeoutMs:c,label:"Shutdown finalization",timeoutError:()=>S})}catch(D){if(D!==S)throw D;Wi(`Shutdown finalization timed out after ${c}ms; forcing exit`);return}}async handleFatalProcessEvent(d){let c=this.fatalProcessHandler;if(!c){if(d.type==="uncaughtException")Wi("Uncaught exception",d.error);else Wi("Unhandled rejection",d.reason);this.lifecycleProcess.exit(1);return}try{await c(d)}catch(S){Wi("Error in fatal process handler",S),this.lifecycleProcess.exit(1)}}}var xe=new ic(process);function yN(){Ov(),xe.install()}function QX(){xe.installHangupShutdownHandler()}function eZ(d=process.stdin,c,S){xe.installStdinShutdownHandlers(d,c,S)}function tZ(d=process.stdout,c){xe.installStdoutShutdownHandler(d,c)}function Ov(d=process.stderr){xe.installStderrErrorGuard(d)}function rZ(d){return xe.requestShutdown(d)}function rS(d,c){xe.setShutdownHandler(d,c)}function nZ(d){xe.setShutdownExitCode(d)}function vN(d){xe.setFatalProcessHandler(d)}function DN(d,c){let S=parseInt(d??"",10);if(!isNaN(S)&&S>0&&S<65536)return S;c.warn(`Invalid port: ${d}`);return}function xI(d,c,S,D){if(!d)return;let C=S?Number(d):parseInt(d,10);if(!Number.isFinite(C)||C<=0){D.warn(`Invalid ${c}: ${d}`);return}return S?C:Math.round(C)}function rc(d,c,S){if(c===void 0)return;let D;try{D=S(d,c)}catch(C){return e.warn(`executionOwnerPid ${d} start identity could not be compared; trusting the PID alone: ${r(C)}`,C),"unknown"}if(D==="unknown")e.warn(`executionOwnerPid ${d} start identity could not be compared; trusting the PID alone`);return D}var CN="--session-config",hZ=g.SESSION_CONFIG.name,Mv="session-broker/v1",gZ="automobile/session";class Up extends t{code="session_config_invalid";constructor(d,c){super(`session_config_invalid: ${d}`,c);this.name="SessionConfigError"}}var Nv=f({contractVersion:ee(1),requestId:y().trim().min(1).max(256),device:hr(),preparationTimeoutMs:A().int().positive().optional(),idleTimeoutMs:A().int().min(120000).max(3600000).optional(),executionOwnerPid:A().int().positive().optional(),executionOwnerStartIdentity:y().min(1).max(256).optional()}).strict().refine((d)=>d.executionOwnerStartIdentity===void 0||d.executionOwnerPid!==void 0,{message:"executionOwnerStartIdentity requires executionOwnerPid",path:["executionOwnerStartIdentity"]});function f6(d){let c=Nv.safeParse(d);if(!c.success)throw new Up(`Invalid session configuration: ${c.error.message}`);let S=At(c.data.device);if(!S.ok)throw new Up(`${S.error.code}: ${S.error.message}`);return{...c.data,device:S.value}}function Fv(d,c){let S=d.trim();if(S.length===0)throw new Up("session config value is empty; pass inline JSON or a file path");let D=S;if(!S.startsWith("{"))try{D=c(S)}catch(x){throw new Up(`cannot read session config file ${S}: ${r(x)}`,{cause:x})}let C;try{C=JSON.parse(D)}catch{throw new Up(`session config ${S.startsWith("{")?"inline value":`file ${S}`} is not valid JSON`)}return f6(C)}function yZ(d){let c=d.flagValue??d.envValue;if(c===void 0)return;if(d.hasInitialSessionUuid||d.noProxy)throw new Up("session config is incompatible with --initial-session-uuid, and --no-proxy");return Fv(c,d.readFile)}function Lv(d,c){let S=d?.executionOwnerPid;if(S!==void 0&&!c(S))throw new Up(`executionOwnerPid ${S} is not a running process`)}function Uv(d,c){let S=d?.executionOwnerPid;if(S===void 0)return;let D=rc(S,d?.executionOwnerStartIdentity,c);if(D==="different")throw new Up(`executionOwnerPid ${S} no longer names the process described by executionOwnerStartIdentity (the PID was reused)`);return D}function vZ(d,c){let S=d?.executionOwnerPid;if(S===void 0)return;return Lv(d,c.isProcessRunning),Uv(d,(C,x)=>c.probe.compare(C,x))==="same"?d?.executionOwnerStartIdentity:c.probe.current(S)}function bZ(d){return d.includes(Mv)}function qi(d,c){let S=Xw(d,c);return S&&(S.inline||S.value)?S.value:void 0}var xc="--event-all-markers",Hv=g.EVENT_ALL_MARKERS.name;function ON(d){return Xw(d,[xc])?.value!==void 0}function Wv(d){return d.split(",").map((c)=>c.trim()).filter((c)=>c.length>0)}function MN(d,c){let S=qi(d,[xc])??c[Hv];if(!S)return[];return Wv(S)}var _u=[{field:"observeResultIncludeElements",cli:"--observe-result-include-elements",env:g.OBSERVE_RESULT_INCLUDE_ELEMENTS.name,featureFlagKey:"observe-result-include-elements",label:"--observe-result-include-elements"},{field:"toolResultsNoStructuredContent",cli:"--tool-results-no-structured-content",env:g.TOOL_RESULTS_NO_STRUCTURED_CONTENT.name,featureFlagKey:"tool-results-no-structured-content",label:"--tool-results-no-structured-content"},{field:"actionsDiffObserve",cli:"--actions-diff-observe",env:g.ACTIONS_DIFF_OBSERVE.name,featureFlagKey:"actions-diff-observe",label:"--actions-diff-observe"},{field:"actionsNoObserve",cli:"--actions-no-observe",env:g.ACTIONS_NO_OBSERVE.name,featureFlagKey:"actions-no-observe",label:"--actions-no-observe"},{field:"actionsCompactMetadata",cli:"--actions-compact-metadata",disableCli:"--no-actions-compact-metadata",env:g.ACTIONS_COMPACT_METADATA.name,featureFlagKey:"actions-compact-metadata",label:"--actions-compact-metadata"}];function NN(d,c){let S={observeResultIncludeElements:!1,toolResultsNoStructuredContent:!1,actionsDiffObserve:!1,actionsNoObserve:!1};for(let D of _u)if(D.field==="actionsCompactMetadata"){let C=D.disableCli?Nm(d,[D.disableCli]):void 0,x=Nm(d,[D.cli]);if(C===!0)S.actionsCompactMetadata=!1;else if(x!==void 0)S.actionsCompactMetadata=x;else if(c[D.env]==="0"||c[D.env]==="1")S.actionsCompactMetadata=c[D.env]==="1"}else S[D.field]=Nm(d,[D.cli])??c[D.env]==="1";return S}function qH(d,c){return d??c??!0}function SZ(d){let c=[];for(let S of _u)if(d[S.field])c.push(S.cli);else if(d[S.field]===!1&&S.disableCli)c.push(S.disableCli);return c}import nc from"path";var EI="--tool-outputs-dir",II="--tool-output-dir",p6=g.TOOL_OUTPUTS_DIR.name,Gv=g.TOOL_OUTPUTS_DIR.legacyName;function jv(d,c){let S=d?.trim();if(!S)return;return nc.isAbsolute(S)?S:nc.resolve(c,S)}function EN(d,c,S){let D=qi(d,[EI,II]);return jv(D??c[p6]??c[Gv],S)}function Lf(){return Xe(dn.TOOL_OUTPUTS)}var bt="setToolEnabled";function Nf(d){return d==="setToolEnabled"||d==="getAndroid"||d==="getApple"}var u6="ide/setSessionToolEnabled";function Kv(d){if(!d||typeof d!=="object")return[];let c=d.content;if(!Array.isArray(c))return[];return c.flatMap((S)=>{if(!S||typeof S!=="object"||S.type!=="text")return[];let D=S.text;return typeof D==="string"?[D]:[]})}function Jv(d){try{let c=JSON.parse(d);if(!c||typeof c!=="object")return;let{sessionUuid:S,scope:D}=c;return typeof S==="string"&&S.trim().length>0&&D==="connection-profile"?S:void 0}catch(c){if(!(c instanceof SyntaxError))throw c;return}}function Ff(d){return Kv(d).map(Jv).find((c)=>c!==void 0)}var Yn;function pZ(d){Yn=d}function oc(){if(!Yn)throw new t("No configurable tool name source is registered; the MCP tool registry has not been loaded.");return Yn.getConfigurableToolNames()}class ac{repository;startupDefaults;pendingLists=new Map;constructor(d,c=new Map){this.repository=d;this.startupDefaults=c}async isEnabled(d,c,S){let D=this.startupDefaults.get(c)??S;if(!d)return D;return(await this.listOverrides(d)).get(c)??D}async getOverride(d,c){return(await this.listOverrides(d)).get(c)}listOverrides(d){let c=this.pendingLists.get(d);if(c)return c;let S=this.repository.list(d);this.pendingLists.set(d,S);let D=()=>{if(this.pendingLists.get(d)===S)this.pendingLists.delete(d)};return S.then(D,D),S}async setEnabled(d,c,S){this.pendingLists.delete(d),await this.repository.set(d,c,S)}async setEnabledMany(d,c,S){this.pendingLists.delete(d);let D=c.map((C)=>({toolName:C,enabled:S}));if(this.repository.setMany){await this.repository.setMany(d,D);return}for(let C of D)await this.repository.set(d,C.toolName,C.enabled)}async deleteSession(d){this.pendingLists.delete(d),await this.repository.deleteSession(d)}}function sc(d){return d?.split(",").map((c)=>c.trim()).filter(Boolean)??[]}function dc(d,c,S){let D=[],C=new Set,x;for(let T of d)if(c.has(T))D.push(T);else if(Nf(T))C.add(T);else if(x===void 0)x=T;if(C.size>0)e.info(`Ignoring always-on tool name(s) ${[...C].join(", ")} from ${S}; they have no configurable enable/disable state.`);if(x!==void 0)throw Error(`Tool '${x}' is not a session-configurable tool name; ${S} accept session-configurable tools only (see the automobile:tools resource).`);return D}function zv(d,c){let S=Object.keys(d).find((H)=>b$(H));if(S)throw Error(`${S} is retired; use AUTOMOBILE_ENABLED_TOOLS or AUTOMOBILE_DISABLED_TOOLS with exact tool names.`);let D=sc(E(g.ENABLED_TOOLS,d)),C=sc(E(g.DISABLED_TOOLS,d)),x=dc([...D,...C],c,"AUTOMOBILE_ENABLED_TOOLS/AUTOMOBILE_DISABLED_TOOLS"),T=D.filter((H)=>x.includes(H)),B=C.filter((H)=>x.includes(H)),O=new Set(B),N=T.find((H)=>O.has(H));if(N)throw Error(`Tool '${N}' cannot be both enabled and disabled in environment defaults.`);return new Map([...T.map((H)=>[H,!0]),...B.map((H)=>[H,!1])])}function Xv(d,c,S){return dc(d,c,S)}function VH(d,c,S=[],D=[]){let x=Xv([...S,...D],c,"CLI startup defaults (--enable-tool/--disable-tool)"),T=new Set(x),B=S.filter((V)=>T.has(V)),O=D.filter((V)=>T.has(V)),N=new Set(O),H=B.find((V)=>N.has(V));if(H)throw Error(`Tool '${H}' cannot be both enabled and disabled in CLI defaults.`);return new Map([...zv(d,c),...B.map((V)=>[V,!0]),...O.map((V)=>[V,!1])])}var Hi,Zn=[],eo=[],to=!0;function wZ(d,c,S={}){Zn=[...d],eo=[...c],to=S.includeEnvironment??!0,Hi=void 0}function RZ(d,c=process.env){VH(to?c:{},d,Zn,eo)}function Fd(){if(!Hi){let{SqliteSessionToolSelectionRepository:d}=import.meta.require("./chunk-qv2918jt.js"),c=new Set(oc());Hi=new ac(new d,VH(to?process.env:{},c,Zn,eo))}return Hi}var mc=Lt(fd());import*as me from"fs/promises";import $t from"path";var cc="screen-capture-helper",Yv=448,lc=384,uc=448,Qv=30000,Zv=S5,Vi="screen-capture-helper",eh="screen-capture-helper.json";class _c{static instance=null;downloader;checksumCalculator;cacheDir;usesDefaultCacheDir;timer;cache;env;expectedChecksumOverride;releaseUrlOverride;downloadTimeoutMs;platform;inFlight=null;constructor(d={}){this.downloader=d.downloader??new fi,this.checksumCalculator=d.checksumCalculator??new tn,this.cacheDir=d.cacheDir??Xe(cc),this.usesDefaultCacheDir=d.cacheDir===void 0,this.timer=d.timer??i,this.cache=new Qi({downloader:this.downloader,checksumCalculator:this.checksumCalculator,timer:this.timer}),this.env=d.env??process.env,this.expectedChecksumOverride=d.expectedChecksum,this.releaseUrlOverride=d.releaseUrl,this.downloadTimeoutMs=d.downloadTimeoutMs??Qv,this.platform=d.platform??process.platform}static getInstance(){return _c.instance??=new _c,_c.instance}static resetInstances(){_c.instance=null}async ensure(){if(this.inFlight)return this.inFlight;return this.inFlight=this.doEnsure().finally(()=>{this.inFlight=null}),this.inFlight}async doEnsure(){let d=this.expectedChecksumOverride??Vee(this.env);if(d.length===0)return e.info("[SCREEN_CAPTURE_HELPER] Expected checksum unknown for the pinned version; no release helper can be trusted."),null;let c=await this.tryCache(d);if(c)return e.info("[SCREEN_CAPTURE_HELPER] Reusing verified release helper",{path:c}),c;return this.download(d)}get helperPath(){return $t.join(this.cacheDir,Vi)}get metadataPath(){return $t.join(this.cacheDir,eh)}async tryCache(d){return await this.cache.isCached({label:"[SCREEN_CAPTURE_HELPER]",subject:"helper",expectedSha256:d,metadataPath:this.metadataPath,parseMetadata:(S)=>th(S)?S:null,verifyArtifact:(S)=>this.isHelperExecutable(S.size)})?this.helperPath:null}async isHelperExecutable(d){try{let c=await me.stat(this.helperPath);return!(!c.isFile()||c.size!==d||this.platform!=="win32"&&(c.mode&73)===0)}catch(c){return e.debug("[SCREEN_CAPTURE_HELPER] No usable cached helper executable",{error:r(c)}),!1}}async ensureSecureCacheDir(){if(this.usesDefaultCacheDir)return si(cc);return await me.mkdir(this.cacheDir,{recursive:!0,mode:Yv}),this.cacheDir}async download(d){let c=await this.ensureSecureCacheDir(),S=$t.join(c,`${Zv}.download`),D=$t.join(c,`${Vi}.download`);return await this.cache.fetch({label:"[SCREEN_CAPTURE_HELPER]",expectedSha256:d,url:this.releaseUrlOverride??qee(this.env),archivePath:S,metadataPath:this.metadataPath,metadataMode:lc,downloadTimeoutMs:this.downloadTimeoutMs,afterDownload:(C)=>me.chmod(C,lc),mismatchError:(C,x)=>new t(`screen-capture-helper checksum verification failed. Expected: ${C}, Got: ${x}. The downloaded release asset is corrupted or tampered.`),timeoutError:()=>new t(`Timed out downloading screen-capture-helper after ${this.downloadTimeoutMs}ms. Check GitHub Release asset availability or set AUTOMOBILE_IOS_SCREEN_CAPTURE_HELPER for local development.`),publish:async(C,x)=>{await me.writeFile(D,ih(C),{mode:uc}),await me.chmod(D,uc);let{size:T}=await me.stat(D);return await me.rename(D,this.helperPath),e.info("[SCREEN_CAPTURE_HELPER] Downloaded and verified release helper",{path:this.helperPath,sha256:x}),{version:Ce(this.env),sha256:x??d,size:T,downloadedAt:this.timer.now()}},discard:()=>me.rm(D,{force:!0})}),this.helperPath}}function th(d){return typeof d==="object"&&d!==null&&"sha256"in d&&typeof d.sha256==="string"&&"size"in d&&typeof d.size==="number"}function ih(d){let c;try{c=new mc.default(d)}catch(D){throw new t(`screen-capture-helper release asset is not a valid zip archive: ${r(D)}`)}let S=c.getEntries().filter((D)=>!D.isDirectory&&$t.posix.basename(D.entryName)===Vi);if(S.length!==1)throw new t(`screen-capture-helper release asset must contain exactly one ${Vi}.`);try{return S[0].getData()}catch(D){if(D instanceof t)throw D;throw new t(`Unable to extract screen-capture-helper release asset: ${r(D)}`)}}import{existsSync as Gc}from"fs";import Xh from"path";var hc=Lt(fd());import*as Re from"fs/promises";import Gi from"path";var pc=384,rh=448,fc="video-server",gc="automobile-video.jar",vc="video-server-jar.json",nh="classes.dex";class Ld{static instance=null;static expectedChecksumOverride=null;downloader;checksumCalculator;cacheDir;usesDefaultCacheDir;timer;cache;env;inFlight=null;constructor(d={}){this.downloader=d.downloader??new fi,this.checksumCalculator=d.checksumCalculator??new tn,this.timer=d.timer??i,this.cache=new Qi({downloader:this.downloader,checksumCalculator:this.checksumCalculator,timer:this.timer}),this.env=d.env??process.env,this.usesDefaultCacheDir=d.cacheDir===void 0,this.cacheDir=d.cacheDir??Xe(fc)}static getInstance(){if(Ld.instance===null)Ld.instance=new Ld;return Ld.instance}static resetInstances(){Ld.instance=null,Ld.expectedChecksumOverride=null}static setExpectedChecksumForTesting(d){Ld.expectedChecksumOverride=d}async computeLocalJarIntegrity(d){let[{checksum:c},S]=await Promise.all([this.checksumCalculator.computeFileSha256(d),Re.stat(d)]);return{sha256:c.toLowerCase(),size:S.size}}get cachedJarPath(){return Gi.join(this.cacheDir,gc)}get metadataPath(){return Gi.join(this.cacheDir,vc)}expectedChecksum(){return Ld.expectedChecksumOverride??Lee(this.env)}async ensure(){if(this.inFlight!==null)return this.inFlight;return this.inFlight=this.doEnsure().finally(()=>{this.inFlight=null}),this.inFlight}async doEnsure(){let d=this.expectedChecksum();if(d.length===0)return e.info("[VIDEO_JAR] Expected checksum unknown for the pinned version; returning null without touching the network (jar is integrity-unverifiable)"),null;let c=await this.tryCache(d);if(c)return e.info("[VIDEO_JAR] Reusing verified cached jar",{path:c}),c;return this.download(d)}async tryCache(d){return await this.cache.isCached({label:"[VIDEO_JAR]",subject:"jar",expectedSha256:d,metadataPath:this.metadataPath,parseMetadata:(S)=>oh(S)?S:null,verifyArtifact:(S)=>this.isCachedJarIntact(S)})?this.cachedJarPath:null}async isCachedJarIntact(d){let c;try{c=await Re.stat(this.cachedJarPath)}catch(S){return e.debug(`[VIDEO_JAR] Cached jar file missing despite metadata: ${S}`),!1}if(c.size!==d.size)return e.warn("[VIDEO_JAR] Cached jar size differs from sidecar; will re-download",{expected:d.size,actual:c.size}),!1;return!0}async ensureSecureCacheDir(){if(this.usesDefaultCacheDir)return si(fc);return await Re.mkdir(this.cacheDir,{recursive:!0,mode:rh}),this.cacheDir}async download(d){let c=Fee(this.env),S=await this.ensureSecureCacheDir(),D=Gi.join(S,gc),C=`${D}.download`;return e.info("[VIDEO_JAR] Downloading persistent-encoder jar",{url:c,destination:C}),await this.cache.fetch({label:"[VIDEO_JAR]",expectedSha256:d,url:c,archivePath:C,metadataPath:Gi.join(S,vc),metadataMode:pc,afterDownload:(x)=>Re.chmod(x,pc),mismatchError:(x,T)=>new t(`video-server jar checksum verification failed. Expected: ${x}, Got: ${T}. The downloaded automobile-video.jar does not match the pinned release checksum; this indicates a corrupted or tampered download and is never silently accepted.`),publish:async(x,T)=>{if(!this.hasClassesDex(x))throw new t("video-server jar is not a valid zip containing classes.dex (truncated or error-page download).");let{size:B}=await Re.stat(x);return await Re.rename(x,D),e.info("[VIDEO_JAR] Downloaded, verified, and cached jar",{path:D,sha256:T}),{version:Ce(this.env),sha256:T??d,size:B,downloadedAt:this.timer.now()}}}),D}hasClassesDex(d){try{return new hc.default(d).getEntries().some((S)=>S.entryName===nh)}catch(c){return e.warn("[VIDEO_JAR] Structural check failed (not a valid zip)",{path:d,error:r(c)}),!1}}}function oh(d){return typeof d==="object"&&d!==null&&"sha256"in d&&typeof d.sha256==="string"&&"size"in d&&typeof d.size==="number"}var PZ="constrained-baseline";var h6=42,FN=8192;function AZ(d){return d==="main"?"4d002a":"42e02a"}function WH(d,c){return Math.ceil(d/16)*Math.ceil(c/16)}function yc(d){return d.length>=4&&(d[0]&31)===7?d.subarray(1,4).toString("hex"):void 0}function sh(d){let c=yc(d);return c?Number.parseInt(c.slice(4,6),16):void 0}function TZ(d,c="constrained-baseline"){let S=yc(d);if(S&&!g6(S,c))return{compatible:!1,reason:`H.264 SPS profile ${S.slice(0,4)} is incompatible with negotiated ${c}.`};let D=sh(d);if(D!==void 0&&D>42)return{compatible:!1,reason:`H.264 SPS level ${D} exceeds negotiated level 42.`};return{compatible:!0}}function g6(d,c){return c==="main"?dh(d):ah(d)}function ah(d){return Number.parseInt(d.slice(0,2),16)===66}function dh(d){return Number.parseInt(d.slice(0,2),16)===77}import{EventEmitter as bh}from"events";class IN{chunks=[];headChunk=0;headOffset=0;length=0;compactionWork=0;get retainedChunkCount(){return this.chunks.length}get compactionWorkUnits(){return this.compactionWork}append(d){if(d.length===0)return;this.chunks.push(d),this.length+=d.length}peek(d){if(d>this.length)throw RangeError(`cannot peek ${d} bytes from ${this.length}-byte queue`);if(d===0)return Buffer.alloc(0);let c=this.chunks[this.headChunk];if(c.length-this.headOffset>=d)return c.subarray(this.headOffset,this.headOffset+d);let D=Buffer.allocUnsafe(d);return this.copyTo(D,d),D}takeDetached(d){if(d>this.length)throw RangeError(`cannot take ${d} bytes from ${this.length}-byte queue`);if(d===0)return Buffer.alloc(0);let c=Buffer.allocUnsafe(d);return this.copyTo(c,d),this.discard(d),c}discard(d){if(d>this.length)throw RangeError(`cannot discard ${d} bytes from ${this.length}-byte queue`);let c=d;while(c>0){let D=this.chunks[this.headChunk].length-this.headOffset;if(c<D){this.headOffset+=c,this.length-=c,c=0;break}this.headChunk++,this.headOffset=0,this.length-=D,c-=D}this.compact()}toBuffer(){if(this.length===0)return Buffer.alloc(0);let d=this.chunks[this.headChunk];if(this.headChunk===this.chunks.length-1)return d.subarray(this.headOffset);let c=Buffer.allocUnsafe(this.length);return this.copyTo(c,this.length),c}replace(d){this.chunks=d.length===0?[]:[d],this.headChunk=0,this.headOffset=0,this.length=d.length}compact(){if(this.headChunk===this.chunks.length){this.chunks.length=0,this.headChunk=0;return}if(this.headChunk*2>=this.chunks.length)this.chunks.splice(0,this.headChunk),this.compactionWork+=this.chunks.length,this.headChunk=0}copyTo(d,c){let S=0;for(let D=this.headChunk;S<c;D++){let C=this.chunks[D],x=D===this.headChunk?this.headOffset:0,T=C.length-x,B=Math.min(T,c-S);C.copy(d,S,x,x+B),S+=B}}}var ch=826690881,io=Buffer.from([65,77,70,49]),et=24,lh=8,Dc=16777216,Pc=16777216,bc=Math.max(Dc,Pc),uh=3798204416,mh=4294967294,ph=1;class oo{buffer=new IN;pendingHeader=null;highWaterMarkBytes=0;resynchronizing=!1;push(d,{onMalformed:c,onAudio:S,onEncodedVideo:D}={}){let C=0;while(C<d.length){let x=et+bc-this.buffer.length;if(x===0){if(!this.decodeAvailable({onMalformed:c,onAudio:S,onEncodedVideo:D}))throw Error("FrameDecoder reached its buffer limit without a complete record");continue}let T=Math.min(d.length,C+x);this.buffer.append(d.subarray(C,T)),this.highWaterMarkBytes=Math.max(this.highWaterMarkBytes,this.buffer.length),C=T,this.decodeAvailable({onMalformed:c,onAudio:S,onEncodedVideo:D})}}getMetrics(){return{bufferedBytes:this.buffer.length,highWaterMarkBytes:this.highWaterMarkBytes,maxBufferedBytes:et+bc}}decodeAvailable({onMalformed:d,onAudio:c,onEncodedVideo:S}={}){let D=!1;while(!0){if(this.resynchronizing&&!this.resynchronize())return D;if(this.pendingHeader===null){let B=this.takeHeader(d);if(B==="starved")return D;if(B==="malformed"){D=!0;continue}this.pendingHeader=B,D=!0}let C=this.pendingHeader,x=gh(C);if(this.buffer.length<x)return D;let T=this.buffer.takeDetached(x);this.emitRecord(C,T,{onAudio:c,onEncodedVideo:S}),this.pendingHeader=null,D=!0}}emitRecord(d,c,{onAudio:S,onEncodedVideo:D}){if(so(d)){S?.({pcm16le:c});return}D?.({keyframe:(d.height&ph)!==0,presentationTimestampMs:d.timestampMs,payload:c})}takeHeader(d){if(this.buffer.length<et)return"starved";let c=this.buffer.peek(et),S=Sc(c,0);if(S)return this.resynchronizing=!0,d?.({reason:S,header:no(c,0)}),"malformed";let D=no(c,0);return this.buffer.discard(et),D}resynchronize(){let d=this.buffer.toBuffer(),c=0;while(c<=d.length-io.length){let S=d.indexOf(io,c);if(S<0)break;if(S+et>d.length)return this.replaceBuffer(d.subarray(S)),!1;if(Sc(d,S)===null)return this.replaceBuffer(d.subarray(S)),this.resynchronizing=!1,!0;c=S+1}return this.replaceBuffer(d.subarray(Math.max(0,d.length-(io.length-1)))),!1}replaceBuffer(d){this.buffer.replace(d.length===0?Buffer.alloc(0):Buffer.from(d))}}function so(d){return d.width===0&&d.height===8000&&d.bytesPerRow===1}function fh(d){return d.width===0&&(d.height&mh)>>>0===uh}function gh(d){if(so(d))return d.timestampMs;return d.bytesPerRow}function no(d,c){return{width:d.readUInt32LE(c+8),height:d.readUInt32LE(c+12),bytesPerRow:d.readUInt32LE(c+16),timestampMs:d.readUInt32LE(c+20)}}function Sc(d,c){if(d.readUInt32LE(c)!==ch)return"header_magic_mismatch";if(d.readUInt32LE(c+4)!==wh(d.subarray(c+lh,c+et)))return"header_checksum_mismatch";return vh(no(d,c))}function vh(d){if(so(d))return d.timestampMs>Dc?"audio_payload_too_large":null;if(fh(d))return d.bytesPerRow>Pc?"encoded_video_payload_too_large":null;return"header_unsupported_record"}var hh=yh();function yh(){let d=new Uint32Array(256);for(let c=0;c<256;c++){let S=c;for(let D=0;D<8;D++)S=(S&1)!==0?3988292384^S>>>1:S>>>1;d[c]=S>>>0}return d}function wh(d){let c=4294967295;for(let S=0;S<d.length;S++)c=c>>>8^hh[(c^d[S])&255];return(c^4294967295)>>>0}var _N="automobile-frame-metrics:",Cc="capture-capability:",_I="encoded-video-h264",mZ="simulator-idle-evidence",HH="capture-permission:",xN="capture-permission-target:",ji=5,Ki=60,fZ=5;class Ty extends bh{binaryPath;target;spawner;timer;stopGraceMs;processGroupKiller;decoder=new oo;process=null;controlChannelErrored=!1;helperCapabilities=new Set;stderrBuffer="";exitPromise=null;nativeHelperRegistry;constructor(d){super();this.nativeHelperRegistry=d.nativeHelperRegistry,this.binaryPath=d.binaryPath,this.target=d.target,this.spawner=d.spawner??Th,this.timer=d.timer??i,this.stopGraceMs=d.stopGraceMs??Eh,this.processGroupKiller=d.processGroupKiller??Bh}on(d,c){return super.on(d,c)}emit(d,...c){return super.emit(d,...c)}get isRunning(){return this.process!==null&&this.process.exitCode===null&&!this.process.killed}start(){if(this.process!==null)throw Error("IOSScreenCaptureHelper already started");let d=kh(this.target);this.emitReadiness("helper-executable-found",this.binaryPath);let c=this.spawner(this.binaryPath,d,{detached:process.platform==="darwin",stdio:["pipe","pipe","pipe"]});(this.nativeHelperRegistry??yT()).track(c,{kind:"ios-capture-helper",processGroup:process.platform==="darwin"}),this.process=c,this.controlChannelErrored=!1,this.emitReadiness("helper-process-spawned",`pid=${c.pid??"?"}`),c.stdout.on("data",(S)=>{let D=Buffer.isBuffer(S)?S:Buffer.from(S);this.decoder.push(D,{onMalformed:(C)=>this.emit("malformed",C),onAudio:(C)=>this.emit("audio",C),onEncodedVideo:(C)=>this.emit("encodedVideo",C)})}),c.stderr.on("data",(S)=>{let D=Buffer.isBuffer(S)?S.toString("utf8"):String(S);this.appendStderr(D)}),c.stdin.on("error",(S)=>{this.controlChannelErrored=!0,e.warn("[IOSScreenCaptureHelper] stdin control channel failed",S)}),this.exitPromise=new Promise((S)=>{c.once("error",(D)=>{S({code:c.exitCode,signal:c.signalCode}),this.emit("error",D instanceof Error?D:Error(String(D)))}),c.once("exit",(D,C)=>{if(this.stderrBuffer.length>0)this.handleStderrLine(this.stderrBuffer),this.stderrBuffer="";let x={code:D,signal:C};this.emit("exit",x),S(x)})}),e.debug(`[IOSScreenCaptureHelper] spawned ${this.binaryPath} pid=${c.pid??"?"}`)}async stop(){let d=this.process;if(d===null)return null;if(d.exitCode!==null||d.killed){let S=await this.waitForExitWithinGrace();return this.cleanupProcess(d),S??{code:d.exitCode,signal:d.signalCode}}d.kill("SIGTERM");let c=await this.waitForExitWithinGrace();if(c!==null)return this.cleanupProcess(d),c;if(e.warn(`[IOSScreenCaptureHelper] helper pid=${d.pid??"?"} did not exit after SIGTERM; escalating to SIGKILL`),d.kill("SIGKILL"),process.platform==="darwin")if(d.pid!==void 0)try{this.processGroupKiller(d.pid,"SIGKILL")}catch(S){e.warn(`[IOSScreenCaptureHelper] process-group cleanup failed for pid=${d.pid}; detached children may leak: ${S}`)}else e.warn("[IOSScreenCaptureHelper] helper pid unknown after SIGKILL; cannot group-kill, detached children may leak");return this.cleanupProcess(d),{code:d.exitCode,signal:d.signalCode??"SIGKILL"}}appendStderr(d){if(this.stderrBuffer+=d,this.stderrBuffer.length>Ty.STDERR_BUFFER_MAX){this.emit("stderr",this.stderrBuffer),this.stderrBuffer="";return}let c=this.stderrBuffer.split(`
162
+ `);this.stderrBuffer=c.pop()??"";for(let S of c)this.handleStderrLine(S)}handleStderrLine(d){let c=Sh(d);if(c!==null){if(this.target.kind==="simulator"&&c===this.target.windowID)this.emit("idle",{windowID:c});return}let S=Ph(d);if(S!==null){this.emit("captureMetrics",S);return}let D=m6(d);if(D!==null){this.helperCapabilities.add(D),this.emit("capability",D);return}let C=_h(d);if(C!==null){this.emit("permission",C);return}let x=Rh(d);if(x!==null){this.emit("permissionTarget",x);return}this.emit("stderr",d),this.emitReadinessFromMarker(d)}get capabilities(){return this.helperCapabilities}supportsEncodedVideo(){return this.helperCapabilities.has(_I)}requestKeyFrame(){let d=this.process;if(d===null||!this.isRunning||this.controlChannelErrored||d.stdin.destroyed||d.stdin.writableEnded||d.stdin.errored)return!1;try{return d.stdin.write(`${JSON.stringify({cmd:"forceKeyFrame"})}
163
+ `),!0}catch(c){return e.debug(`[IOSScreenCaptureHelper] forceKeyFrame control write failed: ${c}`),!1}}assertSupportsEncodedVideo(){if(this.supportsEncodedVideo())return;throw new t("The screen-capture-helper did not advertise the '"+_I+"' capability at startup, so it cannot emit encoded H.264 video. This is an outdated helper. Unset AUTOMOBILE_IOS_SCREEN_CAPTURE_HELPER to use the checksum-pinned release helper, or point it at a build that advertises '"+_I+"'.")}async waitForExitWithinGrace(){let d=this.exitPromise??Promise.resolve(null),c=Error("Screen capture helper stop grace expired");try{return await l(d,{timer:this.timer,timeoutMs:this.stopGraceMs,label:"Screen capture helper stop",timeoutError:()=>c})}catch(S){if(S===c)return null;throw S}}cleanupProcess(d){if(d.stdout.removeAllListeners(),d.stderr.removeAllListeners(),d.removeAllListeners(),this.process===d)this.process=null}emitReadinessFromMarker(d){let c=d.trim();if(c.startsWith("capture-phase: permission-ready"))this.emitReadiness("permission-ready");else if(c.startsWith("capture-phase: resolved-window"))this.emitReadiness("target-resolved",c);else if(c.startsWith("capture-phase: capture-started"))this.emitReadiness("capture-started",c);else if(c.startsWith("capture-phase: first-frame"))this.emitReadiness("first-frame",c)}emitReadiness(d,c){this.emit("readiness",{phase:d,atMs:this.timer.now(),detail:c})}static STDERR_BUFFER_MAX=65536}function Sh(d){let c=/^capture-idle: windowID=(\d+)$/.exec(d.trim());if(!c)return null;let S=Number(c[1]);return Number.isSafeInteger(S)&&S>0?S:null}function m6(d){let c=d.trim();if(!c.startsWith(Cc))return null;let S=c.slice(Cc.length).trim();return S.length>0?S:null}function _h(d){let c=d.trim();if(!c.startsWith(HH))return null;let S=c.slice(HH.length).trim();return S==="screen-recording"?S:null}function Rh(d){let c=d.trim();if(!c.startsWith(xN))return null;let S=c.slice(xN.length).trim();return S.length>0?S:null}function Ph(d){if(!d.startsWith(_N))return null;try{let c=JSON.parse(d.slice(_N.length));if(!Ih(c))return null;return{...c,captureTimestampMs:c.captureTimestampMs??null,frameQueueAgeMs:c.frameQueueAgeMs??null,lastOutputWriteDurationMs:c.lastOutputWriteDurationMs??null}}catch(c){return e.debug(`[IOSScreenCaptureHelper] ignored malformed native frame metrics: ${r(c)}`),null}}function Ih(d){if(d===null||typeof d!=="object")return!1;let c=d;return ao(c.captureTimestampMs)&&ao(c.frameQueueAgeMs)&&(c.frameQueueDepth===0||c.frameQueueDepth===1)&&co(c.droppedFrames)&&co(c.bytesQueued)&&co(c.highWaterMarkBytes)&&ao(c.lastOutputWriteDurationMs)}function ao(d){return d===void 0||Ah(d)}function Ah(d){return d===null||typeof d==="number"&&Number.isFinite(d)}function co(d){return typeof d==="number"&&Number.isFinite(d)&&d>=0}var Eh=2000,xh=new ne,Th=(d,c,S)=>xh.spawn(d,c,S),Bh=(d,c)=>{process.kill(-d,c)};function kh(d){switch(d.kind){case"device":{let c=d.deviceId!==void 0?["--device-id",d.deviceId]:[];return Ac(c,d.encode),c}case"simulator":{let c=["--simulator-window",String(d.windowID)];if(d.fps!==void 0){if(!Number.isInteger(d.fps)||d.fps<ji||d.fps>Ki)throw RangeError(`simulator fps must be an integer in [${ji}, ${Ki}]; got ${d.fps}`);c.push("--simulator-fps",String(d.fps))}if(d.audio===!0)c.push("--audio");return Ac(c,d.encode),c}}}function Ac(d,c){if(c===void 0)return;if(d.push("--encode",c.codec),c.maxLongSide!==void 0)d.push("--max-long-side",String(c.maxLongSide));switch(c.bitrate.kind){case"explicitBps":d.push("--bitrate-bps",String(Math.round(c.bitrate.bps)));break;case"bitsPerPixel":d.push("--bits-per-pixel",String(c.bitrate.bpp));break;case"videoToolboxDefault":break}}var Tc=ji,Bc=Ki,y6=15,kc=1,Oc=60,v6=30,he={WHIP_ENDPOINT:g.WEBRTC_WHIP_ENDPOINT.name,WHIP_TOKEN:g.WEBRTC_WHIP_TOKEN.name,ICE_SERVERS:g.WEBRTC_ICE_SERVERS.name,BITRATE_KBPS:g.WEBRTC_BITRATE_KBPS.name,MAX_SIZE:g.WEBRTC_MAX_SIZE.name,IOS_SIMULATOR_FPS:g.WEBRTC_IOS_SIMULATOR_FPS.name,ANDROID_FPS:g.WEBRTC_ANDROID_FPS.name,TRICKLE_ICE:g.WEBRTC_TRICKLE_ICE.name,AUDIO:g.WEBRTC_AUDIO.name,ALLOW_INSECURE_WHIP:g.WEBRTC_ALLOW_INSECURE_WHIP.name,WHIP_ALLOWED_ORIGINS:g.WEBRTC_WHIP_ALLOWED_ORIGINS.name},Oh=[{urls:"stun:stun.l.google.com:19302"}];function Mh(d){if(!d||!d.trim())return;let c=d.trim();if(c.startsWith("[")){let S;try{S=JSON.parse(c)}catch{throw new t(`Invalid JSON in ${he.ICE_SERVERS}.`)}if(!Array.isArray(S))throw new t(`${he.ICE_SERVERS} JSON must be an array of { urls } objects.`);let D=[];for(let C of S)Nh(D,C);return D}return c.split(",").map((S)=>S.trim()).filter((S)=>S.length>0).map((S)=>({urls:S}))}function Nh(d,c){let{username:S,credential:D}=c??{};if(typeof c?.urls==="string")d.push({urls:c.urls,username:S,credential:D});else if(Array.isArray(c?.urls)&&c.urls.every((C)=>typeof C==="string"))for(let C of c.urls)d.push({urls:C,username:S,credential:D});else throw new t(`${he.ICE_SERVERS} JSON entries must have a string or string[] "urls".`)}function Fh(d){if(!d||!d.trim())return;let c=/^(\d+)\s*x\s*(\d+)$/i.exec(d.trim());if(!c)throw new t(`Invalid size "${d}"; expected WIDTHxHEIGHT (e.g. 1280x720).`);return Lc({width:Number(c[1]),height:Number(c[2])})}function Lh(d){if(!d||!d.trim())return;let c=Number(d.trim());if(!Number.isFinite(c)||c<=0)throw new t(`Invalid bitrate "${d}"; expected a positive number of kbps.`);return Math.round(c)}function zH(d={},c=process.env){let S=d.whipEndpoint??E(g.WEBRTC_WHIP_ENDPOINT,c);if(!S||!S.trim())throw new t(`No WHIP endpoint configured. Set ${he.WHIP_ENDPOINT} or pass whipEndpoint.`);let D=d.iceServers??Mh(E(g.WEBRTC_ICE_SERVERS,c))??Oh,{bitrateKbps:C,size:x,iosSimulatorFps:T,androidFps:B}=qh(d,c),O=d.trickleIce??$e(g.WEBRTC_TRICKLE_ICE,c),N=d.audioEnabled??$e(g.WEBRTC_AUDIO,c);return{whipEndpoint:Jh(S,c),bearerToken:d.bearerToken??E(g.WEBRTC_WHIP_TOKEN,c)??void 0,iceServers:D,bitrateKbps:C,size:x,iosSimulatorFps:T,androidFps:B,trickleIce:O,audioEnabled:N}}function qh(d,c){let S=d.bitrateKbps===void 0?Lh(E(g.WEBRTC_BITRATE_KBPS,c)):jh(d.bitrateKbps),D=d.size===void 0?Fh(E(g.WEBRTC_MAX_SIZE,c)):Lc(d.size),C=d.iosSimulatorFps===void 0?Hh(E(g.WEBRTC_IOS_SIMULATOR_FPS,c))??y6:Nc(d.iosSimulatorFps),x=d.androidFps===void 0?Gh(E(g.WEBRTC_ANDROID_FPS,c))??v6:Fc(d.androidFps);return{bitrateKbps:S,size:D,iosSimulatorFps:C,androidFps:x}}function Hh(d){if(!d||!d.trim())return;return Nc(Number(d.trim()),d.trim())}function Nc(d,c=String(d)){if(!Number.isInteger(d)||d<Tc||d>Bc)throw new t(`Invalid iOS Simulator capture fps "${c}"; expected an integer in [${Tc}, ${Bc}]. Set ${he.IOS_SIMULATOR_FPS} or pass iosSimulatorFps.`);return d}function Gh(d){if(!d||!d.trim())return;return Fc(Number(d.trim()),d.trim())}function Fc(d,c=String(d)){if(!Number.isInteger(d)||d<kc||d>Oc)throw new t(`Invalid Android capture fps "${c}"; expected an integer in [${kc}, ${Oc}]. Set ${he.ANDROID_FPS} or pass androidFps.`);return d}function jh(d){if(!Number.isFinite(d)||d<=0)throw new t(`Invalid bitrate "${d}"; expected a positive number of kbps.`);return Math.round(d)}function Lc(d){let{width:c,height:S}=d;if(!Number.isSafeInteger(c)||!Number.isSafeInteger(S)||c<=0||S<=0||c%2!==0||S%2!==0||WH(c,S)>FN)throw new t(`Invalid size "${c}x${S}"; width and height must be positive even integers within the H.264 Level 4.2 frame limit.`);return{width:c,height:S}}var Kh=new Set(["localhost","127.0.0.1","::1"]);function $c(d){let c=d.toLowerCase().replace(/^\[/,"").replace(/\]$/,"");if(Kh.has(c))return!0;return/^127(?:\.\d{1,3}){3}$/.test(c)}function Uc(d=process.env){return $e(g.WEBRTC_ALLOW_INSECURE_WHIP,d)}function qc(d){let c=d.trim(),S;try{S=new URL(c)}catch{throw new t(`Invalid WHIP endpoint "${c}"; expected an absolute http(s) URL.`)}if(S.protocol!=="http:"&&S.protocol!=="https:")throw new t(`Invalid WHIP endpoint "${c}"; expected an absolute http(s) URL.`);return S}function Jh(d,c=process.env){let S=qc(d);if(S.protocol==="http:"&&!$c(S.hostname)&&!Uc(c))throw new t(`Refusing plaintext WHIP endpoint "${d.trim()}": http:// is only permitted for loopback (127.0.0.1/localhost/::1) because the bearer token and SDP would travel in cleartext. Use https://, or set ${he.ALLOW_INSECURE_WHIP}=1 to allow insecure endpoints (not recommended).`);return d.trim()}function zh(d){if(!d||!d.trim())return[];return d.split(",").map((c)=>c.trim()).filter((c)=>c.length>0)}function Mc(d){let c=d.includes("://")?d:`https://${d}`;if(!URL.canParse(c))return;let S=new URL(c).origin;return S==="null"?void 0:S}function kZ(d,c=process.env){if(Uc(c))return;let S=qc(d);if($c(S.hostname))return;let D=new Set,C=E(g.WEBRTC_WHIP_ENDPOINT,c);if(C&&C.trim()){let x=Mc(C.trim());if(x)D.add(x)}for(let x of zh(E(g.WEBRTC_WHIP_ALLOWED_ORIGINS,c))){let T=Mc(x);if(T)D.add(T)}if(!D.has(S.origin))throw new t(`Refusing WHIP endpoint override "${d.trim()}": its origin ${S.origin} is not allow-listed. Add it to ${he.WHIP_ALLOWED_ORIGINS} (comma-separated origins), align it with the daemon's ${he.WHIP_ENDPOINT}, or set ${he.ALLOW_INSECURE_WHIP}=1 to accept arbitrary destinations (not recommended).`)}var Kc=g.VIDEO_SERVER_JAR.name,Vc=g.REQUIRE_VIDEO_SERVER.name,Yh=g.SKIP_VIDEO_SERVER_DOWNLOAD.name;function Xc(d){let c=d[Kc];return c&&Gc(c)?c:null}function Qh(d){let c=Xh.resolve(d,"android","video-server","build","libs","automobile-video.jar");return Gc(c)?c:null}async function LN(d={}){let c=d.env??process.env,S=d.cwd??process.cwd(),D=Xc(c);if(D)return e.info("[VIDEO_JAR] Using AUTOMOBILE_VIDEO_SERVER_JAR override",{path:D}),D;let C=$e(g.SKIP_VIDEO_SERVER_DOWNLOAD,c),x=$e(g.REQUIRE_VIDEO_SERVER,c);if(!C){let O=await(d.provider??Ld.getInstance()).ensure();if(O)return O}else e.info("[VIDEO_JAR] AUTOMOBILE_SKIP_VIDEO_SERVER_DOWNLOAD set; resolving local sources only");let T=Qh(S);if(T)return e.info("[VIDEO_JAR] Using local Gradle build output",{path:T}),T;if(x)throw new t(`${Vc} is set but no verifiable automobile-video.jar is available (no override, no ${C?"":"downloadable or "}locally-built jar). Provide ${Kc}, build \`:video-server:d8Dex\`, pin a release whose checksum registry includes videoJarSha256, or unset ${Vc} to allow the screenrecord fallback.`);return e.info("[VIDEO_JAR] No verifiable jar available; degrading to screenrecord"),null}async function EZ(d={}){let c=d.env??process.env;if(!c[he.WHIP_ENDPOINT]?.trim()){e.debug("[VIDEO_JAR] No WHIP endpoint configured; skipping background jar prefetch");return}if($e(g.SKIP_VIDEO_SERVER_DOWNLOAD,c)){e.debug(`[VIDEO_JAR] ${Yh} set; skipping background jar prefetch`);return}if(Xc(c)){e.debug("[VIDEO_JAR] Local override present; skipping background jar prefetch (download unused)");return}let D=d.provider??Ld.getInstance();e.info("[VIDEO_JAR] Prefetching video-server jar in the background (WebRTC streaming configured)");try{let C=await D.ensure();if(C)e.info("[VIDEO_JAR] Background prefetch warmed the jar cache",{path:C})}catch(C){e.warn(`[VIDEO_JAR] Background jar prefetch failed: ${r(C)}`,C)}}import{homedir as py}from"os";class lo{client;constructor(d){this.client=d}createSimulator(...d){return this.client.createSimulator(...d)}cloneSimulator(...d){return this.client.cloneSimulator(...d)}getCatalogChecked(...d){return this.client.getCatalogChecked(...d)}listSimulators(...d){return this.client.listSimulators(...d)}async deleteSimulator(d,c={}){let S=await this.client.listSimulators(void 0,c.signal);if(!Object.values(S.devices).flat().some((C)=>C.udid===d))return;await this.client.deleteSimulator(d,c);let D=await this.client.listSimulators(void 0,c.signal);if(Object.values(D.devices).flat().some((C)=>C.udid===d))throw new t(`Template simulator ${d} still exists after deletion. Retry template cleanup.`)}async boot(d,c){await U(c,()=>this.client.bootSimulator(d))}shutdownSimulator(d,c){return this.client.shutdownSimulator(d,c)}}class Ji extends t{constructor(d){super("Could not remove a partial simulator clone. Retry simulator cleanup before creating again.",{cause:d})}}class uo{creator;enabled;dependencies;cloneFailures=new Map;lifetime=new AbortController;async stop(){this.lifetime.abort(),await Promise.allSettled(this.flights.values())}flights=new Map;constructor(d,c,S){this.creator=d;this.enabled=c;this.dependencies=S}async create(d,c){if(d.signal?.throwIfAborted(),this.enabled())try{let S=await this.tryClone(d,c?.dependencies());if(S)return{udid:S,source:"clone"}}catch(S){if(S instanceof Ji)throw S;e.warn(`Template lookup failed; creating simulator: ${r(S)}`,S),d.signal?.throwIfAborted()}return{udid:await(c?.creator??this.creator).createSimulator(d.name,d.deviceType,d.runtime,d.signal),source:"create"}}async tryClone(d,c=this.dependencies()){let S=await this.resolveKey(c,d);if(!S)return;let D=await c.store.read(S);if(D&&!this.buildsMatch(D,S))await this.markStale(c,D,d.signal);if(D?.state==="ready"&&this.buildsMatch(D,S)){let C=await this.cloneReady(c,D,d);if(C.preserveTemplate)return C.udid;await this.markStale(c,D,d.signal)}if((D?.nextAttemptAtMs??0)<=c.timer.now())this.requestBuild(c,S);return}buildsMatch(d,c){return d.xcodeBuild===c.xcodeBuild&&d.runtimeBuild===c.runtimeBuild}async resolveKey(d,c){let S=(await d.client.getCatalogChecked(c.signal)).runtimes.find((C)=>C.identifier===c.runtime);if(!S?.buildversion)return;let D=await d.xcode.readBuild(c.signal);if(D==="unknown")return;return{xcodeBuild:D,runtime:c.runtime,runtimeBuild:S.buildversion,deviceType:c.deviceType,profile:d.profile()}}async cloneReady(d,c,S){let D=await d.client.listSimulators(void 0,S.signal),C=Object.values(D.devices).flat().find((T)=>T.udid===c.udid);if(C?.state!=="Shutdown"||C.name!==Wc(c.key))return{preserveTemplate:C?.name===Wc(c.key)};let x=new Set(Object.values(D.devices).flat().map((T)=>T.udid));try{let T=await d.client.cloneSimulator(c.udid,S.name,S.signal);return await d.relocator.relocate({templateUdid:c.udid,cloneUdid:T,signal:S.signal}),this.cloneFailures.delete(c.udid),{udid:T,preserveTemplate:!0}}catch(T){e.warn(`Template clone failed: ${r(T)}`,T);let B=this.cloneFailures.get(c.udid)??0;if(!S.signal?.aborted)B++,this.cloneFailures.set(c.udid,B);let O=await U(void 0,async()=>{await this.removeFailedClone(d,{...S,signal:void 0},x);let N=await d.client.listSimulators(),H=Object.values(N.devices).flat().find((V)=>V.udid===c.udid);return H?.name===Wc(c.key)&&(H.state!=="Shutdown"||S.signal?.aborted===!0||B<2)});if(S.signal?.aborted){if(!O)await U(void 0,()=>this.markStale(d,c));S.signal.throwIfAborted()}return{preserveTemplate:O}}}async removeFailedClone(d,c,S){try{let D=await d.client.listSimulators(void 0,c.signal);for(let C of Object.values(D.devices).flat())if(C.name===c.name&&!S.has(C.udid))await d.client.deleteSimulator(C.udid,{signal:c.signal})}catch(D){throw new Ji(D)}}async markStale(d,c,S){let D=await d.lock.acquire(c.key,S);if(!D)return;try{let C=await d.store.read(c.key);if(C?.udid===c.udid&&C.state==="ready")await d.store.write({...C,state:"stale"}),this.cloneFailures.delete(c.udid)}finally{D()}}requestBuild(d,c){let S=wm(c);if(this.flights.has(S))return;let D=Uh(()=>U(this.lifetime.signal,()=>Promise.resolve().then(()=>d.builder.build(c,this.lifetime.signal)).catch((C)=>{e.warn(`Background template build failed: ${r(C)}`,C)}).finally(()=>{this.flights.delete(S)})));this.flights.set(S,D)}}import{readFileSync as Zh,rmSync as ey}from"fs";import{join as po}from"path";var Yc=f({key:f({runtime:y(),runtimeBuild:y(),xcodeBuild:y(),deviceType:y(),profile:P(Object.keys(f5))}),udid:Ne([ee(""),y().regex(Vh)]),state:P(["building","ready","failed","stale"]),xcodeBuild:y(),runtimeBuild:y(),builtAtMs:A(),settledAtMs:A().optional(),failure:f({atMs:A(),reason:y()}).optional(),attempt:A().int().nonnegative().optional(),nextAttemptAtMs:A().optional()}).refine((d)=>d.state!=="ready"||d.udid!=="",{message:"Ready templates require a simulator UDID"});var ty={read:(d)=>{try{return Zh(d,"utf8")}catch(c){if(c instanceof Error&&"code"in c&&c.code==="ENOENT"){e.debug(`Template manifest is absent: ${d}`,c);return}throw u(c,`Could not read template manifest ${d}`)}},write:(d,c)=>pL(d,c),remove:(d)=>ey(d,{force:!0}),list:(d)=>xi(d).filter((c)=>/^[a-f0-9]{8}\.json$/.test(c))};class go{files;directory;constructor(d=ty,c=()=>Va(Qj("ios-sim-templates"))){this.files=d;this.directory=c}path(d){return po(this.directory(),`${wm(d)}.json`)}async read(d){let c=this.files.read(this.path(d));if(c===void 0)return;let S=this.parse(c,`${wm(d)}.json`);if(S&&Object.entries(d).some(([D,C])=>Reflect.get(S.key,D)!==C)){e.warn("Ignoring template manifest with mismatched key inputs");return}return S}parse(d,c){try{let S=Yc.safeParse(JSON.parse(d));if(!S.success||`${wm(S.data.key)}.json`!==c){e.warn(`Ignoring invalid template manifest ${c}`);return}return S.data}catch(S){e.warn(`Ignoring unreadable template manifest ${c}`,S);return}}async write(d){this.files.write(this.path(d.key),d)}async remove(d){this.files.remove(this.path(d))}async removeInvalid(d){let c=this.directory();for(let S of this.files.list(c)){let D=po(c,S),C=this.files.read(D);if(C===void 0||this.parse(C,S))continue;if(d&&!this.matchesRuntime(C,d))continue;this.files.remove(D)}}matchesRuntime(d,c){try{let S=f({key:f({runtime:y()})}).safeParse(JSON.parse(d)).data?.key.runtime;return S===void 0||S===c}catch(S){return e.warn("Removing corrupt template manifest with unreadable runtime metadata",S),!0}}async list(){let d=this.directory();return this.files.list(d).flatMap((c)=>{let S=this.files.read(po(d,c)),D=S===void 0?void 0:this.parse(S,c);return D?[D]:[]})}}import{join as Qc}from"path";class vo{timer;directory;options;constructor(d,c=()=>Va(Qj("ios-sim-templates")),S={}){this.timer=d;this.directory=c;this.options=S}path(d){return Qc(this.directory(),`${wm(d)}.lock`)}async acquire(d,c){return this.acquirePath(this.path(d),c)}acquireName(d,c){let S=/^automobile-template-([a-f0-9]{8})$/.exec(d)?.[1];if(!S)throw Error("Invalid template name");return this.acquirePath(Qc(this.directory(),`${S}.lock`),c)}async acquirePath(d,c){let S=(this.options.idGenerator??L).next();for(let D=0;D<2;D++){if(c?.throwIfAborted(),_i(d,{...this.options,ownerToken:S,ownerGeneration:this.options.ownerGeneration??Nt}))return()=>vi(d,this.options.pid??process.pid,S,this.options.fileSystem);if(jB(d,this.options.isProcessRunning,this.options.ownerGeneration??Nt,this.options.fileSystem)!==void 0||D===1)return;await this.timer.sleep(25)}return}}class ho{client;cached;constructor(d=new qn){this.client=d}readBuild(d){return this.cached??=this.probe(d).catch((c)=>(e.warn("Xcode build is unknown; template cloning disabled for this process",c),"unknown")),this.cached}async probe(d){let{stdout:c}=await this.client.executeCommand(["-version"],{signal:d,timeoutMs:5000}),D=c.split(`
164
+ `).find((C)=>C.startsWith("Build version "))?.slice(14).trim();if(!D)throw new t("Xcode did not report a build version. Check xcode-select.");return D}}async function Ut(d,c,S,D){let C=await d.listSimulators(void 0,D),x=Object.values(C.devices).flat().find((T)=>T.udid===S);if(!x)return;if(x.name!==Wc(c)){e.warn(`Refusing template deletion: ${S} is named ${x.name}`);return}await d.deleteSimulator(S,{signal:D})}var Zc=15,el=60000,tl=120000,yo=900000;class wo{source;timer;pollMs;constructor(d,c,S=5000){this.source=d;this.timer=c;this.pollMs=S}async waitUntilSettled(d,c){let S=this.timer.now()+c.maxWaitMs,D,C=[];while(this.timer.now()<=S){c.signal?.throwIfAborted();let x=S-this.timer.now();if(x<=0)break;let T=await l(()=>this.source.collectFresh({signal:c.signal,deadlineMs:S}),{timer:this.timer,timeoutMs:x,signal:c.signal,label:"Template settle collection"}),B=ry(T,d),O=this.timer.now();if(C=B===void 0?[]:[...C,{atMs:O,cpu:B}].filter((V)=>O-V.atMs<=(c.cpuMeanWindowMs??0)),D=B!==void 0&&iy(C)<c.cpuThresholdPercent?D??this.timer.now():void 0,D!==void 0&&this.timer.now()-D>=c.quietWindowMs)return;let H=S-this.timer.now();if(H<=0)break;await l(this.timer.sleep(Math.min(this.pollMs,H)),{timer:this.timer,signal:c.signal,label:"Template settle poll"})}throw Error(`Simulator ${d} did not settle before the deadline`)}}function iy(d){return d.reduce((c,S)=>c+S.cpu,0)/d.length}function ry(d,c){let S=d.simulators.find((C)=>C.udid===c);if(S?.state!=="Booted"||S.quality!=="measured")return;let D=S.process?.cpuPercent;return D!==void 0&&Number.isFinite(D)?D:void 0}class bo{deps;flights=new Map;constructor(d){this.deps=d}build(d,c){let S=wm(d),D=this.flights.get(S);if(D)return D;let C=this.buildLocked(d,c).finally(()=>{this.flights.delete(S)});return this.flights.set(S,C),C}async buildLocked(d,c){let S=await this.deps.lock.acquire(d,c);if(!S)return"building elsewhere";try{if(c?.throwIfAborted(),!await this.inputsAvailable(d,c))return"retry later";let D=await this.deps.store.read(d);if((D?.nextAttemptAtMs??0)>this.deps.timer.now())return"retry later";let C=d.xcodeBuild,x=await this.scanUntracked(d,D,c),T=await this.readyStatus(D,C,c);if(T)return T;if(D?.udid)await Ut(this.deps.client,d,D.udid,c);let B={attempt:D?.attempt??0,key:d,udid:"",state:"building",xcodeBuild:C,runtimeBuild:d.runtimeBuild,builtAtMs:this.deps.timer.now()};return await this.populate(B,x,c)}finally{S()}}async inputsAvailable(d,c){if(this.deps.hasSpareCapacity&&!await this.deps.hasSpareCapacity())return!1;let{runtimes:S}=await this.deps.client.getCatalogChecked(c);if(!S.some((C)=>C.identifier===d.runtime&&C.buildversion===d.runtimeBuild))return!1;let D=await this.deps.xcode.readBuild(c);return D!=="unknown"&&D===d.xcodeBuild}async scanUntracked(d,c,S){let D=new Set,C=await this.deps.client.listSimulators(void 0,S);for(let x of Object.values(C.devices).flat())if(x.name===Wc(d)&&x.udid!==c?.udid)D.add(x.udid),e.warn(`leaving untracked template simulator ${x.udid} (${x.state}); not owned by this manifest, remove with the ios-templates clean command`);return D}async readyStatus(d,c,S){if(!d)return;let D=await this.deps.client.listSimulators(void 0,S),C=Object.values(D.devices).flat().find((x)=>x.udid===d.udid&&x.name===Wc(d.key));if(C&&C.state!=="Shutdown"){if(d.state==="ready"||d.state==="stale")return e.warn(`Template ${C.udid} is ${C.state}; possibly in use, retry later`),"retry later";try{await this.deps.client.shutdownSimulator(C.udid,S)}catch(x){e.warn(`Could not shut down interrupted template ${C.udid}: ${r(x)}`,x)}}return C&&d.state==="ready"&&d.xcodeBuild===c&&d.runtimeBuild===d.key.runtimeBuild&&d.xcodeBuild===d.key.xcodeBuild?"ready":void 0}async populate(d,c,S){let{client:D,store:C,timer:x}=this.deps;await C.write(d);try{d.udid=await D.createSimulator(Wc(d.key),d.key.deviceType,d.key.runtime,S),await C.write(d);let T=await this.deps.profile(d.key).apply(d.udid,{},S);if(!T.applied&&d.key.profile!=="none")throw Error(`Template preboot profile was not applied: ${T.reason??"unknown reason"}`);S?.throwIfAborted(),await this.deps.instrumentation.run({udid:d.udid,runtime:d.key.runtime,reason:"create",timeoutMs:yo,signal:S},async()=>{await D.boot(d.udid,S)}),await this.deps.settle.waitUntilSettled(d.udid,{quietWindowMs:tl,cpuThresholdPercent:Zc,cpuMeanWindowMs:el,maxWaitMs:yo,signal:S}),d.settledAtMs=x.now(),await D.shutdownSimulator(d.udid,S);let B=await D.listSimulators(void 0,S);if(!Object.values(B.devices).flat().some((O)=>O.udid===d.udid&&O.name===Wc(d.key)&&O.state==="Shutdown"))throw Error("Template did not shut down");return S?.throwIfAborted(),await C.write({...d,state:"ready",attempt:0,failure:void 0,nextAttemptAtMs:void 0}),"ready"}catch(T){return this.recordFailure(d,c,T,S?.aborted===!0)}}async recordFailure(d,c,S,D=!1){let{store:C,timer:x}=this.deps;e.warn(`Template build did not complete: ${r(S)}`,S);let T=await U(void 0,()=>this.removePartial(d,c)),B=S instanceof Nn;if(D)return await C.write({...d,udid:T,state:"failed",failure:void 0}),"failed";let O=(d.attempt??0)+(B?0:1),N=B?60000:(this.deps.backoff??te({initialDelayMs:60000,maxDelayMs:21600000})).delayForAttempt(O),H=x.now()+N;return await C.write({...d,udid:T,attempt:O,state:B?"stale":"failed",nextAttemptAtMs:H,failure:B?void 0:{atMs:x.now(),reason:r(S)}}),B?"retry later":"failed"}async removePartial(d,c){let S=d.udid;try{if(!S){let D=await this.deps.client.listSimulators();S=Object.values(D.devices).flat().find((C)=>C.name===Wc(d.key)&&!c.has(C.udid))?.udid??""}if(S)await Ut(this.deps.client,d.key,S);return""}catch(D){return e.warn(`Could not delete partial template ${S}: ${r(D)}`,D),S}}}class So{client;store;lock;isStale;constructor(d,c,S,D){this.client=d;this.store=c;this.lock=S;this.isStale=D}async clean(d){let c=await this.keys(d),S=new Set,D=[];for(let C of c){let x=Wc(C);S.add(x);let T=await this.lock.acquire(C,d.signal);if(!T&&!d.force){D.push(x);continue}try{await this.cleanKey(C,Boolean(T),d.signal)}finally{T?.()}}if(d.all)await this.removeOrphans(S,d,D);if(d.all||d.runtime)await this.store.removeInvalid?.(d.runtime);if(D.length)throw new t(`Templates under a live lock: ${D.join(", ")}. Retry later or use --force.`)}async cleanKey(d,c,S){let D=await this.store.read(d);if(D?.udid)await Ut(this.client,d,D.udid,S);if(c)await this.removeNamed(Wc(d),S);await this.store.remove(d)}async keys(d){if(d.key)return[d.key];let c=await this.store.list(),S=[];for(let D of c){if(d.runtime&&D.key.runtime!==d.runtime)continue;if(d.stale&&!await this.isStale?.(D))continue;S.push(D.key)}return S}async removeNamed(d,c){let S=await this.client.listSimulators(void 0,c);for(let D of Object.values(S.devices).flat())if(D.name===d)await this.client.deleteSimulator(D.udid,{signal:c})}async removeOrphans(d,c,S){let D=await this.client.listSimulators(void 0,c.signal);for(let C of Object.values(D.devices).flat()){if(!zc(C.name)){if(C.name.startsWith("automobile-template-"))e.warn(`Skipping unrecognized template name ${C.name}`);continue}if(d.has(C.name))continue;d.add(C.name);let x=await this.lock.acquireName(C.name,c.signal);if(!x){S.push(C.name);continue}try{await this.removeNamed(C.name,c.signal)}finally{x()}}}}import{join as ny}from"path";var il=/^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i,oy=["var/db/diagnostics"],rl="-wal";class _o{deps;constructor(d){this.deps=d}async relocate(d){let{templateUdid:c,cloneUdid:S,signal:D}=d;if(!il.test(c)||!il.test(S))throw new t(`Cannot relocate clone ${S} from template ${c}: both must be simulator UDIDs`);let{fs:C}=this.deps,x=ny(this.deps.deviceSetRoot(),S,"data"),T=await C.scan(x,c,oy,D),B=await this.checkpointWals(T.files,D),O=await this.withCheckpointedDatabases(T.files,B,c);for(let N of O)D?.throwIfAborted(),await C.replaceInFile(N,c,S);for(let N of T.links)D?.throwIfAborted(),await C.retargetLink(N,c,S);return{rewrittenFiles:O.length,retargetedLinks:T.links.length,checkpointedDatabases:B.length}}async checkpointWals(d,c){let S=[];for(let D of d.filter((C)=>C.endsWith(rl))){c?.throwIfAborted();let C=D.slice(0,-rl.length);if(!await this.deps.fs.exists(C))continue;try{await this.deps.checkpointer.checkpoint(C,c),S.push(C)}catch(x){c?.throwIfAborted(),e.warn(`WAL checkpoint failed for ${C}: ${r(x)}`,x)}}return S}async withCheckpointedDatabases(d,c,S){let D=new Set(d),C=[...d];for(let x of c)if(!D.has(x)&&await this.deps.fs.fileContains(x,S))C.push(x);return C}}import{open as sy,readFile as ay,readlink as nl,stat as dy,symlink as cy,unlink as ly,writeFile as uy}from"fs/promises";import{join as ol,relative as my}from"path";var sl=1048576,al=32;async function dl(d,c){let S=await sy(d,"r");try{let D=Buffer.allocUnsafe(sl+c.length-1),C=0;for(;;){let{bytesRead:x}=await S.read(D,C,sl,null);if(x===0)return!1;let T=C+x;if(D.subarray(0,T).includes(c))return!0;C=Math.min(c.length-1,T),D.copy(D,0,T-C,T)}}finally{await S.close()}}class Ro{async scan(d,c,S,D){let C=Buffer.from(c),x=new Set(S.map((N)=>ol(d,N))),T=[],B=[],O=async(N)=>{D?.throwIfAborted();let H=await wr(N),V=[],q=[];for(let W of H){let G=ol(N,W.name);if(W.isSymbolicLink()){if((await nl(G)).includes(c))B.push(G)}else if(W.isDirectory()){if(!x.has(G))V.push(G)}else if(W.isFile())q.push(G)}for(let W=0;W<q.length;W+=al){let G=q.slice(W,W+al),ie=await Promise.all(G.map((re)=>dl(re,C)));T.push(...G.filter((re,fe)=>ie[fe]))}for(let W of V)await O(W)};return await O(d),{files:T,links:B}}async exists(d){try{return(await dy(d)).isFile()}catch(c){if(c instanceof Error&&"code"in c&&c.code==="ENOENT")return e.debug(`no database beside ${d}`),!1;throw c}}fileContains(d,c){return dl(d,Buffer.from(c))}async replaceInFile(d,c,S){let D=Buffer.from(c),C=Buffer.from(S);if(D.length!==C.length)throw Error(`Refusing a length-changing rewrite of ${my(".",d)}`);let x=await ay(d),T=x.indexOf(D);if(T<0)return;while(T>=0)C.copy(x,T),T=x.indexOf(D,T+D.length);await uy(d,x)}async retargetLink(d,c,S){let D=(await nl(d)).split(c).join(S);await ly(d),await cy(D,d)}}class Do{async checkpoint(d){let{Database:c}=vt("bun:sqlite"),S=new c(d,{create:!1});try{S.exec("PRAGMA busy_timeout = 0;"),S.exec("PRAGMA wal_checkpoint(TRUNCATE);")}finally{S.close()}}}var cl=new WeakMap,fy=new ho,gy,ll=()=>gy??=new F(null);function Po(d=ll()){let c=cl.get(d);if(c)return c;let S=new lo(d),D=i,C=new go,x=new vo(D),T=fy,B=Of(),O=yI({timer:D,gate:B.ios,history:B.iosBootHistory}),N=new zP(new jP(new ne,D,void 0,{simctl:d}),B.iosBootHistory,D),H=new bo({client:S,timer:D,store:C,lock:x,xcode:T,instrumentation:O,hasSpareCapacity:async()=>!B.ios||(await B.ios.evaluateBoot()).outcome==="allow",settle:new wo(N,D),profile:(q)=>new gv(void 0,()=>q.profile)}),V={client:S,store:C,lock:x,xcode:T,timer:D,profile:()=>h5(process.env),builder:{build:(q,W)=>U(W,()=>H.build(q,W))},relocator:new _o({fs:new Ro,checkpointer:new Do,deviceSetRoot:()=>Lw(py())})};return cl.set(d,V),V}function Toe(){let d=Po();return{dependencies:d,cleanup:new So(d.client,d.store,d.lock,async(c)=>{let S=await d.xcode.readBuild();if(S==="unknown")return!1;let{runtimes:D}=await d.client.getCatalogChecked(),C=D.find((x)=>x.identifier===c.key.runtime);return c.xcodeBuild!==S||c.runtimeBuild!==C?.buildversion})}}var Co;function Ry(d){Co??=new uo({createSimulator:(...S)=>ll().createSimulator(...S)},()=>_ee(process.env),Po);let c=Co;return d?{create:(S)=>{let D=d();if(!D)throw new t("iOS simulator creation is unavailable");if(!(D instanceof F))return D.createSimulator(S.name,S.deviceType,S.runtime,S.signal).then((C)=>({udid:C,source:"create"}));return c.create(S,{creator:D,dependencies:()=>Po(D)})}}:c}async function s6(){await Co?.stop()}import{AsyncLocalStorage as zw}from"async_hooks";class Io{explicitDevicePins=new Map;getPin(d="direct-stdio"){return this.explicitDevicePins.get(d)}setPin(d,c="direct-stdio"){this.explicitDevicePins.set(c,d)}clearConnection(d){this.explicitDevicePins.delete(d)}clearPinFor(d){for(let[c,S]of this.explicitDevicePins)if(S.deviceId===d)this.clearConnection(c)}}class KP{ports;firstObservationMs;attempt=0;backoff;budgetMs;constructor(d){this.ports=d;this.backoff=d.backoff??te({initialDelayMs:100,maxDelayMs:1000}),this.budgetMs=d.budgetMs??5000}remainingMs(){return this.firstObservationMs??=this.ports.timer.now(),Math.max(0,this.budgetMs-(this.ports.timer.now()-this.firstObservationMs))}async waitForNextAttempt(){let{timer:d,getSignal:c}=this.ports,S=c();S?.throwIfAborted();let D=this.remainingMs();if(D<=0)return!1;let C=Math.min(this.backoff.delayForAttempt(++this.attempt),D);if(C<=0)return!1;let x;try{await l(()=>new Promise((T)=>{x=d.setTimeout(T,C)}),{timer:d,signal:S,label:"Exact device adb transport wait"})}finally{if(x!==void 0)d.clearTimeout(x)}return S?.throwIfAborted(),!0}}class vI extends t{operation;phase;elapsedMs;code="timeout";retryable=!0;budgetMs;device;constructor(d,c,S,{budgetMs:D,device:C}){super(`${d} timeout exhausted while ${c}; `+(C?`device=${C}; `:"")+`remainingBudgetMs=0; elapsedMs=${S}; budgetMs=${D}; origin=DeviceBootService`);this.operation=d;this.phase=c;this.elapsedMs=S;this.budgetMs=D,this.device=C}}function ye(d,c){return{...d,...hy(d,c),..._y(d,c),capabilityInventory:d.capabilityInventory??c.capabilityInventory}}function hy(d,c){return{iosVersion:d.iosVersion??c.iosVersion,apiLevel:d.apiLevel??c.apiLevel,osVersion:d.osVersion??c.osVersion,runtimeId:d.runtimeId??c.runtimeId,runtime:d.runtime??c.runtime}}function _y(d,c){return{deviceType:d.deviceType??c.deviceType,formFactor:d.formFactor??c.formFactor,screenWidth:d.screenWidth??c.screenWidth,screenHeight:d.screenHeight??c.screenHeight,screenDensity:d.screenDensity??c.screenDensity,model:d.model??c.model,architecture:d.architecture??c.architecture}}function zi(d,c){return c.find((S)=>S.platform===d.platform&&(S.deviceId===d.deviceId||d.platform==="android"&&le(d.deviceId)&&S.name===d.name))}var Ao=1000,ul=5000;function bN(d,c,S){let D=typeof d.once!=="function"||d.exitCode!==null||d.signalCode!==null,C=D?Promise.resolve():new Promise((x)=>{d.once("exit",()=>x())});try{d.kill()}catch(x){e.warn(`[ColdBoot] Failed to cancel cold boot ${c}: ${r(x)}`,x)}return{exited:C,confirmed:d.terminationConfirmed??(D?Promise.resolve(!0):Dy(C,d,c,S))}}async function Dy(d,c,S,D){if(await ml(d,D))return!0;e.warn(`[ColdBoot] Cold boot ${S} did not exit within ${Ao}ms; escalating to SIGKILL`);try{c.kill("SIGKILL")}catch(x){e.debug(`[ColdBoot] SIGKILL for cold boot ${S} failed: ${r(x)}`)}let C=await ml(d,D);if(!C)e.warn(`[ColdBoot] Cold boot ${S} did not exit within ${Ao}ms of SIGKILL`);return C}async function ml(d,c){let S=Error("Cold boot exit wait timed out");try{return await l(d.then(()=>!0),{timer:c,timeoutMs:Ao,label:"Cold boot exit",timeoutError:()=>S})}catch(D){if(D===S)return!1;throw D}}function gl(d){if(typeof d==="object"&&d!==null&&typeof d.unref==="function")d.unref()}function Cy(d,c,S,{timer:D,isProcessRunning:C=nt,processGeneration:x=Nt}){let T=d.pid,B=T===void 0?void 0:x.current(T);return new Promise((O)=>{let N,H=!1,V=()=>{if(H=!0,N!==void 0)D.clearTimeout(N),N=void 0;O()};if(c.then(V,V),T===void 0)return;let q=()=>{if(N=void 0,H)return;if(B!==void 0&&x.compare(T,B)==="different"){e.warn(`[ColdBoot] Cold boot ${S} process ${T} now names a different process; releasing its AVD`),V();return}if(!C(T)){e.warn(`[ColdBoot] Cold boot ${S} process ${T} is gone; releasing its AVD`),V();return}N=D.setTimeout(q,ul),gl(N)};N=D.setTimeout(q,ul),gl(N)})}async function Xi(d,c,S,D={}){let{exited:C,confirmed:x}=bN(d,c,S);try{if(await x)return{state:"confirmed"}}catch(B){if(d.terminationConfirmed!==void 0)return e.warn(`[startDevice] Resource cleanup for ${c} was unconfirmed: ${r(B)}`,B),{state:"cleanup-unconfirmed"};return e.warn(`[startDevice] Could not observe exit of emulator process ${d.pid??"unknown"}: ${r(B)}`,B),{state:"unobservable"}}if(d.terminationConfirmed!==void 0)return e.warn(`[startDevice] Resource cleanup for ${c} was unconfirmed`),{state:"cleanup-unconfirmed"};e.warn(`[startDevice] Emulator process ${d.pid??"unknown"} for ${c} survived SIGTERM and SIGKILL; holding the AVD lifecycle lease until it is gone`);let T=Cy(d,C,c,{timer:S,isProcessRunning:D.isProcessRunning,processGeneration:D.processGeneration});return D.markHeldByUnkillableProcess?.(d.pid),{state:"survived",gone:T}}async function vl(d,c){let S=c.deadlineMs-c.timer.now();if(c.signal?.aborted||S<=0)return"pending";let D=Error("Request ended before the emulator termination settled");try{return(await l(d,{timer:c.timer,timeoutMs:S,signal:c.signal,label:"Cold boot termination",timeoutError:()=>D})).state}catch(C){if(C===D||c.signal?.aborted)return"pending";throw C}}var Iy=1000;class To{dependencies;timer;constructor(d,c){this.dependencies=d;this.timer=c}async discoverBootedDevices(d,c,S,{bypassAndroidCache:D=!1,awaitAbortSettlement:C=!0,presentationOrder:x}={}){let T=d==="android"||x!==void 0,B={skipForeignEnrichment:!0,...D?{bypassAndroidDeviceListCache:!0}:{},...x!==void 0?{presentationOrder:x}:{}};if(T){let O=await this.runPhase(c,S,(N)=>this.dependencies.deviceManager.getBootedDevicesDetailed(d,{...B,signal:N}),C);if(d==="android"&&!O.succeededPlatforms.has("android"))throw new Gr(O.discoveryErrors?.android);return O.devices.filter((N)=>!N.foreignOwned)}return await this.runPhase(c,S,()=>this.dependencies.deviceManager.getBootedDevices(d),C)}async enrichBootedDeviceFromImage(d,c){let S=await this.runPhase(c,`resolving ${d.platform} device metadata`,(C)=>this.dependencies.deviceManager.listDeviceImages(d.platform,C)),D=zi(d,S);return{device:D?ye(d,D):d,image:D}}async recheckRunningState(d,c){if(d.platform!=="android")return d;let S=new KP({timer:this.timer,getSignal:()=>c.signal,budgetMs:Math.min(5000,Math.max(0,c.deadlineMs-this.timer.now()))});while(await S.waitForNextAttempt()){if(c.deadlineMs<=this.timer.now())break;let C=(await this.runPhase(c,"rechecking Android image running state",(x)=>((this.dependencies.invalidateAndroidDeviceList??hv)(),this.dependencies.deviceManager.listDeviceImages("android",x)))).find((x)=>x.name===d.name);if(!C)break;if(C.isRunningStateKnown===!1)continue;if(C.isRunning)throw new Gr(void 0,`Cannot safely cold-boot Android AVD '${d.name}': it turned out to be running. Retry the request.`);return C}return d}async bootImageOnceWithOwnedLaunchTracking(d,c,S,D){let C=()=>{},x=await this.runPhase(c,"starting the device",async(V)=>{let q=await this.startDeviceOwningCancelledLaunch(d,c),W=()=>{if(q)bN(q,d.name,this.timer).confirmed.catch((G)=>{e.warn(`[startDevice] Late start handle cleanup failed for ${d.name}: ${r(G)}`,G)})};if(V.aborted)W();else V.addEventListener("abort",W,{once:!0}),C=()=>V.removeEventListener("abort",W);return q});C();let T,B,O=()=>{if(!x)return Promise.resolve({state:"confirmed"});return T??=this.terminateOwnedHandle(x,d,c),T},N=()=>(B??=this.awaitOwnedCleanup(O(),c),B),H=()=>{O()};c.signal?.addEventListener("abort",H,{once:!0});try{await this.reportProgress(c,S,60,"Device started, waiting for readiness...");let V=await this.runPhase(c,"waiting for device boot readiness",()=>sg(this.dependencies.deviceManager,d,x,{timeoutMs:this.remaining(c,"waiting for device boot readiness"),signal:c.signal,timer:this.timer,cancelOwnedBoot:async()=>{await N()},createTimeoutError:()=>this.timeoutError(c,"waiting for device boot readiness"),readinessOptions:d.platform==="android"&&(D||c.freshProvision===!0)?{freshProvision:!0}:void 0}));return await this.reportProgress(c,S,100,"Device is ready for use"),{device:ye(V,d),source:"cold-boot",sourceImage:d,processHandle:x,processId:x?.pid,provisioned:D}}catch(V){let q=await N();throw Ey(V,q,x)}finally{c.signal?.removeEventListener("abort",H)}}async terminateOwnedHandle(d,c,S){let D=await Xi(d,c.name,this.timer,{markHeldByUnkillableProcess:(C)=>S.lifecycleLease?.markHeldByUnkillableProcess?.(C),isProcessRunning:this.dependencies.isProcessRunning});if(D.state==="survived")S.unconfirmedProcessExits.push(D.gone),this.dependencies.retainLeaseUntil?.(D.gone);return D}async awaitOwnedCleanup(d,c){if(!this.canHoldCleanup(c))return(await d).state;let S=await vl(d,{timer:this.timer,deadlineMs:c.deadlineMs,signal:c.signal});if(S==="pending")this.holdLeaseUntilSettled(d,c);return S}canHoldCleanup(d){return this.dependencies.cleanupMayOutliveRequest===!0&&(d.ownsLifecycleLease||this.dependencies.retainLeaseUntil!==void 0)}holdLeaseUntilSettled(d,c){let S=d.then((D)=>D.state==="survived"?D.gone:void 0,()=>{return});c.pendingTerminations.push(S),this.dependencies.retainLeaseUntil?.(S)}async startDeviceOwningCancelledLaunch(d,c){try{return await this.dependencies.deviceManager.startDevice(d,this.remaining(c,"starting the device"),c.request.cameraPosterPath===void 0&&c.request.discardSnapshotOnExit!==!0?void 0:{...c.request.cameraPosterPath===void 0?{}:{cameraPosterPath:c.request.cameraPosterPath},...c.request.discardSnapshotOnExit===!0?{discardSnapshotOnExit:!0}:{}})}catch(S){if($v(S)&&S.process)this.ownCancelledLaunchTermination(this.terminateOwnedHandle(S.process,d,c),c);throw S}}ownCancelledLaunchTermination(d,c){if(this.canHoldCleanup(c)){this.holdLeaseUntilSettled(d,c);return}c.unheldLaunchTermination=d}async reportProgress(d,c,S,D){if(!c)return;await this.runPhase(d,`reporting ${S}% device boot progress`,()=>c.report(S,100,D),!1)}remaining(d,c){let S=Math.floor(d.deadlineMs-this.timer.now());if(S<=0)throw this.timeoutError(d,c);return S}async runPhase(d,c,S,D=!0){let C=this.remaining(d,c);if(d.signal?.aborted)throw new t(`startDevice cancelled while ${c}`);return await Tm({timer:this.timer,timeoutMs:C,signal:d.signal,graceMs:Iy,label:c,timeoutError:()=>this.timeoutError(d,c),defaultAbortError:()=>new t(`startDevice cancelled while ${c}`),awaitAbortSettlement:D,preferOperationFailureOnTimeout:!0},(x)=>U(x,()=>S(x)))}timeoutError(d,c){return new vI(d.operationName,c,this.timer.now()-d.startedAtMs,{budgetMs:Math.max(0,d.deadlineMs-d.startedAtMs),device:d.deviceLabel??d.request.name??d.request.deviceId})}}function Ey(d,c,S){let D=S?.pid??"unknown";if(c==="cleanup-unconfirmed")return Eo(d,"Cleanup also failed: device shutdown could not be confirmed.");if(c==="survived")return Eo(d,`Cleanup also failed: emulator process ${D} did not exit after SIGTERM and SIGKILL, so its AVD stays reserved until the process is gone (its liveness is re-checked periodically); terminate that process manually if it does not.`);if(c==="unobservable")return Eo(d,`Cleanup also failed: the exit of emulator process ${D} could not be observed, so its AVD was released; terminate that process manually if it is still running.`);return d}function Eo(d,c){if(d instanceof Error&&!(d instanceof DOMException)){let S=Object.create(Object.getPrototypeOf(d),Object.getOwnPropertyDescriptors(d));return Object.defineProperty(S,"message",{value:`${d.message} ${c}`,writable:!0,configurable:!0}),S}return new t(`${r(d)} ${c}`,{cause:d})}class Ht extends t{candidateSerials;code="target_identity_unresolved";retryable=!0;retryAfterMs=jc;deviceId;constructor(d,c){super(d);this.candidateSerials=c;if(c.length===1)this.deviceId=c[0]}toPayload(){return{code:this.code,retryable:this.retryable,retryAfterMs:this.retryAfterMs,candidateSerials:this.candidateSerials,...this.deviceId!==void 0?{deviceId:this.deviceId}:{}}}}class bI extends Ht{avdName;constructor(d,c){super(`target_identity_unresolved: Cannot prove whether Android AVD '${d}' is already running; AVD name is unavailable for ${c.join(", ")}. Retry after identity discovery recovers.`,c);this.avdName=d}toPayload(){return{...super.toPayload(),avdName:this.avdName}}}function Yi(d,c){let S=d.filter((D)=>!D.foreignOwned&&D.platform==="android"&&le(D.deviceId)&&D.name===`Unknown (${D.deviceId})`).map((D)=>D.deviceId);if(S.length>0)throw new bI(c,[...new Set(S)].toSorted())}function yl(d,c,S,D){if(!S||d.platform!=="android")return;if(!D)Yi(c,d.name);let C=d.deviceId&&le(d.deviceId)?c.find((x)=>!x.foreignOwned&&x.deviceId===d.deviceId&&x.name!==d.name):void 0;if(C)throw new t(`target_identity_mismatch: Configured Android AVD '${d.name}' lists serial '${d.deviceId}', but that serial is running '${C.name}'. Refresh device inventory and retry.`)}class Bo{get(d){return nW(d)}}var SN=g.ALLOW_DEVICE_CREATE.name,bl="AutoMobile";class Sl{environment;constructor(d=new Bo){this.environment=d}isCreationAllowed(d){if(typeof d==="boolean")return d;return $Y(this.environment.get(SN))}describeSource(d){if(typeof d==="boolean")return`--create-if-missing=${d}`;let c=this.environment.get(SN);if(c===void 0)return"default (off)";return`${SN}=${c}`}}var ko=null;function GP(){if(!ko)ko=new Sl;return ko}var _l={cleanup_failed:!1,creation_not_allowed:!1,device_lost:!0,device_owned_by_other_session:!0,device_owned_by_other_daemon:!0,device_cleanup_in_progress:!0,session_creation_timeout:!0,device_shutting_down:!0,device_assigned_to_binding:!1,device_offline:!0,discovery_incomplete:!0,capacity_exhausted:!0,identity_conflict:!1,timeout:!0,unsupported:!1,platform_command_failed:!1,resource_profile_unproven:!1,unsafe_device_resource_combination:!1,runtime_incompatible:!1,requires_real_device:!1};class Ue extends t{code;retryable;diagnostics;constructor(d,c,S=_l[d],D={}){super(c);this.code=d;this.retryable=S;this.diagnostics=D;this.name="ProvisionDeviceError"}}class Mf extends Ue{constructor(d){super("platform_command_failed",d);this.name="ProvisionDeviceCreateRejectedError"}}function Rl(d){return`${d[0]}.${d[1]}.${d[2]}`}function SI(d){return d.minRuntimeVersionString!==void 0||d.maxRuntimeVersionString!==void 0||d.minRuntimeVersion!==0||d.maxRuntimeVersion!==0}function Dl(d,c){return d!==void 0?bw(d):Iee(c)}function Pl(d){if(!SI(d))return;let c=Dl(d.minRuntimeVersionString,d.minRuntimeVersion),S=Dl(d.maxRuntimeVersionString,d.maxRuntimeVersion);return c&&S&&Gu(c,S)<=0?{min:c,max:S}:void 0}var xy=[65535,255,255];function By(d){return!Number.isFinite(d[0])||Gu(d,xy)>=0}function Cl(d){return{minVersion:Rl(d.min),maxVersion:By(d.max)?null:Rl(d.max)}}function wI(d){let c=Pl(d);return c?Cl(c):void 0}function tc(d,c){let S=Pl(d);if(!S)return{status:"unknown",reason:SI(d)?"device type runtime range is malformed":"device type has no runtime range metadata"};let D=Cl(S),C=bw(c);if(!C)return{status:"unknown",bounds:D,reason:"runtime version is missing or malformed"};return{status:Gu(C,S.min)>=0&&Gu(C,S.max)<=0?"supported":"unsupported",bounds:D}}function Il(d){let c=yd(d);return{kind:d,accepts:(S)=>c.includes(S),rank:(S)=>c.indexOf(S),deviceProfile:wl(d),namePrefix:`android-${d}`}}var No={"xr-headset":Il("xr-headset"),"xr-glasses":Il("xr-glasses")},ky={"xr-headset":"google-xr","xr-glasses":"ai-glasses"};function Al(d,c,S,D){return`No installed ${d==="xr-headset"?"Android XR headset":"Android XR glasses"} system image (${yd(d).join(", ")}) matches the requested API range ${c}. Installed images: ${S}. AutoMobile does not download system images. Install one with 'sdkmanager "system-images;android-<api>;${ky[d]};${D}"', then retry. XR images are published on the canary channel: 'sdkmanager --list --channel=3' shows the API levels and ABIs available.`}function El(d,c){let S=yd("watch");return{kind:"watch",accepts:(D)=>S.includes(D),rank:(D)=>S.indexOf(D),deviceProfile:rf({profileId:c})==="watch"?c?.trim():wl("watch",d),namePrefix:"android-watch"}}function xl(d,c,S){let D=yd("watch");return`No installed Wear OS system image (${D.join(", ")}) matches the requested API range ${d} and host ABIs ${S.join(" or ")}. Installed images: ${c}. AutoMobile does not download system images. Install one with 'sdkmanager "system-images;android-<api>;${D[0]};${S[0]}"', then retry.`}function Tl(d,c=L){let S=d.replace(/[^A-Za-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"device",D=c.next().replace(/-/g,"").slice(0,8);return`${bl}-${S}-${D}`}var $o={phone:"iPhone",tablet:"iPad"};function Nl(d){switch(d){case void 0:case"phone":return"phone";case"tablet":return"tablet";case"foldable":case"tv":case"watch":case"automotive":case"xr-headset":case"xr-glasses":case"unknown":throw new t(`iOS provisioning supports only phone or tablet form factors, not '${d}'.`)}}function Ul(d,c="phone"){if(c==="phone"&&cs(d.identifier))return!1;let S=$o[c];return d.productFamily===S||d.name.startsWith(S)}function kl(d){let c=d.match(/\d+/g);if(!c)return-1;return c.reduce((S,D)=>Math.max(S,Number.parseInt(D,10)),-1)}function Oy(d,c){if(d.length===0)throw new t("No iOS simulator device types are available from 'xcrun simctl list devicetypes'. Install an iOS platform via Xcode > Settings > Components.");let S=Nl(c.formFactor);if(c.name){let x=c.name.trim().toLowerCase(),T=d.find((B)=>B.name.toLowerCase()===x);if(T)return T}let D=$o[S],C=d.filter((x)=>Ul(x,S));if(C.length===0)throw new t(`No ${D} simulator device type is available. Available device types: ${d.map((x)=>x.name).join(", ")}.`);return[...C].sort((x,T)=>{let B=kl(T.name)-kl(x.name);if(B!==0)return B;let O=x.name.length-T.name.length;if(O!==0)return O;return x.name.localeCompare(T.name)})[0]}function My(d,c){let{status:S}=tc(d,c);return S==="supported"||S==="unknown"&&!SI(d)}function Ny(d,c,S,D){let C=D?$o[S]:"iOS";return new t(`No installed ${C} simulator device type supports the matching runtime(s) ${c.join(", ")}. Available device types: ${d.map((x)=>x.name).join(", ")}.`)}async function Uo(d,c,S){let D=Nl(c.formFactor),C=await d.getDeviceTypes(S);if(C.length===0)throw new t("No iOS simulator device types are available from 'xcrun simctl list devicetypes'. Install an iOS platform via Xcode > Settings > Components.");let x=await d.resolveRuntimeIdentifiersForBounds(c.minOsVersion,c.maxOsVersion,S),T=c.name?.trim().toLowerCase(),B=T?C.find((H)=>H.name.toLowerCase()===T):void 0,O=[],N=0;for(let H of x){let V=nv(H);if(!V)throw new t(`Cannot determine the iOS version from resolved runtime '${H}'.`);O.push(V);let q=C.filter((W)=>My(W,V));if(N+=q.length,B){if(q.includes(B))return{deviceType:B,runtime:H};continue}if(q.some((W)=>Ul(W,D)))return{deviceType:Oy(q,{...c,formFactor:D}),runtime:H}}if(B)throw new t(`Requested iOS device type '${B.name}' does not support runtime ${O.join(", ")}. Choose a compatible device type or adjust the requested OS range.`);throw Ny(C,O,D,N>0)}var Fo=["google_apis","default","google_apis_playstore"],Fy=new Set([...Fo,"google_apis_ps16k","google_apis_playstore_ps16k","google_apis_tablet","google_apis_playstore_tablet","google_atd","aosp_atd"]);function Ly(d){let c=Fo.indexOf(d);return c===-1?Fo.length:c}var ql={kind:"handheld",accepts:(d)=>Fy.has(d),rank:Ly,namePrefix:"android"},Vt=yd("tv"),Hl={kind:"tv",accepts:(d)=>Vt.includes(d),rank:(d)=>Vt.indexOf(d),deviceProfile:wl("tv"),namePrefix:"android-tv"},Lo=yd("automotive"),Vl={kind:"automotive",accepts:(d)=>Lo.includes(d),rank:(d)=>Lo.indexOf(d),deviceProfile:wl("automotive"),namePrefix:"android-automotive"};function Wl(d,c,S){if(d==="tv")return Hl;if(d==="automotive")return Vl;if(d==="xr-headset"||d==="xr-glasses")return No[d];if(d==="watch")return El(c?.screenRound,S);return ql}var $y=36,Gl=34;function nS(d){return d==="arm64"?["arm64-v8a","x86_64"]:["x86_64","x86"]}function Ol(d,c){let S=c.indexOf(d);return S===-1?c.length:S}var Uy=/^\d+(?:\.\d+)*[A-Za-z]?$/;function qy(d){let c=/^(\d+)/.exec(d);return c?Number(c[1]):void 0}function Ml(d,c){if(!d)return;let S=d.trim(),D=OV(S);if(D!==void 0)return e.debug(`[DeviceProvisioner] Treating ${c}OsVersion '${S}' as an API level`),D;let C=qQ(S);if(C)return c==="min"?C.min:C.max;if(!Uy.test(S)){let x=qy(S);if(x!==void 0)return e.debug(`[DeviceProvisioner] ${c}OsVersion '${S}' carries a qualifier the release table doesn't parse; falling back to its leading major ${x} as an API level (pre-#6132 lenient behavior; full qualifier ordering is tracked in #6182).`),x}throw new t(`Unrecognized Android ${c}OsVersion '${d}'. Pass a release version such as '14' (Android 14) or an API level such as 34.`)}function Wt(d,c){if(d===void 0||c===void 0)return"any";return d.trim()===String(c)?d:`${d} (API ${c})`}function pt(d){let{criteria:c,requestedMin:S,min:D,max:C}=d;return`(min=${S!==void 0&&S>=sv?Wt(c.minOsVersion,D):`API ${sv} (CtrlProxy runner minSdk)`}, max=${Wt(c.maxOsVersion,C)})`}function He(d){return d.map((c)=>c.packageName).join(", ")||"none"}function Hy(d,c,S){if(c.length===0)throw new t(`No installed Android system image matches the requested API range ${pt(S)}. Installed images: ${He(d)}. Install one with 'sdkmanager "system-images;android-<api>;google_apis;<abi>"'.`);let D=c.filter((C)=>ql.accepts(C.tag));if(D.length===0){let{criteria:C,min:x,max:T}=S;throw new t(`No installed handheld (phone) Android system image matches the requested API range (min=${Wt(C.minOsVersion,x)}, max=${Wt(C.maxOsVersion,T)}). Only non-handheld images (Wear OS, TV, Automotive, XR or similar) are installed in that range: ${He(c)}. Default provisioning never creates an AVD from them. Install a phone image with 'sdkmanager "system-images;android-<api>;google_apis;<abi>"'.`)}return D}var Vy={handheld:"google_apis_playstore",tv:"google-tv",automotive:"android-automotive-playstore","xr-headset":"android-xr-v3-playstore"};function Wy(d,c){let S=d.filter((D)=>ew(D.tag));if(S.length===0){let D=Vy[c.kind],C=D===void 0?`No Google Play ${c.kind} image is known; remove requires.playStore for this form factor. `:`Install one with 'sdkmanager "system-images;android-<api>;${D};<abi>"'. `;throw new t(`requires.playStore needs a Google Play system image, and none is installed for this request: ${He(d)}. `+C+"Play Store images refuse adb root, so root-dependent features will report that they need a non-Play image.")}return S}function Gy(d,c,S,D){let C=d.filter((B)=>n5(B.tag));if(C.length>0)return C;let x=Math.min(Math.max(S.min,Gl),S.max??Number.POSITIVE_INFINITY),T=nS(D);throw new t(`requires.vehicle.motion needs a non-Play Android Automotive system image (android-automotive), and none is installed in the requested API range ${pt(S)}: ${He(c)}. Play Store car images are user builds that refuse driving-state simulation. AutoMobile does not download system images. Install one with 'sdkmanager "system-images;android-${x};android-automotive;${T[0]}"', then retry.`)}function Ho(d){return`AutoMobile does not download system images. Install one with 'sdkmanager "${d}"'`}function jy(d,c,S,D){let C=c.filter((B)=>Hl.accepts(B.tag));if(C.length>0)return C;let x=S.max??Math.max(S.min,$y),T=nS(D);throw new t(`No installed Android TV system image (${Vt.join(", ")}) matches the requested API range ${pt(S)}. Installed images: ${He(d)}. `+Ho(`system-images;android-${x};android-tv;${T[0]}`)+` (or google-tv in place of android-tv), then retry. This host runs ${T.join(" or ")} images; 'sdkmanager --list' shows the ABIs published for each API level.`)}function Ky(d,c,S,D){let C=c.filter((B)=>Vl.accepts(B.tag));if(C.length>0)return C;let x=Math.min(Math.max(S.min,Gl),S.max??Number.POSITIVE_INFINITY),T=nS(D);throw new t(`No installed Android Automotive system image (${Lo.join(", ")}) matches the requested API range ${pt(S)}. Installed images: ${He(d)}. AutoMobile does not download system images. Install one with 'sdkmanager "system-images;android-${x};android-automotive;${T[0]}"', then retry. This host runs ${T.join(" or ")} images; 'sdkmanager --list' shows the ABIs published for each API level.`)}function Jy(d,{images:c,inRange:S,bounds:D,architecture:C}){let x=S.filter((B)=>No[d].accepts(B.tag));if(x.length>0)return x;let[T]=nS(C);throw new t(Al(d,pt(D),He(c),T))}function zy(d,c){let{images:S,inRange:D,bounds:C,architecture:x}=c;switch(d.kind){case"watch":{let T=nS(x),B=D.filter((O)=>d.accepts(O.tag)&&T.includes(O.abi));if(B.length>0)return B;throw new t(xl(pt(C),He(S),T))}case"tv":return jy(S,D,C,x);case"automotive":return Ky(S,D,C,x);case"xr-headset":case"xr-glasses":return Jy(d.kind,c);case"handheld":return Hy(S,D,C)}}function Xy(d,c,S){let D=Wl(c.formFactor,c.requires),C=Ml(c.minOsVersion,"min"),x=Ml(c.maxOsVersion,"max");if(x!==void 0&&x<sv)throw new t(`Requested Android maxOsVersion ${Wt(c.maxOsVersion,x)} is below API ${sv}, the minimum SDK the AutoMobile CtrlProxy runner APK supports. A lower AVD would boot but never install the runner and become automation-ready. Request Android 7.0 (API 24) or newer.`);let T=Math.max(C??sv,sv),B=d.filter((ie)=>{if(ie.apiLevel<T)return!1;if(x!==void 0&&ie.apiLevel>x)return!1;return!0}),O={criteria:c,requestedMin:C,min:T,max:x},N=zy(D,{images:d,inRange:B,bounds:O,architecture:S}),H=nS(S),V=c.requires?.playStore?Wy(N,D):N,q=c.requires?.vehicle?.motion==="supported"?Gy(V,d,O,S):V,W=q.filter((ie)=>H.includes(ie.abi));return[...W.length>0?W:q].sort((ie,re)=>{let fe=re.apiLevel-ie.apiLevel;if(fe!==0)return fe;let ae=Ol(ie.abi,H)-Ol(re.abi,H);if(ae!==0)return ae;let We=D.rank(ie.tag)-D.rank(re.tag);if(We!==0)return We;let we=Qs(re.apiIdentifier,ie.apiIdentifier);if(we!==0)return we;let hs=(re.extensionLevel??0)-(ie.extensionLevel??0);if(hs!==0)return hs;return ie.packageName.localeCompare(re.packageName)})[0]}function Yy(d,c){let S=d?.trim();return S&&S.toLowerCase()!==c.toLowerCase()?S:c}class Zi{dependencies;idGenerator;architecture;constructor(d){this.dependencies=d;this.idGenerator=d.idGenerator??L,this.architecture=d.architecture??process.arch}async provision(d,c,S=this.dependencies.identityHooks){if(d.platform==="ios")return this.provisionIos(d,c,S);if(d.platform==="android")return this.provisionAndroid(d,c,S);throw new t(`Device creation requires an explicit platform; got '${d.platform}'.`)}async provisionIos(d,c,S){let D=this.dependencies.iosCreator();if(!D)throw new t("Cannot create an iOS simulator: iOS simulator tools (xcrun simctl) are not available.");let{deviceType:C,runtime:x}=await Uo(D,d,c),T=Yy(d.name,C.name),B=this.dependencies.createdDeviceName?.(T)??Tl(T,this.idGenerator),O=await S?.reserveBeforeCreate({platform:"ios",name:B,deviceType:C.identifier,runtimeId:x,runtime:x}),N=c&&O?AbortSignal.any([c,O]):c??O,H;try{H=this.dependencies.simulatorCreation?(await this.dependencies.simulatorCreation.create({name:B,deviceType:C.identifier,runtime:x,signal:N})).udid:await D.createSimulator(B,C.identifier,x,N)}catch(q){throw u(q,`Failed to create iOS simulator '${B}' (deviceType=${C.identifier}, runtime=${x})`)}let V={platform:"ios",name:B,deviceId:H,deviceType:C.identifier,runtimeId:x,runtime:x};return e.info(`[DeviceProvisioner] Created iOS simulator '${B}' (udid=${H}, deviceType=${C.identifier}, runtime=${x}). Delete it with 'xcrun simctl delete `+H+"' when no longer needed."),await S?.bindAfterCreate(V),this.applyPrebootProfile(H,V,N)}async applyPrebootProfile(d,c,S){let D=await this.dependencies.prebootProfile?.apply(d,{},S);return{...c,...D?.applied&&D.resources.length?{prebootDisabledResources:D.resources}:{}}}async provisionAndroid(d,c,S){let D=Wl(d.formFactor,d.requires,d.name),C=this.dependencies.androidCreator(),x;try{x=await C.listInstalledSystemImages(c)}catch(q){throw u(q,"Failed to list installed Android system images for AVD creation")}let T=Xy(x,d,this.architecture),B=Tl(d.name??`${D.namePrefix}-${T.apiLevel}`,this.idGenerator),O=await S?.reserveBeforeCreate({platform:"android",name:B,deviceType:D.deviceProfile,runtimeId:T.packageName,runtime:`android-${T.apiIdentifier}`}),N=c&&O?AbortSignal.any([c,O]):c??O,H=await C.createAvd({name:B,package:T.packageName,...D.deviceProfile?{device:D.deviceProfile}:{}},N);if(!H.success)throw new Mf(`Failed to create Android AVD '${B}' from ${T.packageName}: ${H.message}`);let V=await this.androidCreatedDevice(B,T,D.deviceProfile);return e.info(`[DeviceProvisioner] Created Android AVD '${B}' (systemImage=${T.packageName}, api=${T.apiIdentifier}, tag=${T.tag}, abi=${T.abi}${D.deviceProfile?`, device=${D.deviceProfile}`:""}). Delete it with 'avdmanager delete avd -n ${B}' when no longer needed.`),await S?.bindAfterCreate(V),V}async androidCreatedDevice(d,c,S){let D={platform:"android",name:d,isRunning:!1,deviceType:S,runtimeId:c.packageName},C=this.dependencies.androidConfigReader?(await eD(this.dependencies.androidConfigReader,[D]))[0]:void 0;return{...C?{configuredImage:C}:{},platform:"android",name:d,deviceType:C?.deviceType??S,runtimeId:c.packageName,runtime:`android-${c.apiIdentifier}`}}}function Vo(){return{listInstalledSystemImages:(d)=>uu(void 0,void 0,d),createAvd:(d,c)=>tD(d,void 0,c)}}function YP(d=()=>new F(null),c,S){return new Zi({iosCreator:d,simulatorCreation:S,prebootProfile:new gv,androidCreator:Vo,androidConfigReader:new Kr,identityHooks:c})}class er{run(d,c,S){return c()}}var Qy="AutoMobile CI iPhone";class jl{dependencies;constructor(d){this.dependencies=d}async run(d,c,S){if(!this.isOwnedTarget(d))return c();let D;try{return await c()}catch(C){if(S?.aborted||C instanceof Nn)throw C;D=C}this.throwIfCancelled(S);try{await this.recover(S,()=>this.dependencies.shutdown(d),!0)}catch(C){if(C instanceof wT)throw e.warn("[CI iOS boot] simulator shutdown remains pending; skipping erase and boot retry",C),D;throw C}this.throwIfCancelled(S),await this.recover(S,()=>this.dependencies.erase(d.deviceId)),this.throwIfCancelled(S);try{return await c()}catch{throw this.throwIfCancelled(S),D}}isOwnedTarget(d){return d.platform==="ios"&&d.name===this.dependencies.ownedSimulatorName&&Boolean(d.deviceId)}throwIfCancelled(d){if(d?.aborted)throw new t("startDevice cancelled while recovering the CI iOS simulator")}async recover(d,c,S=!1){let D=Promise.resolve().then(c).catch((C)=>{if(S&&C instanceof wT)throw C;e.debug(`[CI iOS boot] recovery command failed: ${C}`)});if(!d){await D;return}this.throwIfCancelled(d);try{await l(D,{timer:i,signal:d,label:"CI iOS simulator recovery"})}catch(C){if(d.aborted)throw new t("startDevice cancelled while recovering the CI iOS simulator");throw C}}}function Zy(d){return E(K.CI,d)==="true"&&E(K.GITHUB_ACTIONS,d)==="true"}function tw(d,c){return d.platform==="ios"&&!d.name&&!d.deviceId&&Zy(c)}function iw(d,c){return{...d,name:c,matchNamedDeviceIgnoringOsVersion:!0}}async function iZ(d,c=process.env,S){if(!tw(d,c))return;let D=S?.simctl??new F,{runtime:C}=await Uo(D,d),x=nv(C)??C,T=`${Qy} (${x})`,B=new oi(null,D);return{request:iw(d,T),deviceManager:B,deviceProvisioner:new Zi({iosCreator:()=>D,androidCreator:Vo,createdDeviceName:()=>T}),recovery:new jl({ownedSimulatorName:T,shutdown:async(O)=>{await B.killDevice({name:O.name,platform:"ios",deviceId:O.deviceId})},erase:(O)=>D.eraseSimulator(O)})}}class RI extends t{avdName;candidateSerials;code="identity_conflict";constructor(d,c){super(`identity_conflict: Android AVD '${d}' is claimed by multiple running emulators: ${c.join(", ")}. Pass an explicit deviceId (ADB serial) to select one.`);this.avdName=d;this.candidateSerials=c}}var Wo=5000;function Jl(d){return d.name!==void 0&&d.matchExactName!==!0||d.minOsVersion!==void 0||d.maxOsVersion!==void 0||d.formFactor!==void 0||d.requires!==void 0||d.screenSize!==void 0}function Go(d,c){if(c.platform!=="android")return;if(d.platform!==c.platform||d.name!==c.name)throw new t(`target_identity_mismatch: Configured ${c.platform} image '${c.name}' (${c.deviceId??"no runtime ID"}) resolved to '${d.name}' (${d.deviceId}). Retry after device discovery refreshes.`)}function zl(d,c){if(d.name!==void 0&&d.matchExactName!==!0)Yi([c],d.name)}function Xl(d,c){if(d.matchExactName&&d.name&&d.platform==="android")Yi(c,d.name)}function Yl(d,c){if(d.matchExactName&&d.name&&c.name!==d.name)throw new t(`target_identity_mismatch: Requested ${d.platform} device '${d.name}' resolved to '${c.name}' (${c.deviceId}).`)}function JP(d,c){let S=new Map(d.filter((C)=>!C.foreignOwned&&C.platform==="android"&&C.name===c&&le(C.deviceId)).map((C)=>[C.deviceId,C])),D=[...S.values()];if(D.length>1)throw new RI(c,[...S.keys()].toSorted());return D[0]}var Gt=new WeakMap;function a6(d=sa()){return{listInFlightAndroidColdBootAvdNames:()=>[...Gt.get(d)?.keys()??[]]}}function Kl(d,c,S){try{d?.(c,S)}catch(D){e.warn(`[DeviceBootService] Android cold-boot tracking listener failed: ${r(D)}`,D)}}function rw(d,c,S){let D=Gt.get(d)??new Map;Gt.set(d,D);let C=D.get(c)??0;if(D.set(c,C+1),C===0)Kl(S,c,"claimed");return()=>{let x=(D.get(c)??1)-1;if(x>0){D.set(c,x);return}if(D.delete(c),D.size===0)Gt.delete(d);Kl(S,c,"released")}}function tr(d,c){return(Gt.get(d)?.get(c)??0)>0}function jo(d,c,S){return c.platform==="android"?rw(d,c.name,S):void 0}function ir(d,c){if(d.platform==="android")return JP(c,d.name);return d.deviceId?c.find((S)=>S.deviceId===d.deviceId):void 0}function Zl(d,c,S,D){let C=d==="android"?JP(c,S):c.find((x)=>x.name===S);return C&&Ql(C,D)?C:null}function eu(d,c,S,D){return new t(`No ${d.platform} device matching criteria found. ${d.minOsVersion?`minOsVersion>=${d.minOsVersion} `:""}${d.maxOsVersion?`maxOsVersion<=${d.maxOsVersion} `:""}${d.name?`name=${d.name} `:""}${Ch(c,D)} Available images: ${S.map((C)=>`${C.name}${C.osVersion?` (v${C.osVersion})`:""}`).join(", ")||"none"}.`)}function rr(d,c){return{..."configuredImage"in d?d.configuredImage:{},name:d.name,platform:d.platform,deviceId:"deviceId"in d?d.deviceId:void 0,isRunning:!1,formFactor:c.formFactor,runtimeId:d.runtimeId,runtime:d.runtime,deviceType:d.deviceType}}function zo(d,c){let S=new Map(c.filter((C)=>C.deviceId).map((C)=>[C.deviceId,C])),D=new Map(c.map((C)=>[C.name,C]));return d.map((C)=>{let x=C.platform==="android"&&le(C.deviceId),T=(C.deviceId?S.get(C.deviceId):void 0)??(x?D.get(C.name):void 0);return T?.platform===C.platform?ye(C,T):C})}function or(d,c,S){return c?.has(d.name)===!0||d.deviceId!==void 0&&S?.has(d.deviceId)===!0}async function tu(d,c,S){let C=(await d.execution.discoverBootedDevices(Q(c.platform,"Starting a device"),S,"revalidating the running device after lifecycle wait",{bypassAndroidCache:c.platform==="android"})).find((x)=>x.deviceId===c.deviceId);if(!C)throw new t("Selected running device disappeared during lifecycle wait; retry device selection");return{platform:C.platform,stableId:C.platform==="android"?C.name:C.deviceId}}async function iu(d,c,S){let D=await d.execution.runPhase(S,"revalidating the device image after lifecycle wait",(O)=>d.dependencies.deviceManager.listDeviceImages(c.platform,O)),C=S.request,x={platform:C.platform,name:C.name,minOsVersion:C.matchNamedDeviceIgnoringOsVersion?void 0:C.minOsVersion,maxOsVersion:C.matchNamedDeviceIgnoringOsVersion?void 0:C.maxOsVersion,formFactor:C.formFactor,requires:C.requires,screenSize:C.screenSize},T=D.filter((O)=>!or(O,C.excludeDeviceNames,C.excludeDeviceIds)&&Ql(O,x)),B=C.deviceId?T.find((O)=>O.deviceId===C.deviceId||O.name===C.deviceId):C.matchExactName&&C.name?T.find((O)=>O.name===C.name):d.dependencies.deviceMatcher.matchDeviceImage(x,T,d.dependencies.matchingStrategy);if(!B)throw new t("Selected device image disappeared during lifecycle wait; retry device selection");return{platform:B.platform,stableId:B.platform==="android"?B.name:B.deviceId}}async function ru(d,c,S,D=!0){if(c.platform==="android"){let B=await d.execution.discoverBootedDevices(c.platform,S,"re-checking the running device after the shared lifecycle lease settled",{bypassAndroidCache:!0,awaitAbortSettlement:!0}),O=JP(B,c.name);return O&&!tr(d.lifecycleCoordinator,c.name)?O:void 0}let x=(B)=>d.dependencies.deviceManager.getBootedDevicesDetailed(c.platform,{bypassIosDeviceListCache:!0,skipPhysicalIosDiscovery:!0,signal:B}),T=await d.execution.runPhase(S,"re-checking the running device after the shared lifecycle lease settled",(B)=>D?Xo(d,"re-checking the running device after the shared lifecycle lease settled",B,x):x(B));return T?.succeededPlatforms.has("ios")?ir(c,T.devices):void 0}async function Xo(d,c,S,D){let C=new AbortController,x=Error(`${c} timed out`);try{return await l(D(AbortSignal.any([S,C.signal])),{timer:d.timer,timeoutMs:Wo,signal:S,label:c,timeoutError:()=>x,onTimeout:()=>C.abort(x)})}catch(T){if(T!==x)throw T;e.warn(`[startDevice] Simulator re-check did not answer within ${Wo}ms; continuing to the boot path`);return}}import{promises as nu}from"fs";import{homedir as nw}from"os";import{join as ow}from"path";function sw(){return{readFile:(d,c)=>nu.readFile(d,c),writeFile:(d,c,S)=>nu.writeFile(d,c,S),environment:process.env,homeDirectory:nw}}function aw(d){return d?.signal}class sr{dependencies;constructor(d=sw()){this.dependencies=d}async setMemoryMb(d,c,S){if(!Number.isInteger(c)||c<=0)throw new Ue("platform_command_failed",`Android AVD memoryMb must be a positive integer; got ${c}.`);return this.setConfiguration(d,{memoryMb:c},S)}async setConfiguration(d,c,S){let D=aw(S);o(D);let C=oT.parse(c),x=new Map;for(let q of Object.keys(C)){let W=C[q];if(W!==void 0)x.set(_V[q],typeof W==="boolean"?W?"yes":"no":String(W))}if(C.gpuMode!==void 0)x.set("hw.gpu.enabled","yes");let T=r5(this.dependencies.environment,this.dependencies.homeDirectory()),B=ow(T,`${d}.avd`,"config.ini"),O=await R(this.dependencies.readFile(B,"utf8"),D);o(D);let N=O.split(/\r?\n/),H=new Set,V=N.map((q)=>{let W=q.slice(0,q.indexOf("=")).trim();if(x.has(W))return H.add(W),`${W}=${x.get(W)}`;return q});for(let[q,W]of x){if(H.has(q))continue;if(V.at(-1)!=="")V.push("");V.push(`${q}=${W}`,"")}o(D),await this.dependencies.writeFile(B,V.join(`
165
+ `),"utf8")}}function dw(d,c){let S=Yr(d.runtime);if(!S||!c)return!1;return c.apiLevel===S.apiLevel&&c.tag===S.tag&&c.architecture===S.architecture&&c.deviceName===d.deviceType&&c.systemImagePackage===S.systemImagePackage}function CH(d,c){return dw(d,c)&&(d.configuration?.memoryMb===void 0||c?.ramSizeMb===d.configuration.memoryMb)&&Object.entries(d.configuration??{}).every(([S,D])=>S==="memoryMb"||D===void 0||(S!=="gpuMode"||c?.gpuEnabled===!0)&&c?.hardware?.[S]===D)}function DH(d,c){if(c.isAvailable===!1)return"unavailable";if(c.runtime!==d.runtime||c.deviceType!==d.deviceType)return"mismatch";return}function OH(d,c){let S=Yb(d,c.deviceType),D=c.displayCutout;if(D===void 0||D==="any")return{kind:"resolved",displayCutout:S};if(S==="unknown")return{kind:"unsupported",message:`Display cutout preference '${D}' is unsupported for ${d} device type '${c.deviceType}' because its cutout class is unknown.`};if(S!==D)return{kind:"identity_conflict",message:`Exact ${d} device type '${c.deviceType}' has display cutout '${S}', not requested '${D}'.`};return{kind:"resolved",displayCutout:S}}function MH(d,c,S){let D=c.find((B)=>B.identifier===d.runtime),C=S.find((B)=>B.identifier===d.deviceType);if(!D||!C)return;let x=tc(C,D.version),T=!D.isAvailable;if(!T&&x.status!=="unsupported")return;return{unavailable:T,runtime:D,bounds:x.bounds,compatibleRuntimes:c.filter((B)=>B.isAvailable&&tc(C,B.version).status==="supported").map((B)=>({id:B.identifier,version:B.version}))}}function c6(d,c){return new Ue("device_assigned_to_binding",`${c}: ${d.message}`,!1,{deviceId:d.deviceId,binding:{scopeKey:d.scopeKey,declaredBinding:d.declaredBinding,stableId:d.stableId}})}class ou{dependencies;async configureAndroid(d,c,S){let D=this.dependencies.androidConfigWriter;if(D.setConfiguration)await D.setConfiguration(d,c,{signal:S});else if(Object.keys(c).some((C)=>C!=="memoryMb"))throw new Ue("unsupported","The configured AVD writer does not support emulator hardware controls.");else if(c.memoryMb!==void 0)await D.setMemoryMb(d,c.memoryMb,{signal:S})}lifecycleCoordinator;timer;constructor(d){this.dependencies=d;this.lifecycleCoordinator=d.lifecycleCoordinator??sa(),this.timer=d.timer??i}async provision(d){let c=this.resolveDisplayCutout(d),S=d.lifecycleLease===void 0,D=d.lifecycleLease??await this.lifecycleCoordinator.reserve(this.initialLifecycleIdentity(d),{operation:"provision",deadlineMs:d.deadlineMs??this.timer.now()+300000,signal:d.signal}),C=[d.signal,D.signal].filter((T)=>T!==void 0),x={...d,signal:C.length===1?C[0]:AbortSignal.any(C)};try{o(x.signal);let T=await this.provisionLocked(x,c),B=T.device.platform==="android"?T.device.name:T.device.deviceId;if(!B)throw new Ue("identity_conflict",`Exact iOS simulator '${d.name}' has no UDID.`);return await D.bindCanonicalIdentity({platform:T.device.platform,stableId:B},async()=>{let N=(await this.dependencies.listDeviceImages(T.device.platform)).find((H)=>H.platform===T.device.platform&&(T.device.platform==="android"?H.name===d.name:H.deviceId===B));if(!N)throw new t(`Provisioned device '${B}' disappeared during lifecycle wait`);return{platform:N.platform,stableId:N.platform==="android"?N.name:N.deviceId}}),T}finally{if(S)D.release()}}async assertAdoptable(d,c){let S=c.platform==="android"?c.name:c.deviceId;if(!this.dependencies.assertAdoptable||!S)return;try{await this.dependencies.assertAdoptable({platform:Q(c.platform,"Adopting an existing device"),stableId:S})}catch(D){if(D instanceof li)throw c6(D,`Cannot adopt existing ${d.platform} device '${d.name}'`);throw D}}initialLifecycleIdentity(d){if(d.platform==="android"||d.deviceId)return{kind:"stable",platform:d.platform,stableId:d.platform==="android"?d.name:d.deviceId};return{kind:"selector",platform:"ios",selector:d.name}}async provisionLocked(d,c){let S=await jt("provision:listDeviceImages",()=>this.dependencies.listDeviceImages(d.platform)),D=this.findExisting(S,d);if(D)return await this.assertAdoptable(d,D),await jt("provision:matchExisting",()=>this.assertExistingMatches(d,D)),{device:D,created:!1,resolvedSpec:this.withResolvedDisplayCutout(d.spec,c)};if(d.platform==="ios"&&d.deviceId!==void 0)throw new Ue("identity_conflict",`Exact iOS simulator '${d.name}' with UDID '${d.deviceId}' was not found.`);if(!this.dependencies.isCreationAllowed(!0))throw new Ue("creation_not_allowed",`Device creation is disabled; cannot provision exact ${d.platform} device '${d.name}'.`);if(d.platform==="android")await this.assertAndroidTvImageInstalled(d,d.spec);else await this.assertIosPairCompatible(d,d.spec);if(await d.assertCapacityBeforeCreate?.(d.signal),d.onBeforeCreate?.(),d.platform==="android")return await jt("provision:createAndroid",()=>this.createAndroid(d,d.spec,c));return await jt("provision:createIos",()=>this.createIos(d,d.spec,c))}async readIosCompatibilityCatalog(d,c){try{let[S,D]=await Promise.all([d.getRuntimesChecked(void 0,c),d.getDeviceTypesChecked(c)]);return{runtimes:S,deviceTypes:D}}catch(S){o(c),e.warn(`iOS runtime compatibility check skipped: ${r(S)}`,S);return}}async assertIosPairCompatible(d,c){let S=this.dependencies.iosRuntimeCatalog;if(!S)return;let D=await this.readIosCompatibilityCatalog(S,d.signal);if(!D)return;let C=MH(c,D.runtimes,D.deviceTypes);if(!C)return;let{runtime:x,bounds:T,compatibleRuntimes:B,unavailable:O}=C;throw uw(d,c,{reason:O?`Runtime '${c.runtime}' is not available (${x.availabilityError??"CoreSimulator marked it unavailable"}), so iOS simulator '${d.name}' with device type '${c.deviceType}' cannot be created.`:`Device type '${c.deviceType}' does not support runtime '${c.runtime}' (version ${x.version}; supported ${cw(T)}), so iOS simulator '${d.name}' was not created.`,bounds:T,compatibleRuntimes:B})}resolveDisplayCutout(d){let c=OH(d.platform,d.spec);if(c.kind!=="resolved")throw new Ue(c.kind,c.message);return c.displayCutout}withResolvedDisplayCutout(d,c){return{...d,displayCutout:c}}findExisting(d,c){if(c.platform!=="ios")return d.find((C)=>C.name===c.name||c.deviceId!==void 0&&C.deviceId===c.deviceId);if(c.deviceId!==void 0)return d.find((C)=>C.deviceId===c.deviceId);let S=d.filter((C)=>C.name===c.name),D=c.spec;return S.find((C)=>C.isAvailable!==!1&&C.runtime===D.runtime&&C.deviceType===D.deviceType)??S.find((C)=>C.runtime===D.runtime&&C.deviceType===D.deviceType)??S[0]}async assertExistingMatches(d,c){if(c.platform!==d.platform)throw new Ue("identity_conflict",`Requested ${d.platform} device '${d.name}' conflicts with existing ${c.platform} device.`);if(c.name!==d.name)throw new Ue("identity_conflict",`Requested device name '${d.name}' conflicts with existing '${c.name}' for the supplied identity.`);if(d.platform==="android"){await this.assertAndroidExistingMatches(d,c);return}this.assertIosExistingMatches(d,c)}async assertAndroidExistingMatches(d,c){let S=d.spec,D=await this.dependencies.androidConfigReader.readConfig(c.name);if(CH(S,D))return;throw new Ue("identity_conflict",`Existing Android AVD '${c.name}' does not match the requested runtime, device type, and configuration.`)}assertIosExistingMatches(d,c){let S=d.spec,D=DH(S,c);if(D==="unavailable")throw new Ue("identity_conflict",`Existing iOS simulator '${c.name}' is unavailable: ${c.availabilityError??"CoreSimulator marked it unavailable"}.`);if(D==="mismatch")throw new Ue("identity_conflict",`Existing iOS simulator '${c.name}' does not match the requested runtime and device type.`)}async assertAndroidTvImageInstalled(d,c){let S=Yr(c.runtime);if(S&&Vt.includes(S.tag)){let D;try{D=await this.dependencies.avdManager.listInstalledSystemImages(d.signal)}catch(C){throw u(C,"Failed to list installed Android system images for AVD creation")}if(!D.some((C)=>C.packageName===c.runtime))throw new t(`No installed Android TV system image matches the requested package '${c.runtime}'. `+Ho(c.runtime)+", then retry.")}}async createAndroid(d,c,S){let D;try{D=await this.dependencies.avdManager.createAvd({name:d.name,package:c.runtime,device:c.deviceType},{signal:d.signal})}catch(C){throw Fm(),C}if(!D.success)throw new Mf(`Failed to create Android AVD '${d.name}': ${D.message}`);if(Fm(),c.configuration)await this.configureAndroid(d.name,c.configuration,d.signal);return{created:!0,device:(await eD(this.dependencies.androidConfigReader,[{name:d.name,platform:"android",isRunning:!1,deviceType:c.deviceType,runtimeId:c.runtime}]))[0],resolvedSpec:this.withResolvedDisplayCutout(c,S)}}async createIos(d,c,S){let D=this.dependencies.simulatorCreation?(await this.dependencies.simulatorCreation.create({name:d.name,deviceType:c.deviceType,runtime:c.runtime,resources:d.resources,signal:d.signal})).udid:await this.dependencies.iosSimulator.createSimulator(d.name,c.deviceType,c.runtime,d.signal),C=await this.dependencies.prebootProfile?.apply(D,{resources:d.resources},d.signal);return{...C?.applied&&C.resources.length?{prebootDisabledResources:C.resources}:{},created:!0,device:{name:d.name,platform:"ios",deviceId:D,isRunning:!1,runtime:c.runtime,deviceType:c.deviceType},resolvedSpec:this.withResolvedDisplayCutout(c,S)}}}function cw(d){return d?`${d.minVersion} to ${d.maxVersion??"no maximum"}`:"unknown bounds"}function uw(d,c,S){let D=S.compatibleRuntimes.length?S.compatibleRuntimes.map((C)=>C.id).join(", "):"none installed";return new Ue("runtime_incompatible",`${S.reason} Compatible installed runtimes: ${D}.`,void 0,{runtimeCompatibility:{requestedRuntime:c.runtime,requestedDeviceType:c.deviceType,...S.bounds?{bounds:S.bounds}:{},compatibleRuntimes:S.compatibleRuntimes}})}function oZ(d,c,{androidConfigWriter:S=new sr,assertAdoptable:D,simulatorCreation:C,ios:x}={}){let T=new ok;return new ou({assertAdoptable:D,listDeviceImages:d.listDeviceImages.bind(d),isCreationAllowed:c.isCreationAllowed.bind(c),avdManager:{listInstalledSystemImages:(B)=>uu(void 0,void 0,B),createAvd:(B,O)=>T.createAvd(B,O)},androidConfigReader:new Kr,androidConfigWriter:S,simulatorCreation:C,prebootProfile:new gv,iosSimulator:new F(null),iosRuntimeCatalog:new F(null),...x})}class XP extends Ht{constructor(d){super(`target_identity_unresolved: Android emulator '${d}' is listed by adb but did not answer its AVD-name probe, so it cannot be resolved for lifecycle coordination. Retry once it responds; if it stays unresponsive, call killDevice for it and then startDevice.`,[d])}}class iS{dependencies;execution;bootRecovery;timer;lifecycleCoordinator;constructor(d){this.dependencies=d;this.bootRecovery=d.bootRecovery??new er,this.timer=d.timer??i,this.execution=new To(d,this.timer),this.lifecycleCoordinator=d.lifecycleCoordinator??(d.timer?new rz(d.timer):sa())}async boot(d,c){if(d.cameraPosterPath!==void 0&&d.platform!=="android")throw new t("cameraPosterPath is unsupported on iOS. Use a stopped Android emulator.");let S=d.timeoutMs??qe,D={request:d,operationName:d.operationName??"startDevice",startedAtMs:this.timer.now(),deadlineMs:d.totalDeadlineMs??this.timer.now()+S,signal:d.signal,lifecycleLease:this.dependencies.lifecycleLease,ownsLifecycleLease:!1,unconfirmedProcessExits:[],pendingTerminations:[],freshProvision:d.freshProvision===!0};if(!D.lifecycleLease&&!this.dependencies.onIdentityResolved)D.lifecycleLease=await this.lifecycleCoordinator.reserve(Vv(d.platform,d),{operation:"start",deadlineMs:D.deadlineMs,signal:d.signal}),D.ownsLifecycleLease=!0,D.signal=d.signal?AbortSignal.any([d.signal,D.lifecycleLease.signal]):D.lifecycleLease.signal;try{if(d.deviceId)return await this.bootKnownDevice({...d,deviceId:d.deviceId},D,c);return await this.bootMatchingDevice(d,D,c)}finally{this.releaseOwnedLifecycleLease(D)}}releaseOwnedLifecycleLease(d){if(!d.ownsLifecycleLease)return;let c=d.lifecycleLease;if(d.unconfirmedProcessExits.length===0&&d.pendingTerminations.length===0){c?.release();return}this.releaseOnceProcessesSettle(d,c)}async releaseOnceProcessesSettle(d,c){await Promise.allSettled(d.pendingTerminations),await Promise.allSettled(d.unconfirmedProcessExits),c?.release()}async bindLifecycleIdentity(d,c,S=async()=>c){if(d.lifecycleLease)await d.lifecycleLease.bindCanonicalIdentity(c,S);await this.dependencies.onIdentityResolved?.(c)}async bootKnownDevice(d,c,S){let{deviceManager:D}=this.dependencies,C={platform:d.platform,minOsVersion:d.minOsVersion,maxOsVersion:d.maxOsVersion,name:d.name,formFactor:d.formFactor,requires:d.requires,screenSize:d.screenSize},x=await this.execution.discoverBootedDevices(d.platform,c,"discovering running devices",{bypassAndroidCache:d.platform==="android",awaitAbortSettlement:!0,presentationOrder:d.presentationOrder}),T=Jl(d),B=x.find((q)=>q.deviceId===d.deviceId);if(B)return await this.waitForKnownRunningDevice(B,d,C,{context:c,hasExplicitConstraints:T,progress:S});let O=this.dependencies.assertExplicitDeviceNotForeignOwned;if(O)await this.execution.runPhase(c,"checking explicit device ownership",()=>O(d.deviceId,d.platform));let N=await this.execution.runPhase(c,"listing device images",()=>D.listDeviceImages(d.platform)),H=N.find((q)=>q.deviceId===d.deviceId||d.platform==="android"&&q.name===d.deviceId);if(!H)throw new t(`Device '${d.deviceId}' not found. Available booted: ${x.map((q)=>q.deviceId).join(", ")||"none"}. Available images: ${N.map((q)=>q.name).join(", ")||"none"}.`+(d.platform==="ios"?' To create a simulator, enable provisionDevice (enableTools) and call it with device {"platform":"ios","name":"<name>","spec":{"runtime":"<runtime identifier>","deviceType":"<device type identifier>","displayCutout":"any"}}; remove it with deleteDevice.':""));if(T&&!Ql(H,C))throw new t(`Device '${d.deviceId}' does not satisfy the requested constraints. ${Ch(C,[H])}`);let V=await this.bootMatchedImage(H,c,S,{presentationOrder:d.presentationOrder,preferRunning:d.preferRunning,exactTarget:d.platform==="android"&&d.deviceId===H.name});return Go(V.device,H),V}async waitForKnownRunningDevice(d,c,S,{context:D,hasExplicitConstraints:C,progress:x}){zl(c,d);let T=await this.enrichKnownRunningDevice(d,c.deviceId,C,D);mw.bindDeviceExecution(T.device.deviceId);let[B]=await KC([T.device],S.requires,this.dependencies.displayInventory??ms,D.signal);if(C&&!Ql(B,S))throw new t(`Device '${c.deviceId}' does not satisfy the requested constraints. ${Ch(S,[{...B,booted:!0}])}`);let O=await this.waitForRunningDevice(B,D,x);return T.image?{...O,device:ye(O.device,T.image),sourceImage:T.image}:O}async enrichKnownRunningDevice(d,c,S,D){let C=d.platform==="ios"&&d.iosVersion===void 0&&d.osVersion===void 0,x=d.platform==="android"?le(d.deviceId):d.deviceId.includes("-")&&d.deviceId.length>30;if(S||C||x)try{return await this.execution.enrichBootedDeviceFromImage(d,D)}catch(T){if(S)throw T;e.warn(`[DeviceBootService] Exact device '${c}' metadata enrichment failed; adopting discovered device: ${r(T)}`,T)}return{device:d,image:void 0}}async bootMatchingDevice(d,c,S){let{deviceManager:D,deviceMatcher:C,matchingStrategy:x}=this.dependencies,T={platform:d.platform,minOsVersion:d.minOsVersion,maxOsVersion:d.maxOsVersion,name:d.name,formFactor:d.formFactor,requires:d.requires,screenSize:d.screenSize},B=d.matchNamedDeviceIgnoringOsVersion?{...T,minOsVersion:void 0,maxOsVersion:void 0}:T,N=(await this.execution.runPhase(c,"listing device images",()=>D.listDeviceImages(d.platform))).filter((G)=>!or(G,d.excludeDeviceNames,d.excludeDeviceIds)),H=[],V=await this.findRunningMatch(d,B,N,{context:c,progress:S,candidates:H});if(V)return V;let q=d.matchExactName&&d.name?N.find((G)=>G.name===d.name&&Ql(G,B))??null:C.matchDeviceImage(B,N,x);if(q){let G=await this.bootMatchedImage(q,c,S,{presentationOrder:d.presentationOrder,preferRunning:d.preferRunning,exactTarget:d.matchExactName===!0});if(d.matchExactName)Go(G.device,q);return G}if(d.matchExactName&&d.name){if(N.some((G)=>G.name===d.name))throw new t(`No ${d.platform} device matching criteria found for exact target '${d.name}'. `+Ch(B,N));throw new t(`target_not_found: Configured ${d.platform} device '${d.name}' was not found; an exact target cannot be replaced or created by acquisition.`)}let W=[...H,...N.filter((G)=>!H.some((ie)=>ie.name===G.name))];return this.provisionAndBoot(d,T,N,{context:c,progress:S,candidates:W})}async findRunningMatch(d,c,S,{context:D,progress:C,candidates:x}){if(d.preferRunning===!1)return;let T=await this.execution.discoverBootedDevices(d.platform,D,"discovering running devices",{bypassAndroidCache:d.matchExactName&&d.name!==void 0,awaitAbortSettlement:!1,presentationOrder:d.presentationOrder});Xl(d,T);let{excludeDeviceNames:B,excludeDeviceIds:O}=d,N=B||O?T.filter((G)=>!B?.has(G.name)&&!O?.has(G.deviceId)):T,H=await $h(void 0,()=>KC(zo(N,S),c.requires,this.dependencies.displayInventory??ms,D.signal));x?.push(...H);let V=d.matchExactName&&d.name?Zl(d.platform,H,d.name,c):this.matchBootedPreferringUndeferred(c,H,d.deferDeviceIds);if(!V)return;await this.execution.reportProgress(D,C,100,"Found matching running device");let q=zi(V,S),W=await this.waitForRunningDevice(V,D,C);return Yl(d,W.device),q?{...W,device:ye(W.device,q),sourceImage:q}:W}matchBootedPreferringUndeferred(d,c,S){let{deviceMatcher:D,matchingStrategy:C}=this.dependencies,x=S?.size?c.filter((T)=>!S.has(T.deviceId)):c;return D.matchBootedDevice(d,x,C)??(x.length<c.length?D.matchBootedDevice(d,c,C):null)}adoptAfterLeasePolicy(d,c,S,D){let C=d.ownsLifecycleLease||this.dependencies.allowExternalLeaseAdoptionRecheck===!0,x=S===!1&&!c.isRunning;if(!C||x)return"never";return c.platform==="ios"||D?"always":"if-queued"}async bootMatchedImage(d,c,S,{presentationOrder:D,preferRunning:C,exactTarget:x}){let T=Q(d.platform,"Starting a device");if(!d.isRunning&&d.platform!=="android")return this.bootImage(d,c,S,{provisioned:!1,adoptAfterLease:this.adoptAfterLeasePolicy(c,d,C,!1)});let B=await this.execution.discoverBootedDevices(T,c,"resolving the running device image",{bypassAndroidCache:d.platform==="android",awaitAbortSettlement:!0,presentationOrder:D});yl(d,B,x===!0,c.freshProvision===!0);let O=ir(d,B),N=d.platform==="android"&&tr(this.lifecycleCoordinator,d.name),H=C===!1&&!d.isRunning,V=this.adoptAfterLeasePolicy(c,d,C,N);if(!O)return this.bootImage(d,c,S,{provisioned:!1,adoptAfterLease:V});if(N||H)return this.bootImage(d,c,S,{provisioned:!1,adoptAfterLease:V});let q=await this.waitForRunningDevice(ye(O,d),c,S);return{...q,device:ye(q.device,d),sourceImage:d}}async provisionAndBoot(d,c,S,{context:D,progress:C,candidates:x=S}){let T=x.map((q)=>({...q,booted:"isRunning"in q?q.isRunning:!0}));if(!this.dependencies.deviceCreationGate.isCreationAllowed(d.createIfMissing))throw eu(d,c,S,T);zQ(c,T);let B=this.dependencies.checkBootCapacity??((q,W)=>qo.assertBootCapacityAvailable(q,{signal:W}));await this.execution.runPhase(D,"checking boot capacity",(q)=>B(c.platform,q));let O,N,H,V=this.provisioningIdentityHooks(D,(q)=>{O=q},(q)=>{N=q});try{let q=await this.execution.runPhase(D,"provisioning a device",(G)=>(H=this.dependencies.deviceProvisioner.provision(c,G,V),H));return O=q,{...await this.bootImage(rr(q,d),D,C,{provisioned:!0}),...q.prebootDisabledResources?{prebootDisabledResources:q.prebootDisabledResources}:{}}}catch(q){throw await this.rollbackFailedProvisioning(d,q,{created:O,creationStarted:N,provisioning:H}),q}}async rollbackFailedProvisioning(d,c,{created:S,creationStarted:D,provisioning:C}){if(S)await this.dependencies.rollbackCreatedDevice?.(rr(S,d),c);else if(D&&!(c instanceof Mf))await this.dependencies.rollbackCreatedDevice?.(rr(D,d),c,{pendingCreation:C})}provisioningIdentityHooks(d,c,S){return{reserveBeforeCreate:async(D)=>{if(D.platform==="android")await this.bindLifecycleIdentity(d,{platform:"android",stableId:D.name});return S(D),d.signal},bindAfterCreate:async(D)=>{if(c(D),D.platform==="ios"){if(!D.deviceId)throw new t(`Created iOS simulator '${D.name}' has no lifecycle identity.`);await this.bindLifecycleIdentity(d,{platform:"ios",stableId:D.deviceId})}}}}async waitForRunningDevice(d,c,S){if(c.request.cameraPosterPath!==void 0)throw new t(!le(d.deviceId)?"cameraPosterPath is unsupported on physical Android devices. Use a stopped Android emulator.":"cameraPosterPath is unsupported on a running Android emulator. Stop it before requesting a poster.");if(d.platform==="ios")await this.bindLifecycleIdentity(c,{platform:"ios",stableId:d.deviceId},async()=>await this.revalidateRunningIdentity(d,c));else if(d.deviceId.startsWith("emulator-")&&d.name!==`Unknown (${d.deviceId})`)await this.bindLifecycleIdentity(c,{platform:"android",stableId:d.name},async()=>await this.revalidateRunningIdentity(d,c));let D={...d,isRunning:!0},C=0;return this.bootRecovery.run(D,async()=>{if(C++,C>1)return this.bootImageOnce(D,c,S,!1);let x=await this.execution.runPhase(c,"waiting for a running device",(T)=>this.dependencies.deviceManager.waitForDeviceReady({...d,isRunning:!0},this.execution.remaining(c,"waiting for a running device"),void 0,{signal:T}));return{device:{...d,...x},source:"booted",provisioned:!1}},c.signal)}async revalidateRunningIdentity(d,c){return tu({execution:this.execution},d,c)}async revalidateImageIdentity(d,c){return iu({execution:this.execution,dependencies:this.dependencies},d,c)}async findRunningImageAfterLease(d,c,S=!0){return ru({execution:this.execution,dependencies:this.dependencies,lifecycleCoordinator:this.lifecycleCoordinator,timer:this.timer},d,c,S)}async boundedIosRecheck(d,c,S){return Xo({timer:this.timer},d,c,S)}async bootImage(d,c,S,{provisioned:D,adoptAfterLease:C="never"}){if(c.deviceLabel=d.deviceId?`${d.name} (${d.deviceId})`:d.name,d.isRunningStateKnown===!1)d=await this.execution.recheckRunningState(d,c);if(qv(d),d.platform==="ios"&&!d.deviceId)throw new t("iOS simulator deviceId (UDID) is required to start a simulator.");let x=!1;await this.bindLifecycleIdentity(c,{platform:d.platform,stableId:d.platform==="android"?d.name:d.deviceId},async()=>(x=!0,await this.revalidateImageIdentity(d,c)));let T=C==="always"||C==="if-queued"&&x;if(T){let O=await this.adoptRunningImageAfterLease(d,c,S);if(O)return O}let B=jo(this.lifecycleCoordinator,d,this.dependencies.onAndroidColdBootTrackingChanged);try{return await this.bootRecovery.run(d,async()=>this.bootImageAdoptingAlreadyRunning(d,c,S,{provisioned:D,adoptRunningAfterLease:T}),c.signal)}finally{B?.()}}async adoptRunningImageAfterLease(d,c,S,D=!0){let C=await this.findRunningImageAfterLease(d,c,D);if(!C)return;return{...await this.waitForRunningDevice(ye(C,d),c,S),sourceImage:d}}async bootImageAdoptingAlreadyRunning(d,c,S,{provisioned:D,adoptRunningAfterLease:C}){try{return await this.bootImageOnce(d,c,S,D)}catch(x){if(!C||d.platform!=="ios"||!(x instanceof Rw))throw x;let T=await this.adoptRunningImageAfterLease(d,c,S,!1);if(!T)throw x;return T}}async bootImageOnce(d,c,S,D){let C=jo(this.lifecycleCoordinator,d,this.dependencies.onAndroidColdBootTrackingChanged);try{return await this.execution.bootImageOnceWithOwnedLaunchTracking(d,c,S,D)}catch(x){throw await c.unheldLaunchTermination,x}finally{C?.()}}}function PI(d,c){if(c!=="either")return c;return Ea(d)?"ios":le(d)?"android":c}function ZP(d,c,S="either"){let D=d.filter((T)=>S==="either"||T.platform===S),C=D.find((T)=>T.deviceId===c);if(C)return C;let x=D.filter((T)=>T.name===c);if(x.length>1)throw new t(`Ambiguous running device name '${c}'. Candidates: ${x.map((T)=>T.deviceId).sort().join(", ")}. Provide a deviceId.`);return x[0]}class Yo extends t{}function sZ(d){return d instanceof Yo}function wN(d,c,S){return new Yo(`Device ${d} not found on ${c} platform. Available ${c} devices: ${Qo(S.filter((D)=>c==="either"||D.platform===c))}`)}function Qo(d){return d.map((c)=>c.name&&c.name!==c.deviceId?`${c.name} (${c.deviceId})`:c.deviceId).join(", ")||"none"}class su{resumeAfterDeviceStart(d,c){switch(d){case"android":k.resumeAfterDeviceStart(c);return;case"ios":_.resumeAfterDeviceStart(c);return;case"watchos":return}}async retireForShutdown(d,c){switch(d){case"android":k.retireForShutdown(c);return;case"ios":await _.retireInstance(c);return;case"watchos":return}}}var oS=new su;function AI(d,c=w){let S=d?.trim();if(!S)return;let D=c.sessionManager();return D?rt(S,D)??S:S}var TI=30000,kI=1800000,d6=30000;var ga={includeAppData:!0,includeSettings:!0,useVmSnapshot:!0,strictBackupMode:!1,vmSnapshotTimeoutMs:TI,maxVmSnapshotsPerAvd:3,maxVmArchiveSizeMb:void 0,maxArchiveSizeMb:100};var Zo="global",fw=s({syncWithHost:h(),defaultMode:p(["light","dark","auto"]),applyOnConnect:h()}),gw=s({includeAppData:h().default(ga.includeAppData),includeSettings:h().default(ga.includeSettings),useVmSnapshot:h().default(ga.useVmSnapshot),strictBackupMode:h().default(ga.strictBackupMode),vmSnapshotTimeoutMs:a().default(ga.vmSnapshotTimeoutMs),maxVmSnapshotsPerAvd:a().default(ga.maxVmSnapshotsPerAvd),maxVmArchiveSizeMb:a().optional(),maxArchiveSizeMb:a().default(ga.maxArchiveSizeMb)}),vw=s({qualityPreset:p(["low","medium","high"]),targetBitrateKbps:a(),maxThroughputMbps:a(),fps:a(),maxArchiveSizeMb:a(),format:I("mp4"),resolution:s({width:a(),height:a()}).optional()}),es={appearance:{tableName:"appearance_configs",loggerTag:"AppearanceConfigRepository",schema:fw},deviceSnapshot:{tableName:"device_snapshot_configs",loggerTag:"DeviceSnapshotConfigRepository",schema:gw},videoRecording:{tableName:"video_recording_configs",loggerTag:"VideoRecordingConfigRepository",schema:vw}};class au{tableName;loggerTag;db;logger;timer;schema;constructor(d){this.schema=d.schema,this.tableName=d.tableName,this.loggerTag=d.loggerTag??"KeyedJsonConfigRepository",this.db=d.db??null,this.logger=d.logger??e,this.timer=d.timer??i}getDb(){return this.db??ke()}async getConfig(d=Zo){let S=await(await this.getDb()).selectFrom(this.tableName).select(["config_json"]).where("key","=",d).executeTakeFirst();if(!S)return null;let D;try{D=JSON.parse(S.config_json)}catch(x){return this.logger.warn(`[${this.loggerTag}] Failed to parse config JSON: ${r(x)}`),null}let C=this.schema.safeParse(D);if(!C.success)return this.logger.warn(`[${this.loggerTag}] Config JSON failed validation: ${C.error.message}`),null;return C.data}async setConfig(d,c=Zo){let S=await this.getDb(),D=$r(this.timer),C={key:c,config_json:JSON.stringify(d),updated_at:D};await S.insertInto(this.tableName).values(C).onConflict((x)=>x.column("key").doUpdateSet({config_json:C.config_json,updated_at:C.updated_at})).execute()}async clearConfig(d=Zo){await(await this.getDb()).deleteFrom(this.tableName).where("key","=",d).execute()}async listKeys(d){return(await(await this.getDb()).selectFrom(this.tableName).select(["key"]).execute()).map((D)=>D.key).filter((D)=>D.startsWith(d))}}function ts(d,c){return new au({...d,db:c})}function du(d){return ts(es.appearance,d)}function aZ(d){return ts(es.deviceSnapshot,d)}function l6(d){return ts(es.videoRecording,d)}var Kt={syncWithHost:!0,defaultMode:"auto",applyOnConnect:!0},hw=new Set(["light","dark","auto"]);function ft(d){let c=d&&typeof d==="object"?d:{},S=yw(c.defaultMode),D=typeof c.syncWithHost==="boolean"?c.syncWithHost:Kt.syncWithHost,C=typeof c.applyOnConnect==="boolean"?c.applyOnConnect:Kt.applyOnConnect;return{syncWithHost:D,defaultMode:S,applyOnConnect:C}}function yw(d){if(!d)return Kt.defaultMode;let c=String(d).trim().toLowerCase();if(hw.has(c))return c;return Kt.defaultMode}var ww="defaults",Sw="-g",_w=2000;function Dw(){return{executor:new ne,platform:process.platform,logger:e}}class is{dependencies;constructor(d=Dw()){this.dependencies=d}isSupported(){return this.dependencies.platform==="darwin"}async readGlobal(d,c={}){if(!this.isSupported())return null;try{let D=(await this.dependencies.executor.executeCommand(ww,["read",Sw,d],{timeoutMs:c.timeoutMs??_w,signal:c.signal})).stdout.trim();return D.length>0?D:null}catch(S){return this.dependencies.logger.debug(`host defaults read -g ${d} failed: ${S}`,S),null}}}async function ar(d,c,S){try{let D=await S.executeCommand(d,c,{timeoutMs:2000});return{stdout:D.stdout?D.stdout.toString():"",stderr:D.stderr?D.stderr.toString():""}}catch(D){return e.debug(`src/utils/hostAppearance.ts fallback failed: ${D}`,D),null}}function rs(d){let c=d.trim().toLowerCase();return c.includes("dark")||c.includes("prefer-dark")}async function cu(d=new is,c=new ne){if(d.isSupported())return(await d.readGlobal("AppleInterfaceStyle"))?.toLowerCase()==="dark"?"dark":"light";if(process.platform==="linux"){let S=await Pw(c);if(S!==null)return S}return e.debug("[HostAppearance] Falling back to light appearance (unsupported host)"),"light"}async function Pw(d){let c=await ar("gsettings",["get","org.gnome.desktop.interface","color-scheme"],d);if(c?.stdout)return rs(c.stdout)?"dark":"light";let S=await ar("gsettings",["get","org.gnome.desktop.interface","gtk-theme"],d);if(S?.stdout)return rs(S.stdout)?"dark":"light";let D=await ar("kreadconfig5",["--group","General","--key","ColorScheme"],d)??await ar("kreadconfig6",["--group","General","--key","ColorScheme"],d);if(D?.stdout)return rs(D.stdout)?"dark":"light";return null}var gt=du(),os="session:";function cr(d){return d?`${os}${d}`:void 0}function Cw(d,c){return{syncWithHost:c.syncWithHost??d.syncWithHost,defaultMode:c.defaultMode??d.defaultMode,applyOnConnect:c.applyOnConnect??d.applyOnConnect}}function Iw(d){return{syncWithHost:d.syncWithHost,defaultMode:d.defaultMode,applyOnConnect:d.applyOnConnect}}async function Py(d){let c=(d?await gt.getConfig(cr(d)):null)??await gt.getConfig();if(c)return ft(c);return ft(M.getAppearanceDefaults())}async function cZ(d,c){if(d===null)return await gt.clearConfig(cr(c)),ft(M.getAppearanceDefaults());let S=await Py(c),D=Cw(Iw(S),d),C=ft(D);return await gt.setConfig(C,cr(c)),C}async function NH(d){await gt.clearConfig(cr(d))}async function dZ(d,c=gt){let S=[];for(let D of await c.listKeys(os)){let C=D.slice(os.length);if(!await d(C))await c.clearConfig(D),S.push(C)}return S}async function QP(d){let c=d??await Py();if(c.syncWithHost||c.defaultMode==="auto")return cu();return c.defaultMode==="dark"?"dark":"light"}import{existsSync as Aw}from"fs";import{join as Ew}from"path";async function eA(d,c){if(d.platform==="android"){let S=process.platform==="win32"?"adb.exe":"adb";if(!Hc(process.env,(T)=>Aw(Ew(T,"platform-tools",S)))){e.debug("Skipping Android host appearance sync because configured SDK adb was not found");return}let C=v.create(d),x=c==="dark"?"yes":"no";await C.executeCommand(`shell cmd uimode night ${x}`),e.info(`[Appearance] Set Android appearance to ${c} for ${d.deviceId}`);return}if(d.platform==="ios")await new F(d).setAppearance(c),e.info(`[Appearance] Set iOS appearance to ${c} for ${d.deviceId}`)}function FH(d){return!["0","false","off","no"].includes(d?.trim().toLowerCase()??"")}function Ay(){return FH(E(g.APPEARANCE_SYNC))}var xw={isSyncEnabled:Ay,getConfig:Py,resolveMode:QP,apply:eA};async function mu(d,c={},S){let{isSyncEnabled:D,getConfig:C,resolveMode:x,apply:T}={...xw,...c};if(!D())return null;try{let B=await C(S);if(!B.applyOnConnect)return null;let O=await x(B);if(!D())return null;return await T(d,O),O}catch(B){return e.warn("[Appearance] Failed to apply appearance on connect",B),null}}var it=new Map,Tw=256;function fu(){return w.sessionManager()}function RN(d,c,S,D=fu()){if(S){let C=D?.getSession(S);if(C&&C.assignedDevice===d){C.cacheData.pendingSetupTiming=c;return}if(D&&!C)return}if(it.delete(d),it.set(d,{timing:c,sessionId:S}),it.size>Tw){let C=it.keys().next().value;if(C!==void 0)it.delete(C)}}function pu(d,c){let S=it.get(d);if(!S||S.sessionId!==c)return null;return it.delete(d),S.timing}function lZ(d,c,S=fu()){if(c){let D=S?.getSession(c);if(!D||D.assignedDevice!==d){if(S&&!D)return null;return pu(d,c)}let C=D.cacheData.pendingSetupTiming;return delete D.cacheData.pendingSetupTiming,C??null}return pu(d)}function LH(d,c){return Xa(d.name)||zc(d.name)||c?.holderOf({platform:d.platform,stableIds:[d.name,d.deviceId]})!==void 0}async function ss(d,c){await Nd(c);let S=d.filter((D)=>!LH(D,c));if(S.length===0)throw new t("Cannot automatically start a device: all available images are broker-managed or held by a binding. Pass a deviceId to select an explicit target, or start a non-broker device and retry.");return S[0]}class lr extends t{}class as{dependencies;constructor(d){this.dependencies=d}async ensureReady(d,c,S){let D=ka(!0);D.serial("ensureAccessibilityService");let C={didSetup:!1,needsSetup:!1};try{await this.ensureService(c,d,S,{perf:D,state:C})}catch(x){this.handleSetupFailure(x,d,S)}finally{this.finishSetupTiming(d,D,C,S)}}skipCtrlProxyDownload(d){return d?.skipCtrlProxyDownload??d?.skipAccessibilityDownload??d?.skipAccessibilitySetup}warnDeprecatedAccessibilityOptions(d){if(d?.skipAccessibilitySetup!==void 0)if(d?.skipAccessibilityDownload!==void 0)e.warn("[DeviceReadiness] skipAccessibilityDownload is deprecated; use skipCtrlProxyDownload instead.");else e.warn("[DeviceReadiness] skipAccessibilitySetup is deprecated; use skipCtrlProxyDownload instead.")}async verifyConnectedAndroidService(d,c,S){if(e.info(`[DeviceReadiness] WebSocket connected for ${d}, verifying service is responsive`),await S.track("verifyConnectedService",()=>c.verifyServiceReady(2,200,2000)))return e.info(`[DeviceReadiness] Accessibility service verified responsive for ${d}`),S.end(),!0;return e.warn(`[DeviceReadiness] WebSocket connected but service not responsive for ${d}, terminating stale connection and checking status`),c.terminateStaleConnection(),!1}async verifyEnabledAndroidService(d,c,S,{perf:D,step:C}){let{setupState:x,skipCtrlProxyDownload:T,verifyCompatibilityWhenSkipping:B,signal:O}=C;if(e.info(`[DeviceReadiness] Accessibility service already enabled for ${d}, verifying WebSocket connection`),await D.track("verifyConnection",()=>S.waitForConnection(3,200))){if(T)return await B(),!0;e.info(`[DeviceReadiness] Accessibility service enabled and connected for ${d}, verifying version compatibility`),await this.upgradeStaleInstall(d,c,x)}else await this.throwAndroidForwardConflictIfPresent(d,c,S,O),e.warn(`[DeviceReadiness] Accessibility service cache stale for ${d} - marked as installed/enabled but WebSocket failed. Resetting setup state and forcing reinstall.`),c.resetSetupState(),x.needsSetup=!0;return!1}async upgradeStaleInstall(d,c,S){try{let D=await c.ensureCompatibleVersion();if(D.status==="upgraded"||D.status==="installed"||D.status==="reinstalled")e.info(`[DeviceReadiness] CtrlProxy APK on ${d} was ${D.status}; reconnecting`),S.needsSetup=!0}catch(D){if(D instanceof this.dependencies.errors.DeviceOwnedByOtherDaemonError)throw D;e.warn(`[DeviceReadiness] CtrlProxy APK check failed on ${d}: ${r(D)}`,D)}}async enableInstalledAndroidService(d,c,S,{perf:D,step:C}){let{DeviceOwnedByOtherDaemonError:x}=this.dependencies.errors,{setupState:T,skipCtrlProxyDownload:B,verifyCompatibilityWhenSkipping:O,signal:N}=C;e.info(`[DeviceReadiness] Accessibility service installed but not enabled for ${d}, enabling now`);try{if(await D.track("enableService",()=>c.enable()),T.didSetup=!0,S.resetConnectionBudget(),e.info(`[DeviceReadiness] Waiting for accessibility WebSocket connection for ${d}`),!await D.track("waitForConnection",()=>S.waitForConnection()))await this.throwAndroidForwardConflictIfPresent(d,c,S,N),e.warn(`[DeviceReadiness] WebSocket connection failed after enabling for ${d}, will attempt full setup`),c.resetSetupState(),T.needsSetup=!0;else{if(B)return await O(),!0;e.info(`[DeviceReadiness] Accessibility service enabled for ${d}, verifying version compatibility`)}}catch(H){if(H instanceof x||S.isLastConnectionFailureForwardingLeaseConflict?.())throw H;let V=r(H);if(e.warn(`[DeviceReadiness] Failed to enable accessibility service: ${V}`),B)return!0;T.needsSetup=!0}return!1}async setupAndroidService(d,c,S,{perf:D,state:C,signal:x}){let{DeviceOwnedByOtherDaemonError:T,CtrlProxyForwardOwnershipUnreadableError:B}=this.dependencies.errors,O=await c.setup(!1,D);if(!O.success){if(O.cause instanceof T||O.cause instanceof B)throw O.cause;throw new t(O.error??O.message)}C.didSetup=!0,S.resetConnectionBudget(),e.info(`[DeviceReadiness] Waiting for accessibility WebSocket connection after setup for ${d}`);let N=await D.track("waitForConnection",()=>S.waitForConnection());if(!N)await this.throwAndroidForwardConflictIfPresent(d,c,S,x);if(N){if(e.info(`[DeviceReadiness] Verifying accessibility service is responsive for ${d}`),!await D.track("verifyServiceReady",()=>S.verifyServiceReady(5,500,3000)))e.warn(`[DeviceReadiness] Accessibility service not responsive after setup for ${d}, observe may fall back to UIAutomator`)}}async throwAndroidForwardConflictIfPresent(d,c,S,D){if(!S.isLastConnectionFailureForwardingLeaseConflict?.())return;throw await c.assertNotDrivenByOtherDaemon?.(D),D?.throwIfAborted(),new lr(S.getLastConnectionFailureMessage?.()??`CtrlProxy forwarding lease conflict for Android device ${d}`)}async prepareService(d){let{deviceId:c,manager:S,accessibilityClient:D,perf:C,state:x,skipCtrlProxyDownload:T,options:B}=d,O=async()=>{if(await S.isVersionCompatible()){e.info(`[DeviceReadiness] Accessibility service version compatible for ${c}`);return}let q="Accessibility service version mismatch detected. Run without skipCtrlProxyDownload to install a compatible version.";throw e.warn(`[DeviceReadiness] ${q} Device: ${c}`),new t(q)},[N,H]=await C.track("checkStatus",()=>Promise.all([S.isInstalled(),S.isEnabled()]));if(B?.signal?.throwIfAborted(),x.needsSetup=!1,await this.useInstalledService(d,N,H,O))return;if(T&&!x.needsSetup){e.info(`[DeviceReadiness] Skipping accessibility service download/install for ${c}`);return}if(x.needsSetup||!N)B?.signal?.throwIfAborted(),await this.setupAndroidService(c,S,D,{perf:C,state:x,signal:B?.signal})}async ensureService(d,c,S,{perf:D,state:C}){let x=this.skipCtrlProxyDownload(S);this.warnDeprecatedAccessibilityOptions(S);let T=this.dependencies.provider.getAndroidCtrlProxyManager(d),B=this.dependencies.provider.getAndroidCtrlProxyClient(d);if(B.isConnected()){if(await this.verifyConnectedAndroidService(c,B,D)){S?.signal?.throwIfAborted(),this.dependencies.checkedAndroidOwnership.getStore()?.add(c);return}}await T.assertNotDrivenByOtherDaemon?.(S?.signal),S?.signal?.throwIfAborted(),this.dependencies.checkedAndroidOwnership.getStore()?.add(c),await this.prepareService({deviceId:c,manager:T,accessibilityClient:B,perf:D,state:C,skipCtrlProxyDownload:x,options:S})}finishSetupTiming(d,c,S,D){if(c.end(),S.didSetup){let C=c.getTimings();if(C)this.dependencies.storeSetupTiming(d,C,D?.sessionId)}}async useInstalledService(d,c,S,D){let{deviceId:C,manager:x,accessibilityClient:T,perf:B,state:O,skipCtrlProxyDownload:N,options:H}=d;if(c&&S){if(await this.verifyEnabledAndroidService(C,x,T,{perf:B,step:{setupState:O,skipCtrlProxyDownload:N,verifyCompatibilityWhenSkipping:D,signal:H?.signal}}))return!0}if(!c&&N)return e.info(`[DeviceReadiness] Accessibility service not installed for ${C}, skipping download/install`),!0;if(c&&!S&&!O.needsSetup){if(await this.enableInstalledAndroidService(C,x,T,{perf:B,step:{setupState:O,skipCtrlProxyDownload:N,verifyCompatibilityWhenSkipping:D,signal:H?.signal}}))return!0}return!1}handleSetupFailure(d,c,S){let{DeviceOwnedByOtherDaemonError:D,CtrlProxyForwardOwnershipUnreadableError:C}=this.dependencies.errors;S?.signal?.throwIfAborted();let x=r(d);if(S?.intent==="read"&&(d instanceof D||d instanceof C||d instanceof lr)){e.warn(`[DeviceReadiness] Skipping CtrlProxy readiness for read on ${c}: ${x}`);return}if(e.error(`[DeviceReadiness] Failed to setup accessibility service: ${x}`),d instanceof t||S?.signal?.aborted)throw d}}class ds{observeClients;_adb;_adbFactory;_simctl;_androidEmulator;_deviceUtils;_windows=new Map;constructor(d,c=v){this.observeClients=d;this._adbFactory=c}getAdb(){if(!this._adb)this._adb=this._adbFactory.create(null);return this._adb}getSimctl(){if(!this._simctl)this._simctl=new F(null);return this._simctl}getAndroidEmulator(){if(!this._androidEmulator)this._androidEmulator=new ii;return this._androidEmulator}getDeviceUtils(){if(!this._deviceUtils)this._deviceUtils=new oi(this.getAdb(),this.getSimctl(),this.getAndroidEmulator());return this._deviceUtils}getIosPhysicalDeviceLister(){return YC()}getAndroidCtrlProxyManager(d){return ce.getInstance(d)}getAndroidCtrlProxyClient(d){return this.observeClients.androidCtrlProxyClient(d)}getIOSCtrlProxyManager(d){return ge.getInstance(d)}getIOSCtrlProxyClient(d,c){return this.observeClients.iosCtrlProxyClient(d,c)}getWindow(d){let c=d.deviceId,S=QC(d,wn(d)),D=this._windows.get(c);if(!D)return this.cacheWindow(c,d,S);if(S.unresolved)return D.window;let C=lu(D.evidence,S);if(S.stableId===D.evidence.stableId){if(C==="newer")D.evidence=S;return D.window}if(C!=="newer")return D.window;return this.cacheWindow(c,d,S)}cacheWindow(d,c,S){let D=this.observeClients.createWindow(c,this._adbFactory);return this._windows.set(d,{window:D,evidence:S}),D}getObserveScreenCache(){return this.observeClients.observeScreenCache()}}var Bw={androidCtrlProxyClient:(d)=>k.getInstance(d),iosCtrlProxyClient:(d,c)=>_.getInstance(d,c),createWindow:(d,c)=>new pl(d,c),observeScreenCache:()=>Ie.defaultObserveScreenCache};function us(d){return new ds(Bw,d)}var gu=1000,vu=1e4,kw={booted:0,automationReady:1};function BH(d){return kw[d]}async function hu(d,c,S){let D=d.runnerReadinessTimer.now()+Hr,C=()=>{let O=D-d.runnerReadinessTimer.now();if(O<=0)throw new t("Created iOS simulator rollback budget exhausted.");return O};if(!c.deviceId){e.warn(`[DeviceReadiness] Cannot roll back created iOS simulator '${c.name}': no UDID.`);return}e.warn(`[DeviceReadiness] Rolling back created iOS simulator '${c.name}' (${c.deviceId}) after failure: ${r(S)}`);let x=new AbortController().signal,T={name:c.name,platform:"ios",deviceId:c.deviceId},B="retire runner";try{await Ow(d,T),B="shut down",await Mw(d,T,x,C()),B="delete",await d.simctl().deleteSimulator(c.deviceId,{signal:x,timeoutMs:C()}),B="verify absence of",C(),await Nw(d,c.deviceId,x,D)}catch(O){let N=D-d.runnerReadinessTimer.now(),H=N>0?await Fw(d,c.deviceId,x,N):"unknown";e.warn(`[DeviceReadiness] Failed to ${B} created iOS simulator '${c.name}' (${c.deviceId}, state: ${H}); it may be left behind: `+r(O),O)}}async function Ow(d,c){try{await _.retireInstance(c.deviceId),await d.provider.getIOSCtrlProxyManager(c).stop()}catch(S){e.warn(`[DeviceReadiness] Failed to stop CtrlProxy iOS for created simulator ${c.deviceId} before rollback: ${r(S)}`,S)}}async function Mw(d,c,S,D=Hr){try{await d.simctl().killSimulator(c,{signal:S,timeoutMs:D})}catch(C){if(!RT(C)){e.warn(`[DeviceReadiness] Failed to shut down created iOS simulator ${c.deviceId}; attempting delete: ${r(C)}`,C);return}e.debug(`[DeviceReadiness] ${c.deviceId} was already shut down: ${r(C)}`)}}async function Nw(d,c,S,D=Number.POSITIVE_INFINITY){let C=Math.min(d.runnerReadinessTimer.now()+vu,D);for(;;){let x=C-d.runnerReadinessTimer.now();if(x<=0)throw new t(`iOS simulator ${c} is still listed after delete.`);if(!(await d.simctl().listSimulatorImages(x,{bypassCache:!0,signal:S})).some((B)=>B.deviceId===c))return;if(d.runnerReadinessTimer.now()>=C)throw new t(`iOS simulator ${c} is still listed after delete.`);await d.runnerReadinessTimer.sleep(Math.min(gu,C-d.runnerReadinessTimer.now()))}}async function Fw(d,c,S,D){try{let x=(await d.simctl().listSimulatorImages(D,{bypassCache:!0,signal:S})).find((T)=>T.deviceId===c);return x?x.state??"unknown":"absent"}catch(C){return e.warn(`[DeviceReadiness] Could not read state of ${c}: ${r(C)}`,C),"unknown"}}async function yu(d,c,S,D={}){D.signal?.throwIfAborted();let C=await d.getBootedDevicesDetailed("visionos",{signal:D.signal});if(D.signal?.throwIfAborted(),!C.succeededPlatforms.has("visionos"))throw new t(`visionOS simulator discovery failed: ${C.discoveryErrors?.visionos?.message??"unknown error"}. Retry the call.`);let x=$w(C.devices,c,S);if(!x)throw new t("No booted Apple Vision Pro matches the request uniquely. Pass deviceId or boot it with startDevice and platform visionos.");if(D.intent==="read")await D.beforeReadReadiness?.(x);return x}function $w(d,c,S){let D=d.filter((x)=>x.platform==="visionos"),C=c??(S?.platform==="visionos"?S.deviceId:void 0);return C?D.find((x)=>x.deviceId===C):D.length===1?D[0]:void 0}async function wu(d,c,S,D={}){D.signal?.throwIfAborted();let C=await d.getBootedDevicesDetailed("tvos",{signal:D.signal});if(D.signal?.throwIfAborted(),!C.succeededPlatforms.has("tvos"))throw new t(`tvOS simulator discovery failed: ${C.discoveryErrors?.tvos?.message??"unknown error"}. Retry the call.`);let x=Uw(C.devices,c,S);if(!x)throw new t("No booted Apple TV matches the request uniquely. Pass deviceId or boot it with startDevice and platform tvos.");if(D.intent==="read")await D.beforeReadReadiness?.(x);return x}function Uw(d,c,S){let D=d.filter((x)=>x.platform==="tvos"),C=c??(S?.platform==="tvos"?S.deviceId:void 0);return C?D.find((x)=>x.deviceId===C):D.length===1?D[0]:void 0}async function Su(d,c,S){try{return await d.deviceUtils().startDevice(c)}catch(D){if($v(D)&&D.process)S.holdLeaseUntil(Xi(D.process,c.name,d.runnerReadinessTimer,{markHeldByUnkillableProcess:(C)=>S.lease.markHeldByUnkillableProcess?.(C)}).then((C)=>C.state==="survived"?C.gone:void 0));throw D}}async function ps(d,c,S){let D=[c?.signal,d.signal].filter((C)=>C!==void 0);return await S(D.length===1?D[0]:AbortSignal.any(D))}function Ru(d,c,S){if(c?.intent==="read"&&S.precedingOperations?.some((D)=>D==="shutdown"||D==="teardown"))throw new t(`${d.platform} device '${d.name}': a shutdown or teardown ran while this read waited for it; a read does not boot it again. Call startDevice to boot it.`)}function zt(d,c,S){return`iOS simulator '${d}' (${c}) is not booted${S?` (state: ${S})`:""}; a read never boots a simulator. Call startDevice (or acquire a session) to boot it.`}var sS="ambiguous_device_target";class $p extends t{code=sS;retryable=!1;candidates;constructor(d,c){super(`${d} (code ${sS})`);this.name="AmbiguousDeviceTargetError",this.candidates=c.map(({deviceId:S,platform:D})=>({deviceId:S,platform:D}))}toPayload(){return{code:this.code,candidates:this.candidates,retryable:!1}}}async function Du(d,c=v){if(d.platform!=="android")return;if(!d.deviceId.startsWith("emulator-"))return;try{await c.create(d).executeCommand("shell settings put secure stylus_handwriting_enabled 0"),e.info(`[StylusHandwriting] Disabled stylus handwriting on ${d.deviceId}`)}catch(S){e.warn(`[StylusHandwriting] Failed to disable stylus handwriting on ${d.deviceId}: ${S}`)}}class aS{retired=new Map;async retire(d){this.retired.set(d.deviceId,{...d})}async get(d){let c=this.retired.get(d);return c?{...c}:void 0}async clear(d){this.retired.delete(d)}}class $H{store;memory;timer;constructor(d){this.store=d.store,this.memory=d.memory??new aS,this.timer=d.timer??i}async retire(d){await this.store.retire(d,this.timer.now()),await this.memory.retire(d)}async get(d){return await this.memory.get(d)??await this.store.get(d)}async clear(d){await this.store.clear(d),await this.memory.clear(d)}}var fs=E(K.NODE_ENV)==="test"?new aS:void 0;function uZ(d){return fs??=d()}function PN(){if(!fs)throw new t("Provisioned device transport fence is not installed. Initialize the default fence during startup before using device sessions or provisioning.");return fs}async function Pu(d,c={}){let S=PN(),D=await S.get(d);if(!D)return;let C=await c.currentIdentity?.();if(C&&C!==D.stableId){await S.clear(d);return}throw new Xr(d,`Provisioned Android device '${D.stableId}' was removed after ${D.reason}; transport '${d}' is retired and cannot identify a later emulator.`)}function fo(d,c){if(d==="android")return"android";if(d==="visionos")return"visionos-simulator";if(d==="tvos")return"tvos-simulator";if(d==="watchos")return"watchos-simulator";return c!==void 0&&yn(c)?"ios-physical":"ios-simulator"}function cS(d){switch(d){case"android":return["android"];case"ios":return["ios-simulator","ios-physical"];case"watchos":return["watchos-simulator"];case"tvos":return["tvos-simulator"];case"visionos":return["visionos-simulator"]}}function qw(d){switch(d){case"android":return"android";case"visionos-simulator":return"visionos";case"tvos-simulator":return"tvos";case"watchos-simulator":return"watchos";case"ios-simulator":case"ios-physical":return"ios"}}function pi(d,c,S){let D=d.succeededSources;if(D)return D.has(fo(c,S));return d.succeededPlatforms.has(c)}function Bl(d,c){let S=new Set(d.expectedSources);for(let D of c??[])S.add(fo(D.platform,D.id));return{...d,expectedSources:S}}function AN(d,c){let S=qw(c);if(d.succeededSources?d.succeededSources.has(c):d.succeededPlatforms.has(S))return"complete";return(d.sourceErrors?.[c]??d.discoveryErrors?.[S])?.code==="unavailable"&&!d.expectedSources?.has(c)?"not_applicable":"incomplete"}function Cu(d,c,S){return c.flatMap((D)=>cS(D)).filter((D)=>AN(d,D)===S)}function Iu(d,c){return Cu(d,c,"incomplete")}function UH(d,c){return Cu(d,c,"not_applicable")}function TN(d,c,S){return AN(d,fo(c,S))==="incomplete"}function Xt(d){if(d.platform==="ios"||d.platform==="watchos")return{platform:d.platform,stableId:d.deviceId};return le(d.deviceId)&&!wn(d)?{platform:"android",stableId:d.name}:Vv("android",{deviceId:d.deviceId})}function kN(d,c){if(!d.scannedSources)return d.scanned[c.platform];return d.scannedSources[fo(c.platform,c.deviceId)]===!0}async function Au(d,c,S,D={}){let C=await Hw(d,D.signal),x=c??(S?.platform==="watchos"?S.deviceId:void 0),T=x?C.find((B)=>B.deviceId===x):Vw(C);if(!T)throw new t(Ww(x,C));if(D.intent==="read")await D.beforeReadReadiness?.(T);return T}async function Hw(d,c){c?.throwIfAborted();let S=await d.getBootedDevicesDetailed("watchos",{signal:c});if(c?.throwIfAborted(),!S.succeededPlatforms.has("watchos")){let D=S.discoveryErrors?.watchos?.message??"unknown error";throw new t(`watchOS simulator discovery failed: ${D}. Retry the call.`)}return S.devices.filter((D)=>D.platform==="watchos")}function Vw(d){return d.length===1?d[0]:void 0}function Ww(d,c){if(d)return`No booted Apple Watch simulator matches '${d}'. Boot it with startDevice { platform: "watchos", deviceId } first.`;if(c.length===0)return'No Apple Watch simulator is booted. Boot one with startDevice { platform: "watchos" } first.';return`${c.length} Apple Watch simulators are booted (${c.map((S)=>S.deviceId).join(", ")}). Pass deviceId or the watch's sessionUuid.`}var Gw={watchos:Au,tvos:wu,visionos:yu};function xu(d){let c=new Set(d.map((D)=>D.platform));return`${c.size>1?"Both Android and iOS devices are connected.":`Multiple ${c.has("android")?"Android":"iOS"} devices are connected.`} For a device tool call, pass sessionUuid (from getAndroid/getApple), platform, or a bound device label on this call to select the target. Alternatively, call setActiveDevice to select an active device.`}class gs{dependencies;constructor(d){this.dependencies=d}async detectConnectedPlatformsWithStatus(d,c){let S=[],D={android:!1,"ios-simulator":!1,"ios-physical":!1,"watchos-simulator":!1,"tvos-simulator":!1,"visionos-simulator":!1},C=Y();try{C.startOperation("androidDeviceScan");let O=this.mapAndroidReadinessRows(await this.dependencies.adb.getBootedAndroidDevices({signal:d,throwOnMissingAdb:!0}));C.endOperation("androidDeviceScan"),S.push(...O),D.android=!0}catch(O){if(C.endOperation("androidDeviceScan"),d?.throwIfAborted(),O instanceof zu)e.debug(`Android scan skipped: ${O.message}`);else e.warn(`Failed to detect Android devices: ${O}`)}let[x,T]=await Promise.all([this.scanBootedSimulators(C,d),this.scanPhysicalIosDevices(c?.platform,d)]);d?.throwIfAborted();let B=new Set(x.devices.map((O)=>O.deviceId));return S.push(...x.devices,...T.devices.filter((O)=>!B.has(O.deviceId))),D["ios-simulator"]=x.complete,D["ios-physical"]=T.complete,{devices:S,scanned:{android:D.android,ios:D["ios-simulator"]||D["ios-physical"],watchos:!1,tvos:!1,visionos:!1},scannedSources:D}}async scanBootedSimulators(d,c){if(!this.dependencies.simctl)return{devices:[],complete:!1};d.startOperation("iosSimulatorScan");try{return{devices:await this.dependencies.simctl.getBootedSimulatorsChecked(void 0,c),complete:!0}}catch(S){return c?.throwIfAborted(),e.warn(`Failed to detect iOS simulators: ${S}`),{devices:[],complete:!1}}finally{d.endOperation("iosSimulatorScan")}}async scanPhysicalIosDevices(d,c){let S=this.dependencies.provider.getIosPhysicalDeviceLister?.();if(!S||d==="android")return{devices:[],complete:!1};try{let D=await l(()=>S.listConnectedDevices(),{timer:this.dependencies.runnerReadinessTimer,timeoutMs:this.dependencies.physicalIosScanBudgetMs,signal:c,label:"Physical iOS device scan"});return{devices:D.devices,complete:D.complete}}catch(D){return c?.throwIfAborted(),e.warn(`Failed to detect physical iOS devices: ${r(D)}`),{devices:[],complete:!1}}}async ensureDeviceReadyInCall(d,c,S){e.info(`[DeviceReadiness] ensureDeviceReady called with platform=${d}, providedDeviceId=${c}`);let D=Gw[d];if(D){let re=this.dependencies.selection.getPin(S?.connectionId);return D(this.dependencies.deviceUtils,c,re,S)}c=await this.resolveProvidedReadinessId(c);let C=await this.getReadinessScan(d,S),x=this.normalizeReadinessScan(C),T=x.devices;this.reconcileReadinessPin(x,S),e.info(`Found ${T.length} connectedPlatform devices`);let B=T.filter((re)=>re.platform==="android");e.info(`Found ${B.length} android devices`);let O=T.filter((re)=>re.platform==="ios");e.info(`Found ${O.length} ios devices`);let N=await this.resolveReadinessReadTarget(d,c,x,S);if(N.bootedDevice)return await this.finishReadinessSelection(N.bootedDevice,N.bootedDevice.platform,"provided",{scan:x,...S});c=N.providedDeviceId;let{platformDevices:H,resolvedPlatform:V}=this.resolveReadinessPlatform(d,B,O,{providedDeviceId:c,...S}),q,W=!1,G="auto";if(c){let re=this.requireProvidedReadinessDevice(d,H,c);q=await this.resolveAndroidReadinessIdentity(re,S?.signal),G="provided"}let ie=this.findPinnedReadinessDevice(H,S);if(this.shouldResolveReadinessPin(q,c,ie))q=await this.resolveAndroidReadinessIdentity(ie,S?.signal),G="provided";if(!q)e.info(`[DeviceReadiness] Finding or starting device for platform ${V}`),q=await this.findOrStartReadinessDevice(V,x,S),W=!0,G="auto";if(!W){if(!q)throw new t("No device was selected for readiness verification");let re=q;await this.dependencies.withLifecycleStart(Xt(re),S,async(fe)=>await this.dependencies.verifyDevice(re.deviceId,V,{...S,signal:fe},re))}return await this.finishReadinessSelection(q,V,G,{scan:x,...S})}async finishReadinessSelection(d,c,S,{scan:D,...C}){if(d.platform!==c)e.warn(`[DeviceReadiness] Platform mismatch: selected device ${d.deviceId} has platform '${d.platform}' but resolved platform is '${c}'. Discarding and finding correct platform device.`),d=await this.findOrStartReadinessDevice(c,D,C);if(C?.signal?.throwIfAborted(),C?.intent!=="read")await this.assertAndroidSelectionAvailable(d,C?.signal),await this.dependencies.applyAppearanceOnConnect(d,C?.sessionId),C?.signal?.throwIfAborted(),await Du(d,this.dependencies.adbFactory);return e.info(`[DeviceReadiness] Using ${S} device: ${d.deviceId}`),d}async assertAndroidSelectionAvailable(d,c){if(d.platform!=="android"||this.dependencies.checkedAndroidOwnership.getStore()?.has(d.deviceId))return;await this.dependencies.provider.getAndroidCtrlProxyManager(d).assertNotDrivenByOtherDaemon?.(c),c?.throwIfAborted()}shouldResolveReadinessPin(d,c,S){return!d&&!c&&!!S}requireProvidedReadinessDevice(d,c,S){let D=c.find((C)=>C.deviceId===S);if(!D)throw wN(S,d,c);return D}assertReadinessDiscoveryComplete(d,c){let S=d==="either"?["android","ios"]:[d];for(let D of S)if(!c.scanned[D])throw new Ve(D,void 0)}async resolveReadinessReadTarget(d,c,S,D){if(D?.intent!=="read")return{providedDeviceId:c};if(!c)return this.requireRunningReadinessDevice(d,S),{providedDeviceId:c};let C=ZP(S.devices,c,d);if(C)return{providedDeviceId:C.deviceId};return{providedDeviceId:c,bootedDevice:await this.bootProvidedReadinessImage(d,c,S,D)}}requireRunningReadinessDevice(d,c){let S=c.devices.filter((x)=>d==="either"||x.platform===d);if(d==="ios")S.sort((x,T)=>x.deviceId.localeCompare(T.deviceId));let D=S[0];if(D)return D;if(d!=="either"||!Object.values(c.scanned).some(Boolean))this.assertReadinessDiscoveryComplete(d,c);throw new t(`No ${d==="either"?"Android or iOS":d==="android"?"Android":"iOS"} device is running, so there is nothing to read. Start one with startDevice or provisionDevice, or pass a deviceId.`)}async findOrStartReadinessDevice(d,c,S){let D=c.devices.filter((x)=>x.platform===d);if(D.length>1)throw new $p(xu(D),D);if(S?.intent!=="read")return await this.dependencies.findOrStartDevice(d,S);let C=await this.resolveAndroidReadinessIdentity(this.requireRunningReadinessDevice(d,c),S.signal);return await this.dependencies.withLifecycleStart(Xt(C),S,async(x)=>{this.dependencies.resumeAfterDeviceStart(d,C.deviceId),await this.dependencies.verifyDevice(C.deviceId,d,{...S,signal:x},C)}),C}async listProvidedReadinessImages(d,c){if(d==="ios"&&!this.dependencies.simctl)throw new Ve("ios",{code:"unavailable",message:"iOS simulator tools not available",retryable:!0});let S=new AbortController,D=c.signal?AbortSignal.any([c.signal,S.signal]):S.signal,C=new Ve(d,{code:"timeout",message:"Named device image discovery timed out",retryable:!0});try{return await l(()=>d==="android"?this.dependencies.deviceUtils.listDeviceImages("android",D):this.dependencies.simctl.listSimulatorImages(void 0,{bypassCache:!0,signal:D}),{timer:this.dependencies.runnerReadinessTimer,timeoutMs:qe,signal:c.signal,label:"Named device image discovery",timeoutError:()=>C,onTimeout:()=>S.abort(C)})}catch(x){if(c.signal?.throwIfAborted(),x instanceof t)throw x;throw new Ve(d,{code:"failed",message:r(x),retryable:!0})}}async findProvidedReadinessImage(d,c,S,D){if(d=PI(c,d),d!=="either")this.assertReadinessDiscoveryComplete(d,S);let C=d==="either"?["android","ios"]:[d],x=await Promise.allSettled(C.map((N)=>this.listProvidedReadinessImages(N,D)));D.signal?.throwIfAborted();let B=x.flatMap((N)=>N.status==="fulfilled"?N.value:[]).filter((N)=>N.platform==="android"?N.name===c:N.deviceId===c),O=B.length===1?B[0]:void 0;this.assertReadinessDiscoveryComplete(O?.platform??d,S);for(let[N,H]of x.entries())if(H.status==="rejected"&&S.scanned[C[N]])throw H.reason;return O}async bootProvidedReadinessImage(d,c,S,D){let C=await this.dependencies.findProvidedReadinessImage(d,c,S,D);if(C?.platform==="android"&&C.isRunning===!0)throw new Gr(void 0,`Android AVD '${C.name}' is running but its serial could not be resolved yet.`);if(!C||C.isRunning!==!1||C.platform==="ios"&&C.isAvailable===!1)return this.requireProvidedReadinessDevice(d,S.devices.filter((x)=>d==="either"||x.platform===d),c);if(C.platform==="android"){if(C.isRunningStateKnown===!1)throw new Gr(void 0,`Cannot safely cold-boot Android AVD '${C.name}': its running state is unknown.`);return await D.beforeReadBoot?.(C),await this.dependencies.bootAndroidReadinessImage(C,D)}throw new t(zt(C.name,C.deviceId))}findPinnedReadinessDevice(d,c){let S=this.dependencies.selection.getPin(c?.connectionId);return d.find((D)=>D.deviceId===S?.deviceId)}async recheckReadBootImage(d,c){if(c?.intent!=="read")return;let S=await this.recheckAndroidReadBootImage(d,c);if(S)await c.beforeReadReadiness?.(S),c.signal?.throwIfAborted(),this.dependencies.resumeReadBootClient(d.platform,S.deviceId),await this.dependencies.verifyDevice(S.deviceId,d.platform,c,S);return S}async recheckAndroidReadBootImage(d,c){let S=await this.listBootedAndroidDevicesForSelection({bypassAndroidDeviceListCache:!0,signal:c.signal});c.signal?.throwIfAborted();let C=(await this.listProvidedReadinessImages("android",c)).filter((B)=>B.name===d.name),x=C.length===1?C[0]:void 0;if(!x)throw wN(d.name,"android",[]);let T=ZP(S.filter((B)=>le(B.deviceId)&&B.name===d.name),d.name,"android");if(T)return T;if(x.isRunning===!0)throw new Gr(void 0,`Android AVD '${d.name}' is running but its serial could not be resolved yet.`);if(qv(x),x.isRunning!==!1)throw new Gr(void 0,`Cannot safely cold-boot Android AVD '${d.name}': its running state is unknown.`);return}async listBootedAndroidDevicesForSelection(d){let c=await this.dependencies.deviceUtils.getBootedDevicesDetailed("android",d);if(d?.signal?.throwIfAborted(),!c.succeededPlatforms.has("android"))throw new Gr(c.discoveryErrors?.android);return c.devices}getReadinessScan(d,c){return c?.getConnectedPlatforms?c.getConnectedPlatforms():this.dependencies.detectConnectedPlatformsWithStatus(c?.signal,{platform:d})}reconcileReadinessPin(d,c){let S=this.dependencies.selection.getPin(c?.connectionId);if(S&&kN(d,S)&&!d.devices.some((D)=>D.deviceId===S.deviceId&&D.platform===S.platform))this.dependencies.clearExplicitDevicePin(S.deviceId)}resolveReadinessPlatform(d,c,S,{providedDeviceId:D,...C}={}){let x=[],T;switch(d){case"android":x=c,T="android";break;case"ios":x=S,T="ios";break;default:if(c.length>0&&S.length>0)return this.resolveMixedReadinessPlatform(c,S,D,C);if(c.length>0)x=c,T="android";else if(S.length>0)x=S,T="ios";else x=[],T="android"}return{platformDevices:x,resolvedPlatform:T}}resolveMixedReadinessPlatform(d,c,S,D){if(S){let B=[...d,...c].find((O)=>O.deviceId===S);if(B)return{platformDevices:B.platform==="android"?d:c,resolvedPlatform:B.platform}}let C=this.dependencies.selection.getPin(D?.connectionId),x=C&&dr(C.platform)?C.platform:void 0;if(x)return{platformDevices:x==="android"?d:c,resolvedPlatform:x};throw new $p(xu([...d,...c]),[...d,...c])}async findLiveAndroidDevice(d){return(await this.dependencies.deviceUtils.getBootedDevices("android")).find((c)=>c.deviceId===d)}async resolveCurrentAndroidIdentity(d){try{let c=await this.findLiveAndroidDevice(d);return c&&!wn(c)?c.name:void 0}catch(c){e.warn(`[DeviceReadiness] Could not resolve the live identity of ${d} for the retired-transport check: ${r(c)}`,c);return}}async resolveAndroidReadinessIdentity(d,c){if(!wn(d))return d;c?.throwIfAborted();let S;try{S=await this.findLiveAndroidDevice(d.deviceId)}catch(D){return c?.throwIfAborted(),e.warn(`[DeviceReadiness] Could not resolve the AVD identity for ${d.deviceId}; keeping the raw serial identity: ${r(D)}`,D),d}return S&&!wn(S)?S:d}async resolveProvidedReadinessId(d){if(!d)return;return await Pu(d,{currentIdentity:()=>this.resolveCurrentAndroidIdentity(d)}),this.canonicalAndroidId(d)}canonicalAndroidId(d){return this.dependencies.admissionGate.resolveAndroidCanonicalId?.(d)??d}mapAndroidReadinessRows(d){return this.dependencies.admissionGate.mapAndroidReadinessDiscovery?.(d)??d}normalizeReadinessScan(d){return Array.isArray(d)?{devices:d,scanned:{android:!0,ios:!0,watchos:!1,tvos:!1,visionos:!1}}:d}}function vs(d){if(d.present&&!d.usable)throw new t(`AUTOMOBILE_CTRL_PROXY_IOS_BUNDLE_PATH / _IPA_PATH is set but unusable: ${d.reason}`)}function jw(d,c){return c?.deviceId===d.deviceId?{...d,name:c.name,...c.observedAt===void 0?{}:{observedAt:c.observedAt}}:d}function Kw(d,c){if(!c||!c.appId||!c.activityName){if(e.warn(`[DeviceReadiness] Android device ${d} is not fully ready`),c)e.warn(`[DeviceReadiness] activeWindow.appId: ${c.appId} | activeWindow.activityName: ${c.activityName}`);else e.warn(`[DeviceReadiness] activeWindow: ${c}`);throw new t(`Cannot get active window information from Android device ${d}. The device may not be fully booted or is in an unusual state.`)}}function Tu(d,c){if(!c)throw new t(`iOS simulator ${d} is not available. Please check if it exists and is available.`);if(!c.isAvailable)throw new t(`iOS simulator ${d} is not available (state: ${c.state}). Please check simulator availability.`)}async function Jw(d,c){try{return!await d.create(c).isScreenOn()}catch(S){return e.warn(`[DeviceReadiness] Could not read screen state of ${c.deviceId}`,S),!1}}async function Bu(d,c,S,D){let{deviceId:C}=c;try{e.info(`[DeviceReadiness] Verifying Android device ${C} readiness`);let x=d.getWindow(jw(c,S));Kw(C,await x.getActive(!0))}catch(x){if(!(D?.readiness==="booted"&&await Jw(d.adbFactory,c)))throw new t(`Failed to verify Android device ${C} readiness: ${r(x)}`);e.info(`[DeviceReadiness] Android device ${C} is asleep; booted readiness holds`)}}class Ic{selection=new Io;admissionGate;executionBinding;readinessSelection;provider;adbFactory;runnerReadinessService;runnerReadinessTimer;bindingExclusion;physicalIosScanBudgetMs;runnerReadinessTimeoutMs;runnerProvisionTimeoutMs;lifecycleCoordinator;_adb;idGenerator;iosBootInstrumentationInstance;appearanceOnConnectDependencies;static pushUpdateListenersRegistered=new WeakSet;constructor(d,c=v,S={}){this.admissionGate=S.admissionGate??_s,this.executionBinding=S.executionBinding??mw,this.provider=d,this.androidCtrlProxyReadiness=new as({provider:d,checkedAndroidOwnership:this.checkedAndroidOwnership,errors:{DeviceOwnedByOtherDaemonError:qt,CtrlProxyForwardOwnershipUnreadableError:Ju},storeSetupTiming:RN}),this.adbFactory=c,this.runnerReadinessTimer=S.runnerReadinessTimer??i,this.bindingExclusion=S.bindingExclusion??VP(this.runnerReadinessTimer),this.physicalIosScanBudgetMs=S.physicalIosScanBudgetMs??dB,this.idGenerator=S.idGenerator??L,this.iosBootInstrumentationInstance=S.iosBootInstrumentation,this.appearanceOnConnectDependencies=S.appearanceOnConnectDependencies,this.runnerReadinessTimeoutMs=S.runnerReadinessTimeoutMs,this.runnerProvisionTimeoutMs=S.runnerProvisionTimeoutMs,this.lifecycleCoordinator=S.lifecycleCoordinator??sa(),this.runnerReadinessService=new RF({timer:this.runnerReadinessTimer,getAndroidManager:(C)=>this.provider.getAndroidCtrlProxyManager(C),getAndroidClient:(C)=>this.provider.getAndroidCtrlProxyClient(C),getIosManager:(C)=>this.provider.getIOSCtrlProxyManager(C),getIosClient:(C,x)=>this.provider.getIOSCtrlProxyClient(C,x),checkIosOverride:Bv,awaitIosStartupMaintenance:()=>ge.awaitStartupOrphanRunnerReap()});let D=this;this.readinessSelection=new gs({detectConnectedPlatformsWithStatus:(...C)=>this.detectConnectedPlatformsWithStatus(...C),findProvidedReadinessImage:(...C)=>this.findProvidedReadinessImage(...C),get adb(){return D.adb},get simctl(){return D.simctl},provider:this.provider,runnerReadinessTimer:this.runnerReadinessTimer,physicalIosScanBudgetMs:this.physicalIosScanBudgetMs,selection:this.selection,withLifecycleStart:(...C)=>this.withLifecycleStart(...C),verifyDevice:(...C)=>this.verifyDevice(...C),applyAppearanceOnConnect:(C,x)=>mu(C,this.appearanceOnConnectDependencies,AI(x)),resumeAfterDeviceStart:(C,x)=>oS.resumeAfterDeviceStart(C,x),resumeReadBootClient:(C,x)=>{if(!dr(C))return;({android:k,ios:_})[C].resumeAfterDeviceStart(x)},adbFactory:this.adbFactory,checkedAndroidOwnership:this.checkedAndroidOwnership,findOrStartDevice:(...C)=>this.findOrStartDevice(...C),get deviceUtils(){return D.deviceUtils},bootAndroidReadinessImage:(...C)=>this.bootAndroidReadinessImage(...C),clearExplicitDevicePin:(...C)=>this.clearExplicitDevicePin(...C),admissionGate:this.admissionGate})}get adb(){if(!this._adb)this._adb=this.provider.getAdb();return this._adb}get simctl(){return this.provider.getSimctl()}get iosBootInstrumentation(){if(!this.iosBootInstrumentationInstance){let d=Of();this.iosBootInstrumentationInstance=yI({timer:i,history:d.iosBootHistory,gate:d.ios})}return this.iosBootInstrumentationInstance}async bootIosSimulatorAdmitted(d,c,S,{signal:D,reason:C="restart"}){return await this.iosBootInstrumentation.run({udid:S,reason:C,runtime:c.runtimeId,timeoutMs:qe,signal:D},async()=>await U(D,async()=>await d.bootSimulator(S)))}get androidEmulator(){return this.provider.getAndroidEmulator()}get deviceUtils(){return this.provider.getDeviceUtils()}static createInstance(d=us(),c,S){return new Ic(d,c,S)}getPlatformDeviceManager(){return this.deviceUtils}getExplicitDevicePin(d){return this.selection.getPin(d)}setExplicitDevicePin(d,c){this.selection.setPin(d,c)}clearConnectionDevicePin(d){this.selection.clearConnection(d)}clearExplicitDevicePin(d){this.selection.clearPinFor(d)}async detectConnectedPlatforms(d){return(await this.detectConnectedPlatformsWithStatus(d)).devices}detectConnectedPlatformsWithStatus(d,c){return this.readinessSelection.detectConnectedPlatformsWithStatus(d,c)}listBootedAndroidDevices(d){return this.readinessSelection.listBootedAndroidDevicesForSelection({...d,bypassAndroidDeviceListCache:!0})}verifyAndroidCtrlProxyServiceReady(d,c){let S=()=>this.provider.getAndroidCtrlProxyClient(d).verifyServiceReady(c?.noRetry?1:2,200,c?.timeoutMs??2000);return c?.signal?U(c.signal,S):S()}async readAndroidCtrlProxySnapshotIdentity(d,c){c.throwIfAborted();let S=this.provider.getAndroidCtrlProxyManager(d);if(!S.readSnapshotIdentity)throw new t("Android snapshot CtrlProxy identity provider is unavailable");return S.readSnapshotIdentity(c)}checkedAndroidOwnership=new zw;androidCtrlProxyReadiness;async ensureDeviceReady(d,c,S){return this.checkedAndroidOwnership.run(new Set,()=>this.readinessSelection.ensureDeviceReadyInCall(d,c,S))}assertCreatedIosReservation(d,c){if(!d||!c.deviceId)throw new t(`Created iOS simulator '${c.name}' has no lifecycle reservation.`)}findProvidedReadinessImage(d,c,S,D){return this.readinessSelection.findProvidedReadinessImage(d,c,S,D)}async verifyDevice(d,c,S,D){switch(Q(c,"Device readiness verification")){case"android":await this.verifyAndroidDevice(d,S,D);return;case"ios":await this.verifyIosDevice(d,S)}}async verifyAndroidDevice(d,c,S){c?.signal?.throwIfAborted(),d=this.readinessSelection.canonicalAndroidId(d),this.admissionGate.assertDeviceActionable(d,"to verify Android device readiness"),this.executionBinding.bindDeviceExecution(d);let D=this.readinessSelection.mapAndroidReadinessRows(await this.adb.getBootedAndroidDevices()),C=D.find((x)=>x.deviceId===d);if(!C)throw new t(`Android device ${d} is not connected. Available devices: ${Qo(D)}`);if(await Bu({getWindow:(x)=>this.provider.getWindow(x),adbFactory:this.adbFactory},C,S,c),c?.signal?.throwIfAborted(),c?.readiness==="booted")return;await lg(ro("android",d),()=>this.androidCtrlProxyReadiness.ensureReady(d,C,c),{signal:c?.signal})}async verifyIosDevice(d,c){if(c?.signal?.throwIfAborted(),yn(d))return await this.verifyPhysicalIosDevice(d,c?.readiness??"automationReady",c);return await this.verifySimulatorIosDevice(d,c)}async verifySimulatorIosDevice(d,c){let S=c?.readiness??"automationReady";if(S==="automationReady"){let x=await Bv();vs(x)}if(!this.simctl)throw new t("iOS simulator tools not available");let D=await this.simctl.getDeviceInfo(d);if(c?.signal?.throwIfAborted(),Tu(d,D),D.state!=="Booted"){if(c?.intent==="read")throw new t(zt(D.name,d,D.state));e.info(`iOS simulator ${d} is not booted (state: ${D.state})`);return}if(S==="booted")return;let C={deviceId:d,name:D.name,platform:"ios"};await this.ensureIosRunnerReady(d,C,c)}async verifyPhysicalIosDevice(d,c,S){let D=await this.findConnectedPhysicalIosDevice(d,S?.signal);if(c==="automationReady"&&!S?.sessionId)throw new t(`Physical iPhone ${d} is connected but has no prepared CtrlProxy runner. Acquire the iPhone with getApple first; signed-runner setup cannot run on a sessionless call.`);if(c==="booted")return;vs(await Bv()),await this.ensureIosRunnerReady(d,D,S)}async findConnectedPhysicalIosDevice(d,c){let S=await this.provider.getIosPhysicalDeviceLister?.()?.listConnectedDevices();c?.throwIfAborted();let D=S?.devices.find((x)=>x.deviceId===d);if(D)return D;let C=S&&!S.complete?` (devicectl: ${S.error.message})`:"";throw new t(`Physical iPhone ${d} is not connected or not reachable through devicectl${C}. Connect, unlock, and trust the device, then acquire it with getApple.`)}async ensureIosRunnerReady(d,c,S){let D=ka(!0);D.serial("ensureCtrlProxy iOS");let C=!1,x=this.runnerReadinessTimeoutMs??M.getRunnerReadinessTimeoutMs(),T=this.runnerProvisionTimeoutMs??Ia;try{let B=this.runnerReadinessTimer.now()+Math.max(T,x);await this.runnerReadinessService.ensureReady({device:c,requestedIdentity:`platform=ios deviceId=${d}`,operationName:"legacy iOS session auto-start",totalDeadlineMs:B,readinessTimeoutMs:x,skipCtrlProxyDownload:this.androidCtrlProxyReadiness.skipCtrlProxyDownload(S),perf:D,signal:S?.signal,onRunnerSetup:()=>{C=!0}}),this.registerPushUpdateListener(c)}finally{if(D.end(),C){let B=D.getTimings();if(B)RN(d,B,S?.sessionId)}}}async findOrStartDevice(d,c){if(d==="android")return await this.findOrStartAndroidDevice(c);else return await this.findOrStartIosDevice(c)}async findOrStartAndroidDevice(d){let c=Y();c.startOperation("listBootedDevices");let S=await this.readinessSelection.listBootedAndroidDevicesForSelection();if(c.endOperation("listBootedDevices"),S.length>0){let x=S[0],T=x.deviceId;return await this.withLifecycleStart(Xt(x),d,async(B)=>(k.resumeAfterDeviceStart(T),c.startOperation("verifyDevice"),await this.verifyAndroidDevice(T,{...d,signal:B},x),c.endOperation("verifyDevice"),x))}c.startOperation("listImages");let D=await this.deviceUtils.listDeviceImages("android");if(c.endOperation("listImages"),D.length===0)throw new t("No devices are connected and no device images are available. Please connect a physical device or create a device image first.");let C=await ss(D,this.bindingExclusion);return await this.bootAndroidReadinessImage(C,d,c)}async bootAndroidReadinessImage(d,c,S=Y()){return qv(d),e.info(`Starting Android emulator ${d}...`),await this.withLifecycleStart({platform:"android",stableId:d.name},c,async(D,C)=>{if(c?.beforeReadBoot)await c.beforeReadBoot(d),D.throwIfAborted();let x=await this.readinessSelection.recheckReadBootImage(d,{...c,signal:D});if(x)return x;Ru(d,c,C.lease),S.startOperation("startDevice");let T=await U(D,async()=>await this.startDeviceOwningCancelledLaunch(d,C)),B=T?Jc(T):void 0;S.endOperation("startDevice"),S.startOperation("waitForReady");let O=await sg(this.deviceUtils,d,T,{signal:D,timer:this.runnerReadinessTimer,cancelOwnedBoot:B?async()=>await Hn(B.process,B.exitPromise,{signal:"SIGTERM",timer:this.runnerReadinessTimer}):void 0});if(S.endOperation("waitForReady"),!O)throw new t(`Failed to start Android emulator ${d}.`);if(c?.intent==="read")await c.beforeReadReadiness?.(O),D.throwIfAborted();return k.resumeAfterDeviceStart(O.deviceId),S.startOperation("verifyDevice"),await this.verifyAndroidDevice(O.deviceId,{...c,signal:D},O),S.endOperation("verifyDevice"),O})}async bindCreatedIosReadinessIdentity(d,c){if(!d||!c.deviceId)throw new t(`Created iOS simulator '${c.name}' has no lifecycle identity.`);let S=c.deviceId;await d.bindCanonicalIdentity({platform:"ios",stableId:S},async()=>this.revalidateCreatedIosDevice(S))}async rollBackCreatedIosOnFailure(d,c){try{return await c()}catch(S){let D=d();if(D)await this.rollBackCreatedIosSimulator(D,S);throw S}}async rollBackCreatedIosSimulator(d,c){return hu({simctl:()=>this.simctl,provider:this.provider,runnerReadinessTimer:this.runnerReadinessTimer},d,c)}async findOrStartIosDevice(d){if(!this.simctl)throw new t("iOS simulator tools not available");let c=Y();c.startOperation("listSimulators");let S=await this.simctl.listSimulatorImages();c.endOperation("listSimulators");let D=S.filter((B)=>B.isAvailable===!1),C=S.filter((B)=>B.isAvailable!==!1).sort((B,O)=>(B.deviceId||"").localeCompare(O.deviceId||""));if(C.length===0){let B=GP();if(B.isCreationAllowed()){e.info(`[DeviceReadiness] No available iOS simulators found; creating one (gate: ${B.describeSource()})`);let O=this.runnerReadinessTimer.now()+300000,N,H;try{let V=YP(()=>this.simctl,{reserveBeforeCreate:async(G)=>(N=await this.lifecycleCoordinator.reserve({kind:"selector",platform:"ios",selector:G.name},{operation:"start",deadlineMs:O,signal:d?.signal}),N.signal),bindAfterCreate:async(G)=>{H=G,await this.bindCreatedIosReadinessIdentity(N,G)}},Ry(()=>this.simctl)),{provisioned:q,lease:W}=await this.rollBackCreatedIosOnFailure(()=>H,async()=>{let G=await V.provision({platform:"ios"},d?.signal);return this.assertCreatedIosReservation(N,G),{provisioned:G,lease:N}});return await ps(W,d,async(G)=>{c.startOperation("bootSimulator");let ie=await this.bootIosSimulatorAdmitted(this.simctl,q,q.deviceId,{signal:G,reason:"create"});if(c.endOperation("bootSimulator"),ie.deviceId===q.deviceId)await this.simctl.presentSimulatorAfterStart(q.deviceId,this.idGenerator.next(),G);return _.resumeAfterDeviceStart(q.deviceId),c.startOperation("verifyDevice"),await this.verifyIosDevice(q.deviceId,{...d,signal:G}),c.endOperation("verifyDevice"),ie}).catch(async(G)=>{throw await this.rollBackCreatedIosSimulator(q,G),u(G,`Failed to boot/verify created iOS simulator '${q.name}' (${q.deviceId})`)})}finally{N?.release()}}if(D.length>0){let O=D.map((N)=>`${N.name} (${N.deviceId??"unknown ID"}): ${N.availabilityError??"unavailable"}`).join("; ");throw new t(`No available iOS simulators. Unavailable simulators: ${O}.`)}throw new t("No iOS simulators are available. Please create an iOS simulator using Xcode or the Simulator app.")}c.startOperation("checkBooted");let x=await this.listBootedSimulatorsForSelection();if(c.endOperation("checkBooted"),x.sort((B,O)=>B.deviceId.localeCompare(O.deviceId)),x.length>0){let B=x[0];return e.info(`[DeviceReadiness] Selected booted iOS simulator ${B.name} (${B.deviceId})`),await this.withLifecycleStart({platform:"ios",stableId:B.deviceId},d,async(O)=>(_.resumeAfterDeviceStart(B.deviceId),c.startOperation("verifyDevice"),await this.verifyIosDevice(B.deviceId,{...d,signal:O}),c.endOperation("verifyDevice"),B))}let T=await ss(C,this.bindingExclusion);return await this.bootIosReadinessImage(T,d,c)}async bootIosReadinessImage(d,c,S=Y()){let D=d.deviceId;if(c?.intent==="read")throw new t(zt(d.name,D));return e.info(`[DeviceReadiness] Booting iOS simulator ${d.name} (${D})...`),await this.withLifecycleStart({platform:"ios",stableId:D},c,async(C)=>{S.startOperation("bootSimulator");let x=await this.bootIosSimulatorAdmitted(this.simctl,d,D,{signal:C});if(S.endOperation("bootSimulator"),x.deviceId===D)await this.simctl.presentSimulatorAfterStart(D,this.idGenerator.next(),C);return _.resumeAfterDeviceStart(D),S.startOperation("verifyDevice"),await this.verifyIosDevice(D,{...c,signal:C}),S.endOperation("verifyDevice"),x})}async listBootedSimulatorsForSelection(){try{return await this.simctl.getBootedSimulatorsChecked()}catch(d){throw new Ve("ios",{code:"failed",message:r(d),retryable:!0})}}async revalidateCreatedIosDevice(d){if(!(await this.simctl.listSimulatorImages()).find((D)=>D.deviceId===d))throw new t(`Created iOS simulator '${d}' disappeared during lifecycle wait`);return{platform:"ios",stableId:d}}async withLifecycleStart(d,c,S){let D=await this.lifecycleCoordinator.reserve("kind"in d?d:{kind:"stable",...d},{operation:"start",deadlineMs:this.runnerReadinessTimer.now()+300000,signal:c?.signal}),C=[];try{return await ps(D,c,(x)=>S(x,{lease:D,holdLeaseUntil:(T)=>{C.push(T)}}))}finally{if(C.length===0)D.release();else Promise.allSettled(C).then(()=>D.release())}}async startDeviceOwningCancelledLaunch(d,c){return Su({deviceUtils:()=>this.deviceUtils,runnerReadinessTimer:this.runnerReadinessTimer},d,c)}registerPushUpdateListener(d){let c=d.deviceId;try{let S=this.provider.getIOSCtrlProxyManager(d),D=this.provider.getIOSCtrlProxyClient(d,S.getServicePort());if(Ic.pushUpdateListenersRegistered.has(D))return;let C=this.provider.getObserveScreenCache();D.onPushUpdate(()=>{e.info(`[DeviceReadiness] Received iOS UI change notification for ${c}, clearing ObserveScreen cache`),C.clearForDevice(c)}),Ic.pushUpdateListenersRegistered.add(D),e.info(`[DeviceReadiness] Registered push update listener for ${c}`)}catch(S){e.warn(`[DeviceReadiness] Failed to register push update listener for ${c}: ${S}`)}}}var X=(d)=>({budgetMs:d,mayWriteDatabase:!0}),ht=(d)=>({budgetMs:d,mayWriteDatabase:!1}),b6={"provisioning ingress quiesce":X(1050),"provisioning interruption":X(300),"shutdown release snapshot":X(50),"forward lease idle releaser":X(200),"managed execution release":X(200),"active capture and iOS CtrlProxy children":X(500),"health check timer":X(50),"location routes":X(50),"shutdown monitors":X(150),"ADB missing-device subscription":X(25),"session cleanup timer":X(25),"video recording socket server":X(30),"device gesture recording socket server":X(30),"device snapshot socket server":X(30),"appearance socket server":X(30),"performance stream socket server":X(30),"performance push socket server":X(30),"device data stream socket server":X(30),"failures stream socket server":X(30),"failures push socket server":X(30),"telemetry push socket server":X(30),"WebRTC stream socket server":X(200),"video stream socket server":ht(200),"iOS simulator capture helper pool":ht(150),"native helper registry":ht(10),"host adb children":ht(10),"appearance sync scheduler":X(25),"performance monitor":X(25),"active HTTP sessions":X(150),"active HTTP session registry":X(25),"HTTP server":X(100),"active device sessions":X(1500),"Unix socket server":X(1100),"pending device cleanups":X(300),"CtrlProxy forwarding leases":X(400),"device allocation claims":X(100),"managed ADB server":ht(300),"abandoned stage settle":X(75),"database write drain":X(200),"in-flight migrations":X(200),database:X(300),"late abandoned stage settle":X(25),logger:X(100),"daemon files":X(100)},uU=Ou(b6);var ku={"direct-mode capture and iOS CtrlProxy children":X(2000),"direct-mode managed ADB server":ht(300),"video recording socket server":X(30),"device gesture recording socket server":X(30),"device snapshot socket server":X(30),"appearance socket server":X(30),"WebRTC stream socket server":X(200),"appearance sync scheduler":X(25),"prefetched Android CtrlProxy APK":X(50),"stdio proxy":X(2000),"abandoned stage settle":X(2955),"database write drain":X(200),"in-flight migrations":X(200),database:X(300),"late abandoned stage settle":X(25),logger:X(100)},mU=Ou(ku);function Ou(d){let c={};for(let S of Object.keys(d))c[S]=d[S].budgetMs;return c}function S6(d,c,S,D){return{name:c,waitingOn:S,...d[c],run:D}}var Yw=50;function $l(d,c){return Math.max(0,Math.min(c,d.remainingMs()-Yw))}var Qw=100;function w6(d){let c=!1,S=async(x)=>{c=!1;let T=d.keepOpenReason?.();if(T!==void 0){d.warn(`Skipping database close because ${T}`);return}let B=x.unsettledDatabaseWriters();if(B.length>0){c=!0,d.warn(`Skipping database close because abandoned shutdown stage(s) are still running: ${B.join(", ")}`);return}await d.closeDatabase()},D=async(x)=>{if(x.unsettledStages().length===0&&!c)return;let T=c?Qw:0;if(await x.waitForUnsettledStages(Math.max(0,$l(x,Number.POSITIVE_INFINITY)-T)),!c||x.unsettledDatabaseWriters().length>0)return;await d.drainWrites($l(x,Number.POSITIVE_INFINITY)),await S(x)},C=async(x)=>{let T=await d.refusedAccessCount?.()??0;if(T===0)return;d.warn(`Refused ${T} database access(es) issued after the shutdown database close; `+(x.length>0?`abandoned shutdown stage(s) running since the close: ${x.join(", ")}`:"no abandoned shutdown stage was running (an in-flight request or a late timer callback)"))};return{settle:async(x)=>{let T=$l(x,Number.POSITIVE_INFINITY);if(!await x.waitForUnsettledStages(T))d.warn(`Shutdown stage(s) still running ${T}ms after being abandoned: ${x.unsettledStages().join(", ")}`)},close:S,lateSettle:async(x)=>{let T=x.unsettledStages();try{await D(x)}finally{try{await C(T)}catch(B){try{d.warn(`Failed to report database accesses refused after shutdown: ${r(B)}`)}catch(O){Wi("Reporting refused database accesses after shutdown failed",O)}}}}}}var Zw={remainingMs:()=>Number.POSITIVE_INFINITY,unsettledStages:()=>[],unsettledDatabaseWriters:()=>[],waitForUnsettledStages:async()=>!0};async function CI(d,c,S){let D=[],C=new Map,x=()=>[...C.values()].map((V)=>V.name),T=!1,B=()=>S?S.timer.monotonicNow?.()??S.timer.now():0,O=B(),N=0,H=(V,q)=>{let W=T?`Shutdown cleanup stage ${V} failed after shutdown finished`:`Shutdown cleanup stage ${V} failed after being abandoned at its deadline`;try{c(W,q)}catch(G){let ie=S?.emergencyLog??Wi;ie(W,q),ie(`Reporting the late failure of shutdown stage ${V} failed`,G)}};for(let V of d){if(!S||V.budgetMs===void 0){try{await V.run(Zw)}catch(ae){D.push(ae),c(`Shutdown cleanup stage ${V.name} failed`,ae)}continue}let{timer:q}=S;N+=V.budgetMs;let W=O+N,G=Math.max(0,W-B()),ie=Symbol("shutdown stage deadline"),re={remainingMs:()=>Math.max(0,W-B()),unsettledStages:x,unsettledDatabaseWriters:()=>[...C.values()].filter((ae)=>ae.mayWriteDatabase).map((ae)=>ae.name),waitForUnsettledStages:async(ae)=>{if(C.size===0)return!0;let We=Symbol("abandoned stage settle timeout");try{await l(Promise.all([...C.values()].map((we)=>we.settled)),{timer:q,timeoutMs:ae,label:"Abandoned shutdown stage settle",timeoutError:()=>We})}catch(we){if(we!==We)throw we}return C.size===0}},fe;try{await l(()=>(fe=(async()=>{await V.run(re)})(),fe),{timer:q,timeoutMs:G,label:`Shutdown cleanup stage ${V.name}`,timeoutError:()=>ie})}catch(ae){if(ae!==ie){D.push(ae),c(`Shutdown cleanup stage ${V.name} failed`,ae);continue}let We=(fe??Promise.resolve()).then(()=>{C.delete(V)},(we)=>{if(C.delete(V),!T)D.push(we);H(V.name,we)});C.set(V,{name:V.name,settled:We,mayWriteDatabase:V.mayWriteDatabase!==!1}),c(`Shutdown cleanup stage ${V.name} timed out after ${G}ms waiting on ${V.waitingOn??"its cleanup"}; continuing shutdown`,Error(`Shutdown cleanup stage ${V.name} exceeded its ${G}ms deadline`))}}if(T=!0,C.size>0)D.push(Error(`Shutdown cleanup stage(s) still running when shutdown finished: ${x().join(", ")}`));if(D.length>0)throw AggregateError(D,"One or more shutdown cleanup stages failed")}function IZ(d){let c=(T,B,O)=>S6(ku,T,B,O),S=(T)=>async()=>{await T()},D=(T)=>async(B)=>{if(d.directModeActive())await T(B)},C=w6({closeDatabase:()=>d.closeDatabase(),drainWrites:(T)=>d.drainDatabaseWrites(T),refusedAccessCount:async()=>d.directModeActive()?await d.refusedDatabaseAccessCount?.()??0:0,warn:(T)=>d.warn(T)}),x="its connections closing";return[c("direct-mode capture and iOS CtrlProxy children","recording stop/finalize and iOS CtrlProxy child exit",D(S(d.cleanupChildProcesses))),c("direct-mode managed ADB server","adb kill-server",D(S(d.stopManagedAdbServer))),c("video recording socket server","its connections closing",S(d.stopVideoRecordingSocketServer)),c("device gesture recording socket server","its connections closing",S(d.stopDeviceGestureRecordingSocketServer)),c("device snapshot socket server","its connections closing",S(d.stopDeviceSnapshotSocketServer)),c("appearance socket server","its connections closing",S(d.stopAppearanceSocketServer)),c("WebRTC stream socket server","WebRTC stream teardown (encoder stop, adb forward removal)",S(d.stopWebRtcStreamSocketServer)),c("appearance sync scheduler","an in-flight appearance sync",S(d.stopAppearanceSyncScheduler)),c("prefetched Android CtrlProxy APK","the prefetched APK directory removal",S(d.cleanupPrefetchedApk)),c("stdio proxy","the daemon releasing this proxy's managed execution and ordinary owned sessions",S(d.closeStdioProxy)),c("abandoned stage settle","earlier stages that passed their deadline",(T)=>C.settle(T)),c("database write drain","in-flight best-effort database writes",D((T)=>d.drainDatabaseWrites($l(T,Number.POSITIVE_INFINITY)))),c("in-flight migrations","a cold-start migration still running",D((T)=>d.settleMigrations($l(T,Number.POSITIVE_INFINITY)))),c("database","the database connection closing",D((T)=>C.close(T))),c("late abandoned stage settle","earlier stages that passed their deadline",(T)=>C.lateSettle(T)),c("logger","the log file flush",S(d.closeLogger))]}
166
+ export{zr,li,$P,cI,tN,UP,qG,Np,Jt,dI,lI,ui,Fl,Vs,rN,VG,RX,WG,PX,pH,nN,yy,mH,fH,AX,TX,Oo,Ja,Fp,hH,Jo,kX,EX,vy,iN,IX,_X,xX,CX,Xa,_f,HP,Cd,gH,Ec,Dd,uI,Ws,zG,jG,In,oN,DX,pI,OX,Od,jb,Kb,Nn,ha,Gb,Md,Mo,yH,Yb,mo,KG,MX,NX,FX,LX,sN,vH,BX,$X,aN,by,GG,YG,bH,UX,JG,mI,XG,SH,HX,Eu,fI,wH,ZG,qX,RH,Lp,VX,WX,zX,wi,QG,cN,Sy,Za,Bp,PH,jX,Ri,Ll,Jb,AH,_n,Xb,e6,Qa,dN,TH,kH,Zb,xf,t6,Qb,lN,qP,KX,Nd,VP,r6,n6,uN,GX,YX,JX,Cf,WP,hI,i6,ec,o6,eS,zP,EH,pN,IH,mN,jP,gI,fN,_H,yI,wy,Df,XX,Of,hN,tS,xH,ZX,Et,gN,yN,QX,eZ,tZ,rZ,rS,nZ,vN,Toe,Ry,s6,KP,vI,bN,bI,SN,GP,Ue,Mf,SI,wI,tc,nS,YP,iZ,RI,JP,a6,CH,DH,OH,MH,c6,oZ,XP,iS,PI,ZP,sZ,wN,oS,AI,TI,kI,d6,ga,aZ,l6,Py,cZ,NH,dZ,QP,eA,FH,Ay,RN,lZ,LH,BH,sS,$p,aS,$H,uZ,PN,fo,cS,pi,Bl,AN,Iu,UH,TN,kN,Ic,bt,Nf,u6,Ff,pZ,EI,II,p6,EN,Lf,IN,_N,_I,mZ,HH,xN,fZ,Ty,m6,_c,CN,hZ,gZ,Up,f6,yZ,vZ,bZ,DN,xI,xc,ON,MN,_u,NN,qH,SZ,VH,wZ,RZ,Fd,PZ,h6,FN,AZ,WH,TZ,g6,y6,v6,zH,kZ,Ld,LN,EZ,b6,S6,$l,w6,CI,IZ};
167
+
168
+ //# debugId=EE6D11D3CBCDEF4B64756E2164756E21