@kaeawc/auto-mobile 0.0.91 → 0.0.92

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (267) hide show
  1. package/dist/build-info.json +12 -12
  2. package/dist/schemas/README.md +16 -0
  3. package/dist/schemas/prototype-icon-names.json +302 -0
  4. package/dist/src/chunk-09442h7v.js +4 -0
  5. package/dist/src/chunk-0dfnyfkh.js +5 -0
  6. package/dist/src/chunk-0e4gm1kj.js +5 -0
  7. package/dist/src/chunk-0eb8576f.js +4 -0
  8. package/dist/src/chunk-0rjm4nx7.js +5 -0
  9. package/dist/src/chunk-0w1spptt.js +6 -0
  10. package/dist/src/chunk-1zmh2eak.js +4 -0
  11. package/dist/src/chunk-28k63ha3.js +5 -0
  12. package/dist/src/chunk-2d4wmp8b.js +4 -0
  13. package/dist/src/chunk-2e6s75qv.js +78 -0
  14. package/dist/src/chunk-2v7tw1nj.js +5 -0
  15. package/dist/src/chunk-32jpxz2y.js +323 -0
  16. package/dist/src/chunk-34zxqcmq.js +5 -0
  17. package/dist/src/chunk-3jmvqygr.js +238 -0
  18. package/dist/src/chunk-3swvfhqt.js +5 -0
  19. package/dist/src/chunk-44bt78m9.js +5 -0
  20. package/dist/src/chunk-488vt2bp.js +4 -0
  21. package/dist/src/chunk-4fgdhcwx.js +5 -0
  22. package/dist/src/chunk-4jp2se4w.js +4 -0
  23. package/dist/src/chunk-4pfftt07.js +5 -0
  24. package/dist/src/chunk-4vhr9e4t.js +4 -0
  25. package/dist/src/chunk-4xd6zs3y.js +15 -0
  26. package/dist/src/chunk-51567pg8.js +4 -0
  27. package/dist/src/chunk-5agqsfev.js +4 -0
  28. package/dist/src/chunk-5d706gmr.js +4 -0
  29. package/dist/src/chunk-5kd4rqk7.js +5 -0
  30. package/dist/src/chunk-5s645vr4.js +4 -0
  31. package/dist/src/chunk-61t538bm.js +4 -0
  32. package/dist/src/chunk-6d3mmqxt.js +54 -0
  33. package/dist/src/chunk-6hyt398x.js +5 -0
  34. package/dist/src/chunk-6mnr8kpm.js +4 -0
  35. package/dist/src/chunk-6pg7bqck.js +4 -0
  36. package/dist/src/chunk-79q5xsdc.js +42 -0
  37. package/dist/src/chunk-7bdgand3.js +4 -0
  38. package/dist/src/chunk-84cp9dw5.js +4 -0
  39. package/dist/src/chunk-86f2h5ww.js +5 -0
  40. package/dist/src/chunk-8cghfzb2.js +19 -0
  41. package/dist/src/chunk-8en08r7q.js +5 -0
  42. package/dist/src/chunk-950qcq1e.js +10 -0
  43. package/dist/src/chunk-9rkfyt6q.js +5 -0
  44. package/dist/src/chunk-9tf2p9y9.js +5 -0
  45. package/dist/src/chunk-9y5bcy28.js +6 -0
  46. package/dist/src/chunk-a2sc4jm0.js +5 -0
  47. package/dist/src/chunk-a4k9rt7z.js +5 -0
  48. package/dist/src/chunk-aa5ng3d1.js +4 -0
  49. package/dist/src/chunk-ajsrz473.js +5 -0
  50. package/dist/src/chunk-b3h0a6ca.js +4 -0
  51. package/dist/src/chunk-b4cxdzwy.js +20 -0
  52. package/dist/src/chunk-b6a737qt.js +4 -0
  53. package/dist/src/chunk-bn64x5z5.js +5 -0
  54. package/dist/src/chunk-bvh649za.js +12 -0
  55. package/dist/src/chunk-c9nk1r78.js +5 -0
  56. package/dist/src/chunk-c9tyfg4j.js +26 -0
  57. package/dist/src/chunk-cfsdfqnm.js +4 -0
  58. package/dist/src/chunk-cxyf04jc.js +7 -0
  59. package/dist/src/chunk-d57432wq.js +4 -0
  60. package/dist/src/chunk-da08tx5v.js +4 -0
  61. package/dist/src/chunk-eka89q3k.js +4 -0
  62. package/dist/src/chunk-f2tc08m2.js +4 -0
  63. package/dist/src/chunk-f8tnk179.js +5 -0
  64. package/dist/src/chunk-f9s1kkhx.js +5 -0
  65. package/dist/src/chunk-fbp8a4rx.js +4 -0
  66. package/dist/src/chunk-fd2z0sze.js +4 -0
  67. package/dist/src/chunk-fk927f4q.js +54 -0
  68. package/dist/src/chunk-fxmr3a0f.js +4 -0
  69. package/dist/src/chunk-gaqwhd44.js +4 -0
  70. package/dist/src/chunk-ggtd5x5a.js +5 -0
  71. package/dist/src/chunk-gndcfrm7.js +4 -0
  72. package/dist/src/chunk-h3n4adc6.js +310 -0
  73. package/dist/src/chunk-h5pjbb83.js +4 -0
  74. package/dist/src/chunk-hgnnh302.js +4 -0
  75. package/dist/src/chunk-hmke8nhx.js +5 -0
  76. package/dist/src/chunk-j2bx12hn.js +4 -0
  77. package/dist/src/chunk-j70y1a2g.js +4 -0
  78. package/dist/src/chunk-jdqvcq0a.js +5 -0
  79. package/dist/src/chunk-jhnbfj19.js +55 -0
  80. package/dist/src/chunk-js1jpyxp.js +6 -0
  81. package/dist/src/chunk-kbjq0qvb.js +4 -0
  82. package/dist/src/chunk-kfwx57xd.js +4 -0
  83. package/dist/src/chunk-km0dy5vc.js +71 -0
  84. package/dist/src/chunk-kzwctna2.js +4 -0
  85. package/dist/src/chunk-m9ehyehy.js +4 -0
  86. package/dist/src/chunk-mct91p1f.js +4 -0
  87. package/dist/src/chunk-mf9spd4g.js +5 -0
  88. package/dist/src/chunk-mgrcansb.js +4 -0
  89. package/dist/src/chunk-mqc1d0eb.js +6 -0
  90. package/dist/src/chunk-n1zmpk0z.js +4 -0
  91. package/dist/src/chunk-ncyjf63g.js +4 -0
  92. package/dist/src/chunk-nr64d21q.js +973 -0
  93. package/dist/src/chunk-nwm2pq5v.js +168 -0
  94. package/dist/src/chunk-pm06b05d.js +9 -0
  95. package/dist/src/chunk-q50s00ry.js +4 -0
  96. package/dist/src/chunk-qv2918jt.js +4 -0
  97. package/dist/src/chunk-qwye1958.js +14 -0
  98. package/dist/src/chunk-r0f1q783.js +5 -0
  99. package/dist/src/chunk-r14wwk37.js +18 -0
  100. package/dist/src/chunk-r20pe1nv.js +5 -0
  101. package/dist/src/chunk-r8z9pfve.js +5 -0
  102. package/dist/src/chunk-rdpgkjf6.js +4 -0
  103. package/dist/src/chunk-rkr0dks9.js +5 -0
  104. package/dist/src/chunk-rn84t3sf.js +11 -0
  105. package/dist/src/chunk-s123kn7n.js +4 -0
  106. package/dist/src/chunk-s1zq65ny.js +4 -0
  107. package/dist/src/chunk-s73qn3fx.js +4 -0
  108. package/dist/src/chunk-sjn0nj4p.js +5 -0
  109. package/dist/src/chunk-sns0c35v.js +7 -0
  110. package/dist/src/chunk-stfzjr9y.js +8 -0
  111. package/dist/src/chunk-sz1a7p43.js +4 -0
  112. package/dist/src/chunk-t4dr5c8v.js +8 -0
  113. package/dist/src/chunk-tc8k9c1j.js +4 -0
  114. package/dist/src/chunk-teznhase.js +4 -0
  115. package/dist/src/chunk-ty9xgmz4.js +4 -0
  116. package/dist/src/chunk-tyazf3sk.js +145 -0
  117. package/dist/src/chunk-v6npjrjm.js +5 -0
  118. package/dist/src/chunk-v90es00d.js +4 -0
  119. package/dist/src/chunk-vbvtzkwz.js +5 -0
  120. package/dist/src/chunk-vefd8qee.js +8 -0
  121. package/dist/src/chunk-vs9r72ta.js +17 -0
  122. package/dist/src/chunk-w2mwa0jk.js +4 -0
  123. package/dist/src/chunk-w7zsh13a.js +9 -0
  124. package/dist/src/chunk-w88k0bgr.js +4 -0
  125. package/dist/src/chunk-wry6skrm.js +4 -0
  126. package/dist/src/chunk-wzdt0enk.js +4 -0
  127. package/dist/src/chunk-xhhv854c.js +4 -0
  128. package/dist/src/chunk-y58270hd.js +4 -0
  129. package/dist/src/chunk-yk0hmbex.js +4 -0
  130. package/dist/src/chunk-ympy4fdz.js +28 -0
  131. package/dist/src/chunk-yw436axy.js +4 -0
  132. package/dist/src/chunk-z04jrpjy.js +5 -0
  133. package/dist/src/chunk-z2xznczw.js +4 -0
  134. package/dist/src/chunk-z4xnrgps.js +4 -0
  135. package/dist/src/chunk-z7csyszv.js +4 -0
  136. package/dist/src/chunk-z8t0v07j.js +11 -0
  137. package/dist/src/chunk-z916af47.js +228 -0
  138. package/dist/src/chunk-zcr8he8q.js +5 -0
  139. package/dist/src/chunk-zd9vmkzn.js +9 -0
  140. package/dist/src/chunk-zg67wjkh.js +5 -0
  141. package/dist/src/chunk-zj939v0h.js +5 -0
  142. package/dist/src/chunk-zkdjwtc1.js +4 -0
  143. package/dist/src/chunk-zkv5kzt6.js +4 -0
  144. package/dist/src/daemon/processEntry.js +4 -0
  145. package/dist/src/index.js +4 -2843
  146. package/dist/src/runtime/bunRuntimeGuard.js +4 -0
  147. package/dist/src/utils/workers/iosBundleExtractWorker.js +2 -3
  148. package/package.json +5 -5
  149. package/schemas/README.md +16 -0
  150. package/schemas/prototype-icon-names.json +302 -0
  151. package/node_modules/@borewit/text-codec/README.md +0 -87
  152. package/node_modules/@jimp/diff/node_modules/pixelmatch/README.md +0 -110
  153. package/node_modules/@jimp/diff/node_modules/pixelmatch/node_modules/pngjs/README.md +0 -433
  154. package/node_modules/@jimp/file-ops/dist/browser/index.js +0 -8
  155. package/node_modules/@jimp/js-png/README.md +0 -35
  156. package/node_modules/@jimp/js-png/src/__image_snapshots__/index-node-test-ts-png-should-use-png-options-1-snap.png +0 -0
  157. package/node_modules/@jimp/js-png/src/output.png +0 -0
  158. package/node_modules/@jimp/js-png/vitest.config.browser.mjs +0 -3
  159. package/node_modules/@jimp/plugin-resize/README.md +0 -12
  160. package/node_modules/@jimp/plugin-resize/vitest.config.browser.mjs +0 -3
  161. package/node_modules/@tokenizer/inflate/README.md +0 -114
  162. package/node_modules/@tokenizer/token/README.md +0 -19
  163. package/node_modules/await-to-js/README.md +0 -82
  164. package/node_modules/debug/README.md +0 -481
  165. package/node_modules/exif-parser/README.md +0 -83
  166. package/node_modules/file-type/readme.md +0 -667
  167. package/node_modules/ieee754/README.md +0 -51
  168. package/node_modules/mime/README.md +0 -178
  169. package/node_modules/ms/readme.md +0 -59
  170. package/node_modules/parse-bmfont-xml/README.md +0 -74
  171. package/node_modules/parse-bmfont-xml/lib/browser.js +0 -85
  172. package/node_modules/parse-bmfont-xml/node_modules/xml2js/README.md +0 -507
  173. package/node_modules/pngjs/README.md +0 -287
  174. package/node_modules/sax/README.md +0 -228
  175. package/node_modules/strtok3/README.md +0 -795
  176. package/node_modules/tinycolor2/README.md +0 -492
  177. package/node_modules/tinycolor2/cjs/test.js +0 -2191
  178. package/node_modules/tinycolor2/cjs/test_template.js +0 -26
  179. package/node_modules/tinycolor2/deno_asserts@0.168.0.mjs +0 -807
  180. package/node_modules/tinycolor2/esm/test.js +0 -2189
  181. package/node_modules/tinycolor2/esm/test_template.js +0 -24
  182. package/node_modules/tinycolor2/tinycolor.js +0 -1191
  183. package/node_modules/token-types/README.md +0 -160
  184. package/node_modules/uint8array-extras/readme.md +0 -318
  185. package/node_modules/xml-parse-from-string/README.md +0 -35
  186. package/node_modules/xmlbuilder/README.md +0 -86
  187. package/node_modules/zod/README.md +0 -208
  188. package/node_modules/zod/v4/locales/ar.d.cts +0 -4
  189. package/node_modules/zod/v4/locales/ar.d.ts +0 -4
  190. package/node_modules/zod/v4/locales/az.d.cts +0 -4
  191. package/node_modules/zod/v4/locales/az.d.ts +0 -4
  192. package/node_modules/zod/v4/locales/be.d.cts +0 -4
  193. package/node_modules/zod/v4/locales/be.d.ts +0 -4
  194. package/node_modules/zod/v4/locales/ca.d.cts +0 -4
  195. package/node_modules/zod/v4/locales/ca.d.ts +0 -4
  196. package/node_modules/zod/v4/locales/cs.d.cts +0 -4
  197. package/node_modules/zod/v4/locales/cs.d.ts +0 -4
  198. package/node_modules/zod/v4/locales/de.d.cts +0 -4
  199. package/node_modules/zod/v4/locales/de.d.ts +0 -4
  200. package/node_modules/zod/v4/locales/en.d.cts +0 -5
  201. package/node_modules/zod/v4/locales/en.d.ts +0 -5
  202. package/node_modules/zod/v4/locales/eo.d.cts +0 -5
  203. package/node_modules/zod/v4/locales/eo.d.ts +0 -5
  204. package/node_modules/zod/v4/locales/es.d.cts +0 -4
  205. package/node_modules/zod/v4/locales/es.d.ts +0 -4
  206. package/node_modules/zod/v4/locales/fa.d.cts +0 -4
  207. package/node_modules/zod/v4/locales/fa.d.ts +0 -4
  208. package/node_modules/zod/v4/locales/fi.d.cts +0 -4
  209. package/node_modules/zod/v4/locales/fi.d.ts +0 -4
  210. package/node_modules/zod/v4/locales/fr-CA.d.cts +0 -4
  211. package/node_modules/zod/v4/locales/fr-CA.d.ts +0 -4
  212. package/node_modules/zod/v4/locales/fr.d.cts +0 -4
  213. package/node_modules/zod/v4/locales/fr.d.ts +0 -4
  214. package/node_modules/zod/v4/locales/he.d.cts +0 -4
  215. package/node_modules/zod/v4/locales/he.d.ts +0 -4
  216. package/node_modules/zod/v4/locales/hu.d.cts +0 -4
  217. package/node_modules/zod/v4/locales/hu.d.ts +0 -4
  218. package/node_modules/zod/v4/locales/id.d.cts +0 -4
  219. package/node_modules/zod/v4/locales/id.d.ts +0 -4
  220. package/node_modules/zod/v4/locales/index.d.cts +0 -39
  221. package/node_modules/zod/v4/locales/index.d.ts +0 -39
  222. package/node_modules/zod/v4/locales/it.d.cts +0 -4
  223. package/node_modules/zod/v4/locales/it.d.ts +0 -4
  224. package/node_modules/zod/v4/locales/ja.d.cts +0 -4
  225. package/node_modules/zod/v4/locales/ja.d.ts +0 -4
  226. package/node_modules/zod/v4/locales/kh.d.cts +0 -4
  227. package/node_modules/zod/v4/locales/kh.d.ts +0 -4
  228. package/node_modules/zod/v4/locales/ko.d.cts +0 -4
  229. package/node_modules/zod/v4/locales/ko.d.ts +0 -4
  230. package/node_modules/zod/v4/locales/mk.d.cts +0 -4
  231. package/node_modules/zod/v4/locales/mk.d.ts +0 -4
  232. package/node_modules/zod/v4/locales/ms.d.cts +0 -4
  233. package/node_modules/zod/v4/locales/ms.d.ts +0 -4
  234. package/node_modules/zod/v4/locales/nl.d.cts +0 -4
  235. package/node_modules/zod/v4/locales/nl.d.ts +0 -4
  236. package/node_modules/zod/v4/locales/no.d.cts +0 -4
  237. package/node_modules/zod/v4/locales/no.d.ts +0 -4
  238. package/node_modules/zod/v4/locales/ota.d.cts +0 -4
  239. package/node_modules/zod/v4/locales/ota.d.ts +0 -4
  240. package/node_modules/zod/v4/locales/pl.d.cts +0 -4
  241. package/node_modules/zod/v4/locales/pl.d.ts +0 -4
  242. package/node_modules/zod/v4/locales/ps.d.cts +0 -4
  243. package/node_modules/zod/v4/locales/ps.d.ts +0 -4
  244. package/node_modules/zod/v4/locales/pt.d.cts +0 -4
  245. package/node_modules/zod/v4/locales/pt.d.ts +0 -4
  246. package/node_modules/zod/v4/locales/ru.d.cts +0 -4
  247. package/node_modules/zod/v4/locales/ru.d.ts +0 -4
  248. package/node_modules/zod/v4/locales/sl.d.cts +0 -4
  249. package/node_modules/zod/v4/locales/sl.d.ts +0 -4
  250. package/node_modules/zod/v4/locales/sv.d.cts +0 -4
  251. package/node_modules/zod/v4/locales/sv.d.ts +0 -4
  252. package/node_modules/zod/v4/locales/ta.d.cts +0 -4
  253. package/node_modules/zod/v4/locales/ta.d.ts +0 -4
  254. package/node_modules/zod/v4/locales/th.d.cts +0 -4
  255. package/node_modules/zod/v4/locales/th.d.ts +0 -4
  256. package/node_modules/zod/v4/locales/tr.d.cts +0 -5
  257. package/node_modules/zod/v4/locales/tr.d.ts +0 -5
  258. package/node_modules/zod/v4/locales/ua.d.cts +0 -4
  259. package/node_modules/zod/v4/locales/ua.d.ts +0 -4
  260. package/node_modules/zod/v4/locales/ur.d.cts +0 -4
  261. package/node_modules/zod/v4/locales/ur.d.ts +0 -4
  262. package/node_modules/zod/v4/locales/vi.d.cts +0 -4
  263. package/node_modules/zod/v4/locales/vi.d.ts +0 -4
  264. package/node_modules/zod/v4/locales/zh-CN.d.cts +0 -4
  265. package/node_modules/zod/v4/locales/zh-CN.d.ts +0 -4
  266. package/node_modules/zod/v4/locales/zh-TW.d.cts +0 -4
  267. package/node_modules/zod/v4/locales/zh-TW.d.ts +0 -4
