@kaeawc/auto-mobile 0.0.93 → 0.0.94

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (228) hide show
  1. package/dist/build-info.json +12 -12
  2. package/dist/src/ble-peripheral.py +153 -0
  3. package/dist/src/{chunk-r6z1eztj.js → chunk-026y62r9.js} +11 -11
  4. package/dist/src/chunk-0jyfg947.js +4 -0
  5. package/dist/src/{chunk-8g1922rp.js → chunk-0zfpp1wh.js} +4 -4
  6. package/dist/src/{chunk-qf6nynk6.js → chunk-13qxf7ym.js} +5 -5
  7. package/dist/src/chunk-1scenrk7.js +4 -0
  8. package/dist/src/chunk-1vb5ph1k.js +4 -0
  9. package/dist/src/{chunk-710rxz9y.js → chunk-20g565q7.js} +3 -3
  10. package/dist/src/chunk-21h6dhdm.js +5 -0
  11. package/dist/src/chunk-25mfpthk.js +78 -0
  12. package/dist/src/{chunk-rbpdk7m0.js → chunk-2b39zyxc.js} +3 -3
  13. package/dist/src/chunk-2gzd6wbd.js +4 -0
  14. package/dist/src/{chunk-xgan0qqp.js → chunk-3dntffy9.js} +1 -1
  15. package/dist/src/chunk-3gfczcsn.js +4 -0
  16. package/dist/src/{chunk-dgrbdpb7.js → chunk-3h5jz1vb.js} +6 -6
  17. package/dist/src/{chunk-t6c8akcm.js → chunk-41zcy6b3.js} +3 -3
  18. package/dist/src/chunk-47n9m2de.js +4 -0
  19. package/dist/src/chunk-4vxeq0vd.js +58 -0
  20. package/dist/src/chunk-59dx6qaf.js +4 -0
  21. package/dist/src/chunk-5sdf9y92.js +4 -0
  22. package/dist/src/{chunk-58wzr3mt.js → chunk-5wk1t46v.js} +3 -3
  23. package/dist/src/{chunk-vy3bwm1d.js → chunk-661c50hh.js} +5 -5
  24. package/dist/src/chunk-68n6bjjd.js +21 -0
  25. package/dist/src/{chunk-v6pya0dm.js → chunk-69pmjdf2.js} +3 -3
  26. package/dist/src/{chunk-e98dqnc9.js → chunk-6hrj3jt6.js} +20 -20
  27. package/dist/src/{chunk-wbh8spm5.js → chunk-6myr26wx.js} +8 -8
  28. package/dist/src/chunk-6n96k09n.js +4 -0
  29. package/dist/src/chunk-6vwrbkre.js +4 -0
  30. package/dist/src/chunk-6wk0yrab.js +4 -0
  31. package/dist/src/chunk-6yhm9een.js +4 -0
  32. package/dist/src/{chunk-mjrps0ac.js → chunk-7k7gjg2t.js} +5 -5
  33. package/dist/src/chunk-7n5fz68h.js +4 -0
  34. package/dist/src/chunk-8cvnpnbp.js +4 -0
  35. package/dist/src/chunk-8kzv7rk7.js +4 -0
  36. package/dist/src/chunk-8nj68t1v.js +167 -0
  37. package/dist/src/{chunk-g7tmjbkt.js → chunk-96r3bpg7.js} +3 -3
  38. package/dist/src/chunk-97x887te.js +4 -0
  39. package/dist/src/{chunk-8ph29g99.js → chunk-99a6tbvd.js} +1 -1
  40. package/dist/src/chunk-9p5d2994.js +5 -0
  41. package/dist/src/{chunk-aabchzxk.js → chunk-9q265er0.js} +4 -4
  42. package/dist/src/{chunk-jh6vhqzx.js → chunk-9xgnrv5w.js} +3 -3
  43. package/dist/src/chunk-9xgsmshb.js +5 -0
  44. package/dist/src/chunk-a02d1wgv.js +4 -0
  45. package/dist/src/{chunk-ndt1ccxm.js → chunk-a9ps00a1.js} +10 -10
  46. package/dist/src/{chunk-5d2hft6c.js → chunk-aewdveet.js} +3 -3
  47. package/dist/src/{chunk-ycaj2sgf.js → chunk-b3tdtq7r.js} +6 -6
  48. package/dist/src/chunk-bn7jx7a2.js +4 -0
  49. package/dist/src/{chunk-3y6eykz9.js → chunk-bnyw27ja.js} +2 -2
  50. package/dist/src/{chunk-rqc9ap3x.js → chunk-bpwsg76p.js} +2 -2
  51. package/dist/src/chunk-bvranw3g.js +4 -0
  52. package/dist/src/chunk-c25a84zb.js +4 -0
  53. package/dist/src/chunk-c27yv1dx.js +5 -0
  54. package/dist/src/chunk-c3ewxm4x.js +5 -0
  55. package/dist/src/{chunk-rvvy1bte.js → chunk-cb1ga9rd.js} +5 -5
  56. package/dist/src/chunk-cn7fwy7k.js +4 -0
  57. package/dist/src/chunk-cnvy4a64.js +4 -0
  58. package/dist/src/{chunk-7rz9898k.js → chunk-cqhw4yr6.js} +3 -3
  59. package/dist/src/{chunk-g04bwyj3.js → chunk-ctmfshjc.js} +2 -2
  60. package/dist/src/chunk-ctwmhz13.js +4 -0
  61. package/dist/src/{chunk-waqwcjyn.js → chunk-d3jx9bz5.js} +2 -2
  62. package/dist/src/{chunk-ayp07wbb.js → chunk-d6rb08ga.js} +1 -1
  63. package/dist/src/chunk-ddqhj4eg.js +5 -0
  64. package/dist/src/{chunk-r7bpkgff.js → chunk-ddrhs1c3.js} +2 -2
  65. package/dist/src/chunk-dnjnh9p6.js +4 -0
  66. package/dist/src/{chunk-wyrkw6hw.js → chunk-dw5rwgya.js} +3 -3
  67. package/dist/src/{chunk-3xkpk44w.js → chunk-e0870khr.js} +3 -3
  68. package/dist/src/chunk-ea3k10kj.js +4 -0
  69. package/dist/src/chunk-emv82m1w.js +7 -0
  70. package/dist/src/chunk-f3m6pdnx.js +4 -0
  71. package/dist/src/chunk-f84z32cb.js +4 -0
  72. package/dist/src/chunk-fpczgf0z.js +4 -0
  73. package/dist/src/{chunk-2tqzq5qh.js → chunk-g2js4c2v.js} +18 -18
  74. package/dist/src/chunk-g3af2qbk.js +5 -0
  75. package/dist/src/{chunk-3qwrzxh0.js → chunk-gadtna7s.js} +6 -6
  76. package/dist/src/{chunk-ybbtagbt.js → chunk-gcyx407v.js} +3 -3
  77. package/dist/src/{chunk-bfw6125s.js → chunk-gfpntwc1.js} +3 -3
  78. package/dist/src/chunk-gmnm5e3e.js +4 -0
  79. package/dist/src/chunk-gp6vb5gf.js +4 -0
  80. package/dist/src/chunk-gppgy7pa.js +4 -0
  81. package/dist/src/chunk-hegfz0ae.js +5 -0
  82. package/dist/src/chunk-hpzxdp1k.js +17 -0
  83. package/dist/src/{chunk-qcxzr2my.js → chunk-j69g8b50.js} +3 -3
  84. package/dist/src/chunk-jvstjnqm.js +19 -0
  85. package/dist/src/chunk-jzqrv78s.js +4 -0
  86. package/dist/src/chunk-k2948b8d.js +4 -0
  87. package/dist/src/chunk-k4ftd40d.js +4 -0
  88. package/dist/src/{chunk-bxmsax22.js → chunk-kd9vfaxh.js} +3 -3
  89. package/dist/src/{chunk-s3jc6cwp.js → chunk-kdczmgwk.js} +3 -3
  90. package/dist/src/{chunk-t6bfvfkg.js → chunk-ke3wn14v.js} +1 -1
  91. package/dist/src/chunk-kh5n7m6w.js +4 -0
  92. package/dist/src/{chunk-6wt9rgjf.js → chunk-khejfph4.js} +3 -3
  93. package/dist/src/chunk-kny2xemh.js +4 -0
  94. package/dist/src/chunk-knyzw9md.js +4 -0
  95. package/dist/src/chunk-mbzpt2hp.js +4 -0
  96. package/dist/src/chunk-mm8rcxad.js +4 -0
  97. package/dist/src/chunk-nc4516tx.js +4 -0
  98. package/dist/src/{chunk-6bznss4t.js → chunk-ntfrqrqn.js} +5 -5
  99. package/dist/src/chunk-nz5h2j52.js +4 -0
  100. package/dist/src/chunk-p22s97qy.js +4 -0
  101. package/dist/src/chunk-p9kt1sgr.js +6 -0
  102. package/dist/src/{chunk-yb97j25b.js → chunk-pf282r5g.js} +4 -4
  103. package/dist/src/chunk-pnd4mrxy.js +4 -0
  104. package/dist/src/chunk-pqqteyj6.js +4 -0
  105. package/dist/src/{chunk-6xmss8er.js → chunk-qj1tbnv2.js} +6 -6
  106. package/dist/src/chunk-qnh9egwr.js +4 -0
  107. package/dist/src/chunk-qy3khhf8.js +8 -0
  108. package/dist/src/{chunk-z637nqg8.js → chunk-r0vp315h.js} +6 -6
  109. package/dist/src/chunk-r4j43b9s.js +237 -0
  110. package/dist/src/{chunk-1p7xf5kb.js → chunk-r54cxxze.js} +3 -3
  111. package/dist/src/{chunk-yf7ympyz.js → chunk-r6pvhj33.js} +92 -92
  112. package/dist/src/chunk-rb7aa5gr.js +54 -0
  113. package/dist/src/chunk-rdj50kb4.js +4 -0
  114. package/dist/src/chunk-rnd4vcas.js +4 -0
  115. package/dist/src/{chunk-w5b2jwk3.js → chunk-s3y3zfcx.js} +8 -8
  116. package/dist/src/chunk-s4g43k75.js +5 -0
  117. package/dist/src/chunk-sfqe223f.js +311 -0
  118. package/dist/src/{chunk-284ptqa4.js → chunk-sqdrxjw5.js} +5 -5
  119. package/dist/src/{chunk-zgja5f3p.js → chunk-t54k47em.js} +4 -4
  120. package/dist/src/{chunk-3sy6ahhz.js → chunk-tek4pnvv.js} +10 -10
  121. package/dist/src/chunk-tn74y7af.js +4 -0
  122. package/dist/src/{chunk-thbh3jew.js → chunk-tvq0nzam.js} +3 -3
  123. package/dist/src/{chunk-0jrrsnc9.js → chunk-tx4f0h9c.js} +4 -4
  124. package/dist/src/chunk-vdqag3fj.js +5 -0
  125. package/dist/src/chunk-vz5zzs57.js +4 -0
  126. package/dist/src/chunk-w4s2vfpj.js +4 -0
  127. package/dist/src/{chunk-4hw3665t.js → chunk-w5yypt53.js} +11 -11
  128. package/dist/src/{chunk-8037tzzj.js → chunk-w68v64vh.js} +3 -3
  129. package/dist/src/chunk-whwj0pdk.js +5 -0
  130. package/dist/src/chunk-wnmqt1dc.js +4 -0
  131. package/dist/src/{chunk-cyy71ggq.js → chunk-wpe46vsa.js} +3 -3
  132. package/dist/src/{chunk-w3vs79ex.js → chunk-wxdjeb4k.js} +19 -19
  133. package/dist/src/chunk-xcqzwf9j.js +247 -0
  134. package/dist/src/chunk-xezekwwn.js +5 -0
  135. package/dist/src/chunk-xf19m15s.js +4 -0
  136. package/dist/src/chunk-xghbxha4.js +4 -0
  137. package/dist/src/{chunk-00167wan.js → chunk-xn9m3xc2.js} +5 -5
  138. package/dist/src/{chunk-26k317v5.js → chunk-yqfz4vts.js} +3 -3
  139. package/dist/src/chunk-z8tvs8nk.js +5 -0
  140. package/dist/src/chunk-zm2rehqb.js +5 -0
  141. package/dist/src/chunk-zs6dqm35.js +4 -0
  142. package/dist/src/daemon/processEntry.js +2 -2
  143. package/dist/src/index.js +4 -4
  144. package/dist/src/runtime/bunRuntimeGuard.js +2 -2
  145. package/dist/src/utils/workers/iosBundleExtractWorker.js +2 -2
  146. package/package.json +2 -2
  147. package/dist/src/chunk-0n6swkwg.js +0 -5
  148. package/dist/src/chunk-0qsy1qsx.js +0 -57
  149. package/dist/src/chunk-11m8wj8j.js +0 -237
  150. package/dist/src/chunk-23p5f095.js +0 -4
  151. package/dist/src/chunk-28re4xrg.js +0 -4
  152. package/dist/src/chunk-2f9rkmhx.js +0 -5
  153. package/dist/src/chunk-2fxdh48t.js +0 -4
  154. package/dist/src/chunk-2tbdrbt6.js +0 -4
  155. package/dist/src/chunk-32gvv9b4.js +0 -21
  156. package/dist/src/chunk-3f3t1x97.js +0 -8
  157. package/dist/src/chunk-3fspkbc7.js +0 -4
  158. package/dist/src/chunk-3vg455e6.js +0 -4
  159. package/dist/src/chunk-49bsqdx3.js +0 -4
  160. package/dist/src/chunk-5snsn9cf.js +0 -4
  161. package/dist/src/chunk-5tm9mn47.js +0 -54
  162. package/dist/src/chunk-5zc77a5t.js +0 -4
  163. package/dist/src/chunk-64j0majr.js +0 -19
  164. package/dist/src/chunk-65y8v4td.js +0 -17
  165. package/dist/src/chunk-6awz7vhq.js +0 -5
  166. package/dist/src/chunk-6ep7f5ge.js +0 -4
  167. package/dist/src/chunk-7cs2da62.js +0 -5
  168. package/dist/src/chunk-7g103b54.js +0 -4
  169. package/dist/src/chunk-7j5vj4pa.js +0 -4
  170. package/dist/src/chunk-7tw8x05v.js +0 -4
  171. package/dist/src/chunk-7zy586cb.js +0 -4
  172. package/dist/src/chunk-84nanf8s.js +0 -5
  173. package/dist/src/chunk-8gvwcv2p.js +0 -4
  174. package/dist/src/chunk-8thrmfat.js +0 -4
  175. package/dist/src/chunk-8zgzzs7k.js +0 -78
  176. package/dist/src/chunk-97b1zmaq.js +0 -4
  177. package/dist/src/chunk-9fth9ayh.js +0 -4
  178. package/dist/src/chunk-9j6anhjr.js +0 -4
  179. package/dist/src/chunk-bfjwqk8q.js +0 -4
  180. package/dist/src/chunk-bnhscm2n.js +0 -4
  181. package/dist/src/chunk-c1vs4g1n.js +0 -4
  182. package/dist/src/chunk-ct3e7yng.js +0 -4
  183. package/dist/src/chunk-ddzkz92z.js +0 -4
  184. package/dist/src/chunk-drdz8hee.js +0 -5
  185. package/dist/src/chunk-eersndy7.js +0 -5
  186. package/dist/src/chunk-eggq53ks.js +0 -4
  187. package/dist/src/chunk-f2dya7cs.js +0 -4
  188. package/dist/src/chunk-fbakd6cw.js +0 -4
  189. package/dist/src/chunk-fgb98zjj.js +0 -5
  190. package/dist/src/chunk-fmpad823.js +0 -5
  191. package/dist/src/chunk-g0xr8zw0.js +0 -4
  192. package/dist/src/chunk-g3rjs80x.js +0 -4
  193. package/dist/src/chunk-g78rtrfv.js +0 -4
  194. package/dist/src/chunk-gabgv3y5.js +0 -4
  195. package/dist/src/chunk-gmr45m8f.js +0 -4
  196. package/dist/src/chunk-gsyfebqj.js +0 -4
  197. package/dist/src/chunk-h5rpn9wr.js +0 -247
  198. package/dist/src/chunk-hb1x7v55.js +0 -4
  199. package/dist/src/chunk-hrfytkxh.js +0 -168
  200. package/dist/src/chunk-j4yjzbak.js +0 -4
  201. package/dist/src/chunk-jd6a5v6p.js +0 -5
  202. package/dist/src/chunk-kn5spq15.js +0 -4
  203. package/dist/src/chunk-m94qs0f0.js +0 -4
  204. package/dist/src/chunk-n03dmn5q.js +0 -5
  205. package/dist/src/chunk-n72qhwd9.js +0 -4
  206. package/dist/src/chunk-nr6y0n4y.js +0 -5
  207. package/dist/src/chunk-pcsen2vs.js +0 -4
  208. package/dist/src/chunk-ppfr0b8h.js +0 -4
  209. package/dist/src/chunk-q10bdnat.js +0 -4
  210. package/dist/src/chunk-q9xmq595.js +0 -4
  211. package/dist/src/chunk-qyqypn28.js +0 -5
  212. package/dist/src/chunk-r2epb56s.js +0 -4
  213. package/dist/src/chunk-r5bxavdx.js +0 -311
  214. package/dist/src/chunk-r8jf3d92.js +0 -4
  215. package/dist/src/chunk-rc0dbypm.js +0 -4
  216. package/dist/src/chunk-rhcty4ms.js +0 -4
  217. package/dist/src/chunk-rpvckv3p.js +0 -4
  218. package/dist/src/chunk-ry0mz41y.js +0 -4
  219. package/dist/src/chunk-sfv61xjb.js +0 -6
  220. package/dist/src/chunk-t7w8rctc.js +0 -4
  221. package/dist/src/chunk-v2wd4n3e.js +0 -5
  222. package/dist/src/chunk-w4zga19f.js +0 -4
  223. package/dist/src/chunk-w7hkv422.js +0 -5
  224. package/dist/src/chunk-xa73x2cx.js +0 -5
  225. package/dist/src/chunk-y2vs6jwg.js +0 -4
  226. package/dist/src/chunk-yattm52s.js +0 -4
  227. package/dist/src/chunk-yjawdzk8.js +0 -4
  228. package/dist/src/chunk-zs1sghs9.js +0 -4
@@ -1,8 +1,8 @@
1
1
  // @bun
