@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
@@ -0,0 +1,6 @@
1
+ // @bun
2
+ import{i,Je,vn,re,l,e}from"./chunk-r0vp315h.js";import{B,Jt,_e}from"./chunk-r6pvhj33.js";import{Cre,mB,w,zre,Rp,vD,Tg,Yv,tk,rk,eR,tR,rR,sk,hs,mne,H,V,ee,ie,v,z,L,b,Fg,FD,Gne,Qe,TR,nj,$g,Yne,kk,ln,at,Xr,he,Ai,Vg,e$,Nc,N,Bu,gf,kb,Sie,ui,it,iP,Qk,Xi,Ob,lE,Y$,gP,Id,x,E}from"./chunk-sfqe223f.js";import{$w,_r,ar,ml,Hte,Hw,cre,Ym,Xm,_t}from"./chunk-4vxeq0vd.js";import{Nn}from"./chunk-aewdveet.js";import{fX}from"./chunk-emv82m1w.js";import{Ir}from"./chunk-6hrj3jt6.js";import{iA,oA,cN,Ql,mN,pm,S7,wH,yN,$o,ac,xi,q,P7,sh,ah,kH,U6,T7,lA,k7,Cs,II,x7,U7,$y,AN,yi,WH,F,DN,ea,Uy,K6,G6,vo,q7,V7,W7}from"./chunk-xcqzwf9j.js";import{y,j,g,ne,A,Hl}from"./chunk-w5yypt53.js";import{Ot,Kc,At,vh,MQ,hc}from"./chunk-8nj68t1v.js";import{RM,GU,$E,zP,tJ,rJ,UE,PM,YU,AM,iS,mG,oS,nJ}from"./chunk-21h6dhdm.js";import{sS,dJ,ZU,QU,KE,DM,bJ,GE,OM,SJ,wJ,Wd,RJ,PJ,EJ,IJ,tp,_J,IG,cS,is,zd,Gf,o1,s1,xJ,dS,a1,CJ,DJ,c1,qG,XP,A1,T1,k1,E1,I1,VG,bn,_1,x1,C1,D1,WG,lX,uX,_y,WM,pX,xy,ZP,zM,jM,H1,oI,V1,W1,z1,GG,YG,JG,KM}from"./chunk-r4j43b9s.js";import{pp,Tm,km}from"./chunk-z8tvs8nk.js";import{s5,VQ,c5,WQ,zQ,d5,R_,mv,fv,ZS,iee,pu,G}from"./chunk-jvstjnqm.js";import{Eh,jA}from"./chunk-xezekwwn.js";import{DT}from"./chunk-e0870khr.js";import{Ro,Ste}from"./chunk-cqhw4yr6.js";import{vA,MN,Hr,NN,FN,J6,G7}from"./chunk-s3y3zfcx.js";import{ru,nv,Xt,a0}from"./chunk-tx4f0h9c.js";import{SA,Ky,sZ,TA,Xy}from"./chunk-gadtna7s.js";import{jd,ZM,xX,np,CX}from"./chunk-wxdjeb4k.js";import{fI,qc,HX}from"./chunk-13qxf7ym.js";import{jae}from"./chunk-khejfph4.js";import{r,t}from"./chunk-2b39zyxc.js";var Tt={"tools/list":{ttlMs:5000,cacheScope:"private"},"server/discover":{ttlMs:60000,cacheScope:"private"}};var ci=new Set(["observe"]);class Be{tracker;scopeProvider;constructor(o,n){this.tracker=o;this.scopeProvider=n}evaluate(o){let n=this.scopeProvider.getScope();if(o.readOnly===!0||ci.has(o.toolName))return{blocked:!1,scope:n};if(!this.tracker.hasActiveToolExecution("executePlan",{scope:n,sessionId:o.sessionId,sessionUuid:o.sessionUuid}))return{blocked:!1,scope:n};return{blocked:!0,scope:n,reason:"plan execution in progress"}}}class $e{getScope(){return N.getPlanExecutionLockScope()}}var Ct=()=>new Be(G,new $e);var li=60000,pi=1024,mi={subscribeReleases:()=>()=>{},onBindingChanged:()=>{}};class ue{deps;acquiredSessions=new Map;boundDeviceSessions=new Map;releasedDeviceSessions=new Map;toolSelectionProfiles=new Map;attached=new Set;forgottenUntil=new Map;unsubscribeReleases;constructor(o=mi){this.deps=o}attach(o){return this.unsubscribeReleases??=this.deps.subscribeReleases((n)=>{if(this.releaseSession(n))this.deps.onBindingChanged()}),this.attached.add(o),()=>{this.attached.delete(o)}}dispose(){this.unsubscribeReleases?.(),this.unsubscribeReleases=void 0,this.attached.clear()}get attachedCountForTesting(){return this.attached.size}get keyCount(){return new Set([...this.acquiredSessions.keys(),...this.boundDeviceSessions.keys(),...this.releasedDeviceSessions.keys(),...this.toolSelectionProfiles.keys()]).size}boundSessionUuid(o){return this.boundDeviceSessions.get(o)}releasedSessionUuid(o){return this.releasedDeviceSessions.get(o)}acquiredSessionUuids(o){return this.acquiredSessions.get(o)??new Set}toolSelectionProfileUuid(o){return this.toolSelectionProfiles.get(o)}bind(o,n){if(this.isForgotten(o))return e.debug(`ignoring bind for forgotten session key ${o}`),!1;let s=this.acquiredSessions.get(o);if(!s)s=new Set,this.acquiredSessions.set(o,s);if(s.add(n),this.boundDeviceSessions.get(o)===n)return!1;return this.boundDeviceSessions.set(o,n),this.releasedDeviceSessions.delete(o),!0}bindToolSelectionProfile(o,n){if(this.isForgotten(o))return e.debug(`ignoring tool-selection profile bind for forgotten session key ${o}`),!1;if(this.toolSelectionProfiles.get(o)===n)return!1;return this.toolSelectionProfiles.set(o,n),!0}forget(o){this.acquiredSessions.delete(o),this.boundDeviceSessions.delete(o),this.releasedDeviceSessions.delete(o),this.toolSelectionProfiles.delete(o),this.tombstone(o)}get timer(){return this.deps.timer??i}tombstone(o){this.forgottenUntil.delete(o),this.pruneTombstones();while(this.forgottenUntil.size>=pi){let n=this.forgottenUntil.keys().next().value;if(n===void 0)break;this.forgottenUntil.delete(n)}this.forgottenUntil.set(o,this.timer.now()+li)}pruneTombstones(){let o=this.timer.now();for(let[n,s]of this.forgottenUntil){if(s>o)break;this.forgottenUntil.delete(n)}}isForgotten(o){return this.pruneTombstones(),this.forgottenUntil.has(o)}releaseSession(o){if(!o)return!1;let n=!1;for(let[s,a]of this.acquiredSessions)if(n=a.delete(o)||n,a.size===0)this.acquiredSessions.delete(s);for(let[s,a]of this.boundDeviceSessions)if(a===o)this.boundDeviceSessions.delete(s),this.releasedDeviceSessions.set(s,o),n=!0;for(let s of this.attached)n=s.releaseLocalSession(o)||n;return n}}class qe{idGenerator;directAcquiredSessions=new Set;initialSessionUuid;releasedInitialSessionUuid;directDeviceSessionUuid;releasedDirectDeviceSessionUuid;initialToolSelectionProfileUuid;directToolSelectionProfileUuid;detachFromStore;namesLiveSessionOfBoundPlan;store;constructor(o,n,s=B,{initialReleasedSessionUuid:a,namesLiveSessionOfBoundPlan:d=()=>!1,store:c=new ue}={}){this.idGenerator=s;this.initialSessionUuid=o,this.initialToolSelectionProfileUuid=n,this.releasedInitialSessionUuid=a,this.namesLiveSessionOfBoundPlan=d,this.store=c,this.detachFromStore=c.attach(this)}dispose(){this.detachFromStore()}boundSessionUuid(o){if(o)return this.store.boundSessionUuid(o)??this.initialSessionUuid;return this.directDeviceSessionUuid??this.initialSessionUuid}effectiveSessionUuid(o,n,s){let a=n&&typeof n==="object"&&!Array.isArray(n)?n.sessionUuid:void 0,d=Ql(a),c=this.boundSessionUuid(o);if(this.initialSessionUuid&&d&&d!==this.initialSessionUuid&&d!==this.connectionToolSelectionProfileUuid(o)&&!this.namesLiveSessionOfBoundPlan(d,this.initialSessionUuid))if(s?.readOnly)s.onReadOutsideBoundSession();else throw new ah(this.initialSessionUuid,d,`MCP connection is bound to device session ${this.initialSessionUuid}; cannot route this call to ${d} until the binding is released. Use a separate MCP connection for ${d}.`);return d??c}resolveDeviceSessionUuid(o,n,s,{selectingActiveDevice:a,deferForeignDevice:d=!1,readOnly:c}={}){let u=this.effectiveSessionUuid(o,n,{readOnly:c,onReadOutsideBoundSession:()=>{}}),m=n.platform==="android"||n.platform==="ios"?n.platform:void 0,p=typeof n.deviceId==="string"?n.deviceId:void 0;if(!m&&!p||n.device)return u;let f=(S)=>(!m||S.platform===m)&&(!p||S.deviceId===p);if(n.sessionUuid)return u;if(this.initialSessionUuid)return gi(s(this.initialSessionUuid),f,u,{deferForeignDevice:d&&p!==void 0,requested:{deviceId:p,platform:m}}),u;return this.resolveAcquiredDeviceSession(o,s,f,{deviceId:p,rebindFallback:u,selectingActiveDevice:a})}resolveAcquiredDeviceSession(o,n,s,{deviceId:a,rebindFallback:d,selectingActiveDevice:c=!1}){let u=[...this.acquiredSessionUuids(o)].flatMap((p)=>{let f=n(p);return f?[{sessionUuid:p,...f}]:[]});if(u.length===0)return;let m=u.filter(s);if(m.length===0&&c&&d&&u.some((p)=>p.sessionUuid===d))return d;if(m.length===0)return;if(m.length===1)return m[0].sessionUuid;throw Error(`Cannot resolve requested platform/deviceId unambiguously. Candidate sessions: ${m.map((p)=>`${p.sessionUuid} (${p.deviceId}, ${p.platform})`).join(", ")}. Pass an explicit sessionUuid/deviceId.`)}acquiredSessionUuids(o){return o?this.store.acquiredSessionUuids(o):this.directAcquiredSessions}ownsSession(o,n){return this.initialSessionUuid===n||this.acquiredSessionUuids(o).has(n)}boundDeviceSessionUuid(o){return this.boundSessionUuid(o)}releasedResourceSessionUuid(o){if(this.boundSessionUuid(o))return;if(o)return this.store.releasedSessionUuid(o)??this.releasedInitialSessionUuid;return this.releasedDirectDeviceSessionUuid??this.releasedInitialSessionUuid}effectiveToolSelectionProfileUuid(o,n){return this.connectionToolSelectionProfileUuid(o)??this.effectiveSessionUuid(o,n)}connectionToolSelectionProfileUuid(o){return o?this.store.toolSelectionProfileUuid(o)??this.initialToolSelectionProfileUuid:this.directToolSelectionProfileUuid??this.initialToolSelectionProfileUuid}bind(o,n){if(!n?.trim())return!1;if(this.initialSessionUuid&&n!==this.initialSessionUuid)return!1;if(o)return this.store.bind(o,n);if(this.directAcquiredSessions.add(n),this.directDeviceSessionUuid===n)return!1;return this.directDeviceSessionUuid=n,this.releasedDirectDeviceSessionUuid=void 0,!0}createAndBindToolSelectionProfile(o){let n=this.idGenerator.next();return this.bindToolSelectionProfile(o,n),n}bindToolSelectionProfile(o,n){if(!n?.trim())return!1;if(o)return this.store.bindToolSelectionProfile(o,n);if(this.directToolSelectionProfileUuid===n)return!1;return this.directToolSelectionProfileUuid=n,!0}unbindSession(o){let n=this.store.releaseSession(o);return this.releaseLocalSession(o)||n}releaseLocalSession(o){if(!o)return!1;let n=this.directAcquiredSessions.delete(o);if(this.initialSessionUuid===o)this.initialSessionUuid=void 0,this.releasedInitialSessionUuid=o,n=!0;if(this.directDeviceSessionUuid===o)this.directDeviceSessionUuid=void 0,this.releasedDirectDeviceSessionUuid=o,n=!0;return n}}function gi(o,n,s,{deferForeignDevice:a,requested:d}){if(!o||n(o)||a)return;throw new sh(s,o,d)}var je;function Et(o){je=o}function FE(o){if(!je)throw new t("The session tool-binding store is not installed in this process. Load src/server/daemonSessionToolBindingStore before the daemon forgets binding scopes.");je().forget(o)}function He(){return new ue({subscribeReleases:(o)=>{let n=F.registerSessionBindingReleaseHandler({onSessionReleased:o}),s=Ai.subscribe((a)=>o(a));return()=>{n(),s()}},onBindingChanged:()=>F.notifyToolSelectionChanged()})}var It;function Ke(){return It??=He(),It}Et(Ke);function Ve(o){return o.formFactor==="tv"||o.platform==="tvos"}async function fi(o,n,s){let[a,d]=await Promise.all([o.isEnabled(n,s,!1),o.isEnabled(n,s,!0)]);return!a&&d}async function Pt(o,n,{device:s,tvTools:a}){if(!Ve(s))return[];let d=await Promise.all(a.map((c)=>fi(o,n,c)));return a.filter((c,u)=>d[u])}function Si(o){if(!w.isInitialized())Ste(o);throw new t("MCP request was cancelled during acquisition.")}function Dt(o,n){if(!Hr(o)||!n||typeof n!=="object")return[];let s=n.enableTools;if(!Array.isArray(s)||s.length===0)return[];let a=s.filter((d)=>typeof d==="string");return z1(a),a}async function xt(o,n,s){if(s.length===0)return{};try{let a=await YG(o,n,s,!0);if(a.requested.length>0)F.notifyToolSelectionChanged();return a.skipped.length>0?{skipped:a.skipped}:{}}catch(a){let d=`Could not enable ${s.join(", ")} for session ${n}: ${r(a)}. The device session is usable; re-declare the capabilities with ${At}.`;return e.warn(`[MCP] ${d}`,a),{enableToolsError:d}}}async function wt(o,n,s,a){let d={platform:J6(s),formFactor:G7(s)};if(!Ve(d))return[...a];try{let c=await Pt(o??hc(),n,{device:d,tvTools:F.getAllTools().filter((u)=>u.defaultEnabledOnTv===!0).map((u)=>u.name)});return[...new Set([...a,...c])]}catch(c){return e.warn(`[MCP] Could not read the form-factor tool defaults for session ${n}: ${r(c)}`,c),[...a]}}function Nt(o,n){return n.enableToolsError||n.skipped?ye(o,n):o}async function kt(o,n,s,{service:a,enableTools:d,connectionProfileUuid:c}){if(o!=="provisionDevice"||!s)return n;let u=await xt(a,s,await wt(a,s,n,d));try{return ye(n,{enabledTools:Mt(n,await JG(a,[s],{connectionProfileUuid:c,labelSessionUuids:[]})),...u})}catch(m){return e.warn("[MCP] Could not enrich provisionDevice with enabled tools",{error:m}),Nt(n,u)}}function Mt(o,n){let s=J6(o);return s===void 0?[...n]:k7(n,s,(a)=>F.getRegisteredTool(a)?.deviceAwareHandler!==void 0)}function ye(o,n){let s=!1;return e$(o,{...o,content:o.content.map((a)=>{if(s||a.type!=="text"||typeof a.text!=="string")return a;return s=!0,{...a,text:Nc({...JSON.parse(a.text),...n})}}),...o.structuredContent?{structuredContent:{...o.structuredContent,...n}}:{}})}async function vi(o,n){if(!n)return o;if(n.aborted)throw o.catch(()=>{return}),new t("MCP request was cancelled during acquisition.");try{return await l(o,{timer:i,signal:n,label:"MCP request acquisition"})}catch(s){if(n.aborted&&s===n.reason)throw new t("MCP request was cancelled during acquisition.");throw s}}function hi(o){return o==="getAndroid"||o==="getApple"||o==="startDevice"}async function Ut(o){let{toolName:n,acquiredSessionUuid:s,requestSignal:a}=o,d=o.result;if(!hi(n)||d?.isError||!s)return d;let c=!1,u=await xt(o.sessionToolSelectionService,s,await wt(o.sessionToolSelectionService,s,d,o.requestedEnableTools));try{let m=new Set((await vi(o.listSessionTools(s),a)).tools.map((h)=>h.name)),p=Mt(d,F.getAllTools().filter((h)=>F.isUserConfigurableTool(h.name)).map((h)=>h.name).sort()),f=p.filter((h)=>!m.has(h)),S=p.filter((h)=>m.has(h));d=ye(d,{gatedTools:f,enabledTools:S,...u})}catch(m){c||=Boolean(a?.aborted),e.warn("[MCP] Could not enrich acquisition with gated tools",{tool:n,error:m}),d=Nt(d,u)}if(c||a?.aborted)Si(s);return d}function ve(o,n){let s=N.isToolResultsNoStructuredContentEnabled();if(!n)return s;try{return o.getToolResultsNoStructuredContent(n)??s}catch(a){return e.warn("[MCP] Could not resolve connection structured-content preference",{connectionProfileUuid:n,error:a}),s}}function Ft(o,n,s){if(!n||s===void 0)return;try{o.setToolResultsNoStructuredContent(n,s)}catch(a){e.warn("[MCP] Could not store connection structured-content preference",{connectionProfileUuid:n,error:a})}}function Lt(o,n){let s=N.isActionsCompactMetadataEnabled();if(!n)return s;try{return o.getActionsCompactMetadata(n)??s}catch(a){return e.warn("[MCP] Could not resolve connection compact-metadata preference",{connectionProfileUuid:n,error:a}),s}}function Bt(o,n,s){if(!n)return s;try{return o.getPrototypeFullSchema(n)??s}catch(a){return e.warn("[MCP] Could not resolve connection prototype schema preference",{connectionProfileUuid:n,error:a}),s}}function $t(o,n,s){if(!n||s===void 0)return;try{o.setPrototypeFullSchema(n,s)}catch(a){e.warn("[MCP] Could not store connection prototype schema preference",{connectionProfileUuid:n,error:a})}}function qt(o,n,s){if(!n||s===void 0)return;try{o.setActionsCompactMetadata(n,s)}catch(a){e.warn("[MCP] Could not store connection compact-metadata preference",{connectionProfileUuid:n,error:a})}}var Ri="prototype",jt=new WeakMap,bi={inline(o){let n=jt.get(o);if(n)return n;let{withFullAdvertisedSpecSchema:s}=import.meta.require("./chunk-ctwmhz13.js"),a=s(o);return jt.set(o,a),a}},Ht={daemonDefault:jA,inliner:bi};function Kt(o,n,s){if(!n||s.daemonDefault.isEnabled())return o;return o.map((a)=>a.name===Ri?{...a,inputSchema:s.inliner.inline(a.inputSchema)}:a)}function Vt(o){let{options:n,bindingKey:s,sessionToolBinding:a,toolSelectionProfileRegistry:d}=o,c=o.daemon??w,u=o.prototypeSchema??Ht;return async(m=a.effectiveSessionUuid(s))=>{let p=a.connectionToolSelectionProfileUuid(s),f=n.toolSelectionSessionManager??c.sessionManager(),S=at(m,f),h=Kt(F.getToolDefinitions({suppressOutputSchema:ve(d,p)}),Bt(d,p,u.daemonDefault.isEnabled()),u),R=S?Array.from(new Set(Object.values(f?.getDeviceLabels(S)??{}))):[];return{tools:(await Promise.all(h.map(async(C)=>{let T=F.getTool(C.name),D=T?.requiresDevice??!1,M=V1(D,S,R,[S,m]);return vh(C.name)||await W1(C.name,T?.defaultEnabled??!0,M,{sessionToolSelectionService:n.sessionToolSelectionService,connectionProfileUuid:p})?C:void 0}))).filter((C)=>C!==void 0)}}}function Re(o){let s=(!o.daemonMode||o.requiresDevice?void 0:w.brokerConnectionScopes())?.get(o.mcpSessionId),a=s?w.sessionManager():void 0;if(!s||!a)return;let d=mB({binding:s,toolName:o.toolName,args:o.args&&typeof o.args==="object"?o.args:{},requesterSessionUuid:o.sessionUuid?at(o.sessionUuid,a)??o.sessionUuid:void 0,grantedDeviceOf:(c)=>a.findSession(c)?.assignedDevice});if(d)throw d}function Gt(o,n,s=w){let a=G.getAdmittedSessionUse(n),d=s.sessionManager(),c=at(a,d)??a,u=V7(o,c),p=(a?d?.peekSession(a):void 0)??(c?d?.peekSession(c):void 0);return p?q7(u,a0(p)):u}function zt(o,n,s,a){if(a&&o.deviceHeldForLateRead(n,s)!==void 0)return;return o.getSessionForNewExecution(n,s)}async function Wt(o,n){let{name:s,tool:a,providedSessionUuid:d,execution:c}=o;if(!n.daemonMode||!d||a.requiresDevice||Hr(s)||a.selectsActiveDevice===!0||s===At&&n.toolSelectionProfileRegistry.has(d))return;let u=U6(d,o.context.requestMcpSessionId);if(await w.requireSessionManager().admitIssuedSessionForAutomation(d,pu(c),{...T7(n.plainReadCall,u),signal:V()}),u)G.markReadOnlySessionAccess(c.id);else G.markSessionAdmitted(c.id)}function Yt(o){let n=new Set;if(!Hr(o))return{released:n,cleanup:void 0};let s=(c)=>{n.add(c)},a=F.registerSessionBindingReleaseHandler({onSessionReleased:s}),d=Ai.subscribe(s);return{released:n,cleanup:()=>{try{a()}finally{d()}}}}function Qt(o,n){if(o.tool.selectsActiveDevice===!0&&!n?.isError&&o.sessionToolBinding.bind(o.sessionId,FN(n)?.sessionUuid??o.routingSessionUuid))F.notifyToolSelectionChanged()}function Ti(o,n){if(o!=="videoRecording"||!n||typeof n!=="object")return!1;let s=n;return s.action==="stop"&&typeof s.recordingId==="string"}function Ci(o,n,s){if(!n)return Ro(o)!==void 0;return s!==null&&s!==void 0&&n.isAdmittedForAutomation(s)}async function Zt(o,n){let{name:s,tool:a,providedSessionUuid:d,sessionId:c,sessionToolBinding:u}=o,{implicitAutolockMcpSessionId:m}=o,p=Ti(s,o.parsedParams),f=Ni(),S=a.isDeviceReadOnlyCall?.(o.parsedParams)===!0,h=wi(o,{daemonSessionManager:f,skip:n.readOutsideBoundSession||p,readOnlyCall:S});if(!d||Pi(s,n,p)||f!==void 0&&Ii(d,m)||!Ci(d,f,h))return;if(u.bind(c,d))F.notifyToolSelectionChanged();if(a.requiresDevice&&!S&&f)await Ei(d,m)}async function Ei(o,n){if(n)await w.requireDevicePoolWrites().attachExplicitSessionUuidCall(o,n)}function Ii(o,n){return w.requireFullDevicePool().isSessionOwnedByOtherConnection(o,n)}function Pi(o,n,s){return Di(o)||n.readOutsideBoundSession||Boolean(n.result?.isError)||s}function Di(o){return Hr(o)||vo(o)||o===At}function wi(o,n){let{daemonSessionManager:s}=n;return s&&o.providedSessionUuid&&!n.skip&&!vo(o.name)?zt(s,o.providedSessionUuid,pu(o.execution),n.readOnlyCall):void 0}function Ni(o=w){return o.sessionManager()}import{timingSafeEqual as ki}from"crypto";function Mi(o){if(!o||typeof o!=="object"||Array.isArray(o))return;let n=o[vD];return typeof n==="string"?n:void 0}function Oi(o){return!!o&&typeof o==="object"&&!Array.isArray(o)&&o[sk]===!0}function _i(o){if(!o||typeof o!=="object"||Array.isArray(o))return;let n=o[Rp];return typeof n==="number"&&Number.isFinite(n)&&n>0?n:void 0}function Ui(o){if(!o||typeof o!=="object"||Array.isArray(o))return;let n=o[Tg];return typeof n==="number"&&Number.isFinite(n)&&n>0?n:void 0}function Fi(o){if(!o||typeof o!=="object"||Array.isArray(o))return;let n=o[Yv];return typeof n==="string"&&n.length>0?n:void 0}function Li(o){if(!o||typeof o!=="object"||Array.isArray(o))return;let n=o[eR];return typeof n==="boolean"?n:void 0}function Bi(o){if(!o||typeof o!=="object"||Array.isArray(o))return;let n=o[tR];return typeof n==="boolean"?n:void 0}function $i(o){if(!o||typeof o!=="object"||Array.isArray(o))return;let n=o[rR];return typeof n==="boolean"?n:void 0}function qi(o,n){if(!n||!o||typeof o!=="object"||Array.isArray(o))return;let s=o,a=s[rk];if(typeof a!=="string"||a.length!==n.length||!ki(Buffer.from(a),Buffer.from(n)))return;let d=s[tk];return d==="forward"||d==="reverse"?d:void 0}function ji(o,n){let s=Mi(o);if(s===void 0)return;return n.trustForwardedSessionId===!0?s:n.sessionKey??s}function eo(o,n){let{daemonMode:s}=n;return{requestMcpSessionId:s?ji(o,n):void 0,requestOneShotCli:s&&Oi(o),requestedToolResultsNoStructuredContent:s?Li(o):void 0,requestedActionsCompactMetadata:s?Bi(o):void 0,requestedPrototypeFullSchema:s?$i(o):void 0,requestTimeoutMs:s?_i(o):void 0,requestDeadlineMs:s?Ui(o):void 0,requestLiveDeadlineKey:s?Fi(o):void 0,requestAcceptanceDiscoveryOrder:s?qi(o,n.acceptanceDiscoveryCapability):void 0}}function Hi(o){let{parsedParams:n}=o;return{...n,...o.tool.selectsActiveDevice===!0&&o.routingSessionUuid?{sessionUuid:o.routingSessionUuid}:{}}}function Ki(o){let{context:n,execution:s}=o;return{startTime:s.startTime,...n.requestTimeoutMs!==void 0?{timeoutMs:n.requestTimeoutMs}:{},...n.requestDeadlineMs!==void 0?{deadlineMs:n.requestDeadlineMs}:{},...n.requestLiveDeadlineKey!==void 0?{liveDeadlineKey:n.requestLiveDeadlineKey}:{}}}async function to(o){let{name:n,tool:s,toolParams:a,execution:d,sessionId:c,sessionToolBinding:u,options:m}=o,p=Hi(o),f=s.supportsProgress?o.progress:void 0,S=()=>ml({explicitObserveDeviceRead:n==="observe"&&Object.hasOwn(a,"deviceId")&&!o.providedSessionUuid&&!o.handlerRoutingSessionUuid,routingSessionUuid:o.handlerRoutingSessionUuid,callerMcpSessionId:o.context.requestMcpSessionId,autolockMcpSessionId:o.implicitAutolockMcpSessionId,oneShotCli:o.context.requestOneShotCli?!0:void 0,acceptanceDiscoveryOrder:o.context.requestAcceptanceDiscoveryOrder,deviceConnectionKey:o.bindingKey,ownsDeviceSession:(R)=>u.ownsSession(c,R),execution:{deviceBinding:{bindDeviceExecution:(R)=>G.bindDeviceExecution(d.id,R)},...pu(d)},requestDeadline:Ki(o),toolSelectionProfileUuid:o.connectionProfileUuid,actionsCompactMetadata:o.actionsCompactMetadata,labelSessionUuids:o.labelSessionUuids,routingBaseSessionUuid:o.routingBaseSessionUuid,sessionToolSelectionService:m.sessionToolSelectionService??(n==="executePlan"?hc():void 0)},()=>s.handler(p,f,o.requestSignal));return await Y$({textState:o.textState,getDeadlineMs:o.getRequestDeadlineMs},()=>H(o.requestSignal,S))}class be extends t{data;constructor(o,n){super(`Unknown tool: ${o}${n?`. ${n}`:""}`);this.name="UnknownToolError",this.data={code:Tm,toolName:o}}}class Ge extends t{data;constructor(o,n){let s=n.join("; ");super(`Unknown tool: ${o}${s?`. ${s}`:""}`);this.name="ToolUnavailableError",this.data={code:pp,toolName:o}}}function ze(o){if(o===null||typeof o!=="object"||!("data"in o))return;let n=o.data;return n!==null&&typeof n==="object"&&"code"in n?n.code:void 0}function Y8(o){return ze(o)===pp}function J8(o){if(ze(o)!==Tm)return;let n=Reflect.get(o,"data"),s=n!==null&&typeof n==="object"?Reflect.get(n,"toolName"):void 0;return typeof s==="string"?s:""}function X8(o){return ze(o)===km}function Te(o,n){return!!w.sessionManager()?.isLiveSessionOfSamePlan(o,n)}function oo(o,n){let s=F.getTool(o);if(!s){let a=F.getRegisteredTool(o);if(a)throw new Ge(o,F.getToolAvailabilityGateReasons(a));throw new be(o,iA(o))}if(o===At){let a=n;if(typeof a.toolName==="string"&&a.toolNames===void 0||Array.isArray(a.toolNames)&&a.toolNames.every((d)=>typeof d==="string"))z1(GG(a))}return s}function We(o){return typeof o==="string"&&o.trim().length>0?o:void 0}function Vi(o,n,s){let{tool:a,implicitAutolockMcpSessionId:d}=o,c=ro(n.platform),u=typeof n.deviceId==="string"?n.deviceId:void 0,m=s.resolveAutolockSessionForMcpSession(d,c,void 0,u);if(!m&&a.selectsActiveDevice===!0)m=s.resolveAutolockSessionForMcpSession(d);return{routingSessionUuid:m,resolvedImplicitAutolockSessionUuid:m}}function ro(o){return o==="android"||o==="ios"?o:void 0}function Gi(o){let n=w.sessionManager()?.peekSession(o);return n?.assignedDevice?w.devicePool()?.getDevice(n.assignedDevice)?.platform:void 0}function Ji(o){let n=w.sessionManager(),s=w.devicePool();if(!n||!s)return Ro(o)?.device;let a=n.getSession(o);if(!a||!n.isAdmittedForAutomation(a)||!a.assignedDevice)return;let d=s.getDevice(a.assignedDevice);return d?{deviceId:d.id,platform:d.platform}:void 0}function zi(o,n){let{name:s,tool:a,toolParams:d,sessionId:c,daemonMode:u,sessionToolBinding:m}=o,p=o.context.requestMcpSessionId,f=u?w.brokerConnectionScopes()?.get(p):void 0,S=Cre({binding:!n.deviceId&&!n.device&&!n.sessionUuid?f:void 0,action:s,platform:ro(n.platform),grantedPlatformOf:Gi});if(S)throw S;let h=a.isDeviceReadOnlyCall?.(d)===!0;return{routingSessionUuid:m.resolveDeviceSessionUuid(c,d,Ji,{selectingActiveDevice:a.selectsActiveDevice===!0,deferForeignDevice:a.selectsActiveDevice!==!0&&(h||f!==void 0),readOnly:h}),resolvedImplicitAutolockSessionUuid:void 0}}function io(o,n,s){let{name:a,tool:d,toolParams:c,daemonMode:u,implicitAutolockMcpSessionId:m}=o,p={routingSessionUuid:n,resolvedImplicitAutolockSessionUuid:void 0};if(d.selectsActiveDevice===!0)Re({daemonMode:u,requiresDevice:!1,toolName:a,mcpSessionId:o.context.requestMcpSessionId,args:c,sessionUuid:We(c.sessionUuid)});if(!(d.requiresDevice&&!Hr(a)||d.selectsActiveDevice===!0))return p;let f=c,S=w.devicePool();if(S&&m&&!s&&!f.sessionUuid&&!f.device)return Vi(o,f,S);return zi(o,f)}function Wi(o,n){return o?w.devicePool()?.resolveAutolockSessionForMcpSession(n):void 0}function no(o){let{name:n,tool:s,toolParams:a,sessionId:d,sessionToolBinding:c}=o;if(!s.requiresDevice||Hr(n))return!1;let u=We(a.sessionUuid),m=c.boundDeviceSessionUuid(d)??Wi(u,o.implicitAutolockMcpSessionId);if(!m||!u||u===m||c.ownsSession(d,u)||Te(u,m))return!1;if(s.isDeviceReadOnlyCall?.(a)===!0)return!0;throw new ah(m,u)}function Yi(o){let{scope:n,toolSelectionProfileRegistry:s}=o,{name:a,toolParams:d,sessionId:c,sessionToolBinding:u,context:m}=n,p=a===At,f=typeof d.sessionUuid==="string"?d.sessionUuid:void 0,S=o.initialConnectionProfileUuid;if(p&&!S&&!f?.trim().length)S=u.createAndBindToolSelectionProfile(c),s.record(S);return Ft(s,S,p?m.requestedToolResultsNoStructuredContent:void 0),qt(s,S,p?m.requestedActionsCompactMetadata:void 0),$t(s,S,p?m.requestedPrototypeFullSchema:void 0),{connectionProfileUuid:S,requestedToolSelectionProfileUuid:f,toolResultsNoStructuredContent:ve(s,S),actionsCompactMetadata:Lt(s,S)}}function Qi(o,n=w){return o.toolSelectionSessionManager??n.sessionManager()}function Zi(o,n,s){let{connectionProfileUuid:a,requestedToolSelectionProfileUuid:d}=n;return o.name===At&&d!==void 0&&d===a?o.sessionToolBinding.boundDeviceSessionUuid(o.sessionId)??s:s}function so(o){let{scope:n,options:s,routingSessionUuid:a}=o,{name:d,tool:c,toolParams:u}=n,m=Yi(o),{connectionProfileUuid:p}=m,f=We(u.device),S=Qi(s),h=Zi(n,m,a),R=vo(d),C=R?h:at(h,S),T=C?S?.getDeviceLabels(C):void 0;return{connectionProfileUuid:p,toolResultsNoStructuredContent:m.toolResultsNoStructuredContent,actionsCompactMetadata:m.actionsCompactMetadata,requestedDeviceLabel:f,routingBaseSessionUuid:C,derivedLabelSessionUuid:c.requiresDevice&&f?T?.[f]:void 0,labelSessionUuids:R?[]:Array.from(new Set(Object.values(T??{})))}}var en=(o)=>{let n=E.getExistingInstance(o);return n?.isLastConnectionFailureForwardingLeaseConflict()?n.getLastConnectionFailureMessage():void 0};function tn(o){let n=[],s=o;while(s instanceof Error&&n.length<8&&!n.includes(s))n.push(s),s=s.cause;return n}function ao(o,n,s=en){let a=tn(o),d=a.find((u)=>u instanceof Vg),c=d?.message??(a.some((u)=>u instanceof DT)?[...n??[]].map(s).find((u)=>u!==void 0):void 0);if(c===void 0)return;if(o!==d&&r(o).includes(c))return;return new t(c,{cause:o})}async function on(o,n,s=w){let a=o;try{let d=o.incidentId?s.devicePool():void 0;if(o.incidentId&&d){let c=await d.waitForEmulatorLossIncident(o.incidentId,n);a=WQ(o,c)}}catch(d){e.warn(`[MCP] Failed to resolve device-loss incident ${o.incidentId}`,d)}try{let d=a.sessionUuid?s.sessionManager()?.peekSession(a.sessionUuid):void 0;return zQ(a,d)}catch(d){return e.warn("[MCP] Failed to read session for device-loss continuity",d),a}}function Ye(o){return{content:[{type:"text",text:JSON.stringify(o)}],isError:!0}}async function co(o,n){let{toolName:s,execution:a}=n;if(o instanceof nv){let m=R_(),p={content:[{type:"text",text:JSON.stringify(m)}],structuredContent:m,isError:!0};return n.daemonMode?p:oS(p,iS(oA(n.tool),n.toolResultsNoStructuredContent))}if(o instanceof Xt)return Ye(vA({message:o.message,sessionUuid:o.sessionUuid,reason:o.release.releaseReason,release:o.release}));if(o instanceof Fg)G.unmarkSessionAdmitted(a.id);let d=MN(a.cancelReason);if(d)return Ye(d);if(o instanceof Fg)return ea(o,{toolName:s,source:"MCP"});let c=ao(o,a.deviceIds);if(c)return ea(c,{toolName:s,source:"MCP"});let u=c5(o,n.executionSessionUuid)??c5(hs(a.abortController.signal),n.executionSessionUuid);if(u){n.endExecutionOnce();let m=Math.max(0,i.now()-a.startTime),p=VQ(n.requestTimeoutMs,m);return Ye(await on(u,p))}return n.withRoutedSession(ea(n.textState.timeoutError(o)??o,{toolName:s,source:"MCP"}))}function rn(o){return typeof o==="string"&&o.trim().length>0?o:void 0}function nn(o,n){let s=o.planExecutionLock.evaluate({toolName:n.name,sessionId:n.sessionId,sessionUuid:n.executionSessionUuid,readOnly:n.tool.isDeviceReadOnlyCall?.(n.toolParams)===!0});if(s.blocked)throw e.warn(`[MCP] Rejecting tool ${n.name} due to active executePlan (scope=${s.scope}, sessionId=${n.sessionId??"none"}, sessionUuid=${n.routingSessionUuid??"none"})`),new DN(s.scope,s.reason)}function sn(o,n,s,a){let d,c=T1(yi(s),o.schema);try{A1(c),d=o.schema.parse(c)}catch(u){throw new(u instanceof Hl?oI:t)(`Invalid parameters for tool ${n}: ${Wd(n,u,c,o.schema)}`)}return Re({daemonMode:a.daemonMode,requiresDevice:o.requiresDevice===!0,toolName:n,mcpSessionId:a.mcpSessionId,args:d,sessionUuid:a.providedSessionUuid}),d}function an(o){let{tool:n,parsedParams:s}=o;if(!kH(n,s))return;for(let a of new Set([o.providedSessionUuid,o.derivedLabelSessionUuid]))lA(o.name,a,o.requestMcpSessionId,s)}function dn(o){let{providedSessionUuid:n,implicitAutolockMcpSessionId:s}=o,a=n?w.devicePool():void 0;if(!n||!a)return;if(a.isSessionOwnedByOtherConnection(n,s))return n;let d=o.daemonMode&&o.tool.isDeviceReadOnlyCall?.(o.parsedParams)===!0&&s?w.requireSessionManager().getSession(n):void 0;return d&&ru(d.livenessPolicy)&&!a.isSessionOwnedByConnection(n,s)?n:void 0}function cn(o){let{toolParams:n}=o,s=o.tool.requiresDevice&&!o.executionSessionUuid&&!("deviceId"in n)&&!("platform"in n)&&!("device"in n)&&!("sessionUuid"in n);return G.startExecution(o.name,o.executionSessionId,o.executionSessionUuid,{transportSessionId:o.sessionId,unresolvedAutolockMcpSessionId:s?o.implicitAutolockMcpSessionId:void 0})}function un(o,n){let s=n.acceptanceDiscoveryRequested?null:iS(oA(n.tool),n.toolResultsNoStructuredContent);if(s!==null&&mG(o))e.debug("[MCP] Omitted structuredContent",{tool:n.name,reason:s});return oS(o,s)}async function pn(o,n){let{plan:s}=n,{name:a,tool:d,execution:c,sessionId:u,sessionToolBinding:m,options:p}=s,f;try{f=Yt(a),await Wt(s,{daemonMode:o.daemonMode,plainReadCall:n.plainReadCall,toolSelectionProfileRegistry:o.toolSelectionProfileRegistry});let S=await to(s),h=Hr(a)?NN(S):void 0;S=await Ut({toolName:a,result:S,acquiredSessionUuid:h,requestedEnableTools:n.requestedEnableTools,sessionToolSelectionService:p.sessionToolSelectionService,listSessionTools:o.listSessionTools,requestSignal:s.requestSignal}),S=await kt(a,S,h,{service:p.sessionToolSelectionService,enableTools:n.requestedEnableTools,connectionProfileUuid:s.connectionProfileUuid}),Qt(s,S),await Zt(s,{result:S,readOutsideBoundSession:n.readOutsideBoundSession});let R=un(S,{name:a,tool:d,toolResultsNoStructuredContent:n.toolResultsNoStructuredContent,acceptanceDiscoveryRequested:s.context.requestAcceptanceDiscoveryOrder!==void 0});if(h&&f.released.has(h))throw new t(`Device session ${h} was released during acquisition. Call ${a} again to acquire a device.`);if(h&&m.bind(u,h))F.notifyToolSelectionChanged();return n.withRoutedSession(R)}catch(S){return await co(S,{toolName:a,tool:d,daemonMode:o.daemonMode,execution:c,executionSessionUuid:s.executionSessionUuid,requestTimeoutMs:s.context.requestTimeoutMs,toolResultsNoStructuredContent:n.toolResultsNoStructuredContent,textState:s.textState,withRoutedSession:n.withRoutedSession,endExecutionOnce:n.endExecutionOnce})}finally{n.endExplicitSessionBindClaim?.();try{f?.cleanup?.()}finally{n.endExecutionOnce()}}}function mn(o,n,s){let{name:a,args:d}=n,{options:c,daemonMode:u,sessionToolBinding:m}=o,p=c.sessionContext?.sessionId,f=s.requestMcpSessionId??(!u?p:void 0),S=s.requestMcpSessionId??o.serverBindingKey,h,R=!1;try{h=m.effectiveSessionUuid(S,d,{readOnly:F.getTool(a)?.isDeviceReadOnlyCall?.(d)===!0,onReadOutsideBoundSession:()=>{R=!0}})}catch(Le){return{failure:ea(Le,{toolName:a,source:"MCP"})}}let C=m.connectionToolSelectionProfileUuid(S),T=oo(a,d),D={name:a,tool:T,toolParams:d,sessionId:S,daemonMode:u,context:s,sessionToolBinding:m,implicitAutolockMcpSessionId:f},M=io(D,h,Boolean(c.sessionContext?.initialSessionToolBinding));R=no(D)||R;let Q=so({scope:D,options:c,toolSelectionProfileRegistry:o.toolSelectionProfileRegistry,routingSessionUuid:M.routingSessionUuid,initialConnectionProfileUuid:C}),fe=rn(d.sessionUuid);return{name:a,tool:T,toolParams:d,sessionId:p,bindingKey:S,context:s,implicitAutolockMcpSessionId:f,routingSessionUuid:M.routingSessionUuid,resolvedImplicitAutolockSessionUuid:M.resolvedImplicitAutolockSessionUuid,readOutsideBoundSession:R,selection:Q,providedSessionUuid:fe,executionSessionUuid:Q.derivedLabelSessionUuid??fe??M.routingSessionUuid}}function gn(o,n){let{name:s,tool:a,toolParams:d,sessionId:c,context:u,providedSessionUuid:m,selection:p}=n;nn(o,{name:s,tool:a,toolParams:d,sessionId:c,executionSessionUuid:n.executionSessionUuid,routingSessionUuid:n.routingSessionUuid});let f=sn(a,s,d,{daemonMode:o.daemonMode,mcpSessionId:u.requestMcpSessionId,providedSessionUuid:m});if(o.daemonMode)an({name:s,tool:a,parsedParams:f,providedSessionUuid:m,derivedLabelSessionUuid:p.derivedLabelSessionUuid,requestMcpSessionId:u.requestMcpSessionId});return{parsedParams:f,plainReadCall:!a.requiresDevice&&(vo(s)||a.isDeviceReadOnlyCall?.(f)===!0),requestedEnableTools:Dt(s,f),handlerRoutingSessionUuid:a.requiresDevice&&p.requestedDeviceLabel&&p.routingBaseSessionUuid?p.routingBaseSessionUuid:n.routingSessionUuid}}function fn(o,n,s,a){let{name:d,tool:c,toolParams:u,sessionId:m,context:p,implicitAutolockMcpSessionId:f}=n,S=cn({name:d,tool:c,toolParams:u,executionSessionId:n.bindingKey,executionSessionUuid:n.executionSessionUuid,sessionId:a.executionScopeId??m,implicitAutolockMcpSessionId:f});if(s.plainReadCall)G.markReadOnlySessionAccess(S.id);if(n.resolvedImplicitAutolockSessionUuid)G.setResolvedAutolockSessionUuid(S.id,n.resolvedImplicitAutolockSessionUuid);let{requestLiveDeadlineKey:h,requestDeadlineMs:R}=p,C=(h?KE(h):void 0)??new lE,T=()=>(h?ZU(h):void 0)??R;G.setExecutionDeadline(S.id,T,h?(Se)=>QU(h,Se):void 0);let D=(Se)=>o.daemonMode?W7(Gt(Se,S.id),dn({daemonMode:o.daemonMode,tool:c,parsedParams:s.parsedParams,providedSessionUuid:n.providedSessionUuid,implicitAutolockMcpSessionId:f})):Se,M=!1,Q=()=>{if(!M)M=!0,Le(),G.endExecution(S.id)},fe=mne(S.abortController.signal,a.signal),Le=d5(G,S.id,a.signal);return{execution:S,textState:C,getRequestDeadlineMs:T,requestSignal:fe,withRoutedSession:D,endExecutionOnce:Q}}function Sn(o,n){let{tool:s,providedSessionUuid:a,implicitAutolockMcpSessionId:d}=o;return a&&s.requiresDevice&&s.isDeviceReadOnlyCall?.(n.parsedParams)!==!0&&d?w.devicePoolWrites()?.beginMcpBind(d):void 0}async function yn(o,n){let s=eo(n.args,{daemonMode:o.daemonMode,acceptanceDiscoveryCapability:o.options.acceptanceDiscoveryCapability,sessionKey:o.options.requestMcpSessionId,trustForwardedSessionId:o.options.trustForwardedMcpSessionId===!0}),a=mn(o,n,s);if("failure"in a)return a.failure;let d=gn(o,a),c;try{c=fn(o,a,d,n.extra)}catch(m){if(m instanceof ZS)return iee(m);throw m}let u=Sn(a,d);return pn(o,{plan:{name:a.name,tool:a.tool,toolParams:a.toolParams,parsedParams:d.parsedParams,sessionId:a.bindingKey,bindingKey:a.bindingKey,context:s,options:o.options,sessionToolBinding:o.sessionToolBinding,execution:c.execution,implicitAutolockMcpSessionId:a.implicitAutolockMcpSessionId,routingSessionUuid:a.routingSessionUuid,handlerRoutingSessionUuid:d.handlerRoutingSessionUuid,routingBaseSessionUuid:a.selection.routingBaseSessionUuid,labelSessionUuids:a.selection.labelSessionUuids,connectionProfileUuid:a.selection.connectionProfileUuid,actionsCompactMetadata:a.selection.actionsCompactMetadata,providedSessionUuid:a.providedSessionUuid,executionSessionUuid:a.executionSessionUuid,textState:c.textState,getRequestDeadlineMs:c.getRequestDeadlineMs,requestSignal:c.requestSignal,progress:n.progress},toolResultsNoStructuredContent:a.selection.toolResultsNoStructuredContent,requestedEnableTools:d.requestedEnableTools,plainReadCall:d.plainReadCall,readOutsideBoundSession:a.readOutsideBoundSession,withRoutedSession:c.withRoutedSession,endExecutionOnce:c.endExecutionOnce,endExplicitSessionBindClaim:u})}function hn(o,n){let s=o?F.getTool(n.name):void 0;if(!s)return n;let a=F.resolveToolCallDeviceIds(s,n.args,n.extra.signal);return a instanceof Promise?a.then((d)=>({...n,args:d})):a===n.args?n:{...n,args:a}}function lo(o){return async(n)=>{try{let s=hn(o.daemonMode,n);return await yn(o,s instanceof Promise?await s:s)}catch(s){if(!Uy(s))throw s;return ea(s,{toolName:n.name,source:"MCP"})}}}var uo,Ce;function po(){return uo??=new G6({store:new K6}),uo}function Z8(){return Ce??=new II({sessions:()=>w.sessionManager()}),Ce}function Q8(){let o=Ce?.releaseAll()??0;if(Ce=void 0,o>0)e.info(`[TASKS] Released ${o} task-held session lease(s) for shutdown`);return o}function Rn(o){return({name:n})=>o.has(n)?{onCancel:"abort"}:void 0}var Tn=Rn(new Set(["startDevice","executePlan","installApp"])),mo=(o)=>o.name==="videoRecording"&&o.args.action==="stop"?{onCancel:"detach"}:Tn(o),Cn="mcp-task:";function En(o,n){if(!n.signal||!n.task)return o;return{...o,progressToken:void 0,progress:n.progress,extra:{...o.extra,signal:n.signal,_meta:void 0,envelope:void 0,executionScopeId:`${Cn}${n.task.taskId}`,sendNotification:async()=>{}}}}function go(o){return(n)=>{let s=o.eligibleTools(n);if(!s)return o.execute(n);let a=n.args.deviceId===void 0&&$E()&&PM(n.extra.envelope?.[Ir]);return x7({declared:fv({envelope:n.extra.envelope,meta:n.extra._meta}),ownerKey:o.ownerKey,taskManager:o.taskManager,toolName:n.name,onCancel:s.onCancel,...o.keepalive&&{keepalive:o.keepalive}},async(d)=>{let c=En(n,d),u=d.task;if(!u||!a)return o.execute(c);return YU(c,(m)=>o.execute(m),async({inputRequests:m})=>({responses:await u.requestInput(m)}),{recorder:UE,declared:zP(n.extra.envelope?.[Ir])})})}}var In=5000;class fo{lastSyncAt;inFlight;resyncIfStale(o,n=i){if(this.inFlight)return this.inFlight;if(this.lastSyncAt!==void 0&&n.now()-this.lastSyncAt<In)return Promise.resolve();this.lastSyncAt=n.now();let s=o().finally(()=>{this.inFlight=void 0});return this.inFlight=s,s}reset(){this.lastSyncAt=void 0,this.inFlight=void 0}}var Pn=new fo;function So(o,n=i){q.registerListRefresher("installed-apps",()=>Pn.resyncIfStale(o,n))}function Dn(o,n){return o.packageId===n.packageId&&o.versionCode===n.versionCode&&o.contentHash===n.contentHash}function Ee(o,n){return o?.some((s)=>Dn(s.buildKey,n))??!1}function ho(o,n){return{appId:o.appId,buildKey:n,currentScreen:o.currentScreen,nodes:o.nodes.map((s)=>({...s,inFilterBuild:Ee(s.provenance,n)})),edges:o.edges.map((s)=>{let a=Ee(s.provenance,n);return{...s,inFilterBuild:a,unverifiedForFilterBuild:(s.provenance?.length??0)>0&&!a}})}}function yo(o,n,s){let a=Ee(o,n),d=Ee(o,s);return a?d?"both":"onlyA":d?"onlyB":null}function bo(o,n,s){return{appId:o.appId,buildA:n,buildB:s,nodes:o.nodes.flatMap((a)=>{let d=yo(a.provenance,n,s);return d?[{...a,presence:d}]:[]}),edges:o.edges.flatMap((a)=>{let d=yo(a.provenance,n,s);return d?[{...a,presence:d}]:[]})}}class To{coverageRepository;navigationRepository;timer;constructor(o={}){this.coverageRepository=o.coverageRepository??Gne,this.navigationRepository=o.navigationRepository??new FD,this.timer=o.timer??i}async generateReport(o){e.info(`[TEST_COVERAGE] Generating coverage report for app: ${o}`);let n=await this.coverageRepository.getAggregatedCoverageAnalysis(o),s=await this.identifyCriticalGaps(o,n.uncoveredNodes,n.uncoveredEdges),a=this.generateRecommendations(n,s),d=await this.generateTestScenarios(o,s),c=n.totalNodes>0?n.coveredNodes/n.totalNodes*100:0,u=n.totalEdges>0?n.coveredEdges/n.totalEdges*100:0,m={appId:o,generatedAt:this.timer.now(),totalNodes:n.totalNodes,coveredNodes:n.coveredNodes,uncoveredNodes:n.uncoveredNodes.length,nodeCoveragePercent:c,totalEdges:n.totalEdges,coveredEdges:n.coveredEdges,uncoveredEdges:n.uncoveredEdges.length,edgeCoveragePercent:u,overallCoveragePercent:n.coveragePercentage,criticalGaps:s,recommendations:a,suggestedScenarios:d};return e.info(`[TEST_COVERAGE] Report generated: ${m.overallCoveragePercent.toFixed(1)}% overall coverage, ${m.criticalGaps.length} critical gaps identified`),m}async identifyCriticalGaps(o,n,s){let a=[],d=await this.navigationRepository.getNodes(o),c=await this.navigationRepository.getEdges(o),u=this.buildGraphAnalysis(d,c),m=Math.max(...d.map((p)=>p.visit_count),1);for(let p of n){let f=u.inEdgesByScreen.get(p.screen_name)??[],S=u.outEdgesByScreen.get(p.screen_name)??[],h=f.length+S.length,R=this.getNodeDepth(p.screen_name,u),C=p.visit_count/m*50,T=R>0?1/R*50:25,D=C+T;a.push({type:"node",id:p.id,screenName:p.screen_name,criticalityScore:D,recommendation:this.generateNodeRecommendation(p,R,h)})}for(let p of s){let f=u.nodeByScreen.get(p.from_screen),S=u.nodeByScreen.get(p.to_screen);if(!f||!S)continue;let h=this.getNodeDepth(p.from_screen,u),C=(f.visit_count+S.visit_count)/2/m*50,T=h>0?1/h*50:25,D=C+T;a.push({type:"edge",id:p.id,fromScreen:p.from_screen,toScreen:p.to_screen,criticalityScore:D,recommendation:this.generateEdgeRecommendation(p,h)})}return a.sort((p,f)=>f.criticalityScore-p.criticalityScore),a}buildGraphAnalysis(o,n){let s=new Map,a=new Map,d=new Map,c=new Set,u=new Map;for(let p of o)s.set(p.screen_name,p);for(let p of n){c.add(p.from_screen),c.add(p.to_screen),u.set(p.to_screen,(u.get(p.to_screen)??0)+1);let f=d.get(p.from_screen)??[];f.push(p),d.set(p.from_screen,f);let S=a.get(p.to_screen)??[];S.push(p),a.set(p.to_screen,S)}let m=[];for(let p of c)if((u.get(p)??0)===0)m.push(p);return{nodeByScreen:s,inEdgesByScreen:a,outEdgesByScreen:d,depthsByScreen:this.calculateDepthsFromEntryPoints(m,d),hasEntryPoints:m.length>0}}calculateDepthsFromEntryPoints(o,n){let s=new Map,a=[];for(let c of o)s.set(c,0),a.push({screen:c,depth:0});let d=0;while(d<a.length){let{screen:c,depth:u}=a[d++],m=n.get(c)??[];for(let p of m)if(!s.has(p.to_screen)){let f=u+1;s.set(p.to_screen,f),a.push({screen:p.to_screen,depth:f})}}return s}getNodeDepth(o,n){if(!n.hasEntryPoints)return 1;return n.depthsByScreen.get(o)??99}generateNodeRecommendation(o,n,s){let a=o.visit_count>1?`${o.visit_count} visits`:"1 visit",d=n<=2?"shallow":n<=4?"medium":"deep";return`Screen "${o.screen_name}" (${a}, ${d} in navigation tree, ${s} connections) has not been tested. Add test coverage to verify functionality.`}generateEdgeRecommendation(o,n){let s=n<=2?"shallow":n<=4?"medium":"deep",a=o.tool_name?` via ${o.tool_name}`:"";return`Transition from "${o.from_screen}" to "${o.to_screen}"${a} (${s} in navigation tree) has not been tested. Add test coverage for this user journey.`}generateRecommendations(o,n){let s=[];if(o.coveragePercentage<50)s.push(`Overall coverage is ${o.coveragePercentage.toFixed(1)}% - significantly increase test coverage across the application.`);else if(o.coveragePercentage<80)s.push(`Overall coverage is ${o.coveragePercentage.toFixed(1)}% - add tests for critical user journeys to reach 80%+ coverage.`);else s.push(`Overall coverage is ${o.coveragePercentage.toFixed(1)}% - focus on edge cases and less common user flows.`);let a=o.totalNodes>0?o.coveredNodes/o.totalNodes*100:0,d=o.totalEdges>0?o.coveredEdges/o.totalEdges*100:0;if(a-d>20)s.push(`Node coverage (${a.toFixed(1)}%) is significantly higher than edge coverage (${d.toFixed(1)}%). Focus on testing transitions and user journeys between screens.`);else if(d-a>20)s.push(`Edge coverage (${d.toFixed(1)}%) is higher than node coverage (${a.toFixed(1)}%). Ensure all screens are visited during tests.`);let c=n.filter((u)=>u.criticalityScore>60);if(c.length>0)s.push(`${c.length} high-priority coverage gap(s) identified in frequently-used, shallow screens. Prioritize testing these areas.`);if(o.uncoveredNodes.length>0){let u=o.uncoveredNodes.slice(0,3).map((m)=>m.screen_name).join(", ");s.push(`${o.uncoveredNodes.length} screen(s) have no test coverage. Top uncovered: ${u}`)}return s}async generateTestScenarios(o,n){let s=[],a=n.filter((c)=>c.criticalityScore>60),d=n.filter((c)=>c.criticalityScore>30&&c.criticalityScore<=60);if(a.length>0){let c=a.filter((m)=>m.type==="node"),u=a.filter((m)=>m.type==="edge");if(c.length>0)s.push({title:"Cover Critical Screens",description:`Test ${c.length} frequently-accessed screen(s) that currently have no coverage. These are shallow in the navigation tree and likely part of core user journeys.`,priority:"high",targetScreens:c.map((m)=>m.screenName),estimatedCoverageImprovement:c.length/(n.length||1)*100});if(u.length>0){let m=new Set;u.forEach((p)=>{if(p.fromScreen)m.add(p.fromScreen);if(p.toScreen)m.add(p.toScreen)}),s.push({title:"Test Critical User Journeys",description:`Test ${u.length} common navigation path(s) between screens. These transitions are frequently used but not covered by tests.`,priority:"high",targetScreens:Array.from(m),estimatedCoverageImprovement:u.length/(n.length||1)*100})}}if(d.length>0&&s.length<3){let c=d.filter((u)=>u.type==="node");if(c.length>0)s.push({title:"Expand Screen Coverage",description:`Add tests for ${c.length} additional screen(s) to improve overall coverage. These are moderately important screens in the navigation flow.`,priority:"medium",targetScreens:c.slice(0,5).map((u)=>u.screenName),estimatedCoverageImprovement:c.length/(n.length||1)*100})}return s.slice(0,5)}}var Co=new To;var I={APPS:"automobile:navigation/apps",GRAPH:"automobile:navigation/graph",GRAPH_WITH_APP_ID:"automobile:navigation/graph?appId={appId}",GRAPH_BUILD_FILTER:"automobile:navigation/graph/build-filter?appId={appId}&versionCode={versionCode}&contentHash={contentHash}",GRAPH_BUILD_DIFF:"automobile:navigation/graph/build-diff?appId={appId}&versionCodeA={versionCodeA}&contentHashA={contentHashA}&versionCodeB={versionCodeB}&contentHashB={contentHashB}",NODE_BY_ID:"automobile:navigation/nodes/{nodeId}",NODE_BY_ID_WITH_APP_ID:"automobile:navigation/nodes/{nodeId}?appId={appId}",NODE_BY_SCREEN:"automobile:navigation/nodes?screen={screenName}",NODE_SCREENSHOT:"automobile:navigation/nodes/{nodeId}/screenshot",NODE_SCREENSHOT_WITH_APP_ID:"automobile:navigation/nodes/{nodeId}/screenshot?appId={appId}",HISTORY:"automobile:navigation/history",HISTORY_WITH_CURSOR:"automobile:navigation/history?cursor={cursor}",HISTORY_WITH_LIMIT:"automobile:navigation/history?limit={limit}",HISTORY_WITH_CURSOR_AND_LIMIT:"automobile:navigation/history?cursor={cursor}&limit={limit}",TEST_COVERAGE:"automobile:navigation/test-coverage"},An=1000;function _(o){if(!o)return;try{return decodeURIComponent(o).trim()}catch(n){return e.debug(`[NavigationResources] param decode failed for '${o}': ${n}`),o.trim()}}var Xe=null;function xo(o=w){return o.sessionManager()?.getAllSessions()??[]}function xn(o,n=!0){if(n&&o?.sessionUuid)return he.getInstanceForSession(o.sessionUuid);let s=xo();if(n&&s.length>1)throw Error("Multiple device sessions are active. Read from a session-bound connection or use an app-scoped ?appId= URI where supported.");if(s.length===1)return he.getInstanceForSession(s[0].sessionId);return he.getInstance()}function U(o,n=!0){return Xe??xn(o,n)}var Eo=null,pe=new Map;function Ze(o){if(pe.has(o))return;pe.set(o,i.setTimeout(()=>{pe.delete(o);let n=o?xo():[],s=n.length===1?n[0].sessionId:void 0;q.notifyResourcesUpdated([I.APPS,I.GRAPH,I.HISTORY],o,s).catch((a)=>{e.warn("[NavigationResources] Failed to notify navigation updates",a)})},An))}function wn(o){let n=Eo;if(n!==o){let s=pe.get(void 0);if(s!==void 0)i.clearTimeout(s),pe.delete(void 0)}if(n?.removeGraphUpdateListener)n.removeGraphUpdateListener(Ze);else if(n?.setGraphUpdateListener)n.setGraphUpdateListener(null);if(Eo=o,o.setGraphUpdateListener)o.setGraphUpdateListener(Ze)}var kn=null;function Mn(){return kn??Id.getInstance()}async function Io(o,n){let s=o?`automobile:navigation/graph?appId=${Qe(o)}`:I.GRAPH;try{let a,d=U(n,!o);if(o&&d.exportGraphSummaryForApp)a=await d.exportGraphSummaryForApp(o);else a=await d.exportGraphSummary();return{uri:s,mimeType:"application/json",text:JSON.stringify(a,null,2)}}catch(a){return e.error(`[NavigationResources] Failed to get navigation graph: ${a}`),{uri:s,mimeType:"application/json",text:JSON.stringify({error:`Failed to retrieve navigation graph: ${a}`},null,2)}}}function et(o,n){let s=Number(_(o));if(!Number.isFinite(s))throw Error(`Invalid ${n}: ${o}`);return s}function wo(o,n){return{uri:o,mimeType:"application/json",text:JSON.stringify({error:n},null,2)}}async function On(o){let n=xi(o)??I.GRAPH_BUILD_FILTER;try{let s=_(o.appId);if(!s)throw Error("App ID is required.");let a={packageId:s,versionCode:et(o.versionCode,"versionCode"),contentHash:_(o.contentHash)??""},d=U(void 0,!1),c=await(d.exportGraphSummaryForApp?.(s)??d.exportGraphSummary());return{uri:n,mimeType:"application/json",text:JSON.stringify(ho(c,a),null,2)}}catch(s){return e.error(`[NavigationResources] Failed to get build-filtered navigation graph: ${s}`),wo(n,`Failed to retrieve build-filtered navigation graph: ${s}`)}}async function _n(o){let n=xi(o)??I.GRAPH_BUILD_DIFF;try{let s=_(o.appId);if(!s)throw Error("App ID is required.");let a={packageId:s,versionCode:et(o.versionCodeA,"versionCodeA"),contentHash:_(o.contentHashA)??""},d={packageId:s,versionCode:et(o.versionCodeB,"versionCodeB"),contentHash:_(o.contentHashB)??""},c=U(void 0,!1),u=await(c.exportGraphSummaryForApp?.(s)??c.exportGraphSummary());return{uri:n,mimeType:"application/json",text:JSON.stringify(bo(u,a,d),null,2)}}catch(s){return e.error(`[NavigationResources] Failed to get build diff navigation graph: ${s}`),wo(n,`Failed to retrieve build diff navigation graph: ${s}`)}}async function Un(){let o=I.APPS;try{let s={apps:await U(void 0,!1).listAppsWithGraph()};return{uri:o,mimeType:"application/json",text:JSON.stringify(s,null,2)}}catch(n){return e.error(`[NavigationResources] Failed to list apps with navigation graph: ${n}`),{uri:o,mimeType:"application/json",text:JSON.stringify({error:`Failed to list apps with navigation graph: ${n}`},null,2)}}}async function Po(o,n={},s){try{let a=await U(s).exportGraphHistory(n);return{uri:o,mimeType:"application/json",text:JSON.stringify(a,null,2)}}catch(a){return e.error(`[NavigationResources] Failed to get navigation history: ${a}`),{uri:o,mimeType:"application/json",text:JSON.stringify({error:`Failed to retrieve navigation history: ${a}`},null,2)}}}function X(o,n){return{uri:o,mimeType:"application/json",text:JSON.stringify({error:n},null,2)}}async function Do(o,n,s){let a=n?`automobile:navigation/nodes/${o}?appId=${Qe(n)}`:`automobile:navigation/nodes/${o}`;try{let d=await U(s,!n).getNodeResourceById(o,n);if(!d)return X(a,`Navigation node ${o} not found.`);return{uri:a,mimeType:"application/json",text:JSON.stringify(d,null,2)}}catch(d){return e.error(`[NavigationResources] Failed to get navigation node ${o}: ${d}`),X(a,`Failed to retrieve navigation node ${o}: ${d}`)}}async function Fn(o,n){let s=`automobile:navigation/nodes?screen=${Qe(o)}`;try{let a=await U(n).getNodeResourceByScreen(o);if(!a)return X(s,`Navigation node for screen '${o}' not found.`);return{uri:s,mimeType:"application/json",text:JSON.stringify(a,null,2)}}catch(a){return e.error(`[NavigationResources] Failed to get navigation node '${o}': ${a}`),X(s,`Failed to retrieve navigation node '${o}': ${a}`)}}function Ln(o){let n=_(o.cursor)??"",s=_(o.limit)??"",a=n||void 0;if(!s)return{cursor:a};let d=Number(s);if(!Number.isFinite(d)||d<=0)throw Error(`Invalid history limit: ${o.limit}`);return{cursor:a,limit:Math.floor(d)}}async function Ao(o,n,s){let a=TR(o,n);try{let d=U(s,!n),c=n??d.getCurrentAppId();if(!c)return{uri:a,mimeType:"application/json",text:JSON.stringify({error:"No current app set."},null,2)};let u=await d.getNodeResourceById(o,c);if(!u||!u.node)return{uri:a,mimeType:"application/json",text:JSON.stringify({error:`Navigation node ${o} not found.`},null,2)};let m=Mn(),p=await m.findExistingScreenshot(c,u.node.screenName);if(!p)return{uri:a,mimeType:"application/json",text:JSON.stringify({error:`No screenshot available for node ${o}.`},null,2)};let f=await m.readScreenshot(p);if(!f)return{uri:a,mimeType:"application/json",text:JSON.stringify({error:`Screenshot file not found for node ${o}.`},null,2)};return{uri:a,mimeType:"image/webp",blob:f.toString("base64")}}catch(d){return e.error(`[NavigationResources] Failed to get screenshot for node ${o}: ${d}`),{uri:a,mimeType:"application/json",text:JSON.stringify({error:`Failed to retrieve screenshot: ${d}`},null,2)}}}function Bn(){q.register(I.APPS,"Navigation Apps",{description:"Apps that have a persisted navigation graph (appId, displayName, lastUpdated). No connected device required.",mimeType:"application/json",handler:()=>Un()}),q.register(I.GRAPH,"Navigation Graph",{description:"High-level navigation graph for the current app (nodes and edges). Use ?appId= to filter by specific app.",mimeType:"application/json",handler:(o)=>Io(void 0,o)}),q.registerTemplate(I.GRAPH_WITH_APP_ID,"Navigation Graph (App-Specific)",{description:"High-level navigation graph filtered by app ID.",mimeType:"application/json",handler:async(o)=>{let n=_(o.appId);return Io(n)}}),q.registerTemplate(I.GRAPH_BUILD_FILTER,"Navigation Graph (Build Filter)",{description:"App-union navigation graph annotated for one app build.",mimeType:"application/json",handler:On}),q.registerTemplate(I.GRAPH_BUILD_DIFF,"Navigation Graph (Build Diff)",{description:"Navigation nodes and edges reached by either of two app builds, with presence labels.",mimeType:"application/json",handler:_n})}function $n(){q.register(I.HISTORY,"Navigation History",{description:"Ordered navigation history for the current app (nodes and edges).",mimeType:"application/json",handler:(n)=>Po(I.HISTORY,{},n)});let o=async(n,s)=>{try{let{cursor:a,limit:d}=Ln(n),c=new URLSearchParams;if(a)c.set("cursor",a);if(d)c.set("limit",d.toString());let u=c.toString(),m=u?`${I.HISTORY}?${u}`:I.HISTORY;return Po(m,{cursor:a,limit:d},s)}catch(a){return e.error(`[NavigationResources] Failed to parse navigation history params: ${a}`),{uri:I.HISTORY,mimeType:"application/json",text:JSON.stringify({error:`Failed to retrieve navigation history: ${a}`},null,2)}}};q.registerTemplateWithReadContext(I.HISTORY_WITH_CURSOR_AND_LIMIT,"Navigation History",{description:"Ordered navigation history with pagination support.",mimeType:"application/json",handler:o}),q.registerTemplateWithReadContext(I.HISTORY_WITH_CURSOR,"Navigation History",{description:"Ordered navigation history with pagination support.",mimeType:"application/json",handler:o}),q.registerTemplateWithReadContext(I.HISTORY_WITH_LIMIT,"Navigation History",{description:"Ordered navigation history with pagination support.",mimeType:"application/json",handler:o})}function qn(){q.registerTemplate(I.NODE_BY_ID_WITH_APP_ID,"Navigation Graph Node (App-Specific)",{description:"Detailed navigation graph node by node ID, resolved under a specific app ID.",mimeType:"application/json",handler:async(o)=>{let n=Number(o.nodeId),s=_(o.appId);if(!Number.isFinite(n))return X(`automobile:navigation/nodes/${o.nodeId}`,`Invalid navigation node id: ${o.nodeId}`);return Do(n,s)}}),q.registerTemplateWithReadContext(I.NODE_BY_ID,"Navigation Graph Node",{description:"Detailed navigation graph node by node ID, including relationships.",mimeType:"application/json",handler:async(o,n)=>{let s=Number(o.nodeId);if(!Number.isFinite(s))return X(`automobile:navigation/nodes/${o.nodeId}`,`Invalid navigation node id: ${o.nodeId}`);return Do(s,void 0,n)}}),q.registerTemplateWithReadContext(I.NODE_BY_SCREEN,"Navigation Graph Node (Screen)",{description:"Detailed navigation graph node by screen name, including relationships.",mimeType:"application/json",handler:async(o,n)=>{let s=_(o.screenName)??"";if(!s)return X("automobile:navigation/nodes?screen=","Screen name is required.");return Fn(s,n)}}),q.registerTemplate(I.NODE_SCREENSHOT_WITH_APP_ID,"Navigation Node Screenshot (App-Specific)",{description:"Screenshot thumbnail for a navigation graph node, resolved under a specific app ID (WebP image).",mimeType:"image/webp",handler:async(o)=>{let n=Number(o.nodeId),s=_(o.appId);if(!Number.isFinite(n))return{uri:`automobile:navigation/nodes/${o.nodeId}/screenshot`,mimeType:"application/json",text:JSON.stringify({error:`Invalid node id: ${o.nodeId}`},null,2)};return Ao(n,s)}}),q.registerTemplateWithReadContext(I.NODE_SCREENSHOT,"Navigation Node Screenshot",{description:"Screenshot thumbnail for a navigation graph node (WebP image).",mimeType:"image/webp",handler:async(o,n)=>{let s=Number(o.nodeId);if(!Number.isFinite(s))return{uri:`automobile:navigation/nodes/${o.nodeId}/screenshot`,mimeType:"application/json",text:JSON.stringify({error:`Invalid node id: ${o.nodeId}`},null,2)};return Ao(s,void 0,n)}})}function No(o={}){if(o.navigationGraph)Xe=o.navigationGraph;wn(Xe??he.getInstance()),he.setSessionGraphUpdateListener(Ze),Bn(),$n(),qn(),q.register(I.TEST_COVERAGE,"Navigation Test Coverage Report",{description:"Comprehensive test coverage analysis for the navigation graph, including coverage metrics, critical gaps, and recommendations.",mimeType:"application/json",handler:async(n)=>{try{let s=(await U(n).exportGraphSummary()).appId;if(!s)return{uri:I.TEST_COVERAGE,mimeType:"application/json",text:JSON.stringify({error:"No current app set. Launch or observe an app first to enable test coverage tracking."},null,2)};let a=await Co.generateReport(s);return{uri:I.TEST_COVERAGE,mimeType:"application/json",text:JSON.stringify(a,null,2)}}catch(s){return e.error(`[NavigationResources] Failed to generate test coverage report: ${s}`),{uri:I.TEST_COVERAGE,mimeType:"application/json",text:JSON.stringify({error:`Failed to generate test coverage report: ${s}`},null,2)}}}}),e.info("[NavigationResources] Registered navigation graph resources including test coverage")}var jn=qG,Hn=1000,Kn=1,ko=5000,Vn=new XP;function Gn(o,n){if(n.deviceId)o.deviceId=n.deviceId;if(n.deviceName)o.deviceName=n.deviceName;if(n.devicePlatform)o.devicePlatform=n.devicePlatform;if(n.deviceType)o.deviceType=n.deviceType}function Jn(o){let n={};if(o.testClass)n.testClass=o.testClass;if(o.testMethod)n.testMethod=o.testMethod;if(Gn(n,o),o.appVersion)n.appVersion=o.appVersion;if(o.gitCommit)n.gitCommit=o.gitCommit;if(o.targetSdk!==void 0)n.targetSdk=o.targetSdk;if(o.jdkVersion)n.jdkVersion=o.jdkVersion;if(o.jvmTarget)n.jvmTarget=o.jvmTarget;if(o.gradleVersion)n.gradleVersion=o.gradleVersion;if(typeof o.isCi==="boolean")n.isCi=o.isCi;if(o.sessionUuid)n.sessionUuid=o.sessionUuid;return n}async function Mo(o,n=Vn){let s=o.lookbackDays??jn,a=o.limit??Hn,d=o.minSamples??Kn,c={lookbackDays:s,limit:a,minSamples:d,orderBy:o.orderBy,orderDirection:o.orderDirection,testClass:o.testClass,testMethod:o.testMethod,deviceId:o.deviceId,deviceName:o.deviceName,devicePlatform:o.devicePlatform,deviceType:o.deviceType,appVersion:o.appVersion,gitCommit:o.gitCommit,targetSdk:o.targetSdk,jdkVersion:o.jdkVersion,jvmTarget:o.jvmTarget,gradleVersion:o.gradleVersion,isCi:o.isCi,sessionUuid:o.sessionUuid},u=await n.getTimingStats(c),m=u.reduce((f,S)=>f+S.sampleSize,0),p=Jn(o);return{testTimings:u.map((f)=>({testClass:f.testClass,testMethod:f.testMethod,averageDurationMs:f.averageDurationMs,sampleSize:f.sampleSize,lastRunTimestampMs:f.lastRunTimestampMs||null,lastRun:f.lastRunTimestampMs?new Date(f.lastRunTimestampMs).toISOString():null,successRate:f.sampleSize>0?Number((f.passedCount/f.sampleSize).toFixed(4)):0,failureRate:f.sampleSize>0?Number((f.failedCount/f.sampleSize).toFixed(4)):0,stdDevDurationMs:f.stdDevDurationMs,statusCounts:{passed:f.passedCount,failed:f.failedCount,skipped:f.skippedCount}})),generatedAt:new Date().toISOString(),totalTests:u.length,totalSamples:m,aggregation:{strategy:"mean",lookbackDays:s,minSamples:d,limit:a,orderBy:c.orderBy??"lastRun",orderDirection:c.orderDirection??"desc"},filters:p}}var se={BASE:"automobile:test-timings"},zn=`${se.BASE}?{params}`,Wn=new Set(["lookbackDays","limit","minSamples","orderBy","orderDirection","testClass","testMethod","deviceId","deviceName","devicePlatform","deviceType","appVersion","gitCommit","targetSdk","jdkVersion","jvmTarget","gradleVersion","isCi","sessionUuid"]);function Yn(o){let n=Object.keys(o).filter((s)=>!Wn.has(s));if(n.length>0)throw Error(`Unknown query parameters: ${n.join(", ")}`);return{lookbackDays:zd(o.lookbackDays,"lookbackDays",{min:1}),limit:zd(o.limit,"limit",{min:1,max:ko}),minSamples:zd(o.minSamples,"minSamples",{min:0}),orderBy:Gf(o.orderBy,"orderBy",["lastRun","averageDuration","sampleSize"]),orderDirection:Gf(o.orderDirection,"orderDirection",["asc","desc"]),testClass:is(o.testClass),testMethod:is(o.testMethod),deviceId:is(o.deviceId),deviceName:is(o.deviceName),devicePlatform:Gf(o.devicePlatform,"devicePlatform",["android","ios"]),deviceType:Gf(o.deviceType,"deviceType",["emulator","simulator","device"]),appVersion:is(o.appVersion),gitCommit:is(o.gitCommit),targetSdk:zd(o.targetSdk,"targetSdk",{min:1}),jdkVersion:is(o.jdkVersion),jvmTarget:is(o.jvmTarget),gradleVersion:is(o.gradleVersion),isCi:o1(o.isCi,"isCi"),sessionUuid:is(o.sessionUuid)}}function Qn(o,n){if(n.deviceId)o.set("deviceId",n.deviceId);if(n.deviceName)o.set("deviceName",n.deviceName);if(n.devicePlatform)o.set("devicePlatform",n.devicePlatform);if(n.deviceType)o.set("deviceType",n.deviceType)}function Xn(o,n){if(n.appVersion)o.set("appVersion",n.appVersion);if(n.gitCommit)o.set("gitCommit",n.gitCommit);if(n.targetSdk!==void 0)o.set("targetSdk",n.targetSdk.toString());if(n.jdkVersion)o.set("jdkVersion",n.jdkVersion);if(n.jvmTarget)o.set("jvmTarget",n.jvmTarget);if(n.gradleVersion)o.set("gradleVersion",n.gradleVersion);if(typeof n.isCi==="boolean")o.set("isCi",n.isCi.toString());if(n.sessionUuid)o.set("sessionUuid",n.sessionUuid)}function Zn(o){let n=new URLSearchParams;if(o.lookbackDays!==void 0)n.set("lookbackDays",o.lookbackDays.toString());if(o.limit!==void 0)n.set("limit",o.limit.toString());if(o.minSamples!==void 0)n.set("minSamples",o.minSamples.toString());if(o.orderBy!==void 0)n.set("orderBy",o.orderBy);if(o.orderDirection!==void 0)n.set("orderDirection",o.orderDirection);if(o.testClass)n.set("testClass",o.testClass);if(o.testMethod)n.set("testMethod",o.testMethod);Qn(n,o),Xn(n,o);let s=n.toString();return s?`${se.BASE}?${s}`:se.BASE}async function Oo(o,n){try{let s=await Mo(o);return{uri:n,mimeType:"application/json",text:JSON.stringify(s,null,2)}}catch(s){return e.error(`[TestTimingResources] Failed to get test timing data: ${s}`),{uri:n,mimeType:"application/json",text:JSON.stringify({error:`Failed to retrieve test timing data: ${s}`},null,2)}}}function _o(){q.register(se.BASE,"Test Timing History",{description:"Historical aggregated test execution timing statistics.",mimeType:"application/json",handler:()=>Oo({},se.BASE)}),q.registerTemplate(zn,"Test Timing History",{description:"Historical aggregated test execution timing statistics.",mimeType:"application/json",handler:async(o)=>{try{let n=s1(o.params??""),s=Yn(n),a=Zn(s);return Oo(s,a)}catch(n){return e.error(`[TestTimingResources] Failed to parse query params: ${n}`),{uri:se.BASE,mimeType:"application/json",text:JSON.stringify({error:`Invalid test timing query parameters: ${n}`},null,2)}}}}),e.info("[TestTimingResources] Registered test timing resources")}var ae={BASE:"automobile:test-runs"},es=100,ts=500,os=30,rs=`${ae.BASE}?{params}`,ns=new Set(["lookbackDays","limit","testClass","testMethod","deviceId","orderDirection","latestOnly"]);function ss(o){let n=Object.keys(o).filter((s)=>!ns.has(s));if(n.length>0)throw Error(`Unknown query parameters: ${n.join(", ")}`);return{lookbackDays:zd(o.lookbackDays,"lookbackDays",{min:1}),limit:zd(o.limit,"limit",{min:1,max:ts}),testClass:is(o.testClass),testMethod:is(o.testMethod),deviceId:is(o.deviceId),orderDirection:Gf(o.orderDirection,"orderDirection",["asc","desc"]),latestOnly:o1(o.latestOnly,"latestOnly")}}function as(o){let n=new URLSearchParams;if(o.lookbackDays!==void 0)n.set("lookbackDays",o.lookbackDays.toString());if(o.limit!==void 0)n.set("limit",o.limit.toString());if(o.testClass)n.set("testClass",o.testClass);if(o.testMethod)n.set("testMethod",o.testMethod);if(o.deviceId)n.set("deviceId",o.deviceId);if(o.orderDirection)n.set("orderDirection",o.orderDirection);if(o.latestOnly)n.set("latestOnly","true");let s=n.toString();return s?`${ae.BASE}?${s}`:ae.BASE}function ds(o,n){let a=`${o.testClass.split(".").pop()||o.testClass}.${o.testMethod}`;return{id:o.id,testClass:o.testClass,testMethod:o.testMethod,testName:a,status:o.status,startTime:o.startTime,durationMs:o.durationMs,deviceId:o.deviceId,deviceName:o.deviceName,platform:o.platform,errorMessage:o.errorMessage,videoPath:o.videoPath,snapshotPath:o.snapshotPath,steps:o.steps.map((d)=>({id:d.id,index:d.stepIndex,action:d.action,target:d.target,screenshotPath:d.screenshotPath,screenName:d.screenName,durationMs:d.durationMs,status:d.status,errorMessage:d.errorMessage,...d.details!==void 0?{details:d.details}:{}})),screensVisited:o.screensVisited,sampleSize:n}}function cs(o){let n={};if(o.testClass)n.testClass=o.testClass;if(o.testMethod)n.testMethod=o.testMethod;if(o.deviceId)n.deviceId=o.deviceId;return n}async function ls(o,n=new XP){let s=o.lookbackDays??os,a=o.limit??es,d=o.orderDirection??"desc",c=o.latestOnly??!0,u={lookbackDays:s,limit:c?a*5:a,testClass:o.testClass,testMethod:o.testMethod,deviceId:o.deviceId,orderDirection:d},m=await n.getTestRuns(u),p=new Map;for(let R of m){let C=`${R.testClass}::${R.testMethod}`;p.set(C,(p.get(C)||0)+1)}let f=m;if(c){let R=new Set;f=m.filter((C)=>{let T=`${C.testClass}::${C.testMethod}`;if(R.has(T))return!1;return R.add(T),!0}),f=f.slice(0,a)}let S=f.map((R)=>{let C=`${R.testClass}::${R.testMethod}`,T=p.get(C)||1;return ds(R,T)}),h=cs(o);return{testRuns:S,generatedAt:new Date().toISOString(),totalRuns:S.length,query:{lookbackDays:s,limit:a,orderDirection:d},filters:h}}async function Uo(o,n){try{let s=await ls(o);return{uri:n,mimeType:"application/json",text:JSON.stringify(s,null,2)}}catch(s){return e.error(`[TestRunResources] Failed to get test run data: ${s}`),{uri:n,mimeType:"application/json",text:JSON.stringify({error:`Failed to retrieve test run data: ${s}`},null,2)}}}function Fo(){q.register(ae.BASE,"Test Run History",{description:"Individual test run history with step-level details and screens visited.",mimeType:"application/json",handler:()=>Uo({},ae.BASE)}),q.registerTemplate(rs,"Test Run History",{description:"Individual test run history with step-level details and screens visited.",mimeType:"application/json",handler:async(o)=>{try{let n=s1(o.params??""),s=ss(n),a=as(s);return Uo(s,a)}catch(n){return e.error(`[TestRunResources] Failed to parse query params: ${n}`),{uri:ae.BASE,mimeType:"application/json",text:JSON.stringify({error:`Invalid test run query parameters: ${n}`},null,2)}}}}),e.info("[TestRunResources] Registered test run resources")}var us=50,ps=0,Bo=500,ms=new Ym,gs=new cN;function Lo(o){if(o===void 0||o===null)return;let n=new Date(o);if(Number.isNaN(n.getTime()))throw Error(`Invalid timestamp: ${o}`);return n.toISOString()}function fs(o){if(o.length===0)return null;let n=o[0],s=o[0];for(let a of o){if(a<n)n=a;if(a>s)s=a}return{start:n,end:s}}async function qo(o,n={auditRepository:ms,toolCallRepository:gs}){let s=Lo(o.startTime),a=Lo(o.endTime),d=o.limit??us,c=o.offset??ps,u=await n.auditRepository.listResults({startTime:s,endTime:a,limit:d,offset:c,deviceId:o.deviceId,deviceSessionUuid:o.deviceSessionUuid}),m=fs(u.results.map((f)=>f.timestamp)),p=m?await n.toolCallRepository.listToolNamesBetween(m.start,m.end):[];return{results:u.results,toolCalls:p,hasMore:u.hasMore,nextOffset:u.nextOffset,range:m?{startTime:m.start,endTime:m.end}:null}}var de={BASE:"automobile:performance-results"},Vo=["startTime","endTime","limit","offset","deviceId","deviceSessionUuid"],Ss=`${de.BASE}{?${Vo.join(",")}}`,ys=new Set(Vo);function jo(o,n,s={}){if(!o)return;let a=Number(o);if(!Number.isFinite(a)||!Number.isInteger(a))throw Error(`Invalid ${n}: ${o}`);let d=s.min??0;if(a<d)throw Error(`Invalid ${n}: ${o}`);if(s.max!==void 0&&a>s.max)throw Error(`Invalid ${n}: ${o}`);return a}function Ho(o,n){if(!o)return;let s=o.trim();if(!s)return;if(/^-?\d+$/.test(s)){let a=Number(s);if(!Number.isFinite(a))throw Error(`Invalid ${n}: ${o}`);return a}return s}function vs(o){let n=Object.keys(o).filter((p)=>!ys.has(p));if(n.length>0)throw Error(`Unknown query parameters: ${n.join(", ")}`);let s=Ho(o.startTime,"startTime"),a=Ho(o.endTime,"endTime"),d=o.limit?.trim(),c=o.offset?.trim(),u=o.deviceId?.trim(),m=o.deviceSessionUuid?.trim();return{startTime:s,endTime:a,limit:jo(d,"limit",{min:1,max:Bo}),offset:jo(c,"offset",{min:0}),deviceId:u||void 0,deviceSessionUuid:m||void 0}}function Rs(o){let n=new URLSearchParams;if(o.startTime!==void 0)n.set("startTime",String(o.startTime));if(o.endTime!==void 0)n.set("endTime",String(o.endTime));if(o.limit!==void 0)n.set("limit",o.limit.toString());if(o.offset!==void 0)n.set("offset",o.offset.toString());if(o.deviceId!==void 0)n.set("deviceId",o.deviceId);if(o.deviceSessionUuid!==void 0)n.set("deviceSessionUuid",o.deviceSessionUuid);let s=n.toString();return s?`${de.BASE}?${s}`:de.BASE}async function Ko(o,n){try{let s=await qo(o);return{uri:n,mimeType:"application/json",text:JSON.stringify(s,null,2)}}catch(s){return e.error(`[PerformanceResources] Failed to get performance audit results: ${s}`),{uri:n,mimeType:"application/json",text:JSON.stringify({error:`Failed to retrieve performance audit results: ${s}`},null,2)}}}function Go(){q.register(de.BASE,"Performance Results",{description:"List UI performance audit results from the local database.",mimeType:"application/json",handler:()=>Ko({},de.BASE)}),q.registerTemplate(Ss,"Performance Results",{description:"List UI performance audit results from the local database.",mimeType:"application/json",handler:async(o)=>{try{let n=vs(o),s=Rs(n);return Ko(n,s)}catch(n){return e.error(`[PerformanceResources] Failed to parse query params: ${n}`),{uri:de.BASE,mimeType:"application/json",text:JSON.stringify({error:`Invalid performance query parameters: ${n}`},null,2)}}}}),e.info("[PerformanceResources] Registered performance resources")}import*as Jo from"fs/promises";function bs(o,n){return jae(n,o,()=>Error(`Refusing to read recording file outside the archive root: ${o}`))}var Ie={lookupLatest:CX,getById:np,list:xX,readFile:Jo.readFile,get archiveRoot(){return Je(vn.VIDEO_ARCHIVE)}};function Ts(o){if(o.format==="mp4")return"video/mp4";if(o.format==="mov")return"video/quicktime";return"application/octet-stream"}function Es(o){let n=o.status==="interrupted"?"was interrupted and has no file":"has no file on disk any more";return`No playable video recording is available: the newest recording ${o.recordingId} ${n}.`}function Is(o){return o instanceof Error&&"code"in o&&o.code==="ENOENT"}async function zo(o,n,s=Ie){if(!o.filePath)return{uri:n,mimeType:"application/json",text:JSON.stringify({error:`Missing file path for recording ${o.recordingId}`,metadata:o},null,2)};try{let a=bs(o.filePath,s.archiveRoot),c=(await s.readFile(a)).toString("base64");return{uri:n,mimeType:Ts(o),text:JSON.stringify({metadata:o},null,2),blob:c}}catch(a){e.error(`[VideoRecordingResources] Failed to read video ${o.recordingId}: ${a}`);let d=`Recording ${o.recordingId} has no video file on disk (${o.sizeBytes===0?"it was interrupted before a file was saved":"the file was deleted or moved"})`;return{uri:n,mimeType:"application/json",text:JSON.stringify({error:`Failed to read video data: ${Is(a)?d:a}`,metadata:o},null,2)}}}async function Ps(o=Ie){try{let{recording:n,newestWithoutFile:s}=await o.lookupLatest();if(!n)return{uri:jd.LATEST,mimeType:"application/json",text:JSON.stringify(s?{error:Es(s),newestRecording:s}:{error:'No video recordings available. Call videoRecording with action "start" first.'},null,2)};let a=await o.getById(n.recordingId,{touch:!0})??n;return zo(a,jd.LATEST,o)}catch(n){return e.error(`[VideoRecordingResources] Failed to get latest recording: ${n}`),{uri:jd.LATEST,mimeType:"application/json",text:JSON.stringify({error:`Failed to retrieve latest recording: ${n}`},null,2)}}}async function Ds(o=Ie){try{let n=await o.list();return{uri:jd.ARCHIVE,mimeType:"application/json",text:JSON.stringify({recordings:n,count:n.length},null,2)}}catch(n){return e.error(`[VideoRecordingResources] Failed to list recordings: ${n}`),{uri:jd.ARCHIVE,mimeType:"application/json",text:JSON.stringify({error:`Failed to list recordings: ${n}`},null,2)}}}async function As(o,n=Ie){try{let s=o.recordingId;if(!s)return{uri:jd.ARCHIVE_ITEM,mimeType:"application/json",text:JSON.stringify({error:"Recording ID is required."},null,2)};let a=await n.getById(s,{touch:!0});if(!a)return{uri:ZM(s),mimeType:"application/json",text:JSON.stringify({error:`Recording not found: ${s}`},null,2)};return zo(a,ZM(s),n)}catch(s){return e.error(`[VideoRecordingResources] Failed to read recording: ${s}`),{uri:jd.ARCHIVE_ITEM,mimeType:"application/json",text:JSON.stringify({error:`Failed to retrieve recording: ${s}`},null,2)}}}function Wo(){q.register(jd.LATEST,"Latest Video Recording",{description:"The most recent video recording with metadata and base64-encoded video data.",mimeType:"video/mp4",handler:()=>Ps()}),q.register(jd.ARCHIVE,"Video Recording Archive",{description:"Metadata list for archived video recordings.",mimeType:"application/json",handler:()=>Ds()}),q.registerTemplate(jd.ARCHIVE_ITEM,"Video Recording",{description:"Video recording content and metadata for the specified recording ID.",mimeType:"video/mp4",handler:As}),e.info("[VideoRecordingResources] Registered video recording resources")}var xs={DEVICE_LOCALIZATION:"automobile:devices/{deviceId}/localization"};async function ws(o){return Cs(o,"LocalizationResources")}function Ns(o,n){return{deviceId:o.deviceId,platform:o.platform,locale:n.locale??null,timeZone:n.timeZone??null,textDirection:n.textDirection??null,timeFormat:n.timeFormat??null,calendarSystem:n.calendarSystem??null,lastUpdated:new Date().toISOString(),success:n.success,error:n.error}}async function ks(o,n=(s)=>new Xy(s)){let s=`automobile:devices/${o}/localization`,a=await ws(o);if(!a)return{uri:s,mimeType:"application/json",text:JSON.stringify({error:`Device not found or not booted: ${o}`},null,2)};let c=await n(a).getLocalizationSettings(),u=Ns(a,c);return{uri:s,mimeType:"application/json",text:JSON.stringify(u,null,2)}}function Yo(){q.registerTemplate(xs.DEVICE_LOCALIZATION,"Device Localization Settings",{description:"Current localization settings (locale, time zone, text direction, time format, calendar) for a device.",mimeType:"application/json",handler:async(o)=>ks(o.deviceId)}),e.info("[LocalizationResources] Registered localization resources")}async function Ms(){try{let{snapshots:o,count:n,totalSizeBytes:s,unsizedCount:a,pendingReclaimCount:d,orphanedAvdSnapshots:c}=await HX(),u=await qc();return{uri:fI.ARCHIVE,mimeType:"application/json",text:JSON.stringify({snapshots:o,count:n,totalSizeBytes:s,unsizedCount:a,pendingReclaimCount:d,orphanedAvdSnapshots:c,maxVmSnapshotsPerAvd:u.maxVmSnapshotsPerAvd,maxVmArchiveSizeMb:u.maxVmArchiveSizeMb??null,maxArchiveSizeMb:u.maxArchiveSizeMb},null,2)}}catch(o){return e.error(`[DeviceSnapshotResources] Failed to list snapshots: ${o}`),{uri:fI.ARCHIVE,mimeType:"application/json",text:JSON.stringify({error:`Failed to list snapshots: ${o}`},null,2)}}}function Qo(){q.register(fI.ARCHIVE,"Device Snapshot Archive",{description:"Metadata list for captured device snapshots.",mimeType:"application/json",handler:Ms}),e.info("[DeviceSnapshotResources] Registered device snapshot resources")}function Py(o,n){if(o===void 0||o===null)return;if(typeof o==="number"){if(!Number.isFinite(o)||o<0)throw Error(`Invalid ${n}: ${o}`);return o}if(typeof o==="string"){let s=o.trim();if(s==="")return;let a=Number(s);if(Number.isFinite(a)){if(a<0)throw Error(`Invalid ${n}: ${o}`);return a}let d=new Date(s);if(!Number.isNaN(d.getTime()))return d.getTime();throw Error(`Invalid ${n}: ${o}`)}throw Error(`Invalid ${n}: ${String(o)}`)}function HU(o,n){let s=Py(o,n);return s===void 0?void 0:new Date(s).toISOString()}function qU(o,n){if(o===void 0||o===null)return n;let s=typeof o==="number"?o:Number(o);if(!Number.isFinite(s)||!Number.isInteger(s)||s<=0)throw Error(`Invalid limit: ${String(o)}`);return Math.min(s,500)}function VU(o){if(o===void 0||o===null)return;let n=typeof o==="number"?o:Number(o);if(!Number.isFinite(n)||!Number.isInteger(n)||n<0)throw Error(`Invalid sinceId: ${String(o)}`);return n}var Xo=["minute","hour","day","week"],Zo=["1h","24h","3d","7d","30d"],Os={"1h":3600000,"24h":86400000,"3d":259200000,"7d":604800000,"30d":2592000000};function LE(o){return Os[o]}function WU(o){if(o===void 0||o===null)return"hour";if(typeof o!=="string")throw Error(`Invalid aggregation: ${String(o)}`);if(!Xo.includes(o))throw Error(`Invalid aggregation: ${o}. Must be one of: ${Xo.join(", ")}`);return o}function BE(o){if(o===void 0||o===null)return;if(typeof o!=="string")throw Error(`Invalid dateRange: ${String(o)}`);if(!Zo.includes(o))throw Error(`Invalid dateRange: ${o}. Must be one of: ${Zo.join(", ")}`);return o}var ce={BASE:"automobile:failures",TIMELINE:"automobile:failures/timeline"},_s=new gP;async function Us(o,n){try{let a={groups:await n.getFailureGroups(),generatedAt:new Date().toISOString()};return{uri:o,mimeType:"application/json",text:JSON.stringify(a,null,2)}}catch(s){return e.error(`[FailuresResources] Failed to get failures: ${s}`),{uri:o,mimeType:"application/json",text:JSON.stringify({error:`Failed to retrieve failures: ${s}`},null,2)}}}var tt=["dateRange","aggregation"],Fs=`${ce.TIMELINE}{?${tt.join(",")}}`,Ls=new Set(tt),Bs="24h";function $s(o){let n=Object.keys(o).filter((s)=>!Ls.has(s));if(n.length>0)throw Error(`Unknown query parameters: ${n.join(", ")}. Supported: ${tt.join(", ")}`);return{dateRange:er(o,"dateRange",BE)??Bs,aggregation:er(o,"aggregation",WU)}}function qs(o,n){let s=o?.indexOf("?")??-1;if(o===void 0||s<0)return;let a=o.slice(s+1).split("&").find((d)=>d.split("=",1)[0]===n);return a===void 0?void 0:a.slice(n.length+1)}function er(o,n,s){try{return s(o[n])}catch(a){let d=qs(xi(o),n);if(d!==void 0&&d!==o[n])s(d);throw a}}function tr(o,n){return{uri:o,mimeType:"application/json",text:JSON.stringify({error:n},null,2)}}async function js(o,n,s){let a;try{a=$s(o)}catch(d){return e.warn(`[FailuresResources] Invalid timeline query: ${r(d)}`),tr(xi(o)??ce.TIMELINE,r(d))}try{let{dateRange:d,aggregation:c}=a,u=s.now(),m=u-LE(d),p=await n.getTimelineData({startTime:m,endTime:u,aggregation:c}),f={dataPoints:p.dataPoints,dateRange:d,aggregation:c,previousPeriodTotals:p.previousPeriodTotals};return{uri:`${ce.TIMELINE}?dateRange=${d}&aggregation=${c}`,mimeType:"application/json",text:JSON.stringify(f,null,2)}}catch(d){return e.error(`[FailuresResources] Failed to get timeline: ${d}`),tr(ce.TIMELINE,`Failed to retrieve timeline: ${d}`)}}function or(o=_s,n=i){q.register(ce.BASE,"Failures",{description:"List all failure groups (crashes, ANRs, tool failures) with aggregated data.",mimeType:"application/json",handler:()=>Us(ce.BASE,o)}),q.registerTemplate(Fs,"Failures Timeline",{description:"Get timeline data for failures. Optional dateRange (1h, 24h, 3d, 7d, 30d; default 24h) and aggregation (minute, hour, day, week; default hour). Buckets and labels are UTC; weeks start Monday 00:00 UTC.",mimeType:"application/json",handler:(s)=>js(s,o,n)}),e.info("[FailuresResources] Registered failures resources")}var rr={FILES:"automobile:devices/{deviceId}/storage/{packageName}/files",ENTRIES:"automobile:devices/{deviceId}/storage/{packageName}/{fileName}/entries"},Pe={files:new Map,entries:new Map};function ir(o){let n=JSON.stringify(o),s=0;for(let a=0;a<n.length;a++){let d=n.charCodeAt(a);s=(s<<5)-s+d,s=s&s}return s.toString(16)}async function nr(o){return Cs(o,"StorageResources")}async function Hs(o,n,s={}){if(o.platform==="android")return(s.preferenceFilesClient?.(o)??E.getInstance(o,v)).listPreferenceFiles(n);else if(o.platform==="ios")return(s.preferenceFilesClient?.(o)??x.getInstance(o)).listPreferenceFiles(n);throw Error(`Unsupported platform: ${o.platform}`)}async function Ks(o,n,s,a={}){if(o.platform==="android"){let d=a.preferenceEntriesClient?.(o)??E.getInstance(o,v);try{return{entries:await d.getPreferenceEntries(n,s),source:"ctrlproxy"}}catch(c){if(!Vs(c))throw c;try{let u=(a.adbClientFactory??v).create(o),m=await $y(u,n).catch(AN),p=await Ky(u,n,SA(s),m);return{entries:await sZ(p),source:"run-as"}}catch(u){throw new t(`Failed to read Android SharedPreferences. CtrlProxy: ${r(c)}; run-as: ${r(u)}`,{cause:c})}}}else if(o.platform==="ios")return{entries:await(a.preferenceEntriesClient?.(o)??x.getInstance(o)).getPreferenceEntries(n,s),source:"ctrlproxy"};throw Error(`Unsupported platform: ${o.platform}`)}function Vs(o){return o instanceof gf||_y(o)||Sie(o)}function Gs(o,n){return`${o}:${n}`}function Js(o,n,s){return`${o}:${n}:${s}`}function sr(o){return{uri:xi(o)??"",mimeType:"application/json",text:JSON.stringify({error:"Malformed resource URI: a path segment is not valid percent-encoding."},null,2)}}function zs(o,n){return`automobile:devices/${o}/storage/${Qe(n)}/files`}function Ws(o,n,s){return`automobile:devices/${o}/storage/${Qe(n)}/${Qe(s)}/entries`}async function Ys(o,n={}){let{deviceId:s,packageName:a}=o,d=$o(a);if(d===null)return sr(o);let c=zs(s,d);e.info(`[StorageResources] getStorageFilesResource: deviceId=${s}, packageName=${d}`);try{let u=await nr(s);if(!u)return e.warn(`[StorageResources] Device not found: ${s}`),{uri:c,mimeType:"application/json",text:JSON.stringify({error:`Device not found or not booted: ${s}`},null,2)};e.info(`[StorageResources] Found device: ${u.deviceId} (${u.platform}), calling listPreferenceFiles`);let m=await Hs(u,d,n);e.info(`[StorageResources] listPreferenceFiles returned ${m.length} files`);let p=new Date().toISOString(),f=ir(m),S=Gs(s,d),h=Pe.files.get(S);if(h&&h.hash!==f)e.info(`[StorageResources] Storage files changed for ${d} on ${s}`),q.notifyResourceUpdated(c);return Pe.files.set(S,{files:m,lastUpdated:p,hash:f}),{uri:c,mimeType:"application/json",text:JSON.stringify({deviceId:s,packageName:d,platform:u.platform,files:m,totalCount:m.length,lastUpdated:p},null,2)}}catch(u){return e.error(`[StorageResources] Failed to list storage files: ${u}`),{uri:c,mimeType:"application/json",text:JSON.stringify({error:`Failed to list storage files: ${u}`,...kb(u)},null,2)}}}async function Qs(o,n={}){let{deviceId:s,packageName:a,fileName:d}=o,c=$o(a),u=$o(d);if(c===null||u===null)return sr(o);let m=Ws(s,c,u);try{let p=await nr(s);if(!p)return{uri:m,mimeType:"application/json",text:JSON.stringify({error:`Device not found or not booted: ${s}`},null,2)};let{entries:f,source:S}=await Ks(p,c,u,n),h=new Date().toISOString(),R=ir(f),C=Js(s,c,u),T=Pe.entries.get(C);if(T&&T.hash!==R)e.info(`[StorageResources] Storage entries changed for ${c}/${u} on ${s}`),q.notifyResourceUpdated(m);Pe.entries.set(C,{entries:f,lastUpdated:h,hash:R});let D=p.platform==="ios"?f.map((M)=>TA(M)?{...M,value:null,redacted:!0}:M):f;return{uri:m,mimeType:"application/json",text:JSON.stringify({deviceId:s,packageName:c,fileName:u,platform:p.platform,source:S,entries:D,totalCount:f.length,lastUpdated:h},null,2)}}catch(p){return e.error(`[StorageResources] Failed to get storage entries: ${p}`),{uri:m,mimeType:"application/json",text:JSON.stringify({error:`Failed to get storage entries: ${p}`,...kb(p instanceof t&&p.cause instanceof gf?p.cause:p)},null,2)}}}function dr(o={}){q.registerTemplate(rr.FILES,"App Storage Files",{description:"List all storage files in an app (Android SharedPreferences or iOS UserDefaults suites). Requires app to have AutoMobile SDK with storage inspection enabled.",mimeType:"application/json",handler:(n)=>Ys(n,o)}),q.registerTemplate(rr.ENTRIES,"Storage File Entries",{description:"Get all key-value entries from a storage file (Android SharedPreferences or iOS UserDefaults suite).",mimeType:"application/json",handler:(n)=>Qs(n,o)}),e.info("[StorageResources] Registered storage resources")}function Xs(o){let n=o.split(`
3
+ `).map((d)=>d.trim());if(n.find((d)=>d.startsWith("User 0:"))?.slice(7).trim().split(/\s+/).includes("installed=false"))return;let a=n.find((d)=>d.startsWith("pkgFlags=["));if(!a||!a.endsWith("]"))return;return a.slice(10,-1).trim().split(/\s+/).includes("DEBUGGABLE")}async function cr(o,n){try{let s=await o.executeCommand(`shell dumpsys package ${b(n)}`,{timeoutMs:5000,maxBuffer:ie});return Xs(s.stdout)}catch(s){e.warn("[DebuggableBuildProbe] Android package probe failed",s);return}}var De="simctl addmedia imports fixtures but exposes no supported bounded enumeration or read API for imported media.";function Ae(o,n="user_files"){let s=n==="user_files"||o==="android";return{list:s,read:s}}class ot{entries=new Map;accessCounter=0;get(o){let n=this.entries.get(lr(o));if(!n)return;return n.lastUsed=++this.accessCounter,n.sha256}set(o,n){let{deviceId:s,namespace:a,path:d}=o;for(let[c,u]of this.entries)if(u.deviceId===s&&u.namespace===a&&u.path===d)this.entries.delete(c);this.entries.set(lr(o),{deviceId:s,namespace:a,path:d,sha256:n,lastUsed:++this.accessCounter});while(this.entries.size>2048){let c,u=Number.POSITIVE_INFINITY;for(let[m,p]of this.entries)if(p.lastUsed<u)c=m,u=p.lastUsed;if(c===void 0)break;this.entries.delete(c)}}retainNamespacePaths(o,n,s){for(let[a,d]of this.entries)if(d.deviceId===o&&d.namespace===n&&!s.has(d.path))this.entries.delete(a)}}function lr({deviceId:o,namespace:n,path:s,byteCount:a,modifiedSeconds:d}){return JSON.stringify([o,n,s,a,d])}import{createHash as ta}from"crypto";import{posix as me}from"path";import{TextDecoder as oa}from"util";var ur={NAMESPACE:"automobile:devices/{deviceId}/downloads/{namespace}",FILE:"automobile:devices/{deviceId}/downloads/{namespace}/{path}"},pr={NAMESPACE:"automobile:devices/{deviceId}/storage-domains/user_files/{namespace}",FILE:"automobile:devices/{deviceId}/storage-domains/user_files/{namespace}/{path}"},mr={NAMESPACE:"automobile:devices/{deviceId}/storage-domains/media_library/{namespace}",FILE:"automobile:devices/{deviceId}/storage-domains/media_library/{namespace}/{path}"};function xe(o){return le(o).replace("/storage-domains/user_files/","/storage-domains/media_library/")}function Zs(o){return ZP(o).split("/").map((n)=>Qe(n)).join("/")}function Z(o){return gr(o,!1)}function le(o){return gr(o,!0)}function gr(o,n){let s=xy(o.namespace),a=`automobile:devices/${Qe(o.deviceId)}/${n?"storage-domains/user_files":"downloads"}/${Qe(s)}`;return o.path===void 0?a:`${a}/${Zs(o.path)}`}function rt(o){let n=xy(ac(o.namespace));return{deviceId:ac(o.deviceId),namespace:n,...o.path!==void 0?{path:ZP(ac(o.path))}:{}}}var ra=67108864,ia=120000,br="__AUTOMOBILE_NS_MISSING__",Tr="__AUTOMOBILE_FILE_MISSING__",na=24576,sa="Hash unavailable: file changed or disappeared during listing",nt=null;function eJ(){if(!nt)nt=aa();return nt}function aa(o={}){return new Cr(o.adbFactory??v,o.createUserResolver??((n)=>new _t(n)),o.deviceResolver??da,{hashCache:o.hashCache??new ot,iosFixtureReader:o.iosFixtureReader??new zM((n)=>new L(n),cS)})}async function da(o){return Cs(o,"SharedStorageReadService")}class Cr{adbFactory;createUserResolver;deviceResolver;describeReadCoverage(o,n="user_files"){return Ae(o,n)}hashCache;iosFixtureReader;constructor(o,n,s,{hashCache:a,iosFixtureReader:d}){this.adbFactory=o;this.createUserResolver=n;this.deviceResolver=s;this.hashCache=a,this.iosFixtureReader=d}async list(o){let n=xy(o.namespace),s={deviceId:o.deviceId,platform:"android",namespace:n,observation:"complete",files:[]},a=await this.deviceResolver(o.deviceId);if(!a)return{...s,observation:"unavailable",reason:Rr(o.deviceId)};s.platform=a.platform;let d=vr(a,o);if(d)return{...s,observation:"unsupported",reason:d};if(a.platform==="ios")return this.listIos(a,o,s);let c=this.adbFactory.create(a),u;try{u=await this.createUserResolver(c).resolve({explicitUserId:o.explicitUserId,currentUser:!0,signal:o.signal})}catch(f){return e.warn(`[SharedStorageRead] resolve user failed for list: ${r(f)}`,f),{...s,observation:"unavailable",reason:r(f)}}let m=hr(u.userId,n),p={...s,userId:u.userId,userSource:u.source,downloadsDirectory:m};try{let f=await st(c,ca(m),o.signal);if(f.trim()===br)return this.hashCache.retainNamespacePaths(o.deviceId,n,new Set),{...p,observation:"missing",reason:Ra(m)};let S=pa(f,m);this.hashCache.retainNamespacePaths(o.deviceId,n,new Set(S.map((R)=>R.absolutePath)));let h=await fa(c,S,o,{namespace:n,directory:m,cache:this.hashCache});return{...p,observation:"complete",files:ma(S,h,o.deviceId,n).map((R)=>({...R,resourceUri:yr(o)({deviceId:o.deviceId,namespace:n,path:R.path})}))}}catch(f){return e.warn(`[SharedStorageRead] list ${m} failed: ${r(f)}`,f),{...p,observation:"unavailable",reason:r(f)}}}async read(o){let n=xy(o.namespace),s=ZP(o.path),a={deviceId:o.deviceId,platform:"android",namespace:n,path:s,observation:"complete",resourceUri:yr(o)({deviceId:o.deviceId,namespace:n,path:s})},d=await this.deviceResolver(o.deviceId);if(!d)return{...a,observation:"unavailable",reason:Rr(o.deviceId)};if(a.platform=d.platform,d.platform==="ios"&&o.domain!=="media_library")a.resourceUri=le({deviceId:o.deviceId,namespace:n,path:s});let c=vr(d,o);if(c)return{...a,observation:"unsupported",reason:c};if(d.platform==="ios")return this.readIos(d,o,a);let u=this.adbFactory.create(d),m;try{m=await this.createUserResolver(u).resolve({explicitUserId:o.explicitUserId,currentUser:!0,signal:o.signal})}catch(S){return e.warn(`[SharedStorageRead] resolve user failed for read: ${r(S)}`,S),{...a,observation:"unavailable",reason:r(S)}}a.userId=m.userId;let p=hr(m.userId,n),f=me.join(p,s);if(f!==p&&!f.startsWith(`${p}/`))throw new t(`path escapes shared-storage namespace ${n}`);try{let S=await st(u,ua(f),o.signal);if(S.trim()===Tr)return{...a,observation:"missing",reason:ba(f)};let h=Buffer.from(S.replace(/\s+/g,""),"base64");return{...a,...fr(h,s)}}catch(S){return e.warn(`[SharedStorageRead] read ${f} failed: ${r(S)}`,S),{...a,observation:"unavailable",reason:r(S)}}}async listIos(o,n,s){try{let a=await this.iosFixtureReader.listNamespace(o,s.namespace,n.signal);return{...s,files:a.map((d)=>({path:d.path,name:d.name??me.basename(d.path),byteCount:d.byteCount,lastModified:d.lastModified,mimeType:dt(d.path),resourceUri:le({deviceId:o.deviceId,namespace:s.namespace,path:d.path})}))}}catch(a){return e.warn("[SharedStorageRead] iOS namespace list failed",a),{...s,observation:Sr(a)?"missing":"unavailable",reason:r(a)}}}async readIos(o,n,s){try{let a=await this.iosFixtureReader.readNamespaceFile(o,s.namespace,s.path,n.signal);return{...s,...fr(a,s.path)}}catch(a){return e.warn("[SharedStorageRead] iOS namespace read failed",a),{...s,observation:Sr(a)?"missing":"unavailable",reason:r(a)}}}}function fr(o,n){let s=ya(o);return{byteCount:o.byteLength,sha256:ta("sha256").update(o).digest("hex"),mimeType:dt(n)??(s===void 0?"application/octet-stream":"text/plain; charset=utf-8"),...s===void 0?{blob:o.toString("base64")}:{text:s}}}function Sr(o){return o instanceof Error&&"code"in o&&o.code==="ENOENT"}function yr(o){return o.domain==="media_library"?xe:Z}function vr(o,n){if(n.domain==="media_library"){if(o.platform==="ios")return De;if(xy(n.namespace)!=="automobile-media")return"Only the putAppFile automobile-media namespace supports media_library list/read."}if(o.platform==="ios"&&z(o)!=="simulator")return ha(o.platform);return}function hr(o,n){return me.join(`/storage/emulated/${o}/Download`,n)}function ca(o){return`if [ -d ${b(o)} ]; then find ${b(o)} -type f -exec stat -c '%s|%Y|%n' {} \\; ; else printf '%s' ${b(br)}; fi`}function la(o){return`sha256sum ${o.map((n)=>b(n)).join(" ")}`}function ua(o){return`if [ -f ${b(o)} ]; then base64 ${b(o)}; else printf '%s' ${b(Tr)}; fi`}async function st(o,n,s){return(await o.executeCommand(`shell ${n}`,{timeoutMs:ia,maxBuffer:ra,noRetry:!0,signal:s})).stdout}function pa(o,n){let s=`${n}/`;return o.split(/\n/).map((a)=>a.replace(/\r$/,"")).filter((a)=>a.length>0).map((a)=>{let d=a.indexOf("|"),c=a.indexOf("|",d+1);if(d<0||c<0)return null;let u=a.slice(c+1);if(!u.startsWith(s))return null;let m=u.slice(s.length),p=Number(a.slice(0,d)),f=Number(a.slice(d+1,c));if(!Number.isFinite(p)||!Number.isFinite(f))return null;return{path:m,absolutePath:u,byteCount:p,modifiedSeconds:f}}).filter((a)=>a!==null)}function ma(o,n,s,a){return o.map((d)=>{let c=dt(d.path),u=n.get(d.absolutePath);return{path:d.path,name:me.basename(d.path),byteCount:d.byteCount,...c?{mimeType:c}:{},...u?{sha256:u}:{sha256Unavailable:sa},lastModified:new Date(d.modifiedSeconds*1000).toISOString(),resourceUri:Z({deviceId:s,namespace:a,path:d.path})}})}function ga(o){let n=new Map;for(let s of o.split(/\n/)){let d=s.replace(/\r$/,"").match(/^([0-9a-f]{64}) (.*)$/);if(d)n.set(d[2],d[1].toLowerCase())}return n}async function fa(o,n,s,{namespace:a,directory:d,cache:c}){let u=new Map,m=(f)=>({deviceId:s.deviceId,namespace:a,path:f.absolutePath,byteCount:f.byteCount,modifiedSeconds:f.modifiedSeconds}),p=n.filter((f)=>{let S=c.get(m(f));if(S)u.set(f.absolutePath,S);return!S});for(let f of Sa(p)){let S;try{S=await st(o,la(f.map((R)=>R.absolutePath)),s.signal)}catch(R){e.warn(`[SharedStorageRead] hash files in ${d} failed: ${r(R)}`,R);continue}let h=ga(S);for(let R of f){let C=h.get(R.absolutePath);if(!C)continue;u.set(R.absolutePath,C),c.set(m(R),C)}}return u}function Sa(o){let n=[],s=[],a=10;for(let d of o){let c=b(d.absolutePath).length+(s.length>0?1:0);if(s.length>0&&a+c>na)n.push(s),s=[],a=10;s.push(d),a+=c}if(s.length>0)n.push(s);return n}function ya(o){try{let n=new oa("utf-8",{fatal:!0,ignoreBOM:!0}).decode(o);return n.includes("\x00")?void 0:n}catch(n){e.debug(`src/server/sharedStorageReadService.ts utf8 decode failed: ${n}`,n);return}}var va={txt:"text/plain",md:"text/markdown",csv:"text/csv",json:"application/json",xml:"application/xml",html:"text/html",pdf:"application/pdf",zip:"application/zip",png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",gif:"image/gif",webp:"image/webp",bmp:"image/bmp",heic:"image/heic",mp4:"video/mp4",mov:"video/quicktime",mkv:"video/x-matroska",webm:"video/webm",mp3:"audio/mpeg",m4a:"audio/mp4",aac:"audio/aac",flac:"audio/flac",ogg:"audio/ogg",wav:"audio/wav"};function dt(o){let n=me.basename(o),s=n.lastIndexOf(".");if(s<=0)return;return va[n.slice(s+1).toLowerCase()]}function Rr(o){return`Device not found or not booted: ${o}`}function ha(o){return`Bounded user_files reads require Android or an iOS Simulator; physical ${o} devices are unsupported.`}function Ra(o){return`Downloads namespace directory does not exist: ${o}`}function ba(o){return`File does not exist in the Downloads namespace: ${o}`}var Ta=g({itemClass:ne("genericPassword"),service:y(),account:y(),accessGroup:y()}),Ca=g({schemaVersion:ne(1),capability:ne("storage.keychain"),inspection:ne("unavailable"),deletion:A(["enabled","disabled","unknown"]),reason:A(["DISABLED","NO_ALLOWLISTED_SCOPES","SDK_TOO_OLD","BRIDGE_UNAVAILABLE"]).nullable().optional(),deletionScopes:j(Ta)}),Ea=g({kind:A(["user_defaults_suite","core_data"]),identifier:y(),sharing:A(["app_private","app_group"]),appGroup:y().nullable().optional(),coordination:A(["single_process","uncoordinated","host_coordinated"]),query:A(["supported","unsupported"]),reason:y().nullable().optional()});function Er(o){return{schemaVersion:1,capability:"storage.keychain",inspection:"unavailable",deletion:"unknown",reason:o,deletionScopes:[]}}function Pr(o){let n=typeof o==="object"&&o!==null?o:{},s=Ca.safeParse(n.keychain),a=Array.isArray(n.stores)?n.stores:[];return{keychain:s.success?s.data:Er("SDK_TOO_OLD"),stores:a.flatMap((d)=>{let c=Ea.safeParse(d);return c.success?[c.data]:[]})}}function ct(){return{keychain:Er("BRIDGE_UNAVAILABLE"),stores:[]}}var we=1;function P(o,n,s,a){if(n)return{operation:o,state:"unsupported",reason:n};let d=s.filter((u)=>u.satisfied===!1),c=s.filter((u)=>u.satisfied===void 0);if(d.length>0)return{operation:o,state:"unavailable",reason:`Missing prerequisite: ${d.map((u)=>u.label).join(", ")}.`,prerequisites:[...d,...c].map((u)=>u.label)};if(c.length>0)return{operation:o,state:"partial",reason:`Available pending verification of: ${c.map((u)=>u.label).join(", ")}.`,prerequisites:c.map((u)=>u.label)};return{operation:o,state:"supported",reason:a}}function Ia(o,n){return{operation:o,state:"unavailable",reason:n}}function O(o,n){return{label:o,satisfied:n}}var Ar="AutoMobile SDK embedded with storage inspection",xr="active CtrlProxy runner session",Dr="debuggable app build",J="active Android user/profile",Pa="managed iOS Files fixture app installed",Da="opt-in iOS app file-access integration";function Aa(o){let n=[O(Ar,o.embeddedSdk),O(xr,o.sessionActive)];return{domain:"key_value",portable:!0,platformScope:"cross-platform",note:"SharedPreferences / DataStore (Android) and UserDefaults (iOS) via the AutoMobile SDK.",operations:["list","read","write","namespace_reset","observe"].map((a)=>P(a,void 0,n)),...wr(o,"user_defaults_suite")}}function wr(o,n){if(o.platform!=="ios"||!o.iosStorage)return{};return{stores:o.iosStorage.stores.filter((s)=>s.kind===n)}}function xa(o){let n=[O(Ar,o.embeddedSdk),O(xr,o.sessionActive)];return{domain:"databases",portable:!0,platformScope:"cross-platform",note:"SQLite inspection (list, read, bounded queries) and mutation via the opt-in sqlQuery tool.",operations:["list","read","observe","write"].map((s)=>P(s,void 0,n)),...wr(o,"core_data")}}function wa(o){let n=["list","read","write"],s=(a)=>{if(o.platform==="ios"){if(o.deviceType==="simulator")return P(a,void 0,[]);if(o.iosFileIntegration===!0)return{operation:a,state:"partial",reason:"Available only through an opt-in app file-access integration; not native iOS behavior.",prerequisites:[Da]};return P(a,"Direct app-container file access is unsupported on physical iOS devices unless an opt-in app integration advertises it.",[])}if(o.deviceType==="emulator")return P(a,void 0,[]);if(o.debuggableBuild===!1)return{operation:a,state:"partial",reason:"Private containers require a debuggable app build; externalFiles remains available.",prerequisites:[Dr]};return P(a,void 0,[O(Dr,o.debuggableBuild)])};return{domain:"app_containers",portable:!0,platformScope:"cross-platform",note:"putAppFile target.domain app_containers. Canonical resources: automobile:devices/{deviceId}/storage-domains/app_containers/{appId}/{container}[/{path}]{?userId}; compatibility aliases: automobile:devices/{deviceId}/apps/{appId}/files/{container}[/{path}]{?userId}. Fully available on simulators/emulators; qualified on physical devices.",operations:n.map(s)}}function Na(o){if(o.platform==="ios"){let n=o.deviceType==="simulator"?void 0:"Physical iOS user_files is unsupported without an on-device fixture-app integration; generic iosFileIntegration does not provide it.",s=[O(Pa,o.iosFilesFixtureInstalled)];return{domain:"user_files",portable:!1,platformScope:"cross-platform",note:"iOS Simulator only: managed fixture-app Documents/automobile namespaces. The fixture app is built and installed on the first write when it is missing (needs Xcode's simulator SDK). Writes require its installed container; picker visibility is reported separately and unavailable unless verified. Physical iOS is unsupported. Canonical user_files resources list/read only these managed namespaces.",operations:[n?P("list",n,[]):P("list",void 0,[]),n?P("read",n,[]):P("read",void 0,[]),P("write",n,s,"Stages files in the managed iOS Files fixture app; picker visibility requires separate verification."),P("namespace_reset",n,s,"Resets only Documents/automobile/<namespace> in the managed fixture app."),P("media_indexing",n??"iOS user_files has no Android media indexing equivalent.",[])]}}return{domain:"user_files",portable:!1,platformScope:"cross-platform",note:'Android user-visible shared storage. putAppFile target.domain user_files writes, resets one namespace, and optionally indexes media in bounded Downloads namespaces; canonical resources: automobile:devices/{deviceId}/storage-domains/user_files/{namespace}[/{path}]; compatibility aliases: the "Downloads Namespace Files" and "Downloads Namespace File" MCP resources expose listing and reading at automobile:devices/{deviceId}/downloads/{namespace}[/{path}].',operations:[P("list",void 0,[O(J,o.activeUserProfile)],'Exposed by the "Downloads Namespace Files" MCP resource template.'),P("read",void 0,[O(J,o.activeUserProfile)],'Exposed by the "Downloads Namespace File" MCP resource template.'),P("write",void 0,[O(J,o.activeUserProfile)]),P("namespace_reset",void 0,[O(J,o.activeUserProfile)],"Resets only the declared user_files namespace."),P("media_indexing",void 0,[O(J,o.activeUserProfile)],"Requested with putAppFile target.indexMedia.")]}}function ka(o){let n=P("write",void 0,[O(J,o.activeUserProfile)]),s=o.platform==="ios"?P("media_indexing","iOS has no MediaScanner-style host-triggered indexing equivalent.",[]):P("media_indexing",void 0,[O(J,o.activeUserProfile)],"Verified as part of Android putAppFile media_library writes."),a=P("write",o.deviceType==="simulator"?void 0:"iOS media-library fixture staging is only supported on iOS Simulators.",[],"Imports image and video fixtures through xcrun simctl addmedia; picker visibility is unverified.");return{domain:"media_library",portable:!1,platformScope:"cross-platform",note:o.platform==="android"?"Android putAppFile writes bounded media fixtures and verifies MediaStore discovery; list/read is bounded to Download/automobile-media.":o.deviceType==="simulator"?"iOS Simulator putAppFile imports image and video fixtures through simctl addmedia; browse/read is not exposed.":"iOS physical media-library mutation is not exposed.",operations:[...["list","read"].map((d)=>o.platform==="ios"?Ia(d,De):P(d,void 0,[O(J,o.activeUserProfile)],"Canonical media_library resources read only Download/automobile-media.")),o.platform==="ios"?a:n,s]}}function Ma(o){if(o.platform==="android")return{domain:"secure_state",portable:!1,platformScope:"android",note:"App-owned Android Keystore metadata via storage.keystore; exact declared scopes only, never key material. resetKeychain deletes only declared aliases; package-data reset is separate.",capabilities:o.keystore?[o.keystore]:[],operations:[{operation:"read",state:"unavailable",reason:"SDK alias metadata is read-only; no host storage read surface is exposed in this slice.",prerequisites:["code-only KeystoreTestState opt-in and exact declared scope (#5189)"]},P("write","Keystore aliases are not written; scoped alias deletion is exposed by resetKeychain with a declared scope or alias.",[]),P("namespace_reset","Package-data reset is explicit and separate; resetKeychain deletes only aliases declared in a scope.",[])]};return Oa(o)}function Oa(o){return{domain:"secure_state",portable:!1,platformScope:"ios",note:"Keychain. Values are never read or exported. Deleting an exact allowlisted item uses deleteKeychainItem when the capability reports deletion enabled; it still needs storage mutation authorization.",capabilities:o.iosStorage?[o.iosStorage.keychain]:[],operations:[{operation:"read",state:"unavailable",reason:"Keychain values are unavailable by default; no host Keychain inspection adapter is registered.",prerequisites:["host Keychain inspection adapter with an explicit allowlist and per-field redaction"]},P("write","Keychain writes are not an AutoMobile storage feature; exact allowlisted deletion uses deleteKeychainItem.",[]),P("namespace_reset","Bulk Keychain reset is not offered for an app; deleteKeychainItem deletes only exact allowlisted items, and resetKeychain resets the whole simulator Keychain.",[])]}}function _a(){return[{domain:"user_files",platform:"android",description:"Android bounded Downloads namespaces are platform-specific; the separate iOS Simulator fixture-app provider does not make user_files portable."},{domain:"user_files",platform:"ios",description:"iOS Simulator staging requires an installed managed Files fixture app; picker visibility requires separate verification. Physical iOS is unsupported; this is not portable storage."},{domain:"app_containers",platform:"ios",description:"Physical-iOS app-container file access is exposed only through an opt-in app integration, not as native portable behavior."},{domain:"secure_state",platform:"ios",description:"Keychain capability and Core Data store states come from the embedded SDK and are iOS-specific; treat as an extension point, not portable storage."}]}function Ua(o,n){if((o==="user_files"||o==="media_library")&&(n==="list"||n==="read"))return`SharedStorageReadService ${n} provider`;return n==="namespace_reset"||n==="media_indexing"?`write provider declaring ${n}`:`${n} provider`}function lt(o,n){let a=(o.providerCoverage??pX()).find((c)=>c.platform===o.platform&&c.domain===n.domain)??{write:!1,list:!1,read:!1,namespaceReset:!1,mediaIndexing:!1},d={write:a.write,list:a.list,read:a.read,namespace_reset:a.write&&a.namespaceReset,media_indexing:a.write&&a.mediaIndexing};if(n.domain==="user_files"||n.domain==="media_library"){let c=(n.domain==="user_files"?o.sharedStorageReadCoverage:o.mediaLibraryReadCoverage)??Ae(o.platform,n.domain);d.list=c.list,d.read=c.read}return{...n,operations:n.operations.map((c)=>{let u=c.operation;if(d[u])return c;let m=Ua(n.domain,u);return{...c,state:c.state==="unsupported"?"unsupported":"unavailable",reason:`${c.reason?`${c.reason} `:""}No ${m} is registered for ${o.platform}:${n.domain}.`}})}}function Ne(o){return{schemaVersion:we,platform:o.platform,deviceType:o.deviceType,appId:o.appId,context:{embeddedSdk:o.embeddedSdk,sessionActive:o.sessionActive,debuggableBuild:o.debuggableBuild,authorized:o.authorized,activeUserProfile:o.activeUserProfile,iosFileIntegration:o.iosFileIntegration,iosFilesFixtureInstalled:o.iosFilesFixtureInstalled},domains:[lt(o,wa(o)),lt(o,Na(o)),lt(o,ka(o)),Aa(o),xa(o),Ma(o)],extensionPoints:_a()}}function Nr(o,n,s){return o.domains.find((a)=>a.domain===n)?.operations.find((a)=>a.operation===s)}var Fa="automobile:devices/{deviceId}/storage/capabilities{?appId}";async function La(o){return Cs(o,"StorageCapabilityResources")}function Mr(o){if(o.platform==="ios")return z({deviceId:o.deviceId});return o.deviceId.startsWith("emulator-")?"emulator":"physical"}function ut(o,n,s,a){return{platform:re(o.platform,"Storage capability resolution"),deviceType:Mr(o),embeddedSdk:N.isEmbeddedSdkEnabled(),sessionActive:!0,activeUserProfile:s,...a===void 0?{}:{debuggableBuild:a},appId:n}}async function Ba(o,n){let s;if(o.platform==="android")try{let a=(n.adbFactory??v).create(o);await(n.createUserResolver??((c)=>new _t(c)))(a).resolve({currentUser:!0}),s=!0}catch(a){if(a instanceof Xm)e.debug(`[StorageCapabilityResources] No selectable Android profile: ${a}`),s=!1;else e.warn(`[StorageCapabilityResources] Active Android profile probe failed: ${a}`)}return s}async function $a(o,n,s){if(o.platform!=="android"||Mr(o)!=="physical"||!n)return;try{let a=(s.adbFactory??v).create(o);return await(s.probeDebuggableBuild??cr)(a,n)}catch(a){e.warn("[StorageCapabilityResources] Debuggable Android build probe failed",a);return}}async function qa(o,n,s){try{return await(s.createKeystoreDiscovery?.(o)??E.getInstance(o)).discoverKeystore(n)}catch(a){return e.warn("[StorageCapabilityResources] Keystore discovery unavailable",a),{schemaVersion:1,capability:"storage.keystore",outcome:"unavailable",reason:"BRIDGE_UNAVAILABLE",bridgeAvailable:!1,metadata:"supported",mutation:"declared_unsupported",deviceLocked:"unknown",scopes:[]}}}function Or(o){return{discoverIosStorage:async(n)=>Pr(await o.getStorageCapabilitiesForIos(n))}}async function ja(o,n,s){if(!s.createIosStorageDiscovery)return ct();try{return await s.createIosStorageDiscovery(o).discoverIosStorage(n)}catch(a){return e.warn("[StorageCapabilityResources] iOS storage discovery unavailable",a),ct()}}function Ha(o,n){let s=`automobile:devices/${o}/storage/capabilities`;return n?`${s}?appId=${Qe(n)}`:s}function Ka(o){return o.appFileCoverage?o.appFileCoverage.describeProviderCoverage():jM().describeProviderCoverage?.()??H1()}function kr(o,n,s="user_files"){return o.sharedStorageReadCoverage?o.sharedStorageReadCoverage(n,s):eJ().describeReadCoverage?.(n,s)}async function Va(o,n={}){let{deviceId:s}=o,a=o.appId?o.appId:void 0,d=Ha(s,a);try{let c=await La(s);if(!c)return{uri:d,mimeType:"application/json",text:JSON.stringify({error:`Device not found or not booted: ${s}`,schemaVersion:we},null,2)};let[u,m]=await Promise.all([Ba(c,n),$a(c,a,n)]),p=ut(c,a,u,m);if(p.providerCoverage=Ka(n),p.sharedStorageReadCoverage=kr(n,c.platform),p.mediaLibraryReadCoverage=kr(n,c.platform,"media_library"),c.platform==="android"&&a&&p.embeddedSdk)p.keystore=await qa(c,a,n);if(c.platform==="ios"&&a&&p.embeddedSdk)p.iosStorage=await ja(c,a,n);let f=Ne(p);return{uri:d,mimeType:"application/json",text:JSON.stringify({deviceId:s,...f},null,2)}}catch(c){return e.error(`[StorageCapabilityResources] Failed to compute capabilities: ${c}`),{uri:d,mimeType:"application/json",text:JSON.stringify({error:`Failed to compute storage capabilities: ${c}`,schemaVersion:we},null,2)}}}function Ur(o={}){q.registerTemplate(Fa,"Storage Capabilities",{description:"Versioned descriptor of which storage operations (list, read, write, namespace reset, media indexing, observation) are available per logical domain (app containers, user-visible files, media library, key-value state, databases, secure state) for a device and optional app context. Clients negotiate capabilities instead of inferring them from platform names.",mimeType:"application/json",handler:(n)=>Va(n,o)}),e.info("[StorageCapabilityResources] Registered storage capability resources")}var Ga=1,Ja="automobile:devices/{deviceId}/sdk/capabilities{?appId}";function za(o,n){let s=`automobile:devices/${o}/sdk/capabilities`;return n?`${s}?appId=${Qe(n)}`:s}function ge(o,n,s){return{uri:o,mimeType:"application/json",text:JSON.stringify({schemaVersion:Ga,deviceId:s,...n},null,2)}}async function Wa(o,n){try{let a=await(n.adbFactory??v).create(o).getForegroundApp();return a?{packageName:a.packageName,userId:a.userId}:void 0}catch(s){e.warn("[SdkCapabilityResources] Foreground app probe failed",s);return}}async function Ya(o,n,s,a){try{return await(a.createReader?.(o)??E.getInstance(o)).getSdkCapabilities(n,s)}catch(d){return e.warn("[SdkCapabilityResources] SDK capability read failed",d),Bu("CTRLPROXY_UNREACHABLE")}}async function Qa(o,n={}){let{deviceId:s}=o,a=o.appId?o.appId:void 0,d=za(s,a);try{let c=await Cs(s,"SdkCapabilityResources");if(!c)return ge(d,{error:`Device not found or not booted: ${s}`});if(c.platform!=="android")return ge(d,{appId:a??null,result:Bu("UNSUPPORTED_PLATFORM")},s);let u=await Wa(c,n),m=a??u?.packageName;if(!m)return ge(d,{appId:null,result:Bu("NO_APP")},s);let p=u?.packageName===m?u.userId:void 0;return ge(d,{appId:m,result:await Ya(c,m,p,n)},s)}catch(c){return e.error(`[SdkCapabilityResources] Failed to read SDK capabilities: ${c}`),ge(d,{error:`Failed to read SDK capabilities: ${c}`},s)}}function Fr(o={}){q.registerTemplate(Ja,"SDK Capabilities",{description:"Versioned SDK capability states and capture policy (headers, bodies, mutations) for the bound device's app, read through CtrlProxy. An older SDK, CtrlProxy, or a release build yields status 'unavailable' with a reason, never an empty capability set.",mimeType:"application/json",handler:(n)=>Qa(n,o)}),e.info("[SdkCapabilityResources] Registered SDK capability resources")}var Lr={STORES:"automobile:devices/{deviceId}/storage/{packageName}/datastore/{adapterName}/stores",ENTRIES:"automobile:devices/{deviceId}/storage/{packageName}/datastore/{adapterName}/{storeName}/entries"},W="datastore",Xa={listDataStores(o,n,s){return E.getInstance(o,v).listDataStores(n,s)},getDataStore(o,n,s,a){return E.getInstance(o,v).getDataStore(n,s,a)}},ke={stores:new Map,entries:new Map};function Br(o){let n=JSON.stringify(o),s=0;for(let a=0;a<n.length;a++){let d=n.charCodeAt(a);s=(s<<5)-s+d,s=s&s}return s.toString(16)}async function Za(o){return Cs(o,"DataStoreResources")}function ed(o,n,s){return`automobile:devices/${o}/storage/${Qe(n)}/datastore/${Qe(s)}/stores`}function td(o,n,s,a){return`automobile:devices/${o}/storage/${Qe(n)}/datastore/${Qe(s)}/${Qe(a)}/entries`}function te(o,n){return{uri:o,mimeType:"application/json",text:JSON.stringify(n,null,2)}}function $r(o){return te(xi(o)??"",{status:"unavailable",kind:W,deviceId:o.deviceId,reason:"Malformed resource URI: a path segment is not valid percent-encoding."})}function Me(o,n,s){let a=Ne(ut(o,n));return Nr(a,"key_value",s)}async function qr(o,n,s,a){let d=await Za(o);if(!d)return{diagnostic:{status:"unavailable",kind:W,deviceId:o,packageName:n,adapterName:s,reason:`Device not found or not booted: ${o}`}};if(d.platform!=="android")return{diagnostic:{status:"unsupported",kind:W,deviceId:o,packageName:n,adapterName:s,platform:d.platform,reason:`DataStore is Android-only; not available on ${d.platform}.`,capability:Me(d,n,a)}};if(!N.isEmbeddedSdkEnabled()){let c=Me(d,n,a);return{diagnostic:{status:"disabled",kind:W,deviceId:o,packageName:n,adapterName:s,platform:d.platform,reason:c?.reason??"DataStore inspection requires the AutoMobile SDK embedded with storage inspection.",capability:c}}}return{device:d}}async function od(o,n){let s=o.deviceId,a=$o(o.packageName),d=$o(o.adapterName);if(a===null||d===null)return $r(o);let c=ed(s,a,d),u=await qr(s,a,d,"list");if("diagnostic"in u)return te(c,u.diagnostic);let m=u.device;try{let p=await n.listDataStores(m,a,d),f=new Date().toISOString(),S=Br(p),h=`${s}:${a}:${d}`,R=ke.stores.get(h);if(R&&R.hash!==S)q.notifyResourceUpdated(c);return ke.stores.set(h,{hash:S}),te(c,{status:"available",kind:W,deviceId:s,packageName:a,adapterName:d,platform:m.platform,stores:p,totalCount:p.length,lastUpdated:f,capability:Me(m,a,"list")})}catch(p){e.warn(`[DataStoreResources] Failed to list data stores: ${p}`);let f=_y(p);return te(c,{status:"unavailable",kind:W,deviceId:s,packageName:a,adapterName:d,platform:m.platform,reason:f?WM(a):`Failed to list data stores (adapter or app integration may be absent): ${p}`})}}async function rd(o,n){let s=o.deviceId,a=$o(o.packageName),d=$o(o.adapterName),c=$o(o.storeName);if(a===null||d===null||c===null)return $r(o);let u=td(s,a,d,c),m=await qr(s,a,d,"read");if("diagnostic"in m)return te(u,{...m.diagnostic,name:c});let p=m.device;try{let f=await n.getDataStore(p,a,d,c),S=new Date().toISOString(),h=Br(f),R=`${s}:${a}:${d}:${c}`,C=ke.entries.get(R);if(C&&C.hash!==h)q.notifyResourceUpdated(u);return ke.entries.set(R,{hash:h}),te(u,{status:"available",kind:W,deviceId:s,packageName:a,adapterName:d,name:c,platform:p.platform,entries:f,totalCount:f.length,lastUpdated:S,capability:Me(p,a,"read")})}catch(f){e.warn(`[DataStoreResources] Failed to get data store entries: ${f}`);let S=_y(f);return te(u,{status:"unavailable",kind:W,deviceId:s,packageName:a,adapterName:d,name:c,platform:p.platform,reason:S?WM(a):`Failed to read data store (adapter or app integration may be absent): ${f}`})}}function jr(o=Xa){q.registerTemplate(Lr.STORES,"App DataStore Instances",{description:"List the Jetpack DataStore instances an app exposes through a host-registered AutoMobile SDK adapter (Android only).",mimeType:"application/json",handler:(n)=>od(n,o)}),q.registerTemplate(Lr.ENTRIES,"DataStore Instance Entries",{description:"Read the key-value entries of a named Jetpack DataStore instance via a host-registered AutoMobile SDK adapter (Android only).",mimeType:"application/json",handler:(n)=>rd(n,o)}),e.info("[DataStoreResources] Registered DataStore resources")}async function id(){let{getAppFileService:o}=await import("./chunk-mm8rcxad.js");return o()}function nd(o,n=tp){return async(s)=>{let a=IG(s),d=await(await o()).listFiles({deviceId:a.deviceId,appId:a.appId,container:a.container,userId:a.userId});return{uri:n(a),mimeType:"application/json",text:JSON.stringify(d,null,2)}}}function sd(o,n=tp){return async(s)=>{let a=IG(s);if(a.path===void 0)throw Error("App file resource path is required.");let d=await(await o()).readFile({deviceId:a.deviceId,appId:a.appId,container:a.container,userId:a.userId,path:a.path});return{uri:n(a),mimeType:d.mimeType,...d.text!==void 0?{text:d.text}:{blob:d.blob??""}}}}function Kr(o){let n=o?async()=>o:id;for(let[s,a]of[[IJ,_J],[EJ,tp]])q.registerTemplate(s.CONTAINER,"App Container Files",{description:"List files in a logical app container for a specific device and app. Android auto-resolves the installed user; optional ?userId=N selects a profile.",mimeType:"application/json",handler:nd(n,a)}),q.registerTemplate(s.FILE,"App Container File",{description:"Read a file from a logical app container. Android auto-resolves the installed user; optional ?userId=N selects a profile. UTF-8 content is returned as text; binary content is returned as a base64 MCP blob.",mimeType:"application/octet-stream",handler:sd(n,a)})}var ad={resolveActiveSession:pm,service:c1};function dd(o){try{return decodeURIComponent(o)}catch(n){return e.debug(`[SessionLogResources] undecodable session segment ${o}: ${n}`),o}}function Oe(o,n,s){return{uri:o,mimeType:"application/json",text:JSON.stringify({code:n,error:s},null,2)}}function cd(o){return async(n,s)=>{let{sessionUuid:a,appId:d,...c}=n,u=dd(a),m=xi(n)??`automobile:device-session/${a}/apps/${d}/logs`;if(s.sessionUuid!==u)return Oe(m,"SESSION_NOT_BOUND","This resource can only be read by its bound device session.");let p=o.resolveActiveSession(u);if(!p)return Oe(m,"SESSION_NOT_ACTIVE",`No active device session found for sessionUuid ${u}.`);let f;try{f=CJ(d,c)}catch(h){return Oe(m,"INVALID_REQUEST",r(h))}let S=DJ(u,f);try{let h=await o.service().collect({sessionUuid:u,device:p.device,request:f,signal:s.signal});return{uri:S,mimeType:"application/json",text:JSON.stringify(h,null,2)}}catch(h){return e.warn(`[SessionLogResources] collection failed for session ${u}: ${r(h)}`,h),Oe(S,"COLLECTION_FAILED",r(h))}}}function Vr(o={}){let n={...ad,...o};q.registerTemplateWithReadContext(xJ,"Session Execution Logs",{description:"Collect bounded execution logs for an app on the device owned by the caller's session: named app-container log files (`container`, `paths`), iOS Simulator App Group files (`groupId`, `groupPaths`), and an app-scoped unified-log window (`lastSeconds`, `level`). Each source reports its own outcome; `maxBytes` bounds every entry.",mimeType:"application/json",handler:cd(n)})}var ld="automobile:device-session/{sessionUuid}/apps/{appId}/crash-reports/{reportId}{?maxBytes}",ud=262144,pd=/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/,md={resolveActiveSession:pm,readerFor:(o)=>U7(o,{adb:v.create(o),fileSystem:Hw})};function pt(o){try{return decodeURIComponent(o)}catch(n){return e.debug(`[CrashReportResources] undecodable segment ${o}: ${n}`),o}}function Gr(o,n){return{uri:o,mimeType:"application/json",text:JSON.stringify(n,null,2)}}function oe(o,n,s){return Gr(o,{code:n,error:s})}function gd(o){if(o===void 0||o==="")return ud;let n=Number(o);if(!Number.isSafeInteger(n)||n<1||n>dS)return`maxBytes must be an integer from 1 to ${dS}.`;return n}function fd(o,n){return o.sessionUuid===n||o.ownsSession?.(n)===!0}function Sd(o){return async(n,s)=>{let{sessionUuid:a,appId:d,reportId:c}=n,u=pt(a),m=xi(n)??`automobile:device-session/${a}/apps/${d}/crash-reports/${c}`;if(!fd(s,u))return oe(m,"SESSION_NOT_BOUND","This resource can only be read by its bound device session.");let p=o.resolveActiveSession(u);if(!p)return oe(m,"SESSION_NOT_ACTIVE",`No active device session found for sessionUuid ${u}.`);let f=pt(c),S=gd(n.maxBytes);if(typeof S==="string"||!pd.test(f))return oe(m,"INVALID_REQUEST",typeof S==="string"?S:"reportId is not a valid crash report id.");let h;try{h=a1(pt(d))}catch(R){return oe(m,"INVALID_REQUEST",r(R))}return yd(o,{device:p.device,uri:m,appId:h,reportId:f,maxBytes:S,context:s})}}async function yd(o,n){let{device:s,uri:a,appId:d,reportId:c,maxBytes:u,context:m}=n,p=o.readerFor(s);if(!p)return oe(a,"UNSUPPORTED",`Crash reports are not available for ${s.deviceId}: physical iOS retrieval is not implemented yet.`);try{let f=await p.read(c,m.signal);if(!f||f.report.appId!==d)return oe(a,"NOT_FOUND",`No crash report ${c} for ${d} on this device.`);let S=Buffer.from(f.text,"utf8"),h=S.byteLength>u?S.subarray(0,u):S;return Gr(a,{reportId:f.report.id,source:f.report.source,appId:d,reportPath:f.report.reportPath,byteCount:S.byteLength,truncated:h.byteLength<S.byteLength,text:h.toString("utf8")})}catch(f){return m.signal?.throwIfAborted(),e.warn(`[CrashReportResources] read ${c} failed: ${r(f)}`,f),oe(a,"READ_FAILED",r(f))}}function Jr(o={}){let n={...md,...o};q.registerTemplateWithReadContext(ld,"Native Crash Report",{description:"The full OS crash report (an `.ips` on iOS Simulator, a dropbox entry on Android) named by `crashApp`'s `crashReport.reportId`, for the device owned by the caller's session. `maxBytes` bounds the returned text.",mimeType:"application/json",handler:Sd(n)})}async function vd(){let{getSharedStorageReadService:o}=await import("./chunk-xf19m15s.js");return o()}function hd(o,n=Z,s="user_files"){return async(a)=>{let d=rt(a),c=await(await o()).list({deviceId:d.deviceId,namespace:d.namespace,domain:s});return{uri:n({deviceId:d.deviceId,namespace:d.namespace}),mimeType:"application/json",text:JSON.stringify({...c,files:c.files.map((u)=>({...u,resourceUri:n({deviceId:d.deviceId,namespace:d.namespace,path:u.path})}))},null,2)}}}function Rd(o,n=Z,s="user_files"){return async(a)=>{let d=rt(a);if(d.path===void 0)throw Error("Shared-storage file resource path is required.");let c=await(await o()).read({deviceId:d.deviceId,namespace:d.namespace,domain:s,path:d.path}),u=n({deviceId:d.deviceId,namespace:d.namespace,path:d.path});if(c.observation!=="complete")return{uri:u,mimeType:"application/json",text:JSON.stringify({...c,resourceUri:u},null,2)};return{uri:u,mimeType:c.mimeType??"application/octet-stream",...c.text!==void 0?{text:c.text}:{blob:c.blob??""}}}}function zr(o){let n=o?async()=>o:vd;for(let[s,a,d]of[[pr,le,"user_files"],[mr,xe,"media_library"],[ur,Z,"user_files"]])q.registerTemplate(s.NAMESPACE,d==="media_library"?"Media Library Namespace Files":"Downloads Namespace Files",{description:"List files staged by putAppFile into one bounded storage-domain namespace, with normalized relative paths, byte counts, MIME types, and SHA-256 verification hashes.",mimeType:"application/json",handler:hd(n,a,d)}),q.registerTemplate(s.FILE,d==="media_library"?"Media Library Namespace File":"Downloads Namespace File",{description:"Read one file staged by putAppFile in a bounded storage-domain namespace. UTF-8 content is returned as text; binary content is returned as a base64 MCP blob.",mimeType:"application/octet-stream",handler:Rd(n,a,d)})}var bd="automobile:config/feature-flags/{key}";function Wr(){let o=new Set($w.map((n)=>n.key));q.registerTemplate(bd,"Feature flag configuration",{description:"Read feature flag state and configuration by key",mimeType:"application/json",handler:async(n)=>{let s=n.key;if(!s||!o.has(s))throw Error(`Unknown feature flag: ${s}`);let c=(await ar.getInstance().listFlags()).find((m)=>m.key===s);if(!c)throw Error(`Feature flag not found: ${s}`);let u={key:c.key,enabled:c.enabled,config:c.config??null};return{uri:`automobile:config/feature-flags/${s}`,mimeType:"application/json",text:JSON.stringify(u)}}})}import{isAbsolute as Td,win32 as Cd}from"path";var mt="bundletool";async function Yr(o={},n={locator:new OM,hostExecutor:new ee}){let s=await n.locator.locate();if(!s.found)return{name:mt,status:"warn",message:`bundletool not found (${s.reason}); installApp cannot install .aab or .apks artifacts`,recommendation:GE.join("; ")};let{command:a}=s;try{let d=await n.hostExecutor.executeCommand(a.file,[...a.args,"version"],{timeoutMs:o.timeoutMs,signal:o.signal});return{name:mt,status:"pass",message:`bundletool ${d.stdout.trim()||"(version unknown)"}`,value:a.location}}catch(d){return e.warn(`[doctor] bundletool version check failed: ${r(d)}`,d),{name:mt,status:"fail",message:`bundletool at ${a.location} did not run: ${r(d)}`,recommendation:GE.join("; ")}}}var gt="automobile:host/toolchain";function Ed(o){let n=o.iosDependencies??bn();return{now:()=>new Date,timer:i,checkAdbInstallation:(s)=>E1(void 0,s),checkAdbVersion:(s)=>I1(void 0,s),checkEmulator:(s)=>VG(s),checkAndroidCommandLineTools:(s)=>k1(s),checkBundletool:(s)=>Yr(s),checkXcodeInstallation:()=>_1(void 0,n),checkXcodeCommandLineTools:()=>x1(void 0,n),checkXcrunAvailable:()=>C1(n),checkSimctlAvailable:()=>D1(n),probeCoreDeviceVersion:(s)=>WG(n,s)}}function Qr(o,n){let s=[n];if(typeof o==="string"&&!Zr(o))s.push(o);for(let a of s){let d=a.trim().replace(/^v/i,"").match(/\d+(?:\.\d+)+/);if(d)return d[0]}return}function Y(o,n,s={}){if(n.status!=="pass")return{name:o,available:!1,error:n.message};let a=typeof n.value==="string"?n.value:void 0,d=s.version?Qr(n.value,n.message):void 0;return{name:o,available:!0,...d?{version:d}:{},...s.location&&a!==void 0&&Zr(a)?{location:a}:{}}}function Zr(o){return Td(o)||Cd.isAbsolute(o)}async function K(o,n,s){let a=new AbortController,d;try{return await l(Promise.resolve().then(()=>n({signal:a.signal,timeoutMs:Xi})),{timer:s,timeoutMs:Xi,label:o,timeoutError:()=>d=Error(`Probe timed out after ${Xi}ms`),onTimeout:()=>a.abort(d)})}catch(c){let u=r(c);return e.warn(`[HostToolchainResources] ${o} probe failed: ${u}`,c),{name:o,status:"fail",message:u}}}async function Pd(o,n){let s=new AbortController,a;try{return await l(Promise.resolve().then(()=>o({signal:s.signal,timeoutMs:Xi})),{timer:n,timeoutMs:Xi,label:"CoreDevice",timeoutError:()=>a=Error(`Probe timed out after ${Xi}ms`),onTimeout:()=>s.abort(a)})}catch(d){let c=r(d);return e.warn(`[HostToolchainResources] CoreDevice probe failed: ${c}`,d),{status:"unparsable",reason:c}}}function Dd(o){return{name:"devicectl",available:o.status==="meets-requirement"||o.status==="below-required",...o.status==="meets-requirement"||o.status==="below-required"?{version:o.version}:{error:o.reason},coreDevice:{status:o.status,requiredVersion:Qk(iP),simulatorBootState:o.simulatorBootState??{status:"unavailable",reason:"simulator state unavailable"},capabilities:o.capabilities??{status:"not probed",entries:[]}}}}function Ad(o){try{return o().toISOString()}catch(n){return e.warn(`[HostToolchainResources] clock failed: ${r(n)}`,n),"1970-01-01T00:00:00.000Z"}}function xd(o={}){let n={...Ed(o),...o},s=n.timer??i;return async()=>{let a=Ad(n.now);try{let[d,c,u,m,p,f,S,h,R,C]=await Promise.all([K("adb installation",n.checkAdbInstallation,s),K("adb version",n.checkAdbVersion,s),K("emulator",n.checkEmulator,s),K("Android command line tools",n.checkAndroidCommandLineTools,s),K("bundletool",n.checkBundletool,s),K("xcodebuild",n.checkXcodeInstallation,s),K("xcode-select",n.checkXcodeCommandLineTools,s),K("xcrun",n.checkXcrunAvailable,s),K("simctl",n.checkSimctlAvailable,s),Pd(n.probeCoreDeviceVersion,s)]),T=Y("adb",d,{location:!0});if(T.available&&c.status==="pass"){let Q=Qr(c.value,c.message);if(Q)T.version=Q}else if(T.available)T.available=!1,T.error=c.message;let D=Y("sdkmanager",m,{version:!0,location:!0}),M={lastUpdated:a,entries:[T,Y("emulator",u,{location:!0}),D,{...D,name:"avdmanager"},Y("bundletool",p,{version:!0,location:!0}),Y("xcodebuild",f,{version:!0}),Y("xcode-select",S,{location:!0}),Y("xcrun",h),Y("simctl",R),Dd(C)]};return{uri:gt,mimeType:"application/json",text:JSON.stringify(M)}}catch(d){return e.warn(`[HostToolchainResources] resource read failed: ${r(d)}`,d),{uri:gt,mimeType:"application/json",text:JSON.stringify({lastUpdated:a,entries:[]})}}}}function ei(o={}){q.register(gt,"Host Toolchain",{description:"Read-only diagnostic status for Android and Apple host tooling.",mimeType:"application/json",handler:xd(o)})}var ft="automobile:tools";function wd(o){try{return o().toISOString()}catch(n){return e.warn(`[ToolCatalogResource] clock failed: ${r(n)}`,n),"1970-01-01T00:00:00.000Z"}}function Nd(o={}){let n={now:o.now??(()=>new Date),sessionToolSelectionService:o.sessionToolSelectionService??hc()};return async()=>{let s=wd(n.now);try{let a=await Promise.all(F.getAllTools().filter((c)=>F.isUserConfigurableTool(c.name)).map(async(c)=>{let u=await n.sessionToolSelectionService.isEnabled(void 0,c.name,c.defaultEnabled);return{name:c.name,enabledWithoutSession:u,requiresDeviceSession:!u}}));return a.sort((c,u)=>c.name.localeCompare(u.name)),{uri:ft,mimeType:"application/json",text:JSON.stringify({lastUpdated:s,tools:a})}}catch(a){return e.warn(`[ToolCatalogResource] resource read failed: ${r(a)}`,a),{uri:ft,mimeType:"application/json",text:JSON.stringify({lastUpdated:s,tools:[]})}}}}function ti(){q.register(ft,"Tool Catalog",{description:"Every registered AutoMobile tool with its default enabled/gated state, discoverable without acquiring a device.",mimeType:"application/json",handler:Nd()})}var k={REQUEST:"automobile:network/request/{requestId}",TRAFFIC:"automobile:network/traffic",LIVE:"automobile:network/traffic/live",ERRORS:"automobile:network/traffic/errors",SLOW:"automobile:network/traffic/slow",STATS:"automobile:network/stats",STATE:"automobile:network/state",MOCKS:"automobile:network/mocks",CONNECTIVITY:"automobile:network/connectivity"},ii=["host","method","statusCode","since","limit","deviceId","bucketSeconds"],kd=`${k.TRAFFIC}{?${ii.join(",")}}`,Md=new Set(ii);function Ue(o){return{id:o.id,timestamp:o.timestamp,method:o.method,url:o.url,host:o.host,path:o.path,statusCode:o.statusCode,durationMs:o.durationMs,protocol:o.protocol,requestId:o.requestId,connectionId:o.connectionId,direction:o.direction,metadata:o.metadata,sequenceNumber:o.sequenceNumber,contentType:o.contentType,error:o.error}}function Od(o){let n=o.requestBody!==null&&o.requestBodySize>nj,s=o.responseBody!==null&&o.responseBodySize>nj;return{id:o.id,timestamp:o.timestamp,method:o.method,url:o.url,statusCode:o.statusCode,durationMs:o.durationMs,host:o.host,path:o.path,protocol:o.protocol,requestId:o.requestId,connectionId:o.connectionId,direction:o.direction,metadata:o.metadata,sequenceNumber:o.sequenceNumber,contentType:o.contentType,requestHeaders:o.requestHeaders,responseHeaders:o.responseHeaders,requestBody:o.requestBody,responseBody:o.responseBody,requestBodySize:o.requestBodySize,responseBodySize:o.responseBodySize,requestBodyTruncated:n,responseBodyTruncated:s,error:o.error}}function _d(o){let n=Object.keys(o).filter((m)=>!Md.has(m));if(n.length>0)throw Error(`Unknown query parameters: ${n.join(", ")}`);let s=o.since?parseInt(o.since,10):void 0,a=o.limit?parseInt(o.limit,10):void 0,d=a?Math.min(Math.max(1,a),200):50,c=o.bucketSeconds?parseInt(o.bucketSeconds,10):void 0,u=c&&Number.isFinite(c)&&c>0?c:void 0;return{host:o.host,method:o.method,statusCode:o.statusCode,sinceTimestamp:s&&Number.isFinite(s)?s:void 0,limit:d,deviceId:o.deviceId,bucketSeconds:u}}var oi=1000;function Ud(o,n){if(o.length===0)return[];let s=n*1000,a=o.map((h)=>h.timestamp),d=Math.min(...a),c=Math.max(...a),u=Math.floor(d/s)*s,m=Math.floor(c/s)*s+s;if(Math.ceil((m-u)/s)>oi)u=m-oi*s;let f=new Map;for(let h=u;h<m;h+=s)f.set(h,[]);for(let h of o){let R=Math.floor(h.timestamp/s)*s,C=f.get(R);if(C)C.push(h)}let S=[];for(let[h,R]of f){let C=R.map((T)=>T.durationMs).sort((T,D)=>T-D);S.push({bucketStart:h,bucketEnd:h+s,requests:R.length,errors:R.filter($g).length,avgDurationMs:C.length>0?Math.round(C.reduce((T,D)=>T+D,0)/C.length):0,p50:Math.round(ui(C,50)),p95:Math.round(ui(C,95))})}return S.sort((h,R)=>h.bucketStart-R.bucketStart)}function Fd(o){let n=Object.create(null),s=Object.create(null);for(let a of o){let d=a.host??"unknown";if(!n[d])n[d]={requests:0,errors:0,p50:0,p95:0},s[d]=[];if(n[d].requests++,$g(a))n[d].errors++;if(a.durationMs>0)s[d].push(a.durationMs)}for(let a of Object.keys(n)){let d=s[a].sort((c,u)=>c-u);n[a].p50=Math.round(ui(d,50)),n[a].p95=Math.round(ui(d,95))}return n}var Ld={getNetworkEvents:kk,getNetworkEventById:Yne};async function ri(o,n){try{let s=_d(o),a=await n.getNetworkEvents(s);if(s.bucketSeconds){let c=Ud(a,s.bucketSeconds);return{uri:k.TRAFFIC,mimeType:"application/json",text:JSON.stringify({timeSeries:c,bucketSeconds:s.bucketSeconds,totalRequests:a.length},null,2)}}let d={events:a.map(Ue),count:a.length,hasMore:a.length>=s.limit};return{uri:k.TRAFFIC,mimeType:"application/json",text:JSON.stringify(d,null,2)}}catch(s){return e.error(`[NetworkResources] Failed to query traffic: ${s}`),{uri:k.TRAFFIC,mimeType:"application/json",text:JSON.stringify({error:`Failed to query traffic: ${s}`})}}}function Bd(o){q.register(k.LIVE,"Live Network Traffic",{description:"Real-time captured network traffic. Subscribe to receive notifications on new requests.",mimeType:"application/json",handler:async()=>{let n=await o.getNetworkEvents({limit:20});return{uri:k.LIVE,mimeType:"application/json",text:JSON.stringify({events:n.map(Ue)},null,2)}}}),q.register(k.ERRORS,"Network Errors",{description:"Recent network errors (recorded transport error, missing/zero status, or status >= 400). Subscribe to receive notifications on new errors.",mimeType:"application/json",handler:async()=>{let n=await o.getNetworkEvents({errorsOnly:!0,limit:20});return{uri:k.ERRORS,mimeType:"application/json",text:JSON.stringify({errors:n.map(Ue)},null,2)}}}),q.register(k.STATS,"Network Stats",{description:"Aggregate network statistics with p50/p95 latency. Subscribe to receive notifications when error rate crosses threshold.",mimeType:"application/json",handler:async()=>{let n=await o.getNetworkEvents({limit:200}),s=n.length,a=n.filter($g).length,d=s>0?a/s:0,c=n.map((S)=>S.durationMs).filter((S)=>S>0).sort((S,h)=>S-h),u=c.length>0?c.reduce((S,h)=>S+h,0)/c.length:0,m=Math.round(ui(c,50)),p=Math.round(ui(c,95)),f=Fd(n);return{uri:k.STATS,mimeType:"application/json",text:JSON.stringify({totalRequests:s,errorCount:a,errorRate:d,avgDurationMs:u,p50:m,p95:p,byHost:f},null,2)}}})}function ni(o=Ld){q.register(k.TRAFFIC,"Network Traffic",{description:"Query captured network traffic. Use query parameters to filter by host, method, statusCode, since, limit, deviceId.",mimeType:"application/json",handler:()=>ri({},o)}),q.registerTemplate(kd,"Network Traffic",{description:"Query captured network traffic with optional filters.",mimeType:"application/json",handler:async(n)=>ri(n,o)}),q.registerTemplate(k.REQUEST,"Network Request Detail",{description:"Full HTTP request and response detail for a single captured network call (bodies truncated to 10KB).",mimeType:"application/json",handler:async(n)=>{let s=parseInt(n.requestId,10);if(!Number.isFinite(s)||s<1)return{uri:`automobile:network/request/${n.requestId}`,mimeType:"application/json",text:JSON.stringify({error:`Invalid requestId: ${n.requestId}`})};try{let a=await o.getNetworkEventById(s);if(!a)return{uri:`automobile:network/request/${s}`,mimeType:"application/json",text:JSON.stringify({error:`Network request ${s} not found`})};return{uri:`automobile:network/request/${s}`,mimeType:"application/json",text:JSON.stringify(Od(a),null,2)}}catch(a){return e.error(`[NetworkResources] Failed to get request ${s}: ${a}`),{uri:`automobile:network/request/${s}`,mimeType:"application/json",text:JSON.stringify({error:`Failed to retrieve request: ${a}`})}}}}),Bd(o),q.register(k.SLOW,"Slow Network Requests",{description:"Recent slow network requests (exceeding configured threshold). Subscribe to receive notifications on new slow requests.",mimeType:"application/json",handler:async()=>{let s=ln.getInstance().slowThresholdMs,d=(await o.getNetworkEvents({limit:200})).filter((c)=>c.durationMs>=s);return{uri:k.SLOW,mimeType:"application/json",text:JSON.stringify({thresholdMs:s,events:d.slice(0,50).map(Ue),count:d.length},null,2)}}}),q.register(k.STATE,"Network State",{description:"Current network capture and simulation state (capturing, error simulation, notification config).",mimeType:"application/json",handler:async()=>{let n=ln.getInstance();return{uri:k.STATE,mimeType:"application/json",text:JSON.stringify(n.getSnapshot(),null,2)}}}),q.register(k.MOCKS,"Network Mocks",{description:"Currently active mock network response rules, each tagged with the device it applies to.",mimeType:"application/json",handler:async()=>{let s=ln.getInstance().getAllMocks();return{uri:k.MOCKS,mimeType:"application/json",text:JSON.stringify({count:s.length,mocks:s},null,2)}}}),q.register(k.CONNECTIVITY,"Network Connectivity",{description:"Current device network connectivity state. Subscribe to receive notifications on connectivity changes.",mimeType:"application/json",handler:async()=>({uri:k.CONNECTIVITY,mimeType:"application/json",text:JSON.stringify({type:"unknown",details:"Connectivity status requires active device connection"})})}),e.info("[NetworkResources] Registered network resources")}var $d=3;function St(o){return typeof o==="object"&&o!==null&&!Array.isArray(o)}function qd(o){if(!St(o)||typeof o.id!=="string"||typeof o.deviceId!=="string")return!1;return typeof o.observedAtMs==="number"&&typeof o.updatedAtMs==="number"&&typeof o.detectionPath==="string"&&St(o.recovery)&&Array.isArray(o.recovery.attempts)&&St(o.recovery.policy)}function yt(o){try{let n=JSON.parse(o);if(!qd(n))return;if(n.outputUnavailable!=="adopted")delete n.outputUnavailable;return n}catch(n){e.warn(`[EmulatorLossIncidentRepository] Invalid stored incident: ${n}`,n);return}}class wM{database;timer;idGenerator;maxRetained;constructor({db:o,timer:n=i,idGenerator:s=B,maxRetained:a=s5}={}){this.database=o,this.timer=n,this.idGenerator=s,this.maxRetained=a}async open(o){let n=this.timer.now(),s={id:`emulator-loss-${this.idGenerator.next()}`,observedAtMs:n,updatedAtMs:n,deviceId:o.deviceId,...o.avdName?{avdName:o.avdName}:{},detectionPath:o.detectionPath,...o.processExit?{processExit:{...o.processExit}}:{},...o.outputTail?{outputTail:o.outputTail}:{},...o.outputUnavailable==="adopted"?{outputUnavailable:o.outputUnavailable}:{},...o.lastAdbState?{lastAdbState:o.lastAdbState}:{},...o.session?{session:{...o.session}}:{},recovery:{policy:{...o.recoveryPolicy},attempts:[]}};return await this.getDb().transaction().execute(async(a)=>{await a.insertInto("emulator_loss_incidents").values({incident_id:s.id,device_id:s.deviceId,observed_at_ms:s.observedAtMs,updated_at_ms:s.updatedAtMs,revision:0,incident_json:JSON.stringify(s)}).execute();let c=(await a.selectFrom("emulator_loss_incidents").select("incident_id").orderBy("observed_at_ms","desc").orderBy("id","desc").execute()).slice(this.maxRetained).map((u)=>u.incident_id);if(c.length>0)await a.deleteFrom("emulator_loss_incidents").where("incident_id","in",c).execute()}),s}async recordRecoveryAttempt(o,n){await this.update(o,(s)=>{s.recovery.attempts.push({...n})})}async completeRecovery(o,n,s={}){await this.update(o,(a)=>{if(a.recovery.outcome=n,s.replacementDeviceId)a.replacementDeviceId=s.replacementDeviceId;if(a.session&&s.sessionState)a.session.state=s.sessionState})}async get(o){let n=await this.getDb().selectFrom("emulator_loss_incidents").select("incident_json").where("incident_id","=",o).executeTakeFirst();return n?yt(n.incident_json):void 0}async list(o=this.maxRetained){return(await this.getDb().selectFrom("emulator_loss_incidents").select("incident_json").orderBy("observed_at_ms","desc").orderBy("id","desc").limit(o).execute()).flatMap((s)=>{let a=yt(s.incident_json);return a?[a]:[]})}getDb(){return this.database??_e()}async update(o,n){for(let s=0;s<$d;s++){let a=await this.getDb().selectFrom("emulator_loss_incidents").select(["incident_json","revision"]).where("incident_id","=",o).executeTakeFirst();if(!a)return;let d=yt(a.incident_json);if(!d)return;n(d),d.updatedAtMs=this.timer.now();let c=await this.getDb().updateTable("emulator_loss_incidents").set({updated_at_ms:d.updatedAtMs,revision:a.revision+1,incident_json:JSON.stringify(d)}).where("incident_id","=",o).where("revision","=",a.revision).executeTakeFirst();if(Number(c.numUpdatedRows)>0)return}throw Error(`Could not update emulator-loss incident ${o} after concurrent updates`)}}var Fe={ARCHIVE:"automobile:emulators/loss-incidents"};async function Hd(o={}){try{let n=await(o.reader??new wM).list();return{uri:Fe.ARCHIVE,mimeType:"application/json",text:JSON.stringify({incidents:n,count:n.length},null,2)}}catch(n){return e.warn(`[EmulatorLossIncidentResources] Failed to list incidents: ${n}`,n),{uri:Fe.ARCHIVE,mimeType:"application/json",text:JSON.stringify({error:"Failed to list emulator-loss incidents."},null,2)}}}function si(o={}){q.register(Fe.ARCHIVE,"Android Emulator Loss Incidents",{description:"Bounded diagnostics and recovery outcomes for unexpectedly lost Android emulators.",mimeType:"application/json",handler:()=>Hd(o)})}class vt{minted=new Set;toolResultsNoStructuredContent=new Map;actionsCompactMetadata=new Map;prototypeFullSchema=new Map;record(o){if(o.trim().length>0)this.minted.add(o)}has(o){return this.minted.has(o)}setToolResultsNoStructuredContent(o,n){if(o.trim().length>0){if(this.toolResultsNoStructuredContent.get(o)!==n)this.toolResultsNoStructuredContent.set(o,n),_r.emit("tools")}}getToolResultsNoStructuredContent(o){return this.toolResultsNoStructuredContent.get(o)}setActionsCompactMetadata(o,n){if(o.trim().length>0)this.actionsCompactMetadata.set(o,n)}getActionsCompactMetadata(o){return this.actionsCompactMetadata.get(o)}setPrototypeFullSchema(o,n){if(o.trim().length>0&&this.prototypeFullSchema.get(o)!==n)this.prototypeFullSchema.set(o,n),_r.emit("tools")}getPrototypeFullSchema(o){return this.prototypeFullSchema.get(o)}}class ht{db;constructor({db:o}={}){this.db=o??null}getDb(){return this.db??_e()}async insert(o){try{await(await this.getDb()).insertInto("tool_selection_profile_provenance").values({profile_uuid:o}).onConflict((s)=>s.column("profile_uuid").doNothing()).execute()}catch(n){e.warn(`[ToolSelectionProfileProvenanceRepository] Failed to persist minted profile ${o}: ${n}`)}}async loadAll(){try{return(await(await this.getDb()).selectFrom("tool_selection_profile_provenance").select(["profile_uuid"]).execute()).map((s)=>s.profile_uuid)}catch(o){return e.warn(`[ToolSelectionProfileProvenanceRepository] Failed to load persisted profiles: ${o}`),[]}}}class ai{repository;memory=new vt;constructor(o){this.repository=o}record(o){if(this.memory.record(o),o.trim().length>0)Jt().track(()=>this.repository.insert(o))}has(o){return this.memory.has(o)}setToolResultsNoStructuredContent(o,n){this.memory.setToolResultsNoStructuredContent(o,n)}getToolResultsNoStructuredContent(o){return this.memory.getToolResultsNoStructuredContent(o)}setActionsCompactMetadata(o,n){this.memory.setActionsCompactMetadata(o,n)}getActionsCompactMetadata(o){return this.memory.getActionsCompactMetadata(o)}setPrototypeFullSchema(o,n){this.memory.setPrototypeFullSchema(o,n)}getPrototypeFullSchema(o){return this.memory.getPrototypeFullSchema(o)}async load(){let o=await this.repository.loadAll();for(let n of o)this.memory.record(n)}}var zU=new ai(new ht);var Rt;function sce(o){fX(()=>it.getInstance()),cre(()=>it.getInstance()),Hte(()=>it.getInstance()),sS();let n=F.removalEpochForRegistration;if(Rt?.daemonMode!==o||Rt.removalEpoch!==n){let s=(a)=>x.getInstance(a);KM({daemonMode:o,iosRunnerLocation:s,iosAccessibilityFocus:s,keystoreReset:(a)=>E.getInstance(a)}),Rt={daemonMode:o,removalEpoch:F.removalEpochForRegistration}}MQ(new Set(F.getConfigurableToolNames()))}var bt;function Kd(o){if(bt?.iosDependencies===o&&bt.clearEpoch===q.clearEpochForRegistration)return;Vd(o),bt={iosDependencies:o,clearEpoch:q.clearEpochForRegistration}}function Vd(o){dJ(),P7(),S7({featureFlags:()=>ar.getInstance()}),RJ(),PJ(),bJ(),So(()=>DM()),No(),_o(),Fo(),Go(),Wo(),Yo(),Qo(),uX(),or(),dr(),Ur({createIosStorageDiscovery:(n)=>Or(x.getInstance(n))}),Fr(),jr(),Kr(),Vr(),Jr(),zr(),Wr(),lX(),ei({iosDependencies:o}),ti(),ni(),si()}function di(o){return o.requestMcpSessionId??o.sessionContext?.sessionId}function Gd(o){if(o.taskOwnerKey?.trim())return o.taskOwnerKey;let n=o.stateless?o.requestMcpSessionId:di(o);return n?.trim()?n:void 0}function Jd(o){return o.taskManager??(o.daemonMode?po():void 0)}function Yd(o,n,s){let a=Jd(n),d=Gd(n);if(a)nJ(o,{taskManager:a,ownerKey:d});return go({execute:s,taskManager:a,ownerKey:d,eligibleTools:n.taskEligibleTools??mo,...n.taskLeaseKeepalive&&{keepalive:n.taskLeaseKeepalive}})}function Qd(o){if(o.sessionToolBindingStore)return{store:o.sessionToolBindingStore,owned:!1};if(o.daemonMode&&o.stateless)return{store:Ke(),owned:!1};return{store:He(),owned:!0}}function Xd(o){if(o.deviceReadiness)F.setDeviceReadiness(o.deviceReadiness);else if(!o.daemonMode&&!F.hasDeviceReadiness())F.setDeviceReadiness(Kc.createInstance())}function Zd(o){return{resources:{subscribe:!0,listChanged:!0},tools:o==="modern"?{listChanged:!0}:{},prompts:{},...o==="modern"&&{extensions:{[mv]:{}}}}}function ec(o,n){if(n.era==="modern")return{era:"modern",deviceChoiceRequestState:n.deviceChoiceRequestState};return o?{}:{ambiguousDeviceElicitation:n.ambiguousDeviceElicitation??{}}}function tc(o){return o.era==="modern"?{verify:(o.deviceChoiceRequestState??GU).verify}:void 0}function oc(o){SJ(o),wJ((n)=>E.getInstance(n))}var pG=(o={})=>{F.setMutationRecording(WH(w,{keyboardProfilesFor:(T)=>E.getInstance(T)})),Xd(o);let n=Qd(o),s=new qe(o.sessionContext?.initialSessionToolBinding,o.sessionContext?.initialToolSelectionProfile,void 0,{initialReleasedSessionUuid:o.sessionContext?.initialReleasedSession,namesLiveSessionOfBoundPlan:Te,store:n.store}),a=di(o),d=o.planExecutionLock??Ct(),c=o.daemonMode??!1,u=o.toolSelectionProfileRegistry??zU;oc(ar.getInstance()),ar.getInstance().initialize().catch((T)=>{e.warn(`Failed to initialize feature flags: ${T}`)}),Ot.startPhase("toolRegistration"),sce(c),Ot.endPhase("toolRegistration");let m=o.iosDependencies??bn({coreDeviceProbe:Ob()});Ot.startPhase("resourceRegistration"),Kd(m),Ot.endPhase("resourceRegistration"),Ot.startPhase("sdkInitialization");let p=RM({name:"AutoMobile",version:Nn()},Zd(o.era),{cacheHints:o.era==="modern"?Tt:void 0,requestState:tc(o)});Ot.endPhase("sdkInitialization"),Ot.startPhase("serverHandlerRegistration");let f={ephemeral:o.stateless===!0};if(F.registerWithServer(p,f),ar.getInstance().setToolListChangedNotifier({notifyToolListChanged:()=>F.notifyToolListChanged()}),yN(p),q.registerWithServer(p,(T)=>({sessionUuid:s.effectiveSessionUuid(a),ownsSession:(D)=>s.ownsSession(a,D),releasedSessionUuid:s.releasedResourceSessionUuid(a),signal:T,clientSupportsApps:wH(p.server.getClientCapabilities())}),f),f.ephemeral){let T=p.close.bind(p);p.close=async()=>{try{await T()}finally{s.dispose(),F.untrackServer(p),q.untrackServer(p)}}}let S=p.server.onclose;p.server.onclose=()=>{if(s.dispose(),n.owned)n.store.dispose();if(!c)mN(o.sessionContext?.sessionId);S?.()};let h=Vt({options:o,bindingKey:a,sessionToolBinding:s,toolSelectionProfileRegistry:u});p.server.setRequestHandler("tools/list",async()=>await h()),p.server.setRequestHandler("ping",async()=>({})),p.server.setRequestHandler("prompts/list",async()=>({prompts:[]}));let R=(T)=>{if(c&&T.params&&T.params.arguments)T.params.arguments=zre(T.params.arguments);e.info("Request: ",{...T,params:{...T.params,arguments:Eh(T.params.name,yi(T.params.arguments))}})},C=lo({options:o,daemonMode:c,serverBindingKey:a,sessionToolBinding:s,planExecutionLock:d,toolSelectionProfileRegistry:u,listSessionTools:h});return rJ(tJ(Xr.getInstance())),AM(p,{progressFailureMessage:"Failed to send progress notification",prepare:R,execute:Yd(p,o,C)},ec(c,o)),Ot.endPhase("serverHandlerRegistration"),p};function jU(){return q.refreshBeforeList()}
4
+ export{FE,Y8,J8,X8,Z8,Q8,Py,HU,qU,VU,LE,WU,BE,eJ,wM,zU,sce,pG,jU};
5
+
6
+ //# debugId=AEFF62891705452F64756E2164756E21
@@ -1,6 +1,6 @@
1
1
  // @bun
2
- import{i,Se,Qe,e}from"./chunk-z637nqg8.js";import{f}from"./chunk-58wzr3mt.js";import{Io,_o,sn,De,nY,une,pne,an,bi,so,NY}from"./chunk-r5bxavdx.js";import{n,a,s}from"./chunk-4hw3665t.js";import{r,t}from"./chunk-rbpdk7m0.js";import E from"path";var k="AutoMobile Network Identity Probe.app",L="dev.jasonpearson.automobile.networkfilter",C="dev.jasonpearson.automobile.networkfilter.provider",q=E.posix.join("Contents","MacOS","network-filter-controller"),B=E.posix.join("Contents","Library","SystemExtensions",`${C}.systemextension`),S="/Applications",g=f.NETWORK_FILTER_APP_PATH.name,M=f.NETWORK_FILTER_TEAM_ID.name,hm="auto-mobile --ios-network-filter install",W=`Open System Settings > General > Login Items & Extensions > Network Extensions (macOS 13 and 14: System Settings > Privacy & Security, then Allow) and enable "AutoMobile Network Identity Probe". Allow the content filter when macOS asks, then run \`${hm}\` again. AutoMobile never approves the extension for you.`,K=`Restart macOS to finish installing the Network Extension, then run \`${hm}\` again.`;function I(o=S){return E.join(o,k)}function R(o){return E.join(o,q)}function V(o){return E.join(o,B)}import v from"path";var z=127;class d{async run(o,l,p={}){try{let c=await Io((m)=>_o(o,[...l],m),{timeoutMs:p.timeoutMs,maxBuffer:16777216,killSignal:"SIGKILL"},{command:o,args:[...l]},{preserveError:!0});return{exitCode:0,stdout:c.stdout,stderr:c.stderr,timedOut:!1}}catch(c){let m=c;return e.debug(`[NETWORK_FILTER] ${o} exited unsuccessfully: ${r(c)}`),{exitCode:typeof m.code==="number"?m.code:z,stdout:String(m.stdout??""),stderr:String(m.stderr??(typeof m.code==="string"?m.code:"")),timedOut:m.killed===!0&&m.signal==="SIGKILL"}}}}import*as u from"fs/promises";var X=448,Z=384;async function j(o){try{let l=await u.stat(o);if(l.isDirectory())return"directory";return l.isFile()?"file":null}catch(l){return e.debug(`[NETWORK_FILTER] ${o} is not statable: ${r(l)}`),null}}class w{async isDirectory(o){return await j(o)==="directory"}async isFile(o){return await j(o)==="file"}async readText(o){try{return await u.readFile(o,"utf8")}catch(l){return e.debug(`[NETWORK_FILTER] ${o} is not readable: ${r(l)}`),null}}async writeText(o,l){await u.writeFile(o,l,{encoding:"utf8",mode:Z})}async ensureDir(o){await u.mkdir(o,{recursive:!0,mode:X})}async remove(o){await u.rm(o,{recursive:!0,force:!0})}async rename(o,l){await u.rename(o,l)}}var Q="network-filter",Y="network-filter.json",ee=60000,te=60000,x="local-override";class T{downloader;checksumCalculator;fileSystem;commandRunner;cacheDir;timer;cache;env;downloadTimeoutMs;expectedChecksumOverride;releaseUrlOverride;inFlight=null;constructor(o={}){this.downloader=o.downloader??new bi,this.checksumCalculator=o.checksumCalculator??new an,this.fileSystem=o.fileSystem??new w,this.commandRunner=o.commandRunner??new d,this.cacheDir=o.cacheDir??Qe(Q),this.timer=o.timer??i,this.cache=new so({downloader:this.downloader,checksumCalculator:this.checksumCalculator,fileSystem:this.fileSystem,timer:this.timer}),this.env=o.env??process.env,this.downloadTimeoutMs=o.downloadTimeoutMs??ee,this.expectedChecksumOverride=o.expectedChecksum,this.releaseUrlOverride=o.releaseUrl}get cacheDirectory(){return this.cacheDir}async ensure(){if(this.inFlight)return this.inFlight;return this.inFlight=this.doEnsure().finally(()=>{this.inFlight=null}),this.inFlight}async doEnsure(){let o=this.env[g]?.trim();if(o)return this.resolveOverride(o);let l=sn(De(this.env)),p=this.expectedChecksumOverride??pne(this.env);if(p.length===0)throw new t(`No Network Extension app is published for AutoMobile ${l}: the release checksum registry has no networkFilterSha256 for this version, so no download can be trusted. Upgrade AutoMobile, or set ${g} to a locally built, Developer ID signed app.`);let c=await this.tryCache(p);if(c)return e.info("[NETWORK_FILTER] Reusing verified release app",{path:c}),{appPath:c,source:"release",version:l,sha256:p};return{appPath:await this.download(p,l),source:"release",version:l,sha256:p}}async resolveOverride(o){let l=Se(o,this.env);if(!l.endsWith(".app")||!await this.fileSystem.isDirectory(l))throw new t(`${g} must point at an app bundle directory ending in .app, but ${l} is not one. Build it with scripts/ios/build-network-filter-probe.sh signed.`);if(!await this.fileSystem.isFile(R(l)))throw new t(`${g} points at ${l}, which has no Contents/MacOS/network-filter-controller. Build it with scripts/ios/build-network-filter-probe.sh signed.`);return{appPath:l,source:"override",version:x,sha256:null}}get metadataPath(){return v.join(this.cacheDir,Y)}get appDir(){return v.join(this.cacheDir,"app")}get cachedAppPath(){return v.join(this.appDir,k)}async tryCache(o){return await this.cache.isCached({label:"[NETWORK_FILTER]",subject:"app",expectedSha256:o,metadataPath:this.metadataPath,parseMetadata:(p)=>re(p)?p:null,verifyArtifact:()=>this.fileSystem.isFile(R(this.cachedAppPath))})?this.cachedAppPath:null}async download(o,l){await this.fileSystem.ensureDir(this.cacheDir);let p=v.join(this.cacheDir,`${nY}.download`),c=v.join(this.cacheDir,"app.download");return await this.cache.fetch({label:"[NETWORK_FILTER]",expectedSha256:o,url:this.releaseUrlOverride??une(this.env),archivePath:p,metadataPath:this.metadataPath,downloadTimeoutMs:this.downloadTimeoutMs,mismatchError:(m,N)=>new t(`Network Extension app checksum verification failed. Expected: ${m}, Got: ${N}. The downloaded release asset is corrupted or tampered; nothing was installed.`),timeoutError:()=>new t(`Timed out downloading the Network Extension app after ${this.downloadTimeoutMs}ms. Check GitHub Release asset availability or set ${g} for a local build.`),publish:async(m,N)=>{await this.fileSystem.remove(c),await this.fileSystem.ensureDir(c);let F=await this.commandRunner.run("ditto",["-x","-k",m,c],{timeoutMs:te});if(F.exitCode!==0)throw new t(`Unable to unpack the Network Extension app archive with ditto (exit ${F.exitCode}): ${F.stderr.trim()||"no output"}`);let y=v.join(c,k);if(!await this.fileSystem.isFile(R(y)))throw new t(`The Network Extension release asset does not contain ${k} with its controller executable.`);return await this.fileSystem.remove(this.appDir),await this.fileSystem.rename(c,this.appDir),e.info("[NETWORK_FILTER] Downloaded and verified release app",{path:this.cachedAppPath,sha256:N}),{version:l,sha256:N??o,downloadedAt:this.timer.now()}},discard:()=>this.fileSystem.remove(c),settle:()=>this.fileSystem.remove(p)}),this.cachedAppPath}}function re(o){return typeof o==="object"&&o!==null&&"sha256"in o&&typeof o.sha256==="string"}var U=30000;function H(o,l){let p=`${l}=`,m=o.split(/\r?\n/).find((N)=>N.startsWith(p))?.slice(p.length).trim();return m&&m.length>0?m:null}class A{runner;constructor(o=new d){this.runner=o}async inspect(o){let l=await this.runner.run("codesign",["--verify","--deep","--strict",o],{timeoutMs:U});return{verified:l.exitCode===0,verifyDetail:l.stderr.trim(),app:await this.identity(o),provider:await this.identity(V(o))}}async identity(o){let l=await this.runner.run("codesign",["-dvvv",o],{timeoutMs:U}),p=`${l.stderr}
3
- ${l.stdout}`;return{identifier:H(p,"Identifier"),teamIdentifier:NY(p),cdhash:H(p,"CDHash")}}}var ie=/^[A-Z0-9]{10}$/;function D(o,l){return[ne(o),J("app",o.app.identifier,L),J("provider",o.provider.identifier,C),oe(o),ae(o.app.teamIdentifier,l)].filter((p)=>p!==null)}function ne(o){if(o.verified)return null;return`codesign --verify --deep --strict failed${o.verifyDetail?`: ${o.verifyDetail}`:""}`}function J(o,l,p){return l===p?null:`${o} identifier is ${l??"missing"}, expected ${p}`}function oe(o){let l=o.app.teamIdentifier;if(l===null||!ie.test(l))return`app is not signed by a Developer ID team (TeamIdentifier ${l??"not set"})`;let p=o.provider.teamIdentifier;return p===l?null:`provider team ${p??"not set"} differs from app team ${l}`}function ae(o,l){if(!l||o===l)return null;return`signing team ${o??"not set"} does not match the pinned team ${l}`}var se=30000,le=s({version:a().optional(),state:n(),detail:n()});function pe(o){let p=o.split(/\r?\n/).map((c)=>c.trim()).filter((c)=>c.startsWith("{")).at(-1);if(p===void 0)return null;try{let c=le.safeParse(JSON.parse(p));return c.success?c.data:null}catch(c){return e.debug(`[NETWORK_FILTER] controller output is not JSON: ${r(c)}`),null}}function ce(o){if(o.timedOut)return{state:"unavailable",controllerState:null,detail:"network-filter-controller did not exit in time; activation may still have completed.",nextSteps:`Run \`${hm}\` again to reconcile.`};let l=pe(o.stdout);if(l===null)return{state:"failed",controllerState:null,detail:`network-filter-controller exited ${o.exitCode} without a JSON result`+(o.stderr.trim()?`: ${o.stderr.trim()}`:".")};let p={controllerState:l.state,detail:l.detail};switch(l.state){case"ready":return o.exitCode===0?{...p,state:"ready"}:{...p,state:"failed"};case"approval_required":return/restart/i.test(l.detail)?{...p,state:"restart_required",nextSteps:K}:{...p,state:"approval_required",nextSteps:W};case"unavailable":return{...p,state:"unavailable"};default:return{...p,state:"failed"}}}async function _(o,l,p,c=se){let m=await o.run(R(l),[p],{timeoutMs:c});return ce(m)}import P from"path";var me=120000;class O{runner;fileSystem;constructor(o=new d,l=new w){this.runner=o;this.fileSystem=l}async exists(o){return this.fileSystem.isDirectory(o)}async install(o,l,p){if(!p.replace&&await this.exists(l))throw new t(`Refusing to overwrite the existing ${l}.`);let c=P.join(P.dirname(l),`.${P.basename(l)}.partial`);await this.fileSystem.remove(c);let m=await this.runner.run("ditto",[o,c],{timeoutMs:me});if(m.exitCode!==0)throw await this.fileSystem.remove(c),new t(`Unable to copy the Network Extension app to ${P.dirname(l)} (ditto exit ${m.exitCode}): ${m.stderr.trim()||"no output"}. Installing into /Applications needs an administrator account.`);await this.fileSystem.remove(l),await this.fileSystem.rename(c,l)}}import de from"path";var G="install-receipt.json";function b(o){return de.join(o,G)}class G0{fileSystem;commandRunner;cacheDir;env;destination;constructor(o={}){this.fileSystem=o.fileSystem??new w,this.commandRunner=o.commandRunner??new d,this.cacheDir=o.cacheDir,this.env=o.env??process.env,this.destination=I(o.installDir??S)}async inspect(o={}){let l=this.env[g]?.trim()?x:sn(De(this.env)),p={installed:!1,installedPath:this.destination,installedVersion:null,expectedVersion:l,report:null};if(!await this.fileSystem.isDirectory(this.destination))return p;let c=this.cacheDir??new T({env:this.env}).cacheDirectory;return{...p,installed:!0,installedVersion:await this.readReceiptVersion(c),report:await _(this.commandRunner,this.destination,"status",o.timeoutMs)}}async readReceiptVersion(o){let l=await this.fileSystem.readText(b(o));if(l===null)return null;try{let p=JSON.parse(l);return typeof p==="object"&&p!==null&&"version"in p&&typeof p.version==="string"?p.version:null}catch(p){return e.debug(`[NETWORK_FILTER] Ignoring unreadable install receipt: ${r(p)}`),null}}}function ue(o){let l=o[M]?.trim();return l&&l.length>0?l:null}class Iae{appSource;verifier;fileInstaller;commandRunner;fileSystem;timer;env;platform;destination;constructor(o={}){this.env=o.env??process.env,this.commandRunner=o.commandRunner??new d,this.fileSystem=o.fileSystem??new w,this.appSource=o.appSource??new T({env:this.env,commandRunner:this.commandRunner,fileSystem:this.fileSystem}),this.verifier=o.verifier??new A(this.commandRunner),this.fileInstaller=o.fileInstaller??new O(this.commandRunner,this.fileSystem),this.timer=o.timer??i,this.platform=o.platform??process.platform,this.destination=I(o.installDir??S)}async install(o={}){let l={action:"none",installedPath:this.destination};if(this.platform!=="darwin")return{...l,state:"unavailable",detail:"The Network Extension app only runs on macOS hosts."};let p,c;try{p=await this.appSource.ensure(),c=await this.verifier.inspect(p.appPath)}catch(h){return e.warn(`[NETWORK_FILTER] Unable to prepare the app: ${r(h)}`,h),{...l,state:"failed",detail:r(h)}}let m={source:p.source,version:p.version},N=D(c,ue(this.env));if(N.length>0)return{...l,...m,state:"failed",detail:`Refusing to install ${p.appPath}: ${N.join("; ")}.`};let F;try{let h=await this.place(p,c,o.upgrade===!0);if("refused"in h)return{...l,...m,state:"failed",...h.refused};F=h.action}catch(h){return e.warn(`[NETWORK_FILTER] Unable to install the app: ${r(h)}`,h),{...l,...m,state:"failed",detail:r(h)}}await this.writeReceipt(p,c);let y=await this.activate();return{...m,action:F,installedPath:this.destination,state:y.state,detail:y.detail,nextSteps:y.nextSteps,controllerState:y.controllerState}}async place(o,l,p){if(!await this.fileInstaller.exists(this.destination))return await this.fileInstaller.install(o.appPath,this.destination,{replace:!1}),{action:"installed"};let c=await this.verifier.inspect(this.destination);if(c.app.cdhash!==null&&c.app.cdhash===l.app.cdhash&&c.app.teamIdentifier===l.app.teamIdentifier&&D(c,null).length===0)return{action:"unchanged"};if(!p)return{refused:{detail:`${this.destination} already exists with a different version or signature (installed CDHash ${c.app.cdhash??"unknown"}, team ${c.app.teamIdentifier??"not set"}). It was left unchanged.`,nextSteps:`Run \`${hm} --upgrade\` to replace it.`}};return await this.fileInstaller.install(o.appPath,this.destination,{replace:!0}),{action:"upgraded"}}async writeReceipt(o,l){let p={version:o.version,source:o.source,sha256:o.sha256,cdhash:l.app.cdhash,installedAt:this.timer.now()};try{await this.fileSystem.ensureDir(this.appSource.cacheDirectory),await this.fileSystem.writeText(b(this.appSource.cacheDirectory),JSON.stringify(p,null,2))}catch(c){e.warn(`[NETWORK_FILTER] Unable to write the install receipt: ${r(c)}`,c)}}async activate(){try{return await _(this.commandRunner,this.destination,"activate")}catch(o){return e.warn(`[NETWORK_FILTER] Activation failed: ${r(o)}`,o),{state:"failed",controllerState:null,detail:r(o)}}}}
4
- export{hm,G0,Iae};
2
+ import{i,Se,Je,e}from"./chunk-r0vp315h.js";import{h}from"./chunk-5wk1t46v.js";import{xo,Co,cn,De,TY,Wne,zne,dn,Pi,co,n9}from"./chunk-sfqe223f.js";import{n,a,s}from"./chunk-w5yypt53.js";import{r,t}from"./chunk-2b39zyxc.js";import E from"path";var k="AutoMobile Network Identity Probe.app",L="dev.jasonpearson.automobile.networkfilter",C="dev.jasonpearson.automobile.networkfilter.provider",q=E.posix.join("Contents","MacOS","network-filter-controller"),B=E.posix.join("Contents","Library","SystemExtensions",`${C}.systemextension`),S="/Applications",g=h.NETWORK_FILTER_APP_PATH.name,M=h.NETWORK_FILTER_TEAM_ID.name,Im="auto-mobile --ios-network-filter install",W=`Open System Settings > General > Login Items & Extensions > Network Extensions (macOS 13 and 14: System Settings > Privacy & Security, then Allow) and enable "AutoMobile Network Identity Probe". Allow the content filter when macOS asks, then run \`${Im}\` again. AutoMobile never approves the extension for you.`,K=`Restart macOS to finish installing the Network Extension, then run \`${Im}\` again.`;function I(o=S){return E.join(o,k)}function R(o){return E.join(o,q)}function V(o){return E.join(o,B)}import v from"path";var z=127;class d{async run(o,l,p={}){try{let c=await xo((m)=>Co(o,[...l],m),{timeoutMs:p.timeoutMs,maxBuffer:16777216,killSignal:"SIGKILL"},{command:o,args:[...l]},{preserveError:!0});return{exitCode:0,stdout:c.stdout,stderr:c.stderr,timedOut:!1}}catch(c){let m=c;return e.debug(`[NETWORK_FILTER] ${o} exited unsuccessfully: ${r(c)}`),{exitCode:typeof m.code==="number"?m.code:z,stdout:String(m.stdout??""),stderr:String(m.stderr??(typeof m.code==="string"?m.code:"")),timedOut:m.killed===!0&&m.signal==="SIGKILL"}}}}import*as u from"fs/promises";var X=448,Z=384;async function j(o){try{let l=await u.stat(o);if(l.isDirectory())return"directory";return l.isFile()?"file":null}catch(l){return e.debug(`[NETWORK_FILTER] ${o} is not statable: ${r(l)}`),null}}class w{async isDirectory(o){return await j(o)==="directory"}async isFile(o){return await j(o)==="file"}async readText(o){try{return await u.readFile(o,"utf8")}catch(l){return e.debug(`[NETWORK_FILTER] ${o} is not readable: ${r(l)}`),null}}async writeText(o,l){await u.writeFile(o,l,{encoding:"utf8",mode:Z})}async ensureDir(o){await u.mkdir(o,{recursive:!0,mode:X})}async remove(o){await u.rm(o,{recursive:!0,force:!0})}async rename(o,l){await u.rename(o,l)}}var Q="network-filter",Y="network-filter.json",ee=60000,te=60000,x="local-override";class T{downloader;checksumCalculator;fileSystem;commandRunner;cacheDir;timer;cache;env;downloadTimeoutMs;expectedChecksumOverride;releaseUrlOverride;inFlight=null;constructor(o={}){this.downloader=o.downloader??new Pi,this.checksumCalculator=o.checksumCalculator??new dn,this.fileSystem=o.fileSystem??new w,this.commandRunner=o.commandRunner??new d,this.cacheDir=o.cacheDir??Je(Q),this.timer=o.timer??i,this.cache=new co({downloader:this.downloader,checksumCalculator:this.checksumCalculator,fileSystem:this.fileSystem,timer:this.timer}),this.env=o.env??process.env,this.downloadTimeoutMs=o.downloadTimeoutMs??ee,this.expectedChecksumOverride=o.expectedChecksum,this.releaseUrlOverride=o.releaseUrl}get cacheDirectory(){return this.cacheDir}async ensure(){if(this.inFlight)return this.inFlight;return this.inFlight=this.doEnsure().finally(()=>{this.inFlight=null}),this.inFlight}async doEnsure(){let o=this.env[g]?.trim();if(o)return this.resolveOverride(o);let l=cn(De(this.env)),p=this.expectedChecksumOverride??zne(this.env);if(p.length===0)throw new t(`No Network Extension app is published for AutoMobile ${l}: the release checksum registry has no networkFilterSha256 for this version, so no download can be trusted. Upgrade AutoMobile, or set ${g} to a locally built, Developer ID signed app.`);let c=await this.tryCache(p);if(c)return e.info("[NETWORK_FILTER] Reusing verified release app",{path:c}),{appPath:c,source:"release",version:l,sha256:p};return{appPath:await this.download(p,l),source:"release",version:l,sha256:p}}async resolveOverride(o){let l=Se(o,this.env);if(!l.endsWith(".app")||!await this.fileSystem.isDirectory(l))throw new t(`${g} must point at an app bundle directory ending in .app, but ${l} is not one. Build it with scripts/ios/build-network-filter-probe.sh signed.`);if(!await this.fileSystem.isFile(R(l)))throw new t(`${g} points at ${l}, which has no Contents/MacOS/network-filter-controller. Build it with scripts/ios/build-network-filter-probe.sh signed.`);return{appPath:l,source:"override",version:x,sha256:null}}get metadataPath(){return v.join(this.cacheDir,Y)}get appDir(){return v.join(this.cacheDir,"app")}get cachedAppPath(){return v.join(this.appDir,k)}async tryCache(o){return await this.cache.isCached({label:"[NETWORK_FILTER]",subject:"app",expectedSha256:o,metadataPath:this.metadataPath,parseMetadata:(p)=>re(p)?p:null,verifyArtifact:()=>this.fileSystem.isFile(R(this.cachedAppPath))})?this.cachedAppPath:null}async download(o,l){await this.fileSystem.ensureDir(this.cacheDir);let p=v.join(this.cacheDir,`${TY}.download`),c=v.join(this.cacheDir,"app.download");return await this.cache.fetch({label:"[NETWORK_FILTER]",expectedSha256:o,url:this.releaseUrlOverride??Wne(this.env),archivePath:p,metadataPath:this.metadataPath,downloadTimeoutMs:this.downloadTimeoutMs,mismatchError:(m,N)=>new t(`Network Extension app checksum verification failed. Expected: ${m}, Got: ${N}. The downloaded release asset is corrupted or tampered; nothing was installed.`),timeoutError:()=>new t(`Timed out downloading the Network Extension app after ${this.downloadTimeoutMs}ms. Check GitHub Release asset availability or set ${g} for a local build.`),publish:async(m,N)=>{await this.fileSystem.remove(c),await this.fileSystem.ensureDir(c);let F=await this.commandRunner.run("ditto",["-x","-k",m,c],{timeoutMs:te});if(F.exitCode!==0)throw new t(`Unable to unpack the Network Extension app archive with ditto (exit ${F.exitCode}): ${F.stderr.trim()||"no output"}`);let y=v.join(c,k);if(!await this.fileSystem.isFile(R(y)))throw new t(`The Network Extension release asset does not contain ${k} with its controller executable.`);return await this.fileSystem.remove(this.appDir),await this.fileSystem.rename(c,this.appDir),e.info("[NETWORK_FILTER] Downloaded and verified release app",{path:this.cachedAppPath,sha256:N}),{version:l,sha256:N??o,downloadedAt:this.timer.now()}},discard:()=>this.fileSystem.remove(c),settle:()=>this.fileSystem.remove(p)}),this.cachedAppPath}}function re(o){return typeof o==="object"&&o!==null&&"sha256"in o&&typeof o.sha256==="string"}var U=30000;function H(o,l){let p=`${l}=`,m=o.split(/\r?\n/).find((N)=>N.startsWith(p))?.slice(p.length).trim();return m&&m.length>0?m:null}class A{runner;constructor(o=new d){this.runner=o}async inspect(o){let l=await this.runner.run("codesign",["--verify","--deep","--strict",o],{timeoutMs:U});return{verified:l.exitCode===0,verifyDetail:l.stderr.trim(),app:await this.identity(o),provider:await this.identity(V(o))}}async identity(o){let l=await this.runner.run("codesign",["-dvvv",o],{timeoutMs:U}),p=`${l.stderr}
3
+ ${l.stdout}`;return{identifier:H(p,"Identifier"),teamIdentifier:n9(p),cdhash:H(p,"CDHash")}}}var ie=/^[A-Z0-9]{10}$/;function D(o,l){return[ne(o),J("app",o.app.identifier,L),J("provider",o.provider.identifier,C),oe(o),ae(o.app.teamIdentifier,l)].filter((p)=>p!==null)}function ne(o){if(o.verified)return null;return`codesign --verify --deep --strict failed${o.verifyDetail?`: ${o.verifyDetail}`:""}`}function J(o,l,p){return l===p?null:`${o} identifier is ${l??"missing"}, expected ${p}`}function oe(o){let l=o.app.teamIdentifier;if(l===null||!ie.test(l))return`app is not signed by a Developer ID team (TeamIdentifier ${l??"not set"})`;let p=o.provider.teamIdentifier;return p===l?null:`provider team ${p??"not set"} differs from app team ${l}`}function ae(o,l){if(!l||o===l)return null;return`signing team ${o??"not set"} does not match the pinned team ${l}`}var se=30000,le=s({version:a().optional(),state:n(),detail:n()});function pe(o){let p=o.split(/\r?\n/).map((c)=>c.trim()).filter((c)=>c.startsWith("{")).at(-1);if(p===void 0)return null;try{let c=le.safeParse(JSON.parse(p));return c.success?c.data:null}catch(c){return e.debug(`[NETWORK_FILTER] controller output is not JSON: ${r(c)}`),null}}function ce(o){if(o.timedOut)return{state:"unavailable",controllerState:null,detail:"network-filter-controller did not exit in time; activation may still have completed.",nextSteps:`Run \`${Im}\` again to reconcile.`};let l=pe(o.stdout);if(l===null)return{state:"failed",controllerState:null,detail:`network-filter-controller exited ${o.exitCode} without a JSON result`+(o.stderr.trim()?`: ${o.stderr.trim()}`:".")};let p={controllerState:l.state,detail:l.detail};switch(l.state){case"ready":return o.exitCode===0?{...p,state:"ready"}:{...p,state:"failed"};case"approval_required":return/restart/i.test(l.detail)?{...p,state:"restart_required",nextSteps:K}:{...p,state:"approval_required",nextSteps:W};case"unavailable":return{...p,state:"unavailable"};default:return{...p,state:"failed"}}}async function _(o,l,p,c=se){let m=await o.run(R(l),[p],{timeoutMs:c});return ce(m)}import P from"path";var me=120000;class O{runner;fileSystem;constructor(o=new d,l=new w){this.runner=o;this.fileSystem=l}async exists(o){return this.fileSystem.isDirectory(o)}async install(o,l,p){if(!p.replace&&await this.exists(l))throw new t(`Refusing to overwrite the existing ${l}.`);let c=P.join(P.dirname(l),`.${P.basename(l)}.partial`);await this.fileSystem.remove(c);let m=await this.runner.run("ditto",[o,c],{timeoutMs:me});if(m.exitCode!==0)throw await this.fileSystem.remove(c),new t(`Unable to copy the Network Extension app to ${P.dirname(l)} (ditto exit ${m.exitCode}): ${m.stderr.trim()||"no output"}. Installing into /Applications needs an administrator account.`);await this.fileSystem.remove(l),await this.fileSystem.rename(c,l)}}import de from"path";var G="install-receipt.json";function b(o){return de.join(o,G)}class aF{fileSystem;commandRunner;cacheDir;env;destination;constructor(o={}){this.fileSystem=o.fileSystem??new w,this.commandRunner=o.commandRunner??new d,this.cacheDir=o.cacheDir,this.env=o.env??process.env,this.destination=I(o.installDir??S)}async inspect(o={}){let l=this.env[g]?.trim()?x:cn(De(this.env)),p={installed:!1,installedPath:this.destination,installedVersion:null,expectedVersion:l,report:null};if(!await this.fileSystem.isDirectory(this.destination))return p;let c=this.cacheDir??new T({env:this.env}).cacheDirectory;return{...p,installed:!0,installedVersion:await this.readReceiptVersion(c),report:await _(this.commandRunner,this.destination,"status",o.timeoutMs)}}async readReceiptVersion(o){let l=await this.fileSystem.readText(b(o));if(l===null)return null;try{let p=JSON.parse(l);return typeof p==="object"&&p!==null&&"version"in p&&typeof p.version==="string"?p.version:null}catch(p){return e.debug(`[NETWORK_FILTER] Ignoring unreadable install receipt: ${r(p)}`),null}}}function ue(o){let l=o[M]?.trim();return l&&l.length>0?l:null}class cce{appSource;verifier;fileInstaller;commandRunner;fileSystem;timer;env;platform;destination;constructor(o={}){this.env=o.env??process.env,this.commandRunner=o.commandRunner??new d,this.fileSystem=o.fileSystem??new w,this.appSource=o.appSource??new T({env:this.env,commandRunner:this.commandRunner,fileSystem:this.fileSystem}),this.verifier=o.verifier??new A(this.commandRunner),this.fileInstaller=o.fileInstaller??new O(this.commandRunner,this.fileSystem),this.timer=o.timer??i,this.platform=o.platform??process.platform,this.destination=I(o.installDir??S)}async install(o={}){let l={action:"none",installedPath:this.destination};if(this.platform!=="darwin")return{...l,state:"unavailable",detail:"The Network Extension app only runs on macOS hosts."};let p,c;try{p=await this.appSource.ensure(),c=await this.verifier.inspect(p.appPath)}catch(f){return e.warn(`[NETWORK_FILTER] Unable to prepare the app: ${r(f)}`,f),{...l,state:"failed",detail:r(f)}}let m={source:p.source,version:p.version},N=D(c,ue(this.env));if(N.length>0)return{...l,...m,state:"failed",detail:`Refusing to install ${p.appPath}: ${N.join("; ")}.`};let F;try{let f=await this.place(p,c,o.upgrade===!0);if("refused"in f)return{...l,...m,state:"failed",...f.refused};F=f.action}catch(f){return e.warn(`[NETWORK_FILTER] Unable to install the app: ${r(f)}`,f),{...l,...m,state:"failed",detail:r(f)}}await this.writeReceipt(p,c);let y=await this.activate();return{...m,action:F,installedPath:this.destination,state:y.state,detail:y.detail,nextSteps:y.nextSteps,controllerState:y.controllerState}}async place(o,l,p){if(!await this.fileInstaller.exists(this.destination))return await this.fileInstaller.install(o.appPath,this.destination,{replace:!1}),{action:"installed"};let c=await this.verifier.inspect(this.destination);if(c.app.cdhash!==null&&c.app.cdhash===l.app.cdhash&&c.app.teamIdentifier===l.app.teamIdentifier&&D(c,null).length===0)return{action:"unchanged"};if(!p)return{refused:{detail:`${this.destination} already exists with a different version or signature (installed CDHash ${c.app.cdhash??"unknown"}, team ${c.app.teamIdentifier??"not set"}). It was left unchanged.`,nextSteps:`Run \`${Im} --upgrade\` to replace it.`}};return await this.fileInstaller.install(o.appPath,this.destination,{replace:!0}),{action:"upgraded"}}async writeReceipt(o,l){let p={version:o.version,source:o.source,sha256:o.sha256,cdhash:l.app.cdhash,installedAt:this.timer.now()};try{await this.fileSystem.ensureDir(this.appSource.cacheDirectory),await this.fileSystem.writeText(b(this.appSource.cacheDirectory),JSON.stringify(p,null,2))}catch(c){e.warn(`[NETWORK_FILTER] Unable to write the install receipt: ${r(c)}`,c)}}async activate(){try{return await _(this.commandRunner,this.destination,"activate")}catch(o){return e.warn(`[NETWORK_FILTER] Activation failed: ${r(o)}`,o),{state:"failed",controllerState:null,detail:r(o)}}}}
4
+ export{Im,aF,cce};
5
5
 
6
- //# debugId=0FEFFBAE98DCA2BA64756E2164756E21
6
+ //# debugId=58E2CB48A197EA0364756E2164756E21
@@ -0,0 +1,4 @@
1
+ // @bun
2
+ import{ar}from"./chunk-4vxeq0vd.js";import"./chunk-r6pvhj33.js";import"./chunk-r0vp315h.js";import"./chunk-5wk1t46v.js";export{ar as FeatureFlagService};
3
+
4
+ //# debugId=632C9BF2070D73A764756E2164756E21
@@ -0,0 +1,4 @@
1
+ // @bun
2
+ import{_V}from"./chunk-kdczmgwk.js";import"./chunk-qy3khhf8.js";import"./chunk-c27yv1dx.js";import"./chunk-tvq0nzam.js";import"./chunk-661c50hh.js";import"./chunk-b3tdtq7r.js";import"./chunk-cqhw4yr6.js";import"./chunk-vdqag3fj.js";import"./chunk-e0870khr.js";import"./chunk-4vxeq0vd.js";import"./chunk-9xgnrv5w.js";import"./chunk-t54k47em.js";import"./chunk-cb1ga9rd.js";import"./chunk-sfqe223f.js";import"./chunk-r6pvhj33.js";import"./chunk-w5yypt53.js";import"./chunk-aewdveet.js";import"./chunk-r0vp315h.js";import"./chunk-5wk1t46v.js";export{_V as InputText};
3
+
4
+ //# debugId=2BB6100C3B3CFBBE64756E2164756E21