claude-code-best 1.1.0 → 1.2.0

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 (514) hide show
  1. package/README.md +66 -75
  2. package/dist/{chunk-q5b91nhh.js → chunk-01qzvbp3.js} +8 -2
  3. package/dist/{chunk-f9b4wb89.js → chunk-053bj0m0.js} +79 -73
  4. package/dist/chunk-05tt9tt1.js +653 -0
  5. package/dist/chunk-06sq1vz3.js +403 -0
  6. package/dist/chunk-07069jq1.js +30 -0
  7. package/dist/chunk-0dac8msw.js +135 -0
  8. package/dist/{chunk-m5eb5pt2.js → chunk-0ja0y3at.js} +6 -6
  9. package/dist/chunk-0jzdwbdc.js +14 -0
  10. package/dist/chunk-0nrq46nf.js +313 -0
  11. package/dist/chunk-0qz705wz.js +192 -0
  12. package/dist/{chunk-m94pnhfa.js → chunk-0rn4v8sg.js} +38 -28
  13. package/dist/{chunk-1cbn5kxf.js → chunk-0rpb2bdp.js} +3 -2
  14. package/dist/{chunk-zz21rvr7.js → chunk-127cmycn.js} +8 -5
  15. package/dist/chunk-12vk6z7z.js +109 -0
  16. package/dist/{chunk-vybkxr18.js → chunk-15y014gg.js} +41 -31
  17. package/dist/{chunk-44fpr6jq.js → chunk-168xb8v1.js} +4 -2
  18. package/dist/{chunk-8hsyagr8.js → chunk-16bnxyz0.js} +1 -1
  19. package/dist/{chunk-wsqhnjj3.js → chunk-1atfzck5.js} +24 -24
  20. package/dist/chunk-1cbhkqxg.js +310 -0
  21. package/dist/chunk-1csq8bf1.js +295 -0
  22. package/dist/{chunk-0e1xsncc.js → chunk-1cwdhk7a.js} +1 -1
  23. package/dist/{chunk-c8jv6rtj.js → chunk-1ebqpwhn.js} +74 -68
  24. package/dist/{chunk-vyd8jzde.js → chunk-1mh5vt6v.js} +91 -83
  25. package/dist/chunk-1qf125vg.js +123 -0
  26. package/dist/{chunk-ryj80g9p.js → chunk-1sp6713v.js} +131 -176
  27. package/dist/{chunk-d18z9pna.js → chunk-1thgdca1.js} +2 -2
  28. package/dist/chunk-1z1gfx2c.js +443 -0
  29. package/dist/{chunk-wc6wwwyb.js → chunk-21z7acxh.js} +3 -3
  30. package/dist/chunk-229pcf6p.js +509 -0
  31. package/dist/chunk-238g70xa.js +1 -1
  32. package/dist/{chunk-vpb723tx.js → chunk-23ad5t92.js} +5 -5
  33. package/dist/chunk-28043j1k.js +68 -0
  34. package/dist/chunk-299r6d9v.js +141 -0
  35. package/dist/{chunk-a6s8wnhe.js → chunk-2bw5nqsw.js} +4 -4
  36. package/dist/chunk-2mxstrx5.js +445 -0
  37. package/dist/{chunk-9g827w4j.js → chunk-2q39ej51.js} +6 -6
  38. package/dist/chunk-2qwgfjcj.js +5370 -0
  39. package/dist/chunk-2ss23j0q.js +3587 -0
  40. package/dist/{chunk-hy3g1nv8.js → chunk-2wvxddsg.js} +9 -7
  41. package/dist/chunk-2x2aznpc.js +134 -0
  42. package/dist/{chunk-bqq4zamw.js → chunk-2ys5wcxk.js} +3 -3
  43. package/dist/{chunk-x51h62jq.js → chunk-3cvcwgsr.js} +74 -68
  44. package/dist/{chunk-mecs0gpc.js → chunk-3xv7rjsy.js} +14 -11
  45. package/dist/chunk-42x5tjk2.js +42 -0
  46. package/dist/{chunk-q6rax9kh.js → chunk-436r0x2n.js} +5 -5
  47. package/dist/{chunk-zgrg0wk3.js → chunk-44q4jkwa.js} +27 -67
  48. package/dist/{chunk-zq9xa1xe.js → chunk-44w22kyx.js} +104 -139
  49. package/dist/{chunk-yhd82045.js → chunk-46fcr28b.js} +30 -9
  50. package/dist/{chunk-wm2f2f1z.js → chunk-474y75ga.js} +2 -2
  51. package/dist/{chunk-6fkwz9yk.js → chunk-478rpnqm.js} +8 -8
  52. package/dist/{chunk-rj86xm6z.js → chunk-48w0df8a.js} +1 -1
  53. package/dist/{chunk-v4t6dyyh.js → chunk-4cp6193g.js} +2 -2
  54. package/dist/chunk-4d0de73v.js +436 -0
  55. package/dist/chunk-4eecm90d.js +1030 -0
  56. package/dist/{chunk-q7tvkc86.js → chunk-4f4ccg1h.js} +10 -115
  57. package/dist/chunk-4h102wt5.js +65 -0
  58. package/dist/{chunk-3mgywd32.js → chunk-4hv90qcz.js} +1 -1
  59. package/dist/{chunk-bcrxtdcy.js → chunk-4jcqmf9w.js} +39 -29
  60. package/dist/{chunk-v8xem37v.js → chunk-4kk7vxed.js} +8 -6
  61. package/dist/chunk-4nspekjp.js +69 -0
  62. package/dist/chunk-4xmb7bvy.js +125 -0
  63. package/dist/{chunk-427m88ms.js → chunk-4xy0c1dz.js} +8 -8
  64. package/dist/{chunk-41mpwc8h.js → chunk-53c9gb9c.js} +19 -15
  65. package/dist/{chunk-bpts9jbq.js → chunk-53zsn91p.js} +39 -31
  66. package/dist/{chunk-t7cbhqd2.js → chunk-548g1d6z.js} +104 -119
  67. package/dist/chunk-559yvwh1.js +63 -0
  68. package/dist/chunk-5a6ahhvy.js +594 -0
  69. package/dist/{chunk-5tx8dsy0.js → chunk-5c6man70.js} +9531 -18004
  70. package/dist/chunk-5hb5ev7b.js +74 -0
  71. package/dist/{chunk-ggqx30m9.js → chunk-5z28bqne.js} +23 -311
  72. package/dist/{chunk-p7g7pf3f.js → chunk-61ahbn23.js} +8 -6
  73. package/dist/{chunk-0sb5scxx.js → chunk-652wnf1z.js} +5 -5
  74. package/dist/{chunk-7tqhx6dr.js → chunk-66jkaz3q.js} +109 -213
  75. package/dist/{chunk-q25bjaev.js → chunk-677as3nh.js} +2 -2
  76. package/dist/chunk-68ksfahx.js +386 -0
  77. package/dist/{chunk-xs0hwvpa.js → chunk-68pfxvxt.js} +14 -9
  78. package/dist/{chunk-epmheefa.js → chunk-69hys77v.js} +8 -8
  79. package/dist/{chunk-9g2ncq68.js → chunk-6ayqcq3h.js} +120 -127
  80. package/dist/chunk-6kpbgc5w.js +23 -0
  81. package/dist/chunk-6mpsxxsf.js +362 -0
  82. package/dist/chunk-6nze0g86.js +119 -0
  83. package/dist/{chunk-v1mgv1et.js → chunk-6p4cyhb3.js} +4 -3
  84. package/dist/{chunk-2w8633e3.js → chunk-6t62dbnb.js} +61 -100
  85. package/dist/chunk-6t87a3q6.js +2842 -0
  86. package/dist/{chunk-6mz58s8p.js → chunk-6xana182.js} +18 -14
  87. package/dist/{chunk-fpf4cgbt.js → chunk-7bfach0x.js} +9 -9
  88. package/dist/{chunk-n7158r58.js → chunk-7f1ggjr2.js} +75 -69
  89. package/dist/chunk-7fxjmmfw.js +1172 -0
  90. package/dist/{chunk-ckcagq32.js → chunk-7gqf9wej.js} +5 -5
  91. package/dist/{chunk-b1xt9jqg.js → chunk-7j3dkjqq.js} +15 -5
  92. package/dist/chunk-7ns74x0q.js +475 -0
  93. package/dist/{chunk-ghr4s9g6.js → chunk-7qmknpkq.js} +75 -69
  94. package/dist/chunk-7rzepn9c.js +83 -0
  95. package/dist/chunk-7tdcwje9.js +68 -0
  96. package/dist/{chunk-b4mnbry0.js → chunk-8201tnhf.js} +4 -4
  97. package/dist/{chunk-dv1wfr85.js → chunk-8225arm6.js} +5 -4
  98. package/dist/chunk-822wfv88.js +70 -0
  99. package/dist/chunk-837tm8ht.js +183 -0
  100. package/dist/chunk-8a2ajt5d.js +878 -0
  101. package/dist/{chunk-bj0rvnjw.js → chunk-8bymxfn4.js} +39 -29
  102. package/dist/chunk-8cwbzk7h.js +118 -0
  103. package/dist/chunk-8d0ev0m2.js +111 -0
  104. package/dist/{chunk-4pbx3g7s.js → chunk-8g747a8x.js} +1 -1
  105. package/dist/chunk-8kfwb79z.js +436 -0
  106. package/dist/{chunk-xyqr1cww.js → chunk-8me0yq6v.js} +12 -12
  107. package/dist/{chunk-k5gdea6r.js → chunk-8n8285ax.js} +78 -72
  108. package/dist/{chunk-sdj9b9wh.js → chunk-8pn8tvgg.js} +9 -154
  109. package/dist/{chunk-d7mx1phm.js → chunk-8qhr4n77.js} +61 -103
  110. package/dist/{chunk-7ejt5gqq.js → chunk-8s9bbk3r.js} +58 -45
  111. package/dist/{chunk-bmvb57qb.js → chunk-905d2hee.js} +5 -5
  112. package/dist/{chunk-fk06pejm.js → chunk-91xq5y4a.js} +9 -9
  113. package/dist/{chunk-ahjgghpe.js → chunk-93xsyzsp.js} +1 -1
  114. package/dist/chunk-99pmbfqp.js +230 -0
  115. package/dist/{chunk-cgn27dqf.js → chunk-9f14bkn9.js} +3 -3
  116. package/dist/{chunk-sa7nc0vv.js → chunk-9m78gjpd.js} +1 -1
  117. package/dist/{chunk-kq098bkj.js → chunk-9pm2d2gv.js} +245 -316
  118. package/dist/chunk-a136cvvz.js +27 -0
  119. package/dist/{chunk-n5t9m8h9.js → chunk-a1bjde7d.js} +7 -7
  120. package/dist/chunk-a2evk7n1.js +168 -0
  121. package/dist/{chunk-khdjg2v9.js → chunk-a3k4w4cm.js} +38 -28
  122. package/dist/chunk-a3mcc1sb.js +1403 -0
  123. package/dist/{chunk-8hq5kk3y.js → chunk-a4twdmhf.js} +3 -2
  124. package/dist/chunk-a8eaey19.js +66 -0
  125. package/dist/chunk-abkb5pw6.js +426 -0
  126. package/dist/chunk-ae76ded0.js +30 -0
  127. package/dist/{chunk-660kcy7p.js → chunk-agx5w9ce.js} +14 -8
  128. package/dist/chunk-ah46h8rp.js +70 -0
  129. package/dist/chunk-aj3azy6z.js +409 -0
  130. package/dist/chunk-an6z4rzv.js +158 -0
  131. package/dist/{chunk-r6b58y3x.js → chunk-ase86y73.js} +1 -3
  132. package/dist/{chunk-v0wa5ref.js → chunk-avfjb6pd.js} +13 -555
  133. package/dist/{chunk-5mrhhmas.js → chunk-az5x70pn.js} +8 -5
  134. package/dist/{chunk-49k5ktrj.js → chunk-b6rg3egp.js} +30 -15
  135. package/dist/chunk-b73r6ngr.js +125 -0
  136. package/dist/{chunk-8bedvdm1.js → chunk-b81hd3m6.js} +1 -1
  137. package/dist/{chunk-z7pr85qw.js → chunk-b9mhpc0v.js} +3 -3
  138. package/dist/chunk-b9ndqcdv.js +139 -0
  139. package/dist/{chunk-n5516f5q.js → chunk-bd8zk9tn.js} +4 -4
  140. package/dist/chunk-bdy6n17s.js +343 -0
  141. package/dist/{chunk-r55r29js.js → chunk-bf1j3azq.js} +131 -111
  142. package/dist/{chunk-83z0wrnz.js → chunk-bfcet2mw.js} +2 -2
  143. package/dist/{chunk-jy35mvy3.js → chunk-bmjmrk76.js} +7 -7
  144. package/dist/{chunk-2j0j79p0.js → chunk-bsj8e2mb.js} +8 -8
  145. package/dist/{chunk-snvypj85.js → chunk-bt64sq5y.js} +3 -2
  146. package/dist/{chunk-vyc0rjyx.js → chunk-bwg7582d.js} +1 -1
  147. package/dist/{chunk-3be7ka25.js → chunk-bxcfz5gy.js} +1 -1
  148. package/dist/{chunk-mvss16tj.js → chunk-c1k9tg7h.js} +289 -624
  149. package/dist/{chunk-crr52hf4.js → chunk-c5pxerks.js} +13 -11
  150. package/dist/chunk-c6sjhj89.js +1284 -0
  151. package/dist/{chunk-q6dpqj3z.js → chunk-c9q0phsg.js} +9 -6
  152. package/dist/chunk-caj0ab74.js +129 -0
  153. package/dist/{chunk-f64npa3b.js → chunk-chsyvavm.js} +704 -4
  154. package/dist/{chunk-dqh7e4mt.js → chunk-cjpt035a.js} +51 -41
  155. package/dist/{chunk-z8nbjar4.js → chunk-cmcbatgz.js} +7 -5
  156. package/dist/chunk-cnsj3vq2.js +35 -0
  157. package/dist/chunk-cqjmxeqv.js +269 -0
  158. package/dist/{chunk-bt9krt49.js → chunk-cvb1v08x.js} +38 -32
  159. package/dist/{chunk-j3215c49.js → chunk-cxhvyf7c.js} +227 -370
  160. package/dist/{chunk-24x87knx.js → chunk-cxx0e4nv.js} +1326 -2881
  161. package/dist/chunk-cy2hswr1.js +15 -0
  162. package/dist/{chunk-mwp7sj0q.js → chunk-cy6ezb6j.js} +115140 -121540
  163. package/dist/{chunk-ks0m9njy.js → chunk-d2jekryq.js} +8 -8
  164. package/dist/chunk-d4mdda98.js +94 -0
  165. package/dist/{chunk-33khw5gy.js → chunk-d6ve5pze.js} +7 -7
  166. package/dist/{chunk-26wtxbdc.js → chunk-d7886r6a.js} +6928 -6928
  167. package/dist/{chunk-9t1x831d.js → chunk-d83tmb5h.js} +82 -73
  168. package/dist/{chunk-g5sg6y9q.js → chunk-d8meetqc.js} +78 -71
  169. package/dist/{chunk-ra8fbt9p.js → chunk-d8r0q4ps.js} +537 -871
  170. package/dist/chunk-d95k8xkm.js +84 -0
  171. package/dist/chunk-dd4m7t1v.js +112 -0
  172. package/dist/{chunk-er9vzjac.js → chunk-dekbr08w.js} +16 -14
  173. package/dist/{chunk-cvge4pvp.js → chunk-dk8287aa.js} +1 -1
  174. package/dist/{chunk-9mfbqw9k.js → chunk-dm3n2qgd.js} +4 -4
  175. package/dist/{chunk-n6fbyke9.js → chunk-dmxte86x.js} +3 -3
  176. package/dist/{chunk-t24ytdcw.js → chunk-dqvwn28p.js} +12 -10
  177. package/dist/chunk-drkm8yx2.js +34 -0
  178. package/dist/{chunk-ptwn7qw7.js → chunk-dsbewdgm.js} +38 -10
  179. package/dist/{chunk-w7h2yphx.js → chunk-dwekpr47.js} +2 -2
  180. package/dist/{chunk-ks0dm6t3.js → chunk-e3299veq.js} +16 -70
  181. package/dist/{chunk-4x5ym4h2.js → chunk-e5hcyxae.js} +129 -15
  182. package/dist/chunk-e7h0nd5w.js +106 -0
  183. package/dist/{chunk-s2dmn3yg.js → chunk-eaemyebz.js} +5 -5
  184. package/dist/{chunk-cmdsbsb6.js → chunk-edzkkadh.js} +2 -2
  185. package/dist/chunk-em99fnet.js +128 -0
  186. package/dist/{chunk-hfzj1m07.js → chunk-epyaq1z0.js} +13 -4
  187. package/dist/{chunk-v9y80148.js → chunk-eqmkajs4.js} +96 -189
  188. package/dist/{chunk-cs6y2pc9.js → chunk-ergam9ft.js} +5 -5
  189. package/dist/chunk-es2fdse0.js +63 -0
  190. package/dist/{chunk-cenpqc2t.js → chunk-esn3tgm2.js} +8 -6
  191. package/dist/{chunk-qf2v384j.js → chunk-et8ybmt2.js} +9 -7
  192. package/dist/{chunk-aqa7w38f.js → chunk-ew9rp41b.js} +5 -5
  193. package/dist/{chunk-1yabrspp.js → chunk-ewx6xfzb.js} +2 -2
  194. package/dist/chunk-eyjtbtt0.js +137 -0
  195. package/dist/{chunk-rmbp2das.js → chunk-f0jd2p9n.js} +20 -18
  196. package/dist/{chunk-vzqrbsd1.js → chunk-f69rgsm2.js} +5 -5
  197. package/dist/{chunk-f3bapa1x.js → chunk-f6rbj3gz.js} +12 -7
  198. package/dist/chunk-fbhyqxdg.js +1182 -0
  199. package/dist/chunk-feyzykye.js +10 -0
  200. package/dist/chunk-ffhejx56.js +107 -0
  201. package/dist/{chunk-vbbf707n.js → chunk-fhx6nt2a.js} +38 -28
  202. package/dist/chunk-fkkysfev.js +158 -0
  203. package/dist/chunk-fn510gqw.js +216 -0
  204. package/dist/chunk-ftsg8bjm.js +117 -0
  205. package/dist/{chunk-t3bf8hcf.js → chunk-fyts9grb.js} +2 -2
  206. package/dist/{chunk-kd97kxjn.js → chunk-fz0ch109.js} +3 -2
  207. package/dist/{chunk-ye18m1zb.js → chunk-g1jarkx9.js} +38 -8
  208. package/dist/chunk-g9f19ttm.js +15 -0
  209. package/dist/chunk-g9qte35t.js +341 -0
  210. package/dist/chunk-gaav53dc.js +105 -0
  211. package/dist/chunk-gfx3cwrk.js +75 -0
  212. package/dist/{chunk-z9tgzh90.js → chunk-gk2d1x2a.js} +44 -33
  213. package/dist/chunk-gkbat1p9.js +121 -0
  214. package/dist/{chunk-5b7119h5.js → chunk-gmnyk2t8.js} +8 -6
  215. package/dist/{chunk-qvd0k5dn.js → chunk-gnmdprq3.js} +184 -345
  216. package/dist/{chunk-bq6x1ehp.js → chunk-gpz0ddyz.js} +8 -8
  217. package/dist/{chunk-684kdqez.js → chunk-gv1csnc3.js} +198 -302
  218. package/dist/{chunk-x51mdzqq.js → chunk-gv37c8ax.js} +3 -3
  219. package/dist/{chunk-t6h4wf3k.js → chunk-gzr2601k.js} +9 -9
  220. package/dist/{chunk-45e9mkyr.js → chunk-h3pda469.js} +37 -82
  221. package/dist/{chunk-qqfa0dqg.js → chunk-h4b85amj.js} +20 -32
  222. package/dist/{chunk-j4c8s7tn.js → chunk-h5zv78zq.js} +9 -6
  223. package/dist/{chunk-2wcbcdky.js → chunk-h7edytkc.js} +5 -5
  224. package/dist/{chunk-402jrnj6.js → chunk-ha0wbzc3.js} +8 -8
  225. package/dist/{chunk-nxsh6de2.js → chunk-hcgkak1j.js} +20 -125
  226. package/dist/{chunk-tjaqa99q.js → chunk-hezj20qy.js} +3 -3
  227. package/dist/{chunk-kyer92r4.js → chunk-hf85ht0m.js} +2 -2
  228. package/dist/{chunk-m17y8b22.js → chunk-ht1nfygk.js} +38 -28
  229. package/dist/chunk-j316jjby.js +108 -0
  230. package/dist/chunk-j3fge71v.js +115 -0
  231. package/dist/{chunk-b51jjfh5.js → chunk-j4x0t6k2.js} +42 -31
  232. package/dist/{chunk-9gbamk79.js → chunk-j5bth84e.js} +5 -1
  233. package/dist/chunk-j783d5af.js +134 -0
  234. package/dist/chunk-j7pbwf9x.js +108 -0
  235. package/dist/{chunk-0cpnzx7t.js → chunk-j8rnrm5n.js} +114 -150
  236. package/dist/{chunk-vratq94g.js → chunk-j9gxwbe3.js} +1 -1
  237. package/dist/{chunk-3r24h7t6.js → chunk-jaaxk89e.js} +1 -1
  238. package/dist/{chunk-f4jcw0ea.js → chunk-jaew3662.js} +18 -14
  239. package/dist/{chunk-qpm1tmzz.js → chunk-jbbj16w2.js} +120 -191
  240. package/dist/chunk-jerew25v.js +148 -0
  241. package/dist/{chunk-v399mzxk.js → chunk-jf0p00fz.js} +2 -2
  242. package/dist/{chunk-91r0z5qq.js → chunk-jfsah2w3.js} +1059 -1756
  243. package/dist/{chunk-av73dywf.js → chunk-jna2tcvj.js} +8 -8
  244. package/dist/{chunk-jy35z4n0.js → chunk-jng0mb4r.js} +8 -8
  245. package/dist/chunk-jrrmwfp4.js +66 -0
  246. package/dist/{chunk-3m7ge6tj.js → chunk-jt6fa514.js} +14 -12
  247. package/dist/chunk-jvkyx1b7.js +911 -0
  248. package/dist/{chunk-41xeh3t9.js → chunk-jy6c07wa.js} +4 -4
  249. package/dist/chunk-k1fvb16y.js +269 -0
  250. package/dist/{chunk-bqfnp99q.js → chunk-k3s4yk22.js} +1 -1
  251. package/dist/{chunk-4ycz58wj.js → chunk-k46gxg21.js} +68 -8
  252. package/dist/chunk-k8wwyz2t.js +110 -0
  253. package/dist/{chunk-68qevppc.js → chunk-ka3fdfyb.js} +78 -71
  254. package/dist/{chunk-vaebptnz.js → chunk-ka4x7mhn.js} +38 -28
  255. package/dist/chunk-kb99zpps.js +216 -0
  256. package/dist/{chunk-1dyeexvn.js → chunk-kd3mmsd2.js} +4 -4
  257. package/dist/{chunk-1xkekb9y.js → chunk-kfd89dsd.js} +5 -3
  258. package/dist/{chunk-ecsw41df.js → chunk-km1wcchx.js} +81 -76
  259. package/dist/{chunk-dh6c8y1j.js → chunk-kmhwx18d.js} +3 -3
  260. package/dist/{chunk-224x480q.js → chunk-kq91dwkq.js} +8 -6
  261. package/dist/chunk-m17m84b7.js +111 -0
  262. package/dist/chunk-m1a0s9fd.js +1070 -0
  263. package/dist/{chunk-jafes477.js → chunk-m2bcpk8j.js} +4 -3
  264. package/dist/{chunk-veb0gkcf.js → chunk-m7jtn7dk.js} +74 -68
  265. package/dist/chunk-mq2mgyt9.js +103 -0
  266. package/dist/chunk-msv3w4qp.js +1811 -0
  267. package/dist/{chunk-ch53fgm5.js → chunk-mxe1f4jg.js} +13 -11
  268. package/dist/{chunk-hzttn8j7.js → chunk-mzwjvfr2.js} +124 -126
  269. package/dist/{chunk-2de1vaxf.js → chunk-n2n0sq7r.js} +67 -77
  270. package/dist/{chunk-me2ef6g4.js → chunk-n8mpqdje.js} +1 -1
  271. package/dist/chunk-n9e984ba.js +132 -0
  272. package/dist/chunk-netzwgv1.js +154 -0
  273. package/dist/{chunk-xszk7n10.js → chunk-nh3cd07f.js} +1 -1
  274. package/dist/chunk-njrz6mbe.js +66 -0
  275. package/dist/{chunk-e1ge9n4d.js → chunk-nv7pfr7k.js} +2 -2
  276. package/dist/{chunk-vygf94dw.js → chunk-nwd8pb55.js} +74 -68
  277. package/dist/{chunk-5hva0tsg.js → chunk-p2yv7m0g.js} +6 -6
  278. package/dist/chunk-p5t2vy90.js +259 -0
  279. package/dist/{chunk-zk2wsm7d.js → chunk-p7vkh4wx.js} +2 -2
  280. package/dist/{chunk-da4ve9t5.js → chunk-p8crqj70.js} +10 -10
  281. package/dist/{chunk-n2874aq5.js → chunk-pcngtzr8.js} +12 -6
  282. package/dist/{chunk-6td4c2eq.js → chunk-pdjem6h1.js} +53 -71
  283. package/dist/{chunk-zpc0kwkb.js → chunk-pmxdzjq0.js} +6 -6
  284. package/dist/{chunk-pa7saazk.js → chunk-pnkcecq2.js} +27 -55
  285. package/dist/{chunk-zsfxha74.js → chunk-pshjyzq4.js} +8 -7
  286. package/dist/chunk-pt1yj9zf.js +107 -0
  287. package/dist/{chunk-n9x557ea.js → chunk-py6b9d5b.js} +2312 -4200
  288. package/dist/chunk-q7n8d91g.js +67 -0
  289. package/dist/{chunk-e5pntxye.js → chunk-q7tpyeb3.js} +6 -4
  290. package/dist/{chunk-7ymfj7m3.js → chunk-q82r31er.js} +1 -1
  291. package/dist/chunk-qajrkk97.js +298 -0
  292. package/dist/chunk-qbrh24cn.js +119 -0
  293. package/dist/chunk-qd9ntz7c.js +230 -0
  294. package/dist/chunk-qfr5tcd5.js +2537 -0
  295. package/dist/chunk-qpzfmkct.js +456 -0
  296. package/dist/{chunk-35y0r56v.js → chunk-qtfc6wdh.js} +1 -4
  297. package/dist/chunk-r032587e.js +83 -0
  298. package/dist/{chunk-rryx19hp.js → chunk-r2k2jy0y.js} +2 -2
  299. package/dist/{chunk-pgnnrm2v.js → chunk-r4dnnggx.js} +21 -17
  300. package/dist/{chunk-k9a8jemz.js → chunk-r5n8fvw0.js} +7 -7
  301. package/dist/{chunk-jt0pha6y.js → chunk-r7kh03er.js} +222 -196
  302. package/dist/{chunk-n0k8xrey.js → chunk-rfs0mfg8.js} +140 -158
  303. package/dist/{chunk-dr4qq42x.js → chunk-rgbbtszq.js} +9 -9
  304. package/dist/{chunk-fdwa7gem.js → chunk-rkak3kjw.js} +7 -7
  305. package/dist/chunk-rp568bfw.js +111 -0
  306. package/dist/chunk-rtv718sv.js +146 -0
  307. package/dist/{chunk-rw466wqn.js → chunk-rvkvehat.js} +5284 -3093
  308. package/dist/chunk-s1baskk7.js +14 -0
  309. package/dist/{chunk-2cgdr2n7.js → chunk-s1eb67v3.js} +74 -68
  310. package/dist/{chunk-1szr63w0.js → chunk-s59kx26r.js} +81 -72
  311. package/dist/chunk-s6yk6m3b.js +109 -0
  312. package/dist/{chunk-80qg1pzv.js → chunk-sca71yv8.js} +11 -9
  313. package/dist/chunk-sfrwm87k.js +151 -0
  314. package/dist/chunk-sgaknx21.js +123 -0
  315. package/dist/{chunk-myzwt5yw.js → chunk-snyaz093.js} +9 -15
  316. package/dist/{chunk-rwexx5ns.js → chunk-sq8wkk3z.js} +1 -3
  317. package/dist/{chunk-faycqscv.js → chunk-sxqj7s2h.js} +2 -2
  318. package/dist/chunk-t2m6cjp1.js +264 -0
  319. package/dist/chunk-t6hmvb6k.js +1021 -0
  320. package/dist/chunk-t72x960a.js +125 -0
  321. package/dist/chunk-t9kashay.js +440 -0
  322. package/dist/chunk-t9wzf009.js +151 -0
  323. package/dist/chunk-ta1dgyj1.js +154 -0
  324. package/dist/{chunk-5deqy8r0.js → chunk-tavxhayf.js} +77 -71
  325. package/dist/{chunk-35b0ek0j.js → chunk-tcdv4gp8.js} +13 -9
  326. package/dist/chunk-td3b74vm.js +362 -0
  327. package/dist/{chunk-mt25echc.js → chunk-tezak8rx.js} +1 -1
  328. package/dist/chunk-tgcw0rzx.js +262 -0
  329. package/dist/{chunk-9rcbyag3.js → chunk-tmdbrszg.js} +2 -2
  330. package/dist/{chunk-jknt3rxg.js → chunk-v17qee2y.js} +7 -9
  331. package/dist/{chunk-frbv3xqa.js → chunk-v1jd31dw.js} +2 -2
  332. package/dist/chunk-var1et7e.js +66 -0
  333. package/dist/{chunk-cettj572.js → chunk-ve9wswz4.js} +7 -131
  334. package/dist/{chunk-hqmz36b3.js → chunk-vf612n57.js} +21 -101
  335. package/dist/chunk-vfhabc5j.js +109 -0
  336. package/dist/{chunk-s7qj2hg5.js → chunk-vgy0w6tt.js} +2 -2
  337. package/dist/chunk-vh02fvz1.js +375 -0
  338. package/dist/{chunk-ctmt7xh1.js → chunk-vm935era.js} +619 -887
  339. package/dist/{chunk-dxc7begm.js → chunk-vtb8z6as.js} +14 -10
  340. package/dist/chunk-w2kf9sxn.js +115 -0
  341. package/dist/chunk-w7trx259.js +132 -0
  342. package/dist/{chunk-8z039kef.js → chunk-w92b262y.js} +53 -54
  343. package/dist/chunk-w9zqjhvm.js +103 -0
  344. package/dist/{chunk-9cc60ae5.js → chunk-wb2fvy1k.js} +74 -68
  345. package/dist/chunk-ws2d81aj.js +123 -0
  346. package/dist/{chunk-5zh1fbrj.js → chunk-wssgdcck.js} +2 -2
  347. package/dist/{chunk-t9z6njcr.js → chunk-wtycm8km.js} +9 -9
  348. package/dist/chunk-wz0d8mna.js +108 -0
  349. package/dist/chunk-x01wtn3p.js +144 -0
  350. package/dist/{chunk-dnyeb288.js → chunk-x2sp7rcv.js} +73 -105
  351. package/dist/{chunk-zrse3zpz.js → chunk-xbprynsc.js} +18 -46
  352. package/dist/{chunk-yxnwsp4f.js → chunk-xext3y2y.js} +8 -6
  353. package/dist/{chunk-fzxg8v1y.js → chunk-xycy3c8q.js} +15 -12
  354. package/dist/{chunk-cpma9zs5.js → chunk-y01ys1vm.js} +20 -71
  355. package/dist/{chunk-d7vv2ydf.js → chunk-y78t50v0.js} +2 -2
  356. package/dist/{chunk-xkr7as9h.js → chunk-y9bgt2k1.js} +13 -9
  357. package/dist/{chunk-s2gm9vfk.js → chunk-ydm0nfsv.js} +5 -5
  358. package/dist/{chunk-gjyc3293.js → chunk-yetebjek.js} +282 -495
  359. package/dist/{chunk-hkn7tzgv.js → chunk-ym5r3jnk.js} +1 -1
  360. package/dist/chunk-ysks0ewj.js +237 -0
  361. package/dist/chunk-yv3evkgg.js +68 -0
  362. package/dist/{chunk-athjeyrt.js → chunk-yw79dz62.js} +4 -4
  363. package/dist/{chunk-s84smrx4.js → chunk-yy59gvs4.js} +151 -189
  364. package/dist/{chunk-12pv5fez.js → chunk-yyax4hdg.js} +10 -8
  365. package/dist/chunk-z0q85m5f.js +108 -0
  366. package/dist/chunk-z1bs6d7k.js +24 -0
  367. package/dist/chunk-z6e5jp2w.js +119 -0
  368. package/dist/{chunk-rjz6btwk.js → chunk-z7ssqvt6.js} +4972 -4638
  369. package/dist/chunk-z95yxwyb.js +61 -0
  370. package/dist/{chunk-0nqrscrr.js → chunk-z9aqj026.js} +5 -5
  371. package/dist/chunk-zc6dxhk9.js +169 -0
  372. package/dist/{chunk-ve60fbtd.js → chunk-ze6zvkg6.js} +2 -2
  373. package/dist/{chunk-t0rgmccj.js → chunk-zejm280k.js} +1 -1
  374. package/dist/{chunk-krstc7m7.js → chunk-zfapazzd.js} +15 -11
  375. package/dist/chunk-zj4fqmnc.js +219 -0
  376. package/dist/chunk-zkrpbswn.js +1608 -0
  377. package/dist/chunk-zktbb38m.js +112 -0
  378. package/dist/{chunk-vjc1svpc.js → chunk-zptcqa7t.js} +82 -75
  379. package/dist/{chunk-gbcqdr0x.js → chunk-zvnsjbt8.js} +1 -1
  380. package/dist/chunk-zwaanw8y.js +110 -0
  381. package/dist/{chunk-g3t0act8.js → chunk-zzm33q8x.js} +1 -1
  382. package/dist/{chunk-s8fzxy94.js → chunk-zzzc1ead.js} +17 -13
  383. package/dist/cli.js +34 -10
  384. package/dist/vendor/audio-capture/arm64-darwin/audio-capture.node +0 -0
  385. package/dist/vendor/audio-capture/arm64-linux/audio-capture.node +0 -0
  386. package/dist/vendor/audio-capture/arm64-win32/audio-capture.node +0 -0
  387. package/dist/vendor/audio-capture/x64-darwin/audio-capture.node +0 -0
  388. package/dist/vendor/audio-capture/x64-linux/audio-capture.node +0 -0
  389. package/dist/vendor/audio-capture/x64-win32/audio-capture.node +0 -0
  390. package/package.json +8 -5
  391. package/scripts/postinstall.cjs +319 -0
  392. package/dist/chunk-0291smg3.js +0 -42
  393. package/dist/chunk-04g2ty3v.js +0 -104
  394. package/dist/chunk-069x95ne.js +0 -764
  395. package/dist/chunk-06x02eab.js +0 -655
  396. package/dist/chunk-09pjmga5.js +0 -713
  397. package/dist/chunk-0g90je6r.js +0 -145
  398. package/dist/chunk-0rddv9vb.js +0 -328
  399. package/dist/chunk-162w6yv3.js +0 -756
  400. package/dist/chunk-1gjbaa3n.js +0 -128
  401. package/dist/chunk-23wg4mnt.js +0 -404
  402. package/dist/chunk-2gbjtg7c.js +0 -102
  403. package/dist/chunk-2v1q0ezq.js +0 -102
  404. package/dist/chunk-37n7jkxe.js +0 -436
  405. package/dist/chunk-38svjnh4.js +0 -158
  406. package/dist/chunk-3bg1089y.js +0 -616
  407. package/dist/chunk-3d8ck5ne.js +0 -112
  408. package/dist/chunk-3g6rf9sz.js +0 -106
  409. package/dist/chunk-3x3rr2n5.js +0 -57
  410. package/dist/chunk-4f6q3d38.js +0 -117
  411. package/dist/chunk-4h57km3m.js +0 -74
  412. package/dist/chunk-4kyh2618.js +0 -99
  413. package/dist/chunk-4w9vc9vc.js +0 -119
  414. package/dist/chunk-53hqpp5z.js +0 -208
  415. package/dist/chunk-5m2rmc2k.js +0 -128
  416. package/dist/chunk-5wp9pkpt.js +0 -539
  417. package/dist/chunk-5ym9f6w3.js +0 -263
  418. package/dist/chunk-6f938733.js +0 -1027
  419. package/dist/chunk-6nenxecd.js +0 -115
  420. package/dist/chunk-6rja0h86.js +0 -1593
  421. package/dist/chunk-70q6dp4d.js +0 -96
  422. package/dist/chunk-7bn0wzs3.js +0 -1493
  423. package/dist/chunk-7e2e0bfm.js +0 -65
  424. package/dist/chunk-7ywadnax.js +0 -490
  425. package/dist/chunk-7z33j54s.js +0 -142
  426. package/dist/chunk-8yvfkzyh.js +0 -58
  427. package/dist/chunk-9abpx1kv.js +0 -2833
  428. package/dist/chunk-9ks2nswb.js +0 -114
  429. package/dist/chunk-9wrds5tr.js +0 -109
  430. package/dist/chunk-ab2twken.js +0 -102
  431. package/dist/chunk-abncjeag.js +0 -97
  432. package/dist/chunk-am6w4x6y.js +0 -103
  433. package/dist/chunk-b73bd7db.js +0 -496
  434. package/dist/chunk-bc7nvynh.js +0 -195
  435. package/dist/chunk-br17dhef.js +0 -103
  436. package/dist/chunk-c3k0sdey.js +0 -281
  437. package/dist/chunk-c909bmyv.js +0 -103
  438. package/dist/chunk-cftsv9w4.js +0 -129
  439. package/dist/chunk-cj1a7npk.js +0 -99
  440. package/dist/chunk-cyscs4k5.js +0 -1330
  441. package/dist/chunk-czr7y063.js +0 -348
  442. package/dist/chunk-d93sndem.js +0 -372
  443. package/dist/chunk-ddz8xbpd.js +0 -481
  444. package/dist/chunk-dkhqx4hk.js +0 -84
  445. package/dist/chunk-dsrharmv.js +0 -359
  446. package/dist/chunk-eqmy5d05.js +0 -56
  447. package/dist/chunk-f2crxw2c.js +0 -5400
  448. package/dist/chunk-f8zga40p.js +0 -234
  449. package/dist/chunk-fbgm2ym6.js +0 -990
  450. package/dist/chunk-fcbbsswe.js +0 -119
  451. package/dist/chunk-fda654nt.js +0 -6121
  452. package/dist/chunk-ffmv9ezj.js +0 -104
  453. package/dist/chunk-fmjte7md.js +0 -38
  454. package/dist/chunk-fqtwqxxc.js +0 -293
  455. package/dist/chunk-g8k85nkd.js +0 -802
  456. package/dist/chunk-ge4ak7dj.js +0 -127
  457. package/dist/chunk-gpqemecy.js +0 -126
  458. package/dist/chunk-h19p6s3b.js +0 -131
  459. package/dist/chunk-j0sk1rct.js +0 -998
  460. package/dist/chunk-j1wfpa1a.js +0 -70
  461. package/dist/chunk-j829fx31.js +0 -3458
  462. package/dist/chunk-jqctzrvd.js +0 -722
  463. package/dist/chunk-jx817w05.js +0 -11
  464. package/dist/chunk-ka6sab33.js +0 -174
  465. package/dist/chunk-krjsvmwp.js +0 -101
  466. package/dist/chunk-kvpe50pm.js +0 -311
  467. package/dist/chunk-mez504fj.js +0 -113
  468. package/dist/chunk-mj6wbrae.js +0 -105
  469. package/dist/chunk-n0pg2kpe.js +0 -122
  470. package/dist/chunk-n4qtqkp0.js +0 -295
  471. package/dist/chunk-n9meha2m.js +0 -73
  472. package/dist/chunk-ndk7q5n3.js +0 -169
  473. package/dist/chunk-ng6n9t4h.js +0 -56
  474. package/dist/chunk-p3pz13x2.js +0 -1933
  475. package/dist/chunk-p9ez6zgq.js +0 -2656
  476. package/dist/chunk-ph750kx1.js +0 -550
  477. package/dist/chunk-pxb99zqs.js +0 -117
  478. package/dist/chunk-q1yqc5n3.js +0 -100
  479. package/dist/chunk-qtfqk0jr.js +0 -131
  480. package/dist/chunk-qzfmdh1t.js +0 -388
  481. package/dist/chunk-r3cv0j9n.js +0 -456
  482. package/dist/chunk-rx0pbgym.js +0 -97
  483. package/dist/chunk-s624rd5j.js +0 -531
  484. package/dist/chunk-satndwqj.js +0 -285
  485. package/dist/chunk-ssrxnkd1.js +0 -109
  486. package/dist/chunk-t2pgctqx.js +0 -106
  487. package/dist/chunk-t7sgwf31.js +0 -644
  488. package/dist/chunk-tth904tj.js +0 -53
  489. package/dist/chunk-typpbjhy.js +0 -128
  490. package/dist/chunk-vp6nrhdq.js +0 -102
  491. package/dist/chunk-vtjm53nt.js +0 -432
  492. package/dist/chunk-w412n7tq.js +0 -469
  493. package/dist/chunk-w4153rky.js +0 -1885
  494. package/dist/chunk-wdgv15as.js +0 -212
  495. package/dist/chunk-wgn9kydv.js +0 -58
  496. package/dist/chunk-whknbrk0.js +0 -184
  497. package/dist/chunk-x1k8e1xc.js +0 -56
  498. package/dist/chunk-x45xx6sc.js +0 -105
  499. package/dist/chunk-x4xvqbe5.js +0 -1166
  500. package/dist/chunk-x8b7vft8.js +0 -132
  501. package/dist/chunk-xaycc8qe.js +0 -44
  502. package/dist/chunk-xd4785ks.js +0 -73
  503. package/dist/chunk-xjxgmxhq.js +0 -463
  504. package/dist/chunk-xx2x3tz9.js +0 -166
  505. package/dist/chunk-y2j23eem.js +0 -101
  506. package/dist/chunk-y83j09wv.js +0 -123
  507. package/dist/chunk-yh8460pb.js +0 -119
  508. package/dist/chunk-z6nhchdb.js +0 -60
  509. package/dist/chunk-zbt73sj7.js +0 -192
  510. package/dist/chunk-zmwaatmq.js +0 -118
  511. package/dist/chunk-zvdg9tex.js +0 -135
  512. package/dist/chunk-zwa780cx.js +0 -584
  513. package/dist/{chunk-whvdag1y.js → chunk-3bfs3x0h.js} +9 -9
  514. package/dist/{chunk-27xc1csx.js → chunk-dggvswz1.js} +3 -3