2
- import{i,l,e}from"./chunk-z637nqg8.js";import{wte,MC,Rte,al}from"./chunk-0qsy1qsx.js";import{B}from"./chunk-yf7ympyz.js";import{R,v,st,ja,E}from"./chunk-r5bxavdx.js";import{pn,Cn}from"./chunk-5d2hft6c.js";import{Qc}from"./chunk-ycaj2sgf.js";import{jS}from"./chunk-00167wan.js";import{BG}from"./chunk-g7tmjbkt.js";import{Gf,Qp}from"./chunk-w5b2jwk3.js";import{Na,eg}from"./chunk-rvvy1bte.js";import{r,t,u}from"./chunk-rbpdk7m0.js";var M1=2,KE=100,Bf=200,FP=1,GE=5000,LG=3000,$f=20000,qe=50;function cX(n,o,s){let a=[];for(let[d,c]of n.points.entries()){let p=Qc({x:c.x,y:c.y,coordinateSpace:n.coordinateSpace},o,s,"dragPath");if("error"in p)return{error:`points[${d}]: ${p.error}`};a.push({x:p.x,y:p.y})}return{points:a}}function dX(n,o){if(n.length<M1)throw new t(`dragPath needs at least ${M1} points`);let s=o.holdMs??0,a=o.releaseHoldMs??0,d=[],c=0;for(let p=1;p<n.length;p++){let h=n[p-1],m=n[p],f=o.points[p]?.durationMs??Bf,y=Math.max(1,Math.ceil(f/qe));for(let S=1;S<=y;S++){let g=S/y;d.push({atMs:c+Math.round(f*g),x:S===y?m.x:Math.round(h.x+(m.x-h.x)*g),y:S===y?m.y:Math.round(h.y+(m.y-h.y)*g)})}c+=f}return{start:n[0],holdMs:s,moves:d,releaseHoldMs:a,totalMs:s+c+a,vertices:n}}function lX(n){let o=[{x:n.start.x,y:n.start.y,offsetMs:0}];if(n.holdMs>0)o.push({x:n.start.x,y:n.start.y,offsetMs:n.holdMs});for(let a of n.moves)o.push({x:a.x,y:a.y,offsetMs:n.holdMs+a.atMs});let s=o[o.length-1];if(n.releaseHoldMs>0)o.push({x:s.x,y:s.y,offsetMs:s.offsetMs+n.releaseHoldMs});return o}function LM(n,o,s=0){if(n>$f)throw new t(`dragPath total duration ${n} ms exceeds the ${$f} ms limit; shorten the segments or holds. No input was sent.`);if(o===void 0)return;let a=n+s+ja;if(a>o)throw new t(`dragPath duration ${n} ms does not fit the remaining request budget (${o} ms; needs ${a} ms including dispatch headroom); no input was sent. Increase the request timeout or shorten the path.`)}function C(n){if(n.toolType!=="stylus"&&n.toolType!=="eraser")return;let o={toolType:n.toolType};if(n.pressure?.normalized)o.pressure=Math.round(n.pressure.mean*1e4)/1e4;if(n.tilt!==void 0)o.tilt=n.tilt;if(n.buttons?.length)o.buttons=n.buttons.map((s)=>s==="stylusPrimary"?"primary":"secondary");return o}var A={TOUCH_SLOP_DP:8,STROKE_PRESSURE_RANGE:0.05,PEN_MAX_SAMPLES:100,LONG_PRESS_MS:400,TAP_TIMEOUT_MS:100,DOUBLE_TAP_MS:300,DOUBLE_TAP_SLOP_DP:100,FLING_MIN_DP_PER_S:50,PINCH_MIN_SCALE_DELTA:0.1};function b(n){return Boolean(n.unknownAxes?.length)}function Je(n,o){return n.type==="tap"&&n.toolType===o.toolType&&!b(n)&&n.screenX!==void 0&&n.screenY!==void 0}function fe(n,o){if(!Je(n,o))return!1;let s=o.arrivedAt-n.arrivedAt,a=s>=0&&s<=A.DOUBLE_TAP_MS;if(o.firstTapArrivedAt!==void 0)return n.arrivedAt===o.firstTapArrivedAt&&a;let d=(o.screenX??1/0)-(n.screenX??1/0),c=(o.screenY??1/0)-(n.screenY??1/0);return a&&Math.hypot(d,c)<=A.DOUBLE_TAP_SLOP_DP}function ye(n,o){return n.kernelAtMs!==void 0&&o.kernelAtMs!==void 0?n.kernelAtMs-o.kernelAtMs:n.arrivedAt-o.arrivedAt}function X(n){let o=n.type==="stroke"?n.path:n.hover;if(n.type!=="stroke"&&n.type!=="hover"||n.toolType!=="stylus"||b(n)||!o||o.length<2)return!1;return o.reduce((a,d,c)=>a+(c>0?ye(d,o[c-1]):0),0)>$f}function ge(n){let o=n.type==="stroke"?n.path:n.hover;if(n.toolType!=="stylus"||b(n)||!o?.length||n.type==="stroke"&&o.length<2||X(n))return null;let s=et(o);return{tool:n.type==="stroke"?"dragPath":"hoverAt",params:{points:s,...n.type==="hover"?{toolType:"stylus"}:{pointer:C(n)}}}}function Ze(n,o,s){let a=Math.ceil(s/GE);return Array.from({length:a},(d,c)=>{let p=(c+1)/a,h={...o,x:n.x+(o.x-n.x)*p,y:n.y+(o.y-n.y)*p,durationMs:Math.round(s*p)-Math.round(s*c/a)};for(let m of["pressure","distance"])if(n[m]!==void 0&&o[m]!==void 0)h[m]=n[m]+(o[m]-n[m])*p;return c===a-1?{...o,durationMs:h.durationMs}:h})}function Qe(n){while(n.length>KE){let o=(p)=>p.pressure??p.distance??0,s=n.reduce((p,h,m)=>o(h)<o(n[p])?m:p,0),a=n.reduce((p,h,m)=>o(h)>o(n[p])?m:p,0),d=1/0,c=1;for(let p=1;p<n.length-1;p++){let h=n[p].durationMs+n[p+1].durationMs;if(p!==s&&p!==a&&h<d)d=h,c=p}n[c+1].durationMs=d,n.splice(c,1)}}function et(n){let o=[],s=0,a=0;for(let[d,c]of n.entries()){let{arrivedAt:p,kernelAtMs:h,...m}=c;if(d===0){o.push(m);continue}s+=Math.max(0,ye({arrivedAt:p,kernelAtMs:h},n[d-1]));let f=Math.round(s),y=f-a;if(y<FP){if(d!==n.length-1)continue;if(o.length===1)o.push({...m,durationMs:FP});else o[o.length-1]={...m,durationMs:o.at(-1).durationMs};continue}o.push(...Ze(o.at(-1),m,y)),a=f}return Qe(o),o}var tt="a pen gesture made with the eraser end was exported as an eraser step; replay injects an eraser only on a root adb shell with a uinput tool and refuses that step elsewhere",rt="a pen gesture without a known position or path was not exported: replaying it as a finger would be wrong",nt=`a stylus stroke was not exported because its duration exceeds the ${$f/1000} second replay limit; record a shorter stroke`,it=`a stylus hover was not exported because its duration exceeds the ${$f/1000} second replay limit; record a shorter hover`,ot="a pen hovered over the screen without touching it; no known position or hover distance was recorded, so nothing was exported for it",at="a stylus double tap was exported, but replay refuses stylus double taps, so that step will fail when run";function lt(n,o){if(n.toolType===void 0)return;if(n.type==="hover")return o?void 0:X(n)?it:ot;if(!o)return X(n)?nt:rt;if(o.params.pointer!==void 0&&o.params.action==="doubleTap")return at;return n.toolType==="eraser"?tt:void 0}function K(n,o,s){let a=lt(o,s);if(a)n.add(a)}var Te=0,be=1,Ae=24,xe=26,we=27,Pe=53,Ee=54,Re=58;function Z(n){let o=/^(add|remove) device \d+:\s+(\/dev\/input\/event\d+)\s*$/.exec(n);return o?{action:o[1]==="add"?"add":"remove",path:o[2]}:null}async function Me(n){let{stdout:o}=await n.executeCommand("shell getevent -p"),s=Q(o);if(s.touch===null&&s.pen.length===0)e.warn("[InputNodeDiscovery] No multitouch or pen input device found");return s}function Q(n){let o=ut(n);return{touch:o.find((s)=>s.kind==="touch")??null,pen:o.filter((s)=>s.kind==="pen")}}function ut(n){let o=[];for(let s of mt(n)){let a=s.abs.get(Pe),d=s.abs.get(Ee);if(a&&d){o.push(ve(s,a,d,{pressure:s.abs.get(Re),kind:"touch"}));continue}let c=s.abs.get(Te),p=s.abs.get(be);if(c&&p&&s.hasPenTool)o.push(ve(s,c,p,{pressure:s.abs.get(Ae),kind:"pen"}))}return o}function ve(n,o,s,{pressure:a,kind:d}){let c=n.abs.get(d==="pen"?25:59),p=n.abs.get(xe),h=n.abs.get(we);return{path:n.path,name:n.name,axisXMin:o.min,axisXMax:o.max,axisYMin:s.min,axisYMax:s.max,kind:d,...c&&c.max>c.min?{distanceRange:c}:{},...p&&h?{tiltAxes:{x:p,y:h}}:{},...a&&a.max>a.min?{pressureMin:a.min,pressureMax:a.max}:{}}}var Se=/\b(?:BTN_TOOL_PEN|BTN_TOOL_RUBBER|0140|0141)\b/,dt={ABS_X:Te,ABS_Y:be,ABS_PRESSURE:Ae,ABS_DISTANCE:25,ABS_MT_DISTANCE:59,ABS_TILT_X:xe,ABS_TILT_Y:we,ABS_MT_POSITION_X:Pe,ABS_MT_POSITION_Y:Ee,ABS_MT_PRESSURE:Re},ct=/^\s*(?:ABS\s*\(0003\):\s*)?(?:(ABS_\w+)(?:\s+\(([0-9a-f]{4})\))?|([0-9a-f]{4}))\s*:\s+value\s+-?\d+,\s*min\s+(-?\d+),\s*max\s+(-?\d+)/,pt=/^\s+(\w+)\s*\([0-9a-f]{4}\):(.*)$/;function ht(n){let o=n[2]??n[3];return o?parseInt(o,16):dt[n[1]]}function mt(n){let o=[],s=null,a={inKeyBlock:!1};for(let d of n.split(`
3
- `)){let c=Z(d);if(c?.action==="add"){let{path:p}=c;s={path:p,name:p,abs:new Map,hasPenTool:!1},o.push(s),a.inKeyBlock=!1}else if(s)ft(s,d,a)}return o}function ft(n,o,s){let a=o.match(/^\s+name:\s+"(.+)"/);if(a){n.name=a[1],s.inKeyBlock=!1;return}let d=o.match(ct);if(d){let h=ht(d);if(h!==void 0)n.abs.set(h,yt(d,o));s.inKeyBlock=!1;return}let c=o.match(pt);if(c){if(s.inKeyBlock=c[1]==="KEY"||c[1]==="EV_KEY",s.inKeyBlock&&Se.test(c[2]))n.hasPenTool=!0;return}let p=/^\s+[\w ]+$/.test(o);if(s.inKeyBlock&&p&&Se.test(o))n.hasPenTool=!0;else if(!p)s.inKeyBlock=!1}function yt(n,o){let s=o.match(/,\s*resolution\s+(\d+)/);return{min:parseInt(n[4],10),max:parseInt(n[5],10),...s?{resolution:parseInt(s[1],10)}:{}}}var ee=500,te="display rotation could not be read; touch coordinates and swipe directions may be mapped with the wrong rotation",gt="display size could not be read after a display change; touch coordinates may be scaled with the wrong size";function vt(n,o){return`display size changed from ${n.width}x${n.height} to ${o.width}x${o.height} (fold/unfold?); touches are still read from the touch node chosen when recording started, so coordinates may refer to a different panel`}class W{axes;entries;changeReports=[];baselineDisplay;followers=[];constructor(n,o,s,a=[]){this.axes=n;this.baselineDisplay=o.display,this.entries=[this.entry(o,s,a)]}scalerAt(n){return this.entryAt(n).scaler}geometryAt(n){let{rotation:o,display:s}=this.entryAt(n),a=o%2!==0;return{deviceWidth:a?s.height:s.width,deviceHeight:a?s.width:s.height,orientation:o}}get currentRotation(){return this.entries[this.entries.length-1].rotation}get lastKnownGoodAt(){for(let n=this.entries.length-1;n>=0;n--)if(this.entries[n].caveats.length===0)return this.entries[n].reportedAt;return this.entries[0].reportedAt}noteChangeReported(n){this.changeReports.push(n);for(let o of this.followers)o.noteChangeReported(n)}follow(n){return n.entries.splice(0,n.entries.length,...this.entries.map((o)=>n.entry(o,o.reportedAt,o.caveats))),n.changeReports.splice(0,n.changeReports.length,...this.changeReports),this.followers.push(n),()=>{let o=this.followers.indexOf(n);if(o!==-1)this.followers.splice(o,1)}}apply(n,o){for(let c of this.followers)c.apply(n,o);let s=this.entries[this.entries.length-1],a=[];if(n.rotation===null)a.push(te);if(n.display===null)a.push(gt);let d={rotation:n.rotation??s.rotation,display:n.display??s.display};if(d.display.width!==this.baselineDisplay.width||d.display.height!==this.baselineDisplay.height)a.push(vt(this.baselineDisplay,d.display));this.entries.push(this.entry(d,Math.max(o,s.reportedAt),a))}warningsFor(n,o){let s=new Set(this.entryAt(n).caveats);if(this.changeReports.some((d)=>d>n&&d<=o))s.add("gesture spans a display rotation/size change; its coordinates and direction mix two geometries");else if(this.changeReports.some((d)=>d>=n-ee&&d<=o+ee))s.add(`display rotation/size changed within ${ee} ms of this gesture; its coordinates or direction may use a stale rotation`);return[...s]}entryAt(n){let o=this.entries[0];for(let s of this.entries){if(s.reportedAt>n)break;o=s}return o}entry(n,o,s){return{...n,reportedAt:o,caveats:s,scaler:wte({...this.axes,displayWidth:n.display.width,displayHeight:n.display.height,rotation:n.rotation})}}}function Ie(n,o,s,{startedAt:a,caveats:d}){return o.map((c)=>{let p=new W({xMin:c.axisXMin,xMax:c.axisXMax,yMin:c.axisYMin,yMax:c.axisYMax},s,a,d),h=n.follow(p);return{node:c,scaler:p,stopFollowing:h}})}var St=0,_e=1000;function De(n){return{readRotation:()=>al(n,{timeoutMs:_e}),readPhysicalSize:()=>MC(n,{timeoutMs:_e})}}function Ge(n){return n!==void 0&&Number.isInteger(n)&&n>=0&&n<=3}class re{timeline;probe;timer;refreshChain=Promise.resolve();generation=0;disposed=!1;constructor(n,o,s){this.timeline=n;this.probe=o;this.timer=s}dispose(){this.disposed=!0,this.refreshChain=Promise.resolve()}handleTransition(n){if(this.disposed||n.displayId!==St||n.change==="removed")return;let o=this.timer.now(),s=++this.generation;if(this.timeline.noteChangeReported(o),Ge(n.rotation))this.timeline.apply({rotation:n.rotation},o);let a=Ge(n.rotation);this.refreshChain=this.refreshChain.then(()=>this.refresh(o,a,s))}async settle(){let n;do n=this.refreshChain,await n;while(n!==this.refreshChain)}async verifyAtStop(){if(this.disposed)return;let n=await this.probe.readRotation().then(void 0,(s)=>{if(!this.disposed)throw s;return e.debug("[DisplayGeometryTracker] Cancelled stop-time geometry read failed",s),null});if(this.disposed)return;if(n===null)throw Error("WindowManager did not report a display rotation at stop");let o=this.timeline.currentRotation;if(n!==o)return`display rotation at stop (${n}) differs from the rotation tracked during recording (${o}); a rotation was not reported, so tapAt and swipeOn steps after it may be recorded at the wrong coordinates or direction`;return}async refresh(n,o,s){if(this.disposed||s!==this.generation)return;let a=o?void 0:await this.readRotationOrNull();if(this.disposed)return;let d=await this.readSizeOrNull();if(this.disposed||s!==this.generation)return;this.timeline.apply({rotation:a,display:d},n)}async readRotationOrNull(){try{return await this.probe.readRotation()}catch(n){return e.warn(`[DisplayGeometryTracker] Failed to read rotation after a display change: ${r(n)}`,n),null}}async readSizeOrNull(){try{return await this.probe.readPhysicalSize()}catch(n){return e.warn(`[DisplayGeometryTracker] Failed to read display size after a display change: ${r(n)}`,n),null}}}var Ne=(n,o,s)=>({type:"hover",arrivedAt:o,toolType:n,...s.samples.length?{hover:s.samples}:{}});class ne{nodeEpisode;slotEpisodes=new Map;penEntered(){this.nodeEpisode??={touched:!1,samples:[]}}penTouched(){this.nodeEpisode??={touched:!1,samples:[]},this.nodeEpisode.touched=!0}penLeft(n,o){let s=this.nodeEpisode;return this.nodeEpisode=void 0,s&&!s.touched?Ne(n,o,s):null}slotHovering(n,o,s,a){if(!this.slotEpisodes.has(n))this.slotEpisodes.set(n,{touched:!1,samples:[]});this.sample(this.slotEpisodes.get(n),o,s,a)}penHovering(n,o,s){if(this.nodeEpisode)this.sample(this.nodeEpisode,n,o,s)}sample(n,o,s,a){if(n.touched||!Number.isFinite(o.x)||!Number.isFinite(o.y)||o.distance===void 0||!Number.isFinite(o.distance))return;if(n.samples.length>=A.PEN_MAX_SAMPLES)n.samples=n.samples.filter((d,c)=>c===0||c%2===1);n.samples.push({x:o.x,y:o.y,distance:o.distance,arrivedAt:s,...a===void 0?{}:{kernelAtMs:a}})}slotTouching(n){this.slotEpisodes.set(n,{touched:!0,samples:[]})}slotReleased(n,o,s){let a=this.slotEpisodes.get(n);return this.slotEpisodes.delete(n),a&&!a.touched&&o?Ne(o,s,a):null}}var Tt={KEY_BACK:"back",KEY_HOME:"home",KEY_MENU:"menu",KEY_POWER:"power",KEY_VOLUMEUP:"volume_up",KEY_VOLUMEDOWN:"volume_down",KEY_APPSELECT:"recent"};class ie{options;slots=new Map;currentSlot=0;penPaths=new Map;releasedSlots=new Set;touchingSlots=new Set;lastEmitted=new Map;nodeTool;heldButtons=new Set;hover=new ne;kernelAtMs=0;constructor(n={}){this.options=n}emitHover(n){if(n)this.options.onHover?.(n)}feedLine(n,o){let s=n.match(/^\[\s*(\d+(?:\.\d+)?)\]\s+(\S+)\s+(\S+)\s+(\S+)\s*$/);if(!s)return null;this.kernelAtMs=Number(s[1])*1000;let a=s[2],d=s[3],c=s[4];if(a==="EV_ABS")return this.handleAbsEvent(d,c,o);if(a==="EV_SYN")return this.handleSynEvent(d,c,o);if(a==="EV_KEY"){let p=c==="DOWN"?Tt[d]:void 0;if(p)return{type:"pressButton",arrivedAt:o,button:p};this.handleKeyEvent(d,c==="DOWN"||c==="REPEAT",o)}return null}handleAbsEvent(n,o,s){let a=parseInt(o,16);switch(n){case"ABS_MT_SLOT":this.currentSlot=a;break;case"ABS_MT_TRACKING_ID":if(o==="ffffffff")this.releaseCurrentSlot(s);else{let d=this.getOrCreateSlot();if(d.trackingId>=0&&d.trackingId!==a){let c=this.endedByReplacement(d,s);return this.emitHover(this.hover.slotReleased(d.slotId,this.withPenState({...d}).toolType,s)),d.trackingId=a,c}d.trackingId=a}break;case"ABS_MT_POSITION_X":this.observeAxis("x",a);break;case"ABS_MT_POSITION_Y":this.observeAxis("y",a);break;case"ABS_MT_PRESSURE":this.getOrCreateSlot().pressure=a;break;default:this.handlePenAbsEvent(n,a);break}return null}releaseCurrentSlot(n){let o=this.slots.get(this.currentSlot);if(!o)return;if(o.trackingId>=0)this.releasedSlots.add(o.slotId),o.trackingId=-1;this.emitHover(this.hover.slotReleased(o.slotId,this.withPenState({...o}).toolType,n))}observePenSlot(n,o){if(this.options.singleTouch||n.toolType===void 0||n.trackingId<0)return;if(this.isMtPenHovering(n))this.hover.slotHovering(n.slotId,n,o,this.kernelAtMs);else this.hover.slotTouching(n.slotId)}endedByReplacement(n,o){let s=[];for(let[,a]of this.slots)if(a.slotId!==n.slotId&&a.trackingId>=0&&!this.isMtPenHovering(a)){let d=this.withPenState({...a});if(d.toolType)d.path=this.samplePen(d,o);s.push(d)}return this.releasedSlots.delete(n.slotId),this.touchingSlots.delete(n.slotId),this.lastEmitted.delete(n.slotId),this.penPaths.delete(n.slotId),{arrivedAt:o,activeSlots:s,releasedSlots:[n.slotId]}}handlePenAbsEvent(n,o){switch(n){case"ABS_MT_TOOL_TYPE":if(o===1)this.getOrCreateSlot().toolType="stylus";else delete this.getOrCreateSlot().toolType;break;case"ABS_X":case"ABS_Y":case"ABS_PRESSURE":if(this.options.singleTouch)this.handleSingleTouchAxis(n,o);break;case"ABS_TILT_X":this.getOrCreateSlot().tiltX=o|0;break;case"ABS_TILT_Y":this.getOrCreateSlot().tiltY=o|0;break;case"ABS_DISTANCE":case"ABS_MT_DISTANCE":this.getOrCreateSlot().distance=o;break;default:break}}handleSingleTouchAxis(n,o){if(this.currentSlot=0,n==="ABS_X")this.observeAxis("x",o);else if(n==="ABS_Y")this.observeAxis("y",o);else this.getOrCreateSlot().pressure=o}handleKeyEvent(n,o,s){switch(n){case"BTN_DIGI":case"BTN_TOOL_PEN":this.setNodeTool("stylus",o,s);break;case"BTN_TOOL_RUBBER":this.setNodeTool("eraser",o,s);break;case"BTN_STYLUS":this.setButton("stylusPrimary",o);break;case"BTN_STYLUS2":this.setButton("stylusSecondary",o);break;case"BTN_TOUCH":if(this.options.singleTouch){if(this.handleSingleTouchContact(o),o)this.hover.penTouched()}break;default:break}}setNodeTool(n,o,s){if(o){if(this.nodeTool=n,this.options.singleTouch)this.hover.penEntered();return}if(this.nodeTool!==n&&this.nodeTool!==void 0)return;if(this.nodeTool=void 0,this.options.singleTouch)this.handleSingleTouchContact(!1),this.emitHover(this.hover.penLeft(n,s))}setButton(n,o){if(o)this.heldButtons.add(n);else this.heldButtons.delete(n)}handleSingleTouchContact(n){if(this.currentSlot=0,n){this.getOrCreateSlot().trackingId=0;return}let o=this.slots.get(0);if(o&&o.trackingId>=0)this.releasedSlots.add(0),o.trackingId=-1}handleSynEvent(n,o,s){if(n!=="SYN_REPORT")return null;if(parseInt(o,16)!==0)return null;let d=[],c=[],p=[],h=new Set;for(let[,m]of this.slots)if(this.observePenSample(m,s),m.trackingId>=0&&!this.isMtPenHovering(m)){h.add(m.slotId);let f=this.withPenState({...m});if(f.toolType)f.path=this.samplePen(f,s);d.push(f),this.lastEmitted.set(m.slotId,{x:m.x,y:m.y})}else if(this.releasedSlots.has(m.slotId)||m.trackingId>=0&&this.touchingSlots.has(m.slotId))c.push(m.slotId),p.push(...this.takeFinalMove(m,s));for(let m of c)this.penPaths.delete(m);return this.releasedSlots.clear(),this.touchingSlots=h,p.length>0?{arrivedAt:s,activeSlots:d,releasedSlots:c,releasedFinalSamples:p}:{arrivedAt:s,activeSlots:d,releasedSlots:c}}observePenSample(n,o){if(this.observePenSlot(n,o),this.options.singleTouch&&this.nodeTool&&n.trackingId<0)this.hover.penHovering(n,o,this.kernelAtMs)}takeFinalMove(n,o){let s=this.lastEmitted.get(n.slotId);if(this.lastEmitted.delete(n.slotId),!s||s.x===n.x&&s.y===n.y)return[];let a=this.withPenState({...n}),d=this.penPaths.get(n.slotId)?.at(-1)?.pressure;if(a.toolType&&d!==void 0)a.path=this.samplePen({...a,pressure:d},o);return[a]}withPenState(n){if(!(this.options.singleTouch||n.toolType!==void 0))return delete n.tiltX,delete n.tiltY,n;if(this.options.singleTouch)n.toolType=this.nodeTool??"stylus";else if(this.nodeTool==="eraser")n.toolType=this.nodeTool;if(this.heldButtons.size>0)n.buttons=[...this.heldButtons];return n}isMtPenHovering(n){return!this.options.singleTouch&&n.toolType!==void 0&&(n.distance??0)>0}samplePen(n,o){let s=this.penPaths.get(n.slotId)??[],a={x:n.x,y:n.y,pressure:n.pressure,arrivedAt:o,kernelAtMs:this.kernelAtMs};if(s.length>=A.PEN_MAX_SAMPLES){let d=s.reduce((p,h,m)=>h.pressure<s[p].pressure?m:p,0),c=s.reduce((p,h,m)=>h.pressure>s[p].pressure?m:p,0);s=s.filter((p,h)=>h===0||h===d||h===c||h%2===1)}return s.push(a),this.penPaths.set(n.slotId,s),[...s]}getOrCreateSlot(){if(!this.slots.has(this.currentSlot))this.slots.set(this.currentSlot,{slotId:this.currentSlot,trackingId:-1,x:NaN,y:NaN,pressure:0,unknownAxes:["x","y"]});return this.slots.get(this.currentSlot)}observeAxis(n,o){let s=this.getOrCreateSlot();if(s[n]=o,s.unknownAxes=s.unknownAxes?.filter((a)=>a!==n),!s.unknownAxes?.length)delete s.unknownAxes}}class ae{scaler;densityDp;pressureRange;tiltAxes;contacts=new Map;lastTap=null;pinchState=null;inTwoFingerMode=!1;constructor(n,o,s,a){this.scaler=n;this.densityDp=o;this.pressureRange=s;this.tiltAxes=a}scalerAt(n){return"scalerAt"in this.scaler?this.scaler.scalerAt(n):this.scaler}downStamp(n){return"scalerAt"in this.scaler?{downAt:n.arrivedAt}:{}}feedFrame(n){this.updateContacts(n);let o=n.activeSlots.length;if(this.updatePinchState(n,o),n.releasedSlots.length===0)return null;if(this.inTwoFingerMode&&this.pinchState){for(let s of n.releasedSlots)this.contacts.delete(s);if(o===0){let s=this.maybeEmitPinch(n.arrivedAt);return this.inTwoFingerMode=!1,this.pinchState=null,s}return null}if(!this.inTwoFingerMode&&n.releasedSlots.length===1&&o===0)return this.completeSingleFingerGesture(n);for(let s of n.releasedSlots)this.contacts.delete(s);return null}updateContacts(n){for(let o of n.releasedFinalSamples??[]){let s=this.contacts.get(o.slotId);if(s)s.lastX=o.x,s.lastY=o.y,s.path=o.path??s.path}for(let o of n.activeSlots){let s=this.contacts.get(o.slotId);if(s){if(!Number.isFinite(s.startX))s.startX=o.x;if(!Number.isFinite(s.startY))s.startY=o.y;s.lastX=o.x,s.lastY=o.y,s.path=o.path,s.unknownAxes=oe(s.unknownAxes,o.unknownAxes),Oe(s.pen,o,this.tiltAxes)}else{let a=bt();Oe(a,o,this.tiltAxes),this.contacts.set(o.slotId,{startX:o.x,startY:o.y,arrivedAt:n.arrivedAt,lastX:o.x,lastY:o.y,scaler:this.scalerAt(n.arrivedAt),unknownAxes:o.unknownAxes,pen:a,path:o.path})}}}updatePinchState(n,o){if(o===2){this.inTwoFingerMode=!0;let[s,a]=n.activeSlots,d=oe(this.contacts.get(s.slotId)?.unknownAxes,this.contacts.get(a.slotId)?.unknownAxes),c=this.contacts.get(s.slotId)?.scaler??this.scalerAt(n.arrivedAt),p=d?.length?void 0:ke(c,s.x,s.y,{rawX2:a.x,rawY2:a.y});if(!this.pinchState)this.pinchState={initialDist:p,finalDist:p,unknownAxes:d};else this.pinchState.finalDist=p,this.pinchState.unknownAxes=oe(this.pinchState.unknownAxes,d)}}completeSingleFingerGesture(n){let o=n.releasedSlots[0],s=this.contacts.get(o);if(this.contacts.delete(o),!s)return null;if(s.unknownAxes?.length)return{...this.evaluateUnknownContact(s,n.arrivedAt),...this.penFields(s)};let{x:a,y:d}=s.scaler.toScreenPoint(s.startX,s.startY),{x:c,y:p}=s.scaler.toScreenPoint(s.lastX,s.lastY),h=n.arrivedAt-s.arrivedAt,m=z(a,d,c,p),f=A.TOUCH_SLOP_DP*this.densityDp,y=m<f?this.evaluateTapOrLongPress(a,d,h,{arrivedAt:n.arrivedAt,toolType:s.pen.toolType}):this.evaluateSwipe({x:a,y:d},{x:c,y:p},h,n.arrivedAt);return this.completeContactGesture(s,y,n.arrivedAt,h)}completeContactGesture(n,o,s,a){let d=this.penFields(n);if(o.type==="swipe"&&n.pen.toolType==="stylus"&&d.pressure?.normalized&&this.pressureRange&&(n.pen.pressureMax-n.pen.pressureMin)/(this.pressureRange.max-this.pressureRange.min)>=A.STROKE_PRESSURE_RANGE&&n.path&&n.path.length>=2){this.lastTap=null;let c=this.pressureRange,p=n.path.map((h)=>({...n.scaler.toScreenPoint(h.x,h.y),arrivedAt:h.arrivedAt,...h.kernelAtMs===void 0?{}:{kernelAtMs:h.kernelAtMs},pressure:Math.round(se((h.pressure-c.min)/(c.max-c.min))*1e4)/1e4}));return{type:"stroke",arrivedAt:s,durationMs:a,path:p,...this.downStamp(n),...d}}return{...o,...this.downStamp(n),...d}}penFields(n){let{toolType:o,buttons:s,pressureCount:a,pressureSum:d,pressureMin:c,pressureMax:p}=n.pen,h={};if(o)h.toolType=o;if(a>0){let m=this.pressureRange,f=(y)=>Math.round((m?se((y-m.min)/(m.max-m.min)):y)*1e4)/1e4;h.pressure={min:f(c),max:f(p),mean:f(d/a),normalized:m!==void 0}}if(n.pen.tiltCount>0)h.tilt=Math.min(Math.PI/2,Math.round(n.pen.tiltSum/n.pen.tiltCount*1e4)/1e4);if(s.size>0)h.buttons=[...s];return h}evaluateUnknownContact(n,o){this.lastTap=null;let s=o-n.arrivedAt,a=Number.isFinite(n.startX)?n.startX:0,d=Number.isFinite(n.startY)?n.startY:0,c=Number.isFinite(n.lastX)?n.lastX:a,p=Number.isFinite(n.lastY)?n.lastY:d;return{type:ke(n.scaler,a,d,{rawX2:c,rawY2:p})>=A.TOUCH_SLOP_DP*this.densityDp?"swipe":s>=A.LONG_PRESS_MS?"longPress":"tap",arrivedAt:o,durationMs:s,unknownAxes:n.unknownAxes}}maybeEmitPinch(n){let o=this.pinchState;if(o?.unknownAxes?.length)return this.lastTap=null,null;if(!o||o.initialDist===void 0||o.finalDist===void 0||o.initialDist===0)return null;let s=o.finalDist/o.initialDist;if(Math.abs(s-1)<A.PINCH_MIN_SCALE_DELTA)return null;return{type:"pinch",arrivedAt:n,scale:s,pinchDirection:s<1?"in":"out"}}evaluateTapOrLongPress(n,o,s,{arrivedAt:a,toolType:d}){if(s>=A.LONG_PRESS_MS)return{type:"longPress",arrivedAt:a,screenX:n,screenY:o,durationMs:s};if(this.lastTap&&this.lastTap.toolType===d){let c=a-this.lastTap.arrivedAt,p=z(n,o,this.lastTap.screenX,this.lastTap.screenY),h=A.DOUBLE_TAP_SLOP_DP*this.densityDp;if(c<=A.DOUBLE_TAP_MS&&p<=h){let m=this.lastTap.arrivedAt;return this.lastTap=null,{type:"doubleTap",arrivedAt:a,screenX:n,screenY:o,firstTapArrivedAt:m}}}return this.lastTap={screenX:n,screenY:o,arrivedAt:a,toolType:d},{type:"tap",arrivedAt:a,screenX:n,screenY:o}}evaluateSwipe(n,o,s,a){let{x:d,y:c}=n,{x:p,y:h}=o,m=p-d,f=h-c,y=z(d,c,p,h),S=Math.abs(m)>=Math.abs(f)?m>0?"right":"left":f>0?"down":"up",g=s>0?y/s*1000:0,w=A.FLING_MIN_DP_PER_S*this.densityDp,_=g>=w?"fast":"normal";return{type:"swipe",arrivedAt:a,direction:S,startX:d,startY:c,endX:p,endY:h,speed:_}}}function ke(n,o,s,{rawX2:a,rawY2:d}){let c=n.toScreenPoint(o,s),p=n.toScreenPoint(a,d);return z(c.x,c.y,p.x,p.y)}function z(n,o,s,a){return Math.sqrt((s-n)**2+(a-o)**2)}function oe(n,o){if(!n?.length&&!o?.length)return;return[...new Set([...n??[],...o??[]])]}function bt(){return{buttons:new Set,pressureCount:0,pressureSum:0,pressureMin:1/0,pressureMax:-1/0,tiltCount:0,tiltSum:0}}function Oe(n,o,s){if(o.toolType)n.toolType=o.toolType;for(let a of o.buttons??[])n.buttons.add(a);if(o.toolType==="stylus"||o.toolType==="eraser")At(n,o,s);if(o.pressure>0)n.pressureCount+=1,n.pressureSum+=o.pressure,n.pressureMin=Math.min(n.pressureMin,o.pressure),n.pressureMax=Math.max(n.pressureMax,o.pressure)}function At(n,o,s){if(s&&Be(s.x)&&Be(s.y)&&o.tiltX!==void 0&&o.tiltY!==void 0&&Number.isFinite(o.tiltX)&&Number.isFinite(o.tiltY)){let a=Ce(o.tiltX,s.x),d=Ce(o.tiltY,s.y),c=Math.cos(a)*Math.cos(d);n.tiltCount+=1,n.tiltSum+=Math.acos(se(c))}}function Ce(n,o){let s=o.resolution?1/o.resolution:Math.PI/180;return(n-(o.min+o.max)/2)*s}function Be(n){return Number.isFinite(n.min)&&Number.isFinite(n.max)&&n.max>n.min&&(n.resolution===void 0||Number.isFinite(n.resolution)&&n.resolution>=0)}function se(n){return Math.min(Math.max(n,0),1)}class le{opts;pending=[];maxSeenKernelMs=-1/0;releasePoint=-1/0;flushTimer;flushAt;windowMs;constructor(n){this.opts=n;if(this.windowMs=n.windowMs??50,!Number.isFinite(this.windowMs)||this.windowMs<0)throw RangeError("Kernel reorder window must be finite and non-negative")}push(n,o,s){let a=/^\[\s*(\d+(?:\.\d+)?)\s*\]/.exec(o),d=a?Number(a[1])*1000:NaN;if(!Number.isFinite(d)){this.opts.onLine({nodeKey:n,line:o,arrivedAt:s});return}this.maxSeenKernelMs=Math.max(this.maxSeenKernelMs,d),this.pending.push({nodeKey:n,kernelMs:d,line:o,arrivedAt:s,releaseAt:this.now()+this.windowMs}),this.pending.sort((c,p)=>c.kernelMs-p.kernelMs),this.releaseThrough(Math.max(this.releasePoint,this.maxSeenKernelMs-this.windowMs)),this.scheduleFlush()}drain(){this.cancelFlush(),this.releaseThrough(this.maxSeenKernelMs)}dropNode(n){this.pending=this.pending.filter((o)=>o.nodeKey!==n),this.scheduleFlush()}clear(){this.cancelFlush(),this.pending=[],this.maxSeenKernelMs=-1/0,this.releasePoint=-1/0}releaseThrough(n){this.releasePoint=n;while(this.pending.length>0&&this.pending[0].kernelMs<=n){let o=this.pending.shift(),{nodeKey:s,kernelMs:a,line:d,arrivedAt:c}=o;this.opts.onLine({nodeKey:s,kernelMs:a,line:d,arrivedAt:c})}}scheduleFlush(){if(this.pending.length===0){this.cancelFlush();return}let n=1/0;for(let o of this.pending)n=Math.min(n,o.releaseAt);if(this.flushAt===n)return;this.cancelFlush(),this.flushAt=n,this.flushTimer=this.opts.timer.setTimeout(()=>{this.flushTimer=void 0,this.flushAt=void 0;let o=this.now(),s=this.releasePoint;for(let a of this.pending)if(a.releaseAt<=o)s=Math.max(s,a.kernelMs);this.releaseThrough(s),this.scheduleFlush()},Math.max(0,n-this.now()))}cancelFlush(){if(this.flushTimer!==void 0)this.opts.timer.clearTimeout(this.flushTimer),this.flushTimer=void 0;this.flushAt=void 0}now(){return this.opts.timer.monotonicNow?.()??this.opts.timer.now()}}class L{handlers=new Map;buffer;constructor(n){this.buffer=new le({...n,onLine:({nodeKey:o,line:s,arrivedAt:a})=>this.handlers.get(o)?.(s,a)})}register(n,o){this.buffer.dropNode(n);let s=(a,d)=>o(a,d);return this.handlers.set(n,s),()=>{if(this.handlers.get(n)!==s)return;if(this.handlers.delete(n),this.buffer.dropNode(n),this.handlers.size===0)this.buffer.clear()}}push(n,o,s){if(this.handlers.has(n))this.buffer.push(n,o,s)}}class F{opts;children=new Set;starting=!1;generation=0;cleanups=new Set;timer;constructor(n){this.opts=n;this.timer=n.timer??i}start(n,o){if(this.children.size>0||this.starting)return;this.starting=!0;let s=++this.generation,a=this.opts.lineMerge??new L({timer:this.timer,windowMs:this.opts.kernelReorderWindowMs});this.startProcess(s,this.opts.touchNode,this.opts.scaler,{onGesture:n,onError:o,lineMerge:a});for(let{node:d,scaler:c}of this.opts.penNodes??[])this.startProcess(s,d,c,{onGesture:n,lineMerge:a,onError:(p)=>e.warn(`[GetEventReader] pen node ${d.path} stopped; finger recording continues: ${p.message}`,p)})}async startProcess(n,o,s,{onGesture:a,onError:d,lineMerge:c}){let p=new ie({singleTouch:o.kind==="pen",onHover:(T)=>{let P=T.hover,M=o.distanceRange,D=P?.[0],me=D&&"scalerAt"in s?s.scalerAt(D.arrivedAt):s;a({...T,...D?{downAt:D.arrivedAt}:{},hover:M&&P&&"toScreenPoint"in me?P.map((k)=>({...me.toScreenPoint(k.x,k.y),arrivedAt:k.arrivedAt,...k.kernelAtMs===void 0?{}:{kernelAtMs:k.kernelAtMs},distance:Math.min(1,Math.max(0,(k.distance-M.min)/(M.max-M.min)))})):void 0})}}),h=new ae(s,this.opts.density,xt(o),o.tiltAxes),m=["shell","getevent","-lt",o.path];e.debug(`[GetEventReader] Spawning: ${m.join(" ")}`);let f;try{f=await this.opts.adb.spawn(m)}catch(T){let P=T instanceof Error?T:Error(String(T));if(e.error(`[GetEventReader] spawn error: ${P.message}`),n===this.generation){if(o===this.opts.touchNode)this.starting=!1;d?.(P)}return}if(n!==this.generation){f.on("error",()=>{}),f.kill();return}if(this.children.add(f),o===this.opts.touchNode)this.starting=!1;let y="",S="",g=c.register(o.path,(T,P)=>{if(n!==this.generation)return;let M=p.feedLine(T,P);if(!M)return;if(wt(M)){let D=h.feedFrame(M);if(D)a(D)}else a(M)}),w=(T)=>{y+=T.toString();let P=y.split(`
4
- `);y=P.pop()??"";for(let M of P){if(!M.trim()||n!==this.generation)continue;let D=this.timer.now();c.push(o.path,M,D)}},_=(T)=>{S=(S+T.toString()).slice(-4096),e.debug(`[GetEventReader] stderr: ${T.toString().trim()}`)},I=()=>{y="",f.stdout.off("data",w),f.stderr.off("data",_),f.on("error",J),f.off("error",O),f.off("exit",U),this.children.delete(f),this.cleanups.delete(I),g()},J=()=>{},O=(T)=>{I();let P=S.trim()?Error(`[GetEventReader] getevent process error: ${T.message}; stderr tail: ${S.trim()}`,{cause:T}):T;e.warn(`[GetEventReader] process error: ${P.message}`),d?.(P)},U=(T,P)=>{I();let M=Error(`[GetEventReader] getevent exited with ${P?`signal ${P}`:`code ${T}`}`+(S.trim()?`; stderr tail: ${S.trim()}`:""));e.warn(M.message),d?.(M)};this.cleanups.add(I),f.stdout.on("data",w),f.stderr.on("data",_),f.on("error",O),f.on("exit",U)}stop(){this.starting=!1,++this.generation;let n=[...this.children];for(let o of[...this.cleanups])o();for(let o of n)if(!o.killed)e.debug("[GetEventReader] Stopping getevent process"),o.kill();this.children.clear()}}function xt(n){return n.pressureMin!==void 0&&n.pressureMax!==void 0?{min:n.pressureMin,max:n.pressureMax}:void 0}function wt(n){return n!==null&&"activeSlots"in n}class ue{opts;running=!1;generation=0;pens=new Map;stopMonitor;constructor(n){this.opts=n}start(n,o){if(this.running)return;this.running=!0;let s=++this.generation,{primary:a}=this.opts;if(a.node.kind==="pen")this.pens.set(a.node.path,{controller:new AbortController,reader:a.reader});a.reader.start(n,o);for(let d of this.opts.penNodes){let c={controller:new AbortController};this.pens.set(d.path,c),this.startPen(d,c,n)}this.monitor(s,n)}startPen(n,o,s){o.reader=this.opts.createPenReader(n),o.reader.start((a)=>{if(this.pens.get(n.path)===o)s(a)},(a)=>{if(this.pens.get(n.path)!==o)return;this.removePen(n.path),e.warn(`[PenHotplugReader] pen node ${n.path} stopped; finger recording continues: ${a.message}`,a)})}async addPen(n,o){if(this.pens.has(n)||n===this.opts.primary.node.path&&this.opts.primary.node.kind!=="pen")return;let s={controller:new AbortController};this.pens.set(n,s);try{let{stdout:a}=await this.opts.adb.execute(["shell","getevent","-lp",n],{signal:s.controller.signal,timeoutMs:1000,noRetry:!0});if(this.pens.get(n)!==s)return;let d=Q(a).pen.find((c)=>c.path===n);if(d)this.startPen(d,s,o);else this.removePen(n)}catch(a){if(this.pens.get(n)!==s){e.debug(`[PenHotplugReader] discarded probe for removed node ${n}`,a);return}this.removePen(n),e.warn(`[PenHotplugReader] cannot read pen node ${n}; finger recording continues: ${r(a)}`,a)}}removePen(n){let o=this.pens.get(n);this.pens.delete(n),o?.controller.abort(),o?.reader?.stop()}async monitor(n,o){let s;try{s=await this.opts.adb.spawn(["shell","getevent","-lt"])}catch(g){if(n===this.generation)e.warn(`[PenHotplugReader] hotplug monitor failed; finger recording continues: ${r(g)}`,g);return}if(n!==this.generation){s.on("error",()=>{}),s.kill();return}let a="",d="",c=(g)=>{a+=g.toString();let w=a.split(`
5
- `);a=w.pop()??"";for(let _ of w){let I=Z(_);if(I?.action==="add")this.addPen(I.path,o);else if(I?.action==="remove")this.removePen(I.path)}},p=(g)=>{d=(d+g.toString()).slice(-4096)},h=()=>{if(s.stdout.off("data",c),s.stderr.off("data",p),s.on("error",m),s.off("error",y),s.off("exit",S),a="",this.stopMonitor=void 0,!s.killed)s.kill()},m=()=>{},f=(g)=>{h(),e.warn(`[PenHotplugReader] hotplug monitor stopped; finger recording continues: ${g}`+(d.trim()?`; stderr tail: ${d.trim()}`:""))},y=(g)=>f(g.message),S=(g,w)=>f(w?`signal ${w}`:`code ${g}`);this.stopMonitor=h,s.stdout.on("data",c),s.stderr.on("data",p),s.on("error",y),s.on("exit",S)}stop(){this.running=!1,++this.generation,this.stopMonitor?.();for(let n of this.pens.keys())this.removePen(n);this.opts.primary.reader.stop()}}function Le({adb:n,penNode:o,timeline:s,rotation:a,display:d,caveats:c,density:p,timer:h,lineMerge:m}){let[{scaler:f,stopFollowing:y}]=Ie(s,[o],{rotation:a,display:d},{startedAt:h.now(),caveats:c}),S=new F({adb:n,touchNode:o,scaler:f,density:p,timer:h,lineMerge:m});return{start:(g,w)=>S.start(g,w),stop:()=>{S.stop(),y()}}}function Pt(n){return n?{action:"type",text:n,operation:"replace"}:{action:"clear"}}var Y=750,Et=3000,Fe="rotation/size could not be confirmed at stop; tapAt and swipeOn steps recorded after a display change may be at the wrong coordinates or direction";class j{device;gestureEmitter;a11ySource;steps=[];orderedSteps=[];latestEntry=null;pendingGestures=[];exportWarnings=new Set;bufferedInteractions=[];lastInputText=null;activeEmitter=null;unsubscribeA11y=null;activeA11y=null;stopped=!1;firstTouchTrackFailure;geometry;displaySource;unsubscribeDisplay=null;geometrySpans=new Map;finalized;get touchTrackFailure(){return this.firstTouchTrackFailure}get stepCount(){return this.steps.length}get capturedSteps(){return this.steps}get capturedExportWarnings(){return[...this.exportWarnings]}timer;constructor(n,o,s,{timer:a=i,...d}={}){this.device=n;this.gestureEmitter=o;this.a11ySource=s;this.timer=a,this.geometry=d.geometry,this.displaySource=d.displaySource}async start(){let n;if(!this.a11ySource)n=E.getInstance(this.device);let o=this.a11ySource??n;if(!await o.ensureConnected())throw Error("[DualTrackRecorder] Unable to connect to the accessibility service.");if(n)n.notifyRecordingStarted(),this.activeA11y=n;let a=this.gestureEmitter??await this.createGetEventReader();this.activeEmitter=a,a.start((d)=>this.handleGestureEvent(d),(d)=>{if(this.stopped||this.firstTouchTrackFailure)return;this.firstTouchTrackFailure={error:d,failedAt:this.timer.now()},e.warn(`[DualTrackRecorder] Touch track (getevent) failed: ${d.message}`)}),this.unsubscribeA11y=o.onInteraction((d)=>this.handleInteractionEvent(d)),this.subscribeDisplayChanges(n),e.debug("[DualTrackRecorder] Started dual-track recording")}async stop(n={}){if(n.hostOnly)this.geometry?.dispose();if(this.stopped){let s=await this.finalized??[];return this.stopResult(s)}if(this.stopped=!0,!n.hostOnly)this.activeA11y?.notifyRecordingStopped();this.activeA11y=null,this.unsubscribeA11y?.(),this.unsubscribeA11y=null,this.activeEmitter?.stop(),this.activeEmitter=null,this.flushPendingGestures(),this.finalized=(n.hostOnly?Promise.resolve(this.geometry?[Fe]:[]):this.finalizeGeometry()).finally(()=>{this.unsubscribeDisplay?.(),this.unsubscribeDisplay=null});let o=await this.finalized;return e.debug(`[DualTrackRecorder] Stopped with ${this.steps.length} steps`),this.stopResult(o)}flushPendingGestures(){for(let n of this.pendingGestures)if(!n.resolved)this.resolveGesture(n);this.pendingGestures=[]}stopResult(n){return{steps:this.steps,stepCount:this.steps.length,...this.touchTrackFailure?{touchTrackFailure:this.touchTrackFailure}:{},...n.length>0?{geometryWarnings:n}:{},...this.exportWarnings.size>0?{exportWarnings:[...this.exportWarnings]}:{}}}subscribeDisplayChanges(n){let o=this.displaySource??(n?Mt(n):void 0),s=this.geometry;if(o&&s)this.unsubscribeDisplay=o.onDisplayChange((a)=>s.handleTransition(a))}async finalizeGeometry(){let n=this.geometry;if(!n)return[];let{mismatch:o,unconfirmed:s}=await this.confirmGeometryAtStop(n),a=new Set;for(let[d,{downAt:c,upAt:p}]of this.geometrySpans){let h=n.timeline.warningsFor(c,p);if(o&&p>=n.timeline.lastKnownGoodAt)h.push(o);if(h.length>0){d.label=`Warning: ${h.join("; ")}`;for(let m of h)a.add(m)}}if(o)a.add(o);if(s)a.add(Fe);return[...a]}async confirmGeometryAtStop(n){try{return{mismatch:await l(async()=>(await n.settle(),n.verifyAtStop()),{timer:this.timer,timeoutMs:Et,label:"Confirming display geometry at stop"}),unconfirmed:!1}}catch(o){return e.warn(`[DualTrackRecorder] Could not confirm display geometry at stop: ${r(o)}`,o),{unconfirmed:!0}}}handleGestureEvent(n){if(this.stopped)return;if(n.type==="hover"){let s=Xe(n);K(this.exportWarnings,n,s),this.trackGeometrySpan(n,s),this.enqueueStep({resolved:!0,step:s??void 0});return}if(n.type==="pressButton"){this.enqueueStep({resolved:!0,step:kt(n)});return}if(n.type==="pinch"){this.enqueueStep({resolved:!0,step:Ot(n)??void 0});return}if(this.pendingGestures=this.pendingGestures.filter((s)=>!s.resolved||s.step!==void 0&&s.stepIndex===void 0||b(s.gesture)&&this.timer.now()-s.arrivedAt<=Y*2||s.gesture.type==="tap"&&n.arrivedAt-s.gesture.arrivedAt<=A.DOUBLE_TAP_MS),this.upgradeDoubleTap(n))return;let o={gesture:n,arrivedAt:this.timer.now(),resolved:!1};this.pendingGestures.push(o),this.enqueueStep(o),o.timeout=this.timer.setTimeout(()=>this.resolveGesture(o),Y)}upgradeDoubleTap(n){if(n.type!=="doubleTap"||b(n))return!1;let o=[...this.pendingGestures].reverse().find((a)=>fe(a.gesture,n)),s=o?.step;if(s&&["tapOn","tapAt"].includes(s.tool)&&s.params.action==="tap")return s.params.action="doubleTap",K(this.exportWarnings,n,s),!0;if(o&&!o.resolved){if(o.timeout)this.timer.clearTimeout(o.timeout);return o.gesture=n,o.arrivedAt=this.timer.now(),o.timeout=this.timer.setTimeout(()=>this.resolveGesture(o),Y),!0}return!1}enqueueStep(n){this.latestEntry=n,this.orderedSteps.push(n),this.flushResolvedSteps()}flushResolvedSteps(){while(this.orderedSteps[0]?.resolved){let n=this.orderedSteps.shift();if(n.step)n.stepIndex=this.steps.length,this.steps.push(n.step)}}handleInteractionEvent(n){if(this.stopped)return;if(n.type==="windowChange")return;if(n.type==="inputText"){this.handleInputText(n);return}let o={...n,receivedAt:this.timer.now()},s=this.pendingGestures.find((a)=>!a.resolved&&!b(a.gesture)&&this.isPairCandidate(a,o));if(s)this.resolveGesture(s,n);else if(!this.pendingGestures.some((a)=>a.resolved&&!b(a.gesture)&&de(a.gesture.type,n.type)&&Ye(a.gesture,n.element)))this.bufferedInteractions.push(o)}resolveGesture(n,o){if(n.resolved)return;if(n.resolved=!0,n.timeout)this.timer.clearTimeout(n.timeout);let s=this.selectInteraction(n,o),a=Gt(n.gesture,s);if(K(this.exportWarnings,n.gesture,a),n.step=a??void 0,this.trackGeometrySpan(n.gesture,a),this.flushResolvedSteps(),!a&&b(n.gesture)){We(n.gesture);return}if(!s||!V(s.element)||!a){let d=n.gesture,[c,p]=d.type==="swipe"?[d.startX,d.startY]:[d.screenX,d.screenY],h=a?`recorded ${a.tool} fallback`:"no swipe direction or missing coordinates \u2014 step skipped";e.warn(`[DualTrackRecorder] No element match for ${d.type} at (${c}, ${p}) \u2014 ${h}`)}}trackGeometrySpan(n,o){if(o&&n.downAt!==void 0&&["tapAt","swipeOn","swipeAt","dragPath","hoverAt"].includes(o.tool))this.geometrySpans.set(o,{downAt:n.downAt,upAt:n.arrivedAt})}selectInteraction(n,o){let s=this.timer.now(),a=Y*2;this.bufferedInteractions=this.bufferedInteractions.filter((h)=>s-h.receivedAt<=a);let d=this.bufferedInteractions.map((h,m)=>({event:h,index:m}));if(o)d.push({event:{...o,receivedAt:s},index:-1});let c=d.filter(({event:h})=>this.isPairCandidate(n,h));if(b(n.gesture)&&!this.isUnambiguousUnknownPair(n,c.map(({event:h})=>h)))return;let p=c.sort((h,m)=>{let f=h.event.receivedAt-n.arrivedAt,y=m.event.receivedAt-n.arrivedAt;return Number(m.event.type==="tap")-Number(h.event.type==="tap")||Number(f<0)-Number(y<0)||Math.abs(f)-Math.abs(y)})[0];if(p&&p.index>=0)this.bufferedInteractions.splice(p.index,1);return p?.event}isPairCandidate(n,o){let s=n.gesture;if(Math.abs(o.receivedAt-n.arrivedAt)>Y)return!1;if(b(s)){let a=(s.type==="tap"||s.type==="longPress")&&o.type==="scroll"&&ce(o.scrollDeltaX,o.scrollDeltaY)!==null;return Boolean((a||de(s.type,o.type,!1))&&o.element?.bounds&&V(o.element))}return de(s.type,o.type)&&Ye(s,o.element)}isUnambiguousUnknownPair(n,o){if(o.length!==1)return!1;let s=o[0];return!this.pendingGestures.some((a)=>a!==n&&(b(a.gesture)||!a.resolved)&&this.isPairCandidate(a,s))}handleInputText(n){let o=_t(n);if(n.text===void 0)return;let s=Pt(n.text);if(this.coalesceInputText(o,s))return;let a={resolved:!0,step:this.buildRecordedTextStep(s)};if(this.enqueueStep(a),o)this.lastInputText={elementKey:o,entry:a}}buildRecordedTextStep(n){return{tool:"sendKeys",params:{commands:[n]}}}coalesceInputText(n,o){let s=this.lastInputText;if(!s||!n||s.elementKey!==n||s.entry!==this.latestEntry)return!1;return this.updateCoalescedTextStep(s.entry.step,o)}updateCoalescedTextStep(n,o){let s=n?.params.commands?.[0];if(n?.tool!=="sendKeys"||s?.action!=="type"&&s?.action!=="clear")return!1;return n.params.commands=[o],!0}async createGetEventReader(){let n=v.create(this.device),{touch:o,pen:s}=await Me(n),a=o??s[0];if(!a)throw Error("[DualTrackRecorder] No multitouch input device found on this device");let d=await Rte(n),c=De(n),p=await MC(n),{rotation:h,caveats:m}=await Rt(c),f=new W({xMin:a.axisXMin,xMax:a.axisXMax,yMin:a.axisYMin,yMax:a.axisYMax},{rotation:h,display:p},this.timer.now(),m);this.geometry=new re(f,c,this.timer);let y=new L({timer:this.timer}),S=new F({adb:n,touchNode:a,scaler:f,density:d,timer:this.timer,lineMerge:y}),g=new ue({adb:n,primary:{node:a,reader:S},penNodes:o?s:s.slice(1),createPenReader:(w)=>Le({adb:n,penNode:w,timeline:f,rotation:h,display:p,caveats:m,density:d,timer:this.timer,lineMerge:y})});return Ct(g,f,this.timer)}}async function Rt(n){try{let o=await n.readRotation();if(o!==null)return{rotation:o,caveats:[]};e.warn("[DualTrackRecorder] WindowManager reported no display rotation at start")}catch(o){e.warn(`[DualTrackRecorder] Failed to read display rotation at start: ${r(o)}`,o)}return{rotation:0,caveats:[te]}}function Mt(n){return{onDisplayChange(o){let s=n.onDisplayTransition,a=(d)=>{s?.(d),o(d)};return n.onDisplayTransition=a,()=>{if(n.onDisplayTransition===a)n.onDisplayTransition=s}}}}function de(n,o,s=!0){return(n==="tap"||n==="doubleTap")&&(o==="tap"||s&&o==="stateChange")||n==="longPress"&&o==="longPress"||n==="swipe"&&(o==="scroll"||o==="swipe")}function Ye(n,o){let s=o?.bounds;if(!s)return!1;if(b(n))return!1;let a=n.screenX??n.startX,d=n.screenY??n.startY;if(typeof a!=="number"||typeof d!=="number"||!Number.isFinite(a)||!Number.isFinite(d))return!1;return It(a,d,s)}function It(n,o,s){return n>=s.left-20&&n<=s.right+20&&o>=s.top-20&&o<=s.bottom+20}function V(n){if(!n)return null;let o=n["resource-id"];if(o)return{elementId:o};let s=n.text??n["content-desc"];if(s)return{text:s};return null}function _t(n){let o=n.element;if(!o)return null;let s=o["resource-id"]??"",a=o["content-desc"]??"",d=o.class??"";if(!s&&!a&&!d)return null;return`${s}|${a}|${d}`}function ce(n,o){let s=n??0,a=o??0;if(s===0&&a===0)return null;if(Math.abs(s)>=Math.abs(a))return s>0?"left":"right";return a>0?"up":"down"}function Gt(n,o={type:"",timestamp:0}){if(n.toolType!==void 0)return Xe(n);let s=V(o.element);switch(n.type){case"tap":case"doubleTap":case"longPress":{if(n.type!=="doubleTap"&&b(n)&&o.type==="scroll")return He(n,o);if(s)return{tool:"tapOn",params:{action:n.type,...s}};return Ke(n)}case"swipe":return He(n,o);default:return null}}var Dt=0.5;function $e(n){let{startX:o,startY:s,endX:a,endY:d}=n;if(b(n)||o===void 0||s===void 0||a===void 0||d===void 0||o===a&&s===d)return null;return{from:{x:o,y:s},to:{x:a,y:d}}}function Nt({from:n,to:o}){let s=Math.abs(o.x-n.x),a=Math.abs(o.y-n.y);return Math.min(s,a)>=Math.max(s,a)*Dt}function Ue(n,o){let s={from:o.from,to:o.to},a=n.geometry?.deviceWidth,d=n.geometry?.deviceHeight;if(a&&d&&a>0&&d>0)s.from={x:Qp(o.from.x,a),y:Qp(o.from.y,d)},s.to={x:Qp(o.to.x,a),y:Qp(o.to.y,d)},s.coordinateSpace="normalized";if(n.speed==="fast")s.speed="fast";let c=C(n);if(c)s.pointer=c;return{tool:"swipeAt",params:s}}function Xe(n){if(n.toolType!=="stylus"&&n.toolType!=="eraser")return null;if(n.type==="stroke"||n.type==="hover")return ge(n);if(n.type==="swipe"){let o=$e(n);return o?Ue(n,o):null}return Ke(n)}function He(n,o){let s=V(o.element),a=b(n)?s&&ce(o.scrollDeltaX,o.scrollDeltaY):n.direction??ce(o.scrollDeltaX,o.scrollDeltaY),d=$e(n);if(d&&(!a||Nt(d)))return Ue(n,d);if(!a)return null;let c={direction:a};if(s)c.container="elementId"in s?{elementId:s.elementId}:{text:s.text};if(!b(n)&&n.speed==="fast")c.speed="fast";return{tool:"swipeOn",params:c}}function Ke(n){if(b(n)||n.screenX===void 0||n.screenY===void 0)return null;let o={x:n.screenX,y:n.screenY,action:n.type};if(n.type==="longPress"&&n.durationMs!==void 0)o.durationMs=Math.min(eg,Math.max(Na,n.durationMs));let s=C(n);if(s)o.pointer=s;return{tool:"tapAt",params:o,...n.geometry?{geometry:{...n.geometry,x:n.screenX,y:n.screenY}}:{}}}function We(n){e.warn(`[DualTrackRecorder] ${n.type} has unknown axes: ${n.unknownAxes?.join(", ")} \u2014 no resolved element gesture; step skipped`)}function kt(n){return{tool:"pressButton",params:{button:n.button}}}function Ot(n){if(b(n))return We(n),null;return{tool:"pinchOn",params:{direction:n.pinchDirection,scale:n.scale}}}function Ct(n,o,s){return{start:(a,d)=>n.start((c)=>a({...c,geometry:{platform:"android",...o.geometryAt(c.downAt??s.now())}}),d),stop:()=>n.stop()}}var Bt="user-input",Lt="no_user_input_captured",je="Device gesture recordings capture input made on the device itself (touches on its touch screen or emulator window, and text changes in input fields). Taps, swipes and other gestures sent through AutoMobile tools (tapAt, tapOn, swipeOn, etc.) or adb shell input are injected and are not recorded by design; use recordToolCalls to record tool calls.";class LP extends t{reason=Lt;constructor(n){super("No recorded interactions were captured. "+je+(n?` ${n}`:""))}}var ze=1e4,x=null,N=null,G=null,Ft=16,H=new Map;function Yt(n,o){if(!n.ownerSessionUuid)return;if(H.set(n.recordingId,{owner:n.ownerSessionUuid,result:o}),H.size>Ft){let s=H.keys().next();if(!s.done)H.delete(s.value)}}function pe(n){let o=R.sessionManager();if(!o)return n;return st(n,o)??n}function YE(n,o,s=pe){let a=H.get(n);if(!a||o===void 0)return;return he(a.owner,o,s)?a.result:void 0}function he(n,o,s){if(n===void 0||o===void 0)return!1;let a=s(o);return n===o||BG(n,a)||s(n)===a}async function BM(n,o,s=pe){let a=G;if(!a||a.session.recordingId!==n||!he(a.session.ownerSessionUuid,o,s))return;return await a.promise,YE(n,o,s)}function BP(n=i){if(!x)return null;let o=n.now()-x.startedAt,s=x.recorder.stepCount;return{recordingId:x.recordingId,deviceId:x.deviceId,platform:x.platform,startedAt:new Date(x.startedAt).toISOString(),eventCount:s,durationMs:o,captureScope:Bt,...s===0?{notice:je}:{}}}function q(){return x??N?.session??G?.session??null}function uX(n,o){let s=q();if(!s||s.deviceId!==n||s.ownerSessionUuid!==void 0)return!1;return s.ownerSessionUuid=o,!0}function N1(n,o){let s=q();return s!==null&&s.ownerSessionUuid===n&&s.deviceId===o}function $M(n,o){let s=q();return s&&N1(n,o)?s.recordingId:void 0}var Ht=(n,o,s,{stoppedAt:a,omittedInput:d})=>{if(n.length===0)throw new LP(d);let c=new Date(o.startedAt),p=a-o.startedAt,h={name:s,description:`Recorded plan with ${n.length} interaction(s).`,steps:n,mcpVersion:pn(Cn()),metadata:{createdAt:new Date(a).toISOString(),version:"1.0.0",recording:{recordingId:o.recordingId,startedAt:c.toISOString(),stoppedAt:new Date(a).toISOString(),durationMs:p,deviceId:o.deviceId,platform:o.platform,interactionCount:n.length}}};return Gf.validate(h),{plan:h,stepCount:n.length}},$t=(n)=>{if(n&&n.trim().length>0)return n.trim();return`recorded-plan-${new Date().toISOString().replace(/[:.]/g,"-")}`};function Ve(n,o,{ownerSessionUuid:s,baseSessionUuid:a}){if(n.deviceId!==o.deviceId)throw Error(`Recording already active on device ${n.deviceId} (${n.recordingId}). Stop the existing recording before starting a new one on ${o.deviceId}.`);if(!(n.ownerSessionUuid===s||he(n.ownerSessionUuid,s,a??pe)))throw new t(`A recording owned by another session is active on device ${o.deviceId}. Wait for it to stop before starting a recording.`)}async function JE(n,o=i,s=B,{recorderFactory:a=(c)=>new j(c),...d}={}){if(G)return await G.promise.catch(()=>{return}),JE(n,o,s,{recorderFactory:a,...d});let{ownerSessionUuid:c}=d;if(x)return Ve(x,n,d),e.info(`[DeviceGestureRecording] Recording already active (${x.recordingId}), returning existing session`),{recordingId:x.recordingId,startedAt:new Date(x.startedAt).toISOString(),deviceId:x.deviceId,platform:x.platform};if(N)return Ve(N.session,n,d),N.promise;if(n.platform!=="android")throw Error(`Device gesture recording is only supported on Android right now (got ${n.platform}).`);let p=s.next(),h=o.now(),m={recordingId:p,deviceId:n.deviceId,platform:n.platform,startedAt:h,timer:o,recorder:a(n),ownerSessionUuid:c},f=Promise.resolve().then(async()=>{try{return await m.recorder.start(),x=m,e.info(`[DeviceGestureRecording] Started recording ${p} on ${n.deviceId}`),{recordingId:p,startedAt:new Date(h).toISOString(),deviceId:n.deviceId,platform:n.platform}}catch(y){try{await m.recorder.stop()}catch(S){throw u(AggregateError([y,S],"Recorder startup and teardown both failed"),"Failed to start device gesture recording")}throw u(y,"Failed to start device gesture recording")}finally{if(N?.session===m)N=null}});return N={session:m,promise:f},f}function Ut(){return q()?.timer??i}async function fy(n,o,s=Ut(),a={}){if(N)await N.promise;let d=x??G?.session??null;if(!d)throw Error("No active recording. Start a recording before stopping.");if(n&&n!==d.recordingId)throw Error(`Recording ID ${n} does not match active recording ${d.recordingId}.`);if(G?.session===d)return G.promise;x=null;let c=Wt(d,o,s,a).then((p)=>(Yt(d,p),p)).finally(()=>{if(G?.session===d)G=null});return G={session:d,promise:c},c}async function Xt(n,o,s){try{return await l(()=>n.recorder.stop(s),{timer:o,timeoutMs:ze,label:"Stopping device gesture recording",timeoutError:()=>Error(`Device gesture recording stop timed out after ${ze} ms`)})}catch(a){e.warn(`[DeviceGestureRecording] Failed to stop recording ${n.recordingId}`,a);let d=n.recorder.capturedSteps??[];if(d.length===0)throw u(a,"Failed to stop device gesture recording");return{steps:[...d],exportWarnings:[...n.recorder.capturedExportWarnings??[]],salvagedAfter:r(a)}}}function Kt(n){if(!n?.length)return;let o=`Some recorded input was left out of the plan: ${n.join("; ")}.`;return e.warn(`[DeviceGestureRecording] ${o}`),o}async function Wt(n,o,s,a){let{steps:d,touchTrackFailure:c,geometryWarnings:p,exportWarnings:h,salvagedAfter:m}=await Xt(n,s,a),f=c?`Touch track (getevent) stopped ${c.failedAt-n.startedAt} ms after recording start: ${c.error.message}. Later taps may be missing.`:void 0;if(f&&d.length===0)throw u(Error(f,{cause:c?.error}),"Failed to stop device gesture recording");if(f)e.warn(`[DeviceGestureRecording] ${f}`);let y=p?.length?`Display geometry changed or was unreadable during recording: ${p.join("; ")}. Steps labelled "Warning:" may be recorded at the wrong coordinates or direction.`:void 0;if(y)e.warn(`[DeviceGestureRecording] ${y}`);let S=Kt(h),g=m?`Stopping the recorder did not finish (${m}); the steps captured so far are returned without confirming display rotation/size, so tapAt and swipeOn steps recorded after a display change may be at the wrong coordinates or direction.`:void 0;if(g)e.warn(`[DeviceGestureRecording] ${g}`);let w=[f,y,S,g].filter(Boolean).join(" "),_=s.now(),I=$t(o),{plan:J,stepCount:O}=Ht(d,n,I,{stoppedAt:_,omittedInput:S}),U=jS(J,{indent:2,lineWidth:-1,noRefs:!0}),T=_-n.startedAt;return e.info(`[DeviceGestureRecording] Stopped recording ${n.recordingId} with ${O} steps`),{recordingId:n.recordingId,startedAt:new Date(n.startedAt).toISOString(),stoppedAt:new Date(_).toISOString(),durationMs:T,planName:I,planContent:U,stepCount:O,...w?{error:`Warning: ${w}`}:{},deviceId:n.deviceId,platform:n.platform}}
6
- export{M1,KE,Bf,FP,GE,LG,$f,cX,dX,lX,LM,LP,YE,BM,BP,uX,N1,$M,JE,fy};
2
+ import{i,l,e}from"./chunk-r0vp315h.js";import{Fte,jC,Lte,yl}from"./chunk-4vxeq0vd.js";import{B}from"./chunk-r6pvhj33.js";import{w,v,at,Ya,E}from"./chunk-sfqe223f.js";import{gn,Nn}from"./chunk-aewdveet.js";import{od}from"./chunk-b3tdtq7r.js";import{ow}from"./chunk-xn9m3xc2.js";import{o6}from"./chunk-96r3bpg7.js";import{dh,fm}from"./chunk-s3y3zfcx.js";import{$a,gg}from"./chunk-cb1ga9rd.js";import{r,t,u}from"./chunk-2b39zyxc.js";var X1=2,dI=100,Qf=200,tA=1,lI=5000,i6=3000,eh=20000,qe=50;function DX(n,o,s){let a=[];for(let[d,c]of n.points.entries()){let p=od({x:c.x,y:c.y,coordinateSpace:n.coordinateSpace},o,s,"dragPath");if("error"in p)return{error:`points[${d}]: ${p.error}`};a.push({x:p.x,y:p.y})}return{points:a}}function OX(n,o){if(n.length<X1)throw new t(`dragPath needs at least ${X1} points`);let s=o.holdMs??0,a=o.releaseHoldMs??0,d=[],c=0;for(let p=1;p<n.length;p++){let h=n[p-1],m=n[p],f=o.points[p]?.durationMs??Qf,y=Math.max(1,Math.ceil(f/qe));for(let S=1;S<=y;S++){let g=S/y;d.push({atMs:c+Math.round(f*g),x:S===y?m.x:Math.round(h.x+(m.x-h.x)*g),y:S===y?m.y:Math.round(h.y+(m.y-h.y)*g)})}c+=f}return{start:n[0],holdMs:s,moves:d,releaseHoldMs:a,totalMs:s+c+a,vertices:n}}function MX(n){let o=[{x:n.start.x,y:n.start.y,offsetMs:0}];if(n.holdMs>0)o.push({x:n.start.x,y:n.start.y,offsetMs:n.holdMs});for(let a of n.moves)o.push({x:a.x,y:a.y,offsetMs:n.holdMs+a.atMs});let s=o[o.length-1];if(n.releaseHoldMs>0)o.push({x:s.x,y:s.y,offsetMs:s.offsetMs+n.releaseHoldMs});return o}function nN(n,o,s=0){if(n>eh)throw new t(`dragPath total duration ${n} ms exceeds the ${eh} ms limit; shorten the segments or holds. No input was sent.`);if(o===void 0)return;let a=n+s+Ya;if(a>o)throw new t(`dragPath duration ${n} ms does not fit the remaining request budget (${o} ms; needs ${a} ms including dispatch headroom); no input was sent. Increase the request timeout or shorten the path.`)}function C(n){if(n.toolType!=="stylus"&&n.toolType!=="eraser")return;let o={toolType:n.toolType};if(n.pressure?.normalized)o.pressure=Math.round(n.pressure.mean*1e4)/1e4;if(n.tilt!==void 0)o.tilt=n.tilt;if(n.buttons?.length)o.buttons=n.buttons.map((s)=>s==="stylusPrimary"?"primary":"secondary");return o}var A={TOUCH_SLOP_DP:8,STROKE_PRESSURE_RANGE:0.05,PEN_MAX_SAMPLES:100,LONG_PRESS_MS:400,TAP_TIMEOUT_MS:100,DOUBLE_TAP_MS:300,DOUBLE_TAP_SLOP_DP:100,FLING_MIN_DP_PER_S:50,PINCH_MIN_SCALE_DELTA:0.1};function b(n){return Boolean(n.unknownAxes?.length)}function Je(n,o){return n.type==="tap"&&n.toolType===o.toolType&&!b(n)&&n.screenX!==void 0&&n.screenY!==void 0}function fe(n,o){if(!Je(n,o))return!1;let s=o.arrivedAt-n.arrivedAt,a=s>=0&&s<=A.DOUBLE_TAP_MS;if(o.firstTapArrivedAt!==void 0)return n.arrivedAt===o.firstTapArrivedAt&&a;let d=(o.screenX??1/0)-(n.screenX??1/0),c=(o.screenY??1/0)-(n.screenY??1/0);return a&&Math.hypot(d,c)<=A.DOUBLE_TAP_SLOP_DP}function ye(n,o){return n.kernelAtMs!==void 0&&o.kernelAtMs!==void 0?n.kernelAtMs-o.kernelAtMs:n.arrivedAt-o.arrivedAt}function X(n){let o=n.type==="stroke"?n.path:n.hover;if(n.type!=="stroke"&&n.type!=="hover"||n.toolType!=="stylus"||b(n)||!o||o.length<2)return!1;return o.reduce((a,d,c)=>a+(c>0?ye(d,o[c-1]):0),0)>eh}function ge(n){let o=n.type==="stroke"?n.path:n.hover;if(n.toolType!=="stylus"||b(n)||!o?.length||n.type==="stroke"&&o.length<2||X(n))return null;let s=et(o);return{tool:n.type==="stroke"?"dragPath":"hoverAt",params:{points:s,...n.type==="hover"?{toolType:"stylus"}:{pointer:C(n)}}}}function Ze(n,o,s){let a=Math.ceil(s/lI);return Array.from({length:a},(d,c)=>{let p=(c+1)/a,h={...o,x:n.x+(o.x-n.x)*p,y:n.y+(o.y-n.y)*p,durationMs:Math.round(s*p)-Math.round(s*c/a)};for(let m of["pressure","distance"])if(n[m]!==void 0&&o[m]!==void 0)h[m]=n[m]+(o[m]-n[m])*p;return c===a-1?{...o,durationMs:h.durationMs}:h})}function Qe(n){while(n.length>dI){let o=(p)=>p.pressure??p.distance??0,s=n.reduce((p,h,m)=>o(h)<o(n[p])?m:p,0),a=n.reduce((p,h,m)=>o(h)>o(n[p])?m:p,0),d=1/0,c=1;for(let p=1;p<n.length-1;p++){let h=n[p].durationMs+n[p+1].durationMs;if(p!==s&&p!==a&&h<d)d=h,c=p}n[c+1].durationMs=d,n.splice(c,1)}}function et(n){let o=[],s=0,a=0;for(let[d,c]of n.entries()){let{arrivedAt:p,kernelAtMs:h,...m}=c;if(d===0){o.push(m);continue}s+=Math.max(0,ye({arrivedAt:p,kernelAtMs:h},n[d-1]));let f=Math.round(s),y=f-a;if(y<tA){if(d!==n.length-1)continue;if(o.length===1)o.push({...m,durationMs:tA});else o[o.length-1]={...m,durationMs:o.at(-1).durationMs};continue}o.push(...Ze(o.at(-1),m,y)),a=f}return Qe(o),o}var tt="a pen gesture made with the eraser end was exported as an eraser step; replay injects an eraser only on a root adb shell with a uinput tool and refuses that step elsewhere",rt="a pen gesture without a known position or path was not exported: replaying it as a finger would be wrong",nt=`a stylus stroke was not exported because its duration exceeds the ${eh/1000} second replay limit; record a shorter stroke`,it=`a stylus hover was not exported because its duration exceeds the ${eh/1000} second replay limit; record a shorter hover`,ot="a pen hovered over the screen without touching it; no known position or hover distance was recorded, so nothing was exported for it",st="a stylus double tap was exported, but replay refuses stylus double taps, so that step will fail when run";function lt(n,o){if(n.toolType===void 0)return;if(n.type==="hover")return o?void 0:X(n)?it:ot;if(!o)return X(n)?nt:rt;if(o.params.pointer!==void 0&&o.params.action==="doubleTap")return st;return n.toolType==="eraser"?tt:void 0}function K(n,o,s){let a=lt(o,s);if(a)n.add(a)}var Te=0,be=1,Ae=24,xe=26,we=27,Pe=53,Ee=54,Re=58;function Z(n){let o=/^(add|remove) device \d+:\s+(\/dev\/input\/event\d+)\s*$/.exec(n);return o?{action:o[1]==="add"?"add":"remove",path:o[2]}:null}async function Me(n){let{stdout:o}=await n.executeCommand("shell getevent -p"),s=Q(o);if(s.touch===null&&s.pen.length===0)e.warn("[InputNodeDiscovery] No multitouch or pen input device found");return s}function Q(n){let o=ut(n);return{touch:o.find((s)=>s.kind==="touch")??null,pen:o.filter((s)=>s.kind==="pen")}}function ut(n){let o=[];for(let s of mt(n)){let a=s.abs.get(Pe),d=s.abs.get(Ee);if(a&&d){o.push(ve(s,a,d,{pressure:s.abs.get(Re),kind:"touch"}));continue}let c=s.abs.get(Te),p=s.abs.get(be);if(c&&p&&s.hasPenTool)o.push(ve(s,c,p,{pressure:s.abs.get(Ae),kind:"pen"}))}return o}function ve(n,o,s,{pressure:a,kind:d}){let c=n.abs.get(d==="pen"?25:59),p=n.abs.get(xe),h=n.abs.get(we);return{path:n.path,name:n.name,axisXMin:o.min,axisXMax:o.max,axisYMin:s.min,axisYMax:s.max,kind:d,...c&&c.max>c.min?{distanceRange:c}:{},...p&&h?{tiltAxes:{x:p,y:h}}:{},...a&&a.max>a.min?{pressureMin:a.min,pressureMax:a.max}:{}}}var Se=/\b(?:BTN_TOOL_PEN|BTN_TOOL_RUBBER|0140|0141)\b/,dt={ABS_X:Te,ABS_Y:be,ABS_PRESSURE:Ae,ABS_DISTANCE:25,ABS_MT_DISTANCE:59,ABS_TILT_X:xe,ABS_TILT_Y:we,ABS_MT_POSITION_X:Pe,ABS_MT_POSITION_Y:Ee,ABS_MT_PRESSURE:Re},ct=/^\s*(?:ABS\s*\(0003\):\s*)?(?:(ABS_\w+)(?:\s+\(([0-9a-f]{4})\))?|([0-9a-f]{4}))\s*:\s+value\s+-?\d+,\s*min\s+(-?\d+),\s*max\s+(-?\d+)/,pt=/^\s+(\w+)\s*\([0-9a-f]{4}\):(.*)$/;function ht(n){let o=n[2]??n[3];return o?parseInt(o,16):dt[n[1]]}function mt(n){let o=[],s=null,a={inKeyBlock:!1};for(let d of n.split(`
3
+ `)){let c=Z(d);if(c?.action==="add"){let{path:p}=c;s={path:p,name:p,abs:new Map,hasPenTool:!1},o.push(s),a.inKeyBlock=!1}else if(s)ft(s,d,a)}return o}function ft(n,o,s){let a=o.match(/^\s+name:\s+"(.+)"/);if(a){n.name=a[1],s.inKeyBlock=!1;return}let d=o.match(ct);if(d){let h=ht(d);if(h!==void 0)n.abs.set(h,yt(d,o));s.inKeyBlock=!1;return}let c=o.match(pt);if(c){if(s.inKeyBlock=c[1]==="KEY"||c[1]==="EV_KEY",s.inKeyBlock&&Se.test(c[2]))n.hasPenTool=!0;return}let p=/^\s+[\w ]+$/.test(o);if(s.inKeyBlock&&p&&Se.test(o))n.hasPenTool=!0;else if(!p)s.inKeyBlock=!1}function yt(n,o){let s=o.match(/,\s*resolution\s+(\d+)/);return{min:parseInt(n[4],10),max:parseInt(n[5],10),...s?{resolution:parseInt(s[1],10)}:{}}}var ee=500,te="display rotation could not be read; touch coordinates and swipe directions may be mapped with the wrong rotation",gt="display size could not be read after a display change; touch coordinates may be scaled with the wrong size";function vt(n,o){return`display size changed from ${n.width}x${n.height} to ${o.width}x${o.height} (fold/unfold?); touches are still read from the touch node chosen when recording started, so coordinates may refer to a different panel`}class W{axes;entries;changeReports=[];baselineDisplay;followers=[];constructor(n,o,s,a=[]){this.axes=n;this.baselineDisplay=o.display,this.entries=[this.entry(o,s,a)]}scalerAt(n){return this.entryAt(n).scaler}geometryAt(n){let{rotation:o,display:s}=this.entryAt(n),a=o%2!==0;return{deviceWidth:a?s.height:s.width,deviceHeight:a?s.width:s.height,orientation:o}}get currentRotation(){return this.entries[this.entries.length-1].rotation}get lastKnownGoodAt(){for(let n=this.entries.length-1;n>=0;n--)if(this.entries[n].caveats.length===0)return this.entries[n].reportedAt;return this.entries[0].reportedAt}noteChangeReported(n){this.changeReports.push(n);for(let o of this.followers)o.noteChangeReported(n)}follow(n){return n.entries.splice(0,n.entries.length,...this.entries.map((o)=>n.entry(o,o.reportedAt,o.caveats))),n.changeReports.splice(0,n.changeReports.length,...this.changeReports),this.followers.push(n),()=>{let o=this.followers.indexOf(n);if(o!==-1)this.followers.splice(o,1)}}apply(n,o){for(let c of this.followers)c.apply(n,o);let s=this.entries[this.entries.length-1],a=[];if(n.rotation===null)a.push(te);if(n.display===null)a.push(gt);let d={rotation:n.rotation??s.rotation,display:n.display??s.display};if(d.display.width!==this.baselineDisplay.width||d.display.height!==this.baselineDisplay.height)a.push(vt(this.baselineDisplay,d.display));this.entries.push(this.entry(d,Math.max(o,s.reportedAt),a))}warningsFor(n,o){let s=new Set(this.entryAt(n).caveats);if(this.changeReports.some((d)=>d>n&&d<=o))s.add("gesture spans a display rotation/size change; its coordinates and direction mix two geometries");else if(this.changeReports.some((d)=>d>=n-ee&&d<=o+ee))s.add(`display rotation/size changed within ${ee} ms of this gesture; its coordinates or direction may use a stale rotation`);return[...s]}entryAt(n){let o=this.entries[0];for(let s of this.entries){if(s.reportedAt>n)break;o=s}return o}entry(n,o,s){return{...n,reportedAt:o,caveats:s,scaler:Fte({...this.axes,displayWidth:n.display.width,displayHeight:n.display.height,rotation:n.rotation})}}}function Ie(n,o,s,{startedAt:a,caveats:d}){return o.map((c)=>{let p=new W({xMin:c.axisXMin,xMax:c.axisXMax,yMin:c.axisYMin,yMax:c.axisYMax},s,a,d),h=n.follow(p);return{node:c,scaler:p,stopFollowing:h}})}var St=0,_e=1000;function De(n){return{readRotation:()=>yl(n,{timeoutMs:_e}),readPhysicalSize:()=>jC(n,{timeoutMs:_e})}}function Ge(n){return n!==void 0&&Number.isInteger(n)&&n>=0&&n<=3}class re{timeline;probe;timer;refreshChain=Promise.resolve();generation=0;disposed=!1;constructor(n,o,s){this.timeline=n;this.probe=o;this.timer=s}dispose(){this.disposed=!0,this.refreshChain=Promise.resolve()}handleTransition(n){if(this.disposed||n.displayId!==St||n.change==="removed")return;let o=this.timer.now(),s=++this.generation;if(this.timeline.noteChangeReported(o),Ge(n.rotation))this.timeline.apply({rotation:n.rotation},o);let a=Ge(n.rotation);this.refreshChain=this.refreshChain.then(()=>this.refresh(o,a,s))}async settle(){let n;do n=this.refreshChain,await n;while(n!==this.refreshChain)}async verifyAtStop(){if(this.disposed)return;let n=await this.probe.readRotation().then(void 0,(s)=>{if(!this.disposed)throw s;return e.debug("[DisplayGeometryTracker] Cancelled stop-time geometry read failed",s),null});if(this.disposed)return;if(n===null)throw Error("WindowManager did not report a display rotation at stop");let o=this.timeline.currentRotation;if(n!==o)return`display rotation at stop (${n}) differs from the rotation tracked during recording (${o}); a rotation was not reported, so tapAt and swipeOn steps after it may be recorded at the wrong coordinates or direction`;return}async refresh(n,o,s){if(this.disposed||s!==this.generation)return;let a=o?void 0:await this.readRotationOrNull();if(this.disposed)return;let d=await this.readSizeOrNull();if(this.disposed||s!==this.generation)return;this.timeline.apply({rotation:a,display:d},n)}async readRotationOrNull(){try{return await this.probe.readRotation()}catch(n){return e.warn(`[DisplayGeometryTracker] Failed to read rotation after a display change: ${r(n)}`,n),null}}async readSizeOrNull(){try{return await this.probe.readPhysicalSize()}catch(n){return e.warn(`[DisplayGeometryTracker] Failed to read display size after a display change: ${r(n)}`,n),null}}}var Ne=(n,o,s)=>({type:"hover",arrivedAt:o,toolType:n,...s.samples.length?{hover:s.samples}:{}});class ne{nodeEpisode;slotEpisodes=new Map;penEntered(){this.nodeEpisode??={touched:!1,samples:[]}}penTouched(){this.nodeEpisode??={touched:!1,samples:[]},this.nodeEpisode.touched=!0}penLeft(n,o){let s=this.nodeEpisode;return this.nodeEpisode=void 0,s&&!s.touched?Ne(n,o,s):null}slotHovering(n,o,s,a){if(!this.slotEpisodes.has(n))this.slotEpisodes.set(n,{touched:!1,samples:[]});this.sample(this.slotEpisodes.get(n),o,s,a)}penHovering(n,o,s){if(this.nodeEpisode)this.sample(this.nodeEpisode,n,o,s)}sample(n,o,s,a){if(n.touched||!Number.isFinite(o.x)||!Number.isFinite(o.y)||o.distance===void 0||!Number.isFinite(o.distance))return;if(n.samples.length>=A.PEN_MAX_SAMPLES)n.samples=n.samples.filter((d,c)=>c===0||c%2===1);n.samples.push({x:o.x,y:o.y,distance:o.distance,arrivedAt:s,...a===void 0?{}:{kernelAtMs:a}})}slotTouching(n){this.slotEpisodes.set(n,{touched:!0,samples:[]})}slotReleased(n,o,s){let a=this.slotEpisodes.get(n);return this.slotEpisodes.delete(n),a&&!a.touched&&o?Ne(o,s,a):null}}var Tt={KEY_BACK:"back",KEY_HOME:"home",KEY_MENU:"menu",KEY_POWER:"power",KEY_VOLUMEUP:"volume_up",KEY_VOLUMEDOWN:"volume_down",KEY_APPSELECT:"recent"};class ie{options;slots=new Map;currentSlot=0;penPaths=new Map;releasedSlots=new Set;touchingSlots=new Set;lastEmitted=new Map;nodeTool;heldButtons=new Set;hover=new ne;kernelAtMs=0;constructor(n={}){this.options=n}emitHover(n){if(n)this.options.onHover?.(n)}feedLine(n,o){let s=n.match(/^\[\s*(\d+(?:\.\d+)?)\]\s+(\S+)\s+(\S+)\s+(\S+)\s*$/);if(!s)return null;this.kernelAtMs=Number(s[1])*1000;let a=s[2],d=s[3],c=s[4];if(a==="EV_ABS")return this.handleAbsEvent(d,c,o);if(a==="EV_SYN")return this.handleSynEvent(d,c,o);if(a==="EV_KEY"){let p=c==="DOWN"?Tt[d]:void 0;if(p)return{type:"pressButton",arrivedAt:o,button:p};this.handleKeyEvent(d,c==="DOWN"||c==="REPEAT",o)}return null}handleAbsEvent(n,o,s){let a=parseInt(o,16);switch(n){case"ABS_MT_SLOT":this.currentSlot=a;break;case"ABS_MT_TRACKING_ID":if(o==="ffffffff")this.releaseCurrentSlot(s);else{let d=this.getOrCreateSlot();if(d.trackingId>=0&&d.trackingId!==a){let c=this.endedByReplacement(d,s);return this.emitHover(this.hover.slotReleased(d.slotId,this.withPenState({...d}).toolType,s)),d.trackingId=a,c}d.trackingId=a}break;case"ABS_MT_POSITION_X":this.observeAxis("x",a);break;case"ABS_MT_POSITION_Y":this.observeAxis("y",a);break;case"ABS_MT_PRESSURE":this.getOrCreateSlot().pressure=a;break;default:this.handlePenAbsEvent(n,a);break}return null}releaseCurrentSlot(n){let o=this.slots.get(this.currentSlot);if(!o)return;if(o.trackingId>=0)this.releasedSlots.add(o.slotId),o.trackingId=-1;this.emitHover(this.hover.slotReleased(o.slotId,this.withPenState({...o}).toolType,n))}observePenSlot(n,o){if(this.options.singleTouch||n.toolType===void 0||n.trackingId<0)return;if(this.isMtPenHovering(n))this.hover.slotHovering(n.slotId,n,o,this.kernelAtMs);else this.hover.slotTouching(n.slotId)}endedByReplacement(n,o){let s=[];for(let[,a]of this.slots)if(a.slotId!==n.slotId&&a.trackingId>=0&&!this.isMtPenHovering(a)){let d=this.withPenState({...a});if(d.toolType)d.path=this.samplePen(d,o);s.push(d)}return this.releasedSlots.delete(n.slotId),this.touchingSlots.delete(n.slotId),this.lastEmitted.delete(n.slotId),this.penPaths.delete(n.slotId),{arrivedAt:o,activeSlots:s,releasedSlots:[n.slotId]}}handlePenAbsEvent(n,o){switch(n){case"ABS_MT_TOOL_TYPE":if(o===1)this.getOrCreateSlot().toolType="stylus";else delete this.getOrCreateSlot().toolType;break;case"ABS_X":case"ABS_Y":case"ABS_PRESSURE":if(this.options.singleTouch)this.handleSingleTouchAxis(n,o);break;case"ABS_TILT_X":this.getOrCreateSlot().tiltX=o|0;break;case"ABS_TILT_Y":this.getOrCreateSlot().tiltY=o|0;break;case"ABS_DISTANCE":case"ABS_MT_DISTANCE":this.getOrCreateSlot().distance=o;break;default:break}}handleSingleTouchAxis(n,o){if(this.currentSlot=0,n==="ABS_X")this.observeAxis("x",o);else if(n==="ABS_Y")this.observeAxis("y",o);else this.getOrCreateSlot().pressure=o}handleKeyEvent(n,o,s){switch(n){case"BTN_DIGI":case"BTN_TOOL_PEN":this.setNodeTool("stylus",o,s);break;case"BTN_TOOL_RUBBER":this.setNodeTool("eraser",o,s);break;case"BTN_STYLUS":this.setButton("stylusPrimary",o);break;case"BTN_STYLUS2":this.setButton("stylusSecondary",o);break;case"BTN_TOUCH":if(this.options.singleTouch){if(this.handleSingleTouchContact(o),o)this.hover.penTouched()}break;default:break}}setNodeTool(n,o,s){if(o){if(this.nodeTool=n,this.options.singleTouch)this.hover.penEntered();return}if(this.nodeTool!==n&&this.nodeTool!==void 0)return;if(this.nodeTool=void 0,this.options.singleTouch)this.handleSingleTouchContact(!1),this.emitHover(this.hover.penLeft(n,s))}setButton(n,o){if(o)this.heldButtons.add(n);else this.heldButtons.delete(n)}handleSingleTouchContact(n){if(this.currentSlot=0,n){this.getOrCreateSlot().trackingId=0;return}let o=this.slots.get(0);if(o&&o.trackingId>=0)this.releasedSlots.add(0),o.trackingId=-1}handleSynEvent(n,o,s){if(n!=="SYN_REPORT")return null;if(parseInt(o,16)!==0)return null;let d=[],c=[],p=[],h=new Set;for(let[,m]of this.slots)if(this.observePenSample(m,s),m.trackingId>=0&&!this.isMtPenHovering(m)){h.add(m.slotId);let f=this.withPenState({...m});if(f.toolType)f.path=this.samplePen(f,s);d.push(f),this.lastEmitted.set(m.slotId,{x:m.x,y:m.y})}else if(this.releasedSlots.has(m.slotId)||m.trackingId>=0&&this.touchingSlots.has(m.slotId))c.push(m.slotId),p.push(...this.takeFinalMove(m,s));for(let m of c)this.penPaths.delete(m);return this.releasedSlots.clear(),this.touchingSlots=h,p.length>0?{arrivedAt:s,activeSlots:d,releasedSlots:c,releasedFinalSamples:p}:{arrivedAt:s,activeSlots:d,releasedSlots:c}}observePenSample(n,o){if(this.observePenSlot(n,o),this.options.singleTouch&&this.nodeTool&&n.trackingId<0)this.hover.penHovering(n,o,this.kernelAtMs)}takeFinalMove(n,o){let s=this.lastEmitted.get(n.slotId);if(this.lastEmitted.delete(n.slotId),!s||s.x===n.x&&s.y===n.y)return[];let a=this.withPenState({...n}),d=this.penPaths.get(n.slotId)?.at(-1)?.pressure;if(a.toolType&&d!==void 0)a.path=this.samplePen({...a,pressure:d},o);return[a]}withPenState(n){if(!(this.options.singleTouch||n.toolType!==void 0))return delete n.tiltX,delete n.tiltY,n;if(this.options.singleTouch)n.toolType=this.nodeTool??"stylus";else if(this.nodeTool==="eraser")n.toolType=this.nodeTool;if(this.heldButtons.size>0)n.buttons=[...this.heldButtons];return n}isMtPenHovering(n){return!this.options.singleTouch&&n.toolType!==void 0&&(n.distance??0)>0}samplePen(n,o){let s=this.penPaths.get(n.slotId)??[],a={x:n.x,y:n.y,pressure:n.pressure,arrivedAt:o,kernelAtMs:this.kernelAtMs};if(s.length>=A.PEN_MAX_SAMPLES){let d=s.reduce((p,h,m)=>h.pressure<s[p].pressure?m:p,0),c=s.reduce((p,h,m)=>h.pressure>s[p].pressure?m:p,0);s=s.filter((p,h)=>h===0||h===d||h===c||h%2===1)}return s.push(a),this.penPaths.set(n.slotId,s),[...s]}getOrCreateSlot(){if(!this.slots.has(this.currentSlot))this.slots.set(this.currentSlot,{slotId:this.currentSlot,trackingId:-1,x:NaN,y:NaN,pressure:0,unknownAxes:["x","y"]});return this.slots.get(this.currentSlot)}observeAxis(n,o){let s=this.getOrCreateSlot();if(s[n]=o,s.unknownAxes=s.unknownAxes?.filter((a)=>a!==n),!s.unknownAxes?.length)delete s.unknownAxes}}class ae{scaler;densityDp;pressureRange;tiltAxes;contacts=new Map;lastTap=null;pinchState=null;inTwoFingerMode=!1;constructor(n,o,s,a){this.scaler=n;this.densityDp=o;this.pressureRange=s;this.tiltAxes=a}scalerAt(n){return"scalerAt"in this.scaler?this.scaler.scalerAt(n):this.scaler}downStamp(n){return"scalerAt"in this.scaler?{downAt:n.arrivedAt}:{}}feedFrame(n){this.updateContacts(n);let o=n.activeSlots.length;if(this.updatePinchState(n,o),n.releasedSlots.length===0)return null;if(this.inTwoFingerMode&&this.pinchState){for(let s of n.releasedSlots)this.contacts.delete(s);if(o===0){let s=this.maybeEmitPinch(n.arrivedAt);return this.inTwoFingerMode=!1,this.pinchState=null,s}return null}if(!this.inTwoFingerMode&&n.releasedSlots.length===1&&o===0)return this.completeSingleFingerGesture(n);for(let s of n.releasedSlots)this.contacts.delete(s);return null}updateContacts(n){for(let o of n.releasedFinalSamples??[]){let s=this.contacts.get(o.slotId);if(s)s.lastX=o.x,s.lastY=o.y,s.path=o.path??s.path}for(let o of n.activeSlots){let s=this.contacts.get(o.slotId);if(s){if(!Number.isFinite(s.startX))s.startX=o.x;if(!Number.isFinite(s.startY))s.startY=o.y;s.lastX=o.x,s.lastY=o.y,s.path=o.path,s.unknownAxes=oe(s.unknownAxes,o.unknownAxes),Oe(s.pen,o,this.tiltAxes)}else{let a=bt();Oe(a,o,this.tiltAxes),this.contacts.set(o.slotId,{startX:o.x,startY:o.y,arrivedAt:n.arrivedAt,lastX:o.x,lastY:o.y,scaler:this.scalerAt(n.arrivedAt),unknownAxes:o.unknownAxes,pen:a,path:o.path})}}}updatePinchState(n,o){if(o===2){this.inTwoFingerMode=!0;let[s,a]=n.activeSlots,d=oe(this.contacts.get(s.slotId)?.unknownAxes,this.contacts.get(a.slotId)?.unknownAxes),c=this.contacts.get(s.slotId)?.scaler??this.scalerAt(n.arrivedAt),p=d?.length?void 0:ke(c,s.x,s.y,{rawX2:a.x,rawY2:a.y});if(!this.pinchState)this.pinchState={initialDist:p,finalDist:p,unknownAxes:d};else this.pinchState.finalDist=p,this.pinchState.unknownAxes=oe(this.pinchState.unknownAxes,d)}}completeSingleFingerGesture(n){let o=n.releasedSlots[0],s=this.contacts.get(o);if(this.contacts.delete(o),!s)return null;if(s.unknownAxes?.length)return{...this.evaluateUnknownContact(s,n.arrivedAt),...this.penFields(s)};let{x:a,y:d}=s.scaler.toScreenPoint(s.startX,s.startY),{x:c,y:p}=s.scaler.toScreenPoint(s.lastX,s.lastY),h=n.arrivedAt-s.arrivedAt,m=z(a,d,c,p),f=A.TOUCH_SLOP_DP*this.densityDp,y=m<f?this.evaluateTapOrLongPress(a,d,h,{arrivedAt:n.arrivedAt,toolType:s.pen.toolType}):this.evaluateSwipe({x:a,y:d},{x:c,y:p},h,n.arrivedAt);return this.completeContactGesture(s,y,n.arrivedAt,h)}completeContactGesture(n,o,s,a){let d=this.penFields(n);if(o.type==="swipe"&&n.pen.toolType==="stylus"&&d.pressure?.normalized&&this.pressureRange&&(n.pen.pressureMax-n.pen.pressureMin)/(this.pressureRange.max-this.pressureRange.min)>=A.STROKE_PRESSURE_RANGE&&n.path&&n.path.length>=2){this.lastTap=null;let c=this.pressureRange,p=n.path.map((h)=>({...n.scaler.toScreenPoint(h.x,h.y),arrivedAt:h.arrivedAt,...h.kernelAtMs===void 0?{}:{kernelAtMs:h.kernelAtMs},pressure:Math.round(se((h.pressure-c.min)/(c.max-c.min))*1e4)/1e4}));return{type:"stroke",arrivedAt:s,durationMs:a,path:p,...this.downStamp(n),...d}}return{...o,...this.downStamp(n),...d}}penFields(n){let{toolType:o,buttons:s,pressureCount:a,pressureSum:d,pressureMin:c,pressureMax:p}=n.pen,h={};if(o)h.toolType=o;if(a>0){let m=this.pressureRange,f=(y)=>Math.round((m?se((y-m.min)/(m.max-m.min)):y)*1e4)/1e4;h.pressure={min:f(c),max:f(p),mean:f(d/a),normalized:m!==void 0}}if(n.pen.tiltCount>0)h.tilt=Math.min(Math.PI/2,Math.round(n.pen.tiltSum/n.pen.tiltCount*1e4)/1e4);if(s.size>0)h.buttons=[...s];return h}evaluateUnknownContact(n,o){this.lastTap=null;let s=o-n.arrivedAt,a=Number.isFinite(n.startX)?n.startX:0,d=Number.isFinite(n.startY)?n.startY:0,c=Number.isFinite(n.lastX)?n.lastX:a,p=Number.isFinite(n.lastY)?n.lastY:d;return{type:ke(n.scaler,a,d,{rawX2:c,rawY2:p})>=A.TOUCH_SLOP_DP*this.densityDp?"swipe":s>=A.LONG_PRESS_MS?"longPress":"tap",arrivedAt:o,durationMs:s,unknownAxes:n.unknownAxes}}maybeEmitPinch(n){let o=this.pinchState;if(o?.unknownAxes?.length)return this.lastTap=null,null;if(!o||o.initialDist===void 0||o.finalDist===void 0||o.initialDist===0)return null;let s=o.finalDist/o.initialDist;if(Math.abs(s-1)<A.PINCH_MIN_SCALE_DELTA)return null;return{type:"pinch",arrivedAt:n,scale:s,pinchDirection:s<1?"in":"out"}}evaluateTapOrLongPress(n,o,s,{arrivedAt:a,toolType:d}){if(s>=A.LONG_PRESS_MS)return{type:"longPress",arrivedAt:a,screenX:n,screenY:o,durationMs:s};if(this.lastTap&&this.lastTap.toolType===d){let c=a-this.lastTap.arrivedAt,p=z(n,o,this.lastTap.screenX,this.lastTap.screenY),h=A.DOUBLE_TAP_SLOP_DP*this.densityDp;if(c<=A.DOUBLE_TAP_MS&&p<=h){let m=this.lastTap.arrivedAt;return this.lastTap=null,{type:"doubleTap",arrivedAt:a,screenX:n,screenY:o,firstTapArrivedAt:m}}}return this.lastTap={screenX:n,screenY:o,arrivedAt:a,toolType:d},{type:"tap",arrivedAt:a,screenX:n,screenY:o}}evaluateSwipe(n,o,s,a){let{x:d,y:c}=n,{x:p,y:h}=o,m=p-d,f=h-c,y=z(d,c,p,h),S=Math.abs(m)>=Math.abs(f)?m>0?"right":"left":f>0?"down":"up",g=s>0?y/s*1000:0,P=A.FLING_MIN_DP_PER_S*this.densityDp,_=g>=P?"fast":"normal";return{type:"swipe",arrivedAt:a,direction:S,startX:d,startY:c,endX:p,endY:h,speed:_}}}function ke(n,o,s,{rawX2:a,rawY2:d}){let c=n.toScreenPoint(o,s),p=n.toScreenPoint(a,d);return z(c.x,c.y,p.x,p.y)}function z(n,o,s,a){return Math.sqrt((s-n)**2+(a-o)**2)}function oe(n,o){if(!n?.length&&!o?.length)return;return[...new Set([...n??[],...o??[]])]}function bt(){return{buttons:new Set,pressureCount:0,pressureSum:0,pressureMin:1/0,pressureMax:-1/0,tiltCount:0,tiltSum:0}}function Oe(n,o,s){if(o.toolType)n.toolType=o.toolType;for(let a of o.buttons??[])n.buttons.add(a);if(o.toolType==="stylus"||o.toolType==="eraser")At(n,o,s);if(o.pressure>0)n.pressureCount+=1,n.pressureSum+=o.pressure,n.pressureMin=Math.min(n.pressureMin,o.pressure),n.pressureMax=Math.max(n.pressureMax,o.pressure)}function At(n,o,s){if(s&&Be(s.x)&&Be(s.y)&&o.tiltX!==void 0&&o.tiltY!==void 0&&Number.isFinite(o.tiltX)&&Number.isFinite(o.tiltY)){let a=Ce(o.tiltX,s.x),d=Ce(o.tiltY,s.y),c=Math.cos(a)*Math.cos(d);n.tiltCount+=1,n.tiltSum+=Math.acos(se(c))}}function Ce(n,o){let s=o.resolution?1/o.resolution:Math.PI/180;return(n-(o.min+o.max)/2)*s}function Be(n){return Number.isFinite(n.min)&&Number.isFinite(n.max)&&n.max>n.min&&(n.resolution===void 0||Number.isFinite(n.resolution)&&n.resolution>=0)}function se(n){return Math.min(Math.max(n,0),1)}class le{opts;pending=[];maxSeenKernelMs=-1/0;releasePoint=-1/0;flushTimer;flushAt;windowMs;constructor(n){this.opts=n;if(this.windowMs=n.windowMs??50,!Number.isFinite(this.windowMs)||this.windowMs<0)throw RangeError("Kernel reorder window must be finite and non-negative")}push(n,o,s){let a=/^\[\s*(\d+(?:\.\d+)?)\s*\]/.exec(o),d=a?Number(a[1])*1000:NaN;if(!Number.isFinite(d)){this.opts.onLine({nodeKey:n,line:o,arrivedAt:s});return}this.maxSeenKernelMs=Math.max(this.maxSeenKernelMs,d),this.pending.push({nodeKey:n,kernelMs:d,line:o,arrivedAt:s,releaseAt:this.now()+this.windowMs}),this.pending.sort((c,p)=>c.kernelMs-p.kernelMs),this.releaseThrough(Math.max(this.releasePoint,this.maxSeenKernelMs-this.windowMs)),this.scheduleFlush()}drain(){this.cancelFlush(),this.releaseThrough(this.maxSeenKernelMs)}dropNode(n){this.pending=this.pending.filter((o)=>o.nodeKey!==n),this.scheduleFlush()}clear(){this.cancelFlush(),this.pending=[],this.maxSeenKernelMs=-1/0,this.releasePoint=-1/0}releaseThrough(n){this.releasePoint=n;while(this.pending.length>0&&this.pending[0].kernelMs<=n){let o=this.pending.shift(),{nodeKey:s,kernelMs:a,line:d,arrivedAt:c}=o;this.opts.onLine({nodeKey:s,kernelMs:a,line:d,arrivedAt:c})}}scheduleFlush(){if(this.pending.length===0){this.cancelFlush();return}let n=1/0;for(let o of this.pending)n=Math.min(n,o.releaseAt);if(this.flushAt===n)return;this.cancelFlush(),this.flushAt=n,this.flushTimer=this.opts.timer.setTimeout(()=>{this.flushTimer=void 0,this.flushAt=void 0;let o=this.now(),s=this.releasePoint;for(let a of this.pending)if(a.releaseAt<=o)s=Math.max(s,a.kernelMs);this.releaseThrough(s),this.scheduleFlush()},Math.max(0,n-this.now()))}cancelFlush(){if(this.flushTimer!==void 0)this.opts.timer.clearTimeout(this.flushTimer),this.flushTimer=void 0;this.flushAt=void 0}now(){return this.opts.timer.monotonicNow?.()??this.opts.timer.now()}}class L{handlers=new Map;buffer;constructor(n){this.buffer=new le({...n,onLine:({nodeKey:o,line:s,arrivedAt:a})=>this.handlers.get(o)?.(s,a)})}register(n,o){this.buffer.dropNode(n);let s=(a,d)=>o(a,d);return this.handlers.set(n,s),()=>{if(this.handlers.get(n)!==s)return;if(this.handlers.delete(n),this.buffer.dropNode(n),this.handlers.size===0)this.buffer.clear()}}push(n,o,s){if(this.handlers.has(n))this.buffer.push(n,o,s)}}class F{opts;children=new Set;starting=!1;generation=0;cleanups=new Set;timer;constructor(n){this.opts=n;this.timer=n.timer??i}start(n,o){if(this.children.size>0||this.starting)return;this.starting=!0;let s=++this.generation,a=this.opts.lineMerge??new L({timer:this.timer,windowMs:this.opts.kernelReorderWindowMs});this.startProcess(s,this.opts.touchNode,this.opts.scaler,{onGesture:n,onError:o,lineMerge:a});for(let{node:d,scaler:c}of this.opts.penNodes??[])this.startProcess(s,d,c,{onGesture:n,lineMerge:a,onError:(p)=>e.warn(`[GetEventReader] pen node ${d.path} stopped; finger recording continues: ${p.message}`,p)})}async startProcess(n,o,s,{onGesture:a,onError:d,lineMerge:c}){let p=new ie({singleTouch:o.kind==="pen",onHover:(T)=>{let R=T.hover,M=o.distanceRange,D=R?.[0],me=D&&"scalerAt"in s?s.scalerAt(D.arrivedAt):s;a({...T,...D?{downAt:D.arrivedAt}:{},hover:M&&R&&"toScreenPoint"in me?R.map((k)=>({...me.toScreenPoint(k.x,k.y),arrivedAt:k.arrivedAt,...k.kernelAtMs===void 0?{}:{kernelAtMs:k.kernelAtMs},distance:Math.min(1,Math.max(0,(k.distance-M.min)/(M.max-M.min)))})):void 0})}}),h=new ae(s,this.opts.density,xt(o),o.tiltAxes),m=["shell","getevent","-lt",o.path];e.debug(`[GetEventReader] Spawning: ${m.join(" ")}`);let f;try{f=await this.opts.adb.spawn(m)}catch(T){let R=T instanceof Error?T:Error(String(T));if(e.error(`[GetEventReader] spawn error: ${R.message}`),n===this.generation){if(o===this.opts.touchNode)this.starting=!1;d?.(R)}return}if(n!==this.generation){f.on("error",()=>{}),f.kill();return}if(this.children.add(f),o===this.opts.touchNode)this.starting=!1;let y="",S="",g=c.register(o.path,(T,R)=>{if(n!==this.generation)return;let M=p.feedLine(T,R);if(!M)return;if(wt(M)){let D=h.feedFrame(M);if(D)a(D)}else a(M)}),P=(T)=>{y+=T.toString();let R=y.split(`
4
+ `);y=R.pop()??"";for(let M of R){if(!M.trim()||n!==this.generation)continue;let D=this.timer.now();c.push(o.path,M,D)}},_=(T)=>{S=(S+T.toString()).slice(-4096),e.debug(`[GetEventReader] stderr: ${T.toString().trim()}`)},I=()=>{y="",f.stdout.off("data",P),f.stderr.off("data",_),f.on("error",J),f.off("error",O),f.off("exit",U),this.children.delete(f),this.cleanups.delete(I),g()},J=()=>{},O=(T)=>{I();let R=S.trim()?Error(`[GetEventReader] getevent process error: ${T.message}; stderr tail: ${S.trim()}`,{cause:T}):T;e.warn(`[GetEventReader] process error: ${R.message}`),d?.(R)},U=(T,R)=>{I();let M=Error(`[GetEventReader] getevent exited with ${R?`signal ${R}`:`code ${T}`}`+(S.trim()?`; stderr tail: ${S.trim()}`:""));e.warn(M.message),d?.(M)};this.cleanups.add(I),f.stdout.on("data",P),f.stderr.on("data",_),f.on("error",O),f.on("exit",U)}stop(){this.starting=!1,++this.generation;let n=[...this.children];for(let o of[...this.cleanups])o();for(let o of n)if(!o.killed)e.debug("[GetEventReader] Stopping getevent process"),o.kill();this.children.clear()}}function xt(n){return n.pressureMin!==void 0&&n.pressureMax!==void 0?{min:n.pressureMin,max:n.pressureMax}:void 0}function wt(n){return n!==null&&"activeSlots"in n}class ue{opts;running=!1;generation=0;pens=new Map;stopMonitor;constructor(n){this.opts=n}start(n,o){if(this.running)return;this.running=!0;let s=++this.generation,{primary:a}=this.opts;if(a.node.kind==="pen")this.pens.set(a.node.path,{controller:new AbortController,reader:a.reader});a.reader.start(n,o);for(let d of this.opts.penNodes){let c={controller:new AbortController};this.pens.set(d.path,c),this.startPen(d,c,n)}this.monitor(s,n)}startPen(n,o,s){o.reader=this.opts.createPenReader(n),o.reader.start((a)=>{if(this.pens.get(n.path)===o)s(a)},(a)=>{if(this.pens.get(n.path)!==o)return;this.removePen(n.path),e.warn(`[PenHotplugReader] pen node ${n.path} stopped; finger recording continues: ${a.message}`,a)})}async addPen(n,o){if(this.pens.has(n)||n===this.opts.primary.node.path&&this.opts.primary.node.kind!=="pen")return;let s={controller:new AbortController};this.pens.set(n,s);try{let{stdout:a}=await this.opts.adb.execute(["shell","getevent","-lp",n],{signal:s.controller.signal,timeoutMs:1000,noRetry:!0});if(this.pens.get(n)!==s)return;let d=Q(a).pen.find((c)=>c.path===n);if(d)this.startPen(d,s,o);else this.removePen(n)}catch(a){if(this.pens.get(n)!==s){e.debug(`[PenHotplugReader] discarded probe for removed node ${n}`,a);return}this.removePen(n),e.warn(`[PenHotplugReader] cannot read pen node ${n}; finger recording continues: ${r(a)}`,a)}}removePen(n){let o=this.pens.get(n);this.pens.delete(n),o?.controller.abort(),o?.reader?.stop()}async monitor(n,o){let s;try{s=await this.opts.adb.spawn(["shell","getevent","-lt"])}catch(g){if(n===this.generation)e.warn(`[PenHotplugReader] hotplug monitor failed; finger recording continues: ${r(g)}`,g);return}if(n!==this.generation){s.on("error",()=>{}),s.kill();return}let a="",d="",c=(g)=>{a+=g.toString();let P=a.split(`
5
+ `);a=P.pop()??"";for(let _ of P){let I=Z(_);if(I?.action==="add")this.addPen(I.path,o);else if(I?.action==="remove")this.removePen(I.path)}},p=(g)=>{d=(d+g.toString()).slice(-4096)},h=()=>{if(s.stdout.off("data",c),s.stderr.off("data",p),s.on("error",m),s.off("error",y),s.off("exit",S),a="",this.stopMonitor=void 0,!s.killed)s.kill()},m=()=>{},f=(g)=>{h(),e.warn(`[PenHotplugReader] hotplug monitor stopped; finger recording continues: ${g}`+(d.trim()?`; stderr tail: ${d.trim()}`:""))},y=(g)=>f(g.message),S=(g,P)=>f(P?`signal ${P}`:`code ${g}`);this.stopMonitor=h,s.stdout.on("data",c),s.stderr.on("data",p),s.on("error",y),s.on("exit",S)}stop(){this.running=!1,++this.generation,this.stopMonitor?.();for(let n of this.pens.keys())this.removePen(n);this.opts.primary.reader.stop()}}function Le({adb:n,penNode:o,timeline:s,rotation:a,display:d,caveats:c,density:p,timer:h,lineMerge:m}){let[{scaler:f,stopFollowing:y}]=Ie(s,[o],{rotation:a,display:d},{startedAt:h.now(),caveats:c}),S=new F({adb:n,touchNode:o,scaler:f,density:p,timer:h,lineMerge:m});return{start:(g,P)=>S.start(g,P),stop:()=>{S.stop(),y()}}}function Pt(n){return n?{action:"type",text:n,operation:"replace"}:{action:"clear"}}var Y=750,Et=3000,Fe="rotation/size could not be confirmed at stop; tapAt and swipeOn steps recorded after a display change may be at the wrong coordinates or direction";class j{device;gestureEmitter;a11ySource;steps=[];orderedSteps=[];latestEntry=null;pendingGestures=[];exportWarnings=new Set;bufferedInteractions=[];lastInputText=null;activeEmitter=null;unsubscribeA11y=null;activeA11y=null;stopped=!1;firstTouchTrackFailure;geometry;displaySource;unsubscribeDisplay=null;geometrySpans=new Map;finalized;get touchTrackFailure(){return this.firstTouchTrackFailure}get stepCount(){return this.steps.length}get capturedSteps(){return this.steps}get capturedExportWarnings(){return[...this.exportWarnings]}timer;constructor(n,o,s,{timer:a=i,...d}={}){this.device=n;this.gestureEmitter=o;this.a11ySource=s;this.timer=a,this.geometry=d.geometry,this.displaySource=d.displaySource}async start(){let n;if(!this.a11ySource)n=E.getInstance(this.device);let o=this.a11ySource??n;if(!await o.ensureConnected())throw Error("[DualTrackRecorder] Unable to connect to the accessibility service.");if(n)n.notifyRecordingStarted(),this.activeA11y=n;let a=this.gestureEmitter??await this.createGetEventReader();this.activeEmitter=a,a.start((d)=>this.handleGestureEvent(d),(d)=>{if(this.stopped||this.firstTouchTrackFailure)return;this.firstTouchTrackFailure={error:d,failedAt:this.timer.now()},e.warn(`[DualTrackRecorder] Touch track (getevent) failed: ${d.message}`)}),this.unsubscribeA11y=o.onInteraction((d)=>this.handleInteractionEvent(d)),this.subscribeDisplayChanges(n),e.debug("[DualTrackRecorder] Started dual-track recording")}async stop(n={}){if(n.hostOnly)this.geometry?.dispose();if(this.stopped){let s=await this.finalized??[];return this.stopResult(s)}if(this.stopped=!0,!n.hostOnly)this.activeA11y?.notifyRecordingStopped();this.activeA11y=null,this.unsubscribeA11y?.(),this.unsubscribeA11y=null,this.activeEmitter?.stop(),this.activeEmitter=null,this.flushPendingGestures(),this.finalized=(n.hostOnly?Promise.resolve(this.geometry?[Fe]:[]):this.finalizeGeometry()).finally(()=>{this.unsubscribeDisplay?.(),this.unsubscribeDisplay=null});let o=await this.finalized;return e.debug(`[DualTrackRecorder] Stopped with ${this.steps.length} steps`),this.stopResult(o)}flushPendingGestures(){for(let n of this.pendingGestures)if(!n.resolved)this.resolveGesture(n);this.pendingGestures=[]}stopResult(n){return{steps:this.steps,stepCount:this.steps.length,...this.touchTrackFailure?{touchTrackFailure:this.touchTrackFailure}:{},...n.length>0?{geometryWarnings:n}:{},...this.exportWarnings.size>0?{exportWarnings:[...this.exportWarnings]}:{}}}subscribeDisplayChanges(n){let o=this.displaySource??(n?Mt(n):void 0),s=this.geometry;if(o&&s)this.unsubscribeDisplay=o.onDisplayChange((a)=>s.handleTransition(a))}async finalizeGeometry(){let n=this.geometry;if(!n)return[];let{mismatch:o,unconfirmed:s}=await this.confirmGeometryAtStop(n),a=new Set;for(let[d,{downAt:c,upAt:p}]of this.geometrySpans){let h=n.timeline.warningsFor(c,p);if(o&&p>=n.timeline.lastKnownGoodAt)h.push(o);if(h.length>0){d.label=`Warning: ${h.join("; ")}`;for(let m of h)a.add(m)}}if(o)a.add(o);if(s)a.add(Fe);return[...a]}async confirmGeometryAtStop(n){try{return{mismatch:await l(async()=>(await n.settle(),n.verifyAtStop()),{timer:this.timer,timeoutMs:Et,label:"Confirming display geometry at stop"}),unconfirmed:!1}}catch(o){return e.warn(`[DualTrackRecorder] Could not confirm display geometry at stop: ${r(o)}`,o),{unconfirmed:!0}}}handleGestureEvent(n){if(this.stopped)return;if(n.type==="hover"){let s=Xe(n);K(this.exportWarnings,n,s),this.trackGeometrySpan(n,s),this.enqueueStep({resolved:!0,step:s??void 0});return}if(n.type==="pressButton"){this.enqueueStep({resolved:!0,step:kt(n)});return}if(n.type==="pinch"){this.enqueueStep({resolved:!0,step:Ot(n)??void 0});return}if(this.pendingGestures=this.pendingGestures.filter((s)=>!s.resolved||s.step!==void 0&&s.stepIndex===void 0||b(s.gesture)&&this.timer.now()-s.arrivedAt<=Y*2||s.gesture.type==="tap"&&n.arrivedAt-s.gesture.arrivedAt<=A.DOUBLE_TAP_MS),this.upgradeDoubleTap(n))return;let o={gesture:n,arrivedAt:this.timer.now(),resolved:!1};this.pendingGestures.push(o),this.enqueueStep(o),o.timeout=this.timer.setTimeout(()=>this.resolveGesture(o),Y)}upgradeDoubleTap(n){if(n.type!=="doubleTap"||b(n))return!1;let o=[...this.pendingGestures].reverse().find((a)=>fe(a.gesture,n)),s=o?.step;if(s&&["tapOn","tapAt"].includes(s.tool)&&s.params.action==="tap")return s.params.action="doubleTap",K(this.exportWarnings,n,s),!0;if(o&&!o.resolved){if(o.timeout)this.timer.clearTimeout(o.timeout);return o.gesture=n,o.arrivedAt=this.timer.now(),o.timeout=this.timer.setTimeout(()=>this.resolveGesture(o),Y),!0}return!1}enqueueStep(n){this.latestEntry=n,this.orderedSteps.push(n),this.flushResolvedSteps()}flushResolvedSteps(){while(this.orderedSteps[0]?.resolved){let n=this.orderedSteps.shift();if(n.step)n.stepIndex=this.steps.length,this.steps.push(n.step)}}handleInteractionEvent(n){if(this.stopped)return;if(n.type==="windowChange")return;if(n.type==="inputText"){this.handleInputText(n);return}let o={...n,receivedAt:this.timer.now()},s=this.pendingGestures.find((a)=>!a.resolved&&!b(a.gesture)&&this.isPairCandidate(a,o));if(s)this.resolveGesture(s,n);else if(!this.pendingGestures.some((a)=>a.resolved&&!b(a.gesture)&&de(a.gesture.type,n.type)&&Ye(a.gesture,n.element)))this.bufferedInteractions.push(o)}resolveGesture(n,o){if(n.resolved)return;if(n.resolved=!0,n.timeout)this.timer.clearTimeout(n.timeout);let s=this.selectInteraction(n,o),a=Gt(n.gesture,s);if(K(this.exportWarnings,n.gesture,a),n.step=a??void 0,this.trackGeometrySpan(n.gesture,a),this.flushResolvedSteps(),!a&&b(n.gesture)){We(n.gesture);return}if(!s||!V(s.element)||!a){let d=n.gesture,[c,p]=d.type==="swipe"?[d.startX,d.startY]:[d.screenX,d.screenY],h=a?`recorded ${a.tool} fallback`:"no swipe direction or missing coordinates \u2014 step skipped";e.warn(`[DualTrackRecorder] No element match for ${d.type} at (${c}, ${p}) \u2014 ${h}`)}}trackGeometrySpan(n,o){if(o&&n.downAt!==void 0&&["tapAt","swipeOn","swipeAt","dragPath","hoverAt"].includes(o.tool))this.geometrySpans.set(o,{downAt:n.downAt,upAt:n.arrivedAt})}selectInteraction(n,o){let s=this.timer.now(),a=Y*2;this.bufferedInteractions=this.bufferedInteractions.filter((h)=>s-h.receivedAt<=a);let d=this.bufferedInteractions.map((h,m)=>({event:h,index:m}));if(o)d.push({event:{...o,receivedAt:s},index:-1});let c=d.filter(({event:h})=>this.isPairCandidate(n,h));if(b(n.gesture)&&!this.isUnambiguousUnknownPair(n,c.map(({event:h})=>h)))return;let p=c.sort((h,m)=>{let f=h.event.receivedAt-n.arrivedAt,y=m.event.receivedAt-n.arrivedAt;return Number(m.event.type==="tap")-Number(h.event.type==="tap")||Number(f<0)-Number(y<0)||Math.abs(f)-Math.abs(y)})[0];if(p&&p.index>=0)this.bufferedInteractions.splice(p.index,1);return p?.event}isPairCandidate(n,o){let s=n.gesture;if(Math.abs(o.receivedAt-n.arrivedAt)>Y)return!1;if(b(s)){let a=(s.type==="tap"||s.type==="longPress")&&o.type==="scroll"&&ce(o.scrollDeltaX,o.scrollDeltaY)!==null;return Boolean((a||de(s.type,o.type,!1))&&o.element?.bounds&&V(o.element))}return de(s.type,o.type)&&Ye(s,o.element)}isUnambiguousUnknownPair(n,o){if(o.length!==1)return!1;let s=o[0];return!this.pendingGestures.some((a)=>a!==n&&(b(a.gesture)||!a.resolved)&&this.isPairCandidate(a,s))}handleInputText(n){let o=_t(n);if(n.text===void 0)return;let s=Pt(n.text);if(this.coalesceInputText(o,s))return;let a={resolved:!0,step:this.buildRecordedTextStep(s)};if(this.enqueueStep(a),o)this.lastInputText={elementKey:o,entry:a}}buildRecordedTextStep(n){return{tool:"sendKeys",params:{commands:[n]}}}coalesceInputText(n,o){let s=this.lastInputText;if(!s||!n||s.elementKey!==n||s.entry!==this.latestEntry)return!1;return this.updateCoalescedTextStep(s.entry.step,o)}updateCoalescedTextStep(n,o){let s=n?.params.commands?.[0];if(n?.tool!=="sendKeys"||s?.action!=="type"&&s?.action!=="clear")return!1;return n.params.commands=[o],!0}async createGetEventReader(){let n=v.create(this.device),{touch:o,pen:s}=await Me(n),a=o??s[0];if(!a)throw Error("[DualTrackRecorder] No multitouch input device found on this device");let d=await Lte(n),c=De(n),p=await jC(n),{rotation:h,caveats:m}=await Rt(c),f=new W({xMin:a.axisXMin,xMax:a.axisXMax,yMin:a.axisYMin,yMax:a.axisYMax},{rotation:h,display:p},this.timer.now(),m);this.geometry=new re(f,c,this.timer);let y=new L({timer:this.timer}),S=new F({adb:n,touchNode:a,scaler:f,density:d,timer:this.timer,lineMerge:y}),g=new ue({adb:n,primary:{node:a,reader:S},penNodes:o?s:s.slice(1),createPenReader:(P)=>Le({adb:n,penNode:P,timeline:f,rotation:h,display:p,caveats:m,density:d,timer:this.timer,lineMerge:y})});return Ct(g,f,this.timer)}}async function Rt(n){try{let o=await n.readRotation();if(o!==null)return{rotation:o,caveats:[]};e.warn("[DualTrackRecorder] WindowManager reported no display rotation at start")}catch(o){e.warn(`[DualTrackRecorder] Failed to read display rotation at start: ${r(o)}`,o)}return{rotation:0,caveats:[te]}}function Mt(n){return{onDisplayChange(o){let s=n.onDisplayTransition,a=(d)=>{s?.(d),o(d)};return n.onDisplayTransition=a,()=>{if(n.onDisplayTransition===a)n.onDisplayTransition=s}}}}function de(n,o,s=!0){return(n==="tap"||n==="doubleTap")&&(o==="tap"||s&&o==="stateChange")||n==="longPress"&&o==="longPress"||n==="swipe"&&(o==="scroll"||o==="swipe")}function Ye(n,o){let s=o?.bounds;if(!s)return!1;if(b(n))return!1;let a=n.screenX??n.startX,d=n.screenY??n.startY;if(typeof a!=="number"||typeof d!=="number"||!Number.isFinite(a)||!Number.isFinite(d))return!1;return It(a,d,s)}function It(n,o,s){return n>=s.left-20&&n<=s.right+20&&o>=s.top-20&&o<=s.bottom+20}function V(n){if(!n)return null;let o=n["resource-id"];if(o)return{elementId:o};let s=n.text??n["content-desc"];if(s)return{text:s};return null}function _t(n){let o=n.element;if(!o)return null;let s=o["resource-id"]??"",a=o["content-desc"]??"",d=o.class??"";if(!s&&!a&&!d)return null;return`${s}|${a}|${d}`}function ce(n,o){let s=n??0,a=o??0;if(s===0&&a===0)return null;if(Math.abs(s)>=Math.abs(a))return s>0?"left":"right";return a>0?"up":"down"}function Gt(n,o={type:"",timestamp:0}){if(n.toolType!==void 0)return Xe(n);let s=V(o.element);switch(n.type){case"tap":case"doubleTap":case"longPress":{if(n.type!=="doubleTap"&&b(n)&&o.type==="scroll")return He(n,o);if(s)return{tool:"tapOn",params:{action:n.type,...s}};return Ke(n)}case"swipe":return He(n,o);default:return null}}var Dt=0.5;function $e(n){let{startX:o,startY:s,endX:a,endY:d}=n;if(b(n)||o===void 0||s===void 0||a===void 0||d===void 0||o===a&&s===d)return null;return{from:{x:o,y:s},to:{x:a,y:d}}}function Nt({from:n,to:o}){let s=Math.abs(o.x-n.x),a=Math.abs(o.y-n.y);return Math.min(s,a)>=Math.max(s,a)*Dt}function Ue(n,o){let s={from:o.from,to:o.to},a=n.geometry?.deviceWidth,d=n.geometry?.deviceHeight;if(a&&d&&a>0&&d>0)s.from={x:fm(o.from.x,a),y:fm(o.from.y,d)},s.to={x:fm(o.to.x,a),y:fm(o.to.y,d)},s.coordinateSpace="normalized";if(n.speed==="fast")s.speed="fast";let c=C(n);if(c)s.pointer=c;return{tool:"swipeAt",params:s}}function Xe(n){if(n.toolType!=="stylus"&&n.toolType!=="eraser")return null;if(n.type==="stroke"||n.type==="hover")return ge(n);if(n.type==="swipe"){let o=$e(n);return o?Ue(n,o):null}return Ke(n)}function He(n,o){let s=V(o.element),a=b(n)?s&&ce(o.scrollDeltaX,o.scrollDeltaY):n.direction??ce(o.scrollDeltaX,o.scrollDeltaY),d=$e(n);if(d&&(!a||Nt(d)))return Ue(n,d);if(!a)return null;let c={direction:a};if(s)c.container="elementId"in s?{elementId:s.elementId}:{text:s.text};if(!b(n)&&n.speed==="fast")c.speed="fast";return{tool:"swipeOn",params:c}}function Ke(n){if(b(n)||n.screenX===void 0||n.screenY===void 0)return null;let o={x:n.screenX,y:n.screenY,action:n.type};if(n.type==="longPress"&&n.durationMs!==void 0)o.durationMs=Math.min(gg,Math.max($a,n.durationMs));let s=C(n);if(s)o.pointer=s;return{tool:"tapAt",params:o,...n.geometry?{geometry:{...n.geometry,x:n.screenX,y:n.screenY}}:{}}}function We(n){e.warn(`[DualTrackRecorder] ${n.type} has unknown axes: ${n.unknownAxes?.join(", ")} \u2014 no resolved element gesture; step skipped`)}function kt(n){return{tool:"pressButton",params:{button:n.button}}}function Ot(n){if(b(n))return We(n),null;return{tool:"pinchOn",params:{direction:n.pinchDirection,scale:n.scale}}}function Ct(n,o,s){return{start:(a,d)=>n.start((c)=>a({...c,geometry:{platform:"android",...o.geometryAt(c.downAt??s.now())}}),d),stop:()=>n.stop()}}var Bt="user-input",Lt="no_user_input_captured",je="Device gesture recordings capture input made on the device itself (touches on its touch screen or emulator window, and text changes in input fields). Taps, swipes and other gestures sent through AutoMobile tools (tapAt, tapOn, swipeOn, etc.) or adb shell input are injected and are not recorded by design; use recordToolCalls to record tool calls.";class rA extends t{reason=Lt;constructor(n){super("No recorded interactions were captured. "+je+(n?` ${n}`:""))}}var ze=1e4,x=null,N=null,G=null,Ft=16,H=new Map;function Yt(n,o){if(!n.ownerSessionUuid)return;if(H.set(n.recordingId,{owner:n.ownerSessionUuid,result:o}),H.size>Ft){let s=H.keys().next();if(!s.done)H.delete(s.value)}}function pe(n){let o=w.sessionManager();if(!o)return n;return at(n,o)??n}function uI(n,o,s=pe){let a=H.get(n);if(!a||o===void 0)return;return he(a.owner,o,s)?a.result:void 0}function he(n,o,s){if(n===void 0||o===void 0)return!1;let a=s(o);return n===o||o6(n,a)||s(n)===a}async function iN(n,o,s=pe){let a=G;if(!a||a.session.recordingId!==n||!he(a.session.ownerSessionUuid,o,s))return;return await a.promise,uI(n,o,s)}function nA(n=i){if(!x)return null;let o=n.now()-x.startedAt,s=x.recorder.stepCount;return{recordingId:x.recordingId,deviceId:x.deviceId,platform:x.platform,startedAt:new Date(x.startedAt).toISOString(),eventCount:s,durationMs:o,captureScope:Bt,...s===0?{notice:je}:{}}}function q(){return x??N?.session??G?.session??null}function NX(n,o){let s=q();if(!s||s.deviceId!==n||s.ownerSessionUuid!==void 0)return!1;return s.ownerSessionUuid=o,!0}function Z1(n,o){let s=q();return s!==null&&s.ownerSessionUuid===n&&s.deviceId===o}function oN(n,o){let s=q();return s&&Z1(n,o)?s.recordingId:void 0}var Ht=(n,o,s,{stoppedAt:a,omittedInput:d})=>{if(n.length===0)throw new rA(d);let c=new Date(o.startedAt),p=a-o.startedAt,h={name:s,description:`Recorded plan with ${n.length} interaction(s).`,steps:n,mcpVersion:gn(Nn()),metadata:{createdAt:new Date(a).toISOString(),version:"1.0.0",recording:{recordingId:o.recordingId,startedAt:c.toISOString(),stoppedAt:new Date(a).toISOString(),durationMs:p,deviceId:o.deviceId,platform:o.platform,interactionCount:n.length}}};return dh.validate(h),{plan:h,stepCount:n.length}},$t=(n)=>{if(n&&n.trim().length>0)return n.trim();return`recorded-plan-${new Date().toISOString().replace(/[:.]/g,"-")}`};function Ve(n,o,{ownerSessionUuid:s,baseSessionUuid:a}){if(n.deviceId!==o.deviceId)throw Error(`Recording already active on device ${n.deviceId} (${n.recordingId}). Stop the existing recording before starting a new one on ${o.deviceId}.`);if(!(n.ownerSessionUuid===s||he(n.ownerSessionUuid,s,a??pe)))throw new t(`A recording owned by another session is active on device ${o.deviceId}. Wait for it to stop before starting a recording.`)}async function pI(n,o=i,s=B,{recorderFactory:a=(c)=>new j(c),...d}={}){if(G)return await G.promise.catch(()=>{return}),pI(n,o,s,{recorderFactory:a,...d});let{ownerSessionUuid:c}=d;if(x)return Ve(x,n,d),e.info(`[DeviceGestureRecording] Recording already active (${x.recordingId}), returning existing session`),{recordingId:x.recordingId,startedAt:new Date(x.startedAt).toISOString(),deviceId:x.deviceId,platform:x.platform};if(N)return Ve(N.session,n,d),N.promise;if(n.platform!=="android")throw Error(`Device gesture recording is only supported on Android right now (got ${n.platform}).`);let p=s.next(),h=o.now(),m={recordingId:p,deviceId:n.deviceId,platform:n.platform,startedAt:h,timer:o,recorder:a(n),ownerSessionUuid:c},f=Promise.resolve().then(async()=>{try{return await m.recorder.start(),x=m,e.info(`[DeviceGestureRecording] Started recording ${p} on ${n.deviceId}`),{recordingId:p,startedAt:new Date(h).toISOString(),deviceId:n.deviceId,platform:n.platform}}catch(y){try{await m.recorder.stop()}catch(S){throw u(AggregateError([y,S],"Recorder startup and teardown both failed"),"Failed to start device gesture recording")}throw u(y,"Failed to start device gesture recording")}finally{if(N?.session===m)N=null}});return N={session:m,promise:f},f}function Ut(){return q()?.timer??i}async function Dy(n,o,s=Ut(),a={}){if(N)await N.promise;let d=x??G?.session??null;if(!d)throw Error("No active recording. Start a recording before stopping.");if(n&&n!==d.recordingId)throw Error(`Recording ID ${n} does not match active recording ${d.recordingId}.`);if(G?.session===d)return G.promise;x=null;let c=Wt(d,o,s,a).then((p)=>(Yt(d,p),p)).finally(()=>{if(G?.session===d)G=null});return G={session:d,promise:c},c}async function Xt(n,o,s){try{return await l(()=>n.recorder.stop(s),{timer:o,timeoutMs:ze,label:"Stopping device gesture recording",timeoutError:()=>Error(`Device gesture recording stop timed out after ${ze} ms`)})}catch(a){e.warn(`[DeviceGestureRecording] Failed to stop recording ${n.recordingId}`,a);let d=n.recorder.capturedSteps??[];if(d.length===0)throw u(a,"Failed to stop device gesture recording");return{steps:[...d],exportWarnings:[...n.recorder.capturedExportWarnings??[]],salvagedAfter:r(a)}}}function Kt(n){if(!n?.length)return;let o=`Some recorded input was left out of the plan: ${n.join("; ")}.`;return e.warn(`[DeviceGestureRecording] ${o}`),o}async function Wt(n,o,s,a){let{steps:d,touchTrackFailure:c,geometryWarnings:p,exportWarnings:h,salvagedAfter:m}=await Xt(n,s,a),f=c?`Touch track (getevent) stopped ${c.failedAt-n.startedAt} ms after recording start: ${c.error.message}. Later taps may be missing.`:void 0;if(f&&d.length===0)throw u(Error(f,{cause:c?.error}),"Failed to stop device gesture recording");if(f)e.warn(`[DeviceGestureRecording] ${f}`);let y=p?.length?`Display geometry changed or was unreadable during recording: ${p.join("; ")}. Steps labelled "Warning:" may be recorded at the wrong coordinates or direction.`:void 0;if(y)e.warn(`[DeviceGestureRecording] ${y}`);let S=Kt(h),g=m?`Stopping the recorder did not finish (${m}); the steps captured so far are returned without confirming display rotation/size, so tapAt and swipeOn steps recorded after a display change may be at the wrong coordinates or direction.`:void 0;if(g)e.warn(`[DeviceGestureRecording] ${g}`);let P=[f,y,S,g].filter(Boolean).join(" "),_=s.now(),I=$t(o),{plan:J,stepCount:O}=Ht(d,n,I,{stoppedAt:_,omittedInput:S}),U=ow(J,{indent:2,lineWidth:-1,noRefs:!0}),T=_-n.startedAt;return e.info(`[DeviceGestureRecording] Stopped recording ${n.recordingId} with ${O} steps`),{recordingId:n.recordingId,startedAt:new Date(n.startedAt).toISOString(),stoppedAt:new Date(_).toISOString(),durationMs:T,planName:I,planContent:U,stepCount:O,...P?{error:`Warning: ${P}`}:{},deviceId:n.deviceId,platform:n.platform}}
6
+ export{X1,dI,Qf,tA,lI,i6,eh,DX,OX,MX,nN,rA,uI,iN,nA,NX,Z1,oN,pI,Dy};
7
7
 