@@ -0,0 +1,9 @@
1
+ // @bun
2
+ import{i,qk,ioe,Se,Ft,l,e}from"./chunk-z8t0v07j.js";import{sr,Yd,OF,mV,fV,MF,K4,NF,vo}from"./chunk-6d3mmqxt.js";import{Ji,Cr,Y,Qr,Un,ti,o,R,xv,Cv,VT,cp,Ot,mr,_e,ir,Br,Jv,bD,_,k,Bs}from"./chunk-h3n4adc6.js";import{L}from"./chunk-32jpxz2y.js";import{OR,MR}from"./chunk-79q5xsdc.js";import{x4,tQ,rQ,nQ,iQ,yh,qS,VS,Gy}from"./chunk-0e4gm1kj.js";import{zd,De}from"./chunk-4fgdhcwx.js";import{ba,gh,Ni,ts}from"./chunk-bn64x5z5.js";import{Lo,TV,aC,dc,X4,Ra,Pa,kh,iT,Aa,GS,Z4,Q4,Eh,Ih,fn,YS,JS,XS,rv,OQ}from"./chunk-sns0c35v.js";import{r,t,u,yt}from"./chunk-9rkfyt6q.js";class X{dependencies;constructor(n){this.dependencies=n}async resolveState(n,s){o(n);let{talkBack:a,unconfirmed:d}=await R(gh(this.dependencies.accessibilityDetector,this.dependencies.target.device.deviceId,this.dependencies.target.adb,this.dependencies.featureFlags),n);if(o(n),d)s?.([ba]);return a===!0}async dispatchTap(n,s,a,{signal:d,context:c}){let p={assertCurrent:()=>{o(d),c.assertCurrent()}},m=this.dependencies.talkBackDriverFactory.createDriver(this.dependencies.target.device),h={requestTraversalOrder:m.requestTraversalOrder.bind(m),requestCurrentFocus:m.requestCurrentFocus.bind(m),requestAction:m.requestAction.bind(m),requestNodeAction:m.requestNodeAction.bind(m),supportsNodeActionSelectors:m.supportsNodeActionSelectors.bind(m),requestTapCoordinates:async(y)=>{let{x:b,y:T,duration:v=10,onDispatch:g}=y;p.assertCurrent();let S=()=>{c.onDispatched?.(),g?.()},A=this.dependencies.useContextualFocusTap?await this.requestContextualTalkBackFocus({x:b,y:T},v,a,{signal:d,fence:p,onDispatch:S}):await m.requestTapCoordinates({x:b,y:T,duration:v,onDispatch:S});if(A.success)c.onTapDelivered();return o(d),{...A,totalTimeMs:0}},requestDoubleTapCoordinates:async(y,b,T)=>{p.assertCurrent();let v=await m.requestDoubleTapCoordinates(y,b,()=>{c.onDispatched?.(),T?.()});if(v.success)c.onTapDelivered(),c.onTapDelivered();return o(d),v}},f=await R(n.action==="longPress"?this.dependencies.talkBackStrategy.executeCoordinateFallback({x:s.x,y:s.y},"longPress",GS(n,"android"),{driver:h,fenceOptions:{displayFence:p}}):this.dependencies.talkBackStrategy.executePreciseTap(s.x,s.y,h,p),d);if(c.onActivationWarnings?.(f.warnings),!f.success)throw new t(`TalkBack coordinate tap failed: ${f.error??"activation was not confirmed"}${f.focusCompleted?" Focus touch was delivered; activation failed. Do not retry automatically.":""}`);o(d)}async requestContextualTalkBackFocus(n,s,a,d){let{signal:c,fence:p,onDispatch:m}=d,h=!1;try{let f=await this.dependencies.androidClient.requestTapCoordinates({x:n.x,y:n.y,duration:s,timeoutMs:Jv(s),frameContext:a,onDispatch:()=>{h=!0},signal:c,beforeSend:p.assertCurrent});if(h&&!Aa(f.error))m();return f}catch(f){if(h)throw m(),fn(r(f));throw u(f,"TalkBack focus tap failed before dispatch")}}}class J{dependencies;constructor(n){this.dependencies=n}async dispatchAndroidTaps(n,s,a,d){let{transitionRevision:c}=d,p=await this.dispatchAndroidTapWithOneFreshRetry(n,s,a,d);if(!d.talkBackEnabled)await this.dispatchSecondAndroidTap(n,s,c,{...d,firstTap:p})}async dispatchAndroidTapWithOneFreshRetry(n,s,a,d){let{signal:c,transitionRevision:p,perf:m}=d,h=a.viewHierarchy?.frameContext,f=!1,y=!1,b=()=>{f=!0,d.onTapDelivered()};try{if(d.talkBackEnabled)return await this.dependencies.androidTalkBack.dispatchTap(n,s,h,{signal:c,context:{assertCurrent:()=>this.dependencies.host.assertDisplayRevisionCurrent(p),onTapDelivered:b,onDispatched:()=>{y=!0},onActivationWarnings:d.onActivationWarnings}}),{doubleTapDelivered:!1,startedAt:this.dependencies.timer.now()};return await this.dispatchAndroidFirstTap(n,s,h,{signal:c,context:{assertCurrent:()=>this.dependencies.host.assertDisplayRevisionCurrent(p),onTapDelivered:d.onTapDelivered}})}catch(T){o(c);let v=u(T,"Failed to dispatch Android coordinate tap");if(f||y||h===void 0||!Aa(v.message))throw v;o(c);let g=await this.dependencies.host.observeScreen.execute({freshness:this.dependencies.host.retryFreshness(n),signal:c,perf:m});this.dependencies.host.assertDisplayRevisionCurrent(p),this.dependencies.host.assertSnapshotCurrent(n,g);let S=this.dependencies.host.resolveFreshFrameRetry(n,s,a,g);if(!S)throw v;if(d.talkBackEnabled)return await this.dependencies.androidTalkBack.dispatchTap(n,S.point,S.frameContext,{signal:c,context:{assertCurrent:()=>this.dependencies.host.assertDisplayRevisionCurrent(p),onTapDelivered:b,onDispatched:()=>{y=!0},onActivationWarnings:d.onActivationWarnings}}),{doubleTapDelivered:!1,startedAt:this.dependencies.timer.now()};return await this.dispatchAndroidFirstTap(n,S.point,S.frameContext,{signal:c,context:{assertCurrent:()=>this.dependencies.host.assertDisplayRevisionCurrent(p),onTapDelivered:d.onTapDelivered}})}}async dispatchAndroidFirstTap(n,s,a,{signal:d,context:c}){let p=this.dependencies.timer.now();if(n.action==="doubleTap"&&await Q4(this.dependencies.androidClient,{...s,frameContext:a,signal:d,assertCurrent:c.assertCurrent,onTapDelivered:c.onTapDelivered}))return{doubleTapDelivered:!0,startedAt:p};return await this.dispatchAndroidTap(s,GS(n,"android"),a,{signal:d,context:c}),{doubleTapDelivered:!1,startedAt:p}}async dispatchSecondAndroidTap(n,s,a,d){let{signal:c}=d;if(n.action!=="doubleTap"||d.firstTap.doubleTapDelivered)return;await Z4(this.dependencies.timer,d.firstTap.startedAt,{signal:c,onWarning:(p)=>d.onActivationWarnings([p])}),this.dependencies.host.assertDisplayRevisionCurrent(a),await this.dispatchAndroidTap(s,GS(n,"android"),void 0,{signal:c,context:{assertCurrent:()=>this.dependencies.host.assertDisplayRevisionCurrent(a),onTapDelivered:d.onTapDelivered}})}async dispatchAndroidTap(n,s,a,{signal:d,context:c}){let p=nQ(c.onTapDelivered);await this.dependencies.androidCoordinateTap(this.dependencies.androidClient,this.dependencies.host.adb,n,{durationMs:s,options:{frameContext:a,signal:d,assertCurrent:c.assertCurrent,onTapDelivered:p}}),p(),o(d)}}import{createHash as le}from"crypto";import{isDeepStrictEqual as Qe}from"util";var Ze=300000,et=128,tt=new Set(["extras","view-id","occlusionState","occludedBy","occludedByViewId"]);function V(n){if(Array.isArray(n))return n.map(V);if(!n||typeof n!=="object")return n;return Object.fromEntries(Object.entries(n).filter(([s])=>!tt.has(s)).map(([s,a])=>[s,V(a)]))}function ye(n){return Boolean(Cv(n.truncationReasons).length||Cv(n.viewHierarchy?.truncationReasons).length)}function be(n){return Boolean(n.truncationReasons?.some(xv)||n.viewHierarchy?.truncationReasons?.some(xv)||n.viewHierarchy?.windows?.some((s)=>s.truncationReasons?.some(xv)))}function ve(n){return ye(n)||be(n)&&(!n.viewHierarchy||!VT(n.viewHierarchy))||Boolean(n.viewHierarchy?.windows?.some((s)=>Cv(s.truncationReasons??void 0).length>0))}function me(n){let s=n.rotation??n.viewHierarchy?.rotation;if(!Number.isInteger(s)||!n.viewHierarchy||ye(n))return null;let a=n.viewHierarchy;return{screenSize:{width:n.screenSize?.width,height:n.screenSize?.height},rotation:s,systemInsets:n.systemInsets,insets:n.insets,activeWindow:{appId:n.activeWindow?.appId,activityName:n.activeWindow?.activityName},screenIdentity:n.screenIdentity?{platform:n.screenIdentity.platform,source:n.screenIdentity.source,key:n.screenIdentity.key}:void 0,hierarchy:{tree:V(a.hierarchy),windows:V(a.windows),packageName:a.packageName,foregroundActivity:a.foregroundActivity,screenWidth:a.screenWidth,screenHeight:a.screenHeight,pixelWidth:a.pixelWidth,pixelHeight:a.pixelHeight,nativeScale:a.nativeScale,rotation:a.rotation,systemInsets:a.systemInsets,insets:a.insets}}}function Te(n,s){let a=me(n),d=me(s);return a!==null&&d!==null&&Qe(a,d)}function rt(n){return Number.isFinite(n.width)&&Number.isFinite(n.height)&&n.width>0&&n.height>0}function nt(n){return typeof n==="number"&&Number.isFinite(n)&&n>0}function it(n){return/^([0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}):\d+(?::[0-9a-f]+)?$/i.exec(n)?.[1]?.toLowerCase()}function ge(n){let s=[];if(!n.display?.key)s.push("display");if(!rt(n.screenSize))s.push("screenSize");let a=n.rotation??n.viewHierarchy?.rotation;if(!Number.isInteger(a))s.push("rotation");if(!nt(n.viewHierarchy?.nativeScale))s.push("nativeScale");if(!n.viewHierarchy?.frameContext)s.push("frameContext");if(ve(n))s.push("completeHierarchy");return s}function ot(n){let s=n.viewHierarchy?.windows?.find((d)=>d.isFocused),a=s?.bounds;return{focusedWindowPresent:s!==void 0,focusedWindowId:s?.id,focusedWindowType:s?.type,focusedWindowPackage:s?.packageName,focusedWindowBounds:a?JSON.stringify([a.left,a.top,a.right,a.bottom]):void 0}}function he(n,s){if(ge(s).length>0)return;let{width:a,height:d}=s.screenSize;return{deviceId:n,incarnation:Ji(n),displayKey:s.display.key,displayRole:s.display.role,displayPosture:s.display.posture,width:a,height:d,rotation:s.rotation??s.viewHierarchy?.rotation,nativeScale:s.viewHierarchy.nativeScale,runnerEpoch:it(s.viewHierarchy.frameContext),appId:s.activeWindow?.appId||s.viewHierarchy?.packageName,hierarchyPackage:s.viewHierarchy?.packageName,activityName:s.activeWindow?.activityName??"",windowType:s.activeWindow?.type,...ot(s)}}function st(n,s,a){if(a==="runnerEpoch"||a==="focusedWindowPresent")return!1;if((a==="activityName"||a==="windowType")&&(!n[a]||!s[a]))return!1;if(a.startsWith("focusedWindow")&&(!n.focusedWindowPresent||!s.focusedWindowPresent))return!1;return n[a]!==s[a]}function xe(n){if(n&&typeof n==="object"&&!Array.isArray(n)){let s=n;return[s.left,s.top,s.right,s.bottom]}return n}function z(n,s){if(Array.isArray(s)){for(let c of s)z(n,c);return}if(!s||typeof s!=="object")return;let a=s,d={...a,...Se(a)};if(bD(d["resource-id"]))return;n.update("["),n.update(JSON.stringify([d.className??d.class??d.type,d.role,xe(Ft(a)),d.clickable,d.enabled,d["visible-to-user"],d.scrollable,d["resource-id"],Array.isArray(d.actions)?[...d.actions].sort():d.actions])),z(n,a.node),n.update("]")}function fe(n){let s=n.viewHierarchy,a=be(n)?VT(s):s,d=le("sha256");d.update(Cr([n.systemInsets,n.insets,s.screenWidth,s.screenHeight,s.pixelWidth,s.pixelHeight,s.nativeScale,s.rotation,s.systemInsets,s.insets])),z(d,a.hierarchy);let c;if(a.windows!==void 0){let p=le("sha256");for(let m of a.windows)p.update(JSON.stringify([m.id,m.type,m.isActive,m.isFocused,xe(m.bounds),m.windowLayer,m.packageName])),z(p,m.hierarchy);c=p.digest("hex")}return{tree:d.digest("hex"),windows:c}}function at(n,s){return n.tree===s.tree&&(n.windows===void 0||s.windows===void 0||n.windows===s.windows)}class Ae{timer;ids;entries=new Map;constructor(n=i,s=L){this.timer=n;this.ids=s}capture(n,s){let a=he(n,s);if(!a)return{status:"unavailable",missing:ge(s)};this.cleanup();while(this.entries.size>=et)this.entries.delete(this.entries.keys().next().value);let d={snapshotId:this.ids.next(),expiresAt:this.timer.now()+Ze};return this.entries.set(d.snapshotId,{...a,...d,layout:fe(s)}),{status:"captured",reference:d}}staleReason(n,s,a){let d=this.entries.get(n);if(!d)return"Snapshot reference is unknown or evicted; re-observe.";if(this.timer.now()>=d.expiresAt)return this.entries.delete(n),"Snapshot reference expired; re-observe.";if(ve(a))return"Snapshot layout is unavailable. The hierarchy capture was incomplete; observe again, or use a selector or coordinates without a snapshotId.";let c=he(s,a);if(!c)return"Snapshot geometry or frame context is unavailable; re-observe.";if(d.runnerEpoch!==c.runnerEpoch)return"Snapshot reference is stale (runner restarted); re-observe.";for(let m of Object.keys(c))if(st(d,c,m))return`Snapshot reference is stale (${m} changed); re-observe.`;let p=fe(a);if(!at(d.layout,p))return"Snapshot reference is stale (tap-targeting layout changed); re-observe.";return}get size(){return this.entries.size}cleanup(){for(let[n,s]of this.entries)if(this.timer.now()>=s.expiresAt)this.entries.delete(n)}}var Lu=new Ae;var B=31,ut=5000;function Q(n){return`shell input stylus ${n}`}function k4(n){let{pointer:s,platform:a,gesture:d,display:c}=n;if(s===void 0)return;if(s.toolType!=="stylus"&&s.toolType!=="eraser")return`pointer.toolType "${String(s.toolType)}" is not supported; only "stylus" or "eraser" can be injected`;if(a!=="android")return`pointer.toolType "${s.toolType}" is Android-only; omit pointer on iOS`;if(d==="doubleTap")return"stylus pointer does not support doubleTap yet; use tap or longPress";if(c!==void 0)return"stylus pointer does not support display selection yet; omit display";return}async function dt(n,s){let a=await Ot(n,ut,void 0,s);if(a===null)return`could not read the device's Android API level, so stylus input is refused (it needs API ${B} or newer)`;if(a<B)return`stylus input needs Android API ${B} or newer (this device reports API ${a}): older releases build the injected event without a stylus tool type`;return}async function ct(n,s){let a=await dt(n,s);if(a)throw new t(a)}function Pe(n,s){return k4({pointer:s.pointer,platform:n,gesture:s.action??"tap",display:s.display})}function we(n,s,a="tap"){return{success:!1,x:s.x,y:s.y,action:a,error:n}}class Ky extends t{}function pt(n,s){let{command:a,dispatched:d,holdMs:c,signal:p}=s;if(n instanceof _e||n instanceof TV)return n;try{aC(a,Qr(n))}catch(h){return h}if(!d)return n;let m=c===void 0?void 0:x4(n,c,p);return new Ky(m??r(n),{cause:n})}async function Re(n,{command:s,timeoutMs:a,holdMs:d},c){await ct(n,c.signal);let p=!1;try{await X4(n,s,{...c,timeoutMs:a,onDispatch:()=>{p=!0,c.onDispatch?.()}})}catch(m){throw pt(m,{command:s,dispatched:p,holdMs:d,signal:c.signal})}}async function Ce(n,s,a,d={}){let{x:c,y:p}=s,m=a.durationMs??iT,h=a.action==="longPress";try{await Re(n,h?{command:Q(`swipe ${c} ${p} ${c} ${p} ${Lo(m)}`),timeoutMs:Br(m),holdMs:m}:{command:Q(`tap ${c} ${p}`)},d)}catch(f){throw f instanceof Ky?fn(f.message):f}}function Z7(n,s,a={}){let{from:d,to:c,duration:p}=s;return Re(n,{command:Q(`swipe ${d.x} ${d.y} ${c.x} ${c.y} ${Lo(p)}`),timeoutMs:Br(p)},a)}var Ie=new Map;function H(n){let s=Ie.get(n);if(!s)s=new Un,Ie.set(n,s);return s}var lt="dev.jasonpearson.automobile.ctrlproxy/.pointer.PointerInstrumentation",Z=31,mt=1,Ee=200,ht=15000;function E4(n){return n*2+ht}class Wd extends t{}function ft(n){return n.points.slice(1).reduce((s,a)=>s+(a.durationMs??Ee),0)}function bt(n){let s={version:mt,tool:n.features.toolType,hover:n.features.hover===!0,buttons:n.buttons??0,displayId:n.displayId??0,points:n.points.map((a,d)=>({x:a.x,y:a.y,...d===0?{}:{durationMs:a.durationMs??Ee},...a.distance===void 0?{}:{distance:a.distance},...a.pressure===void 0?{}:{pressure:a.pressure},...a.tilt===void 0?{}:{tilt:a.tilt},...a.orientation===void 0?{}:{orientation:a.orientation}}))};return Buffer.from(JSON.stringify(s),"utf8").toString("base64")}function vt(n){return`shell am instrument -w -r --no-restart -e request ${bt(n)} ${lt}`}function Tt(n){let s=new Map;for(let c of n.split(/\r?\n/)){let p=/^INSTRUMENTATION_RESULT: ([A-Za-z]+)=(.*)$/.exec(c);if(p)s.set(p[1],p[2])}let a=s.get("success");if(a!=="true"&&a!=="false")return;let d=s.get("error");return{success:a==="true",...d?{error:d}:{},injected:Number(s.get("injected")??0),elapsedMs:Number(s.get("elapsedMs")??0)}}async function gt(n,s){if(/Unable to find instrumentation|INSTRUMENTATION_FAILED|does not exist/i.test(n))return new Wd("The connected CtrlProxy does not include the pointer instrumentation; update CtrlProxy. No input was sent.");if(/Unknown option|--no-restart/i.test(n))return new Wd("This Android version's `am instrument` has no --no-restart, which keeps the injection from restarting CtrlProxy; hover and stylus injection need Android 12 or newer. No input was sent.");if(/Process crashed|INSTRUMENTATION_RESULT: shortMsg=/i.test(n)){let a="";try{a=(await s.executeCommand("shell settings get secure enabled_accessibility_services",{timeoutMs:5000})).stdout.includes("dev.jasonpearson.automobile.ctrlproxy")?" CtrlProxy's accessibility service is still enabled.":" CtrlProxy's accessibility service is not enabled; re-enable it before retrying."}catch(d){e.warn(`Could not read accessibility services after pointer crash: ${r(d)}`,d)}return new t("The pointer instrumentation crashed before reporting a result; the hover or stroke may have partially run. Verify state with observe before retrying."+a)}return new t("The pointer instrumentation did not report a result; the hover or stroke may have partially run. Verify state with observe before retrying.")}function Nq(n,s){let a=H(s);return async(d,c)=>{o(c),await a.runExclusive(async()=>{o(c);let p=async()=>{let h=await n.executeCommand(vt(d),{timeoutMs:E4(ft(d)),signal:c}),f=[h.stdout,h.stderr].filter(Boolean).join(`
3
+ `),y=Tt(f);if(!y)throw await gt(f,n);return y},m=await p();if(!m.success&&m.injected===0&&/refused/i.test(m.error??"")){o(c);let h=d.points[0];try{await n.executeCommand(`shell input stylus motionevent CANCEL ${Math.round(h.x)} ${Math.round(h.y)}`,{timeoutMs:5000,signal:c})}catch(f){e.warn(`Could not cancel refused pointer input: ${r(f)}`,f)}o(c),m=await p()}if(!m.success)throw new t(`The pointer instrumentation failed after ${m.injected} event${m.injected===1?"":"s"}: ${m.error??"unknown error"}`)})}}function St(n,s){let a=s.width-1,d=s.height-1,c=Math.round(n.x),p=Math.round(n.y),m=s.rotation===1?{x:a-p,y:c}:s.rotation===2?{x:a-c,y:d-p}:s.rotation===3?{x:p,y:d-c}:{x:c,y:p};return{x:re(m.x,a),y:re(m.y,d)}}function xt(n,s){switch(s){case 1:return n+Math.PI/2;case 2:return n+Math.PI;case 3:return n-Math.PI/2;default:return n}}function re(n,s){return Math.min(Math.max(n,0),s)}function At(n,s){let a=Math.sin(n)**2,d=Math.sin(s)*Math.cos(s),c=Math.sqrt(Math.max(0,1-4*d*d*a)),p=d===0?a:2*a/(1+c),m=Math.sqrt(p),h=(f)=>Math.max(-90,Math.min(90,Math.round(Math.asin(Math.max(-1,Math.min(1,f)))*180/Math.PI)))||0;return{x:h(-m*Math.sin(s)),y:h(m*Math.cos(s))}}function Pt(n){let s=n.features.hover===!0,a=n.points[0],d=a.pressure??(s?0:1),c=a.distance??(s?0.5:0),m=n.points.some((b)=>b.tilt!==void 0||b.orientation!==void 0)?a.tilt??0:void 0,h=a.orientation??0,f=[{atMs:0,x:a.x,y:a.y,pressure:d,distance:c,tilt:m,orientation:h}],y=0;return n.points.slice(1).forEach((b,T)=>{let v=n.points[T],g=b.durationMs??200,S=Math.max(1,Math.ceil(g/16)),A={pressure:d,distance:c,tilt:m,orientation:h};for(let I=1;I<=S;I++){let P=I/S;d=N(A.pressure,b.pressure??A.pressure,P),c=N(A.distance,b.distance??A.distance,P),m=A.tilt===void 0?void 0:N(A.tilt,b.tilt??A.tilt,P),h=N(A.orientation,b.orientation??A.orientation,P),f.push({atMs:y+Math.floor(g*I/S),x:I===S?b.x:N(v.x,b.x,P),y:I===S?b.y:N(v.y,b.y,P),pressure:d,distance:c,tilt:m,orientation:h})}y+=g}),f}function N(n,s,a){return n+(s-n)*a}function E(n,s){return[3,n,s]}function Oe(n,s){return Math.round(re(n,1)*s)}function ne(n,s,a){let d=St(n,s),c=!a&&n.tilt!==void 0?At(n.tilt,xt(n.orientation,s.rotation)):void 0;return[...E(0,d.x),...E(1,d.y),...a?E(25,Oe(n.distance,255)):E(24,Oe(n.pressure,4095)),...c?[...E(26,c.x),...E(27,c.y)]:[]]}var F=[0,0,0];function ke(n){return n.features.toolType==="eraser"?321:320}function Be(n,s){return[...n&32?[1,331,s]:[],...n&64?[1,332,s]:[]]}function wt(n,s,a,d){let c=[1,ke(d),1];return a?[...c,...ne(n,s,!0),...E(24,0),...F]:[...c,1,330,1,...ne(n,s,!1),...E(25,0),...Be(d.buttons??0,1),...F]}function Rt(n,s,a){let d=[1,s,0,...F];return n?d:[...Be(a,0),1,330,0,...E(24,0),...F,...d]}function M(n,s,a){return{code:n,info:{value:0,minimum:s,maximum:a,fuzz:0,flat:0,resolution:0}}}function Ct(n){return{id:1,command:"register",name:"automobile-pen",vid:6353,pid:19985,bus:"usb",configuration:[{type:100,data:[0,1,3]},{type:101,data:[320,321,330,331,332]},{type:103,data:[0,1,24,25,26,27]},{type:110,data:[1]}],abs_info:[M(0,0,n.width-1),M(1,0,n.height-1),M(24,0,4095),M(25,0,255),M(26,-90,90),M(27,-90,90)]}}var ee=(n)=>({id:1,command:"inject",events:n}),te=(n)=>({id:1,command:"delay",duration:n});function Ne(n,s){let a=n.features.hover===!0,[d,...c]=Pt(n),p=[Ct(s),te(4000),ee(wt(d,s,a,n))],m=0;for(let h of c){if(h.atMs>m)p.push(te(h.atMs-m)),m=h.atMs;p.push(ee([...ne(h,s,a),...F]))}return p.push(ee(Rt(a,ke(n),n.buttons??0)),te(50)),`${p.map((h)=>JSON.stringify(h)).join(`
4
+ `)}
5
+ `}var I4=4050;function Me(n){return I4+n.slice(1).reduce((s,a)=>s+(a.durationMs??200),0)}var Fe=5000,It=1e4,Et=1e5,q="automobile-uinput-exit=",Ue=97;async function Dt(n,s){let{stdout:a}=await n.executeCommand(VS(0),{timeoutMs:Fe,noRetry:!0,signal:s}),d=qS(a),c=d?Gy(d):void 0;if(!c)throw Error(`Could not parse the display size from wm size output: ${a.trim()}`);let p=await Yd(n,{timeoutMs:Fe,signal:s});if(p===null)throw Error("WindowManager did not report the display rotation");return{...c,rotation:p}}async function _t(n,s,a,d){let c=Buffer.from(s,"utf8").toString("base64"),p=await n.execute(["shell",`s=$(echo ${c} | base64 -d) || { echo ${q}${Ue}; exit 0; }; printf '%s\\n' "$s" | uinput - 2>&1; echo ${q}$?`],{timeoutMs:a,noRetry:!0,signal:d}),m=`${p.stdout}
6
+ ${p.stderr}`,h=new RegExp(`${q}(\\d+)`).exec(m);return{exitCode:h?Number(h[1]):null,stderr:m.replace(new RegExp(`${q}\\d+`),"").trim()}}function kt(n){let s=n.stderr||`exit ${n.exitCode??"unknown"}`;if(n.exitCode===Ue)return new Wd("The device could not decode the uinput script (base64 -d failed). No input was sent.");if(n.exitCode===127||/not found/i.test(n.stderr))return new Wd(`This device has no uinput tool, so the uinput route cannot inject a stylus: ${s}. No input was sent.`);if(/permission denied|eacces/i.test(n.stderr))return new Wd(`/dev/uinput is not writable; run adb root on an emulator or userdebug build: ${s}. No input was sent.`);return new t(`The uinput pen failed and may have played part of the stroke or hover: ${s}. Verify state with observe before retrying.`)}function Fq(n,s,a={readGeometry:(d)=>Dt(n,d),runScript:(d,c,p)=>_t(n,d,c,p)}){let d=H(s);return async(c,p)=>{if(o(p),(c.displayId??0)!==0)throw new Wd(`display ${c.displayId} is not supported; the uinput route injects on the default display. No input was sent.`);await d.runExclusive(async()=>{o(p);let m=await a.readGeometry(p).catch((y)=>{throw p?.aborted?y:new Wd(`Could not read the display geometry for the uinput pen: ${r(y)}. No input was sent.`)}),h=Ne(c,m);if(Buffer.byteLength(h,"utf8")*1.3333333333333333>Et)throw new Wd("The stroke is too long for one uinput script; split it into shorter gestures. No input was sent.");o(p);let f=await a.runScript(h,Me(c.points)+It,p).catch((y)=>{throw p?.aborted?y:new t(`The uinput pen run failed and may have played part of the stroke or hover: ${r(y)}. Verify state with observe before retrying.`,{cause:y})});if(f.exitCode!==0)throw kt(f)})}}var O={supported:!0};function w(n,s){return s?{supported:!1,reason:n,missingCapability:s}:{supported:!1,reason:n}}class D{dispatch;constructor(n){this.dispatch=n}inject(n,s){return this.dispatch(n,s)}}class ie extends D{route="adb-input-source";supports(n,s){if(s.platform!=="android"||n.toolType!=="stylus")return w("adb input stylus injects a stylus on Android only");if(n.hover||n.variablePressure||n.extendedAxes||n.path)return w("adb input stylus injects a constant-pressure tap or straight swipe; it cannot hover, vary pressure, tilt, press buttons or draw a path");if(s.apiLevel===void 0)return w("the device's Android API level could not be read");return s.apiLevel>=B?O:w(`adb input stylus needs Android API ${B} or newer (this device reports API ${s.apiLevel})`)}}function Le(n){return n.toolType==="finger"&&n.hover!==!0&&n.variablePressure!==!0&&n.extendedAxes!==!0&&n.path!==!0}function U(n){let s=[n.toolType];if(n.hover)s.push("hover");if(n.variablePressure)s.push("variable pressure");if(n.extendedAxes)s.push("tilt, orientation or buttons");if(n.path)s.push("path");return s.join(" ")}function $e(n){if(n.hover)return Bt(n);if((n.variablePressure||n.extendedAxes||n.path)&&n.toolType!=="stylus"&&n.toolType!=="eraser")return`${n.toolType} input has no variable pressure, tilt, buttons or stroke; only a stylus or eraser does`;if(n.toolType==="mouse")return"mouse input is supported for hover only";return}function Bt(n){if(n.toolType==="finger")return"a finger does not hover; hover comes from a stylus or a mouse";if(n.variablePressure)return"hover has no contact, so it has no pressure";if(n.extendedAxes||n.path)return"tilt, orientation, buttons and strokes describe a stylus in contact; a hover carries only a position and distance";return}class oe extends D{route="ctrlproxy-a11y";supports(n,s){if(s.platform!=="android")return w("accessibility gestures are an Android route");return Le(n)?O:w(`accessibility dispatchGesture only produces a finger touch, not ${U(n)}`)}}class se extends D{route="instrumentation";supports(n,s){if(s.platform!=="android")return w("instrumentation injection is an Android route");if(n.toolType==="finger")return w("finger touches use the accessibility route");if(n.toolType==="eraser")return w("the instrumentation runner does not inject an eraser");let a=n.hover?MR:OR;if(s.capabilities.has(a))return O;let d=s.apiLevel!==void 0&&s.apiLevel<Z?`: this device runs Android API ${s.apiLevel} and the route needs Android 12 (API ${Z})`:"";return w(`the connected runner does not advertise ${a}${d}`,a)}}class ae extends D{route="uinput";supports(n,s){if(s.platform!=="android")return w("uinput injection is an Android route");if(n.toolType!=="stylus"&&n.toolType!=="eraser")return w("the uinput route injects a stylus or eraser only");if(s.rootShell!==!0)return w("uinput injection needs a root adb shell (run adb root on an emulator or userdebug build)");return O}}function Lq(n){return[new oe(n.a11y),new ie(n.adbInputSource),new se(n.instrumentation),new ae(n.uinput)]}function _4(n,s,a){let d=$e(n);if(d)return{selected:null,missingCapabilities:[],refusal:`${U(n)} is not a valid pointer request: ${d}.`};let c=[],p=new Set;for(let f of a){let y=f.supports(n,s);if(y.supported)return{selected:f};if(c.push(`${f.route}: ${y.reason}`),y.missingCapability)p.add(y.missingCapability)}let m=[...p],h=m.length>0?` Use a device whose runner advertises ${m.join(" and ")}.`:"";return{selected:null,missingCapabilities:m,refusal:`${U(n)} input cannot be injected on this device, and a finger touch is never substituted. ${c.join("; ")}.${h}`}}function Ge(n,s,a){let d=_4(n,s,a);if(d.selected===null)throw new t(d.refusal);return d.selected}function je(n){return new Set([OR,MR].filter((s)=>n(s)))}var Nt=5000,Mt=5000;function Ut(n,s){return s==="eraser"||!n.has(OR)||!n.has(MR)}async function Lt(n,s){try{let{stdout:a}=await n.executeCommand("shell id -u",{timeoutMs:Mt,noRetry:!0,signal:s});return a.trim()==="0"}catch(a){if(s?.aborted)throw a;return e.warn(`[pointer] could not read the adb shell uid: ${r(a)}`,a),!1}}async function Bq(n,s,a,d){let c=k.getExistingInstance(n.deviceId),p=new Set;try{for(let h of[MR,OR])if(c&&await c.supportsCommand(h))p.add(h)}catch(h){if(a?.aborted)throw h;e.warn(`[pointer] could not read the runner's capabilities: ${r(h)}`,h)}return{platform:"android",apiLevel:await Ot(s,Nt,void 0,a).catch((h)=>{if(a?.aborted)throw h;return e.warn(`[pointer] could not read the Android API level: ${r(h)}`,h),null})??void 0,capabilities:je((h)=>p.has(h)),...Ut(p,d)?{rootShell:await Lt(s,a)}:{}}}var $t=40;function jx(n,s,a={}){let d=s.map((p)=>{let m=p.pressure??n.pressure,h=p.tilt??n.tilt,f=p.orientation??n.orientation;return{x:p.x,y:p.y,...p.durationMs===void 0?{}:{durationMs:p.durationMs},...m===void 0?{}:{pressure:m},...h===void 0?{}:{tilt:h},...f===void 0?{}:{orientation:f}}}),c=ioe(n.buttons);return{features:{toolType:n.toolType,...d.some((p)=>p.pressure!==void 0&&p.pressure!==1)?{variablePressure:!0}:{},...c!==0||d.some((p)=>p.tilt!==void 0||p.orientation!==void 0)?{extendedAxes:!0}:{},...a.path?{path:!0}:{}},points:d,buttons:c}}function Ve(n,s){return[n,{...n,durationMs:s??$t}]}async function Kx(n,s,a,d={}){let c=await(d.readEnvironment??((h)=>Bq(n,s,h,a.features.toolType)))(d.signal),p=d.injectors??Lq({a11y:We,adbInputSource:We,instrumentation:Nq(s,n.deviceId),uinput:Fq(s,n.deviceId)}),m=Ge(a.features,c,p);d.assertCurrent?.(),d.onDispatch?.();try{await m.inject(a,d.signal)}catch(h){if(h instanceof Wd||d.signal?.aborted)throw h;throw new Ky(r(h),{cause:h})}}async function We(){throw new t("This route cannot inject a stylus with pressure, tilt or buttons.")}class G extends t{}function ue(n,s){return n===1?s*(1-Number.EPSILON):n*s}function j(n,s,a){let d=s+ue(n,a-s);return d>=a?Math.max(s,a-Math.max(Math.abs(a),a-s)*Number.EPSILON):d}var W=["left","top","right","bottom"];function x(n){throw new t(`tapAt image ${n}. Observe again and pass metadata from the same image.`)}function de(n){return!!n&&[n.width,n.height].every((s)=>Number.isFinite(s)&&s>0)}function ze(n){return de(n)&&Number.isInteger(n.width)&&Number.isInteger(n.height)}function ce(n){return!!n&&W.every((s)=>Number.isFinite(n[s]))&&n.right>n.left&&n.bottom>n.top}function Gt(n,s){let a="crop"in n?n.crop:n.screenshot,d="crop"in n?n.rotation:n.screenshot.rotation;if(d!==void 0&&(!Number.isInteger(d)||d<0||d>3))x("rotation must be 0, 1, 2, or 3");if(a.screenshotOrientation==="display")return 0;if(a.screenshotOrientation!=="native")x("requires screenshotOrientation (display or native)");if(d===void 0)x("with native screenshotOrientation requires observe.rotation");if(s==="android"&&d!==0)x("Android requires display-aligned orientation");return d}function He(n,s){if(![n.x,n.y].every((a)=>Number.isFinite(a)&&a>0)||Math.abs(n.x-n.y)>OF)x("has missing or inconsistent pixelsPerNativeUnit / aspect ratio");if(s==="android"&&(n.x!==1||n.y!==1))x("Android pixels require scale 1")}function jt(n){let{screenSize:s,clippedBounds:a,requestedBounds:d}=n;if(!ce(a)||!ce(d))x("requires finite nonempty crop bounds");let c={left:Math.max(0,d.left),top:Math.max(0,d.top),right:Math.min(s.width,d.right),bottom:Math.min(s.height,d.bottom)};if(W.some((p)=>a[p]!==c[p])||n.clipped!==W.some((p)=>a[p]!==d[p]))x("has inconsistent clippedBounds / requestedBounds")}function Wt(n,s){let{screenSize:a,imageSize:d,pixelsPerNativeUnit:c,rasterBounds:p}=n;if(!ce(p))x("requires finite nonempty rasterBounds");let m=fV(a,s),h=NF(MF(n.clippedBounds,a,s),c,{width:m.width*c.x,height:m.height*c.y}),f=p.right-p.left,y=p.bottom-p.top,b=n.screenshotOrientation==="display"&&(s===1||s===3);return!W.some((T)=>!Number.isInteger(p[T])||Math.abs(h[T]-p[T])>0.0000001)&&d.width===(b?y:f)&&d.height===(b?f:y)}function Vt(n,s,a){let d=n.crop,c=[a];if(s==="ios"&&d.screenshotOrientation==="display"&&n.rotation!==void 0&&(n.rotation===2||(n.rotation===1||n.rotation===3)&&d.screenSize.width>d.screenSize.height))c.push(n.rotation);let p=c.filter((m)=>Wt(d,m));if(p.length===0)x("has inconsistent rasterBounds, imageSize, scale, or clippedBounds");return p}function zt(n,s,a){let d=n.crop;if(d.unit!==(s==="android"?"pixels":"points"))x("crop unit does not match the platform");if(!ze(d.imageSize))x("requires positive integer crop imageSize");if(!d.pixelsPerNativeUnit)x("requires pixelsPerNativeUnit");if(He(d.pixelsPerNativeUnit,s),d.scaleProvenance!=="raster-dimensions"&&d.scaleProvenance!=="native-scale-confirmed")x("requires scaleProvenance");return jt(d),Vt(n,s,a)}function Ht(n,s,a){let{nativeScale:d,imageSize:c}=n.screenshot;if(d!==void 0&&(!Number.isFinite(d)||d<=0))x("requires positive finite nativeScale provenance");if(c===void 0)return;if(!ze(c))x("requires positive integer imageSize");He({x:c.width/s.width,y:c.height/s.height},a)}function qt(n,s){if(n.unit!=="normalized"&&n.unit!=="pixels")x("unit must be normalized or pixels");let a=n.unit==="normalized"?{width:1,height:1}:s;if(!a)x("pixels requires imageSize with the real file dimensions");let d=n.unit==="normalized";for(let[c,p]of[[n.x,a.width],[n.y,a.height]])if(!Number.isFinite(c)||c<0||(d?c>p:c>=p))x(`${n.unit} coordinates must be in [0, ${a.width}${d?"]":")"} x [0, ${a.height}${d?"]":")"}`)}function qe(n,s){return[n.x,n.y].every(Number.isFinite)&&n.x>=0&&n.y>=0&&n.x<s.width&&n.y<s.height}function Yt(n,s){if(n.x===s.right)n.x=j(1,s.left,s.right);if(n.y===s.bottom)n.y=j(1,s.top,s.bottom)}function Kt(n,s,a){let{crop:d}=s,{pixelsPerNativeUnit:c,rasterBounds:p,screenSize:m}=d,h=a.map((b)=>({bounds:K4({left:p.left/c.x,top:p.top/c.y,right:p.right/c.x,bottom:p.bottom/c.y},m,b),scale:b===1||b===3?{x:c.y,y:c.x}:c})),f=h[0];if(h.some((b)=>W.some((T)=>Math.abs(b.bounds[T]-f.bounds[T])>0.0000001)||b.scale.x!==f.scale.x||b.scale.y!==f.scale.y))x("crop pixel padding is ambiguous between source orientations");let y={x:(f.bounds.left*f.scale.x+n.x)/f.scale.x,y:(f.bounds.top*f.scale.y+n.y)/f.scale.y};if(!qe(y,m))x("pixels resolve outside native screen bounds");return y}function Xt(n,s,a,d){let{source:c}=n;if("crop"in c&&c.crop.screenshotOrientation==="display")return Kt(n,c,d);let p=fV(s,a),m="crop"in c?c.crop.pixelsPerNativeUnit:{x:c.screenshot.imageSize.width/p.width,y:c.screenshot.imageSize.height/p.height},h="crop"in c?c.crop.rasterBounds:{left:0,top:0},f=mV({x:(h.left+n.x)/m.x,y:(h.top+n.y)/m.y},s,a),y="crop"in c?c.crop.imageSize:c.screenshot.imageSize,b=K4({left:h.left/m.x,top:h.top/m.y,right:(h.left+y.width)/m.x,bottom:(h.top+y.height)/m.y},s,a);if(Yt(f,b),!qe(f,s))x("pixels resolve outside native screen bounds");return f}function Ye(n,s,a){let d=n.source,c="crop"in d?d.crop:d.screenshot,{screenSize:p,imageSize:m}=c;if(!de(p)||!de(a))x("requires positive finite screenSize");if(p.width!==a.width||p.height!==a.height)x("source screenSize changed; observe again");let h=Gt(d,s),f=[];if("crop"in d)f=zt(d,s,h);else Ht(d,fV(p,h),s);if(qt(n,m),n.unit==="pixels")return Xt(n,p,h,f);let y="crop"in d?d.crop.clippedBounds:{left:0,top:0,right:p.width,bottom:p.height},b=mV(n,{width:1,height:1},h);return{x:j(b.x,y.left,y.right),y:j(b.y,y.top,y.bottom)}}function Jt(n){let{durationMs:s}=n,a=n.action??"tap";if(a!=="tap"&&a!=="longPress"&&a!=="doubleTap")return"tapAt action is unsupported";if(s!==void 0&&(a!=="longPress"||!Number.isInteger(s)||s<Pa||s>kh))return`tapAt durationMs requires longPress and must be ${Pa}\u2013${kh} ms`;return}function C(n){return n.image??{x:n.x,y:n.y}}function Xe(n,s){let a=C(n);return s==="android"&&!n.image?{x:Math.round(a.x),y:Math.round(a.y)}:a}function Qt(n,s){return n.x!==void 0||n.y!==void 0||n.coordinateSpace!==void 0?`${s} image is mutually exclusive with x, y, and coordinateSpace`:void 0}function Zt(n,s){if(n.image!==void 0)return Qt(n,s);let{x:a,y:d}=n,c=n.coordinateSpace??"absolute";if(c!=="absolute"&&c!=="normalized"&&c!=="percent")return`${s} coordinateSpace is unsupported`;if(!Number.isFinite(a)||!Number.isFinite(d))return`${s} requires finite x and y coordinates`;let p=c==="normalized"?1:c==="percent"?100:void 0;if(p!==void 0&&!er(a,d,p))return`${s} ${c} coordinates must be between 0 and ${p}`;return}function er(n,s,a){return n>=0&&n<=a&&s>=0&&s<=a}function Ke(n,s,a){let d=a==="normalized"?1:a==="percent"?100:void 0;if(d===void 0)return n;return ue(n/d,s)}function tr(n){if(!n)return!1;return Number.isFinite(n.width)&&Number.isFinite(n.height)&&n.width>0&&n.height>0}function rr(n,s){return n.x<0||n.x>=s.width||n.y<0||n.y>=s.height}function nr(n,s){let a=n.image?.source;return a&&"crop"in a?{width:a.crop.rasterBounds.right,height:a.crop.rasterBounds.bottom}:s}function Lc(n,s,a,d="tapAt"){let{x:c,y:p}=C(n),m=Zt(n,d);if(m)return{x:c,y:p,error:m};let h=n.coordinateSpace??"absolute",f=s.screenSize;if(!tr(f))return{x:c,y:p,error:`${d} requires a positive screenSize from a fresh observation`};let y=n.image?Ye(n.image,a==="ios"?"ios":"android",f):{x:Ke(c,f.width,h),y:Ke(p,f.height,h)},{x:b,y:T}=y;if(rr({x:b,y:T},f))return{x:c,y:p,error:`${d} coordinates (${c}, ${p}) are outside screen bounds [0, ${f.width}) x [0, ${f.height})`};let v=nr(n,f),g=a==="android"?Math.min(Math.round(b),Math.ceil(v.width)-1):b,S=a==="android"?Math.min(Math.round(T),Math.ceil(v.height)-1):T;return{x:g,y:S}}function or(n,s,a){let d=n.action??"tap",c=d==="longPress"?"long press":d==="doubleTap"?"double tap":"tap";return cp(s.viewHierarchy,n.layer,[a],c)}function K(n,s,a){ar(n,s,a);let d=Jt(n);if(d)return{x:C(n).x,y:C(n).y,error:d};let c=Lc(n,s,a);if("error"in c)return c;let p=or(n,s,c);if(p)return{...c,error:p};if(n.planContext)dr(n.planContext,s,c,a);return c}function ar(n,s,a){let d=n.planContext?.geometry;if(!d)return;let c=s.rotation??s.viewHierarchy?.rotation,m=[["platform",d.platform===a],["dimensions",d.deviceWidth===s.screenSize.width&&d.deviceHeight===s.screenSize.height],["orientation",Number.isInteger(c)&&d.orientation===c],["point",ur(n,d,a)]].find(([,h])=>!h)?.[0];if(m)throw new G(`tapAt replay ${m} mismatch: recorded ${JSON.stringify(d)}, current ${a} ${s.screenSize?.width}x${s.screenSize?.height} orientation ${c}. Replay on compatible geometry or record this step again.`)}function ur(n,s,a){if(n.image||(n.coordinateSpace??"absolute")!=="absolute")return!1;if(n.x!==s.x||n.y!==s.y)return!1;return a!=="android"||Number.isInteger(s.x)&&Number.isInteger(s.y)}function dr(n,s,a,d){let c=s.rotation??s.viewHierarchy?.rotation;if((d==="android"||d==="ios")&&Number.isInteger(c)&&c!==void 0&&c>=0&&c<=3)n.recordedGeometry={platform:d,deviceWidth:s.screenSize.width,deviceHeight:s.screenSize.height,orientation:c,x:a.x,y:a.y}}function cr(n,s,a){let d=n.talkBackDriverFactory??a;return{featureFlags:n.featureFlags??sr.getInstance(),accessibilityDetector:n.accessibilityDetector??ti,talkBackDriverFactory:d,talkBackStrategy:n.talkBackStrategy??new rv({timer:s,driverFactory:d}),useContextualFocusTap:n.talkBackDriverFactory===void 0}}var Je=1000;function pr(n,{detector:s,stateClient:a,featureFlags:d,timer:c}){return()=>{let p=new AbortController;return l(()=>s.isVoiceOverEnabled(n.deviceId,a(),{featureFlags:d,timeoutMs:Je,signal:p.signal}),{timer:c,timeoutMs:Je,label:"tapAt VoiceOver probe",onTimeout:()=>p.abort()})}}class Gx extends De{androidClient;iosDoubleTap;iosClient;iosCoordinateTap;invalidateIosCache;isIosVoiceOverOn;lastRenderedObservation;stylusRoutes;snapshotReferences;androidTalkBack;androidDispatcher;constructor(n,s=null,a={}){super(n,{adb:s,timer:a.timer,displayFence:a});ts(n.platform,"tapAt"),this.androidClient=a.androidClient??Bs(n,this.adbFactory);let d=()=>_.getInstance(n);this.iosClient=a.iosClient??d(),this.iosDoubleTap=a.dispatchIosDoubleTap??XS,this.iosCoordinateTap=a.dispatchIosCoordinateTap??JS,this.invalidateIosCache=a.invalidateIosCache??(()=>_.getExistingInstance(this.device.deviceId)?.invalidateCache()),this.lastRenderedObservation=a.lastRenderedObservation,this.stylusRoutes=a.stylus??{},this.snapshotReferences=a.snapshotReferences??Lu;let c=cr(a,this.timer,new yh(this.adbFactory));this.isIosVoiceOverOn=pr(n,{detector:a.iosVoiceOverDetector??vo,stateClient:()=>a.iosVoiceOverStateClient??d(),featureFlags:c.featureFlags,timer:this.timer}),this.androidTalkBack=new X({target:this,androidClient:this.androidClient,...c});let p=this;this.androidDispatcher=new J({host:{get adb(){return p.adb},get observeScreen(){return p.observeScreen},assertDisplayRevisionCurrent:(m)=>this.assertDisplayRevisionCurrent(m),assertSnapshotCurrent:(m,h)=>this.assertSnapshotCurrent(m,h),resolveFreshFrameRetry:(m,h,f,y)=>this.resolveFreshFrameRetry(m,h,f,y),retryFreshness:(m)=>this.retryFreshness(m)},androidClient:this.androidClient,androidCoordinateTap:a.dispatchAndroidCoordinateTap??YS,androidTalkBack:this.androidTalkBack,timer:this.timer})}async executeOnDisplay(n,s,a){let{onTapDelivered:d,signal:c,onDispatchCompleted:p,onActivationWarnings:m}=a,h=n.action??"tap",{observation:f,displayId:y,assertCurrent:b}=await Ni(this.device,s,this.observeScreen,{adb:this.adb,lastRenderedObservation:this.lastRenderedObservation,signal:c,transitions:this.displayTransitionReader}),T=this.staleSnapshotReason(n,f);if(T)return{success:!1,x:C(n).x,y:C(n).y,action:h,error:T};let v=K(n,f,this.device.platform);if("error"in v)return{success:!1,x:v.x,y:v.y,action:h,error:v.error};return this.observedInteraction(async()=>{if(b(),this.device.platform==="android"&&await this.androidTalkBack.resolveState(c,m)){let S=Ih(y);if(S)throw S;await this.dispatchDisplayTalkBackTapWithOneFreshRetry(n,v,f,{signal:c,assertCurrent:b,onTapDelivered:()=>d(!0),onActivationWarnings:m})}else await this.dispatchGesture(n,v,f,{signal:c,displayId:y,assertCurrent:b,onTapDelivered:d,onWarning:(S)=>m?.([S])});return p?.(),{success:!0,x:v.x,y:v.y,action:h}},{changeExpected:!1,display:f.display.key,previousObservation:f,signal:c})}async execute(n,s,a,d){ts(this.device.platform,"tapAt");let{progress:c,signal:p,planContext:m}=OQ(s,a,d),h=Pe(this.device.platform,n);if(h)return we(h,C(n),n.action);return this.executeTap(n,c,p,m)}async dispatchStylusTapAt(n,s,a,d){let c={signal:d,assertCurrent:()=>this.assertDisplayRevisionCurrent(a)};if(!qk(n.pointer)){await Ce(this.adb,s,n,c);return}let p=n.action==="longPress"?n.durationMs??iT:void 0;try{await Kx(this.device,this.adb,jx(n.pointer,Ve(s,p)),{...c,...this.stylusRoutes})}catch(m){throw m instanceof Ky?fn(m.message):m}}async executeTap(n,s,a,d){n={...n,planContext:d};let c=n.action??"tap",p=Y();p.serial("tapAt");let m,h,f={tapsDelivered:0,talkBack:!1,displayCompleted:!1},y=new Set,b=tQ(y),T=(g=!1)=>{f.talkBack||=g,f.tapsDelivered++},v=this.captureTransitionRevision();try{if(o(a),n.display!==void 0)return{...await this.executeOnDisplay(n,n.display,{onTapDelivered:T,signal:a,onDispatchCompleted:()=>{f.displayCompleted=!0},onActivationWarnings:b}),...y.size?{warnings:[...y]}:{}};if(this.hasStaleCallerRevision(this.displayTransitionReader.revision(this.device.deviceId)))return ir({success:!1,x:C(n).x,y:C(n).y,action:c},this.staleDisplay(v.observedGeneration));let g=null,S=await this.observedInteraction(async()=>{let A=await this.observeScreen.execute({freshness:"cached-ok",signal:a,perf:p});if(g=A,this.currentActionRevision()!==v.revision)return ir({success:!1,x:C(n).x,y:C(n).y,action:c},this.staleDisplay(v.observedGeneration));let I=this.staleSnapshotReason(n,A);if(I)return{success:!1,x:C(n).x,y:C(n).y,action:c,error:I};let P=K(n,A,this.device.platform);if("error"in P)return{success:!1,x:P.x,y:P.y,action:c,error:P.error};switch(m=P,this.assertDisplayRevisionCurrent(v),o(a),this.device.platform){case"android":{if(n.pointer){await this.dispatchStylusTapAt(n,P,v,a),T();break}let pe=await this.androidTalkBack.resolveState(a,b);f.talkBack=pe,await this.androidDispatcher.dispatchAndroidTaps(n,P,A,{transitionRevision:v,perf:p,signal:a,onTapDelivered:T,talkBackEnabled:pe,onActivationWarnings:b});break}case"ios":h=await this.dispatchIosTapsWithOneFreshRetry(n,P,A,{transitionRevision:v,onTapDelivered:T,signal:a});break;default:throw yt(this.device.platform,"tap at coordinates")}return{success:!0,x:P.x,y:P.y,action:c}},{changeExpected:!1,progress:s,perf:p,signal:a,skipPreviousObserve:!0,observationTimestampProvider:()=>h,predictionContext:{toolName:"tapAt",toolArgs:{...n,action:c,platform:this.device.platform}}});return this.annotateDeviceLock(S,g),{...S,...y.size?{warnings:[...y]}:{}}}catch(g){if(g instanceof G)throw g;return this.rethrowObservationAbort(g,a,f.displayCompleted),this.createDispatchFailure(g,n,m,f)}finally{p.end()}}captureTransitionRevision(){return{revision:this.currentActionRevision(),observedGeneration:this.renderedDisplayGeneration(this.device.deviceId)??this.displayTransitionReader.identityRevision(this.device.deviceId)}}createDispatchFailure(n,s,a,d){let c=s.action??"tap",{tapsDelivered:p,talkBack:m}=d;e.warn(`tapAt dispatch failed: ${r(n)}`,n);let h=a??Xe(s,this.device.platform),f=ir({success:!1,x:h.x,y:h.y,error:`Failed to tap at coordinates: ${r(n)}`,action:c},n);if(m&&c!=="longPress"){if(n instanceof mr&&p===3)f.error+=" A TalkBack focus touch and an activation double tap were delivered."}else f.error+=n instanceof mr?` ${p} ${p===1?"tap was":"taps were"} delivered.`:rQ(c,p);return f}async dispatchIosTapsWithOneFreshRetry(n,s,a,d){let{transitionRevision:c,signal:p}=d,m=a.viewHierarchy?.frameContext;try{return await this.dispatchIosTaps(n,s,m,d)}catch(h){o(p);let f=u(h,"Failed to dispatch iOS coordinate tap");if(m===void 0||!Aa(f.message))throw f;let y=await this.observeScreen.execute({freshness:"fresh",signal:p});this.assertDisplayRevisionCurrent(c),this.assertSnapshotCurrent(n,y);let b=this.resolveFreshFrameRetry(n,s,a,y);if(!b||!zd(a,y,!0))throw f;return await this.dispatchIosTaps(n,b.point,b.frameContext,d)}}async dispatchIosTaps(n,s,a,d){let{transitionRevision:c,onTapDelivered:p,signal:m}=d;this.assertDisplayRevisionCurrent(c),await this.dispatchIosCoordinateTap(n.action,s,{durationMs:GS(n,"ios"),frameContext:a,signal:m});try{if(p(),n.action==="doubleTap")p();return o(m),this.timer.now()}finally{this.invalidateIosCacheSafely()}}async dispatchIosCoordinateTap(n,s,a){let{durationMs:d,frameContext:c,signal:p}=a,m=n==="doubleTap"?this.iosDoubleTap:this.iosCoordinateTap;await iQ(()=>m(this.iosClient,s,{durationMs:d,frameContext:c,options:{signal:p}}),this.isIosVoiceOverOn)}invalidateIosCacheSafely(){try{this.invalidateIosCache()}catch(n){e.warn(`tapAt iOS cache invalidation failed: ${r(n)}`,n)}}async dispatchDisplayTalkBackTapWithOneFreshRetry(n,s,a,d){let{signal:c,assertCurrent:p}=d,m=a.viewHierarchy?.frameContext,h=!1,f=!1,y={assertCurrent:p,onTapDelivered:()=>{h=!0,d.onTapDelivered()},onDispatched:()=>{f=!0},onActivationWarnings:d.onActivationWarnings};try{await this.androidTalkBack.dispatchTap(n,s,m,{signal:c,context:y})}catch(b){o(c);let T=u(b,"Failed to dispatch Android coordinate tap");if(h||f||m===void 0||!Aa(T.message))throw T;let v=await this.observeScreen.execute({display:a.display.key,freshness:this.retryFreshness(n),signal:c});p(),this.assertSnapshotCurrent(n,v);let g=this.resolveFreshFrameRetry(n,s,a,v);if(v.display.key!==a.display.key||!g)throw T;await this.androidTalkBack.dispatchTap(n,g.point,g.frameContext,{signal:c,context:y})}}resolveFreshFrameRetry(n,s,a,d){let c=K(n,d,this.device.platform),p=d.viewHierarchy?.frameContext;if("error"in c||c.x!==s.x||c.y!==s.y||!p||this.device.platform!=="ios"&&p===a.viewHierarchy?.frameContext)return;if(!n.snapshotId&&!Te(a,d))throw new t("Stale frame context: screen layout changed since the last observation. Observe again and recompute coordinates, or pass a fresh snapshotId.");return{point:c,frameContext:p}}assertDisplayRevisionCurrent(n){if(this.currentActionRevision()!==n.revision)throw this.staleDisplay(n.observedGeneration)}currentActionRevision(){return this.device.platform==="ios"?this.displayTransitionReader.identityRevision(this.device.deviceId):this.displayTransitionReader.revision(this.device.deviceId)}staleSnapshotReason(n,s){return n.snapshotId?this.snapshotReferences.staleReason(n.snapshotId,this.device.deviceId,s):void 0}assertSnapshotCurrent(n,s){let a=this.staleSnapshotReason(n,s);if(a)throw new t(a)}retryFreshness(n){return n.snapshotId?"fresh":"cached-ok"}hasStaleCallerRevision(n){let s=this.renderedDisplayRevision(this.device.deviceId);if(s===void 0)return!1;return this.device.platform==="ios"?!this.displayTransitionReader.sameIdentitySince(this.device.deviceId,s):s!==n}async dispatchAndroidDisplayGesture(n,s,a,d){let{displayId:c,signal:p}=d;if(await Ra(this.androidClient,c)){o(p),d.assertCurrent();let m=!1,h=()=>{m=!0},f=await this.androidClient.requestTapCoordinates({x:n.x,y:n.y,duration:s,timeoutMs:Jv(s),onDispatch:h,signal:p,displayId:c===0?void 0:c,beforeSend:d.assertCurrent});if(f.success)d.onTapDelivered();if(o(p),f.success)return;if(m)throw fn(f.error);if(Aa(f.error))throw new t(f.error??"Stale frame context");e.warn(`[TapAtCoordinate] dispatchGesture tap failed (${f.error}), falling back to ADB input`)}o(p),d.assertCurrent(),await dc(this.adb,a,c,{signal:p,assertCurrent:d.assertCurrent,timeoutMs:s>=Pa?Br(s):void 0}),d.onTapDelivered(),o(p)}async dispatchGesture(n,s,a,d){let{signal:c,displayId:p}=d,m=n.action??"tap",h=GS(n,this.device.platform),f=async()=>{if(o(c),d.assertCurrent(),this.device.platform==="android"){let y=m==="longPress"?`swipe ${s.x} ${s.y} ${s.x} ${s.y} ${h}`:`tap ${s.x} ${s.y}`;await this.dispatchAndroidDisplayGesture(s,h,y,d)}else if(this.device.platform==="ios"){if(await this.dispatchIosCoordinateTap(m,s,{durationMs:h,frameContext:a.viewHierarchy?.frameContext,signal:c}),d.onTapDelivered(),m==="doubleTap")d.onTapDelivered()}else throw yt(this.device.platform,"tapAt gesture")};if(this.device.platform==="android"&&m==="doubleTap"){await Eh({client:await Ra(this.androidClient,p)?this.androidClient:void 0,point:s,displayId:p===0?void 0:p,timer:this.timer,signal:c,assertCurrent:d.assertCurrent,onTapDelivered:d.onTapDelivered,onWarning:d.onWarning,tap:()=>f()});return}if(await f(),this.device.platform==="ios"){try{o(c)}finally{this.invalidateIosCacheSafely()}return}}}
7
+ export{Lu,k4,Ky,Z7,E4,Wd,Nq,I4,Fq,Lq,_4,Bq,jx,Kx,Lc,Gx};
8
+
9
+ //# debugId=D068B0E45153285164756E2164756E21
@@ -0,0 +1,4 @@
1
+ // @bun
2
+ import{Hre,Wt,qre}from"./chunk-32jpxz2y.js";import"./chunk-z8t0v07j.js";import"./chunk-mf9spd4g.js";export{Hre as InMemoryDbWriteBarrier,Wt as getDbWriteBarrier,qre as resetDbWriteBarrier};
3
+
4
+ //# debugId=C518DFF463F4317D64756E2164756E21
@@ -0,0 +1,4 @@
1
+ // @bun
2
+ import"./chunk-mf9spd4g.js";import{i}from"./chunk-z8t0v07j.js";import{ke,$r}from"./chunk-32jpxz2y.js";class r{resolveDatabase;timer;constructor({resolveDatabase:e=ke,timer:o=i}={}){this.resolveDatabase=e,this.timer=o}async list(e){let o=await this.resolveDatabase().selectFrom("session_tool_overrides").select(["tool_name","enabled"]).where("session_uuid","=",e).execute();return new Map(o.map((s)=>[s.tool_name,s.enabled!==0]))}async set(e,o,s){await this.resolveDatabase().insertInto("session_tool_overrides").values({session_uuid:e,tool_name:o,enabled:s?1:0}).onConflict((t)=>t.columns(["session_uuid","tool_name"]).doUpdateSet({enabled:s?1:0,updated_at:$r(this.timer)})).execute()}async setMany(e,o){if(o.length===0)return;let s=$r(this.timer);await this.resolveDatabase().transaction().execute(async(t)=>{for(let n of o)await t.insertInto("session_tool_overrides").values({session_uuid:e,tool_name:n.toolName,enabled:n.enabled?1:0}).onConflict((a)=>a.columns(["session_uuid","tool_name"]).doUpdateSet({enabled:n.enabled?1:0,updated_at:s})).execute()})}async deleteSession(e){await this.resolveDatabase().deleteFrom("session_tool_overrides").where("session_uuid","=",e).execute()}}export{r as SqliteSessionToolSelectionRepository};
3
+
4
+ //# debugId=791F67D4D6BB860864756E2164756E21
@@ -0,0 +1,14 @@
1
+ // @bun
2
+ import{ui,Fl,Oo,Fp}from"./chunk-nwm2pq5v.js";import{Nr,e}from"./chunk-z8t0v07j.js";import{w,$u,Qn,is,TT,ct,Kc,Xu,Zu,ou,Sn,yc}from"./chunk-h3n4adc6.js";import{Hl}from"./chunk-a2sc4jm0.js";import{t}from"./chunk-9rkfyt6q.js";var D={success:"boolean",error:"string"};function Tu(n,i,o){if(n.hasStructured)n.envelope.structuredContent=i;if(n.textPart)n.textPart.text=o??yc(i);E(n.envelope,i)}function E(n,i){let o=n;for(let[s,r]of Object.entries(D)){if(!(s in o))continue;if(typeof i[s]===r)o[s]=i[s];else delete o[s]}}var WE=["getAndroid","getApple","startDevice","provisionDevice"],Nb=`Call ${$u.length>2?`${$u.slice(0,-1).join(", ")}, or ${$u[$u.length-1]}`:$u.join(" or ")} to acquire a new device session.`;function P(n,i){if(!i||i.releaseReason!=="heartbeat-timeout"&&i.releaseReason!=="missing-first-heartbeat")return n;let{ageMs:o,timeoutMs:s}=i.heartbeat,r=i.releaseReason==="heartbeat-timeout"?s+is:s;return`${n} No heartbeat for ${o} ms (limit ${r} ms; set AUTOMOBILE_SESSION_HEARTBEAT_TIMEOUT_MS to change).`}function RM(n){return{error:{code:"no_active_device_session",message:n.message,reason:n.reason,...ui(n.reason),...v()}}}function v(n){return{retryable:!1,nextAction:Qn,...n===void 0?{}:{ownerPid:n},recovery:{action:"acquire_replacement_session",tools:[...$u]}}}function zE(n){if(!pG(n))return;let i=Sn(n)?.payload,o=i?.error,s=o!==null&&typeof o==="object"&&!Array.isArray(o)?o:i,{sessionUuid:r,reason:a}=s??{};return{...typeof r==="string"&&r.length>0?{sessionUuid:r}:{},...typeof a==="string"&&a.length>0?{reason:a}:{}}}function RP({message:n,sessionUuid:i,reason:o,release:s,idleTimeoutMs:r}){return{error:{code:Oo,message:P(n,s),sessionUuid:i,reason:o,...ui(o),...Fl(o,r??s?.cliIdleTimeoutMs),...v(s?.ownerPid),...s?{release:s}:{}}}}function PM(n){let i=Fp(n);if(!i)return;return RP({message:i.message,sessionUuid:i.sessionUuid,reason:i.releaseReason,idleTimeoutMs:i.details.idleTimeoutMs})}function jE(n){if(!(n instanceof Error)||n.name!=="SessionRecoveryIdentityLossError")return;let i=(u)=>Reflect.get(n,u),o=i("sessionUuid"),s=i("terminalReleaseReason"),r=i("reason");if(typeof o!=="string"||typeof s!=="string"||typeof r!=="string")return;let a=i("target"),c=a!==null&&typeof a==="object"?Reflect.get(a,"deviceId"):void 0,d=i("deviceId")??c,l=i("ownerPid");return{message:n.message,sessionUuid:o,reason:s,recoveryReason:r,...typeof d==="string"?{deviceId:d}:{},...typeof l==="number"?{ownerPid:l}:{}}}function lG(n){return{sessionUuid:n.sessionUuid,reason:n.reason,...ui(n.reason),recoveryReason:n.recoveryReason,...n.deviceId===void 0?{}:{deviceId:n.deviceId},...n.ownerPid===void 0?{}:{ownerPid:n.ownerPid}}}function x8(n){let{error:i}=RP({message:n.message,sessionUuid:n.sessionUuid,reason:n.reason});return{error:{...i,...v(n.ownerPid),...lG(n)}}}function Fr(n){return WE.includes(n)}function AM(n){let i=Sn(n)?.payload,o=i?.runtime,s=o&&typeof o==="object"?o.session:void 0,a=(s&&typeof s==="object"?s.sessionUuid:void 0)??i?.sessionId;return typeof a==="string"&&a.trim().length>0?a:void 0}function S(n){let i=Sn(n)?.payload;if(!i||"platform"in i||"runtime"in i)return i;let o=i.device;if(o&&typeof o==="object"&&!Array.isArray(o))return o;return}function C8(n){let i=S(n)?.runtime;if(!i||typeof i!=="object"||!("deviceId"in i))return;let{deviceId:o}=i;return typeof o==="string"&&o.trim().length>0?o:void 0}function TM(n){let i=Sn(n)?.payload,o=i?.sessionUuid;if(typeof o!=="string"||o.trim().length===0)return;let s=i?.deviceId;return typeof s==="string"&&s.trim().length>0?{sessionUuid:o,deviceId:s}:{sessionUuid:o}}function D8(n){let i=S(n)?.platform;return i==="android"||i==="ios"?i:void 0}function uG(n){if(!n||typeof n!=="object"||!("isError"in n)||n.isError!==!0)return!1;let i=Sn(n)?.payload?.error;return i!==null&&typeof i==="object"&&"code"in i&&i.code===Hl}function ry(n){return n==="setActiveDevice"||Fr(n)}function O8(n){if(!n||typeof n!=="object"||!("isError"in n)||n.isError!==!0)return;let i=Sn(n)?.payload;if(!i||i.code!==Kc&&i.code!==Xu)return;let{retryAfterMs:o}=i;return typeof o==="number"&&Number.isFinite(o)&&o>=0?{retryAfterMs:o}:{}}function M8(n){if(!uG(n))return;let i=Sn(n)?.payload?.error;if(!i||typeof i!=="object"||!("sessionUuid"in i)||typeof i.sessionUuid!=="string"||!("remainingMs"in i)||typeof i.remainingMs!=="number"||!Number.isFinite(i.remainingMs))return;return{sessionUuid:i.sessionUuid,remainingMs:i.remainingMs}}var I=["session_ownership_lost","no_active_device_session",Zu];function h(n){return typeof n.code==="string"&&I.includes(n.code)||n.nextAction===Qn}function pG(n){if(!n||typeof n!=="object"||n.isError!==!0)return!1;let i=n.content;if(!n.structuredContent&&!Array.isArray(i))return!1;let s=Sn(n,(a)=>{e.debug("[MCP] Session-invalid probe: error result was not JSON",{error:a})})?.payload;if(!s)return!1;if(h(s))return!0;let r=s.error;return r!==null&&typeof r==="object"&&!Array.isArray(r)&&h(r)}function x(n){return typeof n==="object"&&n!==null}function Di(n,i){let o=n.params;if(o&&typeof o==="object"&&Object.hasOwn(o,i))return o[i];return x(n)?n[i]:void 0}var R=(n)=>typeof n==="object"&&n!==null&&!Array.isArray(n),ny=(n)=>{let i=[],o=[],s=!1,r=!1;if(!n)return{labels:i,definitions:o,hasDefinitions:s,hasLabels:r};for(let a of n){if(typeof a==="string"){i.push(a),r=!0;continue}if(R(a)){i.push(a.label),o.push(a),s=!0;continue}}return{labels:i,definitions:o,hasDefinitions:s,hasLabels:r}},N8=(n)=>ny(n).labels,F8=(n,i)=>ny(n).definitions.find((o)=>o.label===i)?.platform;function p(n){return`${n.positions.join(",")}|${n.arrived.map((i)=>i?1:0).join("")}`}function f(n,i,o){return n[o].events[i.positions[o]]}function L(n,i){return n.every((o,s)=>i.positions[s]>=o.events.length)}function b(n,i,o){let s=[];for(let r=0;r<n.length;r++)if(i.arrived[r]&&f(n,i,r)?.lock===o)s.push(r);return s}function _(n,i,o){let s=f(n,i,o),r=[...i.positions],a=[...i.arrived],c=[...b(n,i,s.lock),o];if(c.length<s.deviceCount)return a[o]=!0,{state:{positions:r,arrived:a}};for(let l of c)r[l]+=1,a[l]=!1;let d=c.map((l)=>n[l].device).sort().join(", ");return{state:{positions:r,arrived:a},release:`"${s.lock}" {${d}}`}}function A(n,i){let o=[];for(let s=0;s<n.length;s++)if(!i.arrived[s]&&f(n,i,s)!==void 0)o.push(_(n,i,s));return o}function O(n){return n.positions.reduce((i,o)=>i+o,0)}function T(n,i){let o=[],s=i;while(s!==void 0){let r=n.get(s);if(r?.release)o.push(r.release);s=r?.parent}return o.reverse()}function U(n,i,o){let{state:s}=o,r=[],a=[];for(let c=0;c<n.length;c++){let d=f(n,s,c);if(d===void 0){a.push(n[c].device);continue}let l=b(n,s,d.lock).map((u)=>n[u].device);r.push({device:n[c].device,event:d,waitingWith:l})}return{stalled:r,finished:a,releasedGenerations:T(i,o.key)}}function g(n,i){let o=i;while(n.get(o)!==o)o=n.get(o);return o}function M(n){let i=new Map,o=(r,a)=>{let c=`${r}:${a}`;if(!i.has(c))i.set(c,c);return c};for(let r of n){let a=o("device",r.device);for(let c of r.events)i.set(g(i,o("lock",c.lock)),g(i,a))}let s=new Map;for(let r of n){let a=g(i,`device:${r.device}`);s.set(a,[...s.get(a)??[],r])}return Array.from(s.values())}function y(n,i=1e4){for(let o of M(n)){let r=o.some((a)=>a.events.some((c)=>c.unmodeled===!0))?null:N(o,i);if(r!==null)return r}return null}function N(n,i){let o={positions:n.map(()=>0),arrived:n.map(()=>!1)},s=new Map([[p(o),{}]]),r=[o],a;while(r.length>0){let c=r.pop();if(L(n,c))return null;let d=p(c),l=A(n,c);if(l.length===0){let u=O(c);if(a===void 0||u>a.progress)a={key:d,state:c,progress:u};continue}for(let u of l){let m=p(u.state);if(s.has(m))continue;if(s.size>=i)return null;s.set(m,{parent:d,release:u.release}),r.push(u.state)}}return a===void 0?null:U(n,s,a)}function j(n){let{device:i,event:o,waitingWith:s}=n;return`device "${i}" waits at ${o.tool} lock "${o.lock}" (step ${o.stepIndex}; ${s.length}/${o.deviceCount} arrived: ${s.join(", ")})`}function C(n){let i=Array.from(new Set(n.stalled.map((r)=>`"${r.event.lock}"`))),o=n.releasedGenerations.length>0?n.releasedGenerations.join(" -> "):"none",s=n.finished.length>0?` Tracks already finished (cannot arrive again): ${n.finished.join(", ")}.`:"";return`barrier/criticalSection coordination can never complete: under every possible arrival order at least one device track deadlocks. One reachable stall: ${n.stalled.map(j).join("; ")}. Locks involved: ${i.join(", ")}. Generations released before the stall: ${o}.${s} Each device's track runs sequentially, so a device blocked at one lock never reaches the later lock its peers are waiting at. Reorder the coordination steps so devices visit shared locks in a consistent order, or add the arrivals the stalled locks are missing.`}var B=new Set(["barrier","criticalSection"]);function iy(n){return B.has(n)}function k(n){return typeof n==="string"&&n.length>0}function F(n){return typeof n==="number"&&Number.isInteger(n)&&n>=1}function V(n){return typeof n==="object"&&n!==null}var G=new Set(["android","ios","tvos"]);class Rf{static validate(n){if(!n.name||typeof n.name!=="string")throw new t("Plan must have a valid name");if(!n.steps||!Array.isArray(n.steps))throw new t("Plan must have a steps array");if(this.validateMultiDeviceRequirements(n),n.devices!==void 0)this.validateDevicesField(n),this.validateDeviceLabelsPresent(n);this.validateCoordinationLocks(n)}static validateUntrusted(n){if(!V(n))throw new t("Plan must have a valid name");this.validate(n)}static validateDevicesField(n){if(!Array.isArray(n.devices))throw new t("Plan 'devices' field must be an array of device labels");if(n.devices.length===0)throw new t("Plan 'devices' array cannot be empty. Remove the field or specify at least one device.");let{labels:i,definitions:o,hasDefinitions:s,hasLabels:r}=ny(n.devices);if(s&&r)throw new t("Plan 'devices' must be a list of labels or a list of objects with label/platform (do not mix formats).");if(s)for(let c of o)this.validateDeviceDefinition(c);if(i.length!==n.devices.length)throw new t("Plan 'devices' entries must be strings or objects with label/platform.");if(new Set(i).size!==i.length)throw new t(`Plan 'devices' array contains duplicate labels: [${i.join(", ")}]`);for(let c of i)if(typeof c!=="string"||c.trim()==="")throw new t(`Invalid device label: ${JSON.stringify(c)}. Device labels must be non-empty strings.`)}static validateDeviceDefinition(n){if(!n.label||n.label.trim()==="")throw new t(`Invalid device label: ${JSON.stringify(n.label)}. Device labels must be non-empty strings.`);if(!n.platform||!G.has(n.platform))throw new t(`Invalid device platform for ${n.label}: ${JSON.stringify(n.platform)}.`)}static validateDeviceLabelsPresent(n){if(!n.devices||n.devices.length===0)return;let i=new Set(ny(n.devices).labels),o={mismatchedInCriticalSection:[],missingLabels:[],invalidLabels:[],missingInCriticalSection:[],invalidInCriticalSection:[]};for(let l=0;l<n.steps.length;l++){let u=n.steps[l];if(this.recordStepDeviceLabel(u,l,i,o),u.tool==="criticalSection")this.recordCriticalSectionDeviceLabels(u,l,i,o)}let{missingLabels:s,invalidLabels:r,missingInCriticalSection:a,invalidInCriticalSection:c}=o,d=[...o.mismatchedInCriticalSection];if(s.length>0){let l=s.map((u)=>`step ${u.index} (${u.tool})`).join(", ");d.push(`Plan declares 'devices' field but the following steps are missing 'device' parameter: ${l}`)}if(r.length>0){let l=r.map((u)=>`step ${u.index} (${u.tool}): device="${u.device}"`).join(", ");d.push(`Plan declares devices [${Array.from(i).join(", ")}] but the following steps use invalid device labels: ${l}`)}if(a.length>0){let l=a.map((u)=>`step ${u.parentIndex}.steps[${u.subIndex}] (${u.tool})`).join(", ");d.push(`Every step inside a criticalSection must declare a 'device' parameter, but the following sub-steps are missing it: ${l}`)}if(c.length>0){let l=c.map((u)=>`step ${u.parentIndex}.steps[${u.subIndex}] (${u.tool}): device="${u.device}"`).join(", ");d.push(`Plan declares devices [${Array.from(i).join(", ")}] but the following criticalSection sub-steps use invalid device labels: ${l}`)}if(d.length>0)throw new t(d.join(`
3
+ `))}static recordStepDeviceLabel(n,i,o,s){let r=Di(n,"device");if(r===void 0||r===null||r==="")s.missingLabels.push({index:i,tool:n.tool});else if(typeof r!=="string"||!o.has(r))s.invalidLabels.push({index:i,tool:n.tool,device:String(r)})}static recordCriticalSectionDeviceLabels(n,i,o,s){let r=n.params?.steps;if(!Array.isArray(r))return;let a=Di(n,"device"),c=typeof a==="string"&&o.has(a)?a:void 0;for(let d=0;d<r.length;d++)this.recordCriticalSectionSubstepLabel(r[d],i,d,{labelErrors:s,deviceSet:o,ownerDevice:c})}static recordCriticalSectionSubstepLabel(n,i,o,{labelErrors:s,deviceSet:r,ownerDevice:a}){if(!n||typeof n!=="object")return;let d=n.params?.device,l=String(n.tool??"unknown");if(d===void 0||d===null||d==="")s.missingInCriticalSection.push({parentIndex:i,subIndex:o,tool:l});else if(typeof d!=="string"||!r.has(d))s.invalidInCriticalSection.push({parentIndex:i,subIndex:o,tool:l,device:String(d)});else if(a!==void 0&&d!==a)s.mismatchedInCriticalSection.push(`step ${i}.steps[${o}] (${l}): device="${d}" differs from criticalSection owner device="${a}". Put it in its own step for that device or use a separate criticalSection step.`)}static validateCoordinationLocks(n){this.validateNoAuthoredLockNamespace(n),this.validateCriticalSectionLocks(n),this.validateBarrierParams(n),this.validateCoordinationTimeouts(n),this.validateNoCrossToolLockSharing(n),this.validateBarrierConsistentDeviceCount(n),this.validateBarrierDistinctDeviceCounts(n),this.validateBarrierGenerationCompleteness(n),this.validateBarrierExcessDeviceArrivals(n),this.validateCoordinationScheduleFeasibility(n)}static validateCoordinationScheduleFeasibility(n){let i=this.collectCoordinationTracks(n);if(i===null||i.length<2)return;let o=y(i);if(o!==null)throw new t(C(o))}static collectCoordinationTracks(n){let i=new Map;for(let o=0;o<n.steps.length;o++){let s=n.steps[o];if(!iy(s.tool))continue;let r=this.resolveCoordinationEvent(s,o);if(r===null)return null;let a=i.get(r.device)??{device:r.device,events:[]};a.events.push(r.event),i.set(r.device,a)}return Array.from(i.values())}static resolveCoordinationEvent(n,i){let o=Di(n,"device"),s=Di(n,"lock"),r=Di(n,"deviceCount");if(!k(o)||!k(s)||!F(r))return null;let a=n.optional===!0||this.hasNestedCoordination(n);return{device:o,event:{tool:n.tool,lock:s,deviceCount:r,stepIndex:i,unmodeled:a}}}static hasNestedCoordination(n){let i=Di(n,"steps");if(!Array.isArray(i))return!1;return i.some((o)=>typeof o==="object"&&o!==null&&("tool"in o)&&iy(String(o.tool)))}static validateCoordinationTimeouts(n){let i=[];for(let o=0;o<n.steps.length;o++){let s=n.steps[o];if(s.tool!=="criticalSection"&&s.tool!=="barrier")continue;let r=Di(s,"timeout");if(r===void 0)continue;if(typeof r!=="number"||!Number.isInteger(r)||r<1||r>Nr)i.push(`${s.tool} step ${o} declares 'timeout' of ${JSON.stringify(r)}, which must be a positive integer no greater than setTimeout's usable range (${Nr}ms, ~24.8 days) -- Node/Bun clamp larger delays to 1ms instead of honoring them.`)}if(i.length>0)throw new t(i.join(`
4
+ `))}static validateNoAuthoredLockNamespace(n){let i=[];for(let o=0;o<n.steps.length;o++){let s=n.steps[o];if(Di(s,"__lockNamespace")!==void 0)i.push(`step ${o} (${s.tool}) sets '__lockNamespace', which is a reserved field injected internally by the plan executor. Authored plans must not set it.`)}if(i.length>0)throw new t(i.join(`
5
+ `))}static validateNoCrossToolLockSharing(n){let i=new Set,o=new Set;for(let r of n.steps){if(r.tool!=="criticalSection"&&r.tool!=="barrier")continue;let a=Di(r,"lock");if(typeof a!=="string"||a.length===0)continue;(r.tool==="criticalSection"?i:o).add(a)}let s=Array.from(i).filter((r)=>o.has(r));if(s.length>0)throw new t(`lock name${s.length===1?"":"s"} ${s.map((r)=>`"${r}"`).join(", ")} ${s.length===1?"is":"are"} used by both a criticalSection step and a barrier step. Both tools share the runtime coordinator's lock namespace and expected-count state, so mixing tool types on the same lock name is racy and can pair mismatched participants or overwrite the expected count. Use a distinct lock name per tool type.`)}static validateCriticalSectionLocks(n){let i=this.collectCriticalSectionLockUsage(n),o=[];for(let[s,r]of i.entries())this.validateCriticalSectionLock(s,r,o);if(o.length>0)throw new t(o.join(`
6
+ `))}static collectCriticalSectionLockUsage(n){let i=new Map;for(let o=0;o<n.steps.length;o++){let s=n.steps[o];if(s.tool!=="criticalSection")continue;let r=Di(s,"lock");if(typeof r!=="string"||r.length===0)continue;let a=i.get(r)??[];a.push({stepIndex:o,device:Di(s,"device"),deviceCount:Di(s,"deviceCount")}),i.set(r,a)}return i}static validateCriticalSectionLock(n,i,o){let s=new Set(i.map((a)=>a.deviceCount).filter((a)=>typeof a==="number"));if(s.size>1){let a=i.map((c)=>`step ${c.stepIndex} deviceCount=${String(c.deviceCount)}`).join(", ");o.push(`criticalSection lock "${n}" has inconsistent deviceCount values: ${a}. All steps sharing a lock must declare the same deviceCount.`);return}let r=s.size===1?s.values().next().value:void 0;if(r!==void 0&&i.length!==r)o.push(`criticalSection lock "${n}" declares deviceCount=${r} but ${i.length} step${i.length===1?"":"s"} reference${i.length===1?"s":""} it. Every participating device needs its own criticalSection step with this lock.`);this.validateCriticalSectionDevices(n,i,o)}static validateCriticalSectionDevices(n,i,o){let s=new Map;for(let r of i){if(typeof r.device!=="string"||r.device.length===0)continue;let a=s.get(r.device)??[];a.push(r.stepIndex),s.set(r.device,a)}for(let[r,a]of s.entries())if(a.length>1)o.push(`criticalSection lock "${n}" is entered twice by device "${r}" (steps ${a.join(", ")}). Each device can participate in a given lock at most once.`)}static validateBarrierParams(n){let i=[];for(let o=0;o<n.steps.length;o++){let s=n.steps[o];if(s.tool!=="barrier")continue;let r=Di(s,"lock");if(typeof r!=="string"||r.length===0)i.push(`barrier step ${o} is missing a non-empty 'lock' parameter.`);let a=Di(s,"deviceCount");if(typeof a!=="number"||!Number.isInteger(a)||a<1)i.push(`barrier step ${o} must declare a positive integer 'deviceCount', got ${JSON.stringify(a)}.`)}if(i.length>0)throw new t(i.join(`
7
+ `))}static validateBarrierDistinctDeviceCounts(n){let i=this.collectBarrierLockUsage(n),o=[];for(let[s,r]of i.entries())for(let a of r.deviceCounts)if(r.devices.size<a){let c=Array.from(r.devices).join(", ")||"none";o.push(`barrier lock "${s}" declares deviceCount=${a} but only ${r.devices.size} distinct device${r.devices.size===1?"":"s"} (${c}) ever target it in this plan. No round can ever complete.`)}if(o.length>0)throw new t(o.join(`
8
+ `))}static validateBarrierConsistentDeviceCount(n){let i=this.collectBarrierLockUsage(n),o=[];for(let[s,r]of i.entries()){if(r.deviceCounts.size<=1)continue;let a=Array.from(r.deviceCounts).sort((c,d)=>c-d).join(", ");o.push(`barrier lock "${s}" is reused with inconsistent deviceCount values (${a}). The runtime coordinator keeps a single shared expected count per lock name, so mixed-count reuse is racy and can deadlock depending on arrival order. Use a distinct lock name for each deviceCount instead.`)}if(o.length>0)throw new t(o.join(`
9
+ `))}static validateBarrierGenerationCompleteness(n){let i=this.collectBarrierLockUsage(n),o=[];for(let[s,r]of i.entries()){if(r.deviceCounts.size!==1)continue;let a=r.deviceCounts.values().next().value;if(a<1||r.arrivals%a===0)continue;o.push(`barrier lock "${s}" has ${r.arrivals} total arrival${r.arrivals===1?"":"s"} across the plan, which is not a multiple of its deviceCount=${a}. At least one generation is necessarily incomplete and would deadlock waiting for a device that never arrives.`)}if(o.length>0)throw new t(o.join(`
10
+ `))}static validateBarrierExcessDeviceArrivals(n){let i=this.collectBarrierLockUsage(n),o=[];for(let[s,r]of i.entries()){if(r.deviceCounts.size!==1)continue;let a=r.deviceCounts.values().next().value;if(a<1||r.arrivals%a!==0)continue;let c=r.arrivals/a;for(let[d,l]of r.deviceOccurrences.entries()){if(l<=c)continue;o.push(`barrier lock "${s}" has ${c} generation${c===1?"":"s"} available (deviceCount=${a}, ${r.arrivals} total arrivals), but device "${d}" arrives ${l} times. A device can participate in a lock at most once per generation, since each device's track executes sequentially, so this device would deadlock waiting for a generation that never admits it again.`)}}if(o.length>0)throw new t(o.join(`
11
+ `))}static collectBarrierLockUsage(n){let i=new Map;for(let o of n.steps)if(o.tool==="barrier")this.recordBarrierLockUsage(i,o);return i}static recordBarrierLockUsage(n,i){let o=Di(i,"lock");if(typeof o!=="string"||o.length===0)return;let s=n.get(o)??{devices:new Set,deviceCounts:new Set,arrivals:0,deviceOccurrences:new Map};s.arrivals+=1;let r=Di(i,"device");if(typeof r==="string"&&r.length>0)s.devices.add(r),s.deviceOccurrences.set(r,(s.deviceOccurrences.get(r)??0)+1);let a=Di(i,"deviceCount");if(typeof a==="number"&&Number.isInteger(a)&&a>=1)s.deviceCounts.add(a);n.set(o,s)}static hasMultiDeviceFeatures(n){if(n.devices&&n.devices.length>0)return!0;for(let i of n.steps){if(i.tool==="criticalSection"||i.tool==="barrier")return!0;if(i.params?.device!==void 0)return!0}return!1}static validateMultiDeviceRequirements(n){if(this.hasMultiDeviceFeatures(n)&&(!n.devices||n.devices.length===0))throw new t("Plan uses multi-device features (device labels or criticalSection/barrier) but does not declare 'devices' field. Add a 'devices' array at the top level of your plan.")}}function xp(n,i){return Math.round(Math.min(1,Math.max(0,n/i))*1e4)/1e4}function kM(n,i,o=!1){let s=w.sessionManager();if(!s)return;let r=n?s.getSessionForDevice(n)??void 0:void 0;if(!r&&o){let{error:a}=RM({message:(n?`deviceGestureRecording start refused: no session of yours holds device '${n}'. `:"deviceGestureRecording start refused: the session holds no device. ")+"Call getAndroid or getApple to acquire a session on it first.",reason:"device_not_held"});return{success:!1,...a,error:a.message}}if(!n)return;try{ou({action:"deviceGestureRecording start",deviceId:n,ownerSessionUuid:r,requesterSessionUuid:i,sessionManager:s,remedy:TT})}catch(a){if(!(a instanceof ct))throw a;return e.warn(`[DeviceGestureRecording] ${a.message}`),{success:!1,error:a.message,...a.toPayload()}}return}class _1 extends t{payload;code="no_active_device_session";retryable=!1;constructor(n,i){super(n);this.payload=i;this.name="DeviceGestureRecordingStartUnheldError"}toPayload(){return this.payload}get reason(){return this.payload.reason}get nextAction(){return this.payload.nextAction}}function L8(n,i,o=!0){let s=kM(n,i,o);if(!s)return;let r=s.error,a={...s};if(delete a.success,delete a.error,"code"in s&&s.code==="device_owned_by_other_session"&&n)throw new ct("deviceGestureRecording start",n,i,{remedy:TT,message:r});throw new _1(r,a)}
12
+ export{Tu,WE,Nb,RM,zE,RP,PM,jE,lG,x8,Fr,AM,C8,TM,D8,uG,ry,O8,M8,pG,Di,ny,N8,F8,iy,Rf,xp,kM,_1,L8};
13
+
14
+ //# debugId=717265F6F6D4215564756E2164756E21
@@ -0,0 +1,5 @@
1
+ // @bun
2
+ import{i,l,e}from"./chunk-z8t0v07j.js";import{_s,w,Dt,ZV,hn,vn,ep,gc,bn,xa,Iv,hi,oi}from"./chunk-h3n4adc6.js";import{kZ}from"./chunk-nwm2pq5v.js";import{Ur,Uc,Xs}from"./chunk-6d3mmqxt.js";import{r,t}from"./chunk-9rkfyt6q.js";function w$(s){return!s.authEnabled||s.ownsDevice?"owner":"viewer"}function tO(s){if(!s.authEnabled)return{action:"keep"};if(!s.sessionExists)return{action:"end",reason:"session_ended"};if(s.kind==="owner"&&!s.ownsDevice)return{action:"downgrade"};return{action:"keep"}}function rO(s){return{action:"end",reason:s.event}}var u={video_relay:{subscribe:"admission",postHandshake:"mutating"},webrtc:{start:{stream:"mutating",own_lease:"own_lease"},stop:{stream:"mutating",own_lease:"own_lease"},status:"read",list:"read",await:"read"}};function I(s){if(s.transport==="video_relay")return!s.postHandshake&&s.action==="subscribe"?u.video_relay.subscribe:u.video_relay.postHandshake;if(s.action==="start"||s.action==="stop")return u.webrtc[s.action][s.target==="own_lease"?"own_lease":"stream"];let n=u.webrtc,o=Object.hasOwn(n,s.action)?n[s.action]:"mutating";return typeof o==="string"?o:"mutating"}class v extends t{code="viewer_read_only";constructor(){super("Viewer subscriptions may release or renew their own leases; acquire device ownership before changing stream parameters or controlling other subscriptions.");this.name="ViewerReadOnlyError"}}function b(s,n){if(s==="viewer"&&I(n)==="mutating")throw new v}class nO extends t{reason;subscriptionKind;constructor({reason:s,subscriptionKind:n}){super(`WebRTC subscription ended: ${s}; call start to re-subscribe.`);this.name="WebRtcSubscriptionEndedError",this.reason=s,this.subscriptionKind=n}}async function iO(s,n,o="android",{timer:a=i,signal:c,source:d="webrtc-stream-resolve"}={}){let m=await s.getBootedDevices(o);if(await Ur(m,d),m.length===0){if(o==="either")return g(m,n,o);if(o==="android")throw new t("No connected android devices found.");m=await k(s,o,a,{signal:c,source:d})}return g(m,n,o)}function g(s,n,o){let a=o==="either"?"":`${o} `;if(n){let c=s.find((d)=>d.deviceId===n);if(!c)throw new t(`No connected ${a}device with id ${n}.`);return c}if(s.length===0)throw new t("No connected devices found.");if(s.length>1)throw new t(`Multiple connected ${a}devices; specify deviceId. Found: ${s.map((c)=>c.deviceId).join(", ")}`);return s[0]}async function k(s,n,o,{signal:a,source:c}){try{return await new hn(o).executeOrThrow(async()=>{let d=await s.getBootedDevices(n);if(d.length===0)throw Error(`No connected ${n} devices found.`);return await Ur(d,c),d},{delays:[250,500,1000,2000],maxAttempts:5,signal:a})}catch(d){if(a?.aborted)throw d;throw new t(`No connected ${n} devices found (after 5 attempts).`)}}function y(s){let{request:n,context:o}=s;if(!o?.holdsLease)return"stream";return n.action==="stop"||n.leaseId!==void 0&&o.parametersMatch?"own_lease":"stream"}var h="to start a WebRTC stream",C=Uc("WebRTC",()=>import("./chunk-b4cxdzwy.js"));function O(){return w.sessionManager()??null}var W=5000,E=new oi;async function x(s,n="android"){return iO(E,s,n)}function R(s){let n={};if(s.whipEndpoint)n.whipEndpoint=s.whipEndpoint;if(s.whipToken)n.bearerToken=s.whipToken;if(s.iceServers!==void 0)n.iceServers=s.iceServers;if(s.bitrateKbps!==void 0)n.bitrateKbps=s.bitrateKbps;if(s.size)n.size=s.size;if(s.iosSimulatorFps!==void 0)n.iosSimulatorFps=s.iosSimulatorFps;if(s.androidFps!==void 0)n.androidFps=s.androidFps;if(s.audio!==void 0)n.audioEnabled=s.audio;if(s.trickleIce!==void 0)n.trickleIce=s.trickleIce;return n}class D extends xa{injectedDeps;resolvedDeps=null;authenticator;admissionGate;managerModule;removeOwnershipListener=null;removeListeners=[];viewerControlRejections=new Set;closed=!1;closing=null;constructor(s=Dt(ZV),n=i,o,{authenticator:a=bn("webrtcStream",{allowObserverSessions:!0}),admissionGate:c=_s,managerModule:d=C}={}){super(s,n,"WebRtcStream");this.injectedDeps=o,this.authenticator=a,this.admissionGate=c,this.managerModule=d}bypassesRequestChain(s){return s.action==="stop"}onServerStarted(){this.viewerControlRejections.clear(),this.closed=!1,this.closing=null,this.unsubscribeListeners();let s=this.injectedDeps?this.injectedDeps.ownershipChanges:O;this.removeOwnershipListener=s?.()?.onDeviceOwnershipChange((c)=>{this.onOwnershipChanged(c)})??null;let n=this.injectedDeps?this.injectedDeps.sessionReleases:hi,o=()=>{for(let c of this.resolvedDeps?.liveDeviceIds?.()??[])this.onOwnershipChanged(c)},a=this.injectedDeps?this.injectedDeps.observerReleases:Iv;for(let c of[n?.subscribe(o),a?.subscribe(o)])if(c)this.removeListeners.push(c);this.registerLifecycleListeners()}registerLifecycleListeners(){let s=(this.injectedDeps?this.injectedDeps.deviceLifecycle:Xs)?.(),n=s?.onDeviceRemoved((a)=>this.endDeviceStreams({deviceId:a,reason:"device_removed"})),o=s?.onDeviceIdentityChanged((a)=>this.checkDeviceActionable(a));for(let a of[n,o])if(a)this.removeListeners.push(a)}unsubscribeListeners(){this.removeOwnershipListener?.(),this.removeOwnershipListener=null;for(let s of this.removeListeners.splice(0))s()}onOwnershipChanged(s){this.reconcileOwnership(s).catch((n)=>{e.warn(`[WebRtcStream] ownership cleanup failed: ${r(n)}`,n)})}endDeviceStreams(s){if(this.closed)return;this.resolvedDeps?.endStreamsForDevice?.(s).catch((n)=>{e.warn(`[WebRtcStream] lifecycle cleanup failed: ${r(n)}`,n)})}checkDeviceActionable(s){if(this.closed||!this.resolvedDeps?.liveDeviceIds?.().includes(s))return;try{this.admissionGate.assertDeviceActionable(s,h)}catch(n){e.warn(`[WebRtcStream] identity no longer actionable for ${s}: ${r(n)}`),this.endDeviceStreams({deviceId:s,reason:"identity_quarantined"})}}async reconcileOwnership(s){if(this.closed||!this.resolvedDeps?.reconcileOwnership)return;await this.resolvedDeps.reconcileOwnership(s,(n)=>this.resolveLiveIdentity({sessionUuid:n,deviceId:s}))}resolveLiveIdentity(s){try{if(this.authenticator.resolveSubscriptionIdentity)return this.authenticator.resolveSubscriptionIdentity(s);return this.authenticator.authorize({...s,requireOwnership:!0}),{authEnabled:!0,sessionExists:!0,ownsDevice:!0}}catch(n){return e.warn(`[WebRtcStream] subscription identity check failed for deviceId=${s.deviceId}; ending session subscription`),{authEnabled:!0,sessionExists:!1,ownsDevice:!1}}}close(){if(this.closing)return this.closing;return this.closed=!0,this.viewerControlRejections.clear(),this.unsubscribeListeners(),this.closing=l(async()=>{await Promise.all([this.resolvedDeps?.stopAllStreams?.("daemon_shutdown"),super.close()])},{timer:this.timer,timeoutMs:W,label:"WebRTC socket server shutdown"}).catch((s)=>{e.warn(`[WebRtcStream] shutdown cleanup failed: ${r(s)}`,s)}),this.closing}async getDeps(){if(this.injectedDeps)return this.resolvedDeps=this.injectedDeps,this.injectedDeps;if(!this.resolvedDeps){let s=await this.managerModule.load();this.resolvedDeps={resolveDevice:x,startStream:s.startWebRtcStream,stopStream:s.stopWebRtcStream,stopStreamAsOwner:s.stopWebRtcStreamAsOwner,releaseOwnLeases:s.releaseWebRtcStreamOwnLeases,getControlContext:s.getWebRtcStreamControlContext,listStreams:s.listWebRtcStreams,getStream:s.getWebRtcStreamDescriptor,awaitReadiness:s.waitForWebRtcStreamReadiness,reconcileOwnership:s.reconcileWebRtcStreamsForDeviceOwnership,stopAllStreams:s.stopAllWebRtcStreams,getSubscriptionKind:s.getWebRtcSubscriptionKind,liveDeviceIds:s.getWebRtcStreamDeviceIds,endStreamsForDevice:s.endWebRtcStreamsForDevice}}return this.resolvedDeps}async handleRequest(s){try{this.assertOpen(),this.authorizeRequest(s);let n=this.authenticator.resolveSessionIdentity?.(s.sessionUuid)??s.sessionUuid,o=await this.getDeps();if(this.assertOpen(),s.action==="start")return await this.handleStart(o,s,n);let a=o.getSubscriptionKind?.({streamId:s.streamId,leaseId:s.leaseId,sessionUuid:n})??"owner",c=this.requestControlFacts({deps:o,request:s,sessionUuid:n,kind:a});return b(c.stopIdentity?.ownsDevice?"owner":a,{transport:"webrtc",action:s.action,target:c.target}),await this.dispatchRequest({deps:o,request:s,sessionUuid:n,kind:a,...c})}catch(n){return this.subscriptionErrorResponse({request:s,error:n})}}authorizeRequest(s){let n=s.action==="start"||!this.authenticator.resolveSubscriptionIdentity;this.authenticator.authorize({sessionUuid:s.sessionUuid,deviceId:n?s.deviceId:void 0,admitViewer:s.action==="start"})}requestControlFacts(s){let{deps:n,request:o,sessionUuid:a,kind:c}=s;if(o.action!=="start"&&o.action!=="stop")return{target:"stream"};let d=n.getControlContext?.({streamId:o.streamId,leaseId:o.leaseId,sessionUuid:a,deviceId:o.action==="start"?o.deviceId:void 0,overrides:R(o),compareParameters:o.action==="start"&&c==="viewer"});return{target:y({request:o,context:d}),addressedStreamId:d?.streamId,stopIdentity:this.resolveStopIdentity({request:o,deviceId:d?.deviceId})}}resolveStopIdentity(s){if(s.request.action!=="stop"||s.deviceId===void 0)return;let n=this.authenticator.resolveSubscriptionIdentity?.({sessionUuid:s.request.sessionUuid,deviceId:s.deviceId});return n?.authEnabled&&n.sessionExists?n:void 0}logViewerControlRejection(s){let n=this.authenticator.resolveSessionIdentity?.(s.sessionUuid)??s.sessionUuid,o=JSON.stringify([n,s.leaseId,s.action]),a=`[WebRtcStream] rejected viewer control: action=${s.action}`;if(this.viewerControlRejections.has(o)){e.debug(a);return}if(this.viewerControlRejections.add(o),this.viewerControlRejections.size>256){let c=this.viewerControlRejections.values().next().value;if(c!==void 0)this.viewerControlRejections.delete(c)}e.warn(a)}subscriptionErrorResponse({request:s,error:n}){let o=gc(n);if("code"in o)return e.warn(`[WebRtcStream] Ownership refusal: ${r(n)}`,n),{...this.createErrorResponse(s.id,r(n)),...o,errorCode:o.code};if(n instanceof v)return this.logViewerControlRejection(s),{...this.createErrorResponse(s.id,n.message),errorCode:n.code,subscriptionKind:"viewer"};if(n instanceof nO)return e.info(`[WebRtcStream] reporting ended subscription: reason=${n.reason}`),{...this.createErrorResponse(s.id,n.message),reason:n.reason,subscriptionKind:n.subscriptionKind};throw n}async dispatchRequest(s){let{deps:n,request:o,sessionUuid:a,kind:c}=s;switch(o.action){case"start":return this.handleStart(n,o,a);case"stop":return this.handleStop(s);case"status":return this.handleStatus(n,o,a);case"list":return{id:o.id,success:!0,type:"webrtc_stream_response",action:"list",streams:n.listStreams(),subscriptionKind:o.leaseId?c:void 0};case"await":return this.handleAwait(n,o,a);default:throw new t(`Unsupported webrtcStream action: ${o.action}`)}}async handleStop(s){let{deps:n,request:o,sessionUuid:a,kind:c}=s,d={streamId:s.addressedStreamId??o.streamId,leaseId:o.leaseId,sessionUuid:a},m=s.stopIdentity?.ownsDevice&&n.stopStreamAsOwner?await n.stopStreamAsOwner(d):s.stopIdentity&&n.releaseOwnLeases?await n.releaseOwnLeases(d):await n.stopStream(o.streamId,o.leaseId,a);return{id:o.id,success:!0,type:"webrtc_stream_response",action:"stop",stream:m,subscriptionKind:c}}assertRenewalMayControl(s){let{deps:n,request:o,device:a,sessionUuid:c,subscriptionKind:d,renewingLease:m}=s;if(d!=="viewer"||!m)return;let S=n.getControlContext?.({deviceId:a.deviceId,leaseId:o.leaseId,sessionUuid:c,overrides:R(o),compareParameters:!0});b(d,{transport:"webrtc",action:"start",target:y({request:o,context:S})})}subscriberStartOverrides(s,n,o){if(n==="viewer"&&!o)return;let a=R(s);if(a.whipEndpoint)kZ(a.whipEndpoint);return a}async handleStart(s,n,o){if(n.deviceId!==void 0)this.admissionGate.assertDeviceActionable(n.deviceId,h);let a=await s.resolveDevice(n.deviceId,n.platform??"android");this.assertOpen(),this.admissionGate.assertDeviceActionable(a.deviceId,h),ep(this.authenticator,{sessionUuid:n.sessionUuid,deviceId:a.deviceId,admitViewer:!0});let{subscriptionKind:c,ownsDevice:d,renewingLease:m}=this.startSubscription({deps:s,request:n,device:a,sessionUuid:o}),S=this.subscriberStartOverrides(n,c,m);if(!d)this.assertRenewalMayControl({deps:s,request:n,device:a,sessionUuid:o,subscriptionKind:c,renewingLease:m});let p=await s.startStream({device:a,streamId:n.streamId,leaseId:n.leaseId,sessionUuid:o,subscriptionKind:c,ownsDevice:d,overrides:S});return await this.recheckStartAdmission({deps:s,request:n,device:a,stream:p,sessionUuid:o}),e.info(`[WebRtcStream] started stream ${p.streamId} for device ${a.deviceId}`),{id:n.id,success:p.failure===null||p.failure===void 0,type:"webrtc_stream_response",action:"start",stream:p,subscriptionKind:s.getSubscriptionKind?.({streamId:p.streamId,leaseId:p.lease?.id,sessionUuid:o,existingLeaseOnly:!0})??c,failure:p.failure??null,error:p.failure?.message}}startSubscription(s){let{deps:n,request:o,device:a,sessionUuid:c}=s,d=o.leaseId?n.getSubscriptionKind?.({streamId:o.streamId,leaseId:o.leaseId,sessionUuid:c,allowEndedLease:!0,existingLeaseOnly:!0}):void 0,m=this.authenticator.resolveSubscriptionIdentity?.({sessionUuid:o.sessionUuid,deviceId:a.deviceId}),S=!!m?.authEnabled&&m.sessionExists&&m.ownsDevice;if(d!==void 0)return{subscriptionKind:d,ownsDevice:S,renewingLease:!0};return{subscriptionKind:m?w$(m):"owner",ownsDevice:S,renewingLease:!1}}async recheckStartAdmission(s){let{deps:n,request:o,device:a,stream:c,sessionUuid:d}=s;try{if(this.assertOpen(),ep(this.authenticator,{sessionUuid:o.sessionUuid,deviceId:a.deviceId,admitViewer:!0}),c.lease?.id!==o.leaseId&&this.authenticator.resolveSubscriptionIdentity)await this.reconcileOwnership(a.deviceId)}catch(m){let S=c.lease?.id;if(S&&S!==o.leaseId)await l(()=>n.stopStream(c.streamId,S,d),{timer:this.timer,timeoutMs:W,label:"WebRTC rejected start lease cleanup"}).catch((p)=>{e.warn(`[WebRtcStream] rejected start cleanup failed: ${r(p)}`,p)});throw m}}async handleAwait(s,n,o){if(!n.streamId)throw new t("The WebRTC await action requires streamId.");if(!s.awaitReadiness)throw new t("WebRTC readiness waiting is unavailable.");let a=await s.awaitReadiness(n.streamId,n.readiness??"publishing",n.timeoutMs,{leaseId:n.leaseId,sessionUuid:o});return{id:n.id,success:a.failure===null||a.failure===void 0,type:"webrtc_stream_response",action:"await",stream:a,subscriptionKind:s.getSubscriptionKind?.({streamId:a.streamId,leaseId:a.lease?.id,sessionUuid:o})??"owner",failure:a.failure??null,error:a.failure?.message}}handleStatus(s,n,o){if(n.streamId){let a=s.getStream(n.streamId,n.leaseId,o);if(!a)throw new t(`No active WebRTC stream with id ${n.streamId}.`);return{id:n.id,success:a.failure===null||a.failure===void 0,type:"webrtc_stream_response",action:"status",stream:a,subscriptionKind:s.getSubscriptionKind?.({streamId:a.streamId,leaseId:a.lease?.id,sessionUuid:o})??"owner",failure:a.failure??null,error:a.failure?.message}}return{id:n.id,success:!0,type:"webrtc_stream_response",action:"list",streams:s.listStreams(),subscriptionKind:n.leaseId?s.getSubscriptionKind?.({leaseId:n.leaseId,sessionUuid:o})??"owner":void 0}}createErrorResponse(s,n){return{id:s,success:!1,type:"webrtc_stream_response",error:n}}assertOpen(){if(this.closed)throw new t("WebRTC stream socket server is closed.")}}var f=new vn;function v2(){return f.instance?.getSocketPath()??Dt(ZV)}async function b2(){await f.start(()=>new D)}async function S2(){await f.stop()}
3
+ export{w$,tO,rO,nO,iO,v2,b2,S2};
4
+
5
+ //# debugId=856FA695856C0B8E64756E2164756E21
@@ -0,0 +1,18 @@
1
+ // @bun
2
+ import{h4,Wy,zy,ut,Eq,g4}from"./chunk-hgnnh302.js";import{C,d,J,US,HS,Ze,Ys,It,T4,uF,HA}from"./chunk-9tf2p9y9.js";import*as _ from"fs/promises";import*as te from"fs";import*as b from"path";import*as Ne from"child_process";import*as st from"crypto";import*as ot from"readline";function T(s){let{name:t,inputSchema:e,description:r,run:n,...i}=s;if(e.type!=="object")throw Error(`JSON schema for tool "${t}" must be an object, but got ${e.type}`);return{...i,type:"custom",name:t,input_schema:e,description:r,run:n,parse:(o)=>o}}var L=zy.promises,G=448,mt=384;function ie(s,t){let e=ut.relative(s,t);return e===""||!e.startsWith(".."+ut.sep)&&e!==".."&&!ut.isAbsolute(e)}async function we(s,t){for(let e of s)if(ie(await H(ut.resolve(e)),t))return e;return}var pt=40;function K(s){let t=s?.code;return typeof t==="string"?t:void 0}async function H(s){let t=[],e=s,r=0;for(;;){let n;try{n=await L.realpath(e)}catch(i){let o;try{o=(await L.lstat(e)).isSymbolicLink()}catch(a){let c=K(a);if(c!=="ENOENT"&&c!=="ENOTDIR")throw a;let f=ut.dirname(e);if(f===e)throw a;t.push(ut.basename(e)),e=f;continue}if(!o)throw i;if(++r>pt)throw Object.assign(Error("too many levels of symbolic links"),{code:"ELOOP"});e=ut.resolve(ut.dirname(e),await L.readlink(e));continue}return t.length?ut.join(n,...t.reverse()):n}}async function Te(s,t,e){let r=e?.allowedRoots??[],n=await H(ut.resolve(s)),i;try{i=await H(ut.resolve(n,t))}catch(a){throw new It(U(a,`path ${JSON.stringify(t)}`))}if(ie(n,i)||await we(r,i)!==void 0)return i;let o=r.length?"the session's working directory and its other permitted directories":"the session's working directory";throw new It(`path ${JSON.stringify(t)} is outside ${o}`)}async function _e(s,t){let e=ut.dirname(s),r=ut.join(e,`.tmp-${process.pid}-${Wy.randomUUID()}`),n=await L.stat(s).then((o)=>o.mode&511,()=>{return}),i;try{if(i=await L.open(r,"wx",mt),n!==void 0)await i.chmod(n);await i.writeFile(t,"utf-8"),await i.sync(),await i.close(),i=void 0,await L.rename(r,s)}catch(o){if(i)await i.close().catch(()=>{});throw await L.unlink(r).catch(()=>{}),o}}function U(s,t){let e=K(s);switch(e){case"ENOENT":return`${t}: no such file or directory`;case"EACCES":case"EPERM":return`${t}: permission denied`;case"ENOTDIR":return`${t}: not a directory`;case"EISDIR":return`${t}: is a directory`;case"ELOOP":return`${t}: too many levels of symbolic links`;case"ENAMETOOLONG":return`${t}: file name too long`;case"ENOSPC":return`${t}: no space left on device`;case"EMFILE":case"ENFILE":return`${t}: too many open files`;default:return`${t}: ${e!==void 0?`i/o error (${e})`:"i/o error"}`}}var M=zy.promises,yt=g4.promisify(h4.execFile);async function wt(s){let{client:t,sessionId:e}=s;if(!t)return async()=>{};let r=Ze(t),n=s.session;if(!n){if(e===void 0)return async()=>{};r.warn("AgentToolContext.sessionId is deprecated and costs an extra session fetch; fetch the session once and set `session` instead",{component:"agent-tool-context"}),n=await t.beta.sessions.retrieve(e)}let i=ut.resolve(s.workdir,"skills"),o=[];for(let a of n.agent.skills)try{let c=await t.beta.skills.versions.retrieve(a.version,{skill_id:a.skill_id}),f=ut.basename(c.name.trim());if(f===""||f==="."||f==="..")f=a.skill_id;let l=ut.resolve(i,f);if(l!==i&&!l.startsWith(i+ut.sep)){r.warn("skill name escapes the skills dir; skipping",{component:"agent-tool-context",name:c.name});continue}let h=await t.beta.skills.versions.download(c.id,{skill_id:a.skill_id});await M.rm(l,{recursive:!0,force:!0}),await M.mkdir(l,{recursive:!0,mode:G}),o.push(l),await Ae(h,l),r.info("downloaded skill",{component:"agent-tool-context",skill_id:a.skill_id,version:c.id,dest:l})}catch(c){r.warn("failed to download skill",{component:"agent-tool-context",skill_id:a.skill_id,error:String(c)})}return async()=>{for(let a of o)await M.rm(a,{recursive:!0,force:!0}).catch((c)=>{r.warn("failed to clean up skill",{component:"agent-tool-context",dest:a,error:String(c)})})}}function _t(s){for(let t of s){let e=t.trim();if(!e)continue;if(ut.isAbsolute(e)||e.split(/[\\/]/).includes(".."))throw new J(`refusing to extract unsafe archive member: ${e}`)}}var ge="skill archive listing is inconsistent; refusing to extract",St={unzip:new Set(["-","d","?"]),tar:new Set(["-","d","C"])};function Le(s){let t=s.split(`
3
+ `);if(t[t.length-1]==="")t.pop();return t}function gt(s,t){return/^[\x20-\x7E]+$/.test(t)&&!/[\\^#]/.test(t)&&!(s==="unzip"&&t.startsWith("-"))}function bt(s,t,e){let r=Le(t),n=Le(e);if(r.length!==n.length)throw new J(ge);let i=[],o=[];return r.forEach((a,c)=>{if(St[s].has(n[c].charAt(0))){i.push(a);return}if(!gt(s,a))throw new J(`refusing to extract archive: cannot safely exclude member ${JSON.stringify(a)}`);o.push(a)}),{plain:i,special:o}}async function $e(s){for(let t of await M.readdir(s,{withFileTypes:!0}))if(t.isDirectory())await $e(ut.join(s,t.name));else if(!t.isFile())throw new J(ge)}async function Se(s,t){try{let{stdout:e}=await yt(s,t);return e}catch(e){if(K(e)==="ENOENT")throw new J(`skill extraction requires the \`${s}\` command, but it was not found on PATH`);throw e}}function Et(s){let t,e=!1;for(let r of s){let n=r.trim().split("/").filter((o)=>o!==""&&o!==".");if(n.length===0)continue;let i=n[0];if(t===void 0)t=i;else if(i!==t)return"";if(n.length>1)e=!0}return t!==void 0&&e?t:""}async function Ae(s,t){let e=ut.join(t,`.skill-archive-${process.pid}-${Date.now()}`);if(!s.body)throw new J("skill download response had no body");await Eq.promises.pipeline(Eq.Readable.fromWeb(s.body),zy.createWriteStream(e));let r=ut.join(ut.dirname(t),`.skill-stage-${process.pid}-${Date.now()}`),n=ut.join(ut.dirname(t),`.skill-exclude-${process.pid}-${Date.now()}`);try{let i=await Mt(e,4),o=i.length>=4&&i[0]===80&&i[1]===75&&i[2]===3&&i[3]===4,a=o?"unzip":"tar",c=await Se(a,o?["-Z1",e]:["-tf",e]),f=await Se(a,o?["-Z","--h","--t",e]:["-tvf",e]),{plain:l,special:h}=bt(a,c,f);_t([...l,...h]);let y=Et(l);if(await M.mkdir(r,{recursive:!0,mode:G}),l.length>0)await Se(a,await Ot(a,e,r,h,n));await $e(r);let S=y?ut.join(r,y):r,N=await M.readdir(S).catch((E)=>{throw K(E)==="ENOENT"?new J(ge):E});for(let E of N)await M.rename(ut.join(S,E),ut.join(t,E))}finally{await M.rm(e,{force:!0}),await M.rm(n,{force:!0}),await M.rm(r,{recursive:!0,force:!0})}}async function Ot(s,t,e,r,n){let i=r.map((o)=>o.replace(/[*?[\\]/g,"\\$&"));if(s==="unzip")return["-oq",t,"-d",e,...i.length>0?["-x",...i]:[]];if(i.length===0)return["-xf",t,"-C",e];return await M.writeFile(n,i.join(`
4
+ `)+`
5
+ `,{flag:"wx",mode:384}),["-xf",t,"-C",e,"-X",n]}async function Mt(s,t){let e=await M.open(s,"r");try{let r=Buffer.alloc(t),{bytesRead:n}=await e.read(r,0,t,0);return r.subarray(0,n)}finally{await e.close()}}var w=zy.promises,j=zy.constants,Fe=448,vt=384,kt=448,Ee=j.O_NOFOLLOW??0,Rt=j.O_NONBLOCK??0,p=(()=>{class s extends Error{constructor(t,e){super(`path ${JSON.stringify(e)} ${t}`);this.name="FileStoreError",this.reason=t,this.relPath=e}}return s.ESCAPES_ROOT="escapes the store root",s.IS_A_SYMLINK="is a symlink",s.NOT_A_FILE="is not a regular file",s.NOT_A_DIRECTORY="is not a directory",s.NOT_UTF8="is not valid utf-8",s.MOVE_DESTINATION_EXISTS="already exists",s})();function Oe(s){return s.startsWith("/")&&!s.split("/").includes("..")}var be=(()=>{class s{constructor(t,e,r=!1){this.hashes=new Map,this.rootPath=t,this.removedOnDispose=e,this.decoder=r?new TextDecoder("utf-8",{fatal:!0}):void 0}static async open(t,e){if(!Nt())throw Error("FileStore requires O_NOFOLLOW support on this platform");let r=!1;try{await w.lstat(t)}catch(n){if(n.code!=="ENOENT")throw n;r=!0}return new s(ut.resolve(t),r,e?.utf8??!1)}async createRoot(){await Tt(this.rootPath)}root(){return{path:this.rootPath,removedOnDispose:this.removedOnDispose}}async dispose(){if(!this.removedOnDispose)return;await w.rm(this.rootPath,{recursive:!0,force:!0})}async put(t,e,r){let n=t.replace(/\\/g,"/");if(n.endsWith("/")||n.endsWith("/.")||n===""||n===".")throw new p(p.NOT_A_FILE,t);let i=this.resolveUnderRoot(t),o=typeof e==="string"?US(e):e;this.requireUtf8(t,o),await xe(this.rootPath,ut.dirname(i)),await Lt(i,o,r?.executable??!1)}async get(t){let e=this.resolveUnderRoot(t),r;try{r=await Pe(t,e)}catch(i){if(i.code==="ENOENT")return null;throw i}let n;try{let i=await r.readFile();n=new Uint8Array(i.buffer,i.byteOffset,i.byteLength)}finally{await r.close()}return this.requireUtf8(t,n),n}async ls(t="/"){let e=this.resolveUnderRoot(t);return new Set((await De(this.rootPath,t,e)).map(([r])=>r))}async findSymlinks(t="/"){let e=this.resolveUnderRoot(t);return At(this.rootPath,t,e)}async hashtree(t="/"){let e=this.resolveUnderRoot(t),r=se.nowNs(),n=Object.create(null);for(let[i,o]of await De(this.rootPath,t,e)){let a=await this.hashViaCache(i,o,r);if(a!==null)n[i]=a}return n}async hashFile(t){let e=this.resolveUnderRoot(t),r;try{r=await w.lstat(e,{bigint:!0})}catch(i){if(i.code==="ENOENT")return null;throw i}if(r.isSymbolicLink())throw new p(p.IS_A_SYMLINK,t);if(!r.isFile())throw new p(p.NOT_A_FILE,t);let n=ut.relative(this.rootPath,e).split(ut.sep).join("/");return this.hashViaCache(n,e,se.nowNs())}async move(t,e){let r=this.resolveUnderRoot(t),n=this.resolveUnderRoot(e);if(r===this.rootPath||n===this.rootPath)return;if(await w.stat(n).then(()=>!0,()=>!1))throw new p(p.MOVE_DESTINATION_EXISTS,e);await xe(this.rootPath,ut.dirname(n)),await w.rename(r,n)}async remove(t){let e=this.resolveUnderRoot(t);if(e===this.rootPath)return;let r;try{r=await w.lstat(e,{bigint:!0})}catch(n){if(n.code==="ENOENT")return;throw n}if(r.isDirectory())await w.rm(e,{recursive:!0,force:!0});else try{await w.unlink(e)}catch(n){if(n.code!=="ENOENT")throw n}}resolveUnderRoot(t){let e=t.replace(/\\/g,"/").replace(/^\/+/,""),r=e.split("/").filter((n)=>n!==""&&n!==".");if(ut.posix.isAbsolute(e)||r.includes(".."))throw new p(p.ESCAPES_ROOT,t);return r.length===0?this.rootPath:ut.join(this.rootPath,...r)}requireUtf8(t,e){if(!this.decoder)return;try{this.decoder.decode(e)}catch{throw new p(p.NOT_UTF8,t)}}async hashViaCache(t,e,r){let n;try{n=await w.lstat(e,{bigint:!0})}catch(a){if(a.code==="ENOENT")return null;throw a}if(!n.isFile())return null;let i=this.hashes.get(t),o;if(i!==void 0&&Dt(i,n))o=i.sha;else try{o=await se.hashFile(e)}catch(a){let c=a.code;if(c==="ENOENT"||a instanceof p)return null;if(c==="ELOOP"||c==="EMLINK")return null;throw a}if(Ct(n,r))this.hashes.set(t,{mtimeNs:n.mtimeNs,ctimeNs:n.ctimeNs,size:n.size,sha:o});return o}}return s.isPathLegal=Oe,s})();function Nt(){return Ee!==0}async function Tt(s){let t=[],e=s;for(;;){try{await w.stat(e);break}catch(n){let i=n.code;if(i!=="ENOENT"&&i!=="ENOTDIR"&&i!=="ELOOP")throw n}t.push(e);let r=ut.dirname(e);if(r===e)break;e=r}for(let r of t.reverse())try{await w.mkdir(r,{mode:Fe})}catch(n){if(n.code!=="EEXIST")throw n}}async function xe(s,t){let e=ut.relative(s,t);if(e==="")return;let r=s;for(let n of e.split(ut.sep)){r=ut.join(r,n);try{await w.mkdir(r,{mode:Fe})}catch(i){if(i.code!=="EEXIST")throw i}}}async function Lt(s,t,e){let r=e?kt:vt,n=ut.join(ut.dirname(s),`.fs-${Wy.randomBytes(8).toString("hex")}.tmp`),i;try{i=await w.open(n,j.O_WRONLY|j.O_CREAT|j.O_EXCL|Ee,r),await i.writeFile(t),await i.close(),i=void 0,await w.rename(n,s)}catch(o){if(i)await i.close().catch(()=>{});throw await w.unlink(n).catch(()=>{}),o}}async function Pe(s,t){let e;try{e=await w.open(t,j.O_RDONLY|Ee|Rt)}catch(r){let n=r.code;if(n==="ELOOP"||n==="EMLINK")throw new p(p.IS_A_SYMLINK,s);throw r}try{if(!(await e.stat()).isFile())throw new p(p.NOT_A_FILE,s)}catch(r){throw await e.close().catch(()=>{}),r}return e}async function $t(s){let t=Wy.createHash("sha256"),e=await Pe(ut.basename(s),s),r=new Uint8Array(1048576);try{for(;;){let{bytesRead:n}=await e.read(r,0,r.length);if(n===0)break;t.update(r.subarray(0,n))}}finally{await e.close()}return t.digest("hex")}async function De(s,t,e){if(!await xt(t,e))return[];let r=[];return await We(e,(n,i)=>{if(i.isFile())r.push([ut.relative(s,n).split(ut.sep).join("/"),n])}),r.sort(),r}async function At(s,t,e){let r=(o)=>ut.relative(s,o).split(ut.sep).join("/"),n;try{n=await w.lstat(e,{bigint:!0})}catch(o){let a=o.code;if(a==="ENOENT"||a==="ENOTDIR")return new Set;throw o}if(n.isSymbolicLink())return new Set([r(e)]);if(!n.isDirectory())throw new p(p.NOT_A_DIRECTORY,t);let i=new Set;return await We(e,(o,a)=>{if(a.isSymbolicLink())i.add(r(o))}),i}async function xt(s,t){let e;try{e=await w.lstat(t,{bigint:!0})}catch(r){let n=r.code;if(n==="ENOENT"||n==="ENOTDIR")return!1;throw r}if(!e.isDirectory())throw new p(p.NOT_A_DIRECTORY,s);return!0}async function We(s,t){let e=[s];while(e.length){let r=e.pop(),n;try{n=await w.readdir(r,{withFileTypes:!0})}catch(i){if(i.code==="ENOENT")continue;throw i}for(let i of n){let o=ut.join(r,i.name);if(t(o,i),i.isDirectory()&&!i.isSymbolicLink())e.push(o)}}}function Dt(s,t){return t.mtimeNs===s.mtimeNs&&t.ctimeNs===s.ctimeNs&&t.size===s.size}function Ct(s,t){return(s.mtimeNs>s.ctimeNs?s.mtimeNs:s.ctimeNs)<t-se.timestampTrustMarginNs}var Ft=2000000000n,se={hashFile:$t,timestampTrustMarginNs:Ft,nowNs:()=>BigInt(Date.now())*1000000n},Ue=be,Ce=Symbol.asyncDispose;if(Ce)Object.defineProperty(be.prototype,Ce,{value:be.prototype.dispose,configurable:!0,writable:!0});var u,k,oe,V,ae,m,B,ce,I,je,le,Be,Ye,Me,ve,ke,qe,ze,Ie,He,Ge,fe,he,Ke,Ve,Pt=30000,q=".anthropic-memory-store",Je=1;function Xe(s){return Wy.createHash("sha256").update(`version ${Je}
6
+ ${s}`,"utf-8").digest("hex")}var Wt=30000,Ut=100,jt=20,Bt=16,Yt=32,qt=8,zt=50;class A extends J{constructor(s,t){super(s);if(this.name="SessionMemoryError",t!==void 0)this.cause=t}}class Qe{constructor(s,t,e){this.mode=s,this.cap=t,this.waiveWindow=e,this.attempted=0,this.capped=0,this.suppressed=0}takeSlot(){if(this.attempted>=this.cap)return this.capped++,!1;return this.attempted++,!0}}var Ht=(()=>{class s{constructor(t,e){u.add(this),k.set(this,void 0),oe.set(this,void 0),V.set(this,void 0),ae.set(this,void 0),m.set(this,void 0),B.set(this,void 0),ce.set(this,!1),I.set(this,[]),C(this,k,t,"f"),C(this,oe,e.workdir,"f"),C(this,V,e.syncIntervalMs??T4,"f"),uF(d(this,V,"f"),"syncIntervalMs"),C(this,ae,e.syncDeletions??"enabled","f"),C(this,m,Ze(t),"f"),C(this,B,Date.now(),"f")}get roots(){return d(this,I,"f").map((t)=>t.files.root().path)}get readOnlyRoots(){return d(this,I,"f").filter((t)=>t.readOnly).map((t)=>t.files.root().path)}async download(t){for(let e of t.resources){if(e.type!=="memory_store")continue;let r=d(this,u,"m",je).call(this,e),n;try{if(n={memoryStoreId:e.memory_store_id,files:await Ue.open(r,{utf8:!0}),readOnly:e.access==="read_only",baseline:new Map,refusedShas:new Map,pendingDeletes:new Map,sentShas:new Map},!n.files.root().removedOnDispose)throw new A(`something already exists at the memory store's path: ${r} (memory_store_id=${e.memory_store_id}); it must not exist when the session starts`);try{await n.files.createRoot()}catch(i){if(!Y(i))throw i;throw new A(`cannot create the memory store's folder: ${r} (memory_store_id=${e.memory_store_id}): ${i}; the worker host must make this mount path writable`,i)}await d(this,u,"m",ke).call(this,n),d(this,m,"f").info("downloaded memories",{count:n.baseline.size,memory_store_id:n.memoryStoreId,dest:n.files.root().path}),d(this,I,"f").push(n)}catch(i){if(n)await n.files.dispose().catch(()=>{});if(i instanceof A)throw i;throw new A(`failed to download memory store memory_store_id=${e.memory_store_id}: ${i}`,i)}}C(this,B,Date.now(),"f")}async finish(){if(d(this,ce,"f"))throw new J("finish() was already called: it is the session's last sync and runs once");C(this,ce,!0,"f"),await this.syncAll(!0)}async syncAll(t){await Promise.all(d(this,I,"f").map((e)=>d(this,u,"m",Be).call(this,e,t))),C(this,B,Date.now(),"f")}async syncIfDue(){if(Date.now()-d(this,B,"f")<d(this,V,"f"))return;await this.syncAll(!1)}async flushWrites(t){await Promise.all(d(this,I,"f").map((e)=>d(this,u,"m",Ye).call(this,e,t)))}async dispose(){for(let t of d(this,I,"f")){let e=t.files.root();try{let r=await d(this,u,"m",le).call(this,t);if(!r.markerOk&&Object.keys(r.files).length>0){d(this,m,"f").warn(`${r.distrustReason}; leaving the memory store folder on disk`,{root:e.path,memory_store_id:t.memoryStoreId});continue}await t.files.dispose()}catch(r){if(!(r instanceof p)&&!Y(r))throw r;d(this,m,"f").warn("failed to remove the memory store folder",{root:t.files.root().path,memory_store_id:t.memoryStoreId,error:String(r)});continue}if(e.removedOnDispose)d(this,m,"f").info("removed memory store dir",{dest:e.path,memory_store_id:t.memoryStoreId})}}}return k=new WeakMap,oe=new WeakMap,V=new WeakMap,ae=new WeakMap,m=new WeakMap,B=new WeakMap,ce=new WeakMap,I=new WeakMap,u=new WeakSet,je=function(e){if(e.mount_path){if(!Oe(e.mount_path))throw new A(`memory store mount_path is not a clean absolute path: ${JSON.stringify(e.mount_path)} (memory_store_id=${e.memory_store_id})`);return e.mount_path}return ut.join(d(this,oe,"f"),"memory",e.name||e.memory_store_id)},le=async function(e){let r=await e.files.hashtree(),n=r[q];if(delete r[q],n===Xe(e.memoryStoreId))return{files:r,markerOk:!0,distrustReason:null};return{files:r,markerOk:!1,distrustReason:n!==void 0?"the marker file does not match this store":"the marker file is gone"}},Be=async function(e,r){try{let n=await d(this,u,"m",le).call(this,e),i=n.files;if(!n.markerOk){if(Object.keys(i).length>0){d(this,m,"f").warn(`${n.distrustReason}; leaving the memory store folder as found and not syncing`,{root:e.files.root().path,memory_store_id:e.memoryStoreId});return}await d(this,u,"m",Me).call(this,e,"the folder or its marker is gone");return}let o=new Map;for await(let[h,y]of d(this,u,"m",fe).call(this,e.memoryStoreId))o.set(h,y);if(d(this,u,"m",ve).call(this,e,o),Object.keys(i).length===0&&e.baseline.size>1){await d(this,u,"m",Me).call(this,e,"every memory file is gone at once");return}let a=new Qe(d(this,ae,"f"),Math.max(qt,Math.min(zt,Math.floor(e.baseline.size/4))),r),c=[],f=new Map,l=[...new Set([...o.keys(),...Object.keys(i),...e.baseline.keys()])].sort();for(let h of l){let y=o.get(h),S=i[h],N=e.baseline.get(h),E;if(S===void 0&&N!==void 0&&y!==void 0&&y.content_sha256===N&&!e.readOnly)E=await d(this,u,"m",Ke).call(this,e,h,y,N,a);else E=await d(this,u,"m",qe).call(this,e,h,y,S,c);if(E!==void 0)f.set(h,E)}if(e.baseline=f,await d(this,u,"m",He).call(this,e,c),a.suppressed>0)d(this,m,"f").debug("remote deletes are disabled; locally deleted memories stay on the server",{count:a.suppressed,memory_store_id:e.memoryStoreId});if(a.capped>0)d(this,m,"f").warn(`delete cap reached: ${a.mode==="log_only"?"would send":"sent"} ${a.attempted} deletes, held ${a.capped} for later syncs`,{memory_store_id:e.memoryStoreId})}catch(n){d(this,m,"f").warn("memory sync failed",{memory_store_id:e.memoryStoreId,error:String(n)})}},Ye=async function(e,r){let n=new Map,i=new Set,o=async()=>{if(e.readOnly)return;let a=await d(this,u,"m",le).call(this,e);if(!a.markerOk){d(this,m,"f").warn(`${a.distrustReason}; not uploading anything from the memory store folder`,{root:e.files.root().path,memory_store_id:e.memoryStoreId});return}for(let[l,h]of Object.entries(a.files))if((h!==e.baseline.get(l)||e.sentShas.has(l))&&e.refusedShas.get(l)!==h)n.set(l,h),i.add(l);if(n.size===0||r?.aborted)return;let c=new Map;for await(let[l,h]of d(this,u,"m",fe).call(this,e.memoryStoreId)){if(r?.aborted)return;c.set(l,h)}d(this,u,"m",ve).call(this,e,c);let f=[];for(let l of[...n.keys()].sort()){let h=n.get(l),y=e.baseline.get(l),S=c.get(l);if(h===y){i.delete(l);continue}if(S!==void 0&&S.content_sha256===h){e.baseline.set(l,S.content_sha256),i.delete(l);continue}if(S!==void 0&&S.content_sha256!==y){d(this,m,"f").warn("memory changed both locally and remotely; the flush leaves the remote version",{path:l,memory_store_id:e.memoryStoreId}),i.delete(l);continue}f.push([l,h,S])}await d(this,u,"m",Ge).call(this,e,f,i,r)};try{if(await Gt(o(),r),r?.aborted&&i.size>0)d(this,m,"f").warn(`memory flush cut off part-way; ${i.size} of ${n.size} changed files had not finished uploading`,{memory_store_id:e.memoryStoreId})}catch(a){d(this,m,"f").warn("memory flush failed",{memory_store_id:e.memoryStoreId,error:String(a)})}},Me=async function(e,r){d(this,m,"f").warn(`${r}; re-downloading the memory store folder instead of syncing`,{root:e.files.root().path,memory_store_id:e.memoryStoreId}),await e.files.createRoot(),await d(this,u,"m",ke).call(this,e)},ve=function(e,r){for(let[n,i]of e.sentShas)if(r.get(n)?.content_sha256===i)e.baseline.set(n,i);e.sentShas.clear()},ke=async function(e){e.baseline=new Map,e.sentShas.clear(),e.pendingDeletes.clear(),await e.files.put(q,`version ${Je}
7
+ ${e.memoryStoreId}`);for await(let[r,n]of d(this,u,"m",fe).call(this,e.memoryStoreId,"full"))if(await d(this,u,"m",Ie).call(this,e,r,n.content??""))e.baseline.set(r,n.content_sha256)},qe=async function(e,r,n,i,o){let a=e.baseline.get(r);if(i!==void 0)e.pendingDeletes.delete(r);if(!n){if(i===void 0){e.pendingDeletes.delete(r);return}if(a!==void 0){if(i===a){let y=await d(this,u,"m",ze).call(this,e,r,a);if(y===void 0)return;if(y===a)return a;i=y}if(e.readOnly)d(this,m,"f").warn("memory deleted remotely but edited locally; keeping the file, which a read-only store cannot push",{path:r,memory_store_id:e.memoryStoreId});else if(e.refusedShas.get(r)!==i)d(this,m,"f").info("memory deleted remotely but edited locally; re-creating it from the file",{path:r,memory_store_id:e.memoryStoreId})}if(e.readOnly)return;if(e.refusedShas.get(r)===i)return;return await d(this,u,"m",he).call(this,e,r,i,void 0)}let c=n.content_sha256,f=c!==a,l=i!==void 0&&i!==a&&i!==c,h=!e.readOnly&&l;if(i===void 0&&a!==void 0){if(f)d(this,m,"f").warn("memory deleted locally but changed remotely; restoring the remote version",{path:r,memory_store_id:e.memoryStoreId}),e.pendingDeletes.delete(r),o.push([r,n]);return a}if(f){if(i===c)return c;if(l)d(this,m,"f").warn("memory changed both locally and remotely; keeping the remote version",{path:r,memory_store_id:e.memoryStoreId});return o.push([r,n]),a}if(h){if(e.refusedShas.get(r)===i)return c;return await d(this,u,"m",he).call(this,e,r,i,n)??c}return c},ze=async function(e,r,n){let i;try{i=await e.files.hashFile(r)}catch(o){if(!(o instanceof p)&&!Y(o))throw o;return n}if(i===null)return;if(i!==n)return i;try{await e.files.remove(r)}catch(o){if(!(o instanceof p)&&!Y(o))throw o;return d(this,m,"f").warn("failed to remove memory deleted remotely",{path:r,memory_store_id:e.memoryStoreId,error:String(o)}),n}return},Ie=async function(e,r,n){try{await e.files.put(r,n)}catch(i){if(!(i instanceof p)&&!Y(i))throw i;return d(this,m,"f").warn("failed to write memory",{path:r,memory_store_id:e.memoryStoreId,error:String(i)}),!1}return!0},He=async function(e,r){if(r.length===0)return;let n=async(a,c)=>{let f;try{f=await d(this,k,"f").beta.memoryStores.memories.retrieve(c.id,{memory_store_id:e.memoryStoreId,view:"full"})}catch(l){if(Ys(l,404))return;d(this,m,"f").warn("failed to fetch memory content",{path:a,memory_store_id:e.memoryStoreId,error:String(l)});return}if(await d(this,u,"m",Ie).call(this,e,a,f.content??""))e.baseline.set(a,f.content_sha256)},i=r[Symbol.iterator](),o=async()=>{for(let[a,c]of i)await n(a,c)};await Promise.all(Array.from({length:Math.min(Bt,r.length)},o))},Ge=async function(e,r,n,i){let o=r[Symbol.iterator](),a=async()=>{for(let[c,f,l]of o){if(i?.aborted)return;let h=await d(this,u,"m",he).call(this,e,c,f,l);if(n.delete(c),h!==void 0)e.baseline.set(c,h)}};await Promise.all(Array.from({length:Math.min(Yt,r.length)},a))},fe=async function*(e,r="basic"){let n=r==="basic"?Ut:jt;for await(let i of d(this,k,"f").beta.memoryStores.memories.list(e,{view:r,limit:n})){if(i.type!=="memory")continue;let o=i.path.replace(/^\/+/,"");if(o===q){d(this,m,"f").warn("the server listed the reserved marker path; skipping",{path:i.path,memory_store_id:e});continue}yield[o,i]}},he=async function t(e,r,n,i){try{let o=await e.files.get(r);if(o===null)return;let a=HS(o);e.sentShas.set(r,Wy.createHash("sha256").update(a,"utf-8").digest("hex"));let c=i?await d(this,k,"f").beta.memoryStores.memories.update(i.id,{memory_store_id:e.memoryStoreId,content:a,precondition:{type:"content_sha256",content_sha256:i.content_sha256}}):await d(this,k,"f").beta.memoryStores.memories.create(e.memoryStoreId,{path:"/"+r,content:a});return e.refusedShas.delete(r),e.sentShas.delete(r),c.content_sha256}catch(o){if(i&&Ys(o,404))return await d(this,u,"m",t).call(this,e,r,n,void 0);let a=o instanceof p||Ys(o,400)||Ys(o,413);if(i&&Ys(o,409))d(this,m,"f").warn("memory changed both locally and remotely; the upload was refused and the local edit loses",{path:r,memory_store_id:e.memoryStoreId});else if(a&&n!==void 0)e.refusedShas.set(r,n),d(this,m,"f").warn("the server rejected this memory file, so it stays un-synced until its content changes",{path:r,memory_store_id:e.memoryStoreId,rejection:String(o)});else d(this,m,"f").warn("failed to upload memory",{path:r,memory_store_id:e.memoryStoreId,error:String(o)});return}},Ke=async function(e,r,n,i,o){if(o.mode==="disabled")return o.suppressed++,i;let a=e.pendingDeletes.get(r);if(a===void 0)a=Date.now(),e.pendingDeletes.set(r,a);if(!o.waiveWindow&&Date.now()-a<Wt)return i;let c,f;try{c=await e.files.hashFile(q)===Xe(e.memoryStoreId),f=await e.files.hashFile(r)===null}catch(h){if(!(h instanceof p)&&!Y(h))throw h;c=f=!1}if(!c)return i;if(!f)return e.pendingDeletes.delete(r),i;if(!o.takeSlot())return i;if(o.mode==="log_only")return d(this,m,"f").info("log-only: sync would delete this memory on the server",{path:r,memory_store_id:e.memoryStoreId}),i;let l=await d(this,u,"m",Ve).call(this,e,r,n,i);if(l===void 0)e.pendingDeletes.delete(r);return l},Ve=async function(e,r,n,i){try{await d(this,k,"f").beta.memoryStores.memories.delete(n.id,{memory_store_id:e.memoryStoreId,expected_content_sha256:i})}catch(o){if(Ys(o,404))return;if(Ys(o,409)||Ys(o,412))d(this,m,"f").warn("memory deleted locally but changed remotely; keeping the remote version",{path:r,memory_store_id:e.memoryStoreId});else d(this,m,"f").warn("failed to delete memory",{path:r,memory_store_id:e.memoryStoreId,error:String(o)});return i}d(this,m,"f").info("propagated local deletion",{path:r,memory_store_id:e.memoryStoreId});return},s})();function Y(s){return typeof s==="object"&&s!==null&&typeof s.code==="string"}async function Gt(s,t){if(!t){await s;return}let e,r=new Promise((n)=>{if(e=n,t.aborted)n()});t.addEventListener("abort",e,{once:!0});try{await Promise.race([s,r])}finally{t.removeEventListener("abort",e)}}var de,g,O,X,x,v,Re,me,Z,ue,pe,D,F,z,P,Q,R,et,tt,rt=102400,at=120000,Kt=262144,Vt=65536,nt=Buffer.from(`
8
+ `),ee=102400,Xt=2000,Jt=200;class ct extends J{constructor(s){super(`bash command timed out after ${s}ms`);this.name="BashTimeoutError",this.timeoutMs=s}}var Zt=/\x1b\[[0-9;?]*[ -/]*[@-~]/g,Qt=_.glob;function lt(s){return s===void 0?Kt:s}function W(s){if(s===void 0)return;throw new J("The `unrestrictedPaths` option you passed to the agent toolset (AgentToolContext) is no longer supported. The toolset's file tools (read, write, edit, glob, grep) are now always confined to the working directory plus the directories listed in `allowedRoots`. Remove `unrestrictedPaths` from your context; to let the file tools reach any other directory, add it to `allowedRoots`.")}function qr(s){return[rr(s),nr(s),or(s),ar(s),lr(s),fr(s)]}async function re(s,t){return W(s.unrestrictedPaths),Te(s.workdir,t,{allowedRoots:s.allowedRoots??[]})}function ft(s,t){return we(s.readOnlyRoots??[],t)}function er(){let s={};for(let[t,e]of Object.entries(process.env)){if(t.startsWith("ANTHROPIC_"))continue;s[t]=e}return s}var tr=(()=>{class s{constructor(t,e=er()){de.add(this),g.set(this,void 0),O.set(this,""),X.set(this,!1),x.set(this,!1),v.set(this,null),C(this,g,Ne.spawn("/bin/bash",["--noprofile","--norc"],{cwd:t,env:{...e,PS1:"",PS2:"",TERM:"dumb"},stdio:["pipe","pipe","pipe"],detached:!0}),"f"),d(this,g,"f").stdout.setEncoding("utf8"),d(this,g,"f").stderr.setEncoding("utf8"),d(this,g,"f").stdout.on("data",(r)=>d(this,de,"m",Re).call(this,r)),d(this,g,"f").stderr.on("data",(r)=>d(this,de,"m",Re).call(this,r)),d(this,g,"f").once("close",()=>{C(this,x,!0,"f");let r=d(this,v,"f");C(this,v,null,"f"),r?.resolve()})}get closed(){return d(this,x,"f")}async exec(t,e={}){if(d(this,x,"f"))throw new J("bash session terminated");let r=e.timeoutMs??at,n=e.signal;n?.throwIfAborted(),C(this,O,"","f"),C(this,X,!1,"f");let i=`__ANT_CMD_${st.randomUUID()}_DONE__`,o=`${i.slice(0,8)}''${i.slice(8)}`,a=`{ ${t}
9
+ } </dev/null 2>&1; printf '\\n${o}%d\\n' $?
10
+ `;if(d(this,g,"f").stdin.write(a),d(this,O,"f").indexOf(i)<0){let{promise:S,resolve:N}=HA();C(this,v,{sentinel:i,resolve:N},"f");let E,ne;try{await Promise.race([S,new Promise((dt,ye)=>{E=setTimeout(()=>ye(new ct(r)),r)}),new Promise((dt,ye)=>{if(!n)return;ne=()=>ye(n.reason),n.addEventListener("abort",ne,{once:!0})})])}finally{if(E)clearTimeout(E);if(ne&&n)n.removeEventListener("abort",ne);C(this,v,null,"f")}}let c=d(this,O,"f").indexOf(i);if(c<0)throw new J("bash session terminated");let l=d(this,O,"f").slice(c+i.length).match(/^(-?\d+)/),h=l?parseInt(l[1],10):-1,y=d(this,O,"f").slice(0,c).replace(Zt,"").replace(/\n+$/,"");if(d(this,X,"f"))y=`[output truncated]
11
+ ${y}`;return{output:y,exitCode:h}}close(){if(d(this,x,"f"))return;C(this,x,!0,"f");let t=d(this,v,"f");C(this,v,null,"f"),t?.resolve(),d(this,g,"f").stdout.destroy(),d(this,g,"f").stderr.destroy(),d(this,g,"f").stdin.destroy();try{process.kill(-d(this,g,"f").pid,"SIGKILL")}catch{d(this,g,"f").kill("SIGKILL")}d(this,g,"f").unref()}}return g=new WeakMap,O=new WeakMap,X=new WeakMap,x=new WeakMap,v=new WeakMap,de=new WeakSet,Re=function(e){if(C(this,O,d(this,O,"f")+e,"f"),d(this,O,"f").length>rt)C(this,O,d(this,O,"f").slice(d(this,O,"f").length-rt),"f"),C(this,X,!0,"f");if(d(this,v,"f")&&d(this,O,"f").indexOf(d(this,v,"f").sentinel)>=0){let r=d(this,v,"f");C(this,v,null,"f"),r.resolve()}},s})();function rr(s){W(s.unrestrictedPaths);let t,e=Promise.resolve();return T({name:"bash",description:"Run a bash command in a persistent shell. State (cwd, env vars) persists across calls.",inputSchema:{type:"object",properties:{command:{type:"string",description:"The command to run"},restart:{type:"boolean",description:"Restart the persistent shell before running"},timeout_ms:{type:"integer",description:"Per-call timeout in milliseconds"}}},run:async({command:r,restart:n,timeout_ms:i},o)=>{let a=e,c=HA();e=c.promise;try{await a}catch{}try{if(n)t?.close(),t=void 0;if(!r){if(n)return"bash session restarted";throw new It("bash: command is required")}t??(t=new tr(s.workdir,s.env));try{let{output:f,exitCode:l}=await t.exec(r,{timeoutMs:i??at,signal:o?.signal});if(l!==0)throw new It(f||`exit ${l}`);return f}catch(f){if(f instanceof It)throw f;throw t.close(),t=void 0,new It(`bash: ${f instanceof Error?f.message:String(f)}`)}}finally{c.resolve()}},close:()=>{t?.close(),t=void 0}})}function nr(s){return W(s.unrestrictedPaths),T({name:"read",description:"Read a UTF-8 text file relative to the workdir.",inputSchema:{type:"object",properties:{file_path:{type:"string"},view_range:{type:"array",items:{type:"integer"},description:"[start_line, end_line] 1-indexed inclusive"}},required:["file_path"]},run:async({file_path:t,view_range:e})=>{if(!t)throw new It("read: file_path is required");let r=await re(s,t);if(e?.length&&e.length!==2)throw new It("read: view_range must be [start_line, end_line]");let n;try{let l=await _.stat(r);if(!l.isFile())throw new It(`read: ${t} is not a regular file`);let h=lt(s.maxFileBytes);if(h!==null&&l.size>h){if(!e?.length)throw new It(`read: ${t} is ${l.size} bytes, exceeds ${h}-byte limit. Use the view_range parameter to read specific line ranges, e.g. view_range: [1, 500].`);let[y,S]=e;return await ir(r,t,y,S,h)}n=await _.readFile(r,"utf8")}catch(l){if(l instanceof It)throw l;throw new It(`read: ${U(l,t)}`)}if(!e?.length)return n;let[i,o]=e,a=n.split(`
12
+ `),c=Math.max(0,i-1),f=o>0?o:a.length;return a.slice(c,f).join(`
13
+ `)}})}async function ir(s,t,e,r,n){let i=new sr(t,e,r,n);if(i.rangeIsEmpty())return"";let o=te.createReadStream(s,{highWaterMark:Vt});try{for await(let a of o)if(i.collectFrom(a),i.rangeIsCollected())break}finally{o.destroy()}return i.text()}var sr=(()=>{class s{constructor(t,e,r,n){me.add(this),Z.set(this,void 0),ue.set(this,void 0),pe.set(this,void 0),D.set(this,void 0),F.set(this,void 0),z.set(this,void 0),P.set(this,0),Q.set(this,[]),R.set(this,0),C(this,Z,t,"f"),C(this,ue,e,"f"),C(this,pe,r,"f"),C(this,D,Math.max(0,e-1),"f"),C(this,F,r>0?r:1/0,"f"),C(this,z,n,"f")}rangeIsEmpty(){return d(this,F,"f")<=d(this,D,"f")}rangeIsCollected(){return d(this,P,"f")>=d(this,F,"f")}collectFrom(t){var e;let r=0;while(r<t.length&&!this.rangeIsCollected()){let n=t.indexOf(10,r),i=n<0?t.length:n;if(d(this,P,"f")>=d(this,D,"f"))d(this,me,"m",et).call(this,t.subarray(r,i),n>=0);if(n<0)break;C(this,P,(e=d(this,P,"f"),e++,e),"f"),r=n+1}}text(){return Buffer.concat(d(this,Q,"f"),d(this,R,"f")).toString("utf8")}}return Z=new WeakMap,ue=new WeakMap,pe=new WeakMap,D=new WeakMap,F=new WeakMap,z=new WeakMap,P=new WeakMap,Q=new WeakMap,R=new WeakMap,me=new WeakSet,et=function(e,r){if(d(this,Q,"f").push(e),C(this,R,d(this,R,"f")+e.length,"f"),r&&d(this,P,"f")+1<d(this,F,"f"))d(this,Q,"f").push(nt),C(this,R,d(this,R,"f")+nt.length,"f");if(d(this,R,"f")>d(this,z,"f"))throw d(this,me,"m",tt).call(this)},tt=function(){if(d(this,F,"f")-d(this,D,"f")===1)return new It(`read: line ${d(this,D,"f")+1} of ${d(this,Z,"f")} alone exceeds ${d(this,z,"f")}-byte limit. The read tool cannot return part of a line, so view_range cannot narrow this further.`);return new It(`read: view_range [${d(this,ue,"f")}, ${d(this,pe,"f")}] of ${d(this,Z,"f")} exceeds ${d(this,z,"f")}-byte limit. Narrow the view_range to read a smaller portion.`)},s})();function or(s){return W(s.unrestrictedPaths),T({name:"write",description:"Write a UTF-8 text file relative to the workdir, creating parent directories as needed.",inputSchema:{type:"object",properties:{file_path:{type:"string"},content:{type:"string"}},required:["file_path","content"]},run:async({file_path:t,content:e})=>{if(!t)throw new It("write: file_path is required");let r=await re(s,t),n=await ft(s,r);if(n!==void 0)throw new It(`write: ${t} is inside read-only directory ${n}`);try{await _.mkdir(b.dirname(r),{recursive:!0,mode:G}),await _e(r,e??"")}catch(i){throw new It(`write: ${U(i,t)}`)}return`wrote ${Buffer.byteLength(e??"")} bytes to ${t}`}})}function ar(s){return W(s.unrestrictedPaths),T({name:"edit",description:"Replace old_string with new_string in a file. old_string must be unique unless replace_all.",inputSchema:{type:"object",properties:{file_path:{type:"string"},old_string:{type:"string"},new_string:{type:"string"},replace_all:{type:"boolean"}},required:["file_path","old_string","new_string"]},run:async({file_path:t,old_string:e,new_string:r,replace_all:n})=>{if(!t)throw new It("edit: file_path is required");if(!e)throw new It("edit: old_string is required");let i=await re(s,t),o=await ft(s,i);if(o!==void 0)throw new It(`edit: ${t} is inside read-only directory ${o}`);let a;try{let l=await _.stat(i);if(!l.isFile())throw new It(`edit: ${t} is not a regular file`);let h=lt(s.maxFileBytes);if(h!==null&&l.size>h)throw new It(`edit: ${t} is ${l.size} bytes, exceeds ${h}-byte limit. The edit tool loads the whole file and cannot modify a file this large.`);a=await _.readFile(i,"utf8")}catch(l){if(l instanceof It)throw l;throw new It(`edit: ${U(l,t)}`)}let c=a.split(e).length-1;if(c===0)throw new It(`edit: old_string not found in ${t}`);let f;if(n)f=a.split(e).join(r);else{if(c>1)throw new It(`edit: old_string appears ${c} times in ${t} (must be unique)`);f=a.replace(e,()=>r)}try{await _e(i,f)}catch(l){throw new It(`edit: write: ${U(l,t)}`)}return`edited ${t} (${n?c:1} replacement(s))`}})}function cr(s){return s.split(/[\\/{},]/).includes("..")}function lr(s){return W(s.unrestrictedPaths),T({name:"glob",description:"Match files under the workdir against a glob pattern. Results are mtime-sorted, newest first.",inputSchema:{type:"object",properties:{pattern:{type:"string"},path:{type:"string",description:"Directory to search in. Defaults to the workdir."}},required:["pattern"]},run:async({pattern:t,path:e})=>{if(!t)throw new It("glob: pattern is required");if(b.isAbsolute(t))throw new It("glob: absolute pattern not permitted; pass a relative pattern (and optionally path)");if(cr(t))throw new It('glob: ".." is not permitted in the pattern');let r=e?await re(s,e):b.resolve(s.workdir),n=e?r:await H(r),i=[],o=ht;try{for await(let a of Qt(t,{cwd:r,withFileTypes:!0,exclude:(c)=>c.name===".git"||c.name==="node_modules"})){if(o--<=0)break;if(!a.isFile())continue;let c=b.join(a.parentPath,a.name),f;try{f=await _.realpath(c)}catch{continue}if(!ie(n,f))continue;let l=0;try{l=(await _.stat(c)).mtimeMs}catch{}i.push({path:c,mtime:l})}}catch(a){throw new It(`glob: ${a instanceof Error?a.message:String(a)}`)}if(i.length===0)return"no matches";return i.sort((a,c)=>c.mtime-a.mtime),i.slice(0,Jt).map((a)=>a.path).join(`
14
+ `)}})}function fr(s){return W(s.unrestrictedPaths),T({name:"grep",description:"Search file contents for a regex. Uses ripgrep if available, otherwise a built-in walker.",inputSchema:{type:"object",properties:{pattern:{type:"string"},path:{type:"string"}},required:["pattern"]},run:async({pattern:t,path:e},r)=>{if(!t)throw new It("grep: pattern is required");let n=b.resolve(s.workdir);if(e)n=await re(s,e);let i=await pr();return i?hr(i,t,n,r?.signal):dr(t,n,r?.signal)}})}function hr(s,t,e,r){return new Promise((n,i)=>{let o=Ne.spawn(s,["-n","--no-heading","-e",t,"--",e],{...r?{signal:r}:{}}),a="",c="",f=!1;o.stdout.on("data",(l)=>{if(f)return;if(a+=l,a.length>ee)f=!0,a=a.slice(0,ee),o.kill("SIGKILL")}),o.stderr.on("data",(l)=>c+=l),o.on("close",(l)=>{if(r?.aborted)return i(new It("grep: aborted"));if(f)return n(a+`
15
+ [output truncated at ${ee} bytes]`);if(l===0)return n(a);if(l===1)return n("no matches");i(new It(`grep: rg failed: ${c||`exit ${l}`}`))}),o.on("error",(l)=>{if(r?.aborted)return i(new It("grep: aborted"));i(new It(`grep: rg failed: ${l.message}`))})})}async function dr(s,t,e){let r;try{r=new RegExp(s)}catch(c){throw new It(`grep: invalid regex: ${c instanceof Error?c.message:String(c)}`)}let n=[],i=ee,o=(c)=>{if(i-=c.length+1,i<0)return n.push(`[output truncated at ${ee} bytes]`),!1;return n.push(c),!0};if((await _.stat(t).catch(()=>null))?.isFile())await it(t,r,o);else await ur(t,"",(c)=>it(b.join(t,c),r,o),e);if(e?.aborted)throw new It("grep: aborted");if(n.length===0)return"no matches";return n.join(`
16
+ `)}async function it(s,t,e){let r=te.createReadStream(s,{encoding:"utf8"}),n=ot.createInterface({input:r,crlfDelay:1/0}),i=0;try{for await(let o of n){if(i++,o.length>Xt)continue;if(t.test(o)&&!e(`${s}:${i}:${o}`))return!1}}catch{}finally{r.destroy()}return!0}var mr=40,ht=50000;async function ur(s,t,e,r){let n=ht;async function i(o,a){if(a>mr)return!0;if(r?.aborted)return!1;let c;try{c=await _.readdir(b.join(s,o),{withFileTypes:!0})}catch{return!0}for(let f of c){if(f.name===".git"||f.name==="node_modules")continue;if(n--<=0)return!1;if(r?.aborted)return!1;let l=o?b.join(o,f.name):f.name;if(f.isDirectory()){if(!await i(l,a+1))return!1}else if(f.isFile()){if(await e(l)===!1)return!1}}return!0}await i(t,0)}async function pr(){let s=(process.env.PATH??"").split(b.delimiter);for(let t of s){let e=b.join(t,"rg");try{return await _.access(e,te.constants.X_OK),e}catch{}}return null}export{Pt as MEMORY_FLUSH_TIMEOUT_MS,A as SessionMemoryError,Ht as SessionMemoryStores,qr as betaAgentToolset20260401,wt as setupSkills};
17
+
18
+ //# debugId=4A9083C3B681998A64756E2164756E21
@@ -0,0 +1,5 @@
1
+ // @bun
2
+ import{e}from"./chunk-z8t0v07j.js";import{m,ke}from"./chunk-32jpxz2y.js";import{so,y,A,z,f,cd,ee,P}from"./chunk-79q5xsdc.js";var s={qualityPreset:"low",targetBitrateKbps:1000,maxThroughputMbps:5,fps:15,maxArchiveSizeMb:100,format:"mp4"},V=["low","medium","high"],b=["mp4"];function g(i){return typeof i==="object"&&i!==null&&!Array.isArray(i)}function hf(i){let n=g(i)?i:{},t=v(n.qualityPreset),r=d(n.maxThroughputMbps,s.maxThroughputMbps,!0),o=d(n.targetBitrateKbps,s.targetBitrateKbps,!0),a=FU(o,r),c=d(n.fps,s.fps,!1),R=d(n.maxArchiveSizeMb,s.maxArchiveSizeMb,!0),w=j(n.format),S=O(n.resolution);return{qualityPreset:t,targetBitrateKbps:a,maxThroughputMbps:r,fps:c,maxArchiveSizeMb:R,format:w,resolution:S}}function v(i){return V.find((n)=>n===i)??s.qualityPreset}function j(i){return b.find((n)=>n===i)??s.format}function O(i){if(!g(i))return;let n=d(i.width,0,!1),t=d(i.height,0,!1);if(n<=0||t<=0)return;return{width:n,height:t}}function FU(i,n){if(!(n>0))return i;let t=Math.max(1,Math.floor(n*1000));return Math.min(i,t)}function d(i,n,t){if(i===null||i===void 0)return n;let r=typeof i==="number"?i:Number(i);if(!Number.isFinite(r)||r<=0)return n;return t?r:Math.round(r)}var SE=["completed","interrupted","incomplete"];function vK(i,n){return i===n||i.startsWith(`${n}:`)}function kJ(i,n){if(!n.ownerSessionUuid)return!0;return i===void 0||i===n.ownerSessionUuid||n.ownerBaseSessionUuid!==void 0&&vK(i,n.ownerBaseSessionUuid)}function D(i){try{let n=JSON.parse(i);return hf(n)}catch(n){return e.warn(`[VideoRecordingRepository] Failed to parse config JSON: ${n}`),hf(null)}}var N=f({appearedAtSeconds:A().finite(),disappearedAtSeconds:A().finite().optional()}),T=so((i)=>{if(typeof i!=="object"||i===null)return!1;let{description:n,shape:t,timeline:r}=i;return(n===void 0||typeof n==="string")&&typeof t==="object"&&t!==null&&typeof t.type==="string"&&N.safeParse(r).success}),l=f({key:y(),role:P(["inner","cover","rear","external","cluster","overlay","virtual","unknown"])}),x=z(f({atMs:A().finite(),from:l,to:l}));function I(i){if(!i)return;let n;try{n=JSON.parse(i)}catch(r){e.warn(`[VideoRecordingRepository] Failed to parse highlights JSON: ${r}`);return}if(!Array.isArray(n))return;return n.flatMap((r)=>{let o=T.safeParse(r);if(!o.success)return e.warn(`[VideoRecordingRepository] Dropping invalid highlight: ${o.error.message}`),[];return[o.data]})}var U=z(y());function u(i,n){if(!i)return;try{return n.parse(JSON.parse(i))}catch(t){e.warn(`[VideoRecordingRepository] Failed to parse display metadata: ${t}`);return}}var k=cd("kind",[f({kind:ee("android-screenrecord"),deviceTempPath:y().min(1),devicePid:A().int().positive().max(Number.MAX_SAFE_INTEGER).optional()}),f({kind:ee("ios-host-recorder"),hostPid:A().int().positive().max(Number.MAX_SAFE_INTEGER),hostStartToken:y().min(1),udid:y().min(1),capturePath:y().optional()})]);function B(i){if(i===null)return;try{return k.parse(JSON.parse(i))}catch(n){e.warn("[VideoRecordingRepository] Failed to parse capture teardown descriptor",n);return}}function _(i){return{recordingId:i.recording_id,recorderDaemonSessionId:i.recorder_daemon_session_id??void 0,captureTeardown:B(i.capture_teardown_json),deviceId:i.device_id,platform:i.platform,status:i.status,outputName:i.output_name??void 0,fileName:i.file_name,filePath:i.file_path,format:i.format,sizeBytes:i.size_bytes,durationMs:i.duration_ms??void 0,codec:i.codec??void 0,createdAt:i.created_at,startedAt:i.started_at,endedAt:i.ended_at??void 0,lastAccessedAt:i.last_accessed_at,config:D(i.config_json),highlights:I(i.highlights_json??null),recordedPanel:u(i.recorded_panel_json,l),transitions:u(i.display_transitions_json,x),...i.has_audio_track===null?{}:{hasAudioTrack:i.has_audio_track===1},warnings:u(i.warnings_json,U),ownerSessionUuid:i.owner_session_uuid??void 0}}function p(i,n){let{ownerSessionUuid:t,ownerBaseSessionUuid:r}=n;if(!t)return i;return i.where((o)=>{let a=[o("owner_session_uuid","is",null),o("owner_session_uuid","=",t)];if(r!==void 0){let c=`${r}:`;a.push(o("owner_session_uuid","=",r),o(m`substr(owner_session_uuid, 1, ${Array.from(c).length})`,"=",c))}return o.or(a)})}function M(i,n){let t=Array.from(n.excludeLiveDaemonSessionIds??[]);if(t.length>0){if(t.filter((o)=>o!==n.ownDaemonSessionId).length>0)i=i.where("recorder_daemon_session_id","is not",null);i=i.where((o)=>o.or([o("recorder_daemon_session_id","is",null),o("recorder_daemon_session_id","not in",t)])).where((o)=>o.not(o.exists(o.selectFrom("device_sessions").select("session_uuid").whereRef("device_sessions.session_uuid","=","video_recordings.owner_session_uuid").where("device_sessions.status","=","active").where("device_sessions.daemon_session_id","in",t))))}if(n.hasCaptureTeardown)i=i.where("capture_teardown_json","is not",null);return i}function F(i){let n={};if(E(n,i),J(n,i),Q(n,i),Object.hasOwn(i,"captureTeardown"))n.capture_teardown_json=i.captureTeardown?JSON.stringify(i.captureTeardown):null;return n}function C(i,n){if(n.deviceId!==void 0)i.device_id=n.deviceId;if(n.platform!==void 0)i.platform=n.platform;if(n.status!==void 0)i.status=n.status;if(n.outputName!==void 0)i.output_name=n.outputName??null}function E(i,n){if(C(i,n),n.fileName!==void 0)i.file_name=n.fileName;if(n.filePath!==void 0)i.file_path=n.filePath;if(n.format!==void 0)i.format=n.format;if(n.sizeBytes!==void 0)i.size_bytes=n.sizeBytes;if(n.durationMs!==void 0)i.duration_ms=n.durationMs??null;if(n.codec!==void 0)i.codec=n.codec??null}function J(i,n){if(n.createdAt!==void 0)i.created_at=n.createdAt;if(n.startedAt!==void 0)i.started_at=n.startedAt;if(n.endedAt!==void 0)i.ended_at=n.endedAt??null;if(n.lastAccessedAt!==void 0)i.last_accessed_at=n.lastAccessedAt}function Q(i,n){if(n.config!==void 0)i.config_json=JSON.stringify(n.config);if(n.highlights!==void 0)i.highlights_json=JSON.stringify(n.highlights??[]);if(n.recordedPanel!==void 0)i.recorded_panel_json=JSON.stringify(n.recordedPanel);if(n.transitions!==void 0)i.display_transitions_json=JSON.stringify(n.transitions);if(n.ownerSessionUuid!==void 0)i.owner_session_uuid=n.ownerSessionUuid??null;K(i,n)}function h(i){if(i===void 0)return null;return i?1:0}function K(i,n){if(n.hasAudioTrack!==void 0)i.has_audio_track=h(n.hasAudioTrack);if(n.warnings!==void 0)i.warnings_json=JSON.stringify(n.warnings)}class LU{db;constructor({db:i}={}){this.db=i??null}getDb(){return this.db??ke()}async insertRecording(i){let n=await this.getDb(),t={recording_id:i.recordingId,recorder_daemon_session_id:i.recorderDaemonSessionId??null,device_id:i.deviceId,platform:i.platform,status:i.status,output_name:i.outputName??null,file_name:i.fileName,file_path:i.filePath,format:i.format,size_bytes:i.sizeBytes,duration_ms:i.durationMs??null,codec:i.codec??null,created_at:i.createdAt,started_at:i.startedAt,ended_at:i.endedAt??null,last_accessed_at:i.lastAccessedAt,config_json:JSON.stringify(i.config),highlights_json:i.highlights?JSON.stringify(i.highlights):null,capture_teardown_json:i.captureTeardown?JSON.stringify(i.captureTeardown):null,recorded_panel_json:i.recordedPanel?JSON.stringify(i.recordedPanel):null,display_transitions_json:i.transitions?JSON.stringify(i.transitions):null,has_audio_track:h(i.hasAudioTrack),warnings_json:i.warnings?JSON.stringify(i.warnings):null,owner_session_uuid:i.ownerSessionUuid??null};await n.insertInto("video_recordings").values(t).onConflict((r)=>r.column("recording_id").doUpdateSet({recorder_daemon_session_id:m`coalesce(${t.recorder_daemon_session_id}, video_recordings.recorder_daemon_session_id)`,device_id:t.device_id,platform:t.platform,status:t.status,output_name:t.output_name,file_name:t.file_name,file_path:t.file_path,format:t.format,size_bytes:t.size_bytes,duration_ms:t.duration_ms,codec:t.codec,started_at:t.started_at,ended_at:t.ended_at,last_accessed_at:t.last_accessed_at,config_json:t.config_json,highlights_json:t.highlights_json,capture_teardown_json:t.capture_teardown_json,recorded_panel_json:t.recorded_panel_json,display_transitions_json:t.display_transitions_json,has_audio_track:t.has_audio_track,warnings_json:t.warnings_json,owner_session_uuid:t.owner_session_uuid})).execute()}async updateRecording(i,n){let t=await this.getDb(),r=F(n);if(Object.keys(r).length===0)return;await t.updateTable("video_recordings").set(r).where("recording_id","=",i).execute()}async getRecording(i,n={}){let r=(await this.getDb()).selectFrom("video_recordings").selectAll().where("recording_id","=",i);r=p(r,n);let o=await r.executeTakeFirst();return o?_(o):null}async listRecordings(i={}){let t=(await this.getDb()).selectFrom("video_recordings").selectAll();if(t=p(t,i),t=M(t,i),i.status!==void 0){let o=Array.isArray(i.status)?i.status:[i.status];t=t.where("status","in",o)}if(i.deviceId)t=t.where("device_id","=",i.deviceId);if(i.platform)t=t.where("platform","=",i.platform);if(i.orderByLastAccessed)t=t.orderBy("last_accessed_at",i.orderByLastAccessed);if(i.orderByStartedAt)t=t.orderBy("started_at",i.orderByStartedAt).orderBy("recording_id",i.orderByStartedAt);if(i.limit&&i.limit>0)t=t.limit(i.limit);return(await t.execute()).map(_)}async getLatestRecording(){return(await this.listRecordings({status:SE,orderByStartedAt:"desc",limit:1}))[0]??null}async touchRecording(i,n){await this.updateRecording(i,{lastAccessedAt:n})}async deleteRecording(i){let t=await(await this.getDb()).deleteFrom("video_recordings").where("recording_id","=",i).executeTakeFirst();return Number(t.numDeletedRows??0)>0}}
3
+ export{hf,FU,SE,vK,kJ,LU};
4
+
5
+ //# debugId=53D2CF904F27DC8E64756E2164756E21
@@ -0,0 +1,5 @@
1
+ // @bun
2
+ import{ke,BD}from"./chunk-32jpxz2y.js";class S${async initialize(){ke(),await BD()}}
3
+ export{S$};
4
+
5
+ //# debugId=14FEADCD68C2E7F064756E2164756E21
@@ -0,0 +1,4 @@
1
+ // @bun
2
+ import{LG,BG}from"./chunk-vs9r72ta.js";import"./chunk-mqc1d0eb.js";import"./chunk-nwm2pq5v.js";import"./chunk-a4k9rt7z.js";import"./chunk-8cghfzb2.js";import"./chunk-44bt78m9.js";import"./chunk-a2sc4jm0.js";import"./chunk-jhnbfj19.js";import"./chunk-sjn0nj4p.js";import"./chunk-tyazf3sk.js";import"./chunk-bn64x5z5.js";import"./chunk-0e4gm1kj.js";import"./chunk-4fgdhcwx.js";import"./chunk-6d3mmqxt.js";import"./chunk-sns0c35v.js";import"./chunk-h3n4adc6.js";import"./chunk-32jpxz2y.js";import"./chunk-79q5xsdc.js";import"./chunk-ggtd5x5a.js";import"./chunk-z8t0v07j.js";import"./chunk-mf9spd4g.js";export{LG as printUnknownDaemonCommand,BG as runDaemonCommand};
3
+
4
+ //# debugId=B5801593B03F858664756E2164756E21
@@ -0,0 +1,5 @@
1
+ // @bun
2
+ import{i,te,e}from"./chunk-z8t0v07j.js";import{Jr}from"./chunk-h3n4adc6.js";import{sC}from"./chunk-6d3mmqxt.js";import{W3,nb,LD,Kz}from"./chunk-32jpxz2y.js";import{wp,u}from"./chunk-9rkfyt6q.js";var p=300000;class dO{store;windowMs;constructor(r=new sC,t=p){this.store=r,this.windowMs=t}recordFailure(r,t){let a=this.read().filter((o)=>t-o.at<=this.windowMs);a.push({at:t,kind:r});try{this.store.write(JSON.stringify(a))}catch(o){return e.debug(`Failed to persist startup failure tracker: ${o}`),Math.max(a.length,2)}return a.length}reset(){this.store.clear()}read(){let r=this.store.read();if(r===null)return[];try{let t=JSON.parse(r);if(!Array.isArray(t))return[];return t.filter((a)=>typeof a?.at==="number"&&(a.kind==="transient"||a.kind==="permanent"))}catch(t){return e.debug(`Failed to parse startup failure tracker contents: ${t}`),[]}}}var d=Math.max(1000,Jr-2000);async function P$(r,t,a=i){let o=W3(r),n=t.recordFailure(o,a.now()),c=Kz(r)?`${o}/${nb}`:o;if(e.error(`Fatal: database initialization failed (${c}; ${n} recent failure(s)); daemon cannot serve queries and will exit for a clean restart: ${wp(r)}`),o==="permanent"&&n>1){let l=te({initialDelayMs:1000,multiplier:2,maxDelayMs:d}).delayForAttempt(n-1);e.error(`Database initialization has failed ${n} times; backing off ${l}ms before exit to avoid a restart hot-loop.`),await a.sleep(l)}let s=u(r,"Database initialization failed at daemon startup");if(Kz(r))s.code=nb;throw s}function Roe(r){return Kz(r)?LD:1}async function Poe(r,t=new dO,a=i){try{await r()}catch(o){await P$(o,t,a)}}
3
+ export{dO,P$,Roe,Poe};
4
+
5
+ //# debugId=A0FBF46811C616C164756E2164756E21