@@ -0,0 +1,1608 @@
1
+ // @bun
2
+ import {
3
+ createCapacityWake
4
+ } from "./chunk-ae76ded0.js";
5
+ import {
6
+ getPollIntervalConfig
7
+ } from "./chunk-es2fdse0.js";
8
+ import {
9
+ buildCCRv2SdkUrl,
10
+ buildSdkUrl,
11
+ decodeWorkSecret,
12
+ registerWorker,
13
+ sameSessionId
14
+ } from "./chunk-4h102wt5.js";
15
+ import {
16
+ createTokenRefreshScheduler
17
+ } from "./chunk-ta1dgyj1.js";
18
+ import {
19
+ init_server
20
+ } from "./chunk-jdgeec04.js";
21
+ import {
22
+ BRIDGE_LOGIN_ERROR,
23
+ BridgeFatalError,
24
+ DEFAULT_SESSION_TIMEOUT_MS,
25
+ createAgentWorktree,
26
+ createBridgeApiClient,
27
+ getRemoteSessionUrl,
28
+ init_bridgeApi,
29
+ init_bridgeStatusUtil,
30
+ init_product,
31
+ init_types4 as init_types,
32
+ init_worktree,
33
+ isExpiredErrorType,
34
+ isSuppressible403,
35
+ removeAgentWorktree,
36
+ validateBridgeId
37
+ } from "./chunk-cy6ezb6j.js";
38
+ import"./chunk-zejm280k.js";
39
+ import {
40
+ init_rcDebugLog,
41
+ rcLog
42
+ } from "./chunk-g1jarkx9.js";
43
+ import {
44
+ getTrustedDeviceToken,
45
+ init_trustedDevice
46
+ } from "./chunk-yyax4hdg.js";
47
+ import"./chunk-4nspekjp.js";
48
+ import"./chunk-kmhwx18d.js";
49
+ import"./chunk-var1et7e.js";
50
+ import"./chunk-2gzv8nrw.js";
51
+ import"./chunk-ehtwnxpg.js";
52
+ import"./chunk-dmxte86x.js";
53
+ import"./chunk-d6ve5pze.js";
54
+ import"./chunk-bxcfz5gy.js";
55
+ import"./chunk-dekbr08w.js";
56
+ import"./chunk-f6rbj3gz.js";
57
+ import"./chunk-9f14bkn9.js";
58
+ import"./chunk-cgfdkzhb.js";
59
+ import"./chunk-k46gxg21.js";
60
+ import"./chunk-j5bth84e.js";
61
+ import"./chunk-8qhr4n77.js";
62
+ import"./chunk-az5x70pn.js";
63
+ import {
64
+ debugTruncate,
65
+ describeAxiosError,
66
+ init_debugUtils,
67
+ init_sessionIdCompat,
68
+ toCompatSessionId
69
+ } from "./chunk-epyaq1z0.js";
70
+ import"./chunk-0jzdwbdc.js";
71
+ import"./chunk-ps49ymvj.js";
72
+ import"./chunk-p7vkh4wx.js";
73
+ import"./chunk-cmcbatgz.js";
74
+ import"./chunk-agx5w9ce.js";
75
+ import"./chunk-48w0df8a.js";
76
+ import"./chunk-y78t50v0.js";
77
+ import"./chunk-4jm600zv.js";
78
+ import"./chunk-n8mpqdje.js";
79
+ import"./chunk-dqvwn28p.js";
80
+ import"./chunk-esn3tgm2.js";
81
+ import"./chunk-mx28h61f.js";
82
+ import"./chunk-dsbewdgm.js";
83
+ import"./chunk-sxqj7s2h.js";
84
+ import {
85
+ init_datadog
86
+ } from "./chunk-8201tnhf.js";
87
+ import"./chunk-2qwgfjcj.js";
88
+ import"./chunk-chsyvavm.js";
89
+ import"./chunk-w92b262y.js";
90
+ import {
91
+ getClaudeAIOAuthTokens,
92
+ init_auth,
93
+ init_figures,
94
+ init_firstPartyEventLogger,
95
+ init_growthbook
96
+ } from "./chunk-c1k9tg7h.js";
97
+ import"./chunk-905d2hee.js";
98
+ import"./chunk-rkak3kjw.js";
99
+ import"./chunk-p2yv7m0g.js";
100
+ import"./chunk-1cwdhk7a.js";
101
+ import"./chunk-j9gxwbe3.js";
102
+ import"./chunk-64c1avct.js";
103
+ import"./chunk-6kpbgc5w.js";
104
+ import {
105
+ init_sleep,
106
+ sleep
107
+ } from "./chunk-8g5pe1gr.js";
108
+ import"./chunk-hezj20qy.js";
109
+ import"./chunk-4cp6193g.js";
110
+ import"./chunk-8g747a8x.js";
111
+ import"./chunk-d7886r6a.js";
112
+ import"./chunk-f5ma3nh5.js";
113
+ import"./chunk-qz2x630m.js";
114
+ import"./chunk-dk8287aa.js";
115
+ import"./chunk-r2k2jy0y.js";
116
+ import"./chunk-3c25bcsw.js";
117
+ import {
118
+ init_bundledMode,
119
+ isInBundledMode
120
+ } from "./chunk-2q39ej51.js";
121
+ import"./chunk-q82r31er.js";
122
+ import"./chunk-p2816w9z.js";
123
+ import"./chunk-v9smspw2.js";
124
+ import"./chunk-v1kzp02e.js";
125
+ import {
126
+ formatDuration,
127
+ init_format,
128
+ truncateToWidth
129
+ } from "./chunk-qpzfmkct.js";
130
+ import"./chunk-crmjpsqe.js";
131
+ import {
132
+ init_src
133
+ } from "./chunk-rvkvehat.js";
134
+ import"./chunk-g338npwr.js";
135
+ import {
136
+ init_analytics,
137
+ logEvent
138
+ } from "./chunk-h0rbjg6x.js";
139
+ import"./chunk-0vkfrmqm.js";
140
+ import"./chunk-0xjaqda8.js";
141
+ import"./chunk-21z7acxh.js";
142
+ import {
143
+ init_diagLogs,
144
+ logForDiagnosticsNoPII
145
+ } from "./chunk-rgbbtszq.js";
146
+ import"./chunk-1thgdca1.js";
147
+ import"./chunk-qnfx3qtx.js";
148
+ import"./chunk-yw79dz62.js";
149
+ import"./chunk-b81hd3m6.js";
150
+ import {
151
+ init_log,
152
+ logError
153
+ } from "./chunk-61ahbn23.js";
154
+ import"./chunk-8tnsngw2.js";
155
+ import"./chunk-edzkkadh.js";
156
+ import"./chunk-bwg7582d.js";
157
+ import"./chunk-5z28bqne.js";
158
+ import"./chunk-qajrkk97.js";
159
+ import {
160
+ init_debug,
161
+ init_slowOperations,
162
+ jsonParse,
163
+ jsonStringify,
164
+ logForDebugging
165
+ } from "./chunk-hcgkak1j.js";
166
+ import"./chunk-fbv4apne.js";
167
+ import {
168
+ errorMessage,
169
+ init_errors
170
+ } from "./chunk-z6e5jp2w.js";
171
+ import {
172
+ init_envUtils,
173
+ isEnvTruthy,
174
+ isInProtectedNamespace
175
+ } from "./chunk-jaaxk89e.js";
176
+ import"./chunk-h4b85amj.js";
177
+ import"./chunk-07069jq1.js";
178
+ import"./chunk-vf612n57.js";
179
+ import"./chunk-d4mdda98.js";
180
+ import"./chunk-7wm5s02e.js";
181
+ import"./chunk-4g3v8y12.js";
182
+ import"./chunk-7739pg2c.js";
183
+ import"./chunk-nh3cd07f.js";
184
+ import"./chunk-8pn8tvgg.js";
185
+ import"./chunk-netzwgv1.js";
186
+ import {
187
+ __require
188
+ } from "./chunk-qp2qdcda.js";
189
+
190
+ // src/daemon/workerRegistry.ts
191
+ import { resolve as resolve2 } from "path";
192
+
193
+ // src/bridge/bridgeMain.ts
194
+ init_product();
195
+ init_datadog();
196
+ init_firstPartyEventLogger();
197
+ init_growthbook();
198
+ init_analytics();
199
+ init_bundledMode();
200
+ init_debug();
201
+ init_rcDebugLog();
202
+ init_diagLogs();
203
+ init_envUtils();
204
+ init_errors();
205
+ init_format();
206
+ init_log();
207
+ init_sleep();
208
+ init_worktree();
209
+ init_bridgeApi();
210
+ init_bridgeStatusUtil();
211
+ import { randomUUID } from "crypto";
212
+ import { hostname, tmpdir as tmpdir2 } from "os";
213
+ import { basename, join as join2, resolve } from "path";
214
+
215
+ // src/bridge/bridgeUI.ts
216
+ init_server();
217
+ init_figures();
218
+ init_src();
219
+ init_debug();
220
+ init_bridgeStatusUtil();
221
+
222
+ // src/bridge/bridgeMain.ts
223
+ init_debugUtils();
224
+ init_sessionIdCompat();
225
+
226
+ // src/bridge/sessionRunner.ts
227
+ init_slowOperations();
228
+ init_debugUtils();
229
+ import { spawn } from "child_process";
230
+ import { createWriteStream } from "fs";
231
+ import { tmpdir } from "os";
232
+ import { dirname, join } from "path";
233
+ import { createInterface } from "readline";
234
+ var MAX_ACTIVITIES = 10;
235
+ var MAX_STDERR_LINES = 10;
236
+ function safeFilenameId(id) {
237
+ return id.replace(/[^a-zA-Z0-9_-]/g, "_");
238
+ }
239
+ var TOOL_VERBS = {
240
+ Read: "Reading",
241
+ Write: "Writing",
242
+ Edit: "Editing",
243
+ MultiEdit: "Editing",
244
+ Bash: "Running",
245
+ Glob: "Searching",
246
+ Grep: "Searching",
247
+ WebFetch: "Fetching",
248
+ WebSearch: "Searching",
249
+ Task: "Running task",
250
+ FileReadTool: "Reading",
251
+ FileWriteTool: "Writing",
252
+ FileEditTool: "Editing",
253
+ GlobTool: "Searching",
254
+ GrepTool: "Searching",
255
+ BashTool: "Running",
256
+ NotebookEditTool: "Editing notebook",
257
+ LSP: "LSP"
258
+ };
259
+ function toolSummary(name, input) {
260
+ const verb = TOOL_VERBS[name] ?? name;
261
+ const target = input.file_path ?? input.filePath ?? input.pattern ?? input.command?.slice(0, 60) ?? input.url ?? input.query ?? "";
262
+ if (target) {
263
+ return `${verb} ${target}`;
264
+ }
265
+ return verb;
266
+ }
267
+ function extractActivities(line, sessionId, onDebug) {
268
+ let parsed;
269
+ try {
270
+ parsed = jsonParse(line);
271
+ } catch {
272
+ return [];
273
+ }
274
+ if (!parsed || typeof parsed !== "object") {
275
+ return [];
276
+ }
277
+ const msg = parsed;
278
+ const activities = [];
279
+ const now = Date.now();
280
+ switch (msg.type) {
281
+ case "assistant": {
282
+ const message = msg.message;
283
+ if (!message)
284
+ break;
285
+ const content = message.content;
286
+ if (!Array.isArray(content))
287
+ break;
288
+ for (const block of content) {
289
+ if (!block || typeof block !== "object")
290
+ continue;
291
+ const b = block;
292
+ if (b.type === "tool_use") {
293
+ const name = b.name ?? "Tool";
294
+ const input = b.input ?? {};
295
+ const summary = toolSummary(name, input);
296
+ activities.push({
297
+ type: "tool_start",
298
+ summary,
299
+ timestamp: now
300
+ });
301
+ onDebug(`[bridge:activity] sessionId=${sessionId} tool_use name=${name} ${inputPreview(input)}`);
302
+ } else if (b.type === "text") {
303
+ const text = b.text ?? "";
304
+ if (text.length > 0) {
305
+ activities.push({
306
+ type: "text",
307
+ summary: text.slice(0, 80),
308
+ timestamp: now
309
+ });
310
+ onDebug(`[bridge:activity] sessionId=${sessionId} text "${text.slice(0, 100)}"`);
311
+ }
312
+ }
313
+ }
314
+ break;
315
+ }
316
+ case "result": {
317
+ const subtype = msg.subtype;
318
+ if (subtype === "success") {
319
+ activities.push({
320
+ type: "result",
321
+ summary: "Session completed",
322
+ timestamp: now
323
+ });
324
+ onDebug(`[bridge:activity] sessionId=${sessionId} result subtype=success`);
325
+ } else if (subtype) {
326
+ const errors = msg.errors;
327
+ const errorSummary = errors?.[0] ?? `Error: ${subtype}`;
328
+ activities.push({
329
+ type: "error",
330
+ summary: errorSummary,
331
+ timestamp: now
332
+ });
333
+ onDebug(`[bridge:activity] sessionId=${sessionId} result subtype=${subtype} error="${errorSummary}"`);
334
+ } else {
335
+ onDebug(`[bridge:activity] sessionId=${sessionId} result subtype=undefined`);
336
+ }
337
+ break;
338
+ }
339
+ default:
340
+ break;
341
+ }
342
+ return activities;
343
+ }
344
+ function extractUserMessageText(msg) {
345
+ if (msg.parent_tool_use_id != null || msg.isSynthetic || msg.isReplay)
346
+ return;
347
+ const message = msg.message;
348
+ const content = message?.content;
349
+ let text;
350
+ if (typeof content === "string") {
351
+ text = content;
352
+ } else if (Array.isArray(content)) {
353
+ for (const block of content) {
354
+ if (block && typeof block === "object" && block.type === "text") {
355
+ text = block.text;
356
+ break;
357
+ }
358
+ }
359
+ }
360
+ text = text?.trim();
361
+ return text ? text : undefined;
362
+ }
363
+ function inputPreview(input) {
364
+ const parts = [];
365
+ for (const [key, val] of Object.entries(input)) {
366
+ if (typeof val === "string") {
367
+ parts.push(`${key}="${val.slice(0, 100)}"`);
368
+ }
369
+ if (parts.length >= 3)
370
+ break;
371
+ }
372
+ return parts.join(" ");
373
+ }
374
+ function createSessionSpawner(deps) {
375
+ return {
376
+ spawn(opts, dir) {
377
+ const safeId = safeFilenameId(opts.sessionId);
378
+ let debugFile;
379
+ if (deps.debugFile) {
380
+ const ext = deps.debugFile.lastIndexOf(".");
381
+ if (ext > 0) {
382
+ debugFile = `${deps.debugFile.slice(0, ext)}-${safeId}${deps.debugFile.slice(ext)}`;
383
+ } else {
384
+ debugFile = `${deps.debugFile}-${safeId}`;
385
+ }
386
+ } else if (deps.verbose || process.env.USER_TYPE === "ant") {
387
+ debugFile = join(tmpdir(), "claude", `bridge-session-${safeId}.log`);
388
+ }
389
+ let transcriptStream = null;
390
+ let transcriptPath;
391
+ if (deps.debugFile) {
392
+ transcriptPath = join(dirname(deps.debugFile), `bridge-transcript-${safeId}.jsonl`);
393
+ transcriptStream = createWriteStream(transcriptPath, { flags: "a" });
394
+ transcriptStream.on("error", (err) => {
395
+ deps.onDebug(`[bridge:session] Transcript write error: ${err.message}`);
396
+ transcriptStream = null;
397
+ });
398
+ deps.onDebug(`[bridge:session] Transcript log: ${transcriptPath}`);
399
+ }
400
+ const args = [
401
+ ...deps.scriptArgs,
402
+ "--print",
403
+ "--sdk-url",
404
+ opts.sdkUrl,
405
+ "--session-id",
406
+ opts.sessionId,
407
+ "--input-format",
408
+ "stream-json",
409
+ "--output-format",
410
+ "stream-json",
411
+ "--replay-user-messages",
412
+ ...deps.verbose ? ["--verbose"] : [],
413
+ ...debugFile ? ["--debug-file", debugFile] : [],
414
+ ...deps.permissionMode ? ["--permission-mode", deps.permissionMode] : []
415
+ ];
416
+ const env = {
417
+ ...deps.env,
418
+ CLAUDE_CODE_OAUTH_TOKEN: undefined,
419
+ CLAUDE_CODE_ENVIRONMENT_KIND: "bridge",
420
+ ...deps.sandbox && { CLAUDE_CODE_FORCE_SANDBOX: "1" },
421
+ CLAUDE_CODE_SESSION_ACCESS_TOKEN: opts.accessToken,
422
+ CLAUDE_CODE_POST_FOR_SESSION_INGRESS_V2: "1",
423
+ ...opts.useCcrV2 && {
424
+ CLAUDE_CODE_USE_CCR_V2: "1",
425
+ CLAUDE_CODE_WORKER_EPOCH: String(opts.workerEpoch)
426
+ }
427
+ };
428
+ deps.onDebug(`[bridge:session] Spawning sessionId=${opts.sessionId} sdkUrl=${opts.sdkUrl} accessToken=${opts.accessToken ? "present" : "MISSING"}`);
429
+ deps.onDebug(`[bridge:session] Child args: ${args.join(" ")}`);
430
+ if (debugFile) {
431
+ deps.onDebug(`[bridge:session] Debug log: ${debugFile}`);
432
+ }
433
+ const child = spawn(deps.execPath, args, {
434
+ cwd: dir,
435
+ stdio: ["pipe", "pipe", "pipe"],
436
+ env,
437
+ windowsHide: true
438
+ });
439
+ deps.onDebug(`[bridge:session] sessionId=${opts.sessionId} pid=${child.pid}`);
440
+ const activities = [];
441
+ let currentActivity = null;
442
+ const lastStderr = [];
443
+ let sigkillSent = false;
444
+ let firstUserMessageSeen = false;
445
+ if (child.stderr) {
446
+ const stderrRl = createInterface({ input: child.stderr });
447
+ stderrRl.on("line", (line) => {
448
+ if (deps.verbose) {
449
+ process.stderr.write(line + `
450
+ `);
451
+ }
452
+ if (lastStderr.length >= MAX_STDERR_LINES) {
453
+ lastStderr.shift();
454
+ }
455
+ lastStderr.push(line);
456
+ });
457
+ }
458
+ if (child.stdout) {
459
+ const rl = createInterface({ input: child.stdout });
460
+ rl.on("line", (line) => {
461
+ if (transcriptStream) {
462
+ transcriptStream.write(line + `
463
+ `);
464
+ }
465
+ deps.onDebug(`[bridge:ws] sessionId=${opts.sessionId} <<< ${debugTruncate(line)}`);
466
+ if (deps.verbose) {
467
+ process.stderr.write(line + `
468
+ `);
469
+ }
470
+ const extracted = extractActivities(line, opts.sessionId, deps.onDebug);
471
+ for (const activity of extracted) {
472
+ if (activities.length >= MAX_ACTIVITIES) {
473
+ activities.shift();
474
+ }
475
+ activities.push(activity);
476
+ currentActivity = activity;
477
+ deps.onActivity?.(opts.sessionId, activity);
478
+ }
479
+ {
480
+ let parsed;
481
+ try {
482
+ parsed = jsonParse(line);
483
+ } catch {}
484
+ if (parsed && typeof parsed === "object") {
485
+ const msg = parsed;
486
+ if (msg.type === "control_request") {
487
+ const request = msg.request;
488
+ if (request?.subtype === "can_use_tool" && deps.onPermissionRequest) {
489
+ deps.onPermissionRequest(opts.sessionId, parsed, opts.accessToken);
490
+ }
491
+ } else if (msg.type === "user" && !firstUserMessageSeen && opts.onFirstUserMessage) {
492
+ const text = extractUserMessageText(msg);
493
+ if (text) {
494
+ firstUserMessageSeen = true;
495
+ opts.onFirstUserMessage(text);
496
+ }
497
+ }
498
+ }
499
+ }
500
+ });
501
+ }
502
+ const done = new Promise((resolve) => {
503
+ child.on("close", (code, signal) => {
504
+ if (transcriptStream) {
505
+ transcriptStream.end();
506
+ transcriptStream = null;
507
+ }
508
+ if (signal === "SIGTERM" || signal === "SIGINT") {
509
+ deps.onDebug(`[bridge:session] sessionId=${opts.sessionId} interrupted signal=${signal} pid=${child.pid}`);
510
+ resolve("interrupted");
511
+ } else if (code === 0) {
512
+ deps.onDebug(`[bridge:session] sessionId=${opts.sessionId} completed exit_code=0 pid=${child.pid}`);
513
+ resolve("completed");
514
+ } else {
515
+ deps.onDebug(`[bridge:session] sessionId=${opts.sessionId} failed exit_code=${code} pid=${child.pid}`);
516
+ resolve("failed");
517
+ }
518
+ });
519
+ child.on("error", (err) => {
520
+ deps.onDebug(`[bridge:session] sessionId=${opts.sessionId} spawn error: ${err.message}`);
521
+ resolve("failed");
522
+ });
523
+ });
524
+ const handle = {
525
+ sessionId: opts.sessionId,
526
+ done,
527
+ activities,
528
+ accessToken: opts.accessToken,
529
+ lastStderr,
530
+ get currentActivity() {
531
+ return currentActivity;
532
+ },
533
+ kill() {
534
+ if (!child.killed) {
535
+ deps.onDebug(`[bridge:session] Sending SIGTERM to sessionId=${opts.sessionId} pid=${child.pid}`);
536
+ if (process.platform === "win32") {
537
+ child.kill();
538
+ } else {
539
+ child.kill("SIGTERM");
540
+ }
541
+ }
542
+ },
543
+ forceKill() {
544
+ if (!sigkillSent && child.pid) {
545
+ sigkillSent = true;
546
+ deps.onDebug(`[bridge:session] Sending SIGKILL to sessionId=${opts.sessionId} pid=${child.pid}`);
547
+ if (process.platform === "win32") {
548
+ child.kill();
549
+ } else {
550
+ child.kill("SIGKILL");
551
+ }
552
+ }
553
+ },
554
+ writeStdin(data) {
555
+ if (child.stdin && !child.stdin.destroyed) {
556
+ deps.onDebug(`[bridge:ws] sessionId=${opts.sessionId} >>> ${debugTruncate(data)}`);
557
+ child.stdin.write(data);
558
+ }
559
+ },
560
+ updateAccessToken(token) {
561
+ handle.accessToken = token;
562
+ handle.writeStdin(jsonStringify({
563
+ type: "update_environment_variables",
564
+ variables: { CLAUDE_CODE_SESSION_ACCESS_TOKEN: token }
565
+ }) + `
566
+ `);
567
+ deps.onDebug(`[bridge:session] Sent token refresh via stdin for sessionId=${opts.sessionId}`);
568
+ }
569
+ };
570
+ return handle;
571
+ }
572
+ };
573
+ }
574
+
575
+ // src/bridge/bridgeMain.ts
576
+ init_trustedDevice();
577
+ init_types();
578
+ var DEFAULT_BACKOFF = {
579
+ connInitialMs: 2000,
580
+ connCapMs: 120000,
581
+ connGiveUpMs: 600000,
582
+ generalInitialMs: 500,
583
+ generalCapMs: 30000,
584
+ generalGiveUpMs: 600000
585
+ };
586
+ var STATUS_UPDATE_INTERVAL_MS = 1000;
587
+ function pollSleepDetectionThresholdMs(backoff) {
588
+ return backoff.connCapMs * 2;
589
+ }
590
+ function spawnScriptArgs() {
591
+ if (isInBundledMode() || !process.argv[1]) {
592
+ return [];
593
+ }
594
+ return [process.argv[1]];
595
+ }
596
+ function safeSpawn(spawner, opts, dir) {
597
+ try {
598
+ return spawner.spawn(opts, dir);
599
+ } catch (err) {
600
+ const errMsg = errorMessage(err);
601
+ logError(new Error(`Session spawn failed: ${errMsg}`));
602
+ return errMsg;
603
+ }
604
+ }
605
+ async function runBridgeLoop(config, environmentId, environmentSecret, api, spawner, logger, signal, backoffConfig = DEFAULT_BACKOFF, initialSessionId, getAccessToken) {
606
+ const controller = new AbortController;
607
+ if (signal.aborted) {
608
+ controller.abort();
609
+ } else {
610
+ signal.addEventListener("abort", () => controller.abort(), { once: true });
611
+ }
612
+ const loopSignal = controller.signal;
613
+ const activeSessions = new Map;
614
+ const sessionStartTimes = new Map;
615
+ const sessionWorkIds = new Map;
616
+ const sessionCompatIds = new Map;
617
+ const sessionIngressTokens = new Map;
618
+ const sessionTimers = new Map;
619
+ const completedWorkIds = new Set;
620
+ const sessionWorktrees = new Map;
621
+ const timedOutSessions = new Set;
622
+ const titledSessions = new Set;
623
+ const capacityWake = createCapacityWake(loopSignal);
624
+ async function heartbeatActiveWorkItems() {
625
+ rcLog(`heartbeat: checking ${activeSessions.size} active session(s)`);
626
+ let anySuccess = false;
627
+ let anyFatal = false;
628
+ const authFailedSessions = [];
629
+ for (const [sessionId] of activeSessions) {
630
+ const workId = sessionWorkIds.get(sessionId);
631
+ const ingressToken = sessionIngressTokens.get(sessionId);
632
+ if (!workId || !ingressToken) {
633
+ continue;
634
+ }
635
+ try {
636
+ await api.heartbeatWork(environmentId, workId, ingressToken);
637
+ anySuccess = true;
638
+ } catch (err) {
639
+ logForDebugging(`[bridge:heartbeat] Failed for sessionId=${sessionId} workId=${workId}: ${errorMessage(err)}`);
640
+ if (err instanceof BridgeFatalError) {
641
+ logEvent("tengu_bridge_heartbeat_error", {
642
+ status: err.status,
643
+ error_type: err.status === 401 || err.status === 403 ? "auth_failed" : "fatal"
644
+ });
645
+ if (err.status === 401 || err.status === 403) {
646
+ authFailedSessions.push(sessionId);
647
+ } else {
648
+ anyFatal = true;
649
+ }
650
+ }
651
+ }
652
+ }
653
+ for (const sessionId of authFailedSessions) {
654
+ logger.logVerbose(`Session ${sessionId} token expired \u2014 re-queuing via bridge/reconnect`);
655
+ try {
656
+ await api.reconnectSession(environmentId, sessionId);
657
+ logForDebugging(`[bridge:heartbeat] Re-queued sessionId=${sessionId} via bridge/reconnect`);
658
+ } catch (err) {
659
+ logger.logError(`Failed to refresh session ${sessionId} token: ${errorMessage(err)}`);
660
+ logForDebugging(`[bridge:heartbeat] reconnectSession(${sessionId}) failed: ${errorMessage(err)}`, { level: "error" });
661
+ }
662
+ }
663
+ if (anyFatal) {
664
+ return "fatal";
665
+ }
666
+ if (authFailedSessions.length > 0) {
667
+ return "auth_failed";
668
+ }
669
+ return anySuccess ? "ok" : "failed";
670
+ }
671
+ const v2Sessions = new Set;
672
+ const tokenRefresh = getAccessToken ? createTokenRefreshScheduler({
673
+ getAccessToken,
674
+ onRefresh: (sessionId, oauthToken) => {
675
+ const handle = activeSessions.get(sessionId);
676
+ if (!handle) {
677
+ return;
678
+ }
679
+ if (v2Sessions.has(sessionId)) {
680
+ logger.logVerbose(`Refreshing session ${sessionId} token via bridge/reconnect`);
681
+ api.reconnectSession(environmentId, sessionId).catch((err) => {
682
+ logger.logError(`Failed to refresh session ${sessionId} token: ${errorMessage(err)}`);
683
+ logForDebugging(`[bridge:token] reconnectSession(${sessionId}) failed: ${errorMessage(err)}`, { level: "error" });
684
+ });
685
+ } else {
686
+ handle.updateAccessToken(oauthToken);
687
+ }
688
+ },
689
+ label: "bridge"
690
+ }) : null;
691
+ const loopStartTime = Date.now();
692
+ const pendingCleanups = new Set;
693
+ function trackCleanup(p) {
694
+ pendingCleanups.add(p);
695
+ p.finally(() => pendingCleanups.delete(p));
696
+ }
697
+ let connBackoff = 0;
698
+ let generalBackoff = 0;
699
+ let connErrorStart = null;
700
+ let generalErrorStart = null;
701
+ let lastPollErrorTime = null;
702
+ let statusUpdateTimer = null;
703
+ let fatalExit = false;
704
+ logForDebugging(`[bridge:work] Starting poll loop spawnMode=${config.spawnMode} maxSessions=${config.maxSessions} environmentId=${environmentId}`);
705
+ logForDiagnosticsNoPII("info", "bridge_loop_started", {
706
+ max_sessions: config.maxSessions,
707
+ spawn_mode: config.spawnMode
708
+ });
709
+ if (process.env.USER_TYPE === "ant") {
710
+ let debugGlob;
711
+ if (config.debugFile) {
712
+ const ext = config.debugFile.lastIndexOf(".");
713
+ debugGlob = ext > 0 ? `${config.debugFile.slice(0, ext)}-*${config.debugFile.slice(ext)}` : `${config.debugFile}-*`;
714
+ } else {
715
+ debugGlob = join2(tmpdir2(), "claude", "bridge-session-*.log");
716
+ }
717
+ logger.setDebugLogPath(debugGlob);
718
+ }
719
+ logger.printBanner(config, environmentId);
720
+ logger.updateSessionCount(0, config.maxSessions, config.spawnMode);
721
+ if (initialSessionId) {
722
+ logger.setAttached(initialSessionId);
723
+ }
724
+ function updateStatusDisplay() {
725
+ logger.updateSessionCount(activeSessions.size, config.maxSessions, config.spawnMode);
726
+ for (const [sid, handle2] of activeSessions) {
727
+ const act = handle2.currentActivity;
728
+ if (act) {
729
+ logger.updateSessionActivity(sessionCompatIds.get(sid) ?? sid, act);
730
+ }
731
+ }
732
+ if (activeSessions.size === 0) {
733
+ logger.updateIdleStatus();
734
+ return;
735
+ }
736
+ const [sessionId, handle] = [...activeSessions.entries()].pop();
737
+ const startTime = sessionStartTimes.get(sessionId);
738
+ if (!startTime)
739
+ return;
740
+ const activity = handle.currentActivity;
741
+ if (!activity || activity.type === "result" || activity.type === "error") {
742
+ if (config.maxSessions > 1)
743
+ logger.refreshDisplay();
744
+ return;
745
+ }
746
+ const elapsed = formatDuration(Date.now() - startTime);
747
+ const trail = handle.activities.filter((a) => a.type === "tool_start").slice(-5).map((a) => a.summary);
748
+ logger.updateSessionStatus(sessionId, elapsed, activity, trail);
749
+ }
750
+ function startStatusUpdates() {
751
+ stopStatusUpdates();
752
+ updateStatusDisplay();
753
+ statusUpdateTimer = setInterval(updateStatusDisplay, STATUS_UPDATE_INTERVAL_MS);
754
+ }
755
+ function stopStatusUpdates() {
756
+ if (statusUpdateTimer) {
757
+ clearInterval(statusUpdateTimer);
758
+ statusUpdateTimer = null;
759
+ }
760
+ }
761
+ function onSessionDone(sessionId, startTime, handle) {
762
+ return (rawStatus) => {
763
+ const workId = sessionWorkIds.get(sessionId);
764
+ rcLog(`session done: sessionId=${sessionId} workId=${workId ?? "none"} status=${rawStatus}` + ` wasTimedOut=${timedOutSessions.has(sessionId)} duration=${Math.round((Date.now() - startTime) / 1000)}s` + ` stderr=${handle.lastStderr.length > 0 ? handle.lastStderr.join("\\n").slice(0, 500) : "(none)"}`);
765
+ activeSessions.delete(sessionId);
766
+ sessionStartTimes.delete(sessionId);
767
+ sessionWorkIds.delete(sessionId);
768
+ sessionIngressTokens.delete(sessionId);
769
+ const compatId = sessionCompatIds.get(sessionId) ?? sessionId;
770
+ sessionCompatIds.delete(sessionId);
771
+ logger.removeSession(compatId);
772
+ titledSessions.delete(compatId);
773
+ v2Sessions.delete(sessionId);
774
+ const timer = sessionTimers.get(sessionId);
775
+ if (timer) {
776
+ clearTimeout(timer);
777
+ sessionTimers.delete(sessionId);
778
+ }
779
+ tokenRefresh?.cancel(sessionId);
780
+ capacityWake.wake();
781
+ const wasTimedOut = timedOutSessions.delete(sessionId);
782
+ const status = wasTimedOut && rawStatus === "interrupted" ? "failed" : rawStatus;
783
+ const durationMs = Date.now() - startTime;
784
+ logForDebugging(`[bridge:session] sessionId=${sessionId} workId=${workId ?? "unknown"} exited status=${status} duration=${formatDuration(durationMs)}`);
785
+ logEvent("tengu_bridge_session_done", {
786
+ status,
787
+ duration_ms: durationMs
788
+ });
789
+ logForDiagnosticsNoPII("info", "bridge_session_done", {
790
+ status,
791
+ duration_ms: durationMs
792
+ });
793
+ logger.clearStatus();
794
+ stopStatusUpdates();
795
+ const stderrSummary = handle.lastStderr.length > 0 ? handle.lastStderr.join(`
796
+ `) : undefined;
797
+ let failureMessage;
798
+ switch (status) {
799
+ case "completed":
800
+ logger.logSessionComplete(sessionId, durationMs);
801
+ break;
802
+ case "failed":
803
+ if (!wasTimedOut && !loopSignal.aborted) {
804
+ failureMessage = stderrSummary ?? "Process exited with error";
805
+ logger.logSessionFailed(sessionId, failureMessage);
806
+ logError(new Error(`Bridge session failed: ${failureMessage}`));
807
+ }
808
+ break;
809
+ case "interrupted":
810
+ logger.logVerbose(`Session ${sessionId} interrupted`);
811
+ break;
812
+ }
813
+ if (status !== "interrupted" && workId) {
814
+ trackCleanup(stopWorkWithRetry(api, environmentId, workId, logger, backoffConfig.stopWorkBaseDelayMs));
815
+ completedWorkIds.add(workId);
816
+ }
817
+ const wt = sessionWorktrees.get(sessionId);
818
+ if (wt) {
819
+ sessionWorktrees.delete(sessionId);
820
+ trackCleanup(removeAgentWorktree(wt.worktreePath, wt.worktreeBranch, wt.gitRoot, wt.hookBased).catch((err) => logger.logVerbose(`Failed to remove worktree ${wt.worktreePath}: ${errorMessage(err)}`)));
821
+ }
822
+ if (status !== "interrupted" && !loopSignal.aborted) {
823
+ if (config.spawnMode !== "single-session") {
824
+ trackCleanup(api.archiveSession(compatId).catch((err) => logger.logVerbose(`Failed to archive session ${sessionId}: ${errorMessage(err)}`)));
825
+ logForDebugging(`[bridge:session] Session ${status}, returning to idle (multi-session mode)`);
826
+ } else {
827
+ logForDebugging(`[bridge:session] Session ${status}, aborting poll loop to tear down environment`);
828
+ controller.abort();
829
+ return;
830
+ }
831
+ }
832
+ if (!loopSignal.aborted) {
833
+ startStatusUpdates();
834
+ }
835
+ };
836
+ }
837
+ if (!initialSessionId) {
838
+ startStatusUpdates();
839
+ }
840
+ while (!loopSignal.aborted) {
841
+ const pollConfig = getPollIntervalConfig();
842
+ try {
843
+ rcLog(`poll: envId=${environmentId} activeSessions=${activeSessions.size}`);
844
+ const work = await api.pollForWork(environmentId, environmentSecret, loopSignal, pollConfig.reclaim_older_than_ms);
845
+ const wasDisconnected = connErrorStart !== null || generalErrorStart !== null;
846
+ if (wasDisconnected) {
847
+ const disconnectedMs = Date.now() - (connErrorStart ?? generalErrorStart ?? Date.now());
848
+ logger.logReconnected(disconnectedMs);
849
+ logForDebugging(`[bridge:poll] Reconnected after ${formatDuration(disconnectedMs)}`);
850
+ logEvent("tengu_bridge_reconnected", {
851
+ disconnected_ms: disconnectedMs
852
+ });
853
+ }
854
+ connBackoff = 0;
855
+ generalBackoff = 0;
856
+ connErrorStart = null;
857
+ generalErrorStart = null;
858
+ lastPollErrorTime = null;
859
+ if (!work) {
860
+ const atCap = activeSessions.size >= config.maxSessions;
861
+ if (atCap) {
862
+ const atCapMs = pollConfig.multisession_poll_interval_ms_at_capacity;
863
+ if (pollConfig.non_exclusive_heartbeat_interval_ms > 0) {
864
+ logEvent("tengu_bridge_heartbeat_mode_entered", {
865
+ active_sessions: activeSessions.size,
866
+ heartbeat_interval_ms: pollConfig.non_exclusive_heartbeat_interval_ms
867
+ });
868
+ const pollDeadline = atCapMs > 0 ? Date.now() + atCapMs : null;
869
+ let hbResult = "ok";
870
+ let hbCycles = 0;
871
+ while (!loopSignal.aborted && activeSessions.size >= config.maxSessions && (pollDeadline === null || Date.now() < pollDeadline)) {
872
+ const hbConfig = getPollIntervalConfig();
873
+ if (hbConfig.non_exclusive_heartbeat_interval_ms <= 0)
874
+ break;
875
+ const cap = capacityWake.signal();
876
+ hbResult = await heartbeatActiveWorkItems();
877
+ if (hbResult === "auth_failed" || hbResult === "fatal") {
878
+ cap.cleanup();
879
+ break;
880
+ }
881
+ hbCycles++;
882
+ await sleep(hbConfig.non_exclusive_heartbeat_interval_ms, cap.signal);
883
+ cap.cleanup();
884
+ }
885
+ const exitReason = hbResult === "auth_failed" || hbResult === "fatal" ? hbResult : loopSignal.aborted ? "shutdown" : activeSessions.size < config.maxSessions ? "capacity_changed" : pollDeadline !== null && Date.now() >= pollDeadline ? "poll_due" : "config_disabled";
886
+ logEvent("tengu_bridge_heartbeat_mode_exited", {
887
+ reason: exitReason,
888
+ heartbeat_cycles: hbCycles,
889
+ active_sessions: activeSessions.size
890
+ });
891
+ if (exitReason === "poll_due") {
892
+ logForDebugging(`[bridge:poll] Heartbeat poll_due after ${hbCycles} cycles \u2014 falling through to pollForWork`);
893
+ }
894
+ if (hbResult === "auth_failed" || hbResult === "fatal") {
895
+ const cap = capacityWake.signal();
896
+ await sleep(atCapMs > 0 ? atCapMs : pollConfig.non_exclusive_heartbeat_interval_ms, cap.signal);
897
+ cap.cleanup();
898
+ }
899
+ } else if (atCapMs > 0) {
900
+ const cap = capacityWake.signal();
901
+ await sleep(atCapMs, cap.signal);
902
+ cap.cleanup();
903
+ }
904
+ } else {
905
+ const interval = activeSessions.size > 0 ? pollConfig.multisession_poll_interval_ms_partial_capacity : pollConfig.multisession_poll_interval_ms_not_at_capacity;
906
+ await sleep(interval, loopSignal);
907
+ }
908
+ continue;
909
+ }
910
+ const atCapacityBeforeSwitch = activeSessions.size >= config.maxSessions;
911
+ if (completedWorkIds.has(work.id)) {
912
+ logForDebugging(`[bridge:work] Skipping already-completed workId=${work.id}`);
913
+ if (atCapacityBeforeSwitch) {
914
+ const cap = capacityWake.signal();
915
+ if (pollConfig.non_exclusive_heartbeat_interval_ms > 0) {
916
+ await heartbeatActiveWorkItems();
917
+ await sleep(pollConfig.non_exclusive_heartbeat_interval_ms, cap.signal);
918
+ } else if (pollConfig.multisession_poll_interval_ms_at_capacity > 0) {
919
+ await sleep(pollConfig.multisession_poll_interval_ms_at_capacity, cap.signal);
920
+ }
921
+ cap.cleanup();
922
+ } else {
923
+ await sleep(1000, loopSignal);
924
+ }
925
+ continue;
926
+ }
927
+ let secret;
928
+ try {
929
+ secret = decodeWorkSecret(work.secret);
930
+ } catch (err) {
931
+ const errMsg = errorMessage(err);
932
+ logger.logError(`Failed to decode work secret for workId=${work.id}: ${errMsg}`);
933
+ logEvent("tengu_bridge_work_secret_failed", {});
934
+ completedWorkIds.add(work.id);
935
+ trackCleanup(stopWorkWithRetry(api, environmentId, work.id, logger, backoffConfig.stopWorkBaseDelayMs));
936
+ if (atCapacityBeforeSwitch) {
937
+ const cap = capacityWake.signal();
938
+ if (pollConfig.non_exclusive_heartbeat_interval_ms > 0) {
939
+ await heartbeatActiveWorkItems();
940
+ await sleep(pollConfig.non_exclusive_heartbeat_interval_ms, cap.signal);
941
+ } else if (pollConfig.multisession_poll_interval_ms_at_capacity > 0) {
942
+ await sleep(pollConfig.multisession_poll_interval_ms_at_capacity, cap.signal);
943
+ }
944
+ cap.cleanup();
945
+ }
946
+ continue;
947
+ }
948
+ const ackWork = async () => {
949
+ logForDebugging(`[bridge:work] Acknowledging workId=${work.id}`);
950
+ try {
951
+ await api.acknowledgeWork(environmentId, work.id, secret.session_ingress_token);
952
+ } catch (err) {
953
+ logForDebugging(`[bridge:work] Acknowledge failed workId=${work.id}: ${errorMessage(err)}`);
954
+ }
955
+ };
956
+ const workType = work.data.type;
957
+ switch (work.data.type) {
958
+ case "healthcheck":
959
+ await ackWork();
960
+ logForDebugging("[bridge:work] Healthcheck received");
961
+ logger.logVerbose("Healthcheck received");
962
+ break;
963
+ case "session": {
964
+ const sessionId = work.data.id;
965
+ rcLog(`work received: type=session sessionId=${sessionId} workId=${work.id}`);
966
+ try {
967
+ validateBridgeId(sessionId, "session_id");
968
+ } catch {
969
+ await ackWork();
970
+ logger.logError(`Invalid session_id received: ${sessionId}`);
971
+ break;
972
+ }
973
+ const existingHandle = activeSessions.get(sessionId);
974
+ if (existingHandle) {
975
+ existingHandle.updateAccessToken(secret.session_ingress_token);
976
+ sessionIngressTokens.set(sessionId, secret.session_ingress_token);
977
+ sessionWorkIds.set(sessionId, work.id);
978
+ tokenRefresh?.schedule(sessionId, secret.session_ingress_token);
979
+ logForDebugging(`[bridge:work] Updated access token for existing sessionId=${sessionId} workId=${work.id}`);
980
+ await ackWork();
981
+ break;
982
+ }
983
+ if (activeSessions.size >= config.maxSessions) {
984
+ logForDebugging(`[bridge:work] At capacity (${activeSessions.size}/${config.maxSessions}), cannot spawn new session for workId=${work.id}`);
985
+ break;
986
+ }
987
+ await ackWork();
988
+ const spawnStartTime = Date.now();
989
+ let sdkUrl;
990
+ let useCcrV2 = false;
991
+ let workerEpoch;
992
+ if (secret.use_code_sessions === true || isEnvTruthy(process.env.CLAUDE_BRIDGE_USE_CCR_V2)) {
993
+ sdkUrl = buildCCRv2SdkUrl(config.apiBaseUrl, sessionId);
994
+ for (let attempt = 1;attempt <= 2; attempt++) {
995
+ try {
996
+ workerEpoch = await registerWorker(sdkUrl, secret.session_ingress_token);
997
+ useCcrV2 = true;
998
+ logForDebugging(`[bridge:session] CCR v2: registered worker sessionId=${sessionId} epoch=${workerEpoch} attempt=${attempt}`);
999
+ break;
1000
+ } catch (err) {
1001
+ const errMsg = errorMessage(err);
1002
+ if (attempt < 2) {
1003
+ logForDebugging(`[bridge:session] CCR v2: registerWorker attempt ${attempt} failed, retrying: ${errMsg}`);
1004
+ await sleep(2000, loopSignal);
1005
+ if (loopSignal.aborted)
1006
+ break;
1007
+ continue;
1008
+ }
1009
+ logger.logError(`CCR v2 worker registration failed for session ${sessionId}: ${errMsg}`);
1010
+ logError(new Error(`registerWorker failed: ${errMsg}`));
1011
+ completedWorkIds.add(work.id);
1012
+ trackCleanup(stopWorkWithRetry(api, environmentId, work.id, logger, backoffConfig.stopWorkBaseDelayMs));
1013
+ }
1014
+ }
1015
+ if (!useCcrV2)
1016
+ break;
1017
+ } else {
1018
+ sdkUrl = buildSdkUrl(config.sessionIngressUrl, sessionId);
1019
+ }
1020
+ const spawnModeAtDecision = config.spawnMode;
1021
+ let sessionDir = config.dir;
1022
+ let worktreeCreateMs = 0;
1023
+ if (spawnModeAtDecision === "worktree" && (initialSessionId === undefined || !sameSessionId(sessionId, initialSessionId))) {
1024
+ const wtStart = Date.now();
1025
+ try {
1026
+ const wt = await createAgentWorktree(`bridge-${safeFilenameId(sessionId)}`);
1027
+ worktreeCreateMs = Date.now() - wtStart;
1028
+ sessionWorktrees.set(sessionId, {
1029
+ worktreePath: wt.worktreePath,
1030
+ worktreeBranch: wt.worktreeBranch,
1031
+ gitRoot: wt.gitRoot,
1032
+ hookBased: wt.hookBased
1033
+ });
1034
+ sessionDir = wt.worktreePath;
1035
+ logForDebugging(`[bridge:session] Created worktree for sessionId=${sessionId} at ${wt.worktreePath}`);
1036
+ } catch (err) {
1037
+ const errMsg = errorMessage(err);
1038
+ logger.logError(`Failed to create worktree for session ${sessionId}: ${errMsg}`);
1039
+ logError(new Error(`Worktree creation failed: ${errMsg}`));
1040
+ completedWorkIds.add(work.id);
1041
+ trackCleanup(stopWorkWithRetry(api, environmentId, work.id, logger, backoffConfig.stopWorkBaseDelayMs));
1042
+ break;
1043
+ }
1044
+ }
1045
+ logForDebugging(`[bridge:session] Spawning sessionId=${sessionId} sdkUrl=${sdkUrl}`);
1046
+ const compatSessionId = toCompatSessionId(sessionId);
1047
+ rcLog(`spawning session: sessionId=${sessionId} sdkUrl=${sdkUrl}` + ` useCcrV2=${useCcrV2} workerEpoch=${workerEpoch}` + ` dir=${sessionDir}` + ` accessToken=${secret.session_ingress_token ? secret.session_ingress_token.slice(0, 8) + "..." : "NONE"}`);
1048
+ const spawnResult = safeSpawn(spawner, {
1049
+ sessionId,
1050
+ sdkUrl,
1051
+ accessToken: secret.session_ingress_token,
1052
+ useCcrV2,
1053
+ workerEpoch,
1054
+ onFirstUserMessage: (text) => {
1055
+ if (titledSessions.has(compatSessionId))
1056
+ return;
1057
+ titledSessions.add(compatSessionId);
1058
+ const title = deriveSessionTitle(text);
1059
+ logger.setSessionTitle(compatSessionId, title);
1060
+ logForDebugging(`[bridge:title] derived title for ${compatSessionId}: ${title}`);
1061
+ import("./chunk-c9q0phsg.js").then(({ updateBridgeSessionTitle }) => updateBridgeSessionTitle(compatSessionId, title, {
1062
+ baseUrl: config.apiBaseUrl
1063
+ })).catch((err) => logForDebugging(`[bridge:title] failed to update title for ${compatSessionId}: ${err}`, { level: "error" }));
1064
+ }
1065
+ }, sessionDir);
1066
+ if (typeof spawnResult === "string") {
1067
+ logger.logError(`Failed to spawn session ${sessionId}: ${spawnResult}`);
1068
+ const wt = sessionWorktrees.get(sessionId);
1069
+ if (wt) {
1070
+ sessionWorktrees.delete(sessionId);
1071
+ trackCleanup(removeAgentWorktree(wt.worktreePath, wt.worktreeBranch, wt.gitRoot, wt.hookBased).catch((err) => logger.logVerbose(`Failed to remove worktree ${wt.worktreePath}: ${errorMessage(err)}`)));
1072
+ }
1073
+ completedWorkIds.add(work.id);
1074
+ trackCleanup(stopWorkWithRetry(api, environmentId, work.id, logger, backoffConfig.stopWorkBaseDelayMs));
1075
+ break;
1076
+ }
1077
+ const handle = spawnResult;
1078
+ const spawnDurationMs = Date.now() - spawnStartTime;
1079
+ logEvent("tengu_bridge_session_started", {
1080
+ active_sessions: activeSessions.size,
1081
+ spawn_mode: spawnModeAtDecision,
1082
+ in_worktree: sessionWorktrees.has(sessionId),
1083
+ spawn_duration_ms: spawnDurationMs,
1084
+ worktree_create_ms: worktreeCreateMs,
1085
+ inProtectedNamespace: isInProtectedNamespace()
1086
+ });
1087
+ logForDiagnosticsNoPII("info", "bridge_session_started", {
1088
+ spawn_mode: spawnModeAtDecision,
1089
+ in_worktree: sessionWorktrees.has(sessionId),
1090
+ spawn_duration_ms: spawnDurationMs,
1091
+ worktree_create_ms: worktreeCreateMs
1092
+ });
1093
+ activeSessions.set(sessionId, handle);
1094
+ sessionWorkIds.set(sessionId, work.id);
1095
+ sessionIngressTokens.set(sessionId, secret.session_ingress_token);
1096
+ sessionCompatIds.set(sessionId, compatSessionId);
1097
+ const startTime = Date.now();
1098
+ sessionStartTimes.set(sessionId, startTime);
1099
+ logger.logSessionStart(sessionId, `Session ${sessionId}`);
1100
+ const safeId = safeFilenameId(sessionId);
1101
+ let sessionDebugFile;
1102
+ if (config.debugFile) {
1103
+ const ext = config.debugFile.lastIndexOf(".");
1104
+ if (ext > 0) {
1105
+ sessionDebugFile = `${config.debugFile.slice(0, ext)}-${safeId}${config.debugFile.slice(ext)}`;
1106
+ } else {
1107
+ sessionDebugFile = `${config.debugFile}-${safeId}`;
1108
+ }
1109
+ } else if (config.verbose || process.env.USER_TYPE === "ant") {
1110
+ sessionDebugFile = join2(tmpdir2(), "claude", `bridge-session-${safeId}.log`);
1111
+ }
1112
+ if (sessionDebugFile) {
1113
+ logger.logVerbose(`Debug log: ${sessionDebugFile}`);
1114
+ }
1115
+ logger.addSession(compatSessionId, getRemoteSessionUrl(compatSessionId, config.sessionIngressUrl));
1116
+ startStatusUpdates();
1117
+ logger.setAttached(compatSessionId);
1118
+ fetchSessionTitle(compatSessionId, config.apiBaseUrl).then((title) => {
1119
+ if (title && activeSessions.has(sessionId)) {
1120
+ titledSessions.add(compatSessionId);
1121
+ logger.setSessionTitle(compatSessionId, title);
1122
+ logForDebugging(`[bridge:title] server title for ${compatSessionId}: ${title}`);
1123
+ }
1124
+ }).catch((err) => logForDebugging(`[bridge:title] failed to fetch title for ${compatSessionId}: ${err}`, { level: "error" }));
1125
+ const timeoutMs = config.sessionTimeoutMs ?? DEFAULT_SESSION_TIMEOUT_MS;
1126
+ if (timeoutMs > 0) {
1127
+ const timer = setTimeout(onSessionTimeout, timeoutMs, sessionId, timeoutMs, logger, timedOutSessions, handle);
1128
+ sessionTimers.set(sessionId, timer);
1129
+ }
1130
+ if (useCcrV2) {
1131
+ v2Sessions.add(sessionId);
1132
+ }
1133
+ tokenRefresh?.schedule(sessionId, secret.session_ingress_token);
1134
+ handle.done.then(onSessionDone(sessionId, startTime, handle));
1135
+ break;
1136
+ }
1137
+ default:
1138
+ await ackWork();
1139
+ logForDebugging(`[bridge:work] Unknown work type: ${workType}, skipping`);
1140
+ break;
1141
+ }
1142
+ if (atCapacityBeforeSwitch) {
1143
+ const cap = capacityWake.signal();
1144
+ if (pollConfig.non_exclusive_heartbeat_interval_ms > 0) {
1145
+ await heartbeatActiveWorkItems();
1146
+ await sleep(pollConfig.non_exclusive_heartbeat_interval_ms, cap.signal);
1147
+ } else if (pollConfig.multisession_poll_interval_ms_at_capacity > 0) {
1148
+ await sleep(pollConfig.multisession_poll_interval_ms_at_capacity, cap.signal);
1149
+ }
1150
+ cap.cleanup();
1151
+ }
1152
+ } catch (err) {
1153
+ if (loopSignal.aborted) {
1154
+ break;
1155
+ }
1156
+ if (err instanceof BridgeFatalError) {
1157
+ fatalExit = true;
1158
+ if (isExpiredErrorType(err.errorType)) {
1159
+ logger.logStatus(err.message);
1160
+ } else if (isSuppressible403(err)) {
1161
+ logForDebugging(`[bridge:work] Suppressed 403 error: ${err.message}`);
1162
+ } else {
1163
+ logger.logError(err.message);
1164
+ logError(err);
1165
+ }
1166
+ logEvent("tengu_bridge_fatal_error", {
1167
+ status: err.status,
1168
+ error_type: err.errorType
1169
+ });
1170
+ logForDiagnosticsNoPII(isExpiredErrorType(err.errorType) ? "info" : "error", "bridge_fatal_error", { status: err.status, error_type: err.errorType });
1171
+ break;
1172
+ }
1173
+ const errMsg = describeAxiosError(err);
1174
+ rcLog(`poll error: ${errMsg}` + ` isConn=${isConnectionError(err)} isServer=${isServerError(err)}` + ` activeSessions=${activeSessions.size}`);
1175
+ if (isConnectionError(err) || isServerError(err)) {
1176
+ const now = Date.now();
1177
+ if (lastPollErrorTime !== null && now - lastPollErrorTime > pollSleepDetectionThresholdMs(backoffConfig)) {
1178
+ logForDebugging(`[bridge:work] Detected system sleep (${Math.round((now - lastPollErrorTime) / 1000)}s gap), resetting error budget`);
1179
+ logForDiagnosticsNoPII("info", "bridge_poll_sleep_detected", {
1180
+ gapMs: now - lastPollErrorTime
1181
+ });
1182
+ connErrorStart = null;
1183
+ connBackoff = 0;
1184
+ generalErrorStart = null;
1185
+ generalBackoff = 0;
1186
+ }
1187
+ lastPollErrorTime = now;
1188
+ if (!connErrorStart) {
1189
+ connErrorStart = now;
1190
+ }
1191
+ const elapsed = now - connErrorStart;
1192
+ if (elapsed >= backoffConfig.connGiveUpMs) {
1193
+ logger.logError(`Server unreachable for ${Math.round(elapsed / 60000)} minutes, giving up.`);
1194
+ logEvent("tengu_bridge_poll_give_up", {
1195
+ error_type: "connection",
1196
+ elapsed_ms: elapsed
1197
+ });
1198
+ logForDiagnosticsNoPII("error", "bridge_poll_give_up", {
1199
+ error_type: "connection",
1200
+ elapsed_ms: elapsed
1201
+ });
1202
+ fatalExit = true;
1203
+ break;
1204
+ }
1205
+ generalErrorStart = null;
1206
+ generalBackoff = 0;
1207
+ connBackoff = connBackoff ? Math.min(connBackoff * 2, backoffConfig.connCapMs) : backoffConfig.connInitialMs;
1208
+ const delay = addJitter(connBackoff);
1209
+ logger.logVerbose(`Connection error, retrying in ${formatDelay(delay)} (${Math.round(elapsed / 1000)}s elapsed): ${errMsg}`);
1210
+ logger.updateReconnectingStatus(formatDelay(delay), formatDuration(elapsed));
1211
+ if (getPollIntervalConfig().non_exclusive_heartbeat_interval_ms > 0) {
1212
+ await heartbeatActiveWorkItems();
1213
+ }
1214
+ await sleep(delay, loopSignal);
1215
+ } else {
1216
+ const now = Date.now();
1217
+ if (lastPollErrorTime !== null && now - lastPollErrorTime > pollSleepDetectionThresholdMs(backoffConfig)) {
1218
+ logForDebugging(`[bridge:work] Detected system sleep (${Math.round((now - lastPollErrorTime) / 1000)}s gap), resetting error budget`);
1219
+ logForDiagnosticsNoPII("info", "bridge_poll_sleep_detected", {
1220
+ gapMs: now - lastPollErrorTime
1221
+ });
1222
+ connErrorStart = null;
1223
+ connBackoff = 0;
1224
+ generalErrorStart = null;
1225
+ generalBackoff = 0;
1226
+ }
1227
+ lastPollErrorTime = now;
1228
+ if (!generalErrorStart) {
1229
+ generalErrorStart = now;
1230
+ }
1231
+ const elapsed = now - generalErrorStart;
1232
+ if (elapsed >= backoffConfig.generalGiveUpMs) {
1233
+ logger.logError(`Persistent errors for ${Math.round(elapsed / 60000)} minutes, giving up.`);
1234
+ logEvent("tengu_bridge_poll_give_up", {
1235
+ error_type: "general",
1236
+ elapsed_ms: elapsed
1237
+ });
1238
+ logForDiagnosticsNoPII("error", "bridge_poll_give_up", {
1239
+ error_type: "general",
1240
+ elapsed_ms: elapsed
1241
+ });
1242
+ fatalExit = true;
1243
+ break;
1244
+ }
1245
+ connErrorStart = null;
1246
+ connBackoff = 0;
1247
+ generalBackoff = generalBackoff ? Math.min(generalBackoff * 2, backoffConfig.generalCapMs) : backoffConfig.generalInitialMs;
1248
+ const delay = addJitter(generalBackoff);
1249
+ logger.logVerbose(`Poll failed, retrying in ${formatDelay(delay)} (${Math.round(elapsed / 1000)}s elapsed): ${errMsg}`);
1250
+ logger.updateReconnectingStatus(formatDelay(delay), formatDuration(elapsed));
1251
+ if (getPollIntervalConfig().non_exclusive_heartbeat_interval_ms > 0) {
1252
+ await heartbeatActiveWorkItems();
1253
+ }
1254
+ await sleep(delay, loopSignal);
1255
+ }
1256
+ }
1257
+ }
1258
+ stopStatusUpdates();
1259
+ logger.clearStatus();
1260
+ const loopDurationMs = Date.now() - loopStartTime;
1261
+ logEvent("tengu_bridge_shutdown", {
1262
+ active_sessions: activeSessions.size,
1263
+ loop_duration_ms: loopDurationMs
1264
+ });
1265
+ logForDiagnosticsNoPII("info", "bridge_shutdown", {
1266
+ active_sessions: activeSessions.size,
1267
+ loop_duration_ms: loopDurationMs
1268
+ });
1269
+ const sessionsToArchive = new Set(activeSessions.keys());
1270
+ if (initialSessionId) {
1271
+ sessionsToArchive.add(initialSessionId);
1272
+ }
1273
+ const compatIdSnapshot = new Map(sessionCompatIds);
1274
+ if (activeSessions.size > 0) {
1275
+ logForDebugging(`[bridge:shutdown] Shutting down ${activeSessions.size} active session(s)`);
1276
+ logger.logStatus(`Shutting down ${activeSessions.size} active session(s)\u2026`);
1277
+ const shutdownWorkIds = new Map(sessionWorkIds);
1278
+ for (const [sessionId, handle] of activeSessions.entries()) {
1279
+ logForDebugging(`[bridge:shutdown] Sending SIGTERM to sessionId=${sessionId}`);
1280
+ handle.kill();
1281
+ }
1282
+ const timeout = new AbortController;
1283
+ await Promise.race([
1284
+ Promise.allSettled([...activeSessions.values()].map((h) => h.done)),
1285
+ sleep(backoffConfig.shutdownGraceMs ?? 30000, timeout.signal)
1286
+ ]);
1287
+ timeout.abort();
1288
+ for (const [sid, handle] of activeSessions.entries()) {
1289
+ logForDebugging(`[bridge:shutdown] Force-killing stuck sessionId=${sid}`);
1290
+ handle.forceKill();
1291
+ }
1292
+ for (const timer of sessionTimers.values()) {
1293
+ clearTimeout(timer);
1294
+ }
1295
+ sessionTimers.clear();
1296
+ tokenRefresh?.cancelAll();
1297
+ if (sessionWorktrees.size > 0) {
1298
+ const remainingWorktrees = [...sessionWorktrees.values()];
1299
+ sessionWorktrees.clear();
1300
+ logForDebugging(`[bridge:shutdown] Cleaning up ${remainingWorktrees.length} worktree(s)`);
1301
+ await Promise.allSettled(remainingWorktrees.map((wt) => removeAgentWorktree(wt.worktreePath, wt.worktreeBranch, wt.gitRoot, wt.hookBased)));
1302
+ }
1303
+ await Promise.allSettled([...shutdownWorkIds.entries()].map(([sessionId, workId]) => {
1304
+ return api.stopWork(environmentId, workId, true).catch((err) => logger.logVerbose(`Failed to stop work ${workId} for session ${sessionId}: ${errorMessage(err)}`));
1305
+ }));
1306
+ }
1307
+ if (pendingCleanups.size > 0) {
1308
+ await Promise.allSettled([...pendingCleanups]);
1309
+ }
1310
+ if (false) {}
1311
+ if (sessionsToArchive.size > 0) {
1312
+ logForDebugging(`[bridge:shutdown] Archiving ${sessionsToArchive.size} session(s)`);
1313
+ await Promise.allSettled([...sessionsToArchive].map((sessionId) => api.archiveSession(compatIdSnapshot.get(sessionId) ?? toCompatSessionId(sessionId)).catch((err) => logger.logVerbose(`Failed to archive session ${sessionId}: ${errorMessage(err)}`))));
1314
+ }
1315
+ try {
1316
+ await api.deregisterEnvironment(environmentId);
1317
+ logForDebugging(`[bridge:shutdown] Environment deregistered, bridge offline`);
1318
+ logger.logVerbose("Environment deregistered.");
1319
+ } catch (err) {
1320
+ logger.logVerbose(`Failed to deregister environment: ${errorMessage(err)}`);
1321
+ }
1322
+ const { clearBridgePointer } = await import("./chunk-tcdv4gp8.js");
1323
+ await clearBridgePointer(config.dir);
1324
+ logger.logVerbose("Environment offline.");
1325
+ }
1326
+ var CONNECTION_ERROR_CODES = new Set([
1327
+ "ECONNREFUSED",
1328
+ "ECONNRESET",
1329
+ "ETIMEDOUT",
1330
+ "ENETUNREACH",
1331
+ "EHOSTUNREACH"
1332
+ ]);
1333
+ function isConnectionError(err) {
1334
+ if (err && typeof err === "object" && "code" in err && typeof err.code === "string" && CONNECTION_ERROR_CODES.has(err.code)) {
1335
+ return true;
1336
+ }
1337
+ return false;
1338
+ }
1339
+ function isServerError(err) {
1340
+ return !!err && typeof err === "object" && "code" in err && typeof err.code === "string" && err.code === "ERR_BAD_RESPONSE";
1341
+ }
1342
+ function addJitter(ms) {
1343
+ return Math.max(0, ms + ms * 0.25 * (2 * Math.random() - 1));
1344
+ }
1345
+ function formatDelay(ms) {
1346
+ return ms >= 1000 ? `${(ms / 1000).toFixed(1)}s` : `${Math.round(ms)}ms`;
1347
+ }
1348
+ async function stopWorkWithRetry(api, environmentId, workId, logger, baseDelayMs = 1000) {
1349
+ const MAX_ATTEMPTS = 3;
1350
+ for (let attempt = 1;attempt <= MAX_ATTEMPTS; attempt++) {
1351
+ try {
1352
+ await api.stopWork(environmentId, workId, false);
1353
+ logForDebugging(`[bridge:work] stopWork succeeded for workId=${workId} on attempt ${attempt}/${MAX_ATTEMPTS}`);
1354
+ return;
1355
+ } catch (err) {
1356
+ if (err instanceof BridgeFatalError) {
1357
+ if (isSuppressible403(err)) {
1358
+ logForDebugging(`[bridge:work] Suppressed stopWork 403 for ${workId}: ${err.message}`);
1359
+ } else {
1360
+ logger.logError(`Failed to stop work ${workId}: ${err.message}`);
1361
+ }
1362
+ logForDiagnosticsNoPII("error", "bridge_stop_work_failed", {
1363
+ attempts: attempt,
1364
+ fatal: true
1365
+ });
1366
+ return;
1367
+ }
1368
+ const errMsg = errorMessage(err);
1369
+ if (attempt < MAX_ATTEMPTS) {
1370
+ const delay = addJitter(baseDelayMs * Math.pow(2, attempt - 1));
1371
+ logger.logVerbose(`Failed to stop work ${workId} (attempt ${attempt}/${MAX_ATTEMPTS}), retrying in ${formatDelay(delay)}: ${errMsg}`);
1372
+ await sleep(delay);
1373
+ } else {
1374
+ logger.logError(`Failed to stop work ${workId} after ${MAX_ATTEMPTS} attempts: ${errMsg}`);
1375
+ logForDiagnosticsNoPII("error", "bridge_stop_work_failed", {
1376
+ attempts: MAX_ATTEMPTS
1377
+ });
1378
+ }
1379
+ }
1380
+ }
1381
+ }
1382
+ function onSessionTimeout(sessionId, timeoutMs, logger, timedOutSessions, handle) {
1383
+ logForDebugging(`[bridge:session] sessionId=${sessionId} timed out after ${formatDuration(timeoutMs)}`);
1384
+ logEvent("tengu_bridge_session_timeout", {
1385
+ timeout_ms: timeoutMs
1386
+ });
1387
+ logger.logSessionFailed(sessionId, `Session timed out after ${formatDuration(timeoutMs)}`);
1388
+ timedOutSessions.add(sessionId);
1389
+ handle.kill();
1390
+ }
1391
+ var TITLE_MAX_LEN = 80;
1392
+ function deriveSessionTitle(text) {
1393
+ const flat = text.replace(/\s+/g, " ").trim();
1394
+ return truncateToWidth(flat, TITLE_MAX_LEN);
1395
+ }
1396
+ async function fetchSessionTitle(compatSessionId, baseUrl) {
1397
+ const { getBridgeSession } = await import("./chunk-c9q0phsg.js");
1398
+ const session = await getBridgeSession(compatSessionId, { baseUrl });
1399
+ return session?.title || undefined;
1400
+ }
1401
+ class BridgeHeadlessPermanentError extends Error {
1402
+ constructor(message) {
1403
+ super(message);
1404
+ this.name = "BridgeHeadlessPermanentError";
1405
+ }
1406
+ }
1407
+ async function runBridgeHeadless(opts, signal) {
1408
+ const { dir, log } = opts;
1409
+ process.chdir(dir);
1410
+ const { setOriginalCwd, setCwdState } = await import("./chunk-168xb8v1.js");
1411
+ setOriginalCwd(dir);
1412
+ setCwdState(dir);
1413
+ const { enableConfigs, checkHasTrustDialogAccepted } = await import("./chunk-ht1nfygk.js");
1414
+ enableConfigs();
1415
+ const { initSinks } = await import("./chunk-559yvwh1.js");
1416
+ initSinks();
1417
+ if (!checkHasTrustDialogAccepted()) {
1418
+ throw new BridgeHeadlessPermanentError(`Workspace not trusted: ${dir}. Run \`claude\` in that directory first to accept the trust dialog.`);
1419
+ }
1420
+ if (!opts.getAccessToken()) {
1421
+ throw new Error(BRIDGE_LOGIN_ERROR);
1422
+ }
1423
+ const { getBridgeBaseUrl } = await import("./chunk-822wfv88.js");
1424
+ const baseUrl = getBridgeBaseUrl();
1425
+ if (baseUrl.startsWith("http://") && !baseUrl.includes("localhost") && !baseUrl.includes("127.0.0.1")) {
1426
+ throw new BridgeHeadlessPermanentError("Remote Control base URL uses HTTP. Only HTTPS or localhost HTTP is allowed.");
1427
+ }
1428
+ const sessionIngressUrl = process.env.CLAUDE_BRIDGE_SESSION_INGRESS_URL || baseUrl;
1429
+ const { getBranch, getRemoteUrl, findGitRoot } = await import("./chunk-zzzc1ead.js");
1430
+ const { hasWorktreeCreateHook } = await import("./chunk-1ebqpwhn.js");
1431
+ if (opts.spawnMode === "worktree") {
1432
+ const worktreeAvailable = hasWorktreeCreateHook() || findGitRoot(dir) !== null;
1433
+ if (!worktreeAvailable) {
1434
+ throw new BridgeHeadlessPermanentError(`Worktree mode requires a git repository or WorktreeCreate hooks. Directory ${dir} has neither.`);
1435
+ }
1436
+ }
1437
+ const branch = await getBranch();
1438
+ const gitRepoUrl = await getRemoteUrl();
1439
+ const machineName = hostname();
1440
+ const bridgeId = randomUUID();
1441
+ const config = {
1442
+ dir,
1443
+ machineName,
1444
+ branch,
1445
+ gitRepoUrl,
1446
+ maxSessions: opts.capacity,
1447
+ spawnMode: opts.spawnMode,
1448
+ verbose: false,
1449
+ sandbox: opts.sandbox,
1450
+ bridgeId,
1451
+ workerType: "claude_code",
1452
+ environmentId: randomUUID(),
1453
+ apiBaseUrl: baseUrl,
1454
+ sessionIngressUrl,
1455
+ sessionTimeoutMs: opts.sessionTimeoutMs
1456
+ };
1457
+ const api = createBridgeApiClient({
1458
+ baseUrl,
1459
+ getAccessToken: opts.getAccessToken,
1460
+ runnerVersion: "2.1.888",
1461
+ onDebug: log,
1462
+ onAuth401: opts.onAuth401,
1463
+ getTrustedDeviceToken
1464
+ });
1465
+ let environmentId;
1466
+ let environmentSecret;
1467
+ try {
1468
+ const reg = await api.registerBridgeEnvironment(config);
1469
+ environmentId = reg.environment_id;
1470
+ environmentSecret = reg.environment_secret;
1471
+ } catch (err) {
1472
+ throw new Error(`Bridge registration failed: ${errorMessage(err)}`);
1473
+ }
1474
+ const spawner = createSessionSpawner({
1475
+ execPath: process.execPath,
1476
+ scriptArgs: spawnScriptArgs(),
1477
+ env: process.env,
1478
+ verbose: false,
1479
+ sandbox: opts.sandbox,
1480
+ permissionMode: opts.permissionMode,
1481
+ onDebug: log
1482
+ });
1483
+ const logger = createHeadlessBridgeLogger(log);
1484
+ logger.printBanner(config, environmentId);
1485
+ let initialSessionId;
1486
+ if (opts.createSessionOnStart) {
1487
+ const { createBridgeSession } = await import("./chunk-c9q0phsg.js");
1488
+ try {
1489
+ const sid = await createBridgeSession({
1490
+ environmentId,
1491
+ title: opts.name,
1492
+ events: [],
1493
+ gitRepoUrl,
1494
+ branch,
1495
+ signal,
1496
+ baseUrl,
1497
+ getAccessToken: opts.getAccessToken,
1498
+ permissionMode: opts.permissionMode
1499
+ });
1500
+ if (sid) {
1501
+ initialSessionId = sid;
1502
+ log(`created initial session ${sid}`);
1503
+ }
1504
+ } catch (err) {
1505
+ log(`session pre-creation failed (non-fatal): ${errorMessage(err)}`);
1506
+ }
1507
+ }
1508
+ await runBridgeLoop(config, environmentId, environmentSecret, api, spawner, logger, signal, undefined, initialSessionId, async () => opts.getAccessToken());
1509
+ }
1510
+ function createHeadlessBridgeLogger(log) {
1511
+ const noop = () => {};
1512
+ return {
1513
+ printBanner: (cfg, envId) => log(`registered environmentId=${envId} dir=${cfg.dir} spawnMode=${cfg.spawnMode} capacity=${cfg.maxSessions}`),
1514
+ logSessionStart: (id, _prompt) => log(`session start ${id}`),
1515
+ logSessionComplete: (id, ms) => log(`session complete ${id} (${ms}ms)`),
1516
+ logSessionFailed: (id, err) => log(`session failed ${id}: ${err}`),
1517
+ logStatus: log,
1518
+ logVerbose: log,
1519
+ logError: (s) => log(`error: ${s}`),
1520
+ logReconnected: (ms) => log(`reconnected after ${ms}ms`),
1521
+ addSession: (id, _url) => log(`session attached ${id}`),
1522
+ removeSession: (id) => log(`session detached ${id}`),
1523
+ updateIdleStatus: noop,
1524
+ updateReconnectingStatus: noop,
1525
+ updateSessionStatus: noop,
1526
+ updateSessionActivity: noop,
1527
+ updateSessionCount: noop,
1528
+ updateFailedStatus: noop,
1529
+ setSpawnModeDisplay: noop,
1530
+ setRepoInfo: noop,
1531
+ setDebugLogPath: noop,
1532
+ setAttached: noop,
1533
+ setSessionTitle: noop,
1534
+ clearStatus: noop,
1535
+ toggleQr: noop,
1536
+ refreshDisplay: noop
1537
+ };
1538
+ }
1539
+
1540
+ // src/daemon/workerRegistry.ts
1541
+ init_auth();
1542
+ init_errors();
1543
+ var EXIT_CODE_PERMANENT = 78;
1544
+ var EXIT_CODE_TRANSIENT = 1;
1545
+ async function runDaemonWorker(kind) {
1546
+ if (!kind) {
1547
+ console.error("Error: --daemon-worker requires a worker kind");
1548
+ process.exitCode = EXIT_CODE_PERMANENT;
1549
+ return;
1550
+ }
1551
+ switch (kind) {
1552
+ case "remoteControl":
1553
+ await runRemoteControlWorker();
1554
+ break;
1555
+ default:
1556
+ console.error(`Error: unknown daemon worker kind '${kind}'`);
1557
+ process.exitCode = EXIT_CODE_PERMANENT;
1558
+ }
1559
+ }
1560
+ async function runRemoteControlWorker() {
1561
+ const dir = process.env.DAEMON_WORKER_DIR || resolve2(".");
1562
+ const name = process.env.DAEMON_WORKER_NAME || undefined;
1563
+ const spawnMode = process.env.DAEMON_WORKER_SPAWN_MODE || "same-dir";
1564
+ const capacity = parseInt(process.env.DAEMON_WORKER_CAPACITY || "4", 10);
1565
+ const permissionMode = process.env.DAEMON_WORKER_PERMISSION || undefined;
1566
+ const sandbox = process.env.DAEMON_WORKER_SANDBOX === "1";
1567
+ const sessionTimeoutMs = process.env.DAEMON_WORKER_TIMEOUT_MS ? parseInt(process.env.DAEMON_WORKER_TIMEOUT_MS, 10) : undefined;
1568
+ const createSessionOnStart = process.env.DAEMON_WORKER_CREATE_SESSION !== "0";
1569
+ const controller = new AbortController;
1570
+ const onSignal = () => controller.abort();
1571
+ process.on("SIGTERM", onSignal);
1572
+ process.on("SIGINT", onSignal);
1573
+ const opts = {
1574
+ dir,
1575
+ name,
1576
+ spawnMode,
1577
+ capacity,
1578
+ permissionMode,
1579
+ sandbox,
1580
+ sessionTimeoutMs,
1581
+ createSessionOnStart,
1582
+ getAccessToken: () => getClaudeAIOAuthTokens()?.accessToken,
1583
+ onAuth401: async (_failedToken) => {
1584
+ const tokens = getClaudeAIOAuthTokens();
1585
+ return !!tokens?.accessToken;
1586
+ },
1587
+ log: (s) => {
1588
+ console.log(`[remoteControl] ${s}`);
1589
+ }
1590
+ };
1591
+ try {
1592
+ await runBridgeHeadless(opts, controller.signal);
1593
+ } catch (err) {
1594
+ if (err instanceof BridgeHeadlessPermanentError) {
1595
+ console.error(`[remoteControl] permanent error: ${err.message}`);
1596
+ process.exitCode = EXIT_CODE_PERMANENT;
1597
+ } else {
1598
+ console.error(`[remoteControl] transient error: ${errorMessage(err)}`);
1599
+ process.exitCode = EXIT_CODE_TRANSIENT;
1600
+ }
1601
+ } finally {
1602
+ process.off("SIGTERM", onSignal);
1603
+ process.off("SIGINT", onSignal);
1604
+ }
1605
+ }
1606
+ export {
1607
+ runDaemonWorker
1608
+ };