@kaeawc/auto-mobile 0.0.93 → 0.0.94

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (228) hide show
  1. package/dist/build-info.json +12 -12
  2. package/dist/src/ble-peripheral.py +153 -0
  3. package/dist/src/{chunk-r6z1eztj.js → chunk-026y62r9.js} +11 -11
  4. package/dist/src/chunk-0jyfg947.js +4 -0
  5. package/dist/src/{chunk-8g1922rp.js → chunk-0zfpp1wh.js} +4 -4
  6. package/dist/src/{chunk-qf6nynk6.js → chunk-13qxf7ym.js} +5 -5
  7. package/dist/src/chunk-1scenrk7.js +4 -0
  8. package/dist/src/chunk-1vb5ph1k.js +4 -0
  9. package/dist/src/{chunk-710rxz9y.js → chunk-20g565q7.js} +3 -3
  10. package/dist/src/chunk-21h6dhdm.js +5 -0
  11. package/dist/src/chunk-25mfpthk.js +78 -0
  12. package/dist/src/{chunk-rbpdk7m0.js → chunk-2b39zyxc.js} +3 -3
  13. package/dist/src/chunk-2gzd6wbd.js +4 -0
  14. package/dist/src/{chunk-xgan0qqp.js → chunk-3dntffy9.js} +1 -1
  15. package/dist/src/chunk-3gfczcsn.js +4 -0
  16. package/dist/src/{chunk-dgrbdpb7.js → chunk-3h5jz1vb.js} +6 -6
  17. package/dist/src/{chunk-t6c8akcm.js → chunk-41zcy6b3.js} +3 -3
  18. package/dist/src/chunk-47n9m2de.js +4 -0
  19. package/dist/src/chunk-4vxeq0vd.js +58 -0
  20. package/dist/src/chunk-59dx6qaf.js +4 -0
  21. package/dist/src/chunk-5sdf9y92.js +4 -0
  22. package/dist/src/{chunk-58wzr3mt.js → chunk-5wk1t46v.js} +3 -3
  23. package/dist/src/{chunk-vy3bwm1d.js → chunk-661c50hh.js} +5 -5
  24. package/dist/src/chunk-68n6bjjd.js +21 -0
  25. package/dist/src/{chunk-v6pya0dm.js → chunk-69pmjdf2.js} +3 -3
  26. package/dist/src/{chunk-e98dqnc9.js → chunk-6hrj3jt6.js} +20 -20
  27. package/dist/src/{chunk-wbh8spm5.js → chunk-6myr26wx.js} +8 -8
  28. package/dist/src/chunk-6n96k09n.js +4 -0
  29. package/dist/src/chunk-6vwrbkre.js +4 -0
  30. package/dist/src/chunk-6wk0yrab.js +4 -0
  31. package/dist/src/chunk-6yhm9een.js +4 -0
  32. package/dist/src/{chunk-mjrps0ac.js → chunk-7k7gjg2t.js} +5 -5
  33. package/dist/src/chunk-7n5fz68h.js +4 -0
  34. package/dist/src/chunk-8cvnpnbp.js +4 -0
  35. package/dist/src/chunk-8kzv7rk7.js +4 -0
  36. package/dist/src/chunk-8nj68t1v.js +167 -0
  37. package/dist/src/{chunk-g7tmjbkt.js → chunk-96r3bpg7.js} +3 -3
  38. package/dist/src/chunk-97x887te.js +4 -0
  39. package/dist/src/{chunk-8ph29g99.js → chunk-99a6tbvd.js} +1 -1
  40. package/dist/src/chunk-9p5d2994.js +5 -0
  41. package/dist/src/{chunk-aabchzxk.js → chunk-9q265er0.js} +4 -4
  42. package/dist/src/{chunk-jh6vhqzx.js → chunk-9xgnrv5w.js} +3 -3
  43. package/dist/src/chunk-9xgsmshb.js +5 -0
  44. package/dist/src/chunk-a02d1wgv.js +4 -0
  45. package/dist/src/{chunk-ndt1ccxm.js → chunk-a9ps00a1.js} +10 -10
  46. package/dist/src/{chunk-5d2hft6c.js → chunk-aewdveet.js} +3 -3
  47. package/dist/src/{chunk-ycaj2sgf.js → chunk-b3tdtq7r.js} +6 -6
  48. package/dist/src/chunk-bn7jx7a2.js +4 -0
  49. package/dist/src/{chunk-3y6eykz9.js → chunk-bnyw27ja.js} +2 -2
  50. package/dist/src/{chunk-rqc9ap3x.js → chunk-bpwsg76p.js} +2 -2
  51. package/dist/src/chunk-bvranw3g.js +4 -0
  52. package/dist/src/chunk-c25a84zb.js +4 -0
  53. package/dist/src/chunk-c27yv1dx.js +5 -0
  54. package/dist/src/chunk-c3ewxm4x.js +5 -0
  55. package/dist/src/{chunk-rvvy1bte.js → chunk-cb1ga9rd.js} +5 -5
  56. package/dist/src/chunk-cn7fwy7k.js +4 -0
  57. package/dist/src/chunk-cnvy4a64.js +4 -0
  58. package/dist/src/{chunk-7rz9898k.js → chunk-cqhw4yr6.js} +3 -3
  59. package/dist/src/{chunk-g04bwyj3.js → chunk-ctmfshjc.js} +2 -2
  60. package/dist/src/chunk-ctwmhz13.js +4 -0
  61. package/dist/src/{chunk-waqwcjyn.js → chunk-d3jx9bz5.js} +2 -2
  62. package/dist/src/{chunk-ayp07wbb.js → chunk-d6rb08ga.js} +1 -1
  63. package/dist/src/chunk-ddqhj4eg.js +5 -0
  64. package/dist/src/{chunk-r7bpkgff.js → chunk-ddrhs1c3.js} +2 -2
  65. package/dist/src/chunk-dnjnh9p6.js +4 -0
  66. package/dist/src/{chunk-wyrkw6hw.js → chunk-dw5rwgya.js} +3 -3
  67. package/dist/src/{chunk-3xkpk44w.js → chunk-e0870khr.js} +3 -3
  68. package/dist/src/chunk-ea3k10kj.js +4 -0
  69. package/dist/src/chunk-emv82m1w.js +7 -0
  70. package/dist/src/chunk-f3m6pdnx.js +4 -0
  71. package/dist/src/chunk-f84z32cb.js +4 -0
  72. package/dist/src/chunk-fpczgf0z.js +4 -0
  73. package/dist/src/{chunk-2tqzq5qh.js → chunk-g2js4c2v.js} +18 -18
  74. package/dist/src/chunk-g3af2qbk.js +5 -0
  75. package/dist/src/{chunk-3qwrzxh0.js → chunk-gadtna7s.js} +6 -6
  76. package/dist/src/{chunk-ybbtagbt.js → chunk-gcyx407v.js} +3 -3
  77. package/dist/src/{chunk-bfw6125s.js → chunk-gfpntwc1.js} +3 -3
  78. package/dist/src/chunk-gmnm5e3e.js +4 -0
  79. package/dist/src/chunk-gp6vb5gf.js +4 -0
  80. package/dist/src/chunk-gppgy7pa.js +4 -0
  81. package/dist/src/chunk-hegfz0ae.js +5 -0
  82. package/dist/src/chunk-hpzxdp1k.js +17 -0
  83. package/dist/src/{chunk-qcxzr2my.js → chunk-j69g8b50.js} +3 -3
  84. package/dist/src/chunk-jvstjnqm.js +19 -0
  85. package/dist/src/chunk-jzqrv78s.js +4 -0
  86. package/dist/src/chunk-k2948b8d.js +4 -0
  87. package/dist/src/chunk-k4ftd40d.js +4 -0
  88. package/dist/src/{chunk-bxmsax22.js → chunk-kd9vfaxh.js} +3 -3
  89. package/dist/src/{chunk-s3jc6cwp.js → chunk-kdczmgwk.js} +3 -3
  90. package/dist/src/{chunk-t6bfvfkg.js → chunk-ke3wn14v.js} +1 -1
  91. package/dist/src/chunk-kh5n7m6w.js +4 -0
  92. package/dist/src/{chunk-6wt9rgjf.js → chunk-khejfph4.js} +3 -3
  93. package/dist/src/chunk-kny2xemh.js +4 -0
  94. package/dist/src/chunk-knyzw9md.js +4 -0
  95. package/dist/src/chunk-mbzpt2hp.js +4 -0
  96. package/dist/src/chunk-mm8rcxad.js +4 -0
  97. package/dist/src/chunk-nc4516tx.js +4 -0
  98. package/dist/src/{chunk-6bznss4t.js → chunk-ntfrqrqn.js} +5 -5
  99. package/dist/src/chunk-nz5h2j52.js +4 -0
  100. package/dist/src/chunk-p22s97qy.js +4 -0
  101. package/dist/src/chunk-p9kt1sgr.js +6 -0
  102. package/dist/src/{chunk-yb97j25b.js → chunk-pf282r5g.js} +4 -4
  103. package/dist/src/chunk-pnd4mrxy.js +4 -0
  104. package/dist/src/chunk-pqqteyj6.js +4 -0
  105. package/dist/src/{chunk-6xmss8er.js → chunk-qj1tbnv2.js} +6 -6
  106. package/dist/src/chunk-qnh9egwr.js +4 -0
  107. package/dist/src/chunk-qy3khhf8.js +8 -0
  108. package/dist/src/{chunk-z637nqg8.js → chunk-r0vp315h.js} +6 -6
  109. package/dist/src/chunk-r4j43b9s.js +237 -0
  110. package/dist/src/{chunk-1p7xf5kb.js → chunk-r54cxxze.js} +3 -3
  111. package/dist/src/{chunk-yf7ympyz.js → chunk-r6pvhj33.js} +92 -92
  112. package/dist/src/chunk-rb7aa5gr.js +54 -0
  113. package/dist/src/chunk-rdj50kb4.js +4 -0
  114. package/dist/src/chunk-rnd4vcas.js +4 -0
  115. package/dist/src/{chunk-w5b2jwk3.js → chunk-s3y3zfcx.js} +8 -8
  116. package/dist/src/chunk-s4g43k75.js +5 -0
  117. package/dist/src/chunk-sfqe223f.js +311 -0
  118. package/dist/src/{chunk-284ptqa4.js → chunk-sqdrxjw5.js} +5 -5
  119. package/dist/src/{chunk-zgja5f3p.js → chunk-t54k47em.js} +4 -4
  120. package/dist/src/{chunk-3sy6ahhz.js → chunk-tek4pnvv.js} +10 -10
  121. package/dist/src/chunk-tn74y7af.js +4 -0
  122. package/dist/src/{chunk-thbh3jew.js → chunk-tvq0nzam.js} +3 -3
  123. package/dist/src/{chunk-0jrrsnc9.js → chunk-tx4f0h9c.js} +4 -4
  124. package/dist/src/chunk-vdqag3fj.js +5 -0
  125. package/dist/src/chunk-vz5zzs57.js +4 -0
  126. package/dist/src/chunk-w4s2vfpj.js +4 -0
  127. package/dist/src/{chunk-4hw3665t.js → chunk-w5yypt53.js} +11 -11
  128. package/dist/src/{chunk-8037tzzj.js → chunk-w68v64vh.js} +3 -3
  129. package/dist/src/chunk-whwj0pdk.js +5 -0
  130. package/dist/src/chunk-wnmqt1dc.js +4 -0
  131. package/dist/src/{chunk-cyy71ggq.js → chunk-wpe46vsa.js} +3 -3
  132. package/dist/src/{chunk-w3vs79ex.js → chunk-wxdjeb4k.js} +19 -19
  133. package/dist/src/chunk-xcqzwf9j.js +247 -0
  134. package/dist/src/chunk-xezekwwn.js +5 -0
  135. package/dist/src/chunk-xf19m15s.js +4 -0
  136. package/dist/src/chunk-xghbxha4.js +4 -0
  137. package/dist/src/{chunk-00167wan.js → chunk-xn9m3xc2.js} +5 -5
  138. package/dist/src/{chunk-26k317v5.js → chunk-yqfz4vts.js} +3 -3
  139. package/dist/src/chunk-z8tvs8nk.js +5 -0
  140. package/dist/src/chunk-zm2rehqb.js +5 -0
  141. package/dist/src/chunk-zs6dqm35.js +4 -0
  142. package/dist/src/daemon/processEntry.js +2 -2
  143. package/dist/src/index.js +4 -4
  144. package/dist/src/runtime/bunRuntimeGuard.js +2 -2
  145. package/dist/src/utils/workers/iosBundleExtractWorker.js +2 -2
  146. package/package.json +2 -2
  147. package/dist/src/chunk-0n6swkwg.js +0 -5
  148. package/dist/src/chunk-0qsy1qsx.js +0 -57
  149. package/dist/src/chunk-11m8wj8j.js +0 -237
  150. package/dist/src/chunk-23p5f095.js +0 -4
  151. package/dist/src/chunk-28re4xrg.js +0 -4
  152. package/dist/src/chunk-2f9rkmhx.js +0 -5
  153. package/dist/src/chunk-2fxdh48t.js +0 -4
  154. package/dist/src/chunk-2tbdrbt6.js +0 -4
  155. package/dist/src/chunk-32gvv9b4.js +0 -21
  156. package/dist/src/chunk-3f3t1x97.js +0 -8
  157. package/dist/src/chunk-3fspkbc7.js +0 -4
  158. package/dist/src/chunk-3vg455e6.js +0 -4
  159. package/dist/src/chunk-49bsqdx3.js +0 -4
  160. package/dist/src/chunk-5snsn9cf.js +0 -4
  161. package/dist/src/chunk-5tm9mn47.js +0 -54
  162. package/dist/src/chunk-5zc77a5t.js +0 -4
  163. package/dist/src/chunk-64j0majr.js +0 -19
  164. package/dist/src/chunk-65y8v4td.js +0 -17
  165. package/dist/src/chunk-6awz7vhq.js +0 -5
  166. package/dist/src/chunk-6ep7f5ge.js +0 -4
  167. package/dist/src/chunk-7cs2da62.js +0 -5
  168. package/dist/src/chunk-7g103b54.js +0 -4
  169. package/dist/src/chunk-7j5vj4pa.js +0 -4
  170. package/dist/src/chunk-7tw8x05v.js +0 -4
  171. package/dist/src/chunk-7zy586cb.js +0 -4
  172. package/dist/src/chunk-84nanf8s.js +0 -5
  173. package/dist/src/chunk-8gvwcv2p.js +0 -4
  174. package/dist/src/chunk-8thrmfat.js +0 -4
  175. package/dist/src/chunk-8zgzzs7k.js +0 -78
  176. package/dist/src/chunk-97b1zmaq.js +0 -4
  177. package/dist/src/chunk-9fth9ayh.js +0 -4
  178. package/dist/src/chunk-9j6anhjr.js +0 -4
  179. package/dist/src/chunk-bfjwqk8q.js +0 -4
  180. package/dist/src/chunk-bnhscm2n.js +0 -4
  181. package/dist/src/chunk-c1vs4g1n.js +0 -4
  182. package/dist/src/chunk-ct3e7yng.js +0 -4
  183. package/dist/src/chunk-ddzkz92z.js +0 -4
  184. package/dist/src/chunk-drdz8hee.js +0 -5
  185. package/dist/src/chunk-eersndy7.js +0 -5
  186. package/dist/src/chunk-eggq53ks.js +0 -4
  187. package/dist/src/chunk-f2dya7cs.js +0 -4
  188. package/dist/src/chunk-fbakd6cw.js +0 -4
  189. package/dist/src/chunk-fgb98zjj.js +0 -5
  190. package/dist/src/chunk-fmpad823.js +0 -5
  191. package/dist/src/chunk-g0xr8zw0.js +0 -4
  192. package/dist/src/chunk-g3rjs80x.js +0 -4
  193. package/dist/src/chunk-g78rtrfv.js +0 -4
  194. package/dist/src/chunk-gabgv3y5.js +0 -4
  195. package/dist/src/chunk-gmr45m8f.js +0 -4
  196. package/dist/src/chunk-gsyfebqj.js +0 -4
  197. package/dist/src/chunk-h5rpn9wr.js +0 -247
  198. package/dist/src/chunk-hb1x7v55.js +0 -4
  199. package/dist/src/chunk-hrfytkxh.js +0 -168
  200. package/dist/src/chunk-j4yjzbak.js +0 -4
  201. package/dist/src/chunk-jd6a5v6p.js +0 -5
  202. package/dist/src/chunk-kn5spq15.js +0 -4
  203. package/dist/src/chunk-m94qs0f0.js +0 -4
  204. package/dist/src/chunk-n03dmn5q.js +0 -5
  205. package/dist/src/chunk-n72qhwd9.js +0 -4
  206. package/dist/src/chunk-nr6y0n4y.js +0 -5
  207. package/dist/src/chunk-pcsen2vs.js +0 -4
  208. package/dist/src/chunk-ppfr0b8h.js +0 -4
  209. package/dist/src/chunk-q10bdnat.js +0 -4
  210. package/dist/src/chunk-q9xmq595.js +0 -4
  211. package/dist/src/chunk-qyqypn28.js +0 -5
  212. package/dist/src/chunk-r2epb56s.js +0 -4
  213. package/dist/src/chunk-r5bxavdx.js +0 -311
  214. package/dist/src/chunk-r8jf3d92.js +0 -4
  215. package/dist/src/chunk-rc0dbypm.js +0 -4
  216. package/dist/src/chunk-rhcty4ms.js +0 -4
  217. package/dist/src/chunk-rpvckv3p.js +0 -4
  218. package/dist/src/chunk-ry0mz41y.js +0 -4
  219. package/dist/src/chunk-sfv61xjb.js +0 -6
  220. package/dist/src/chunk-t7w8rctc.js +0 -4
  221. package/dist/src/chunk-v2wd4n3e.js +0 -5
  222. package/dist/src/chunk-w4zga19f.js +0 -4
  223. package/dist/src/chunk-w7hkv422.js +0 -5
  224. package/dist/src/chunk-xa73x2cx.js +0 -5
  225. package/dist/src/chunk-y2vs6jwg.js +0 -4
  226. package/dist/src/chunk-yattm52s.js +0 -4
  227. package/dist/src/chunk-yjawdzk8.js +0 -4
  228. package/dist/src/chunk-zs1sghs9.js +0 -4