8
- //# debugId=BCC8B8D14724EC0164756E2164756E21
8
+ //# debugId=A8B07065E54EEC1164756E2164756E21
@@ -0,0 +1,4 @@
1
+ // @bun
2
+ import{i,tS,oM,Ld,qf,eo,l,e}from"./chunk-r0vp315h.js";import{h,I,pt,$e,FU}from"./chunk-5wk1t46v.js";import"./chunk-r6pvhj33.js";import"./chunk-aewdveet.js";import{BA,d_,sQ,yh,jS,Ot,A0,dQ,lQ,uQ,KS,T0,Kc,f_,h_,D0,Gc,F0,RQ,Pm,AQ,TQ,L0,y_,Yc,B0,$0,dp,U0,eV,IQ,OQ,$Q,v_,UQ}from"./chunk-8nj68t1v.js";import{w,fne,ID,sb,ab,gR,cb,Cne,Dne,qB,vk,wY,ki,Ks,Vk,GR,g$}from"./chunk-sfqe223f.js";import"./chunk-4vxeq0vd.js";import{ql}from"./chunk-w5yypt53.js";import{eY}from"./chunk-69pmjdf2.js";import"./chunk-9xgnrv5w.js";import{r}from"./chunk-2b39zyxc.js";function Q(t,o){return{refresh:()=>t.refresh({fresh:!0,requireCurrent:!0,refuseUpgradePending:!0}),isAutoMobileOwned:(n)=>t.stableIdsFor("ios").has(n)||(o()?.getAssignedDevices().has(n)??!1)}}sQ(Q(BA(i),()=>w.sessionManager()));Cne({androidColdBootAdmitter:()=>yh().android,iosBootInstrumentation:()=>{let t=yh();return d_({timer:i,history:t.iosBootHistory,gate:t.ios})},assertBootCapacityAvailable:(t,o)=>jS(t,o)});var Ue=500;function U(t){return t.success&&!t.error?void 0:{code:t.errorCode??"restore_failed",reason:t.error??"Device refused saved prototype restore"}}async function Ve(t,o){let n=t.assets.filter((a)=>a.bytes===void 0||a.mimeType===void 0);if(n.length>0)return{code:"asset_unavailable",reason:`Missing mirrored assets: ${n.map((a)=>a.id).join(", ")}`};for(let a of t.assets){if(a.bytes===void 0||a.mimeType===void 0)continue;let s=U(await o.putAsset({id:a.id,mimeType:a.mimeType,bytes:a.bytes}));if(s)return s}return U(await o.save({spec:t.spec,label:t.label,icon:t.icon}))}async function We(t,o){try{return await Ve(t,o)}catch(n){return e.warn(`[PROTOTYPE] Restore failed for ${t.id}`,n),{code:"restore_failed",reason:r(n)}}}async function X(t,o,n){let a={restored:[],skipped:[],failed:[]};try{let s=await o.list(t);if(s.length===0)return a;let d=[];try{let u=await n.list();if(!U(u))d=(u.savedPrototypes??[]).filter((f)=>!f.hostOnly);else e.warn(`[PROTOTYPE] Device saved prototype list failed for ${t}`,u)}catch(u){e.warn(`[PROTOTYPE] Device saved prototype list failed for ${t}`,u)}let c=wY(s,d),p=new Set(c.map((u)=>u.id));a.skipped=s.filter((u)=>!p.has(u.id)).map((u)=>u.id);for(let u of c){let f=await We(u,n);if(f)a.failed.push({id:u.id,...f}),e.warn(`[PROTOTYPE] Restore failed for ${u.id}`,f);else a.restored.push(u.id)}}catch(s){e.warn(`[PROTOTYPE] Saved prototype restore failed for ${t}`,s),a.failed.push({id:"*",code:"restore_failed",reason:r(s)})}return a}class V{device;timer;resolveClient;timeoutMs;ready;constructor(t,o=i,n=async()=>{let{AndroidCtrlProxyClient:s}=await import("./chunk-59dx6qaf.js");return s.getExistingInstance(t.deviceId)??s.getInstance(t)},a=20000){this.device=t;this.timer=o;this.resolveClient=n;this.timeoutMs=a}async client(){if(this.ready)return{client:this.ready};let t=!1;try{let o=await l(async()=>{let n=await this.resolveClient();while(!t){let a=await n.ensureConnected().catch((s)=>(e.warn("[PROTOTYPE] Restore connection attempt failed",s),!1));if(t)break;if(a)return(await n.getSupportedCommands())?.includes(ql)?{client:n}:{failure:this.unsupported()};await this.timer.sleep(Ue)}return{failure:this.unavailable()}},{timer:this.timer,timeoutMs:this.timeoutMs,label:"Saved prototype restore connection",onTimeout:()=>{t=!0}});if(o.client)this.ready=o.client;return o}catch(o){return e.warn("[PROTOTYPE] Restore connection unavailable",o),{failure:this.unavailable(r(o))}}}unavailable(t=`Saved prototype restore connection timed out after ${this.timeoutMs}ms`){return{success:!1,errorCode:"service_unavailable",error:t}}unsupported(){return{success:!1,errorCode:"device_unsupported",error:`Device does not advertise ${ql}`}}async list(){let{client:t,failure:o}=await this.client();return t?t.requestListSavedPrototypes():o}async putAsset(t){let{client:o,failure:n}=await this.client();return o?o.requestPutPrototypeAsset(t):n}async save(t){let{client:o,failure:n}=await this.client();return o?o.requestSavePrototype(t):n}}Dne({createForeignForwardEvidence:(t)=>qB(t),savedPrototypes:()=>{let t=vk();return{list:(o)=>t.list(o),restore:(o,n)=>X(o.deviceId,t,new V(o,n))}}});function Z(t){let o=t.findIndex((a)=>["--cli","--daemon","--boot-device","--ios-network-filter","--ios-templates"].includes(a)),n=o>=0?t.slice(0,o):t;return n.includes("--help")||n.includes("-h")}function ee(t,o){if(!t)return!1;let[n]=o;return n===void 0||n==="help"||n==="--help"||n==="-h"}async function te(t){if(Z(t)){let{runCliCommand:s}=await import("./chunk-25mfpthk.js");await s(["help"]),process.exit(0)}let o=t.indexOf("--boot-device");if(o>=0){let{runBootDeviceCommand:s}=await import("./chunk-k4ftd40d.js");Ot.endPhase("moduleImports"),await s(t.slice(o+1)),process.exit(0)}let n=t.indexOf("--ios-templates");if(n>=0){let{runIosTemplatesCommand:s}=await import("./chunk-ctmfshjc.js");Ot.endPhase("moduleImports"),process.exit(await s(t.slice(n+1)))}let a=t.indexOf("--ios-network-filter");if(a>=0){let{runIosNetworkFilterCommand:s}=await import("./chunk-99a6tbvd.js");Ot.endPhase("moduleImports"),process.exit(await s(t.slice(a+1)))}}async function oe(t){let{createStdioServerTransport:o}=await import("./chunk-bnyw27ja.js"),{OutputGatedTransport:n}=await import("./chunk-3dntffy9.js"),{createMcpServer:a,registerMcpTools:s}=await import("./chunk-f84z32cb.js"),{createDaemonMcpProxy:d,createProxyMcpServer:c}=await import("./chunk-p22s97qy.js"),{logger:p,LogLevel:u}=await import("./chunk-xghbxha4.js");t(p);let{runCliCommand:f,cliCommandSkipsServerBootstrap:S}=await import("./chunk-25mfpthk.js"),{runDaemonCommand:b}=await import("./chunk-dnjnh9p6.js"),{startDaemon:y}=await import("./chunk-rb7aa5gr.js"),{guardDatabaseStartup:A}=await import("./chunk-6yhm9een.js"),{DefaultDatabaseInitializer:M}=await import("./chunk-bn7jx7a2.js"),R=await import("./chunk-c25a84zb.js"),m=await import("./chunk-f3m6pdnx.js"),g=await import("./chunk-k2948b8d.js"),P=await import("./chunk-2gzd6wbd.js"),C=await import("./chunk-5sdf9y92.js"),x=await import("./chunk-cnvy4a64.js"),{FeatureFlagService:E}=await import("./chunk-pnd4mrxy.js"),{serverConfig:D}=await import("./chunk-ke3wn14v.js"),{AndroidCtrlProxyManager:L}=await import("./chunk-6vwrbkre.js"),{IosCtrlProxyBuilder:F}=await import("./chunk-fpczgf0z.js"),{IOSCtrlProxyManager:_}=await import("./chunk-w4s2vfpj.js"),{cleanupDaemonChildProcesses:N}=await import("./chunk-gppgy7pa.js"),{stopManagedAdbServer:B}=await import("./chunk-6wk0yrab.js");return Ot.endPhase("moduleImports"),{createStdioServerTransport:o,OutputGatedTransport:n,createMcpServer:a,registerMcpTools:s,createDaemonMcpProxy:d,createProxyMcpServer:c,logger:p,LogLevel:u,runCliCommand:f,cliCommandSkipsServerBootstrap:S,runDaemonCommand:b,startDaemon:y,guardDatabaseStartup:A,DefaultDatabaseInitializer:M,startVideoRecordingSocketServer:R.startVideoRecordingSocketServer,stopVideoRecordingSocketServer:R.stopVideoRecordingSocketServer,startDeviceGestureRecordingSocketServer:m.startDeviceGestureRecordingSocketServer,stopDeviceGestureRecordingSocketServer:m.stopDeviceGestureRecordingSocketServer,startDeviceSnapshotSocketServer:g.startDeviceSnapshotSocketServer,stopDeviceSnapshotSocketServer:g.stopDeviceSnapshotSocketServer,startAppearanceSocketServer:P.startAppearanceSocketServer,createDirectModeAppearanceDeviceSource:P.createDirectModeAppearanceDeviceSource,stopAppearanceSocketServer:P.stopAppearanceSocketServer,startWebRtcStreamSocketServer:C.startWebRtcStreamSocketServer,stopWebRtcStreamSocketServer:C.stopWebRtcStreamSocketServer,stopAppearanceSyncScheduler:x.stopAppearanceSyncScheduler,FeatureFlagService:E,serverConfig:D,AndroidCtrlProxyManager:L,IosCtrlProxyBuilder:F,IOSCtrlProxyManager:_,cleanupDaemonChildProcesses:N,stopManagedAdbServer:B}}import{readFileSync as Ge}from"fs";import{parseArgs as He}from"util";var Ke=Object.fromEntries(["cli","daemon-mode","no-proxy","direct","no-daemon","debug-perf","ui-perf-debug","debug","no-ui-perf-mode","mem-perf-audit","accessibility-audit","predictive","predictive-ui","raw-element-search","embedded-sdk","network-mockable","dismiss-keyboard-after-input","tool-call-recording","no-navigation-screenshots","no-waitfor-polling-overhead","no-include-not-important-views","no-report-view-ids","no-retrieve-interactive-windows","no-occlusion","strict-port","headless"].map((t)=>[t,{type:"boolean"}])),G={...Ke,"daemon-socket-path":{type:"string"},"enable-tool":{type:"string",multiple:!0},"disable-tool":{type:"string",multiple:!0}},qe=[...Object.entries(G).filter(([,t])=>t.type==="string").map(([t])=>`--${t}`),Yc,f_,h_];function ze(t,o){return t||$e(h.HEADLESS,o)}function re(t,o,n=process.env,a=(s)=>Ge(s,"utf8")){let{values:s}=He({args:t,options:G,allowPositionals:!0,strict:!1}),d=(J)=>{let O=s[J];if(O===void 0)return!1;let j=O===!0?!0:Ks(String(O));if(j===void 0)o.warn(`Invalid value for --${J}: ${String(O)}; expected true or false`);return j===!0},{enabledTools:c,disabledTools:p}=Ye(s,n),u=d("cli"),f=d("daemon-mode"),S=d("no-proxy")||d("direct"),b=d("no-daemon"),{daemonRequested:y,daemonCommand:A,daemonArgs:M}=ct(t),R=d("debug-perf")||d("ui-perf-debug")||$e(h.DEBUG_PERF,n),m=d("debug")||$e(h.DEBUG,n),g=d("strict-port"),P=ze(d("headless"),n),C=!d("no-ui-perf-mode"),x=d("mem-perf-audit"),E=d("accessibility-audit"),D=d("predictive")||d("predictive-ui"),L=d("raw-element-search"),F=g$(t),_=d("embedded-sdk"),N=d("network-mockable"),B=d("dismiss-keyboard-after-input"),Ae=$0(t,process.env),Re=B0(t),Ce=d("tool-call-recording"),Me=!d("no-navigation-screenshots"),xe=d("no-waitfor-polling-overhead"),Oe=d("no-include-not-important-views"),ke=d("no-report-view-ids"),Te=d("no-retrieve-interactive-windows"),Ee=d("no-occlusion"),De=U0(t,process.env),Ie=D0(t,process.env,Ld()),Le=dt(n,o),Y=Je(o),{videoRecordingDefaults:Fe}=Y,_e=t.indexOf("--cli"),Ne=u?t.slice(_e+1):[],v=je(t,o,Y,Le),Be=AQ({flagValue:v.sessionConfigValue,envValue:u||f||y?void 0:n[RQ],readFile:a,hasInitialSessionUuid:v.initialSessionUuid!==void 0,noProxy:S});return{cliMode:u,cliArgs:Ne,invalidInvocation:v.invalidInvocation,daemonPort:v.daemonPort,daemonHost:v.daemonHost,initialSessionUuid:v.initialSessionUuid,livenessOwnerToken:v.livenessOwnerToken,sessionConfig:Be,debugPerf:R,debug:m,strictPort:g,headless:P,uiPerfMode:C,memPerfAuditMode:x,a11yAuditMode:E,a11yLevel:v.a11yLevel,a11yFailureMode:v.a11yFailureMode,a11yMinSeverity:v.a11yMinSeverity,a11yUseBaseline:v.a11yUseBaseline,predictiveUi:D,rawElementSearch:L,planExecutionLockScope:v.planExecutionLockScope,planExecutionLockScopeExplicit:v.planExecutionLockScopeExplicit,videoRecordingDefaults:Fe,runnerReadinessTimeoutMs:v.runnerReadinessTimeoutMs,daemonMode:f,daemonRequested:y,daemonCommand:A,daemonArgs:M,skipCtrlProxyDownload:F,embeddedSdk:_,networkMockable:N,dismissKeyboardAfterInput:B,eventAllMarkers:Ae,eventAllMarkersCliOverride:Re,toolCallRecording:Ce,navigationScreenshots:Me,noWaitForPollingOverhead:xe,noProxy:S,noDaemon:b,noA11yIncludeNotImportantViews:Oe,noA11yReportViewIds:ke,noA11yRetrieveInteractiveWindows:Te,noOcclusion:Ee,outputReduction:De,toolOutputsDir:Ie,enabledTools:c,disabledTools:p}}function Ye(t,o){let n=Object.keys(o).find((m)=>FU(m));if(n)throw Error(`${n} is retired; use AUTOMOBILE_ENABLED_TOOLS or AUTOMOBILE_DISABLED_TOOLS.`);let a=(m)=>{let g=t[m];if(Array.isArray(g))return g.filter((P)=>typeof P==="string");return typeof g==="string"?[g]:[]},s=Array.from(new Set(a("enable-tool"))),d=Array.from(new Set(a("disable-tool"))),c=new Set(d),p=s.find((m)=>c.has(m));if(p)throw Error(`Tool '${p}' cannot be both enabled and disabled by CLI defaults.`);let u=(m)=>m?.split(",").map((g)=>g.trim()).filter(Boolean)??[],f=u(I(h.ENABLED_TOOLS,o)),S=u(I(h.DISABLED_TOOLS,o)),b=new Set(S),y=f.find((m)=>b.has(m));if(y)throw Error(`Tool '${y}' cannot be both enabled and disabled by environment defaults.`);let A=new Map([...f.map((m)=>[m,!0]),...S.map((m)=>[m,!1]),...s.map((m)=>[m,!0]),...d.map((m)=>[m,!1])]),M=Array.from(A).filter(([,m])=>m).map(([m])=>m),R=Array.from(A).filter(([,m])=>!m).map(([m])=>m);return{enabledTools:M,disabledTools:R}}function Je(t){let o={},n=(d,c)=>{if(!d)return;if(!new Set(["low","medium","high"]).has(d)){t.warn(`Invalid video quality preset (${c}): ${d}`);return}o.qualityPreset=d},a=(d,c)=>{if(!d)return;if(d!=="mp4"){t.warn(`Invalid video format (${c}): ${d}`);return}o.format=d};n(I(h.VIDEO_QUALITY_PRESET),"env");let s=[[I(h.VIDEO_TARGET_BITRATE_KBPS),"video target bitrate",!1,"targetBitrateKbps"],[I(h.VIDEO_MAX_THROUGHPUT_MBPS),"video max throughput",!0,"maxThroughputMbps"],[I(h.VIDEO_FPS),"video fps",!1,"fps"],[I(h.VIDEO_MAX_ARCHIVE_MB),"video max archive size",!0,"maxArchiveSizeMb"]];for(let[d,c,p,u]of s){let f=y_(d,c,p,t);if(f!==void 0)o[u]=f}return a(I(h.VIDEO_FORMAT),"env"),{videoRecordingDefaults:o,applyQualityPreset:n,applyFormat:a}}function je(t,o,n,a){let s={a11yUseBaseline:!1,planExecutionLockScope:"session",planExecutionLockScopeExplicit:!1,runnerReadinessTimeoutMs:a},d=t.indexOf("--daemon");for(let c=0;c<t.length;c++){if(["--cli","--boot-device","--"].includes(t[c]))break;let{flag:p,inlineValue:u}=ki(t[c]),f=u!==void 0&&Qe.has(p),S=f?[p,u]:t,b=f?0:c;if(p==="--a11y-use-baseline"&&u!==void 0){let A=Ks(u);if(A===void 0)o.warn(`Invalid value for ${p}: ${u}; expected true or false`);else s.a11yUseBaseline=A;continue}let y=Xe(S,b,o,{options:s,video:n});if(y!==void 0){c=f?c:y;continue}c=Ze(t,c,d,s)}return s}var Qe=new Set(["--port","--host","--initial-session-uuid","--liveness-owner-token","--a11y-level","--a11y-failure-mode","--a11y-min-severity","--plan-execution-lock-scope",sb,"--video-quality","--video-quality-preset","--video-target-bitrate-kbps","--video-max-throughput-mbps","--video-fps","--video-format","--video-archive-size-mb"]);function Xe(t,o,n,a){let{options:s,video:d}=a,c=ot(t,o,n,s);if(c!==void 0)return Math.max(c,W(t,o));return it(t,o,n,s)??st(t,o,n,s)??at(t,o,n,d)}function W(t,o){return t[o+1]!==void 0&&!t[o+1].startsWith("--")?o+1:o}function Ze(t,o,n,a){if(qe.includes(t[o]))return W(t,o);if(n>=0&&o>=n)return o;let s=et(t[o]);if(s)a.invalidInvocation??=s;else if(t[o]!==""&&!t[o].startsWith("-"))a.invalidInvocation??=`Unexpected argument: ${t[o]}; did you mean --cli ${t[o]}?`;return tt(t[o])?W(t,o):o}function et(t){if(t.startsWith("--cli="))return"Invalid CLI invocation. Use --cli <tool> instead of --cli=<tool>.";if(t.startsWith("--daemon=")||t.startsWith("--boot-device=")){let[o,...n]=t.split("=");return`Invalid invocation. Use ${o==="--boot-device"?"--boot-device --platform <android|ios>":`${o} ${n.join("=")}`} instead of ${t}.`}return}function tt(t){return t.startsWith("-")&&!t.includes("=")&&!Object.hasOwn(G,t.replace(/^-+/,""))&&!dp.some((o)=>o.cli===t||o.disableCli===t)}function ot(t,o,n,a){let s=t[o];if(s==="--port"){let d=t[o+1],c=L0(d,n);if(c!==void 0)a.daemonPort=c,o++}else if(s==="--host"){let d=t[o+1];if(d&&!d.startsWith("--"))a.daemonHost=d,o++;else n.warn(`Invalid host: ${d}`)}else return rt(t,o,n,a);return o}function rt(t,o,n,a){let s=t[o],d=t[o+1]?.trim(),c=d!==void 0&&d.length>0&&!d.startsWith("--");if(s==="--initial-session-uuid"){if(!c)return n.warn(`Invalid initial session UUID: ${t[o+1]}`),o;return a.initialSessionUuid=t[o+1],o+1}let p=nt(t,o,a);if(p!==void 0)return p;if(s==="--liveness-owner-token"){if(!c)return n.warn("--liveness-owner-token requires a non-empty value"),o;return a.livenessOwnerToken=d,o+1}return}function nt(t,o,n){let a=t[o];if(a===F0){let s=t[o+1]?.trim();if(!s||s.startsWith("--")&&!s.startsWith("{"))throw new Pm(`${F0} requires inline JSON or a file path`);return n.sessionConfigValue=s,o+1}if(a.startsWith(`${F0}=`))return n.sessionConfigValue=a.slice(F0.length+1),o;return}function it(t,o,n,a){let s=t[o];if(s==="--a11y-level")a.a11yLevel=t[++o];else if(s==="--a11y-failure-mode")a.a11yFailureMode=t[++o];else if(s==="--a11y-min-severity")a.a11yMinSeverity=t[++o];else if(s==="--a11y-use-baseline")a.a11yUseBaseline=!0;else return;return o}function st(t,o,n,a){let s=t[o];if(s==="--plan-execution-lock-scope"){let d=t[++o];if(d==="global"||d==="session")a.planExecutionLockScope=d,a.planExecutionLockScopeExplicit=!0;else n.warn(`Invalid plan execution lock scope: ${d}. Using default: ${a.planExecutionLockScope}`)}else if(s===sb){let d=t[++o],c=cb(d);if(c!==void 0)a.runnerReadinessTimeoutMs=c;else n.warn(`Invalid runner readiness timeout: ${d}; expected an integer from ${ab} to ${gR}`)}else return;return o}function at(t,o,n,a){let s=t[o],{videoRecordingDefaults:d,applyQualityPreset:c,applyFormat:p}=a;if(s==="--video-quality"||s==="--video-quality-preset")c(t[++o],"cli");else if(s==="--video-target-bitrate-kbps")k(d,t[++o],n,{label:"video target bitrate",allowFloat:!1,key:"targetBitrateKbps"});else if(s==="--video-max-throughput-mbps")k(d,t[++o],n,{label:"video max throughput",allowFloat:!0,key:"maxThroughputMbps"});else if(s==="--video-fps")k(d,t[++o],n,{label:"video fps",allowFloat:!1,key:"fps"});else if(s==="--video-format")p(t[++o],"cli");else if(s==="--video-archive-size-mb")k(d,t[++o],n,{label:"video max archive size",allowFloat:!0,key:"maxArchiveSizeMb"});else return;return o}function k(t,o,n,a){let{label:s,allowFloat:d,key:c}=a,p=y_(o,s,d,n);if(p!==void 0)t[c]=p}function dt(t,o){let n=t[ID]??t.AUTO_MOBILE_RUNNER_READINESS_TIMEOUT_MS,a=cb(n),s=a;if(n!==void 0&&a===void 0)o.warn(`Invalid ${ID}: ${n}; expected an integer from ${ab} to ${gR}`);return s}function ct(t){let o=t.indexOf("--daemon"),n=o>=0,a=o>=0?t[o+1]||void 0:void 0,s=o>=0?t.slice(o+2):[];return{daemonRequested:n,daemonCommand:a,daemonArgs:s}}function ne(t,o){o.terminate(t.exitCode)}async function H(t){try{await t.closeAfterFlush()}catch(o){t.error(`Daemon command completed successfully, but logger teardown failed; exiting 0: ${r(o)}`),await t.flush()}}async function K(t,o){await H(t),o.exit(0)}var lt=new Set(["start","restart","restart-admitted","restart-acceptance-session"]);function ie(t){return!lt.has(t)}var se=5000;function de(t){let o=t.timer??i,n=t.logger??e;if(q("Android CtrlProxy prefetch cleanup",t.startAndroidSweep,o,n),q("native helper cleanup",t.startNativeHelperSweep,o,n),t.platform==="darwin")q("iOS CtrlProxy runner cleanup",t.startIosReap,o,n)}function q(t,o,n,a){let s;try{s=o()}catch(c){a.warn(`[STARTUP_MAINTENANCE] ${t} failed: ${ae(c)}`);return}let d=n.setTimeout(()=>{a.warn(`[STARTUP_MAINTENANCE] ${t} exceeded ${se}ms; continuing startup`)},se);d.unref?.(),s.catch((c)=>{a.warn(`[STARTUP_MAINTENANCE] ${t} failed: ${ae(c)}`)}).finally(()=>{n.clearTimeout(d)})}function ae(t){return r(t)}function ce(t,o,n){if(!n)de({platform:process.platform,startAndroidSweep:()=>t.AndroidCtrlProxyManager.sweepStalePrefetchDirsOnStartup(),startIosReap:()=>t.IOSCtrlProxyManager.startOrphanRunnerReapOnStartup(),startNativeHelperSweep:async()=>{await fne()}});ut(t,o,n),mt(t,o,n),ft(t)}function ut(t,o,n){if(n)Ot.recordPhase("androidCtrlProxyPrefetch",0);else if(o)t.logger.info(`CtrlProxy downloads disabled (${Vk} or ${GR})`),Ot.recordPhase("androidCtrlProxyPrefetch",0);else Ot.startPhase("androidCtrlProxyPrefetch"),t.AndroidCtrlProxyManager.prefetchApk().then(()=>{Ot.endPhase("androidCtrlProxyPrefetch")})}function mt(t,o,n){if(process.platform!=="darwin"||n)return;if(o){t.logger.info(`CtrlProxy iOS prefetch disabled (${Vk} or ${GR})`),Ot.recordPhase("iosCtrlProxyPrefetch",0);return}Ot.startPhase("iosCtrlProxyPrefetch"),t.IosCtrlProxyBuilder.prefetchBuild().then(()=>{Ot.endPhase("iosCtrlProxyPrefetch")})}function ft(t){if($Q(),process.platform==="darwin"&&pt(h.WEBRTC_WHIP_ENDPOINT)&&!I(h.IOS_SCREEN_CAPTURE_HELPER))Gc.getInstance().ensure().catch((o)=>{t.logger.warn(`[SCREEN_CAPTURE_HELPER] Background prefetch failed: ${r(o)}`)})}function le(t){let{eventAllMarkers:o,eventAllMarkersCliOverride:n}=t;return o.length>0||n?{eventAllMarkers:o,eventAllMarkersCliOverride:n}:{}}function ue(t,o){let{videoRecordingDefaults:n,runnerReadinessTimeoutMs:a,daemonHost:s}=t;return{port:t.daemonPort,...s!==void 0?{host:s}:{},strictPort:t.strictPort,debug:t.debug,debugPerf:t.debugPerf,planExecutionLockScope:t.planExecutionLockScope,...a!==void 0?{runnerReadinessTimeoutMs:a}:{},videoQualityPreset:n.qualityPreset,videoTargetBitrateKbps:n.targetBitrateKbps,videoMaxThroughputMbps:n.maxThroughputMbps,videoFps:n.fps,videoFormat:n.format,videoMaxArchiveSizeMb:n.maxArchiveSizeMb,toolOutputsDir:t.toolOutputsDir,networkMockable:t.networkMockable,embeddedSdk:t.embeddedSdk,enabledTools:t.enabledTools,disabledTools:t.disabledTools,dismissKeyboardAfterInput:t.dismissKeyboardAfterInput,...o,noUiPerfMode:!t.uiPerfMode,memPerfAudit:t.memPerfAuditMode,accessibilityAudit:t.a11yAuditMode,accessibilityLevel:t.a11yLevel,accessibilityFailureMode:t.a11yFailureMode,accessibilityMinSeverity:t.a11yMinSeverity,accessibilityUseBaseline:t.a11yUseBaseline,predictiveUi:t.predictiveUi,rawElementSearch:t.rawElementSearch,skipCtrlProxyDownload:t.skipCtrlProxyDownload,toolCallRecording:t.toolCallRecording,noNavigationScreenshots:!t.navigationScreenshots,noWaitForPollingOverhead:t.noWaitForPollingOverhead,noA11yIncludeNotImportantViews:t.noA11yIncludeNotImportantViews,noA11yReportViewIds:t.noA11yReportViewIds,noA11yRetrieveInteractiveWindows:t.noA11yRetrieveInteractiveWindows,noOcclusion:t.noOcclusion,...t.outputReduction}}function pe(t,o,n){return{...vt(t),...St(t),...n,...yt(t),...gt(t,o),...t.outputReduction,toolResultsNoStructuredContent:t.outputReduction.toolResultsNoStructuredContent?!0:void 0}}function vt(t){let{daemonPort:o,daemonHost:n,runnerReadinessTimeoutMs:a}=t;return{...o!==void 0?{port:o}:{},...n!==void 0?{host:n}:{},...t.strictPort?{strictPort:!0}:{},...t.debug?{debug:!0}:{},...t.debugPerf?{debugPerf:!0}:{},...t.planExecutionLockScopeExplicit?{planExecutionLockScope:t.planExecutionLockScope}:{},...a!==void 0?{runnerReadinessTimeoutMs:a}:{},...t.toolCallRecording?{toolCallRecording:!0}:{}}}function St(t){let o=t.videoRecordingDefaults;return{videoQualityPreset:o.qualityPreset,videoTargetBitrateKbps:o.targetBitrateKbps,videoMaxThroughputMbps:o.maxThroughputMbps,videoFps:o.fps,videoFormat:o.format,videoMaxArchiveSizeMb:o.maxArchiveSizeMb,toolOutputsDir:t.toolOutputsDir,...t.networkMockable?{networkMockable:!0}:{},...t.embeddedSdk?{embeddedSdk:!0}:{},...t.enabledTools.length>0?{enabledTools:t.enabledTools}:{},...t.disabledTools.length>0?{disabledTools:t.disabledTools}:{},...t.dismissKeyboardAfterInput?{dismissKeyboardAfterInput:!0}:{}}}function yt(t){return{...!t.uiPerfMode?{noUiPerfMode:!0}:{},...!t.navigationScreenshots?{noNavigationScreenshots:!0}:{},...t.noWaitForPollingOverhead?{noWaitForPollingOverhead:!0}:{},...t.noA11yIncludeNotImportantViews?{noA11yIncludeNotImportantViews:!0}:{},...t.noA11yReportViewIds?{noA11yReportViewIds:!0}:{},...t.noA11yRetrieveInteractiveWindows?{noA11yRetrieveInteractiveWindows:!0}:{},...t.noOcclusion?{noOcclusion:!0}:{}}}function gt(t,o){return{...t.memPerfAuditMode?{memPerfAudit:!0}:{},...t.a11yAuditMode?{accessibilityAudit:!0}:{},...o?{accessibilityLevel:o.level,accessibilityFailureMode:o.failureMode,accessibilityMinSeverity:o.minSeverity,accessibilityUseBaseline:o.useBaseline}:{},...t.predictiveUi?{predictiveUi:!0}:{},...t.rawElementSearch?{rawElementSearch:!0}:{},...t.skipCtrlProxyDownload?{skipCtrlProxyDownload:!0}:{}}}function me(t){return dp.filter((o)=>o.field!=="actionsCompactMetadata"&&t[o.field]===!0).map((o)=>({key:o.featureFlagKey,label:o.label}))}function fe(t){if(!t.a11yAuditMode)return null;return{level:t.a11yLevel||"AA",failureMode:t.a11yFailureMode||"report",minSeverity:t.a11yMinSeverity||(t.a11yFailureMode==="strict"?"error":"warning"),useBaseline:t.a11yUseBaseline}}function Pt(t,o){return[["debug",t.debug,"--debug"],["debug-perf",t.debugPerf,"--debug-perf/--ui-perf-debug"],["ui-perf-mode",t.uiPerfMode,"--ui-perf-mode"],["mem-perf-audit",t.memPerfAuditMode,"--mem-perf-audit"],["accessibility-audit",t.a11yAuditMode,"--accessibility-audit",o],["predictive-ui",t.predictiveUi,"--predictive/--predictive-ui"],["raw-element-search",t.rawElementSearch,"--raw-element-search"],["tool-call-recording",t.toolCallRecording,"--tool-call-recording"],...me(t.outputReduction).map(({key:n,label:a})=>[n,!0,a,void 0])]}function ve(t,o,n){let{logger:a,serverConfig:s}=o,d=o.FeatureFlagService.getInstance(),c=Pt(t,n);return async()=>{await d.initialize();for(let[p,u,f,S]of c){if(!u)continue;await d.setFlag(p,u,S),a.info(`Feature flag ${u?"enabled":"disabled"} (${f})`)}if(s.setActionsCompactMetadataEnabled(eV(t.outputReduction.actionsCompactMetadata,d.isEnabled("actions-compact-metadata"))),!t.navigationScreenshots)await d.setFlag("navigation-screenshots",!1),a.info("Navigation screenshots disabled (--no-navigation-screenshots)")}}async function Se(t,o,n){await Ot.runPhase("databasePreflight",async()=>{if(t.daemonMode){await o.guardDatabaseStartup(async()=>{await new o.DefaultDatabaseInitializer().initialize(),await n()});return}let{runDirectModeStartup:a}=await import("./chunk-6pg7bqck.js");await a({noProxy:t.noProxy,assertDbOwnership:async()=>{let{assertDirectModeDbOwnership:s,createDefaultDirectModeGuardDeps:d}=await import("./chunk-jzqrv78s.js");s(d())},applyFeatureFlagStartup:n})})}function ye(t,o){let{serverConfig:n,logger:a,LogLevel:s}=o;if(t.debug)a.setLogLevel(s.DEBUG);if(n.setPlanExecutionLockScope(t.planExecutionLockScope),t.runnerReadinessTimeoutMs!==void 0)n.setRunnerReadinessTimeoutMs(t.runnerReadinessTimeoutMs);n.setActionsCompactMetadataEnabled(eV(t.outputReduction.actionsCompactMetadata,n.isActionsCompactMetadataEnabled())),n.setVideoRecordingDefaults(t.videoRecordingDefaults),n.setToolOutputsDir(t.toolOutputsDir),n.setSkipCtrlProxyDownload(t.skipCtrlProxyDownload),n.setEmbeddedSdkEnabled(t.embeddedSdk),n.setNetworkMockableEnabled(t.networkMockable),n.setDismissKeyboardAfterInputEnabled(t.dismissKeyboardAfterInput),n.setEventAllMarkers(t.eventAllMarkers)}function ge(t,o){let n=[[!t.uiPerfMode,"UI perf mode disabled (--no-ui-perf-mode): skipping selection-state visual capture on taps and UI perf auditing"],[t.embeddedSdk,"Embedded SDK tools enabled (--embedded-sdk)"],[t.dismissKeyboardAfterInput,"Dismiss keyboard after internal text input enabled (--dismiss-keyboard-after-input)"],[t.noA11yIncludeNotImportantViews,"Accessibility includeNotImportantViews disabled (--no-include-not-important-views)"],[t.noA11yReportViewIds,"Accessibility reportViewIds disabled (--no-report-view-ids)"],[t.noA11yRetrieveInteractiveWindows,"Accessibility retrieveInteractiveWindows disabled (--no-retrieve-interactive-windows)"],[t.noOcclusion,"Observe occlusion pass disabled (--no-occlusion)"],[t.headless,"Headless prototype mode: prototype calls run on the virtual device (--headless)"]];for(let[a,s]of n)if(a)o.info(s);bt(t.eventAllMarkers,o)}function bt(t,o){if(t.length>0){o.info(`Internal text-input eventAll auto-promotion markers configured (--event-all-markers): ${JSON.stringify(t)}`);return}if(process.argv.slice(2).some((a)=>a===Yc||a.startsWith(`${Yc}=`)))o.warn(`${Yc} was provided but resolved to no markers; internal text-input eventAll auto-promotion stays disabled`)}async function Pe(t,o,n,a){let{logger:s}=o,d=!t.noProxy,c=d?void 0:Kc.createInstance();if(n.directModeActive=!d,d)s.info("Starting MCP server in proxy mode (connecting to daemon)");else s.info("Starting MCP server in direct mode (--no-proxy flag)"),await wt(o,c);let p=new o.OutputGatedTransport(o.createStdioServerTransport()),u=await ht(p),f=d&&t.sessionConfig?new(await import("./chunk-5s645vr4.js")).EarlyStartTransport(p):void 0;await f?.startEarly();let{server:S,proxyToClaimInitialSession:b}=await At(t,o,n,{launch:a,useProxyMode:d,deviceReadiness:c});try{s.info("Connecting MCP server to stdio transport"),Ot.startPhase("serverListening"),u.value=!0,await S.connect(f??p),Ot.endPhase("serverListening"),s.info("MCP server connected to stdio transport"),b?.claimInitialSession(),s.info(`AutoMobile MCP server running on stdio (${d?"proxy":"direct"} mode)`),Ot.emit("mcp-server",{transport:"stdio",mode:d?"proxy":"direct"})}catch(y){throw s.error("MCP server connect failed:",y),y}}async function wt(t,o){await t.startVideoRecordingSocketServer(),await t.startDeviceGestureRecordingSocketServer(o),await t.startDeviceSnapshotSocketServer(),await t.startAppearanceSocketServer(t.createDirectModeAppearanceDeviceSource(()=>{let n=o.getExplicitDevicePin();return n?[n]:[]})),await t.startWebRtcStreamSocketServer()}async function ht(t){let{MAX_CALLER_MCP_REQUEST_TIMEOUT_MS:o}=await import("./chunk-gp6vb5gf.js"),n={value:!1};return dQ(process.stdin,()=>n.value?t.answerReceivedThenStop("stdin closed"):t.stopSending("stdin closed"),o),lQ(process.stdout,()=>t.stopSending("stdout closed or write failed")),n}async function At(t,o,n,{launch:a,useProxyMode:s,deviceReadiness:d}){try{if(!s)return{server:o.createMcpServer({debug:t.debug,deviceReadiness:d}),proxyToClaimInitialSession:void 0};let{getDefaultSessionHeartbeatTimeoutMs:c}=await import("./chunk-zs6dqm35.js"),p=o.createDaemonMcpProxy({autoStartDaemon:!t.noDaemon,lifecycleNamespaceEnv:process.env,daemonOptions:a.daemonStartupOptions,initialSessionUuid:t.initialSessionUuid,livenessOwnerToken:t.livenessOwnerToken,heartbeatTimeoutMs:c()});n.stdioProxy=p;let u=t.sessionConfig?await Rt(p,t.sessionConfig,{launchParentPid:a.launchParentPid,ownerGenerationToken:a.ownerGenerationToken,modules:o}):void 0,f=o.createProxyMcpServer({proxy:p,...u?{session:u}:{}});return{server:f.server,proxyToClaimInitialSession:f.proxy}}catch(c){throw o.logger.error("Failed to create MCP server:",c),c}}async function Rt(t,o,{launchParentPid:n,ownerGenerationToken:a,modules:s}){let d=await Ct(n,o.executionOwnerPid,a);t.setExecutionOwnerLossProbe(()=>d.check()!==void 0);let c=await t.acquireBrokerSession(o);return s.logger.info(`[SessionBroker] Acquisition ${c.outcome}`+(c.failure?` (${c.failure.code})`:"")),c}async function Ct(t,o,n){let[{ExecutionOwnerWatch:a},{isProcessRunning:s},{defaultTimer:d},{defaultLockOwnerGenerationProbe:c},{processGenerationReadIsCheap:p}]=await Promise.all([import("./chunk-d6rb08ga.js"),import("./chunk-0jyfg947.js"),import("./chunk-wnmqt1dc.js"),import("./chunk-knyzw9md.js"),import("./chunk-1scenrk7.js")]),u=new a({launchParentPid:t,ownerPid:o,ownerGenerationToken:n,generationCheckEvery:p()?1:void 0,onOwnerLost:()=>uQ("execution-owner-lost")},{isProcessRunning:(f)=>s(f),currentParentPid:()=>process.ppid},d,c);return u.start(),u}async function be(t,o,n){let{logger:a}=t,s=re(process.argv.slice(2),a);if(s.invalidInvocation){console.error(s.invalidInvocation),process.exit(1);return}if(s.headless)IQ(process.env);let d=await Mt(s);if(await xt(s,t))return;if(await kt(s,t))return;Tt(s,t);let c=fe(s);if(await Se(s,t,ve(s,t,c)),s.noWaitForPollingOverhead)t.serverConfig.setWaitForPollingOverheadEnabled(!1),a.info("WaitFor polling overhead disabled (--no-waitfor-polling-overhead): back stack skipped during observe waitFor polling");ge(s,a);let p=le(s);if(s.daemonMode){await t.startDaemon(ue(s,p));return}if(s.daemonCommand){await Et(s,s.daemonCommand,t);return}let u=pe(s,c,p);if(s.cliMode){await we(s,t,u);return}await Pe(s,t,o,{launchParentPid:n,ownerGenerationToken:d,daemonStartupOptions:u})}async function Mt(t){let{sessionConfig:o}=t;if(t.cliMode||t.daemonMode||t.daemonRequested||o?.executionOwnerPid===void 0)return;let[{isProcessRunning:n},{defaultLockOwnerGenerationProbe:a}]=await Promise.all([import("./chunk-0jyfg947.js"),import("./chunk-knyzw9md.js")]);return TQ(o,{isProcessRunning:(s)=>n(s),probe:a})}async function xt(t,o){let{daemonCommand:n,daemonArgs:a}=t;if(t.daemonRequested&&n===void 0){let{printUnknownDaemonCommand:s}=await import("./chunk-47n9m2de.js");return s(void 0),!0}if(n&&ie(n))return await o.runDaemonCommand(n,a,{namespaceEnv:process.env}),await K(o.logger,process),!0;return!1}async function kt(t,o){if(!t.cliMode||!o.cliCommandSkipsServerBootstrap(t.cliArgs))return!1;return await we(t,o,void 0),!0}function Tt(t,o){OQ(t.enabledTools,t.disabledTools),o.registerMcpTools(t.daemonMode),ye(t,o),ce(o,t.skipCtrlProxyDownload,ee(t.cliMode,t.cliArgs))}async function Et(t,o,n){let{enabledTools:a,disabledTools:s}=t,d=a.length>0||I(h.ENABLED_TOOLS)!==void 0,c=s.length>0||I(h.DISABLED_TOOLS)!==void 0,p=d||c;await n.runDaemonCommand(o,t.daemonArgs,{namespaceEnv:process.env,...p?{startupToolDefaults:{...d?{enabledTools:a}:{},...c?{disabledTools:s}:{}}}:{}}),await K(n.logger,process)}async function we(t,o,n){let{logger:a}=o;a.info("Running in CLI mode");let s=await o.runCliCommand(t.cliArgs,n);if(await H(a),s){ne(s,{terminate:(d)=>process.exit(d)});return}process.exit(process.exitCode??0)}function he(t,o){let{logger:n}=t,a=!1;KS(async(s)=>{a=!1,n.info(`Received ${s} signal, shutting down`),await v_(UQ({directModeActive:()=>o.directModeActive,cleanupChildProcesses:()=>t.cleanupDaemonChildProcesses(),stopManagedAdbServer:()=>t.stopManagedAdbServer(),stopVideoRecordingSocketServer:()=>t.stopVideoRecordingSocketServer(),stopDeviceGestureRecordingSocketServer:()=>t.stopDeviceGestureRecordingSocketServer(),stopDeviceSnapshotSocketServer:()=>t.stopDeviceSnapshotSocketServer(),stopAppearanceSocketServer:()=>t.stopAppearanceSocketServer(),stopWebRtcStreamSocketServer:()=>t.stopWebRtcStreamSocketServer(),stopAppearanceSyncScheduler:()=>t.stopAppearanceSyncScheduler(),cleanupPrefetchedApk:()=>t.AndroidCtrlProxyManager.cleanupPrefetchedApk(),closeStdioProxy:()=>o.stdioProxy?.close({executionOwnerLost:s==="execution-owner-lost"}),drainDatabaseWrites:async(d)=>{let{getDbWriteBarrier:c}=await import("./chunk-7n5fz68h.js");if(!await c().drain(d))n.warn(`Timed out after ${d}ms draining in-flight DB writes; closing database anyway`)},settleMigrations:async(d)=>{let{awaitInFlightMigrations:c}=await import("./chunk-kny2xemh.js");if(!await c(d))n.warn(`Timed out after ${d}ms awaiting in-flight startup migration; closing database anyway`)},closeDatabase:async()=>{let{closeDatabase:d}=await import("./chunk-kny2xemh.js");await d({forShutdown:!0})},refusedDatabaseAccessCount:async()=>{let{refusedDatabaseAccessCountAfterShutdownClose:d}=await import("./chunk-kny2xemh.js");return d()},closeLogger:()=>n.closeAfterFlush(),warn:(d)=>n.warn(d)}),(d,c)=>{a=!0,n.warn(d,c)},{timer:i})},async()=>(await n.closeAfterFlush(),a?{exitCode:1}:void 0))}eY();process.env[tS]??=oM();var T;function z(t,o){let n=o instanceof Error?o.stack??o.message:String(o);if(T){if(T.error(`${t}: ${n}`),qf()==="file")eo(t,n)}else eo(t,n)}A0();T0((t)=>{if(t.type==="uncaughtException"){z("Uncaught exception",t.error);return}z("Unhandled rejection",t.reason)});async function Dt(){let t=process.ppid;Ot.mark("processEntry"),Ot.startPhase("moduleImports"),await te(process.argv.slice(2));let o=await oe((a)=>{T=a}),n={stdioProxy:void 0,directModeActive:!1};he(o,n);try{await be(o,n,t)}catch(a){throw o.logger.error("Error initializing server:",a),a}}function Tr(){Dt().catch(async(t)=>{z("Fatal error in main()",t),await T?.closeAfterFlush();let{resolveDaemonStartupExitCode:o}=await import("./chunk-6yhm9een.js");process.exit(o(t))})}export{Tr as runServerEntry};
3
+
4
+ //# debugId=976EF21065310B5B64756E2164756E21