@@ -1,4 +0,0 @@
1
- // @bun
2
- import{D3}from"./chunk-v6pya0dm.js";import"./chunk-58wzr3mt.js";export{D3 as bootstrapEnvironment};
3
-
4
- //# debugId=B71F76296E8FF67864756E2164756E21
@@ -1,4 +0,0 @@
1
- // @bun
2
- import{Ht}from"./chunk-yf7ympyz.js";import"./chunk-z637nqg8.js";import"./chunk-58wzr3mt.js";export{Ht as defaultLockOwnerGenerationProbe};
3
-
4
- //# debugId=CFDC5446DDFA929564756E2164756E21
@@ -1,21 +0,0 @@
1
- // @bun
2
- import{R,ua,me,v,z,L,b,vt,We,ji,Ze,Gr,mR,Si,Xe,k,ao,Jo,rb,vY,sb,bR,xD,SR,Qz,ej,wY,RY,PY,AY,TY,Kne,ma,IR,Zj,iP,gO,Qj,e2,yO,Zie,t2,b9,S9,Qie,R9,P9,eoe,z$,E}from"./chunk-r5bxavdx.js";import{n,a,h,Me,S,s,Ne,p,Op,W,c,X,wf,Z$,Td,Ob,dP,lP,IO,Np,Zg,Mb,Nb,uP,Rf,Fp,kt,Foe,uE,Hoe,rJ,oK,CO,Woe,zoe,Nl,DO,bse,Lu,Ed,aJ,Fb,dK,cJ,iU,Za,ny,dJ,yP,Cse,uK,aU,Lp,bP,Te,Lb,oae,pK,wa}from"./chunk-4hw3665t.js";import{i,Qe,l,e}from"./chunk-z637nqg8.js";import"./chunk-58wzr3mt.js";import{UJ,iG,OE,KU,p8,gM,cG,yM,GU,dG,vM,lG,m8,uG,f8,YU,XU,ZU,QU,h8,Vu,g8,bM,BE,mG,e1,fG,cy,t1,v8,b8,S8,w8,r1,R8,P8,SM,A8,hG,gG,n1,T8,$E,k8,E8,I8,i1,o1,_8,x8,C8,D8,O8,M8,N8,F8,Yb,L8,B8,$8,vG,wM,bG,SG,s1,AG,RM,PM,v1,H8,Nf,AM}from"./chunk-11m8wj8j.js";import{B,Cl,_e}from"./chunk-yf7ympyz.js";import"./chunk-5d2hft6c.js";import"./chunk-jh6vhqzx.js";import{Ue,zh,vn,It,HL,ei,aa}from"./chunk-0qsy1qsx.js";import"./chunk-aabchzxk.js";import{TE,LJ}from"./chunk-drdz8hee.js";import{$J}from"./chunk-6bznss4t.js";import"./chunk-e98dqnc9.js";import"./chunk-3xkpk44w.js";import{w,lu,JF,bC,zee,jee}from"./chunk-mjrps0ac.js";import"./chunk-thbh3jew.js";import{E0,Wq,hQ,gQ,yQ}from"./chunk-hrfytkxh.js";import{US,rv,oV,os,sV,M0,y_}from"./chunk-2f9rkmhx.js";import"./chunk-7rz9898k.js";import"./chunk-v6pya0dm.js";import{r,t,u}from"./chunk-rbpdk7m0.js";var ro=new WeakMap;function ae(o){let d=ro.get(o);if(d===void 0)d={onPrototypeEvent:(y)=>o.onEvent(y)},ro.set(o,d);return d}function Ke(o){return{requestPutPrototypeAsset:(d,y)=>o.putAsset(d,y)}}var Kr=s({id:n().min(1),persistent:h(),state:SG,data:bG.optional(),pages:Ne(n(),a().int().nonnegative()).default({}),stacks:Me().optional().transform(SR),lastSequence:a().int().nonnegative(),hiddenReason:p(["app_layer_window_hidden","device_blocked"]).optional().catch(void 0).describe("Android: the prototype exists but is not visible, and why; absent when visible, when suspended, or with an older CtrlProxy"),suspended:h().optional(),orientation:p(["portrait","landscape","unlocked"]).optional().catch(void 0),statusBar:p(["unsupported"]).optional().catch(void 0),appearance:Me().optional().transform(yO),storage:Me().optional().transform(dK),timers:Me().optional(),feedbackLog:Me().optional().transform(vG),shaderFailures:Ne(n(),n()).optional().catch(void 0),degradedEffects:Me().optional().transform(Zj)});function Xr(o){return(o??[]).flatMap((d)=>{let y=Kr.safeParse(d);if(!y.success)return e.warn("[prototype] Ignoring malformed prototype in inspect reply",y.error),[];return[y.data]})}function Qr(o){let d=new Map;for(let y of o)d.set(y.id,[...d.get(y.id)??[],y]);return d}function Zr(o,d,y,f){for(let m of o.shownIds(y.deviceId))if(!f.has(m))d.dismiss(y.deviceId,m),o.dismissed(y,m)}function io(o,d,y,{scope:f,report:m}){let{prototypes:P,replayed:g,timersSupported:T}=m,A=Xr(P),C=new Set(A.map((I)=>I.id)),O=Qr(g);for(let[I,_]of O)if(C.has(I)||_.some((x)=>x.kind==="dismissed")){let x=A.find((F)=>F.id===I);d.adopt(f,I,y,{replayed:_,lastSequence:x?.lastSequence??0})}Zr(o,d,f,C);for(let I of A){if(!O.has(I.id))d.adopt(f,I.id,y,{replayed:[],lastSequence:I.lastSequence});if(!d.isDismissed(f,I.id))o.adopt(f,{...I,storage:dK(I.storage),timers:T?I.timers===void 0?[]:oae(I.timers):void 0})}}async function en(o,d,y,{timeoutMs:f,signal:m}={}){let{store:P,events:g}=o,T=d.android;if(!T){if(d.ios)return on({store:P,events:g},d,d.ios,y);throw new t("inspect needs an Android device or an iOS simulator agent.")}let A=[],C=T.onEvent((I)=>A.push(I)),O;try{let I=await T.supportsCommand(Np);if(m?.throwIfAborted(),!I)return{success:!1,error:new t(TY()).message};O=await T.inspect(f)}catch(I){return m?.throwIfAborted(),e.warn("[prototype] Inspect request failed",I),{success:!1,error:u(I,"Prototype inspect failed").message}}finally{C()}if(!O.success)return{success:!1,error:O.error??"Prototype inspect failed"};return io(P,g,ae(d.transport),{scope:y,report:{prototypes:O.prototypes,replayed:A,timersSupported:await T.supportsCommand(Td)}}),{success:!0,...Ee(P,g,y,{deviceDark:"fresh"}),deviceDroppedEvents:O.droppedEvents??0}}function po(o){return o==="inspect"||o==="clearStorage"||o==="simulate"}async function co(o,d,y,{target:f,scope:m,signal:P}){if(o.action==="simulate")return f8(f,o);if(o.action==="clearStorage")return $8(f,o,d.store,y.deviceId);return en(d,f,m,{timeoutMs:o.timeoutMs,signal:P})}var tn=s({shown:h(),id:n().min(1).nullable(),pages:Ne(n(),a().int().nonnegative()).default({}),stacks:Me().optional().transform(SR),state:SG,data:bG.optional(),lastSequence:a().int().nonnegative(),appearance:Me().optional().transform(yO),storage:Me().optional().transform(dK),timers:Me().optional(),feedbackLog:Me().optional().transform(vG),degradedEffects:Me().optional().transform(Zj)});async function on(o,d,y,f){let{store:m,events:P}=o;if(!y.supportsCapability(R9))return{success:!1,error:new t(`inspect: the connected prototype agent does not advertise ${R9}; relaunch the app with launchApp prototype: true to load the agent built for this AutoMobile version.`).message};let g;try{g=await y.status()}catch(U){return e.warn("[prototype] iOS inspect request failed",U),{success:!1,error:u(U,"Prototype inspect failed").message}}if(!g.success)return{success:!1,error:g.error??"Prototype inspect failed"};let T=tn.safeParse(g.status);if(!T.success)return e.warn("[prototype] Malformed iOS agent status in inspect reply",T.error),{success:!1,error:"Prototype inspect failed: the agent returned a malformed status."};let{shown:A,id:C,pages:O,stacks:I,state:_,data:x,lastSequence:F,appearance:q,storage:D,timers:M,feedbackLog:Y,degradedEffects:G}=T.data,Q=A&&C!==null?[{id:C,persistent:!1,state:_,data:x,pages:O,stacks:I,lastSequence:F,appearance:q,storage:D,timers:M,feedbackLog:Y,degradedEffects:G}]:[];return io(m,P,ae(d.transport),{scope:f,report:{prototypes:Q,replayed:[],timersSupported:y.supportsCapability(Td)}}),{success:!0,...Ee(m,P,f,{deviceDark:"fresh"})}}function Ee(o,d,y,f){let m=o.status(y);return{...m,prototypes:m.prototypes.map((P)=>{let g=f.deviceDark==="fresh"?P:S9(P),T={...g,...gO(g.degradedEffects)},A=T.id?d.counts(y,T.id):void 0;return A?.lastSequence===void 0?T:{...T,...A}}),...m.lastResult?{lastResult:S9(m.lastResult)}:{}}}function uo(o,d,y,f){return o.status(d).prototypes.some((P)=>P.id===y&&P.suspended===!0)&&f.timedOut?{warning:Kne}:{}}function no(o,d){if(!o)return;Promise.resolve().then(()=>o(d?1:0,1,d?"Prototype event wait finished":"Waiting for a prototype event")).catch((y)=>{e.warn("[prototype] Wait progress notification failed",y)})}async function lo(o,d,y,{query:f,context:m}){let P=o.awaitEvent(d,f.id,y,{eventName:f.eventName,kind:f.kind,afterSequence:f.afterSequence,timeoutMs:f.timeoutMs,signal:me(m.signal)});no(m.progress,!1);try{return await P}finally{no(m.progress,!0)}}var rn=s({stack:n().nullable(),screen:n().nullable(),x:a().finite(),y:a().finite()}).strict(),yo=s({changes:S(s({key:n(),valueLength:a().optional(),valueType:n().optional(),valid:h().optional()})).optional(),keys:S(n()).optional(),path:n().nullable().optional(),op:n().optional(),stack:n().nullable().optional(),screen:n().nullable().optional(),depth:a().optional(),pager:n().nullable().optional(),page:a().optional(),reason:n().optional(),x:a().optional(),y:a().optional()});function et(o){let d=Object.entries(o??{}).filter(([,y])=>y.path.length>0).sort(([y,f],[m,P])=>P.path.length-f.path.length||(y<m?-1:y>m?1:0))[0];return d?`${d[0]}/${d[1].path.at(-1)}`:"(root)"}function Ae(o){return o!==null&&typeof o==="object"&&!Array.isArray(o)?o:{}}function nn(o,d){let y=Ae(o.payload),f=typeof y.key==="string"?[y.key]:Array.isArray(y.keys)?y.keys.filter((g)=>typeof g==="string"):[],m=Ae(y.values),P=f.filter((g)=>!d.has("*")&&!d.has(g)).map((g)=>{let T=typeof y.key==="string"?y.value:m[g];return{key:g,...typeof T==="string"?{valueLength:T.length}:{valueType:typeof T},...typeof o.validity?.[g]==="boolean"?{valid:o.validity[g]}:{}}});return P.length?{changes:P}:void 0}function sn(o,d){if(o.name==="change")return nn(o,d);if(o.name==="prototype_dead_tap"){let y=rn.safeParse(o.payload);return y.success?y.data:void 0}return{}}function an(o){let d=Ae(o.payload);return{stack:o.name,...typeof d.screen==="string"?{screen:d.screen}:{},...typeof d.depth==="number"?{depth:d.depth}:{}}}function pn(o,d){return{keys:(o.keys??[]).filter((y)=>!d.has("*")&&!d.has(y))}}function dn(o,d){let y=Ae(o.payload);switch(o.kind){case"appearance_changed":case"unknown":return;case"emit":return sn(o,d);case"change":return{path:o.name,...typeof y.op==="string"?{op:y.op}:{}};case"validation_failed":return pn(o,d);case"screen_changed":return an(o);case"page_changed":return{pager:o.name,...typeof o.payload==="number"?{page:o.payload}:{}};case"dismissed":return typeof y.reason==="string"?{reason:y.reason}:{};default:return}}function fo(o,d){let y=dn(o,d);return y===void 0?void 0:{event_sequence:o.sequence,at_ms:o.timestamp,kind:o.kind,name:o.name,screen:et(o.stacks),detail_json:JSON.stringify(y)}}var cn="No text values are recorded. Secure fields are excluded; other fields retain only keys, lengths/types and validity.";function un(o){return yo.parse(JSON.parse(o.detail_json))}function ln(o,d,y){if(y.x===void 0||y.y===void 0)return;let f=o.get(d)??{screen:d,count:0,points:[],grid:[]};if(o.set(d,f),f.count++,f.points.length<200)f.points.push({x:y.x,y:y.y});let m=Math.floor(y.x/48),P=Math.floor(y.y/48),g=f.grid.find((T)=>T.col===m&&T.row===P);if(g)g.count++;else f.grid.push({col:m,row:P,count:1})}function yn(o,d,y){let f=un(o);if(o.kind==="emit"&&o.name==="prototype_dead_tap")d.deadTaps++,ln(y.taps,d.screen,f);if(o.kind==="validation_failed"){d.validationFailures++;for(let m of f.keys??[])y.fields.set(m,(y.fields.get(m)??0)+1)}if(o.kind==="page_changed"&&o.name!==null)y.pagers.set(o.name,(y.pagers.get(o.name)??0)+1)}function mo(o,d){let y=o.get(d)??{screen:d,reached:0,left:0,abandoned:0,totalMs:0,averageMs:0,deadTaps:0,validationFailures:0};return o.set(d,y),y.reached++,y}function ho(o,d,y){let f=new Map,m={taps:new Map,fields:new Map,pagers:new Map},P=mo(f,o.start_screen),g=o.started_at_ms,T=o.goal===null?null:o.goal===P.screen,A=Math.max(o.started_at_ms,o.ended_at_ms??y);for(let I of d){let _=Math.min(A,Math.max(g,I.at_ms));if(P.totalMs+=_-g,g=_,I.screen!==P.screen)P.left++,P=mo(f,I.screen);if(o.goal===P.screen)T=!0;yn(I,P,m)}P.totalMs+=A-g;let C=o.status==="ended"&&o.ended_reason!=="released"&&T!==!0;if(C)P.abandoned=1;let O=[...f.values()].map((I)=>({...I,averageMs:I.totalMs/I.reached}));return{id:o.test_session_id,prototypeId:o.prototype_id,deviceId:o.device_id,sessionUuid:o.session_uuid,cohort:o.cohort,goal:o.goal,startedAt:o.started_at_ms,endedAt:o.ended_at_ms,durationMs:A-o.started_at_ms,status:o.status,endedReason:o.ended_reason,eventCount:d.length,droppedCount:o.dropped_count,truncated:o.dropped_count>0,privacy:cn,funnel:O,completed:T,lastScreenBeforeAbandonment:C?P.screen:null,timePerScreen:O.map(({screen:I,totalMs:_,averageMs:x})=>({screen:I,totalMs:_,averageMs:x})).sort((I,_)=>_.totalMs-I.totalMs),deadTaps:[...m.taps.values()],validationFailures:[...m.fields].map(([I,_])=>({key:I,count:_})),pageChanges:[...m.pagers].map(([I,_])=>({pager:I,count:_}))}}var ee=(o)=>o.replaceAll("|","\\|").replaceAll(`
3
- `," ").replaceAll("\r"," ");function Po(o){return[`# Prototype test session ${ee(o.id)}`,`Prototype: ${ee(o.prototypeId)} \xB7 Device: ${ee(o.deviceId)} \xB7 Status: ${o.status}`,`Cohort: ${ee(o.cohort??"\u2014")} \xB7 Goal: ${ee(o.goal??"\u2014")}`,`Completed: ${o.completed===null?"no goal set":o.completed} \xB7 Duration: ${o.durationMs} ms`,`Last screen before abandonment: ${ee(o.lastScreenBeforeAbandonment??"\u2014")}`,`Events: ${o.eventCount} \xB7 Dropped: ${o.droppedCount} \xB7 Truncated: ${o.truncated}`,"",o.privacy,"","| Screen | Reached | Left | Abandoned | Total ms | Average ms | Dead taps | Validation failures |","| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: |",...o.funnel.map((d)=>`| ${ee(d.screen)} | ${d.reached} | ${d.left} | ${d.abandoned} | ${d.totalMs} | ${d.averageMs} | ${d.deadTaps} | ${d.validationFailures} |`),"","Dead taps use window-local dp (points on iOS), with a 48-unit grid. No screenshot overlay is available yet.",...o.validationFailures.map(({key:d,count:y})=>`Validation failures: ${ee(d)} = ${y}`),...o.pageChanges.map(({pager:d,count:y})=>`Page changes: ${ee(d)} = ${y}`)].join(`
4
- `)}class tt{deps;recording=new Map;key(o,d){return JSON.stringify([o.sessionUuid??null,o.deviceId,d])}chain=Promise.resolve();constructor(o){this.deps=o}enqueue(o){let d=this.chain.then(o);return this.chain=d.then(()=>{},(y)=>{e.warn("Prototype test session persistence failed",y)}),d}flush(){return this.chain}begin(o,d,y={}){let f=this.deps.timer.now(),m=this.deps.startScreen(o,d),P=this.deps.deadTapsEnabled(o,d)?"enabled":"off",g=this.deps.ids.next(),T=this.key(o,d),A=[...this.recording.values()].some((C)=>C.scope.deviceId===o.deviceId&&C.id===d);if(!A)this.recording.set(T,{scope:{...o},id:d,testSessionId:g});return this.enqueue(async()=>{let C=await this.deps.store.findActive(o,d);if(C&&A)throw new t("A test session is already active for this device and prototype. End it with testSessionEnd before beginning another.");if(C)await this.deps.store.endSession(C.test_session_id,Math.max(C.started_at_ms,f),"released");let O={test_session_id:g,prototype_id:d,device_id:o.deviceId,session_uuid:o.sessionUuid??null,cohort:y.cohort??null,goal:y.goal??null,start_screen:m,status:"active",started_at_ms:f,ended_at_ms:null,ended_reason:null,dropped_count:0};return await this.deps.store.insertSession(O),this.recording.set(this.key(o,d),{scope:{...o},id:d,testSessionId:O.test_session_id}),{session:O,eventCount:0,deadTaps:P,...P==="off"?{warning:"Add window.deadTaps: true via show to record dead taps (requires prototype_dead_tap_v1)."}:{}}}).catch((C)=>{if(this.recording.get(T)?.testSessionId===g)this.recording.delete(T);throw u(C,"Failed to begin prototype test session")})}recordEvent(o,d){let y=this.recording.get(this.key(o,d.id));if(!y)return;let f=this.deps.timer.now(),m=fo(d,this.deps.secureKeys(o,d.id)),P=m&&{...m,at_ms:f},g=d.kind==="dismissed";this.enqueue(async()=>{let T=await this.deps.store.findById(y.testSessionId);if(T?.status!=="active")return;if(P)try{await this.deps.store.appendEvents(T.test_session_id,[P])}catch(A){e.warn("Prototype test event append failed",A)}if(g)await this.finish(T,f,"dismissed"),await this.deps.store.pruneEnded()}).catch((T)=>{e.warn("Prototype test event was not persisted",T)})}async active(o,d){let y=await this.deps.store.findActive(o,d);return y?.session_uuid===(o.sessionUuid??null)?y:void 0}async finish(o,d,y){await this.deps.store.endSession(o.test_session_id,Math.max(o.started_at_ms,d),y),this.recording.delete(this.key({deviceId:o.device_id,sessionUuid:o.session_uuid??void 0},o.prototype_id))}endForDismiss(o,d,y){let f=this.recording.get(this.key(o,d));if(!f)return;let m=this.deps.timer.now();this.enqueue(async()=>{let P=await this.deps.store.findById(f.testSessionId);if(P?.status==="active")await this.finish(P,m,y),await this.deps.store.pruneEnded()}).catch((P)=>{e.warn("Prototype test session cleanup failed",P)})}endSessionRecordings(o){for(let{scope:d,id:y}of this.recording.values())if(d.sessionUuid===o)this.endForDismiss(d,y,"released")}endDeviceRecordings(o){for(let{scope:d,id:y}of this.recording.values())if(d.deviceId===o)this.endForDismiss(d,y,"released")}end(o,d){let y=this.deps.timer.now();return this.enqueue(async()=>{let f=await this.active(o,d);if(!f)throw new t("No active test session for this scope and prototype. Use testSessionBegin first, or testSessionReport for a stored session.");await this.finish(f,y,"end");let m=await this.result({...f,status:"ended",ended_at_ms:Math.max(f.started_at_ms,y),ended_reason:"end"},o);return await this.deps.store.pruneEnded(),m})}report(o,d){return this.enqueue(async()=>{let y=d.testSessionId?await this.deps.store.findById(d.testSessionId):await this.deps.store.findLatest(o,d.id);if(!y||d.id!==void 0&&d.id!==y.prototype_id)throw new t("No stored test session for this id. Check testSessionId or begin a test session for this prototype.");return this.result(y,{deviceId:y.device_id,sessionUuid:y.session_uuid??void 0})})}async result(o,d){let y=await this.deps.store.listEvents(o.test_session_id),f=ho(o,y,this.deps.timer.now());return{session:o,eventCount:y.length,deadTaps:this.deps.deadTapsEnabled(d,o.prototype_id)?"enabled":"off",report:f,markdown:Po(f)}}}function go(o){let d=new Set,y=(f)=>{if(Array.isArray(f)){f.forEach(y);return}if(f===null||typeof f!=="object")return;let m=f;if((m.type==="textField"||m.type==="searchBar")&&typeof m.stateKey==="string"&&m.secure!==!1)d.add(m.stateKey.includes("{")?"*":m.stateKey);Object.values(m).forEach(y)};return y(o),d}var fn=5000;class ot{db;constructor({db:o}={}){this.db=o}getDb(){return this.db??_e()}async insertSession(o){await this.getDb().insertInto("prototype_test_sessions").values(o).execute()}findActive(o,d){return this.getDb().selectFrom("prototype_test_sessions").selectAll().where("device_id","=",o.deviceId).where("prototype_id","=",d).where("status","=","active").executeTakeFirst()}findById(o){return this.getDb().selectFrom("prototype_test_sessions").selectAll().where("test_session_id","=",o).executeTakeFirst()}findLatest(o,d){return this.getDb().selectFrom("prototype_test_sessions").selectAll().where("device_id","=",o.deviceId).where("prototype_id","=",d).where("session_uuid",o.sessionUuid===void 0?"is":"=",o.sessionUuid??null).orderBy("started_at_ms","desc").orderBy("test_session_id","desc").executeTakeFirst()}async appendEvents(o,d){await this.getDb().transaction().execute(async(y)=>{if((await y.selectFrom("prototype_test_sessions").select("status").where("test_session_id","=",o).executeTakeFirstOrThrow()).status!=="active")return;let m=await y.selectFrom("prototype_test_session_steps").select((g)=>g.fn.countAll().as("count")).where("test_session_id","=",o).executeTakeFirstOrThrow(),P=d.slice(0,Math.max(0,fn-Number(m.count)));for(let g=0;g<P.length;g+=100)await y.insertInto("prototype_test_session_steps").values(P.slice(g,g+100).map((T,A)=>({...T,test_session_id:o,seq:Number(m.count)+g+A+1}))).execute();if(P.length<d.length)await y.updateTable("prototype_test_sessions").set((g)=>({dropped_count:g("dropped_count","+",d.length-P.length)})).where("test_session_id","=",o).execute()})}async endSession(o,d,y){await this.getDb().updateTable("prototype_test_sessions").set({status:"ended",ended_at_ms:d,ended_reason:y}).where("test_session_id","=",o).where("status","=","active").execute()}listEvents(o){return this.getDb().selectFrom("prototype_test_session_steps").selectAll().where("test_session_id","=",o).orderBy("seq").execute()}async pruneEnded(o=50){await this.getDb().transaction().execute(async(d)=>{let y=await d.selectFrom("prototype_test_sessions").selectAll().where("status","=","ended").orderBy("ended_at_ms","desc").orderBy("test_session_id","desc").execute(),f=new Map;for(let m of y){let P=JSON.stringify([m.device_id,m.prototype_id]),g=(f.get(P)??0)+1;if(f.set(P,g),g>Math.max(0,o))await d.deleteFrom("prototype_test_session_steps").where("test_session_id","=",m.test_session_id).execute(),await d.deleteFrom("prototype_test_sessions").where("test_session_id","=",m.test_session_id).execute()}})}}var mn=Op();function vo(o,d){let y=(f,m)=>d.shownSpecs.read(f.deviceId,m);return new tt({store:o.testSessionStore??new ot,timer:o.clock??o.timer??i,ids:o.idGenerator??B,secureKeys:(f,m)=>{let P=y(f,m);return P.kind==="known"?go(P.spec):new Set(["*"])},startScreen:(f,m)=>et(d.status(f).prototypes.find((P)=>P.id===m)?.stacks),deadTapsEnabled:(f,m)=>{let P=y(f,m);if(P.kind!=="known")return!1;let g=P.spec.window;return g!==null&&typeof g==="object"&&"deadTaps"in g&&g.deadTaps===!0}})}var hn=(o)=>["testSessionBegin","testSessionEnd","testSessionReport"].includes(o);async function Pn(o,d,y){try{let f=y.action==="testSessionBegin"?await o.begin(d,y.id,y):y.action==="testSessionEnd"?await o.end(d,y.id):await o.report(d,y),m=f.session;return{success:!0,testSession:{id:m.test_session_id,prototypeId:m.prototype_id,deviceId:m.device_id,status:m.status,...m.cohort===null?{}:{cohort:m.cohort},...m.goal===null?{}:{goal:m.goal},startedAt:m.started_at_ms,...m.ended_at_ms===null?{}:{endedAt:m.ended_at_ms},eventCount:f.eventCount,droppedCount:m.dropped_count,deadTaps:f.deadTaps},..."report"in f?{report:mn.parse(f.report),markdown:f.markdown}:{},..."warning"in f?{warning:f.warning}:{}}}catch(f){return e.warn("Prototype test session action failed",f),{success:!1,error:u(f,"Prototype test session failed").message}}}function wo(o){return o==="status"||hn(o)}function So(o,d,y){if(y.action!=="status")return Pn(o.recorder,d,y);let f=o.preview?.().info();return{success:!0,...Ee(o.store,o.events,d,{deviceDark:"cached"}),...f?{previewServer:f}:{}}}import{join as pe}from"path";async function Ce(o,d,y,{signal:f,timeoutGuidance:m="It may still have saved the prototype: check ProtoViewer before retrying, and unlock the device if it is locked."}={}){let P=d.now()+y;do{f?.throwIfAborted();let g=(await o()).trim();if(g.length>0)return gn(g);await d.sleep(Math.min(sV,Math.max(0,P-d.now())))}while(d.now()<P);throw new t(`ProtoViewer did not answer within ${y} ms. ${m}`)}function gn(o){let d;try{d=JSON.parse(o)}catch(f){throw new t(`ProtoViewer wrote an unreadable result: ${r(f)}`,{cause:f})}let y=C8.safeParse(d);if(!y.success)throw new t(`ProtoViewer wrote an unexpected result: ${y.error.message}`);return y.data}var wn=1000;class rt{deps;constructor(o){this.deps=o}async installed(o){return z(this.deps)==="simulator"&&await this.deps.simctl.installed(this.deps.deviceId,o)}async capabilities(){return}importBundle(o,d,y,f){return this.exchange(y,f,{bytes:o,label:d})}open(o,d,y){return this.exchange(d,y,{libraryId:o})}async exchange(o,d,y){d?.throwIfAborted();let f=this.deps.timer.now(),m=`mcp-${this.deps.ids.next().replace(/[^A-Za-z0-9_-]/g,"")}`.slice(0,64);if(!SM.test(m))throw new t("Generated an unusable ProtoViewer request id.");let P=await this.deps.simctl.dataContainer(this.deps.deviceId,d);if(!P.trim())throw new os("Could not resolve ProtoViewer's data container.");let g=pe(P,D8),T=pe(g,O8),A=pe(g,M8),C=pe(T,`${m}.automobile-proto`),O=`${C}.tmp`,I=pe(A,`${m}.json`),_=pe(T,`${m}.request`),x=`${_}.tmp`;try{await this.prepare({inboxDir:T,resultsDir:A,temporary:O,inbox:C},y,d),d?.throwIfAborted(),await this.foreground(o,d),await this.requireFileDelivery(g,Math.max(0,o-(this.deps.timer.now()-f)),d),await this.deliverRequest(x,_,y,d);let F=Math.max(o-(this.deps.timer.now()-f),Math.min(o,wn)),q=await Ce(()=>this.deps.files.read(I),this.deps.timer,F,{signal:d,timeoutGuidance:"Retrying the same spec is safe: imports are idempotent. Open ProtoViewer and unlock the simulator if it is locked."});if(q.request!==m)throw new t(`ProtoViewer answered request ${q.request}, not ${m}; retry the call.`);if(q.status==="prepared")throw new t("ProtoViewer answered a request with a prepare result; retry.");if(q.status==="rejected"&&q.path==="inbox")throw new os(`ProtoViewer cannot read the prototype pushed into its inbox: ${q.reason}.`);return q}finally{await this.cleanup([_,x,I,C,O])}}async prepare({inboxDir:o,resultsDir:d,temporary:y,inbox:f},m,P){try{if(await this.deps.files.mkdir(o),await this.deps.files.mkdir(d),"bytes"in m)await this.deps.files.write(y,m.bytes),await this.deps.files.rename(y,f)}catch(g){if(P?.aborted)throw g;throw new os(`Could not prepare ProtoViewer's inbox: ${r(g)}`,{cause:g})}}async deliverRequest(o,d,y,f){let m="bytes"in y?{action:"import",...y.label===void 0?{}:{label:y.label}}:{action:"open",libraryId:y.libraryId};try{f?.throwIfAborted(),await this.deps.files.write(o,new TextEncoder().encode(JSON.stringify(m))),await this.deps.files.rename(o,d)}catch(P){if(f?.aborted)throw P;throw new os(`Could not publish ProtoViewer's request: ${r(P)}`,{cause:P})}}async foreground(o,d){try{await this.deps.simctl.launch(this.deps.deviceId,o,d)}catch(y){if(d?.aborted)throw y;throw new oV({cause:y})}}async requireFileDelivery(o,d,y){let f=this.deps.timer.now()+d;do{if(y?.throwIfAborted(),(await this.deps.files.read(pe(o,"delivery"))).trim()===N8)return;await this.deps.timer.sleep(Math.min(sV,Math.max(0,f-this.deps.timer.now())))}while(this.deps.timer.now()<f);throw new y_}async cleanup(o){for(let d of o)try{await l(()=>this.deps.files.remove(d),{timer:this.deps.timer,timeoutMs:M0,label:"ProtoViewer cleanup"})}catch(y){e.warn(`[protoviewer] cleanup failed: ${r(y)}`)}}}class nt{client;bundleIdCandidates;bundleIds=new Map;constructor(o,d){this.client=o;this.bundleIdCandidates=d}async installed(o,d){let y=await this.client.listAppsOrThrow(o,{signal:d}),f=t1((m)=>y.some((P)=>P.bundleId===m),this.bundleIdCandidates);if(f===void 0)return this.bundleIds.delete(o),!1;return this.bundleIds.set(o,f),!0}async dataContainer(o,d){try{return await Jo({deviceId:o,bundleId:this.bundleId(o),run:(y)=>this.client.executeCommandArgs(y,void 0,d)})}catch(y){if(y instanceof ao)return e.debug("ProtoViewer data container unresolved"),"";throw y}}async launch(o,d,y){await this.client.executeCommandArgs(["launch",o,this.bundleId(o)],d,y)}bundleId(o){return this.bundleIds.get(o)??cy}}import{mkdir as Sn,writeFile as bn,rename as Rn,readFile as kn,rm as En}from"fs/promises";class st{async mkdir(o){await Sn(o,{recursive:!0})}async write(o,d){await bn(o,d)}async rename(o,d){await Rn(o,d)}async read(o){try{return await kn(o,"utf8")}catch(d){if(d instanceof Error&&"code"in d&&d.code==="ENOENT")return e.debug("ProtoViewer result pending"),"";throw d}}async remove(o){await En(o,{force:!0})}}var Ie=".mock.automobile.invalid";function Oe(o){let d;try{d=new URL(o)}catch(m){e.debug("[PrototypeMock] URL parse failed.");return}let y=d.hostname.toLowerCase();if(d.protocol!=="https:"&&d.protocol!=="http:"||!y.endsWith(Ie))return;return{backendId:y.slice(0,-Ie.length),path:d.pathname,query:Object.fromEntries(d.searchParams)}}var it=(o)=>`https://${o}${Ie}`;function bo(o,d){let y=d.backendId;try{if(d.action==="clearBackend")return{success:!0,backend:{id:y,origin:it(y),cleared:o.clear(y)}};if(d.action==="backendLog"||d.action==="publish"){let P=o.get(y);if(P===void 0)return{success:!1,error:`No mock backend "${y}" is defined.`};if(d.action==="backendLog")return{success:!0,backendLog:P.requestLog(d.since)};return{success:!0,backend:{id:y,origin:it(y),delivered:P.publish(d.room,d.frame)}}}o.define(y,d.backend);let f=o.get(y),m=Object.fromEntries(Object.entries(f.snapshot()).map(([P,g])=>[P,g.length]));return{success:!0,backend:{id:y,origin:it(y),collections:m,routes:f.routeCount,faults:f.faultCount,rooms:f.roomCount,actors:f.actorCount}}}catch(f){return e.warn("Prototype mock backend action failed",f),{success:!1,error:u(f,"Mock backend action failed").message}}}class at{state;constructor(o=1){this.state=Ro(o)}reseed(o){this.state=Ro(o)}next(){this.state=this.state+1831565813>>>0;let o=this.state;return o=Math.imul(o^o>>>15,o|1),o^=o+Math.imul(o^o>>>7,o|61),((o^o>>>14)>>>0)/4294967296}pick(o){if(o.length===0)throw Error("Random.pick cannot pick from an empty array");return o[Math.floor(this.next()*o.length)]}}var Ro=(o)=>Math.floor(o)>>>0||1;var{MAX_PROTOTYPE_UPLOAD_BYTES:zd,MAX_PROTOTYPE_UPLOAD_PARTS:Gd,DEFAULT_PROTOTYPE_REQUEST_TIMEOUT_MS:te,MAX_PROTOTYPE_REQUEST_TIMEOUT_MS:xe,MAX_PROTOTYPE_RESPONSE_BYTES:de,MAX_PROTOTYPE_REQUESTS_IN_FLIGHT:ko}=W.limits;var Eo=String.raw`params\.[A-Za-z][A-Za-z0-9_]*|query\.[^{}\s]+|body:\/[^{}\s]*`,Tn=[Eo,String.raw`${Eo}|item(?::\/[^{}\s]*)?`].map((o)=>({placeholder:new RegExp(String.raw`\{(${o})\}`,"g"),exact:new RegExp(String.raw`^\{(${o})\}$`)}));function To(o,d){if(o.startsWith("params."))return Ao(d.params,o.slice(7));if(o.startsWith("query."))return Ao(d.query,o.slice(6));if(o==="item")return d.item;if(o.startsWith("item:"))return kt(d.item,o.slice(5));return kt(d.body,o.slice(5))}function Ao(o,d){return Object.hasOwn(o,d)?o[d]:void 0}function An(o){if(o===void 0||o===null)return"";return typeof o==="string"?o:JSON.stringify(o)}class De extends Error{}function oe(o,d,y=de){let{placeholder:f,exact:m}=Tn["item"in d?1:0],P=y,g=(O)=>{if(P-=O,P<0)throw new De(`Response body exceeds ${y} bytes.`)},T=new Map,A=(O,I)=>{let _=T.get(O);if(_===void 0)_=JSON.stringify(I).length,T.set(O,_);return _},C=(O)=>{if(typeof O==="string"){let I=m.exec(O);if(I){let _=To(I[1],d)??null;return g(A(I[1],_)),_}return g(O.replace(f,"").length),O.replace(f,(_,x)=>{let F=An(To(x,d));return g(F.length),F})}if(Array.isArray(O))return g(2+Math.max(0,O.length-1)),O.map(C);if(typeof O==="object"&&O!==null)return g(2+Math.max(0,Object.keys(O).length-1)),Object.fromEntries(Object.entries(O).map(([I,_])=>(g(I.length+3),[I,C(_)])));return g(JSON.stringify(O).length),O};return C(o)}function ce(o,d){let y=o.split("/"),f=d.split("/");if(y.length!==f.length)return;let m={};for(let[P,g]of y.entries()){let T=f[P];if(g.startsWith(":"))m[g.slice(1)]=Le(T);else if(g!==T)return}return m}function Le(o){try{return decodeURIComponent(o)}catch(d){return e.debug("[PrototypeMock] path segment is not valid percent-encoding."),o}}var Co=256,Cn={params:{},query:{},body:void 0};class pt{actors;timer;apply;pending=new Set;disposed=!1;constructor(o,d,y){this.actors=o;this.timer=d;this.apply=y}start(){for(let o of this.actors)if(o.every!==void 0)this.tick(o,1,(o.afterMs??0)+o.every)}onRequest(o,d,y,f){if(y>=400)return;for(let m of this.actors){let[P,g]=m.on?.route.split(" ")??[],T=P===o&&g!==void 0?ce(g,d):void 0;if(T!==void 0)this.run(m.do,0,m.afterMs??0,{...f,params:T})}}dispose(){this.disposed=!0;for(let o of this.pending)this.timer.clearTimeout(o);this.pending.clear(),this.steps=0}get pendingCount(){return this.pending.size}tick(o,d,y){this.schedule(y,()=>{if(d<o.maxRuns)this.tick(o,d+1,o.every);this.run(o.do,0,0,Cn)},!1)}run(o,d,y,f){let m=o[d];if(m===void 0||this.disposed)return;let P=y+(m.afterMs??0),g=()=>{this.applyStep(m,f),this.run(o,d+1,0,f)};if(P===0)g();else this.schedule(P,g)}steps=0;schedule(o,d,y=!0){if(this.disposed)return;if(y&&this.steps>=Co){e.warn(`[PrototypeMock] actor step dropped: ${Co} steps already scheduled.`);return}let f=this.timer.setTimeout(()=>{if(this.pending.delete(f),y)this.steps--;if(!this.disposed)d()},o);if(this.pending.add(f),y)this.steps++}applyStep(o,d){let y=In(o,d);if(y===void 0)return;let f=this.apply(y);if(f>=400)e.warn(`[PrototypeMock] actor ${y.method} ${y.collection}${y.id===void 0?"":`/${y.id}`} answered ${f}.`)}}function In(o,d){try{let y=o.value===void 0?void 0:oe(o.value,d),f=o.id===void 0?void 0:oe(o.id,d),m=f===void 0||f===null?void 0:String(f);if(o.append!==void 0)return{method:"POST",collection:o.append,body:y};if(o.update!==void 0)return{method:"PATCH",collection:o.update,id:m,body:y};if(o.remove!==void 0)return{method:"DELETE",collection:o.remove,id:m};return}catch(y){e.warn(`[PrototypeMock] actor step skipped: ${r(y)}`,y);return}}var Io=10,Oo=100,On=new Set(["q","_sort","_page","_limit","after","size"]),_o=W.limits.MAX_PROTOTYPE_DATA_ARRAY_ITEMS,ne=(o,d,y={})=>({status:o,headers:y,body:d}),V=(o,d)=>ne(o,{error:d});function _n(o){return typeof o==="object"&&o!==null&&!Array.isArray(o)}function Mn(o,d){if(typeof o==="number"&&typeof d==="number")return o-d;let y=String(o??""),f=String(d??"");return y<f?-1:y>f?1:0}function xn(o,d){if(d===void 0||d==="")return o;let y=d.startsWith("-"),f=y?d.slice(1):d;return[...o].sort((m,P)=>(y?-1:1)*Mn(m[f],P[f]))}function Dn(o,d){let y=Object.entries(d).filter(([m])=>!On.has(m)),f=d.q?.toLowerCase();return o.filter((m)=>y.every(([P,g])=>String(m[P])===g)&&(f===void 0||Object.values(m).some((P)=>(typeof P==="string"||typeof P==="number")&&String(P).toLowerCase().includes(f))))}function dt(o,d,y){if(o===void 0)return d;return/^[1-9][0-9]*$/.test(o)&&Number(o)<=y?Number(o):void 0}function Ln(o,d){let y=xn(Dn(o,d),d._sort);if(d.after!==void 0||d.size!==void 0)return qn(y,d);if(d._page===void 0&&d._limit===void 0)return ne(200,y);let f=dt(d._limit,Io,Oo),m=dt(d._page,1,_o);if(f===void 0||m===void 0)return V(400,"_page and _limit must be positive integers (_limit at most 100)");return ne(200,y.slice((m-1)*f,m*f),{"x-total-count":String(y.length)})}function qn(o,d){let y=dt(d.size,Io,Oo);if(y===void 0)return V(400,"size must be a positive integer of at most 100");let f=0;if(d.after!==void 0&&d.after!==""){let g=o.findIndex((T)=>String(T.id)===d.after);if(g===-1)return V(400,"after names no item in this result");f=g+1}let m=o.slice(f,f+y),P=f+y<o.length;return ne(200,{items:m,next:P?m[m.length-1]?.id??null:null})}function Mo(o){return _n(o)?o:void 0}function xo(o,d){return o.length<=_o&&d.fits(o)}function ct(o,d,y){let[f,...m]=d.rest;if(m.length>0)return V(404,"No such route");if(f===void 0)return Fn(o,d,y);let P=o.findIndex((g)=>String(g.id)===f);switch(d.method){case"GET":return P===-1?V(404,"Not found"):ne(200,o[P]);case"PATCH":case"PUT":return Nn(o,P,d,y);case"DELETE":return Hn(o,P);default:return V(405,`${d.method} is not allowed here`)}}function Fn(o,d,y){if(d.method==="GET")return Ln(o,d.query);if(d.method!=="POST")return V(405,`${d.method} is not allowed here`);let f=Mo(d.body);if(f===void 0)return V(400,"Expected a JSON object body");if(f.id!==void 0&&!lG(f.id))return V(400,"id must be a number or a non-empty string other than . and ..");let m=f.id===void 0?{...f,id:y.ids.next()}:f;if(o.some((g)=>String(g.id)===String(m.id)))return V(409,"An item with that id already exists");let P=[...o,m];if(!xo(P,y))return V(413,"The collection is full");return o.push(m),ne(201,m)}function Nn(o,d,y,f){let m=Mo(y.body);if(m===void 0)return V(400,"Expected a JSON object body");if(d===-1)return V(404,"Not found");let P=o[d];if(m.id!==void 0&&String(m.id)!==String(P.id))return V(400,"The id of an item cannot change");let g=y.method==="PATCH"?{...P,...m,id:P.id}:{...m,id:P.id},T=o.map((A,C)=>C===d?g:A);if(!xo(T,f))return V(413,"The collection is full");return o[d]=g,ne(200,g)}function Hn(o,d){if(d===-1)return V(404,"Not found");return o.splice(d,1),ne(200,{})}function Do(o){return typeof o==="string"?o:JSON.stringify(o)}function ut(o){let d=new URL("https://room.invalid");return d.pathname=o,d.pathname}var lt=(o)=>Buffer.byteLength(o)<=Nl;class yt{rooms;deps;members=new Set;constructor(o,d){this.rooms=o;this.deps=d}memberCount(o){return this.membersOf(o===void 0?void 0:ut(o)).length}join(o,d,y){let f=ut(o),m=this.match(f);if(m===void 0)return{ok:!1,status:404,message:`No mock room matches ${f}.`};if(this.membersOf(f).length>=dG)return{ok:!1,status:503,message:`Mock room ${f} already has ${dG} connections.`};let P={room:m.room,path:f,target:y,timers:[],left:!1};this.members.add(P);let g={params:m.params,query:d,body:void 0};for(let T of m.room.onConnect??[])this.deliverBound(P,T,g);for(let T of m.room.timeline??[])P.timers.push(this.deps.timer.setTimeout(()=>this.deliverBound(P,T.frame,g),T.afterMs));return{ok:!0,connection:{send:(T)=>this.send(P,T),leave:()=>this.leave(P)}}}publish(o,d,y){let f=ut(o),m=Do(d);if(!lt(m))return e.warn(`[PrototypeMock] dropped a ${y} frame to ${f}: over ${Nl} bytes`),0;this.deps.record(f,y,m);let P=this.membersOf(f);return P.forEach((g)=>g.target.deliver(m)),P.length}closeAll(o){for(let d of[...this.members])this.leave(d),d.target.close(1001,o)}send(o,d){if(o.left)return{ok:!1,reason:"not_open"};if(!lt(d))return{ok:!1,reason:"too_large"};if(this.deps.record(o.path,"client",d),o.room.echo===!0)o.target.deliver(d);if(o.room.relay===!0)this.membersOf(o.path).filter((y)=>y!==o).forEach((y)=>y.target.deliver(d));return{ok:!0}}leave(o){if(o.left)return;o.left=!0,o.timers.forEach((d)=>this.deps.timer.clearTimeout(d)),this.members.delete(o)}deliverBound(o,d,y){if(o.left)return;let f;try{f=Do(oe(d,y,Nl))}catch(m){e.warn(`[PrototypeMock] dropped a scripted frame to ${o.path}: ${r(m)}`);return}if(lt(f))o.target.deliver(f);else e.warn(`[PrototypeMock] dropped a scripted frame to ${o.path}: too large`)}match(o){for(let d of this.rooms){let y=ce(d.path,o);if(y!==void 0)return{room:d,params:y}}return}membersOf(o){return[...this.members].filter((d)=>o===void 0||d.path===o)}}var $n=200;class ft{definition;deps;collections=new Map;faultHits=new Map;log=[];rooms;seq=0;actors;constructor(o,d){this.definition=o;this.deps=d;for(let[y,f]of Object.entries(o.collections??{}))this.collections.set(y,structuredClone(f));this.rooms=new yt(o.rooms??[],{timer:d.timer,record:(y,f,m)=>this.append({seq:0,room:y,from:f,data:m})}),this.actors=new pt(o.actors??[],d.timer,(y)=>this.applyActorWrite(y)),this.actors.start()}get actorCount(){return this.definition.actors?.length??0}get roomCount(){return this.definition.rooms?.length??0}join(o,d,y){return this.rooms.join(o,d,y)}publish(o,d){return this.rooms.publish(o,d,"publish")}dispose(o="Mock backend was disposed."){this.actors.dispose(),this.rooms.closeAll(o)}get routeCount(){return this.definition.routes?.length??0}get faultCount(){return this.definition.faults?.length??0}requestLog(o=0){return this.log.filter((d)=>d.seq>o)}snapshot(){return Object.fromEntries([...this.collections].map(([o,d])=>[o,structuredClone(d)]))}async answer(o,d){let y=o.method.toUpperCase();await this.waitLatency(),d?.throwIfAborted();let f=this.faultFor(y,o.path)??await this.cannedRoute(y,o,d),m=f===void 0?this.collectionResponse(y,o):void 0,P=f??m??{status:404,headers:{},body:{error:"No such route"}};if(this.record(y,o,P),m!==void 0)this.broadcastWrite(y,o,m);return this.actors.onRequest(y,o.path,P.status,{query:o.query,body:o.body}),P}applyActorWrite(o){let d=this.collections.get(o.collection);if(d===void 0)return 404;return ct(d,{method:o.method,rest:o.id===void 0?[]:[o.id],query:{},body:o.body},{ids:this.deps.ids,fits:(y)=>this.fitsWith(d,y)}).status}broadcastWrite(o,d,y){let f=Le(d.path.split("/")[1]??""),m=this.broadcastFor(f,o,y.status);if(m===void 0)return;let P={params:{},query:d.query,body:d.body,item:y.body??null};try{let g=oe(m.room,P);if(typeof g!=="string"||!g.startsWith("/")){e.warn(`[PrototypeMock] broadcast for ${f} dropped: room is not a path`);return}let T=oe(m.frame,P,Nl);this.rooms.publish(g,T,"broadcast")}catch(g){e.warn(`[PrototypeMock] broadcast for ${f} dropped: ${r(g)}`)}}broadcastFor(o,d,y){let f=this.definition.broadcasts??{};if(y<200||y>299||!this.collections.has(o)||!Object.hasOwn(f,o))return;let m=f[o];return(m.on??["POST"]).some((P)=>P===d)?m:void 0}async waitLatency(){let o=this.definition.latencyMs;if(o===void 0)return;let d=o.min+Math.floor(this.deps.random.next()*(o.max-o.min+1));if(d>0)await this.deps.timer.sleep(d)}faultFor(o,d){for(let y of this.definition.faults??[]){if(y.method!==void 0&&y.method!==o||!ce(y.path,d))continue;let f=(this.faultHits.get(y)??0)+1;if(this.faultHits.set(y,f),y.every!==void 0?f%y.every===0:this.deps.random.next()<y.rate)return{status:y.status,headers:{},body:{error:"mock fault"}}}return}async cannedRoute(o,d,y){for(let f of this.definition.routes??[]){let m=f.method===o?ce(f.path,d.path):void 0;if(m!==void 0)return this.routeResponse(f,{params:m,query:d.query,body:d.body},y)}return}async routeResponse(o,d,y){if(o.delayMs!==void 0&&o.delayMs>0)await this.deps.timer.sleep(o.delayMs),y?.throwIfAborted();return{status:o.status??200,headers:o.headers??{},body:o.body===void 0?null:oe(o.body,d)}}collectionResponse(o,d){let[,y,...f]=d.path.split("/").map(Le),m=y===void 0?void 0:this.collections.get(y);if(m===void 0)return;return ct(m,{method:o,rest:f,query:d.query,body:d.body},{ids:this.deps.ids,fits:(P)=>this.fitsWith(m,P)})}fitsWith(o,d){let y=Object.fromEntries([...this.collections].map(([f,m])=>[f,m===o?d:m]));return uG(this.definition,y)<=yM}record(o,d,y){this.append({seq:0,method:o,path:d.path,query:d.query,status:y.status,...d.body===void 0?{}:{body:d.body}})}append(o){if(o.seq=++this.seq,this.log.push(o),this.log.length>$n)this.log.shift()}}var Vn=(o)=>o===void 0?Cl:new at(o);class mt{deps;backends=new Map;constructor(o){this.deps=o}define(o,d){this.defineAll({[o]:d})}defineAll(o){let d=Object.entries(o).map(([m,P])=>{if(!vM.test(m))throw new t(`Mock backend id "${m}" must match ${vM.source}.`);let g=m8.safeParse(P);if(!g.success){let T=g.error.issues[0],A=[m,...T?.path??[]].join(".");throw new t(`Invalid mock backend definition at ${A}: ${T?.message??"invalid"}`)}return[m,g.data]}),y=d.filter(([m])=>!this.backends.has(m)).length;if(this.backends.size+y>cG)throw new t(`At most ${cG} mock backends may be defined; clear one first.`);let f=this.deps.createRandom??Vn;for(let[m,P]of d)this.backends.get(m)?.dispose(`Mock backend "${m}" was replaced.`),this.backends.set(m,new ft(P,{random:f(P.seed),ids:this.deps.ids,timer:this.deps.timer}))}get(o){return this.backends.get(o)}clear(o){return this.backends.get(o)?.dispose(`Mock backend "${o}" was cleared.`),this.backends.delete(o)}clearAll(){for(let o of this.ids())this.clear(o)}ids(){return[...this.backends.keys()]}}class ht{states=new Map;begin(o,d){let y=JSON.stringify([o,d]),f=this.states.get(y)??{issued:0,settledValid:0,latestValid:0,inFlight:new Map};return f.issued+=1,f.latestValid=f.issued,f.inFlight.set(f.issued,!1),this.states.set(y,f),f.issued}isLatest(o,d,y){let f=this.states.get(JSON.stringify([o,d]));if(!f)return!0;return f.inFlight.get(y)===!0?y===f.issued:y===f.latestValid}withdraw(o,d,y){let f=this.states.get(JSON.stringify([o,d]));if(!f||f.inFlight.get(y)!==!1)return;if(f.inFlight.set(y,!0),f.latestValid===y)f.latestValid=this.newestValidBelow(f,y)}settle(o,d,y){let f=JSON.stringify([o,d]),m=this.states.get(f);if(!m)return;if(m.inFlight.get(y)===!1)m.settledValid=Math.max(m.settledValid,y);if(m.inFlight.delete(y),m.inFlight.size===0)this.states.delete(f)}trackedIds(){return this.states.size}newestValidBelow(o,d){let y=o.settledValid;for(let[f,m]of o.inFlight)if(!m&&f<d&&f>y)y=f;return y}}var Un=64;function Bn(o){return o.kind!==Z$}class Pt{events=[];lastSequence;droppedCount=0;push(o){if(this.lastSequence!==void 0&&o.sequence<=this.lastSequence)return!1;if(this.lastSequence=o.sequence,!Bn(o))return!1;if(this.events.push(structuredClone(o)),this.events.length>Un)this.events.shift(),this.droppedCount++;return!0}advanceTo(o){if(this.lastSequence===void 0||o>this.lastSequence)this.lastSequence=o}take(o){let d=this.events.findIndex((y)=>y.sequence>(o.afterSequence??-1)&&(o.eventName===void 0||y.name===o.eventName)&&(o.kind===void 0||y.kind===o.kind));return d<0?void 0:this.events.splice(d,1)[0]}status(){return{pendingCount:this.events.length,...this.lastSequence===void 0?{}:{lastSequence:this.lastSequence},droppedCount:this.droppedCount}}startEpoch(){this.events=[],this.lastSequence=void 0}clear(){this.events=[]}}var K=(o,d)=>JSON.stringify([o.sessionUuid??null,o.deviceId,d]);class gt{timer;store;entries=new Map;sources=new Map;telemetry;requests;recorder;constructor(o,d,{telemetry:y,requests:f,recorder:m}={}){this.timer=o;this.store=d;this.telemetry=y,this.requests=f,this.recorder=m}show(o,d,y){for(let m of this.entries.values())if(m.scope.deviceId===o.deviceId&&m.id===d&&K(m.scope,d)!==K(o,d))this.remove(m);let f=this.watch(o,d,y);this.store.startShow(o,d),f.buffer.startEpoch(),f.shown=!0,f.terminal=!1,this.subscribe(o.deviceId,y)}adopt(o,d,y,{replayed:f,lastSequence:m}){let P=this.entries.get(K(o,d)),g=P?.terminal===!0&&P.buffer.status().pendingCount>0;if(P?.shown&&!P.terminal||g)this.watch(o,d,y);else this.show(o,d,y);for(let T of f)this.receive(o.deviceId,T);this.entries.get(K(o,d))?.buffer.advanceTo(m)}isDismissed(o,d){return this.entries.get(K(o,d))?.terminal??!1}counts(o,d){return this.entries.get(K(o,d))?.buffer.status()}async awaitEvent(o,d,y,f){f.signal?.throwIfAborted();let m=this.watch(o,d,y),P=this.take(m,f);if(P)return this.dropConsumedTerminal(m),this.pruneSources(),P;return this.wait(m,f)}replaceShown(o,d){for(let y of this.entries.values())if(y.scope.deviceId===o&&y.id!==d&&y.shown)this.remove(y);this.pruneSources()}dismiss(o,d){for(let y of this.entries.values())if(y.scope.deviceId===o&&(d===void 0||y.id===d))this.remove(y);this.pruneSources()}releaseSession(o){this.recorder?.endSessionRecordings?.(o);let d=new Set(this.store.clearSession(o));for(let y of d)this.recorder?.endDeviceRecordings?.(y);for(let y of this.entries.values())if(y.scope.sessionUuid===o||d.has(y.scope.deviceId))this.remove(y,"released");this.pruneSources()}releaseDevice(o){this.recorder?.endDeviceRecordings?.(o),this.store.clearDevice(o);for(let d of this.entries.values())if(d.scope.deviceId===o)this.remove(d,"released");this.pruneSources()}dispose(){for(let o of this.entries.values())this.remove(o,"released");this.pruneSources()}watch(o,d,y){let f=K(o,d),m=this.entries.get(f);if(!m){if(Array.from(this.entries.values()).some((g)=>g.scope.deviceId===o.deviceId&&g.id===d))throw new t("Prototype events belong to another session; show this id in the current session first.");m={scope:{...o},id:d,buffer:new Pt,shown:!1,terminal:!1,waiters:new Set},this.entries.set(f,m)}if(!m.terminal)this.subscribe(o.deviceId,y);return m}subscribe(o,d){let y=this.sources.get(o);if(y?.client===d)return;y?.unsubscribe(),this.sources.set(o,{client:d,unsubscribe:d.onPrototypeEvent((f)=>this.receive(o,f))})}receive(o,d){let y=Array.from(this.entries.values()).find((f)=>f.scope.deviceId===o&&f.id===d.id);if(!y||y.terminal||!y.buffer.push(d))return;try{this.recorder?.recordEvent(y.scope,d)}catch(f){e.warn("Prototype test event recording failed",f)}if(this.store.recordEvent(y.scope,d),d.kind==="dismissed")y.shown=!1,y.terminal=!0,this.requests?.cancelPrototype(y.scope.deviceId,y.id),this.store.dismissed(y.scope,y.id);for(let f of[...y.waiters])f();this.pruneSources();try{this.telemetry?.recordPrototypeEvent(y.scope,d)}catch(f){e.warn(`[PrototypeEventCoordinator] Telemetry recording failed: ${r(f)}`)}}take(o,d){let y=o.buffer.take(d);if(!y)return o.terminal?{...o.buffer.status(),reason:"dismissed"}:void 0;if(y.kind==="dismissed")o.buffer.clear();return{event:{id:y.id,sequence:y.sequence,kind:y.kind,name:y.name,payload:y.payload,...y.context===void 0?{}:{context:y.context},...y.contextTruncated===!0?{contextTruncated:!0}:{},state:y.state,pages:y.pages,...y.stacks?{stacks:structuredClone(y.stacks)}:{},timestamp:y.timestamp,...y.validity===void 0?{}:{validity:y.validity},...y.keys===void 0?{}:{keys:y.keys}},...o.buffer.status()}}async wait(o,d){let y=()=>{},f=new Promise((g)=>{y=()=>{if(d.signal?.aborted)return;let T=this.take(o,d);if(T)o.waiters.delete(y),g(T)},o.waiters.add(y)}),m,P=new Promise((g)=>{m=this.timer.setTimeout(()=>{o.waiters.delete(y),g({...o.buffer.status(),timedOut:!0})},d.timeoutMs??US)});try{return await l([f,P],{timer:this.timer,signal:d.signal,label:"Await prototype event"})}finally{if(m!==void 0)this.timer.clearTimeout(m);if(o.waiters.delete(y),this.dropConsumedTerminal(o),!o.shown&&!o.terminal&&o.buffer.status().lastSequence===void 0&&o.waiters.size===0)this.entries.delete(K(o.scope,o.id));this.pruneSources()}}dropConsumedTerminal(o){if(o.terminal&&o.waiters.size===0&&o.buffer.status().pendingCount===0&&this.entries.get(K(o.scope,o.id))===o)this.entries.delete(K(o.scope,o.id))}remove(o,d="dismissed"){try{this.recorder?.endForDismiss(o.scope,o.id,d)}catch(y){e.warn("Prototype test session cleanup failed",y)}o.buffer.clear(),o.shown=!1,o.terminal=!0,this.requests?.cancelPrototype(o.scope.deviceId,o.id);for(let y of[...o.waiters])y();this.entries.delete(K(o.scope,o.id))}pruneSources(){for(let[o,d]of this.sources)if(!Array.from(this.entries.values()).some((f)=>f.scope.deviceId===o&&!f.terminal))d.unsubscribe(),this.sources.delete(o)}}var Wn=64;function Lo(o){return o==="/data"?[]:Fp(o.slice(5))}function Yn(o,d){let y=Lo(o),f=Lo(d),m=Math.min(y.length,f.length);return y.slice(0,m).every((P,g)=>P===f[g])}class wt{revisions;sequence=0;devices=new Map;constructor(o){this.revisions=o}beginShow(o,d,y=!0,f){let m=this.devices.get(o)??{entries:new Map,dataWrites:new Map,epoch:0,issued:0,open:new Map,poisonedThrough:0};m.platform=f??m.platform;let P=++this.sequence;m.issued=P;for(let g of m.open.values())if(y||g.replaceOthers||g.id===d)g.superseded=!0;return m.open.set(P,{id:d,replaceOthers:y,superseded:!1}),m.epoch=++this.sequence,this.devices.set(o,m),P}endShow(o,d,y,f){let m=this.devices.get(o),P=m?.open.get(d);if(!m||!P)return;if(m.open.delete(d),m.epoch=++this.sequence,P.superseded)return;if(f){if(f==="indeterminate"&&P.id!==void 0)m.entries.delete(P.id),m.dataWrites.delete(P.id);return}if(y&&d>m.poisonedThrough)this.storeShown(m,y);else m.entries.clear(),m.dataWrites.clear()}storeShown(o,d){if(d.replaceOthers!==!1)o.entries.clear(),o.dataWrites.clear();if(d.spec)o.entries.set(d.id,structuredClone(d.spec)),this.revisions?.recordShow(d.id,{spec:d.spec,platform:o.platform,variant:d.variant,mcpSessionId:d.mcpSessionId});else o.entries.delete(d.id);o.dataWrites.delete(d.id)}read(o,d){let y=this.devices.get(o);if(y&&y.open.size>0)return{kind:"busy"};let f=y?.entries.get(d);return f&&y?{kind:"known",spec:f,version:y.epoch}:{kind:"unknown"}}platformOf(o){return this.devices.get(o)?.platform}devicesShowing(o){return[...this.devices.entries()].filter(([,d])=>d.entries.has(o)).map(([d])=>d).sort()}showStartedSince(o,d){return(this.devices.get(o)?.issued??0)>d}commitPatch(o,d,y,f){let m=this.devices.get(o);if(!m)return!1;let P=m.open.size===0&&m.epoch===y&&m.entries.has(d);if(P)m.entries.set(d,structuredClone(f.spec)),m.epoch=++this.sequence,this.revisions?.recordPatch(d,{spec:f.spec,platform:m.platform,deviceRevision:f.deviceRevision,mcpSessionId:f.mcpSessionId});else this.abandon(o);return P}recordDeviceDataWrite(o,d,y){let f=this.devices.get(o);if(!f)return{kind:"untracked"};if(f.open.size>0)return this.abandon(o),{kind:"dropped"};let m=f.entries.get(d);if(!m)return{kind:"untracked"};let P=y.op==="remove"?bP(m.data,{op:"remove",path:y.path}):y.value===void 0?void 0:y.op==="extend"||y.op==="prepend"?bP(m.data,{...y,value:y.value}):bP(m.data,{...y,value:y.value});if(!P?.success)return this.forget(o,d),{kind:"dropped"};f.entries.set(d,{...m,data:P.data}),f.epoch=++this.sequence;let g=f.dataWrites.get(d)??{floor:0,writes:[]};g.writes.push({path:y.path,revision:y.revision});while(g.writes.length>Wn)g.floor=Math.max(g.floor,g.writes.shift().revision);return f.dataWrites.set(d,g),{kind:"mirrored",data:P.data}}dataPatchGuard(o,d,y,f){let m=this.devices.get(o)?.dataWrites.get(d);if(!m||y.length===0)return{kind:"ok"};if(f===void 0)return{kind:"baseRevisionRequired"};let P=f<m.floor,g=m.writes.filter((T)=>T.revision>f&&y.some((A)=>Yn(A,T.path)));if(!P&&g.length===0)return{kind:"ok"};return{kind:"conflict",revision:Math.max(f,m.floor,...m.writes.map((T)=>T.revision)),paths:P?[...y]:[...new Set(g.map((T)=>T.path))]}}abandon(o){let d=this.devices.get(o);if(!d)return;d.entries.clear(),d.dataWrites.clear(),d.poisonedThrough=d.issued,d.epoch=++this.sequence}forget(o,d){let y=this.devices.get(o);if(y&&(d===void 0||y.entries.has(d))){if(d===void 0)y.entries.clear(),y.dataWrites.clear();else y.entries.delete(d),y.dataWrites.delete(d);y.epoch=++this.sequence}}retainOnly(o,d){let y=this.devices.get(o);for(let f of y?.entries.keys()??[])if(f!==d)this.forget(o,f)}clearDevice(o){this.devices.delete(o)}}var jn=["battery","power","audio"];function Jn(o){return jn.find((d)=>d===o)}function zn(o,d){switch(d.kind){case"number":return Lb(o,d);case"boolean":return typeof o==="boolean";case"enum":return(d.values??[]).some((y)=>y===o);default:return!1}}function Gn(o){let d=o?.event.indexOf(".")??-1;return o&&!o.truncated&&o.event.slice(d+1)==="changed"?Jn(o.event.slice(0,d)):void 0}function Kn(o,d){return Object.entries(o).every(([y,f])=>Object.hasOwn(d,y)&&zn(f,d[y].value))}function qo(o){let d=ej(o),y=Gn(d),f=Te(d?.data),m=y?Lu[y]?.state:void 0;if(!y||!f||!m||!Kn(f,m))return;return{module:y,values:{...f},...d?.simulated?{simulated:!0}:{}}}function Xn(o){return o.feedbackLog?{feedbackLog:structuredClone(o.feedbackLog)}:{}}function Qn(o){return{...o.orientation?{orientation:o.orientation}:{},...o.statusBar?{statusBar:o.statusBar}:{}}}function Zn(o,d){if(d===void 0)delete o.data;else o.data=structuredClone(d)}function Fo(o,d){return d===void 0||(o.revision??-1)>d?{}:{revision:d}}function No(o,d,y){return o==="show"&&d.success?{...y===void 0?{}:{data:structuredClone(y)},...d.stacks?{stacks:structuredClone(d.stacks)}:{}}:{}}var es=128;function ts(o){return{pages:{...o.pages},...o.stacks?{stacks:structuredClone(o.stacks)}:{},state:{...o.state},...o.context===void 0?{}:{context:structuredClone(o.context)},...o.contextTruncated===!0?{contextTruncated:!0}:{},lastKnown:!0}}function rs(o){if(!o)return{};return{pages:{...o.pages},...o.stacks?{stacks:structuredClone(o.stacks)}:{},state:{...o.state},...o.context===void 0?{}:{context:structuredClone(o.context)},...o.contextTruncated===!0?{contextTruncated:!0}:{},lastKnown:!0}}function ns(o,d){let{stacks:y,...f}=o;return{...f,...!d&&y?{stacks:structuredClone(y)}:{},...o.data===void 0?{}:{data:structuredClone(o.data)},...rs(d)}}class St{clock;maxScopes;scopes=new Map;showDispatches=new Map;shownSpecs;constructor(o=i,d=es,y=new PM(o)){this.clock=o;this.maxScopes=d;this.shownSpecs=new wt(y)}status(o){let d=this.scopes.get(JSON.stringify([o.sessionUuid??null,o.deviceId]));return{prototypes:Array.from(d?.shown.values()??[],(y)=>ns(y,y.id?d?.snapshots?.get(y.id):void 0)),...d?.lastResult?{lastResult:{...d.lastResult}}:{},...d?.platformStatus?{platformStatus:structuredClone(d.platformStatus)}:{}}}shownOnDevice(o,d){for(let y of this.scopes.values()){let f=y.deviceId===o?y.shown.get(d):void 0;if(f)return structuredClone(f)}return}startShow(o,d){let y=this.scopes.get(JSON.stringify([o.sessionUuid??null,o.deviceId]));if(y)if(d===void 0)y.pendingSnapshots?.clear();else y.pendingSnapshots?.delete(d)}beginShowDispatch(o,d){let y=this.showDispatches.get(o)??new Map;y.set(d,!1),this.showDispatches.set(o,y)}adopt(o,d){let y=JSON.stringify([o.sessionUuid??null,o.deviceId]),f=this.scopes.get(y)??{...o,shown:new Map},m=this.patchedFields(o.deviceId,d.id);this.clearShown(o.deviceId,d.id);let P={id:d.id,lastAction:"show",adopted:!0,...d.persistent===void 0?{}:{persistent:d.persistent},...d.suspended===!0?{suspended:!0}:{},...d.hiddenReason?{hiddenReason:d.hiddenReason}:{},...Qn(d),...d.appearance?{appearance:{...d.appearance}}:{},...d.storage?{storage:structuredClone(d.storage)}:{},...iP(d.degradedEffects),...d.timers?{timers:structuredClone(d.timers)}:{},...Xn(d),shaderFailures:structuredClone(d.shaderFailures),success:!0,timestamp:this.clock.now()};f.lastResult=P,f.shown.set(d.id,{...P,...m,...No("show",{success:!0},d.data)}),f.pendingSnapshots?.delete(d.id),f.snapshots??=new Map,f.snapshots.set(d.id,{pages:{...d.pages},...d.stacks?{stacks:structuredClone(d.stacks)}:{},state:{...d.state},lastKnown:!0}),this.remember(y,f)}recordEvent(o,d){this.applyDeviceDataWrite(o.deviceId,d);let y=this.showDispatches.get(o.deviceId);if(y?.has(d.id)&&d.kind==="appearance_changed"&&b9(void 0,d.payload))y.set(d.id,!0);let f=JSON.stringify([o.sessionUuid??null,o.deviceId]),m=this.scopes.get(f)??{...o,shown:new Map};this.recordDeviceStatus(m,d),m.pendingSnapshots??=new Map;let P=ts(d);m.pendingSnapshots.set(d.id,P);let g=m.shown.get(d.id);if(g){if(m.snapshots??=new Map,m.snapshots.set(d.id,P),d.kind==="appearance_changed")this.recordAppearanceChange(m,g,d)}this.remember(f,m)}recordDeviceStatus(o,d){let y=qo(d),f=y?o.platformStatus?.[y.module]:void 0;if(y&&!(f&&f.timestamp>d.timestamp))o.platformStatus={...o.platformStatus,[y.module]:{values:y.values,timestamp:d.timestamp,receivedAt:this.clock.now(),...y.simulated?{simulated:!0}:{}}}}recordAppearanceChange(o,d,y){let f=b9(d.appearance,y.payload);if(f)o.shown.set(y.id,{...d,appearance:f})}record(o,d,y,{result:f,details:m={}}){let{displayId:P}=m,g=JSON.stringify([o.sessionUuid??null,o.deviceId]),T=this.scopes.get(g),A=d!=="show"&&y.id!==void 0?T?.shown.get(y.id)?.displayId:void 0,C=this.createResult(d,y,f,{displayId:P??A,chrome:m.chrome}),O=this.consumeShowDispatch(o.deviceId,C);if(!T&&!f.success)return structuredClone(C);let I=T??{...o,shown:new Map,lastResult:C};return I.lastResult=C,this.updatePresence(I,{...O,...No(d,f,m.data)},m.replaceOthers),this.remember(g,I),structuredClone(C)}applyDeviceDataWrite(o,d){let y=Qz(d);if(!y)return;this.shownSpecs.recordDeviceDataWrite(o,d.id,y);for(let f of this.scopes.values()){let m=f.deviceId===o?f.shown.get(d.id):void 0;if(!m)continue;let P=y.op==="remove"?bP(m.data,{op:"remove",path:y.path}):y.value===void 0?void 0:y.op==="extend"||y.op==="prepend"?bP(m.data,{...y,value:y.value}):bP(m.data,{...y,value:y.value}),g={...m,...Fo(m,y.revision)};if(P?.success)g.data=P.data;else delete g.data;f.shown.set(d.id,g)}}recordPatch(o,d,y){let{data:f,revision:m}=y;for(let P of this.scopes.values()){let g=P.deviceId===o?P.shown.get(d):void 0;if(g){let T={...g,lastAction:"patch",...Fo(g,m)};if(Object.hasOwn(y,"data"))Zn(T,f);P.shown.set(d,T)}}}forgetStorage(o,d){for(let y of this.scopes.values()){if(y.deviceId!==o)continue;let f=y.shown.get(d);if(f?.storage)y.shown.set(d,{...f,storage:void 0});if(y.lastResult?.id===d&&y.lastResult.storage)y.lastResult={...y.lastResult,storage:void 0}}}consumeShowDispatch(o,d){if(d.lastAction!=="show"||!d.success||!d.id)return d;let y=this.showDispatches.get(o),f=y?.get(d.id);if(y?.delete(d.id),y?.size===0)this.showDispatches.delete(o);if(!f)return d;let m={...d};return delete m.appearance,m}remember(o,d){this.scopes.delete(o),this.scopes.set(o,d);for(let y of this.scopes.keys()){if(this.scopes.size<=this.maxScopes)break;this.scopes.delete(y)}}updatePresence(o,d,y){if(d.lastAction==="show"&&d.success&&d.id)this.showPresence(o,d,y);else if(d.lastAction==="dismiss"&&d.success){if(this.shownSpecs.forget(o.deviceId,d.all?void 0:d.id),d.all)this.clearShown(o.deviceId);else if(d.id)this.clearShown(o.deviceId,d.id)}}showPresence(o,d,y){if(!d.id)return;let f=o.pendingSnapshots?.get(d.id);if(this.clearShown(o.deviceId,y===!1?d.id:void 0),o.snapshots??=new Map,f)o.snapshots.set(d.id,f);o.shown.set(d.id,d)}clearDevice(o){this.shownSpecs.clearDevice(o),this.showDispatches.delete(o);for(let[d,y]of this.scopes)if(y.deviceId===o)this.scopes.delete(d)}clearSession(o){let d=new Set(Array.from(this.scopes.values()).filter((y)=>y.sessionUuid===o&&y.lastResult!==void 0).map((y)=>y.deviceId));for(let y of d)this.clearDevice(y);for(let[y,f]of this.scopes)if(f.sessionUuid===o)this.scopes.delete(y);return Array.from(d)}dismissed(o,d){this.shownSpecs.forget(o.deviceId,d),this.clearShown(o.deviceId,d)}patchedFields(o,d){for(let y of this.scopes.values()){let f=y.deviceId===o?y.shown.get(d):void 0;if(f?.lastAction==="patch"||f?.revision!==void 0)return{...f.lastAction==="patch"?{lastAction:"patch"}:{},...f.revision===void 0?{}:{revision:f.revision}}}return{}}shownIds(o){let d=new Set;for(let y of this.scopes.values())if(y.deviceId===o)for(let f of y.shown.keys())d.add(f);return Array.from(d)}createResult(o,d,y,{displayId:f,chrome:m}={}){return{...d,lastAction:o,...f===void 0?{}:{displayId:f},...o==="show"&&y.success&&m!==void 0?{chrome:m}:{},...t2(o,y),...pK(o,y),success:y.success,...y.error?{error:y.error}:{},...y.totalTimeMs===void 0?{}:{totalTimeMs:y.totalTimeMs},timestamp:this.clock.now()}}clearShown(o,d){for(let y of this.scopes.values()){if(y.deviceId!==o)continue;if(d===void 0)y.pendingSnapshots?.clear(),y.snapshots?.clear();else y.pendingSnapshots?.delete(d),y.snapshots?.delete(d);if(d===void 0)y.shown.clear();else y.shown.delete(d)}}}class bt{client;constructor(o){this.client=o}async show(o,d={}){return Zie(await this.client.requestShowPrototype(o,d.timeoutMs,void 0,{displayId:d.displayId,reset:d.reset,appearance:d.appearance,replaceOthers:d.replaceOthers,locale:o.strings?d.locale:void 0}))}patch(o,d){return this.client.requestPatchPrototype(o,d)}inspect(o){return this.client.requestInspectPrototypes(o)}save(o,d){return this.client.requestSavePrototype(o,d)}listSaved(o){return this.client.requestListSavedPrototypes(o)}pinSaved(o,d,y){return this.client.requestPinSavedPrototype(o,d,y)}deleteSaved(o,d){return this.client.requestDeleteSavedPrototype(o,d)}dismiss(o,d){return this.client.requestDismissPrototype(o,d)}advanceClock(o,d,y){if(!this.client.requestAdvancePrototypeClock)throw new t("Update the connected CtrlProxy to simulate prototype timers");return this.client.requestAdvancePrototypeClock(o,d,y)}clearStorage(o,d){if(!this.client.requestClearPrototypeStorage)throw new t(Fb("android"));return this.client.requestClearPrototypeStorage(o,d)}putAsset(o,d){return this.client.requestPutPrototypeAsset(o,d)}removeAsset(o,d){return this.client.requestRemovePrototypeAsset(o,d)}async status(){return{success:!1,error:"CtrlProxy has no prototype status request; use the host-local status action."}}onEvent(o){return this.client.onPrototypeEvent(o)}supportsCommand(o){return this.client.supportsCommand(o)}}import{Agent as ss,request as is}from"http";import{Agent as as,request as ps}from"https";import{isIP as ds}from"net";import{checkServerIdentity as cs}from"tls";import{createBrotliDecompress as us,createGunzip as ls,createInflate as ys}from"zlib";class se extends Error{}function fs(o){let d=o.headers["content-encoding"]?.toLowerCase(),y=d==="gzip"?ls():d==="deflate"?ys():d==="br"?us():void 0;if(!y)return o;return o.once("error",(f)=>y.destroy(f)),y.once("close",()=>o.destroy()),o.pipe(y)}function ms(o,d,y){let f=new Headers;for(let C=0;C<o.rawHeaders.length;C+=2)f.append(o.rawHeaders[C],o.rawHeaders[C+1]);let m=o.statusCode??502;if(d==="HEAD"||[204,205,304].includes(m))return o.destroy(),new Response(null,{status:m,headers:f});let P=fs(o);if(P!==o)f.delete("content-encoding"),f.delete("content-length");let g=P[Symbol.asyncIterator](),T=0,A=new ReadableStream({async pull(C){let{done:O,value:I}=await g.next();if(O)C.close();else if(I instanceof Uint8Array)if(T+=I.byteLength,T>y)P.destroy(),o.destroy(),C.error(new se);else C.enqueue(I);else C.error(Error("Unexpected response chunk type.")),P.destroy(),o.destroy()},async cancel(){o.destroy(),P.destroy(),await g.return?.()}});return new Response(A,{status:m,headers:f})}function hs(o=(f,m)=>(f.protocol==="https:"?ps:is)(f,m),d=process.env,y=process.versions.bun?"bun":"node"){return(f,m,P,g)=>{if(m.signal?.throwIfAborted(),y==="bun"&&(["HTTP_PROXY","http_proxy","HTTPS_PROXY","https_proxy","ALL_PROXY","all_proxy"].some((O)=>Boolean(d[O]))||Object.entries(d).some(([O,I])=>/^(http|https|all)_proxy$/i.test(O)&&Boolean(I))))return Promise.reject(Error("Pinned transport requires a direct connection."));let T=new URL(f),A=T.hostname.replace(/^\[|\]$/g,""),C=new Headers(m.headers);if(C.set("Host",T.host),!C.has("accept-encoding"))C.set("Accept-Encoding","gzip, deflate, br");return new Promise((O,I)=>{let _=T.protocol==="https:"?new as({proxyEnv:{}}):new ss({proxyEnv:{}}),x,F=()=>{m.signal?.removeEventListener("abort",D),_.destroy()},q=o({protocol:T.protocol,host:P.address,family:P.family,port:T.port||(T.protocol==="https:"?443:80),path:T.pathname+T.search,method:m.method,headers:Object.fromEntries(C),servername:ds(A)?void 0:A,checkServerIdentity:(M,Y)=>cs(A,Y),agent:_},(M)=>{if(x=M,M.once("close",F),M.statusCode===void 0||M.statusCode<200||M.statusCode>599){M.destroy(),I(Error("Invalid HTTP response status."));return}O(ms(M,m.method,g))}),D=()=>{let M=Error("Request cancelled.");F(),x?.destroy(M),q.destroy(M),I(M)};if(m.signal?.addEventListener("abort",D,{once:!0}),q.on("error",(M)=>{F(),I(M)}),q.on("upgrade",(M,Y)=>{Y.destroy(),F(),I(Error("Protocol upgrades are not supported."))}),m.signal?.aborted)D();else q.end(m.body)})}}var qe=hs();import{lookup as Ps}from"dns/promises";import{isIP as Rt}from"net";var fe=(o)=>Ps(o,{all:!0,verbatim:!0});async function he(o,d,y){if(o.username||o.password)return{code:"invalid_request",message:"URL credentials are not permitted."};let f=Hoe(o,d.policy);if(f!==void 0)return{code:"blocked_destination",message:f};let m=o.hostname.replace(/^\[|\]$/g,""),P=Rt(m),g=P?[{address:m,family:P}]:await l(()=>d.resolver(m),{timer:d.timer,signal:y,label:"Prototype destination resolution"});if(y.throwIfAborted(),g.length===0)return{code:"network",message:"The destination did not resolve to an address."};if(g.some(({address:T,family:A})=>!Rt(T)||Rt(T)!==A||!d.policy.permitsAddress(T,rJ(o))))return{code:"blocked_destination",message:"The destination is not permitted."};return g[0]}var gs=new Set([301,302,303,307,308]),vs=5,$o=new Set(["GET","HEAD"]),ws=new Set(["content-type","content-encoding","content-language","content-location"]);function At(o){if(Array.isArray(o))return`[${o.map(At).join(",")}]`;if(typeof o==="object"&&o!==null)return`{${Object.keys(o).sort().map((y)=>`${JSON.stringify(y)}:${At(o[y])}`).join(",")}}`;return JSON.stringify(o)}function Ss(o,d){return Object.keys(o).some((y)=>y.toLowerCase()===d)}function bs(o){let d=o,y=d?.code??d?.cause?.code;return y==="ECONNREFUSED"||y==="ConnectionRefused"}var Et=Symbol("too_large"),Vo=Symbol("literal_null");function Ct(o){if(typeof o==="number")return!Number.isFinite(o);if(Array.isArray(o))return o.some(Ct);return typeof o==="object"&&o!==null&&Object.values(o).some(Ct)}function Rs(o){if(o.length===0)return null;try{let d=JSON.parse(o);if(Ct(d))return o;return d===null?Vo:d}catch(d){return e.debug("[PrototypeHttpExecutor] body is not JSON."),o}}var ks=/^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/,Es=/[\0\r\n]/;function Ot(o){if(oK(o)!==void 0)return"A request header is not permitted.";for(let[d,y]of Object.entries(o??{})){if(!ks.test(d))return"Header name is not an HTTP token.";if(Es.test(y))return"A header value contains a CR, LF or NUL character."}return}function Ho(o){let d=Ts(o.url);if(d!==void 0)return{code:"invalid_url",message:d};let y=Ot(o.headers);return y===void 0?void 0:{code:"invalid_request",message:y}}function Ts(o){try{let d=new URL(o);return d.protocol==="http:"||d.protocol==="https:"?void 0:`Only http and https URLs are supported, got ${d.protocol}`}catch(d){return e.debug("[PrototypeHttpExecutor] URL parse failed."),"Not an absolute HTTP URL."}}function As(o,d,y,f){let m={...o,headers:y.origin===f.origin?o.headers:void 0};if(!((d===301||d===302)&&o.method==="POST"||d===303&&!$o.has(o.method)))return m;let g=m.headers===void 0?void 0:Object.fromEntries(Object.entries(m.headers).filter(([T])=>!ws.has(T.toLowerCase())));return{...m,method:"GET",body:void 0,headers:g}}function Cs(o,d){try{return new URL(o,d)}catch(y){e.debug("[PrototypeHttpExecutor] redirect URL parse failed.");return}}function Tt(o,d,y){return{ok:!1,error:{code:o,message:d},durationMs:y}}function Is(o,d){let y=new Uint8Array(d),f=0;for(let m of o)y.set(m,f),f+=m.byteLength;return y}class _t{options;fetchImpl;maxBytes;policy;resolver;constructor(o){this.options=o;this.fetchImpl=o.fetch??qe,this.maxBytes=o.maxResponseBytes??de,this.policy=o.policy??new uE(TE),this.resolver=o.resolver??fe}async execute(o,d){let{timer:y}=this.options,f=y.now(),m=(I,_)=>({ok:!1,error:{code:I,message:_},durationMs:y.now()-f}),P=Ho(o);if(P!==void 0)return m(P.code,P.message);if(d.aborted)return m("cancelled","Request was cancelled before it started.");let g=Math.min(o.timeoutMs??te,xe),T=new AbortController,A=!1,C=y.setTimeout(()=>{A=!0,T.abort()},g),O=AbortSignal.any([d,T.signal]);try{let I=await this.fetchResponse(o,O,f);if(!("response"in I))return I;return await this.outcomeOf(I.response,I.method,O,f)}catch(I){let _=bs(I);if(e.warn("[PrototypeHttpExecutor] request could not complete.",{connectionRefused:_,aborted:O.aborted,timedOut:A}),O.aborted)return A?m("timeout",`Request timed out after ${g}ms.`):m("cancelled","Request was cancelled.");if(_)return m("connection_refused","Connection refused.");if(I instanceof se)return m("too_large",`Response body exceeds ${this.maxBytes} bytes.`);return m("network","The request could not complete.")}finally{y.clearTimeout(C)}}async fetchResponse(o,d,y){let f=o,m=new URL(f.url),P=(g,T)=>Tt(g,T,this.options.timer.now()-y);for(let g=0;;g++){d.throwIfAborted();let T=Ho({...f,url:m.href});if(T!==void 0)return P(T.code,T.message);let A=await this.pinDestination(m,d);if("code"in A)return P(A.code,A.message);d.throwIfAborted();let C=await this.fetchImpl(m.href,this.requestInit(f,d),A,this.maxBytes);if(!gs.has(C.status))return{response:C,method:f.method};if(await C.body?.cancel(),g===vs)return P("network","Too many redirects.");let O=C.headers.get("location");if(!O)return P("invalid_response","Redirect response has no Location header.");let I=Cs(O,m);if(I===void 0)return P("invalid_response","Redirect Location is not a valid URL.");if(m.protocol==="https:"&&I.protocol==="http:")return P("blocked_destination","The destination is not permitted: scheme downgrade.");f=As(f,C.status,m,I),m=I}}pinDestination(o,d){return he(o,{policy:this.policy,resolver:this.resolver,timer:this.options.timer},d)}async outcomeOf(o,d,y,f){let m=()=>this.options.timer.now()-f,P=Object.fromEntries(o.headers.entries());if(o.status<200||o.status>299)return await o.body?.cancel(),{ok:!0,status:o.status,headers:P,body:null,durationMs:m()};let g=await this.readBody(o,d,y);if(g===Et)return Tt("too_large",`Response body exceeds ${this.maxBytes} bytes.`,m());if(g===Vo)return Tt("invalid_response","A response body of JSON null cannot be stored in /data.",m());return{ok:!0,status:o.status,headers:P,body:g,durationMs:m()}}requestInit(o,d){let y={...o.headers},f;if(o.body!==void 0&&!$o.has(o.method)){if(typeof o.body==="string")f=o.body;else if(f=At(o.body),!Ss(y,"content-type"))y["Content-Type"]="application/json"}return{method:o.method,headers:y,body:f,signal:d,redirect:"manual"}}async readBody(o,d,y){let f=Number(o.headers.get("content-length"));if(Number.isFinite(f)&&f>this.maxBytes)return await o.body?.cancel(),Et;if(d==="HEAD"||o.body===null)return null;let m=o.body.getReader(),P=[],g=0;for(;;){y.throwIfAborted();let{done:T,value:A}=await l(()=>m.read(),{timer:this.options.timer,signal:y,label:"Prototype response body"});if(T)break;if(g+=A.byteLength,g>this.maxBytes)return await m.cancel(),Et;P.push(A)}return Rs(new TextDecoder().decode(Is(P,g)))}}function Os(o){if(typeof o!=="string")return o;try{return JSON.parse(o)}catch(d){return e.debug("[PrototypeMock] request body is not JSON."),o}}var Uo=Symbol("mock request timed out");class Mt{inner;registry;timer;constructor(o,d,y){this.inner=o;this.registry=d;this.timer=y}async execute(o,d){let y=Oe(o.url);if(y===void 0)return this.inner.execute(o,d);let f=this.timer.now(),m=()=>this.timer.now()-f,P=this.registry.get(y.backendId);if(P===void 0)return{ok:!1,error:{code:"network",message:`No mock backend "${y.backendId}" is defined.`},durationMs:m()};if(d.aborted)return{ok:!1,error:{code:"cancelled",message:"Request was cancelled before it started."},durationMs:m()};let g=Math.min(o.timeoutMs??te,xe),T=new AbortController,A=AbortSignal.any([d,T.signal]),C;try{C=await l(()=>P.answer({method:o.method,path:y.path,query:y.query,body:Os(o.body)},A),{timer:this.timer,timeoutMs:g,signal:d,label:"Mock request",timeoutError:()=>Uo,onTimeout:()=>T.abort()})}catch(O){return this.failure(O,d,g,m())}if(Buffer.byteLength(JSON.stringify(C.body))>de)return{ok:!1,error:{code:"too_large",message:`Response body exceeds ${de} bytes.`},durationMs:m()};return{ok:!0,status:C.status,headers:C.headers,body:o.method==="HEAD"?null:C.body,durationMs:m()}}failure(o,d,y,f){if(o instanceof De)return{ok:!1,error:{code:"too_large",message:o.message},durationMs:f};if(o===Uo)return{ok:!1,error:{code:"timeout",message:`Request timed out after ${y}ms.`},durationMs:f};if(d.aborted)return{ok:!1,error:{code:"cancelled",message:"Request was cancelled."},durationMs:f};return e.warn(`[PrototypeMock] backend failed: ${r(o)}`,o),{ok:!1,error:{code:"network",message:"The mock backend failed."},durationMs:f}}}class xt{executor;maxInFlight;inFlight=new Set;constructor(o,d=ko){this.executor=o;this.maxInFlight=d}inFlightCount(o){return[...this.inFlight].filter((d)=>o===void 0||d.deviceId===o).length}async run(o,d){if(this.inFlightCount(o.deviceId)>=this.maxInFlight)return{ok:!1,error:{code:"too_many_in_flight",message:`At most ${this.maxInFlight} requests may be in flight per device.`},durationMs:0};let y={...o,controller:new AbortController};this.inFlight.add(y);try{return await this.executor.execute(d,y.controller.signal)}finally{this.inFlight.delete(y)}}cancelPrototype(o,d){this.cancelWhere((y)=>y.deviceId===o&&y.prototypeId===d)}cancelDevice(o){this.cancelWhere((d)=>d.deviceId===o)}cancelRequest(o,d){let y=(m)=>m.connection===o&&m.requestId===d,f=[...this.inFlight].some(y);return this.cancelWhere(y),f}cancelConnection(o){this.cancelWhere((d)=>d.connection===o)}cancelWhere(o){for(let d of[...this.inFlight].filter(o))e.debug(`[PrototypeRequest] cancelling ${d.deviceId}/${d.prototypeId}`),this.inFlight.delete(d),d.controller.abort()}}function Bo(o,d){return new xt(new Mt(new _t({timer:o}),d,o))}function Wo(o,d,y){if(y!==void 0)o.attachRequestHost?.(RY(d,y))}function Yo(o,d,y){if(y!==void 0)o.attachPrototypeRequestHost?.(RY(d,y))}var Ms=/^(sec-websocket-|last-event-id$)/i,jo={websocket:["ws:","wss:"],sse:["http:","https:"]};function Pe(o){let d;try{d=new URL(o.url)}catch(f){return e.debug("[PrototypeChannel] URL parse failed."),{code:"invalid_url",message:"Not an absolute URL."}}if(!jo[o.kind].includes(d.protocol))return{code:"invalid_url",message:`A ${o.kind} channel needs a ${jo[o.kind].join(" or ")} URL, got ${d.protocol}`};let y=Ot(o.headers);if(y!==void 0)return{code:"invalid_request",message:y};if(Object.keys(o.headers??{}).some((f)=>Ms.test(f)))return{code:"invalid_request",message:"A request header is not permitted."};return}class Dt{webSocket;sse;constructor(o,d){this.webSocket=o;this.sse=d}open(o,d,y){return(o.kind==="websocket"?this.webSocket:this.sse).open(o,d,y)}}function ge(o){let d=!1;return{isClosed:()=>d,silence:()=>{d=!0},sink:{opened:(y)=>{if(!d)o.opened(y)},frame:(y)=>{if(!d)o.frame(y)},closed:(y)=>{if(!d)d=!0,o.closed(y)}}}}var Fe={send:()=>({ok:!1,reason:"not_open"}),close:()=>{}};class Lt{inner;registry;constructor(o,d){this.inner=o;this.registry=d}open(o,d,y){if(y.aborted)return Fe;let f=xs(o.url);if(f===void 0)return this.inner.open(o,d,y);let m=Pe(o);if(m!==void 0)return d.closed({error:m}),Fe;let P=this.registry.get(f.backendId);if(P===void 0)return d.closed({error:{code:"network",message:`No mock backend "${f.backendId}" is defined.`}}),Fe;return Ds({backend:P,request:o,target:f},d,y)}}function xs(o){let d=URL.canParse(o)?new URL(o):void 0;if(d?.protocol==="ws:"||d?.protocol==="wss:")d.protocol=d.protocol==="ws:"?"http:":"https:";return Oe(d?.href??o)}function Ds({backend:o,request:d,target:y},f,m){let{sink:P,silence:g}=ge(f),T=[],A=o.join(y.path,y.query,{deliver:(I)=>T===void 0?P.frame({data:I}):T.push(I),close:(I,_)=>P.closed(d.kind==="websocket"?{code:I,reason:_}:{})});if(!A.ok)return P.closed({error:{code:"handshake_failed",message:A.message,status:A.status}}),Fe;let{connection:C}=A;P.opened(d.kind==="websocket"?d.protocols?.[0]:void 0);let O=T;return T=void 0,O.forEach((I)=>P.frame({data:I})),m.addEventListener("abort",()=>{C.leave(),g()},{once:!0}),{send:(I)=>{if(d.kind!=="websocket")return{ok:!1,reason:"unsupported"};if(Buffer.byteLength(I)>DO)return{ok:!1,reason:"too_large"};return C.send(I)},close:(I,_)=>{C.leave(),P.closed({code:I??1000,..._===void 0?{}:{reason:_}})}}}class qt{executor;maxOpen;open_=new Set;constructor(o,d=bse){this.executor=o;this.maxOpen=d}openCount(o){return[...this.open_].filter((d)=>o===void 0||d.deviceId===o).length}open(o,d,y){if(this.find(o.connection,o.connectionId)!==void 0)return{ok:!1,error:{code:"invalid_request",message:"That connection id is already open."}};if(this.openCount(o.deviceId)>=this.maxOpen)return{ok:!1,error:{code:"too_many_in_flight",message:`At most ${this.maxOpen} channels may be open per device.`}};let f=new AbortController,m={...o,controller:f};return this.open_.add(m),m.handle=this.executor.open(d,{opened:(P)=>y.opened(P),frame:(P)=>y.frame(P),closed:(P)=>{this.open_.delete(m),y.closed(P)}},f.signal),{ok:!0}}send(o,d,y){return this.find(o,d)?.handle.send(y)}close(o,d,y,f){let m=this.find(o,d);return m?.handle.close(y,f),m!==void 0}cancelPrototype(o,d){this.cancelWhere((y)=>y.deviceId===o&&y.prototypeId===d)}cancelDevice(o){this.cancelWhere((d)=>d.deviceId===o)}cancelConnection(o){this.cancelWhere((d)=>d.connection===o)}find(o,d){return[...this.open_].find((y)=>y.connection===o&&y.connectionId===d)}cancelWhere(o){for(let d of[...this.open_].filter(o))e.debug(`[PrototypeChannel] cancelling ${d.deviceId}/${d.prototypeId}`),this.open_.delete(d),d.controller.abort()}}class Ft{handlers;buffer="";pendingCr=!1;atStart=!0;eventName="";dataLines=[];hasData=!1;lastEventId="";constructor(o){this.handlers=o}get pendingChars(){let o=this.dataLines.reduce((d,y)=>d+y.length,0);return this.buffer.length+o+Math.max(0,this.dataLines.length-1)+this.eventName.length+this.lastEventId.length}seedLastEventId(o){this.lastEventId=o}push(o){let d=o;if(this.atStart&&d.length>0)this.atStart=!1,d=d.startsWith("\uFEFF")?d.slice(1):d;for(let y of d){if(this.pendingCr){if(this.pendingCr=!1,y===`
5
- `)continue}if(y==="\r")this.pendingCr=!0,this.endLine();else if(y===`
6
- `)this.endLine();else this.buffer+=y}}endLine(){let o=this.buffer;if(this.buffer="",o===""){this.dispatch();return}if(o.startsWith(":"))return;let d=o.indexOf(":"),y=d===-1?o:o.slice(0,d),f=d===-1?"":o.slice(d+1);if(f.startsWith(" "))f=f.slice(1);this.applyField(y,f)}applyField(o,d){if(o==="event")this.eventName=d;else if(o==="data")this.dataLines.push(d),this.hasData=!0;else if(o==="id"){if(!d.includes("\x00"))this.lastEventId=d}else if(o==="retry"&&/^[0-9]+$/.test(d))this.handlers.onRetry?.(Number(d))}dispatch(){let o=this.eventName,d=this.hasData,y=this.dataLines.join(`
7
- `);if(this.eventName="",this.dataLines=[],this.hasData=!1,!d)return;this.handlers.onEvent({...o===""?{}:{event:o},data:y,...this.lastEventId===""?{}:{id:this.lastEventId}})}}var Ls=new Set([301,302,303,307,308]),qs=5,Fs=Number.MAX_SAFE_INTEGER,Ns=6;class Nt{options;pinning;fetchImpl;constructor(o){this.options=o;this.fetchImpl=o.fetch??qe,this.pinning={policy:o.policy??new uE(TE),resolver:o.resolver??fe,timer:o.timer}}open(o,d,y){let f=ge(d),m=new AbortController,P=AbortSignal.any([y,m.signal]);return y.addEventListener("abort",()=>f.silence(),{once:!0}),this.run(o,f.sink,P,m),{send:()=>({ok:!1,reason:"unsupported"}),close:(g,T)=>{f.sink.closed({...g===void 0?{}:{code:g},...T===void 0?{}:{reason:T}}),m.abort()}}}async run(o,d,y,f){let m=Pe(o);if(m!==void 0){d.closed({error:m});return}let P=!1,g=this.options.timer.setTimeout(()=>{P=!0,f.abort()},te);try{let T=await this.connect(o,y);if(this.options.timer.clearTimeout(g),"code"in T){d.closed({error:T});return}d.opened(),await this.pump(T,o,d,y),d.closed({})}catch(T){if(this.options.timer.clearTimeout(g),y.aborted&&!P)return;d.closed({error:this.failureOf(T,P)})}}failureOf(o,d){if(d)return{code:"timeout",message:"The event stream handshake timed out."};if(o instanceof se)return{code:"too_large",message:`An event exceeded ${Nl} bytes.`};e.warn(`[PrototypeChannel] event stream failed: ${r(o)}`);let y=o;return(y?.code??y?.cause?.code)==="ECONNREFUSED"?{code:"connection_refused",message:"Connection refused."}:{code:"network",message:"The event stream failed."}}async connect(o,d){let y=new URL(o.url),f=this.requestHeaders(o,o.headers);for(let m=0;;m++){d.throwIfAborted();let P=await he(y,this.pinning,d);if("code"in P)return P;let g=await this.fetchImpl(y.href,{method:"GET",headers:f,signal:d,redirect:"manual"},P,Fs);if(!Ls.has(g.status))return this.acceptStream(g);await g.body?.cancel();let T=Hs(g,y);if(m===qs||T===void 0)return{code:"network",message:"Too many redirects or an invalid redirect."};if(y.protocol==="https:"&&T.protocol==="http:")return{code:"blocked_destination",message:"The destination is not permitted: scheme downgrade."};if(y.origin!==T.origin)f=this.requestHeaders(o,void 0);y=T}}requestHeaders(o,d){return{...d,Accept:"text/event-stream","Cache-Control":"no-cache",...o.lastEventId===void 0?{}:{"Last-Event-ID":o.lastEventId}}}async acceptStream(o){let d=o.headers.get("content-type")??"";if(o.status===200&&d.toLowerCase().startsWith("text/event-stream"))return o;return await o.body?.cancel(),{code:"handshake_failed",message:o.status===200?"The server did not answer with text/event-stream.":`The server answered the event stream with HTTP ${o.status}.`,status:o.status}}async pump(o,d,y,f){if(o.body===null)return;let m=new Ft({onEvent:(A)=>{if(Buffer.byteLength(A.data)+Buffer.byteLength(A.event??"")+Buffer.byteLength(A.id??"")>Nl)throw new se;y.frame(A)}});if(d.lastEventId!==void 0)m.seedLastEventId(d.lastEventId);let P=new TextDecoder,g=o.body.getReader(),T=()=>void g.cancel().catch(()=>{return});f.addEventListener("abort",T,{once:!0});try{for(;;){f.throwIfAborted();let{done:A,value:C}=await g.read();if(A)return;if(m.push(P.decode(C,{stream:!0})),m.pendingChars>Nl+Ns)throw new se}}finally{f.removeEventListener("abort",T),await g.cancel().catch((A)=>{e.debug(`[PrototypeChannel] event stream cancel failed: ${r(A)}`)})}}}function Hs(o,d){let y=o.headers.get("location");if(!y)return;try{return new URL(y,d)}catch(f){e.debug("[PrototypeChannel] redirect URL parse failed.");return}}import $s from"ws";var Vs=25000,Us=1000,Bs=1001,zo=(o,d)=>{let y=new $s(o.url,o.protocols,{headers:o.headers,followRedirects:!1,handshakeTimeout:o.handshakeTimeoutMs,maxPayload:o.maxPayload,lookup:(f,m,P)=>{let g={address:o.pinned.address,family:o.pinned.family};if(m.all)P(null,[g]);else P(null,g.address,g.family)}});return y.on("open",()=>d.open(y.protocol)),y.on("message",(f,m)=>{if(!m)d.message(f.toString())}),y.on("pong",()=>d.pong()),y.on("close",(f,m)=>d.close(f,m.toString())),y.on("unexpected-response",(f,m)=>{m.resume(),d.unexpectedResponse(m.statusCode??0)}),y.on("error",(f)=>{if(f.code==="WS_ERR_UNSUPPORTED_MESSAGE_LENGTH")d.tooLarge();else d.error(f)}),y};class Ht{request;guarded;signal;socket;isOpen=!1;awaitingPong=!1;handshakeTimer;deadline=new AbortController;pingTimer;sink;timer;socketFactory;pinning;constructor(o,d,y,{timer:f,socketFactory:m,pinning:P}){this.request=o;this.guarded=d;this.signal=y;this.timer=f,this.socketFactory=m,this.pinning=P,this.sink=d.sink,y.addEventListener("abort",()=>this.abort(),{once:!0})}async start(){let o=Pe(this.request);if(o!==void 0){this.fail(o);return}this.handshakeTimer=this.timer.setTimeout(()=>{this.deadline.abort(),this.fail({code:"timeout",message:"The WebSocket handshake timed out."})},te);try{let d=await he(new URL(this.request.url),this.pinning,AbortSignal.any([this.signal,this.deadline.signal]));if(this.signal.aborted||this.guarded.isClosed())return;if("code"in d){this.fail(d);return}this.connect(d)}catch(d){if(!this.signal.aborted&&!this.deadline.signal.aborted)e.warn(`[PrototypeChannel] websocket could not start: ${r(d)}`,d),this.fail({code:"network",message:"The connection could not be started."})}}send(o){if(!this.isOpen||this.socket===void 0)return{ok:!1,reason:"not_open"};if(Buffer.byteLength(o)>DO)return{ok:!1,reason:"too_large"};return this.socket.send(o),{ok:!0}}close(o=Us,d){if(this.socket===void 0){this.deadline.abort(),this.cleanup(),this.sink.closed({code:o,...d===void 0?{}:{reason:d}});return}this.socket.close(o,d)}connect(o){this.socket=this.socketFactory({url:this.request.url,protocols:this.request.protocols??[],headers:this.request.headers??{},pinned:o,handshakeTimeoutMs:te,maxPayload:Nl},this.events())}events(){return{open:(o)=>{this.clearHandshakeTimer(),this.isOpen=!0,this.pingTimer=this.timer.setInterval(()=>this.ping(),Vs),this.sink.opened(o===""?void 0:o)},message:(o)=>{if(Buffer.byteLength(o)>Nl)this.tooLarge();else this.sink.frame({data:o})},pong:()=>{this.awaitingPong=!1},close:(o,d)=>{this.cleanup(),this.sink.closed({code:o,...d===""?{}:{reason:d}})},tooLarge:()=>this.tooLarge(),unexpectedResponse:(o)=>this.fail({code:"handshake_failed",message:`The server answered the WebSocket upgrade with HTTP ${o}.`,status:o}),error:(o)=>{e.warn("[PrototypeChannel] websocket error.",{name:o.name}),this.fail(o.code==="ECONNREFUSED"?{code:"connection_refused",message:"Connection refused."}:{code:"network",message:"The connection failed."})}}}ping(){if(this.awaitingPong){this.fail({code:"network",message:"The server stopped answering pings."});return}this.awaitingPong=!0,this.socket?.ping()}tooLarge(){this.fail({code:"too_large",message:`A frame exceeded ${Nl} bytes.`})}abort(){this.guarded.silence(),this.cleanup(),this.socket?.close(Bs,"Cancelled"),this.socket?.terminate()}fail(o){this.cleanup(),this.sink.closed({error:o}),this.socket?.terminate()}clearHandshakeTimer(){if(this.handshakeTimer!==void 0)this.timer.clearTimeout(this.handshakeTimer),this.handshakeTimer=void 0}cleanup(){if(this.clearHandshakeTimer(),this.pingTimer!==void 0)this.timer.clearInterval(this.pingTimer),this.pingTimer=void 0;this.isOpen=!1}}class $t{options;policy;resolver;socketFactory;constructor(o){this.options=o;this.policy=o.policy??new uE(TE),this.resolver=o.resolver??fe,this.socketFactory=o.socketFactory??zo}open(o,d,y){let f=new Ht(o,ge(d),y,{timer:this.options.timer,socketFactory:this.socketFactory,pinning:{policy:this.policy,resolver:this.resolver,timer:this.options.timer}});return f.start(),f}}function Go(o,d,y=new Dt(new $t({timer:o}),new Nt({timer:o}))){return new qt(new Lt(y,d))}function Ko(...o){return{cancelPrototype:(d,y)=>o.forEach((f)=>f.cancelPrototype(d,y)),cancelDevice:(d)=>o.forEach((y)=>y.cancelDevice(d))}}function Xo(o,d,y){if(y!==void 0)o.attachChannelHost?.(wY(d,y))}function Qo(o,d,y){if(y!==void 0)o.attachPrototypeChannelHost?.(wY(d,y))}import{mkdir as Ys,writeFile as js}from"fs/promises";import{dirname as Js}from"path";class Vt{outputDir(){return Qe("prototype-shares")}async write(o,d){await Ys(Js(o),{recursive:!0,mode:448}),await js(o,d,{mode:420})}}function ue(o){return{appLayer:o.window.layer==="app",devicePersistence:o.window.persistence==="device"}}function Zo(o){let d=[...o.appLayer?['window.layer "app"']:[],...o.devicePersistence?['window.persistence "device"']:[]].join(" and ");return`The connected CtrlProxy does not advertise ${dP}, so it would ignore ${d} and show a session-scoped system-layer prototype; update the connected CtrlProxy or omit ${d}.`}var zs=`shell appops set ${vt} SYSTEM_ALERT_WINDOW allow`;async function er(o,d){try{let y=await o.executeCommand(zs,{noRetry:!0,signal:d});if(We(y.stdout,y.stderr??""))e.warn(`[prototype] SYSTEM_ALERT_WINDOW appop grant reported a failure: ${`${y.stdout}
8
- ${y.stderr??""}`.trim()}`)}catch(y){if(d?.aborted)throw y;e.warn(`[prototype] SYSTEM_ALERT_WINDOW appop grant failed: ${r(y)}`,y)}}var Gs=new Set(["app","notifications"]);function He(o,d){if(d==="android")return;for(let y of Ed(o)){if(y.kind!=="call"||y.action.call!=="settings.open")continue;let f=c(c(y.action.args)?.page)?.value;if(typeof f==="string"&&!Gs.has(f))return{path:y.path,message:`settings.open page "${f}" is Android only; on iOS use "app" or "notifications"`}}return}var Ks=8000,Xs=1000;class Ut{deps;target;constructor(o){this.deps=o}async installed(o){let{userId:d}=await new It(this.deps.adb).resolve({currentUser:!0,signal:o}),y=await this.deps.adb.executeCommand(`shell pm list packages --user ${d}`,{noRetry:!0,signal:o}),f=t1((m)=>ji(y.stdout,m),this.deps.appIds);return this.target=f===void 0?void 0:{userId:d,appId:f},this.target!==void 0}async capabilities({timeoutMs:o,refresh:d,signal:y}){let f=await this.requireTarget(y);if(f.userId!==0)return;await this.ensureStorage(f,o,y);let m=await this.installedVersionCode(f,y),P=await this.readCapabilities(f,y),g=P!==void 0&&m!==void 0&&P.versionCode!==m;if(d||g)await this.prepare(f,o,y),P=await this.readCapabilities(f,y);if(P===void 0||m!==void 0&&P.versionCode!==m)return;return{...P.versionName?{version:P.versionName}:{},capabilities:new Set(P.capabilities),updateUrl:I8}}async installedVersionCode(o,d){let y=await IR(this.deps.adb,o.appId,{signal:d,optional:!0}),f=y?.buildNumber?Number(y.buildNumber):Number.NaN;return Number.isSafeInteger(f)?f:void 0}async readCapabilities(o,d){let y=b(k8(o.userId,o.appId)),f=(await this.shell(`if [ -f ${y} ]; then cat ${y}; fi`,d)).trim();if(f==="")return;let m;try{m=E8.safeParse(JSON.parse(f))}catch(P){e.warn(`[protoviewer] unreadable capabilities report: ${r(P)}`);return}if(!m.success){e.warn(`[protoviewer] capabilities report has an unexpected shape: ${m.error.message}`);return}return m.data}async importBundle(o,d,y,f){let m=await this.requireTarget(f),P=this.deps.timer.now(),g=this.requestId(),T=m.userId===0?_8(m.userId,m.appId,g):hG(m.appId,"inbox",g);if(m.userId===0)await this.ensureStorage(m,y,f);let A=await this.deps.tempFiles.write(o);try{let _=m.userId===0?T:gG(g),x=await this.push(A.path,_,f);if(We(x.stdout,x.stderr??""))throw new os(`Could not copy the prototype into ProtoViewer's inbox (${T}): ${Qs(x)}.`);if(m.userId!==0)await this.providerShell(T8(m.userId,T,_),f)}catch(_){if(m.userId!==0)await this.removeStagingQuietly(gG(g));throw _}finally{await A.dispose()}let C=[`--es ${r1} ${g}`];if(d!==void 0)C.push(`--es ${R8} ${b(d)}`);let O=Math.max(y-(this.deps.timer.now()-P),Math.min(y,Xs)),I=await this.work(m,g,b8,{extras:C,timeoutMs:O,signal:f,cleanup:[T]});if(I.status==="rejected"&&I.path===A8)throw new os(`ProtoViewer cannot read the prototype pushed into its inbox: ${I.reason}.`);return I}async open(o,d,y){let f=await this.requireTarget(y),m=this.requestId(),P=[`--es ${r1} ${m}`,`--es ${P8} ${b(o)}`];return await this.work(f,m,S8,{extras:P,timeoutMs:d,signal:y,cleanup:[]})}async requireTarget(o){if(this.target===void 0&&!await this.installed(o))throw new t("ProtoViewer is not installed for the current Android user.");return this.target}async push(o,d,y){try{return await this.deps.adb.execute(["push",o,d],{noRetry:!0,signal:y})}catch(f){if(y?.aborted)throw f;throw new os(`Could not copy the prototype into ProtoViewer's inbox (${d}): ${r(f)}.`,{cause:f})}}async ensureStorage(o,d,y){if(await this.storageReady(o,y))return;if(await this.removeShellOwnedFolders(o,y),await this.prepare(o,d,y),!await this.storageReady(o,y))throw new os("ProtoViewer reported its inbox ready, but the folders are not there.")}async prepare(o,d,y){let f=this.requestId();try{let m=await this.exchange(o,f,w8,{extras:[`--es ${r1} ${f}`],timeoutMs:Math.min(d,Ks),signal:y,cleanup:[]});if(m.status!=="prepared")throw new t(`ProtoViewer answered a prepare request with ${m.status}.`)}catch(m){if(y?.aborted||m instanceof rv)throw m;throw new os(`ProtoViewer could not prepare its inbox (${r(m)}).`,{cause:m})}}async storageReady(o,d){let y=b($E(o.userId,o.appId)),f=b(i1(o.userId,o.appId)),m=b(o1(o.userId,o.appId));return(await this.shell(`if [ -d ${f} ] && [ -d ${m} ] && [ ! -O ${y} ] && [ ! -O ${f} ] && [ ! -O ${m} ]; then echo ready; fi`,d)).includes("ready")}async removeShellOwnedFolders(o,d){let y=[$E(o.userId,o.appId),i1(o.userId,o.appId),o1(o.userId,o.appId)].map(b);await this.shell(`for d in ${y.join(" ")}; do if [ -O "$d" ]; then rm -rf "$d"; fi; done`,d)}async work(o,d,y,f){let m=await this.exchange(o,d,y,f);if(m.status==="prepared")throw new t("ProtoViewer answered a request with a prepare result; retry.");return m}requestId(){let o=`mcp-${this.deps.ids.next().replace(/[^A-Za-z0-9_-]/g,"")}`.slice(0,64);if(!SM.test(o))throw new t(`Generated an unusable ProtoViewer request id: ${o}`);return o}async exchange(o,d,y,{extras:f,...m}){let P=o.userId===0?x8(o.userId,o.appId,d):hG(o.appId,"results",d);try{let g=await this.shell(`am start -W --activity-multiple-task --user ${o.userId} -n ${v8(o.appId)} -a ${y} ${f.join(" ")}`,m.signal);Zs(g);let T=await Ce(()=>o.userId===0?this.shell(`if [ -f ${b(P)} ]; then cat ${b(P)}; fi`,m.signal):this.providerShell(n1("read",o.userId,P),m.signal),this.deps.timer,m.timeoutMs,{signal:m.signal});if(T.request!==d)throw new t(`ProtoViewer answered request ${T.request}, not ${d}; retry the call.`);return T}finally{await this.removeQuietly(o,[P,...m.cleanup])}}async removeQuietly(o,d){try{let y=o.userId===0?`rm -f ${d.map(b).join(" ")}`:d.map((f)=>n1("delete",o.userId,f)).join("; ");await this.shell(y,void 0,{timeoutMs:M0})}catch(y){e.warn(`[protoviewer] cleanup of ${d.join(", ")} failed: ${r(y)}`)}}async removeStagingQuietly(o){try{await this.shell(`rm -f ${b(o)}`,void 0,{timeoutMs:M0})}catch(d){e.warn(`[protoviewer] cleanup of ${o} failed: ${r(d)}`)}}async providerShell(o,d){try{let y=await this.shell(o,d);if(!y.trimStart().startsWith("{")&&We(y,""))throw new os(`Could not access ProtoViewer's MCP storage: ${y.trim()}.`);return y}catch(y){if(d?.aborted||y instanceof os)throw y;throw new os(`Could not access ProtoViewer's MCP storage: ${r(y)}.`,{cause:y})}}async shell(o,d,y={}){let f=await this.deps.adb.executeCommand(`shell ${o}`,{noRetry:!0,signal:d,...y});return`${f.stdout}${f.stderr?`
9
- ${f.stderr}`:""}`}}function Qs(o){return`${o.stdout}
10
- ${o.stderr??""}`.trim()}function Zs(o){if(/does not exist|Unable to resolve Intent/.test(o))throw new rv;if(/(^|\n)\s*Error( type \d+)?:|Exception|Permission Denial|Activity not started/.test(o))throw new t(`Could not start ProtoViewer: ${o.trim()}`)}import{mkdtemp as ti,rm as oi,writeFile as ri}from"fs/promises";import{tmpdir as ni}from"os";import{join as tr}from"path";class Bt{async write(o){let d=await ti(tr(ni(),"automobile-protoviewer-")),y=tr(d,"bundle.automobile-proto");return await ri(y,o,{mode:420}),{path:y,dispose:()=>oi(d,{recursive:!0,force:!0})}}}function or(o,d){let y=(A)=>d.releaseDevice(A),f=[o.subscribeSessionRelease((A,C)=>{if(d.releaseSession(A),C)y(C)}),o.subscribeDeviceRemoval(y)],m={},P,g=!1,T=()=>{if(g)return;let A=o.deviceUnboundSource?o.deviceUnboundSource():m;if(P!==void 0&&P.source===A)return;if(P?.unsubscribe(),P=void 0,A===void 0)return;let C=o.subscribeDeviceUnbound(y);if(C)P={source:A,unsubscribe:C}};return T(),{ensureSubscribed:T,unsubscribe:()=>{g=!0,P?.unsubscribe(),P=void 0;for(let A of f)A()}}}function rr(){let o=new Map;return{run(d,y){let f=(o.get(d)??Promise.resolve()).then(y),m=f.then(()=>{},()=>{});return o.set(d,m),m.then(()=>{if(o.get(d)===m)o.delete(d)}),f}}}var J=(o)=>({success:!1,error:o});function si(o,d){try{let y=CO(o,d,{stateTests:"skip"});if(!y.success)return J(`Invalid patch at ${y.error.path}: ${y.error.message}`);let f=Lp(y.spec);return f.success?{spec:y.spec,validated:f.data}:J(`Invalid patch result at spec.${f.error.path}: ${f.error.message}`)}catch(y){if(e.warn("[prototype] Patch application failed",y),!(y instanceof RangeError))throw y;return J("Invalid patch at ops: Patch is nested too deeply")}}async function ii(o,d){try{return await o.transport.patch({id:d.id,...d.baseRevision===void 0?{}:{baseRevision:d.baseRevision},ops:d.ops},d.timeoutMs)}catch(y){return e.warn("[prototype] Patch request failed",y),{success:!1,delivery:"indeterminate",error:u(y,"Prototype patch failed").message}}}async function ai(o,d,y,f){let m=o.store.shownSpecs.read(d,y.id);if(m.kind==="busy")return J(`Prototype ${y.id} was not patched: a show is in flight on this device. Patch after it returns.`);if(m.kind==="unknown")return J(`Prototype ${y.id} was not patched: this host is not tracking its spec on this device (it was not shown by this host, or a dismiss, a failed show or an overlapping show ended the tracking). Show it, then patch.`);let P=di(o,d,y,m.spec);if(!("spec"in P))return P;let g=He(P.spec,o.platform);if(g)return J(`Invalid patch result at spec.${g.path}: ${g.message}`);let T=await o.specRefusal?.(P.spec);if(T!==void 0)return J(T);f?.throwIfAborted();let A=await ii(o,y);return pi(o,d,y,{read:m,applied:P,result:A})}async function pi(o,d,y,f){let{read:m,applied:P,result:g}=f;if(g.delivery==="indeterminate")return o.store.shownSpecs.abandon(d),J(`${g.error??"Prototype patch failed"} The device may or may not have applied the patch: show the prototype again before the next patch.`);let T=bR(g);if(!g.success)return{success:!1,error:g.error??"The device refused the patch.",...T};let A=o.store.shownSpecs.commitPatch(d,y.id,m.version,{spec:P.spec,deviceRevision:T.revision,...o.mcpSessionId===void 0?{}:{mcpSessionId:o.mcpSessionId}});if(A)o.store.recordPatch(d,y.id,{data:P.validated.data,revision:T.revision});else if(!o.store.shownSpecs.showStartedSince(d,m.version))o.store.recordPatch(d,y.id,{revision:T.revision});o.retire(g);let C=ui(T.revision,A,y.id),O=gO(g.degradedEffects),I=[C.warning,O.warning,...uK(P.spec)].filter(Boolean).join(" ");return{...C,...O,...I?{warning:I}:{},...XU(P.spec),...ZU(P.spec)}}function di(o,d,y,f){let m=si(f,y.ops);return"spec"in m?ci(o,d,y)??m:m}function ci(o,d,y){let f=o.store.shownSpecs.dataPatchGuard(d,y.id,zoe(y.ops),y.baseRevision);if(f.kind==="baseRevisionRequired")return J("Invalid patch at baseRevision: required for /data ops once the device has written this prototype's data (setData, appendData, prependData, removeData); use the revision from the latest change event or patch result");return f.kind==="conflict"?{success:!1,error:`The patch was refused: the device wrote ${f.paths.join(", ")} after revision ${y.baseRevision}. Re-read the prototype's data and patch again from revision ${f.revision}.`,conflict:{revision:f.revision,state:{},data:f.paths}}:void 0}function ui(o,d,y){return{success:!0,...o===void 0?{}:{revision:o},...d?{}:{warning:`A show on this device overlapped this patch, so the host no longer tracks prototype ${y}'s spec: show it again before the next patch.`}}}async function nr(o,d,y,f){let m=await o.supportsPatch();if(f?.throwIfAborted(),!m)return J(new t(xD(o.platform)).message);if(y.baseRevision===void 0&&Woe(y.ops))return J("Invalid patch at baseRevision: required when a patch has /state ops");try{if(Buffer.byteLength(JSON.stringify({id:y.id,baseRevision:y.baseRevision,ops:y.ops}),"utf8")>wa)return J("Invalid patch at ops: Patch byte limit exceeded")}catch(P){if(e.warn("[prototype] Patch serialization failed",P),!(P instanceof RangeError))throw P;return J("Invalid patch at ops: Patch is nested too deeply")}return o.queue.run(d,()=>ai(o,d,y,f))}function sr(o){return o.map((d)=>`'${d}'`).join(", ")}function ir(o){let d=o.missing.filter((m)=>!o.supplied.has(m)),y=o.missing.filter((m)=>o.supplied.has(m)),f=[];if(d.length>0)f.push(`The device has no copy of prototype asset(s) ${sr(d)}, so those images show placeholders. Upload them with assets: [{id, path}] on a show.`);if(y.length>0){let m=o.repair?.kind==="retry-failed"?`the automatic re-upload did not complete: ${o.repair.reason}`:"they were re-uploaded and the prototype re-sent once, and the device still reports them missing";f.push(`Asset(s) ${sr(y)} were supplied on this call but the device reports them missing; ${m}. Repeat the call to try again.`)}return f.join(" ")}var ar=new WeakSet;function pr(o){return ar.add(o),o}function li(o){return ar.has(o)}function dr(o){if(o.action!=="show")return{};if(o.result.errorCode==="render_failed")return{refusal:"typed"};if(o.success&&o.id){let d=aJ(o.spec)?.keys.some((y)=>y.startsWith("data:"));return{shown:{id:o.id,spec:d?void 0:o.spec,replaceOthers:o.replaceOthers,...o.variant?{variant:o.variant}:{}}}}if(o.replaceOthers===!1&&!o.success)return{refusal:li(o.result)?"indeterminate":"typed"};return{}}async function yi(o,d,y){if(d.action==="show")return o.transport.show(d.spec,{timeoutMs:d.timeoutMs,displayId:y,reset:d.reset,...d.spec?.strings&&d.locale!==void 0?{locale:d.locale}:{},replaceOthers:d.replaceOthers,appearance:Qj(d.appearance)});let f=d.all?{all:!0}:{id:d.id};return o.transport.dismiss(f,d.timeoutMs)}async function $e(o,d,y,{signal:f,cached:m}={}){let P=ny(d.spec,y.env);if(P)return{uploaded:[],prepared:[],failure:{success:!1,error:P}};if(d.assets===void 0){let C=m?await yP(d.spec,m.serial,m.cache):void 0;return{uploaded:[],prepared:[],...C?{failure:{success:!1,error:C}}:{}}}let g=await BE(d.assets,y.assetFileReader,y.observationScreenshotReader,y.env);if("error"in g)return{uploaded:[],prepared:[],failure:{success:!1,error:g.error}};let T=m?await yP(d.spec,m.serial,m.cache,g.assets):dJ(d.spec,g.assets);if(T)return{uploaded:[],prepared:[],failure:{success:!1,error:T}};let A=await mG(Ke(o.transport),g.assets,{signal:f,action:d.action==="save"?"save":"show",env:y.env});return{uploaded:A.uploaded,prepared:g.assets,...A.success?{}:{failure:{success:!1,error:A.error}}}}async function cr(o,d,y){try{return await yi(o,d,y)}catch(f){return e.warn("[prototype] Request failed",f),pr({success:!1,error:u(f,"Prototype request failed").message})}}async function fi(o,d,y,f){try{return await mG(Ke(o.transport),d,{signal:y,action:"resend",env:f})}catch(m){return e.warn("[prototype] Asset re-upload failed after the show was sent",m),{success:!1,uploaded:[],error:y?.aborted?"the request was cancelled":r(m)}}}async function mi(o,d,y,{first:f,signal:m,displayId:P,env:g}){let T=new Set(f.missingAssets),A=y.prepared.filter((_)=>T.has(_.id));if(A.length===0)return;let C=(_)=>({result:f,repair:{kind:"retry-failed",reason:_}});if(m?.aborted)return C("the request was cancelled");let O=await fi(o,A,m,g);if(!O.success)return C(O.error??"upload failed");if(m?.aborted)return C("the request was cancelled before the prototype was re-sent");let I=await cr(o,d,P);return I.success?{result:I,repair:{kind:"still-missing"}}:C(I.error??"re-sending the prototype failed")}function hi(o){return{success:!1,error:`Prototype ${o.spec?.id??""} was not sent: a newer show of the same id on this device started first and is the one on screen.`}}function Pi(o,d){return o.success&&(o.missingAssets?.length??0)>0&&!d()}async function ur(o,d,y,f){let m=f.superseded??(()=>!1),{signal:P,displayId:g,beforeSend:T}=f;if(y.failure)return{result:y.failure};if(m())return{result:hi(d)};await T?.();let A=await cr(o,d,g);if(!Pi(A,m))return{result:A};let C=await mi(o,d,y,{first:A,signal:P,displayId:g,env:f.env}),O=C?.result??A;if(!O.missingAssets?.length)return{result:O};return{result:O,warning:ir({missing:O.missingAssets,supplied:new Set(y.prepared.map((I)=>I.id)),repair:C?.repair})}}import{createServer as gi}from"http";function vi(o){return{writeHead:(d,y)=>{o.writeHead(d,y),o.flushHeaders()},write:(d)=>{o.write(d)},end:(d)=>{o.end(d)},onClose:(d)=>{o.once("close",d)}}}function wi(o){return new Promise((d)=>{o.close(()=>d()),o.closeAllConnections()})}var lr={listen:(o,d)=>new Promise((y,f)=>{let m=gi((P,g)=>d({method:P.method??"GET",url:P.url??"/",host:P.headers.host},vi(g)));m.once("error",f),m.listen(o.port,o.host,()=>{m.off("error",f),m.on("error",(g)=>{e.warn(`[prototype] preview server socket error: ${r(g)}`,g)});let P=m.address();y({port:typeof P==="object"&&P!==null?P.port:o.port,close:()=>wi(m)})})})};import{createHash as bi}from"crypto";var Ri=/^\/p\/([^/]+)(\/page|\/events)?\/?$/;function ki(o){try{let d=decodeURIComponent(o);return d.length>0?d:void 0}catch(d){e.debug(`[prototype] preview path segment not decodable: ${r(d)}`);return}}function yr(o,d){let y=d.get("variant")||void 0,f=d.get("frame")||void 0;return{id:o,...y?{variant:y}:{},...f?{frame:f}:{}}}var Ei=/^\/p\/?$/;function Ti(o){let d=o.get("id"),y=o.get("view")??"shell";if(!d)return{kind:"notFound"};if(y==="events")return{kind:"events",id:d};return y==="shell"||y==="page"?{kind:y,...yr(d,o)}:{kind:"notFound"}}function fr(o){let d;try{d=new URL(o,"http://preview.invalid")}catch(m){return e.debug(`[prototype] preview request target not parseable: ${r(m)}`),{kind:"notFound"}}if(d.pathname==="/")return{kind:"index"};if(Ei.test(d.pathname))return Ti(d.searchParams);let y=Ri.exec(d.pathname),f=y?.[1]===void 0?void 0:ki(y[1]);if(f===void 0)return{kind:"notFound"};if(y?.[2]==="/events")return{kind:"events",id:f};return{kind:y?.[2]==="/page"?"page":"shell",...yr(f,d.searchParams)}}function Se(o,d="shell",y={}){if(o==="."||o==="..")return`/p?${new URLSearchParams({id:o,...d==="shell"?{}:{view:d},...y}).toString()}`;let f=new URLSearchParams(y).toString(),m=d==="shell"?"":`/${d}`;return`/p/${Ze(o)}${m}${f?`?${f}`:""}`}var mr=["(() => {",'const frame = document.querySelector("iframe[data-preview]");','const status = document.querySelector("[data-preview-status]");',"const events = new EventSource(document.body.dataset.events);","let generation;","let loaded = false;","const reload = () => {","if (!loaded) {","loaded = true;","frame.src = frame.dataset.page;","return;","}",'const picked = frame.contentDocument?.querySelector("[data-control=variant]")?.value;','const next = new URL(frame.getAttribute("src"), location.href);','if (picked) next.searchParams.set("variant", picked);','next.searchParams.set("generation", String(generation));',"frame.src = next.pathname + next.search;","};",'events.addEventListener("ready", (event) => {',"const seen = JSON.parse(event.data).generation;","const missed = !loaded || seen !== generation;","generation = seen;",'status.textContent = "Live";',"if (missed) reload();","});",'events.addEventListener("reload", (event) => {',"generation = JSON.parse(event.data).generation;","reload();","});","events.onerror = () => {",'status.textContent = "Reconnecting";',"if (!loaded) reload();","};","})();"].join(`
11
- `),Ai=bi("sha256").update(mr).digest("base64"),Wt={"cache-control":"no-store","x-content-type-options":"nosniff","referrer-policy":"no-referrer"},Ci=["default-src 'none'",`script-src 'sha256-${Ai}'`,"style-src 'unsafe-inline'","img-src data:","connect-src 'self'","frame-src 'self'","frame-ancestors 'none'"].join("; "),Ii="default-src 'none'; style-src 'unsafe-inline'; img-src data:; frame-ancestors 'self'",Oi="html,body{margin:0;height:100%;font:14px system-ui,-apple-system,Roboto,sans-serif}body{display:flex;flex-direction:column}header{display:flex;gap:12px;align-items:center;padding:6px 12px;border-bottom:1px solid #ccc}iframe{flex:1;border:0;width:100%}main{padding:16px}";function Yt(o,d,y={}){let f=`<head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><link rel="icon" href="data:,"><title>${lu(o)}</title><style>${Oi}</style></head>`,m=lu(w("body",{attrs:y},d));return`<!doctype html><html lang="en">${f}${m}</html>
12
- `}function Ve(o,d,y=Ii){return{status:o,headers:{...Wt,"content-type":"text/html; charset=utf-8","content-security-policy":y},body:d}}function be(o,d){return{status:o,headers:{...Wt,"content-type":"text/plain; charset=utf-8"},body:d}}function _i(o){let d=o.ids(),y=d.length===0?w("p",{},["No prototype shown yet. Show one and open its link here."]):w("ul",{},d.map((f)=>w("li",{},[w("a",{attrs:{href:Se(f)}},[f])])));return Ve(200,Yt("AutoMobile prototypes",[w("main",{},[w("h1",{},["Prototypes"]),y])]))}function Mi(o){let d={...o.variant?{variant:o.variant}:{},...o.frame?{frame:o.frame}:{}},y=w("header",{},[w("a",{attrs:{href:"/"}},["All prototypes"]),w("strong",{},[o.id]),w("span",{attrs:{"data-preview-status":""}},["Connecting"])]),f=w("iframe",{attrs:{"data-preview":"",title:o.id,"data-page":Se(o.id,"page",d)}}),P=Yt(`${o.id} preview`,[y,f],{"data-events":Se(o.id,"events")}).replace("</body>",`<script>${mr}</script></body>`);return Ve(200,P,Ci)}function xi(o){let d=`Prototype "${o}" has no web output yet. Show it and this page reloads.`;return Ve(404,Yt(o,[w("main",{},[w("p",{},[d])])]))}function Di(o,d){if(d.variant===void 0||o.related(d.id).includes(d.variant))return d;return{id:d.id,...d.frame?{frame:d.frame}:{}}}async function Li(o,d){if(!o.has(d.id))return xi(d.id);try{return Ve(200,await o.page(Di(o,d)),"frame-ancestors 'self'")}catch(y){if(y instanceof t)return be(400,y.message);return e.warn(`[prototype] preview page for ${d.id} failed: ${r(y)}`,y),be(500,"The prototype page could not be rendered; see the daemon log.")}}async function hr(o,d){switch(o.kind){case"index":return _i(d);case"shell":return Mi(o);case"page":return Li(d,o);case"notFound":return be(404,"Not found")}}var jt={method:()=>be(405,"Only GET is served"),host:()=>be(421,"This preview server answers its loopback address only")},Jt={...Wt,"content-type":"text/event-stream; charset=utf-8",connection:"keep-alive","x-accel-buffering":"no"};var qi=15000,Be="127.0.0.1",Fi="0.0.0.0";function Ni(o){return typeof o==="object"&&o!==null&&"code"in o&&o.code==="EADDRINUSE"}function Pr(o,d){return`event: ${o}
13
- data: ${JSON.stringify(d)}
14
-
15
- `}class zt{dependencies;running;streams=new Set;idleHandle;generation=0;stoppedReason;served=!1;queue=Promise.resolve();constructor(o){this.dependencies=o}serve(o){return this.serialized(()=>this.serveNow(o))}stop(o="stop"){return this.serialized(async()=>(await this.stopNow(o),this.info()??{running:!1}))}info(){let o=this.running;if(o===void 0){if(!this.served)return;return{running:!1,...this.stoppedReason?{stoppedReason:this.stoppedReason}:{}}}let d=o.listener.port;return{running:!0,url:`http://${Be}:${d}/`,host:o.host,port:d,remote:o.remote,idleTimeoutMs:o.idleTimeoutMs}}pageUrl(o){let d=this.running;return d&&`http://${Be}:${d.listener.port}${Se(o)}`}serialized(o){let d=this.queue.then(o,o);return this.queue=d.catch((y)=>{e.debug(`[prototype] preview server operation failed: ${r(y)}`)}),d}async serveNow(o){let d=o.remote===!0,y=o.port??0,f=o.idleTimeoutMs??YU,m=this.running,P=y===0||y===m?.requestedPort||y===m?.listener.port;if(m&&m.remote===d&&P)return m.idleTimeoutMs=f,this.touch(),this.info();await this.stopNow("stop");let g=d?Fi:Be,T=await this.bind(g,y);return this.generation+=1,this.served=!0,this.stoppedReason=void 0,this.running={listener:T,host:g,remote:d,requestedPort:y,idleTimeoutMs:f,unsubscribe:this.dependencies.source.onChange((A)=>this.changed(A)),keepalive:this.dependencies.timer.setInterval(()=>this.broadcastKeepalive(),qi)},this.touch(),this.info()}async bind(o,d){try{return await this.dependencies.http.listen({host:o,port:d},(y,f)=>this.handle(y,f))}catch(y){if(Ni(y))throw new t(`Port ${d} is already in use on ${o}: pass another port, or omit port for a free one.`);throw u(y,"Failed to start the prototype preview server")}}async stopNow(o){let d=this.running;if(d===void 0)return;this.running=void 0,this.stoppedReason=o,this.clearIdle(),d.unsubscribe(),this.dependencies.timer.clearInterval(d.keepalive),[...this.streams].forEach((y)=>y.response.end()),this.streams.clear(),await d.listener.close(),e.info(`[prototype] preview server on port ${d.listener.port} stopped (${o})`)}clearIdle(){if(this.idleHandle!==void 0)this.dependencies.timer.clearTimeout(this.idleHandle),this.idleHandle=void 0}touch(){this.clearIdle();let o=this.running;if(o===void 0||this.streams.size>0)return;this.idleHandle=this.dependencies.timer.setTimeout(()=>{this.idleHandle=void 0,this.stop("idle").catch((d)=>{e.warn(`[prototype] preview server idle stop failed: ${r(d)}`,d)})},o.idleTimeoutMs)}handle(o,d){let y=this.running;if(y===void 0){d.writeHead(503,{"content-type":"text/plain; charset=utf-8"}),d.end("The preview server is stopping");return}this.touch();let f=this.refusal(o,y);if(f){d.writeHead(f.status,f.headers),d.end(f.body);return}let m=fr(o.url);if(m.kind==="events"&&o.method==="HEAD"){d.writeHead(200,Jt),d.end();return}if(m.kind==="events"){this.openStream(m.id,d);return}this.respond(m,d)}refusal(o,d){if(o.method!=="GET"&&o.method!=="HEAD")return jt.method();let y=d.listener.port,f=[`${Be}:${y}`,`localhost:${y}`,`[::1]:${y}`],m=o.host?.toLowerCase();if(!d.remote&&m!==void 0&&!f.includes(m))return jt.host();return}async respond(o,d){try{let y=await hr(o,this.dependencies.source);d.writeHead(y.status,y.headers),d.end(y.body)}catch(y){e.warn(`[prototype] preview request failed: ${r(y)}`,y),d.writeHead(500,{"content-type":"text/plain; charset=utf-8"}),d.end("The preview request failed; see the daemon log.")}}openStream(o,d){let y={id:o,response:d,watched:new Set(this.related(o))};this.streams.add(y),this.clearIdle(),d.onClose(()=>{if(this.streams.delete(y))this.touch()}),d.writeHead(200,Jt),d.write(`retry: 1000
16
-
17
- ${Pr("ready",{generation:this.generation})}`)}related(o){try{return this.dependencies.source.related(o)}catch(d){return e.debug(`[prototype] preview related ids of ${o} unavailable: ${r(d)}`),[o]}}changed(o){this.generation+=1,this.touch();let d=Pr("reload",{id:o,generation:this.generation});this.streams.forEach((y)=>{let f=this.related(y.id),m=y.id===o||y.watched.has(o)||f.includes(o);if(m)y.response.write(d);y.watched=m?new Set(f):new Set([...y.watched,...f])})}broadcastKeepalive(){this.streams.forEach((o)=>o.response.write(`: keepalive
18
-
19
- `))}}function gr(o,d){let y=(f)=>o.ids().includes(f);return{ids:()=>o.ids(),has:y,related:(f)=>y(f)?Nf(o,f):[f],page:d,onChange:(f)=>o.onRevision((m)=>f(m.id))}}function Hi(o){return gr(o.revisions,async(d)=>(await JF(o.revisions,d,o.rendererVersion(),o.images)).html)}var Gt;function vr(){if(Gt===void 0){let o=Hi(AM()),d=new zt({source:o,http:lr,timer:i});LJ(d),Gt={server:d,source:o}}return Gt}async function wr(o,d){try{if(d.action==="stop")return{success:!0,previewServer:await o.server.stop()};let y=await o.server.serve({port:d.port,remote:d.remote,idleTimeoutMs:d.idleTimeoutMs}),f=d.id===void 0?void 0:o.server.pageUrl(d.id),m=d.id!==void 0&&!o.source.has(d.id);return{success:!0,previewServer:{...y,...f?{pageUrl:f}:{}},...m?{warning:`Prototype "${d.id}" has no web output yet; its page loads once it is shown.`}:{}}}catch(y){return e.warn(`Prototype ${d.action} failed`,y),{success:!1,error:u(y,`Prototype ${d.action} failed`).message}}}var Sr=new Set(W.stringFields),$i=new Set(W.stringOpaqueFields),br=0.4,Rr="~",Vi={a:"\xE1",b:"\u0180",c:"\xE7",d:"\u010F",e:"\xE9",f:"\u0192",g:"\u011F",h:"\u0125",i:"\xED",j:"\u0135",k:"\u0137",l:"\u013C",m:"\u0271",n:"\xF1",o:"\xF3",p:"\xFE",q:"\u01A3",r:"\u0155",s:"\u0161",t:"\u0165",u:"\xFA",v:"\u1E7D",w:"\u0175",x:"\u1E8B",y:"\xFD",z:"\u017E",A:"\xC1",B:"\u0181",C:"\xC7",D:"\u010E",E:"\xC9",F:"\u0191",G:"\u011E",H:"\u0124",I:"\xCD",J:"\u0134",K:"\u0136",L:"\u013B",M:"\u1E40",N:"\xD1",O:"\xD3",P:"\xDE",Q:"\u01EA",R:"\u0154",S:"\u0160",T:"\u0164",U:"\xDA",V:"\u1E7C",W:"\u0174",X:"\u1E8A",Y:"\xDD",Z:"\u017D"},Ui=/\{[^{}]*\}/g;function kr(o){let d=[...Foe(o),...[...o.matchAll(/\{t:[^{}]*(?:\{data:[^{}]*\}[^{}]*)?\}/g)].map((f)=>({start:f.index,end:f.index+f[0].length}))],y=[...o.matchAll(Ui)].map((f)=>({start:f.index,end:f.index+f[0].length})).filter((f)=>d.every((m)=>f.end<=m.start||f.start>=m.end));return[...d,...y].sort((f,m)=>f.start-m.start).reduce((f,m)=>{let P=f.at(-1);if(P&&m.start<P.end)P.end=Math.max(P.end,m.end);else f.push({...m});return f},[])}function Kt(o){let d=(m)=>[...m].map((P)=>Vi[P]??P).join(""),y=[],f=0;for(let{start:m,end:P}of kr(o))y.push(d(o.slice(f,m)),o.slice(m,P)),f=P;return y.join("")+d(o.slice(f))}function Xt(o){if(o.trim()===""||/^\{t:[^{}]*(?:\{data:[^{}]*\}[^{}]*)?\}$/.test(o))return o;let d=Rr.repeat(Math.ceil([...o].length*br));return`[${Kt(o)}${d}]`}var Bi=new Set(["mention","hashtag","url"]),Wi=new Set(["screens","components"]);function Yi(o,d){let y=kr(o);return aU(o,d).filter((f)=>y.every(({start:m,end:P})=>f.start<=m||f.start>=P)).map((f)=>{let m=y.find(({start:P,end:g})=>f.end>P&&f.end<g);return m?{...f,end:m.end,text:o.slice(f.start,m.end)}:f})}function Ji(o,d){if(o.trim()===""||/^\{t:[^{}]*(?:\{data:[^{}]*\}[^{}]*)?\}$/.test(o))return o;let y=Yi(o,d),f=y.flatMap((g,T)=>[Kt(o.slice(T===0?0:y[T-1].end,g.start)),g.text]),m=o.slice(y.at(-1)?.end??0),P=Rr.repeat(Math.ceil([...o].length*br));return`${f.join("")}${Kt(m)} ${P}`}function zi(o){let d=c(o.linkify)?.kinds;return Array.isArray(d)&&d.every((y)=>Bi.has(y))?d:void 0}function Gi(o,d,y,f){if($i.has(d))return[d,y];if(Wi.has(d)&&c(y)){let m=Object.entries(c(y)).map(([P,g])=>[P,Ye(g)]);return[d,Object.fromEntries(m)]}if((Sr.has(d)||Sr.has(`${f}.${d}`))&&typeof y==="string"){let m=d==="text"?zi(o):void 0;return[d,m?Ji(y,m):Xt(y)]}return[d,Ye(y,d)]}function Ye(o,d=""){if(Array.isArray(o))return o.map((f)=>Ye(f,d));let y=c(o);if(!y)return o;return Object.fromEntries(Object.entries(y).map(([f,m])=>Gi(y,f,m,d)))}function Er(o){let d=Ye(o),y=c(d),f=c(c(o)?.strings);if(y&&f)y.strings=Object.fromEntries(Object.entries(f).map(([m,P])=>[m,Object.fromEntries(Object.entries(c(P)??{}).map(([g,T])=>[g,typeof T==="string"?Xt(T):Object.fromEntries(Object.entries(c(T)??{}).map(([A,C])=>[A,typeof C==="string"?Xt(C):C]))]))]));return d}var Tr=3,Ki=250,Xi=1000;async function Qi(o,d,y,{signal:f,hiddenReason:m}={}){try{for(let P=0;P<Tr;P++){f?.throwIfAborted();let g=await o.capture({freshness:"fresh",displayId:y,timeoutMs:Xi,signal:f});if(f?.throwIfAborted(),ma(g.hierarchy))return;if(P<Tr-1){await d.sleep(Ki);continue}return Zi(g.hierarchy,m)}}catch(P){if(f?.aborted){e.debug("App-layer visibility confirmation cancelled; the dispatched show is retained");return}e.warn("Could not confirm Android app-layer prototype visibility",P);return}return}function Zi(o,d){if(!o.prototypeHiddenReason&&ea(o))return;let y=o.prototypeHiddenReason??d;if(y)return{visible:!1,notVisibleReason:y,warning:vY(y,o.packageName)};return ta(o)}function ea(o){return o.prototypeSuspended===!0||!o.windows?.length||o.ctrlProxyIncomplete===!0||o.hierarchy.error!==void 0}function ta(o){return{visible:!1,notVisibleReason:"no_prototype_window_on_screen",warning:`The prototype was shown with window.layer "app" but no prototype window is on screen. The app in front${o.packageName?` (${o.packageName})`:""} most likely hides app-layer windows drawn over it (system apps such as Settings do); a locked device hides it too. Until it is visible, layer "prototype" calls will report that no prototype is showing. Show it again without window.layer (the default layer draws over every app) or over a different app, or dismiss it.`}}async function Ar(o){if(!o.android||o.action!=="show"||!o.success||o.superseded())return{};if(o.hiddenReason==="device_blocked")return{visible:!1,notVisibleReason:"device_blocked",warning:vY("device_blocked")};if(!ue(o.spec).appLayer)return{};let d=await Qi(o.capture(),o.timer??i,o.displayId,{signal:o.signal,hiddenReason:o.hiddenReason});return o.superseded()?{}:d??{}}function Cr(o){return`The connected ${o==="android"?"CtrlProxy":"iOS prototype agent"} does not advertise prototype_dead_tap_v1, so it would ignore window.deadTaps and report no dead taps. Nothing was shown. ${o==="android"?"Update the connected CtrlProxy":"Update the iOS prototype agent by relaunching the app with launchApp prototype: true"}, or omit window.deadTaps.`}var Qt={prototype_platform_namespace_v1:17,prototype_icon_effects_v1:17,prototype_glass_v1:26,prototype_keyframes_v1:17,prototype_motion_tokens_v1:17,prototype_zoom_transition_v1:18};function Ir(o,d=Qt){let y=d[o];return y===void 0?"":` It needs iOS ${y} or later.`}function oa(o){return`The ${o==="ios"?"connected iOS prototype agent":"connected CtrlProxy"} does not advertise ${lP}, so it would ignore window.chrome "none" and keep the host dismiss bar. Nothing was shown. ${o==="ios"?"Relaunch the app with launchApp prototype: true to load the agent built for this AutoMobile version":"Update the connected CtrlProxy"}, or omit window.chrome (the bar is then kept and reported).`}function Or(o,{supported:d,platform:y}){let f=o.window.chrome,m=f===void 0?{}:{requested:f};if(o.window.placement.type!=="fullscreen")return{...m,...f===void 0?{}:{refusal:"window.chrome applies to a fullscreen placement only; omit it for a sheet or floating window. Nothing was shown."}};if(!d&&f==="none")return{...m,refusal:oa(y)};return{...m,effective:d?f??(o.window.persistence==="device"?"bar":"none"):"bar"}}async function ra(o,d,y,{dependencies:f,signal:m}){if(y.action!=="show"||y.display===void 0||!o.android)return;let P=await OE(d,y.display,{adb:(f.adbFactory??v).create(d),lastRenderedObservation:f.lastRenderedObservation});if(m?.throwIfAborted(),!P)return;let g=await o.android.supportsCommand(Ob);if(m?.throwIfAborted(),!g)throw new t(PY(P));return P}async function na(o,d,y){if(d.action!=="show"||d.spec===void 0)return;let f=_r(d)?await sa(o,d,y):void 0;if(f)return f;let m=ue(d.spec);if(!m.appLayer&&!m.devicePersistence)return;if(!o.android)return;let P=await o.android.supportsCommand(dP);if(y?.throwIfAborted(),!P)return{success:!1,error:new t(Zo(m)).message};return}function _r(o){return o.action==="show"&&o.spec?.window.deadTaps===!0}async function sa(o,d,y){if(!_r(d))return;let f=o.android?await o.android.supportsCommand(IO):o.ios?.supportsCapability(IO)===!0;return y?.throwIfAborted(),f?void 0:{success:!1,error:new t(Cr(o.android?"android":"ios")).message}}function Mr(o,d,y,{dependencies:f,signal:m}){if(y.action!=="show"||y.spec===void 0||!o.android)return;if(!ue(y.spec).appLayer)return;return async()=>{await er((f.adbFactory??v).create(d),m),m?.throwIfAborted()}}function ia(o,d,y){if(!o.android&&Za(d).length)return{success:!1,error:cJ};let f=ny(d,y);return f?{success:!1,error:f}:void 0}async function Zt(o,d,y,{iosMinimumOs:f=Qt,env:m}={}){let P=ia(o,d,m);if(P)return P;for(let g of fG(d,o.android?"android":"ios")){let T=o.android?await o.android.supportsCommand(g.capability):o.ios?.supportsCapability(g.capability)===!0;if(y?.throwIfAborted(),!T){let A=o.android?"android":"ios",C=A==="ios"?Ir(g.capability,f):"",O=g.unsupportedMessage(g.fields,A)+C;return{success:!1,error:new t(O).message}}}return}async function pa(o,d,y){let f=d.action==="show"?Qj(d.appearance):void 0;if(f===void 0)return;let m=o.android?await o.android.supportsCommand(uP):o.ios?.supportsCapability(uP)===!0;if(y?.throwIfAborted(),m)return;let P=e2(f,o.android?"android":"ios");return{success:!1,error:new t(P).message}}async function da(o,d,y){if(d.action!=="show"||d.replaceOthers!==!1)return;let f=o.android?await o.android.supportsCommand(Mb):!1;if(y?.throwIfAborted(),f)return;let m=o.android?AY():P9;return{success:!1,error:new t(m).message}}async function ca(o,d,y){if(d.action!=="show"||!d.spec)return{};let f=d.spec,P=f.window.placement.type==="fullscreen"?o.android?await o.android.supportsCommand(lP):o.ios?.supportsCapability(lP)===!0:!1;y?.throwIfAborted();let g=Or(f,{supported:P,platform:o.android?"android":"ios"});if(g.refusal)return{failure:{success:!1,error:new t(g.refusal).message}};return g.effective===void 0?{}:{chrome:g.effective}}var la=`The connected iOS prototype agent does not advertise ${Zg}, so it does not support reset: it would keep the pager pages instead of starting fresh. Nothing was shown. Relaunch the app with launchApp prototype: true to load the agent built for this AutoMobile version, or omit reset.`;function ya(o,d){if(d.action!=="show"||d.reset!==!0||!o.ios||o.ios.supportsCapability(Zg))return;return{success:!1,error:new t(la).message}}var fa=`The connected CtrlProxy does not advertise ${Nb}, so it would ignore anchor and draw the node at its normal position. Nothing was shown. Update the connected CtrlProxy, or remove anchor.`,ha=`The connected iOS prototype agent does not advertise ${Nb}, so it would ignore anchor and draw the node at its normal position. Nothing was shown. Relaunch the app with launchApp prototype: true to load the agent built for this AutoMobile version, or remove anchor.`,Pa="Element anchors resolve against the default display's app hierarchy, so they cannot be shown on another display. Nothing was shown. Omit display, or use a bounds anchor in dp.";async function ga(o){if(o.android){if(!await o.android.supportsCommand(Nb))throw new t(fa);return}if(!o.ios?.supportsCapability(Nb))throw new t(ha)}async function va(o,d,y,f){await ga(o),f?.throwIfAborted();let m=h8(d);if(m)throw new t(m);if(y&&Vu(d))throw new t(Pa)}async function Sa(o,d,y,f){if(!Vu(d))return{};let P=await(f.anchorHierarchyCaptureFactory??vn)(o).capture({freshness:"fresh",...y}),g=g8(d,{...P,boundsUnit:o.platform==="ios"?"points":"px"});return{spec:g.spec,anchors:g.anchors,...g.hierarchyUpdatedAt===void 0?{}:{hierarchyUpdatedAt:g.hierarchyUpdatedAt}}}async function ba(o,d,y,{context:f,dependencies:m}){let{displayId:P,signal:g}=f,T=y.action==="show"?y.spec:void 0;if(!T||!QU(T))return{};try{return await va(o,T,P,g),await Sa(d,T,{timeoutMs:y.timeoutMs,signal:g},m)}catch(A){return g?.throwIfAborted(),e.warn(`[prototype] anchor resolution refused the show: ${r(A)}`),{failure:{success:!1,error:u(A,"Prototype anchor failed").message}}}}async function Ra(o,d,y,{dependencies:f,signal:m}){try{return{displayId:await ra(o,d,y,{dependencies:f,signal:m})}}catch(P){return m?.throwIfAborted(),e.warn("[prototype] Request failed",P),{failure:{success:!1,error:u(P,"Prototype request failed").message}}}}async function xr(o,d,y,{args:f,dependencies:m}){let{signal:P}=o,g=await da(d,f,P);if(g)return{failure:g};let T=await ca(d,f,P);if(T.failure)return{failure:T.failure};let A=await ka(o,d,y,{args:f,dependencies:m});if(A.failure)return A;let C=ya(d,f)??(f.action==="show"&&f.spec!==void 0?await Zt(d,f.spec,P,{env:m.env}):void 0)??await pa(d,f,P)??await na(d,f,P);if(C)return{displayId:A.displayId,failure:C};let O=o.inPlace?o.shownDisplayId:A.displayId,I=await ba(d,y,f,{context:{displayId:O,signal:P},dependencies:m});return{...A,...I,...T}}async function ka({inPlace:o,signal:d},y,f,{args:m,dependencies:P}){return o?{}:Ra(y,f,m,{dependencies:P,signal:d})}async function Dr(o,d){let{action:y,success:f,device:m,deviceScreenRound:P,signal:g}=o;if(y!=="show"||!f||m.platform!=="android")return{};if(m.formFactor!=="watch")return{};if(typeof P==="boolean")return{screenRound:P};let A=await(d.screenRoundFactory?.(m)??new HL((d.adbFactory??v).create(m))).isScreenRound(g);return A===void 0?{}:{screenRound:A}}function Lr(o){let{action:d,success:y,device:f}=o;return d==="show"&&y&&f.platform==="android"&&f.formFactor==="automotive"?{formFactor:"automotive"}:{}}function Ea(o,d,y,{action:f,success:m,clearFailedShow:P}){if(f==="dismiss"&&m||f==="show"&&!m&&P)o.dismiss(d.deviceId,y.id)}function Ta(o,d,y,f){if(f.args.action==="show"&&!f.inPlace)o.show(d,f.target.id,y)}function Aa(o,d,y,f){if(f.inPlace&&f.success)o.show(d,f.target.id,y)}function Ca(o){if(o.all)return{all:!0};return{id:o.action==="show"?o.spec.id:o.id}}function Ia(o,d,y){return y.id?o.shownOnDevice(d.deviceId,y.id):void 0}async function Oa(o,d,y,{device:f,signal:m}){return o?{uploaded:[],prepared:[],failure:o}:$e(y.target,d,y.assetReaders,{signal:m,cached:za(y,f.deviceId)})}async function Fr(o,d,y,{scope:f,queue:m,signal:P,mcpSessionId:g}){if(y.action==="patch"){let{store:T,target:A,cacheInvalidator:C}=o;return nr({store:T,transport:A.transport,supportsPatch:async()=>A.android?A.android.supportsCommand(wf):A.ios?.supportsCapability(wf)===!0,specRefusal:async(O)=>(await Zt(A,O,P,{env:o.env}))?.error??await yP(O,d.deviceId,o.shaderAssetCache??mR()),platform:d.platform==="android"?"android":"ios",queue:m,retire:(O)=>Nr(C,d,O),mcpSessionId:g},d.deviceId,{id:y.id,ops:y.ops,baseRevision:y.baseRevision,timeoutMs:y.timeoutMs},P)}return _a(o,d,{...y,action:y.action},{scope:f,signal:P,mcpSessionId:g})}async function _a(o,d,y,{scope:f,signal:m,mcpSessionId:P}){let{store:g,events:T,target:A,commits:C}=o,O=Ca(y),I=ae(A.transport),_=Ia(g,f,O),x=y.action==="show"&&_!==void 0&&y.reset!==!0,F=await Fa(A,O,x,m),q=$a(C,f,y.action,O),D={commits:C,scope:f,target:O,generation:q,sent:!1,startedFreshEvents:!1,mcpSessionId:P};try{let M=await Ha(D,()=>xr({inPlace:x,shownDisplayId:_?.displayId,signal:m},A,d,{args:y,dependencies:o})),Y=M.spec?{...y,spec:M.spec}:y,G=Ma(Y),Q=await Je(D,m,Va(M,x,d,{args:y,dependencies:o})),U=x?_?.displayId:M.displayId,Z=await Je(D,m,Oa(M.failure,G,o,{device:d,signal:m}));if(Z.failure)eo(D);let{result:j,warning:we,mutationReply:N}=await Je(D,void 0,ur(A,G,Z,{signal:m,displayId:U,env:o.env,superseded:()=>je(C,f,O,q),beforeSend:async()=>{if(m?.throwIfAborted(),await Mr(A,d,y,{dependencies:o,signal:m})?.(),Ta(T,f,I,{target:O,args:y,inPlace:x}),D.startedFreshEvents=y.action==="show"&&!x,y.action==="show"&&O.id)o.store.beginShowDispatch(f.deviceId,O.id);if(D.sent=!0,y.action==="show")D.specTicket=g.shownSpecs.beginShow(f.deviceId,O.id,y.replaceOthers,d.platform==="android"?"android":"ios")}})).then(xa);qr(g,D,{action:y.action,success:j.success,id:O.id,spec:Y.spec,replaceOthers:y.replaceOthers,variant:y.variant,result:j}),Nr(o.cacheInvalidator,d,j),iG(d.deviceId,G.action,G.spec,{accepted:j.success&&!je(C,f,O,q),sent:D.sent,id:G.id,all:G.all});let le={...Ya(y,_,Q,j.success),chrome:M.chrome},ie=je(C,f,O,q)?Ba(o,{args:y,target:O,result:j,placed:le}):Ua(o,f,I,{args:y,target:O,result:j,placed:le,inPlace:x,previouslyShown:_!==void 0,startedFreshEvents:D.startedFreshEvents}),{warning:re,...ye}=await Ar({android:A.android!==void 0,action:y.action,success:j.success,hiddenReason:rb(j.hiddenReason),spec:G.spec,superseded:()=>je(C,f,O,q),capture:()=>(o.anchorHierarchyCaptureFactory??vn)(d),timer:o.timer,displayId:U,signal:m}),Ge=Y.spec;return{...N,lastResult:ie,...Z.uploaded.length>0?{uploadedAssets:Z.uploaded}:{},...ja(M),...await Da(Y,d,o,{result:j,signal:m}),...ye,...Ja(j,[we,le.warning,re],F,Ge)}}catch(M){throw iG(d.deviceId,y.action,void 0,{accepted:!1,sent:D.sent}),M}finally{qr(g,D),Na(D)}}function Ma(o){return o.action==="show"&&o.pseudoLocale===!0&&o.spec?{...o,spec:Er(o.spec)}:o}function xa(o){let d=o.result.errorCode==="render_failed"?Yb(o.result):void 0;return{...o,result:d?{...o.result,success:!1,error:d.error}:o.result,mutationReply:d??{success:o.result.success,error:o.result.error??void 0}}}async function Da(o,d,y,{result:f,signal:m}){let{success:P,screenRound:g}=f;return{...await qa(o,d,y.target,P),...o.action==="show"&&P?XU(o.spec):{},...o.action==="show"&&P?ZU(o.spec):{},...await Dr({action:o.action,success:P,device:d,deviceScreenRound:g,signal:m},y),...Lr({action:o.action,success:P,device:d})}}function La(o){return Number.parseInt(o.iosVersion??o.osVersion??"",10)||void 0}async function qa(o,d,y,f){if(o.action!=="show"||!f)return{};let m=bC.fields(o.spec).length>0?await y.android?.supportsCommand(bC.capability):!1,P=zee(o.spec,d.platform==="ios"?"ios":"android",(T)=>d.platform==="android"?T===bC.capability&&m===!0:y.ios?.supportsCapability(T)===!0,La(d));P.push(...jee(o.spec,o.locale));let g=d.platform==="ios"?e1(o.spec):[];if(g.length>0)P.push({platform:"ios",construct:"node.gestures",effect:"substituted",paths:g.slice(0,20),...g.length>20?{total:g.length}:{},detail:[...g.some((T)=>T.endsWith(".onLongPress"))?["Long-press uses the platform default threshold (about 0.5 s on iOS versus the Android long-press timeout, about 0.4 s)."]:[],...g.some((T)=>T.endsWith(".onDoubleTap"))?["The double-tap window is the system's. With onDoubleTap, onTap fires only after that window elapses."]:[]].join(" ")});return P.length>0?{platformNotes:P}:{}}async function Fa(o,d,y,f){if(!y||!o.android)return;let m=await o.android.supportsCommand(Zg);if(f?.throwIfAborted(),m)return;return`the connected CtrlProxy does not advertise ${Zg}, so prototype ${d.id} was re-shown fresh on its display: pager pages restarted. Update the connected CtrlProxy to keep pages.`}function Nr(o,d,y){if(y.success)o.invalidate(d,!0)}function eo(o){let{commits:d,scope:y,target:f,generation:m,sent:P}=o;if(!P&&m!==void 0&&f.id!==void 0)d.withdraw(y.deviceId,f.id,m)}function qr(o,d,y){if(d.specTicket!==void 0){let{shown:f,refusal:m}=y?dr(y):{},{mcpSessionId:P}=d,g=f&&P!==void 0?{...f,mcpSessionId:P}:f;o.shownSpecs.endShow(d.scope.deviceId,d.specTicket,g,m)}}function Na(o){let{commits:d,scope:y,target:f,generation:m}=o;if(m!==void 0&&f.id!==void 0)d.settle(y.deviceId,f.id,m)}async function Je(o,d,y){try{let f=await y;return d?.throwIfAborted(),f}catch(f){throw eo(o),f}}async function Ha(o,d){let y=await Je(o,void 0,d());if(y.failure)eo(o);return y}function $a(o,d,y,f){return y==="show"&&f.id?o.begin(d.deviceId,f.id):void 0}function je(o,d,y,f){return f!==void 0&&y.id!==void 0&&!o.isLatest(d.deviceId,y.id,f)}async function Va(o,d,y,{args:f,dependencies:m}){return o.failure?void 0:Wa(d,o.displayId,y,{args:f,dependencies:m})}function Ua(o,d,y,f){let{store:m,events:P}=o,{args:g,target:T,result:A,placed:C,inPlace:O,previouslyShown:I}=f;if(Aa(P,d,y,{target:T,inPlace:O,success:A.success}),Ea(P,d,T,{action:g.action,success:A.success,clearFailedShow:f.startedFreshEvents&&!I}),g.action==="show"&&A.success&&T.id&&g.replaceOthers!==!1)P.replaceShown(d.deviceId,T.id);let _=m.record(d,g.action,T,{result:A,details:{displayId:C.displayId,data:g.action==="show"?g.spec?.data:void 0,chrome:C.chrome,replaceOthers:g.replaceOthers}});if(T.id&&P.isDismissed(d,T.id))m.dismissed(d,T.id);return _}function Ba(o,d){let{args:y,target:f,result:m,placed:P}=d;return{...f,lastAction:y.action,...P.displayId===void 0?{}:{displayId:P.displayId},...y.action==="show"&&m.success&&P.chrome!==void 0?{chrome:P.chrome}:{},...t2(y.action,m),...pK(y.action,m),success:m.success,...m.error?{error:m.error}:{},...m.totalTimeMs===void 0?{}:{totalTimeMs:m.totalTimeMs},timestamp:o.now()}}async function Wa(o,d,y,{args:f,dependencies:m}){if(!o)return d;if(f.display===void 0)return;try{return await OE(y,f.display,{adb:(m.adbFactory??v).create(y),lastRenderedObservation:m.lastRenderedObservation})||void 0}catch(P){return e.debug(`[prototype] ignored display selector did not resolve: ${r(P)}`),null}}function Ya(o,d,y,f){if(o.action!=="show"||d?.id===void 0)return{displayId:y??void 0};if(!f)return{displayId:d.displayId};if(o.reset===!0)return{displayId:y??void 0};if(o.display===void 0||y===d.displayId)return{displayId:d.displayId};let m=d.displayId===void 0?"the default display":`logical display ${d.displayId}`;return{displayId:d.displayId,warning:`display was ignored: prototype ${d.id} is already shown on ${m}, and a show with the same id replaces it in place there. Pass reset: true to show it fresh on the requested display.`}}function ja(o){return o.anchors?.length?{anchors:o.anchors,...o.hierarchyUpdatedAt===void 0?{}:{hierarchyUpdatedAt:o.hierarchyUpdatedAt}}:{}}function Ja(o,d,y,f){let m=o.success?gO(o.degradedEffects):{},P=[...d,m.warning,o.success?y:void 0,...o.success?uK(f):[],...o.success?Cse(f):[]].filter((g)=>g!==void 0).join(" ");return{...o.success&&o.missingAssets?.length?{missingAssets:o.missingAssets}:{},...m,...P?{warning:P}:{}}}function za(o,d){return{serial:d,cache:o.shaderAssetCache??mR()}}var ze={success:!1,error:"The headless virtual device has no saved prototypes."};function Ga(o){let d=o.ops.flatMap((y)=>y.op!=="replaceNode"&&y.path.startsWith("/state/")?[Fp(y.path.slice(6))[0]]:[]);return[...new Set(d)].filter((y)=>y!==void 0)}function Hr(o,d,y,f){let m=[...new Set([...Object.keys(d),...Object.keys(y)])].filter((P)=>d[P]!==y[P]);for(let P of m)o.set(P,f);return m}function Ka(o,d){let y=Ga(d);if(y.length===0)return;let{baseRevision:f}=d;if(f===void 0||f>o.ledger.revision)return{success:!1,delivery:"answered",revision:o.ledger.revision,error:f===void 0?"baseRevision is required when a patch has /state ops":`baseRevision ${f} is newer than the device revision ${o.ledger.revision}`};let m=y.filter((g)=>(o.stateRevisions.get(g)??0)>f);if(m.length===0)return;let P=Object.fromEntries(m.filter((g)=>(g in o.state)).map((g)=>[g,o.state[g]]));return{success:!1,delivery:"answered",error:"conflict",revision:o.ledger.revision,conflict:{revision:o.ledger.revision,state:P}}}function $r(o,d,y){let f={};return X({root:o.root},(m)=>{if(m.type!=="pager"||typeof m.id!=="string")return;let P=Math.max(0,(Array.isArray(m.children)?m.children.length:0)-1),g=typeof m.stateKey==="string"?d[m.stateKey]:void 0,T=typeof g==="number"?Math.trunc(g):y[m.id]??0;f[m.id]=Math.min(Math.max(T,0),P)}),f}function Vr(o,d={}){let y={};return X({root:o.root},(f)=>{if(f.type!=="stack"||typeof f.id!=="string"||typeof f.start!=="string")return;let m=c(f.screens)??{},P=d[f.id];if(P!==void 0&&P.path.length>0&&P.path.every((T)=>(T in m))){y[f.id]=structuredClone(P);return}let g=c(c(f.routes)?.[f.start]);y[f.id]={path:[f.start],depth:1,...g?.params===void 0?{}:{params:[{}]}}}),y}function Ur(o,d){let y={...d};return X({root:o.root},(f)=>{if(f.type!=="pager"||typeof f.stateKey!=="string")return;let m=y[f.stateKey];if(typeof m!=="number"||!Number.isInteger(m))return;let P=Math.max(0,(Array.isArray(f.children)?f.children.length:0)-1);y[f.stateKey]=Math.min(Math.max(m,0),P)}),y}var Br=(o)=>o&&typeof o==="object"&&!Array.isArray(o)?structuredClone(o):{};class to{clock;shown=new Map;ledgers=new Map;assets=new Set;listeners=new Set;capabilities;constructor(o,d=hQ){this.clock=o;this.capabilities=new Set(d)}async supportsCommand(o){return this.capabilities.has(o)}async requestShowPrototype(o,d,y,f={}){let m=this.shown.get(o.id);if(f.replaceOthers!==!1)[...this.shown.keys()].filter((I)=>I!==o.id).forEach((I)=>this.shown.delete(I));let P=m!==void 0&&f.reset!==!0,g={...structuredClone(o)},T=Ur(g,Br(g.state));g.state=T;let A=this.ledgers.get(o.id)??{revision:0,lastSequence:0},C=++A.revision;this.ledgers.set(o.id,A),this.shown.set(o.id,{spec:g,state:T,pages:$r(g,T,P?m.pages:{}),ledger:A,stacks:Vr(g,P?m.stacks:{}),stateRevisions:new Map(Object.keys(T).map((I)=>[I,C]))});let O=this.missingAssets(g);return{success:!0,totalTimeMs:0,timestamp:this.clock.now(),...O.length>0?{missingAssets:O}:{}}}async requestDismissPrototype(o){if(o.all)this.shown.clear();else if(o.id!==void 0)this.shown.delete(o.id);return{success:!0,totalTimeMs:0,timestamp:this.clock.now()}}async requestPatchPrototype(o){let d=this.shown.get(o.id);if(!d)return{success:!1,delivery:"answered",error:`No prototype with id ${o.id} is shown on the virtual device.`};let y=Ka(d,o);if(y)return y;let f={...d.spec,state:d.state},m=CO(f,o.ops);if(!m.success)return{success:!1,delivery:"answered",error:`Invalid patch at ${m.error.path}: ${m.error.message}`};let P=Ur(m.spec,Br(m.spec.state));d.ledger.revision+=1;let g=Hr(d.stateRevisions,d.state,P,d.ledger.revision).filter((T)=>(T in P));if(d.spec={...m.spec,state:P},d.state=P,d.pages=$r(d.spec,P,d.pages),d.stacks=Vr(d.spec,d.stacks),g.length>0)this.dispatch({id:o.id,kind:"emit",name:"change",payload:g.length===1?{key:g[0],value:P[g[0]]}:{keys:g,values:Object.fromEntries(g.map((T)=>[T,P[T]]))}});return{success:!0,delivery:"answered",revision:d.ledger.revision,totalTimeMs:0}}async requestInspectPrototypes(){let o=[...this.shown.entries()].map(([y,f])=>({id:y,persistent:!1,state:{...f.state},pages:{...f.pages},...Object.keys(f.stacks).length?{stacks:structuredClone(f.stacks)}:{},lastSequence:f.ledger.lastSequence,...f.spec.data===void 0?{}:{data:structuredClone(f.spec.data)}})),d=Object.assign({},...o.map((y)=>y.stacks??{}));return{success:!0,prototypes:o,droppedEvents:0,timestamp:this.clock.now(),...Object.keys(d).length?{stacks:d}:{}}}async requestPutPrototypeAsset(o,d){return d?.abortSignal?.throwIfAborted(),d?.onDispatch?.(),this.assets.add(o.id),{success:!0,dispatched:!0,acknowledged:!0}}async requestRemovePrototypeAsset(o,d){return d?.abortSignal?.throwIfAborted(),d?.onDispatch?.(),this.assets.delete(o),{success:!0,dispatched:!0,acknowledged:!0}}async requestSavePrototype(){return ze}async requestListSavedPrototypes(){return ze}async requestPinSavedPrototype(){return ze}async requestDeleteSavedPrototype(){return ze}onPrototypeEvent(o){return this.listeners.add(o),()=>{this.listeners.delete(o)}}dispatch(o){let d=this.shown.get(o.id);if(!d)return!1;if(o.state!==void 0){let f={...d.state,...o.state};d.ledger.revision+=1,Hr(d.stateRevisions,d.state,f,d.ledger.revision),d.state=f}if(o.pages!==void 0)d.pages={...d.pages,...o.pages};d.ledger.lastSequence+=1;let y={type:"prototype_event",timestamp:this.clock.now(),id:o.id,sequence:d.ledger.lastSequence,kind:o.kind,name:o.name,payload:o.payload??null,state:{...d.state},pages:{...d.pages},...Object.keys(d.stacks).length?{stacks:structuredClone(d.stacks)}:{}};return[...this.listeners].forEach((f)=>f(y)),!0}shownIds(){return[...this.shown.keys()]}missingAssets(o){let{images:d,fonts:y,shaders:f}=sb(o);return[...d,...y,...f].filter((m)=>!this.assets.has(m)).sort()}}function Xa(o,d){let y=Ue();return{sessionUuid:d.sessionUuid??y?.routingSessionUuid??y?.toolSelectionProfileUuid,deviceId:o.deviceId}}function jr(){let o=zh();return o&&o.trim().length>0?o:void 0}function Qa(o,d,y=jr()){return(d==="show"||d==="patch")&&o.success&&y?{...o,mcpSessionId:y}:o}function ep(o,d,y){return{scope:o,queue:d,signal:me(y),mcpSessionId:jr()}}var Wr=(o)=>Xe(k(o),o.success);function tp(o,d,y){let f=typeof d==="object"&&d!==null&&"action"in d?d.action:void 0,m=typeof f==="string"&&RM(f)&&!E0(y);return Wq(o)&&!m?(P)=>Wr({...P,virtualDevice:yQ()}):Wr}function op(){return R.sessionManager()}function rp(o){let d=R.sessionManager();if(!d)return;return d.onDeviceOwnershipChange((y,f)=>{if(f==="full"||d.getSessionForDevice(y)===null)o(y)})}function np(o,d){if(o.platform==="android")return;if(o.platform!=="ios")return new t("Prototypes need an Android device or an iOS simulator. Target one with deviceId or sessionUuid.");let y=iU(d.spec,d.assets);if(y)return new t(y);if(d.display!==void 0)return new t("display is Android only; omit display on iOS.");if(d.spec!==void 0){if(ue(d.spec).devicePersistence)return new t('window.persistence "device" is Android only; omit it on iOS.');let m=d.action==="show"||d.action==="save"?He(d.spec,"ios"):void 0;if(m)return new t(`Invalid prototype at spec.${m.path}: ${m.message}. Nothing was shown.`)}return}function sp(o){return o.spec===void 0?o:{...o,spec:Rf(o.spec)}}function ip(o){return(d)=>d.platform==="ios"?new rt({deviceId:d.deviceId,simctl:new nt(new L),files:new st,timer:o.timer??i,ids:B}):new Ut({adb:(o.adbFactory??v).create(d),timer:o.timer??i,ids:B,tempFiles:new Bt})}function ap(){return{subscribeSessionRelease:(o)=>Si.subscribe((d,y,f,m)=>o(d,m?.upgradeOnly?void 0:f?.deviceId)),subscribeDeviceRemoval:(o)=>aa().onDeviceRemoved(o),subscribeDeviceUnbound:rp,deviceUnboundSource:op}}function pp(o,d,y){return{androidTarget:(P)=>{let g=o(P),T=y.android.get(g);if(T===void 0)T=new bt(g),y.android.set(g,T),Yo(g,P.deviceId,y.requests),Qo(g,P.deviceId,y.channels);return{transport:T,android:T}},iosTarget:(P)=>{let g=d.get(P.deviceId);if(g===void 0)return;let T=y.ios.get(g);if(T===void 0)T=new z$(g),y.ios.set(g,T),Wo(g,P.deviceId,y.requests),Xo(g,P.deviceId,y.channels);return{transport:T,ios:T}}}}function oo(o){return o.clock??o.timer??i}function Yr(o,d){let y=o.store??new St(oo(o),void 0,d),f=o.timer??i,m=new mt({ids:o.idGenerator??B,timer:f}),P=Bo(f,m),g=Go(f,m,o.channelExecutor),T=vo(o,y),A=new gt(f,y,{telemetry:Gr.getInstance(),requests:Ko(P,g),recorder:T}),C=or(o.lifecycle??ap(),A),O=!1;return{store:y,events:A,recorder:T,commits:new ht,patchQueue:rr(),transports:{android:new WeakMap,ios:new WeakMap,requests:P,channels:g},mocks:m,virtualDevice:o.virtualDevice??new to(oo(o)),ensureLifecycle:C.ensureSubscribed,dispose:()=>{if(!O)O=!0,C.unsubscribe(),A.dispose(),m.clearAll()}}}var Re,ve;function dp(o){let{store:d,clock:y,timer:f,lifecycle:m}=o;if(d||y||f||m||o.testSessionStore||o.idGenerator||o.channelExecutor||o.virtualDevice)return Yr(o);return Re??=Yr(o,v1()),Re}function cp(){return Re?.store.shownSpecs}H8(cp);function up(o){let d=()=>{let y=ve?.dispose===d;if(y)ve=void 0;if(o!==Re)o.dispose();else if(y)o.dispose(),Re=void 0};return d}function lp(o){let d=o&&typeof o==="object"&&!Array.isArray(o)?{...o}:{};return ua(d),s1.safeParse(d)}async function yp(o,d,y){let f=await fp(o,d,y);return"error"in f?f:mp(f.args,d,y)}async function fp(o,d,y){if(o.specPath===void 0||!Jr(o.action))return{args:o};let{specPath:f,...m}=o,P=await gM(f,d);if(y?.throwIfAborted(),"error"in P)return P;let g=wM(P.json);if(g)return{error:`specPath ${f}: ${g.path}: ${g.text}`};return{args:{...m,spec:P.json}}}var Jr=(o)=>o==="show"||o==="screenMap"||o==="share";async function mp(o,d,y){if(o.mockPath===void 0)return{args:o};let{mockPath:f,...m}=o,P=await gM(f,d,{label:"mockPath",maxBytes:GU});if(y?.throwIfAborted(),"error"in P)return P;let g=P.json;if(typeof g!=="object"||g===null||Array.isArray(g))return{error:`mockPath ${f}: expected an object of {backendId: definition}`};return{args:{...m,mock:{...g}}}}function hp(o,d,y,f){if("error"in o)return o;let m=Wq(d)?gQ(o.args):void 0;if(m)return{error:m};let P=sp(o.args),g=d.platform==="ios"?void 0:ny(P.spec,y);return g?{error:g}:Pp(P,f)}function Pp(o,d){if(o.mock===void 0)return{args:o};try{d.defineAll(o.mock)}catch(y){return e.warn("Prototype show mock definition failed",y),{error:u(y,"Mock backend definition failed").message}}return{args:o}}function gp(o){return Jr(o.action)&&o.specPath!==void 0||o.action==="show"&&o.mockPath!==void 0}async function vp(o,d,y,f){if(d.action==="share")return await wp(d,y,f);if(AG(d.action))return await wr(o.preview(),d);return d.action==="screenMap"?Sp(d.spec):bo(o.mocks,d)}async function wp(o,d,y=new Vt){return await $J({spec:o.spec,assets:o.assets,url:o.url},{assetFileReader:d.assetFileReader,observationScreenshotReader:d.observationScreenshotReader,files:y})}function Sp(o){let d=KU(o);return{success:!0,screenMap:d,mermaid:p8(d)}}function qh(o={}){let d=dp(o);if(ve&&ve.host!==d)ve.dispose();d.ensureLifecycle();let{store:y,events:f,commits:m}=d,P=o.clientFactory??((M)=>E.getInstance(M)),g=(M)=>Wq(M)?d.virtualDevice:P(M),T=o.agentConnections??Qie,{androidTarget:A,iosTarget:C}=pp(g,T,d.transports),O=o.cacheInvalidator??new ei,I=oo(o),_={env:o.env,assetFileReader:o.assetFileReader??bM,observationScreenshotReader:o.observationScreenshotReader??UJ},x=L8({..._,installer:o.iosSavedPrototypeInstaller,protoViewer:o.protoViewerFactory??ip(o)}),F=()=>o.preview??vr(),q=async(M,Y,G,Q)=>{d.ensureLifecycle();let U=tp(M,Y,o.env),Z=lp(Y);if(!Z.success)return U({success:!1,error:`Invalid prototype input: ${Z.error.message}`});let j=gp(Z.data)?await yp(Z.data,_.assetFileReader,Q):{args:Z.data},we=hp(j,M,o.env,d.mocks);if("error"in we)return U({success:!1,error:we.error});let N=we.args,le=x(M,{...N,spec:N.spec},me(Q),()=>np(M,N));if(le){let H=await le;if(H)return U(H)}if(RM(N.action)){let H=o.protoViewerShareFiles,ke={mocks:d.mocks,preview:F};return U(await vp(ke,N,_,H))}let ie=Xa(M,N);if(wo(N.action)){let H={recorder:d.recorder,store:y,events:f,preview:()=>F().server};return U(await So(H,ie,N))}let re=M.platform==="android"?A(M):C(M);if(!re){let H=new t(eoe(M.deviceId));return U({success:!1,error:H.message})}let{action:ye}=N;if(po(ye))return U(await co(N,{store:y,events:f},M,{target:re,scope:ie,signal:Q}));if(ye==="awaitEvent"){let H=ae(re.transport),ke=await lo(f,ie,H,{query:N,context:{progress:G,signal:Q}});return U({success:!0,...ke,...uo(y,ie,N.id,ke)})}let Ge={store:y,events:f,target:re,assetReaders:_,commits:m,cacheInvalidator:O,now:()=>I.now(),timer:o.timer,adbFactory:o.adbFactory,lastRenderedObservation:o.lastRenderedObservation,anchorHierarchyCaptureFactory:o.anchorHierarchyCaptureFactory,screenRoundFactory:o.screenRoundFactory,shaderAssetCache:o.shaderAssetCache,env:o.env},zr=await B8({...N,action:ye,spec:N.spec},()=>{let H=me(Q);return{client:re.android,...F8(M,o),signal:H,stageAssets:()=>$e(re,N,_,{signal:H})}},(H)=>Fr(Ge,M,{...N,action:H},ep(ie,d.patchQueue,Q)));return U(Qa(zr,ye))},D=up(d);return ve={host:d,dispose:D},{handler:q,dispose:D}}export{Qa as attributeRevision,qh as createPrototypeToolRuntime,cp as daemonPrototypeShownSpecs};
20
-
21
- //# debugId=52B99B5D1F0201F264756E2164756E21